From 1a4b35646fc04131714d76a64ae6f8ce1c269fa0 Mon Sep 17 00:00:00 2001 From: upstream svn Date: Sat, 5 Apr 2008 22:49:27 +0200 Subject: [PATCH] Upstream tarball 20080304 --- ABOUT-NLS | 435 + CVSDATE | 1 + Compilation.flags.in | 167 + Makefile.am | 57 + Makefile.in | 864 + README.Debian-Packages | 47 + SVNDATE | 1 + aMule-CVS.spec | 114 + aMule.app/Contents/Frameworks/libixml.2.dylib | Bin 0 -> 89940 bytes .../Contents/Frameworks/libthreadutil.2.dylib | Bin 0 -> 48004 bytes aMule.app/Contents/Frameworks/libupnp.3.dylib | Bin 0 -> 255344 bytes aMule.app/Contents/Info.plist | 34 + .../MacOS/ed2kHelperScript.app/Contents/Info.plist | 37 + .../ed2kHelperScript.app/Contents/MacOS/applet | Bin 0 -> 33740 bytes .../MacOS/ed2kHelperScript.app/Contents/PkgInfo | 1 + .../Contents/Resources/Scripts/main.scpt | Bin 0 -> 2422 bytes .../Contents/Resources/applet.rsrc | Bin 0 -> 362 bytes aMule.app/Contents/PkgInfo | 1 + .../English.lproj/MainMenu.nib/classes.nib | 4 + .../Resources/English.lproj/MainMenu.nib/info.nib | 22 + .../English.lproj/MainMenu.nib/objects.nib | Bin 0 -> 5298 bytes aMule.app/Contents/Resources/amule.icns | Bin 0 -> 37083 bytes aMule.app/Icon | 0 aMule.spec | 95 + acinclude.m4 | 232 + aclocal.m4 | 915 + amule.desktop | 7 + amule.ico | Bin 0 -> 32606 bytes amule.png | Bin 0 -> 18218 bytes amule.rc | 4 + amule.xpm | 1783 ++ amule_build_install.sh | 280 + amulegui.desktop | 10 + amulegui.xpm | 531 + autogen.sh | 74 + automake/dist-hook.am | 11 + automake/manpages.am | 35 + compile | 142 + config.guess | 1459 ++ config.h.in | 512 + config.rpath | 513 + config.sub | 1566 ++ configure | 20445 +++++++++++++++++++ configure.in | 800 + convert.ico | Bin 0 -> 1406 bytes debian/TODO | 5 + debian/amule-alc-dbg.dirs | 4 + debian/amule-alc-dbg.override | 1 + debian/amule-alc.dirs | 10 + debian/amule-alc.install | 4 + debian/amule-alc.manpages | 5 + debian/amule-alc.menu | 4 + debian/amule-alc.override | 1 + debian/amule-alcc-dbg.dirs | 3 + debian/amule-alcc-dbg.override | 1 + debian/amule-alcc.dirs | 9 + debian/amule-alcc.install | 2 + debian/amule-alcc.manpages | 6 + debian/amule-alcc.override | 1 + debian/amule-cas-dbg.dirs | 3 + debian/amule-cas-dbg.override | 1 + debian/amule-cas.README.Debian | 4 + debian/amule-cas.dirs | 10 + debian/amule-cas.install | 2 + debian/amule-cas.manpages | 6 + debian/amule-cas.override | 1 + debian/amule-cmd-dbg.dirs | 3 + debian/amule-cmd-dbg.override | 1 + debian/amule-cmd.dirs | 9 + debian/amule-cmd.install | 1 + debian/amule-cmd.manpages | 7 + debian/amule-cmd.override | 1 + debian/amule-common.dirs | 4 + debian/amule-common.docs | 6 + debian/amule-common.install | 1 + debian/amule-common.override | 1 + debian/amule-daemon-dbg.dirs | 3 + debian/amule-daemon-dbg.override | 1 + debian/amule-daemon.dirs | 9 + debian/amule-daemon.install | 2 + debian/amule-daemon.manpages | 7 + debian/amule-daemon.override | 1 + debian/amule-dbg.dirs | 3 + debian/amule-dbg.override | 1 + debian/amule-ed2k-dbg.dirs | 3 + debian/amule-ed2k-dbg.override | 1 + debian/amule-ed2k.dirs | 9 + debian/amule-ed2k.docs | 1 + debian/amule-ed2k.install | 1 + debian/amule-ed2k.manpages | 6 + debian/amule-ed2k.override | 1 + debian/amule-ed2k.preinst | 18 + debian/amule-i18n-ar.dirs | 3 + debian/amule-i18n-ar.install | 1 + debian/amule-i18n-ar.override | 1 + debian/amule-i18n-bg.dirs | 3 + debian/amule-i18n-bg.install | 1 + debian/amule-i18n-bg.override | 1 + debian/amule-i18n-ca.dirs | 3 + debian/amule-i18n-ca.install | 1 + debian/amule-i18n-ca.override | 1 + debian/amule-i18n-da.dirs | 3 + debian/amule-i18n-da.install | 1 + debian/amule-i18n-da.override | 1 + debian/amule-i18n-de.dirs | 3 + debian/amule-i18n-de.install | 1 + debian/amule-i18n-de.override | 1 + debian/amule-i18n-en-gb.dirs | 3 + debian/amule-i18n-en-gb.install | 1 + debian/amule-i18n-en-gb.override | 1 + debian/amule-i18n-es.dirs | 3 + debian/amule-i18n-es.install | 1 + debian/amule-i18n-es.override | 1 + debian/amule-i18n-et-ee.dirs | 3 + debian/amule-i18n-et-ee.install | 1 + debian/amule-i18n-et-ee.override | 1 + debian/amule-i18n-eu.dirs | 3 + debian/amule-i18n-eu.install | 1 + debian/amule-i18n-eu.override | 1 + debian/amule-i18n-fi.dirs | 3 + debian/amule-i18n-fi.install | 1 + debian/amule-i18n-fi.override | 1 + debian/amule-i18n-fr.dirs | 3 + debian/amule-i18n-fr.install | 1 + debian/amule-i18n-fr.override | 1 + debian/amule-i18n-gl.dirs | 3 + debian/amule-i18n-gl.install | 1 + debian/amule-i18n-gl.override | 1 + debian/amule-i18n-hr.dirs | 3 + debian/amule-i18n-hr.install | 1 + debian/amule-i18n-hr.override | 1 + debian/amule-i18n-hu.dirs | 3 + debian/amule-i18n-hu.install | 1 + debian/amule-i18n-hu.override | 1 + debian/amule-i18n-it-ch.dirs | 3 + debian/amule-i18n-it-ch.install | 1 + debian/amule-i18n-it-ch.override | 1 + debian/amule-i18n-it.dirs | 3 + debian/amule-i18n-it.install | 1 + debian/amule-i18n-it.override | 1 + debian/amule-i18n-ko-kr.dirs | 3 + debian/amule-i18n-ko-kr.install | 1 + debian/amule-i18n-ko-kr.override | 1 + debian/amule-i18n-lt.dirs | 3 + debian/amule-i18n-lt.install | 1 + debian/amule-i18n-lt.override | 1 + debian/amule-i18n-nl.dirs | 3 + debian/amule-i18n-nl.install | 1 + debian/amule-i18n-nl.override | 1 + debian/amule-i18n-nn.dirs | 3 + debian/amule-i18n-nn.install | 1 + debian/amule-i18n-nn.override | 1 + debian/amule-i18n-pl.dirs | 3 + debian/amule-i18n-pl.install | 1 + debian/amule-i18n-pl.override | 1 + debian/amule-i18n-pt-br.dirs | 3 + debian/amule-i18n-pt-br.install | 1 + debian/amule-i18n-pt-br.override | 1 + debian/amule-i18n-pt-pt.dirs | 3 + debian/amule-i18n-pt-pt.install | 1 + debian/amule-i18n-pt-pt.override | 1 + debian/amule-i18n-ru.dirs | 3 + debian/amule-i18n-ru.install | 1 + debian/amule-i18n-ru.override | 1 + debian/amule-i18n-sl.dirs | 3 + debian/amule-i18n-sl.install | 1 + debian/amule-i18n-sl.override | 1 + debian/amule-i18n-sv.dirs | 3 + debian/amule-i18n-sv.install | 1 + debian/amule-i18n-sv.override | 1 + debian/amule-i18n-tr.dirs | 3 + debian/amule-i18n-tr.install | 1 + debian/amule-i18n-tr.override | 1 + debian/amule-i18n-zh-cn.dirs | 3 + debian/amule-i18n-zh-cn.install | 2 + debian/amule-i18n-zh-cn.override | 1 + debian/amule-i18n-zh-tw.dirs | 3 + debian/amule-i18n-zh-tw.install | 2 + debian/amule-i18n-zh-tw.override | 1 + debian/amule-remote-gui-dbg.dirs | 3 + debian/amule-remote-gui-dbg.override | 1 + debian/amule-remote-gui.dirs | 8 + debian/amule-remote-gui.install | 3 + debian/amule-remote-gui.manpages | 3 + debian/amule-remote-gui.menu | 3 + debian/amule-remote-gui.override | 1 + debian/amule-skin-gnome.dirs | 3 + debian/amule-skin-gnome.install | 2 + debian/amule-skin-gnome.override | 1 + debian/amule-skin-kde4.dirs | 3 + debian/amule-skin-kde4.install | 1 + debian/amule-skin-kde4.override | 1 + debian/amule-skin-tango.dirs | 3 + debian/amule-skin-tango.install | 1 + debian/amule-skin-tango.override | 1 + debian/amule-skin-xfce.dirs | 3 + debian/amule-skin-xfce.install | 1 + debian/amule-skin-xfce.override | 1 + debian/amule-theme-chicane.dirs | 3 + debian/amule-theme-chicane.install | 1 + debian/amule-theme-chicane.override | 1 + debian/amule-theme-default.dirs | 3 + debian/amule-theme-default.install | 1 + debian/amule-theme-default.override | 1 + debian/amule-theme-php-default.dirs | 3 + debian/amule-theme-php-default.install | 1 + debian/amule-theme-php-default.override | 1 + debian/amule-utils-gui.dirs | 1 + debian/amule-utils-gui.override | 1 + debian/amule-utils.dirs | 1 + debian/amule-utils.override | 1 + debian/amule-wxcas-dbg.dirs | 3 + debian/amule-wxcas-dbg.override | 1 + debian/amule-wxcas.dirs | 11 + debian/amule-wxcas.install | 3 + debian/amule-wxcas.manpages | 6 + debian/amule-wxcas.menu | 3 + debian/amule-wxcas.override | 1 + debian/amule-xas.dirs | 10 + debian/amule-xas.install | 2 + debian/amule-xas.links | 2 + debian/amule-xas.manpages | 6 + debian/amule-xas.override | 3 + debian/amule.README.Debian | 39 + debian/amule.dirs | 12 + debian/amule.install | 3 + debian/amule.manpages | 7 + debian/amule.menu | 3 + debian/amule.override | 2 + debian/amule.postinst | 9 + debian/amule.postrm | 7 + debian/amuleweb-dbg.dirs | 3 + debian/amuleweb-dbg.override | 1 + debian/amuleweb.dirs | 9 + debian/amuleweb.install | 1 + debian/amuleweb.manpages | 7 + debian/amuleweb.override | 1 + debian/changelog | 630 + debian/compat | 1 + debian/control | 473 + debian/copyright | 14 + debian/rules | 857 + depcomp | 529 + docs/ABOUT-NLS | 435 + docs/AUTHORS | 85 + docs/COPYING | 340 + docs/Changelog | 6265 ++++++ docs/Doxyfile | 1098 + docs/EC_Protocol.txt | 336 + docs/ED2K-Links.HOWTO | 155 + docs/INSTALL | 102 + docs/Makefile.am | 22 + docs/Makefile.in | 653 + docs/README | 284 + docs/README.Mac.txt | 55 + docs/README.Windows.txt | 3 + docs/Releases.dia | Bin 0 -> 7710 bytes docs/TODO | 17 + docs/amule-win32.HOWTO.txt | 11 + docs/amulesig.txt | 64 + docs/license.txt | 340 + docs/man/Makefile.am | 23 + docs/man/Makefile.in | 502 + docs/man/amule.1 | 45 + docs/man/amule.de.1 | 48 + docs/man/amule.es.1 | 40 + docs/man/amule.eu.1 | 45 + docs/man/amule.fr.1 | 42 + docs/man/amule.hu.1 | 42 + docs/man/amulecmd.1 | 260 + docs/man/amulecmd.de.1 | 272 + docs/man/amulecmd.es.1 | 89 + docs/man/amulecmd.eu.1 | 116 + docs/man/amulecmd.fr.1 | 84 + docs/man/amulecmd.hu.1 | 114 + docs/man/amuled.1 | 45 + docs/man/amuled.de.1 | 47 + docs/man/amuled.es.1 | 35 + docs/man/amuled.eu.1 | 46 + docs/man/amuled.fr.1 | 37 + docs/man/amuled.hu.1 | 37 + docs/man/amulegui.1 | 25 + docs/man/amulegui.de.1 | 35 + docs/man/amuleweb.1 | 185 + docs/man/amuleweb.de.1 | 194 + docs/man/amuleweb.es.1 | 173 + docs/man/amuleweb.eu.1 | 186 + docs/man/amuleweb.fr.1 | 147 + docs/man/amuleweb.hu.1 | 171 + docs/man/ed2k.1 | 34 + docs/man/ed2k.de.1 | 40 + docs/man/ed2k.es.1 | 30 + docs/man/ed2k.eu.1 | 36 + docs/man/ed2k.fr.1 | 31 + docs/man/ed2k.hu.1 | 32 + docs/man/manpages-de.po | 1726 ++ docs/man/manpages.pot | 1611 ++ docs/socks4.protocol | 152 + install-sh | 323 + intl/ChangeLog | 4 + intl/Makefile.in | 338 + intl/VERSION | 1 + intl/bindtextdom.c | 369 + intl/config.charset | 466 + intl/dcgettext.c | 59 + intl/dcigettext.c | 1206 ++ intl/dcngettext.c | 61 + intl/dgettext.c | 59 + intl/dngettext.c | 61 + intl/eval-plural.h | 114 + intl/explodename.c | 192 + intl/finddomain.c | 198 + intl/gettext.c | 64 + intl/gettextP.h | 242 + intl/gmo.h | 148 + intl/hash-string.h | 59 + intl/intl-compat.c | 131 + intl/l10nflist.c | 453 + intl/libgnuintl.h | 296 + intl/loadinfo.h | 156 + intl/loadmsgcat.c | 1316 ++ intl/localcharset.c | 369 + intl/locale.alias | 78 + intl/localealias.c | 419 + intl/localename.c | 772 + intl/ngettext.c | 68 + intl/os2compat.c | 98 + intl/os2compat.h | 46 + intl/osdep.c | 24 + intl/plural-exp.c | 156 + intl/plural-exp.h | 126 + intl/plural.c | 1322 ++ intl/plural.y | 409 + intl/ref-add.sin | 31 + intl/ref-del.sin | 26 + intl/textdomain.c | 142 + m4/build-tools.m4 | 100 + m4/codeset.m4 | 23 + m4/cryptopp.m4 | 158 + m4/gdlib.m4 | 126 + m4/gettext.m4 | 587 + m4/gettext.m4~ | 587 + m4/glibc21.m4 | 32 + m4/iconv.m4 | 103 + m4/intdiv0.m4 | 72 + m4/inttypes-pri.m4 | 32 + m4/inttypes.m4 | 27 + m4/inttypes_h.m4 | 28 + m4/isc-posix.m4 | 26 + m4/lcmessage.m4 | 32 + m4/lib-ld.m4 | 97 + m4/lib-link.m4 | 554 + m4/lib-prefix.m4 | 148 + m4/libpng.m4 | 184 + m4/progtest.m4 | 59 + m4/readline.m4 | 62 + m4/stdint_h.m4 | 28 + m4/uintmax_t.m4 | 29 + m4/ulonglong.m4 | 23 + m4/wxwin.m4 | 1052 + m4/zlib.m4 | 135 + missing | 357 + mkinstalldirs | 150 + po/LINGUAS | 33 + po/Makefile.in.in | 318 + po/Makevars | 25 + po/POTFILES.in | 79 + po/Rules-quot | 42 + po/amule.pot | 6780 ++++++ po/ar.po | 7785 +++++++ po/bg.po | 7348 +++++++ po/boldquot.sed | 10 + po/ca.po | 7457 +++++++ po/cs.po | 7252 +++++++ po/da.po | 7911 +++++++ po/de.po | 7510 +++++++ po/el.po | 6986 +++++++ po/en@boldquot.header | 25 + po/en@quot.header | 22 + po/en_GB.po | 6778 ++++++ po/es.po | 7113 +++++++ po/et_EE.po | 7064 +++++++ po/eu.po | 7576 +++++++ po/fa.po | 6778 ++++++ po/fi.po | 7558 +++++++ po/fr.po | 7575 +++++++ po/gl.po | 7514 +++++++ po/hr.po | 8157 ++++++++ po/hu.po | 8310 ++++++++ po/insert-header.sin | 23 + po/it.po | 7211 +++++++ po/it_CH.po | 7538 +++++++ po/ja.po | 7366 +++++++ po/ko_KR.po | 7374 +++++++ po/l10n.xsl | 70 + po/lt.po | 7478 +++++++ po/nl.po | 7547 +++++++ po/nn.po | 7408 +++++++ po/pl.po | 7194 +++++++ po/pt_BR.po | 7164 +++++++ po/pt_PT.po | 8059 ++++++++ po/quot.sed | 6 + po/remove-potcdate.sin | 19 + po/ru.po | 7490 +++++++ po/sl.po | 7456 +++++++ po/sv.po | 6969 +++++++ po/tr.po | 7032 +++++++ po/zh_CN.po | 8497 ++++++++ po/zh_TW.po | 8625 ++++++++ src/AddFriend.cpp | 87 + src/AddFriend.h | 46 + src/ArchSpecific.h | 231 + src/AsyncDNS.cpp | 75 + src/AsyncDNS.h | 64 + src/BarShader.cpp | 283 + src/BarShader.h | 211 + src/BaseClient.cpp | 2440 +++ src/CFile.cpp | 410 + src/CFile.h | 201 + src/CatDialog.cpp | 218 + src/CatDialog.h | 109 + src/ChatSelector.cpp | 326 + src/ChatSelector.h | 81 + src/ChatWnd.cpp | 178 + src/ChatWnd.h | 71 + src/ClientCredits.cpp | 277 + src/ClientCredits.h | 110 + src/ClientCreditsList.cpp | 504 + src/ClientCreditsList.h | 69 + src/ClientDetailDialog.cpp | 201 + src/ClientDetailDialog.h | 85 + src/ClientList.cpp | 1009 + src/ClientList.h | 417 + src/ClientListCtrl.cpp | 1109 + src/ClientListCtrl.h | 303 + src/ClientTCPSocket.cpp | 2108 ++ src/ClientTCPSocket.h | 95 + src/ClientUDPSocket.cpp | 265 + src/ClientUDPSocket.h | 45 + src/Color.h | 113 + src/ColorFrameCtrl.cpp | 135 + src/ColorFrameCtrl.h | 66 + src/CommentDialog.cpp | 83 + src/CommentDialog.h | 54 + src/CommentDialogLst.cpp | 141 + src/CommentDialogLst.h | 75 + src/Constants.h | 88 + src/CryptoPP_Inc.h | 49 + src/DataToText.cpp | 137 + src/DataToText.h | 51 + src/DeadSourceList.cpp | 167 + src/DeadSourceList.h | 151 + src/DirectoryTreeCtrl.cpp | 358 + src/DirectoryTreeCtrl.h | 89 + src/DownloadClient.cpp | 1696 ++ src/DownloadListCtrl.cpp | 2264 ++ src/DownloadListCtrl.h | 297 + src/DownloadQueue.cpp | 1536 ++ src/DownloadQueue.h | 392 + src/ECSpecialCoreTags.cpp | 416 + src/ECSpecialMuleTags.cpp | 562 + src/ED2KLink.cpp | 311 + src/ED2KLink.h | 150 + src/ED2KLinkParser.cpp | 509 + src/EMSocket.cpp | 807 + src/EMSocket.h | 155 + src/EditServerListDlg.cpp | 86 + src/EditServerListDlg.h | 53 + src/EncryptedDatagramSocket.cpp | 423 + src/EncryptedDatagramSocket.h | 42 + src/EncryptedStreamSocket.cpp | 796 + src/EncryptedStreamSocket.h | 156 + src/ExternalConn.cpp | 1453 ++ src/ExternalConn.h | 239 + src/ExternalConnector.cpp | 623 + src/ExternalConnector.h | 174 + src/FileDetailDialog.cpp | 468 + src/FileDetailDialog.h | 67 + src/FileDetailListCtrl.cpp | 86 + src/FileDetailListCtrl.h | 49 + src/FileLock.h | 124 + src/Friend.cpp | 151 + src/Friend.h | 79 + src/FriendList.cpp | 232 + src/FriendList.h | 67 + src/FriendListCtrl.cpp | 387 + src/FriendListCtrl.h | 83 + src/GetTickCount.cpp | 148 + src/GetTickCount.h | 55 + src/GuiEvents.cpp | 642 + src/GuiEvents.h | 506 + src/HTTPDownload.cpp | 368 + src/HTTPDownload.h | 57 + src/IP2Country.cpp | 101 + src/IP2Country.h | 75 + src/IPFilter.cpp | 506 + src/IPFilter.h | 135 + src/InternalEvents.h | 95 + src/KadDlg.cpp | 204 + src/KadDlg.h | 63 + src/KnownFile.cpp | 1358 ++ src/KnownFile.h | 356 + src/KnownFileList.cpp | 300 + src/KnownFileList.h | 78 + src/ListenSocket.cpp | 276 + src/ListenSocket.h | 83 + src/Logger.cpp | 272 + src/Logger.h | 320 + src/MD4Hash.h | 291 + src/MagnetURI.cpp | 139 + src/MagnetURI.h | 74 + src/Makefile.am | 538 + src/Makefile.in | 4895 +++++ src/MemFile.cpp | 185 + src/MemFile.h | 174 + src/MuleCollection.cpp | 446 + src/MuleCollection.h | 85 + src/MuleGifCtrl.cpp | 173 + src/MuleGifCtrl.h | 142 + src/MuleListCtrl.cpp | 641 + src/MuleListCtrl.h | 339 + src/MuleNotebook.cpp | 240 + src/MuleNotebook.h | 144 + src/MuleTextCtrl.cpp | 151 + src/MuleTextCtrl.h | 103 + src/MuleThread.h | 88 + src/MuleTrayIcon.cpp | 572 + src/MuleTrayIcon.h | 117 + src/MuleUDPSocket.cpp | 334 + src/MuleUDPSocket.h | 202 + src/NetworkFunctions.cpp | 173 + src/NetworkFunctions.h | 116 + src/OScopeCtrl.cpp | 625 + src/OScopeCtrl.h | 145 + src/Observable.h | 307 + src/ObservableQueue.h | 435 + src/OtherFunctions.cpp | 1241 ++ src/OtherFunctions.h | 453 + src/OtherStructs.h | 148 + src/Packet.cpp | 311 + src/Packet.h | 91 + src/Parser.cpp | 1743 ++ src/Parser.hpp | 75 + src/Parser.y | 178 + src/PartFile.cpp | 4136 ++++ src/PartFile.h | 441 + src/PartFileConvert.cpp | 800 + src/PartFileConvert.h | 113 + src/Preferences.cpp | 1741 ++ src/Preferences.h | 778 + src/PrefsUnifiedDlg.cpp | 1136 ++ src/PrefsUnifiedDlg.h | 128 + src/Proxy.cpp | 1477 ++ src/Proxy.h | 586 + src/RC4Encrypt.cpp | 153 + src/RC4Encrypt.h | 91 + src/RLE.cpp | 200 + src/RLE.h | 210 + src/RandomFunctions.cpp | 49 + src/RandomFunctions.h | 42 + src/RangeMap.h | 591 + src/SHA.cpp | 246 + src/SHA.h | 94 + src/SHAHashSet.cpp | 1056 + src/SHAHashSet.h | 278 + src/SafeFile.cpp | 590 + src/SafeFile.h | 302 + src/Scanner.cpp | 2019 ++ src/Scanner.h | 1 + src/Scanner.h.in | 4 + src/Scanner.l | 212 + src/ScopedPtr.h | 220 + src/SearchDlg.cpp | 611 + src/SearchDlg.h | 171 + src/SearchExpr.h | 88 + src/SearchFile.cpp | 187 + src/SearchFile.h | 264 + src/SearchList.cpp | 1037 + src/SearchList.h | 224 + src/SearchListCtrl.cpp | 926 + src/SearchListCtrl.h | 291 + src/Server.cpp | 342 + src/Server.h | 208 + src/ServerConnect.cpp | 644 + src/ServerConnect.h | 126 + src/ServerList.cpp | 977 + src/ServerList.h | 90 + src/ServerListCtrl.cpp | 667 + src/ServerListCtrl.h | 204 + src/ServerSocket.cpp | 774 + src/ServerSocket.h | 86 + src/ServerUDPSocket.cpp | 498 + src/ServerUDPSocket.h | 63 + src/ServerWnd.cpp | 276 + src/ServerWnd.h | 58 + src/SharedFileList.cpp | 1091 + src/SharedFileList.h | 110 + src/SharedFilesCtrl.cpp | 731 + src/SharedFilesCtrl.h | 198 + src/SharedFilesWnd.cpp | 158 + src/SharedFilesWnd.h | 96 + src/StatTree.cpp | 642 + src/StatTree.h | 1191 ++ src/StateMachine.cpp | 107 + src/StateMachine.h | 72 + src/Statistics.cpp | 985 + src/Statistics.h | 543 + src/StatisticsDlg.cpp | 362 + src/StatisticsDlg.h | 78 + src/Tag.cpp | 462 + src/Tag.h | 297 + src/TerminationProcess.cpp | 52 + src/TerminationProcess.h | 48 + src/TerminationProcessAmuleweb.cpp | 46 + src/TerminationProcessAmuleweb.h | 48 + src/TextClient.cpp | 990 + src/TextClient.h | 80 + src/ThreadScheduler.cpp | 389 + src/ThreadScheduler.h | 198 + src/ThreadTasks.cpp | 559 + src/ThreadTasks.h | 262 + src/ThrottledSocket.h | 55 + src/Timer.cpp | 161 + src/Timer.h | 93 + src/TransferWnd.cpp | 532 + src/TransferWnd.h | 205 + src/Types.h | 171 + src/UPnP.cpp | 1760 ++ src/UPnP.h | 696 + src/UPnPCompatibility.cpp | 49 + src/UPnPCompatibility.h | 77 + src/UploadBandwidthThrottler.cpp | 501 + src/UploadBandwidthThrottler.h | 90 + src/UploadClient.cpp | 952 + src/UploadQueue.cpp | 575 + src/UploadQueue.h | 72 + src/UserEvents.cpp | 153 + src/UserEvents.h | 171 + src/aMule.xpm | 634 + src/amule-gui.cpp | 344 + src/amule-remote-gui.cpp | 1888 ++ src/amule-remote-gui.h | 779 + src/amule.cpp | 2214 ++ src/amule.h | 484 + src/amuleDlg.cpp | 1384 ++ src/amuleDlg.h | 256 + src/amuleIPV4Address.h | 66 + src/amuled.cpp | 698 + src/extern/upnp/ixml.h | 135 + src/extern/upnp/upnp.h | 351 + src/extern/wxWidgets/listctrl.cpp | 5977 ++++++ src/extern/wxWidgets/listctrl.h | 299 + src/include/common/ClientVersion.h | 67 + src/include/common/Constants.h | 34 + src/include/common/DataFileVersion.h | 48 + src/include/common/EventIDs.h | 46 + src/include/common/Macros.h | 41 + src/include/common/MenuIDs.h | 130 + src/include/protocol/Protocols.h | 54 + src/include/protocol/ed2k/Client2Client/TCP.h | 102 + src/include/protocol/ed2k/Client2Client/UDP.h | 39 + src/include/protocol/ed2k/Client2Server/TCP.h | 73 + src/include/protocol/ed2k/Client2Server/UDP.h | 57 + src/include/protocol/ed2k/ClientSoftware.h | 50 + src/include/protocol/ed2k/Constants.h | 112 + src/include/protocol/kad/Client2Client/UDP.h | 61 + src/include/protocol/kad/Constants.h | 60 + src/include/protocol/kad2/Client2Client/UDP.h | 45 + src/include/protocol/kad2/Constants.h | 29 + src/include/tags/ClientTags.h | 68 + src/include/tags/FileTags.h | 135 + src/include/tags/ServerTags.h | 55 + src/include/tags/TagTypes.h | 79 + src/inetdownload.h | 1086 + src/kademlia/Makefile.am | 4 + src/kademlia/Makefile.in | 602 + src/kademlia/kademlia/Defines.h | 78 + src/kademlia/kademlia/Entry.h | 110 + src/kademlia/kademlia/Error.h | 80 + src/kademlia/kademlia/Indexed.cpp | 1107 + src/kademlia/kademlia/Indexed.h | 149 + src/kademlia/kademlia/Kademlia.cpp | 408 + src/kademlia/kademlia/Kademlia.h | 121 + src/kademlia/kademlia/Makefile.am | 11 + src/kademlia/kademlia/Makefile.in | 502 + src/kademlia/kademlia/Prefs.cpp | 238 + src/kademlia/kademlia/Prefs.h | 139 + src/kademlia/kademlia/Search.cpp | 981 + src/kademlia/kademlia/Search.h | 137 + src/kademlia/kademlia/SearchManager.cpp | 530 + src/kademlia/kademlia/SearchManager.h | 114 + src/kademlia/kademlia/Tag.h | 46 + src/kademlia/net/KademliaUDPListener.cpp | 1208 ++ src/kademlia/net/KademliaUDPListener.h | 102 + src/kademlia/net/Makefile.am | 3 + src/kademlia/net/Makefile.in | 493 + src/kademlia/routing/Contact.cpp | 159 + src/kademlia/routing/Contact.h | 119 + src/kademlia/routing/Makefile.am | 6 + src/kademlia/routing/Makefile.in | 497 + src/kademlia/routing/Maps.h | 61 + src/kademlia/routing/RoutingBin.cpp | 219 + src/kademlia/routing/RoutingBin.h | 88 + src/kademlia/routing/RoutingZone.cpp | 566 + src/kademlia/routing/RoutingZone.h | 172 + src/kademlia/utils/LittleEndian.cpp | 86 + src/kademlia/utils/LittleEndian.h | 56 + src/kademlia/utils/Makefile.am | 3 + src/kademlia/utils/Makefile.in | 493 + src/kademlia/utils/UInt128.cpp | 302 + src/kademlia/utils/UInt128.h | 124 + src/libs/Makefile.am | 3 + src/libs/Makefile.in | 602 + src/libs/common/FileFunctions.cpp | 337 + src/libs/common/FileFunctions.h | 112 + src/libs/common/Format.cpp | 414 + src/libs/common/Format.h | 232 + src/libs/common/MD5Sum.cpp | 358 + src/libs/common/MD5Sum.h | 48 + src/libs/common/Makefile.am | 32 + src/libs/common/Makefile.in | 681 + src/libs/common/MuleDebug.cpp | 468 + src/libs/common/MuleDebug.h | 150 + src/libs/common/Path.cpp | 667 + src/libs/common/Path.h | 217 + src/libs/common/StringFunctions.cpp | 314 + src/libs/common/StringFunctions.h | 303 + src/libs/common/TextFile.cpp | 203 + src/libs/common/TextFile.h | 125 + src/libs/ec/Makefile.am | 22 + src/libs/ec/Makefile.in | 637 + src/libs/ec/abstracts/ECCodes.abstract | 435 + src/libs/ec/abstracts/ECTagTypes.abstract | 20 + src/libs/ec/abstracts/License.abstract | 23 + src/libs/ec/c#/ECCodes.cs | 371 + src/libs/ec/c#/ECTagTypes.cs | 41 + src/libs/ec/c#/amuleRemote.cs | 304 + src/libs/ec/c#/ecProto.cs | 669 + src/libs/ec/cpp/ECCodes.h | 385 + src/libs/ec/cpp/ECFileConfig.h | 100 + src/libs/ec/cpp/ECMuleSocket.cpp | 140 + src/libs/ec/cpp/ECMuleSocket.h | 65 + src/libs/ec/cpp/ECPacket.cpp | 81 + src/libs/ec/cpp/ECPacket.h | 77 + src/libs/ec/cpp/ECSocket.cpp | 805 + src/libs/ec/cpp/ECSocket.h | 292 + src/libs/ec/cpp/ECSpecialTags.cpp | 159 + src/libs/ec/cpp/ECSpecialTags.h | 372 + src/libs/ec/cpp/ECTag.cpp | 890 + src/libs/ec/cpp/ECTag.h | 285 + src/libs/ec/cpp/ECTagTypes.h | 43 + src/libs/ec/cpp/Makefile.am | 49 + src/libs/ec/cpp/Makefile.in | 684 + src/libs/ec/cpp/RemoteConnect.cpp | 258 + src/libs/ec/cpp/RemoteConnect.h | 404 + src/libs/ec/cpp/gen_ECVersion | 63 + src/libs/ec/file_generator.pl | 482 + src/libs/ec/java/ECCodes.java | 364 + src/libs/ec/java/ECTagTypes.java | 40 + src/muuli.wdr | Bin 0 -> 360798 bytes src/muuli_wdr.cpp | 9507 +++++++++ src/muuli_wdr.h | 560 + src/pixmaps/Makefile.am | 23 + src/pixmaps/Makefile.in | 616 + src/pixmaps/chat.ico.xpm | 78 + src/pixmaps/flags_xpm/CountryFlags.h | 519 + src/pixmaps/flags_xpm/Makefile.am | 251 + src/pixmaps/flags_xpm/Makefile.in | 694 + src/pixmaps/flags_xpm/ad.xpm | 177 + src/pixmaps/flags_xpm/ae.xpm | 125 + src/pixmaps/flags_xpm/af.xpm | 168 + src/pixmaps/flags_xpm/ag.xpm | 163 + src/pixmaps/flags_xpm/ai.xpm | 177 + src/pixmaps/flags_xpm/al.xpm | 169 + src/pixmaps/flags_xpm/am.xpm | 172 + src/pixmaps/flags_xpm/an.xpm | 129 + src/pixmaps/flags_xpm/ao.xpm | 131 + src/pixmaps/flags_xpm/ar.xpm | 166 + src/pixmaps/flags_xpm/as.xpm | 178 + src/pixmaps/flags_xpm/at.xpm | 143 + src/pixmaps/flags_xpm/au.xpm | 183 + src/pixmaps/flags_xpm/aw.xpm | 186 + src/pixmaps/flags_xpm/ax.xpm | 189 + src/pixmaps/flags_xpm/az.xpm | 185 + src/pixmaps/flags_xpm/ba.xpm | 172 + src/pixmaps/flags_xpm/bb.xpm | 177 + src/pixmaps/flags_xpm/bd.xpm | 143 + src/pixmaps/flags_xpm/be.xpm | 150 + src/pixmaps/flags_xpm/bf.xpm | 165 + src/pixmaps/flags_xpm/bg.xpm | 160 + src/pixmaps/flags_xpm/bh.xpm | 134 + src/pixmaps/flags_xpm/bi.xpm | 174 + src/pixmaps/flags_xpm/bj.xpm | 156 + src/pixmaps/flags_xpm/bm.xpm | 175 + src/pixmaps/flags_xpm/bn.xpm | 173 + src/pixmaps/flags_xpm/bo.xpm | 172 + src/pixmaps/flags_xpm/br.xpm | 164 + src/pixmaps/flags_xpm/bs.xpm | 167 + src/pixmaps/flags_xpm/bt.xpm | 168 + src/pixmaps/flags_xpm/bv.xpm | 142 + src/pixmaps/flags_xpm/bw.xpm | 153 + src/pixmaps/flags_xpm/by.xpm | 163 + src/pixmaps/flags_xpm/bz.xpm | 173 + src/pixmaps/flags_xpm/ca.xpm | 162 + src/pixmaps/flags_xpm/catalonia.xpm | 154 + src/pixmaps/flags_xpm/cc.xpm | 168 + src/pixmaps/flags_xpm/cd.xpm | 132 + src/pixmaps/flags_xpm/cf.xpm | 175 + src/pixmaps/flags_xpm/cg.xpm | 142 + src/pixmaps/flags_xpm/ch.xpm | 81 + src/pixmaps/flags_xpm/ci.xpm | 137 + src/pixmaps/flags_xpm/ck.xpm | 165 + src/pixmaps/flags_xpm/cl.xpm | 138 + src/pixmaps/flags_xpm/cm.xpm | 171 + src/pixmaps/flags_xpm/cn.xpm | 151 + src/pixmaps/flags_xpm/co.xpm | 174 + src/pixmaps/flags_xpm/cr.xpm | 177 + src/pixmaps/flags_xpm/cs.xpm | 155 + src/pixmaps/flags_xpm/cu.xpm | 177 + src/pixmaps/flags_xpm/cv.xpm | 156 + src/pixmaps/flags_xpm/cx.xpm | 184 + src/pixmaps/flags_xpm/cy.xpm | 94 + src/pixmaps/flags_xpm/cz.xpm | 141 + src/pixmaps/flags_xpm/de.xpm | 176 + src/pixmaps/flags_xpm/dj.xpm | 170 + src/pixmaps/flags_xpm/dk.xpm | 139 + src/pixmaps/flags_xpm/dm.xpm | 164 + src/pixmaps/flags_xpm/do.xpm | 158 + src/pixmaps/flags_xpm/dz.xpm | 153 + src/pixmaps/flags_xpm/ec.xpm | 171 + src/pixmaps/flags_xpm/ee.xpm | 131 + src/pixmaps/flags_xpm/eg.xpm | 143 + src/pixmaps/flags_xpm/eh.xpm | 162 + src/pixmaps/flags_xpm/england.xpm | 123 + src/pixmaps/flags_xpm/er.xpm | 183 + src/pixmaps/flags_xpm/es.xpm | 153 + src/pixmaps/flags_xpm/et.xpm | 175 + src/pixmaps/flags_xpm/europeanunion.xpm | 153 + src/pixmaps/flags_xpm/fam.xpm | 176 + src/pixmaps/flags_xpm/fi.xpm | 143 + src/pixmaps/flags_xpm/fj.xpm | 181 + src/pixmaps/flags_xpm/fk.xpm | 185 + src/pixmaps/flags_xpm/fm.xpm | 156 + src/pixmaps/flags_xpm/fo.xpm | 121 + src/pixmaps/flags_xpm/fr.xpm | 146 + src/pixmaps/flags_xpm/ga.xpm | 173 + src/pixmaps/flags_xpm/gb.xpm | 155 + src/pixmaps/flags_xpm/gd.xpm | 173 + src/pixmaps/flags_xpm/ge.xpm | 143 + src/pixmaps/flags_xpm/gf.xpm | 146 + src/pixmaps/flags_xpm/gh.xpm | 164 + src/pixmaps/flags_xpm/gi.xpm | 130 + src/pixmaps/flags_xpm/gl.xpm | 141 + src/pixmaps/flags_xpm/gm.xpm | 182 + src/pixmaps/flags_xpm/gn.xpm | 161 + src/pixmaps/flags_xpm/gp.xpm | 165 + src/pixmaps/flags_xpm/gq.xpm | 174 + src/pixmaps/flags_xpm/gr.xpm | 168 + src/pixmaps/flags_xpm/gs.xpm | 166 + src/pixmaps/flags_xpm/gt.xpm | 154 + src/pixmaps/flags_xpm/gu.xpm | 152 + src/pixmaps/flags_xpm/gw.xpm | 168 + src/pixmaps/flags_xpm/gy.xpm | 181 + src/pixmaps/flags_xpm/hk.xpm | 152 + src/pixmaps/flags_xpm/hm.xpm | 183 + src/pixmaps/flags_xpm/hn.xpm | 169 + src/pixmaps/flags_xpm/hr.xpm | 146 + src/pixmaps/flags_xpm/ht.xpm | 174 + src/pixmaps/flags_xpm/hu.xpm | 136 + src/pixmaps/flags_xpm/id.xpm | 127 + src/pixmaps/flags_xpm/ie.xpm | 151 + src/pixmaps/flags_xpm/il.xpm | 109 + src/pixmaps/flags_xpm/in.xpm | 171 + src/pixmaps/flags_xpm/io.xpm | 186 + src/pixmaps/flags_xpm/iq.xpm | 158 + src/pixmaps/flags_xpm/ir.xpm | 164 + src/pixmaps/flags_xpm/is.xpm | 146 + src/pixmaps/flags_xpm/it.xpm | 129 + src/pixmaps/flags_xpm/jm.xpm | 172 + src/pixmaps/flags_xpm/jo.xpm | 137 + src/pixmaps/flags_xpm/jp.xpm | 97 + src/pixmaps/flags_xpm/ke.xpm | 170 + src/pixmaps/flags_xpm/kg.xpm | 148 + src/pixmaps/flags_xpm/kh.xpm | 176 + src/pixmaps/flags_xpm/ki.xpm | 180 + src/pixmaps/flags_xpm/km.xpm | 167 + src/pixmaps/flags_xpm/kn.xpm | 162 + src/pixmaps/flags_xpm/kp.xpm | 175 + src/pixmaps/flags_xpm/kr.xpm | 139 + src/pixmaps/flags_xpm/kw.xpm | 157 + src/pixmaps/flags_xpm/ky.xpm | 169 + src/pixmaps/flags_xpm/kz.xpm | 178 + src/pixmaps/flags_xpm/la.xpm | 168 + src/pixmaps/flags_xpm/lb.xpm | 154 + src/pixmaps/flags_xpm/lc.xpm | 169 + src/pixmaps/flags_xpm/li.xpm | 177 + src/pixmaps/flags_xpm/lk.xpm | 176 + src/pixmaps/flags_xpm/lr.xpm | 126 + src/pixmaps/flags_xpm/ls.xpm | 158 + src/pixmaps/flags_xpm/lt.xpm | 177 + src/pixmaps/flags_xpm/lu.xpm | 162 + src/pixmaps/flags_xpm/lv.xpm | 173 + src/pixmaps/flags_xpm/ly.xpm | 149 + src/pixmaps/flags_xpm/ma.xpm | 139 + src/pixmaps/flags_xpm/makeflags.sh | 59 + src/pixmaps/flags_xpm/mc.xpm | 123 + src/pixmaps/flags_xpm/md.xpm | 172 + src/pixmaps/flags_xpm/me.xpm | 161 + src/pixmaps/flags_xpm/mg.xpm | 149 + src/pixmaps/flags_xpm/mh.xpm | 174 + src/pixmaps/flags_xpm/mk.xpm | 180 + src/pixmaps/flags_xpm/ml.xpm | 164 + src/pixmaps/flags_xpm/mm.xpm | 147 + src/pixmaps/flags_xpm/mn.xpm | 158 + src/pixmaps/flags_xpm/mo.xpm | 172 + src/pixmaps/flags_xpm/mp.xpm | 169 + src/pixmaps/flags_xpm/mq.xpm | 166 + src/pixmaps/flags_xpm/mr.xpm | 172 + src/pixmaps/flags_xpm/ms.xpm | 177 + src/pixmaps/flags_xpm/mt.xpm | 128 + src/pixmaps/flags_xpm/mu.xpm | 178 + src/pixmaps/flags_xpm/mv.xpm | 164 + src/pixmaps/flags_xpm/mw.xpm | 165 + src/pixmaps/flags_xpm/mx.xpm | 170 + src/pixmaps/flags_xpm/my.xpm | 174 + src/pixmaps/flags_xpm/mz.xpm | 187 + src/pixmaps/flags_xpm/na.xpm | 175 + src/pixmaps/flags_xpm/nc.xpm | 173 + src/pixmaps/flags_xpm/ne.xpm | 171 + src/pixmaps/flags_xpm/nf.xpm | 163 + src/pixmaps/flags_xpm/ng.xpm | 149 + src/pixmaps/flags_xpm/ni.xpm | 163 + src/pixmaps/flags_xpm/nl.xpm | 153 + src/pixmaps/flags_xpm/no.xpm | 142 + src/pixmaps/flags_xpm/np.xpm | 83 + src/pixmaps/flags_xpm/nr.xpm | 174 + src/pixmaps/flags_xpm/nu.xpm | 165 + src/pixmaps/flags_xpm/nz.xpm | 180 + src/pixmaps/flags_xpm/om.xpm | 151 + src/pixmaps/flags_xpm/pa.xpm | 148 + src/pixmaps/flags_xpm/pe.xpm | 116 + src/pixmaps/flags_xpm/pf.xpm | 150 + src/pixmaps/flags_xpm/pg.xpm | 157 + src/pixmaps/flags_xpm/ph.xpm | 174 + src/pixmaps/flags_xpm/pk.xpm | 162 + src/pixmaps/flags_xpm/pl.xpm | 123 + src/pixmaps/flags_xpm/pm.xpm | 186 + src/pixmaps/flags_xpm/pn.xpm | 178 + src/pixmaps/flags_xpm/pr.xpm | 173 + src/pixmaps/flags_xpm/ps.xpm | 131 + src/pixmaps/flags_xpm/pt.xpm | 161 + src/pixmaps/flags_xpm/pw.xpm | 167 + src/pixmaps/flags_xpm/py.xpm | 163 + src/pixmaps/flags_xpm/qa.xpm | 124 + src/pixmaps/flags_xpm/re.xpm | 146 + src/pixmaps/flags_xpm/ro.xpm | 168 + src/pixmaps/flags_xpm/rs.xpm | 135 + src/pixmaps/flags_xpm/ru.xpm | 152 + src/pixmaps/flags_xpm/rw.xpm | 175 + src/pixmaps/flags_xpm/sa.xpm | 155 + src/pixmaps/flags_xpm/sb.xpm | 161 + src/pixmaps/flags_xpm/sc.xpm | 173 + src/pixmaps/flags_xpm/scotland.xpm | 160 + src/pixmaps/flags_xpm/sd.xpm | 153 + src/pixmaps/flags_xpm/se.xpm | 160 + src/pixmaps/flags_xpm/sg.xpm | 137 + src/pixmaps/flags_xpm/sh.xpm | 180 + src/pixmaps/flags_xpm/si.xpm | 166 + src/pixmaps/flags_xpm/sj.xpm | 142 + src/pixmaps/flags_xpm/sk.xpm | 169 + src/pixmaps/flags_xpm/sl.xpm | 154 + src/pixmaps/flags_xpm/sm.xpm | 151 + src/pixmaps/flags_xpm/sn.xpm | 169 + src/pixmaps/flags_xpm/so.xpm | 173 + src/pixmaps/flags_xpm/sr.xpm | 177 + src/pixmaps/flags_xpm/st.xpm | 184 + src/pixmaps/flags_xpm/sv.xpm | 159 + src/pixmaps/flags_xpm/sy.xpm | 124 + src/pixmaps/flags_xpm/sz.xpm | 185 + src/pixmaps/flags_xpm/tc.xpm | 179 + src/pixmaps/flags_xpm/td.xpm | 179 + src/pixmaps/flags_xpm/tf.xpm | 160 + src/pixmaps/flags_xpm/tg.xpm | 172 + src/pixmaps/flags_xpm/th.xpm | 159 + src/pixmaps/flags_xpm/tj.xpm | 132 + src/pixmaps/flags_xpm/tk.xpm | 172 + src/pixmaps/flags_xpm/tl.xpm | 151 + src/pixmaps/flags_xpm/tm.xpm | 160 + src/pixmaps/flags_xpm/tn.xpm | 153 + src/pixmaps/flags_xpm/to.xpm | 134 + src/pixmaps/flags_xpm/tr.xpm | 150 + src/pixmaps/flags_xpm/tt.xpm | 163 + src/pixmaps/flags_xpm/tv.xpm | 156 + src/pixmaps/flags_xpm/tw.xpm | 148 + src/pixmaps/flags_xpm/tz.xpm | 174 + src/pixmaps/flags_xpm/ua.xpm | 165 + src/pixmaps/flags_xpm/ug.xpm | 168 + src/pixmaps/flags_xpm/um.xpm | 147 + src/pixmaps/flags_xpm/unknown.xpm | 44 + src/pixmaps/flags_xpm/us.xpm | 152 + src/pixmaps/flags_xpm/uy.xpm | 177 + src/pixmaps/flags_xpm/uz.xpm | 157 + src/pixmaps/flags_xpm/va.xpm | 160 + src/pixmaps/flags_xpm/vc.xpm | 181 + src/pixmaps/flags_xpm/ve.xpm | 175 + src/pixmaps/flags_xpm/vg.xpm | 181 + src/pixmaps/flags_xpm/vi.xpm | 160 + src/pixmaps/flags_xpm/vn.xpm | 143 + src/pixmaps/flags_xpm/vu.xpm | 172 + src/pixmaps/flags_xpm/wales.xpm | 179 + src/pixmaps/flags_xpm/wf.xpm | 154 + src/pixmaps/flags_xpm/ws.xpm | 149 + src/pixmaps/flags_xpm/ye.xpm | 136 + src/pixmaps/flags_xpm/yt.xpm | 150 + src/pixmaps/flags_xpm/za.xpm | 185 + src/pixmaps/flags_xpm/zm.xpm | 161 + src/pixmaps/flags_xpm/zw.xpm | 183 + src/pixmaps/mule_Tr_grey.ico.xpm | 49 + src/pixmaps/mule_Tr_grey_big.ico.xpm | 131 + src/pixmaps/mule_Tr_yellow.ico.xpm | 70 + src/pixmaps/mule_Tr_yellow_big.ico.xpm | 191 + src/pixmaps/mule_TrayIcon.ico.xpm | 73 + src/pixmaps/mule_TrayIcon_big.ico.xpm | 194 + src/pixmaps/sort_dn.xpm | 22 + src/pixmaps/sort_dnx2.xpm | 22 + src/pixmaps/sort_up.xpm | 22 + src/pixmaps/sort_upx2.xpm | 22 + src/remote-gui.net/AboutBox.Designer.cs | 186 + src/remote-gui.net/AboutBox.cs | 112 + src/remote-gui.net/AboutBox.resx | 610 + src/remote-gui.net/AddLinkDialog.Designer.cs | 81 + src/remote-gui.net/AddLinkDialog.cs | 16 + src/remote-gui.net/AddLinkDialog.resx | 120 + src/remote-gui.net/ConnectDlg.Designer.cs | 154 + src/remote-gui.net/ConnectDlg.cs | 35 + src/remote-gui.net/ConnectDlg.resx | 123 + src/remote-gui.net/DownloadControl.cs | 597 + src/remote-gui.net/ECCodes.cs | 1 + src/remote-gui.net/ECTagTypes.cs | 1 + src/remote-gui.net/MainWindow.Designer.cs | 222 + src/remote-gui.net/MainWindow.cs | 509 + src/remote-gui.net/MainWindow.resx | 120 + src/remote-gui.net/Program.cs | 44 + src/remote-gui.net/Properties/AssemblyInfo.cs | 33 + .../Properties/Resources.Designer.cs | 126 + src/remote-gui.net/Properties/Resources.resx | 148 + src/remote-gui.net/Properties/Settings.Designer.cs | 26 + src/remote-gui.net/Properties/Settings.settings | 7 + src/remote-gui.net/SearchControl.Designer.cs | 106 + src/remote-gui.net/SearchControl.cs | 16 + src/remote-gui.net/SearchControl.resx | 120 + src/remote-gui.net/amuleData.cs | 723 + src/remote-gui.net/amuleRemote.cs | 1 + src/remote-gui.net/ecProto.cs | 1 + src/remote-gui.net/images/Toolbar_About.png | Bin 0 -> 1517 bytes src/remote-gui.net/images/Toolbar_Disconnect.png | Bin 0 -> 2026 bytes src/remote-gui.net/images/Toolbar_Import.png | Bin 0 -> 1997 bytes src/remote-gui.net/images/Toolbar_Network.png | Bin 0 -> 2464 bytes src/remote-gui.net/images/Toolbar_Prefs.png | Bin 0 -> 1372 bytes src/remote-gui.net/images/Toolbar_Search.png | Bin 0 -> 2215 bytes src/remote-gui.net/images/Toolbar_Shared.png | Bin 0 -> 1015 bytes src/remote-gui.net/images/Toolbar_Stats.png | Bin 0 -> 1886 bytes src/remote-gui.net/images/Toolbar_Transfers.png | Bin 0 -> 1504 bytes src/remote-gui.net/remote-gui.net.csproj | 140 + src/remote-gui.net/remote-gui.net.sln | 20 + src/skins/Makefile.am | 9 + src/skins/Makefile.in | 484 + src/skins/gnome.zip | Bin 0 -> 45194 bytes src/skins/kde4.zip | Bin 0 -> 49922 bytes src/skins/tango.zip | Bin 0 -> 47904 bytes src/skins/xfce.zip | Bin 0 -> 44948 bytes src/updownclient.h | 885 + src/utils/Makefile.am | 25 + src/utils/Makefile.in | 626 + src/utils/aLinkCreator/Makefile.am | 13 + src/utils/aLinkCreator/Makefile.in | 661 + src/utils/aLinkCreator/alc.desktop | 11 + src/utils/aLinkCreator/alc.ico | Bin 0 -> 7406 bytes src/utils/aLinkCreator/alc.rc | 3 + src/utils/aLinkCreator/alc.xpm | 55 + src/utils/aLinkCreator/docs/Makefile.am | 13 + src/utils/aLinkCreator/docs/Makefile.in | 496 + src/utils/aLinkCreator/docs/alc.1 | 16 + src/utils/aLinkCreator/docs/alc.de.1 | 14 + src/utils/aLinkCreator/docs/alc.es.1 | 14 + src/utils/aLinkCreator/docs/alc.eu.1 | 15 + src/utils/aLinkCreator/docs/alc.hu.1 | 16 + src/utils/aLinkCreator/docs/alcc.1 | 30 + src/utils/aLinkCreator/docs/alcc.de.1 | 27 + src/utils/aLinkCreator/docs/alcc.es.1 | 27 + src/utils/aLinkCreator/docs/alcc.eu.1 | 32 + src/utils/aLinkCreator/docs/alcc.fr.1 | 32 + src/utils/aLinkCreator/docs/alcc.hu.1 | 32 + src/utils/aLinkCreator/src/Makefile.am | 73 + src/utils/aLinkCreator/src/Makefile.in | 754 + src/utils/aLinkCreator/src/alc.cpp | 65 + src/utils/aLinkCreator/src/alc.h | 61 + src/utils/aLinkCreator/src/alcc.cpp | 124 + src/utils/aLinkCreator/src/alcc.h | 99 + src/utils/aLinkCreator/src/alcframe.cpp | 636 + src/utils/aLinkCreator/src/alcframe.h | 184 + src/utils/aLinkCreator/src/alcpix.cpp | 2646 +++ src/utils/aLinkCreator/src/alcpix.h | 60 + src/utils/aLinkCreator/src/bithelp.h | 56 + src/utils/aLinkCreator/src/ed2khash.cpp | 274 + src/utils/aLinkCreator/src/ed2khash.h | 80 + src/utils/aLinkCreator/src/md4.cpp | 402 + src/utils/aLinkCreator/src/md4.h | 117 + src/utils/amps/CHANGELOG | 78 + src/utils/amps/COPYING | 482 + src/utils/amps/README | 37 + src/utils/amps/SETTINGS | 72 + src/utils/amps/TODO | 11 + src/utils/amps/images/baseimage.png | Bin 0 -> 83838 bytes src/utils/amps/images/baseimage.xcf.bz2 | Bin 0 -> 122525 bytes src/utils/amps/images/baseimage_old.png | Bin 0 -> 133179 bytes src/utils/amps/images/clock.png | Bin 0 -> 994 bytes src/utils/amps/images/conn_highid_kad_fw.png | Bin 0 -> 845 bytes src/utils/amps/images/conn_highid_kad_off.png | Bin 0 -> 884 bytes src/utils/amps/images/conn_highid_kad_on.png | Bin 0 -> 799 bytes src/utils/amps/images/conn_lowid_kad_fw.png | Bin 0 -> 844 bytes src/utils/amps/images/conn_lowid_kad_off.png | Bin 0 -> 880 bytes src/utils/amps/images/conn_lowid_kad_on.png | Bin 0 -> 814 bytes src/utils/amps/images/files.png | Bin 0 -> 904 bytes src/utils/amps/images/noconn_kad_fw.png | Bin 0 -> 889 bytes src/utils/amps/images/noconn_kad_off.png | Bin 0 -> 888 bytes src/utils/amps/images/noconn_kad_on.png | Bin 0 -> 863 bytes src/utils/amps/images/queue.png | Bin 0 -> 727 bytes src/utils/amps/images/running.png | Bin 0 -> 781 bytes src/utils/amps/images/rx0tx0.png | Bin 0 -> 707 bytes src/utils/amps/images/rx0tx1.png | Bin 0 -> 752 bytes src/utils/amps/images/rx1tx0.png | Bin 0 -> 778 bytes src/utils/amps/images/rx1tx1.png | Bin 0 -> 808 bytes src/utils/amps/images/serverbox.png | Bin 0 -> 714 bytes src/utils/amps/index.php | 781 + src/utils/amps/langs/ca.inc | 71 + src/utils/amps/langs/de.inc | 67 + src/utils/amps/langs/en.inc | 83 + src/utils/amps/langs/es.inc | 67 + src/utils/amps/langs/eu.inc | 71 + src/utils/amps/langs/fi.inc | 65 + src/utils/amps/langs/fr.inc | 71 + src/utils/amps/langs/hu.inc | 71 + src/utils/amps/langs/it.inc | 69 + src/utils/amps/langs/nl.inc | 67 + src/utils/amps/langs/pl.inc | 69 + src/utils/amps/langs/pt.inc | 77 + src/utils/amps/langs/pt_BR.inc | 78 + src/utils/amps/style.css | 85 + src/utils/cas/Makefile.am | 51 + src/utils/cas/Makefile.in | 833 + src/utils/cas/README | 18 + src/utils/cas/cas.c | 307 + src/utils/cas/configfile.c | 151 + src/utils/cas/configfile.h | 49 + src/utils/cas/docs/Makefile.am | 7 + src/utils/cas/docs/Makefile.in | 489 + src/utils/cas/docs/cas.1 | 47 + src/utils/cas/docs/cas.de.1 | 63 + src/utils/cas/docs/cas.es.1 | 41 + src/utils/cas/docs/cas.eu.1 | 48 + src/utils/cas/docs/cas.hu.1 | 43 + src/utils/cas/functions.c | 311 + src/utils/cas/functions.h | 38 + src/utils/cas/graphics.c | 101 + src/utils/cas/graphics.h | 35 + src/utils/cas/html.c | 133 + src/utils/cas/html.h | 35 + src/utils/cas/lines.c | 72 + src/utils/cas/lines.h | 27 + src/utils/cas/stat.png | Bin 0 -> 133318 bytes src/utils/cas/tmp.html | 199 + src/utils/cas/version.h | 31 + src/utils/mkFileSum.c | 388 + src/utils/scripts/denoiser.rules | 418 + src/utils/scripts/id2ip | 75 + src/utils/scripts/kadnodescreate.pl | 173 + src/utils/scripts/linkcvs | 146 + src/utils/scripts/logfilter | 58 + src/utils/scripts/mac_packager | 96 + src/utils/scripts/make_store | 5 + src/utils/scripts/mldonkey_importer.pl | 404 + src/utils/scripts/sanity | 980 + src/utils/scripts/stats.pl | 96 + src/utils/scripts/translate-manpages | 28 + src/utils/scripts/version_bumper | 63 + src/utils/scripts/wikify_latest_changelog | 38 + src/utils/wxCas/Makefile.am | 11 + src/utils/wxCas/Makefile.in | 659 + src/utils/wxCas/docs/Makefile.am | 7 + src/utils/wxCas/docs/Makefile.in | 489 + src/utils/wxCas/docs/wxcas.1 | 23 + src/utils/wxCas/docs/wxcas.de.1 | 31 + src/utils/wxCas/docs/wxcas.es.1 | 20 + src/utils/wxCas/docs/wxcas.eu.1 | 21 + src/utils/wxCas/docs/wxcas.hu.1 | 21 + src/utils/wxCas/src/Makefile.am | 51 + src/utils/wxCas/src/Makefile.in | 732 + src/utils/wxCas/src/linuxmon.cpp | 114 + src/utils/wxCas/src/linuxmon.h | 82 + src/utils/wxCas/src/onlinesig.cpp | 363 + src/utils/wxCas/src/onlinesig.h | 193 + src/utils/wxCas/src/wxcas.cpp | 106 + src/utils/wxCas/src/wxcas.h | 69 + src/utils/wxCas/src/wxcascte.cpp | 171 + src/utils/wxCas/src/wxcascte.h | 144 + src/utils/wxCas/src/wxcasframe.cpp | 1183 ++ src/utils/wxCas/src/wxcasframe.h | 189 + src/utils/wxCas/src/wxcaspix.cpp | 1691 ++ src/utils/wxCas/src/wxcaspix.h | 62 + src/utils/wxCas/src/wxcasprefs.cpp | 484 + src/utils/wxCas/src/wxcasprefs.h | 124 + src/utils/wxCas/src/wxcasprint.cpp | 130 + src/utils/wxCas/src/wxcasprint.h | 66 + src/utils/wxCas/wxcas.desktop | 11 + src/utils/wxCas/wxcas.ico | Bin 0 -> 10662 bytes src/utils/wxCas/wxcas.rc | 3 + src/utils/wxCas/wxcas.xpm | 228 + src/utils/xas/Makefile.am | 12 + src/utils/xas/Makefile.in | 666 + src/utils/xas/autostart-xas.in | 42 + src/utils/xas/docs/Makefile.am | 32 + src/utils/xas/docs/Makefile.in | 533 + src/utils/xas/docs/xas.1 | 22 + src/utils/xas/docs/xas.de.1 | 31 + src/utils/xas/docs/xas.es.1 | 14 + src/utils/xas/docs/xas.eu.1 | 21 + src/utils/xas/docs/xas.hu.1 | 24 + src/utils/xas/xas.pl | 245 + src/webserver/Makefile.am | 3 + src/webserver/Makefile.in | 602 + src/webserver/chicane/Makefile.am | 69 + src/webserver/chicane/Makefile.in | 544 + src/webserver/chicane/aMule.tmpl | 1102 + src/webserver/chicane/add_server.gif | Bin 0 -> 625 bytes src/webserver/chicane/arrow_down.gif | Bin 0 -> 204 bytes src/webserver/chicane/arrow_down_logout.gif | Bin 0 -> 97 bytes src/webserver/chicane/arrow_right.gif | Bin 0 -> 85 bytes src/webserver/chicane/arrow_up.gif | Bin 0 -> 204 bytes src/webserver/chicane/back.gif | Bin 0 -> 64 bytes src/webserver/chicane/black.gif | Bin 0 -> 83 bytes src/webserver/chicane/blank1x1.gif | Bin 0 -> 43 bytes src/webserver/chicane/blue1.gif | Bin 0 -> 83 bytes src/webserver/chicane/blue2.gif | Bin 0 -> 83 bytes src/webserver/chicane/blue3.gif | Bin 0 -> 83 bytes src/webserver/chicane/blue4.gif | Bin 0 -> 83 bytes src/webserver/chicane/blue5.gif | Bin 0 -> 83 bytes src/webserver/chicane/blue6.gif | Bin 0 -> 83 bytes src/webserver/chicane/cp_download.gif | Bin 0 -> 1441 bytes src/webserver/chicane/cp_kad.gif | Bin 0 -> 1671 bytes src/webserver/chicane/cp_search.gif | Bin 0 -> 1435 bytes src/webserver/chicane/cp_servers.gif | Bin 0 -> 1562 bytes src/webserver/chicane/cp_settings.gif | Bin 0 -> 1055 bytes src/webserver/chicane/cp_shared.gif | Bin 0 -> 1511 bytes src/webserver/chicane/cp_stats.gif | Bin 0 -> 1494 bytes src/webserver/chicane/downloads.php | 562 + src/webserver/chicane/emule.gif | Bin 0 -> 2586 bytes src/webserver/chicane/favicon.ico | Bin 0 -> 11662 bytes src/webserver/chicane/green.gif | Bin 0 -> 83 bytes src/webserver/chicane/greenpercent.gif | Bin 0 -> 62 bytes src/webserver/chicane/index.php | 372 + src/webserver/chicane/l_cancel.gif | Bin 0 -> 890 bytes src/webserver/chicane/l_connect.gif | Bin 0 -> 345 bytes src/webserver/chicane/l_down.gif | Bin 0 -> 917 bytes src/webserver/chicane/l_ed2klink.gif | Bin 0 -> 893 bytes src/webserver/chicane/l_info.gif | Bin 0 -> 370 bytes src/webserver/chicane/l_pause.gif | Bin 0 -> 873 bytes src/webserver/chicane/l_resume.gif | Bin 0 -> 918 bytes src/webserver/chicane/l_up.gif | Bin 0 -> 915 bytes src/webserver/chicane/log.gif | Bin 0 -> 1042 bytes src/webserver/chicane/login.php | 103 + src/webserver/chicane/login_bottom.gif | Bin 0 -> 890 bytes src/webserver/chicane/login_downmain.gif | Bin 0 -> 3820 bytes src/webserver/chicane/login_lefttop.gif | Bin 0 -> 107 bytes src/webserver/chicane/login_righttop.gif | Bin 0 -> 592 bytes src/webserver/chicane/login_top.gif | Bin 0 -> 602 bytes src/webserver/chicane/login_topdown.gif | Bin 0 -> 3353 bytes src/webserver/chicane/login_topseperator.gif | Bin 0 -> 158 bytes src/webserver/chicane/logo.jpg | Bin 0 -> 13285 bytes src/webserver/chicane/main_bg.gif | Bin 0 -> 166 bytes src/webserver/chicane/main_top_bg.gif | Bin 0 -> 166 bytes src/webserver/chicane/main_topbar.gif | Bin 0 -> 592 bytes src/webserver/chicane/main_topbardarker.gif | Bin 0 -> 602 bytes src/webserver/chicane/main_topbarseperator.gif | Bin 0 -> 715 bytes src/webserver/chicane/phpamule.png | Bin 0 -> 109734 bytes src/webserver/chicane/preferences.php | 485 + src/webserver/chicane/red.gif | Bin 0 -> 83 bytes src/webserver/chicane/search.php | 486 + src/webserver/chicane/servers.php | 424 + src/webserver/chicane/shared.php | 434 + src/webserver/chicane/stat_graphs.php | 329 + src/webserver/chicane/stat_tree.php | 384 + src/webserver/chicane/transparent.gif | Bin 0 -> 85 bytes src/webserver/chicane/tree-closed.gif | Bin 0 -> 87 bytes src/webserver/chicane/tree-leaf.gif | Bin 0 -> 90 bytes src/webserver/chicane/tree-open.gif | Bin 0 -> 112 bytes src/webserver/chicane/yellow.gif | Bin 0 -> 83 bytes src/webserver/default/Makefile.am | 55 + src/webserver/default/Makefile.in | 530 + src/webserver/default/aMule.tmpl | 984 + src/webserver/default/add_server.gif | Bin 0 -> 625 bytes src/webserver/default/arrow_down.gif | Bin 0 -> 204 bytes src/webserver/default/arrow_right.gif | Bin 0 -> 85 bytes src/webserver/default/arrow_up.gif | Bin 0 -> 204 bytes src/webserver/default/back.gif | Bin 0 -> 64 bytes src/webserver/default/black.gif | Bin 0 -> 97 bytes src/webserver/default/blue1.gif | Bin 0 -> 84 bytes src/webserver/default/blue2.gif | Bin 0 -> 84 bytes src/webserver/default/blue3.gif | Bin 0 -> 84 bytes src/webserver/default/blue4.gif | Bin 0 -> 84 bytes src/webserver/default/blue5.gif | Bin 0 -> 84 bytes src/webserver/default/blue6.gif | Bin 0 -> 84 bytes src/webserver/default/cp_download.gif | Bin 0 -> 814 bytes src/webserver/default/cp_kad.gif | Bin 0 -> 1671 bytes src/webserver/default/cp_search.gif | Bin 0 -> 748 bytes src/webserver/default/cp_servers.gif | Bin 0 -> 939 bytes src/webserver/default/cp_settings.gif | Bin 0 -> 1264 bytes src/webserver/default/cp_shared.gif | Bin 0 -> 1090 bytes src/webserver/default/cp_stats.gif | Bin 0 -> 1061 bytes src/webserver/default/downloads.php | 486 + src/webserver/default/emule.gif | Bin 0 -> 1592 bytes src/webserver/default/favicon.ico | Bin 0 -> 11662 bytes src/webserver/default/green.gif | Bin 0 -> 97 bytes src/webserver/default/greenpercent.gif | Bin 0 -> 81 bytes src/webserver/default/index.php | 302 + src/webserver/default/l_cancel.gif | Bin 0 -> 890 bytes src/webserver/default/l_connect.gif | Bin 0 -> 345 bytes src/webserver/default/l_down.gif | Bin 0 -> 917 bytes src/webserver/default/l_ed2klink.gif | Bin 0 -> 893 bytes src/webserver/default/l_info.gif | Bin 0 -> 370 bytes src/webserver/default/l_pause.gif | Bin 0 -> 873 bytes src/webserver/default/l_resume.gif | Bin 0 -> 918 bytes src/webserver/default/l_up.gif | Bin 0 -> 915 bytes src/webserver/default/log.gif | Bin 0 -> 1042 bytes src/webserver/default/login.php | 67 + src/webserver/default/logo.jpg | Bin 0 -> 13285 bytes src/webserver/default/phpamule.png | Bin 0 -> 109734 bytes src/webserver/default/preferences.php | 427 + src/webserver/default/red.gif | Bin 0 -> 82 bytes src/webserver/default/search.php | 430 + src/webserver/default/servers.php | 364 + src/webserver/default/shared.php | 375 + src/webserver/default/stat_graphs.php | 271 + src/webserver/default/stat_tree.php | 328 + src/webserver/default/transparent.gif | Bin 0 -> 85 bytes src/webserver/default/tree-closed.gif | Bin 0 -> 87 bytes src/webserver/default/tree-leaf.gif | Bin 0 -> 90 bytes src/webserver/default/tree-open.gif | Bin 0 -> 112 bytes src/webserver/default/yellow.gif | Bin 0 -> 97 bytes src/webserver/php-default/Makefile.am | 51 + src/webserver/php-default/Makefile.in | 526 + src/webserver/php-default/amuleweb-main-dload.php | 403 + src/webserver/php-default/amuleweb-main-kad.php | 142 + src/webserver/php-default/amuleweb-main-prefs.php | 314 + src/webserver/php-default/amuleweb-main-search.php | 231 + .../php-default/amuleweb-main-servers.php | 123 + src/webserver/php-default/amuleweb-main-shared.php | 260 + src/webserver/php-default/amuleweb-main-stats.php | 113 + src/webserver/php-default/apply.jpeg | Bin 0 -> 1515 bytes src/webserver/php-default/arrow-r.png | Bin 0 -> 1059 bytes src/webserver/php-default/cancel.gif | Bin 0 -> 890 bytes src/webserver/php-default/connect.gif | Bin 0 -> 345 bytes src/webserver/php-default/delete.jpeg | Bin 0 -> 785 bytes src/webserver/php-default/down.jpeg | Bin 0 -> 718 bytes src/webserver/php-default/favicon.ico | Bin 0 -> 11662 bytes src/webserver/php-default/footer.php | 65 + src/webserver/php-default/index.html | 15 + src/webserver/php-default/login.php | 67 + src/webserver/php-default/pause.jpeg | Bin 0 -> 714 bytes src/webserver/php-default/phpamule.png | Bin 0 -> 109734 bytes src/webserver/php-default/resume.jpeg | Bin 0 -> 726 bytes src/webserver/php-default/stats.php | 88 + src/webserver/php-default/stats_tree.php | 114 + src/webserver/php-default/toolbutton-connect.jpeg | Bin 0 -> 1455 bytes .../php-default/toolbutton-download-pressed.jpeg | Bin 0 -> 2362 bytes src/webserver/php-default/toolbutton-download.jpeg | Bin 0 -> 2384 bytes src/webserver/php-default/toolbutton-filter.jpeg | Bin 0 -> 1465 bytes .../php-default/toolbutton-kad-pressed.jpeg | Bin 0 -> 2434 bytes src/webserver/php-default/toolbutton-kad.jpeg | Bin 0 -> 2431 bytes .../php-default/toolbutton-logout-pressed.jpeg | Bin 0 -> 2319 bytes src/webserver/php-default/toolbutton-logout.jpeg | Bin 0 -> 2315 bytes src/webserver/php-default/toolbutton-reload.jpeg | Bin 0 -> 883 bytes .../php-default/toolbutton-search-pressed.jpeg | Bin 0 -> 2301 bytes src/webserver/php-default/toolbutton-search.jpeg | Bin 0 -> 2332 bytes .../php-default/toolbutton-servers-pressed.jpeg | Bin 0 -> 2255 bytes src/webserver/php-default/toolbutton-servers.jpeg | Bin 0 -> 2289 bytes .../php-default/toolbutton-settings-pressed.jpeg | Bin 0 -> 2380 bytes src/webserver/php-default/toolbutton-settings.jpeg | Bin 0 -> 2414 bytes .../php-default/toolbutton-shared-pressed.jpeg | Bin 0 -> 2264 bytes src/webserver/php-default/toolbutton-shared.jpeg | Bin 0 -> 2269 bytes .../php-default/toolbutton-stats-pressed.jpeg | Bin 0 -> 2383 bytes src/webserver/php-default/toolbutton-stats.jpeg | Bin 0 -> 2323 bytes src/webserver/php-default/top.html | 99 + src/webserver/php-default/tree-closed.gif | Bin 0 -> 87 bytes src/webserver/php-default/tree-leaf.gif | Bin 0 -> 90 bytes src/webserver/php-default/tree-open.gif | Bin 0 -> 112 bytes src/webserver/php-default/up.jpeg | Bin 0 -> 729 bytes src/webserver/src/Makefile.am | 80 + src/webserver/src/Makefile.in | 855 + src/webserver/src/UPnPCompatibility.cpp | 61 + src/webserver/src/WebInterface.cpp | 400 + src/webserver/src/WebInterface.h | 76 + src/webserver/src/WebServer.cpp | 1972 ++ src/webserver/src/WebServer.h | 791 + src/webserver/src/WebSocket.cpp | 444 + src/webserver/src/WebSocket.h | 113 + src/webserver/src/missing-template.html | 20 + src/webserver/src/php_core_lib.cpp | 1902 ++ src/webserver/src/php_core_lib.h | 101 + src/webserver/src/php_lexer.c | 2255 ++ src/webserver/src/php_lexer.l | 250 + src/webserver/src/php_parser.c | 3169 +++ src/webserver/src/php_parser.h | 233 + src/webserver/src/php_parser.y | 468 + src/webserver/src/php_syntree.cpp | 2016 ++ src/webserver/src/php_syntree.h | 551 + unittests/Makefile.am | 7 + unittests/Makefile.in | 606 + unittests/README | 146 + unittests/muleunit/Makefile.am | 16 + unittests/muleunit/Makefile.in | 635 + unittests/muleunit/license.txt | 459 + unittests/muleunit/main.cpp | 69 + unittests/muleunit/test.cpp | 160 + unittests/muleunit/test.h | 386 + unittests/muleunit/testcase.cpp | 107 + unittests/muleunit/testcase.h | 119 + unittests/muleunit/testregistry.cpp | 88 + unittests/muleunit/testregistry.h | 74 + unittests/tests/FileDataIOTest.cpp | 952 + unittests/tests/FormatTest.cpp | 484 + unittests/tests/Makefile.am | 57 + unittests/tests/Makefile.in | 1073 + unittests/tests/NetworkFunctionsTest.cpp | 134 + unittests/tests/PathTest.cpp | 375 + unittests/tests/RangeMapTest.cpp | 845 + unittests/tests/StringFunctionsTest.cpp | 193 + unittests/tests/TextFileTest.cpp | 244 + unittests/tests/TextFileTest_dos.txt | 9 + unittests/tests/TextFileTest_unix.txt | 9 + version.rc.in | 49 + 1441 files changed, 575945 insertions(+) create mode 100644 ABOUT-NLS create mode 100644 CVSDATE create mode 100644 Compilation.flags.in create mode 100644 Makefile.am create mode 100644 Makefile.in create mode 100644 README.Debian-Packages create mode 100644 SVNDATE create mode 100644 aMule-CVS.spec create mode 100755 aMule.app/Contents/Frameworks/libixml.2.dylib create mode 100755 aMule.app/Contents/Frameworks/libthreadutil.2.dylib create mode 100755 aMule.app/Contents/Frameworks/libupnp.3.dylib create mode 100644 aMule.app/Contents/Info.plist create mode 100644 aMule.app/Contents/MacOS/ed2kHelperScript.app/Contents/Info.plist create mode 100755 aMule.app/Contents/MacOS/ed2kHelperScript.app/Contents/MacOS/applet create mode 100644 aMule.app/Contents/MacOS/ed2kHelperScript.app/Contents/PkgInfo create mode 100644 aMule.app/Contents/MacOS/ed2kHelperScript.app/Contents/Resources/Scripts/main.scpt create mode 100644 aMule.app/Contents/MacOS/ed2kHelperScript.app/Contents/Resources/applet.rsrc create mode 100644 aMule.app/Contents/PkgInfo create mode 100755 aMule.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib create mode 100755 aMule.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib create mode 100755 aMule.app/Contents/Resources/English.lproj/MainMenu.nib/objects.nib create mode 100644 aMule.app/Contents/Resources/amule.icns create mode 100755 aMule.app/Icon create mode 100644 aMule.spec create mode 100644 acinclude.m4 create mode 100644 aclocal.m4 create mode 100644 amule.desktop create mode 100644 amule.ico create mode 100644 amule.png create mode 100644 amule.rc create mode 100644 amule.xpm create mode 100755 amule_build_install.sh create mode 100644 amulegui.desktop create mode 100644 amulegui.xpm create mode 100755 autogen.sh create mode 100644 automake/dist-hook.am create mode 100644 automake/manpages.am create mode 100755 compile create mode 100755 config.guess create mode 100644 config.h.in create mode 100755 config.rpath create mode 100755 config.sub create mode 100755 configure create mode 100644 configure.in create mode 100644 convert.ico create mode 100644 debian/TODO create mode 100644 debian/amule-alc-dbg.dirs create mode 100644 debian/amule-alc-dbg.override create mode 100644 debian/amule-alc.dirs create mode 100644 debian/amule-alc.install create mode 100644 debian/amule-alc.manpages create mode 100644 debian/amule-alc.menu create mode 100644 debian/amule-alc.override create mode 100644 debian/amule-alcc-dbg.dirs create mode 100644 debian/amule-alcc-dbg.override create mode 100644 debian/amule-alcc.dirs create mode 100644 debian/amule-alcc.install create mode 100644 debian/amule-alcc.manpages create mode 100644 debian/amule-alcc.override create mode 100644 debian/amule-cas-dbg.dirs create mode 100644 debian/amule-cas-dbg.override create mode 100644 debian/amule-cas.README.Debian create mode 100644 debian/amule-cas.dirs create mode 100644 debian/amule-cas.install create mode 100644 debian/amule-cas.manpages create mode 100644 debian/amule-cas.override create mode 100644 debian/amule-cmd-dbg.dirs create mode 100644 debian/amule-cmd-dbg.override create mode 100644 debian/amule-cmd.dirs create mode 100644 debian/amule-cmd.install create mode 100644 debian/amule-cmd.manpages create mode 100644 debian/amule-cmd.override create mode 100644 debian/amule-common.dirs create mode 100644 debian/amule-common.docs create mode 100644 debian/amule-common.install create mode 100644 debian/amule-common.override create mode 100644 debian/amule-daemon-dbg.dirs create mode 100644 debian/amule-daemon-dbg.override create mode 100644 debian/amule-daemon.dirs create mode 100644 debian/amule-daemon.install create mode 100644 debian/amule-daemon.manpages create mode 100644 debian/amule-daemon.override create mode 100644 debian/amule-dbg.dirs create mode 100644 debian/amule-dbg.override create mode 100644 debian/amule-ed2k-dbg.dirs create mode 100644 debian/amule-ed2k-dbg.override create mode 100644 debian/amule-ed2k.dirs create mode 100644 debian/amule-ed2k.docs create mode 100644 debian/amule-ed2k.install create mode 100644 debian/amule-ed2k.manpages create mode 100644 debian/amule-ed2k.override create mode 100644 debian/amule-ed2k.preinst create mode 100644 debian/amule-i18n-ar.dirs create mode 100644 debian/amule-i18n-ar.install create mode 100644 debian/amule-i18n-ar.override create mode 100644 debian/amule-i18n-bg.dirs create mode 100644 debian/amule-i18n-bg.install create mode 100644 debian/amule-i18n-bg.override create mode 100644 debian/amule-i18n-ca.dirs create mode 100644 debian/amule-i18n-ca.install create mode 100644 debian/amule-i18n-ca.override create mode 100644 debian/amule-i18n-da.dirs create mode 100644 debian/amule-i18n-da.install create mode 100644 debian/amule-i18n-da.override create mode 100644 debian/amule-i18n-de.dirs create mode 100644 debian/amule-i18n-de.install create mode 100644 debian/amule-i18n-de.override create mode 100644 debian/amule-i18n-en-gb.dirs create mode 100644 debian/amule-i18n-en-gb.install create mode 100644 debian/amule-i18n-en-gb.override create mode 100644 debian/amule-i18n-es.dirs create mode 100644 debian/amule-i18n-es.install create mode 100644 debian/amule-i18n-es.override create mode 100644 debian/amule-i18n-et-ee.dirs create mode 100644 debian/amule-i18n-et-ee.install create mode 100644 debian/amule-i18n-et-ee.override create mode 100644 debian/amule-i18n-eu.dirs create mode 100644 debian/amule-i18n-eu.install create mode 100644 debian/amule-i18n-eu.override create mode 100644 debian/amule-i18n-fi.dirs create mode 100644 debian/amule-i18n-fi.install create mode 100644 debian/amule-i18n-fi.override create mode 100644 debian/amule-i18n-fr.dirs create mode 100644 debian/amule-i18n-fr.install create mode 100644 debian/amule-i18n-fr.override create mode 100644 debian/amule-i18n-gl.dirs create mode 100644 debian/amule-i18n-gl.install create mode 100644 debian/amule-i18n-gl.override create mode 100644 debian/amule-i18n-hr.dirs create mode 100644 debian/amule-i18n-hr.install create mode 100644 debian/amule-i18n-hr.override create mode 100644 debian/amule-i18n-hu.dirs create mode 100644 debian/amule-i18n-hu.install create mode 100644 debian/amule-i18n-hu.override create mode 100644 debian/amule-i18n-it-ch.dirs create mode 100644 debian/amule-i18n-it-ch.install create mode 100644 debian/amule-i18n-it-ch.override create mode 100644 debian/amule-i18n-it.dirs create mode 100644 debian/amule-i18n-it.install create mode 100644 debian/amule-i18n-it.override create mode 100644 debian/amule-i18n-ko-kr.dirs create mode 100644 debian/amule-i18n-ko-kr.install create mode 100644 debian/amule-i18n-ko-kr.override create mode 100644 debian/amule-i18n-lt.dirs create mode 100644 debian/amule-i18n-lt.install create mode 100644 debian/amule-i18n-lt.override create mode 100644 debian/amule-i18n-nl.dirs create mode 100644 debian/amule-i18n-nl.install create mode 100644 debian/amule-i18n-nl.override create mode 100644 debian/amule-i18n-nn.dirs create mode 100644 debian/amule-i18n-nn.install create mode 100644 debian/amule-i18n-nn.override create mode 100644 debian/amule-i18n-pl.dirs create mode 100644 debian/amule-i18n-pl.install create mode 100644 debian/amule-i18n-pl.override create mode 100644 debian/amule-i18n-pt-br.dirs create mode 100644 debian/amule-i18n-pt-br.install create mode 100644 debian/amule-i18n-pt-br.override create mode 100644 debian/amule-i18n-pt-pt.dirs create mode 100644 debian/amule-i18n-pt-pt.install create mode 100644 debian/amule-i18n-pt-pt.override create mode 100644 debian/amule-i18n-ru.dirs create mode 100644 debian/amule-i18n-ru.install create mode 100644 debian/amule-i18n-ru.override create mode 100644 debian/amule-i18n-sl.dirs create mode 100644 debian/amule-i18n-sl.install create mode 100644 debian/amule-i18n-sl.override create mode 100644 debian/amule-i18n-sv.dirs create mode 100644 debian/amule-i18n-sv.install create mode 100644 debian/amule-i18n-sv.override create mode 100644 debian/amule-i18n-tr.dirs create mode 100644 debian/amule-i18n-tr.install create mode 100644 debian/amule-i18n-tr.override create mode 100644 debian/amule-i18n-zh-cn.dirs create mode 100644 debian/amule-i18n-zh-cn.install create mode 100644 debian/amule-i18n-zh-cn.override create mode 100644 debian/amule-i18n-zh-tw.dirs create mode 100644 debian/amule-i18n-zh-tw.install create mode 100644 debian/amule-i18n-zh-tw.override create mode 100644 debian/amule-remote-gui-dbg.dirs create mode 100644 debian/amule-remote-gui-dbg.override create mode 100644 debian/amule-remote-gui.dirs create mode 100644 debian/amule-remote-gui.install create mode 100644 debian/amule-remote-gui.manpages create mode 100644 debian/amule-remote-gui.menu create mode 100644 debian/amule-remote-gui.override create mode 100644 debian/amule-skin-gnome.dirs create mode 100644 debian/amule-skin-gnome.install create mode 100644 debian/amule-skin-gnome.override create mode 100644 debian/amule-skin-kde4.dirs create mode 100644 debian/amule-skin-kde4.install create mode 100644 debian/amule-skin-kde4.override create mode 100644 debian/amule-skin-tango.dirs create mode 100644 debian/amule-skin-tango.install create mode 100644 debian/amule-skin-tango.override create mode 100644 debian/amule-skin-xfce.dirs create mode 100644 debian/amule-skin-xfce.install create mode 100644 debian/amule-skin-xfce.override create mode 100644 debian/amule-theme-chicane.dirs create mode 100644 debian/amule-theme-chicane.install create mode 100644 debian/amule-theme-chicane.override create mode 100644 debian/amule-theme-default.dirs create mode 100644 debian/amule-theme-default.install create mode 100644 debian/amule-theme-default.override create mode 100644 debian/amule-theme-php-default.dirs create mode 100644 debian/amule-theme-php-default.install create mode 100644 debian/amule-theme-php-default.override create mode 100644 debian/amule-utils-gui.dirs create mode 100644 debian/amule-utils-gui.override create mode 100644 debian/amule-utils.dirs create mode 100644 debian/amule-utils.override create mode 100644 debian/amule-wxcas-dbg.dirs create mode 100644 debian/amule-wxcas-dbg.override create mode 100644 debian/amule-wxcas.dirs create mode 100644 debian/amule-wxcas.install create mode 100644 debian/amule-wxcas.manpages create mode 100644 debian/amule-wxcas.menu create mode 100644 debian/amule-wxcas.override create mode 100644 debian/amule-xas.dirs create mode 100644 debian/amule-xas.install create mode 100644 debian/amule-xas.links create mode 100644 debian/amule-xas.manpages create mode 100644 debian/amule-xas.override create mode 100644 debian/amule.README.Debian create mode 100644 debian/amule.dirs create mode 100644 debian/amule.install create mode 100644 debian/amule.manpages create mode 100644 debian/amule.menu create mode 100644 debian/amule.override create mode 100644 debian/amule.postinst create mode 100644 debian/amule.postrm create mode 100644 debian/amuleweb-dbg.dirs create mode 100644 debian/amuleweb-dbg.override create mode 100644 debian/amuleweb.dirs create mode 100644 debian/amuleweb.install create mode 100644 debian/amuleweb.manpages create mode 100644 debian/amuleweb.override create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/copyright create mode 100755 debian/rules create mode 100755 depcomp create mode 100644 docs/ABOUT-NLS create mode 100644 docs/AUTHORS create mode 100644 docs/COPYING create mode 100644 docs/Changelog create mode 100644 docs/Doxyfile create mode 100644 docs/EC_Protocol.txt create mode 100644 docs/ED2K-Links.HOWTO create mode 100644 docs/INSTALL create mode 100644 docs/Makefile.am create mode 100644 docs/Makefile.in create mode 100644 docs/README create mode 100644 docs/README.Mac.txt create mode 100644 docs/README.Windows.txt create mode 100644 docs/Releases.dia create mode 100644 docs/TODO create mode 100644 docs/amule-win32.HOWTO.txt create mode 100644 docs/amulesig.txt create mode 100644 docs/license.txt create mode 100644 docs/man/Makefile.am create mode 100644 docs/man/Makefile.in create mode 100644 docs/man/amule.1 create mode 100644 docs/man/amule.de.1 create mode 100644 docs/man/amule.es.1 create mode 100644 docs/man/amule.eu.1 create mode 100644 docs/man/amule.fr.1 create mode 100644 docs/man/amule.hu.1 create mode 100644 docs/man/amulecmd.1 create mode 100644 docs/man/amulecmd.de.1 create mode 100644 docs/man/amulecmd.es.1 create mode 100644 docs/man/amulecmd.eu.1 create mode 100644 docs/man/amulecmd.fr.1 create mode 100644 docs/man/amulecmd.hu.1 create mode 100644 docs/man/amuled.1 create mode 100644 docs/man/amuled.de.1 create mode 100644 docs/man/amuled.es.1 create mode 100644 docs/man/amuled.eu.1 create mode 100644 docs/man/amuled.fr.1 create mode 100644 docs/man/amuled.hu.1 create mode 100644 docs/man/amulegui.1 create mode 100644 docs/man/amulegui.de.1 create mode 100644 docs/man/amuleweb.1 create mode 100644 docs/man/amuleweb.de.1 create mode 100644 docs/man/amuleweb.es.1 create mode 100644 docs/man/amuleweb.eu.1 create mode 100644 docs/man/amuleweb.fr.1 create mode 100644 docs/man/amuleweb.hu.1 create mode 100644 docs/man/ed2k.1 create mode 100644 docs/man/ed2k.de.1 create mode 100644 docs/man/ed2k.es.1 create mode 100644 docs/man/ed2k.eu.1 create mode 100644 docs/man/ed2k.fr.1 create mode 100644 docs/man/ed2k.hu.1 create mode 100644 docs/man/manpages-de.po create mode 100644 docs/man/manpages.pot create mode 100644 docs/socks4.protocol create mode 100755 install-sh create mode 100644 intl/ChangeLog create mode 100644 intl/Makefile.in create mode 100644 intl/VERSION create mode 100644 intl/bindtextdom.c create mode 100755 intl/config.charset create mode 100644 intl/dcgettext.c create mode 100644 intl/dcigettext.c create mode 100644 intl/dcngettext.c create mode 100644 intl/dgettext.c create mode 100644 intl/dngettext.c create mode 100644 intl/eval-plural.h create mode 100644 intl/explodename.c create mode 100644 intl/finddomain.c create mode 100644 intl/gettext.c create mode 100644 intl/gettextP.h create mode 100644 intl/gmo.h create mode 100644 intl/hash-string.h create mode 100644 intl/intl-compat.c create mode 100644 intl/l10nflist.c create mode 100644 intl/libgnuintl.h create mode 100644 intl/loadinfo.h create mode 100644 intl/loadmsgcat.c create mode 100644 intl/localcharset.c create mode 100644 intl/locale.alias create mode 100644 intl/localealias.c create mode 100644 intl/localename.c create mode 100644 intl/ngettext.c create mode 100644 intl/os2compat.c create mode 100644 intl/os2compat.h create mode 100644 intl/osdep.c create mode 100644 intl/plural-exp.c create mode 100644 intl/plural-exp.h create mode 100644 intl/plural.c create mode 100644 intl/plural.y create mode 100644 intl/ref-add.sin create mode 100644 intl/ref-del.sin create mode 100644 intl/textdomain.c create mode 100644 m4/build-tools.m4 create mode 100644 m4/codeset.m4 create mode 100644 m4/cryptopp.m4 create mode 100644 m4/gdlib.m4 create mode 100644 m4/gettext.m4 create mode 100644 m4/gettext.m4~ create mode 100644 m4/glibc21.m4 create mode 100644 m4/iconv.m4 create mode 100644 m4/intdiv0.m4 create mode 100644 m4/inttypes-pri.m4 create mode 100644 m4/inttypes.m4 create mode 100644 m4/inttypes_h.m4 create mode 100644 m4/isc-posix.m4 create mode 100644 m4/lcmessage.m4 create mode 100644 m4/lib-ld.m4 create mode 100644 m4/lib-link.m4 create mode 100644 m4/lib-prefix.m4 create mode 100644 m4/libpng.m4 create mode 100644 m4/progtest.m4 create mode 100644 m4/readline.m4 create mode 100644 m4/stdint_h.m4 create mode 100644 m4/uintmax_t.m4 create mode 100644 m4/ulonglong.m4 create mode 100644 m4/wxwin.m4 create mode 100644 m4/zlib.m4 create mode 100755 missing create mode 100755 mkinstalldirs create mode 100644 po/LINGUAS create mode 100644 po/Makefile.in.in create mode 100644 po/Makevars create mode 100644 po/POTFILES.in create mode 100644 po/Rules-quot create mode 100644 po/amule.pot create mode 100644 po/ar.po create mode 100644 po/bg.po create mode 100644 po/boldquot.sed create mode 100644 po/ca.po create mode 100644 po/cs.po create mode 100644 po/da.po create mode 100644 po/de.po create mode 100644 po/el.po create mode 100644 po/en@boldquot.header create mode 100644 po/en@quot.header create mode 100644 po/en_GB.po create mode 100644 po/es.po create mode 100644 po/et_EE.po create mode 100644 po/eu.po create mode 100644 po/fa.po create mode 100644 po/fi.po create mode 100644 po/fr.po create mode 100644 po/gl.po create mode 100644 po/hr.po create mode 100644 po/hu.po create mode 100644 po/insert-header.sin create mode 100644 po/it.po create mode 100644 po/it_CH.po create mode 100644 po/ja.po create mode 100644 po/ko_KR.po create mode 100644 po/l10n.xsl create mode 100644 po/lt.po create mode 100644 po/nl.po create mode 100644 po/nn.po create mode 100644 po/pl.po create mode 100644 po/pt_BR.po create mode 100644 po/pt_PT.po create mode 100644 po/quot.sed create mode 100644 po/remove-potcdate.sin create mode 100644 po/ru.po create mode 100644 po/sl.po create mode 100644 po/sv.po create mode 100644 po/tr.po create mode 100644 po/zh_CN.po create mode 100644 po/zh_TW.po create mode 100644 src/AddFriend.cpp create mode 100644 src/AddFriend.h create mode 100644 src/ArchSpecific.h create mode 100644 src/AsyncDNS.cpp create mode 100644 src/AsyncDNS.h create mode 100644 src/BarShader.cpp create mode 100644 src/BarShader.h create mode 100644 src/BaseClient.cpp create mode 100644 src/CFile.cpp create mode 100644 src/CFile.h create mode 100644 src/CatDialog.cpp create mode 100644 src/CatDialog.h create mode 100644 src/ChatSelector.cpp create mode 100644 src/ChatSelector.h create mode 100644 src/ChatWnd.cpp create mode 100644 src/ChatWnd.h create mode 100644 src/ClientCredits.cpp create mode 100644 src/ClientCredits.h create mode 100644 src/ClientCreditsList.cpp create mode 100644 src/ClientCreditsList.h create mode 100644 src/ClientDetailDialog.cpp create mode 100644 src/ClientDetailDialog.h create mode 100644 src/ClientList.cpp create mode 100644 src/ClientList.h create mode 100644 src/ClientListCtrl.cpp create mode 100644 src/ClientListCtrl.h create mode 100644 src/ClientTCPSocket.cpp create mode 100644 src/ClientTCPSocket.h create mode 100644 src/ClientUDPSocket.cpp create mode 100644 src/ClientUDPSocket.h create mode 100644 src/Color.h create mode 100644 src/ColorFrameCtrl.cpp create mode 100644 src/ColorFrameCtrl.h create mode 100644 src/CommentDialog.cpp create mode 100644 src/CommentDialog.h create mode 100644 src/CommentDialogLst.cpp create mode 100644 src/CommentDialogLst.h create mode 100644 src/Constants.h create mode 100644 src/CryptoPP_Inc.h create mode 100644 src/DataToText.cpp create mode 100644 src/DataToText.h create mode 100644 src/DeadSourceList.cpp create mode 100644 src/DeadSourceList.h create mode 100644 src/DirectoryTreeCtrl.cpp create mode 100644 src/DirectoryTreeCtrl.h create mode 100644 src/DownloadClient.cpp create mode 100644 src/DownloadListCtrl.cpp create mode 100644 src/DownloadListCtrl.h create mode 100644 src/DownloadQueue.cpp create mode 100644 src/DownloadQueue.h create mode 100644 src/ECSpecialCoreTags.cpp create mode 100644 src/ECSpecialMuleTags.cpp create mode 100644 src/ED2KLink.cpp create mode 100644 src/ED2KLink.h create mode 100644 src/ED2KLinkParser.cpp create mode 100644 src/EMSocket.cpp create mode 100644 src/EMSocket.h create mode 100644 src/EditServerListDlg.cpp create mode 100644 src/EditServerListDlg.h create mode 100644 src/EncryptedDatagramSocket.cpp create mode 100644 src/EncryptedDatagramSocket.h create mode 100644 src/EncryptedStreamSocket.cpp create mode 100644 src/EncryptedStreamSocket.h create mode 100644 src/ExternalConn.cpp create mode 100644 src/ExternalConn.h create mode 100644 src/ExternalConnector.cpp create mode 100644 src/ExternalConnector.h create mode 100644 src/FileDetailDialog.cpp create mode 100644 src/FileDetailDialog.h create mode 100644 src/FileDetailListCtrl.cpp create mode 100644 src/FileDetailListCtrl.h create mode 100644 src/FileLock.h create mode 100644 src/Friend.cpp create mode 100644 src/Friend.h create mode 100644 src/FriendList.cpp create mode 100644 src/FriendList.h create mode 100644 src/FriendListCtrl.cpp create mode 100644 src/FriendListCtrl.h create mode 100644 src/GetTickCount.cpp create mode 100644 src/GetTickCount.h create mode 100644 src/GuiEvents.cpp create mode 100644 src/GuiEvents.h create mode 100644 src/HTTPDownload.cpp create mode 100644 src/HTTPDownload.h create mode 100644 src/IP2Country.cpp create mode 100644 src/IP2Country.h create mode 100644 src/IPFilter.cpp create mode 100644 src/IPFilter.h create mode 100644 src/InternalEvents.h create mode 100644 src/KadDlg.cpp create mode 100644 src/KadDlg.h create mode 100644 src/KnownFile.cpp create mode 100644 src/KnownFile.h create mode 100644 src/KnownFileList.cpp create mode 100644 src/KnownFileList.h create mode 100644 src/ListenSocket.cpp create mode 100644 src/ListenSocket.h create mode 100644 src/Logger.cpp create mode 100644 src/Logger.h create mode 100644 src/MD4Hash.h create mode 100644 src/MagnetURI.cpp create mode 100644 src/MagnetURI.h create mode 100644 src/Makefile.am create mode 100644 src/Makefile.in create mode 100644 src/MemFile.cpp create mode 100644 src/MemFile.h create mode 100644 src/MuleCollection.cpp create mode 100644 src/MuleCollection.h create mode 100644 src/MuleGifCtrl.cpp create mode 100644 src/MuleGifCtrl.h create mode 100644 src/MuleListCtrl.cpp create mode 100644 src/MuleListCtrl.h create mode 100644 src/MuleNotebook.cpp create mode 100644 src/MuleNotebook.h create mode 100644 src/MuleTextCtrl.cpp create mode 100644 src/MuleTextCtrl.h create mode 100644 src/MuleThread.h create mode 100644 src/MuleTrayIcon.cpp create mode 100644 src/MuleTrayIcon.h create mode 100644 src/MuleUDPSocket.cpp create mode 100644 src/MuleUDPSocket.h create mode 100644 src/NetworkFunctions.cpp create mode 100644 src/NetworkFunctions.h create mode 100644 src/OScopeCtrl.cpp create mode 100644 src/OScopeCtrl.h create mode 100644 src/Observable.h create mode 100644 src/ObservableQueue.h create mode 100644 src/OtherFunctions.cpp create mode 100644 src/OtherFunctions.h create mode 100644 src/OtherStructs.h create mode 100644 src/Packet.cpp create mode 100644 src/Packet.h create mode 100644 src/Parser.cpp create mode 100644 src/Parser.hpp create mode 100644 src/Parser.y create mode 100644 src/PartFile.cpp create mode 100644 src/PartFile.h create mode 100644 src/PartFileConvert.cpp create mode 100644 src/PartFileConvert.h create mode 100644 src/Preferences.cpp create mode 100644 src/Preferences.h create mode 100644 src/PrefsUnifiedDlg.cpp create mode 100644 src/PrefsUnifiedDlg.h create mode 100644 src/Proxy.cpp create mode 100644 src/Proxy.h create mode 100644 src/RC4Encrypt.cpp create mode 100644 src/RC4Encrypt.h create mode 100644 src/RLE.cpp create mode 100644 src/RLE.h create mode 100644 src/RandomFunctions.cpp create mode 100644 src/RandomFunctions.h create mode 100644 src/RangeMap.h create mode 100644 src/SHA.cpp create mode 100644 src/SHA.h create mode 100644 src/SHAHashSet.cpp create mode 100644 src/SHAHashSet.h create mode 100644 src/SafeFile.cpp create mode 100644 src/SafeFile.h create mode 100644 src/Scanner.cpp create mode 100644 src/Scanner.h create mode 100644 src/Scanner.h.in create mode 100644 src/Scanner.l create mode 100644 src/ScopedPtr.h create mode 100644 src/SearchDlg.cpp create mode 100644 src/SearchDlg.h create mode 100644 src/SearchExpr.h create mode 100644 src/SearchFile.cpp create mode 100644 src/SearchFile.h create mode 100644 src/SearchList.cpp create mode 100644 src/SearchList.h create mode 100644 src/SearchListCtrl.cpp create mode 100644 src/SearchListCtrl.h create mode 100644 src/Server.cpp create mode 100644 src/Server.h create mode 100644 src/ServerConnect.cpp create mode 100644 src/ServerConnect.h create mode 100644 src/ServerList.cpp create mode 100644 src/ServerList.h create mode 100644 src/ServerListCtrl.cpp create mode 100644 src/ServerListCtrl.h create mode 100644 src/ServerSocket.cpp create mode 100644 src/ServerSocket.h create mode 100644 src/ServerUDPSocket.cpp create mode 100644 src/ServerUDPSocket.h create mode 100644 src/ServerWnd.cpp create mode 100644 src/ServerWnd.h create mode 100644 src/SharedFileList.cpp create mode 100644 src/SharedFileList.h create mode 100644 src/SharedFilesCtrl.cpp create mode 100644 src/SharedFilesCtrl.h create mode 100644 src/SharedFilesWnd.cpp create mode 100644 src/SharedFilesWnd.h create mode 100644 src/StatTree.cpp create mode 100644 src/StatTree.h create mode 100644 src/StateMachine.cpp create mode 100644 src/StateMachine.h create mode 100644 src/Statistics.cpp create mode 100644 src/Statistics.h create mode 100644 src/StatisticsDlg.cpp create mode 100644 src/StatisticsDlg.h create mode 100644 src/Tag.cpp create mode 100644 src/Tag.h create mode 100644 src/TerminationProcess.cpp create mode 100644 src/TerminationProcess.h create mode 100644 src/TerminationProcessAmuleweb.cpp create mode 100644 src/TerminationProcessAmuleweb.h create mode 100644 src/TextClient.cpp create mode 100644 src/TextClient.h create mode 100644 src/ThreadScheduler.cpp create mode 100644 src/ThreadScheduler.h create mode 100644 src/ThreadTasks.cpp create mode 100644 src/ThreadTasks.h create mode 100644 src/ThrottledSocket.h create mode 100644 src/Timer.cpp create mode 100644 src/Timer.h create mode 100644 src/TransferWnd.cpp create mode 100644 src/TransferWnd.h create mode 100644 src/Types.h create mode 100644 src/UPnP.cpp create mode 100644 src/UPnP.h create mode 100644 src/UPnPCompatibility.cpp create mode 100644 src/UPnPCompatibility.h create mode 100644 src/UploadBandwidthThrottler.cpp create mode 100644 src/UploadBandwidthThrottler.h create mode 100644 src/UploadClient.cpp create mode 100644 src/UploadQueue.cpp create mode 100644 src/UploadQueue.h create mode 100644 src/UserEvents.cpp create mode 100644 src/UserEvents.h create mode 100644 src/aMule.xpm create mode 100644 src/amule-gui.cpp create mode 100644 src/amule-remote-gui.cpp create mode 100644 src/amule-remote-gui.h create mode 100644 src/amule.cpp create mode 100644 src/amule.h create mode 100644 src/amuleDlg.cpp create mode 100644 src/amuleDlg.h create mode 100644 src/amuleIPV4Address.h create mode 100644 src/amuled.cpp create mode 100644 src/extern/upnp/ixml.h create mode 100644 src/extern/upnp/upnp.h create mode 100644 src/extern/wxWidgets/listctrl.cpp create mode 100644 src/extern/wxWidgets/listctrl.h create mode 100644 src/include/common/ClientVersion.h create mode 100644 src/include/common/Constants.h create mode 100644 src/include/common/DataFileVersion.h create mode 100644 src/include/common/EventIDs.h create mode 100644 src/include/common/Macros.h create mode 100644 src/include/common/MenuIDs.h create mode 100644 src/include/protocol/Protocols.h create mode 100644 src/include/protocol/ed2k/Client2Client/TCP.h create mode 100644 src/include/protocol/ed2k/Client2Client/UDP.h create mode 100644 src/include/protocol/ed2k/Client2Server/TCP.h create mode 100644 src/include/protocol/ed2k/Client2Server/UDP.h create mode 100644 src/include/protocol/ed2k/ClientSoftware.h create mode 100644 src/include/protocol/ed2k/Constants.h create mode 100644 src/include/protocol/kad/Client2Client/UDP.h create mode 100644 src/include/protocol/kad/Constants.h create mode 100644 src/include/protocol/kad2/Client2Client/UDP.h create mode 100644 src/include/protocol/kad2/Constants.h create mode 100644 src/include/tags/ClientTags.h create mode 100644 src/include/tags/FileTags.h create mode 100644 src/include/tags/ServerTags.h create mode 100644 src/include/tags/TagTypes.h create mode 100644 src/inetdownload.h create mode 100644 src/kademlia/Makefile.am create mode 100644 src/kademlia/Makefile.in create mode 100644 src/kademlia/kademlia/Defines.h create mode 100644 src/kademlia/kademlia/Entry.h create mode 100644 src/kademlia/kademlia/Error.h create mode 100644 src/kademlia/kademlia/Indexed.cpp create mode 100644 src/kademlia/kademlia/Indexed.h create mode 100644 src/kademlia/kademlia/Kademlia.cpp create mode 100644 src/kademlia/kademlia/Kademlia.h create mode 100644 src/kademlia/kademlia/Makefile.am create mode 100644 src/kademlia/kademlia/Makefile.in create mode 100644 src/kademlia/kademlia/Prefs.cpp create mode 100644 src/kademlia/kademlia/Prefs.h create mode 100644 src/kademlia/kademlia/Search.cpp create mode 100644 src/kademlia/kademlia/Search.h create mode 100644 src/kademlia/kademlia/SearchManager.cpp create mode 100644 src/kademlia/kademlia/SearchManager.h create mode 100644 src/kademlia/kademlia/Tag.h create mode 100644 src/kademlia/net/KademliaUDPListener.cpp create mode 100644 src/kademlia/net/KademliaUDPListener.h create mode 100644 src/kademlia/net/Makefile.am create mode 100644 src/kademlia/net/Makefile.in create mode 100644 src/kademlia/routing/Contact.cpp create mode 100644 src/kademlia/routing/Contact.h create mode 100644 src/kademlia/routing/Makefile.am create mode 100644 src/kademlia/routing/Makefile.in create mode 100644 src/kademlia/routing/Maps.h create mode 100644 src/kademlia/routing/RoutingBin.cpp create mode 100644 src/kademlia/routing/RoutingBin.h create mode 100644 src/kademlia/routing/RoutingZone.cpp create mode 100644 src/kademlia/routing/RoutingZone.h create mode 100644 src/kademlia/utils/LittleEndian.cpp create mode 100644 src/kademlia/utils/LittleEndian.h create mode 100644 src/kademlia/utils/Makefile.am create mode 100644 src/kademlia/utils/Makefile.in create mode 100644 src/kademlia/utils/UInt128.cpp create mode 100644 src/kademlia/utils/UInt128.h create mode 100644 src/libs/Makefile.am create mode 100644 src/libs/Makefile.in create mode 100644 src/libs/common/FileFunctions.cpp create mode 100644 src/libs/common/FileFunctions.h create mode 100644 src/libs/common/Format.cpp create mode 100644 src/libs/common/Format.h create mode 100644 src/libs/common/MD5Sum.cpp create mode 100644 src/libs/common/MD5Sum.h create mode 100644 src/libs/common/Makefile.am create mode 100644 src/libs/common/Makefile.in create mode 100644 src/libs/common/MuleDebug.cpp create mode 100644 src/libs/common/MuleDebug.h create mode 100644 src/libs/common/Path.cpp create mode 100644 src/libs/common/Path.h create mode 100644 src/libs/common/StringFunctions.cpp create mode 100644 src/libs/common/StringFunctions.h create mode 100644 src/libs/common/TextFile.cpp create mode 100644 src/libs/common/TextFile.h create mode 100644 src/libs/ec/Makefile.am create mode 100644 src/libs/ec/Makefile.in create mode 100644 src/libs/ec/abstracts/ECCodes.abstract create mode 100644 src/libs/ec/abstracts/ECTagTypes.abstract create mode 100644 src/libs/ec/abstracts/License.abstract create mode 100644 src/libs/ec/c#/ECCodes.cs create mode 100644 src/libs/ec/c#/ECTagTypes.cs create mode 100644 src/libs/ec/c#/amuleRemote.cs create mode 100644 src/libs/ec/c#/ecProto.cs create mode 100644 src/libs/ec/cpp/ECCodes.h create mode 100644 src/libs/ec/cpp/ECFileConfig.h create mode 100644 src/libs/ec/cpp/ECMuleSocket.cpp create mode 100644 src/libs/ec/cpp/ECMuleSocket.h create mode 100644 src/libs/ec/cpp/ECPacket.cpp create mode 100644 src/libs/ec/cpp/ECPacket.h create mode 100644 src/libs/ec/cpp/ECSocket.cpp create mode 100644 src/libs/ec/cpp/ECSocket.h create mode 100644 src/libs/ec/cpp/ECSpecialTags.cpp create mode 100644 src/libs/ec/cpp/ECSpecialTags.h create mode 100644 src/libs/ec/cpp/ECTag.cpp create mode 100644 src/libs/ec/cpp/ECTag.h create mode 100644 src/libs/ec/cpp/ECTagTypes.h create mode 100644 src/libs/ec/cpp/Makefile.am create mode 100644 src/libs/ec/cpp/Makefile.in create mode 100644 src/libs/ec/cpp/RemoteConnect.cpp create mode 100644 src/libs/ec/cpp/RemoteConnect.h create mode 100755 src/libs/ec/cpp/gen_ECVersion create mode 100755 src/libs/ec/file_generator.pl create mode 100644 src/libs/ec/java/ECCodes.java create mode 100644 src/libs/ec/java/ECTagTypes.java create mode 100644 src/muuli.wdr create mode 100644 src/muuli_wdr.cpp create mode 100644 src/muuli_wdr.h create mode 100644 src/pixmaps/Makefile.am create mode 100644 src/pixmaps/Makefile.in create mode 100644 src/pixmaps/chat.ico.xpm create mode 100644 src/pixmaps/flags_xpm/CountryFlags.h create mode 100644 src/pixmaps/flags_xpm/Makefile.am create mode 100644 src/pixmaps/flags_xpm/Makefile.in create mode 100644 src/pixmaps/flags_xpm/ad.xpm create mode 100644 src/pixmaps/flags_xpm/ae.xpm create mode 100644 src/pixmaps/flags_xpm/af.xpm create mode 100644 src/pixmaps/flags_xpm/ag.xpm create mode 100644 src/pixmaps/flags_xpm/ai.xpm create mode 100644 src/pixmaps/flags_xpm/al.xpm create mode 100644 src/pixmaps/flags_xpm/am.xpm create mode 100644 src/pixmaps/flags_xpm/an.xpm create mode 100644 src/pixmaps/flags_xpm/ao.xpm create mode 100644 src/pixmaps/flags_xpm/ar.xpm create mode 100644 src/pixmaps/flags_xpm/as.xpm create mode 100644 src/pixmaps/flags_xpm/at.xpm create mode 100644 src/pixmaps/flags_xpm/au.xpm create mode 100644 src/pixmaps/flags_xpm/aw.xpm create mode 100644 src/pixmaps/flags_xpm/ax.xpm create mode 100644 src/pixmaps/flags_xpm/az.xpm create mode 100644 src/pixmaps/flags_xpm/ba.xpm create mode 100644 src/pixmaps/flags_xpm/bb.xpm create mode 100644 src/pixmaps/flags_xpm/bd.xpm create mode 100644 src/pixmaps/flags_xpm/be.xpm create mode 100644 src/pixmaps/flags_xpm/bf.xpm create mode 100644 src/pixmaps/flags_xpm/bg.xpm create mode 100644 src/pixmaps/flags_xpm/bh.xpm create mode 100644 src/pixmaps/flags_xpm/bi.xpm create mode 100644 src/pixmaps/flags_xpm/bj.xpm create mode 100644 src/pixmaps/flags_xpm/bm.xpm create mode 100644 src/pixmaps/flags_xpm/bn.xpm create mode 100644 src/pixmaps/flags_xpm/bo.xpm create mode 100644 src/pixmaps/flags_xpm/br.xpm create mode 100644 src/pixmaps/flags_xpm/bs.xpm create mode 100644 src/pixmaps/flags_xpm/bt.xpm create mode 100644 src/pixmaps/flags_xpm/bv.xpm create mode 100644 src/pixmaps/flags_xpm/bw.xpm create mode 100644 src/pixmaps/flags_xpm/by.xpm create mode 100644 src/pixmaps/flags_xpm/bz.xpm create mode 100644 src/pixmaps/flags_xpm/ca.xpm create mode 100644 src/pixmaps/flags_xpm/catalonia.xpm create mode 100644 src/pixmaps/flags_xpm/cc.xpm create mode 100644 src/pixmaps/flags_xpm/cd.xpm create mode 100644 src/pixmaps/flags_xpm/cf.xpm create mode 100644 src/pixmaps/flags_xpm/cg.xpm create mode 100644 src/pixmaps/flags_xpm/ch.xpm create mode 100644 src/pixmaps/flags_xpm/ci.xpm create mode 100644 src/pixmaps/flags_xpm/ck.xpm create mode 100644 src/pixmaps/flags_xpm/cl.xpm create mode 100644 src/pixmaps/flags_xpm/cm.xpm create mode 100644 src/pixmaps/flags_xpm/cn.xpm create mode 100644 src/pixmaps/flags_xpm/co.xpm create mode 100644 src/pixmaps/flags_xpm/cr.xpm create mode 100644 src/pixmaps/flags_xpm/cs.xpm create mode 100644 src/pixmaps/flags_xpm/cu.xpm create mode 100644 src/pixmaps/flags_xpm/cv.xpm create mode 100644 src/pixmaps/flags_xpm/cx.xpm create mode 100644 src/pixmaps/flags_xpm/cy.xpm create mode 100644 src/pixmaps/flags_xpm/cz.xpm create mode 100644 src/pixmaps/flags_xpm/de.xpm create mode 100644 src/pixmaps/flags_xpm/dj.xpm create mode 100644 src/pixmaps/flags_xpm/dk.xpm create mode 100644 src/pixmaps/flags_xpm/dm.xpm create mode 100644 src/pixmaps/flags_xpm/do.xpm create mode 100644 src/pixmaps/flags_xpm/dz.xpm create mode 100644 src/pixmaps/flags_xpm/ec.xpm create mode 100644 src/pixmaps/flags_xpm/ee.xpm create mode 100644 src/pixmaps/flags_xpm/eg.xpm create mode 100644 src/pixmaps/flags_xpm/eh.xpm create mode 100644 src/pixmaps/flags_xpm/england.xpm create mode 100644 src/pixmaps/flags_xpm/er.xpm create mode 100644 src/pixmaps/flags_xpm/es.xpm create mode 100644 src/pixmaps/flags_xpm/et.xpm create mode 100644 src/pixmaps/flags_xpm/europeanunion.xpm create mode 100644 src/pixmaps/flags_xpm/fam.xpm create mode 100644 src/pixmaps/flags_xpm/fi.xpm create mode 100644 src/pixmaps/flags_xpm/fj.xpm create mode 100644 src/pixmaps/flags_xpm/fk.xpm create mode 100644 src/pixmaps/flags_xpm/fm.xpm create mode 100644 src/pixmaps/flags_xpm/fo.xpm create mode 100644 src/pixmaps/flags_xpm/fr.xpm create mode 100644 src/pixmaps/flags_xpm/ga.xpm create mode 100644 src/pixmaps/flags_xpm/gb.xpm create mode 100644 src/pixmaps/flags_xpm/gd.xpm create mode 100644 src/pixmaps/flags_xpm/ge.xpm create mode 100644 src/pixmaps/flags_xpm/gf.xpm create mode 100644 src/pixmaps/flags_xpm/gh.xpm create mode 100644 src/pixmaps/flags_xpm/gi.xpm create mode 100644 src/pixmaps/flags_xpm/gl.xpm create mode 100644 src/pixmaps/flags_xpm/gm.xpm create mode 100644 src/pixmaps/flags_xpm/gn.xpm create mode 100644 src/pixmaps/flags_xpm/gp.xpm create mode 100644 src/pixmaps/flags_xpm/gq.xpm create mode 100644 src/pixmaps/flags_xpm/gr.xpm create mode 100644 src/pixmaps/flags_xpm/gs.xpm create mode 100644 src/pixmaps/flags_xpm/gt.xpm create mode 100644 src/pixmaps/flags_xpm/gu.xpm create mode 100644 src/pixmaps/flags_xpm/gw.xpm create mode 100644 src/pixmaps/flags_xpm/gy.xpm create mode 100644 src/pixmaps/flags_xpm/hk.xpm create mode 100644 src/pixmaps/flags_xpm/hm.xpm create mode 100644 src/pixmaps/flags_xpm/hn.xpm create mode 100644 src/pixmaps/flags_xpm/hr.xpm create mode 100644 src/pixmaps/flags_xpm/ht.xpm create mode 100644 src/pixmaps/flags_xpm/hu.xpm create mode 100644 src/pixmaps/flags_xpm/id.xpm create mode 100644 src/pixmaps/flags_xpm/ie.xpm create mode 100644 src/pixmaps/flags_xpm/il.xpm create mode 100644 src/pixmaps/flags_xpm/in.xpm create mode 100644 src/pixmaps/flags_xpm/io.xpm create mode 100644 src/pixmaps/flags_xpm/iq.xpm create mode 100644 src/pixmaps/flags_xpm/ir.xpm create mode 100644 src/pixmaps/flags_xpm/is.xpm create mode 100644 src/pixmaps/flags_xpm/it.xpm create mode 100644 src/pixmaps/flags_xpm/jm.xpm create mode 100644 src/pixmaps/flags_xpm/jo.xpm create mode 100644 src/pixmaps/flags_xpm/jp.xpm create mode 100644 src/pixmaps/flags_xpm/ke.xpm create mode 100644 src/pixmaps/flags_xpm/kg.xpm create mode 100644 src/pixmaps/flags_xpm/kh.xpm create mode 100644 src/pixmaps/flags_xpm/ki.xpm create mode 100644 src/pixmaps/flags_xpm/km.xpm create mode 100644 src/pixmaps/flags_xpm/kn.xpm create mode 100644 src/pixmaps/flags_xpm/kp.xpm create mode 100644 src/pixmaps/flags_xpm/kr.xpm create mode 100644 src/pixmaps/flags_xpm/kw.xpm create mode 100644 src/pixmaps/flags_xpm/ky.xpm create mode 100644 src/pixmaps/flags_xpm/kz.xpm create mode 100644 src/pixmaps/flags_xpm/la.xpm create mode 100644 src/pixmaps/flags_xpm/lb.xpm create mode 100644 src/pixmaps/flags_xpm/lc.xpm create mode 100644 src/pixmaps/flags_xpm/li.xpm create mode 100644 src/pixmaps/flags_xpm/lk.xpm create mode 100644 src/pixmaps/flags_xpm/lr.xpm create mode 100644 src/pixmaps/flags_xpm/ls.xpm create mode 100644 src/pixmaps/flags_xpm/lt.xpm create mode 100644 src/pixmaps/flags_xpm/lu.xpm create mode 100644 src/pixmaps/flags_xpm/lv.xpm create mode 100644 src/pixmaps/flags_xpm/ly.xpm create mode 100644 src/pixmaps/flags_xpm/ma.xpm create mode 100755 src/pixmaps/flags_xpm/makeflags.sh create mode 100644 src/pixmaps/flags_xpm/mc.xpm create mode 100644 src/pixmaps/flags_xpm/md.xpm create mode 100644 src/pixmaps/flags_xpm/me.xpm create mode 100644 src/pixmaps/flags_xpm/mg.xpm create mode 100644 src/pixmaps/flags_xpm/mh.xpm create mode 100644 src/pixmaps/flags_xpm/mk.xpm create mode 100644 src/pixmaps/flags_xpm/ml.xpm create mode 100644 src/pixmaps/flags_xpm/mm.xpm create mode 100644 src/pixmaps/flags_xpm/mn.xpm create mode 100644 src/pixmaps/flags_xpm/mo.xpm create mode 100644 src/pixmaps/flags_xpm/mp.xpm create mode 100644 src/pixmaps/flags_xpm/mq.xpm create mode 100644 src/pixmaps/flags_xpm/mr.xpm create mode 100644 src/pixmaps/flags_xpm/ms.xpm create mode 100644 src/pixmaps/flags_xpm/mt.xpm create mode 100644 src/pixmaps/flags_xpm/mu.xpm create mode 100644 src/pixmaps/flags_xpm/mv.xpm create mode 100644 src/pixmaps/flags_xpm/mw.xpm create mode 100644 src/pixmaps/flags_xpm/mx.xpm create mode 100644 src/pixmaps/flags_xpm/my.xpm create mode 100644 src/pixmaps/flags_xpm/mz.xpm create mode 100644 src/pixmaps/flags_xpm/na.xpm create mode 100644 src/pixmaps/flags_xpm/nc.xpm create mode 100644 src/pixmaps/flags_xpm/ne.xpm create mode 100644 src/pixmaps/flags_xpm/nf.xpm create mode 100644 src/pixmaps/flags_xpm/ng.xpm create mode 100644 src/pixmaps/flags_xpm/ni.xpm create mode 100644 src/pixmaps/flags_xpm/nl.xpm create mode 100644 src/pixmaps/flags_xpm/no.xpm create mode 100644 src/pixmaps/flags_xpm/np.xpm create mode 100644 src/pixmaps/flags_xpm/nr.xpm create mode 100644 src/pixmaps/flags_xpm/nu.xpm create mode 100644 src/pixmaps/flags_xpm/nz.xpm create mode 100644 src/pixmaps/flags_xpm/om.xpm create mode 100644 src/pixmaps/flags_xpm/pa.xpm create mode 100644 src/pixmaps/flags_xpm/pe.xpm create mode 100644 src/pixmaps/flags_xpm/pf.xpm create mode 100644 src/pixmaps/flags_xpm/pg.xpm create mode 100644 src/pixmaps/flags_xpm/ph.xpm create mode 100644 src/pixmaps/flags_xpm/pk.xpm create mode 100644 src/pixmaps/flags_xpm/pl.xpm create mode 100644 src/pixmaps/flags_xpm/pm.xpm create mode 100644 src/pixmaps/flags_xpm/pn.xpm create mode 100644 src/pixmaps/flags_xpm/pr.xpm create mode 100644 src/pixmaps/flags_xpm/ps.xpm create mode 100644 src/pixmaps/flags_xpm/pt.xpm create mode 100644 src/pixmaps/flags_xpm/pw.xpm create mode 100644 src/pixmaps/flags_xpm/py.xpm create mode 100644 src/pixmaps/flags_xpm/qa.xpm create mode 100644 src/pixmaps/flags_xpm/re.xpm create mode 100644 src/pixmaps/flags_xpm/ro.xpm create mode 100644 src/pixmaps/flags_xpm/rs.xpm create mode 100644 src/pixmaps/flags_xpm/ru.xpm create mode 100644 src/pixmaps/flags_xpm/rw.xpm create mode 100644 src/pixmaps/flags_xpm/sa.xpm create mode 100644 src/pixmaps/flags_xpm/sb.xpm create mode 100644 src/pixmaps/flags_xpm/sc.xpm create mode 100644 src/pixmaps/flags_xpm/scotland.xpm create mode 100644 src/pixmaps/flags_xpm/sd.xpm create mode 100644 src/pixmaps/flags_xpm/se.xpm create mode 100644 src/pixmaps/flags_xpm/sg.xpm create mode 100644 src/pixmaps/flags_xpm/sh.xpm create mode 100644 src/pixmaps/flags_xpm/si.xpm create mode 100644 src/pixmaps/flags_xpm/sj.xpm create mode 100644 src/pixmaps/flags_xpm/sk.xpm create mode 100644 src/pixmaps/flags_xpm/sl.xpm create mode 100644 src/pixmaps/flags_xpm/sm.xpm create mode 100644 src/pixmaps/flags_xpm/sn.xpm create mode 100644 src/pixmaps/flags_xpm/so.xpm create mode 100644 src/pixmaps/flags_xpm/sr.xpm create mode 100644 src/pixmaps/flags_xpm/st.xpm create mode 100644 src/pixmaps/flags_xpm/sv.xpm create mode 100644 src/pixmaps/flags_xpm/sy.xpm create mode 100644 src/pixmaps/flags_xpm/sz.xpm create mode 100644 src/pixmaps/flags_xpm/tc.xpm create mode 100644 src/pixmaps/flags_xpm/td.xpm create mode 100644 src/pixmaps/flags_xpm/tf.xpm create mode 100644 src/pixmaps/flags_xpm/tg.xpm create mode 100644 src/pixmaps/flags_xpm/th.xpm create mode 100644 src/pixmaps/flags_xpm/tj.xpm create mode 100644 src/pixmaps/flags_xpm/tk.xpm create mode 100644 src/pixmaps/flags_xpm/tl.xpm create mode 100644 src/pixmaps/flags_xpm/tm.xpm create mode 100644 src/pixmaps/flags_xpm/tn.xpm create mode 100644 src/pixmaps/flags_xpm/to.xpm create mode 100644 src/pixmaps/flags_xpm/tr.xpm create mode 100644 src/pixmaps/flags_xpm/tt.xpm create mode 100644 src/pixmaps/flags_xpm/tv.xpm create mode 100644 src/pixmaps/flags_xpm/tw.xpm create mode 100644 src/pixmaps/flags_xpm/tz.xpm create mode 100644 src/pixmaps/flags_xpm/ua.xpm create mode 100644 src/pixmaps/flags_xpm/ug.xpm create mode 100644 src/pixmaps/flags_xpm/um.xpm create mode 100644 src/pixmaps/flags_xpm/unknown.xpm create mode 100644 src/pixmaps/flags_xpm/us.xpm create mode 100644 src/pixmaps/flags_xpm/uy.xpm create mode 100644 src/pixmaps/flags_xpm/uz.xpm create mode 100644 src/pixmaps/flags_xpm/va.xpm create mode 100644 src/pixmaps/flags_xpm/vc.xpm create mode 100644 src/pixmaps/flags_xpm/ve.xpm create mode 100644 src/pixmaps/flags_xpm/vg.xpm create mode 100644 src/pixmaps/flags_xpm/vi.xpm create mode 100644 src/pixmaps/flags_xpm/vn.xpm create mode 100644 src/pixmaps/flags_xpm/vu.xpm create mode 100644 src/pixmaps/flags_xpm/wales.xpm create mode 100644 src/pixmaps/flags_xpm/wf.xpm create mode 100644 src/pixmaps/flags_xpm/ws.xpm create mode 100644 src/pixmaps/flags_xpm/ye.xpm create mode 100644 src/pixmaps/flags_xpm/yt.xpm create mode 100644 src/pixmaps/flags_xpm/za.xpm create mode 100644 src/pixmaps/flags_xpm/zm.xpm create mode 100644 src/pixmaps/flags_xpm/zw.xpm create mode 100644 src/pixmaps/mule_Tr_grey.ico.xpm create mode 100644 src/pixmaps/mule_Tr_grey_big.ico.xpm create mode 100644 src/pixmaps/mule_Tr_yellow.ico.xpm create mode 100644 src/pixmaps/mule_Tr_yellow_big.ico.xpm create mode 100644 src/pixmaps/mule_TrayIcon.ico.xpm create mode 100644 src/pixmaps/mule_TrayIcon_big.ico.xpm create mode 100644 src/pixmaps/sort_dn.xpm create mode 100644 src/pixmaps/sort_dnx2.xpm create mode 100644 src/pixmaps/sort_up.xpm create mode 100644 src/pixmaps/sort_upx2.xpm create mode 100755 src/remote-gui.net/AboutBox.Designer.cs create mode 100755 src/remote-gui.net/AboutBox.cs create mode 100755 src/remote-gui.net/AboutBox.resx create mode 100644 src/remote-gui.net/AddLinkDialog.Designer.cs create mode 100644 src/remote-gui.net/AddLinkDialog.cs create mode 100644 src/remote-gui.net/AddLinkDialog.resx create mode 100644 src/remote-gui.net/ConnectDlg.Designer.cs create mode 100644 src/remote-gui.net/ConnectDlg.cs create mode 100644 src/remote-gui.net/ConnectDlg.resx create mode 100755 src/remote-gui.net/DownloadControl.cs create mode 120000 src/remote-gui.net/ECCodes.cs create mode 120000 src/remote-gui.net/ECTagTypes.cs create mode 100644 src/remote-gui.net/MainWindow.Designer.cs create mode 100644 src/remote-gui.net/MainWindow.cs create mode 100644 src/remote-gui.net/MainWindow.resx create mode 100644 src/remote-gui.net/Program.cs create mode 100755 src/remote-gui.net/Properties/AssemblyInfo.cs create mode 100755 src/remote-gui.net/Properties/Resources.Designer.cs create mode 100755 src/remote-gui.net/Properties/Resources.resx create mode 100755 src/remote-gui.net/Properties/Settings.Designer.cs create mode 100755 src/remote-gui.net/Properties/Settings.settings create mode 100755 src/remote-gui.net/SearchControl.Designer.cs create mode 100755 src/remote-gui.net/SearchControl.cs create mode 100755 src/remote-gui.net/SearchControl.resx create mode 100755 src/remote-gui.net/amuleData.cs create mode 120000 src/remote-gui.net/amuleRemote.cs create mode 120000 src/remote-gui.net/ecProto.cs create mode 100644 src/remote-gui.net/images/Toolbar_About.png create mode 100755 src/remote-gui.net/images/Toolbar_Disconnect.png create mode 100755 src/remote-gui.net/images/Toolbar_Import.png create mode 100755 src/remote-gui.net/images/Toolbar_Network.png create mode 100755 src/remote-gui.net/images/Toolbar_Prefs.png create mode 100755 src/remote-gui.net/images/Toolbar_Search.png create mode 100755 src/remote-gui.net/images/Toolbar_Shared.png create mode 100755 src/remote-gui.net/images/Toolbar_Stats.png create mode 100755 src/remote-gui.net/images/Toolbar_Transfers.png create mode 100755 src/remote-gui.net/remote-gui.net.csproj create mode 100755 src/remote-gui.net/remote-gui.net.sln create mode 100644 src/skins/Makefile.am create mode 100644 src/skins/Makefile.in create mode 100644 src/skins/gnome.zip create mode 100644 src/skins/kde4.zip create mode 100644 src/skins/tango.zip create mode 100644 src/skins/xfce.zip create mode 100644 src/updownclient.h create mode 100644 src/utils/Makefile.am create mode 100644 src/utils/Makefile.in create mode 100644 src/utils/aLinkCreator/Makefile.am create mode 100644 src/utils/aLinkCreator/Makefile.in create mode 100644 src/utils/aLinkCreator/alc.desktop create mode 100644 src/utils/aLinkCreator/alc.ico create mode 100644 src/utils/aLinkCreator/alc.rc create mode 100644 src/utils/aLinkCreator/alc.xpm create mode 100644 src/utils/aLinkCreator/docs/Makefile.am create mode 100644 src/utils/aLinkCreator/docs/Makefile.in create mode 100644 src/utils/aLinkCreator/docs/alc.1 create mode 100644 src/utils/aLinkCreator/docs/alc.de.1 create mode 100644 src/utils/aLinkCreator/docs/alc.es.1 create mode 100644 src/utils/aLinkCreator/docs/alc.eu.1 create mode 100644 src/utils/aLinkCreator/docs/alc.hu.1 create mode 100644 src/utils/aLinkCreator/docs/alcc.1 create mode 100644 src/utils/aLinkCreator/docs/alcc.de.1 create mode 100644 src/utils/aLinkCreator/docs/alcc.es.1 create mode 100644 src/utils/aLinkCreator/docs/alcc.eu.1 create mode 100644 src/utils/aLinkCreator/docs/alcc.fr.1 create mode 100644 src/utils/aLinkCreator/docs/alcc.hu.1 create mode 100644 src/utils/aLinkCreator/src/Makefile.am create mode 100644 src/utils/aLinkCreator/src/Makefile.in create mode 100644 src/utils/aLinkCreator/src/alc.cpp create mode 100644 src/utils/aLinkCreator/src/alc.h create mode 100644 src/utils/aLinkCreator/src/alcc.cpp create mode 100644 src/utils/aLinkCreator/src/alcc.h create mode 100644 src/utils/aLinkCreator/src/alcframe.cpp create mode 100644 src/utils/aLinkCreator/src/alcframe.h create mode 100644 src/utils/aLinkCreator/src/alcpix.cpp create mode 100644 src/utils/aLinkCreator/src/alcpix.h create mode 100644 src/utils/aLinkCreator/src/bithelp.h create mode 100644 src/utils/aLinkCreator/src/ed2khash.cpp create mode 100644 src/utils/aLinkCreator/src/ed2khash.h create mode 100644 src/utils/aLinkCreator/src/md4.cpp create mode 100644 src/utils/aLinkCreator/src/md4.h create mode 100644 src/utils/amps/CHANGELOG create mode 100644 src/utils/amps/COPYING create mode 100644 src/utils/amps/README create mode 100644 src/utils/amps/SETTINGS create mode 100644 src/utils/amps/TODO create mode 100644 src/utils/amps/images/baseimage.png create mode 100644 src/utils/amps/images/baseimage.xcf.bz2 create mode 100644 src/utils/amps/images/baseimage_old.png create mode 100644 src/utils/amps/images/clock.png create mode 100644 src/utils/amps/images/conn_highid_kad_fw.png create mode 100644 src/utils/amps/images/conn_highid_kad_off.png create mode 100644 src/utils/amps/images/conn_highid_kad_on.png create mode 100644 src/utils/amps/images/conn_lowid_kad_fw.png create mode 100644 src/utils/amps/images/conn_lowid_kad_off.png create mode 100644 src/utils/amps/images/conn_lowid_kad_on.png create mode 100644 src/utils/amps/images/files.png create mode 100644 src/utils/amps/images/noconn_kad_fw.png create mode 100644 src/utils/amps/images/noconn_kad_off.png create mode 100644 src/utils/amps/images/noconn_kad_on.png create mode 100644 src/utils/amps/images/queue.png create mode 100644 src/utils/amps/images/running.png create mode 100644 src/utils/amps/images/rx0tx0.png create mode 100644 src/utils/amps/images/rx0tx1.png create mode 100644 src/utils/amps/images/rx1tx0.png create mode 100644 src/utils/amps/images/rx1tx1.png create mode 100644 src/utils/amps/images/serverbox.png create mode 100644 src/utils/amps/index.php create mode 100644 src/utils/amps/langs/ca.inc create mode 100644 src/utils/amps/langs/de.inc create mode 100644 src/utils/amps/langs/en.inc create mode 100644 src/utils/amps/langs/es.inc create mode 100644 src/utils/amps/langs/eu.inc create mode 100644 src/utils/amps/langs/fi.inc create mode 100644 src/utils/amps/langs/fr.inc create mode 100644 src/utils/amps/langs/hu.inc create mode 100644 src/utils/amps/langs/it.inc create mode 100644 src/utils/amps/langs/nl.inc create mode 100644 src/utils/amps/langs/pl.inc create mode 100644 src/utils/amps/langs/pt.inc create mode 100644 src/utils/amps/langs/pt_BR.inc create mode 100644 src/utils/amps/style.css create mode 100644 src/utils/cas/Makefile.am create mode 100644 src/utils/cas/Makefile.in create mode 100644 src/utils/cas/README create mode 100644 src/utils/cas/cas.c create mode 100644 src/utils/cas/configfile.c create mode 100644 src/utils/cas/configfile.h create mode 100644 src/utils/cas/docs/Makefile.am create mode 100644 src/utils/cas/docs/Makefile.in create mode 100644 src/utils/cas/docs/cas.1 create mode 100644 src/utils/cas/docs/cas.de.1 create mode 100644 src/utils/cas/docs/cas.es.1 create mode 100644 src/utils/cas/docs/cas.eu.1 create mode 100644 src/utils/cas/docs/cas.hu.1 create mode 100644 src/utils/cas/functions.c create mode 100644 src/utils/cas/functions.h create mode 100644 src/utils/cas/graphics.c create mode 100644 src/utils/cas/graphics.h create mode 100644 src/utils/cas/html.c create mode 100644 src/utils/cas/html.h create mode 100644 src/utils/cas/lines.c create mode 100644 src/utils/cas/lines.h create mode 100644 src/utils/cas/stat.png create mode 100644 src/utils/cas/tmp.html create mode 100644 src/utils/cas/version.h create mode 100644 src/utils/mkFileSum.c create mode 100644 src/utils/scripts/denoiser.rules create mode 100755 src/utils/scripts/id2ip create mode 100755 src/utils/scripts/kadnodescreate.pl create mode 100755 src/utils/scripts/linkcvs create mode 100755 src/utils/scripts/logfilter create mode 100755 src/utils/scripts/mac_packager create mode 100755 src/utils/scripts/make_store create mode 100755 src/utils/scripts/mldonkey_importer.pl create mode 100755 src/utils/scripts/sanity create mode 100755 src/utils/scripts/stats.pl create mode 100755 src/utils/scripts/translate-manpages create mode 100755 src/utils/scripts/version_bumper create mode 100755 src/utils/scripts/wikify_latest_changelog create mode 100644 src/utils/wxCas/Makefile.am create mode 100644 src/utils/wxCas/Makefile.in create mode 100644 src/utils/wxCas/docs/Makefile.am create mode 100644 src/utils/wxCas/docs/Makefile.in create mode 100644 src/utils/wxCas/docs/wxcas.1 create mode 100644 src/utils/wxCas/docs/wxcas.de.1 create mode 100644 src/utils/wxCas/docs/wxcas.es.1 create mode 100644 src/utils/wxCas/docs/wxcas.eu.1 create mode 100644 src/utils/wxCas/docs/wxcas.hu.1 create mode 100644 src/utils/wxCas/src/Makefile.am create mode 100644 src/utils/wxCas/src/Makefile.in create mode 100644 src/utils/wxCas/src/linuxmon.cpp create mode 100644 src/utils/wxCas/src/linuxmon.h create mode 100644 src/utils/wxCas/src/onlinesig.cpp create mode 100644 src/utils/wxCas/src/onlinesig.h create mode 100644 src/utils/wxCas/src/wxcas.cpp create mode 100644 src/utils/wxCas/src/wxcas.h create mode 100644 src/utils/wxCas/src/wxcascte.cpp create mode 100644 src/utils/wxCas/src/wxcascte.h create mode 100644 src/utils/wxCas/src/wxcasframe.cpp create mode 100644 src/utils/wxCas/src/wxcasframe.h create mode 100644 src/utils/wxCas/src/wxcaspix.cpp create mode 100644 src/utils/wxCas/src/wxcaspix.h create mode 100644 src/utils/wxCas/src/wxcasprefs.cpp create mode 100644 src/utils/wxCas/src/wxcasprefs.h create mode 100644 src/utils/wxCas/src/wxcasprint.cpp create mode 100644 src/utils/wxCas/src/wxcasprint.h create mode 100644 src/utils/wxCas/wxcas.desktop create mode 100644 src/utils/wxCas/wxcas.ico create mode 100644 src/utils/wxCas/wxcas.rc create mode 100644 src/utils/wxCas/wxcas.xpm create mode 100644 src/utils/xas/Makefile.am create mode 100644 src/utils/xas/Makefile.in create mode 100644 src/utils/xas/autostart-xas.in create mode 100644 src/utils/xas/docs/Makefile.am create mode 100644 src/utils/xas/docs/Makefile.in create mode 100644 src/utils/xas/docs/xas.1 create mode 100644 src/utils/xas/docs/xas.de.1 create mode 100644 src/utils/xas/docs/xas.es.1 create mode 100644 src/utils/xas/docs/xas.eu.1 create mode 100644 src/utils/xas/docs/xas.hu.1 create mode 100644 src/utils/xas/xas.pl create mode 100644 src/webserver/Makefile.am create mode 100644 src/webserver/Makefile.in create mode 100644 src/webserver/chicane/Makefile.am create mode 100644 src/webserver/chicane/Makefile.in create mode 100644 src/webserver/chicane/aMule.tmpl create mode 100644 src/webserver/chicane/add_server.gif create mode 100644 src/webserver/chicane/arrow_down.gif create mode 100644 src/webserver/chicane/arrow_down_logout.gif create mode 100644 src/webserver/chicane/arrow_right.gif create mode 100644 src/webserver/chicane/arrow_up.gif create mode 100644 src/webserver/chicane/back.gif create mode 100644 src/webserver/chicane/black.gif create mode 100644 src/webserver/chicane/blank1x1.gif create mode 100644 src/webserver/chicane/blue1.gif create mode 100644 src/webserver/chicane/blue2.gif create mode 100644 src/webserver/chicane/blue3.gif create mode 100644 src/webserver/chicane/blue4.gif create mode 100644 src/webserver/chicane/blue5.gif create mode 100644 src/webserver/chicane/blue6.gif create mode 100644 src/webserver/chicane/cp_download.gif create mode 100644 src/webserver/chicane/cp_kad.gif create mode 100644 src/webserver/chicane/cp_search.gif create mode 100644 src/webserver/chicane/cp_servers.gif create mode 100644 src/webserver/chicane/cp_settings.gif create mode 100644 src/webserver/chicane/cp_shared.gif create mode 100644 src/webserver/chicane/cp_stats.gif create mode 100644 src/webserver/chicane/downloads.php create mode 100644 src/webserver/chicane/emule.gif create mode 100644 src/webserver/chicane/favicon.ico create mode 100644 src/webserver/chicane/green.gif create mode 100644 src/webserver/chicane/greenpercent.gif create mode 100644 src/webserver/chicane/index.php create mode 100644 src/webserver/chicane/l_cancel.gif create mode 100644 src/webserver/chicane/l_connect.gif create mode 100644 src/webserver/chicane/l_down.gif create mode 100644 src/webserver/chicane/l_ed2klink.gif create mode 100644 src/webserver/chicane/l_info.gif create mode 100644 src/webserver/chicane/l_pause.gif create mode 100644 src/webserver/chicane/l_resume.gif create mode 100644 src/webserver/chicane/l_up.gif create mode 100644 src/webserver/chicane/log.gif create mode 100644 src/webserver/chicane/login.php create mode 100644 src/webserver/chicane/login_bottom.gif create mode 100644 src/webserver/chicane/login_downmain.gif create mode 100644 src/webserver/chicane/login_lefttop.gif create mode 100644 src/webserver/chicane/login_righttop.gif create mode 100644 src/webserver/chicane/login_top.gif create mode 100644 src/webserver/chicane/login_topdown.gif create mode 100644 src/webserver/chicane/login_topseperator.gif create mode 100644 src/webserver/chicane/logo.jpg create mode 100644 src/webserver/chicane/main_bg.gif create mode 100644 src/webserver/chicane/main_top_bg.gif create mode 100644 src/webserver/chicane/main_topbar.gif create mode 100644 src/webserver/chicane/main_topbardarker.gif create mode 100644 src/webserver/chicane/main_topbarseperator.gif create mode 100644 src/webserver/chicane/phpamule.png create mode 100644 src/webserver/chicane/preferences.php create mode 100644 src/webserver/chicane/red.gif create mode 100644 src/webserver/chicane/search.php create mode 100644 src/webserver/chicane/servers.php create mode 100644 src/webserver/chicane/shared.php create mode 100644 src/webserver/chicane/stat_graphs.php create mode 100644 src/webserver/chicane/stat_tree.php create mode 100644 src/webserver/chicane/transparent.gif create mode 100644 src/webserver/chicane/tree-closed.gif create mode 100644 src/webserver/chicane/tree-leaf.gif create mode 100644 src/webserver/chicane/tree-open.gif create mode 100644 src/webserver/chicane/yellow.gif create mode 100644 src/webserver/default/Makefile.am create mode 100644 src/webserver/default/Makefile.in create mode 100644 src/webserver/default/aMule.tmpl create mode 100644 src/webserver/default/add_server.gif create mode 100644 src/webserver/default/arrow_down.gif create mode 100644 src/webserver/default/arrow_right.gif create mode 100644 src/webserver/default/arrow_up.gif create mode 100644 src/webserver/default/back.gif create mode 100644 src/webserver/default/black.gif create mode 100644 src/webserver/default/blue1.gif create mode 100644 src/webserver/default/blue2.gif create mode 100644 src/webserver/default/blue3.gif create mode 100644 src/webserver/default/blue4.gif create mode 100644 src/webserver/default/blue5.gif create mode 100644 src/webserver/default/blue6.gif create mode 100644 src/webserver/default/cp_download.gif create mode 100644 src/webserver/default/cp_kad.gif create mode 100644 src/webserver/default/cp_search.gif create mode 100644 src/webserver/default/cp_servers.gif create mode 100644 src/webserver/default/cp_settings.gif create mode 100644 src/webserver/default/cp_shared.gif create mode 100644 src/webserver/default/cp_stats.gif create mode 100644 src/webserver/default/downloads.php create mode 100644 src/webserver/default/emule.gif create mode 100644 src/webserver/default/favicon.ico create mode 100644 src/webserver/default/green.gif create mode 100644 src/webserver/default/greenpercent.gif create mode 100644 src/webserver/default/index.php create mode 100644 src/webserver/default/l_cancel.gif create mode 100644 src/webserver/default/l_connect.gif create mode 100644 src/webserver/default/l_down.gif create mode 100644 src/webserver/default/l_ed2klink.gif create mode 100644 src/webserver/default/l_info.gif create mode 100644 src/webserver/default/l_pause.gif create mode 100644 src/webserver/default/l_resume.gif create mode 100644 src/webserver/default/l_up.gif create mode 100644 src/webserver/default/log.gif create mode 100644 src/webserver/default/login.php create mode 100644 src/webserver/default/logo.jpg create mode 100644 src/webserver/default/phpamule.png create mode 100644 src/webserver/default/preferences.php create mode 100644 src/webserver/default/red.gif create mode 100644 src/webserver/default/search.php create mode 100644 src/webserver/default/servers.php create mode 100644 src/webserver/default/shared.php create mode 100644 src/webserver/default/stat_graphs.php create mode 100644 src/webserver/default/stat_tree.php create mode 100644 src/webserver/default/transparent.gif create mode 100644 src/webserver/default/tree-closed.gif create mode 100644 src/webserver/default/tree-leaf.gif create mode 100644 src/webserver/default/tree-open.gif create mode 100644 src/webserver/default/yellow.gif create mode 100644 src/webserver/php-default/Makefile.am create mode 100644 src/webserver/php-default/Makefile.in create mode 100644 src/webserver/php-default/amuleweb-main-dload.php create mode 100755 src/webserver/php-default/amuleweb-main-kad.php create mode 100755 src/webserver/php-default/amuleweb-main-prefs.php create mode 100755 src/webserver/php-default/amuleweb-main-search.php create mode 100755 src/webserver/php-default/amuleweb-main-servers.php create mode 100755 src/webserver/php-default/amuleweb-main-shared.php create mode 100755 src/webserver/php-default/amuleweb-main-stats.php create mode 100644 src/webserver/php-default/apply.jpeg create mode 100644 src/webserver/php-default/arrow-r.png create mode 100644 src/webserver/php-default/cancel.gif create mode 100644 src/webserver/php-default/connect.gif create mode 100644 src/webserver/php-default/delete.jpeg create mode 100644 src/webserver/php-default/down.jpeg create mode 100644 src/webserver/php-default/favicon.ico create mode 100755 src/webserver/php-default/footer.php create mode 100644 src/webserver/php-default/index.html create mode 100644 src/webserver/php-default/login.php create mode 100644 src/webserver/php-default/pause.jpeg create mode 100644 src/webserver/php-default/phpamule.png create mode 100644 src/webserver/php-default/resume.jpeg create mode 100755 src/webserver/php-default/stats.php create mode 100644 src/webserver/php-default/stats_tree.php create mode 100644 src/webserver/php-default/toolbutton-connect.jpeg create mode 100644 src/webserver/php-default/toolbutton-download-pressed.jpeg create mode 100644 src/webserver/php-default/toolbutton-download.jpeg create mode 100644 src/webserver/php-default/toolbutton-filter.jpeg create mode 100644 src/webserver/php-default/toolbutton-kad-pressed.jpeg create mode 100644 src/webserver/php-default/toolbutton-kad.jpeg create mode 100644 src/webserver/php-default/toolbutton-logout-pressed.jpeg create mode 100644 src/webserver/php-default/toolbutton-logout.jpeg create mode 100644 src/webserver/php-default/toolbutton-reload.jpeg create mode 100644 src/webserver/php-default/toolbutton-search-pressed.jpeg create mode 100644 src/webserver/php-default/toolbutton-search.jpeg create mode 100644 src/webserver/php-default/toolbutton-servers-pressed.jpeg create mode 100644 src/webserver/php-default/toolbutton-servers.jpeg create mode 100644 src/webserver/php-default/toolbutton-settings-pressed.jpeg create mode 100644 src/webserver/php-default/toolbutton-settings.jpeg create mode 100644 src/webserver/php-default/toolbutton-shared-pressed.jpeg create mode 100644 src/webserver/php-default/toolbutton-shared.jpeg create mode 100644 src/webserver/php-default/toolbutton-stats-pressed.jpeg create mode 100644 src/webserver/php-default/toolbutton-stats.jpeg create mode 100644 src/webserver/php-default/top.html create mode 100644 src/webserver/php-default/tree-closed.gif create mode 100644 src/webserver/php-default/tree-leaf.gif create mode 100644 src/webserver/php-default/tree-open.gif create mode 100644 src/webserver/php-default/up.jpeg create mode 100644 src/webserver/src/Makefile.am create mode 100644 src/webserver/src/Makefile.in create mode 100644 src/webserver/src/UPnPCompatibility.cpp create mode 100644 src/webserver/src/WebInterface.cpp create mode 100644 src/webserver/src/WebInterface.h create mode 100644 src/webserver/src/WebServer.cpp create mode 100644 src/webserver/src/WebServer.h create mode 100644 src/webserver/src/WebSocket.cpp create mode 100644 src/webserver/src/WebSocket.h create mode 100644 src/webserver/src/missing-template.html create mode 100644 src/webserver/src/php_core_lib.cpp create mode 100644 src/webserver/src/php_core_lib.h create mode 100644 src/webserver/src/php_lexer.c create mode 100644 src/webserver/src/php_lexer.l create mode 100644 src/webserver/src/php_parser.c create mode 100644 src/webserver/src/php_parser.h create mode 100644 src/webserver/src/php_parser.y create mode 100644 src/webserver/src/php_syntree.cpp create mode 100644 src/webserver/src/php_syntree.h create mode 100644 unittests/Makefile.am create mode 100644 unittests/Makefile.in create mode 100644 unittests/README create mode 100644 unittests/muleunit/Makefile.am create mode 100644 unittests/muleunit/Makefile.in create mode 100644 unittests/muleunit/license.txt create mode 100644 unittests/muleunit/main.cpp create mode 100644 unittests/muleunit/test.cpp create mode 100644 unittests/muleunit/test.h create mode 100644 unittests/muleunit/testcase.cpp create mode 100644 unittests/muleunit/testcase.h create mode 100644 unittests/muleunit/testregistry.cpp create mode 100644 unittests/muleunit/testregistry.h create mode 100644 unittests/tests/FileDataIOTest.cpp create mode 100644 unittests/tests/FormatTest.cpp create mode 100644 unittests/tests/Makefile.am create mode 100644 unittests/tests/Makefile.in create mode 100644 unittests/tests/NetworkFunctionsTest.cpp create mode 100644 unittests/tests/PathTest.cpp create mode 100644 unittests/tests/RangeMapTest.cpp create mode 100644 unittests/tests/StringFunctionsTest.cpp create mode 100644 unittests/tests/TextFileTest.cpp create mode 100644 unittests/tests/TextFileTest_dos.txt create mode 100644 unittests/tests/TextFileTest_unix.txt create mode 100644 version.rc.in diff --git a/ABOUT-NLS b/ABOUT-NLS new file mode 100644 index 00000000..d528f9c8 --- /dev/null +++ b/ABOUT-NLS @@ -0,0 +1,435 @@ +Notes on the Free Translation Project +************************************* + + Free software is going international! The Free Translation Project +is a way to get maintainers of free software, translators, and users all +together, so that will gradually become able to speak many languages. +A few packages already provide translations for their messages. + + If you found this `ABOUT-NLS' file inside a distribution, you may +assume that the distributed package does use GNU `gettext' internally, +itself available at your nearest GNU archive site. But you do _not_ +need to install GNU `gettext' prior to configuring, installing or using +this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work at translations should contact the appropriate team. + + When reporting bugs in the `intl/' directory or bugs which may be +related to internationalization, you should tell about the version of +`gettext' which is used. The information can be found in the +`intl/VERSION' file, in internationalized packages. + +Quick configuration advice +========================== + + If you want to exploit the full power of internationalization, you +should configure it using + + ./configure --with-included-gettext + +to force usage of internationalizing routines provided within this +package, despite the existence of internationalizing capabilities in the +operating system where this package is being installed. So far, only +the `gettext' implementation in the GNU C library version 2 provides as +many features (such as locale alias, message inheritance, automatic +charset conversion or plural form handling) as the implementation here. +It is also not possible to offer this additional functionality on top +of a `catgets' implementation. Future versions of GNU `gettext' will +very likely convey even more functionality. So it might be a good idea +to change to GNU `gettext' as soon as possible. + + So you need _not_ provide this option if you are using GNU libc 2 or +you have installed a recent copy of the GNU gettext package with the +included `libintl'. + +INSTALL Matters +=============== + + Some packages are "localizable" when properly installed; the +programs they contain can be made to speak your own native language. +Most such packages use GNU `gettext'. Other packages have their own +ways to internationalization, predating GNU `gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system already +provides the GNU `gettext' functions. If not, the GNU `gettext' own +library will be used. This library is wholly contained within this +package, usually in the `intl/' subdirectory, so prior installation of +the GNU `gettext' package is _not_ required. Installers may use +special options at configuration time for changing the default +behaviour. The commands: + + ./configure --with-included-gettext + ./configure --disable-nls + +will respectively bypass any pre-existing `gettext' to use the +internationalizing routines provided within this package, or else, +_totally_ disable translation of messages. + + When you already have GNU `gettext' installed on your system and run +configure without an option for your new package, `configure' will +probably detect the previously built and installed `libintl.a' file and +will decide to use this. This might be not what is desirable. You +should use the more recent version of the GNU `gettext' library. I.e. +if the file `intl/VERSION' shows that the library which comes with this +package is more recent, you should use + + ./configure --with-included-gettext + +to prevent auto-detection. + + The configuration process will not test for the `catgets' function +and therefore it will not be used. The reason is that even an +emulation of `gettext' on top of `catgets' could not provide all the +extensions of the GNU `gettext' library. + + Internationalized packages have usually many `po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at `configure' time by using the +`--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable `LINGUAS' +may be set, prior to configuration, to limit the installed set. +`LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +Using This Package +================== + + As a user, if your language has been installed for this package, you +only have to set the `LANG' environment variable to the appropriate +`LL_CC' combination. Here `LL' is an ISO 639 two-letter language code, +and `CC' is an ISO 3166 two-letter country code. For example, let's +suppose that you speak German and live in Germany. At the shell +prompt, merely execute `setenv LANG de_DE' (in `csh'), +`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). +This can be done from your `.login' or `.profile' file, once and for +all. + + You might think that the country code specification is redundant. +But in fact, some languages have dialects in different countries. For +example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The +country code serves to distinguish the dialects. + + The locale naming convention of `LL_CC', with `LL' denoting the +language and `CC' denoting the country, is the one use on systems based +on GNU libc. On other systems, some variations of this scheme are +used, such as `LL' or `LL_CC.ENCODING'. You can get the list of +locales supported by your system for your country by running the command +`locale -a | grep '^LL''. + + Not all programs have translations for all languages. By default, an +English message is shown in place of a nonexistent translation. If you +understand other languages, you can set up a priority list of languages. +This is done through a different environment variable, called +`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' +for the purpose of message handling, but you still need to have `LANG' +set to the primary language; this is required by other parts of the +system libraries. For example, some Swedish users who would rather +read translations in German than English for when Swedish is not +available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. + + In the `LANGUAGE' environment variable, but not in the `LANG' +environment variable, `LL_CC' combinations can be abbreviated as `LL' +to denote the language's main dialect. For example, `de' is equivalent +to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' +(Portuguese as spoken in Portugal) in this context. + +Translating Teams +================= + + For the Free Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list. The up-to-date list of +teams can be found at the Free Translation Project's homepage, +`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams" +area. + + If you'd like to volunteer to _work_ at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is _not_ the same as the list itself, it has +`-request' appended. For example, speakers of Swedish can send a +message to `sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate +_actively_ in translations, or at solving translational difficulties, +rather than merely lurking around. If your team does not exist yet and +you want to start one, or if you are unsure about what to do or how to +get started, please write to `translation@iro.umontreal.ca' to reach the +coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology in use. Proven linguistic skill are praised more than +programming skill, here. + +Available Packages +================== + + Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of August +2002. The matrix shows, in regard of each package, for which languages +PO files have been submitted to translation coordination, with a +translation percentage of at least 50%. + + Ready PO files be bg ca cs da de el en eo es et fi fr + +----------------------------------------+ + a2ps | [] [] [] [] | + ap-utils | | + bash | [] [] [] [] | + bfd | [] [] | + binutils | [] [] | + bison | [] [] [] [] | + clisp | | + clisp | [] [] [] [] | + clisplow | | + cpio | [] [] [] [] | + darkstat | () | + diffutils | [] [] [] [] [] [] | + enscript | [] [] | + error | [] [] [] | + fetchmail | [] () [] [] [] () | + fileutils | [] [] [] [] [] | + findutils | [] [] [] [] [] [] | + flex | [] [] [] [] [] | + gas | [] [] | + gawk | [] [] [] | + gcal | [] [] | + gcc | [] [] | + gettext | [] [] [] [] [] | + gnupg | [] [] [] [] [] [] [] | + gprof | [] [] | + gpsdrive | () () () () () | + grep | [] [] [] [] [] [] [] [] | + gretl | [] | + gthumb | () () () | + hello | [] [] [] [] [] [] [] [] [] | + id-utils | [] [] [] | + indent | [] [] [] [] [] | + jpilot | () [] [] [] | + jwhois | [] [] | + kbd | [] [] [] | + ld | [] [] | + libc | [] [] [] [] [] [] [] [] | + libiconv | [] [] [] [] | + lifelines | () () | + lilypond | [] [] | + lingoteach | [] [] | + lingoteach_lessons| () () | + lynx | [] [] [] [] [] | + m4 | [] [] [] [] [] | + make | [] [] [] [] | + man-db | [] () () [] () () | + mysecretdiary | [] [] [] | + nano | [] () [] [] [] [] | + nano_1_0 | [] () [] [] [] [] | + opcodes | [] [] [] | + parted | [] [] [] [] [] | + ptx | [] [] [] [] [] [] [] | + python | | + recode | [] [] [] [] [] [] | + sed | [] [] [] [] [] [] [] [] [] [] | + sh-utils | [] [] [] [] | + sharutils | [] [] [] [] [] [] [] | + sketch | () [] () | + soundtracker | [] [] [] | + sp | [] | + tar | [] [] [] [] [] [] | + texinfo | [] [] [] [] [] | + textutils | [] [] [] [] [] | + util-linux | [] [] [] [] [] [] | + vorbis-tools | [] | + wastesedge | | + wdiff | [] [] [] [] [] [] | + wget | [] [] [] [] [] [] [] [] [] [] | + +----------------------------------------+ + be bg ca cs da de el en eo es et fi fr + 0 2 19 10 30 44 9 1 12 44 17 6 53 + + gl he hr hu id it ja ko lv nb nl nn + +-------------------------------------+ + a2ps | () () [] | + ap-utils | | + bash | [] | + bfd | [] | + binutils | [] | + bison | [] [] [] [] | + clisp | | + clisp | [] | + clisplow | | + cpio | [] [] [] [] | + darkstat | | + diffutils | [] [] [] [] [] | + enscript | [] [] | + error | [] | + fetchmail | [] | + fileutils | [] [] [] | + findutils | [] [] [] [] [] [] [] [] | + flex | [] | + gas | | + gawk | [] | + gcal | | + gcc | [] | + gettext | [] [] | + gnupg | [] [] [] [] | + gprof | [] | + gpsdrive | [] () () | + grep | [] [] [] [] [] [] [] | + gretl | | + gthumb | () () | + hello | [] [] [] [] [] [] [] [] [] [] [] [] | + id-utils | [] [] | + indent | [] [] [] [] | + jpilot | () () | + jwhois | [] [] | + kbd | | + ld | | + libc | [] [] [] [] | + libiconv | [] [] [] | + lifelines | | + lilypond | [] | + lingoteach | [] | + lingoteach_lessons| | + lynx | [] [] [] [] | + m4 | [] [] [] [] | + make | [] [] [] [] [] [] | + man-db | () () | + mysecretdiary | [] | + nano | [] [] [] [] | + nano_1_0 | [] [] [] [] [] | + opcodes | [] [] | + parted | [] [] [] | + ptx | [] [] [] [] [] | + python | | + recode | [] [] [] | + sed | [] [] [] [] [] [] [] [] | + sh-utils | [] [] [] | + sharutils | [] [] [] | + sketch | () | + soundtracker | [] [] | + sp | | + tar | [] [] [] [] [] [] | + texinfo | [] [] [] | + textutils | [] [] [] [] | + util-linux | () [] | + vorbis-tools | [] | + wastesedge | | + wdiff | [] [] [] | + wget | [] [] [] [] [] [] | + +-------------------------------------+ + gl he hr hu id it ja ko lv nb nl nn + 23 9 12 19 16 13 26 9 1 7 19 3 + + no pl pt pt_BR ru sk sl sv tr uk zh_CN zh_TW + +----------------------------------------------+ + a2ps | () () () [] [] [] [] [] | 10 + ap-utils | () | 0 + bash | [] | 6 + bfd | [] [] | 5 + binutils | [] [] | 5 + bison | [] [] [] [] | 12 + clisp | | 0 + clisp | | 5 + clisplow | | 0 + cpio | [] [] [] [] | 12 + darkstat | [] [] () () | 2 + diffutils | [] [] [] [] [] [] | 17 + enscript | [] [] [] [] | 8 + error | [] [] [] | 7 + fetchmail | () () [] | 6 + fileutils | [] [] [] [] [] [] | 14 + findutils | [] [] [] [] [] [] [] | 21 + flex | [] [] [] | 9 + gas | [] | 3 + gawk | [] [] | 6 + gcal | [] [] | 4 + gcc | [] | 4 + gettext | [] [] [] [] [] [] | 13 + gnupg | [] [] [] | 14 + gprof | [] [] | 5 + gpsdrive | [] [] | 3 + grep | [] [] [] [] [] | 20 + gretl | | 1 + gthumb | () () [] | 1 + hello | [] [] [] [] [] [] [] | 28 + id-utils | [] [] [] [] | 9 + indent | [] [] [] [] [] | 14 + jpilot | () () [] [] | 5 + jwhois | [] () () [] [] | 7 + kbd | [] [] | 5 + ld | [] [] | 4 + libc | [] [] [] [] [] [] | 18 + libiconv | [] [] [] [] [] | 12 + lifelines | [] | 1 + lilypond | [] | 4 + lingoteach | [] [] | 5 + lingoteach_lessons| () | 0 + lynx | [] [] [] [] | 13 + m4 | [] [] [] [] | 13 + make | [] [] [] [] [] | 15 + man-db | | 3 + mysecretdiary | [] [] [] | 7 + nano | [] [] [] [] | 13 + nano_1_0 | [] [] [] [] | 14 + opcodes | [] [] [] | 8 + parted | [] [] [] [] | 12 + ptx | [] [] [] [] [] [] [] | 19 + python | | 0 + recode | [] [] [] [] [] [] | 15 + sed | [] [] [] [] [] [] | 24 + sh-utils | [] [] | 9 + sharutils | [] [] [] [] | 14 + sketch | [] () [] | 4 + soundtracker | [] | 6 + sp | | 1 + tar | [] [] [] [] [] [] [] | 19 + texinfo | [] [] | 10 + textutils | [] [] [] [] [] | 14 + util-linux | [] [] [] | 10 + vorbis-tools | [] | 3 + wastesedge | | 0 + wdiff | [] [] [] [] [] | 14 + wget | [] [] [] [] [] [] [] [] | 24 + +----------------------------------------------+ + 37 teams no pl pt pt_BR ru sk sl sv tr uk zh_CN zh_TW + 68 domains 4 15 2 28 28 12 10 49 43 4 1 9 609 + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and +distributed as such by its maintainer. There might be an observable +lag between the mere existence a PO file and its wide availability in a +distribution. + + If August 2002 seems to be old, you may fetch a more recent copy of +this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date +matrix with full percentage details can be found at +`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. + +Using `gettext' in new packages +=============================== + + If you are writing a freely available program and want to +internationalize it you are welcome to use GNU `gettext' in your +package. Of course you have to respect the GNU Library General Public +License which covers the use of the GNU `gettext' library. This means +in particular that even non-free programs can use `libintl' as a shared +library, whereas only free software can use `libintl' as a static +library or use modified versions of `libintl'. + + Once the sources are changed appropriately and the setup can handle +to use of `gettext' the only thing missing are the translations. The +Free Translation Project is also available for packages which are not +developed inside the GNU project. Therefore the information given above +applies also for every other Free Software Project. Contact +`translation@iro.umontreal.ca' to make the `.pot' files available to +the translation teams. + diff --git a/CVSDATE b/CVSDATE new file mode 100644 index 00000000..6161745b --- /dev/null +++ b/CVSDATE @@ -0,0 +1 @@ +Tue Mar 4 07:01:53 CET 2008 diff --git a/Compilation.flags.in b/Compilation.flags.in new file mode 100644 index 00000000..3fb88e80 --- /dev/null +++ b/Compilation.flags.in @@ -0,0 +1,167 @@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = . + +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ -D__GSOCKET_STANDALONE__ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_PROGRESS = @DISABLE_PROGRESS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GENCAT = @GENCAT@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +GTK_USEDVERSION = @GTK_USEDVERSION@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_VERSION = @WX_VERSION@ +XGETTEXT = @XGETTEXT@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datarootdir = @datarootdir@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +SUBDIRS = intl m4 src po + +EXTRA_DIST = config.rpath mkinstalldirs AUTHORS COPYING INSTALL README \ + TODO amule.desktop amule.xpm \ + config.h.in m4/gtk.m4 m4/gtk-2.0.m4 m4/wxwin.m4 + + +icon_DATA = amule.xpm +icondir = $(datadir)/pixmaps + +util_DATA = amule.desktop +utildir = $(datadir)/applications + +ACLOCAL_AMFLAGS = -I m4 +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = intl/Makefile +DIST_SOURCES = +DATA = $(icon_DATA) $(util_DATA) diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 00000000..c3eaec4b --- /dev/null +++ b/Makefile.am @@ -0,0 +1,57 @@ +SUBDIRS = docs src unittests + +if COMPILE_NLS +SUBDIRS += intl po +endif + +EXTRA_DIST = amule.rc amule.ico amule.png convert.ico \ + README.Debian-Packages aMule-CVS.spec aMule.spec \ + amule_build_install.sh autogen.sh \ + po/l10n.xsl + +dist_icon_DATA = +icondir = $(datadir)/pixmaps + +dist_util_DATA = +utildir = $(datadir)/applications + +if MONOLITHIC +dist_icon_DATA += amule.xpm +dist_util_DATA += amule.desktop +endif + +if AMULE_GUI +dist_icon_DATA += amulegui.xpm +dist_util_DATA += amulegui.desktop +endif + +ACLOCAL_AMFLAGS = -I m4 + +DISTCHECK_CONFIGURE_FLAGS = \ + --enable-amulecmd \ + --enable-webserver \ + --enable-amule-daemon \ + --enable-amule-gui \ + --enable-cas \ + --enable-wxcas \ + --enable-alc \ + --enable-alcc + +# Avoid everything getting built when doing "make check" +check-recursive: SUBDIRS = unittests + +MAINTAINERCLEANFILES = ABOUT-NLS \ + Makefile.in \ + aclocal.m4 \ + config.guess \ + config.h.in \ + config.rpath \ + config.sub \ + configure \ + depcomp \ + install-sh \ + missing \ + mkinstalldirs + +EXTRA__DIST__SUBDIRS = aMule.app debian +include $(top_srcdir)/automake/dist-hook.am diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 00000000..f855044e --- /dev/null +++ b/Makefile.in @@ -0,0 +1,864 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = . +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@COMPILE_NLS_TRUE@am__append_1 = intl po +@MONOLITHIC_TRUE@am__append_2 = amule.xpm +@MONOLITHIC_TRUE@am__append_3 = amule.desktop +@AMULE_GUI_TRUE@am__append_4 = amulegui.xpm +@AMULE_GUI_TRUE@am__append_5 = amulegui.desktop +DIST_COMMON = $(am__configure_deps) $(am__dist_icon_DATA_DIST) \ + $(am__dist_util_DATA_DIST) $(srcdir)/Compilation.flags.in \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/config.h.in $(srcdir)/version.rc.in \ + $(top_srcdir)/automake/dist-hook.am $(top_srcdir)/configure \ + $(top_srcdir)/intl/Makefile.in ABOUT-NLS compile config.guess \ + config.rpath config.sub depcomp install-sh missing \ + mkinstalldirs +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno configure.status.lineno +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = intl/Makefile Compilation.flags version.rc +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +am__dist_icon_DATA_DIST = amule.xpm amulegui.xpm +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(icondir)" "$(DESTDIR)$(utildir)" +dist_iconDATA_INSTALL = $(INSTALL_DATA) +am__dist_util_DATA_DIST = amule.desktop amulegui.desktop +dist_utilDATA_INSTALL = $(INSTALL_DATA) +DATA = $(dist_icon_DATA) $(dist_util_DATA) +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = docs src unittests intl po +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d $(distdir) \ + || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr $(distdir); }; } +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +SUBDIRS = docs src unittests $(am__append_1) +EXTRA_DIST = amule.rc amule.ico amule.png convert.ico \ + README.Debian-Packages aMule-CVS.spec aMule.spec \ + amule_build_install.sh autogen.sh \ + po/l10n.xsl + +dist_icon_DATA = $(am__append_2) $(am__append_4) +icondir = $(datadir)/pixmaps +dist_util_DATA = $(am__append_3) $(am__append_5) +utildir = $(datadir)/applications +ACLOCAL_AMFLAGS = -I m4 +DISTCHECK_CONFIGURE_FLAGS = \ + --enable-amulecmd \ + --enable-webserver \ + --enable-amule-daemon \ + --enable-amule-gui \ + --enable-cas \ + --enable-wxcas \ + --enable-alc \ + --enable-alcc + +MAINTAINERCLEANFILES = ABOUT-NLS \ + Makefile.in \ + aclocal.m4 \ + config.guess \ + config.h.in \ + config.rpath \ + config.sub \ + configure \ + depcomp \ + install-sh \ + missing \ + mkinstalldirs + +EXTRA__DIST__SUBDIRS = aMule.app debian +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +am--refresh: + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/automake/dist-hook.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ + cd $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) + +config.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_srcdir) && $(AUTOHEADER) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +intl/Makefile: $(top_builddir)/config.status $(top_srcdir)/intl/Makefile.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +Compilation.flags: $(top_builddir)/config.status $(srcdir)/Compilation.flags.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +version.rc: $(top_builddir)/config.status $(srcdir)/version.rc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +uninstall-info-am: +install-dist_iconDATA: $(dist_icon_DATA) + @$(NORMAL_INSTALL) + test -z "$(icondir)" || $(mkdir_p) "$(DESTDIR)$(icondir)" + @list='$(dist_icon_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(dist_iconDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(icondir)/$$f'"; \ + $(dist_iconDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(icondir)/$$f"; \ + done + +uninstall-dist_iconDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_icon_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(icondir)/$$f'"; \ + rm -f "$(DESTDIR)$(icondir)/$$f"; \ + done +install-dist_utilDATA: $(dist_util_DATA) + @$(NORMAL_INSTALL) + test -z "$(utildir)" || $(mkdir_p) "$(DESTDIR)$(utildir)" + @list='$(dist_util_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(dist_utilDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(utildir)/$$f'"; \ + $(dist_utilDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(utildir)/$$f"; \ + done + +uninstall-dist_utilDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_util_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(utildir)/$$f'"; \ + rm -f "$(DESTDIR)$(utildir)/$$f"; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + mkdir $(distdir) + $(mkdir_p) $(distdir)/. $(distdir)/automake $(distdir)/intl $(distdir)/m4 $(distdir)/po $(distdir)/src/utils/xas + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r $(distdir) +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && cd $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + --with-included-gettext \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' +distuninstallcheck: + @cd $(distuninstallcheck_dir) \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(DATA) config.h +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(icondir)" "$(DESTDIR)$(utildir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-hdr distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: install-dist_iconDATA install-dist_utilDATA + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-dist_iconDATA uninstall-dist_utilDATA \ + uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ + check-am clean clean-generic clean-recursive ctags \ + ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-hook \ + dist-shar dist-tarZ dist-zip distcheck distclean \ + distclean-generic distclean-hdr distclean-recursive \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dist_iconDATA \ + install-dist_utilDATA install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-dist_iconDATA \ + uninstall-dist_utilDATA uninstall-info-am + + +# Avoid everything getting built when doing "make check" +check-recursive: SUBDIRS = unittests +dist-hook: + for d in $(EXTRA__DIST__SUBDIRS) ; do \ + mkdir $(distdir)/$$d ; \ + for f in `find $(srcdir)/$$d -name '.svn' -prune -o -printf "%P\n"` ; do \ + if test -d $(srcdir)/$$d/$$f ; then \ + mkdir $(distdir)/$$d/$$f ; \ + else \ + cp -p $(srcdir)/$$d/$$f $(distdir)/$$d/$$f ; \ + fi ; \ + done ; \ + done +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/README.Debian-Packages b/README.Debian-Packages new file mode 100644 index 00000000..74b54111 --- /dev/null +++ b/README.Debian-Packages @@ -0,0 +1,47 @@ +This debian rules file controls the buildprocess of the packages of aMule you can either run +dpkg-buildpackage -us -uc -b -rfakeroot +to build them all, or you can invoke debian/rules directly with the target you want to be build. If you run +debian/rules without a target, or with the target help, this help will be printed. Other possible targets +are listed below, you can combine them as you need. amule-common, the packages with the themes for the +webserver and i18n-en-gb are build everytime. + +amule Builds the normal GUI-Version of aMule +ed2k Builds the ed2k-client of aMule +cas Builds the cas binary for commandline statistics +wxcas Builds the graphical version of cas +webserver Builds the webserver for controlling aMule +remotegui Builds the remote GUI for controlling aMule +daemon Builds the daemonized version of aMule +alcc Builds the ed2k-link-creation utility of aMule +alc Builds the graphical version of alcc +amulecmd Builds the commandline-client for controlling aMule +amule-dbg Creates the debugging symbols for the amule binary +ed2k-dbg Creates the debugging symbols for the ed2k binary +cas-dbg Creates the debugging symbols for the cas binary +wxcas-dbg Creates the debugging symbols for the wxcas binary +webserver-dbg Creates the debugging symbols for the amuleweb binary +remotegui-dbg Creates the debugging symbols for the amulegui binary +daemon-dbg Creates the debugging symbols for the amuled binary +alcc-dbg Creates the debugging symbols for the alcc binary +alc-dbg Creates the debugging symbols for the alc binary +amulecmd-dbg Creates the debugging symbols for the amulecmd binary +amule-utils Creates the Metapackage for the commandline utilities and all these utils + * alcc + * amulecmd + * cas +amule-utils-gui Creates the Metapackage for the graphical utilities and all these utils + * alc + * remotegui + * wxcas +i18n- Builds the coresponding i18n-packge. Lang has to be one of ar, bg, ca, da, + de, es, et-ee, eu, fi, fr, gl, hr, hu, it, it-ch, ko-kr, lt, nl, + nn, pl, pt-br, pt-pt, ru, sl, sv, tr, zh-cn or zh-tw + If no i18n-package is given, all will be build. + If you just want en_GB, use i18n-en-only + +If one of the -dbg targets is choosen, the corresponding binary will be built, too. In this case, +debugging is enabled, profiling and optimising are disabled. Is no -dbg target choosen, debugging +is disabled, profiling and optimising are enabled. + +The targets can be given in any order and combination + diff --git a/SVNDATE b/SVNDATE new file mode 100644 index 00000000..6161745b --- /dev/null +++ b/SVNDATE @@ -0,0 +1 @@ +Tue Mar 4 07:01:53 CET 2008 diff --git a/aMule-CVS.spec b/aMule-CVS.spec new file mode 100644 index 00000000..a2027d63 --- /dev/null +++ b/aMule-CVS.spec @@ -0,0 +1,114 @@ +%define svndate %(date +%Y%m%d) +%define optflags %{nil} + +Summary: aMule - another eMule p2p client +Name: aMule +Version: CVS +Release: %{svndate} +License: GPL +Group: Applications/Internet +Packager: The aMule Team (http://forum.amule.org/) +Vendor: The aMule Project +URL: http://www.amule.org/ +Source: %{name}-%{version}-%{release}.tar.bz2 +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +%description +aMule is a peer to peer file sharing client, based on the well known eMule. +Starting with 2.0.0 aMule works on Linux, Mac, *BSD and Windows, which makes it +the first multi-platform edonkey network client. + +%pre +echo "****************************************************************************" +echo "Warning: This is a cvs release!" +echo "This release is made for testing purpose and it may cause several problems," +echo "burn your house, kill your dog, etc, but it *should* be safe to use anyway." +echo "If you would like to test some of the great new features go on and install." +echo "Otherwise you may press ctrl-c within the next 10 seconds to abort the" +echo "installation." +echo -n "Waiting for user... " +for i in $(seq 10 -1 1); do + echo -n "$i, " + sleep 1 +done +echo " 0, ok, here we go then... Muhahaha :), installing." + +%prep +%setup -q -n amule-cvs + +%build +%configure \ + --disable-optimize \ + --enable-debug \ + --enable-cas \ + --enable-wxcas \ + --enable-amulecmd \ + --enable-webserver \ + --enable-ccache +%{__make} %{?_smp_mflags} + +%install +[ ! "$RPM_BUILD_ROOT" = "/" ] && %{__rm} -rf "$RPM_BUILD_ROOT" +%{__make} DESTDIR="$RPM_BUILD_ROOT" install +%find_lang amule + +%clean +[ ! "$RPM_BUILD_ROOT" = "/" ] && %{__rm} -rf "$RPM_BUILD_ROOT" + +%files -f amule.lang +%defattr(-,root,root,-) +%{_bindir}/amule +%{_bindir}/ed2k +%{_bindir}/amulecmd +%{_bindir}/cas +%{_bindir}/wxcas +%{_bindir}/amuleweb +%{_bindir}/autostart-xas +%{_libdir}/xchat/plugins/xas.pl +%{_datadir}/applications/* +%{_datadir}/pixmaps/* +%{_mandir}/man1/* +%{_mandir}/*/man1/* +%docdir %{_datadir}/doc/* +%{_datadir}/doc/* +%{_datadir}/cas +%{_datadir}/amule + +%changelog +* Sun Dec 25 2005 Gerd78 +- Really disable optimizations by defining optflags to nil. + +* Mon Apr 19 2005 Marcelo Jimenez +- Removed curl dependency, aMule now uses wxHTTP. + +* Mon Mar 26 2005 Marcelo Jimenez +- Added a distro test, so we know the distro. +- Tests for UTF-8 enabled LANG to use UTF-8 systray. + +* Mon Mar 21 2005 Marcelo Jimenez +- Removed krb5-libs require and krb5-devel buildprereq. curl-lib and + curl-devel is enough. + +* Tue Mar 08 2005 Marcelo Jimenez +- Made it work with cvs snapshots at their very same day. + +* Wed Jun 16 2004 Ariano Bertacca +- added tool package. + +* Sat May 22 2004 Ariano Bertacca +- added webserver package. + +* Sun Mar 28 2004 Ariano Bertacca +- added libcryptopp to dependencies/BuildPreReq +- getting wx-config and wxbase-config from installed rpm to avoid problems + with people using wxGTK-2.5. + Idea taken from aMule-2.0.0rc1.spec done by + deltaHF and + pure_ascii + +* Tue Feb 10 2004 Ariano Bertacca +- modified the BuildPreReq to satisfy amulecmd build requirements. + +* Sat Jan 23 2004 Ariano Bertacca +- initial amule.spec release + diff --git a/aMule.app/Contents/Frameworks/libixml.2.dylib b/aMule.app/Contents/Frameworks/libixml.2.dylib new file mode 100755 index 0000000000000000000000000000000000000000..3880b3cdde89f062431b58cf062283ca08f318ad GIT binary patch literal 89940 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 literal 0 HcwPel00001 diff --git a/aMule.app/Contents/Frameworks/libthreadutil.2.dylib b/aMule.app/Contents/Frameworks/libthreadutil.2.dylib new file mode 100755 index 0000000000000000000000000000000000000000..92926a29b2f68eb2aaa89a51e01cde085bb8e5b4 GIT binary patch literal 48004 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 z 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 literal 0 HcwPel00001 diff --git a/aMule.app/Contents/Frameworks/libupnp.3.dylib b/aMule.app/Contents/Frameworks/libupnp.3.dylib new file mode 100755 index 0000000000000000000000000000000000000000..813d342b8b022873aebba2e83be3415cb845398a GIT binary patch literal 255344 zcwX$i4S1B*oi}{$$pnH8ZLHA-Noc}{1^Gy*Q138-PC~GQi8b0#p$(Xj&_cyF*0?+9 zBy$f5UAU^-iNS7^geM@l`czr0u!|aKBIsg^U8qp8f`t_w4eoA{WE`alZcNod5UvpL756;!E3sl{Qdvz@8XGbzgBVEUk$+TDy5R? z23UrB3;zOl-(5aqc6pzIRy6TSKLH9UFCXr{yKX_St|#lI<+6|v)xHP$b98Z2 zrgl;F{Y&nh|AWQ%*F7+Q;w5!h^N%U@xkLKetBw?Nn|=4))%Vx^aMAa_8?Uo(9Y5Tu z)ECn9wWp56d(`oR@893knM>S)2l zS?Be&R~_t6Sl99W#h+fsWBk9uTodcySX|U~RR7@Kdw=kKH=&<8Dlm@4<|(lbtEbHT z`|nRkxU`P-9YAA)+%gyOls@w*>^$>?k9nSoS}J8_POPIKtSq~FZmS(pHtN~xSjx_Ilqy`UGD3rro?<%N zbgILi)%=*y&LH(4bwZlzmX8*ca3x)5ga9EHy5Fs!O2D=lbw7*tI|*|fHUlf#E>FV30KDsve<5L$ zJb)c(T?ue|kyb8!%f@rjT=t_v@?s2dUlUL(U(Iclam>);{O$G8dd#)H--9{aDD%hp zN}RvK*fGvo$gghT9CF^!ZYt(SaUMgVp&VE5%AB(seQT5-=>_5Szzg-AIc%?Rwbfbh zzm!E>v70JV18VjV;KLICQfpnf@x37G8f@~9G5H^sypFmG@9HNcfu1!qnEib#&~I~YG-L@f+AAjTXBX_PPEbK_d84)6BamC1Vp zR{41Lr*Ns-OWI@mc1Loj-Jmi6ParxBG;_U5b-txkWQy`e9#koKmmZy`Qkti!)aC}2 zhC0TyY*Py3q{6R$6qIpkx`4V%?vt^@v(r>R8_$v4Rlvn|m51vfI!DwPG8tHM7beBcR5@BB7YGc+jt;}B@K zy1pWx{7b$4+mMr87O+aMwQ~lP5ho&5%KI|$fc&gBlHH58muT7+9N9WHn82H&tlO!6 zs5D^RJ`=EdF>jtI$G8J{SBZOzWBtwXwu;@vd69Wuty=AFz zwg6*NS^cAqfHiwexNWy8Y>SbmJj{di$@*G)8*v@`1$085wle49?)uE>dhDxbceYw;26+>C1b!HkuMZKPP^AJJEpki+b#|ZVL123NskHoX7+bxf}{U|dEaHWAJ?A)ayZ?Z8q1xEIy;oi@C z@SAkz2~EEy={-4LfRAJYQXHy$S+5?*u5n}SznTx?%QthFR|c2I&G&bG+{kV)O%Up+de|~0dg{Q&KK{4%(W6+I>fOOn47-26FjFNN2!UIx5gIQ6UGKi%pK`xScirl37@RvB7lp8xzjbr06XHe_xw&%PYe$DPUYEb{7(vn&%H z{i}E#Zk?#(-mrIjP~*oPdxY*ez5}*PS-=Q6Q}$xt_6^>E?*BYq=ssc0FH85xL!OyP z_YLp8989EpK8HvBDyZrH>~lSI|Fy?7-GA*7P4{10hWR_0NcS&s&ic|la5HzAQi6-C zFlP@AO~geN+99}jD0C6?2p-IN$up0*_^fpwl@hRSx%aZP`M1a>;Iu27sDt;=>7Ch>OB{d7ELR@6a*A?^vg%UV zbZ5DiO<#Y&$R?{tHr=_fM>c(Qv>(}IT`HSC+Ip#Mx|8)^+mCFrG>(3>;{QF_^vR$e z94$VjakTgYjibef|0dbgV`~i{&AN70q&>OQ*_ynCcA~M>%Hs2C>?*Voa_4p1n%G|A zxA5GTd(Eo~z1uUdD|0?N^i|j$ja%;PVtrG(1?K_xt*5B-Htcu-xO@IpgHx%3uPS+@ z=)1UIx>ltu{ZHyyw;qPxDYm7|HO8>v_{;3az<~1X1|RZ6my5v;TIk{}X&Y_9X8P7l zQ~yYgl>;7D@C)EaH|(VKWlsmxqUVtA^{@7BF=dliRe7Igd6XS&%BG{7-&upXKw3cE zIV2JSFUEoHHOJpyqU6T32#KK;7|% zspB)Ns*?P=-8qk4nl}md#2sr)-ZbPrZSpQM_En}y%P{Zn=%SB| zyQQUYq` zVFPP+!h6_(Gha9PL%_jM;iH})VIhCU^J3luKa=r163-ROtt7wZ10LEoi-ixgdy0|A z+pzv;LD+u_iPH@qXc|PB(S*yui1zM^l*iic15;-t)BEsx(%qaSI23VY09c4KeDSWjB~-YcrI%Ufe-mq z>ev;^Ti9;p!RA%7#-vTLi@XJ)L1`00>htOJ6Vb-SF z_>susf;p~F!fCpXX=5n!#8&K}EqvcDyqm?b6nkFA(8qdD%AP@jx4b6uu& zw`mXPahh=(VA$f+E3dZkr_B|e6@80lDR1Le>Il;-z-f4~(`uBm@4?+XU zCorz7#GmjW{Rv5xcIBWQ0jp>k-nT*z0`4T0=C&(q3go%JU8Uo`4EJS)?T{Or{vC9mB9MB_d zu8u+A`7>48#vv*l`O+{~RidMVcj5ly9zJ#}Z0#9Gb61iNsF5yiHY|IRY2%PKhWS_) z_gf9$jOWvO*R2?b8CF8R$K3j-RH?dYchf$+wRj42nkhM?+ZhjNy$*IkqxeRP@uRPh zI$o*P{iZe>UyI}Fe+|{EXqVj*unIRX{qTEd#K#E!u=JJhos9fF^nvX!1ZT}Zc5c=^ z11^S&{&#vv&CZJqR|O$e5{!C?(?wfpqcyDi8RqJ=D;v{T4rvkatZ~4XG}t)h0n5LK zcBR4d87-jimTzOs!GFlFk^VesoqR*|siuoNG;Z1XLhJhe-X0&?_m1Its?hq=7&qe! z10Efx53Hf-N#xJZqHgD80bil76W^ml>3jOh3=L!9K?nVe`=`30^N0_s=qTSeELf%e zQ(gESBCU}oixv?d{o7O}+P~mH7J#P>qP)cO3G?iwUWMm_=J`6U-`j6A{``AqsC$CO z0Y_20zUFV%cr@i+Tb;iTbQ_G^4BkE*V?RcZJ#0*j``7boJ<0;VENwXda*#SlV<-BC zvc7i-Tk&A((XNlI;Y&Xj|Cr{Jg{OLaWHXZKmj}J?(Cy}b%z3wSJaNC+OQhRAYYL)A zgFkS7Ts;?M=it4!a)Ilo%b!VIH&mT*hI($^bkMG6NSa%(U5)3y{)WemUnJCH-@$gN z)qap$Fs{@00e2`T*17YK_n?vKTgPF13zu5Ya&7>}6pZN#^R6}F-2;Fb<*g>Eb1QyJ zU>h{u0zJR*apSvYzS~UMitv-i%IH%i&laDyHT`NE_J#Iw02h|1ohTm&&A28Q@_euX z_1pn`Pjlh(ksh0FDMPs-M#hyTz&;!AE!~zH9p08vCj1yMp`5nixBfDn__3;XuI$Y zj=j;%qtd?kIf_F_d!9IK(&`e@mLu&k@=&GOeah@dU)t$N?iBe4+6gs|5WdnwLj{w?R(_H;^7#{SnLkXWl*BH6 zK;BNC6K#M^wN0g=y>qr7&q$YcVe=;1m3_u@iQ5k5COe=?Hj6E4>{=JrfHnCf-(Ld1 zu}`O;}P9_nZ_ zME*vo_nw$*)@Md)*-$VOI0E}9X}42XosH*wjYmmcwD0q~t%Vb=gN_0oN874?`~CEp zb@-rTO{ucHOaIfVoB9jjvikmd=BLi*%(s9a_8poB#GVC@nxWgWvs}4rHx(TZST{eX zX*H?T@Ukr9M+J|zjeee#hx=vb9`;avzNV$54APS3r_*NW^7cX9&dr+>+Bt*g8M+5L~ zk3xS9BYqsDKNEAl%+TH9gmQ{)x^3iVqY|`3AD&Z1oSJ$y^NHP|pL0wd(*MMI66&xt ztbcke0aqO82cwLB@aLyF@6^*^vz)@b7n^y{hOK229~x>_1?%6( zJg#Ryjunbc*KgYUFVeO%^EwGvFX{>8M&;SxkkrUF-e4Kg9rW`-Gltp3GmatCi9Zd0 zc-i3CA4d5eQdUVUrgVQNz0R>9ed2yA*YLp8g3v9Zu1)nKc}ZWJs(;?!5l|Jk0fr=j zVHkL>BXA#BK1^*fc(a>!sDX2bn}_-rt^=u$;vH@Afyh_m-s61*?o)8j@qE}perKD? z)c(?`(5Zc{EU7g-V4(IPe(g3hPa;RerfZtEC7|*LoBaL+7~*YNhV?@MBb=JLKIc5a3n+i{63sfrzUZBOvU;|aD@+RB`dJG2cod4XP+SE;al7~@bz z-QFph-5PF7(|&0gkFU{gOo2>TVK=A_+ktJR@{>(JQeiuGi0;ApL_K;=b6=OWd$F$v zZ5Q46uqw!xc5faJ*p~Ps;K!ti`okNvFLmN%W9LLM9_yTWNMEB$UE3bI{!Y?JDASV; znYJz*x_SfX(I0_r1AGZM^y|-4hnlCUBS=5c+@PTQkIRwrLX+oUtB#x4;}aM+qqh%W zE_nVp*FH(rV|?bYopY5QV~%N`F{X~rG4^qN{h@?)hf0ZO@d7t%SvPDeyJd|kz|YVA z$Jf6@v{yZO#}arH3{h-NO{`h+f+8wv_AHg z`}B4E3bp}$z1P(3W&2z|uWW)IBK8aT*COFF;}XhGH05U+eD>g7mbSBjlhBWB|G>q~ z&;jr($8R=%73kj`8w=H)QYNCx&>n2xaV~$FB=u_^xkq2eebCe9Lah>Q?7VYH;%TRx@slPZLn;_*Teb9H#%=rb(OiyRmQR=drH>CRvYYc?WjzD(K8g;u4~99kMS@TCqcnu@XBeI8t7KS-26HIU;A zxz0e@23(wNulH>Nj0T6l@;1h=OU904)lb}$jNQv)xjytruedvmnXF$lO$piSr#uZB zSzu)NLM^8!Tx)noDehModk*wIVXN4zGPe_&MMsnMvPq*1+_HW^y~4;tckLrZU=Z9N z|2TPlTp#amJ>HEQ!2AQAYZBvfv`q59X!MZ`rvbW~v|*)ce?{&b;mK=Bw>J(pYh$M& z?@}S}(x|@xuF2rbX~qs75w5Uc&)!r>o15jto&~&=v#Y+Xc`nk|__n*aKH+2PHOQN8 z^0o%7F>8?jVVN(k>FxMP>af@6pN2d*Dl(*)xcKF>9Bas`Qr|mbuMgLCe!1K5n3Ppd zDz$tlY&$LQO&r%vR&)t?`w-d!u~w6oBI__hV`FkS_RvdoyE$5p_h)x*tBUR7I)Lkg z;CT0nYkW)M8f!yme8KwbrU&Wct)E;%JoY=&Rc7OM=nfBlvotg;Z9{#-)f+-X2f|j( zT_f=eV&fd*I+X=}ew_X&<9lris1buhbvoWGw_V^bpB6SYHROriVy`TTUASPz0rMJb z^>xG^0bXr%Ogd>8d9ut}GH`PA7*kg%#(%l9QjZ7gL%!!tU8$@K_0%w(b?JJ}@9U}O zONUvH=rb$98$omQ4TH`m<5|}JaX*H7v*S_TC~UIGaFxghk|Y?po+eRg9NSn2W;LPTI$p_ZOe*5Fh)L+q=ly0_ur~#`l5G8og@}?e!^# zt$>kp*EAd@tWzIzb;N)g=p>}4n)C-uJvC016>uU}saeykgMQOwufKU$K$Y&(bqw_T zB5I}Jnfme!@WLjH;d1kQkYh{RsmDKZ^MQbxINpr8rV+<#M&3~YHQ^q0ih1=NfdC z&b(|dTz~Zjw6~mm!R=otE29j$82H}J#~3R}T7^D%0{s*nI+CN?lJbkByzpqY;aht1 zaq_l+nsBvgD;4t8!7qd|0hBEzpAOHTxdD6$JmE&;UsKtr|2sZM#wi7Le=L6b;Wlt5 z`B>u`zmGAazc3S>DUp{UZ+1Zr)BJWWj<$YYvA5uG!ex9;EpuT${LB2OZzAsOZ?+fkq zUjfa{oyt12{xRWW2jdj5ZkR!TkWcGxmG~_Lo`jZmtJxf1jz`1X-=&AL_HPKczrCR) zqAEkz46IxF#O<)NZ+P9{YDUFmws?0>^5# zK5&DJf0ejjVswRa+@CP-1KJlbKFd7YnkK*Wh{-z+{j1b*uwTkIc`}8j01Mh&5MXSW zflZekbw_x%l}+B=@Z`_AGTzRvEZ%J$paXN31Gh2CKi`5t$=H7tH z7SMM~q2Thu`Z2)e!sOKYaV0_GwBR$+U3dVqO+0mRl(2^D-r*Ye7QimFPapBprMK^3 z{=2pw8i2G`<}?1IOgA6vbn_ukun%r825#3*=~gR&+Z6%zt@~u1M~z#fb%GlP8(wkb ztH9f7G2r(@x9AjrRFRgYBGTvCm(kPSDT(7SRzJM+AHMi>wig zWNp~Q708?G+u)Hzms{t15gV#B`+FpeCP(Jq|OS6#nlYRds>CsV^a{64;S z*Xixbi^*|+J=^JP?>waS*w8w(&GvtHliPk2B&_&zsyQbYpEvE5aUC7kK+6--ZaM0< zN$=6?<+=E-uCyt%H$o4o2?=nH=GtR;^)d7(w%dv5I6LU!mdq#Lx5aiEcx(H$ak^t? zde%a6jQ?9@^j(iY+OB@rC|tkTDx){DzYPgKn=Y~MhY>$WGtzgo;XDbwma+kIo6W3{kf7_%IYd(K^|cG5?dyVN=j{VP47exhTzws}&h!-4O> zHpmwLw|}j5TH6X=d>|AQ`}4?zOyJO?D%kRlQsl4GelIc9#o%eB_7^5N_BY3N8M%~1 zKQjF>^s`VOfPFGUkFB*u$7E*Djr%c$uUHjYu4Wq_r6qjDCu<7UA@C9p-qp7J4sHKl z^LMtL|CO;_qI;ly@jv9K0AsuDq6rTJ4liNIA2Z=;#!3(-!b3k8?4ivDp3#H{@Xa!~ z3B4e5jk^Yg_C3)DHGIJT0`X&kPVDLl8=*6vHTbgA)Zyx}TLRXQ`rJnAC$gRnTbAoC zZk=39*8Ks#_pY-Ob*?vc*6BLWyXy!wfNK!%2@mbb1Q@-*qfYlZEY3oJEl z>KNrVj<5Dr3|nJxHbbYYB&3IW>WlpZ&x;f1SnQFzCO8~hjx+fNV^L)6uN&Ki@!pMb z-jDGP$lSYo;2f1q|7El60i19M@5|B0eBFL53Lf>W#&gU3hovMGICv6U-xF8ZU%xQDFwL6_9DH*%4t>*1Se6NsI_XY~Z}5B9u8 zzulLi-?vE&MpvvAbrO~i%KfOseGOm2K8oI8sfVFQMf0nzFNj`IbW6y7ZR}pQRloS# zLHZ!_ZykADY!A&72En%0F-hn@^^N9;_}R+sqOnKv?-@6mW9g0~@?iYNbIf5ESGe<6 z3;S-9#H%;zJ$EIsb9;n8N*_n8p>LjipRwAmFBm48EJ50jOIn)T~_u5BjcYoGQPuJKekiWQPot^iLB8We0~HpcT!@k z)+p$N+1-pGjj!pdIR_1mx%pQjf0tg9&3;VmcEQc;6()}A%k?AvDEgvPRLt16UDPo- zx5SV9G3rIk{SNl6{>BoK0g?H7uDQ0!c|{!!!~x9p{zsvwz>Zl+p9grUgE=n1eA~eJ zbuHbhhUHo;*zvF%kpEc2(?26`t;F+S}CVo3Zt8*+Eo^G-y7@g98Y|2h8q{! zYtKgtgKr(gELAcdZm-*yPJr9{Pr9 z+tYrrAN@2wfhb_$q{nU=4n(aXayF z@FOOkHV?MuPOZ1Zy7ap74dtM(!KNL|%NGhY&3$%`S$ht|;k3Rm%A`$2+Lsxp%xCDC zbIPl|(+odI@5z7N$AI-1bZY6V;30Vc)VTiF>aTlMUk4x5YxQcE!06X8+JKe*Q2qkk zJBus#;S~diPH+swztiEaa}8c%#w%eh|GEXH{`wv~yzUO(!!A$L*9(u3_T2t#oIm~N z{$A_T*X8t#)pggJw#J)!N0~U}bl6f}^jmx$^a}ttow&cFuN_aD)acp1uJiXL_+^~0 zg6BG!C9+Njy?HjqFhj2se*Q%r+iMlm&jPs3nG&#-!6Qpz@7`y8IkxkVtakw3YZvf7 zV5Qb`|B88c2k-H2k@jZ~&H?-uNvaU@i!^OxJN+M()!WIxo-=)v^Cogve<=<4c?kJZasN4g zyQ=6ZkMXtA+k4elI+~QTs$-FZesQs}$NVTIbJx#^??i8c#m+s?Gh)Du-t^oP^CJ z@sb#?6xwmJ&*m`wKqb!@T3QJksch_0brtx}Nczn}DlM4w;9`ASh@wqWRws-8>1zC%URwboG z3q4WLz7+uvTe@9&!NbxcIi6_bNtF`*$Blr;vphO8&{5xYf6(8iQX0Bm2!@@7e%{x2 z+!NIF=2;$YRPv6`-+X<*#aUegF6O_dtSN=+cyo@YY1T6XE}|}HN)B`%3ZCggKM-wNd6J{0 zb`J2jid~T7c^LOAjXZE9rgHO#z`@Tw5Pvt~$CQN&oGi7e{^k$U>x1~s!SB6?g3e4e zsiC+WEtI4(#qZrzDmKI!=W=7;k(c zsi=VZTU`sT@mRHGT+6+<(&$0{Xr}UZ6sl<(D@c#Y%{}pGXP(9L8uA#e(5wiD4_YYWtxW#Y!6}V9FO!Vn9!$Gr^>UuB=**+(Cm16C^5bM$$P*% z-`W$pE1urelYY^UF?rZI>}jPgz_F1v%nmh#dQo_%9wRrd4L|zt0+`p^7<=W9TvVZX zo^<+TR;{%rfoIM_{VM^}!}ii_*dCuZ``a$;XMZ^EDEqv=4tSmK^!}UAwd?DE&5{o= zHQUY6&qcK6VH?x^c~b40<5qzw z(0EY%J9-UM>$%U!8bG|vkIuTX!Dg%;Y%cV9avavJfVEv<-6FV_qq_Rq5q~4B6MMt@ zqewrnruK&QvlsfndfTP2KDgrl3f5k07AX%H9c3J7fqo^4SJp5L8gl76#()|-@tn23 zYZ-doNcx?KD`;o1_!1z;!Fyy)Mz@jjn8C}@=6Qi$vl`rP@QCM7SiRSiQgT?2!J|&X za@qAH_Prrt&lm0X2363wjcfS99I=_VvAv|{OnpcCql?74IKBz>Eq5B?`>;XZ0~X-f zoA5jf&nZ36Ni*=An(#ciC+V_@r2+wnsj9-d-bTGnC=SH5T5x>nvjP!rm}(g`SNfA6N%? ztzDgQ5_+(qEAmyn2g`0sgC3YXD0IK^+h@CL1)kZIKkjp=ZfKD43{xOq^%}2dH1`nD zPl9|i>DMynb7f-QM~5FHe;GJ28d4)^b5rleos~5i%{Ic=OsY4aE zUD&Vpn;{rP;M__VTxS9I__>7;KApTsJ=dpbcQ#KGP%e6c9kS~N~y zrwmOLfCk5#eV&VP-_5=ld@Q9tq}TC1D;O(+evNEgqxaJ@W&p5NMeAXoX*#n7hoR$} zv>Ei5=ymEtT#w$Q^(#-7_&^vNI{nRHG^2mtjqt4b347QR&c+KBU*pofIluE-+xT__ zj*{3pcV7?vk+xaKD?mP;yXM9fr)hdQ`wV$2Wf13(b82`AU{w>N;E^`>^H<4sO2zeK z@Q`NGq~Jk=#(&XgJ}oW*wjuE@-k*ehw~UYO6(it<-M^+s7j$EISa(2O*eYiohV@#% zrq6W77fm(&3ij@EdM(m&diVLvX6f@Py%yfn=g&SJP_e1f=QVO3p!8e!`GUwb&Uc|c zn~HY0#r=@PPb158tU+Hp*!VkL*%R+)HE}(5f@d!P#yMsT%V3+N@a%=l=>UE9SFY?O z$5gDnmmE{EM|#OIb-uor98>4-?Ip+5`MJI1n2O!jTaKMs;KC`o?J)4&L_I^D&%9i` z#I{Imcj$rM@dA`-tdF?B^_!@U5peW;e7>?bUVq}A3CektebJ3SRbIR4^RU-1E(ra- z-UEmGvm%!;$lSNU{h;)R$ys4s%U2g)H0vyz?7BhY*e-FUB=%>Q|Fvm6`ST+tcI)Br zYVkFuHbM_>oQB^v=*Y!yniveP@j1kfOc)~kDKPQ1Skb9x=*wsTVC zOv_hPN~76>3Yr>aV9IXnMBQjl;&UWk-D~zg$DZZBxA3Yi@{>tA9{R!?^uZ7pIp(q+ z&2jF#9!>qq*e2w~27fxVKPq{Q;oA$Hc`9JeysC%{SCe>F8SW>MXN7rgS(_RS+b+QU zzqCbKmQtqu`3~4MnRZbu7R431PABrX=aHp`=3PS{;nOUWKr5A()%$vAr7}({Nw94q zf(s7nnuxLvvIgLBGM_I|aTUv+pyshU` zrH#k9gb#cq`U&PR5PnDNZWD%KTpm@ah5s1a#Xc4OqpH+nnRL*pz_{r#ER}IvD&yui z=bEHBnb5_CQje9hrvlOI(Kn@I=AqXFbllqM3(mL9nDR<_fppHV^w&L4^*$@R@A-9d zp4UTK-=!RM=h_`h)8EP-`DT4!`s+7w{KVY=#x`JZHvqV@TYwuHS5H@=kD0;;2w#Ql z*_C|ZgL-_7UfU6$=e~Yh&O6tpYm`O%v_~($kY((e4A+;2cQeHX8TP@3PqjPw+&1D8 zK1*Adyq10#^tIi@U1ew+*SamdIzxP1+&|E3&8ffo8}xZ;iEXfMXB+*bR*tDVQ`fCd zaeqMA`5)9@-%tHXtRvfB*sjJ!Mu2}b1^oVY$hqmDEym9`rD-1>^n&o~!+CZ?Cd#BZ zjY!W#dnk+if$)Lh>0Dd0SCb!J*lgA;v*lfzyj#OKMiVceNggCV_=BLAdgaC+3h$50 z`TpVn58kvyXby5+&UZHWSLgudM)ajUn{h{rjZU?g=Plw|6Kc8p>Kaa9XRRbSy};!3%ocWpv-#J zr|o+(I4L%8FPw~x5t()Xb%H<0S-_az#QuXPd7bT);}_5Os%zWW-g7w}vRU(nvXJ-2 zbnpg$s3WZm^OqXlkya+YI`l16gFZKYh<=^B7xKU>zU6Jl%FKGjKJ-=27H#49cr;z~ zoe#7nd7{7t{CM?}2Q$sA3nfRVOIj+f3P10s=ouraX9U#gsqwP&lV3$H!3q2++UeA)QM%j3fZ@vnReE|kV)5bB&T5cA1BfKSC@uIzQ? z4`Z&Q5&Gq1g_ImJP*c+71p=Xkw;<}TpnGB*%2b~dwtE>kavE<&73D37rwA9+FJ(qHb2^TVuD8!iinS))ww zF?JZaF%I-&|n3}}7?`6;Rr42LJ zea=pZ7Lso_=(7>@oSz)bc6y%w`+~!>Aev;2exw^?>QrYf52zE}Mh{8V`uBzB1SZ1c z+E)GGM_)goS(Ba%9bNlm)qk&`ukf$>2`LZEd8nd0RraGhZ5LisF8p|h@RR2Z%##vy zCmXtxZFC}=F{v#L8WzAM^XaDb(U+dRtiD88>BsMmOyj zQoXh*#h!fUCe6eCN&8B9PP68<7i%#_h0ajS;Z~$SI8^UnYqJjda#Shxd3QZgd`}St zz5b)CO}v7<$Fl{#JkEwrf7jY$=kEF$&q?zz9@m1cBxlu`bLyyrjlN92l?nM)I^WhZ z+ILW5BpI7jO#Q%b&hC&iZny^6rQ|#~^5RS0A6CVX%QIZtSjVtXC;#If6T9N|ueL_A zE#Tie-Ji7K5?gcFoGG9rRz%i<#NICC`J*T9V_v<^o;F51rm?5^8%XUC!R<61>`M=6E6ZIEA;LEE9R%9@{T^C(1d1 z&25{oN(_+tNS|NWrpg;%M&C5em2%F3Lsg*%Gs;5M$I7A)NxPFE|0d!(?sD}}KBCS= zT0e~C@tm+kS=slDaP-{*Us}$&z}1Q4`;*E`oZq-z+qa^BQ3tQ#+WGZCIg51uko3N^ z06CiJ(gW=16?Q$(xA}9Vm!06ozNtTUu`GEt%Zo3qerRIMr^R}p$F+&RH(mA?a-S8? z5v;MBVr};N*rtGbe-7G#{smdWHKBSr?@1id} zm(%FHPW_0IV88t`vME7#>@ef!H9pOS0riLRBH!2Rv&lGbTF?GSpC9O`;>a}Rb=YPh z^geZKI(0BV&%#sTnC*{UsDz9RWqJ6Xb{^>d{kP2=4VQJ}O1&>$aNm_L{rG3W;|_2R zI0nW~WcAF&eorQoP_)ifTR;c*vJd%F)oy#P5}Utu5cvNf<%NzlJ33eG zMw!l*dhi;9L!6U-^(2nhsu786bsZRcv717J(l&%L2iB1XqK}iEd8DZiHu$!JuTI1L zpko_CNdxPQFYXZ1y~LZ){FxiLZ%W74oVvjG)GIi@;r6RHNNfYfH>5Jk{+iB%F&cEq zS%G)+TTW@4^j^Btn>iMSx22X>X4s)&YC86~P|J!2wmk*J%t3*Ewx1D6$d7-S6Wu%n=&-nsPvd_5kJcKgf zLcATj2<><{#+V<6`C=z?~Py`(o!+e$lss;T4Dc zg>A8w^w9>myp%PYeM<(6BjanZ)g0^pDm1(;9qC@eNuExh!d+bnZLXF!8ABp{VgET! zkndh+h(6nv=W_ErVJ_4Jw9hpuPWye=nqapY9p^wFx;Om$a&&+8fj)F!=FDICIN#ex7QjFCo|LOtbmU}^e zHOfO8$e$KFGx$4SD__{COAmdH1Zo zS~W@~E!X$%^?&;FJdEF_OWzMT-%ox!;l9|Euj!Mgmi0wK(6uwkYn7VPh5HwA1)llx zmDg9O%6-r!of5{?W6oy-U*~E&SNwXiuj1U%T>7l;fn0w=)#UzEXfO}>!*6kLKUju? z`XLu*qkgMlDbH_$&V^?uOX71fOWnRD!x9Qz6&o+b*%LfJ%DUc|3j&j?F&H+H1T& z-sOM|He!;TeGA!N%zU7!Qwe!$n1_93yanjKCOrICT-&~i^)-65O^xR?Q%5;{g?cUP zEOjET&9*jDXRlPrX3rh$>~~+3Z<0XgY1t0hTBXVZ>QBkycXvcbE9W>xa+IIr6o%!4 za&|9$V_00@fUWcHB3Iv_ooFj_zP6H>wPa}Hrj|!;nLI!GJKsvnu2!-y`cc3IxM%rSd!E+qc{&{6w$loD z0lyO@&#mOXUGn=5`lLw*ZeJST)-(WJQiU?){J}o`_~Zm}060I|^ur_iOaiR+wuZNP zn#L92hs}2A1LuAh`j!1{p0vmq%*#JvJUx(eGt)M(Oz2w!>xjqU)w|ipBjCO0mvvhE zN)8+pn?m*s9oWOPaC-*k-`b5lJISZXk8!`_QvCj8au4oWPaE8&oNMciT0&gDVw*o&WC_|Bj2HMCGwBxLr6;<-TM2XqSEeyW*6 z#c`y54Ed>iT!%BdGwUjR;>>tm-Od*mwg>is@;h`M$B2Utc~l~ zHH_iut%hDk(njK%By?EI-yS<)c)rG`EatIl=N0fAQ1Ty% z73x$K_5oFid>Qt6wA=f;HU+R12fJlZM-so!g1J5hT&>XlC3OJzmF9l8BWFFx{SNN2 zM>|RUrYrT56(fPS|1ct0KYU;v;OD-nry~mo6_*#KO$il!i!s%cYCT@sq|y5CeLGk` z7WsZG`IgU`&pdY~=BayRq@0m^Aos^2ztVA~PRcXdQkYhs9oNNA8(sW3&t(e@%r1kW z83=WZE-Q(>A2D{rIO^5JXW(2X?Q-grxMrJnN{dtsc0cr7@DipW-=?_Vw(mM2_i3AT zYU+5d9WJ(TamI#_cgP0t$^dX@9dPGq;Lfwan~lJmO)~f3VI{GnQ{|q%fn|(0JNlSi zsMfI##tzX(7G<1Hm5j5+bMvFXk5)?+m&86^5w3Wf>t;@+GP)^Xx*&H{H8oRD)Bo;5$YoUl@-qe`Y`yk5q%mLPzT-b-yZR8Q<=Vb`ukxevG=Oa7O=d#%IxrFq(y z#QwIdmNiXT&kU&FH0QR;`bn`1L*eR+>EK7HI*#zvI^E{sSKYQ4Z)Dzm%(9{<${BnY z4#eqVh|tAG;hlZ<+g@hR6l48rT|AA9P`g)DLqAJWd!3o!<3AREdt37`wJTIqluo~2 zA-|J0U3tMr2GSQG_%HjP)N!6s6yUderi-t67xLn2<>6Xjdtz;{GpqTHVCZzzJqEC@ zTz!6ZrqQLS11A|Bm@+V3bUwfM`N$hiV=ila5#giPxjtms2Wv5=WY6OUhYILd>p9c< zzio%#!~u;$=JDH@z?~Bkn*x5BhWZDPK2SgRv?jTA8XRT4g{EGc_2T_ivd4}-JIEdJ z*%h+R;|qkBp}uH?+5woMuPguZVR8B#opA0qby%x)nA(E*TZJ-7$iIp5(7@wmd7J0x zy5B_TFD9bTx0}d2APYLR-jKX;EU#@zJN5V`ZQ}U)S10fHbt%R)bit+_fO*`RVAEFg z^Zl)-0qPlCGx38KYVF1kw^kF{S_gY<7wXy(`V3=20^Cc~hH)*R&k%Y>2k|U46ZLuK zY;g0M_g=-DY22(}~5664&?%_rQD2e(Cg< zdeNPMQ!&uKcL&#)AZt3rPxmtA&AYEM58&NtXnrK__X3t(GG7&{D>O)S!#1=(0Q$`l z+8EG(gMf7}`{}f)o$~!^C!29{72&nR(*?ee+710|FJP-Pv4k#Mv?KST{7$2H?u8ty zaF~~{ah-pwz%~YX+5pQ=;vefm-Y(jTfD61hCNWyjBT@eBt8V?!Ng4CifwH?;7soOh zQk`!7GKZ)ib+wkn4!+8IVH+KiIYYmZ-@|zzTNlrkiLq(kd)>-0G_Z0vc%;HT*q23>rE8_^@jU> zm`Mpd0s7gA8p9I`3{UWv#6H+(yWdG^23rt;x7qGs`roOxcUQl3oL4n}~sOuQx zZatWf9h7Cz*`bKtD_3ez<%QXcweFU77pv;w@Pn$le9%Y^W(<;aQeu5o;zmw)?N&0d4F(;jDus< zl+TB}FN(|iWazt<=)+aq>w&V2@dLf?U%+w2cx)_OZI$vp=o)hVj%8Z^w~AX1s7}r+ z`dZKrY)$rIo~88B*&h72(%m*te{xU#>Ucu^qm12j1YB(ZW%3rT zKF78GJcAn_Q}3l-Y@Vaw3n$I}Y1|)?d&vLG#-W*YH@jMO^sEiO?Vi7t*=z0HtR;Zo zw2FR_BYV6=MkS{Ar(aOdOpr&lk!f)`)0rS=?0)1-8_3~^ku$Zp@5J>qu66v@LZkt* zV_Jfo8AdsiWQ&}c*GJBnyym^c3p7syZyOeuGqunqw0zkn^2OHj<^4mA?VOKOTK}bN zX&2j@vIXHyzf z_RU$HC|f)=aoN%U*|LqY<^5wNv6B}JOc|^nWwl%xCUT|HVZMe$x$@Q?t5c1AG>Ll>65vWVG?Cq7 zW4%`nI5^K~0a-(WZGX8ne6A@ysN=z84Rc%XHB9<|IBq7^_l&b1_>_$MCos27#wNa= z^BlWC-x&El|FaaqQQ4$ADW!?PO*X!*A~)@5K>U|>miVJVbvGy|vgx7`?nl~K4f<{*6&c&LMZa1GXL z=cI_gvA3EwGJ3iQ5%dkG~Ts4}*SSHf)jW2;a$O=!n2Hu-Tk z-a0X6l4V@EUTD6TgFYUBd^)K6c3>ID(Cn`|2EOw;+wPC{q_6F=7cW%&(2Bif1elk zX7=6ZwX%mNxZf|M4|)o&q-hfmT|2D{<7cT&;1`>sht-y5OLaEqsIKNhjJYN2Wwn^= znb3o3M345!S*kYIj2dUFLybXog!>9ehYi2GSljT<3qjdu0NsPQQlQl5xPBF0rTp@} z-oJY%X#X8?<(KQZ$GLE6((EZ8sjJWq*MPp`U+vk%b|z$q&t2Mb<}2>~$#XK|-;o0lH0>{X_k2L@kaJV%Q!HHVIZ*hhbsqJY^(O0NPn{m^$7@yl zoh|AB^i<2#oz}ZPRKjX%}d>0VA1WT^yyoMTZh;HH}Krb?PpQXA<@NOxyboa;p+Wq;i5fh+&>n6 z;=N$_Wya#D%*6Ih*{z}Y838H}edCz8@lr=Pjy#LL;YUwW-X#MU73hY(ye{NjnUHrm z`8n)OZKJ%(INO&eXx;Jmus3#H8(#-#`b`&}*X#J8H>SFA{h{hDWdXJG4fB2!+YCMV zVS1=>OBrFX*E7!Kt+NuZpz~OvhU?Rzw|l~E8A|#`SUHAhpXHJN_3-Kp9qZzMXNiC5 z#bVl0{zpZ|+Pa#*$86|tDK}sk$AN2ue@U?D0Uk_qz=2CyfnpOv{njAyfV*(N3{>Cy`gXGRp>BC9!=c zjLa(SEwg@g%E;DZny-Jz@zLM4l(tm4ZcCL)TiaAI+W{;){7Y4ryI;`ggVc9N@{9tB z$AMfmGIX8k17&au@1e^agZ|zY^4!R^d#=$lhVr=iwoY2lIK}MH+CW*peCNh{puS?JI=L8v^fFk#~7b1>+iUy4W-vExF4`bwzqV;aYxj7Qu>W)$NZ#l zzC~vY>HQJ$xSxYJ1w-e2LC!s4rY=+xduJATDfjv4@qBBhnY$GB|59CI?<_Mf74E#~ zawpr(_c%tAw#5D{IjHcQevBwk#;FQEMx7ncAQ#=UCa3FB{va@~CQ9lG3` zXSI&JZHA%aRXmR@?tkbTBbj*aHSK^G6TYQXDQ9UimMcm)_KH7E1;(FoCYhT&v~3}&IZ)qbWyM5%Y4_M&^FzUx$*NY!P|jvJj*h#XC7b9GV_?}&Ifb`^ZnP@q=0(q zU@!kz-~A%|#=KdJ5gC(!pP_g8&9#e_U;Uy!$A8-I@dIA)`~ZFb~Wc%yPFHGy{H5Bbuwc??x!6M`CDq_Z)xLNH~x6XLG*`fi6#ET?{#&6 ze>Ux{D~Y|jl`&{Y|C)?rpE`V7frq-D$7JteoQ`8Vjocr{GE%202f1IGAook1XCy9$ zXGT`Lyu-lYv72^|Mp_7IHE#RyHRqosEH#0vQ)XBB-gFJ}>l!|5vESNz$Q`?gN4|CE z1&^5uoqspVeuHvRV$av^JrhtuW3%vXl76?(tIsn1@M@l|9sXyHC-SYZ*Y>5$H*Xda zc8`N{v*U2Y;oO&zh<7EiR}5`?jIR62wcP)LvUj3vdAuxnBJ_AY_xnco!vB9}xvq9y zK5eqw*U&=nm*4KQ1-|dfH=2&4-XcHGa_N_bK6jRFk!MTn%y)+hA4Yox_WFH+{FHrW zPh{6beeGT(_;Ls`2W_$4{4x9VcyO%u?W+xck7MtSA4PeNi_rb#3&U<3-+697WZ${`QHpb6bp^kzvlhrT(!}^NQ}d&_g<0KK~N=dS8F!OXl0Pj4|5Z zb2dKDiJ}e?n)Vss#xHIo&br@GEs333WWHT`M1P;M>urrgzZiu+DLYAhk;XM9wJ?Vc2j-@`I~9qRZL6W=%abQ)#`xYi{Rm_?pbmYA1Zof2ldfc zuhwx!FAU~c-;TB!Lt2OV`J6;u*OZ|yy31E(9dXcq=dcQhPD=XW8ExygZz+i#UvJK1 zbHAHQT~yBb7vBrln!8DhADB33cQ5oi&lo#1LtyRc&rf7MYM4IL5%o#zIPI5`*v_}( z-`89sG?)rJDTodMzv;2F-S3idEukw{`-AZ=b^-4s?wZd?<2p!MPnp>H=ohqKoH5}6 z`R-tB73W>g>(&Tpd!y?ocfYTbU^iNEyYWH2Uo4KB9deeK1Nl3ewsR;eDM-Ce;Q5h~ z?;Y_OZCkos$jUDKB03JZB-Z(X$jevdY{gqBk7Q5&YrEu37s^bu!~Kn$4PK4Id=+qS zseCs>sbTV+3hL|YyE8R!{NoANwnF{u?Zh*)``CaIZwR}nU%CSyW8XC2dg-yt^P`uR zkf)(fWj%cDqh?JPYM15%otCS2A^)Hrx&JH3ikIFt{HblqdzwG#v!-5LV|Yo^D%kh> z-AjXWTP0pUmv&!krqDu$=9w>^3N6y@bF9geoCl$^7+%I0%|~H3iTr=}74h&aj^mS~FRU-Vm&hmoggpTote8ZWGqJkKlqZ+{Akt%|WF zj{`qCNIx6j_wbNYACp&U8Mi4*_t)CU_Q;pGFB!Jdar};z#9o`#n@9cIcpcAaRruO9 zUt)e;ZMf#xS&a~LZ><*=34mk-IeIM;7GT@pK% zH6cmwx8)gFMt9#Kd5*rU=|%X^Q4gdrkMkb!J?xlk(o^|e zwK(qqUqXJD_sI87WUWcBwUr^wUH9jeg9$zn)yucp_nTngOQBaFH~$2@8w9*t2HG9~-t@I= zg7pi(Eo;osrvq^w@V4OrXM91PWf129FX=OI=qJ#8;9nn!^8t*1Z$9v^_X!`UQk6Zp z_TMXve5@e-mc;(;toSm7M*r37vD^MV9nX6-AF#&xs*Ro^`8Gdpz892EK48kqnyB!B z`Gya)sWMj&acMq0_F^sDZK;y)?-j`RdU8|%`ed>F+P|0O-@0XE0{vr5PLlq~KUU^G zF21hfzID252#Ix~t_rEEr=Da}Pbum-PkDp70)Jy&3wzh~-#lX|Xng1CdK~}tjlYF2 z(Z@&Jmbqp8`@tT)lrf>v!)ia*IgFq0fbntfC7y@=d90i*OWld`h37yCuUV_8>!fM^ z@h=CB4!N%7Wr-V)^9u3>=pGkL{C91SZ0K~?fXn1t5fN3Z`NT8N8$OXPIN``QD7Xif zyuk)E*3~~5 z|I@#Y?XACqcXRxye`*?dVFhWxH&0ax9boKx)4>ai3>}oY-_wIG714UWwQ|ZfCF?mQ zu}vq$pCb7D^N)LIVF$+Ig;xzNRQA@{fBuO1mPnvSXaD)x{&aTxwH(YHhP_uEp8-!wyB-|)iK9zum&*_1rT~tC2BH zeEygG=-(-oP~NZ4JdD|W?UKIVJo|D*J)X5t_EUpJxc+Nya4 zaD76beG?tTTj1PLqth-F|JZc=99cIj_69X#X_1W6+R%>NumP!phj=H*j z2|2hy`_};%#@!09I;8w|K&c6LmIA&G=Kh=Dp|82J+-TmPSJ1l8O`(&RKLHnMSNV(?8(pOdYs6! zboPfh&;CX|dR*dXv-Ee?W6dReWFx;BmkZ`BL7oBaH8Od$Q}Npac2g`C z@?>+5X|Bk}?XtFJmBcofZzn5#M)H%FIqQ@1t{*<8<1BX9HA??fjqiZ+YP@-NeQ5fB zO3d1FkDPar>)Q8XPsq8(&&v5}0j1Z*#J&?g{;c~=q_oh`V*)d6v_{N@nU6NJhMQvI z4J-ST$?lm&)RW!uBCdz(Pi_cR^IVpW?oj=y4RYqW;L6WVG1j55O`jLWx}E;kn%Iun z3+Rpm%5G*HML_-YV53hsnr431uHQfPv6&m~%jgpL%cajUUO$^GdaZ_IjGoWfRE=A) z$?p0d(oVSN{Dg+-?`MbK;kx&lS-R|++qAx-dY>KI-x-ymp}o$x#E`1SC*v^|lMF2N zra#%FUCQTHu|@v(tBf6q8vTgh&FB>?*iU=F{aC&~784z*{gRl=XmgJ8Hy5g6TE)HM>-@+!1TfjTj_8JF z|Fh5_&s*@D_uR`|Z0;ALKKafY>p}Uq^DC8{Spo-_YaJ+xE6-z35x^_8gy-gM%+N6 zi6kT-)@Sp}-Aw|UY=Dq#G+>Y{$wFd&lHI@tcatY1XrlPuje!~@p#h{H-m8eMz6Awd zuxjyMeLrlmg;rXy*lG*6a0@NAz<%ePnP-0`u-@;Vi*BADGtbPKnKNh3IdkS5Lzj_a zLQ81-!q4ZjICw9^`)u(ZV^Qa$uL-Y*&d;-cI_rmabL1x}Mqf|oS>19_OvF+B&(CzV z`*k(wCo(8DBGx4vBrob~yf3rU-gnqp?=39axIU`I%yyr|b_4yMEgOL5Q=dmwAihGH zC%|{U6L0ZdJ)`OugWe~?`;YKF`VS>KKs@WV?X(^k$Oa+W%%U`id%zQ;KNs0JBz;Bp z&t2r}3S*z|7rKLEczzP){muRifB(7fYy7So=}(Z9Mfehc*;l#ZL( zt}duM-ebNH>v=%H{151dyP+Q-FZ9U?=#$Sg{vGDYtI{U?HW+?vo5gqi1n;Mz&435! zlSlENOAOaFB5xfy3-T87P<|Qfmk+tzZ}YeeKm+@PjAO{kWi^?n*->tD_R>X|FT1-x zXVJ93CC(amn?AaPKFn~qU$`z~{pDBtd&V$Gi&m zCFR+^0C8A(lG|0g@0qd(a4-4s9e6h9=UT-?{*-6H{BXe)V>2Yf743CsJ_$G}-V)L{ zSnI3+a|7ypvHXD(IQMrI&O|-cu#rKV!&pqEh$QJ`+vzNp4vL1M_ui$wE zpD}&_*)QJmQy0c!fp3nw*HVl(MYI$5$D=b(lMNi{KgN=6&<~RPvxoSe3;IC|iy80U ziR1B4h2}EIhss@k8$q&TLOD}09knW9_NVfQbP4Gjr}_Uo72$_>{q8kHchr5qahazz zsFT;MUw_m}Ho8zJow8HF1A~^o4tNx$PM1jTO`Rm>QI8UlIOQrF>B* zo?nO(w)bX18}o%;5pA^4j&3fr&x_~N4C^IX_!*CdHfls$w3v>zT4p?}3~=N5o6aHf zXA>9L-|$s+T!}5|9DGNssJ3x9-WcP0aJsOM+xB|UI2aTyi@`P`?36EP9H<=!U|rHO zE#?Wc<8%vIonmNrd`SJon%ZbQw(b?SKvUnooFiJ z0ov#ZyFncvi9Lr+|+=Dko?Z#5cmzF#jH^U&CPH`CCazC73H-&5LhOTq1dN3`)FD{tEJC3jLG;G?(Hj!FYcp_!Q>|@R!yo&Hd@?4J6NC8$iB~ zK|T-1riv+y;%#h`%t*5X`|fW7FSwcf>&>14>+Qs;vG852k$h5b`Wkq|THp~Ih$lyU zGqMWQC1hS<=qpN#e)Re)n8sUy`G2tG#=3;#-ka+Zw%r?|OBgzVe%imKF5&+i$m-ks zma0q0szQD5wig2Wgl$~`eZrQ{#?mDKjKIh5eIIc7EJv8EWEZw?^L{fM zc$nm#D)JwH3~3Y5g7AGdo9|=)_^k=si`|Fo)%Dn{ccC2U&n)O;jPVV>eegQ~zr*l* zpZn+d!D_z0_k%j+X;!IhWf=RX7}kXn$g|Pn`(&!(VOq{B41U9PpPDPmL6G~0QCGbs z3GEEg2O90uelG0+7+|fRbPCdWJWF=#em*BOM|aec$!;%}D>ow;=rkxPbP(p}-g~6LP~w#qmv9J{VWwJx}igZo}y?>O}g5yBozbENQRo0KSZT%s;1eLvg8>)R&iVbp1L zJOPHu;@!u@6ZH6ewEs+coS_`0i!}(HPaL+-ZJJI#0Xg3Ijt9n{dDTASK4AZuB+7LM z^-oBs-tJ8%ader zdFGV?zDR@pMrp|6`|D-mS@~K0V`{sIr#nn`8X7t~EYbcdw#5qf2gDd8s{0(!U&SCt zmS7t|R@#XEzvK_!c%`Fnr%N{dV6VRDjkl0@CHsie?Emt!vd0^t-6sO&F$0zN=;-q3 zyAR)ZU!U^ETUZ{Haa3;voHydya~$oOyj_ws*p(m+(VqPfGvl{do>~_42f;;UnV_5x z-#CutcqQ_AE>r(Q+1xk8FFu7bvm?NBc5HZlf$>p+uHgO#;0Ev0TY~x&&zIILsKO- zJI0--eOh_fZkX#o!n397+2K)f8@r+0;PoBr8B0&jDM1P>~gqz1n4vW!+F~%rnG~0AdobO8{8NmZ{5cLor{551B0P?B6I;7zD|BZS! zf6IDayHP#LPNq>bOw+l6(|U?y)`JuHU(lXFQenX{^O&Q4h~M>&Bf6A?auwW@t*+3` znzM_zZnkU1PY!!hmXdDP8AY+-Qz36uP~LcJ6wnf=L-lKj`HE2|UKMms8U0cl0G+djH*vX zk;g@H*LIYwV%ABOB)|RJpIx0hK;}E`^I<#%=!@e3-z*rX-p=)3kuFH(<4|VS!`OCi zGvIsR@BH@Xm=**4IIh#1@O%AC8f&*4#iBa-Itt~GZ+OgGgSuhJKaS4e|Iz2Oo{r7* zRMY-A$RW>;2RQM};67FEz>oYO7#ln~;D$nJaX>oO~ zzkoPYiSIoIg7;D6Q{g(pu+4`$xEM^MvZGM9exbyZ0%ND3PM^oD4<0Wp8)XmN`!F#d z`k`Tix8nEDEKq6U4P*OCzSH_778`79iFT_p`k{dNs_u&s--Gd-$lmgIRX7*-j%Sm) zO+Vg5`i%k>3qK9WKN`3ak3;7H;xFtG;}_j|;;*ibdoD0TKkIQ%JH4m#&=*?aw>A@b zY`9|IR#>apY>=09R`QGbbB=RtJVToxE4%$V@%zensH6K6bCug{D67J&n^P=}jN zdr&@?;Z0~GhXw13%{l~l^Bal{nvD1Iem2SNIZ@&s`jZyq=1mxjPT=LSPS4$1F8@83 zBlaz0xcn}?rP6Ikv!xGGEFOmO#Ef|UDGutuc(Ft575B3D{P-zolsB*+_Tx=q`(aMB z{UUwPe$P(^rr?QE-hr;)ZU@e`>Vg{GsJK)8QtQf{HU!TBQWc1;7gyQd- z`=-H?$`I+I4l}9Sw6_Oki*G*%l#fE^080#-12c`> z4-@Xg#)x^CL3{jLFQ6VP5$8nbf&cQ)Ll}!*>Z_BazZ$)F9)1p1<#o1&@;bq(h|`C_~iSDwlr)`LS%uU&s=@7Sgxt@Eeg|=Z90kA%BQ|30bnfjwO5h zScblkWndfoV7`rf0W{({=u?=BTY#_H`)3wKyaeqHU;mi+m1!!!LOS2E_2XmsoHO{8T6_<6sj+66rvqSE#&mn{We>tN6@H2M9h4CZyr~EEw`c<+=vh4AC-PU!&x#zH6j3b;TlU|VgAyGTw+j#iJ-O#>C_+JR>QFJO@Zf_LdPl2*3 zp^P^bJR5qD^pA@8j?Sm^y<1-|)KMbh8EOF!B#em&{9g(5Z!y_+KwgxWV4N}rMLZ_t zKal>rqe@i!x@d|u0N$cy>JTJf{;t4FpSYXm)eDKw^-`?H5AE+g7@WK}VXs4vysv3FM15YCw% zz10()?e5q&D~tA^dQuR_JKqJq*25AyhYq7n-*JFd*!gwVk?ktCYa3Dh@Iu)P>w)x- zXb+0pNM=3?G+yrc{%f3`c4Gf$%Uixr=Ps$t$( zg7&Uw!1F}^JWJ*AOWTu_4(u!Uy{J=y=escWFbl%}zlBK2rOtC6V$}=$TD_JGlaRKj){5sIzH!q9Wn7XX(tVZ4UlY2G`JIF4y z12B^vIi$;ln>Ti)Y~I-W9?T=;WmW(`U}7;{z>g?jFl|4c0hd_q;1TBTx3PwPBWvjg z+T=aMTp$xz`Cf1Le)QoBw4zwu2Oym#z&l`L+2|`lHf`P~f4F%!lvSlK>LEXaq;oei zSRzl-F96ZP5;q#>RvP&ev|Nl(nrT9(MWdd<-O4Q_wj zlkObo?+bq0fwAK0dd9ZD?SAi-k2%hCkPjTb2c4cGXt!3R-35Hk5U!;ttH{+-kHxp{ zE}rK3CPZfw?t=vJZl5@tj(qRt8A1Er*E2FfF5x%|XV?I@v?Zv&7iD-lL?o=U1;h7*`7N@V3m>16oLAeR&za7fXk6*{+tS;szAGy_0 zux`Gi#(_%4^D;z(Xzl7v5%W7WaIU8}Eo&*z>o}I(i8eMvzP+iy19pzE`=P!ISqZF? z>&m+}gUr}K=W2VoO%}oY;lNi2H{gN>>Q%=-mf}e8^ZsVUBRtmvFd~i@1HBj)I{He$ zfhzqBC=+0pcMY5)+nn8a2IdXb#x_>eKO5Gf;>WvjzN&*K_BgoS<_}&!&mIpYriiKI+^j>5z|walZoe;V74#q#xJ z%2{A$Q9AXkAo{@pJpYvNgKX?PA9PRIk;;9cK0UP~Zvf{_wwcXDA83-W*NPS8;=Hk< zeJ*{E^PA>R;{w{}-r>*JPwNt_-@Jd)Gk* zux}OiWmmp-uchyWy{uz3&+n+?ZD4bupKE|7Z*jL#KV;zC=KZjyKzx(K^Ew_D-=^_4 zOF|FgzD7FYo!n2M+|&Ot^vA1Et{KWTiZfe7I3@$xESmflxLNFgo5j3%0M<*i!$ls6 zVqdveD^IdiD36g31hQj^jzxW*w~}Rpyp{T5CCeYE#Py|l1LdPU|AaO)Z^k*s>3;L8 zBpdPA@*r350N$wJEtqXX2TMIZ2wdU}4wmppPgXc75 z^^R1rzU}qfHir4*AfKSlfZuV%VLv{j?ewo6;`n?y%fFP1?df5T zt7|TY;_%ZO#QRghILymh-N)Osx(jeP){n!TnE&a?0UUl>>b~;_m3%y1b=Ec2S-M|6BT{>Ie_9@zE zLRpC-eXE(Z9OP|jd7H!Bf_tYj$J@3uIHriVfws52Ao6Vx-+8#5pQDYplU?P{>k9mM zi)Uba{-p%^;3CJ{wmvcM1_^I-0dHRc-0lFp1s>x{h!d?Mg3%=h+#N~OSAv^gSt z9B&|;eG+gs9&mOW;Ovu#vkjjHaQ4b3cs@h-3XV&|Gx=01)i&0V}-o7)w~4`2?gS&TTV@(98ExQMd{&-f0w9YHud9EP*M zA)Ga2(pu#d;~G^=_zGq6{TtVLj+f2?;h$RItLroIK23~SJdOu1tLY@4YfTtW;wqg< z;S;}Fg-#W}Q_=7058F+c8~EM!rwe?9=84rTQ7IkBn@=_$1RlEvq| zSAUvGx%YAZ*=S!3YYEHcx|O3G-yBl~z8%K>GQ=~&0~66bHUP5Iz%;_UXuu=HN1&B! z3zTIn)sJWQ0-klSe2|w?iBBJ5(f!wecR_yG8?}-5-BXL@{>!Juy`AVKzi(Gshfa`P z@(7OMQ+?c4n#B>`@i?T(ydRkkVdHbVb&Gl~9DQqMf?TD<2jm1krVZCPjy7BtxOtwB zZNry*JQ_s*I^G7{JWTeyfN%Q|7sK{k#<0Q7K>Mxk;g@50U5>>dd*t&mN~{xOsmSuM%IEhYtFqDd z68B$_7N|5p?(tpV>rm~PzHF&-N zeM(t;m)@k9Ta>Tnn#i*y(C!(liFUV>KSB5Cw%42#?Mj3;#QAv&lsia=vHERcd#B}c z#l@3~=VjEPWh;3s191}d8(z3a92=OyGSUZqeQE0op%lJ|k#Q1)d+{xa@4?bf)U4(C&gVZDr@Gj*KTIYYFF^FN;<-m1Q&Ie+z+J~7X=JpWT- z{Cs;k9cnfr4J10`udD7nFR$)P&Q~;?g8V&rpZhz6&+)pS2BAGpPj51e?-FIr;9OYC z-V|#z;7UTDkk4W=X>FF`h`&U5?Y|Lg^NRCCYu8gAT$h0!HNQag=utmCG5{@NTT~XL=GMg|FWZS*uI|t=dinY_xCS*Qyz)pL^ z`xalzX1|^e+D&}}GL)Hp7vz7<;V$C}XzBs}0JF=NgX#4Tyue9uH&OFZNu6 z^I$BVy@+Go-{0&O>n+;c8#q4Q*Cp^Np3j$61;O7!e>SN2#c|6v5zqXHyijbKd7QTKjeF6@G|Xt)m3J^|#xIF?Y)SvubU{5iG>ZSsIFeWNVlami8ll&PSu`OF^3 zyU~5Oc~91>{`R><`&zJG1^U6=ce(`I=dQb3>wfD&EpO)^#M%mL$P&n7y#x2HRR6bg zvAvm_XpcOZ$AV-!EYHkpE^?S_zJ3v|FVZ_Um-OO8X6z3q_Q#9+1^#@%buoM{0A6jT zvf_i@0}f~>3VAd(YrEgC+g*IVJw0BXZ;FV=MRtKl&{x@pV;0|Y*bcM{Ob(ilr$H`9 z+ZA76FKxm^oWlZtHwpYrM4Bhg0msl8j3K6V8+goBq(3~J^po*2jYAXeAIPY8^12xM zmEn6lacnNYUYXU!8u)xF|AzJy$QHhQwO<~l^}u-!){H`Ei%fIjL+Fd~r~~`c>wX$C z4xg95uB_SYhOu7;_0+&z(~+I1jg3Hk<^gzC9%u1gj{sgEO^5sb1U3ly(AH=O`7>%S zl+nGOX}WjdxIHxmXvHA3CAzb3+z;s-{>I<)Gj|D6$yhQ4o_RsKMRXEly9AwiL7K_w zq%Q;KF1*XO_}Ui>U7qUi_%=@W+Vy_Fj@UPX?h*c|^l>}R?{?KcVJyZcowwAx@{@d7_^N z2g*hIx*Po{cYoJwT6*=x;sJL3k!p#P?YH*9VO6XfXm8h>=V1lj)JEzL*E5P z9;YwBxA|@RS6xHC4*j!-mLL1Ives**{V+TW9-zN-p`3Vux5<9lmF86J+k{(GZtbv; zo6lyUFIaVc(K*+(yMpEy#?C7d^DA54rR=u&o}CynzeuK1_E~&&yT+Jb6fakag88MM ztq1%Qu*P&Mu?VM*@`>~JhHWDD&^12!4#MC3vGMoz zyNKTdyb|Y(5P!{_kFih2eNMvPC4|2^i?4osDE>ZGcys)HVIv>&l}40%FpebfBDS&d z_qIM!=0RwSTi9QlIsR6B8NlDChR4KTlo@CY>^c5^3oSoIS^EN>6-gvL7RhESCkFE1 z+4$SWb9n8mk!Krg{L*`TKD2o-slFqg4x&Q`X1avUg90#pELTZ$xjw$SOUMx9Zw#JS zqwE0Bn^af;XAaUn+X(Z?>sW^OZs2o!p}d}zMlO%#&RAd zdxvSA&;8ydfB1BUK4qOuXEhbtqsbS09^>%*zQwn_QRuW{MHw5+=*tk+Gr;$38DmAB zhO%mZBlfkn4byz%d6yu6kN8A9);$zk{-`>avqrA}9Ar;@u#RiYcnzwZ+R2AT*{Pww zLEMuRy_W&S6A# z?nb`p2On|U3?6Hh_Bcg(imC5PS5e>5oKCKzhH@KVyxscxb(_?(u$+-7UN@FUz79>b zmEyb++H7YNOr~{S+~dNtM+7Ip2KQ#DztHWEi6m(OH);Vl8i3Y)4EPa6_<=ZSMp`iB z3HX{_sTa18ClpDF_2UN2jjY4he*x{GvzLO_R)E~~rJ#d&wy#pqq#o$^Dv?j{ku3*B zzFL5#Mx2qW1X@=G>m4Is&AZmcS$xV=vEC&H^gip7K@NXg(6(e;_t57jd|QDwB_Kx; z4Cr&%aENR;1-uj&M=S0Jk)PzWuX#!EKH8{x4bT2F1ncez-e*dx83( zdh8f0sxZ(#kH(*2X3vuOX!<&Y2 z2H{>F*dYxn-$y?0@2a25c&=Y6zsAR{{IZbk&MRws0GBI2;C)qzb{mHgM~H6;^Zgxy z)5D>5nkY9BUa#*K=e;ZY12{Fg&W}_6c|~zUXufhBU%5s2Q`L$*fa8^EFs26NKY(YP zi#(}P-3`1?*)IbUTnj&;TgeTH-&=o0Y=mP%;j#mD7VVPoUlh_uNs6R9zi+$0m- z;g^YaQp_YB;7^rGO9B3)P#>NPui>&Ln}TN{AV04Auol*pi+p&F6L~@_uCH94Tn+2B zYrj}u<5W9AE<;6)#~3PEcxIfJdmCSO>V*Escbxo;@U+`GFI)SyNZUs=1ocThEr%_> zrK<11czTbrS98`Rry{H+$g)|tX(V9Iw~l+i}Cz@+Tu^z`u$ z#CwmB;b06WO;OuMGNQlS6<>;Sb-`@|yn0=fwFPB6asLA064DDBYvJ-2+o0M_0nWUx z2wA=h+NeMqQJ)0kJJQ_;xcMsL=HnlcPQQvx4986iAA~myoSbqPRB~R ztPwg}aU0Op7eqhn$OaPYct12gm&JGP?2Xg@IFio&y2q0Zzwk>GNdF7Q7}eZ3{c4T+ z9{sLEKVA+^zkVFsrPr~ebmlQ-+z-|BuE-zYxmMZqTn70RH8G8e`L3vafjXAp^RbW@ zWPB^Bh`Xuzcwi*L(o7T+_U!|#g4w-M5x86-VKH}`9< z;-?W~e{p#tRkb~*F*`!?^E4>?OA*sCR;Ke@YK%#atHF3`t&YtM>ucz<-YU? zvMY-*PKcYHm1 zY%!-}kM(t)nz~1M;@S6wtv%@h2ewjOc!o#y5fV1`+)&Xqfki8S#It1^D!lKp*!~qv({EzhevBFS z1&a}LpDm#Mv7#QVKNxP@PeWKZyiQl3twi&fH_GY0IiGfIq-zFaGyB*?A3jCz%Te2e(Z48&RdA@lMlgo9pQYX#rI!&yn1b{2JpQWc<&|3 zlM}L)X^^LjY~OBG4o#5Vh0vzrJAsx+wa5o&?VRA}AuYZO7lX=>k$*?L@5-H!P3Mz% zIWaJAYrRIPmezn&iwny|`A01a;o{}}wGHbJE|b?=dQh1Lu)%kt%t>K>_}*7`PRPf0 z%10!F+^vc6+lxt(!Qz{n0^jG0a#3%X4evoFE45>}SSFQS#m{Z4pi#8GJLFy~>QuP}b>UOa0E za~`q^@VbMf%A!UZf4ZF^)2g65O9xGr@Fs7R-NpIb>i8C z8|a=%2m5QXGxXA2B|6*kInGtoQ2-r9fBY=#y>(akxGY#ke0>-4b=Ot<3UOv(flZuQ z5NE&^EEaS*L&Ta+7QQk$--|ryc9c!iW&_;WBCfGYM_Z^ZWBKCmh}f1EjNu{L605ca z*Ij7OIcm?2b*X%fD}I4w4ry{Xd6M(ub;B&sAw!85B&cgEp6%(=t`HOuAs zZXWfeN45|>S4>Su1Nb2o^Zs<5<#1VYNVcQ?yjmXGpB5v>4=GMO&ldf6Rm2myB>MN9 zux~jl{78Jx*X_atv6oT9`@3+l&=I^3Flz>Y=b`wc9njY_FBbHZEY_iceqOMF@OImT ze4s5Nz7RhPWM+9Ead_q(f%;cMy-t7=_YGR`Js-1qy9TCBkYBt$A;|9V9}54@P!|}d z)!jFso{GCo#M zbDzFA9(evoF*U}A;=Z&S*M5{^JQJXtWQ)sFSOzrv+C^NeVO)CoSgsZPU*YP&SpK6g zbSw+o_}q}J;@Qr}P?9lT8(cFuk0yyZFX{Lg&R>S-26?~FUmQA~^Si`&UiFVBjh{N6 zmLp_SLE~w8o6aU}n*i(4ypR0jNwDO9!|k>6FN*Pe4PeFb+#SGyd8*z}C%*YWd~;Cg zz%uhLqo0_-_~-8u>BE2n^1ze9cyQ%7FC*6$z=IZiULC-L+zp|4unu^p+9ft^hr+j}4;dZcfkJQpFg&5TNH*c7@XO`Tc^Po5izA z|Kl6Cd6YH0=g12GbaG=3j^R^3mUm~9SMfefD+b$TIONaYFX)q?lLcMWUYL`lL&A9W&!R5p+}}Yvf7$Bhu;hP6dl1yl%jZMenSWBW z(<#PHE7}=@;|cAH;rT#*84~GRMLM2S8Up@mO{*KqQQI%(N`4pF|KNCI`^9*7eD$uY zvk>v=Pb5q9=78X`;GW7;u~&;ufgLP$H$Y8c1)mkRjhCJ z0gzRZ$5Gd{0kjqCxhVDlAK4IC+iEYtbI|#}M_vtG+gbtkN8ZMMxfu_t#+uKkuIl zW7)O@!~f3MIDxQs@2Kv<7zIK2@HuZo~m)ajeWzwAv#CkAA3ITrbgstVC>}pKl2x{*Y$9JV9ZyZhUe{pF@N~&&@pf6 zg?C3rjrk3HF{$%N4$|}Cw*g(>ijtu5uHk*v(7@Z5dor+w|K(z6U*)RwFN5~H1Mfc& z;~XcR-^McdUc~PnzTsX(P&`25KgOnaL3G zA??Vy7D~T!&XZkb{xAIW4BAt7Q~5c#JqIGuv8rQXbnNP*xDFqB>Kw;|oCSe4{iogE zCZ4uf;O$X=n>an={Ki4m_ZiT%EgYZaj;GGScT)vEd&Toaj?Y=PFj~gKWj>D6k8VNQ zh4jo%%Yd%QJ?DCPeRK8)@VX`yo<9oU^_)|oc-?p$-hCaBmVIlyUhWFQ4=cxyx=nm6 zvyIe0L)`w9_v!g5q3dDRHGwB&uY>Of*5i4PtS^NQ=*E6LzZHB>o)`^Z?Ilt7_R;X2 zTO9`9vN7QE!ux`o!WYaRZTmJlswd@9I;tJDLKe;3AE2dw{xlRPGY<;*@<~1&Cf_{c z{d_Oav&BEh_%ogFRplDX^~={pTgIMa!RrFFC2M3&Y~ z2eo0czmKccv*G&7AbZaZv|&Ot^*5vsyeBy!{WH`tlI{ud_%QrVGp71O!FW!V>sP-K z_8I47w7aD9a*tdSHn%5avcY}iys*hN44j1d_A<;jtRoY3SNi?{jDM;VFeV1UxR~!@ z&k_C)=GdT56`Z3q{|eAPUE0n2I6WyaCv8x6I{8<^c?tK0o$ue);_i_)(cJtY%}q(} z@qHmzue?C*qIhH(>iKOg??d@hZo{X>Ns^D?9Hu(PTAPH=796KdLH>D^JZ>wZtVbQ} z^#pYvnac3*@jhCmmJzboH_qq7vV@Kr?T47PBQ`T@M?4|8u&-(eJ&}WY#ZvDnC*d z97^Z=>4G3j$FJ^I(8_liH?>m07@yX2?si39IE!OZM?-w1jfkgLPzU{L>L9Ue9RL?12r zDro*;Yy^gVm9?Wr!*TL^Zz}gJIV<{UkaR(02lc&n4%5D=bnbmUJ0|jX1^VfaOGH1# ziZqOyEO7mMdYY>@n42)}zAlsGv|RsY3E6D%Z;}FK|KVD2*$5NH3KRC5Ah*t$D()4y zpDga7jM)jHef!{I-i~WL7S9t)&H@iNjQxt^Hdeplo;Si6zCS6O>T2ENVrPlH*J!=Y zH-xcKLwJ4k(L3VzAw2@{TqGMs!EeK}s{hN7w^EG6k2wC!5&jkCY!_FwORvV*uYfP_ zkGbb+VE2d5Y3>);H^TSlW~ny9y{5=(o3-4$3yqGDofRuq)?qVFiS+sxA5HonMGg`PJVXxMld>$g<VYM=KL_uf`bPjB1B}Pr z(kA$Mu`G-o=B;?F0pl5W7D_UP>_7$=z;raz=qwx30(3h0~ zZCS{VJlb55j;@R1+#0$V+I6B`ixqIYgw9HgaDTUQ&phB8<{ngOHQ?-OoIBjE_Q733 z9zmVqO0`UrH(Xaldh09;(lf#1St|sd zT!Aq{{5VJPF}F!)a{=yL#OLEr3Z2;O@ycCRtH2WxvzKtB3gwj$9C^~7@vU&=9>Nir zyCAQGV4&Pbj2}ZGx^|^N3$7NYBNv_Oau^6ie1yd~uL*RXG~4*`x>1WkVqaDU3oZuVpJ!%gSzY5!r)!GPR)?YyufY?0Z7 z=q%us1|9*t{4U_-ucTw}b3;AOftLVBe?I!dn)h=wuV?~{V=ubz1@34+c;D^bE|4ERk0XMR?Nkho{5{-FJ znl*4pI`-lr9JdS);tD*w;itgQh5l{4(OozIAP+ov?6il=D9>{s|f0t@_{?xAtR|HQ!%I_w|`4Bcy!8T<`7nEs>K8GHN$++TY6INqTjk=LD{%jjcn^3tGbae9-Syo zLYgW!c;UNmC0|pl1m8i&^JecE>g@l*|dBw z+9awrwwNFCzRvl<`@RGiWB9#piHyE2_B@dihcmim+O~5}C$hT}G=~({#)o*Za^0O0naX*LK8IS+H4dyuH0ep)S zun_O}7k~HQ|_<-T$eu^*JVRn4e)lJuIGo zM_;NvdFXQ^ZjASH%`D|2>6GX!_5Bo+ncpYqRXG~2D}i=xhB|?kvRXQKT19D9d>u~w z1jn5CG$vvKm~~(|SpG*){#RN4GO;et0~RV9=#BC%@?l)N3coJ(<-nPz5IeOIRtWHO8K&pa zx3Z3KeKU+jJ3pUIG-H$E=5ZQe4$+~!a;ztVg_ zo*4B7Fn>0ou887AM*&X=?+|y5cn+KFcXc*-Fn6DrBk(+}AKQiFBAzM!qub-3GueD@ zOzR8iJ?=Y2G@JO#`$#{_$K$>aux^|`{<>jqc5XR=d`<%|pQ(1Phr{PkwqaF4j_xm? zCQLLa_1H9acj)8tn9tq!CQUT-1$YbfZ>L6pnV$i9^mCQ@ZQ(imu%42GmUY` z_pv&L2ewnK;dNF33#;~XFK^E2b6dR{6Vj8Q-FsnR8nO0tZ_%=7Y)8%Fs_&worM_-(! zk0zexV`aOqw&S$ya{oC)R=Ru*>utUkJ*-)oP^YIJan83}vH6_qjXqcRcAwi*|Dd+J z%cpePd_CPpU+?+^-$qZ>Qf)WT@NUVsY5fu3(E9DZk(~Np)vxdJy`ryw#Z_J}=XzEx z)w&N?xZHoLkUd4?T%MxoTF>L9+Vy9AgE>WC9n}~8!n;_}p$$exsO zcz(rzZS|zQOfg|{QWACgl$PI=r}XA}9xT#&s?08r$t=4~Ko3lJYu)qj&}N&C9Fk4{ z_dl(sy}202&0~&rd35N)D-YWLBE_@GslV*j*WdmI!M0+l){_jd87f4cKWQ;0O-|AL zUVYJr5BlLU16)-lBF`6EPYUEo*`1+JnRlljo?3v%U>13Pt;N{7*`{mrWz%M9Y@#C7YrX{ID4Su0JAdK>IaO0=B;5P8DN7fZr?jZJBzuxecsb*v1Uz5=L^l2GU#+H*06g=} zyqtSgcz&6#ua8|eCOlJBc%t(4McT44;nAw_oY7Pf(glCEh zPr?`a`cM8aCOmhk@ci@g&HA9|F%x4v%uix7&TE3e(jK`l6jzLSQl@OfdHMs4%T+)~7_B42Fs7`mPGk3lD-E z@thwX-5r4cQ9)zn`-i?>Zz`|X5iD-QQo#KvY7d9u*;akg-@3|+DmYG8l>**J1>sEN zus+2$9q1~r-%tc|FpBzB%=Is2lN@6;?F+5nkGrq@AAS9w@<-Kwhg!eoclx6L_tjDL z``iDwcl9Zjs!{b%RqH==ST-GK8CAc3ERwhC>pMOiRsVRk{y%Nk7d`NgQT6+A;`m?m zDH$6^)gQ0cuj!Rd_l_S`zaKYGex|QKrXN-Rch&m;@VUNd%a^0-_s^00V2-%2jH>@m zwf^^ClTDA=)%x9rGMUQXh4nuO^RVuWh}qrZLI%aq5gl{q)(ag|CFb=c>TI3WNaVC9CDlf1odCtB%4O`R@3f~`aAxP z^}hr4+n>;HG8?-%qbmptM1yL+(y=}`ZM z9@(_))A0H`mty@thx(g$!}u=>ufJmx*1rSlzn-Qq`orl_^$%hFUqJmkC7|Wn@cKJ` ziS_>o>R%Wwo2G0Z)&5ef|3#?(?`2T``r!IKw`OYHz_%hC{kH=ThjXpyJ%Ht4mcHn} z9#&!Lnt-uI#dtUno|gfh2T$lze*Uf>o|yoTWvQ!UHsF@&Ie_QS&&sA>^!wp4nY7;d zj46|$EWoG!G`PPF?lA`4LdH5`F7DB9q?n^ukZ0Tvyji%dhV|7rnPiK1XVUozRW3qa z4}S{qjqa!-t=06OhdTR!_a4V$F}_;Y45me$F7T6Du9^4sqO`JI$|SggA5YVlp# zqD*74R`#EVW-9Cv-3XJRFQeh=3iyA>+6b(+o$jGban`I{)mgy1SSV*P^jU>J_FKxh zAG)J1?!k7DZto^CF!e*g&O_`6PZ^K$M>b=FT?s5Z$8aa^byiie?<=+<19O|CUzX2| zlgm@0voZEG#tzKUNk4Mu-RZKW-1~F4>3WN&yF}|*QK;?rfQ&H=y!=@8qb_n%Z@(0i#Vo!z+4~y^g`SmX0 z`;xd<&_1ePT5xYsY0GLcvpdg|AGV1liK36-vxqAS8d*k~NcS$nhyFRBR17-HkkK?qR|29R7V>a+AV*?*yoTKY^DRCug%+`F| z>mpp~V!1GHZjm1=kw>CfOxJW4z0<^Q>t4Ya`mot6F;jm6%Qdq*?iG5oDr^&ePkRvY zB`S_&^LAZ*8`}hZYPA;by~7&wqeE89j}CcKtI_{liKlvntG^55Qs0$^_~M1{p)b3v z>omEj%kSL!6~>9y!j;=G4_!b%$T9NWOtRjs$$flhPwsXYKbiTIAMa7(BKYAr;Qm;{(*q0zh_t~Ud`i#=}K1tGyoROkN zj!3L`yEFmj{$r5u)X`me%?=rG$Q~Gm&rg~V+$TFY- zIV{?08lPL9a?7DAQwGw0*IszP1>XDV4D>-Toq;tR{l_p7KSB#vgK-G;_)Nm|kvyO; z8W;=mZ{a%&&$qzyE#mn&(3bLf6wDP$Y5Hpn*Oa#ld6j!!%hid@zn?Gn@4K$SD>@ zdQ1B~!e{l&3c!)gyl=I_R!zGa_jGXXX1#acTU;-9>uh1ab|4V#5zcM89KQ5xDK)!=!VJJZBo-UZtKLjCu93FojZNE5z~q~mIwNsI4}YvSEuURR9p z9WCuc|8)S*5x0nwW>_!1k3LEX-YQ%RCl$DB5H83|b`ZC2#yvj1PTpDwzYqAHkkkO> zw)4F&w1b`U3HqK?b+Z;fXk-xHnKCGbGv?V9op#*Z*-QP$La*0=~Id; zN_#@Le<0%MO6Xe+_h8X?H?{@qCYURMr{=K*4|9Kow=Y)5#>{T}lFp3r`;&a1?)KGL zJJ|&O?shwtKXaJ<7-a*r-%-nj@){6M#21Wjp`SjpN-@E2BG9*T;9Ks(_2f39hdk!l zZS7(%P7(7n7U9Bi!L<|8zd`=LIjBIrTtK;QfZ@Gqj#QOxN5XJ^f0A^v@%tAC8dzN`&;@2<*q{rMm{lNaVf}v~!utO}g!TV{2@Uen%Cv%K2Y(6GF*xu&hbzPzrf&RJ(`s9R@mbu3@m+=@Bs zRxrj&9W~YYj%tUax~u~K!vEFqn&lbu%mrzAixyf-7Zqpf8f~sL+bVkwE2yxdi5V+i zlxMUSE?StWW31I)<7jTGqwmVB_=d6aGD>0&M@>s6RJ_J6?pL(i;eWQ+0Z-NVzeD`b z>&HSKgr9j4FKNz0`dM=xepvi6$i8i%sAHkEjBch=!8LV`>gF}}*6A$Ck(t@n($tdK z+T84{v9GDCwzKeO%#-9`EU8X3O_!rfs!7Vgau=kP6&OqN%(@44W~;R%efF%`lPCFM zf-jS5=y`z=+899cTs#ZoU+{bU+tyZBlj*3gwKv)v_%2h058neoZLLiR7Clos zG#K7dpJzJkt(X}f;GOy{PlLgxYjB&fOnAp1t?ex^2Ict+nJ7lRQbJfiXU^7VP+uSh z6fCr+S(lU)Wa^xDmowef*pQ{GuC=u~?9QC&ZO)ZxGBukOHm!k?uF)B*opsGkjPa{( zo~^FIUK5o5n5~s1!Hd#`j(i6UJB&O0V}x5+P_`qpplOZ0p}EDbgUXs5nU0+4wN7VC zW_r5lx>@kv(QIp()!e!&9dFX@;*0d@I!C6xsk*tQu4z@7v%SIoZNBB%)2HW7g33+J zHSKgW&(_x9gu9h^g)H`5M`m6_oxRDKogR26(jCrLC?dDKq^YE!wY9lbWD&0?W!Ko9 z&=GLs&%ql9T?peVU`s&KrW02(uv4jD7qi=Vkw9_(>Xrhv~8HrU$ZWx z=KoPV@S_31m$W*mPM4)?av+TWJWVTGWGpe}A^BtYytvKY+Fs_gIqiVib+#1^FwZI$ z6zgad82=ZH>(u7|!L|kAcw6RZ;7jd}mgXjh3Rl~=L(o>c6SC#<@e~h$NjIzDW;o~X zFDP#X{KIk=wK;XoD|Lr|AlVDjR9YOl6VwjG;mpYZx}GsR4a*J;X(m(Q z!1p(X9@jl=C1d{C$i#in%)>Hhf)O3YNe47oorze!V@35shof9Yj37945&M0{Xy~T@ z598KkKXOeT8@v8HSVcvwv9&I=HFCNac$$0z+@gd41i@HEYm_dVu!gN(h-=OYM|FAi z3jQyw?;-CDq+$Q#{Ymwk?Y0_wD{lhP%itGkkE>}nYJ325Sy=o3r`s54!HwbPZJ#~o zky#n=-)x*KwQbJ)=Cw4(8j+dNIh?juXQpmNT~m#2rOI}wd`@wl!>QgEVnSJ7Nq%{0 zF%vk4x6Hl)ER4sd=i*|MG0%c^seG5eu%LJT0)yWbESzsO2R#e^JU9~AMsxz&Gpi=pAe7A6swQ$}N z#!3XdW#y)_ywXAw!cx94@T8lVoRXbuNX^QuoSy!~vPW~C_5jb1$eFY@J!x%HaZ)w# zqPkhYuNj8)gRHPr(OCAlaYqn~49QW<=Q>k{2h3@?qTupv*B zLj{YmT%F4WJXCkj(QHr@;xqmw89+C5R)Lu#YXpG zrcQt>>RHzYd`k_DEec7nP(rmy8FQeS4r(miX8Ql=<}a|4+yS_;ut3nj>V{^A9g1_* zR)^skm%sRUtMZ;Ye*761vx>BGm~LstRWPOSEeTUeHM6Lzb(p6b;X;V0?(AA;V?%EC z3Y`AgwX+31gPZJh{w|#|0Nzy-4@J@lzM}e8IBGzg#P&(<(bqk9Mcsk&{%Drpj=oWqBqh$`M)Bd+WmLz`Z5t9y8h6YU-Ndx~8ti zj#m&hS0VAWwX`(URojR?z&2oc&DBo3GYy0VyR8wQ2~XgfiubE)a3~o82G2PxY)%W9 zb&x9!e(CT-$j8i+5u5}1uocNfQj=83-Y0JOD)#mWZ>t*o`W6>SFD8J3Vauwe}3=>Np%Pn%`$>4EB(<- z!~Hok6H{SA!@soUvl2QUd>}am^UiUxYozLh0jx<1CuA=q$C9hH58xA#0vx+M0vn_K!bT$sPyY+RUMOlwT&`x0ZRaRCdw2QU}SQ*(#B zqt2|bj>@~BV8No&pmGbX>b5P?i_|j(C}{cepH%{`RrL zyfNB?q@5B}7>xPLOAE?M7A-6*2z|G>yZ~3=uZD_!_F z@Kp6(abX#tejrc5V=xhxmy|BDF3KaG&5tjF;aFb2kh6KvFp(C-js&L$+DNQSXi}h` ztOcbDjm7>B2=C|8`Q;0cX$onBX;JyY{4!SFRNn;bu}+mWL6}N%jF#?`9Mgq36-ec4 zFTNQ&AEgHT-H!E#bOOlRtCODy0IOnU zZB1+ethd%SJ9`{>I%{nko7Y;$%4|+nWNTvc>?_y;TPriRw8FKW6+!-@wgzTwTLpBg zg)ORfvW3lSSiT+Bt0t$twaL~1bf|TWy;bz@!e*zgu(74V-Uy9@8ca6esz5Sb3#FBD zsY6%ZWLpF4Evbk^n$B9+Xm4(F5_hC~43=WlnPOpOZ7nUp9C8^3ODnanZnJ|71EsV% zYnxl^)2*WA`r!xq>fe+`vtY-ng+3)$$ty4v1C z+$Sq(ZFaTmj8HBVCYX~znWAPtta;5%D}jY^viZ$Tc2;a}TIH+_M6o10ca3mt0Xbqnk@bv7L-sYPCRNvs<0B>>g2l55=x zTrKu$r!7?L401zTgR>3>MweIHj9fJ!!Wt-}#NOIyYl7xBv@_mKWp=x65%d5b%mpBy zuB?MHfQ!{p|G*MtZv?Pxt?kg-8fa`aGH;74ED!iL94X$T)V)n0<^}iD{KPp zzL9f%3!8P&g-%?FV8+3GQJ+dceysz{QlGJ>opnusv}J4SoYl1;Fe50==IZ7K2jaD@ zZY7i8&q}(xWE%Vf z4H3|`1ht{1VU_5B78paxQH_@t!1{6cXSFjJvR04=Bv)EXQyL&x0~aV-8+kL}W{gB9 z)Qx`}K^^UATqzpv04x_{?r3RXnw4$NwpO6|4K_zD@SBZH!$lClvqqeE%&~SQ_Oqk5 zxw?L>ZH+x`C1rKu(BU6vbpxj3g+!V0P*fd=H8_q=L_qo@ZUgCU4Qo|6pj0N|pS3m@ zHV2Rs@76X7Oof}ZjW#s}?$$Q0@h8DoYgClRJJ*UvHqMpiT2be0w6!o46~^NqmqXmF zLujj;8(W~&4z{kYg=z3l=s&4V3qJ$=O5j%o-~nW7y-eyzhSaHWMc(lqxEkPkH(X2L z8V}bhxZVp_EK!210@os|K!D;5wd3 zoe0e>aMi$d0$gJlswAb(IJn*l*F?C+z!l+|3|ABvZ-XnscRO6?GE`$qo!M}m0#}4L z7Ou#O-2qo*VeW)$1ze%cot1D+ge$h=F1Xgh^*eBN!!-`By>R_5TsI2%yaK*KM(yn! z5pcf7+tG>bgp|$$jQXMTD5G}M`-x0?E*XA9OnUwVlQzom+r;y)hkjpQ0YB*b^|kPG zLK-j2|1VeZ-%8JDd_EtP^Nbd*Tj81t*O%d%57#Ylt$^zwTwCD!5?p)W`hB>1;kp^F zyWzSCt_R>c0M}#xAA4^f9#wVykIo4L1Ra;tDnL`Lu z5x$Rb0>bwY<{^9+A?QDS4??ti2J+vGcF%zSoA<_;@qh2{;npOAM5w{Rui^i%pnt}9 z#sV50#^ci+#v_==kDo@E=rDFHlKiJ&L$%Xu6zW)3A@9V#>|GxhF`tR$%|Ihvm+Rhr8?CUyuQ0USyNyB6f zQ#4G~FipeJ8jjO&l7^WY=4hCw;X)0UXt-R%N)6X&Sfk-)4Ik0)Q4M!!_^gIIHQb|N zgN6q*Y|-$rhOHV#G(4_hhlE=l8Y*A5DnGU=AGYfFx9a$}>iDiD6UtMX&3@?)#=W2^FG ztMX&3@?)#=W2^FGoAP6u@?)FwW1I40oAP6u@?)FwW1I40oAP6u@?)FwW1I40oAP6u z@?)Fo!#352ZK@C3bo|?N+}m`#+f*O6sXlB|eb}bs-|lpE~`;UgN>Y51syk88L?!>2WTR>K!G+^OL%4fklcSHlJk8#O$j;Xw^s zG(4o?VGWOH*s9@C4I>&J)9|>4Cp7HP@U(<=YTxQq{&gz}r}D2;`PZrZ>s0=AD*rl_f1S#|PUT;x@~>0**QxyLRQ`1; z|2ma_oyxyX6y{&gz}r}D2;`PZrZ>s0=AD*rl_f1S#|PUT;x@~>0**QxyLRQ`1;|2ma_oyxyXgP1Byf5uGW5x55?GA{}Ma{{Oj9a@M|FR zzGDTy4)W_eP4KDUY2P`5Uk^F=Eff3(@T%{6!E=@XHwB*wo$UK<#cP1SDEQ6Lt-fz4 z4*B-|t>Cv1{y&1}Lk|6V3BCY2+%HM+J0Z`0X@V~TZ~9#&_*(F%U#8&eAnSg&DGu8D zEfu^5vg_v;JV5vc!A)VFTPB3r_32`+pS2oOAzMamXU6 zr{b7A> z^@>C8Nm~?$?2^8%IAoFZtm4$>%Zg)OB{eDz9Y}gl@E>FXZ&e(&C+WE0&q05ZzEm9T z^zWrO=3oCIibIb5(-lXX{WApr5&r8xO>xMm|7^v<|NeI>4*vJQM{)4H|3<~rfCps` zX23S|f0S`!BIMiuhm!s)%)9gUSWJ9XuIyzt)8;20bkJFF?bfZ>fxG zfPYuhv2G7~LGaQYz?J?%ROUm~JQR ziGnYIJsB+eU<|?72QQHH)u40m-Gbju!c@P5IM zK#qfTeyzs*8r&|ppZYzcI)*lfBneK>ONLyk`h&G~$Rxp^guNOvQ*{r04Y^(G!d4Gi zruvCBbV#-Ggvvjt+1?eqs9 zhMX2W2{KJNUvM}0mZI~nAEl4iHnBFPC~uQ7-jq_oov_0xbyB9Y2KXzI-W&W$`K_eG zO>?BE9xjFLN>M#5!h9LpSIb~5Lq{slGl5?r_&)G$=#A3m!Uo{COZo!n?a+HP9r{1? z0ZIQJcsTSC!RZ%whdw1`7Jv^!UlM#W?Ay>^NSTkJw?ls?_zvppbHy>nVXALCFvo`p zPaMx;ZVnqK`16=k!)_4#b?4nrnD{ z1%HX!R5|W}z76}0;CsR6VSg6<8H{Dv3BiAezJ{yKJP6u`E1l25Hyf_=;(M@}!)FM- z8@}RjwKGrD0QU+0CiG#r&V}{Rli`mEz5)Ck{=BAR4i4WZ_&RDwX=}us9sU==e-E7> z{!hVww*z>G;*eLWu0fw*EU9W6{m_9_mHR4;J@s-;&!kTe3hu-Dn|h1jVf2-nFL)Kk zn7T}H*vZuOf>*;|PE}jv!&p*vj#Oigr@o@)Vc$~U)^zIkh~m)s)PE?Bbt?6Y;P;@f z5lMnqg3lw;703J?q54n>`!?bx!D|Sgqw{(g@FE=}=GTaFo#U|KBh-HW2|m&YrTLGb zXT)~|KMFcWJSTVrG8(Z<@MBAWAJp_r;D-f&6zj_fv7Zh)?-{AOu?=G%sXTuSx;Ju+ z;15AABV~R$Oz7~)I|L6*1zsUI-5VJxeuzQ8xHEFArh^Y7)wXYdj7F-STnil-`KI72 zpxYzW{`|2Oc&p%lfK48GQt;nn9URqL@V`Tjqf!JPjq;<^Ke-V4HcIs&6SR%GP4Km7 zf0S2o==ms}YwN(zQK}E?U^7RlZm+`{H>ytM0$Gm|`{1|;_HERwf)Bx7VAO|#XJ8JF zY7?A(;&qhTt_tX3TB6dA^t6G3AAzw;Q{El{Khu=vD>0AK#E&xW0^iaW3w}HFKTUip zV-f6j+5?&n9;Q94dIB2KzAx>(55GE1?Za7V} zPouh<1it`dH=fphVH=H~3!c@0|K8Gmp%2FI1gE{H(XKe;lF&o&%i(J!xCOrqbS8|{ zHZhM9u2LMjm!Px_-2r@|;+V4ucPkD(Nw`n&>(YTgEclI7=7)k`Pwh8odB`i_W5I{R zh9n#p{0i8y9=!#JDmi*6uRIt_kE`9{CxC_?vlItyJ&F|v-+EL@`KvMB9s$8G0k3*& z7yLr#YL90HzZAOH<5j`aF^_t@EBFL-+#@3R6v(m18No+DXPhd>@oB)XQM>{8t;%!I z;9Md2RhawEdj%f{8|8dR+W~FP9|(R8_~YCw__g4n^FytRwch!O;8((yI=@oB!T$72 zG8_iQ@Yi#M4ZqBWUu(ms+3;Izc)kty+VB-Ne1i@DrVanG4c~9WKeFL}w&5Kyyw`a) ze5ef{Z^N@}_xFRxKFNmX z+3@8y{C*q$m<|7#4L@MR|6s#EkKyOJZ1^Y}KHi4gWP09A8-AM&zukrx*zmh;c$E#m z*M{5Vd)_lP{O30OH#Yne8-6;5pFhxsUuMH?^q)V&hUeLEn|_|Z#D*`o;pH}bl?{Ku zhHtUq+ikdQT<8DThTC-Y{9oAc4{Z4FY`AUg=l|1&pR(bdG2CUF<1V)iA7aDPZMbb- zyRNa}H`;I;4_&v~@O&G-D25yGIgC=k-GCJUTIW{+$^jJs>`9G#09Al$0DM8i4_F0Q z4IrOlE#O|jeE_U|#(Ka82VcfEHUb_11OVj61Ob}>4+6;V2m!tUFahvIjWFOLz{3tc ze5D7e^zhKw4#0Y4)C0Z=_!a=Zlkphf+ko!?;Aa?50G(eOGAr)qe;hBs(tr~*_2d;mXS6<{@B z4PY(cUch~Tb%6DN4S@RrHGqwP2LJ&;Eg%Tk1b7gz84v<|qX$@#faw4j3%CMsCEzN+ zI6wwqJm6};1i(bVHGpdq_!pmz$$%+<>i|;$*8^?<+z7}7Oao*AZURgPcmUae8GszX zOu)^6TL7~Fxq#V#TLF21+W>O_a{==J`GEO=1%QQs+W~g~?gT6X+yz(+@B)?q3IIz1 zg@7VJF`xvnEWzP0G5#%pFyJA;!+=KsTLIeu+W~cedcZdU-vT@ecnt7uz;^(T1D*gp z3HUBx2jF{vrvTpvJPmjT@B_dP0nY-S1N;c^Jm3Yuj{z?NegfDD_$lCLfR_Nf0J{M% z16~2_0sI{BD&RH1Ucl>sHvn$}8UXtM`vGqO8UeomGy$3c2LNvaehK&$;2_}FfOi1D z0ki<#1-u7%A8-ip0pLTxM}WhC-vT}c{0?vg@O!`?0DlCu0{#T}GvF_Pqkz8x{s#C2 z5COCS{tjpd90U9h;2(g00*(Vd1$+kh7vKcobHGW!DL@C{-+(UwUjj}8z5<*9bV8RM z00WQ!=mBs7dIEX@dIJ&xeE{bH&Ih;veF6OdZa@;CKVSf0ARrkq2rw8h1dsw43K#|$ z4oC%z0E`5T0;B;h09**T2#^lA7;p*TQov}y7yz~hMkxT>9D|M_$^a_?*eVzmfJ(qU z0Bn7XYJd;m2VnbPtOj7qYpey((ZGEGY%PuT06NCN7SE`GiQ9+}TMQ!rs09Q8n*a|2 zHUmO{ZvadHwjV|qfNiNkM+}buu)Q+20k9o0>HzfsIvV*F;86g!kH)tF-vK-hz!uwh z67XHX4#4*SPXWFUcp8AMjPV1&4*|~to&)>{fbF>P0)UQMUIhFEfGx4{QvkN52Da$N zF2HWU%Yat^djQzx8Lt9f1MCI74#2j^coWb7*az4Tcni=7z&6Qf0yG1##Wk?SH+~8D z72qJ?*MN5b*fJU|fOi4!0p15-TW(-$Wqb&rqo2co-vT}cV4Gze0sJ0-?XvMlKr7%+ zfIkEN0yqlzE8uT{Pk4Xh&95x4lsC-h`j^H&F?f!2&l;a*6&1~^(2ufqO^ALIE|!s} zpJSL?9IHRSw94l%D4SkdB}q3GlouA4<@kJ+GptfK(buB7PsyvOwvzZg`LlYUueg;} z6cpuGmCf`OuZ&MzxUy_|MWLj5%IQV_1;tCN`O^!Mm|a?4TD@HHs$v}r$lwn%&+6c-f5 zwKb=BS!uPexJo{M8=p3(qQW;_zLj^5^zl~4%8FIR)5^+X>Qrsd>8fROipz^vpRMX= zCEM5!ZdH`6DyHw>aC~mj3L)7d%3?S>l%nV&a-xOrIvOwLiDGyvQ!6SiIXp7T@hD zT?-aL7ks7F{M`^M*{2_XkWXtwQ*#T}oHN7D5c*EXt$yFRva6#RF^=C$^6r!+mfBTa^2@t)W=pVjx1g%jXR{{sHAga6 z^hH&UOfN2*P2XVE2&k%9D-qa-BEjgZnSzOk37buyE%46Eo96RXNvh!B&dj2+Vq&E& z>E?>1)p^BLGIm=!I80gdDtrZH@ySxO+MZZiZc9Wpt6QMRCKHzJFIOeAQuC@xE5HE^ zN$TcRRFq--U7~sP{g`V0bciiO+mFWS!)wet#=&E`@3*CMm$N+Hd#wQQxFyW#&-!fKbaz02@vJTx**%C$DpONvC3*{>PUS^6EiWxAvZaCuPNGP4e0nz4AzwG;S%+i8v63mJy0V}U ztIW(UIgrNO(xqi_L*WdB-86)dKWubX>imK-zdgD7tmHiU{(hFfqy&z{8chNVeU>n7 zNunQRY!@7ug=J;rPOU6nS-7%N!pgNA%6tb>P0N0zPTWc#Pjl}|zpr?Wx5%=r@yVrZ zJ>t{Q&5EvR{_^z!i@~|-@=9WFN&2kmS+g?6PeKaH66>nZ%8=fx zs|yRt?aA;S>Hn(2g6d+H2IHExyh=hVouq`Y$S?6Sk|x4(d*$*NqQ#@_;2(!Dy$-Kf zD8HC8zYM4vYFk#ECO;Vh%e->A{7i^0!M`d}?ei~XlZ?X1C?m^VShBL)bp0Wc z5-es=hKdzLxYzbuB;K1U%ly>@4)5&Z)%tm_9I&d4YSZ-h($8yn`GaxZ<&xnoD)1FJ zy36qCs!Y<8Wyf0;^`5bGK^y4X(_Z?TY+OPCFSgb=X%c$n3%p)g5sE5Sdcjz)u!~|P z7^%0MCss6C1SV=4wLqA6mCRV~rAo%<1+_N1sHhdQiu1^2RIyrB%cO86Z&BiN9bT-t z@GDB^>b|I&CkjmiUE%11cq^-ydFk6n1y!0L16Dgrx>=4G_2H{nLE5#dWMzS`a5)(b z4j{FHYBXC`Twsx2Qd(wlX$JiAs;=8R9!fdyR7m;!G{N3p`? zQI(iW0@NQc@miHRQ6gUb-dub^`lS;uDI;mzmDglkJ)Y-$l`oo*;qa1A>y^N!Snl*E2#u7fkhF@*N$J_7>#h391^JrNik445;WKYYRHl07Zjgq7-{P}!Du+_8n z030hXutjN9w&=|06fTN(ev_=LN|r5lbzE#hTx?=A79*R#)9zh1jdYDS{>!js&ZX4@ z%qv(`Ec5Ql@slTC>tJJ2Ttty;#GDq-v(s7L-LP6C1LM(-sn#?8t!RR~GRc zr9&Z*8a>g9kCPinDYQS1D*~HD>f@bVkwvZ$JE!az+PO4`cYLCQv#>{jhDWtmc7ojr zNpjBOogABxuV1x{^p?&!R6$jLy6CW`#+Qj{F;#L}Yk5{p^#eef?8Jky;Pn+1AcwNM5qn)Zo6m+#4)>^j|rcIhu zGmQOhN$E0wRk7D!g<;5+w{k6g(3w4WjTW*9ti?~Ym~&|1r#&Z3oRtz+$nF;DPB|)A z(M?KH^5Y_BUQFnw>_qTmlI;J^_v+T+O-at1q)1WgwQHKXbay@?~%Vx}LW!i(eNJqgiU5%Erg}WH#pC z*zsv)WnH4t!rgc;lx#aAqiEcrnIu$oIdzLqwNBjFX{xNMD1?O&zf8aOE53A>0(QYb zX+T*)ScV)NeYC43luoQ^Gvo)_qbcUg26M+?O3;4(Jg(Ss6lObbPDULS9; zDW$ZST~T=DrA5f0kNc{#zmlFHurBEqP7Zr`&j{~6dMxCvE?Qxa(H11GLiJkkdZq5J zkWfY^2(iPYY54oL(S20(#KKD8E#PuG?CYB1<(;>c zDn}Zn)!C)A^x7YJ!2c}9CajXYSKuoPs#Y)p0g!G=s=quIEyFrZCO(Fh$q7#-dZA66 z^h|Le6fdRO!J9eBDPFmhkC61t?Ccb8*K*a>rOV3CPC2Wb&sV@3$7o6sc8#>c*;AB- z_N1=WgkAPHMjw|_P4f<05l*YbIIUwX#WCdzc_CdXd#os1XaT{pP78rN_M=HE{H%=0 zMJ!Gw9k+RDCd>9);&z> zIr@<_Doa1SCxLfIyQ|~Q9jjxfjZxIQy41JaTUu#5O;J?ORLK6528s6YYM{q5 zg}$n?N~|l@%i`0Ois<6Uc^2noH8?9NgHP?edTz-lGos>xR`bcZH+l#dpGqnI@=~x_8R{3O6K0GvmP8eysL|sdUX{o>@G3NY+IVJ+?GJI znU9&yN~ND+^U|m1zyACB@9V#>|Nfu;d*_S)Inx_q4+nkJo<6YeaGY>D96|bIK5%-= z#Ot+wy~*}hV?;x$-&5P5Kd;yNg*Pi6U%v*Oym-68VS>Z<=hW-xT&GaX`8nDcS8OI_GV4*Xng5Z>URx-)b6*w6agA^dYZ65}I*H6Abg%~Ja9p=v9Bc747) z|42L!df9NV_ijI2V)@aZZrZ3p8{bFe8nj`r2i`gdJ7i2m|0J$EYv$}*Jkw`dwRakh zN_wkchlITy@#F3bpqC3$0PP=5oZ&EtQBFr@@tWd7Ka&K%)3^MpE3dpNy9z$X>WZor z)mN33E~UeuE3dwipGFElsEx=|hU0JO;DtuR(U>OlRbM`Ej5Y-55`T#y?{cK?H8`G3 zS3ZdrgpUE)`E$eZgpE$3pI$C-X?xU{@Uthwf2UU-MEZTDWmk^3sFwDu@pF4lQu-eM zi}vVIeyk;GXF?oZ2E$eU>MANtu&l7qTYY6lwDYcYdi7X%R-L(gcyVP`jN-5VzW)3A z@9V#>|GxhFfB!E+|1Ip?d7sa4m^H7hHXNO;l4jOC&$0Z_U*`vorJMdlvsY+(dTMwR z+${&NlyLS~1j*q|tqx8|3TG!GaGBYu2olX~XR|ZiA$iV7&L|)g(jyD%4M(6cJ)>dq z+i#)mjmI`qiMvj4uXl$09q1{v{&aZ#;n39d$a;88rYALUCZXALbRn%NZLT4vdwwv~b{B z!BS063TmaJ1%AIBB=ATBQzbt+9GEAVEAqjk4oBOEC=@tjxF39%>G2^myuB3vyFD$Y zCkbuknE6E5=(65SSc)MGnJ2^p%ZpMpD;%hiwCUl%Cc&nfo@BI=Y38TU@SOJHO;4W` z9m9kujToURSb8`Rj*jr>B{ITrV7S*B%M+A4FMS-1$2R217vI7TtieBs@ZT3g0{N+- z1d8;>cEG&rgb69FKdti1>1CJS`qSq6L`X60KiuqTW$F9U6RB~RHvY^?YTRAxOdyV( zTEN6ONj2VG!a2de8?jn_wN{1JddFY}IO$uRROe|<4+W3^yR*~1d8e&rveulaHA!tv z&*AXvr%|+r=ZO2|aZQ{OT8HkP>5*Znh~^$P^N)mrM^Pqpe6zEE;B`Vf-L?5t{iVs< z4DNQ%b_m+jN|c8^N2&JeL53s8*OxNCiOjZ(xw}@g#%D04q2LKL6uB39m==fN)<#AH z2klMn+71U5J{rn)LR-v)PK!y;_({Mgg05D${1jLRVkN_H{Qo9OXDBxDvnhp6gzx3V7W*km{&gOGjQ`h)9UmhN~oR3=E$ zlj3JE{)~n|6cuBM8 zo!({OZaA1iKb{v%qMz3DKmMO9j{Y|S zs1@pc+rO=W^)}ZZ33mGWnf}(`NyKuG2H*CNHa$n)cvPF-{SdLemCzqC%JciXK-+UM zJ%jK0lFYD+S$2@#@O8BJGsDRmC)q_N&`fMXn^dtR*4&-3=JJ4UY$VZzj$1O_c#LL? zeJu>{P9vgdIXv3r`2cdlu8<~Qu)T0HY$&A>5j_(&fg1e6aId>Sy}Y6%3GwFoU} zV@=&uUS;h9N|A}TNQyWkX(u~7+lR-I;W;9dNJCmym$Hv()a#_bceaQD4i^0%^tbbK zp5bC8I2EndZZTLZX)tVyVN3SsspO_?v6+zn-odTZ!TKcFj^3vK2y90`Gq*MPHe&fl zgYU(gkg9J)=lrs7MCbe>pzSw9gb;sUGfYen`*FS*rlGR&fQCg*blB|2C9$@K$J$Ez z2HB6j-PjK^Hwh{Zm9%+eslm6Q?eXh^FOxNSH)%mQ;GZ4y!!9t%t4?7Nq^q?K2ST%1 zLgdrBh*|B+%=|PAd}KJkHB`^#=7E#>V%5QIf#gsl|-aHoThw>x4zrnJmYSF$# zV$qJMxJoAS%YTuSTj87zR3pYbkI-xK?dfKin&3G_Z2a*lVIzwBc+VKcMIujp|cj!WL?M9c*HHFOSF+l^Jix*q{-bZq-6Dm=Zg`$u6`%G0>R2 z`0ci4cwq5raO`{-(U;dJsg%u^RtLrD|M`QgtKs~kp(Zon-4adgRawS0=o!dj-6Wi!hF=lQew!h6m2V5r3 z4?2N$%Hon3-Ke?JBeyRh!|%H)%q3LBx3Gv4iEAWjY;eeJE5}B)!|4vb*OMnlQ!o=2 z$6+-{r|eWLQ5sB@%868&6*p52YSBX44Z1)fb}61`X_w-8fp#gLo!F%`1y9%;WsZAx z5urQ1-M4!}+jT8est%vFHE_OCRdtTqRG9MLSwK{w_Li?~waF7F!A#)V{^20n%1TlG z4LwK0)DAW5U!Y_qk|>&jdnKs+l7sZq94tJ+f$MV)8a}s?&`$^O)5Y+^gO^Z2bT<+G zL^q(};B-|bmDKjWG?>GoPlF90%U#FSHoFpN25PfIwAnkj*-QUd%?>}WOS6|sv+kF< zgY!7<%L(&vgbOris(J(TKg{Ek^u3yX38yzi(}^vV-Y-b&M`F#r3*n6HB3hMhw@T!x zyJSnA-Ghz*KDk+!1Z>vd$zy?x3I{&3rS8d-^2cEm+WMnX&2FOEsM$?K8}66GJcKaC z+(9Z;^ExY%yY?@Lm|>b7!MEKHeSp}jH0Mm7j-Z8&E6+6Qth1hGY}<~`q70Qegw3uFe_`pgm^YEDnGKt3`zZEwi&L(j(zQI$(K8jiLt zlvqEGD$Yp^)lUEtxYy-$KX^N3WVy`R!1=HQ#^KIZ_bA6pKt};a17-qN0|Kw-5Pj|I zp+jbP!U=0};CW+CV=^uRdF^+YLCS@vWUgTu_CPAa$xZH?j#GJE*dw1mfYM{ldaLxk zT>66tx-Z@Q02|r52KUPiq!ByBd^XT=%5OJX$0^@%kXTr#6X+~2k(U9g|K>(w9rraY zF~rM*86=s9HqojO4!or+wCxaOWDTEgh|xtnrG^ewDnuCEs=+CNpbrGwq#0E-zVZUwFFm#C`0N*20XeXkt{W3{o7R;{xR2Li{Y z!bzc(Bf6OVXoD!x$(pVwSOa^o`rJu|2GJMqmx2dSu&sgWW;5a6q#?~u4CNnc&X$vq z3F&XJx3NwJ8|4Aq`KbOqif-Fy5G(SciJ| z&Hj&@J%^~>jFV=7M}f@CK^**up?Y%SaKu(qTI%y#Xc}Yc{%Hf9I!}#x$~l-(_MITR z$u9Ni%)o=|rTxEeU_A_ZjzlJ-)lk!(?|_+sGhq7~C->FZ2P0q1!aN2+nDzAk9&&*& zyKCp7P+)zc(HuO1Wb$b?3`G1kvS<$XEO44Lq*gdE)GMY0gSa zyDSZXYu>!PtD3WtGOo<%Thg4Be4Zm*@8G>u(sIN`GvFo%W{@3+Epc@=KZ>L|X##nLG8zX-xFXUF5X4NN`Ak z!xWIePpy2p4z1MlZl%6e_@s_M7+mA9o&I@RA`h&mS#Q$+iF_y;`eooxqxSv1=liXF zYPk_}dw}!^#BN@1dD+gexUkQ3s_PL5sIGa}TS7vOwpxSLi=3E9=Q`2C;1Og-c5yjE zLs?EbU#N10{V#;FX!}aUMOxO0X=)a=c*oko=HC}@$Zoxl25{f{m?4{VpCvytaQ}Li z19_=(piAY@&@(_0hYqBT; zR6IyRkV+OA(X-X*vN%hPOsX;sRWki|MV>>yfk}OQLz#lWB&W|Esb_4kuV=(0s$SA2 z`K;CKMYV@ehm38#*REMVKy1%FSfATAQCTL&JTG*BWF6^g*77mR`yJ03zWEs^Lm!C* zv&|suT-O8PWH}H%d7t{|K}(~}-qcsMhd{ZG9=)t}D=xOa-@*I6R5= zx=(4N^`vR1#x#d_@0GKp=$X~`Q6e084UIL`UcZ-jCDJG@?mZ7^JJ+IATP6>7U;KDh z-b-g?yUxfCjMg9D?cqREe4!jB!#3WJhTwbto_omW*w{#VWUaY@V=1A#I;;iv zG(F~>kRA>Mrb;J~FV~=%_s9*BXS$Y%UnJw$N zHB9g|;lRDN)a_KEhg3)l2g+<&YbeVpSv_B+A((e{gj!7h>F5Zo=hNgYOqZu|(KP{n zYx!y;dW`uTY)118afJ~5H!LPwB!=)KSb>6?#5j&|Ev5I_{ z{25y8=nPJMXERyfQCEfhSYX7NxJ`Piv^?A1c~o|;hbAQ#+&kv0bpe4~^RWyw*j2>Zb{O>vb{dJR)VA-L>Cw3QOPg8*$u!z%ORu zKBu(4N#iRt{+Pz^bUO4DtVKt2=PF^_O6~n>?)?s1?*pQ}k8s961$1evJ++r4jnfxV zDSna0=?kmU>p|`HuYR^{l)1$rj-vkt)5B{7*c51xXAV*x+LqA}c%9jb4NyG&SGPl$ z-{CzU)lQDqPBKMe|I2os`U~2bYY;6-hOgp&mz-9QY`am?65O?qGNnm9+`-F{*7h2y z9cxI}eziAOm);V!H&z8UhQmKWr+?sfs2rJqmT0TsG@aJiZ#{I|OWS6)Z>ga6as)M# z9KMU9xlTIZM^8(9BnrRZYP5YEo%183*k>)sG1@reHmPw_vtHeZ5+(Ec9K@V8#Kn=b zra+BOfnQfyQ=rihHGa8@ly9+3`Rc1I<)iz`&Fl>`Q`jTqna`NqS8+zxM%!FSIw5{I z`dY*-m)KgqPD*kKckL)6UbQo-M0I;BtrInVO7n9x{)xj^Z&D^x$+q8vEqXG|CSyGKw zmW=zDZvWL$#qD;w*{iV>2mFP$b;RhlEoY*8DP%bBVY89Z8Tq2paCEYu+xmP-OCVY2 z*b+GD?3+#`g`RiO>1+@G(7*<#(;cL_Q1iwfD(9}Hn?>zpBZ74I37c>_#;xBU=;#dx zuC~S3E3hH6cl+J+zpo^)A<=LLpX7q6@;qsF3R-sO?hmnhl`#dB>Uq(<_b?Z#!|PkE zqb}Y#gCNJvygOMK4!k;1l?949?s{GtvxrLR*PkBVbi@&JaBUNV)$1wfeft0@W2H6y zuCtSuD0(J;u4ge*>9`U;t>-BF&(8E?2qGsdKumLx7NgHQJAGN#z4VV*wMw#& z_N_iLvd9}1I_DmupC6VgP0n!+Jr#TgO$RZ>>M4`EHePue|2H{%p~#`Ie^=;1;t~~q zu$7S`p$CsL(i(b@_!16$(8bFQtfcvTszbDtQdX^u-{Y-VNqev}E6+Zfn!l30Bj(ft zr$|+a=iMA3l|?reo>pqM$@7V`*>l8Dz9xu#_<7BrG02c-mtMTth2b9Kqtsnt&nGCG z#8i29(lnDJinuE^k%!C4XzU{DE~W>4`Md0U8e2!9?S-?jMXE;mKu2e&nVviCvdU2P zo2jMzU9@R>s|?N#5!ALMfi3~H>M)wSY(bsc4cSxTNkX}Jk6l_mzB1Z!X<2L!$%mFJ z*$TAvr45Crq1n?QTst5EA3rpC_9ZlX8VN0F_UxCFg(Qa~I>+2)+-;`4;dRn*q+F-`R%(Ov2&F zO6tzD)6%7`8pMi)uCvR!J!MF9#EW>84Cs3MfRfH0&{r#DKx^-g4yYXHo=F%`dq1Sm zA!Al@MnmXcxawuGDHM7qYR?|0wmgs1VVK@z4F@KU6Vn>@ycqI4O3nU|SeE}Nb^87a z_DI8fuE#(lzu*j1C6nO@PwzcDtuX5hk^hF*P{u{TP69q$qvWH zM&enwOJ{y7R?j!Wv}3^fnM+TH!`thKWUx29{c*vZk$I)!Hu+XY6@;81PW8bG4*Q#dn;oGW@7&*xhm%b8fuL4O~;{Lo%$X7gPOGh1%H zfVU|40}zi4Gyh-{l$biWNL9I1#_KucPtvl@%M3@`J_lLpLrn?H{e>tLu1uiiBdA>- z@DI}R-$HqQ!r!))D;)?2&Le(fRS_nvOJ|3TEx~e{Fb6;fTQ{WqgWK~@HT`^Ee<7O4 zrheY#bYBm?k$b2H`*68Rdw^QVZ=tirmcS%q=*hs}9;N2cRKI21IMLJtXuHawTiz45 zKP1+B=sKz1;xN~wn3<^}7Wd1p-kWnjYJwMG1~wLpS$uz4*F)QFZS{(=h<$cqx?luzP2%u*6A0> zD1|+ZVv!DBVQm@4eQE7C#_DtJhFQ|j7OMAp#~GRNA5S33>=b(lyY~X~Fn1z(^pE<6 zgag03BIZHwyPA{zeJS!5YPQ`-^aeZ5SQ`yKs~LBLtawe4?@l0Ha@VF%F-&qMh9*7J zC$#lo-2L(-nmxNIB|7EFBP`}Am!u>5Vsmn@wqL?o4(AwQ&)(24LqP}9$9yK^|0I6= zuJkc2Jf6l|`2L7*uqllFw-ngyN@!b;#>{$ZBpmoVRS%xl$LTapPmdFKyV`lk$1YN7~p&BnOwD!o>?zXZpw!1a!Ps=R_UP!z}lJk4z=@nY?*FtG{H_0zD zq)_I-_(CK4MCGFiq+>0ie}`nHepSyf62rmBY2gwuQ7{NUGV@EC*Z%v%fzg-4`n*0t zwU9<+Qd{yw%bDKHqUZSo(;In$v@kcRIe1Kutj%fGrMXZrLYq}ji^%o3b=M)k)vTw| z!S_P-iD=7zarNQlmEN3azY-FHJloqvbiwz0V``W>N9fZ+GS>2E4spdkJRq)w0lhztrus3x z^7N}Eh9l!-+jJ)hZZGU@^l~9P>c)XkeF}{(oX&>NMbo{W{*TGn{jy_oa3GSfaGNHX zP%}t%w53ouSuNN4C9LcF{R1;jW}t!8FFX0KZMTDX`JP2~V8T^ut1xpfmP*a;+JGbe zSZEmM_$mm$aEW?Q1r)nNa`Mgk^es_K z!Ib)4FBbTOjFYj7lp6BVmRfhPUV5*EbKl%*(7DMD-t8SS!^Dw{_f+?E>U|ZRdZ(jP z@10XjPqRB%Ojd;X9-W)v-8>U#VKn1e|7dzzM1Mwt^&Ejh*ydlDCYo)Q$}Gf!Ix9W; zVqEYz&rDL5#LoP~=IcDQI(?Vv)bgDl+D$TSd!Ki7!yw@|$>fECoccPY?&djs(m&YT z9?P%i{O=pG7J3fK=&=`Ujn2GjGV`YK%sY4onHFA!f+uvI(XTAh=vFUg2?x`@B(vLx zHn-=VU9=?#Tryn@q1#Jyl$z%d+8ZQ>s5c5ae6j;*;auG_XIV$^R!`PS<#(YyDuhs&HU z+`FEv2DU@j(;0?tt>|hc4Qu&!*-(t<6+v!AZ?c@shi_+BE;uN`VNJhVZ?`-{`ff*H zeS-m?pBe26Z@>K_Fym8s4LKaBNi+D0Gj@6y0L%X3Y6ZQd{*ju)6lB?hU7w9A$RSc$lt9tn5qPKuu{y5MHPDQhOj^( zWn%9b*ucmkB2|cVMv460X(94zAu=*ih^{>&B{ELF$p^e`3k-hY+B(B*%VYPhm72t6 zVqZ8AL?4k1ZLPr}t$iZ#+MQNwk&C#Y#OoiX)v7t#p8FwMENO85o2c2q!xxc#-W&Pj zmpuQfsI|wqHD3uaaiI_d1}6CO-{dn~rR-&Ch@Ysof_{tb&n}Q7jYfCvb`fgHn-6!I z`Hj}>TF(XiYv1Ho5~|>JNQ)>1Yr8ZYAZCZR3y1fx#CMTZR;A$cz&*_P9Tww%po|av zn32O|Lc#u?QT8vA;cai*$qoUl;gb9^(^^5xmO3fFaVR3pttee!Zuaepnf? zso}u!G&Ty8!hr)9FgC#qG|mI1gpbpGY`+C;Q26JY$xP^pE}IE*C=H>l=MaON9gSTa z0xVa1L;TXZ?^1Os_?bb9Y_8!F^u17Af=J%&Y?1DfyC>mb0}X6nC`fDsTep58t9?^s z!Nm?a1Mwtfyv+~Bq7JQ|KVp^SYLWG{W;RKL1~L0e2VcbMS(0(Gy?5Y@(>>jPw3~Me z6I2Q*;ryMk!#;n9ilDysjQ9o5rSs!~P_RZjcr;y{1EA;Ui_h(MHwPb4PqOVEwhPHr zw|$=YVwC5uUC0LQupE5xlH4K|dz%OcyS+!W4|;#ytbasEU`c;=9lbp8E$W0{3`yf& z;2f_(YbDT#P;iT?3H5wazAOTI8EDC@Xl^_8{hAi!mIAl{%U!zi>-Kfg$r3+Z?i^75XFHo^WwP~^B<>*^=qTOb011mUpiFHNZ zJKf$9?K99}_$~-^^nm9y%=8~^AEd%<@2v&Y)wT4g?;I9!q~{#cD@(OMy?}PO7A1eV zfL?9jW_ErMOpoelEq`e753#G15}p%#oJjT5^15q)l;?yD09KIK}<= z^Z!G|C1Kn_ykVNDx9m}5u{NtxO&Zm$s?HtVRaIFtZx8*I%;3iIX@;X~+R|>)Zk9Cr zO4L*ymf}JBzsc+sXmW-h={$4h%&C?O_HX=i4gP#>p_YA-q*MEA zYT%PiZwY57xTha?ychUGkIQ#cy})ZHGqIO<2V04j07Z07?e1}XlmpjX_&Rjrb1UYSg zC+6@mc#?jBL<$gJd6|?KCUq+pEaVBZBJet$Se&;y)eIA|(|Eu2xdLd1f6Q|U7>|Fz zv#I{UduU@se(zELl=ciWFy}^t-nR|Rrm&Y8xcNrj-5)mVxr=rD{x0S2?X=ZR?r_4tgn9B^#6GNLAd1iS`{zTV)_$M+mF5|t{rmo$Sh6pY*r&zJZ@|>}P-;k9`pV7o)Ruo&qz0imF0ytey&Eyk z_a+?V*TR9;6ocFT;mu4|lu{7!FG}(>Qf}Ey>$XXdw}5fweibV>oyv`;a(D5H+89ZK zDwOcU^!Q5OM5VTY+!%!05XwqAmpQrbW-%vCbnhpQm2+;6?v;L(W8M29Z3qW`onmx( z>*s8dQWK|gc~S z$X7h@l2G8?@rJ{Hy}jsTGtXl7CaE1s$cc7vYKFdx(mv2)l8dscoOEOrXj~M#F0s&l zu;hM)_k(XzRWtDV6gl!(mcT5fgVz#lk0X!fM0dt?Ytj8m6ED!xb=_$>9rq;)f7|cU zjNklLGv?dqmv?v?b9hh^xo$?>2E9^gjJxzkcI$9(P z5qU7%uwHFpTfQ-yZ21$C%JRCKQ+`eg|lDZyR@CR)UCa{Z5Z+_+`(&ri+s<6T3m?`EQXQ;lCkeP{-TS6_NkKDPO5eoY# zbyf1@1MaMS%>maW`L^)neta_=9j}1$n)0SYpC9bnfw0P^Zmb>VQytN zoy(cK3E$V&Gw`=jq1~IgR4804^(jileO!DC7x&qU*J<%bq<9?{5AA-G3WnEkaqc(x z^jGAA@u5pF=PSNe8u-(w_x~IUKTfgSL!tT|gw#)5iNqh~0X zM~U^bIBOpD!0nM@*EnoP8sPp>dMLt8os|pQ(nPso;y|A*uTS8e9Ss^gQ>kFRYRB`X zPaV^ak`$OcUNcC;>{A=&BqqO4-EPTW6eY~8r=epNcUjBW6VqwIs+~?RkfRv+^-Xe4QiLr3AWNUW zr_5=ib4W8>#vM?R(0Q~+$#TNC_)uKRti*8ONxfGa_Uz(qUvSA+;>5VJh_@6A2M(X? zjNWzl_cY?_5@Dh2qd;VYQiGZ*28hgRAW@%!{dyXEUgMP%v~xAJ&*Vkd1GKY>UasZA zQmtduYVB_2-Q&tTUq3UrMoT>Z9`D$`iYljB%co>kIiHpbP`TRIwWW1YDePb|+NCfn zP729pu#ywby{3k`T$Uc{i1~C6Ww8Z*XfoPps_jYY?$Eo^YiVrt^P+uP;yx@@YI}WU z&0PBuIzLO+%l9&gPnGsuv^j}oR;e6*k;?GIwsSa{%J3AYcD}*wtm)Fuai(pJwo^i7 zauccY2B2b$=x<{qSvPAr=6xS5o!@09g$A2>&d_|PnU@%vpJ?W}Li1f_UQ%d&l9`tr znxAaurG)0En0cw8`Ke}JT4;WnnU@}#pYDD+Z*)`k7{})Mqs_drq4{IYym6uVG_-C@7zRyIn(%C+ib}+hk8P9s^A8ckPi(kM;E~%oueauzqa35PTP6is2LdT;!C4S6e zok!C}CVK7^_H34O0X`(A7ciwkj$RhvEz%Nmm6MKnJhfrZqajZX9pD7l(FuH(xq-gI zHOchU>ZPm54>Ds1Ie&kE>kl`=3ZvZK8rt-=McIE~3~j#7gKr5`KA*-_Z5wX~MW0_~k+C zv%4y47k#W174M>=O^~P@wzW^8`X$s_jz697d@7*Na4+MXqMyI&H;y0TwkJ`UOSuuy zyPsUqr06YZ>S=vqdrEl5RC9F>wXlDUgSUpa(B0xw!A}3tZpyDSdk6KqT{}?DoZ+;h zTREC&MSF78WkpX;rD&2B{e+{*Ry3arr&-ZE$?coLM`Y&ebfW2%sY+8#j3#*+i5+>| z^A%c$=n~^$o52eQJ~51#5!5G^Y9RFcQug)F@ot^NeVLTeZN6 z1ZutAuoRFD<@%}A*-mMfp8c}_zSmv*(*&_r{<8`+d-h1c&$O_yZ7XLttkKNhYpr8b zh-bOGXy5ySZwS`Z(I^^OOR4$0LRsmd{5|b%D|sm~%(F8@kG*!$H!p7F_I5RA@*S7v zOtJo%;!-#y;*>ykcbWWVU2|rd#6%kMh`1kFdNhlTPBMS>r6X+JFXwxf;lRHPSw%1X ziXRFl>%+4TPFocd{5|=Js+_CDDn5ChRQ!iLO&p|8sUMG4%yLF+9*V2^tk&GcHT~FG zv|py*XGt3xq7XIL}JnUBlPL z8g|iq+?CO(?3VVIPa%oDAoqWuSFcIiv_M2oeQCAN*Seqi(rVvk+dtY6Z9gg6ev-By zId2MIzq(3aKglGd&?%0u4gZsgvo|HIdz2+ z+6S2VJE_V4`I6j=ouUsr&;6lbGFB6&p_GH7Fe?hsbO=s)K$>@yS zGMPRg(rQi5`~&)++|$@Tk8Yr^6PAx6I{gQOCw=Mk9W?(@;U_jR2bitz(8I&*bW&f> z(e|M<9;-kj7x*z1@En|R-TFi8eyGCz#UvX1QGT!vdDuSl8yjRAoQJUIgy;&LkI8V4 zGqtQaclHv^8Sw>6c4gReTuPsi{3V+I6@SLr2dNyV=<|rS50m$Ndm?D>6%L&GO3cR> z*P==<`L4Ts|J_N=A?MyRy0-!&vz`8gjQ0YKX`z-o7h7j}@{YV*;^_YBMsFD!y6s0T z-hjTEd$ZiEnVKks*Yp&^rwie0tQTJNYJMQ7`RUPtvF&)TcB3bf%S$hF;~mj z>=#v@WK#kuQd37lGvw&#x( zBD7DcTG5|zG`hT9!qMpRHiVq;(dBIwN2ANzx(=d*4Qlkc!iN*P`-}i)QH<^J z@)9P0(LO#cCXetv#?6`Ut?emZ?Y9CMeP zRun0}hJBZ#?b9&Nf^?-9a}_1B(%btm>f&$exF%O7`g>7EULunD81O)3D(!BGGT&fy zV{0{qTlKxrNdsw_oPWr@g+6<$Ct06NAcoIkC5pZq#;X9dVVq8DlyhEVSS~~ROmlut z@I8MYD?ZW8nt&eCuk)N(Kg!I?31#OrXR%jLEUTx1gF&Bl=A^c}%&bYI@u7VB-1&#W zlc6u@KGc5y3-pe2^pYC-E+Xa4PUF#?2GYP zo_ zn2`f4l$8T95DGD*HP4U%@|(Folh6BNfEYrk!(t;-mL!z5=MYIg(W2l4Ch1DLA8cml zgl167*;dQ4A)-a>j%d4dC6P*=Vjp&w-TO;XW9IJ&&oEexu2#2uh$&xXw2mCT$Y^rj z;E40r(Et^L;Xv<5UgP8~8mgJB%AaX#^o|wpD?UQP_&vnd6-Nj{D&U9BgICh`&cyLg~|g8J&sy{r6z83_JVN-g~+n4vg)T zb7=p3o(esZ%uMEUkNhOQ$jG-?8Z!(za!fLFT|LI}vCb^H{P=Vt29X@jmM11IhIE8019Q2EM|6`6@d7~d*nc<=z zUYU_ZKfE#{Ih37j&PWMmra8nmHpK-l6;D8FC<(Jz8Dq1y@APT_}63 zuhh&vL6#}=3bx7F2m$rSqDhin(pbM{zs2&sdMZ3J8JO_$s2{@z}fO{3i!(pZu*8oH=E&t0~QKO<%{ zHkLTNpFfI_^(s|$d-mJxNvLV#F}mFiqv8tH^OctH0eQf|)+N}CNaWqi*@VeW8gqbo z16Ik+*V9Q+u!xQl`MFJZPluW=qYqskrDp5*bXNw#cnW1|UZ;K>zG0y+LjT_P_nv`2 zjbcBRKXFN2w5N2Jb5z!v@M;6=iifoj+hN*Z@C{wIx{&iFCVwkTF7Mi&Iz>P5NHSVXzK!M*MO@}nco4Z`?IIGwgh+;R1NO{)GSCWWU-&|89=;Qa0h5o6s z2nEK_p=tYda)GG_UtXdz+?9Uyn3}(P3}1Qh-EDBeF;M#Ze`W4I#9NYM-4G-U;-QjT zG6D62C)eCbte=AEwLldq@(?mEXZ;z|OiSCO_Ni}VkYFdG-8XoaGsDj6V!Hl91Bm-* zG{1jOy1cQGv^F|H=EJdLr^-byr+Qp`_T^8+Ix-k$q?-bcXo1g9a{>D5g*YQLkrHT0 zpdDH=J))zD_Q)eL56wK9Y1ic?zAayew#~qBHh=tU9(Ii3Y<7xg(l0|;E7~tE;fr=> zf1j|q7oYwGenEzoUl?Ki-1N9&>~sZQ?9``(*+ta!TNguJHtj%mpotH=Up>i&65Wxl zYWB}H1HzOP!y8w z);P4)ezCcMt&p`^{)_$bA#{?Xhs*;n)?LE~8J)D2SoV(gcz`!%W`2+&B7Au3^Y#1%A^a^=$Nm^#~nG5GxVmC!;&uXQ%aI%_1bK8o5Bk$YInjLxAl zqr34DL4OH-*7MD4oKa_?XOlDWTi~k%kYyIgH<<1A43b-z^s%nUX@Gj5@>q|+VEEc2 zXu6;8ZSzz=LEkIqIlGfrQnrWV$>=j#eoUFj$)FnDG2x~f^b)}Mgh>RPjgRLB9W%4rT?1BW0L}XsEac%N5&I#dP?A;$e+>Fv3{Nv4VA~{NoJ4J2_Zt98j;R) zt31}t6U4%ozJHXrZN`hTJ~@xcBZrFacSXxo3LZ5qn6mU|@)E`O$jPt#P$6R*J%>oy z&+}-*=y_XIdPXhaM7z|YNJ4(~ACbLr=l)08 zyRZE}%brsN&*4Z^e|l(Q9f~GrT{02DZxpziybGPWw=(i&8Yn!#6a1kIIC+LsYe><3 z8}tL7x_8W?R_*AGo`rQ(#;DfDIpj8kr597t<7vtNpXlAm{_pl*l==Vj|Bx&B_kM*d zF35Z%Ri3TC|Lgzn5pN$!>HNO^1ZB+x8a=9>*L0|h%NqdC;FCvYS*ykmF2jMlWlCL! zZ>{cKZge#qsov#^7xWa<+t}oNn4Gtz{M)>T{artXTAq&@HTV@in`g@|GHzolD;{

] +.RB [ \-d ] +.RB [ \-o ] +.RB [ \-r ] + +.SH DESCRIPTION +.TP +\fB\-v\fR, \fB\-\-version\fR +Displays the current version number. +.TP +\fB\-h\fR, \fB\-\-help\fR +Prints a short usage description. +.TP +\fB-i\fR, \fB\-\-enable\-stdin\fR +Does not disable stdin. +.TP +\fB\-f\fR, \fB\-\-full\-daemon\fR +Fork to Background +.TP +\fB\-c\fR, \fB\-\-config\-dir\fR=\fI\fR +Read config from instead of home. +.TP +\fB\-d\fR, \fB\-\-disable\-fatal\fR +Does not handle fatal exception. +.TP +\fB-o\fR, \fB\-\-log\-stdout\fR +Print log messages to stdout. +.SH FILES +~/.aMule/* +.SH REPORTING BUGS +Please report bugs either on our forum (\fIhttp://forum.amule.org/\fR), or in our bugtracker (\fIhttp://bugs.amule.org/\fR). +Please do not report bugs in e-mail, neither to our mailing list nor directly to any team member. +.SH COPYRIGHT +aMule and all of its related utilities are distributed under the GNU General Public License. +.SH SEE ALSO +\fBalcc\fR(1), \fBamule\fR(1), \fBamulecmd\fR(1), \fBamulegui\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1) diff --git a/docs/man/amuled.de.1 b/docs/man/amuled.de.1 new file mode 100644 index 00000000..3a604d6b --- /dev/null +++ b/docs/man/amuled.de.1 @@ -0,0 +1,47 @@ +.\"******************************************************************* +.\" +.\" This file was generated with po4a. Translate the source file. +.\" +.\"******************************************************************* +.TH AMULED 1 "Januar 2007" "aMule Daemon v2.2.0" "aMule Daemon" +.SH NAME +amuled \- Der alle\-Plattformen eMule p2p Client \- dämonisierte Version +.SH SYNTAX +\fBamuled\fP [\fB\-v\fP] [\fB\-h\fP] [\fB\-i\fP] [\fB\-f\fP] [\fB\-c\fP \fI\fP] [\fB\-d\fP] +[\fB\-o\fP] [\fB\-r\fP] + +.SH BESCHREIBUNG +.TP +\fB\-v\fP, \fB\-\-version\fP +Zeigt die derzeitige Versionsnummer an. +.TP +\fB\-h\fP, \fB\-\-help\fP +Gibt eine kurze Beschreibung aus. +.TP +\fB\-i\fP, \fB\-\-enable\-stdin\fP +Schaltet stdin nicht ab. +.TP +\fB\-f\fP, \fB\-\-full\-daemon\fP +Im Hintergrund ausführen +.TP +\fB\-c\fP, \fB\-\-config\-dir\fP=\fI\fP +Liest die Konfiguration anstelle des Home. +.TP +\fB\-d\fP, \fB\-\-disable\-fatal\fP +Fehlerbehandlung für fatale Fehler abschalten. +.TP +\fB\-o\fP, \fB\-\-log\-stdout\fP +Gibt Log\-Meldungen auf der Standardausgabe aus. +.SH DATEIEN +~/.aMule/* +.SH "FEHLER MELDEN" +Bitte meldet Fehler entweder in unserem Forum (\fIhttp://forum.amule.org/\fP), +oder in unseren Bugtracker (\fIhttp://bugs.amule.org/\fP). Bitte meldet uns +keine Fehler per E\-Mail, noch auf unsere Mailingliste oder direkt an unsere +Teammitglieder. +.SH COPYRIGHT +aMule und alle seine zugehörigen Anwendungen werden verteilt unter der GNU +General Public License +.SH "SIEHE AUCH" +\fBalcc\fP(1), \fBamule\fP(1), \fBamulecmd\fP(1), \fBamulegui\fP(1), \fBamuleweb\fP(1), +\fBcas\fP(1), \fBed2k\fP(1) diff --git a/docs/man/amuled.es.1 b/docs/man/amuled.es.1 new file mode 100644 index 00000000..3c96328d --- /dev/null +++ b/docs/man/amuled.es.1 @@ -0,0 +1,35 @@ +.TH AMULED 1 "Marzo 2005" "aMule Daemon v2.0.0" "Demonio aMule" +.SH NOMBRE +amuled \- Cliente P2P clon de eMule multi-plataforma \- versión demonio +.SH SINOPSIS +.B amuled +.RB [ \-v ] +.RB [ \-h ] +.RB [ \-i ] +.RB [ \-d ] +.RB [ \-o ] +.SH DESCRIPCIÓN +.TP +\fB\-v\fR, \fB\-\-version\fR +Muestra la versión del programa. +.TP +\fB\-h\fR, \fB\-\-help\fR +Muestra esta información. +.TP +\fB-i\fR, \fB\-\-enable\-stdin\fR +Deja activa la entrada estándar. +.TP +\fB\-d\fR, \fB\-\-disable\-fatal\fR +Ignpra las señales "Fatal exception". +.TP +\fB-o\fR, \fB\-\-log\-stdout\fR +Muestra los mensajes de log en la consola. +.SH ARHIVOS +~/.aMule/* +.SH BUGS +Si descubre bugs, por favor comuníquelos en (\fIhttp://forum.amule.org/\fR), o en nuestro bugtracker (\fIhttp://bugs.amule.org/\fR). +Por favor, no comunique bugs por e-mail, ni a nuestro maillist ni directamente a ningún miembro del equipo de aMule. +.SH COPYRIGHT +aMule, y todas las utilidades que con el vienen, se distribuyen bajo la licencia GPL. +.SH VER +\fBalcc\fR(1), \fBamule\fR(1), \fBamulecmd\fR(1), \fBamulegui\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1) diff --git a/docs/man/amuled.eu.1 b/docs/man/amuled.eu.1 new file mode 100644 index 00000000..dc62319b --- /dev/null +++ b/docs/man/amuled.eu.1 @@ -0,0 +1,46 @@ +.TH AMULED 1 "2005" "aMule Deabrua 2.0.0b" "aMule Lanabesa" +.SH NAME +amuled \- Plataforma orotarako eMule p2p bezeroa \- deabru bertsioa +.SH LABURPENA +.B amuled +.RB [ \-v ] +.RB [ \-h ] +.RB [ \-i ] +.RB [ \-f ] +.RB [ \-c " " \fI ] +.RB [ \-d ] +.RB [ \-o ] +.RB [ \-r ] + +.SH AZALPENA +.TP +\fB\-v\fR, \fB\-\-version\fR +Bertsio zenbakia bistaratzen du. +.TP +\fB\-h\fR, \fB\-\-help\fR +Azlapen hau bistaratzen du. +.TP +\fB-i\fR, \fB\-\-enable\-stdin\fR +Ez sarrera estandarra ezgaitu. +.TP +\fB\-f\fR, \fB\-\-full\-daemon\fR +Atzeko planoan ireki +.TP +\fB\-c\fR, \fB\-\-config\-dir\fR=\fI\fR +Konfigurazioa home\-etik beharrean -etik irakurri. +.TP +\fB\-d\fR, \fB\-\-disable\-fatal\fR +Ez kudeatu salbuespen konponezinak. +.TP +\fB-o\fR, \fB\-\-log\-stdout\fR +Erregistro mezuak irteera estandarrean inprimatu +.SH FITXATEGIAK +~/.aMule/* +.SH ZORRIEN BERRI EMATEN +Mesedez zorrien berri emateko gure foroa (\fIhttp://forum.amule.org/\fR), edo gure zorri kudeatzailea +(\fIhttp://bugs.amule.org/\fR) erabili. +Mesedez ez eman zorrien berri epostaz, ez gure eposta zerrendan ez taldeko partaideei. +.SH COPYRIGHT +aMule eta inguruneko lanabes guztiak GNU Lizentzia Publiko Orokorraz banatzen dira. +.SH IKUSI ERE +\fBalcc\fR(1), \fBamule\fR(1), \fBamulecmd\fR(1), \fBamulegui\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1) diff --git a/docs/man/amuled.fr.1 b/docs/man/amuled.fr.1 new file mode 100644 index 00000000..23b0062d --- /dev/null +++ b/docs/man/amuled.fr.1 @@ -0,0 +1,37 @@ +.TH AMULED 1 "Mars 2005" "aMule Daemon v2.0.0" "aMule Daemon" +.SH NOM +amuled, le client p2p eMule \-multi\- platforme \- version daemon +.SH SYNOPSIS +.B amuled +.RB [ \-v ] +.RB [ \-h ] +.RB [ \-i ] +.RB [ \-d ] +.RB [ \-o ] +.SH DESCRIPTION +.TP +\fB\-v\fR, \fB\-\-version\fR +Afficher les informations sur la version courante. +.TP +\fB\-h\fR, \fB\-\-help\fR +Afficher l'aide d'utilisation. +.TP +\fB-i\fR, \fB\-\-enable\-stdin\fR +Ne pas désactiver stdin. +.TP +\fB\-d\fR, \fB\-\-disable\-fatal\fR +Ne pas prendre en charge une exception fatale. +.TP +\fB-o\fR, \fB\-\-log\-stdout\fR +Afficher les messages de log sur stdout. +.SH FICHIERS +~/.aMule/* +.SH SIGNALEMENT DES BUGS +Reportez les bugs sur notre forum (\fIhttp://forum.amule.org/\fR), ou dans notre bugtracker (\fIhttp://bugs.amule.org/\fR). +N'utilisez ni un e-mail, ni notre liste de diffusion ni ne reportez directement un bug à un membre de notre equipe. +.SH COPYRIGHT +aMule et tous les utilitaires associés sont distribués sous licence GNU General Public License. +.SH VOIR AUSSI +\fBalcc\fR(1), \fBamule\fR(1), \fBamulecmd\fR(1), \fBamulegui\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1) +.SH TRADUCTION +ThePolish, 2005 diff --git a/docs/man/amuled.hu.1 b/docs/man/amuled.hu.1 new file mode 100644 index 00000000..db6fa6ef --- /dev/null +++ b/docs/man/amuled.hu.1 @@ -0,0 +1,37 @@ +.TH AMULED 1 "2005 március" "aMule Daemon v2.0.0" "aMule Daemon" +.SH NÉV +amuled \- a "minden\-platform" eMule p2p kliens \- démonizált változat +.SH ÁTEKINTÉS +.B amuled +.RB [ \-v ] +.RB [ \-h ] +.RB [ \-i ] +.RB [ \-d ] +.RB [ \-o ] +.SH LEÍRÁS +.TP +\fB\-v\fR, \fB\-\-version\fR +Megjeleníti a verzió információt. +.TP +\fB\-h\fR, \fB\-\-help\fR +Ezt a súgót jeleníti meg. +.TP +\fB-i\fR, \fB\-\-enable\-stdin\fR +Nem zárja le a szabvány bemenetet (stdin). +.TP +\fB\-d\fR, \fB\-\-disable\-fatal\fR +Nem kezeli a végzetes kivételeket. +.TP +\fB-o\fR, \fB\-\-log\-stdout\fR +A szabvány kimenetre írja a napló üzeneteket. +.SH FÁJLOK +~/.aMule/* +.SH HIBÁK JELENTÉSE +A hibákat kérjük vagy a fórumon (\fIhttp://forum.amule.org/\fR), vagy a hibakövetõben (\fIhttp://bugs.amule.org/\fR) jelentsék. +Hibákról kérjük ne írjanak levelet (e-mail-t) se a levelzési listára, se közvetlenül valamelyik fejlesztõnek. +.SH COPYRIGHT +Az aMule és az összes hozzá tartozó segédprogram a GNU General Public Licence védelme alatt áll. +.SH LÁSD MÉG +\fBalcc\fR(1), \fBamule\fR(1), \fBamulecmd\fR(1), \fBamulegui\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1) +.SH MAGYAR FORDÍTÁS +Dévai Tamás diff --git a/docs/man/amulegui.1 b/docs/man/amulegui.1 new file mode 100644 index 00000000..61da43a8 --- /dev/null +++ b/docs/man/amulegui.1 @@ -0,0 +1,25 @@ +.TH AMULEGUI 1 "January 2007" "aMuleGUI v2.2.0" "aMuleGUI" +.SH NAME +amulegui \- aMule control program with GUI +.SH SYNOPSIS +.B amulegui +.SH "DESCRIPTION" +.B amulegui +is a client program, and can be connected on amule or amuled via EC. You +can manage your amule program with it. It provides the almost same functionality +as amule, even if the core works on another computer. + +This program doesn't take any arguments. +.SH REPORTING BUGS +Please report bugs either on our forum (\fIhttp://forum.amule.org/\fR), or in our bugtracker (\fIhttp://bugs.amule.org/\fR). +Please do not report bugs in e-mail, neither to our mailing list nor directly to any team member. +.SH COPYRIGHT +aMule and all of its related utilities are distributed under the GNU General Public License. +.SH SEE ALSO +\fBalc\fR(1), \fBalcc\fR(1), \fBamuled\fR(1), \fBamulecmd\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1), \fBwxcas\fR(1), \fBxas\fR(1) +.SH AUTHOR +This manpage was written by Julien Delange for Debian +This manpage was rewritten by Vollstrecker for aMule + + + diff --git a/docs/man/amulegui.de.1 b/docs/man/amulegui.de.1 new file mode 100644 index 00000000..50f8a7c7 --- /dev/null +++ b/docs/man/amulegui.de.1 @@ -0,0 +1,35 @@ +.\"******************************************************************* +.\" +.\" This file was generated with po4a. Translate the source file. +.\" +.\"******************************************************************* +.TH AMULEGUI 1 "Januar 2007" "aMuleGUI v2.2.0" aMuleGUI +.SH NAME +amulegui \- aMule Steuerungsprogram mit GUI +.SH SYNTAX +\fBamulegui\fP +.SH BESCHREIBUNG +\fBamulegui\fP ist ein Program das über EC mit amule/amuled Verbindung +aufnehmen kann. Du kannst deinen amle damit steuern. Es besitzt so ziemlich +dieselben Funktionen wie amule, auch wenn dieser auf einem anderen Computer +läuft. + +Dieses Programm hat keine Parameter +.SH "FEHLER MELDEN" +Bitte meldet Fehler entweder in unserem Forum (\fIhttp://forum.amule.org/\fP), +oder in unseren Bugtracker (\fIhttp://bugs.amule.org/\fP). Bitte meldet uns +keine Fehler per E\-Mail, noch auf unsere Mailingliste oder direkt an unsere +Teammitglieder. +.SH COPYRIGHT +aMule und alle seine zugehörigen Anwendungen werden verteilt unter der GNU +General Public License +.SH "SIEHE AUCH" +\fBalc\fP(1), \fBalcc\fP(1), \fBamuled\fP(1), \fBamulecmd\fP(1), \fBamuleweb\fP(1), +\fBcas\fP(1), \fBed2k\fP(1), \fBwxcas\fP(1), \fBxas\fP(1) +.SH VERFASSER +Diese Seite wurde geschrieben von Julien Delange für Debian Diese Seite wurde überarbeit und übersetzt von +Vollstrecker für aMule + + + diff --git a/docs/man/amuleweb.1 b/docs/man/amuleweb.1 new file mode 100644 index 00000000..38e87523 --- /dev/null +++ b/docs/man/amuleweb.1 @@ -0,0 +1,185 @@ +.TH AMULEWEB 1 "January 2007" "aMule webserver v2.2.0" "aMule utilities" +.SH NAME +amuleweb \- aMule web server +.SH SYNOPSIS +.B amuleweb +.RB [ \-h " " \fI ] +.RB [ \-p " " \fI ] +.RB [ \-P " " \fI ] +.RB [ \-f " " \fI ] +.RB [ \-q ] +.RB [ \-v ] +.RB [ \-l " " \fI ] +.RB [ \-w ] +.RB [ \-t " " \fI ] +.RB [ \-s " " \fI ] +.RB [ \-z ] +.RB [ \-Z ] +.RB [ \-A " " \fI ] +.RB [ \-G " " \fI ] +.RB [ \-a ] +.RB [ \-d ] +.RB [ \-L ] +.RB [ \-N ] +.PP +.B amuleweb +.RB [ \-f " " \fI ] +.B \-\-create-config-from=\fI +.PP +.B amuleweb +.RB [ \-\-help ] +.RB [ \-\-version ] +.PP +.B amuleweb \-\-amule\-config\-file=\fI +.PP +.B amuleweb \-\-no\-php +.SH DESCRIPTION +\fBamuleweb\fR manages your access to amule through a webbrowser. +You can start amuleweb together with \fBamule\fR(1), or separately, any time later. +Options can be specified via command-line or via config-file. +Command-line options take precedence over config-file options. +.TP +\fB\-h\fR, \fB\-\-host\fR=\fI\fR +Host where aMule is running (default: \fIlocalhost\fR). +\fI\fR might be an IP address or a DNS name +.TP +\fB\-p\fR, \fB\-\-port\fR=\fI\fR +aMule's port for External Connections, as set in Preferences->Remote Controls (default: \fI4712\fR) +.TP +\fB\-P\fR, \fB\-\-password\fR=\fI\fR +External Connections password +.TP +\fB\-f\fR, \fB\-\-config\-file\fR=\fI\fR +Use the given configuration file. +Default configuration file is \fI~/.aMule/remote.conf\fR +.TP +\fB\-q\fR, \fB\-\-quiet\fR +Do not print any output to stdout. +You may want to use \fB\-q\fR to daemonize the webserver, i.e. running as '\fBamuleweb \-q &\fR' +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Be verbose \- show also debug messages +.TP +\fB\-l\fR, \fB\-\-locale\fR=\fI\fR +Sets program locale (language). +See section \fBLANGUAGES\fR for the description of the \fI\fR parameter. +.TP +\fB\-w\fR, \fB\-\-write\-config\fR +Write command line options to config file and exit +.TP +\fB\-\-create\-config\-from\fR=\fI\fR +Create config file based upon \fI\fR, which must point to a valid aMule config file, and then exit +.TP +\fB\-t\fR, \fB\-\-template\fR=\fI\fR +Loads the template named \fI\fR. See also the section +.B SKIN SUPPORT +.TP +\fB\-s\fR, \fB\-\-server\-port\fR=\fI\fR +Webserver's HTTP port. This is the port you can point your browser to (default: \fI4711\fR) +.TP +\fB\-z\fR, \fB\-\-enable\-gzip\fR +Enable using gzip compression in HTTP traffic to save bandwidth +.TP +\fB\-Z\fR, \fB\-\-disable\-gzip\fR +Disable using gzip compression (this is the default) +.TP +\fB\-A\fR, \fB\-\-admin\-pass\fR=\fI\fR +Full access password for webserver +.TP +\fB\-G\fR, \fB\-\-guest\-pass\fR=\fI\fR +Guest password for webserver +.TP +\fB\-a\fR, \fB\-\-allow\-guest\fR +Allow guest access +.TP +\fB\-d\fR, \fB\-\-deny\-guest\fR +Deny guest access (default) +.TP +\fB\-L\fR, \fB\-\-load\-settings\fR +Load/save webserver settings from/to remote aMule. +This causes amuleweb to ignore command-line and config-file settings, and load them from aMule. +When saving preferences none will be written to the config file, but to aMule. +(Of course, this works only for those settings, that can be set in aMule's Preferences->Remote Controls) +.TP +\fB\-N\fR, \fB\-\-no\-script\-cache\fR +Recompile PHP pages on each request +.TP +\fB\-\-amule\-config\-file\fR=\fI\fR +aMule config file path. +.B DO NOT USE DIRECTLY! +aMule uses this option when starting amuleweb at aMule startup. +This option causes all other command-line and config-file settings to be ignored, preferences to be read from the given config file, and also implies the \fB\-q \-L\fR options. +.TP +\fB\-\-help\fR +Prints a short usage description. +.TP +\fB\-\-version\fR +Displays the current version number. +.SH NOTES +.SS Paths +For all options which take a \fI\fR value, if the \fIpath\fR contains no +directory part (i.e. just a plain filename), then it is considered to be under +the aMule configuration directory, \fI~/.aMule\fR. +.SS LANGUAGES +The \fI\fR parameter for the \fB\-l\fR option has the following form: \fIlang\fR[\fB_\fILANG\fR][\fB.\fIencoding\fR][\fB@\fImodifier\fR] +where \fIlang\fR is the primary language, \fILANG\fR is a sublanguage/territory, +\fIencoding\fR is the character set to use and \fImodifier\fR +"allows the user to select a specific instance of localization data within a +single category". +.PP +For example, the following strings are valid: +.br +de +.br +de_DE +.br +de_DE.iso88591 +.br +de_DE@euro +.br +de_DE.iso88591@euro +.PP +Though all the above strings are accepted as valid language definitions, +\fIencoding\fR and \fImodifier\fR are yet unused. +.PP +In addition to the format above, you can also specify full language names in +English - so \fB\-l german\fR is also valid and is equal to \fB-l de_DE\fR. +.PP +When no locale is defined, either on command-line or in config file, system +default language will be used. +.SH SKIN SUPPORT +\fBamuleweb\fR is capable of displaying information in different skins. +These skins are called templates, and you can make amuleweb load a specific template via the \fB\-t\fR command line option. +Templates are searched in two places: first in \fI~/.aMule/webserver/\fR and then in \fI$(pkgdatadir)/webserver/\fR +(\fI$(pkgdatadir)\fR is the install location of architecture independent data, most likely something like /usr/share/amule). +Each template must be in a subdirectory of the template name, and this directory must contain all files the template needs. +The actual template filename must be aMule.tmpl. +.PP +For example, the default template (named 'default') is in webserver/default/, and this directory contains aMule.tmpl amongst a lot of image files. +.SH FILES +~/.aMule/remote.conf +.br +~/.aMule/webserver/ +.br +\fI$(pkgdatadir)\fR/webserver/ +.SH EXAMPLE +Typically amuleweb will be first run as: +.PP +\fBamuleweb\fR \fB\-h\fR \fIhostname\fR \fB\-p\fR \fIECport\fR \fB\-P\fR \fIECpassword\fR \fB\-s\fR \fIHTTPport\fR \fB\-A\fR \fIAdminPassword\fR \fB\-w\fR +.PP +or +.PP +\fBamuleweb\fR \fB\-\-create-config-from\fR=\fI/home/username/.aMule/amule.conf\fR +.PP +These will save settings to \fI$HOME/.aMule/remote.conf\fR, and later you only need to type: +.PP +.B amuleweb +.PP +Of course, you may specify any more or less options on the first example line, and you may also totally omit it. +.SH REPORTING BUGS +Please report bugs either on our forum (\fIhttp://forum.amule.org/\fR), or in our bugtracker (\fIhttp://bugs.amule.org/\fR). +Please do not report bugs in e-mail, neither to our mailing list nor directly to any team member. +.SH COPYRIGHT +aMule and all of its related utilities are distributed under the GNU General Public License. +.SH SEE ALSO +\fBamule\fR(1), \fBamulecmd\fR(1) diff --git a/docs/man/amuleweb.de.1 b/docs/man/amuleweb.de.1 new file mode 100644 index 00000000..9d5c8acc --- /dev/null +++ b/docs/man/amuleweb.de.1 @@ -0,0 +1,194 @@ +.\"******************************************************************* +.\" +.\" This file was generated with po4a. Translate the source file. +.\" +.\"******************************************************************* +.TH AMULEWEB 1 "Januar 2007" "aMule Webserver v2.2.0" "aMule Hilfsprogramme" +.SH NAME +amuleweb \- aMule Webserver +.SH SYNTAX +\fBamuleweb\fP [\fB\-h\fP \fI\fP] [\fB\-p\fP \fI\fP] [\fB\-P\fP +\fI\fP] [\fB\-f\fP \fI\fP] [\fB\-q\fP] [\fB\-v\fP] [\fB\-l\fP +\fI\fP] [\fB\-w\fP] [\fB\-t\fP \fI\fP] [\fB\-s\fP +\fI\fP] [\fB\-z\fP] [\fB\-Z\fP] [\fB\-A\fP \fI\fP] [\fB\-G\fP +\fI\fP] [\fB\-a\fP] [\fB\-d\fP] [\fB\-L\fP] [\fB\-N\fP] +.PP +\fBamuleweb\fP [\fB\-f\fP \fI\fP] +\fB\-\-create\-config\-from=\fP\fI\fP +.PP +\fBamuleweb\fP [\fB\-\-help\fP] [\fB\-\-version\fP] +.PP +\fBamuleweb \-\-amule\-config\-file=\fP\fI\fP +.PP +\fBamuleweb \-\-no\-php\fP +.SH BESCHREIBUNG +\fBamuleweb\fP ermöglicht dir den Zugriff auf amule(d) per Webbrowser. Man kann +amuleweb zusammen mit \fBamule\fP(1) starten lassen, oder ihn separat später +starten. Optionen können auf der Kommandozeile oder in der +Konfigurationsdatei angegeben werden. Kommandozeilenoptionen überschreiben +die Werte aus der Konfigurationsdatei. +.TP +\fB\-h\fP, \fB\-\-host\fP=\fI\fP +Der Rechner auf dem aMule läuft (Standard: \fIlocalhost\fP). \fI\fP +kann eine IP\-Adresse oder ein DNS\-Name sein. +.TP +\fB\-p\fP, \fB\-\-port\fP=\fI\fP +aMule's Port für Externe Verbindungen, wie in den Optionen +unter\->Fernsteuerung (Standard: \fI4712\fP) eingestellt. +.TP +\fB\-P\fP, \fB\-\-password\fP=\fI\fP +Passwort für Externe Verbindungen. +.TP +\fB\-f\fP, \fB\-\-config\-file\fP=\fI\fP +Benutzt die angegebene Konfigurationsdatei. Die Standardkonfigurationsdatei +ist \fI~/.aMule/remote.conf\fP +.TP +\fB\-q\fP, \fB\-\-quiet\fP +Gebe keine Ausgaben auf der Standardausgabe aus. Du könntest \fB\-q\fP benutzen +um den Webserver als Dämon laufen zu lassen, z.B. durch Aufruf von +\&'\fBamuleweb \-q &\fP' +.TP +\fB\-v\fP, \fB\-\-verbose\fP +Sei gesprächig \- Gebe auch Debuggingausgaben aus +.TP +\fB\-l\fP, \fB\-\-locale\fP=\fI\fP +Setzt die Locale (Sprache) des Programms. Siehe Abschnitt \fBSPRACHEN\fP für +die Beschreibung des \fI\fP Parameter. +.TP +\fB\-w\fP, \fB\-\-write\-config\fP +Schreibe die Kommandozeilenoptionen in die Konfigurationsdatei und kehre zur +Shell zurück. +.TP +\fB\-\-create\-config\-from\fP=\fI\fP +Erstellt eine Konfigurationsdatei basierend auf \fI\fP, welche +auf eine gültige Amulekonfigurationsdatei verweisen muss, und kehre zur +Shell zurück. +.TP +\fB\-t\fP, \fB\-\-template\fP=\fI\fP +Lädt die mit \fI\fP spezifizierte Vorlage. Siehe auch Abschnitt +\fBSKIN UNTERSTÜTZUNG\fP +.TP +\fB\-s\fP, \fB\-\-server\-port\fP=\fI\fP +HTTP Port des Webservers. Der Port der mit dem Browser erreichbar sein soll +(Standard: \fI4711\fP) +.TP +\fB\-z\fP, \fB\-\-enable\-gzip\fP +Benutzt gzip Kompression für den HTTP Verkehr um Bandbreite zu sparen +.TP +\fB\-Z\fP, \fB\-\-disable\-gzip\fP +Schalten die gzip Kompression ab (Standard) +.TP +\fB\-A\fP, \fB\-\-admin\-pass\fP=\fI\fP +Passwort für vollen Zugriff auf den Webserver +.TP +\fB\-G\fP, \fB\-\-guest\-pass\fP=\fI\fP +Gäste Passwort für den Webserver +.TP +\fB\-a\fP, \fB\-\-allow\-guest\fP +Erlaubt den Zugriff als Gast +.TP +\fB\-d\fP, \fB\-\-deny\-guest\fP +Verbietet den Zugriff als Gast (Standard) +.TP +\fB\-L\fP, \fB\-\-load\-settings\fP +Lade/Speichere Einstellungen vom/zum entfernen aMule. Dies bringt amuleweb +dazu, die Kommandozeilen\- und Konfigurationsdateieinstellungen zu +ignorieren, und von aMule zu beziehen. Beim Speichern werden keine +Einstellungen in die Konfigurationsdatei geschrieben, sondern zu aMule +gesendet. (das funktioniert nur für Einstellungen in aMule's +Einstellungen\->Fernsteuerung Dialog) +.TP +\fB\-N\fP, \fB\-\-no\-script\-cache\fP +Erstellt die PHP\-Seiten bei jedem Aufruf neu +.TP +\fB\-\-amule\-config\-file\fP=\fI\fP +Pfad zur aMule Konfigurationsdatei. \fBNICHT DIREKT BENUTZEN!\fP aMule benutzt +dies zum starten von amuleweb wenn aMule startet. Diese Option sorgt dafür, +das alle anderen Paramter ignoriert werden, und nur aus der angegeben Datei +gelesen werden, und impliziert auch die \fB\-q \-L\fP Optionen. +.TP +\fB\-\-help\fP +Gibt eine kurze Beschreibung aus. +.TP +\fB\-\-version\fP +Zeigt die derzeitige Versionsnummer an. +.SH ANMERKUNGEN +.SS Pfade +If you specify a file without giving an absolute path (i.e. just a plain +filename, such as \fB\-\-path\fP=\fIremote.conf\fP), then this file is searched +within the aMule configuration directory, \fI~/.aMule\fP. +.SS SPRACHEN +Der \fI\fP Parameter für die \fB\-l\fP Option hat folgende Form: +\fIsprache\fP[\fB_\fP\fISPRACHE\fP][\fB.\fP\fIKODIERUNG\fP][\fB@\fP\fIzusatz\fP] wobei \fIsprache\fP +die primäre Sprache, \fISPRACHE\fP die Regionalsprache, \fIKODIERUNG\fP die +Zeichentabelle ist, und \fIzusatz\fP "erlaubt es dem Nutzer eine bestimmte +Auswahl innerhalb einer einzigen Kategorie auszuwählen". +.PP +Zum Besispiel sind die folgenden Zeichenketten gültig: +.br +de +.br +de_DE +.br +de_DE.iso88591 +.br +de_DE@euro +.br +de_DE.iso88591@euro +.PP +Alle oben genannten Zeicheketten werden als gültige Sprachdefinitionen +akzeptiert, \fIKODIERUNG\fP und \fIzusatz\fP werden zur Zeit nicht genutzt. +.PP +Zusätzlich zu den obigen Formaten, kann man komplette englishe +Sprachbezeichnungen angeben \- \fB\-l german\fP ist ebenfalls gültig und +entspricht \fB\-l de_DE\fP. +.PP +Wenn keine Sprache definiert wurde, weder in der Kommandozeile noch in der +Konfigurationsdatei, wird die Standardsprache des Systems verwendet. +.SH "SKIN UNTERSTÜTZUNG" +\fBamuleweb\fP ist in der Lage Information in Verschiedenen Skins +darzustellen. Diese Skins werden Templates genannt. du kannst aMule mit der +\fB\-t\fP Kommandozeilenoption dazu veranlassen, ein bestimmtest Template zu +laden. Templates werden an zwei Stellen gesucht: Zuerstt in +\fI~/.aMule/webserver/\fP dann in \fI$(pkgdatadir)/webserver/\fP (\fI$(pkgdatadir)\fP +ist der Installationsordner architekturunabhängiger Dateien, meistens +/usr/share/amule). Jedes Template muss in einem Unterverzeichnis des +Templatenamens liegen, und dieses Verzeichnis muss alle Dateien enthalten +die das Template benötigt. Die Templatedatei heißt aMule.tmpl +.PP +Zum Beispiel, das Standardtemplate (Name: 'default') liegt in +webserver/default/. Das Verzeichnis enthält aMule.tmpl und viele +Bilddateien. +.SH DATEIEN +~/.aMule/remote.conf +.br +~/.aMule/webserver/ +.br +\fI$(pkgdatadir)\fP/webserver/ +.SH BEISPIEL +Typischerweise wird amuleweb als erstes folgendermaßen gestartet: +.PP +\fBamuleweb\fP \fB\-h\fP \fIhostname\fP \fB\-p\fP \fIEC\-Port\fP \fB\-P\fP \fIEC\-Passwort\fP \fB\-s\fP +\fIHTTP\-Port\fP \fB\-A\fP \fIAdmin\-Passwort\fP \fB\-w\fP +.PP +oder +.PP +\fBamuleweb\fP \fB\-\-create\-config\-from\fP=\fI/home/username/.aMule/amule.conf\fP +.PP +Dies speichert die Einstellungen in \fI$HOME/.aMule/remote.conf\fP, und tippst +du nur noch: +.PP +\fBamuleweb\fP +.PP +Natürlich kann man zusätzliche Optionen angeben und einzelne auch beim +ersten Start weglassen, oder es komplett anders machen. +.SH "FEHLER MELDEN" +Bitte meldet Fehler entweder in unserem Forum (\fIhttp://forum.amule.org/\fP), +oder in unseren Bugtracker (\fIhttp://bugs.amule.org/\fP). Bitte meldet uns +keine Fehler per E\-Mail, noch auf unsere Mailingliste oder direkt an unsere +Teammitglieder. +.SH COPYRIGHT +aMule und alle seine zugehörigen Anwendungen werden verteilt unter der GNU +General Public License +.SH "SIEHE AUCH" +\fBamule\fP(1), \fBamulecmd\fP(1) diff --git a/docs/man/amuleweb.es.1 b/docs/man/amuleweb.es.1 new file mode 100644 index 00000000..8d7b7f24 --- /dev/null +++ b/docs/man/amuleweb.es.1 @@ -0,0 +1,173 @@ +.TH AMULEWEB 1 "Marzo 2005" "aMule webserver v2.0.0" "Utilidades de aMule" +.SH NOMBRE +amuleweb \- servidor web de aMule +.SH SYNOPSIS +.B amuleweb +.RB [ \-h " " \fI ] +.RB [ \-p " " \fI ] +.RB [ \-P " " \fI ] +.RB [ \-f " " \fI ] +.RB [ \-l " " \fI ] +.RB [ \-q ] +.RB [ \-v ] +.RB [ \-w ] +.RB [ \-t " " \fI ] +.RB [ \-s " " \fI ] +.RB [ \-z ] +.RB [ \-Z ] +.RB [ \-A " " \fI ] +.RB [ \-G " " \fI ] +.RB [ \-a ] +.RB [ \-d ] +.RB [ \-L ] +.PP +.B amuleweb +.RB [ \-f " " \fI ] +.B \-\-create-config-from=\fI +.PP +.B amuleweb +.RB [ \-\-help ] +.RB [ \-\-version ] +.PP +.RB amuleweb \-\-amule\-config\-file=\fI +.SH DESCRIPCIÓN +\fBamuleweb\fR permite administrar aMule a través de un navegador. +Se puede iniciar amuleweb junto con \fBamule\fR(1), por separado, o en cualquier momento. +Sus opciones se pueden especificar por linea de comandos o mediante su archivo de configuración. +Las opciones pasadas a través de la linea de comandos tienen prioridad sobre las indicadas en el archivo de configuración. +.TP +\fB\-h\fR, \fB\-\-host\fR=\fI\fR +Host donde aMule esta siendo ejecutado (por defecto: \fIlocalhost\fR). +\fI\fR puede ser una IP o una dirección DNS. +.TP +\fB\-p\fR, \fB\-\-port\fR=\fI\fR +El puerto abierto en aMule's para conexiones de External Connections. Puede consultarlo en Preferencias->Controles Remotos (por defecto: \fI4712\fR) +.TP +\fB\-P\fR, \fB\-\-password\fR=\fI\fR +Constraseña para External Connections +.TP +\fB\-f\fR, \fB\-\-config\-file\fR=\fI\fR +Usar el arhivo de configuración indicado. +Por defecto, \fI~/.aMule/remote.conf\fR +.TP +\fB\-l\fR, \fB\-\-locale\fR=\fI\fR +Establece el lenguaje del programa. +Ver la sección \fBNOTAS\fR para la descripción del parámetro \fI\fR. +.TP +\fB\-q\fR, \fB\-\-quiet\fR +No mostrar nada en la consola. +Probablemente interese también el parámetro \fB\-q\fR para ejecutar esta aplicación como demonio, +Por ejemplo: '\fBamuleweb \-q &\fR' +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Mostrar información adicional \- mostrar también información para depuración. +.TP +\fB\-w\fR, \fB\-\-write\-config\fR +Crear el archivo de configuración y salir. +.TP +\fB\-\-create\-config\-from\fR=\fI\fR +Crear el archivo de configuración basándose en \fI\fR y salir. \fI\fR debe ser un archivo de configuración de aMule. +.TP +\fB\-t\fR, \fB\-\-template\fR=\fI\fR +Cargar la piel \fI\fR. Ver la sección +.B PIELES +.TP +\fB\-s\fR, \fB\-\-server\-port\fR=\fI\fR +El puerto HTTP del servidor web. Este es el puerto al que debe direccionar su navegador web (por defecto: \fI4711\fR) +.TP +\fB\-z\fR, \fB\-\-enable\-gzip\fR +Emplear compresión gzip en las transferencias HTTP para reducir el ancho de banda usado. +.TP +\fB\-Z\fR, \fB\-\-disable\-gzip\fR +Deshabilitar la compresión gzip en las transferencias HTTP (esta es la opción por defecto) +.TP +\fB\-A\fR, \fB\-\-admin\-pass\fR=\fI\fR +Definir la contraseña de acceso total al servidor web. +.TP +\fB\-G\fR, \fB\-\-guest\-pass\fR=\fI\fR +Definir la contraseña de acceso al servidor web en modo "invitado". +.TP +\fB\-a\fR, \fB\-\-allow\-guest\fR +Permitir accesos al servidor web en modo "invitado". +.TP +\fB\-d\fR, \fB\-\-deny\-guest\fR +Denegar accesos al servidor web en modo "invitado" (esta es la opción por defecto) +.TP +\fB\-L\fR, \fB\-\-load\-settings\fR +Cargar/guardar la configuración de control remoto de aMule de/a la configuración de aMule. +Esto hace que amuleweb ignore las parámetros que se le pasen y el archivo de configuración, en beneficio de lo que figura en la configuración de aMule. +Al guardar las preferencias, ninguna se guardará en el archivo de configuraciñon del programa, sino en el de aMule. +(Por supuesto, esto solo es válido para aquellas preferencias que pueden ser definidas desde Preferencias->Controles Remotos) +.TP +\fB\-\-amule\-config\-file\fR=\fI\fR +Localización del archivo de configuración de aMule. +.B NO USAR DIRECTAMENTE! +aMule usa esta opción cuando se le pide ejecutar amuelweb al iniciarse. +Esto hace que amuleweb ignore las parámetros que se le pasen y el archivo de configuración, las preferencias se leerán del archivo de configuracin especificado, e implica también las opciones \fB\-q \-L\fR. +.TP +\fB\-\-help\fR +Mostrar información del modo de empleo y salir. +.TP +\fB\-\-version\fR +Mostrar la versión del programa y salir. +.SH NOTAS +.SS Localizaciones +Para todas las opciones que reuieran un parámetro \fI\fR, si la \fIlocalización\fR no contiene el nombre de ningun directorio (por ejemplo, si es simplemente el nombre de un archivo), entonces se tomará como directorio contenedor de ese archivo el directorio de configuración de aMule, \fI~/.aMule\fR. +.SS Lenguajes +El parámetro \fI\fR para la opción \fB\-l\fR tiene el siguiente formato: \fIlenguaje\fR[\fB_\fILENGUAJE\fR][\fB.\fIcodificación\fR][\fB@\fImodificador\fR] +donde \fIlenguaje\fR es el lenguaje principal, \fILENGUAJE\fR es el sublenguaje/territorio, \fIcodificación\fR es el conjunto de caracteres a usar y \fImodificador\fR +"permite al usuario seleccionar una instancia específica de los datos ed localización dentro de una sola categoría". +.PP +Por ejemplo, los siguientes ejemplos son válidos: +.br +fr +.br +fr_FR +.br +de_DE.iso88591 +.br +de_DE@euro +.br +de_DE.iso88591@euro +.PP +A pesar de que todos los ejemplos anteriores son válidos como definiciones de lenguajes, \fIcodificación\fR y \fImodificador\fR siguen sin ser usados. +.PP +Además de lo especificado en el formato anterior, tambien puede especificar el nombre completo de un lenguaje en inglés - así pues, \fB\-l german\fR también es válido y es equivalente a \fB-l de_DE\fR. +.PP +Si no se define ningún lenguaje, ni en los parámetros del programa ni en el archivo de configuración, se usará el predeterminado del sistema. +.SH PIELES +\fBamuleweb\fR soporta diferentes pieles (aspectos de la interfaz). +Puede especificar que piel debe usar amuleweb mediante la opción \fB\-t\fR en la linea de comandos. +Los templates se buscan de dos lugares: primero en \fI~/.aMule/webserver/\fR y, en caso de no encontrarlo, en \fI$(pkgdatadir)/webserver/\fR +(\fI$(pkgdatadir)\fR es el directorio donde se encuentran los datos independientes de la plataforma en su sistema, normalmente algo parecido a /usr/share/amule). +Cada piel debe encontrase en un directorio con el nombre de la piel y este directorio debe contener todos los archivos que esta piel necesite. +El archivo indice de la piel debe llamarse aMule.tmpl. +.PP +Por ejemplo, la piel por defecto (llamada 'default') se encuentra en webserver/default/, y este directorio contiene aMule.tmpl entre otros muchos archivos. +.SH ARCHIVOS +~/.aMule/remote.conf +.br +~/.aMule/webserver/ +.br +\fI$(pkgdatadir)\fR/webserver/ +.SH EJEMPLO +Normalmente la primera ejecución de amuleweb se hace de la siguiente manera: +.PP +\fBamuleweb\fR \fB\-h\fR \fIhostname\fR \fB\-p\fR \fIECport\fR \fB\-P\fR \fIECpassword\fR \fB\-s\fR \fIHTTPport\fR \fB\-A\fR \fIAdminPassword\fR \fB\-w\fR +.PP +o +.PP +\fBamuleweb\fR \fB\-\-create-config-from\fR=\fI/home/username/.aMule/amule.conf\fR +.PP +Esto salva su configuración en \fI$HOME/.aMule/remote.conf\fR, de manera que en sucesivas ejecuciones bastará con: +.PP +.B amuleweb +.PP +Of course, you may specify any more or less options on the first example line, and you may also totally omit it. +.SH BUGS +Si descubre bugs, por favor comuníquelos en (\fIhttp://forum.amule.org/\fR), o en nuestro bugtracker (\fIhttp://bugs.amule.org/\fR). +Por favor, no comunique bugs por e-mail, ni a nuestro maillist ni directamente a ningún miembro del equipo de aMule. +.SH COPYRIGHT +aMule, y todas las utilidades que con el vienen, se distribuyen bajo la licencia GPL. +.SH VER +\fBamule\fR(1), \fBamulecmd\fR(1) diff --git a/docs/man/amuleweb.eu.1 b/docs/man/amuleweb.eu.1 new file mode 100644 index 00000000..696258c1 --- /dev/null +++ b/docs/man/amuleweb.eu.1 @@ -0,0 +1,186 @@ +.TH AMULEWEB 1 "2005 Martxoa" "aMule web zerbitzarua v2.0.0" "aMule lanabesak" +.SH IZENA +amuleweb \- aMule web zerbitzaria +.SH LABURPENA +.B amuleweb +.RB [ \-h " " \fI ] +.RB [ \-p " " \fI ] +.RB [ \-P " " \fI ] +.RB [ \-f " " \fI ] +.RB [ \-q ] +.RB [ \-v ] +.RB [ \-l " " \fI ] +.RB [ \-w ] +.RB [ \-t " " \fI ] +.RB [ \-s " " \fI ] +.RB [ \-z ] +.RB [ \-Z ] +.RB [ \-A " " \fI ] +.RB [ \-G " " \fI ] +.RB [ \-a ] +.RB [ \-d ] +.RB [ \-L ] +.RB [ \-N ] +.PP +.B amuleweb +.RB [ \-f " " \fI ] +.B \-\-create-config-from=\fI +.PP +.B amuleweb +.RB [ \-\-help ] +.RB [ \-\-version ] +.PP +.B amuleweb \-\-amule\-config\-file=\fI +.PP +.B amuleweb \-\-no\-php +.SH AZALPENA +\fBamuleweb\fR-ek web nabigatzaile baten bidezko zure sarrera kudetzaen du. +amuleweb \fBamule\fR(1)\-ekin batera edo beranduago edozein momentutan abiarazi dezakezu. +Aukerak komando lerro edo konfigurazio fitxategiaren bidez ezarri daitezke. +Komando lerro aukerak konfigurazio fitxategiarenen aurretik erabiltzen dira. +.TP +\fB\-h\fR, \fB\-\-host\fR=\fI\fR +Amule abiarazirik dagoen ostalaria (lehenetsia: \fIlocalhost\fR). +\fI\fR IP helbide edo DNS izen bat izan behar da. +.TP +\fB\-p\fR, \fB\-\-port\fR=\fI\fR +aMule-ren kanpo konexioetarako ataka, Hobespenak->Urruneko Kontrolak atalean ezarririk dagoen bezala (lehenetsia: \fI4712\fR) +.TP +\fB\-P\fR, \fB\-\-password\fR=\fI\fR +Kanpo Konexioetarako pasahitza +.TP +\fB\-f\fR, \fB\-\-config\-file\fR=\fI\fR +emandako konfigurazio fitxategia erabili. +Lehenetsiriko konfigurazio fitxategia \fI~/.aMule/remote.conf\fR da. +.TP +\fB\-q\fR, \fB\-\-quiet\fR +ez irteerarik inprimatu irteera estandarrean. +\fB\-q\fR erabili dezakezu web zerbitzaria deabru bezala erabiltzeko, adib '\fBamuleweb \-q &\fR' +.TP +\fB\-v\fR, \fB\-\-verbose\fR +luzea izan \- arazpen mezuak ere ikusi +.TP +\fB\-l\fR, \fB\-\-locale\fR=\fI\fR +Programaren lokalak ezartzen ditu (hizkuntza). +\fROHARRAK\fr atala irakurri \fI\fR parametroaz gehiago jakiteko. +.TP +\fB\-w\fR, \fB\-\-write\-config\fR +komando lerroko aukerak konfigurazio fitxategian gorde eta irten +.TP +\fB\-\-create\-config\-from\fR=\fI\fR +konfigurazio fitxategia \fI\fR oinarriturik egin, zein aMule konfigurazio fitxategiaren bidea izan behar da eta irten +.TP +\fB\-t\fR, \fB\-\-template\fR=\fI\fR +\fI\fR izeneko txantiloia kargarzen du. Ikusi: +.B GAI ONARPENA +.TP +\fB\-s\fR, \fB\-\-server\-port\fR=\fI\fR +Web zerbitzariaren HTTP ataka. Nabigatzailean irekitzeko erabiliko den ataka (lehenetsia: \fI4711\fR) +.TP +\fB\-z\fR, \fB\-\-enable\-gzip\fR +HTTP trafikoan sare zabalera aurrezteko gzip konpresioa gaitu +.TP +\fB\-Z\fR, \fB\-\-disable\-gzip\fR +gzip konpresioa erabiltzea ezgaitu (lehenespena) +.TP +\fB\-A\fR, \fB\-\-admin\-pass\fR=\fI\fR +web zerbitzariaren sarrera osorako pasahitza +.TP +\fB\-G\fR, \fB\-\-guest\-pass\fR=\fI\fR +web zerbitzariaren gonbidatu pasahitza +.TP +\fB\-a\fR, \fB\-\-allow\-guest\fR +Gonbidatu sarrera onartu +.TP +\fB\-d\fR, \fB\-\-deny\-guest\fR +Gonbidatu sarrera ezgaitu (lehenespena) +.TP +\fB\-L\fR, \fB\-\-load\-settings\fR +Webzerbitzari ezarpenak urruneko aMuletik/aMulen kargatu/gorde. +Honek amuleweb-ek komando lerroko eta konfigurazio fitxategiko ezarpenak alde batetara uztea eta aMule-tik kargatzea +eragiten du. Hobespenak gordetzerakoan konfigurazio fitxategian beharrean aMule-n gordeko dira. +(Noski. honek ezarpen hauetarako bakarrik funtzionatzen du, aMule-ren Hobespenak->Urruneko Kontrolean ezarri daitezke) +.TP +\fB\-N\fR, \fB\-\-no\-script\-cache\fR +PHP orriak eskaera bakoitzean birkonpilatu +.TP +\fB\-\-amule\-config\-file\fR=\fI\fR +aMule konfigurazio fitxategiaren bidea. +.B EZ ZUZENEAN ERABILI +aMule-k aukera hau amuleweb aMulerekin batera abiaraztean erabiltzen du. +Aukera honek komando lerroko eta konfigruazio fitxategiko ezarpenak alde batetara uztea eragiten du, hobespenak +emandako konfigurazio fitxategitik irakurriko dira, eta \fB\-q \-L\fR aukerak ere adierazten ditu. +.TP +\fB\-\-help\fR +Erabilera laguntza argibideak bisatarazi eta irten +.TP +\fB\-\-version\fR +Programa bertsio argibideak bistarazi eta irten +.SH OHARRAK +.SS Bideak +Fitxategi bat bide absolutua eman gabe ezarri ezkero ((Adib. fitxategi izen arrunta, \fB\-\-path\fR=\fIremote.conf\fR +bezalakoa), orduan fitxategi hori aMule konfigurazio direktorioan (\fI~/.aMule\fR) bilatuko da. +.SS Hizkuntzak +\fB\-l\fR aukeraren \fI\fR parametroa hurrengo formatukoa da: +\fIhizkuntza\fR[\fB_\fIHIZKUNTZA\fR][\fB.\fIkodeketa\fR][\fB@\fIaldagaia\fR] non \fIhizkuntza\fR hizkuntza nagusia, \fIHIZKUNTZA\fR azpihizkuntz/kokapena, \fIkodeketak\fR karkatere jokoa diren eta \fIaldagaia\fR-k erabiltzaileari kategoria hizkuntza aldagaiak erabiltzeko aukera ematen du" +.PP +Adibdiez, hurrengo kateak egokiak dira: +.br +eu +.br +eu_FR +.br +eu_ES.iso88591 +.br +de_DE@euro +.br +de_DE.iso88591@euro +.PP +Kontutan izan goiko kate guztiak hizkuntz definizio zuzenak direla nahi ez \fIkodeketak\fR eta \fIaldagaia\fR +erabili. +.PP +Goiko formatuaz gain, hizkuntzaren Ingelesezko izen osoaz ere ezarri dezakezu - beraz \fB\-l german\fR egokia da eta +\fB-l de_DE\fR erabiltzearen berdina da. +.PP +Ez denean konfigurazio fitxategian edo komando lerroan lokalik ezartzen sistemaren lehenetsia erabiliko da. +.SH GAI ONARPENA +\fBamuleweb\fR informazio gai ezberdinetan erakusteko gai da. +Gai hauek txantiloi deitzen dira, amuleweb-ek txantiloi bat kargatzeko \fB\-t\fR komando lerroaren bidez. +Txantiloiak bi kokapenetan bilatzen dira: lehenik \fI~/.aMule/webserver/\fR-ean eta gero +\fI$(pkgdatadir)/webserver/\fR-en +(\fI$(pkgdatadir)\fR arkitekturatik independiente diren datuen instalazio kokapena da, normalena /usr/share/amule +antzeko zerbait). +Txantiloi bakoitza bere izen berdineko azpikarpeta batetan egon behar da, eta azpikarpeta honek gaiak behar dituen +fitxategi guztiak eduki behar ditu. +Erabiltzen ari den txantiloi izena aMule.tmpl izan behar da. +.PP +Adibidez, lehenetsiriko txantiloia ('default' izekoa) webserver/default/\-en dago eta direktorio honek aMule.tmpl etairudi fitxategi anitz ditu. +.SH FITXATEGIAK +~/.aMule/remote.conf +.br +~/.aMule/webserver/ +.br +\fI$(pkgdatadir)\fR/webserver/ +.SH ADIBIDEA +Normalean amuleweb lehenengoz horrela abiarazi behar da: +.PP +\fBamuleweb\fR \fB\-h\fR \fIostalaria\fR \fB\-p\fR \fIECataka\fR \fB\-P\fR \fIECpasahitza\fR \fB\-s\fR \fIHTTPataka\fR \fB\-A\fR \fIAdminPasahitza\fR \fB\-w\fR +.PP +edo +.PP +\fBamuleweb\fR \fB\-\-create-config-from\fR=\fI/home/username/.aMule/amule.conf\fR +.PP +Honek ezarpenak \fI$HOME/.aMule/remote.conf\fR-en gordeko ditu eta gero hau egin beharko duzu: +.PP +.B amuleweb +.PP +Noski lehenengo adibidean bainon aukera gehiago edo gutxiago erabili ditzazkezu edo +aukerarik gabe abiarazi. +.SH ZORRIEN BERRI EMATEN +Mesedez zorrien berri emateko gure foroa (\fIhttp://forum.amule.org/\fR), edo gure zorri +kudeatzai$Mesedez ez eman zorrien berri epostaz, ez gure eposta zerrendan ez taldeko +partaideei. +.SH COPYRIGHT +aMule eta inguruneko lanabes guztiak GNU Lizentzia Publiko Orokorraz banatzen dira. +.SH IKUSI ERE +\fBamule\fR(1), \fBamulecmd\fR(1) diff --git a/docs/man/amuleweb.fr.1 b/docs/man/amuleweb.fr.1 new file mode 100644 index 00000000..0fc24066 --- /dev/null +++ b/docs/man/amuleweb.fr.1 @@ -0,0 +1,147 @@ +.TH AMULEWEB 1 "Mars 2005" "Serveur Web d'aMule v2.0.0" "Outil pour aMule" +.SH NOM +amuleweb \- seruveur Web d'aMule +.SH SYNOPSIS +.B amuleweb +.RB [ \-h " " \fI ] +.RB [ \-p " " \fI ] +.RB [ \-P " " \fI ] +.RB [ \-f " " \fI ] +.RB [ \-q ] +.RB [ \-v ] +.RB [ \-w ] +.RB [ \-t " " \fI ] +.RB [ \-s " " \fI ] +.RB [ \-z ] +.RB [ \-Z ] +.RB [ \-A " " \fI ] +.RB [ \-G " " \fI ] +.RB [ \-a ] +.RB [ \-d ] +.RB [ \-L ] +.PP +.B amuleweb +.RB [ \-f " " \fI ] +.B \-\-create-config-from=\fI +.PP +.B amuleweb +.RB [ \-\-help ] +.RB [ \-\-version ] +.PP +.B amuleweb +.RB [ \-\-amule\-config\-file=\fI ] +.SH DESCRIPTION +\fBamuleweb\fR prend en charge l'accès à aMule à travers un navigateur Web. +Vous pouvez le démarrer en même temps qu'\fBamule\fR(1), or séparemment, n'importe quand après. +Les options peuvent être spécifiées par la ligne de commande ou par l'intermédiare d'un fichier de configuration. +Les options spécifiées dans la ligne de commande ont priorité sur celles contenues dans le fichier de configuration. +.TP +\fB\-h\fR, \fB\-\-host\fR=\fI\fR +Hôte où aMule tourne (défaut: \fIlocalhost\fR). +\fI\fR peut être une adresse IP ou un nom DNS. +.TP +\fB\-p\fR, \fB\-\-port\fR=\fI\fR +Port d'aMule pour les Connexions Externes, tel que défini dans Preferences->Contrôles à Distance (défaut: \fI4712\fR). +.TP +\fB\-P\fR, \fB\-\-password\fR=\fI\fR +Mot de passe pour les Connexions Externes. +.TP +\fB\-f\fR, \fB\-\-config\-file\fR=\fI\fR +Utiliser le fichier de configuration désigné. +Le fichier de configuration par défaut est \fI~/.aMule/remote.conf\fR +.TP +\fB\-q\fR, \fB\-\-quiet\fR +N'afficher aucune sortie sur stdout. +Il est utile d'utiliser \fB\-q\fR pour faire tourner amuleweb en service (daemon), i.e. en lançant '\fBamuleweb \-q &\fR' +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Mode bavard \- affiche aussi les messages de debugage. +.TP +\fB\-w\fR, \fB\-\-write\-config\fR +Ecrire les options de la ligne de commande dans le fichier de configuration et quitter. +.TP +\fB\-\-create\-config\-from\fR=\fI\fR +Créer un fichier de configuration basé sur \fI\fR, qui doit pointer sur un fichier de configration d'aMule valide, et quitter ensuite. +.TP +\fB\-t\fR, \fB\-\-template\fR=\fI\fR +Charger le modèle nommé \fI\fR. Voir aussi la section +.B PRISE EN CHARGE DES SKINS. +.TP +\fB\-s\fR, \fB\-\-server\-port\fR=\fI\fR +Port HTTP du serveur Web. C'est le port sur lequel votre navigateur Web doit pointer (défault: \fI4711\fR). +.TP +\fB\-z\fR, \fB\-\-enable\-gzip\fR +Activer la compression gzip dans les échanges HTTP pour diminuer l'utilisation de la bande passante. +.TP +\fB\-Z\fR, \fB\-\-disable\-gzip\fR +Désactiver la compression gzip (comportement par défaut). +.TP +\fB\-A\fR, \fB\-\-admin\-pass\fR=\fI\fR +Mot de passe pour un accès complet au serveur Web. +.TP +\fB\-G\fR, \fB\-\-guest\-pass\fR=\fI\fR +Mot de passe pour un accès restreint au seveur Web (invité). +.TP +\fB\-a\fR, \fB\-\-allow\-guest\fR +Autoriser l'accès aux invités. +.TP +\fB\-d\fR, \fB\-\-deny\-guest\fR +Interdire l'accès aux invités (défaut). +.TP +\fB\-L\fR, \fB\-\-load\-settings\fR +Charger/décharger les réglages du serveur Web depuis un aMule distant. +Ceci permet d'ignorer les options de la ligne de commande et du fichier de configuration et charger celles\-ci depuis aMule. +Lors de la sauvegarde des préférences, celles\-ci ne seront pas sauvegardées dasn le fichier de configuratio, mais vers aMule. +(Bien sûr, ceci n'est valable que pour les options qui peuvent être configurées dans Preferences->Contrôle à Distance) +.TP +\fB\-\-amule\-config\-file\fR=\fI\fR +Chemin vers le fivhier de configuration d'aMule. +.B NE PAS UTILISER DIRECTEMENT! +aMule utilise cette option lorsqu'il démarre amuleweb au lancement d'aMule. +Cette option provoque la non prise en compte des options de ligne de commande et du fichier de configuration, celles\-ci étant lues dans le fichier de configuration fourni en paramètre, et induit aussi les options \fB\-q \-L\fR +.TP +\fB\-\-help\fR +Afficher l'aide d'utilisation et quitter. +.TP +\fB\-\-version\fR +Afficher les informations sur la version courante et quitter. +.SH NOTE +Pour toutes les options prenant en paramètre un \fI\fR, si le \fIchemin\fR ne contient pas de répertoire (i.e. juste un nom de fichier), alors il sera considéré comme étant dans le répertoire de configuration d'aMule, \fI~/.aMule\fR. +.SH PRISE EN CHARGE DES SKINS +\fBamuleweb\fR est capable d'afficher ses informations dans différents skins. +Ces skins sont appelés modèles, et vous pouvez dire à amuleweb de charger un modèle spécifique par l'otion de ligne de commande \fB\-t\fR. +Les modèles sont recherchés dans deux endroits: d'abord dans \fI~/.aMule/webserver/\fR puis dans \fI$(pkgdatadir)/webserver/\fR +(\fI$(pkgdatadir)\fR est le répertoire d'installation des données indépendantes de l'architecture, la plupart du temps quelque chose comme /usr/share/amule). +Chaque modèle doit être dans un sous\-répertoire du nom du modèle, et ce répertoire doit contenir tous les fichiers dont à besoin le modèle. +Le fichier modèle doit avoir comme nom aMule.tmpl. +.PP +Par exemple, le modèle par défaut (nommé 'default') se trouve dans webserver/default/, et ce répertoure contient aMule.tmpl ainsi qu'un grand nombre de fichiers d'images. +.SH FICHIERS +~/.aMule/remote.conf +.br +~/.aMule/webserver/ +.br +\fI$(pkgdatadir)\fR/webserver/ +.SH EXEMPLE +Typiquement amuleweb sera lancé la première fois de la façon suivante: +.PP +\fBamuleweb\fR \fB\-h\fR \fIhostname\fR \fB\-p\fR \fIECport\fR \fB\-P\fR \fIECpassword\fR \fB\-s\fR \fIHTTPport\fR \fB\-A\fR \fIAdminPassword\fR \fB\-w\fR +.PP +ou +.PP +\fBamuleweb\fR \fB\-\-create-config-from\fR=\fI/home/username/.aMule/amule.conf\fR +.PP +Cela sauvegardera les options dans \fI$HOME/.aMule/remote.conf\fR, et les fois suivantes, vous n'aurez à taper que: +.PP +.B amuleweb +.PP +Bien sûr, vous pouvez ajouter plus ou moins d'options de ligne de commande, ou vous pouvez aussi n'en spécifier aucune. +.SH SIGNALEMENT DES BUGS +Reportez les bugs sur notre forum (\fIhttp://forum.amule.org/\fR), ou dans notre bugtracker (\fIhttp://bugs.amule.org/\fR). +N'utilisez ni un e-mail, ni notre liste de diffusion ni ne reportez directement un bug à un membre de notre equipe. +.SH COPYRIGHT +aMule et tous les utilitaires associés sont distribués sous licence GNU General Public License. +.SH VOIR AUSSI +\fBamule\fR(1), \fBamulecmd\fR(1) +.SH TRADUCTION +ThePolish, 2005 diff --git a/docs/man/amuleweb.hu.1 b/docs/man/amuleweb.hu.1 new file mode 100644 index 00000000..84f7acbf --- /dev/null +++ b/docs/man/amuleweb.hu.1 @@ -0,0 +1,171 @@ +.TH AMULEWEB 1 "2005 március" "aMule web kiszolgáló v2.0.0" "aMule segédprogramok" +.SH NÉV +amuleweb \- aMule web kiszolgáló +.SH ÁTTEKINTÉS +.B amuleweb +.RB [ \-h " " \fI ] +.RB [ \-p " " \fI ] +.RB [ \-P " " \fI ] +.RB [ \-f " " \fI ] +.RB [ \-l " " \fI ] +.RB [ \-q ] +.RB [ \-v ] +.RB [ \-w ] +.RB [ \-t " " \fI ] +.RB [ \-s " " \fI ] +.RB [ \-z ] +.RB [ \-Z ] +.RB [ \-A " " \fI ] +.RB [ \-G " " \fI ] +.RB [ \-a ] +.RB [ \-d ] +.RB [ \-L ] +.PP +.B amuleweb +.RB [ \-f " " \fI ] +.B \-\-create-config-from=\fI +.PP +.B amuleweb +.RB [ \-\-help ] +.RB [ \-\-version ] +.PP +.B amuleweb \-\-amule\-config\-file=\fI +.SH LEÍRÁS +Az \fBamuleweb\fR kezeli az aMule-hoz való hozzáférést egy böngészõ segítségével. +Az \fBamuleweb\fR kiszolgáló elindítható az \fBamule\fR(1) indítákor, azzal együtt, vagy külön, bármikor késõbb. +Az opciók parancssorban vagy konfigurácós fájlban is megadhatók. +A parancssorban megadott opciók felülbírálják a konfigurációs fájlban megadottakat. +.SH OPCIÓK +.TP +\fB\-h\fR, \fB\-\-host\fR=\fI\fR +A gép, ahol az aMule fut (alapértelmezés: \fIlocalhost\fR). +A \fI\fR lehet egy IP cím vagy DNS név. +.TP +\fB\-p\fR, \fB\-\-port\fR=\fI\fR +Az aMule távoli elérés portja (alapértelmezés: \fI4712\fR). +.TP +\fB\-P\fR, \fB\-\-password\fR=\fI\fR +A távoli elérés jelszava. +.TP +\fB\-f\fR, \fB\-\-config\-file\fR=\fI\fR +A megadott konfigurációs fájlt használja. +Az alapértelmezés a \fI~/.aMule/remote.conf\fR +.TP +\fB\-l\fR, \fB\-\-locale\fR=\fI\fR +Beállítja a program nyelvét. +Lásd a \fBMEGJEGYZÉSEK\fR fejezetet a \fI\fR paraméter bõvebb leírásához. +.TP +\fB\-q\fR, \fB\-\-quiet\fR +Csendes mód, semmit nem ír ki a szabvány kimenetre. +Ezt a háttérben való futtatáshoz lehet jól használni, pl. így indítva: \fBamuleweb \-q &\fR +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Bõbeszédû mód, a hibakeresési üzeneteket is megjeleníti. +.TP +\fB\-w\fR, \fB\-\-write\-config\fR +A parancssori paramétereket kiírja a konfigurációs fájlba és kilép. +.TP +\fB\-\-create\-config\-from\fR=\fI\fR +Konfigurációs fájl készítése a \fI\fR alapján, amely az aMule érvényes konfigurációs fájlja kell legyen, majd utána kilép. +.TP +\fB\-t\fR, \fB\-\-template\fR=\fI\fR +A megadott nevû sablon használata. Lásd még a \fBSABLONOK\fR fejezetet. +.TP +\fB\-s\fR, \fB\-\-server\-port\fR=\fI\fR +A web kiszolgáló HTTP portja, alapértelmezés szerint \fI4711\fR. Ezen keresztül kommunikál a böngészõvel. +.TP +\fB\-z\fR, \fB\-\-enable\-gzip\fR +Gzip tömörítés engedélyezése a HTTP forgalom részére. +.TP +\fB\-Z\fR, \fB\-\-disable\-gzip\fR +Gzip tömörítés tiltása (alapértelmezett). +.TP +\fB\-A\fR, \fB\-\-admin\-pass\fR=\fI\fR +Teljes jogú web felület hozzáférést biztosító jelszó. +.TP +\fB\-G\fR, \fB\-\-guest\-pass\fR=\fI\fR +Vendég felhasználó jelszava. +.TP +\fB\-a\fR, \fB\-\-allow\-guest\fR +Vengég felhasználó engedélyezése. +.TP +\fB\-d\fR, \fB\-\-deny\-guest\fR +Vendég felhasználó tiltása (alapértelmezett). +.TP +\fB\-L\fR, \fB\-\-load\-settings\fR +A webkiszolgáló beállításainak töltése/mentése a távoli aMule-ról/ra. +Ebben az esetben az \fBamuleweb\fR figyelmen kívül hagyja azokat a parancssori és konfigurációs fájlbeli beállításokat, amelyeket az aMule-tól is be tud szerezni (ezek beállíthatóak a Beállítások->Távoli Elérés pontban). +A beállítások mentésekor sem írja azokat fájlba (mint egyébként), hanem az aMule-t értesíti a beállítások megváltozásáról. +Azon beállítások, melyek az aMule Beállítások párbeszédpaneljén nem szerpelnek, nem kerülnek mentésre. +.TP +\fB\-\-amule\-config\-file\fR=\fI\fR +Az aMule konfigurációs fájljának elérési útvonala. +.B NE HASZNÁLJA EZT A PARAMÉTERT! +Ezt az aMule használja, hogy induláskor el tudja indítani a web kiszolgálót. +Ennek hatására az \fBamuleweb\fR minden egyéb parancssori, konfigurációs és alapértelmezett beállítást figyelmen kívül hagy, és a megadott konfigurációs fájlból olvassa be azokat, ezen kívül úgy viselkedik, mintha a \fB\-q \-L\fR opciók is meg lennének adva. +.TP +\fB\-\-help\fR +Megjeleníti a súgót és kilép. +.TP +\fB\-\-version\fR +Megjeleníti a program verzióját, majd kilép. +.SH MEGJEGYZÉSEK +.SS Elérési utak +Minden olyan opciónál, amely \fI\fR paramétert kér, ha a megadott \fIfájl\fR nem tartalmaz könyvtár komponenst (vagyis tisztán csak egy fájlnév), akkor azt az aMule konfigurációs könyvtárában (\fI~/.aMule\fR) fogja keresni. +.SS Nyelvek +A \fB\-l\fR opció \fI\fR paramétere a következõ módon adható meg: \fInyelv\fR[\fB_\fITERÜLET\fR][\fB.\fIkódolás\fR][\fB@\fImódosító\fR], ahol \fInyelv\fR az elsõdleges nyelv, \fITERÜLET\fR egy nyelvváltozat/terület kódja, \fIkódolás\fR a karakter készlet kódja és a \fImódosító\fR "lehetõvé teszi, hogy a felhasználó kiválasszon egy meghatározott esetet a helyi jellemzõk adataiból egyetlen kategórián belül". +.PP +Például, a következõ értékek mind érvényesek: +.br +fr +.br +fr_FR +.br +de_DE.iso88591 +.br +de_DE@euro +.br +de_DE.iso88591@euro +.PP +Habár a fenieket mind elfogadja a program, mint érvényes nyelvmeghatározást, a \fIkódolás\fR és \fImódosító\fR még nem használt. +.PP +Ráadaásként a fenti formátumhoz, megadható akár egy nyelv teljes angol megnevezése is, így például \fB\-l german\fR szintén érvényes, és egyenértékû a \fB-l de_DE\fR megadással. +.PP +Ha sem a parancssorban, sem a konfigurációs fájlban nincsen megadva a nyelv, akkor a rendszer alapértelmezett nyelvét fogja használni. +.SH SABLONOK +Az \fBamuleweb\fR képes az információ különbözõ felületekkel történõ megjelenítésére. +Ezeket hívjuk sablonoknak, és az \fBamuleweb\fR a \fB\-t\fR parancssori opcióval vehetõ rá egy adott sablon használatára. +A sablonokat a következõ helyen keresi: elõször az \fI~/.aMule/webserver/\fR könyvtárban, majd utána a \fI$(pkgdatadir)/webserver/\fR könyvtárban, ahol (\fI$(pkgdatadir)\fR a hardver független adatok installálási helye, általában /usr/share/amule). +Minden egyes sablonnak a sablon nevével megegyezõ alkönyvtárban kell lennie, és ez a könyvtár kell tartalmazzon minden fájlt, amelyre a sablonnak szüksége van. +Magának a sablont tartalmazó fájlnak a neve aMule.tmpl kell, hogy legyen. +.PP +Például az alapértelmezett sablon (a neve 'default') a webserver/default/ könyvtárban van, és ez a könyvtár tartalmazza az aMule.tmpl fájlt, meg egy jó pár képet hozzá. +.SH FÁJLOK +~/.aMule/remote.conf +.br +~/.aMule/webserver/ +.br +\fI$(pkgdatadir)\fR/webserver/ +.SH PÉLDA +Tipikusan az \fBamuleweb\fR elsõ indításakor létrehozunk egy konfigurációs fájlt, vagy az +.PP +\fBamuleweb\fR \fB\-h\fR \fIgépnév\fR \fB\-p\fR \fIEC_port\fR \fB\-P\fR \fIEC_jelszó\fR \fB\-s\fR \fIHTTP_port\fR \fB\-A\fR \fITeljesJogúJelszó\fR \fB\-w\fR +.PP +paranccsal, vagy, ha nem akarjuk a parancssorban megadni a jelszót, akkor pl. az +.PP +\fBamuleweb\fR \fB\-\-create-config-from\fR=\fI/home/felhasználónév/.aMule/amule.conf\fR +.PP +paranccsal. Természetesen a fenti elérési út a helyi viszonyoknak megfelelõen változhat. A beállítások tehát elmentõdnek a \fI$HOME/.aMule/remote.conf\fR fájlba, és ezek után már egyszerûen az +.PP +.B amuleweb +.PP +paranccsal indíthatjuk a web kiszolgálót. +.SH HIBÁK JELENTÉSE +A hibákat kérjük vagy a fórumon (\fIhttp://forum.amule.org/\fR), vagy a hibakövetõben (\fIhttp://bugs.amule.org/\fR) jelentsék. +Hibákról kérjük ne írjanak levelet (e-mail-t) se a levelzési listára, se közvetlenül valamelyik fejlesztõnek. +.SH COPYRIGHT +Az aMule és az összes hozzá tartozó segédprogram a GNU General Public Licence védelme alatt áll. +.SH LÁSD MÉG +\fBamule\fR(1), \fBamulecmd\fR(1) +.SH MAGYAR FORDÍTÁS +Dévai Tamás diff --git a/docs/man/ed2k.1 b/docs/man/ed2k.1 new file mode 100644 index 00000000..83d6a572 --- /dev/null +++ b/docs/man/ed2k.1 @@ -0,0 +1,34 @@ +.TH ED2K "1" "January 2007" "aMule ED2k link parser v1.2.0" "aMule utilities" +.SH NAME +ed2k \- aMule ED2k link parser +.SH SYNOPSIS +.B ed2k +.I +.PP +.B ed2k +.RB [ \-\-help ] +.RB [ \-\-config\-dir, \-c ] +.RB [ \-\-version ] +.SH DESCRIPTION +aMule ED2k link parser v1.1.0. +Sends the given \fI\fR to aMule, i.e. writes it to the file ~/.aMule/ED2KLinks, which will be checked by aMule every second for links. +\fBed2k\fR accepts file, server and serverlist links. +.SS "Usage:" +.TP +\fB\-\-help\fR +Prints a short usage description. +.TP +\fB\-c\fR, \fB\-\-config\-dir\fR=\fI\fR +Specifies the aMule configuration directory. This must be writeable by the user running \fBed2k\fR. +.TP +\fB\-\-version\fR +Displays the current version number. +.SH FILES +~/.aMule/ED2KLinks +.SH REPORTING BUGS +Please report bugs either on our forum (\fIhttp://forum.amule.org/\fR), or in our bugtracker (\fIhttp://bugs.amule.org/\fR). +Please do not report bugs in e-mail, neither to our mailing list nor directly to any team member. +.SH COPYRIGHT +aMule and all of its related utilities are distributed under the GNU General Public License. +.SH SEE ALSO +\fBamule\fR(1) diff --git a/docs/man/ed2k.de.1 b/docs/man/ed2k.de.1 new file mode 100644 index 00000000..ccd6113b --- /dev/null +++ b/docs/man/ed2k.de.1 @@ -0,0 +1,40 @@ +.\"******************************************************************* +.\" +.\" This file was generated with po4a. Translate the source file. +.\" +.\"******************************************************************* +.TH ED2K 1 "Januar 2007" "aMule ED2k link parser v1.2.0" "aMule Hilfsprogramme" +.SH NAME +ed2k \- aMule ED2k link parser +.SH SYNTAX +\fBed2k\fP \fI\fP +.PP +\fBed2k\fP [\fB\-\-help\fP] [\fB\-\-config\-dir,\fP\-c\fB]\fP [\fB\-\-version\fP] +.SH BESCHREIBUNG +aMule ED2k link parser v1.1.0. Sendet den übergebenen \fI\fP +an aMule, z.B. schreibt ihn in die Datei ~/.aMule/ED2KLinks, welche von +aMule auf neue Links überprüft wird. \fBed2k\fP akzeptiert Datei\-, Server\- und +Serverlistenlinks. +.SS Nutzung: +.TP +\fB\-\-help\fP +Gibt eine kurze Beschreibung aus. +.TP +\fB\-c\fP, \fB\-\-config\-dir\fP=\fI\fP +Gibt das aMule Konfigurationsverzeichnis an. Dieses muss durch den Nutzer +der \fBed2k\fP aufruft Beschreibbar sein. +.TP +\fB\-\-version\fP +Zeigt die derzeitige Versionsnummer an. +.SH DATEIEN +~/.aMule/ED2KLinks +.SH "FEHLER MELDEN" +Bitte meldet Fehler entweder in unserem Forum (\fIhttp://forum.amule.org/\fP), +oder in unseren Bugtracker (\fIhttp://bugs.amule.org/\fP). Bitte meldet uns +keine Fehler per E\-Mail, noch auf unsere Mailingliste oder direkt an unsere +Teammitglieder. +.SH COPYRIGHT +aMule und alle seine zugehörigen Anwendungen werden verteilt unter der GNU +General Public License +.SH "SIEHE AUCH" +\fBamule\fP(1) diff --git a/docs/man/ed2k.es.1 b/docs/man/ed2k.es.1 new file mode 100644 index 00000000..0bd601f6 --- /dev/null +++ b/docs/man/ed2k.es.1 @@ -0,0 +1,30 @@ +.TH ED2K "1" "Marzo 2005" "aMule ED2k link parser v1.1.0" "Utilidades de aMule" +.SH NOMBRE +ed2k \- digeridor de enlaces eD2k a aMule +.SH SINOPSYS +.B ed2k +.I +.PP +.B ed2k +.RB [ \-\-help ] +.RB [ \-\-version ] +.SH DESCRIPCIÓN +aMule ED2k link parser v1.1.0. +Envía el enlace \fI\fR a aMule, es decir, lo añade al archivo ~/.aMule/ED2KLinks, el cual será leido por aMule en busca de nuevas descargas. +\fBed2k\fR acepta enlaces referidos a archivos, servidores y listas de servidores. +.SS "Uso:" +.TP +\fB\-\-help\fR +Muestra esta ayuda. +.TP +\fB\-\-version\fR +Muestra la versión del programa. +.SH ARCHIVOS +~/.aMule/ED2KLinks +.SH BUGS +Si descubre bugs, por favor comuníquelos en (\fIhttp://forum.amule.org/\fR), o en nuestro bugtracker (\fIhttp://bugs.amule.org/\fR). +Por favor, no comunique bugs por e-mail, ni a nuestro maillist ni directamente a ningún miembro del equipo de aMule. +.SH COPYRIGHT +aMule, y todas las utilidades que con el vienen, se distribuyen bajo la licencia GPL. +.SH VER +\fBamule\fR(1) diff --git a/docs/man/ed2k.eu.1 b/docs/man/ed2k.eu.1 new file mode 100644 index 00000000..248d81d7 --- /dev/null +++ b/docs/man/ed2k.eu.1 @@ -0,0 +1,36 @@ +.TH ED2K "1" "March 2005" "aMule ED2k link parser v1.1.0" "aMule utilities" +.SH IZENA +ed2k \- aMule ED2k lotura analizatzailea +.SH LABURPENA +.B ed2k +.I +.PP +.B ed2k +.RB [ \-\-help ] +.RB [ \-\-config\-dir, \-c ] +.RB [ \-\-version ] +.SH DESCRIPTION +aMule ED2k lotura analizatzailea 1.1.0b. +Emandako \fI\fR lotur aMulera bidali, adib. berau ~/.aMule/ED2KLinks fixtategian idatzi, zein aMulek segunduro begiratzen duen lotura berrien bila. +\fBed2k\fR-ek fitxategi, zerbitzari eta zerbitzari zerrenda loturak onartzen ditu. +.SS "Erabilera:" +.TP +\fB\-\-help\fR +Laguntza hau bistarazi. +.TP +\fB\-c\fR, \fB\-\-config\-dir\fR=\fI\fR +Amuleren konfigurazio fitxategia ezartzen du, bertan \fBed2k\fR abiarazten duen erabiltzaileak idazteko eskubidea izan behar du. +.TP +\fB\-\-version\fR +Bertsio argibideak bistarazi. +.SH FITXATEGIAK +~/.aMule/ED2KLinks +.SH ZORRIEN BERRI EMATEN +Mesedez zorrien berri emateko gure foroa (\fIhttp://forum.amule.org/\fR), edo gure zorri kudeatzailea +(\fIhttp://bugs.amule.$ +Mesedez ez eman zorrien berri epostaz, ez gure eposta zerrendan ez taldeko partaideei. +.SH COPYRIGHT +aMule eta inguruneko lanabes guztiak GNU Lizentzia Publiko Orokorraz banatzen dira. +.SH IKUSI ERE +.SH SEE ALSO +\fBamule\fR(1) diff --git a/docs/man/ed2k.fr.1 b/docs/man/ed2k.fr.1 new file mode 100644 index 00000000..a913c9b7 --- /dev/null +++ b/docs/man/ed2k.fr.1 @@ -0,0 +1,31 @@ +.TH ED2K "1" "Mars 2005" "Prise en charge des liens ED2k d'aMule v1.1.0" "Outil pour aMule" +.SH NOM +ed2k \- prise en charge des liens ED2K d'aMule +.SH SYNOPSIS +.B ed2k +.I +.PP +.B ed2k +.RB [ \-\-help ] +.RB [ \-\-version ] +.SH DESCRIPTION +Envoi le lien ED2K \fI\fR à aMule, i.e. écrit celui\-ci dans ~/.aMule/ED2KLinks, qui est examiné par aMule chaque seconde en quête de nouveaux liens. +\fBed2k\fR accepte en lien un fichier, un serveur et une liste de serveurs. +.SS "Usage:" +.TP +\fB\-\-help\fR +Afficher l'aide d'utilisation. +.TP +\fB\-\-version\fR +Afficher les informations sur la version courante. +.SH FICHIERS +~/.aMule/ED2KLinks +.SH SIGNALEMENT DES BUGS +Reportez les bugs sur notre forum (\fIhttp://forum.amule.org/\fR), ou dans notre bugtracker (\fIhttp://bugs.amule.org/\fR). +N'utilisez ni un e-mail, ni notre liste de diffusion ni ne reportez directement un bug à un membre de notre equipe. +.SH COPYRIGHT +aMule et tous les utilitaires associés sont distribués sous licence GNU General Public License. +.SH VOIR AUSSI +\fBamule\fR(1) +.SH TRADUCTION +ThePolish, 2005 diff --git a/docs/man/ed2k.hu.1 b/docs/man/ed2k.hu.1 new file mode 100644 index 00000000..fc392629 --- /dev/null +++ b/docs/man/ed2k.hu.1 @@ -0,0 +1,32 @@ +.TH ED2K "1" "2005 március" "aMule ED2k link parser v1.1.0" "aMule segédprogramok" +.SH NÉV +ed2k \- aMule ED2k hivatkozás feldolgozó +.SH ÁTTEKINTÉS +.B ed2k +.I +.PP +.B ed2k +.RB [ \-\-help ] +.RB [ \-\-version ] +.SH LEÍRÁS +aMule ED2k hivatkozás feldolgozó v1.1.0. +Elküldi a megadott \fI\fR-t az aMule-nak, azaz a \fI~/.aMule/ED2KLinks\fR fájlba írja, amelyet az aMule minden másodpercben ellenõriz. +Az \fBed2k\fR program elfogad fájl, szerver és szerver-lista hivatkozásokat. +.SS "Használat:" +.TP +\fB\-\-help\fR +Kiírja ezt a súgót. +.TP +\fB\-\-version\fR +Kiírja a verzió információt. +.SH FÁJLOK +~/.aMule/ED2KLinks +.SH HIBÁK JELENTÉSE +A hibákat kérjük vagy a fórumon (\fIhttp://forum.amule.org/\fR), vagy a hibakövetõben (\fIhttp://bugs.amule.org/\fR) jelentsék. +Hibákról kérjük ne írjanak levelet (e-mail-t) se a levelzési listára, se közvetlenül valamelyik fejlesztõnek. +.SH COPYRIGHT +Az aMule és az összes hozzá tartozó segédprogram a GNU General Public Licence védelme alatt áll. +.SH LÁSD MÉG +\fBamule\fR(1) +.SH MAGYAR FORDÍTÁS +Dévai Tamás diff --git a/docs/man/manpages-de.po b/docs/man/manpages-de.po new file mode 100644 index 00000000..e1c07721 --- /dev/null +++ b/docs/man/manpages-de.po @@ -0,0 +1,1726 @@ +# translation of manpages-de.po to +# SOME DESCRIPTIVE TITLE +# Copyright (C) 2007 Free Software Foundation, Inc. +# +# Werner Mahr , 2007. +msgid "" +msgstr "" +"Project-Id-Version: manpages-de\n" +"POT-Creation-Date: 2007-08-22 18:10+0200\n" +"PO-Revision-Date: 2007-08-23 13:11+0200\n" +"Last-Translator: Werner Mahr \n" +"Language-Team: \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" + +# type: TH +#: amule.1:1 +#, no-wrap +msgid "AMULE" +msgstr "AMULE" + +# type: TH +#: amule.1:1 amuled.1:1 amulecmd.1:1 amulegui.1:1 amuleweb.1:1 ed2k.1:1 ../../src/utils/cas/docs/cas.1:1 ../../src/utils/cas/docs/cas.1:6 ../../src/utils/wxCas/docs/wxcas.1:1 ../../src/utils/xas/docs/xas.1:1 +#, no-wrap +msgid "January 2007" +msgstr "Januar 2007" + +# type: TH +#: amule.1:1 +#, no-wrap +msgid "aMule v2.2.0" +msgstr "aMule v2.2.0" + +# type: TH +#: amule.1:1 +#, no-wrap +msgid "aMule" +msgstr "aMule" + +# type: SH +#: amule.1:2 amuled.1:2 amulecmd.1:2 amulegui.1:2 amuleweb.1:2 ed2k.1:2 ../../src/utils/cas/docs/cas.1:2 ../../src/utils/wxCas/docs/wxcas.1:2 ../../src/utils/xas/docs/xas.1:2 +#, no-wrap +msgid "NAME" +msgstr "NAME" + +# type: Plain text +#: amule.1:4 +msgid "amule - the all-platform eMule p2p client" +msgstr "amule - der alle-Plattformen eMule p2p Client" + +# type: SH +#: amule.1:4 amuled.1:4 amulecmd.1:4 amulegui.1:4 amuleweb.1:4 ed2k.1:4 ../../src/utils/cas/docs/cas.1:4 ../../src/utils/wxCas/docs/wxcas.1:4 ../../src/utils/xas/docs/xas.1:4 +#, no-wrap +msgid "SYNOPSIS" +msgstr "SYNTAX" + +# type: Plain text +#: amule.1:13 +msgid "" +"B [B<-v>] [B<-h>] [B<-i>] [B<-geometry> IgeomE>] [B<-d>] " +"[B<-o>] [B<-r>]" +msgstr "" +"B [B<-v>] [B<-h>] [B<-i>] [B<-geometry> IgeomE>] [B<-d>] " +"[B<-o>] [B<-r>]" + +# type: SH +#: amule.1:13 amuled.1:15 amulecmd.1:24 amulegui.1:6 amuleweb.1:36 ed2k.1:12 ../../src/utils/cas/docs/cas.1:7 ../../src/utils/wxCas/docs/wxcas.1:6 ../../src/utils/xas/docs/xas.1:6 +#, no-wrap +msgid "DESCRIPTION" +msgstr "BESCHREIBUNG" + +# type: TP +#: amule.1:14 amuled.1:16 +#, no-wrap +msgid "B<-v>, B<--version>" +msgstr "B<-v>, B<--version>" + +# type: Plain text +#: amule.1:17 amuled.1:19 amulecmd.1:65 amuleweb.1:118 ed2k.1:26 +msgid "Displays the current version number." +msgstr "Zeigt die derzeitige Versionsnummer an." + +# type: TP +#: amule.1:17 amuled.1:19 ../../src/utils/cas/docs/cas.1:28 +#, no-wrap +msgid "B<-h>, B<--help>" +msgstr "B<-h>, B<--help>" + +# type: Plain text +#: amule.1:20 amuled.1:22 amulecmd.1:62 amuleweb.1:115 ed2k.1:20 ../../src/utils/cas/docs/cas.1:31 +msgid "Prints a short usage description." +msgstr "Gibt eine kurze Beschreibung aus." + +# type: TP +#: amule.1:20 amuled.1:22 +#, no-wrap +msgid "B<-i>, B<--enable-stdin>" +msgstr "B<-i>, B<--enable-stdin>" + +# type: Plain text +#: amule.1:23 amuled.1:25 +msgid "Does not disable stdin." +msgstr "Schaltet stdin nicht ab." + +# type: TP +#: amule.1:23 +#, no-wrap +msgid "B<-geometry> IgeomE>" +msgstr "B<-geometry> IgeomE>" + +# type: Plain text +#: amule.1:27 +msgid "" +"Sets the geometry of the app. IgeomE> uses the same format as " +"standard X11 " +"apps:\t[B<=>][IwidthE>{B}IheightE>][{B<+->}IxoffsetE>{B<+->}IyoffsetE>]" +msgstr "Gibt die Geometrie des Programms an. IgeomE> benutzt das selbe Format wie Standard X11 Anwendungen\t[B<=>][IBreiteE>{B}IHöheE>][{B<+->}IxoffsetE>{B<+->}IyoffsetE>]" + +# type: TP +#: amule.1:27 amuled.1:31 +#, no-wrap +msgid "B<-d>, B<--disable-fatal>" +msgstr "B<-d>, B<--disable-fatal>" + +# type: Plain text +#: amule.1:30 amuled.1:34 +msgid "Does not handle fatal exception." +msgstr "Fehlerbehandlung für fatale Fehler abschalten." + +# type: TP +#: amule.1:30 amuled.1:34 +#, no-wrap +msgid "B<-o>, B<--log-stdout>" +msgstr "B<-o>, B<--log-stdout>" + +# type: Plain text +#: amule.1:33 amuled.1:37 +msgid "Print log messages to stdout." +msgstr "Gibt Log-Meldungen auf der Standardausgabe aus." + +# type: TP +#: amule.1:33 +#, no-wrap +msgid "B<-r>, B<--reset-config>" +msgstr "B<-r>, B<--reset-config>" + +# type: Plain text +#: amule.1:36 +msgid "Resets config to default values." +msgstr "Setzt die Konfiguration auf die Standardwerte zurück." + +# type: SH +#: amule.1:36 amuled.1:37 amulecmd.1:238 amuleweb.1:157 ed2k.1:26 ../../src/utils/cas/docs/cas.1:33 +#, no-wrap +msgid "FILES" +msgstr "DATEIEN" + +# type: Plain text +#: amule.1:39 amuled.1:39 +msgid "~/.aMule/*" +msgstr "~/.aMule/*" + +# type: SH +#: amule.1:39 amuled.1:39 amulecmd.1:254 amulegui.1:13 amuleweb.1:177 ed2k.1:28 ../../src/utils/cas/docs/cas.1:41 ../../src/utils/wxCas/docs/wxcas.1:17 ../../src/utils/xas/docs/xas.1:16 +#, no-wrap +msgid "REPORTING BUGS" +msgstr "FEHLER MELDEN" + +# type: Plain text +#: amule.1:42 amuled.1:42 amulecmd.1:257 amulegui.1:16 amuleweb.1:180 ed2k.1:31 ../../src/utils/cas/docs/cas.1:44 ../../src/utils/wxCas/docs/wxcas.1:20 ../../src/utils/xas/docs/xas.1:19 +msgid "" +"Please report bugs either on our forum (I), or in " +"our bugtracker (I). Please do not report bugs in " +"e-mail, neither to our mailing list nor directly to any team member." +msgstr "Bitte meldet Fehler entweder in unserem Forum (I), oder in unseren Bugtracker (I). Bitte meldet uns keine Fehler per E-Mail, noch auf unsere Mailingliste oder direkt an unsere Teammitglieder." + +# type: SH +#: amule.1:42 amuled.1:42 amulecmd.1:257 amulegui.1:16 amuleweb.1:180 ed2k.1:31 ../../src/utils/cas/docs/cas.1:44 ../../src/utils/wxCas/docs/wxcas.1:20 ../../src/utils/xas/docs/xas.1:19 +#, no-wrap +msgid "COPYRIGHT" +msgstr "COPYRIGHT" + +# type: Plain text +#: amule.1:44 amuled.1:44 amulecmd.1:259 amulegui.1:18 amuleweb.1:182 ed2k.1:33 ../../src/utils/cas/docs/cas.1:46 ../../src/utils/wxCas/docs/wxcas.1:22 ../../src/utils/xas/docs/xas.1:21 +msgid "" +"aMule and all of its related utilities are distributed under the GNU General " +"Public License." +msgstr "aMule und alle seine zugehörigen Anwendungen werden verteilt unter der GNU General Public License" + +# type: SH +#: amule.1:44 amuled.1:44 amulecmd.1:259 amulegui.1:18 amuleweb.1:182 ed2k.1:33 ../../src/utils/cas/docs/cas.1:46 ../../src/utils/wxCas/docs/wxcas.1:22 ../../src/utils/xas/docs/xas.1:21 +#, no-wrap +msgid "SEE ALSO" +msgstr "SIEHE AUCH" + +# type: Plain text +#: amuled.1:1 +msgid "" +"B(1), B(1), B(1), B(1), B(1), " +"B(1), B(1), B(1), B(1), B(1)" +msgstr "" +"B(1), B(1), B(1), B(1), B(1), " +"B(1), B(1), B(1), B(1), B(1)" + +# type: TH +#: amuled.1:1 +#, no-wrap +msgid "AMULED" +msgstr "AMULED" + +# type: TH +#: amuled.1:1 +#, no-wrap +msgid "aMule Daemon v2.2.0" +msgstr "aMule Daemon v2.2.0" + +# type: TH +#: amuled.1:1 +#, no-wrap +msgid "aMule Daemon" +msgstr "aMule Daemon" + +# type: Plain text +#: amuled.1:4 +msgid "amuled - the all-platform eMule p2p client - daemonized version" +msgstr "amuled - Der alle-Plattformen eMule p2p Client - dämonisierte Version" + +# type: Plain text +#: amuled.1:14 +msgid "" +"B [B<-v>] [B<-h>] [B<-i>] [B<-f>] [B<-c> IdirE>] [B<-d>] " +"[B<-o>] [B<-r>]" +msgstr "" +"B [B<-v>] [B<-h>] [B<-i>] [B<-f>] [B<-c> IPfadE>] [B<-d>] " +"[B<-o>] [B<-r>]" + +# type: TP +#: amuled.1:25 +#, no-wrap +msgid "B<-f>, B<--full-daemon>" +msgstr "B<-f>, B<--full-daemon>" + +# type: Plain text +#: amuled.1:28 +msgid "Fork to Background" +msgstr "Im Hintergrund ausführen" + +# type: TP +#: amuled.1:28 +#, no-wrap +msgid "B<-c>, B<--config-dir>=IdirE>" +msgstr "B<-c>, B<--config-dir>=IPfadE>" + +# type: Plain text +#: amuled.1:31 +msgid "Read config from EdirE instead of home." +msgstr "Liest die Konfiguration EPfadE anstelle des Home." + +# type: Plain text +#: amulecmd.1:1 +msgid "" +"B(1), B(1), B(1), B(1), B(1), " +"B(1), B(1)" +msgstr "" +"B(1), B(1), B(1), B(1), B(1), " +"B(1), B(1)" + +# type: TH +#: amulecmd.1:1 +#, no-wrap +msgid "AMULECMD" +msgstr "AMULECMD" + +# type: TH +#: amulecmd.1:1 +#, no-wrap +msgid "aMuleCmd v2.2.0" +msgstr "aMuleCmd v2.2.0" + +# type: TH +#: amulecmd.1:1 amuleweb.1:1 ed2k.1:1 ../../src/utils/cas/docs/cas.1:1 ../../src/utils/cas/docs/cas.1:6 ../../src/utils/wxCas/docs/wxcas.1:1 ../../src/utils/xas/docs/xas.1:1 +#, no-wrap +msgid "aMule utilities" +msgstr "aMule Hilfsprogramme" + +# type: Plain text +#: amulecmd.1:4 +msgid "amulecmd - Console-based program to control aMule" +msgstr "amulecmd - Konsolenbasiertes Programm um aMule zu steuern" + +# type: Plain text +#: amulecmd.1:15 +msgid "" +"B [B<-h> IhostE>] [B<-p> IportE>] [B<-P> " +"IpasswdE>] [B<-f> IpathE>] [B<-q>] [B<-v>] [B<-l> " +"IlangE>] [B<-w>] [B<-c> IcommandE>]" +msgstr "" +"B [B<-h> IHostE>] [B<-p> IPortE>] [B<-P> " +"IPasswortE>] [B<-f> IPfadE>] [B<-q>] [B<-v>] [B<-l> " +"ISpracheE>] [B<-w>] [B<-c> IBefehlE>]" + +# type: Plain text +#: amulecmd.1:18 +msgid "B B<--create-config-from=>IpathE>" +msgstr "B B<--create-config-from=>IPfadE>" + +# type: Plain text +#: amulecmd.1:21 +msgid "B [B<--help>]" +msgstr "B [B<--help>]" + +# type: Plain text +#: amulecmd.1:24 +msgid "B [B<--version>]" +msgstr "B [B<--version>]" + +# type: Plain text +#: amulecmd.1:26 +msgid "B is a console-based client to control aMule." +msgstr "B ist ein Konsolenbasierter Client um aMule zu steuern." + +# type: TP +#: amulecmd.1:26 amuleweb.1:41 +#, no-wrap +msgid "B<-h>, B<--host>=IhostE>" +msgstr "B<-h>, B<--host>=IHostE>" + +# type: Plain text +#: amulecmd.1:30 +msgid "" +"host where aMule is running (default: I). IhostE> " +"might be an IP address or a DNS name" +msgstr "" +"Host auf dem aMule läuft (standard: I). IHostE> " +"kann eine IP Adresse oder ein DNS Name sein" + +# type: TP +#: amulecmd.1:30 amuleweb.1:45 +#, no-wrap +msgid "B<-p>, B<--port>=IportE>" +msgstr "B<-p>, B<--port>=IPortE>" + +# type: Plain text +#: amulecmd.1:33 amuleweb.1:48 +msgid "" +"aMule's port for External Connections, as set in Preferences-ERemote " +"Controls (default: I<4712>)" +msgstr "aMule's Port für Externe Verbindungen, wie in den Optionen unter-EFernsteuerung (Standard: I<4712>) eingestellt." + +# type: TP +#: amulecmd.1:33 amuleweb.1:48 +#, no-wrap +msgid "B<-P>, B<--password>=IpasswdE>" +msgstr "B<-P>, B<--password>=IPasswortE>" + +# type: Plain text +#: amulecmd.1:36 amuleweb.1:51 +msgid "External Connections password" +msgstr "Passwort für Externe Verbindungen." + +# type: TP +#: amulecmd.1:36 amuleweb.1:51 +#, no-wrap +msgid "B<-f>, B<--config-file>=IpathE>" +msgstr "B<-f>, B<--config-file>=IPfadE>" + +# type: Plain text +#: amulecmd.1:40 +msgid "" +"use the given configuration file. Default configuration file is " +"I<~/.aMule/remote.conf>" +msgstr "" +"Benutzt die angegebene Konfigurationsdatei. Die Standardkonfigurationsdatei ist " +"I<~/.aMule/remote.conf>" + +# type: TP +#: amulecmd.1:40 amuleweb.1:55 +#, no-wrap +msgid "B<-q>, B<--quiet>" +msgstr "B<-q>, B<--quiet>" + +# type: Plain text +#: amulecmd.1:43 +msgid "" +"do not print any output to stdout. This seems to be a very much useless " +"option with B." +msgstr "Gebe nichts auf stdout aus. Dies scheint eine sehr nutzlose Options in B." + +# type: TP +#: amulecmd.1:43 amuleweb.1:59 +#, no-wrap +msgid "B<-v>, B<--verbose>" +msgstr "B<-v>, B<--verbose>" + +# type: Plain text +#: amulecmd.1:46 +msgid "be verbose - show also debug messages" +msgstr "Sei gesprächig - zeigt auch debugging Meldungen an." + +# type: TP +#: amulecmd.1:46 amuleweb.1:62 +#, no-wrap +msgid "B<-l>, B<--locale>=IlangE>" +msgstr "B<-l>, B<--locale>=ISpracheE>" + +# type: Plain text +#: amulecmd.1:50 amuleweb.1:66 +msgid "" +"Sets program locale (language). See section B for the " +"description of the IlangE> parameter." +msgstr "Setzt die Locale (Sprache) des Programms. Siehe Abschnitt B für die Beschreibung des ISpracheE> Parameter." + +# type: TP +#: amulecmd.1:50 amuleweb.1:66 +#, no-wrap +msgid "B<-w>, B<--write-config>" +msgstr "B<-w>, B<--write-config>" + +# type: Plain text +#: amulecmd.1:53 +msgid "write command line options to config file and exit" +msgstr "Schreibe die Kommandozeilenoptionen in die Konfigurationsdatei und beende dich wieder." + +# type: TP +#: amulecmd.1:53 +#, no-wrap +msgid "B<-c>, B<--command>=IcommandE>" +msgstr "B<-c>, B<--command>=IBefehlE>" + +# type: Plain text +#: amulecmd.1:56 +msgid "" +"execute IcommandE> as if it was entered at amulecmd's prompt and " +"exit." +msgstr "Führe IBefehlE> aus, als wäre es auf amulecmd's Eingabeaufforderung eingegeben worden, und beende dich." + +# type: TP +#: amulecmd.1:56 amuleweb.1:69 +#, no-wrap +msgid "B<--create-config-from>=IpathE>" +msgstr "B<--create-config-from>=IPfadE>" + +# type: Plain text +#: amulecmd.1:59 +msgid "" +"create config file based upon IpathE>, which must point to a valid " +"aMule config file, and then exit" +msgstr "Erstelle Konfigurationsdatei basierend auf IPfadE>, welcher auf eine gültige aMule-Konfigurationsdatei verweisen muss, und beende dich." + +# type: TP +#: amulecmd.1:59 amuleweb.1:112 ed2k.1:17 +#, no-wrap +msgid "B<--help>" +msgstr "B<--help>" + +# type: TP +#: amulecmd.1:62 amuleweb.1:115 ed2k.1:23 +#, no-wrap +msgid "B<--version>" +msgstr "B<--version>" + +# type: SH +#: amulecmd.1:65 +#, no-wrap +msgid "COMMANDS" +msgstr "BEFEHLE" + +# type: Plain text +#: amulecmd.1:67 +msgid "All commands are case insensitive" +msgstr "Alle Befehle können groß oder klein geschrieben werden." + +# type: SS +#: amulecmd.1:67 +#, no-wrap +msgid "AddR< Eed2k-linkE>" +msgstr "AddR< Eed2k-LinkE>" + +# type: Plain text +#: amulecmd.1:69 +msgid "Adds an ed2k-linkto the core." +msgstr "Fügt einen ed2k-Link zur Downloadliste hinzu." + +# type: Plain text +#: amulecmd.1:71 +msgid "The ed2k link to be added can be:" +msgstr "Der ed2k-Link darf enthalten:" + +# type: Plain text +#: amulecmd.1:73 +msgid "*) a file link (ed2k://|file|...), it will be added to the download queue," +msgstr "*) einen Link zu einer Datei (ed2k://|file|...), diese wird den Downloads hinzugefügt," + +# type: Plain text +#: amulecmd.1:75 +msgid "*) a server link (ed2k://|server|...), it will be added to the server list," +msgstr "*) einen Link zu einem Server (ed2k://|server|...), dieser wird der Serverliste hinzugefügt," + +# type: Plain text +#: amulecmd.1:77 +msgid "" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the server list." +msgstr "*) oder einen Serverlisten-Link, in diesem Fall werden alle Server dieser Liste der Serverliste hinzugefügt." + +# type: Plain text +#: amulecmd.1:79 amulecmd.1:104 amulecmd.1:176 +msgid "This command must have an argument." +msgstr "Dieser Befehl muss ein Argument übergeben bekommen." + +# type: SS +#: amulecmd.1:79 +#, no-wrap +msgid "CancelR< EhashE>" +msgstr "CancelR< EHashE>" + +# type: Plain text +#: amulecmd.1:81 +msgid "Cancels the download specified by hash. To get the hash use I." +msgstr "Bricht den mit seinem Hash spezifizierten Download ab. Benutze I um den Hash zu erfahren." + +# type: SS +#: amulecmd.1:81 +#, no-wrap +msgid "ConnectR< (kad|ed2kEip|nameE)>" +msgstr "ConnectR< (kad|ed2kEIP|NameE)>" + +# type: Plain text +#: amulecmd.1:83 +msgid "Connect to the network." +msgstr "Verbindung zu einem Netzwerk aufbauen." + +# type: Plain text +#: amulecmd.1:85 +msgid "This will connect to all networks that are enabled in Preferences." +msgstr "Die Verbindung wird zu allen Netzwerken aufgebaut, die in den Einstellungen aktiviert wurden." + +# type: Plain text +#: amulecmd.1:90 +msgid "" +"When giving ed2k as parameter, it connects only to ed2k-network to servers " +"in your serverlist. You may also optionally specify a server address in " +"IP:Port form, to connect to that server only. The IP must be a dotted " +"decimal IPv4 address, or a resolvable DNS name." +msgstr "Wenn ed2k als Parameter übergeben wird, wird eine Verbindung zu Servern aus der Serverliste aufgebaut. Man kann optional einen Server in der Form IP:Port angeben, um nur zu diesem Server eine Verbindung aufzubauen. Die IP muss entweder eine IPv4-Adresse, oder ein auflösbarer DNS-Name sein." + +# type: Plain text +#: amulecmd.1:92 +msgid "When giving kad, it connects to Kad only." +msgstr "Wenn kad angegeben wird, wird ausschließlich eine kad-Verbindung aufgebaut." + +# type: SS +#: amulecmd.1:92 +#, no-wrap +msgid "DisconnectR< (ed2k|kad)>" +msgstr "DisconnectR< (ed2k|kad)>" + +# type: Plain text +#: amulecmd.1:96 +msgid "" +"Disconnect from all networks you are cionnected to, or just disconnect from " +"the specified network." +msgstr "Trennt die Verbindung zu allen Netzwerken mit denen du verbunden bist, oder nur zu dem, welches angegeben wurde." + +# type: SS +#: amulecmd.1:96 +#, no-wrap +msgid "DownloadR< num>" +msgstr "DownloadR< Nummer>" + +# type: Plain text +#: amulecmd.1:98 +msgid "Start downloading a file" +msgstr "Startet den Download einer Datei" + +# type: Plain text +#: amulecmd.1:102 +msgid "" +"The number of a file from the last search has to be given. Example: " +"'download 12' will start to download the file with the number 12 of the " +"previous search." +msgstr "" +"Die Nummer einer Datei aus der letzten Suche muss angegeben werden. Beispiel: " +"'download 12' startet den Download der Datei, die bei der letzten Suche die Nummer 12 hatte." + +# type: SS +#: amulecmd.1:104 +#, no-wrap +msgid "Exit" +msgstr "Exit" + +# type: Plain text +#: amulecmd.1:106 +msgid "Disconnect from amule/amuled and quit amulecmd." +msgstr "Verbindung zu amule/amuled trennen und amulecmd beenden." + +# type: SS +#: amulecmd.1:106 +#, no-wrap +msgid "GetR< value>" +msgstr "GetR< Wert>" + +# type: Plain text +#: amulecmd.1:108 +msgid "Get and display a preference value." +msgstr "Liest eine Option und zeigt sie an." + +# type: Plain text +#: amulecmd.1:110 amulecmd.1:134 amulecmd.1:166 +msgid "This command is incomplete, aviable values are listed below." +msgstr "Dieser Befehl ist unvollständig, mögliche Werte sind nachfolgend aufgeführt." + +# type: Plain text +#: amulecmd.1:112 amulecmd.1:136 amulecmd.1:168 +msgid "Available values to get:" +msgstr "Verfügbare Werte:" + +# type: Plain text +#: amulecmd.1:114 +msgid "BwLimits\tGet bandwidth limits." +msgstr "BwLimits\tBandbreitenbeschränkungen." + +# type: Plain text +#: amulecmd.1:116 +msgid "IPFilter\tGet IPFilter preferences." +msgstr "IPFilter\tIP-Filter Einstellungen." + +# type: SS +#: amulecmd.1:116 +#, no-wrap +msgid "HelpR< EcommandE>" +msgstr "HelpR< EBefehlE>" + +# type: Plain text +#: amulecmd.1:120 +msgid "" +"Get a short help. If called without parameter, it shows a list of aviable " +"commands. If called with EcommandE, it shows a short description of " +"the given command." +msgstr "Kurze Hilfe anzeigen. Zeigt eine kurze Übersicht der verfügbaren Befehle, wenn ohne Parameter aufgerufen. Wenn mit EBefehlE aufgerufen, wird eine kurze Hilfe zu dem Befehl angezeigt." + +# type: SS +#: amulecmd.1:120 +#, no-wrap +msgid "PauseR< EhashE>" +msgstr "PauseR< EHashE>" + +# type: Plain text +#: amulecmd.1:122 +msgid "Pauses the download specified by hash. To get the hash use I." +msgstr "Pausiert den mit seinem Hash spezifizierten Download. Benutze I um den Hash zu erfahren." + +# type: SS +#: amulecmd.1:122 +#, no-wrap +msgid "Progress" +msgstr "Progress" + +# type: Plain text +#: amulecmd.1:124 +msgid "Shows the progress of an ongiong search." +msgstr "Zeigt den Fortschritt einer laufenden Suche an." + +# type: Plain text +#: amulecmd.1:126 +msgid "This Command can't have an argument." +msgstr "Dieser Befehl kann keine Argumente übernehmen." + +# type: SS +#: amulecmd.1:126 +#, no-wrap +msgid "Quit" +msgstr "Quit" + +# type: Plain text +#: amulecmd.1:128 +msgid "Exists the App." +msgstr "Beendet das Programm." + +# type: Plain text +#: amulecmd.1:130 amulecmd.1:144 amulecmd.1:148 amulecmd.1:194 +msgid "This command can't have an argument." +msgstr "Dieser Befehl kann keine Argumente übernehmen." + +# type: SS +#: amulecmd.1:130 +#, no-wrap +msgid "Reload" +msgstr "Reload" + +# type: Plain text +#: amulecmd.1:132 +msgid "Reloads a given object." +msgstr "Aktualisiert das angegebene Objekt." + +# type: Plain text +#: amulecmd.1:138 +msgid "BwLimits\tReload bandwidth limits." +msgstr "BwLimits\tAktualisiert die Bandbreitenbeschränkungen." + +# type: Plain text +#: amulecmd.1:140 +msgid "IPFilter\tReload IPFilter preferences." +msgstr "IPFilter\tAktualisiert die IP-Filter Einstellungen." + +# type: SS +#: amulecmd.1:140 +#, no-wrap +msgid "Reset" +msgstr "Reset" + +# type: Plain text +#: amulecmd.1:142 +msgid "Reset the log." +msgstr "Setzt das Log zurück." + +# type: SS +#: amulecmd.1:144 +#, no-wrap +msgid "Results" +msgstr "Results" + +# type: Plain text +#: amulecmd.1:146 +msgid "Shows you the results of the last search." +msgstr "Zeigt die Resultate der letzten Suche an." + +# type: SS +#: amulecmd.1:148 +#, no-wrap +msgid "ResumeR< EhashE>" +msgstr "ResumeR< EHashE>" + +# type: Plain text +#: amulecmd.1:150 +msgid "Resumes the download specified by hash. To get the hash use I." +msgstr "Setzt den mit seinem Hash spezifizierten Download fort. Benutze I um den Hash zu erfahren." + +# type: SS +#: amulecmd.1:150 +#, no-wrap +msgid "SearchR< global|kad|local file>" +msgstr "SearchR< global|kad|local Datei>" + +# type: Plain text +#: amulecmd.1:154 +msgid "" +"Makes a search for the given file. A searchtype and a file to search is " +"mandatory to do this. I 'search kad amule' performs a kad search " +"for amule." +msgstr "Startet die Suche nach Datei. Die Art der Suche und ein Dateiname sind notwendig. I 'search kad amule' Sucht nach amule im kad-Netzwerk." + +# type: Plain text +#: amulecmd.1:156 +msgid "Aviable searchtypes:" +msgstr "Verfügbare Suchtypen:" + +# type: Plain text +#: amulecmd.1:158 +msgid "global\tperforms a global search" +msgstr "global\tstartet eine globale Suche" + +# type: Plain text +#: amulecmd.1:160 +msgid "kad\tperforms a search on kad network" +msgstr "kad\tstartet eine Suche im kad-Netzwerk" + +# type: Plain text +#: amulecmd.1:162 +msgid "local\tperforms a local search" +msgstr "local\tstartet eine lokale Suche" + +# type: SS +#: amulecmd.1:162 +#, no-wrap +msgid "SetR< EvalueE>" +msgstr "SetR< EWertE>" + +# type: Plain text +#: amulecmd.1:164 +msgid "Sets a given preferences value." +msgstr "Setzt die angegebene Option." + +# type: Plain text +#: amulecmd.1:170 +msgid "BwLimits\tSet bandwidth limits." +msgstr "BwLimits\tSetzt die Bandbreitenbeschränkung." + +# type: Plain text +#: amulecmd.1:172 +msgid "IPFilter\tSet IPFilter preferences." +msgstr "IPFilter\tSetzt die IP-Filter Einstellungen." + +# type: SS +#: amulecmd.1:172 +#, no-wrap +msgid "ShowR< DL|Log|Servers|UL>" +msgstr "ShowR< DL|Log|Servers|UL>" + +# type: Plain text +#: amulecmd.1:174 +msgid "Shows upload/download queue, server list or shared files list." +msgstr "Zeigt upload/download Warteschlange, Serverliste oder die Liste der freigegebenen Dateien an." + +# type: Plain text +#: amulecmd.1:178 +msgid "This command is incomplete, you must use one of the extensions below." +msgstr "Dieser Befehl ist unvollständig, Benutze nur die folgenden Parameter." + +# type: Plain text +#: amulecmd.1:180 +msgid "Available extensions:" +msgstr "Verfügbare Parameter:" + +# type: Plain text +#: amulecmd.1:182 +msgid "DL\t\tShow download queue." +msgstr "DL\t\tZeigt die Downloadwarteschlange an." + +# type: Plain text +#: amulecmd.1:184 +msgid "Log\t\tShow log." +msgstr "Log\t\tZeigt das Log an." + +# type: Plain text +#: amulecmd.1:186 +msgid "Servers\tShow servers list." +msgstr "Servers\tZeigt die Serverliste an." + +# type: Plain text +#: amulecmd.1:188 +msgid "UL\t\tShow upload queue." +msgstr "UL\t\tZeigt die Uploadwarteschlange an." + +# type: SS +#: amulecmd.1:188 +#, no-wrap +msgid "Shutdown" +msgstr "Shutdown" + +# type: Plain text +#: amulecmd.1:192 +msgid "" +"Shutdown the remote running core (amule/amuled). This will also shut down " +"the text client, since it is unusable without a running core." +msgstr "Beendet das Programm (amule/amuled) zu dem du verbunden bist. Dies beendet auch den Textclient, da er ohne Verbindung nicht zu gebrauchen ist." + +# type: SS +#: amulecmd.1:194 +#, no-wrap +msgid "StatisticsR< EnumE>" +msgstr "StatisticsR< ENummerE>" + +# type: Plain text +#: amulecmd.1:196 +msgid "Show statistics tree." +msgstr "Zeigt die Statistiken an." + +# type: Plain text +#: amulecmd.1:200 +msgid "" +"The optional number in the range of 0-255 can be passed as argument to this " +"command, which tells how many entries of the client version subtree should " +"be shown. Passing 0, or omitting it means 'unlimited'." +msgstr "Die optionale Nummer die übergeben werden kann muss im Bereich von 0-255 liegen, und gibt an, wieviele Einträge im Unterpunkt Version angezeigt werden sollen. 0 oder weglassen bedeutet unbegrenzt." + +# type: Plain text +#: amulecmd.1:203 +msgid "" +"I 'statistics 5' will show only the top 5 versions for each client " +"type." +msgstr "I 'statistics 5' zeigt die höchsten 5 der einzelnen Clientversionen an." + +# type: SS +#: amulecmd.1:203 +#, no-wrap +msgid "Status" +msgstr "Status" + +# type: Plain text +#: amulecmd.1:205 +msgid "Show connection status, current up/download speeds, etc." +msgstr "Zeigt den Verbindungsstatus, aktuelle Up/Downloadgeschindigkeiten, etc. an." + +# type: SH +#: amulecmd.1:206 amuleweb.1:118 +#, no-wrap +msgid "NOTES" +msgstr "ANMERKUNGEN" + +# type: SS +#: amulecmd.1:207 amuleweb.1:119 +#, no-wrap +msgid "Paths" +msgstr "Pfade" + +# type: Plain text +#: amulecmd.1:211 +msgid "" +"For all options which take a IpathE> value, if the I " +"contains no directory part (i.e. just a plain filename), then it is " +"considered to be under the aMule configuration directory, I<~/.aMule>." +msgstr "Für alle Optionen die ein IPfadE> Argument erwarten, wenn der I kein Verzeichnis enthält(z.B. nur einen Dateinamen), dann wird angenommen, diese Datei liegt um aMule-Konfigurationsverzeichnis, I<~/.aMule>." + +# type: SS +#: amulecmd.1:211 amuleweb.1:121 +#, no-wrap +msgid "LANGUAGES" +msgstr "SPRACHEN" + +# type: Plain text +#: amulecmd.1:217 amuleweb.1:127 +msgid "" +"The IlangE> parameter for the B<-l> option has the following form: " +"I[B<_>I][B<.>I][B<@>I] where I is the " +"primary language, I is a sublanguage/territory, I is the " +"character set to use and I \"allows the user to select a specific " +"instance of localization data within a single category\"." +msgstr "" +"Der ISpracheE> Parameter für die B<-l> Option hat folgende Form: " +"I[B<_>I][B<.>I][B<@>I] wobei I die primäre Sprache, I die Regionalsprache, I die Zeichentabelle ist, und I \"erlaubt es dem Nutzer eine bestimmte Auswahl innerhalb einer einzigen Kategorie auszuwählen\"." + +# type: Plain text +#: amulecmd.1:219 amuleweb.1:129 +msgid "For example, the following strings are valid:" +msgstr "Zum Besispiel sind die folgenden Zeichenketten gültig:" + +# type: Plain text +#: amulecmd.1:221 amuleweb.1:131 +msgid "de" +msgstr "de" + +# type: Plain text +#: amulecmd.1:223 amuleweb.1:133 +msgid "de_DE" +msgstr "de_DE" + +# type: Plain text +#: amulecmd.1:225 amuleweb.1:135 +msgid "de_DE.iso88591" +msgstr "de_DE.iso88591" + +# type: Plain text +#: amulecmd.1:227 amuleweb.1:137 +msgid "de_DE@euro" +msgstr "de_DE@euro" + +# type: Plain text +#: amulecmd.1:229 amuleweb.1:139 +msgid "de_DE.iso88591@euro" +msgstr "de_DE.iso88591@euro" + +# type: Plain text +#: amulecmd.1:232 amuleweb.1:142 +msgid "" +"Though all the above strings are accepted as valid language definitions, " +"I and I are yet unused." +msgstr "Alle oben genannten Zeicheketten werden als gültige Sprachdefinitionen akzeptiert, I und I werden zur Zeit nicht genutzt." + +# type: Plain text +#: amulecmd.1:235 amuleweb.1:145 +msgid "" +"In addition to the format above, you can also specify full language names in " +"English - so B<-l german> is also valid and is equal to B<-l de_DE>." +msgstr "Zusätzlich zu den obigen Formaten, kann man komplette englishe Sprachbezeichnungen angeben - B<-l german> ist ebenfalls gültig und entspricht B<-l de_DE>." + +# type: Plain text +#: amulecmd.1:238 amuleweb.1:148 +msgid "" +"When no locale is defined, either on command-line or in config file, system " +"default language will be used." +msgstr "Wenn keine Sprache definiert wurde, weder in der Kommandozeile noch in der Konfigurationsdatei, wird die Standardsprache des Systems verwendet." + +# type: Plain text +#: amulecmd.1:240 amuleweb.1:159 +msgid "~/.aMule/remote.conf" +msgstr "~/.aMule/remote.conf" + +# type: SH +#: amulecmd.1:240 amuleweb.1:163 +#, no-wrap +msgid "EXAMPLE" +msgstr "BEISPIEL" + +# type: Plain text +#: amulecmd.1:242 +msgid "Typically amulecmd will be first run as:" +msgstr "Typischerweise startet man amulecmd als erstes mit:" + +# type: Plain text +#: amulecmd.1:244 +msgid "B B<-h> I B<-p> I B<-P> I B<-w>" +msgstr "B B<-h> I B<-p> I B<-P> I B<-w>" + +# type: Plain text +#: amulecmd.1:246 amuleweb.1:169 +msgid "or" +msgstr "oder" + +# type: Plain text +#: amulecmd.1:248 +msgid "B B<--create-config-from>=I" +msgstr "B B<--create-config-from>=I" + +# type: Plain text +#: amulecmd.1:250 amuleweb.1:173 +msgid "" +"These will save settings to I<$HOME/.aMule/remote.conf>, and later you only " +"need to type:" +msgstr "Dies speichert die Einstellungen in I<$HOME/.aMule/remote.conf>, und tippst du nur noch:" + +# type: Plain text +#: amulecmd.1:252 +msgid "B" +msgstr "B" + +# type: Plain text +#: amulecmd.1:254 +msgid "Of course, you don't have to follow this example." +msgstr "Natürlich brauchst du dich nicht unbedingt an dieses Beispiel halten." + +# type: Plain text +#: amulegui.1:1 +msgid "B(1), B(1)" +msgstr "B(1), B(1)" + +# type: TH +#: amulegui.1:1 +#, no-wrap +msgid "AMULEGUI" +msgstr "AMULEGUI" + +# type: TH +#: amulegui.1:1 +#, no-wrap +msgid "aMuleGUI v2.2.0" +msgstr "aMuleGUI v2.2.0" + +# type: TH +#: amulegui.1:1 +#, no-wrap +msgid "aMuleGUI" +msgstr "aMuleGUI" + +# type: Plain text +#: amulegui.1:4 +msgid "amulegui - aMule control program with GUI" +msgstr "amulegui - aMule Steuerungsprogram mit GUI" + +# type: Plain text +#: amulegui.1:6 +msgid "B" +msgstr "B" + +# type: Plain text +#: amulegui.1:11 +msgid "" +"B is a client program, and can be connected on amule or amuled via " +"EC. You can manage your amule program with it. It provides the almost same " +"functionality as amule, even if the core works on another computer." +msgstr "B ist ein Program das über EC mit amule/amuled Verbindung aufnehmen kann. Du kannst deinen amle damit steuern. Es besitzt so ziemlich dieselben Funktionen wie amule, auch wenn dieser auf einem anderen Computer läuft." + +# type: Plain text +#: amulegui.1:13 ../../src/utils/wxCas/docs/wxcas.1:13 +msgid "This program doesn't take any arguments." +msgstr "Dieses Programm hat keine Parameter" + +# type: Plain text +#: amulegui.1:20 +msgid "" +"B(1), B(1), B(1), B(1), B(1), " +"B(1), B(1), B(1), B(1)" +msgstr "" +"B(1), B(1), B(1), B(1), B(1), " +"B(1), B(1), B(1), B(1)" + +# type: SH +#: amulegui.1:20 ../../src/utils/cas/docs/cas.1:39 ../../src/utils/wxCas/docs/wxcas.1:15 ../../src/utils/xas/docs/xas.1:14 +#, no-wrap +msgid "AUTHOR" +msgstr "VERFASSER" + +# type: Plain text +#: amulegui.1:23 +msgid "" +"This manpage was written by Julien Delange for Debian Ejulien AT gunnm " +"DOT orgE This manpage was rewritten by Vollstrecker for aMule " +"Eamule@vollstreckernet.deE" +msgstr "" +"Diese Seite wurde geschrieben von Julien Delange für Debian Ejulien AT gunnm " +"DOT orgE Diese Seite wurde überarbeit und übersetzt von Vollstrecker für aMule " +"Eamule@vollstreckernet.deE" + +# type: TH +#: amuleweb.1:1 +#, no-wrap +msgid "AMULEWEB" +msgstr "AMULEWEB" + +# type: TH +#: amuleweb.1:1 +#, no-wrap +msgid "aMule webserver v2.2.0" +msgstr "aMule Webserver v2.2.0" + +# type: Plain text +#: amuleweb.1:4 +msgid "amuleweb - aMule web server" +msgstr "amuleweb - aMule Webserver" + +# type: Plain text +#: amuleweb.1:24 +msgid "" +"B [B<-h> IhostE>] [B<-p> IportE>] [B<-P> " +"IpassE>] [B<-f> IpathE>] [B<-q>] [B<-v>] [B<-l> " +"IlangE>] [B<-w>] [B<-t> InameE>] [B<-s> " +"IportE>] [B<-z>] [B<-Z>] [B<-A> IpassE>] [B<-G> " +"IpassE>] [B<-a>] [B<-d>] [B<-L>] [B<-N>]" +msgstr "" +"B [B<-h> IHostE>] [B<-p> IPortE>] [B<-P> " +"IPasswortE>] [B<-f> IPfadE>] [B<-q>] [B<-v>] [B<-l> " +"ISpracheE>] [B<-w>] [B<-t> INameE>] [B<-s> " +"IPortE>] [B<-z>] [B<-Z>] [B<-A> IPasswortE>] [B<-G> " +"IPasswortE>] [B<-a>] [B<-d>] [B<-L>] [B<-N>]" + +# type: Plain text +#: amuleweb.1:28 +msgid "" +"B [B<-f> IpathE>] " +"B<--create-config-from=>IpathE>" +msgstr "" +"B [B<-f> IPfadE>] " +"B<--create-config-from=>IPfadE>" + +# type: Plain text +#: amuleweb.1:32 +msgid "B [B<--help>] [B<--version>]" +msgstr "B [B<--help>] [B<--version>]" + +# type: Plain text +#: amuleweb.1:34 +msgid "BIpathE>" +msgstr "BIPfadE>" + +# type: Plain text +#: amuleweb.1:36 +msgid "B" +msgstr "B" + +# type: Plain text +#: amuleweb.1:41 +msgid "" +"B manages your access to amule through a webbrowser. You can " +"start amuleweb together with B(1), or separately, any time later. " +"Options can be specified via command-line or via config-file. Command-line " +"options take precedence over config-file options." +msgstr "" +"B ermöglicht dir den Zugriff auf amule(d) per Webbrowser. Man kann amuleweb zusammen mit B(1) starten lassen, oder ihn separat später starten. " +"Optionen können auf der Kommandozeile oder in der Konfigurationsdatei angegeben werden. Kommandozeilenoptionen überschreiben die Werte aus der Konfigurationsdatei." + +# type: Plain text +#: amuleweb.1:45 +msgid "" +"Host where aMule is running (default: I). IhostE> " +"might be an IP address or a DNS name" +msgstr "" +"Der Rechner auf dem aMule läuft (Standard: I). IHostE> " +"kann eine IP-Adresse oder ein DNS-Name sein." + +# type: Plain text +#: amuleweb.1:55 +msgid "" +"Use the given configuration file. Default configuration file is " +"I<~/.aMule/remote.conf>" +msgstr "" +"Benutzt die angegebene Konfigurationsdatei. Die Standardkonfigurationsdatei ist " +"I<~/.aMule/remote.conf>" + +# type: Plain text +#: amuleweb.1:59 +msgid "" +"Do not print any output to stdout. You may want to use B<-q> to daemonize " +"the webserver, i.e. running as 'B'" +msgstr "Gebe keine Ausgaben auf der Standardausgabe aus. Du könntest B<-q> benutzen um den Webserver als Dämon laufen zu lassen, z.B. durch Aufruf von 'B'" + +# type: Plain text +#: amuleweb.1:62 +msgid "Be verbose - show also debug messages" +msgstr "Sei gesprächig - Gebe auch Debuggingausgaben aus" + +# type: Plain text +#: amuleweb.1:69 +msgid "Write command line options to config file and exit" +msgstr "Schreibe die Kommandozeilenoptionen in die Konfigurationsdatei und kehre zur Shell zurück." + +# type: Plain text +#: amuleweb.1:72 +msgid "" +"Create config file based upon IpathE>, which must point to a valid " +"aMule config file, and then exit" +msgstr "Erstellt eine Konfigurationsdatei basierend auf IPfadE>, welche auf eine gültige Amulekonfigurationsdatei verweisen muss, und kehre zur Shell zurück." + +# type: TP +#: amuleweb.1:72 +#, no-wrap +msgid "B<-t>, B<--template>=InameE>" +msgstr "B<-t>, B<--template>=INameE>" + +# type: Plain text +#: amuleweb.1:76 +msgid "" +"Loads the template named InameE>. See also the section B" +msgstr "" +"Lädt die mit INameE> spezifizierte Vorlage. Siehe auch Abschnitt B" + +# type: TP +#: amuleweb.1:76 +#, no-wrap +msgid "B<-s>, B<--server-port>=IportE>" +msgstr "B<-s>, B<--server-port>=IPortE>" + +# type: Plain text +#: amuleweb.1:79 +msgid "" +"Webserver's HTTP port. This is the port you can point your browser to " +"(default: I<4711>)" +msgstr "HTTP Port des Webservers. Der Port der mit dem Browser erreichbar sein soll (Standard: I<4711>)" + +# type: TP +#: amuleweb.1:79 +#, no-wrap +msgid "B<-z>, B<--enable-gzip>" +msgstr "B<-z>, B<--enable-gzip>" + +# type: Plain text +#: amuleweb.1:82 +msgid "Enable using gzip compression in HTTP traffic to save bandwidth" +msgstr "Benutzt gzip Kompression für den HTTP Verkehr um Bandbreite zu sparen" + +# type: TP +#: amuleweb.1:82 +#, no-wrap +msgid "B<-Z>, B<--disable-gzip>" +msgstr "B<-Z>, B<--disable-gzip>" + +# type: Plain text +#: amuleweb.1:85 +msgid "Disable using gzip compression (this is the default)" +msgstr "Schalten die gzip Kompression ab (Standard)" + +# type: TP +#: amuleweb.1:85 +#, no-wrap +msgid "B<-A>, B<--admin-pass>=IpasswdE>" +msgstr "B<-A>, B<--admin-pass>=IPasswortE>" + +# type: Plain text +#: amuleweb.1:88 +msgid "Full access password for webserver" +msgstr "Passwort für vollen Zugriff auf den Webserver" + +# type: TP +#: amuleweb.1:88 +#, no-wrap +msgid "B<-G>, B<--guest-pass>=IpasswdE>" +msgstr "B<-G>, B<--guest-pass>=IPasswortE>" + +# type: Plain text +#: amuleweb.1:91 +msgid "Guest password for webserver" +msgstr "Gäste Passwort für den Webserver" + +# type: TP +#: amuleweb.1:91 +#, no-wrap +msgid "B<-a>, B<--allow-guest>" +msgstr "B<-a>, B<--allow-guest>" + +# type: Plain text +#: amuleweb.1:94 +msgid "Allow guest access" +msgstr "Erlaubt den Zugriff als Gast" + +# type: TP +#: amuleweb.1:94 +#, no-wrap +msgid "B<-d>, B<--deny-guest>" +msgstr "B<-d>, B<--deny-guest>" + +# type: Plain text +#: amuleweb.1:97 +msgid "Deny guest access (default)" +msgstr "Verbietet den Zugriff als Gast (Standard)" + +# type: TP +#: amuleweb.1:97 +#, no-wrap +msgid "B<-L>, B<--load-settings>" +msgstr "B<-L>, B<--load-settings>" + +# type: Plain text +#: amuleweb.1:103 +msgid "" +"Load/save webserver settings from/to remote aMule. This causes amuleweb to " +"ignore command-line and config-file settings, and load them from aMule. " +"When saving preferences none will be written to the config file, but to " +"aMule. (Of course, this works only for those settings, that can be set in " +"aMule's Preferences-ERemote Controls)" +msgstr "Lade/Speichere Einstellungen vom/zum entfernen aMule. Dies bringt amuleweb dazu, die Kommandozeilen- und Konfigurationsdateieinstellungen zu ignorieren, und von aMule zu beziehen. Beim Speichern werden keine Einstellungen in die Konfigurationsdatei geschrieben, sondern zu aMule gesendet. (das funktioniert nur für Einstellungen in aMule's Einstellungen-EFernsteuerung Dialog)" + +# type: TP +#: amuleweb.1:103 +#, no-wrap +msgid "B<-N>, B<--no-script-cache>" +msgstr "B<-N>, B<--no-script-cache>" + +# type: Plain text +#: amuleweb.1:106 +msgid "Recompile PHP pages on each request" +msgstr "Erstellt die PHP-Seiten bei jedem Aufruf neu" + +# type: TP +#: amuleweb.1:106 +#, no-wrap +msgid "B<--amule-config-file>=IpathE>" +msgstr "B<--amule-config-file>=IPfadE>" + +# type: Plain text +#: amuleweb.1:112 +msgid "" +"aMule config file path. B aMule uses this option when " +"starting amuleweb at aMule startup. This option causes all other " +"command-line and config-file settings to be ignored, preferences to be read " +"from the given config file, and also implies the B<-q -L> options." +msgstr "Pfad zur aMule Konfigurationsdatei. B aMule benutzt dies zum starten von amuleweb wenn aMule startet. Diese Option sorgt dafür, das alle anderen Paramter ignoriert werden, und nur aus der angegeben Datei gelesen werden, und impliziert auch die B<-q -L> Optionen." + +# type: Plain text +#: amuleweb.1:121 +msgid "" +"If you specify a file without giving an absolute path (i.e. just a plain " +"filename, such as B<--path>=I), then this file is searched " +"within the aMule configuration directory, I<~/.aMule>." +msgstr "" +"If you specify a file without giving an absolute path (i.e. just a plain " +"filename, such as B<--path>=I), then this file is searched " +"within the aMule configuration directory, I<~/.aMule>." + +# type: SH +#: amuleweb.1:148 +#, no-wrap +msgid "SKIN SUPPORT" +msgstr "SKIN UNTERSTÜTZUNG" + +# type: Plain text +#: amuleweb.1:155 +msgid "" +"B is capable of displaying information in different skins. These " +"skins are called templates, and you can make amuleweb load a specific " +"template via the B<-t> command line option. Templates are searched in two " +"places: first in I<~/.aMule/webserver/> and then in " +"I<$(pkgdatadir)/webserver/> (I<$(pkgdatadir)> is the install location of " +"architecture independent data, most likely something like " +"/usr/share/amule). Each template must be in a subdirectory of the template " +"name, and this directory must contain all files the template needs. The " +"actual template filename must be aMule.tmpl." +msgstr "" +"B ist in der Lage Information in Verschiedenen Skins darzustellen. Diese " +"Skins werden Templates genannt. du kannst aMule mit der B<-t> Kommandozeilenoption dazu veranlassen, ein bestimmtest Template zu laden. Templates werden an zwei Stellen gesucht: Zuerstt in I<~/.aMule/webserver/> dann in " +"I<$(pkgdatadir)/webserver/> (I<$(pkgdatadir)> ist der Installationsordner architekturunabhängiger Dateien, meistens /usr/share/amule). Jedes Template muss in einem Unterverzeichnis des Templatenamens liegen, und dieses Verzeichnis muss alle Dateien enthalten die das Template benötigt. Die Templatedatei heißt aMule.tmpl" + +# type: Plain text +#: amuleweb.1:157 +msgid "" +"For example, the default template (named 'default') is in " +"webserver/default/, and this directory contains aMule.tmpl amongst a lot of " +"image files." +msgstr "" +"Zum Beispiel, das Standardtemplate (Name: 'default') liegt in " +"webserver/default/. Das Verzeichnis enthält aMule.tmpl und viele Bilddateien." + +# type: Plain text +#: amuleweb.1:161 +msgid "~/.aMule/webserver/" +msgstr "~/.aMule/webserver/" + +# type: Plain text +#: amuleweb.1:163 +msgid "I<$(pkgdatadir)>/webserver/" +msgstr "I<$(pkgdatadir)>/webserver/" + +# type: Plain text +#: amuleweb.1:165 +msgid "Typically amuleweb will be first run as:" +msgstr "Typischerweise wird amuleweb als erstes folgendermaßen gestartet:" + +# type: Plain text +#: amuleweb.1:167 +msgid "" +"B B<-h> I B<-p> I B<-P> I B<-s> " +"I B<-A> I B<-w>" +msgstr "" +"B B<-h> I B<-p> I B<-P> I B<-s> " +"I B<-A> I B<-w>" + +# type: Plain text +#: amuleweb.1:171 +msgid "B B<--create-config-from>=I" +msgstr "B B<--create-config-from>=I" + +# type: Plain text +#: amuleweb.1:175 +msgid "B" +msgstr "B" + +# type: Plain text +#: amuleweb.1:177 +msgid "" +"Of course, you may specify any more or less options on the first example " +"line, and you may also totally omit it." +msgstr "Natürlich kann man zusätzliche Optionen angeben und einzelne auch beim ersten Start weglassen, oder es komplett anders machen." + +# type: Plain text +#: ed2k.1:1 +msgid "B(1), B(1)" +msgstr "B(1), B(1)" + +# type: TH +#: ed2k.1:1 +#, no-wrap +msgid "ED2K" +msgstr "ED2K" + +# type: TH +#: ed2k.1:1 +#, no-wrap +msgid "aMule ED2k link parser v1.2.0" +msgstr "aMule ED2k link parser v1.2.0" + +# type: Plain text +#: ed2k.1:4 +msgid "ed2k - aMule ED2k link parser" +msgstr "ed2k - aMule ED2k link parser" + +# type: Plain text +#: ed2k.1:7 +msgid "B IED2k_linkE>" +msgstr "B IED2k-LinkE>" + +# type: Plain text +#: ed2k.1:12 +msgid "B [B<--help>] [B<--config-dir,>-cB<]> [B<--version>]" +msgstr "B [B<--help>] [B<--config-dir,>-cB<]> [B<--version>]" + +# type: Plain text +#: ed2k.1:16 +msgid "" +"aMule ED2k link parser v1.1.0. Sends the given IED2k_linkE> to " +"aMule, i.e. writes it to the file ~/.aMule/ED2KLinks, which will be checked " +"by aMule every second for links. B accepts file, server and " +"serverlist links." +msgstr "" +"aMule ED2k link parser v1.1.0. Sendet den übergebenen IED2k-LinkE> an " +"aMule, z.B. schreibt ihn in die Datei ~/.aMule/ED2KLinks, welche von aMule auf neue Links überprüft wird. B akzeptiert Datei-, Server- und " +"Serverlistenlinks." + +# type: SS +#: ed2k.1:16 +#, no-wrap +msgid "Usage:" +msgstr "Nutzung:" + +# type: TP +#: ed2k.1:20 +#, no-wrap +msgid "B<-c>, B<--config-dir>=IdirE> " +msgstr "B<-c>, B<--config-dir>=IPfadE> " + +# type: Plain text +#: ed2k.1:23 +msgid "" +"Specifies the aMule configuration directory. This must be writeable by the " +"user running B." +msgstr "Gibt das aMule Konfigurationsverzeichnis an. Dieses muss durch den Nutzer der B aufruft Beschreibbar sein." + +# type: Plain text +#: ed2k.1:28 +msgid "~/.aMule/ED2KLinks" +msgstr "~/.aMule/ED2KLinks" + +# type: Plain text +#: ../../src/utils/cas/docs/cas.1:1 ../../src/utils/xas/docs/xas.1:22 +msgid "B(1)" +msgstr "B(1)" + +# type: TH +#: ../../src/utils/cas/docs/cas.1:1 ../../src/utils/cas/docs/cas.1:6 +#, no-wrap +msgid "CAS" +msgstr "CAS" + +# type: TH +#: ../../src/utils/cas/docs/cas.1:1 +#, no-wrap +msgid "cas v0.8" +msgstr "cas v0.8" + +# type: Plain text +#: ../../src/utils/cas/docs/cas.1:4 +msgid "cas - c aMule statistics" +msgstr "cas - c aMule statistics" + +# type: Plain text +#: ../../src/utils/cas/docs/cas.1:6 +msgid "B" +msgstr "B" + +# type: TH +#: ../../src/utils/cas/docs/cas.1:6 +#, no-wrap +msgid "aMule ED2k links calculator" +msgstr "aMule ED2k links Ersteller" + +# type: Plain text +#: ../../src/utils/cas/docs/cas.1:13 +#, no-wrap +msgid "" +" ___ _ _ ___ c aMule statistics\n" +" /'___) /'_` )/',__) by Pedro de Oliveira\n" +" ( (___ ( (_| |\\e\\__, \\e Efalso@rdk.homeip.netE\n" +" `\\e____)`\\e__,_)(____/ Version 0.5\n" +msgstr "" +" ___ _ _ ___ c aMule statistics\n" +" /'___) /'_` )/',__) von Pedro de Oliveira\n" +" ( (___ ( (_| |\\e\\__, \\e Efalso@rdk.homeip.netE\n" +" `\\e____)`\\e__,_)(____/ Version 0.5\n" + +# type: Plain text +#: ../../src/utils/cas/docs/cas.1:16 +msgid "" +"B is a program for displaying the contents of your aMule online " +"signature file to console (in a human readable form)." +msgstr "B ist ein Program das den Inhalt deiner aMule Onlinesignaturedatei in menschenlesbarer Form auf der Konsole ausgibt." + +# type: SS +#: ../../src/utils/cas/docs/cas.1:16 +#, no-wrap +msgid "OPTIONS:" +msgstr "OPTIONEN:" + +# type: TP +#: ../../src/utils/cas/docs/cas.1:17 +#, no-wrap +msgid "B<-o>, B<--picture>, B<-P>" +msgstr "B<-o>, B<--picture>, B<-P>" + +# type: Plain text +#: ../../src/utils/cas/docs/cas.1:21 +msgid "" +"Writes the online signature picture. You can optionally append " +"I<\\=\\EPATH\\E> to this option, to specify where the picture should " +"be written" +msgstr "" +"Erstellt ein Bild deiner Onlinesignatur. Optional kannst du " +"I<\\=\\EPfad\\E> dieser Option übergeben, um anzugeben wohin das Bild geschrieben werden soll." + +# type: TP +#: ../../src/utils/cas/docs/cas.1:21 +#, no-wrap +msgid "B<-p>, B<--html>, B<-H>" +msgstr "B<-p>, B<--html>, B<-H>" + +# type: Plain text +#: ../../src/utils/cas/docs/cas.1:25 +msgid "" +"HTML page with stats and picture. You can optionally append " +"I<\\=\\EPATH\\E> to this option, to specify where the page should be " +"written" +msgstr "" +"HTML Seite mit Statistik und Bild. Optional kannst du " +"I<\\=\\EPfad\\E> dieser Option übergeben, um anzugeben wohin die Seite geschrieben werden soll." + +# type: TP +#: ../../src/utils/cas/docs/cas.1:25 +#, no-wrap +msgid "B<-c>, B<--config-dir>" +msgstr "B<-c>, B<--config-dir>" + +# type: Plain text +#: ../../src/utils/cas/docs/cas.1:28 +msgid "Specifies a config-dir different from home" +msgstr "Gibt ein Konfigurationsverzeichnis abweichend des Home an" + +# type: Plain text +#: ../../src/utils/cas/docs/cas.1:33 +msgid "Without any options, prints online signature data to stdout." +msgstr "Ohne Optionen wird die Onlinesignatur nach stdout geschrieben." + +# type: Plain text +#: ../../src/utils/cas/docs/cas.1:35 +msgid "~/.aMule/casrc" +msgstr "~/.aMule/casrc" + +# type: Plain text +#: ../../src/utils/cas/docs/cas.1:37 +msgid "stat.png" +msgstr "stat.png" + +# type: Plain text +#: ../../src/utils/cas/docs/cas.1:39 +msgid "tmp.html" +msgstr "tmp.html" + +# type: Plain text +#: ../../src/utils/cas/docs/cas.1:41 +msgid "B was written by Pedro de Oliveira Efalso@rdk.homeip.netE" +msgstr "B wurde geschrieben von Pedro de Oliveira Efalso@rdk.homeip.netE" + +# type: Plain text +#: ../../src/utils/wxCas/docs/wxcas.1:1 +msgid "B(1), B(1)" +msgstr "B(1), B(1)" + +# type: TH +#: ../../src/utils/wxCas/docs/wxcas.1:1 +#, no-wrap +msgid "WXCAS" +msgstr "WXCAS" + +# type: TH +#: ../../src/utils/wxCas/docs/wxcas.1:1 +#, no-wrap +msgid "wxCas" +msgstr "wxCas" + +# type: Plain text +#: ../../src/utils/wxCas/docs/wxcas.1:4 +msgid "wxcas - wx c aMule statistics" +msgstr "wxcas - wx c aMule statistics" + +# type: Plain text +#: ../../src/utils/wxCas/docs/wxcas.1:6 +msgid "B" +msgstr "B" + +# type: Plain text +#: ../../src/utils/wxCas/docs/wxcas.1:11 +msgid "" +"B is a program for displaying the contents of your online signature " +"file in a nice wx Window on your Desktop. Based on Pedro de Oliveira's " +"B(1)." +msgstr "" +"B ist ein Program das den Inhalt deiner aMule Onlinesignaturedatei in menschenlesbarer Form in einem wx-Fenster auf deinem Desktop ausgibt. Basierend auf Pedro de Oliveira's " +"B(1)." + +# type: Plain text +#: ../../src/utils/wxCas/docs/wxcas.1:15 +msgid "" +"The full documentation of wxcas can be downloaded from " +"I." +msgstr "" +"Die komplette Dokumentation zu wxcas kannst du herunter laden von: " +"I." + +# type: Plain text +#: ../../src/utils/wxCas/docs/wxcas.1:17 +msgid "B was written by ThePolish Ethepolish@vipmail.ruE" +msgstr "B wurde geschrieben von ThePolish Ethepolish@vipmail.ruE" + +# type: Plain text +#: ../../src/utils/xas/docs/xas.1:1 +msgid "B(1), B(1)" +msgstr "B(1), B(1)" + +# type: TH +#: ../../src/utils/xas/docs/xas.1:1 +#, no-wrap +msgid "XAS" +msgstr "XAS" + +# type: TH +#: ../../src/utils/xas/docs/xas.1:1 +#, no-wrap +msgid "xas v1.9" +msgstr "xas v1.9" + +# type: Plain text +#: ../../src/utils/xas/docs/xas.1:4 +msgid "xas - X-Chat aMule Statistics" +msgstr "xas - X-Chat aMule Statistics" + +# type: Plain text +#: ../../src/utils/xas/docs/xas.1:6 +msgid "B" +msgstr "B" + +# type: Plain text +#: ../../src/utils/xas/docs/xas.1:12 +msgid "" +"B is a plugin for xchat. For loading see your xchat " +"documentation. After loading type /xas and it will send statistics to the " +"channel you are in. These are taken from your Online Signature file. For " +"this to work, you must enable the \"Online Signature\" option in aMules " +"preferences." +msgstr "" +"B ist ein Plugin fr XChat. Wie man es ldt ist dessen Doku zu entnehmen." +"Nach dem Laden tippe einfach /xas, und es werden Statistiken ber dein" +"aMule an den Channel in dem du dich befindest gesendet. Diese werden" +"aus deiner Online-Signatur-Datei gelesen." +"Damit das funktioniert, muss in aMule die Option \"Online Signatur\" angeschaltet sein!" + +# type: Plain text +#: ../../src/utils/xas/docs/xas.1:14 +msgid "" +"To enable it on every startup of xchat you can just run the script in " +"/usr/bin/autstart-xas." +msgstr "Um es bei jedem Start von xchat zu aktivieren kannst du das Script /usr/bin/autostart-xas verwenden." + +# type: Plain text +#: ../../src/utils/xas/docs/xas.1:16 +msgid "B was originally written by niet" +msgstr "B wurde im Original geschrieben von niet" + diff --git a/docs/man/manpages.pot b/docs/man/manpages.pot new file mode 100644 index 00000000..146537f9 --- /dev/null +++ b/docs/man/manpages.pot @@ -0,0 +1,1611 @@ +# SOME DESCRIPTIVE TITLE +# Copyright (C) YEAR Free Software Foundation, Inc. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2007-08-23 18:27+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING" + +# type: TH +#: docs/man/amule.1:1 +#, no-wrap +msgid "AMULE" +msgstr "" + +# type: TH +#: docs/man/amule.1:1 docs/man/amuled.1:1 docs/man/amulecmd.1:1 docs/man/amulegui.1:1 docs/man/amuleweb.1:1 docs/man/ed2k.1:1 src/utils/cas/docs/cas.1:1 src/utils/cas/docs/cas.1:6 src/utils/wxCas/docs/wxcas.1:1 src/utils/xas/docs/xas.1:1 +#, no-wrap +msgid "January 2007" +msgstr "" + +# type: TH +#: docs/man/amule.1:1 +#, no-wrap +msgid "aMule v2.2.0" +msgstr "" + +# type: TH +#: docs/man/amule.1:1 +#, no-wrap +msgid "aMule" +msgstr "" + +# type: SH +#: docs/man/amule.1:2 docs/man/amuled.1:2 docs/man/amulecmd.1:2 docs/man/amulegui.1:2 docs/man/amuleweb.1:2 docs/man/ed2k.1:2 src/utils/cas/docs/cas.1:2 src/utils/wxCas/docs/wxcas.1:2 src/utils/xas/docs/xas.1:2 +#, no-wrap +msgid "NAME" +msgstr "" + +# type: Plain text +#: docs/man/amule.1:4 +msgid "amule - the all-platform eMule p2p client" +msgstr "" + +# type: SH +#: docs/man/amule.1:4 docs/man/amuled.1:4 docs/man/amulecmd.1:4 docs/man/amulegui.1:4 docs/man/amuleweb.1:4 docs/man/ed2k.1:4 src/utils/cas/docs/cas.1:4 src/utils/wxCas/docs/wxcas.1:4 src/utils/xas/docs/xas.1:4 +#, no-wrap +msgid "SYNOPSIS" +msgstr "" + +# type: Plain text +#: docs/man/amule.1:13 +msgid "" +"B [B<-v>] [B<-h>] [B<-i>] [B<-geometry> IgeomE>] [B<-d>] " +"[B<-o>] [B<-r>]" +msgstr "" + +# type: SH +#: docs/man/amule.1:13 docs/man/amuled.1:15 docs/man/amulecmd.1:24 docs/man/amulegui.1:6 docs/man/amuleweb.1:36 docs/man/ed2k.1:12 src/utils/cas/docs/cas.1:7 src/utils/wxCas/docs/wxcas.1:6 src/utils/xas/docs/xas.1:6 +#, no-wrap +msgid "DESCRIPTION" +msgstr "" + +# type: TP +#: docs/man/amule.1:14 docs/man/amuled.1:16 +#, no-wrap +msgid "B<-v>, B<--version>" +msgstr "" + +# type: Plain text +#: docs/man/amule.1:17 docs/man/amuled.1:19 docs/man/amulecmd.1:65 docs/man/amuleweb.1:118 docs/man/ed2k.1:26 +msgid "Displays the current version number." +msgstr "" + +# type: TP +#: docs/man/amule.1:17 docs/man/amuled.1:19 src/utils/cas/docs/cas.1:28 +#, no-wrap +msgid "B<-h>, B<--help>" +msgstr "" + +# type: Plain text +#: docs/man/amule.1:20 docs/man/amuled.1:22 docs/man/amulecmd.1:62 docs/man/amuleweb.1:115 docs/man/ed2k.1:20 src/utils/cas/docs/cas.1:31 +msgid "Prints a short usage description." +msgstr "" + +# type: TP +#: docs/man/amule.1:20 docs/man/amuled.1:22 +#, no-wrap +msgid "B<-i>, B<--enable-stdin>" +msgstr "" + +# type: Plain text +#: docs/man/amule.1:23 docs/man/amuled.1:25 +msgid "Does not disable stdin." +msgstr "" + +# type: TP +#: docs/man/amule.1:23 +#, no-wrap +msgid "B<-geometry> IgeomE>" +msgstr "" + +# type: Plain text +#: docs/man/amule.1:27 +msgid "" +"Sets the geometry of the app. IgeomE> uses the same format as " +"standard X11 " +"apps:\t[B<=>][IwidthE>{B}IheightE>][{B<+->}IxoffsetE>{B<+->}IyoffsetE>]" +msgstr "" + +# type: TP +#: docs/man/amule.1:27 docs/man/amuled.1:31 +#, no-wrap +msgid "B<-d>, B<--disable-fatal>" +msgstr "" + +# type: Plain text +#: docs/man/amule.1:30 docs/man/amuled.1:34 +msgid "Does not handle fatal exception." +msgstr "" + +# type: TP +#: docs/man/amule.1:30 docs/man/amuled.1:34 +#, no-wrap +msgid "B<-o>, B<--log-stdout>" +msgstr "" + +# type: Plain text +#: docs/man/amule.1:33 docs/man/amuled.1:37 +msgid "Print log messages to stdout." +msgstr "" + +# type: TP +#: docs/man/amule.1:33 +#, no-wrap +msgid "B<-r>, B<--reset-config>" +msgstr "" + +# type: Plain text +#: docs/man/amule.1:36 +msgid "Resets config to default values." +msgstr "" + +# type: SH +#: docs/man/amule.1:36 docs/man/amuled.1:37 docs/man/amulecmd.1:238 docs/man/amuleweb.1:159 docs/man/ed2k.1:26 src/utils/cas/docs/cas.1:33 +#, no-wrap +msgid "FILES" +msgstr "" + +# type: Plain text +#: docs/man/amule.1:39 docs/man/amuled.1:39 +msgid "~/.aMule/*" +msgstr "" + +# type: SH +#: docs/man/amule.1:39 docs/man/amuled.1:39 docs/man/amulecmd.1:254 docs/man/amulegui.1:13 docs/man/amuleweb.1:179 docs/man/ed2k.1:28 src/utils/cas/docs/cas.1:41 src/utils/wxCas/docs/wxcas.1:17 src/utils/xas/docs/xas.1:16 +#, no-wrap +msgid "REPORTING BUGS" +msgstr "" + +# type: Plain text +#: docs/man/amule.1:42 docs/man/amuled.1:42 docs/man/amulecmd.1:257 docs/man/amulegui.1:16 docs/man/amuleweb.1:182 docs/man/ed2k.1:31 src/utils/cas/docs/cas.1:44 src/utils/wxCas/docs/wxcas.1:20 src/utils/xas/docs/xas.1:19 +msgid "" +"Please report bugs either on our forum (I), or in " +"our bugtracker (I). Please do not report bugs in " +"e-mail, neither to our mailing list nor directly to any team member." +msgstr "" + +# type: SH +#: docs/man/amule.1:42 docs/man/amuled.1:42 docs/man/amulecmd.1:257 docs/man/amulegui.1:16 docs/man/amuleweb.1:182 docs/man/ed2k.1:31 src/utils/cas/docs/cas.1:44 src/utils/wxCas/docs/wxcas.1:20 src/utils/xas/docs/xas.1:19 +#, no-wrap +msgid "COPYRIGHT" +msgstr "" + +# type: Plain text +#: docs/man/amule.1:44 docs/man/amuled.1:44 docs/man/amulecmd.1:259 docs/man/amulegui.1:18 docs/man/amuleweb.1:184 docs/man/ed2k.1:33 src/utils/cas/docs/cas.1:46 src/utils/wxCas/docs/wxcas.1:22 src/utils/xas/docs/xas.1:21 +msgid "" +"aMule and all of its related utilities are distributed under the GNU General " +"Public License." +msgstr "" + +# type: SH +#: docs/man/amule.1:44 docs/man/amuled.1:44 docs/man/amulecmd.1:259 docs/man/amulegui.1:18 docs/man/amuleweb.1:184 docs/man/ed2k.1:33 src/utils/cas/docs/cas.1:46 src/utils/wxCas/docs/wxcas.1:22 src/utils/xas/docs/xas.1:21 +#, no-wrap +msgid "SEE ALSO" +msgstr "" + +# type: Plain text +#: docs/man/amuled.1:1 +msgid "" +"B(1), B(1), B(1), B(1), B(1), " +"B(1), B(1), B(1), B(1), B(1)" +msgstr "" + +# type: TH +#: docs/man/amuled.1:1 +#, no-wrap +msgid "AMULED" +msgstr "" + +# type: TH +#: docs/man/amuled.1:1 +#, no-wrap +msgid "aMule Daemon v2.2.0" +msgstr "" + +# type: TH +#: docs/man/amuled.1:1 +#, no-wrap +msgid "aMule Daemon" +msgstr "" + +# type: Plain text +#: docs/man/amuled.1:4 +msgid "amuled - the all-platform eMule p2p client - daemonized version" +msgstr "" + +# type: Plain text +#: docs/man/amuled.1:14 +msgid "" +"B [B<-v>] [B<-h>] [B<-i>] [B<-f>] [B<-c> IdirE>] [B<-d>] " +"[B<-o>] [B<-r>]" +msgstr "" + +# type: TP +#: docs/man/amuled.1:25 +#, no-wrap +msgid "B<-f>, B<--full-daemon>" +msgstr "" + +# type: Plain text +#: docs/man/amuled.1:28 +msgid "Fork to Background" +msgstr "" + +# type: TP +#: docs/man/amuled.1:28 +#, no-wrap +msgid "B<-c>, B<--config-dir>=IdirE>" +msgstr "" + +# type: Plain text +#: docs/man/amuled.1:31 +msgid "Read config from EdirE instead of home." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:1 +msgid "" +"B(1), B(1), B(1), B(1), B(1), " +"B(1), B(1)" +msgstr "" + +# type: TH +#: docs/man/amulecmd.1:1 +#, no-wrap +msgid "AMULECMD" +msgstr "" + +# type: TH +#: docs/man/amulecmd.1:1 +#, no-wrap +msgid "aMuleCmd v2.2.0" +msgstr "" + +# type: TH +#: docs/man/amulecmd.1:1 docs/man/amuleweb.1:1 docs/man/ed2k.1:1 src/utils/cas/docs/cas.1:1 src/utils/cas/docs/cas.1:6 src/utils/wxCas/docs/wxcas.1:1 src/utils/xas/docs/xas.1:1 +#, no-wrap +msgid "aMule utilities" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:4 +msgid "amulecmd - Console-based program to control aMule" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:15 +msgid "" +"B [B<-h> IhostE>] [B<-p> IportE>] [B<-P> " +"IpasswdE>] [B<-f> IpathE>] [B<-q>] [B<-v>] [B<-l> " +"IlangE>] [B<-w>] [B<-c> IcommandE>]" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:18 +msgid "B B<--create-config-from=>IpathE>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:21 +msgid "B [B<--help>]" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:24 +msgid "B [B<--version>]" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:26 +msgid "B is a console-based client to control aMule." +msgstr "" + +# type: TP +#: docs/man/amulecmd.1:26 docs/man/amuleweb.1:41 +#, no-wrap +msgid "B<-h>, B<--host>=IhostE>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:30 docs/man/amuleweb.1:45 +msgid "" +"Host where aMule is running (default: I). IhostE> " +"might be an IP address or a DNS name" +msgstr "" + +# type: TP +#: docs/man/amulecmd.1:30 docs/man/amuleweb.1:45 +#, no-wrap +msgid "B<-p>, B<--port>=IportE>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:33 docs/man/amuleweb.1:48 +msgid "" +"aMule's port for External Connections, as set in Preferences-ERemote " +"Controls (default: I<4712>)" +msgstr "" + +# type: TP +#: docs/man/amulecmd.1:33 docs/man/amuleweb.1:48 +#, no-wrap +msgid "B<-P>, B<--password>=IpasswdE>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:36 docs/man/amuleweb.1:51 +msgid "External Connections password" +msgstr "" + +# type: TP +#: docs/man/amulecmd.1:36 docs/man/amuleweb.1:51 +#, no-wrap +msgid "B<-f>, B<--config-file>=IpathE>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:40 docs/man/amuleweb.1:55 +msgid "" +"Use the given configuration file. Default configuration file is " +"I<~/.aMule/remote.conf>" +msgstr "" + +# type: TP +#: docs/man/amulecmd.1:40 docs/man/amuleweb.1:55 +#, no-wrap +msgid "B<-q>, B<--quiet>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:43 +msgid "" +"Ddo not print any output to stdout. This seems to be a very much useless " +"option with B." +msgstr "" + +# type: TP +#: docs/man/amulecmd.1:43 docs/man/amuleweb.1:59 +#, no-wrap +msgid "B<-v>, B<--verbose>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:46 docs/man/amuleweb.1:62 +msgid "Be verbose - show also debug messages" +msgstr "" + +# type: TP +#: docs/man/amulecmd.1:46 docs/man/amuleweb.1:62 +#, no-wrap +msgid "B<-l>, B<--locale>=IlangE>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:50 docs/man/amuleweb.1:66 +msgid "" +"Sets program locale (language). See section B for the " +"description of the IlangE> parameter." +msgstr "" + +# type: TP +#: docs/man/amulecmd.1:50 docs/man/amuleweb.1:66 +#, no-wrap +msgid "B<-w>, B<--write-config>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:53 docs/man/amuleweb.1:69 +msgid "Write command line options to config file and exit" +msgstr "" + +# type: TP +#: docs/man/amulecmd.1:53 +#, no-wrap +msgid "B<-c>, B<--command>=IcommandE>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:56 +msgid "" +"Execute IcommandE> as if it was entered at amulecmd's prompt and " +"exit." +msgstr "" + +# type: TP +#: docs/man/amulecmd.1:56 docs/man/amuleweb.1:69 +#, no-wrap +msgid "B<--create-config-from>=IpathE>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:59 docs/man/amuleweb.1:72 +msgid "" +"Create config file based upon IpathE>, which must point to a valid " +"aMule config file, and then exit" +msgstr "" + +# type: TP +#: docs/man/amulecmd.1:59 docs/man/amuleweb.1:112 docs/man/ed2k.1:17 +#, no-wrap +msgid "B<--help>" +msgstr "" + +# type: TP +#: docs/man/amulecmd.1:62 docs/man/amuleweb.1:115 docs/man/ed2k.1:23 +#, no-wrap +msgid "B<--version>" +msgstr "" + +# type: SH +#: docs/man/amulecmd.1:65 +#, no-wrap +msgid "COMMANDS" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:67 +msgid "All commands are case insensitive" +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:67 +#, no-wrap +msgid "AddR< Eed2k-linkE>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:69 +msgid "Adds an ed2k-linkto the core." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:71 +msgid "The ed2k link to be added can be:" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:73 +msgid "*) a file link (ed2k://|file|...), it will be added to the download queue," +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:75 +msgid "*) a server link (ed2k://|server|...), it will be added to the server list," +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:77 +msgid "" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the server list." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:79 docs/man/amulecmd.1:104 docs/man/amulecmd.1:176 +msgid "This command must have an argument." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:79 +#, no-wrap +msgid "CancelR< EhashE>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:81 +msgid "Cancels the download specified by hash. To get the hash use I." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:81 +#, no-wrap +msgid "ConnectR< (kad|ed2kEip|nameE)>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:83 +msgid "Connect to the network." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:85 +msgid "This will connect to all networks that are enabled in Preferences." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:90 +msgid "" +"When giving ed2k as parameter, it connects only to ed2k-network to servers " +"in your serverlist. You may also optionally specify a server address in " +"IP:Port form, to connect to that server only. The IP must be a dotted " +"decimal IPv4 address, or a resolvable DNS name." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:92 +msgid "When giving kad, it connects to Kad only." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:92 +#, no-wrap +msgid "DisconnectR< (ed2k|kad)>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:96 +msgid "" +"Disconnect from all networks you are cionnected to, or just disconnect from " +"the specified network." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:96 +#, no-wrap +msgid "DownloadR< num>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:98 +msgid "Start downloading a file" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:102 +msgid "" +"The number of a file from the last search has to be given. Example: " +"'download 12' will start to download the file with the number 12 of the " +"previous search." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:104 +#, no-wrap +msgid "Exit" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:106 +msgid "Disconnect from amule/amuled and quit amulecmd." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:106 +#, no-wrap +msgid "GetR< value>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:108 +msgid "Get and display a preference value." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:110 docs/man/amulecmd.1:134 docs/man/amulecmd.1:166 +msgid "This command is incomplete, aviable values are listed below." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:112 docs/man/amulecmd.1:136 docs/man/amulecmd.1:168 +msgid "Available values to get:" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:114 +msgid "BwLimits\tGet bandwidth limits." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:116 +msgid "IPFilter\tGet IPFilter preferences." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:116 +#, no-wrap +msgid "HelpR< EcommandE>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:120 +msgid "" +"Get a short help. If called without parameter, it shows a list of aviable " +"commands. If called with EcommandE, it shows a short description of " +"the given command." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:120 +#, no-wrap +msgid "PauseR< EhashE>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:122 +msgid "Pauses the download specified by hash. To get the hash use I." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:122 +#, no-wrap +msgid "Progress" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:124 +msgid "Shows the progress of an ongiong search." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:126 docs/man/amulecmd.1:130 docs/man/amulecmd.1:144 docs/man/amulecmd.1:148 docs/man/amulecmd.1:194 +msgid "This command can't have an argument." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:126 +#, no-wrap +msgid "Quit" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:128 +msgid "Exits the App." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:130 +#, no-wrap +msgid "Reload" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:132 +msgid "Reloads a given object." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:138 +msgid "BwLimits\tReload bandwidth limits." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:140 +msgid "IPFilter\tReload IPFilter preferences." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:140 +#, no-wrap +msgid "Reset" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:142 +msgid "Reset the log." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:144 +#, no-wrap +msgid "Results" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:146 +msgid "Shows you the results of the last search." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:148 +#, no-wrap +msgid "ResumeR< EhashE>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:150 +msgid "Resumes the download specified by hash. To get the hash use I." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:150 +#, no-wrap +msgid "SearchR< global|kad|local file>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:154 +msgid "" +"Makes a search for the given file. A searchtype and a file to search is " +"mandatory to do this. I 'search kad amule' performs a kad search " +"for amule." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:156 +msgid "Aviable searchtypes:" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:158 +msgid "global\tperforms a global search" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:160 +msgid "kad\tperforms a search on kad network" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:162 +msgid "local\tperforms a local search" +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:162 +#, no-wrap +msgid "SetR< EvalueE>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:164 +msgid "Sets a given preferences value." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:170 +msgid "BwLimits\tSet bandwidth limits." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:172 +msgid "IPFilter\tSet IPFilter preferences." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:172 +#, no-wrap +msgid "ShowR< DL|Log|Servers|UL>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:174 +msgid "Shows upload/download queue, server list or shared files list." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:178 +msgid "This command is incomplete, you must use one of the extensions below." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:180 +msgid "Available extensions:" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:182 +msgid "DL\t\tShow download queue." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:184 +msgid "Log\t\tShow log." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:186 +msgid "Servers\tShow servers list." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:188 +msgid "UL\t\tShow upload queue." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:188 +#, no-wrap +msgid "Shutdown" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:192 +msgid "" +"Shutdown the remote running core (amule/amuled). This will also shut down " +"the text client, since it is unusable without a running core." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:194 +#, no-wrap +msgid "StatisticsR< EnumE>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:196 +msgid "Show statistics tree." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:200 +msgid "" +"The optional number in the range of 0-255 can be passed as argument to this " +"command, which tells how many entries of the client version subtree should " +"be shown. Passing 0, or omitting it means 'unlimited'." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:203 +msgid "" +"I 'statistics 5' will show only the top 5 versions for each client " +"type." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:203 +#, no-wrap +msgid "Status" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:205 +msgid "Show connection status, current up/download speeds, etc." +msgstr "" + +# type: SH +#: docs/man/amulecmd.1:206 docs/man/amuleweb.1:118 +#, no-wrap +msgid "NOTES" +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:207 docs/man/amuleweb.1:119 +#, no-wrap +msgid "Paths" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:211 docs/man/amuleweb.1:123 +msgid "" +"For all options which take a IpathE> value, if the I " +"contains no directory part (i.e. just a plain filename), then it is " +"considered to be under the aMule configuration directory, I<~/.aMule>." +msgstr "" + +# type: SS +#: docs/man/amulecmd.1:211 docs/man/amuleweb.1:123 +#, no-wrap +msgid "LANGUAGES" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:217 docs/man/amuleweb.1:129 +msgid "" +"The IlangE> parameter for the B<-l> option has the following form: " +"I[B<_>I][B<.>I][B<@>I] where I is the " +"primary language, I is a sublanguage/territory, I is the " +"character set to use and I \"allows the user to select a specific " +"instance of localization data within a single category\"." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:219 docs/man/amuleweb.1:131 +msgid "For example, the following strings are valid:" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:221 docs/man/amuleweb.1:133 +msgid "de" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:223 docs/man/amuleweb.1:135 +msgid "de_DE" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:225 docs/man/amuleweb.1:137 +msgid "de_DE.iso88591" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:227 docs/man/amuleweb.1:139 +msgid "de_DE@euro" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:229 docs/man/amuleweb.1:141 +msgid "de_DE.iso88591@euro" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:232 docs/man/amuleweb.1:144 +msgid "" +"Though all the above strings are accepted as valid language definitions, " +"I and I are yet unused." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:235 docs/man/amuleweb.1:147 +msgid "" +"In addition to the format above, you can also specify full language names in " +"English - so B<-l german> is also valid and is equal to B<-l de_DE>." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:238 docs/man/amuleweb.1:150 +msgid "" +"When no locale is defined, either on command-line or in config file, system " +"default language will be used." +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:240 docs/man/amuleweb.1:161 +msgid "~/.aMule/remote.conf" +msgstr "" + +# type: SH +#: docs/man/amulecmd.1:240 docs/man/amuleweb.1:165 +#, no-wrap +msgid "EXAMPLE" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:242 +msgid "Typically amulecmd will be first run as:" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:244 +msgid "B B<-h> I B<-p> I B<-P> I B<-w>" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:246 docs/man/amuleweb.1:171 +msgid "or" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:248 +msgid "B B<--create-config-from>=I" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:250 docs/man/amuleweb.1:175 +msgid "" +"These will save settings to I<$HOME/.aMule/remote.conf>, and later you only " +"need to type:" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:252 +msgid "B" +msgstr "" + +# type: Plain text +#: docs/man/amulecmd.1:254 +msgid "Of course, you don't have to follow this example." +msgstr "" + +# type: Plain text +#: docs/man/amulegui.1:1 +msgid "B(1), B(1)" +msgstr "" + +# type: TH +#: docs/man/amulegui.1:1 +#, no-wrap +msgid "AMULEGUI" +msgstr "" + +# type: TH +#: docs/man/amulegui.1:1 +#, no-wrap +msgid "aMuleGUI v2.2.0" +msgstr "" + +# type: TH +#: docs/man/amulegui.1:1 +#, no-wrap +msgid "aMuleGUI" +msgstr "" + +# type: Plain text +#: docs/man/amulegui.1:4 +msgid "amulegui - aMule control program with GUI" +msgstr "" + +# type: Plain text +#: docs/man/amulegui.1:6 +msgid "B" +msgstr "" + +# type: Plain text +#: docs/man/amulegui.1:11 +msgid "" +"B is a client program, and can be connected on amule or amuled via " +"EC. You can manage your amule program with it. It provides the almost same " +"functionality as amule, even if the core works on another computer." +msgstr "" + +# type: Plain text +#: docs/man/amulegui.1:13 src/utils/wxCas/docs/wxcas.1:13 +msgid "This program doesn't take any arguments." +msgstr "" + +# type: Plain text +#: docs/man/amulegui.1:20 +msgid "" +"B(1), B(1), B(1), B(1), B(1), " +"B(1), B(1), B(1), B(1)" +msgstr "" + +# type: SH +#: docs/man/amulegui.1:20 src/utils/cas/docs/cas.1:39 src/utils/wxCas/docs/wxcas.1:15 src/utils/xas/docs/xas.1:14 +#, no-wrap +msgid "AUTHOR" +msgstr "" + +# type: Plain text +#: docs/man/amulegui.1:23 +msgid "" +"This manpage was written by Julien Delange for Debian Ejulien AT gunnm " +"DOT orgE This manpage was rewritten by Vollstrecker for aMule " +"Eamule@vollstreckernet.deE" +msgstr "" + +# type: TH +#: docs/man/amuleweb.1:1 +#, no-wrap +msgid "AMULEWEB" +msgstr "" + +# type: TH +#: docs/man/amuleweb.1:1 +#, no-wrap +msgid "aMule webserver v2.2.0" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:4 +msgid "amuleweb - aMule web server" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:24 +msgid "" +"B [B<-h> IhostE>] [B<-p> IportE>] [B<-P> " +"IpassE>] [B<-f> IpathE>] [B<-q>] [B<-v>] [B<-l> " +"IlangE>] [B<-w>] [B<-t> InameE>] [B<-s> " +"IportE>] [B<-z>] [B<-Z>] [B<-A> IpassE>] [B<-G> " +"IpassE>] [B<-a>] [B<-d>] [B<-L>] [B<-N>]" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:28 +msgid "" +"B [B<-f> IpathE>] " +"B<--create-config-from=>IpathE>" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:32 +msgid "B [B<--help>] [B<--version>]" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:34 +msgid "BIpathE>" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:36 +msgid "B" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:41 +msgid "" +"B manages your access to amule through a webbrowser. You can " +"start amuleweb together with B(1), or separately, any time later. " +"Options can be specified via command-line or via config-file. Command-line " +"options take precedence over config-file options." +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:59 +msgid "" +"Do not print any output to stdout. You may want to use B<-q> to daemonize " +"the webserver, i.e. running as 'B'" +msgstr "" + +# type: TP +#: docs/man/amuleweb.1:72 +#, no-wrap +msgid "B<-t>, B<--template>=InameE>" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:76 +msgid "" +"Loads the template named InameE>. See also the section B" +msgstr "" + +# type: TP +#: docs/man/amuleweb.1:76 +#, no-wrap +msgid "B<-s>, B<--server-port>=IportE>" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:79 +msgid "" +"Webserver's HTTP port. This is the port you can point your browser to " +"(default: I<4711>)" +msgstr "" + +# type: TP +#: docs/man/amuleweb.1:79 +#, no-wrap +msgid "B<-z>, B<--enable-gzip>" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:82 +msgid "Enable using gzip compression in HTTP traffic to save bandwidth" +msgstr "" + +# type: TP +#: docs/man/amuleweb.1:82 +#, no-wrap +msgid "B<-Z>, B<--disable-gzip>" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:85 +msgid "Disable using gzip compression (this is the default)" +msgstr "" + +# type: TP +#: docs/man/amuleweb.1:85 +#, no-wrap +msgid "B<-A>, B<--admin-pass>=IpasswdE>" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:88 +msgid "Full access password for webserver" +msgstr "" + +# type: TP +#: docs/man/amuleweb.1:88 +#, no-wrap +msgid "B<-G>, B<--guest-pass>=IpasswdE>" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:91 +msgid "Guest password for webserver" +msgstr "" + +# type: TP +#: docs/man/amuleweb.1:91 +#, no-wrap +msgid "B<-a>, B<--allow-guest>" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:94 +msgid "Allow guest access" +msgstr "" + +# type: TP +#: docs/man/amuleweb.1:94 +#, no-wrap +msgid "B<-d>, B<--deny-guest>" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:97 +msgid "Deny guest access (default)" +msgstr "" + +# type: TP +#: docs/man/amuleweb.1:97 +#, no-wrap +msgid "B<-L>, B<--load-settings>" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:103 +msgid "" +"Load/save webserver settings from/to remote aMule. This causes amuleweb to " +"ignore command-line and config-file settings, and load them from aMule. " +"When saving preferences none will be written to the config file, but to " +"aMule. (Of course, this works only for those settings, that can be set in " +"aMule's Preferences-ERemote Controls)" +msgstr "" + +# type: TP +#: docs/man/amuleweb.1:103 +#, no-wrap +msgid "B<-N>, B<--no-script-cache>" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:106 +msgid "Recompile PHP pages on each request" +msgstr "" + +# type: TP +#: docs/man/amuleweb.1:106 +#, no-wrap +msgid "B<--amule-config-file>=IpathE>" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:112 +msgid "" +"aMule config file path. B aMule uses this option when " +"starting amuleweb at aMule startup. This option causes all other " +"command-line and config-file settings to be ignored, preferences to be read " +"from the given config file, and also implies the B<-q -L> options." +msgstr "" + +# type: SH +#: docs/man/amuleweb.1:150 +#, no-wrap +msgid "SKIN SUPPORT" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:157 +msgid "" +"B is capable of displaying information in different skins. These " +"skins are called templates, and you can make amuleweb load a specific " +"template via the B<-t> command line option. Templates are searched in two " +"places: first in I<~/.aMule/webserver/> and then in " +"I<$(pkgdatadir)/webserver/> (I<$(pkgdatadir)> is the install location of " +"architecture independent data, most likely something like " +"/usr/share/amule). Each template must be in a subdirectory of the template " +"name, and this directory must contain all files the template needs. The " +"actual template filename must be aMule.tmpl." +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:159 +msgid "" +"For example, the default template (named 'default') is in " +"webserver/default/, and this directory contains aMule.tmpl amongst a lot of " +"image files." +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:163 +msgid "~/.aMule/webserver/" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:165 +msgid "I<$(pkgdatadir)>/webserver/" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:167 +msgid "Typically amuleweb will be first run as:" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:169 +msgid "" +"B B<-h> I B<-p> I B<-P> I B<-s> " +"I B<-A> I B<-w>" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:173 +msgid "B B<--create-config-from>=I" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:177 +msgid "B" +msgstr "" + +# type: Plain text +#: docs/man/amuleweb.1:179 +msgid "" +"Of course, you may specify any more or less options on the first example " +"line, and you may also totally omit it." +msgstr "" + +# type: Plain text +#: docs/man/ed2k.1:1 +msgid "B(1), B(1)" +msgstr "" + +# type: TH +#: docs/man/ed2k.1:1 +#, no-wrap +msgid "ED2K" +msgstr "" + +# type: TH +#: docs/man/ed2k.1:1 +#, no-wrap +msgid "aMule ED2k link parser v1.2.0" +msgstr "" + +# type: Plain text +#: docs/man/ed2k.1:4 +msgid "ed2k - aMule ED2k link parser" +msgstr "" + +# type: Plain text +#: docs/man/ed2k.1:7 +msgid "B IED2k_linkE>" +msgstr "" + +# type: Plain text +#: docs/man/ed2k.1:12 +msgid "B [B<--help>] [B<--config-dir,>-cB<]> [B<--version>]" +msgstr "" + +# type: Plain text +#: docs/man/ed2k.1:16 +msgid "" +"aMule ED2k link parser v1.1.0. Sends the given IED2k_linkE> to " +"aMule, i.e. writes it to the file ~/.aMule/ED2KLinks, which will be checked " +"by aMule every second for links. B accepts file, server and " +"serverlist links." +msgstr "" + +# type: SS +#: docs/man/ed2k.1:16 +#, no-wrap +msgid "Usage:" +msgstr "" + +# type: TP +#: docs/man/ed2k.1:20 +#, no-wrap +msgid "B<-c>, B<--config-dir>=IdirE> " +msgstr "" + +# type: Plain text +#: docs/man/ed2k.1:23 +msgid "" +"Specifies the aMule configuration directory. This must be writeable by the " +"user running B." +msgstr "" + +# type: Plain text +#: docs/man/ed2k.1:28 +msgid "~/.aMule/ED2KLinks" +msgstr "" + +# type: Plain text +#: src/utils/cas/docs/cas.1:1 src/utils/xas/docs/xas.1:22 +msgid "B(1)" +msgstr "" + +# type: TH +#: src/utils/cas/docs/cas.1:1 src/utils/cas/docs/cas.1:6 +#, no-wrap +msgid "CAS" +msgstr "" + +# type: TH +#: src/utils/cas/docs/cas.1:1 +#, no-wrap +msgid "cas v0.8" +msgstr "" + +# type: Plain text +#: src/utils/cas/docs/cas.1:4 +msgid "cas - c aMule statistics" +msgstr "" + +# type: Plain text +#: src/utils/cas/docs/cas.1:6 +msgid "B" +msgstr "" + +# type: TH +#: src/utils/cas/docs/cas.1:6 +#, no-wrap +msgid "aMule ED2k links calculator" +msgstr "" + +# type: Plain text +#: src/utils/cas/docs/cas.1:13 +#, no-wrap +msgid "" +" ___ _ _ ___ c aMule statistics\n" +" /'___) /'_` )/',__) by Pedro de Oliveira\n" +" ( (___ ( (_| |\\e\\__, \\e Efalso@rdk.homeip.netE\n" +" `\\e____)`\\e__,_)(____/ Version 0.5\n" +msgstr "" + +# type: Plain text +#: src/utils/cas/docs/cas.1:16 +msgid "" +"B is a program for displaying the contents of your aMule online " +"signature file to console (in a human readable form)." +msgstr "" + +# type: SS +#: src/utils/cas/docs/cas.1:16 +#, no-wrap +msgid "OPTIONS:" +msgstr "" + +# type: TP +#: src/utils/cas/docs/cas.1:17 +#, no-wrap +msgid "B<-o>, B<--picture>, B<-P>" +msgstr "" + +# type: Plain text +#: src/utils/cas/docs/cas.1:21 +msgid "" +"Writes the online signature picture. You can optionally append " +"I<\\=\\EPATH\\E> to this option, to specify where the picture should " +"be written" +msgstr "" + +# type: TP +#: src/utils/cas/docs/cas.1:21 +#, no-wrap +msgid "B<-p>, B<--html>, B<-H>" +msgstr "" + +# type: Plain text +#: src/utils/cas/docs/cas.1:25 +msgid "" +"HTML page with stats and picture. You can optionally append " +"I<\\=\\EPATH\\E> to this option, to specify where the page should be " +"written" +msgstr "" + +# type: TP +#: src/utils/cas/docs/cas.1:25 +#, no-wrap +msgid "B<-c>, B<--config-dir>" +msgstr "" + +# type: Plain text +#: src/utils/cas/docs/cas.1:28 +msgid "Specifies a config-dir different from home" +msgstr "" + +# type: Plain text +#: src/utils/cas/docs/cas.1:33 +msgid "Without any options, prints online signature data to stdout." +msgstr "" + +# type: Plain text +#: src/utils/cas/docs/cas.1:35 +msgid "~/.aMule/casrc" +msgstr "" + +# type: Plain text +#: src/utils/cas/docs/cas.1:37 +msgid "stat.png" +msgstr "" + +# type: Plain text +#: src/utils/cas/docs/cas.1:39 +msgid "tmp.html" +msgstr "" + +# type: Plain text +#: src/utils/cas/docs/cas.1:41 +msgid "B was written by Pedro de Oliveira Efalso@rdk.homeip.netE" +msgstr "" + +# type: Plain text +#: src/utils/wxCas/docs/wxcas.1:1 +msgid "B(1), B(1)" +msgstr "" + +# type: TH +#: src/utils/wxCas/docs/wxcas.1:1 +#, no-wrap +msgid "WXCAS" +msgstr "" + +# type: TH +#: src/utils/wxCas/docs/wxcas.1:1 +#, no-wrap +msgid "wxCas" +msgstr "" + +# type: Plain text +#: src/utils/wxCas/docs/wxcas.1:4 +msgid "wxcas - wx c aMule statistics" +msgstr "" + +# type: Plain text +#: src/utils/wxCas/docs/wxcas.1:6 +msgid "B" +msgstr "" + +# type: Plain text +#: src/utils/wxCas/docs/wxcas.1:11 +msgid "" +"B is a program for displaying the contents of your online signature " +"file in a nice wx Window on your Desktop. Based on Pedro de Oliveira's " +"B(1)." +msgstr "" + +# type: Plain text +#: src/utils/wxCas/docs/wxcas.1:15 +msgid "" +"The full documentation of wxcas can be downloaded from " +"I." +msgstr "" + +# type: Plain text +#: src/utils/wxCas/docs/wxcas.1:17 +msgid "B was written by ThePolish Ethepolish@vipmail.ruE" +msgstr "" + +# type: Plain text +#: src/utils/xas/docs/xas.1:1 +msgid "B(1), B(1)" +msgstr "" + +# type: TH +#: src/utils/xas/docs/xas.1:1 +#, no-wrap +msgid "XAS" +msgstr "" + +# type: TH +#: src/utils/xas/docs/xas.1:1 +#, no-wrap +msgid "xas v1.9" +msgstr "" + +# type: Plain text +#: src/utils/xas/docs/xas.1:4 +msgid "xas - X-Chat aMule Statistics" +msgstr "" + +# type: Plain text +#: src/utils/xas/docs/xas.1:6 +msgid "B" +msgstr "" + +# type: Plain text +#: src/utils/xas/docs/xas.1:12 +msgid "" +"B is a plugin for xchat. For loading see your xchat " +"documentation. After loading type /xas and it will send statistics to the " +"channel you are in. These are taken from your Online Signature file. For " +"this to work, you must enable the \"Online Signature\" option in aMules " +"preferences." +msgstr "" + +# type: Plain text +#: src/utils/xas/docs/xas.1:14 +msgid "" +"To enable it on every startup of xchat you can just run the script in " +"/usr/bin/autstart-xas." +msgstr "" + +# type: Plain text +#: src/utils/xas/docs/xas.1:16 +msgid "B was originally written by niet" +msgstr "" diff --git a/docs/socks4.protocol b/docs/socks4.protocol new file mode 100644 index 00000000..a1ffdee2 --- /dev/null +++ b/docs/socks4.protocol @@ -0,0 +1,152 @@ + SOCKS: A protocol for TCP proxy across firewalls + + Ying-Da Lee + Principal Member Technical Staff + NEC Systems Laboratory, CSTC + ylee@syl.dl.nec.com + +SOCKS was originally developed by David Koblas and subsequently modified +and extended by me to its current running version -- version 4. It is a +protocol that relays TCP sessions at a firewall host to allow application +users transparent access across the firewall. Because the protocol is +independent of application protocols, it can be (and has been) used for +many different services, such as telnet, ftp, finger, whois, gopher, WWW, +etc. Access control can be applied at the beginning of each TCP session; +thereafter the server simply relays the data between the client and the +application server, incurring minimum processing overhead. Since SOCKS +never has to know anything about the application protocol, it should also +be easy for it to accommodate applications which use encryption to protect +their traffic from nosey snoopers. + +Two operations are defined: CONNECT and BIND. + +1) CONNECT + +The client connects to the SOCKS server and sends a CONNECT request when +it wants to establish a connection to an application server. The client +includes in the request packet the IP address and the port number of the +destination host, and userid, in the following format. + + +----+----+----+----+----+----+----+----+----+----+....+----+ + | VN | CD | DSTPORT | DSTIP | USERID |NULL| + +----+----+----+----+----+----+----+----+----+----+....+----+ + # of bytes: 1 1 2 4 variable 1 + +VN is the SOCKS protocol version number and should be 4. CD is the +SOCKS command code and should be 1 for CONNECT request. NULL is a byte +of all zero bits. + +The SOCKS server checks to see whether such a request should be granted +based on any combination of source IP address, destination IP address, +destination port number, the userid, and information it may obtain by +consulting IDENT, cf. RFC 1413. If the request is granted, the SOCKS +server makes a connection to the specified port of the destination host. +A reply packet is sent to the client when this connection is established, +or when the request is rejected or the operation fails. + + +----+----+----+----+----+----+----+----+ + | VN | CD | DSTPORT | DSTIP | + +----+----+----+----+----+----+----+----+ + # of bytes: 1 1 2 4 + +VN is the version of the reply code and should be 0. CD is the result +code with one of the following values: + + 90: request granted + 91: request rejected or failed + 92: request rejected becasue SOCKS server cannot connect to + identd on the client + 93: request rejected because the client program and identd + report different user-ids + +The remaining fields are ignored. + +The SOCKS server closes its connection immediately after notifying +the client of a failed or rejected request. For a successful request, +the SOCKS server gets ready to relay traffic on both directions. This +enables the client to do I/O on its connection as if it were directly +connected to the application server. + + +2) BIND + +The client connects to the SOCKS server and sends a BIND request when +it wants to prepare for an inbound connection from an application server. +This should only happen after a primary connection to the application +server has been established with a CONNECT. Typically, this is part of +the sequence of actions: + +-bind(): obtain a socket +-getsockname(): get the IP address and port number of the socket +-listen(): ready to accept call from the application server +-use the primary connection to inform the application server of + the IP address and the port number that it should connect to. +-accept(): accept a connection from the application server + +The purpose of SOCKS BIND operation is to support such a sequence +but using a socket on the SOCKS server rather than on the client. + +The client includes in the request packet the IP address of the +application server, the destination port used in the primary connection, +and the userid. + + +----+----+----+----+----+----+----+----+----+----+....+----+ + | VN | CD | DSTPORT | DSTIP | USERID |NULL| + +----+----+----+----+----+----+----+----+----+----+....+----+ + # of bytes: 1 1 2 4 variable 1 + +VN is again 4 for the SOCKS protocol version number. CD must be 2 to +indicate BIND request. + +The SOCKS server uses the client information to decide whether the +request is to be granted. The reply it sends back to the client has +the same format as the reply for CONNECT request, i.e., + + +----+----+----+----+----+----+----+----+ + | VN | CD | DSTPORT | DSTIP | + +----+----+----+----+----+----+----+----+ + # of bytes: 1 1 2 4 + +VN is the version of the reply code and should be 0. CD is the result +code with one of the following values: + + 90: request granted + 91: request rejected or failed + 92: request rejected becasue SOCKS server cannot connect to + identd on the client + 93: request rejected because the client program and identd + report different user-ids. + +However, for a granted request (CD is 90), the DSTPORT and DSTIP fields +are meaningful. In that case, the SOCKS server obtains a socket to wait +for an incoming connection and sends the port number and the IP address +of that socket to the client in DSTPORT and DSTIP, respectively. If the +DSTIP in the reply is 0 (the value of constant INADDR_ANY), then the +client should replace it by the IP address of the SOCKS server to which +the cleint is connected. (This happens if the SOCKS server is not a +multi-homed host.) In the typical scenario, these two numbers are +made available to the application client prgram via the result of the +subsequent getsockname() call. The application protocol must provide a +way for these two pieces of information to be sent from the client to +the application server so that it can initiate the connection, which +connects it to the SOCKS server rather than directly to the application +client as it normally would. + +The SOCKS server sends a second reply packet to the client when the +anticipated connection from the application server is established. +The SOCKS server checks the IP address of the originating host against +the value of DSTIP specified in the client's BIND request. If a mismatch +is found, the CD field in the second reply is set to 91 and the SOCKS +server closes both connections. If the two match, CD in the second +reply is set to 90 and the SOCKS server gets ready to relay the traffic +on its two connections. From then on the client does I/O on its connection +to the SOCKS server as if it were directly connected to the application +server. + + + +For both CONNECT and BIND operations, the server sets a time limit +(2 minutes in current CSTC implementation) for the establishment of its +connection with the application server. If the connection is still not +establiched when the time limit expires, the server closes its connection +to the client and gives up. diff --git a/install-sh b/install-sh new file mode 100755 index 00000000..1a835340 --- /dev/null +++ b/install-sh @@ -0,0 +1,323 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2005-02-02.21 + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +chmodcmd="$chmodprog 0755" +chowncmd= +chgrpcmd= +stripcmd= +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src= +dst= +dir_arg= +dstarg= +no_target_directory= + +usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: +-c (ignored) +-d create directories instead of installing files. +-g GROUP $chgrpprog installed files to GROUP. +-m MODE $chmodprog installed files to MODE. +-o USER $chownprog installed files to USER. +-s $stripprog installed files. +-t DIRECTORY install into DIRECTORY. +-T report an error if DSTFILE is a directory. +--help display this help and exit. +--version display version info and exit. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG +" + +while test -n "$1"; do + case $1 in + -c) shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + --help) echo "$usage"; exit $?;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -s) stripcmd=$stripprog + shift + continue;; + + -t) dstarg=$2 + shift + shift + continue;; + + -T) no_target_directory=true + shift + continue;; + + --version) echo "$0 $scriptversion"; exit $?;; + + *) # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + test -n "$dir_arg$dstarg" && break + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dstarg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dstarg" + shift # fnord + fi + shift # arg + dstarg=$arg + done + break;; + esac +done + +if test -z "$1"; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src ;; + esac + + if test -n "$dir_arg"; then + dst=$src + src= + + if test -d "$dst"; then + mkdircmd=: + chmodcmd= + else + mkdircmd=$mkdirprog + fi + else + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dstarg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dstarg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst ;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dstarg: Is a directory" >&2 + exit 1 + fi + dst=$dst/`basename "$src"` + fi + fi + + # This sed command emulates the dirname command. + dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` + + # Make sure that the destination directory exists. + + # Skip lots of stat calls in the usual case. + if test ! -d "$dstdir"; then + defaultIFS=' + ' + IFS="${IFS-$defaultIFS}" + + oIFS=$IFS + # Some sh's can't handle IFS=/ for some reason. + IFS='%' + set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` + shift + IFS=$oIFS + + pathcomp= + + while test $# -ne 0 ; do + pathcomp=$pathcomp$1 + shift + if test ! -d "$pathcomp"; then + $mkdirprog "$pathcomp" + # mkdir can fail with a `File exist' error in case several + # install-sh are creating the directory concurrently. This + # is OK. + test -d "$pathcomp" || exit + fi + pathcomp=$pathcomp/ + done + fi + + if test -n "$dir_arg"; then + $doit $mkdircmd "$dst" \ + && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } + + else + dstfile=`basename "$dst"` + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + trap '(exit $?); exit' 1 2 13 15 + + # Copy the file name to the temp name. + $doit $cpprog "$src" "$dsttmp" && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && + + # Now rename the file to the real destination. + { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ + || { + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + if test -f "$dstdir/$dstfile"; then + $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ + || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ + || { + echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 + (exit 1); exit 1 + } + else + : + fi + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" + } + } + fi || { (exit 1); exit 1; } +done + +# The final little trick to "correctly" pass the exit status to the exit trap. +{ + (exit 0); exit 0 +} + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/intl/ChangeLog b/intl/ChangeLog new file mode 100644 index 00000000..65ec50f7 --- /dev/null +++ b/intl/ChangeLog @@ -0,0 +1,4 @@ +2002-08-06 GNU + + * Version 0.11.5 released. + diff --git a/intl/Makefile.in b/intl/Makefile.in new file mode 100644 index 00000000..3ab6e516 --- /dev/null +++ b/intl/Makefile.in @@ -0,0 +1,338 @@ +# Makefile for directory with message catalog handling in GNU NLS Utilities. +# Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library 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. + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = /bin/sh + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +top_builddir = .. +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +transform = @program_transform_name@ +libdir = @libdir@ +includedir = @includedir@ +datarootdir = @datarootdir@ +datadir = @datadir@ +localedir = $(datadir)/locale +gettextsrcdir = $(datadir)/gettext/intl +aliaspath = $(localedir) +subdir = intl + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +mkinstalldirs = $(SHELL) `case "$(MKINSTALLDIRS)" in /*) echo "$(MKINSTALLDIRS)" ;; *) echo "$(top_builddir)/$(MKINSTALLDIRS)" ;; esac` + +l = @INTL_LIBTOOL_SUFFIX_PREFIX@ + +AR = ar +CC = @CC@ +LIBTOOL = @LIBTOOL@ +RANLIB = @RANLIB@ +YACC = @INTLBISON@ -y -d +YFLAGS = --name-prefix=__gettext + +DEFS = -DLOCALEDIR=\"$(localedir)\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \ +-DLIBDIR=\"$(libdir)\" -DIN_LIBINTL @DEFS@ +CPPFLAGS = @CPPFLAGS@ +CFLAGS = @CFLAGS@ +LDFLAGS = @LDFLAGS@ + +COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) + +HEADERS = $(COMHDRS) libgnuintl.h loadinfo.h +COMHDRS = gmo.h gettextP.h hash-string.h plural-exp.h eval-plural.h os2compat.h +SOURCES = $(COMSRCS) intl-compat.c +COMSRCS = bindtextdom.c dcgettext.c dgettext.c gettext.c \ +finddomain.c loadmsgcat.c localealias.c textdomain.c l10nflist.c \ +explodename.c dcigettext.c dcngettext.c dngettext.c ngettext.c plural.y \ +plural-exp.c localcharset.c localename.c osdep.c os2compat.c +OBJECTS = @INTLOBJS@ bindtextdom.$lo dcgettext.$lo dgettext.$lo gettext.$lo \ +finddomain.$lo loadmsgcat.$lo localealias.$lo textdomain.$lo l10nflist.$lo \ +explodename.$lo dcigettext.$lo dcngettext.$lo dngettext.$lo ngettext.$lo \ +plural.$lo plural-exp.$lo localcharset.$lo localename.$lo osdep.$lo +GETTOBJS = intl-compat.$lo +DISTFILES.common = Makefile.in \ +config.charset locale.alias ref-add.sin ref-del.sin $(HEADERS) $(SOURCES) +DISTFILES.generated = plural.c +DISTFILES.normal = VERSION +DISTFILES.gettext = COPYING.LIB-2.0 COPYING.LIB-2.1 libintl.glibc +DISTFILES.obsolete = xopen-msg.sed linux-msg.sed po2tbl.sed.in cat-compat.c \ +COPYING.LIB-2 gettext.h libgettext.h plural-eval.c + +# Libtool's library version information for libintl. +# Before making a gettext release, the gettext maintainer must change this +# according to the libtool documentation, section "Library interface versions". +# Maintainers of other packages that include the intl directory must *not* +# change these values. +LTV_CURRENT=4 +LTV_REVISION=0 +LTV_AGE=2 + +.SUFFIXES: +.SUFFIXES: .c .y .o .lo .sin .sed +.c.o: + $(COMPILE) $< +.c.lo: + $(LIBTOOL) --mode=compile $(COMPILE) $< + +.y.c: + $(YACC) $(YFLAGS) --output $@ $< + rm -f $*.h + +.sin.sed: + sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $< > t-$@ + mv t-$@ $@ + +INCLUDES = -I.. -I. -I$(top_srcdir)/intl + +all: all-@USE_INCLUDED_LIBINTL@ +all-yes: libintl.$la libintl.h charset.alias ref-add.sed ref-del.sed +all-no: all-no-@BUILD_INCLUDED_LIBINTL@ +all-no-yes: libgnuintl.$la +all-no-no: + +libintl.a libgnuintl.a: $(OBJECTS) + rm -f $@ + $(AR) cru $@ $(OBJECTS) + $(RANLIB) $@ + +libintl.la libgnuintl.la: $(OBJECTS) + $(LIBTOOL) --mode=link \ + $(CC) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ \ + $(OBJECTS) @LTLIBICONV@ -lc \ + -version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \ + -rpath $(libdir) \ + -no-undefined + +libintl.h: libgnuintl.h + cp $(srcdir)/libgnuintl.h libintl.h + +charset.alias: config.charset + $(SHELL) $(srcdir)/config.charset '@host@' > t-$@ + mv t-$@ $@ + +check: all + +# This installation goal is only used in GNU gettext. Packages which +# only use the library should use install instead. + +# We must not install the libintl.h/libintl.a files if we are on a +# system which has the GNU gettext() function in its C library or in a +# separate library. +# If you want to use the one which comes with this version of the +# package, you have to use `configure --with-included-gettext'. +install: install-exec install-data +install-exec: all + if test "$(PACKAGE)" = "gettext" \ + && test '@INTLOBJS@' = '$(GETTOBJS)'; then \ + $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \ + $(INSTALL_DATA) libintl.h $(DESTDIR)$(includedir)/libintl.h; \ + $(LIBTOOL) --mode=install \ + $(INSTALL_DATA) libintl.$la $(DESTDIR)$(libdir)/libintl.$la; \ + else \ + : ; \ + fi + if test '@USE_INCLUDED_LIBINTL@' = yes; then \ + test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \ + temp=$(DESTDIR)$(libdir)/t-charset.alias; \ + dest=$(DESTDIR)$(libdir)/charset.alias; \ + if test -f $(DESTDIR)$(libdir)/charset.alias; then \ + orig=$(DESTDIR)$(libdir)/charset.alias; \ + sed -f ref-add.sed $$orig > $$temp; \ + $(INSTALL_DATA) $$temp $$dest; \ + rm -f $$temp; \ + else \ + if test @GLIBC21@ = no; then \ + orig=charset.alias; \ + sed -f ref-add.sed $$orig > $$temp; \ + $(INSTALL_DATA) $$temp $$dest; \ + rm -f $$temp; \ + fi; \ + fi; \ + $(mkinstalldirs) $(DESTDIR)$(localedir); \ + test -f $(DESTDIR)$(localedir)/locale.alias \ + && orig=$(DESTDIR)$(localedir)/locale.alias \ + || orig=$(srcdir)/locale.alias; \ + temp=$(DESTDIR)$(localedir)/t-locale.alias; \ + dest=$(DESTDIR)$(localedir)/locale.alias; \ + sed -f ref-add.sed $$orig > $$temp; \ + $(INSTALL_DATA) $$temp $$dest; \ + rm -f $$temp; \ + else \ + : ; \ + fi +install-data: all + if test "$(PACKAGE)" = "gettext"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + $(INSTALL_DATA) VERSION $(DESTDIR)$(gettextsrcdir)/VERSION; \ + $(INSTALL_DATA) ChangeLog.inst $(DESTDIR)$(gettextsrcdir)/ChangeLog; \ + dists="COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common)"; \ + for file in $$dists; do \ + $(INSTALL_DATA) $(srcdir)/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + chmod a+x $(DESTDIR)$(gettextsrcdir)/config.charset; \ + dists="$(DISTFILES.generated)"; \ + for file in $$dists; do \ + if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ + $(INSTALL_DATA) $$dir/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + dists="$(DISTFILES.obsolete)"; \ + for file in $$dists; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi + +install-strip: install + +installdirs: + if test "$(PACKAGE)" = "gettext" \ + && test '@INTLOBJS@' = '$(GETTOBJS)'; then \ + $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \ + else \ + : ; \ + fi + if test '@USE_INCLUDED_LIBINTL@' = yes; then \ + test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \ + $(mkinstalldirs) $(DESTDIR)$(localedir); \ + else \ + : ; \ + fi + if test "$(PACKAGE)" = "gettext"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + else \ + : ; \ + fi + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: + if test "$(PACKAGE)" = "gettext" \ + && test '@INTLOBJS@' = '$(GETTOBJS)'; then \ + rm -f $(DESTDIR)$(includedir)/libintl.h; \ + $(LIBTOOL) --mode=uninstall \ + rm -f $(DESTDIR)$(libdir)/libintl.$la; \ + else \ + : ; \ + fi + if test '@USE_INCLUDED_LIBINTL@' = yes; then \ + if test -f $(DESTDIR)$(libdir)/charset.alias; then \ + temp=$(DESTDIR)$(libdir)/t-charset.alias; \ + dest=$(DESTDIR)$(libdir)/charset.alias; \ + sed -f ref-del.sed $$dest > $$temp; \ + if grep '^# Packages using this file: $$' $$temp > /dev/null; then \ + rm -f $$dest; \ + else \ + $(INSTALL_DATA) $$temp $$dest; \ + fi; \ + rm -f $$temp; \ + fi; \ + if test -f $(DESTDIR)$(localedir)/locale.alias; then \ + temp=$(DESTDIR)$(localedir)/t-locale.alias; \ + dest=$(DESTDIR)$(localedir)/locale.alias; \ + sed -f ref-del.sed $$dest > $$temp; \ + if grep '^# Packages using this file: $$' $$temp > /dev/null; then \ + rm -f $$dest; \ + else \ + $(INSTALL_DATA) $$temp $$dest; \ + fi; \ + rm -f $$temp; \ + fi; \ + else \ + : ; \ + fi + if test "$(PACKAGE)" = "gettext"; then \ + for file in VERSION ChangeLog COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common) $(DISTFILES.generated); do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi + +info dvi: + +$(OBJECTS): ../config.h libgnuintl.h +bindtextdom.$lo dcgettext.$lo dcigettext.$lo dcngettext.$lo dgettext.$lo dngettext.$lo finddomain.$lo gettext.$lo intl-compat.$lo loadmsgcat.$lo localealias.$lo ngettext.$lo textdomain.$lo: gettextP.h gmo.h loadinfo.h +dcigettext.$lo: hash-string.h +explodename.$lo l10nflist.$lo: loadinfo.h +dcigettext.$lo loadmsgcat.$lo plural.$lo plural-exp.$lo: plural-exp.h +dcigettext.$lo: eval-plural.h + +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) + here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES) + +id: ID + +ID: $(HEADERS) $(SOURCES) + here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES) + + +mostlyclean: + rm -f *.a *.la *.o *.lo core core.* + rm -f libintl.h charset.alias ref-add.sed ref-del.sed + rm -f -r .libs _libs + +clean: mostlyclean + +distclean: clean + rm -f Makefile ID TAGS + if test "$(PACKAGE)" = gettext; then \ + rm -f ChangeLog.inst $(DISTFILES.normal); \ + else \ + : ; \ + fi + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + + +# GNU gettext needs not contain the file `VERSION' but contains some +# other files which should not be distributed in other packages. +distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: Makefile + if test "$(PACKAGE)" = gettext; then \ + additional="$(DISTFILES.gettext)"; \ + else \ + additional="$(DISTFILES.normal)"; \ + fi; \ + $(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \ + for file in ChangeLog $(DISTFILES.common) $(DISTFILES.generated) $$additional; do \ + if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ + cp -p $$dir/$$file $(distdir); \ + done + +Makefile: Makefile.in ../config.status + cd .. \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/intl/VERSION b/intl/VERSION new file mode 100644 index 00000000..acc8052f --- /dev/null +++ b/intl/VERSION @@ -0,0 +1 @@ +GNU gettext library from gettext-0.11.5 diff --git a/intl/bindtextdom.c b/intl/bindtextdom.c new file mode 100644 index 00000000..d582ce11 --- /dev/null +++ b/intl/bindtextdom.c @@ -0,0 +1,369 @@ +/* Implementation of the bindtextdomain(3) function + Copyright (C) 1995-1998, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif +#include "gettextP.h" + +#ifdef _LIBC +/* We have to handle multi-threaded applications. */ +# include +#else +/* Provide dummy implementation if this is outside glibc. */ +# define __libc_rwlock_define(CLASS, NAME) +# define __libc_rwlock_wrlock(NAME) +# define __libc_rwlock_unlock(NAME) +#endif + +/* The internal variables in the standalone libintl.a must have different + names than the internal variables in GNU libc, otherwise programs + using libintl.a cannot be linked statically. */ +#if !defined _LIBC +# define _nl_default_dirname libintl_nl_default_dirname +# define _nl_domain_bindings libintl_nl_domain_bindings +#endif + +/* Some compilers, like SunOS4 cc, don't have offsetof in . */ +#ifndef offsetof +# define offsetof(type,ident) ((size_t)&(((type*)0)->ident)) +#endif + +/* @@ end of prolog @@ */ + +/* Contains the default location of the message catalogs. */ +extern const char _nl_default_dirname[]; + +/* List with bindings of specific domains. */ +extern struct binding *_nl_domain_bindings; + +/* Lock variable to protect the global data in the gettext implementation. */ +__libc_rwlock_define (extern, _nl_state_lock attribute_hidden) + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define BINDTEXTDOMAIN __bindtextdomain +# define BIND_TEXTDOMAIN_CODESET __bind_textdomain_codeset +# ifndef strdup +# define strdup(str) __strdup (str) +# endif +#else +# define BINDTEXTDOMAIN libintl_bindtextdomain +# define BIND_TEXTDOMAIN_CODESET libintl_bind_textdomain_codeset +#endif + +/* Prototypes for local functions. */ +static void set_binding_values PARAMS ((const char *domainname, + const char **dirnamep, + const char **codesetp)); + +/* Specifies the directory name *DIRNAMEP and the output codeset *CODESETP + to be used for the DOMAINNAME message catalog. + If *DIRNAMEP or *CODESETP is NULL, the corresponding attribute is not + modified, only the current value is returned. + If DIRNAMEP or CODESETP is NULL, the corresponding attribute is neither + modified nor returned. */ +static void +set_binding_values (domainname, dirnamep, codesetp) + const char *domainname; + const char **dirnamep; + const char **codesetp; +{ + struct binding *binding; + int modified; + + /* Some sanity checks. */ + if (domainname == NULL || domainname[0] == '\0') + { + if (dirnamep) + *dirnamep = NULL; + if (codesetp) + *codesetp = NULL; + return; + } + + __libc_rwlock_wrlock (_nl_state_lock); + + modified = 0; + + for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) + { + int compare = strcmp (domainname, binding->domainname); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It is not in the list. */ + binding = NULL; + break; + } + } + + if (binding != NULL) + { + if (dirnamep) + { + const char *dirname = *dirnamep; + + if (dirname == NULL) + /* The current binding has be to returned. */ + *dirnamep = binding->dirname; + else + { + /* The domain is already bound. If the new value and the old + one are equal we simply do nothing. Otherwise replace the + old binding. */ + char *result = binding->dirname; + if (strcmp (dirname, result) != 0) + { + if (strcmp (dirname, _nl_default_dirname) == 0) + result = (char *) _nl_default_dirname; + else + { +#if defined _LIBC || defined HAVE_STRDUP + result = strdup (dirname); +#else + size_t len = strlen (dirname) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result != NULL, 1)) + memcpy (result, dirname, len); +#endif + } + + if (__builtin_expect (result != NULL, 1)) + { + if (binding->dirname != _nl_default_dirname) + free (binding->dirname); + + binding->dirname = result; + modified = 1; + } + } + *dirnamep = result; + } + } + + if (codesetp) + { + const char *codeset = *codesetp; + + if (codeset == NULL) + /* The current binding has be to returned. */ + *codesetp = binding->codeset; + else + { + /* The domain is already bound. If the new value and the old + one are equal we simply do nothing. Otherwise replace the + old binding. */ + char *result = binding->codeset; + if (result == NULL || strcmp (codeset, result) != 0) + { +#if defined _LIBC || defined HAVE_STRDUP + result = strdup (codeset); +#else + size_t len = strlen (codeset) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result != NULL, 1)) + memcpy (result, codeset, len); +#endif + + if (__builtin_expect (result != NULL, 1)) + { + if (binding->codeset != NULL) + free (binding->codeset); + + binding->codeset = result; + binding->codeset_cntr++; + modified = 1; + } + } + *codesetp = result; + } + } + } + else if ((dirnamep == NULL || *dirnamep == NULL) + && (codesetp == NULL || *codesetp == NULL)) + { + /* Simply return the default values. */ + if (dirnamep) + *dirnamep = _nl_default_dirname; + if (codesetp) + *codesetp = NULL; + } + else + { + /* We have to create a new binding. */ + size_t len = strlen (domainname) + 1; + struct binding *new_binding = + (struct binding *) malloc (offsetof (struct binding, domainname) + len); + + if (__builtin_expect (new_binding == NULL, 0)) + goto failed; + + memcpy (new_binding->domainname, domainname, len); + + if (dirnamep) + { + const char *dirname = *dirnamep; + + if (dirname == NULL) + /* The default value. */ + dirname = _nl_default_dirname; + else + { + if (strcmp (dirname, _nl_default_dirname) == 0) + dirname = _nl_default_dirname; + else + { + char *result; +#if defined _LIBC || defined HAVE_STRDUP + result = strdup (dirname); + if (__builtin_expect (result == NULL, 0)) + goto failed_dirname; +#else + size_t len = strlen (dirname) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result == NULL, 0)) + goto failed_dirname; + memcpy (result, dirname, len); +#endif + dirname = result; + } + } + *dirnamep = dirname; + new_binding->dirname = (char *) dirname; + } + else + /* The default value. */ + new_binding->dirname = (char *) _nl_default_dirname; + + new_binding->codeset_cntr = 0; + + if (codesetp) + { + const char *codeset = *codesetp; + + if (codeset != NULL) + { + char *result; + +#if defined _LIBC || defined HAVE_STRDUP + result = strdup (codeset); + if (__builtin_expect (result == NULL, 0)) + goto failed_codeset; +#else + size_t len = strlen (codeset) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result == NULL, 0)) + goto failed_codeset; + memcpy (result, codeset, len); +#endif + codeset = result; + new_binding->codeset_cntr++; + } + *codesetp = codeset; + new_binding->codeset = (char *) codeset; + } + else + new_binding->codeset = NULL; + + /* Now enqueue it. */ + if (_nl_domain_bindings == NULL + || strcmp (domainname, _nl_domain_bindings->domainname) < 0) + { + new_binding->next = _nl_domain_bindings; + _nl_domain_bindings = new_binding; + } + else + { + binding = _nl_domain_bindings; + while (binding->next != NULL + && strcmp (domainname, binding->next->domainname) > 0) + binding = binding->next; + + new_binding->next = binding->next; + binding->next = new_binding; + } + + modified = 1; + + /* Here we deal with memory allocation failures. */ + if (0) + { + failed_codeset: + if (new_binding->dirname != _nl_default_dirname) + free (new_binding->dirname); + failed_dirname: + free (new_binding); + failed: + if (dirnamep) + *dirnamep = NULL; + if (codesetp) + *codesetp = NULL; + } + } + + /* If we modified any binding, we flush the caches. */ + if (modified) + ++_nl_msg_cat_cntr; + + __libc_rwlock_unlock (_nl_state_lock); +} + +/* Specify that the DOMAINNAME message catalog will be found + in DIRNAME rather than in the system locale data base. */ +char * +BINDTEXTDOMAIN (domainname, dirname) + const char *domainname; + const char *dirname; +{ + set_binding_values (domainname, &dirname, NULL); + return (char *) dirname; +} + +/* Specify the character encoding in which the messages from the + DOMAINNAME message catalog will be returned. */ +char * +BIND_TEXTDOMAIN_CODESET (domainname, codeset) + const char *domainname; + const char *codeset; +{ + set_binding_values (domainname, NULL, &codeset); + return (char *) codeset; +} + +#ifdef _LIBC +/* Aliases for function names in GNU C Library. */ +weak_alias (__bindtextdomain, bindtextdomain); +weak_alias (__bind_textdomain_codeset, bind_textdomain_codeset); +#endif diff --git a/intl/config.charset b/intl/config.charset new file mode 100755 index 00000000..4f98b5b0 --- /dev/null +++ b/intl/config.charset @@ -0,0 +1,466 @@ +#! /bin/sh +# Output a system dependent table of character encoding aliases. +# +# Copyright (C) 2000-2002 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library 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. +# +# The table consists of lines of the form +# ALIAS CANONICAL +# +# ALIAS is the (system dependent) result of "nl_langinfo (CODESET)". +# ALIAS is compared in a case sensitive way. +# +# CANONICAL is the GNU canonical name for this character encoding. +# It must be an encoding supported by libiconv. Support by GNU libc is +# also desirable. CANONICAL is case insensitive. Usually an upper case +# MIME charset name is preferred. +# The current list of GNU canonical charset names is as follows. +# +# name used by which systems a MIME name? +# ASCII, ANSI_X3.4-1968 glibc solaris freebsd +# ISO-8859-1 glibc aix hpux irix osf solaris freebsd yes +# ISO-8859-2 glibc aix hpux irix osf solaris freebsd yes +# ISO-8859-3 glibc solaris yes +# ISO-8859-4 osf solaris freebsd yes +# ISO-8859-5 glibc aix hpux irix osf solaris freebsd yes +# ISO-8859-6 glibc aix hpux solaris yes +# ISO-8859-7 glibc aix hpux irix osf solaris yes +# ISO-8859-8 glibc aix hpux osf solaris yes +# ISO-8859-9 glibc aix hpux irix osf solaris yes +# ISO-8859-13 glibc +# ISO-8859-14 glibc +# ISO-8859-15 glibc aix osf solaris freebsd +# KOI8-R glibc solaris freebsd yes +# KOI8-U glibc freebsd yes +# KOI8-T glibc +# CP437 dos +# CP775 dos +# CP850 aix osf dos +# CP852 dos +# CP855 dos +# CP856 aix +# CP857 dos +# CP861 dos +# CP862 dos +# CP864 dos +# CP865 dos +# CP866 freebsd dos +# CP869 dos +# CP874 woe32 dos +# CP922 aix +# CP932 aix woe32 dos +# CP943 aix +# CP949 osf woe32 dos +# CP950 woe32 dos +# CP1046 aix +# CP1124 aix +# CP1125 dos +# CP1129 aix +# CP1250 woe32 +# CP1251 glibc woe32 +# CP1252 aix woe32 +# CP1253 woe32 +# CP1254 woe32 +# CP1255 glibc woe32 +# CP1256 woe32 +# CP1257 woe32 +# GB2312 glibc aix hpux irix solaris freebsd yes +# EUC-JP glibc aix hpux irix osf solaris freebsd yes +# EUC-KR glibc aix hpux irix osf solaris freebsd yes +# EUC-TW glibc aix hpux irix osf solaris +# BIG5 glibc aix hpux osf solaris freebsd yes +# BIG5-HKSCS glibc solaris +# GBK glibc aix osf solaris woe32 dos +# GB18030 glibc solaris +# SHIFT_JIS hpux osf solaris freebsd yes +# JOHAB glibc solaris woe32 +# TIS-620 glibc aix hpux osf solaris +# VISCII glibc yes +# TCVN5712-1 glibc +# GEORGIAN-PS glibc +# HP-ROMAN8 hpux +# HP-ARABIC8 hpux +# HP-GREEK8 hpux +# HP-HEBREW8 hpux +# HP-TURKISH8 hpux +# HP-KANA8 hpux +# DEC-KANJI osf +# DEC-HANYU osf +# UTF-8 glibc aix hpux osf solaris yes +# +# Note: Names which are not marked as being a MIME name should not be used in +# Internet protocols for information interchange (mail, news, etc.). +# +# Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications +# must understand both names and treat them as equivalent. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM + +host="$1" +os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'` +echo "# This file contains a table of character encoding aliases," +echo "# suitable for operating system '${os}'." +echo "# It was automatically generated from config.charset." +# List of references, updated during installation: +echo "# Packages using this file: " +case "$os" in + linux* | *-gnu*) + # With glibc-2.1 or newer, we don't need any canonicalization, + # because glibc has iconv and both glibc and libiconv support all + # GNU canonical names directly. Therefore, the Makefile does not + # need to install the alias file at all. + # The following applies only to glibc-2.0.x and older libcs. + echo "ISO_646.IRV:1983 ASCII" + ;; + aix*) + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-6 ISO-8859-6" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-8 ISO-8859-8" + echo "ISO8859-9 ISO-8859-9" + echo "ISO8859-15 ISO-8859-15" + echo "IBM-850 CP850" + echo "IBM-856 CP856" + echo "IBM-921 ISO-8859-13" + echo "IBM-922 CP922" + echo "IBM-932 CP932" + echo "IBM-943 CP943" + echo "IBM-1046 CP1046" + echo "IBM-1124 CP1124" + echo "IBM-1129 CP1129" + echo "IBM-1252 CP1252" + echo "IBM-eucCN GB2312" + echo "IBM-eucJP EUC-JP" + echo "IBM-eucKR EUC-KR" + echo "IBM-eucTW EUC-TW" + echo "big5 BIG5" + echo "GBK GBK" + echo "TIS-620 TIS-620" + echo "UTF-8 UTF-8" + ;; + hpux*) + echo "iso88591 ISO-8859-1" + echo "iso88592 ISO-8859-2" + echo "iso88595 ISO-8859-5" + echo "iso88596 ISO-8859-6" + echo "iso88597 ISO-8859-7" + echo "iso88598 ISO-8859-8" + echo "iso88599 ISO-8859-9" + echo "iso885915 ISO-8859-15" + echo "roman8 HP-ROMAN8" + echo "arabic8 HP-ARABIC8" + echo "greek8 HP-GREEK8" + echo "hebrew8 HP-HEBREW8" + echo "turkish8 HP-TURKISH8" + echo "kana8 HP-KANA8" + echo "tis620 TIS-620" + echo "big5 BIG5" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + echo "hp15CN GB2312" + #echo "ccdc ?" # what is this? + echo "SJIS SHIFT_JIS" + echo "utf8 UTF-8" + ;; + irix*) + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-9 ISO-8859-9" + echo "eucCN GB2312" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + ;; + osf*) + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-4 ISO-8859-4" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-8 ISO-8859-8" + echo "ISO8859-9 ISO-8859-9" + echo "ISO8859-15 ISO-8859-15" + echo "cp850 CP850" + echo "big5 BIG5" + echo "dechanyu DEC-HANYU" + echo "dechanzi GB2312" + echo "deckanji DEC-KANJI" + echo "deckorean EUC-KR" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + echo "GBK GBK" + echo "KSC5601 CP949" + echo "sdeckanji EUC-JP" + echo "SJIS SHIFT_JIS" + echo "TACTIS TIS-620" + echo "UTF-8 UTF-8" + ;; + solaris*) + echo "646 ASCII" + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-3 ISO-8859-3" + echo "ISO8859-4 ISO-8859-4" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-6 ISO-8859-6" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-8 ISO-8859-8" + echo "ISO8859-9 ISO-8859-9" + echo "ISO8859-15 ISO-8859-15" + echo "koi8-r KOI8-R" + echo "BIG5 BIG5" + echo "Big5-HKSCS BIG5-HKSCS" + echo "gb2312 GB2312" + echo "GBK GBK" + echo "GB18030 GB18030" + echo "cns11643 EUC-TW" + echo "5601 EUC-KR" + echo "ko_KR.johap92 JOHAB" + echo "eucJP EUC-JP" + echo "PCK SHIFT_JIS" + echo "TIS620.2533 TIS-620" + #echo "sun_eu_greek ?" # what is this? + echo "UTF-8 UTF-8" + ;; + freebsd* | os2*) + # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore + # localcharset.c falls back to using the full locale name + # from the environment variables. + # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just + # reuse FreeBSD's locale data for OS/2. + echo "C ASCII" + echo "US-ASCII ASCII" + for l in la_LN lt_LN; do + echo "$l.ASCII ASCII" + done + for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ + fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \ + lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do + echo "$l.ISO_8859-1 ISO-8859-1" + echo "$l.DIS_8859-15 ISO-8859-15" + done + for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do + echo "$l.ISO_8859-2 ISO-8859-2" + done + for l in la_LN lt_LT; do + echo "$l.ISO_8859-4 ISO-8859-4" + done + for l in ru_RU ru_SU; do + echo "$l.KOI8-R KOI8-R" + echo "$l.ISO_8859-5 ISO-8859-5" + echo "$l.CP866 CP866" + done + echo "uk_UA.KOI8-U KOI8-U" + echo "zh_TW.BIG5 BIG5" + echo "zh_TW.Big5 BIG5" + echo "zh_CN.EUC GB2312" + echo "ja_JP.EUC EUC-JP" + echo "ja_JP.SJIS SHIFT_JIS" + echo "ja_JP.Shift_JIS SHIFT_JIS" + echo "ko_KR.EUC EUC-KR" + ;; + netbsd*) + echo "646 ASCII" + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-4 ISO-8859-4" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-15 ISO-8859-15" + echo "eucCN GB2312" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + echo "BIG5 BIG5" + echo "SJIS SHIFT_JIS" + ;; + beos*) + # BeOS has a single locale, and it has UTF-8 encoding. + echo "* UTF-8" + ;; + msdosdjgpp*) + # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore + # localcharset.c falls back to using the full locale name + # from the environment variables. + echo "#" + echo "# The encodings given here may not all be correct." + echo "# If you find that the encoding given for your language and" + echo "# country is not the one your DOS machine actually uses, just" + echo "# correct it in this file, and send a mail to" + echo "# Juan Manuel Guerrero " + echo "# and Bruno Haible ." + echo "#" + echo "C ASCII" + # ISO-8859-1 languages + echo "ca CP850" + echo "ca_ES CP850" + echo "da CP865" # not CP850 ?? + echo "da_DK CP865" # not CP850 ?? + echo "de CP850" + echo "de_AT CP850" + echo "de_CH CP850" + echo "de_DE CP850" + echo "en CP850" + echo "en_AU CP850" # not CP437 ?? + echo "en_CA CP850" + echo "en_GB CP850" + echo "en_NZ CP437" + echo "en_US CP437" + echo "en_ZA CP850" # not CP437 ?? + echo "es CP850" + echo "es_AR CP850" + echo "es_BO CP850" + echo "es_CL CP850" + echo "es_CO CP850" + echo "es_CR CP850" + echo "es_CU CP850" + echo "es_DO CP850" + echo "es_EC CP850" + echo "es_ES CP850" + echo "es_GT CP850" + echo "es_HN CP850" + echo "es_MX CP850" + echo "es_NI CP850" + echo "es_PA CP850" + echo "es_PY CP850" + echo "es_PE CP850" + echo "es_SV CP850" + echo "es_UY CP850" + echo "es_VE CP850" + echo "et CP850" + echo "et_EE CP850" + echo "eu CP850" + echo "eu_ES CP850" + echo "fi CP850" + echo "fi_FI CP850" + echo "fr CP850" + echo "fr_BE CP850" + echo "fr_CA CP850" + echo "fr_CH CP850" + echo "fr_FR CP850" + echo "ga CP850" + echo "ga_IE CP850" + echo "gd CP850" + echo "gd_GB CP850" + echo "gl CP850" + echo "gl_ES CP850" + echo "id CP850" # not CP437 ?? + echo "id_ID CP850" # not CP437 ?? + echo "is CP861" # not CP850 ?? + echo "is_IS CP861" # not CP850 ?? + echo "it CP850" + echo "it_CH CP850" + echo "it_IT CP850" + echo "lt CP775" + echo "lt_LT CP775" + echo "lv CP775" + echo "lv_LV CP775" + echo "nb CP865" # not CP850 ?? + echo "nb_NO CP865" # not CP850 ?? + echo "nl CP850" + echo "nl_BE CP850" + echo "nl_NL CP850" + echo "nn CP865" # not CP850 ?? + echo "nn_NO CP865" # not CP850 ?? + echo "no CP865" # not CP850 ?? + echo "no_NO CP865" # not CP850 ?? + echo "pt CP850" + echo "pt_BR CP850" + echo "pt_PT CP850" + echo "sv CP850" + echo "sv_SE CP850" + # ISO-8859-2 languages + echo "cs CP852" + echo "cs_CZ CP852" + echo "hr CP852" + echo "hr_HR CP852" + echo "hu CP852" + echo "hu_HU CP852" + echo "pl CP852" + echo "pl_PL CP852" + echo "ro CP852" + echo "ro_RO CP852" + echo "sk CP852" + echo "sk_SK CP852" + echo "sl CP852" + echo "sl_SI CP852" + echo "sq CP852" + echo "sq_AL CP852" + echo "sr CP852" # CP852 or CP866 or CP855 ?? + echo "sr_YU CP852" # CP852 or CP866 or CP855 ?? + # ISO-8859-3 languages + echo "mt CP850" + echo "mt_MT CP850" + # ISO-8859-5 languages + echo "be CP866" + echo "be_BE CP866" + echo "bg CP866" # not CP855 ?? + echo "bg_BG CP866" # not CP855 ?? + echo "mk CP866" # not CP855 ?? + echo "mk_MK CP866" # not CP855 ?? + echo "ru CP866" + echo "ru_RU CP866" + echo "uk CP1125" + echo "uk_UA CP1125" + # ISO-8859-6 languages + echo "ar CP864" + echo "ar_AE CP864" + echo "ar_DZ CP864" + echo "ar_EG CP864" + echo "ar_IQ CP864" + echo "ar_IR CP864" + echo "ar_JO CP864" + echo "ar_KW CP864" + echo "ar_MA CP864" + echo "ar_OM CP864" + echo "ar_QA CP864" + echo "ar_SA CP864" + echo "ar_SY CP864" + # ISO-8859-7 languages + echo "el CP869" + echo "el_GR CP869" + # ISO-8859-8 languages + echo "he CP862" + echo "he_IL CP862" + # ISO-8859-9 languages + echo "tr CP857" + echo "tr_TR CP857" + # Japanese + echo "ja CP932" + echo "ja_JP CP932" + # Chinese + echo "zh_CN GBK" + echo "zh_TW CP950" # not CP938 ?? + # Korean + echo "kr CP949" # not CP934 ?? + echo "kr_KR CP949" # not CP934 ?? + # Thai + echo "th CP874" + echo "th_TH CP874" + # Other + echo "eo CP850" + echo "eo_EO CP850" + ;; +esac diff --git a/intl/dcgettext.c b/intl/dcgettext.c new file mode 100644 index 00000000..ca6a1c82 --- /dev/null +++ b/intl/dcgettext.c @@ -0,0 +1,59 @@ +/* Implementation of the dcgettext(3) function. + Copyright (C) 1995-1999, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DCGETTEXT __dcgettext +# define DCIGETTEXT __dcigettext +#else +# define DCGETTEXT libintl_dcgettext +# define DCIGETTEXT libintl_dcigettext +#endif + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +char * +DCGETTEXT (domainname, msgid, category) + const char *domainname; + const char *msgid; + int category; +{ + return DCIGETTEXT (domainname, msgid, NULL, 0, 0, category); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +INTDEF(__dcgettext) +weak_alias (__dcgettext, dcgettext); +#endif diff --git a/intl/dcigettext.c b/intl/dcigettext.c new file mode 100644 index 00000000..f2f01524 --- /dev/null +++ b/intl/dcigettext.c @@ -0,0 +1,1206 @@ +/* Implementation of the internal dcigettext function. + Copyright (C) 1995-1999, 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +/* Tell glibc's to provide a prototype for mempcpy(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +#endif + +#include +#ifndef errno +extern int errno; +#endif +#ifndef __set_errno +# define __set_errno(val) errno = (val) +#endif + +#include +#include +#include + +#if defined HAVE_UNISTD_H || defined _LIBC +# include +#endif + +#include + +#ifdef _LIBC + /* Guess whether integer division by zero raises signal SIGFPE. + Set to 1 only if you know for sure. In case of doubt, set to 0. */ +# if defined __alpha__ || defined __arm__ || defined __i386__ \ + || defined __m68k__ || defined __s390__ +# define INTDIV0_RAISES_SIGFPE 1 +# else +# define INTDIV0_RAISES_SIGFPE 0 +# endif +#endif +#if !INTDIV0_RAISES_SIGFPE +# include +#endif + +#if defined HAVE_SYS_PARAM_H || defined _LIBC +# include +#endif + +#include "gettextP.h" +#include "plural-exp.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif +#include "hash-string.h" + +/* Thread safetyness. */ +#ifdef _LIBC +# include +#else +/* Provide dummy implementation if this is outside glibc. */ +# define __libc_lock_define_initialized(CLASS, NAME) +# define __libc_lock_lock(NAME) +# define __libc_lock_unlock(NAME) +# define __libc_rwlock_define_initialized(CLASS, NAME) +# define __libc_rwlock_rdlock(NAME) +# define __libc_rwlock_unlock(NAME) +#endif + +/* Alignment of types. */ +#if defined __GNUC__ && __GNUC__ >= 2 +# define alignof(TYPE) __alignof__ (TYPE) +#else +# define alignof(TYPE) \ + ((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2) +#endif + +/* The internal variables in the standalone libintl.a must have different + names than the internal variables in GNU libc, otherwise programs + using libintl.a cannot be linked statically. */ +#if !defined _LIBC +# define _nl_default_default_domain libintl_nl_default_default_domain +# define _nl_current_default_domain libintl_nl_current_default_domain +# define _nl_default_dirname libintl_nl_default_dirname +# define _nl_domain_bindings libintl_nl_domain_bindings +#endif + +/* Some compilers, like SunOS4 cc, don't have offsetof in . */ +#ifndef offsetof +# define offsetof(type,ident) ((size_t)&(((type*)0)->ident)) +#endif + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# define getcwd __getcwd +# ifndef stpcpy +# define stpcpy __stpcpy +# endif +# define tfind __tfind +#else +# if !defined HAVE_GETCWD +char *getwd (); +# define getcwd(buf, max) getwd (buf) +# else +char *getcwd (); +# endif +# ifndef HAVE_STPCPY +static char *stpcpy PARAMS ((char *dest, const char *src)); +# endif +# ifndef HAVE_MEMPCPY +static void *mempcpy PARAMS ((void *dest, const void *src, size_t n)); +# endif +#endif + +/* Amount to increase buffer size by in each try. */ +#define PATH_INCR 32 + +/* The following is from pathmax.h. */ +/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define + PATH_MAX but might cause redefinition warnings when sys/param.h is + later included (as on MORE/BSD 4.3). */ +#if defined _POSIX_VERSION || (defined HAVE_LIMITS_H && !defined __GNUC__) +# include +#endif + +#ifndef _POSIX_PATH_MAX +# define _POSIX_PATH_MAX 255 +#endif + +#if !defined PATH_MAX && defined _PC_PATH_MAX +# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX)) +#endif + +/* Don't include sys/param.h if it already has been. */ +#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN +# include +#endif + +#if !defined PATH_MAX && defined MAXPATHLEN +# define PATH_MAX MAXPATHLEN +#endif + +#ifndef PATH_MAX +# define PATH_MAX _POSIX_PATH_MAX +#endif + +/* Pathname support. + ISSLASH(C) tests whether C is a directory separator character. + IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not, + it may be concatenated to a directory pathname. + IS_PATH_WITH_DIR(P) tests whether P contains a directory specification. + */ +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +# define HAS_DEVICE(P) \ + ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ + && (P)[1] == ':') +# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P)) +# define IS_PATH_WITH_DIR(P) \ + (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P)) +#else + /* Unix */ +# define ISSLASH(C) ((C) == '/') +# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0]) +# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL) +#endif + +/* This is the type used for the search tree where known translations + are stored. */ +struct known_translation_t +{ + /* Domain in which to search. */ + char *domainname; + + /* The category. */ + int category; + + /* State of the catalog counter at the point the string was found. */ + int counter; + + /* Catalog where the string was found. */ + struct loaded_l10nfile *domain; + + /* And finally the translation. */ + const char *translation; + size_t translation_length; + + /* Pointer to the string in question. */ + char msgid[ZERO]; +}; + +/* Root of the search tree with known translations. We can use this + only if the system provides the `tsearch' function family. */ +#if defined HAVE_TSEARCH || defined _LIBC +# include + +static void *root; + +# ifdef _LIBC +# define tsearch __tsearch +# endif + +/* Function to compare two entries in the table of known translations. */ +static int transcmp PARAMS ((const void *p1, const void *p2)); +static int +transcmp (p1, p2) + const void *p1; + const void *p2; +{ + const struct known_translation_t *s1; + const struct known_translation_t *s2; + int result; + + s1 = (const struct known_translation_t *) p1; + s2 = (const struct known_translation_t *) p2; + + result = strcmp (s1->msgid, s2->msgid); + if (result == 0) + { + result = strcmp (s1->domainname, s2->domainname); + if (result == 0) + /* We compare the category last (though this is the cheapest + operation) since it is hopefully always the same (namely + LC_MESSAGES). */ + result = s1->category - s2->category; + } + + return result; +} +#endif + +/* Name of the default domain used for gettext(3) prior any call to + textdomain(3). The default value for this is "messages". */ +const char _nl_default_default_domain[] attribute_hidden = "messages"; + +/* Value used as the default domain for gettext(3). */ +const char *_nl_current_default_domain attribute_hidden + = _nl_default_default_domain; + +/* Contains the default location of the message catalogs. */ +#if defined __EMX__ +extern const char _nl_default_dirname[]; +#else +const char _nl_default_dirname[] = LOCALEDIR; +#endif + +/* List with bindings of specific domains created by bindtextdomain() + calls. */ +struct binding *_nl_domain_bindings; + +/* Prototypes for local functions. */ +static char *plural_lookup PARAMS ((struct loaded_l10nfile *domain, + unsigned long int n, + const char *translation, + size_t translation_len)) + internal_function; +static const char *category_to_name PARAMS ((int category)) internal_function; +static const char *guess_category_value PARAMS ((int category, + const char *categoryname)) + internal_function; + + +/* For those loosing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +/* Nothing has to be done. */ +# define freea(p) /* nothing */ +# define ADD_BLOCK(list, address) /* nothing */ +# define FREE_BLOCKS(list) /* nothing */ +#else +struct block_list +{ + void *address; + struct block_list *next; +}; +# define ADD_BLOCK(list, addr) \ + do { \ + struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \ + /* If we cannot get a free block we cannot add the new element to \ + the list. */ \ + if (newp != NULL) { \ + newp->address = (addr); \ + newp->next = (list); \ + (list) = newp; \ + } \ + } while (0) +# define FREE_BLOCKS(list) \ + do { \ + while (list != NULL) { \ + struct block_list *old = list; \ + list = list->next; \ + free (old->address); \ + free (old); \ + } \ + } while (0) +# undef alloca +# define alloca(size) (malloc (size)) +# define freea(p) free (p) +#endif /* have alloca */ + + +#ifdef _LIBC +/* List of blocks allocated for translations. */ +typedef struct transmem_list +{ + struct transmem_list *next; + char data[ZERO]; +} transmem_block_t; +static struct transmem_list *transmem_list; +#else +typedef unsigned char transmem_block_t; +#endif + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DCIGETTEXT __dcigettext +#else +# define DCIGETTEXT libintl_dcigettext +#endif + +/* Lock variable to protect the global data in the gettext implementation. */ +#ifdef _LIBC +__libc_rwlock_define_initialized (, _nl_state_lock attribute_hidden) +#endif + +/* Checking whether the binaries runs SUID must be done and glibc provides + easier methods therefore we make a difference here. */ +#ifdef _LIBC +# define ENABLE_SECURE __libc_enable_secure +# define DETERMINE_SECURE +#else +# ifndef HAVE_GETUID +# define getuid() 0 +# endif +# ifndef HAVE_GETGID +# define getgid() 0 +# endif +# ifndef HAVE_GETEUID +# define geteuid() getuid() +# endif +# ifndef HAVE_GETEGID +# define getegid() getgid() +# endif +static int enable_secure; +# define ENABLE_SECURE (enable_secure == 1) +# define DETERMINE_SECURE \ + if (enable_secure == 0) \ + { \ + if (getuid () != geteuid () || getgid () != getegid ()) \ + enable_secure = 1; \ + else \ + enable_secure = -1; \ + } +#endif + +/* Get the function to evaluate the plural expression. */ +#include "eval-plural.h" + +/* Look up MSGID in the DOMAINNAME message catalog for the current + CATEGORY locale and, if PLURAL is nonzero, search over string + depending on the plural form determined by N. */ +char * +DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category) + const char *domainname; + const char *msgid1; + const char *msgid2; + int plural; + unsigned long int n; + int category; +{ +#ifndef HAVE_ALLOCA + struct block_list *block_list = NULL; +#endif + struct loaded_l10nfile *domain; + struct binding *binding; + const char *categoryname; + const char *categoryvalue; + char *dirname, *xdomainname; + char *single_locale; + char *retval; + size_t retlen; + int saved_errno; +#if defined HAVE_TSEARCH || defined _LIBC + struct known_translation_t *search; + struct known_translation_t **foundp = NULL; + size_t msgid_len; +#endif + size_t domainname_len; + + /* If no real MSGID is given return NULL. */ + if (msgid1 == NULL) + return NULL; + + __libc_rwlock_rdlock (_nl_state_lock); + + /* If DOMAINNAME is NULL, we are interested in the default domain. If + CATEGORY is not LC_MESSAGES this might not make much sense but the + definition left this undefined. */ + if (domainname == NULL) + domainname = _nl_current_default_domain; + + /* OS/2 specific: backward compatibility with older libintl versions */ +#ifdef LC_MESSAGES_COMPAT + if (category == LC_MESSAGES_COMPAT) + category = LC_MESSAGES; +#endif + +#if defined HAVE_TSEARCH || defined _LIBC + msgid_len = strlen (msgid1) + 1; + + /* Try to find the translation among those which we found at + some time. */ + search = (struct known_translation_t *) + alloca (offsetof (struct known_translation_t, msgid) + msgid_len); + memcpy (search->msgid, msgid1, msgid_len); + search->domainname = (char *) domainname; + search->category = category; + + foundp = (struct known_translation_t **) tfind (search, &root, transcmp); + freea (search); + if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr) + { + /* Now deal with plural. */ + if (plural) + retval = plural_lookup ((*foundp)->domain, n, (*foundp)->translation, + (*foundp)->translation_length); + else + retval = (char *) (*foundp)->translation; + + __libc_rwlock_unlock (_nl_state_lock); + return retval; + } +#endif + + /* Preserve the `errno' value. */ + saved_errno = errno; + + /* See whether this is a SUID binary or not. */ + DETERMINE_SECURE; + + /* First find matching binding. */ + for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) + { + int compare = strcmp (domainname, binding->domainname); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It is not in the list. */ + binding = NULL; + break; + } + } + + if (binding == NULL) + dirname = (char *) _nl_default_dirname; + else if (IS_ABSOLUTE_PATH (binding->dirname)) + dirname = binding->dirname; + else + { + /* We have a relative path. Make it absolute now. */ + size_t dirname_len = strlen (binding->dirname) + 1; + size_t path_max; + char *ret; + + path_max = (unsigned int) PATH_MAX; + path_max += 2; /* The getcwd docs say to do this. */ + + for (;;) + { + dirname = (char *) alloca (path_max + dirname_len); + ADD_BLOCK (block_list, dirname); + + __set_errno (0); + ret = getcwd (dirname, path_max); + if (ret != NULL || errno != ERANGE) + break; + + path_max += path_max / 2; + path_max += PATH_INCR; + } + + if (ret == NULL) + { + /* We cannot get the current working directory. Don't signal an + error but simply return the default string. */ + FREE_BLOCKS (block_list); + __libc_rwlock_unlock (_nl_state_lock); + __set_errno (saved_errno); + return (plural == 0 + ? (char *) msgid1 + /* Use the Germanic plural rule. */ + : n == 1 ? (char *) msgid1 : (char *) msgid2); + } + + stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname); + } + + /* Now determine the symbolic name of CATEGORY and its value. */ + categoryname = category_to_name (category); + categoryvalue = guess_category_value (category, categoryname); + + domainname_len = strlen (domainname); + xdomainname = (char *) alloca (strlen (categoryname) + + domainname_len + 5); + ADD_BLOCK (block_list, xdomainname); + + stpcpy (mempcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"), + domainname, domainname_len), + ".mo"); + + /* Creating working area. */ + single_locale = (char *) alloca (strlen (categoryvalue) + 1); + ADD_BLOCK (block_list, single_locale); + + + /* Search for the given string. This is a loop because we perhaps + got an ordered list of languages to consider for the translation. */ + while (1) + { + /* Make CATEGORYVALUE point to the next element of the list. */ + while (categoryvalue[0] != '\0' && categoryvalue[0] == ':') + ++categoryvalue; + if (categoryvalue[0] == '\0') + { + /* The whole contents of CATEGORYVALUE has been searched but + no valid entry has been found. We solve this situation + by implicitly appending a "C" entry, i.e. no translation + will take place. */ + single_locale[0] = 'C'; + single_locale[1] = '\0'; + } + else + { + char *cp = single_locale; + while (categoryvalue[0] != '\0' && categoryvalue[0] != ':') + *cp++ = *categoryvalue++; + *cp = '\0'; + + /* When this is a SUID binary we must not allow accessing files + outside the dedicated directories. */ + if (ENABLE_SECURE && IS_PATH_WITH_DIR (single_locale)) + /* Ingore this entry. */ + continue; + } + + /* If the current locale value is C (or POSIX) we don't load a + domain. Return the MSGID. */ + if (strcmp (single_locale, "C") == 0 + || strcmp (single_locale, "POSIX") == 0) + { + FREE_BLOCKS (block_list); + __libc_rwlock_unlock (_nl_state_lock); + __set_errno (saved_errno); + return (plural == 0 + ? (char *) msgid1 + /* Use the Germanic plural rule. */ + : n == 1 ? (char *) msgid1 : (char *) msgid2); + } + + + /* Find structure describing the message catalog matching the + DOMAINNAME and CATEGORY. */ + domain = _nl_find_domain (dirname, single_locale, xdomainname, binding); + + if (domain != NULL) + { + retval = _nl_find_msg (domain, binding, msgid1, &retlen); + + if (retval == NULL) + { + int cnt; + + for (cnt = 0; domain->successor[cnt] != NULL; ++cnt) + { + retval = _nl_find_msg (domain->successor[cnt], binding, + msgid1, &retlen); + + if (retval != NULL) + { + domain = domain->successor[cnt]; + break; + } + } + } + + if (retval != NULL) + { + /* Found the translation of MSGID1 in domain DOMAIN: + starting at RETVAL, RETLEN bytes. */ + FREE_BLOCKS (block_list); + __set_errno (saved_errno); +#if defined HAVE_TSEARCH || defined _LIBC + if (foundp == NULL) + { + /* Create a new entry and add it to the search tree. */ + struct known_translation_t *newp; + + newp = (struct known_translation_t *) + malloc (offsetof (struct known_translation_t, msgid) + + msgid_len + domainname_len + 1); + if (newp != NULL) + { + newp->domainname = + mempcpy (newp->msgid, msgid1, msgid_len); + memcpy (newp->domainname, domainname, domainname_len + 1); + newp->category = category; + newp->counter = _nl_msg_cat_cntr; + newp->domain = domain; + newp->translation = retval; + newp->translation_length = retlen; + + /* Insert the entry in the search tree. */ + foundp = (struct known_translation_t **) + tsearch (newp, &root, transcmp); + if (foundp == NULL + || __builtin_expect (*foundp != newp, 0)) + /* The insert failed. */ + free (newp); + } + } + else + { + /* We can update the existing entry. */ + (*foundp)->counter = _nl_msg_cat_cntr; + (*foundp)->domain = domain; + (*foundp)->translation = retval; + (*foundp)->translation_length = retlen; + } +#endif + /* Now deal with plural. */ + if (plural) + retval = plural_lookup (domain, n, retval, retlen); + + __libc_rwlock_unlock (_nl_state_lock); + return retval; + } + } + } + /* NOTREACHED */ +} + + +char * +internal_function +_nl_find_msg (domain_file, domainbinding, msgid, lengthp) + struct loaded_l10nfile *domain_file; + struct binding *domainbinding; + const char *msgid; + size_t *lengthp; +{ + struct loaded_domain *domain; + nls_uint32 nstrings; + size_t act; + char *result; + size_t resultlen; + + if (domain_file->decided == 0) + _nl_load_domain (domain_file, domainbinding); + + if (domain_file->data == NULL) + return NULL; + + domain = (struct loaded_domain *) domain_file->data; + + nstrings = domain->nstrings; + + /* Locate the MSGID and its translation. */ + if (domain->hash_tab != NULL) + { + /* Use the hashing table. */ + nls_uint32 len = strlen (msgid); + nls_uint32 hash_val = hash_string (msgid); + nls_uint32 idx = hash_val % domain->hash_size; + nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2)); + + while (1) + { + nls_uint32 nstr = + W (domain->must_swap_hash_tab, domain->hash_tab[idx]); + + if (nstr == 0) + /* Hash table entry is empty. */ + return NULL; + + nstr--; + + /* Compare msgid with the original string at index nstr. + We compare the lengths with >=, not ==, because plural entries + are represented by strings with an embedded NUL. */ + if (nstr < nstrings + ? W (domain->must_swap, domain->orig_tab[nstr].length) >= len + && (strcmp (msgid, + domain->data + W (domain->must_swap, + domain->orig_tab[nstr].offset)) + == 0) + : domain->orig_sysdep_tab[nstr - nstrings].length > len + && (strcmp (msgid, + domain->orig_sysdep_tab[nstr - nstrings].pointer) + == 0)) + { + act = nstr; + goto found; + } + + if (idx >= domain->hash_size - incr) + idx -= domain->hash_size - incr; + else + idx += incr; + } + /* NOTREACHED */ + } + else + { + /* Try the default method: binary search in the sorted array of + messages. */ + size_t top, bottom; + + bottom = 0; + top = nstrings; + while (bottom < top) + { + int cmp_val; + + act = (bottom + top) / 2; + cmp_val = strcmp (msgid, (domain->data + + W (domain->must_swap, + domain->orig_tab[act].offset))); + if (cmp_val < 0) + top = act; + else if (cmp_val > 0) + bottom = act + 1; + else + goto found; + } + /* No translation was found. */ + return NULL; + } + + found: + /* The translation was found at index ACT. If we have to convert the + string to use a different character set, this is the time. */ + if (act < nstrings) + { + result = (char *) + (domain->data + W (domain->must_swap, domain->trans_tab[act].offset)); + resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1; + } + else + { + result = (char *) domain->trans_sysdep_tab[act - nstrings].pointer; + resultlen = domain->trans_sysdep_tab[act - nstrings].length; + } + +#if defined _LIBC || HAVE_ICONV + if (domain->codeset_cntr + != (domainbinding != NULL ? domainbinding->codeset_cntr : 0)) + { + /* The domain's codeset has changed through bind_textdomain_codeset() + since the message catalog was initialized or last accessed. We + have to reinitialize the converter. */ + _nl_free_domain_conv (domain); + _nl_init_domain_conv (domain_file, domain, domainbinding); + } + + if ( +# ifdef _LIBC + domain->conv != (__gconv_t) -1 +# else +# if HAVE_ICONV + domain->conv != (iconv_t) -1 +# endif +# endif + ) + { + /* We are supposed to do a conversion. First allocate an + appropriate table with the same structure as the table + of translations in the file, where we can put the pointers + to the converted strings in. + There is a slight complication with plural entries. They + are represented by consecutive NUL terminated strings. We + handle this case by converting RESULTLEN bytes, including + NULs. */ + + if (domain->conv_tab == NULL + && ((domain->conv_tab = + (char **) calloc (nstrings + domain->n_sysdep_strings, + sizeof (char *))) + == NULL)) + /* Mark that we didn't succeed allocating a table. */ + domain->conv_tab = (char **) -1; + + if (__builtin_expect (domain->conv_tab == (char **) -1, 0)) + /* Nothing we can do, no more memory. */ + goto converted; + + if (domain->conv_tab[act] == NULL) + { + /* We haven't used this string so far, so it is not + translated yet. Do this now. */ + /* We use a bit more efficient memory handling. + We allocate always larger blocks which get used over + time. This is faster than many small allocations. */ + __libc_lock_define_initialized (static, lock) +# define INITIAL_BLOCK_SIZE 4080 + static unsigned char *freemem; + static size_t freemem_size; + + const unsigned char *inbuf; + unsigned char *outbuf; + int malloc_count; +# ifndef _LIBC + transmem_block_t *transmem_list = NULL; +# endif + + __libc_lock_lock (lock); + + inbuf = (const unsigned char *) result; + outbuf = freemem + sizeof (size_t); + + malloc_count = 0; + while (1) + { + transmem_block_t *newmem; +# ifdef _LIBC + size_t non_reversible; + int res; + + if (freemem_size < sizeof (size_t)) + goto resize_freemem; + + res = __gconv (domain->conv, + &inbuf, inbuf + resultlen, + &outbuf, + outbuf + freemem_size - sizeof (size_t), + &non_reversible); + + if (res == __GCONV_OK || res == __GCONV_EMPTY_INPUT) + break; + + if (res != __GCONV_FULL_OUTPUT) + { + __libc_lock_unlock (lock); + goto converted; + } + + inbuf = result; +# else +# if HAVE_ICONV + const char *inptr = (const char *) inbuf; + size_t inleft = resultlen; + char *outptr = (char *) outbuf; + size_t outleft; + + if (freemem_size < sizeof (size_t)) + goto resize_freemem; + + outleft = freemem_size - sizeof (size_t); + if (iconv (domain->conv, + (ICONV_CONST char **) &inptr, &inleft, + &outptr, &outleft) + != (size_t) (-1)) + { + outbuf = (unsigned char *) outptr; + break; + } + if (errno != E2BIG) + { + __libc_lock_unlock (lock); + goto converted; + } +# endif +# endif + + resize_freemem: + /* We must allocate a new buffer or resize the old one. */ + if (malloc_count > 0) + { + ++malloc_count; + freemem_size = malloc_count * INITIAL_BLOCK_SIZE; + newmem = (transmem_block_t *) realloc (transmem_list, + freemem_size); +# ifdef _LIBC + if (newmem != NULL) + transmem_list = transmem_list->next; + else + { + struct transmem_list *old = transmem_list; + + transmem_list = transmem_list->next; + free (old); + } +# endif + } + else + { + malloc_count = 1; + freemem_size = INITIAL_BLOCK_SIZE; + newmem = (transmem_block_t *) malloc (freemem_size); + } + if (__builtin_expect (newmem == NULL, 0)) + { + freemem = NULL; + freemem_size = 0; + __libc_lock_unlock (lock); + goto converted; + } + +# ifdef _LIBC + /* Add the block to the list of blocks we have to free + at some point. */ + newmem->next = transmem_list; + transmem_list = newmem; + + freemem = newmem->data; + freemem_size -= offsetof (struct transmem_list, data); +# else + transmem_list = newmem; + freemem = newmem; +# endif + + outbuf = freemem + sizeof (size_t); + } + + /* We have now in our buffer a converted string. Put this + into the table of conversions. */ + *(size_t *) freemem = outbuf - freemem - sizeof (size_t); + domain->conv_tab[act] = (char *) freemem; + /* Shrink freemem, but keep it aligned. */ + freemem_size -= outbuf - freemem; + freemem = outbuf; + freemem += freemem_size & (alignof (size_t) - 1); + freemem_size = freemem_size & ~ (alignof (size_t) - 1); + + __libc_lock_unlock (lock); + } + + /* Now domain->conv_tab[act] contains the translation of all + the plural variants. */ + result = domain->conv_tab[act] + sizeof (size_t); + resultlen = *(size_t *) domain->conv_tab[act]; + } + + converted: + /* The result string is converted. */ + +#endif /* _LIBC || HAVE_ICONV */ + + *lengthp = resultlen; + return result; +} + + +/* Look up a plural variant. */ +static char * +internal_function +plural_lookup (domain, n, translation, translation_len) + struct loaded_l10nfile *domain; + unsigned long int n; + const char *translation; + size_t translation_len; +{ + struct loaded_domain *domaindata = (struct loaded_domain *) domain->data; + unsigned long int index; + const char *p; + + index = plural_eval (domaindata->plural, n); + if (index >= domaindata->nplurals) + /* This should never happen. It means the plural expression and the + given maximum value do not match. */ + index = 0; + + /* Skip INDEX strings at TRANSLATION. */ + p = translation; + while (index-- > 0) + { +#ifdef _LIBC + p = __rawmemchr (p, '\0'); +#else + p = strchr (p, '\0'); +#endif + /* And skip over the NUL byte. */ + p++; + + if (p >= translation + translation_len) + /* This should never happen. It means the plural expression + evaluated to a value larger than the number of variants + available for MSGID1. */ + return (char *) translation; + } + return (char *) p; +} + + +/* Return string representation of locale CATEGORY. */ +static const char * +internal_function +category_to_name (category) + int category; +{ + const char *retval; + + switch (category) + { +#ifdef LC_COLLATE + case LC_COLLATE: + retval = "LC_COLLATE"; + break; +#endif +#ifdef LC_CTYPE + case LC_CTYPE: + retval = "LC_CTYPE"; + break; +#endif +#ifdef LC_MONETARY + case LC_MONETARY: + retval = "LC_MONETARY"; + break; +#endif +#ifdef LC_NUMERIC + case LC_NUMERIC: + retval = "LC_NUMERIC"; + break; +#endif +#ifdef LC_TIME + case LC_TIME: + retval = "LC_TIME"; + break; +#endif +#ifdef LC_MESSAGES + case LC_MESSAGES: + retval = "LC_MESSAGES"; + break; +#endif +#ifdef LC_RESPONSE + case LC_RESPONSE: + retval = "LC_RESPONSE"; + break; +#endif +#ifdef LC_ALL + case LC_ALL: + /* This might not make sense but is perhaps better than any other + value. */ + retval = "LC_ALL"; + break; +#endif + default: + /* If you have a better idea for a default value let me know. */ + retval = "LC_XXX"; + } + + return retval; +} + +/* Guess value of current locale from value of the environment variables. */ +static const char * +internal_function +guess_category_value (category, categoryname) + int category; + const char *categoryname; +{ + const char *language; + const char *retval; + + /* The highest priority value is the `LANGUAGE' environment + variable. But we don't use the value if the currently selected + locale is the C locale. This is a GNU extension. */ + language = getenv ("LANGUAGE"); + if (language != NULL && language[0] == '\0') + language = NULL; + + /* We have to proceed with the POSIX methods of looking to `LC_ALL', + `LC_xxx', and `LANG'. On some systems this can be done by the + `setlocale' function itself. */ +#ifdef _LIBC + retval = setlocale (category, NULL); +#else + retval = _nl_locale_name (category, categoryname); +#endif + + /* Ignore LANGUAGE if the locale is set to "C" because + 1. "C" locale usually uses the ASCII encoding, and most international + messages use non-ASCII characters. These characters get displayed + as question marks (if using glibc's iconv()) or as invalid 8-bit + characters (because other iconv()s refuse to convert most non-ASCII + characters to ASCII). In any case, the output is ugly. + 2. The precise output of some programs in the "C" locale is specified + by POSIX and should not depend on environment variables like + "LANGUAGE". We allow such programs to use gettext(). */ + return language != NULL && strcmp (retval, "C") != 0 ? language : retval; +} + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (dest, src) + char *dest; + const char *src; +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif + +#if !_LIBC && !HAVE_MEMPCPY +static void * +mempcpy (dest, src, n) + void *dest; + const void *src; + size_t n; +{ + return (void *) ((char *) memcpy (dest, src, n) + n); +} +#endif + + +#ifdef _LIBC +/* If we want to free all resources we have to do some work at + program's end. */ +static void __attribute__ ((unused)) +free_mem (void) +{ + void *old; + + while (_nl_domain_bindings != NULL) + { + struct binding *oldp = _nl_domain_bindings; + _nl_domain_bindings = _nl_domain_bindings->next; + if (oldp->dirname != _nl_default_dirname) + /* Yes, this is a pointer comparison. */ + free (oldp->dirname); + free (oldp->codeset); + free (oldp); + } + + if (_nl_current_default_domain != _nl_default_default_domain) + /* Yes, again a pointer comparison. */ + free ((char *) _nl_current_default_domain); + + /* Remove the search tree with the known translations. */ + __tdestroy (root, free); + root = NULL; + + while (transmem_list != NULL) + { + old = transmem_list; + transmem_list = transmem_list->next; + free (old); + } +} + +text_set_element (__libc_subfreeres, free_mem); +#endif diff --git a/intl/dcngettext.c b/intl/dcngettext.c new file mode 100644 index 00000000..17d9ce3e --- /dev/null +++ b/intl/dcngettext.c @@ -0,0 +1,61 @@ +/* Implementation of the dcngettext(3) function. + Copyright (C) 1995-1999, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DCNGETTEXT __dcngettext +# define DCIGETTEXT __dcigettext +#else +# define DCNGETTEXT libintl_dcngettext +# define DCIGETTEXT libintl_dcigettext +#endif + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +char * +DCNGETTEXT (domainname, msgid1, msgid2, n, category) + const char *domainname; + const char *msgid1; + const char *msgid2; + unsigned long int n; + int category; +{ + return DCIGETTEXT (domainname, msgid1, msgid2, 1, n, category); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +INTDEF(__dcngettext) +weak_alias (__dcngettext, dcngettext); +#endif diff --git a/intl/dgettext.c b/intl/dgettext.c new file mode 100644 index 00000000..cf5b4037 --- /dev/null +++ b/intl/dgettext.c @@ -0,0 +1,59 @@ +/* Implementation of the dgettext(3) function. + Copyright (C) 1995-1997, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DGETTEXT __dgettext +# define DCGETTEXT INTUSE(__dcgettext) +#else +# define DGETTEXT libintl_dgettext +# define DCGETTEXT libintl_dcgettext +#endif + +/* Look up MSGID in the DOMAINNAME message catalog of the current + LC_MESSAGES locale. */ +char * +DGETTEXT (domainname, msgid) + const char *domainname; + const char *msgid; +{ + return DCGETTEXT (domainname, msgid, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__dgettext, dgettext); +#endif diff --git a/intl/dngettext.c b/intl/dngettext.c new file mode 100644 index 00000000..0afbd2e1 --- /dev/null +++ b/intl/dngettext.c @@ -0,0 +1,61 @@ +/* Implementation of the dngettext(3) function. + Copyright (C) 1995-1997, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DNGETTEXT __dngettext +# define DCNGETTEXT INTUSE(__dcngettext) +#else +# define DNGETTEXT libintl_dngettext +# define DCNGETTEXT libintl_dcngettext +#endif + +/* Look up MSGID in the DOMAINNAME message catalog of the current + LC_MESSAGES locale and skip message according to the plural form. */ +char * +DNGETTEXT (domainname, msgid1, msgid2, n) + const char *domainname; + const char *msgid1; + const char *msgid2; + unsigned long int n; +{ + return DCNGETTEXT (domainname, msgid1, msgid2, n, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__dngettext, dngettext); +#endif diff --git a/intl/eval-plural.h b/intl/eval-plural.h new file mode 100644 index 00000000..19c7ca6a --- /dev/null +++ b/intl/eval-plural.h @@ -0,0 +1,114 @@ +/* Plural expression evaluation. + Copyright (C) 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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 STATIC +#define STATIC static +#endif + +/* Evaluate the plural expression and return an index value. */ +STATIC unsigned long int plural_eval PARAMS ((struct expression *pexp, + unsigned long int n)) + internal_function; + +STATIC +unsigned long int +internal_function +plural_eval (pexp, n) + struct expression *pexp; + unsigned long int n; +{ + switch (pexp->nargs) + { + case 0: + switch (pexp->operation) + { + case var: + return n; + case num: + return pexp->val.num; + default: + break; + } + /* NOTREACHED */ + break; + case 1: + { + /* pexp->operation must be lnot. */ + unsigned long int arg = plural_eval (pexp->val.args[0], n); + return ! arg; + } + case 2: + { + unsigned long int leftarg = plural_eval (pexp->val.args[0], n); + if (pexp->operation == lor) + return leftarg || plural_eval (pexp->val.args[1], n); + else if (pexp->operation == land) + return leftarg && plural_eval (pexp->val.args[1], n); + else + { + unsigned long int rightarg = plural_eval (pexp->val.args[1], n); + + switch (pexp->operation) + { + case mult: + return leftarg * rightarg; + case divide: +#if !INTDIV0_RAISES_SIGFPE + if (rightarg == 0) + raise (SIGFPE); +#endif + return leftarg / rightarg; + case module: +#if !INTDIV0_RAISES_SIGFPE + if (rightarg == 0) + raise (SIGFPE); +#endif + return leftarg % rightarg; + case plus: + return leftarg + rightarg; + case minus: + return leftarg - rightarg; + case less_than: + return leftarg < rightarg; + case greater_than: + return leftarg > rightarg; + case less_or_equal: + return leftarg <= rightarg; + case greater_or_equal: + return leftarg >= rightarg; + case equal: + return leftarg == rightarg; + case not_equal: + return leftarg != rightarg; + default: + break; + } + } + /* NOTREACHED */ + break; + } + case 3: + { + /* pexp->operation must be qmop. */ + unsigned long int boolarg = plural_eval (pexp->val.args[0], n); + return plural_eval (pexp->val.args[boolarg ? 1 : 2], n); + } + } + /* NOTREACHED */ + return 0; +} diff --git a/intl/explodename.c b/intl/explodename.c new file mode 100644 index 00000000..2985064c --- /dev/null +++ b/intl/explodename.c @@ -0,0 +1,192 @@ +/* Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc. + Contributed by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#include "loadinfo.h" + +/* On some strange systems still no definition of NULL is found. Sigh! */ +#ifndef NULL +# if defined __STDC__ && __STDC__ +# define NULL ((void *) 0) +# else +# define NULL 0 +# endif +#endif + +/* @@ end of prolog @@ */ + +char * +_nl_find_language (name) + const char *name; +{ + while (name[0] != '\0' && name[0] != '_' && name[0] != '@' + && name[0] != '+' && name[0] != ',') + ++name; + + return (char *) name; +} + + +int +_nl_explode_name (name, language, modifier, territory, codeset, + normalized_codeset, special, sponsor, revision) + char *name; + const char **language; + const char **modifier; + const char **territory; + const char **codeset; + const char **normalized_codeset; + const char **special; + const char **sponsor; + const char **revision; +{ + enum { undecided, xpg, cen } syntax; + char *cp; + int mask; + + *modifier = NULL; + *territory = NULL; + *codeset = NULL; + *normalized_codeset = NULL; + *special = NULL; + *sponsor = NULL; + *revision = NULL; + + /* Now we determine the single parts of the locale name. First + look for the language. Termination symbols are `_' and `@' if + we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ + mask = 0; + syntax = undecided; + *language = cp = name; + cp = _nl_find_language (*language); + + if (*language == cp) + /* This does not make sense: language has to be specified. Use + this entry as it is without exploding. Perhaps it is an alias. */ + cp = strchr (*language, '\0'); + else if (cp[0] == '_') + { + /* Next is the territory. */ + cp[0] = '\0'; + *territory = ++cp; + + while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@' + && cp[0] != '+' && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= TERRITORY; + + if (cp[0] == '.') + { + /* Next is the codeset. */ + syntax = xpg; + cp[0] = '\0'; + *codeset = ++cp; + + while (cp[0] != '\0' && cp[0] != '@') + ++cp; + + mask |= XPG_CODESET; + + if (*codeset != cp && (*codeset)[0] != '\0') + { + *normalized_codeset = _nl_normalize_codeset (*codeset, + cp - *codeset); + if (strcmp (*codeset, *normalized_codeset) == 0) + free ((char *) *normalized_codeset); + else + mask |= XPG_NORM_CODESET; + } + } + } + + if (cp[0] == '@' || (syntax != xpg && cp[0] == '+')) + { + /* Next is the modifier. */ + syntax = cp[0] == '@' ? xpg : cen; + cp[0] = '\0'; + *modifier = ++cp; + + while (syntax == cen && cp[0] != '\0' && cp[0] != '+' + && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= XPG_MODIFIER | CEN_AUDIENCE; + } + + if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_')) + { + syntax = cen; + + if (cp[0] == '+') + { + /* Next is special application (CEN syntax). */ + cp[0] = '\0'; + *special = ++cp; + + while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= CEN_SPECIAL; + } + + if (cp[0] == ',') + { + /* Next is sponsor (CEN syntax). */ + cp[0] = '\0'; + *sponsor = ++cp; + + while (cp[0] != '\0' && cp[0] != '_') + ++cp; + + mask |= CEN_SPONSOR; + } + + if (cp[0] == '_') + { + /* Next is revision (CEN syntax). */ + cp[0] = '\0'; + *revision = ++cp; + + mask |= CEN_REVISION; + } + } + + /* For CEN syntax values it might be important to have the + separator character in the file name, not for XPG syntax. */ + if (syntax == xpg) + { + if (*territory != NULL && (*territory)[0] == '\0') + mask &= ~TERRITORY; + + if (*codeset != NULL && (*codeset)[0] == '\0') + mask &= ~XPG_CODESET; + + if (*modifier != NULL && (*modifier)[0] == '\0') + mask &= ~XPG_MODIFIER; + } + + return mask; +} diff --git a/intl/finddomain.c b/intl/finddomain.c new file mode 100644 index 00000000..2f103d55 --- /dev/null +++ b/intl/finddomain.c @@ -0,0 +1,198 @@ +/* Handle list of needed message catalogs + Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. + Written by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#if defined HAVE_UNISTD_H || defined _LIBC +# include +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ +/* List of already loaded domains. */ +static struct loaded_l10nfile *_nl_loaded_domains; + + +/* Return a data structure describing the message catalog described by + the DOMAINNAME and CATEGORY parameters with respect to the currently + established bindings. */ +struct loaded_l10nfile * +internal_function +_nl_find_domain (dirname, locale, domainname, domainbinding) + const char *dirname; + char *locale; + const char *domainname; + struct binding *domainbinding; +{ + struct loaded_l10nfile *retval; + const char *language; + const char *modifier; + const char *territory; + const char *codeset; + const char *normalized_codeset; + const char *special; + const char *sponsor; + const char *revision; + const char *alias_value; + int mask; + + /* LOCALE can consist of up to four recognized parts for the XPG syntax: + + language[_territory[.codeset]][@modifier] + + and six parts for the CEN syntax: + + language[_territory][+audience][+special][,[sponsor][_revision]] + + Beside the first part all of them are allowed to be missing. If + the full specified locale is not found, the less specific one are + looked for. The various parts will be stripped off according to + the following order: + (1) revision + (2) sponsor + (3) special + (4) codeset + (5) normalized codeset + (6) territory + (7) audience/modifier + */ + + /* If we have already tested for this locale entry there has to + be one data set in the list of loaded domains. */ + retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, + strlen (dirname) + 1, 0, locale, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, domainname, 0); + if (retval != NULL) + { + /* We know something about this locale. */ + int cnt; + + if (retval->decided == 0) + _nl_load_domain (retval, domainbinding); + + if (retval->data != NULL) + return retval; + + for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) + { + if (retval->successor[cnt]->decided == 0) + _nl_load_domain (retval->successor[cnt], domainbinding); + + if (retval->successor[cnt]->data != NULL) + break; + } + return cnt >= 0 ? retval : NULL; + /* NOTREACHED */ + } + + /* See whether the locale value is an alias. If yes its value + *overwrites* the alias name. No test for the original value is + done. */ + alias_value = _nl_expand_alias (locale); + if (alias_value != NULL) + { +#if defined _LIBC || defined HAVE_STRDUP + locale = strdup (alias_value); + if (locale == NULL) + return NULL; +#else + size_t len = strlen (alias_value) + 1; + locale = (char *) malloc (len); + if (locale == NULL) + return NULL; + + memcpy (locale, alias_value, len); +#endif + } + + /* Now we determine the single parts of the locale name. First + look for the language. Termination symbols are `_' and `@' if + we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ + mask = _nl_explode_name (locale, &language, &modifier, &territory, + &codeset, &normalized_codeset, &special, + &sponsor, &revision); + + /* Create all possible locale entries which might be interested in + generalization. */ + retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, + strlen (dirname) + 1, mask, language, territory, + codeset, normalized_codeset, modifier, special, + sponsor, revision, domainname, 1); + if (retval == NULL) + /* This means we are out of core. */ + return NULL; + + if (retval->decided == 0) + _nl_load_domain (retval, domainbinding); + if (retval->data == NULL) + { + int cnt; + for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) + { + if (retval->successor[cnt]->decided == 0) + _nl_load_domain (retval->successor[cnt], domainbinding); + if (retval->successor[cnt]->data != NULL) + break; + } + } + + /* The room for an alias was dynamically allocated. Free it now. */ + if (alias_value != NULL) + free (locale); + + /* The space for normalized_codeset is dynamically allocated. Free it. */ + if (mask & XPG_NORM_CODESET) + free ((void *) normalized_codeset); + + return retval; +} + + +#ifdef _LIBC +static void __attribute__ ((unused)) +free_mem (void) +{ + struct loaded_l10nfile *runp = _nl_loaded_domains; + + while (runp != NULL) + { + struct loaded_l10nfile *here = runp; + if (runp->data != NULL) + _nl_unload_domain ((struct loaded_domain *) runp->data); + runp = runp->next; + free ((char *) here->filename); + free (here); + } +} + +text_set_element (__libc_subfreeres, free_mem); +#endif diff --git a/intl/gettext.c b/intl/gettext.c new file mode 100644 index 00000000..43d689f5 --- /dev/null +++ b/intl/gettext.c @@ -0,0 +1,64 @@ +/* Implementation of gettext(3) function. + Copyright (C) 1995, 1997, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifdef _LIBC +# define __need_NULL +# include +#else +# include /* Just for NULL. */ +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define GETTEXT __gettext +# define DCGETTEXT INTUSE(__dcgettext) +#else +# define GETTEXT libintl_gettext +# define DCGETTEXT libintl_dcgettext +#endif + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +char * +GETTEXT (msgid) + const char *msgid; +{ + return DCGETTEXT (NULL, msgid, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__gettext, gettext); +#endif diff --git a/intl/gettextP.h b/intl/gettextP.h new file mode 100644 index 00000000..f085c59b --- /dev/null +++ b/intl/gettextP.h @@ -0,0 +1,242 @@ +/* Header describing internals of libintl library. + Copyright (C) 1995-1999, 2000-2002 Free Software Foundation, Inc. + Written by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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 _GETTEXTP_H +#define _GETTEXTP_H + +#include /* Get size_t. */ + +#ifdef _LIBC +# include "../iconv/gconv_int.h" +#else +# if HAVE_ICONV +# include +# endif +#endif + +#include "loadinfo.h" + +#include "gmo.h" /* Get nls_uint32. */ + +/* @@ end of prolog @@ */ + +#ifndef PARAMS +# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +#ifndef internal_function +# define internal_function +#endif + +#ifndef attribute_hidden +# define attribute_hidden +#endif + +/* Tell the compiler when a conditional or integer expression is + almost always true or almost always false. */ +#ifndef HAVE_BUILTIN_EXPECT +# define __builtin_expect(expr, val) (expr) +#endif + +#ifndef W +# define W(flag, data) ((flag) ? SWAP (data) : (data)) +#endif + + +#ifdef _LIBC +# include +# define SWAP(i) bswap_32 (i) +#else +static inline nls_uint32 +SWAP (i) + nls_uint32 i; +{ + return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24); +} +#endif + + +/* In-memory representation of system dependent string. */ +struct sysdep_string_desc +{ + /* Length of addressed string, including the trailing NUL. */ + size_t length; + /* Pointer to addressed string. */ + const char *pointer; +}; + +/* The representation of an opened message catalog. */ +struct loaded_domain +{ + /* Pointer to memory containing the .mo file. */ + const char *data; + /* 1 if the memory is mmap()ed, 0 if the memory is malloc()ed. */ + int use_mmap; + /* Size of mmap()ed memory. */ + size_t mmap_size; + /* 1 if the .mo file uses a different endianness than this machine. */ + int must_swap; + /* Pointer to additional malloc()ed memory. */ + void *malloced; + + /* Number of static strings pairs. */ + nls_uint32 nstrings; + /* Pointer to descriptors of original strings in the file. */ + const struct string_desc *orig_tab; + /* Pointer to descriptors of translated strings in the file. */ + const struct string_desc *trans_tab; + + /* Number of system dependent strings pairs. */ + nls_uint32 n_sysdep_strings; + /* Pointer to descriptors of original sysdep strings. */ + const struct sysdep_string_desc *orig_sysdep_tab; + /* Pointer to descriptors of translated sysdep strings. */ + const struct sysdep_string_desc *trans_sysdep_tab; + + /* Size of hash table. */ + nls_uint32 hash_size; + /* Pointer to hash table. */ + const nls_uint32 *hash_tab; + /* 1 if the hash table uses a different endianness than this machine. */ + int must_swap_hash_tab; + + int codeset_cntr; +#ifdef _LIBC + __gconv_t conv; +#else +# if HAVE_ICONV + iconv_t conv; +# endif +#endif + char **conv_tab; + + struct expression *plural; + unsigned long int nplurals; +}; + +/* We want to allocate a string at the end of the struct. But ISO C + doesn't allow zero sized arrays. */ +#ifdef __GNUC__ +# define ZERO 0 +#else +# define ZERO 1 +#endif + +/* A set of settings bound to a message domain. Used to store settings + from bindtextdomain() and bind_textdomain_codeset(). */ +struct binding +{ + struct binding *next; + char *dirname; + int codeset_cntr; /* Incremented each time codeset changes. */ + char *codeset; + char domainname[ZERO]; +}; + +/* A counter which is incremented each time some previous translations + become invalid. + This variable is part of the external ABI of the GNU libintl. */ +extern int _nl_msg_cat_cntr; + +#ifndef _LIBC +const char *_nl_locale_name PARAMS ((int category, const char *categoryname)); +#endif + +struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname, + char *__locale, + const char *__domainname, + struct binding *__domainbinding)) + internal_function; +void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain, + struct binding *__domainbinding)) + internal_function; +void _nl_unload_domain PARAMS ((struct loaded_domain *__domain)) + internal_function; +const char *_nl_init_domain_conv PARAMS ((struct loaded_l10nfile *__domain_file, + struct loaded_domain *__domain, + struct binding *__domainbinding)) + internal_function; +void _nl_free_domain_conv PARAMS ((struct loaded_domain *__domain)) + internal_function; + +char *_nl_find_msg PARAMS ((struct loaded_l10nfile *domain_file, + struct binding *domainbinding, + const char *msgid, size_t *lengthp)) + internal_function; + +#ifdef _LIBC +extern char *__gettext PARAMS ((const char *__msgid)); +extern char *__dgettext PARAMS ((const char *__domainname, + const char *__msgid)); +extern char *__dcgettext PARAMS ((const char *__domainname, + const char *__msgid, int __category)); +extern char *__ngettext PARAMS ((const char *__msgid1, const char *__msgid2, + unsigned long int __n)); +extern char *__dngettext PARAMS ((const char *__domainname, + const char *__msgid1, const char *__msgid2, + unsigned long int n)); +extern char *__dcngettext PARAMS ((const char *__domainname, + const char *__msgid1, const char *__msgid2, + unsigned long int __n, int __category)); +extern char *__dcigettext PARAMS ((const char *__domainname, + const char *__msgid1, const char *__msgid2, + int __plural, unsigned long int __n, + int __category)); +extern char *__textdomain PARAMS ((const char *__domainname)); +extern char *__bindtextdomain PARAMS ((const char *__domainname, + const char *__dirname)); +extern char *__bind_textdomain_codeset PARAMS ((const char *__domainname, + const char *__codeset)); +#else +extern char *libintl_gettext PARAMS ((const char *__msgid)); +extern char *libintl_dgettext PARAMS ((const char *__domainname, + const char *__msgid)); +extern char *libintl_dcgettext PARAMS ((const char *__domainname, + const char *__msgid, int __category)); +extern char *libintl_ngettext PARAMS ((const char *__msgid1, + const char *__msgid2, + unsigned long int __n)); +extern char *libintl_dngettext PARAMS ((const char *__domainname, + const char *__msgid1, + const char *__msgid2, + unsigned long int __n)); +extern char *libintl_dcngettext PARAMS ((const char *__domainname, + const char *__msgid1, + const char *__msgid2, + unsigned long int __n, + int __category)); +extern char *libintl_dcigettext PARAMS ((const char *__domainname, + const char *__msgid1, + const char *__msgid2, + int __plural, unsigned long int __n, + int __category)); +extern char *libintl_textdomain PARAMS ((const char *__domainname)); +extern char *libintl_bindtextdomain PARAMS ((const char *__domainname, + const char *__dirname)); +extern char *libintl_bind_textdomain_codeset PARAMS ((const char *__domainname, + const char *__codeset)); +#endif + +/* @@ begin of epilog @@ */ + +#endif /* gettextP.h */ diff --git a/intl/gmo.h b/intl/gmo.h new file mode 100644 index 00000000..d1fe4d6b --- /dev/null +++ b/intl/gmo.h @@ -0,0 +1,148 @@ +/* Description of GNU message catalog format: general file layout. + Copyright (C) 1995, 1997, 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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 _GETTEXT_H +#define _GETTEXT_H 1 + +#include + +/* @@ end of prolog @@ */ + +/* The magic number of the GNU message catalog format. */ +#define _MAGIC 0x950412de +#define _MAGIC_SWAPPED 0xde120495 + +/* Revision number of the currently used .mo (binary) file format. */ +#define MO_REVISION_NUMBER 0 + +/* The following contortions are an attempt to use the C preprocessor + to determine an unsigned integral type that is 32 bits wide. An + alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but + as of version autoconf-2.13, the AC_CHECK_SIZEOF macro doesn't work + when cross-compiling. */ + +#if __STDC__ +# define UINT_MAX_32_BITS 4294967295U +#else +# define UINT_MAX_32_BITS 0xFFFFFFFF +#endif + +/* If UINT_MAX isn't defined, assume it's a 32-bit type. + This should be valid for all systems GNU cares about because + that doesn't include 16-bit systems, and only modern systems + (that certainly have ) have 64+-bit integral types. */ + +#ifndef UINT_MAX +# define UINT_MAX UINT_MAX_32_BITS +#endif + +#if UINT_MAX == UINT_MAX_32_BITS +typedef unsigned nls_uint32; +#else +# if USHRT_MAX == UINT_MAX_32_BITS +typedef unsigned short nls_uint32; +# else +# if ULONG_MAX == UINT_MAX_32_BITS +typedef unsigned long nls_uint32; +# else + /* The following line is intended to throw an error. Using #error is + not portable enough. */ + "Cannot determine unsigned 32-bit data type." +# endif +# endif +#endif + + +/* Header for binary .mo file format. */ +struct mo_file_header +{ + /* The magic number. */ + nls_uint32 magic; + /* The revision number of the file format. */ + nls_uint32 revision; + + /* The following are only used in .mo files with major revision 0. */ + + /* The number of strings pairs. */ + nls_uint32 nstrings; + /* Offset of table with start offsets of original strings. */ + nls_uint32 orig_tab_offset; + /* Offset of table with start offsets of translated strings. */ + nls_uint32 trans_tab_offset; + /* Size of hash table. */ + nls_uint32 hash_tab_size; + /* Offset of first hash table entry. */ + nls_uint32 hash_tab_offset; + + /* The following are only used in .mo files with minor revision >= 1. */ + + /* The number of system dependent segments. */ + nls_uint32 n_sysdep_segments; + /* Offset of table describing system dependent segments. */ + nls_uint32 sysdep_segments_offset; + /* The number of system dependent strings pairs. */ + nls_uint32 n_sysdep_strings; + /* Offset of table with start offsets of original sysdep strings. */ + nls_uint32 orig_sysdep_tab_offset; + /* Offset of table with start offsets of translated sysdep strings. */ + nls_uint32 trans_sysdep_tab_offset; +}; + +/* Descriptor for static string contained in the binary .mo file. */ +struct string_desc +{ + /* Length of addressed string, not including the trailing NUL. */ + nls_uint32 length; + /* Offset of string in file. */ + nls_uint32 offset; +}; + +/* The following are only used in .mo files with minor revision >= 1. */ + +/* Descriptor for system dependent string segment. */ +struct sysdep_segment +{ + /* Length of addressed string, including the trailing NUL. */ + nls_uint32 length; + /* Offset of string in file. */ + nls_uint32 offset; +}; + +/* Descriptor for system dependent string. */ +struct sysdep_string +{ + /* Offset of static string segments in file. */ + nls_uint32 offset; + /* Alternating sequence of static and system dependent segments. + The last segment is a static segment, including the trailing NUL. */ + struct segment_pair + { + /* Size of static segment. */ + nls_uint32 segsize; + /* Reference to system dependent string segment, or ~0 at the end. */ + nls_uint32 sysdepref; + } segments[1]; +}; + +/* Marker for the end of the segments[] array. This has the value 0xFFFFFFFF, + regardless whether 'int' is 16 bit, 32 bit, or 64 bit. */ +#define SEGMENTS_END ((nls_uint32) ~0) + +/* @@ begin of epilog @@ */ + +#endif /* gettext.h */ diff --git a/intl/hash-string.h b/intl/hash-string.h new file mode 100644 index 00000000..b267a877 --- /dev/null +++ b/intl/hash-string.h @@ -0,0 +1,59 @@ +/* Description of GNU message catalog format: string hashing function. + Copyright (C) 1995, 1997, 1998, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +/* @@ end of prolog @@ */ + +#ifndef PARAMS +# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES +# define PARAMS(Args) Args +# else +# define PARAMS(Args) () +# endif +#endif + +/* We assume to have `unsigned long int' value with at least 32 bits. */ +#define HASHWORDBITS 32 + + +/* Defines the so called `hashpjw' function by P.J. Weinberger + [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools, + 1986, 1987 Bell Telephone Laboratories, Inc.] */ +static unsigned long int hash_string PARAMS ((const char *__str_param)); + +static inline unsigned long int +hash_string (str_param) + const char *str_param; +{ + unsigned long int hval, g; + const char *str = str_param; + + /* Compute the hash value for the given string. */ + hval = 0; + while (*str != '\0') + { + hval <<= 4; + hval += (unsigned long int) *str++; + g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4)); + if (g != 0) + { + hval ^= g >> (HASHWORDBITS - 8); + hval ^= g; + } + } + return hval; +} diff --git a/intl/intl-compat.c b/intl/intl-compat.c new file mode 100644 index 00000000..da890159 --- /dev/null +++ b/intl/intl-compat.c @@ -0,0 +1,131 @@ +/* intl-compat.c - Stub functions to call gettext functions from GNU gettext + Library. + Copyright (C) 1995, 2000-2002 Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#define _INTL_REDIRECT_MACROS +#include "libgnuintl.h" +#include "gettextP.h" + +/* @@ end of prolog @@ */ + +/* This file redirects the gettext functions (without prefix) to those + defined in the included GNU libintl library (with "libintl_" prefix). + It is compiled into libintl in order to make the AM_GNU_GETTEXT test + of gettext <= 0.11.2 work with the libintl library >= 0.11.3 which + has the redirections primarily in the include file. */ + + +#undef gettext +#undef dgettext +#undef dcgettext +#undef ngettext +#undef dngettext +#undef dcngettext +#undef textdomain +#undef bindtextdomain +#undef bind_textdomain_codeset + + +char * +gettext (msgid) + const char *msgid; +{ + return libintl_gettext (msgid); +} + + +char * +dgettext (domainname, msgid) + const char *domainname; + const char *msgid; +{ + return libintl_dgettext (domainname, msgid); +} + + +char * +dcgettext (domainname, msgid, category) + const char *domainname; + const char *msgid; + int category; +{ + return libintl_dcgettext (domainname, msgid, category); +} + + +char * +ngettext (msgid1, msgid2, n) + const char *msgid1; + const char *msgid2; + unsigned long int n; +{ + return libintl_ngettext (msgid1, msgid2, n); +} + + +char * +dngettext (domainname, msgid1, msgid2, n) + const char *domainname; + const char *msgid1; + const char *msgid2; + unsigned long int n; +{ + return libintl_dngettext (domainname, msgid1, msgid2, n); +} + + +char * +dcngettext (domainname, msgid1, msgid2, n, category) + const char *domainname; + const char *msgid1; + const char *msgid2; + unsigned long int n; + int category; +{ + return libintl_dcngettext (domainname, msgid1, msgid2, n, category); +} + + +char * +textdomain (domainname) + const char *domainname; +{ + return libintl_textdomain (domainname); +} + + +char * +bindtextdomain (domainname, dirname) + const char *domainname; + const char *dirname; +{ + return libintl_bindtextdomain (domainname, dirname); +} + + +char * +bind_textdomain_codeset (domainname, codeset) + const char *domainname; + const char *codeset; +{ + return libintl_bind_textdomain_codeset (domainname, codeset); +} diff --git a/intl/l10nflist.c b/intl/l10nflist.c new file mode 100644 index 00000000..ec8713f8 --- /dev/null +++ b/intl/l10nflist.c @@ -0,0 +1,453 @@ +/* Copyright (C) 1995-1999, 2000, 2001, 2002 Free Software Foundation, Inc. + Contributed by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +/* Tell glibc's to provide a prototype for stpcpy(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#if defined _LIBC || defined HAVE_ARGZ_H +# include +#endif +#include +#include +#include + +#include "loadinfo.h" + +/* On some strange systems still no definition of NULL is found. Sigh! */ +#ifndef NULL +# if defined __STDC__ && __STDC__ +# define NULL ((void *) 0) +# else +# define NULL 0 +# endif +#endif + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# ifndef stpcpy +# define stpcpy(dest, src) __stpcpy(dest, src) +# endif +#else +# ifndef HAVE_STPCPY +static char *stpcpy PARAMS ((char *dest, const char *src)); +# endif +#endif + +/* Pathname support. + ISSLASH(C) tests whether C is a directory separator character. + IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not, + it may be concatenated to a directory pathname. + */ +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +# define HAS_DEVICE(P) \ + ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ + && (P)[1] == ':') +# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P)) +#else + /* Unix */ +# define ISSLASH(C) ((C) == '/') +# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0]) +#endif + +/* Define function which are usually not available. */ + +#if !defined _LIBC && !defined HAVE___ARGZ_COUNT +/* Returns the number of strings in ARGZ. */ +static size_t argz_count__ PARAMS ((const char *argz, size_t len)); + +static size_t +argz_count__ (argz, len) + const char *argz; + size_t len; +{ + size_t count = 0; + while (len > 0) + { + size_t part_len = strlen (argz); + argz += part_len + 1; + len -= part_len + 1; + count++; + } + return count; +} +# undef __argz_count +# define __argz_count(argz, len) argz_count__ (argz, len) +#else +# ifdef _LIBC +# define __argz_count(argz, len) INTUSE(__argz_count) (argz, len) +# endif +#endif /* !_LIBC && !HAVE___ARGZ_COUNT */ + +#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY +/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's + except the last into the character SEP. */ +static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep)); + +static void +argz_stringify__ (argz, len, sep) + char *argz; + size_t len; + int sep; +{ + while (len > 0) + { + size_t part_len = strlen (argz); + argz += part_len; + len -= part_len + 1; + if (len > 0) + *argz++ = sep; + } +} +# undef __argz_stringify +# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep) +#else +# ifdef _LIBC +# define __argz_stringify(argz, len, sep) \ + INTUSE(__argz_stringify) (argz, len, sep) +# endif +#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */ + +#if !defined _LIBC && !defined HAVE___ARGZ_NEXT +static char *argz_next__ PARAMS ((char *argz, size_t argz_len, + const char *entry)); + +static char * +argz_next__ (argz, argz_len, entry) + char *argz; + size_t argz_len; + const char *entry; +{ + if (entry) + { + if (entry < argz + argz_len) + entry = strchr (entry, '\0') + 1; + + return entry >= argz + argz_len ? NULL : (char *) entry; + } + else + if (argz_len > 0) + return argz; + else + return 0; +} +# undef __argz_next +# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry) +#endif /* !_LIBC && !HAVE___ARGZ_NEXT */ + + +/* Return number of bits set in X. */ +static int pop PARAMS ((int x)); + +static inline int +pop (x) + int x; +{ + /* We assume that no more than 16 bits are used. */ + x = ((x & ~0x5555) >> 1) + (x & 0x5555); + x = ((x & ~0x3333) >> 2) + (x & 0x3333); + x = ((x >> 4) + x) & 0x0f0f; + x = ((x >> 8) + x) & 0xff; + + return x; +} + + +struct loaded_l10nfile * +_nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language, + territory, codeset, normalized_codeset, modifier, special, + sponsor, revision, filename, do_allocate) + struct loaded_l10nfile **l10nfile_list; + const char *dirlist; + size_t dirlist_len; + int mask; + const char *language; + const char *territory; + const char *codeset; + const char *normalized_codeset; + const char *modifier; + const char *special; + const char *sponsor; + const char *revision; + const char *filename; + int do_allocate; +{ + char *abs_filename; + struct loaded_l10nfile **lastp; + struct loaded_l10nfile *retval; + char *cp; + size_t dirlist_count; + size_t entries; + int cnt; + + /* If LANGUAGE contains an absolute directory specification, we ignore + DIRLIST. */ + if (IS_ABSOLUTE_PATH (language)) + dirlist_len = 0; + + /* Allocate room for the full file name. */ + abs_filename = (char *) malloc (dirlist_len + + strlen (language) + + ((mask & TERRITORY) != 0 + ? strlen (territory) + 1 : 0) + + ((mask & XPG_CODESET) != 0 + ? strlen (codeset) + 1 : 0) + + ((mask & XPG_NORM_CODESET) != 0 + ? strlen (normalized_codeset) + 1 : 0) + + (((mask & XPG_MODIFIER) != 0 + || (mask & CEN_AUDIENCE) != 0) + ? strlen (modifier) + 1 : 0) + + ((mask & CEN_SPECIAL) != 0 + ? strlen (special) + 1 : 0) + + (((mask & CEN_SPONSOR) != 0 + || (mask & CEN_REVISION) != 0) + ? (1 + ((mask & CEN_SPONSOR) != 0 + ? strlen (sponsor) : 0) + + ((mask & CEN_REVISION) != 0 + ? strlen (revision) + 1 : 0)) : 0) + + 1 + strlen (filename) + 1); + + if (abs_filename == NULL) + return NULL; + + /* Construct file name. */ + cp = abs_filename; + if (dirlist_len > 0) + { + memcpy (cp, dirlist, dirlist_len); + __argz_stringify (cp, dirlist_len, PATH_SEPARATOR); + cp += dirlist_len; + cp[-1] = '/'; + } + + cp = stpcpy (cp, language); + + if ((mask & TERRITORY) != 0) + { + *cp++ = '_'; + cp = stpcpy (cp, territory); + } + if ((mask & XPG_CODESET) != 0) + { + *cp++ = '.'; + cp = stpcpy (cp, codeset); + } + if ((mask & XPG_NORM_CODESET) != 0) + { + *cp++ = '.'; + cp = stpcpy (cp, normalized_codeset); + } + if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0) + { + /* This component can be part of both syntaces but has different + leading characters. For CEN we use `+', else `@'. */ + *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@'; + cp = stpcpy (cp, modifier); + } + if ((mask & CEN_SPECIAL) != 0) + { + *cp++ = '+'; + cp = stpcpy (cp, special); + } + if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0) + { + *cp++ = ','; + if ((mask & CEN_SPONSOR) != 0) + cp = stpcpy (cp, sponsor); + if ((mask & CEN_REVISION) != 0) + { + *cp++ = '_'; + cp = stpcpy (cp, revision); + } + } + + *cp++ = '/'; + stpcpy (cp, filename); + + /* Look in list of already loaded domains whether it is already + available. */ + lastp = l10nfile_list; + for (retval = *l10nfile_list; retval != NULL; retval = retval->next) + if (retval->filename != NULL) + { + int compare = strcmp (retval->filename, abs_filename); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It's not in the list. */ + retval = NULL; + break; + } + + lastp = &retval->next; + } + + if (retval != NULL || do_allocate == 0) + { + free (abs_filename); + return retval; + } + + dirlist_count = (dirlist_len > 0 ? __argz_count (dirlist, dirlist_len) : 1); + + /* Allocate a new loaded_l10nfile. */ + retval = + (struct loaded_l10nfile *) + malloc (sizeof (*retval) + + (((dirlist_count << pop (mask)) + (dirlist_count > 1 ? 1 : 0)) + * sizeof (struct loaded_l10nfile *))); + if (retval == NULL) + return NULL; + + retval->filename = abs_filename; + + /* We set retval->data to NULL here; it is filled in later. + Setting retval->decided to 1 here means that retval does not + correspond to a real file (dirlist_count > 1) or is not worth + looking up (if an unnormalized codeset was specified). */ + retval->decided = (dirlist_count > 1 + || ((mask & XPG_CODESET) != 0 + && (mask & XPG_NORM_CODESET) != 0)); + retval->data = NULL; + + retval->next = *lastp; + *lastp = retval; + + entries = 0; + /* Recurse to fill the inheritance list of RETVAL. + If the DIRLIST is a real list (i.e. DIRLIST_COUNT > 1), the RETVAL + entry does not correspond to a real file; retval->filename contains + colons. In this case we loop across all elements of DIRLIST and + across all bit patterns dominated by MASK. + If the DIRLIST is a single directory or entirely redundant (i.e. + DIRLIST_COUNT == 1), we loop across all bit patterns dominated by + MASK, excluding MASK itself. + In either case, we loop down from MASK to 0. This has the effect + that the extra bits in the locale name are dropped in this order: + first the modifier, then the territory, then the codeset, then the + normalized_codeset. */ + for (cnt = dirlist_count > 1 ? mask : mask - 1; cnt >= 0; --cnt) + if ((cnt & ~mask) == 0 + && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0) + && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0)) + { + if (dirlist_count > 1) + { + /* Iterate over all elements of the DIRLIST. */ + char *dir = NULL; + + while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir)) + != NULL) + retval->successor[entries++] + = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, + cnt, language, territory, codeset, + normalized_codeset, modifier, special, + sponsor, revision, filename, 1); + } + else + retval->successor[entries++] + = _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, + cnt, language, territory, codeset, + normalized_codeset, modifier, special, + sponsor, revision, filename, 1); + } + retval->successor[entries] = NULL; + + return retval; +} + +/* Normalize codeset name. There is no standard for the codeset + names. Normalization allows the user to use any of the common + names. The return value is dynamically allocated and has to be + freed by the caller. */ +const char * +_nl_normalize_codeset (codeset, name_len) + const char *codeset; + size_t name_len; +{ + int len = 0; + int only_digit = 1; + char *retval; + char *wp; + size_t cnt; + + for (cnt = 0; cnt < name_len; ++cnt) + if (isalnum ((unsigned char) codeset[cnt])) + { + ++len; + + if (isalpha ((unsigned char) codeset[cnt])) + only_digit = 0; + } + + retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1); + + if (retval != NULL) + { + if (only_digit) + wp = stpcpy (retval, "iso"); + else + wp = retval; + + for (cnt = 0; cnt < name_len; ++cnt) + if (isalpha ((unsigned char) codeset[cnt])) + *wp++ = tolower ((unsigned char) codeset[cnt]); + else if (isdigit ((unsigned char) codeset[cnt])) + *wp++ = codeset[cnt]; + + *wp = '\0'; + } + + return (const char *) retval; +} + + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (dest, src) + char *dest; + const char *src; +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif diff --git a/intl/libgnuintl.h b/intl/libgnuintl.h new file mode 100644 index 00000000..ed25fe9f --- /dev/null +++ b/intl/libgnuintl.h @@ -0,0 +1,296 @@ +/* Message catalogs for internationalization. + Copyright (C) 1995-1997, 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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 _LIBINTL_H +#define _LIBINTL_H 1 + +#include + +/* The LC_MESSAGES locale category is the category used by the functions + gettext() and dgettext(). It is specified in POSIX, but not in ANSI C. + On systems that don't define it, use an arbitrary value instead. + On Solaris, defines __LOCALE_H (or _LOCALE_H in Solaris 2.5) + then includes (i.e. this file!) and then only defines + LC_MESSAGES. To avoid a redefinition warning, don't define LC_MESSAGES + in this case. */ +#if !defined LC_MESSAGES && !(defined __LOCALE_H || (defined _LOCALE_H && defined __sun)) +# define LC_MESSAGES 1729 +#endif + +/* We define an additional symbol to signal that we use the GNU + implementation of gettext. */ +#define __USE_GNU_GETTEXT 1 + +/* Provide information about the supported file formats. Returns the + maximum minor revision number supported for a given major revision. */ +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) \ + ((major) == 0 ? 1 : -1) + +/* Resolve a platform specific conflict on DJGPP. GNU gettext takes + precedence over _conio_gettext. */ +#ifdef __DJGPP__ +# undef gettext +#endif + +/* Use _INTL_PARAMS, not PARAMS, in order to avoid clashes with identifiers + used by programs. Similarly, test __PROTOTYPES, not PROTOTYPES. */ +#ifndef _INTL_PARAMS +# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES +# define _INTL_PARAMS(args) args +# else +# define _INTL_PARAMS(args) () +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + +/* We redirect the functions to those prefixed with "libintl_". This is + necessary, because some systems define gettext/textdomain/... in the C + library (namely, Solaris 2.4 and newer, and GNU libc 2.0 and newer). + If we used the unprefixed names, there would be cases where the + definition in the C library would override the one in the libintl.so + shared library. Recall that on ELF systems, the symbols are looked + up in the following order: + 1. in the executable, + 2. in the shared libraries specified on the link command line, in order, + 3. in the dependencies of the shared libraries specified on the link + command line, + 4. in the dlopen()ed shared libraries, in the order in which they were + dlopen()ed. + The definition in the C library would override the one in libintl.so if + either + * -lc is given on the link command line and -lintl isn't, or + * -lc is given on the link command line before -lintl, or + * libintl.so is a dependency of a dlopen()ed shared library but not + linked to the executable at link time. + Since Solaris gettext() behaves differently than GNU gettext(), this + would be unacceptable. + + The redirection happens by default through macros in C, so that &gettext + is independent of the compilation unit, but through inline functions in + C++, in order not to interfere with the name mangling of class fields or + class methods called 'gettext'. */ + +/* The user can define _INTL_REDIRECT_INLINE or _INTL_REDIRECT_MACROS. + If he doesn't, we choose the method. A third possible method is + _INTL_REDIRECT_ASM, supported only by GCC. */ +#if !(defined _INTL_REDIRECT_INLINE || defined _INTL_REDIRECT_MACROS) +# if __GNUC__ >= 2 && (defined __STDC__ || defined __cplusplus) +# define _INTL_REDIRECT_ASM +# else +# ifdef __cplusplus +# define _INTL_REDIRECT_INLINE +# else +# define _INTL_REDIRECT_MACROS +# endif +# endif +#endif +/* Auxiliary macros. */ +#ifdef _INTL_REDIRECT_ASM +# define _INTL_ASM(cname) __asm__ (_INTL_ASMNAME (__USER_LABEL_PREFIX__, #cname)) +# define _INTL_ASMNAME(prefix,cnamestring) _INTL_STRINGIFY (prefix) cnamestring +# define _INTL_STRINGIFY(prefix) #prefix +#else +# define _INTL_ASM(cname) +#endif + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_gettext (const char *__msgid); +static inline char *gettext (const char *__msgid) +{ + return libintl_gettext (__msgid); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define gettext libintl_gettext +#endif +extern char *gettext _INTL_PARAMS ((const char *__msgid)) + _INTL_ASM (libintl_gettext); +#endif + +/* Look up MSGID in the DOMAINNAME message catalog for the current + LC_MESSAGES locale. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_dgettext (const char *__domainname, const char *__msgid); +static inline char *dgettext (const char *__domainname, const char *__msgid) +{ + return libintl_dgettext (__domainname, __msgid); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define dgettext libintl_dgettext +#endif +extern char *dgettext _INTL_PARAMS ((const char *__domainname, + const char *__msgid)) + _INTL_ASM (libintl_dgettext); +#endif + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_dcgettext (const char *__domainname, const char *__msgid, + int __category); +static inline char *dcgettext (const char *__domainname, const char *__msgid, + int __category) +{ + return libintl_dcgettext (__domainname, __msgid, __category); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define dcgettext libintl_dcgettext +#endif +extern char *dcgettext _INTL_PARAMS ((const char *__domainname, + const char *__msgid, + int __category)) + _INTL_ASM (libintl_dcgettext); +#endif + + +/* Similar to `gettext' but select the plural form corresponding to the + number N. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_ngettext (const char *__msgid1, const char *__msgid2, + unsigned long int __n); +static inline char *ngettext (const char *__msgid1, const char *__msgid2, + unsigned long int __n) +{ + return libintl_ngettext (__msgid1, __msgid2, __n); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define ngettext libintl_ngettext +#endif +extern char *ngettext _INTL_PARAMS ((const char *__msgid1, + const char *__msgid2, + unsigned long int __n)) + _INTL_ASM (libintl_ngettext); +#endif + +/* Similar to `dgettext' but select the plural form corresponding to the + number N. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_dngettext (const char *__domainname, const char *__msgid1, + const char *__msgid2, unsigned long int __n); +static inline char *dngettext (const char *__domainname, const char *__msgid1, + const char *__msgid2, unsigned long int __n) +{ + return libintl_dngettext (__domainname, __msgid1, __msgid2, __n); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define dngettext libintl_dngettext +#endif +extern char *dngettext _INTL_PARAMS ((const char *__domainname, + const char *__msgid1, + const char *__msgid2, + unsigned long int __n)) + _INTL_ASM (libintl_dngettext); +#endif + +/* Similar to `dcgettext' but select the plural form corresponding to the + number N. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_dcngettext (const char *__domainname, + const char *__msgid1, const char *__msgid2, + unsigned long int __n, int __category); +static inline char *dcngettext (const char *__domainname, + const char *__msgid1, const char *__msgid2, + unsigned long int __n, int __category) +{ + return libintl_dcngettext (__domainname, __msgid1, __msgid2, __n, __category); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define dcngettext libintl_dcngettext +#endif +extern char *dcngettext _INTL_PARAMS ((const char *__domainname, + const char *__msgid1, + const char *__msgid2, + unsigned long int __n, + int __category)) + _INTL_ASM (libintl_dcngettext); +#endif + + +/* Set the current default message catalog to DOMAINNAME. + If DOMAINNAME is null, return the current default. + If DOMAINNAME is "", reset to the default of "messages". */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_textdomain (const char *__domainname); +static inline char *textdomain (const char *__domainname) +{ + return libintl_textdomain (__domainname); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define textdomain libintl_textdomain +#endif +extern char *textdomain _INTL_PARAMS ((const char *__domainname)) + _INTL_ASM (libintl_textdomain); +#endif + +/* Specify that the DOMAINNAME message catalog will be found + in DIRNAME rather than in the system locale data base. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_bindtextdomain (const char *__domainname, + const char *__dirname); +static inline char *bindtextdomain (const char *__domainname, + const char *__dirname) +{ + return libintl_bindtextdomain (__domainname, __dirname); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define bindtextdomain libintl_bindtextdomain +#endif +extern char *bindtextdomain _INTL_PARAMS ((const char *__domainname, + const char *__dirname)) + _INTL_ASM (libintl_bindtextdomain); +#endif + +/* Specify the character encoding in which the messages from the + DOMAINNAME message catalog will be returned. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_bind_textdomain_codeset (const char *__domainname, + const char *__codeset); +static inline char *bind_textdomain_codeset (const char *__domainname, + const char *__codeset) +{ + return libintl_bind_textdomain_codeset (__domainname, __codeset); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define bind_textdomain_codeset libintl_bind_textdomain_codeset +#endif +extern char *bind_textdomain_codeset _INTL_PARAMS ((const char *__domainname, + const char *__codeset)) + _INTL_ASM (libintl_bind_textdomain_codeset); +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* libintl.h */ diff --git a/intl/loadinfo.h b/intl/loadinfo.h new file mode 100644 index 00000000..1d3ba616 --- /dev/null +++ b/intl/loadinfo.h @@ -0,0 +1,156 @@ +/* Copyright (C) 1996-1999, 2000-2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1996. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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 _LOADINFO_H +#define _LOADINFO_H 1 + +/* Declarations of locale dependent catalog lookup functions. + Implemented in + + localealias.c Possibly replace a locale name by another. + explodename.c Split a locale name into its various fields. + l10nflist.c Generate a list of filenames of possible message catalogs. + finddomain.c Find and open the relevant message catalogs. + + The main function _nl_find_domain() in finddomain.c is declared + in gettextP.h. + */ + +#ifndef PARAMS +# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +#ifndef internal_function +# define internal_function +#endif + +/* Tell the compiler when a conditional or integer expression is + almost always true or almost always false. */ +#ifndef HAVE_BUILTIN_EXPECT +# define __builtin_expect(expr, val) (expr) +#endif + +/* Separator in PATH like lists of pathnames. */ +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define PATH_SEPARATOR ';' +#else + /* Unix */ +# define PATH_SEPARATOR ':' +#endif + +/* Encoding of locale name parts. */ +#define CEN_REVISION 1 +#define CEN_SPONSOR 2 +#define CEN_SPECIAL 4 +#define XPG_NORM_CODESET 8 +#define XPG_CODESET 16 +#define TERRITORY 32 +#define CEN_AUDIENCE 64 +#define XPG_MODIFIER 128 + +#define CEN_SPECIFIC (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE) +#define XPG_SPECIFIC (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER) + + +struct loaded_l10nfile +{ + const char *filename; + int decided; + + const void *data; + + struct loaded_l10nfile *next; + struct loaded_l10nfile *successor[1]; +}; + + +/* Normalize codeset name. There is no standard for the codeset + names. Normalization allows the user to use any of the common + names. The return value is dynamically allocated and has to be + freed by the caller. */ +extern const char *_nl_normalize_codeset PARAMS ((const char *codeset, + size_t name_len)); + +/* Lookup a locale dependent file. + *L10NFILE_LIST denotes a pool of lookup results of locale dependent + files of the same kind, sorted in decreasing order of ->filename. + DIRLIST and DIRLIST_LEN are an argz list of directories in which to + look, containing at least one directory (i.e. DIRLIST_LEN > 0). + MASK, LANGUAGE, TERRITORY, CODESET, NORMALIZED_CODESET, MODIFIER, + SPECIAL, SPONSOR, REVISION are the pieces of the locale name, as + produced by _nl_explode_name(). FILENAME is the filename suffix. + The return value is the lookup result, either found in *L10NFILE_LIST, + or - if DO_ALLOCATE is nonzero - freshly allocated, or possibly NULL. + If the return value is non-NULL, it is added to *L10NFILE_LIST, and + its ->next field denotes the chaining inside *L10NFILE_LIST, and + furthermore its ->successor[] field contains a list of other lookup + results from which this lookup result inherits. */ +extern struct loaded_l10nfile * +_nl_make_l10nflist PARAMS ((struct loaded_l10nfile **l10nfile_list, + const char *dirlist, size_t dirlist_len, int mask, + const char *language, const char *territory, + const char *codeset, + const char *normalized_codeset, + const char *modifier, const char *special, + const char *sponsor, const char *revision, + const char *filename, int do_allocate)); + +/* Lookup the real locale name for a locale alias NAME, or NULL if + NAME is not a locale alias (but possibly a real locale name). + The return value is statically allocated and must not be freed. */ +extern const char *_nl_expand_alias PARAMS ((const char *name)); + +/* Split a locale name NAME into its pieces: language, modifier, + territory, codeset, special, sponsor, revision. + NAME gets destructively modified: NUL bytes are inserted here and + there. *LANGUAGE gets assigned NAME. Each of *MODIFIER, *TERRITORY, + *CODESET, *SPECIAL, *SPONSOR, *REVISION gets assigned either a + pointer into the old NAME string, or NULL. *NORMALIZED_CODESET + gets assigned the expanded *CODESET, if it is different from *CODESET; + this one is dynamically allocated and has to be freed by the caller. + The return value is a bitmask, where each bit corresponds to one + filled-in value: + XPG_MODIFIER, CEN_AUDIENCE for *MODIFIER, + TERRITORY for *TERRITORY, + XPG_CODESET for *CODESET, + XPG_NORM_CODESET for *NORMALIZED_CODESET, + CEN_SPECIAL for *SPECIAL, + CEN_SPONSOR for *SPONSOR, + CEN_REVISION for *REVISION. + */ +extern int _nl_explode_name PARAMS ((char *name, const char **language, + const char **modifier, + const char **territory, + const char **codeset, + const char **normalized_codeset, + const char **special, + const char **sponsor, + const char **revision)); + +/* Split a locale name NAME into a leading language part and all the + rest. Return a pointer to the first character after the language, + i.e. to the first byte of the rest. */ +extern char *_nl_find_language PARAMS ((const char *name)); + +#endif /* loadinfo.h */ diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c new file mode 100644 index 00000000..516f5211 --- /dev/null +++ b/intl/loadmsgcat.c @@ -0,0 +1,1316 @@ +/* Load needed message catalogs. + Copyright (C) 1995-1999, 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +/* Tell glibc's to provide a prototype for mempcpy(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include + +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +#endif + +#include +#include + +#if defined HAVE_UNISTD_H || defined _LIBC +# include +#endif + +#ifdef _LIBC +# include +# include +#endif + +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || (defined _LIBC && defined _POSIX_MAPPED_FILES) +# include +# undef HAVE_MMAP +# define HAVE_MMAP 1 +#else +# undef HAVE_MMAP +#endif + +#if defined HAVE_STDINT_H_WITH_UINTMAX || defined _LIBC +# include +#endif +#if defined HAVE_INTTYPES_H || defined _LIBC +# include +#endif + +#include "gmo.h" +#include "gettextP.h" +#include "hash-string.h" +#include "plural-exp.h" + +#ifdef _LIBC +# include "../locale/localeinfo.h" +#endif + +/* Provide fallback values for macros that ought to be defined in . + Note that our fallback values need not be literal strings, because we don't + use them with preprocessor string concatenation. */ +#if !defined PRId8 || PRI_MACROS_BROKEN +# undef PRId8 +# define PRId8 "d" +#endif +#if !defined PRIi8 || PRI_MACROS_BROKEN +# undef PRIi8 +# define PRIi8 "i" +#endif +#if !defined PRIo8 || PRI_MACROS_BROKEN +# undef PRIo8 +# define PRIo8 "o" +#endif +#if !defined PRIu8 || PRI_MACROS_BROKEN +# undef PRIu8 +# define PRIu8 "u" +#endif +#if !defined PRIx8 || PRI_MACROS_BROKEN +# undef PRIx8 +# define PRIx8 "x" +#endif +#if !defined PRIX8 || PRI_MACROS_BROKEN +# undef PRIX8 +# define PRIX8 "X" +#endif +#if !defined PRId16 || PRI_MACROS_BROKEN +# undef PRId16 +# define PRId16 "d" +#endif +#if !defined PRIi16 || PRI_MACROS_BROKEN +# undef PRIi16 +# define PRIi16 "i" +#endif +#if !defined PRIo16 || PRI_MACROS_BROKEN +# undef PRIo16 +# define PRIo16 "o" +#endif +#if !defined PRIu16 || PRI_MACROS_BROKEN +# undef PRIu16 +# define PRIu16 "u" +#endif +#if !defined PRIx16 || PRI_MACROS_BROKEN +# undef PRIx16 +# define PRIx16 "x" +#endif +#if !defined PRIX16 || PRI_MACROS_BROKEN +# undef PRIX16 +# define PRIX16 "X" +#endif +#if !defined PRId32 || PRI_MACROS_BROKEN +# undef PRId32 +# define PRId32 "d" +#endif +#if !defined PRIi32 || PRI_MACROS_BROKEN +# undef PRIi32 +# define PRIi32 "i" +#endif +#if !defined PRIo32 || PRI_MACROS_BROKEN +# undef PRIo32 +# define PRIo32 "o" +#endif +#if !defined PRIu32 || PRI_MACROS_BROKEN +# undef PRIu32 +# define PRIu32 "u" +#endif +#if !defined PRIx32 || PRI_MACROS_BROKEN +# undef PRIx32 +# define PRIx32 "x" +#endif +#if !defined PRIX32 || PRI_MACROS_BROKEN +# undef PRIX32 +# define PRIX32 "X" +#endif +#if !defined PRId64 || PRI_MACROS_BROKEN +# undef PRId64 +# define PRId64 (sizeof (long) == 8 ? "ld" : "lld") +#endif +#if !defined PRIi64 || PRI_MACROS_BROKEN +# undef PRIi64 +# define PRIi64 (sizeof (long) == 8 ? "li" : "lli") +#endif +#if !defined PRIo64 || PRI_MACROS_BROKEN +# undef PRIo64 +# define PRIo64 (sizeof (long) == 8 ? "lo" : "llo") +#endif +#if !defined PRIu64 || PRI_MACROS_BROKEN +# undef PRIu64 +# define PRIu64 (sizeof (long) == 8 ? "lu" : "llu") +#endif +#if !defined PRIx64 || PRI_MACROS_BROKEN +# undef PRIx64 +# define PRIx64 (sizeof (long) == 8 ? "lx" : "llx") +#endif +#if !defined PRIX64 || PRI_MACROS_BROKEN +# undef PRIX64 +# define PRIX64 (sizeof (long) == 8 ? "lX" : "llX") +#endif +#if !defined PRIdLEAST8 || PRI_MACROS_BROKEN +# undef PRIdLEAST8 +# define PRIdLEAST8 "d" +#endif +#if !defined PRIiLEAST8 || PRI_MACROS_BROKEN +# undef PRIiLEAST8 +# define PRIiLEAST8 "i" +#endif +#if !defined PRIoLEAST8 || PRI_MACROS_BROKEN +# undef PRIoLEAST8 +# define PRIoLEAST8 "o" +#endif +#if !defined PRIuLEAST8 || PRI_MACROS_BROKEN +# undef PRIuLEAST8 +# define PRIuLEAST8 "u" +#endif +#if !defined PRIxLEAST8 || PRI_MACROS_BROKEN +# undef PRIxLEAST8 +# define PRIxLEAST8 "x" +#endif +#if !defined PRIXLEAST8 || PRI_MACROS_BROKEN +# undef PRIXLEAST8 +# define PRIXLEAST8 "X" +#endif +#if !defined PRIdLEAST16 || PRI_MACROS_BROKEN +# undef PRIdLEAST16 +# define PRIdLEAST16 "d" +#endif +#if !defined PRIiLEAST16 || PRI_MACROS_BROKEN +# undef PRIiLEAST16 +# define PRIiLEAST16 "i" +#endif +#if !defined PRIoLEAST16 || PRI_MACROS_BROKEN +# undef PRIoLEAST16 +# define PRIoLEAST16 "o" +#endif +#if !defined PRIuLEAST16 || PRI_MACROS_BROKEN +# undef PRIuLEAST16 +# define PRIuLEAST16 "u" +#endif +#if !defined PRIxLEAST16 || PRI_MACROS_BROKEN +# undef PRIxLEAST16 +# define PRIxLEAST16 "x" +#endif +#if !defined PRIXLEAST16 || PRI_MACROS_BROKEN +# undef PRIXLEAST16 +# define PRIXLEAST16 "X" +#endif +#if !defined PRIdLEAST32 || PRI_MACROS_BROKEN +# undef PRIdLEAST32 +# define PRIdLEAST32 "d" +#endif +#if !defined PRIiLEAST32 || PRI_MACROS_BROKEN +# undef PRIiLEAST32 +# define PRIiLEAST32 "i" +#endif +#if !defined PRIoLEAST32 || PRI_MACROS_BROKEN +# undef PRIoLEAST32 +# define PRIoLEAST32 "o" +#endif +#if !defined PRIuLEAST32 || PRI_MACROS_BROKEN +# undef PRIuLEAST32 +# define PRIuLEAST32 "u" +#endif +#if !defined PRIxLEAST32 || PRI_MACROS_BROKEN +# undef PRIxLEAST32 +# define PRIxLEAST32 "x" +#endif +#if !defined PRIXLEAST32 || PRI_MACROS_BROKEN +# undef PRIXLEAST32 +# define PRIXLEAST32 "X" +#endif +#if !defined PRIdLEAST64 || PRI_MACROS_BROKEN +# undef PRIdLEAST64 +# define PRIdLEAST64 PRId64 +#endif +#if !defined PRIiLEAST64 || PRI_MACROS_BROKEN +# undef PRIiLEAST64 +# define PRIiLEAST64 PRIi64 +#endif +#if !defined PRIoLEAST64 || PRI_MACROS_BROKEN +# undef PRIoLEAST64 +# define PRIoLEAST64 PRIo64 +#endif +#if !defined PRIuLEAST64 || PRI_MACROS_BROKEN +# undef PRIuLEAST64 +# define PRIuLEAST64 PRIu64 +#endif +#if !defined PRIxLEAST64 || PRI_MACROS_BROKEN +# undef PRIxLEAST64 +# define PRIxLEAST64 PRIx64 +#endif +#if !defined PRIXLEAST64 || PRI_MACROS_BROKEN +# undef PRIXLEAST64 +# define PRIXLEAST64 PRIX64 +#endif +#if !defined PRIdFAST8 || PRI_MACROS_BROKEN +# undef PRIdFAST8 +# define PRIdFAST8 "d" +#endif +#if !defined PRIiFAST8 || PRI_MACROS_BROKEN +# undef PRIiFAST8 +# define PRIiFAST8 "i" +#endif +#if !defined PRIoFAST8 || PRI_MACROS_BROKEN +# undef PRIoFAST8 +# define PRIoFAST8 "o" +#endif +#if !defined PRIuFAST8 || PRI_MACROS_BROKEN +# undef PRIuFAST8 +# define PRIuFAST8 "u" +#endif +#if !defined PRIxFAST8 || PRI_MACROS_BROKEN +# undef PRIxFAST8 +# define PRIxFAST8 "x" +#endif +#if !defined PRIXFAST8 || PRI_MACROS_BROKEN +# undef PRIXFAST8 +# define PRIXFAST8 "X" +#endif +#if !defined PRIdFAST16 || PRI_MACROS_BROKEN +# undef PRIdFAST16 +# define PRIdFAST16 "d" +#endif +#if !defined PRIiFAST16 || PRI_MACROS_BROKEN +# undef PRIiFAST16 +# define PRIiFAST16 "i" +#endif +#if !defined PRIoFAST16 || PRI_MACROS_BROKEN +# undef PRIoFAST16 +# define PRIoFAST16 "o" +#endif +#if !defined PRIuFAST16 || PRI_MACROS_BROKEN +# undef PRIuFAST16 +# define PRIuFAST16 "u" +#endif +#if !defined PRIxFAST16 || PRI_MACROS_BROKEN +# undef PRIxFAST16 +# define PRIxFAST16 "x" +#endif +#if !defined PRIXFAST16 || PRI_MACROS_BROKEN +# undef PRIXFAST16 +# define PRIXFAST16 "X" +#endif +#if !defined PRIdFAST32 || PRI_MACROS_BROKEN +# undef PRIdFAST32 +# define PRIdFAST32 "d" +#endif +#if !defined PRIiFAST32 || PRI_MACROS_BROKEN +# undef PRIiFAST32 +# define PRIiFAST32 "i" +#endif +#if !defined PRIoFAST32 || PRI_MACROS_BROKEN +# undef PRIoFAST32 +# define PRIoFAST32 "o" +#endif +#if !defined PRIuFAST32 || PRI_MACROS_BROKEN +# undef PRIuFAST32 +# define PRIuFAST32 "u" +#endif +#if !defined PRIxFAST32 || PRI_MACROS_BROKEN +# undef PRIxFAST32 +# define PRIxFAST32 "x" +#endif +#if !defined PRIXFAST32 || PRI_MACROS_BROKEN +# undef PRIXFAST32 +# define PRIXFAST32 "X" +#endif +#if !defined PRIdFAST64 || PRI_MACROS_BROKEN +# undef PRIdFAST64 +# define PRIdFAST64 PRId64 +#endif +#if !defined PRIiFAST64 || PRI_MACROS_BROKEN +# undef PRIiFAST64 +# define PRIiFAST64 PRIi64 +#endif +#if !defined PRIoFAST64 || PRI_MACROS_BROKEN +# undef PRIoFAST64 +# define PRIoFAST64 PRIo64 +#endif +#if !defined PRIuFAST64 || PRI_MACROS_BROKEN +# undef PRIuFAST64 +# define PRIuFAST64 PRIu64 +#endif +#if !defined PRIxFAST64 || PRI_MACROS_BROKEN +# undef PRIxFAST64 +# define PRIxFAST64 PRIx64 +#endif +#if !defined PRIXFAST64 || PRI_MACROS_BROKEN +# undef PRIXFAST64 +# define PRIXFAST64 PRIX64 +#endif +#if !defined PRIdMAX || PRI_MACROS_BROKEN +# undef PRIdMAX +# define PRIdMAX (sizeof (uintmax_t) == sizeof (long) ? "ld" : "lld") +#endif +#if !defined PRIiMAX || PRI_MACROS_BROKEN +# undef PRIiMAX +# define PRIiMAX (sizeof (uintmax_t) == sizeof (long) ? "li" : "lli") +#endif +#if !defined PRIoMAX || PRI_MACROS_BROKEN +# undef PRIoMAX +# define PRIoMAX (sizeof (uintmax_t) == sizeof (long) ? "lo" : "llo") +#endif +#if !defined PRIuMAX || PRI_MACROS_BROKEN +# undef PRIuMAX +# define PRIuMAX (sizeof (uintmax_t) == sizeof (long) ? "lu" : "llu") +#endif +#if !defined PRIxMAX || PRI_MACROS_BROKEN +# undef PRIxMAX +# define PRIxMAX (sizeof (uintmax_t) == sizeof (long) ? "lx" : "llx") +#endif +#if !defined PRIXMAX || PRI_MACROS_BROKEN +# undef PRIXMAX +# define PRIXMAX (sizeof (uintmax_t) == sizeof (long) ? "lX" : "llX") +#endif +#if !defined PRIdPTR || PRI_MACROS_BROKEN +# undef PRIdPTR +# define PRIdPTR \ + (sizeof (void *) == sizeof (long) ? "ld" : \ + sizeof (void *) == sizeof (int) ? "d" : \ + "lld") +#endif +#if !defined PRIiPTR || PRI_MACROS_BROKEN +# undef PRIiPTR +# define PRIiPTR \ + (sizeof (void *) == sizeof (long) ? "li" : \ + sizeof (void *) == sizeof (int) ? "i" : \ + "lli") +#endif +#if !defined PRIoPTR || PRI_MACROS_BROKEN +# undef PRIoPTR +# define PRIoPTR \ + (sizeof (void *) == sizeof (long) ? "lo" : \ + sizeof (void *) == sizeof (int) ? "o" : \ + "llo") +#endif +#if !defined PRIuPTR || PRI_MACROS_BROKEN +# undef PRIuPTR +# define PRIuPTR \ + (sizeof (void *) == sizeof (long) ? "lu" : \ + sizeof (void *) == sizeof (int) ? "u" : \ + "llu") +#endif +#if !defined PRIxPTR || PRI_MACROS_BROKEN +# undef PRIxPTR +# define PRIxPTR \ + (sizeof (void *) == sizeof (long) ? "lx" : \ + sizeof (void *) == sizeof (int) ? "x" : \ + "llx") +#endif +#if !defined PRIXPTR || PRI_MACROS_BROKEN +# undef PRIXPTR +# define PRIXPTR \ + (sizeof (void *) == sizeof (long) ? "lX" : \ + sizeof (void *) == sizeof (int) ? "X" : \ + "llX") +#endif + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ISO C functions. This is required by the standard + because some ISO C functions will require linking with this object + file and the name space must not be polluted. */ +# define open __open +# define close __close +# define read __read +# define mmap __mmap +# define munmap __munmap +#endif + +/* For those losing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +# define freea(p) /* nothing */ +#else +# define alloca(n) malloc (n) +# define freea(p) free (p) +#endif + +/* For systems that distinguish between text and binary I/O. + O_BINARY is usually declared in . */ +#if !defined O_BINARY && defined _O_BINARY + /* For MSC-compatible compilers. */ +# define O_BINARY _O_BINARY +# define O_TEXT _O_TEXT +#endif +#ifdef __BEOS__ + /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect. */ +# undef O_BINARY +# undef O_TEXT +#endif +/* On reasonable systems, binary I/O is the default. */ +#ifndef O_BINARY +# define O_BINARY 0 +#endif + + +/* Prototypes for local functions. Needed to ensure compiler checking of + function argument counts despite of K&R C function definition syntax. */ +static const char *get_sysdep_segment_value PARAMS ((const char *name)); + + +/* We need a sign, whether a new catalog was loaded, which can be associated + with all translations. This is important if the translations are + cached by one of GCC's features. */ +int _nl_msg_cat_cntr; + + +/* Expand a system dependent string segment. Return NULL if unsupported. */ +static const char * +get_sysdep_segment_value (name) + const char *name; +{ + /* Test for an ISO C 99 section 7.8.1 format string directive. + Syntax: + P R I { d | i | o | u | x | X } + { { | LEAST | FAST } { 8 | 16 | 32 | 64 } | MAX | PTR } */ + /* We don't use a table of 14 times 6 'const char *' strings here, because + data relocations cost startup time. */ + if (name[0] == 'P' && name[1] == 'R' && name[2] == 'I') + { + if (name[3] == 'd' || name[3] == 'i' || name[3] == 'o' || name[3] == 'u' + || name[3] == 'x' || name[3] == 'X') + { + if (name[4] == '8' && name[5] == '\0') + { + if (name[3] == 'd') + return PRId8; + if (name[3] == 'i') + return PRIi8; + if (name[3] == 'o') + return PRIo8; + if (name[3] == 'u') + return PRIu8; + if (name[3] == 'x') + return PRIx8; + if (name[3] == 'X') + return PRIX8; + abort (); + } + if (name[4] == '1' && name[5] == '6' && name[6] == '\0') + { + if (name[3] == 'd') + return PRId16; + if (name[3] == 'i') + return PRIi16; + if (name[3] == 'o') + return PRIo16; + if (name[3] == 'u') + return PRIu16; + if (name[3] == 'x') + return PRIx16; + if (name[3] == 'X') + return PRIX16; + abort (); + } + if (name[4] == '3' && name[5] == '2' && name[6] == '\0') + { + if (name[3] == 'd') + return PRId32; + if (name[3] == 'i') + return PRIi32; + if (name[3] == 'o') + return PRIo32; + if (name[3] == 'u') + return PRIu32; + if (name[3] == 'x') + return PRIx32; + if (name[3] == 'X') + return PRIX32; + abort (); + } + if (name[4] == '6' && name[5] == '4' && name[6] == '\0') + { + if (name[3] == 'd') + return PRId64; + if (name[3] == 'i') + return PRIi64; + if (name[3] == 'o') + return PRIo64; + if (name[3] == 'u') + return PRIu64; + if (name[3] == 'x') + return PRIx64; + if (name[3] == 'X') + return PRIX64; + abort (); + } + if (name[4] == 'L' && name[5] == 'E' && name[6] == 'A' + && name[7] == 'S' && name[8] == 'T') + { + if (name[9] == '8' && name[10] == '\0') + { + if (name[3] == 'd') + return PRIdLEAST8; + if (name[3] == 'i') + return PRIiLEAST8; + if (name[3] == 'o') + return PRIoLEAST8; + if (name[3] == 'u') + return PRIuLEAST8; + if (name[3] == 'x') + return PRIxLEAST8; + if (name[3] == 'X') + return PRIXLEAST8; + abort (); + } + if (name[9] == '1' && name[10] == '6' && name[11] == '\0') + { + if (name[3] == 'd') + return PRIdLEAST16; + if (name[3] == 'i') + return PRIiLEAST16; + if (name[3] == 'o') + return PRIoLEAST16; + if (name[3] == 'u') + return PRIuLEAST16; + if (name[3] == 'x') + return PRIxLEAST16; + if (name[3] == 'X') + return PRIXLEAST16; + abort (); + } + if (name[9] == '3' && name[10] == '2' && name[11] == '\0') + { + if (name[3] == 'd') + return PRIdLEAST32; + if (name[3] == 'i') + return PRIiLEAST32; + if (name[3] == 'o') + return PRIoLEAST32; + if (name[3] == 'u') + return PRIuLEAST32; + if (name[3] == 'x') + return PRIxLEAST32; + if (name[3] == 'X') + return PRIXLEAST32; + abort (); + } + if (name[9] == '6' && name[10] == '4' && name[11] == '\0') + { + if (name[3] == 'd') + return PRIdLEAST64; + if (name[3] == 'i') + return PRIiLEAST64; + if (name[3] == 'o') + return PRIoLEAST64; + if (name[3] == 'u') + return PRIuLEAST64; + if (name[3] == 'x') + return PRIxLEAST64; + if (name[3] == 'X') + return PRIXLEAST64; + abort (); + } + } + if (name[4] == 'F' && name[5] == 'A' && name[6] == 'S' + && name[7] == 'T') + { + if (name[8] == '8' && name[9] == '\0') + { + if (name[3] == 'd') + return PRIdFAST8; + if (name[3] == 'i') + return PRIiFAST8; + if (name[3] == 'o') + return PRIoFAST8; + if (name[3] == 'u') + return PRIuFAST8; + if (name[3] == 'x') + return PRIxFAST8; + if (name[3] == 'X') + return PRIXFAST8; + abort (); + } + if (name[8] == '1' && name[9] == '6' && name[10] == '\0') + { + if (name[3] == 'd') + return PRIdFAST16; + if (name[3] == 'i') + return PRIiFAST16; + if (name[3] == 'o') + return PRIoFAST16; + if (name[3] == 'u') + return PRIuFAST16; + if (name[3] == 'x') + return PRIxFAST16; + if (name[3] == 'X') + return PRIXFAST16; + abort (); + } + if (name[8] == '3' && name[9] == '2' && name[10] == '\0') + { + if (name[3] == 'd') + return PRIdFAST32; + if (name[3] == 'i') + return PRIiFAST32; + if (name[3] == 'o') + return PRIoFAST32; + if (name[3] == 'u') + return PRIuFAST32; + if (name[3] == 'x') + return PRIxFAST32; + if (name[3] == 'X') + return PRIXFAST32; + abort (); + } + if (name[8] == '6' && name[9] == '4' && name[10] == '\0') + { + if (name[3] == 'd') + return PRIdFAST64; + if (name[3] == 'i') + return PRIiFAST64; + if (name[3] == 'o') + return PRIoFAST64; + if (name[3] == 'u') + return PRIuFAST64; + if (name[3] == 'x') + return PRIxFAST64; + if (name[3] == 'X') + return PRIXFAST64; + abort (); + } + } + if (name[4] == 'M' && name[5] == 'A' && name[6] == 'X' + && name[7] == '\0') + { + if (name[3] == 'd') + return PRIdMAX; + if (name[3] == 'i') + return PRIiMAX; + if (name[3] == 'o') + return PRIoMAX; + if (name[3] == 'u') + return PRIuMAX; + if (name[3] == 'x') + return PRIxMAX; + if (name[3] == 'X') + return PRIXMAX; + abort (); + } + if (name[4] == 'P' && name[5] == 'T' && name[6] == 'R' + && name[7] == '\0') + { + if (name[3] == 'd') + return PRIdPTR; + if (name[3] == 'i') + return PRIiPTR; + if (name[3] == 'o') + return PRIoPTR; + if (name[3] == 'u') + return PRIuPTR; + if (name[3] == 'x') + return PRIxPTR; + if (name[3] == 'X') + return PRIXPTR; + abort (); + } + } + } + /* Other system dependent strings are not valid. */ + return NULL; +} + +/* Initialize the codeset dependent parts of an opened message catalog. + Return the header entry. */ +const char * +internal_function +_nl_init_domain_conv (domain_file, domain, domainbinding) + struct loaded_l10nfile *domain_file; + struct loaded_domain *domain; + struct binding *domainbinding; +{ + /* Find out about the character set the file is encoded with. + This can be found (in textual form) in the entry "". If this + entry does not exist or if this does not contain the `charset=' + information, we will assume the charset matches the one the + current locale and we don't have to perform any conversion. */ + char *nullentry; + size_t nullentrylen; + + /* Preinitialize fields, to avoid recursion during _nl_find_msg. */ + domain->codeset_cntr = + (domainbinding != NULL ? domainbinding->codeset_cntr : 0); +#ifdef _LIBC + domain->conv = (__gconv_t) -1; +#else +# if HAVE_ICONV + domain->conv = (iconv_t) -1; +# endif +#endif + domain->conv_tab = NULL; + + /* Get the header entry. */ + nullentry = _nl_find_msg (domain_file, domainbinding, "", &nullentrylen); + + if (nullentry != NULL) + { +#if defined _LIBC || HAVE_ICONV + const char *charsetstr; + + charsetstr = strstr (nullentry, "charset="); + if (charsetstr != NULL) + { + size_t len; + char *charset; + const char *outcharset; + + charsetstr += strlen ("charset="); + len = strcspn (charsetstr, " \t\n"); + + charset = (char *) alloca (len + 1); +# if defined _LIBC || HAVE_MEMPCPY + *((char *) mempcpy (charset, charsetstr, len)) = '\0'; +# else + memcpy (charset, charsetstr, len); + charset[len] = '\0'; +# endif + + /* The output charset should normally be determined by the + locale. But sometimes the locale is not used or not correctly + set up, so we provide a possibility for the user to override + this. Moreover, the value specified through + bind_textdomain_codeset overrides both. */ + if (domainbinding != NULL && domainbinding->codeset != NULL) + outcharset = domainbinding->codeset; + else + { + outcharset = getenv ("OUTPUT_CHARSET"); + if (outcharset == NULL || outcharset[0] == '\0') + { +# ifdef _LIBC + outcharset = (*_nl_current[LC_CTYPE])->values[_NL_ITEM_INDEX (CODESET)].string; +# else +# if HAVE_ICONV + extern const char *locale_charset PARAMS ((void)); + outcharset = locale_charset (); +# endif +# endif + } + } + +# ifdef _LIBC + /* We always want to use transliteration. */ + outcharset = norm_add_slashes (outcharset, "TRANSLIT"); + charset = norm_add_slashes (charset, NULL); + if (__gconv_open (outcharset, charset, &domain->conv, + GCONV_AVOID_NOCONV) + != __GCONV_OK) + domain->conv = (__gconv_t) -1; +# else +# if HAVE_ICONV + /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5, + we want to use transliteration. */ +# if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 \ + || _LIBICONV_VERSION >= 0x0105 + if (strchr (outcharset, '/') == NULL) + { + char *tmp; + + len = strlen (outcharset); + tmp = (char *) alloca (len + 10 + 1); + memcpy (tmp, outcharset, len); + memcpy (tmp + len, "//TRANSLIT", 10 + 1); + outcharset = tmp; + + domain->conv = iconv_open (outcharset, charset); + + freea (outcharset); + } + else +# endif + domain->conv = iconv_open (outcharset, charset); +# endif +# endif + + freea (charset); + } +#endif /* _LIBC || HAVE_ICONV */ + } + + return nullentry; +} + +/* Frees the codeset dependent parts of an opened message catalog. */ +void +internal_function +_nl_free_domain_conv (domain) + struct loaded_domain *domain; +{ + if (domain->conv_tab != NULL && domain->conv_tab != (char **) -1) + free (domain->conv_tab); + +#ifdef _LIBC + if (domain->conv != (__gconv_t) -1) + __gconv_close (domain->conv); +#else +# if HAVE_ICONV + if (domain->conv != (iconv_t) -1) + iconv_close (domain->conv); +# endif +#endif +} + +/* Load the message catalogs specified by FILENAME. If it is no valid + message catalog do nothing. */ +void +internal_function +_nl_load_domain (domain_file, domainbinding) + struct loaded_l10nfile *domain_file; + struct binding *domainbinding; +{ + int fd; + size_t size; +#ifdef _LIBC + struct stat64 st; +#else + struct stat st; +#endif + struct mo_file_header *data = (struct mo_file_header *) -1; + int use_mmap = 0; + struct loaded_domain *domain; + int revision; + const char *nullentry; + + domain_file->decided = 1; + domain_file->data = NULL; + + /* Note that it would be useless to store domainbinding in domain_file + because domainbinding might be == NULL now but != NULL later (after + a call to bind_textdomain_codeset). */ + + /* If the record does not represent a valid locale the FILENAME + might be NULL. This can happen when according to the given + specification the locale file name is different for XPG and CEN + syntax. */ + if (domain_file->filename == NULL) + return; + + /* Try to open the addressed file. */ + fd = open (domain_file->filename, O_RDONLY | O_BINARY); + if (fd == -1) + return; + + /* We must know about the size of the file. */ + if ( +#ifdef _LIBC + __builtin_expect (fstat64 (fd, &st) != 0, 0) +#else + __builtin_expect (fstat (fd, &st) != 0, 0) +#endif + || __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0) + || __builtin_expect (size < sizeof (struct mo_file_header), 0)) + { + /* Something went wrong. */ + close (fd); + return; + } + +#ifdef HAVE_MMAP + /* Now we are ready to load the file. If mmap() is available we try + this first. If not available or it failed we try to load it. */ + data = (struct mo_file_header *) mmap (NULL, size, PROT_READ, + MAP_PRIVATE, fd, 0); + + if (__builtin_expect (data != (struct mo_file_header *) -1, 1)) + { + /* mmap() call was successful. */ + close (fd); + use_mmap = 1; + } +#endif + + /* If the data is not yet available (i.e. mmap'ed) we try to load + it manually. */ + if (data == (struct mo_file_header *) -1) + { + size_t to_read; + char *read_ptr; + + data = (struct mo_file_header *) malloc (size); + if (data == NULL) + return; + + to_read = size; + read_ptr = (char *) data; + do + { + long int nb = (long int) read (fd, read_ptr, to_read); + if (nb <= 0) + { +#ifdef EINTR + if (nb == -1 && errno == EINTR) + continue; +#endif + close (fd); + return; + } + read_ptr += nb; + to_read -= nb; + } + while (to_read > 0); + + close (fd); + } + + /* Using the magic number we can test whether it really is a message + catalog file. */ + if (__builtin_expect (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED, + 0)) + { + /* The magic number is wrong: not a message catalog file. */ +#ifdef HAVE_MMAP + if (use_mmap) + munmap ((caddr_t) data, size); + else +#endif + free (data); + return; + } + + domain = (struct loaded_domain *) malloc (sizeof (struct loaded_domain)); + if (domain == NULL) + return; + domain_file->data = domain; + + domain->data = (char *) data; + domain->use_mmap = use_mmap; + domain->mmap_size = size; + domain->must_swap = data->magic != _MAGIC; + domain->malloced = NULL; + + /* Fill in the information about the available tables. */ + revision = W (domain->must_swap, data->revision); + /* We support only the major revision 0. */ + switch (revision >> 16) + { + case 0: + domain->nstrings = W (domain->must_swap, data->nstrings); + domain->orig_tab = (const struct string_desc *) + ((char *) data + W (domain->must_swap, data->orig_tab_offset)); + domain->trans_tab = (const struct string_desc *) + ((char *) data + W (domain->must_swap, data->trans_tab_offset)); + domain->hash_size = W (domain->must_swap, data->hash_tab_size); + domain->hash_tab = + (domain->hash_size > 2 + ? (const nls_uint32 *) + ((char *) data + W (domain->must_swap, data->hash_tab_offset)) + : NULL); + domain->must_swap_hash_tab = domain->must_swap; + + /* Now dispatch on the minor revision. */ + switch (revision & 0xffff) + { + case 0: + domain->n_sysdep_strings = 0; + domain->orig_sysdep_tab = NULL; + domain->trans_sysdep_tab = NULL; + break; + case 1: + default: + { + nls_uint32 n_sysdep_strings; + + if (domain->hash_tab == NULL) + /* This is invalid. These minor revisions need a hash table. */ + goto invalid; + + n_sysdep_strings = + W (domain->must_swap, data->n_sysdep_strings); + if (n_sysdep_strings > 0) + { + nls_uint32 n_sysdep_segments; + const struct sysdep_segment *sysdep_segments; + const char **sysdep_segment_values; + const nls_uint32 *orig_sysdep_tab; + const nls_uint32 *trans_sysdep_tab; + size_t memneed; + char *mem; + struct sysdep_string_desc *inmem_orig_sysdep_tab; + struct sysdep_string_desc *inmem_trans_sysdep_tab; + nls_uint32 *inmem_hash_tab; + unsigned int i; + + /* Get the values of the system dependent segments. */ + n_sysdep_segments = + W (domain->must_swap, data->n_sysdep_segments); + sysdep_segments = (const struct sysdep_segment *) + ((char *) data + + W (domain->must_swap, data->sysdep_segments_offset)); + sysdep_segment_values = + alloca (n_sysdep_segments * sizeof (const char *)); + for (i = 0; i < n_sysdep_segments; i++) + { + const char *name = + (char *) data + + W (domain->must_swap, sysdep_segments[i].offset); + nls_uint32 namelen = + W (domain->must_swap, sysdep_segments[i].length); + + if (!(namelen > 0 && name[namelen - 1] == '\0')) + { + freea (sysdep_segment_values); + goto invalid; + } + + sysdep_segment_values[i] = get_sysdep_segment_value (name); + } + + orig_sysdep_tab = (const nls_uint32 *) + ((char *) data + + W (domain->must_swap, data->orig_sysdep_tab_offset)); + trans_sysdep_tab = (const nls_uint32 *) + ((char *) data + + W (domain->must_swap, data->trans_sysdep_tab_offset)); + + /* Compute the amount of additional memory needed for the + system dependent strings and the augmented hash table. */ + memneed = 2 * n_sysdep_strings + * sizeof (struct sysdep_string_desc) + + domain->hash_size * sizeof (nls_uint32); + for (i = 0; i < 2 * n_sysdep_strings; i++) + { + const struct sysdep_string *sysdep_string = + (const struct sysdep_string *) + ((char *) data + + W (domain->must_swap, + i < n_sysdep_strings + ? orig_sysdep_tab[i] + : trans_sysdep_tab[i - n_sysdep_strings])); + size_t need = 0; + const struct segment_pair *p = sysdep_string->segments; + + if (W (domain->must_swap, p->sysdepref) != SEGMENTS_END) + for (p = sysdep_string->segments;; p++) + { + nls_uint32 sysdepref; + + need += W (domain->must_swap, p->segsize); + + sysdepref = W (domain->must_swap, p->sysdepref); + if (sysdepref == SEGMENTS_END) + break; + + if (sysdepref >= n_sysdep_segments) + { + /* Invalid. */ + freea (sysdep_segment_values); + goto invalid; + } + + need += strlen (sysdep_segment_values[sysdepref]); + } + + memneed += need; + } + + /* Allocate additional memory. */ + mem = (char *) malloc (memneed); + if (mem == NULL) + goto invalid; + + domain->malloced = mem; + inmem_orig_sysdep_tab = (struct sysdep_string_desc *) mem; + mem += n_sysdep_strings * sizeof (struct sysdep_string_desc); + inmem_trans_sysdep_tab = (struct sysdep_string_desc *) mem; + mem += n_sysdep_strings * sizeof (struct sysdep_string_desc); + inmem_hash_tab = (nls_uint32 *) mem; + mem += domain->hash_size * sizeof (nls_uint32); + + /* Compute the system dependent strings. */ + for (i = 0; i < 2 * n_sysdep_strings; i++) + { + const struct sysdep_string *sysdep_string = + (const struct sysdep_string *) + ((char *) data + + W (domain->must_swap, + i < n_sysdep_strings + ? orig_sysdep_tab[i] + : trans_sysdep_tab[i - n_sysdep_strings])); + const char *static_segments = + (char *) data + + W (domain->must_swap, sysdep_string->offset); + const struct segment_pair *p = sysdep_string->segments; + + /* Concatenate the segments, and fill + inmem_orig_sysdep_tab[i] (for i < n_sysdep_strings) and + inmem_trans_sysdep_tab[i-n_sysdep_strings] (for + i >= n_sysdep_strings). */ + + if (W (domain->must_swap, p->sysdepref) == SEGMENTS_END) + { + /* Only one static segment. */ + inmem_orig_sysdep_tab[i].length = + W (domain->must_swap, p->segsize); + inmem_orig_sysdep_tab[i].pointer = static_segments; + } + else + { + inmem_orig_sysdep_tab[i].pointer = mem; + + for (p = sysdep_string->segments;; p++) + { + nls_uint32 segsize = + W (domain->must_swap, p->segsize); + nls_uint32 sysdepref = + W (domain->must_swap, p->sysdepref); + size_t n; + + if (segsize > 0) + { + memcpy (mem, static_segments, segsize); + mem += segsize; + static_segments += segsize; + } + + if (sysdepref == SEGMENTS_END) + break; + + n = strlen (sysdep_segment_values[sysdepref]); + memcpy (mem, sysdep_segment_values[sysdepref], n); + mem += n; + } + + inmem_orig_sysdep_tab[i].length = + mem - inmem_orig_sysdep_tab[i].pointer; + } + } + + /* Compute the augmented hash table. */ + for (i = 0; i < domain->hash_size; i++) + inmem_hash_tab[i] = + W (domain->must_swap_hash_tab, domain->hash_tab[i]); + for (i = 0; i < n_sysdep_strings; i++) + { + const char *msgid = inmem_orig_sysdep_tab[i].pointer; + nls_uint32 hash_val = hash_string (msgid); + nls_uint32 idx = hash_val % domain->hash_size; + nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2)); + + for (;;) + { + if (inmem_hash_tab[idx] == 0) + { + /* Hash table entry is empty. Use it. */ + inmem_hash_tab[idx] = 1 + domain->nstrings + i; + break; + } + + if (idx >= domain->hash_size - incr) + idx -= domain->hash_size - incr; + else + idx += incr; + } + } + + freea (sysdep_segment_values); + + domain->n_sysdep_strings = n_sysdep_strings; + domain->orig_sysdep_tab = inmem_orig_sysdep_tab; + domain->trans_sysdep_tab = inmem_trans_sysdep_tab; + + domain->hash_tab = inmem_hash_tab; + domain->must_swap_hash_tab = 0; + } + else + { + domain->n_sysdep_strings = 0; + domain->orig_sysdep_tab = NULL; + domain->trans_sysdep_tab = NULL; + } + } + break; + } + break; + default: + /* This is an invalid revision. */ + invalid: + /* This is an invalid .mo file. */ + if (domain->malloced) + free (domain->malloced); +#ifdef HAVE_MMAP + if (use_mmap) + munmap ((caddr_t) data, size); + else +#endif + free (data); + free (domain); + domain_file->data = NULL; + return; + } + + /* Now initialize the character set converter from the character set + the file is encoded with (found in the header entry) to the domain's + specified character set or the locale's character set. */ + nullentry = _nl_init_domain_conv (domain_file, domain, domainbinding); + + /* Also look for a plural specification. */ + EXTRACT_PLURAL_EXPRESSION (nullentry, &domain->plural, &domain->nplurals); +} + + +#ifdef _LIBC +void +internal_function +_nl_unload_domain (domain) + struct loaded_domain *domain; +{ + if (domain->plural != &__gettext_germanic_plural) + __gettext_free_exp (domain->plural); + + _nl_free_domain_conv (domain); + + if (domain->malloced) + free (domain->malloced); + +# ifdef _POSIX_MAPPED_FILES + if (domain->use_mmap) + munmap ((caddr_t) domain->data, domain->mmap_size); + else +# endif /* _POSIX_MAPPED_FILES */ + free ((void *) domain->data); + + free (domain); +} +#endif diff --git a/intl/localcharset.c b/intl/localcharset.c new file mode 100644 index 00000000..2b1564e2 --- /dev/null +++ b/intl/localcharset.c @@ -0,0 +1,369 @@ +/* Determine a canonical name for the current locale's character encoding. + + Copyright (C) 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +/* Written by Bruno Haible . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#if HAVE_STDDEF_H +# include +#endif + +#include +#if HAVE_STRING_H +# include +#else +# include +#endif +#if HAVE_STDLIB_H +# include +#endif + +#if defined _WIN32 || defined __WIN32__ +# undef WIN32 /* avoid warning on mingw32 */ +# define WIN32 +#endif + +#if defined __EMX__ +/* Assume EMX program runs on OS/2, even if compiled under DOS. */ +# define OS2 +#endif + +#if !defined WIN32 +# if HAVE_LANGINFO_CODESET +# include +# else +# if HAVE_SETLOCALE +# include +# endif +# endif +#elif defined WIN32 +# define WIN32_LEAN_AND_MEAN +# include +#endif +#if defined OS2 +# define INCL_DOS +# include +#endif + +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +#endif + +#ifndef DIRECTORY_SEPARATOR +# define DIRECTORY_SEPARATOR '/' +#endif + +#ifndef ISSLASH +# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) +#endif + +#ifdef HAVE_GETC_UNLOCKED +# undef getc +# define getc getc_unlocked +#endif + +#ifdef __cplusplus +/* When compiling with "gcc -x c++", produce a function with C linkage. */ +extern "C" const char * locale_charset (void); +#endif + +/* The following static variable is declared 'volatile' to avoid a + possible multithread problem in the function get_charset_aliases. If we + are running in a threaded environment, and if two threads initialize + 'charset_aliases' simultaneously, both will produce the same value, + and everything will be ok if the two assignments to 'charset_aliases' + are atomic. But I don't know what will happen if the two assignments mix. */ +#if __STDC__ != 1 +# define volatile /* empty */ +#endif +/* Pointer to the contents of the charset.alias file, if it has already been + read, else NULL. Its format is: + ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */ +static const char * volatile charset_aliases; + +/* Return a pointer to the contents of the charset.alias file. */ +static const char * +get_charset_aliases () +{ + const char *cp; + + cp = charset_aliases; + if (cp == NULL) + { +#if !defined WIN32 + FILE *fp; + const char *dir = LIBDIR; + const char *base = "charset.alias"; + char *file_name; + + /* Concatenate dir and base into freshly allocated file_name. */ + { + size_t dir_len = strlen (dir); + size_t base_len = strlen (base); + int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); + file_name = (char *) malloc (dir_len + add_slash + base_len + 1); + if (file_name != NULL) + { + memcpy (file_name, dir, dir_len); + if (add_slash) + file_name[dir_len] = DIRECTORY_SEPARATOR; + memcpy (file_name + dir_len + add_slash, base, base_len + 1); + } + } + + if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL) + /* Out of memory or file not found, treat it as empty. */ + cp = ""; + else + { + /* Parse the file's contents. */ + int c; + char buf1[50+1]; + char buf2[50+1]; + char *res_ptr = NULL; + size_t res_size = 0; + size_t l1, l2; + + for (;;) + { + c = getc (fp); + if (c == EOF) + break; + if (c == '\n' || c == ' ' || c == '\t') + continue; + if (c == '#') + { + /* Skip comment, to end of line. */ + do + c = getc (fp); + while (!(c == EOF || c == '\n')); + if (c == EOF) + break; + continue; + } + ungetc (c, fp); + if (fscanf (fp, "%50s %50s", buf1, buf2) < 2) + break; + l1 = strlen (buf1); + l2 = strlen (buf2); + if (res_size == 0) + { + res_size = l1 + 1 + l2 + 1; + res_ptr = (char *) malloc (res_size + 1); + } + else + { + res_size += l1 + 1 + l2 + 1; + res_ptr = (char *) realloc (res_ptr, res_size + 1); + } + if (res_ptr == NULL) + { + /* Out of memory. */ + res_size = 0; + break; + } + strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); + strcpy (res_ptr + res_size - (l2 + 1), buf2); + } + fclose (fp); + if (res_size == 0) + cp = ""; + else + { + *(res_ptr + res_size) = '\0'; + cp = res_ptr; + } + } + + if (file_name != NULL) + free (file_name); + +#else + + /* To avoid the troubles of installing a separate file in the same + directory as the DLL and of retrieving the DLL's directory at + runtime, simply inline the aliases here. */ + +# if defined WIN32 + cp = "CP936" "\0" "GBK" "\0" + "CP1361" "\0" "JOHAB" "\0" + "CP20127" "\0" "ASCII" "\0" + "CP20866" "\0" "KOI8-R" "\0" + "CP21866" "\0" "KOI8-RU" "\0" + "CP28591" "\0" "ISO-8859-1" "\0" + "CP28592" "\0" "ISO-8859-2" "\0" + "CP28593" "\0" "ISO-8859-3" "\0" + "CP28594" "\0" "ISO-8859-4" "\0" + "CP28595" "\0" "ISO-8859-5" "\0" + "CP28596" "\0" "ISO-8859-6" "\0" + "CP28597" "\0" "ISO-8859-7" "\0" + "CP28598" "\0" "ISO-8859-8" "\0" + "CP28599" "\0" "ISO-8859-9" "\0" + "CP28605" "\0" "ISO-8859-15" "\0"; +# endif +#endif + + charset_aliases = cp; + } + + return cp; +} + +/* Determine the current locale's character encoding, and canonicalize it + into one of the canonical names listed in config.charset. + The result must not be freed; it is statically allocated. + If the canonical name cannot be determined, the result is a non-canonical + name. */ + +#ifdef STATIC +STATIC +#endif +const char * +locale_charset () +{ + const char *codeset; + const char *aliases; + +#if !(defined WIN32 || defined OS2) + +# if HAVE_LANGINFO_CODESET + + /* Most systems support nl_langinfo (CODESET) nowadays. */ + codeset = nl_langinfo (CODESET); + +# else + + /* On old systems which lack it, use setlocale or getenv. */ + const char *locale = NULL; + + /* But most old systems don't have a complete set of locales. Some + (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't + use setlocale here; it would return "C" when it doesn't support the + locale name the user has set. */ +# if HAVE_SETLOCALE && 0 + locale = setlocale (LC_CTYPE, NULL); +# endif + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + } + + /* On some old systems, one used to set locale = "iso8859_1". On others, + you set it to "language_COUNTRY.charset". In any case, we resolve it + through the charset.alias file. */ + codeset = locale; + +# endif + +#elif defined WIN32 + + static char buf[2 + 10 + 1]; + + /* Woe32 has a function returning the locale's codepage as a number. */ + sprintf (buf, "CP%u", GetACP ()); + codeset = buf; + +#elif defined OS2 + + const char *locale; + static char buf[2 + 10 + 1]; + ULONG cp[3]; + ULONG cplen; + + /* Allow user to override the codeset, as set in the operating system, + with standard language environment variables. */ + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + if (locale != NULL && locale[0] != '\0') + { + /* If the locale name contains an encoding after the dot, return it. */ + const char *dot = strchr (locale, '.'); + + if (dot != NULL) + { + const char *modifier; + + dot++; + /* Look for the possible @... trailer and remove it, if any. */ + modifier = strchr (dot, '@'); + if (modifier == NULL) + return dot; + if (modifier - dot < sizeof (buf)) + { + memcpy (buf, dot, modifier - dot); + buf [modifier - dot] = '\0'; + return buf; + } + } + + /* Resolve through the charset.alias file. */ + codeset = locale; + } + else + { + /* OS/2 has a function returning the locale's codepage as a number. */ + if (DosQueryCp (sizeof (cp), cp, &cplen)) + codeset = ""; + else + { + sprintf (buf, "CP%u", cp[0]); + codeset = buf; + } + } + +#endif + + if (codeset == NULL) + /* The canonical name cannot be determined. */ + codeset = ""; + + /* Resolve alias. */ + for (aliases = get_charset_aliases (); + *aliases != '\0'; + aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) + if (strcmp (codeset, aliases) == 0 + || (aliases[0] == '*' && aliases[1] == '\0')) + { + codeset = aliases + strlen (aliases) + 1; + break; + } + + /* Don't return an empty string. GNU libc and GNU libiconv interpret + the empty string as denoting "the locale's character encoding", + thus GNU libiconv would call this function a second time. */ + if (codeset[0] == '\0') + codeset = "ASCII"; + + return codeset; +} diff --git a/intl/locale.alias b/intl/locale.alias new file mode 100644 index 00000000..bd7b9b31 --- /dev/null +++ b/intl/locale.alias @@ -0,0 +1,78 @@ +# Locale name alias data base. +# Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library 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. + +# The format of this file is the same as for the corresponding file of +# the X Window System, which normally can be found in +# /usr/lib/X11/locale/locale.alias +# A single line contains two fields: an alias and a substitution value. +# All entries are case independent. + +# Note: This file is far from being complete. If you have a value for +# your own site which you think might be useful for others too, share +# it with the rest of us. Send it using the `glibcbug' script to +# bugs@gnu.org. + +# Packages using this file: + +bokmal no_NO.ISO-8859-1 +bokmål no_NO.ISO-8859-1 +catalan ca_ES.ISO-8859-1 +croatian hr_HR.ISO-8859-2 +czech cs_CZ.ISO-8859-2 +danish da_DK.ISO-8859-1 +dansk da_DK.ISO-8859-1 +deutsch de_DE.ISO-8859-1 +dutch nl_NL.ISO-8859-1 +eesti et_EE.ISO-8859-1 +estonian et_EE.ISO-8859-1 +finnish fi_FI.ISO-8859-1 +français fr_FR.ISO-8859-1 +french fr_FR.ISO-8859-1 +galego gl_ES.ISO-8859-1 +galician gl_ES.ISO-8859-1 +german de_DE.ISO-8859-1 +greek el_GR.ISO-8859-7 +hebrew he_IL.ISO-8859-8 +hrvatski hr_HR.ISO-8859-2 +hungarian hu_HU.ISO-8859-2 +icelandic is_IS.ISO-8859-1 +italian it_IT.ISO-8859-1 +japanese ja_JP.eucJP +japanese.euc ja_JP.eucJP +ja_JP ja_JP.eucJP +ja_JP.ujis ja_JP.eucJP +japanese.sjis ja_JP.SJIS +korean ko_KR.eucKR +korean.euc ko_KR.eucKR +ko_KR ko_KR.eucKR +lithuanian lt_LT.ISO-8859-13 +nb_NO no_NO.ISO-8859-1 +nb_NO.ISO-8859-1 no_NO.ISO-8859-1 +norwegian no_NO.ISO-8859-1 +nynorsk nn_NO.ISO-8859-1 +polish pl_PL.ISO-8859-2 +portuguese pt_PT.ISO-8859-1 +romanian ro_RO.ISO-8859-2 +russian ru_RU.ISO-8859-5 +slovak sk_SK.ISO-8859-2 +slovene sl_SI.ISO-8859-2 +slovenian sl_SI.ISO-8859-2 +spanish es_ES.ISO-8859-1 +swedish sv_SE.ISO-8859-1 +thai th_TH.TIS-620 +turkish tr_TR.ISO-8859-9 diff --git a/intl/localealias.c b/intl/localealias.c new file mode 100644 index 00000000..456e41e3 --- /dev/null +++ b/intl/localealias.c @@ -0,0 +1,419 @@ +/* Handle aliases for locale names. + Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +/* Tell glibc's to provide a prototype for mempcpy(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#if defined _LIBC || defined HAVE___FSETLOCKING +# include +#endif +#include + +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +#endif + +#include +#include + +#include "gettextP.h" + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# define strcasecmp __strcasecmp + +# ifndef mempcpy +# define mempcpy __mempcpy +# endif +# define HAVE_MEMPCPY 1 +# define HAVE___FSETLOCKING 1 + +/* We need locking here since we can be called from different places. */ +# include + +__libc_lock_define_initialized (static, lock); +#endif + +#ifndef internal_function +# define internal_function +#endif + +/* Some optimizations for glibc. */ +#ifdef _LIBC +# define FEOF(fp) feof_unlocked (fp) +# define FGETS(buf, n, fp) fgets_unlocked (buf, n, fp) +#else +# define FEOF(fp) feof (fp) +# define FGETS(buf, n, fp) fgets (buf, n, fp) +#endif + +/* For those losing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +# define freea(p) /* nothing */ +#else +# define alloca(n) malloc (n) +# define freea(p) free (p) +#endif + +#if defined _LIBC_REENTRANT || defined HAVE_FGETS_UNLOCKED +# undef fgets +# define fgets(buf, len, s) fgets_unlocked (buf, len, s) +#endif +#if defined _LIBC_REENTRANT || defined HAVE_FEOF_UNLOCKED +# undef feof +# define feof(s) feof_unlocked (s) +#endif + + +struct alias_map +{ + const char *alias; + const char *value; +}; + + +static char *string_space; +static size_t string_space_act; +static size_t string_space_max; +static struct alias_map *map; +static size_t nmap; +static size_t maxmap; + + +/* Prototypes for local functions. */ +static size_t read_alias_file PARAMS ((const char *fname, int fname_len)) + internal_function; +static int extend_alias_table PARAMS ((void)); +static int alias_compare PARAMS ((const struct alias_map *map1, + const struct alias_map *map2)); + + +const char * +_nl_expand_alias (name) + const char *name; +{ + static const char *locale_alias_path; + struct alias_map *retval; + const char *result = NULL; + size_t added; + +#ifdef _LIBC + __libc_lock_lock (lock); +#endif + + if (locale_alias_path == NULL) + locale_alias_path = LOCALE_ALIAS_PATH; + + do + { + struct alias_map item; + + item.alias = name; + + if (nmap > 0) + retval = (struct alias_map *) bsearch (&item, map, nmap, + sizeof (struct alias_map), + (int (*) PARAMS ((const void *, + const void *)) + ) alias_compare); + else + retval = NULL; + + /* We really found an alias. Return the value. */ + if (retval != NULL) + { + result = retval->value; + break; + } + + /* Perhaps we can find another alias file. */ + added = 0; + while (added == 0 && locale_alias_path[0] != '\0') + { + const char *start; + + while (locale_alias_path[0] == PATH_SEPARATOR) + ++locale_alias_path; + start = locale_alias_path; + + while (locale_alias_path[0] != '\0' + && locale_alias_path[0] != PATH_SEPARATOR) + ++locale_alias_path; + + if (start < locale_alias_path) + added = read_alias_file (start, locale_alias_path - start); + } + } + while (added != 0); + +#ifdef _LIBC + __libc_lock_unlock (lock); +#endif + + return result; +} + + +static size_t +internal_function +read_alias_file (fname, fname_len) + const char *fname; + int fname_len; +{ + FILE *fp; + char *full_fname; + size_t added; + static const char aliasfile[] = "/locale.alias"; + + full_fname = (char *) alloca (fname_len + sizeof aliasfile); +#ifdef HAVE_MEMPCPY + mempcpy (mempcpy (full_fname, fname, fname_len), + aliasfile, sizeof aliasfile); +#else + memcpy (full_fname, fname, fname_len); + memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile); +#endif + + fp = fopen (full_fname, "r"); + freea (full_fname); + if (fp == NULL) + return 0; + +#ifdef HAVE___FSETLOCKING + /* No threads present. */ + __fsetlocking (fp, FSETLOCKING_BYCALLER); +#endif + + added = 0; + while (!FEOF (fp)) + { + /* It is a reasonable approach to use a fix buffer here because + a) we are only interested in the first two fields + b) these fields must be usable as file names and so must not + be that long + */ + char buf[BUFSIZ]; + char *alias; + char *value; + char *cp; + + if (FGETS (buf, sizeof buf, fp) == NULL) + /* EOF reached. */ + break; + + /* Possibly not the whole line fits into the buffer. Ignore + the rest of the line. */ + if (strchr (buf, '\n') == NULL) + { + char altbuf[BUFSIZ]; + do + if (FGETS (altbuf, sizeof altbuf, fp) == NULL) + /* Make sure the inner loop will be left. The outer loop + will exit at the `feof' test. */ + break; + while (strchr (altbuf, '\n') == NULL); + } + + cp = buf; + /* Ignore leading white space. */ + while (isspace ((unsigned char) cp[0])) + ++cp; + + /* A leading '#' signals a comment line. */ + if (cp[0] != '\0' && cp[0] != '#') + { + alias = cp++; + while (cp[0] != '\0' && !isspace ((unsigned char) cp[0])) + ++cp; + /* Terminate alias name. */ + if (cp[0] != '\0') + *cp++ = '\0'; + + /* Now look for the beginning of the value. */ + while (isspace ((unsigned char) cp[0])) + ++cp; + + if (cp[0] != '\0') + { + size_t alias_len; + size_t value_len; + + value = cp++; + while (cp[0] != '\0' && !isspace ((unsigned char) cp[0])) + ++cp; + /* Terminate value. */ + if (cp[0] == '\n') + { + /* This has to be done to make the following test + for the end of line possible. We are looking for + the terminating '\n' which do not overwrite here. */ + *cp++ = '\0'; + *cp = '\n'; + } + else if (cp[0] != '\0') + *cp++ = '\0'; + + if (nmap >= maxmap) + if (__builtin_expect (extend_alias_table (), 0)) + return added; + + alias_len = strlen (alias) + 1; + value_len = strlen (value) + 1; + + if (string_space_act + alias_len + value_len > string_space_max) + { + /* Increase size of memory pool. */ + size_t new_size = (string_space_max + + (alias_len + value_len > 1024 + ? alias_len + value_len : 1024)); + char *new_pool = (char *) realloc (string_space, new_size); + if (new_pool == NULL) + return added; + + if (__builtin_expect (string_space != new_pool, 0)) + { + size_t i; + + for (i = 0; i < nmap; i++) + { + map[i].alias += new_pool - string_space; + map[i].value += new_pool - string_space; + } + } + + string_space = new_pool; + string_space_max = new_size; + } + + map[nmap].alias = memcpy (&string_space[string_space_act], + alias, alias_len); + string_space_act += alias_len; + + map[nmap].value = memcpy (&string_space[string_space_act], + value, value_len); + string_space_act += value_len; + + ++nmap; + ++added; + } + } + } + + /* Should we test for ferror()? I think we have to silently ignore + errors. --drepper */ + fclose (fp); + + if (added > 0) + qsort (map, nmap, sizeof (struct alias_map), + (int (*) PARAMS ((const void *, const void *))) alias_compare); + + return added; +} + + +static int +extend_alias_table () +{ + size_t new_size; + struct alias_map *new_map; + + new_size = maxmap == 0 ? 100 : 2 * maxmap; + new_map = (struct alias_map *) realloc (map, (new_size + * sizeof (struct alias_map))); + if (new_map == NULL) + /* Simply don't extend: we don't have any more core. */ + return -1; + + map = new_map; + maxmap = new_size; + return 0; +} + + +#ifdef _LIBC +static void __attribute__ ((unused)) +free_mem (void) +{ + if (string_space != NULL) + free (string_space); + if (map != NULL) + free (map); +} +text_set_element (__libc_subfreeres, free_mem); +#endif + + +static int +alias_compare (map1, map2) + const struct alias_map *map1; + const struct alias_map *map2; +{ +#if defined _LIBC || defined HAVE_STRCASECMP + return strcasecmp (map1->alias, map2->alias); +#else + const unsigned char *p1 = (const unsigned char *) map1->alias; + const unsigned char *p2 = (const unsigned char *) map2->alias; + unsigned char c1, c2; + + if (p1 == p2) + return 0; + + do + { + /* I know this seems to be odd but the tolower() function in + some systems libc cannot handle nonalpha characters. */ + c1 = isupper (*p1) ? tolower (*p1) : *p1; + c2 = isupper (*p2) ? tolower (*p2) : *p2; + if (c1 == '\0') + break; + ++p1; + ++p2; + } + while (c1 == c2); + + return c1 - c2; +#endif +} diff --git a/intl/localename.c b/intl/localename.c new file mode 100644 index 00000000..faacecd5 --- /dev/null +++ b/intl/localename.c @@ -0,0 +1,772 @@ +/* Determine the current selected locale. + Copyright (C) 1995-1999, 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +/* Written by Ulrich Drepper , 1995. */ +/* Win32 code written by Tor Lillqvist . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#if defined _WIN32 || defined __WIN32__ +# undef WIN32 /* avoid warning on mingw32 */ +# define WIN32 +#endif + +#ifdef WIN32 +# define WIN32_LEAN_AND_MEAN +# include +/* Mingw headers don't have latest language and sublanguage codes. */ +# ifndef LANG_AFRIKAANS +# define LANG_AFRIKAANS 0x36 +# endif +# ifndef LANG_ALBANIAN +# define LANG_ALBANIAN 0x1c +# endif +# ifndef LANG_ARABIC +# define LANG_ARABIC 0x01 +# endif +# ifndef LANG_ARMENIAN +# define LANG_ARMENIAN 0x2b +# endif +# ifndef LANG_ASSAMESE +# define LANG_ASSAMESE 0x4d +# endif +# ifndef LANG_AZERI +# define LANG_AZERI 0x2c +# endif +# ifndef LANG_BASQUE +# define LANG_BASQUE 0x2d +# endif +# ifndef LANG_BELARUSIAN +# define LANG_BELARUSIAN 0x23 +# endif +# ifndef LANG_BENGALI +# define LANG_BENGALI 0x45 +# endif +# ifndef LANG_CATALAN +# define LANG_CATALAN 0x03 +# endif +# ifndef LANG_DIVEHI +# define LANG_DIVEHI 0x65 +# endif +# ifndef LANG_ESTONIAN +# define LANG_ESTONIAN 0x25 +# endif +# ifndef LANG_FAEROESE +# define LANG_FAEROESE 0x38 +# endif +# ifndef LANG_FARSI +# define LANG_FARSI 0x29 +# endif +# ifndef LANG_GALICIAN +# define LANG_GALICIAN 0x56 +# endif +# ifndef LANG_GEORGIAN +# define LANG_GEORGIAN 0x37 +# endif +# ifndef LANG_GUJARATI +# define LANG_GUJARATI 0x47 +# endif +# ifndef LANG_HEBREW +# define LANG_HEBREW 0x0d +# endif +# ifndef LANG_HINDI +# define LANG_HINDI 0x39 +# endif +# ifndef LANG_INDONESIAN +# define LANG_INDONESIAN 0x21 +# endif +# ifndef LANG_KANNADA +# define LANG_KANNADA 0x4b +# endif +# ifndef LANG_KASHMIRI +# define LANG_KASHMIRI 0x60 +# endif +# ifndef LANG_KAZAK +# define LANG_KAZAK 0x3f +# endif +# ifndef LANG_KONKANI +# define LANG_KONKANI 0x57 +# endif +# ifndef LANG_KYRGYZ +# define LANG_KYRGYZ 0x40 +# endif +# ifndef LANG_LATVIAN +# define LANG_LATVIAN 0x26 +# endif +# ifndef LANG_LITHUANIAN +# define LANG_LITHUANIAN 0x27 +# endif +# ifndef LANG_MACEDONIAN +# define LANG_MACEDONIAN 0x2f +# endif +# ifndef LANG_MALAY +# define LANG_MALAY 0x3e +# endif +# ifndef LANG_MALAYALAM +# define LANG_MALAYALAM 0x4c +# endif +# ifndef LANG_MANIPURI +# define LANG_MANIPURI 0x58 +# endif +# ifndef LANG_MARATHI +# define LANG_MARATHI 0x4e +# endif +# ifndef LANG_MONGOLIAN +# define LANG_MONGOLIAN 0x50 +# endif +# ifndef LANG_NEPALI +# define LANG_NEPALI 0x61 +# endif +# ifndef LANG_ORIYA +# define LANG_ORIYA 0x48 +# endif +# ifndef LANG_PUNJABI +# define LANG_PUNJABI 0x46 +# endif +# ifndef LANG_SANSKRIT +# define LANG_SANSKRIT 0x4f +# endif +# ifndef LANG_SERBIAN +# define LANG_SERBIAN 0x1a +# endif +# ifndef LANG_SINDHI +# define LANG_SINDHI 0x59 +# endif +# ifndef LANG_SLOVAK +# define LANG_SLOVAK 0x1b +# endif +# ifndef LANG_SORBIAN +# define LANG_SORBIAN 0x2e +# endif +# ifndef LANG_SWAHILI +# define LANG_SWAHILI 0x41 +# endif +# ifndef LANG_SYRIAC +# define LANG_SYRIAC 0x5a +# endif +# ifndef LANG_TAMIL +# define LANG_TAMIL 0x49 +# endif +# ifndef LANG_TATAR +# define LANG_TATAR 0x44 +# endif +# ifndef LANG_TELUGU +# define LANG_TELUGU 0x4a +# endif +# ifndef LANG_THAI +# define LANG_THAI 0x1e +# endif +# ifndef LANG_UKRAINIAN +# define LANG_UKRAINIAN 0x22 +# endif +# ifndef LANG_URDU +# define LANG_URDU 0x20 +# endif +# ifndef LANG_UZBEK +# define LANG_UZBEK 0x43 +# endif +# ifndef LANG_VIETNAMESE +# define LANG_VIETNAMESE 0x2a +# endif +# ifndef SUBLANG_ARABIC_SAUDI_ARABIA +# define SUBLANG_ARABIC_SAUDI_ARABIA 0x01 +# endif +# ifndef SUBLANG_ARABIC_IRAQ +# define SUBLANG_ARABIC_IRAQ 0x02 +# endif +# ifndef SUBLANG_ARABIC_EGYPT +# define SUBLANG_ARABIC_EGYPT 0x03 +# endif +# ifndef SUBLANG_ARABIC_LIBYA +# define SUBLANG_ARABIC_LIBYA 0x04 +# endif +# ifndef SUBLANG_ARABIC_ALGERIA +# define SUBLANG_ARABIC_ALGERIA 0x05 +# endif +# ifndef SUBLANG_ARABIC_MOROCCO +# define SUBLANG_ARABIC_MOROCCO 0x06 +# endif +# ifndef SUBLANG_ARABIC_TUNISIA +# define SUBLANG_ARABIC_TUNISIA 0x07 +# endif +# ifndef SUBLANG_ARABIC_OMAN +# define SUBLANG_ARABIC_OMAN 0x08 +# endif +# ifndef SUBLANG_ARABIC_YEMEN +# define SUBLANG_ARABIC_YEMEN 0x09 +# endif +# ifndef SUBLANG_ARABIC_SYRIA +# define SUBLANG_ARABIC_SYRIA 0x0a +# endif +# ifndef SUBLANG_ARABIC_JORDAN +# define SUBLANG_ARABIC_JORDAN 0x0b +# endif +# ifndef SUBLANG_ARABIC_LEBANON +# define SUBLANG_ARABIC_LEBANON 0x0c +# endif +# ifndef SUBLANG_ARABIC_KUWAIT +# define SUBLANG_ARABIC_KUWAIT 0x0d +# endif +# ifndef SUBLANG_ARABIC_UAE +# define SUBLANG_ARABIC_UAE 0x0e +# endif +# ifndef SUBLANG_ARABIC_BAHRAIN +# define SUBLANG_ARABIC_BAHRAIN 0x0f +# endif +# ifndef SUBLANG_ARABIC_QATAR +# define SUBLANG_ARABIC_QATAR 0x10 +# endif +# ifndef SUBLANG_AZERI_LATIN +# define SUBLANG_AZERI_LATIN 0x01 +# endif +# ifndef SUBLANG_AZERI_CYRILLIC +# define SUBLANG_AZERI_CYRILLIC 0x02 +# endif +# ifndef SUBLANG_CHINESE_MACAU +# define SUBLANG_CHINESE_MACAU 0x05 +# endif +# ifndef SUBLANG_ENGLISH_SOUTH_AFRICA +# define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 +# endif +# ifndef SUBLANG_ENGLISH_JAMAICA +# define SUBLANG_ENGLISH_JAMAICA 0x08 +# endif +# ifndef SUBLANG_ENGLISH_CARIBBEAN +# define SUBLANG_ENGLISH_CARIBBEAN 0x09 +# endif +# ifndef SUBLANG_ENGLISH_BELIZE +# define SUBLANG_ENGLISH_BELIZE 0x0a +# endif +# ifndef SUBLANG_ENGLISH_TRINIDAD +# define SUBLANG_ENGLISH_TRINIDAD 0x0b +# endif +# ifndef SUBLANG_ENGLISH_ZIMBABWE +# define SUBLANG_ENGLISH_ZIMBABWE 0x0c +# endif +# ifndef SUBLANG_ENGLISH_PHILIPPINES +# define SUBLANG_ENGLISH_PHILIPPINES 0x0d +# endif +# ifndef SUBLANG_FRENCH_LUXEMBOURG +# define SUBLANG_FRENCH_LUXEMBOURG 0x05 +# endif +# ifndef SUBLANG_FRENCH_MONACO +# define SUBLANG_FRENCH_MONACO 0x06 +# endif +# ifndef SUBLANG_GERMAN_LUXEMBOURG +# define SUBLANG_GERMAN_LUXEMBOURG 0x04 +# endif +# ifndef SUBLANG_GERMAN_LIECHTENSTEIN +# define SUBLANG_GERMAN_LIECHTENSTEIN 0x05 +# endif +# ifndef SUBLANG_KASHMIRI_INDIA +# define SUBLANG_KASHMIRI_INDIA 0x02 +# endif +# ifndef SUBLANG_MALAY_MALAYSIA +# define SUBLANG_MALAY_MALAYSIA 0x01 +# endif +# ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM +# define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 +# endif +# ifndef SUBLANG_NEPALI_INDIA +# define SUBLANG_NEPALI_INDIA 0x02 +# endif +# ifndef SUBLANG_SERBIAN_LATIN +# define SUBLANG_SERBIAN_LATIN 0x02 +# endif +# ifndef SUBLANG_SERBIAN_CYRILLIC +# define SUBLANG_SERBIAN_CYRILLIC 0x03 +# endif +# ifndef SUBLANG_SPANISH_GUATEMALA +# define SUBLANG_SPANISH_GUATEMALA 0x04 +# endif +# ifndef SUBLANG_SPANISH_COSTA_RICA +# define SUBLANG_SPANISH_COSTA_RICA 0x05 +# endif +# ifndef SUBLANG_SPANISH_PANAMA +# define SUBLANG_SPANISH_PANAMA 0x06 +# endif +# ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC +# define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 +# endif +# ifndef SUBLANG_SPANISH_VENEZUELA +# define SUBLANG_SPANISH_VENEZUELA 0x08 +# endif +# ifndef SUBLANG_SPANISH_COLOMBIA +# define SUBLANG_SPANISH_COLOMBIA 0x09 +# endif +# ifndef SUBLANG_SPANISH_PERU +# define SUBLANG_SPANISH_PERU 0x0a +# endif +# ifndef SUBLANG_SPANISH_ARGENTINA +# define SUBLANG_SPANISH_ARGENTINA 0x0b +# endif +# ifndef SUBLANG_SPANISH_ECUADOR +# define SUBLANG_SPANISH_ECUADOR 0x0c +# endif +# ifndef SUBLANG_SPANISH_CHILE +# define SUBLANG_SPANISH_CHILE 0x0d +# endif +# ifndef SUBLANG_SPANISH_URUGUAY +# define SUBLANG_SPANISH_URUGUAY 0x0e +# endif +# ifndef SUBLANG_SPANISH_PARAGUAY +# define SUBLANG_SPANISH_PARAGUAY 0x0f +# endif +# ifndef SUBLANG_SPANISH_BOLIVIA +# define SUBLANG_SPANISH_BOLIVIA 0x10 +# endif +# ifndef SUBLANG_SPANISH_EL_SALVADOR +# define SUBLANG_SPANISH_EL_SALVADOR 0x11 +# endif +# ifndef SUBLANG_SPANISH_HONDURAS +# define SUBLANG_SPANISH_HONDURAS 0x12 +# endif +# ifndef SUBLANG_SPANISH_NICARAGUA +# define SUBLANG_SPANISH_NICARAGUA 0x13 +# endif +# ifndef SUBLANG_SPANISH_PUERTO_RICO +# define SUBLANG_SPANISH_PUERTO_RICO 0x14 +# endif +# ifndef SUBLANG_SWEDISH_FINLAND +# define SUBLANG_SWEDISH_FINLAND 0x02 +# endif +# ifndef SUBLANG_URDU_PAKISTAN +# define SUBLANG_URDU_PAKISTAN 0x01 +# endif +# ifndef SUBLANG_URDU_INDIA +# define SUBLANG_URDU_INDIA 0x02 +# endif +# ifndef SUBLANG_UZBEK_LATIN +# define SUBLANG_UZBEK_LATIN 0x01 +# endif +# ifndef SUBLANG_UZBEK_CYRILLIC +# define SUBLANG_UZBEK_CYRILLIC 0x02 +# endif +#endif + +/* XPG3 defines the result of 'setlocale (category, NULL)' as: + "Directs 'setlocale()' to query 'category' and return the current + setting of 'local'." + However it does not specify the exact format. Neither do SUSV2 and + ISO C 99. So we can use this feature only on selected systems (e.g. + those using GNU C Library). */ +#if defined _LIBC || (defined __GNU_LIBRARY__ && __GNU_LIBRARY__ >= 2) +# define HAVE_LOCALE_NULL +#endif + +/* Determine the current locale's name, and canonicalize it into XPG syntax + language[_territory[.codeset]][@modifier] + The codeset part in the result is not reliable; the locale_charset() + should be used for codeset information instead. + The result must not be freed; it is statically allocated. */ + +const char * +_nl_locale_name (category, categoryname) + int category; + const char *categoryname; +{ + const char *retval; + +#ifndef WIN32 + + /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'. + On some systems this can be done by the 'setlocale' function itself. */ +# if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL + retval = setlocale (category, NULL); +# else + /* Setting of LC_ALL overwrites all other. */ + retval = getenv ("LC_ALL"); + if (retval == NULL || retval[0] == '\0') + { + /* Next comes the name of the desired category. */ + retval = getenv (categoryname); + if (retval == NULL || retval[0] == '\0') + { + /* Last possibility is the LANG environment variable. */ + retval = getenv ("LANG"); + if (retval == NULL || retval[0] == '\0') + /* We use C as the default domain. POSIX says this is + implementation defined. */ + retval = "C"; + } + } +# endif + + return retval; + +#else /* WIN32 */ + + /* Return an XPG style locale name language[_territory][@modifier]. + Don't even bother determining the codeset; it's not useful in this + context, because message catalogs are not specific to a single + codeset. */ + + LCID lcid; + LANGID langid; + int primary, sub; + + /* Let the user override the system settings through environment + variables, as on POSIX systems. */ + retval = getenv ("LC_ALL"); + if (retval != NULL && retval[0] != '\0') + return retval; + retval = getenv (categoryname); + if (retval != NULL && retval[0] != '\0') + return retval; + retval = getenv ("LANG"); + if (retval != NULL && retval[0] != '\0') + return retval; + + /* Use native Win32 API locale ID. */ + lcid = GetThreadLocale (); + + /* Strip off the sorting rules, keep only the language part. */ + langid = LANGIDFROMLCID (lcid); + + /* Split into language and territory part. */ + primary = PRIMARYLANGID (langid); + sub = SUBLANGID (langid); + + /* Dispatch on language. + See also http://www.unicode.org/unicode/onlinedat/languages.html . + For details about languages, see http://www.ethnologue.com/ . */ + switch (primary) + { + case LANG_AFRIKAANS: return "af_ZA"; + case LANG_ALBANIAN: return "sq_AL"; + case 0x5e: /* AMHARIC */ return "am_ET"; + case LANG_ARABIC: + switch (sub) + { + case SUBLANG_ARABIC_SAUDI_ARABIA: return "ar_SA"; + case SUBLANG_ARABIC_IRAQ: return "ar_IQ"; + case SUBLANG_ARABIC_EGYPT: return "ar_EG"; + case SUBLANG_ARABIC_LIBYA: return "ar_LY"; + case SUBLANG_ARABIC_ALGERIA: return "ar_DZ"; + case SUBLANG_ARABIC_MOROCCO: return "ar_MA"; + case SUBLANG_ARABIC_TUNISIA: return "ar_TN"; + case SUBLANG_ARABIC_OMAN: return "ar_OM"; + case SUBLANG_ARABIC_YEMEN: return "ar_YE"; + case SUBLANG_ARABIC_SYRIA: return "ar_SY"; + case SUBLANG_ARABIC_JORDAN: return "ar_JO"; + case SUBLANG_ARABIC_LEBANON: return "ar_LB"; + case SUBLANG_ARABIC_KUWAIT: return "ar_KW"; + case SUBLANG_ARABIC_UAE: return "ar_AE"; + case SUBLANG_ARABIC_BAHRAIN: return "ar_BH"; + case SUBLANG_ARABIC_QATAR: return "ar_QA"; + } + return "ar"; + case LANG_ARMENIAN: return "hy_AM"; + case LANG_ASSAMESE: return "as_IN"; + case LANG_AZERI: + switch (sub) + { + /* FIXME: Adjust this when Azerbaijani locales appear on Unix. */ + case SUBLANG_AZERI_LATIN: return "az_AZ@latin"; + case SUBLANG_AZERI_CYRILLIC: return "az_AZ@cyrillic"; + } + return "az"; + case LANG_BASQUE: + return "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR". */ + case LANG_BELARUSIAN: return "be_BY"; + case LANG_BENGALI: return "bn_IN"; + case LANG_BULGARIAN: return "bg_BG"; + case 0x55: /* BURMESE */ return "my_MM"; + case 0x53: /* CAMBODIAN */ return "km_KH"; + case LANG_CATALAN: return "ca_ES"; + case 0x5c: /* CHEROKEE */ return "chr_US"; + case LANG_CHINESE: + switch (sub) + { + case SUBLANG_CHINESE_TRADITIONAL: return "zh_TW"; + case SUBLANG_CHINESE_SIMPLIFIED: return "zh_CN"; + case SUBLANG_CHINESE_HONGKONG: return "zh_HK"; + case SUBLANG_CHINESE_SINGAPORE: return "zh_SG"; + case SUBLANG_CHINESE_MACAU: return "zh_MO"; + } + return "zh"; + case LANG_CROATIAN: /* LANG_CROATIAN == LANG_SERBIAN + * What used to be called Serbo-Croatian + * should really now be two separate + * languages because of political reasons. + * (Says tml, who knows nothing about Serbian + * or Croatian.) + * (I can feel those flames coming already.) + */ + switch (sub) + { + case SUBLANG_DEFAULT: return "hr_HR"; + case SUBLANG_SERBIAN_LATIN: return "sr_YU"; + case SUBLANG_SERBIAN_CYRILLIC: return "sr_YU@cyrillic"; + } + return "hr"; + case LANG_CZECH: return "cs_CZ"; + case LANG_DANISH: return "da_DK"; + case LANG_DIVEHI: return "div_MV"; + case LANG_DUTCH: + switch (sub) + { + case SUBLANG_DUTCH: return "nl_NL"; + case SUBLANG_DUTCH_BELGIAN: /* FLEMISH, VLAAMS */ return "nl_BE"; + } + return "nl"; + case 0x66: /* EDO */ return "bin_NG"; + case LANG_ENGLISH: + switch (sub) + { + /* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought + * English was the language spoken in England. + * Oh well. + */ + case SUBLANG_ENGLISH_US: return "en_US"; + case SUBLANG_ENGLISH_UK: return "en_GB"; + case SUBLANG_ENGLISH_AUS: return "en_AU"; + case SUBLANG_ENGLISH_CAN: return "en_CA"; + case SUBLANG_ENGLISH_NZ: return "en_NZ"; + case SUBLANG_ENGLISH_EIRE: return "en_IE"; + case SUBLANG_ENGLISH_SOUTH_AFRICA: return "en_ZA"; + case SUBLANG_ENGLISH_JAMAICA: return "en_JM"; + case SUBLANG_ENGLISH_CARIBBEAN: return "en_GD"; /* Grenada? */ + case SUBLANG_ENGLISH_BELIZE: return "en_BZ"; + case SUBLANG_ENGLISH_TRINIDAD: return "en_TT"; + case SUBLANG_ENGLISH_ZIMBABWE: return "en_ZW"; + case SUBLANG_ENGLISH_PHILIPPINES: return "en_PH"; + } + return "en"; + case LANG_ESTONIAN: return "et_EE"; + case LANG_FAEROESE: return "fo_FO"; + case LANG_FARSI: return "fa_IR"; + case LANG_FINNISH: return "fi_FI"; + case LANG_FRENCH: + switch (sub) + { + case SUBLANG_FRENCH: return "fr_FR"; + case SUBLANG_FRENCH_BELGIAN: /* WALLOON */ return "fr_BE"; + case SUBLANG_FRENCH_CANADIAN: return "fr_CA"; + case SUBLANG_FRENCH_SWISS: return "fr_CH"; + case SUBLANG_FRENCH_LUXEMBOURG: return "fr_LU"; + case SUBLANG_FRENCH_MONACO: return "fr_MC"; + } + return "fr"; + case 0x62: /* FRISIAN */ return "fy_NL"; + case 0x67: /* FULFULDE */ return "ful_NG"; + case 0x3c: /* GAELIC */ + switch (sub) + { + case 0x01: /* SCOTTISH */ return "gd_GB"; + case 0x02: /* IRISH */ return "ga_IE"; + } + return "C"; + case LANG_GALICIAN: return "gl_ES"; + case LANG_GEORGIAN: return "ka_GE"; + case LANG_GERMAN: + switch (sub) + { + case SUBLANG_GERMAN: return "de_DE"; + case SUBLANG_GERMAN_SWISS: return "de_CH"; + case SUBLANG_GERMAN_AUSTRIAN: return "de_AT"; + case SUBLANG_GERMAN_LUXEMBOURG: return "de_LU"; + case SUBLANG_GERMAN_LIECHTENSTEIN: return "de_LI"; + } + return "de"; + case LANG_GREEK: return "el_GR"; + case 0x74: /* GUARANI */ return "gn_PY"; + case LANG_GUJARATI: return "gu_IN"; + case 0x68: /* HAUSA */ return "ha_NG"; + case 0x75: /* HAWAIIAN */ + /* FIXME: Do they mean Hawaiian ("haw_US", 1000 speakers) + or Hawaii Creole English ("cpe_US", 600000 speakers)? */ + return "cpe_US"; + case LANG_HEBREW: return "he_IL"; + case LANG_HINDI: return "hi_IN"; + case LANG_HUNGARIAN: return "hu_HU"; + case 0x69: /* IBIBIO */ return "nic_NG"; + case LANG_ICELANDIC: return "is_IS"; + case 0x70: /* IGBO */ return "ibo_NG"; + case LANG_INDONESIAN: return "id_ID"; + case 0x5d: /* INUKTITUT */ return "iu_CA"; + case LANG_ITALIAN: + switch (sub) + { + case SUBLANG_ITALIAN: return "it_IT"; + case SUBLANG_ITALIAN_SWISS: return "it_CH"; + } + return "it"; + case LANG_JAPANESE: return "ja_JP"; + case LANG_KANNADA: return "kn_IN"; + case 0x71: /* KANURI */ return "kau_NG"; + case LANG_KASHMIRI: + switch (sub) + { + case SUBLANG_DEFAULT: return "ks_PK"; + case SUBLANG_KASHMIRI_INDIA: return "ks_IN"; + } + return "ks"; + case LANG_KAZAK: return "kk_KZ"; + case LANG_KONKANI: + /* FIXME: Adjust this when such locales appear on Unix. */ + return "kok_IN"; + case LANG_KOREAN: return "ko_KR"; + case LANG_KYRGYZ: return "ky_KG"; + case 0x54: /* LAO */ return "lo_LA"; + case 0x76: /* LATIN */ return "la_VA"; + case LANG_LATVIAN: return "lv_LV"; + case LANG_LITHUANIAN: return "lt_LT"; + case LANG_MACEDONIAN: return "mk_MK"; + case LANG_MALAY: + switch (sub) + { + case SUBLANG_MALAY_MALAYSIA: return "ms_MY"; + case SUBLANG_MALAY_BRUNEI_DARUSSALAM: return "ms_BN"; + } + return "ms"; + case LANG_MALAYALAM: return "ml_IN"; + case 0x3a: /* MALTESE */ return "mt_MT"; + case LANG_MANIPURI: + /* FIXME: Adjust this when such locales appear on Unix. */ + return "mni_IN"; + case LANG_MARATHI: return "mr_IN"; + case LANG_MONGOLIAN: + return "mn"; /* Ambiguous: could be "mn_CN" or "mn_MN". */ + case LANG_NEPALI: + switch (sub) + { + case SUBLANG_DEFAULT: return "ne_NP"; + case SUBLANG_NEPALI_INDIA: return "ne_IN"; + } + return "ne"; + case LANG_NORWEGIAN: + switch (sub) + { + case SUBLANG_NORWEGIAN_BOKMAL: return "no_NO"; + case SUBLANG_NORWEGIAN_NYNORSK: return "nn_NO"; + } + return "no"; + case LANG_ORIYA: return "or_IN"; + case 0x72: /* OROMO */ return "om_ET"; + case 0x79: /* PAPIAMENTU */ return "pap_AN"; + case 0x63: /* PASHTO */ + return "ps"; /* Ambiguous: could be "ps_PK" or "ps_AF". */ + case LANG_POLISH: return "pl_PL"; + case LANG_PORTUGUESE: + switch (sub) + { + case SUBLANG_PORTUGUESE: return "pt_PT"; + /* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT. + Same phenomenon as SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. */ + case SUBLANG_PORTUGUESE_BRAZILIAN: return "pt_BR"; + } + return "pt"; + case LANG_PUNJABI: return "pa_IN"; + case 0x17: /* RHAETO-ROMANCE */ return "rm_CH"; + case LANG_ROMANIAN: return "ro_RO"; + case LANG_RUSSIAN: + return "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA". */ + case 0x3b: /* SAMI */ return "se_NO"; + case LANG_SANSKRIT: return "sa_IN"; + case LANG_SINDHI: return "sd"; + case 0x5b: /* SINHALESE */ return "si_LK"; + case LANG_SLOVAK: return "sk_SK"; + case LANG_SLOVENIAN: return "sl_SI"; + case 0x77: /* SOMALI */ return "so_SO"; + case LANG_SORBIAN: + /* FIXME: Adjust this when such locales appear on Unix. */ + return "wen_DE"; + case LANG_SPANISH: + switch (sub) + { + case SUBLANG_SPANISH: return "es_ES"; + case SUBLANG_SPANISH_MEXICAN: return "es_MX"; + case SUBLANG_SPANISH_MODERN: + return "es_ES@modern"; /* not seen on Unix */ + case SUBLANG_SPANISH_GUATEMALA: return "es_GT"; + case SUBLANG_SPANISH_COSTA_RICA: return "es_CR"; + case SUBLANG_SPANISH_PANAMA: return "es_PA"; + case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: return "es_DO"; + case SUBLANG_SPANISH_VENEZUELA: return "es_VE"; + case SUBLANG_SPANISH_COLOMBIA: return "es_CO"; + case SUBLANG_SPANISH_PERU: return "es_PE"; + case SUBLANG_SPANISH_ARGENTINA: return "es_AR"; + case SUBLANG_SPANISH_ECUADOR: return "es_EC"; + case SUBLANG_SPANISH_CHILE: return "es_CL"; + case SUBLANG_SPANISH_URUGUAY: return "es_UY"; + case SUBLANG_SPANISH_PARAGUAY: return "es_PY"; + case SUBLANG_SPANISH_BOLIVIA: return "es_BO"; + case SUBLANG_SPANISH_EL_SALVADOR: return "es_SV"; + case SUBLANG_SPANISH_HONDURAS: return "es_HN"; + case SUBLANG_SPANISH_NICARAGUA: return "es_NI"; + case SUBLANG_SPANISH_PUERTO_RICO: return "es_PR"; + } + return "es"; + case 0x30: /* SUTU */ return "bnt_TZ"; + case LANG_SWAHILI: return "sw_KE"; + case LANG_SWEDISH: + switch (sub) + { + case SUBLANG_DEFAULT: return "sv_SE"; + case SUBLANG_SWEDISH_FINLAND: return "sv_FI"; + } + return "sv"; + case LANG_SYRIAC: return "syr_TR"; /* An extinct language. */ + case 0x64: /* TAGALOG */ return "tl_PH"; + case 0x28: /* TAJIK */ return "tg_TJ"; + case 0x5f: /* TAMAZIGHT */ return "ber_MA"; + case LANG_TAMIL: + return "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG". */ + case LANG_TATAR: return "tt_RU"; + case LANG_TELUGU: return "te_IN"; + case LANG_THAI: return "th_TH"; + case 0x51: /* TIBETAN */ return "bo_CN"; + case 0x73: /* TIGRINYA */ return "ti_ET"; + case 0x31: /* TSONGA */ return "ts_ZA"; + case LANG_TURKISH: return "tr_TR"; + case 0x42: /* TURKMEN */ return "tk_TM"; + case LANG_UKRAINIAN: return "uk_UA"; + case LANG_URDU: + switch (sub) + { + case SUBLANG_URDU_PAKISTAN: return "ur_PK"; + case SUBLANG_URDU_INDIA: return "ur_IN"; + } + return "ur"; + case LANG_UZBEK: + switch (sub) + { + /* FIXME: Adjust this when Uzbek locales appear on Unix. */ + case SUBLANG_UZBEK_LATIN: return "uz_UZ@latin"; + case SUBLANG_UZBEK_CYRILLIC: return "uz_UZ@cyrillic"; + } + return "uz"; + case 0x33: /* VENDA */ return "ven_ZA"; + case LANG_VIETNAMESE: return "vi_VN"; + case 0x52: /* WELSH */ return "cy_GB"; + case 0x34: /* XHOSA */ return "xh_ZA"; + case 0x78: /* YI */ return "sit_CN"; + case 0x3d: /* YIDDISH */ return "yi_IL"; + case 0x6a: /* YORUBA */ return "yo_NG"; + case 0x35: /* ZULU */ return "zu_ZA"; + default: return "C"; + } + +#endif +} diff --git a/intl/ngettext.c b/intl/ngettext.c new file mode 100644 index 00000000..69fe1f74 --- /dev/null +++ b/intl/ngettext.c @@ -0,0 +1,68 @@ +/* Implementation of ngettext(3) function. + Copyright (C) 1995, 1997, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifdef _LIBC +# define __need_NULL +# include +#else +# include /* Just for NULL. */ +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +#include + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define NGETTEXT __ngettext +# define DCNGETTEXT INTUSE(__dcngettext) +#else +# define NGETTEXT libintl_ngettext +# define DCNGETTEXT libintl_dcngettext +#endif + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +char * +NGETTEXT (msgid1, msgid2, n) + const char *msgid1; + const char *msgid2; + unsigned long int n; +{ + return DCNGETTEXT (NULL, msgid1, msgid2, n, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__ngettext, ngettext); +#endif diff --git a/intl/os2compat.c b/intl/os2compat.c new file mode 100644 index 00000000..c8dc33e7 --- /dev/null +++ b/intl/os2compat.c @@ -0,0 +1,98 @@ +/* OS/2 compatibility functions. + Copyright (C) 2001-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#define OS2_AWARE +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +/* A version of getenv() that works from DLLs */ +extern unsigned long DosScanEnv (const unsigned char *pszName, unsigned char **ppszValue); + +char * +_nl_getenv (const char *name) +{ + unsigned char *value; + if (DosScanEnv (name, &value)) + return NULL; + else + return value; +} + +/* A fixed size buffer. */ +char libintl_nl_default_dirname[MAXPATHLEN+1]; + +char *_nlos2_libdir = NULL; +char *_nlos2_localealiaspath = NULL; +char *_nlos2_localedir = NULL; + +static __attribute__((constructor)) void +nlos2_initialize () +{ + char *root = getenv ("UNIXROOT"); + char *gnulocaledir = getenv ("GNULOCALEDIR"); + + _nlos2_libdir = gnulocaledir; + if (!_nlos2_libdir) + { + if (root) + { + size_t sl = strlen (root); + _nlos2_libdir = (char *) malloc (sl + strlen (LIBDIR) + 1); + memcpy (_nlos2_libdir, root, sl); + memcpy (_nlos2_libdir + sl, LIBDIR, strlen (LIBDIR) + 1); + } + else + _nlos2_libdir = LIBDIR; + } + + _nlos2_localealiaspath = gnulocaledir; + if (!_nlos2_localealiaspath) + { + if (root) + { + size_t sl = strlen (root); + _nlos2_localealiaspath = (char *) malloc (sl + strlen (LOCALE_ALIAS_PATH) + 1); + memcpy (_nlos2_localealiaspath, root, sl); + memcpy (_nlos2_localealiaspath + sl, LOCALE_ALIAS_PATH, strlen (LOCALE_ALIAS_PATH) + 1); + } + else + _nlos2_localealiaspath = LOCALE_ALIAS_PATH; + } + + _nlos2_localedir = gnulocaledir; + if (!_nlos2_localedir) + { + if (root) + { + size_t sl = strlen (root); + _nlos2_localedir = (char *) malloc (sl + strlen (LOCALEDIR) + 1); + memcpy (_nlos2_localedir, root, sl); + memcpy (_nlos2_localedir + sl, LOCALEDIR, strlen (LOCALEDIR) + 1); + } + else + _nlos2_localedir = LOCALEDIR; + } + + if (strlen (_nlos2_localedir) <= MAXPATHLEN) + strcpy (libintl_nl_default_dirname, _nlos2_localedir); +} diff --git a/intl/os2compat.h b/intl/os2compat.h new file mode 100644 index 00000000..4f74e8c0 --- /dev/null +++ b/intl/os2compat.h @@ -0,0 +1,46 @@ +/* OS/2 compatibility defines. + This file is intended to be included from config.h + Copyright (C) 2001-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +/* When included from os2compat.h we need all the original definitions */ +#ifndef OS2_AWARE + +#undef LIBDIR +#define LIBDIR _nlos2_libdir +extern char *_nlos2_libdir; + +#undef LOCALEDIR +#define LOCALEDIR _nlos2_localedir +extern char *_nlos2_localedir; + +#undef LOCALE_ALIAS_PATH +#define LOCALE_ALIAS_PATH _nlos2_localealiaspath +extern char *_nlos2_localealiaspath; + +#endif + +#undef HAVE_STRCASECMP +#define HAVE_STRCASECMP 1 +#define strcasecmp stricmp +#define strncasecmp strnicmp + +/* We have our own getenv() which works even if library is compiled as DLL */ +#define getenv _nl_getenv + +/* Older versions of gettext used -1 as the value of LC_MESSAGES */ +#define LC_MESSAGES_COMPAT (-1) diff --git a/intl/osdep.c b/intl/osdep.c new file mode 100644 index 00000000..b3725983 --- /dev/null +++ b/intl/osdep.c @@ -0,0 +1,24 @@ +/* OS dependent parts of libintl. + Copyright (C) 2001-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#if defined __EMX__ +# include "os2compat.c" +#else +/* Avoid AIX compiler warning. */ +typedef int dummy; +#endif diff --git a/intl/plural-exp.c b/intl/plural-exp.c new file mode 100644 index 00000000..c937c011 --- /dev/null +++ b/intl/plural-exp.c @@ -0,0 +1,156 @@ +/* Expression parsing for plural form selection. + Copyright (C) 2000, 2001 Free Software Foundation, Inc. + Written by Ulrich Drepper , 2000. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#include "plural-exp.h" + +#if (defined __GNUC__ && !defined __APPLE_CC__) \ + || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) + +/* These structs are the constant expression for the germanic plural + form determination. It represents the expression "n != 1". */ +static const struct expression plvar = +{ + .nargs = 0, + .operation = var, +}; +static const struct expression plone = +{ + .nargs = 0, + .operation = num, + .val = + { + .num = 1 + } +}; +struct expression GERMANIC_PLURAL = +{ + .nargs = 2, + .operation = not_equal, + .val = + { + .args = + { + [0] = (struct expression *) &plvar, + [1] = (struct expression *) &plone + } + } +}; + +# define INIT_GERMANIC_PLURAL() + +#else + +/* For compilers without support for ISO C 99 struct/union initializers: + Initialization at run-time. */ + +static struct expression plvar; +static struct expression plone; +struct expression GERMANIC_PLURAL; + +static void +init_germanic_plural () +{ + if (plone.val.num == 0) + { + plvar.nargs = 0; + plvar.operation = var; + + plone.nargs = 0; + plone.operation = num; + plone.val.num = 1; + + GERMANIC_PLURAL.nargs = 2; + GERMANIC_PLURAL.operation = not_equal; + GERMANIC_PLURAL.val.args[0] = &plvar; + GERMANIC_PLURAL.val.args[1] = &plone; + } +} + +# define INIT_GERMANIC_PLURAL() init_germanic_plural () + +#endif + +void +internal_function +EXTRACT_PLURAL_EXPRESSION (nullentry, pluralp, npluralsp) + const char *nullentry; + struct expression **pluralp; + unsigned long int *npluralsp; +{ + if (nullentry != NULL) + { + const char *plural; + const char *nplurals; + + plural = strstr (nullentry, "plural="); + nplurals = strstr (nullentry, "nplurals="); + if (plural == NULL || nplurals == NULL) + goto no_plural; + else + { + char *endp; + unsigned long int n; + struct parse_args args; + + /* First get the number. */ + nplurals += 9; + while (*nplurals != '\0' && isspace ((unsigned char) *nplurals)) + ++nplurals; + if (!(*nplurals >= '0' && *nplurals <= '9')) + goto no_plural; +#if defined HAVE_STRTOUL || defined _LIBC + n = strtoul (nplurals, &endp, 10); +#else + for (endp = nplurals, n = 0; *endp >= '0' && *endp <= '9'; endp++) + n = n * 10 + (*endp - '0'); +#endif + if (nplurals == endp) + goto no_plural; + *npluralsp = n; + + /* Due to the restrictions bison imposes onto the interface of the + scanner function we have to put the input string and the result + passed up from the parser into the same structure which address + is passed down to the parser. */ + plural += 7; + args.cp = plural; + if (PLURAL_PARSE (&args) != 0) + goto no_plural; + *pluralp = args.res; + } + } + else + { + /* By default we are using the Germanic form: singular form only + for `one', the plural form otherwise. Yes, this is also what + English is using since English is a Germanic language. */ + no_plural: + INIT_GERMANIC_PLURAL (); + *pluralp = &GERMANIC_PLURAL; + *npluralsp = 2; + } +} diff --git a/intl/plural-exp.h b/intl/plural-exp.h new file mode 100644 index 00000000..9e5d1658 --- /dev/null +++ b/intl/plural-exp.h @@ -0,0 +1,126 @@ +/* Expression parsing and evaluation for plural form selection. + Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. + Written by Ulrich Drepper , 2000. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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 _PLURAL_EXP_H +#define _PLURAL_EXP_H + +#ifndef PARAMS +# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +#ifndef internal_function +# define internal_function +#endif + +#ifndef attribute_hidden +# define attribute_hidden +#endif + + +/* This is the representation of the expressions to determine the + plural form. */ +struct expression +{ + int nargs; /* Number of arguments. */ + enum operator + { + /* Without arguments: */ + var, /* The variable "n". */ + num, /* Decimal number. */ + /* Unary operators: */ + lnot, /* Logical NOT. */ + /* Binary operators: */ + mult, /* Multiplication. */ + divide, /* Division. */ + module, /* Modulo operation. */ + plus, /* Addition. */ + minus, /* Subtraction. */ + less_than, /* Comparison. */ + greater_than, /* Comparison. */ + less_or_equal, /* Comparison. */ + greater_or_equal, /* Comparison. */ + equal, /* Comparison for equality. */ + not_equal, /* Comparison for inequality. */ + land, /* Logical AND. */ + lor, /* Logical OR. */ + /* Ternary operators: */ + qmop /* Question mark operator. */ + } operation; + union + { + unsigned long int num; /* Number value for `num'. */ + struct expression *args[3]; /* Up to three arguments. */ + } val; +}; + +/* This is the data structure to pass information to the parser and get + the result in a thread-safe way. */ +struct parse_args +{ + const char *cp; + struct expression *res; +}; + + +/* Names for the libintl functions are a problem. This source code is used + 1. in the GNU C Library library, + 2. in the GNU libintl library, + 3. in the GNU gettext tools. + The function names in each situation must be different, to allow for + binary incompatible changes in 'struct expression'. Furthermore, + 1. in the GNU C Library library, the names have a __ prefix, + 2.+3. in the GNU libintl library and in the GNU gettext tools, the names + must follow ANSI C and not start with __. + So we have to distinguish the three cases. */ +#ifdef _LIBC +# define FREE_EXPRESSION __gettext_free_exp +# define PLURAL_PARSE __gettextparse +# define GERMANIC_PLURAL __gettext_germanic_plural +# define EXTRACT_PLURAL_EXPRESSION __gettext_extract_plural +#elif defined (IN_LIBINTL) +# define FREE_EXPRESSION libintl_gettext_free_exp +# define PLURAL_PARSE libintl_gettextparse +# define GERMANIC_PLURAL libintl_gettext_germanic_plural +# define EXTRACT_PLURAL_EXPRESSION libintl_gettext_extract_plural +#else +# define FREE_EXPRESSION free_plural_expression +# define PLURAL_PARSE parse_plural_expression +# define GERMANIC_PLURAL germanic_plural +# define EXTRACT_PLURAL_EXPRESSION extract_plural_expression +#endif + +extern void FREE_EXPRESSION PARAMS ((struct expression *exp)) + internal_function; +extern int PLURAL_PARSE PARAMS ((void *arg)); +extern struct expression GERMANIC_PLURAL attribute_hidden; +extern void EXTRACT_PLURAL_EXPRESSION PARAMS ((const char *nullentry, + struct expression **pluralp, + unsigned long int *npluralsp)) + internal_function; + +#if !defined (_LIBC) && !defined (IN_LIBINTL) +extern unsigned long int plural_eval PARAMS ((struct expression *pexp, + unsigned long int n)); +#endif + +#endif /* _PLURAL_EXP_H */ diff --git a/intl/plural.c b/intl/plural.c new file mode 100644 index 00000000..c9ff63fb --- /dev/null +++ b/intl/plural.c @@ -0,0 +1,1322 @@ + +/* A Bison parser, made from plural.y + by GNU Bison version 1.28 */ + +#define YYBISON 1 /* Identify Bison output. */ + +#define yyparse __gettextparse +#define yylex __gettextlex +#define yyerror __gettexterror +#define yylval __gettextlval +#define yychar __gettextchar +#define yydebug __gettextdebug +#define yynerrs __gettextnerrs +#define EQUOP2 257 +#define CMPOP2 258 +#define ADDOP2 259 +#define MULOP2 260 +#define NUMBER 261 + +#line 1 "plural.y" + +/* Expression parsing for plural form selection. + Copyright (C) 2000, 2001 Free Software Foundation, Inc. + Written by Ulrich Drepper , 2000. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +/* The bison generated parser uses alloca. AIX 3 forces us to put this + declaration at the beginning of the file. The declaration in bison's + skeleton file comes too late. This must come before + because may include arbitrary system headers. */ +#if defined _AIX && !defined __GNUC__ + #pragma alloca +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include "plural-exp.h" + +/* The main function generated by the parser is called __gettextparse, + but we want it to be called PLURAL_PARSE. */ +#ifndef _LIBC +# define __gettextparse PLURAL_PARSE +#endif + +#define YYLEX_PARAM &((struct parse_args *) arg)->cp +#define YYPARSE_PARAM arg + +#line 49 "plural.y" +typedef union { + unsigned long int num; + enum operator op; + struct expression *exp; +} YYSTYPE; +#line 55 "plural.y" + +/* Prototypes for local functions. */ +static struct expression *new_exp PARAMS ((int nargs, enum operator op, + struct expression * const *args)); +static inline struct expression *new_exp_0 PARAMS ((enum operator op)); +static inline struct expression *new_exp_1 PARAMS ((enum operator op, + struct expression *right)); +static struct expression *new_exp_2 PARAMS ((enum operator op, + struct expression *left, + struct expression *right)); +static inline struct expression *new_exp_3 PARAMS ((enum operator op, + struct expression *bexp, + struct expression *tbranch, + struct expression *fbranch)); +static int yylex PARAMS ((YYSTYPE *lval, const char **pexp)); +static void yyerror PARAMS ((const char *str)); + +/* Allocation of expressions. */ + +static struct expression * +new_exp (nargs, op, args) + int nargs; + enum operator op; + struct expression * const *args; +{ + int i; + struct expression *newp; + + /* If any of the argument could not be malloc'ed, just return NULL. */ + for (i = nargs - 1; i >= 0; i--) + if (args[i] == NULL) + goto fail; + + /* Allocate a new expression. */ + newp = (struct expression *) malloc (sizeof (*newp)); + if (newp != NULL) + { + newp->nargs = nargs; + newp->operation = op; + for (i = nargs - 1; i >= 0; i--) + newp->val.args[i] = args[i]; + return newp; + } + + fail: + for (i = nargs - 1; i >= 0; i--) + FREE_EXPRESSION (args[i]); + + return NULL; +} + +static inline struct expression * +new_exp_0 (op) + enum operator op; +{ + return new_exp (0, op, NULL); +} + +static inline struct expression * +new_exp_1 (op, right) + enum operator op; + struct expression *right; +{ + struct expression *args[1]; + + args[0] = right; + return new_exp (1, op, args); +} + +static struct expression * +new_exp_2 (op, left, right) + enum operator op; + struct expression *left; + struct expression *right; +{ + struct expression *args[2]; + + args[0] = left; + args[1] = right; + return new_exp (2, op, args); +} + +static inline struct expression * +new_exp_3 (op, bexp, tbranch, fbranch) + enum operator op; + struct expression *bexp; + struct expression *tbranch; + struct expression *fbranch; +{ + struct expression *args[3]; + + args[0] = bexp; + args[1] = tbranch; + args[2] = fbranch; + return new_exp (3, op, args); +} + +#include + +#ifndef __cplusplus +#ifndef __STDC__ +#define const +#endif +#endif + + + +#define YYFINAL 27 +#define YYFLAG -32768 +#define YYNTBASE 16 + +#define YYTRANSLATE(x) ((unsigned)(x) <= 261 ? yytranslate[x] : 18) + +static const char yytranslate[] = { 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 10, 2, 2, 2, 2, 5, 2, 14, + 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 12, 2, 2, + 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 6, 7, 8, 9, + 11 +}; + +#if YYDEBUG != 0 +static const short yyprhs[] = { 0, + 0, 2, 8, 12, 16, 20, 24, 28, 32, 35, + 37, 39 +}; + +static const short yyrhs[] = { 17, + 0, 17, 3, 17, 12, 17, 0, 17, 4, 17, + 0, 17, 5, 17, 0, 17, 6, 17, 0, 17, + 7, 17, 0, 17, 8, 17, 0, 17, 9, 17, + 0, 10, 17, 0, 13, 0, 11, 0, 14, 17, + 15, 0 +}; + +#endif + +#if YYDEBUG != 0 +static const short yyrline[] = { 0, + 174, 182, 186, 190, 194, 198, 202, 206, 210, 214, + 218, 223 +}; +#endif + + +#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) + +static const char * const yytname[] = { "$","error","$undefined.","'?'","'|'", +"'&'","EQUOP2","CMPOP2","ADDOP2","MULOP2","'!'","NUMBER","':'","'n'","'('","')'", +"start","exp", NULL +}; +#endif + +static const short yyr1[] = { 0, + 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17 +}; + +static const short yyr2[] = { 0, + 1, 5, 3, 3, 3, 3, 3, 3, 2, 1, + 1, 3 +}; + +static const short yydefact[] = { 0, + 0, 11, 10, 0, 1, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 12, 0, 3, 4, 5, 6, + 7, 8, 0, 2, 0, 0, 0 +}; + +static const short yydefgoto[] = { 25, + 5 +}; + +static const short yypact[] = { -9, + -9,-32768,-32768, -9, 34,-32768, 11, -9, -9, -9, + -9, -9, -9, -9,-32768, 24, 39, 43, 16, 26, + -3,-32768, -9, 34, 21, 53,-32768 +}; + +static const short yypgoto[] = {-32768, + -1 +}; + + +#define YYLAST 53 + + +static const short yytable[] = { 6, + 1, 2, 7, 3, 4, 14, 16, 17, 18, 19, + 20, 21, 22, 8, 9, 10, 11, 12, 13, 14, + 26, 24, 12, 13, 14, 15, 8, 9, 10, 11, + 12, 13, 14, 13, 14, 23, 8, 9, 10, 11, + 12, 13, 14, 10, 11, 12, 13, 14, 11, 12, + 13, 14, 27 +}; + +static const short yycheck[] = { 1, + 10, 11, 4, 13, 14, 9, 8, 9, 10, 11, + 12, 13, 14, 3, 4, 5, 6, 7, 8, 9, + 0, 23, 7, 8, 9, 15, 3, 4, 5, 6, + 7, 8, 9, 8, 9, 12, 3, 4, 5, 6, + 7, 8, 9, 5, 6, 7, 8, 9, 6, 7, + 8, 9, 0 +}; +#define YYPURE 1 + +/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ +#line 3 "/usr/local/share/bison.simple" +/* This file comes from bison-1.28. */ + +/* Skeleton output parser for bison, + Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. + + 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, 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. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* This is the parser code that is written into each bison parser + when the %semantic_parser declaration is not specified in the grammar. + It was written by Richard Stallman by simplifying the hairy parser + used when %semantic_parser is specified. */ + +#ifndef YYSTACK_USE_ALLOCA +#ifdef alloca +#define YYSTACK_USE_ALLOCA +#else /* alloca not defined */ +#ifdef __GNUC__ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#else /* not GNU C. */ +#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) +#define YYSTACK_USE_ALLOCA +#include +#else /* not sparc */ +/* We think this test detects Watcom and Microsoft C. */ +/* This used to test MSDOS, but that is a bad idea + since that symbol is in the user namespace. */ +#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) +#if 0 /* No need for malloc.h, which pollutes the namespace; + instead, just don't use alloca. */ +#include +#endif +#else /* not MSDOS, or __TURBOC__ */ +#if defined(_AIX) +/* I don't know what this was needed for, but it pollutes the namespace. + So I turned it off. rms, 2 May 1997. */ +/* #include */ + #pragma alloca +#define YYSTACK_USE_ALLOCA +#else /* not MSDOS, or __TURBOC__, or _AIX */ +#if 0 +#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up, + and on HPUX 10. Eventually we can turn this on. */ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#endif /* __hpux */ +#endif +#endif /* not _AIX */ +#endif /* not MSDOS, or __TURBOC__ */ +#endif /* not sparc */ +#endif /* not GNU C */ +#endif /* alloca not defined */ +#endif /* YYSTACK_USE_ALLOCA not defined */ + +#ifdef YYSTACK_USE_ALLOCA +#define YYSTACK_ALLOC alloca +#else +#define YYSTACK_ALLOC malloc +#endif + +/* Note: there must be only one dollar sign in this file. + It is replaced by the list of actions, each action + as one case of the switch. */ + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY -2 +#define YYEOF 0 +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrlab1 +/* Like YYERROR except do call yyerror. + This remains here temporarily to ease the + transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ +#define YYFAIL goto yyerrlab +#define YYRECOVERING() (!!yyerrstatus) +#define YYBACKUP(token, value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { yychar = (token), yylval = (value); \ + yychar1 = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { yyerror ("syntax error: cannot back up"); YYERROR; } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +#ifndef YYPURE +#define YYLEX yylex() +#endif + +#ifdef YYPURE +#ifdef YYLSP_NEEDED +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval, &yylloc) +#endif +#else /* not YYLSP_NEEDED */ +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval) +#endif +#endif /* not YYLSP_NEEDED */ +#endif + +/* If nonreentrant, generate the variables here */ + +#ifndef YYPURE + +int yychar; /* the lookahead symbol */ +YYSTYPE yylval; /* the semantic value of the */ + /* lookahead symbol */ + +#ifdef YYLSP_NEEDED +YYLTYPE yylloc; /* location data for the lookahead */ + /* symbol */ +#endif + +int yynerrs; /* number of parse errors so far */ +#endif /* not YYPURE */ + +#if YYDEBUG != 0 +int yydebug; /* nonzero means print parse trace */ +/* Since this is uninitialized, it does not stop multiple parsers + from coexisting. */ +#endif + +/* YYINITDEPTH indicates the initial size of the parser's stacks */ + +#ifndef YYINITDEPTH +#define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH is the maximum size the stacks can grow to + (effective only if the built-in stack extension method is used). */ + +#if YYMAXDEPTH == 0 +#undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 10000 +#endif + +/* Define __yy_memcpy. Note that the size argument + should be passed with type unsigned int, because that is what the non-GCC + definitions require. With GCC, __builtin_memcpy takes an arg + of type size_t, but it can handle unsigned int. */ + +#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ +#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) +#else /* not GNU C or C++ */ +#ifndef __cplusplus + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (to, from, count) + char *to; + char *from; + unsigned int count; +{ + register char *f = from; + register char *t = to; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#else /* __cplusplus */ + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (char *to, char *from, unsigned int count) +{ + register char *t = to; + register char *f = from; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#endif +#endif + +#line 217 "/usr/local/share/bison.simple" + +/* The user can define YYPARSE_PARAM as the name of an argument to be passed + into yyparse. The argument should have type void *. + It should actually point to an object. + Grammar actions can access the variable by casting it + to the proper pointer type. */ + +#ifdef YYPARSE_PARAM +#ifdef __cplusplus +#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM +#define YYPARSE_PARAM_DECL +#else /* not __cplusplus */ +#define YYPARSE_PARAM_ARG YYPARSE_PARAM +#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +#endif /* not __cplusplus */ +#else /* not YYPARSE_PARAM */ +#define YYPARSE_PARAM_ARG +#define YYPARSE_PARAM_DECL +#endif /* not YYPARSE_PARAM */ + +/* Prevent warning if -Wstrict-prototypes. */ +#ifdef __GNUC__ +#ifdef YYPARSE_PARAM +int yyparse (void *); +#else +int yyparse (void); +#endif +#endif + +int +yyparse(YYPARSE_PARAM_ARG) + YYPARSE_PARAM_DECL +{ + register int yystate; + register int yyn; + register short *yyssp; + register YYSTYPE *yyvsp; + int yyerrstatus; /* number of tokens to shift before error messages enabled */ + int yychar1 = 0; /* lookahead token as an internal (translated) token number */ + + short yyssa[YYINITDEPTH]; /* the state stack */ + YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + + short *yyss = yyssa; /* refer to the stacks thru separate pointers */ + YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ + +#ifdef YYLSP_NEEDED + YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp; + +#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) +#else +#define YYPOPSTACK (yyvsp--, yyssp--) +#endif + + int yystacksize = YYINITDEPTH; + int yyfree_stacks = 0; + +#ifdef YYPURE + int yychar; + YYSTYPE yylval; + int yynerrs; +#ifdef YYLSP_NEEDED + YYLTYPE yylloc; +#endif +#endif + + YYSTYPE yyval; /* the variable used to return */ + /* semantic values from the action */ + /* routines */ + + int yylen; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Starting parse\n"); +#endif + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss - 1; + yyvsp = yyvs; +#ifdef YYLSP_NEEDED + yylsp = yyls; +#endif + +/* Push a new state, which is found in yystate . */ +/* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. */ +yynewstate: + + *++yyssp = yystate; + + if (yyssp >= yyss + yystacksize - 1) + { + /* Give user a chance to reallocate the stack */ + /* Use copies of these so that the &'s don't force the real ones into memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; +#ifdef YYLSP_NEEDED + YYLTYPE *yyls1 = yyls; +#endif + + /* Get the current used size of the three stacks, in elements. */ + int size = yyssp - yyss + 1; + +#ifdef yyoverflow + /* Each stack pointer address is followed by the size of + the data in use in that stack, in bytes. */ +#ifdef YYLSP_NEEDED + /* This used to be a conditional around just the two extra args, + but that might be undefined if yyoverflow is a macro. */ + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yyls1, size * sizeof (*yylsp), + &yystacksize); +#else + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yystacksize); +#endif + + yyss = yyss1; yyvs = yyvs1; +#ifdef YYLSP_NEEDED + yyls = yyls1; +#endif +#else /* no yyoverflow */ + /* Extend the stack our own way. */ + if (yystacksize >= YYMAXDEPTH) + { + yyerror("parser stack overflow"); + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); +#endif + } + return 2; + } + yystacksize *= 2; + if (yystacksize > YYMAXDEPTH) + yystacksize = YYMAXDEPTH; +#ifndef YYSTACK_USE_ALLOCA + yyfree_stacks = 1; +#endif + yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); + __yy_memcpy ((char *)yyss, (char *)yyss1, + size * (unsigned int) sizeof (*yyssp)); + yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); + __yy_memcpy ((char *)yyvs, (char *)yyvs1, + size * (unsigned int) sizeof (*yyvsp)); +#ifdef YYLSP_NEEDED + yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); + __yy_memcpy ((char *)yyls, (char *)yyls1, + size * (unsigned int) sizeof (*yylsp)); +#endif +#endif /* no yyoverflow */ + + yyssp = yyss + size - 1; + yyvsp = yyvs + size - 1; +#ifdef YYLSP_NEEDED + yylsp = yyls + size - 1; +#endif + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Stack size increased to %d\n", yystacksize); +#endif + + if (yyssp >= yyss + yystacksize - 1) + YYABORT; + } + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Entering state %d\n", yystate); +#endif + + goto yybackup; + yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* yychar is either YYEMPTY or YYEOF + or a valid token in external form. */ + + if (yychar == YYEMPTY) + { +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Reading a token: "); +#endif + yychar = YYLEX; + } + + /* Convert token to internal form (in yychar1) for indexing tables with */ + + if (yychar <= 0) /* This means end of input. */ + { + yychar1 = 0; + yychar = YYEOF; /* Don't call YYLEX any more */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Now at end of input.\n"); +#endif + } + else + { + yychar1 = YYTRANSLATE(yychar); + +#if YYDEBUG != 0 + if (yydebug) + { + fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); + /* Give the individual parser a way to print the precise meaning + of a token, for further debugging info. */ +#ifdef YYPRINT + YYPRINT (stderr, yychar, yylval); +#endif + fprintf (stderr, ")\n"); + } +#endif + } + + yyn += yychar1; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + goto yydefault; + + yyn = yytable[yyn]; + + /* yyn is what to do for this token type in this state. + Negative => reduce, -yyn is rule number. + Positive => shift, yyn is new state. + New state is final state => don't bother to shift, + just return success. + 0, or most negative number => error. */ + + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrlab; + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); +#endif + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + + /* count tokens shifted since error; after three, turn off error status. */ + if (yyerrstatus) yyerrstatus--; + + yystate = yyn; + goto yynewstate; + +/* Do the default action for the current state. */ +yydefault: + + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + +/* Do a reduction. yyn is the number of a rule to reduce with. */ +yyreduce: + yylen = yyr2[yyn]; + if (yylen > 0) + yyval = yyvsp[1-yylen]; /* implement default value of the action */ + +#if YYDEBUG != 0 + if (yydebug) + { + int i; + + fprintf (stderr, "Reducing via rule %d (line %d), ", + yyn, yyrline[yyn]); + + /* Print the symbols being reduced, and their result. */ + for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) + fprintf (stderr, "%s ", yytname[yyrhs[i]]); + fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); + } +#endif + + + switch (yyn) { + +case 1: +#line 175 "plural.y" +{ + if (yyvsp[0].exp == NULL) + YYABORT; + ((struct parse_args *) arg)->res = yyvsp[0].exp; + ; + break;} +case 2: +#line 183 "plural.y" +{ + yyval.exp = new_exp_3 (qmop, yyvsp[-4].exp, yyvsp[-2].exp, yyvsp[0].exp); + ; + break;} +case 3: +#line 187 "plural.y" +{ + yyval.exp = new_exp_2 (lor, yyvsp[-2].exp, yyvsp[0].exp); + ; + break;} +case 4: +#line 191 "plural.y" +{ + yyval.exp = new_exp_2 (land, yyvsp[-2].exp, yyvsp[0].exp); + ; + break;} +case 5: +#line 195 "plural.y" +{ + yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); + ; + break;} +case 6: +#line 199 "plural.y" +{ + yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); + ; + break;} +case 7: +#line 203 "plural.y" +{ + yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); + ; + break;} +case 8: +#line 207 "plural.y" +{ + yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); + ; + break;} +case 9: +#line 211 "plural.y" +{ + yyval.exp = new_exp_1 (lnot, yyvsp[0].exp); + ; + break;} +case 10: +#line 215 "plural.y" +{ + yyval.exp = new_exp_0 (var); + ; + break;} +case 11: +#line 219 "plural.y" +{ + if ((yyval.exp = new_exp_0 (num)) != NULL) + yyval.exp->val.num = yyvsp[0].num; + ; + break;} +case 12: +#line 224 "plural.y" +{ + yyval.exp = yyvsp[-1].exp; + ; + break;} +} + /* the action file gets copied in in place of this dollarsign */ +#line 543 "/usr/local/share/bison.simple" + + yyvsp -= yylen; + yyssp -= yylen; +#ifdef YYLSP_NEEDED + yylsp -= yylen; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + + *++yyvsp = yyval; + +#ifdef YYLSP_NEEDED + yylsp++; + if (yylen == 0) + { + yylsp->first_line = yylloc.first_line; + yylsp->first_column = yylloc.first_column; + yylsp->last_line = (yylsp-1)->last_line; + yylsp->last_column = (yylsp-1)->last_column; + yylsp->text = 0; + } + else + { + yylsp->last_line = (yylsp+yylen-1)->last_line; + yylsp->last_column = (yylsp+yylen-1)->last_column; + } +#endif + + /* Now "shift" the result of the reduction. + Determine what state that goes to, + based on the state we popped back to + and the rule number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTBASE] + *yyssp; + if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTBASE]; + + goto yynewstate; + +yyerrlab: /* here on detecting error */ + + if (! yyerrstatus) + /* If not already recovering from an error, report this error. */ + { + ++yynerrs; + +#ifdef YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (yyn > YYFLAG && yyn < YYLAST) + { + int size = 0; + char *msg; + int x, count; + + count = 0; + /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + size += strlen(yytname[x]) + 15, count++; + msg = (char *) malloc(size + 15); + if (msg != 0) + { + strcpy(msg, "parse error"); + + if (count < 5) + { + count = 0; + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + { + strcat(msg, count == 0 ? ", expecting `" : " or `"); + strcat(msg, yytname[x]); + strcat(msg, "'"); + count++; + } + } + yyerror(msg); + free(msg); + } + else + yyerror ("parse error; also virtual memory exceeded"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror("parse error"); + } + + goto yyerrlab1; +yyerrlab1: /* here on error raised explicitly by an action */ + + if (yyerrstatus == 3) + { + /* if just tried and failed to reuse lookahead token after an error, discard it. */ + + /* return failure if at end of input */ + if (yychar == YYEOF) + YYABORT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); +#endif + + yychar = YYEMPTY; + } + + /* Else will try to reuse lookahead token + after shifting the error token. */ + + yyerrstatus = 3; /* Each real token shifted decrements this */ + + goto yyerrhandle; + +yyerrdefault: /* current state does not do anything special for the error token. */ + +#if 0 + /* This is wrong; only states that explicitly want error tokens + should shift them. */ + yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ + if (yyn) goto yydefault; +#endif + +yyerrpop: /* pop the current state because it cannot handle the error token */ + + if (yyssp == yyss) YYABORT; + yyvsp--; + yystate = *--yyssp; +#ifdef YYLSP_NEEDED + yylsp--; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "Error: state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + +yyerrhandle: + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yyerrdefault; + + yyn += YYTERROR; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) + goto yyerrdefault; + + yyn = yytable[yyn]; + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrpop; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrpop; + + if (yyn == YYFINAL) + YYACCEPT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting error token, "); +#endif + + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + + yystate = yyn; + goto yynewstate; + + yyacceptlab: + /* YYACCEPT comes here. */ + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); +#endif + } + return 0; + + yyabortlab: + /* YYABORT comes here. */ + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); +#endif + } + return 1; +} +#line 229 "plural.y" + + +void +internal_function +FREE_EXPRESSION (exp) + struct expression *exp; +{ + if (exp == NULL) + return; + + /* Handle the recursive case. */ + switch (exp->nargs) + { + case 3: + FREE_EXPRESSION (exp->val.args[2]); + /* FALLTHROUGH */ + case 2: + FREE_EXPRESSION (exp->val.args[1]); + /* FALLTHROUGH */ + case 1: + FREE_EXPRESSION (exp->val.args[0]); + /* FALLTHROUGH */ + default: + break; + } + + free (exp); +} + + +static int +yylex (lval, pexp) + YYSTYPE *lval; + const char **pexp; +{ + const char *exp = *pexp; + int result; + + while (1) + { + if (exp[0] == '\0') + { + *pexp = exp; + return YYEOF; + } + + if (exp[0] != ' ' && exp[0] != '\t') + break; + + ++exp; + } + + result = *exp++; + switch (result) + { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + { + unsigned long int n = result - '0'; + while (exp[0] >= '0' && exp[0] <= '9') + { + n *= 10; + n += exp[0] - '0'; + ++exp; + } + lval->num = n; + result = NUMBER; + } + break; + + case '=': + if (exp[0] == '=') + { + ++exp; + lval->op = equal; + result = EQUOP2; + } + else + result = YYERRCODE; + break; + + case '!': + if (exp[0] == '=') + { + ++exp; + lval->op = not_equal; + result = EQUOP2; + } + break; + + case '&': + case '|': + if (exp[0] == result) + ++exp; + else + result = YYERRCODE; + break; + + case '<': + if (exp[0] == '=') + { + ++exp; + lval->op = less_or_equal; + } + else + lval->op = less_than; + result = CMPOP2; + break; + + case '>': + if (exp[0] == '=') + { + ++exp; + lval->op = greater_or_equal; + } + else + lval->op = greater_than; + result = CMPOP2; + break; + + case '*': + lval->op = mult; + result = MULOP2; + break; + + case '/': + lval->op = divide; + result = MULOP2; + break; + + case '%': + lval->op = module; + result = MULOP2; + break; + + case '+': + lval->op = plus; + result = ADDOP2; + break; + + case '-': + lval->op = minus; + result = ADDOP2; + break; + + case 'n': + case '?': + case ':': + case '(': + case ')': + /* Nothing, just return the character. */ + break; + + case ';': + case '\n': + case '\0': + /* Be safe and let the user call this function again. */ + --exp; + result = YYEOF; + break; + + default: + result = YYERRCODE; +#if YYDEBUG != 0 + --exp; +#endif + break; + } + + *pexp = exp; + + return result; +} + + +static void +yyerror (str) + const char *str; +{ + /* Do nothing. We don't print error messages here. */ +} diff --git a/intl/plural.y b/intl/plural.y new file mode 100644 index 00000000..616b7c11 --- /dev/null +++ b/intl/plural.y @@ -0,0 +1,409 @@ +%{ +/* Expression parsing for plural form selection. + Copyright (C) 2000, 2001 Free Software Foundation, Inc. + Written by Ulrich Drepper , 2000. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +/* The bison generated parser uses alloca. AIX 3 forces us to put this + declaration at the beginning of the file. The declaration in bison's + skeleton file comes too late. This must come before + because may include arbitrary system headers. */ +#if defined _AIX && !defined __GNUC__ + #pragma alloca +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include "plural-exp.h" + +/* The main function generated by the parser is called __gettextparse, + but we want it to be called PLURAL_PARSE. */ +#ifndef _LIBC +# define __gettextparse PLURAL_PARSE +#endif + +#define YYLEX_PARAM &((struct parse_args *) arg)->cp +#define YYPARSE_PARAM arg +%} +%pure_parser +%expect 7 + +%union { + unsigned long int num; + enum operator op; + struct expression *exp; +} + +%{ +/* Prototypes for local functions. */ +static struct expression *new_exp PARAMS ((int nargs, enum operator op, + struct expression * const *args)); +static inline struct expression *new_exp_0 PARAMS ((enum operator op)); +static inline struct expression *new_exp_1 PARAMS ((enum operator op, + struct expression *right)); +static struct expression *new_exp_2 PARAMS ((enum operator op, + struct expression *left, + struct expression *right)); +static inline struct expression *new_exp_3 PARAMS ((enum operator op, + struct expression *bexp, + struct expression *tbranch, + struct expression *fbranch)); +static int yylex PARAMS ((YYSTYPE *lval, const char **pexp)); +static void yyerror PARAMS ((const char *str)); + +/* Allocation of expressions. */ + +static struct expression * +new_exp (nargs, op, args) + int nargs; + enum operator op; + struct expression * const *args; +{ + int i; + struct expression *newp; + + /* If any of the argument could not be malloc'ed, just return NULL. */ + for (i = nargs - 1; i >= 0; i--) + if (args[i] == NULL) + goto fail; + + /* Allocate a new expression. */ + newp = (struct expression *) malloc (sizeof (*newp)); + if (newp != NULL) + { + newp->nargs = nargs; + newp->operation = op; + for (i = nargs - 1; i >= 0; i--) + newp->val.args[i] = args[i]; + return newp; + } + + fail: + for (i = nargs - 1; i >= 0; i--) + FREE_EXPRESSION (args[i]); + + return NULL; +} + +static inline struct expression * +new_exp_0 (op) + enum operator op; +{ + return new_exp (0, op, NULL); +} + +static inline struct expression * +new_exp_1 (op, right) + enum operator op; + struct expression *right; +{ + struct expression *args[1]; + + args[0] = right; + return new_exp (1, op, args); +} + +static struct expression * +new_exp_2 (op, left, right) + enum operator op; + struct expression *left; + struct expression *right; +{ + struct expression *args[2]; + + args[0] = left; + args[1] = right; + return new_exp (2, op, args); +} + +static inline struct expression * +new_exp_3 (op, bexp, tbranch, fbranch) + enum operator op; + struct expression *bexp; + struct expression *tbranch; + struct expression *fbranch; +{ + struct expression *args[3]; + + args[0] = bexp; + args[1] = tbranch; + args[2] = fbranch; + return new_exp (3, op, args); +} + +%} + +/* This declares that all operators have the same associativity and the + precedence order as in C. See [Harbison, Steele: C, A Reference Manual]. + There is no unary minus and no bitwise operators. + Operators with the same syntactic behaviour have been merged into a single + token, to save space in the array generated by bison. */ +%right '?' /* ? */ +%left '|' /* || */ +%left '&' /* && */ +%left EQUOP2 /* == != */ +%left CMPOP2 /* < > <= >= */ +%left ADDOP2 /* + - */ +%left MULOP2 /* * / % */ +%right '!' /* ! */ + +%token EQUOP2 CMPOP2 ADDOP2 MULOP2 +%token NUMBER +%type exp + +%% + +start: exp + { + if ($1 == NULL) + YYABORT; + ((struct parse_args *) arg)->res = $1; + } + ; + +exp: exp '?' exp ':' exp + { + $$ = new_exp_3 (qmop, $1, $3, $5); + } + | exp '|' exp + { + $$ = new_exp_2 (lor, $1, $3); + } + | exp '&' exp + { + $$ = new_exp_2 (land, $1, $3); + } + | exp EQUOP2 exp + { + $$ = new_exp_2 ($2, $1, $3); + } + | exp CMPOP2 exp + { + $$ = new_exp_2 ($2, $1, $3); + } + | exp ADDOP2 exp + { + $$ = new_exp_2 ($2, $1, $3); + } + | exp MULOP2 exp + { + $$ = new_exp_2 ($2, $1, $3); + } + | '!' exp + { + $$ = new_exp_1 (lnot, $2); + } + | 'n' + { + $$ = new_exp_0 (var); + } + | NUMBER + { + if (($$ = new_exp_0 (num)) != NULL) + $$->val.num = $1; + } + | '(' exp ')' + { + $$ = $2; + } + ; + +%% + +void +internal_function +FREE_EXPRESSION (exp) + struct expression *exp; +{ + if (exp == NULL) + return; + + /* Handle the recursive case. */ + switch (exp->nargs) + { + case 3: + FREE_EXPRESSION (exp->val.args[2]); + /* FALLTHROUGH */ + case 2: + FREE_EXPRESSION (exp->val.args[1]); + /* FALLTHROUGH */ + case 1: + FREE_EXPRESSION (exp->val.args[0]); + /* FALLTHROUGH */ + default: + break; + } + + free (exp); +} + + +static int +yylex (lval, pexp) + YYSTYPE *lval; + const char **pexp; +{ + const char *exp = *pexp; + int result; + + while (1) + { + if (exp[0] == '\0') + { + *pexp = exp; + return YYEOF; + } + + if (exp[0] != ' ' && exp[0] != '\t') + break; + + ++exp; + } + + result = *exp++; + switch (result) + { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + { + unsigned long int n = result - '0'; + while (exp[0] >= '0' && exp[0] <= '9') + { + n *= 10; + n += exp[0] - '0'; + ++exp; + } + lval->num = n; + result = NUMBER; + } + break; + + case '=': + if (exp[0] == '=') + { + ++exp; + lval->op = equal; + result = EQUOP2; + } + else + result = YYERRCODE; + break; + + case '!': + if (exp[0] == '=') + { + ++exp; + lval->op = not_equal; + result = EQUOP2; + } + break; + + case '&': + case '|': + if (exp[0] == result) + ++exp; + else + result = YYERRCODE; + break; + + case '<': + if (exp[0] == '=') + { + ++exp; + lval->op = less_or_equal; + } + else + lval->op = less_than; + result = CMPOP2; + break; + + case '>': + if (exp[0] == '=') + { + ++exp; + lval->op = greater_or_equal; + } + else + lval->op = greater_than; + result = CMPOP2; + break; + + case '*': + lval->op = mult; + result = MULOP2; + break; + + case '/': + lval->op = divide; + result = MULOP2; + break; + + case '%': + lval->op = module; + result = MULOP2; + break; + + case '+': + lval->op = plus; + result = ADDOP2; + break; + + case '-': + lval->op = minus; + result = ADDOP2; + break; + + case 'n': + case '?': + case ':': + case '(': + case ')': + /* Nothing, just return the character. */ + break; + + case ';': + case '\n': + case '\0': + /* Be safe and let the user call this function again. */ + --exp; + result = YYEOF; + break; + + default: + result = YYERRCODE; +#if YYDEBUG != 0 + --exp; +#endif + break; + } + + *pexp = exp; + + return result; +} + + +static void +yyerror (str) + const char *str; +{ + /* Do nothing. We don't print error messages here. */ +} diff --git a/intl/ref-add.sin b/intl/ref-add.sin new file mode 100644 index 00000000..167374e3 --- /dev/null +++ b/intl/ref-add.sin @@ -0,0 +1,31 @@ +# Add this package to a list of references stored in a text file. +# +# Copyright (C) 2000 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library 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. +# +# Written by Bruno Haible . +# +/^# Packages using this file: / { + s/# Packages using this file:// + ta + :a + s/ @PACKAGE@ / @PACKAGE@ / + tb + s/ $/ @PACKAGE@ / + :b + s/^/# Packages using this file:/ +} diff --git a/intl/ref-del.sin b/intl/ref-del.sin new file mode 100644 index 00000000..613cf37f --- /dev/null +++ b/intl/ref-del.sin @@ -0,0 +1,26 @@ +# Remove this package from a list of references stored in a text file. +# +# Copyright (C) 2000 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library 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. +# +# Written by Bruno Haible . +# +/^# Packages using this file: / { + s/# Packages using this file:// + s/ @PACKAGE@ / / + s/^/# Packages using this file:/ +} diff --git a/intl/textdomain.c b/intl/textdomain.c new file mode 100644 index 00000000..f259c696 --- /dev/null +++ b/intl/textdomain.c @@ -0,0 +1,142 @@ +/* Implementation of the textdomain(3) function. + Copyright (C) 1995-1998, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif +#include "gettextP.h" + +#ifdef _LIBC +/* We have to handle multi-threaded applications. */ +# include +#else +/* Provide dummy implementation if this is outside glibc. */ +# define __libc_rwlock_define(CLASS, NAME) +# define __libc_rwlock_wrlock(NAME) +# define __libc_rwlock_unlock(NAME) +#endif + +/* The internal variables in the standalone libintl.a must have different + names than the internal variables in GNU libc, otherwise programs + using libintl.a cannot be linked statically. */ +#if !defined _LIBC +# define _nl_default_default_domain libintl_nl_default_default_domain +# define _nl_current_default_domain libintl_nl_current_default_domain +#endif + +/* @@ end of prolog @@ */ + +/* Name of the default text domain. */ +extern const char _nl_default_default_domain[] attribute_hidden; + +/* Default text domain in which entries for gettext(3) are to be found. */ +extern const char *_nl_current_default_domain attribute_hidden; + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define TEXTDOMAIN __textdomain +# ifndef strdup +# define strdup(str) __strdup (str) +# endif +#else +# define TEXTDOMAIN libintl_textdomain +#endif + +/* Lock variable to protect the global data in the gettext implementation. */ +__libc_rwlock_define (extern, _nl_state_lock attribute_hidden) + +/* Set the current default message catalog to DOMAINNAME. + If DOMAINNAME is null, return the current default. + If DOMAINNAME is "", reset to the default of "messages". */ +char * +TEXTDOMAIN (domainname) + const char *domainname; +{ + char *new_domain; + char *old_domain; + + /* A NULL pointer requests the current setting. */ + if (domainname == NULL) + return (char *) _nl_current_default_domain; + + __libc_rwlock_wrlock (_nl_state_lock); + + old_domain = (char *) _nl_current_default_domain; + + /* If domain name is the null string set to default domain "messages". */ + if (domainname[0] == '\0' + || strcmp (domainname, _nl_default_default_domain) == 0) + { + _nl_current_default_domain = _nl_default_default_domain; + new_domain = (char *) _nl_current_default_domain; + } + else if (strcmp (domainname, old_domain) == 0) + /* This can happen and people will use it to signal that some + environment variable changed. */ + new_domain = old_domain; + else + { + /* If the following malloc fails `_nl_current_default_domain' + will be NULL. This value will be returned and so signals we + are out of core. */ +#if defined _LIBC || defined HAVE_STRDUP + new_domain = strdup (domainname); +#else + size_t len = strlen (domainname) + 1; + new_domain = (char *) malloc (len); + if (new_domain != NULL) + memcpy (new_domain, domainname, len); +#endif + + if (new_domain != NULL) + _nl_current_default_domain = new_domain; + } + + /* We use this possibility to signal a change of the loaded catalogs + since this is most likely the case and there is no other easy we + to do it. Do it only when the call was successful. */ + if (new_domain != NULL) + { + ++_nl_msg_cat_cntr; + + if (old_domain != new_domain && old_domain != _nl_default_default_domain) + free (old_domain); + } + + __libc_rwlock_unlock (_nl_state_lock); + + return new_domain; +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__textdomain, textdomain); +#endif diff --git a/m4/build-tools.m4 b/m4/build-tools.m4 new file mode 100644 index 00000000..26b1d76c --- /dev/null +++ b/m4/build-tools.m4 @@ -0,0 +1,100 @@ +# This file is part of the aMule project. -*- Autoconf -*- +# +# This package has been tested with GNU Autoconf 2.59, and not guaranteed to +# work with any other version. However, you only need to worry about it if +# you're cross-compiling. + +# _AC_CHECK_BUILD_PREFIX +# ----------------------- +# Checks and sets the build prefix, if it is given by --build. +AC_DEFUN([_AC_CHECK_BUILD_PREFIX], +[ac_build_prefix= +test -n "$build_alias" && ac_build_prefix=$build_alias- +]) # AC_CHECK_BUILD_PREFIX + + +# AC_PROG_BUILD_CC([COMPILER ...]) +# -------------------------- +# COMPILER ... is a space separated list of C compilers to search for. +# This just gives the user an opportunity to specify an alternative +# search list for the C compiler. +# +# IMPORTANT: Run all other compiler tests *before* calling this macro! +# +# This is a stripped-down check, it checks only what we need, +# i.e. BUILD_CC and BUILD_EXEEXT +# +AC_DEFUN([AC_PROG_BUILD_CC], +[AC_REQUIRE([_AC_CHECK_BUILD_PREFIX])dnl +dnl Set new names of important variables. +pushdef([ac_tool_prefix], [ac_build_prefix])dnl +pushdef([CC], [BUILD_CC])dnl +pushdef([EXEEXT], [BUILD_EXEEXT])dnl +pushdef([ac_cv_exeext], [ac_cv_build_exeext])dnl +pushdef([ac_exeext], [ac_build_exeext])dnl +dnl Don't use the values for the cross-compiler +pushdef([CPPFLAGS], [BUILD_CPPFLAGS])dnl +pushdef([CFLAGS], [BUILD_CFLAGS])dnl +pushdef([LDFLAGS], [BUILD_LDFLAGS])dnl +pushdef([LIBS], [BUILD_LIBS])dnl + +# Even if we're cross-compiling, we want a compiler here +# that is not a cross-compiler. +saved_cross=$cross_compiling +cross_compiling=no + +dnl From now on, this is just a mere copy of Autoconf's AC_PROG_CC macro. +AC_LANG_PUSH(C)dnl +m4_ifval([$1], + [AC_CHECK_TOOLS(CC, [$1])], +[AC_CHECK_TOOL(CC, gcc) +if test -z "$CC"; then + AC_CHECK_TOOL(CC, cc) +fi +if test -z "$CC"; then + AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc) +fi +if test -z "$CC"; then + AC_CHECK_TOOLS(CC, cl) +fi +]) + +test -z "$CC" && AC_MSG_FAILURE([no acceptable C compiler found in \$PATH]) + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for _AC_LANG compiler version" >&AS_MESSAGE_LOG_FD +ac_compiler=`set X $ac_compile; echo $[2]` +_AC_EVAL([$ac_compiler --version &AS_MESSAGE_LOG_FD]) +_AC_EVAL([$ac_compiler -v &AS_MESSAGE_LOG_FD]) +_AC_EVAL([$ac_compiler -V &AS_MESSAGE_LOG_FD]) + +dnl Forcibly include _AC_COMPILER_EXEEXT, to determine the build exeext. +_AC_COMPILER_EXEEXT +dnl End of copy, here some parts are stripped out. We only want a working C +dnl compiler, and doesn't need the objext, the preprocessor, the dependency +dnl style, whether it's gnu or not, etc. + +# Restore configuration environment +cross_compiling=$saved_cross + +dnl Restore variable names. +popdef([LIBS])dnl +popdef([LDFLAGS])dnl +popdef([CFLAGS])dnl +popdef([CPPFLAGS])dnl +popdef([ac_exeext])dnl +popdef([ac_cv_exeext])dnl +popdef([EXEEXT])dnl +popdef([CC])dnl +popdef([ac_tool_prefix])dnl +dnl +dnl AC_LANG_POP(C) must be called after the variable names are restored, thus +dnl it will restore the correct (host) environment, not the build environment. +AC_LANG_POP(C)dnl +dnl Substitute variables for the build compiler +AC_SUBST(BUILD_EXEEXT)dnl +AC_SUBST(BUILD_CPPFLAGS)dnl +AC_SUBST(BUILD_CFLAGS)dnl +AC_SUBST(BUILD_LDFLAGS)dnl +]) # AC_PROG_BUILD_CC diff --git a/m4/codeset.m4 b/m4/codeset.m4 new file mode 100644 index 00000000..59535ebc --- /dev/null +++ b/m4/codeset.m4 @@ -0,0 +1,23 @@ +# codeset.m4 serial AM1 (gettext-0.10.40) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([AM_LANGINFO_CODESET], +[ + AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, + [AC_TRY_LINK([#include ], + [char* cs = nl_langinfo(CODESET);], + am_cv_langinfo_codeset=yes, + am_cv_langinfo_codeset=no) + ]) + if test $am_cv_langinfo_codeset = yes; then + AC_DEFINE(HAVE_LANGINFO_CODESET, 1, + [Define if you have and nl_langinfo(CODESET).]) + fi +]) diff --git a/m4/cryptopp.m4 b/m4/cryptopp.m4 new file mode 100644 index 00000000..6cdf109d --- /dev/null +++ b/m4/cryptopp.m4 @@ -0,0 +1,158 @@ +dnl -------------------------------------------------------------------------- +dnl Add cryptopp configure option +dnl -------------------------------------------------------------------------- +dnl +dnl This macro sets and substitutes these variables: +AC_DEFUN([AM_OPTIONS_CRYPTO], [ + AC_ARG_WITH( + [crypto-prefix], + [AS_HELP_STRING( + [--with-crypto-prefix=PREFIX], + [prefix where crypto++ is installed])], + [CRYPTO_PP_PREFIX="$withval"], + [CRYPTO_PP_PREFIX=""]) +]) + + +dnl -------------------------------------------------------------------------- +dnl Check for cryptopp library +dnl -------------------------------------------------------------------------- +dnl +dnl This macro sets and substitutes these variables: +dnl - CRYPTO_PP_PREFIX +dnl This is the user or system directory where cryptopp is installed or sources +dnl - CRYPTO_PP_VERSION_STRING +dnl Something like "5.5.2" +dnl - CRYPTO_PP_VERSION_NUMBER +dnl Something like 5005002 +dnl - CRYPTO_PP_STYLE +dnl "sources", "installed" or "gentoo_debian" +dnl - CRYPTO_PP_LIB_NAME +dnl "cryptopp" or "crypto++" +dnl - CRYPTO_PP_INCLUDE_PREFIX +dnl The string that goes here: #include <@CRYPTO_PP_INCLUDE_PREFIX@/rsa.h> +dnl - CRYPTO_PP_CXXFLAGS +dnl Flags to be added to CXXFLAGS +dnl - CRYPTO_PP_LDFLAGS +dnl Flags to be added to LDFLAGS +dnl +dnl Worth notice: +dnl - crypto_pp_include_i +dnl The string that goes in -I or -isystem on CXXFLAGS +dnl - crypto_pp_header_path +dnl The file we use to discover the version of cryptopp +dnl +AC_DEFUN([CHECK_CRYPTO], [ + +min_crypto_version=ifelse([$1], ,5.1,$1) +AC_MSG_CHECKING([for crypto++ version >= $min_crypto_version]) + +crypto_pp_file_with_version="cryptlib.h" + +CRYPTO_PP_STYLE="unknown" +CRYPTO_PP_LIB_NAME="unknown" +crypto_pp_include_i="unknown" +CRYPTO_PP_INCLUDE_PREFIX="unknown" +CRYPTO_PP_DEFINE="unknown" +CRYPTO_PP_LIB="unknown" + +# +# Set CRYPTO_PP_PREFIX if the user has not set it in the configure command line +# We don't use AC_CHECK_FILE to avoid caching. +# +if test x$CRYPTO_PP_PREFIX = x ; then + CRYPTO_PP_PREFIX="/usr" +fi + +# +# Find the Cryptopp header +# +if test -f $CRYPTO_PP_PREFIX/$crypto_pp_file_with_version; then + CRYPTO_PP_STYLE="sources" + CRYPTO_PP_LIB_NAME="cryptopp" + crypto_pp_include_i="$CRYPTO_PP_PREFIX" + CRYPTO_PP_INCLUDE_PREFIX="." + CRYPTO_PP_DEFINE="__CRYPTO_SOURCE__" + CRYPTO_PP_LIB="$CRYPTO_PP_PREFIX" + AC_MSG_ERROR([ + Specifying the cryptopp source files directory for "--with-crypto-prefix=" + will not work because cryptopp uses headers with the same name of system + headers (e.g. zlib.h) and you must be able to distinguish the system + headers from cryptopp headers in an #include directive. + Please run "PREFIX=/home/YourUserName/usr/cryptopp make install" on + the cryptopp directory to properly install cryptopp in your system.]) +elif test -f $CRYPTO_PP_PREFIX/include/cryptopp/$crypto_pp_file_with_version; then + CRYPTO_PP_STYLE="installed" + CRYPTO_PP_LIB_NAME="cryptopp" + crypto_pp_include_i="$CRYPTO_PP_PREFIX/include" + CRYPTO_PP_INCLUDE_PREFIX="$CRYPTO_PP_LIB_NAME" + CRYPTO_PP_DEFINE="__CRYPTO_INSTALLED__" + CRYPTO_PP_LIB="$CRYPTO_PP_PREFIX/lib" +elif test -f $CRYPTO_PP_PREFIX/include/crypto++/$crypto_pp_file_with_version; then + # Debian uses libcrypto++5.1 - it's not my fault, please soda patch the package + CRYPTO_PP_STYLE="gentoo_debian" + CRYPTO_PP_LIB_NAME="crypto++" + crypto_pp_include_i="$CRYPTO_PP_PREFIX/include" + CRYPTO_PP_INCLUDE_PREFIX="$CRYPTO_PP_LIB_NAME" + CRYPTO_PP_DEFINE="__CRYPTO_SOURCE__" + CRYPTO_PP_LIB="$CRYPTO_PP_PREFIX/lib" +fi + +# +# Check for success in finding cryptopp +# +if test $CRYPTO_PP_STYLE = "unknown"; then + # + # If the execution reaches here, we have failed. + # + AC_MSG_ERROR([ + Could not find cryptopp header file "$crypto_pp_file_with_version". + Please check if the path "$CRYPTO_PP_PREFIX" is valid.]) +fi + +# +# Find out the cryptopp version and check against the minimum required +# +crypto_pp_include_dir="$crypto_pp_include_i/$CRYPTO_PP_INCLUDE_PREFIX" +crypto_pp_header_path="$crypto_pp_include_dir/$crypto_pp_file_with_version" + +CRYPTO_PP_VERSION_STRING=$(grep "Reference Manual" $crypto_pp_header_path | \ + sed -e ['s/[^0-9]*\([0-9.]*\).*/\1/']) + +CRYPTO_PP_VERSION_NUMBER=$(echo $CRYPTO_PP_VERSION_STRING | \ + $AWK 'BEGIN { FS = "."; } { printf "%d", ([$]1 * 1000 + [$]2) * 1000 + [$]3;}') + +minvers=$(echo $min_crypto_version | \ + $AWK 'BEGIN { FS = "."; } { printf "%d", ([$]1 * 1000 + [$]2) * 1000 + [$]3;}') + +if test -n "$CRYPTO_PP_VERSION_NUMBER" && test "$CRYPTO_PP_VERSION_NUMBER" -ge $minvers; then + result="yes (version $CRYPTO_PP_VERSION_STRING, $CRYPTO_PP_STYLE)" +else + result="no" +fi +AC_MSG_RESULT([$result]) + +# +# FLAGS +# +CRYPTO_PP_CXXFLAGS="-isystem $crypto_pp_include_i -D$CRYPTO_PP_DEFINE" +CRYPTO_PP_LDFLAGS="-L$CRYPTO_PP_LIB" +AH_TEMPLATE([CRYPTOPP_INCLUDE_PREFIX], [Define this to the include prefix of crypto++]) +AC_DEFINE_UNQUOTED([CRYPTOPP_INCLUDE_PREFIX], $CRYPTO_PP_INCLUDE_PREFIX) + +# +# Exported symbols +# +AC_SUBST([CRYPTO_PP_PREFIX]) +AC_SUBST([CRYPTO_PP_VERSION_STRING]) +AC_SUBST([CRYPTO_PP_VERSION_NUMBER]) + +AC_SUBST([CRYPTO_PP_STYLE]) +AC_SUBST([CRYPTO_PP_LIB_NAME]) +AC_SUBST([CRYPTO_PP_INCLUDE_PREFIX]) +AC_SUBST([CRYPTO_PP_CXXFLAGS]) +AC_SUBST([CRYPTO_PP_LDFLAGS]) + +AC_MSG_NOTICE([Crypto++ version number is $CRYPTO_PP_VERSION_NUMBER]) +]) + diff --git a/m4/gdlib.m4 b/m4/gdlib.m4 new file mode 100644 index 00000000..295050da --- /dev/null +++ b/m4/gdlib.m4 @@ -0,0 +1,126 @@ +dnl --------------------------------------------------------------------------- +dnl AM_OPTIONS_GDLIBCONFIG +dnl +dnl adds support for --gdlib-prefix and --gdlib-config +dnl command line options +dnl --------------------------------------------------------------------------- + +AC_DEFUN([AM_OPTIONS_GDLIBCONFIG], +[ + AC_ARG_WITH( + [gdlib-prefix], + [AS_HELP_STRING( + [--with-gdlib-prefix=PREFIX], + [prefix where gdlib is installed (optional)])], + [gdlib_config_prefix="$withval"], + [gdlib_config_prefix=""]) + AC_ARG_WITH( + [gdlib-config], + [AS_HELP_STRING( + [--with-gdlib-config=CONFIG], + [gdlib-config script to use (optional)])], + [gdlib_config_name="$withval"], + [gdlib_config_name=""]) +]) + +dnl --------------------------------------------------------------------------- +dnl AM_PATH_GDLIBCONFIG([VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl +dnl Test for gdlib, and define GDLIB*FLAGS, GDLIB_LIBS and GDLIB_CONFIG_NAME +dnl environment variable to override the default name of the gdlib-config script +dnl to use. Set GDLIB_CONFIG_PATH to specify the full path to gdlib-config - +dnl in this case the macro won't even waste time on tests for its existence. +dnl --------------------------------------------------------------------------- +AC_DEFUN([AM_PATH_GDLIBCONFIG], +[AC_REQUIRE([AM_OPTIONS_GDLIBCONFIG])dnl +m4_define([REQUIRED_VERSION], [ifelse([$1],, [2.0.0], [$1])])dnl +m4_define([REQUIRED_VERSION_MAJOR], [m4_bregexp(REQUIRED_VERSION, [\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)], [\1])])dnl +m4_define([REQUIRED_VERSION_MINOR], [m4_bregexp(REQUIRED_VERSION, [\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)], [\2])])dnl +m4_define([REQUIRED_VERSION_MICRO], [m4_bregexp(REQUIRED_VERSION, [\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)], [\3])])dnl + + dnl do we have gdlib-config name: it can be gdlib-config or gd-config or ... + if test x${GDLIB_CONFIG_NAME+set} != xset ; then + GDLIB_CONFIG_NAME=gdlib-config + fi + if test "x$gdlib_config_name" != x ; then + GDLIB_CONFIG_NAME="$gdlib_config_name" + fi + + dnl deal with optional prefix + if test x$gdlib_config_prefix != x ; then + GDLIB_LOOKUP_PATH="$gdlib_config_prefix/bin" + fi + + dnl don't search the PATH if GDLIB_CONFIG_NAME is absolute filename + if test -x "$GDLIB_CONFIG_NAME" ; then + AC_MSG_CHECKING(for gdlib-config) + GDLIB_CONFIG_PATH="$GDLIB_CONFIG_NAME" + AC_MSG_RESULT($GDLIB_CONFIG_PATH) + else + AC_PATH_PROG(GDLIB_CONFIG_PATH, $GDLIB_CONFIG_NAME, no, "$GDLIB_LOOKUP_PATH:$PATH") + fi + + if test "$GDLIB_CONFIG_PATH" != "no" ; then + GDLIB_VERSION="" + + AC_MSG_CHECKING([for gdlib version >= REQUIRED_VERSION]) + + GDLIB_CONFIG_WITH_ARGS="$GDLIB_CONFIG_PATH $gdlib_config_args" + + GDLIB_VERSION=`$GDLIB_CONFIG_WITH_ARGS --version` + gdlib_config_major_version=`echo $GDLIB_VERSION | sed ['s/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1/']` + gdlib_config_minor_version=`echo $GDLIB_VERSION | sed ['s/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\2/']` + gdlib_config_micro_version=`echo $GDLIB_VERSION | sed ['s/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\3/']` + + gdlib_ver_ok="" + if test $gdlib_config_major_version -gt REQUIRED_VERSION_MAJOR; then + gdlib_ver_ok=yes + else + if test $gdlib_config_major_version -eq REQUIRED_VERSION_MAJOR; then + if test $gdlib_config_minor_version -gt REQUIRED_VERSION_MINOR; then + gdlib_ver_ok=yes + else + if test $gdlib_config_minor_version -eq REQUIRED_VERSION_MINOR; then + if test $gdlib_config_micro_version -ge REQUIRED_VERSION_MICRO; then + gdlib_ver_ok=yes + fi + fi + fi + fi + fi + + if test x$gdlib_ver_ok = x ; then + if test x$GDLIB_VERSION = x; then + dnl no gdlib-config at all + AC_MSG_RESULT([no]) + else + AC_MSG_RESULT([no (version $GDLIB_VERSION is not new enough)]) + GDLIB_VERSION= + fi + $3 + else + AC_MSG_RESULT([yes (version $GDLIB_VERSION)]) + AC_CHECK_HEADER([gd.h]) + if test $ac_cv_header_gd_h = yes; then + GDLIB_CFLAGS="`$GDLIB_CONFIG_WITH_ARGS --cflags`" + GDLIB_LDFLAGS="`$GDLIB_CONFIG_WITH_ARGS --ldflags`" + GDLIB_LIBS="`$GDLIB_CONFIG_WITH_ARGS --libs`" + $2 + else + GDLIB_VERSION= + $3 + fi + fi + else + ifelse([$3],, :, [$3]) + fi + +AC_SUBST(GDLIB_CFLAGS)dnl +AC_SUBST(GDLIB_LDFLAGS)dnl +AC_SUBST(GDLIB_LIBS)dnl + +m4_undefine([REQUIRED_VERSION])dnl +m4_undefine([REQUIRED_VERSION_MAJOR])dnl +m4_undefine([REQUIRED_VERSION_MINOR])dnl +m4_undefine([REQUIRED_VERSION_MICRO])dnl +]) diff --git a/m4/gettext.m4 b/m4/gettext.m4 new file mode 100644 index 00000000..45cad855 --- /dev/null +++ b/m4/gettext.m4 @@ -0,0 +1,587 @@ +# gettext.m4 serial 17 (gettext-0.11.5) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2002. + +dnl Macro to add for using GNU gettext. + +dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). +dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The +dnl default (if it is not specified or empty) is 'no-libtool'. +dnl INTLSYMBOL should be 'external' for packages with no intl directory, +dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. +dnl If INTLSYMBOL is 'use-libtool', then a libtool library +dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, +dnl depending on --{enable,disable}-{shared,static} and on the presence of +dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library +dnl $(top_builddir)/intl/libintl.a will be created. +dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext +dnl implementations (in libc or libintl) without the ngettext() function +dnl will be ignored. If NEEDSYMBOL is specified and is +dnl 'need-formatstring-macros', then GNU gettext implementations that don't +dnl support the ISO C 99 formatstring macros will be ignored. +dnl INTLDIR is used to find the intl libraries. If empty, +dnl the value `$(top_builddir)/intl/' is used. +dnl +dnl The result of the configuration is one of three cases: +dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled +dnl and used. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 2) GNU gettext has been found in the system's C library. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 3) No internationalization, always use English msgid. +dnl Catalog format: none +dnl Catalog extension: none +dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. +dnl The use of .gmo is historical (it was needed to avoid overwriting the +dnl GNU format catalogs when building on a platform with an X/Open gettext), +dnl but we keep it in order not to force irrelevant filename changes on the +dnl maintainers. +dnl +AC_DEFUN([AM_GNU_GETTEXT], +[ + dnl Argument checking. + ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , + [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT +])])])])]) + ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , + [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT +])])])]) + define(gt_included_intl, ifelse([$1], [external], [no], [yes])) + define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], [])) + + AC_REQUIRE([AM_PO_SUBDIRS])dnl + ifelse(gt_included_intl, yes, [ + AC_REQUIRE([AM_INTL_SUBDIR])dnl + ]) + + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Sometimes libintl requires libiconv, so first search for libiconv. + dnl Ideally we would do this search only after the + dnl if test "$USE_NLS" = "yes"; then + dnl if test "$gt_cv_func_gnugettext_libc" != "yes"; then + dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT + dnl the configure script would need to contain the same shell code + dnl again, outside any 'if'. There are two solutions: + dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. + dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. + dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not + dnl documented, we avoid it. + ifelse(gt_included_intl, yes, , [ + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + ]) + + AC_MSG_CHECKING([whether NLS is requested]) + dnl Default is enabled NLS + AC_ARG_ENABLE(nls, + [ --disable-nls do not use Native Language Support], + USE_NLS=$enableval, USE_NLS=yes) + AC_MSG_RESULT($USE_NLS) + AC_SUBST(USE_NLS) + + ifelse(gt_included_intl, yes, [ + BUILD_INCLUDED_LIBINTL=no + USE_INCLUDED_LIBINTL=no + ]) + LIBINTL= + LTLIBINTL= + POSUB= + + dnl If we use NLS figure out what method + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + ifelse(gt_included_intl, yes, [ + AC_MSG_CHECKING([whether included gettext is requested]) + AC_ARG_WITH(included-gettext, + [ --with-included-gettext use the GNU gettext library included here], + nls_cv_force_use_gnu_gettext=$withval, + nls_cv_force_use_gnu_gettext=no) + AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + ]) + dnl User does not insist on using GNU NLS library. Figure out what + dnl to use. If GNU gettext is available we use this. Else we have + dnl to fall back to GNU NLS library. + + dnl Add a version number to the cache macros. + define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1))) + define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc]) + define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl]) + + AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc, + [AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings;], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings], + gt_cv_func_gnugettext_libc=yes, + gt_cv_func_gnugettext_libc=no)]) + + if test "$gt_cv_func_gnugettext_libc" != "yes"; then + dnl Sometimes libintl requires libiconv, so first search for libiconv. + ifelse(gt_included_intl, yes, , [ + AM_ICONV_LINK + ]) + dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL + dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) + dnl because that would add "-liconv" to LIBINTL and LTLIBINTL + dnl even if libiconv doesn't exist. + AC_LIB_LINKFLAGS_BODY([intl]) + AC_CACHE_CHECK([for GNU gettext in libintl], + gt_cv_func_gnugettext_libintl, + [gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + dnl Now see whether libintl exists and does not depend on libiconv. + AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias ();], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], + gt_cv_func_gnugettext_libintl=yes, + gt_cv_func_gnugettext_libintl=no) + dnl Now see whether libintl exists and depends on libiconv. + if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias ();], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], + [LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + gt_cv_func_gnugettext_libintl=yes + ]) + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS"]) + fi + + dnl If an already present or preinstalled GNU gettext() is found, + dnl use it. But if this macro is used in GNU gettext, and GNU + dnl gettext is already preinstalled in libintl, we update this + dnl libintl. (Cf. the install rule in intl/Makefile.in.) + if test "$gt_cv_func_gnugettext_libc" = "yes" \ + || { test "$gt_cv_func_gnugettext_libintl" = "yes" \ + && test "$PACKAGE" != gettext; }; then + gt_use_preinstalled_gnugettext=yes + else + dnl Reset the values set by searching for libintl. + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + ifelse(gt_included_intl, yes, [ + if test "$gt_use_preinstalled_gnugettext" != "yes"; then + dnl GNU gettext is not found in the C library. + dnl Fall back on included GNU gettext library. + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions used to generate GNU NLS library. + INTLOBJS="\$(GETTOBJS)" + BUILD_INCLUDED_LIBINTL=yes + USE_INCLUDED_LIBINTL=yes + LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV" + LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV" + LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` + fi + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions to use GNU gettext tools. + CATOBJEXT=.gmo + fi + ]) + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + AC_DEFINE(ENABLE_NLS, 1, + [Define to 1 if translation of program messages to the user's native language + is requested.]) + else + USE_NLS=no + fi + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext_libintl" = "yes"; then + AC_MSG_CHECKING([how to link with libintl]) + AC_MSG_RESULT([$LIBINTL]) + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) + fi + + dnl For backward compatibility. Some packages may be using this. + AC_DEFINE(HAVE_GETTEXT, 1, + [Define if the GNU gettext() function is already present or preinstalled.]) + AC_DEFINE(HAVE_DCGETTEXT, 1, + [Define if the GNU dcgettext() function is already present or preinstalled.]) + fi + + dnl We need to process the po/ directory. + POSUB=po + fi + + ifelse(gt_included_intl, yes, [ + dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL + dnl to 'yes' because some of the testsuite requires it. + if test "$PACKAGE" = gettext; then + BUILD_INCLUDED_LIBINTL=yes + fi + + dnl Make all variables we use known to autoconf. + AC_SUBST(BUILD_INCLUDED_LIBINTL) + AC_SUBST(USE_INCLUDED_LIBINTL) + AC_SUBST(CATOBJEXT) + AC_SUBST(INTLOBJS) + + dnl For backward compatibility. Some configure.ins may be using this. + nls_cv_header_intl= + nls_cv_header_libgt= + + dnl For backward compatibility. Some Makefiles may be using this. + DATADIRNAME=share + AC_SUBST(DATADIRNAME) + + dnl For backward compatibility. Some Makefiles may be using this. + INSTOBJEXT=.mo + AC_SUBST(INSTOBJEXT) + + dnl For backward compatibility. Some Makefiles may be using this. + GENCAT=gencat + AC_SUBST(GENCAT) + + dnl Enable libtool support if the surrounding package wishes it. + INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix + AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) + ]) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLLIBS="$LIBINTL" + AC_SUBST(INTLLIBS) + + dnl Make all documented variables known to autoconf. + AC_SUBST(LIBINTL) + AC_SUBST(LTLIBINTL) + AC_SUBST(POSUB) +]) + + +dnl Checks for all prerequisites of the po subdirectory, +dnl except for USE_NLS. +AC_DEFUN([AM_PO_SUBDIRS], +[ + AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_MKINSTALLDIRS])dnl + + dnl Perform the following tests also if --disable-nls has been given, + dnl because they are needed for "make dist" to work. + + dnl Search for GNU msgfmt in the PATH. + dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. + dnl The second test excludes FreeBSD msgfmt. + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + dnl Search for GNU xgettext 0.11 or newer in the PATH. + dnl The first test excludes Solaris xgettext and early GNU xgettext versions. + dnl The second test excludes FreeBSD xgettext. + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [$ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + + dnl Search for GNU msgmerge 0.11 or newer in the PATH. + AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, + [$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :) + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU msgfmt. + if test "$GMSGFMT" != ":"; then + dnl If it is no GNU msgfmt we define it as : so that the + dnl Makefiles still can work. + if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && + (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` + AC_MSG_RESULT( + [found $GMSGFMT program is not GNU msgfmt; ignore it]) + GMSGFMT=":" + fi + fi + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && + (if $XGETTEXT --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + AC_MSG_RESULT( + [found xgettext program is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + fi + + AC_OUTPUT_COMMANDS([ + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + fi + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + GMOFILES= + UPDATEPOFILES= + DUMMYPOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done], + [# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it + # from automake. + eval 'ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + ]) +]) + + +dnl Checks for all prerequisites of the intl subdirectory, +dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, +dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. +AC_DEFUN([AM_INTL_SUBDIR], +[ + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_MKINSTALLDIRS])dnl + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([AC_ISC_POSIX])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_C_CONST])dnl + AC_REQUIRE([AC_C_INLINE])dnl + AC_REQUIRE([AC_TYPE_OFF_T])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + AC_REQUIRE([jm_GLIBC21])dnl + AC_REQUIRE([gt_INTDIV0])dnl + AC_REQUIRE([jm_AC_TYPE_UINTMAX_T])dnl + AC_REQUIRE([gt_HEADER_INTTYPES_H])dnl + AC_REQUIRE([gt_INTTYPES_PRI])dnl + + AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ +stdlib.h string.h unistd.h sys/param.h]) + AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \ +geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \ +strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next]) + + AM_ICONV + AM_LANGINFO_CODESET + if test $ac_cv_header_locale_h = yes; then + AM_LC_MESSAGES + fi + + dnl intl/plural.c is generated from intl/plural.y. It requires bison, + dnl because plural.y uses bison specific features. It requires at least + dnl bison-1.26 because earlier versions generate a plural.c that doesn't + dnl compile. + dnl bison is only needed for the maintainer (who touches plural.y). But in + dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put + dnl the rule in general Makefile. Now, some people carelessly touch the + dnl files or have a broken "make" program, hence the plural.c rule will + dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not + dnl present or too old. + AC_CHECK_PROGS([INTLBISON], [bison]) + if test -z "$INTLBISON"; then + ac_verc_fail=yes + else + dnl Found it, now check the version. + AC_MSG_CHECKING([version of bison]) +changequote(<<,>>)dnl + ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; + 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) +changequote([,])dnl + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; + esac + AC_MSG_RESULT([$ac_prog_version]) + fi + if test $ac_verc_fail = yes; then + INTLBISON=: + fi +]) + + +AC_DEFUN([AM_MKINSTALLDIRS], +[ + dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly + dnl find the mkinstalldirs script in another subdir but $(top_srcdir). + dnl Try to locate is. + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + AC_SUBST(MKINSTALLDIRS) +]) + + +dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) +AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) diff --git a/m4/gettext.m4~ b/m4/gettext.m4~ new file mode 100644 index 00000000..d779926e --- /dev/null +++ b/m4/gettext.m4~ @@ -0,0 +1,587 @@ +# gettext.m4 serial 17 (gettext-0.11.5) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2002. + +dnl Macro to add for using GNU gettext. + +dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). +dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The +dnl default (if it is not specified or empty) is 'no-libtool'. +dnl INTLSYMBOL should be 'external' for packages with no intl directory, +dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. +dnl If INTLSYMBOL is 'use-libtool', then a libtool library +dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, +dnl depending on --{enable,disable}-{shared,static} and on the presence of +dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library +dnl $(top_builddir)/intl/libintl.a will be created. +dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext +dnl implementations (in libc or libintl) without the ngettext() function +dnl will be ignored. If NEEDSYMBOL is specified and is +dnl 'need-formatstring-macros', then GNU gettext implementations that don't +dnl support the ISO C 99 formatstring macros will be ignored. +dnl INTLDIR is used to find the intl libraries. If empty, +dnl the value `$(top_builddir)/intl/' is used. +dnl +dnl The result of the configuration is one of three cases: +dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled +dnl and used. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 2) GNU gettext has been found in the system's C library. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 3) No internationalization, always use English msgid. +dnl Catalog format: none +dnl Catalog extension: none +dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. +dnl The use of .gmo is historical (it was needed to avoid overwriting the +dnl GNU format catalogs when building on a platform with an X/Open gettext), +dnl but we keep it in order not to force irrelevant filename changes on the +dnl maintainers. +dnl +AC_DEFUN([AM_GNU_GETTEXT], +[ + dnl Argument checking. + ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , + [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT +])])])])]) + ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , + [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT +])])])]) + define(gt_included_intl, ifelse([$1], [external], [no], [yes])) + define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], [])) + + AC_REQUIRE([AM_PO_SUBDIRS])dnl + ifelse(gt_included_intl, yes, [ + AC_REQUIRE([AM_INTL_SUBDIR])dnl + ]) + + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Sometimes libintl requires libiconv, so first search for libiconv. + dnl Ideally we would do this search only after the + dnl if test "$USE_NLS" = "yes"; then + dnl if test "$gt_cv_func_gnugettext_libc" != "yes"; then + dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT + dnl the configure script would need to contain the same shell code + dnl again, outside any 'if'. There are two solutions: + dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. + dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. + dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not + dnl documented, we avoid it. + ifelse(gt_included_intl, yes, , [ + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + ]) + + AC_MSG_CHECKING([whether NLS is requested]) + dnl Default is enabled NLS + AC_ARG_ENABLE(nls, + [ --disable-nls do not use Native Language Support], + USE_NLS=$enableval, USE_NLS=yes) + AC_MSG_RESULT($USE_NLS) + AC_SUBST(USE_NLS) + + ifelse(gt_included_intl, yes, [ + BUILD_INCLUDED_LIBINTL=no + USE_INCLUDED_LIBINTL=no + ]) + LIBINTL= + LTLIBINTL= + POSUB= + + dnl If we use NLS figure out what method + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + ifelse(gt_included_intl, yes, [ + AC_MSG_CHECKING([whether included gettext is requested]) + AC_ARG_WITH(included-gettext, + [ --with-included-gettext use the GNU gettext library included here], + nls_cv_force_use_gnu_gettext=$withval, + nls_cv_force_use_gnu_gettext=no) + AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + ]) + dnl User does not insist on using GNU NLS library. Figure out what + dnl to use. If GNU gettext is available we use this. Else we have + dnl to fall back to GNU NLS library. + + dnl Add a version number to the cache macros. + define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1))) + define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc]) + define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl]) + + AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc, + [AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings;], + [bindtextdomain ("", ""); +return (long) gettext ("")]ifelse([$2], [need-ngettext], [ + (long) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings], + gt_cv_func_gnugettext_libc=yes, + gt_cv_func_gnugettext_libc=no)]) + + if test "$gt_cv_func_gnugettext_libc" != "yes"; then + dnl Sometimes libintl requires libiconv, so first search for libiconv. + ifelse(gt_included_intl, yes, , [ + AM_ICONV_LINK + ]) + dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL + dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) + dnl because that would add "-liconv" to LIBINTL and LTLIBINTL + dnl even if libiconv doesn't exist. + AC_LIB_LINKFLAGS_BODY([intl]) + AC_CACHE_CHECK([for GNU gettext in libintl], + gt_cv_func_gnugettext_libintl, + [gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + dnl Now see whether libintl exists and does not depend on libiconv. + AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias ();], + [bindtextdomain ("", ""); +return (long) gettext ("")]ifelse([$2], [need-ngettext], [ + (long) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], + gt_cv_func_gnugettext_libintl=yes, + gt_cv_func_gnugettext_libintl=no) + dnl Now see whether libintl exists and depends on libiconv. + if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias ();], + [bindtextdomain ("", ""); +return (long) gettext ("")]ifelse([$2], [need-ngettext], [ + (long) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], + [LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + gt_cv_func_gnugettext_libintl=yes + ]) + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS"]) + fi + + dnl If an already present or preinstalled GNU gettext() is found, + dnl use it. But if this macro is used in GNU gettext, and GNU + dnl gettext is already preinstalled in libintl, we update this + dnl libintl. (Cf. the install rule in intl/Makefile.in.) + if test "$gt_cv_func_gnugettext_libc" = "yes" \ + || { test "$gt_cv_func_gnugettext_libintl" = "yes" \ + && test "$PACKAGE" != gettext; }; then + gt_use_preinstalled_gnugettext=yes + else + dnl Reset the values set by searching for libintl. + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + ifelse(gt_included_intl, yes, [ + if test "$gt_use_preinstalled_gnugettext" != "yes"; then + dnl GNU gettext is not found in the C library. + dnl Fall back on included GNU gettext library. + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions used to generate GNU NLS library. + INTLOBJS="\$(GETTOBJS)" + BUILD_INCLUDED_LIBINTL=yes + USE_INCLUDED_LIBINTL=yes + LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV" + LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV" + LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` + fi + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions to use GNU gettext tools. + CATOBJEXT=.gmo + fi + ]) + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + AC_DEFINE(ENABLE_NLS, 1, + [Define to 1 if translation of program messages to the user's native language + is requested.]) + else + USE_NLS=no + fi + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext_libintl" = "yes"; then + AC_MSG_CHECKING([how to link with libintl]) + AC_MSG_RESULT([$LIBINTL]) + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) + fi + + dnl For backward compatibility. Some packages may be using this. + AC_DEFINE(HAVE_GETTEXT, 1, + [Define if the GNU gettext() function is already present or preinstalled.]) + AC_DEFINE(HAVE_DCGETTEXT, 1, + [Define if the GNU dcgettext() function is already present or preinstalled.]) + fi + + dnl We need to process the po/ directory. + POSUB=po + fi + + ifelse(gt_included_intl, yes, [ + dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL + dnl to 'yes' because some of the testsuite requires it. + if test "$PACKAGE" = gettext; then + BUILD_INCLUDED_LIBINTL=yes + fi + + dnl Make all variables we use known to autoconf. + AC_SUBST(BUILD_INCLUDED_LIBINTL) + AC_SUBST(USE_INCLUDED_LIBINTL) + AC_SUBST(CATOBJEXT) + AC_SUBST(INTLOBJS) + + dnl For backward compatibility. Some configure.ins may be using this. + nls_cv_header_intl= + nls_cv_header_libgt= + + dnl For backward compatibility. Some Makefiles may be using this. + DATADIRNAME=share + AC_SUBST(DATADIRNAME) + + dnl For backward compatibility. Some Makefiles may be using this. + INSTOBJEXT=.mo + AC_SUBST(INSTOBJEXT) + + dnl For backward compatibility. Some Makefiles may be using this. + GENCAT=gencat + AC_SUBST(GENCAT) + + dnl Enable libtool support if the surrounding package wishes it. + INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix + AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) + ]) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLLIBS="$LIBINTL" + AC_SUBST(INTLLIBS) + + dnl Make all documented variables known to autoconf. + AC_SUBST(LIBINTL) + AC_SUBST(LTLIBINTL) + AC_SUBST(POSUB) +]) + + +dnl Checks for all prerequisites of the po subdirectory, +dnl except for USE_NLS. +AC_DEFUN([AM_PO_SUBDIRS], +[ + AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_MKINSTALLDIRS])dnl + + dnl Perform the following tests also if --disable-nls has been given, + dnl because they are needed for "make dist" to work. + + dnl Search for GNU msgfmt in the PATH. + dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. + dnl The second test excludes FreeBSD msgfmt. + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + dnl Search for GNU xgettext 0.11 or newer in the PATH. + dnl The first test excludes Solaris xgettext and early GNU xgettext versions. + dnl The second test excludes FreeBSD xgettext. + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [$ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + + dnl Search for GNU msgmerge 0.11 or newer in the PATH. + AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, + [$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :) + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU msgfmt. + if test "$GMSGFMT" != ":"; then + dnl If it is no GNU msgfmt we define it as : so that the + dnl Makefiles still can work. + if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && + (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` + AC_MSG_RESULT( + [found $GMSGFMT program is not GNU msgfmt; ignore it]) + GMSGFMT=":" + fi + fi + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && + (if $XGETTEXT --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + AC_MSG_RESULT( + [found xgettext program is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + fi + + AC_OUTPUT_COMMANDS([ + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + fi + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + GMOFILES= + UPDATEPOFILES= + DUMMYPOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done], + [# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it + # from automake. + eval 'ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + ]) +]) + + +dnl Checks for all prerequisites of the intl subdirectory, +dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, +dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. +AC_DEFUN([AM_INTL_SUBDIR], +[ + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_MKINSTALLDIRS])dnl + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([AC_ISC_POSIX])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_C_CONST])dnl + AC_REQUIRE([AC_C_INLINE])dnl + AC_REQUIRE([AC_TYPE_OFF_T])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + AC_REQUIRE([jm_GLIBC21])dnl + AC_REQUIRE([gt_INTDIV0])dnl + AC_REQUIRE([jm_AC_TYPE_UINTMAX_T])dnl + AC_REQUIRE([gt_HEADER_INTTYPES_H])dnl + AC_REQUIRE([gt_INTTYPES_PRI])dnl + + AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ +stdlib.h string.h unistd.h sys/param.h]) + AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \ +geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \ +strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next]) + + AM_ICONV + AM_LANGINFO_CODESET + if test $ac_cv_header_locale_h = yes; then + AM_LC_MESSAGES + fi + + dnl intl/plural.c is generated from intl/plural.y. It requires bison, + dnl because plural.y uses bison specific features. It requires at least + dnl bison-1.26 because earlier versions generate a plural.c that doesn't + dnl compile. + dnl bison is only needed for the maintainer (who touches plural.y). But in + dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put + dnl the rule in general Makefile. Now, some people carelessly touch the + dnl files or have a broken "make" program, hence the plural.c rule will + dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not + dnl present or too old. + AC_CHECK_PROGS([INTLBISON], [bison]) + if test -z "$INTLBISON"; then + ac_verc_fail=yes + else + dnl Found it, now check the version. + AC_MSG_CHECKING([version of bison]) +changequote(<<,>>)dnl + ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; + 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) +changequote([,])dnl + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; + esac + AC_MSG_RESULT([$ac_prog_version]) + fi + if test $ac_verc_fail = yes; then + INTLBISON=: + fi +]) + + +AC_DEFUN([AM_MKINSTALLDIRS], +[ + dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly + dnl find the mkinstalldirs script in another subdir but $(top_srcdir). + dnl Try to locate is. + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + AC_SUBST(MKINSTALLDIRS) +]) + + +dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) +AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) diff --git a/m4/glibc21.m4 b/m4/glibc21.m4 new file mode 100644 index 00000000..9c9f3db3 --- /dev/null +++ b/m4/glibc21.m4 @@ -0,0 +1,32 @@ +# glibc21.m4 serial 2 (fileutils-4.1.3, gettext-0.10.40) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +# Test for the GNU C Library, version 2.1 or newer. +# From Bruno Haible. + +AC_DEFUN([jm_GLIBC21], + [ + AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, + ac_cv_gnu_library_2_1, + [AC_EGREP_CPP([Lucky GNU user], + [ +#include +#ifdef __GNU_LIBRARY__ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) + Lucky GNU user + #endif +#endif + ], + ac_cv_gnu_library_2_1=yes, + ac_cv_gnu_library_2_1=no) + ] + ) + AC_SUBST(GLIBC21) + GLIBC21="$ac_cv_gnu_library_2_1" + ] +) diff --git a/m4/iconv.m4 b/m4/iconv.m4 new file mode 100644 index 00000000..c5f35798 --- /dev/null +++ b/m4/iconv.m4 @@ -0,0 +1,103 @@ +# iconv.m4 serial AM4 (gettext-0.11.3) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], +[ + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([iconv]) +]) + +AC_DEFUN([AM_ICONV_LINK], +[ + dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and + dnl those with the standalone portable GNU libiconv installed). + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + + dnl Add $INCICONV to CPPFLAGS before performing the following checks, + dnl because if the user has installed libiconv and not disabled its use + dnl via --without-libiconv-prefix, he wants to use it. The first + dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. + am_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) + + AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_func_iconv=yes) + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_lib_iconv=yes + am_cv_func_iconv=yes) + LIBS="$am_save_LIBS" + fi + ]) + if test "$am_cv_func_iconv" = yes; then + AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) + fi + if test "$am_cv_lib_iconv" = yes; then + AC_MSG_CHECKING([how to link with libiconv]) + AC_MSG_RESULT([$LIBICONV]) + else + dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV + dnl either. + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + AC_SUBST(LIBICONV) + AC_SUBST(LTLIBICONV) +]) + +AC_DEFUN([AM_ICONV], +[ + AM_ICONV_LINK + if test "$am_cv_func_iconv" = yes; then + AC_MSG_CHECKING([for iconv declaration]) + AC_CACHE_VAL(am_cv_proto_iconv, [ + AC_TRY_COMPILE([ +#include +#include +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif +], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) + am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + AC_MSG_RESULT([$]{ac_t:- + }[$]am_cv_proto_iconv) + AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, + [Define as const if the declaration of iconv() needs const.]) + fi +]) diff --git a/m4/intdiv0.m4 b/m4/intdiv0.m4 new file mode 100644 index 00000000..55dddcf1 --- /dev/null +++ b/m4/intdiv0.m4 @@ -0,0 +1,72 @@ +# intdiv0.m4 serial 1 (gettext-0.11.3) +dnl Copyright (C) 2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([gt_INTDIV0], +[ + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + + AC_CACHE_CHECK([whether integer division by zero raises SIGFPE], + gt_cv_int_divbyzero_sigfpe, + [ + AC_TRY_RUN([ +#include +#include + +static void +#ifdef __cplusplus +sigfpe_handler (int sig) +#else +sigfpe_handler (sig) int sig; +#endif +{ + /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ + exit (sig != SIGFPE); +} + +int x = 1; +int y = 0; +int z; +int nan; + +int main () +{ + signal (SIGFPE, sigfpe_handler); +/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */ +#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP) + signal (SIGTRAP, sigfpe_handler); +#endif +/* Linux/SPARC yields signal SIGILL. */ +#if defined (__sparc__) && defined (__linux__) + signal (SIGILL, sigfpe_handler); +#endif + + z = x / y; + nan = y / y; + exit (1); +} +], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no, + [ + # Guess based on the CPU. + case "$host_cpu" in + alpha* | i[34567]86 | m68k | s390*) + gt_cv_int_divbyzero_sigfpe="guessing yes";; + *) + gt_cv_int_divbyzero_sigfpe="guessing no";; + esac + ]) + ]) + case "$gt_cv_int_divbyzero_sigfpe" in + *yes) value=1;; + *) value=0;; + esac + AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value, + [Define if integer division by zero raises signal SIGFPE.]) +]) diff --git a/m4/inttypes-pri.m4 b/m4/inttypes-pri.m4 new file mode 100644 index 00000000..fd007c31 --- /dev/null +++ b/m4/inttypes-pri.m4 @@ -0,0 +1,32 @@ +# inttypes-pri.m4 serial 1 (gettext-0.11.4) +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +# Define PRI_MACROS_BROKEN if exists and defines the PRI* +# macros to non-string values. This is the case on AIX 4.3.3. + +AC_DEFUN([gt_INTTYPES_PRI], +[ + AC_REQUIRE([gt_HEADER_INTTYPES_H]) + if test $gt_cv_header_inttypes_h = yes; then + AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken], + gt_cv_inttypes_pri_broken, + [ + AC_TRY_COMPILE([#include +#ifdef PRId32 +char *p = PRId32; +#endif +], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes) + ]) + fi + if test "$gt_cv_inttypes_pri_broken" = yes; then + AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1, + [Define if exists and defines unusable PRI* macros.]) + fi +]) diff --git a/m4/inttypes.m4 b/m4/inttypes.m4 new file mode 100644 index 00000000..ab370ffe --- /dev/null +++ b/m4/inttypes.m4 @@ -0,0 +1,27 @@ +# inttypes.m4 serial 1 (gettext-0.11.4) +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_INTTYPES_H if exists and doesn't clash with +# . + +AC_DEFUN([gt_HEADER_INTTYPES_H], +[ + AC_CACHE_CHECK([for inttypes.h], gt_cv_header_inttypes_h, + [ + AC_TRY_COMPILE( + [#include +#include ], + [], gt_cv_header_inttypes_h=yes, gt_cv_header_inttypes_h=no) + ]) + if test $gt_cv_header_inttypes_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H, 1, + [Define if exists and doesn't clash with .]) + fi +]) diff --git a/m4/inttypes_h.m4 b/m4/inttypes_h.m4 new file mode 100644 index 00000000..400a1118 --- /dev/null +++ b/m4/inttypes_h.m4 @@ -0,0 +1,28 @@ +# inttypes_h.m4 serial 4 (gettext-0.11.4) +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_INTTYPES_H_WITH_UINTMAX if exists, +# doesn't clash with , and declares uintmax_t. + +AC_DEFUN([jm_AC_HEADER_INTTYPES_H], +[ + AC_CACHE_CHECK([for inttypes.h], jm_ac_cv_header_inttypes_h, + [AC_TRY_COMPILE( + [#include +#include ], + [uintmax_t i = (uintmax_t) -1;], + jm_ac_cv_header_inttypes_h=yes, + jm_ac_cv_header_inttypes_h=no)]) + if test $jm_ac_cv_header_inttypes_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1, +[Define if exists, doesn't clash with , + and declares uintmax_t. ]) + fi +]) diff --git a/m4/isc-posix.m4 b/m4/isc-posix.m4 new file mode 100644 index 00000000..1319dd1c --- /dev/null +++ b/m4/isc-posix.m4 @@ -0,0 +1,26 @@ +# isc-posix.m4 serial 2 (gettext-0.11.2) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +# This file is not needed with autoconf-2.53 and newer. Remove it in 2005. + +# This test replaces the one in autoconf. +# Currently this macro should have the same name as the autoconf macro +# because gettext's gettext.m4 (distributed in the automake package) +# still uses it. Otherwise, the use in gettext.m4 makes autoheader +# give these diagnostics: +# configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX +# configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX + +undefine([AC_ISC_POSIX]) + +AC_DEFUN([AC_ISC_POSIX], + [ + dnl This test replaces the obsolescent AC_ISC_POSIX kludge. + AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"]) + ] +) diff --git a/m4/lcmessage.m4 b/m4/lcmessage.m4 new file mode 100644 index 00000000..ffd4008b --- /dev/null +++ b/m4/lcmessage.m4 @@ -0,0 +1,32 @@ +# lcmessage.m4 serial 3 (gettext-0.11.3) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995. + +# Check whether LC_MESSAGES is available in . + +AC_DEFUN([AM_LC_MESSAGES], +[ + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, + [Define if your file defines LC_MESSAGES.]) + fi +]) diff --git a/m4/lib-ld.m4 b/m4/lib-ld.m4 new file mode 100644 index 00000000..ddb57323 --- /dev/null +++ b/m4/lib-ld.m4 @@ -0,0 +1,97 @@ +# lib-ld.m4 serial 1 (gettext-0.11) +dnl Copyright (C) 1996-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl Subroutines of libtool.m4, +dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision +dnl with libtool.m4. + +dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. +AC_DEFUN([AC_LIB_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + acl_cv_prog_gnu_ld=yes +else + acl_cv_prog_gnu_ld=no +fi]) +with_gnu_ld=$acl_cv_prog_gnu_ld +]) + +dnl From libtool-1.4. Sets the variable LD. +AC_DEFUN([AC_LIB_PROG_LD], +[AC_ARG_WITH(gnu-ld, +[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], +test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]* | [A-Za-z]:[\\/]*)] + [re_direlt='/[^/][^/]*/\.\./'] + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(acl_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$acl_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_LIB_PROG_LD_GNU +]) diff --git a/m4/lib-link.m4 b/m4/lib-link.m4 new file mode 100644 index 00000000..6b942510 --- /dev/null +++ b/m4/lib-link.m4 @@ -0,0 +1,554 @@ +# lib-link.m4 serial 3 (gettext-0.11.3) +dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and +dnl augments the CPPFLAGS variable. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + undefine([Name]) + undefine([NAME]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. If found, it +dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and +dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + LIBS="$LIBS $LIB[]NAME" + AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + undefine([Name]) + undefine([NAME]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, +dnl hardcode_direct, hardcode_minus_L, +dnl sys_lib_search_path_spec, sys_lib_dlsearch_path_spec. +AC_DEFUN([AC_LIB_RPATH], +[ + AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS + AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host + AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir + AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + ]) + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + sys_lib_search_path_spec="$acl_cv_sys_lib_search_path_spec" + sys_lib_dlsearch_path_spec="$acl_cv_sys_lib_dlsearch_path_spec" + dnl Determine whether the user wants rpath handling at all. + AC_ARG_ENABLE(rpath, + [ --disable-rpath do not hardcode runtime library paths], + :, enable_rpath=yes) +]) + +dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_ARG_WITH([lib$1-prefix], +[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib + --without-lib$1-prefix don't search for lib$1 in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi +]) + dnl Search the library and its dependencies in $additional_libdir and + dnl $LDFLAGS. Using breadth-first-seach. + LIB[]NAME= + LTLIB[]NAME= + INC[]NAME= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='$1 $2' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + dnl See if it was already located by an earlier AC_LIB_LINKFLAGS + dnl or AC_LIB_HAVE_LINKFLAGS call. + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" + else + dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined + dnl that this library doesn't exist. So just drop it. + : + fi + else + dnl Search the library lib$name in $additional_libdir and $LDFLAGS + dnl and the already constructed $LIBNAME/$LTLIBNAME. + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + dnl Found the library. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + dnl Linking with a shared library. We attempt to hardcode its + dnl directory into the executable's runpath, unless it's the + dnl standard /usr/lib. + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + dnl No hardcoding is needed. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + dnl The hardcoding into $LIBNAME is system dependent. + if test "$hardcode_direct" = yes; then + dnl Using DIR/libNAME.so during linking hardcodes DIR into the + dnl resulting binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + dnl Rely on "-L$found_dir". + dnl But don't add it if it's already contained in the LDFLAGS + dnl or the already constructed $LIBNAME + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH + dnl here, because this doesn't fit in flags passed to the + dnl compiler. So give up. No hardcoding. This affects only + dnl very old systems. + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + dnl Linking with a static library. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" + else + dnl We shouldn't come here, but anyway it's good to have a + dnl fallback. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" + fi + fi + dnl Assume the include files are nearby. + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + dnl Potentially add $additional_includedir to $INCNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's /usr/local/include and we are using GCC on Linux, + dnl 3. if it's already present in $CPPFLAGS or the already + dnl constructed $INCNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INC[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $INCNAME. + INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + dnl Look for dependencies. + if test -n "$found_la"; then + dnl Read the .la file. It defines the variables + dnl dlname, library_names, old_library, dependency_libs, current, + dnl age, revision, installed, dlopen, dlpreopen, libdir. + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + dnl We use only dependency_libs. + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's /usr/local/lib and we are using GCC on Linux, + dnl 3. if it's already present in $LDFLAGS or the already + dnl constructed $LIBNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LIBNAME. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LTLIBNAME. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + dnl Handle this in the next round. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + dnl Handle this in the next round. Throw away the .la's + dnl directory; it is already contained in a preceding -L + dnl option. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + dnl Most likely an immediate library name. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" + ;; + esac + done + fi + else + dnl Didn't find the library; assume it is in the system directories + dnl known to the linker and runtime loader. (All the system + dnl directories known to the linker should also be known to the + dnl runtime loader, otherwise the system is severely misconfigured.) + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user must + dnl pass all path elements in one option. We can arrange that for a + dnl single library, but not when more than one $LIBNAMEs are used. + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + else + dnl The -rpath options are cumulative. + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) diff --git a/m4/lib-prefix.m4 b/m4/lib-prefix.m4 new file mode 100644 index 00000000..b8b79ab9 --- /dev/null +++ b/m4/lib-prefix.m4 @@ -0,0 +1,148 @@ +# lib-prefix.m4 serial 1 (gettext-0.11) +dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed +dnl to access previously installed libraries. The basic assumption is that +dnl a user will want packages to use other packages he previously installed +dnl with the same --prefix option. +dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate +dnl libraries, but is otherwise very convenient. +AC_DEFUN([AC_LIB_PREFIX], +[ + AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_ARG_WITH([lib-prefix], +[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib + --without-lib-prefix don't search for libraries in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi +]) + if test $use_additional = yes; then + dnl Potentially add $additional_includedir to $CPPFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's already present in $CPPFLAGS, + dnl 3. if it's /usr/local/include and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + for x in $CPPFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $CPPFLAGS. + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" + fi + fi + fi + fi + dnl Potentially add $additional_libdir to $LDFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's already present in $LDFLAGS, + dnl 3. if it's /usr/local/lib and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + for x in $LDFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LDFLAGS. + LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" + fi + fi + fi + fi + fi +]) + +dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, +dnl acl_final_exec_prefix, containing the values to which $prefix and +dnl $exec_prefix will expand at the end of the configure script. +AC_DEFUN([AC_LIB_PREPARE_PREFIX], +[ + dnl Unfortunately, prefix and exec_prefix get only finally determined + dnl at the end of configure. + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the +dnl variables prefix and exec_prefix bound to the values they will have +dnl at the end of the configure script. +AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], +[ + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + $1 + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" +]) diff --git a/m4/libpng.m4 b/m4/libpng.m4 new file mode 100644 index 00000000..1829cc43 --- /dev/null +++ b/m4/libpng.m4 @@ -0,0 +1,184 @@ +dnl --------------------------------------------------------------------------- +dnl AM_OPTIONS_LIBPNG_CONFIG +dnl +dnl adds support for --libpng-prefix and --libpng-config +dnl command line options +dnl --------------------------------------------------------------------------- + +AC_DEFUN([AM_OPTIONS_LIBPNGCONFIG], +[ + AC_ARG_WITH( + [libpng-prefix], + [AS_HELP_STRING( + [--with-libpng-prefix=PREFIX], + [prefix where libpng is installed (optional)])], + [libpng_config_prefix="$withval"], + [libpng_config_prefix=""]) + AC_ARG_WITH( + [libpng-config], + [AS_HELP_STRING( + [--with-libpng-config=CONFIG], + [libpng-config script to use (optional)])], + [libpng_config_name="$withval"], + [libpng_config_name=""]) +]) + +dnl --------------------------------------------------------------------------- +dnl AM_PATH_LIBPNGCONFIG([VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl +dnl Test for libpng, and define LIBPNG*FLAGS, LIBPNG_LIBS and LIBPNG_CONFIG_NAME +dnl environment variable to override the default name of the libpng-config script +dnl to use. Set LIBPNG_CONFIG_PATH to specify the full path to libpng-config - +dnl in this case the macro won't even waste time on tests for its existence. +dnl --------------------------------------------------------------------------- +AC_DEFUN([AM_PATH_LIBPNGCONFIG], +[AC_REQUIRE([AM_OPTIONS_LIBPNGCONFIG])dnl +m4_define([REQUIRED_VERSION], [ifelse([$1],, [1.2.0], [$1])])dnl +m4_define([REQUIRED_VERSION_MAJOR], [m4_bregexp(REQUIRED_VERSION, [\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)], [\1])])dnl +m4_define([REQUIRED_VERSION_MINOR], [m4_bregexp(REQUIRED_VERSION, [\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)], [\2])])dnl +m4_define([REQUIRED_VERSION_MICRO], [m4_bregexp(REQUIRED_VERSION, [\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)], [\3])])dnl + + dnl do we have libpng-config name: it can be libpng-config or libpng12-config or ... + if test x${LIBPNG_CONFIG_NAME+set} != xset ; then + LIBPNG_CONFIG_NAME=libpng-config + fi + if test "x$libpng_config_name" != x ; then + LIBPNG_CONFIG_NAME="$libpng_config_name" + fi + + dnl deal with optional prefix + if test x$libpng_config_prefix != x ; then + LIBPNG_LOOKUP_PATH="$libpng_config_prefix/bin" + fi + + dnl don't search the PATH if LIBPNG_CONFIG_NAME is absolute filename + if test -x "$LIBPNG_CONFIG_NAME" ; then + AC_MSG_CHECKING(for libpng-config) + LIBPNG_CONFIG_PATH="$LIBPNG_CONFIG_NAME" + AC_MSG_RESULT($LIBPNG_CONFIG_PATH) + else + AC_PATH_PROG(LIBPNG_CONFIG_PATH, $LIBPNG_CONFIG_NAME, no, "$LIBPNG_LOOKUP_PATH:$PATH") + fi + + if test "$LIBPNG_CONFIG_PATH" != "no" ; then + LIBPNG_VERSION="" + + AC_MSG_CHECKING([for libpng version >= REQUIRED_VERSION]) + + LIBPNG_CONFIG_WITH_ARGS="$LIBPNG_CONFIG_PATH $libpng_config_args" + + LIBPNG_VERSION=`$LIBPNG_CONFIG_WITH_ARGS --version` + libpng_config_major_version=`echo $LIBPNG_VERSION | sed ['s/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1/']` + libpng_config_minor_version=`echo $LIBPNG_VERSION | sed ['s/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\2/']` + libpng_config_micro_version=`echo $LIBPNG_VERSION | sed ['s/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\3/']` + + libpng_ver_ok="" + if test $libpng_config_major_version -gt REQUIRED_VERSION_MAJOR; then + libpng_ver_ok=yes + else + if test $libpng_config_major_version -eq REQUIRED_VERSION_MAJOR; then + if test $libpng_config_minor_version -gt REQUIRED_VERSION_MINOR; then + libpng_ver_ok=yes + else + if test $libpng_config_minor_version -eq REQUIRED_VERSION_MINOR; then + if test $libpng_config_micro_version -ge REQUIRED_VERSION_MICRO; then + libpng_ver_ok=yes + fi + fi + fi + fi + fi + + if test x$libpng_ver_ok = x ; then + if test x$LIBPNG_VERSION = x; then + dnl '$LIBPNG_CONFIG_WITH_ARGS --version' didn't produce output + AC_MSG_RESULT([no]) + else + AC_MSG_RESULT([no (version $LIBPNG_VERSION is not new enough)]) + fi + LIBPNG_CFLAGS="" + LIBPNG_CXXFLAGS="" + LIBPNG_LDFLAGS="" + LIBPNG_LIBS="" + LIBPNG_VERSION="" + $3 + else + LIBPNG_LIBS=`$LIBPNG_CONFIG_WITH_ARGS --libs` + LIBPNG_LDFLAGS=`$LIBPNG_CONFIG_WITH_ARGS --ldflags | sed -e "s/ *${LIBPNG_LIBS}$//"` + LIBPNG_CFLAGS=`$LIBPNG_CONFIG_WITH_ARGS --cflags` + LIBPNG_CXXFLAGS=$LIBPNG_CFLAGS + AC_MSG_RESULT([yes (version $LIBPNG_VERSION)]) + $2 + fi + + else + dnl Some RedHat RPMs miss libpng-config, so test for + dnl the usability with default options. + AC_MSG_CHECKING([for libpng >= REQUIRED_VERSION]) + dnl Set up LIBS for the test + saved_LIBS="$LIBS" + LIBS="$LIBS -lpng -lz -lm" + dnl Set default (empty) values. + LIBPNG_CFLAGS="" + LIBPNG_CXXFLAGS="" + LIBPNG_LDFLAGS="" + LIBPNG_LIBS="" + AC_RUN_IFELSE([ + AC_LANG_PROGRAM([[ + #include + #include + + /* Check linking to png library */ + void dummy() { + png_check_sig(NULL, 0); + } + ]], [dnl Don't use double-quoting here! + /* png.h defines PNG_LIBPNG_VER=xyyzz */ + FILE *f=fopen("conftestval", "w"); + if (!f) exit(1); + fprintf(f, "%s", (PNG_LIBPNG_VER >= REQUIRED_VERSION_MAJOR * 10000 + REQUIRED_VERSION_MINOR * 100 + REQUIRED_VERSION_MICRO) ? "yes" : "no"); + fclose(f); + f=fopen("conftestver", "w"); + if (!f) exit(0); + fprintf(f, "%s", PNG_LIBPNG_VER_STRING); + fclose(f); + exit(0); + ]) + ], [ + AS_IF([test -f conftestval], [result=`cat conftestval`], [result=no]) + if test x$result = xyes; then + if test -f conftestver; then + LIBPNG_VERSION=`cat conftestver` + lib_version=" (version $LIBPNG_VERSION)" + else + lib_version="" + fi + fi + AC_MSG_RESULT([$result$lib_version]) + LIBPNG_LIBS="-lpng -lz -lm" + ], [ + result=no + AC_MSG_RESULT([$result]) + ], [ + AC_MSG_RESULT([cross-compilation detected, checking only the header]) + AC_CHECK_HEADER([png.h], [result=yes], [result=no]) + if test x$result = xyes; then + LIBPNG_VERSION="detected" + LIBPNG_LIBS="-lpng -lz -lm" + fi + ]) + AS_IF([test x$result = xyes], [$2], [$3]) + dnl Restore LIBS + LIBS="$saved_LIBS" + fi + +AC_SUBST(LIBPNG_CFLAGS)dnl +AC_SUBST(LIBPNG_CXXFLAGS)dnl +AC_SUBST(LIBPNG_LDFLAGS)dnl +AC_SUBST(LIBPNG_LIBS)dnl + +m4_undefine([REQUIRED_VERSION])dnl +m4_undefine([REQUIRED_VERSION_MAJOR])dnl +m4_undefine([REQUIRED_VERSION_MINOR])dnl +m4_undefine([REQUIRED_VERSION_MICRO])dnl +]) diff --git a/m4/progtest.m4 b/m4/progtest.m4 new file mode 100644 index 00000000..443c8e30 --- /dev/null +++ b/m4/progtest.m4 @@ -0,0 +1,59 @@ +# progtest.m4 serial 2 (gettext-0.10.40) +dnl Copyright (C) 1996-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1996. + +# Search path for a program which passes the given test. + +dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN([AM_PATH_PROG_WITH_TEST], +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) diff --git a/m4/readline.m4 b/m4/readline.m4 new file mode 100644 index 00000000..40f6a66d --- /dev/null +++ b/m4/readline.m4 @@ -0,0 +1,62 @@ +dnl +dnl Copyright (C) 2004 aMule Team (http://www.amule.org) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl Original file available from the GNU Autoconf Macro Archive at: +dnl http://www.gnu.org/software/ac-archive/htmldoc/vl_lib_readline.html +dnl + +AC_DEFUN([VL_LIB_READLINE], [ + AC_CACHE_CHECK([for a readline compatible library], + vl_cv_lib_readline, [ + ORIG_LIBS="$LIBS" + for readline_lib in readline edit editline; do + for termcap_lib in "" termcap curses ncurses; do + if test -z "$termcap_lib"; then + TRY_LIB="-l$readline_lib" + else + TRY_LIB="-l$readline_lib -l$termcap_lib" + fi + LIBS="$ORIG_LIBS $TRY_LIB" + AC_TRY_LINK_FUNC(readline, vl_cv_lib_readline="$TRY_LIB") + if test -n "$vl_cv_lib_readline"; then + break + fi + done + if test -n "$vl_cv_lib_readline"; then + break + fi + done + if test -z "$vl_cv_lib_readline"; then + vl_cv_lib_readline="no" + LIBS="$ORIG_LIBS" + READLINE_LIBS="" + else + READLINE_LIBS="$vl_cv_lib_readline" + fi + ]) + + if test "$vl_cv_lib_readline" != "no"; then + AC_DEFINE(HAVE_LIBREADLINE, 1, + [Define if you have a readline compatible library]) + AC_CHECK_HEADERS(readline.h readline/readline.h) + AC_CACHE_CHECK([whether readline supports history], + vl_cv_lib_readline_history, [ + vl_cv_lib_readline_history="no" + AC_TRY_LINK_FUNC(add_history, vl_cv_lib_readline_history="yes") + ]) + if test "$vl_cv_lib_readline_history" = "yes"; then + AC_DEFINE(HAVE_READLINE_HISTORY, 1, + [Define if your readline library has \`add_history']) + AC_CHECK_HEADERS(history.h readline/history.h) + fi + fi + AC_SUBST(READLINE_LIBS) + LIBS="$ORIG_LIBS" +])dnl diff --git a/m4/stdint_h.m4 b/m4/stdint_h.m4 new file mode 100644 index 00000000..4b5a4ac6 --- /dev/null +++ b/m4/stdint_h.m4 @@ -0,0 +1,28 @@ +# stdint_h.m4 serial 2 (gettext-0.11.4) +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_STDINT_H_WITH_UINTMAX if exists, +# doesn't clash with , and declares uintmax_t. + +AC_DEFUN([jm_AC_HEADER_STDINT_H], +[ + AC_CACHE_CHECK([for stdint.h], jm_ac_cv_header_stdint_h, + [AC_TRY_COMPILE( + [#include +#include ], + [uintmax_t i = (uintmax_t) -1;], + jm_ac_cv_header_stdint_h=yes, + jm_ac_cv_header_stdint_h=no)]) + if test $jm_ac_cv_header_stdint_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1, +[Define if exists, doesn't clash with , + and declares uintmax_t. ]) + fi +]) diff --git a/m4/uintmax_t.m4 b/m4/uintmax_t.m4 new file mode 100644 index 00000000..ec3a8b92 --- /dev/null +++ b/m4/uintmax_t.m4 @@ -0,0 +1,29 @@ +# uintmax_t.m4 serial 6 (gettext-0.11) +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +AC_PREREQ(2.13) + +# Define uintmax_t to `unsigned long' or `unsigned long long' +# if does not exist. + +AC_DEFUN([jm_AC_TYPE_UINTMAX_T], +[ + AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([jm_AC_HEADER_STDINT_H]) + if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then + AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG]) + test $ac_cv_type_unsigned_long_long = yes \ + && ac_type='unsigned long long' \ + || ac_type='unsigned long' + AC_DEFINE_UNQUOTED(uintmax_t, $ac_type, + [Define to unsigned long or unsigned long long + if and don't define.]) + fi +]) diff --git a/m4/ulonglong.m4 b/m4/ulonglong.m4 new file mode 100644 index 00000000..c375e474 --- /dev/null +++ b/m4/ulonglong.m4 @@ -0,0 +1,23 @@ +# ulonglong.m4 serial 2 (fileutils-4.0.32, gettext-0.10.40) +dnl Copyright (C) 1999-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +AC_DEFUN([jm_AC_TYPE_UNSIGNED_LONG_LONG], +[ + AC_CACHE_CHECK([for unsigned long long], ac_cv_type_unsigned_long_long, + [AC_TRY_LINK([unsigned long long ull = 1; int i = 63;], + [unsigned long long ullmax = (unsigned long long) -1; + return ull << i | ull >> i | ullmax / ull | ullmax % ull;], + ac_cv_type_unsigned_long_long=yes, + ac_cv_type_unsigned_long_long=no)]) + if test $ac_cv_type_unsigned_long_long = yes; then + AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1, + [Define if you have the unsigned long long type.]) + fi +]) diff --git a/m4/wxwin.m4 b/m4/wxwin.m4 new file mode 100644 index 00000000..9e988d4f --- /dev/null +++ b/m4/wxwin.m4 @@ -0,0 +1,1052 @@ +dnl --------------------------------------------------------------------------- +dnl Author: wxWidgets development team, +dnl Francesco Montorsi, +dnl Bob McCown (Mac-testing) +dnl Creation date: 24/11/2001 +dnl RCS-ID: $Id: wxwin.m4 8040 2008-02-01 11:39:47Z phoenix $ +dnl --------------------------------------------------------------------------- + +dnl =========================================================================== +dnl Table of Contents of this macro file: +dnl ------------------------------------- +dnl +dnl SECTION A: wxWidgets main macros +dnl - WX_CONFIG_OPTIONS +dnl - WX_CONFIG_CHECK +dnl - WXRC_CHECK +dnl - WX_STANDARD_OPTIONS +dnl - WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS +dnl - WX_DETECT_STANDARD_OPTION_VALUES +dnl +dnl SECTION B: wxWidgets-related utilities +dnl - WX_LIKE_LIBNAME +dnl - WX_ARG_ENABLE_YESNOAUTO +dnl - WX_ARG_WITH_YESNOAUTO +dnl +dnl SECTION C: messages to the user +dnl - WX_STANDARD_OPTIONS_SUMMARY_MSG +dnl - WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN +dnl - WX_STANDARD_OPTIONS_SUMMARY_MSG_END +dnl - WX_BOOLOPT_SUMMARY +dnl +dnl The special "WX_DEBUG_CONFIGURE" variable can be set to 1 to enable extra +dnl debug output on stdout from these macros. +dnl =========================================================================== + + +dnl --------------------------------------------------------------------------- +dnl Macros for wxWidgets detection. Typically used in configure.in as: +dnl +dnl AC_ARG_ENABLE(...) +dnl AC_ARG_WITH(...) +dnl ... +dnl WX_CONFIG_OPTIONS +dnl ... +dnl ... +dnl WX_CONFIG_CHECK([2.6.0], [wxWin=1]) +dnl if test "$wxWin" != 1; then +dnl AC_MSG_ERROR([ +dnl wxWidgets must be installed on your system +dnl but wx-config script couldn't be found. +dnl +dnl Please check that wx-config is in path, the directory +dnl where wxWidgets libraries are installed (returned by +dnl 'wx-config --libs' command) is in LD_LIBRARY_PATH or +dnl equivalent variable and wxWidgets version is 2.3.4 or above. +dnl ]) +dnl fi +dnl CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS" +dnl CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS_ONLY" +dnl CFLAGS="$CFLAGS $WX_CFLAGS_ONLY" +dnl +dnl LIBS="$LIBS $WX_LIBS" +dnl +dnl If you want to support standard --enable-debug/unicode/shared options, you +dnl may do the following: +dnl +dnl ... +dnl AC_CANONICAL_SYSTEM +dnl +dnl # define configure options +dnl WX_CONFIG_OPTIONS +dnl WX_STANDARD_OPTIONS([debug,unicode,shared,toolkit,wxshared]) +dnl +dnl # basic configure checks +dnl ... +dnl +dnl # we want to always have DEBUG==WX_DEBUG and UNICODE==WX_UNICODE +dnl WX_DEBUG=$DEBUG +dnl WX_UNICODE=$UNICODE +dnl +dnl WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS +dnl WX_CONFIG_CHECK([2.8.0], [wxWin=1],,[html,core,net,base],[$WXCONFIG_FLAGS]) +dnl WX_DETECT_STANDARD_OPTION_VALUES +dnl +dnl # write the output files +dnl AC_CONFIG_FILES([Makefile ...]) +dnl AC_OUTPUT +dnl +dnl # optional: just to show a message to the user +dnl WX_STANDARD_OPTIONS_SUMMARY_MSG +dnl +dnl --------------------------------------------------------------------------- + + +dnl --------------------------------------------------------------------------- +dnl WX_CONFIG_OPTIONS +dnl +dnl adds support for --wx-prefix, --wx-exec-prefix, --with-wxdir and +dnl --wx-config command line options +dnl --------------------------------------------------------------------------- + +AC_DEFUN([WX_CONFIG_OPTIONS], +[ + AC_ARG_WITH(wxdir, + [ --with-wxdir=PATH Use uninstalled version of wxWidgets in PATH], + [ wx_config_name="$withval/wx-config" + wx_config_args="--inplace"]) + AC_ARG_WITH(wx-config, + [ --with-wx-config=CONFIG wx-config script to use (optional)], + wx_config_name="$withval" ) + AC_ARG_WITH(wx-prefix, + [ --with-wx-prefix=PREFIX Prefix where wxWidgets is installed (optional)], + wx_config_prefix="$withval", wx_config_prefix="") + AC_ARG_WITH(wx-exec-prefix, + [ --with-wx-exec-prefix=PREFIX + Exec prefix where wxWidgets is installed (optional)], + wx_config_exec_prefix="$withval", wx_config_exec_prefix="") +]) + +dnl Helper macro for checking if wx version is at least $1.$2.$3, set's +dnl wx_ver_ok=yes if it is: +AC_DEFUN([_WX_PRIVATE_CHECK_VERSION], +[ + wx_ver_ok="" + if test "x$WX_VERSION_FULL" != x ; then + if test $wx_config_major_version -gt $1; then + wx_ver_ok=yes + else + if test $wx_config_major_version -eq $1; then + if test $wx_config_minor_version -gt $2; then + wx_ver_ok=yes + else + if test $wx_config_minor_version -eq $2; then + if test $wx_config_micro_version -ge $3; then + wx_ver_ok=yes + fi + fi + fi + fi + fi + fi +]) + +dnl --------------------------------------------------------------------------- +dnl WX_CONFIG_CHECK(VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND +dnl [, WX-LIBS [, ADDITIONAL-WX-CONFIG-FLAGS]]]]) +dnl +dnl Test for wxWidgets, and define WX_C*FLAGS, WX_LIBS and WX_LIBS_STATIC +dnl (the latter is for static linking against wxWidgets). Set WX_CONFIG_NAME +dnl environment variable to override the default name of the wx-config script +dnl to use. Set WX_CONFIG_PATH to specify the full path to wx-config - in this +dnl case the macro won't even waste time on tests for its existence. +dnl +dnl Optional WX-LIBS argument contains comma- or space-separated list of +dnl wxWidgets libraries to link against (it may include contrib libraries). If +dnl it is not specified then WX_LIBS and WX_LIBS_STATIC will contain flags to +dnl link with all of the core wxWidgets libraries. +dnl +dnl Optional ADDITIONAL-WX-CONFIG-FLAGS argument is appended to wx-config +dnl invocation command in present. It can be used to fine-tune lookup of +dnl best wxWidgets build available. +dnl +dnl Example use: +dnl WX_CONFIG_CHECK([2.6.0], [wxWin=1], [wxWin=0], [html,core,net] +dnl [--unicode --debug]) +dnl --------------------------------------------------------------------------- + +dnl +dnl Get the cflags and libraries from the wx-config script +dnl +AC_DEFUN([WX_CONFIG_CHECK], +[ + dnl do we have wx-config name: it can be wx-config or wxd-config or ... + if test x${WX_CONFIG_NAME+set} != xset ; then + WX_CONFIG_NAME=wx-config + fi + + if test "x$wx_config_name" != x ; then + WX_CONFIG_NAME="$wx_config_name" + fi + + dnl deal with optional prefixes + if test x$wx_config_exec_prefix != x ; then + wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix" + WX_LOOKUP_PATH="$wx_config_exec_prefix/bin" + fi + if test x$wx_config_prefix != x ; then + wx_config_args="$wx_config_args --prefix=$wx_config_prefix" + WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin" + fi + if test "$cross_compiling" = "yes"; then + wx_config_args="$wx_config_args --host=$host_alias" + fi + + dnl don't search the PATH if WX_CONFIG_NAME is absolute filename + if test -x "$WX_CONFIG_NAME" ; then + AC_MSG_CHECKING(for wx-config) + WX_CONFIG_PATH="$WX_CONFIG_NAME" + AC_MSG_RESULT($WX_CONFIG_PATH) + else + AC_PATH_PROG(WX_CONFIG_PATH, $WX_CONFIG_NAME, no, "$WX_LOOKUP_PATH:$PATH") + fi + + if test "$WX_CONFIG_PATH" != "no" ; then + WX_VERSION_FULL="" + + min_wx_version=ifelse([$1], ,2.2.1,$1) + if test -z "$5" ; then + AC_MSG_CHECKING([for wxWidgets version >= $min_wx_version]) + else + AC_MSG_CHECKING([for wxWidgets version >= $min_wx_version ($5)]) + fi + + WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args $5 $4" + + WX_VERSION_FULL=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null` + wx_config_major_version=`echo $WX_VERSION_FULL | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + wx_config_minor_version=`echo $WX_VERSION_FULL | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + wx_config_micro_version=`echo $WX_VERSION_FULL | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + + wx_requested_major_version=`echo $min_wx_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + wx_requested_minor_version=`echo $min_wx_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + wx_requested_micro_version=`echo $min_wx_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + + _WX_PRIVATE_CHECK_VERSION([$wx_requested_major_version], + [$wx_requested_minor_version], + [$wx_requested_micro_version]) + + if test -n "$wx_ver_ok"; then + + AC_MSG_RESULT(yes (version $WX_VERSION_FULL)) + WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs` + + dnl is this even still appropriate? --static is a real option now + dnl and WX_CONFIG_WITH_ARGS is likely to contain it if that is + dnl what the user actually wants, making this redundant at best. + dnl For now keep it in case anyone actually used it in the past. + AC_MSG_CHECKING([for wxWidgets static library]) + WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs 2>/dev/null` + if test "x$WX_LIBS_STATIC" = "x"; then + AC_MSG_RESULT(no) + else + AC_MSG_RESULT(yes) + fi + + dnl starting with version 2.2.6 wx-config has --cppflags argument + wx_has_cppflags="" + if test $wx_config_major_version -gt 2; then + wx_has_cppflags=yes + else + if test $wx_config_major_version -eq 2; then + if test $wx_config_minor_version -gt 2; then + wx_has_cppflags=yes + else + if test $wx_config_minor_version -eq 2; then + if test $wx_config_micro_version -ge 6; then + wx_has_cppflags=yes + fi + fi + fi + fi + fi + + dnl starting with version 2.7.0 wx-config has --rescomp option + wx_has_rescomp="" + if test $wx_config_major_version -gt 2; then + wx_has_rescomp=yes + else + if test $wx_config_major_version -eq 2; then + if test $wx_config_minor_version -ge 7; then + wx_has_rescomp=yes + fi + fi + fi + if test "x$wx_has_rescomp" = x ; then + dnl cannot give any useful info for resource compiler + WX_RESCOMP= + else + WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp` + fi + + if test "x$wx_has_cppflags" = x ; then + dnl no choice but to define all flags like CFLAGS + WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` + WX_CPPFLAGS=$WX_CFLAGS + WX_CXXFLAGS=$WX_CFLAGS + + WX_CFLAGS_ONLY=$WX_CFLAGS + WX_CXXFLAGS_ONLY=$WX_CFLAGS + else + dnl we have CPPFLAGS included in CFLAGS included in CXXFLAGS + WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags` + WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags` + WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` + + WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"` + WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"` + fi + + ifelse([$2], , :, [$2]) + + else + + if test "x$WX_VERSION_FULL" = x; then + dnl no wx-config at all + AC_MSG_RESULT(no) + else + AC_MSG_RESULT(no (version $WX_VERSION_FULL is not new enough)) + fi + + WX_CFLAGS="" + WX_CPPFLAGS="" + WX_CXXFLAGS="" + WX_LIBS="" + WX_LIBS_STATIC="" + WX_RESCOMP="" + + if test ! -z "$5"; then + + wx_error_message=" + The configuration you asked for $PACKAGE_NAME requires a wxWidgets + build with the following settings: + $5 + but such build is not available. + + To see the wxWidgets builds available on this system, please use + 'wx-config --list' command. To use the default build, returned by + 'wx-config --selected-config', use the options with their 'auto' + default values." + + fi + + wx_error_message=" + The requested wxWidgets build couldn't be found. + $wx_error_message + + If you still get this error, then check that 'wx-config' is + in path, the directory where wxWidgets libraries are installed + (returned by 'wx-config --libs' command) is in LD_LIBRARY_PATH + or equivalent variable and wxWidgets version is $1 or above." + + ifelse([$3], , AC_MSG_ERROR([$wx_error_message]), [$3]) + + fi + else + + WX_CFLAGS="" + WX_CPPFLAGS="" + WX_CXXFLAGS="" + WX_LIBS="" + WX_LIBS_STATIC="" + WX_RESCOMP="" + + ifelse([$3], , :, [$3]) + + fi + + AC_SUBST(WX_CPPFLAGS) + AC_SUBST(WX_CFLAGS) + AC_SUBST(WX_CXXFLAGS) + AC_SUBST(WX_CFLAGS_ONLY) + AC_SUBST(WX_CXXFLAGS_ONLY) + AC_SUBST(WX_LIBS) + AC_SUBST(WX_LIBS_STATIC) + AC_SUBST(WX_VERSION_FULL) + AC_SUBST(WX_RESCOMP) + + dnl need to export also WX_VERSION_MINOR and WX_VERSION_MAJOR symbols + dnl to support wxpresets bakefiles + WX_VERSION_MAJOR="$wx_config_major_version" + WX_VERSION_MINOR="$wx_config_minor_version" + AC_SUBST(WX_VERSION_MAJOR) + AC_SUBST(WX_VERSION_MINOR) +]) + +dnl --------------------------------------------------------------------------- +dnl Get information on the wxrc program for making C++, Python and xrs +dnl resource files. +dnl +dnl AC_ARG_ENABLE(...) +dnl AC_ARG_WITH(...) +dnl ... +dnl WX_CONFIG_OPTIONS +dnl ... +dnl WX_CONFIG_CHECK(2.6.0, wxWin=1) +dnl if test "$wxWin" != 1; then +dnl AC_MSG_ERROR([ +dnl wxWidgets must be installed on your system +dnl but wx-config script couldn't be found. +dnl +dnl Please check that wx-config is in path, the directory +dnl where wxWidgets libraries are installed (returned by +dnl 'wx-config --libs' command) is in LD_LIBRARY_PATH or +dnl equivalent variable and wxWidgets version is 2.6.0 or above. +dnl ]) +dnl fi +dnl +dnl WXRC_CHECK([HAVE_WXRC=1], [HAVE_WXRC=0]) +dnl if test "x$HAVE_WXRC" != x1; then +dnl AC_MSG_ERROR([ +dnl The wxrc program was not installed or not found. +dnl +dnl Please check the wxWidgets installation. +dnl ]) +dnl fi +dnl +dnl CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS" +dnl CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS_ONLY" +dnl CFLAGS="$CFLAGS $WX_CFLAGS_ONLY" +dnl +dnl LDFLAGS="$LDFLAGS $WX_LIBS" +dnl --------------------------------------------------------------------------- + +dnl --------------------------------------------------------------------------- +dnl WXRC_CHECK([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl +dnl Test for wxWidgets' wxrc program for creating either C++, Python or XRS +dnl resources. The variable WXRC will be set and substituted in the configure +dnl script and Makefiles. +dnl +dnl Example use: +dnl WXRC_CHECK([wxrc=1], [wxrc=0]) +dnl --------------------------------------------------------------------------- + +dnl +dnl wxrc program from the wx-config script +dnl +AC_DEFUN([WXRC_CHECK], +[ + AC_ARG_VAR([WXRC], [Path to wxWidget's wxrc resource compiler]) + + if test "x$WX_CONFIG_NAME" = x; then + AC_MSG_ERROR([The wxrc tests must run after wxWidgets test.]) + else + + AC_MSG_CHECKING([for wxrc]) + + if test "x$WXRC" = x ; then + dnl wx-config --utility is a new addition to wxWidgets: + _WX_PRIVATE_CHECK_VERSION(2,5,3) + if test -n "$wx_ver_ok"; then + WXRC=`$WX_CONFIG_WITH_ARGS --utility=wxrc` + fi + fi + + if test "x$WXRC" = x ; then + AC_MSG_RESULT([not found]) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT([$WXRC]) + ifelse([$1], , :, [$1]) + fi + + AC_SUBST(WXRC) + fi +]) + +dnl --------------------------------------------------------------------------- +dnl WX_LIKE_LIBNAME([output-var] [prefix], [name]) +dnl +dnl Sets the "output-var" variable to the name of a library named with same +dnl wxWidgets rule. +dnl E.g. for output-var=='lib', name=='test', prefix='mine', sets +dnl the $lib variable to: +dnl 'mine_gtk2ud_test-2.8' +dnl if WX_PORT=gtk2, WX_UNICODE=1, WX_DEBUG=1 and WX_VERSION=28 +dnl --------------------------------------------------------------------------- +AC_DEFUN([WX_LIKE_LIBNAME], + [ + wx_temp="$2""_""$WX_PORT" + + dnl add the [u][d] string + if test "$WX_UNICODE" = "1"; then + wx_temp="$wx_temp""u" + fi + if test "$WX_DEBUG" = "1"; then + wx_temp="$wx_temp""d" + fi + + dnl complete the name of the lib + wx_temp="$wx_temp""_""$3""-$WX_VERSION_MAJOR.$WX_VERSION_MINOR" + + dnl save it in the user's variable + $1=$wx_temp + ]) + +dnl --------------------------------------------------------------------------- +dnl WX_ARG_ENABLE_YESNOAUTO/WX_ARG_WITH_YESNOAUTO +dnl +dnl Two little custom macros which define the ENABLE/WITH configure arguments. +dnl Macro arguments: +dnl $1 = the name of the --enable / --with feature +dnl $2 = the name of the variable associated +dnl $3 = the description of that feature +dnl $4 = the default value for that feature +dnl $5 = additional action to do in case option is given with "yes" value +dnl --------------------------------------------------------------------------- +AC_DEFUN([WX_ARG_ENABLE_YESNOAUTO], + [AC_ARG_ENABLE($1, + AC_HELP_STRING([--enable-$1], [$3 (default is $4)]), + [], [enableval="$4"]) + + dnl Show a message to the user about this option + AC_MSG_CHECKING([for the --enable-$1 option]) + if test "$enableval" = "yes" ; then + AC_MSG_RESULT([yes]) + $2=1 + $5 + elif test "$enableval" = "no" ; then + AC_MSG_RESULT([no]) + $2=0 + elif test "$enableval" = "auto" ; then + AC_MSG_RESULT([will be automatically detected]) + $2="auto" + else + AC_MSG_ERROR([ + Unrecognized option value (allowed values: yes, no, auto) + ]) + fi + ]) + +AC_DEFUN([WX_ARG_WITH_YESNOAUTO], + [AC_ARG_WITH($1, + AC_HELP_STRING([--with-$1], [$3 (default is $4)]), + [], [withval="$4"]) + + dnl Show a message to the user about this option + AC_MSG_CHECKING([for the --with-$1 option]) + if test "$withval" = "yes" ; then + AC_MSG_RESULT([yes]) + $2=1 + $5 + dnl NB: by default we don't allow --with-$1=no option + dnl since it does not make much sense ! + elif test "$6" = "1" -a "$withval" = "no" ; then + AC_MSG_RESULT([no]) + $2=0 + elif test "$withval" = "auto" ; then + AC_MSG_RESULT([will be automatically detected]) + $2="auto" + else + AC_MSG_ERROR([ + Unrecognized option value (allowed values: yes, auto) + ]) + fi + ]) + + +dnl --------------------------------------------------------------------------- +dnl WX_STANDARD_OPTIONS([options-to-add]) +dnl +dnl Adds to the configure script one or more of the following options: +dnl --enable-[debug|unicode|shared|wxshared|wxdebug] +dnl --with-[gtk|msw|motif|x11|mac|mgl|dfb] +dnl Then checks for their presence and eventually set the DEBUG, UNICODE, SHARED, +dnl PORT, WX_SHARED, WX_DEBUG, variables to one of the "yes", "no", "auto" values. +dnl +dnl Note that e.g. UNICODE != WX_UNICODE; the first is the value of the +dnl --enable-unicode option (in boolean format) while the second indicates +dnl if wxWidgets was built in Unicode mode (and still is in boolean format). +dnl --------------------------------------------------------------------------- +AC_DEFUN([WX_STANDARD_OPTIONS], + [ + + dnl the following lines will expand to WX_ARG_ENABLE_YESNOAUTO calls if and only if + dnl the $1 argument contains respectively the debug,unicode or shared options. + + ifelse(regexp([$1], [\bdebug]), [-1],, + [WX_ARG_ENABLE_YESNOAUTO([debug], [DEBUG], [Build in debug mode], [auto])]) + + ifelse(index([$1], [unicode]), [-1],, + [WX_ARG_ENABLE_YESNOAUTO([unicode], [UNICODE], [Build in Unicode mode], [auto])]) + + ifelse(regexp([$1], [\bshared]), [-1],, + [WX_ARG_ENABLE_YESNOAUTO([shared], [SHARED], [Build as shared library], [auto])]) + + dnl WX_ARG_WITH_YESNOAUTO cannot be used for --with-toolkit since it's an option + dnl which must be able to accept the auto|gtk1|gtk2|msw|... values + ifelse(index([$1], [toolkit]), [-1],, + [ + AC_ARG_WITH([toolkit], + AC_HELP_STRING([--with-toolkit], + [Build against a specific wxWidgets toolkit (default is auto)]), + [], [withval="auto"]) + + dnl Show a message to the user about this option + AC_MSG_CHECKING([for the --with-toolkit option]) + if test "$withval" = "auto" ; then + AC_MSG_RESULT([will be automatically detected]) + TOOLKIT="auto" + else + TOOLKIT="$withval" + + dnl PORT must be one of the allowed values + if test "$TOOLKIT" != "gtk1" -a "$TOOLKIT" != "gtk2" -a \ + "$TOOLKIT" != "msw" -a "$TOOLKIT" != "motif" -a \ + "$TOOLKIT" != "x11" -a "$TOOLKIT" != "mac" -a \ + "$TOOLKIT" != "mgl" -a "$TOOLKIT" != "dfb" -a \ + "$TOOLKIT" != "base" ; then + AC_MSG_ERROR([ + Unrecognized option value (allowed values: auto, gtk1, gtk2, msw, motif, x11, mac, mgl, dfb, base) + ]) + fi + + AC_MSG_RESULT([$TOOLKIT]) + fi + ]) + + dnl ****** IMPORTANT ******* + dnl Unlike for the UNICODE setting, you can build your program in + dnl shared mode against a static build of wxWidgets. Thus we have the + dnl following option which allows these mixtures. E.g. + dnl + dnl ./configure --disable-shared --with-wxshared + dnl + dnl will build your library in static mode against the first available + dnl shared build of wxWidgets. + dnl + dnl Note that's not possible to do the viceversa: + dnl + dnl ./configure --enable-shared --without-wxshared + dnl + dnl Doing so you would try to build your library in shared mode against a static + dnl build of wxWidgets. This is not possible (you would mix PIC and non PIC code) ! + dnl A check for this combination of options is in WX_DETECT_STANDARD_OPTION_VALUES + dnl (where we know what 'auto' should be expanded to). + dnl + dnl If you try to build something in ANSI mode against a UNICODE build + dnl of wxWidgets or in RELEASE mode against a DEBUG build of wxWidgets, + dnl then at best you'll get ton of linking errors ! + dnl ************************ + + ifelse(index([$1], [wxshared]), [-1],, + [ + WX_ARG_WITH_YESNOAUTO( + [wxshared], [WX_SHARED], + [Force building against a shared build of wxWidgets, even if --disable-shared is given], + [auto], [], [1]) + ]) + + dnl Just like for SHARED and WX_SHARED it may happen that some adventurous + dnl peoples will want to mix a wxWidgets release build with a debug build of + dnl his app/lib. So, we have both DEBUG and WX_DEBUG variables. + ifelse(index([$1], [wxdebug]), [-1],, + [ + WX_ARG_WITH_YESNOAUTO( + [wxdebug], [WX_DEBUG], + [Force building against a debug build of wxWidgets, even if --disable-debug is given], + [auto], [], [1]) + ]) + + dnl WX_ARG_WITH_YESNOAUTO cannot be used for --with-wxversion since it's an option + dnl which must be able to accept the auto|26|27|28... values + ifelse(index([$1], [wxversion]), [-1],, + [ + AC_ARG_WITH([wxversion], + AC_HELP_STRING([--with-wxversion], + [Build against a specific version of wxWidgets (default is auto)]), + [], [withval="auto"]) + + dnl Show a message to the user about this option + AC_MSG_CHECKING([for the --with-wxversion option]) + if test "$withval" = "auto" ; then + AC_MSG_RESULT([will be automatically detected]) + WX_VERSION="auto" + else + + wx_requested_major_version=`echo $withval | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).*/\1/'` + wx_requested_minor_version=`echo $withval | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).*/\2/'` + + dnl both vars above must be exactly 1 digit + if test "${#wx_requested_major_version}" != "1" -o \ + "${#wx_requested_minor_version}" != "1" ; then + AC_MSG_ERROR([ + Unrecognized option value (allowed values: auto, 2.6, 2.7, 2.8, 2.9) + ]) + fi + + WX_VERSION="$wx_requested_major_version"".""$wx_requested_minor_version" + AC_MSG_RESULT([$WX_VERSION]) + fi + ]) + + if test "$WX_DEBUG_CONFIGURE" = "1"; then + echo "[[dbg]] DEBUG: $DEBUG, WX_DEBUG: $WX_DEBUG" + echo "[[dbg]] UNICODE: $UNICODE, WX_UNICODE: $WX_UNICODE" + echo "[[dbg]] SHARED: $SHARED, WX_SHARED: $WX_SHARED" + echo "[[dbg]] TOOLKIT: $TOOLKIT, WX_TOOLKIT: $WX_TOOLKIT" + echo "[[dbg]] VERSION: $VERSION, WX_VERSION: $WX_VERSION" + fi + ]) + + +dnl --------------------------------------------------------------------------- +dnl WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS +dnl +dnl Sets the WXCONFIG_FLAGS string using the SHARED,DEBUG,UNICODE variable values +dnl which are different from "auto". +dnl Thus this macro needs to be called only once all options have been set. +dnl --------------------------------------------------------------------------- +AC_DEFUN([WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS], + [ + if test "$WX_SHARED" = "1" ; then + WXCONFIG_FLAGS="--static=no " + elif test "$WX_SHARED" = "0" ; then + WXCONFIG_FLAGS="--static=yes " + fi + + if test "$WX_DEBUG" = "1" ; then + WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--debug=yes " + elif test "$WX_DEBUG" = "0" ; then + WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--debug=no " + fi + + dnl The user should have set WX_UNICODE=UNICODE + if test "$WX_UNICODE" = "1" ; then + WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--unicode=yes " + elif test "$WX_UNICODE" = "0" ; then + WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--unicode=no " + fi + + if test "$TOOLKIT" != "auto" ; then + WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--toolkit=$TOOLKIT " + fi + + if test "$WX_VERSION" != "auto" ; then + WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--version=$WX_VERSION " + fi + + dnl strip out the last space of the string + WXCONFIG_FLAGS=${WXCONFIG_FLAGS% } + + if test "$WX_DEBUG_CONFIGURE" = "1"; then + echo "[[dbg]] WXCONFIG_FLAGS: $WXCONFIG_FLAGS" + fi + ]) + + +dnl --------------------------------------------------------------------------- +dnl _WX_SELECTEDCONFIG_CHECKFOR([RESULTVAR], [STRING], [MSG] +dnl [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl +dnl Outputs the given MSG. Then searches the given STRING in the wxWidgets +dnl additional CPP flags and put the result of the search in WX_$RESULTVAR +dnl also adding the "yes" or "no" message result to MSG. +dnl --------------------------------------------------------------------------- +AC_DEFUN([_WX_SELECTEDCONFIG_CHECKFOR], + [ + if test "$$1" = "auto" ; then + + dnl The user does not have particular preferences for this option; + dnl so we will detect the wxWidgets relative build setting and use it + AC_MSG_CHECKING([$3]) + + dnl set WX_$1 variable to 1 if the $WX_SELECTEDCONFIG contains the $2 + dnl string or to 0 otherwise. + dnl NOTE: 'expr match STRING REGEXP' cannot be used since on Mac it + dnl doesn't work; we use 'expr STRING : REGEXP' instead + WX_$1=$(expr "$WX_SELECTEDCONFIG" : ".*$2.*") + + if test "$WX_$1" != "0"; then + WX_$1=1 + AC_MSG_RESULT([yes]) + ifelse([$4], , :, [$4]) + else + WX_$1=0 + AC_MSG_RESULT([no]) + ifelse([$5], , :, [$5]) + fi + else + + dnl Use the setting given by the user + WX_$1=$$1 + fi + ]) + +dnl --------------------------------------------------------------------------- +dnl WX_DETECT_STANDARD_OPTION_VALUES +dnl +dnl Detects the values of the following variables: +dnl 1) WX_VERSION +dnl 2) WX_UNICODE +dnl 3) WX_DEBUG +dnl 4) WX_SHARED (and also WX_STATIC) +dnl 5) WX_PORT +dnl from the previously selected wxWidgets build; this macro in fact must be +dnl called *after* calling the WX_CONFIG_CHECK macro. +dnl +dnl Note that the WX_VERSION_MAJOR, WX_VERSION_MINOR symbols are already set +dnl by WX_CONFIG_CHECK macro +dnl --------------------------------------------------------------------------- +AC_DEFUN([WX_DETECT_STANDARD_OPTION_VALUES], + [ + WX_VERSION="$WX_VERSION_MAJOR""$WX_VERSION_MINOR" + if test $WX_VERSION -lt 26 ; then + + AC_MSG_ERROR([ + Cannot detect the wxWidgets configuration for the selected wxWidgets build + since its version is $WX_VERSION_FULL < 2.6.0; please install a newer + version of wxWidgets. + ]) + fi + + dnl The wx-config we are using understands the "--selected_config" + dnl option which returns an easy-parseable string ! + WX_SELECTEDCONFIG=$($WX_CONFIG_WITH_ARGS --selected_config) + + if test "$WX_DEBUG_CONFIGURE" = "1"; then + echo "[[dbg]] Using wx-config --selected-config" + echo "[[dbg]] WX_SELECTEDCONFIG: $WX_SELECTEDCONFIG" + fi + + + dnl we could test directly for WX_SHARED with a line like: + dnl _WX_SELECTEDCONFIG_CHECKFOR([SHARED], [shared], + dnl [if wxWidgets was built in SHARED mode]) + dnl but wx-config --selected-config DOES NOT outputs the 'shared' + dnl word when wx was built in shared mode; it rather outputs the + dnl 'static' word when built in static mode. + if test $WX_SHARED = "1"; then + STATIC=0 + elif test $WX_SHARED = "0"; then + STATIC=1 + elif test $WX_SHARED = "auto"; then + STATIC="auto" + fi + + dnl Now set the WX_UNICODE, WX_DEBUG, WX_STATIC variables + _WX_SELECTEDCONFIG_CHECKFOR([UNICODE], [unicode], + [if wxWidgets was built with UNICODE enabled]) + _WX_SELECTEDCONFIG_CHECKFOR([DEBUG], [debug], + [if wxWidgets was built in DEBUG mode]) + _WX_SELECTEDCONFIG_CHECKFOR([STATIC], [static], + [if wxWidgets was built in STATIC mode]) + + dnl init WX_SHARED from WX_STATIC + if test "$WX_STATIC" != "0"; then + WX_SHARED=0 + else + WX_SHARED=1 + fi + + AC_SUBST(WX_UNICODE) + AC_SUBST(WX_DEBUG) + AC_SUBST(WX_SHARED) + + dnl detect the WX_PORT to use + if test "$TOOLKIT" = "auto" ; then + + dnl The user does not have particular preferences for this option; + dnl so we will detect the wxWidgets relative build setting and use it + AC_MSG_CHECKING([which wxWidgets toolkit was selected]) + + WX_GTKPORT1=$(expr "$WX_SELECTEDCONFIG" : ".*gtk1.*") + WX_GTKPORT2=$(expr "$WX_SELECTEDCONFIG" : ".*gtk2.*") + WX_MSWPORT=$(expr "$WX_SELECTEDCONFIG" : ".*msw.*") + WX_MOTIFPORT=$(expr "$WX_SELECTEDCONFIG" : ".*motif.*") + WX_MACPORT=$(expr "$WX_SELECTEDCONFIG" : ".*mac.*") + WX_X11PORT=$(expr "$WX_SELECTEDCONFIG" : ".*x11.*") + WX_MGLPORT=$(expr "$WX_SELECTEDCONFIG" : ".*mgl.*") + WX_DFBPORT=$(expr "$WX_SELECTEDCONFIG" : ".*dfb.*") + WX_BASEPORT=$(expr "$WX_SELECTEDCONFIG" : ".*base.*") + + WX_PORT="unknown" + if test "$WX_GTKPORT1" != "0"; then WX_PORT="gtk1"; fi + if test "$WX_GTKPORT2" != "0"; then WX_PORT="gtk2"; fi + if test "$WX_MSWPORT" != "0"; then WX_PORT="msw"; fi + if test "$WX_MOTIFPORT" != "0"; then WX_PORT="motif"; fi + if test "$WX_MACPORT" != "0"; then WX_PORT="mac"; fi + if test "$WX_X11PORT" != "0"; then WX_PORT="x11"; fi + if test "$WX_MGLPORT" != "0"; then WX_PORT="mgl"; fi + if test "$WX_DFBPORT" != "0"; then WX_PORT="dfb"; fi + if test "$WX_BASEPORT" != "0"; then WX_PORT="base"; fi + + dnl check at least one of the WX_*PORT has been set ! + + if test "$WX_PORT" = "unknown" ; then + AC_MSG_ERROR([ + Cannot detect the currently installed wxWidgets port ! + Please check your 'wx-config --cxxflags'... + ]) + fi + + AC_MSG_RESULT([$WX_PORT]) + else + + dnl Use the setting given by the user + if test -z "$TOOLKIT" ; then + WX_PORT=$TOOLKIT + else + dnl try with PORT + WX_PORT=$PORT + fi + fi + + AC_SUBST(WX_PORT) + + if test "$WX_DEBUG_CONFIGURE" = "1"; then + echo "[[dbg]] Values of all WX_* options after final detection:" + echo "[[dbg]] WX_DEBUG: $WX_DEBUG" + echo "[[dbg]] WX_UNICODE: $WX_UNICODE" + echo "[[dbg]] WX_SHARED: $WX_SHARED" + echo "[[dbg]] WX_VERSION: $WX_VERSION" + echo "[[dbg]] WX_PORT: $WX_PORT" + fi + + dnl Avoid problem described in the WX_STANDARD_OPTIONS which happens when + dnl the user gives the options: + dnl ./configure --enable-shared --without-wxshared + dnl or just do + dnl ./configure --enable-shared + dnl but there is only a static build of wxWidgets available. + if test "$WX_SHARED" = "0" -a "$SHARED" = "1"; then + AC_MSG_ERROR([ + Cannot build shared library against a static build of wxWidgets ! + This error happens because the wxWidgets build which was selected + has been detected as static while you asked to build $PACKAGE_NAME + as shared library and this is not possible. + Use the '--disable-shared' option to build $PACKAGE_NAME + as static library or '--with-wxshared' to use wxWidgets as shared library. + ]) + fi + + dnl now we can finally update the DEBUG,UNICODE,SHARED options + dnl to their final values if they were set to 'auto' + if test "$DEBUG" = "auto"; then + DEBUG=$WX_DEBUG + + dnl in case user wants a BUILD=debug/release var... + if test "$DEBUG" = "1"; then + BUILD="debug" + elif test "$DEBUG" = ""; then + BUILD="release" + fi + fi + if test "$UNICODE" = "auto"; then + UNICODE=$WX_UNICODE + fi + if test "$SHARED" = "auto"; then + SHARED=$WX_SHARED + fi + if test "$TOOLKIT" = "auto"; then + TOOLKIT=$WX_PORT + fi + +dnl dnl respect the DEBUG variable adding the optimize/debug flags +dnl dnl NOTE: the CXXFLAGS are merged together with the CPPFLAGS so we +dnl dnl don't need to set them, too +dnl if test "$DEBUG" = "1"; then +dnl CXXFLAGS="$CXXFLAGS -g -O0" +dnl CFLAGS="$CFLAGS -g -O0" +dnl else +dnl CXXFLAGS="$CXXFLAGS -O2" +dnl CFLAGS="$CFLAGS -O2" +dnl fi + ]) + +dnl --------------------------------------------------------------------------- +dnl WX_BOOLOPT_SUMMARY([name of the boolean variable to show summary for], +dnl [what to print when var is 1], +dnl [what to print when var is 0]) +dnl +dnl Prints $2 when variable $1 == 1 and prints $3 when variable $1 == 0. +dnl This macro mainly exists just to make configure.ac scripts more readable. +dnl +dnl NOTE: you need to use the [" my message"] syntax for 2nd and 3rd arguments +dnl if you want that m4 avoid to throw away the spaces prefixed to the +dnl argument value. +dnl --------------------------------------------------------------------------- +AC_DEFUN([WX_BOOLOPT_SUMMARY], + [ + if test "x$$1" = "x1" ; then + echo $2 + elif test "x$$1" = "x0" ; then + echo $3 + else + echo "$1 is $$1" + fi + ]) + +dnl --------------------------------------------------------------------------- +dnl WX_STANDARD_OPTIONS_SUMMARY_MSG +dnl +dnl Shows a summary message to the user about the WX_* variable contents. +dnl This macro is used typically at the end of the configure script. +dnl --------------------------------------------------------------------------- +AC_DEFUN([WX_STANDARD_OPTIONS_SUMMARY_MSG], + [ + echo + echo " The wxWidgets build which will be used by $PACKAGE_NAME $PACKAGE_VERSION" + echo " has the following settings:" + WX_BOOLOPT_SUMMARY([WX_DEBUG], [" - DEBUG build"], [" - RELEASE build"]) + WX_BOOLOPT_SUMMARY([WX_UNICODE], [" - UNICODE mode"], [" - ANSI mode"]) + WX_BOOLOPT_SUMMARY([WX_SHARED], [" - SHARED mode"], [" - STATIC mode"]) + echo " - VERSION: $WX_VERSION_FULL" + echo " - PORT: $WX_PORT" + ]) + + +dnl --------------------------------------------------------------------------- +dnl WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN, WX_STANDARD_OPTIONS_SUMMARY_MSG_END +dnl +dnl Like WX_STANDARD_OPTIONS_SUMMARY_MSG macro but these two macros also gives info +dnl about the configuration of the package which used the wxpresets. +dnl +dnl Typical usage: +dnl WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN +dnl echo " - Package setting 1: $SETTING1" +dnl echo " - Package setting 2: $SETTING1" +dnl ... +dnl WX_STANDARD_OPTIONS_SUMMARY_MSG_END +dnl +dnl --------------------------------------------------------------------------- +AC_DEFUN([WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN], + [ + echo + echo " ----------------------------------------------------------------" + echo " Configuration for $PACKAGE_NAME $PACKAGE_VERSION successfully completed." + echo " Summary of main configuration settings for $PACKAGE_NAME:" + WX_BOOLOPT_SUMMARY([DEBUG], [" - DEBUG build"], [" - RELEASE build"]) + WX_BOOLOPT_SUMMARY([UNICODE], [" - UNICODE mode"], [" - ANSI mode"]) + WX_BOOLOPT_SUMMARY([SHARED], [" - SHARED mode"], [" - STATIC mode"]) + ]) + +AC_DEFUN([WX_STANDARD_OPTIONS_SUMMARY_MSG_END], + [ + WX_STANDARD_OPTIONS_SUMMARY_MSG + echo + echo " Now, just run make." + echo " ----------------------------------------------------------------" + echo + ]) + + +dnl --------------------------------------------------------------------------- +dnl Deprecated macro wrappers +dnl --------------------------------------------------------------------------- + +AC_DEFUN([AM_OPTIONS_WXCONFIG], [WX_CONFIG_OPTIONS]) +AC_DEFUN([AM_PATH_WXCONFIG], [ + WX_CONFIG_CHECK([$1],[$2],[$3],[$4],[$5]) +]) + + diff --git a/m4/zlib.m4 b/m4/zlib.m4 new file mode 100644 index 00000000..b597e57e --- /dev/null +++ b/m4/zlib.m4 @@ -0,0 +1,135 @@ +dnl ---------------------------------------------------- +dnl AC_OPTIONS_ZLIB +dnl +dnl Add support for --with-zlib command-line parameter. +dnl PREFIX may be a directory prefix where zlib is installed, e.g. /usr/local +dnl or may be one of the following special keywords: +dnl sys - use system zlib +dnl ---------------------------------------------------- +AC_DEFUN([AC_OPTIONS_ZLIB], +[ + AC_ARG_WITH( + [zlib], + AS_HELP_STRING( + [--with-zlib=PREFIX], + [use zlib in PREFIX]), + [ac_zlib="$withval"], + [ac_zlib=yes]) +]) + + +dnl ---------------------------------------------------- +dnl AC_CHECK_ZLIB([MIN_ZLIB_VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl check if zlib is on the system and is at least MIN_ZLIB_VERSION +dnl ---------------------------------------------------- +AC_DEFUN([AC_CHECK_ZLIB], +[AC_REQUIRE([AC_OPTIONS_ZLIB])dnl +m4_define([ac_zver_max], [m4_bregexp([$1], [\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)], [\1])])dnl +m4_define([ac_zver_mid], [m4_bregexp([$1], [\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)], [\2])])dnl +m4_define([ac_zver_min], [m4_bregexp([$1], [\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)], [\3])])dnl + + case "$ac_zlib" in + no) + ifelse([$3], , :, [$3]) + ;; + yes | sys) + ;; + *) + ac_zlib_prefix="$ac_zlib" + esac + + if test -n "$ac_zlib_prefix"; then + ac_tmp_CPPFLAGS="$CPPFLAGS" + ac_tmp_LDFLAGS="$LDFLAGS" + CPPFLAGS="$CPPFLAGS -I$ac_zlib_prefix/include" + LDFLAGS="-L$ac_zlib_prefix/lib" + fi + ac_tmp_LIBS="$LIBS" + LIBS="-lz $LIBS" + AC_MSG_CHECKING([for zlib >= $1]) + AC_RUN_IFELSE([ + AC_LANG_PROGRAM([[ + #include + #include + ]], [dnl Do not use double-quoting here! + char *zver = zlibVersion(); + FILE *f=fopen("conftestval", "w"); + if (!f) return 1; + fprintf(f, "%s", + zver[[0]] > 'ac_zver_max' || + (zver[[0]] == 'ac_zver_max' && + (zver[[2]] > 'ac_zver_mid' || + (zver[[2]] == 'ac_zver_mid' && + zver[[4]] >= 'ac_zver_min'))) ? "yes" : "no"); + fclose(f); + f=fopen("conftestver", "w"); + if (f) { + fprintf(f, "%s", ZLIB_VERSION); + fclose(f); + } + ]) + ], [ + if test -f conftestval; then + result=`cat conftestval` + else + result=no + fi + if test x$result = xyes; then + if test -f conftestver; then + ZLIB_VERSION=`cat conftestver` + z_version=" (version $ZLIB_VERSION)" + else + z_version="" + fi + fi + AC_MSG_RESULT([$result$z_version]) + ], [ + result=no + AC_MSG_RESULT([$result]) + ], [ + result=no + z_version='' + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + #include + ]], [[ + const char zver[] = "\nZLIB_VERSION_START" ZLIB_VERSION "ZLIB_VERSION_END\n"; + zlibVersion(); + ]]) + ], [ + ZLIB_VERSION=`grep -a '^ZLIB_VERSION_START.*ZLIB_VERSION_END$' conftest$ac_exeext | sed 's/^ZLIB_VERSION_START\(.*\)ZLIB_VERSION_END$/\1/'` + ac_cross_zver_max="`echo $ZLIB_VERSION | cut -d. -f1`" + ac_cross_zver_mid="`echo $ZLIB_VERSION | cut -d. -f2`" + ac_cross_zver_min="`echo $ZLIB_VERSION | cut -d. -f3`" + if test "$ac_cross_zver_max" -gt "ac_zver_max"; then + result=yes + elif test "$ac_cross_zver_max" -eq "ac_zver_max"; then + if test "$ac_cross_zver_mid" -gt "ac_zver_mid"; then + result=yes + elif "$ac_cross_zver_mid" -eq "ac_zver_mid"; then + if test "$ac_cross_zver_min" -ge "ac_zver_min"; then + result=yes + fi + fi + fi + if test x$result = xyes; then + z_version=" (version $ZLIB_VERSION)" + fi + ]) + AC_MSG_RESULT([$result$z_version]) + ]) + AS_IF([test x$result = xno], [ + if test "${ac_tmp_CPPFLAGS+set}" = set; then + CPPFLAGS="$ac_tmp_CPPFLAGS" + fi + if test "${ac_tmp_LDFLAGS+set}" = set; then + LDFLAGS="$ac_tmp_LDFLAGS" + fi + LIBS="$ac_tmp_LIBS" + $3 + ], [$2]) + +m4_undefine([ac_zver_max])dnl +m4_undefine([ac_zver_mid])dnl +m4_undefine([ac_zver_min])dnl +]) diff --git a/missing b/missing new file mode 100755 index 00000000..09edd884 --- /dev/null +++ b/missing @@ -0,0 +1,357 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2005-02-08.22 + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# 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, 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. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case "$1" in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). +case "$1" in + lex|yacc) + # Not GNU programs, they don't have --version. + ;; + + tar) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case "$1" in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case "$f" in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` + test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` + fi + if [ -f "$file" ]; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + touch $file + ;; + + tar) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case "$firstarg" in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case "$firstarg" in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/mkinstalldirs b/mkinstalldirs new file mode 100755 index 00000000..5d26a485 --- /dev/null +++ b/mkinstalldirs @@ -0,0 +1,150 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy + +scriptversion=2005-02-02.21 + +# Original author: Noah Friedman +# Created: 1993-05-16 +# Public domain. +# +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +errstatus=0 +dirmode="" + +usage="\ +Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... + +Create each directory DIR (with mode MODE, if specified), including all +leading file name components. + +Report bugs to ." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" + exit $? + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --version) + echo "$0 $scriptversion" + exit $? + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and +# mkdir -p a/c at the same time, both will detect that a is missing, +# one will create a, then the other will try to create a and die with +# a "File exists" error. This is a problem when calling mkinstalldirs +# from a parallel make. We use --version in the probe to restrict +# ourselves to GNU mkdir, which is thread-safe. +case $dirmode in + '') + if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + test -d ./-p && rmdir ./-p + test -d ./--version && rmdir ./--version + fi + ;; + *) + if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && + test ! -d ./--version; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + else + # Clean up after NextStep and OpenStep mkdir. + for d in ./-m ./-p ./--version "./$dirmode"; + do + test -d $d && rmdir $d + done + fi + ;; +esac + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr="" + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 00000000..67a442b1 --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1,33 @@ +# Set of available languages. +ar +bg +ca +cs +da +de +el +en_GB +es +et_EE +eu +fi +fr +gl +hr +hu +it +it_CH +ja +ko_KR +lt +nl +nn +pl +pt_BR +pt_PT +ru +sl +sv +tr +zh_CN +zh_TW diff --git a/po/Makefile.in.in b/po/Makefile.in.in new file mode 100644 index 00000000..f7b2a95a --- /dev/null +++ b/po/Makefile.in.in @@ -0,0 +1,318 @@ +# Makefile for PO directory in any package using GNU gettext. +# Copyright (C) 1995-1997, 2000-2002 by Ulrich Drepper +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU General Public +# License but which still want to provide support for the GNU gettext +# functionality. +# Please note that the actual code of GNU gettext is covered by the GNU +# General Public License and is *not* in the public domain. + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = /bin/sh +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datarootdir = @datarootdir@ +datadir = @datadir@ +localedir = $(datadir)/locale +gettextsrcdir = $(datadir)/gettext/po + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +mkinstalldirs = $(SHELL) `case "$(MKINSTALLDIRS)" in /*) echo "$(MKINSTALLDIRS)" ;; *) echo "$(top_builddir)/$(MKINSTALLDIRS)" ;; esac` + +GMSGFMT = @GMSGFMT@ +MSGFMT = @MSGFMT@ +XGETTEXT = @XGETTEXT@ +MSGMERGE = msgmerge +MSGMERGE_UPDATE = @MSGMERGE@ --update +MSGINIT = msginit +MSGCONV = msgconv +MSGFILTER = msgfilter + +POFILES = @POFILES@ +GMOFILES = @GMOFILES@ +UPDATEPOFILES = @UPDATEPOFILES@ +DUMMYPOFILES = @DUMMYPOFILES@ +DISTFILES.common = Makefile.in.in Makevars remove-potcdate.sin \ +$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) +DISTFILES = $(DISTFILES.common) POTFILES.in $(DOMAIN).pot \ +$(POFILES) $(GMOFILES) \ +$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) + +POTFILES = \ + +CATALOGS = @CATALOGS@ + +# Makevars gets inserted here. (Don't remove this line!) + +.SUFFIXES: +.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-update + +.po.mo: + @echo "$(MSGFMT) -c -o $@ $<"; \ + $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ + +.po.gmo: + @lang=`echo $* | sed -e 's,.*/,,'`; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ + cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo + +.sin.sed: + sed -e '/^#/d' $< > t-$@ + mv t-$@ $@ + + +all: all-@USE_NLS@ + +all-yes: $(CATALOGS) +all-no: + +# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', +# otherwise packages like GCC can not be built if only parts of the source +# have been downloaded. + +$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ + --files-from=$(srcdir)/POTFILES.in \ + --copyright-holder='$(COPYRIGHT_HOLDER)' + test ! -f $(DOMAIN).po || { \ + if test -f $(srcdir)/$(DOMAIN).pot; then \ + sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ + sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ + if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ + else \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + else \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + } + +$(srcdir)/$(DOMAIN).pot: + $(MAKE) $(DOMAIN).pot-update + +$(POFILES): $(srcdir)/$(DOMAIN).pot + @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ + cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot + + +install: install-exec install-data +install-exec: +install-data: install-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + for file in $(DISTFILES.common); do \ + $(INSTALL_DATA) $(srcdir)/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +install-data-no: all +install-data-yes: all + $(mkinstalldirs) $(DESTDIR)$(datadir) + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkinstalldirs) $(DESTDIR)$$dir; \ + if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ + $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ + echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ + fi; \ + done; \ + done + +install-strip: install + +installdirs: installdirs-exec installdirs-data +installdirs-exec: +installdirs-data: installdirs-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + else \ + : ; \ + fi +installdirs-data-no: +installdirs-data-yes: + $(mkinstalldirs) $(DESTDIR)$(datadir) + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkinstalldirs) $(DESTDIR)$$dir; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + fi; \ + done; \ + done + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: uninstall-exec uninstall-data +uninstall-exec: +uninstall-data: uninstall-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext"; then \ + for file in $(DISTFILES.common); do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +uninstall-data-no: +uninstall-data-yes: + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + done; \ + done + +check: all + +dvi info tags TAGS ID: + +mostlyclean: + rm -f remove-potcdate.sed + rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po + rm -fr *.o + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES *.mo + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f $(GMOFILES) + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: + $(MAKE) update-po + @$(MAKE) dist2 +# This is a separate target because 'update-po' must be executed before. +dist2: $(DISTFILES) + dists="$(DISTFILES)"; \ + if test -f $(srcdir)/ChangeLog; then dists="$$dists ChangeLog"; fi; \ + if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ + for file in $$dists; do \ + if test -f $$file; then \ + cp -p $$file $(distdir); \ + else \ + cp -p $(srcdir)/$$file $(distdir); \ + fi; \ + done + +update-po: Makefile + $(MAKE) $(DOMAIN).pot-update + $(MAKE) $(UPDATEPOFILES) + $(MAKE) update-gmo + +# General rule for updating PO files. + +.nop.po-update: + @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ + if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ + cd $(srcdir); \ + if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "msgmerge for $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +$(DUMMYPOFILES): + +update-gmo: Makefile $(GMOFILES) + @: + +Makefile: Makefile.in.in $(top_builddir)/config.status POTFILES.in + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ + $(SHELL) ./config.status + +force: + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/po/Makevars b/po/Makevars new file mode 100644 index 00000000..13a9c2c9 --- /dev/null +++ b/po/Makevars @@ -0,0 +1,25 @@ +# Makefile variables for PO directory in any package using GNU gettext. + +# Usually the message domain is the same as the package name. +DOMAIN = $(PACKAGE) + +# These two variables depend on the location of this directory. +subdir = po +top_builddir = .. + +# These options get passed to xgettext. +XGETTEXT_OPTIONS = --keyword=_ --keyword=wxTRANSLATE --keyword=wxPLURAL:1,2 + +# This is the copyright holder that gets inserted into the header of the +# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding +# package. (Note that the msgstr strings, extracted from the package's +# sources, belong to the copyright holder of the package.) Translators are +# expected to transfer the copyright for their translations to this person +# or entity, or to disclaim their copyright. The empty string stands for +# the public domain; in this case the translators are expected to disclaim +# their copyright. +COPYRIGHT_HOLDER = Free Software Foundation, Inc. + +# This is the list of locale categories, beyond LC_MESSAGES, for which the +# message catalogs shall be used. It is usually empty. +EXTRA_LOCALE_CATEGORIES = diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 00000000..98b2cadb --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,79 @@ +src/Parser.cpp +src/libs/ec/cpp/RemoteConnect.cpp +src/libs/ec/cpp/ECSpecialTags.cpp +src/libs/ec/cpp/ECSocket.cpp +src/ThreadTasks.cpp +src/BaseClient.cpp +src/FriendListCtrl.cpp +src/SharedFilesCtrl.cpp +src/UploadQueue.cpp +src/kademlia/kademlia/SearchManager.cpp +src/ListenSocket.cpp +src/webserver/src/WebServer.cpp +src/webserver/src/WebInterface.cpp +src/StatTree.cpp +src/HTTPDownload.cpp +src/utils/wxCas/src/wxcasprefs.cpp +src/utils/wxCas/src/linuxmon.cpp +src/utils/wxCas/src/wxcas.cpp +src/utils/wxCas/src/wxcasframe.cpp +src/utils/wxCas/src/onlinesig.cpp +src/utils/aLinkCreator/src/md4.cpp +src/utils/aLinkCreator/src/ed2khash.cpp +src/utils/aLinkCreator/src/alcframe.cpp +src/utils/aLinkCreator/src/alcc.cpp +src/utils/aLinkCreator/src/alc.cpp +src/DataToText.cpp +src/Preferences.cpp +src/ServerListCtrl.cpp +src/OScopeCtrl.cpp +src/amuleDlg.cpp +src/PrefsUnifiedDlg.cpp +src/ExternalConn.cpp +src/UploadClient.cpp +src/TerminationProcess.cpp +src/ServerWnd.cpp +src/Statistics.cpp +src/MuleTextCtrl.cpp +src/SearchList.cpp +src/ClientTCPSocket.cpp +src/KadDlg.cpp +src/Server.cpp +src/Logger.cpp +src/AddFriend.cpp +src/SearchListCtrl.cpp +src/amule-remote-gui.cpp +src/DownloadListCtrl.cpp +src/PartFile.cpp +src/KnownFileList.cpp +src/SharedFileList.cpp +src/CommentDialogLst.cpp +src/ServerConnect.cpp +src/DownloadQueue.cpp +src/TextClient.cpp +src/ServerSocket.cpp +src/IP2Country.cpp +src/TransferWnd.cpp +src/FileDetailListCtrl.cpp +src/KnownFile.cpp +src/CommentDialog.cpp +src/PartFileConvert.cpp +src/OtherFunctions.cpp +src/IPFilter.cpp +src/StatisticsDlg.cpp +src/FileDetailDialog.cpp +src/muuli_wdr.cpp +src/CatDialog.cpp +src/ExternalConnector.cpp +src/ClientCreditsList.cpp +src/amuled.cpp +src/ClientListCtrl.cpp +src/ClientDetailDialog.cpp +src/SearchDlg.cpp +src/MuleTrayIcon.cpp +src/ChatSelector.cpp +src/MuleNotebook.cpp +src/ServerList.cpp +src/UserEvents.cpp +src/amule.cpp +src/FriendList.cpp diff --git a/po/Rules-quot b/po/Rules-quot new file mode 100644 index 00000000..5f46d237 --- /dev/null +++ b/po/Rules-quot @@ -0,0 +1,42 @@ +# Special Makefile rules for English message catalogs with quotation marks. + +DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot + +.SUFFIXES: .insert-header .po-update-en + +en@quot.po-update: en@quot.po-update-en +en@boldquot.po-update: en@boldquot.po-update-en + +.insert-header.po-update-en: + @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ + if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + ll=`echo $$lang | sed -e 's/@.*//'`; \ + LC_ALL=C; export LC_ALL; \ + cd $(srcdir); \ + if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "creation of $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +en@quot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header + +en@boldquot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header + +mostlyclean: mostlyclean-quot +mostlyclean-quot: + rm -f *.insert-header diff --git a/po/amule.pot b/po/amule.pot new file mode 100644 index 00000000..04b2694c --- /dev/null +++ b/po/amule.pot @@ -0,0 +1,6780 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# 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: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr "" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr "" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "" + +#: src/BaseClient.cpp:1876 +#, c-format +msgid "Requested: %s\n" +msgstr "" + +#: src/BaseClient.cpp:1878 +#, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +msgstr[1] "" + +#: src/BaseClient.cpp:1881 +#, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +msgstr[1] "" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "" + +#: src/FriendListCtrl.cpp:273 +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "" + +#: src/FriendListCtrl.cpp:275 +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "" + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "" + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "" + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "" + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "" + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "" + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "" + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "" + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +msgid " with " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +msgid " kB/s" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +msgid "Cancelled !" +msgstr "" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "" + +#: src/ServerListCtrl.cpp:428 +msgid "Mark server as static" +msgstr "" + +#: src/ServerListCtrl.cpp:429 +msgid "Mark server as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:431 +msgid "Mark servers as static" +msgstr "" + +#: src/ServerListCtrl.cpp:432 +msgid "Mark servers as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:438 +msgid "Remove server" +msgstr "" + +#: src/ServerListCtrl.cpp:440 +msgid "Remove servers" +msgstr "" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "" + +#: src/ServerListCtrl.cpp:449 +msgid "Copy ED2k links to clipboard" +msgstr "" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "" + +#: src/ServerListCtrl.cpp:570 +msgid "Are you sure that you wish to delete the selected server?" +msgstr "" + +#: src/ServerListCtrl.cpp:572 +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "" + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr "" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr "" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "" + +#: src/amuleDlg.cpp:666 +msgid "ED2K: Connecting" +msgstr "" + +#: src/amuleDlg.cpp:670 +msgid "ED2K: Disconnected" +msgstr "" + +#: src/amuleDlg.cpp:676 +msgid "Kad: Firewalled" +msgstr "" + +#: src/amuleDlg.cpp:680 +msgid "Kad: Connected" +msgstr "" + +#: src/amuleDlg.cpp:685 +msgid "Kad: Connecting" +msgstr "" + +#: src/amuleDlg.cpp:689 +msgid "Kad: Off" +msgstr "" + +#: src/amuleDlg.cpp:718 +msgid "Stop the current connection attempts" +msgstr "" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "" + +#: src/amuleDlg.cpp:722 +msgid "Disconnect from the currently connected networks" +msgstr "" + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "" + +#: src/amuleDlg.cpp:726 +msgid "Connect to the currently enabled networks" +msgstr "" + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "" + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:980 +#, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:987 +#, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:999 +#, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "" + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "" + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "" + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "" + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "" + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "" + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "" + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "" + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "" + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "" + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "" + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "" + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "" + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "" + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "" + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "" + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "" + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "" + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "" + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "" + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "" + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "" + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "" + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "" + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "" + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "" + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "" + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "" + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "" + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "" + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "" + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "" + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "" + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "" + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "" + +#: src/DownloadListCtrl.cpp:578 +msgid "Are you sure that you wish to delete the selected file?" +msgstr "" + +#: src/DownloadListCtrl.cpp:580 +msgid "Are you sure that you wish to delete the selected files?" +msgstr "" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "" + +#: src/DownloadListCtrl.cpp:2222 +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2260 +#, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "" + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "" + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "" + +#: src/PartFile.cpp:1019 +#, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "" + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "" + +#: src/SharedFileList.cpp:352 +#, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "" +msgstr[1] "" + +#: src/SharedFileList.cpp:358 +#, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "" +msgstr[1] "" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "" + +#: src/CommentDialogLst.cpp:104 +#, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "" + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "" + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "" + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "" + +#: src/ServerConnect.cpp:391 +#, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "" + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "" + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "" + +#: src/DownloadQueue.cpp:175 +#, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "" +msgstr[1] "" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "" + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "" + +#: src/TextClient.cpp:305 +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" + +#: src/TextClient.cpp:343 +msgid "Processing by hash: " +msgstr "" + +#: src/TextClient.cpp:358 +msgid "Processing by filename: " +msgstr "" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "" + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "" + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "" + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "" + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "" + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "" + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "" + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "" + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "" + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "" + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "" + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "" + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "" + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "" + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "" + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "" + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "" + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "" + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "" + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "" + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "" + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "" + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "" + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "" + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "" + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "" + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "" + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "" + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "" + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "" + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "" + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "" + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "" + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "" + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "" + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "" + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "" + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "" + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "" + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "" + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "" + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "" + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "" + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "" + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "" + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "" + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "" + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "" + +#: src/ServerSocket.cpp:539 +#, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "" + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "" + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "" + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "" + +#: src/IP2Country.cpp:73 +#, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "" +msgstr[1] "" + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "" + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "" + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "" + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "" + +#: src/OtherFunctions.cpp:121 +msgid "byte" +msgid_plural "bytes" +msgstr[0] "" +msgstr[1] "" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "" + +#: src/OtherFunctions.cpp:156 +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "" +msgstr[1] "" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "" + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" + +#: src/IPFilter.cpp:330 +#, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +msgstr[1] "" + +#: src/IPFilter.cpp:332 +#, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +msgstr[1] "" + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "" + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "" + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "" + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "" + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "" + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "" + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "" + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "" + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "" + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "" + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "" + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "" + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "" + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "" + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "" + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "" + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "" + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "" + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "" + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "" + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "" + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "" + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "" + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "" + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "" + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "" + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr "" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "" + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "" + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "" + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "" + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "" + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "" + +#: src/ExternalConnector.cpp:188 +#, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "" + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "" + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "" + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "" + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "" + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "" + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "" + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "" + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "" + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "" + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "" + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "" + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "" + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "" + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "" + +#: src/ClientCreditsList.cpp:168 +#, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "" +msgstr[1] "" + +#: src/ClientCreditsList.cpp:171 +#, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] "" +msgstr[1] "" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "" + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "" + +#: src/ClientDetailDialog.cpp:190 +#, c-format +msgid "%u (QR: %u)" +msgstr "" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "" + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "" + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "" + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" + +#: src/ServerList.cpp:168 +#, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerList.cpp:170 +#, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "" + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "" + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "" + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "" + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "" + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "" + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "" + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "" + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "" + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "" + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "" diff --git a/po/ar.po b/po/ar.po new file mode 100644 index 00000000..594a8d4a --- /dev/null +++ b/po/ar.po @@ -0,0 +1,7785 @@ +# Translation of amule interface to arabic +# Copyright (C) YEAR aMule Team +# This file is distributed under the same license as the PACKAGE package. +# saleh alhathal , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: 1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2004-03-28 22:15+0300\n" +"Last-Translator: saleh alhathal \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "اكتمال" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "اكتمل" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "ايقاف مؤقت" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "خاطئ" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "تحميل" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "انتظار" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "غير معرف" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr "" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr "" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "طلب:" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "إحصائية الملفات لهذة الجلسة: قبل %d من %d طلب , %s تم نقله \n" +msgstr[1] "إحصائية الملفات لهذة الجلسة: قبل %d من %d طلب , %s تم نقله \n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "إحصائية الملفات لهذة الجلسة: قبل %d من %d طلب , %s تم نقله \n" +msgstr[1] "إحصائية الملفات لهذة الجلسة: قبل %d من %d طلب , %s تم نقله \n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "طلب ملف غير معروف" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "اسم مستخدم" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "اصدقاء" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "عرض &تفاصيل" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "اضف صديق" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "احذف صديق" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "ارسل &رسالة" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "اعرض الملفات" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "هل انت متاكد من الغاء زحذف هذه الملفات ؟\n" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "هل انت متاكد من الغاء زحذف هذه الملفات ؟\n" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "إلغاء" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "اسم الملف" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "حجم" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "نوع" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "أولوية" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "تعريف ملف" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "طلبات" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "طلبات مقبوله" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "بينات محوله" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "أجزاء مكتسبة" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "ملفات مشاركة" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "متدني جدا" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "متدني" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "عادي" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "مرتفع" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "عالي جدا" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "ذاتي" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "اعد تسمية" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "يجب ان تكون ذا هوية مرتفعة لتتمكن من انشاء رابط مصدر" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "ملفات مشاركة (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "" + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "" + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "" + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "" + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "" + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "" + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "" + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "تحميل ..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "اعدادت" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "تصفح" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "معاد" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +msgid " with " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +msgid " kB/s" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "هوية متدنية" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "غير متصل" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "إلغاء" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "اضف" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "واضح" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "ابدء" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "خروج" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "ذاتي منخفض" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "ذاتي " + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "ذاتي عالي" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "يتم الإتصال" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "اطلب" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "اتصال من خلال خادم" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "اﻻنتظار ممتلئ" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "في اﻻنتظار" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "نقل" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "اجزاء غير مطلوبة" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "عدد اتصلات كثيرة" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "حظر" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "اﻹفتراضية بالنظام" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "العربيه" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "البلغاريه" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "الدانماركيه" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "الهولنديه" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "الأستونيه" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "الفلنديه" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "الفرنسية" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "الألمانيه" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "الهنغاريه" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "الايطاليه" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "الكوريه" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "الليتوانيه" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "البرتغاليه" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "الروسيه" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "الإسبانيه" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "إسم الخادم" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "منفذ" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "وصف" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "مستخدمين" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "ملفات" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "فشل" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "ثابت" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "نسخة" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "معلومات" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "نعم" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "ﻻ" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "خادمات (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "خادم" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "" + +#: src/ServerListCtrl.cpp:428 +msgid "Mark server as static" +msgstr "" + +#: src/ServerListCtrl.cpp:429 +msgid "Mark server as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:431 +msgid "Mark servers as static" +msgstr "" + +#: src/ServerListCtrl.cpp:432 +msgid "Mark servers as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:438 +msgid "Remove server" +msgstr "الغاء الخادم" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "الغاء الخادم" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "الغاء كل الخادمات" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "نسخ رابط ED2k للحافظة" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "نسخ رابط ED2k للحافظة" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "هل انت متاكد من الغاء زحذف هذه الملفات ؟\n" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "هل انت متاكد من الغاء زحذف هذه الملفات ؟\n" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "تعطيل [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "" + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "خطأ قاتل :فشل في تكوين الموَقت" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr "" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr "" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "يتم الإتصال" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "فصل الإتصال" + +#: src/amuleDlg.cpp:676 +msgid "Kad: Firewalled" +msgstr "" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "متصل" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "يتم الإتصال" + +#: src/amuleDlg.cpp:689 +msgid "Kad: Off" +msgstr "" + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "إيقاف محاولة اﻹتصال الحاليه" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "فصل" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "فصل من المستضيف الحالي" + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "إتصال" + +#: src/amuleDlg.cpp:726 +msgid "Connect to the currently enabled networks" +msgstr "" + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "تحميل: %.1f(%.1f) | رفع: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "رفع : %.1f |تحميل : %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "هل تريد حقا الخروج من البرنامج؟" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "تاكيد الخروج" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "لم يحديد إمر لتشغيل المتصفح" + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "بحث" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "نافذة البحث" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "نقل" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "نافذة ملفات النقل" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "نافذة ملفات المشاركة" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "رسائل" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "نافذة الرسائل" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "احصائات" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "نافذة اﻻحصائيات" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "نافذة اﻹعدادات" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "عام" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "اتصال" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "تحكم عن بعد" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "مجلدات" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "رفع :0.0 | تحميل : 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "تصفح wav" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "ملف wav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "حرر قائمة الخادمات" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"أضف هنا عنوان لتحميل ملفات server.met \n" +"عنوان واحد فقط لكل سطر" + +#: src/PrefsUnifiedDlg.cpp:980 +#, fuzzy, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "تحيدث كل:5 ثواني" +msgstr[1] "تحيدث كل:5 ثواني" + +#: src/PrefsUnifiedDlg.cpp:987 +#, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:999 +#, fuzzy, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "تحيدث كل:5 ثواني" +msgstr[1] "تحيدث كل:5 ثواني" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, fuzzy, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "فترة تحديث الإتصال بالخادم %i دقيقة" +msgstr[1] "فترة تحديث الإتصال بالخادم %i دقيقة" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "فترة تحديث الإتصال بالخادم :معطل" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "" + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "" + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "" + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "" + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "" + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "" + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "" + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "" + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "جاري البحث ستم جلب النتيجة في لحظة" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "" + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "" + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "" + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "" + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "" + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "" + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "" + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "" + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "" + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "" + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "" + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "" + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "" + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "" + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "" + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "" + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "" + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "" + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "" + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "" + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "متصل" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "عنوان شبكي :منفذ" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "هوية" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "فصل الإتصال" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "موافق" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "" + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "فترة التشغيل: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "نقل" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "ارفع" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "متوسط زمن التحميل : %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "تحميل" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "اعادة اﻹتصال : %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "الوقت منذ بدء التحميل: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "متصل بالخادم منذ : %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "عميل" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "الخادمات" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "إحتلال الخادم: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "مجموع حجم ملفات المشاركة : %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "متوسط حجم الملف : %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "" + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "" + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "" + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "" + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "أضف صديق" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "يجب ان تضيف عنوان شبكي ومنفذ صحيحان!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "مصدر" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "ملف" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "التحميل" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "صنف" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "" + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "خطأ" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "نقل" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "اكمل" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "سرعة" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "تقدم" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "حالة" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "الوقت المتبقي" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "اخر اكتمال" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "اخر إستقبال" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "هل انت متاكد من الغاء زحذف هذه الملفات ؟\n" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "هل انت متاكد من الغاء زحذف هذه الملفات ؟\n" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "%إيقاف" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&إيقاف مؤقت" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "%إكمل" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "إ&نتهاء التنظيف" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "خيرات اضافية" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "مشاهدة" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "اعرض الملف &تفاصيل" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "اعرض كل التعليقات" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "&فتح الملف" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "اضف لي صديق" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "طلب ملف اخر" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "تحميل (%i)" + +#: src/DownloadListCtrl.cpp:2222 +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2260 +#, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "خطأ: فشل في تكوين ملف اجزاء)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "" + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "فشل لفتح %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "" + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "فشل في حفظ ملف part.met.seeds لي %s" + +#: src/PartFile.cpp:1019 +#, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "خطأ غير متوقع أثناء إكمال ملف %s. الملف متوقف" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "إيقاف" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "" + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "وجد %i ملف مشاركة معرف" +msgstr[1] "وجد %i ملف مشاركة معرف" + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "وجد %i ملفات مشاركة معروفة , %i غير معروفة" +msgstr[1] "وجد %i ملفات مشاركة معروفة , %i غير معروفة" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "ملف تعليقات" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "تقيم" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "ﻻ تعليق " + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "ﻻ تعليق " +msgstr[1] "ﻻ تعليق " + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "فشل في اﻹتصال باي خادم في القائمة القيام بمحاولة اخرى" + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "" + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "ﻻ يوجد خادمات صحيحة في قائمة الخادمات" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "متصل بي %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "إتصال بي : %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "خطأ قاتل اثناء محاولة اﻹتصال . احتمال أنك غير متصل باﻹنترنت" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "فقد اﻹتصال بي %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) يظهر انه ﻻ يعمل" + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "" + +#: src/ServerConnect.cpp:391 +#, fuzzy, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "اﻹتصال الذاتي بالخادم سيعيد المحاولة بعد %d ثانية" +msgstr[1] "اﻹتصال الذاتي بالخادم سيعيد المحاولة بعد %d ثانية" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "اﻹتصال فقد" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "" + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "" + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "ﻻ وجود ﻻجزاء الملفات" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "وجد %i جزء ملفات" +msgstr[1] "وجد %i جزء ملفات" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "تحميل %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "قمت بمحاولت تحميل الملف مسبقا %s" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "" + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "" + +#: src/TextClient.cpp:305 +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" + +#: src/TextClient.cpp:343 +msgid "Processing by hash: " +msgstr "" + +#: src/TextClient.cpp:358 +msgid "Processing by filename: " +msgstr "" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "" + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "" + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "" + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "" + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "" + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "" + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "" + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "" + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "" + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "" + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "" + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "" + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "" + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "" + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "" + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "" + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "" + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "" + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "" + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "" + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "" + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "" + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "" + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "" + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "" + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "" + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "" + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "" + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "" + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "" + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "" + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "" + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "" + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "" + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "" + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "" + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "" + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "" + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "" + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "" + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "" + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "" + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "" + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "" + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "" + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "" + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "عميل جديد هو %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "" + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "تلقي %d خادم جديد" +msgstr[1] "تلقي %d خادم جديد" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "" + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "الخادم رفض اخر امر" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "" + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "" + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "" + +#: src/IP2Country.cpp:73 +#, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "" +msgstr[1] "" + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "هل أنت متاكد من حذف كل الملفات في هذا المصنف؟" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "مطلوب التاكيد" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "غير مكتمل" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "فيديو" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "سمعي" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "أرشيف" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "صور" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "نص" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "إختر فلتر العرض" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "اضف مجموعة" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "عرض المجموعة" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "الغاء المجموعة" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "" + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "" + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "إنتظار..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "بايت" +msgstr[1] "بايت" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "بايت" +msgstr[1] "بايت" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "ثانية" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "دقيقة" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "فيديو" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "ارشيف" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "برامج" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "اي" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "غير مقيم" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "غير صحيح / معطوب / مزيف" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "فقير" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "عادل" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "جيد" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "ممتاز" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "الكل" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "الكل ماعدا" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "" + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" + +#: src/IPFilter.cpp:330 +#, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +msgstr[1] "" + +#: src/IPFilter.cpp:332 +#, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +msgstr[1] "" + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "إتصال نشط (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "" + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "ارتكب" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "تحميل ..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "عدد المستخدمين على الخادم الذي تتصل به..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "مستخدمين: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "غير متصل" + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "" + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "بحث" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "إمتداد" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "اقل حجم" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "بايت" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "اكبر حجم" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "" + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "عملاء في اﻻنتظار:" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "ارسل" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "" + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "اغلق" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "" + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "اﻻسم كامل :" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "غير متوفر" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "حجم الملف :" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "حالة جزء الملف :" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "اخر مرة تم اكتمال :" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "ايجاد المصدر :" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "نقل المصدر :" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "احصاء اجزاء الملف :" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "متوفر :" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "نسبة المصادر :" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "" + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "محول :" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "حجم المكمل :" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "معالجة الفاسد بذكاء" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "فقد بسبب فساد :" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "أكتسب بواسطة الضغط :" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "سيطر" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "نظف" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "طبق" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "جودة الملف" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "ﻻ تعليق" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "انعش" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "تحميل ,رجاء انتظر..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "مطلوب معلومات" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "عنوان IP :" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "منفذ :" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "معلومت إضافية" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "اسم المستخدم :" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "الجلسة الحالية" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "المجموع" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "طلب :" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "رفع نشط :" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "سرعة-التحميل" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "الحالي" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "معدل العمل" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "معدل الجلسة" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "سرعة-الرفع" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "تحميل نشط" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "إتصال نشط (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "رفع نشط" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "شجرة اﻻحصائيات" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "اسم المستخدم:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "مصدر" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "مستعار" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "" + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "الغة" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "" + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "خيرات متفرقة" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "بدء مصغر" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "" + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "" + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "" + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "" + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "حدود سعة النطاق" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "الرفع" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "قدرة الخط" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "" + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "تعطيل" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "حد أعلى للمصادر لكل ملف" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "حدود اﻷتصال" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "أعلى أتصال" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "ربط تلقائي عند بدء التشغيل" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "إعادة اﻹتصال عند الفصل" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "إحذ الخادمات التي ﻻ تعمل بعد" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "أعد المحاولة" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "حدث قائمة الخادمات عند بدء التشغيل تلقائي" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "قائمة" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "حدث قائمة الخادمات عند اﻻتصال بخادم" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "حدث قائمة الخادمات عند اتصال عميل" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "إستخدم نظام اﻷولوية" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "إتصال أمن" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "جعل الخادمات المضافة يدويا ذو اولوية عالية" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "I.C.H. نشط" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "أضف الملفات للتحميل بوضع متوقف" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "أضف الملفات للتحميل بوضع ذاتي" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "حاول تحميل القطع اﻻولى واﻻخيرة اوﻻ" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "أضف ملفات مشاركة جديدة بوضع ذاتي" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "إبدا الملف الموقف التالي عند اﻻنتهاء من ملف" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "" + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "مجلد الوصول :" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "مجلد المؤقت :" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "مجلدات المشاركة" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "مشغل الفيديو" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "رسم بياني" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "تحيدث كل:5 ثواني" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "اختر لون اﻻحصائيات" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "خلفية" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "شبكة" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "حمل الحالي" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "معدل تحميل الحالي" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "معدل تحميل الجلسة" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "ارفع الحالي" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "معدل رفع الحالي" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "معدل رفع الجلسة" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "اتصال نشط" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "اختر" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "رسالة قافزة" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "استخدم صوت" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "قفز عندما :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "حدث جديد على السجل" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "ابدء جلسة محادثة جديدة" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "تلقي رسالة محادثة جديدة" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "تحميل أضيف او إنتها" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "نسخة حديثة من aMule" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "اشعار بالبريد" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "قم بارسال رسالة بريدية عند اﻻتمام" + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "خادم SMTP :" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "عنوان البريد :" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!!تحذير!!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "الحد اﻷعلى للتصالات لكل 5 ثواني" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "تقدم طابور ملفات التحميل" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "إظهار نسبة مئوية" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "إظهار شريط التقدم" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "سمة شريط التطور" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "اظهر معدل النقل علي العنوان" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "متغيرلت خادم الشبكة" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "منفذ خادم شبكة" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "زمن تحديث الصفحة (بالثانية)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr " Gzipتمكين ضغط نوع" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "عوامل اﻻتصال الخارجي" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "اقبل اتصال خارجي" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "" + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "" + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "عنوان :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "تعليق :" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "مجلد القادم" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "" + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "تغير الأولوية للملفات الحديثة :" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "ﻻ تغير" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "" + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "معلومات الخادم" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "" + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "سجل aMule" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "قم بالضغط على هذا الزر لتحديث قائمة الخادمات من العنوان ..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "قائمة الخادمات" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "اضافة خادم يدويا : اسم" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "" + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "" + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "اضف خادم يدويا )قم بمل الخانة على اليسار اوﻻ)..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "" + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "الكل" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "ﻻ احد" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "" + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "تمكين التوقيع الشبكي" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "" + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "اختر مكان الملفات القادمة" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "" + +#: src/ExternalConnector.cpp:188 +#, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "" + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "" + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "" + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "" + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "" + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "" + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "" + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "" + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "" + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "" + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "" + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "" + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "" + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "" + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "" + +#: src/ClientCreditsList.cpp:168 +#, fuzzy, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "حمل ملف الرصيد, تم التعرف على %u عميل" +msgstr[1] "حمل ملف الرصيد, تم التعرف على %u عميل" + +#: src/ClientCreditsList.cpp:171 +#, fuzzy, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] "الرصيد منتهى!" +msgstr[1] "الرصيد منتهى!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "" + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "ﻻ تمنع" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "عرض الرفع" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "أظهر المنتظرين" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "إنتظار" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "زمن الرفع" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "أولوية ملف" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "نتيجة" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "طلب" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "اخر مشاهدة" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "داخل اﻻنتظار" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "تفاصيل العميل" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "غير مدعوم" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "غير مكتمل" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "شخص سيئ" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "تأكيد - صحيح" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "غير متوفر" + +#: src/ClientDetailDialog.cpp:190 +#, c-format +msgid "%u (QR: %u)" +msgstr "" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "بلا حدود" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "هوية العميل: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "إسم الخادم: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "عنوان الخادم: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "منفذ TCP: غير جاهز" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "منفذ UDP: غير جاهز" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "توقيع أثناء الإتصال: ممكن" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "توقيع أثناء الإتصال: معطل" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "وقت رفع المعلومات" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "وقت تنزيل المعلومات" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "%i خادمات وجدت في server.met" +msgstr[1] "%i خادمات وجدت في server.met" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d خادم مضاف" +msgstr[1] "%d خادم مضاف" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "" + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "" + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "" + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "فشل في حفظ server.met!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "عنوان شبكي غير صحيح" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "" + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "ﻻ نضمن انه خالي من اﻻخطاء, قد يتسبب باعطال\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "" + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "" + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "" + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "" + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "" + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "" + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "" + +#~ msgid "Sources Dropping" +#~ msgstr "سقوط الخادم" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(حد أدنى 300 / حد أعلى 3000)" + +#~ msgid "Timer (in secs)" +#~ msgstr "توقيت بثانية" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(حد أدنى 60 / حد أعلى 3600)" + +#~ msgid "Global Search" +#~ msgstr "بحث عالمي" + +#~ msgid "Port %d is not available. You will be LOWID" +#~ msgstr "منفذ %d غير صحيح ستكون ذا هوية متدنية" + +#~ msgid "Failed to save" +#~ msgstr "فشل في الحفظ" + +#~ msgid "" +#~ "Unable to launch browser. Please set correct browser executable path in " +#~ "Preferences." +#~ msgstr "لم اتمكن من تشغيل المتصفح. رجاء ضع مسار صحيح للمتصفح في اﻹعدادات." + +#~ msgid "" +#~ " --- This is the first time you run aMule %s ---\n" +#~ "\n" +#~ msgstr "" +#~ " --- هذة أول مرة تقوم بتشغيل aMule %s ---\n" +#~ "\n" + +#~ msgid "This version is a testing version, updated daily, and \n" +#~ msgstr "هذا اﻹصدار إصدار تجريبي ويتم تحديثة يوميا و\n" + +#~ msgid "or kill your dog. But it *should* be safe to use anyway. \n" +#~ msgstr "لكن المفترض انه يعمل بأمان.\n" + +#~ msgid "This version has new SecureIdent support, so your \n" +#~ msgstr "هذة النسخة تدعم هوبة المصدر جديدة لذا \n" + +#~ msgid "client credits will be lost on this first run. \n" +#~ msgstr "سيفقد العملاء ارصدتهم عند اول تشغيل \n" + +#~ msgid "There is no way to fix that, and eMule did the same.\n" +#~ msgstr "ﻻ يوجد طريقة لحلها كما حصل مع eMule\n" + +#~ msgid "Feel free to report any bugs to forum.amule.org" +#~ msgstr "يمكنك التبليغ عن اﻷخطاء في forum.amule.org" + +#~ msgid "Desktop integration" +#~ msgstr "تبني سطح مكتب" + +#~ msgid "Connection established on:" +#~ msgstr "تم الاتصال بي:" + +#~ msgid "Connect to any server" +#~ msgstr "إتصل باي مستظيف" + +#~ msgid "You are not connected to a server!" +#~ msgstr "أنت غير متصل بي مستظيف!" + +#~ msgid "This ed2k link is invalid (%s)" +#~ msgstr "رابط ed2k غير صحيح (%s)" + +#~ msgid "Invalid link: %s" +#~ msgstr "رابط غير صحيح: %s" + +#~ msgid "Filtered IP: %s (%s)" +#~ msgstr "ترشيحIP: %s (%s)" + +#~ msgid "Rating for file '%s' received: %i" +#~ msgstr "تقيم ملف '%s' تم تلقيه: %i" + +#~ msgid "Description for file '%s' received: %s" +#~ msgstr "وصف لي ملف '%s' تولقي : %s" + +#~ msgid "Unable to retrieve shared files from '%s'" +#~ msgstr "غير قادر علي استرجاعملف مشاركة من '%s'" + +#~ msgid "Requesting shared files from '%s'" +#~ msgstr "طلب ملف مشاركة من '%s'" + +#~ msgid "Requesting shared files from user %s (%u) is already in progress" +#~ msgstr "طلب ملفات المشاركةمن المستخدم %s (%u) في طور العمل" + +#~ msgid "NickName: %s\n" +#~ msgstr "إسم مستعار: %s\n" + +#~ msgid "Filestats for all sessions: Accepted %d of %d requests" +#~ msgstr "إحصائية الملفات في كل الجلسات :قبل %d من %d طلب" + +#~ msgid "can't create file '%s'" +#~ msgstr "غير قادر لتكوين ملف '%s'" + +#~ msgid "Can't open file '%s'" +#~ msgstr "غير قادر لفتح ملف '%s'" + +#~ msgid "can't close file descriptor %d" +#~ msgstr "غير قادر لغلق ملف وصف %d" + +#~ msgid "can't read from file descriptor %d" +#~ msgstr "غير قادر قراءة ملف وصف %d" + +#~ msgid "can't write to file descriptor %d" +#~ msgstr "غير قادر كتابة ملف وصف %d" + +#~ msgid "unknown seek origin" +#~ msgstr "المرجع غير معرف" + +#~ msgid "can't find length of file on file descriptor %d" +#~ msgstr "غير قادر للحصول على طول الملف من ملف الوصف %d" + +#~ msgid "can't determine if the end of file is reached on descriptor %d" +#~ msgstr "غير قادر على التاكد من انتهاء الملف من ملف الوصف %d" + +#~ msgid "*** Chatsession Start : " +#~ msgstr "*** بدء جلسة المحادثة :" + +#~ msgid "Message from" +#~ msgstr "رسالة من" + +#~ msgid "failed" +#~ msgstr "فشل" + +#~ msgid "*** Disconnected" +#~ msgstr "*** فصل" + +#~ msgid "Failed to load creditfile" +#~ msgstr "فشل في تحميل ملف الرصيد" + +#~ msgid "Creditfile is out of date and will be replaced" +#~ msgstr "ملف الرصيد قديم وسيتم استبداله" + +#~ msgid "Failed to save creditfile" +#~ msgstr "فشل في حفظ ملف الرصيد" + +#~ msgid "ClientSoftware ->" +#~ msgstr "برنامج العميل ->" + +#~ msgid "<- ClientVersion ->v" +#~ msgstr "<-نسخة العميل ->v" + +#~ msgid "" +#~ "WARNING! Found matching client, to a currently connected client: %s (%s) " +#~ "and with %s" +#~ msgstr "تحذير! وجد عميل مطابق لعميل متصل:%s (%s) مع %s" + +#~ msgid "Check Fake" +#~ msgstr "مراقبة المزيف" + +#~ msgid "Preview [" +#~ msgstr "عرض [" + +#~ msgid "Are you sure that you want to cancel and delete this file ?\n" +#~ msgstr "هل انت متاكد من الغاء وحذف هذا الملف ؟\n" + +#~ msgid "You already have the file %s" +#~ msgstr "تمتلك هذا الملف مسبقا %s" + +#~ msgid "Bad link." +#~ msgstr "رابط غير صالح" + +#~ msgid "not a well-formed ed2k link" +#~ msgstr "رايط ed2k غير مكتمل" + +#~ msgid "Not an ED2K server or file link" +#~ msgstr "ليس رابط خادم او ملف ED2K" + +#~ msgid "can't write file '%s'" +#~ msgstr "غير قادر لكتابة ملف '%s'" + +#~ msgid "New external connection accepted\n" +#~ msgstr "قبل إتصال خارجي جديد\n" + +#~ msgid "done" +#~ msgstr "إنتها" + +#~ msgid "Failed to copy the file '%s' to '%s'" +#~ msgstr "فشل في نسخ ملف '%s' الى '%s'" + +#~ msgid "Impossible to get permissions for file '%s'" +#~ msgstr "مستحيل الحصول على سماحية لي ملف '%s'" + +#~ msgid "Impossible to overwrite the file '%s'" +#~ msgstr "مستحيل الكتابة فوق الملف '%s'" + +#~ msgid "Impossible to set permissions for the file '%s'" +#~ msgstr "مستحيل وضع سماحية لي ملف '%s'" + +#~ msgid "Error: the file known.met is corrupted, unable to load known files" +#~ msgstr "خطأ ملف known.met معطوب, لم اتمكن من تحميل الملفات المعروفة" + +#~ msgid "accepted" +#~ msgstr "قبل" + +#~ msgid "denied" +#~ msgstr "رفض" + +#~ msgid "Desktop" +#~ msgstr "سطح المكتب" + +#~ msgid "No systray integration, please" +#~ msgstr "فضلا بلا تبني لواجهة رسومية" + +#~ msgid "Name" +#~ msgstr "اسم" + +#~ msgid "Min Availability" +#~ msgstr "اقل توفر" + +#~ msgid "Search global" +#~ msgstr "بحث عالمي" + +#~ msgid "Clear All" +#~ msgstr "مسح الكل" + +#~ msgid "Download selected" +#~ msgstr "حمل المختارات" + +#~ msgid "Media Info" +#~ msgstr "معلومات الوسائط" + +#~ msgid "Bitrate:" +#~ msgstr "معدل البت:" + +#~ msgid "Length:" +#~ msgstr "طول:" + +#~ msgid "Source Names" +#~ msgstr "اسماء المصادر" + +#~ msgid "Reload" +#~ msgstr "اعد تحميل" + +#~ msgid "Clientsoftware :" +#~ msgstr "برنامج العميل :" + +#~ msgid "Server IP :" +#~ msgstr "عنوان الخادم :" + +#~ msgid "Clientversion :" +#~ msgstr "نسخة العميل" + +#~ msgid "ID :" +#~ msgstr "هوية :" + +#~ msgid "Servername :" +#~ msgstr "اسم الخادم :" + +#~ msgid "Currently downloading :" +#~ msgstr "حاليا تحميل :" + +#~ msgid "Downloaded (this session) :" +#~ msgstr "حمل في الجلسة :" + +#~ msgid "Average downloadrate :" +#~ msgstr "متوسط معدل التحميل :" + +#~ msgid "Downloaded total :" +#~ msgstr "مجموع التحميل :" + +#~ msgid "Uploaded (this session) :" +#~ msgstr "رفع في الجلسة :" + +#~ msgid "Average Uploadrate :" +#~ msgstr "متوسط معدل الرفع :" + +#~ msgid "Uploaded total :" +#~ msgstr "مجموع الرفع :" + +#~ msgid "Rating (total) :" +#~ msgstr "تقييم (المجموع) :" + +#~ msgid "Chinese" +#~ msgstr "الصينيه" + +#~ msgid "English" +#~ msgstr "الإنجليزيه" + +#~ msgid "Portuguese (Brazil)" +#~ msgstr "البرتغاليه (البرازيل)" + +#~ msgid "Spanish (Chile)" +#~ msgstr "الإسبانيه (تشيلي)" + +#~ msgid "Spanish (Mexico)" +#~ msgstr "الإسبانيه (المكسيك)" + +#~ msgid "Turkey" +#~ msgstr "التركيه" + +#~ msgid "Beep on errors" +#~ msgstr "صوت عند الخطاء" + +#~ msgid "Downloadlist doubleclick to expand" +#~ msgstr "اضغط لعرض قائمة التحميل" + +#~ msgid "Startup" +#~ msgstr "بدء التشغيل" + +#~ msgid "5 Days" +#~ msgstr "5 أيام" + +#~ msgid "Check for new version" +#~ msgstr "مراقبة لوجود إصدار أحدث" + +#~ msgid "Show Splashscreen" +#~ msgstr "عرض شاشة ترحيب" + +#~ msgid "Clientport" +#~ msgstr "منفذ العميل" + +#~ msgid "IP-Filter" +#~ msgstr "فلتر -IP" + +#~ msgid "IP-Filter ON / OFF" +#~ msgstr "فلتر -IP ON / OFF" + +#~ msgid "Always filter bad IPs" +#~ msgstr "دائما فلتر IPs السيئة" + +#~ msgid "See my shares" +#~ msgstr "مشاهدة المشاركة" + +#~ msgid "Arrange Downloads" +#~ msgstr "رتب التحميل" + +#~ msgid "Enable auto-arranging download list " +#~ msgstr "السماح للترتيب الذاتي لقائمة التحميل" + +#~ msgid "Download speed" +#~ msgstr "سرحة التحميل" + +#~ msgid "Number of sources" +#~ msgstr "عدد المصادر" + +#~ msgid "Theme :" +#~ msgstr "سمه :" + +#~ msgid "Use Font " +#~ msgstr " استخدم خط" + +#~ msgid "Font" +#~ msgstr "خط" + +#~ msgid "Enable Webserver" +#~ msgstr "تمكين خادم شبكة" + +#~ msgid "Enable password" +#~ msgstr "السماح لي كلمة مرور" + +#~ msgid "Notify" +#~ msgstr "أشعار" + +#~ msgid "Servers List Window" +#~ msgstr "نافذة قائمة الخادمات" + +#~ msgid "SharedFiles" +#~ msgstr "ملفات المشاركة" + +#~ msgid "New Prefs" +#~ msgstr "إعدادات جديدة" + +#~ msgid "h" +#~ msgstr "س" + +#~ msgid "D" +#~ msgstr "ي" + +#~ msgid "Error: Failed to open part.met file! (%s => %s)" +#~ msgstr "خطأ: فشل في فتح ملف part.met ! (%s => %s)" + +#~ msgid "Error: Invalid part.met fileversion! (%s => %s)" +#~ msgstr "خطأ: نسخة ملف غير صحيحة part.met ! (%s => %s)" + +#~ msgid "Error: %s (%s) is corrupt" +#~ msgstr "خطأ : %s (%s) معطوب" + +#~ msgid "Error: %s (%s) is corrupt, unable to load file" +#~ msgstr "خطأ: %s (%s) معطوب, غير قادر لتحميل الملف" + +#~ msgid "" +#~ "Unexpected file error while reading server.met: %s, unable to load " +#~ "serverlist" +#~ msgstr "" +#~ "خطأ غير متوقع أثناء قراءة ملف server.met: %s,غير قادر على تحميل قائمة " +#~ "الخادمات" + +#~ msgid "Warning: %s might be corrupted" +#~ msgstr "تحذير : %sقد يكون معطوب" + +#~ msgid "ERROR while saving partfile: %s (%s => %s)" +#~ msgstr "خطأ أثناء حفظ ملف اجزاء: %s (%s => %s)" + +#~ msgid ".part file not found" +#~ msgstr "ملف .partغير موجود" + +#~ msgid "Unable to open %s file - using .bak file.\n" +#~ msgstr "لم اتمكن من فتح ملف %s بإستخدام ملف .bak \n" + +#~ msgid "Failed to delete %s" +#~ msgstr "فشل لحذف %s" + +#~ msgid "Failed to delete %s%s" +#~ msgstr "فشل لحذف %s%s" + +#~ msgid "A file with that name already exists, the file has been renamed" +#~ msgstr "ملف بهذا اﻹسم موجود مسبقا, أعيد تسمية الملف" + +#~ msgid "Finished downloading %s :-)" +#~ msgstr "انهاء تحميل %s :-)" + +#~ msgid "Downloaded:" +#~ msgstr "تحميل :" + +#~ msgid "ERROR: Cannot write to disk" +#~ msgstr "خطأ غير قادر على الكتابعلى القرص الصلب" + +#~ msgid "Downloaded part %i is corrupt :( (%s)" +#~ msgstr "جزء التحميل %i معطوب :( (%s)" + +#~ msgid "ICH: Recovered corrupted part %i (%s)" +#~ msgstr "ICH: تم تصحيح الجزء المعطوب %i (%s)" + +#~ msgid "Unexpected file error while writing %s : %s" +#~ msgstr "فشل غير متوقع اثناء كتابة ملف %s : %s" + +#~ msgid "" +#~ "Partfilename: %s\n" +#~ "Parts: %d , %s: %d (%.1f%%)\n" +#~ msgstr "" +#~ "ملف اجزاء بإسم: %s\n" +#~ "اجزاء: %d , %s: %d (%.1f%%)\n" + +#~ msgid "%d%% done (%s) - Transferring from %d sources" +#~ msgstr "%d%% تم (%s) -نقل من %d مصادر" + +#~ msgid "Available" +#~ msgstr "متوفر" + +#~ msgid "Last Seen Complete :" +#~ msgstr "اخر اكتمال شوهد :" + +#~ msgid "Last Reception:" +#~ msgstr "اخر إستقبال:" + +#~ msgid "Language change will not be applied until aMule is restarted." +#~ msgstr "تغير اللغة لن يتم تفعيل اﻻ بإعادة تشغيل aMule." + +#~ msgid "Update: Disabled" +#~ msgstr "تحيث: معطل" + +#~ msgid "Update period: %i sec" +#~ msgstr "فترة التحديث: %i ثانية" + +#~ msgid "Update period: %i secs" +#~ msgstr "فترة التحديث: %i ثانية" + +#~ msgid "Server connection refresh interval %i mins" +#~ msgstr "فترة تحديث الإتصال بالخادم %i دقيقة" + +#~ msgid "OLD Preferences" +#~ msgstr "إعدادات قديمة" + +#~ msgid "Choose a folder for " +#~ msgstr "إختر مجلد لي " + +#~ msgid "%i days" +#~ msgstr "%i يوم" + +#~ msgid "%i day" +#~ msgstr "%i يوم" + +#~ msgid "Upload/Download list refresh time: Disable" +#~ msgstr "زمن تحديث قائمة الرفع/التحميل : معطل" + +#~ msgid "Close this search result" +#~ msgstr "اغلاق نتيجة البحث هذه" + +#~ msgid "Description: %s" +#~ msgstr "وصف: %s" + +#~ msgid "User: %i" +#~ msgstr "مستخدم: %i" + +#~ msgid "Unable to retrieve serverlist" +#~ msgstr "غير قادر على إسترجاع قائمة الخادمات" + +#~ msgid "Failed to download the serverlist from %s" +#~ msgstr "فشل في تحميل قائمة الخادمات من %s" + +#~ msgid "Failed to load server.met!" +#~ msgstr "فشل في تحميل server.met!" + +#~ msgid "Error: the file server.met is corrupted" +#~ msgstr "خطأ: ملف server.met معطوب" + +#~ msgid "Server added: " +#~ msgstr "خادم مضاف: " + +#~ msgid "Connect to this server" +#~ msgstr "إتصال بهذا الخادم" + +#~ msgid "Add to static" +#~ msgstr "أضف الى الثابتة" + +#~ msgid "Remove from static server list" +#~ msgstr "حذف من قائمة الخادمات الثابتة" + +#~ msgid "Preference" +#~ msgstr "أداء" + +#~ msgid "Failed to open staticservers.dat" +#~ msgstr "فشل في فتح staticservers.dat" + +#~ msgid "Added to static server list" +#~ msgstr "أضيف خادم للقائمة الثابتة" + +#~ msgid "Unknown server info received !" +#~ msgstr "تلقي معلومات خادم غير معرفة !" + +#~ msgid "Connecting to %s (%s:%i)..." +#~ msgstr "إتصال بي %s (%s:%i)..." + +#~ msgid "Error while connecting to %s (%s:%i): %d" +#~ msgstr "خطأ أثناء اﻹتصال بي%s (%s:%i): %d" + +#~ msgid "This is " +#~ msgstr "هذا هو" + +#~ msgid " (based on " +#~ msgstr "(مبني على" + +#~ msgid "Please enter a serveraddress" +#~ msgstr "رجاء إدخل عنوان خادم" + +#~ msgid "Incomplete serverport: Please enter a serverport" +#~ msgstr "منفذ الخادم غير مكتمل: رجاء إدخل منفذ للخادم" + +#~ msgid "Server not added!" +#~ msgstr "خادم غير مضاف" + +#~ msgid "Low ID" +#~ msgstr "هوية متدنية" + +#~ msgid "High ID" +#~ msgstr "هوية مرتفعة" + +#~ msgid "Loading..." +#~ msgstr "تحميل..." + +#~ msgid "Permission" +#~ msgstr "رخصة" + +#~ msgid "Public" +#~ msgstr "عام" + +#~ msgid "Friends only" +#~ msgstr "اﻻصدقاء فقط" + +#~ msgid "Locked" +#~ msgstr "مقفل" + +#~ msgid "Permissions" +#~ msgstr "رخصة" + +#~ msgid "Change this file's comment..." +#~ msgstr "تغير التعليق على هذا الملف..." + +#~ msgid "Auto [Re]" +#~ msgstr "ذاتي" + +#~ msgid "Hidden" +#~ msgstr "مخفي" + +#~ msgid "You cannot change permissions while a file is still downloading!" +#~ msgstr "ﻻ يمكنك تغير سماحية ملف وهو قيد التحميل!" + +#~ msgid "%s (%s:%i) appears to be full" +#~ msgstr "%s (%s:%i) يظهر انه ملي" + +#~ msgid "Connecting to %s (%s:%i ) failed." +#~ msgstr "اﻹتصال بي %s (%s:%i) فشل." + +#~ msgid "Connection attempt to %s (%s:%i ) timed out" +#~ msgstr "محاولت اﻹتصال بي %s (%s:%i ) إنتهى الوقت" + +#~ msgid "Refreshing server connection" +#~ msgstr "إعادة تنشيط اﻹتصال بالخادم" + +#~ msgid "Filtered: %i" +#~ msgstr "تم ترشيح : %i" + +#~ msgid "Uptime: " +#~ msgstr "مدة التشغيل: " + +#~ msgid "Downloaded Data (Session (Total)): %s (%s)" +#~ msgstr "بيانات التحميل (الجلسة (المجموع)): %s (%s)" + +#~ msgid "Found Sources: %i" +#~ msgstr "وجد مصادر : %i" + +#~ msgid "Active Downloads (chunks): %i" +#~ msgstr "التحميل النشط: %i" + +#~ msgid "Uploaded Data (Session (Total)): %s (%s)" +#~ msgstr "بيانات الرفع (الجلسة (المجموع)): %s (%s)" + +#~ msgid "Active Uploads: %i" +#~ msgstr "تحميل نشط : %i" + +#~ msgid "Waiting Uploads: %i" +#~ msgstr "تحميل ينتظر: %i" + +#~ msgid "Total successful upload sessions: %i" +#~ msgstr "مجموع الجلسات الناجحة للتحميل :%i" + +#~ msgid "Total failed upload sessions: %i" +#~ msgstr "مجموع الجلسات الفاشلة للتحميل :%i" + +#~ msgid "Average Downloadrate (Session): %.2f kB/s" +#~ msgstr "متوسط معدل التحميل)الجلسة(: %.2f kB/s" + +#~ msgid "Average Uploadrate (Session): %.2f kB/s" +#~ msgstr "متوسط معدل الرفع )الجلسة(: %.2f kB/s" + +#~ msgid "Max Downloadrate Average (Session): %.2f kB/s" +#~ msgstr "معدل أعلى مستوى تحميل (الجلسة): %.2f kB/s" + +#~ msgid "Max Downloadrate (Session): %.2f kB/s" +#~ msgstr "أعلى مستوى تحميل (الجلسة): %.2f kB/s" + +#~ msgid "waiting for transfer..." +#~ msgstr "بإنتظار التحميل ..." + +#~ msgid "waiting for connection..." +#~ msgstr "بانتظار اﻻتصال ..." + +#~ msgid "Session UL:DL Ratio (Total):" +#~ msgstr "نسبة الرفع للتحميل في الجلسة (المجموع):" + +#~ msgid "%s Not available" +#~ msgstr "%s غير متوفر" + +#~ msgid "Number of Shared Files: %i" +#~ msgstr "عدد ملفات المشاركة : %i" + +#~ msgid "Unknown: %i" +#~ msgstr "غير معروف :%i" + +#~ msgid "Working Servers" +#~ msgstr "خادم يعمل" + +#~ msgid "Failed Servers" +#~ msgstr "خادم فاشل" + +#~ msgid "Deleted Servers" +#~ msgstr "خادم محذوف" + +#~ msgid "Users on Working Servers" +#~ msgstr "المستخدمين في الخادمات حاليا" + +#~ msgid "Files on Working Servers" +#~ msgstr "ملفات في الخادمات حاليا" + +#~ msgid "Total Users" +#~ msgstr "مجموع المستخدمين" + +#~ msgid "Total Files" +#~ msgstr "مجموع الملفات" + +#~ msgid "Active Connections (estimate)" +#~ msgstr "إتصاﻻت نشطة تقديري" + +#~ msgid "Max Connection Limit Reached" +#~ msgstr "وصل اقصى حد إتصالات" + +#~ msgid "Average Connections (estimate)" +#~ msgstr "متوسط سرعة اﻻتصال تقديرية" + +#~ msgid "Peak Connections (estimate)" +#~ msgstr "اعلى سرعة اتصال تقديرية" + +#~ msgid "Detection Disabled" +#~ msgstr "الكشف عن المعطل" + +#~ msgid "Not Found" +#~ msgstr "غير موجود" + +#~ msgid "Actual Speed Limits:" +#~ msgstr "حدود السرعة الحقيقية:" + +#~ msgid "DL: " +#~ msgstr "تحميل: " + +#~ msgid "UP: " +#~ msgstr "رفع: " + +#~ msgid "ID: Not Connected" +#~ msgstr "هوية: غير متصل" + +#~ msgid "TCP Port: " +#~ msgstr "منفذ TCP: " + +#~ msgid "UDP Port: " +#~ msgstr "منفذ UDP:" + +#~ msgid "Uptime: None" +#~ msgstr "فترة التشغيل: ﻻ شيئ" + +#~ msgid "ServerName: Not Connected" +#~ msgstr "إسم الخادم: غير متصل" + +#~ msgid "ServerIP: Not Connected" +#~ msgstr "عنوان الخادم: غير متصل" + +#~ msgid "Shared Files: " +#~ msgstr "ملفات المشاركة: " + +#~ msgid "Queued Clients: " +#~ msgstr "عملاء في اﻻنتظار: " + +#~ msgid "Total DL: " +#~ msgstr "مجموع التحميل: " + +#~ msgid "Total UP: " +#~ msgstr "مجموع الرفع: " + +#~ msgid "Personal Infos" +#~ msgstr "معلومات شخصية" + +#~ msgid "Hide" +#~ msgstr "إخفاء" + +#~ msgid "Show" +#~ msgstr "إضهار" + +#~ msgid "All To Max Speed" +#~ msgstr "الكل ﻷعلى سرعة" + +#~ msgid "All To Min Speed" +#~ msgstr "الكل ﻷقل سرعة" + +#~ msgid "Disconnect from server" +#~ msgstr "فصل من الخادم" + +#~ msgid "aMule for Linux" +#~ msgstr "aMule لي لينكس" + +#~ msgid "requested file not found" +#~ msgstr "لم يتم العثور على الملف المطلوب" + +#~ msgid "Failed to load template %s\n" +#~ msgstr "فشل في تحميل النموذج %s\n" + +#~ msgid "Access denied!" +#~ msgstr "رفض الدخول!" + +#~ msgid "Web Control Panel" +#~ msgstr "لوحة تحكم الويب" + +#~ msgid "Server list" +#~ msgstr "قائمة الخادمات" + +#~ msgid "ED2K Link(s)" +#~ msgstr "رابط ED2K" + +#~ msgid "Log" +#~ msgstr "سجل" + +#~ msgid "Serverinfo" +#~ msgstr "معلومات الخادم" + +#~ msgid "Debug Log" +#~ msgstr "سجل اﻷخطاء" + +#~ msgid "&Preferences" +#~ msgstr "&أداء" + +#~ msgid "Logout" +#~ msgstr "تسجيل الخروج" + +#~ msgid "users" +#~ msgstr "مستخدمين" + +#~ msgid "Limits" +#~ msgstr "حدود" + +#~ msgid "Server name" +#~ msgstr "إسم الخادم" + +#~ msgid "files" +#~ msgstr "ملفات" + +#~ msgid "Actions" +#~ msgstr "عمل" + +#~ msgid "Remove selected server" +#~ msgstr "حذف الخادمات المختارة" + +#~ msgid "Are you sure to remove this server from list?" +#~ msgstr "هل انت متاكد من حذف الخادم من القائمة؟" + +#~ msgid "Downloaded total" +#~ msgstr "مجموع التحميل" + +#~ msgid "Uploaded total" +#~ msgstr "مجموع الرفع" + +#~ msgid "Are you sure that you want to cancel and delete this file?\\n" +#~ msgstr "هل انت متاكد من الغاء وحذف هذا الملف؟\\n" + +#~ msgid "Increase Priority" +#~ msgstr "زيادة اﻷولوية" + +#~ msgid "Decrease Priority" +#~ msgstr "تقليل اﻷولوية" + +#~ msgid "Download Selected" +#~ msgstr "تحميل المختار" + +#~ msgid "Time" +#~ msgstr "الوقت" + +#~ msgid "Add to list" +#~ msgstr "أضف الى القائمة" + +#~ msgid "Update server.met from URL" +#~ msgstr "حدث server.met من العنوان" + +#~ msgid "URL" +#~ msgstr "عنوان" + +#~ msgid "Web-based Search" +#~ msgstr "بحث انترنت" + +#~ msgid "File Settings" +#~ msgstr "إعدادات الملف" + +#~ msgid "Max Sources Per File" +#~ msgstr "اقصى عدد مصادر للملف" + +#~ msgid "Max. Connections" +#~ msgstr "اقصى عدد إتصالات" + +#~ msgid "max. new connections / 5secs" +#~ msgstr "اقصى عدد إتصالات جديدة لكل 5 ثواني" + +#~ msgid "Gzip Compression" +#~ msgstr "ضغط Gzip" + +#~ msgid "Refresh-Time of Pages" +#~ msgstr "زمن تحديث الصفحة" + +#~ msgid "Time in seconds (zero=disabled):" +#~ msgstr "الوقت بالثواني (صفر=للتعطيل):" + +#~ msgid "Speed Limits" +#~ msgstr "حدود السرعة" + +#~ msgid "Bandwidth Limits" +#~ msgstr "حدود النطاق" + +#~ msgid "Login" +#~ msgstr "تسجيل الدخول" + +#~ msgid "Enter your password here" +#~ msgstr "أدخل كلمة المرور هنا" + +#~ msgid "Login Now" +#~ msgstr "تسجيل الدخول اﻻن" + +#~ msgid "Webserver: Logout" +#~ msgstr "خادم شبكة: تسجيل الخروج" + +#~ msgid "Search Results" +#~ msgstr "نتيجت البحث" + +#~ msgid "Refetch Results" +#~ msgstr "إعادة جلب النتيجة" + +#~ msgid "Method" +#~ msgstr "طريقة" + +#~ msgid "Global (Server)" +#~ msgstr "خادم عالمي" + +#~ msgid "Wizard" +#~ msgstr "مساعداﻹعداد" + +#~ msgid "Down (kbit/s)" +#~ msgstr "تحميل (kbit/s)" + +#~ msgid "Up (kbit/s)" +#~ msgstr "رفع (kbit/s)" + +#~ msgid "Custom" +#~ msgstr "مخصص" + +#~ msgid "(enter below!)" +#~ msgstr "(أدخل في اﻷسفل)" + +#~ msgid "" +#~ "Unable to launch browser. Please set correct browserexecutable path in " +#~ "Preferences." +#~ msgstr "لم أتمكن من تشغيل المتصفح. رجاء حدد مسار صحيح للمتصفح في اﻹعدادات." + +#~ msgid "Not Avaiable" +#~ msgstr "غير متوفر" + +#~ msgid "Show Lists" +#~ msgstr "اعرض قائمة" + +#~ msgid "Hide Lists" +#~ msgstr "اخفاء القائمة" + +#~ msgid "Concurrent Downloads" +#~ msgstr "تحميل متلاقي" + +#~ msgid "Connection Type" +#~ msgstr "نوع اﻻتصال" + +#~ msgid "Select your connection type here :" +#~ msgstr "اختر نوع اﻻتصال هنا:" + +#~ msgid "True download bandwidth" +#~ msgstr "سعة نطاق التحميل الحقيقية" + +#~ msgid "True upload bandwidth" +#~ msgstr "سعة نطاق الرفع الحقيقية" + +#~ msgid "Unit:" +#~ msgstr "الوحدة:" + +#~ msgid "Connection Wizard" +#~ msgstr "مساعد إعداد اﻹتصال" + +#~ msgid "" +#~ "http://ocbmaurice.dyndns.org/pl/slist.pl/server.met?download/server-good." +#~ "met" +#~ msgstr "" +#~ "http://ocbmaurice.dyndns.org/pl/slist.pl/server.met?download/server-good." +#~ "met" + +#~ msgid "A file with that name already exists, the file has been saved as %s" +#~ msgstr "ملف بهذا اﻻسم موجود مسبقا, الملف حفظ باسم %s" + +#~ msgid "Upload/Download list refresh time: %i sec" +#~ msgstr "زمن تحديث قائمة الرفع/التحميل : %i ثانية" + +#~ msgid "Upload/Download list refresh time: %i secs" +#~ msgstr "زمن تحديث قائمة الرفع/التحميل : %i ثانية" + +#~ msgid "&Transfers" +#~ msgstr "&نقل" + +#~ msgid "&Servers" +#~ msgstr "&مستظيفات" + +#~ msgid "S&earch" +#~ msgstr "ب&حث" + +#~ msgid "Shared &Files" +#~ msgstr "مشاركة & ملفات" + +#~ msgid "&Messages" +#~ msgstr "&رسائل" + +#~ msgid "St&atistics" +#~ msgstr "اح&صائيات" + +#~ msgid "Creditfile loaded" +#~ msgstr "تم تحميل ملف الرصيد" + +#~ msgid "Servers list" +#~ msgstr "قائمة الخادمات" + +#~ msgid "Files Transfers" +#~ msgstr "نقل الملفات" + +#~ msgid "Preferences Settings Windows" +#~ msgstr "نافذة ادارة الاعدادت" + +#~ msgid "Please enter a serveradress" +#~ msgstr "رجاء ادخل عنوان خادم" diff --git a/po/bg.po b/po/bg.po new file mode 100644 index 00000000..322756f3 --- /dev/null +++ b/po/bg.po @@ -0,0 +1,7348 @@ +# translation of source_strings.po to Bulgarian +# aMule i18n resource file. +# Copyright (C) 2004 aMule Team +# This file is distributed under the same license as the aMule package. +# Kry , 2004. +# Boyan Ivanov , 2004. +# +# +msgid "" +msgstr "" +"Project-Id-Version: source_strings\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2004-02-07 21:55+0200\n" +"Last-Translator: Boyan Ivanov \n" +"Language-Team: Bulgarian \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" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Завършено" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Пауза" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Изтегляне" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Неизвестен" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr "" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr "" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "Поискан:" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Статистика за текущата сесия : Приети %d от %d заявки,%s осъществени\n" +msgstr[1] "" +"Статистика за текущата сесия : Приети %d от %d заявки,%s осъществени\n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Статистика за текущата сесия : Приети %d от %d заявки,%s осъществени\n" +msgstr[1] "" +"Статистика за текущата сесия : Приети %d от %d заявки,%s осъществени\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Заявен е несъществуващ файл" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Потребителско име" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Приятели" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Показване на &детайли" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Добавяне на приятел" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Изтриване на приятел" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Изпращане на &съобщение" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Преглед на файловете" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Създаване на приятелска връзка" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "" +"Сигурни ли сте,че желаете да откажете свалянето и изтриете тези файлове ?\n" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "" +"Сигурни ли сте,че желаете да откажете свалянето и изтриете тези файлове ?\n" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Отказ" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Име на файл" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Размер" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Тип" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Приоритет" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Заявки" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Приети заявки" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Пренесени данни" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Ниско" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Нормален" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Високо" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Автоматично" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "Трябва да имате HighID, за да създадете валиден сорс линк" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Споделени файлове (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "" + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "" + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "" + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "" + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "" + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "" + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "" + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Изтеглям..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Настройки" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Избери" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Нулира" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +msgid " with " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "кБ/с" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "Отказ" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Добавяне" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Изчисти" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Старт" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Изход" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Автоматичен [Lo]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Автоматичен [No]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Автоматичен [Hi]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Свързва" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Запитване" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Свързване чрез сървър" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Опашката е пълна" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "На опашката" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Сваляне" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Получаване на hash сумите" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Не може LowID да се свърже към LowID" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Твърде много връзки" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Каталунски" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Френски" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Немски" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Италиански" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Руски" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Име на сървър" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Порт" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Описание" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Потребители" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Файлове" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Грешка" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Статичен" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Да" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Не" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Сървъри (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Сървър" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "" + +#: src/ServerListCtrl.cpp:428 +msgid "Mark server as static" +msgstr "" + +#: src/ServerListCtrl.cpp:429 +msgid "Mark server as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:431 +msgid "Mark servers as static" +msgstr "" + +#: src/ServerListCtrl.cpp:432 +msgid "Mark servers as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:438 +msgid "Remove server" +msgstr "Премахване на сървър" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "Премахване на сървър" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Изтриване на всички сървъри" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "Копиране на ED2k линк в системния буфер (име на хост)" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "" +"Сигурни ли сте,че желаете да откажете свалянето и изтриете тези файлове ?\n" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "" +"Сигурни ли сте,че желаете да откажете свалянето и изтриете тези файлове ?\n" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "" + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Фатална грешка: не можах да създам брояч" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr "" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr "" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "Свързва" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "Връзката е разпадната" + +#: src/amuleDlg.cpp:676 +msgid "Kad: Firewalled" +msgstr "" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "Връзкате е установена" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "Свързва" + +#: src/amuleDlg.cpp:689 +msgid "Kad: Off" +msgstr "" + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "Спира текущите опити за свързване" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Разкачи" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "Изключване от текущия сървър" + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Връзка" + +#: src/amuleDlg.cpp:726 +msgid "Connect to the currently enabled networks" +msgstr "" + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Кач.: %.1f(%.1f) | Свал.: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Кач.: %.1f | Свал.: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Наистина ли желаете да изключите aМуле?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Потвърждение за изход" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "" + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Съобщения" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Статистика" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Общи" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Връзка" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Дистанционни управления" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Директории" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Търсене на wav" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "wav файлове (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Търсене на видео плеър" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Редактиране на списъка със сървъри" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Тук добавете линкове за сваляне на .met файлове.\n" +"Само по един URL на ред." + +#: src/PrefsUnifiedDlg.cpp:980 +#, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:987 +#, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:999 +#, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "" + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "" + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "" + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "" + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "" + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "" + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "" + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "" + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "" + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "" + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "" + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "" + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "" + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "" + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "" + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "" + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "" + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "" + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "" + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "" + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "" + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "" + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "" + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "" + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "" + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "" + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "" + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "" + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Връзкате е установена" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Връзката е разпадната" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "" + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Трансфер" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Средно време за качване: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Повторни свързвания: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Изтекло време от пърия трансфер: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Свързан към сървъра от : %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Клиенти" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Сървъри" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Общ размер на споределните файлове : %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Среден размер на файловете: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "" + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "" + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "" + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "" + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Добавяне на приятел" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Трябва да въведете валиден адрес и порт" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Източници" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Файл" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Изтегляне" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Категория" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "" + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Грешка" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Пренесен" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Завършен" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Скорост" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Прогрес" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Статус" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "" +"Сигурни ли сте,че желаете да откажете свалянето и изтриете тези файлове ?\n" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "" +"Сигурни ли сте,че желаете да откажете свалянето и изтриете тези файлове ?\n" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Стоп" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Пауза" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "В&ъзобновява" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Преглед" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "кБ/с" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Поискан му е друг файл" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Файлове за сваляне (%i)" + +#: src/DownloadListCtrl.cpp:2222 +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2260 +#, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "" + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "" + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "" + +#: src/PartFile.cpp:1019 +#, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Спрян" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "" + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "Известни са %i споделени файлове" +msgstr[1] "Известни са %i споделени файлове" + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "Известни са %i споделени файлове" +msgstr[1] "Известни са %i споделени файлове" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Коментари за файла" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Оценка" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Няма коментари" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "Няма коментари" +msgstr[1] "Няма коментари" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "Грешка при свързване към всички сървъри в списъка - започвам отначало." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "" + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "Не са намерени валидни сървъри в списъка" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Свързан към %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Връзката установена на: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"Фатална грешка при опит за свързване,вероятно не сте се включили към интернет" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Връзката към %s (%s:%i) бе прекъсната" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) изглежда не отговаря" + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "" + +#: src/ServerConnect.cpp:391 +#, fuzzy, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "На всеки %d секунди ще бъде правен автоматичен опит за свързване" +msgstr[1] "На всеки %d секунди ще бъде правен автоматичен опит за свързване" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Връзката е прекъсната" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "" + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "Грешка:Невалиден сокет при проверка" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "" + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Не са открити части от файлове" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "Открити са %i части от файлове" +msgstr[1] "Открити са %i части от файлове" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Сваляне %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Вие вече опитвате да свалите файла %s" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "" + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "" + +#: src/TextClient.cpp:305 +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" + +#: src/TextClient.cpp:343 +msgid "Processing by hash: " +msgstr "" + +#: src/TextClient.cpp:358 +msgid "Processing by filename: " +msgstr "" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "" + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "" + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "" + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "" + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "" + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "" + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "" + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "" + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "" + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "" + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "" + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "" + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "" + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "" + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "" + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "" + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "" + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "" + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "" + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "" + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "" + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "" + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "" + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "" + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "" + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "" + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "" + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "" + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "" + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "" + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "" + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "" + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "" + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "" + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "" + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "" + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "" + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "" + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "" + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "" + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "" + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "" + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "" + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "" + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "" + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "" + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Новият номер на клиента е %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "" + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "Получени са %d нови сървъра" +msgstr[1] "Получени са %d нови сървъра" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "" + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "Сървърът отхвърли последната команда" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "" + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "" + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "" + +#: src/IP2Country.cpp:73 +#, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "" +msgstr[1] "" + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"Сигурни ли сте,че желаете да откажете и изтриете всички файлове в тази " +"категория?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Изисква потвърждение" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Незавършен" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Видео" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Аудио" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Архив" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "CD-изображения" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Картинки" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Текст" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Избор на филтър" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Добавяне на категория" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Промяна на категория" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Премахване на категория" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "" + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "" + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Изчакване" + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "Байта" +msgstr[1] "Байта" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "Байта" +msgstr[1] "Байта" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "сек." + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "мин." + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Клипове" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Архиви" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Програми" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Всеки" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Няма оценки" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Грешен / Развален / Фалшив" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Лош" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Средно добър" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Добър" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Отличен" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "Всички" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "всички останали" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "" + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" + +#: src/IPFilter.cpp:330 +#, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +msgstr[1] "" + +#: src/IPFilter.cpp:332 +#, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +msgstr[1] "" + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Активни връзки (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "" + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Зареждам..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "" + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "" + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "" + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Търсене" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Разширение" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Минимален размер" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Байта" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Максимален размер" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "" + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Изпраща" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "" + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Затвори" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "" + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "Няма" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "" + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Изчистване" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Потвърди" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Опресняване" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "" + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Общо" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Текущ" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Име на потребител:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Точки" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "" + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Език" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "" + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Допълнителни Опции" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "" + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "" + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "" + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "" + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Качване" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "" + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "деактивиране" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Списък" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "" + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Видео плеър" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Диаграми" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Фон" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Мрежа" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Избор" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "" + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "" + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "" + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Коментар:" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "" + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "" + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "" + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "" + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "" + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "" + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "" + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Всеки" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "" + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "" + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Изберете папка за входящи файлове" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "" + +#: src/ExternalConnector.cpp:188 +#, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "" + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "" + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "" + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "" + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "" + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "" + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "" + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "" + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "" + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "" + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "" + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "" + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "" + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "" + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "" + +#: src/ClientCreditsList.cpp:168 +#, fuzzy, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "Файлът с кредити зареден, %u клиента са разпознати" +msgstr[1] "Файлът с кредити зареден, %u клиента са разпознати" + +#: src/ClientCreditsList.cpp:171 +#, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] "" +msgstr[1] "" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "" + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Показване на опашка" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Изчакал" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Време на качване" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "" + +#: src/ClientDetailDialog.cpp:190 +#, c-format +msgid "%u (QR: %u)" +msgstr "" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "" + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "" + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "" + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Лимит за качване" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Лимит за сваляне" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "%i сървъра бяха намерени в server.met" +msgstr[1] "%i сървъра бяха намерени в server.met" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d сървъра бяха добавени" +msgstr[1] "%d сървъра бяха добавени" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "" + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "" + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "" + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Грешка при записа на server.met!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "Грешен URL" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "" + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "" + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "" + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "" + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "" + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "" + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "" + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "" + +#~ msgid "Sources Dropping" +#~ msgstr "Намаляване на източниците" + +#~ msgid "Port %d is not available. You will be LOWID" +#~ msgstr "Порт %d е недостъпен : ще бъдете с LOWID" + +#~ msgid "" +#~ "Port %d is not available !!\n" +#~ "\n" +#~ "This will mean that you will be LOWID.\n" +#~ "\n" +#~ "Use netstat to determine when port becomes available\n" +#~ "and try starting amule again." +#~ msgstr "" +#~ "Порт %d е недостъпен !!\n" +#~ "\n" +#~ "Това означава,че ще бъдете с LOWID.\n" +#~ "\n" +#~ "Използвайте netstat, за да раберете кои портове са достъпни\n" +#~ "и опитайте да пуснете програмата отново." + +#~ msgid "Failed to save" +#~ msgstr "Грешка при запис" + +#~ msgid " OnlineSig File" +#~ msgstr " Файл с онлайн подпис" + +#~ msgid "Desktop integration" +#~ msgstr "Интегриране с работното място" + +#~ msgid "Connection established on:" +#~ msgstr "Връзката установена на:" + +#~ msgid "Connect to any server" +#~ msgstr "Свързване към който и да е сървър" + +#~ msgid "S&earch" +#~ msgstr "Т&ърсене" + +#~ msgid "&Messages" +#~ msgstr "&Съобщения" + +#~ msgid "This ed2k link is invalid (%s)" +#~ msgstr "Този ed2k линк не е валиден (%s)" + +#~ msgid "Invalid link: %s" +#~ msgstr "Невалиден линк: %s" + +#~ msgid "Filtered IP: %s (%s)" +#~ msgstr "Филтрирани адреси: %s (%s)" + +#~ msgid "Rating for file '%s' received: %i" +#~ msgstr "Рейтинг за файл '%s' получени: %i " + +#~ msgid "Description for file '%s' received: %s" +#~ msgstr "Описанието на файл '%s' получено: %s" + +#~ msgid "Unable to retrieve shared files from '%s'" +#~ msgstr "Получаването на споделени файлове от '%s' е невъзможно" + +#~ msgid "Requesting shared files from '%s'" +#~ msgstr "Искане на споделени файлове от '%s'" + +#~ msgid "Requesting shared files from user %s (%u) is already in progress" +#~ msgstr "Вече е поискан списъкът със споделени файлове на %s (%u)" + +#~ msgid "NickName: %s\n" +#~ msgstr "Псевдоним:%s\n" + +#~ msgid "Filestats for all sessions: Accepted %d of %d requests" +#~ msgstr "Статистика за всички сесии : Приети %d от %d заявки" + +#~ msgid "can't create file '%s'" +#~ msgstr "не е възможно създаването на файл '%s'" + +#~ msgid "Can't open file '%s'" +#~ msgstr "Файлът '%s' не може да бъде отворен" + +#~ msgid "can't close file descriptor %d" +#~ msgstr "грешка при затваряне описателя на файл %d" + +#~ msgid "can't read from file descriptor %d" +#~ msgstr "грешка при четене описателя на файла %d" + +#~ msgid "can't write to file descriptor %d" +#~ msgstr "грешка при записване описателя на файла %d" + +#~ msgid "can't flush file descriptor %d" +#~ msgstr "описателят на файла %d не може да бъде изтрит" + +#~ msgid "" +#~ "Instant Messaging\n" +#~ " \n" +#~ "Right-click on any client and select 'Send Message' to start a chatsession" +#~ msgstr "" +#~ "Моментни съобщения\n" +#~ " \n" +#~ "Щракнете с десен бутон на кой да е клиент и изберете \"Изпращане на " +#~ "съобщение\", за да започнете разговор" + +#~ msgid "*** Chatsession Start : " +#~ msgstr "*** Начало на разговор : " + +#~ msgid "Message from" +#~ msgstr "Съобщение от" + +#~ msgid "failed" +#~ msgstr "провал" + +#~ msgid "*** Disconnected" +#~ msgstr "*** Изключен" + +#~ msgid "Failed to load creditfile" +#~ msgstr "Грешка при зареждане на файла с кредити" + +#~ msgid "Creditfile is out of date and will be replaced" +#~ msgstr "Файлът с кредити е остарял и ще бъде заменен" + +#~ msgid "Failed to save creditfile" +#~ msgstr "Грешка при запис на файла с кредити" + +#~ msgid "Creditfile loaded" +#~ msgstr "Файлът с кредити зареден" + +#~ msgid "" +#~ "Error while processing incoming UDP Packet (Most likely a misconfigured " +#~ "server)" +#~ msgstr "" +#~ "Грешка при обработването на входящ UDP пакет. (Най-вероятно неправилно " +#~ "конфигуриран сървър)" + +#~ msgid "eDonkey v%i" +#~ msgstr "eDonkey в%i" + +#~ msgid "eDonkeyHybrid v%i" +#~ msgstr "eDonkeyHybrid в%i" + +#~ msgid "eMule v%02X" +#~ msgstr "eМуле в%02X" + +#~ msgid "aMule [ %s ]" +#~ msgstr "aМуле [ %s ]" + +#~ msgid "aMule v0.%02X" +#~ msgstr "aМуле в0.%02X" + +#~ msgid "lMule/xMule v0.%02X" +#~ msgstr "lМуле/xМуле в0.%02X" + +#~ msgid "Old MLdonkey" +#~ msgstr "Старо MLdonkey" + +#~ msgid "New MLdonkey" +#~ msgstr "Ново MLdonkey" + +#~ msgid "Are you sure that you want to cancel and delete this file ?\n" +#~ msgstr "" +#~ "Сигурни ли сте,че желаете да откажете свалянето и изтриете този файл ?\n" + +#~ msgid "You already have the file %s" +#~ msgstr "Имате го файла %s" + +#~ msgid "Bad link." +#~ msgstr "Лош линк." + +#~ msgid "not a well-formed ed2k link" +#~ msgstr "ed2k линкът не е написан правилно" + +#~ msgid "Not an ED2K server or file link" +#~ msgstr "Не е ed2k сървър или линк към файл" + +#~ msgid "can't write file '%s'" +#~ msgstr "писането във файла '%s' е невъзможно" + +#~ msgid "done" +#~ msgstr "готово" + +#~ msgid "Loaded ipfilter with %d IP addresses." +#~ msgstr "Зареден е ip филтър с %d ip адреса." + +#~ msgid "Error: the file known.met is corrupted, unable to load known files" +#~ msgstr "Грешка:файлът known.met е повреден,зареждането на списъка пропадна" + +#~ msgid "accepted" +#~ msgstr "приет" + +#~ msgid "denied" +#~ msgstr "отказан" + +#~ msgid "Connection Type" +#~ msgstr "Тип на Връзка" + +#~ msgid "Unit:" +#~ msgstr "Измервателна единица:" + +#~ msgid "Desktop" +#~ msgstr "Работно място" + +#~ msgid "Name" +#~ msgstr "Име" + +#~ msgid "Clear All" +#~ msgstr "Изчисти всичко" + +#~ msgid "Search Results" +#~ msgstr "Резултати от Търсене" + +#~ msgid ")" +#~ msgstr ")" + +#~ msgid "(" +#~ msgstr "(" + +#~ msgid "English" +#~ msgstr "Английски" + +#~ msgid "Startup" +#~ msgstr "Стартиране" + +#~ msgid "5 Days" +#~ msgstr "5 дни" + +#~ msgid "Font" +#~ msgstr "Шрифт" + +#~ msgid "Notify" +#~ msgstr "Известяване" + +#~ msgid "h" +#~ msgstr "ч" + +#~ msgid "D" +#~ msgstr "дн." + +#~ msgid "?" +#~ msgstr "?" + +#~ msgid "Downloaded:" +#~ msgstr "Свален:" + +#~ msgid "Available" +#~ msgstr "Наличен" + +#~ msgid "Executable (*)|*||" +#~ msgstr "Изпълними (*)|*||" + +#~ msgid "Description: %s" +#~ msgstr "Описание: %s" + +#~ msgid "IP" +#~ msgstr "IP адрес" + +#~ msgid "User: %i" +#~ msgstr "Потребител: %i" + +#~ msgid "Invalid versiontag in server.met (0x%X)!" +#~ msgstr "Невалиден етикет за версия в server.met (0x%X)!" + +#~ msgid "Error: the file server.met is corrupted" +#~ msgstr "Грешка: файлът server.met е повреден" + +#~ msgid "Server added: " +#~ msgstr "Добавен сървър:" + +#~ msgid "Connect to this server" +#~ msgstr "Свързване с този сървър" + +#~ msgid "Add to static" +#~ msgstr "Добавяне в статичния" + +#~ msgid "Remove from static server list" +#~ msgstr "Премахване от статичния списък със сървъри" + +#~ msgid "Preference" +#~ msgstr "Предпочитание" + +#~ msgid "No Pref" +#~ msgstr "Няма предпочитания" + +#~ msgid "Failed to open staticservers.dat" +#~ msgstr "Грешка при отваряне на staticservers.dat" + +#~ msgid "Added to static server list" +#~ msgstr "Добавен към статични списък със сървъри" + +#~ msgid "Unknown server info received !" +#~ msgstr "Получена е информация за сървъра,която не може да бъде разпозната" + +#~ msgid "Connecting to %s (%s:%i)..." +#~ msgstr "Свързване с %s (%s:%i)..." + +#~ msgid "This is " +#~ msgstr "Това е" + +#~ msgid " (based on " +#~ msgstr " (на основата на " + +#~ msgid "Visit http://www.amule.org to check if a new version is available.\n" +#~ msgstr "Посетете http://www.amule.org ,за да проверите за нова версия.\n" + +#~ msgid "Please enter a serveradress" +#~ msgstr "Моля въведете адрес на сървър" + +#~ msgid "Incomplete serverport: Please enter a serverport" +#~ msgstr "Не е въведен порт,моля въведете го " + +#~ msgid "Server not added!" +#~ msgstr "Сървърът не е добавен" + +#~ msgid "Low ID" +#~ msgstr "Low ID" + +#~ msgid "High ID" +#~ msgstr "High ID" + +#~ msgid "Loading..." +#~ msgstr "Зареждам..." + +#~ msgid "Permission" +#~ msgstr "Права" + +#~ msgid "Public" +#~ msgstr "Публичен" + +#~ msgid "Friends only" +#~ msgstr "Само приятели" + +#~ msgid "Locked" +#~ msgstr "Заключен" + +#~ msgid "Permissions" +#~ msgstr "Права" + +#~ msgid "Change this file's comment..." +#~ msgstr "Промяна на коментарите за този файл ..." + +#~ msgid "Auto [Re]" +#~ msgstr "Автоматично[Re]" + +#~ msgid "Hidden" +#~ msgstr "Скрит" + +#~ msgid "You cannot change permissions while a file is still downloading!" +#~ msgstr "Не можете да промените правата на файл,който се сваля в момента!" + +#~ msgid "%s (%s:%i) appears to be full" +#~ msgstr "%s (%s:%i) изглежда е пълен" + +#~ msgid "Connecting to %s (%s:%i ) failed." +#~ msgstr "Свързването към %s (%s:%i ) не бе осъществено." + +#~ msgid "Connection attempt to %s (%s:%i ) timed out" +#~ msgstr "Времето за свързване към %s (%s:%i ) изтече" + +#~ msgid "Refreshing server connection" +#~ msgstr "Опресняване на връзката" + +#~ msgid "Filtered: %i" +#~ msgstr "Филтрирани: %i" + +#~ msgid "Found Sources: %i" +#~ msgstr "Намерени източници: %i" + +#~ msgid "Active Downloads (chunks): %i" +#~ msgstr "Активни сваляния (парчета) : %i" + +#~ msgid "Uploaded Data (Session (Total)): %s (%s)" +#~ msgstr "Качена информация (На сесия (Общо)): %s (%s)" + +#~ msgid "Active Uploads: %i" +#~ msgstr "Активни качвания: %i" + +#~ msgid "Waiting Uploads: %i" +#~ msgstr "Файлове за качване: %i" + +#~ msgid "Total successful upload sessions: %i" +#~ msgstr "Общо успешни сесии на качване: %i" + +#~ msgid "Total failed upload sessions: %i" +#~ msgstr "Общо провалени сесии на качване: %i" + +#~ msgid "Average Downloadrate (Session): %.2f kB/s" +#~ msgstr "Средна скорост на сваляне (на сесия): %.2f kB/s" + +#~ msgid "Average Uploadrate (Session): %.2f kB/s" +#~ msgstr "Средна скорост на качване (на сесия): %.2f кБ/с" + +#~ msgid "Max Downloadrate Average (Session): %.2f kB/s" +#~ msgstr "Максимална средна скорост на сваляне (за сесия): %.2f кБ/с" + +#~ msgid "Max Downloadrate (Session): %.2f kB/s" +#~ msgstr "Максимална скорост на сваляне (за сесия): %.2f кБ/с" + +#~ msgid "waiting for transfer..." +#~ msgstr "изчакване за трансфер..." + +#~ msgid "waiting for connection..." +#~ msgstr "изчакване за свързване..." + +#~ msgid "Session UL:DL Ratio (Total):" +#~ msgstr "UL:DL съотношение (общо)" + +#~ msgid "Number of Shared Files: %i" +#~ msgstr "Брой споделени файлове : %i" + +#~ msgid "eMule: %i (%1.1f%%)" +#~ msgstr "eМуле: %i (%1.1f%%)" + +#~ msgid "aMule: %i (%1.1f%%)" +#~ msgstr "aМуле: %i (%1.1f%%)" + +#~ msgid "lMule/xMule: %i (%1.1f%%)" +#~ msgstr "lМуле/xМуле: %i (%1.1f%%)" + +#~ msgid "eDonkeyHybrid: %i (%1.1f%%)" +#~ msgstr "eDonkeyHybrid: %i (%1.1f%%)" + +#~ msgid "eDonkey: %i (%1.1f%%)" +#~ msgstr "eDonkey: %i (%1.1f%%)" + +#~ msgid "cDonkey: %i (%1.1f%%)" +#~ msgstr "cDonkey: %i (%1.1f%%)" + +#~ msgid "Old MLDonkey: %i (%1.1f%%)" +#~ msgstr "Старо MlDonkey:%i (%1.1f%%)" + +#~ msgid "New MLDonkey: %i (%1.1f%%)" +#~ msgstr "Ново MlDonkey: %i (%1.1f%%)" + +#~ msgid "Unknown: %i" +#~ msgstr "Неизвестно: %i" + +#~ msgid "Working Servers" +#~ msgstr "Работещи сървъри" + +#~ msgid "Failed Servers" +#~ msgstr "Неуспешни сървъри" + +#~ msgid "Deleted Servers" +#~ msgstr "Изтрити сървъри" + +#~ msgid "Users on Working Servers" +#~ msgstr "Потребители на работещи сървъри" + +#~ msgid "Files on Working Servers" +#~ msgstr "Файлове на работещи сървъри" + +#~ msgid "Total Users" +#~ msgstr "Общо потребители" + +#~ msgid "Total Files" +#~ msgstr "Общо файлове" + +#~ msgid "Active Connections (estimate)" +#~ msgstr "Активни връзки (изчисляване)" + +#~ msgid "Max Connection Limit Reached" +#~ msgstr "Максималният лимит за връзка е достигнат" + +#~ msgid "Average Connections (estimate)" +#~ msgstr "Среден брой връзки (изчисляване)" + +#~ msgid "Peak Connections (estimate)" +#~ msgstr "Максимален брой връзки (изчисляване)" + +#~ msgid "Show" +#~ msgstr "Показва" + +#~ msgid "Hide" +#~ msgstr "Скрива" + +#~ msgid "All To Max Speed" +#~ msgstr "Всичко на максимална скорост" + +#~ msgid "All To Min Speed" +#~ msgstr "Всичко на минимална скорост" + +#~ msgid "Disconnect from server" +#~ msgstr "Връзката със сървъра прекъсната" + +#~ msgid "aMule for Linux" +#~ msgstr "aМуле за Линукс" + +#~ msgid "requested file not found" +#~ msgstr "пожелания файл не е намерен" + +#~ msgid "" +#~ "Client '%s' seems to be an aggressive client and is banned from the " +#~ "uploadqueue" +#~ msgstr "Клиент '%s' изглежда е агресивен и бе махнат от опашката" + +#~ msgid "Wizard" +#~ msgstr "Магьосник" + +#~ msgid "Down (kbit/s)" +#~ msgstr "Вход. (kbit/s)" + +#~ msgid "Up (kbit/s)" +#~ msgstr "Изх. (kbit/s)" + +#~ msgid "Custom" +#~ msgstr "Потребителски" + +#~ msgid "(enter below!)" +#~ msgstr "(въведете долу!)" + +#~ msgid "56-k Modem" +#~ msgstr "56-k модем" + +#~ msgid "ISDN" +#~ msgstr "ISDN" + +#~ msgid "ISDN 2x" +#~ msgstr "ISDN 2x" + +#~ msgid "xDSL" +#~ msgstr "xDSL" + +#~ msgid "Cable" +#~ msgstr "Кабел" + +#~ msgid "T1" +#~ msgstr "T1" + +#~ msgid "T3+" +#~ msgstr "T3+" + +#~ msgid "100 Mbits" +#~ msgstr "100 Mbits" + +#~ msgid "155 Mbits (ATM)" +#~ msgstr "155 Mbits (ATM)" diff --git a/po/boldquot.sed b/po/boldquot.sed new file mode 100644 index 00000000..4b937aa5 --- /dev/null +++ b/po/boldquot.sed @@ -0,0 +1,10 @@ +s/"\([^"]*\)"/“\1”/g +s/`\([^`']*\)'/‘\1’/g +s/ '\([^`']*\)' / ‘\1’ /g +s/ '\([^`']*\)'$/ ‘\1’/g +s/^'\([^`']*\)' /‘\1’ /g +s/“”/""/g +s/“/“/g +s/”/”/g +s/‘/‘/g +s/’/’/g diff --git a/po/ca.po b/po/ca.po new file mode 100644 index 00000000..39e08755 --- /dev/null +++ b/po/ca.po @@ -0,0 +1,7457 @@ +# aMule i18n resource file. +# Copyright (C) 2004 - 2007 aMule Team +# This file is distributed under the same license as the aMule package. +# +# Translation of aMule to Catalan +# +# Kry , 2004, 2005, 2006, 2007. +# pukyxd 2004, 2005. +# Carles Escrig (simkin) 2005, 2006, 2007. +# ¿¿¿¿¿¿ Joel Sevilleja , 2007 ?????? +msgid "" +msgstr "" +"Project-Id-Version: ca\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2007-12-14 00:06+0100\n" +"Last-Translator: Carles Escrig i Royo \n" +"Language-Team: Catalan\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Catalan\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Heu d'especificar una contrasenya (no buida)." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Contrasenya invàlida, no és una clau MD5!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Fallada en la connexió" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "La connexió EC ha fallat. Resposta buida." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "ExternalConn: Accés denegat perquè: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "ExternalConn: Accés denegat" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "ExternalConn: Resposta invàlida del servidor. Connexió tancada." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Connexió establerta amb l'aMule" + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Connexió establerta amb èxit." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Fent clau" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Completant" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Complet" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Pausat" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Erroni" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "S'està baixant" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Esperant" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "S'està començant la creació de la clau MD4 i AICH per al fitxer: %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "S'està començant la creació de la clau MD4 per al fitxer: %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "S'està començant el creació de la clau AICH per al fitxer: %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "" +"S'està convertint els conjunts de claus AICH antics en '%s' a 64b en '%s'." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" +"AVÍS: El nom de fitxer '%s' és invàlid i ha estat reanomenat com a '%s'." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "" +"AVÍS: El fitxer '%s' ja existeix, el fitxer nou ha estat reanomenat com a '%" +"s'." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" +"AVÍS: No s'ha pogut esborrar l'original '%s' després de crear la còpia de " +"seguretat" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "AVÍS: No s'ha pogut esborrar %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "No s'han pogut obtenir els compartits de l'usuari '%s'" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Desconegut" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (Versió d'eMule falsa %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (eMule fals)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (eMule fals)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (basat en l'eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Sobrenom: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "Demanat:" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Estadístiques dels fitxers per a aquesta sessió: %d acceptades de %d " +"peticions, %s transferides\n" +msgstr[1] "" +"Estadístiques dels fitxers per a aquesta sessió: %d acceptades de %d " +"peticions, %s transferides\n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Estadístiques dels fitxers per a totes les sessions: %d acceptades de %d " +"peticions, %s transferides\n" +msgstr[1] "" +"Estadístiques dels fitxers per a totes les sessions: %d acceptades de %d " +"peticions, %s transferides\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "S'ha demanat un fitxer desconegut" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "Client %s amb IP:Port %s:%d usant %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Usuari" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Amics" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Mostra els &detalls" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Afegeix un amic" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Elimina l'amic" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Envia un &missatge" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Veure els compartits" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Estableix posició (slot) d'amic" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Esteu segur que voleu esborrar l'amics seleccionats?" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Esteu segur que voleu esborrar l'amics seleccionats?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Cancel·la" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"No podeu establir més d'una posició d'amic.\n" +" Només s'ha assignat una posició." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Selecció múltiple" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Fitxer" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Mida" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Tipus" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Prioritat" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "Clau del fitxer" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Peticions" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Peticions acceptades" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Dades transferides" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Rati" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Parts obtingudes" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Fonts completes" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Ubicació" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Compartits" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Molt baixa" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Baixa" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normal" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Alta" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Molt alta" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Llançament" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Auto" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Afegeix comentari / valoració" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Edita comentari / valoració" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Reanomena" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Afegeix els fitxers de la col·lecció a les transferències" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Copia l'enllaç en format &Magnet al porta-retalls" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Copia &l'enllaç ED2K al porta-retalls" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Copia l'enllaç ED2K al porta-retalls (&Font)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "Copia l'enllaç ED2K al porta-retalls (Font) (&amb opcions de xifrat)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Copia l'enllaç ED2K al porta-retalls (&Ordinador)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" +"Copia l'enllaç ED2K al porta-retalls (Ordinador) (amb opcions de &xifrat)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Copia l'enllaç ED2k al porta-retalls (informació AIC&H)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Copia la &informació al porta-retalls" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "Necessiteu ID Alta per crear un enllaç font vàlid" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Avís" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Fitxers compartits (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[Fitxer de parts]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Introduïu un nom nou per al fitxer:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Reanomena" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "S'està reprenent la pujada del fitxer: %s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "S'està suspenent la pujada del fitxer: %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: la paraula clau de cerca és massa curta" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Error: No s'ha pogut escoltar el port TCP." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "Ha fallat la petició amb el següent error: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "La petició ha fallat amb un error desconegut." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "No s'ha trobat el fitxer d'índex:" + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "No s'ha pogut crear el fil del sòcol web\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Servidor web: Iniciat\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "La sessió ha caducat - s'està demanant la identificació\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Sessió correcta, identificat\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Sessió correcta, sense identificar\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "No hi ha cap sessió oberta - es demanarà identificació\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Sessió creada - s'està demanant la identificació\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "S'està processant la petició [original]: " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "S'està comprovant la contrasenya\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "La clau de la contrasenya és invàlid\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Contrasenya correcta\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Contrasenya incorrecta\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "" +"No heu especificat cap contrasenya. No es permet una contrasenya en blanc.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Eixida sol·licitada\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "S'està processant la petició [redirigit]: " + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Carrega la plantilla " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Port HTTP del servidor web" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Utilitza l'encaminament UPnP al port del servidor web" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "Port UPnP" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Usa la compressió gzip" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Contrasenya d'accés complet per al servidor web" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Contrasenya de convidat per al servidor web" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Permetre l'accés de convidats" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Denega l'accés de convidats" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "Obre/desa els paràmetres del servidor web des de l'aMule remot" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "" +"Directori del fitxer de configuració de l'aMule. NO L'USEU DIRECTAMENT!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "Inhabilita el intèrpret PHP (obsolet)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Recompila les pàgines PHP a cada petició" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "Servidor web de l'aMule" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "No disponible" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Mai" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "S'està baixant..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Preferències" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "El directori on està el fitxer amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Explora" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Poseu ací el directori on està el fitxer amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Interval de refresc en segons" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Genera una imatge a cada refresc" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "Poseu ací el directori on es generarà la imatge d'estadístiques" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Puja periòdicament la imatge d'estat a un servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "Adreça FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "Directori FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Poseu ací l'adreça del servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "Poseu ací el directori del servidor FTP on es desarà la imatge" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Usuari" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Contrasenya" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Poseu ací el nom d'usuari per a entrar al servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Poseu ací la contrasenya per a entrar al servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "Interval d'actualització de l'FTP en minuts" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "D'acord" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Directori on està el fitxer de signatura" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Directori on es genera la imatge" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i dies %i hores %i min %i s" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, Estadístiques en línia de l'aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Benvinguts!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Rati de BA màxim des que el wxCas funciona" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "Màxim absolut de rati de BA històric del wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Reinicia" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "Sistema" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Atura l'autorefresc" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Desa la imatge de les estadístiques en línia" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Imprimeix la imatge de les estadístiques en línia" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Paràmetre de les preferències" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "Quant al wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Inicia l'autorefresc" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Autorefresc aturat" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Autorefresc iniciat" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Desa la imatge de les estadístiques" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "No hi ha gestor per a aquest tipus de fitxer" + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "No s'ha desat el fitxer" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "Estadístiques en línia de l'aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Ha hagut un problema en imprimir.\n" +"Tal volta la impressora actual no està configurada correctament?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Imprimint" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCAS, Signatura d'estadístiques en Línia de l'aMule\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Basat en CAS de Pedro de Oliveira \n" +"\n" +"Distribuït sota GPL" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "L'aMule no s'està executant..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "L'aMule s'està executant" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "L'aMule s'està executant, però desconnectat" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "L'aMule s'està connectant..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "L'estat de l'aMule és desconegut..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " ha estat funcionant durant " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " està aturat!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " no està connectat!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " està connectant..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " està fent alguna cosa estranya, comproveu-lo!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " està connectat a " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "correcte" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "protegit per un tallafocs" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "inactiu" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " és a " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +#, fuzzy +msgid " with " +msgstr "] amb " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Total baixat: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", pujat: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Baixat durant la sessió: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Baixant: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr "kB/s, pujant: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Compartint: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " fitxers, clients a la cua: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Hora: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " a " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Mitjana de càrrega del sistema (1-5-15 min): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Sistema en funcionament des de: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uD %02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "ID Alta" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "ID Baixa" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Desconnectat" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "Cancel·lat!" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "No s'ha pogut obrir %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "El fitxer %s és massa gran per al Donkey: el màxim permès són 4GB." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Paràmetres d'entrada" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Fitxer" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Afegeix adreces opcionals per al fitxer" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Introduïu ací el fitxer del qual voleu calcular l'enllaç Ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Introduïu ací l'adreça que voleu afegir a l'enllaç Ed2k: Afegiu una / al " +"final per a que s'adjunti el nom actual del fitxer automàticament" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Afegeix" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Esborra" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Neteja" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Crea l'enllaç amb una clau per part" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Ajuda a escampar més ràpidament els fitxer nous i rars, a costa d'un enllaç " +"més gros" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "Clau MD4 del fitxer" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "Clau Ed2k del fitxer" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "Enllaç ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Inicia" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Desa" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Copia al porta-retalls" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Surt" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Obriu un fitxer per a calcular l'enllaç ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Copia al porta-retalls l'enllaç ed2k calculat" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Desa a un fitxer l'enllaç ed2k calculat" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "Quant a l'aLinkCreator" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Seleccioneu el fitxer del qual voleu calcular l'enllaç ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "No hi ha res a copiar!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Seleccioneu el fitxer a l'enllaç ed2k calculat" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "No s'ha pogut obrir " + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Per favor, introduïu un nom que no sigui buit" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "No hi ha res a desar!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, el creador d'enllaços ed2k de l'aMule\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Imatges de http://www.everaldo.com i http://www.icomania.com\n" +"i http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distribuït sota la llicència GPL" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Fent la clau..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Fet en %.2f s" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "Ja heu afegit aquesta adreça!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Per favor, introduïu una adreça que no sigui buida" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "S'està processant el fitxer número %u: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "Heu preguntat per les claus de les parts (Només per a fitxers > 9.5MB)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Per favor, espereu... " + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> Fitxer inexistent !\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, el creador d'enllaços ed2k de l'aMule" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Auto [Ba]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Auto [No]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Auto [Al]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Connectant" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Preguntant" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "S'està connectant via servidor" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Cua plena" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "Cua" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Transferint" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Rebent el conjunt de claus" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "No es necessiten parts" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "No és possible connectar d' ID Baixa a ID Baixa" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Massa connexions" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "S'està connectant via Kad" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Massa connexions Kad" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Expulsats" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Error de la connexió" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Cua remota plena" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "MLDonkey antic" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "MLDonkey nou" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "Compatible amb eMule" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Servidor local" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Servidor remot" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Intercanvi de fonts" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Passiu" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Enllaç" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Llavors font" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Predeterminat" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Àrab" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Basc" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Búlgar" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Català; Valencià" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Xinès (Simplificat)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Xinès (Tradicional)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Croat" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Danès" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Holandès" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Anglès (R.U.)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Estonià" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Finès" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Francès" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Gallec" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Alemany" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Hongarès" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Italià" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Italià (Suïssa)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Coreà" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "Lituà" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "Noruec" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Polonès" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portuguès" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Portuguès (Brasil)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Rus" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Eslovè" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Espanyol; Castellà" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "Suec" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Turc" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "No s'ha pogut determinar el navegador seleccionat" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" +"El port TCP no pot ser més gran que 65532 puix el sòcol UDP del servidor és " +"TCP+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "S'usarà el port per defecte (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Nom" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Adreça" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Port" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Descripció" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Usuaris" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Fitxers" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Fallades" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Estàtic" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Versió" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Esteu intentant esborrar un servidor al què esteu connectat. Per favor, " +"desconnecteu-vos primer. NO s'ha esborrat el servidor." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Informació" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(Nom desconegut)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Esteu segur que voleu esborrar el servidor estàtic %s" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Sí" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "No" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "No s'ha pogut obrir '%s'" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Servidors (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Servidor" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Connecta al servidor" + +#: src/ServerListCtrl.cpp:428 +#, fuzzy +msgid "Mark server as static" +msgstr "Marca els servidors com a estàtic" + +#: src/ServerListCtrl.cpp:429 +#, fuzzy +msgid "Mark server as non-static" +msgstr "Marca els servidors com a no estàtic" + +#: src/ServerListCtrl.cpp:431 +#, fuzzy +msgid "Mark servers as static" +msgstr "Marca els servidors com a estàtic" + +#: src/ServerListCtrl.cpp:432 +#, fuzzy +msgid "Mark servers as non-static" +msgstr "Marca els servidors com a no estàtic" + +#: src/ServerListCtrl.cpp:438 +#, fuzzy +msgid "Remove server" +msgstr "Esborra els servidors" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "Esborra els servidors" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Esborra tots els servidors" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Copia l'enllaç ED2K al porta-retalls" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "Copia l'enllaç ED2K al porta-retalls" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Reconnecta amb el servidor" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Esteu segur que voleu esborrar tots els servidors?" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Esteu segur que voleu esborrar els servidors seleccionats?" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Esteu segur que voleu esborrar els servidors seleccionats?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Inhabilitat [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "aMule %s basat en eMule." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "S'està executant sobre %s" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" +"Visiteu http://www.amule.org per a comprovar si hi ha disponible una versió " +"nova." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Error Fatal: Ha fallat la creació del Timer" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "Control remot de l'aMule " + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Snapshot:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr "" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr "" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Missatge" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Text d'estat" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "Connectant" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "Desconnectat" + +#: src/amuleDlg.cpp:676 +#, fuzzy +msgid "Kad: Firewalled" +msgstr "Rere tallafocs" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "Connectat" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "Connectant" + +#: src/amuleDlg.cpp:689 +#, fuzzy +msgid "Kad: Off" +msgstr " Kad: " + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "Atura els intents de connexió actuals" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Desconnecta" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "Desconnecta de la xarxa." + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Connecta" + +#: src/amuleDlg.cpp:726 +#, fuzzy +msgid "Connect to the currently enabled networks" +msgstr "Connecta a la xarxa." + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "PU: %.1f(%.1f) | BA: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "PU: %.1f | BA: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | Connectat)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | Desconnectat)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Esteu segur que voleu eixir de l'aMule?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Confirmació de sortida" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "No s'ha pogut determinar l'ordre per a executar el navegador." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "El directori del tema '%s' no existeix" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "AVÍS: Impossible d'obrir el fitxer de tema '%s' per a lectura" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Xarxes" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Finestra de les Xarxes" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Cerques" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Finestra de cerques" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Transferències" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Finestra de transferència de fitxers" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Finestra de fitxers compartits" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Missatges" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Finestra de Missatges" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Estadístiques" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Finestra del gràfic d'estadístiques" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Finestra de la configuració de preferències" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Importa" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "Eina d'importació de fitxers de parts" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "Quant a" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "Quant a / Ajuda" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "General" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Connexió" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Servidor intermediari" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Filtre de missatges" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Control remot" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Signatura en línia" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Directoris" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Seguretat" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "GUI" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Nucli" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Esdeveniments" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Depuració" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Definit per l'usuari" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"S'ha de reiniciar l'aMule per a habilitar aquests canvis:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- El port TCP ha canviat.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- El port UDP ha canviat.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"La llista d'actualització automàtica és buida.\n" +"S'inhabilitarà l'actualització automàtica de la llista de servidors a " +"l'inici'." + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"Heu habilitat les connexions externes però no heu especificat una " +"contrasenya.\n" +"Les connexions externes no poden ser habilitades a menys que s'hagi " +"especificat una contrasenya externa vàlida." + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- L'idioma ha canviat.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- El directori temporal ha canviat.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "PU: 0.0 | BA: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"Les xarxes ED2K i Kad són ambdós inhabilitades.\n" +"No podreu connectar fins que habiliteu almenys una d'elles." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"La xarxa Kad no s'engegarà si el port UDP està inhabilitat.\n" +"Habiliteu el port UDP o inhabiliteu la xarxa Kad." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"HEU de reiniciar l'aMule ara mateix.\n" +"Si no reinicieu ara, no vos queixeu dels possibles problemes.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "AVÍS" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"La llista d'actualització automàtica de servidors és buida.\n" +"Per favor, ompliu-la amb almenys una adreça que apunti a un fitxer server." +"met vàlid.\n" +"Feu clic sobre el botó \"Llista\" d'aquest quadre de verificació per afegir " +"una adreça." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "Fitxers temporals" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Fitxers entrants" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Signatures en línia" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Carpeta per a %s" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Explora per a trobar un wav" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "Fitxer wav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Explora per a trobar un reproductor de vídeo" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Selecciona navegador" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Executable%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Edita la llista de servidors" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Afegiu ací adreces d'on baixar el fitxer server.met.\n" +"Només una adreça a cada línia." + +#: src/PrefsUnifiedDlg.cpp:980 +#, fuzzy, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Retard de l'actualització: %d segs" +msgstr[1] "Retard de l'actualització: %d segs" + +#: src/PrefsUnifiedDlg.cpp:987 +#, fuzzy, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Temps per al gràfic de mitjanes: %d mins" +msgstr[1] "Temps per al gràfic de mitjanes: %d mins" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Escala del gràfic de connexions: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, fuzzy, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Retard de l'actualització: %d segs" +msgstr[1] "Retard de l'actualització: %d segs" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, fuzzy, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Mida de la memòria intermèdia de fitxer: %d bytes" +msgstr[1] "Mida de la memòria intermèdia de fitxer: %d bytes" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, fuzzy, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Mida de la cua de pujada: %d clients" +msgstr[1] "Mida de la cua de pujada: %d clients" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, fuzzy, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Interval de refresc de la connexió amb el servidor: %d minuts" +msgstr[1] "Interval de refresc de la connexió amb el servidor: %d minuts" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Interval de refresc de la connexió amb el servidor: Inhabilitat" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Executa una ordre per a l'esdeveniment '%s'" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Activa l'execució d'ordres al nucli" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Odre del nucli:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Activa l'execució d'ordres a la interfície gràfica" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "Ordre de la GUI:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "Les següents variables seran reemplaçades:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Intent d'accés no autoritzat. Connexió tancada." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Connexió externa tancada." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "" +"Les connexions externes han estat inhabilitades per manca d'una contrasenya!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "Les connexions externes estan inhabilitades al fitxer de configuració" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Nova connexió externa acceptada" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "Error: no s'ha pogut acceptar una nova connexió externa" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" +"S'ha rebutjat la connexió externa per manca d'una contrasenya a les " +"preferències!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "S'està connectant al client: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Versió desconeguda" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"ID de versió EC incorrecta, pot haver-hi incompatibilitat binaria. Useu un " +"nucli i un client remot del mateix llançament (versió)." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "Ha fallat l'autenticació." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Versió del protocol invàlida." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Marcador de la versió del protocol inexistent." + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Petició invàlida, primer heu d'autenticar-vos." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Accés concedit." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" +"Ha fallat una ordre remota de fitxer de parts: La clau del fitxer no s'ha " +"trobat: %s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "No s'ha trobat la clau del fitxer: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "OOPS! Error en processar OpCode!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "No s'ha afegit el servidor" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "no s'ha trobat el servidor: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "és necessari definir el servidor a esborrar" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "ED2K està inhabilitat a les preferències." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "Cerca en procés. S'obtindran resultats en un moment!" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "La recerca web des de la interfície remota no té sentit." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad està inhabilitada a les preferències." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Cap punt per al gràfic." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "El vostre client no està configurat per a aquest nivell de detall." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "ExternalConn: s'ha demanat la parada" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Ja s'està aturant." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "ExternalConn: afegint l'enllaç '%s'" + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "L'enllaç és invàlid o ja és present a la llista." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "No s'ha trobat el fitxer." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Nom de fitxer invàlid." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "No s'ha pogut canviar el nom del fitxer." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Ja esteu connectat a ED2K." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "S'està connectant a ED2K..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Ja esteu connectat a Kad." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "S'està connectant a Kad..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Totes les xarxes estan inhabilitades." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Desconnectat de ED2K." + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Desconnectat de Kad." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "ExternalConn: s'ha rebut un opcode invàlid: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "Opcode invàlid (versió de protocol errònia?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" +"No s'ha pogut obrir el fitxer (%s), s'eliminarà de la llista de fitxers " +"compartits." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "S'ha demanat un conjunt de claus d'un fitxer desconegut: %s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "El procés '%s' amb pid '%d' ha finalitzat amb el codi d'estat '%d'" + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "" +"No s'ha afegit el servidor: No s'ha especificat cap IP o nom de servidor." + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "" +"No s'ha afegit el servidor: El port del servidor especificat és invàlid." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "Estat ED2K:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Connectat" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Port" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Estat Kademlia:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Funcionant" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Estat:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Desconnectat" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Estat de la connexió:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Rere tallafocs" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "OK" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Estat rere-tallafocs: " + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Connectat amb l'amic" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "Cap amic" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Mitjana d'usuaris:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "Mitjana de fitxers:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "Aturat" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Funcionant: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Transferència" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Pujades" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Dades pujades (sessió (total)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Sobrecàrrega total (paquets): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Sobrecàrrega per peticions de fitxers (paquets): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "Sobrecàrrega en l'intercanvi de fonts (paquets): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Sobrecàrrega del servidor (paquets): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Sobrecàrrega Kad (paquets): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Pujades actius: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Pujades en espera: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Total de sessions de pujada resoltes: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Total de sessions de pujada fallades: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Temps mitjà de pujada: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Baixades" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Dades baixades (sessió (total)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Fonts trobades: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Baixades actives (trossos): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Rati PU:BA de la sessió (total): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Rati mitjà de baixada (sessió): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Rati mitjà de pujada (sessió): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Rati màx. de baixada (sessió): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Rati màx. de pujada (sessió): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Reconnexions: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Temps des de la primera transferència: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Connectat al servidor des de: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Connexions actives (aprox.): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "S'ha arribat al límit de connexions màxim: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Mitjana de connexions (aprox.): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Pic de connexions (aprox.): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Clients" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Filtrats" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Total: %i Coneguts: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Servidors" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Servidors funcionant: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Servidors fallits: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Total: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Servidors esborrats: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Servidors filtrats: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Usuaris en servidors funcionant: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "Fitxers en servidors funcionant: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Usuaris totals: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "Fitxers totals: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Càrrega del servidor: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Fitxers compartits: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Mida total dels fitxers compartits: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Mida mitjana dels fitxers: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "ID Baixa: %u (%.2f%% total %.2f%% coneguts)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "IdentSeg Activa/inactiva: %u (%.2f%%): %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Sistema operatiu" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "No s'ha rebut" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Retalla" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Copia" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Enganxa" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Selecciona-ho tot" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "No es pot fer una cerca Kad si la xarxa Kad no està engegada" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "No es pot fer una cerca ED2K si la xarxa ED2K no està connectada" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Error inesperat mentre s'intentava fer una cerca Kad: " + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "Missatge filtrat de '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "Nou missatge de '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" +"L'usuari %s (%u) ha demanat la llista de fitxers compartits -> Acceptada" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" +"L'usuari %s (%u) ha demanat la llista de fitxers compartits -> Denegada" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" +"L'usuari %s (%u) ha demanat la llista de directoris compartits -> Acceptada" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" +"L'usuari %s (%u) ha demanat la llista de directoris compartits -> Denegada" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"L'usuari %s (%u) ha demanat la llista de fitxers compartits del directori %" +"s -> Acceptada" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"L'usuari %s (%u) ha demanat la llista de fitxers compartits del directori %" +"s -> Denegada" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "L'usuari %s (%u) comparteix el directori %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "L'usuari %s (%u) ha enviat directoris compartits no demanats." + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" +"L'usuari %s (%u) ha enviat la llista de fitxers compartits del directori %s" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "" +"L'usuari %s (%u) ha acabat l'enviament de la llista de fitxers compartits" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "" +"L'usuari %s (%u) ha enviat una llista de fitxers compartits no desitjada" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" +"L'usuari %s (%u) ha denegat l'accés a la llista de fitxers/directoris " +"compartits" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Nodes (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "IP invàlida per a l'arrancada" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Port invàlid per a l'arrancada" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Per favor empleneu tots els camps requerits" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Esteu segur que voleu baixar un nou fitxer nodes.dat?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "Fer-ho esborrarà els nodes actuals i reiniciarà la connexió Kademlia." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Voleu continuar?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Error: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Avís: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Afegeix un amic" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Heu d'introduir una IP i port vàlids" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Informació" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "La clau d'usuari especificada no és vàlida!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Fonts" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Fitxer" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Baixada" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Categoria" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Principal" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Baixa a la categoria" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "Cerca fitxers similars (ED2K, servidor local)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Connecta a l'amule remot" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "La connexió ha fallat " + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Error" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"AVÍS: No podeu afegir-vos com a font d'un enllaç ed2k mentre teniu ID Baixa." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Usuaris: E: %s K: %s | Fitxers E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Tots" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Usuaris Totals: %s | Fitxers Totals: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Transferit" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Completat" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Velocitat" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Progrés" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Estat" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Temps Restant" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Últim cop vist complet" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Última recepció" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Esteu segur que voleu esborrar els fitxers seleccionats?" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Esteu segur que voleu esborrar els fitxers seleccionats?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Envia un missatge a l'usuari" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Missatge a enviar:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Atura" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Pausa" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Continua" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "&Neteja els completats" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Intercanvia cada A4AF a aquest fitxer ara" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Intercanvia cada A4AF a aquest fitxer (Automàtic)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Intercanvia cada A4AF a qualsevol altre fitxer ara" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Opcions avançades" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Previsualitza" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Mostra els &detalls del fitxer" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Mostra els comentaris" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Copia l'enllaç amb format Magnet al porta-retalls" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "Cap categoria" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Assigna a una categoria" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "&Obre el fitxer" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Elimina'l dels amics" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Afegeix a la llista d'amics" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Envia un missatge" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Intercanvia cap a aquest fitxer" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%d/%m/%y %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "C: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "S'ha preguntat per un altre fitxer" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Baixades (%i)" + +#: src/DownloadListCtrl.cpp:2222 +#, fuzzy +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"Per favor especifiqueu el reproductor de vídeo a les preferències.\n" +"Mentrestant, l'aMule intentarà usar l'mplayer i rebreu aquest avís a cada " +"previsualització" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Previsualització" + +#: src/DownloadListCtrl.cpp:2260 +#, fuzzy, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "ERROR: No s'ha pogut executar un reproductor multimèdia extern!" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "ERROR: No s'ha pogut obrir el fitxer de parts)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "ERROR: No s'ha pogut crear el fitxer de parts)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "S'està intentant carregar la còpia del fitxer met des de %s" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "Error: No s'ha pogut obrir el fitxer part.met: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "Error: el fitxer part.met és buit: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "Error: La versió del fitxer part.met és invàlida: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" +"Error: %s (%s) és corrupte (etiqueta de compte incorrecta), no s'ha pogut " +"carregar el fitxer." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "S'està intentant recuperar la informació del fitxer..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" +"S'està recuperant un fitxer sense nom - s'intentarà recuperar com a " +"RecoveredFile.dat" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" +"S'ha recuperat tota la informació disponible :D - S'està intentant usar-la..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "No s'ha pogut recuperar la informació del fitxer :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "No s'ha pogut obrir %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "Avís: %s podria ser corrupte (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "ERROR mentre es desava un fitxer de parts: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "'%s' és buit - s'està usant el fitxer %s." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "No s'ha pogut desar el fitxer part.met.seeds per a %s" + +#: src/PartFile.cpp:1019 +#, fuzzy, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "%i llavors fonts desades per al fitxer de parts: %s (%s)" +msgstr[1] "%i llavors fonts desades per al fitxer de parts: %s (%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "El fitxer de parts %s (%s) no té fitxer de llavors" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "El fitxer de parts %s (%s) té un fitxer de llavors buit" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "Error en llegir el fitxer de llavors del fitxer de parts (%s - %s): %s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, fuzzy, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"S'ha trobat una part corrupta (%d) en el fitxer de parts %d %s - " +"FileResultHash |%s| FileHash |%s|" +msgstr[1] "" +"S'ha trobat una part corrupta (%d) en el fitxer de parts %d %s - " +"FileResultHash |%s| FileHash |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "S'ha trobat una part completa (%i) a %s" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "S'ha acabat de refer la clau %s" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "Error inesperat mentre es completava %s. Fitxer pausat" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "S'ha acabat de baixar: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "S'està esborrant el fitxer: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" +"Avís: Ha estat impossible fer la clau de la part baixada - conjunt de claus " +"incomplet per a '%s'" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"Error: No s'ha pogut fer la clau de la part baixada - conjunt de claus " +"incomplet (%s). Açò no hauria de passar mai" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "" +"AVÍS: No hi ha suficient espai al disc dur! S'està pausant el fitxer: %s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "Corrupció a la part baixada %i del fitxer: %s" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH: S'ha recuperat la part corrupta %i de %s -> Bytes desats: %s" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "L'espai de disc és insuficient" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Aturat" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "AVÍS: no es pot obrir 'known.met'." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" +"Avís: llista de fitxers coneguts és corrupta, conté una capçalera invàlida." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "Error d'E/S metre es llegia el fitxer known.met: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "Error mentre es desava el fitxer known.met: %s" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "S'han trobat %i fitxers compartits" +msgstr[1] "S'han trobat %i fitxers compartits" + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "S'han trobat %i fitxers compartits coneguts, %i desconeguts" +msgstr[1] "S'han trobat %i fitxers compartits coneguts, %i desconeguts" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "ERROR! S'ha intentat compartir %s" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Comentaris del Fitxer" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Valoració" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Comentari" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Sense comentaris" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%s comentaris" +msgstr[1] "%s comentaris" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"No s'ha pogut connectar amb els servidors ofuscats de la llista. Intentant-" +"ho de nou sense ofuscació." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "" +"No s'ha pogut connectar amb cap servidor de la llista. Intentant-ho de nou." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "La xarxa ED2K és inhabilitada a les preferències, no es connectarà." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "No s'ha trobat cap servidor vàlid a la llista de servidors" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Connectat a %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Connexió establerta amb: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"Error fatal en intentar connectar. La connexió a Internet pot haver caigut" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "S'ha perdut la connexió a %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) sembla estar mort." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) sembla estar ple." + +#: src/ServerConnect.cpp:391 +#, fuzzy, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "Es reintentarà la connexió al servidor d'ací %d segons" +msgstr[1] "Es reintentarà la connexió al servidor d'ací %d segons" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "S'ha perdut la connexió" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "No s'ha pogut connectar a %s (%s:%i)." + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "Error: Sòcol invàlid en la comprovació de temps" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "L'intent de connexió a %s (%s:%i) ha excedit el temps." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "No s'han trobat fitxers de parts" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "Trobats %u fitxers de parts" +msgstr[1] "Trobats %u fitxers de parts" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "S'està baixant %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Ja esteu intentant baixar el fitxer '%s'" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Ja disposeu del fitxer '%s'" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Ja esteu intentant baixar el fitxer %s" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "No es pot convertir l'enllaç Magnet a ED2K: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "Protocol desconegut de l'enllaç: %s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Enllaç e2dk invàlid! Error: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "Executa i surt." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Format IP invàlid. Useu xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +#, fuzzy +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" +"Aquesta ordre requereix un argument. Arguments vàlid: 'all' o un número.\n" + +#: src/TextClient.cpp:343 +#, fuzzy +msgid "Processing by hash: " +msgstr "S'està processant el fitxer número %u: %s" + +#: src/TextClient.cpp:358 +#, fuzzy +msgid "Processing by filename: " +msgstr "S'està processant el fitxer número %u: %s" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Número invàlid\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "" +"No és una clau vàlid (la longitud hauria de ser exactament de 32 caràcters)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "La operació ha finalitzat amb èxit." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "La petició ha fallat amb el següent error: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "El filtre IP per a clients és: %s.\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "Desactivat" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "Activat" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "El filtre IP per a servidors és: %s.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "El nivell actual del filtre IP és %d.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Límits d'ample de banda: pujada: %u kB/s, baixada: %u kB/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Connectat a %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "amb ID Baixa" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "amb ID Alta" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Connectant" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Desconnectat" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Baixada:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Pujada:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Clients a la cua:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Fonts totals:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Número de resultats de la cerca: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "TODO - mostra el progrés d'una cerca" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "S'ha rebut una resposta desconeguda del servidor, OpCode = %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Mostra la informació d'estat resumida." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "" +"Mostra l'estat de la connexió, velocitat de pujada/baixada actuals, etc.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Mostra l'arbre d'estadístiques complet." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"De manera opcional, es pot passar un número en el rang 0-255 com a argument " +"d'aquesta\n" +"ordre, que diu quantes entrades del subarbre de la versió de client " +"s'haurien de\n" +"mostrar. Passar 0 o ometre'l es igual a 'il·limitades'.\n" +"\n" +"Exemple: 'statistics 5' només mostrarà les 5 versions més usades de cada " +"tipus de client.\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "Atura l'aMule." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Atura el nucli remot engegat (amule/amuled).\n" +"Açò també pararà el client de text, puix és inusable sense\n" +"un nucli en marxa.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Recarrega l'objecte donat." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "Recarrega la llista de fitxers compartits." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "Recarrega la taula de filtrat IP des del fitxer." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Connecta a la xarxa." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"Connectarà amb totes les xarxes que són habilitades a les Preferències.\n" +"Opcionalment també podeu especificar l'adreça d'un servidor en format IP:" +"Port, per a \n" +"connectar només amb aquest servidor. L'IP ha de ser una adreça IPv4 decimal " +"puntejada,\n" +"o un nom DNS resoluble." + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Connecta només a ED2K." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Connecta només a Kad." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Desconnecta de la xarxa." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "Desconnectarà de totes les xarxes que estiguin connectades ara.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Desconnecta només d' ED2K." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Desconnecta només de Kad." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Afegeix un enllaç ed2k o Magnet al nucli." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"L'enllaç edk2 que s'afegirà pot ser.\n" +"*) un enllaç a un fitxer (ed2k://|file|...), serà afegit a la cua de " +"baixades,\n" +"*) un enllaç a un servidor (ed2k://|server|...), serà afegit a la llista de " +"servidors,\n" +"*) o un enllaç a una llista de servidors, en el que tots els servidors en la " +"llista seran afegits\n" +" a la llista de servidors.\n" +"\n" +"Un enllaç Magnet ha de contenir la clau ed2k i la longitud del fitxer.\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Defineix un valor de configuració." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "Defineix les preferències del filtrat IP." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "Activa el filtre IP per a clients i servidors" + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "Atura el filtre IP per a clients i servidors" + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "Activa/Desactiva el filtre IP per a clients" + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "Activa el filtre IP per a clients" + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "Atura el filtre IP per a clients" + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "Activa/Desactiva el filtre IP per a servidors" + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "Activa el filtre IP per a servidors" + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "Atura el filtre IP per a servidors" + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "Selecciona el nivell de filtratge IP." + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"Els nivells de filtratge vàlids són en el rang 0-255, i el valor per " +"defecte\n" +"(inicial) és 127.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Defineix els límits d'ample de banda." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "El valor donat ha de ser en kilobytes/seg.\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Defineix el límit d'ample de banda de pujada." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "Defineix el límit d'ample de banda de baixada." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Obté i mostra un valor de les preferències." + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "Obté les preferències del filtratge IP." + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "Obtenir l'estat del filtre IP per a clients i servidors" + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "Obtenir l'estat del filtre IP només per a clients" + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "Obtenir l'estat del filtre IP només per a servidors" + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "Obté el nivell del filtratge IP." + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Obté els límits d'ample de banda." + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Realitza una cerca." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"S'ha d'especificat un tipus de cerca:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Exemple:'search kad fitxer' executarà una cerca kad per a \"fitxer\".\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Realitza una cerca global" + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Realitza una cerca local" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Realitza una cerca kad" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Mostra els resultats de l'última cerca." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Retorna els resultats de la cerca anterior.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Comença a baixar un fitxer" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"S'ha de donar el número d'un fitxer de l'última recerca.\n" +"Exemple: 'download 12' començarà a baixar el fitxer amb el número 12 de la " +"recerca anterior.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Pausa la baixada." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Reprèn la baixada." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Cancel·la la baixada." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Assigna una prioritat de baixada" + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "Estableix la prioritat d'una baixada a Baixa, Normal, Alta o Auto.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "Estableix la prioritat a baixa" + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "Estableix la prioritat a normal." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "Estableix la prioritat a alta." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "Estableix la prioritat a auto." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Mostra les cues/llistes." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Mostra la cua de pujades/baixades, la llista de servidors o la llista de " +"fitxers compartits.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Mostra la cua de pujades." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Mostra la cua de baixades." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Mostrar el registre." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Mostra la llista de servidors." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Buida el registre." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() ha retornat NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "Error: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "Avís: %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "La nova ID d'usuari és %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "" +"\tAixò normalment és perquè esteu darrere d'un tallafocs o un encaminador." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tPer a rebre més informació, per favor visiteu http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "S'ha rebut una informació desconeguda del servidor! - massa curta" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "S'han rebut %d servidors nous" +msgstr[1] "S'han rebut %d servidors nous" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "S'ha desat la llista de servidors." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "El servidor ha rebutjat l'última ordre" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "S'ha rebut un paquet fals del servidor: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "" +"S'ha produït un error sense tractament mentre es processava un paquet del " +"servidor: %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "No es pot crear el fil per a resoldre DNSs per a connectar amb %s" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "L'IP del servidor %s (%s) està filtrada. No es connectarà." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "S'està utilitzant l'ofuscació de protocol" + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "S'està connectant a %s (%s - %s:%i) %s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "" +"No es pot resoldre el dns per al servidor %s: Ha estat impossible connectar!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "" +"CIP2Country::CIP2Country(): No s'han pogut carregar les dades del país des de" + +#: src/IP2Country.cpp:73 +#, fuzzy, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "S'han carregat %d imatges de banderes." +msgstr[1] "S'han carregat %d imatges de banderes." + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"Esteu segur que voleu cancel·lar i esborrar tots els fitxer d'aquesta " +"categoria?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Es Requereix Confirmació" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Tota la resta" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Incomplet" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Actiu" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Vídeos" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Àudio" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Arxius" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "Imatges de CD" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Imatges" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Documents" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Selecciona un filtre de vista" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Afegeix una categoria" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Edita la categoria" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Elimina la categoria" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "S'està important %s: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "S'està llegint la carpeta temporal" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "" +"S'està recuperant la informació bàsica del fitxer d'informació de baixada" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "S'està creant el fitxer de destí" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "S'està carregant les dades del fitxer de baixada antic (%u de %u)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "" +"S'està desant el bloc de dades a un nou fitxer de baixada únic (%u de %u)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "S'està recuperant informació del fitxer de baixada font" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "S'està afegint la baixada i desant un nou fitxer de parts" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Recollint l'estat..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "En progrés" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Error: No hi ha espai al disc" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Error: no s'ha trobat partmet" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Error: error d'E/S!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Error: Ha fallat!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "En cua" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Ja s'està baixant" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Format de fitxer temporal desconegut o defectuós." + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Nom del fitxer" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Estat" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Clau (Hash)" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Importa fitxers de parts" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "Seleccioneu una carpeta amb baixades temporals! (recursiu)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" +"Voleu que s'esborrin els fitxers originals de les baixades importades amb " +"èxit?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Voleu esborrar les fonts?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Esperant..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (Disc: %s)" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "bytes" +msgstr[1] "bytes" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "bytes/seg" +msgstr[1] "bytes/seg" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "segs" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "mins" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "hores" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "Dies" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Vídeos" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Arxius" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Documents" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programes" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Qualsevol" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Sense Valorar" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Invàlid / Corrupte / Fals" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Pobre" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Correcte" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Bo" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Excel·lent" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "tot" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "tota la resta" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "" +"S'està carregant els filtres IP 'ipfilter.dat' i 'ipfilter_static.dat'." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" +"No s'ha pogut carregar el fitxer ipfilter.dat '%s', s'ha trobat un format " +"desconegut." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" +"No s'ha pogut carregar el fitxer ipfilter.dat '%s', ha estat impossible " +"obrir el fitxer." + +#: src/IPFilter.cpp:330 +#, fuzzy, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +"S'han carregat %u rangs IP des de '%s'. S'han descartat %u línies " +"malformades." +msgstr[1] "" +"S'han carregat %u rangs IP des de '%s'. S'han descartat %u línies " +"malformades." + +#: src/IPFilter.cpp:332 +#, fuzzy, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +"S'han carregat %u rangs IP des de '%s'. S'han descartat %u línies " +"malformades." +msgstr[1] "" +"S'han carregat %u rangs IP des de '%s'. S'han descartat %u línies " +"malformades." + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Connexions actives (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Detalls del fitxer" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% fet" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "Enllaç ED2K:" + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "D'acord" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" +"Feu clic ací per a afegir a la cua de baixades l'enllaç ed2k del control de " +"text." + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "Text d'estat en finestra emergent" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Carregant..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"Els esdeveniments es mostren ací. Per a veure la llista completa, mireu el " +"registre de la pestanya Servidors." + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Número d'usuaris al servidor on esteu connectat ..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Usuaris: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" +"Usuaris connectats al servidor actual i una estimació del nombre total " +"d'usuaris." + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"La mitjana de pujada i baixada actuals. Si està habilitat, el valor entre " +"parèntesis mostra la sobrecàrrega provinent de les comunicacions amb els " +"clients." + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"Mostra l'estat de la connexió i les transferències actives. El roig vol dir " +"que no esteu connectat actualment, el groc que teniu ID baixa (rere " +"tallafocs) i el verd que teniu ID alta (El tipus de connexió òptim)." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Desconnectat ..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Servidor connectat actualment." + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Cerca" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Nom:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Local" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Global" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "FileHash" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Cerca avançada" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Filtratge" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Tipus de fitxer" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Extensió" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Mida Mín." + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Bytes" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Mida Màx." + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Disponibilitat" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Filtre:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Resultat del filtre" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Inverteix el resultat" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Amaga els fitxers coneguts" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Més" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "Cerca més resultat a la xarxa ED2K. Encara no disponible per a Kad." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Atura" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Buida els camps" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Resultats" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Neteja les baixades completades" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Mostra les Pujades / Cua" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Clients a la cua:" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Envia" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Envia el missatge especificat." + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Tanca" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Tanca aquesta sessió de xat." + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Nom Complet:" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "N/D" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "Fitxer-met:" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Clau:" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Mida:" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Estat de les parts:" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Últim cop vist complet:" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Fonts trobades:" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Fonts transferint:" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Compte de parts:" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Disponibilitat:" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Velocitat:" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Temps actiu de baixada: " + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Transferit:" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Completats:" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Gestió intel·ligent de la Corrupció " + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Perdut per corrupció:" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Guanyat per compressió:" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "Paquets recuperats per I.C.H.:" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Noms del fitxer" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Copia" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Neteja" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Aplica" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Ok" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "Comenta o valora el fitxer (visible per a tots els usuaris)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"D'una pel·lícula pots dir la durada, el gènere, l'idioma ...\n" +"i si és falsa, pots avisar a la resta d'usuaris." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Qualitat del fitxer" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "Seleccioneu una valoració, o aviseu si el fitxer no és correcte ..." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Sense comentaris" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Refresca" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "S'està baixant, per favor espereu ..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Mida desconeguda" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Informació requerida" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "Adreça IP:" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Port:" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Informació addicional" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Usuari:" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Clau d'Usuari:" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Recarrega els compartits" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Sessió actual" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Total" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Demanat:" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Pujades actives:" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Velocitat de baixada" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Actual" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Mitjana total" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Mitjana de la sessió" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Velocitat de pujada" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Connexions" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Baixades actives" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Connexions actives (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Pujades actives" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Arbre d'estadístiques" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Nom d'usuari:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Clau d'usuari:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Programari:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Versió:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "Adreça IP:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "ID de l'usuari:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "IP del servidor:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Nom del servidor:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "Transferències amb el client" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Petició actual:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Mitjana de pujada:" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Mitjana de baixada:" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Pujat (sessió):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Baixat (sessió):" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Pujat (total):" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Baixat (total):" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Puntuacions" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "Modificador PU/BA:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Identificació segura:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Puntuació (total):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Puntuació (a la cua):" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Paràmetres generals" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Sobrenom" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - la Mula de Linux" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "" +"Aquest és el (vostre) nom que els altres usuaris veuran en connectar-se." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Idioma" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "Açò especifica la llengua que s'usarà." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Miscel·lània" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Comprova si hi ha noves versions a l'inici" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "L'aMule comprovarà si hi ha noves versions durant l'inici" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Inicia minimitzat" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "L'aMule es minimitzarà automàticament a l'inici." + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Confirmació per a eixir" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "L'aMule demanarà confirmació abans de sortir." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Habilita la icona d'estat" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "Habilita/Inhabilita la icona d'estat a la safata del sistema." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "Minimitzar a la safata de sistema" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" +"L'aMule es minimitzarà a la safata de sistema (icona), enlloc de a la barra " +"de tasques (llista de programes)." + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Temps de retard dels consells en segons" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "El retard abans de mostrar els consells (notes emergents)." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Selecció del navegador" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Seleccioneu el navegador ací" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Navegador personalitzat:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Poseu ací el nom del navegador. Per a usar un navegador personalitzar, " +"seleccioneu Personalitzat al menú de sota." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Obre en una nova pestanya si és possible" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" +"Obre la pàgina web en una nova pestanya en comptes de obrir una nova " +"finestra si és possible" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Límits d'ample" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Pujada" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Per posició (slot)" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Capacitat de la línia" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Port TCP del client estàndard:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "Aquest és el port ED2K estàndard i no es pot inhabilitar." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Port UDP del client estès:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "Aquest port UDP s'usa per a peticions ED2K esteses i la xarxa Kad" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "inhabilita" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Adreça d'escolta" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "Port UDP per a peticions esteses del servidor (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Màx. fonts per fitxer" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Límit dur" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Límit de connexions" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Màx. connexions" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Universal Plug and Play" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "Activa UPnP" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "Port UPnP TCP:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Autoconnecta a l'inici" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Reconnecta en perdre la connexió" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Mostra la sobrecàrrega d'ample" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Opcions del servidor" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Elimina els servidors morts després de" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "intents" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Actualitza automàticament la llista de servidors a l'inici" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Llista" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Actualitza la llista de servidors quan es connecti a un servidor" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Actualitza la llista de servidors quan es connecti a un usuari" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Usa el sistema de prioritats" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Usa la comprovació intel·ligent d'ID Baixa en connectar" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Connexió segura" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Autoconnecta només a servidors de la llista estàtica" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Estableix prioritat Alta per als servidors afegits manualment" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "I.C.H. actiu" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "L'AICH es refia de cada clau (no recomanat)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Afegeix les noves baixades en mode pausat" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Afegeix les noves baixades amb prioritat automàtica" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Intenta baixar abans les parts inicials i finals" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Afegeix els nous fitxer compartits amb prioritat automàtica" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Intenta transferir parts completes a totes les pujades" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Comença el següent fitxer pausat quan es completi un fitxer" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "De la mateixa categoria" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "Recorda 10 fonts dels fitxers rars (amb < 20 fonts)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Espai al disc" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Comprova l'espai restant al disc" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "L'aMule comprarà l'espai restant al disc" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Espai mín. al disc:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Poseu ací l'espai mínim desitjat." + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Directori d'entrada:" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Directori temporal:" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Directoris compartits" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "(Per a compartir recursivament feu clic dret sobre el directori)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Comparteix els fitxers ocults" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Reproductor de vídeo" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Crea una còpia per a fer la previsualització" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Gràfics" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Actualitza cada: 5 segs" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Temps per al gràfic de mitjana: 100 mins" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Escala del Gràfic de Connexions: 100 " + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Selecciona els colors de les estadístiques" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Fons" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Graella" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Baixada actual" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Mitjana de baixada total" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Mitjana de baixada de la sessió" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Pujada actual" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Mitjana de pujada total" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Mitjana de pujada de la sessió" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Connexions actives" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Barra de velocitat de la icona d'estat" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Nodes-Kad actuals" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Nodes-Kad funcionant" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Nodes-Kad de la sessió" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Selecciona" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Nombre de versions de client a mostrar (0=il·limitat)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Notificacions" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Missatges emergents" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Usa so" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Emergeix quan:" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Nova entrada al registre" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Nova sessió de xat" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Nou missatge de xat rebut" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "S'afegeix o s'acaba una baixada" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Nova versió de l'aMule" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "OOD urgent, connexió al servidor perduda" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Notifica per correu" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Envia un correu quan es completi una transferència." + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "Servidor SMTP:" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "Adreça de correu:" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! AVÍS !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"No canvieu aquests paràmetres si no sabeu\n" +"el que esteu fent, d'altra manera podeu\n" +"fer que tot funcioni pitjor.\n" +"\n" +"L'aMule anirà bé sense canviar cap\n" +"d'aquests paràmetres." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Configuració avançada" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Connexions noves màx. / 5 segs" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Mida del buffer de fitxer: 240000 bytes" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Mida de la cua de pujades: 5000 clients" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Interval de refresc de la connexió amb el servidor: Inhabilitat" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "Paràmetres de la GUI" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Progrés dels fitxers de la cua de baixades" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Mostra el percentatge" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Mostra la barra de progrés" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Aspecte de la barra de progrés" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Plana" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Arrodonida" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Suport d'aparences" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Habilitar el suport d'aparences" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Tema:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- no hi han temes disponibles - " + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Ordre de les columnes" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "Ordena automàticament els fitxers de la cua de baixades (més CPU)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "L'aMule ordenarà automàticament les columnes de la llista de baixades" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Miscel·lània" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Mostra el quadre d'entrada d'enllaços ED2K" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Mostra informació estesa a les pestanyes de les categories" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Mostra els ratis de transferència al títol" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Orientació vertical de la barra d'eines" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Mostra el número del fitxer part abans del nom del fitxer" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Control remot" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Paràmetres del servidor web" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Executa l'amuleweb a l'inici" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Port del servidor web" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "Activa l'encaminament UPnP al port del servidor web" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Port UPnP TCP del servidor web" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Temps de refresc de la pàgina (en segons)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Habilita la compressió Gzip" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Habilita l'usuari convidat" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Contrasenya de l'administrador" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Contrasenya del convidat" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Plantilla web" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Paràmetres de la connexió externa" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Accepta connexions externes" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"IP de la interfície que escolta\n" +"(buit per a qualsevol)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Introduïu ací una IP vàlida amb format a.b.c.d per a la interfície EC que " +"escolta. Un camp buit o 0.0.0.0 significarà qualsevol interfície." + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "Port TCP" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "Activa l'encaminament UPnP al port EC" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "Feu clic ací per a aplicar qualsevol canvi fet a les preferències." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Reinicia qualsevol canvi fet a les preferències." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Títol:" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Comentari:" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Dir. d'entrada:" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Canvia la prioritat per als nous fitxers assignats:" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "No canviïs" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Seleccioneu un color per a la Categoria (actualment seleccionat):" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Visualitza el \"missatge del dia\" del servidor en connectar ..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Informació del servidor" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Feu clic ací per a reiniciar el registre." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "Registre de l'aMule" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "" +"Feu clic en aquest botó per a actualitzar la llista de servidors des d'una " +"adreça ... " + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Llista de servidors" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Introduïu ací l'adreça d'un fitxer server.met i premeu el botó de l'esquerra " +"per a actualitzar la llista de servidors coneguts." + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Afegeix un servidor manualment: Nom" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Introduïu ací el nom del nou servidor" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Introduïu ací la IP del servidor, fent servir el format x.x.x.x." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Introduïu ací el port del servidor." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "" +"Afegeix un servidor manualment (abans omple els camps de l'esquerra) ..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "Info. ED2K" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Info. Kad" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"La localització seleccionada no està instal·lada al PC\n" +"L'heu de generar per a usar-la.\n" +"Un bon punt d'inici en sistemes GNU/Linux és el fitxer /etc/locale.gen i el " +"paquet 'locales'\n" +"Bona sort!\n" +"(Nota: s'intentarà establir igualment)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "No mostrar mai més" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "" +"Feu clic en aquest botó per a actualitzar la llista de nodes des d'una " +"adreça ..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Nodes (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"Introduïu ací l'adreça d'un fitxer nodes.dat i premeu el botó de l'esquerra " +"per a actualitzar la llista de nodes coneguts." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Estadístiques de nodes" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Arrancada" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Nou node" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Port:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Inicia des dels \n" +"clients coneguts" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Desconnecta Kad" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Ofuscació de protocol" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Suport per a l'ofuscació de protocol" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"Habilita l'ofuscació de protocol, i permet a l'aMule acceptar connexions " +"ofuscades d'altres clients." + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Usa l'ofuscació per a les connexions sortints" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"L'aMule usarà l'ofuscació de protocol en connectar amb altres clients/" +"servidors" + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Accepta únicament les connexions ofuscades" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"L'aMule només acceptarà les connexions ofuscades. Tindreu menys fonts, però " +"tot el tràfic serà ofuscat" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Opcions de fitxer" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Tothom" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Ningú" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Qui pot veure els fitxers compartits:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "Selecciona qui pot veure la llista de fitxers compartits." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "Filtratge IP" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Filtra els clients" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Habilita el filtratge de les IP de clients especificades al fitxer ~/.aMule/" +"ipfilter.dat." + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Filtra els servidors" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Habilita el filtratge de les IP de servidors especificades al fitxer ~/." +"aMule/ipfilter.dat." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Recarrega la llista" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "" +"Recarrega la llista d'IPs a filtrar des del fitxer ~/.aMule/ipfilter.dat" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "Adreça:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Actualitza ara" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Actualitza automàticament a l'inici" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Nivell de filtratge:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Filtra sempre les IP LAN" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Gestió paranoica de les IP no corresponents" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Rebutja el paquet si l'IP del client és diferent de l'IP on es rep el " +"paquet. Useu amb prudència." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Habilita/Inhabilita" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Habilita la signatura en línia" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Habilita l'escriptura del fitxer de signatura, que altres aplicacions " +"externes poden usar per a crear signatures i similars." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Freqüència d'actualització (segs):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "" +"Canvia la freqüència d'actualització (en segons) de la signatura en línia." + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Directori de la signatura en línia:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" +"Feu clic ací per a seleccionar el directori que conté els fitxers de " +"signatura en línia." + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Inhabilita/Habilita" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "Filtra els missatges entrants (excepte el xat actual):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Opcions de filtratge:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Filtra tots els missatges" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Filtra els missatges de la gent que no és a la llista d'amics" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Filtra els missatges dels clients desconeguts" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Filtra els missatges que continguin (useu ',' per a separar):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"Els missatges que continguin aquestes paraules seran filtrats i bloquejats " +"per l'aMule" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Comentaris" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "Filtra els comentaris que continguin (useu ',' per a separar):" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Habilita el servidor intermediari" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Habilita/inhabilita el suport per a servidor intermediari" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Tipus de servidor:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "El tipus de servidor intermediari al que connecteu" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Servidor intermediari:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "El nom del servidor intermediari" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Port del servidor:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "El port del servidor intermediari" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Autenticació" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Habilita l'autenticació" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Habilita/inhabilita l'autenticació amb usuari/contrasenya" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "El nom d'usuari per a connectar al servidor intermediari" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Contrasenya:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "La contrasenya per a connectar al servidor intermediari" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Connexió automàtica al servidor sense servidor intermediari" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Connecta a:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Entra a l'aMule remot" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Nom d'usuari" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Recorda la configuració" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Habilita la depuració-registre detallats." + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "Categories de missatge:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "Afegeix" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Reintenta" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Esborra" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Tipus d'esdeveniments" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Connecta amb qualsevol servidor i/o Kad" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Nova categoria" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Carpeta per als fitxers entrants" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Heu d'especificar un nom per a la categoria!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Heu d'especificar un directori per a la categoria!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"No s'ha pogut crear el carpeta d'entrada per a la categoria. Per favor, " +"especifiqueu un directori vàlid!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "Extensió '%s' desconeguda per a l'ordre '%s'.\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "Ordre '%s' desconeguda.\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"Aquesta ordre no pot tenir un argument.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"Aquesta ordre ha de tenir un argument.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Aquesta ordre és incompleta, heu d'usar una de les extensions de sota.\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Extensions disponibles:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Ordres disponibles:\n" + +#: src/ExternalConnector.cpp:188 +#, fuzzy, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"Les majúscules no influeixen a les ordres.\n" +"Escriviu 'help ' per a aconseguir informació sobre l' .\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Surt de l'aplicació." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Mostra l'ajuda." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"Per a aconseguir ajuda sobre una ordre, escriviu 'help '.\n" +"Per a veure la llista completa d'ordres escriviu 'help'.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"Useu '%s' per a la llista d'ordres\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Error de sintaxi!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"S'ha produït un error processant una ordre - açò no hauria de passar mai! " +"Informeu de l'error, per favor\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Aquesta ordre no hauria de tenir cap paràmetre." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Aquesta ordre ha de tenir un paràmetre." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Argument invàlid." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Aquesta ordre és incompleta." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Escriviu '%s' per a aconseguir més ajuda.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "%s·%s·%s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "%s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"S'està creant el client...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "" +"La connexió ha fallat. Ha estat impossible connectar amb l'ordinador " +"especificat\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"D'acord, eixint %s ...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"No es pot connectar amb una contrasenya buida.\n" +"Heu d'especificar una contrasenya o bé al fitxer de configuració\n" +"o a la línia d'ordres, o introduir-ne una quan se vos demani.\n" +"\n" +"Eixint...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Mostra aquest text d'ajuda." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "Ordinador on està executant-se l'aMule. (per defecte: localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "Port de l'aMule per a connexions externes. (per defecte: 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Contrasenya per a les connexions externes." + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Llegeix la configuració des del fitxer." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "No mostra res per la sortida estàndard." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Detallat - mostra també els missatges de depuració." + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Estableix la localització del programa (idioma)." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "Escriu al fitxer de configuració les opcions de la línia d'ordres." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "Crea un fitxer de configuració basat en el de l'aMule." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Mostra la versió del programa." + +#: src/ClientCreditsList.cpp:168 +#, fuzzy, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "El fitxer de crèdits ha estat carregat, %u són clients coneguts" +msgstr[1] "El fitxer de crèdits ha estat carregat, %u són clients coneguts" + +#: src/ClientCreditsList.cpp:171 +#, fuzzy, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] " - Han vençut els crèdits de %u clients!" +msgstr[1] " - Han vençut els crèdits de %u clients!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "No s'ha trobat el fitxer 'cryptkey.dat', creant-lo." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"ERROR: no es pot usar el dimoni aMule quan les connexions externes estan " +"inhabilitades. Per a activar les connexions externes, feu servir l'aMule " +"normal, inicieu l'amuled amb la opció --ec-config o establiu el paràmetre " +"\"AcceptExternalConnections\" a 1 al fitxer '~/.aMule/amule.conf'" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "ERROR: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Admet de nou" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Mostra les pujades" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Mostra la cua" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Mostra els clients" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Selecciona la vista" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Programari" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Esperat" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Temps pujant" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Pujat/Baixat" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Estat remot" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "C: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Prioritat" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Puntuació" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Demanat" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Últim cop vist" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "En cua" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Estat local" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Pujat" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Estat remot" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Baixat" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Clau de l'usuari" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Encriptat" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Oculta els fitxers compartits" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Detalls del client" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "No suportat" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Sense completar" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Dolent" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Verificat - Correcte" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "No disponible" + +#: src/ClientDetailDialog.cpp:190 +#, fuzzy, c-format +msgid "%u (QR: %u)" +msgstr "C: %u" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" +"La mida mínima ha de ser menor que la màxima. S'ignorarà la mida màxima." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Avís de cerca" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Il·limitat" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "Menú de la icona d'estat" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Límits de velocitat:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "PU: cap" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "PU: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "BA: cap" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "BA: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Velocitat de baixada: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Velocitat de pujada: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Informació del client" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Sobrenom: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "No heu seleccionat cap sobrenom!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "ID de client: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Servidor: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "IP del Servidor: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "Port TCP: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "Port TCP: No està llest" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "Port UDP: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "Port UDP: No està llest" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Signatura en línia: Habilitada" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Signatura en línia: Inhabilitada" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Compartits: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Clients a la cua: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "Total BA: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "Total PU: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Límit de pujada" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Límit de baixada" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "Amaga l'aMule" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "Mostra l'aMule" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "S'ha iniciat una sessió de xat: %s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Connectat amb el client ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** S'està connectant amb el client ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** No s'ha pogut connectar amb el client / Connexió perduda ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Tanca la pestanya" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Tanca totes les pestanyes" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Tanca les altres pestanyes" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "S'està carregant el fitxer server.met: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "No s'ha trobat el fitxer server.met!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" +"No s'ha pogut carregar el fitxer server.met '%s', s'ha trobat un format " +"desconegut." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "No s'ha pogut obrir el server.met!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"Fitxer server.met corrupte, s'ha trobat una etiqueta de versió invàlida: 0x%" +"x, mida %i" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "S'han trobat %i servidors al server.met" +msgstr[1] "S'han trobat %i servidors al server.met" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d servidors afegits" +msgstr[1] "%d servidors afegits" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "No s'ha afegit el servidor: [%s:%d] no s'especifica un port vàlid." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "" +"No s'ha afegit el servidor: L'IP de [%s:%d] ha estat filtrada o no és vàlida." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" +"No s'ha afegit el servidor: S'ha trobat un servidor amb IP:Port [%s:%d] " +"iguals." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "S'ha afegit un Servidor: [%s:%d] s'està usant el nom '%s'." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"Esteu connectat al servidor què intenteu eliminar. Per favor, primer " +"desconnecteu-vos." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "No s'ha pogut desar el server.met" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "Adreça invàlida" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "No s'ha pogut baixar la llista de servidors des de %s" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"No s'ha trobat cap adreça d'una llista de servidors al fitxer 'adresses." +"dat'. Per favor, enganxeu-hi dintre d'aquest fitxer una adreça d'una llista " +"de servidors vàlida per tal d'actualitzar automàticament la llista." + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" +"Avís, l'adreça especificada és invàlida per a l'actualtizació automàtica de " +"servidors: %s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" +"No s'ha trobat una adreça automàtica per a baixar un server.met al fitxer " +"addresses.dat" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"El servidor local està filtrat pels filtres IP, s'està reconnectant a un " +"servidor diferent!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "Error en executar l'ordre '%s' per a l'esdeveniment '%s'" + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"S'ha establert la localització Predeterminada del Sistema a causa d'un canvi " +"de configuració. Disculpeu." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"No teniu cap servidor a la llista de servidors.\n" +" Voleu que l'aMule baixi una llista nova?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Baixada de la llista de servidors" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "servidor web executant-se amb pid %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"S'ha configurat el servidor web per a que s'engegui a l'inici, però no es " +"pot executar el binari. Instal·leu el paquet que conté el servidor web de " +"l'aMule o compileu l'aMule amb l'opció --enable-webserver i feu make install" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "El port %u no està disponible. Tindreu ID BAIXA\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"El port %u no està disponible!\n" +"\n" +"Això significa que tindreu ID BAIXA.\n" +"\n" +"Comproveu la configuració de la xarxa per a assegurar-vos que el port està " +"obert." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "No s'ha pogut crear el fitxer de la signatura en línia" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "No s'ha pogut crear el fitxer de la signatura en línia de l'aMule" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"La localització seleccionada no està instal·lada al PC. (Nota: s'intentarà " +"establir igualment)" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "És la primera vegada que executeu l'aMule %s" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "Aquesta és una versió de prova, actualitzada diàriament, i\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "no podem garantir que no trenqui res, cremi la vostra casa,\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "o mati al gos. Tanmateix el seu ús *hauria* de ser segur.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" +"En aquesta versió s'han canviat les següents opcions per motius de " +"seguretat:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* Habilitada l'ofuscació de protocol per a les connexions d'entrada i " +"eixida.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* Inhabilitada l'actualització de la llista de servidors des d'altres " +"servidors i clients.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"Per a més informació sobre els motius d'aquests canvis, cerqueu\n" +"informació sobre \"fake servers\" al wiki de l'aMule http://wiki.amule.org.\n" +"És important que esborreu qualsevol servidor fals de la llista per a que tot " +"funcioni correctament." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Podeu trobar més informació, ajuda i noves versions a la nostra pàgina web,\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "a www.aMule.org, o al nostre canal IRC #aMule de irc.freenode.net.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Podeu informar de qualsevol error a http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"La carpeta especificada per als fitxers de la signatura en línia és " +"INVÀLIDA!\n" +" S'INHABILITARÀ la signatura en línia fins que ho resolgueu a les " +"preferències." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "ERROR: no es pot obrir el fitxer de registre" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "AVÍS: el fitxer de registre està buit. Alguna cosa no va bé." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "S'ha reiniciat el registre" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "Missatge del servidor: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "No s'ha pogut baixar la llista de nodes." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "No s'ha pogut obrir el fitxer de comprovació de versió" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Fitxer de comprovació de versió corrupte" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Esteu usant una versió antiga de l'aMule!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "" +"La vostra versió de l'aMule és %i.%i.%i i l'última versió és %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "Sempre podeu trobar l'última versió a http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "AVÍS: La vostra versió d'aMuled és antiga: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "La vostra versió de l'aMule és l'última." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "No s'ha pogut baixar el fitxer de comprovació de versió" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Connectat a %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "S'està connectant a %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Desconnectat de ED2K" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "S'ha engegat la xarxa Kad." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "S'ha aturat la xarxa Kad." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Connectat a Kad (ok)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Connectat a Kad (tallafocs)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Desconnectat de Kad" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"No es pot usar la xarxa Kad si el port UDP està inhabilitat a les " +"preferències, no s'engegarà." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "La xarxa Kad està inhabilitada a les preferències, no es connectarà." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "" +"No s'ha pogut obrir per a lectura el fitxer de la llista d'amics 'emfriends." +"met'!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "" +"No s'ha pogut obrir per a escriure el fitxer de la llista d'amics 'emfriends." +"met'!" + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "No podeu arrancar una ip específica des de la GUI remota, encara." + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "Encara no es pot actualitzar el server.met des de la GUI remota." + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "S'han llegit %u contactes Kad" +#~ msgstr[1] "S'han llegit %u contactes Kad" + +#~ msgid "Disconnect from " +#~ msgstr "Desconnecta del " + +#~ msgid "current server" +#~ msgstr "servidor actual" + +#~ msgid " and " +#~ msgstr " i " + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "Desconnecta de qualsevol servidor i/o Kad" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "TCP Flags" +#~ msgstr "Opcions TCP" + +#~ msgid "UDP Flags" +#~ msgstr "Opcions UDP" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "Copia els enllaços ED2K al porta-retalls" + +#~ msgid "Client requests %u" +#~ msgstr "Peticions del client %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "Bloc del fitxer %u-%u (%d bytes):" + +#~ msgid "Client request is invalid!" +#~ msgstr "La petició del client és invàlida!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "La petició del client és invàlida! %i / %i" + +#~ msgid "Command: %s" +#~ msgstr "Ordre: %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "No s'ha pogut obrir el fitxer %s - usant el fitxer %s." + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "AVÍS: 'known.met' no existeix." + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles: S'està eliminant %s de la llista de " +#~ "directoris compartits: directori no trobat." + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "L'espera de la terminació del procés fill ha fallat" + +#~ msgid "" +#~ "You cannot connect to a release version from an arbitrary CVS version! " +#~ "*sigh* possible crash prevented" +#~ msgstr "" +#~ "No podeu connectar a una versió estable des d'una versió CVS arbitrària! " +#~ "Quedeu advertit de possibles fallades." + +#~ msgid "doesn't work" +#~ msgstr "No funciona" + +#~ msgid "remote gui" +#~ msgstr "Interfície gràfica remota" + +#~ msgid "" +#~ "Error: Failed to load backup file. Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Error: No s'ha pogut carregar la còpia de seguretat. Cerqueu solucions " +#~ "per recuperar un .part.met a http://forum.amule.org " + +#~ msgid "" +#~ "Error: Backup part.met file is 0 size! Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Error: la còpia del fitxer part.met és buida! Cerqueu solucions de " +#~ "recuperació a http://forum.amule.org" + +#~ msgid "Error: part.met backup file is 0 size: %s ==> %s" +#~ msgstr "Error: el fitxer de còpia del part.met és buit: %s ==> %s" + +#~ msgid "" +#~ "Note: These values are\n" +#~ " only used for statistics." +#~ msgstr "" +#~ "Nota: Aquests valors només\n" +#~ "s'usen per a les estadístiques." + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ "Client p2p 'Multi-Plataforma' basat en eMule \n" +#~ "\n" +#~ " Web: http://www.amule.org\n" +#~ " Fòrum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contacte: admin@amule.org (problemes administratius) \n" +#~ " Copyright (C) 2003-2008 Equip aMule \n" +#~ "\n" +#~ " Una part de l'aMule està basada en\n" +#~ " Kademlia: Encaminament P2P basat en la mètrica XOR.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "Syncronization thread started." +#~ msgstr "S'ha iniciat el fil de sincronització." + +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "S'han carregat les claus mestres dels fitxers coneguts." + +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "S'ha produït un error en llegir els contactes Kad - 0 entrades" + +#~ msgid "Merge attempt" +#~ msgstr "Intent d'unió" + +#~ msgid "Recursive merge" +#~ msgstr "Unió recursiva" + +#~ msgid "Sucessful merge!" +#~ msgstr "S'ha unit amb èxit!" + +#~ msgid "No merge possible" +#~ msgstr "Cap unió és possible" + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "AVÍS: Teniu ID Baixa!" + +#~ msgid "Buddy address: " +#~ msgstr "Adreça de l'amic: " + +#~ msgid "This command requieres an argument. Valid arguments: a file hash.\n" +#~ msgstr "" +#~ "Aquesta ordre requereix un argument. Arguments vàlids: una clau (hash) de " +#~ "fitxer.\n" + +#~ msgid " %d" +#~ msgstr " %d" + +#~ msgid ".%d" +#~ msgstr ".%d" + +#~ msgid "Shows the process of a search." +#~ msgstr "Mostra el procés d'una cerca." + +#~ msgid "Shows the process of a search..\n" +#~ msgstr "Mostra el procés d'una cerca..\n" + +#~ msgid "Deprecated command, now 'Status'." +#~ msgstr "Ordre obsoleta, ara és 'Status'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Status' instead.\n" +#~ msgstr "" +#~ "Aquesta és una ordre obsoleta, i pot ser esborrada en un futur.\n" +#~ "Useu 'Status' en el seu lloc.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter'." +#~ msgstr "Ordre obsoleta, ara és 'Set IPFilter'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter' instead.\n" +#~ msgstr "" +#~ "Aquesta és una ordre obsoleta, i pot ser esborrada en un futur.\n" +#~ "Useu 'Set IPFilter' en el seu lloc.\n" + +#~ msgid "Deprecated command, now 'Get IPFilter Level'." +#~ msgstr "Ordre obsoleta, ara és 'Get IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Aquesta és una ordre obsoleta, i pot ser esborrada en un futur.\n" +#~ "Useu 'Get IPFilter Level' en el seu lloc.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter Level'." +#~ msgstr "Ordre obsoleta, ara és 'Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Aquesta és una ordre obsoleta, i pot ser esborrada en un futur.\n" +#~ "Useu 'Set IPFilter Level' en el seu lloc.\n" + +#~ msgid "Deprecated command, now 'Get/Set IPFilter Level'." +#~ msgstr "Ordre obsoleta, ara és 'Get/Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get/Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Aquesta és una ordre obsoleta, i pot ser esborrada en un futur.\n" +#~ "Useu 'Get/Set IPFilter Level' en el seu lloc.\n" + +#~ msgid "Deprecated command, now 'Show Servers'." +#~ msgstr "Ordre obsoleta, ara és 'Show Servers'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Show Servers' instead.\n" +#~ msgstr "" +#~ "Aquesta és una ordre obsoleta, i pot ser esborrada en el futur.\n" +#~ "Useu 'Show Servers' en el seu lloc.\n" + +#~ msgid "Deprecated command, now 'Get BwLimits'." +#~ msgstr "Ordre obsoleta, ara és 'Get BwLimits'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get BwLimits' instead.\n" +#~ msgstr "" +#~ "Aquesta és una ordre obsoleta, i pot ser esborrada en un futur.\n" +#~ "Useu 'Get BwLimits' en el seu lloc.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Up'." +#~ msgstr "Ordre obsoleta, ara és 'Set BwLimit Up'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Up' instead.\n" +#~ msgstr "" +#~ "Aquesta és una ordre obsoleta, i pot ser esborrada en un futur.\n" +#~ "Useu 'Set BwLimit Up' en el seu lloc.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Down'." +#~ msgstr "Ordre obsoleta, ara és 'Set BwLimit Down'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Down' instead.\n" +#~ msgstr "" +#~ "Aquesta és una ordre obsoleta, i pot ser esborrada en un futur.\n" +#~ "Useu 'Get BwLimit Down' en el seu lloc.\n" + +#~ msgid "Client Identification:" +#~ msgstr "Identificació del client:" + +#~ msgid "Use Secure Identification" +#~ msgstr "Usa la identificació segura" + +#~ msgid "" +#~ "Secure Identification uses a handshake approch to safely identify clients " +#~ "for use with the credit system." +#~ msgstr "" +#~ "La Identificació Segura fa una aproximació per tal d'identificar amb " +#~ "seguretat els clients que intervenen al sistema de crèdits." + +#~ msgid "Search warning." +#~ msgstr "Avís de cerca." diff --git a/po/cs.po b/po/cs.po new file mode 100644 index 00000000..f85e3c37 --- /dev/null +++ b/po/cs.po @@ -0,0 +1,7252 @@ +# Czech aMule 2.2.0 translation +# Copyright (C) 2007 Free Software Foundation, Inc. +# This file is distributed under the same license as the PACKAGE package. +# David Watzke , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: aMule 2.2.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2007-09-03 20:20+0100\n" +"Last-Translator: David Watzke \n" +"Language-Team: cs \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Czech\n" +"X-Poedit-Country: CZECH REPUBLIC\n" +"X-Poedit-SourceCharset: utf-8\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Musíte zadat (neprázdné) heslo." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Neplatné heslo, není MD5 hash!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Chyba při připojování" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "Připojování selhalo. Nulová odpověď." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "Přístup odepřen, protože: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "Přístup odepřen" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "Špatná odpověď od serveru. Spojení uzavřeno." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Připojení k aMule uspělo" + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Připojení uspělo." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Hashuji" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Dokončování" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Dokončeno" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Pozastaveno" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Poškozený" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Stahuji" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Čekám" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Vytváří se MD4 a AICH hash pro soubor: %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Vytváří se MD4 hash pro soubor: %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Vytváří se AICH hash pro soubor: %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "Převádí se staré AICH hashsety v '%s' do 64b v '%s'." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "VAROVÁNÍ: Název souboru '%s' je neplatný a byl změněn na '%s'." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "" +"VAROVÁNÍ: Soubor '%s' již existuje, nový soubor byl přejmenován na '%s'." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "VAROVÁNÍ: Nelze smazat původní '%s' po vytvoření zálohy" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "VAROVÁNÍ: Nelze smazat %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Nelze získat seznam sdílených souborů od uživatele '%s'" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Neznámý" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (falešná eMule verze %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (falešná eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (falešná eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (založeno na eMule v.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Přezdívka: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "Vyžádáno:" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Statistika souboru pro toto sezení: Přijato %d z %d požadavků, %s přeneseno\n" +msgstr[1] "" +"Statistika souboru pro toto sezení: Přijato %d z %d požadavků, %s přeneseno\n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Statistika souboru pro všechna sezení: Přijato %d z %d požadavků, %s " +"přeneseno\n" +msgstr[1] "" +"Statistika souboru pro všechna sezení: Přijato %d z %d požadavků, %s " +"přeneseno\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Vyžádán neznámý soubor" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "Klient %s s IP %s na portu %d používá %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Jméno" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Kamarádi" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Zobrazit &podrobnosti" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Přidat kamaráda" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Odstranit kamaráda" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Poslat &zprávu" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Zobrazit soubory" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Založit kamarádský slot" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Opravdu si přejete odstranit vybrané kamarády?" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Opravdu si přejete odstranit vybrané kamarády?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Zrušit" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"Nemůžete založit více než jeden kamarádský slot.\n" +" Byl přidělen pouze jeden slot." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Vícenásobný výběr" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Název souboru" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Velikost" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Typ" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Priorita" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "ID souboru" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Požadavky" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Přijaté požadavky" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Přenesená data" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Poměr sdílení" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Obdržené části" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Kompletní zdroje" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Cesta" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Sdílené soubory" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Velmi nízká" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Nízká" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normální" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Vysoká" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Velmi vysoká" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Vydání" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Auto" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Přidat komentář/hodnocení" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Upravit komentář/hodnocení" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Přejmenovat" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Zkopírovat magnet URI do schránky" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Zkopírovat eD2k do &schránky" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Zkopírovat ED2K odkaz do schránky (&zdroj)" + +#: src/SharedFilesCtrl.cpp:164 +#, fuzzy +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "Zkopírovat ED2K odkaz do schránky (&zdroj)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Zkopírovat ED2K odkaz do schránky (&hostname)" + +#: src/SharedFilesCtrl.cpp:166 +#, fuzzy +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "Zkopírovat ED2K odkaz do s&chránky (hostname)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Zkopírovat ED2K odkaz do schránky (AICH info)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Uložit odezvu do schránky" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "K vytvoření platného odkazu potřebujete HighID" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Varování" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Sdílené soubory (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[PartSoubor]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Zadejte nový název pro tento soubor:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Přejmenování souboru" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Obnovuji odesílání souboru %s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Zastavuji odesílání souboru %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: hledaný výraz je příliš krátký" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Chyba: Nelze naslouchat na TCP portu." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "Požadavek selhal kvůli následující chybě: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "Požadavek selhal kvůli neznámé chybě." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "Index nenalezen: " + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Webový server: spuštěn\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Sezení vypršelo - vyžaduji přihlášení\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Relace je v pořádku, přihlášen\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Relace je v pořádku, nepřihlášen\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Není otevřené žádné sezení - vyžaduji přihlášení\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Relace zahájena - vyžadování přihlášení\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Zpracování požadavku [původní]: " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Kontrola hesla\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Hash hesla je neplatný\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Heslo v pořádku\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Špatné heslo\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "Nezadal(a) jste heslo. Prázdné heslo není povoleno.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Bylo vyžádáno odhlášení\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Zpracování požadavku [přesměrovaný]:" + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Načte šablonu " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "HTTP port webserveru" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "UPnP port" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Použít gzip kompresi" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Přístupové heslo k webserveru" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Heslo pro hosta na webserveru" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Povolit přístup hostům" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Zakázat přístup hostům" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "Načítat/ukládat nastavení webserveru z/do vzdálené aMule" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "Cesta ke konfiguráku aMule. NEPOUŽÍVEJTE PŘÍMO!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "Zakázat PHP interpreter (zastaralé)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Překompilovat PHP stránky při každém požadavku" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "Webový server aMule" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Nedostupný" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Nikdy" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Stahuji..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Nastavení" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "Adresář obsahující soubor amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Procházet" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Zadejte cestu k adresáři, ve kterém je soubor amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Interval pro obnovování v sekundách" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Vygenerovat obrázek při každém obnovení" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "Zadejte adresář, do kterého si přejete vygenerovat obrázek statistik" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Pravidelně nahrávat obrázek statistik na FTP server" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "FTP url" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "FTP cesta" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Zadejte URL vašeho FTP serveru" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" +"Zadejte sem adresář, do kterého se na FTP budou ukládat obrázky statistik" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Uživatel" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Heslo" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Zadejte sem uživatelské jméno pro přihlášení k vašemu FTP serveru" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Zadejte sem heslo pro přihlášení k vašemu FTP serveru" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "Interval aktualizace FTP v minutách" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Zkontrolovat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Adresář obsahující váš soubor s podpisem" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Adresář pro generování obrázků statistik" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i dní %i hodin %i min %i sek" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, online statistiky aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Vítejte!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Maximální rychlost stahování během tohoto běhu wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "Maximální rychlost stahování během všech běhů wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Reset" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "Systém" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Přerušit automatické obnovování" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Uložit obrázek online statistik" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Vytisknout obrázek online statistik" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Nastavení" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "O wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Spustit automatické obnovování" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Automatické obnovování zastaveno" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Automatické obnovování spuštěno" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Uložit obrázek statistiky" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Nenalezen žádný obslužný program pro tento typ souboru." + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "Soubor nebyl uložen" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "Online statistiky aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Nastal problém při tisku.\n" +"Možná vaše tiskárna není správně nastavena." + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Tisknu" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, aMule online statistiky\n" +"(c) 2004 ThePolish \n" +"\n" +"Založený na CAS od Pedro de Oliveira \n" +"\n" +"Distribuovaný pod GPL licencí" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "aMule neběží..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule běží" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule běží, ale je odpojená" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule se připojuje..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Stav aMule je neznámý..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " běží už " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " je zastavená!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " je nepřipojená!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " se připojuje..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " je asi vypnutá, zkontrolujte to!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " je připojena k " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "ok" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "za firewallem" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "vypnuto" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr "běží" + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +#, fuzzy +msgid " with " +msgstr "] s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Celkem staženo:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Odesláno:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Stahování: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s, odesílání: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Sdílení:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " soubor(ů), klientů ve frontě: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Čas:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " na " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Průměrná zátěž systému (1-5-15 minut): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Běh systému: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uD %02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "HighID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "LowID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Nepřipojen" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "Přerušeno!" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Nelze otevřít %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "Soubor %s je pro Donkey příliš velký: maximum jsou 4 GB." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Vstupní parametry" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Soubor k hashování" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Přidat volitelné URL pro tento soubor" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Zadejte soubor, kterému chcete vygenerovat Ed2k odkaz" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Přidat" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Odebrat" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Vyčistit" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Vytvořit odkaz s hashi částí" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Pomůže rozšířit nové a raritní soubory rychleji, za cenu zvýšené velikosti " +"odkazu" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "MD4 hash souboru" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "ED2K hash souboru" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "ED2K odkaz" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Spustit" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Uložit" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Zkopírovat do schránky" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Ukončit" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Otevřít soubor pro výpočet jeho ed2k odkazu" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Zkopírovat vygenerovaný ed2k odkaz do schránky" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Uložit vygenerovaný ed2k odkaz do souboru" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "O aLinkCreatoru" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "Zatím není co zkopírovat!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Nelze otevřít" + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Zadejte prosím (neprázdný) název souboru" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "Zatím není co ukládat!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, vytvářeč ED2K odkazů\n" +"\n" +"(c) 2004 ThePolish\n" +"Obrázky z http://www.everaldo.com/, http://www.icomania.com/\n" +"a http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distribuován pod GPL" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Hashování..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Hotovo za %.2f s" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "Tato URL je již přidána!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Zadejte prosím neprázdnou URL" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "Zpracovávám soubor č. %u: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "Vyžádal jste si částečné hashe (používá se pouze pro soubory > 9,5 MB)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Prosím čekejte..." + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> Neexistující soubor !\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, vytvářeč ED2K odkazů" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Auto [Ní]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Auto [No]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Auto [Vy]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Připojuji" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Vyžaduji" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Připojuji se přes server" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Plná fronta" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "Ve frontě" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Přenáším" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Získávám hashset" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Bez potřebných částí" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Nelze spojit LowID s LowID" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Příliš mnoho připojení" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Připojuji se přes Kad" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Příliš Kad připojení" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Zabanován" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Chyba připojení" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Vzdálená fronta je plná" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "Starý MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "Nový MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "eMule kompatibilní" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Lokální server" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Vzdálený server" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Výměna zdrojů" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Pasivní" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Odkaz" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Výchozí pro systém" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Arabský" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Baskičtina" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Bulharský" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Katalánština" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Čínština (zjednodušená)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Čínština (tradiční)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Chorvatština" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Dánština" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Nizozemština" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Angličtina (britská)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Estonština" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Finština" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Francouzština" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Galicijština" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Němčina" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Maďarština" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Italština" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Italština (švýcarská)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Korejština" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Polština" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portugalština" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Portugalština (brazilská)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Ruština" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Slovinština" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Španělština" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Turečtina" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Nemohu rozpoznat vybraný prohlížeč!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "TCP port nemůže být vyšší než 65532, protože UDP port je TCP+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Bude použit výchozí port (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Název serveru" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Adresa" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Port" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Popis" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Uživatelé" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Soubory" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Selhal" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Pevný" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Verze" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Jste připojen(a) na server, který se pokoušíte smazat. Nejprve se prosím " +"odpojte. Server NEbyl smazán." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Info" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(neznámý název)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Opravdu si přejete smazat stálý server %s?" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Ano" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Ne" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Nemohu otevřít '%s'" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Servery (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Server" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Připojit k serveru" + +#: src/ServerListCtrl.cpp:428 +#, fuzzy +msgid "Mark server as static" +msgstr "Označit server(y) jako stálé" + +#: src/ServerListCtrl.cpp:429 +#, fuzzy +msgid "Mark server as non-static" +msgstr "Označit server(y) jako nestálé" + +#: src/ServerListCtrl.cpp:431 +#, fuzzy +msgid "Mark servers as static" +msgstr "Označit server(y) jako stálé" + +#: src/ServerListCtrl.cpp:432 +#, fuzzy +msgid "Mark servers as non-static" +msgstr "Označit server(y) jako nestálé" + +#: src/ServerListCtrl.cpp:438 +#, fuzzy +msgid "Remove server" +msgstr "Odstranit server(y)" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "Odstranit server(y)" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Odstranit všechny servery" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Zkopírovat ED2k odkaz do schránky" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "Zkopírovat ED2k odkaz do schránky" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Znovu připojit k serveru" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Opravdu si přejete smazat všechny servery?" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Opravdu si přejete smazat vybrané servery?" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Opravdu si přejete smazat vybrané servery?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Zakázaný [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "Toto je aMule %s založená na eMule." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "Běží na %s" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" +"Navštivte http://www.amule.org/ pro kontrolu, jestli není dostupná nová " +"verze." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Kritická chyba: Selhalo vytváření časovače" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "Vzdálené ovládání aMule" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Snapshot:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr "" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr "" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Zpráva" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "Připojuji" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "Odpojeno" + +#: src/amuleDlg.cpp:676 +#, fuzzy +msgid "Kad: Firewalled" +msgstr "Za firewallem" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "Připojen" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "Připojuji" + +#: src/amuleDlg.cpp:689 +#, fuzzy +msgid "Kad: Off" +msgstr " Kad: " + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "Zastaví nynější pokusy o připojení" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Odpojit" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "Odpojit se od sítě." + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Připojit" + +#: src/amuleDlg.cpp:726 +#, fuzzy +msgid "Connect to the currently enabled networks" +msgstr "Připojit se k síti." + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Od: %.1f(%.1f) | St: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Od: %.1f | St: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | připojen)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | odpojen)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Opravdu si přejete ukončit aMule?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Potvrzení ukončení" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Nelze zjistit příkaz pro spuštění prohlížeče." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "Adresář se skiny '%s' neexistuje" + +#: src/amuleDlg.cpp:1178 +#, fuzzy, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "Nemohu otevřít soubor se skinem %s pro čtení" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Sítě" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Okno sítí" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Vyhledávání" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Vyhledávací okno" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Přenosy" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Okno s přenosy" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Okno se sdílenými soubory" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Zprávy" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Okno zpráv" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Statistiky" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Okno se statistikami" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Okno s nastavením" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Import" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "Nástroj pro import částečných souborů" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "O programu" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "O programu/Nápověda" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Hlavní" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Připojení" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Proxy" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Filtr zpráv" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Vzdálené ovládání" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Online podpis" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Adresáře" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Bezpečnost" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "Vychytávky GUI" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Vychytávky jádra" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Události" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Debugování" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Uživatelem definované" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"Restartujte aMule, aby se projevily následující změny:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- TCP port změněn.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- UDP port změněn.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"Váš seznam serverů pro automatickou obnovu je prázdný.\n" +"Aktualizace seznamu serverů po spuštění bude zakázána." + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- Jazyk byl změněn.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- Dočasný adresář byl změněn.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Up: 0.0 | Down: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"Sítě ED2K i Kademlia jsou zakázány.\n" +"Nebudete se moci připojit, dokud nepovolíte alespoň jednu z nich." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"Kad se nespustí, když máte zakázaný UDP port.\n" +"Povolte UDP port, nebo zakažte připojování na Kad." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"Nyní MUSÍTE restartovat aMule.\n" +"Pokud to neuděláte, tak si pak nestěžujte, když se přihodí něco špatného.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "VAROVÁNÍ" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "Dočasné soubory" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Příchozí soubory" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Online podpisy" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Zvolte adresář pro %s" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Zvolit wav" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "WAV soubor (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Zvolit přehrávač videa" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Výběr prohlížeče" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Upravit seznam serverů" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Sem přidejte URL pro stažení server.met souborů.\n" +"Pouze jedno URL na každý řádek." + +#: src/PrefsUnifiedDlg.cpp:980 +#, fuzzy, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Prodleva aktualizace: %d sekund" +msgstr[1] "Prodleva aktualizace: %d sekund" + +#: src/PrefsUnifiedDlg.cpp:987 +#, fuzzy, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Čas pro průměrný graf: %d minut" +msgstr[1] "Čas pro průměrný graf: %d minut" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:999 +#, fuzzy, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Prodleva aktualizace: %d sekund" +msgstr[1] "Prodleva aktualizace: %d sekund" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, fuzzy, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Velikost zásobníku pro soubory: %d bajtů" +msgstr[1] "Velikost zásobníku pro soubory: %d bajtů" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, fuzzy, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Velikost fronty pro odesílání: %d klientů" +msgstr[1] "Velikost fronty pro odesílání: %d klientů" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, fuzzy, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Interval pro obnovení připojení k serveru: %d minut" +msgstr[1] "Interval pro obnovení připojení k serveru: %d minut" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Interval pro obnovení připojení k serveru: Zakázáno" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Spustí příkaz při událost `%s'" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Povolit jaderné příkazy" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Příkaz jádra:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Povolit GUI příkazy" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "Příkaz GUI:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "Následující proměnné budou nahrazeny:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Neautorizovaný přístup. Připojení uzavřeno." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Externí připojení uzavřeno." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "Externí připojení jsou zakázány kvůli prázdnému heslu!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "Externí připojení jsou zakázány v konfiguračním souboru" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Nové externí připojení přijato" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "Chyba: nemohu přijmout nové externí připojení" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "Externí připojení odmítnuto kvůli prázdnému heslu v nastavení!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "Připojuji klienta: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Neznámá verze" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "Autentizace selhala." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Neplatná verze protokolu." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "" + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Neplatný požadavek, nejdřív se autentizujte." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Přistup povolen." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:567 +#, fuzzy, c-format +msgid "FileHash not found: %s" +msgstr "FileHash nenalezen: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Server nepřidán" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "server nenalezen: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "ED2K je zakázaný v nastavení." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "" + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad je zakázaný v nastavení." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Žádné údaje pro graf." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "Vás klient není nakonfigurován pro tuto úroveň detailů." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Již se ukončuji." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "" + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Neplatný odkaz, nebo je již v seznamu." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "Soubor nenalezen." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Neplatný název souboru." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Nelze přejmenovat soubor." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Již jste připojen k ED2K." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Připojuji se k ED2K..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Již jste připojen k síti Kad." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Připojuji se k síti Kad..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Všechny sítě jsou zakázány." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Odpojen od ED2K." + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Odpojen od Kademlia." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "" + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "" + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "" + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "Stav ED2K:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Připojen" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Port" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Stav Kademlia:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Běží" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Stav:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Odpojeno" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Stav připojení:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Za firewallem" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "Budiž" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Stav firewallu: " + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Připojen ke kamarádovi" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "Žádný kamarád" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "Neběží" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Uptime: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Přenos" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Odesílání" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Odeslaná data (sezení (celkem)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Celková režie (pakety): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Režie serveru (pakety): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Režie Kadu (pakety): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Aktivní odesílání: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Čekající odesílání: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Stahování" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Stažená data (sezení (celkem)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Nalezené zdroje: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Aktivní stahování (části): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "UL:DL poměr sezení (celkem): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Průměrná rychlost stahování (sezení): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Průměrná rychlost odesílání (sezení): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Maximální rychl. stahování (sezení): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Maximální rychl. odesílání (sezení): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Znovupřipojení: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Doba od prvního přenosu: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Připojen k serveru od: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Aktivních připojení (odhad): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Limit připojení dosažen: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Průměrný počet připojení (odhad): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Klienti" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Filtrování" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Celkem: %i Známých: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Servery" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Fungující servery: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Nefungující servery: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Celkem: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Smazané servery: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Filtrované servery: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Uživatelů na fungujících serverech: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "Souborů na fungujících serverech: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Celkem uživatelů: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "Celkem souborů: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Zaplnění serveru: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Počet sdílených souborů: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Celková velikost sdílených souborů: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Průměrná velikost souborů: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "LowID: %u (%.2f%% celkem %.2f%% známých)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Operační systém" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "Neobdrženo" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Vyjmout" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Kopírovat" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Vložit" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Označit vše" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "Nemohu vyhledávat přes Kad, když není spuštěn" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "Nemohu vyhledávat přes ED2K, když neběží" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Neočekávaná chyba během vyhledávání v síti Kad: " + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "Zpráva od '%s' filtrována (IP:%s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "Nová zpráva od '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "Uživatel %s (%u) si vyžádal váš seznam sdílených souborů -> přijato" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "Uživatel %s (%u) si vyžádal váš seznam sdílených souborů -> odmítnuto" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "Uživatel %s (%u) si vyžádal váš seznam sdílených adresářů -> přijato" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "Uživatel %s (%u) si vyžádal váš seznam sdílených adresářů -> odmítnuto" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"Uživatel %s (%u) si vyžádal váš seznam sdílených souborů v adresáři %s -> " +"přijato" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"Uživatel %s (%u) si vyžádal váš seznam sdílených souborů v adresáři %s -> " +"zakázáno" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "Uživatel %s (%u) sdílí adresář %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "" + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Uzly (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "Neplatná IP pro bootstrap" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Neplatný port pro bootstrap" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Prosím vyplňte všechna potřebná pole" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Opravdu chcete stáhnout nový soubor nodes.dat?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "Odstraní se tak současné uzly a restartuje se připojení ke Kademlia." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Pokračovat?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Chyba: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Varování: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Přidat kamaráda" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Musíte zadat platnou IP adresu a port!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Informace" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Zdroje" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Soubor" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Stahování" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Kategorie" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Hlavní" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Připojit se ke vzdálené amuli" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Připojení selhalo" + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Chyba" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Uživ.: E: %s K: %s | Soub. E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Vše" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Celkem uživ.: %s | Celkem soub.: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Přeneseno" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Dokončeno" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Rychlost" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Průběh" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Stav" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Zbývající čas" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Naposledy spatřen kompletní" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Opravdu si přejete smazat vybrané soubory?" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Opravdu si přejete smazat vybrané soubory?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Poslat zprávu uživateli" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Zpráva k odeslání:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Zastavit" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Pozastavit" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Obnovit" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "V&yčistit dokončené" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Přesunout A4AF zdroje k tomuto souboru" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Přesunout A4AF zdroje k tomuto souboru (automaticky)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Přesunout A4AF zdroje k jinému souboru" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Rozšířené nastavení" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Náhled" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Zobrazit &podrobnosti souboru" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Zobrazit všechny komentáře" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Zkopírovat magnet URI do schránky" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "zrušit přiřazení" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Zařadit do kategorie" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "&Otevřít tento soubor" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Odstranit z přátel" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Přidat do přátel" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Poslat zprávu" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "QR: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Vyžádán jiný soubor" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Stahování (%i)" + +#: src/DownloadListCtrl.cpp:2222 +#, fuzzy +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"Zvolte si prosím v nastavení preferovaný video přehrávač.\n" +"Mezitím se aMule pokusí použít mplayer a vždy zobrazí toto varování." + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Náhled souboru" + +#: src/DownloadListCtrl.cpp:2260 +#, fuzzy, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "CHYBA: Nezdařilo se spustit externí přehrávač!" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "CHYBA: Částečný soubor nelze otevřít)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "CHYBA: Částečný soubor nelze vytvořit)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "Zkouší se načíst záloha .met souboru z %s" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "Chyba: Nelze otevřít soubor part.met: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "Chyba: Soubor part.met má nulovou velikost: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "Chyba: Neplatná verze souboru part.met: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "Chyba: %s (%s) je porušený (špatný \"tagcount\"), nelze načíst soubor." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "Zkouším obnovit info o souboru..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "Obnovuje se soubor bez názvu - bude obnoven s názvem RecoveredFile.dat" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" +"Všechny dostupné informace o souboru obnoveny :D - Zkouším je použít..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Nelze obnovit info o souboru :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Nelze otevřít %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "Varování: %s může být porušen (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "CHYBA během ukládání částečného souboru: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "'%s' má nulovou velikost - používám soubor %s." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "Selhalo ukládání souboru part.met.seeds pro %s" + +#: src/PartFile.cpp:1019 +#, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "Dokončeno přehashování %s" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "Neočekávaná chyba souboru při dokončování %s. Pozastaveno" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Dokončené stahování: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "Mazání souboru: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "VAROVÁNÍ: Nedostatek volného místa na disku! Pozastavuji soubor: %s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "Stažená část %i souboru '%s' je poškozená." + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Zastaveno" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "Varování: soubor known.met nelze otevřít." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "Varování: Soubor known.met je porušen, obsahuje neplatnou hlavičku." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "I/O chyba při čtení souboru known.met: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "Došlo k chybě při ukládání souboru known.met: %s" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "Nalezeno %i známých sdílených souborů" +msgstr[1] "Nalezeno %i známých sdílených souborů" + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "Nalezeno %i známých a %i neznámých sdílených souborů" +msgstr[1] "Nalezeno %i známých a %i neznámých sdílených souborů" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "CHYBA! Pokus o sdílení %s" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Komentáře k souboru" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Hodnocení" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Komentář" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Žádné komentáře" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%s komentář(ů)" +msgstr[1] "%s komentář(ů)" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"Selhalo připojení ke všem vybraným serverům. Zkouším to znovu bez obfuskace." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "Selhalo připojení ke všem vybraným serverům. Zkouším znovu." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "Síť ED2K je zakázána v nastavení, nepřipojuji se." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "V seznamu nejsou žádné platné servery" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Připojen k %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Připojení vytvořeno k %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"Kritická chyba během pokusu o připojení. Možná je vypnuté/nefunkční " +"připojení k Internetu" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Ztracené připojení k %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) se zdá být mrtvý." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) se zdá být plný." + +#: src/ServerConnect.cpp:391 +#, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Připojení ztraceno." + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "Připojování k %s (%s:%i) selhalo." + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "Pokusu o připojení k %s (%s:%i) vypršel čas." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Nenalezeny žádné částečné soubory" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "Nalezeno %u častečných souborů" +msgstr[1] "Nalezeno %u častečných souborů" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Stahování %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Soubor '%s' se již pokoušíte stáhnout" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Soubor '%s' již máte" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Soubor %s se již pokoušíte stáhnout" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Neplatný ed2k odkaz! Chyba: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "Spustí a ukončí se." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Neplatný formát IP adresy. Použijte xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" + +#: src/TextClient.cpp:343 +#, fuzzy +msgid "Processing by hash: " +msgstr "Zpracovávám soubor č. %u: %s" + +#: src/TextClient.cpp:358 +#, fuzzy +msgid "Processing by filename: " +msgstr "Zpracovávám soubor č. %u: %s" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Neplatné číslo\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "Operace byla úspěšná." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "vypnuto" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "zapnuto" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Omezení šířky pásma: Od: %u kB/s, St: %u kB/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Připojen k %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "s LowID" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "s HighID" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Připojování" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Nepřipojen" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Stahování:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Odesílání:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Klientů ve frontě:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Celkem zdrojů:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Počet výsledků vyhledávání: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "TODO - zobrazit průběh vyhledávání" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Obdržena neznámá odpověď od serveru, kód operace = %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "" + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Zobrazit celý strom statistik." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "Ukončit aMule." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "" + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "" + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "" + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Připojit se k síti." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Připojit se pouze k ED2K." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Připojit se pouze ke Kademlia." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Odpojit se od sítě." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Odpojit se pouze od ED2K." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Odpojit se pouze od Kademlia." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Přidá ed2k nebo magnet URI do jádra." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "" + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "Povolit klientům i serverům filtrování IP." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "Zakázat klientům i serverům filtrování IP." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "Povolit/zakázat klientům filtrování IP." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "Povolit klientům filtrování IP." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "Zakázat klientům filtrování IP." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "Povolit/zakázat klientům filtrování IP." + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "Povolit serverům filtrování IP." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "Zakázat serverům filtrování IP." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "Zvolte úroveň filtrování IP." + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Nastavit limity šířky pásma." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "" + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "" + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "" + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "" + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "" + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Provede vyhledávání." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Spustí globální vyhledávání" + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Spustí lokální vyhledávání" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Spustí vyhledávání v síti Kad" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Zobrazí výsledky posledního vyhledávání." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Pozastavit stahování." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Pokračovat ve stahování." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Zrušit stahování." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Nastaví prioritu stahování." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "" +"Nastavte prioritu stahovaného souboru na nízkou, normální, vysokou, nebo " +"automatickou.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "" + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "" + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "" + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "" + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "" + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Zobrazit frontu odesílání." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Zobrazit frontu stahování." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Zobrazit log." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Zobrazit seznam serverů." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Vyčistit log." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() vrátila NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "Chyba: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "Varování: %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Nové ID klienta je %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "" +"\tPravděpodobně je to způsobeno tím, že jste za firewallem či routerem." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tPro více informací prosím běžte na http://wiki.amule.org/" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "Získáno %d nových serverů" +msgstr[1] "Získáno %d nových serverů" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Uložení seznamu serverů dokončeno." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "Server odmítl poslední příkaz" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Chybný paket obdržen od serveru: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "Došlo k neznámé chybě při zpracovávání paketu od serveru: %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "IP serveru %s (%s) je filtrována. Nepřipojuji se." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "používám zatemňování protokolu (obfuscation)." + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "Připojování k %s (%s - %s:%i) %s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "" + +#: src/IP2Country.cpp:73 +#, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "" +msgstr[1] "" + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "Opravdu si přejete zrušit a smazat všechny soubory v této kategorii?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Potvrzení je nutné" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Vše ostatní" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Nekompletní" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Aktivní" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Video" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Audio" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Archív" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "Obrazy CD" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Obrázky" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Text" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Přidat kategorii" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Upravit kategorii" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Odstranit kategorii" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "Importování %s: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "Čtení dočasného adresáře" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "Vytvářím cílový soubor" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "Přidávám do stahování a ukládám nový částečný soubor" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Zjišťuji stav..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "Probíhá" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Error: Došlo místo na disku" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Chyba: part.met soubor nenalezen" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Chyba: I/O chyba!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Chyba: Selhání!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "Ve frontě" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Již stahuji" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Neznámý nebo špatný formát dočasného souboru." + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Název souboru" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Stav" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Hash souboru" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Import částečných souborů" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"Prosím zvolte adresář pro vyhledávání dočasných souborů! (budou zahrnuty i " +"podadresáře)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "Přejete si smazat zdrojové soubory úspěšný importovaných stahování?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Odstranit zdroje?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Čekání..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (disk: %s)" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "bytů" +msgstr[1] "bytů" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "bytů/sek." +msgstr[1] "bytů/sek." + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "sek." + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "min." + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "hod." + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "dní" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Videa" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Archívy" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Texty" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programy" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Cokoliv" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Nehodnocené" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Neplatný / porušený / podvod" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Špatný" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "V pořádku" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Dobrý" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Výborný" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "vše" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "vše ostatní" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "Načítám IP filtry 'ipfilter.dat' a 'ipfilter_static.dat'." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "Nemohu načíst ipfilter.dat (%s), neznámý formát." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "Nemohu načíst ipfilter.dat (%s), soubor nelze otevřít." + +#: src/IPFilter.cpp:330 +#, fuzzy, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "Načteno %u IP rozsahů z '%s'. %u vadných řádků bylo vyřazeno." +msgstr[1] "Načteno %u IP rozsahů z '%s'. %u vadných řádků bylo vyřazeno." + +#: src/IPFilter.cpp:332 +#, fuzzy, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "Načteno %u IP rozsahů z '%s'. %u vadných řádků bylo vyřazeno." +msgstr[1] "Načteno %u IP rozsahů z '%s'. %u vadných řádků bylo vyřazeno." + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Aktivní připojení (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Podrobnosti souboru" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% dokončeno" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "ED2K odkaz: " + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Přidat" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Načítání ..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "" + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Uživatelů: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Nepřipojen ..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "" + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Vyhledávání" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Název:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Lokální" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Globální" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "FileHash" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Rozšířené parametry" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Filtrování" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Typ souboru" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Přípona" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Min. velikost" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "bajtů" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Max. velikost" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Dostupnost" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Filtr:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Filtrování výsledků" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Skrýt známé soubory" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Více" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "Vyhledává více výsledků na ED2K. Zatím nepodporováno na Kadu." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Zastavit" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Vyčistit pole" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Výsledky" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Vyčistí dokončená stahování" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Klienti ve frontě" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Odeslat" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Odešle zadanou zprávu." + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Zavřít" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Zavře tento chat." + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Celá název:" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "N/A" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "Soubor .met:" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Hash:" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Velikost:" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Naposledy spatřen kompletní:" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Nalezené zdroje:" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Dostupný:" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Doba stahování:" + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Přeneseno:" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Dokončeno:" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Chytré zacházení s poškozenými částmi" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Ztraceno poškozením:" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Získáno kompresí:" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "Balíčků zachránených od I.C.H.:" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Názvy souborů" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Převzít" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Vyčistit" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Použít" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Budiž" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"U filmu můžete sdělit jeho délku, příběh, jazyk ...\n" +"a pokud je to podfuk (fake), můžete o tom informovat ostatní." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Kvalita souboru" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Žádné komentáře" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Obnovit" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Stahuji, prosím čekejte ..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Neznámá velikost" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Nezbytné informace" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "IP adresa :" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Port :" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Dodatečné informace" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Uživatelské jméno:" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Znovu načíst vaše sdílené soubory" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Současné sezení" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Celkem" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Aktivní odesílání:" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Rychlost stahování" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Průměr sezení" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Rychlost odesílání" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Připojení" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Aktivní stahování" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Aktivní připojení (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Aktivní odesílání" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Strom statistik" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Jméno:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Software klienta:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Verze klienta:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "IP adresa:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "ID uživ.:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "IP serveru:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Název serveru:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "Přenosy ke klientovi" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Průmerná rychlost odesílání:" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Průměrná rychlost stahování:" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Odesláno (sezení):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Staženo (sezení):" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Odesláno (celkem):" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Staženo (celkem):" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Skóre" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "DL/UP poměr:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Hodnocení (celkové):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Hlavní nastavení" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Přezdívka" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org/ - Linuxová Mula" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "Toto jméno uvidí ostatní uživatelé, kteří se k vám připojí." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Jazyk" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "Jazyk ovládání programu" + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Různá nastavení" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Kontrola nové verze po spuštění" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "aMule po spuštění zkontroluje, zda nevyšla nová verze" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Minimalizace po spuštění" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "aMule se po spuštění minimalizuje" + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Ptát se na ukončení programu" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "aMule se před ukončením zeptá." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Povolit ikonu v trayi" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "Povolí/zakáže ikonu v systray." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "Minimalizovat do tray ikony" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "Povolením tohoto se aMule minimalizuje do traye (místo pruhu úloh)." + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Prodleva mezi zobrazením nástrojových tipů" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "Prodleva před zobrazením tooltipů." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Výběr prohlížeče" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Select your browser here" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Vlastní prohlížeč:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Otevřít pokud možno v novém tabu" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" +"Otevřít webovou stránku v novém tabu místo otvírání nového okna, pokud je to " +"možné" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Limity šířky pásma" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Odesílání" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Přidělování slotů" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Kapacita linky" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Standardní TCP port klienta:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "Toto je standardní port ED2K a nelze jej zakázat." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Rozšířující UDP port klienta:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "Tento UDP port je použit pro rozšiřující ED2K požadavky a pro síť Kad" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "zakázat" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "UDP port pro rozšířené požadavky serveru (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Maximum zdrojů na soubor" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Tvrdý limit" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Limity připojení" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Maximum připojení" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Univerzální Plug and Play" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "Povolit UPnP" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "UPnP TCP port:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Automatické připojení po spuštění" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Po odpojení znovu připojit" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Zobrazit šířku pásma režie" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Nastavení serverů" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Odstranit mrtvý server po" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "pokusech" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Po spuštění aktualizovat seznam serverů" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Seznam" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Použít systém priorit" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Použít po připojení chytrou kontrolu LowID" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Bezpečné připojení" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "I.C.H. aktivní" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Přidávat soubory ke stažení do fronty pozastavené" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Přidávat soubory ke stažení do fronty s \"auto\" prioritou" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Pokusit se nejprve stáhnout první a poslední části" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Přidat nově sdílené soubory s \"auto\" prioritou" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Pokusit se odesílat celé části všem" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "Ze stejné kategorie" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Místo na disku" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Zkontrolovat místo na disku" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "Zvolte, pokud chcete, aby aMule zkontrolovala místo na disku" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Minimální místo na disku" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Zadejte minimum místa na disku." + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Příchozí adresář:" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Dočasný adresář:" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Sdílené adresáře" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Sdílet skryté soubory" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Video přehrávač" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Vytvořit zálohu pro náhled" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Grafy" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Prodleva aktualizace: 5 sekund" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Zvolte barvy statistik" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Na pozadí" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Mřížka" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Aktivní připojení" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Vyberte" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Počet verzí klientů k zobrazení (0=neomezeně)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Oznámení" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Vyskakovací zpráva" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Použít zvuk" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Vyskočit při:" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Nová záznam v logu" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Začne nový chat" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Přijde do chatu nová zpráva" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Stahování bylo přidáno nebo dokončeno" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Byla detekována nová verze aMule" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Oznámit na e-mail" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Odeslat e-mail, když je přenos dokončen." + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "SMTP server:" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "E-mailová adresa:" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! VAROVÁNÍ !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Neměňte tato nastavení, pokud nevíte\n" +"co děláte, protože jinak můžete snadno\n" +"pokazit různé věci.\n" +"\n" +"aMule poběží v pohodě bez změny\n" +"nastavení na tomto tabu." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Pokročilá nastavení" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Max. nových připojení za 5 sek." + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Velikost zásobníku pro soubory: 240000 bytů" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Velikost fronty odesílání: 5000 klientů" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "Vychytávky GUI" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Průběh stahování souborů ve frontě" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Zobrazit procenta" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Zobrazit ukazatel průběhu" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Styl ukazatele průběhu" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Plochý" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Kulatý" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Podpora skinů" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Povolit skiny" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Skin:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- nejsou dostupné žádné skiny -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Řazení sloupců" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "Automaticky řadit sloupce ve frontě stahování (žere CPU)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "aMule automaticky seřadí kolonky ve vaší frontě stahování" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Různé vychytávky GUI" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Zobrazit rychlý obsluhovač ED2K odkazů" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Zobrazit rozšířené informace na tabech kategorií" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Zobrazit rychlosti přenosu v titulku okna" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Vertikální umístění nástrojové lišty" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Zobrazit číslo částečného souboru před názvem" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Ovládání na dálku" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Parametry webserveru" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Spustit amuleweb po spuštění" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Port webserveru" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "UPnP TCP port webserveru" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Obnovování stránky (v sek.)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Povoliz Gzip kompresi" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Povolit uživatele s omezenými právy" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Heslo pro plná práva" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Heslo pro omezená práva" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Šablona webu" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Nastavení externího připojení" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Přijímat externí připojení" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"IP naslouchajícího rozhraní\n" +"(prázdné = jakékoliv)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "TCP port" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "" + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Zahodí všechny změny v nastavení." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Titul:" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Komentář:" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Příchozí adresář:" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Změnit prioritu pro nově přiřazené soubory:" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Neměnit" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Barva pro tuto kategorii:" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Zobrazit MOTD serveru po připojení ..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Info o severu" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Klikněte na toto tlačítko pro vynulování logu." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "Log aMule" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "" + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Seznam serverů" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Ruční přidání serveru : Název" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Zadejte název serveru" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Zadejte IP serveru ve tvaru x.x.x.x." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Zadejte port serveru." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "" + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "ED2K Info" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Kad Info" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"Zdá se, že vaše locale není správně nainstalovaná\n" +"Musíte si ji vygenerovat, pro použití tohoto jazyka.\n" +"Na linuxových systémech hledejte soubor /etc/locale.gen a balíček 'locales'\n" +"Hodně štěstí!(Poznámka: Přesto se program pokusí nastavit ji)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Toto již nezobrazovat" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "Aktualizuje seznam uzlů z dané URL..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Uzly (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Statistiky uzlů" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Nový uzel" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Port:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Bootstrap od \n" +"známých klientů" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Odpojit Kad" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Volby souboru" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Všichni" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Nikdo" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Kdo může vidět sdílené soubory:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "" + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "IP filtrování" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Filtrovat klienty" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Filtrovat servery" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Obnovit seznam" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Obnovit" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Automaticky aktualizovat IP filtr po spuštění" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Úroveň filtrování:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Vždy filtrovat LAN IP" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Paranoidní nakládání s nesouhlasícími IP" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Povolit/zakázat" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Povolit online podpis" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Prodleva aktualizace (sek.):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "" + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Adresář s online podpisy:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Zakázat/povolit" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Nastavení filtrování:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Filtrovat všechny zprávy" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Filtrovat zprávy, které nejsou od přátel" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Filtrovat zprávy od neznámých klientů" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Filtrovat zprávy obsahující (použijte ',' jako oddělovač):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"zadejte slova, která by měla amule filtrovat a blokovat zprávy obsahující je" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Komentáře" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Povolit proxy" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Povolí/zakáže proxy" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Typ proxy:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "Typ proxy, ke které se připojujete" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Hostitel proxy:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "Název hostitele proxy" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Port proxy:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "Port proxy" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Autentizace" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Povolit autentizaci" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Povolí/zakáže autentizaci (uživatelské jméno a heslo)" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "Uživatelské jméno, které se použije pro přihlášení k proxy" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Heslo:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "Heslo, které se použije pro přihlášení k proxy" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Připojit se k:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Připojit k vzdálené aMuli" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Uživatelské jméno" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Zapamatovat si toto nastavení" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Odstranit vybrané" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Typy událostí" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Připojit k nějakému serveru a/nebo Kadu" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Nová kategorie" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Zvolte adresář pro stažené soubory" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Musíte zadat název kategorie!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Musíte zadat cestu pro kategorii!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"Nemohu vytvořit příchozí adresář pro kategorii. Zadejte prosím platnou cestu!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "" + +#: src/ExternalConnector.cpp:188 +#, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "" + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Zobrazit nápovědu." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Chyba syntaxe!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Chyba při zpracování příkazu - to by se nikdy nemělo stát! Prosím, nahlašte " +"chybu\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Tento příkaz by neměl mít parametry." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Tento příkaz musí mít parametr." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Neplatný argument." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Toto je nekompletní příkaz." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Pro nápovědu spusťte '%s'.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "Tohle je %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "Tohle je %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Vytvářím klienta...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "Připojení selhalo. Nemohu se připojit k zadanému hostiteli\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"OK, opouštím %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Zobrazí tuto nápovědu." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "Hostitel, kde běží aMule. (výchozí: localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "Port aMule pro externí připojení. (výchozí: 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Heslo pro externí připojení." + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Načíst konfiguraci ze souboru." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "Nevypisovat nic na stdout." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "" + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "" + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "" + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "" + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Vypíše verzi programu." + +#: src/ClientCreditsList.cpp:168 +#, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "" +msgstr[1] "" + +#: src/ClientCreditsList.cpp:171 +#, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] "" +msgstr[1] "" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "" + +#: src/amuled.cpp:525 +#, fuzzy +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"CHYBA: démon aMule nelze použít, když jsou zakázaná externí připojení. Pro " +"jejich povolení použijte buď normální aMule, nebo klíči " +"\"AcceptExternalConnections\" v souboru ~/.aMule/amule.conf nastavte hodnotu " +"1" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "CHYBA: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Odbanovat" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Zobrazit odesílání" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Zobrazit frontu" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Zobrazit klienty" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Software klienta" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Čekání" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Čas odesílání" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Odesláno/Staženo" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Vzdálený stav" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "QR: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Priorita souboru" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Skóre" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Naposledy spatřen" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Stav odesílání" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Odesláno" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Průběh stahování" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Staženo" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Userhash" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Podrobnosti klienta" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Nepodporovaný" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Nekompletní" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Zloduch" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Ověřeno - OK" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Nedostupný" + +#: src/ClientDetailDialog.cpp:190 +#, fuzzy, c-format +msgid "%u (QR: %u)" +msgstr "QR: %u" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" +"Min. velikost musí být menší než max. velikost. Ignoruji max. velikost." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Neomezený" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "Tray menu aMule" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Rychlostní omezení:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "UL: žádný" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "UL: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "DL: žádný" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "DL: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Rychlost stahování: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Rychlost odesílání: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Informace o klientu" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Přezdívka: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "ID klienta: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Název serveru: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "IP serveru: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "TCP port: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "TCP port: Nepřipraven" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "UDP port: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "UDP port: Nepřipraven" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Online podpis: Povolen" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Online podpis: Zakázán" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Sdílené soubory: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Klientů ve frontě: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "Celkem DL: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "Celkem UL: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Limit odesílání" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Limit stahování" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "Skrýt aMule" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "Zobrazit aMule" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Připojen ke klientovi ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** Připojuji se ke klientovi ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Připojování ke klientovi selhalo / připojení ztraceno ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Zavřít tab" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Zavřít všechny taby" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Zavřít ostatní taby" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "Načítám soubor server.met: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "Soubor server.met nenalezen!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "Otevření souboru server.met (%s) selhalo: neznámý formát." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "Nelze otevřít server.met!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"Soubor server.met je porušený, nalezena neplatná verze: 0x%x, velikost %i" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "V server.met bylo nalezeno %i serverů" +msgstr[1] "V server.met bylo nalezeno %i serverů" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "Přidáno %d serverů" +msgstr[1] "Přidáno %d serverů" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Server nebyl přidán: [%s:%d] neudává platný port." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "Server nebyl přidán: IP adresa [%s:%d] je neplatná, nebo blokovaná." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" +"Server nebyl přidán: Server s totožnou IP a portem [%s:%d] je již v seznamu." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Server byl přidán: [%s:%d] pod názvem '%s'." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"Snažíte se smazat server, na který jste právě připojen(a). Nejprve se prosím " +"odpojte." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Ukládání server.met selhalo!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "Neplatná URL" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Stahování seznamu serverů z %s selhalo" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" +"Varování: byla zadána neplatná URL pro automatickou aktualizaci serverů: %s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" +"V addresses.dat není žádná platná URL pro automatické stahování server.met" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "" + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "webový server běží s PID %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "Port %u je nedostupný. Budete mít LowID\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"Port %u je nedostupný!\n" +"\n" +"To znamená, že budete mít LowID.\n" +"\n" +"Zkontrolujte nastavení vaší sítě a ujistěte se, že je port v obou směrech " +"otevřený." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Selhalo vytvoření OnlineSig souboru" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "Selhalo vytvoření aMule OnlineSig souboru" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "Toto je vaše první spuštění aMule %s" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "Toto je testovací verze, která je denně aktualizovaná a\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "my nezaručujeme, že nemůže nic pokazit, zapálit váš dům,\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" +"nebo zabít vašeho psa. Nicméně i tak by *mělo* být její používání bezpečné.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Více informací, podporu a nová vydání naleznete na naší domovské stránce,\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" +"na www.aMule.org, nebo na našem IRC kanálu #aMule na irc.freenode.net.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Hlašte chyby na adrese http://forum.amule.org/" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "CHYBA: nelze otevřít logovací soubor" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "VAROVÁNÍ: log je prázdný. Něco je špatně." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Log byl vymazán" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "Zpráva od serveru: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Selhalo stahování seznamu uzlů." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Selhalo otvírání staženého kontrolního souboru s verzí" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Porušený soubor pro kontrolu verze" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Používáte zastaralou verzi aMule!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "Vaše verze aMule je %i.%i.%i a poslední verze je %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "Poslední verze jsou vždy k nalezení na http://www.amule.org/" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "VAROVÁNÍ: Vaše verze aMuled je zastaralá: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "Vaše verze aMule je aktuální." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Selhalo stahování kontrolního souboru s verzí" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Připojen k %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Připojování k %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Odpojen od ED2K" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad spuštěn" + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad zastaven" + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Připojen ke Kad (ok)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Připojen ke kad (za firewallem)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Odpojen od Kad" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "Síť Kad nelze použít, když je v nastavení zakázán UDP port." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Síť Kad je zakázána v nastavení, nepřipojuji se." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "Nelze otevřít soubor 'emfriends.met' pro čtení!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "Nelze otevřít soubor 'emfriends.met' pro zápis!" + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "Zatím nelze aktualizovat server.met ze vzdálené GUI." + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "Přečteno %u Kad kontaktů" +#~ msgstr[1] "Přečteno %u Kad kontaktů" + +#~ msgid "Disconnect from " +#~ msgstr "Odpojit od " + +#, fuzzy +#~ msgid "current server" +#~ msgstr "současného serveru" + +#~ msgid " and " +#~ msgstr " a " + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "Odpojit se od serverů a/nebo Kadu" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "TCP Flags" +#~ msgstr "TCP příznaky" + +#~ msgid "UDP Flags" +#~ msgstr "UDP příznaky" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "Zkopírovat ED2K odkaz(y) do schránky" + +#~ msgid "Client request is invalid!" +#~ msgstr "Požadavek klienta je neplatný!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "Požadavek klienta je neplatný! %i / %i" + +#~ msgid "Command: %s" +#~ msgstr "Příkaz: %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "Nelze otevřít soubor %s - používám %s." + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "Varování: soubor known.met neexistuje." + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles: Odstraňuji %s ze seznamu sdílených " +#~ "adresářů: adresář nenalezen." + +#~ msgid "Syncronization thread started." +#~ msgstr "Synchronizační vlákno spuštěno." + +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "Masterhashe známých souborů byly načteny." + +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "Chyba při čtení Kad kontaktů - 0 záznamů" + +#~ msgid "Merge attempt" +#~ msgstr "Pokus o sloučení" + +#~ msgid "Recursive merge" +#~ msgstr "Rekurzivní sloučení" + +#~ msgid "Sucessful merge!" +#~ msgstr "Sloučení proběhlo úspěšně!" + +#~ msgid "No merge possible" +#~ msgstr "Sloučení není možné" + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid "English (U.S.)" +#~ msgstr "Angličtina (americká)" + +#~ msgid "Spanish (Mexican)" +#~ msgstr "Španělština (mexická)" + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ " P2P klient pro všechny platformy založený na eMule \n" +#~ "\n" +#~ " Web: http://www.amule.org/ \n" +#~ " Fórum: http://forum.amule.org/ \n" +#~ " FAQ: http://wiki.amule.org/ \n" +#~ "\n" +#~ " Kontakt: admin@amule.org (administrativní záležitosti)\n" +#~ " Copyright (C) 2003-2008 Tým aMule \n" +#~ "\n" +#~ " Část aMule je založená na \n" +#~ " Kademlia: P2P protokol založený na XOR metrice.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "VAROVÁNÍ: Bylo vám přiděleno Low-ID!" + +#~ msgid "Sources Dropping" +#~ msgstr "Zahazování zdrojů" + +#~ msgid "Buddy address: " +#~ msgstr "Adresa kamaráda: " + +#~ msgid "Drop No Needed Sources now" +#~ msgstr "Odstranit zdroje bez potřebných částí" + +#~ msgid "Drop Full Queue Sources now" +#~ msgstr "Odstranit zdroje s plnou frontou" + +#~ msgid "Drop High Queue Rating Sources now" +#~ msgstr "Odstranit zdroje s dlouhou frontou" + +#~ msgid "Clean Up Sources now (NNS, FQS && HQRS)" +#~ msgstr "Pročistit zdroje (NNS, FQS && HQRS)" + +#~ msgid "" +#~ "Error: Failed to load backup file. Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Chyba: Nelze načíst záložní soubor. Vyhledejte si na http://forum.amule." +#~ "org/ řešení obnovy .part.met" + +#~ msgid "" +#~ "Error: Backup part.met file is 0 size! Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Chyba: Záložní soubor part.met má nulovou velikost! Vyhledejte si na " +#~ "http://forum.amule.org/ řešení obnovy .part.met" + +#~ msgid "Error: part.met backup file is 0 size: %s ==> %s" +#~ msgstr "Chyba: Záložní soubor part.met má nulovou velikost: %s ==> %s" + +#~ msgid "doesn't work" +#~ msgstr "nefunguje" + +#~ msgid "remote gui" +#~ msgstr "vzdálené gui" + +#~ msgid " %d" +#~ msgstr " %d" + +#~ msgid ".%d" +#~ msgstr ".%d" + +#~ msgid "Shows the process of a search." +#~ msgstr "Zobrazí průběh vyhledávání." + +#~ msgid "Shows the process of a search..\n" +#~ msgstr "Zobrazí průběh vyhledávání..\n" + +#~ msgid "Set riority to low." +#~ msgstr "Nastaví nízkou prioritu." + +#~ msgid "Set riority to normal." +#~ msgstr "Nastaví normální prioritu." + +#~ msgid "Set riority to high." +#~ msgstr "Nastaví vysokou prioritu." + +#~ msgid "Set riority to auto." +#~ msgstr "Nastaví automatickou prioritu." + +#~ msgid "Deprecated command, now 'Status'." +#~ msgstr "Zastaralý příkaz, použijte 'Status'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Status' instead.\n" +#~ msgstr "" +#~ "Toto je zastaralý příkaz, který může být v budoucnosti odstraněn.\n" +#~ "Používejte místo něj 'Status'.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter'." +#~ msgstr "Zastaralý příkaz, použijte 'Set IPFilter'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter' instead.\n" +#~ msgstr "" +#~ "Toto je zastaralý příkaz, který může být v budoucnosti odstraněn.\n" +#~ "Používejte místo něj 'Set IPFilter'.\n" + +#~ msgid "Deprecated command, now 'Get IPFilter Level'." +#~ msgstr "Zastaralý příkaz, použijte 'Get IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Toto je zastaralý příkaz, který může být v budoucnosti odstraněn.\n" +#~ "Používejte místo něj 'Get IPFilter Level'.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter Level'." +#~ msgstr "Zastaralý příkaz, použijte 'Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Toto je zastaralý příkaz, který může být v budoucnosti odstraněn.\n" +#~ "Používejte místo něj 'Set IPFilter Level'.\n" + +#~ msgid "Deprecated command, now 'Get/Set IPFilter Level'." +#~ msgstr "Zastaralý příkaz, použijte 'Get/Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get/Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Toto je zastaralý příkaz, který může být v budoucnosti odstraněn.\n" +#~ "Používejte místo něj 'Get/Set IPFilter Level'.\n" + +#~ msgid "Deprecated command, now 'Show Servers'." +#~ msgstr "Zastaralý příkaz, použijte 'Show Servers'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Show Servers' instead.\n" +#~ msgstr "" +#~ "Toto je zastaralý příkaz, který může být v budoucnosti odstraněn.\n" +#~ "Používejte místo něj 'Show Servers'.\n" + +#~ msgid "Deprecated command, now 'Get BwLimits'." +#~ msgstr "Zastaralý příkaz, použijte 'Get BwLimits'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get BwLimits' instead.\n" +#~ msgstr "" +#~ "Toto je zastaralý příkaz, který může být v budoucnosti odstraněn.\n" +#~ "Používejte místo něj 'Get BwLimits'.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Up'." +#~ msgstr "Zastaralý příkaz, použijte 'Set BwLimit Up'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Up' instead.\n" +#~ msgstr "" +#~ "Toto je zastaralý příkaz, který může být v budoucnosti odstraněn.\n" +#~ "Používejte místo něj 'Get BwLimit Up'.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Down'." +#~ msgstr "Zastaralý příkaz, použijte 'Set BwLimit Down'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Down' instead.\n" +#~ msgstr "" +#~ "Toto je zastaralý příkaz, který může být v budoucnosti odstraněn.\n" +#~ "Používejte místo něj 'Get BwLimit Down'.\n" + +#~ msgid "" +#~ "Note: These values are\n" +#~ " only used for statistics." +#~ msgstr "" +#~ "Pozn.: Tyto hodnoty používají\n" +#~ " pouze statistiky." + +#~ msgid "Source Dropping" +#~ msgstr "Zahazování zdrojů" + +#~ msgid "Keep sources" +#~ msgstr "Ponechat zdroje" + +#~ msgid "Drop sources" +#~ msgstr "Zahodit zdroje" + +#~ msgid "Send sources to any other file before dropping (High CPU)" +#~ msgstr "Poslat zdroje na jiný soubor před zahozením (žere CPU)" + +#~ msgid "Sources with no needed file-parts." +#~ msgstr "Zdroje, které nemají potřebné části" + +#~ msgid "Full Queue Sources Handling" +#~ msgstr "Zacházení se zdroji s plnou frontou" + +#~ msgid "Enable auto drop Full Queue Sources" +#~ msgstr "Povolit automatické zahazování zdrojů s plnou frontou" + +#~ msgid "High Queue Rating Sources Handling" +#~ msgstr "Zacházení se zdroji s dlouhou frontou" + +#~ msgid "Enable auto drop High Queue Rating Sources" +#~ msgstr "Povolit automatické zahazování zdrojů s dlouhou frontou" + +#~ msgid "High Queue Rating value" +#~ msgstr "Hodnota dlouhé fronty" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(min. 300 / max. 3000)" + +#~ msgid "Auto Drop Sources Timer" +#~ msgstr "Časovač automatického zahození zdrojů" + +#~ msgid "Timer (in secs)" +#~ msgstr "Časovač (v sekundách)" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(min 60, max 3600)" diff --git a/po/da.po b/po/da.po new file mode 100644 index 00000000..2fac6a48 --- /dev/null +++ b/po/da.po @@ -0,0 +1,7911 @@ +# aMule i18n resource file. +# Copyright (C) 2004 aMule Team +# This file is distributed under the same license as the aMule package. +# Kry , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: aMule CVS\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2007-10-13 18:09+0200\n" +"Last-Translator: Alex Thomsen Leth \n" +"Language-Team: aMule Team \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-15\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Du skal specificere et ikke tomt kodeord" + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Forkert kodeord, ikke it MD5 hash!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Forbindelsen fejlede" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "EC-Forbindelse-fejlede. Tomt svar" + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "ExternalConn: Adgang afvist fordi:" + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "ExternalConn: Adgang afvist" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "ExternalConn: Dårligt svar fra server. Forbindelse lukket" + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Succes! Forbindelse oprettet til aMule" + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Succes! Forbindelse oprettet" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Hasher" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Færdiggør" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Færdig" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Pause" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Beskadiget" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Henter" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Venter" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Begynder at lave MD4 og AICH hash for fil: %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Begynder at lave MD4 hash for fil: %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Begynder at lave AICH hash for fil: %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "Konverter gamle AICH hashsæt i '%s' til 64b i '%s'." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" +"ADVARSEL: Filnavnet '%s' er ikke understøttet og er blevet omdøbt til '%s'" + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "ADVARSEL: Filen '%s' eksistere, ny fil omdøbt til '%s'." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "ADVARSEL: Kunne ikke fjerne orginal '%s' efter oprettelse af backup" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "ADVARSEL: Kunne ikke slette '%s'" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Hentelse af delte fier fra bruger '%s' fejlede" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Ukendt" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (Falsk eMule version-%#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " Falsk eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (Falsk eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (baseret på eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "Anmodede:" + +#: src/BaseClient.cpp:1878 +#, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +msgstr[1] "" + +#: src/BaseClient.cpp:1881 +#, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +msgstr[1] "" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Anmodet om ukendt fil" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Brugernavn" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Venner" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Vis &Detaljer" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Tilføj en ven" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Fjern Ven" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Send &Besked" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Se Filer" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Er du sikker på at du ønsker at slette de(n) valgt(e) ven(ner)?" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Er du sikker på at du ønsker at slette de(n) valgt(e) ven(ner)?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Afbryd" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Fil Navn" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Størrelse" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Type" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Priotet" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "Fil ID" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Anmodninger" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Godtaget Anmodninger" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Overført Data" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Delings Kvote" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Sendte Dele" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Hele kilder" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Mappe sti" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Delte Filer" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Meget lav" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Lav" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normal" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Høj" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Meget Høj" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Udgiv" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Auto" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Tilføj kommentar/bedømmelse" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Rediger Kommentar/Bedømmelse" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Omdøb" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Tilføj filer i samling til overførelses liste" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Kopier magnet &URI til udklipsholder" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Kopier ED2k-Link til udklipsholder" + +#: src/SharedFilesCtrl.cpp:163 +#, fuzzy +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Kopier eD2k link til udklipsholder (&Source)" + +#: src/SharedFilesCtrl.cpp:164 +#, fuzzy +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "Kopier eD2k link til udklips holder (Kilde) (&With Crypt options)" + +#: src/SharedFilesCtrl.cpp:165 +#, fuzzy +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Kopier eD2k link til udklipsholder (&Hostname)" + +#: src/SharedFilesCtrl.cpp:166 +#, fuzzy +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "Kopier eD2k link til udklipsholder (Hostname) (With &Crypt options)" + +#: src/SharedFilesCtrl.cpp:167 +#, fuzzy +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Kopier eD2k link til udklipsholder (&AICH info)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:306 +#, fuzzy +msgid "You need a HighID to create a valid sourcelink" +msgstr "Du skal have et HighID for at lave et godkendt kildelink" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Advarsel" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Delte Filer (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[DeleAfFil]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Indtast nyt navn for denne fil:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Omdøb fil" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Genoptager uploads af fil: %s" + +#: src/UploadQueue.cpp:521 +#, fuzzy, c-format +msgid "Suspending upload of file: %s" +msgstr "Suspender upload af fil: %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: søgeord er for kort" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Fejl: Kunne ikke lytte til TCP-port" + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "Admoding fejlede med følgende fejl: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "Admodning fejlede med en ukendt fejl." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "Index fil ikke fundet: " + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Kan ikke oprette web socket tråd\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Web Server: Startet\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Session udløbet - admoder login\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Session ok, logget in\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Session ok, ikke logget in\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Ingen session åbnet - vil admode om login\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Session oprettet - admoder login\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Udfører anmodning [Original]: " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Undersøger password\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Password hash invalid\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Passwork ok\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Password forkert\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "Intet password skrevet. Blank password er ikke gyldigt.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Logout anmodning\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Udfører forespørgsel [omledt]: " + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Henter template " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Webserver HTTP port" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Brug UPnP port forwarding til webserver port" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "UPnP port" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Brug gzip komprimering" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Fuldt adgangs password til webserver" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Bruger password til webserver" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Tillad bruger adgang" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "Hent/gem webserver instillinger fra/til fjern aMule" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "aMule configurations fil sti. BRUG IKKE DIREKTE" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "aMule Web Server" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Ikke tilgængelig" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Aldrig" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Downloader..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Indstillinger" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "Mappe indholdende amulesig.dat fil" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Gennemse" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Skriv her i hvilken mappe amulesig.dat befinder sig" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Opdaterings rate interval i sekunder" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Generer et statistisk billede for hver opdaterings hændelse" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "Skriv her mappen hvor du vil generere det statistiske billede" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Upload periodisk dit statistiske billede til en FTP server" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "FTP Url" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "FTP Sti" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Skriv her URL på din FTP server" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" +"Skriv her biblioteket hvor dit statistiske billede på FPT serveren skal ligge" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Bruger" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Password" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Skriv her brugernavnet for at logge på din FTP server" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Skriv her bruger passworded for at logge på din FTP server" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "FTP opdaterings interval i minutter" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Valider" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Mapper der indeholder din signatur fil" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Mappe hvor det statistiske billede bliver genereret" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i dag(e) %i time(r) %i Minut(ter) %i s" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, aMule Online Statistik" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Velkommen" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Maksimum DL rate siden wxCas er startet" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "Absolute Maksimum DL rate gennem wxCas forrige kørsel" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Reset" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "System" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Stop Auto Genopfriskning" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Gem Online Statistisk billede" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Print Online Statistisk billede" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "Omking wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Start Auto Opdatering" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Auto Opdatering stoppet" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Auto Opdatering startet" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Gem Statistisk Billede" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "Fil ikke gemt" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "aMule Online Statistik" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Der var et problem med udskrivningen.\n" +"Måske printer instillingerne er forkerte." + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Udskrivning" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, aMule Online Signatur Statistik\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Baseret på CAS af Pedro de Oliveira \n" +"Omdelt under GPL" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Oh Oh, aMule kører ikke..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule kører" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule kører men ikke forbundet" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule forbinder" + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Oh Oh, aMule status ukendt..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " har kørt i " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " er stoppet !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " er ikke forbundet !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " forbinder..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr "gør noget mærkeligt, undersøg det !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " er forbundet til " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "ok" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "firewalled" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "afbrudt" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " er tændt " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +#, fuzzy +msgid " with " +msgstr "] med " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr " Total Download: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Upload: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Sesion Download: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Download: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s, Upload: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Deling: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " fil(er), Klienter i kø: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Tid: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " tændt " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "System Hentnings Gennemsnit (1-5-15 min): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uD %02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "HøjtID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "Lavt ID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Ingen Forbindelse" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.Af B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "Anulleret !" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Ikke muligt at åbne %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "Filen %s er for stor til Donkey: maksimum tilladt er 4GB." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Indput parametre" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Tilføj" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Ryd" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Start" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Afslut" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Auto [La]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Auto [No]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Auto [Hø]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Forbinder" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Spørger" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Forbinder via Server" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Kø Fuld" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "I Kø" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Overfører" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Modtaget Hashsæt" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Ingen brugbare dele" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Kan ikke forbinde LavID til LavID" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "For mange forbindelser" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Banlyst" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "System standard" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Arabic" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Basque" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Bulgarian" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Catalan" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Danish" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Dutch" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Estonian" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Finnish" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "French" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "German" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Italian" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Korean" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "Lithuanian" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Polish" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portuguese" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Russian" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Spanish" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Servernavn" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Port" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Beskrivelse" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Brugere" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Filer" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Fejlede" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Statistik" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Info" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Ja" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Nej" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Servere (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Server" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "" + +#: src/ServerListCtrl.cpp:428 +msgid "Mark server as static" +msgstr "" + +#: src/ServerListCtrl.cpp:429 +msgid "Mark server as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:431 +msgid "Mark servers as static" +msgstr "" + +#: src/ServerListCtrl.cpp:432 +msgid "Mark servers as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:438 +msgid "Remove server" +msgstr "Fjern server" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "Fjern server" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Fjern Alle servere" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Kopier ED2k-Link til udklipsholder" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "Kopier ED2k-Link til udklipsholder" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Er du sikker på at du ønsker at slette de(n) valgt(e) ven(ner)?" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Er du sikker på at du ønsker at slette de(n) valgt(e) ven(ner)?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Inaktiv [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "" + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Fatal Fejl: Kunne ikke oprette timer" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr "" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr "" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "Forbinder" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "Afbrudt" + +#: src/amuleDlg.cpp:676 +#, fuzzy +msgid "Kad: Firewalled" +msgstr "firewalled" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "Forbundet" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "Forbinder" + +#: src/amuleDlg.cpp:689 +#, fuzzy +msgid "Kad: Off" +msgstr " Kad: " + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "Stop de nuværende forbindelses forsøg" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Afbryd" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "Afbryd fra nuværende server" + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Forbind" + +#: src/amuleDlg.cpp:726 +msgid "Connect to the currently enabled networks" +msgstr "" + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Up: %.1f(%.1f) | Down: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Op: %.1f | Ned: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Vil du virkelig afslutte aMule?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Bekræft afslut" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "" + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Søg" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Søge Vindue" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Overførsler" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Fil Overførsel Vindue" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Beskeder" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Besked Vindue" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Statistik" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "General" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Forbindelse" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Fjern Kontrol" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Mapper" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Op: 0.0 | Ned: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Find wav" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "Fil wav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Gennemse efter Video Afspiller" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Ændre Serverlisten" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Tilføj URLer hvor der kan hentes server.met filer.\n" +"Kun en URL på hver linje." + +#: src/PrefsUnifiedDlg.cpp:980 +#, fuzzy, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Opdaterings interval : 5 sek" +msgstr[1] "Opdaterings interval : 5 sek" + +#: src/PrefsUnifiedDlg.cpp:987 +#, fuzzy, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Tid for gennemsnitlig graf: 100 min" +msgstr[1] "Tid for gennemsnitlig graf: 100 min" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:999 +#, fuzzy, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Opdaterings interval : 5 sek" +msgstr[1] "Opdaterings interval : 5 sek" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, fuzzy, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Fil Buffer Størrelse %i bytes" +msgstr[1] "Fil Buffer Størrelse %i bytes" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, fuzzy, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Server forbindelses opdaterings interval %i min" +msgstr[1] "Server forbindelses opdaterings interval %i min" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Server forbindelses opdaterings interval: Inaktiv" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "" + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "" + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "" + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "" + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "" + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "" + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "" + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "" + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "" + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "" + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "" + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "" + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "" + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "" + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "" + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "" + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "" + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "" + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "" + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "" + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "" + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "" + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "" + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "" + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "" + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "" + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "" + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "" + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Forbundet" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Port" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Afbrudt" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "OK" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "" + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Overfør" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Uploads" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Gennemsnitlig upload tid: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Downloads" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Genforbindelser: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Tid Siden Første Overførsel: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Forbundet Til Server Siden: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Klienter" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Servere" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Total Størrelse Af Delte Filer: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Gennemsnitlig filstørrelse: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "" + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "" + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "" + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "" + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Tilføj en Ven" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Du skal indtaste en brugbar IP og port" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Kilder" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Fil" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Download" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Kategori" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "" + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Fejl" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Brugere E: %s K: %s | Filer E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Overført" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Færdig" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Hastighed" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Forløb" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Status" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Tid Tilbage" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Sidst Færdig" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Sidste Kontakt" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Er du sikker på at du ønsker at slette de(n) valgt(e) ven(ner)?" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Er du sikker på at du ønsker at slette de(n) valgt(e) ven(ner)?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Stop" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Pause" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Genoptag" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "Ryd færdige" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Udvidet Muligheder" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Smug Kig" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Vis fil &detaljer" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Vis alle kommentarer" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "fjern fra ketegori" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Flyt til kategori" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "&Åben filen" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Tilføj til Venner" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Spørger efter en anden fil" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Downloads (%i)" + +#: src/DownloadListCtrl.cpp:2222 +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2260 +#, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "Fejl: Kunne ikke oprette partfil" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "" + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Kunne ikke åbne %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "" + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "" + +#: src/PartFile.cpp:1019 +#, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"Fejl: Kunne ikke hashe downloadede del - hashsæt ikke færdig (%s). Dette " +"skulle aldrig ske" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "stoppet" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "" + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "Fandt %i kendte delte filer" +msgstr[1] "Fandt %i kendte delte filer" + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "Fandt %i kendte delte filer" +msgstr[1] "Fandt %i kendte delte filer" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Fil Kommentarer" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Ingen kommentarer" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "Ingen kommentarer" +msgstr[1] "Ingen kommentarer" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "" + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "" + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "Ingen brugbare servere i serverliste" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Forbundet til %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Forbindelse oprettet til: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "Kunne ikke forbinde. Internettet må være nede." + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Mistede forbindelsen til %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) ser ud til at være død" + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "" + +#: src/ServerConnect.cpp:391 +#, fuzzy, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "Automatisk forbindelse til server vil prøve igen om %d sekunder" +msgstr[1] "Automatisk forbindelse til server vil prøve igen om %d sekunder" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Forbindelse afbrudt" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "" + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "" + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Ingen part filer fundet" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "Fandt %i part filer" +msgstr[1] "Fandt %i part filer" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Downloader %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Du prøver allerede at downloade denne fil %s" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "" + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "" + +#: src/TextClient.cpp:305 +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" + +#: src/TextClient.cpp:343 +msgid "Processing by hash: " +msgstr "" + +#: src/TextClient.cpp:358 +#, fuzzy +msgid "Processing by filename: " +msgstr "Udfører anmodning [Original]: " + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "" + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "" + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "" + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "" + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "" + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "" + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "" + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "" + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "" + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "" + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "" + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "" + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "" + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "" + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "" + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "" + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "" + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "" + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "" + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "" + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "" + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "" + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "" + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "" + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "" + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "" + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "" + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "" + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "" + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "" + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "" + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "" + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "" + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "" + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "" + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "" + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "" + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "" + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "" + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "" + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "" + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "" + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "" + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "" + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "" + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "" + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Ny Klient-ID er %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "" + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "Modtog %d nye Servere" +msgstr[1] "Modtog %d nye Servere" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "" + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "Server afviste sidste kommando" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "" + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "" + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "" + +#: src/IP2Country.cpp:73 +#, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "" +msgstr[1] "" + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"Er du sikker på du vil annullere og slette alle filer i denne kategori?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Bekræftelse Krævet" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Mangelfuld" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Video" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Lyd" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Arkiv" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "CD-Aftryk" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Billeder" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Tekst" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Tilføj kategori" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Ændre kategori" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Fjern kategori" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "" + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "" + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Venter..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "Bytes" +msgstr[1] "Bytes" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "kB/s" +msgstr[1] "kB/s" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "sek" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "min" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Videoer" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Arkiver" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programer" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Alle" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Ikke anslået" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Invalid / fejl / Falsk" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Dårlig" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Nogen Lunde" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "God" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Glimrende" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "alt" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "alt andet" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "" + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" + +#: src/IPFilter.cpp:330 +#, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +msgstr[1] "" + +#: src/IPFilter.cpp:332 +#, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +msgstr[1] "" + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Aktive forbindelser (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "" + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Overfør" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Henter ..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Antal brugere på den server du er forbundet til ..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Brugere: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Ikke Forbundet ..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "" + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Søg" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Endelse" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Min Størrelse" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Bytes" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Max Størrelse" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "" + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Klienter i kø :" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Send" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "" + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Luk" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "" + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Navn :" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "N/A" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "met-Fil :" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Hash :" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Filstørrelse :" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Sidst færdig :" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Fundne Kilder :" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Overfører Kilder :" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Tilgængelig :" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "" + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Overført :" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Færdig Størrelse :" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Intelligent Fejl Håndtering" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Tabt pga beskadigelse :" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Overtag" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Ryd Op" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Anvend" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"For en film kan du sige den længde, dens histori, sprog ...\n" +"og hvis den er falsk, kan du også fortælle det til andre aMule brugere." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Fil Kvalitet" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Ingen Kommentar(er)" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Opdater" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Henter, vent venligst" + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Krævet Information" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "IP Adresse :" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Port :" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Aktuelle Adresse" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Brugernavn :" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Nuværende Session" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Total" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Anmodet :" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Aktive Uploads :" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Download-Hastighed" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Nuværende" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Nuværende Gennemsnit" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Sessions Gennemsnit" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Upload-Hastighed" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Aktive Downloads" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Aktive Forbindelser (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Aktive Uploads" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Navn:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Point:" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Brugernavn" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "" + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Sprog" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "" + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Andre Indstillinger" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Start minimeret" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "" + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Spørg ved afslut" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "" + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "" + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "" + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Tilladte Hastigheder" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Upload" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Slot Tildeling" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Linie Kapasitet" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "" + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "deaktiver" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Max Kilder Pr Fil" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Fast Grænse" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Forbindelses Grænser" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Max Forbindelser" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Auto forbind ved start" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Genforbind ved fejl" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Fjern ikke tilgængelige servere, efter" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "forsøg" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Opdater serverliste ved start" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Liste" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Opdater serverliste ved forbindelse til server" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Opdater serverliste når en klient forbinder" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Brug prioterings system" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Brug smart LavID tjek ved forbindelse" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Sikker forbindelse" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Autoforbind kun til servere i statik liste" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Sæt manuelt tilføjede servere til Høj Priotet" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "I.C.H. aktiv" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Tilføj filer til download i pause tilstand" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Tilføj filer til download med auto priotet" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Prøv at download første og sidste del først" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Tilføj nye delte filer med auto priotet" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Prøv at overføre hele dele til uploads" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Start næste pausede fil når en fil er færdig" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "" + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Indkommende Mappe :" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Midlertidig Mappe :" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Delte Mapper" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Video Afspiller" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Opret backup for smug kig" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Grafer" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Opdaterings interval : 5 sek" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Tid for gennemsnitlig graf: 100 min" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Baggrund" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Download nu" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Upload nu" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Aktive Forbindelser" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Vælg" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Besked popup" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Brug lyd" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Popop når :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Ny tekst i log" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Starter en ny chat session" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "En ny chat besked er modtaget" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "En download er tilføjet eller færdig" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Ny aMule version fundet" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "Vigtig OOD serverforbindelse mistet" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Underret via Mail" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Send en Email når overførsel er færdig." + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "SMTP server :" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "Email Adresse :" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! Advarsel !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Max nye forbindelser / 5 sekunder" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Fil Buffer Størrelse" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Vis procent" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Viss statusbar" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Forløbs Stil" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Flad" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Rund" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Vis hurtig ED2K link håndtering" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Vis overførsels hastighed i titel" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Webserver Parametre" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Webserver port" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Side Opdaterings Tid (i sek)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Aktiver Gzip komprimering" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Aktiver lav rettigheds brugere" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Fuld rettigheds kodeord" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Lav rettigheds kodeord" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Ydre Forbindelses Parametre" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Accepter ydre forbindelser" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "" + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "" + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Titel :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Kommentar :" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Indkommende Mappe :" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "" + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "" + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Server Info" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "" + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "aMule Log" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "Tryk på denne knap for at opdatere serverlisten fra URL ..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Serverliste" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Tilføj Manuelt en server : Navn" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "" + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "" + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "" + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "" + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Alle" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Ingen" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "" + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Aktiver online-signatur" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "" + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Vælg en mappe til indkommende filer" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "" + +#: src/ExternalConnector.cpp:188 +#, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "" + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "" + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "" + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "" + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "" + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "" + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "" + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "" + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "" + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "" + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "" + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "" + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "" + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "" + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "" + +#: src/ClientCreditsList.cpp:168 +#, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "" +msgstr[1] "" + +#: src/ClientCreditsList.cpp:171 +#, fuzzy, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] "Kredit udløbet!" +msgstr[1] "Kredit udløbet!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "" + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Vis Uploads" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Vis Køen" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Ventet" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Upload Tid" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Fil Priotet" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Point" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Spurgte" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Sidst Set" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Kom I Kø" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Klient Detaljer" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Ikke Understøttet" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Ikke færdig" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "" + +#: src/ClientDetailDialog.cpp:190 +#, c-format +msgid "%u (QR: %u)" +msgstr "" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Ubegrænset" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "Klient ID: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "ServerNavn: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "ServerIP: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "TCP Port: Ikke Klar" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "UDP Port: Ikke Klar" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Online Signatur: Aktiv" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Online Signatur: Inaktiv" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Upload Grænse" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Download Grænse" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Luk tab" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Luk alle tabs" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Luk andre tabs" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "%i Serverer fundet i server.met" +msgstr[1] "%i Serverer fundet i server.met" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "Servere tilføjet: " +msgstr[1] "Servere tilføjet: " + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "" + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "" + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "" + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Fejl ved gemning af server.met!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "Invalid URL" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "" + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "" +"Vi giver ikke garanti for at det ikke vil ødelægge noget, brænde dit hus,\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "FEJL: Kan ikke åbne logfil" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "FARE: logfilen er tom. Noget er galt" + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Log nulstillet" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "ServerBesked: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Fejl ved hentning af node listen" + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Fejl ved åbning af den hentet version check filen" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Korrupt version check fil" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Du bruger en forældet version af aMule" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "Din aMule version er %i.%i.%i og den sisdte nye version er %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "Den sidste nye version kan altid findes hos http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "FARE: Din aMule version er forældet: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "Din kopi af aMule er op til dato" + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Fejl ved hentning af version check filen" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Forbundet til %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Forbundet til %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Afbrudt fra ED2K" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad startet." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad stoppet." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Forbundet til Kad (ok)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Forbundet til Kad (med firewall)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Afbrudt fra Kad" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"Kad netværk kan ikke bruges hvis UDP port er fravalgt i instillinger, " +"starter ikke." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Kad netværk fravalgt i instillinger, forbinder ikke." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "Fejl ved åbning af venneliste fil 'emfriends.met' ved læsning!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "Fejl ved åbing af venneliste fil 'emfriends.met' ved skrivning!" + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "Læs %u Kad kontakter" +#~ msgstr[1] "Læs %u Kad kontakter" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "Syncronization thread started." +#~ msgstr "Synkroniserings tråd startet." + +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "Masterhashes af kendte filer er indlæst." + +#, fuzzy +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "Fejl under indlæsning af Kad kontakter - 0 indtastninger" + +#~ msgid "Merge attempt" +#~ msgstr "Samlings forsøg" + +#~ msgid "Sucessful merge!" +#~ msgstr "Succesfuld samling" + +#~ msgid "No merge possible" +#~ msgstr "Samling ikke mulig" + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid "Send sources to any other file before dropping (High CPU)" +#~ msgstr "Send kilder til en anden fil før droppelse (Høj CPU)" + +#~ msgid "Full Queue Sources Handling" +#~ msgstr "Kilder i fyldt kø håndtering" + +#~ msgid "Enable auto drop Full Queue Sources" +#~ msgstr "Drop kilder som er i en fuld kø" + +#~ msgid "High Queue Rating Sources Handling" +#~ msgstr "Kilder i lang kø håndtering" + +#~ msgid "Enable auto drop High Queue Rating Sources" +#~ msgstr "Drop automatisk kilder i lang kø" + +#~ msgid "High Queue Rating value" +#~ msgstr "For køer som er over" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(Min 300 / Max 3000)" + +#~ msgid "Auto Drop Sources Timer" +#~ msgstr "Interval for auto dropning af kilder" + +#~ msgid "Timer (in secs)" +#~ msgstr "Tid (i sek)" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(Min 60 / 3600 Max)" + +#~ msgid "Minimize to trayicon" +#~ msgstr "Minimer til statusområde" + +#~ msgid "Port %d is not available. You will be LOWID" +#~ msgstr "Port %d er ikke tilgængelig. Du får LAVID" + +#~ msgid "" +#~ "Port %d is not available !!\n" +#~ "\n" +#~ "This will mean that you will be LOWID.\n" +#~ "\n" +#~ "Use netstat to determine when port becomes available\n" +#~ "and try starting amule again." +#~ msgstr "" +#~ "Port %d er ikke tilgængelig !!\n" +#~ "\n" +#~ "Dette vil sige du får et LAV ID.\n" +#~ "\n" +#~ "Brug netstat for at finde ud af når porten er fri\n" +#~ "og start aMule igen." + +#~ msgid "Failed to save" +#~ msgstr "Kunne ikke gemme" + +#~ msgid " OnlineSig File" +#~ msgstr " OnlineSig Fil" + +#~ msgid "" +#~ "Unable to launch browser. Please set correct browserexecutable path in " +#~ "Preferences." +#~ msgstr "" +#~ "Kunne ikke starte din browser. Vælg venligt en korekt sti til den under " +#~ "indstillinger." + +#~ msgid "" +#~ " --- This is the first time you run aMule %s ---\n" +#~ "\n" +#~ msgstr "" +#~ " --- Dette er første fanf du kører aMule %s ---\n" +#~ "\n" + +#~ msgid "This version is a testing version, updated daily, and \n" +#~ msgstr "Denne version er en test version, opdateret daglig, og \n" + +#~ msgid "or kill your dog. But it *should* be safe to use anyway. \n" +#~ msgstr "eller dræbe din hund, Men det skulle være sikkert at bruge. \n" + +#~ msgid "client credits will be lost on this first run. \n" +#~ msgstr "klient kredits vil gå tabt ved denne første kørsel \n" + +#~ msgid "Feel free to report any bugs to forum.amule.org" +#~ msgstr "Reporter gerne alle fejl på forum.amule.org" + +#~ msgid "Desktop integration" +#~ msgstr "Desktop integration" + +#~ msgid "Connection established on:" +#~ msgstr "Forbindelse etableret til: " + +#~ msgid "Connect to any server" +#~ msgstr "Forbind til en tilfældig server" + +#~ msgid "You are not connected to a server!" +#~ msgstr "Du er ikke forbundet til en server!" + +#~ msgid "This ed2k link is invalid (%s)" +#~ msgstr "Dette ed2k link er invalid (%s)" + +#~ msgid "Invalid link: %s" +#~ msgstr "Invalid Link: %s" + +#~ msgid "Filtered IP: %s (%s)" +#~ msgstr "Filtreret IP: %s (%s)" + +#~ msgid "Description for file '%s' received: %s" +#~ msgstr "Beskrivelse af fil '%s' modtaget: %s" + +#~ msgid "Unable to retrieve shared files from '%s'" +#~ msgstr "Kunne ikke modtage delte filer fra '%s'" + +#~ msgid "Requesting shared files from '%s'" +#~ msgstr "Anmoder om delte filer fra '%s'" + +#~ msgid "Requesting shared files from user %s (%u) is already in progress" +#~ msgstr "Anmoder bruger %s (%u) om delte filer, allerede igang." + +#~ msgid "NickName: %s\n" +#~ msgstr "BrugerNavn: %s\n" + +#~ msgid "can't create file '%s'" +#~ msgstr "kan ikke oprette fil '%s'" + +#~ msgid "Can't open file '%s'" +#~ msgstr "Kan ikke åbne fil '%s'" + +#~ msgid "can't close file descriptor %d" +#~ msgstr "kan ikke lukke fil beskrivelse %d" + +#~ msgid "can't read from file descriptor %d" +#~ msgstr "kan ikke læse fil beskrivelse %d" + +#~ msgid "can't write to file descriptor %d" +#~ msgstr "kan ikke skrive til fil beskrivelse %d" + +#~ msgid "can't flush file descriptor %d" +#~ msgstr "kan ikke tømme fil beskrivelse %d" + +#~ msgid "unknown seek origin" +#~ msgstr "ikke kendt søge oprindelse" + +#~ msgid "can't get seek position on file descriptor %d" +#~ msgstr "kan ikke søge position i fil beskrivelse %d" + +#~ msgid "can't find length of file on file descriptor %d" +#~ msgstr "kan ikke finde længde af fil i fil beskrivelse %d" + +#~ msgid "can't determine if the end of file is reached on descriptor %d" +#~ msgstr "kan ikke afgøre om enden af filen er nået i beskrivelse %d" + +#~ msgid "invalid eof() return value." +#~ msgstr "invalid eof() tilbage melding." + +#~ msgid "*** Chatsession Start : " +#~ msgstr "*** Chat Begyndt : " + +#~ msgid "Message from" +#~ msgstr "Besked fra" + +#~ msgid "failed" +#~ msgstr "fejlede" + +#~ msgid "*** Disconnected" +#~ msgstr "*** Ikke Forbundet" + +#~ msgid "Failed to load creditfile" +#~ msgstr "Fejl ved indlæsning af kreditfil" + +#~ msgid "Failed to save creditfile" +#~ msgstr "Kunne ikke gemme kreditfil" + +#~ msgid "ClientSoftware ->" +#~ msgstr "KlientSoftware >" + +#~ msgid "<- ClientVersion ->v" +#~ msgstr "<- Klient Version ->v" + +#~ msgid "Not Avaiable" +#~ msgstr "Ikke Tilgængelig" + +#~ msgid "Corrupted compressed packet for %s received (error %i)" +#~ msgstr "Beskadiget pakket pakke fra %s modtaget (fejl %i)" + +#~ msgid "Check Fake" +#~ msgstr "Tjek om filen er falsk" + +#~ msgid "Copy ED2k link to clipboard (&HTML)" +#~ msgstr "Kopier ED2k-Link til udklipsholder (&HTML)" + +#~ msgid "Show Lists" +#~ msgstr "Vis Liste" + +#~ msgid "Hide Lists" +#~ msgstr "Skjul Liste" + +#~ msgid "Preview [" +#~ msgstr "Smug Kig [" + +#~ msgid "eDonkey v%i" +#~ msgstr "eDonkey v%i" + +#~ msgid "eDonkeyHybrid v%i" +#~ msgstr "eDonkeyHybrid v%i" + +#~ msgid "eMule v%02X" +#~ msgstr "eMule v%02X" + +#~ msgid "aMule [ %s ]" +#~ msgstr "aMule [ %s ]" + +#~ msgid "aMule v0.%02X" +#~ msgstr "aMule v0.%02X" + +#~ msgid "lMule/xMule v0.%02X" +#~ msgstr "lMule/xMule v0.%02X" + +#~ msgid "Old MLdonkey" +#~ msgstr "Gammel MLdonkey" + +#~ msgid "New MLdonkey" +#~ msgstr "Ny MLdonkey" + +#~ msgid "Are you sure that you want to cancel and delete this file ?\n" +#~ msgstr "Er du sikker på du vil annullere og slette denne fil ?\n" + +#~ msgid "Are you sure that you want to cancel and delete these files ?\n" +#~ msgstr "Er du sikker på du vil annullere og slette denne fil ?\n" + +#~ msgid "You already have the file %s" +#~ msgstr "Du har allerede filen %s" + +#~ msgid "Bad link." +#~ msgstr "Dårligt link." + +#~ msgid "not a well-formed ed2k link" +#~ msgstr "ikke et odentligt ed2k link" + +#~ msgid "Not an ED2K server or file link" +#~ msgstr "Ikke en ED2K server eller fil link" + +#~ msgid "can't write file '%s'" +#~ msgstr "kan ikke skrive fil '%s'" + +#~ msgid "done" +#~ msgstr "færdig" + +#~ msgid "Failed to copy the file '%s' to '%s'" +#~ msgstr "Fejlede ved kopiering af fil '%s' til '%s'" + +#~ msgid "Loaded ipfilter with %d IP addresses." +#~ msgstr "Indlæste ipfilter med IP adresse %d." + +#~ msgid "Error: the file known.met is corrupted, unable to load known files" +#~ msgstr "Fejl: filen known.met er beskadiget, kunne ikke hente kendte filer" + +#~ msgid "" +#~ "Unexpected file error while reading known.met: %s, unable to load known " +#~ "files" +#~ msgstr "" +#~ "Uventet fejl ved læsning af known.met: %s, kunne ikke hente kendte filer" + +#~ msgid "User %s (%u) requested your sharedfiles-list -> %s" +#~ msgstr "Bruger %s (%u) anmodede om din deleliste -> %s" + +#~ msgid "accepted" +#~ msgstr "accepteret" + +#~ msgid "denied" +#~ msgstr "nægtet" + +#~ msgid "Client '%s' (IP:%s) caused an error: %s. Disconnecting client!" +#~ msgstr "Klient '%s' (IP:%s) lavede en fejl: %s. Afbryder Klient" + +#~ msgid "" +#~ "A client caused an error or did something bad: %s. Disconnecting client!" +#~ msgstr "" +#~ "En klient lavede en fejl eller gjode noget slemt: %s. Afbryder klient!" + +#~ msgid "Concurrent Downloads" +#~ msgstr "Samtidige Downloads" + +#~ msgid "1-5" +#~ msgstr "1-5" + +#~ msgid "6-15" +#~ msgstr "6-15" + +#~ msgid "16+" +#~ msgstr "16+" + +#~ msgid "Connection Type" +#~ msgstr "Forbindelses Type" + +#~ msgid "Select your connection type here :" +#~ msgstr "Vælg din forbindelse type her :" + +#~ msgid "True download bandwidth" +#~ msgstr "Max download grænse" + +#~ msgid "True upload bandwidth" +#~ msgstr "Max upload grænse" + +#~ msgid "Unit:" +#~ msgstr "Enhed:" + +#~ msgid "kbits/sec" +#~ msgstr "kbits/sek" + +#~ msgid "" +#~ "For system tray integration to work,\n" +#~ "you must specify which desktop you are using.\n" +#~ "You can change this later from preferences." +#~ msgstr "" +#~ "For at få amule til at integrere med statusområdet,\n" +#~ "skal du vælge hvilken desktop du bruger.\n" +#~ "du kan ændre dette senere." + +#~ msgid "Desktop" +#~ msgstr "Desktop" + +#~ msgid "Gnome 2.x (or other XEMBED compatible)" +#~ msgstr "Gnome 2.x (eller andre XEMBED-kompatible)" + +#~ msgid "KDE 3.x" +#~ msgstr "KDE 3.x" + +#~ msgid "KDE 2.x / Gnome 1.2 " +#~ msgstr "KDE 2.x / Gnome 1.2 " + +#~ msgid "No systray integration, please" +#~ msgstr "Ingen integration til statusområde" + +#~ msgid "Fast ED2K Links Handler (Direct Download)" +#~ msgstr "Hurtig ED2K Link Håndtering (Direkte Download)" + +#~ msgid "Name" +#~ msgstr "Navn" + +#~ msgid "Min Availability" +#~ msgstr "Min Tilgængelighed" + +#~ msgid "Search global" +#~ msgstr "Søg globalt" + +#~ msgid "Clear All" +#~ msgstr "Ryd Alt" + +#~ msgid "Download selected" +#~ msgstr "Download markerede" + +#~ msgid "Codec:" +#~ msgstr "Codec:" + +#~ msgid "Length:" +#~ msgstr "Længde:" + +#~ msgid " / (" +#~ msgstr " / (" + +#~ msgid ")" +#~ msgstr ")" + +#~ msgid "Source Names" +#~ msgstr "Kilde Navne" + +#~ msgid "Reload" +#~ msgstr "Opdater" + +#~ msgid "Clientsoftware :" +#~ msgstr "Klientsoftware :" + +#~ msgid "Server IP :" +#~ msgstr "Server IP :" + +#~ msgid "Clientversion :" +#~ msgstr "Klientversion :" + +#~ msgid "ID :" +#~ msgstr "ID :" + +#~ msgid "Servername :" +#~ msgstr "Servernavn :" + +#~ msgid "Currently downloading :" +#~ msgstr "Downloader Nu :" + +#~ msgid "Downloaded (this session) :" +#~ msgstr "Downloaded (denne session) :" + +#~ msgid "Average downloadrate :" +#~ msgstr "Gennemsnits downloadhastighed :" + +#~ msgid "Downloaded total :" +#~ msgstr "Downloaded total :" + +#~ msgid "Uploaded (this session) :" +#~ msgstr "Uploaded (denne session) :" + +#~ msgid "Average Uploadrate :" +#~ msgstr "Gennemsnitlig Uploadshastighed :" + +#~ msgid "Uploaded total :" +#~ msgstr "Uploaded total :" + +#~ msgid "http://www.aMule.org" +#~ msgstr "http://www.aMule.org" + +#~ msgid "Chinese" +#~ msgstr "Chinese" + +#~ msgid "English" +#~ msgstr "Dansk" + +#~ msgid "Galego" +#~ msgstr "Galego" + +#~ msgid "German (Swiss)" +#~ msgstr "German (Swiss)" + +#~ msgid "Portuguese (Brazil)" +#~ msgstr "Portuguese (Brazil)" + +#~ msgid "Spanish (Chile)" +#~ msgstr "Spanish (Chile)" + +#~ msgid "Spanish (Mexico)" +#~ msgstr "Spanish (Mexico)" + +#~ msgid "Turkey" +#~ msgstr "Turkey" + +#~ msgid "Beep on errors" +#~ msgstr "Bip ved fejl" + +#~ msgid "Bring to front on link click" +#~ msgstr "Bring frem ved link klik" + +#~ msgid "Downloadlist doubleclick to expand" +#~ msgstr "Dobbeltklik for udfoldelse af downloadlist" + +#~ msgid "Tooltip Delay Time in secs (1s to 5s)" +#~ msgstr "Statusområde ikons opdaterings tid i sekunder (1s til 5s)" + +#~ msgid "Systray Integration" +#~ msgstr "Statusområde Integration" + +#~ msgid "Startup" +#~ msgstr "Programm start" + +#~ msgid "5 Days" +#~ msgstr "5 Dage" + +#~ msgid "Check for new version" +#~ msgstr "Se efter ny version" + +#~ msgid "Show Splashscreen" +#~ msgstr "Vis velkomstskærm" + +#~ msgid "Clientport" +#~ msgstr "Klient Port" + +#~ msgid "TCP" +#~ msgstr "TCP" + +#~ msgid "UDP" +#~ msgstr "UDP" + +#~ msgid "Connection Wizard" +#~ msgstr "Forbindelses Assistent" + +#~ msgid "IP-Filter" +#~ msgstr "IP-Filter" + +#~ msgid "IP-Filter ON / OFF" +#~ msgstr "IP-Filter Aktiv / Inaktiv" + +#~ msgid "Always filter bad IPs" +#~ msgstr "Filtrer dårlige IPer" + +#~ msgid "See my shares" +#~ msgstr "Kan se mine delte filer" + +#~ msgid "mplayer -idx" +#~ msgstr "mplayer -idx" + +#~ msgid "Autotake ED2K Links only during runtime" +#~ msgstr "Overtag kun ED2K links når amule kører" + +#~ msgid "Arrange Downloads" +#~ msgstr "Arranger Downloads" + +#~ msgid "Enable auto-arranging download list " +#~ msgstr "Aktiver auto arrangering af download liste" + +#~ msgid "Download speed" +#~ msgstr "Downloads hastighed" + +#~ msgid "Number of sources" +#~ msgstr "Antal kilder" + +#~ msgid "GTK Theme Selector" +#~ msgstr "GTK Tema Vælger" + +#~ msgid "Theme :" +#~ msgstr "Tema :" + +#~ msgid "Use Font " +#~ msgstr "Brug Font " + +#~ msgid "Font" +#~ msgstr "Font" + +#~ msgid "No Needed Sources Handling" +#~ msgstr "Ikke Brugbar Kilde Håndtering" + +#~ msgid "Enable auto drop No Needed Sources" +#~ msgstr "Aktiver auto dropning af ikke brugbare kilder" + +#~ msgid "Extended Dropping" +#~ msgstr "Udvidet Droppelse" + +#~ msgid "Drop sources anyway" +#~ msgstr "Drop kilde alligevel" + +#~ msgid "Enable Webserver" +#~ msgstr "Aktiver Webserver" + +#~ msgid "Use TCP ports instead of unix local sockets" +#~ msgstr "Brug TCP istedet for unix lokal socket" + +#~ msgid "External TCP port" +#~ msgstr "Ydre TCP port" + +#~ msgid "Enable password" +#~ msgstr "Aktiver kodeord" + +#~ msgid "Notify" +#~ msgstr "Påmind" + +#~ msgid "" +#~ "http://ocbmaurice.dyndns.org/pl/slist.pl/server.met?download/server-good." +#~ "met" +#~ msgstr "" +#~ "http://ocbmaurice.dyndns.org/pl/slist.pl/server.met?download/server-good." +#~ "met" + +#~ msgid "Servers List Window" +#~ msgstr "Server Vindue" + +#~ msgid "SharedFiles" +#~ msgstr "Delte Filer" + +#~ msgid "New Prefs" +#~ msgstr "Nye Indstillinger" + +#~ msgid "K" +#~ msgstr "K" + +#~ msgid "h" +#~ msgstr "t" + +#~ msgid "D" +#~ msgstr "D" + +#~ msgid "Error: Failed to open part.met file! (%s => %s)" +#~ msgstr "Kunne ikke åbne part.met fil! (%s => %s)" + +#~ msgid "Error: Invalid part.met fileversion! (%s => %s)" +#~ msgstr "Fejl: Invalid part.met filversion! (%s => %s)" + +#~ msgid "Error: %s (%s) is corrupt" +#~ msgstr "Fejl: %s (%s) er beskadiget" + +#~ msgid "Warning: %s might be corrupted" +#~ msgstr "Advarsel: %s er måske beskadiget" + +#~ msgid "ERROR while saving partfile: %s (%s => %s)" +#~ msgstr "Fejl ved gemning af partfil: %s (%s => %s)" + +#~ msgid ".part file not found" +#~ msgstr ".part fil ikke fundet" + +#~ msgid "Unable to open %s file - using .bak file.\n" +#~ msgstr "Kunne ikke indlæse %s - bruger .bak fil.\n" + +#~ msgid "Found corrupted part (%i) in %s" +#~ msgstr "Fandt beskadigede dele (%i) i %s" + +#~ msgid "Failed to delete %s" +#~ msgstr "Kunne ikke slette %s" + +#~ msgid "Finished downloading %s :-)" +#~ msgstr "Færdig med downloading af %s :-)" + +#~ msgid "Downloaded:" +#~ msgstr "Downloaded:" + +#~ msgid "A file with that name already exists, the file has been saved as %s" +#~ msgstr "En fil med dette navn findes allerede, filen er blevet gemt som %s" + +#~ msgid "Warning: Unable to hash downloaded part - hashset incomplete (%s)" +#~ msgstr "" +#~ "Advarsel: kunne ikke hashe downloadede del - hashsæt ikke færdig (%s)" + +#~ msgid "ERROR: Cannot write to disk" +#~ msgstr "Fejl: Kan ikke skrive til disk" + +#~ msgid "Downloaded part %i is corrupt :( (%s)" +#~ msgstr "Downloadet del %i er beskadiget :( (%s)" + +#~ msgid "ICH: Recovered corrupted part %i (%s)" +#~ msgstr "I.C.H.: Reddede beskadiget del %i (%s)" + +#~ msgid "Unexpected file error while writing %s : %s" +#~ msgstr "Uventet fil fejl ved skrivning %s : %s" + +#~ msgid "" +#~ "Partfilename: %s\n" +#~ "Parts: %d , %s: %d (%.1f%%)\n" +#~ msgstr "" +#~ "Partfilnavn: %s\n" +#~ "Dele: %d , %s: %d (%.1f%%)\n" + +#~ msgid "%d%% done (%s) - Transferring from %d sources" +#~ msgstr "%d%% færdig (%s) - Overfører fra %d kilder" + +#~ msgid "Available" +#~ msgstr "Tilgængelig" + +#~ msgid "Last Seen Complete :" +#~ msgstr "Sidst Færdig :" + +#~ msgid "Last Reception:" +#~ msgstr "Sidst Aktiv" + +#~ msgid "Executable (*)|*||" +#~ msgstr "Program (*)|*||" + +#~ msgid "Language change will not be applied until aMule is restarted." +#~ msgstr "Sprog ændringer vil ikke blive aktiveret før du genstarter aMule." + +#~ msgid "Update: Disabled" +#~ msgstr "Opdater: Inaktiv" + +#~ msgid "Update period: %i sec" +#~ msgstr "Opdaterings interval: %i sek" + +#~ msgid "Update period: %i secs" +#~ msgstr "Opdaterings interval: %i sek" + +#~ msgid "Tweaks" +#~ msgstr "Tuning" + +#~ msgid "Choose a folder for " +#~ msgstr "Vælg en mappe til " + +#~ msgid "%i days" +#~ msgstr "%i dage" + +#~ msgid "%i day" +#~ msgstr "%i dag" + +#~ msgid "Copy ED2k link to clipboard (HTML)" +#~ msgstr "Kopier ED2k-Link til udklipsholder (HTML)" + +#~ msgid "Close this search result" +#~ msgstr "Luk dette søge resultat" + +#~ msgid "Description: %s" +#~ msgstr "Beskrivelse: %s" + +#~ msgid "IP" +#~ msgstr "IP" + +#~ msgid "User: %i" +#~ msgstr "Bruger: %i" + +#~ msgid "Unable to retrieve serverlist" +#~ msgstr "Kunne ikke modtage serverliste" + +#~ msgid "Failed to download the serverlist from %s" +#~ msgstr "Kunne ikke hente serverlist fra %s" + +#~ msgid "Failed to load server.met!" +#~ msgstr "Fejl ved indlæsning af server.met!" + +#~ msgid "Invalid versiontag in server.met (0x%i , size %i)!" +#~ msgstr "Invalid versionsnummer i server.met (0x%i , størrelse %i)!" + +#~ msgid "Error: the file server.met is corrupted" +#~ msgstr "Fejl: filen server.met er beskadiget" + +#~ msgid "Connect to this server" +#~ msgstr "Forbind til denne server" + +#~ msgid "Add to static" +#~ msgstr "Tilføj til statitik" + +#~ msgid "Remove from static server list" +#~ msgstr "Fjern fra static server liste" + +#~ msgid "Preference" +#~ msgstr "Indstilling" + +#~ msgid "No Pref" +#~ msgstr "Ingen Indstilling" + +#~ msgid "Failed to open staticservers.dat" +#~ msgstr "Kunne ikke åbne staticservers.dat" + +#~ msgid "Added to static server list" +#~ msgstr "Tilføj til statik server liste" + +#~ msgid "Unknown server info received !" +#~ msgstr "Ukendt server info modtaget !" + +#~ msgid "Connecting to %s (%s:%i)..." +#~ msgstr "Forbinder til %s (%s:%i)..." + +#~ msgid "Error while connecting to %s (%s:%i): %d" +#~ msgstr "Fejl ved forbindelse til %s (%s:%i): %d" + +#~ msgid "Error in serversocket: %s (%s:%i): %u" +#~ msgstr "Fejl i Serversocket: %s (%s:%i): %u" + +#~ msgid "This is " +#~ msgstr "Dette er " + +#~ msgid " (based on " +#~ msgstr " (baseret på " + +#~ msgid "Visit http://www.amule.org to check if a new version is available.\n" +#~ msgstr "" +#~ "Besøg http://www.amule.org for at tjekke om der er en ny version " +#~ "tilgængelig.\n" + +#~ msgid "Please enter a serveraddress" +#~ msgstr "Indtast venligst en serveradresse" + +#~ msgid "Incomplete serverport: Please enter a serverport" +#~ msgstr "forkert serverport: Indsæt en serverport" + +#~ msgid "Server not added!" +#~ msgstr "Server ikke tilføjet!" + +#~ msgid "Low ID" +#~ msgstr "Lav ID" + +#~ msgid "High ID" +#~ msgstr "høj ID" + +#~ msgid "Loading..." +#~ msgstr "Henter..." + +#~ msgid "Permission" +#~ msgstr "Rettighed" + +#~ msgid "Public" +#~ msgstr "Offentlig" + +#~ msgid "Friends only" +#~ msgstr "Kun venner" + +#~ msgid "Locked" +#~ msgstr "Låst" + +#~ msgid "Permissions" +#~ msgstr "Tilladelser" + +#~ msgid "Change this file's comment..." +#~ msgstr "Ændre kommentaren til denne fil" + +#~ msgid "Auto [Re]" +#~ msgstr "Auto [Re]" + +#~ msgid "Hidden" +#~ msgstr "Skjult" + +#~ msgid "You cannot change permissions while a file is still downloading!" +#~ msgstr "Du kan ikke ændre rettigheder mens filen stadig downloader!" + +#~ msgid "%s (%s:%i) appears to be full" +#~ msgstr "%s (%s:%i) ser ud til at være fuld" + +#~ msgid "Connecting to %s (%s:%i ) failed." +#~ msgstr "Forbindelse til %s (%s:%i ) fejlede." + +#~ msgid "Connection attempt to %s (%s:%i ) timed out" +#~ msgstr "Forbindelses forsøg til %s (%s:%i ) tid gik" + +#~ msgid "Filtered: %i" +#~ msgstr "Filtreret: %i" + +#~ msgid "Downloaded Data (Session (Total)): %s (%s)" +#~ msgstr "Downloadet Data (session (Total)): %s (%s)" + +#~ msgid "Found Sources: %i" +#~ msgstr "Fundne Kilder: %i" + +#~ msgid "Active Downloads (chunks): %i" +#~ msgstr "Aktive Downloades: %i" + +#~ msgid "Uploaded Data (Session (Total)): %s (%s)" +#~ msgstr "Uploadet Data (Session (Total)): %s (%s)" + +#~ msgid "Active Uploads: %i" +#~ msgstr "Aktive Uploads: %i" + +#~ msgid "Waiting Uploads: %i" +#~ msgstr "Ventende Uploads: %i" + +#~ msgid "Total successful upload sessions: %i" +#~ msgstr "Færdige upload sessioner (Total): %i" + +#~ msgid "Total failed upload sessions: %i" +#~ msgstr "Fejlede upload sessioner (Total): %i" + +#~ msgid "Average Downloadrate (Session): %.2f kB/s" +#~ msgstr "Gennemsnitlig Downloadhastighed (Session): %.2f kB/s" + +#~ msgid "Average Uploadrate (Session): %.2f kB/s" +#~ msgstr "Gennemsnitlig Uploadhastighed (Session): %.2f kB/s" + +#~ msgid "Max Downloadrate Average (Session): %.2f kB/s" +#~ msgstr "Max Gennemsnitlig Download Hastighed (Session): %.2f kB/s" + +#~ msgid "Max Downloadrate (Session): %.2f kB/s" +#~ msgstr "Max Download Hastighed (Session): %.2f kB/s" + +#~ msgid "waiting for transfer..." +#~ msgstr "Venter på overførsel..." + +#~ msgid "waiting for connection..." +#~ msgstr "venter på forbindelse..." + +#~ msgid "%s Not available" +#~ msgstr "%s Ikke tilgængelig" + +#~ msgid "Number of Shared Files: %i" +#~ msgstr "Antal Delte Filer: %i" + +#~ msgid "eMule: %i (%1.1f%%)" +#~ msgstr "eMule: %i (%1.1f%%)" + +#~ msgid "aMule: %i (%1.1f%%)" +#~ msgstr "aMule: %i (%1.1f%%)" + +#~ msgid "lMule/xMule: %i (%1.1f%%)" +#~ msgstr "lMule/xMule: %i (%1.1f%%)" + +#~ msgid "eDonkeyHybrid: %i (%1.1f%%)" +#~ msgstr "eDonkeyHybrid: %i (%1.1f%%)" + +#~ msgid "eDonkey: %i (%1.1f%%)" +#~ msgstr "eDonkey: %i (%1.1f%%)" + +#~ msgid "cDonkey: %i (%1.1f%%)" +#~ msgstr "cDonkey: %i (%1.1f%%)" + +#~ msgid "Old MLDonkey: %i (%1.1f%%)" +#~ msgstr "Gammel MLDonkey: %i (%1.1f%%)" + +#~ msgid "New MLDonkey: %i (%1.1f%%)" +#~ msgstr "Ny MLDonkey: %i (%1.1f%%)" + +#~ msgid "Unknown: %i" +#~ msgstr "Ukendt: %i" + +#~ msgid "Working Servers" +#~ msgstr "Virkende Servere" + +#~ msgid "Failed Servers" +#~ msgstr "Fejlede Servere" + +#~ msgid "Deleted Servers" +#~ msgstr "Slettede Servere" + +#~ msgid "Users on Working Servers" +#~ msgstr "Brugere På Virkende Servere" + +#~ msgid "Files on Working Servers" +#~ msgstr "Filer På Virkende Servere" + +#~ msgid "Total Users" +#~ msgstr "Antal Brugere Total" + +#~ msgid "Total Files" +#~ msgstr "Antal Filer Total" + +#~ msgid "Active Connections (estimate)" +#~ msgstr "Aktive Forbindelser (anslået)" + +#~ msgid "Max Connection Limit Reached" +#~ msgstr "Max Forbindelses Grænse Nået" + +#~ msgid "Average Connections (estimate)" +#~ msgstr "Gennemsnitlige Forbindelser (anslået)" + +#~ msgid "Peak Connections (estimate)" +#~ msgstr "Peak Forbindelser (anslået)" + +#~ msgid "Not Found" +#~ msgstr "Ikke Fundet" + +#~ msgid "Actual Speed Limits:" +#~ msgstr "Nuværende Hastigheds Grænser:" + +#~ msgid "DL: " +#~ msgstr "DL: " + +#~ msgid " kb/s " +#~ msgstr " kb/s " + +#~ msgid "UP: " +#~ msgstr "UP: " + +#~ msgid " kb/s" +#~ msgstr " kb/s" + +#~ msgid "Nick: " +#~ msgstr "Brugernavn: " + +#~ msgid "Nick: Not Ready" +#~ msgstr "Brugernavn: Ikke Klar" + +#~ msgid "Hash: " +#~ msgstr "Hash: " + +#~ msgid "Hash: Not Ready" +#~ msgstr "Hash: Ikke Klar" + +#~ msgid "ID: Not Connected" +#~ msgstr "ID: Ikke Forbundet" + +#~ msgid "IP: " +#~ msgstr "IP: " + +#~ msgid "TCP Port: " +#~ msgstr "TCP Port: " + +#~ msgid "UDP Port: " +#~ msgstr "UDP Port: " + +#~ msgid "ServerName: Not Connected" +#~ msgstr "ServerNavn: Ikke Forbundet" + +#~ msgid "ServerIP: Not Connected" +#~ msgstr "ServerIP: Ikke Forbundet" + +#~ msgid "Shared Files: " +#~ msgstr "Delte Filer" + +#~ msgid "Queued Clients: " +#~ msgstr "Klienter i Kø: " + +#~ msgid "Total DL: " +#~ msgstr "Total DL: " + +#~ msgid " GB" +#~ msgstr " GB" + +#~ msgid "Total UP: " +#~ msgstr "Total UP: " + +#~ msgid "Personal Infos" +#~ msgstr "Personlig Info" + +#~ msgid "Show" +#~ msgstr "Vis" + +#~ msgid "Hide" +#~ msgstr "Skjul" + +#~ msgid "All To Max Speed" +#~ msgstr "Alt Til Max Hastighed" + +#~ msgid "All To Min Speed" +#~ msgstr "Alt Til Min Hastighed" + +#~ msgid "Disconnect from server" +#~ msgstr "Afbryd fra server" + +#~ msgid "aMule for Linux" +#~ msgstr "aMule til Linux" + +#~ msgid "Error while processing incoming extended protocol UDP Packet" +#~ msgstr "Fejl i inkomende protocol UDP pak" + +#~ msgid "" +#~ "Client '%s' caused error while creating package (%s) - disconnecting " +#~ "client" +#~ msgstr "" +#~ "Klient '%s' lavede fejl ved oprettelse af pakker (%s) - afbryder klient" + +#~ msgid "requested file not found" +#~ msgstr "anmodet fil ikke fundet" + +#~ msgid "" +#~ "Client '%s' seems to be an aggressive client and is banned from the " +#~ "uploadqueue" +#~ msgstr "" +#~ "Klient '%s' ser ud til at være en aggresiv klient og er banlyst fra " +#~ "upload køen" + +#~ msgid "%s [%s:%i] using %s removed : invalide eMule client" +#~ msgstr "%s [%s:%i] bruger %s fjernet : invalid eMule klient" + +#~ msgid "%s [%s:%i] using %s removed : suspicious mod string change" +#~ msgstr "%s [%s:%i] bruger %s fjernet : mærklig mod string ændring" + +#~ msgid "Wizard" +#~ msgstr "Assistent" + +#~ msgid "Down (kbit/s)" +#~ msgstr "Ned (kbit/s)" + +#~ msgid "Up (kbit/s)" +#~ msgstr "Up (kbit/s)" + +#~ msgid "Custom" +#~ msgstr "manuel" + +#~ msgid "(enter below!)" +#~ msgstr "(indsæt nedenfor!)" + +#~ msgid "56-k Modem" +#~ msgstr "56k-Modem" + +#~ msgid "ISDN" +#~ msgstr "ISDN" + +#~ msgid "ISDN 2x" +#~ msgstr "ISDN 2x" + +#~ msgid "xDSL" +#~ msgstr "xDSL" + +#~ msgid "Cable" +#~ msgstr "Kabelmodem" + +#~ msgid "T1" +#~ msgstr "T1" + +#~ msgid "T3+" +#~ msgstr "T3+" + +#~ msgid "100 Mbits" +#~ msgstr "100 Mbits" + +#~ msgid "155 Mbits (ATM)" +#~ msgstr "155 Mbits (ATM)" diff --git a/po/de.po b/po/de.po new file mode 100644 index 00000000..7ef774bb --- /dev/null +++ b/po/de.po @@ -0,0 +1,7510 @@ +# translation of de.po to +# aMule i18n resource file. +# Copyright (C) 2004 aMule Team +# This file is distributed under the same license as the aMule package. +# +# Kry , 2004. +# Stefan Baldus , 2004, 2005. +# Michael Weyershäuser , 2005. +# ihmselbst , 2005, 2006. +# Werner Mahr , 2007. +msgid "" +msgstr "" +"Project-Id-Version: de\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2008-02-26 10:56+0100\n" +"Last-Translator: Johannes Krampf \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Das angegebene Passwort darf nicht leer sein." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Ungültiges Passwort, keine MD5-Prüfsumme!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Verbindungsfehler" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "EC-Verbindung fehlgeschlagen. Leere Antwort." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "ExternalConn: Zugriff verweigert wegen:" + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "ExternalConn: Zugriff verweigert" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "ExternalConn: Falsche Antwort vom Server. Verbindung beendet." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Gelungen! Verbindung aufgebaut zu aMule " + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Verbindung hergestellt." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Prüfsumme erstellen" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Wird abgeschlossen" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Vollständig" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Pausiert" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Fehlerhaft" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Herunterladen" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Warten" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Beginne, MD4- und AICH-Prüfsummen zu berechnen für Datei %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Beginne, MD4-Prüfsumme zu berechnen für Datei %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Beginne, AICH-Prüfsumme zu berechnen für Datei %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "Wandle alte AICH-Prüfsummensätze von '%s' um in 64b in '%s'." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "WARNUNG: Der Dateiname '%s' ist ungültig und wurde in '%s' umbenannt." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "WARNUNG: Die Datei '%s' gibt es schon, neue Datei in '%s' umbenannt." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" +"WARNUNG: Konnte original '%s' nach Erstellen des Backups nicht entfernen" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "WARNUNG: Fehler beim Löschen von %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Konnte Liste der freigegebenen Dateien von Benutzer '%s' nicht abrufen" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Unbekannt" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (Fake eMule version %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (Fake eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (Fake eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (basiert auf eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Spitzname: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, c-format +msgid "Requested: %s\n" +msgstr "Angefordert: %s\n" + +#: src/BaseClient.cpp:1878 +#, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Dateistatistik für diese Sitzung: %d von %d Anfrage akzeptiert, %s " +"übertragen\n" +msgstr[1] "" +"Dateistatistik für diese Sitzung: %d von %d Anfragen akzeptiert, %s " +"übertragen\n" + +#: src/BaseClient.cpp:1881 +#, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Dateistatistik für alle Sitzungen: %d von %d Anfrage akzeptiert, %s " +"übertragen\n" +msgstr[1] "" +"Dateistatistik für alle Sitzungen: %d von %d Anfragen akzeptiert, %s " +"übertragen\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Unbekannte Datei angefordert" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "Client %s auf IP:Port %s:%d benutzt %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Benutzername" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Freunde" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Zeige &Details" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Freund hinzufügen" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Freund entfernen" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "&Message senden" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Dateien ansehen" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Friendslot erstellen" + +#: src/FriendListCtrl.cpp:273 +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Den markierten Freund wirklich löschen?" + +#: src/FriendListCtrl.cpp:275 +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Die markierten Freunde wirklich löschen?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Abbruch" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"Du darfst nicht mehr als einen Friendslot vergeben.\n" +" Nur ein Slot wurde vergeben." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Mehrfachauswahl" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Dateiname" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Größe" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Suchtyp" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Priorität" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "Datei-ID" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Anfragen" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Akzeptierte Anfragen" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Übertragene Datenmenge" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Verteilungsfaktor" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Erhaltene Teile" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Vollständige Quellen" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Verzeichnispfad" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Freigaben" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Sehr niedrig" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Niedrig" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normal" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Hoch" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Sehr hoch" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Release" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Automatisch" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Kommentar/Bewertung abgeben" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Kommentar/Bewertung ändern" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Umbenennen" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Füge Dateien aus Sammlung zur Übertragungsliste" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Kopiere Magnet-URL &URI in Zwischenablage" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Kopiere eD2k &Link in die Zwischenablage" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Kopiere eD2k-Verweis in die Zwischenablage (&Source)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "Kopiere eD2k-Verweis in Zwischenablage (Source) (&With Crypt options)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "ED2k-Link in Zwischenablage kopieren (&Hostname)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" +"Kopiere eD2k-Verweis in Zwischenablage (Hostname) (With &Crypt options)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Kopiere eD2k-Verweis in die Zwischenablage (&AICH Info)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Feedback in die Zwischenablage kopieren" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "" +"Du brauchst eine hohe ID (\"HighID\"), um einen gültigen Quellenverweis zu " +"erstellen" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Warnung" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Freigegebene Dateien (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[PartFile]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Einen neuen Namen für diese Datei eingeben:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Datei umbenennen" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Wiederaufnahme des Hochladens der Datei '%s'." + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Aussetzen des Hochladens der Datei '%s'." + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: Suchbegriff zu kurz" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Fehler: Kann nicht auf TCP-Port lauschen." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "Anfrage mit folgendem Fehler gescheitert: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "Anfrage ist mit unbekanntem Fehler gescheitert." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "Index-Datei nicht gefunden: " + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Konnte Websocketthread nicht erstellen\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Webserver: gestartet\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Sitzung abgelaufen - fordere Anmeldung\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Sitzung ok, angemeldet\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Sitzung ok, nicht angemeldet\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Keine Sitzung geöffnet - fordere Anmeldung\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Sitzung eröffnet - fordere Anmeldung\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Anfrage verarbeiten [original]: " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Prüfe Passwort\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Passwort-Prüsumme ungültig\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Passwort ok\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Falsches Passwort\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "Du hast kein Passwort angegeben. Leeres Passwort ist nicht erlaubt.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Fordere Abmeldung\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Anfrage verarbeiten [umgeleitet]: " + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Lädt Vorlage " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Webserver-HTTP-Port" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Benütze UPnP-Port-Weiterleitung zu Webserver-Port" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "UPnP-Port" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Benutze gzip-Kompression" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Vollzugriff-Passwort für den Webserver" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Gast-Passwort für den Webserver" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Erlaube Gastzugriff" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Verweigere Gastzugriff" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "Lade/Speichere Webserver-Einstellungen von/zu entferntem aMule" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "aMule-Konfigurationsdateipfad. NICHT DIREKT BENUTZEN!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "PHP-Interpreter deaktivieren (überholt)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Rekompiliere PHP-Seiten bei jeder Anfrage" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "aMule Webserver" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Nicht verfügbar" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Niemals" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Lädt herunter..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Einstellungen" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "Verzeichnis mit der Datei amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Durchsuchen" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Hier das Verzeichnis zur Datei amulesig.dat angeben" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Aktualisierungsintervall in Sekunden" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Erzeuge bei jeder Aktualisierung ein Statistikbild" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "Hier das Zielverzeichnis zum Erstellen des Statistikbildes angeben" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Statistikbild periodisch auf einen FTP-Server hochladen" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "FTP-URL" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "FTP-Pfad" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Hier die URL deines FTP-Servers eingeben" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" +"Hier das Zielverzeichnis für das Statistikbild auf dem FTP-Server angeben" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Benutzer" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Passwort" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Hier den Benutzernamen zur Anmeldung auf deinem FTP-Server eingeben" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Hier das Benutzerpasswort zur Anmeldung auf dem FTP-Server eingeben" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "FTP-Aktualisierungsintervall in Minuten" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Bestätigen" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Verzeichnis mit deiner Signaturdatei" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Verzeichnis zum Erzeugen des Statistikbildes" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i Tag(e) %i Std. %i Min. %i Sek." + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, die aMule-Onlinestatistik" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Willkommen!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Höchste Downloadrate seit wxCas läuft" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "Höchste Downloadrate während wxCas jemals lief" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Zurücksetzen" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "System" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Automatische Aktualisierung beenden" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Speichere Onlinestatistikbild" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Drucke Onlinestatistikbild" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Einstellungen" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "Über wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Beginne automatische Aktualisierung" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Automatische Aktualisierung angehalten" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Automatische Aktualisierung begonnen" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Speichere Statistikbild" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Keine Verarbeitungsmethode für diesen Dateityp." + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "Datei wurde nicht gespeichert" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "aMule-Onlinestatistik" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Es gab ein Problem beim Drucken.\n" +"Vielleicht ist der aktuelle Drucker nicht richtig eingestellt?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Drucke" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, aMule Online-Signatur-Statistiken\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Basierend auf CAS von Pedro de Oliveira \n" +"\n" +"Vertrieben unter der GPL" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Oh-oh, aMule läuft nicht..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule läuft" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule läuft, aber nicht verbunden" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule verbindet gerade...." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Oh-oh, aMule-Status ist unbekannt..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " läuft seit " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr "ist angehalten!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " ist nicht verbunden!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " verbindet sich..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " macht irgendetwas Merkwürdiges, bitte überprüfen!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " ist verbunden mit " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "ok" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "firewalled" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "aus" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " ist auf " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +msgid " with " +msgstr " mit " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Gesamtdownload: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Upload: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Sitzung Download: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Download: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s, Upload: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +msgid " kB/s" +msgstr " kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Freigegeben: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " Datei(en), Clients in Warteschlange: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Zeit:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " auf " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Durchschnittliche Systemlast (1-5-15 min): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Systemlaufzeit: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uT %02uStd %02uMin %02uSek" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uStd %02uMin %02uSek" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02uMin %02uSek" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02uSek" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "Hohe ID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "Niedrige ID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Nicht verbunden" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +msgid "Cancelled !" +msgstr "Abgebrochen !" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Konnte '%s' nicht öffnen" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "Die Datei '%s' ist zu groß für den Esel: erlaubtes Maximum ist 4 GiB." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Eingabeparameter" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Datei für Prüfsummenberechnung" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Dieser Datei optionale URLs hinzufügen" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Hier die Datei zum Erzeugen des eD2k-Verweises eingeben." + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Hier die URL eingeben, die zum eD2k-Vereis hinzugefügt werden soll. Füge am " +"Ende einen / ein, damit aLinkCreator den momentanen Dateinamen übernimmt." + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Hinzufügen" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Entferne" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Leere" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Erstelle Verweis mit Part-Prüfsummen" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Hilft, neue und seltene Dateien schneller zu verteilen auf Kosten einer " +"erhöhten Verweisgröße" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "MD4-Dateiprüfsumme" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "eD2k-Dateiprüfsumme" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "eD2k-Verweis" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Start" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Speichern" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "In die Zwischenablage kopieren" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Schließen" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Eine Datei zum Erstellen ihres eD2k-Verweises öffnen" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Kopiere erstellten eD2k-Verweis in die Zwischenablage" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Speichere erstellten eD2k-Verweis in Datei" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "Über aLinkCreator" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Datei zum Erstellen des eD2k-Verweises auswählen" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "Derzeit nichts zu Kopieren!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Datei zu dem errechneten eD2k-Verweis auswählen" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Konnte Datei nicht öffnen " + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Bitte keinen leeren Dateinamen eingeben" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "Momentan nichts zu speichern!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, der aMule eD2k-Verweis-Ersteller\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps von http://www.everaldo.com\n" +"und http://www.icomania.com\n" +"und http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Vertrieben unter der GPL" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Prüfsummenberechnung..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Fertig in %.2f s" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "Du hast diese URL bereits eingegeben!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Bitte keine leere URL eingeben" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "Verarbeite Datei Nummer %u: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "Du willst Part-Prüfsummen erstellen (nur bei Dateien > 9,5 MiB)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Bitte warten... " + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> Datei existiert nicht!\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, der aMule-eD2k-Verweis-Ersteller" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Auto [Ni]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Auto [No]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Auto [Ho]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Verbinden" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Anfragen" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Verbunden über Server" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Warteschlange voll" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "in Warteschlange" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Übertragen" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Empfange Prüfsummensatz" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Keine benötigten Teile" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Verbindung LowID zu LowID unmöglich" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Zu viele Verbindungen" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Verbinde über Kad" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Zu viele Kad-Verbindungen" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Gebannt" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Verbindungsfehler" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Entfernte Warteschlange voll" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "Alter MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "Neuer MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "eMule-kompatibel" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Lokaler Server" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Entfernter Server" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Quellenaustausch" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Passiv" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Verweis" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Einstiegsquellen" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Systemvorgabe" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Arabisch" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Baskisch" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Bulgarisch" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Katalanisch" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Chinesisch (vereinfacht)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Chinesisch (traditionell)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Kroatisch" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "Tschechisch" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Dänisch" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Holländisch" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Englisch (UK)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Estnisch" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Finnisch" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Französisch" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Galizisch" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Deutsch" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "Griechisch" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Ungarisch" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Italienisch" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Italienisch (Schweiz)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "Japanisch" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Koreanisch" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "Litauisch" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "Norwegisch" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Polnisch" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portugiesisch" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Portugiesisch (Brasilianisch)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Russisch" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Slowenisch" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Spanisch" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "Schwedisch" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Türkisch" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Kann ausgewählten Browser nicht bestimmen!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" +"TCP-Port kann nicht größer als 65532 sein, da der Server-UDP-Port=TCP-Port+3 " +"ist" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Standard-Port wird verwendet (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Servername" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Adresse" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Port" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Beschreibung" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Benutzer" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Dateien" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Fehlgeschlagen" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Statisch" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Version" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Du möchtest einen Server löschen, mit dem Du verbunden bist. Bitte trenne " +"Dich zuerst. Der Server wurde NICHT gelöscht." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Info" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(Unbekannter Name)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Wirklich den statischen Server '%s' löschen?" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Ja" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Nein" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Konnte '%s' nicht öffnen" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Server (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Server" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Verbinde mit Server" + +#: src/ServerListCtrl.cpp:428 +msgid "Mark server as static" +msgstr "Markiere den Server als statisch" + +#: src/ServerListCtrl.cpp:429 +msgid "Mark server as non-static" +msgstr "Markiere den Server als nicht statisch" + +#: src/ServerListCtrl.cpp:431 +msgid "Mark servers as static" +msgstr "Markiere die Server als statisch" + +#: src/ServerListCtrl.cpp:432 +msgid "Mark servers as non-static" +msgstr "Markiere dieServer als nicht statisch" + +#: src/ServerListCtrl.cpp:438 +msgid "Remove server" +msgstr "Entferne Server" + +#: src/ServerListCtrl.cpp:440 +msgid "Remove servers" +msgstr "Entferne die Server" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Alle Server entfernen" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Kopiere eD2k-Verweis in die Zwischenablage" + +#: src/ServerListCtrl.cpp:449 +msgid "Copy ED2k links to clipboard" +msgstr "Kopiere eD2k-Verweise in die Zwischenablage" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Wiederverbinden mit Server" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Wirklich alle Server löschen?" + +#: src/ServerListCtrl.cpp:570 +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Wirklich den markierten Server löschen?" + +#: src/ServerListCtrl.cpp:572 +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Wirklich die markierten Server löschen?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Ausgeschaltet [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "Dies ist aMule %s, basierend auf eMule." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "Läuft auf %s" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" +"Besuche http://www.amule.org um zu sehen, ob eine neue Version verfügbar ist." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Schwerer Fehler: Es konnte kein Zeitgeber erstellt werden." + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "aMule-Fernbedienung " + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Schnappschuss:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "portabler P2P-Client basierend auf eMule\n" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "Webseite: http://www.amule.org \n" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "Forum: http://forum.amule.org \n" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" +" FAQ: http://wiki.amule.org \n" +"\n" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr " Kontakt: admin@amule.org (administrative Fragen) \n" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr " Teile von aMule basieren auf \n" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "Kademlia: Peer-to-peer Weiterleitung basierend auf der XOR Funktion.\n" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr " Copyright (C) 2002 Petar Maymounkov\n" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr " http://kademlia.scs.cs.nyu.edu\n" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Nachricht" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Statustext" + +#: src/amuleDlg.cpp:666 +msgid "ED2K: Connecting" +msgstr "ED2k: Baue Verbindung auf" + +#: src/amuleDlg.cpp:670 +msgid "ED2K: Disconnected" +msgstr "ED2K: Verbindung getrennt" + +#: src/amuleDlg.cpp:676 +msgid "Kad: Firewalled" +msgstr "KAD: Firewalled" + +#: src/amuleDlg.cpp:680 +msgid "Kad: Connected" +msgstr "Kad: Verbunden" + +#: src/amuleDlg.cpp:685 +msgid "Kad: Connecting" +msgstr "Kad: Baue Verbindung auf" + +#: src/amuleDlg.cpp:689 +msgid "Kad: Off" +msgstr "Kad: " + +#: src/amuleDlg.cpp:718 +msgid "Stop the current connection attempts" +msgstr "Beendet die derzeitigen Verbindungsversuche" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Trennen" + +#: src/amuleDlg.cpp:722 +msgid "Disconnect from the currently connected networks" +msgstr "Von den momentan verbundenen Netzwerken trennen." + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Verbinden" + +#: src/amuleDlg.cpp:726 +msgid "Connect to the currently enabled networks" +msgstr "Mit den aktuell aktivierten Netzwerken verbinden." + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Up: %.1f(%.1f) | Down: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Up: %.1f | Down: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | Verbunden)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | Getrennt)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "aMule wirklich beenden?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Beenden bestätigen" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Konnte den Befehl zur Ausführung des Browsers nicht ermitteln." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "Verkleidungs(\"Skin\")-Verzeichnis '%s' existiert nicht" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "Warnung: Öffnen der Verkleidungsdatei '%s' zum Lesen nicht möglich" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Netzwerke" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Übersicht der verwendeten Netzwerke" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Suchen" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Dateisuche in den verbundenen Netzwerken" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Übertragungen" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Datentransfer - Zeigt Up- und Downloads, Warteschlangen usw." + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Übersicht der freigegebenen Dateien" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Nachrichten" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Nachrichten, Chat, Freundesliste" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Statistiken" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Diverse Statistiken über Up- und Download, Verbindungen, Clients usw." + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Hier können die verschiedenen Einstellungen vorgenommen werden." + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Importiere" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "Das Importierwerkzeug für Part-Dateien" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "Über" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "Über/Hilfe - Hinweise zur Version usw." + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Allgemein" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Verbindung" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Proxy" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Nachrichtenfilter" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Fernsteuerung" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Onlinesignatur" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Verzeichnisse" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Sicherheit" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "GUI-Einstellungen" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Feinabstimmung" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Ereignisse" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Fehlersuche (Debugging)" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Benutzerdefiniert" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"aMule muss neu gestartet werden, um diese Änderungen zu übernehmen:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- TCP-Port geändert.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- UDP-Port geändert.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"Deine Auto-Update-Serverliste ist leer.\n" +"'Automatisches Aktualisieren der Serverliste beim Start' wird deaktiviert." + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"Du hast die externen Verbindungen aktiviert, aber kein Passwort angegeben.\n" +"Externe Verbindungen können nur aktiviert werden, wenn ein gültiges Passwort " +"angegeben wird." + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- Sprache geändert.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- Temp-Verzeichnis geändert.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Up: 0.0 | Down: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"Beide Netzwerke, eD2k und Kad, sind deaktiviert.\n" +"Mindestens eins davon muss aktiviert sein, um sich verbinden zu können." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"Kad wird nicht starten, solange der UDP-Port deaktiviert ist.\n" +"Bitte UDP-Port aktivieren, oder Kad ausschalten." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"aMule MUSS jetzt neu gestartet werden.\n" +"Wenn du jetzt nicht neustartest, beklage dich nicht, wenn irgendwas übles " +"passiert.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "WARNUNG" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"Deine Auto-Update-Serverliste ist leer.\n" +"Bitte gib mindestens eine URL zu einer gültigen server.met ein.\n" +"Drücke dazu den Knopf \"Liste\" neben diesem Kontrollkästchen." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "Temporäre Dateien" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Fertige Dateien" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Online-Signaturen" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Wähle einen Ordner für %s" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Suche nach .wav-Datei" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "WAV-Dateien (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Suche nach einem Videoplayer" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Browser-Wahl" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Ausführbar%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Serverliste bearbeiten" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Hier URL's für server.met-Dateien eintragen.\n" +"Nur eine URL pro Zeile!" + +#: src/PrefsUnifiedDlg.cpp:980 +#, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Update-Verzögerung: %d Sekunde" +msgstr[1] "Update-Verzögerung: %d Sekunden" + +#: src/PrefsUnifiedDlg.cpp:987 +#, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Zeit für Durchschnittslinie: %d Minute" +msgstr[1] "Zeit für Durchschnittslinie: %d Minuten" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Verbindungsgraphenskala: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Aktualisierungsverzögerung: %d Sekunde" +msgstr[1] "Aktualisierungsverzögerung: %d Sekunden" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Dateipuffergröße: %d Byte" +msgstr[1] "Dateipuffergröße: %d Bytes" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Upload-Warteschlangengröße: %d Client" +msgstr[1] "Upload-Warteschlangengröße: %d Clients" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Server-Wiederverbindungsintervall: %d Minute" +msgstr[1] "Server-Wiederverbindungsintervall: %d Minuten" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Server-Wiederverbindungsintervall: Aus" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Führe Kommando aus aufgrund Ereignis '%s'" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Aktiviere Befehlsausführung im Kern" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Kern-Befehl:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Aktiviere Befehlsausführung in GUI" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "GUI-Befehl:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "Die folgenden Variablen werden ersetzt:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Unerlaubter Verbindungsversuch. Verbindung getrennt." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Externe Verbindung getrennt." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "Externe Verbindungen deaktiviert. Leeres Passwort!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "Externe Verbindungen in der Konfigurationsdatei deaktiviert" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Neue externe Verbindung akzeptiert" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "Fehler: Konnte keine neue externe Verbindung akzeptieren" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" +"Externe Verbindung verweigert. Kein Passwort in den Einstellungen angegeben!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "Verbinde mit Client: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Unbekannte Version" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"Unkorrekte EC-Versions-ID; es könnte eine binär-Inkompatibilität vorliegen. " +"Benutze Kern und Fernsteuerung desselben Schnappschusses." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" +"Du kannst nicht von einer beliebigen SVN-Version zu einer Release-Version " +"verbinden! *seufz* möglichen Absturz verhindert" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "Authentifizierung fehlgeschlagen." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Ungültige Protokollversion." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Fehlende Protokollversionsmarke." + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Ungültige Anfrage, Du solltest Dich zuerst authentifizieren." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Zugang gewährt." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" +"Fernsteuerungs-Part-Datei-Kommando gescheitert: Dateiprüfsumme nicht " +"gefunden: %s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "Dateiprüfsumme nicht gefunden: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "OOPS! OpCode-Verarbeitungsfehler!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Server nicht hinzugefügt" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "Server nicht gefunden: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "Der zu entfernende Server muss angegeben sein" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "eD2k ist in den Einstellungen deaktiviert." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "Suche läuft gerade. Aktualisiere gleich die Ergebnisse!" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "Websuche mit der Fernsteuerungsschnittstelle macht keinen Sinn." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad ist in den Einstellungen deaktiviert." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Keine Punkte für Graphen." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "Der Client ist nicht nicht für diese Detailstufe eingestellt." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "Externe Verbindungen: Herunterfahren gefordert" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Wird bereits heruntergefahren." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "Externe Verbindungen: Füge hinzu Verweis '%s'." + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Ungültiger Verweis oder schon auf der Liste" + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "Datei nicht gefunden." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Ungültiger Dateiname." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Datei kann nicht umbenannt werden." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Bereits mit eD2k verbunden." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Verbinde mit eD2k..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Bereits mit Kad verbunden." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Verbinde mit Kad..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Alle Netzwerke sind deaktiviert." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Von eD2k getrennt." + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Von Kad getrennt." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "Externe Verbindungen: ungültigen Opcode empfangen: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "Ungültiger OpCode (falsche Protokollversion?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" +"Öffnen der Datei '%s' fehlgeschlagen, sie wird aus der Liste freigegebener " +"Dateien entfernt." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "Prüfsummensatz angefordert für unbekannte Datei '%s'" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "Befehl `%s' mit PID `%d' abgeschlossen mit Status-Code `%d'." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "Server nicht hinzugefügt: Keine IP-Adresse oder Hostname angegeben." + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "Server nicht hinzugefügt: Ungültiger Server-Port angegeben." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "eD2k-Status:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Verbunden" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Port" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Kademlia-Status:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Läuft" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Status:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Verbindung getrennt" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Verbindungszustand:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Firewalled" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "OK" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Firewalled-Status: " + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Verbunden mit Kumpel(\"Buddy\")" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "Kein Kumpel(\"Buddy\")" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Benutzer im Schnitt:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "Dateien im Schnitt:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "Läuft nicht" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Laufzeit: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Übertragungen" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Uploads" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Hochgeladene Daten (Sitzung (Gesamt)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Gesamt-Overhead (Pakete): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Dateianfragen-Overhead (Pakete): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "Quellenaustausch-Overhead (Pakete): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Server-Overhead (Pakete): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Kad-Overhead (Pakete): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Laufende Uploads: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Wartende Uploads: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Erfolgreiche Upload-Sitzungen insgesamt: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Fehlgeschlagene Upload-Sitzungen insgesamt: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Gesamte Upload-Zeit: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Downloads" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Heruntergeladene Daten (Sitzung (Gesamt)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Gefundene Quellen: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Laufende Downloads (Chunks): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Sitzung UL:DL-Rate (Gesamt): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Durchschnittliche Download-Rate (Sitzung): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Durchschnittliche Upload-Rate (Sitzung): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Max. Download-Rate (Sitzung): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Max. Upload-Rate (Sitzung): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Server-Wiederverbindungen: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Zeit seit erster Übertragung: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Verbunden mit Server seit: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Aktive Verbindungen (geschätzt): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Verbindungslimit erreicht: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Durchschnittliche Verbindungen (geschätzt): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Höchste Verbindungsanzahl (geschätzt): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Clients" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Gefiltert" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Gesamt: %i Bekannt: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Server" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Funktionierende Server: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Ausgefallene Server: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Gesamt: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Gelöschte Server: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Gefilterte Server: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Benutzer auf funktionierenden Servern: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "Dateien auf funktionierenden Servern: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Benutzer insgesamt: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "Dateien insgesamt: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Server-Auslastung: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Anzahl freigegebener Dateien: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Gesamtgröße der freigegebenen Dateien: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Durchschnittliche Dateigröße: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "LowID: %u (%.2f%% Gesamt %.2f%% Bekannt)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "SecIdent An/Aus: %u (%.2f%%) : %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Betriebssystem" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "Nicht empfangen" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Ausschneiden" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Kopieren" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Einfügen" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Alles auswählen" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "Kad-Suche kann nicht ausgeführt werden, wenn Kad nicht läuft" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "eD2k-Suche kann nicht ausgeführt werden, wenn eD2k nicht verbunden ist" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Unerwarteter Fehler bei der Kad-Suche:" + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "Nachricht gefiltert von '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "Neue Nachricht von '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" +"Benutzer %s (%u) hat Deine Liste der freigegebenen Dateien angefordert -> " +"akzeptiert" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" +"Benutzer %s (%u) hat Deine Liste der freigegebenen Dateien angefordert -> " +"abgelehnt" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" +"Benutzer %s (%u) hat die Liste Deiner freigegebenen Verzeichnisse angefragt -" +"> akzeptiert" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" +"Benutzer %s (%u) hat die Liste Deiner freigegebenen Dateien angefragt -> " +"abgelehnt" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"Benutzer %s (%u) hat Deine Liste der freigegebenen Dateien für Verzeichnis %" +"s angefordert -> akzeptiert" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"Benutzer %s (%u) hat Deine Liste der freigegebenen Dateien für Verzeichnis %" +"s angefordert -> abgelehnt" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "Benutzer %s (%u) hat Verzeichnis %s freigegeben" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "" +"Benutzer %s (%u) hat ungefragt seine freigegebenen Verzeichnisse gesendet." + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" +"Benutzer %s (%u) hat die Liste der freigegebenen Dateien für Verzeichnis %s " +"gesendet" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "" +"Benutzer %s (%u) hat das Senden der Liste freigegebener Dateien abgeschlossen" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "" +"Benutzer %s (%u) hat ungefragt die Liste seiner freigegebenen Dateien " +"gesendet" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" +"Benutzer %s (%u) verweigert den Zugriff auf die Liste " +"freigegebenerVerzeichnisse/Dateien." + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Knoten (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "Ungültige Bootstrap-IP" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Ungültiger Bootstrap-Port" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Bitte alle erforderlichen Felder ausfüllen" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Wirklich neue nodes.dat herunterladen?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" +"Dies wird alle momentanen Knoten entfernen und die Kademlia-Verbindung " +"neustarten." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Weiter?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Fehler: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Warnung: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Einen Freund hinzufügen" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Du musst einen gültigen Port und eine gültige IP eingeben!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Information" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "Die angegebene Benutzerprüfsumme ist nicht gültig!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Quellen" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Datei" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Download" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Kategorie" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Hauptkategorie" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Herunterladen in Kategorie" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "Suche verwandte Dateien (eD2k, lokale Server)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "Als unbekannte Datei kennzeichnen" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Verbinde mit entferntem aMule" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Verbindung fehlgeschlagen " + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Fehler" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"WARNUNG: Du kannst Dich nicht als Quelle für einen eD2k-Verweis hinzufügen " +"während Du eine niedrige ID hast (\"LowID\")." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "User: E: %s K: %s | Dateien E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Alle" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Benutzer insgesamt: %s | Dateien insgesamt: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Übertragen" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Fertiggestellt" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Geschwindigkeit" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Fortschritt" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Status" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Verbleibende Zeit" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Zuletzt vollständig gesehen" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Letzter Empfang" + +#: src/DownloadListCtrl.cpp:578 +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Wirklich die ausgewählte Dateie löschen?" + +#: src/DownloadListCtrl.cpp:580 +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Wirklich die ausgewählten Dateien löschen?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Sende Nachricht an Benutzer" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Zu sendende Nachricht:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Stopp" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Pausieren" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "Fo&rtsetzen" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "&Liste um fertige Dateien bereinigen" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "[A4AF] Weise alle Quellen dieser Datei zu" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "[A4AF] Automatisches Zuweisen von Quellen zu dieser Datei" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "[A4AF] Weise alle Quellen einer anderen Datei zu" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Erweiterte Optionen" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Vorschau" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Zeige &Dateieigenschaften" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Zeige alle Kommentare" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Kopiere Magnet-URI in Zwischenablage" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "Zuweisung rückgängig machen" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Einer Kategorie hinzufügen" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "&Oeffne diese Datei" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Entferne von Freundesliste" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Zu Freunden hinzufügen" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Sende Nachricht" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Zu dieser Datei verschieben" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "QR: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Andere Datei angefordert" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Downloads (%i)" + +#: src/DownloadListCtrl.cpp:2222 +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"Bitte trage deinen bevorzugten Videoplayer in den Einstellungen ein.\n" +"Bis dahin wird aMule versuchen, mplayer zu starten, und bei jeder Vorschau " +"wird diese Warnung angezeigt werden." + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Dateivorschau" + +#: src/DownloadListCtrl.cpp:2260 +#, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "FEHLER: Konnte externen Mediaplayer nicht starten!Befehl: `%s'" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "FEHLER: Erstellen der Part-Datei fehlgeschlagen)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "FEHLER: Erstellen der Part-Datei fehlgeschlagen)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "Versuche, Sicherung der met-Datei von %s zu laden" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "Fehler: Konnte part.met-Datei nicht öffnen: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "Fehler: part.met-Datei hat die Größe 0: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "Fehler: Ungültige part.met-Dateiversion: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" +"Fehler: %s (%s) ist defekt (falscher Tagcount), kann Datei nicht öffnen)." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "Versuche, Dateiinformation wiederherzustellen..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" +"Unbenannte Datei wird versucht wiederherzustellen - Es wird versucht, sie " +"als RecoveredFile.dat zu speichern" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" +"Alle verfügbaren Dateiinformationen wiederhergestellt :D - Versuche, sie zu " +"benutzen..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Konnte Dateiinfo nicht wiederherstellen :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Fehler beim Öffnen von %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "Warnung: %s könnte defekt sein (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "FEHLER beim Speichern der Part-Datei: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "Konnte die Länge von '%s' nicht ermitteln - benutze %s-Datei." + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "'%s' hat die Größe 0 - benutze Datei %s." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "Speichern der Datei 'part.met.seeds' für %s fehlgeschlagen" + +#: src/PartFile.cpp:1019 +#, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "%i Einstiegsquelle für Part-Datei %s (%s) gespeichert." +msgstr[1] "%i Einstiegsquellen für Part-Datei %s (%s) gespeichert." + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "Part-Datei %s (%s) hat keine Einstiegsquellendatei" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "Part-Datei %s (%s) hat eine leere Einstiegsquellendatei" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "Fehler beim Lesen der Partfile-Einstiegsquellendatei (%s - %s): %s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"Fehlerhaften Teil (%d) in %d Part-Datei %s gefunden - FileResultHash |%s| " +"FileHash |%s|" +msgstr[1] "" +"Fehlerhaften Teil (%d) in %d Part-Datei %s gefunden - FileResultHash |%s| " +"FileHash |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "Vollständigen Teil (%i) in %s gefunden" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "Prüfsumme für %s neu erstellt" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "" +"Unerwarteter Fehler beim Abschließen des Herunterladens von %s. Datei " +"pausiert." + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Herunterladen abgeschlossen: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "Lösche Datei: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" +"Warnung: Konnte für heruntergeladenen Teil die Prüfsumme nicht berechnen - " +"Prüfsummensatz unvollständig für '%s'." + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"Fehler: Prüfsumme für einen Teil konnte nicht erstellt werden - Prüfsumme " +"unvollständig (%s). Dies dürfte eigentlich nie passieren." + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "WARNUNG: Nicht genügend freier Festplattenplatz! Pausiere Datei: %s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "Heruntergeladener Teil %i in Datei '%s' ist defekt" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH: Defekter Teil %i in %s wiederhergestellt -> Gesparte Bytes: %s" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Ungenügender Festplattenplatz" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Angehalten" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "Warnung: Datei 'known.met' kann nicht geöffnet werden." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" +"Warnung: Die Liste bekannter Dateien ist beschädigt, enthält ungültigen " +"Header." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "IO-Fehler während des Lesens der 'known.met': %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "Fehler während des Speicherns der 'known.met': %s" + +#: src/SharedFileList.cpp:352 +#, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "%i bekannte freigegebene Dateie gefunden" +msgstr[1] "%i bekannte freigegebene Dateien gefunden" + +#: src/SharedFileList.cpp:358 +#, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "%i bekannte Dateie gefunden, %i unbekannt" +msgstr[1] "%i bekannte Dateien gefunden, %i unbekannt" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "FEHLER! Versucht, %s freizugeben" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Dateikommentare" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Bewertung" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Kommentar" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Keine Kommentare" + +#: src/CommentDialogLst.cpp:104 +#, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%u Kommentar" +msgstr[1] "%u Kommentare" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"Verbindung zu allen gelisteten verschleierten Servern misslungen. Versuche " +"erneut, ohne Verschleierung." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "" +"Fehler beim Verbinden zu allen Servern in der Liste. Ein neuer Durchgang " +"wird gestartet." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "" +"eD2k-Netzwerk ist in den Voreinstellungen deaktiviert - verbinde nicht." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "Keine gültigen Server zum Verbinden in der Serverliste gefunden" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Verbunden mit %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Verbindung hergestellt mit %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"Schwerer Fehler beim Verbinden. Möglicherweise ist die Internetverbindung " +"getrennt" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Verbindung verloren zu %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) scheint tot zu sein." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) scheint voll zu sein." + +#: src/ServerConnect.cpp:391 +#, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "" +"Automatische Verbindungsherstellung zum Server wird in %d Sekunde wiederholt" +msgstr[1] "" +"Automatische Verbindungsherstellung zum Server wird in %d Sekunden wiederholt" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Verbindung verloren" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "Verbindung zu %s (%s:%i) fehlgeschlagen." + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "Fehler: Ungültiger Socket bei Prüfung auf Zeitüberschreitung" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "Verbindungsversuch zu %s (%s:%i): Timeout." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" +"Fehler: Konnte Sicherungsdatei nicht laden.Suche aufhttp://forum.amule.org " +"nach .part.met Wiederherstellungslösungen." + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Keine Part-Dateien gefunden" + +#: src/DownloadQueue.cpp:175 +#, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "%u part-Dateie gefunden" +msgstr[1] "%u part-Dateien gefunden" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Herunterladen von %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Du versuchst bereits, die Datei '%s' herunterzuladen" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Die Datei '%s' ist bereits vorhanden" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Die Datei %s wird bereits heruntergeladen" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "Kann Magnet-Verweis nicht in eD2k umwandeln: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "Unbekanntes Protokoll von Verweis: %s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Ungültiger eD2k-Link! Fehler: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "Führe aus und beende." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Ungültiges IP-Format. Benutze xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" +"Dieser Befehl benötigt ein Argument. Mögliche Argumente sind 'all', ein " +"Dateiname oder eine Zahl.\n" + +#: src/TextClient.cpp:343 +msgid "Processing by hash: " +msgstr "Verarbeite Datei Nnach Hash:" + +#: src/TextClient.cpp:358 +msgid "Processing by filename: " +msgstr "Verarbeite Datei nach Namen:" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" +"Dieser Befehl benötigt ein Argument. Mögliche Argumente: ein Datei-Hash\n" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Keine gültige Nummer\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "Keine gültige Prüfsumme (sollte genau 32 Zeichen lang sein)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "Vorgang erfolgreich." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "Anfrage mit folgendem Fehler gescheitert: %s." + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "IP-Filterung für Clients ist %s.\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "AUS" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "AN" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "IP-Filterung für Server ist %s.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "Momentane IP-Filterstufe ist %d.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Bandbreiteneinstellungen: Up: %u kB/s, Down: %u kB/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "eD2k" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Verbunden mit %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "mit niedriger ID" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "mit hoher ID" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Verbinde" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Nicht verbunden" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Download:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Upload:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Clients in Warteschlange:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Quellen insgesamt:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Anzahl der Suchergebnisse: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "TODO - Suchfortschrittsanzeige" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Unbekannte Antwort vom Server empfangen, OpCode = %#x" + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Zeige kurze Statusinformation." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "" +"Verbindungszustand, momentane Up/Downloadgeschwindigkeit, usw. zeigen\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Zeige vollständigen Statistikbaum." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"Wahlweise kann man diesem Befehl eine Zahl zwischen 0-255 als Argument\n" +"übergeben, um die Anzahl der angezeigten Einträge für die " +"Unterverzeichnisse\n" +"der Clientversionen anzugeben. 0 oder leer bedeutet 'unbegrenzt'.\n" +"\n" +"Beispiel: 'statistics 5' zeigt nur die ersten 5 Versionen für jeden " +"Clienttyp.\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "aMule beenden." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Herunterfahren des fernbedienten Kerns (amule/amuled):\n" +"Dadurch wird auch der Textclient beendet, weil der\n" +"ohne laufenden Kern (core) nicht verwendbar ist.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Neuladen des angegebenen Objekts." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "Liste freigegebener Dateien neu laden." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "IP-Filtertabelle von Datei neu laden." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Mit Netzwerk verbinden." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"Verbindet zu allen in den Voreinstellungen aktivierten Netzwerken.\n" +"Wahlweise kann eine Serveradresse nach dem Schema IP:Port angegeben\n" +"werden, um nur zu diesem Server zu verbinden. Die IP muss eine dezimale,\n" +"punktgetrennte IPv4-Adresse, oder ein auflösbarer DNS-Name sein." + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Nur mit eD2k verbinden." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Nur mit Kad verbinden." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Vom Netzwerk trennen." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "Dies wird von allen momentan verbundenen Netzwerken trennen.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Nur von eD2k trennen." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Nur von Kad trennen." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Sendet einen eD2k- oder Magnet-Verweis an den Kern." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"Der hinzuzufügende eD2k-Verweis kann sein:\n" +"*) ein Dateiverweis (ed2k://|file|...), der in die Herunterlade-Schlange " +"eingereiht wird\n" +"*) ein Server-Verweis (ed2k://|server|...), der zur Server-Liste hinzugefügt " +"wird\n" +"*) oder ein Server-Listen-Verweis, wobei dann alle Server in der Liste zur\n" +"···Server-Liste hinzugefügt werden\n" +"\n" +"Der Magnet-Verweis muss die eD2k-Prüfsumme(\"Hash\") und die Dateigröße " +"beinhalten.\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Einstellwert festlegen." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "IP-Filtereinstellungen festlegen." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "Aktiviere IP-Filterung sowohl für Clients als auch für Server." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "Deaktiviere IP-Filterung sowohl für Clients als auch für Server." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "Ein-/Ausschalten von IP-Filterung für Clients." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "Einschalten der IP-Filterung für Clients." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "Ausschalten der IP-Filterung für Clients." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "Ein-/Ausschalten der IP-Filterung für Server." + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "Einschalten der IP-Filterung für Server." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "Ausschalten der IP-Filterung für Server." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "IP-Filterstufe auswählen." + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"Gültige Filterlevel liegen im Bereich zwischen 0-255, und die\n" +"Standardeinstellung (Ausgangswert) ist 127.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Bandbreiteneinstellungen festlegen." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "Der Wert für diese Befehle muss in Kilobytes/Sek. angegeben werden.\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Upload-Bandbreitenbegrenzung festlegen." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "Download-Bandbreitenbegrenzung festlegen." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Einstellungswert holen und anzeigen." + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "IP-Filtereinstellungen holen." + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "Hole IP-Filter-Status für Clients und Server." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "Hole IP-Filter-Status nur für Clients." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "Hole IP-Filter-Status nur für Server." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "IP-Filterstufe holen." + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Bandbreiteneinstellungen holen." + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Beginnt eine Suche." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"Ein Suchtyp muss angegeben werden durch Auswahl von:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Beispiel: 'search kad Datei' führt eine kad Suche für \"Datei\" aus.\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Vollzieht eine globale Suche." + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Vollzieht eine lokale Suche." + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Vollzieht eine Kade-Suche." + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Zeigt die Ergebnisse der letzten Suche an." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Holt die Ergebnisse der vorhergehenden Suche.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "Zeigt den Fortschritt einer Suche." + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "Zeigt den Fortschritt einer Suche.\n" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Beginne, eine Datei herunterzuladen." + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"Die Nummer einer Datei aus der letzten Suche muss angegeben sein.\n" +"Beispiel: 'download 12' beginnt das Herunterladen der Datei Nr. 12 der " +"letzten Suche.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Download anhalten." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Download weiterführen." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Download löschen." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Setze Herunterlade-Priorität." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "" +"Setze die Priorität einer herunterladenden Datei auf niedrig, normal, hoch " +"oder Auto.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "Setze niedrige Priorität." + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "Setze normale Priorität." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "Setze hohe Priorität." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "Setze automatische Priorität." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Warteschlangen/Listen zeigen." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Upload-/Download-Warteschlange, Serverliste, oder Liste freigegebener " +"Dateien zeigen.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Upload-Warteschlange zeigen." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Download-Warteschlange zeigen." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Zeige Log." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Serverliste zeigen." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Setze Log zurück." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "Veralteter Befehl, nun '%s'." + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" +"Das ist ein veralteter Befehl und könnte in der Zukunft enfernt werden.\n" +"Nutze stattdessen '%s'.\n" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() returned NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "Fehler: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "Warnung: %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Neue Benutzer-ID ist %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "WARNUNG: Du hast eine Low-ID zugeordnet bekommen!" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "" +"\tDies rührt vermutlich daher, dass Du Dich hinter einem Router oder einer " +"Firewall befindest." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tMehr Informationen dazu gibt es hier: http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "Unbekannte Serverinfo empfangen! - Zu kurz" + +#: src/ServerSocket.cpp:539 +#, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "%d neuen Server empfangen" +msgstr[1] "%d neue Server empfangen" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Speichern der Serverliste abgeschlossen." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "Server hat letzten Befehl abgelehnt" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Seltsames Paket vom Server empfangen: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "Unbearbeiteter Fehler beim Verarbeiten eines Paketes vom Server: %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "Kann DNS-Auflöse-Thread nicht erstellen, um zu %s zu verbinden" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "Server-IP %s (%s) ist gefiltert. Verbinde nicht." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "verwende Protokollverschleierung." + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "Verbinde mit·%s·(%s·-·%s:%i)·%s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "Konnte DNS-Namen von Server %s nicht auflösen: Kann nicht verbinden!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "CIP2Country::CIP2Country():·Misslungenes Laden von Länderdaten von " + +#: src/IP2Country.cpp:73 +#, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "%d Flaggenbitmap geladen." +msgstr[1] "%d Flaggenbitmaps geladen." + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"Wirklich das Herunterladen aller Dateien in dieser Kategorie abbrechen und " +"alle Dateien darin löschen??" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Bestätigung erforderlich" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Alle anderen" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Unvollständig" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Aktiv" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Video" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Audio" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Archiv" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "CD-Abbilder" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Bilder" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Text" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Ansichtenfilter wählen" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Kategorie hinzufügen" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Kategorie bearbeiten" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Kategorie entfernen" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "Importiere %s: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "Lese Temp-Verzeichnis" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "Hole Basis-Informationen aus der Download-Info-Datei" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "Erzeuge Zieldatei" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "Lade Daten aus der alten Download-Datei (%u von %u)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "Speichere Datenblock in die neue, einzelne Download-Datei (%u von %u)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "Hole Quellen-Download-Datei-Informationen" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "Füge Download hinzu und speichere neue Part-Datei" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Hole Status..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "In Arbeit" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Fehler: Ungenügender Festplattenplatz" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Fehler: part.met nicht gefunden" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Fehler: IO-Fehler!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Fehler: Versagt!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "In Warteschlange" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Bereits herunterladend" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Unbekanntes oder fehlerhaftes Format der Temp-Datei." + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Dateiname" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Status" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Dateiprüfsumme" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Importiere Part-Dateien" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"Bitte wähle einen Ordner, um nach temporären Downloads zu suchen! " +"(Unterordner werden mit eingeschlossen!)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "Quelldateien der erfolgreich importierten Downloads löschen?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Quellen entfernen?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Wartend..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (Platte: %s)" + +#: src/OtherFunctions.cpp:121 +msgid "byte" +msgid_plural "bytes" +msgstr[0] "Byte" +msgstr[1] "Bytes" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "Byte/Sek" +msgstr[1] "Bytes/Sek" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "Sekunden" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "Minuten" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "Stunden" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "Tage" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Videos" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Archive" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Texte" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programme" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Jeder" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Nicht bewertet" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Ungültig / fehlerhaft / Fälschung" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Schlecht" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Ordentlich" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Gut" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Überragend" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "alle" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "alle anderen" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "Lade IP-Filter 'ipfilter.dat'·und·'ipfilter_static.dat'." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" +"Laden der ipfilter.dat '%s' fehlgeschlagen, unbekanntes Format aufgetreten." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" +"Fehler beim Laden der ipfilter.dat '%s', Datei konnte nicht geöffnet werden." + +#: src/IPFilter.cpp:330 +#, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "%u IP-Bereich von %s geladen." +msgstr[1] "%u IP-Bereiche von %s geladen." + +#: src/IPFilter.cpp:332 +#, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "%u fehlerhafte Zeile wurden ignoriert." +msgstr[1] "%u fehlerhafte Zeilen wurden ignoriert." + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Aktive Verbindungen (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Dateieinzelheiten" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% erledigt" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "eD2k-Verweis: " + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Übernehmen" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" +"Hier klicken, um den eD2k-Verweis im Texteingabefeld zur Downloadschlange " +"hinzuzufügen. " + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "Statustextfenster zeigen" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Lade ..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"Hier werden Ereignisse angezeigt. Eine komplette Ereignisliste kann im Log " +"unter dem Server-Reiter eingesehen werden." + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Anzahl Benutzer auf dem Server, mit dem du verbunden bist ..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Benutzer: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" +"Zum aktuellen Server verbundene Benutzer und ungefähre Anzahl der Benutzer " +"insgesamt im Netz." + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"Derzeitige Upload- und Download-Raten im Schnitt. Wenn aktiviert, dann auch " +"noch in Klammern der Overhead durch Client-Kommunikation." + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"Zeigt den aktuellen Verbindungsstatus an: rote Pfeile bedeuten, dass du im " +"Moment nicht verbunden bist, gelb bedeutet, du hast eine LowID (firewalled), " +"und grün bedeutet, dass du eine hohe ID hast (die beste Verbindung)." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Nicht verbunden..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Momentan verbundener Server." + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Suche" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Name:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Lokal" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Global" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "Dateiprüfsumme" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Erweiterte Parameter" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Filtere" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Dateityp" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Dateityp" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Mindestgröße" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Bytes" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Höchstgröße" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Verfügbarkeit" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Filter:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Filterergebnisse" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Ergebnisse umkehren" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Bekannte Dateien ausblenden" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Mehr" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "" +"Sucht nach weiteren Ergebnissen in eD2k. Bislang keine Unterstützung für Kad." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Stopp" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Setze Felder zurück." + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Ergebnisse" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Vollständige Downloads entfernen" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Uploads/Warteschlange/Clients" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Clients in der Warteschlange:" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Senden" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Sendet die angegebene Nachricht." + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Schließen" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Schließe diese Chat-Sitzung." + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Name:" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "Nicht verfügbar" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "met-Datei:" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Prüfsumme:" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Dateigröße:" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Status der Part-Datei:" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Zuletzt vollständig gesehen:" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Gefundene Quellen:" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Übertragende Quellen:" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Anzahl der Part-Dateien:" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Verfügbar:" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Datenrate:" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Dauer aktiven Herunterladens: " + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Übertragen:" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Fertiggestellt:" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Intelligente Fehlerkorrektur" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Durch Fehler verloren:" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Durch Kompression gewonnen:" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "Durch I.C.H. gesparte Pakete:" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Dateinamen" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Übernehmen" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Aufräumen" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Übernehmen" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Ok" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "" +"Kommentiere/bewerte Datei (der Text wird für alle Benutzer sichtbar sein)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"Bei einem Film beispielsweise Laufzeit, Thema, Sprache...\n" +"oder informiere andere Benutzer über Täuschungen." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Dateigüte" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" +"Bewerte diese Datei oder gib anderen Benutzern einen Hinweis, wenn sie " +"ungültig ist..." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Kein(e) Kommentar(e)" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Aktualisieren" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Wird geladen, bitte warten ..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Unbekannte Größe" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Benötigte Information" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "IP-Adresse:" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Port:" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Zusätzliche Information" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Benutzername:" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Benutzerprüfsumme:" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Freigegebene Dateien neu laden" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Laufende Sitzung" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Gesamt" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Nachfragen:" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Aktive Uploads:" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Download-Geschwindigkeit" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Aktuell" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Läuft im Schnitt" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Sitzungsdurchschnitt" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Upload-Geschwindigkeit" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Verbindungen" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Aktive Downloads" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Aktive Verbindungen (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Aktive Uploads" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Statistikbaum" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Benutzername:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Benutzerprüfsumme:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Client-Software:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Client-Version:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "IP-Adresse:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "Benutzer-ID:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "Server-IP:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Servername:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "Übertragungen zum Client" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Momentane Anfrage:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Durchschnittliche Uploadrate:" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Durchschnittliche Downloadrate:" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Hochgeladen (Sitzung):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Heruntergeladen (Sitzung):" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Hochgeladen (Gesamt):" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Heruntergeladen (Gesamt):" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Punkte" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "DL/UP-Modifikator:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Sichere Erkennung:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Bewertung (Gesamt):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Wartepunkte:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Allgemeine Einstellungen" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Spitzname" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - Der Linux-Muli" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "" +"Dies ist der Name, den andere Benutzer sehen, wenn sie mit dir verbunden " +"sind." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Sprache" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "Verwendete Sprache für die Einstellungen festlegen." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Weitere Optionen" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Beim Start auf neue Version prüfen" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" +"Wenn dies aktiviert ist, wird aMule beim Start überprüfen, ob eine neue " +"Version vorliegt" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "minimiert starten" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "Wenn dies aktiviert ist, wird aMule sofort nach dem Start minimiert. " + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Abfrage beim Beenden" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "Sicherheitsabfrage vor dem Beenden." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Tray-Icon aktivieren" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "Dies aktiviert/deaktiviert das Symbol im Systray (oder Taskbar)." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "Minimiere zu Tray-Symbol" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" +"Wird dies aktiviert, minimiert aMule zu einem System-Tray-Symbol, anstatt " +"zur Taskbar." + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Tooltip-Verzögerung in Sek." + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "Verzögerung vor dem Anzeigen der Tooltips. " + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Browser-Wahl" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Hier den Browser auswählen" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Benutzerdefinierter Browser:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Gebe hier den Namen deines Browsers ein. Um einen individuellen Browser zu " +"nehmen, wähle Benutzerdefiniert vom Auswahlmenü darüber." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Öffne in neuem Reiter, wenn möglich" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" +"Öffne die Webseite in einem neuen Reiter, statt einem neuen Fenster, wenn " +"möglich" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Bandbreiteneinstellungen" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Upload" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Slotzuteilung" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Kapazitäten" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" +"Anmerkung: Diese Werte werden\n" +"nur für die Statistik verwendet." + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Standard-Client-TCP-Port:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "Dies ist der Standard-eD2k-Port. Er kann nicht deaktiviert werden." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Erweiterter Client-UDP-Port:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" +"Dieser UDP-Port wird für erweiterte eD2k-Anfragen und das Kad-Netzwerk " +"verwendet." + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "deaktivieren" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Bind-Adresse" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "UDP-Port für erweiterte Serveranfragen (TCP+3):4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "max. Quellen pro Datei" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Hartes Limit" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Verbindungslimits" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Maximale Verbindungen" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Universelles Plug and Play" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "Aktiviere UPnP" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "UPnP-TCP-Port:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Automatisches Verbinden beim Start" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Wiederverbinden nach Trennung" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Zeige Overhead-Bandbreite" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Serveroptionen" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Lösche tote Server nach" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "Versuchen" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Serverliste beim Programmstart aktualisieren" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Liste" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Serverliste von verbundenem Server beziehen" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Serverliste von verbundenem Client beziehen" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Benutze Prioritätssystem" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Benutze intelligente LowID-Prüfung beim Verbinden" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Sicheres/langsames Verbinden zu Servern" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Automatisches Verbinden nur zu Servern aus der statischen Liste" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Setze manuell hinzugefügte Server auf hohe Priorität" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "I.C.H. aktiviert" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICH vertraut jeder Prüfsumme (nicht empfohlen)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Neue Dateien dem Download pausiert hinzufügen" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Neu hinzugefügte Dateien im Download auf Autopriorität stellen" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Versuche, zuerst die ersten und letzten Dateiteile herunterzuladen" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Neue freigegebene Dateien auf Autopriorität stellen" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Versuche, nur komplette Chunks hochzuladen" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Bei fertigem Download nächste pausierte Datei fortsetzen" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "Aus der selben Kategorie" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "Bei seltenen (< 20 Quellen) Dateien zehn Quellen speichern" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Festplattenplatz" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Festplattenplatz überprüfen" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "Wähle dies aus, wenn aMule deinen Festplattenplatz prüfen soll" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Mindest-Festplattenplatz:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Hier den minimalen erwünschten Festplattenplatz angeben." + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "MB" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Eingehende Dateien:" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Temporäre Dateien:" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Freigegebene Verzeichnisse" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "" +"(Rechtsklick auf das Symbol des rekursiv freizugebenden Verzeichnisses)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Versteckte Dateien freigeben" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Videoplayer" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Erstelle eine Kopie für die Vorschau" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Graphen" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Aktualisierungsverzögerung: 5 Sekunden" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Durchschnittsgraphen in Minunten berechnen: 100 mins" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Verbindungsgraphenskala: 100" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Farben des Graphen" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Hintergrund" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Gitter" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Aktueller Download" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Download: Durchschnitt" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Download: Sitzungsdurchschnitt" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Aktueller Upload" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Upload: Durchschnitt" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Upload: Sitzungsdurchschnitt" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Aktive Verbindungen" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Systrayicon Transferbalken" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Momentane Kad-Knoten" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Laufende Kad-Knoten" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Kad-Knoten Sitzung" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Auswahl" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Anzahl angezeigter Client-Versionen (0=unbegrenzt)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Benachrichtigungen" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Nachrichteneinblendung" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Mit Ton" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Einblenden, wenn:" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Neuer Log-Eintrag" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Neue Chat-Sitzung" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Eine neue Nachricht wurde empfangen" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Ein Download wurde hinzugefügt oder beendet" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Neue aMule-Version gefunden" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "Dringend: Kein Festplattenplatz mehr, Serververbindung verloren" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Benachrichtigung per E-Mail" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Bei beendetem Download eine E-Mail senden." + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "SMTP Server:" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "E-Mail-Adresse:" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! WARNUNG !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Ändere diese Einstellungen nur, wenn du genau\n" +"weißt, was du tust, denn andernfalls können\n" +"negative Effekte auftreten.\n" +"\n" +"aMule funktioniert auch hervorragend, ohne\n" +"dass diese Einstellungen verändert werden." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Erweiterte Einstellungen" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Maximale neue Verbindungen pro 5 Sekunden" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Dateipuffergröße: 240000 bytes" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Upload-Warteschlangengröße: 5000 Clients" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Server-Wiederverbindungsintervall: Aus" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "GUI-Einstellungen" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Download-Fortschrittsanzeige" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Prozentsatz anzeigen" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Statusbalken anzeigen " + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Statusbalkenstil" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Flach" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Rund" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Verkleidungs(\"Skin\")-Unterstützung" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Aktiviere Verkleidungs(\"Skin\")-Unterstützung" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Verkleidung(\"Skin\"):" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- keine Verkleidungen(\"Skins\") verfügbar -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Spaltensortierung" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "" +"Automatisches Sortieren der Dateien in der Downloadschlange (hohe CPU-Last)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "aMule sortiert automatisch die Anzeige der Downloadliste" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Diverse Oberflächeneinstellungen" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Zeige schnelle eD2k-Linkverarbeitung" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Zeige erweiterte Informationen auf Kategorie-Reitern" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Zeige Transferraten im Titel" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Toolbar senkrecht ausrichten" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Zeige Part-Datei-Nummer vor Dateinamen" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Fernbedienung" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Webserver-Parameter" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "amuleweb beim Start ausführen" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Webserver-Port" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "Aktiviere UPnP-Port-Weiterleitung zu Webserver-Port" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Webserver-UPnP-TCP-Port" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Aktualisierungsintervall in Sekunden" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Gzip-Kompression an" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Eingeschränkter Benutzer aktiviert" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Kennwort für Vollzugriff" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Kennwort für eingeschränkten Zugriff" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Webvorlage" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Parameter für externe Verbindungen" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Externe Verbindungen annehmen" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"IP-Adresse der lauschenden Schnittstelle\n" +"(leerlassen für beliebig)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Hier eine gültige IP im Format a.b.c.d für das lauschende EC-Interface " +"eingeben. Ein leeres Feld oder 0.0.0.0 bedeutet ein beliebiges Interface." + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "TCP-Port" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "Aktiviere UPnP-Port-Weiterleitung zu EC-Port" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "Hier klicken, um alle Einstellungsänderungen zu übernehmen." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Alle Änderungen zu den Einstellungen zurücksetzen." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Titel:" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Kommentar:" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Verzeichnis für eingehende Dateien:" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Priorität bei neu zugewiesenen Dateien ändern:" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Nicht ändern" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Farbe für diese Kategorie wählen (momentan ausgewählt):" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Tagesmotto des Servers anzeigen, wenn verbunden..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Serverinformation" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Drücke diesen Knopf, um das Log zurückzusetzen." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "aMule-Log" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "" +"Hier klicken, um die Serverliste über die angegebene URL zu aktualisieren" + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Serverliste" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Hier die URL einer server.met eingeben, und dann den Knopf links vom " +"Eingabefeld drücken, um die Serverliste zu aktualisieren." + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Server manuell hinzufügen: Name" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Gib den Namen das neuen Servers hier ein" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Hier die IP des Servers im Format x.x.x.x eingeben." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Hier den Serverport eingeben." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "" +"Einen Server manuell hinzufügen (vorher bitte links die Felder ausfüllen)..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "eD2k-Info" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Kad-Info" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"Die gewählte Locale scheint nicht auf dem System installiert zu sein\n" +"Du musst die Sprache generieren(installieren), um sie zu nutzen.\n" +"Ein guter Startpunkt auf einem Linuxsystem ist die Datei /etc/locale.gen und " +"das Paket 'locales'\n" +"Viel Glück!\n" +"(Info: Ich werde trotzdem versuchen, sie zu setzen)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Niemals wieder anzeigen" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "Zum Aktualisieren der nodes.dat von URL diese Schaltfläche drücken." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Knoten (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"Hier die URL einer nodes.dat eingeben, und dann den Knopf links vom " +"Eingabefeld drücken, um die Liste der bekannten Knoten zu aktualisieren." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Knotenstatistik" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Bootstrap" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Neuer Knoten" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Port:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Bootstrap von \n" +"bekannten Clients" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Kad trennen" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Protokollverschleierung" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Unterstütze Protokollverschleierung" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"Diese Option aktiviert die Protokollverschleierung und verfügt aMule, " +"verschleierte Verbindungen von anderen Clients anzunehmen." + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Verschleiere ausgehende Verbindungen" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"Diese Option verfügt aMule Protokollverschleierung zu verwenden bei der " +"Verbindung zu anderen Clients und/oder Servern." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Aktzeptiere ausschließlich verschleierte Verbindungen" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"Diese Option verfügt aMule, ausschließlich verschleierte Verbindungen zu " +"akzeptieren. Das führt zu weniger Quellen, jedoch ist sämtlicher Verkehr " +"verschleiert." + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Dateieigenschaften" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Jeder" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Niemand" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Wer kann die freigegebenen Dateien sehen:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "Wähle, wer deine freigegebenen Dateien einsehen darf." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "IP-Filterung" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Filtere Clients" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Aktiviere die Filterung von Client-IPs, die in der Datei ~/.aMule/ipfilter." +"dat definiert sind." + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Filtere Server" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Aktiviere das Filtern von Server-IPs, die in der Datei ~/.aMule/ipfilter.dat " +"definiert sind." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Aktualisieren der Liste" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "" +"Aktualisiert die Liste der zu filternden IPs in der ~/.aMule/ipfilter.dat" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Jetzt aktualisieren" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "IP-Filter beim Start automatisch aktualisieren" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Filterstufe:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "LAN-IP-Adressen immer filtern" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Paranoides Handhaben nicht-passender IP-Adressen" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Weise Paket zurück, wenn die Client-IP abweicht von der IP, von der das " +"Paket empfangen wurde. Mit Vorsicht zu benutzen." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "Benutze systemweite ipfilter.dat, wenn verfügbar." + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" +"Erlaube die Benutzung des systemweiten Ipfilters, falls keine lokale " +"ipfilter.dat gefunden wird" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "Benutze sichere Benutzeridentifikation" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" +"Es wird empfohlen diese Option zu aktivieren. Du wirst keine Credits " +"erhalten, wenn SUI nicht aktiviert ist." + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Aktivieren/Deaktivieren" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Online-Signatur erstellen" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Aktiviert das Schreiben der Online-Signaturdatei, die von externen " +"Programmen verwendet werden kann, um Signaturen o.ä. zu erstellen." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Aktualisierungsintervall (Sekunden):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "Ändern des Online-Signatur-Aktualisierungintervalls (in Sekunden)." + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Online-Signaturverzeichnis:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" +"Hier klicken, um das Verzeichnis mit den Dateien für die Online-Signatur " +"auszuwählen." + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Deaktivieren/Aktivieren" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "Eingehende Nachrichten filtern (außer momentanen Chats):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Filterauswahl:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Filtere alle Nachrichten" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "" +"Filtere Nachrichten von Benutzern, die nicht auf deiner Freundesliste stehen" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Filtere Nachrichten von unbekannten Clients" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "" +"Filtere Nachrichten, die folgende Worte enthalten (benutze ',' als Trenner):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"Hier die Worte eingeben, die aMule filtern soll, und um Nachrichten " +"abzuweisen, in denen sie vorkommen" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Kommentare" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "" +"Filtere Komentare, die folgende Worte enthalten (benutze ',' als Trenner):" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Proxy aktivieren" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Aktiviere/Deaktiviere Proxy-Unterstützung" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Proxytyp:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "Der Typ des Proxy, zu dem du verbindest" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Proxy-Host:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "Der Hostname des Proxy" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Proxy-Port:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "Der Port des Proxy" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Authentifizierung" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Authentifizierung aktivieren" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Aktiviere/Deaktiviere Authentifizierung mit Benutzername/Passwort" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "Der Benutzername, um sich beim Proxy anzumelden" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Passwort:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "Proxyverbindungspasswort" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Automatisch zum Server verbinden ohne Proxy" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Verbinde zu:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Beim entfernten aMule anmelden" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Benutzername" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Diese Einstellungen speichern" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Aktiviere ausführliche Debug-Protokollierung" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "Nachrichtenkategorien:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "Füge Importe hinzu" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Versuche Ausgewähltes noch einmal" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Auswahl entfernen" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Ereignis-Typen" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Mit irgendeinem Server und/oder Kad verbinden" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Neue Kategorie" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Wähle einen Ordner für eingehende Dateien" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Du musst einen Namen für diese Kategorie festlegen!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Du musst einen Pfad für diese Kategorie festlegen!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"Anlegen des Verzeichnisses für eingehende Dateien der Kategorie " +"fehlgeschlagen. Bitte einen gültigen Pfad angeben!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "Unbekannte Erweiterung '%s' für Befehl '%s'.\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "Unbekannter Befehl '%s'.\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"Dieser Befehl kann kein Argument haben.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"Dieser Befehl muss ein Argument haben.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Befehl unvollständig, eine der folgenden Erweiterungen muss verwendet " +"werden:\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Verfügbare Erweiterungen:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Verfügbare Befehle:\n" + +#: src/ExternalConnector.cpp:188 +#, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"Alle Befehle sind unabhängig von Groß- und Kleinschreibung.\n" +"Eingabe von '%s ' für weitere Informationen zu .\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Programm verlassen." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Hilfe anzeigen." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"Um Hilfe zu einem Befehl zu bekommen, gib 'help ' ein.\n" +"Eine vollständige Befehlsübersicht erhält man mit 'help'.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"'%s' zeigt die Befehlsübersicht.\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Syntaxerror!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Fehler beim Ausführen des Befehls - sollte niemals passieren! Bitte den " +"Fehler melden.\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Dieser Befehl sollte keine Parameter haben." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Dieser Befehl muss einen Parameter haben." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Ungültiges Argument." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Unvollständiger Befehl." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Gib '%s' ein, um mehr Hilfe zu bekommen.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "Dies ist %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "Dies ist %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Erstelle Client...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "" +"Verbindung fehlgeschlagen. Verbindung zum angegebenen Host nicht möglich\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"Ok, beende %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"Kann nicht mit leerem Passwort verbinden.\n" +"Gib ein Passwort in der Konfigurationsdatei\n" +"oder als Option an oder gib es nach Aufforderung ein.\n" +"\n" +"Beende...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Zeige diese Hilfe." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "Host, auf dem aMule läuft. (Standard: localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "aMules Port für externe Verbindungen. (Standard: 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Passwort für externe Verbindungen." + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Lese Konfiguration aus Datei." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "Schreibe keinerlei Ausgabe auf stdout." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Sei ausführlich - Zeige auch Debugnachrichten." + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Setze Programm-Locale (Sprache)." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "Schreibe Kommandozeilen-Optionen in Konfigurationsdatei." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "Erstelle Konfigurationsdatei basierend auf aMules Konfigurationsdatei." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Drucke Programmversion." + +#: src/ClientCreditsList.cpp:168 +#, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "Credit-Datei geladen, %u Client ist bekannt" +msgstr[1] "Credit-Datei geladen, %u Clients sind bekannt" + +#: src/ClientCreditsList.cpp:171 +#, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] " - Credits für %u Client abgelaufen!" +msgstr[1] " - Credits für %u Clients abgelaufen!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "Keine 'cryptkey.dat' gefunden, erzeuge eine neue." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"FEHLER: aMule daemon kann nicht verwendet werden wenn Externe Verbindungen " +"deaktiviert sind. Zum aktivieren von Externen Verbindungen, nutze entweder " +"den normalen aMule, starte amuled mit der Option --ec-config oder ändere " +"\"AcceptExternalConnections\" auf 1 in ~/.aMule/amule.conf" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "FEHLER: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Bann entfernen" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Uploads zeigen" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Warteschlange anzeigen" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Clients zeigen" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Ansicht auswählen" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Client-Software" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Wartete" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Uploadzeit" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Upload/Download" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "entfernter Status" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "QR: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Dateipriorität" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Punkte" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Gefragt" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Zuletzt gesehen" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "In Warteschlange seit" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Uploadstatus" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Übertragen Up" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Downloadstatus" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Übertragen Down" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Benutzerprüfsumme" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Verschlüsselt" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Freigegebene Dateien verbergen" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Client-Details" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Nicht unterstützt" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Nicht vollständig" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Böser Bube" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Verifiziert - OK" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Nicht verfügbar" + +#: src/ClientDetailDialog.cpp:190 +#, c-format +msgid "%u (QR: %u)" +msgstr "%u (QR: %u)" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" +"Mindestgröße muss kleiner sein, als die Höchstgröße: Höchstgröße ignoriert." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Suchwarnung" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Unbegrenzt" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "aMule-Traymenü" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Geschwindigkeitseinstellungen:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "UL: Keiner" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "UL: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "DL: Keine" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "DL: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Download-Geschwindigkeit: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Upload-Geschwindigkeit: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Client-Information" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Spitzname: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "Kein Spitzname ausgewählt!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "Client-ID: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Servername: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "ServerIP: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "TCP-Port: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "TCP-Port: Nicht bereit" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "UDP-Port: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "UDP-Port: Nicht bereit" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Online-Signatur: An" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Online-Signatur: Aus" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Freigegebene Dateien: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Clients in Warteschlange: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "Gesamt-DL: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "Gesamt-UL: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Upload-Einstellung" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Download-Einstellung" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "Verstecke aMule" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "Zeige aMule" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "Beginn der Chat-Sitzung: %s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Verbunden mit Client ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** Verbinde mit Client ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Verbindung zum Client nicht aufbaubar / Verbindung verloren ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Reiter schließen" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Alle Reiter schließen" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Andere Reiter schließen" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "Lade Datei server.met: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "Datei server.met nicht gefunden!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" +"Laden der server.met '%s' fehlgeschlagen, unbekanntes Format aufgetreten." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "Konnte Datei server.met nicht öffnen!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"Server.met unbrauchbar, unzulässige Versionsmarke gefunden: 0x%x, Größe %i" + +#: src/ServerList.cpp:168 +#, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "%i Server in server.met gefunden" +msgstr[1] "%i Server in server.met gefunden" + +#: src/ServerList.cpp:170 +#, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d Server hinzugefügt" +msgstr[1] "%d Server hinzugefügt" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Server nicht hinzugefügt: [%s:%d] Gibt keinen gültigen Port an." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "" +"Server nicht hinzugefügt: Die IP-Adresse [%s:%d] ist gefiltert oder ungültig." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" +"Server nicht hinzugefügt: Server mit gleicher IP:Port [%s:%d] bereits " +"vorhanden." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Server hinzugefügt: Server bei [%s:%d] mit Namen '%s'." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"Du bist zu einem Server verbunden, den du zu löschen versuchst. Bitte zuerst " +"trennen." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Speichern der server.met fehlgeschlagen!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "Ungültige URL" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "Download der Serverliste von %s beendet" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Konnte Serverliste von %s nicht herunterladen" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"Keine Serverlistenadresse in 'addresses.dat' gefunden. Bitte dort zum " +"automatischen Aktualisieren eine gültige Serverlistenadresse eintragen." + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "Beginne Download der Serverliste von %s" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" +"Warnung, ungültige URL für das automatische Aktualisieren der Serverliste " +"angegeben: %s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "Keine gültige server.met Auto-Download URL in addresses.dat" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"Lokaler Server ist gefiltert durch IPFilters, verbinde neu zu einem anderen " +"Server!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "Befehlsausführung fehlgeschlagen: Befehl `%s' aufgrund Eregnis `%s'." + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"Deine Locale wurde wegen einer Konfigurationsänderung auf Systemstandard " +"geändert. Sorry." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"Es sind keinerlei Server in der Server-Liste.\n" +"Soll aMule jetzt eine neue Liste herunterladen?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Server-Liste herunterladen" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "Webserver läuft mit PID %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"Du hast \"amuleweb zusammen mit aMule starten\" aktiviert, allerdings kann " +"die amuleweb-Programmdatei nicht gestartet werden. Bitte installiere das " +"Paket, das amuleweb enthält, oder kompiliere aMule mit --enable-webserver " +"neu." + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "Kann Ports nicht mit der festgelegten Adresse verbinden: %s" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "Port %u ist nicht erreichbar. Du wirst eine LOWID erhalten\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"Port %u ist nicht erreichbar!\n" +"\n" +"Dies bedeutet, dass du eine niedrige ID erhalten wirst.\n" +"\n" +"Bitte überprüfe deine Netzwerkeinstellungen, um sicherzugehen, dass der Port " +"für ein- und ausgehenden Traffic geöffnet ist." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Erstellen der OnlineSig-Datei gescheitert" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "Erstellen der aMule OnlineSig-Datei gescheitert" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"Die ausgewählte Locale scheint nicht auf dem System installiert zu sein." +"(INFO: Ich werde trotzdem versuchen, sie zu setzen)" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "Dies ist das erste Mal, dass du aMule %s startest" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "Dies ist eine Testversion, täglich aktualisiert, und\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "" +"wir garantieren nicht, dass sie keine Daten zerstört, dein Haus anzündet\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" +"oder deinen Hund tötet. Aber es *sollte* sicher sein, sie zu benutzen.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" +"Die folgenden Optionen wurden in dieser Veröffentlichung aus " +"Sicherheitsgründen geändert:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* Aktivierung der Protokollverschleierungsunterstützung für eingehende und " +"ausgehende Verbindungen.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* Deaktivierung der Aktualisierung der Server-Liste von anderen Servern oder " +"Clients.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"Für mehr Informationen über die Hintergründe für diese Änderungen,\n" +"suche im aMule-Wiki auf http://wiki.amule.org nach \"fake servers\".\n" +"Es ist wichtig, dass Du keine gefälschten (\"fake\") Server in Deiner Server-" +"Liste hast, damit aMule vernünftig funktioniert." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Mehr Informationen und neue Releases können auf unserer Homepage gefunden " +"werden\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" +"unter www.aMule.org, oder in unserem IRC-Channel #amule auf irc.freenode." +"net.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Bitte melde Fehler unter http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"Das angegebene Verzeichnis für die Online-Signaturdateien ist UNGÜLTIG!\n" +"Online-Signatur wird bis zur Fehlerbehebung in den Einstellungen DEAKTIVIERT." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "FEHLER: kann Logdatei nicht öffnen" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "WARNUNG: Logdatei ist leer. Etwas ist falsch." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Das Log wurde zurückgesetzt" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "Servernachricht: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Knotenliste kann nicht geholt werden." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Konnte heruntergeladene Datei zur Versionsprüfung nicht öffnen" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Fehlerhafte Versionsprüfungsdatei" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Du benutzt eine veraltete aMule-Version!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "" +"Diese Version von aMule ist %i.%i.%i und die aktuelle Version ist %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "Die neueste Version kann man immer auf http://www.amule.org finden." + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "WARNUNG: Diese Version von aMuled ist veraltet: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "Deine Kopie von aMule ist aktuell." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Konnte die Versionsprüfungsdatei nicht herunterladen" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Verbunden zu %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Verbinde zu %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "eD2k getrennt" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad gestartet." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad beendet." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Kad verbunden (ok)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Kad verbunden (firewalled)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Kad getrennt" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"Kad-Netzwerk kann mit deaktiviertem UDP-Port nicht benutzt werden, nicht " +"gestartet." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "" +"Kad-Netzwerk ist in den Voreinstellungen deaktiviert, kein " +"Verbindungsversuch." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "Konnte Freundes-Liste 'emfriends.dat' nicht lesen!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "Konnte Freundes-Liste 'emfriends.dat' nicht schreiben!" + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "" +#~ "Bootstrap über eine bestimmte IP von Fernsteuerungs-GUI noch nicht " +#~ "unterstützt." + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "" +#~ "Aktualisierung der server.met über Fernsteuerungs-GUI momentan noch nicht " +#~ "unterstützt." + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "Lese %u Kad-Kontakte" +#~ msgstr[1] "Lese %u Kad-Kontakte" + +#~ msgid "Disconnect from " +#~ msgstr "Trennt vom " + +#~ msgid "current server" +#~ msgstr "derzeitigen Server" + +#~ msgid " and " +#~ msgstr " und von " + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "Trenne von allen Servern und/oder Kad" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "TCP Flags" +#~ msgstr "TCP-Schalter" + +#~ msgid "UDP Flags" +#~ msgstr "UDP-Schalter" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "Kopiere eD2k-Verweis(e) in die Zwischenablage" + +#~ msgid "Client requests %u" +#~ msgstr "Client-Anfrage %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "Datei-Block %u-%u (%d Bytes):" + +#~ msgid "Client request is invalid!" +#~ msgstr "Client-Anfrage ist ungültig!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "Client-Anfrage ist ungültig! %i / %i" + +#~ msgid "Command: %s" +#~ msgstr "Befehl: %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "Kann %s-Datei nicht öffnen - benutze %s-Datei." + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "Warnung: Keine Datei 'known.met' vorhanden." + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles:·Entferne %s aus " +#~ "Freigabeverzeichnisliste:Freigabeverzeichnis nicht gefunden." + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "Warten auf Unterprozess-Abbruch fehlgeschlagen" + +#~ msgid "" +#~ "You cannot connect to a release version from an arbitrary CVS version! " +#~ "*sigh* possible crash prevented" +#~ msgstr "" +#~ "Du kannst nicht zu einer Release-Version von einer beliebigen CVS-Version " +#~ "verbinden! *seufz* möglicher Absturz verhindert" + +#~ msgid "doesn't work" +#~ msgstr "funktioniert nicht" + +#~ msgid "remote gui" +#~ msgstr "entferntes GUI" + +#~ msgid "" +#~ "Error: Failed to load backup file. Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "FEHLER: Fehler beim Laden der Sicherungsdatei. Suche in http://forum." +#~ "amule.org nach .part.met-Wiederherstellungslösungen." + +#~ msgid "" +#~ "Error: Backup part.met file is 0 size! Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Fehler: part.met-Sicherungsdatei hat die Größe 0! Suche auf http://forum." +#~ "amule.org nach part.met-Wiederherstellungslösungen" + +#~ msgid "Error: part.met backup file is 0 size: %s ==> %s" +#~ msgstr "Fehler: part.met-Sicherungsdatei hat die Größe 0: %s ==> %s" + +#~ msgid "" +#~ "Note: These values are\n" +#~ " only used for statistics." +#~ msgstr "" +#~ "Hinweis: Diese Werte werden\n" +#~ "nur für die Statistik gebraucht." + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ " 'All-Plattform'-p2p-Client, basierend auf eMule \n" +#~ "\n" +#~ " Netzseite: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Kontakt: admin@amule.org·(für administrative Anliegen) \n" +#~ "Copyright (C) 2003-2008 aMule-Team \n" +#~ "\n" +#~ " Teile von aMule basieren auf \n" +#~ " Kademlia: Peer-to-peer-Routing basierend auf der XOR-Metrik.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "WARNUNG: Dir wurde eine niedrige ID (LowID) gegeben!" + +#~ msgid "" +#~ "This command requieres an argument. Valid arguments: 'all' or a number.\n" +#~ msgstr "" +#~ "Dieser Befehl benötigt ein Argument. Gültige Argumente: 'all', oder eine " +#~ "Nummer.\n" + +#~ msgid "This command requieres an argument. Valid arguments: a file hash.\n" +#~ msgstr "" +#~ "Dieser Befehl benötigt als gültiges Argument eine Dateiprüfsumme (\"Hash" +#~ "\").\n" + +#~ msgid "Deprecated command, now 'Status'." +#~ msgstr "Veralteter Befehl, jetzt 'Status'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Status' instead.\n" +#~ msgstr "" +#~ "Dieser Befehl ist veraltet, und kann demnächst entfernt werden.\n" +#~ "Verwende stattdessen 'Status'.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter'." +#~ msgstr "Veralteter Befehl, jetzt 'Set IPFilter'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter' instead.\n" +#~ msgstr "" +#~ "Dieser Befehl ist veraltet, und kann demnächst entfernt werden.\n" +#~ "Verwende stattdessen 'Set IPFilter'.\n" + +#~ msgid "Deprecated command, now 'Get IPFilter Level'." +#~ msgstr "Veralteter Befehl, jetzt 'Get IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Dieser Befehl ist veraltet, und kann demnächst entfernt werden.\n" +#~ "Verwende stattdessen 'Get IPFilter Level'.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter Level'." +#~ msgstr "Veralteter Befehl, jetzt 'Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Dieser Befehl ist veraltet, und kann demnächst entfernt werden.\n" +#~ "Verwende stattdessen 'Set IPFilter Level'.\n" + +#~ msgid "Deprecated command, now 'Get/Set IPFilter Level'." +#~ msgstr "Veralteter Befehl, jetzt 'Get/Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get/Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Dieser Befehl ist veraltet, und kann demnächst entfernt werden.\n" +#~ "Verwende stattdessen 'Get/Set IPFilter Level'.\n" + +#~ msgid "Deprecated command, now 'Show Servers'." +#~ msgstr "Veralteter Befehl, jetzt 'Show Servers'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Show Servers' instead.\n" +#~ msgstr "" +#~ "Dieser Befehl ist veraltet, und kann demnächst entfernt werden.\n" +#~ "Verwende stattdessen 'Show Servers'.\n" + +#~ msgid "Deprecated command, now 'Get BwLimits'." +#~ msgstr "Veralteter Befehl, jetzt 'Get BwLimits'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get BwLimits' instead.\n" +#~ msgstr "" +#~ "Dieser Befehl ist veraltet, und kann demnächst entfernt werden.\n" +#~ "Verwende stattdessen 'Get BwLimits'.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Up'." +#~ msgstr "Veralteter Befehl, jetzt 'Set BwLimit Up'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Up' instead.\n" +#~ msgstr "" +#~ "Dieser Befehl ist veraltet, und kann demnächst entfernt werden.\n" +#~ "Verwende stattdessen 'Set BwLimit Up'.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Down'." +#~ msgstr "Veralteter Befehl, jetzt 'Set BwLimit Down'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Down' instead.\n" +#~ msgstr "" +#~ "Dieser Befehl ist veraltet, und kann demnächst entfernt werden.\n" +#~ "Verwende stattdessen 'Set BwLimit Down'.\n" + +#~ msgid "Syncronization thread started." +#~ msgstr "Beginne Synchronisations-Nebenprozess (\"Thread\")" + +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "Hauptprüfsummen bekannter Dateien wurden geladen" + +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "Fehler beim Lesen der Kad-Kontakte - 0 Einträge" + +#~ msgid "Merge attempt" +#~ msgstr "Zusammenfügungsversuch" + +#~ msgid "Recursive merge" +#~ msgstr "Rekursives Zusammenfügen" + +#~ msgid "Sucessful merge!" +#~ msgstr "Erfolgreich zusammengefügt!" + +#~ msgid "No merge possible" +#~ msgstr "Zusammenfügen nicht möglich" + +#~ msgid "Buddy address: " +#~ msgstr "Buddy-Adresse: " + +#~ msgid "Allow usage of system wide ipfilter.dat" +#~ msgstr "Erlaube Benutzung der systemweiten ipfilter.dat" + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid " %d" +#~ msgstr " %d" + +#~ msgid ".%d" +#~ msgstr ".%d" + +#~ msgid "Shows the process of a search." +#~ msgstr "Zeigt den Fortschritt einer Suche." + +#~ msgid "Shows the process of a search..\n" +#~ msgstr "Zeigt den Fortschritt einer Suche.\n" + +#~ msgid "Search warning." +#~ msgstr "Suchwarnung." + +#~ msgid "Client Identification:" +#~ msgstr "Client-Identifizierung:" + +#~ msgid "Use Secure Identification" +#~ msgstr "Benutze sichere Identifikation" + +#~ msgid "" +#~ "Secure Identification uses a handshake approch to safely identify clients " +#~ "for use with the credit system." +#~ msgstr "" +#~ "Sichere Identifikation benutzt einen Handshake, um andere Clients " +#~ "eindeutig zu erkennen. Dies wird für das Creditsystem benötigt." + +#~ msgid "Sources Dropping" +#~ msgstr "Quellenverwurf" + +#~ msgid "Source Dropping" +#~ msgstr "Quellenverwurf" + +#~ msgid "Keep sources" +#~ msgstr "Quellen behalten" + +#~ msgid "Drop sources" +#~ msgstr "Quellen verwerfen" + +#~ msgid "Send sources to any other file before dropping (High CPU)" +#~ msgstr "" +#~ "Quellen vor dem Verwurf auf eine andere Datei übertragen (hohe CPU-Last)" + +#~ msgid "Sources with no needed file-parts." +#~ msgstr "Quellen ohne benötigte Teile" + +#~ msgid "Full Queue Sources Handling" +#~ msgstr "Behandlung von Quellen mit voller Warteschlange" + +#~ msgid "Enable auto drop Full Queue Sources" +#~ msgstr "" +#~ "Automatisches Verwerfen von Quellen mit voller Warteschlange aktivieren" + +#~ msgid "High Queue Rating Sources Handling" +#~ msgstr "Behandlung, wenn weit hinten in der Warteschlange" + +#~ msgid "Enable auto drop High Queue Rating Sources" +#~ msgstr "'weit hinten in der Warteschlange' automatisch entfernen" + +#~ msgid "High Queue Rating value" +#~ msgstr "Hinterster Platz in Warteschlange" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(Min 300 / Max 3000)" + +#~ msgid "Auto Drop Sources Timer" +#~ msgstr "Zeit bis zum automatischen Quellenverwurf" + +#~ msgid "Timer (in secs)" +#~ msgstr "Intervall in Sekunden" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(Min 60 / 3600 Max)" + +#~ msgid "Drop No Needed Sources now" +#~ msgstr "Verwerfe unbenötigte Quellen" + +#~ msgid "Drop Full Queue Sources now" +#~ msgstr "Verwerfe Quellen mit voller Warteschlange" + +#~ msgid "Drop High Queue Rating Sources now" +#~ msgstr "Verwerfe Quellen mit hoher Warteposition" + +#~ msgid "Clean Up Sources now (NNS, FQS && HQRS)" +#~ msgstr "Quellen aufräumen (NBQ, QVW && QHW)" diff --git a/po/el.po b/po/el.po new file mode 100644 index 00000000..9b490700 --- /dev/null +++ b/po/el.po @@ -0,0 +1,6986 @@ +# Greek translations for aMule. +# Copyright (C) YEAR Free Software Foundation, Inc. +# This file is distributed under the same license as aMule. +# Dimitrios Galanakis , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: el\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2007-12-20 04:19-0600\n" +"Last-Translator: Dimitrios Galanakis \n" +"Language-Team: Greek\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Το συνθηματικό δεν πρέπει να είναι κενο." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Άκυρο συνθηματικό, δεν είναι κατακερματισμός τύπου MD5!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Αποτυχία σύνδεσης" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "Αποτυχημένη συνδεση EC, Κενή απάντηση" + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "ExternalConn: Δεν επιτρέπεται η πρόσβαση διότι:" + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "ExternalConn: Απαγορεύεται η πρόσβαση" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "" +"ExternalConn: Κακή ανταπόκριση του εξυπηρετητή. Η σύνδεση τερματίστηκε." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Γιούπι! Σύνδεση επιτευχθει με το aMule" + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Γιούπι! Σύνδεση επιτεύχθει" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Κατατεμαχισμός (hashing)" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Διαδικασία ολοκλήρωσης" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Ολοκλήρωση" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Σταματημένο" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Εσφαλμένο" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Κατεβάζοντας" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Περιμένοντας" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Εκκίνηση δημιουργίας κατακερματισμού MD5 και AICH για το αρχείο: %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Εκκίνηση δημιουργίας κατακερματισμού MD5 για το αρχείο: %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Εκκίνηση δημιουργίας κατακερματισμού AICH για το αρχείο: %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" +"Ειδοποίηση: Το όνομα αρχείου '%s' είναι άκυρο και μετονομάστηκε σε '%s' " + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "" +"Ειδοποίηση: Το αρχείο '%s' υπάρχει ήδη, το νέο αρχείο μετονομάστηκε σε '%s'" + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" +"Ειδοποίηση: Δεν μπόρεσα να σβήσω το αρχικό '%s' μετά τη δημιουργία " +"αντιγράφου ασφαλείας" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "Ειδοποίηση: Απέτυχα να σβήσω το %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Αποτυχία λήψης των κοινών αρχείων του χρήστη '%s'" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Αγνωστο" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr "(Πλασματική έκδοση eMule %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr "(Πλασματικό eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (Πλασματικό eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (βασισμένο στο eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Παρατσούκλι: %s Ταυτότητα: %u" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "Αιτήθηκε:" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Στατιστηκές αρχείων για την τρέχουσα περίοδο: Δεκτές %d στις %d αιτήσεις, %s " +"μεταφέρθηκαν\n" +msgstr[1] "" +"Στατιστηκές αρχείων για την τρέχουσα περίοδο: Δεκτές %d στις %d αιτήσεις, %s " +"μεταφέρθηκαν\n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Στατιστηκές αρχείων για όλες τις περιόδους: Δεκτές %d στις %d αιτήσεις, %s " +"μεταφέρθηκαν\n" +msgstr[1] "" +"Στατιστηκές αρχείων για όλες τις περιόδους: Δεκτές %d στις %d αιτήσεις, %s " +"μεταφέρθηκαν\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Αναζητήθηκε άγνωστο αρχείο" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "Πελάτης %s στην θύρα IP %s:%d ο οποίος χρησιμοποιεί %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Όνομα Χρήστη" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Φίλοι" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Ενδείξεις &Πληροφορίες" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Πρόσθεσε έναν φίλο" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Αφαίρεσε έναν φίλο" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Στείλε &Μύνημα" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Δες αρχεία" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Εγκαθίδρυσε φιλική σχισμή " + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "" +"Είσαι σίγουρος/η ότι θέλεις να σβήσεις τον συγκεκριμένο φίλο (μην κλείνεις " +"πόρτες, δύσκολα βρίσκεις φίλους)" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "" +"Είσαι σίγουρος/η ότι θέλεις να σβήσεις τον συγκεκριμένο φίλο (μην κλείνεις " +"πόρτες, δύσκολα βρίσκεις φίλους)" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Ακύρωση" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"Δεν επιτρέπεται να θέσεις μόνο πανω από μία φιλική σχισμή (ανώμαλε). \n" +" Γι αυτό μόνο μία ανατέθηκε." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Πολλαπλή επιλογή" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Όνομα αρχείου" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Μέγεθος" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Τύπος" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Προτεραιότητα" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "Τιμή ταυτότητας αρχείου" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Αιτήσεις" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Αποδεκτές αιτήσεις" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Όγκος μεταφερμένων δεδομένων" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Λόγος συμμετοχής" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Κεκτημένα τμήματα" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Ολοκληρωμένες πηγές" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Μονοπάτι καταλόγου" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Κοινόχρηστα αρχεία" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Πολή χαμηλή" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Χαμηλή" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Κανονική" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Υψηλή" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Πολή υψηλή" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Διάθεση στην κυκλοφορία" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Αυτόματο" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Προσθήκη σχολίου/Αξιολόγησης" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Διόρθωση σχολίου/Αξιολόγησης" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Μετονομασία" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Προσθήκη των αρχείων της συλλογής στον κατάλογο με τα μεταφερόμενα" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Αντιγραφή μαγνήτη &URI στην πρόχειρη μνήμη" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Αντιγραφή ED2k &διασύνδεσης στην πρόχειρη μνήμη" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Αντιγραφή ED2k &διασύνδεσης στην πρόχειρη μνήμη (&Πηγή)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "" +"Αντιγραφή ED2k &διασύνδεσης στην πρόχειρη μνήμη (&Πηγή) (&Με κρυπογραφικές " +"επιλογές)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Αντιγραφή ED2k &διασύνδεσης στην πρόχειρη μνήμη (&Όνομα υπολογιστή)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" +"Αντιγραφή ED2k &διασύνδεσης στην πρόχειρη μνήμη (&Όνομα υπολογιστή) (&Με " +"κρυπογραφικές επιλογές)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Αντιγραφή ED2k &διασύνδεσης στην πρόχειρη μνήμη (&Πληροφορίες AICH) " + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Αντιγραφή των συμβουλων στην πρόχειρη μνήμη" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Προειδοποίηση" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Κοινά αρχεία (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[Μέρος αρχείου]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Δώστε νέο όνομα γι αυτό το αρχείο" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Μετονομασία αρχείου" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Σύνεχεια του ανεβάσματος του αρχείου: %s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Αναστολή ανεβάσματος του αρχείου: %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: Η λέξη κλειδί αναζήτησης είναι πολυ μικρούλα" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Σφάλμα: Αδύνατη η επικοινωνία μέσω της TCP θύρας" + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "Η αίτηση απέτυχε με το εξής σφάλμα: %s" + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "Η αίτηση απέτυχε για άγνωστο λόγο" + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "Το αρχείο δεικτών δεν βρέθηκε (ψάχνω ψάχνω και τίποτα δεν βρίσκω)" + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Εκκίνηση εξυπηρετητή δικτύου\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Η περίοδος εργασίας έληξε - αίτηση επανασύνδεσης\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Η Περίοδος εργασίας είναι εντάξη, συνδεδεμένο\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Η Περίοδος εργασίας είναι εντάξη, μη συνδεδεμένο\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Δεν έχει ξεκινήσει περίοδος εργασίας - θα ξητηθεί σύνδεση\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Δημιουργία περιόδου εργασίας - ζήτηση σύνδεσης\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Το αίτημα διεκπεραιώνετε [αρχικό]:" + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Έλεγχος κωδικού\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Ο κωδικός κατακερματισμού είναι άκυρος\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Εντάξει το συνθηματικό\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Κακό συνθηματικό\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "Δεν βάλατε κανένα συνθηματικό. Το κενό συνθηματικό δεν επιτρέπεται.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Ζητήθηκε αποσύνδεση\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Επεξεργασία αιτήματος [ανακατεύθυνση]" + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Φόρτωση προτύπου " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "Θύρα UPnP " + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr " Χρήση συμπίεσης τύπου gzip" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Να επιτρέπεται η πρόσβαση σε επισκέπτες" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Να απαγορεύεται η πρόσβαση σε επισκέπτες" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "Η διαδρομή στα αρχεία ρυθμίσεων του aMule. ΜΗΝ ΑΛΛΑΖΕΤΕ ΑΠΕΥΘΕΙΑΣ" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "Απενεργοποίηση του διερμηνέα PHP" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Μετάγλωτιση των σελίδων PHP σε κάθε αίτηση" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Μεταφόρτωση..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Προτιμήσεις" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Πλοήγηση" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Χρήστης" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Κωδικός" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Γράψτε εδώ το όνομα χρήστη για να συνδεθείτε στον διακομιστή FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Γράψτε εδώ τοn κωδικό χρήστη για να συνδεθείτε στον διακομιστή FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "Περίοδος ενημέρωσης του FTP σε λεπτά" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Τεκμηρίωση" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Κατάλογος που περιέχει το αρχείο υπογραφής" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Κατάλογος οπου να δημιουργηθεί η στατιστική απεικόνιση" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i Ημέρες %i Ώρες %i λεπτά %i s" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, Στατιστικές σύνδεσης aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Καλώς ήρθατε (Καλώς σας βρήκαμε)" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Μέγιστη ταχύτητα κατεβάσματος στη διάρκεια που το wxCas τρέχει" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "" +"Απόλυτα ελάχιστη ταχύτητα κατεβάσματος στις προηγούμενες εκτελέσεις του wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Επαναφορά" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "Σύστημα" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Διακοπή της αυτόματης ανανέωσης" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Αποθήκευση της απεικόνισης στατιστικών σύνδεσης" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Εκτύπωση της απεικόνισης στατιστικών σύνδεσης" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Ρυθμίσεις προτιμήσεων" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "Σχετικά με το wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Εκκίνηση της αυτόματης ανανέωσης" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Η αυτόματη ανανέωση σταμάτησε" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Η αυτόματη ανανέωση ξεκίνησε" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Αοθήκευση της στατιστικής απεικόνισης" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Δεν υπάρχει χειριστής για αυτόν τον τύπο αρχείου" + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "Το αρχείο δεν αποθυκεύτηκε" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "Στατιστικές σύνδεσης του aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Υπήρξε πρόβλημα κατά την εκτύπωση.\n" +"Μήπως ο τρέχων εκτυπωτής δεν έχει ρυθμιστεί σωστά;" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Εκτύπωση" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, Στατιστικές συνδεδεμένων υπογραφών\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Βασισμένο στο CAS του Pedro de Oliveira \n" +"\n" +"Διανέμετε υπό την GPL" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Να πάρει! Το amule δεν τρέχει.." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "Το aMule τρέχει" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "Το aMule τρέχει, αλλά δεν είναι συνδεδεμένο" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "Το aMule συνδέεται..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Στο καλό! Η κατάσταση του aMule είναι άγνωστη..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr "τρέχει επί" + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr "έχει διακοπεί !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr "δεν είναι συνδεδεμένο !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr "συνδέεται.." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr "κάνει κάτι κουφό, τσέκαρέ το!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr "είναι συνδεδεμένο με" + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "Εντάξει" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "βρίσκεται πίσω από τοίχο προστασίας" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "κλειστό" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr "είναι ανοιχτό" + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +#, fuzzy +msgid " with " +msgstr "] με" + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Συνολική μεταφόρτωση:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Ανέβασμα: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Περίοδος κατεβάσματος:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Μεταφόρτωση" + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s, Ανέβασμα: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Κοινοκτημοσύνη" + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr "Αρχείο(α), Πελάτες στην αναμονή: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Χρόνος" + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " ανοιχτό" + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Μέσο φορτίο συστήματος (1-5-15 λεπτα): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Χρόνος λειτουργικότητας συστήματος:" + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uD %02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "Καλή ποιότητα σύνδεσης (HighID)" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "Κακή ποιότητα σύνδεσης (LowID)" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Δέν είναι συνδεδεμένο" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "Ακυρώθηκε !" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Αποτυχία ανοίγματος του %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "" +"Το αρχείο %s είναι πολύ μεγάλο για το Μουλάρι: το μέγιστο επιτρεπτό είναι 4 " +"GB." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Παράμετρος εισόδου" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Αρχείο προς κατακερματισμό" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Προσθήκη προεραιτικών URL για αυτό το αρχείο" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Εκκίνηση" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Αποθύκευση" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Αντιγραφή στο πρόχειρο" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Έξοδος" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Ανοίξτε ένα αρχείο για να υπολογίσετε τον σύνδεσμο ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Αντιγραφή του υπολογισμένου συνδέσμου ed2k στο πρόχειρο " + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Εγγραφή του υπολογισμένου συνδέσμου ed2k σε αρχείο" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "Σχετικά με τον aLinkCreator" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Επιλέξτε το αρχείο του θέλετε για να υπολογίσετε τον σύνδεσμο ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "Δεν υπάρχει τίποτα για να αντιγραφεί σε αυτή τη φάση !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Διαλέξτε το αρχείο στο υπολογισμένο σύνδεσμο ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Αδύνατο το άνοιγμα" + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Παρακαλώ δώστε ένα μη κενό όνομα αρχείου" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "Δεν υπάρχει τίποτα για να σωθεί σε αυτή τη φάση !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, ο δημιουργός συνδέσμων ed2k του aMule\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "Συμβατό με eMule" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Τοπικός διακομιστής" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Απομακρυσμένος διακομιστής" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Ανταλλαγή πηγών" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Παθητικό" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Σύνδεσμος" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Πηγαίος σπόρος" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Εργοστασιακές ρυθμίσεις" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Αραβικά" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Βασκικά" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Βουλγάρικα" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Καταλανικά" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Κινέζικα (απλοποιημένα)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Κινέζικα (Παραδοσιακά)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Κροάτικα" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Δανέζικα" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Ολανδικά" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Αγγλικα (Ην. Βασίλειο)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Εστονικά" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Φιλανδικά" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Γαλλικά" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Γαλικιακά" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Γερμανικά" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Ουγκαρέζικα" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Ιταλικά" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Ιταλικά (Ελβετίας)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Κορεάτικα" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Πολωνέζικα" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Πορτογαλλικά" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Πορτογαλικά (Βραζιλίας)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Ρωσικά" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Σλοβένικα" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Ισπανικά" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Τούρκικα" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Ο τύπος του πλοηγού δεν μπορεί να προσδιοριστεί" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" +"Η θύρα TCP δεν μπορεί να είναι μεγαλύτερη από 65532, διότι η θύρα UDP του " +"διακομιστή είναι TCP+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Θα χρησιμοποιηθεί η στάνταρ θύρα (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Όνομα διακομιστή" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Διεύθυνση" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Θύρα" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Περιγραφή" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ηχοβολιστής πακέτων" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Χρήστες" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Αρχεία" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Απέτυχε" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Στατικό" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Έκδοση" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Είστε συνδεδεμένος σε έναν διακομιστή που προσπαθείτε να διαγράψετε. " +"Παρακαλω αποσυνδεθείτε πρώτα. Ο διακομιστής δεν διαγράφηκε." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Πληροφορίες" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(Άγνωστο όνομα)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Είστε σίγουρος/η οτι θέλετε να διαγράψετε τον στατικό διακομιστή %s" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Ναι" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Όχι" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Αποτυχημένη προσπάθεια να ανοίξει '%s'" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Διακομιστές (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Διακομιστής" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Σύνδεση σε διακομιστή" + +#: src/ServerListCtrl.cpp:428 +#, fuzzy +msgid "Mark server as static" +msgstr "Σημαδεψτε τον/τους διακομιστή/ες ως στατικο/ους" + +#: src/ServerListCtrl.cpp:429 +#, fuzzy +msgid "Mark server as non-static" +msgstr "Σημαδεψτε τον/τους διακομιστή/ες ως μη στατικο/ους" + +#: src/ServerListCtrl.cpp:431 +#, fuzzy +msgid "Mark servers as static" +msgstr "Σημαδεψτε τον/τους διακομιστή/ες ως στατικο/ους" + +#: src/ServerListCtrl.cpp:432 +#, fuzzy +msgid "Mark servers as non-static" +msgstr "Σημαδεψτε τον/τους διακομιστή/ες ως μη στατικο/ους" + +#: src/ServerListCtrl.cpp:438 +#, fuzzy +msgid "Remove server" +msgstr "Διαγράψτε τους διακομιστές" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "Διαγράψτε τους διακομιστές" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Διαγράψτε όλους τους διακομιστές" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "Αντιγράψτε τo/τα ED2k συνδέσμο/ους στην πρόχειρη μνήμη." + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Επανασυνδεση στον διακομιστή" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Σίγουρα να σβηστούν όλοι οι διακομιστές;" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Σίγουρα να σβηστούν όλοι οι επιλεγμένοι διακομιστές;" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Σίγουρα να σβηστούν όλοι οι επιλεγμένοι διακομιστές;" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "" + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr "" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr "" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "Διαδικασία σύνδεσης με %s" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "Αποσυνδεδεμένο Kad" + +#: src/amuleDlg.cpp:676 +#, fuzzy +msgid "Kad: Firewalled" +msgstr "βρίσκεται πίσω από τοίχο προστασίας" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "Δέν είναι συνδεδεμένο" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "Διαδικασία σύνδεσης με %s" + +#: src/amuleDlg.cpp:689 +#, fuzzy +msgid "Kad: Off" +msgstr " Kad: " + +#: src/amuleDlg.cpp:718 +msgid "Stop the current connection attempts" +msgstr "" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "" + +#: src/amuleDlg.cpp:722 +msgid "Disconnect from the currently connected networks" +msgstr "" + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "" + +#: src/amuleDlg.cpp:726 +msgid "Connect to the currently enabled networks" +msgstr "" + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "" + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:980 +#, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:987 +#, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:999 +#, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "" + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "" + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "" + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "" + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "" + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "" + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "" + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "" + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "" + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "" + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "" + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "" + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "" + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "" + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "" + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "" + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "" + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "" + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "" + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "" + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "" + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "" + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "" + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "" + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "" + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "" + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "" + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "" + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "" + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "" + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "" + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "" + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "" + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "" + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Χρήστες: E: %s K: %s | Αρχεία E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "" +"Είσαι σίγουρος/η ότι θέλεις να σβήσεις τον συγκεκριμένο φίλο (μην κλείνεις " +"πόρτες, δύσκολα βρίσκεις φίλους)" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "" +"Είσαι σίγουρος/η ότι θέλεις να σβήσεις τον συγκεκριμένο φίλο (μην κλείνεις " +"πόρτες, δύσκολα βρίσκεις φίλους)" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "" + +#: src/DownloadListCtrl.cpp:2222 +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2260 +#, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "" + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "" + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "" + +#: src/PartFile.cpp:1019 +#, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "" + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "Κρύψιμο των κοινόχρηστων αρχείων " +msgstr[1] "Κρύψιμο των κοινόχρηστων αρχείων " + +#: src/SharedFileList.cpp:358 +#, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "" +msgstr[1] "" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "" + +#: src/CommentDialogLst.cpp:104 +#, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "" + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "" + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "" + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "" + +#: src/ServerConnect.cpp:391 +#, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "" + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "" + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "" + +#: src/DownloadQueue.cpp:175 +#, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "" +msgstr[1] "" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "" + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "" + +#: src/TextClient.cpp:305 +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" + +#: src/TextClient.cpp:343 +msgid "Processing by hash: " +msgstr "" + +#: src/TextClient.cpp:358 +#, fuzzy +msgid "Processing by filename: " +msgstr "Το αίτημα διεκπεραιώνετε [αρχικό]:" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "" + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "" + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "" + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "" + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "" + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "" + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "" + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "" + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "" + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "" + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "" + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "" + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "" + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "" + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "" + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "" + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "" + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "" + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "" + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "" + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "" + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "" + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "" + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "" + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "" + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "" + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "" + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "" + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "" + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "" + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "" + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "" + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "" + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "" + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "" + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "" + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "" + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "" + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "" + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "" + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "" + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "" + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "" + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "" + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "" + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "" + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "" + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "Διαγράψτε όλους τους διακομιστές" +msgstr[1] "Διαγράψτε όλους τους διακομιστές" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "" + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "" + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "" + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "" + +#: src/IP2Country.cpp:73 +#, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "" +msgstr[1] "" + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "" + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "" + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "" + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "Σύστημα" +msgstr[1] "Σύστημα" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "" + +#: src/OtherFunctions.cpp:156 +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "" +msgstr[1] "" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "" + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" + +#: src/IPFilter.cpp:330 +#, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +msgstr[1] "" + +#: src/IPFilter.cpp:332 +#, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +msgstr[1] "" + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "" + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "" + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "" + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "" + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "" + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "" + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "" + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "" + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "" + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "" + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "" + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "" + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "" + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "" + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "" + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "" + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "" + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "" + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "" + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "" + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "" + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "" + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "" + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Πληροφορίες διακομιστή" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Πατήστε αυτό το κουμπί για την επαναφορά του αρχείου καταγραφής." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "Αρχείο καταγραφείς aMule" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "" +"Πατήστε αυτό το αρχείο για να ανανεώσετε την λίστα διακομιστών από την " +"URL ..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Λίστα διακομιστών" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Βάλτα εδω την url ενός αρχείου server.met και πατήστε το κουμπί στα αριστερά " +"για να ανανεώσετε τη λίστα με τους γνωστούς διακομιστές" + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Προσθήκη διακομιστή με το χέρι: Όνομα" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Γράψτε το όνομα του νέου διακομιστή εδώ" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Γράψτε την IP του διακομιστή εδώ, σε μορφή x.x.x.x" + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Γράψτε την θύρα του διακομιστή εδώ." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "" +"Βάλτε τον διακομιστή με το χέρι (γεμίστε πρώτα τα πεδία στα αριστερά) ..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "Πληροφορίες ED2K" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Πληροφορίες Kad" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"Οι επιλεγμένες τοπικές ρυθμίσες δεν φαίνεται να είναι εγκατεστημένες στον " +"υπολογιστή σας\n" +"Πρέπει να της δημιουργήσετε για να χρησιμοποιήσετε αυτήν την γλώσσα.\n" +"Μια καλή αρχή στα συστήματα Λίνουξ είναι το αρχείο /etc/locale.gen και το " +"πακέτο 'locales'\n" +"Άντε και καλή τύχη!\n" +"(Παρατήρηση: θα δοκιμάσω να το θέσω ούτως ή άλλως)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Να μην ξαναεμφανιστεί" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "" +"Πατήστε το κουμπί για να ανανεώσετε την λίστα των κόμβων από την URL ..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Κόμβοι (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"Βάλτε εδώ την url ενός αρχείου nodes.dat και πατήστε το κουμπί στα αριστερά " +"για να ανανεώσετε την λίστα των γνωστών κόμβων." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Στατιστικές κόμβων" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Εκκινητήρας" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Καινούριος κόμβος" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Θύρα:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Εκκίνηση από\n" +"γνωστούς πελάτες" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Αποσυνδεδεμένο Kad" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Ασάφεια πρωτοκόλου" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Υποστήρηξη ασάφειας πρωτοκόλου" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"Αυτή η επιλογή ενεργοποίησε την Ασάφεια Πρωτοκόλου και κάνει το aMule να " +"δέχετε ασαφείς συνδέσεις από άλλους πελάτες" + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Χρήση ασάφειας για εξωτερικές συνδέσεις" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"Αυτή η επιλογή κάνει το aMule να χρησιμοποιεί Ασάφεια Πρωτοκόλου όταν " +"συνδέεται σε άλλους πελάτες/διακομιστές." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Να γίνονται δεκτές μόνο ασαφείς συνδέσεις" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"Αυτή η επιλογή κάνει το aMule να δέχετε μόνο ασαφείς συνδέσεις. Θα υπαρχουν " +"λιγότερες πηγές αλλά όλη η κυκλοφορία θα είναι ασαφής" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Παράμετροι αρχείων" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Οι πάντες" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Κανείς" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Ποίος μπορεί να δεί τα κοινόχρηστα αρχεία:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "" +"Επιλέξτε ποίος μπορεί να ξητήσει να δει τη λίστα με τα κοινόχρηστα αρχεία " +"σας." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "Φίλτρο IP" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Φιλτράρισμα πελατών" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Ενεργοποίηση φιλτραρίσματων του IP των πελατών όπως ορίζεται στο ~/.aMule/" +"ipfilter.dat." + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Φιλτράρισμα διακομιστών" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Ενεργοποίηση φιλτραρίσματων του IP των διακομιστών όπως ορίζεται στο ~/." +"aMule/ipfilter.dat." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Επαναφώρτωση λίστας" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "" +"Επαναφόρτωση για φιλτράρισμα της λίστας των IP από το ~/.aMule/ipfilter.dat" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Ανανέωσε τώρα" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Αυτόματη ανανέωση του ipfilter κατά την εκκίνηση" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Επίπεδο φιλτραρίσματος:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Συχνότητα ανανέωσης (δεπτερόλεπτα):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "" + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Ρυθμίσεις διήθησης:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Διήθηση όλων των μυνημάτων" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Διήθηση των μυνημάτων από μη μέλη της λίστας φίλων" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Διήθηση μυνημά από άγνωστους πελάτες" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Διήθηση των μυνημάτων που περιέχουν (χρήση ',' ως διαχωριστικού):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"προσθήκη σε αυτό το σημείο των λέξεων που το aMule πρέπει να φιλτράρει και " +"μπλοκάρισμα μυνημάτων που το περιέχουν" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Ενεργοποίηση διακομιστή μεσολάβησης" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Ενεργοποίηση/Απενεργοποίηση υποστήριξης διακομιστή μεσολάβησης" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Τύπος διαμεσολάβησης" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "Ο τύπος του διακομιστή μεσολαβησης στον οποίον συνδέεστε" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Υπολογιστής διακομιστή μεσολάβησης" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "Όνομα του διακομιστή μεσολάβησης" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Θύρα διακομιστή μεσολάβησης:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "Η θύρα διακομιστή μεσολάβησης" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Πιστοποίηση" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Ενεργοποίηση πιστοποίησης" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "" + +#: src/ExternalConnector.cpp:188 +#, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "" + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "" + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Συντακτικό λάθος!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Σφάλμα κατά την επεξεργασία της εντολής - δεν έπρεπε να συμβέι ποτέ! " +"Παρακαλείστε να αναφέρετε σφάλμα προγράμματος\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Αυτή η εντολή δεν πρέπει να έχει παραμέτρους." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Αυτή η εντολή πρέπει να έχει παράμετρο." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Άκυρο όρισμα." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Αυτή είναι ημιτελής εντολή." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Για περισσότερη βοήθεια, γράψτε '%s'.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "Αυτό είναι %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "Αυτό είναι %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +" Δημιουργία πελάτη...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "" +"Η σύνδεση απέτυχε. Αποτυχία σύνδεσης με τον προσδιορισμένο υπολογιστή\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"Όλα μια χαρά, έξοδος %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"Δεν είναι δυνατη η σύνδεση με κενό κωδικό.\n" +"Πρέπει να προσδιορίσετε έναν κωδικό είτε στο αρχείο παραμέτρων\n" +"είτε στην γραμμή εντολών είτε προσδιορίζοντας κάποιο όταν ζητηθεί.\n" +"Έξοδος...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Δείξε αυτό το αρχείο βοήθειας." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "" +"Υπολογιστής όπου το aMule τρέχει (προεπιλεγμένος: ο τοπικός υπολογίστής)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "Η Θύρα του aMule για Εξωτερική σύνδεση. (προεπιλεγμένη: 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Κωδικός εξωτερικής σύνδεσης" + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Διάβασε το αρχείο διευθετήσεων" + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "Μην στέλνεις μηνήματα στην stdout." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Να είσαι αναλυτικός - δείξε και να μηνήματα αποσφαλμάτωσης" + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Θέσε τις τοπικές ρυθμίσεις" + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "Εγγραφή των παραμέτρων της γραμμής εντολών σε αρχείο." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "" +"Δημιουργεί ένα αρχείο παραμέτρων βασισμένο στο αρχείο παραμέτρων του aMule." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Τύπωσε την έκδοση του προγράμματος." + +#: src/ClientCreditsList.cpp:168 +#, fuzzy, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "Αρχείο πιστώσεων φορτώθηκε, %u πελάτες είναι γνωστοί" +msgstr[1] "Αρχείο πιστώσεων φορτώθηκε, %u πελάτες είναι γνωστοί" + +#: src/ClientCreditsList.cpp:171 +#, fuzzy, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] "- Οι πιστώσεις έληξαν για %u πελάτες!" +msgstr[1] "- Οι πιστώσεις έληξαν για %u πελάτες!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "Δεν βρέθηκε το αρχείο 'cryptkey.dat' και γι αυτό το δημιουργώ" + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"ΣΦΑΛΜΑ: ο δαίμονας του aMule δεν μπορεί να χρησιμοποιηθεί όταν οι εξωτερικές " +"συνδέσεις είναι απενεργοποιημένες. Για να ενεργοποιήσετε τις εξωτερικές " +"συνδέσεις, χρησιμοποιήστε είτε ένα κανονικό aMule, ξεκινίστε το amuled με " +"την παράμετρο --ec-config ή θέστε το κλειδί \"AcceptExternalConnections\" " +"στην τιμή 1 στο αρχείο ~/.aMule/amule.conf" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "ΣΦΑΛΜΑ: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Άρση απαγόρευσης" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Δείξε τα ανεβάσματα" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Δείξε τη λίστα προτεραιότητας" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Δείξε τους πελάτες" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Επιλογή προβολής" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Λογισμικό πελάτη" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Ανέμεινε" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Χρόνος ανεβάσμανος" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Κατέβασμα/Ανέβασμα" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Κατάσταση του μακρυνού πελάτη" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "QR: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Προτεραιότητα αρχείου" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Σκορ" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Ερωτήθηκε" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Ειδόθηκε τελευταία φορά" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Εισήχθει στην λίστα προτεραιότητας" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Κατάσταση ανεβάσματος" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Μεταφέρθηκαν προς τα πάνω" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Κατάσταση κατεβάσματος" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Μεταφέρθηκαν προς τα κάτω" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Πίνακας ατακερματισμού χρηστών" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Κρυπτογραφημένο" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Κρύψιμο των κοινόχρηστων αρχείων " + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Πληροφορίες πελάτη" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Δεν υποστηρίζεται" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Δεν ολοκληρώθηκε" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Κακό παιδί" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Επιβεβαιώθηκε - OK" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Δεν υπάρχει" + +#: src/ClientDetailDialog.cpp:190 +#, fuzzy, c-format +msgid "%u (QR: %u)" +msgstr "QR: %u" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" +"Το ελάχιστο μέγεθος πρέπει να είναι μικρότερο από το μέγιστο. Το μέγιστο " +"μέγεθος θα αγνοηθεί." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Προειδοποίηση ψαξίματος" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "" + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "" + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "" + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Κλείσιμο καρτέλας" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Κλείσιμο όλων των καρτελών" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Κλείσιμο των άλλων καρτελών" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "Φόρτωση του αρχείου εξυπηρετητών: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "Το αρχείο server.met δεν βρέθηκε" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" +"Σφάλμα φόρτωσης του αρχείου server.met '%s', βρέθηκε άγνωστη μορφοποίηση." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "Αποτυχία ανοίγματος του αρχείου server.met" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"Το αρχείο server.met είναι φθαρμένο. βρέθηκε λανθασμένη ετικέτα έκδοσης: 0x%" +"x, μεγεθος %i" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "Βρέθηκαν %i εξυπηρετητές στο αρχείο server.met" +msgstr[1] "Βρέθηκαν %i εξυπηρετητές στο αρχείο server.met" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "Προστέθηκαν %d εξυπηρετητές" +msgstr[1] "Προστέθηκαν %d εξυπηρετητές" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Ο εξυπηρετητής δεν προστέθηκε: [%s:%d] δεν προσδιορίζει έγκυρη θύρα." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "" +"Ο εξυπηρετητής δεν προστέθηκε: Το IP του [%s:%d] είναι φιλτραρισμένο ή άκυρο." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" +"Ο εξυπηρετητής δεν προστέθηκε: Εξυπηρετητής με το ίδιο IP:Θύρα [%s:%d] " +"βρέθηκε στη λίστα." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Ο εξυπηρετητής προστέθηκε: Εξυπηρετητής στην [%s:%d] με όνομα '%s'." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"Είστε συνδεδεμένος στον εξυπηρετητή που προσπαθείτε να σβήσετε. Παρακαλείστε " +"να αποσυνδεθείται πρώτα" + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Αποτυχία σβησίματος του server.met!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Αποτυχία κατεβάσματος της λίστας εξυπηρετητών απο το %s" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"Δεν βρέθηκε εγγραφη διεύθυνση λίστας εξυπηρετητών στο 'addresses.dat'. " +"Παρακαλείστε να επικολλήσετε μια έγκυρη διεύθυνση λίστας εξυπηρετητών στο " +"αρχείο ώστε να ενημερωθεί η λίστα εξυπηρετητών" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" +"Προειδοποίηση, προσδιορίστηκε άκυρη URL για αυτόματη ενημέρωση των " +"εξυπηρετητών: %s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "Άκυρη URL αυτόματο κατέβασμα του server.met στο αρχείο addresses.dat" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"Ο τοπικός εξυπηρετητής είναι φιλτραρισμένος από τα IPFilters, επανασύνδεση " +"σε διαφορετικό εξυπηρετητή!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "Αποτυχία εκτέλεσης εντολής `%s' στο συμβάν `%s'." + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"Οι τοπικές ρυθμίσεις άλλαξαν στις προεπιλεγμένες του συστήματος λόγο μιας " +"αλλαγής παραμέτρων. Sorry!" + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"Δεν υπάρχουν εξυπηρετητές στην λίστα.\n" +"Θέλετε το aMule να κατεβάσει μία νέα λίστα τώρα;" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Κατέβασμα της λίστας εξυπηρετητών" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "O διακομιστής τρέχει στην pid %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "Αυτή είναι η πρώτη φορά που τρέχετε το aMule %s" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"Για περισσότερες πληροφορίες για του λόγους αυτών των αλλαγών, ψάξτε\n" +"στo βίκυ του aMule στη διεύθυνση http://wiki.amule.org για \"fake servers\" " +"info.\n" +"Είναι σημαντικό να εκκαθαρίσετε κάθε πλαστό εξυπηρετητή από τη λίστα σας " +"ώστε το aMule να δουλεύει σωστά." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Περισσότερες πληροφορίες, υποστήριξη και νέες εκδόσεις μπορούνα βρεθούν στην " +"ιστοσελίδα μας,\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "στο www.aMule.org, ή στο κανάλι #aMule του IRC στο irc.freenode.net.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "" +"Παρακαλούμε αναφέρετε σφάλματα του προγράμματος στο http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"Ο δικτυακός κατάλογος των ηλεκτρονικών αρχείων υπογραφών που προσδιορίσατε " +"είναι ΑΚΥΡΟΣ!\n" +"Οι ηλεκτρονικές υπογραφές θα ΑΠΕΝΕΡΓΟΠΟΙΗΘΟΥΝ μέχρι να το φτιάξετε στις " +"προτιμήσεις." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "ΣΦΑΛΜΑ: το αρχείο καταγραφής δεν μπορεί να ανοίξει" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: το αρχείο καταγραφών είναι άδειο. Κάτι δεν πάει καλά." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Το αρχείο καταγραφών επαναφέρθηκε στην αρχική κατάσταση" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "Μύνημα Εξυπηρετητή: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Αποτυχία κατεβάσματος της λίστας κόμβων." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Αποτυχία ανοίγματος του κατεβασμένου αρχείου ελέγχου έκδοσης" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Φθαρμένο αρχείο ελέγχου έκδοσης" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Χρησιμοποιείται μία ξεπερασμένη έκδοση του aMule!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "Η παρούσα έκδοση του aMule είναι %i.%i.%i και η τελευταία %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "Η τελευταία έκδοση μπορεί να βρεθεί στο http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "" +"ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Η έκδοση του aMuled είναι ξεπερασμένη: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "Αυτό το αντίγραφο του aMule είναι σύγχρονο. " + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Αποτυχία κατεβάσματος του αρχείου ελέγχου έκδοσης" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Συνδεση με το %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Διαδικασία σύνδεσης με %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Αποσυνδεση από το ED2K" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Το Kad ξεκίνησε." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Το Kad είναι σταματημένο." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Συνδεδεμένο στο Kad (ΟΚ)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Συνδεδεμένο στο Kad (με προστατευτικό τοίχο)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Αποσυνδεδεμένο από το Kad" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"Το δίκτυο Kad δεν μπορεί να χρησιμοποιηθεί αν η θύρα UDP είναι " +"απενεργοποιημένη στις προτιμήσεις. Δεν έγινε εκκίνηση." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "" +"Το δίκτυο Kad είναι απενεργοποιημένο από τις προτιμήσεις. Δεν έγινε σύνδεση." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "Αδύνατη η ανάγνωση από το αρχείο της λιστας-φίλων 'emfriends.met'" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "Αδύνατη η εγγραφη στο αρχείο της λιστας-φίλων 'emfriends.met'" + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "Ανάγνωση %u Kad επαφών" +#~ msgstr[1] "Ανάγνωση %u Kad επαφών" + +#~ msgid " [" +#~ msgstr "[" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "TCP Flags" +#~ msgstr "Δείκτης TCP" + +#~ msgid "UDP Flags" +#~ msgstr "Δείκτης UDP" + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "Η διαδικάσία αναμονής για τον τερματισμό της υποδιεργασίας απέτυχε" + +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "Σφάλμα κατά τη διάρκεια ανάγνωσης των επαφών Kad" + +#~ msgid "Merge attempt" +#~ msgstr "Προσπάθεια συγχώνευσης" + +#~ msgid "Recursive merge" +#~ msgstr "Αναδρομική συγχώνευση" + +#~ msgid "Sucessful merge!" +#~ msgstr "Επιτυχής συγχώνευση" + +#~ msgid "No merge possible" +#~ msgstr "Δεν είναι δυνατή η συγχώνευση" + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid "English (U.S.)" +#~ msgstr "Αγγλικά (ΗΠΑ)" + +#~ msgid "Spanish (Mexican)" +#~ msgstr "Ισπανικά (Μεξικού)" diff --git a/po/en@boldquot.header b/po/en@boldquot.header new file mode 100644 index 00000000..fedb6a06 --- /dev/null +++ b/po/en@boldquot.header @@ -0,0 +1,25 @@ +# All this catalog "translates" are quotation characters. +# The msgids must be ASCII and therefore cannot contain real quotation +# characters, only substitutes like grave accent (0x60), apostrophe (0x27) +# and double quote (0x22). These substitutes look strange; see +# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html +# +# This catalog translates grave accent (0x60) and apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019). +# It also translates pairs of apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019) +# and pairs of quotation mark (0x22) to +# left double quotation mark (U+201C) and right double quotation mark (U+201D). +# +# When output to an UTF-8 terminal, the quotation characters appear perfectly. +# When output to an ISO-8859-1 terminal, the single quotation marks are +# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to +# grave/acute accent (by libiconv), and the double quotation marks are +# transliterated to 0x22. +# When output to an ASCII terminal, the single quotation marks are +# transliterated to apostrophes, and the double quotation marks are +# transliterated to 0x22. +# +# This catalog furthermore displays the text between the quotation marks in +# bold face, assuming the VT100/XTerm escape sequences. +# diff --git a/po/en@quot.header b/po/en@quot.header new file mode 100644 index 00000000..a9647fc3 --- /dev/null +++ b/po/en@quot.header @@ -0,0 +1,22 @@ +# All this catalog "translates" are quotation characters. +# The msgids must be ASCII and therefore cannot contain real quotation +# characters, only substitutes like grave accent (0x60), apostrophe (0x27) +# and double quote (0x22). These substitutes look strange; see +# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html +# +# This catalog translates grave accent (0x60) and apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019). +# It also translates pairs of apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019) +# and pairs of quotation mark (0x22) to +# left double quotation mark (U+201C) and right double quotation mark (U+201D). +# +# When output to an UTF-8 terminal, the quotation characters appear perfectly. +# When output to an ISO-8859-1 terminal, the single quotation marks are +# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to +# grave/acute accent (by libiconv), and the double quotation marks are +# transliterated to 0x22. +# When output to an ASCII terminal, the single quotation marks are +# transliterated to apostrophes, and the double quotation marks are +# transliterated to 0x22. +# diff --git a/po/en_GB.po b/po/en_GB.po new file mode 100644 index 00000000..5e2fcdb9 --- /dev/null +++ b/po/en_GB.po @@ -0,0 +1,6778 @@ +# aMule i18n resource file. +# Copyright (C) 2004 aMule Team +# This file is distributed under the same license as the aMule package. +# Kry , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: aMule CVS\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2004-02-04 07:00+0100\n" +"Last-Translator: Angel Vidal Veiga \n" +"Language-Team: aMule Team \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-15\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr "" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr "" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "" + +#: src/BaseClient.cpp:1876 +#, c-format +msgid "Requested: %s\n" +msgstr "" + +#: src/BaseClient.cpp:1878 +#, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +msgstr[1] "" + +#: src/BaseClient.cpp:1881 +#, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +msgstr[1] "" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "" + +#: src/FriendListCtrl.cpp:273 +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "" + +#: src/FriendListCtrl.cpp:275 +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "" + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "" + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "" + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "" + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "" + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "" + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "" + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "" + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +msgid " with " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +msgid " kB/s" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +msgid "Cancelled !" +msgstr "" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "" + +#: src/ServerListCtrl.cpp:428 +msgid "Mark server as static" +msgstr "" + +#: src/ServerListCtrl.cpp:429 +msgid "Mark server as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:431 +msgid "Mark servers as static" +msgstr "" + +#: src/ServerListCtrl.cpp:432 +msgid "Mark servers as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:438 +msgid "Remove server" +msgstr "" + +#: src/ServerListCtrl.cpp:440 +msgid "Remove servers" +msgstr "" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "" + +#: src/ServerListCtrl.cpp:449 +msgid "Copy ED2k links to clipboard" +msgstr "" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "" + +#: src/ServerListCtrl.cpp:570 +msgid "Are you sure that you wish to delete the selected server?" +msgstr "" + +#: src/ServerListCtrl.cpp:572 +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "" + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr "" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr "" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "" + +#: src/amuleDlg.cpp:666 +msgid "ED2K: Connecting" +msgstr "" + +#: src/amuleDlg.cpp:670 +msgid "ED2K: Disconnected" +msgstr "" + +#: src/amuleDlg.cpp:676 +msgid "Kad: Firewalled" +msgstr "" + +#: src/amuleDlg.cpp:680 +msgid "Kad: Connected" +msgstr "" + +#: src/amuleDlg.cpp:685 +msgid "Kad: Connecting" +msgstr "" + +#: src/amuleDlg.cpp:689 +msgid "Kad: Off" +msgstr "" + +#: src/amuleDlg.cpp:718 +msgid "Stop the current connection attempts" +msgstr "" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "" + +#: src/amuleDlg.cpp:722 +msgid "Disconnect from the currently connected networks" +msgstr "" + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "" + +#: src/amuleDlg.cpp:726 +msgid "Connect to the currently enabled networks" +msgstr "" + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "" + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:980 +#, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:987 +#, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:999 +#, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "" + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "" + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "" + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "" + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "" + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "" + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "" + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "" + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "" + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "" + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "" + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "" + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "" + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "" + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "" + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "" + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "" + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "" + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "" + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "" + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "" + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "" + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "" + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "" + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "" + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "" + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "" + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "" + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "" + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "" + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "" + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "" + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "" + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "" + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "" + +#: src/DownloadListCtrl.cpp:578 +msgid "Are you sure that you wish to delete the selected file?" +msgstr "" + +#: src/DownloadListCtrl.cpp:580 +msgid "Are you sure that you wish to delete the selected files?" +msgstr "" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "" + +#: src/DownloadListCtrl.cpp:2222 +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2260 +#, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "" + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "" + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "" + +#: src/PartFile.cpp:1019 +#, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "" + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "" + +#: src/SharedFileList.cpp:352 +#, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "" +msgstr[1] "" + +#: src/SharedFileList.cpp:358 +#, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "" +msgstr[1] "" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "" + +#: src/CommentDialogLst.cpp:104 +#, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "" + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "" + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "" + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "" + +#: src/ServerConnect.cpp:391 +#, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "" + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "" + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "" + +#: src/DownloadQueue.cpp:175 +#, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "" +msgstr[1] "" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "" + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "" + +#: src/TextClient.cpp:305 +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" + +#: src/TextClient.cpp:343 +msgid "Processing by hash: " +msgstr "" + +#: src/TextClient.cpp:358 +msgid "Processing by filename: " +msgstr "" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "" + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "" + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "" + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "" + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "" + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "" + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "" + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "" + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "" + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "" + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "" + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "" + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "" + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "" + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "" + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "" + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "" + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "" + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "" + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "" + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "" + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "" + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "" + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "" + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "" + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "" + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "" + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "" + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "" + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "" + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "" + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "" + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "" + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "" + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "" + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "" + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "" + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "" + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "" + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "" + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "" + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "" + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "" + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "" + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "" + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "" + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "" + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "" + +#: src/ServerSocket.cpp:539 +#, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "" + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "" + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "" + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "" + +#: src/IP2Country.cpp:73 +#, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "" +msgstr[1] "" + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "" + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "" + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "" + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "" + +#: src/OtherFunctions.cpp:121 +msgid "byte" +msgid_plural "bytes" +msgstr[0] "" +msgstr[1] "" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "" + +#: src/OtherFunctions.cpp:156 +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "" +msgstr[1] "" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "" + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" + +#: src/IPFilter.cpp:330 +#, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +msgstr[1] "" + +#: src/IPFilter.cpp:332 +#, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +msgstr[1] "" + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "" + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "" + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "" + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "" + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "" + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "" + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "" + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "" + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "" + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "" + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "" + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "" + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "" + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "" + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "" + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "" + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "" + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "" + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "" + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "" + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "" + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "" + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "" + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "" + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "" + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "" + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr "" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "" + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "" + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "" + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "" + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "" + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "" + +#: src/ExternalConnector.cpp:188 +#, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "" + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "" + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "" + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "" + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "" + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "" + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "" + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "" + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "" + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "" + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "" + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "" + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "" + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "" + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "" + +#: src/ClientCreditsList.cpp:168 +#, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "" +msgstr[1] "" + +#: src/ClientCreditsList.cpp:171 +#, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] "" +msgstr[1] "" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "" + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "" + +#: src/ClientDetailDialog.cpp:190 +#, c-format +msgid "%u (QR: %u)" +msgstr "" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "" + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "" + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "" + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" + +#: src/ServerList.cpp:168 +#, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerList.cpp:170 +#, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "" + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "" + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "" + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "" + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "" + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "" + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "" + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "" + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "" + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "" + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "" diff --git a/po/es.po b/po/es.po new file mode 100644 index 00000000..5f5404bf --- /dev/null +++ b/po/es.po @@ -0,0 +1,7113 @@ +# translation of new_es.po to Spanish +# Copyright (C) 2004 aMule Team +# This file is distributed under the terms of the GNU General Public +# License +# +# FIRST AUTHOR , 2004. +# Mad-Soft , 2004, 2005, 2006, 2007. +# Ignacio Casal Quinteiro , 2007. +# Carlos Diaz , 2007. +# Festor Wailon Dacoba , 2007. +# mad_soft , 2007, 2008. +msgid "" +msgstr "" +"Project-Id-Version: new_es\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2008-02-26 02:00+0100\n" +"Last-Translator: mad_soft \n" +"Language-Team: Spanish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Country: SPAIN\n" +"X-Poedit-SourceCharset: utf-8\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Debes especificar una contraseña no vacía." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "¡Contraseña incorrecta, no es un código MD5!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Error de conexión" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "EC Conexión fallida. Respuesta vacía." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "Conexión Externa: Acceso denegado porque: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "Conexión Externa: Acceso denegado" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "Conexión Externa: Mala respuesta desde el servidor. Conexión cerrada." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "¡Hecho! Conexión establecida con aMule" + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "¡Hecho! Conexión establecida." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Codificando" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Completando" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Completado" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Pausado" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Erróneo" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Descargando" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Esperando" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Comenzando a crear el hash MD4 y AICH del archivo: %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Comenzando a crear el hash MD4 del archivo: %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Comenzando a crear el hash AICH del archivo: %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "Convirtiendo antiguos hashsets AICH en '%s' a 64b en '%s'." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" +"ALERTA: El nombre de archivo '%s' es incorrecto y será renombrado a '%s'." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "ALERTA: El archivo '%s' ya existe, renombrando el nuevo a '%s'." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "ALERTA: Imposible borrar '%s' original, creando copia de seguridad" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "ALERTA: Error al borrar %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Error al obtener la lista de compartidos del usuario '%s'" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Desconocido" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (Versión Falsa eMule %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (Falso eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (Falso eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (basado en eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Alias: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, c-format +msgid "Requested: %s\n" +msgstr "Solicitado: %s\n" + +#: src/BaseClient.cpp:1878 +#, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Estadísticas de archivo para esta sesión: %d Aceptada de %d petición, %s " +"transferida\n" +msgstr[1] "" +"Estadísticas de archivo para esta sesión: %d Aceptadas de %d peticiones, %s " +"transferidas\n" + +#: src/BaseClient.cpp:1881 +#, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Estadísticas de archivo para todas las sesiones: %d Aceptada de %d petición, " +"%s transferida\n" +msgstr[1] "" +"Estadísticas de archivo para todas las sesiones: %d Aceptadas de %d " +"peticiones, %s transferidas\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Solicitado un archivo desconocido" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "Cliente %s en IP:Puerto %s:%d usando %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Nombre de usuario" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Amigos" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Mostrar &Detalles" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Añadir un amigo" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Eliminar amigo" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Enviar &Mensaje" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Ver archivos" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Establecer puesto reservado a un amigo" + +#: src/FriendListCtrl.cpp:273 +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "¿Estás seguro que deseas borrar al amigo seleccionado?" + +#: src/FriendListCtrl.cpp:275 +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "¿Estás seguro que deseas borrar a los amigos seleccionados?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Cancelar" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"No se le permite asignar mas de un puesto reservado.\n" +" Solo se asignó un puesto reservado." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Selección múltiple" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Nombre de archivo" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Tamaño" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Tipo" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Prioridad" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "ID Archivo" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Peticiones" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Peticiones aceptadas" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Datos transferidos" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Media Compartido" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Partes obtenidas" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Fuentes completas" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Directorio" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Compartidos" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Muy baja" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Baja" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normal" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Alta" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Muy alta" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Lanzamiento" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Auto" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Añadir Comentario/Valoración" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Editar Comentario/Valoración" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Renombrar" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Añadir archivos en colección a la lista de descargas" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Copiar &URL magnético al portapapeles" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Copiar &enlace ED2K al portapapeles" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Copiar enlace ED2K al portapapeles (&Fuente)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "Copiar enlace ED2k al portapapeles (Fuente) (&Con opciones de cifrado)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Copiar enlace ED2k al portapapeles (Nombre del &host)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" +"Copiar enlace ED2k al portapapeles (Nombre del host) (Con opciones de " +"&cifrado)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Copiar enlace ED2K al portapapeles (&AICH info)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Copiar respuesta al portapapeles" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "Necesitas IDAlta para crear un enlace fuente válido" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Alerta" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Archivos Compartidos (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[Archivo part]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Introduce el nuevo nombre para este archivo:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Renombrar archivo" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Resumiendo subidas del archivo: %s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Suspendiendo subida del archivo: %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: palabra de búsqueda demasiado corta" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Error: No podía escuchar el puerto TCP." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "Solicitud fallida con el siguiente error: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "Solicitud fallida con un error desconocido." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "Fichero índice no encontrado: " + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Imposible crear un socket web\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Servidor web: Iniciado\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Sesión terminada - solicitando conexión\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Sesión ok, conectado\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Sesión ok, no conectado\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "No hay ninguna sesión - conecte de nuevo\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Sesión creada - solicitando conexión\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Procesando solicitud [original]:" + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Comprobando contraseña\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Contraseña hash incorrecta\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Contraseña ok\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Contraseña errónea\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "" +"No has introducido ninguna contraseña. No está permitida una contraseña en " +"blanco.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Desconexión solicitada\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Procesando solicitud [redirigida]:" + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Carga la plantilla " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Servidor Web, puerto HTTP " + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Utiliza UPnP port forwarding en el puerto del servidor web" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "Puerto UPnP" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Usar compresión gzip" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Contraseña de acceso completo para el servidor web" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Contraseña de invitado para el servidor web" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Permitir acceso a invitado" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Denegar acceso a invitado" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "Carga/Salva opciones del servidor web desde/a aMule remoto" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "Ruta al archivo config de aMule. ¡NO USAR DIRECTAMENTE!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "Deshabilitar interprete PHP (desuso)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Recompila páginas PHP para otra solicitud" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "Servidor web aMule" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "No disponible" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Nunca" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Descargando..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Opciones" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "Directorio que contiene el archivo amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Examinar" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Introduce el directorio donde está tu archivo amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Intervalo de refresco en segundos" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Generar un archivo de estadísticas siempre que se actualice" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "" +"Introduce el directorio donde tu quieres generar la imagen de estadísticas" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Sube periódicamente tu imagen de estadísticas al servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "Url FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "Directorio FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Introduce la URL de tu servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" +"Introduce el directorio de tu servidor FTP donde poner tu imagen de " +"estadísticas" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Usuario" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Contraseña" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Introduce el nombre de usuario para conectarte a tu servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Introduce la contraseña de usuario para conectarte a tu servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "Intervalo de actualización de FTP en minutos" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Validado" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Directorio que contiene tu archivo de firma" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Directorio donde se genera la imagen de estadísticas" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i día(s) %i hora(s) %i min %i s" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, Estadísticas aMule en linea" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "¡Bienvenido!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Máximo índice Desc desde que wxCas está ejecutándose: " + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "Máximo índice Desc absoluto durante ejecuciones anteriores de wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Restablecer" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "Sistema" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Parar auto recargar" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Salvar imagen de estadísticas en linea" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Imprimir imagen de estadísticas en linea" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Opciones" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "Acerca de wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Iniciar auto recargar" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Auto recargar, detenido" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Auto recargar, iniciado" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Salvar imagen de estadísticas" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Sin asociar este tipo de archivo" + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "Archivo no fue guardado" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "Estadísticas aMule en linea" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Hubo un problema imprimiendo.\n" +"Tal vez tu impresora actual no este configurada" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Imprimiendo" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "wxCas, Estadística de firma en linea de aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Oh Oh, aMule no está ejecutándose..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule ya está ejecutándose" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule se está ejecutando, pero está desconectado" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule está conectando..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Oh Oh, estado de aMule desconocido..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " ha sido ejecutado durante" + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " ¡ está detenido !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " ¡ no está conectado !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " está conectando..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " está haciendo algo extraño, ¡ compruébalo !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " está conectado a" + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "ok" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "tras cortafuegos" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "apagado" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " conectado" + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +msgid " with " +msgstr " con " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Total Descargado:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Subido: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Descarga de sesión" + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Descargado: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s, Subida: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +msgid " kB/s" +msgstr " kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Compartiendo: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr "archivo(s), Clientes en cola: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Tiempo: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " en " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Media de carga del sistema (1-5-15 min): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Tiempo de ejecución del sistema" + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uD %02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "ID Alta" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "ID Baja" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "No conectado" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +msgid "Cancelled !" +msgstr "¡ Cancelado !" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Imposible abrir %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "" +"El archivo %s es demasiado grande para el Donkey: el máximo permitido es 4 GB" + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Parámetros de entrada" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Archivo a codificar" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Añadir URLs opcionales para este archivo" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Introduce aquí el archivo del que quieras crear el enlace Ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Introduce aquí la URL que quieras añadir al enlace Ed2k: Añade / al final, " +"para dejar a aLinkCreator continuar con el actual nombre de archivo" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Añadir" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Borrar" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Limpiar" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Crear enlace con hashes de partes" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Ayuda para separar archivos nuevos y raros mas rápidamente, el coste sera un " +"tamaño de enlace mayor" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "Hash de archivo MD4" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "Hash de archivo ED2K" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "Enlace ED2K" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Comenzar" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Guardar" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Copiar al porta papeles" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Salir" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Abre un archivo para crear un enlace ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Copiar enlace ed2k creado al porta papeles" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Guardar un enlace ed2k creado a un archivo" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "Acerca de aLinkCreator" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Selecciona el archivo del cual quieres crear un enlace ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "¡Nada para copiar ahora!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Selecciona el archivo al enlace ed2k creado" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Imposible abrir " + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Por favor, introduce un nombre de archivo" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "¡Nada para guardar ahora!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, el creador de enlaces ed2k de aMule\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps de http://www.everaldo.com y http://www.icomania.com\n" +"y http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distribuido bajo GPL" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Calculando hash..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Terminado en %.2f s" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "¡ Ya tienes añadida esa URL !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Por favor, introduce una URL" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "Procesando numero de archivo %u: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "Has preguntado por hashes de partes (Solo usado por archivos > 9.5 MB)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Por favor espera ..." + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s --->¡ No existe el archivo !\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, el creador de enlaces ed2k de aMule" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Auto [Ba]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Auto [No]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Auto [Al]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Conectando" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Preguntando" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Conectando vía servidor" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Cola Llena" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "En Cola" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Transfiriendo" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Recibiendo hashset" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Partes no necesitadas" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Imposible conectar IDBaja con IDBaja" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Demasiadas conexiones" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Conectando via Kad" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Demasiadas conexiones Kad" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Baneado" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Error de Conexión" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Cola Remota Llena" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "Antiguo MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "Nuevo MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "eMule Compatible" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Servidor local" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Servidor remoto" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Intercambio de Fuentes" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Pasivo" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Enlace" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Semillas fuentes" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Por defecto" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Árabe" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Euskera" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Búlgaro" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Catalán" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Chino (Simplificado)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Chino (Tradicional)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Croata" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "Checo" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Danés" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Holandés" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Inglés (U.K.)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Estonio" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Finlandés" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Francés" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Gallego" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Alemán" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "Griego" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Húngaro" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Italiano" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Italiano (Suizo)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "Japones" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Coreano" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "Lituano" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "Noruego" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Polaco" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portugués" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Portugués (Brasileño)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Ruso" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Esloveno" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Español" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "Sueco" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Turco" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "¡Imposible determinar el navegador seleccionado!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" +"Puerto TCP no puede ser mas alto de 65532 debido a que el socket del " +"servidor UDP es TCP+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Puerto por defecto que será usado (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Nombre del servidor" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Dirección" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Puerto" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Descripción" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Usuarios" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Archivos" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Error" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Servidor fijo" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Versión" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Estás conectado a un servidor, que estás intentando borrar. Desconéctate " +"primero. El servidor no será borrado." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Info" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(Nombre desconocido)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Estás seguro que quieres eliminar el servidor fijo %s" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Sí" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "No" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Error al abrir '%s'" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Servidores (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Servidor" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Conectar al servidor" + +#: src/ServerListCtrl.cpp:428 +msgid "Mark server as static" +msgstr "Marcar servidor como fijo" + +#: src/ServerListCtrl.cpp:429 +msgid "Mark server as non-static" +msgstr "Desmarcar servidor como fijo" + +#: src/ServerListCtrl.cpp:431 +msgid "Mark servers as static" +msgstr "Marcar servidores como fijos" + +#: src/ServerListCtrl.cpp:432 +msgid "Mark servers as non-static" +msgstr "Desmarcar servidores como fijos" + +#: src/ServerListCtrl.cpp:438 +msgid "Remove server" +msgstr "Borrar servidor" + +#: src/ServerListCtrl.cpp:440 +msgid "Remove servers" +msgstr "Borrar servidores" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Eliminar todos los servidores" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Copiar enlace ED2K al portapapeles" + +#: src/ServerListCtrl.cpp:449 +msgid "Copy ED2k links to clipboard" +msgstr "Copiar enlaces ED2K al portapapeles" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Reconectar al servidor" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "¿Estás seguro que deseas borrar todos los servidores?" + +#: src/ServerListCtrl.cpp:570 +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Estás seguro que deseas borrar el servidor seleccionado" + +#: src/ServerListCtrl.cpp:572 +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Estás seguro que deseas borrar los servidores seleccionados" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Deshabilitado [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "Esto es aMule %s basado en eMule." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "Ejecutándose en %s" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" +"Visita http://www.amule.org para comprobar si hay una nueva versión " +"disponible" + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Error Fatal: Error al crear el Reloj" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "Control remoto de aMule" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Versión:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" +" Cliente p2p multiplataforma basado en eMule \n" +"\n" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr " Web: http://www.amule.org \n" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr " Foro: http://forum.amule.org \n" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr " FAQ: http://wiki.amule.org \n" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr " Contactar: admin@amule.org (problemas administrativos) \n" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" +" Copyright (C) 2003-2008 Equipo aMule \n" +"\n" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr " Parte de aMule está basado en \n" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr " Kademlia: Enrutamiento P2P basado en la métrica XOR.\n" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr " Copyright (C) 2002 Petar Maymounkov\n" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr " http://kademlia.scs.cs.nyu.edu\n" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Mensaje" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Estado del texto" + +#: src/amuleDlg.cpp:666 +msgid "ED2K: Connecting" +msgstr "ED2K: Conectando" + +#: src/amuleDlg.cpp:670 +msgid "ED2K: Disconnected" +msgstr "ED2K: Desconectada" + +#: src/amuleDlg.cpp:676 +msgid "Kad: Firewalled" +msgstr "Kad: Tras Cortafuegos" + +#: src/amuleDlg.cpp:680 +msgid "Kad: Connected" +msgstr "Kad: Conectada" + +#: src/amuleDlg.cpp:685 +msgid "Kad: Connecting" +msgstr "Kad: Conectando" + +#: src/amuleDlg.cpp:689 +msgid "Kad: Off" +msgstr "Kad: Apagada" + +#: src/amuleDlg.cpp:718 +msgid "Stop the current connection attempts" +msgstr "Detener los intentos de conexión actuales" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Desconectar" + +#: src/amuleDlg.cpp:722 +msgid "Disconnect from the currently connected networks" +msgstr "Desconectarse de las redes conectas" + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Conectar" + +#: src/amuleDlg.cpp:726 +msgid "Connect to the currently enabled networks" +msgstr "Conectarse a las redes disponibles" + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Su: %.1f(%.1f) | Desc: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Su: %.1f | Desc: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | Conectado)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | Desconectado)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "¿Realmente deseas cerrar aMule?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Confirmación de salida" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Imposible encontrar el comando para iniciar el navegador." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "El directorio de tema '%s' no existe" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "Aviso: Imposible abrir el fichero de tema '%s' para lectura" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Redes" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Ventana de redes" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Buscar" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Ventana de búsquedas" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Tráfico" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Ventana de transferencias de archivos" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Ventana de archivos compartidos" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Mensajes" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Ventana de mensajes" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Estadísticas" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Ventana de gráficos de estadísticas" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Ventana de opciones" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Importar" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "La herramienta para importar archivos part" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "Acerca de" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "Acerca de/Ayuda" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "General" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Conexión" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Proxy" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Filtro de mensajes" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Controles remotos" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Firma online" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Directorios" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Seguridad" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "Tweaks GUI" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Tweaks Núcleo" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Eventos" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Depurando" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Definido por el usuario" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"aMule debe reiniciarse para aplicar los cambios:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- Puerto TCP cambiado.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- Puerto UDP cambiado.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"Tu auto-actualización de lista de servidores está en blanco.\n" +"'Auto-actualizar lista de servidores al inicio' será deshabilitado" + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"Tienes habilitado las conexiones externas, pero no tienes especificada una " +"contraseña.\n" +"Las conexiones externas no pueden ser habilitadas a menos que especifiques " +"una contraseña válida." + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- Lenguaje cambiado.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- Directorio TEMP cambiado.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Su: 0.0 | Desc: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"Las redes ED2K y Kad están deshabilitadas.\n" +"No podrás conectarte a menos que habilites alguna de ellas." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"Kad no se iniciará si tu puerto UDP está deshabilitado.\n" +"Habilita un puerto UDP o deshabilita Kad." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"Debes reiniciar aMule ahora.\n" +"Sino reinicias ahora, no sabemos si pasará algo malo.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "ALERTA" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"Tu auto-actualización de lista de servidores está en blanco.\n" +"Por favor introduce al menos una URL con un archivo server.met válido.\n" +"Click en el botón \"Lista\" de este casilla para introducir una URL." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "Archivos temporales" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Archivos entrantes" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Firmas Online" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Elige una carpeta para %s" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Explorar wav" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "Archivo wav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Explorar" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Selecciona navegador" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Ejecutable%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Editar lista de servidores" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Añade aquí las URL's para descargar los archivos server.met.\n" +"Sólo una url por línea." + +#: src/PrefsUnifiedDlg.cpp:980 +#, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Intervalo de actualización: %d seg" +msgstr[1] "Intervalo de actualización: %d segs" + +#: src/PrefsUnifiedDlg.cpp:987 +#, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Tiempo medio del gráfico: %d min" +msgstr[1] "Tiempo medio del gráfico: %d mins" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Escala gráfica de conexiones: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Intervalo de actualización: %d seg" +msgstr[1] "Intervalo de actualización: %d segs" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Tamaño del buffer de archivo: %d byte" +msgstr[1] "Tamaño del buffer de archivo: %d bytes" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Tamaño de la cola de subida: %d cliente" +msgstr[1] "Tamaño de la cola de subida: %d clientes" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Intervalo de refresco de la conexión al servidor: %d minuto" +msgstr[1] "Intervalo de refresco de la conexión al servidor: %d minutos" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Intervalo de refresco de la conexión al servidor: Deshabilitado" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Ejecutar comando en el evento `%s'" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Habilitar ejecución de comando en el núcleo" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Comando del núcleo:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Habilitar ejecución de comando en la Interfaz" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "Comando de la Interfaz: " + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "Las siguientes variables serán reemplazadas:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Intento de acceso no autorizado. Conexión cerrada." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Conexión externa cerrada." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "¡Conexiones externas deshabilitadas debido a contraseña en blanco!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "Conexiones externas deshabilitadas en el archivo de configuración" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Nueva conexión externa, aceptada" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "Error: imposible aceptar una nueva conexión externa" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" +"¡Conexión externa rechazada debido a contraseña en blanco en las opciones!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "Conectando con cliente: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Versión desconocida" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"EC Incorrecto en la ID de versión, debe haber una incompatibilidad. Usa " +"núcleo y remoto de la misma versión." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" +"¡No puedes conectar a una versión final desde una versión SVN cualquiera! " +"*sigh* posible error evitado" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "Autentificación fallida." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Versión de protocolo no válida." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Marcador de versión de protocolo inexistente." + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Solicitud no válida, deberías autentificarte primero." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Acceso concedido." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" +"Error en comando remoto del archivo Part: Hash de archivo no encontrado: %s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "Hash de archivo no encontrado: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "¡OOPS! ¡Error procesando OpCode!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Servidor no añadido" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "servidor no encontrado: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "necesitas definir un servidor para borrarlo" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "ED2K está deshabilitado en las opciones." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "Búsqueda en proceso. Resultados obtenidos en breve!" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "Búsqueda web desde un interfaz remota no tiene sentido." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad está deshabilitado en opciones." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Sin puntos para el gráfico." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "Tu cliente no está configurado para este nivel de detalle." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "Conexión Externa: cierre solicitado" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Ya estás cerrando." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "Conexión externa: añadiendo enlace '%s'." + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Enlace no válido o ya está en la lista." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "Archivo no encontrado" + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Nombre de archivo incorrecto" + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Imposible renombrar archivo." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Ya estás conectado a ED2K" + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Conectando a ED2K..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Ya estás conectado a Kad." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Conectando a Kad..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Todas las redes están deshabilitadas." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Desconectado de ED2K" + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Desconectado de Kad" + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "Conexión Externa: opcode recibido no válido: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "opcode no válido (¿versión de protocolo incorrecta?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "Error al abrir el archivo (%s), borrando de la lista de compartidos." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "Hashset solicitado de archivo desconocido: %s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "Comando `%s' con pid `%d' ha terminado con código `%d'." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "Servidor no añadido: IP o nombre de host no especificado." + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "Servidor no añadido: Servidor-puerto especificado no válido." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "Estado ED2K:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Conectado" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Puerto" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Estado Kademlia:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Ejecutando" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Estado:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Desconectado" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Estado de Conexión:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Tras Cortafuegos" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "Aceptar" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Estado tras cortafuegos:" + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Conectado a amigo" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "No amigo" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Media de Usuarios:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "Media de Archivos:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "No ejecutando" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Tiempo de ejecución: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Transferencia" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Subidas" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Datos subidos (Sesión (Total)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Total por tráfico excedente (Paquetes): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Excedente por peticiones de archivo (Paquetes): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "Excedente por intercambio de fuentes (Paquetes): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Tráfico excedente de servidores (Paquetes): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Tráfico excedente Kad (Paquetes): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Subidas activas: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Subidas en espera: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Total de subidas satisfactorias: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Total de subidas erróneas: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Tiempo medio de subida: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Descargas" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Datos descargados (Sesión (Total)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Fuentes encontradas: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Descargas activas (partes): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Índice SU:DE Sesión (Total): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Velocidad media descarga (Sesión): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Velocidad media subida (Sesión): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Descarga máxima (Sesión): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Subida máxima (Sesión): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Reconexiones: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Tiempo desde la primera transferencia: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Conectado al servidor desde: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Conexiones activas (estimado): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Alcanzado límite máximo de conexiones: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Media de conexiones (estimado): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Pico de conexiones (estimado): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Clientes" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Filtrado" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Total: %i Conocido(s): %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Servidores" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Servidores activos: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Servidores caídos: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Total: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Servidores borrados: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Servidores filtrados: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Usuarios en servidores activos: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "Archivos en servidores activos: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Usuarios totales: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "Archivos totales: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Ocupación de Servidores: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Número de archivos compartidos: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Tamaño total de archivos compartidos: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Tamaño medio de archivos compartidos: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "IDBaja: %u (%.2f%% Total %.2f%% Conocido)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "IdentSeg On/Off: %u (%.2f%%) : %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Sistema Operativo" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "No recibido" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Cortar" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Copiar" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Pegar" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Seleccionar todo" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "No se buscará en Kad si no está conectado a Kad" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "No se buscará en ED2K si no está conectado a ED2K" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Error inesperado mientras intentaba buscar en Kad: " + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "Mensaje filtrado de '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "Nuevo mensaje de '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "Usuario %s (%u) solicitó tu lista de archivos compartidos -> Aceptada" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "Usuario %s (%u) solicitó tu lista de archivos compartidos -> Denegada" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" +"Usuario %s (%u) ha solicitado tu lista de directorios compartidos -> Aceptada" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" +"Usuario %s (%u) ha solicitado tu lista de directorios compartidos -> Aceptada" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"Usuario %s (%u) solicitó tu lista de archivos compartidos del directorio %s -" +"> aceptada" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"Usuario %s (%u) solicitó tu lista de archivos compartidos del directorio %s -" +"> denegada" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "Usuario %s (%u) directorios compartidos %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "Usuario %s (%u) enviado directorios compartidos no solicitados." + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" +"Usuario %s (%u) enviada la lista de archivos compartidos por directorio %s" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "Usuario %s (%u) finalizó el envío de la lista de archivos compartidos" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "Usuario %s (%u) enviada la lista de archivos compartidos no deseada" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" +"Usuario %s (%u) denegó el acceso a la lista de directorios/archivos " +"compartidos" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Nodos (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "IP no válida para conectar" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Puerto no válido para conectar" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Por favor rellena todos los campos requeridos" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "¿Estás seguro que quieres descargar un nuevo nodes.dat?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" +"Si lo haces borrarás tus nodos actuales y reiniciarás la conexión Kademlia." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "¿Continuar?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Error: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Alerta: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Añadir un amigo" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Es necesario introducir una IP y puerto válidos" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Información" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "¡El hash de usuario especificado no es válido!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Fuentes" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Archivo" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Descarga" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Categoría" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Principal" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Descargar en la categoría" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "Buscar archivos similares (ED2k, servidor local)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "Marcar como archivo conocido" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Conectar a amule remoto" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Conexión fallida" + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Error" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"AVISO: No puede añadirse a si mismo como una fuente para un enlace ed2k " +"teniendo id baja." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Usuarios: E: %s K: %s | Archivos E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Todos" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Total Usuarios: %s | Total Archivos: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Transferido" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Completado" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Velocidad" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Progreso" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Estado" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Tiempo restante" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Última comprobación completa" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Última recepción" + +#: src/DownloadListCtrl.cpp:578 +msgid "Are you sure that you wish to delete the selected file?" +msgstr "¿Estás seguro que deseas borrar este archivo?" + +#: src/DownloadListCtrl.cpp:580 +msgid "Are you sure that you wish to delete the selected files?" +msgstr "¿Estás seguro que deseas borrar estos archivos?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Enviar mensaje al usuario" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Mensaje a enviar:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Detener" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Pausar" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Reanudar" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "&Limpiar completados" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Intercambiar todas las fuentes (A4AF) a este archivo" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Intercambiar todas las fuentes (A4AF) a este archivo (Auto)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Intercambiar todas las fuentes (A4AF) a otro archivo" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Opciones Extendidas" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Previsualizar" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Mostrar detalles archivo" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Mostrar todos los comentarios" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Copiar la URL magnética al portapapeles" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "no asignado" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Asignar a categoría" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "&Abrir el archivo" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Borrar desde amigos" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Añadir a Amigos" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Enviar mensaje" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Intercambia a este archivo" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "LC: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Se ha pedido otro archivo" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Descargas (%i)" + +#: src/DownloadListCtrl.cpp:2222 +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"Por favor, selecciona tu reproductor de vídeo preferido en las opciones.\n" +"Mientras tanto, aMule intentará usar mplayer y seguirás viendo esta alerta " +"en todas las previsualizaciones" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Previsualizar" + +#: src/DownloadListCtrl.cpp:2260 +#, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "" +"ERROR:¡Fallo al ejecutar un reproductor de medios externo! Command: `%s'" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "ERROR: Error al abrir archivo part)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "ERROR: Error al crear el archivo part" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "Intentando cargar copia de seguridad del archivo met desde %s" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "Error: Error al abrir archivo part.met: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "Error: el tamaño del archivo part.met es 0: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "Error: ¡Versión no válida del archivo part.met! %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" +"Error: %s (%s) está corrupto (numero de marcador incorrecto), imposible " +"cargar el archivo." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "Intentando recuperar info de archivo..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "Recuperando archivo sin nombre - lo recuperaré como RecoveredFile.dat" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" +"Recuperada toda la info disponible del archivo :D - Intentando usarla..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Imposible recuperar info de archivo..." + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Error al abrir %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "Alerta: %s podría estar corrupto (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "ERROR salvando archivo part: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "No se puede recuperar la duración de '%s' - usando el archivo %s." + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "de alguna manera el tamaño de '%s' es 0 - usando archivo %s." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "Error al guardar archivo part.met.seeds por %s" + +#: src/PartFile.cpp:1019 +#, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "Guardado %i semilla de fuentes en archivo part: %s (%s)" +msgstr[1] "Guardado %i semillas de fuentes en archivo part: %s (%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "Archivo part %s (%s) no tiene archivo de semillas" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "Archivo part %s (%s) tiene un archivo de semillas vacío" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "Error leyendo semillas del archivo part (%s - %s): %s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"Parte corrupta encontrada (%i) en %d parte del archivo %s - Resultado del " +"hash del archivo |%s| Hash del archivo |%s|" +msgstr[1] "" +"Parte corrupta encontrada (%i) en %d partes del archivo %s - Resultado del " +"hash del archivo |%s| Hash del archivo |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "Parte (%i) completa encontrada en %s" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "Recodificación terminada %s" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "Error inesperado al completar %s. Archivo pausado" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Descarga terminada: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "Borrando archivo: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "Alerta: Imposible codificar parte descargada - hashset incompleto '%s'" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"Error: Imposible codificar parte descargada - hashset incompleto (%s). Esto " +"nunca debería pasar" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "ALERTA: No hay espacio libre en el disco! Pausando archivo: %s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "Parte descargada %i corrupta en archivo: %s" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH: Recuperada parte corrupta %i de %s -> Bytes salvados: %s" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Espacio en disco insuficiente" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Detenido" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "Alerta: known.met no puede ser abierto." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" +"Alerta: Lista del archivo known corrupta, contiene una cabecera no válida." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "IO error leyendo el archivo known.met: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "Error guardando archivo known.met: %s" + +#: src/SharedFileList.cpp:352 +#, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "Encontrado %i archivos compartido" +msgstr[1] "Encontrado %i archivos compartidos" + +#: src/SharedFileList.cpp:358 +#, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "Encontrado %i archivo compartido, %i desconocido" +msgstr[1] "Encontrado %i archivos compartidos, %i desconocidos" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "¡ERROR! No se debe compartir %s" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Comentarios del archivo" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Valoración" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Comentario" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Sin comentarios" + +#: src/CommentDialogLst.cpp:104 +#, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%u comentario" +msgstr[1] "%u comentarios" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"Fallo al conectar a todo los servidores ofuscados listados. Intentándolo de " +"nuevo sin ofuscación." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "Error al conectar a todos los servidores." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "Red ED2K deshabilitada en opciones, no conectará." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "No hay servidores válidos en la lista de servidores" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Conectado a %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Conexión establecida en: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"Error fatal conectando. La conexión a Internet podría estar desactivada" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Conexión perdida con %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) parece estar caído." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) parece estar lleno." + +#: src/ServerConnect.cpp:391 +#, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "Se reintentará la conexión automática al servidor en %d segundo" +msgstr[1] "Se reintentará la conexión automática al servidor en %d segundos" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Conexión perdida" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "Conectando con %s (%s:%i) fallido" + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "Error: socket no válido al comprobar el timeout" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "Intento de conexión con %s (%s:%i) tiempo agotado." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" +"Error: Fallo al cargar la copia de seguridad. Busca en http://forum.amule." +"org soluciones para recuperar archivos .part.met " + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "No se han encontrado archivos .part" + +#: src/DownloadQueue.cpp:175 +#, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "Encontrado %u parte de archivo" +msgstr[1] "Encontrado %u partes de archivo" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Descargando %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Ya estás descargando este archivo '%s'" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Ya tienes este archivo '%s'" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Ya estás descargando el archivo %s" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "No se puede convertir el enlace a ed2k: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "Protocolo desconocido del enlace: %s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Error, enlace ed2k no válido: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "Ejecuta y sal." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Formato IP no válido. Usa xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" +"Este comando requiere un argumento. Argumentos válidos: 'all (todo)' o un " +"numero.\n" + +#: src/TextClient.cpp:343 +msgid "Processing by hash: " +msgstr "Procesando por hash: " + +#: src/TextClient.cpp:358 +msgid "Processing by filename: " +msgstr "Procesando por nombre de archivo: " + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" +"Este comando requiere un argumento. Argumentos válidos: un hash de archivo.\n" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Número inválido\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "Hash no válido (la longitud debería ser exactamente 32 caracteres)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "Operación satisfactoria." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "Solicitud fallida con el siguiente error: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "El Filtro IP para clientes es %s.\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "Apagado" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "Encendido" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "El Filtro IP para servidores es %s.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "El nivel de filtrado de IP actual es %d.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Límites de ancho de banda: Su: %u kB/s, Desc: %u kB/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Conectado a %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "con IDBaja" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "con IDAlta" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Conectando ahora" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "No conectado" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Descarga:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Subida:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Clientes en cola:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Fuentes totales:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Número de resultados de la búsqueda: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "TODO - muestra el progreso de una búsqueda" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Recibida una respuesta desconocida desde el servidor, OpCode = %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Mostrar una breve información de estado." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "Mostrar estado de conexión, velocidad subida/descarga actual, etc.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Mostrar árbol completo de estadísticas." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"Opcionalmente, un número entre 0-255 puede ser un argumento de este " +"comando,\n" +"el cual dice cuantas entradas del árbol de versión de cliente deberían " +"mostrarse.\n" +"Con 0 o sin valor significa 'sin limite'.\n" +"\n" +"Ejemplo: 'statistics 5' mostrará solo las 5 versiones que mas se repiten de " +"cualquier cliente.\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "Cerrar aMule" + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Cerrar el núcleo remoto en ejecución (amule/amuled).\n" +"Esto también cerrará el cliente de texto, esto no hará nada sino hay\n" +"un núcleo en ejecución.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Recargar el objeto dado" + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "Recargar lista de archivos compartidos." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "Recargar tabla de filtro de IP desde archivo." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Conectado a la red." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"Esto conectará a todas las redes que estén habilitadas en opciones.\n" +"Opcionalmente también puedes especificar un servidor de forma IP:Puerto, " +"para\n" +"conectar a ese servidor solamente. La IP debe ser una dirección IPv4,\n" +"o un nombre DNS." + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Conectar solamente a ED2K " + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Conectar solamente a Kad" + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Desconectado de la red." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "" +"Esto te desconectará de todas las redes en las que estás actualmente " +"conectado.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Desconectar solamente ED2K" + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Desconectar solamente Kad" + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Añade un ed2k o un enlace magnético al núcleo." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"El enlace ed2k a añadir puede ser.\n" +"*) un enlace de archivo (ed2k://|file|...), será añadido en la cola de " +"descargas,\n" +"*) un enlace de servidor (ed2k://|server|...), será añadido a la lista de " +"servidores,\n" +"*) o un enlace de lista de servidores, en el que todos los servidores en la " +"lista serán\n" +" añadidos a la lista de servidores.\n" +"\n" +"Un enlace magnético debe contener el hash ed2k y la longitud del archivo.\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Asigna un valor de opción" + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "Asignar opciones de filtrado de IP." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "Activa el filtro para clientes y servidores." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "Desactiva el filtro para clientes y servidores." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "Activa/Desactiva el filtro para clientes." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "Activa el filtro para clientes." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "Desactiva el filtro para clientes." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "Activa/Desactiva el filtro para servidores." + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "Activa el filtro para servidores." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "Desactiva el filtro para servidores." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "Selección nivel de filtrado de IP" + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"Niveles válidos en el filtro 0-255, y el valor por defecto (inicial)\n" +"es 127.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Asignar limites de ancho de banda." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "El valor dado a estos comandos han de ser en kilobytes/seg.\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Asignar un limite de subida." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "Asignar un limite de descarga." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Obtener y mostrar un valor de opciones" + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "Obtener opciones de filtrado de IP" + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "Obtener estado del filtro IP para clientes y servidores." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "Obtener estado del filtro IP para clientes." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "Obtener estado del filtro IP para servidores." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "Obtener nivel de filtrado de IP." + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Obtener limites de ancho de banda." + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Haz una búsqueda." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"Una búsqueda por tipo, debe especificarse el tipo:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Ejemplo: 'search kad archivo' ejecutara una búsqueda en kad de \"archivo\".\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Ejecuta una búsqueda global." + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Ejecuta una búsqueda local." + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Ejecuta una búsqueda kad." + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Muestra los resultados de la última búsqueda." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Devuelve los resultados de la búsqueda anterior.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "Muestra el progreso de una búsqueda." + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "Muestra el progreso de una búsqueda..\n" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Comenzar descargando un archivo" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"El número de un archivo de la última búsqueda se tiene que dar.\n" +"Ejemplo: 'download 12' iniciará la descarga del archivo con el número 12 de " +"la búsqueda anterior.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Pausar descarga." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Resumir descarga." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Cancelar descarga." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Asignar prioridad de descarga." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "Fija prioridad de la descarga a Baja, Normal, Alta o Auto.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "Establecer la prioridad a baja." + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "Establecer la prioridad a normal." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "Establecer la prioridad a alta." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "Establecer la prioridad a auto." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Mostrar colas/listas." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Mostrar cola subida/descarga, lista de servidores o lista de archivos " +"compartidos.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Mostrar cola de subida" + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Mostrar cola de descarga." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Mostrar registro." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Mostrar lista de servidores." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Limpiar registro." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "Comando en desuso, ahora '%s'." + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" +"Este es un comando en desuso, y será borrado en el futuro.\n" +"Usa '%s' en su lugar.\n" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() devolvió NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "Error: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "Alerta: %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "El nuevo ID-Cliente es %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "ALERTA: ¡Has recibido ID-Baja!" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "\tEsto sucede porque estás detrás de un cortafuegos o de un router." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tPara mas información, por favor ves a http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "¡Información recibida del servidor desconocida! - demasiado pequeña" + +#: src/ServerSocket.cpp:539 +#, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "Recibido %d servidores nuevo" +msgstr[1] "Recibido %d servidores nuevos" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Guardado lista de servidores completado." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "El servidor rechaza el último comando" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Paquete bogus recibido desde el servidor: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "Error mientras se estaba procesando un paquete desde el servidor: %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "Imposible crear un hilo de resolución de DNS para conectar con %s" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "Servidor IP %s (%s) está filtrado. No conectará." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "usando ofuscación de protocolo." + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "Conectando a %s (%s - %s:%i) %s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "Imposible resolver dns para el servidor %s: ¡Imposible conectar! " + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "CIP2Country::CIP2Country(): Error al cargar el dato del país desde " + +#: src/IP2Country.cpp:73 +#, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "Cargada %d foto de una bandera." +msgstr[1] "Cargadas %d fotos de banderas." + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"¿Estás seguro que deseas cancelar y borrar todos los archivos de esta " +"categoría?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Confirmación requerida" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Sin catalogar." + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Incompleto" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Activo" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Vídeo" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Audio" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Archivos" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "Imágenes de CD" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Imágenes" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Texto" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Seleccionar filtro de vistas" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Añadir categoría" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Editar categoría" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Eliminar categoría" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "Importando %s: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "Leyendo directorio temp" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "Obteniendo información básica de archivo info de descarga" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "Creando archivo de destino" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "Cargando datos desde la antigua descarga del archivo (%u de %u)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "Guardando bloque de datos en un nuevo archivo de descarga (%u de %u)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "Obteniendo información del archivo fuente de descarga" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "Añadiendo descarga y guardando nuevo archivo part" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Obteniendo estado..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "En progreso" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Error: Disco lleno" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Error: Partmet no encontrado" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Error: ¡Error E/S!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Error: ¡Falló!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "En cola" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Ya estás descargando" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Formato de archivo temp incorrecto o desconocido." + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Nombre de archivo" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Estado" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Hash de archivo" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Importar archivos part" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"¡Por favor elige un directorio para buscar descargas temporales! " +"(subdirectorios serán incluidos)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" +"¿Quieres que los archivos fuente de una descarga importada " +"satisfactoriamente sean borrados?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "¿Borrar fuentes?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Esperando..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (Disco: %s)" + +#: src/OtherFunctions.cpp:121 +msgid "byte" +msgid_plural "bytes" +msgstr[0] "byte" +msgstr[1] "bytes" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "byte/seg" +msgstr[1] "bytes/seg" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "segs" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "mins" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "horas" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "días" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Vídeos" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Archivos" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Textos" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programas" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Todos" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "No evaluada" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Inválido / Corrupto / Falsificación" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Pobre" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Aceptable" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Bueno" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Excelente" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "Todo" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "El resto" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "Cargando filtros IP 'ipfilter.dat' y 'ipfilter_static.dat'" + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "Error al cargar ipfilter.dat '%s', encontrado formato desconocido." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "Error al cargar ipfilter.dat '%s', imposible abrir el archivo." + +#: src/IPFilter.cpp:330 +#, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "Cargado %u rango IP desde '%s'." +msgstr[1] "Cargado %u rangos IP desde '%s'." + +#: src/IPFilter.cpp:332 +#, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "%u línea malformada fue descartada" +msgstr[1] "%u líneas malformadas fueron descartadas" + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Conexiones activas (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Detalles del archivo" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% terminado." + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "Enlace ED2K: " + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Enviar" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "'Click' aquí para añadir un enlace ed2k en tu cola de descargas." + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "Estado del mensaje emergente" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Cargando ..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"Los eventos son mostrados aquí. Para una lista completa de eventos, ves al " +"registro, de la pestaña de servidores." + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Número de usuarios en el servidor al cual estás conectado ..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Usuarios: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" +"Usuarios conectados al servidor actual y una estimación de el número total " +"de usuarios." + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"Índice actual de subidas y descargas. Si habilitas los números significan " +"los gastos indirectos en la comunicación del cliente." + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"Muestra el estado de conexión y las transferencias activas. Las flechas " +"rojas significan que estás desconectado, las flechas amarillas significan " +"que tienes ID-Baja (detrás de cortafuegos) y flechas verdes significan que " +"tienes ID-Alta (El tipo de conexión óptima)." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "No Conectado ..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Conectado al servidor." + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Buscar" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Nombre: " + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Local" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Global" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "FileHash" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Opciones extendidas" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Filtrar" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Tipo de archivo" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Extensión" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Tamaño Min" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Bytes" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Tamaño Max" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Disponibilidad" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Filtro:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Filtrar Resultados" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Invertir Resultado" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Ocultar Archivos Conocidos" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Mas" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "Búsquedas para mas resultados en ED2K. No soportado ahora en Kad." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Cancelar" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Limpiar campos" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Resultados" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Limpiar descargas completadas" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Mostrar subida / Cola de subida" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Clientes en cola :" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Enviar" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Enviar un mensaje específico." + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Cerrar" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Cerrar esta sesión de chat" + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Nombre Completo :" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "N/D" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "Archivo-met :" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Hash :" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Tamaño :" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Estado archivo part :" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Última comprobación completa :" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Fuentes encontradas :" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Transfiriendo fuentes :" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Número de partes :" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Disponibles :" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Flujo de datos :" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Tiempo Descarga Activa: " + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Transferido :" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Tamaño Completado :" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Gestión inteligente de corrupción" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Perdido por corrupción :" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Ganado por compresión :" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "Paquetes salvados por I.C.H.:" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Nombres de archivo" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Tomar" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Limpiar" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Aplicar" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Ok" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "" +"Comentario/Calificación del archivo (El texto será visible por todos los " +"usuarios)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"Para una película, puedes poner su duración, su descripción, el idioma ...\n" +"y si es una falsificación (fake) puedes informar a los demás usuarios de " +"aMule" + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Calificación de archivo" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" +"Cambiar la calificación del archivo o advertir a otros usuarios si no es " +"válido" + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Sin comentario(s)" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Actualizar" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Descargando, por favor espera ..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Tamaño desconocido" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Información requerida" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "Dirección IP :" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Puerto :" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Información adicional" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Nombre de usuario :" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Hash del usuario :" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Recargar tus archivos compartidos" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Sesión actual" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Total" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Peticiones:" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Subidas aceptadas :" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Velocidad de descarga" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Actual" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Media de ejecución" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Media de la sesión" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Velocidad de subida" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Conexiones" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Descargas activas" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Conexiones activas (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Subidas activas" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Árbol de estadísticas" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Nombre de usuario:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Hash de usuario:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Software del cliente:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Versión del cliente:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "Dirección IP:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "ID usuario:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "IP Servidor:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Nombre servidor:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "Transferencias al cliente" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Solicitud actual:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Velocidad media de subida :" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Velocidad media de descarga :" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Subido (sesión):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Descargado (sesión):" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Subido (total):" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Descargado (total):" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Resultados" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "Modificador DE/SU:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Ident Segura:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Calificación (total):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Puntuación cola:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Opciones generales" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Alias" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - la Mula de Linux" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "" +"Este es el nombre que los otros usuarios verán cuando se este conectando a " +"ti." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Idioma" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "Esto especifica el lenguaje usado en los controles." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Opciones varias" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Comprobar nueva versión al inicio" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" +"Habilitando esto, hará que aMule compruebe si existe una nueva versión al " +"inicio." + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Iniciar minimizado" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "Habilitando esto, haces que aMule se minimice en el inicio." + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Preguntar al salir" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "Hacer que aMule pregunte antes de salir." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Habilitar icono de sistema" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "Esto habilita/deshabilita icono de sistema (o de la barra de tareas)." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "Minimizar al icono de la bandeja" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" +"Activando esto hará que aMule se minimice en la bandeja del sistema, " +"parecido a la barra de tareas." + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Retardo de los mensajes emergentes en segs" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "Retardo antes de mostrar los mensajes emergentes." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Selección de navegador" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Selecciona tu navegador aquí" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Navegador personal:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Introduce el nombre del navegador. Para usar un navegador personal, " +"selecciona personalizado en el menú de arriba." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Abrir en nueva pestaña si es posible" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" +"Abrir cuando sea posible, la página web en una nueva pestaña en lugar de en " +"una nueva ventana" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Límites" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Subida" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Asignación de puesto reservado" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Capacidad" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" +"Nota: Estos valores solo son\n" +" usados para las estadísticas." + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Puerto TCP estándar:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "Este es el puerto estándar ED2K y no puede ser deshabilitado." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Puerto UDP estándar:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "Este puerto UDP es usado para extender las peticiones ED2K y red Kad." + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "desactivar" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Dirección de enlace" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "Puerto UDP para peticiones extendidas al servidor (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Max. fuentes/archivo" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Límite Máximo" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Límites de conexión" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Conexiones máximas" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Universal Plug and Play" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "Habilitar UPnP" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "Puerto UPnP TCP:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Autoconectar al iniciar" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Reconectar al perder la conexión" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Mostrar ancho de banda excedente" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Opciones de servidor" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Eliminar servidores caídos tras" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "reintentos" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Auto-actualizar lista de servidores al iniciar" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Lista" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Actualizar lista de servidores al conectar a un servidor" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Actualizar lista de servidores al conectar un cliente" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Usar sistema de prioridades" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Control inteligente de IDBaja al conectar" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Conexión segura" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Autoconectar sólo a Servidores fijos" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Asignar alta prioridad a los servidores añadidos manualmente" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "Activar I.C.H" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICH confiar en todos los hash (no recomendado)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Añadir archivos para descargar en modo pausado" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Añadir nuevas descargas con auto prioridad" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Intentar descargar antes la primera y última parte" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Añadir nuevos archivos compartidos con auto prioridad" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Intentar transferir partes completas en todas las subidas" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Descargar siguiente archivo pausado cuando otro se complete" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "Solo en la misma categoría" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "Guardar 10 fuentes en archivos raros (< 20 fuentes)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Espacio en disco" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Comprobar espacio en disco" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "Selecciona esto si quieres que aMule compruebe tu espacio en disco" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Min espacio de disco:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Introduce el espacio mínimo de disco deseado." + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Archivos entrantes :" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Archivos temporales :" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Directorios compartidos" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "(Click derecho en icono de carpeta, para compartición recursiva)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Compartir archivos ocultos" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Reproductor de vídeo" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Crear copia de seguridad para previsualizar" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Gráficos" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Intervalo de actualización : 5 segs" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Tiempo de promedio del gráfico: 100 min" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Escala del gráfico de las conexiones: 100" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Seleccionar colores de estadísticas" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Fondo" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Rejilla" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Descarga actual" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Promedio descarga en ejecución" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Promedio Descarga/sesión" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Subida actual" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Promedio Subida/tiempo" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Promedio subida/sesión" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Conexiones activas" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Barra de velocidad del icono de sistema" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Kad-nodos actual" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Kad-nodos ejecutando" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Kad-nodos sesión" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Seleccionar" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Número de versiones de clientes a mostrar (0=sin limite)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Notificaciones" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Mensajes de alerta" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Usar sonido" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Notificar cuando :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Nueva entrada al registro" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Iniciar una nueva sesión de chat" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Se ha recibido un nuevo mensaje de chat" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Descarga añadida o finalizada" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Nueva versión de aMule detectada" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "OOD urgente, perdida conexión con servidor" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Notificar por correo" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Enviar un correo cuando se complete una descarga" + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "Servidor SMTP :" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "Correo electrónico :" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "¡¡¡ AVISO !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"No cambies estos parámetros a menos que sepas\n" +"lo que estás haciendo, de lo contrario puedes\n" +"hacer que aMule funcione peor.\n" +"\n" +"aMule funcionará bien sin que cambies ninguno\n" +"de estos parámetros." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Opciones avanzadas" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Nuevas conexiones max. / 5 segs" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Tamaño del buffer de archivo: 240000 bytes" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Tamaño cola de espera: 5000 clientes" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Intervalo de actualización de conexión al servidor: Desactivado" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "Tweaks GUI" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Progreso de los archivos de la lista de descarga" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Mostrar porcentaje" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Mostrar barra de progreso" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Estilo de la barra de progreso" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Plano" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "3D" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Soporte para temas visuales" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Activar soporte de temas" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Tema:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- no hay temas disponibles -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Ordenando columna" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "Auto-ordenar archivos en la cola de descarga (Alta CPU)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "aMule ordenará automáticamente las columnas en tu lista de descargas" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Varios Tweaks Gui" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Mostrar gestión rápida de enlaces ED2k" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Mostrar info extendida en las pestañas de las categorías" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Mostrar índices de transferencia en el título" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Orientación vertical de la barra de herramientas" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Mostrar número de archivo part, antes del nombre de archivo" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Control Remoto" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Parámetros del servidor web" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Iniciar servidor web al inicio" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Puerto del servidor web" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "Habilitar UPnP port forwarding en el puerto del servidor web" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Puerto UPnP TCP de servidor web" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Tiempo de actualización de página (en segs)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Activar compresión gzip" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Activar invitado" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Contraseña administrador" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Contraseña invitado" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Plantilla Web" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Parámetros de conexión externa" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Aceptar conexiones externas" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"IP de la interfaz que está escuchando\n" +"(vacío para cualquiera)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Introduce una IP valida de la interfaz que está escuchando. Un campo vacío o " +"0.0.0.0 significará cualquier interfaz." + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "Puerto TCP" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "Habilitar UPnP port forwarding en el puerto EC" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "Aplicar cualquier cambio hecho en las opciones." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Cancelar cualquier cambio hecho en las opciones." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Titulo :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Comentario : " + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Directorio entrante :" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Cambiar prioridad a nuevos archivos asignados :" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "No cambiar" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Selecciona color para esta categoría (seleccionada) :" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Mostrar motd del servidor cuando estés conectado ..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Info. servidores" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Pulsa este botón para limpiar el registro." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "Registro" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "" +"Click en este botón para actualizar la lista de servidores desde una URL ..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Lista de servidores" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Introduce la url a un archivo server.met y presiona el botón de la izquierda " +"para actualizar la lista de servidores conocidos." + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Añadir servidor manual : Nombre" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Introduce el nombre del nuevo servidor" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Introduce la IP del servidor, usando el formato X.X.X.X." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Introduce el puerto del servidor" + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "Añadir manualmente un servidor (rellena los campos) ..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "Info ED2K" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Info Kad" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"El idioma seleccionado no parece estar instalado\n" +"Debes generarlo para usar este lenguaje.\n" +"Un buen comienzo en sistemas linux es el archivo /etc/locale.gen y el " +"paquete 'locales'\n" +"¡Buena suerte!\n" +"(Nota: Intentaré arreglarlo de todos modos)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "No mostrar otra vez" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "Click en este botón para actualizar la lista de nodos desde la URL ..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Nodos (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"Introduce aquí la url al archivo nodes.dat y presiona el botón de la " +"izquierda, para actualizar la lista de nodos conocidos." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Estadísticas nodos" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Conectar" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Nuevo nodo" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Puerto:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Conectar desde \n" +"clientes conocidos" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Desconectar Kad" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Ofuscación de protocolo" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Soporte de ofuscación de protocolo" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"Esta opción activa la ofuscación de protocolo, e hace que aMule acepte " +"conexiones ofuscadas de otros clientes." + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Usar ofuscación para conexiones salientes" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"Esta opción hace que aMule use ofuscación de protocolo cuando se conectan " +"otros clientes/servidores." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Aceptar solo conexiones ofuscadas" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"Esa opción hace que aMule solo acepte conexiones ofuscadas. Tendrá menos " +"fuentes, pero todo su tráfico será ofuscado." + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Opciones de archivo" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Todos" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Nadie" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Quien puede ver los archivos compartidos:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "" +"Selecciona quien puede solicitar ver nuestra lista de archivos compartidos." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "Filtrado de IPs" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Filtro clientes" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Habilitar filtrado de IPs de clientes definido en el archivo ~/.aMule/" +"ipfilter.dat" + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Filtro servidores" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Habilitar filtrado de IPs de servidores definido en el archivo ~/.aMule/" +"ipfilter.dat" + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Recargar lista" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "Recargar lista de filtrado de IPs desde archivo ~/.aMule/ipfilter.dat" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Actualizar ahora" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Auto-actualizar el filtrado de IPs al inicio" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Nivel de filtrado:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Filtrar siempre IP's de LAN" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Control paranoico de IPs no comprobadas" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Rechazar paquetes si la ip del cliente es diferente de la ip desde donde el " +"paquete es recibido. Usar con cautela." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "Usar el ipfilter.dat de sistema si está disponible" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" +"Si no se encuentra un archivo ipfilter.dat local, permitir el uso de un " +"archivo ipfilter de sistema" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "Usar Identificación Segura de Usuario" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" +"Se recomienda activar esta opción. No recibirá créditos si la ISU " +"(Identificación Segura de Usuario) no está habilitada." + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Habilitar/Deshabilitar" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Activar Firma online" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Habilitar la escritura de archivos del SO, se suele usar para crear firmas " +"por aplicaciones externas." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Frecuencia de actualización (segs):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "" +"Cambiar la frecuencia (en segundos) de la actualización de la firma-online" + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Directorio de Firma Online:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" +"Click aquí para seleccionar el directorio que contienen los archivos de " +"firmas-online." + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Deshabilitar/Habilitar" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "Filtrar mensajes entrantes (excepto conversación actual):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Opciones de filtrado:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Filtrar todos los mensajes" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Filtrar mensajes de gente que no está en tu lista de amigos" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Filtrar mensajes de clientes desconocidos" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Filtrar mensajes que contienen (usa ',' como separador):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"añade aquí las palabras que amule debe filtrar y bloquear mensajes incluidos" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Comentarios" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "Filtrar comentarios que contengan (usar ',' como separador):" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Habilitar Proxy" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Habilitar/Deshabilitar soporte Proxy" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Tipo Proxy:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "El tipo de proxy al que estás conectando" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Servidor Proxy:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "Nombre del host del proxy" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Puerto Proxy:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "El puerto del proxy" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Autentificación" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Habilitar autentificación" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Habilita/deshabilita autentificación usuario/contraseña" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "El nombre de usuario a usar para conectar al proxy" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Contraseña:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "La contraseña a usar para conectar al proxy" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Conexión automática al servidor sin proxy" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Conectar a:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Conexión a aMule remoto" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Nombre usuario:" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Recordar estas opciones" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Habilita modo extendido de depuración al inicio" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "Mensajes de categorías:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "Añadir .part" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Reintentar seleccionado" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Borrar seleccionado" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Tipos de eventos" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Conectar a cualquier servidor y/o Kad" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Nueva Categoría" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Selecciona un directorio para los archivos entrantes" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "¡Debes especificar un nombre para la categoría!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "¡Debes especificar una ruta para la categoría!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"¡Error al crear el directorio entrante de la categoría. Por favor " +"especifique una ruta correcta!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "Extensión desconocida '%s' para el comando '%s'.\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "Comando desconocido '%s'.\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"Este comando no tiene un argumento.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"Este comando debe tener un argumento.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Este comando está incompleto, debes usar una de la extensiones....\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Extensiones disponibles:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Comandos disponibles:\n" + +#: src/ExternalConnector.cpp:188 +#, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"Todos los comandos son sensibles a las mayúsculas.\n" +"Teclea '%s ' para obtener información detallada del .\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Salir de la aplicación." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Mostrar ayuda" + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"Para obtener ayuda de un comando, teclea 'help '.\n" +"Para obtener la lista completa de comandos, teclea 'help'.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"Usa '%s' para la lista de comandos\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "¡Error de sintaxis!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Error procesando el comando - ¡nunca debería pasar! Informa del fallo, por " +"favor\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Este comando no debería tener ningún parámetro" + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Este comando debe tener un parámetro." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Argumento no válido." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Esto es un comando incompleto." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Teclea '%s' para obtener mas ayuda.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "Esto es %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "Esto es %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Creando cliente...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "Conexión fallida. Imposible conectar al host especificado\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"Ok, saliendo %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"Imposible conectar con una contraseña en blanco.\n" +"Debes especificar una contraseña en el archivo config\n" +"o en linea de comandos, o introduce una cuando te pregunte.\n" +"\n" +"Saliendo...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Mostrar esta ayuda." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "Host donde se está ejecutando aMule. (por defecto: localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "Puerto de conexión externa de aMule. (por defecto: 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Contraseña de conexiones externas" + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Leer configuración desde el archivo." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "No muestres ninguna salida." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Modo Extendido - muestra también los mensajes de depuración" + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Selecciona el idioma del programa." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "Escribe opciones de la línea de comando al archivo de configuración." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "" +"Crear archivo de configuración basado en el archivo de configuración de " +"aMule." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Imprime versión del programa." + +#: src/ClientCreditsList.cpp:168 +#, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "Archivo de créditos cargado, %u cliente conocido" +msgstr[1] "Archivo de créditos cargado, %u clientes conocidos" + +#: src/ClientCreditsList.cpp:171 +#, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] " - ¡Ha expirado el crédito de %u cliente!" +msgstr[1] " - ¡Han expirado los créditos de %u clientes!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "Archivo 'cryptkey.dat' no encontrado, creando." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"ERROR: el daemon de aMule no se puede usar cuando están desactivadas las " +"conexiones externas. Para activar las conexiones externas, use o bien un " +"aMule normal, inicie amuled con la opción --ec-config, o bien, establezca " +"\"AcceptExternalConnections\" a 1, en el archivo ~/.aMule/amule.conf" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "ERROR: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Readmitir" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Mostrar subidas" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Mostrar cola" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Mostrar clientes" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Seleccionar vista" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Software Cliente" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "En espera" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Subiendo" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Subida/Descarga" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Estado remoto" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "LC: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Prioridad del archivo" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Resultado" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Preguntado" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Última comprobación" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Entrado en cola" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Estado de la subida" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Subido" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Estado de la descarga" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Descargado" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Hash de usuario" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Cifrado" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Oculta los archivos compartidos" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Detalles del cliente" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "No soportado" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "No completado" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Cliente sospechoso" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Verificado - OK" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "No disponible" + +#: src/ClientDetailDialog.cpp:190 +#, c-format +msgid "%u (QR: %u)" +msgstr "%u (QR: %u)" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" +"El tamaño mínimo debe ser menor al tamaño máximo. Tamaño máximo ignorado." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Alerta de búsqueda" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Ilimitado" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "Menú aMule" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Limites de velocidad:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "SU: Ninguno" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "SU: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "DE: Ninguna, " + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "DE: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Velocidad de Descarga: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Velocidad de Subida: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Información del cliente" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Alias: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "¡Ningún alias introducido!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "ID Cliente:" + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Nombre del servidor: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "IP del servidor: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "Puerto TCP: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "Puerto TCP: No está listo" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "Puerto UDP: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "Puerto UDP: No está listo" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Firma Online: Activada" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Firma Online: Desactivada" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Archivos Compartidos: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Clientes en cola: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "Total DE: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "Total SU: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Límite subida" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Límite descarga" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "Ocultar aMule" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "Mostrar aMule" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "Sesión Chat Iniciada: %s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Conectado al cliente ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** Conectando al cliente ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Error al conectar con el cliente / Conexión perdida ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Cerrar pestaña" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Cerrar todas las pestañas" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Cerrar las otras pestañas" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "Cargando archivo server.met: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "¡Archivo server.met no encontrado!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" +"Error al cargar el archivo server.met '%s', encontrado formato desconocido." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "¡Error al abrir server.met!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"Archivo server.met corrupto, encontrada versión no válida: 0x%x, tamaño %i" + +#: src/ServerList.cpp:168 +#, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "%i servidor encontrado en server.met" +msgstr[1] "%i servidores encontrados en server.met" + +#: src/ServerList.cpp:170 +#, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d servidor añadido" +msgstr[1] "%d servidores añadidos" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Servidor no añadido: [%s:%d] no has especificado un puerto válido." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "Servidor no añadido: La IP de [%s:%d] está filtrada o no es válida." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" +"Servidor no añadido: Servidor IP:Puerto [%s:%d] encontrado en la lista." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Servidor añadido: Servidor en [%s:%d] usando el nombre '%s'." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"Estás conectado al servidor, que intentas borrar. Por favor desconéctate " +"primero." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "¡Error al guardar server.met!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "URL no válida" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "Descarga finalizada de la lista de servidores de %s" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Error al descargar la lista de servidores desde %s" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"No hay lista de direcciones de servidores en 'addresses.dat'. Pon una " +"dirección válida en este archivo, antes de actualizar automáticamente tu " +"lista de servidores" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "Descargando lista de servidores de %s" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" +"Alerta, URL especificada para auto-actualización de servidores, no válida: %s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "Error en addresses.dat, server.met de la url de auto descarga inválido" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"Servidor local es filtrado por los Filtros IP, ¡conectando a un servidor " +"diferente!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "Error al ejecutar el comando '%s' en el evento `%s'." + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"Tu idioma ha sido cambiado al de por defecto de tu sistema, debido a un " +"cambio de configuración. Lo siento." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"No tienes ningún servidor en la lista de servidores.\n" +"¿Quieres que aMule descargue una nueva lista ahora?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Descarga lista de servidores" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "servidor web ejecutándose con pid %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"Has solicitado iniciar el servidor web en el inicio, pero su binario no se " +"puede ejecutar.\n" +"Por favor instala el paquete que contiene el servidor web, o compila aMule " +"usando --enable-webserver y ejecuta make install." + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "Imposible direccionar los puertos a la dirección especificada: %s" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "Puerto %u no está disponible. Tendrás IDBaja\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"Puerto %u no está disponible!\n" +"\n" +"Esto significa que tendrás IDBaja.\n" +"\n" +"Comprueba tu red y asegúrate de que el puerto está abierto para entrada y " +"salida." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Error al crear el archivo de FirmaOnline" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "Error al crear el archivo de FirmaOnline aMule" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"El idioma seleccionado no parece estar instalado. (Nota: Intentaré ponerlo " +"de todos modos)" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "Es la primera vez que inicias aMule %s" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "Esto es una versión de prueba, actualízate diariamente, y \n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "no damos garantía si rompiera algo, queme tu casa,\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "o mata a tu perro. Pero *debería* ser seguro de todas formas. \n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" +"Las siguientes opciones cambiaron en esta versión por razones de seguridad:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* Activado soporte de ofuscación de protocolo para conexiones entrantes y " +"salientes.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* Desactivada la actualización de la lista de servidores desde otro cliente " +"o servidor.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"Para más información de la razón de estés cambios, busque información\n" +"de \"fake servers\" en la wiki de aMule http://wiki.amule.org.\n" +"Es importante que limpie cualquier servidor falso de su lista de servidores " +"para que aMule funcione correctamente." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Podrás encontrar en nuestra web, mas información, soporte y nuevas " +"versiones, \n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" +"en www.aMule.org, o en nuestro canal de IRC #aMule en irc.freenode.net. \n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Envíanos cualquier fallo a http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"El directorio que has especificado de Firma Online no es válido\n" +"La Firma Online ha sido deshabilitado hasta que lo arregles en opciones." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "ERROR: no puedo abrir el archivo de registro" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "ALERTA: el archivo de registro está vacío. Algo está mal" + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Registro ha sido borrado" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "Mensaje del servidor: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Error al descargar la lista de nodos." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Error al abrir el archivo de comprobación de versión descargado" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Archivo de comprobación de versión corrupto" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "¡Estás usando una versión anticuada de aMule!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "Tu versión de aMule es %i.%i.%i y la última versión es %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "La última versión puede siempre ser encontrada en http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "ALERTA: Tu versión de aMuled está obsoleta: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "Tu copia de aMule está actualizada." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Error al descargar el archivo de comprobación de versión" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Conectado a %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Conectando a %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Desconectado de ED2K" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad iniciado." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad detenido." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Conectado a Kad (ok)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Conectado a Kad (tras cortafuegos)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Desconectado de Kad" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"Red Kad no puede ser usada si el puerto UDP está deshabilitado en opciones, " +"no iniciando." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Red Kad deshabilitada en opciones, no conectará." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "" +"¡Error al abrir el archivo lista de amigos 'emfriends.met' para la lectura!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "" +"¡Error al abrir el archivo lista de amigos 'emfriends.met' para la escritura!" + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "" +#~ "Todavía no puedes conectar a una ip especifica desde una interfaz remota." + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "No puedes actualizar server.met desde una interfaz remota." diff --git a/po/et_EE.po b/po/et_EE.po new file mode 100644 index 00000000..777bf054 --- /dev/null +++ b/po/et_EE.po @@ -0,0 +1,7064 @@ +# translation of aMule to Estonian +# aMule i18n resource file. +# Copyright (C) 2006 aMule Team +# This file is distributed under the same license as the aMule package. +# +# Kry , 2004. +# Hans , 2006, 2007, 2008. +msgid "" +msgstr "" +"Project-Id-Version: et_EE\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2008-02-24 19:39+0200\n" +"Last-Translator: Hans \n" +"Language-Team: Estonian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: KBabel 1.11.4\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Pead defineerima mittetühja parooli." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Vigane parool, pole MD5 kontrollsumma!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Ühenduse viga" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "EC Ühendus ebaõnnestus. Tühi vastus." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "Väline ühendus: Ligipääs keelatud sest: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "Väline ühendus: Ligipääs Keelatud!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "Väline ühendus: serveripoolne paha vastus. Ühendus suletud." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Õnnestus! Ühendus aMulaga loodud " + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Õnnestus! Ühendus loodud." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Räsin" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Lõpetatud" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Valmis" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Pausitud" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Vigane" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Tõmban" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Ootan" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Alustan faili '%s' MD4 ja AICH kontrollsumma loomist" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Alustan faili '%s' MD4 kontrollsumma loomist" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Alustan faili '%s' AICH kontrollsumma loomist" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "Konverteerin vanad '%s' AICH kontrollsummad 64b '%s'." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "HOIATUS: Fail ninega '%s' on vigane ja nimetatati ringi '%s'." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "" +"HOIATUS: Sama nimega fail '%s' on olemas, uus fail nimetatati ringi '%s'." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "HOIATUS: peale varukoopia tegemist ei suuda '%s' originaali eemaldada" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "HOIATUS: Ei suutnud %s kustutada" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Ei suuda tõmmata kasutaja '%s' jagatud faili" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Teadmata" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (Valetatud eMule versioon %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (Valetatud eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (Valetatud eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (baseerub eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Kasutajanimi: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, c-format +msgid "Requested: %s\n" +msgstr "Küsitud: %s\n" + +#: src/BaseClient.cpp:1878 +#, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Selle seansi failistatistika: Aksepteeritud %d/%d päringust, %s siirdatud\n" +msgstr[1] "" +"Selle seansi failistatistika: Aksepteeritud %d/%d päringust, %s siirdatud\n" + +#: src/BaseClient.cpp:1881 +#, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Kõikide seansside failistatistika: Aksepteeritud %d/%d päringust, %s " +"siirdatud\n" +msgstr[1] "" +"Kõikide seansside failistatistika: Aksepteeritud %d/%d päringust, %s " +"siirdatud\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Küsiti tundmatut faili" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "Klient %s IP:Port %s:%d kasutab %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Kasutajanimi" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Sõbrad" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Näita &detaile" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Lisa sõber." + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Eemalda sõber" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Saada sõnu&m" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Vaata faile" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Taasta sõbraslot" + +#: src/FriendListCtrl.cpp:273 +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Oled kindel et tahad valitud sõbra(d) kustutada?" + +#: src/FriendListCtrl.cpp:275 +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Oled kindel et tahad valitud sõbra(d) kustutada? " + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Loobu" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"Sul pole lubatud määrata rohkem kui üks sõbraslot.\n" +"Määrati ainult üks slott." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Vali mitu" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Faili nimi" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Suurus" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Tüüp" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Prioriteet" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "FailiID" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Päringuid" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Aktsepteeritud päringuid" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Siiratud andmed" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Jagamise suhe" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Saadud osi" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Täielikke allikaid" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Kataloogi asukoht" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Jagatud failid" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Väga madal" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Madal" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Keskmine" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Kõrge" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Väga Kõrge" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Versioon" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Auto" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Lisa Kommentaar/Hinnang" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Muuda Kommentaari/Hinnangut" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Nimeta ümber" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Lisa failid ülekantavate failide loetellu" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Kopeeri magnet &URI lõikepuhvrisse" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Kopeeri ED2k &link lõikepuhvrisse" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Kopeeri ED2k link lõikepuhvrisse (Allika&s)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "Kopeeri ED2k link lõikepuhvrisse (Allikas)(&Koos Krüpto seadetega)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Kopeeri ED2k link lõikepuhvrisse (&Hostinimi)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "Kopeeri ED2k link lõikepuhvrisse (Hostinimi)(Koos Krüpto seadetega)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Kopeeri ED2k link lõikepuhvrisse (&AICH info)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Kopeeri tagasiside lõikepuhvrisse" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "Allika lingi loomiseks pead omama HighID'd." + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Hoiatus" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Jagatud failid (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[FailiOsa]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Sisesta selle faili uus nimi:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Faili ümbernimetamine" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Taastan faili '%s' saatmise" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Peatan faili '%s' saatmise" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: otsingu võtmesõna on liiga lühike" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "VIGA: Ei suuda kuulata TCP porti." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "Päring ebaõnnestus, põhjus: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "Päring ebaõnnestus tundmatu vea tõttu." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "Indeksfaili ei leidnud: " + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Ei suuda luua web socketi lõime\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "WEB server: Starditud\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Seanss on aegunud - vajalik uuestilogimine\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Seanss ok, sisselogitud\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Seanss ok, pole sisselogitud\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Pole avatud seanssi - nõuan logimist\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Seanss loodud - nõuan logimist\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Töötlen päringut [algupärane]:" + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Kontrollin parooli\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Parooli kontrollsumma vigane\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Parool ok\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Parool, paha\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "Sa ei sisestanud parooli. Tühja prooli kasutamine pole lubatud.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Nõuti väljalogimist\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Töötlen päringut [ümbersuunatud]:" + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Laeb malli " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Webserveri HTTP port" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Kasuta webserveri pordis UPnP pordisuunamist" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "UPnP port" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Kasuta gzip pakkimist" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Täieõigusliku web serveri ligipääsu parool" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Külalise (guest) parool webserverile" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Luba külalise (guest) ligipääs" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Keela külalise (guest) ligipääs" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "Lae/salvesta webserveri seaded eemal(asuvasse/asuvast) aMule'st" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "aMule seadetefaili asukoht. ÄRA KASUTA OTSE!!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "Ära kasuta PHP interpretaatorit (aegunud)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Loo PHP lehed iga päringu puhul uuesti" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "aMule WebServer" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Info puudub" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Mitte kunagi" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Tõmban..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Seaded" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "amulesig.dat fail asukoht" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Lehitse" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Siia sisesta kataloog kus asub sinu amulesig.dat fail" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Värskendamise intervall sekundites" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Genereeri igal värskendamisel staatiline pilt" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "Kataloog, kuhu soovid salvestada genereeritud staatilised pildid" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Saada perioodiliselt oma stat fail FTP serverisse" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "FTP Url" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "FTP asukoht" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Sisesta siia oma FTP serveri URL" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "Sisesta siia FTP serveri kataloog kuhu paigutada staatilised pildid" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Kasutaja" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Parool" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Sinu kasutajanimi FTP serverisse logimiseks" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Sinu parool FTP serverisse logimiseks" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "FTP värskendamise intervall minutites" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Kinnita/kontrolli" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Sinu allkirjafaili asukoha kataloog" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Genereeritud statistiliste piltide kataloog" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i päev(a) %i tundi %i min %i s" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, aMule Online Statistika" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Ohoo, rõõm sind näha!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Suurim Tõmbamine alates wxCas käivitamisest" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "Absoluutselt suurim Tõmbamine wxCas eelmistest käivitamistest" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Algväärtusta" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "Süsteem" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Peata Automaatne Värskendus" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Salvesta Ühenduse Statistiline pilt" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Trüki Ühenduse Statistiline pilt" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Seaded" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "wxCas Info" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Käivita automaatne värskendamine" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Automaatne värskendamine on peatatud" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Automaatne värskendamine on käivitatud" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Salvesta Statistika" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Sellist tüüpi faili jaoks pole 'tegelejat'." + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "Faili salvestamine ebaõnnestus" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "aMule Online Statistika" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Tekkis viga printimisel.\n" +"Võibolla pole su printer korralikult seadistatud?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Trükin" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, aMule OnLine Allkirja Statistikal\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Baseerub Pedro de Oliveira CAS\n" +"\n" +"Jaotatakse GPL litsentsi järgselt" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Oh Oh, aMule ei tööta ..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule töötab" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule töötab aga ühendus on katkestatud" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule ühendub..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Oh Oh, aMule olek on teadmata..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " on toimetanud juba " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " on seiskunud !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " pole ühendatud !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " ühendub..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " teeb midagi imelikku, kontrolli !!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " on ühendatud " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "ok" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "tulemüüriga" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "väljas" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " baseerub " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +msgid " with " +msgstr " koos " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Kokku Tõmbamisi: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Saatmine: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Seansil Tõmmatud: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Tõmbamine: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s, Saatmine: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +msgid " kB/s" +msgstr " kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Jagamine: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " faili, Klienti järjekorras: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Kellaaeg: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " on " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Süsteemi koormuse keskmised (1-5-15 min): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Süsteem on elus juba: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uP %02ut %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02ut %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "HighID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "LowID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Pole ühendust" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +msgid "Cancelled !" +msgstr "Tühistatud !" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Ei suuda %s avada" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "Fail '%s' on Donkey jaoks liiga suur: suurim lubatud on 4 GB." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Sisendparameetrid" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Räsitav fail" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Lisa selle faili alternatiivsed URL'id" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Sisesta siia fail, millele soovid luua Ed2k linki" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Sisesta siia see URL mida soovid ed2k lingile lisada: Lisa / lõppu, et " +"aLinkCreator lisaks sellele faili nime" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Lisa" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Eemalda" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Puhasta" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Loo link osa-kontrollsummadega" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Aita suurenenud lingi hinnaga uusi ja haruldasi faile kiiremini levitada." + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "MD4 Faili kontrollsumma" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "Ed2k Faili kontrollsumma" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "Ed2k link" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Alusta" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Salvesta" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Kopeeri lõikepuhvrisse" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Välju" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Ava fail tema ed2k lingi loomiseks" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Kopeeri arvutatud ed2k link lõikepuhvrisse" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Salvesta arvutatud ed2k link faili" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "aLinkCreator'ist" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Vali fail, millele soovid arvutada ed2k linki" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "Praeguseks hetkeks pole midagi kopeerida !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Vali fail millele arvutasid ed2k lingi" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Ei suuda avada " + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Palun sisesta mittetühi faili nimi" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "Pole midagi praeguseks hetkeks salvestada !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, aMule ed2k lingilooja\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pildid pärinevad http://www.everaldo.com ja http://www.icomania.com\n" +"ja http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Jaotatakse GPL litsentsi järgselt" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Räsin..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Tehtud %.2f sekundiga" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "Oled juba selle URL lisanud !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Palun sisesta mittetühi URL" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "Töötlen faili number %u: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "" +"Soovisid osade kontrollsummasid (Kasutatakse ainult failidel mis on > 9.5 MB)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Palun oota..." + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> Faili pole olemas !\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, aMule ed2k lingilooja" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Auto [Madal]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Auto [Norm.]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Auto [Kõrge]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Ühendun" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Pärin" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Ühendun serveri kaudu" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Järjekord täis" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "Järjekorras" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Saadan" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Võtan vastu kontrollsumma" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Pole vajalikke osi" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Ühendus LowID <-> LowID ei õnnestu" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Liiga palju ühendusi" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Ühendun Kad kaudu" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Liiga palju Kad ühendusi" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Blokeeritud" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Ühenduse viga" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Järjekord täis" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "Vana MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "Uus MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "eMule Kokkusobiv" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Kohalik server" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Kaug server" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Allikate Vahetus" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Passiivne" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Link" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Allikaid" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Süsteemi vaikeväärtus" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Araabia" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Baski" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Bulgaaria" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Kataloonia" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Hiina (Lihtsustatud)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Hiina (Traditsiooniline)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Kroaatia" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "Tšehhi" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Taani" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Hollandi" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Inglise (U.K.)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Eesti" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Soome" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Prantsuse" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Galiitsia" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Saksa" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "Kreeka" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Ungari" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Itaalia" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Itaalia (Shveits)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "Jaapani" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Korea" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "Leedu" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "Norra" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Poola" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portugali" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Portugali (Brasiilia)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Vene" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Sloveenia" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Hispaania" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "Rootsi" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Türgi" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Ei suuda tuvastada valitud lehitsejat (browser)!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "TCP port ei saa olla suuerm kui 65532, sest serveri UDP soket on TCP+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Kasutan vaikimisi porti (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Serveri nimi" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Aadress" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Port" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Kirjeldus" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Kasutajad" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Failid" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Nurjunud" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Staatiline" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Versioon" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Sa oled ühenduses selle serveriga mida soovid kustutada. Palun katkesta " +"ühendus. Serverit ei kustutatud." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Info" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(Tundmatu nimi)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Oled kindel et tahad kustutada staatilise serveri %s" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Jah" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Ei" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Ei suuda avada '%s'" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Servereid (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Server" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Ühendu serveriga" + +#: src/ServerListCtrl.cpp:428 +msgid "Mark server as static" +msgstr "Märgi server staatilisena" + +#: src/ServerListCtrl.cpp:429 +msgid "Mark server as non-static" +msgstr "Märgi server mittestaatilisena" + +#: src/ServerListCtrl.cpp:431 +msgid "Mark servers as static" +msgstr "Märgi serverid staatilisena" + +#: src/ServerListCtrl.cpp:432 +msgid "Mark servers as non-static" +msgstr "Märgi serverid mittestaatilisena" + +#: src/ServerListCtrl.cpp:438 +msgid "Remove server" +msgstr "Eemalda server" + +#: src/ServerListCtrl.cpp:440 +msgid "Remove servers" +msgstr "Eemalda serverid" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Eemalda kõik serverid" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Kopeeri ED2k link lõikepuhvrisse" + +#: src/ServerListCtrl.cpp:449 +msgid "Copy ED2k links to clipboard" +msgstr "Kopeeri ED2k link lõikepuhvrisse" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Taasühendu serveriga" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Oled kindel et tahad kõik serverid kustutada?" + +#: src/ServerListCtrl.cpp:570 +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Oled kindel et tahad valitud serveri kustutada?" + +#: src/ServerListCtrl.cpp:572 +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Oled kindel et tahad valitud serverid kustutada?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Eemaldatud [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "See on eMulel põhinev aMule %s." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "Jookseb %s peal" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "Külasta http://www.amule.org ja vaata ehk on uuem versioon saadaval." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Fataalne VIGA: Ei suutnud luua stopperit." + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "aMule kaugjuhtimine " + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Piiluvaade:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" +" eMulel põhinev, platvormist sõltumatu, p2p klient \n" +"\n" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr " Web: http://www.amule.org \n" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr " Foorum: http://forum.amule.org \n" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" +" KKK: http://wiki.amule.org \n" +"\n" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr " Kontakt: admin@amule.org (administratiivsed küsimused) \n" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" +" Copyright (C) 2003-2008 aMule Meeskond \n" +"\n" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr " Osa aMule põhineb \n" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "Kademlia: Sõlmest-Sõlmeni ruutimine põhineb XOR meetrikal.\n" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr " Copyright (C) 2002 Petar Maymounkov\n" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr " http://kademlia.scs.cs.nyu.edu\n" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Teade" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Oleku tekst" + +#: src/amuleDlg.cpp:666 +msgid "ED2K: Connecting" +msgstr "ED2K: Ühendun" + +#: src/amuleDlg.cpp:670 +msgid "ED2K: Disconnected" +msgstr "ED2K: Pole ühendust" + +#: src/amuleDlg.cpp:676 +msgid "Kad: Firewalled" +msgstr "Kad: Tulemüüriga" + +#: src/amuleDlg.cpp:680 +msgid "Kad: Connected" +msgstr "Kad: Ühendatud" + +#: src/amuleDlg.cpp:685 +msgid "Kad: Connecting" +msgstr "Kad: Ühendun" + +#: src/amuleDlg.cpp:689 +msgid "Kad: Off" +msgstr "Kad: Väljas" + +#: src/amuleDlg.cpp:718 +msgid "Stop the current connection attempts" +msgstr "Lõpeta käimasolevad ühenduskatsed" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Ühendu lahti" + +#: src/amuleDlg.cpp:722 +msgid "Disconnect from the currently connected networks" +msgstr "Lõpeta ühendus ühendatud võrkudega" + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Ühenda" + +#: src/amuleDlg.cpp:726 +msgid "Connect to the currently enabled networks" +msgstr "Ühendu lubatud võrguga" + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Üles: %.1f(%.1f) | Alla: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Üles: %.1f | Alla: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | Ühendatud)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | Ühenduseta)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Kas sa tõesti tahad aMule'st väljuda?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Kinnitan väljumise" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Ei suuda tuvastada lehitseja käivitamiseks vajalikku käsku." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "Rüüde kataloogi '%s' ei eksiteeri" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "Hoiatus: Ei suuda rüüfaili '%s' lugemiseks avada" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Võrgud" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Võrgud" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Otsingud" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Otsingu aken" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Liiklus" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Failide siirdamise aken" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Jagatud failide Aken" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Teated" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Teadete Aken" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Statistika" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Statistiliste graafikute aken" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Seadete aken" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Impordi" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "Osafailide importimise tööriist" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "Info" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "Info/Appi" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Üldine" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Ühendus" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Proxy" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Teadete Filter" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Kaugjuhtimine" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Online Allkiri" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Kataloogid" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Turvalisus" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "GUI Optimeerimine" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Tuuma Optimiseerimine" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Sündmused" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Veajälitus" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Kasutaja defineeritud" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"Nende muudatuste jõustamiseks pead aMUle taaskäivitama:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- TCP port muudetud.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- UDP port muudetud.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"Serverite automaatse värskendamise loetelu on tühi.\n" +"Ei kasuta 'Serverite automaatne värskendamine käivitamisel'." + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"Lülitasid sisse välised ühendused kuid ei määranud parooli.\n" +"Väliseid ühendusi ei saa enne kehtiva parooli määramist kasutada." + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- Keel on muudetud.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- Ajutiste failide kataloog on muudetud.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Üles: 0.0 | Alla: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"Mõlemad , nii ED2K kui ka Kad võrgud on mitteaktiivsed.\n" +"Sa ei saa ühenduda enne, kui vähemalt üks neist on aktiivne." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"Kad ei saa käivitada kuni UDP port on väljalülitatud.\n" +"Lülita UDP port sisse, või Kad välja." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"Sa PEAD aMule nüüd taaskäivitama.\n" +"Kui sa seda ei tee siis ära tänita kui midagi paha juhtub.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "!!! HOIATUS !!!" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"Serverite automaatse värskendamise loetelu on tühi.\n" +"Palun sisesta vähemalt üks server.met faili asukoha kehtiv URL.\n" +"URL sisestamiseks kliki nupule 'Loetelu'." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "Ajutised failid" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Saabuvad failid" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Online Allkirjad" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Vali %s kataloog" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Näita wav" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "Fail wav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Otsi filmi mängimise programmi" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Vali lehitseja (browser)" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Käivitusprogramm%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Serverite nimekiri" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Lisa siia server.met faili(de) laadimise URL.\n" +"Üks URL rea kohta." + +#: src/PrefsUnifiedDlg.cpp:980 +#, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Värskenduse viide: %d sekundit" +msgstr[1] "Värskenduse viide: %d sekundit" + +#: src/PrefsUnifiedDlg.cpp:987 +#, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Keskmiste graafiku aeg: %d minutit" +msgstr[1] "Keskmiste graafiku aeg: %d minutit" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Ühenduse graafiku skaala: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Värskenduse viide: %d sekundit" +msgstr[1] "Värskenduse viide: %d sekundit" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Failipuhvri suurus: %d baiti" +msgstr[1] "Failipuhvri suurus: %d baiti" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Saatmise Saba suurus: %d klienti" +msgstr[1] "Saatmise Saba suurus: %d klienti" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Serveri ühenduse värskendamise intervall: %d minutit" +msgstr[1] "Serveri ühenduse värskendamise intervall: %d minutit" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Serveri ühenduse värskendamise intervall: Ei kasuta" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Käivita käsk peale %s sündmust" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Luba käskude käivitamine tuumas" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Tuumkäsk:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Luba käskude käivitamine GUI's" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "GUI Käsk:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "Järgnevad muutujad asendatakse:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Autoriseerimata ligipääsukatse. Ühendus suletud." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Välisühendus suleti" + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "Välisühendused on tühja parooli tõttu mitteaktiivsed" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "Välisühendused on konfiguratsioonifailis defineeritud mitteaktiivsena." + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Kinnitati uus väline ühendus" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "VIGA: Ei suutnud uut välist ühendust aksepteerida" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "Välisühendustest keelduti tühja parooli tõttu seadetes!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "Ühendan klienti: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Versioon teadmata" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"Mittekorrektne Välisühenduste versiooni ID, siin võib olla binaarne " +"kokkusobimatus.Kasuta sama versiooni tuuma ja kaugklienti." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" +"Sa ei saa ajutise SVN versiooniga ühenduda reliisi versiooniga!!!! *RRRRRR* " +"hoidsin ära võimaliku crässi" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "Autoriserimine ebaõnnestus" + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Vigane protokolli versioon." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Puudub protokolli versiooni märgis" + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Vigane päring, alustuseks pead ennast autoriseerima." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Ligipääs Lubatud." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "Kaug OsaFaili käsk ebaõnnestus: Faili kontrollsummat ei leidnud: %s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "Faili '%s' kontrollsummat ei leitud" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "OOPS! OpCode töötlemise viga!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Serverit ei lisatud" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "serverit ei leidnud: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "eemaldatav server on vaja määrata" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "ED2K on seadetes väljalülitatud." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "Otsing on käimas. Varsti näed tulemusi!" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "Web Otsing kaugtöökohast ei oma mõtet." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad on seadetes väljalülitatud." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Graafiku jaoks pole punkte." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "Sinu klient pole seadistatud sellise detailsuse astme jaoks." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "Väline ühendus: nõuti seiskamist" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Juba sulgun..." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "Väline ühendus: lisan lingi '%s'." + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Vigane link või on juba loetelus." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "Faili ei leitud." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Vigane failinimi." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Ei suuda faili ringinimetada." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Juba ühendatud ED2K võrku." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Ühendun ED2K..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Juba ühendatud Kad võrku." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Ühendun Kad..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Kõik võrgud on väljalülitatud." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "ED2K ühendus katkestatud." + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Kad ühendus katkestatud." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "Väline ühendus: saabus vigane opcode: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "Vigane opcode (vale protokolli versioon?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "Faili '%s' avamine ebaõnnestus, eemaldan jagatud failide nimekirjast." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "Tundmatu faili '%s' jaoks küsiti kontrollsummat." + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "Käsk `%s' protsessi'id %d' lõpetas staatusega`%d'." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "Serverit ei lisatud: IP aadressi või masinanime pole defineeritud." + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "Serverit ei lisatud: Defineerisid vigase pordi." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "ED2K Olek:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Ühendatud" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Port" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Kademlia Olek:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Töötab" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Olek:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Pole ühendust" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Ühenduse olek:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Tulemüüriga" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "Sobib" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Olek tulemüüriga: " + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Ühendus semuga" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "Semu puudub" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Keskmiselt kasutajaid:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "Keskmiselt faile:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "Ei tööta" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Elus juba: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Liiklus" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Saatmised" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Saadetud andmeid (Seansil (Kokku)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Raisatud Kokku (pakette): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Raisatud faili päringuid (pakette): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "Raisatud allikavahetusi (pakette): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Raisatud Servereid (pakette): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Raisatud Kad (pakette): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Aktiivsed saatmised: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Ootel saatmised: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Kokku õnnestunud saatmisi: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Kokku ebaõnnestunud saatmisi: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Keskmine saatmise aeg: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Tõmbamised" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Tõmmatud Andmed (Seansil (Kokku)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Leitud allikaid: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Aktiivsed tõmbamised (tükid): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Seanss ÜL:AL suhe (Kokku): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Keskmine tõmbamise kiirus (Seansil): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Keskmine saatmise kiirus (Seansil): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Maksimaalne tõmbamise kiirus (Seansil): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Maksimaalne saatmise kiirus (Seansil): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Ühenduse taastumised: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Aeg alates esimesest saatmisest: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Ühendatud serveriga alates: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Aktiivseid ühendusi (hinnang): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Saavutati maksimaalne arv ühendusi: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Keskmiselt ühendusi (hinnang): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Suurim ühenduste arv (hinnang): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Kliendid" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Filtreeritud" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Kokku: %i Tuntuid: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Serverid" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Töötavad serverid: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Ebaõnnestunud serverid: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Kokku: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Kustutatud serverid: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Filtreeritud serverid: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Kasutajaid töötavail servereil: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "Faile töötavail servereil: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Kokku kasutajaid: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "Kokku faile: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Serveri hõivatus: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Jagatud failide arv: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Jagatud failide suurus kokku: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Keskmine faili suurus: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "LowID: %u (%.2f%% Kokku %.2f%% Tuntuid)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "SecIdent sees/väljas: %u (%.2f%%) : %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Operatsioonisüsteem" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "Pole vastu võetud" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Lõika" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Kopeeri" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Aseta" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Vali kõik" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "Kad otsing pole võimalik kui Kad ei tööta" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "ED2K otsing pole võimalik kui ED2K ei tööta" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Ootamatu viga proovides Kad otsingut: " + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "'%s' (IP:%s) teade filtreeriti" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "'%s' (IP:%s) saatis uue teate" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" +"Kasutaja %s (%u) küsis sinu jagatud kataloogide nimekirja -> Kinnitasid" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "Kasutaja %s (%u) küsis sinu jagatud kataloogide nimekirja -> Keeldusid" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" +"Kasutaja %s (%u) küsis sinu jagatud kataloogide nimekirja -> Kinnitasid" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "Kasutaja %s (%u) küsis sinu jagatud kataloogide nimekirja -> Keeldusid" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"Kasutaja %s (%u) küsis sinu jagatudfailde loetelu kataloogile %s -> " +"Kinnitasid" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"Kasutaja %s (%u) küsis sinu jagatudfailde loetelu kataloogile %s -> keeldusid" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "Kasutaja %s (%u) jagab kataloogi %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "Kasutaja %s (%u) saatis soovimatu jagatud kataloogide nimekirja." + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "Kasutaja %s (%u) saatis kataloogi %s jagatud failide nimekirja" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "Kasutaja %s (%u) lõpetas jagatud failide nimekirja saatmise" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "Kasutaja %s (%u) saatis soovimatu jagatud failide nimekirja" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" +"Kasutaja %s (%u) keelas ligipääsu jagatud kataloogide/failide nimekirjale" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Sõlmed (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "Bootstrapil vigane IP" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Bootstrapil vigane port" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Palun täida kõik nõutud väljad" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Oled kindel et tahad tõmmata uut nodes.dat faili?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" +"Nii tehes eemaldad oma olemasolevad sõlmed ja taaskäivitad Kademlia ühenduse." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Kas jätkata?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Viga: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Hoiatus: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Lisa Sõber" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Pead sisestama kehtiva IP ja pordi!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Informatsioon" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "Määratud kasutaja kontrollsumma pole kehtiv!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Allikaid" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Fail" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Tõmba" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Kategooria" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Peamine" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Tõmba kataloogi" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "Otsi seotud faile (ED2k, kohalik server)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "Märgi fail tuntuks" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Ühendu eemalasuva amuulaga" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Ühendus ebaõnnestus " + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Viga" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"HOIATUS: Sa ei saa lisada ennast allikana ed2k linki, omades ise sealjuures " +"lowid." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Kasutajaid: E:%s K:%s | Faile E:%s K:%s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Kõik" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Kokku Kasutajaid: %s | Kokku Faile: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Siiratud" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Valmis" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Kiirus" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Edenemine" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Olek" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Lõpetamiseni" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Viimati nähtud terviklikuna" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Viimane vastuvõtt" + +#: src/DownloadListCtrl.cpp:578 +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Oled kindel et tahad valitud faili kustutada?" + +#: src/DownloadListCtrl.cpp:580 +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Oled kindel et tahad valitud failid kustutada?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Saada kasutajale teade" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Saadetav teade:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Seis" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Paus" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Taasta" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "Va&lmis" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Tõsta (A4AF) allikad selle faili külge" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Tõsta automaatselt kõik (A4AF) allikad selle faili külge" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Tõsta (A4AF) allikad teiste failide külge" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Laiendatud valikud" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Eelvaade" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Näita &detaile" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Näita kõiki kommentaare" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Kopeeri magnet URI lõikepuhvrisse" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "määramata" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Määra kategooria" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "Ava Fail" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Eemalda sõpradest" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Lisa sõprade nimistusse" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Saada teade" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Tõsta selle faili külge" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%H:%M:%S %d/%m/%y" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "JK: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Küsitud teist faili" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Tõmbamised (%i)" + +#: src/DownloadListCtrl.cpp:2222 +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"Palun määra seadetes oma eelistatud videopleier.\n" +"Senikaua proovib aMule kasutada mpalyer'it ja sa saad selle hoiatuse igal " +"eelvaatuse katsel" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Faili eelvaade" + +#: src/DownloadListCtrl.cpp:2260 +#, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "VIGA: Ei suutnud käivitada välist meediamängijat! Käsk: `%s'" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "VIGA: Ei suutnud avada osafaili)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "VIGA: Ei suutnud luua osafaili!" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "Proovin laadida met-faili tagavarakoopiat aadressilt %s" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "VIGA: Ei suuda avada part.met faili: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "VIGA: part.met faili suurus on 0 : %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "VIGA: Vigane versioon failist part.met : %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "VIGA: %s (%s) on vigane (vale märgiseloendur), ei suuda faili laadida." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "Proovin taastada faili infot..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "Taastan nimetu faili - proovin ta taastada nimega RecoveredFile.dat" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "Taastatud kogu olemasolev failiinfo :D - Proovin nüüd kasutada..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Ei suuda faili infot taastada :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Ei suuda avada: %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "HOIATUS: %s võib olla riknenud (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "VIGA salvestades osafaili: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "Ei suuda tõmmata '%s' pikkust - kasutan %s faili." + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "'%s' on millegipärast 0 suurusega - kasutan %s faili." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "Ei saanud salvestada faili part.met.seeds %s jaoks!" + +#: src/PartFile.cpp:1019 +#, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "Salvestatud %i allikat osafailile: %s (%s)" +msgstr[1] "Salvestatud %i allikat osafailile: %s (%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "Osafail %s (%s) ei oma toitefaili" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "Osafailil %s (%s) on kehtetu toitefail" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "VIGA osafaili toitefaili lugemisel (%s - %s): %s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"Leidsin riknenud osa (%d) %d osast fail '%s' - Arvutatud Kontrollsumma |%s| " +"Saadetud Kontrollsumma |%s|" +msgstr[1] "" +"Leidsin riknenud osa (%d) %d osast fail '%s' - Arvutatud Kontrollsumma |%s| " +"Saadetud Kontrollsumma |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "Leitud lõpetatud osa (%i) %s" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "'%s' faili kontrollsumma arvutamine lõpetatud" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "Ootamatu failiviga %s lõpetamise ajal. Fail pausitud" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Faili '%s' tõmbamine lõpetatud" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "Kustutan faili: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "HOIATUS: Ei suuda luua hash'i - hashset mittetäielik '%s'" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"VIGA: ei suuda tõmmatud osale arvutada kontrollsummat- kontrollsumma on " +"mittetäielik(%s). Seda ei tohiks kunagi juhtuda." + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "HOIATUS: Pole piisavalt vaba kettaruumi! Pausin faili: %s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "Tõmmatud osa %i on failis %s vigane" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH: Taastatud riknenud osa %i %s jaoks -> Päästsin: %s baiti" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Kettaruumi ei jätku" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Peatatud" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "HOIATUS: known.met ei saa avada." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" +"HOIATUS: Tuttavate failde loetelu on riknenud, sisaldades riknenud päist." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "IO viga known.met faili lugemisel: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "VIGA: tekkis known.met faili salvestamisel: %s" + +#: src/SharedFileList.cpp:352 +#, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "Leitud %i tuntud ja jagatud faili" +msgstr[1] "Leitud %i tuntud ja jagatud faili." + +#: src/SharedFileList.cpp:358 +#, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "Leitud %i tuntud ja jagatud faili, %i tundmatut" +msgstr[1] "Leitud %i tuntud ja jagatud faili, %i tundmatut." + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "VIGA! Proovisid jagada %s" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Faili kommentaarid" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Hinnang" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Kommentaar" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Kommentaarid puuduvad" + +#: src/CommentDialogLst.cpp:104 +#, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%u kommentaar" +msgstr[1] "%u kommentaar(i)" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"Kõigi näidatud hämatud serveritega ühenduse loomine ebaõnnestus. Lähen uuele " +"katsele, seekord ilma hämamiseta." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "Serveritega ühenduse loomine ebaõnnestus. Lähen uuele katsele." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "ED2K on seadetes väljalülitatud, ei ühendu" + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "Serverite nimekirjas pole ühtegi ühendumiseks sobivat serverit!" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Ühendus %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Ühendus loodud: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "Fataalne viga ühendumisel. Kontrolli ühendust." + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Kaotasin ühenduse %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) on vist surnud." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) on vist täis." + +#: src/ServerConnect.cpp:391 +#, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "Proovin %d sekundi pärast serveriga uuesti automaatselt ühenduda." +msgstr[1] "Proovin %d sekundi pärast uuesti serveriga automaatselt ühenduda." + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Ühendus kadunud." + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "Ühendumine %s (%s:%i) ebaõnnestus." + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "VIGA: Vigane socket aegumise kontrollil" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "Katse serveriga %s (%s:%i) ühenduda aegus." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" +"VIGA: Ei suutnud laadida tagavarafaili. Vaata aadressilt http://forum.amule." +"org, kas leiad juhiseid .part faili taastamiseks" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Part(osalisi) faile ei leidnud!" + +#: src/DownloadQueue.cpp:175 +#, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "Leidsin %u osalist faili" +msgstr[1] "Leidsin %u part(osalist) faili." + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Tõmban '%s'" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Sa juba proovid faili '%s' tõmmata" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Fail '%s' on juba olemas" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Sa juba proovid '%s' faili tõmmata" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "Ei suuda muuta magnet linki ed2k lingiks: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "Lingi %s protokoll on tundmatu" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Vigane ed2k link! Viga: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "Käivita ja välju." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Vigane IP formaat. Kasuta xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" +"See käsk vajab muutujat. Sobivad muutujad on: 'all', failinimi või number.\n" + +#: src/TextClient.cpp:343 +msgid "Processing by hash: " +msgstr "Töötlen räsi järgi: " + +#: src/TextClient.cpp:358 +msgid "Processing by filename: " +msgstr "Töötlen failinime järgi: " + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "See käsk vajab argumenti. Sobivad argumendid on: faili räasi.\n" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Pole korrektne number\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "Pole kehtiv kontrollsumma (pikkus peab olema täpselt 32 märki)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "Operatsioon oli edukas." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "Päring ebaõnnestus järgneval põhjusel: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "Klientide IP-Filter on %s.\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "Väljas" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "Sees" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "Serverite IP-Filter on %s.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "Kehtiv IPFilter Tase on %d.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Ribalaiuse piirangud: ÜLes :%u kB/s, Alla: %u kB/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Ühendatud %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "koos LowID" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "koos HighID" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Ühendun" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Pole ühendatud" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Tõmbamine:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Saatmine:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Kliente järjekorras:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Kokku allikaid:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Otsingu tulemusi: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "TODO - näita otsingu edenemist" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Serverilt saabus tundmatu vastus, OpCode = %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Näitab lühikest oleku ja statistika infot." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "Näita ühenduse olekut, kehtivat saatmise/tõmbamise kiirust jne.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Näitab täieliku statistika puud." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"Sellele käsule võib argumendiks lisada numbri vahemikus 0 kuni 255, mis " +"näitab\n" +"mitu klienditarkvara erinevat versiooni statistika puu harudes näidata. " +"Omistades\n" +"väärtuseks 0, tähendab see 'piiramatult'.\n" +"\n" +"Näiteks: 'statistics 5' näitab ainult 5 enamesinenud versiooni iga kliendi " +"tüübi kohta.\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "Seiska aMule" + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Eemaloleva (amule/amuled) tuuma seiskamine.\n" +"Samas seiskab see ka tekstikliendi, sest see on kasutu ilma töötava " +"tuumata.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Taaslaeb määratud objekti." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "Taaslaeb jagatud failide loetelu." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "Lae IP Filter failist uuesti." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Ühendu võrguga" + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"Ühendab kõigi seadetes määratud võrkudega.\n" +"Võid lisaks määrata serveri aadressi moel IP:Port, et ühenduda ainult selle\n" +"serveriga. IP peab olema IPv4 vastav aadress või DNS lahenduv nimi." + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Ühendu ainult ED2K võrku." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Ühendu ainult Kad võrku." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Lõpeta ühendus võrguga." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "Lõpetad ühenduse kõigi, hetkel ühenduses olevate võrkudega.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Lõpeta ühendus ainult ED2K võrguga." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Lõpeta ühendus ainult Kad võrguga." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Lisab tuumale ed2k või magnet lingi." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"Lisatav ed2k link saab olla:\n" +"*) link failile (ed2k://|file|...), lisatakse tõmbamise järjekorda,\n" +"*) link serverile (ed2k://|server|...), lisatakse serverite loetellu,\n" +"*) või link serverite loetelule, sellisel juhul lisatakse kõik loetelus " +"olevad\n" +" serverid serverite nimekirja.\n" +"Magnet link peab sisaldama ed2k räsi ja faili pikkuse infot.\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Määra seade väärtus." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "Määra IPFiltri seaded." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "Lülita serverite ja klientide IP filtreerimine sisse." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "Lülita serverite ja klientide IP filtreerimine välja." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "Rakenda/ära rakenda klientide IP Filtreerimist." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "Lülita klientide IP-filtreerimine sisse." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "Lülita klientide IP-filtreerimine välja." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "Rakenda/ära rakenda serverite IP Filtreerimist." + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "Lülita serverite IP-filtreerimine sisse." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "Lülita serverite IP-filtreerimine välja." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "Vali IP Filtreerimise tase." + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"Võimalikud filtreerimise tasemed on vahemikus 0 kuni 255, vaikeväärtus on " +"127.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Määra ribalaiuse piirang." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "" +"Väärtus, mis nendele käskudele antakse, peab olema kilobaiti/sekundis.\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Määra saatmise ribalaiuse piirang." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "Määra tõmbamise ribalaiuse piirang." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Hangi ja näita atribuudi väärtus." + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "Hangi IPFiltri seaded." + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "Hangi IPFiltri olek nii klientide kui ka serverite kohta." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "Hangi IPFiltri olek ainult klientide kohta." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "Hangi IPFiltri olek ainult serverite kohta." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "Kehtiv IPFilteri Tase." + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Kehtiv Ribalaiuse piirang" + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Teostab otsingu." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"ASelletüübilise otsingu jaoks peab määrama otsingu tüübi:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Näide: 'search kad fail' otsib \"fail\" kad võrgust.\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Käivitab globaalse otsingu." + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Käivitab lokaalse otsingu." + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Käivitab otsingu kad võrgust." + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Näitab viimase otsingu tulemusi." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Tagastab eelmise otsingu tulemuse.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "Näitab otsingu edenemist." + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "Näitab otsingu edenemist.\n" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Alusta faili tõmbamist" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"Pead andma eelmise/viimase otsingu faili numbri.\n" +"Näiteks 'download 12' alustab eelmise otsingu 12'nda faili tõmbamist.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Peata tõmbamine." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Jätka tõmbamist." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Katkesta tõmbamine." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Määra tõmbamise prioriteet." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "Määra tõmbamise prioriteet Low, Normal, High või Auto.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "Määra madal prioriteet." + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "Määra normaalne prioriteet." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "Määra kõrge prioriteet." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "Määra automaatne prioriteet." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Näita järjekorda/nimekirja." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Näitab saatmise/tõmbamise järjekorda, serveri jagatud failide loetelu.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Näita saatmise saba." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Näita tõmbamise järjekorda." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Näita logi." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Näita serverite nimekirja." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Tühjenda logi." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "Vananenud käsk, nüüd on '%s'." + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" +"See on vananenud/aegunud käsk ja võidakse tulevikus eemaldada.\n" +"Selle asemel kasuta '%s'.\n" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() tagastas NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "VIGA: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "HOIATUS: %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Uus kliendi ID %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "HOIATUS: Said omale Low-ID!" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "\tTõenäolisem põhjus on sinu asumine tulemüüri või ruuteri 'taga'." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tTäpsemat informatsiooni leiad http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "Saabus tundmatu serveriinfo! - liiga lühike" + +#: src/ServerSocket.cpp:539 +#, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "Sain %d uut serverit" +msgstr[1] "Sain %d uut serveri nime" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Serverite loetelu salvestamine lõpetatud." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "Server lükkas viimase korralduse tagasi" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Tüngapakett saabus serverist: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "Defineerimatu viga serverist %s saabunud paketi töötlemisel" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "Ei suuda luua DNS lõime serveriga %s ühendumiseks" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "Server IP %s (%s) on filtris. Ei ühenda." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "kasutan protokolli hämamist" + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "Ühendun %s (%s - %s:%i) %s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "Ei suuda masina %s dns nime lahendada: Ei saa ühenduda!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "CIP2Country::CIP2Country(): Riigi info laadimine ebaõnnestus " + +#: src/IP2Country.cpp:73 +#, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "Laetud %d riigilipu pilti." +msgstr[1] "Laetud %d riigilipu pilti." + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"Oled kindel et tahad katkestada ja kustutada kõik selle kategooria failid?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Ootan kinnitust" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "kõik teised" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Poolik" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Aktiivne" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Film" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Muusika" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Arhiiv" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "CD-Image" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Pildid" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Tekst" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Vali vaate filter" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Lisa kategooria" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Muuda kategooria" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Eemalda kategooria" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "Impordin %s: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "Loen ajutist kataloogi" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "Hangin põhiinformatsiooni tõmmatavast infofailist" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "Loon sihtkohafaili" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "Laen vanast tõmbamisefailist andmeid (%u %u-st)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "Salvestan andmeblokki uude, üksikusse tõmbamisefaili (%u %u-st)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "Hanging allika tõmmatavate failide informatsiooni" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "Lisan tõmbamise ja salvestan osafili" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Hangin staatus(t)..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "Edenemine" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "VIGA: Kettaruum otsas" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "VIGA: Osamet faili ei leitud." + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "VIGA: IO viga" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "VIGA: Ebaõnnestus!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "Järjekorras" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Juba tõmbad" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Tundmatu või paha tempfaili formaat." + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Faili nimi" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Olek" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Faili kontrollsumma" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Imporditud osafailid" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"Palun vali ajutiste tõmbamiste otsingu kataloog (alamkataloogid kuuluvad ka " +"siia)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "Kas soovid õnnestunult imporditud tõmmatud failide allikad kustutada?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Eemaldan allikaid?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Ootan..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (Ketas: %s)" + +#: src/OtherFunctions.cpp:121 +msgid "byte" +msgid_plural "bytes" +msgstr[0] "baiti" +msgstr[1] "baiti" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "baiti/sek" +msgstr[1] "baiti/sek" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "sek" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "min" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "tundi" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "päev(a)" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Filmid" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Archiwum" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Tekst" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programmid" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Suvaline" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Pole hinnatud" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Vigane / Vigastatud / Pole õige" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Halb" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Hea" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Keskpärane" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Väga hea" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "kõik" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "kõik teised" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "Laen IP-filtrid 'ipfilter.dat' ja 'ipfilter_static.dat'." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" +"Ebaõnnestus ipfilter.dat faili '%s' laadimine, arusaamatu formaat sattus " +"ette." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "Ebaõnnestus ipfilter.dat faili '%s' laadimine, ei suuda faili avada." + +#: src/IPFilter.cpp:330 +#, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "Laetud %u IP-piirkond failist '%s'." +msgstr[1] "Laetud %u IP-piirkonda failist '%s'." + +#: src/IPFilter.cpp:332 +#, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "ignoreeritud %u vigane rida." +msgstr[1] "ignoreeritud %u vigast rida." + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Aktiivseid ühendusi (l:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Faili detailid" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% tehtud" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "ED2K Link: " + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Jõusta" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "Klikka siia, et lisada ed2k link tekstiväljalt tõmbamise järjekorda." + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "Hüpikakna oleku tekst" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Laadimine..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"Siin näidatakse sündmusi. Kogu sündmuste loetelu on logis Serverid lehel." + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Kasutajate arv serveris, kuhu sinagi oled ühendunud ..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Kasutajad: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "Kasutajaid serveriga ühenduses ja arvatav kasutajate koguarv." + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"Hetkel kehtivad keskmised saatmise ja tõmbamise kiirused. Valituna näitavad " +"numbrid sulgudes kliendikommunikatsiooni raisatud pakette." + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"Näitab ühenduse olekut ja käimasolevaid siirdamisi. Punane nool näitab, et " +"sa pole hetkel üheduses, kollane nool näitab, et sul on LowID (või oled " +"ühenduses läbi tulemüüri) ja roheline nool näitab et omad HighID " +"(Optimaalseim) ühenduse tüüp." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Pole ühendust ..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Sa oled serveriga ühenduses." + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Otsing" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Nimi:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Kohalik" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Üleüldine" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "Faili kontrollsumma" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Laiendatud parameetreid" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Filtreerimine" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Faili tüüp" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Laiend" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Vähim Suurus" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Baiti" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Suurim Suurus" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Saadavus" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Filter:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Filtreerimise tulemused" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Tulemus peeglisse" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Vaata faile" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Rohkem" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "Rohkemate ED2k tulemuste otsimine. Pole veel Kad poolt toetatud." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Seiska" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Lähtesta väljad" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Tulemused" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Puhastab lõpetatud tõmbamised" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Näita saatmisi/saba" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Kliente sabas :" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Saada" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Saada määratud teade." + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Sulge" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Sulge see vestlus-seanss." + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Täis nimi :" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "N/A" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "met-Fail :" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Kontrollsumma :" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Faili suurus :" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Osafaili staatus :" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Viimati nähtud tervikuna :" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Leitud allikaid :" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Saatvaid allikaid :" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Failiosi :" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Saadaval :" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Andmekiirus :" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Aktiivne Tõmbamine: " + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Siiratud :" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Valmis suurus :" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Intelligentne riknemise vältimine" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Riknemise tõttu kaotatud :" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Võidetud tänu kokkusurumisele :" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "I.C.H. päästetud paketid :" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Failide nimed" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Võta Üle" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Puhasta" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Jõusta" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Ok" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "Kommenteeri/Hinda faili (Tekst on nähtav kõigile)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"Filmi puhul saad öelda tema pikkuse, tema süzee, keele ....\n" +"ja kui see on võltsing siis saad sellest teisi aMule kasutajaid hoiatada." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Faili kavliteet" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "Määra faili hinnang või hoiata kasutajaid juhul kui fail on vigane ..." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Kommentaarid puuduvad" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Värskenda" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Tõmban, palun oota ..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Suurus teadmata" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Vajalik informatsioon" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "IP Aadress :" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Port :" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Lisainformatsioon" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Kasutajanimi :" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Kasutaja kontrollsumma :" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Lae oma jagatud failid uuesti" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Käimasolev seanss" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Kokku" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Küsitud :" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Aktiivsed saatmised :" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Tõmbamise kiirus" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Hetkel" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Hetke keskmine" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Seansi keskmine" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Saatmise kiirus" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Ühendused" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Aktiivsed tõmbamised" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Aktiivseid ühendusi (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Aktiivsed saatmised" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Statistika Puu" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Kasutajanimi:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Kasutaja kontrollsumma:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Klienditarkvara:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Kliendiversioon:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "IP aadress:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "Kasutaja ID:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "Serveri IP:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Serveri nimi:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "Liiklus kliendile" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Praegune päring:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Keskmine saatmise suhe:" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Keskmine tõmbamise suhe:" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Saadetud (selles seansis):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Tõmmatud (selles seansis):" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Saadetud (kokku):" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Tõmmatud (kokku):" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Skoorid" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "AL/ÜL kordaja:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Turvaline ident:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Reiting (kokku):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Saba skoor:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Üldised seaded" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Nimi" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - Linuxi Muul" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "See on see nimi mida teised näevad kui sinuga ühenduvad." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Keel" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "See määrab kasutatava keele." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Muud valikud" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Kontrolli käivitumisel uue versiooni olemasolu" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "Valituna kontrollib aMule käivitumisel värskema versiooni olemasolu" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Käivita vähendatult" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "Valituna minimeerib aMule ennast peale käivitumist." + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Kinnita väljumine" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "Sunnib aMule väljumiseks kinnitust küsima." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Luba Riba(tray) ikoon" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "Siin saad lubada/keelata süsteemiriba (või tegumiriba) ikooni." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "Vähenda Ribale ikooniks" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" +"Valituna vähendab aMule ennast pigem Süsteemiribale, kui tööriistaribale." + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Abitekstide viide sekundites" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "Abitekstide kuvamise ajaline viide." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Lehitseja valik" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Vali siin oma lehitseja" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Isemääratud lehitseja:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Sisesta siia oma lemmiklehitseja asukoht. Isemääratud leemiklehitseja " +"kasutamiseks vali Custom allolevast rippmenüüst." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Võimalusel ava uus sakk" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "Ava, kui võimalik, webileht uuel lehel selle asemel et avada uus aken" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Ribalaiuse piirid" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Saatmised" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Sloti määramine" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Liini võimalused" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" +"Märkus: Neid väärtusi kasutatakse\n" +"ainult statistikas." + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Standard kliendi TCP Port:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "See on ED2K standard port ja seda ei saa välja lülitada." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Laiendatud kliendi UDP Port:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" +"Seda UDP porti kasutatkse laiendatud omadustega ED2K ja Kad võrgu puhul" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "ära kasuta" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Seo aadress" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "UDP port serveri laiendatud päringute jaoks (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Maksimaalseid allikaid Faili kohta" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Maksimaalselt" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Ühenduse piirangud" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Max ühendusi" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Universaalne Plug and Play" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "Luba UPnP kasutamine" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "UPnp TCP Port:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Automaatne ühendumine käivitumisel" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "ühenduse kadumisel taasta ühendus" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Näita raisatud ribalaiust" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Serveri valikud" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Eemalda surnud server peale" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "katset" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Serverinimekirja automaatne uuendamine käivitumisel" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Loetelu" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Serverinimekirja värskendamine serveriga ühendumisel" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Serverinimekirja värskendamine kliendiga ühendumisel" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Kasuta prioriteedisüsteemi" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Ühendumisel kasuta nutikat LowID kontrolli " + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Ohutu ühendumine" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "" +"Automaatne ühendumine ainult staatilises serverinimekirjas olevate " +"serveritega" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Määra käsitsi lisatud serveritel Kõrge Prioriteet" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "Aktiveeri I.C.H." + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICH usaldab suvalist kontrollsummat (pole soovitatav valik)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Lisa failid tõmbamiseks pausitud olekus" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Lisa failid tõmbamiseks automaatse prioriteediga" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Proovi alustuseks tõmmata esimene ja viimane tükk" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Lisa uued jagatud failid automaatse prioriteediga" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Proovi saatmisel siirata täielikud tükid" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Alusta järgmise Pausitud failiga kui fail lõpetab" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "Samast kategooriast" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "Salvesta haruldaste failide 10 allikat (< 20 allikat)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Kettaruum" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Kontrolli kettaruumi" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "Vali see kui soovid et aMule sinu kettaruumi kontrolliks" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Min Kettaruum:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Sisesta siia vähim soovitud kettaruum" + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Tõmmatud failide kataloog :" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Ajutiste failide kataloog :" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Jagatud Kataloogid" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "(Rekursiivseks jagamiseks tee paremklikk kataloogi ikoonil)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Jaga peidetud failid" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Video mängija" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Loo eeelvaateks koopia" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Graafikud" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Värskenduste vahe : 5 sekundit" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Keskmine graafiku aeg: 100 minutit" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Ühenduse graafiku skaala: 100" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Vali statistika värvid" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Taust" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Alusvõrk" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Allalaadimine, jooksev" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Allalaadimine, jooksev keskmine" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Allalaadimine, seansi keskmine" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Saatmine hetkel" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Hetke saatmise keskmine" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Seansi keskmine saatmine" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Aktiivseid ühendusi" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Süsteemiriba Kiirvaliku Ikoon" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Kad-sõlmi hetkel" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Kad-sõlmi jooksvalt" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Kad-sõlmi seansis" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Vali" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Kuvatavate Kliendi Versioonide arv (0=piiramatu)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Hoiatused" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Teated" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Kasuta heli" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Karga esile kui :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Uus logikirje" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Alustab uue vestlusseansi" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Saabus uus vestluse teade" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Lõpetasid või lisasid tõmbamise" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Hoi, leidsin uuema aMule versiooni" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "Edasilükkamatu OOD, serveriühendus kadus" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Informeeri Maili teel" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Saada saatmise/vastuvõtmise lõppemisel email." + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "SMTP Server :" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "Email aadress :" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! HOIATUS !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Ära muuda neid seadeid, kui sa ei tea mida sa teed,\n" +"vastasel juhul võid omale kergesti probleeme tekitada\n" +"ja olukord võib väljuda kontrolli alt.\n" +"\n" +"aMule toimib ilusasti ilma siinolevaid seadeid muutmata\n" +"You Are WARNED!!." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Muud seadistused" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Maksimaalne arv uusi ühendusi / 5 sek." + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Faili puhvri suurus: 240000 baiti" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Saatmise saba suurus: 5000 klienti" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Serveriühenduse värskenadamise intervall: Ei kasuta" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "GUI Optimeerimine" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Järjekorra edenemine" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Näita protsendiliselt" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Näita edenemise riba" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Edenemise riba stiil" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Lame" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Ümar" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Rüüde tugi" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Võimalda rüüde tugi" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Rüü:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- rüüd pole saadaval -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Tulpade sorteerimine" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "Sorteeri automaatselt tõmbamise järjekorras olevad failid (high CPU)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "aMule sorteerib tulbad tõmbamise sabas automaatselt" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Muud GUI seaded" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Näita kiiret ED2K lingi käsitlejat" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Näita kategooria juures laiendatud infot" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Näita tiitelribal siirdamise kiirusi" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Vertikaalne tööriistariba paigutus" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Näita osafaili numbrit enne failinime" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Kaugjuhtimine" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "WEBserveri parameetrid" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Käivita amuleweb (WEBserver) koos aMulega" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "WEBserveri port" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "Luba UPnP pordisuunamist Webserveri portide suunamiseks" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Webserveri UPnP TCP port" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Lehekülje värskendusaeg (sekundites)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Luba Gzip pakkimine" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Luba madalate õigustega kasutaja" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Täisõiguste parool" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Madalate õiguste parool" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "WEB näidis/mall" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Välisühenduse parameetrid" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Aksepteeri väliseid ühendusi" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"Kuulava liidese IP aadress \n" +"(suvalise aadressi jaoks jäta tühjaks)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Sisesta siia välisühenduse liidese kehtiv ip aadress a.b.c.d formaadis. Tühi " +"väli või 0.0.0.0 tähendab suvalist liidest." + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "TCP port" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "Luba UPnP pordisuunamist EC pordile" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "Seadetes tehtud muudatuste jõustamiseks klikka siia." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Tühista kõik seadetes tehtud muudatused." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Tiitel :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Kommentaar :" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Tõmmatud failide kataloog :" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Muuda uute failide prioriteeti :" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Ära muuda" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Vali praegu valitud kategooriale värv :" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Näita ühendumisel serveri motd ..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Serveri info" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Klikates seda nuppu tühjendad logi." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "aMule Logi" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "Sellele nupule klikates värskendad serverite loetelu URL ilt ..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Serverite nimekiri" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Sisesta siia server.met faili asukoha URL ja pressi vasakul olevat nuppu " +"tuntud serverite nimekirja värskendamiseks." + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Serveri käsitsi lisamine : Nimi" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Sisesta siia uue serveri nimi" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Sisesta siia serveri IP aadrdess, kasutades x.x.x.x formaati." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Sisesta siia serveri port." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "Täites esiteks vasakul olevad väljad, lisa server käsitsi ..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "ED2K Info" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Kad Info" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"Tundub et valitud keelelokaat pole sinu karpi installeritud.\n" +"Pead selle looma, et saaksid kasutada seda keelt.\n" +"Hea koht alustamiseks on fail /etc/locale.gen ja pakk 'locales'\n" +"Edu!\n" +"(Märkus: Ma proovin seda seada sellest hoolimata)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Ära seda enam näita" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "Klikates sellele nupule värskendad sõlmede loetelu URL'ilt ..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Sõlmed (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"Sisesta siia nodes.dat faili url ja pressi vasakul olevat nuppu, et tuntud " +"sõlmede loetelu täiendada." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Sõlmede statistika" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Bootstrap" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Uus sõlm" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Port:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Tuntud klientide \n" +"Bootstrap" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Lõpeta Kad ühendus" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Protokolli Hämamine" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Protokolli Hämamine lubatud" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"See valik lülitab Protokolli Hämamise sisse ja sunnib aMule aksepteerima " +"ainult teiste klientide hämatud ühendusi." + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Kasuta väljuvatel ühendustel hämamist" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"See valik sunnib aMule kasutama teiste serverite/klientidega ühendumisel " +"Protokolli Hämamist." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Aksepteeri ainult hämatud ühendusi" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"See valik sunnib aMule aksepteerima ainult hämatud ühendusi. Sul on vähem " +"allikaid aga kogu liiklus on hämatud." + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Faili valikud" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Igaüks" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Mitte keegi" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Kes näeb jagatud faile:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "Vali, kes võib vaatamiseks küsida sinu jagatud falide nimekira." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "IP-Filtreerimine" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Filtreeri kliente" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Rakenda klientide IP filtreerimine failis ~/.aMule/ipfilter.dat defineeritud " +"aadressidele." + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Filtreeri servereid" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Rakenda serverite IP filtreerimine failis ~/.aMule/ipfilter.dat defineeritud " +"aadressidele." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Lae loetelu uuesti" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "Taaslae filtreeritavad IP aadressid failist ~/.aMule/ipfilter.dat" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Värskenda" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Käivitamisel värskenda automaatselt ipfiltrit" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Filtreerimise tase:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Filtreeri alati LAN IP aadresse" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Mitteklappivate IP aadresside paranoiline käitlemine" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Viskab paketi minema kui kliendi IP erineb paketi saatja IP aadressist. " +"Kasuta ettevaatlikult." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "Kasuta süsteemi ipfilter.dat kui see on saadaval" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" +"Kui kohalik ipfilter.dat fail puudub, kasuta süsteemi globaalset ipfilter " +"faili." + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "Kasuta Turvalist Kasutaja tuvastamist" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" +"On soovitatav see omadus lubada. Sa ei saa krediiti kui SUI on välja " +"lülitatud." + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Kasuta/Ära kasuta" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Luba Online-Allkiri" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Võimaldab kirjutada OS faile, mida saavad kasutada välised rakendused kasvõi " +"allkirja loomiseks." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Värskenduse sagedus (Sek):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "Muuda Online Allkirja värskendamise (sekundites) sagedust." + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Online Allkirja asukoha kataloog:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "Siin saad valida kataloogi kus asub sinu Online Allkirja fail." + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Ära kasuta/Kasuta" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "Filtreeri saabuvaid teateid (va. käimasolev vestlus):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Filtreerimise valikud:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Filtreeri kõiki teateid" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Filtreeri sinu sõbralistiväliste kodanike teateid" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Filtreeri tundmatute klientide teateid" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Filtreeri teateid, mis sisaldavad (loetelus kasuta eraldajana koma):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"lisa siia sõnad mille amule peab väljafiltreerima ja bloki teated mis seda " +"sisaldavad" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Kommentaarid" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "Filtreeri teateid, mis sisaldavad (loetelus kasuta eraldajana koma):" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Lülita Proxy sisse" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Kasuta/ärakasuta proxy tuge" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Proxy tüüp:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "Selle proxy tüüp kuhu sa ühendud" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Proxy nimi:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "Selle proxy serveri/hosti nimi " + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Proxy port:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "Selle proxy port" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Autoriseerimine" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Nõua autoriseerimist" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Autoriseerimisel Kasuta/Ära kasuta kasutajanime/parooli" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "Proxy ühenduseks vajalik kasutajanimi" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Parool:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "Proxy kasutamiseks vajalik parool" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Automaatne serveriga ühendumine ilma proxyt kasutamata" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Ühendu :" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Logi sisse eemalasuvasse amuula" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Kasutaja nimi" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Pea need seaded meeles" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Võimalda inimkeelne Veajälitus-Logimine" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "Saadetav teade:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "Lisa imporditavad" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Proovi valitutega uuesti" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Eemalda valitud" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Sündmuse tüübid" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Ühendu suvalise serveri ja/või Kad võrguga" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Uus Kategooria" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Vali sissetulevate failide kataloog" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Sa pead kategooria jaoks nime defineerima!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Sa pead kategooria jaoks asukoha defineerima!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"Ei suutnud luua kategooria sisendkataloogi. Palun defineeri kehtiv asukoht!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "Tundmatu laiend '%s' käsule '%s'.\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "Tundmatu käsk '%s'.\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"See käsk ei saa omada parameetrit.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"Sellel käsul peavad olema parameetrid.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Käsk on lõpetamata, pead kasutama üht laienditest allpool.\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Saadaval laiendid:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Võiamlikud käsud:\n" + +#: src/ExternalConnector.cpp:188 +#, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"Kõik käsud on tõstutundetud.\n" +"Tipi '%s ' et saada kohta rohkem infot.\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Lahkub rakendusest." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Näita Abimeest." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"Käsu kohta abi saamiseks tipi 'help '.\n" +"Käskude täieliku loetelu saamiseks tipi 'help'.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"Käsuloendi saamiseks kasuta '%s'\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Süntaksi viga!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Viga käsu töötlemisel - sede ei tohiks mitte kunagi juhtuda!! Palun " +"informeeri sellest\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Sellel käsul ei tohiks olla ühtegi parameetrit." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Sellel käsul peab olema parameeter." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Vigane muutuja." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "See on poolik/lõpetamata käsk." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Rohkema info saamiseks tipi '%s'.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "See on %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "See on %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Loon klienti ....\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "Ühendus ebaõnnestus. Ei suuda määratud masinaga ühenduda\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"Ok, lahkun %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"Ei suuda tühja parooliga ühenduda.\n" +"Pead määrama parooli kas konfiguratsioonifailis või\n" +"käsureal või selle küsimise korral sisestama.\n" +"\n" +"Lahkun...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Näita seda abiteksti." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "Masin milles aMule töötab. (vaikimisi: localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "aMule välisühenduse port. (vaikimisi: 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Välisühenduse parool." + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Loen konfiguratsiooni failist." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "Ära trüki midagi standardväljudisse." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Ole jutukas - näita ka veajälituse infot." + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Määrab programmi keele." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "Kirjuta käsurea valikud konfiguratsioonifaili." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "Loob konfiguratsioonifaili alusel aMule konfigratsioonifaili." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Näita programmi versiooni." + +#: src/ClientCreditsList.cpp:168 +#, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "Fail 'creditfile' loetud, tuvastati %u klienti" +msgstr[1] "Fail 'creditfile' loetud, tuvastati %u klienti" + +#: src/ClientCreditsList.cpp:171 +#, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] " - %u Kliendi Krediit aegunud!" +msgstr[1] " - %u Kliendi Krediit aegunud!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "Ei leidnud 'cryptkey.dat' faili, loon uue." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"VIGA: aMule deemonit ei saa kasutada kui Välisühendused on katkestatud. " +"Välisühenduste lubamiseks kasuta tavalist aMule, käivita amuled võtmega '--" +"ec-config' või määra võtme \"AcceptExternalConnections\" väärtuseks 1 " +"konfiguratsioonifailis ~/.aMule/amule.conf" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "VIGA: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Lõpeta blokeering" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Näita Saatmisi" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Näita Järjekorda" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Näita Kliente" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Vali Vaade" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Kliendi Tarkvara" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Oodanud" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Saadetud" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Saatmine/Tõmbamine" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Staatus eemalt" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "JK: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Prioriteet" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Skoor" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Küsitud" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Viimati nähtud" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Võetud järjekorda" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Saatmise olek" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Saadetud" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Tõmbamise olek" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Tõmmatud" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Kasutaja kontrollsumma" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Krüpteeritud" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Peida jagatud failid" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Kliendi detailid" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Pole toetatud" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Pole täielik" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Paha Poiss" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Kontrollitud - OK" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Info Puudub" + +#: src/ClientDetailDialog.cpp:190 +#, c-format +msgid "%u (QR: %u)" +msgstr "%u (JK: %u)" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "Min suurus peab olema väiksem kui max suurus. Ignoreerin Max suurust." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Otsingu hoiatus" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Piiramatu" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "aMule Riba Menüü" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Kiiruse piirangud:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "ÜL: puudub" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "ÜL: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "AL: pole" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "AL: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Tõmbamise kiirus: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Saatmise kiirus: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Kliendi informatsioon" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Hüüdnimi: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "Hüüdnime pole valitud!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "KliendiID: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Serveri nimi: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "ServeriIP: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "TCP Port %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "TCP Port: Pole valmis" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "UDP Port %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "UDP Port: Pole valmis" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Online Allkiri: Lubatud" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Online Allkiri: Keelatud" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Jagatud failid: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Kliente sabas: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "Kokku AL: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "Kokku ÜL: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Saatmise limiit" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Tõmbamise limiit" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "Peida aMule" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "Näita aMule" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "VestlusSeanss Alustatud: %s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Ühenduses Kliendiga ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** Ühendun Kliendiga ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Kliendiga ühendumine ebaõnnestus / Ühendus kadunud ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Sulge leht" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Sulge kõik lehed" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Sulge teised lehed" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "Laen server.met faili: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "Server.met faili ei leitud." + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" +"server.met faili '%s' laadimine ebaõnnestus, arusaamatu formaat sattus ette." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "Ei saanud avada server.met faili!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"Server.met fail on riknenud, leidsin vigase versiooni sildi: 0x%x, suurus %i" + +#: src/ServerList.cpp:168 +#, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "Failis server.met on %i serverit" +msgstr[1] "Failis server.met on %i serverit" + +#: src/ServerList.cpp:170 +#, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d server lisatud" +msgstr[1] "%d server(it) lisatud" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Serverit ei lisatud: [%s:%d] ei määra kehtivat porti." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "Serverit ei lisatud: [%s:%d] IP aadress on filtris või vigane." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "Serverit ei lisatud: Sama server IP:Port [%s:%d] on juba loetelus." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Lisati server: Server [%s:%d] kasutab nime *%s*." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"Sa oled serveriga, mida soovid kustutada, ühenduses. Palun katkesta ühendus. " +"Serverit ei kustutatud." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Ei saanud salvestada server.met faili!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "Vigane URL" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "Serverite nimekirja tõmbamine aadressilt %s lõpetatud" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Serverite nimekirja tõmbamine aadressilt %s ebaõnnestus" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"Failist 'addresses.dat' ei leitud serverite loetelu aadressi. Palun kopeeri " +"kehtiv serverite loetelu aadress sellesse faili, muidu ei saa serverite " +"loetelu automaatselt uuendada" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "Tõmba serverite nimekiri aadressilt %s" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "Hoiatus: serverite nimekirja automaatse värskendamise URL %s on vigane" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" +"addresses.dat failis pole kehtivat server.met faili automaatse tõmbamise " +"URL'i" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"Kohalik server on IPFiltri poolt väljafiltreeritud, ühendud teise serveriga!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "Käsu '%s' käivitamine '%s' sündmuse puhul ebaõnnestus" + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"Sinu keelelokaat muudeti süsteemi vaikeväärtuseks seoses konfiguratsiooni " +"muudatustega. Sorry." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"Serverite nimekirjas pole ühtegi serverit.\n" +"Kas aMule võiks uue nimekirja tõmmata?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Serverite nimekiri tõmmatud" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "webserver töötab, pid %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"Soovisid et käivitamisel starditaks ka webserver, kuid amuleweb binaarkoodi " +"ei saa käivitada. Palun installeeri pakk mis sisaldab aMule web serverit või " +"kompileeri aMule kasutades võtit --enable-webserver ja peale seda käivita " +"'make install'" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "Ei suuda siduda porti määratud aadressiga: %s" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "Port %u ei ole kasutatav. Sa saad LOWID\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"Port %u ei ole kasutatav. !!\n" +"\n" +"Sa saad kasutada kui LOWID kasutaja.\n" +"Kasuta netstat programmi kontrollimaks kuna port vabaneb\n" +"ja proovi amule uuesti käivitada." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Ei suutnud luua OnlineSig Faili" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "Ei suutnud luua aMule OnlineSig Faili" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"Tundub et valitud keelelokaat pole sinu karpi installeritud. (Märkus: Ma " +"proovin seda seada sellest hoolimata)" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "See on aMule %s käivitamise esimene kord" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "See on testversioon, mida igapäevaselt uuendatakse ja\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "" +"me ei anna mingit garantiid, et see ei lõhu midagi, ei süüta sinu elamist\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" +"ega tapa sinu koera. Sellest hoolimata peaks see olema *turvaline* " +"kasutada.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" +"Selles versioonis on turvalisusest johtuvalt muudetud järgmisi seadeid:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* Lisatud on Protokolli Hämamise tugi sisenevatele ja väljuvatele " +"ühendustele.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* Eemaldatud on serverite nimekirja värskendmine teistest serveritest ja " +"klientidest.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"See muudatuse põhjustest leiad lisainfot aMule wiki'st, otsides \n" +"aadressilt http://wiki.amule.org märksõna \"fake servers\" järgi\n" +"On oluline et aMule ei kasutaks võltsservereid, vastasel juhul ei pruugi\n" +"aMule korralikult toimida." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Rohkem informatsiooni, tuge ja uusi programmi versioone leiad meie " +"kodulehelt,\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" +"aadressil www.aMule.org või meie IRC kanalis #aMule aadressil irc.freenode." +"net.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "" +"Tunne ennast vabalt suvaliste vigade leidmisest teavitamisel aadressil " +"http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"Online Allkirja kataloog on VIGANE!\n" +" Online Allkirja ei kasutata, kuni parandad vea seadetes." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "VIGA: Ei suutnud avada logifaili" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "HOIATUS: logifail on tühi, miskit on kapitaalselt viltu." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Log on nullitud" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "Serveri teade: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Ebaõnnestus sõlmede nimekirja tõmbamine." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Ebaõnnestus tõmmatud versiooni kotrollfaili avamine" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Versiooni kontrollfail on korrumpeerunud" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Kasutad aegunud aMule versiooni!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "Sinu aMule versioon on %i.%i.%i ja uusim versioon on %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "Uuema aMule versiooni saad alati aadressilt http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "HOAITUS: Sinu aMuled versioon on vananenud: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "Sinu aMule koopia on ajakohane." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Versiooni kontrollfaili tõmbamine ebaõnnestus" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Ühendatud %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Ühendun %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "ED2K ühendus katkestatud" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad käivitatud." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad peatatud." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Ühendus Kad võrk (ok)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Ühendus Kad võrku (tulemüüriga)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Ühendus Kad võrguga katkestatud" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"Kad võrku ei saa kasutada kui seadetes on UDP port väljalülitatud, ei ühendu." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Kad on seadetes väljalülitatud, ei ühenda." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "Sõbralisti faili 'emfriends.met' lugemiseks avamine ebaõnnestus!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "Sõbralisti faili 'emfriends.met' kirjutamiseks avamine ebaõnnestus!" + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "Sa ei saa bootsarappida määratud IP'd eemalolevast GUI'st." + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "" +#~ "Sa ei saa uuendada server.met faili eemalolevast graafilisest töökohast." + +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "Loetud %u Kad kontakti" +#~ msgstr[1] "Loetud %u Kad kontakti" diff --git a/po/eu.po b/po/eu.po new file mode 100644 index 00000000..d8d5cbe5 --- /dev/null +++ b/po/eu.po @@ -0,0 +1,7576 @@ +# translation of amule-eu.po to Euskara +# translation of source_strings-04-08-2005.po to +# Copyright (C) 2005-2006, 2007Free Software Foundation, Inc. +# This file is distributed under the same license as the PACKAGE package. +# +# Piarres Beobide , 2005, 2007. +msgid "" +msgstr "" +"Project-Id-Version: amule-eu\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2007-04-30 13:13+0200\n" +"Last-Translator: Piarres Beobide \n" +"Language-Team: Euskara \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" +"X-Poedit-Language: Basque\n" +"X-Poedit-SourceCharset: utf-8\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Pasahitz ez zuri bat ezarri behar duzu." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Pasahitz baliogabea, ez da MD5 egiaztapena!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Konexio hutsa" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "EC Konexioa huts egin du. Erantzun hutsa." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "KanpoKon: Sarrera honegatik ukatua: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "KanpoKon: Sarrera ukaturik" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "KanpoKon: Zerbitzariaren okerreko erantzuna. Konexioa itxirik." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Lortua! Amulera konexioa sortua " + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Lortua! Konexioa sortua." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Aztertzen" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Osotzen" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Amaitua" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Geraturik" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Akatsduna" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Deskargatzen" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Zain" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Fitxategiarentzat AICH eta MD4 egiaztapenak sortzen: %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Fitxategiarentzat MD4 egiaztapena sortzen: %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Fitxategiarentzat AICH egiaztapena sortzen: %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "'%s'-ko AICH egiaztapen zaharra 64b-ekoa bihurtzen '%s'-en." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" +"Oharra: '%s' fitxategi izena baliogabea da eta'%s' bezala berrizendatuko da." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "" +"Oharra: '%s' fitxategia badago dagoeneko eta'%s' bezala berrizendatuko da." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "KONTUZ: Ezin da jatorrizko '%s' ezabatu basbeskopia sortu ondoren" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "KONTUZ: Huts %s ezabatzerakoan" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Huts '%s' erabiltzailearen partekatutako fitxategiak jasotzerakoan" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Ezezaguna" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (Gezurrezko eMule bertsioa %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (Gezurrezko eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (Gezurrezko eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (eMule v0.%u-tan oinarriturik)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Ezizena: %s ID-a: %u" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "Eskaerak:" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Fitxategi estatistikak saio honentzat. Onarturik %d - %d eskakizunetik, %s " +"transferiturik\n" +msgstr[1] "" +"Fitxategi estatistikak saio honentzat. Onarturik %d - %d eskakizunetik, %s " +"transferiturik\n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Fitxategi estatistikak saio guztientzat. Onarturik %d %d eskakizunetik, %s " +"transferiturik\n" +msgstr[1] "" +"Fitxategi estatistikak saio guztientzat. Onarturik %d %d eskakizunetik, %s " +"transferiturik\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Fitxategi ezezaguna eskaturik" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "%s bezeroa %s:%d IP:Atakan %s %s %s erabiliaz" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Erabiltzaile izena" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Lagunak" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Erakutsi &Xehetasunak" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Laguna gehitu" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Ezabatu laguna" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Bidali &Mezua" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Ikusi Fitxategiak" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Ezarri lagunen ataka" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Ziur zaude hautatako laguna(k) ezabatu nahi d(it)uzula?" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Ziur zaude hautatako laguna(k) ezabatu nahi d(it)uzula?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Utzi" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"Ez duzu lagun-ataka bat baino gehiago ezartzeko baimenik.\n" +" Ataka bat bakarrik dago sinaturik." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Aukera anitza" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Fitxategi izena" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Tamaina" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Mota" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Lehentasuna" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "FitxategiID" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Eskaerak" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Onartutako eskaerak" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Transferitutako Datuak" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Partekatze Erlazioa" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Eskuratutako zatiak" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Jatorri Osoak" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Karpeta Bidea" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Partekatutako Fitxategiak" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Oso txikia" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Baxua" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normala" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Altua" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Oso Altua" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Bertsioa" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Auto" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Iruzkina/Kalifikazioa gehitu" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Iruzkina/Kalifikazioa editatu" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Izena aldatu" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Kopiatu ED2k &lotura arbelera" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Kopiatu ED2k lotura arbelara (&Jatorria)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Kopi&atu" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Kopiatu laburpena arbelara" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "ID altua behar duzu baliozko jatorri lotura bat sortzeko" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Oharra" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Partekatutako fitxategiak (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[ZatiFitxategia]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Sar izen berri bat fitxategi honentzat:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Fitxategia berrizendatu" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Fitxategiaren igoerak berriarazten: %s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Fitxategiaren igoerak gelditzen: %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: bilaketa gako laburregia" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Errorea: Ezin dira TCP atakak entzun." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "Eskakizunak errore honez huts egin du: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "Eskakizunak errore ezezagun batez huts egin du." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "Ez da index fitxategia aurkitu: " + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Ezin da Web socket haria sortu\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "WebZerbitzaria: Abiarazirik\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Saioa Iraungirik - saio hasiera eskatzen\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Saioa ondo, saioa hasirik\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Saioa ondo, saioa hasi gabe\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Ez dago saio irekirik - saio hasiera eskatuko da\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Saioa sorturik - saio hasiera eskatzen\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Eskakizuna prozesatzen [jatorrizkoa]: " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Pasahitza egiaztatzen\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Pasahitz egiaztapen baliogabea\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Pasahitza ondo\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Pasahitza oker\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Saio amaiera eskakizuna\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Eskakizuna prozesatzen [berbidalia]: " + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr " txantiloia kargatzen du" + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Web zerbitzari HTTP ataka" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "UPnP ataka berbideraketa erabili web zerbitzari atakan" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "UPnP ataka" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Erabili gzip konpresioa" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Web zerbitzariaren baimen guztiko pasahitza" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Web zerbitzariaren gonbidatu pasahitza" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Gaitu gonbidatu sarrera" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Gonbidatu sarrera ezgaitu" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "" +"Kargatu/gorde web zerbitzari ezarpenak urruneko aMule zerbitzaritik/" +"zerbitzarira" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "aMule konfigurazio fitxategi bidea. EZ ERABILI ZUZENEAN!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "PHP interpretea ezgaitu (zaharkiturik)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "PHP orrialdeak eskakizun bakoitzean birkonpilatu" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "aMule Web-a Zerbitzaria" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Ez dago erabilgarri" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Inoiz ere ez" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Deskargatzen..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Hobespenak" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "amulesig.dat fitxategia duen karpeta" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Arakatu" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Idatzi zure amulesig.dat fitxategia dagoen karpeta izena" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Berritze aldia segundotan" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Sortu estatistika irudi bat berritze bakoitzean" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "Idatzi hemen estatistika irudiak sortzea nahi duzun karpeta" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Igo aldiro zure estatistika irudia FTP zerbitzarira" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "FTP Url-a" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "FTP Bidea" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Sar hemen zure FTP zerbitzariaren helbidea" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" +"Idatzi hemen estatistika irudiak FTP zerbitzarian gordeko diren karpeta" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Erabiltzaile" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Pasahitza" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Idatzi hemen zure FTP zerbitzarian sartzeko erabiltzaile izena" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Idatzi hemen zure FTP zerbitzarian sartzeko pasahitza" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "FTP igoera aldia minututan" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Egiaztatu" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Zure sinadura fitxategia duen karpeta" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Estatistika irudiak sortuko diren karpeta" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i egun %i ordu %i min %i s" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, amule Estatistika" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Ongietorria!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Deskarga abiadura handiena wxCas abiarazirik dagoenetik" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "Guztizko gehienezko deskarga abiadura wxCas aurreko abiarazteetan" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Garbitu" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "Sistema" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Auto Berritzea Gelditu" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Gorde estatistikak irudiak" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Inprimatu estatistika irudia" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Hobespen ezarpenak" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "WxCas-ri buruz" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Auto Berritzea Abiarazi" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Auto Berritzea Geraturik" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Auto Berritzea abiarazirik" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Gorde estatistika Irudia" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Ez dago mota honetarako kudeatzailerik." + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "Fitxategia ez da gorde" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "aMule Estatistikak" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Arazo bat dago Inprimatzerakoan.\n" +"Agian zure inprimagailua ez dago behar bezala ezarririk?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Inprimatzen" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pedro de Oliveiraren CAS-en oinarriturik \n" +"\n" +"GPL lizentziapean banaturik" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Oh Oh, aMule ez dago abiarazirik..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule abiarazirik dago" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule abiarazirik dago, baina deskonektaturik" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule konektatzen ari da..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Oh Oh, aMule egoera ezezaguna da..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " noiz abiarazirik " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " gelditurik dago !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " ez dago konektaturik !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " konektatzen..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " zerbait arraroa egiten ari da, araka ezazu!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " hona konektaturik dago: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "ondo" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "suebakirik" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "deskonektaturik" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " hona konektaturik " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +#, fuzzy +msgid " with " +msgstr "] - " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Deskargak Guztira: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Igoerak: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Saio Deskargak: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Deskargak: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s, Igoerak: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Partekatuak: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " fitxategi. Bezeroak hilaran: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Denbora: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " - " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Sistema Karga Mediak (1-5-15 min): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Sistema noiztik abiarazirik: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uE %02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "IDAltua" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "IDBaxua" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Konektatu gabe" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "Ezeztaturik !" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Ezin da %s ireki" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "%s fitxategia edonkey-rentzat handiegia da, onarpen muga 4Gb da." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Sarrera parametroak" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Egiaztatzeko Fitxategia" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Gehitu Aukerako URL gehiago fitxategi honentzat" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Sar hemen ed2k lotura konputatu nahi duzun fitxategia" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Sar Ed2k loturara gehitu nahi duzun URL-a: Gehitu / bukaeran aLinkCreator-ri " +"uneko fitxategi izena gehitzeko" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Gehitu" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Ezabatu" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Garbitu" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Zati egiaztapenekin lotura bat sortu" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Fitxategi berri eta arraroak zabaltzen laguntzen du, lotura tamaina " +"handitzearen kostuarekin" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "MD4 Fitxategi Egiaztapena" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "Ed2k Fitxategi egiaztapena" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "Ed2k lotura" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Hasi" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Gorde" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Arbelara kopiatu" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Irten" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "ed2k lotura konputatzeko fitxategi bat ireki" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Konputaturiko ed2k lotura arbelara kopiatu" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Konputaturiko ed2k lotura fitxategi batetan gorde" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "ALinkCreator-ri buruz" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Ed2k lotura konputatu nahi duzun fitxategia aukeratu" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "Kopiatzeko ezer ez oraingoz!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Ed2k lotura konputatzeko fitxategia aukeratu" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Ezin da ireki " + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Mesedez idatzi fitxategi izen bat" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "Gordetzeko ezer ez oraingoz!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, aMule ed2k lotura sortzailea\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"GPL lizentziapean banaturik" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Aztertzen..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "%.2f seg-etan egina" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "URL dagoeneko gehiturik duzu !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Mesedez idatzi zurian ez dagoen URL bat" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "%u zenbakidun fitxategia prozesatzen: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "" +"Zati egiaztapenak eskatu dituzu (9.5 MB baino fitxategi txikiagoekin " +"bakarrik)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Itxoin mesedez... " + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> Fitxategia ez dago !\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, aMule ed2k lotura sortzailea" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Auto [Bax]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Auto [Nor]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Auto[Alt]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Konektatzen" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Eskatzen" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Konektatu zerbitzaria bidez" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Ilara Osoa" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "Ilaran" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Bidaltzen" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Aztertze ezarpenak jasotzen" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Ez du behar den zatirik" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Ezin da IDBaxua-IDBaxua konektatu" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Konexio gehiegi" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Kad bidez Konektatzen " + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Kad konexio gehiegi" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Ukatuak" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Konexioa Errorea" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Urruneko Hilara Betea" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "MLDonkey Zaharra" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "MLDonkey Berria" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "eMule Bateragarria" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Zerbitzari Lokala" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Urruneko Zerbitzaria" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Jatorri Trukaketa" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Pasibo" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Esteka" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Jatorri haziak" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Sistema lehenetsia" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Arabiera" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Euskara" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Bulgariera" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Katalana" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Txinatarra (Sinplea)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Txinatarra (ohizkoa)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Kroaziarra" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Daniera" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Alemaniarra" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Ingelesa (E.B.)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Estoniera" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Finlandiera" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Frantsesa" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Galiziera" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Alemaniera" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Hungariera" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Italiera" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Italiera (Suizarra)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Koreera" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Poloniera" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portugesa" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Portugesa (Brasildarra)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Errusiera" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Esloveniera" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Gaztelera" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Ezin da ezarritako nabigatzailea jakin!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "TCP ataka ezin da 65532 baino altuagoa izan UDP socket-a TCP+3 bait da" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Lehenetsiriko ataka erabiliko da (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Zerbitzaria Izena" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Helbidea" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Ataka" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Azalpena" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Erabi." + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Fitxategiak" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Huts egin du" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Estatikoa" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Bertsioa" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Ezabatu naian zauden zerbitzarira konektaturik zaude. Mesedez deskonektatu " +"zaitez aurretik. Zerbitzaria EZ da ezabatuko" + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Argb" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(Izen Ezezaguna)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Ziur al zaude %s zerbitzari tinkoa ezabatu nahi duzula?" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Bai" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Ez" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Huts '%s' irekitzerakoan" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Zerbitzariak (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Zerbitzaria" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Zerbitzarira konektatu " + +#: src/ServerListCtrl.cpp:428 +#, fuzzy +msgid "Mark server as static" +msgstr "Zerbitzaria(k) estatiko bezala markatu" + +#: src/ServerListCtrl.cpp:429 +#, fuzzy +msgid "Mark server as non-static" +msgstr "Zerbitzaria(k) ez-estatiko bezala markatu" + +#: src/ServerListCtrl.cpp:431 +#, fuzzy +msgid "Mark servers as static" +msgstr "Zerbitzaria(k) estatiko bezala markatu" + +#: src/ServerListCtrl.cpp:432 +#, fuzzy +msgid "Mark servers as non-static" +msgstr "Zerbitzaria(k) ez-estatiko bezala markatu" + +#: src/ServerListCtrl.cpp:438 +#, fuzzy +msgid "Remove server" +msgstr "Ezabatu zerbitzaria(k)" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "Ezabatu zerbitzaria(k)" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Kendu zerbitzari guztiak" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Kopiatu ED2k lotura arbelera" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "Kopiatu ED2k lotura arbelera" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Zerbitzarira birkonektatu" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Ziur zaude zerbitzari guztiak ezabatu nahi dituzula?" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Ziur zaude aukeratutako zerbitzaria(k) ezabatu nahi d(it)uzula?" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Ziur zaude aukeratutako zerbitzaria(k) ezabatu nahi d(it)uzula?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Ezgaitua [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "Hau eMulen oinarrituriko aMule %s da." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "%s-n abiarazirik" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" +"Bisitatu http://www.amule.org gunea bertsio berriagorik eskuragarri dagoen " +"jakiteko." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Errore konponezina. Akats ordutegia sortzerakoan" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "aMule urruneko kontrola" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Argazkia:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr "" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr "" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Mezua" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Egoera testua" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "Konektatzen" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "Deskonektatuta" + +#: src/amuleDlg.cpp:676 +#, fuzzy +msgid "Kad: Firewalled" +msgstr "Suebakirik" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "Konektaturik" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "Konektatzen" + +#: src/amuleDlg.cpp:689 +#, fuzzy +msgid "Kad: Off" +msgstr " Kad: " + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "Geratu uneko konexio saiakerak" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Deskonektatu" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "Saretik deskonektatu." + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Konektatu" + +#: src/amuleDlg.cpp:726 +#, fuzzy +msgid "Connect to the currently enabled networks" +msgstr "Sarera konektatu." + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Gora: %.1f(%.1f) | Behera: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Gora: %.1f | Behera: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | Konektaturik)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | Ez konektaturik)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Benetan aMule itxi egin nahi duzu?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Irteera berrespena" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Ezin dut nabigatzailea irekitzeko komandoa asmatu." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Sareak" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Sare Leihoa" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Bilaketak" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Bilaketa leihoa" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Transferentziak" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Fitxategi Transferentzia leihoa" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Partekatutako fitxategi leihoa" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Mezuak" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Mezu leihoa" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Estatistikak" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Estatistika grafiko leihoa" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Hobespen Ezarpen Leihoa" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Inportatu" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "Zati fitxategi inportazio tresna" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "Honi Buruz" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "Honi Buruz/Laguntza" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Orokorra" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Konexioa" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Proxy-a" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Mezu Iragazkia" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Urruneko Kontrolak" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Sinadura Linean" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Direktorioak" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Segurtasuna" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "Interfaze Aldagaiak" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Oinarri Aldagaiak" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Gertaerak" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Arazpena" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Erabiltzaileak ezarririk" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"aMule berrabiarazi egin behar da aldaketa hauek gaitu ahal izateko:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- TCP ataka aldaturik.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- UDP - ataka aldaturik.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"Zure zerbitzari auto-eguneraketa zerrenda hutsik dago.\n" +"'Abiaraztean zerbitzari zerrenda auto-eguneraketa' ezgaituko da" + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"Kanpo konexioak gaiturik dituzu baina ez duzu pasahitzik ezarri.\n" +"Kanpo konexiorik ezin da onartu baliozko pasahitza ezarri arte." + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- Hizkuntza aldaturik.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- Aldiroko karpeta aldaturik.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Gora: 0.0 | Behera: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"Bai ED2K bai Kad sareak ezgaiturik daude,\n" +"Ez zara konektatzeko gai izango behintzat bietako bat gaitu arte." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"Kad ezin da abaiarazi zure UDP ataka ezgaiturik badago.\n" +"UDP ataka gaitu edo Kad ezgaitu." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"aMule orain berrabiarazi BEHAR duzu.\n" +"Orain ez berrabiaraziaz gero ez kexatu ezer txarra gertatzen bada.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "OHARRA" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"Zure auto-eguneraketa zerbitzari zerrenda zurian dago.\n" +"Mesedez bete behintzat baliozko server.met fitxategi batetara zuzenduaz.\n" +"Klikatu \"zerrenda\" botoia URL-a sartzeko." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "Aldi baterako fitxategiak" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Sarrera fitxategiak" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Linean Sinadurak" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Aukeratu karpeta bat %s-rentzat" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Arakatu wav" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "wav fitxategia (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Arakatu bideo erreproduktorea" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Hautatu" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Abiarazgarria%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Editatu zerbitzari zerrenda" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Gehitu hemen server.met deskargatzeko URL-a.\n" +"URL helbide bat lerro bakoitzean." + +#: src/PrefsUnifiedDlg.cpp:980 +#, fuzzy, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Eguneratze maiztasuna: %d seg" +msgstr[1] "Eguneratze maiztasuna: %d seg" + +#: src/PrefsUnifiedDlg.cpp:987 +#, fuzzy, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Batez besteko grafiko denbora: %d min" +msgstr[1] "Batez besteko grafiko denbora: %d min" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Konexio Grafiko Eskala: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, fuzzy, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Eguneratze atzerapena : %d seg" +msgstr[1] "Eguneratze atzerapena : %d seg" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, fuzzy, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Fitxategi buffer Tamaina: %d byte" +msgstr[1] "Fitxategi buffer Tamaina: %d byte" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, fuzzy, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Igoera Ilara Tamaina: %d bezero" +msgstr[1] "Igoera Ilara Tamaina: %d bezero" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, fuzzy, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Zerbitzari konexio berritze maiztasuna: %d minutu" +msgstr[1] "Zerbitzari konexio berritze maiztasuna: %d minutu" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Zerbitzarira konexio berritze maiztasuna: Ezgaiturik" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Komandoa`%s' gertaeran exekutatu" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Gaitu komando exekuzioa muinean " + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Muin Komandoa:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Gaitu komando exekuzioa urruneko interfazean" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "Urruneko interfaze komandoa:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "Hurrengo aldagiak aldatuko dira:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Baimendu gabeko sarrera saiakera. Konexioa itxirik." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Kanpo konexioa ukaturik." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "Pasahitz zuria dela eta kanpo konexioak ezgaiturik!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "Kanpo konexioak ezgaiturik konfigurazio fitxategian" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Kanpo konexio berri bat onartu da" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "Errorea: ezin da kanpo konexio berririk onartu" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "Hobespenetan pasahitza zurian dela eta kanpo konexioak ukaturik!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "Bezerora konektatzen: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Bertsio ezezaguna" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"Okerreko bertsio ID-a, bitar baterezintasuna dago. Erabili urruneko eta " +"nagusi bertsio berdina." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "Egiaztapenak huts egin du." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Protokolo bertsio baliogabea." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Protokolo bertsio marka falta da." + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Eskakizun baliogabea, lehenik identifikatu egin behar zara." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Sarrera onartua." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" +"Urruneko ZatiFitxategi komandoak huts egin du: Ez da %s fitxategi " +"egiaztapena aurkitu" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "Ez da %s fitxategi egiaztapena aurkitu" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "OOPS! OpCode prozesu errorea!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Zerbitzaria ez da gehitu" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "ez da zerbitzaria aurkitu: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "ezabatzeko zerbitzaria ezarri behar da" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "ED2K hobespenetan ezgaiturik dago." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "Bilaketa bidean. Emaitzak emango une batetan!" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "Urruneko interfazeko Web bilaketak ez du zentzurik." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad ezgaiturik dago hobespenetan." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Ez dago punturik grafikoarentzat." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "Zure bezeroa ez dago xehetasun maila honetarako konfiguraturik." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "KanpoKonexioa: itzaltzeko eskaera eginik" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Dagoeneko irteten." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "" + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Lotura baliogabea edo zerrendan dagoeneko." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "Fitxategia ez da aurkitu." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Fitxategi izen baliogabea." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Ezinda fitxategia berrizendatu." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Dagoeneko ED2K-ra konektaturik." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "ED2K-ra konektatzen..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Dagoeneko Kad-era konektaturik." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Kad-era konektatzen..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Sare guztiak ezgaiturik daude." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "ED2k-tik deskonektaturik." + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Kad-etik deskonektaturik." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "KanpoKonexioa: opcode baliogabea jasoa: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "Opcode baliogabea (okerreko protokolo bertsioa?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" +"Huts fitxategia irekitzean (%s), partekatutako fitxategi zerrendatik kentzen" + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "Egiaztapena eskaturik fitxategi ezezagunarentzat: %s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "`%s' komandoa (`%d' pid-a duena) `%d' egoera kodeaz amaitu da." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "Zerbitzaria ez da gehitu: ez da IP edo ostalari izenik ezarri." + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "Zerbitzaria ez da gehitu: Baliogabeko zerbitzari-ataka ezarririk." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "ED2k Egoera:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Konektaturik" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP Ataka" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Kademlia Egoera:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Martxan" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Egoera:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Deskonektatuta" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Konexio Egoera:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Suebakirik" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "Ados" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Suebaki egoera:" + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Lagunera Konektaturik" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "Laguna Ez" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Batazbesteko Erabi.:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "Batazbesteko Fitxategiak:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "Geldirik" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Abiarazia: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Transferentzia" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Igoerak" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Igotako Datuak (Saioa (Guztira)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Guztira Buruak (Paketeak): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Fitxategi Eskakizun Buruak (Paketeak): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "Jatorri Aldaketa Buruak (Paketeak): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Zerbitzari Buruak (Paketeak): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Kad Buruak (Paketeak): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Igoera Aktiboak: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Igoerak Zain: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Guztira behar bezala igotako saioak: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Guztira oker igotako saioak: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Batez besteko igoera denbora: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Deskargak" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Deskargaturiko Datuak (Saioa (Guztira)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Aurkituriko Iturburuak: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Deskarga Aktiboak (zatiak): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Saio IG/DE Abiadura (Guztira): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Batez besteko deskarga (Saioa): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Batez besteko igoera (Saioa): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Gehienezko deskarga abiadura (Saioa): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Gehienezko igoera abiadura (Saioa): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Berkonexioak: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Denbora lehen transferentziatik: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Zerbitzaria noiztik konektatua: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Konexio Aktiboak (estimazioa): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Gehienezko Konexio Mugara iritxi: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Batez besteko Konexioak (ebaluazioa): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Puntako konexioak (estimazioa): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Bezeroak" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Iragazirik" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Guztira: %i Ezagunak: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Zerbitzariak" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Zerbitzariak Martxan: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Huts egindako Zerbitzariak: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Guztira: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Ezabatutako Zerbitzariak: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Iragaziriko Zerbitzariak: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Erabiltzaileak - Zerbitzariak Martxan: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "Fitxategiak - Zerbitzariak Martxan: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Guztira Erabiltzaileak: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "Guztira Fitxategiak: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Zerbitzari lan karga %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Partekatutako Fitxategi kopurua: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Guztira Partekatutako Fitxategi tamaina: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Batez besteko fitxategi tamaina: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "IDBaxua: %u (%.2f%% Guztira %.2f%% Ezagun)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "Identitate ziurra gaitu/ezgaiturik: %u (%.2f%%) : %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Sistema Eragilea" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "Ez Jasoa" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Ebaki" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Kopiatu" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Itsatsi" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Hautatu dena" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "Ezin da Kad bilaketarik egin Kad ez badago abiarazirik " + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "Ezin da ED2K bilaketarik egin ED2K ez badago konektaturik" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Espero gabeko errorea Kad bilaketa egitean: " + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "'%s'-ren mezu bat iragazi da (IP:%s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "'%s'-ren mezu berria (IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" +"%s (%u) erabiltzaileak zure partekatutako fitxategi zerrenda eskatu du -> " +"Onartua" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" +"%s (%u) erabiltzaileak zure partekatutako fitxategi zerrenda eskatu du -> " +"Ukatua" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" +"%s (%u) erabiltzaileak zure partekatutako direktorioen zerrenda eskatu du -> " +"Onarturik" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" +"%s (%u) erabiltzaileak zure partekatutako direktorioen zerrenda eskatu du -> " +"Ukaturik" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"%s (%u) erabiltzaileak %s direktorioaren partekatutako fitxategi zerrenda " +"eskatu du -> Onarturik" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"%s (%u) erabiltzaileak %s direktorioaren partekatutako fitxategi zerrenda " +"eskatu du -> Ukatua" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "%s (%u) erabiltzailearen %s partekatutako direktorioa" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "" +"%s (%u) erabiltzailea eskatugabeko partekatutako direktorioak bidali ditu." + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" +"%s (%u) erabiltzaileak %s direktorioko partekatutako fitxategi zerrenda " +"bidali du" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "" +"%s (%u) erabiltzaileak partekatutako fitxategi zerrenda bidaltzeaz bukatu du" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "" +"%s (%u) erabiltzaileak eskatu gabeko partekatutako fitxategi zerrenda bidali " +"du" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" +"%s (%u) erabiltzaileak fitxategi/direktorio partekatuen zerrenda ikustea " +"ukatu du" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Nodoak (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "Abiarazteko ip baliogabea" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Abiarazteko ataka baliogabea" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Beharrezko eremu guztiak bete" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Ziur zaude nodes.dat fitxategi berri bat deskargatu nahi duzula?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" +"Hau eginez zure nodo zerrenda ezabatu eta Kademlia konexioa berrabiaraziko " +"da." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Jarraitu?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Errorea:" + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Oharra:" + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Laguna gehitu" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Baliozko IP helbide eta ataka sartu behar dituzu!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Argibideak" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "Emandako erabiltzaile egiaztapena ez da baliozkoa!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Jatorriak" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Fitxategia" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Deskargatu" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Kategoria" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Nagusia" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Kategori honetan deskargatu: " + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "Zerikusia duten fitxategiak bilatu (ED2k, zerbitzari lokala)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Urruneko amulera konektatu" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Konexioak huts egin du" + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Errorea" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Erabiltzaileak: E: %s K: %s | Fitxategiak E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Guztiak" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Guztira Erab: %s | Guztira Fitxategiak: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Transferituta" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Amaitua" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Abiadura" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Egoera" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Egoera" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Denbora Faltan" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Azkenez Osoa Ikusirik" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Azkenez jasoa" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Ziur zaude aukeratutako fitxategia(k) ezabatu nahi d(it)uzula?" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Ziur zaude aukeratutako fitxategia(k) ezabatu nahi d(it)uzula?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Bidali mezua erabiltzaileari" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Bidali behar de mezua:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Gelditu" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Pausa" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Berrekin" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "G&arbitu bukaturikoak" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Jaitsi fitxategi honen A4AF guztiak orain" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Jaitsi fitxategi honen A4AF guztiak (Auto)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Jaitsi fitxategi guztien a4af guztiak orain" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Hedatutako Aukerak" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Aurrebista" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Erakutsi &xehetasunak" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Erakutsi iruzkin guztiak" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "ezarri gabea" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Ezarri kategoria bat" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "&Ireki fitxategia" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Lagunetatik kendu" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Gehitu lagun zerrendara" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Mezua bidali" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Swap fitxategi honentzat" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "QR: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Beste fitxategi batez galdeturik" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Deskargak (%i)" + +#: src/DownloadListCtrl.cpp:2222 +#, fuzzy +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"Mesedez ezarri zure bideo erreproduktore lehenetsia ezarpenetan.\n" +"Bestela, aMule mplayer erabiltzen saiatu eta aurreikuspen bakoitzean mezu " +"hau bistaraziko da" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Fitxategi Aurreikuspena" + +#: src/DownloadListCtrl.cpp:2260 +#, fuzzy, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "ERROREA: Huts kanpo bideo erreproduktorea abiaraztean!" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "ERROREA: Huts zati fitxategia irekitzerakoan)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "ERROREA: Huts zati fitxategia sortzerakoan)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "met-file fitxategiaren basbeskopia %s-tik kargatzen saiatzen" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "Errorea: huts part.met fitxategia irekitzerakoan: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "Errorea: part.met fitxategia hutsik dago: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "Errorea: part.met fitxategi bertsio baliogabea: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" +"Errorea: %s (%s) hondaturik dago (marka kopuru okerra) ezin da fitxategia " +"kargatu." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "Fitxategi informazioa berreskuratzen saiatzen..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" +"Izen gabeko fitxategia berreskuratzen - RecoveredFile.dat bezala " +"berreskuratzen saiatuko da" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" +"fitxategi informazio eskuragarri guztia berreskuraturik :D - Erabiltzen " +"saiatzen..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Ezin da fitxategi informazioa berreskuratu:(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Huts egin du irekitzerakoan: %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "Abisua: %s hondaturik egon liteke (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "ERROREA zati fitxategia gordetzerakoan: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "'%s' hutsik dago - %s fitxategia erabiliko da." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "Errorea %s-ren part.met.seeds fitxategia gordetzerakoan" + +#: src/PartFile.cpp:1019 +#, fuzzy, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "%i jatorri ale bildurik zati fitxategiarentzat: %s (%s)" +msgstr[1] "%i jatorri ale bildurik zati fitxategiarentzat: %s (%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "%s (%s) zati fitxategiak ez du ale fitxategirik" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "%s (%s) zati fitxategiak ale fitxategi huts bat du" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "Errorea zati-fitxategi hazi fitxategia irakurtzerakoan (%s - %s): %s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, fuzzy, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"Hondaturiko zatia (%d) aurkitu da %d zati %s zati fitxategian - " +"FitxategiEgiaztapenEmaitza |%s| fitxategiEgiaztapena |%s|" +msgstr[1] "" +"Hondaturiko zatia (%d) aurkitu da %d zati %s zati fitxategian - " +"FitxategiEgiaztapenEmaitza |%s| fitxategiEgiaztapena |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "Bukatutako (%i) zatia aurkiturik %s-n" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "Amaitutako berrazterketa: %s" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "Espero ez zen errorea %s osatzerakoan. Fitxategia gelditurik" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Deskarga amaiturik: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "fitxategia ezabatzen:%s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" +"Kontuz: Ezin da deskargaturiko zatia egiaztatu - '%s' egiaztapen osatugabea" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"Errorea: Ezin da deskargatutako zatia aztertu - azterketa burua ez dago " +"osorik (%s). Hau ez zen\n" +"inoiz gertatu beharko" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "KONTUZ: Diskoa leku askieza! Fitxategia gelditzen: %s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "Deskargaturiko %i zatia hondaturik dago fitxategi honetan: %s" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH: Hondaturiko %i zatia (%s) konpondurik -> Gordetako byte-ak: %s" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Disko leku askieza" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Gelditua" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "Oharra: known.met ezin da ireki." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" +"Abisua: Ezagututako fitxategi zerrenda hondaturik dago, buru baliogabea." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "SI errorea known.met fitxategia irakurtzean: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "Errorea known.met fitxategia gordetzerakoan: %s" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "%i ezagututako partekatutako fitxategi aurkiturik" +msgstr[1] "%i ezagututako partekatutako fitxategi aurkiturik" + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "%i ezagututako partekatutako eta %i ezezagun aurkiturik" +msgstr[1] "%i ezagututako partekatutako eta %i ezezagun aurkiturik" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "ERROREA! %s partekatzen saiatzen" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Fitxategi Iruzkinak" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Kalifikazioa" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Iruzkina" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Ez dago iruzkinik" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%s iruzkin" +msgstr[1] "%s iruzkin" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "" +"Huts zerrendako zerbitzari guztietara konektatzen saiatzerakoan, berriz " +"hasiko nahiz." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "ED2K sarea ezgaiturik dago hobespenetan, ez da konektatuko." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "Ez da konektatzeko baliozko zerbitzaririk aurkitu zerbitzari zerrendan" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "%s (%s:%i)-ra konektaturik" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Konexioa sorturik: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"Errore konponezina konektatzen saiatzean. Internet konexioa eroria egon " +"daiteke" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "%s (%s:%i)-ra konexioa galduta" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) hilik dagoela dirudi." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) beterik dagoela dirudi." + +#: src/ServerConnect.cpp:391 +#, fuzzy, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "" +"Zerbitzariarekiko konexio automatikoa berriz saiatuko da %d segundotan" +msgstr[1] "" +"Zerbitzariarekiko konexio automatikoa berriz saiatuko da %d segundotan" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Konexioa galdu egin da" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "Huts %s (%s:%i) -ra konektatzerakoan." + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "Errorea: Soket baliogabea denboraz kanpo arakatzean" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "%s (%s:%i) -ra konexio saiakera denboraz kanpo geratu da." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Ez da zati fitxategirik aurkitu" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "%u zati fitxategi aurkitu dira" +msgstr[1] "%u zati fitxategi aurkitu dira" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "%s Deskargatzen" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Dagoeneko '%s' fitxategia deskargatzen ari zara" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Dagoeneko baduzu '%s' fitxategia" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Dagoeneko %s fitxategia deskargatzen ari zara" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "ed2k lotura baliogabea! Errorea: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr " exekutatu eta irten." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "IP Formatu baliogabea erabili xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +#, fuzzy +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" +"Komando honek argumentu bat behar du. Baliozko argumentuak: 'all' edo " +"zenbaki bat\n" + +#: src/TextClient.cpp:343 +#, fuzzy +msgid "Processing by hash: " +msgstr "%u zenbakidun fitxategia prozesatzen: %s" + +#: src/TextClient.cpp:358 +#, fuzzy +msgid "Processing by filename: " +msgstr "%u zenbakidun fitxategia prozesatzen: %s" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Ez da baliozko zenbaki bat\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "" +"Ez da baliozko egiaztapen bat (luzera zehazki 32 karakterekoa izan behar " +"da)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "Ekintza arrakastatsuki amaitu da." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "Eskakizunak errore honekin huts egin du: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "Bezero IP iragazketa %s dago.\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "EZGAITURIK" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "GAITURIK" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "Zerbitzari IP iragazketa %s dago.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "Uneko IPIragazki maila %d da.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Konexio Mugak: Gora: %u kB/s, Behera: %u kB/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "%s %s %s-ra konektaturik" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "IDBaxuarekin" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "IDAltuarekin" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Ez konektatzen" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "konektatu gabe" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Deskargatu:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Igo:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Bezero hilaran:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Jatorriak guztira:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Bilaketa emaitza kopurua: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "EGITEKE - bilaketa aurrerapena ikusi" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Zerbitzaritik erantzun ezezagun bat jaso da, OpCode = %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Egoera informazio laburra bistarazi." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "Konexio egoera bistarazi, uneko igo/deskarga abiadura, etab.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Estatistika zuhaitz osoa bistarazi." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"Aukeran, 0-255 tarteko argumentu bat eman daiteke komando honi. Honekin " +"bezero\n" +"zuhaitzean ikusiko diren sarrera muga ezarri daiteke. 0 emanez edo ez emanez " +"gero\n" +"'mugagabea' izango da.\n" +"\n" +"Adibidea: 'statistics 5' erabiliaz bezero mota bakoitzeko 5 bertsio nagusiak " +"ikusiriko dira.\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "aMule Itzali." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Urruneko abiaraziriko muina itxi (amule/amuled).\n" +"Honek testu bezeroa ere itxiko du, ezin bait da abiaraziriko muin bat\n" +"gabe erabili.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Emandako objektua birkargatu." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "Partekatutako fitxategi zerrenda freskatu." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "IP Iragazkia taula fitxategitik birkargatu." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Sarera konektatu." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"Honek hobespenetan gaiturik dauden sare guztietara konektatuko du.\n" +"Aukeran IP:Ataka formatuan zerbitzari helbide bat ezarri dezakezu " +"zerbitzari\n" +"horretara bakarrik konektatzeko. IP helbidea puntuaturiko IPv4 hamartar " +"helbide\n" +"bat izan behar da edo ebatzi daitekeen izen bat." + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "ED2K sarera bakarrik konektatu." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "KAD sarera bakarrik konektatu." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Saretik deskonektatu." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "Honek konektaturik zauden sare guztietatik deskonektatuko zaitu.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "ED2K saretik bakarrik deskonektatu." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Kad saretik bakarrik deskonektatu." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "" + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Hobespen balio bat ezarri." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "IP iragazki hobespenak ezarri." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "IP iragazketa gaitu bai bezero bai zerbitzarientzat." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "IP iragazketa ezgaitu bai bezero bai zerbitzarientzat." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "IP iragazketa gaitu/ezgaitu bezeroentzat." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "IP iragazketa gaitu bezeroentzat." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "IP iragazketa ezgaitu bezeroentzat." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "IP iragazketa gaitu/ezgaitu zerbitzarientzat." + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "IP iragazketa gaitu zerbitzarientzat." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "IP iragazketa ezgaitu zerbitzarientzat." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "Ip Iragazte maila hautatu." + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"Baliozko iragazte maila 0-255 tartekoak dira, eta lehenetsiriko balioa\n" +"(hasierakoa) 127 da.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Konexio zabalera mugak ezarri." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "Komando hauentzat emandako balioa Kb/s-tan egon behar da.\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Igoera konexio zabalera muga ezarri." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "Deskarga konexio zabalera muga ezarri." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Hobespen balio bat eskuratu eta bistarazi." + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "IP iragazki hobespenak eskuratu." + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "IP iragazketa egoera eskuratu bai bezero bai zerbitzarientzat." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "IP iragazketa egoera eskuratu bezeroentzat." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "IP iragazketa egoera eskuratu zerbitzarientzat." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "IPiragazki maila eskuratu." + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Konexio zabalera mugak eskuratu." + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Bilaketa bat egiten du." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"Bilaketa mota ezarri behar da mota idatziaz:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Adibidez: 'search kad fitxategia' erabiliaz \"fitxategia\" bilatuko du Kad " +"sarean.\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Bilaketa orokor bat egiten du." + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Bilaketa lokal bat egiten du" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Kad bilaketa bat egiten du" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Azken bilaketaren emaitzak bistaratzen ditu." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Aurreko bilaketaren emaitzak bistaratzen ditu.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Fitxategia deskargatzen hasi" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Deskarga Pausarazi." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Deskarga Berrekin." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Deskarga Utzi." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Deskarga lehenespena ezarri." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "" +"Deskarga baten lehenespena ezarri Baxua, Normala, Altua edo Auto bezala.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "" + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "" + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "" + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "" + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Ilarak/zerrenda bistarazi. " + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Igoera/deskarga ilara, zerbitzari zerrenda edo partekatutako fitxategi " +"zerrenda bistarazi.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Igoera ilara bistarazi." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Deskarga ilara bistarazi." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Erregistroa ikusi." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Zerbitzari zerrenda bistarazi." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Erregistroa garbitu." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() NULL itzuli du" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "Errorea: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "Kontuz: %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Bezero id berria: %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "\tZiurrenik firewall edo router baten atzean zaudelako izan daiteke." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tArgibide gehiagorako begiratu http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "Zerbitzari argibide ezezaguna jasoa - laburregia" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "%d zerbitzari berri jasoak" +msgstr[1] "%d zerbitzari berri jasoak" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Zerbitzari zerrenda gordetzeaz amaitu da." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "Zerbitzariak azken komadoa ukatu du" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Hondaturiko paketebat jaso da zerbitzaritik: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "Errore kudeaezina zerbitzariko paketea prozesatzekoan: %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "Ezin da DNS ebazpen hari bat sortu %s-ra konektatzeko" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "%s (%s) IP-dun zerbitzaria iragazirik dago. Ez dago konektatzen." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "" + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "Ezin da %s zerbitzariaren dns-a ebatzi: Ezin da konektatu!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "" + +#: src/IP2Country.cpp:73 +#, fuzzy, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "%d bandera bitmapa kargaturik" +msgstr[1] "%d bandera bitmapa kargaturik" + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"Ziur zaude kategoria honetako fitxategi guztiak ezeztatu eta ezabatu nahi " +"dituzula?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Baieztapena Beharrezkoa" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Beste guztiak" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Amaitugabea" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Martxan" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Bideoa" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Audioa" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Fitxategia" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "CD-Imaginak" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Irudiak" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Testua" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Hautatu ikuspen iruzkina" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Gehitu kategoria" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Editatu kategoria" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Ezabatu kategoria" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "%s inportatzen: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "Aldiroko karpeta irakurtzen" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "Deskarga fitxategiaren argibide oinarrizkoak eskuratzen" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "Helburu fitxategia sortzen" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "Deskarga fitxategi zaharretik Kargatzen (%u %u-tik)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "Datu blokeak deskarga fitxategi berrian gordetzen (%u %u-tik)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "Deskarga fitxategi argibide jatorria eskuratzen" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "Deskarga gehitu eta zati fitxategi berria gordetzen" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Bilaketa egoera..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "Martxan" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Errorea. Disko leku gabe" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Errorea: Partmet ez da aurkitu" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Errorea: IO errorea!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Errorea Huts egin du!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "Hilaran" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Dagoeneko deskargatzen" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Aldiroko fitxategia formatu ezezagun edo okerrekoa" + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Fitxategia" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Egoera" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "FitxategiEgiaztapena" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Zati fitxategiak inportatu" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"Mesedez ezarri aldiroko fitxategiak bilatuko diren karpeta (azpikarpetak ere " +"arakatuko dira)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "fitxategiak?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Ezabatu?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Zain..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (Diskoa: %s)" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "byte" +msgstr[1] "byte" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "A" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "byte/seg" +msgstr[1] "byte/seg" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "seg" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "min" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "ordu" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "Egunak" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Bideoak" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Konprimituak" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Testuak" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programak" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Edozein" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Kalifikatu gabea" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Baliogabe / Apurturik / Gezurra" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Pobrea" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Oso ona" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Ondo" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Ezinobea" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "denak" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "Beste denak" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "'ipfilter.dat' eta 'ipfilter_static.dat' IP iragazkiak kargatzen." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" +"Huts egin du ipfilter.dat '%s' fitxategia kargatzerakoan, formatu ezezagunak " +"aurkitu dira." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" +"Huts egin du ipfilter.dat '%s' fitxategia kargatzerakoan, ezin da fitxategia " +"ireki." + +#: src/IPFilter.cpp:330 +#, fuzzy, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +"%u IP-eremu kargaturik'%s'-tik. Gaizki eratutako %u lerro alde batetar utzi " +"dira." +msgstr[1] "" +"%u IP-eremu kargaturik'%s'-tik. Gaizki eratutako %u lerro alde batetar utzi " +"dira." + +#: src/IPFilter.cpp:332 +#, fuzzy, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +"%u IP-eremu kargaturik'%s'-tik. Gaizki eratutako %u lerro alde batetar utzi " +"dira." +msgstr[1] "" +"%u IP-eremu kargaturik'%s'-tik. Gaizki eratutako %u lerro alde batetar utzi " +"dira." + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Konexio aktiboak (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Fitxategi Xehetasunak" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% egina" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "ED2K Lotura: " + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Burutu" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" +"Klikatu hemen testu kontrolean dagoen ed2k lotura deskarga hilarara " +"gehitzeko." + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "Bistaratu egoera testua" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Kargatzen ..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"Geraterak hemen agertuko dira. Gertaera zerrenda osorako, begiratu " +"Zerbitzari fitxako erregistroan." + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Konektatuta zauden zerbitzariaren erabiltzaile kopurua ..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Erabiltzaile: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" +"Uneko zerbitzarira konektauriko erabiltzaileak eta guztirako erabiltzaile " +"kalkulua." + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"Unekoa Igoera eta deskarga batez bestekoa. Gaiturik badago parentesi arteko " +"zenbakiak bezero goiburu datuak dira." + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"Konexio egoera eta uneko transferentziak bistaratzen ditu. Gezi gorriak " +"deskonektaturik zaudela adierazten du, horiak berriz ID baxua duzula eta " +"berdeak ID altua (konexio mota hoberena)." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Ez Konektaturik..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Une honetan konektaturiko zerbitzaria." + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Bilatu" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Izena:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Lokala" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Orokorra" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "FitxategiEgiaztapena" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Hedatutako Parametroak" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Iragazten" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Fitxategi Mota" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Hedapena" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Gutx. Tamaina" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Byte" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Gehi. Tamaina" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Eskuragarritasuna" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Iragazkia:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Iragazi Emaitzak" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Emaitza alderantzikatu" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Fitxategi Ezagunak Ezkutatu" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Gehiago" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "ED2K emaitza gehiago bilatu. Ez da onartzen Kad-ekin oraindik." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Gelditu" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Eremuak Garbitu" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Emaitzak" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Garbitu amaituriko deskargak" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Bistaratu Igoera hilara" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Bezeroak ilaran:" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Bidali" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Ezarritako mezua bidali" + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Itxi" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Itxi elkarrizketa saio hau." + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Izen osoa:" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "E/G" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "met Fitxategia:" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Aztertze zenbakia :" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Fitxategi tamaina :" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Fitxategi zati egoera:" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Azkenez osorik ikusia:" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Aurkitutako jatorriak:" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Jatorriak transferitzen:" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Fitxategi zati Kopurua:" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Erabilgarri:" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Data Abiadura:" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Deskarga Aktibo Denbora:" + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Transferituta:" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Amaitua Tamaina:" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Korrupzio Kudeaketa Adimentsua" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Apurketetan galdutakoa:" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Konpresioaz irabazitakoa:" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "I.C.H. gordetako paketeak :" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Fitxategi Izenak" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Konpondu" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Garbitu" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Ezarri" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Ados" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "Iruzkina Testua denak erabiltzaileak" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"Filma batentzat bere luzera, hizkuntza ... esan ditzakezu.\n" +"eta gezurra bada, zuk beste aMule erabiltzeei abisatu dezakezu." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Fitxategi Kalitatea" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" +"Fitxategi kalifikazioa hartu edo fitxategia baliogabea bada besteak " +"abisatu ..." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Iruzkinik ez" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Berritu" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Deskargatzen, itxoin mesedez..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Ezezaguna" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Behar den Informazioa" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "IP Helbidea:" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Ataka:" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Bestelako Informazioa" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Erabiltzaile izena:" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Erabiltzaile aztertze zenbakia :" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Berritu zure partekatutako fitxategiak" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Uneko Saioa" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Guztira" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Eskaerak:" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Igoerak:" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Deskarga Abiadura" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Unekoa" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Funtzionamendu bataz bestekoa" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "saio batez bestekoa" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Igoera Abiadura" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Konexioak" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Deskarga aktiboak" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "konexio aktiboak (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Igoera aktiboak" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Estatistika zuhaitza" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Erabiltzaile izena:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Erbiltzaile-Egiaztapena:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Bezero softwarea:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Bezero bertsioa:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "IP helbidea:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "Erabiltzaile ID-a:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "Zerbitzaria IP-a:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Zerbitzari Izena:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "bezerora transferentziak" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Uneko eskakizuna:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Batazbesteko igoera abiadura;" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Batazbesteko deskarga abiadura;" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Igoa (saioa):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Deskargatua (saioa):" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Igoa (denera):" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Deskargatua (denera):" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Puntuak" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "DE/IG aldagaia:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Identitate ziurra:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Kalifikazioa (Guztira):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Hilara puntuak:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Ezarpen orokorrak" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Ezizena" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - Linux Mandoa" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "Hau beste erabiltzaileek zuri konektatzerakoan ikusiko duten izena da." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Hizkuntza" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "Honek kontroletan erabiliko den hizkuntza ezartzen du." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Beste aukerak" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Arakatu bertsio berrien bila abiaraztean" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" +"Hau gaitzeak Amulek abiaraztean bertsio berririk dagoen arakatzea egingo du" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Hasi txikiturik" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "Gaitzerakoan aMule txikituri abiaraziko da." + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Galdetu irteterakoan" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "aMule-k itxi aurretik galdetzea egiten du." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Tresnabarra Ikonoa Gaitu" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "Honek Tresnabarra (edo lan barra) Ikonoa gaitu/ezgaitzen du." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Argibide atzerapena segundotan" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "Argibideak bistarazi aurreko denbora." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Nabigatzaile hautaketa" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Aukeratu zure nabigatzailea hemen" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Nabigatzaile Pertsonalizatua:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Idatzi zure nabigatzaile izena hemen. Pertsonalizatutako nabigatzailea " +"erabiltzeko 'Erabiltzaileak ezarririk' aukeratu goiko menuan." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Ireki fitxa berrian aukera dagoenenean" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "Ireki web orria fitxa berrian leiho berrian ordez aukera dagoenenean" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Konexio gaitasunak" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Igo" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Slot Ezarpena" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Konexio gaitasunak" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Bezero TCP ataka estandarra:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "Hau ED2K ataka estandarra da eta ezin da ezgaitu." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Hedaturiko bezero UDP ataka:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" +"UDP ataka hau Ed2k hedaturiko eskaera eta Kad sarearentzat erabiliko da." + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "ezgaitu" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Helbidea Behartu" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "Eskaera hedatuetarako UDP ataka (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Fitxategiko jatorri muga" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Muga gogorra" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Konexio mugak" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Gehienezko konexioak" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Universal Plug and Play" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "UPnP gaitu" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "UPnP TCP Ataka:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Konektatu abiaraztekoan" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "berkonektatu konexioa galtzean" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Ikusi konexio erabilpena" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Zerbitzari Aukerak" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Ezabatu hildako zerbitzaria geroago" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "saiakerak" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Eguneratu zerbitzari zerrenda abiaraztean" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Zerrenda" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Eguneratu zerbitzari zerrenda zerbitzari batetara konektatzean" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Eguneratu zerbitzari zerrenda bezero bat konektatzerakoan" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Erabili lehentasun sistema" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Erabili IDbaxu egiaztapena konektatzerakoan" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Konexio ziurra" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Estatiko zerbitzarieta bakarrik autokonektatu" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Ezarri eskuz gehitutako zerbitzariak lehentasun altuan" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "K.K.A. gaiturik" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICH egiaztapen guztiez fidatu (ez gomendaturik)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Gehitu fitxategiak deskargetara geldirik" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Gehitu fitxategiak deskarga zerrendara auto-lehentasunarekin" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Saiatu lehen eta azken zatiak hasieran deskargatzen" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Gehitu partekatutako fitxategi berriak auto-lehentasunarekin" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "saiatu zati osoak transferitzen bidaltze guztietan" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Abiarazi geratutako hurrengo fitxategia bat bukatzerakoan" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "Kategoria berdinekoa" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "10 jatorri gorde fitxategi arraroentzat (< 20 jatorri)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Disko Tokia" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Arakatu Disko Tokia" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "Aukeratu hau zuk Amule-k disko tokia araztea nahi baduzu" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Gutxienezko Disko Lekua:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Ezarri hemen nahi duzu disko toki txikiena." + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Deskarga direktorioa:" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Aldi baterakoa Direktorioa:" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Partekatutako direktorioak" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "" +"(Egin klik eskubiko botoiaz karpeta ikono batetan barnekoak ere partekatzeko)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Partekatu ezkutatutako fitxategiak" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Bideo-erreproduzitzailea" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Sortu Babeskopia aurreikusteko" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Grafikak" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Eguneratze atzerapena : 5 seg" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Bataz besteko grafiko denbora : 100 min" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Konexio Graf Eskala: 100" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Aukeratu Estatistikak Koloreak" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Atzeko planoa" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Sareta" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Uneko deskargak" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Martxan deskargak bataz bestean" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Saioaren bataz besteko deskargak" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Uneko igoerak" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Martxan igoerak bataz bestean" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Saioaren bataz besteko igoerak" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Konexio aktiboak" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Sistema barra Abiadura barra ikonoa" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Uneko Kad-nodoak" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Kad-nodoak martxan" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Kad-nodo saioa" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Hautatu" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Erakutsiko diren bezero kopurua (0=mugagabea)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Abisuak" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Mezu popup" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Erabili soinua" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Leihoa ireki :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Log-ean sarrera berria" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Txat saio berri bat hasi" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Txat mezu berri bat jaso da" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Deskarga gehitu edo amaitu da" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "aMule bertsio berria aurkitua" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "Presazko OOD, zerbitzari konexioa galduta" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Jakinarazi ePostaz" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Bidali ePosta mezu bat deskarga amaitzerakoan." + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "SMTP zerbitzaria :" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "Eposta Helbidea:" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! KONTUZ !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Ezarpen hauek ez aldatu ez badakizu zer egiten\n" +"ari zaren, bestela normalean gauzak daudenak\n" +"baino okerrago geratuko dira zuretzat\n" +"\n" +"Amulek ondo funtzionatu beharko luke ezarpen\n" +"hauek aldatu gabe." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Ezarpen aurreratuak" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Gehienezko konexio berri / 5 seg" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Fitxategia Buffer Tamaina: 240000 byte" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Igoera ilara tamaina: 5000 bezero" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Zerbitzari konexio berritze aldia: Ezgaiturik" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "GUI Aldagaiak" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Deskarga Ilara Fitxategi aurrerapena" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Ikusi Ehunekoa" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Ikusi aurrerapen barra" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Aurrerapen barra Estiloa" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Laua" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Biribildu" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Itxura Onarpena" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Zutabe Sailkapena" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "Auto-sailkatu fitxategiak deskarga hilaran (CPU altua)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "Amule-k zure deskarga zerrendako zutabeak automatikoki sailkatuko ditu" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Beste Interfaze Aldagaiak" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Erakutsi ED2K lastermarka kudeatzaile azkarra" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Erakutsi argibide hedatuak kategoria fitxetan" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Erakutsi transferentziak izenburuan" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Tresnabarra bertikal orientazioa" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Zati fitxategi zenbakia ikusi fitxategi izenaren aurretik" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Urruneko kontrola" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Web zerbitzari ezarpenak" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Abiaraztean amuleweb abiarazi" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Web zerbitzari ataka" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "UPnP ataka berbideraketa gaitu Web zerbitzari atakan" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Web zerbitzari UPnP TCP ataka" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Orrialdea berritzeko denbora (segundotan)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Gaitu Gzip konpresioa" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Gaitu baimen gutxiko erabiltzailea" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Baimen osorako pasahitza" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Baimen baxuko pasahitza" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Web txantiloia" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Urruneko konexio ezarpenak" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Onartu urruneko konexioak" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"Entzuten den interfazearen IP-a\n" +"(hutsik edozeinentzat)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Idatzi hemen a.b.c.d formatuan entzun behar den interfazearen baliozko ip " +"helbidea. Eremu huts batek edo 0.0.0.0 ezartzeak edozein interfazetan " +"entzutea eragingo du" + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "TCP ataka" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "UPnP berbideraketa gaitu EC atakan" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "Hemen klik egin hobespenetan eginiko edozein aldaketa ezartzeko." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Berrezarri hobespenetan eginiko edozein aldaketa." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Titulua :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Iruzkina :" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Deskarga direktorioa :" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Aldatu lehentasuna fitxategi berrientzat :" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Ez aldatu" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Hautatu kolorea kategoria honentzat (unean aukeratutakoa):" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Bistaratu zerbitzariko motd konektatzerakoan..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Zerbitzari argibideak" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Botoi hau klikatu erregistroa garbitzeko" + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "aMule Erregistroa" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "Klik egin botoi honetan zerbitzari zerrenda URL-tik eguneratzeko ....." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Zerbitzari Zerrenda" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Idatzi server.met fitxategiaren URL bat hemen eta gero ezkerreko botoia " +"sakatu zerbitzari ezagunen zerrenda eguneratzeko" + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Zerbitzaria eskuz gehitu: Izena" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Idatzi zerbitzari berriaren izen hemen" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Idatzi x.x.x.x formatua erabiliaz zerbitzariaren ip helbidea." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Idatzi zerbitzariaren ataka hemen." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "Gehitu zerbitzari bat eskuz (sar datuak ezkerrean lehenik) ..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "Argb" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Kad Argb" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"Aukeratutako lokala zure ekipoan instalaturik ez dagoela dirudi\n" +"Zuk lokalak sortu beharko zenituzke erabili ahal izateko. Linux sistemetan " +"abiapuntu on bat /etc/locale.gen fitxategia eta locales paketea dira\n" +"Zorte on!\n" +"(Oharra: Ezartzen saiatuko da)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Ez erakutsi berriro" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "Klikatu botoi honetan nodo zerrenda URL honetatik eguneratzeko ...." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Nodoak (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"nodes.dat fitxategi baten URL-a idatzi eta ezkerreko botoia sakatu nodo " +"ezagunen zerrenda eguneratzeko." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Nodo estatistikak" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Autoabioa" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Nodo berria" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Ataka:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Hemendik abiarazi:\n" +"bezero ezagunak" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Kad Deskonektatu" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Fitxategi aukerak" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Edozeini" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Inori" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Nork ikus ditzake partekatutako fitxategiak:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "Hautatu zure partekatutako fitxategiak nork ikus ditzakeen." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "IP-Iragazkia" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Bezeroak iragazi" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"~/.aMule/ipfilter.dat fitxategian ezarritako bezero IP iragazketa gaitu." + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Zerbitzariak iragazi" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"~/.aMule/ipfilter.dat fitxategian ezarritako zerbitzari IP iragazketa gaitu." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Berritu Zerrenda" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "" +"Berritu ~/.aMule/ipfilter.dat fitxategian ezarritako IP helbideen iragazkia" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL-a:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Eguneratu orain" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Automatikoki eguneratu ip iragazkia abioan" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Iragazki Maila:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Beti Iragazi LAN IP-ak" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Paranoia kudeaketa pareko ez diren IP helbideentzat" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Paketea atzera bota bezero ip-a paketea jaso den ip-aren ezberdina bada. " +"Kontu handiaz erabili." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Gaitu/ezgaitu" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Gaitu Sinadura linean" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Gaitu sistemak fitxategiak idaztea, kanpo programek sinadurak sortu ahal " +"izateko egiten da." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Eguneratu Maiztasuna (Seg):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "Aldatu Linean sinadura eguneraketa aldia (seguntutan)" + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Sare Sinadura Karpeta:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "Klikatu hemen linean sinadurak dituen karpeta aukeratzeko." + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Ezgaitu/Gaitu" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "sarrera mezu iragazkia (txat honetan ezik):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Iragazki Aukerak:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Mezu guztiak Iragazi" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Lagun zerrendan ez daudenen mezuak iragazi" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Bezero ezezagunen mezuak iragazi" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Hau duten mezuak iragazi (erabili ',' bereizle bezala):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "Gehitu amulek mezuetan blokeatzea nahi dituzun hitzak" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Iruzkinak" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Proxy-a gaitu" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Proxy onarpena gaitu/ezgaitu" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Proxy mota:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "Konektatzen ari zaren Proxy-aren mota" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Proxy ostalaria:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "Proxy ostalari izena" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Proxy ataka:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "Proxy ataka" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Egiaztapena" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Egiaztapena gaitu" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "erabiltzaile/pasahitz egiaztapena gaitu/ezgaitu" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "Proxy-ra konektatzeko erabiliko den erabiltzaile izena." + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Pasahitza:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "Proxy-ra konektatzeko erabiliko den pasahitza." + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Proxy gabeko zerbitzari konexio automatikoa" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Hona konektaturik:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Urruneko aMulen saioa hasi" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Erabiltzaile izena" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Ezarpen hauek gogoratu" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Gaitu Arazpen luzeko saio hasiera." + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "Mezu Kategoriak:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "Gehitu" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Berriz saiatu hautaturikoak" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Ezabatu hautaturikoak" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Gertaera motak" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Konektatu edozein zerbitzari eta/edo Kad" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Kategoria Berria" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Aukeratu karpeta bat deskargatutako fitxategientzat" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Kategoria izen bat ezarri behar duzu!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Kategoria bide bat ezarri behar duzu!!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"Huts kategoriarentzat sarrera karpeta sortzerakoan. Mesedez ezarri baliozko " +"bide bat!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "'%s' luzapen ezezaguna '%s' komandoarentzat.\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "'%s' komando ezezaguna.\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"Komando honek ezin du argumenturik eduki.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"Komando honek argumentu bat eduki behar du.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Komando hau osotu gabe dago, beheko luzapen hauetako bat erabili dezakezu.\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Gehigarri erabilgarriak:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Komando erabilgarriak:\n" + +#: src/ExternalConnector.cpp:188 +#, fuzzy, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"Komando guztietan berdin da maiuskula/minuskula.\n" +"Idatzi 'help ' -ri buruzko xehetasunak ikusteko.\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Aplikazioa utzi" + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Laguntza bistarazi." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"Komando bati buruz laguntza jasotzeko, idatz ezazu 'help '.\n" +"Komandoen zerrenda osoa eskuratzeko, 'help' idatzi.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"Erabili '%s' komando zerrendarentzako\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Sintaxi errorea!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Errorea komandoa prozesatzekoan - Ez zen inoiz pasa beharko! Mesedez " +"zorriaren berri eman\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Komando honek ez luke parametrorik eduki beharko." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Komando honek parametro bat eduki beharko luke." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Argumentu baliogabea" + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Hau komando osatugabe bat da." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Sakatu '%s' laguntza gehiagorako.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "Hau %s %s %s da\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "Hau %s %s da\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Bezeroa sortzen...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "Konexioa Huts egin du. Ezin da eskatutako ostalarira konektatu\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"Ados, %s uzten...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"Ezin da pasahitz zuri batez konektatu.\n" +"Pasahitz bat ezarri behar duzu konfigurazio fitxategian,\n" +"komando lerroan, edo eskatzen zaizunean sartu.\n" +"\n" +"Irteten...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Laguntza testu hau bistarazi." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "aMule abiarazirik duen ostalaria (lehenetsia: localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "Kanpo Konexioetarako aMuleren ataka. (Lehenetsia 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Kanpo Konexio Pasahitza." + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Konfigurazio fitxategitik irakurri." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "Ez ezer bistarazi irteera estandarrean." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Luze - Arazpen mezuak ere bistarazi." + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Programa lokala (hizkuntza) ezarri." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "Idatzi komando lerroko aukerak konfigurazio fitxategira." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "" +"aMuleren konfigurazio fitxategian oinarriturik konfigurazio fitxategia " +"sortzen du." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Programa bertsioa bistarazi." + +#: src/ClientCreditsList.cpp:168 +#, fuzzy, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "Kreditu fitxategia kargaturik, %u bezero ezagutzen dira" +msgstr[1] "Kreditu fitxategia kargaturik, %u bezero ezagutzen dira" + +#: src/ClientCreditsList.cpp:171 +#, fuzzy, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] " - %u bezeroaren kredituak amaitu dira!" +msgstr[1] " - %u bezeroaren kredituak amaitu dira!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "Ez da 'cryptkey.dat' fitxategia aurkitu, sortzen." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "ERROREA: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Barkatu" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Erakutsi Igoerak" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Erakutsi Ilara" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Erakutsi Bezeroak" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Hautatu Ikuspegia" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Bezero Softwarea" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Itxoindakoa" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Ordu Denbora" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Igo/Deskargatu" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Urruneko Egoera" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "QR: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Fitxategia Lehentasuna" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Puntuak" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Galdeturik" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Azkenez ikusia" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Ilaran jarri da" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Igoera Egoera" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Igotarikoa" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Deskarga Egoera" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Deskargaturikoa" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "ErabiltzaileEgiaztapena" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Bezero xehetasunak" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Ez da onartzen" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Ez osorik" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Tipo Gaiztoa" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Egiaztaturik: Ondo" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Ez dago erabilgarri" + +#: src/ClientDetailDialog.cpp:190 +#, fuzzy, c-format +msgid "%u (QR: %u)" +msgstr "QR: %u" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" +"Gutxienezko tamaina gehienezkoa baino txikiagoa izan behar da. Gehienezkoa " +"alde batetara utziko da." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Bilaketa oharra" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Mugarik gabea" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "aMule tresna-barra Menua" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Abiadura Mugak:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "IG: Batez" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "IG: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "DE: Batez" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "DE: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Deskargatu Abiadura: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Igo Abiadura: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Bezero argibidea" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Ezizena: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "Goitizena Ez Hautatuta!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "BezeroID: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Zerbitzari izena: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "ZerbitzariIP: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "TCP Ataka: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "TCP Ataka: Ez dago prest" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "UDP Ataka: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "UDP Ataka: Ez dago prest" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Linean Sinadura: Gaituta" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Linean Sinadura: Ezgaitua" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Partekatutako Fitxategiak: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Hilarako Bezeroak: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "DE Guztira: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "IG Guztira: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Igoera muga" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Deskarga muga" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "aMule ezkutatu" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "aMule erakutsi" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "Berriketa saioa abiarazirik: %s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Bezerora Konektaturik ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** Bezerora Konektatzen ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Huts bezerora konektatzerakoan / Konexio galdua ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Itxi fitxa" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Itxi fitxa guztiak" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Itxi beste fitxak" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "server.met fitxategia kargatzen: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "Server.met fitxategia ez da aurkitu!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" +"Huts '%s' server.met fitxategi irakurtzerakoan, formatu ezezaguna aurkiturik." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "Huts server.met fitxategia irekitzerakoan!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"Server.met fitxategia hondaturik dago, bertsio marka baliogabea aurkitu da: " +"0x%x, tamaina %i" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "%i zerbitzari aurkiturik server.met fitxategian" +msgstr[1] "%i zerbitzari aurkiturik server.met fitxategian" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d zerbitzari gehiturik" +msgstr[1] "%d zerbitzari gehiturik" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Zerbitzaria ez da gehitu: [%s:%d] -ek ez du baliozko atakarik ezarri." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "" +"Zerbitzaria ez da gehitu: [%s:%d] -ren IP helbidea iragazirik dago edo " +"baliogabea da." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" +"Zerbitzaria ez da gehitu: [%s:%d] IP:Ataka dun zerbitzaria aurkitu da " +"zerrendan." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Zerbitzaria gehiturik: [%s:%d] zerbitzaria '%s' izena erabiltzen." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"Konektaturik zauden zerbitzaria ezabatu nahi duzu. Mesedez deskonektatu " +"lehenik." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Huts server.met gordetzerakoan!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "URL Baliogabea" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Huts zerbitzari zerrenda '%s'-tik deskargatzerakoan" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"'addresses.dat' fitxategian ez da zerbitzari zerrenda helbiderik aurkitu. " +"Mesedez itsatsi baliozko zerbitzari zerrenda helbide bat fitxategian " +"zerbitzari zerenda auto-eguneratzeko" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "Abisua, Baliogabeko URL bat ezarria zerbitzariak eguneratzeko: %s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" +"Ez da baliozko server.met auto-deskarga url helbiderik aurkitu addresses.dat " +"fitxategian" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"Zerbitzari lokala IPIragazkiak iragazirik dago, beste zerbitzari batetara " +"birkonektatzen. " + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "Huts `%s' komandoa `%s' gertaeran exekutatzean." + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"Zure lokalak sistemako lehenetsira aldatu dira konfigurazio aldaketa bat " +"dela eta. Barkatu." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"Ez duzu zerbitzaririk zerbitzari zerrendan.\n" +"aMulek zerrenda berri bat orain deskargatzea nahi al duzu?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Zerbitzari zerrenda deskargatu" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "webzerbitzari abiarazia %d pid-arekin" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"Webzerbitzaria abiaraztean exekutatzea eskatu duzu, baina amuleweb bitarra " +"ezin da abiarazi. Mesedez aMule web zerbitzaria duen paketea instalatu edo -" +"enable-webserver erabiliaz aMule konpilatu eta make install abiarazi" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "%u ataka ez dago eskuragarri. IDBaxua izango duzu\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"%u ataka ez dago eskuragarri!\n" +"\n" +"Honek IDBaxua izango duzula esna nahi du.\n" +"\n" +"Egiaztatu zure sarea ataka sarrera eta irteerarako irekirik dagoela " +"ziurtatzeko." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Huts Online Sinadura Fitxategia sortzerakoan" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "Huts aMule Online Sinadura Fitxategia sortzerakoan" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"Aukeratutako lokalak ez dirudi zure sisteman instalaturik (Oharra: Hala ere " +"erabiltzen saiatuko da)" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "aMule %s abiarazten duzun lehen aldia da" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "Bertsioa hau beta bertsio bat da, egunero eguneratzen da, eta\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "ez gara ezer apurtu, zure etxea erre, edo zure zakurra akatzen\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" +"badu ere kargu egingo, baina erabiltzeko ziurra izan *beharko* litzateke.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Argibide gehiago, laguntza eta bertsio berriak gure webgunean aurki " +"ditzakezu,\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "www.aMule.org -en, edo irc.freenode.net IRC sareko #aMule kanalean.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Edozein akatsen berri emateko:http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"Zuk aukeratutako sinadura karpeta BALIOGABEA da!\n" +" Lehenespenak konpondu artean lineako sinadura EZGAITU egingo da." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "ERROREA: ezin da erregistro fitxategia ireki" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "ABISUA: erregistro fitxategia hutsik dago. Zerbait oker dago." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Erregistroa berrezarri egin da" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "ZerbitzariMezua: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Huts egin du nodo zerrenda deskargatzerakoan." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Huts egin du" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Hondaturiko bertsio arakatze fitxategia" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Zaharkiturik dagoen aMule bertsio bat erabiltzen ari zara!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "Zure aMule bertsioa %i.%i.%i da eta azken bertsioa %li.%li.%li da" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "Azken bertsioa beti http://www.amule.org webgunean aurki daiteke" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "OHARRA: Zure aMuled bertsioa zaharkiturik dago: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "Zure aMule kopia zaharkiturik dago." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Huts bertsio arakatze fitxategia deskargatzerakoan" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "%s %s-ra konektaturik" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "%s-ra konektatzen" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "ED2K-tik Deskonektatuta" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad abiarazirik." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad gelditurik." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Kad-era Konektatuta (ondo)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Kad-era Konektatuta (suebakirik)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Kad-etik deskonektatua" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"Kad sarea ezin da erabili hobespenetan UDP ataka ezgaiturik badago, ez da " +"abiaraziko." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Kad sarea hobespenetan ezgaiturik, ez da konektatuko." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "Huts 'emfriends.met' lagun fitxategia irakurtzeko irekitzerakoan!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "Huts 'emfriends.met' lagun fitxategia idazteko irekitzerakoan!" + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "" +#~ "Ezin duzu ip bereizi batetatik abiarazi urruneko interfazetik oraindik." + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "Ezin duzu server.met urruneko interfazetik eguneratu oraindik." + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "Irakurri %u Kad kontaktuak" +#~ msgstr[1] "Irakurri %u Kad kontaktuak" + +#~ msgid "Disconnect from " +#~ msgstr "Deskonektatu " + +#~ msgid "current server" +#~ msgstr "uneko zerbitzaritik" + +#~ msgid " and " +#~ msgstr " eta " + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "TCP Flags" +#~ msgstr "TCP Banderak" + +#~ msgid "UDP Flags" +#~ msgstr "UDP Banderak" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "Kopiatu ED2k lotura arbelara" + +#~ msgid "Client requests %u" +#~ msgstr "Bezero eskaera: %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "Fitxategi blokea %u-%u (%d byte):" + +#~ msgid "Client request is invalid!" +#~ msgstr "Bezero eskaera baliogabea da!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "Bezero eskaera baliogabea da!%i / %i" + +#~ msgid "Command: %s" +#~ msgstr "Komandoa: %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "Ezin da %s fitxategia ireki - %s fitxategia erabiltzen." + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "Oharra: known.met ez dago." + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles: %s partekatutako direktorio zerrendatik " +#~ "kentzen: ez da direktorioa aurkitu." + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "Azpiprozesu amaiera hutsegitea itxoiten " + +#~ msgid "" +#~ "You cannot connect to a release version from an arbitrary CVS version! " +#~ "*sigh* possible crash prevented" +#~ msgstr "" +#~ "Ezin zara argitaratutako bertsioara CVS bertsioko bezerotik konektatu! " +#~ "Gerta litekeen kraskatzea ekiditurik" + +#~ msgid "doesn't work" +#~ msgstr "ez dabil" + +#~ msgid "remote gui" +#~ msgstr "Urruneko interfazea" + +#~ msgid "" +#~ "Error: Failed to load backup file. Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Errorea: Huts ziurtasun kopiaz kargatzerakoan. Bilatu http://forum.amule." +#~ "org -en part.met fitxategi berreskurapen aukerez" + +#~ msgid "" +#~ "Error: Backup part.met file is 0 size! Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Errorea: part.met basbeskopia 0 tamainakoa da! Bilatu http://forum.amule." +#~ "org -en.part.met berreskurapen aukerak" + +#~ msgid "Error: part.met backup file is 0 size: %s ==> %s" +#~ msgstr "Errorea: part.met babeskopia fitxategia 0 tamainakoa da: %s ==> %s" + +#~ msgid "" +#~ "Note: These values are\n" +#~ " only used for statistics." +#~ msgstr "" +#~ "Oharra: Balio hauek estatistiketarako\n" +#~ " bakarrik erabiliko dira." + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "ABISUA: ID Baxua jaso duzu!" + +#~ msgid "This command requieres an argument. Valid arguments: a file hash.\n" +#~ msgstr "" +#~ "Komando honek argumentu bat behar du: Baliozko argumentuak: fitxategi " +#~ "egiaztapen bat.\n" + +#~ msgid "Deprecated command, now 'Status'." +#~ msgstr "Zaharkitutako komandoa, 'Status' erabili." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Status' instead.\n" +#~ msgstr "" +#~ "Hau zaharkituriko komandoa bat da, eta etorkizunean ezabatua izango da.\n" +#~ "'Status' erabili horren ordez.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter'." +#~ msgstr "Zaharkitutako komandoa, 'Set IPFilter' erabili." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter' instead.\n" +#~ msgstr "" +#~ "Hau zaharkituriko komandoa bat da, eta etorkizunean ezabatua izango da.\n" +#~ "'Set IPFilter' erabili horren ordez.\n" + +#~ msgid "Deprecated command, now 'Get IPFilter Level'." +#~ msgstr "Zaharkitutako komandoa, 'Get IPFilter Level' erabili." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Hau zaharkituriko komandoa bat da, eta etorkizunean ezabatua izango da.\n" +#~ "'Get IPFilter Level' erabili horren ordez.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter Level'." +#~ msgstr "Zaharkitutako komandoa, 'Set IPFilter Level' erabili." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Hau zaharkituriko komandoa bat da, eta etorkizunean ezabatua izango da.\n" +#~ "'Set IPFilter Level' erabili horren ordez.\n" + +#~ msgid "Deprecated command, now 'Get/Set IPFilter Level'." +#~ msgstr "Zaharkitutako komandoa, 'Get/Set IPFilter Level'.erabili." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get/Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Hau zaharkituriko komandoa bat da, eta etorkizunean ezabatua izango da.\n" +#~ "'Get/Set IPFilter Level' erabili horren ordez.\n" + +#~ msgid "Deprecated command, now 'Show Servers'." +#~ msgstr "Zaharkitutako komandoa, 'Show Servers' erabili." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Show Servers' instead.\n" +#~ msgstr "" +#~ "Hau zaharkituriko komandoa bat da, eta etorkizunean ezabatua izango da.\n" +#~ "'Show Servers' erabili horren ordez.\n" + +#~ msgid "Deprecated command, now 'Get BwLimits'." +#~ msgstr "Zaharkitutako komandoa, 'Get BwLimits' erabili." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get BwLimits' instead.\n" +#~ msgstr "" +#~ "Hau zaharkituriko komandoa bat da, eta etorkizunean ezabatua izango da.\n" +#~ "'Get BwLimits' erabili horren ordez.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Up'." +#~ msgstr "Zaharkitutako komandoa, 'Set BwLimit Up' erabili." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Up' instead.\n" +#~ msgstr "" +#~ "Hau zaharkituriko komandoa bat da, eta etorkizunean ezabatua izango da.\n" +#~ "'Set BwLimit Up' erabili horren ordez.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Down'." +#~ msgstr "Zaharkitutako komandoa, 'Set BwLimit Down' erabili." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Down' instead.\n" +#~ msgstr "" +#~ "Hau zaharkituriko komandoa bat da, eta etorkizunean ezabatua izango da.\n" +#~ "'Set BwLimit Down' erabili horren ordez.\n" + +#~ msgid "Syncronization thread started." +#~ msgstr "Sinkronizazio haria abiarazia." + +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "Fitxategi ezagunen egiaztapen nagusiak kargatuak izan dira." + +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "Errorea Kad kontatuak irakurtzerakoan - 0 sarrera" + +#~ msgid "Merge attempt" +#~ msgstr "Batze saiakera" + +#~ msgid "Recursive merge" +#~ msgstr "Batze errekurtsiboa" + +#~ msgid "Sucessful merge!" +#~ msgstr "Behar bezala batu da!" + +#~ msgid "No merge possible" +#~ msgstr "Ezin da batu" + +#~ msgid "Buddy address: " +#~ msgstr "Lagun helbidea: " + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid " %d" +#~ msgstr " %d" + +#~ msgid ".%d" +#~ msgstr ".%d" + +#~ msgid "Shows the process of a search." +#~ msgstr "Bilaketaren aurrerapena bistaratzen du." + +#~ msgid "Shows the process of a search..\n" +#~ msgstr "Bilaketaren aurrerapena bistaratzen du..\n" + +#~ msgid "Search warning." +#~ msgstr "Bilaketa oharra." + +#~ msgid "Client Identification:" +#~ msgstr "Bezero identifikazioa:" + +#~ msgid "Use Secure Identification" +#~ msgstr "Identifikazio ziurra erabili" + +#~ msgid "" +#~ "Secure Identification uses a handshake approch to safely identify clients " +#~ "for use with the credit system." +#~ msgstr "" +#~ "Identifikazioa ziurrak behar den handshake bat erabiltzen du bezeroak " +#~ "identifikatzeko, kreditu sistemarekin erabiltzeko." + +#~ msgid "Sources Dropping" +#~ msgstr "Jatorriak garbitzen" + +#~ msgid "Source Dropping" +#~ msgstr "Jatorriak kendu" + +#~ msgid "Keep sources" +#~ msgstr "Jatorriak mantendu" + +#~ msgid "Drop sources" +#~ msgstr "Jatorriak ezabatu" + +#~ msgid "Send sources to any other file before dropping (High CPU)" +#~ msgstr "Bidali edozeini jatorriak ezabatu baino lehen (CPU handia)" + +#~ msgid "Sources with no needed file-parts." +#~ msgstr "Behar diren fitxategi zatiak ez dituzten jatorriak." + +#~ msgid "Full Queue Sources Handling" +#~ msgstr "Ilara beteko jatorri kudeaketa" + +#~ msgid "Enable auto drop Full Queue Sources" +#~ msgstr "Ilara beteko jatorriak auto ukatzea gaitu" + +#~ msgid "High Queue Rating Sources Handling" +#~ msgstr "Ilara handiko jatorrien kudeaketa" + +#~ msgid "Enable auto drop High Queue Rating Sources" +#~ msgstr "Gaitu auto ukatzea ilara handiko Jatorriak" + +#~ msgid "High Queue Rating value" +#~ msgstr "Ilara altuko klasifikazio balioa" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(Gutx. 300 / Gehi. 3000)" + +#~ msgid "Auto Drop Sources Timer" +#~ msgstr "Jatorriak auto ukatzeko ordutegia" + +#~ msgid "Timer (in secs)" +#~ msgstr "Aldia (segundotan)" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(Gutx. 60 / Gehi. 3600)" + +#~ msgid "Drop No Needed Sources now" +#~ msgstr "Behar ez diren jatorriak orain ezabatu" + +#~ msgid "Drop Full Queue Sources now" +#~ msgstr "Ezabatu ilara betea duten jatorriak orain" + +#~ msgid "Drop High Queue Rating Sources now" +#~ msgstr "Ezabatu Ilara luzea duten jatorriak orain" + +#~ msgid "Clean Up Sources now (NNS, FQS && HQRS)" +#~ msgstr "Garbitu jatorriak orain (NNS, FQS && HQRS)" + +#~ msgid "English (U.S.)" +#~ msgstr "Ingelesa (A.E.B)" + +#~ msgid "Spanish (Mexican)" +#~ msgstr "Gaztelera (Mexikarra)" + +#~ msgid "" +#~ "The number of a file from the last search has to be given.\n" +#~ "Example: 'download 12' will start to download the file with the number 12 " +#~ "of the prvious search.\n" +#~ msgstr "" +#~ "Azken bilaketako fitxategi baten zenbakia eman behar da.\n" +#~ "Adibidez: 'download 12' azken bilaketaren 12 zenbakia duen fitxategia " +#~ "deskargatzen hasiko da.\n" + +#~ msgid "Set riority to low." +#~ msgstr "Lehenespena baxua bezala ezarri." + +#~ msgid "Set riority to normal." +#~ msgstr "Lehenespena normala bezala ezarri." + +#~ msgid "Set riority to high." +#~ msgstr "Lehenespena altua bezala ezarri." + +#~ msgid "Set riority to auto." +#~ msgstr "Lehenespena auto bezala ezarri." + +#~ msgid "" +#~ "ERROR: aMule daemon cannot be used when external connections are " +#~ "disabled. To enable External Connections, use either a normal aMule or " +#~ "set the key\"AcceptExternalConnections\" to 1 in the file ~/.aMule/amule." +#~ "conf" +#~ msgstr "" +#~ "ERROREA: aMule deabrua ezin da erabili kanpo konexioak ezgaiturik dauden " +#~ "bitartean, Hauek gaitzeko aMule arrunta erabili edo~/.aMule/amule...conf " +#~ "fitxategian \"AcceptExternalConnections\" 1 bezala ezarri" + +#~ msgid "Sources: %u" +#~ msgstr "Jatorriak: %u" + +#~ msgid "Feedback from: %s" +#~ msgstr "Berrelikadura hemendik: %s" + +#~ msgid "Client: aMule %s" +#~ msgstr "Bezeroa: aMule %s" + +#~ msgid "File Name: %s" +#~ msgstr "Fitxategia Izena: %s" + +#~ msgid "File size: %s" +#~ msgstr "Fitxategi tamaina: %s" + +#~ msgid "Download: %s" +#~ msgstr "Deskargatu: %s" + +#~ msgid "Complete Sources: %u" +#~ msgstr "Amaitua Jatorriak: %u" + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2006 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ " eMule-n oinarrituriko 'Plataforma Guztietarako' p2p bezeroa\n" +#~ "\n" +#~ " Webgunea: http://www.amule.org\n" +#~ " Foroa: http://forum.amule.org\n" +#~ " FAQ: http://wiki.amule.org\n" +#~ "\n" +#~ " Harremanak: admin@amule.org (administrazio gertaerak)\n" +#~ " Copyright (C) 2003-2006 aMule Taldea\n" +#~ "\n" +#~ " aMule zati bat honetan oinarriturik:\n" +#~ " Kademlia: bezeroz-bezero bideratzean oinarrituriko XOR metrika.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "http://download.overnet2000.de/nodes.dat" +#~ msgstr "http://download.overnet2000.de/nodes.dat" + +#~ msgid "Copy ED2k link to clipboard (Hostname)" +#~ msgstr "Kopiatu ED2k lotura arbelara (Ostalaria)" + +#~ msgid "Session is not logged and request have no password\n" +#~ msgstr "Saioa ez dago hasirik eta eskakizunak ez du pasahitzik\n" + +#~ msgid "Connecting to %s (%s - %s:%i)" +#~ msgstr "%s (%s - %s:%i)-ra konektatzen" + +#~ msgid "Minimize to trayicon" +#~ msgstr "Ikonotu ikono barrara" + +#~ msgid "" +#~ "Enabling this will make aMule minimize to the system-tray, rather than " +#~ "the taskbar." +#~ msgstr "Gaituaz aMule ataza barrara beharrean sistema barrara txikituko da." + +#~ msgid "Skin file name is empty" +#~ msgstr "Itxura fitxategi izena hutsik dago" + +#~ msgid "Skin file %s does not exist" +#~ msgstr "%s itxura fitxategia ez dago" + +#~ msgid "Unable to open skin file: %s" +#~ msgstr "Ezin da itxura fitxategia ireki: %s" + +#~ msgid " - loading defaults" +#~ msgstr " - lehenespenak kargatzen" + +#~ msgid " - loading toolbar defaults" +#~ msgstr " - tresnabarra lehenespenak kargatzen" + +#~ msgid "Browse skin file" +#~ msgstr "Arakatu Itxura fitxategia" + +#~ msgid "Use skin file to set aMule bitmaps." +#~ msgstr "Erabili itxura fitxategia aMule bit-mapak ezartzeko." + +#~ msgid "Skin file:" +#~ msgstr "Itxura fitxategia:" + +#~ msgid "ExternalConn: adding ed2k link '%s'." +#~ msgstr "KanpoKonexioa: '%s' ed2k lotura gehitzen." + +#~ msgid "Adds an ed2k link to core." +#~ msgstr "ed2k lotura nagusira gehitu." + +#~ msgid "" +#~ "The ed2k link to be added can be:\n" +#~ "*) a file link (ed2k://|file|...), it will be added to the download " +#~ "queue,\n" +#~ "*) a server link (ed2k://|server|...), it will be added to the server " +#~ "list,\n" +#~ "*) or a serverlist link, in which case all servers in the list will be " +#~ "added to the\n" +#~ " server list.\n" +#~ msgstr "" +#~ "Gehituko den ed2k lotura hauetako bat izan daiteke:\n" +#~ "*) fitxategi lotura bat (ed2k://|file|...), berau deskarga hilarara " +#~ "gehituko da.\n" +#~ "*) zerbitzari lotura bat (ed2k://|server|...), berau zerbitzari " +#~ "zerrendara gehituko da.\n" +#~ "*) edo zerbitzari zerrenda lotura bat, kasu honetan zerrendako zerbitzari " +#~ "guztiak\n" +#~ " zerbitzari zerrendara gehituko dira.\n" + +#~ msgid "CIP2Country::CIP2Country() Failed to load country data from '%s'" +#~ msgstr "" +#~ "CIP2Country::CIP2Country() Huts herrialde datuak '%s'-etik kargatzen" diff --git a/po/fa.po b/po/fa.po new file mode 100644 index 00000000..372e86f9 --- /dev/null +++ b/po/fa.po @@ -0,0 +1,6778 @@ +# Persian translations for aMule package. +# Copyright (C) 2008 Free Software Foundation, Inc. +# This file is distributed under the same license as the aMule package. +# , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: aMule SVN\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2008-02-07 09:12+0100\n" +"Last-Translator: \n" +"Language-Team: Persian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr "" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr "" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "" + +#: src/BaseClient.cpp:1876 +#, c-format +msgid "Requested: %s\n" +msgstr "" + +#: src/BaseClient.cpp:1878 +#, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +msgstr[1] "" + +#: src/BaseClient.cpp:1881 +#, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +msgstr[1] "" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "" + +#: src/FriendListCtrl.cpp:273 +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "" + +#: src/FriendListCtrl.cpp:275 +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "" + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "" + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "" + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "" + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "" + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "" + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "" + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "" + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +msgid " with " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +msgid " kB/s" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +msgid "Cancelled !" +msgstr "" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "" + +#: src/ServerListCtrl.cpp:428 +msgid "Mark server as static" +msgstr "" + +#: src/ServerListCtrl.cpp:429 +msgid "Mark server as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:431 +msgid "Mark servers as static" +msgstr "" + +#: src/ServerListCtrl.cpp:432 +msgid "Mark servers as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:438 +msgid "Remove server" +msgstr "" + +#: src/ServerListCtrl.cpp:440 +msgid "Remove servers" +msgstr "" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "" + +#: src/ServerListCtrl.cpp:449 +msgid "Copy ED2k links to clipboard" +msgstr "" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "" + +#: src/ServerListCtrl.cpp:570 +msgid "Are you sure that you wish to delete the selected server?" +msgstr "" + +#: src/ServerListCtrl.cpp:572 +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "" + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr "" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr "" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "" + +#: src/amuleDlg.cpp:666 +msgid "ED2K: Connecting" +msgstr "" + +#: src/amuleDlg.cpp:670 +msgid "ED2K: Disconnected" +msgstr "" + +#: src/amuleDlg.cpp:676 +msgid "Kad: Firewalled" +msgstr "" + +#: src/amuleDlg.cpp:680 +msgid "Kad: Connected" +msgstr "" + +#: src/amuleDlg.cpp:685 +msgid "Kad: Connecting" +msgstr "" + +#: src/amuleDlg.cpp:689 +msgid "Kad: Off" +msgstr "" + +#: src/amuleDlg.cpp:718 +msgid "Stop the current connection attempts" +msgstr "" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "" + +#: src/amuleDlg.cpp:722 +msgid "Disconnect from the currently connected networks" +msgstr "" + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "" + +#: src/amuleDlg.cpp:726 +msgid "Connect to the currently enabled networks" +msgstr "" + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "" + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:980 +#, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:987 +#, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:999 +#, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "" + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "" + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "" + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "" + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "" + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "" + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "" + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "" + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "" + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "" + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "" + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "" + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "" + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "" + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "" + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "" + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "" + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "" + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "" + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "" + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "" + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "" + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "" + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "" + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "" + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "" + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "" + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "" + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "" + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "" + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "" + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "" + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "" + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "" + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "" + +#: src/DownloadListCtrl.cpp:578 +msgid "Are you sure that you wish to delete the selected file?" +msgstr "" + +#: src/DownloadListCtrl.cpp:580 +msgid "Are you sure that you wish to delete the selected files?" +msgstr "" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "" + +#: src/DownloadListCtrl.cpp:2222 +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2260 +#, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "" + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "" + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "" + +#: src/PartFile.cpp:1019 +#, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "" + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "" + +#: src/SharedFileList.cpp:352 +#, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "" +msgstr[1] "" + +#: src/SharedFileList.cpp:358 +#, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "" +msgstr[1] "" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "" + +#: src/CommentDialogLst.cpp:104 +#, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "" + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "" + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "" + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "" + +#: src/ServerConnect.cpp:391 +#, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "" + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "" + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "" + +#: src/DownloadQueue.cpp:175 +#, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "" +msgstr[1] "" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "" + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "" + +#: src/TextClient.cpp:305 +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" + +#: src/TextClient.cpp:343 +msgid "Processing by hash: " +msgstr "" + +#: src/TextClient.cpp:358 +msgid "Processing by filename: " +msgstr "" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "" + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "" + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "" + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "" + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "" + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "" + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "" + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "" + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "" + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "" + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "" + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "" + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "" + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "" + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "" + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "" + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "" + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "" + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "" + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "" + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "" + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "" + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "" + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "" + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "" + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "" + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "" + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "" + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "" + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "" + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "" + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "" + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "" + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "" + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "" + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "" + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "" + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "" + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "" + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "" + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "" + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "" + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "" + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "" + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "" + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "" + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "" + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "" + +#: src/ServerSocket.cpp:539 +#, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "" + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "" + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "" + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "" + +#: src/IP2Country.cpp:73 +#, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "" +msgstr[1] "" + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "" + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "" + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "" + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "" + +#: src/OtherFunctions.cpp:121 +msgid "byte" +msgid_plural "bytes" +msgstr[0] "" +msgstr[1] "" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "" + +#: src/OtherFunctions.cpp:156 +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "" +msgstr[1] "" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "" + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" + +#: src/IPFilter.cpp:330 +#, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +msgstr[1] "" + +#: src/IPFilter.cpp:332 +#, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +msgstr[1] "" + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "" + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "" + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "" + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "" + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "" + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "" + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "" + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "" + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "" + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "" + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "" + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "" + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "" + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "" + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "" + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "" + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "" + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "" + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "" + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "" + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "" + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "" + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "" + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "" + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "" + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "" + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr "" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "" + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "" + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "" + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "" + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "" + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "" + +#: src/ExternalConnector.cpp:188 +#, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "" + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "" + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "" + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "" + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "" + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "" + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "" + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "" + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "" + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "" + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "" + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "" + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "" + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "" + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "" + +#: src/ClientCreditsList.cpp:168 +#, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "" +msgstr[1] "" + +#: src/ClientCreditsList.cpp:171 +#, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] "" +msgstr[1] "" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "" + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "" + +#: src/ClientDetailDialog.cpp:190 +#, c-format +msgid "%u (QR: %u)" +msgstr "" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "" + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "" + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "" + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" + +#: src/ServerList.cpp:168 +#, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerList.cpp:170 +#, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "" + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "" + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "" + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "" + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "" + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "" + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "" + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "" + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "" + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "" + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "" diff --git a/po/fi.po b/po/fi.po new file mode 100644 index 00000000..721a1e3c --- /dev/null +++ b/po/fi.po @@ -0,0 +1,7558 @@ +# aMule i18n resource file. +# Copyright (C) 2004 aMule Team +# This file is distributed under the same license as the aMule package. +# Kry , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: fi\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2008-02-24 13:33+0200\n" +"Last-Translator: Tapio Rantala \n" +"Language-Team: aMule Team \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Salasana ei voi olla tyhjä." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Virheellinen salasana, ei MD5-tarkiste!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Yhdistäminen ei onnistunut" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "Etäyhteysyritys epäonnistui. Vastaus oli tyhjä." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "Etäyhteys: Pääsy evättiin: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "Etäyhteys: Pääsy evättiin" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "Etäyhteys: Epäkelpo vastaus palvelimelta. Yhteys suljettu." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Yhdistetty onnistuneesti kohteeseen aMule " + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Yhdistetty onnistuneesti." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Luo tarkistetta" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Viimeistelee" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Valmis" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Tauotettu" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Virheellinen" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Lataa" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Odottaa" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Lasketaan MD4- sekä AICH-tarkistetta tiedostolle %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Lasketaan MD4-tarkistetta tiedostolle %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Lasketaan AICH-tarkistetta tiedostolle %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "Muunnetaan vanhat AICH-tarkistejoukot '%s' 64-bittisiksi '%s'." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" +"VAROITUS: Tiedostonimi '%s' ei kelpaa ja tiedosto uudelleennimettiin '%s'." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "VAROITUS: Tiedosto '%s' on jo olemassa, uusi tiedosto nimettiin '%s'." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" +"VAROITUS: Alkuperäistä '%s' ei voitu poistaa varmuuskopion valmistuttua" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "VAROITUS: Ei voitu poistaa %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Jaettujen tiedostojen listaus käyttäjältä '%s' ei onnistunut" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Tuntematon" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (Vale-eMule versio %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (Vale-eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (Vale-eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (pohjautuu eMule-versioon v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Nimimerkki: %s Tunnus: %u" + +#: src/BaseClient.cpp:1876 +#, c-format +msgid "Requested: %s\n" +msgstr "" + +#: src/BaseClient.cpp:1878 +#, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +msgstr[1] "" + +#: src/BaseClient.cpp:1881 +#, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +msgstr[1] "" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Pyydetty tuntematonta tiedostoa" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "Asiakas %s IP:Portti %s:%d ohjelmalla %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Käyttäjänimi" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Kaverit" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Näytä tie&dot" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Lisää kaveri" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Poista kaveri" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Lähetä Viesti" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Näytä tiedostot" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Vapauta kaveripaikka" + +#: src/FriendListCtrl.cpp:273 +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "" + +#: src/FriendListCtrl.cpp:275 +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Peruuta" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"Et voi asettaa enempää kuin yhden kaveripaikan.\n" +" Asetettiin yksi paikka." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Monivalinta" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Tiedoston nimi" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Koko" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Tyyppi" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Tärkeys" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "Tiedostotunniste" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Pyynnöt" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Hyväksytyt pyynnöt" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Siirretty data" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Jakosuhde" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Hankitut osat" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Täysiä kopioita" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Kansiopolku" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Jaetut tiedostot" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Erittäin matala" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Matala" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normaali" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Korkea" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Erittäin korkea" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Julkaisu" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Automaattinen" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Lisää kommentti/luokitus" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Muuta kommenttia/luokitusta" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Uudelleennimeä" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Lisää tiedostot kokoelmassa siirtolistalle" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Kopioi magnet-&URI leikepöydälle" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Kopioi Ed2k-&linkki leikepöydälle" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Kopioi Ed2k-linkki työpöydälle (Lähde)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "Kopioi Ed2k-linkki leikepöydälle (Lähde) (Kryptaustiedoilla)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Kopioi Ed2k-linkki leikepöydälle (Isäntänimi)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "Kopioi Ed2k-linkki leikepöydälle (Isäntänimi) (Kyptaustiedoilla)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Kopioi Ed2k-linkki leikepöydälle (&AICH-tiedot)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Kopioi palaute leikepöydälle" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "Tarvitset HighID:een luodaksesi voimassa olevan lähdelinkin" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Varoitus" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Jaetut tiedostot (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[Osatiedosto]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Anna uusi nimi tälle tiedostolle:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Tiedoston uudelleennimeäminen" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Jatketaan tiedoston %s lähetyksiä" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Keskeytetään tiedoston %s lähetys" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: hakusana on liian lyhyt" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Virhe: Ei voida kuunnella TCP-porttia." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "Pyyntö ei onnistunut, virhe: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "Pyyntö ei onnistunut, tuntematon virhe." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "Indeksitiedostoa ei löydetty: " + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Ei voitu luoda web socket -säiettä\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Web-palvelin: Käynnistetty\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Sessio vanhentunut - pyydetään kirjautumista\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Sessio kunnossa, kirjautuneena\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Sessio kunnossa, ei kirjautuneena\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Ei avattua sessiota - tulee pyytämään kirjautumista\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Sessio luotu - pyytää kirjautumista\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Käsittelee pyyntöä [alkuperäinen]: " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Tarkistaa salasanaa\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Salasanatarkiste ei kelpaa\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Salasana hyväksytty\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Virheellinen salasana\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "Et antanut salasanaa. Tyhjä salasana ei ole sallittu.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Uloskirjautumista pyydetty\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Käsittelee pyyntöä [uudelleenohjattu]: " + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Lataa mallin " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Web-palvelimen HTTP-portti" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Käytä UPnP-porttiohjausta web-palvelimen portissa" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "UPnP-portti" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Käytä gzip-pakkausta" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Täyden käyttöoikeuden salasana web-palvelimelle" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Vieraan salasana web-palvelimelle" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Salli vieraskäyttö" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Estä vieraskäyttö" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "Hae/tallenna web-palvelimen asetukset etä-aMulesta/een" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "aMulen konfiguraatiotiedoston polku. ÄLÄ KÄYTÄ SUORAAN!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "Poista PHP-tulkki käytöstä (vanhentunut)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Uudelleenkoosta PHP-sivut joka pyynnöllä" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "aMule Web-Palvelin" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Ei saatavissa" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Ei koskaan" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Ladataan..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Asetukset" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "Tiedoston amulesig.dat sisältävä kansio" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Selaa" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Syötä tähän kansio jossa on amulesig.dat-tiedostosi" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Päivitysväli sekunteina" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Luo tilastokuva joka päivityksen yhteydessä" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "Syötä tähän kansio johon haluat tilastokuvan luotavan" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Lähetä tilastokuvasi toistuvasti FTP-palvelimelle" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "FTP-osoite" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "FTP-kansiopolku" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Syötä tähän FTP-palvelimen osoite" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "Syötä tähän kansio FTP-palvelimella mihin tilastokuvasi tallennetaan" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Käyttäjänimi" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Salasana" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Syötä tähän käyttäjänimi jota käytät kirjautuessasi FTP-palvelimelle" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Syötä tähän salasana jota käytät kirjautuessasi FTP-palvelimelle" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "FTP-päivityksien väli minuuteissa" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Tarkista oikeellisuus" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Kansio joka sisältää signeeraustiedostosi" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Kansio mihin luodaan tilastokuva" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i päivä(ä) %i tunti(a) %i minuutti(a) %i sekunti(a)" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, aMulen Online-Tilastotiedot" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Tervetuloa!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Suurin latausnopeus wxCasin käynnistämisestä lähtien" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "Suurin latausnopeus edellisten wxCasin ajokertojen aikana" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Tyhjennä" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "Järjestelmä" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Pysäytä Automaattinen Päivitys" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Tallenna Online-Tilastotietokuva" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Tulosta Online-Tilastotietokuva" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Asetus" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "Tietoja wxCasista" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Aloita Automaattinen Päivitys" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Automaattinen Päivitys pysäytetty" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Automaattinen Päivitys aloitettu" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Tallenna Tilastokuva" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Ei käsittelijää tälle tiedostotyypille." + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "Tiedostoa ei tallennettu" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "aMulen Online-Tilastotiedot" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Tulostamisessa oli ongelma.\n" +"Kenties tulostin ei ole asennettu oikein?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Tulostus" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, aMulen OnLine Signeeraus-Tilastotiedot\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pohjautuu CAS:iin jonka on tehnyt Pedro de Oliveira \n" +"\n" +"Jaetaan GPL:n alaisena" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Oi Oi, aMule ei ole käynnissä..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule on käynnissä" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule on käynnissä, mutta ei yhdistettynä" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule yhdistää..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Oi Oi, aMulen tila on tuntematon..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " on ollut käynnissä " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " on pysäytetty !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " ei ole yhdistetty !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " on yhdistämässä..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " on tekemässä jotain outoa, tarkista se !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " on yhdistetty: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "ok" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "palomuurattu" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "pois päältä" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " palvelimella " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +msgid " with " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Yhteensä Ladattu: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Lähetetty: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Istunnossa Ladattu: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Lataus: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " KiB/s, Lähetys: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +msgid " kB/s" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Jako: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " tiedosto(a), Asiakkaita jonossa: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Aika: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f KiB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " hetkellä " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Järjestelmän Kuormituskeskiarvo (1-5-15 min): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Järjestelmä päällä: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uvrk %02ut %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02ut %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "HighID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "LowID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Ei yhdistetty" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KiB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MiB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GiB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TiB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +msgid "Cancelled !" +msgstr "" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Ei voida avata %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "Tiedosto %s on liian iso Donkeylle: suurin mahdollinen on 4 GiB." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Syöteparametrit" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Tiedostosta Tarkiste" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Lisää Valinnaisia URLeja tälle tiedostolle" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Syötä tähän tiedosto josta haluat laskea Ed2k-linkin" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Syötä tähän URL jonka haluat lisätä Ed2k-linkkiin: Lisää / loppuun jotta " +"aLinkCreator voi lisätä tiedoston nimen" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Lisää" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Poista" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Pyyhi" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Luo linkki osatarkisteilla" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Auttaa levittämään uusia ja harvinaisia tiedostoja nopeammin, kustannuksena " +"linkin koon kasvu" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "MD4-Tiedostotarkiste" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "Ed2k-Tiedostotarkiste" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "Ed2k-linkki" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Käynnistä haku" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Tallenna" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Kopioi leikepöydälle" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Sulje" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Avaa tiedosto laskeaksesi sen ed2k-linkin" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Kopioi laskettu ed2k-linkki leikepöydälle" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Tallenna laskettu ed2k-linkki tiedostoon" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "Tietoja aLinkCreatorista" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Valitse tiedosto josta haluat laskea ed2k-linkin" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "Toistaiseksi ei mitään kopioitavaa !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Valitse tiedosto lasketulle ed2k-linkille" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Ei voitu avata " + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Ole hyvä ja syötä ei-tyhjä tiedoston nimi" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "Toistaiseksi ei mitään tallennettavaa !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, aMule ed2k-linkkien tekijä\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Bittikartat osoitteista http://www.everaldo.com, http://www.icomania.com\n" +"ja http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Jaetaan GPL:n alaisena" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Laskee tarkistetta..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Valmis %.2f sekunnissa" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "Olet jo lisännyt tämän URLin !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Ole hyvä ja syötä ei-tyhjä URL" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "Käsittelee tiedostoa numero %u: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "Olet pyytänyt osatarkisteita (Vain tiedostoille jotka ovat > 9.5 MiB)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Odota... " + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> Tiedostoa ei ole !\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, aMule ed2k-linkkien tekijä" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Auto [Ma]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Auto [No]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Auto [Ko]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Yhdistää" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Kysyy" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Yhdistää serverin kautta" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Jono täynnä" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "Jonossa" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Siirtää" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Ladataan tarkistejoukkoa" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Ei tarvittavia osia" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Ei voi yhdistää LowID:llä LowID:hen" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Liian monta yhteyttä" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Yhdistää Kadiin" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Liian monta Kad-yhteyttä" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Estetty" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Yhteysvirhe" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Etäjono Täysi" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "Vanha MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "Uusi MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "eMule-Yhteensopiva" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Paikallinen Palvelin" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Etäpalvelin" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Lähdevälitys" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Passiivinen" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Linkki" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Lähteitä" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Järjestelmän vakio" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Arabia" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Baski" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Bulgaria" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Katalaani" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Kiina (Yksinkertaistettu)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Kiina (Perinteinen)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Kroatia" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "Tsekki" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Tanska" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Hollanti" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Englanti (U.K.)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Viro" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Suomi" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Ranska" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Galicia (Galego)" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Saksa" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "Kreikka" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Unkari" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Italia" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Italia (Sveitsi)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "Japani" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Korea" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "Liettua" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "Norja (Nynorsk)" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Puola" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portugali" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Portugali (Brazilia)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Venäjä" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Slovenia" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Espanja" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "Ruotsi" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Turkki" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Ei voitu tunnistaa valittua selainta!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" +"TCP-portti ei voi olla korkeampi kuin 65532 koska serverin käyttämä UDP " +"socket on TCP+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Käytetään oletusporttia (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Palvelimen nimi" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Osoite" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Portti" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Kuvaus" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Viive" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Käyttäjiä" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Tiedostot" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Epäonnistunut" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Kiinteä" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Versio" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Olet yhdistettynä palvelimeen jota yrität poistaa. Katkaise yhteys ensin. " +"Palvelinta EI poistettu." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Info" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(Tuntematon nimi)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Oletko varma että haluat poistaa pysyvän palvelimen %s" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Kyllä" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Ei" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Kohteen '%s' avaaminen ei onnistunut" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Palvelimet (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Palvelin" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Yhdistä palvelimelle" + +#: src/ServerListCtrl.cpp:428 +msgid "Mark server as static" +msgstr "" + +#: src/ServerListCtrl.cpp:429 +msgid "Mark server as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:431 +msgid "Mark servers as static" +msgstr "" + +#: src/ServerListCtrl.cpp:432 +msgid "Mark servers as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:438 +msgid "Remove server" +msgstr "" + +#: src/ServerListCtrl.cpp:440 +msgid "Remove servers" +msgstr "" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Poista kaikki palvelimet" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Kopioi Ed2k-linkki leikepöydälle" + +#: src/ServerListCtrl.cpp:449 +msgid "Copy ED2k links to clipboard" +msgstr "" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Uudelleenyhdistä palvelimelle" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Oletko varma että haluat poistaa kaikki palvelimet?" + +#: src/ServerListCtrl.cpp:570 +msgid "Are you sure that you wish to delete the selected server?" +msgstr "" + +#: src/ServerListCtrl.cpp:572 +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Poissa käytöstä [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "Tämä on aMule %s ja pohjautuu eMuleen." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "Käynnissä %s" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" +"Vieraile nettisivulla http://www.amule.org tarkistaaksi uuden version " +"saatavuuden." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Kriittinen virhe: Ajastimen luominen epäonnistui" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "aMule etähallinta " + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Tilannevedos:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" +" 'Kaikkien alustojen' vertaisverkkoasiakas pohjautuen eMuleen \n" +"\n" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr " Verkkosivu: http://www.amule.org \n" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr " Foorumi: http://forum.amule.org \n" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" +" UKK: http://wiki.amule.org \n" +"\n" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr " Yhteydenotot: admin@amule.org (hallinnolliset asiat, englanniksi) \n" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" +" Tekijänoikeudet (C) 2003-2008 aMule-Tiimi \n" +"\n" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr " Osa aMulesta pohjautuu \n" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "Kademliaan: Vertaisreititys perustuen XOR-metriikkaan.\n" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr " Tekijänoikeudet (C) 2002 Petar Maymounkov\n" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr " http://kademlia.scs.cs.nyu.edu\n" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Viesti" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Tilanneteksti" + +#: src/amuleDlg.cpp:666 +msgid "ED2K: Connecting" +msgstr "" + +#: src/amuleDlg.cpp:670 +msgid "ED2K: Disconnected" +msgstr "" + +#: src/amuleDlg.cpp:676 +msgid "Kad: Firewalled" +msgstr "" + +#: src/amuleDlg.cpp:680 +msgid "Kad: Connected" +msgstr "" + +#: src/amuleDlg.cpp:685 +msgid "Kad: Connecting" +msgstr "" + +#: src/amuleDlg.cpp:689 +msgid "Kad: Off" +msgstr "" + +#: src/amuleDlg.cpp:718 +msgid "Stop the current connection attempts" +msgstr "" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Katkaise yhteys" + +#: src/amuleDlg.cpp:722 +msgid "Disconnect from the currently connected networks" +msgstr "" + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Yhdistä" + +#: src/amuleDlg.cpp:726 +msgid "Connect to the currently enabled networks" +msgstr "" + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Ylös: %.1f(%.1f) | Alas: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Ylös: %.1f | Alas: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | Yhdistetty)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | Ei yhdistetty)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Haluatko varmasti sulkea aMulen?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Lopettamisen varmistus" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Ei voitu päätellä komentoa selaimen suorittamiseksi." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "Teemakansiota '%s' ei ole olemassa" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "Varoitus: Ei voida avata tiedostoa '%s' luettavaksi" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Verkot" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Verkkoikkuna" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Haut" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Hakujen ikkuna" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Siirrot" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Siirrettävien tiedostojen ikkuna" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Jaettujen tiedostojen ikkuna" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Viestit" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Viestien ikkuna" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Tilastot" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Tilastokuvaajien ikkuna" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Asetuksien säätöikkuna" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Tuonti" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "Osatiedostojen tuontityökalu" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "Tietoja" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "Tietoja/Ohje" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Yleiset" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Yhteys" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Välityspalvelin" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Viestisuodatin" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Etähallinta" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Online-Signeeraus" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Kansiot" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Turvallisuus" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "Käyttöliittymä" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Sisuksen Viritys" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Tapahtumat" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Debuggaus" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Käyttäjän määrittelemä" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"aMule on käynnistettävä uudestaan näiden muutosten voimaansaattamiseksi:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- TCP-portti muuttui.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- UDP-portti muuttui.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"Palvelinlistan päivitysten hakulista on tyhjä.\n" +"'Palvelinlistan automaattinen päivitys käynnistettäessä' kytketään pois " +"päältä." + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"Olet sallinut etäyhteydet mutta et ole antanut salasanaa.\n" +"Etäyhteydet eivät ole mahdollisia ellei salasanaa ole annettu." + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- Kieli vaihtui.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- Väliaikaiskansio muuttui.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Ylös: 0,0 | Alas: 0,0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"Sekä Ed2k- että Kad-verkko on pois päältä.\n" +"Et voi yhdistää ennen kuin ainakin toinen niistä on sallittu." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"Kad ei käynnisty mikäli UDP-portti on pois päältä.\n" +"Salli UDP-portti tai kytke Kad pois päältä." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"Sinun on uudelleenkäynnistettävä aMule nyt.\n" +"Mikäli et uudelleenkäynnistä nyt, älä valita mikäli jotain pahaa tapahtuu.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "VAROITUS" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"Palvelinlistan päivitysten hakulista on tyhjä.\n" +"Ole hyvä ja syötä ainakin yksi URL joka osoittaa käypään server.met-" +"tiedostoon.\n" +"Klikkaa nappia \"Lista\" tämän valintaruudun vierestä syöttääksesi URLin." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "Väliaikaiset tiedostot" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Saapuvat tiedostot" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Online-Signeeraukset" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Valitse kansio kohteelle %s" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Selaa wav" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "Tiedosto wav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Etsi videosoitin" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Valitse selain" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Suoritettava tiedosto%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Muokkaa palvelinlistaa" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Syötä tähän URLit joista server.met-tiedostot haetaan.\n" +"Vain yksi urli riville." + +#: src/PrefsUnifiedDlg.cpp:980 +#, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:987 +#, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Yhteyskuvaajan skaala: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Palvelinyhteyden päivitysväli: Ei käytössä" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Suorita komento tapahtuman `%s' yhteydessä" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Mahdollista komentojen suorittaminen ytimestä" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Ytimen komento:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Mahdollista komentojen suorittaminen graafisesta käyttöliittymästä" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "Graafisen käyttöliittymän komento:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "Seuraavat muuttujat korvataan:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Luvaton yhteysyritys. Yhteys suljettu." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Etäyhteys suljettu." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "Etäyhteydet kielletty sillä salasana on tyhjä!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "Etäyhteydet estetty asetustiedostossa" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Uusi etäyhteys hyväksytty" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "Virhe: uutta etäyhteyttä ei voitu ottaa vastaan" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "Etäyhteys torjuttu koska salasana on tyhjä asetuksissa!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "Yhdistän asiakkaaseen: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Tuntematon versio" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"Epäkelpo etäversiotunniste, binäärinen epäyhteensopivuus on mahdollinen. " +"Käytä ydintä ja etäpäätettä samasta vedoksesta." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" +"Et voi yhdistää julkaisuversioon mielivaltaisella kehitysversiolla! *huoh* " +"mahdollinen kaatuminen estetty" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "Tunnistautuminen epäonnistui." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Väärä protokollaversio." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Puuttuva protokollan versiomerkintä." + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Epäkelpo pyyntö, sinun pitäisi ensin tunnistautua." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Pääsy myönnetty." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" +"Etäosatiedoston komento epäonnistui: Tiedostotarkistetta ei löytynyt: %s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "Tiedostotarkistetta ei löytynyt: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "Hupsis! Komentosanan käsittelyvirhe!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Palvelinta ei lisätty" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "palvelinta ei löytynyt: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "poistettava palvelin on määriteltävä" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "Ed2k on poistettu päältä asetuksissa." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "Haku on käynnissä. Nouda tuloksia kohta uudelleen!" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "Verkkohaku etäliittymästä ei ole mielekästä." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad on poistettu päältä asetuksissa." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Ei pisteitä kaavioon." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "Asiakasohjelmaasi ei ole asetettu tälle tarkkuustasolle." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "Etäyhteys: sulkemista pyydetty" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Sulkeminen on jo käynnissä." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "Etäyhteys: lisään linkkiä '%s'." + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Virheellinen linkki tai se on jo listalla." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "Tiedostoa ei löytynyt." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Epäkelpo tiedostonimi." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Tiedostoa ei voitu uudelleennimetä." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Ed2k on jo yhdistetty." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Yhdistää Ed2k:hon..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Kad on jo yhdistetty." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Yhdistää Kadiin..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Kaikki verkot ovat pois päältä." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Ed2k-yhteys katkaistu." + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Kad-yhteys katkaistu." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "Etäyhteys: vastaanotettiin epäkelpo komentosana: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "Epäkelpo komentosana (väärä protokollaversio?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" +"Tiedostoa '%s' ei voitu avata, poistetaan jaettujen tiedostojen listalta." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "Tarkistejoukkoa pyydettiin tuntemattomalle tiedostolle: %s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "" +"Komento `%s' prosessinumerolla `%d' on suoritettu tilannekoodilla `%d'." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "Palvelinta ei lisätty: IP:tä tai isäntänimeä ei annettu." + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "Palvelinta ei lisätty: Epäkelpo palvelinportti." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "Ed2k-tilanne:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Yhdistetty" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Portti" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Kademlian tilanne:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Käynnissä" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Tila:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Yhteys katkaistu" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Yhteyden tila:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Palomuurattu" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "OK" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Palomuurattu tilanne: " + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Yhdistetty kaveriin" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "Ei kaveria" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Keskimäärin käyttäjiä:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "Keskimäärin tiedostoja:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "Ei käynnissä" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Päälläoloaika: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Siirto" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Lähetykset" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Lähetetty data (Sessiossa (Yhteensä)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Otsikkotietoja yhteensä (Paketteja): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Tiedostopyyntöotsikkoja (Paketteja): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "Lähdevaihdon otsikkoja (Paketteja): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Palvelimen otsikkoja (Paketteja): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Kad-otsikkoja (Paketteja): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Lähetyksiä käynnissä: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Lähetyksiä odottamassa: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Onnistuneita lähetyksiä yhteensä: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Epäonnistuneita lähetyksiä yhteensä: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Keskimääräinen lähetysaika: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Lataukset" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Ladattu data (Sessiossa (Yhteensä)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Lähteitä löytynyt: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Latauksia käynnissä (paloja): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Session jakosuhde lähetys:lataus (Yhteensä): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Keskimääräinen latausnopeus (Sessiossa): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Keskimääräinen lähetysnopeus (Sessiossa): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Suurin latausnopeus (Sessiossa): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Suurin lähetysnopeus (Sessiossa); %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Uudelleenyhdistämisiä: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Aikaa ensimmäisestä siirrosta: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Yhdistetty palvelimeen: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Aktiivisia yhteyksiä (arvio): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Maksimimäärä yhteyksiä saavutettu: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Yhteyksiä keskimäärin (arvio): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Yhteyksiä enimmillään (arvio): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Asiakkaat" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Suodatettu" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Yhteensä: %i Tunnettuja: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Palvelimet" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Toimivia palvelimia: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Toimimattomia palvelimia: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Yhteensä: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Poistettuja palvelimia: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Suodatettuja palvelimia: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Käyttäjiä toimivilla palvelimilla: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "Tiedostoja toimivilla palvelimilla: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Käyttäjiä yhteensä: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "Tiedostoja yhteensä: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Palvelimien käyttö: %.2f% %" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Jaettuja tiedostoja: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Jaettujen tiedostojen yhteenlaskettu koko: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Keskimääräinen tiedostokoko: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "LowID: %u (%.2f%% Yhteensä %.2f%% Tunnettua)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "Turvattu tunnistus päällä/pois: %u (%.2f%%) : %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Käyttöjärjestelmä" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "Ei vastaanotettu" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Leikkaa" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Kopioi" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Liitä" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Valitse kaikki" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "Kad-hakua ei voida tehdä mikäli Kad ei ole päällä" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "Ed2k-hakua ei voida tehdä mikäli Ed2k ei ole yhdistettynä" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Odottamaton virhe Kad-hakua tehtäessä: " + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "Viesti suodatettu käyttäjältä '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "Viesti käyttäjältä '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "Käyttäjä %s (%u) kysyi listaa jaetuista tiedostoista -> Annettu" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "Käyttäjä %s (%u) kysyi listaa jaetuista tiedostoista -> Estetty" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "Käyttäjä %s (%u) kysyi listaa jaetuista kansioista -> Annettu" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "Käyttäjä %s (%u) kysyi listaa jaetuista kansioista -> Estetty" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"Käyttäjä %s (%u) kysyi listaa jaetuista tiedostoista kansiossa %s -> Annettu" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"Käyttäjä %s (%u) kysyi listaa jaetuista tiedostoista kansiossa %s -> Estetty" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "Käyttäjä %s (%u) jakaa kansiota %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "Käyttäjä %s (%u) lähetti jakolistan pyytämättä." + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "Käyttäjä %s (%u) lähetti jaettujen tiedostojen listan kansiolle %s" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "Käyttäjän %s (%u) jaettujen tiedostojen lista on lähetetty" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "Käyttäjä %s (%u) lähetti pyytämättä jaettujen tiedostojen listan" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" +"Käyttäjä %s (%u) on estänyt jaettujen kansioiden/tiedostojen listaamisen." + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Yhteyspisteitä (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "IP ei kelpaa yhdistämisavuksi" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Portti ei kelpaa yhdistämisavuksi" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Ole hyvä ja täytä kaikki vaaditut kentät" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Oletko varma että haluat ladata uuden nodes.dat-tiedoston?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" +"Tämä toiminto korvaa kaikki tunnetut yhteyspisteet ja uudelleenyhdistää " +"Kademlian." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Jatketaanko?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Virhe: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Varoitus: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Lisää kaveri" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Sinun on annettava kelvollinen IP ja portti!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Tietoa" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "Annettu käyttäjätarkiste ei ole kelvollinen!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Lähteet" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Tiedosto" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Lataa" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Luokittelu" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Kaikki" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Lataa luokassa" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "Hae tähän liittyviä tiedostoja (Ed2k, paikallinen palvelin)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "Merkitse tunnetuksi tiedostoksi" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Yhdistä etä-aMuleen" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Yhdistäminen epäonnistui " + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Virhe" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"VAROITUS: Et voi lisätä itseäsi lähteeksi ed2k-linkkiin kun sinulla on LowID." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Käyttäjiä E: %s K: %s | Tiedostoja E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Kaikki" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Käyttäjiä yhteensä: %s | Tiedostoja yhteensä: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Siirretty" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Valmiina" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Nopeus" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Edistyminen" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Tila" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Aikaa jäljellä" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Viimeksi nähty kokonaisena" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Viimeisin vastaanotto" + +#: src/DownloadListCtrl.cpp:578 +msgid "Are you sure that you wish to delete the selected file?" +msgstr "" + +#: src/DownloadListCtrl.cpp:580 +msgid "Are you sure that you wish to delete the selected files?" +msgstr "" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Lähetä viesti käyttäjälle" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Lähetettävä viesti:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "Py&säytä" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Tauota" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Jatka" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Vaihda jokainen A4AF tälle tiedostolle nyt" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Vaihda jokainen A4AF tälle tiedostolle nyt (Automaattinen)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Vaihda jokainen A4AF muille tiedostolle nyt" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Laajat asetukset" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Esikatsele" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Näytä tie&doston tiedot" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Näytä kaikki kommentit" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Kopioi magnet-URI leikepöydälle" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "poista luokittelu" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Luokittele" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "Avaa tied&osto" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Poista ystävistä" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Lisää kavereihin" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Lähetä viesti" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Vaihda tähän tiedostoon" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "KiB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "Jonossa: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Kysyttiin toista tiedostoa" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Lataukset (%i)" + +#: src/DownloadListCtrl.cpp:2222 +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Tiedoston esikatselu" + +#: src/DownloadListCtrl.cpp:2260 +#, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "Virhe: Osatiedostoa ei voi avata)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "VIRHE: osatiedoston luominen epäonnistui)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "Yritän ladata met-tiedoston varmuuskopion kohteesta %s" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "Virhe: part.met-tiedostoa ei avattu: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "Virhe: part.met-tiedosto on tyhjä: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "Virhe: Epäsopiva part.met-tiedostoversio: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" +"Virhe: %s (%s) on turmeltunut (väärä tagimäärä), tiedostoa ei voitu ladata." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "Yritän palauttaa tiedoston tietoja..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" +"Palautan nimetöntä tiedostoa - yritetään tallentaa nimelle RecoveredFile.dat" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "Saatavissa olevat tiedot palautettiin :D - Yritän käyttää niitä..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Tiedoston tietoja ei saatu palautettua :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Avaaminen epäonnistui: %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "Varoitus: %s voi olla turmeltunut (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "VIRHE osatiedostoa tallennettaessa: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "Pituutta ei saatu noudettua: '%s' - käytän %s tiedostoa." + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "'%s' on jostain syystä tyhjä - käytetään tiedostoa %s." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "Tiedoston part.met.seeds tallentaminen epäonnistui kohteelle %s" + +#: src/PartFile.cpp:1019 +#, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "Osatiedostolla %s (%s) ei ole lähdetiedostoa" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "Osatiedostolla %s (%s) on tyhjä lähdetiedosto" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "Virhe luettaessa osatiedoston lähdetiedostoa (%s - %s): %s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "Valmis osa (%i) kohteessa %s" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "Tarkiste uudelleenluotu: %s" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "" +"Odottamaton tiedostovirhe viimeistellessä tiedostoa %s. Tiedosto tauotettu" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Lataus suoritettu: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "Poistan tiedoston: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" +"Varoitus: Ei voitu laskea tarkistetta ladatusta osasta - tarkistejoukko on " +"puutteellinen kohteelle '%s'" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"Virhe: Ei voitu luoda tarkistetta ladatulle osalle - tarkistejoukko ei ole " +"täydellinen (%s). Näin ei pitäisi koskaan tapahtua." + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "VAROITUS: Levytilaa ei ole tarpeeksi! Tauotan tiedoston: %s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "Ladattu osa %i on turmeltunut tiedostossa: %s" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH: Palautettu turmeltunut osa %i kohteessa %s -> Säästetyt tavut: %s" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Riittämätön Levytila" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Pysäytetty" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "Varoitus: Tiedostoa known.met ei voida avata." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "Varoitus: Tunnettujen tiedosto on turmeltunut, virheelliset otsikot." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "IO-virhe luettaessa tiedostoa known.met: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "Virhe tallennettaessa tiedostoa known.met: %s" + +#: src/SharedFileList.cpp:352 +#, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "" +msgstr[1] "" + +#: src/SharedFileList.cpp:358 +#, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "" +msgstr[1] "" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "VIRHE! Yritettiin jakaa %s" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Tiedoston kommentit" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Luokitus" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Kommentti" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Ei kommentteja" + +#: src/CommentDialogLst.cpp:104 +#, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"Kätketyt yhteysyritykset palvelimille epäonnistuivat. Yritetään uudestaan " +"ilman kätkemistä." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "" +"Yhdistäminen kaikkiin listattuihin palvelimiin epäonnistui. Aloitetaan uusi " +"kierros." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "Ed2k-verkko kytketty pois päältä asetuksista, ei yhdistetä." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "Palvelinlistasta ei löytynyt toimivia palvelimia joihin yhdistää" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Yhdistetty %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Yhteys muodostettu: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"Kriittinen virhe yhdistettäessä. Internet-yhteys on mahdollisesti poikki" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Yhteys palvelimeen %s (%s:%i) katkesi" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) näyttää kuolleelta." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) on ilmeisesti täysi." + +#: src/ServerConnect.cpp:391 +#, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Yhteys katkesi" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "Yhdistäminen kohteeseen %s (%s:%i) epäonnistui." + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "Virhe: Socket virheellinen aikakatkaisutarkistuksessa" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "Yhteysyritys kohteeseen %s (%s:%i) aikakatkaistiin." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" +"Virhe: Varmuuskopiotiedostoa ei saatu ladattua! Katso sivuilta http://forum." +"amule.org ratkaisuja .part.met -palautukseen." + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Osatiedostoja ei löytynyt" + +#: src/DownloadQueue.cpp:175 +#, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "" +msgstr[1] "" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Ladataan %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Olet jo lataamassa tiedostoa '%s'" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Sinulla on jo tiedosto '%s'" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Lataat jo tiedostoa %s" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "Ei voitu kääntää magnet-linkkiä ed2k-linkiksi: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "Linkin protokolla tuntematon: %s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Virheellinen ed2k-linkki! Virhe: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "Suorita ja poistu." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Virheellinen IP-muoto. Käytä xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" + +#: src/TextClient.cpp:343 +msgid "Processing by hash: " +msgstr "" + +#: src/TextClient.cpp:358 +msgid "Processing by filename: " +msgstr "" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" +"Tälle komennolle on annettava parametri. Kelvollisia ovat: " +"tiedostotarkiste.\n" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Ei ole kelvollinen numero\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "Tarkiste ei ole kelvollinen (pituuden on oltava tasan 32 merkkiä)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "Toiminto onnistui." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "Pyyntö epäonnistui virheeseen: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "Asiakkaiden IP-suodatus on %s.\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "POIS PÄÄLTÄ" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "PÄÄLLÄ" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "Palvelimien IP-suodatus on %s.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "Nykyinen IP-suodatustaso on %d.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Kaistarajoitukset: Ylös: %u KiB/s, Alas: %u KiB/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Yhdistetty %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "LowID:llä" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "HighID:llä" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Yhdistän" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Ei yhdistetty" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Lataus:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Lähetys:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Asiakkaita jonossa:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Lähteitä yhteensä:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Hakutuloksia: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "KESKENERÄINEN - haun edistymisen näyttö" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Palvelin lähetti tunnistamattoman vastauksen, komentosana = %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Näytä tilannetiedot lyhyesti." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "Näyttää yhteyden tilan, nykyiset lähetys-/latausnopeudet, jne.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Näytä täydet tilastotiedot." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"Tälle komennolle voidaan antaa valinnaisesti parametrina luku väliltä 0-" +"255,\n" +"joka määrää kuinka monta merkintää asiakkaiden versiopuusta näytetään.\n" +"Luku 0 tai ei parametria tarkoittaa rajoittamattomasti.\n" +"\n" +"Esimerkki: 'statistics 5' näyttää vain viisi suosituinta versiota kustakin " +"asiakastyypistä.\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "Sulje aMule." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Sulje etäsuorituksessa oleva ydin (amule/amuled).\n" +"Tämä sulkee myös tekstikäyttöliittymän, koska se on käyttökelvoton ilman\n" +"suoritettavaa ydintä.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Lataa uudelleen annetun kohteen." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "Lataa uudelleen jaettujen tiedostojen listan." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "Lataa uudelleen IP-suodatustaulukon tiedostosta." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Yhdistää verkkoon." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"Tämä yhdistää kaikkiin verkkoihin jotka on sallittu asetuksista.\n" +"Voit myös antaa palvelimen muodossa IP:Portti yhdistääksesi vain\n" +"kyseiselle palvelimelle. IP:n on oltava pisteillä erotettu IPv4-numero\n" +"tai DNS-nimi." + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Yhdistä vain Ed2k:hon." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Yhdistä vain Kadiin." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Katkaise yhteys verkkoon." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "Tämä katkaisee yhteyden kaikkiin yhdistettyihin verkkoihin.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Katkaise vain Ed2k-yhteys." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Katkaise vain Kad-yhteys." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Lisää ed2k- tai magnet-linkin ytimelle." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"Lisättävä ed2k-linkki voi olla:\n" +"*) tiedostolinkki (ed2k://|file|...) ja se lisätään latauslistalle,\n" +"*) palvelinlinkki (ed2k://|server|...) ja se lisätään palvelinlistalle,\n" +"*) tai palvelinlistalinkki ja se kaikki palvelimet listalta lisätään\n" +" omalle palvelinlistalle.\n" +"\n" +"Magnet-linkin on sisällettävä ed2k-tarkiste ja tiedoston pituus.\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Aseta haluamasi asetukset." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "Aseta IP-suodatusasetukset." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "Kytke IP-suodatus päälle sekä asiakkaille että palvelimille." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "Kytke IP-suodatus pois päältä sekä asiakkailta että palvelimilta." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "Salli/estä asiakkaiden IP-suodatus." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "Kytke IP-suodatus päälle asiakkaille." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "Kytke IP-suodatus pois päältä asiakkailta." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "Salli/estä palvelinten IP-suodatus." + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "Kytke IP-suodatus päälle palvelimille." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "Kytke IP-suodatus pois päältä palvelimilta." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "Valitse IP-suodatuksen taso." + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"Sallitut suodatustasot ovat välillä 0-255 oletusarvon (myös lähtöarvon)\n" +"ollessa 127.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Aseta kaistankäytön rajoitukset." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "" +"Näille komennoille annettujen arvojen on oltava kilotavuja sekunnissa.\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Aseta lähetyskaistan raja." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "Aseta latauskaistan raja." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Näytä asetuksen arvo." + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "Hae IP-suodatuksen asetukset." + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "Hae IP-suodatuksen tila sekä asiakkaille että palvelimille." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "Hae IP-suodatuksen tila asiakkaille." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "Hae IP-suodatuksen tila palvelimille." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "Hae IP-suodatuksen taso." + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Hae kaistankäytön rajat." + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Tekee haun." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"Haun tyyppi on annettava:\n" +" GLOBAL (kaikkialta)\n" +" LOCAL (paikallinen)\n" +" KAD (vain kadista)\n" +"Esimerkki: 'search kad tiedosto' suorittaa kad-haun nimellä \"tiedosto\".\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Suorittaa haun kaikkialta." + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Suorittaa haun paikallisesti" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Suorittaa kad-haun" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Näyttää viimeisimmän haun tulokset." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Näyttää edellisen haun tulokset.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "Näyttää haun edistymisen." + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "Näyttää haun edistymisen.\n" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Aloittaa tiedoston lataamisen" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"Tiedoston numero viimeisimmästä hausta on annettava.\n" +"Esimerkki: 'download 12' aloittaa viimeisen haun tiedoston numero 12 " +"latauksen.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Tauota lataus." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Jatka latausta." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Peruuta lataus." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Aseta latauksen tärkeys." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "" +"Aseta tärkeys lataukselle, joko Alhainen, Normaali, Korkea tai " +"Automaattinen.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "Aseta tärkeys alhaiseksi." + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "Aseta tärkeys normaaliksi." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "Aseta tärkeys korkeaksi." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "Aseta tärkeys automaattiseksi." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Näytä jonot/listaukset." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Näyttää lähetys/latausjonon, palvelinlistan tai jaettujen tiedostojen " +"listan.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Näytä lähetysjono." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Näytä latausjono." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Näytä loki." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Näytä palvelinlista." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Nollaa loki." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "Vanhentunut komento, nykyään '%s'." + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" +"Tämä on vanhentunut komento ja se voidaan poistaa tulevaisuudessa.\n" +"Käytä sen sijaan '%s'.\n" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() palautti NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "Virhe: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "Varoitus: %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Uusi asiakastunnus on %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "VAROITUS: Sinulla on Low-ID!" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "" +"\tTodennäköisimmin tämä johtuu siitä että olet palomuurin tai reitittimen " +"takana" + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tLisätietoa http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "Tuntematon palvelintieto vastaanotettu! - liian lyhyt" + +#: src/ServerSocket.cpp:539 +#, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Palvelinlista tallennettu." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "Palvelin hylkäsi viimeisimmän komennon" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Virheellinen paketti saatu palvelimelta: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "Odottamaton virhe käsiteltäessä pakettia palvelimelta: %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "Ei voitu luoda DNS-selvittäjää yhdistäessä %s" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "Palvelin IP %s (%s) on suodatettu. Ei yhdistetä." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "käyttää protokollan kätkentää." + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "Yhdistää %s (%s - %s:%i) %s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "Ei voitu selvittää dns-nimeä palvelimelle %s: Ei voida yhdistää!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "" +"CIP2Country::CIP2Country(): Maatietojen lataaminen epäonnistui lähteestä " + +#: src/IP2Country.cpp:73 +#, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "" +msgstr[1] "" + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"Oletko varma että haluat perua ja poistaa kaikki tiedostot tässä luokassa?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Vaaditaan vahvistus" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Kaikki muut" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Keskeneräinen" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Aktiivinen" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Video" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Ääni" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Pakattu" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "CD-levykuvat" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Kuvat" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Teksti" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Valitse suodatin" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Lisää luokka" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Muokkaa luokkaa" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Poista luokka" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "Tuon %s: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "Luen väliaikaishakemistoa" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "Haen perustietoja ladatusta tietopaketista" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "Luon kohdetiedostoa" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "Lataan tiedot vanhasta lataustiedostosta (%u %u:sta)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "Tallennan datalohkon yhteen uuteen lataustiedostoon (%u %u:sta)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "Haen lähdelataustiedoston tietoja" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "Lisään latauksen ja tallennan uuden osatiedoston" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Haen tilannetietoa..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "Käynnissä" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Virhe: Levytila loppu" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Virhe: Tiedostoa part.met ei ole" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Virhe: IO-virhe!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Virhe: Epäonnistui!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "Jonossa" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Lataus on jo käynnissä" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Tuntematon tai käyttökelvoton väliaikaistiedostomuoto." + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Tiedoston nimi" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Tila" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Tiedostotarkiste" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Tuo osatiedostot" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"Valitse kansio josta etsitään väliaikaislatauksia (alikansiot sisällytetään " +"hakuun)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" +"Haluatko että lähteenä käytetyt tiedostot poistetaan onnistuneen tuonnin " +"jälkeen?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Poistetaanko lähteet?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Odottaa..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (Levy: %s)" + +#: src/OtherFunctions.cpp:121 +msgid "byte" +msgid_plural "bytes" +msgstr[0] "" +msgstr[1] "" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "KiB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MiB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GiB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TiB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "" +msgstr[1] "" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MiB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "s" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "m" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "tuntia" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "päivää" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Videot" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Pakatut" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Tekstiä" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Ohjelmat" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Kaikki" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Ei luokitusta" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Epäkelpo / Turmeltunut / Väärennös" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Huono" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Kohtalainen" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Hyvä" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Erinomainen" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "kaikki" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "kaikki muut" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "Lataan IP-suodattimet 'ipfilter.dat' sekä 'ipfilter_static.dat'." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "Ipfilter.dat-tiedoston '%s' lataaminen epäonnistui, muoto tuntematon." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" +"Ipfilter.dat-tiedoston '%s' lataaminen epäonnistui, tiedostoa ei voitu avata." + +#: src/IPFilter.cpp:330 +#, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +msgstr[1] "" + +#: src/IPFilter.cpp:332 +#, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +msgstr[1] "" + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Aktiiviset yhteydet: (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Tiedoston tiedot" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% valmiina" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "Ed2k-linkki: " + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Suorita" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "Klikkaa tästä lisätäksesi ed2k-linkin tekstikentästä latauslistaasi." + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "Ponnauta tilanneteksti nähtäville" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Lataa ..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"Tapahtumat näytetään tässä. Nähdäksesi täyden listan tapahtumista, katso " +"loki Palvelimet-välilehdeltä." + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Käyttäjien määrä palvelimella johon olet yhteydessä ..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Käyttäjiä: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" +"Yhdistettyjen käyttäjien määrä nykyisellä palvelimella sekä arvio kaikkien " +"käyttäjien määrästä." + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"Nykyiset keskimääräiset lähetys- ja latausnopeudet. Mikäli aktivoitu, " +"numerot suluissa näyttävät asiakasyhteyksien otsikkotietojen nopeuksia." + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"Näyttää yhteyden tilan ja aktiiviset siirrot. Punaiset nuolet osoittavat " +"että et ole yhdistetty, keltaiset nuolet että sinulla on LowID (olet " +"palomuurin takana) ja vihreät nuolet että sinulla on HighID (paras " +"yhdistettävyys)." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Ei yhdistetty ..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Palvelin johon yhdistetty." + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Etsi" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Nimi:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Paikallinen" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Kaikkialta" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "Tiedostotarkiste" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Laajat parametrit" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Suodatus" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Tiedostotyyppi" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Pääte" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Vähimmäiskoko" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Tavua" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KiB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Enimmäiskoko" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Saatavuus" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Suodatin:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Suodata tulokset" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Käännä tulos" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Piilota tunnetut tiedostot" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Hae lisää" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "Hakee enemmän tuloksia Ed2k:sta. Ei vielä tuettuna Kadissa." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Pysäytä" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Nollaa kentät" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Tulokset" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Siivoaa valmistuneet lataukset pois näkyvistä" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Näytä lähetykset / lähetysjono" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Asiakkaita jonossa :" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Lähetä" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Lähettää annetun viestin." + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Sulje" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Sulje tämä keskustelu." + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Koko nimi :" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "Ei saatavilla" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "Osatiedosto (met) :" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Tarkiste :" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Tiedostokoko :" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Osatiedoston tila :" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Viimeksi nähty kokonaisena :" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Löydetyt lähteet :" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Siirtäviä lähteitä :" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Osien määrä :" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Saatavilla :" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Siirtonopeus :" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Lataus ollut aktiivisena: " + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Siirretty :" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Valmiina :" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Älykäs turmeltumien käsittely (I.C.H.)" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Menetetty turmeltumille :" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Pakkaamalla saatu hyöty :" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "Pelastetut paketit (I.C.H.) :" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Tiedostonimet" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Muuta nimi" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Siivoa" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Käytä" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Ok" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "Kommentoi/luokittele tiedosto (Teksti näkyy kaikille käyttäjille)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"Elokuvasta voit kertoa sen pituuden, juonen sekä kielen\n" +"ja jos se on väärennös, voit kertoa sen muille aMulen käyttäjille." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Tiedoston laatu" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" +"Valitse tiedoston luokitus tai ilmoita muille käyttäjille jos tiedosto on " +"viallinen ..." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Ei kommentteja" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Päivitä" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Lataan, odota hetki ..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Koko on tuntematon" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Vaadittavat tiedot" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "IP-osoite :" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Portti :" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Lisätiedot" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Käyttäjänimi :" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Käyttäjätarkiste :" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Uudelleenlataa jaetut tiedostot" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Nykyinen sessio" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Yhteensä" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Pyydetty :" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Aktiiviset lähetykset :" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Latausnopeus" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Nykyinen" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Yhtäjaksoinen keskiarvo" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Session keskiarvo" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Lähetysnopeus" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Yhteydet" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Aktiiviset lataukset" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Aktiiviset yhteydet (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Aktiiviset lähetykset" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Tilastopuu" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Käyttäjänimi:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Käyttäjätarkiste:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Asiakasohjelma:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Asiakasversio:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "IP-osoite:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "Käyttäjätunniste:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "Palvelimen IP:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Palvelimen nimi:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "Siirrot asiakkaalle" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Nykyinen pyyntö:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Keskimääräinen lähetysnopeus:" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Keskimääräinen latausnopeus:" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Lähetetty (sessiossa):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Ladattu (sessiossa):" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Lähetetty (yhteensä):" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Ladattu (yhteensä):" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Pisteet" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "Lähetys/vastaanotto-määre:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Turvattu tunnistus:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Luokitus (yhteensä):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Jonopisteet:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Yleiset asetukset" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Nimimerkki" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - Linuxin Muuli" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "Tämä on nimi jonka muut käyttäjät näkevät yhdistäessään sinuun." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Kieli" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "Tämä määrittää kontrolleissa käytetyn kielen." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Yleiset asetukset" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Tarkista uuden version saatavuus käynnistettäessä" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" +"aMule tarkistaa käynnistyessään uuden version olemassaolon kun tämä on " +"päällä." + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Aloita pienennettynä" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "Tämä päällä aMule pienentää itsensä käynnistyessään." + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Vahvista sulkeminen" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "Suljettaessa aMule kysyy varmistuksen." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Näytä kuvake palkissa" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "" +"Tämä sallii tai estää kuvakkeen näyttämisen järjestelmä-/tehtäväpalkissa." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "Pienennä palkkikuvakkeeksi" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "Tämä päällä aMule pienentyy järjestelmäpalkkiin tehtäväpalkin sijaan." + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Työkaluvihjeen viive sekunteina" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "Viive työkaluvihjeiden näyttämiseen." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Selaimen valinta" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Valitse selaimesi tässä" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Muu selain:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Syötä selaimesi nimi tähän. Käyttääksesi jotain muuta selainta valitse Muu " +"yläpuolelta pudotusvalikosta." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Avaa uuteen välilehteen mikäli mahdollista" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" +"Avaa verkkosivun uuteen välilehteen uuden ikkunan sijaan kun se on " +"mahdollista" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Yhteyden rajat" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Lähetys" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Paikkavaraus" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Linjan kapasiteetit" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" +"Huomio: Näitä arvoja\n" +"käytetään vain tilastoissa." + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Vakio asiakas-TCP-portti:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "Tämä on vakio ed2k-portti eikä sitä voi kytkeä pois päältä." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Laajennettu asiakas-UDP-portti:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" +"Tätä UDP-porttia käytetään laajennettuihin ed2k-pyyntöihin sekä Kad-verkossa." + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "estä" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Sido verkkoliitäntään" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "UDP-portti laajennettuihin palvelinpyyntöihin (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Lähteitä enintään tiedostoa kohti" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Pysyvä rajoitus" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Yhteyksien rajoitus" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Yhteyksiä enintään" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Universal Plug and Play" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "Käytä UPnP:tä" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "UPnP TCP-portti:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Yhdistä automaattisesti käynnistettäessä" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Yhdistä uudelleen yhteyden katketessa" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Näytä otsikkotietoihin kuluva kaista" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Palvelimen valinnat" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Poista toimimattomat palvelimet" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "yrityksen jälkeen" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Päivitä palvelinlista käynnistettäessä" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Lista" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Päivitä palvelinlista yhdistettäessä palvelimelle" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Päivitä palvelinlista asiakkaan yhdistäessä" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Käytä tärkeysjärjestystä" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Käytä älykästä LowID-tarkistusta yhdistettäessä" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Turvallinen yhdistäminen" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Yhdistä automaattisesti vain pysyville palvelimille" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Aseta käsin syötetyt palvelimet korkealle tärkeydelle" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "I.C.H. aktiivinen" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICH luottaa kaikkiin tarkisteisiin (ei suositella)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Lisää tiedostot lataukseen tauotettuna" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Lisää tiedostot lataukseen tärkeys automaattisella" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Yritä ladata ensimmäiset ja viimeiset palat ensin" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Lisää uudet jaetut tiedostot tärkeys automaattisella" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Yritä siirtää kokonaisia paloja lähetettäessä" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Aloita seuraava tauotettu tiedosto edellisen valmistuttua" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "Samasta luokasta" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "Tallenna 10 lähdettä harvinaisille tiedostoille (< 20 lähdettä)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Levytila" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Tarkista levytila" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "Valitse tämä mikäli haluat aMulen tarkistavan vapaan levytilan määrän" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Levytilaa vähintään:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Syötä tähän levytila jonka haluat jättää vapaaksi." + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "MiB" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Saapuvien kansio :" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Väliaikaiskansio :" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Jaetut kansiot" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "" +"(Klikkaa oikealla painikkeella kansion kuvaketta jakaaksesi rekursiivisesti)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Jaa piilotiedostot" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Videotoistin" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Tee kopio esikatselua varten" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Kuvaajat" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Päivitysväli : 5 sekuntia" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Keskimääräiskuvaajan aika: 100 minuuttia" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Yhteyskuvaajan Skaala: 100 " + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Valitse tilastojen värit" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Taustaväri" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Ruudukko" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Hetkittäinen lataus" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Latauksen yhtäjaksoinen keskiarvo" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Latauksen keskiarvo sessiossa" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Hetkittäinen lähetys" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Lähetyksen yhtäjaksoinen keskiarvo" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Lähetyksen keskiarvo sessiossa" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Aktiiviset yhteydet" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Järjestelmäpalkin nopeusnäyttö" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Kad-yhteyksiä tällä hetkellä" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Kad-yhteyksiä aktiivisena" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Kad-yhteyksiä sessiossa" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Valitse" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Näytettävien asiakasversioiden määrä (0=rajoittamattomasti)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Ilmoitukset" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Viestien ponnahdus" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Käytä ääniä" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Ponnahda kun :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Uusi merkintä logissa" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Aloittaa uuden juttelun" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Uusi viesti vastaanotettu" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Lataus lisätty tai valmistuu" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Uusi versio aMulesta havaittu" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "Kiireellinen OOD, yhteys palvelimeen katkennut" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Ilmoita sähköpostilla" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Lähetä sähköposti kun lataus valmistuu." + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "SMTP-palvelin :" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "Sähköpostiosoite :" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! VAROITUS !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Älä koske näihin asetuksiin ellet tiedä mitä\n" +"olet tekemässä, muuten voit helposti\n" +"hankaloittaa omia asioitasi.\n" +"\n" +"aMule toimii hyvin vaikka näitä ei\n" +"säädettäisikään." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Laajennetut asetukset" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Enimmäismäärä uusia yhteyksiä / 5 s" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Tiedostopuskurin koko: 240000 tavua" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Lähetysjonon koko: 5000 asiakasta" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Palvelinyhteyden päivitysväli: Poissa käytöstä" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "Käyttöliittymä" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Latausjonon tiedostojen edistyminen" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Näytä prosenttiosuus" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Näytä edistymispalkki " + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Edistymispalkin tyyli" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Tasainen" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Pyöreä" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Teematuki" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Salli teeman muuttaminen " + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Teema:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- teemoja ei ole saatavilla -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Sarakkeiden lajittelu" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "" +"Järjestä latausjonon tiedostot automaattisesti (Iso suorittimen käyttö)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "aMule järjestää sarakkeet latauslistassasi automaattisesti" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Käyttöliittymä, muut" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Näytä nopea Ed2k-linkkien käsittelijä" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Näytä laajennetut tiedot luokitteluvälilehdillä" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Näytä siirtonopeudet otsikossa" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Pystysuuntainen työkalupalkki" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Näytä osatiedoston numero ennen tiedoston nimeä" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Etähallinta" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Web-palvelimen asetukset" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Suorita amuleweb käynnistettäessä" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Web-palvelimen portti" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "Salli UPnP-porttiohjaus web-palvelimen portille" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Web-palvelimen UPnP TCP-portti" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Sivun päivitysväli (sekunneissa)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Salli gzip-pakkaus" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Salli rajoitettujen oikeuksien käyttäjä" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Täysien oikeuksien salasana" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Rajoitettujen oikeuksien salasana" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Web-sapluuna" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Etäyhteyksien asetukset" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Hyväksy etäyhteydet" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"Kuunneltavan liitännän IP\n" +"(tyhjä tarkoittaa kaikkia)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Syötä tähän sen verkkoliitännän ip jota kuunnellaan etäyhteyksiä varten. " +"Tyhjä tai 0.0.0.0 tarkoittaa kaikkia verkkoliitäntöjä." + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "TCP-portti" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "Kytke päälle UPnP-portinohjaus etäyhteysportissa" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "Napsauta tästä saattaaksesi voimaan asetuksiin tehdyt muutokset." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Nollaa asetuksiin tekemäsi muutokset." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Otsikko :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Kommentti :" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Saapuvien kansio :" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Vaihda tärkeyttä uusille sijoitetuille tiedostoille :" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Älä vaihda" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Valitse väri tälle luokalle (valittuna) :" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Näytä palvelimen päivän viesti yhdistettynä ..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Palvelimen tiedot" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Napsauta tätä painiketta nollataksesi lokin." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "aMule loki" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "Napsauta tätä nappia päivittääksesi palvelinlistan osoitteesta ..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Palvelinlista" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Syötä tähän server.met-tiedostoon osoittava url ja paina nappia vasemmalla " +"päivittääksesi tunnettujen palvelimien listan." + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Palvelimen lisäys käsin : Nimi" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Syötä uuden palvelimen nimi tähän" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Syötä uuden palvelimen IP tähän, muodossa x.x.x.x." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Syötä palvelimen portti tähän." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "Lisää palvelin käsin (täytä vasemmalla olevat kentät) ..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "Ed2k Info" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Kad Info" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"Valittu maa-asetus ei näytä olevan asennettuna järjestelmääsi.\n" +"Sinun on luotava se käyttääksesi tätä kieltä.\n" +"Linux-järjestelmissä hyvä alku on tiedosto /etc/locale.gen ja paketti " +"'locales'.\n" +"Hyvää tuuria!\n" +"(Huom: Yritän asettaa sen kuitenkin)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Älä näytä tätä enää uudestaan" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "" +"Napsauta tätä nappia päivittääksesi yhteyspisteiden listan osoitteesta ..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Yhteyspisteitä (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"Syötä tähän nodes.dat-tiedostoon osoittava url ja paina nappia vasemmalla " +"päivittääksesi tunnettujen yhteyspisteiden listan." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Yhteyspisteiden tilastot" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Yhdistämisapu" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Uusi yhteyspiste" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Portti:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Käytä tunnettuja \n" +"asiakkaita yhdistämisapuna" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Katkaise Kad-yhteys" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Protokollan kätkeminen" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Tuki protokollan kätkemiselle" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"Tämä valinta sallii aMulen ottaa vastaan kätketyn protokollan yhteyksiä " +"muilta asiakkailta." + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Käytä kätkemistä lähtevissä yhteyksissä" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"Tämä valittuna aMule käyttää protokollan kätkemistä ottaessaan yhteyttä " +"muihin asiakkaisiin/palvelimiin." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Vastaanota vain kätkettyjä yhteyksiä" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"Tämä valittuna aMule hyväksyy vain kätketyt yhteydet. Lähteitä on vähemmän " +"saatavilla mutta kaikki liikenteesi on kätketyllä protokollalla." + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Tiedostoasetukset" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Kaikki" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Ei kukaan" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Ketkä näkevät jaetut tiedostosi:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "" +"Valitse ketkä voivat pyytää nähtäville sinun jaettujen tiedostojen listaasi." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "IP-suodatus" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Suodata asiakkaat" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Salli asiakas-IP:den suodatus kuten määritelty tiedostossa ~/.aMule/ipfilter." +"dat." + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Suodata palvelimet" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Salli palvelin-IP:den suodatus kuten määritelty tiedostossa ~/.aMule/" +"ipfilter.dat." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Uudelleenlataa lista" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "" +"Uudelleenlataa suodatettavien IP:den lista tiedostosta ~/.aMule/ipfilter.dat." + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Päivitä nyt" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Päivitä ip-suodatus automaattisesti käynnistettäessä" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Suodatustaso:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Suodata aina lähiverkon IP:t" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Käsittele muut IP:t vainoharhaisesti" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Hylkää paketit mikäli asiakkaan ip on eri kuin mistä paketti saapui. Käytä " +"varoen." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "Käytä järjestelmänlaajuista ipfilter.dat-tiedostoa mikäli saatavilla" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" +"Mikäli paikallista ipfilter.dat:ia ei löydy, käytetään järjestelmänlaajuista " +"ipfilter.dat-tiedostoa." + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "Käytä turvattua käyttäjän tunnistusta" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" +"Tunnistuksen käyttö on suositeltavaa. Muuten et hyödy pistejärjestelmästä." + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Kytke päälle/pois" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Kytke Online-Signeeraus päälle" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Kytkee päälle Online-Signeeraustiedoston kirjoittamisen, jota muut ohjelmat " +"voivat käyttää esimerkiksi signeerauksissa." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Päivitysväli (sekuntia):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "Muuttaa Online-Signeerauksen päivitysväliä, annetaan sekunteina." + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Online-Signeerauksen kansio:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "Napsauta tästä valitaksesi kansio Online-Signeerauksen tiedostoille." + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Kytke pois/päälle" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "Suodata saapuvat viestit (ei koske keskusteluja):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Suodatuksen vaihtoehdot:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Suodata kaikki viestit" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Suodata viestit ihmisiltä jotka eivät ole kaverilistallasi" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Suodata viestit tuntemattomilta asiakkailta" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Suodata viestit jotka sisältävät (käytä merkkiä ',' erottimena):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"Syötä tähän suodatettavat sanat ja aMule estää viestit jotka sisältävät " +"sellaisen" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Kommentit" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "Suodata kommentit jotka sisältävät (käytä merkkiä ',' erottimena):" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Käytä välityspalvelinta" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Kytke päälle/pois välityspalvelimen tuki" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Tyyppi:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "Yhdistettävän välityspalvelimen tyyppi" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Isäntänimi:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "Välityspalvelimen isäntänimi" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Portti:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "Välityspalvelimen portti" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Tunnistautuminen" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Käytä tunnistautumista" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Kytkee päälle/pois käyttäjänimellä/salasanalla tunnistautumisen" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "Käyttäjänimi tunnistautuessa välityspalvelimelle" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Salasana:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "Salasana tunnistautuessa välityspalvelimelle" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Automaattinen palvelinyhteys ilman välityspalvelinta" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Yhdistä:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Kirjaudu etä-aMuleen" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Käyttäjänimi" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Muista nämä asetukset" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Käytä monisanaista lokiin kirjausta." + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "Viestien luokat:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "Lisää tuonteja" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Yritä uudelleen valittuja" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Poista valitut" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Tapahtumatyypit" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Yhdistä mihin tahansa palvelimeen ja/tai Kadiin" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Uusi luokka" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Valitse kansio saapuville tiedostoille" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Sinun on annettava nimi luokalle!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Sinun on annettava polku luokalle!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "Saapuvien kansion luonti luokalle epäonnistui. Anna kelvollinen polku!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "Tuntematon laajennos '%s' komennolle '%s'.\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "Tuntematon komento '%s'.\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"Tälle komennolle ei voi antaa parametria.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"Tälle komennolle on annettava parametri.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Tämä komento on puutteellinen, sinun on käytettävä jotakin alla olevista " +"laajennoksista.\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Mahdolliset laajennokset:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Käytettävissä olevat komennot:\n" + +#: src/ExternalConnector.cpp:188 +#, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Poistuu sovelluksesta." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Näyttää ohjeen." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"Saadaksesi ohjeen komennosta, kirjoita 'help '.\n" +"Saadaksesi listan komennoista kirjoita 'help'.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"Käytä '%s' listataksesi komennot\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Syntaksivirhe!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Virhe käsiteltäessä komentoa - näin ei pitäisi tapahtua! Ole hyvä ja " +"raportoi tästä\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Tämä komento ei tarvitse parametreja." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Tälle komennolle on annettava parametri." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Virheellinen parametri." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Komento on puutteellinen." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Kirjoita '%s' saadaksesi lisää ohjeita.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "Tämä on %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "Tämä on %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Luon asiakasta...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "Yhteysyritys epäonnistui. Annettuun isäntään ei saatu yhteyttä\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"Ok, suljen %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"Tyhjällä salasanalla ei voida yhdistää.\n" +"Sinun on annettava salasana joko asetustiedostossa,\n" +"komentorivillä tai annettava se kysyttäessä.\n" +"\n" +"Suljen...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Näytä tämä ohje." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "Isäntäkone jossa aMule on käynnissä. (oletus: localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "aMulen portti etäyhteydelle. (oletus: 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Etäyhteyden salasana." + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Lue asetukset tiedostosta." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "Älä tulosta mitään stdout:iin." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Ole monisanainen - näytä myös virheenetsintäviestit." + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Asettaa ohjelman maa-asetukset (kielen)." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "Kirjoita komentoriviparametrit asetustiedostoon." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "Luo asetustiedoston perustuen aMulen asetustiedostoon." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Näyttää ohjelman version." + +#: src/ClientCreditsList.cpp:168 +#, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "" +msgstr[1] "" + +#: src/ClientCreditsList.cpp:171 +#, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] "" +msgstr[1] "" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "Tiedostoa 'cryptkey.dat' ei löydetty, luodaan." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"VIRHE: aMule-taustaprosessia ei voida käyttää kun etäyhteydet ovat poissa " +"päältä. Etäyhteyksien päälle kytkemiseksi käytä normaalia aMulea, käynnistä " +"amuled parametrilla --ec-config tai aseta avain \"AcceptExternalConnections" +"\" arvoon 1 tiedostossa ~/.aMule/amule.conf" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "VIRHE: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Salli" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Näytä lähetykset" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Näytä jono" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Näytä asiakkaat" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Valitse näkymä" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Asiakasohjelma" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Odottanut" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Lähetysaika" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Lähetetty/vastaanotettu" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Etäpään tilanne" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "Jonossa: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Tiedoston tärkeys" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Pisteet" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Kysytty" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Viimeksi nähty" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Saapunut jonoon" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Lähetyksen tilanne" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Lähetetty" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Latauksen tilanne" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Ladattu" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Käyttäjätarkiste" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Salattu" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Piilota jaetut tiedostot" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Asiakkaan tiedot" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f KiB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Ei tuettu" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Ei vielä valmis" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Pahis" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Vahvistettu - OK" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Ei saatavilla" + +#: src/ClientDetailDialog.cpp:190 +#, c-format +msgid "%u (QR: %u)" +msgstr "" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" +"Vähimmäiskoon pitää olla pienempi kuin enimmäiskoon. Enimmäiskokoa ei " +"huomioida." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Hakuvaroitus" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Rajoittamaton" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "aMulen palkkivalikko" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Nopeusrajoitukset:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "Ylös: Ei ole" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "Ylös: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "Alas: Ei ole" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "Alas: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Latausnopeus: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Lähetysnopeus: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Asiakkaan tiedot" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Nimimerkki: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "Nimimerkkiä ei ole valittu!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "Asiakastunnus: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Palvelinnimi: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "Palvelin-IP: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "TCP-port: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "TCP-portti: Ei valmis" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "UDP-port: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "UPD-portti: Ei valmis" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Online-Signeeraus: Käytössä" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Online-Signeeraus: Pois päältä" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Jaettuja tiedostoja: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Asiakkaita jonossa: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "Yht alas: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "Yht ylös: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Lähetysraja" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Latausraja" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "Piilota aMule" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "Näytä aMule" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "Keskustelu aloitettu: %s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Yhdistetty asiakkaaseen ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** Yhdistää asiakkaaseen ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Asiakkaaseen yhdistäminen epäonnistui / Yhteys katkesi ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Sulje välilehti" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Sulje kaikki välilehdet" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Sulje muut välilehdet" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "Lataan tiedostoa server.met: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "Tiedostoa server.met ei löytynyt!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "Server.met-tiedoston '%s' lataus epäonnistui, tuntematon muotoilu." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "Server.met:in avaus epäonnistui!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "Server.met on turmeltunut, virheellinen versiotunniste: 0x%x, koko %i" + +#: src/ServerList.cpp:168 +#, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerList.cpp:170 +#, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Palvelinta ei lisätty: [%s:%d] ei määritä kelvollista porttia." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "Palvelinta ei lisätty: IP [%s:%d] on suodatettu tai virheellinen." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" +"Palvelinta ei lisätty: IP:porttia [%s:%d] vastaava palvelin on jo listalla." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Palvelin lisätty: Palvelin [%s:%d] on nimeltään '%s'." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"Olet yhdistettynä palvelimeen jota yrität poistaa, katkaise yhteys ensin." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Server.met:n tallennus epäonnistui!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "Virheellinen URL" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "Palvelinlista ladattu osoitteesta %s" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Palvelinlistan %s lataus epäonnistui" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"Palvelinlistan osoitetta ei löydetty tiedostosta 'addresses.dat'. Ole hyvä " +"ja liitä kelvollinen palvelinlistan osoite tähän tiedostoon palvelinlistan " +"automaattiseksi päivittämiseksi" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "Aloita palvelinlistan lataus osoitteesta %s" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "Varoitus, palvelinlistan automaattisen päivityksen url ei kelpaa: %s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" +"Addresses.dat-tiedostosta ei löytynyt kelvollisia urleja server.met:in " +"automaattilataukselle" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "Paikallinen palvelin IP-suodatetaan, yhdistän toiselle palvelimelle!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "Komennon '%s' suoritus epäonnistui tapahtuman '%s' yhteydessä." + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"Maa-asetuksesi vaihdettiin järjestelmän oletuksiksi asetusmuutoksen takia. " +"Pahoittelen." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"Palvelinlistallasi ei ole palvelimia.\n" +"Haluatko että aMule lataa uuden listan nyt?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Palvelinlistan lataus" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "web-palvelin käynnissä prosessinumerolla %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"Olet asettanut web-palvelimen ajettavaksi käynnistettäessä, mutta amuleweb-" +"ohjelmaa ei voida ajaa. Ole hyvä ja asenna aMule web-palvelimen sisältävä " +"paketti tai käännä aMule käyttäen parametria --enable-webserver ja suorita " +"make install" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "Portti %u ei ole saatavilla. Sinulle annetaan LowID\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"Portti %u ei ole saatavilla!\n" +"\n" +"Tämä tarkoittaa että sinulle annetaan LowID.\n" +"\n" +"Tarkista yhteytesi varmistaaksesi että portti on avoinna sekä ulos että " +"sisään." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Online-Signeeraustiedoston luonti epäonnistui" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "aMulen Online-Signeeraustiedoston luonti epäonnistui" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"Valittu maa-asetus ei näytä olevan asennettuna järjestelmääsi. (Huom: Yritän " +"asettaa sen kuitenkin)" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "Tämä on ensimmäinen kerta kun käynnistät aMule %s" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "Tämä versio on testiversio jota päivitetään päivittäin,\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "emmekä me anna takuuta ettei se riko mitään, polta taloasi,\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" +"tai tapa koiraasi. Mutta sen *pitäisi* olla silti turvallinen käyttää.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "Seuraavat asetukset on muutettu tähän julkaisuun turvallisuussyistä:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* Lisätty protokollan kätkemisen tuki saapuville sekä lähteville " +"yhteyksille.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* Estetty palvelinlistan päivittäminen muilta palvelimilta ja asiakkailta.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"Saadaksesi lisätietoa näiden muutosten syistä, etsi\n" +"aMulen wikistä osoitteessa http://wiki.amule.org \"fake servers\"-tietoa.\n" +"On tärkeää että puhdistat palvelinlistaltasi huijauspalvelimet jotta aMule " +"toimii oikein." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Lisätietoa, tukea ja uudet julkaisut löytyvät kotisivuiltamme osoitteessa\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" +"http://www.aMule.org, tai IRC-kanavaltamme #aMule palvelimella irc.freenode." +"net (englanniksi).\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Voit vapaasti raportoida bugeista osoitteessa http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"Online-Signeeraukselle asettamasi kansio ei ole kelvollinen!\n" +" Online-Signeeraus kytketään pois päältä kunnes korjaat asian asetuksista." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "VIRHE: Lokitiedostoa ei voida avata" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "VAROITUS: Lokitiedosto on tyhjä. Jotain on pielessä." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Loki nollattiin" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "Palvelimen viesti: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Yhteyspisteiden listan lataus epäonnistui." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Ladatun versiotarkistustiedoston avaus epäonnistui" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Turmeltunut versiotarkistustiedosto" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Käytät vanhentunutta versiota aMulesta!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "Tämän aMulen versio on %i.%i.%i ja uusin versio on %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "Uusin version löytyy aina osoitteesta http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "VAROITUS: aMulesi versio on vanhentunut: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "aMulesi on uusinta versiota." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Versiotarkistustiedoston lataus epäonnistui" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Yhdistetty %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Yhdistän %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Ed2k-yhteys katkaistu" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Käynnistettiin Kad." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Pysäytettiin Kad." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Yhdistetty Kadiin (ok)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Yhdistetty Kadiin (palomuurattu)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Yhteys Kadiin katkaistu" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"Kad-verkkoa ei voida käyttää mikäli UDP-portti on estetty asetuksissa, ei " +"käynnistetä." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Kad-verkko estetty asetuksissa, ei yhdistetä." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "Kaverilistatiedostoa 'emfriends.met' ei saatu avattua luettavaksi!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "" +"Kaverilistatiedostoa 'emfriends.met' ei saatu avattua kirjoitettavaksi!" + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "" +#~ "Yhdistämisapu tietystä ip:stä ei ole mahdollista etähallinnasta käsin." + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "Tiedostoa server.met ei voida päivittää etähallinnasta." + +#~ msgid "Requested:" +#~ msgstr "Pyydetty:" + +#~ msgid "" +#~ "Filestats for this session: Accepted %d of %d requests, %s transferred\n" +#~ msgstr "" +#~ "Tiedostotilasto tästä sessiosta: Hyväksytty %d / %d pyynnöstä, %s " +#~ "siirretty\n" + +#~ msgid "" +#~ "Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +#~ msgstr "" +#~ "Tiedostotilasto kaikista sessioista: Hyväksytty %d / %d pyynnöstä, %s " +#~ "siirretty\n" + +#~ msgid "Are you sure that you wish to delete the selected friend(s)?" +#~ msgstr "Oletko varma että haluat poistaa valitut kaverit?" + +#~ msgid "Read %u Kad contacts" +#~ msgstr "Luettu %u Kad-kontaktia" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid "] with " +#~ msgstr "] käyttäen " + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "Canceled !" +#~ msgstr "Peruutettu !" + +#~ msgid "TCP Flags" +#~ msgstr "TCP-liput" + +#~ msgid "UDP Flags" +#~ msgstr "UDP-liput" + +#~ msgid "Mark server(s) as static" +#~ msgstr "Merkitse palvelime(t) pysyviksi" + +#~ msgid "Mark server(s) as non-static" +#~ msgstr "Poista palvelim(i)en pysyvyysmerkintä" + +#~ msgid "Remove server(s)" +#~ msgstr "Poista palvelime(t)" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "Kopioi Ed2k-linkki leikepöydälle" + +#~ msgid "Are you sure that you wish to delete the selected server(s)?" +#~ msgstr "Oletko varma että haluat poistaa valitut palvelimet?" + +#~ msgid "Stops the current connection attempts" +#~ msgstr "Pysäyttää nykyiset yhteysyritykset" + +#~ msgid "Disconnect from " +#~ msgstr "Katkaise yhteys " + +#~ msgid "current server" +#~ msgstr "nykyinen palvelin" + +#~ msgid " and " +#~ msgstr " ja " + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "Katkaise yhteys serverille ja/tai Kadiin" + +#~ msgid "Update delay: %d secs" +#~ msgstr "Päivitysväli: %d sekuntia" + +#~ msgid "Time for average graph: %d mins" +#~ msgstr "Keskimääräiskuvaajan aika: %d minuuttia" + +#~ msgid "Update delay : %d secs" +#~ msgstr "Päivitysviive : %d sekuntia" + +#~ msgid "File Buffer Size: %d bytes" +#~ msgstr "Tiedostopuskurin koko: %d tavua" + +#~ msgid "Upload Queue Size: %d clients" +#~ msgstr "Lähetysjonon koko: %d asiakasta" + +#~ msgid "Server connection refresh interval: %d minutes" +#~ msgstr "Palvelinyhteyden päivitysväli: %d minuuttia" + +#~ msgid "Client requests %u" +#~ msgstr "Asiakas pyytää %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "Tiedostolohko %u-%u (%d tavua):" + +#~ msgid "Client request is invalid!" +#~ msgstr "Asiakkaan pyyntö on virheellinen!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "Asiakkaan pyyntö on virheellinen! %i / %i" + +#~ msgid "Are you sure that you wish to delete the selected file(s)?" +#~ msgstr "Oletko varma että haluat poistaa valitut tiedostot?" + +#~ msgid "Clear completed" +#~ msgstr "Poista valmistuneet" + +#~ msgid "" +#~ "Please set your prefered video player on preferences.\n" +#~ "Meanwhile, aMule will attempt to use mplayer and you will get this " +#~ "warning on every preview" +#~ msgstr "" +#~ "Ole hyvä ja aseta haluamasi videotoistin asetuksissa.\n" +#~ "Siihen asti aMule yrittää käyttää mplayer:iä ja antaa tämän varoituksen " +#~ "jokaisella kerralla" + +#~ msgid "ERROR: Failed to execute external media-player!" +#~ msgstr "Virhe: Ulkoista mediatoistinta ei voitu suorittaa!" + +#~ msgid "Command: %s" +#~ msgstr "Komento: %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "Tiedostoa %s ei voitu avata - käytetään tiedostoa %s." + +#~ msgid "Saved %i sources seeds for partfile: %s (%s)" +#~ msgstr "Tallennettu %i lähdettä osatiedostolle: %s (%s)" + +#~ msgid "" +#~ "Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| " +#~ "FileHash |%s|" +#~ msgstr "" +#~ "Turmeltunut osa (%d) kohteen %d osatiedostossa %s - Tiedostotulostarkiste " +#~ "|%s| Tiedostotarkiste |%s|" + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "Varoitus: Tiedostoa known.met ei ole." + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles: %s poistettu jaettujen hakemistojen " +#~ "listalta: hakemistoa ei ole." + +#~ msgid "Found %i known shared files" +#~ msgstr "Löydetty %i tunnettua jaettua tiedostoa" + +#~ msgid "Found %i known shared files, %i unknown" +#~ msgstr "Löydetty %i tunnettua jaettua tiedostoa, %i tuntematonta" + +#~ msgid "%s comment(s)" +#~ msgstr "%s kommenttia" + +#~ msgid "Automatic connection to server will retry in %d seconds" +#~ msgstr "Automaattinen uudelleenyhdistäminen palvelimelle %d sekunnin päästä" + +#~ msgid "Found %u part files" +#~ msgstr "Löydetty %u osatiedostoa" + +#~ msgid "" +#~ "This command requires an argument. Valid arguments: 'all' or a number.\n" +#~ msgstr "" +#~ "Tälle komennolle on annettava parametri. Kelvollisia ovat: 'all' tai " +#~ "numero.\n" + +#~ msgid "Received %d new servers" +#~ msgstr "Vastaanotettiin %d uutta palvelinta" + +#~ msgid "Loaded %d flag bitmaps." +#~ msgstr "Ladattiin %d lippukuvaa." + +#~ msgid "bytes" +#~ msgstr "tavua" + +#~ msgid "bytes/sec" +#~ msgstr "tavua/s" + +#~ msgid "Loaded %u IP-ranges from '%s'. %u malformed lines were discarded." +#~ msgstr "" +#~ "Latasin %u IP-aluetta kohteesta '%s'. %u epämuodostunutta riviä " +#~ "ohitettiin." + +#~ msgid "" +#~ "\n" +#~ "All commands are case insensitive.\n" +#~ "Type 'help ' to get detailed info on .\n" +#~ msgstr "" +#~ "\n" +#~ "Komennot eivät erottele isoja ja pieniä kirjaimia.\n" +#~ "Kirjoita 'help ' saadaksesi lisätietoa komennosta.\n" + +#~ msgid "Creditfile loaded, %u clients are known" +#~ msgstr "Pisteytystiedosto ladattu, %u tunnettua asiakasta" + +#~ msgid " - Credits expired for %u clients!" +#~ msgstr " - Pisteet ovat vanhentuneet %u asiakkaalle!" + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "Aliprosessin loppumisen odottelu epäonnistui" + +#~ msgid "%i servers in server.met found" +#~ msgstr "%i palvelinta tiedostossa server.met" + +#~ msgid "%d servers added" +#~ msgstr "%d palvelinta lisätty" + +#~ msgid "" +#~ "You cannot connect to a release version from an arbitrary CVS version! " +#~ "*sigh* possible crash prevented" +#~ msgstr "" +#~ "Et voi yhdistää julkaisuversioon mielivaltaisella kehitysversiolla! " +#~ "*huoh* mahdollinen kaatuminen estetty" + +#~ msgid "doesn't work" +#~ msgstr "ei toimi" + +#~ msgid "remote gui" +#~ msgstr "etäkäyttöliittymä" + +#~ msgid "" +#~ "Error: Failed to load backup file. Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Virhe: Varmuuskopion avaaminen ei onnistu. Katso sivuilta http://forum." +#~ "amule.org ratkaisuja .part.met -palautukseen" + +#~ msgid "" +#~ "Error: Backup part.met file is 0 size! Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Virhe: Varmuuskopio part.met -tiedostosta on tyhjä! Katso sivuilta " +#~ "http://forum.amule.org ratkaisuja .part.met -palautukseen" + +#~ msgid "Error: part.met backup file is 0 size: %s ==> %s" +#~ msgstr "Virhe: part.met-varmuuskopio on tyhjä: %s ==> %s" + +#~ msgid "" +#~ "Note: These values are\n" +#~ " only used for statistics." +#~ msgstr "" +#~ "Huomio: Näitä arvoja\n" +#~ "käytetään vain tilastoissa." + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ " 'Kaikkien alustojen' vertaisverkkoasiakas pohjautuen eMuleen \n" +#~ "\n" +#~ " Verkkosivu: http://www.amule.org \n" +#~ " Foorumi: http://forum.amule.org \n" +#~ " UKK: http://wiki.amule.org \n" +#~ "\n" +#~ " Yhteys: admin@amule.org (hallinnolliset asiat, englanniksi) \n" +#~ " Tekijänoikeudet (C) 2003-2008 aMule-Tiimi \n" +#~ "\n" +#~ " Osa aMulesta pohjautuu \n" +#~ " Kademliaan: Vertaisreititys perustuen XOR-metriikkaan.\n" +#~ " Tekijänoikeudet (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "VAROITUS: Sinulla on Low-ID!" + +#~ msgid "" +#~ "This command requieres an argument. Valid arguments: 'all' or a number.\n" +#~ msgstr "" +#~ "Tämä komento vaatii parametrin. Käypiä ovat: 'all' tai jokin numero.\n" + +#~ msgid "This command requieres an argument. Valid arguments: a file hash.\n" +#~ msgstr "Tämä komento vaatii parametrin. Käypiä ovat: tiedostotarkiste.\n" + +#~ msgid "Deprecated command, now 'Status'." +#~ msgstr "Vanhentunut komento, nykyään 'Status'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Status' instead.\n" +#~ msgstr "" +#~ "Tämä on vanhentunut komento ja se voidaan poistaa tulevaisuudessa.\n" +#~ "Käytä sen sijaan 'Status'.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter'." +#~ msgstr "Vanhentunut komento, nykyään 'Set IPFilter'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter' instead.\n" +#~ msgstr "" +#~ "Tämä on vanhentunut komento ja se voidaan poistaa tulevaisuudessa.\n" +#~ "Käytä sen sijaan 'Set IPFilter'.\n" + +#~ msgid "Deprecated command, now 'Get IPFilter Level'." +#~ msgstr "Vanhentunut komento, nykyään 'Get IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Tämä on vanhentunut komento ja se voidaan poistaa tulevaisuudessa.\n" +#~ "Käytä sen sijaan 'Get IPFilter Level'.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter Level'." +#~ msgstr "Vanhentunut komento, nykyään 'Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Tämä on vanhentunut komento ja se voidaan poistaa tulevaisuudessa.\n" +#~ "Käytä sen sijaan 'Set IPFilter Level'.\n" + +#~ msgid "Deprecated command, now 'Get/Set IPFilter Level'." +#~ msgstr "Vanhentunut komento, nykyään 'Get/Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get/Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Tämä on vanhentunut komento ja se voidaan poistaa tulevaisuudessa.\n" +#~ "Käytä sen sijaan 'Get/Set IPFilter Level'.\n" + +#~ msgid "Deprecated command, now 'Show Servers'." +#~ msgstr "Vanhentunut komento, nykyään 'Show Servers'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Show Servers' instead.\n" +#~ msgstr "" +#~ "Tämä on vanhentunut komento ja se voidaan poistaa tulevaisuudessa.\n" +#~ "Käytä sen sijaan 'Show Servers'.\n" + +#~ msgid "Deprecated command, now 'Get BwLimits'." +#~ msgstr "Vanhentunut komento, nykyään 'Get BwLimits'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get BwLimits' instead.\n" +#~ msgstr "" +#~ "Tämä on vanhentunut komento ja se voidaan poistaa tulevaisuudessa.\n" +#~ "Käytä sen sijaan 'Get BwLimits'.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Up'." +#~ msgstr "Vanhentunut komento, nykyään 'Set BwLimit Up'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Up' instead.\n" +#~ msgstr "" +#~ "Tämä on vanhentunut komento ja se voidaan poistaa tulevaisuudessa.\n" +#~ "Käytä sen sijaan 'Set BwLimit Up'.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Down'." +#~ msgstr "Vanhentunut komento, nykyään 'Set BwLimit Down'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Down' instead.\n" +#~ msgstr "" +#~ "Tämä on vanhentunut komento ja se voidaan poistaa tulevaisuudessa.\n" +#~ "Käytä sen sijaan 'Set BwLimit Down'.\n" + +#~ msgid "Syncronization thread started." +#~ msgstr "Synkronointisäie käynnistetty." + +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "Päätarkistussummat tunnetuille tiedostoille ladattu." + +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "Virhe luettaessa Kad-kontakteja - ei merkintöjä" + +#~ msgid "Merge attempt" +#~ msgstr "Sulautusyritys" + +#~ msgid "Recursive merge" +#~ msgstr "Rekursiivinen sulautus" + +#~ msgid "Sucessful merge!" +#~ msgstr "Sulautettu onnistuneesti!" + +#~ msgid "No merge possible" +#~ msgstr "Sulauttaminen ei mahdollista" + +#~ msgid "Buddy address: " +#~ msgstr "Kaverin osoite: " + +#~ msgid "Allow usage of system wide ipfilter.dat" +#~ msgstr "Salli järjestelmänlaajuisen ipfilter.dat:in käyttö" + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid " %d" +#~ msgstr " %d" + +#~ msgid ".%d" +#~ msgstr ".%d" + +#~ msgid "Shows the process of a search." +#~ msgstr "Näyttää haun edistymisen." + +#~ msgid "Shows the process of a search..\n" +#~ msgstr "Näyttää haun edistymisen..\n" + +#~ msgid "Search warning." +#~ msgstr "Hakuvaroitus." + +#~ msgid "Client Identification:" +#~ msgstr "Asiakkaan tunnistus:" + +#~ msgid "Use Secure Identification" +#~ msgstr "Käytä turvattua tunnistusta" + +#~ msgid "" +#~ "Secure Identification uses a handshake approch to safely identify clients " +#~ "for use with the credit system." +#~ msgstr "" +#~ "Turvattu tunnistus käyttää kättelylähestymistä tunnistaakseen " +#~ "turvallisesti asiakkaat pistejärjestelmää varten." + +#~ msgid "Sources Dropping" +#~ msgstr "Lähteiden pudotus" + +#~ msgid "Source Dropping" +#~ msgstr "Lähteiden pudotus" + +#~ msgid "Keep sources" +#~ msgstr "Pidä lähteet" + +#~ msgid "Drop sources" +#~ msgstr "Pudota lähteet" + +#~ msgid "Send sources to any other file before dropping (High CPU)" +#~ msgstr "" +#~ "Lähetä lähteet muille tiedostoille ennen pudottamista (Iso suorittimen " +#~ "käyttö)" + +#~ msgid "Sources with no needed file-parts." +#~ msgstr "Lähteet joilla ei tarvittavia tiedosto-osia" + +#~ msgid "Full Queue Sources Handling" +#~ msgstr "Täyden jonon lähteiden hallinta" + +#~ msgid "Enable auto drop Full Queue Sources" +#~ msgstr "Salli automaattinen täysien jonojen lähteiden pudottaminen" + +#~ msgid "High Queue Rating Sources Handling" +#~ msgstr "Korkean jonoluokituksen lähteiden käsittely" + +#~ msgid "Enable auto drop High Queue Rating Sources" +#~ msgstr "Salli automaattinen korkean jonoluokituksen lähteiden pudottaminen" + +#~ msgid "High Queue Rating value" +#~ msgstr "Korkean jonoluokituksen raja" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(Väh 300 / Enint 3000)" + +#~ msgid "Auto Drop Sources Timer" +#~ msgstr "Lähteiden automaattisen pudotuksen ajastin" + +#~ msgid "Timer (in secs)" +#~ msgstr "Ajastin (sekunneissa)" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(Väh 60 / 3600 Enint)" + +#~ msgid "Drop No Needed Sources now" +#~ msgstr "Pudota tarpeettomat lähteet nyt" + +#~ msgid "Drop Full Queue Sources now" +#~ msgstr "Pudota täysijonoiset lähteet nyt" + +#~ msgid "Drop High Queue Rating Sources now" +#~ msgstr "Pudota korkean jonoluokituksen lähteet nyt" + +#~ msgid "Clean Up Sources now (NNS, FQS && HQRS)" +#~ msgstr "Siivoa lähteet nyt (NNS, FQS && HQRS)" diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 00000000..a7b65e68 --- /dev/null +++ b/po/fr.po @@ -0,0 +1,7575 @@ +# translation of fr.po to Français +# Copyright (C) 2005-2006, 2007Free Software Foundation, Inc. +# This file is distributed under the same license as the new_fr package. +# +# +# ThePolish , 2005. +# kaouete , 2005, 2006. +# kaouete , 2006. +# Guillaume , 2007. +msgid "" +msgstr "" +"Project-Id-Version: fr\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2008-02-29 18:55+0100\n" +"Last-Translator: OBones \n" +"Language-Team: Français \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Vous devez entrer un mot de passe non vide." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Mot de passe invalide, ce n'est pas un hash MD5 !" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Erreur de connexion" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "Échec de la connexion EC. Réponse vide." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "ExternalConn : Accès interdit pour cause de: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "ExternalConn : Accès interdit" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "ExternalConn: Mauvaise réponse du serveur. Connexion fermée." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Succès ! Connexion établie à aMule " + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Succès ! Connexion établie." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Hachage" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Finalisation" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Terminé" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "En pause" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Erroné" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "En téléchargement" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "En attente" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Création des hashes MD4 et AICH démarrée pour le fichier: %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Création du hash MD4 démarrée pour le fichier: %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Création du hash AICH démarrée pour le fichier: %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "Conversion des anciens hashsets AICH en '%s' vers 64b en '%s'." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" +"ATTENTION : Le nom de fichier '%s' est invalide et a été renommé en '%s'." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "" +"ATTENTION : Le fichier '%s' existe déjà, le nouveau fichier a été renommé en " +"'%s'." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" +"ATTENTION : Suppression du fichier '%s' original après la création de la " +"sauvegarde" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "ATTENTION : Échec de la suppression de %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Échec de la réception des fichiers partagés de l'utilisateur '%s'" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Inconnu" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (Fake eMule version %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (Fake eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (Fake eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (basé sur eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Pseudo : %s ID : %u" + +#: src/BaseClient.cpp:1876 +#, c-format +msgid "Requested: %s\n" +msgstr "Demandé: %s\n" + +#: src/BaseClient.cpp:1878 +#, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Statistiques des fichiers pour cette session: %d requête acceptée sur %d, %s " +"transférés\n" +msgstr[1] "" +"Statistiques des fichiers pour cette session: %d requêtes acceptées sur %d, %" +"s transférées\n" + +#: src/BaseClient.cpp:1881 +#, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Statistiques des fichiers pour toutes les sessions: %d requête acceptée sur %" +"d, %s transférés\n" +msgstr[1] "" +"Statistiques des fichiers pour toutes les sessions: %d requêtes acceptées " +"sur %d, %s transférées\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Fichier demandé inconnu" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "Le client %s sur IP:Port %s:%d utilisant %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Nom d'utilisateur" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Amis" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Afficher &Détails" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Ajouter un ami" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Supprimer l'Ami" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Envoyer un &Message" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Voir les fichiers" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Établissement d'un Slot Ami" + +#: src/FriendListCtrl.cpp:273 +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Êtes-vous sûr de vouloir supprimer l' ami sélectionné ?" + +#: src/FriendListCtrl.cpp:275 +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Êtes-vous sûr de vouloir supprimer les amis sélectionnés ?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Annuler" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"Vous n'êtes pas autorisé à établir plus d'un slot ami.\n" +" Seul un slot a été attribué." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Sélection multiple" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Nom du fichier" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Taille" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Type" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Priorité" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "ID du fichier" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Demandes" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Demandes acceptées" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Données transférées" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Taux de partage" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Parties obtenues" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Sources complètes" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Chemin du répertoire" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Fichiers partagés" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Très basse" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Basse" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normale" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Haute" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Très haute" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Release" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Auto" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Ajouter un Commentaire/Note" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Éditer un Commentaire/Note" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Renommer" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Ajouter des fichiers de la collection à la liste de transferts." + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Copier le &lien magnet dans le presse-papiers" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Copier le &lien ed2k dans le presse-papiers" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Copier le lien ED2k dans le presse papier (&Source)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "" +"Copier le lien ED2K dans le presse-papiers (Source) (&Avec options de " +"cryptage)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Copier le lien ED2K dans le presse-papiers (&Nom d'hôte)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" +"Copier le lien ED2K dans le presse-papiers (Nom d'hôte) (Avec &Options de " +"cryptage)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Copier le lien ED2k dans le presse papier (&Infos AICH)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Copier le rapport dans le presse papier" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "Vous devez être en HighID pour créer un lien valide" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Attention" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Fichiers partagés (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[Fichier .part]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Entrez un nouveau nom pour ce fichier:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Renommer" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Reprise des envois du fichier : %s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Pause des envois du fichier : %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: le mot recherché est trop court" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Erreur: Écoute sur le port TCP impossible." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "La requête a échouée avec le message d'erreur suivant. %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "La requête a échouée avec une erreur inconnue." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "Fichier d'index non trouvé" + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Impossible de créer un thread pour la socket Web\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Serveur Web : démarré\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "La session a expirée - demande de l'identifiant\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Session correcte, identifié\n" + +# verifier les trucs rapport au webserver +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Session correcte, non identifié\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Pas de session ouverte - l'identifiant va être demandé\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Session crée - demande de l'identifiant\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Requête en cours [originale] : " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Vérification du mot de passe\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Hash du mot de passe invalide\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Mot de passe correct\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Mauvais mot de passe\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "" +"Vous n'avez pas entré de mot de passe. Les mots de passe vides ne sont pas " +"autorisés.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Déconnexion demandée\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Requête en cours [redirigée] :" + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Charge le template " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Port HTTP du serveur web" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Utiliser l'UPnP pour la redirection de port du serveur web" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "Port UPnP" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Utiliser la compression gzip" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Mot de passe pour l'accès total au serveur web" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Mot de passe invité pour le serveur web" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Autoriser l'accès invité" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Interdire l'accès invité" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "" +"Charger/sauver la configuration du serveur web depuis/vers l'aMule distant" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "" +"Chemin du fichier de configuration d'aMule. NE PAS UTILISER DIRECTEMENT!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "Desactiver l'interpréteur PHP (déprécié)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Recompiler les pages PHP à chaque requête" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "Serveur Web d'aMule" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Non disponible" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Jamais" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Téléchargement..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Préférences" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "Répertoire contenant le fichier amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Parcourir" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Entrer ici le répertoire contenant le fichier amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Intervalle de rafraîchissement en secondes" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Générer une image des statistiques en ligne à chaque rafraîchissement" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "Entrer ici le répertoire où générer l'image des statistiques en ligne" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "" +"Envoi périodique de l'image des statistiques en ligne sur un serveur FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "URL du FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "Chemin du FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Entrer ici l'URL du serveur FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" +"Entrer ici le répertoire du serveur FTP où uploader l'image des statistiques " +"en ligne" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Utilisateur" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Mot de passe" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Entrer ici l'identifiant pour se connecter au serveur FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Entrer ici le mot de passe pour se connecter au serveur FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "Intervalle d'upload le l'image des statistiques en ligne en minutes" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Valider" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Répertoire contenant le fichier de signature" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Répertoire où générer l'image des statistiques en ligne" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i jour(s) %i heure(s) %i min %i s" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, statistiques en ligne d'aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Bienvenue !" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Vitesse de réception Max atteinte depuis de démarrage de wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "" +"Vitesse de réception Max atteinte lors des précédentes exécutions de wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Annuler" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "Système" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Arrêter le rafraîchissement automatique" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Sauvegarder l'image des statistiques en ligne" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Imprimer une image des statistiques en ligne" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Préférences" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "À propos de wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Démarrer le rafraîchissement automatique" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Rafraîchissement automatique stoppé" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Rafraîchissement automatique démarré" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Sauvegarder l'image des statistiques en ligne" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Pas de prise en charge pour ce type d'image." + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "Le fichier n'a pas été sauvegardé" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "Statistiques en ligne d'aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"L'impression a rencontré un problème.\n" +"Peut-être votre imprimante n'est-elle pas configurée correctement ?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Impression en cours" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, Statistiques en Ligne d'aMule\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Basé sur CAS de Pedro de Oliveira \n" +"\n" +"Distribué sous licence GPL" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Oh Oh, aMule n'est pas lancé..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule fonctionne" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule est lancé, mais déconnecté" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule se connecte..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Oh Oh, l'état d'aMule est inconnu..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " tourne depuis " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " est arrêté !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " n'est pas connecté !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " se connecte..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " est en train de faire des trucs bizarres, à vérifier !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " est connecté à " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad : " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "ok" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "derrière un pare-feu" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "éteint" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " est sur " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +msgid " with " +msgstr " avec " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Réception totale : " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Émission : " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Réception durant la session : " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Réception : " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " Ko/s, Émission : " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +msgid " kB/s" +msgstr " Ko/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Partage : " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " fichier(s), clients en attente : " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Temps:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f Ko/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " sur " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Charge moyenne du système (1-5-15 min) : " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Le système fonctionne depuis : " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uJ %02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "HighID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "LowID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Non connecté" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f o" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f Ko" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f Mo" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f Go" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f To" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +msgid "Cancelled !" +msgstr "Annulé !" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Impossible d'ouvrir %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "" +"Le fichier %s est trop gros pour le Donkey : le maximum permis est de 4 Go." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Paramètres d'entrée" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Fichier à hacher" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Ajouter des URLs optionnelles pour ce fichier" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Entrer ici le fichier pour lequel calculer le lien Ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Entrer ici les URLs à ajouter au lien Ed2k: Ajouter / à la fin pour laisser " +"aLinkCreator ajouter le nom de fichier courant" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Ajouter" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Enlever" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Effacer" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Créer le lien avec les hashs partiels" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Aide à retrouver les fichiers rares et nouveaux au prix d'un lien de plus " +"grande longueur" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "Hash MD4 du fichier" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "Hash Ed2k du fichier" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "Lien Ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Démarrer" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Sauvegarder" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Copier dans le presse-papiers" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Quitter" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Ouvrir un fichier pour calculer son lien Ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Copier le lien Ed2k calculé dans le Presse-papiers" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Sauvegarder le lien Ed2k calculé dans un fichier" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "A propos d'aLinkCreator" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Sélectionner le fichier pour lequel calculer le lien Ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "Rien à copier pour l'instant !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Sélectionner le fichier où sauvegarder le lien Ed2k calculé" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Impossible d'ouvrir " + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Entrez un nom de fichier non vide s'il vous plaît" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "Rien à sauvegarder pour l'instant !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, le créateur de liens Ed2k d'aMule\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps par http://www.everaldo.com et http://www.icomania.com\n" +"et http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distribué sous licence GPL" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Hachage en cours..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Effectué en %.2f s" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "Vous avez déjà ajouté cette URL !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Entrez une URL non vide s'il vous plaît" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "Traitement du fichier numéro %u : %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "" +"Vous avez demandé les hashs partiels (Seulement utilisés pour des fichiers " +"dont la tailles est > 9.5 Mo)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Patientez s'il vous plaît... " + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> Fichier inexistant !\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, le créateur de liens Ed2k d'aMule" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Auto [Basse]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Auto [Normale]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Auto [Haute]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Connexion en cours" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Demande en cours" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Connexion via le serveur" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "File d'attente pleine" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "En attente" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "En téléchargement" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Réception hashset" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Parties inutiles" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Connexion impossible entre deux LowID" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Trop de connexions" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Connexion par Kad" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Trop de connexions Kad" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Banni" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Erreur de Connexion" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "File d'attente distante pleine" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "Ancien MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "Nouvel MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "Compatible eMule" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Serveur Local" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Serveur Distant" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Échange de Sources" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Passif" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Lien" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Sources Seeds" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Défaut du Système" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Arabe" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Basque" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Bulgare" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Catalan" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Chinois (Simplifié)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Chinois (Traditionnel)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Croate" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "Tchèque" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Danois" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Hollandais" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Anglais (U.K.)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Estonien" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Finlandais" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Français" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Galicien" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Allemand" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "Grec" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Hongrois" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Italien" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Italien (Suisse)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "Japonais" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Coréen" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "Lituanien" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "Norvégien (Nynorsk)" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Polonais" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portugais" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Portugais (Brésilien)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Russe" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Slovène" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Espagnol" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "Suédois" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Turque" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Impossible de déterminer le navigateur sélectionné!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" +"Le port TCP ne peut pas dépasser 65532 car le socket UDP du serveur sera à " +"TCP+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Le port par défaut sera utilisé (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Nom du serveur" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Adresse" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Port" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Description" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Temps de réponse" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Utilisateurs" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Fichiers" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Échec" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Statique" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Version" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Vous êtes connecté au serveur que vous tentez de supprimer. Déconnectez-vous " +"d'abord s'il vous plaît . Le serveur n'a PAS été supprimé." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Infos" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(Nom inconnu)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Êtes-vous sûr de vouloir supprimer le serveur statique %s" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Oui" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Non" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Échec de l'ouverture de '%s'" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Serveurs (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Serveurs" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Connexion au serveur" + +#: src/ServerListCtrl.cpp:428 +msgid "Mark server as static" +msgstr "Marquer le serveur comme statique" + +#: src/ServerListCtrl.cpp:429 +msgid "Mark server as non-static" +msgstr "Marquer le serveur comme non statique" + +#: src/ServerListCtrl.cpp:431 +msgid "Mark servers as static" +msgstr "Marquer le(s) serveur(s) comme statique(s)" + +#: src/ServerListCtrl.cpp:432 +msgid "Mark servers as non-static" +msgstr "Marquer le(s) serveur(s) comme non statique(s)" + +#: src/ServerListCtrl.cpp:438 +msgid "Remove server" +msgstr "Enlever le serveur" + +#: src/ServerListCtrl.cpp:440 +msgid "Remove servers" +msgstr "Enlever les serveurs" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Supprimer tous les serveurs" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Copier le lien ed2k dans le presse-papiers" + +#: src/ServerListCtrl.cpp:449 +msgid "Copy ED2k links to clipboard" +msgstr "Copier les liens ed2k dans le presse-papiers" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Re-connexion au serveur" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Êtes -vous sûr de vouloir supprimer tout les serveurs ?" + +#: src/ServerListCtrl.cpp:570 +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Êtes -vous sûr de vouloir supprimer le serveurs sélectionné ?" + +#: src/ServerListCtrl.cpp:572 +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Êtes -vous sûr de vouloir supprimer les serveurs sélectionnés ?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Désactivé [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "Ceci est aMule %s basé sur eMule." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "Tourne sur %s" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" +"Visitez http://www.amule.org pour vérifier si une nouvelle version " +"estdisponible." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Erreur Fatale : échec de la création du minuteur" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "Contrôle à distance d'aMule " + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Snapshot :" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" +"Client p2p 'All-Platform' basé sur eMule \n" +"\n" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "Site web : http://www.amule.org \n" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "Forum : http://forum.amule.org \n" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" +"FAQ : http://wiki.amule.org \n" +"\n" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr " Contact : admin@amule.org (problèmes administratiFs) \n" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr " Des parties de aMule sont basées sur \n" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "Kademlia : Routage peer-to-peer basé sur la métrique XOR.\n" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr " Copyright (C) 2002 Petar Maymounkov\n" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr " http://kademlia.scs.cs.nyu.edu\n" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Message" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Texte de statut" + +#: src/amuleDlg.cpp:666 +msgid "ED2K: Connecting" +msgstr "ED2K : Connexion en cours" + +#: src/amuleDlg.cpp:670 +msgid "ED2K: Disconnected" +msgstr "ED2K : Déconnecté" + +#: src/amuleDlg.cpp:676 +msgid "Kad: Firewalled" +msgstr "Kad : Derrière un pare-feu" + +#: src/amuleDlg.cpp:680 +msgid "Kad: Connected" +msgstr "Kad : Connecté" + +#: src/amuleDlg.cpp:685 +msgid "Kad: Connecting" +msgstr "Kad : Connexion en cours" + +#: src/amuleDlg.cpp:689 +msgid "Kad: Off" +msgstr "Kad : Coupé" + +#: src/amuleDlg.cpp:718 +msgid "Stop the current connection attempts" +msgstr "Stopper les essais de connexions en cours" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Déconnecter" + +#: src/amuleDlg.cpp:722 +msgid "Disconnect from the currently connected networks" +msgstr "Se déconnecter des réseaux actuellement connectés" + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Se connecter" + +#: src/amuleDlg.cpp:726 +msgid "Connect to the currently enabled networks" +msgstr "Se connecter aux réseaux actuellement activés" + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "E : %.1f(%.1f) | R : %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "E : %.1f | R : %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | Connecté)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | Déconnecté)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Voulez-vous vraiment quitter aMule ?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Confirmation en sortie" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Impossible de déterminer la commande pour lancer votre navigateur." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "Le répertoire de skins '%s' n'existe pas" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "Attention: Impossible d'ouvrir le fichier de skin '%s' pour le lire" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Réseaux" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Fenêtre des réseaux" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Recherches" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Fenêtre de Recherche" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Transferts" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Fenêtre des Transferts" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Fenêtre des Fichiers Partagés" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Messages" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Fenêtre des Messages" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Statistiques" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Fenêtre des Statistiques" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Fenêtre des Préférences" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Importer" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "L'outil d'importation de fichier .part" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "À propos" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "À propos/Aide" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Général" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Connexion" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Proxy" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Filtre des messages" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Contrôles à distance" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Signature en ligne" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Répertoires" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Sécurité" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "Réglages graphiques" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Tweaks centraux" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Evenements" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Debugging" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Manuel" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"aMule doit être redémarré pour activer ces changements:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- Port TCP changé.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- Port UDP changé.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"Votre liste de mise à jour auto des serveurs est vide.\n" +"'Mise à jour de la liste des serveurs au démarrage' sera désactivé." + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"Vous avez activé les connexions externes mais vous n'avez pas spécifié de " +"mot de passe valide.\n" +"Les connexions externes ne pourront pas être activées tant qu'un mot de " +"passe valide n'est pas spécifié." + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- Langue changé.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- Dossier temporaire changé.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "E : 0.0 | R : 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"Les réseaux Kad et ED2K sont désactivés.\n" +"Vous ne pouvez pas vous connectez si vous n'activez pas l'un d'entre eux." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"Kad ne démarrera pas si votre port UDP est désactivé.\n" +"Activez le port UDP ou désactivez Kad." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"Vous devez redémarrer aMule maintenant.\n" +"Si vous ne le faites pas, ne vous plaignez pas si des bugs interviennent.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "Attention" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"Votre liste de mise à jour auto des serveurs est vide.\n" +"Entrez s'il vous plaît au moins une URL qui pointe sur un fichier server.met " +"valide.\n" +"Cliquer sur le bouton \"Liste\" à coté de cette case d'option pour entrer " +"une URL." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "Fichiers temporaires" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Fichiers réceptionnés" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Signatures en ligne" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Choisir un dossier pour %s" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Chercher un son" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "Fichier wav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Chercher un lecteur vidéo" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Choisir un navigateur" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Exécutable%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Éditer la liste des serveurs" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Ajoutez ci-dessous des URL pour télécharger des fichiers server.met.\n" +"Seulement une URL par ligne." + +#: src/PrefsUnifiedDlg.cpp:980 +#, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Délais de rafraîchissement : %d seconde" +msgstr[1] "Délais de rafraîchissement : %d secondes" + +#: src/PrefsUnifiedDlg.cpp:987 +#, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Temps pour le graphe des moyennes : %d minute" +msgstr[1] "Temps pour le graphe des moyennes : %d minutes" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Échelle du graphe des connexions: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Délai de rafraîchissement : %d seconde" +msgstr[1] "Délai de rafraîchissement : %d secondes" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Taille du tampon de fichiers : %d octet" +msgstr[1] "Taille du tampon de fichiers : %d octets" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Taille de la fille d'attente d'émission : %d client" +msgstr[1] "Taille de la fille d'attente d'émission : %d clients" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Intervalle de rafraîchissement de la connexion serveur : %d minute" +msgstr[1] "Intervalle de rafraîchissement de la connexion serveur : %d minutes" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Intervalle de rafraîchissement de la connexion serveur: Désactivé" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Exécuter la commande lors de l'évenemnt '%s'" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Activer l'éxécution de la commande sur le noyau" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Commande du noyau:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Activer l'éxécution de la commande sur l'interface graphique" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "Commande de l'interface graphique:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "Les variables suivantes seront remplacées" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Tentative d'accès non autorisé: connexion fermée." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Connexion externe fermée." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "" +"Les connexions externes (EC) sont désactivées car le mot de passe est vide!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "" +"Les connexions externes (EC) sont désactivées dans le fichier de " +"configuration" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Nouvelle connexion externe (EC) acceptée" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "ERREUR: impossible d'accepter une nouvelle connexion externe" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" +"Connexion externe refusée car le mot de passe est vide dans les Préférences !" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "Connexion au client: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Version inconnue" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"ID de version de EC incorrecte, Il peut y avoir des incompatibilités entre " +"les binaires. Utilisez un core et un client distant du même snapshot." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" +"Vous ne pouvez pas connecter une version \"release\" depuis une version SVN " +"arbitraire ! *pfff* un crash potentiel a été évité" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "L'authentification a échouée." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Version du protocole invalide." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Le tag de version du protocole est manquant." + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Requête invalide, vous devriez vous authentifier d'abord." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Accès accepté." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" +"Échec de la commande PartFile à distance: Hash du fichier non trouvé: %s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "Hash du fichier non trouvé : %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "ARGH ! Erreur de traitement de l'OpCode !" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Serveur non ajouté" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "serveur non trouvé : %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "il faut définir le serveur à supprimer" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "ED2K est desactivé dans les préférences." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "Recherche en cours. Résultats dans un moment !" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "Une recherche Web par une interface distante n'a aucun sens." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad est desactivé dans les préférences." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Pas de points pour le graphe." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "Votre client n'est pas configuré pour ce niveau de détails." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "ExternalConn: arrêt demandé" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Arrêt déjà en cours." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "ExternalConn: ajout du lien '%s'." + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Lien invalide ou déjà dans la liste." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "Fichier non trouvé." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Nom de fichier invalide." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Impossible de renommer le fichier." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Déjà connecté à ED2K." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Connexion à ED2K..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Déjà connecté à Kad." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Connexion à Kad..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Tout les réseaux sont désactivés." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Déconnecté d'ED2K." + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Déconnecté de Kad." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "ExternalConn : opcode invalide reçu : %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "opcode invalide (mauvaise version de protocole ?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" +"Échec dans l'ouverture du fichier (%s), suppression de la liste des fichiers " +"partagés." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "Requête d'un hashset pour le fichier inconnu : %s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "La commande '%s' avec le PID '%d' s'est terminée avec le code '%d'." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "Serveur non ajouté: Pas d'IP ni de nom d'hôte donné." + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "Serveur non ajouté: Port serveur invalide." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "Statut de ED2K:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Connecté" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Port" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Statut de Kademlia :" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "En marche" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Statut :" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Déconnecté" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "État de la connexion :" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Derrière un pare-feu" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "OK" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "État du pare-feu : " + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Connecté au buddy" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "Pas de buddy" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Nombre moyen d'utilisateurs :" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "Nombre moyen de fichiers :" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "À l'arrêt" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Tourne depuis : %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Transfert" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Émission" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Données Émises (Session (Total)) : %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Bande Passante Supplémentaire Utilisée au Total (Paquets) : %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Bande Passante Supplémentaire par les Requêtes Fichiers (Paquets) : %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "" +"Bande Passante Supplémentaire par les Échanges de Sources (Paquets) : %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Bande Passante Supplémentaire par les Serveur (Paquets) : %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Bande Passante Supplémentaire par Kad (Paquets) : %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Envois Actifs : %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Envois en Attente : %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Sessions d'envois réussies au total : %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Sessions d'envois qui ont échouées au total : %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Temps d'envois moyen : %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Téléchargements" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Données Reçues (Session (Total)) : %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Sources Trouvées : %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Téléchargements Actifs (parties) : %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Rapport UL:DL pour la Session (Total) : %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Vitesse de Réception Moyenne (Session) : %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Vitesse d'Émission Moyenne (Session) : %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Vitesse de Réception Maximum (Session) : %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Vitesse d'Émission Maximum (Session) : %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Nombre de Reconnexions: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Temps Depuis le Premier Transfert : %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Connecté au serveur depuis : %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Connexions Actives (estimation) : %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Limite du nombre Max de Connexion Atteinte : %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Connexions en Moyenne (estimation) : %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Maximum de connexions (estimation) : %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Clients" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Filtrés" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Total : %i Connus : %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Serveurs" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Serveurs en fonctionnement  %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Serveurs non-connectés  %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Total : %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Serveurs Supprimés : %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Serveurs Filtrés : %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Utilisateurs sur les serveurs en fonctionnement : %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "Fichiers sur les serveurs en fonctionnement : %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Utilisateurs au Total : %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "Fichiers au Total : %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Occupation du Serveur : %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Nombre de Fichiers Partagés : %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Taille totale des Fichiers Partagés : %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Taille moyenne des fichiers : %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "LowID : %u (%.2f%% Total %.2f%% Connus)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "SecIdent Marche/Arrêt : %u (%.2f%%) : %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Système d'Éxploitation" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "Non reçu" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Couper" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Copier" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Coller" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Tout sélectionner" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "Une recherche Kad ne peut pas être faite si Kad n'est pas lancé" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "Une recherche ED2K ne peut pas être faite si ED2K n'est pas connecté" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Erreur imprévue lors de la tentative de recherche Kad: " + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "Message filtré de '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "Nouveau message de '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" +"L'utilisateur %s (%u) a demandé votre liste de fichier partagés -> Accepté" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" +"L'utilisateur %s (%u) a demandé votre liste de fichier partagés -> Refusé" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" +"L'utilisateur %s (%u) a demandé votre liste de dossiers partagés -> Accepté" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" +"L'utilisateur %s (%u) a demandé votre liste de dossiers partagés -> Refusé" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"L'utilisateur %s (%u) a demandé votre liste de fichier partagés pour le " +"répertoire %s -> accepté" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"L'utilisateur %s (%u) a demandé votre liste de fichier partagés pour le " +"répertoire %s -> refusé" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "L'utilisateur %s (%u) partage le répertoire %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "" +"L'utilisateur %s (%u) a envoyé une liste de fichier partagés non demandée." + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" +"L'utilisateur %s (%u) a envoyé la liste des fichiers partagés pour le " +"répertoire %s" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "" +"L'utilisateur %s (%u) a terminé d'envoyer la liste liste des fichiers " +"partagés" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "" +"L'utilisateur %s (%u) a envoyé une liste de fichier partagés non voulue" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" +"L'utilisateur %s (%u) a refusé l'accès à la liste des répertoires/fichiers " +"partagés" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Noeuds (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "IP invalide pour le bootstrap" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Port invalide pour le bootstrap" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Remplir tous les champs requis s'il vous plaît" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Êtes-vous sûr de vouloir télécharger en nouveau fichier nodes.dat?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" +"Le faire supprimera les nœuds actuels et redémarrera la connexion à Kademlia." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Continuer ?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Erreur : " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Attention : " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Ajouter un ami" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Vous devez entrer une adresse IP valide et un port!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Information" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "Le Hash utilisateur spécifié est invalide!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Sources" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Fichier" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Réception" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Catégorie" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Principal" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Télécharger dans la categorie" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "Chercher un fichier en relation (ED2K, serveur local)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "Marquer comme fichier connu" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Connexion distante à aMule" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "La connexion a échouée " + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Erreur" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"ATTENTION: Vous ne pouvez vous ajouter vous-même comme une source pour un " +"lien ed2k, en étant en lowid." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Utilisateurs: E: %s K: %s | Fichiers E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Tous" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Utilisateurs au total : %s | Fichiers au total : %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Reçu" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Terminé" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Vitesse" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Progression" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Statut" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Temps restant" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Vu complet pour la dernière fois" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Dernière réception" + +#: src/DownloadListCtrl.cpp:578 +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Êtes-vous sûr de vouloir supprimer le fichier sélectionné ?" + +#: src/DownloadListCtrl.cpp:580 +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Êtes-vous sûr de vouloir supprimer les fichiers sélectionnés ?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Envoyer un message à l'utilisateur" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Message à envoyer :" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Stop" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Pause" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Reprise" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "E&ffacer terminés" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Mettre tous les A4AF sur ce fichier immédiatement" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Mettre tous les A4AF sur ce fichier (Auto)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Mettre tous les A4AF sur n'importe quel autre fichier immédiatement" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Options avancées" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Prévisualisation" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Afficher &Détails" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Afficher tous les commentaires" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Copier le lien magnet dans le presse-papiers." + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "Désassocier" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Associer à une catégorie" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "&Ouvrir le fichier" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Supprimer des amis" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Ajouter aux amis" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Envoyer un message" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Échanger vers ce fichier" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "Ko/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "QR : %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Demander un autre fichier" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Téléchargements (%i)" + +#: src/DownloadListCtrl.cpp:2222 +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"Veuillez s'il vous plaît choisir votre lecteur vidéo préféré dans les " +"préférences.\n" +"Pour le moment, aMule va essayer d'utiliser mplayer et vous aurez cet " +"avertissement à chaque aperçu" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Aperçu" + +#: src/DownloadListCtrl.cpp:2260 +#, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "" +"ERREUR : Échec de l'exécution du lecteur multimédia externe ! Commande : '%s'" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "Erreur : Échec du l'ouverture du fichier .part)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "Erreur : Échec de la création du fichier .part)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "Tentative de chargement de la sauvegarde du fichier met depuis %s" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "Erreur : Échec de l'ouverture du fichier part.met: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "Erreur : La taille du fichier part.met est nulle : %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "Erreur : Version du fichier part.met invalide: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" +"Erreur : %s (%s) est corrompu (mauvais tagcount), impossible charger le " +"fichier." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "Tentative de récupération des infos du fichier..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" +"Récupération du fichier anonyme - Essai de récupération sous le nom " +"RecoveredFile.dat" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" +"Récupération de toutes les infos du fichier :D - Essayons de les utiliser..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Impossible de récupérer les infos du fichier :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Échec de l'ouverture de %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "Attention : %s est peut-être corrompu (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "ERREUR lors de la sauvegarde du fichier .part : %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "Impossible de récupérer la taille de '%s' - utilisation du fichier %s." + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "'%s' est apparemment de taille nulle - Utilisation du fichier %s." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "Échec de la sauvegarde du fichier part.met.seeds pour %s" + +#: src/PartFile.cpp:1019 +#, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "%i source seed sauvegardé pour le fichier .part : %s (%s)" +msgstr[1] "%i source seeds sauvegardés pour le fichier .part : %s (%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "Le fichier .part %s (%s) n'a pas de fichier seeds" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "Le fichier .part %s (%s) a un fichier seeds vide" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "" +"Erreur lors de la lecture de fichier seeds du fichier .part (%s - %s): %s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"Une partie corrompue trouvée (%d) dans %d parties du fichier %s - " +"FileResultHash |%s| FileHash |%s|" +msgstr[1] "" +"Une partie corrompue trouvée (%d) dans %d partie du .part %s - " +"FileResultHash |%s| FileHash |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "Partie complète (%i) trouvée dans %s" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "Re-hash de %s terminé" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "" +"Erreur de fichier imprévue lors de la complétion de %s. Fichier mis en pause" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Téléchargement terminé : %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "Fichier supprimé : %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" +"Attention : Impossible de hacher la partie téléchargée - hashset incomplet " +"pour '%s'" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"Erreur: Impossible de hacher la partie téléchargée - hashset incomplet (%s). " +"Ceci ne devrait jamais arriver" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "" +"ATTENTION : Pas assez d'espace disque disponible ! Mise en pause du " +"fichier : %s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "La partie téléchargée %i est corrompue dans le fichier: %s" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH : Partie corrompue %i récupérée pour %s -> Octets sauvés: %s" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Espace disque insuffisant" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Arrêté" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "Attention: known.met ne peut être ouvert." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" +"Attention : La liste des fichiers connus est corrompue, elle contient une " +"entête invalide." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "Erreur d'entrée-sortie lors de la lecture du fichier known.met: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "Erreur lors de la sauvegarde du fichier known.met : %s" + +#: src/SharedFileList.cpp:352 +#, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "%i fichier partagé connu trouvé" +msgstr[1] "%i fichiers partagés connus trouvés" + +#: src/SharedFileList.cpp:358 +#, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "%i fichier partagé connu trouvé, %i inconnu" +msgstr[1] "%i fichiers partagés connus trouvés, %i inconnus" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "ERREUR ! Tentative de partage de %s" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Commentaires du fichier" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Évaluation" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Commentaire" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Pas de commentaire" + +#: src/CommentDialogLst.cpp:104 +#, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%u commentaire" +msgstr[1] "%u commentaires" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"Echec de la connexion aux serveurs brouillés listés. Nouvel essai sans " +"brouillage." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "Échec de la connexion aux serveurs listés : nouvel essai." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "Le réseau ED2K est désactivé dans les préférences, pas de connexion." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "Aucun serveur valide pour se connecter dans la liste des serveurs" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Connecté à %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Connexion établie sur : %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"Erreur fatale lors de la tentative de connexion. la connexion Internet est " +"probablement inactive" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Connexion à %s (%s:%i) perdue" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) semble être indisponible." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) semble être plein." + +#: src/ServerConnect.cpp:391 +#, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "" +"Nouvelle tentative de connexion automatique au serveur dans %d seconde" +msgstr[1] "" +"Nouvelle tentative de connexion automatique au serveur dans %d secondes" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Connexion perdue" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "Échec de la connexion à %s (%s:%i)." + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "Erreur : socket invalide au moment du test" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "Délai d'attente de la connexion à %s (%s:%i) dépassé." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" +"Erreur : Echec du chargement du fichier de sauvegarde. Cherchez sur http://" +"forum.amule.org pour des solutions de récupérations des fichiers .part.met" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Pas de fichiers .part trouvés" + +#: src/DownloadQueue.cpp:175 +#, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "%u fichier .part trouvé" +msgstr[1] "%u fichiers .part trouvés" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Téléchargement de %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Vous êtes déjà en train de télécharger le fichier '%s'" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Vous avez déjà le fichier '%s'" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Vous êtes déjà en train de télécharger le fichier %s" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "Ne peut pas convertir le lien magnet en lien ed2k: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "Protocole de lien inconnu: %s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Lien ed2k invalide ! Erreur. %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "Exécute et quitte." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Format d'IP invalide. utiliser xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" +"Cette commande nécessite un argument. Arguments valides : 'all', nom de " +"fichier ou un nombre.\n" + +#: src/TextClient.cpp:343 +msgid "Processing by hash: " +msgstr "Traitement par hash :" + +#: src/TextClient.cpp:358 +msgid "Processing by filename: " +msgstr "Traitement par nom de fichier :" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" +"Cette commande nécessite un argument. Arguments valides : un hash de " +"fichier.\n" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Nombre invalide\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "" +"Ce n'est pas un hash valide (la longueur devrait être exactement 32 " +"caractères)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "L'opération s'est déroulée avec succès." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "La requête à échouée avec l'erreur suivante: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "Status du filtrage IP pour les clients: %s.\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "Arrêt" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "Marche" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "Status du filtrage IP pour les euveurs: %s.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "Le niveau d'IPFilter actuel est %d.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Limites de bande passante : Émission: %u Ko/s, Réception: %u Ko/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Connecté à %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "avec un LowID" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "avec un HighID" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Connexion en cours" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Non connecté" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Réception:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Émission :\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Clients dans la file d'attente :\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Nombre total de sources:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Nombres de résultats de la recherche: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "A FAIRE - montrer la progression d'une recherche" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Réponse inconnue reçue du serveur, OpCode = %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Montrer de courtes informations sur le statut." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "" +"Montrer le statut de la connexion, vitesses d'émission/réception, etc.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Montrer l'arbre des statistiques complet." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"Accessoirement, un nombre entre 0 et 255 peut être passé comme argument à " +"cette\n" +"commande, ce qui limitera le nombre de réponse par sous-arbre de versions " +"des clients\n" +"affichés. Passer 0 ou ne rien mettre signifie 'illimité'.\n" +"\n" +"Exemple: 'statistics 5' montrera seulement les 5 premières versions pour " +"chaque type de client.\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "Éteindre aMule." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Arrêter le core distant (amule/amuled).\n" +"Le client texte sera aussi arrêté, puisqu'il sera inutilisable sans\n" +" un core en marche.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Recharge l'objet donné." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "Recharge la liste des fichiers partagés." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "Recharge la table IPFilter depuis le fichier." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Se connecter au réseau." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"Ceci va vous connecter à tout les réseaux activés dans les Préférences.\n" +"Vous pouvez aussi spécifier une adresse de serveur de la forme IP:Port, pour " +"se connecter\n" +"seulement à ce serveur. L'IP doit être une IPv4 décimal,\n" +"ou un nom DNS pouvant être résolu." + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Se connecter seulement à ED2K." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Se connecter seulement à Kad." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Se déconnecter du réseau." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "" +"Ceci vous déconnectera de tous les réseaux auxquels vous êtes actuellement " +"connecté.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Se déconnecter seulement de ED2K." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Se déconnecter seulement de Kad." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Ajoute un lien ed2k ou magnet au noyau." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"Le lien ed2k à ajouter peut être:\n" +"*) un lien vers un fichier (ed2k://|file|...), il sera ajouté à la queue des " +"téléchargements,\n" +"*) un lien vers un serveur (ed2k://|server|...), il sera ajouté à la liste " +"des serveurs,\n" +"*) ou un lien vers une liste de serveurs, auquel cas, tous les serveurs dans " +"la liste seront\n" +" ajoutés à la liste des serveurs.\n" +"\n" +"Le lien magnet doit contenir le hash ed2k et la longueur du fichier.\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Changer une valeur des préférences." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "Changer une préférence IPFilter." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "Activer le filtrage IP pour les clients et les serveurs." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "Désactiver le filtrage IP pour les clients et les serveurs." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "Activer/Désactiver le filtrage IP pour les clients." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "Activer le filtrage IP pour les clients." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "Désactiver le filtrage IP pour les clients." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "Activer/Désactiver le filtrage IP pour les serveurs." + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "Activer le filtrage IP pour les serveurs." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "Désactiver le filtrage IP pour les serveurs." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "Choisir le niveau de filtrage IP." + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"Les niveaux de filtrage valides sont compris entre 0 et 255, la valeur par " +"défaut (initiale)\n" +" est 127.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Changer les limites de bande passante." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "La valeur passée à ces commandes doit être en kilo-octets/s.\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Changer la limite de bande passante en émission." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "Changer la limite de bande passante en réception." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Afficher une valeur des préférences." + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "Voir les préférences d'IPFilter." + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "Voir le statut d'IPFilter concernant les clients et les serveurs." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "Voir le statut d'IPFilter concernant les clients uniquement." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "Voir le statut d'IPFilter concernant les serveurs uniquement." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "Voir le niveau d'IPFilter." + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Voir les limites de bande passante." + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Lance une recherche." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"Un type de recherche doit être spécifié en donnnant le type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Exemple: 'recherche fichier kad' exécutera une recherche kad pour \"fichier" +"\".\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Exécute une recherche globale." + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Exécute une recherche locale." + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Exécute une recherche Kad." + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Montre les résultats de la dernière recherche." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Retourne les résultats de la recherche précédente.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "Affiche la progression de la recherche." + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "Affiche la progression de la recherche.\n" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Démarrer le téléchargement du fichier." + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"Le rang du fichier de la dernière recherche doit être donné.\n" +"Exemple: 'download 12' va télécharger le douzième fichier de la précédente " +"recherche.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Mettre le téléchargement en pause." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Reprendre le téléchargement." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Annuler le téléchargement." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Régler la priorité de téléchargement." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "" +"Passer la priorité d'un téléchargement en Basse, Normale, Haute, ou Auto.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "Passer en priorité basse." + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "Passer en priorité normale." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "Passer en priorité haute." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "Passer en priorité auto." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Montrer les files d'attente/listes." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Montre la file d'attente des envois/réception, la liste des serveurs ou la " +"liste de fichiers partagés.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Montrer la file d'attente des envois." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Montrer la file d'attente des réceptions." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Montrer le journal." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Montrer la liste des serveurs." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Effacer le journal." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "Commande obsolète, maintenant '%s'." + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" +"C'est une commmande est obsolète, et pourrait être supprimée dans le futur.\n" +"Utilisez '%s' à la place.\n" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() returned NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "Erreur : %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "Attention : %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Nouvel ID client : %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "AVERTISSEMENT : Vous avez reçu un Low-ID !" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "" +"\tLa raison la plus probable est que vous êtes derrière un pare-feu ou un " +"router." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tPour plus d'informations, consultez http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "Info serveur inconnue reçue ! - trop court" + +#: src/ServerSocket.cpp:539 +#, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "%d nouveau serveur reçu" +msgstr[1] "%d nouveaux serveurs reçus" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Sauvegarde de la liste des serveurs terminée." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "Le serveur a rejeté la dernière commande" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Faux paquet reçu depuis le serveur : %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "" +"Erreur non-prise en compte lors du traitement du paquet reçu du serveur : %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "Ne peut créer de thread pour la résolution DNS pour se connecter à %s" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "L'IP du serveur %s (%s) est filtrée. Pas de connexion." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "utilisation du brouillage de protocole" + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "Connexion à %s (%s - %s:%i) %s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "" +"Ne peut résoudre le nom DNS pour le serveur %s : Impossible de se connecter !" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "" +"CIP2Country::CIP2Country(): Impossible de charger les informations de pays " +"depuis " + +#: src/IP2Country.cpp:73 +#, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "%d image de drapeau chargée." +msgstr[1] "%d images de drapeau chargées." + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"Êtes-vous sûre de vouloir annuler et supprimer tous les fichiers de cette " +"catégorie ?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Confirmation requise" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Tous les autres" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Incomplet" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Actif" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Vidéo" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Audio" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Archive" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "Images CD" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Images" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Texte" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Sélectionner un filtre" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Ajouter une catégorie" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Éditer une catégorie" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Supprimer une catégorie" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "Importation %s : %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "Lecture du répertoire temporaire" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "" +"Récupération des informations de base depuis le téléchargement dans un " +"fichier" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "Création du fichier de destination" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "" +"Chargement des données depuis un ancien fichier de téléchargement (%u de %u)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "" +"Sauvegarde du bloc de données dans un nouveau fichier de téléchargement " +"unique (%u de %u)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "Récupérations des informations du fichier de téléchargement source" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "Ajout du téléchargement et sauvegarde du nouveau fichier .part" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Récupération du statut..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "En cours" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Erreur : Plus d'espace disque disponible" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Erreur : Partmet non trouvé" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Erreur : erreur d'entrée-sortie!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Erreur : Échec !" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "Mis en file d'attente" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Déjà en téléchargement" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Format de fichier temp inconnu ou mauvais." + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Nom de fichier" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "État" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Hash du fichier" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Importer les fichiers .port" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"Choisissez un dossier où chercher les téléchargements temporaires ! (les " +"sous-dossiers seront inclus)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" +"Voulez-vous que les fichiers sources de l'importation réussie du " +"téléchargement soient supprimées ?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Supprimer les sources ?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "En attente..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (Disque : %s)" + +#: src/OtherFunctions.cpp:121 +msgid "byte" +msgid_plural "bytes" +msgstr[0] "octet" +msgstr[1] "octets" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "ko" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "Mo" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "Go" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "To" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "octet/sec" +msgstr[1] "octets/sec" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "Mo/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "s" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "min" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "heures" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "Jours" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Vidéos" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Archives" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Textes" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programmes" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Tous" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Non évalué" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Invalide / Corrompu / Contrefaçon" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Mauvais" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Très bon" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Bon" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Excellent" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "Tous" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "tous les autres" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "Chargement des filtres IP 'ipfilter.dat' et 'ipfilter_static.dat'." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "Échec du chargement de fichier ipfilter.dat '%s', format inconnu." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" +"Échec du chargement de fichier ipfilter.dat '%s', ne peut pas ouvrir le " +"fichier." + +#: src/IPFilter.cpp:330 +#, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "%u rang d'IP chargé depuis '%s'. " +msgstr[1] "%u rangs d'IP chargés depuis '%s'. " + +#: src/IPFilter.cpp:332 +#, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "%u ligne malformée a été mise de coté." +msgstr[1] "%u lignes malformées ont été mises de coté." + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Connexions actives (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Détails du fichier" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% fait" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "Lien ED2k: " + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Envoyer" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" +"Cliquer ici pour ajouter le lien Ed2k présent dans la boîte de saisie à " +"votre liste de téléchargement." + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "Popup d'état" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Chargement en cours..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"Les évènements sont affichés ici. Pour une liste complète des évènements, " +"reportez à la fenêtre du journal de l'onglet Serveur." + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Nombre d'utilisateur du serveur auquel vous êtes connecté..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Utilisateurs : 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" +"Utilisateurs connectés au serveur courant et une estimation du nombre total " +"d'utilisateurs." + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"Taux moyen d'émission et de réception courants. S'il est présent, le chiffre " +"entre parenthèses indique la bande passante supplémentaire utilisée par les " +"connexions aux clients." + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"Affiche l'état de connexion et les transferts actifs. Des flèches rouges " +"indiquent que vous n'êtes actuellement pas connecté, des flèches jaunes que " +"vous êtes en LowID (pare-feu), et des flèches vertes que vous êtes en HighID " +"(le type de connexion optimal)." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Non connecté..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Serveur connecté." + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Rechercher" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Nom :" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Local" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Global" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "Hash du fichier" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Paramètres étendus" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Filtrage" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Type de fichier" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Extension" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Taille Minimum" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Octets" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "Ko" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Taille Maximum" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Disponibilité" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Filtre :" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Filtrer les résultats" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Inverser les résultats" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Masquer les fichiers connus" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Plus" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "" +"Recherche plus de résultats sur ED2K. Non supporté pour Kad pour le moment." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Arrêter" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Réinitialiser les Champs" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Résultats" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Effacer les téléchargements terminés" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Affiche l'émission / la file d'attente d'émission" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Clients dans la file d'attente :" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Envoyer" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Envoie le message spécifié." + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Fermer" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Ferme cette session de Chat." + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Nom complet :" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "N/A" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "Fichier .met :" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Hash :" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Taille du fichier :" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Statut :" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Vu complet pour la dernière fois :" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Sources trouvées :" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Sources en transfert :" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Nombre de fichier .part :" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Disponibles :" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Taux de transfert :" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Temps de téléchargement actif: " + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Transféré :" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Taille reçue :" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Traitement intelligent des corruptions (I.C.H.)" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Perdus par corruption :" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Gagné avec la compression :" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "Paquets sauvés par l'I.C.H :" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Noms des fichiers" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Récupérer le nom" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Nettoyage" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Appliquer" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Ok" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "" +"Commenter/Noter le fichier (Ce texte sera visible par tout les utilisateurs)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"Pour un film vous pouvez donner sa durée, son histoire, sa langue...\n" +"et si c'est un Fake, vous pouvez le aux autre utilisateurs d'aMule." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Qualité du fichier" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" +"Choisissez une évaluation pour le fichier ou avertissez les autres " +"utilisateurs qu'il est invalide..." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Pas de commentaire" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Rafraîchir" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "En téléchargement, veuillez patienter..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Taille inconnue" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Informations Requises" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "Adresse IP :" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Port :" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Renseignements complémentaires" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Nom d'utilisateur :" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Hash de l'utilisateur :" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Recharge vos fichiers partagés" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Session courante" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Total" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Demandé :" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Envois actifs :" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Vitesse de réception" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Courant" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Moyenne en fonctionnement" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Moyenne de la session" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Vitesse d'émission" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Connexions" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Téléchargements actifs" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Connexions actives (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Envois actifs" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Statistiques" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Nom d'utilisateur :" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Hash de l'utilisateur :" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Logiciel client :" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Version du client :" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "Adresse IP :" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "ID Utilisateur :" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "IP du serveur :" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Nom du serveur :" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "Transferts avec le client" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Requête actuelle :" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Vitesse d'émission moyenne :" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Vitesse de réception moyenne :" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Envoyé (session) :" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Reçu (session) :" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Envoyé (total) :" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Reçu (total) :" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Scores" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "Modificateur DL/UP :" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Identification sécurisée :" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Score (total) :" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Score de la file d'attente :" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Paramètres généraux" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Pseudo" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - La Mule Linux" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "" +"Ceci est le nom que verront les autres utilisateurs lorsqu'ils se " +"connecteront à vous." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Langue" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "Ceci spécifie la langue utilisée dans les commandes." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Options diverses" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Vérifier les nouvelles versions au démarrage" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" +"Si vous activer ceci, aMule vérifiera si de nouvelles versions sont " +"disponibles au démarrage" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Démarrer minimisé" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "Activer ceci minimise immédiatement aMule lors de son lancement." + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Confirmation en quittant" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "Active la confirmation de sortie d'aMule." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Activer l'icône de barre des tâches" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "Ceci Active/Désactive l'icône de barre des tâches." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "Icone de réduction en zone de notification" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" +"Activer ceci va faire minimiser aMule dans la boîte à miniatures plutôt que " +"dans la barre des taches." + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Délais d'apparition des info-bulles en secondes" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "Délai avant l'apparition des info-bulles." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Sélection du navigateur" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Sélectionnez votre navigateur ici" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Navigateur personnalisé :" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Entrer ici le nom de votre navigateur. Pour utiliser un navigateur " +"personnalisé, choisissez Personnalisé dans le menu déroulant ci-contre." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Ouvrir si possible dans un nouvel onglet" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" +"Ouvrir, lorsque c'est possible, la page Web dans un nouvel onglet plutôt que " +"dans une nouvelle page" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Limites de la bande passante" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Émission" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Allocation des slots Amis" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Capacités de la ligne" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" +"Note : Ces valeurs sont uniquement\n" +"utilisées pour les statistiques." + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Port TCP standard du client:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "C'est le port ED2K standard, il ne peut pas être désactivé." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Port UDP étendu du client:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "Ce port est utilisé pour les requêtes étendues et pour le réseau Kad" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "désactiver" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Lier l'Adresse" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "Port UDP pour les requêtes serveurs étendues (TCP+3) : 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Nombre maximum de sources par fichier" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Limite en dur" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Limites de connexion" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Nombre maximum de connexions" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Universal Plug and Play" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "Activer l'UPnP" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "Port TCP pour l'UPnP:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Se connecter automatiquement au démarrage" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Reconnecter en cas de déconnexion" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Montrer la bande passante supplémentaire utilisée" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Options du serveur" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Supprimer les serveurs inactifs après" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "essais" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Mise à jour de la liste des serveurs au démarrage" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Liste" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Mise à jour de la liste des serveurs à la connexion à un serveur" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Mise à jour de la liste des serveurs à la connexion d'un client" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Utiliser le système de priorité" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Utiliser la vérification du LowID à la connexion" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Connexion sûre" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Se connecter automatiquement seulement sur les serveurs statiques" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Mettre les serveurs ajoutés manuellement en priorité haute" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "I.C.H. actif" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICH fait confiance à tous les Hash (non recommandé)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Ajouter les fichiers à télécharger en mode Pause" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Ajouter les fichiers à télécharger en priorité automatique" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Essayer de télécharger la première et la dernière partie en premier" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Ajouter les nouveaux fichiers partagés en priorité automatique" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Essayer de transmettre des parties complètes pour tous les envois" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Démarrer le fichier en Pause suivant quand un se termine" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "De la même catégorie" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "Sauver 10 sources pour les fichiers rares (< 20 sources)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Espace disque" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Vérifier l'espace disque" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "Sélectionnez ceci si vous voulez qu'aMule contrôle votre espace disque" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Espace disque minimum :" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Entrez ici l'espace disque minimum désiré." + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mo" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Répertoire de réception :" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Répertoire temporaire :" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Répertoires partagés" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "(Cliquez à droite sur l'icône du répertoire pour un partage récursif)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Partager les fichiers cachés" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Lecteur vidéo" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Faire une sauvegarde pour prévisualiser" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Graphiques" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Délais de rafraîchissement : 5 s" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Temps pour la courbe de la moyenne : 100 min" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Échelle du graphique des connexions : 100 " + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Sélectionner les couleurs des statistiques" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Fond" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Quadrillage" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Téléchargement courant" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Téléchargement total moyen" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Téléchargement moyen sur la session" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Envoi courant" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Envoi total moyen" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Envoi moyen sur la session" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Connexions actives" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Barre de vitesse dans l'icône de barre des tâches" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Nœuds Kad actuels" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Nœuds Kad en fonctionnement" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Nœuds Kad pour la session" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Sélectionner" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Nombre de versions de client à montrer (0=illimité)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Notifications" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Popup de messages" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Utiliser des sons" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Ouvrir une fenêtre quand il y a :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Une nouvelle entrée dans le journal" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Le début d'une session de chat" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Un nouveau message de chat reçu" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Un téléchargement ajouté ou terminé" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Une nouvelle version d'aMule détectée" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "OOD urgent, connexion au serveur perdue" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Alertes par e-mail" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Envoyer un e-mail quand un téléchargement est terminé." + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "Serveur SMTP :" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "Adresse e-mail:" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! ATTENTION !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Ne changez pas ces réglages à moins de savoir\n" +"ce que vous faites, vous pourriez facilement\n" +"faire empirer les choses.\n" +"\n" +"aMule fonctionnera bien en ne modifiant pas\n" +"ces réglages." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Paramètres avancés" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Nombre maximum de nouvelles connexions / 5 s" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Taille du fichier de tampon : 240000 octets" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Taille de la file d'attente d'envoi : 5000 clients" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Intervalle de rafraîchissement de la connexion serveur : Désactivé" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "Réglages IHM avancés" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Progression de la file d'attente des téléchargements" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Afficher le pourcentage" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Afficher la barre de progression " + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Style de la barre de progression" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Plat" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Relief" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Support des thèmes" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Activer le support des skins." + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Skin:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- aucun skin disponible -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Tri des colonnes" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "" +"Trier automatiquement les fichiers dans la file d'attente de téléchargements " +"(gourmand en CPU)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "" +"aMule triera automatiquement les colonnes dans votre liste de téléchargements" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Paramètres avancés de l'interface graphique" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Afficher la prise en charge rapide des liens ED2K" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Afficher des infos supplémentaires sur les onglets des catégories" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Afficher les taux de transfert dans la barre de titre" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Orientation de la barre d'outils verticale" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Montrer le numéro du fichier .part avant le nom du fichier." + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Contrôles à distance" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Paramètres du serveur Web" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Démarrer amuleweb au lancement" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Port du serveur Web" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "Activer la rediection de ports par UPnP sur le port du serveur web." + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Port TCP UPnP du serveur web" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Intervalle de rafraîchissement (en secondes)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Activer la compression Gzip" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Activer l'accès utilisateur sans privilèges" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Mot de passe administrateur" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Mot de passe sans privilèges" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Template web" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Paramètres de connexion externe (EC)" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Accepter les connexions externes" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"Adrese IP des interfaces clientes\n" +"(vide si aucune)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Entrer ici une adresse IP valide dans le format a.b.c.d pour l'interface " +"d'écoute EC. Un champs vide ou 0.0.0.0 signifiera toutes les interfaces." + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "Port TCP" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "Activer la redirection de ports en UPnP sur le port EC" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "" +"Cliquer ici pour appliquer tous les changements effectués dans les " +"Préférences." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Annule tous les changements effectués dans les Préférences." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Titre :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Commentaire :" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Répertoire entrant :" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Changer la priorité des nouveaux fichiers assignés :" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Ne rien changer" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Choisir la couleur pour cette Catégorie (actuellement sélectionnée) :" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Afficher le message de bienvenue du serveur à la connexion..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Infos Serveur" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Cliquer ici pour effacer le journal." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "Journal d'aMule" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "" +"Cliquer ici pour mettre à jour la liste des serveurs à partir de l'URL..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Liste des serveurs" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Entrer l'URL d'un fichier server.met et presser le bouton à gauche pour " +"rafraîchir la liste des serveurs connus." + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Ajout manuel d'un serveur : Nom" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Entrer ici le nom du nouveau serveur" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Entrer ici l'adresse IP du serveur, avec le format x.x.x.x." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Entrer ici le port du serveur." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "Ajouter manuellement un serveur (remplir les champs à gauche avant)..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "Infos ED2K" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Infos Kad" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"La localisation choisie ne semble pas être installée sur votre machine\n" +"Vous devez la générer pour pouvoir utiliser votre langue.\n" +"Un bon début sous Linux est d'aller voir du côté de /etc/locale.gen et du " +"paquet 'locales'\n" +"Bonne chance !\n" +"(Note: je vais quand même essayer de la forcer)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Ne plus jamais montrer ceci" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "" +"Cliquer sur le bouton pour mettre à jour la liste des nœuds depuis l'URL..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Noeuds (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"Entrer l'URL d'un fichier nodes.dat ici et presser le bouton à gauche pour " +"mettre à jour la liste des nœuds connus." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Statistiques des nœuds" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Bootstrap" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Nouveau noeud" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP :" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Port :" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Boostrap depuis\n" +"les clients connus" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Déconnecter Kad" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Brouillage de protocole" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Supporter le brouillage de protocole" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "Cette option a activé le brouillage de protocole, " + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Utiliser le brouillage pour les connections sortantes" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"Avec cette option, aMule utilise le brouillage de protocole lors des " +"connections aux autres clients/serveurs." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Accepter seulement les connections brouillées." + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"Avec cette option, aMule n'accepte ques les connections brouillées: Vous " +"aurez moins de sources, mais tout votre traffic sera brouillé." + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Options des fichiers" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Tout le monde" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Personne" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Qui peut voir votre liste de fichiers partagés :" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "Indique qui peut voir votre liste de fichiers partagés." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "Filtrage des IP" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Filtrage des clients." + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Activer le filtrage des clients selon les IP contenues dans le fichier ~/." +"aMule/ipfilter.dat" + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Filtrage des serveurs." + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Active le filtrage des serveurs selon les IP contenues dans le fichier ~/." +"aMule/ipfilter.dat" + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Recharger la liste" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "" +"Recharge la liste des IP à filtrer à partir du fichier ~/.aMule/ipfilter.dat" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL :" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Mettre à jour maintenant" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Mise à jour d' IPFilter au démarrage" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Niveau de filtrage:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Toujours filtrer les IPs LAN" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Prise en charge paranoïaque des IPs qui ne se correspondent pas" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Rejette le paquet si l'IP du client est différente de l'ip d'où le paquet " +"est envoyé. A utiliser avec prudence." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "Utiliser un ipfilter.dat système si disponible" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" +"S'il n'y a pas de fichier ipfilter.dat local, autoriser l'utilisation d'un " +"fichier ipfilter système." + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "Utiliser l'identification utilisateur sécurisée (SUI)" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" +"Il est recommandé d'activer cette option. Vous ne recevrez pas de crédits si " +"SUI n'est pas activé." + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Marche/Arrêt" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Activer Online-Signature" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Active l'écriture du fichier de signature en ligne, qui peut-être utilisé " +"par des applications extérieurs pour créer des signatures, etc." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Fréquence de mise à jour (Secondes) :" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "" +"Change la fréquence des mises à jour de la signature en ligne (en secondes)." + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Répertoire du fichier Online Signature :" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" +"Cliquer ici pour sélectionner le répertoire contenant le fichier de " +"signature en ligne." + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Activer/Désactiver" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "Filtrer les messages entrant (sauf le Chat en cours) :" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Options de filtrage :" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Filtrer tous les messages" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Filtrer les messages des gens qui ne sont pas sur votre liste d'amis" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Filtrer les messages des clients inconnus" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Filtrer les messages contenant (utiliser ',' comme séparateur) :" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"ajouter ici les mots qu'aMule doit filtrer : bloquage des messages les " +"contenant" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Commentaires" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "Filtrer les commentaires contenant (utiliser ',' comme séparateur) :" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Activer le Proxy" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Active/Désactive le support proxy" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Type de proxy :" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "Type de proxy auquel vous êtes connecté" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Hôte du proxy :" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "Nom de l'hôte du proxy" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Port du proxy :" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "Numéro du port du proxy" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Authentification" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Activer l'authentification" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Active/Désactive l'authentification par nom d'utilisateur/mot de passe" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "Nom d'utilisateur pour se connecter au proxy" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Mot de passe :" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "Mot de passe pour se connecter au proxy" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Connexion automatique au serveur sans proxy" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Se connecter à :" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Connexion distante à aMule" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Nom d'utilisateur" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Se rappeler de ces réglages" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Activer le logging du mode de debugging bavard." + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "Catégories des messages :" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "Ajouter des fichier à importer" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Réessayer avec celui sélectionné" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Supprimer celui sélectionné" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Types d'évenements" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Se connecter à n'importe quel serveur et/ou Kad" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Nouvelle Catégorie" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Choisissez un répertoire pour les fichiers entrants" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Vous devez indiquer un nom pour cette catégorie !" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Vous devez indiquer un chemin pour cette catégorie !" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"Échec de la création du répertoire de réception pour cette catégorie. " +"Indiquez un chemin valide s'il vous plaît !" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "Extension '%s' inconnue pour la commande '%s'.\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "Commande '%s' inconnue\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"Cette commande ne prend pas d'argument.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"Cette commande nécessite un argument.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Cette commande est incomplète, vous devez utilisez une des extensions ci-" +"dessous.\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Extensions disponibles :\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Commandes disponibles :\n" + +#: src/ExternalConnector.cpp:188 +#, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"Toutes les commandes sont insensibles à la casse.\n" +"Tapez '%s ' pour avoir des informations détaillées sur .\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Quitte l'application." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Montrer l'aide." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"Pour avoir de l'aide sur une commande, tapez 'help '.\n" +"Pour avoir la liste complète des commandes, tapez 'help'.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"Utilisez '%s' pour la liste des commandes\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Erreur de syntaxe!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Erreur durant le traitement de la commande - Cela ne devrait jamais " +"arriver ! Rapportez le bug, s'il vous plaît\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Cette commande ne devrait pas avoir de paramètres." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Cette commande nécessite un paramètre." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Argument invalide." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Cette commande est incomplète." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Tapez '%s' pour avoir plus d'aide.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "Cette version est %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "Cette version est %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Création du client en cours...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "Échec de la connexion. Impossible de se connecter à l'hôte spécifié\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"Ok, fin de %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"Connexion impossible sans mot de passe.\n" +"Vous devez spécifier un mot de passe, soit dans le fichier de configuration, " +"soit sur la ligne de commande ; ou l'entrer lorsque l'on vous le demande.\n" +"\n" +"Fin d'exécution...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Montre ce texte d'aide." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "Hôte où aMule tourne. (défaut : localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "Port d'aMule pour les connexions externes (EC). (défaut : 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Mot de passe pour les connexions externes (EC)." + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Configuration lue depuis le fichier." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "Ne pas afficher de sortie sur stdout." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Mode bavard - montre aussi les messages de debug." + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Change la locale du programme (langue)." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "" +"Écrit les options de la ligne de commande dans le fichier de configuration." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "" +"Créé le fichier de configuration à partir du fichier de configuration " +"d'aMule." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Affiche la version du programme." + +#: src/ClientCreditsList.cpp:168 +#, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "Fichier de Crédits chargé, il y a %u client connu" +msgstr[1] "Fichier de Crédits chargé, il y a %u clients connus" + +#: src/ClientCreditsList.cpp:171 +#, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] " - Crédits expirés pour %u client !" +msgstr[1] " - Crédits expirés pour %u clients !" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "Pas de fichier 'cryptkey.dat' trouvé, création." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"ERREUR: le daemon aMule ne peut être utilisé quand les connexions externes " +"dont désactivées. Pour activer les Connexions Externes, utilisez soit un " +"aMule normal, démarrez amuled avec l'option --ec-config ou passez la clé " +"\"AcceptExternalConnections\" à 1 dans le fichier ~/.aMule/amule.conf" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "Erreur : %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Débannir" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Afficher les envois" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Montrer la file d'attente" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Afficher les clients" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Sélectionner la vue" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Programme du client" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Attendu" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Temps d'émission" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Émission/Réception" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "État distant" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "QR : %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Priorité du fichier" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Score" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Demandé" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Vu pour la dernière fois" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Placé en file d'attente" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "État de l'émission" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Transféré" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "État de la réception" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Reçus" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Hash de l'utilisateur" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Crypté" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Cacher les fichiers partagés." + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Détails du client" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f Ko/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Non supporté" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Incomplet" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Mauvais garçon" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Vérification - OK" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Non disponible" + +#: src/ClientDetailDialog.cpp:190 +#, c-format +msgid "%u (QR: %u)" +msgstr "%u (QR : %u)" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" +"La taille minimum doit être inférieur à la taille maximum. Taille maximum " +"ignorée." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Avertissement dans la recherche" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Pas de limite" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "Menu aMule" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Limites de Vitesse :" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "Émission : Aucune" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "Émission : %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "Réception : Aucune" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "Réception : %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Vitesse de réception : %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Vitesse d'émission : %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Informations Client" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Pseudo : %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "Aucun pseudo sélectionné !" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "ID Client : " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Nom du serveur : " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "IP du serveur : " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP : %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "Port TCP : %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "Port TCP : pas prêt" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "Port UDP : %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "Port UDP : pas prêt" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Online Signature : activée" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Online Signature : désactivée" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Fichiers partagés : %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Clients dans la file d'attente : %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "Reçu au total : %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "Émis au total : %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Limite en émission" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Limite en réception" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "Cacher aMule" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "Afficher aMule" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "Début de la session de chat : %s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Connecté au Client ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** Connexion au Client ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Échec de la connexion au client / Connexion perdue ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Fermer l'onglet" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Fermer tous les onglets" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Fermer les autres onglets" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "Chargement du fichier server.met : %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "Le fichier server.net est introuvable !" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "Échec du chargement de fichier server.met '%s', format inconnu." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "Échec de l'ouverture du fichier server.met !" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"Le fichier server.met est corrompu, un tag de version invalide à été " +"trouvé : 0x%x, taille %i" + +#: src/ServerList.cpp:168 +#, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "%i serveur trouvé dans server.met" +msgstr[1] "%i serveurs trouvés dans server.met" + +#: src/ServerList.cpp:170 +#, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d serveur ajouté" +msgstr[1] "%d serveurs ajoutés" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Serveur non ajouté: [%s:%d] n'a pas un port volide." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "Serveur non ajouté : l'IP de [%s:%d] a été filtrée ou est invalide." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" +"Serveur non ajouté : un serveur avec une IP:Port [%s:%d] correspondant a été " +"trouvée dans la liste." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Serveur ajouté : serveur à [%s:%d] utilisant le nom '%s'." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"Vous êtes connecté au serveur que vous tentez de supprimer. Déconnectez-vous " +"d'abord s'il vous plaît." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Échec de l'enregistrement de server.met !" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "URL invalide" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "Téléchargement terminé de la liste de serveur depuis %s" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Échec du téléchargement de la liste des serveurs depuis %s" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"Aucun serveur n'est répertorié dans 'adresses.dat'. Placez-y une liste de " +"serveurs avec leur adresse pour assurer une mise à jour automatique" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "Démarre le téléchargement de la liste de serveur depuis %s" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" +"Attention, l'URL indiqué pour la mise à jour automatique des serveurs est " +"invalide : %s " + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "Pas d'URL valide pour l'auto-update des serveurs dans adresses.dat" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"Le serveur local est filtré par les filtres IP, reconnexion à un autre " +"serveur !" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "Echec de l'éxécution de la commande `%s' lors de l'événement `%s'." + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"Votre locale à été remise à Défaut du Système à cause d'un changement dans " +"la configuration. Désolé." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"Vous n'avez pas de serveurs dans votre liste de serveurs.\n" +"Voulez vous qu'aMule télécharge une nouvelle liste maintenant ?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Téléchargement de la liste de serveurs." + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "Le Serveur web tourne avec le pid %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"Vous avez demandé de lancer le serveur Web au démarrage d'aMule, mais " +"amuleweb n'a pu être trouvé. Installez le paquet contenant le serveur Web " +"d'aMule, ou compilez aMule en utilisant l'option --enable-webserver et " +"lancez make install" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "Impossible de lier les ports à l'adresse spécifiée : %s" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "Le port %u n'est pas disponible. Vous serez LowID\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"Le port %u n'est pas disponible !\n" +"\n" +"Ceci signifie que vous serez LowID.\n" +"\n" +"Vérifiez votre réseau pour être sûr que le port est ouvert en sortie et en " +"entrée." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Échec de la création du fichier OnlineSig" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "Échec de la création du fichier aMule OnlineSig" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"La localisation choisie semble ne pas être installer sur votre machine. " +"(Note : Je tente de la forcer quant même)" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "C'est la première fois que vous lancez aMule %s" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "" +"Cette version est une version de test, mis à jour journalièrement, et\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "" +"nous ne fournissons aucune garantie que cela n'endommagera rien, brûlera " +"votre maison,\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" +"ou tuera votre chien. Mais ça *devrait* être à peu près sûr quand même.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" +"Les options suivantes ont été changées dans cette version pour des raisons " +"de sécurité:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* Activation du brouillage de protocole pour les connections entrantes et " +"sortantes.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* Désactivation de la mise à jour de la liste de serveurs depuis les autres " +"serveurs ou les clients.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"Pour plus d'informations sur les raisons de ces changements, cherchez \n" +"dans le wiki d'aMule à \"fake servers\" sur http://wiki.amule.org\n" +"Il est important que vous enleviez les serveurs 'bidons' de votre liste de " +"serveurs pour qu'aMule fonctionne correctement." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Plus d'informations, de l'aide et de nouvelles versions peuvent être trouvés " +"sur notre page web,\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" +" www.aMule.org, ou sur notre canal IRC : #aMule sur irc.freenode.net.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Ne vous gênez pas pour reporter tout bug sur http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"Le répertoire choisi pour les fichiers de signature en ligne est INVALIDE !\n" +"La signature en ligne sera DÉSACTIVÉE jusqu'à ce que cela soit corrigé dans " +"les préférences." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "ERREUR: impossible d'ouvrir le fichier journal" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "ATTENTION: le fichier journal est vide. Quelque chose ne va pas." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Le journal a été effacé" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "ServerMessage : %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Échec du téléchargement de la liste des nœuds." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Échec de l'ouverture du fichier de vérification de version téléchargé" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Fichier de vérification de version corrompu" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Vous utilisez une version d'aMule qui n'est pas à jour !" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "" +"Votre version d'aMule est %i.%i.%i et la dernière version est %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "" +"La dernière version peut toujours être trouvée sur http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "" +"ATTENTION: votre version d'aMuled n'est pas à jour: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "Votre copie d'aMule est à jour." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Échec du téléchargement du fichier de vérification de version" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Connecté à %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Connexion à %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Déconnecté d'ED2K" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad démarré." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad arrêté." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Connecté à Kad (ok)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Connecté à Kad (pare-feu)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Déconnecté de Kad" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"Le réseau Kad ne peut être utilisé si le port UDP est désactivé dans les " +"préférences, pas de démarrage." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Le réseau Kad est désactivé dans les préférences, pas de connexion." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "" +"Échec de l'ouverture du fichier de liste d'amis 'emfriends.met' pour la " +"lecture!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "" +"Échec de l'ouverture du fichier de liste d'amis 'emfriends.met' pour " +"l'écriture!" + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "" +#~ "Vous ne pouvez pas amorcer une ip particulière depuis l'interface " +#~ "distante pour le moment." + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "" +#~ "Vous ne pouvez pas mettre à jour le server.met depuis le GUI distant pour " +#~ "le moment." + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "%u contacts Kad lus" +#~ msgstr[1] "%u contacts Kad lus" + +#~ msgid "Disconnect from " +#~ msgstr "Se déconnecter de" + +#~ msgid "current server" +#~ msgstr "serveur actuel" + +#~ msgid " and " +#~ msgstr " et " + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "Déconnecter d'un serveur et/ou du réseau Kad" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad : " + +#~ msgid "TCP Flags" +#~ msgstr "Flags TCP" + +#~ msgid "UDP Flags" +#~ msgstr "Flags UDP" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "Copier le(s) lien(s) Ed2k dans le presse-papiers" + +#~ msgid "Client requests %u" +#~ msgstr "Le client demande %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "Bloc fichier %u-%u (%d octets) :" + +#~ msgid "Client request is invalid!" +#~ msgstr "La requête du client est invalide !" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "La requête du client est invalide! %i / %i" + +#~ msgid "Command: %s" +#~ msgstr "Commande : %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "Impossible d'ouvrir le fichier %s - Utilisation du fichier %s." + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "Attention: known.met n'existe pas." + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles: Suppression de %s de la liste des " +#~ "répertoires partagés: répertoire non trouvé" + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "Échec de l'attente de la fin des sous-processus" + +#~ msgid "" +#~ "You cannot connect to a release version from an arbitrary CVS version! " +#~ "*sigh* possible crash prevented" +#~ msgstr "" +#~ "Vous ne pouvez pas vous connecter à une version finale depuis n'importe " +#~ "quelle version CVS! *soupir* prévention d'un crash possible" + +#~ msgid "doesn't work" +#~ msgstr "ne fonctionne pas" + +#~ msgid "remote gui" +#~ msgstr "interface graphique distante" + +#~ msgid "" +#~ "Error: Failed to load backup file. Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Erreur : Échec du chargement du fichier de sauvegarde. Cherchez sur " +#~ "http://forum.amule.org pour obtenir des solutions de récupération de vos ." +#~ "part et .met" + +#~ msgid "" +#~ "Error: Backup part.met file is 0 size! Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Erreur : le fichier de backup de part.met est de taille nulle ! Cherchez " +#~ "sur http://forum.amule.org des solutions pour récupérer le fichier" + +#~ msgid "Error: part.met backup file is 0 size: %s ==> %s" +#~ msgstr "" +#~ "Erreur : La taille du fichier part.met de sauvegarde est nulle : %s ==> %s" + +#~ msgid "" +#~ "Note: These values are\n" +#~ " only used for statistics." +#~ msgstr "" +#~ "Note: ces valeurs sont seulement\n" +#~ "utilisées pour les statistiques." + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ " Client p2p multi-plateforme basé sir eMule\n" +#~ "\n" +#~ " Site Internet:http://www.amule.org\n" +#~ " Forum: http://forum.amule.org\n" +#~ " FAQ: http://wiki.amule.org\n" +#~ "\n" +#~ " Contact: admin@amule.org (pour des problèmes d'administration)\n" +#~ " Copyright (C) 2003-2008 aMule Team\n" +#~ "\n" +#~ " Une partie d'aMule est basée sur\n" +#~ " Kademlia: Routage peer-to-peer basé sur une métrique XOR.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "ATTENTION: Vous êtes en Low-ID !" + +#~ msgid "" +#~ "This command requieres an argument. Valid arguments: 'all' or a number.\n" +#~ msgstr "" +#~ "Cette commande requiert un argument. Les arguments valides sont : 'all' " +#~ "ou en nombre.\n" + +#~ msgid "This command requieres an argument. Valid arguments: a file hash.\n" +#~ msgstr "" +#~ "Cette commande requiert un argument. Arguments valides: hash d'un " +#~ "fichier.\n" + +#~ msgid "Deprecated command, now 'Status'." +#~ msgstr "Commande dépréciée, maintenant appelée 'Status'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Status' instead.\n" +#~ msgstr "" +#~ "Ceci est une commande dépréciée, et pourrait être supprimée dans le " +#~ "futur.\n" +#~ "Utilisez 'Status' à la place.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter'." +#~ msgstr "Commande dépréciée, maintenant appelée 'Set IPFilter'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter' instead.\n" +#~ msgstr "" +#~ "Ceci est une commande dépréciée, et pourrait être supprimée dans le " +#~ "futur.\n" +#~ "Utilisez 'Set IPFilter' à la place.\n" + +#~ msgid "Deprecated command, now 'Get IPFilter Level'." +#~ msgstr "Commande dépréciée, maintenant appelée 'Get IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Ceci est une commande dépréciée, et pourrait être supprimée dans le " +#~ "futur.\n" +#~ "Utilisez 'Get IPFilter Level' à la place.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter Level'." +#~ msgstr "Commande dépréciée, maintenant appelée 'Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Ceci est une commande dépréciée, et pourrait être supprimée dans le " +#~ "futur.\n" +#~ "Utilisez 'Set IPFilter Level' à la place.\n" + +#~ msgid "Deprecated command, now 'Get/Set IPFilter Level'." +#~ msgstr "Commande dépréciée, maintenant appelée 'Get/Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get/Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Ceci est une commande dépréciée, et pourrait être supprimée dans le " +#~ "futur.\n" +#~ "Utilisez 'Get/Set IPFilter Level' à la place.\n" + +#~ msgid "Deprecated command, now 'Show Servers'." +#~ msgstr "Commande dépréciée, maintenant appelée 'Show Servers'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Show Servers' instead.\n" +#~ msgstr "" +#~ "Ceci est une commande dépréciée, et pourrait être supprimée dans le " +#~ "futur.\n" +#~ "Utilisez 'Show Servers' à la place.\n" + +#~ msgid "Deprecated command, now 'Get BwLimits'." +#~ msgstr "Commande dépréciée, maintenant appelée 'Get BwLimits'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get BwLimits' instead.\n" +#~ msgstr "" +#~ "Ceci est une commande dépréciée, et pourrait être supprimée dans le " +#~ "futur.\n" +#~ "Utilisez 'Get BwLimits' à la place.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Up'." +#~ msgstr "Commande dépréciée, maintenant appelée 'Set BwLimit Up'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Up' instead.\n" +#~ msgstr "" +#~ "Ceci est une commande dépréciée, et pourrait être supprimée dans le " +#~ "futur.\n" +#~ "Utilisez 'Set BwLimit Up' à la place.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Down'." +#~ msgstr "Commande dépréciée, maintenant appelée 'Set BwLimit Down'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Down' instead.\n" +#~ msgstr "" +#~ "Ceci est une commande dépréciée, et pourrait être supprimée dans le " +#~ "futur.\n" +#~ "Utilisez 'Set BwLimit Down' à la place.\n" + +#~ msgid "Syncronization thread started." +#~ msgstr "Thread de synchronisation démarré." + +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "Les masterhashes des fichiers connus ont été chargés." + +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "Erreur lors de la lecture des contacts Kad - 0 entrées" + +#~ msgid "Merge attempt" +#~ msgstr "Tentative de fusion" + +#~ msgid "Recursive merge" +#~ msgstr "Fusion récursive" + +#~ msgid "Sucessful merge!" +#~ msgstr "Fusion réussie!" + +#~ msgid "No merge possible" +#~ msgstr "Pas de fusion possible" + +#~ msgid "Buddy address: " +#~ msgstr "Adresse du buddy : " + +#~ msgid "Allow usage of system wide ipfilter.dat" +#~ msgstr "Autoriser l'utilisation d'un fichier ipfilter.dat système" + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid " %d" +#~ msgstr "·····%d" + +#~ msgid ".%d" +#~ msgstr ".%d" + +#~ msgid "Shows the process of a search." +#~ msgstr "Montre la progression d'une recherche." + +#~ msgid "Shows the process of a search..\n" +#~ msgstr "Montre la progression d'une recherche..\n" + +#~ msgid "Search warning." +#~ msgstr "Avertissement dans la recherche" + +#~ msgid "Client Identification:" +#~ msgstr "Identification client :" + +#~ msgid "Use Secure Identification" +#~ msgstr "Utiliser l'identification sécurisée" + +#~ msgid "" +#~ "Secure Identification uses a handshake approch to safely identify clients " +#~ "for use with the credit system." +#~ msgstr "" +#~ "L'identification sécurisée utilise une approche 'poignée de mains' pour " +#~ "identifier les clients de manière sécurisée et utiliser le système de " +#~ "crédits." + +#~ msgid "Sources Dropping" +#~ msgstr "Nettoyage des sources" + +#~ msgid "Source Dropping" +#~ msgstr "Nettoyage des sources" + +#~ msgid "Keep sources" +#~ msgstr "Garder les sources" + +#~ msgid "Drop sources" +#~ msgstr "Effacer les sources" + +#~ msgid "Send sources to any other file before dropping (High CPU)" +#~ msgstr "" +#~ "Envoyer les sources vers n'importe quel autre fichier avant de nettoyer " +#~ "(gourmand en CPU)" + +#~ msgid "Sources with no needed file-parts." +#~ msgstr "Sources avec des parties inutiles (NNS)." + +#~ msgid "Full Queue Sources Handling" +#~ msgstr "Gestion des files d'attente pleines (FQS)" + +#~ msgid "Enable auto drop Full Queue Sources" +#~ msgstr "Activer le nettoyage automatique des files d'attente pleines" + +#~ msgid "High Queue Rating Sources Handling" +#~ msgstr "Gestion des rangs de file d'attente élevés (HQRS)" + +#~ msgid "Enable auto drop High Queue Rating Sources" +#~ msgstr "Activer le nettoyage automatique des rangs de file d'attente élevés" + +#~ msgid "High Queue Rating value" +#~ msgstr "Valeur de rang de file d'attente élevée" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(Mini 300 / Max 3000)" + +#~ msgid "Auto Drop Sources Timer" +#~ msgstr "Fréquence de nettoyage automatique des sources" + +#~ msgid "Timer (in secs)" +#~ msgstr "Fréquence (en secondes)" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(Mini 60 / 3600 Max)" + +#~ msgid "Drop No Needed Sources now" +#~ msgstr "Supprimer les sources inutiles immédiatement (NNS)" + +#~ msgid "Drop Full Queue Sources now" +#~ msgstr "" +#~ "Supprimer les sources dont la file d'attente est pleine immédiatement " +#~ "(FQS)" + +#~ msgid "Drop High Queue Rating Sources now" +#~ msgstr "" +#~ "Supprimer les sources dont la file d'attente est élevée immédiatement " +#~ "(HQRS)" + +#~ msgid "Clean Up Sources now (NNS, FQS && HQRS)" +#~ msgstr "Nettoyer les sources immédiatement (NNS, FQS && HQRS)" + +#~ msgid "English (U.S.)" +#~ msgstr "Anglais (U.S.)" + +#~ msgid "Spanish (Mexican)" +#~ msgstr "Espagnol (Mexicain)" diff --git a/po/gl.po b/po/gl.po new file mode 100644 index 00000000..7e8377e7 --- /dev/null +++ b/po/gl.po @@ -0,0 +1,7514 @@ +# translation of gl.po to Galego +# This file is distributed under the same license as the aMule package. +# +# Nota para traductores: +# Se algunha vez queredes traducir algún programa tradúceo +# coa codificación UTF-8 para que non lle de problemas a ninguén, +# ou ben usade este comando para converter de calquera codificación +# a UTF-8: +# msgconv -t UTF-8 gl.po > gl.po.new && mv gl.po.new gl.po +# Onde gl.po é o ficheiro que estades a traducir. +# Copyright (C) YEAR aMule Team. +# +# Josemari Rodríguez Gutiérrez , 2004. +# Ignacio Casal Quinteiro , 2005, 2006. +# Ignacio Casal Quinteiro , 2007. +# Festor Wailon Dacoba , 2007. +# +# +msgid "" +msgstr "" +"Project-Id-Version: gl\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2008-01-04 09:17+0100\n" +"Last-Translator: Festor Wailon Dacoba \n" +"Language-Team: Galego \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" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Debe especificar un contrasinal non baleiro." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Contrasinal inválido, sen un hash MD5!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Erro de conexión" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "Conexión EC fallida. Resposta baleira." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "ExternalConn: Acceso denegado porque: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "ExternalConn: Acceso denegado" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "ExternalConn: Resposta do servidor mala. Conexión pechada." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Éxisto! Conexión establecida en aMule" + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Éxito! Conexión establecida." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Hasheando" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Completando" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Completado" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Pausado" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Erróneo" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Descargando" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Agardando" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Creando hash AICH e MD4 para o ficheiro: %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Creando hash MD4 para o ficheiro: %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Creando hash AICH para o ficheiro: %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "Convertendo conxuntos hash AICH antigos en '%s' a 64b en '%s'" + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "AVISO: O nome do ficheiro '%s' é inválido e foi renomeado a '%s'." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "" +"AVISO: O ficheiro '%s' xa existe, un ficheiro novo foi renomeado a '%s'." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" +"AVISO: Non se puido eliminar o '%s' orixinal despois de crear a copia de " +"seguranza" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "AVISO: Fallou ao eliminar %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Erro ao recupera-los ficheiros compartidos do usuario '%s'" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Descoñecido" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (Fake eMule versión %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (Fake eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (Fake eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (basado en eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Alcume: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "Petición:" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Estatísticas do ficheiro para esta sesión: Aceptadas %d de %d peticións; %s " +"transferidas\n" +msgstr[1] "" +"Estatísticas do ficheiro para esta sesión: Aceptadas %d de %d peticións; %s " +"transferidas\n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Estatísticas do ficheiro para todas as sesións: Aceptadas %d de %d " +"peticións; %s transferidas\n" +msgstr[1] "" +"Estatísticas do ficheiro para todas as sesións: Aceptadas %d de %d " +"peticións; %s transferidas\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Petición dun ficheiro descoñecido" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "Cliente %s en IP: Porto %s:%d usando %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Nome de usuario" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Amigos" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Ver &Detalles" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Engadir un amigo" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Borrar amigo" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Enviar &Mensaxe" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Ver ficheiros" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Establecer ranura de amigo" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Estás seguro de que queres borrar o(s) amigo(s) seleccionado(s)?" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Estás seguro de que queres borrar o(s) amigo(s) seleccionado(s)?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Cancelar" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"Non está permitindo establecer máis dun espazo de amigo.\n" +" Só un espazo foi asignado." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Selección múltiple" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Nome do arquivo" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Tamaño" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Tipo" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Prioridade" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "IDFicheiro" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Peticións" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Peticións aceptadas" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Datos transferidos" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Media de compartido" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Partes obtidas" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Fontes completas" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Ruta de directorio" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Ficheiros compartidos" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Moi baixo" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Baixo" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normal" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Alto" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Moi alto" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Lanzamento" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Automático" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Engadir Comentario/Calificación" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Editar Comentario/Calificación" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Renomear" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Engadir os ficheiros en colección á lista de tranferencia" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Copiar a &URI magnética ao portapapeis" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Copiar ED2K en&lace o suxeitapapeis" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Copiar enlace ED2K ao portapapeis (fonte&S)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "Copiar ligazón ED2k ao portapapeis (Fonte) (&Con opcións de cifrado)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Copiar ligazón ED2k ao portapapeis (Nome do &host)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" +"Copiar ligazón ED2k ao portapapeis (Nome do host) (Con opcións de &cifrado)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Copiar ED2K enlace o suxeitapapeis (&AICH info)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Copiar resposta ao portapapeis" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "Necesitas ter IDALTA para crear un enlace de fonte válido" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Aviso" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Ficheiros compartidos (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[PartFile]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Introducir un novo nome para este ficheiro:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Renomear o ficheiro" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Resumindo subidas de ficheiro: %s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Suspendendo subida de ficheiro: %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: palabra de busca demasiado corta" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Erro: Non se puido escoitar o porto TCP." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "Petición fallida co seguinte erro: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "Petición fallida cun erro descoñecido." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "Ficheiro índice non atopado: " + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Imposible crear un socket web\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Servidor Web: Iniciado\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Sesión expirada - petición de conexión\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Sesión aceptada, conectado\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Sesión aceptada, non conectado\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Ningunha sesión aberta - petición de conexión\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Sesión creada - petición de conexión\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Procesando petición [orixinal]: " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Comprobando contrasinal\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Contrasinal hash inválido\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Contrasinal aceptado\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Contrasinal erróneo\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "" +"Non introduciches ningún contrasinal. Un contrasinal en branco non está " +"permitido.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Desconexión solicitada\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Procesando solicitude [redirixida]: " + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Cargar modelo " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Porto HTTP do servidor Web" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Usar seguimento do porto UPnP no porto do servidor web" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "Porto UPnP" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Usar compresión gzip" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Contrasinal de acceso completo para servidor web" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Contrasinal de invitado para servidor web" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Permitir acceso de invitado" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Denegar acceso de invitado" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "Cargar/gardar opcións do servidor web desde/a aMule remoto" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "Ruta do ficheiro de configuración de aMule. NON USAR DIRECTAMENTE!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "Desactivar intérprete PHP (obsoleto)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Recompila páxinas PHP para outra petición" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "Servidor Web aMule" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Non dispoñible" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Nunca" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Descargando..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Preferencias" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "Directorio que contén o ficheiro amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Navegador" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Introduza aquí o directorio onde está teu ficheiro amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Intervalo de refresco en segundos" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Xerar un ficheiro de estatísticas sempre que se actualice" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "Introduza aquí o directorio onde quere xerar a imaxe de estatísticas" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Sube periodicamente túa imaxe de estatísticas ao servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "Url FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "Ruta FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Introduza aquí a URL do seu servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" +"Introduza aquí o directorio onde poñer a súa imaxe de estatísticas no " +"servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Usuario" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Contrasinal" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Introduza aquí o nome de Usuario para conectarse a teu servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "" +"Introduza aquí o contrasinal de Usuario para conectarse a teu servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "Intervalo de actualización de FTP en minutos" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Validado" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "O cartafol que contén teu ficheiro de sinatura" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Cartafol onde se xenera a imaxe de estatísticas" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i día(s) %i hora(s) %i min %i s" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, Estatísticas aMule en liña" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Benvido!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Máximo índice de DE desde que wxCas está executándose" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "Máximo índice DE absoluto durante execucións anteriores de wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Reaxustar" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "Sistema" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Deter auto recargar" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Gardar imaxe de estatísticas en liña" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Imprimir imaxe de estatísticas en liña" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Preferencias" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "Acerca de wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Iniciar auto recargar" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Auto recarga detida" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Auto recarga iniciada" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Gardar imaxe de estatísticas" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Sen asociar este tipo de ficheiro." + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "O ficheiro non foi gardado" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "Estatísticas aMule en liña" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Houbo un problema imprimindo.\n" +"Tal vez túa impresora actual non esté configurada?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Imprimindo" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, Estatística de sinatura en liña de aMule\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Basado en CAS por Pedro de Oliveira \n" +"\n" +"Distribuido baixo GPL" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Oh Oh, non se está executando aMule..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule está iniciado" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule estase executando, pero está desconectado" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule está conectando..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Oh Oh, estado de aMule descoñecido..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " foi executado durante " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " está detido !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " non está conectado!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " está conectando..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " pasou algo estraño, compróbao !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " está conectado a " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "aceptar" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "cortafogos" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "apagar" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " conectado" + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +#, fuzzy +msgid " with " +msgstr "] con " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Total descargado: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Subido: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Descarga de sesión: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Descargado: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s, Subido: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "Kb/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Compartindo: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " ficheiro(s), Clientes en cola: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Tempo: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " en " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Media de carga de sistema (1-5-15 min): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Tempo de execución do sistema: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uD %02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "IDalta" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "IDbaixa" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Non conectado" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "Cancelado !" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Non se pode abrir %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "" +"O ficheiro %s é demasiado grande para o Donkey: o máximo permitido é 4 GB." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Parámetros de entrada" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Ficheiro a hashear" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Engadir URLs opcionais para este ficheiro" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Introduza aquí o ficheiro que queira codificar como enlace Ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Introduza aquí a URL que queira engadir ao ligazón Ed2k: Engade / ao final, " +"para deixar a aLinkCreator continuar co actual nome de ficheiro" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Engadir" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Eliminar" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Limpar" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Crear ligazón con codificacións de partes" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Axuda para separar ficheiros novos e raros máis rapidamente, o coste será un " +"tamaño de ligazón maior" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "Ficheiro Hash MD4" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "Ficheiro Hash ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "Ligazón ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Comezar" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Gardar" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Copiar ao portapapeis" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Saír" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Abre un ficheiro para crear un ligazón ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Copiar enlace ED2K creado ao portapapeis" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Gardar un ligazón ed2k creado a un ficheiro" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "Acerca do aLinkCreator" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Selecciona o ficheiro do cal quere crear un ligazón ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "Nada para copiar agora !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Selecciona o ficheiro ao ligazón ed2k creado" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Non se pode abrir" + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Por favor introduza un nome de ficheiro non baleiro" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "Nada para gardar agora !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, o creador de enlaces ed2k de aMule\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps de http://www.everaldo.com e http://www.icomania.com\n" +"e http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distribuido baixo GPL" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Hasheando..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Feito en %.2f s" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "Xa ten engadida esta URL !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Por favor, introduza unha URL non baleira" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "Procesando número de ficheiro %u: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "Preguntou por hashes de partes (Só usado por ficheiros > 9.5 MB)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Por favor agarde... " + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> Non existe o ficheiro!\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, o creador de ligazóns ed2k de aMule" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Auto [Ba]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Auto [No]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Auto [Al]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Conectando" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Preguntando" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Conectando ví­a servidor" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Cola chea" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "En cola" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Transferindo" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Recibindo hashset" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Sen partes necesarias" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Non se pode realiza-la conexión IDbaixa con IDbaixa" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Demasiadas conexións" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Conectando ví­a Kad" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Demasiadas conexións Kad" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Vetado" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Erro de conexión" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Cola remota chea" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "Vello MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "Novo MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "eMule compatible" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Servidor local" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Servidor remoto" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Intercambio de fontes" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Pasivo" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Ligazón" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Fontes seeds" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Por defecto" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Árabe" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Euskera" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Búlgaro" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Catalán" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Chinés (Simplificado)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Chinés (Tradicional)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Croata" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "Checo" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Danés" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Holandés" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Inglés (R. U.)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Estonio" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Finlandés" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Francés" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Galego" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Alemán" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "Grego" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Húngaro" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Italiano" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Italiano (Suizo)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "Xaponés" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Coreano" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "Lituano" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "Noruego (Nynorsk)" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Polaco" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portugués" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Portugués (Brasileiro)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Ruso" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Esloveno" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Castelán" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "Sueco" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Turco" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Imposible determinar o navegador seleccionado!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" +"O porto TCP non pode ser máis alto que 65532 debido a que o socket do " +"servidor UDP está sendo TCP+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Empregarase o porto predeterminado (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Nome do servidor" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Enderezo" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Porto" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Descrición" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Usuarios" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Ficheiros" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Erro" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Estático" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Versión" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Está conectado ao servidor que tenta borrar. Por favor desconéctese " +"primeiro. O servidor NON foi borrado." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Información" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(Nome descoñecido)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "¿Estas seguro de que queres borrar o servidor estático %s?" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Si" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Non" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Erro ao abrir '%s'" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Servidores (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Servidor" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Conectar ao servidor" + +#: src/ServerListCtrl.cpp:428 +#, fuzzy +msgid "Mark server as static" +msgstr "Marcar servidor(es) como estático(s)" + +#: src/ServerListCtrl.cpp:429 +#, fuzzy +msgid "Mark server as non-static" +msgstr "Marcar servidor(es) como non estático(s)" + +#: src/ServerListCtrl.cpp:431 +#, fuzzy +msgid "Mark servers as static" +msgstr "Marcar servidor(es) como estático(s)" + +#: src/ServerListCtrl.cpp:432 +#, fuzzy +msgid "Mark servers as non-static" +msgstr "Marcar servidor(es) como non estático(s)" + +#: src/ServerListCtrl.cpp:438 +#, fuzzy +msgid "Remove server" +msgstr "Borrar servidor(es)" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "Borrar servidor(es)" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Borrar todos os servidores" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Copiar enlace ED2K ao portapapeis" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "Copiar enlace ED2K ao portapapeis" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Reconectar ao servidor" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "¿Estas seguro de que queres borrar todos os servidores?" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "¿Estas seguro de que queres borrar o servidor(es) seleccionado(s)?" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "¿Estas seguro de que queres borrar o servidor(es) seleccionado(s)?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Desactivado [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "Este é aMule %s basado en eMule" + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "Executando en %s" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "Visita http://www.amule.org por se existe algunha nova versión." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Erro fatal: Erro ao crear temporizador" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "control remoto de aMule" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Foto instantánea:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" +"Cliente p2p multiplataforma baseado no eMule\n" +"\n" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr " Páxina web: http://www.amule.org \n" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr " Foro: http://forum.amule.org \n" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" +" FAQ: http://wiki.amule.org \n" +"\n" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr " Contacto: admin@amule.org (asuntos de administración) \n" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "Parte do aMule baséase en \n" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "Kademlia: Peer-to-peer enrutamiento baseado na métrica XOR.\n" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr " Copyright (C) 2002 Petar Maymounkov\n" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr " http://kademlia.scs.cs.nyu.edu\n" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Mensaxe" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Estado do texto" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "Conectando" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "Desconectado" + +#: src/amuleDlg.cpp:676 +#, fuzzy +msgid "Kad: Firewalled" +msgstr "Cortafogos" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "Conectado" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "Conectando" + +#: src/amuleDlg.cpp:689 +#, fuzzy +msgid "Kad: Off" +msgstr " Kad: " + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "Deter a tentativa actual de conexión" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Desconectado" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "Desconectado da rede." + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Conectar" + +#: src/amuleDlg.cpp:726 +#, fuzzy +msgid "Connect to the currently enabled networks" +msgstr "Conectar á rede." + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Su: %.1f(%.1f) | Ba: %.1f(%.1f))" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Su: %.1f | Ba: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | Conectado)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | Desconectado)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "¿Desexar saír de aMule?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Confirmación de saída" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Non se puido determinar o comando para executar o navegador." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "O directorio de temas '%s' non existe" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "Aviso: Imposible abrir o ficheiro de tema '%s' para lectura" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Redes" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Fiestra de Redes" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Buscas" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Fiestra de buscas" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Transferencias" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Fiestra de transferencias de ficheiros" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Fiestra de ficheiros compartidos" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Mensaxes" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Fiestra de mensaxes" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Estatísticas" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Fiestra de gráficos de estatísticas" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Fiestra de preferencias" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Importar" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "A ferramenta para importar ficheiros part" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "Acerca de" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "Acerca de/Axuda" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Xeral" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Conexión" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Proxy" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Filtro de mensaxe" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Controles remotos" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Sinatura Online" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Directorios" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Seguranza" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "Tweaks Gui" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Tweaks núcleo" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Eventos" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Depurando" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Definido polo usuario" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"aMule debe ser reiniciado para activar estes trocos:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- Porto TCP cambiado.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- Porto UDP cambiado.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"Túa auto-actualización da lista de servidores está en branco.\n" +"'Auto-actualizar lista de servidores ao iniciar' deshabilitarase." + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"Tes activado conexións externas pero non ten especificado un contrasinal.\n" +"Conexións externas non poden ser activadas a non ser que especifique un " +"contrasinal válido." + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- Idioma cambiado.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- Cartafol temporal cambiado.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Subida: 0.0 | Baixada: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"As redes ED2K e Kas están desactivadas.\n" +"Non poderá conectar a non ser que active algunha delas." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"Kad non se iniciará se non está activado o porto UDP.\n" +"Activar o porto UDP ou desactivar Kad." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"Debe reiniciar o aMule agora.\n" +"Se non o reinicia ahora, algo malo pode suceder.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "AVISO" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"Túa auto-actualización da lista de servidores está en branco.\n" +"Por favor completa ao menos unha URL para sinalar un ficheiro server.met.\n" +"Prema no botón \"Lista\" para introducir unha URL." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "Ficheiros temporais" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Ficheiros entrantes" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Sinaturas Online" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Escolla un cartafol para %s" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Examinar wav" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "Ficheiro wav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Atopar o reproductor de vídeo" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Selecione o navegador" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Executable%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Editar lista de servidores" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Engadir aquí unha URL para descargar unha lista server.met.\n" +"Só unha url nesta liña" + +#: src/PrefsUnifiedDlg.cpp:980 +#, fuzzy, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Periodo de actualización: %d segs" +msgstr[1] "Periodo de actualización: %d segs" + +#: src/PrefsUnifiedDlg.cpp:987 +#, fuzzy, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Tempo medio de gráfico: %d mins" +msgstr[1] "Tempo medio de gráfico: %d mins" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Escala gráfica de conexións: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, fuzzy, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Frecuencia de actualización: %d segs" +msgstr[1] "Frecuencia de actualización: %d segs" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, fuzzy, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Tamaño do ficheiro búfer %d bytes" +msgstr[1] "Tamaño do ficheiro búfer %d bytes" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, fuzzy, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Tamaño da cola de subida %d clientes" +msgstr[1] "Tamaño da cola de subida %d clientes" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, fuzzy, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Intervalo de refresco da conexion ao servidor: %d minutos" +msgstr[1] "Intervalo de refresco da conexion ao servidor: %d minutos" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Intervalo de refresco da conexion ao servidor. Desactivada" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Executar comando no evento `%s'" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Activar execución de comando no núcleo" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Comando do núcleo:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Activar execución de comando no GUI" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "Comando de GUI:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "As seguintes variables serán reemprazadas:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Intento de acceso non autorizado. Conexión pechada." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Conexión externa pechada." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "Conexión externas desactivadas debido a un contrasinal baleiro!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "Conexións externas desactivadas no ficheiro de configuración" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Nova conexión externa aceptada" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "Erro: non se puido aceptar unha nova conexión externa" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" +"Conexión externa refusada debido a un contrasinal baleiro nas preferencias!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "Conectando ao cliente: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Versión descoñecida" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"EC incorrecto na ID de versión, debe haber unha incompatibilidade. Usa " +"núcleo e remoto da mesma versión." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "Fallou a autenticación." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Versión de protocolo inválido." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Marcador de versión de protocolo inexistente." + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Resposta inválida, debería autenticarse primeiro." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Acceso concedido." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "Fallou o comando remoto PartFile: Ficheiro hash non atopado: %s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "Ficheiro hash non atopado: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "OOPS! Erro de proceso de OpCode!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Servidor non engadido" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "servidor non atopado: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "necesita definir o servidor que se vai a eliminar" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "ED2K está desactivado nas preferencias." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "Busca en progreso. Resultado obtidos en breve!" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "Buscador web da interface remota non fai sensible." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad está desactivado nas preferencias." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Sen puntos para gráfica." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "Seu cliente non está configurado para este nivel de detalle." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "Conexión externa: apagado solicitado" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Xa está apagando." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "Conexión externa: engadindo ligazón '%s'." + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Ligazón inválido ou xa está na lista." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "Ficheiro non atopado." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Nome de ficheiro inválido." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Imposible renomear o ficheiro." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Xa está conectado a ED2K." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Conectando a ED2K..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Xa está conectado a Kad." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Conectando a Kad..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Tódalas redes están desactivadas." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Desconectado de ED2K." + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Desconectado de Kad." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "Conexión externa: recibido opcode inválido: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "opcode inválido (versión de protocolo inválido?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" +"Fallou ao abrir o ficheiro (%s), eliminando da lista de ficheiros " +"compartidos." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "Petición hashset para un ficheiro descoñecido: %s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "Comando `%s' con pid `%d' rematou con código de estado `%d'." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "Servidor non engadido: Non se especificou IP ou nome de servidor." + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "Servidor non engadido: Porto de servidor especificado inválido." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "Estado ED2K:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Conectado" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Porto" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Estado Kademlia:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Executando" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Estado:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Desconectado" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Estado de conexión:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Cortafogos" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "Ok" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Estado do cortafogos:" + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Conectado a amigo" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "Non amigo" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Media de usuarios:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "Media de ficheiros:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "Non executando" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Tempo de execución: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Transferencias" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Subidas" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Datos subidos (Sesión (Total)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Overhead total (Paquetes ): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Petición de ficheiro Overhead (Paquetes): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "Intercambio de fontes Overhead (Paquetes): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Servidores Overhead (Paquetes): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Overhead Kad (Paquetes ): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Subidas activas: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Subidas agardando: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Sesión de subidas totais rematadas: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Total de subidas erradas na sesión: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Tempo medio de subida: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Descargas" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Datos descargados (Sesión (Total)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Fontes atopadas: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Descargas activas (pedazos): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Índice SU:BA Sesión (Total): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Velocidade media de descarga (Sesión): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Velocidade media de subida (Sesión): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Velocidade de descarga máxima (Sesión): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Velocidade de subida máxima (Sesión): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Reconexións: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Tempo dende a primeira tranferencia: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Conectado ao servidor dende: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Conexións activas (estimadas): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Lí­mite máximo de conexións rechazado: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Media de conexións (estimado): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Pico de conexións (estimado): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Clientes" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Filtrado" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Total:%i Coñecido: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Servidores" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Servidores activos: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Servidores caídos: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Total: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Servidores borrados: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Servidores filtrados: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Usuarios en servidores activos: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "Ficheiros nos servidores activos: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Usuarios totais: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "Ficheiros totais: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Ocupación do servidor: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Número de ficheiros compartidos: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Tamaño total dos ficheiros compartidos: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Tamaño medio dos ficheiros: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "IDBaixa: %u (%.2f%% Total %.2f%% Coñecido)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "IdentSeg On/Off: %u (%.2f%%) : %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Sistema operativo" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "Non recibido" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Cortar" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Copiar" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Pegar" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Seleccionar todo" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "A busca de Kad non pode ser feita se non está executando Kad" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "A busca ED2K non pode ser feita se non está conectado a ED2K" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Erro inesperado tentando buscar en Kad:" + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "Mensaxe filtrada de '%s' (IP: %s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "Nova mensaxe de '%s' (IP: %s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" +"O usuario %s (%u) solicitou a túa lista de ficheiros compartidos -> Aceptado" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" +"O usuario %s (%u) solicitou a túa lista de ficheiros compartidos -> Denegado" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" +"O usuario %s (%u) solicitou a túa lista de cartafoles compartidos -> Aceptado" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" +"O usuario %s (%u) solicitou a túa lista de cartafoles compartidos -> Denegado" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"O usuario %s (%u) solicitou a túa lista de ficheiros compartidos do " +"directorio %s -> aceptado" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"O usuario %s (%u) pediu a súa lista de ficheiros compartidos do directorio %" +"s -> denegado" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "O usuario %s (%u) directorios compartidos %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "" +"O usuario %s (%u) enviou unha lista de directorios compartidos non desexada." + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" +"O usuario %s (%u) enviou a súa lista de ficheiros compartidos ao cartafol %s" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "" +"O usuario %s (%u) rematou de enviar a súa lista de ficheiros compartidos" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "" +"O usuario %s (%u) enviou unha lista de ficheiros compartidos non deseada" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" +"Usuario %s (%u) denegou o acceso á lista de ficheiros/cartafoles compartidos " + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Nodos (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "Ip inválida ao bootstrap" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Porto inválido ao bootstrap" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Por favor encha todos os campos requeridos" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Estas seguro de que queres descargar un ficheiro nodes.dat novo?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" +"Facendo isto borrarás os teus nodos actuais e reiniciarás a conexión " +"Kademlia." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Continuar?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Erro: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Aviso: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Engadir un amigo" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Tes que introducir un porto e unha ip válidos" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Información" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "O hash de usuario especificado non é válido!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Fontes" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Ficheiro" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Descarga" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Categoría" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Principal" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Descargar en categoría" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "Buscar ficheiros similares (ED2k, servidor local)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "Marcar o arquivo como coñecido" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Connectar a amule remoto" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Fallou a conexión" + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Erro" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"AVISO: Non pode engadir a si mesmo como unha fonte para unha ligazón ed2k " +"mentras teña id baixa." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Usuarios: E: %s K: %s | Ficheiros E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Todo" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Usuarios totais: %s | Ficheiros totais: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Transferido" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Completado" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Velocidade" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Progreso" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Estado" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Tempo para rematar" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Última vez visto completo" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Última recepción" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "¿Estás seguro de que queres borrar o(s) ficheiro(s) seleccionado(s)?" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "¿Estás seguro de que queres borrar o(s) ficheiro(s) seleccionado(s)?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Enviar mensaxe a usuario" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Mensaxes a enviar:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Deter" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Pausa" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "Continua&R" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "&limpeza completada" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Pasar todas as A4AF a este ficheiro agora" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Pasar todas as A4AF a este ficheiro (Automático)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Pasar todas as A4AF a outro ficheiro agora" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Opcións extendidas" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Previsualizar" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Mirar &detalles do ficheiro" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Ver todo-los comentarios" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Copiar a URI magnética ao portapapeis" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "sen asignar" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Asignar a categoría" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "Abri-lo arquiv&O" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Eliminar de amigos" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Engadir a amigos" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Enviar mensaxe" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Intercambiar este ficheiro" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "Kb/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "QR: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Preguntando por outro ficheiro" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Descargas (%i)" + +#: src/DownloadListCtrl.cpp:2222 +#, fuzzy +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"Por favor estableza o seu reproductor de vídeo preferido en preferencias.\n" +"Entretanto, aMule tentará empregar mplayer e recibirá este aviso en todas as " +"previsualizacións" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Previsualizar ficheiro" + +#: src/DownloadListCtrl.cpp:2260 +#, fuzzy, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "ERRO: -Non se pode executar o reproductor de medios externo!" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "ERRO: -Non se pode abrir o ficheiro part)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "ERRO: -Non se pode crear o ficheiro part)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "Tentando cargar a copia de seguranza do ficheiro met desde %s" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "Erro: Non se pode abri-lo ficheiro part.met: %s => %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "Erro: o tamaño do ficheiro part.met é 0: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "Erro: Versión de ficheiro part.met inválida: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" +"Erro: %s (%s) está corrupto (marca de contador errónea), imposible cargar o " +"ficheiro." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "Tentando recuperar info de ficheiro..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "Recuperando ficheiro sen nome - recuperareino como RecoveredFile.dat" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" +"Recuperada toda a info dispoñible do ficheiro :D - Tentando empregala..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Imposible recuperar info de ficheiro :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Non se pode abrir %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "Perigo: %s pode estar corrupto (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "ERRO ao gardar o ficheiro part: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "Imposible recuperar a duración de '%s' - empregando o arquivo %s ." + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "'%s' ten tamaño 0 - empregando ficheiro %s." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "Erro ao gardar o ficheiro part.met.seeds por %s" + +#: src/PartFile.cpp:1019 +#, fuzzy, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "Gardadas %i fontes seeds para o ficheiro part: %s (%s)" +msgstr[1] "Gardadas %i fontes seeds para o ficheiro part: %s (%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "O ficheiro part %s (%s) non ten ficheiro seeds" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "O ficheiro part %s (%s) ten un ficheiro seed baleiro" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "Erro lendo o ficheiro seed do ficheiro part (%s - %s): %s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, fuzzy, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"Parte corrupta atopada (%d) en %d ficheiro part %s - FileResultHash |%s| " +"FileHash |%s|" +msgstr[1] "" +"Parte corrupta atopada (%d) en %d ficheiro part %s - FileResultHash |%s| " +"FileHash |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "Parte (%i) completada atopada en %s" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "Rematado de rehashear %s" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "Erro inesperado ao completar o ficheiro %s. Ficheiro pausado" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Descarga rematada: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "Eliminando ficheiro: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" +"Perigo: Non se pode hashear o part descargado - hahset incompleto para '%s'" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"Erro: Non se puido hashear o part descargado - hahset incompleto (%s) - " +"Isto non debe pasar nunca" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "AVISO: Non hai suficiente espazo libre en disco! Pausando ficheiro: %s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "Part descargado %i é corrupto no ficheiro: %s" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH: Part corrupto recuperado %i para %s -> Bytes gardados: %s" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Espazo en disco insuficiente" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Parado" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "Aviso: non se pode abrir known.met." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" +"Aviso: Lista de ficheiros coñecidos corrupta, contén cabeceira inválida." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "Erro de ES lendo o ficheiro known.met: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "Erro gardando o ficheiro known.met: %s" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "Atopados %i ficheiros compartidos" +msgstr[1] "Atopados %i ficheiros compartidos" + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "Atopados %i ficheiros compartidos, %i descoñecido" +msgstr[1] "Atopados %i ficheiros compartidos, %i descoñecido" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "ERRO! Tentando compartir %s" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Comentarios do arquivo" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Valoración" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Comentario" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Sen comentarios" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%s comentario(s)" +msgstr[1] "%s comentario(s)" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"Fallou ao conectar a todos os servidores ofuscados listados. Tentándoo de " +"novo sen ofuscación." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "Erro ao conectar a todos os servidores." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "Rede ED2K desactivada nas preferencias, non conectando." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "Non hai servidores válidos na lista de servidores" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Conectar a %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Conexión establecida en: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "Erro fatal conectando. A conexión a internet podría estar desactivada" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Conexión perdida con %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) parece estar caido." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) parece estar cheo." + +#: src/ServerConnect.cpp:391 +#, fuzzy, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "Reintentarase a conexión automática ao servidor en %d segundos" +msgstr[1] "Reintentarase a conexión automática ao servidor en %d segundos" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Conexión perdida" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "Conectando a %s (%s:%i) fallou." + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "Erro: Socket inválido ao comprobar timeout" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "Tentando conectar a %s (%s:%i) fora de tempo." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" +"Error: Imposible cargar o arquivo de respaldo. Procure no http://forum.amule." +"org solucións de recuperación de arquivos .part.met" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Non se atoparon ficheiros .part" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "Atopados %u ficheiros part" +msgstr[1] "Atopados %u ficheiros part" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Descargando %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Xa estas intentando descargar o ficheiro '%s'" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Xa tes o ficheiro '%s'" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Xa estas intentando descargar este ficheiro %s" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "Non se pode converter a ligazón magnética a ed2k: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "Protocolo descoñecido da ligazón: %s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Ligazón ed2k inválido! Erro: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "Executar e saír." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Formato de IP inválido. Usar xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +#, fuzzy +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" +"Este comando precisa dun argumento. Argumentos válidos: 'all' ou un número.\n" + +#: src/TextClient.cpp:343 +#, fuzzy +msgid "Processing by hash: " +msgstr "Procesando número de ficheiro %u: %s" + +#: src/TextClient.cpp:358 +#, fuzzy +msgid "Processing by filename: " +msgstr "Procesando número de ficheiro %u: %s" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" +"Este comando precisa dun argumento. Argumentos válidos: un arquivo hash.\n" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Non é un número válido\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "Hash inválido (a lonxitude debería ser exactamente 32 caracteres)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "A operación tivo éxito." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "Petición fallida co seguinte erro: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "O filtrado de IP para clientes é %s\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "Apagado" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "Acendido" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "O filtrado de IP para servidores é %s.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "O nivel de filtrado de IP actual é %d.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Límite de ancho de banda: SU: %u kB/s, DE: %u kB/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Conectado a %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "con IDbaixa" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "con ID alta" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Conectando" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Non conectado" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Descarga: \t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Subido:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Clientes en cola:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Fontes totais:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Número de resultados de busca: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "POR FACER - mostrar o progreso dunha busca" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Recibida unha resposta descoñecida desde o servidor, OpCode = %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Mostrar información de estado corta." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "Mostrar estado de conexión, velocidade subida/descarga actual, etc.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Mostrar árbore de estatísticas completa." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"Opcionalmente, un número entre 0-255 pode ser un argumento deste comando,\n" +"o cal di cántas entradas da árbore de versión de cliente deberían " +"mostrarse.\n" +"Con 0 ou sen valor significa 'sen límite'.\n" +"\n" +"Exemplo: 'statistics 5' mostrará só as 5 versións que máis se repitan de " +"calquer cliente.\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "Apaga aMule." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Pechar o núcleo remoto de execución (amule/amuled).\n" +"Isto tamén pechará o cliente de texto, isto non fará nada se non hai\n" +"un núcleo en execución.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Recargar o obxecto dado." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "Recarga a lista de ficheiros compartidos." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "Recargar a táboa de filtrado de IP desde ficheiro." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Conectar á rede." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"Isto conectará a todas as redes que estén habilitadas en opcións.\n" +"Opcionalmente tamén podes especificar un servidor de forma IP:Porto, para\n" +"conectar a ese servidor soamente. A IP debe ser un enderezo IPv4,\n" +"ou un nome DNS." + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Conectar só a ED2K." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Conectar só a Kad." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Desconectado da rede." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "" +"Isto desconectaralle de todas as redes nas que está actualmente conectado.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Desconectar só de ED2K." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Desconectar só de Kad." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Engade un ed2k ou unha ligazón magnética ao núcleo." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"A ligazón edk2 a engadir pode ser:\n" +"*) unha ligazón de ficheiro (ed2k://|file|...), será engadido na cola de " +"descarga,\n" +"*) unha ligazón de servidor (ed2k://|server|...), será engadido á lista de " +"servidores,\n" +"*) ou unha ligazón de lista de servidores, no que todos os servidores na " +"lista serán\n" +" á lista de servidores.\n" +"\n" +"A ligazón magnética debe conter o hash ed2k e a lonxitude do ficheiro.\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Establecer un valor de preferencia." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "Establecer opcións de filtrado de IP." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "Activar o filtrado de IP para clientes e servidores." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "Desactivar o filtrado de IP para clientes e servidores." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "Activar/Desactivar filtrado de IP para clientes." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "Activar filtrado de IP para clientes." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "Desactivar filtrado de IP para clientes." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "Activar/Desactivar filtrado de IP para servidores." + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "Activar filtrado de IP para servidores." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "Desactivar filtrado de IP para servidores." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "Seleccionar nivel de filtrado de IP" + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"Niveis válidos no filtro 0-255, e o valor por defecto (inicial)\n" +"é 127.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Establecer límite de ancho de banda." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "O valor dado a estos comandos ha ser en kilobytes/sec.\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Establecer límite de ancho de banda de subida." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "Establece o límite de ancho de banda de descarga." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Obter e mostrar un valor de opcións." + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "Obter opcións de filtrado de IP." + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "Obter o estado do filtro de IP para clientes e servidores." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "Obter o estado do filtro de IP só para clientes." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "Obter o estado do filtro de IP só para servidores." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "Obter nivel de filtrado de IP." + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Obter límite de ancho de banda." + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Facer unha busca." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"Un tipo de busca ten que ser especificado dando o tipo:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Exemplo: 'search kad ficheiro' executará unha busca kad para \"ficheiro\".\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Executar unha busca global." + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Executar unha busca global" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Executar unha busca de kad" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Mostrar os resultados da última busca." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Devolve o resultado da busca anterior.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "Mostralo progreso dunha procura." + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "Mostralo progreso dunha procura.\n" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Comezar descargando un ficheiro" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"O número dun ficheiro da última busca tense que dar.\n" +"Exemplo: 'download 12' iniciará a descarga do ficheiro co número 12 da busca " +"a busca anterior.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Pausar descarga." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Continuar descarga." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Cancelar descarga." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Establecer a prioridade da descarga." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "" +"Establecer a prioridade dunha descarga a Baixa, Normal, Alta ou Auto.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "Establecer a prioridade a baixa." + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "Establecer a prioridade a normal." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "Establecer a prioridade a alta." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "Establecer a prioridade a auto." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Mostrar colas/listas." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Mostrar cola subida/descarga, lista de servidores ou lista de ficheiro " +"compartidos.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Mostrar cola de subida." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Mostrar cola de descarga." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Mostrar rexistro." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Mostrar lista de servidores." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Reiniciar rexistro." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "Comando obsoleto, empregue agora '%s'." + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" +"Este comando quedou obsoleto e probablemente sexa eliminado nun futuro.\n" +"Emprege '%s' en lugar dese.\n" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() devolveu NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "Erro: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "Aviso: %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "A nova IDcliente é %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "ATENCIÓN: ¡Reciviches ID-Baixa!" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "\tIsto sucede porque está detrás dun cortafogos ou dun router." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tPara máis información, por favor ves a http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "Información recibida do servidor descoñecida! - demasiado corta" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "Recibidos %d novos servidores" +msgstr[1] "Recibidos %d novos servidores" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Gardado completo da lista de servidores." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "Servidor rexeitou o último comando" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Paquete bogus recibido do servidor: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "Erro ao procesar o paquete desde o servidor: %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "Non se pode crear o fío da DNS para conectar a %s" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "IP de servidor %s (%s) está filtrada. Non conectará." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "usando ofuscación de protocolo." + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "Conectando a %s (%s - %s:%i) %s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "Non se puido aclarar a dns para o servidor %s: Imposible conectar!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "CIP2Country::CIP2Country(): Fallou ao cargar o dato do país desde" + +#: src/IP2Country.cpp:73 +#, fuzzy, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "Cargadas %d imaxes de bandeiras." +msgstr[1] "Cargadas %d imaxes de bandeiras." + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "Estás seguro de cancelar e borrar todos os ficheiros desta categoría?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Confirmación requerida" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Todo o demais" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Incompleto" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Activo" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Vídeo" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Audio" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Arquivo" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "Imaxe de CD" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Imaxes" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Texto" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Selecione o filtro de visionado" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Engadir categoría" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Editar categoría" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Borrar categoría" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "Importando %s: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "Lendo cartafol temporal" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "Obtendo información básica de ficheiro info de descarga" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "Creando ficheiro de destino" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "Cargando datos desde a antiga descarga do ficheiro (%u de %u)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "Gardando bloque de datos dun novo ficheiro de descarga (%u de %u)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "Obtendo información do ficheiro fonte de descarga" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "Engadindo descarga e gardando novo ficheiro part" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Obtendo estado..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "En progreso" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Erro: Disco cheo" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Erro: Partmet non atopado" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Erro: Erro ES!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Erro: Fallou!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "En cola" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Xa está descargando" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Formato de ficheiro temp incorrecto ou descoñecido." + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Nome de ficheiro" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Estado" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Hash de ficheiro" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Importar ficheiros part" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"Por favor escolla un cartafol para buscar descargas temporais! " +"(subcartafoles serán incluidos)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" +"Quere que os ficheiros fonte dunha descarga importada satisfactoriamente " +"sexan borrados?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Borrar fontes?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Agardando..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (Disco: %s)" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "bytes" +msgstr[1] "bytes" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "bytes/seg" +msgstr[1] "bytes/seg" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "segundos" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "minutos" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "horas" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "Días" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Vídeos" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Arquivos" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Textos" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programas" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Calquera" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Non evaluada" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Inválido / Corrupto / Falsificación" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Pobre" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Aceptable" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Boa" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Excelente" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "todo" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "todo o demais" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "Cargando filtrados de IP 'ipfilter.dat' e 'ipfilter_static.dat'." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" +"Fallou ao cargar o ficheiro ipfilter.dat '%s', atopado formato descoñecido." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" +"Fallou ao cargar o ficheiro ipfilter.dat '%s', non se puido abrir o ficheiro." + +#: src/IPFilter.cpp:330 +#, fuzzy, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +"Cargados %u rangos de IP de '%s'. %u liñas malformadas foron descartadas." +msgstr[1] "" +"Cargados %u rangos de IP de '%s'. %u liñas malformadas foron descartadas." + +#: src/IPFilter.cpp:332 +#, fuzzy, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +"Cargados %u rangos de IP de '%s'. %u liñas malformadas foron descartadas." +msgstr[1] "" +"Cargados %u rangos de IP de '%s'. %u liñas malformadas foron descartadas." + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Conexións activas (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Detalles do ficheiro" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% feito" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "Ligazón ED2K: " + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Enviar" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "Prema aquí para engadir un ligazón ed2k na túa cola de descargas." + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "Estado da mensaxe emerxente" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Cargando..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"Os eventos amósanse aquí. Para unha lista completa de eventos, ves ao " +"rexistro, da solapa de servidores." + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Número de usuarios conectado ao mesmo servidor ca ti ..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Usuarios: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" +"Usuarios conectados ao servidor actual e unha estimación do número total de " +"usuarios." + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"Índice actual de subidas e descargas. Se está activado os números signfican " +"os gastos indirectos na comunicación do cliente." + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"Amosa o estado de conexión e as transferencias activas. As frechas vermellas " +"significan que estás conectado, as frechas amarelas significan que tes ID-" +"Baixa (detrás de cortafogos) e frechas verdes significan que tes ID-Alta (O " +"tipo de conexión óptima)." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Non conectado ..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Non estás conectado a un servidor" + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Busca" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Nome:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Local" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Global" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "Ficheiro Hash" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Parámetros extendidos" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Filtrado" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Tipo de ficheiro" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Extensión" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Tamaño mín" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Bytes" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Tamaño máx" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Dispoñibilidade" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Filtrado:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Resultados do filtro" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Invertir resultado" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Agochar ficheiros coñecidos" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Máis" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "Procurar máis resultados en ED2K. Non soportado todavía por Kad." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Deter" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Reiniciar campos" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Resultados" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Limpar descargas completadas" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Mostrar Subida / Cola de subida" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Clientes en cola :" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Enviar" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Enviar a mensaxe especificada." + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Pechar" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Pechar esta sesión de chat." + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Nome completo" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "N/A" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "Ficheiro-met:" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Hash :" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Tamaño do ficheiro:" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Estado do ficheiro part:" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Última vez visto completo:" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Fontes atopadas:" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Fontes transferindo:" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Número de partes:" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Dispoñible:" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Fluxo de datos:" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Tempo Descarga Activa:" + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Transferido:" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Tamaño completado:" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Xestión intelixente de corrupción" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Perdido por corrupción:" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Gañado por compresión:" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "Paquetes salvados por I.C.H. :" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Nomes de ficheiro " + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Tomar" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Limpar" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Aplicar" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Aceptar" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "" +"Comentario/Calificación do ficheiro (O texto mostrarase a todos os usuarios)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"Para unha película, podes poñer a súa duración, descrición, o idioma ...\n" +"e se é unha falsificación, podes informar aos demais usuarios de aMule." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Calificación de ficheiro" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" +"Escoller a calificación do ficheiro ou advertir a outros usuarios se non é " +"válido ..." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Sen comentario(s)" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Actualizar" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Descargando, agarde por favor ..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Tamaño descoñecido" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Información requerida" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "Enderezo IP :" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Porto :" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Información adicional" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Nome de usuario :" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Hash do usuario :" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Recargar os seus ficheiros compartidos" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Sesión actual" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Total" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Petición :" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Subidas activas :" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Velocidade de descarga" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Actual" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Media de execución" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Media de sesión" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Velocidade de subida" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Conexións" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Descargas activas" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Conexión activas (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Subidas activas" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Árbore de estatísticas" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Nome de usuario:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Hash do usuario :" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Software de cliente :" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Versión de cliente :" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "Enderezo IP :" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "ID do usuario :" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "IP de servidor :" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Nome do servidor :" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "Transferencias ao cliente" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Peticións actuais:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Índice medio de subida :" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Índice medio de descarga :" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Subido (sesión) :" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Descargado (sesión) :" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Subido (total) :" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Descargado (total):" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Resultados" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "Modificador DE/SU :" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Identidade segura:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Calificación (total) :" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Puntuación cola:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Opcións xerais" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Alcume" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - a Mula de Linux" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "" +"Este é o nome que os outros usuarios verán cando se esté conectando a " +"vostede." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Idioma" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "Isto especifica a linguaxe empregada nos controles." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Opcións varias" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Comprobar se hai unha nova versión ao iniciar" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" +"Activando isto, fará que aMule comprobe se hai unha nova versión ao inicio" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Iniciar minimizado" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "Activando isto, fai que aMule minimícese ao inicio." + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Preguntar ao saír" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "Fai que aMule pregunte antes de saír." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Activar icona de bandexa" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "" +"Isto Activa/Desactiva a icona da bandexa de sistema (ou barra de tarefas)." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "Minimizar á icona da bandexa" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" +"Activando isto aMule minimizarase na bandexa do sistema, na barra de tarefas." + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Retardo das mensaxes emerxentes en segs" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "O retardo antes de mostrar as mensaxes emerxentes." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Selección de navegador" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Seleccione seu navegador aquí" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Navegador personalizado:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Introduza o nome do seu navegador. Para usar un navegador persoal, " +"seleccione personalizado no menú de arriba." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Abrir nunha nova solapa se é posible" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" +"Abrir cando sexa posible, a páxina web nunha nova solapa en lugar dunha nova " +"fiestra" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Límite de ancho de banda" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Subir" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Asinación de slots" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Capacidade de liña" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" +"Nota: Estes valores só\n" +"se empregaran para as estadísticas" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Porto do cliente TCP estándar:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "Este é o porto estándar ED2K e non pode ser deshabilitado." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Porto UDP extendido do cliente:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "Este porto UDP é usado para extender as peticións ED2K e a rede Kad." + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "desactivado" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Enderezo de ligazón" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "Porto UDP para peticións extendidas ao servidor (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Máximo de fontes por ficheiro" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Límite máximo" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Límite de conexións" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Conexións máximas" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Plug and Play universal" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "Activar UPnP" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "Porto TCP UPnP:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Autoconectar ao inicio" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Reconectar ao perder a conexión" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Mostrar ancho de banda excedente" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Opcións do servidor" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Eliminar servidores caídos tras" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "reintentos" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Actualizar automaticamente a lista de servidores ao inicio" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Lista" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Actualizar a lista de servidores ao conectar a un servidor" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Actualizar lista de servidores ao conectar a un cliente" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Usar sistema de prioridades" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Control intelixente de IDBaixa ao conectar" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Conexión segura" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Autoconectar só a Servidores fixos" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Asinar alta prioridade aos servidores engadidos manualmente" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "Activar I.C.H." + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICH confía en todos os hash (non recomendado)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Engadir ficheiros para descargar en modo pausado" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Engadir novos ficheiros compartidos con auto prioridade" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Tentar descargar antes a primeira e última parte" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Engadir novas descargas con auto prioridade" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Tentar transferir partes completas en todas as subidas" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Descargar seguinte ficheiro pausado cando se complete outro" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "Da mesma categoría" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "Gardar 10 fontes en ficheiros raros (< 20 fontes)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Espazo en disco" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Comprobar espazo en disco" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "Seleccione isto se queres que aMule comprobe teu espazo en disco" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Espazo en disco mínimo:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Introduza o espazo mínimo de disco desexado." + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Directorio entrante :" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Directorio temporal :" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Directorios compartidos" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "" +"(Click co botón dereito na icona do cartafol para compartir recursivamente)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Compartir ficheiros ocultos" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Reproductor de vídeo" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Crear copia de seguranza para previsualizar" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Gráficos" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Intervalo de actualización: 5 segs" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Tempo de promedio do gráfico: 100 min" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Escala do gráfico das conexións: 100" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Seleccionar cores das estatísticas" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Fondo" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Enreixado" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Actual descarga" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Promedio descarga en execución" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Promedio descarga en sesión" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Actual subida" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Promedio subida en execución" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Promedio subida en sesión" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Conexións activas" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Barra de velocidade da icona da bandexa do sistema" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Nodos-kad actuais" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Nodo-kad executándose" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Sesión de nodos-kad" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Seleccionar" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Número de versións de cliente amosadas (0=ilimitado)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Notificacións" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Mensaxes emerxentes" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Usar son" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Notificar cando :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Nova entrada no rexistro" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Iniciar unha nova sesión de chat" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Recíbese unha nova mensaxe de chat" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Engádese ou remátase unha descarga" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Nova versión de aMule detectada" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "OOD urxente, perdida conexión co servidor" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Notificar por correo" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Enviar un correo electrónico cando se completa unha transferencia." + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "Servidor SMTP :" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "Correo electrónico :" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "ADVERTENCIA !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Non cambie estos parámetros a menos que saiba\n" +"o que está facendo, do contrario pode\n" +"facer que aMule funcione peor.\n" +"\n" +"aMule funcionará ben sen que cambie ningún\n" +"destes parámetros." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Opcións avanzadas" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Novas conexións máx. / 5 segs" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Tamaño do búfer de ficheiro: 240000 bytes" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Tamaño cola de espera: 5000 clientes" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Intervalo de actualización de conexión ao servidor: Desactivado" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "Tweaks GUI" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Progreso dos ficheiros da lista de descarga" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Mostrar porcentaxe" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Mostrar barra de progreso" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Estilo da barra de progreso" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Plano" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "3D" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Soporte para peles" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Activar soporte de temas" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Tema:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- sen temas dispoñilbes -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Ordenación de columna" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "" +"Ordenar automaticamente ficheiros na cola de descarga (Alto gasto de CPU)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "aMule ordenará as columnas no súa lista de descargas automaticamente" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Varios Tweaks Gui" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Mostrar xestión rápida de ligazóns ED2K" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Mostrar info extendida nos solapas das categorías" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Mostrar índices de transferencia no título" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Orientación vertical da barra de ferramentas" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Mostrar o número da parte do ficheiro antes do nome do ficheiro" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Control remota" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Parámetros do servidor web" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Executar amuleweb ao inicio" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Porto do servidor web" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "Activar o seguimento do porto UPnP no porto do servidor web" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Porto Tcp UPnP do servidor web" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Tempo de actualización de páxina (en segs)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Activar compresión Gzip" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Activar invitado" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Contrasinal administrador" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Contrasinal invitado" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Modelo Web" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Parámetros de conexión externa" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Aceptar conexións externas" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"IP da interface que está escoitando\n" +"(baleiro para calquera)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Introduza aquí unha ip válida no formato a.b.c.d para a interface de escoita " +"EC. Un campo baleiro ou 0.0.0.0 significará calquera interface." + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "Porto TCP" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "Activar o seguimento do porto UPnP no porto EC" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "Aplicar calquer troco feito nas preferencias." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Reinicar calquer troco feito nas preferencias." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Título :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Comentario:" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Dir entrante :" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Cambiar prioridade a novos ficheiros asinados :" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Non cambiar" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Seleccionar cor para esta categoría (seleccionada) :" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Mostrar motd do servidor cando estés conectado ..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Info de servidor" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Premer este botón para reiniciar o rexistro." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "Rexistro de aMule" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "Premer neste botón para actualizar a lista de servidores desde URL ..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Lista de servidores" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Introduza a url nun ficheiro server.met e prema o botón da esquerda para " +"actualizar a lista de servidores coñecidos." + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Engadir servidor manualmente: Nome" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Introduce o nome do novo servidor aquí" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Introduce a IP do servidor aquí, usando o formato x.x.x.x." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Introduce o porto do servidor aquí." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "Engadir servidor manualmente (encha os campos) ..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "Info ED2K" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Info Kad" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"O idioma seleccionado non parece estar instalado\n" +"Debe xeralo para usar esta linguaxe.\n" +"Un bo comezo en sistemas linux é o ficheiro /etc/locale.gen e o paquete " +"'locales'\n" +"Boa sorte!\n" +"(Nota: Tentarei arreglalo de todas formas)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Non mostrar outra vez" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "Premer neste botón para actualizar a lista de nodos desde URL ..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Nodos (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"Introduza aquí a url ao ficheiro nodes.dat e prema o botón da esquerda, para " +"actualizar a lista de nodos coñecidos." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Estatísticas de nodos" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Bootstrap" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Novo nodo" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Porto:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "Clientes coñecidosde Bootstrap" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Desconectado de Kad" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Ofuscación de protocolo" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Soporte para ofuscación de protocolo" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"Esta opción activa a ofuscación de protocolo, e permite a aMule aceptar " +"conexións ofuscadas doutros clientes." + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Usar ofuscación para conexións saíntes" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"Esta opción fai que aMule use ofuscación de protocolo cando se conectan " +"outros clientes/servidores." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Aceptar só conexións ofuscadas" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"Esta opción fai que aMule só acepte conexións ofuscadas. Terá menos fontes, " +"pero todo o teu tráfico será ofuscado" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Opcións de ficheiro" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Todos" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Ninguén" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Quen pode ver os ficheiros compartidos:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "Seleccione quen pode solicitar ver a lista de ficheiros compartidos." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "Filtrado de IPs" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Filtrar clientes" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Activar filtrado das IPs de cliente definidas no ficheiro ~/.aMule/ipfilter." +"dat." + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Filtrar servidores" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Activar filtrado das IPs de servidores definidas no ficheiro ~/.aMule/" +"ipfilter.dat." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Recargar lista" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "" +"Recargar a lista de filtrado de IPs desde o ficheiro ~/.aMule/ipfilter.dat" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Actualizar agora" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Auto-actualizar o filtrado de IPs ao inicio" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Nivel de filtrado:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Filtrar sempre IPs LAN" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Xestión paranoica de IPs non coincidintes" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Rexeitar o paquete se a ip do cliente é distinta da ip de onde se recibe o " +"paquete. Usar con coidado." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "Empregar un ipfilter.dat global se está dispoñible" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" +"De non atopar un arquivo ipfilter.dat para o usuario, permitir o emprego dun " +"ipfilter global." + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "Empregar a Indentificación Segura do Usuario" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" +"Aconséllase habilitar esta opción. Non recibirá créditos se o SUI " +"(Indentificación Segura do Usuario) non se habilitou." + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Activar/Desactivar" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Activar Sinatura Online" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Habilitar a escritura de ficheiros do SO, sóese usar para crear sinaturas " +"para aplicacións externas." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Frecuencia de actualización (Segs):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "" +"Cambiar a frecuencia (en segundos) da actualización da sinatura online." + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Directorio de Sinatura Online:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" +"Premer aquí para seleccionar o directorio que contén os ficheiros de " +"sinaturas online" + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Desactivar/Activar" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "Filtrar mensaxes entrantes (excepto conversación actual):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Opcións de filtrado:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Filtrar todas as mensaxes" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Filtrar mensaxes de xente que non está na túa lista de amigos" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Filtrar mensaxes de clientes descoñecidos" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Filtrar mensaxes que conteñen (usa ',' como separador):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"engade aquí as palabras que amule debe filtrar e bloquear mensaxes incluídas" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Comentarios" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "Filtrar comentarios que conteñan (empregre ',' coma separador):" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Activar proxy" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Activar/desactivar soporte de proxy" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Tipo de proxy:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "O tipo de proxy ao que estase conectando" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Anfitrión de proxy:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "O nome do anfitrión do proxy" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Porto do proxy:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "O porto do proxy" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Autenticación" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Activar autenticación" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Activar/desactivar autenticación de nome de usuario/contrasinal" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "O nome de usuario a usar para conectar ao proxy" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Contrasinal:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "O contrasinal a empregar para conectar ao proxy" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Conexión de servidor automática sen proxy" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Conectar a:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Conectar a amule remoto" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Nome de usuario" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Recordar esas opcións" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Activar Depuración-rexistro difuso." + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "Categorías de mensaxe:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "Engadir importes" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Reintentar seleccionado" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Borrar seleccionado" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Tipos de evento" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Conectar a calquera servidor e/ou Kad" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Nova categoría" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Escolla un cartafol para os ficheiros entrantes" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Debe especificar un nome para a categoría!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Debe especificar unha ruta para a categoría!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"Erro ao crear o directorio incoming da categoría. Por favor especifique unha " +"ruta correcta!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "Extensión descoñecida '%s' para o comando '%s'.\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "Comando descoñecido '%s'.\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"Este comando non pode ter un argumento.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"Este comando deber ter un argumento.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Este comando está incompleto, debe usar unha das extensión de abaixo.\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Extensións dispoñibles:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Comandos dispoñibles:\n" + +#: src/ExternalConnector.cpp:188 +#, fuzzy, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"Todos os comandos son sensibles ás maiúsculas\n" +"Escriba 'help ' para obter información detallada do .\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Saír da aplicación." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Mostrar axuda." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"Para obter axuda dun comando, teclee 'help '.\n" +"Para obter a lista completa de comandos, teclee 'help'.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"Usa '%s' para lista de comandos\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Erro de sintase!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Erro procesando o comando - isto non debería pasar! Por favor, reporte o " +"bug\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Este comando non debería ter ningún parámetro." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Este comando debe ter un parámetro." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Argumento inválido." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Isto é un comando incompleto." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Teclee '%s' para obter máis axuda.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "Isto é %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "Isto é %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Creando cliente...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "Conexión fallida. Non se puido conectar ao anfitrión especificado\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"OK, saíndo de %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"Non se pode conectar cun contrasinal baleiro.\n" +"Debe especificar un contrasinal nun ficheiro de configuración\n" +"ou nunha liña de comando, ou introducir un cando se pregunte.\n" +"\n" +"Saíndo...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Mostrar este texto de axuda." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "Anfitrión onde estase executando aMule. (por defecto: localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "Porto de aMule para conexión externa. (por defecto: 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Contrasinal para conexión externa." + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Ler configuración do ficheiro." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "Non imprimir ningunha saída a stdout." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Estar difuso - mostrar as mensaxes de depuración." + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Establecer locale de programa (lingua)." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "Escribir opcións da liña de comando ao ficheiro de configuración." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "" +"Crear ficheiro de configuración basado no ficheiro de configuración de aMule." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Imprimir versión de programa." + +#: src/ClientCreditsList.cpp:168 +#, fuzzy, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "Ficheiro de créditos cargado, %u cliente coñecidos" +msgstr[1] "Ficheiro de créditos cargado, %u cliente coñecidos" + +#: src/ClientCreditsList.cpp:171 +#, fuzzy, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] " - Expiraron os créditos de %u clientes!" +msgstr[1] " - Expiraron os créditos de %u clientes!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "Non se atopou o ficheiro 'cryptkey.dat', creando." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"ERRO: o daemon de aMule non se pode usar cando están desactivadas as " +"conexións externas. Para activar as Conexións Externas, use un aMule normal, " +"inicie amuled coa opción --ec-config ou estableza a clave " +"\"AcceptExternalConnections\" a 1 no ficheiro ~/.aMule/amule.conf" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "ERRO: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Desvetado" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Ver Subidas" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Ver cola" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Mostrar clientes" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Selecione ver" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Software do cliente" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Agardando" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Tempo de subida" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Subida/Descarga" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Estado remoto" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "QR: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Prioridade do ficheiro" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Puntuación" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Pedido" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Última vez visto" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Entrada en cola" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Estado de subida" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Subido" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Estado de descarga" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Descargado" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Hash do usuario" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Cifrado" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Oculta os archivos compartidos" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Detalles do cliente" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Non soportado" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Incompleto" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Rapaz malo" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Verificado - OK" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Non dispoñible" + +#: src/ClientDetailDialog.cpp:190 +#, fuzzy, c-format +msgid "%u (QR: %u)" +msgstr "QR: %u" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" +"O tamaño mínimo debe ser máis pequeno que o máximo. Tamaño máximo ignorado." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Aviso de busca" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Ilimitado" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "Menú aMule" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Límite de velocidade: " + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "SU: Ningunha" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "UL: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "DE: Ningunha" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "DE: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Velocidade de descarga: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Velocidade de subida: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Información de cliente" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Alcume: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "Non seleccionou un alcume!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "ID de cliente: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Nome do servidor: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "IP de servidor :" + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "Porto TCP: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "Porto TCP: Non está listo" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "Porto UDP: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "Porto UDP: Non está listo" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Sinatura Online: Activada" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Sinatura Online: Desactivada" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Ficheiros compartidos: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Clientes en cola: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "Total DE: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "Total SU: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Límite de subida" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Lí­mite de descarga" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "Ocultar aMule" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "Mostrar aMule" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "Sesión de chat iniciada: %s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Conectado ao cliente ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** Conectando ao cliente ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Erro ao conectar ao cliente / Conexión perdida ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Pechar solapa" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Pechar todas as solapas" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Pechar outras solapas" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "Cargando ficheiro server.met: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "Ficheiro server.met non atopado!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" +"Fallou ao cargar o ficheiro server.met '%s', atopouse formato descoñecido." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "Erro ao abrir server.met!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"Ficheiro server.met corrupto, atopada marca de versión inválida: 0x%x, " +"tamaño %i" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "%i servidores atopados no server.met" +msgstr[1] "%i servidores atopados no server.met" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d servidores engadidos" +msgstr[1] "%d servidores engadidos" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Servidor non engadido: [%s:%d] non especifica un porto válido." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "Servidor non engadido: A IP de [%s:%d] está filtrada ou é inválida." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" +"Servidor non engadido: Servidor con IP:Porto [%s:%d] coincidinte atopado na " +"lista." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Servidor engadido: Servidor [%s:%d] empregando o nome '%s'." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"Estás conectado ao servidor que tenta borrar. Por favor desconéctese " +"primeiro." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Erro ao gardar o ficheiro server.met" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "Url inválida" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "Finalizando a descarga da lista dos servidores de %s" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Erro ao decarga-la lista de servidores dende %s" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"Non hai lista de servidores no ficheiro 'addresses.dat': Por favor copie un " +"enderezo válido neste ficheiro para auto-actualizar a súa lista de servidores" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "Descargando lista dos servidores de %s" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" +"Aviso, URL especificada para auto-actualización de servidores, inválida: %s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "Erro en addresses.dat, server.met da url de auto descarga inválido" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"O servidor local está filtrado por IPFilters, reconectando a un servidor " +"diferente!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "Fallou ao executar o comando `%s' no evento `%s'." + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"O seu locale cambiou ao predeterminado do sistema debido a un troco na " +"configuración. Síntoo." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"Non ten ningún servidor na lista de servidores.\n" +"Quere que aMule descargue unha nova lista agora?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Descargar lista de servidores" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "servidor web executándose no pid %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"Solicitou executar webserver ao inicio, pero non se pode executar o binario " +"amuleweb. Por favor instale o paquete que conteña o aMule webserver, ou " +"compile aMule usando --enable-webserver e execute make install" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "Porto %u non está dispoñible . Tes IDBAIXA\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"Porto %u non está dispoñible!!\n" +"\n" +"Isto significa que terás IDBAIXA \n" +"\n" +"Comproba túa rede para cerciorarse de que o porto está aberto para a entrada " +"e saída." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Fallou ao crear o ficheiro OnlineSig" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "Fallou ao crear o ficheiro de aMule OnlineSig" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"O idioma seleccionado non parece estar instalado. (Nota: Tentarei poñelo de " +"todos modos)" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "Esta é a primeira vez inicia aMule %s" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "Esta versión é unha versión en proba, actualizada, e\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "non damos garantía se rompese algo, quime a túa casa,\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "ou mate o seu can. Pero debería salvalo de todas formas.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" +"As seguintes opcións foros cambiadas nesta versión por razóns de " +"seguridade:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* Activada o soporte de ofusación de protocolo para conexións entrantes e " +"saíntes.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* Desactivada a actualización da lista de servidores desde outro cliente ou " +"servidores.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"Para máis información da razón destes cambios, busque información\n" +" de \"fake servers\" na wiki de aMule http://wiki.amule.org.\n" +"É importante que limpe calquer servidor falso da súa lista de servidores " +"para que aMule funcione correctamente." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Máis información, soporte e novas actualizacións pódelas atopar na nosa " +"páxina,\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" +"en www.aMule.org, ou na nosa canle de IRC #aMule en irc.freenode.net.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Podes reportar algúns bugs a http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"O cartafol que especificou de Sinatura Online non é válido!\n" +"A Sinatura Online foi deshabilitada ata que o arregle en preferencias." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "ERRO: non se pode abrir o ficheiro de rexistro" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "AVISO: o ficheiro de rexistro está baleiro. Algo está mal." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "O rexistro foi borrado" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "Mensaxe de servidor: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Fallou ao descargar a lista de nodos." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Fallou ao abrir o ficheiro de comprobación de versión descargado" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Ficheiro de comprobación de versión corrupto" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Está usando unha versión de aMule non actualizada!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "A súa versión de aMule é %i.%i.%i e a última versión é %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "Pode obter a última versión de aMule en http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "" +"AVISO: A súa versión de aMule está desactualizada: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "Súa copia de aMule está actualizada." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Fallou ao descargar o ficheiro de comprobación de versión" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Conectado a %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Conectando a %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Desconectado de ED2K" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad iniciado." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad detido." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Conectado a Kad (ok)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Conectado a Kad (cortafogos)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Desconectado de Kad" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"A rede Kad non pode ser usada se o porto UDP está desactivado nas " +"preferencias, non iniciado." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "A rede Kad está desactivada nas preferencias, non conectado." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "" +"Fallou ao abrir o ficheiro de lista de amigos 'emfriends.met' para ler!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "" +"Fallou ao abrir o ficheiro da lista de amigos 'emfriends.met' para escribir!" + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "" +#~ "Non podes facer bootstrap a unha ip específica desde unha interface " +#~ "remota todavía." + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "Non podes actualizar server.met desde unha interface remota todavía" + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "Lidos %u contactos Kad" +#~ msgstr[1] "Lidos %u contactos Kad" + +#~ msgid "Disconnect from " +#~ msgstr "Desconectado desde" + +#~ msgid "current server" +#~ msgstr "servidor actual" + +#~ msgid " and " +#~ msgstr " e " + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "Desconectado desde algún servidor e/ou Kad" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "TCP Flags" +#~ msgstr "Opcións TCP" + +#~ msgid "UDP Flags" +#~ msgstr "Opcións UDP" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "Copiar ligazón(s) ED2K ao portapapeis" + +#~ msgid "Client requests %u" +#~ msgstr "Petición de cliente %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "Ficheiro bloqueado %u-%u (%d bytes):" + +#~ msgid "Client request is invalid!" +#~ msgstr "A petición do cliente é inválida!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "A petición do cliente é inválida! %i / %i" + +#~ msgid "Command: %s" +#~ msgstr "Comando: %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "Imposible abri-lo ficheiro %s - usando o ficheiro %s." + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "Aviso: known.met non existe." + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles: Eliminando %s da lista de directorios " +#~ "compartidos: directorio non encontrado." + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "Agardando o remate fallido dun subproceso" + +#~ msgid "" +#~ "You cannot connect to a release version from an arbitrary CVS version! " +#~ "*sigh* possible crash prevented" +#~ msgstr "" +#~ "Non pode conectar a unha versión final desde unha versión CVS arbitraria! " +#~ "*sigh* posible erro prevido" + +#~ msgid "doesn't work" +#~ msgstr "non funciona" + +#~ msgid "remote gui" +#~ msgstr "gui remoto" + +#~ msgid "" +#~ "Error: Failed to load backup file. Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Erro: Fallou ao cargar a copia de seguranza. Busca en http://forum.amule." +#~ "org solucións para recuperar .part.met" + +#~ msgid "" +#~ "Error: Backup part.met file is 0 size! Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Erro: O tamaño da copia de seguranza do ficheiro part.met é 0! Busca " +#~ "solucións de recuperación do part.met en http://forum.amule.org" + +#~ msgid "Error: part.met backup file is 0 size: %s ==> %s" +#~ msgstr "" +#~ "Erro: a copia de seguranza do ficheiro part.met ten tamaño 0: %s ==> %s" + +#~ msgid "" +#~ "Note: These values are\n" +#~ " only used for statistics." +#~ msgstr "" +#~ "Nota: Estos valores son\n" +#~ " empregados só para as estatísticas." + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ "Cliente p2p 'Multi-plataforma' baseado en eMule\n" +#~ "\n" +#~ " Sitio web: http://www.amule.org \n" +#~ " Foro: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ "Contactar: admin@amule.org (problemas administrativos)\n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Parte de aMule está baseado en\n" +#~ " Kademlia: Encamiñamento p2p baseado na métrica XOR.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "AVISO: Recibiu IDbaixa!" + +#~ msgid "" +#~ "This command requieres an argument. Valid arguments: 'all' or a number.\n" +#~ msgstr "" +#~ "Este comando require un argumento. Argumentos válidos: 'all' ou un " +#~ "número.\n" + +#~ msgid "This command requieres an argument. Valid arguments: a file hash.\n" +#~ msgstr "" +#~ "Este comando necesita un argumento. O argumentos válidos son: un ficheiro " +#~ "hash.\n" + +#~ msgid "Deprecated command, now 'Status'." +#~ msgstr "Comando obsoleto, agora 'Status'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Status' instead.\n" +#~ msgstr "" +#~ "Este é un comando obsoleto, e será borrado no futuro.\n" +#~ "Use 'Status' no seu lugar.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter'." +#~ msgstr "Comando obsoleto, agora 'Set IPFilter'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter' instead.\n" +#~ msgstr "" +#~ "Este é un comando obsoleto, e será borrado nun futuro.\n" +#~ "Use 'Set IPFilter' no seu lugar.\n" + +#~ msgid "Deprecated command, now 'Get IPFilter Level'." +#~ msgstr "Comando obsoleto, agora 'Get IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Este é un comando obsoleto, e será borrado nun futuro.\n" +#~ "Use 'Get IPFilter Level' no seu lugar.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter Level'." +#~ msgstr "Comando obsoleto, agora 'Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Este é un comando obsoleto, e será borrado nun futuro.\n" +#~ "Use 'Set IPFilter Level' no seu lugar.\n" + +#~ msgid "Deprecated command, now 'Get/Set IPFilter Level'." +#~ msgstr "Comando obsoleto, agora 'Get/Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get/Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Este é un comando obsoleto, e será borrado nun futuro.\n" +#~ "Use 'Get/Set IPFilter Level' no seu lugar.\n" + +#~ msgid "Deprecated command, now 'Show Servers'." +#~ msgstr "Comando obsoleto, agora 'Show Servers'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Show Servers' instead.\n" +#~ msgstr "" +#~ "Este é un comando obsoleto, e será borrado nun futuro.\n" +#~ "Use 'Show Servers' no seu lugar.\n" + +#~ msgid "Deprecated command, now 'Get BwLimits'." +#~ msgstr "Comando obsoleto, agora 'Get BwLimits'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get BwLimits' instead.\n" +#~ msgstr "" +#~ "Este é un comando obsoleto, e será borrado nun futuro.\n" +#~ "Use 'Get BwLimits' no seu lugar.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Up'." +#~ msgstr "Comando obsoleto, agora 'Set BwLimit Up'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Up' instead.\n" +#~ msgstr "" +#~ "Este é un comando obsoleto, e será borrado nun futuro.\n" +#~ "Use 'Set BwLimit Up' no seu lugar.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Down'." +#~ msgstr "Comando obsoleto, agora 'Set BwLimit Down'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Down' instead.\n" +#~ msgstr "" +#~ "Este é un comando obsoleto, e será borrado nun futuro.\n" +#~ "Use 'Set BwLimit Down' no seu lugar.\n" + +#~ msgid "Syncronization thread started." +#~ msgstr "Iniciado fío de sincronización." + +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "Masterhashes descargados de ficheiros coñecidos." + +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "Erro lendo os contactos Kad - 0 entradas" + +#~ msgid "Merge attempt" +#~ msgstr "Tentar mestura" + +#~ msgid "Recursive merge" +#~ msgstr "Mestura recursiva" + +#~ msgid "Sucessful merge!" +#~ msgstr "Mestura satisfactoria!" + +#~ msgid "No merge possible" +#~ msgstr "Non se pode facer a mestura" + +#~ msgid "Buddy address: " +#~ msgstr "Enderezo de amigo:" + +#~ msgid "Allow usage of system wide ipfilter.dat" +#~ msgstr "Permitir o empregro dun ipfilter.dat global." + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid " %d" +#~ msgstr " %d" + +#~ msgid ".%d" +#~ msgstr ".%d" + +#~ msgid "Shows the process of a search." +#~ msgstr "Amosa o proceso da busca." + +#~ msgid "Shows the process of a search..\n" +#~ msgstr "Amosa o proceso da busca...\n" + +#~ msgid "Search warning." +#~ msgstr "Aviso de busca." + +#~ msgid "Client Identification:" +#~ msgstr "Identificación de cliente:" + +#~ msgid "Use Secure Identification" +#~ msgstr "Usar identificación segura" + +#~ msgid "" +#~ "Secure Identification uses a handshake approch to safely identify clients " +#~ "for use with the credit system." +#~ msgstr "" +#~ "Identificación segura usa un handshake apropiado para identificar con " +#~ "prudencia aos clientes que usan o sistema de créditos." + +#~ msgid "Sources Dropping" +#~ msgstr "Descartar fontes" + +#~ msgid "Source Dropping" +#~ msgstr "Eliminación de fontes" + +#~ msgid "Keep sources" +#~ msgstr "Gardar fontes" + +#~ msgid "Drop sources" +#~ msgstr "Eliminar fontes" + +#~ msgid "Send sources to any other file before dropping (High CPU)" +#~ msgstr "" +#~ "Enviar fontes a outro ficheiro antes de eliminar (Alto gasto de CPU)" + +#~ msgid "Sources with no needed file-parts." +#~ msgstr "Fontes con partes de ficheiro non necesitadas." + +#~ msgid "Full Queue Sources Handling" +#~ msgstr "Xestionar fontes con cola chea" + +#~ msgid "Enable auto drop Full Queue Sources" +#~ msgstr "Activar auto eliminar fontes con cola chea" + +#~ msgid "High Queue Rating Sources Handling" +#~ msgstr "Xestionar fontes con cola alta" + +#~ msgid "Enable auto drop High Queue Rating Sources" +#~ msgstr "Activar auto eliminar fontes con cola alta" + +#~ msgid "High Queue Rating value" +#~ msgstr "Valor para cola alta" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(Mín 300 / Máx 3000)" + +#~ msgid "Auto Drop Sources Timer" +#~ msgstr "Tempo de auto eliminar fontes" + +#~ msgid "Timer (in secs)" +#~ msgstr "Tempo (en segs)" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(Mín 60 / 3600 Máx)" + +#~ msgid "Drop No Needed Sources now" +#~ msgstr "Descartar as Fontes Non Necesarias agora" + +#~ msgid "Drop Full Queue Sources now" +#~ msgstr "Descartar as Fontes Coa Cola Chea agora" + +#~ msgid "Drop High Queue Rating Sources now" +#~ msgstr "Descartar as Fontes Con Posición Alta en Cola agora" + +#~ msgid "Clean Up Sources now (NNS, FQS && HQRS)" +#~ msgstr "Limpar Fontes agora (NNS, FQS e HQRS)" + +#~ msgid "English (U.S.)" +#~ msgstr "Inglés (E. U)" + +#~ msgid "Spanish (Mexican)" +#~ msgstr "Castelán (Mexicano)" diff --git a/po/hr.po b/po/hr.po new file mode 100644 index 00000000..fde916ae --- /dev/null +++ b/po/hr.po @@ -0,0 +1,8157 @@ +# aMule i18n resource file. +# Copyright (C) 2004 aMule Team +# This file is distributed under the same license as the PACKAGE package. +# Kry , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: aMule CVS\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2004-04-08 00:30+0100\n" +"Last-Translator: Tea Lorenzmeier \n" +"Language-Team: www.aMule.org \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Hashing" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Zavrsavanje" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Zavrseno" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Pausirano" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Sa greskom" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Downloading" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Cekanje" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Nepoznat" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr "" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr "" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "Zahtijevan:" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Fajl statistike za ovu misiju: Prihvaceno %d od %d zahtjeva, %s preneseno\n" +msgstr[1] "" +"Fajl statistike za ovu misiju: Prihvaceno %d od %d zahtjeva, %s preneseno\n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Fajl statistike za ovu misiju: Prihvaceno %d od %d zahtjeva, %s preneseno\n" +msgstr[1] "" +"Fajl statistike za ovu misiju: Prihvaceno %d od %d zahtjeva, %s preneseno\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Zatrazen nepoznat fajl" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Ime korisnika" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Prijatelji" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Pokazi &Detalje" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Dodaj prijatelja" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Odstrani prijatelja" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Posalji &Poruku" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Ugledaj fajlove" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Uspostavi slot zu prijatelja" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Da li zaist zelis otkazati i obrisati ove fajlove ?\n" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Da li zaist zelis otkazati i obrisati ove fajlove ?\n" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Otkaz" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Ime fajla" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Velicina" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Tip" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Prioritet" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "FileID" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Zahtjevi" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Prihvaceni zahtjevi" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Podatak transfera" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Dobiveni dijelovi" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Dijeljeni fajlovi" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Vrlo nizak" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Nisko" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normalan" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Visoko" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Vrlo visok" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Automatski" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Preimenovanje" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Kopiraj ed2k &linkove u klipbord" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Kopiraj ed2k &linkove u klipbord (&Source)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "Za ispravan izvorni link, potrebna je HIGH ID" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Dijeljeni fajlovi (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "" + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "" + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "" + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "" + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "" + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "" + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "" + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Downloading..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Opcije" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Pretrazi :" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Ponistenje" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +msgid " with " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "LowID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Veza nije uspostavljena" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "Otkaz" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Dodaj" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Ocisti" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Start" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Izlaz" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Auto [Ni]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Auto [No]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Auto [Vi]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Spajanje" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Pita" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Spaja preko servera" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Pun red cekanja" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "U redu cekanja" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Prenosi" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Prima hashset" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Nepotrebni dijelovi" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Ne moze spojiti LowID sa LowID" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Previse konekcija" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Zabranjen" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Standard sistema" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Arabic" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Basque" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Bulgarian" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Catalan" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Danish" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Dutch" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Estonian" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Finnish" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "French" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "German" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Hungarian" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Italian" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Korean" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "Lithuanian" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Polish" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portuguese" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Russian" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Spanish" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Ime servera" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Port" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Opis" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Korisnici" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Fajlovi" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Neuspjesno" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Staticni" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Info" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Da" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Ne" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Serveri (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Server" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "" + +#: src/ServerListCtrl.cpp:428 +msgid "Mark server as static" +msgstr "" + +#: src/ServerListCtrl.cpp:429 +msgid "Mark server as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:431 +msgid "Mark servers as static" +msgstr "" + +#: src/ServerListCtrl.cpp:432 +msgid "Mark servers as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:438 +msgid "Remove server" +msgstr "Odstrani servera" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "Odstrani servera" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Odstrani sve servere" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Kopiraj ED2k link u klipbord" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "Kopiraj ED2k link u klipbord" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Da li zaist zelis otkazati i obrisati ove fajlove ?\n" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Da li zaist zelis otkazati i obrisati ove fajlove ?\n" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Onemoguceno [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "" + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Fatalna greska: Neuspjesno stvaranje tajmera" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr "" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr "" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "Spajanje" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "Prekinuta veza" + +#: src/amuleDlg.cpp:676 +msgid "Kad: Firewalled" +msgstr "" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "Veza uspostavljena" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "Spajanje" + +#: src/amuleDlg.cpp:689 +msgid "Kad: Off" +msgstr "" + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "Zaustavlja trenutne pokusaje uspostavljanja veze" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Prekinuti vezu" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "Prekinuti vezu sa sadasnjim serverom" + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Uspostavi vezu" + +#: src/amuleDlg.cpp:726 +msgid "Connect to the currently enabled networks" +msgstr "" + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Gore: %.1f(%.1f) | Dole: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Gore: %.1f | Dole: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Da li zaista zelite iskljuciti aMule?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Potvrda izlaza" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Nije utvrdjena komanda za rad brausera." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Pretrage" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Prozor pretraga" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Transferi" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Prozor transfera fajlova" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Prozor dijeljenih fajlova" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Poruke" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Prozor poruka" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Statistike" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Prozor grafova statistike" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Prozor postavke opcija" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Glavni" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Veza" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Daljinsko upravljanje" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Direktoriji" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "Gui Tweaks" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Up: 0.0 | Down: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Potrazi wav" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "Fajl wav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Potrazi videoplejer" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Editiraj listu servera" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Dodaj ovdje URLs da dobijes server.met fajlove. \n" +"Samo jedna URL po liniji." + +#: src/PrefsUnifiedDlg.cpp:980 +#, fuzzy, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Obnovi kasnjenje : 5 sekundi" +msgstr[1] "Obnovi kasnjenje : 5 sekundi" + +#: src/PrefsUnifiedDlg.cpp:987 +#, fuzzy, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Vrijeme za prosjecni graf: 100 minuta" +msgstr[1] "Vrijeme za prosjecni graf: 100 minuta" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:999 +#, fuzzy, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Obnovi kasnjenje : 5 sekundi" +msgstr[1] "Obnovi kasnjenje : 5 sekundi" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, fuzzy, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Velicina fajl buffera %i bytes" +msgstr[1] "Velicina fajl buffera %i bytes" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, fuzzy, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Duzina liste cekanja %i klienata" +msgstr[1] "Duzina liste cekanja %i klienata" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, fuzzy, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Interval obnavljanja veze servera %i minuta" +msgstr[1] "Interval obnavljanja veze servera %i minuta" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Interval obnavljanja veze servera: onemoguceno" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "" + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "" + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "" + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "" + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "" + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "" + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "" + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "" + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "" + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "" + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "" + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "" + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "" + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "" + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "" + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "" + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "" + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "" + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "" + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "" + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "" + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "" + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "" + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "" + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "" + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "" + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "" + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "" + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Veza uspostavljena" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Port" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Prekinuta veza" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "OK" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "" + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Vrijeme korisnika: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Transfer" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Uploadovi" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Prosjecno vrijeme uploada: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Downloads" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Ponovno vezan: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Vriejme od prvog transfera: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Spojen sa serverom vec: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Klienti" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Serveri" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Zauzetost servera: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Ukupna velicina dijeljenih fajlova: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Prosjecna velicina fajla: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "" + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "Korisnik %s (%u) dijeli direktorije %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "" + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "Korisnik %s (%u) je poslao listu dijeljenih fajlova za direktorij %s" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "Korisnik %s (%u) ja zavrsio slanje liste dijeljenih fajlova" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "Korisnik %s (%u) ja zavrsio slanje nezeljene liste dijeljenih fajlova" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "" + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "" + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Dodaj prijatelja" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Ukucaj vazecu IP adresu i port!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Izvori" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Fajl" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Download" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Kategorija" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "" + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Greska" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Transferirano" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Zavrseno" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Brzina" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Napredak" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Status" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Preostalo vrijeme" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Posljednji put vidjen kompletno" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Posljedni prijem" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Da li zaist zelis otkazati i obrisati ove fajlove ?\n" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Da li zaist zelis otkazati i obrisati ove fajlove ?\n" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Stop" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Pauza" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Nastavak" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "O&dstrani zavrsene fajlove" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Primijeni sve A4AF ovom fajlu" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Primijeni sve A4AF ovom fajlu (Automatski)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Primijeni sve A4AF nekom drugom fajlu" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Prosirene opcije" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Preuvid" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Pokazi &detalje fajla" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Pokazi sve kommentare" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "neodredjeno" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Odredi u kategoriju" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "&Otvori fajl" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Primi u prijatelje" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Upitao za drugi fajl" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Downloads (%i)" + +#: src/DownloadListCtrl.cpp:2222 +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2260 +#, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "GRESKA: neuspjesno stvaranje zapocetog fajla)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "" + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Neuspjelo otvaranje %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "" + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "Neuspjesno spasavanje part.met.seeds fajla za %s" + +#: src/PartFile.cpp:1019 +#, fuzzy, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "Spaseni %i seeds izvora za poceti fajl: %s (%s)" +msgstr[1] "Spaseni %i seeds izvora za poceti fajl: %s (%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "Poceti fajl %s (%s) nema seesd fajlova" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, fuzzy, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"Nadjen koruptan dio (%i) u %i pocetom fajlu %s - FileResultHash |%s| " +"FileHash |%s|" +msgstr[1] "" +"Nadjen koruptan dio (%i) u %i pocetom fajlu %s - FileResultHash |%s| " +"FileHash |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "Zavrseno rehashing %s" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "Neocekivana fajl greska prilikom zavrsavanja %s. Fajl pauziran" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"Upozorenje: Nemoguce hashovanje gotovog dijela - hashset nedovrsen (%s). Ovo " +"ne smije da se desi" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Stopirano" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "" + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "Pronadjeno %i poznatih dijeljenih fajlova" +msgstr[1] "Pronadjeno %i poznatih dijeljenih fajlova" + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "Pronadjeno %i poznatih dijeljenih fajlova, %i nepoznatih" +msgstr[1] "Pronadjeno %i poznatih dijeljenih fajlova, %i nepoznatih" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Komentari fajla" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Ocjena" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Bez komentara" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "Bez komentara" +msgstr[1] "Bez komentara" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "Neuspjesno spajanje sa svim serverima u list. Pocinje iznova." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "" + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "Ni jedan vezeci server u listi nije pronadjen" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Spojen sa %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Uspostavljena veza sa: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"Fatalna greska prilikom pokusaja spajanja. Veza interneta je moguce prekinuta" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Izgubljena veza sa %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) je mrtav" + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "" + +#: src/ServerConnect.cpp:391 +#, fuzzy, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "Automatsko spajanje sa serverom ce ponovo poceti za %d sekundi" +msgstr[1] "Automatsko spajanje sa serverom ce ponovo poceti za %d sekundi" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Izgubljena veza" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "" + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "Greska: neispravan socket u vrijeme timeouta" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "" + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Nisu nadjeni nikakvi poceti fajlovi" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "Nadjeno %i pocetih fajlova" +msgstr[1] "Nadjeno %i pocetih fajlova" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Downloading %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Vec pokusavate downloadovati fajl %s" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "" + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "" + +#: src/TextClient.cpp:305 +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" + +#: src/TextClient.cpp:343 +msgid "Processing by hash: " +msgstr "" + +#: src/TextClient.cpp:358 +msgid "Processing by filename: " +msgstr "" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "" + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "" + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "" + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "" + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "" + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "" + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "" + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "" + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "" + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "" + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "" + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "" + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "" + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "" + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "" + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "" + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "" + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "" + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "" + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "" + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "" + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "" + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "" + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "" + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "" + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "" + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "" + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "" + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "" + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "" + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "" + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "" + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "" + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "" + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "" + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "" + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "" + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "" + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "" + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "" + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "" + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "" + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "" + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "" + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "" + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "" + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Novi klientID je %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "" + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "Primljeno %d novih servera" +msgstr[1] "Primljeno %d novih servera" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "" + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "Server je odbio posljednju komandu" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "" + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "" + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "" + +#: src/IP2Country.cpp:73 +#, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "" +msgstr[1] "" + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"Da li zaista zelite da ponistite i obrisete sve fajlove u ovoj kategoriji?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Potrebna potvrda" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Nedovrseno" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Video" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Audio" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Arhiva" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "CD_Imidz" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Slike" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Tekst" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Izaberi filter za gledanje" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Dodaj kategoriju" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Editiraj kategoriju" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Odstrani kategoriju" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "" + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "" + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Ceka ..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "Bytes" +msgstr[1] "Bytes" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "kBytes/sec" +msgstr[1] "kBytes/sec" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "sekundi" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "minuta" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Videa" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Arhiva" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programi" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Bilo koja" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Bez ocjene" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Neispravan / Koruptan / Falsifikat" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Los" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Vrlo dobar" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Dobar" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Odlican" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "svi" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "svi drugi" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "" + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" + +#: src/IPFilter.cpp:330 +#, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +msgstr[1] "" + +#: src/IPFilter.cpp:332 +#, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +msgstr[1] "" + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Aktivne veze (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "" + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Izvrsi" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Ucitava..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Broj korisnika na serveru sa kojim si spojen..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Korisnika: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Ne povezan..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "" + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Pretraga" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Ekstenzija" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Minimalna velicina" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Bytes" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Maksimalna velicina" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "" + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Klienti na cekanju :" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Posalji" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "" + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Zatvori" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "" + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Puno ime :" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "N/A" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "met-fajl :" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Hash :" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Velicina fajla :" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Status pocetog fajla :" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Posljednji put vidjen kompletno :" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Nadjeni izvori :" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Izvori koji transferuju :" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Broj pocetog fajla :" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Dostupnost :" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Podatak rate :" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "" + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Prenijeto :" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Zavrsna velicina :" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Rukovanje inteligentne korupcije (I.C.H.)" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Izgubljeno zbog korupcije :" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Steceno kompresijom :" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "Paketi spaseni kroz I.C.H. :" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Preuzimanje" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Ciscenje" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Primijeni" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"Za film mozes opisati njegovu duzinu, pricu, jezik ... \n" +"i da li je falsifikat i to ovim putem reci drugim korisnicima aMule." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Kvalitet fajla" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "Izaberi ocjenu fajla ili savjet korisnika ako je fajl neispravan ..." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Bez komentara" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Obnovi" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Downoading, molim strpljenje ..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Trazene informacije" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "IP adresa:" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Port :" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Dodatne informacije" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Ime korisnika :" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Hash korisnika :" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Trenutna misija" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Ukupno" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Zahtjevano :" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Aktivni uploadovi :" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Brzina downloada" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Trenutno" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Prosjek rada" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Prosjek misije" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Brzina uploada" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Aktivni downloadovi" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Aktivne veze (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Aktivni uploadovi" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Drvo statistike" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Ime korisnika:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Rezultati" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Nadimak" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - the Linux Mule" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "" + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Jezik" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "" + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Razne mogucnosti" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Pocni minimiran" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "" + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Pitanje pri napustanju" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "" + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "" + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "" + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Limit sirine pojasa" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Upload" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Alokacija slota" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Kapacitet linije" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "" + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "onemoguci" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Maksimalni izvor po fajlu" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Hard Limit" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Limit veza" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Maksimalne veze" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Autospajanje pri startu" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Ponovni spoj kod gubitka veze" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Pokazi sirinu pojasa overheada" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Otstrani mrtve servere nakon" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "pokusaja" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Automatski obnovi listu servera pri pocetku" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Lista" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Obnovi listu servera kad si povezan sa serverom" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Obnovi listu servera kad si povezan sa klientom" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Koristi sistem prioriteta" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Koristi pametnu LowID provjeru pri vezanju" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Sigurno povezivanje" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Autopovezivanje samo sa serverima iz staticne liste" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Postavi rucno dodate servere na visoki prioritet" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "I.C.H. aktiviran" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Dodaj nove fajlove u stanju pauze" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Dodaj nove fajlove sa auto prioritetom" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Pokusaj prvo downloadovati pocetni i zavrsni chunk " + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Dodaj nove dijeljene fajlove sa auto prioritetom" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Pokusaj uploadovati kompletne chunks" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Nastavi iduci pauziran fajl cim je jedan fajl gotov" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "" + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Prijemni direktorij :" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Privremeni direktorij :" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Dijeljeni direktoriji :" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Video Plejer" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Stvori backup za preuvid" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Grafovi" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Obnovi kasnjenje : 5 sekundi" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Vrijeme za prosjecni graf: 100 minuta" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Izaberi boje statistike" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Pozadina" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Mreza" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Trenutni download" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Prosjek tekuceg downloada" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Prosjek downloada misije" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Trenutni upload" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Prosjek tekuceg uploada" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Prosjek uploada misije" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Aktivne veze" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "poluga brzine prikazana u sistemskom koritu" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Izaberi" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Popup poruka" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Koristi ton" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Iskoci kad :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Novi upis u logu" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Pocetak novog razgovora" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Nova poruka primljena" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Download je dodat ili gotov" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Otkrivena nova aMule verzija" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "Hitno OOD, izgubljena veza sa serverom" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Obavijesti mailom" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Posalji email kad je transfer gotov." + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "SMTP server :" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "Email Adresa :" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! UPOZORENJE !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Ne mijenjaj ove opcije ako ne znas\n" +"sta radis, jer time mozes lako pogorsati\n" +"svoje stanje.\n" +"\n" +"aMule ce raditi dobro iako ne promijenis\n" +"nista od ovih opcija." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Maksimalne veze u / 5 sekundi" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Fajl Buffer velicina: 240000 bytes" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Duzina reda cekanja: 5000 klienta" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Interval obnavljanja veze servera: onemoguceno" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Napredak fajlova u redu cekanja" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Pokazi procente" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Pokazi polugu napretka" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Vrsta poluge napredka" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Pljosnata" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Obla" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Vershiedene GUI Tweaks" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Pokazi brzog ED2K rukovatelja" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Pokazi transfer rate u naslovu" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Webserver Parametri" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Port Webservera" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Vrijeme obnove stranice (u sekundama)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Odobri Gzip kompresiju" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Odobri korisnicima sa manje prava" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Sifra za puna prava" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Sifra za manje prava" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Parametri za spoljasnju vezu" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Prihvati spoljasnje veze" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "" + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "" + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Naziv :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Komentar:" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Prijemni direktorij :" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Promijeni prioritet za nove fajlove :" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Ne mijenjaj" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Izaberi boju za ovu kategoriju (trenutno izabrana) :" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Pokazi server motd kad je povezan ..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Lista servera" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "" + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "aMule Log" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "Klikni ovdje da obnovis listu servera sa URL ..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Lista servera" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Rucni dodatak servera : Ime" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "" + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "" + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "Dodaj servera rucno (prije ispuni polja lijevo) ..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "" + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Svi" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Niko" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "" + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Omoguci online potpis" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "" + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Izaberi mapu (folder) za dolazece fajlove" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "" + +#: src/ExternalConnector.cpp:188 +#, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "" + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "" + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "" + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "" + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "" + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "" + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "" + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "" + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "" + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "" + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "" + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "" + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "" + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "" + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "" + +#: src/ClientCreditsList.cpp:168 +#, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "" +msgstr[1] "" + +#: src/ClientCreditsList.cpp:171 +#, fuzzy, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] "Krediti istekli!" +msgstr[1] "Krediti istekli!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "" + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Dozvoli" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Pokazi uploadove" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Pokazi red cekanja" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Cekao" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Vriejeme uploada" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Prioritet fajla" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Rezultat" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Upitan" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Posljednji put vidjen" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Usao u red cekanja" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Detalji klienta" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Bez podrske" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Nedovrseno" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Los decko" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Priznat - OK" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "" + +#: src/ClientDetailDialog.cpp:190 +#, c-format +msgid "%u (QR: %u)" +msgstr "" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Bezkrajno" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "aMule izbor u koritu" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "KlientID: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Ime servera:" + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "ServerIP: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "TCP Port: Nije spreman" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "UDP Port: Nije spreman" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Online potpis: Omogucen" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Online potpis: Onemogucen" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Limit uploada" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Limit downloada" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Zatvori oznaku" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Zatvori sve oznake" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Zatvori druge oznake" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "%i servera pronadjeno u server.met" +msgstr[1] "%i servera pronadjeno u server.met" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d servera dodato" +msgstr[1] "%d servera dodato" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "" + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "" + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "" + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Neuspjelo spasavanje server.met!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "Neispravna URL" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"U 'addresses.dat' nije nadjen upis server liste. Molim upisitevazecu adresu " +"u ovaj fajl zbog auto obnavljanja server liste" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "" + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "" +"ne dajemo nikakvu garanciju da nece nista unistiti, tvoju kucu zapaliti, \n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "" + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "" + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "" + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "" + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "" + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "" + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "" + +#~ msgid "Sources Dropping" +#~ msgstr "Odbacivanje izvora" + +#~ msgid "Send sources to any other file before dropping (High CPU)" +#~ msgstr "Posalji izvore nekom drugom fajlu prije odbacivanja (visoka CPU)" + +#~ msgid "Full Queue Sources Handling" +#~ msgstr "Rukovanje punih izvora" + +#~ msgid "Enable auto drop Full Queue Sources" +#~ msgstr "Omoguci auto odbacivanje punih izvora" + +#~ msgid "High Queue Rating Sources Handling" +#~ msgstr "Rukovanje izvora sa visokim redom cekanja" + +#~ msgid "Enable auto drop High Queue Rating Sources" +#~ msgstr "Omguci auto odbacivanje izvora sa visokim redom cekanja" + +#~ msgid "High Queue Rating value" +#~ msgstr "Vrijednost ocjene visokog reda cekanja" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(Min 300 / Max 3000)" + +#~ msgid "Auto Drop Sources Timer" +#~ msgstr "Tajmer za auto odbacivanje" + +#~ msgid "Timer (in secs)" +#~ msgstr "Tajmer (u sekundama)" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(Min 60 / 3600 Max)" + +#~ msgid "Drop No Needed Sources now" +#~ msgstr "Odbaci nepotrebne izvore sada" + +#~ msgid "Drop Full Queue Sources now" +#~ msgstr "Odbaci pune izvore sada" + +#~ msgid "Drop High Queue Rating Sources now" +#~ msgstr "Odbaci izvore sa previsokim mjestom u redu cekanja" + +#~ msgid "Clean Up Sources now (NNS, FQS && HQRS)" +#~ msgstr "Pocisti izvore sada (NNS, FQS && HQRS)" + +#~ msgid "Copy ED2k link to clipboard (Hostname)" +#~ msgstr "Kopiraj ed2k &linkove u klipbord (Hostname)" + +#~ msgid "Minimize to trayicon" +#~ msgstr "Minimiraj u ikonu korita" + +#~ msgid "Port %d is not available. You will be LOWID" +#~ msgstr "Port %d nije dostupan. Imas LOWID" + +#~ msgid "" +#~ "Port %d is not available !!\n" +#~ "\n" +#~ "This will mean that you will be LOWID.\n" +#~ "\n" +#~ "Use netstat to determine when port becomes available\n" +#~ "and try starting amule again." +#~ msgstr "" +#~ "Port %d nije dostupan!!\n" +#~ "\n" +#~ "To znaci da ces imati LOWID.\n" +#~ "\n" +#~ "Koristi netstat da saznas kad ce port postati slobodan\n" +#~ "i startaj amule iznova." + +#~ msgid "Failed to save" +#~ msgstr "Neuspjesno pohranjivanje" + +#~ msgid " OnlineSig File" +#~ msgstr "Fajl online potpisa" + +#~ msgid "" +#~ "The selected locale seems not to be installed on your box\n" +#~ " You must generate it to use this language.\n" +#~ "A good start on linux systems is the file /etc/locale.gen and the package " +#~ "'locales'\n" +#~ "Good luck!\n" +#~ "(Note: I'll try to set it anyway)" +#~ msgstr "" +#~ "Izabrani lokal nije pronadjen na tvom sistemu\n" +#~ "Moras ga stvoriti da bi koristio ovaj jezik. \n" +#~ "Dobar pocetak na linux sistemima je fajl /etc/locale.gen i " +#~ "paket'locales'\n" +#~ "Mnogo srece!\n" +#~ "(Nota: Pokusat cu u svakom slucaju)" + +#~ msgid "" +#~ "Unable to launch browser. Please set correct browserexecutable path in " +#~ "Preferences." +#~ msgstr "" +#~ "Neuspjeh pri ukljucenju brausera. U postavkama se moze namjestititrag " +#~ "egsekutivnog fajla brausera." + +#~ msgid "" +#~ " --- This is the first time you run aMule %s ---\n" +#~ "\n" +#~ msgstr "" +#~ "--- Ovo je prvi put da koristis aMule %s ---\n" +#~ "\n" + +#~ msgid "This version is a testing version, updated daily, and \n" +#~ msgstr "Ovo je test verzija, koja se dnevno obnavlja, mi \n" + +#~ msgid "or kill your dog. But it *should* be safe to use anyway. \n" +#~ msgstr "" +#~ "ili ubiti tvog psa. *Trebalo* bi biti sigurno za koriscenje u svakom " +#~ "slucaju. \n" + +#~ msgid "This version has new SecureHash support, so your \n" +#~ msgstr "Ova verzija ima novu sigurnosnu hash podrsku, tako da \n" + +#~ msgid "client credits will be lost on this first run. \n" +#~ msgstr "ce klient krediti biti izgubljeni prilikom prvog rada. \n" + +#~ msgid "There is no way to fix that, and eMule did the same.\n" +#~ msgstr "" +#~ "Ne postoji mogucnost da se to ispravi i sa eMule je bio isti slucaj. \n" + +#~ msgid "But your hash will be safe against stealers now, and your\n" +#~ msgstr "Tvoj hash ce ovim putem biti siguran protiv hash lopova, a tvoj\n" + +#~ msgid "cryptokey.dat and clients.met are eMule compatible now.\n" +#~ msgstr "cryptokey.dat i clients.met su sada sa eMule kompatibilni. \n" + +#~ msgid "" +#~ "Just take them from your eMule config dir and put then on ~/.aMule.\n" +#~ msgstr "" +#~ "Samo ih preuzmi iz svog eMule config direktorija i stavi na ~/.aMule. \n" + +#~ msgid "If your language is changed now, please set it again on preferences." +#~ msgstr "" +#~ "Ako je vas jezik ovim promijenjen, molim namjesti ga ponovo pod opcijama." + +#~ msgid "Feel free to report any bugs to forum.amule.org" +#~ msgstr "Slobodno prijavi bilo kakve greske ili bugove u forum.amule.org" + +#~ msgid "Desktop integration" +#~ msgstr "Integracija desktopa" + +#~ msgid "Connection established on:" +#~ msgstr "Veza uspostavljena sa:" + +#~ msgid "Connect to any server" +#~ msgstr "Spoji sa bilo kojim serverom" + +#~ msgid "You are not connected to a server!" +#~ msgstr "Nisi povezan sa serverom!" + +#~ msgid "This ed2k link is invalid (%s)" +#~ msgstr "Ovaj ed2k link nije vazeci (%s)" + +#~ msgid "Invalid link: %s" +#~ msgstr "Nevazeci link: %s" + +#~ msgid "Filtered IP: %s (%s)" +#~ msgstr "Filterovane IP: %s (%s)" + +#~ msgid "Rating for file '%s' received: %i" +#~ msgstr "Ocjena za fajl'%s' primljeno: %i" + +#~ msgid "Description for file '%s' received: %s" +#~ msgstr "Opis fajla '%s' primljeno: %s" + +#~ msgid "Unable to retrieve shared files from '%s'" +#~ msgstr "Neuspjesan prikaz dijeljenjih fajlova od '%s'" + +#~ msgid "Requesting shared files from '%s'" +#~ msgstr "Zahtjev dijeljenih fajlova od '%s'" + +#~ msgid "Requesting shared files from user %s (%u) is already in progress" +#~ msgstr "Zahtjev dijeljenih fajlova od korisnika %s (%u) je vec u toku" + +#~ msgid "NickName: %s\n" +#~ msgstr "Nadimak: %s\n" + +#~ msgid "Filestats for all sessions: Accepted %d of %d requests" +#~ msgstr "Fajl statistike za sve misije: Prihvaceno %d od %d zahtjeva" + +#~ msgid "can't create file '%s'" +#~ msgstr "ne moze naciniti fajl '%s'" + +#~ msgid "Can't open file '%s'" +#~ msgstr "Ne moze otvoriti fajl '%s'" + +#~ msgid "can't close file descriptor %d" +#~ msgstr "Ne moze zatvoriti opisivaca %d" + +#~ msgid "can't read from file descriptor %d" +#~ msgstr "Ne moze citati iz opisivaca fajla %d" + +#~ msgid "can't write to file descriptor %d" +#~ msgstr "Ne moze pisati u poisivaca fajla %d" + +#~ msgid "can't flush file descriptor %d" +#~ msgstr "Ne moze poplaviti opisivaca fajla %d" + +#~ msgid "unknown seek origin" +#~ msgstr "Nepoznato porijeklo trazenja" + +#~ msgid "can't get seek position on file descriptor %d" +#~ msgstr "Ne moze naci poziciju trazenja na opisivacu fajla %d" + +#~ msgid "can't find length of file on file descriptor %d" +#~ msgstr "Ne moze naci duzinu fajla na opisivacu fajla %d" + +#~ msgid "can't determine if the end of file is reached on descriptor %d" +#~ msgstr "Ne moze potvrditi da li je kraj fajla pronadjen na opisivacu %d" + +#~ msgid "invalid eof() return value." +#~ msgstr "Nevazeca eof() vrijednost" + +#~ msgid "*** Chatsession Start : " +#~ msgstr "*** Pocetak razgovora :" + +#~ msgid "Message from" +#~ msgstr "Poruka od" + +#~ msgid "failed" +#~ msgstr "neuspjesno" + +#~ msgid "*** Disconnected" +#~ msgstr "*** Veza prekinuta" + +#~ msgid "Failed to load creditfile" +#~ msgstr "Neuspjesno citanje kreditnog fajla" + +#~ msgid "Failed to save creditfile" +#~ msgstr "Neuspjesno spasavanje kreditnog fajla" + +#~ msgid "IDS_CRYPT_INITFAILED\n" +#~ msgstr "IDS_CRYPT_INITFAILED\n" + +#~ msgid "ClientSoftware ->" +#~ msgstr "Klientov Software ->" + +#~ msgid "<- ClientVersion ->v" +#~ msgstr "<- ClientVersion ->v" + +#~ msgid "<- ClientModString ->" +#~ msgstr "<- ClientModString ->" + +#~ msgid "Not Avaiable" +#~ msgstr "Nedostupan" + +#~ msgid "" +#~ "WARNING! Found matching client, to a currently connected client: %s (%s) " +#~ "and with %s" +#~ msgstr "" +#~ "UPOZORENJE! Nadjen isti klient sa trenutno povezanim klientom: %s (%s) i " +#~ "sa %s" + +#~ msgid "" +#~ "Error while processing incoming UDP Packet (Most likely a misconfigured " +#~ "server)" +#~ msgstr "" +#~ "Greska prilikom prijema UDP paketa (vjerovatno lose konfiguriran server)" + +#~ msgid "" +#~ "Ignoring %u bytes of block %u-%u because of errornous zstream state for " +#~ "file \"%s\"" +#~ msgstr "" +#~ "Ignorisanje %u bytes bloka %u-%u zbog pogresnog zstreama stanja za fajl\"%" +#~ "s\"" + +#~ msgid "Corrupted compressed packet for %s received (error %i)" +#~ msgstr "Koruptan komprimirani paket za %s dobiven (error %i)" + +#~ msgid "Unknown exception in %s: file \"%s\"" +#~ msgstr "Nepoznata iznimka u %s: fajlu \"%s\"" + +#~ msgid "Check Fake" +#~ msgstr "Provjera o podvali" + +#~ msgid "Copy ED2k link to clipboard (&HTML)" +#~ msgstr "Kopiraj ed2k &linkove u klipbord (&HTML)" + +#~ msgid "Show Lists" +#~ msgstr "Pokazi liste" + +#~ msgid "Hide Lists" +#~ msgstr "Sakrij liste" + +#~ msgid "Preview [" +#~ msgstr "Preuvid [" + +#~ msgid "eDonkey v%i" +#~ msgstr "eDonkey v%i" + +#~ msgid "eDonkeyHybrid v%i" +#~ msgstr "eDonkeyHybrid v%i" + +#~ msgid "eMule v%02X" +#~ msgstr "eMule v%02X" + +#~ msgid "aMule [ %s ]" +#~ msgstr "aMule [ %s ]" + +#~ msgid "aMule v0.%02X" +#~ msgstr "aMule v0.%02X" + +#~ msgid "lMule/xMule v0.%02X" +#~ msgstr "lMule/xMule v0.%02X" + +#~ msgid "Old MLdonkey" +#~ msgstr "Old MLdonkey" + +#~ msgid "New MLdonkey" +#~ msgstr "New MLdonkey" + +#~ msgid "Are you sure that you want to cancel and delete this file ?\n" +#~ msgstr "Da li zaist zelis otkazati i obrisati ovaj fajl ?\n" + +#~ msgid "You already have the file %s" +#~ msgstr "Vec imate fajl %s" + +#~ msgid "Bad link." +#~ msgstr "Los link." + +#~ msgid "not a well-formed ed2k link" +#~ msgstr "nije dobro formiran ed2k link" + +#~ msgid "Not an ED2K server or file link" +#~ msgstr "Nije ed2k server ili fajl link" + +#~ msgid "can't write file '%s'" +#~ msgstr "Ne moze pisati fajl '%s'" + +#~ msgid "New external connection accepted\n" +#~ msgstr "Nova vanjska veza prihvacena\n" + +#~ msgid "" +#~ "Error: couldn't accept a new external connection\n" +#~ "\n" +#~ msgstr "" +#~ "Greska: nemoze prihvatiti novu vanjsku vezu\n" +#~ "\n" + +#~ msgid "done" +#~ msgstr "gotovo" + +#~ msgid "Failed to copy the file '%s' to '%s'" +#~ msgstr "Greska u kopiranju fajla '%s' u '%s'" + +#~ msgid "Impossible to get permissions for file '%s'" +#~ msgstr "Nemoguce je dobiti dozvolu za fajl '%s'" + +#~ msgid "Impossible to overwrite the file '%s'" +#~ msgstr "Nemguce je prepisati fajl '%s'" + +#~ msgid "Impossible to set permissions for the file '%s'" +#~ msgstr "Nemoguce je postaviti dozvole za fajl '%s'" + +#~ msgid "Loaded ipfilter with %d IP addresses." +#~ msgstr "Ucitan ipfilter sa %d IP adresa." + +#~ msgid "Error: the file known.met is corrupted, unable to load known files" +#~ msgstr "Greska: fajl known.met je koruptan, nemoguce citati poznate fajlove" + +#~ msgid "" +#~ "Unexpected file error while reading known.met: %s, unable to load known " +#~ "files" +#~ msgstr "" +#~ "Neocekivana fajl greska prilikom citanja known.met: %s, nemoguce citati " +#~ "poznate fajlove" + +#~ msgid "User %s (%u) requested your sharedfiles-list -> %s" +#~ msgstr "Korisnik %s (%u) ja zahtio tvoju listu dijeljenih fajlova -> %s" + +#~ msgid "accepted" +#~ msgstr "prihvaceno" + +#~ msgid "denied" +#~ msgstr "odbijeno" + +#~ msgid "User %s (%u) requested your shareddirectories-list -> %s" +#~ msgstr "" +#~ "Korisnik %s (%u) je zahtio tvoju listu zajednickih direktorija -> %s" + +#~ msgid "User %s (%u) requested your sharedfiles-list for directory %s -> %s" +#~ msgstr "" +#~ "Korisnik %s (%u) ja zahtio tvoju listu dijeljenih fajlova za direktorij %" +#~ "s -> %s" + +#~ msgid "User %s (%u) denied access to shareddirectories/files-list" +#~ msgstr "Korisnik %s (%u) ja zabranio dostup liste dijeljenih fajlova" + +#~ msgid "Client '%s' (IP:%s) caused an error: %s. Disconnecting client!" +#~ msgstr "" +#~ "Klient '%s' (IP:%s) je prouzrocio gresku: %s. Prekidanje veze klienta!" + +#~ msgid "" +#~ "A client caused an error or did something bad: %s. Disconnecting client!" +#~ msgstr "" +#~ "Klient je prouzrokovao gresku ili nacinio nesto lose: %s. Prekidanje veze " +#~ "klienta!" + +#~ msgid "Client '%s' (IP:%s) caused an error: %u. Disconnecting client!" +#~ msgstr "" +#~ "Klient '%s' (IP:%s) je prouzrocio gresku: %u. Prekidanje veze klienta!" + +#~ msgid "Unknown client (IP:%s) caused an error: %u. Disconnecting client!" +#~ msgstr "" +#~ "Nepoznat klient (IP:%s) je prouzrocio gresku: %u. Prekidanje veze klienta!" + +#~ msgid "" +#~ "A client caused an error or did something bad. Disconnecting client !" +#~ msgstr "" +#~ "Klient je prouzrokovao gresku ili nacinio nesto lose. Prekidanje veze " +#~ "klienta!" + +#~ msgid "Concurrent Downloads" +#~ msgstr "Konkurentni downloadi" + +#~ msgid "1-5" +#~ msgstr "1-5" + +#~ msgid "6-15" +#~ msgstr "6-15" + +#~ msgid "16+" +#~ msgstr "16+" + +#~ msgid "Connection Type" +#~ msgstr "Vrsta veze" + +#~ msgid "Select your connection type here :" +#~ msgstr "Izaberite vrstu vase veze ovdje:" + +#~ msgid "True download bandwidth" +#~ msgstr "Istinska sirina pojasa downloada" + +#~ msgid "True upload bandwidth" +#~ msgstr "Istinska sirina pojasa uploada" + +#~ msgid "Unit:" +#~ msgstr "Jedinica:" + +#~ msgid "kbits/sec" +#~ msgstr "kbits/sec" + +#~ msgid "" +#~ "For system tray integration to work,\n" +#~ "you must specify which desktop you are using.\n" +#~ "You can change this later from preferences." +#~ msgstr "" +#~ "Da bi sistemsko korito moglo da radi,\n" +#~ "moras navesti koji desktop koristis. \n" +#~ "Ovo mozes kasnije promijeniti u postavkama." + +#~ msgid "Desktop" +#~ msgstr "Desktop" + +#~ msgid "Gnome 2.x (or other XEMBED compatible)" +#~ msgstr "Gnome 2.x (or other XEMBED compatible)" + +#~ msgid "KDE 3.x" +#~ msgstr "KDE 3.x" + +#~ msgid "KDE 2.x / Gnome 1.2 " +#~ msgstr "KDE 2.x / Gnome 1.2 " + +#~ msgid "No systray integration, please" +#~ msgstr "Molim, ne integraciju u sistemskom koritu." + +#~ msgid "Fast ED2K Links Handler (Direct Download)" +#~ msgstr "Brzi ED2K rukovatelj (Direktan download)" + +#~ msgid "Name" +#~ msgstr "Ime" + +#~ msgid "Automatically assign new downloads to selected category" +#~ msgstr "Automatski primijeni nove downloade izabranim kategorijama" + +#~ msgid "Min Availability" +#~ msgstr "Najmanja raspolozivost" + +#~ msgid "Search global" +#~ msgstr "Globalna pretraga" + +#~ msgid "Clear All" +#~ msgstr "Obrisi sve" + +#~ msgid "Download selected" +#~ msgstr "Downloaduj izabrano" + +#~ msgid "Media Info" +#~ msgstr "Media Info" + +#~ msgid "Codec:" +#~ msgstr "Codec:" + +#~ msgid "Bitrate:" +#~ msgstr "Bitrate:" + +#~ msgid "Length:" +#~ msgstr "Duzina :" + +#~ msgid " / (" +#~ msgstr " / (" + +#~ msgid ")" +#~ msgstr ")" + +#~ msgid "Source Names" +#~ msgstr "Ime izvora" + +#~ msgid "Comment this file (this text will be show by all users)" +#~ msgstr "Komentiraj ovaj fajl (ovaj tekst vide svi korisnici)" + +#~ msgid "(" +#~ msgstr "(" + +#~ msgid "Reload" +#~ msgstr "Ponovno ucitati" + +#~ msgid "Clientsoftware :" +#~ msgstr "Klientov software :" + +#~ msgid "Server IP :" +#~ msgstr "Server IP :" + +#~ msgid "Clientversion :" +#~ msgstr "Verzija klienta :" + +#~ msgid "ID :" +#~ msgstr "ID :" + +#~ msgid "Servername :" +#~ msgstr "Ime servera :" + +#~ msgid "Currently downloading :" +#~ msgstr "Trenutno downloading :" + +#~ msgid "Downloaded (this session) :" +#~ msgstr "Downloaded (ova misija)" + +#~ msgid "Average downloadrate :" +#~ msgstr "Prosjecna brzina downloada :" + +#~ msgid "Downloaded total :" +#~ msgstr "Downloaded ukupno :" + +#~ msgid "Uploaded (this session) :" +#~ msgstr "Uploaded (ova misija) :" + +#~ msgid "Average Uploadrate :" +#~ msgstr "Prosjecna brzina uploada :" + +#~ msgid "Uploaded total :" +#~ msgstr "Uploaded ukupno :" + +#~ msgid "DL/UP Modifier :" +#~ msgstr "DL/UP Modifikator :" + +#~ msgid "Rating (total) :" +#~ msgstr "Ocjena (ukupno) :" + +#~ msgid "Secure Ident :" +#~ msgstr "Sigurna identifikacija :" + +#~ msgid "Uploadqueue score :" +#~ msgstr "Ocjena upload reda cekanja :" + +#~ msgid "Chinese" +#~ msgstr "Chinese" + +#~ msgid "English" +#~ msgstr "English" + +#~ msgid "Galego" +#~ msgstr "Galego" + +#~ msgid "German (Swiss)" +#~ msgstr "German (Swiss)" + +#~ msgid "Portuguese (Brazil)" +#~ msgstr "Portuguese (Brazil)" + +#~ msgid "Spanish (Chile)" +#~ msgstr "Spanish (Chile)" + +#~ msgid "Spanish (Mexico)" +#~ msgstr "Spanish (Mexico)" + +#~ msgid "Turkey" +#~ msgstr "Turkey" + +#~ msgid "Beep on errors" +#~ msgstr "Pip na greskama" + +#~ msgid "Bring to front on link click" +#~ msgstr "Naprijed dovesti na pritisak linka" + +#~ msgid "Downloadlist doubleclick to expand" +#~ msgstr "Duplim pritiskom sirenje liste" + +#~ msgid "Tooltip Delay Time in secs (1s to 5s)" +#~ msgstr "Tooltip kasnjenje u sekundama (1s to 5s)" + +#~ msgid "Systray Integration" +#~ msgstr "Integracija u sistem koritu" + +#~ msgid "Startup" +#~ msgstr "Pocetak" + +#~ msgid "5 Days" +#~ msgstr "5 Dana" + +#~ msgid "Check for new version" +#~ msgstr "Provjeri o novoj verziji" + +#~ msgid "Show Splashscreen" +#~ msgstr "Pokazi logo" + +#~ msgid "Clientport" +#~ msgstr "Port klienta" + +#~ msgid "TCP" +#~ msgstr "TCP" + +#~ msgid "UDP" +#~ msgstr "UDP" + +#~ msgid "Use Secure Ident" +#~ msgstr "Koristi sigurnu identifikaciju" + +#~ msgid "Connection Wizard" +#~ msgstr "Wizard za veze" + +#~ msgid "IP-Filter" +#~ msgstr "IP-Filter" + +#~ msgid "IP-Filter ON / OFF" +#~ msgstr "IP-Filter ON / OFF" + +#~ msgid "Always filter bad IPs" +#~ msgstr "Uvijek filtriraj lose IPs" + +#~ msgid "See my shares" +#~ msgstr "Smiju vidjeti moje fajlove" + +#~ msgid "Save 5 sources on rare files (< 20 sources)" +#~ msgstr "Pohrani izvore za rijetke fajlove (< 20 izvora)" + +#~ msgid "Extract Meta Data Tags" +#~ msgstr "Prosiri Meta Data Tags" + +#~ msgid "mplayer -idx" +#~ msgstr "mplayer -idx" + +#~ msgid "aMule Tweaks Advertisements && Parameters" +#~ msgstr "aMule Tweaks Advertisements && Parameters" + +#~ msgid "Verbose (additional program feedback)" +#~ msgstr "Verbose (dodatna obavjestenja programa)" + +#~ msgid "Autotake ED2K Links only during runtime" +#~ msgstr "Prihvati linkove samo dok program radi" + +#~ msgid "Upload/Download list refresh when updated" +#~ msgstr "Obnovi listu Uploada/Downloada kod obnavljanja" + +#~ msgid "Upload/Download list refresh time: Realtime" +#~ msgstr "Interval obnavljanja Upload/Download liste: tekuce vrijeme" + +#~ msgid "Arrange Downloads" +#~ msgstr "Grupiraj downloadove" + +#~ msgid "Enable auto-arranging download list " +#~ msgstr "odobri auto grupiranje liste downloada" + +#~ msgid "Download speed" +#~ msgstr "Brzina downloada" + +#~ msgid "Number of sources" +#~ msgstr "Broj izvora" + +#~ msgid "GTK Theme Selector" +#~ msgstr "GTK izabirac teme" + +#~ msgid "Theme :" +#~ msgstr "Tema :" + +#~ msgid "Use Font " +#~ msgstr "Koristi font " + +#~ msgid "Font" +#~ msgstr "Font" + +#~ msgid "Use old style tabs on preferences" +#~ msgstr "Koristi stare tabove kod opcija" + +#~ msgid "No Needed Sources Handling" +#~ msgstr "Rukovanje nepotrebnig izvora" + +#~ msgid "Enable auto drop No Needed Sources" +#~ msgstr "Omoguci auto odbacivanje nepotrebnih izvora" + +#~ msgid "Extended Dropping" +#~ msgstr "Prosireno odbacivanje" + +#~ msgid "Drop sources anyway" +#~ msgstr "Odbaci izvore u svakom slucaju" + +#~ msgid "Enable Webserver" +#~ msgstr "Omoguci Webservera" + +#~ msgid "Use TCP ports instead of unix local sockets" +#~ msgstr "Koristi TCP portove umjesto unix local sockets" + +#~ msgid "External TCP port" +#~ msgstr "Spoljascnji TCP port" + +#~ msgid "Enable password" +#~ msgstr "Omoguci sifru" + +#~ msgid "Notify" +#~ msgstr "Obavijesti" + +#~ msgid "aMule Tweaks" +#~ msgstr "aMule Tweaks" + +#~ msgid "" +#~ "http://ocbmaurice.dyndns.org/pl/slist.pl/server.met?download/server-good." +#~ "met" +#~ msgstr "" +#~ "http://ocbmaurice.dyndns.org/pl/slist.pl/server.met?download/server-good." +#~ "met" + +#~ msgid "Servers List Window" +#~ msgstr "Prozor liste servera" + +#~ msgid "SharedFiles" +#~ msgstr "Dijeljeni fajlovi" + +#~ msgid "New Prefs" +#~ msgstr "Nove opcije" + +#~ msgid "News Preferences Work in Progress" +#~ msgstr "nove opcije rade u napretku" + +#~ msgid "K" +#~ msgstr "K" + +#~ msgid "h" +#~ msgstr "h" + +#~ msgid "D" +#~ msgstr "D" + +#~ msgid "?" +#~ msgstr "?" + +#~ msgid "Error: Failed to open part.met file! (%s => %s)" +#~ msgstr "greska: neuspjelo otvaranje part.met fajla! (%s => %s)" + +#~ msgid "Error: Invalid part.met fileversion! (%s => %s)" +#~ msgstr "Greska: Neispravna part.met fajl verzija! (%s => %s)" + +#~ msgid "Error: %s (%s) is corrupt" +#~ msgstr "Greska: %s (%s) ja koruptan" + +#~ msgid "Warning: %s might be corrupted" +#~ msgstr "Upozorenje: %s je moguce koruptan" + +#~ msgid "ERROR while saving partfile: %s (%s => %s)" +#~ msgstr "GRESKA kod spasavanja pocetog fajla: %s (%s => %s)" + +#~ msgid ".part file not found" +#~ msgstr ".part fajl nije nadjen" + +#~ msgid "Unable to open %s file - using .bak file.\n" +#~ msgstr "Neuspjelo otvaranje %s fajla koristeci .bak fajl. \n" + +#~ msgid "" +#~ "%s file is 0 size somehow - using .bak file.\n" +#~ " Please report on http://forum.amule.org\n" +#~ msgstr "" +#~ "%s fajl je 0 velicine nekako - koristeci .bak fajl.\n" +#~ " Molim javite na http://forum.amule.org\n" + +#~ msgid "Partfile %s (%s) has void seeds file" +#~ msgstr "Poceti fajl %s (%s) je izbjegao seeds fajlove" + +#~ msgid "" +#~ "Found corrupted part (%i) in 0 parts file %s - FileResultHash |%s| " +#~ "FileHash |%s|" +#~ msgstr "" +#~ "Nadjen koruptan dio (%i) u 0 pocetom fajlu %s - FileResultHash |%s| " +#~ "FileHash |%s|" + +#~ msgid "Failed to delete %s" +#~ msgstr "Neuspjelo brisanje %s" + +#~ msgid "Finished downloading %s :-)" +#~ msgstr "Zavrsen download %s :-)" + +#~ msgid "Downloaded:" +#~ msgstr "Downloaded:" + +#~ msgid "A file with that name already exists, the file has been saved as %s" +#~ msgstr "Fajl sa istim imenom vec postoji, fajl je spasen pod imenom %s" + +#~ msgid "Warning: Unable to hash downloaded part - hashset incomplete (%s)" +#~ msgstr "" +#~ "Upozorenje: Nemoguce hashovanje gotovog dijela - hashset nedovrsen (%s)" + +#~ msgid "ERROR: Cannot write to disk" +#~ msgstr "GRESKA: ne moze pisati na disk" + +#~ msgid "Downloaded part %i is corrupt :( (%s)" +#~ msgstr "Downloaded dio %i je koruptan :( (%s)" + +#~ msgid "ICH: Recovered corrupted part %i (%s)" +#~ msgstr "ICH: Koruptan dio je popravljen %i (%s)" + +#~ msgid "Unexpected file error while writing %s : %s" +#~ msgstr "Neocekivana fajl greska prilikom pisanja %s : %s" + +#~ msgid "" +#~ "Partfilename: %s\n" +#~ "Parts: %d , %s: %d (%.1f%%)\n" +#~ msgstr "" +#~ "Ime pocetog fajla: %s\n" +#~ "Poceti fajlovi: %d , %s: %d (%.1f%%)\n" + +#~ msgid "%d%% done (%s) - Transferring from %d sources" +#~ msgstr "%d%% gotov (%s) - Transfer od %d izvora" + +#~ msgid "Available" +#~ msgstr "Dostupnost" + +#~ msgid "Last Seen Complete :" +#~ msgstr "Posljednji put vidjen kompletno :" + +#~ msgid "Last Reception:" +#~ msgstr "Posljednji prijem:" + +#~ msgid "Executable (*)|*||" +#~ msgstr "Egzekutivno (*)|*||" + +#~ msgid "Language change will not be applied until aMule is restarted." +#~ msgstr "Promjena jezika nece biti izvrsena prije ponovnog startanja aMule" + +#~ msgid "Update: Disabled" +#~ msgstr "Obnavljanje: Onemoguceno" + +#~ msgid "Update period: %i sec" +#~ msgstr "Period obnavljanja: %i sekundi" + +#~ msgid "Update period: %i secs" +#~ msgstr "Period obnavljanja: %i sekundi" + +#~ msgid "Time for running averages: %i mins" +#~ msgstr "Vrijeme rada prosjeka: %i minuta" + +#~ msgid "Tweaks" +#~ msgstr "Tweaks" + +#~ msgid "Server connection refresh interval %i mins" +#~ msgstr "Interval obnavljanja veze servera %i minuta" + +#~ msgid "Upload/Download list refresh time: Disable" +#~ msgstr "Interval obnavljanja Upload/Download liste: onemogucen" + +#~ msgid "Upload/Download list refresh time: %i sec" +#~ msgstr "Interval obnavljanja Upload/Download liste: %i sekundi" + +#~ msgid "Upload/Download list refresh time: %i secs" +#~ msgstr "Interval obnavljanja Upload/Download liste: %i sekundi" + +#~ msgid "OLD Preferences" +#~ msgstr "Stare postavke" + +#~ msgid "Choose a folder for " +#~ msgstr "Izaberi mapu (folder) za" + +#~ msgid "%i days" +#~ msgstr "%i dana" + +#~ msgid "%i day" +#~ msgstr "%i dan" + +#~ msgid "PowerShare[Release]" +#~ msgstr "Power dijeljenje[Release]" + +#~ msgid "Copy ED2k link to clipboard (HTML)" +#~ msgstr "Kopiraj ED2k link u klipbord (HTML)" + +#~ msgid "Close this search result" +#~ msgstr "Zatvori ovaj rezultat pretrage" + +#~ msgid "Description: %s" +#~ msgstr "Opis: %s" + +#~ msgid "IP" +#~ msgstr "IP" + +#~ msgid "User: %i" +#~ msgstr "Korisnik: %i" + +#~ msgid "Unable to retrieve serverlist" +#~ msgstr "Nije u stanju pronaci server listu" + +#~ msgid "Failed to download the serverlist from %s" +#~ msgstr "Neuspio download serverliste od %s" + +#~ msgid "Failed to load server.met!" +#~ msgstr "Neuspjelo ucitavanje server.met!" + +#~ msgid "Invalid versiontag in server.met (0x%i , size %i)!" +#~ msgstr "Neispravan versiontag u server.met (0x%i , size %i)!" + +#~ msgid "Error: the file server.met is corrupted" +#~ msgstr "Greska: fajl server.met je koruptan" + +#~ msgid "Server added: " +#~ msgstr "Dodati serveri:" + +#~ msgid "Connect to this server" +#~ msgstr "Spoji sa ovim serverom" + +#~ msgid "Add to static" +#~ msgstr "Ucini staticnim" + +#~ msgid "Remove from static server list" +#~ msgstr "Odstrani sa liste staticnih" + +#~ msgid "Preference" +#~ msgstr "Opcija" + +#~ msgid "No Pref" +#~ msgstr "Bez opcija" + +#~ msgid "Failed to open staticservers.dat" +#~ msgstr "Neuspjelo otvaranje staticservers.dat" + +#~ msgid "Added to static server list" +#~ msgstr "Dodat listi staticnih servera" + +#~ msgid "Unknown server info received !" +#~ msgstr "Primljena nepoznata server informacija !" + +#~ msgid "Connecting to %s (%s:%i)..." +#~ msgstr "Spajanje sa %s (%s:%i)..." + +#~ msgid "Error while connecting to %s (%s:%i): %d" +#~ msgstr "Greska prilikom spajanja sa %s (%s:%i): %d" + +#~ msgid "Error in serversocket: %s (%s:%i): %u" +#~ msgstr "Greska u server soketu: %s (%s:%i): %u" + +#~ msgid "This is " +#~ msgstr "Ovo je" + +#~ msgid " (based on " +#~ msgstr "(na osnovi" + +#~ msgid "Visit http://www.amule.org to check if a new version is available.\n" +#~ msgstr "" +#~ "Posjetite http://www.amule.org da provjerite da li je nova verzija " +#~ "dostupna. \n" + +#~ msgid "Please enter a serveraddress" +#~ msgstr "Molim upisite adresu servera" + +#~ msgid "Incomplete serverport: Please enter a serverport" +#~ msgstr "Nepotpun port server: Molim upisite port servera" + +#~ msgid "Server not added!" +#~ msgstr "Server nije dodat!" + +#~ msgid "Low ID" +#~ msgstr "Low ID" + +#~ msgid "High ID" +#~ msgstr "High ID" + +#~ msgid "Loading..." +#~ msgstr "Ucitava..." + +#~ msgid "Permission" +#~ msgstr "Dozvola" + +#~ msgid "Public" +#~ msgstr "Javno" + +#~ msgid "Friends only" +#~ msgstr "Samo prijatelji" + +#~ msgid "Locked" +#~ msgstr "Zakljucano" + +#~ msgid "Permissions" +#~ msgstr "Dozvole" + +#~ msgid "Change this file's comment..." +#~ msgstr "Promijeni komentar ovog fajla" + +#~ msgid "Auto [Re]" +#~ msgstr "Auto [Re]" + +#~ msgid "Hidden" +#~ msgstr "Sakriven" + +#~ msgid "You cannot change permissions while a file is still downloading!" +#~ msgstr "Ne mozete promijeniti dozvole za vriejme downloada!" + +#~ msgid "%s (%s:%i) appears to be full" +#~ msgstr "%s (%s:%i) je pun" + +#~ msgid "Connecting to %s (%s:%i ) failed." +#~ msgstr "Spajanje sa %s (%s:%i ) nije uspjelo." + +#~ msgid "Connection attempt to %s (%s:%i ) timed out" +#~ msgstr "Pokusaj spajanja sa %s (%s:%i ) istekao" + +#~ msgid "Refreshing server connection" +#~ msgstr "Obnavljanje veze servera" + +#~ msgid "Filtered: %i" +#~ msgstr "Filtrirani: %i" + +#~ msgid "Uptime: " +#~ msgstr "Vrijeme korisnika:" + +#~ msgid "Downloaded Data (Session (Total)): %s (%s)" +#~ msgstr "Podatak downloada (misija (ukupno)): %s (%s)" + +#~ msgid "Total Overhead (Packets): %s (%s)" +#~ msgstr "Ukupan overheas (Paketi): %s (%s)" + +#~ msgid "File Request Overhead (Packets): %s (%s)" +#~ msgstr "Zahtjev fajl overheada (Paketi): %s (%s)" + +#~ msgid "Source Exchange Overhead (Packets): %s (%s)" +#~ msgstr "Overhead razmjene izvora (Paketa): %s (%s)" + +#~ msgid "Server Overhead (Packets): %s (%s)" +#~ msgstr "Overhead servera (Paketa): %s (%s)" + +#~ msgid "Found Sources: %i" +#~ msgstr "Pronadjeni izvori: %i" + +#~ msgid "Active Downloads (chunks): %i" +#~ msgstr "Aktivni downloadovi (chunks): %i" + +#~ msgid "Uploaded Data (Session (Total)): %s (%s)" +#~ msgstr "Podatak uploada (misija (ukupno)): %s (%s)" + +#~ msgid "Active Uploads: %i" +#~ msgstr "Aktivni uploadovi: %i" + +#~ msgid "Waiting Uploads: %i" +#~ msgstr "Uploadovi na cekanju: %i" + +#~ msgid "Total successful upload sessions: %i" +#~ msgstr "Ukupne uspjesne upload misije: %i" + +#~ msgid "Total failed upload sessions: %i" +#~ msgstr "Ukupne neuspjesne upload misije: %i" + +#~ msgid "Average Downloadrate (Session): %.2f kB/s" +#~ msgstr "Prosjecna brzina downloada (misija): %.2f kB/s" + +#~ msgid "Average Uploadrate (Session): %.2f kB/s" +#~ msgstr "Prosjecna brzina uploada (misija): %.2f kB/s" + +#~ msgid "Max Downloadrate Average (Session): %.2f kB/s" +#~ msgstr "Maksimalna prosjecna brzina downloada (misija): %.2f kB/s" + +#~ msgid "Max Downloadrate (Session): %.2f kB/s" +#~ msgstr "Maksimalna brzina downloada (misija): %.2f kB/s" + +#~ msgid "waiting for transfer..." +#~ msgstr "ceka na transfer..." + +#~ msgid "waiting for connection..." +#~ msgstr "ceka na spajanje..." + +#~ msgid "Session UL:DL Ratio (Total):" +#~ msgstr "Odnos UL:DL misije (ukupno):" + +#~ msgid "%s Not available" +#~ msgstr "%s Nije dostupan" + +#~ msgid "Number of Shared Files: %i" +#~ msgstr "Broj dijeljenih fajlova: %i" + +#~ msgid "eMule: %i (%1.1f%%)" +#~ msgstr "eMule: %i (%1.1f%%)" + +#~ msgid "aMule: %i (%1.1f%%)" +#~ msgstr "aMule: %i (%1.1f%%)" + +#~ msgid "lMule/xMule: %i (%1.1f%%)" +#~ msgstr "lMule/xMule: %i (%1.1f%%)" + +#~ msgid "eDonkeyHybrid: %i (%1.1f%%)" +#~ msgstr "eDonkeyHybrid: %i (%1.1f%%)" + +#~ msgid "eDonkey: %i (%1.1f%%)" +#~ msgstr "eDonkey: %i (%1.1f%%)" + +#~ msgid "cDonkey: %i (%1.1f%%)" +#~ msgstr "cDonkey: %i (%1.1f%%)" + +#~ msgid "Old MLDonkey: %i (%1.1f%%)" +#~ msgstr "Old MLDonkey: %i (%1.1f%%)" + +#~ msgid "New MLDonkey: %i (%1.1f%%)" +#~ msgstr "New MLDonkey: %i (%1.1f%%)" + +#~ msgid "Unknown: %i" +#~ msgstr "Nepoznat: %i" + +#~ msgid "Working Servers" +#~ msgstr "Ispravni serveri" + +#~ msgid "Failed Servers" +#~ msgstr "Neuspjeli serveri" + +#~ msgid "Deleted Servers" +#~ msgstr "Obrisani serveri" + +#~ msgid "Users on Working Servers" +#~ msgstr "Korisnici na ispravnim serverima" + +#~ msgid "Files on Working Servers" +#~ msgstr "Fajlovi na ispravnim serverima" + +#~ msgid "Total Users" +#~ msgstr "Ukupno korisnika" + +#~ msgid "Total Files" +#~ msgstr "Ukupni fajlovi" + +#~ msgid "Active Connections (estimate)" +#~ msgstr "Aktivne veze (procjena)" + +#~ msgid "Max Connection Limit Reached" +#~ msgstr "Limit maksimalnih veza dostignut" + +#~ msgid "Average Connections (estimate)" +#~ msgstr "Prosjecne veze (procjena)" + +#~ msgid "Peak Connections (estimate)" +#~ msgstr "Vrh broja veza (procjena)" + +#~ msgid "Detection Disabled" +#~ msgstr "Otkrivanje onemoguceno" + +#~ msgid "Not Found" +#~ msgstr "Nije pronasao" + +#~ msgid "Actual Speed Limits:" +#~ msgstr "Trenutni limit brzine:" + +#~ msgid "DL: " +#~ msgstr "DL: " + +#~ msgid " kb/s " +#~ msgstr " kb/s " + +#~ msgid "UP: " +#~ msgstr "UP: " + +#~ msgid " kb/s" +#~ msgstr " kb/s" + +#~ msgid "aMule Tray Menu Info" +#~ msgstr "aMule izbor informacija u koritu" + +#~ msgid "Nick: " +#~ msgstr "Nadimak:" + +#~ msgid "Nick: Not Ready" +#~ msgstr "Nadimak: Nije spreman" + +#~ msgid "Hash: " +#~ msgstr "Hash: " + +#~ msgid "Hash: Not Ready" +#~ msgstr "Hash: Nije spreman" + +#~ msgid "ID: Not Connected" +#~ msgstr "ID: Nije spojen" + +#~ msgid "IP: " +#~ msgstr "IP: " + +#~ msgid "TCP Port: " +#~ msgstr "TCP Port: " + +#~ msgid "UDP Port: " +#~ msgstr "UDP Port: " + +#~ msgid "Uptime: None" +#~ msgstr "Vrijeme korisnika: Nepostoji" + +#~ msgid "ServerName: Not Connected" +#~ msgstr "Ime servera: Nije spojen" + +#~ msgid "ServerIP: Not Connected" +#~ msgstr "ServerIP: Nije spojen" + +#~ msgid "Shared Files: " +#~ msgstr "Dijeljeni fajlovi:" + +#~ msgid "Queued Clients: " +#~ msgstr "Klienti u redu cekanja:" + +#~ msgid "Total DL: " +#~ msgstr "Ukupno DL:" + +#~ msgid " GB" +#~ msgstr " GB" + +#~ msgid "Total UP: " +#~ msgstr "Ukupno UL:" + +#~ msgid "Personal Infos" +#~ msgstr "Licne informacije" + +#~ msgid "Show" +#~ msgstr "Pokazi" + +#~ msgid "Hide" +#~ msgstr "Sakrij" + +#~ msgid "All To Max Speed" +#~ msgstr "Sve na maksimalnu brzinu" + +#~ msgid "All To Min Speed" +#~ msgstr "Sve na minimalnu brzinu" + +#~ msgid "Disconnect from server" +#~ msgstr "Prekini vezu sa serverom" + +#~ msgid "aMule for Linux" +#~ msgstr "aMule za Linux" + +#~ msgid "Error while processing incoming extended protocol UDP Packet" +#~ msgstr "Greska prilikom procesa ulazeceg spoljasnjeg UDP paketa" + +#~ msgid "" +#~ "Client '%s' caused error while creating package (%s) - disconnecting " +#~ "client" +#~ msgstr "" +#~ "Klient '%s' je prouzrokovao gresku prilikom kreiranja paketa (%s) - " +#~ "prekidanje veze" + +#~ msgid "requested file not found" +#~ msgstr "trazeni fajl nije nadjen" + +#~ msgid "" +#~ "Client '%s' seems to be an aggressive client and is banned from the " +#~ "uploadqueue" +#~ msgstr "" +#~ "Klient '%s' je ocigledno agresivan klient i bit ce izbacen iz reda cekanja" + +#~ msgid "%s [%s:%i] using %s removed : invalide eMule client" +#~ msgstr "%s [%s:%i] koristeci %s odstranjen : neispravan eMule klient" + +#~ msgid "%s [%s:%i] using %s removed : suspicious mod string change" +#~ msgstr "" +#~ "%s [%s:%i] koristeci %s odstranjen : sumnjivo mijenjanje dodatke na imenu" + +#~ msgid "%s [%s:%i] using %s removed : known leecher" +#~ msgstr "%s [%s:%i] koristeci %s odstranjen : poznati leecher" + +#~ msgid "%s [%s:%i] using %s removed : suspicious hash change" +#~ msgstr "%s [%s:%i] koristeci %s odstranjen : sumnjiva promjena hasha" + +#~ msgid "%s [%s:%i] using %s removed : use your own hash" +#~ msgstr "%s [%s:%i] koristeci %s odstranjen : koristi vas licni hash" + +#~ msgid "%s [%s:%i] using %s removed : suspicious name change" +#~ msgstr "%s [%s:%i] koristeci %s odstranjen : sumnjivo mijenjanje imena" + +#~ msgid "" +#~ "%s [%s:%i] using %s removed : leecher, invalid eMule or irregular Donkey" +#~ msgstr "" +#~ "%s [%s:%i] koristeci %s odstranjen : leecher, neispravan eMule ili " +#~ "iregularan Donkey" + +#~ msgid "Client '%s' and '%s' have the same userhash or IP - removed '%s'" +#~ msgstr "" +#~ "Klienti '%s' i '%s' imaju ist hash korisnika ili IP - odstranjen '%s'" + +#~ msgid "Wizard" +#~ msgstr "Carobnjak" + +#~ msgid "Down (kbit/s)" +#~ msgstr "Dole (kbit/s)" + +#~ msgid "Up (kbit/s)" +#~ msgstr "Gore (kbit/s)" + +#~ msgid "Custom" +#~ msgstr "Vlastiti" + +#~ msgid "(enter below!)" +#~ msgstr "(upisite ispod!)" + +#~ msgid "56-k Modem" +#~ msgstr "56-k Modem" + +#~ msgid "ISDN" +#~ msgstr "ISDN" + +#~ msgid "ISDN 2x" +#~ msgstr "ISDN 2x" + +#~ msgid "xDSL" +#~ msgstr "xDSL" + +#~ msgid "Cable" +#~ msgstr "Cable" + +#~ msgid "T1" +#~ msgstr "T1" + +#~ msgid "T3+" +#~ msgstr "T3+" + +#~ msgid "100 Mbits" +#~ msgstr "100 Mbits" + +#~ msgid "155 Mbits (ATM)" +#~ msgstr "155 Mbits (ATM)" diff --git a/po/hu.po b/po/hu.po new file mode 100644 index 00000000..80f968ce --- /dev/null +++ b/po/hu.po @@ -0,0 +1,8310 @@ +# aMule i18n resource file +# Copyright (C) 2007 aMule Team +# This file is distributed under the same license as the aMule package. +# +msgid "" +msgstr "" +"Project-Id-Version: aMule\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2008-02-25 22:50+0100\n" +"Last-Translator: Dévai Tamás \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Hungarian\n" +"X-Poedit-Country: HUNGARY\n" +"X-Poedit-SourceCharset: utf-8\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Egy nem üres jelszót kell megadni." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Érvénytelen jelszó, nem egy MD5 hash!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Kapcsolódási hiba" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "EC kapcsolat sikertelen. Üres válasz." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "ExternalConn: Hozzáférés megtagadva, mert: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "ExternalConn: Hozzáférés megtagadva" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "ExternalConn: Rossz válasz a kiszolgálótól. Kapcsolat lezárva." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Sikerült! Kapcsolat létrejött ezzel: aMule " + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Sikerült! Kapcsolat létrejött." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Tördelőalgoritmizálás" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Befejezés" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Kész" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Szüneteltetve" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Hibás" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Letöltés alatt" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Várakozik" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "MD4 és AICH hash létrehozása a(z) '%s' fájlhoz." + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "MD4 hash létrehozása a(z) '%s' fájlhoz." + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "AICH hash létrehozása a(z) '%s' fájlhoz." + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "A régi AICH hashkészlet konvertálása 64b-re '%s'-ből '%s'-be." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "FIGYELEM: A fájlnév '%s' érvénytelen és '%s'-re lett átnevezve." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "FIGYELEM: A fájl '%s' már létezik, az új fájl '%s'-re lett nevezve." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" +"FIGYELMEZTETÉS: nem lehetett a(z) '%s' eredeti fájlt törölni a biztonsági " +"másolat létrehozása után" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "FIGYELMEZTETÉS: %s fájl törlése sikertelen" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Megosztott fájlok lehozatala sikertelen a(z) '%s' felhasználótól" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Ismeretlen" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (Hamis eMule %#x verzió)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (Hamis eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (Hamis eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (az eMule v0.%u alapján)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Becenév: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, c-format +msgid "Requested: %s\n" +msgstr "Kért: %s\n" + +#: src/BaseClient.cpp:1878 +#, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Fájlstatisztika ehhez a folyamathoz: %d kérés elfogadva %d-ből, %s " +"átmásolva\n" + +#: src/BaseClient.cpp:1881 +#, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Fájlstatisztika az összes folyamathoz: %d kérés elfogadva %d-ből, %s " +"átmásolva\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Ismeretlen lekérdezett fájl" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "A %s kliens a(z) %s:%d IP:Port-on %s %s %s -t használ" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Felhasználói név" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Barátok" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "&Részletek megjelenítése" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Barát hozzáadása" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Barát törlése" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "&Üzenet küldése" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Fájlok megtekintése" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Társ Slot létesítése" + +#: src/FriendListCtrl.cpp:273 +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Tényleg törölni szeretnéd a kiválasztott barátot?" + +#: src/FriendListCtrl.cpp:275 +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Tényleg törölni szeretnéd a kiválasztott barátokat?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Mégsem" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"Nem lehet egynél több barát slot-ot létrehozni.\n" +"Csak egy slot lett hozzárendelve." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Többszörös kiválasztás" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Fájlnév" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Méret" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Típus" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Prioritás" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "Fájl ID" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Kérések" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Elfogadott kérések" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Átmásolt adat" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Megosztási arány" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Megszerzett részek" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Komplett források száma" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Könyvtár útvonal" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Megosztott fájlok" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Nagyon alacsony" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Alacsony" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normál" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Magas" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Nagyon magas" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Forgalomba helyez" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Automatikus" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Megjegyzés/Értékelés hozzáadása" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Megjegyzés/Értékelés szerkesztése" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Átnevezés" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Add a gyűjteményben szereplő fájlokat az átviteli listához" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Magnet &URI másolása a vágólapra" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "ED2k &link másolása a vágólapra" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "ED2K link másolása a vágólapra (&Forrás)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "ED2K hivatkozás másolása a vágólapra (Forrás) (Titkosítási opciókkal)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "ED2K hivatkozás másolása a vágólapra (&Hoszt név)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" +"ED2K hivatkozás másolása a vágólapra (Hoszt név) (Titkosítási opciókkal)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "ED2k link másolása a vágólapra (&AICH infó)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Visszajelzés másolása a vágólapra" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "Érvényes forráshivatkozáshoz magas azonosító (HighID) szükséges" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Figyelmeztetés" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Megosztott fájlok (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[Részfájl]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Írd be az új nevet ennek a fájlnak:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Fájl átnevezés" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Fájl feltöltés folytatása: %s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Fájl feltöltés felfüggesztése: %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: a keresési kulcsszó túl rövid" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Hiba: A TCP portot nem lehet figyelni." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "A kérés sikertelen volt a következő hibával: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "Kérés ismeretlen hibával sikertelen." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "Index fájl nem található: " + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Nem lehet web kapcsolódási szálat létesíteni\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Web kiszolgáló: elindítva\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Munkafolyamat időtúllépés - bejelentkezés kérése\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Munkamenet rendben, bejelentkezve\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Munkamenet rendben, nincs bejelentkezve\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Nincs munkafolyamat megnyitva - bejelentkezés kérése\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Munkafolyamat létrehozva - bejelentkezés kérése\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Kérés feldolgozása [eredeti]: " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Jelszó ellenőrzése \n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Jelszó hash érvénytelen\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Jelszó rendben\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Hibás jelszó\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "Nem adtál meg jelszót. Üres jelszó nem megengedett.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Kijelentkezés\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Kérés feldolgozása [átirányított]: " + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Betölti a(z) sablont" + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Webkiszolgáló HTTP port" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Használjon UPnP port továbbítást a webkiszolgáló portján" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "UPnP port" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Gzip tömörítés használata" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Teljes jogú jelszó a webkiszolgálóhoz" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Vendég jelszó a webkiszolgálóhoz" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Vendég felhasználó engedélyezése" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "vendég felhasználó tiltása" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "A webkiszolgáló beállításait az aMule-től tölti/oda tárolja." + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "aMule konfig fájl útvonala. NE HASZNÁLD!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "PHP feldolgozó letiltása (nem ajánlott)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "PHP oldalak újrafordítása minden kérésnél" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "aMule Web kiszolgáló" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Nem elérhető" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Soha" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Letöltés..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Beállítások" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "amulesig.dat fájlt tartalmazó könyvtár" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Tallóz" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Itt azt a könyvtárat add meg, ahol az amulesig.dat fájl található" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Frissítés gyakorisága mp-ben" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Statisztikai kép készítése minden frissítés alkalmával" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "Itt azt a könyvtárat add meg, ahová a statisztikát akarod elkészíteni" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Statisztikai kép periódikus feltöltése FTP kiszolgálóra" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "FTP Url" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "FTP útvonal" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Itt az FTP kiszolgálójának az URL-jét add meg" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "Könyvtár megadása" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Felhasználó" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Jelszó" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "" +"Itt a felhasználói nevet add meg az FTP kiszolgálóra törénő bejelentkezéshez" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Itt a jelszavad add meg az FTP kiszolgálóra törénő bejelentkezéshez" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "FTP frissítési gyakorisága percekben" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Mentés" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Aláírás fájlt tartalmazó könyvtár" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "A statisztika készítésének könyvtára" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i nap %i óra %i perc %i mp" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, aMule Online Statisztikák" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Üdvözöljük!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Legmagasabb letöltési arány a wxCas futása óta" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "Abszolút legmagasabb letöltési arány a wxCas előző futása alatt" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Töröl" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "Rendszer" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Automatikus frissítés leállítása" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Online statisztikák mentése" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Online statisztikák nyomtatása" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Tulajdonságok beállítása" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "wxCas Névjegy" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Automatikus frissítés elindítása" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Automatikus frissítés leállítva" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Automatikus frissítés elindítva" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Statisztikák mentése" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Ehhez a fájl típushoz nincs hozzátársítva alkalmazás." + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "A fájl nem lett mentve" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "aMule online statisztikák" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Nyomtatási probléma történt.\n" +"Lehet, hogy a nyomtatód nincs helyesen beállítva?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Nyomtatás" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, aMule OnLine Aláírás Statisztikák\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pedro de Oliveira által készített CAS alapokon\n" +"\n" +"Distributed under GPL" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Ó ó, az aMule nem fut..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule fut" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "Az aMule fut, de nincs kapcsolódva" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule kapcsolódása folyamatban..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Ó-Ó, az aMule állapota ismeretlen..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " fut " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " megállt !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " nincs kapcsolódva !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " kapcsolódás folyamatban ..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " valami különös történik, ellenőrízd !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " kapcsolódva ehhez: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "rendben" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "tűzfal mögül" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "nincs" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " csatlakozva ehhez " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +msgid " with " +msgstr " ezzel " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Összes letöltés: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Feltöltés: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Szakasz letöltés: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Letöltés: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s, Feltöltés: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +msgid " kB/s" +msgstr " kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Megosztva: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " fájl(ok), Várólistás kliensek száma: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Idő: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " IP címen " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Rendszer betöltési átlag (1-5-15 perc): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "A rendszer aktivitási ideje (uptime): " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02un %02uó %02uperc %02ump" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uó %02uperc %02ump" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02uperc %02ump" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02ump" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "HighID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "LowID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Nincs kapcsolódva" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +msgid "Cancelled !" +msgstr "Megszakítva !" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "%s-t nem lehet megnyitni" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "A(z) %s fájl túlságosan nagy a Donkey számára: max 4 GB engedélyezett." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Bemeneti paraméterek" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Fájl tördelőalgoritmizálása" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "URL(ek) hozzáadása ehhez a fájlhoz (nem kötelező)" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Itt azt a fájlt add meg, amelyikhez Ed2k hivatkozást akarsz generálni" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Itt azt az URL adja meg, amelyet az Ed2k hivatkozáshoz kíván hozzáadni: az " +"aLinkCreator a végén hozzáfűzi az adott fájlnevet" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Hozzáad" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Eltávolít" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Törlés" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Hivatkozás készítése rész-hash-ekkel" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Új és ritka fájlokat segít gyorsabban elterjeszteni megnövelt " +"hivatkozásméret segítségével" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "MD4 fájl hash" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "Ed2k fájl hash" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "Ed2k hivatkozás" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Indít" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Ment" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Másolás a vágólapra" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Kilépés" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Fájl megnyitása ed2k hivatkozás generálásához" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Generált ed2k hivatkozás másolása a vágólapra" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Generált ed2k hivatkozás mentése fájlba" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "aLinkCreator Névjegy" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Válaszd ki azt a fájlt, amelyikhez ed2k hivatkozást akarsz generálni" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "Nem került másolásra semmi !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Fájl kijelölése a generált ed2k hivatkozáshoz" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Nem lehet megnyitni" + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Kérlek, ne üres fájlnevet adj meg" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "Nem került mentésre semmi !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, az aMule ed2k hivatkozás generálója\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Grafika http://www.everaldo.com, http://www.icomania.com\n" +"és http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Tördelőalgoritmizálás..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Elkészült %.2f mp alatt" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "Ezt az URL-t már felvette a letöltési listába !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Kérlek, ne üres URL-t adj meg " + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "%u fájl számának feldolgozása: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "Rész-hash-eket kért (Csak 9.5 MB fájlméret fölött lehet használni)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Kis türelmet..." + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> Nem létező fájl !\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, az aMule ed2k hivatkozás-generálója" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Auto [Al]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Auto [No]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Auto [Ma]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Kapcsolódás" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Engedély kérése" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Kapcsolódás a kiszolgálón keresztül" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Várólista betelt" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "Várólistások" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Átvitel" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "HashSet fogadása" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Nincs hiányzó fájlrész" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Nem lehet alacsony ID-vel alacsony ID-hez kapcsolódni" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Túl sok a kapcsolat" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Kapcsolódás a Kad-on keresztül" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Túl sok Kad kapcsolat" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Kitiltott" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Kapcsolódási hiba" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Távoli várólista betelt" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "Régi MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "Új MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "eMule kompatibilis" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Helyi kiszolgáló" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Távoli kiszolgáló" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Forrás-csere" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Passzív" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Hivatkozás" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Mentett források" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Alapértelmezett" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Arab" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Baszk" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Bolgár" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Katalán" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Kínai (egyszerűsített)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Kínai (hagyományos)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Horvát" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "Cseh" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Dán" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Holland" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Angol (Egyesült Királyság)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Észt" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Finn" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Francia" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Gall" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Német" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "Görög" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Magyar" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Olasz" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Olasz (Svájci)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "Japán" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Koreai" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "Litván" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "Norvég (Nynorsk)" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Lengyel" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portugál" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Portugál (Brazíliai)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Orosz" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Szlovén" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Spanyol" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "Svéd" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Török" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Nem tudom meghatározni a kiválasztott böngészőt!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" +"A TCP port nem lehet magasabb 65532-nél, mert a kiszolgáló UDP port = TCP+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Alapértelmezett port lesz használva (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Kiszolgáló neve" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "IP-cím" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Port" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Leírás" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Felhasználók" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Fájlok" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Sikertelen" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Állandó" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Verzió" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Olyan kiszolgálót próbál törölni, amelyikhez csatlakozva van. Kérém először " +"válassza le. A kiszolgáló NEM került törlésre." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Infó" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(Ismeretlen név)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Biztos, hogy törlöd az állandó %s kiszolgálót" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Igen" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Nem" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Nem sikerült megnyitni a '%s'-t" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Kiszolgálók száma (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Kiszolgáló" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Kapcsolódás a kiszolgálóhoz" + +#: src/ServerListCtrl.cpp:428 +msgid "Mark server as static" +msgstr "Kiszolgáló megjelölése állandóként" + +#: src/ServerListCtrl.cpp:429 +msgid "Mark server as non-static" +msgstr "Kiszolgáló megjelölése nem állandóként" + +#: src/ServerListCtrl.cpp:431 +msgid "Mark servers as static" +msgstr "Kiszolgálók megjelölése állandóként" + +#: src/ServerListCtrl.cpp:432 +msgid "Mark servers as non-static" +msgstr "Kiszolgálók megjelölése nem állandóként" + +#: src/ServerListCtrl.cpp:438 +msgid "Remove server" +msgstr "Kiszolgáló eltávolítása" + +#: src/ServerListCtrl.cpp:440 +msgid "Remove servers" +msgstr "Kiszolgálók eltávolítása" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Összes kiszolgáló eltávolítása" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "ED2k link másolása a vágólapra" + +#: src/ServerListCtrl.cpp:449 +msgid "Copy ED2k links to clipboard" +msgstr "ED2k linkek másolása a vágólapra" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Újracsatlakozás a kiszolgálóhoz" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Biztos, hogy törlöd az összes kiszolgálót?" + +#: src/ServerListCtrl.cpp:570 +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Biztos, hogy törlöd a kiválasztott kiszolgálót?" + +#: src/ServerListCtrl.cpp:572 +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Biztos, hogy törlöd a kiválasztott kiszolgálókat?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Tiltva [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "Ez az aMule %s, az eMule alapján." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "%s-en fut" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "Új verzióért látogasd meg a http://www.amule.org oldalt." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Végzetes hiba: Időzítő létrehozása sikertelen" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "aMule távoli vezérlő" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Pillanatkép:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" +" 'Minden-platform' p2p ügyfél az eMule alapján \n" +"\n" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr " Honlap: http://www.amule.org \n" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr " Fórum: http://forum.amule.org \n" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" +" GYIK: http://wiki.amule.org\n" +"\n" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr " Kapcsolat: admin@amule.org (adminisztratív ügyek) \n" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr " Az aMule részben a következőn alapul: \n" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "Kademlia: Egyenrangú útvonal-megállapítás a XOR metrika alapján.\n" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr " Copyright (C) 2002 Petar Maymounkov\n" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr " http://kademlia.scs.cs.nyu.edu\n" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Üzenet" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Állapot" + +#: src/amuleDlg.cpp:666 +msgid "ED2K: Connecting" +msgstr "ED2K: Kapcsolódás" + +#: src/amuleDlg.cpp:670 +msgid "ED2K: Disconnected" +msgstr "ED2K: Leválasztva" + +#: src/amuleDlg.cpp:676 +msgid "Kad: Firewalled" +msgstr "Kad: Tűzfal mögött" + +#: src/amuleDlg.cpp:680 +msgid "Kad: Connected" +msgstr "Kad: Csatlakozva" + +#: src/amuleDlg.cpp:685 +msgid "Kad: Connecting" +msgstr "Kad: Kapcsolódás" + +#: src/amuleDlg.cpp:689 +msgid "Kad: Off" +msgstr "Kad: Nincs kapcsolat" + +#: src/amuleDlg.cpp:718 +msgid "Stop the current connection attempts" +msgstr "Aktuális kapcsolódási kísérletek leállítása" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Szétkapcsolás" + +#: src/amuleDlg.cpp:722 +msgid "Disconnect from the currently connected networks" +msgstr "Leválaszt az éppen kapcsolódott hálózatokról." + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Kapcsolatfelvétel" + +#: src/amuleDlg.cpp:726 +msgid "Connect to the currently enabled networks" +msgstr "Kapcsolódás a pillanatnyilag engedélyezett hálózatokhoz." + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Fel: %.1f(%.1f) | Le: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Fel: %.1f | Le: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | Kapcsolódva)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | Nincs kapcsolat)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Biztos, hogy ki akarsz lépni az aMule-ból?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Kilépés megerősítése" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Nem tudom megállapítani a parancsot a böngésző futtatásához." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "A(z) '%s' felület könyvtár nem létezik" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "Figyelem: Nem tudom a '%s' felület fájlt olvasásra megnyitni" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Hálózatok" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Hálózatok ablaka" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Keresések" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Keresés ablaka" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Átvitelek" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Fájlátvitel ablaka" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Megosztott fájlok ablaka" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Üzenetek" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Üzenetek ablaka" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Statisztikák" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Statisztikai grafikonok ablaka" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Tulajdonságok beállításának ablaka" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Importálás" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "A részfájl importáló eszköz" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "Névjegy" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "Névjegy/Súgó" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Általános" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Csatlakozás" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Proxy" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Üzenetszűrő" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Távoli elérés" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Online aláírás" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Mappák" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Biztonság" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "Gui finomhangolások" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Alapvető finomhangolások" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Események" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Hibakeresés" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Felhasználó által megadott" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"Újra kell indítani az aMule-t, hogy az alábbi változás(ok) érvénybe lépjen" +"(ek):\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- TCP port megváltozott.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- UDP port megváltozott.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"Az automatikusan frissített kiszolgáló lista üres.\n" +"'A kiszolgáló lista automatikus frissítése induláskor' letiltásra kerül." + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"Engedélyezted a távoli elérést, de nem adtál meg jelszót.\n" +"A távoli elérés nem használható érvényes jelszó nélkül." + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- Nyelv megváltozott.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- Ideiglenes mappa megváltozott.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Fel: 0.0 | Le: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"Az ED2K és a Kad hálózat is le van tiltva.\n" +"Nem fogsz tudni kapcsolódni, amíg legalább az egyiket nem engedélyezed." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"A Kad nem fog elindulni, ha az UDP portod le van tiltva.\n" +"Engedélyezd az UDP portot vagy tiltsd le a Kad-ot." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"Most újra KELL indítanod az aMule-t.\n" +"Ha nem indítod újra most, ne panaszkodj, ha bármi rossz történik.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "FIGYELEM" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"Az automatikusan frissített kiszolgáló lista üres.\n" +"Kérlek adj meg legalább egy URL-t, ami érvényes server.met fájlra mutat .\n" +"Az URL megadásához klikkelj a \"Lista\" gombra ezen checkbox mellett." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "az Ideiglenes fájloknak" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Bejövő fájlok" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "az Online aláírásnak" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Válassz egy mappát a %s-nek" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Wav fájlok böngészése" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "wav fájl (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Böngészés a videolejátszóhoz" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Válaszd ki a böngésződet" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Futtatható%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Kiszolgáló lista szerkesztése" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"URL-ek felvétele a server.met fájl letöltéséhez.\n" +"Egy sorba csak egy URL." + +#: src/PrefsUnifiedDlg.cpp:980 +#, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Frissítés késleltetése: %d másodperc" + +#: src/PrefsUnifiedDlg.cpp:987 +#, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Grafikon átlagos ideje: %d perc" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Kapcsolatok grafikon-skálája: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Frissítés késleltetése: %d másodperc" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Fájl buffer méret: %d bájt" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Feltöltési várólista nagysága: %d kliens" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Kiszolgáló kapcsolat frissítési gyakorisága: %d perc" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Kiszolgáló kapcsolat frissítési gyakorisága: Tiltva" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Parancs végrehajtása a(z) '%s' eseménynél" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "A következő változók lesznek behelyettesítve:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Jogosulatlan hozzáférési kísérlet. Kapcsolat lezárva." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Külső kapcsolat lezárva." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "A külső kapcsolatok letiltásra kerültek üres jelszó miatt!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "A külső kapcsolatok le vannak tiltva konfig fájlban" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Új külső kapcsolat elfogadva" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "Hiba: új külső kapcsolat elutasítva " + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "Külső kapcsolat elutasítva, üres jelszó a beállításokban!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "Kapcsolódó kliens: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Ismeretlen verzió" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"Helytelen EC verzió azonosító, összeférhetetlenség lehetséges. A fő- és a " +"távoli programot ugyanabból a pillanatképből használd." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "Hitelesítés sikertelen." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Érvénytelen protokoll verzió." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Hiányzó protokoll verzió azonosító." + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Érvénytelen kérés, először hitelesítened kellene." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Hozzáférés elfogadva." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "Távoli PartFile parancs sikertelen: nem található FileHash: %s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "FileHash nem található: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "Hoppá! Opkód feldolgozási hiba!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Kiszolgáló nem lett hozzáadva" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "kiszolgáló nem található: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "ki kell jelölnöd a kiszolgálót az eltávolításhoz" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "Az ED2K le van tiltva a beállításokban." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "Keresés folyamatban. Kérdezze le az eredményeket egy rövid idő múlva!" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "Webes keresésnek a távoli felületről nincs értelme." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "A Kad le van tiltva a beállításokban." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Nincsenek pontok a grafikonhoz." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "A kliensed nincs beállítva ehhez a részletességi szinthez." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "ExternalConn: leállítás kérve" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Kikapcsolás folyamatban." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "ExternalConn: hivatkozás hozzáadása: '%s'." + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Érvénytelen hivatkozás, vagy már rajta van a listán." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "Fájl nem található." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Érvénytelen fájl név." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Nem tudom átnevezni a fájlt." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Már kapcsolódva az ED2K-hoz." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Kapcsolódás az ED2K-hoz..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Már kapcsolódva a Kad-hoz." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Kapcsolódás a Kad-hoz..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Minden hálózat le van tiltva." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Leválasztva az ED2K-ról." + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Leválasztva a Kad-ról." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "ExternalConn: érvénytelen opcode fogadva: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "Érvénytelen opcode (rossz protokoll verzió?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" +"Nem sikerült megnyitni a fájlt (%s), eltávolítom a megosztott fájlok " +"listájáról." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "Hash-készlet kérés az ismeretlen %s fájlhoz" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "A parancs `%s' (pid=%d) befejeződött `%d' állapotkóddal." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "Kiszolgáló nem lett hozzáadva: IP vagy host név nincs megadva." + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "Kiszolgáló nem lett hozzáadva: Érvénytelen kiszolgáló-port." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "ED2K állapot:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Csatlakozva" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Port" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Kademlia állapot:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Fut" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Állapot:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Leválasztva" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Kapcsolat állapota:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Tűzfal mögött" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "OK" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Tűzfal állapot: " + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Pajtáshoz kapcsolódva" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "Nincs pajtás" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Átlagos felhasználószám:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "Átlagos fájlszám:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "nem fut" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Aktivitási idő: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Átvitel" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Feltöltések" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Feltöltött adatok (folyamat (összesen)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Összes többletterhelés (csomagok): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Fájlkérés többletterhelése (csomagok): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "Forrásváltás többletterhelése (csomagok): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Kiszolgáló többletterhelése (csomagok): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Kad többletterhelés (csomagok): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Aktív feltöltések: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Várakozó feltöltések: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Összes sikeres feltöltési folyamat: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Összes sikertelen feltöltési folyamat: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Átlagos feltöltési idő: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Letöltések" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Letöltött adatok (folyamat (összesen)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Forrás találatok: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Aktív letöltések száma (adatelemek): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Fel:Le töltési folyamat aránya (összesen): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Átlagos letöltési arány (folyamat): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Átlagos feltöltési arány (folyamat): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Max letöltési arány (folyamat): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Max feltöltési arány (folyamat): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Újrakapcsolódások: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Első átvitel óta eltelt idő: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Kiszolgálóhoz kapcsolódva: %s óta" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Aktív kapcsolatok száma (becsült): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Max kapcsolódási korlát elérve: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Kapcsolatok átlagos száma (becsült): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Legtöbb kapcsolat (becsült): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Kliensek" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Kiszűrve" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Összesen: %i Ismert: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Kiszolgálók" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Működő kiszolgálók: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Sikertelen kiszolgálók: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Összes: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Törölt kiszolgálók: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Kiszűrt kiszolgálók: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Felhasználók száma a működő kiszolgálókon: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "Fájlok a működő kiszolgálókon: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Összes felhasználó: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "Összes fájl: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Kiszolgáló leterheltség: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Megosztott fájlok száma: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Megosztott fájlok teljes mérete: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Átlagos fájlméret: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "LowID: %u (%.2f%% Összesen %2f%% Ismert)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "SecIdent Be/Ki: %u (%.2f%%) : %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Operációs rendszer" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "Nem fogadott" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Kivágás" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Másolás" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Beillesztés" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Mindent kijelöl" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "Kad keresést nem lehet végrehajtani ha a Kad nem fut" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "ED2K keresést nem lehet végrehajtani ha az ED2K nincs kapcsolódva" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Nem várt hiba amíg a Kad kereséssel próbálkoztam: " + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "Üzenet kiszűrve '%s'-től (IP:%s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "Új üzenet '%s'-től (IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" +"A(z) %s (%u) felhasználó lekérdezte a megosztott fájlok listáját -> Elfogadva" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" +"A(z) %s (%u) felhasználó lekérdezte a megosztott fájlok listáját -> " +"Megtagadva" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" +"A(z) %s (%u) felhasználó lekérdezte megosztott könyvtáraid listáját -> " +"Elfogadva" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" +"A(z) %s (%u) felhasználó lekérdezte megosztott könyvtáraid listáját -> " +"Megtagadva" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"A(z) %s (%u) felhasználó lekérdezte a megosztott fájlok listáját a %s " +"könyvtárban -> elfogadva" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"A(z) %s (%u) felhasználó lekérdezte a megosztott fájljok listáját a %s " +"könyvtárban -> megtagadva" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "A(z) %s (%u) felhasználó megosztja a %s könyvtárat" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "A(z) %s (%u) felhasználó kéretlen megosztott könyvtárakat küldött." + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" +"A(z) %s (%u) felhasználó elküldte megosztott fájljok listáját a %s " +"könyvtárhoz" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "" +"A(z) %s (%u) felhasználó befejezte megosztottfájl-listájának elküldését" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "A(z) %s (%u) felhasználó kéretlen megosztottfájl-listát küldött" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" +"A(z) %s (%u) felhasználó megtagadta a megosztott könytár/fájl listájához " +"történő hozzáférést" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Csomópontok (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "Érvénytelen IP a rendszerindításhoz" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Érvénytelen port a rendszerindításhoz" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Kérlek töltsd ki az összes kötelező mezőt" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Biztos, hogy le akarsz tölteni egy új nodes.dat fájlt?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" +"Ezzel eltávolítod az aktuális csomópontokat és újraindul a Kademlia " +"kapcsolat." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Folytassuk?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Hiba: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Figyelem: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Barát hozzáadása" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Érvényes IP címet és portot kell megadnod!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Információ" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "A megadott felhasználói azonosító (userhash) érvénytelen!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Források" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Fájl" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Letöltés" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Kategória" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Alap" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Letöltés kategóriába" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "Kapcsolódó fájlok keresése (ED2K, helyi kiszolgáló)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "Ismertként megjelölés" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Kapcsolódás a távoli aMule-hez" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Kapcsolódás sikertelen " + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Hiba" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"FIGYELEM: Nem adhatod magad forrásként egy ed2k hivatkozáshoz amíg alacsony " +"azonosítójú (lowid) vagy." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Felhasználók: E: %s K: %s | Fájlok: E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Mind" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Összes felhasználó: %s | Összes fájl: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Átmásolva" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Befejezett" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Sebesség" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Folyamatjelző" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Állapot" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Hátralévő idő" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Utoljára teljesnek látott" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Utoljára fogadott" + +#: src/DownloadListCtrl.cpp:578 +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Biztos, hogy törlöd a kiválasztott fájlt?" + +#: src/DownloadListCtrl.cpp:580 +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Biztos, hogy törlöd a kiválasztott fájlokat?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Üzenet küldése ennek a személynek" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Küldendő üzenet:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Állj" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Szüneteltet" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Folytatás" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "Befejezettek &eltávolítása" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Összes A4AF cseréje ehhez a fájhoz most" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Összes A4AF cseréje ehhez a fájhoz most (Automatikusan)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Összes A4AF cseréje a többi fájhoz most" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Kibővített beállítások" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Előnézet" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Fájl &részleteinek megjelenítése" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Összes megjegyzés megjelenítése" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Magnet URI másolása a vágólapra" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "hozzárendelés megszüntetése" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Hozzárendelés kategórához" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "Fájl &megnyitása" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Eltávolítás a barátok közül" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Hozzáadás a barátokhoz" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Üzenet küldése" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Csere ehhez a fájlhoz" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y.%m.%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "QR: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Másik fájl kérve" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Letöltések (%i)" + +#: src/DownloadListCtrl.cpp:2222 +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"Állítsd be a kedvenc videolejátszódat a beállításoknál.\n" +"Addig is, az aMule az mplayer-t fogja megpróbálni használni, és minden " +"előnézetnél megkapod ezt a figyelmeztetést." + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Fájl előnézet" + +#: src/DownloadListCtrl.cpp:2260 +#, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "HIBA: Külső média-lejátszó indítása sikertelen! Parancs: `%s'" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "HIBA: Hiba a részfájl megnyitásánál)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "HIBA: Részfájl létrehozása sikertelen)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "Megpróbálom betölteni a met-fájl biztonsági másolatát a %s-ből" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "Hiba: A part.met fájl megnyitása sikertelen: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "Hiba: part.met fájl 0 méretű: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "Hiba: Érvénytelen part.met fájlverzió: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" +"Hiba: %s (%s) sérült (rossz tag szám), a fájl betöltése nem lehetséges." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "Fájl infó helyreállításának megkísérlése..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" +"Névtelen fájl helyreállítása - helyreállítás megkísérlése RecoveredFile.dat " +"néven" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" +"Összes elérhető fájl infó helyreállítva :D - használatának megkísérlése..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Fájl infó helyreállítása nem lehetséges :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "A(z) %s (%s) megnyitása sikertelen" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "Figyelmeztetés: %s lehet, hogy sérült (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "HIBA a fájlrész mentésénél: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "'%s' valahogy 0 méretű - a %s fájlt használom." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "A %s. part.met.seeds fájl mentése sikertelen" + +#: src/PartFile.cpp:1019 +#, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "%i forrás elmentve a részfájlnak: %s (%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "A(z) %s (%s) részfájlnak nincs seeds fájlja" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "A(z) %s (%s) részfájlnak üres a seeds fájlja" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "Hiba a részfájl forrás-fájljának olvasása közben (%s - %s): %s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"Sérült részt (%d) találtam a %d részű %s fájlban - FileResultHash |%s| " +"FileHash |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "(%i) befejezett fájlrészt találtam a(z) %s fájlban" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "%s újra algoritmizálása befejeződött" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "Váratlan fájlhiba %s fájl befejezésénél. Fájl szüneteltetve" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Letöltés befejeződött: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "Fájl törlése: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" +"Figyelmeztetés: A letöltött rész hash-elése nem lehetséges - a hash készlet " +"hiányos '%s'-hez" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"Hiba: A letetöltött rész hash algoritmizálása nem lehetséges - HashSet " +"hiányos (%s). Ennek sosem kéne előfordulnia" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "FIGYELEM: Nincs elég szabad hely a lemezen! Fájl szüneteltetése: %s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "A %i. letöltött fájlrész sérült a %s fájlban" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH: %i. sérült rész helyreállítva a '%s'-hez -> megmentett bájtok: %s" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Elégtelen lemezterület" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Megállítva" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "Figyelem: a known.met fájlt nem lehet megnyitni." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" +"Figyelem: Az ismert fájlok listája sérült, érvénytelen fejlécet tartalmaz." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "IO hiba a known.met fájl olvasása közben: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "Hiba a known.met fájl mentése közben: %s" + +#: src/SharedFileList.cpp:352 +#, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "%i ismert megosztott fájlt találtam" + +#: src/SharedFileList.cpp:358 +#, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "%i ismert és %i ismeretlen megosztott fájlt találtam" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "HIBA: %s megosztása megkísérelve" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Fájl megjegyzés" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Értékelés" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Megjegyzés" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Nincs megjegyzés" + +#: src/CommentDialogLst.cpp:104 +#, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%u megjegyzés" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"Az összes felsorolt zavart kiszolgálóval sikertelen a kapcsolatfelvétel. " +"Újra próbálkozom zavarás nélkül." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "" +"Az összes felsorolt kiszolgálóval történő kapcsolatfelvétel sikertelen. Újra " +"próbálkozom." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "Az ED2K hálózat le van tiltva a beállításokban, nem kapcsolódom." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "" +"Nem találtam érvényes kiszolgálót a kiszolgáló-listában, amihez kapcsolódni " +"lehetne" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Kapcsolódva %s-hez (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Kapcsolat létrejött a %s-vel" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"Végzetes hiba kapcsolatfelvétel közben. Lehet, hogy megszakadt az Internet " +"kapcsolat" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Megszakadt a kapcsolat %s-vel (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "A %s (%s:%i) halottnak tűnik." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "A %s (%s:%i) úgy látszik megtelt." + +#: src/ServerConnect.cpp:391 +#, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "Automatikus kapcsolódás a kiszolgálóhoz %d másodperc múlva" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Kapcsolat megszakadt" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "Kapcsolódás %s-hez (%s:%i) sikertelen." + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "Hiba: Érvénytelen socket időtúllépési ellenőrzésnél" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "Kapcsolódási kísérlet %s-hez (%s:%i): időtúllépés." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Nem található .part fájl" + +#: src/DownloadQueue.cpp:175 +#, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "%u .part fájlt találtam" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Letöltés %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Már megkísérelted a(z) '%s' fájlt letölteni" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Már megvan ez a fájl: '%s'" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Már próbálod letölteni a(z) '%s' fájlt." + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "A következő magnet hivatkozást nem tudom ed2k-ra konvertálni: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "A következő hivatkozás protokollja ismeretlen: %s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Érvénytelen ed2k hivatkozás! Hiba: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "Végrehajtja az -t és kilép." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Érvénytelen IP cím formátum. Így használd: xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" +"Ez a parancs argumentumot igényel. Érvényes argumentumok: 'all', fájlnév " +"vagy egy szám.\n" + +#: src/TextClient.cpp:343 +msgid "Processing by hash: " +msgstr "" + +#: src/TextClient.cpp:358 +msgid "Processing by filename: " +msgstr "" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" +"Ennek a parancsnak szüksége van egy argumentumra. Érvényes argumentumok: egy " +"fájl hash.\n" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Érvénytelen szám\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "Nem érvényes hash (a hossza pontosan 32 karakter kell legyen)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "A művelet sikeres volt." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "A kérés sikertelen volt a következő hibával: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "Kliens IP szűrés %s van kapcsolva.\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "KI" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "BE" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "Kiszolgáló IP szűrés %s van kapcsolva.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "IP szűrő szintje jelenleg %d.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Sávszélesség korlátok: Fel: %u kB/s, Le: %u kB/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Kapcsolódva %s-hez %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "LowID-val" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "HighID-val" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Kapcsolódás folyamatban" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Nincs kapcsolódva" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Letöltés:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Feltöltés:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Várólistás kliensek száma:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Összes forrás:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Keresés eredményeinek száma: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "Tennivaló - keresés állapotának megjelenítése" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Ismeretlen válasz érkezett a kiszolgálótól, OpCode = %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Rövid állapot információ megjelenítése." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "" +"Megjeleníti a kapcsolat állapotát, aktuális fel/letöltési sebességet, stb.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Megjeleníti a teljes statisztika fát." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "Az aMule leállítása." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Leállítja a távoli futó főprogramot (amule/amuled).\n" +"Ez a szöveges klienst is leállítja, mivel az használhatatlan futó főprogram\n" +"nélkül.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Újratölti a megadott objektumot." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "A megosztott fájlok listáját frissíti." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "IP szűrő tábla újratöltése fájlból." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Kapcsolódás a hálózathoz." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Kapcsolódás csak az ED2K-hoz." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Kapcsolódás csak a Kad-hoz." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Leválaszt a hálózatról." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "Ez leválaszt minden jelenleg kapcsolódott hálózatról.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Csak az ED2K-ról választ le." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Csak a Kad-ról választ le." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Egy ed2k vagy magnet hivatkozást ad át a főprogramnak." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Beállítások megváltozatása." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "IP szűrő beállítások módosítása." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "IP szűrés bekapcsolása mind a kliensek, mind a kiszolgálók részére." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "IP szűrés kikapcsolása mind a kliensek, mind a kiszolgálók részére." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "Engedélyezi/Letiltja a kliensek IP szűrését." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "Kliens IP szűrés bekapcsolása." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "Kliens IP szűrés kikapcsolása." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "Engedélyezi/Letiltja a kiszolgálók IP szűrését." + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "Kiszolgáló IP szűrés bekapcsolása." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "Kiszolgáló IP szűrés kikapcsolása." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "IP szűrési szint kiválasztása." + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"Az érvényes szűrési szintek a 0-255 tartományban vannak, és az " +"alapértelmezett\n" +"értéke 127.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Sávszélességi korlátok beállítása." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "Az ezeknek a parancsoknak adott érték kilobájt/mp-ben kell legyen.\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Feltöltési sávszélesség beállítása." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "Letöltési sávszélesség beállítása." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Beállítási értékek megjelenítése." + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "IP szűrő beállítások megjelenítése." + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "Az IP szűrő állapotának lekérdezése ügyfelekre és kiszolgálókra." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "IP szűrő állapotának megjelenítése csak ügyfelekre." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "IP szűrő állapotának megjelenítése csak kiszolgálókra." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "IP szűrő szintjének megjelenítése." + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Sávszélességi korlátok megtekintése." + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Keresést végez." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"A keresés típusát meg kell adni:\n" +" GLOBAL (globális)\n" +" LOCAL (helyi)\n" +" KAD (kad)\n" +"Például: 'search kad fájl' egy kad keresést fog indítani a \"fájl\"-ra.\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Globális keresést végez." + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Helyi keresést végez." + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Keresés a Kad hálózaton." + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Az utolsó keresés eredményeinek megjelenítése." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Az előző keresés eredményeit adja vissza.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "Egy keresés állapotát jeleníti meg." + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "Egy keresés állapotát jeleníti meg.\n" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Fájl letöltése." + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"Az utolsó keresésből a fájl sorszámát kell megadni.\n" +"Pl: 'download 12' az előző keresésből a 12-es sorszámú fájlt fogja " +"letölteni.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Letöltés szüneteltetése." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Letöltés folytatása." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Letöltés megszakítása." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Letöltési prioritás beállítása." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "Alacsony, normál, magas vagy automatikus prioritást állít be.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "Alacsony prioritás beállítása." + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "Normál prioritás beállítása." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "Magas prioritás beállítása." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "Automatikus prioritás beállítása." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Várósorok/listák megmutatása." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Megjeleníti a feltöltési/letöltési várósort, kiszolgáló listát vagy a " +"megosztott fájlok listáját.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Feltöltési várósor megmutatása." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Letöltési várósor megmutatása." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Napló megjelenítése." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Kiszolgáló-lista megmutatása." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Napló törlése." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "Elavult parancs, most '%s'." + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" +"Ez egy elavult parancs és a jövőben eltávolításra kerülhet.\n" +"Használd a '%s'-t helyette.\n" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() NULL-t adott vissza" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "Hiba: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "Figyelmeztetés: %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Az új ügyfélazonosító %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "\tLegvalószínűbb oka az lehet, hogy tűzfal vagy router mögött vagy." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "" +"\tTovábbi információért, kérlek látogasd meg a http://wiki.amule.org-ot" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "Ismeretlen kiszolgáló infó fogadva! - túl rövid" + +#: src/ServerSocket.cpp:539 +#, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "%d új kiszolgáló fogadva" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Kiszolgáló-lista mentése kész." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "A kiszolgáló visszautasította az utolsó parancsot" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Hibás csomag érkezett a kiszolgálótól: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "Kezeletlen hiba a kiszolgálóról történő adatok feldolgozásánál: %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "A DNS feloldó szálat nem lehet létrehozni a %s-hez való kapcsolódáshoz" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "A %s IP-jű kiszolgáló (%s) ki van szűrve. Nem kapcsolódom." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "protokoll zavarással." + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "Kapcsolódás %s-hez (%s - %s:%i) %s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "Nem tudom a DNS-t feloldani a %s kiszolgálóhoz: Nem tudok kapcsolódni!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "" +"CIP2Country::CIP2Country(): Sikertelen az ország adatok beolvasása innen: " + +#: src/IP2Country.cpp:73 +#, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "%d zászló kép betöltve." + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"Biztos benne, hogy megszakítja a letöltéseket és töröl minden fájlt ebből a " +"kategóriából?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Megerősítés szükséges" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Összes egyéb" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Befejezetlen" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Aktív" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Film" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Zene" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Archívált" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "CD-Image" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Képek" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Szöveg" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Válassz nézetet" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Új kategória" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Kategória szerkesztése" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Kategória törlése" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "%s importálása: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "Ideiglenes mappa olvasása" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "Alapvető információk megszerzése a letöltési infó fájlból" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "Célfájl létrehozása" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "Adat töltése a régi letöltési fájlból (%u a(z) %u-ből)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "Adat blokk mentése az új letöltési fájlba (%u a(z) %u-ből)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "Forrás letöltési fájl információ megszerzése" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "Új letöltés hozzáadása és az új részfájl mentése" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Állapot gyűjtése..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "Folyamatban" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Hiba: Elfogyott a lemezterület" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Hiba: partmet nem található" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Hiba: IO hiba!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Hiba: Sikertelen!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "Várólistán" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Letöltés alatt" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Ismeretlen vagy rossz ideiglenes-fájl formátum." + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Fájl név" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Állapot" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Fájl Hash" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Részfájlok importálása" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"Válassz egy mappát ahol ideiglenes letöltéseket fogok keresni! (az " +"almappákban is)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "Töröljem a sikeresen importált letöltések forrásait?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Források eltávolítása?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Várakozás..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (Lemezen: %s)" + +#: src/OtherFunctions.cpp:121 +msgid "byte" +msgid_plural "bytes" +msgstr[0] "bájt" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "bájt/mp" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/mp" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "mp" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "perc" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "óra" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "nap" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Filmek" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Archívált fájlok" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Dokumentumok" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programok" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Akármelyik" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Nincs értékelve" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Érvénytelen / Sérült / Hamis" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Gyenge" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Korrekt" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Jó" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Kitűnő" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "mind" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "összes egyéb" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "IP-szűrők 'ipfilter.dat' és 'ipfilter_static.dat' betöltése." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "ipfilter.dat fájl '%s' betöltése sikertelen, ismeretlen formátum." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "ipfilter.dat fájl '%s' betöltése sikertelen, nem nyitható meg a fájl." + +#: src/IPFilter.cpp:330 +#, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "%u IP-tartomány '%s'-ból betöltve." + +#: src/IPFilter.cpp:332 +#, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "%u hibás sor lett eldobva." + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Aktív kapcsolatok (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Fájl részletei" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% kész" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "ED2K hivatkozás: " + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Végrehajt" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" +"Kattints ide ed2k hivatkozás felvételéhez a letöltési várólistádhoz történő " +"szövegellenőrzésben." + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "Állapot felugró ablakban" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Betöltés..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"Itt kerülnek megjelenítésre az események. A kiszolgáló-fülön lévő napló a " +"komplett eseménylistának felel meg." + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Felhasználók száma azon a kiszolgálón, amelyre kapcsolódott ..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Felhasználók: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" +"Felhasználó van kapcsolódva az aktuális kiszolgálóhoz és egy becslés az " +"összes felhasználó számát illetően." + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"Aktuális feltöltési és letöltési arány átlaga. Ha engedélyezed, kapcsos " +"zárójelben jeleníti meg a kliens-kommunikáció többletterhelését." + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"A kapcsolat állapotát és az aktív adatátviteleket jelzi ki. A piros nyilak " +"azt jelentik, hogy jelenleg nem vagy kapcsolatban, a sárga nyilak, hogy " +"alacsony ID-d van (tűzfali) és a zöld nyilak pedig, hogy magas ID-d van " +"(optimális kapcsolódási típus)." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Nincs csatlakozva ..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Jelenleg csatlakozott kiszolgáló." + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Keresés" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Név:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Helyi" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Globális" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "FileHash" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Kibővített paraméterek" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Szűrés" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Fájltípus" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Kiterjesztés" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Min. méret" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "bájt" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Max. méret" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Elérhetőség" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Szűrő:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Eredmények szűrése" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Eredmény megfordítása" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Ismert fájlok elrejtése" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Több" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "Több találatot keres az ED2K-n. Kad-on még nem támogatott." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Leállít" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Mezők törlése" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Eredmények" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Befejeződött letöltések törlése" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Feltöltési lista / Várólista megjelenítése" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Várólistás kliensek száma :" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Küldés" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Megadott üzenet küldése." + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Bezár" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Csevegési folyamat bezárása." + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Teljes név :" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "N/A" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "met-fájl :" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Tördelőalgoritmus (hash) :" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Fájlméret :" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Fájlrész állapot :" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Utoljára teljesnek látott :" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Forrás találatok :" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Átviteli források :" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Fájlrész-számláló :" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Elérhető :" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Adatráta :" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Aktív letöltési idő: " + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Átmásolva :" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Teljes méret :" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Intelligens Sérülés Kezelés" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Sérülés miatt elveszett :" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Tömörítéssel nyert :" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "I.S.K.-val megmentett csomagok :" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Fájl nevek" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Átvétel" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Kitisztítás" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Alkalmaz" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Ok" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "" +"Megjegyzés/Értékelés ehhez a fájlhoz (ezt az összes felhasználó látni fogja)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"Megadhatod egy film hosszát, történetét, nyelvét ...\n" +"és ha a fájl hamisítvány, akkor elmondhatod ezt a többi aMule felhasználónak." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Fájl minősítése" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" +"Értékeld a fájlt minőségét vagy adj tanácsot a többi felhasználónak, ha a " +"fájl érvénytelen ..." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Nincs megjegyzés(ek)" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Frissít" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Letöltés folyamatban, kis türelmet ..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Ismeretlen méret" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Kötelező adatok" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "IP-cím :" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Port :" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Kiegészítő adatok" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "User név :" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Userhash :" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Megosztott fájlok frissítése" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Aktuális folyamat" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Összesen" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Lekérdezve :" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Aktív feltöltések száma :" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Letöltési sebesség" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Aktuális" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Futásátlag" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Munkafolyamatok átlaga" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Feltöltési sebesség" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Kapcsolatok" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Aktív letöltések" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Aktív kapcsolatok (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Aktív feltöltések" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Statisztika Fa" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Felhasználó neve:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Felhasználói hash:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Kliensszoftver:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Kliensverzió:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "IP-cím:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "Felhasználó ID:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "Kiszolgáló IP:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Kiszolgáló neve:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "Átvitel a kliensnek" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Aktuális kérés:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Átlagos feltöltési arány:" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Átlagos letöltési arány:" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Feltöltve (ebben a szakaszban):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Letöltve (ebben a szakaszban):" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Feltöltve (összesen):" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Letöltve (összesen):" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Eredmények" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "Le/Fel módosító:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Biztonsági azonosító:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Értékelés (összes):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Feltöltési várólista pontszám:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Általános beállítások" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Becenév" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - a linuxos Mule" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "" +"Ezt a nevet fogja a többi felhasználó látni, amikor kapcsolódnak hozzád." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Nyelv" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "Ez határozza meg a nyelvet, amelyet az irányításhoz használ." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Egyéb beállítások" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Indításkor új verzió keresése" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "Engedélyezve indításnál az aMule új verziót fog keresni." + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Indítás minimalizálva" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "Engedélyezve indításnál minimalizálni fogja magát az aMule." + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Figyelmeztetés kilépéskor" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "Figyelmeztessen az aMule bezárása előtt." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Tálca ikon engedélyezése" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "Ez engedélyezi/tiltja a tálca ikont." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Tooltip késleltetése mp-ben" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "Késleltetés a tool-tippek előtt." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Böngésző kiválasztása" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Válaszd ki a böngésződet" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Böngésző beállítása:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Itt add meg a böngésződ nevét. Egyéni böngésző esetén, válaszd az Egyéni " +"menüelemet a lenyíló menü felett." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Megnyitás új fülön, ha lehetséges" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "Weboldal megnyitása új ablakban, ha lehetséges" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Sávszélességi korlátok" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Feltöltés" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Slot kiosztás" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Sávok kapacitása" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Szabvány kliens TCP port:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "Ez a szabvány ED2K port és nem tiltható le." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Bővített kliens UDP port:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" +"Ez az UDP port bővített ED2K kérésekhez és a Kad hálózathoz használatos" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "letilt" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Kötési cím" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "UDP port a bővített kiszolgáló kéréseknek (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Max forrás / fájl" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Felső korlát" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Kapcsolódási korlát" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Max kapcsolatok" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Universal Plug and Play" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "UPnP engedélyezése" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "UPnP TCP Port:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Automatikus kapcsolódás induláskor" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Kapcsolódás megismétlése megszakadt kapcsolat esetén" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Sávszélesség többletterhelésének mutatása" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Kiszolgáló beállításai" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Halott kiszolgálók eltávolítása" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "próbálkozás után" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Kiszolgáló lista automatikus frissítése induláskor" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Lista" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Kiszolgáló lista frissítése a kiszolgálóhoz történő kapcsolódáskor" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Kiszolgáló lista frissítése klienshez történő kapcsolódáskor" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Prioritási rendszer használata" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Intelligens LowID ellenőrző használata kapcsolódáskor" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Biztonságos kapcsolódás" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Automatikus kapcsolódás kizárólag az állandó kiszolgálókhoz" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "A kézileg hozzáadott kiszolgálók Magas Prioritással történő felvétele" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "I.C.H. aktív" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICH bízzon meg minden hash-ben (nem ajánlott)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Fájlok felvétele szüneteltetett módban" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Új letöltések felvétele automatikus prioritással" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Előszőr az első és utolsó adatelemet próbálja meg letölteni" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Új megosztott fájl felvétele automatikus prioritással" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Próbálj meg teljes adatelemet feltölteni" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "" +"Következő szüneteltetett fájl indítása, ha egy fájl letöltése befejeződött" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "Ugyanabból a kategóriából" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "Mentsen el 10 forrást ritka fájloknál (< 20 forrás)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Szabad lemezterület" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Szabad lemezterület ellenőrzése" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "" +"Jelöld be, ha szeretnéd, hogy az aMule ellenőrízze a szabad lemezterületedet" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Minimális lemezterület:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Add meg a kívánt min. szabad lemezterületet." + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Bejövő Mappa :" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Ideiglenes Mappa :" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Megosztott könyvtárak" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "(Jobb klikk az mappa ikonra az összes alatta levő mappát is megosztja)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Rejtett fájlok megosztása" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Videólejátszó" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Készítsen biztonsági másolatot előnézethez" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Grafikonok" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Frissítés késleltetés: 5 mp" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Grafikon átlagos ideje: 100 perc" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Kapcsolatok grafikon skálája: 100" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Válaszd ki a statisztikák színeit" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Háttér" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Rács" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Aktuális letöltés" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Letöltési futás átlaga" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Letöltési folyamatok átlaga" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Aktuális feltöltés" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Feltöltési futás átlaga" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Feltöltési folyamatok átlaga" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Aktív kapcsolatok" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Sebességmérő a rendszertálcán" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Kad-csomópontok aktuális" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Kad-csomópontok futó" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Kad-csomópontok folyamat" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Kiválaszt" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Megjelenített ügyfél verziók száma (0=mind)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Üzenetek" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Felugró üzenetek" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Hang használata" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Felugró üzenet :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Új Napló bejegyzéskor" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Új csevegés indításakor" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Új chat üzenet érkezésekor" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Letöltés hozzáadásakor vagy befejezezésekor" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Új aMule verzió észlelésekor" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "Sürgős OOD, a kiszolgálókapcsolat megszakadt" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Értesítés e-mail-ben" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Email küldése, ha a letöltés befejeződött." + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "SMTP kiszolgáló :" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "E-mail cím :" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! FIGYELEM !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Ne változtasd meg ezeket a beállításokat, csak akkor,\n" +"ha tudod, mit csinálsz, ellenkező esetben könnyen\n" +"elronthatod a dolgokat.\n" +"\n" +"Ezen beállítások módosítása nélkül is remekül fog\n" +"működni az aMule." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Haladó beállítások" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Max új kapcsolat / 5 mp" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Fájl buffer méret: 240000 bájt" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Feltöltők várólistájának nagysága: 5000 kliens" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Kiszolgáló kapcsolat frissítési gyakorisága: Tiltva" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "Gui finomhangolások" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Letöltési folyamatjelző" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Százalék megjelenítése" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Folyamatjelző megjelenítése" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Folyamatjelző stílus" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Lapos" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Gömbölyű" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Téma támogatás" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Felület támogatás engedélyezése" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Felület:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- nincs elérhető felület -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Oszlop rendezés" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "Automatikus rendezése a fájloknak a letöltési listában (erős CPU)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "" +"Az aMule automatikusan rendezni fogja az oszlopokat a letöltési listádban" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Egyéb Gui finomhagolások" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Gyors ED2K linkkezelő mutatása" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Kibővített infók megjelenítése a kategória füleken" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Átviteli ráták megjelenítése a címsorban" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Függőleges eszköztár elrendezés" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Mutassa a részfájl számát a neve előtt" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Távoli elérés" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Webkiszolgáló tulajdonságai" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Webkiszolgáló futtatása indításakor" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Webkiszolgáló port" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "UPnP port továbbítás engedélyezése a webkiszolgáló portján" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Webkiszolgáló UPnP TCP port" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Oldal frissítésének időzítése (mp múlva)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Gzip tömörítés engedélyezése" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Vendég felhasználó engedélyezése" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Admin jelszó" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Vendég jelszó" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Web minta" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Külső kapcsolatok jellemzői" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Külső kapcsolat elfogadása" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"A hallgató interfész IP-je\n" +"(üres = bármi)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Adjon meg itt egy érvényes IP címet a.b.c.d formában az EC hallgató " +"interfésznek. Üres mező vagy 0.0.0.0 jelentése: bármelyik interfész." + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "TCP port" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "UPnP port továbbítás engedélyezése az EC porton" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "Kattints ide a beállítási módosítások alkalmazásához." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Beállítási módosítások figyelmen kívül hagyása." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Cím :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Megjegyzés:" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Bejövő Mappa :" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "Tallóz" + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Újonnan hozzárendelt fájlok prioritásának változtatása :" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Ne változzon" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Válassz színt ehhez a kategóriához (jelenleg kiválasztva) :" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "A nap kiszolgáló üzenetének megjelenítése kapcsolódáskor ..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Kiszolgáló Infó" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Kattints erre a gombra a logfájl visszaállításához." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "aMule Napló" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "Kattints erre a gombra a kiszolgálólista frissítéséhez ..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Kiszolgáló lista" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Adj meg egy címet a server.met fájlhoz és nyomd meg a baloldali gombot az " +"ismert kiszolgálók listájának frissítéséhez." + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Kézi kiszolgálófelvétel : Név" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Add meg az új kiszolgáló nevét" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Itt add meg a kiszolgálók IP-jét, használd az x.x.x.x formát." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Add meg a kiszolgáló portját." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "Kiszolgáló felvétel kézzel (töltsd ki a baloldali mezőket először) ..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "ED2K infó" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Kad infó" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"A kiválasztott nyelvi beállítás úgy látszik nem lett feltelepítve a gépedre\n" +"Létre kell hoznod először, hogy ezen a nyelven is használható legyen.\n" +"Jó kezdet linuxon az /etc/locale.gen fájl és a 'locales' csomag\n" +"Sok szerencsét!\n" +"(Megjegyzés: Mimdenesetre megpróbálom ezt beállítani)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Ne jelenítse meg többé" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "Kattints erre a gombra a csomópont-lista frissítéséhez URL-ből ..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Csomópontok (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"Adj meg egy címet a nodes.dat fájlhoz és nyomd meg a baloldali gombot az " +"ismert csomópontok listájának frissítéséhez." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Csomópont statisztikák" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Rendszerbetöltés" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Új csomópont (node)" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Port:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Indítás ismert \n" +"kliensektől" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Leválasztás a Kad-ról" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Protokoll zavarás" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Protokoll zavarás támogatása" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"Ez az opció engedélyezi a protokoll zavarást, és az aMule elfogad zavart " +"kapcsolatokat más ügyfelektől." + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Kimenő kapcsolatok zavarása" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"Ez az opció engedélyezi a protokoll zavarást, amikor más ügyfelekhez/" +"kiszolgálókhoz kapcsolódik az aMule." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Csak zavart kapcsolatok elfogadása" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"Ezen opció hatására az aMule csak zavart kapcsolatokat fog elfogadni. " +"Kevesebb forrásod lesz, de a teljes forgalom zavart lesz" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Fájl beállítások" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Mindenki" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Senki" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Kik láthatják a megosztott fájlokat:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "Válaszd ki, hogy kik kérdezhetik le megosztott fájlaid listáját." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "IP-szűrés" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Kliensek szűrése" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"A ~/.aMule/ipfilter.dat állományban IP-jű kliensek szűrésének engedélyezése." + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Kiszolgálók szűrése" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"A ~/.aMule/ipfilter.dat állományban IP-jű kiszolgálók szűrésének " +"engedélyezése." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Lista újratöltése" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "IP-k listájának újratöltése az ~/.aMule/ipfilter.dat fájlból" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Frissítés most" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "IP szűrő automatikus letöltése indításkor" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Szűrési szint:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Mindig szűrje ki a LAN IP-ket" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "A nem-megegyező IP-k paranoid kezelése" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Eldobja a csomagot, ha a kliens IP különbözik az IP-től, ahonnan a csomag " +"jött. Óvatosan használd." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "Rendszer-szintű ipfilter.dat használatának engedélyezése" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" +"Ha nem talál helyi ipfilter.dat-ot, akkor a rendszerszintű IP szűrő állomány " +"használatát engedi." + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "Biztonságos azonosítás használata" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" +"Ajánlott ezt az opciót engedélyezni. Nem fogsz kreditet kapni, ha nincs " +"engedélyezve." + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Engedélyezés/Tiltás" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Online-aláírás engedélyezése" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Az online-aláírás fájl írásának engedélyezése, amit külső alkalmazások " +"használhatnak fel aláírások létrehozásához és így tovább." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Frissítési gyakoriság (mp):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "Online aláírás frissítési gyakoriságának módosítása (mp-ben)." + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Online aláírás könyvtára:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "Kattints ide az online aláírást tartalmazó könyvtár kiválasztásához." + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Tiltás/Engedélyezés" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "Bejövő üzenetek kiszűrése (kivéve az aktuális csevegés):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Szűrő beállítások:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Összes üzenet szűrése" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Barát listában nem szereplőktől érkező üzenetek kiszűrése" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Ismeretlen kliensektől érkező üzenetek kiszűrése" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "" +"A következő(ke)t tartalmazó üzenetek kiszűrése (elválasztónak ','-t " +"használj):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"Azon szavak felvétele, amelyeket az amule-nak ki kellene szűrni és blokkolni " +"az ezeket tartalmazó üzneteket" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Megjegyzések" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "Megjegyzések kiszűrése, melyek tartalmazzák (',' az elválasztó):" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Proxy engedélyezése" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Proxy támogatás engedélyezése/tiltása" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Proxy típusa:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "A proxy típusa amihez kapcsolódsz" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Proxy host:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "A proxy host neve" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Proxy port:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "A proxy port" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Hitelesítés" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Hitelesítés engedélyezése" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Felhasználói név/jelszó hitelesítés engedélyezése/tiltása" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "Felhasználói név a proxy kapcsolathoz" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Jelszó:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "Jelszó a proxy kapcsolathoz" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Automatikus kiszolgáló kapcsolat proxy nélkül" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Kapcsolódás ehhez:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Bejeletkezés a távoli amule-ra" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Felhasználói név" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Emlékezzen ezekre a beállításokra" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Bőbeszédű hiba-naplózás engedélyezése" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "Üzenet kategóriák:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "Importálandók hozzáadása" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Kijelöltek újrapróbálása" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Kijelöltek eltávolítása" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Esemény típusok" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Kapcsolódás bármelyik kiszolgálóhoz és/vagy a Kad-hoz" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Új kategória" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Könyvtár kiválasztása az érkező fájloknak" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Meg kell adnod a kategória nevét!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Meg kell adnod a kategória elérési útvonalát!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"Bejövő könyvtár létrehozása sikertelen a kategóriához. Kérlek érvényes " +"elérési utat adj meg!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "Ismeretlen bővítmény '%s' a '%s' parancshoz.\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "Ismeretlen parancs: '%s'.\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"Ennek a parancsnak nem lehet argumentuma.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"Ennek a parancsnak kötelező az argumentum.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Ez a parancs nem teljes, az alábbi bővítmények valamelyikét kell " +"használnod.\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Elérhető bővítések:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Elérhető parancsok:\n" + +#: src/ExternalConnector.cpp:188 +#, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"Minden parancs érzéketlen a kis-/nagybetűkre.\n" +"Ha részletes infót akarsz egy -ról, add ki a '%s ' " +"parancsot.\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Kilép az alkalmazásból." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Súgó megjelenítése." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"Ha egy parancsról kérsz súgót, használd a 'help '-ot.\n" +"A teljes parancslistához használd a 'help'-et.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"A parancslistához használd a '%s'-et\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Szintaktikai hiba!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Hiba a parancs feldolgozásában - soha sem kellene előfordulnia! Kérlek, " +"küldd el a hibajelentést\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Ennek a parancsnak nem kellene paraméterének lennie." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Ennek a parancsnak kötelező paramétert adni." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Érvénytelen paraméter." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Ez a parancs így nem teljes." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "A '%s' paranccsal kaphatsz bővebb segítséget.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "Ez a(z) %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "Ez a(z) %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Kliens létrehozása...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "Kapcsolódás sikertelen. A megadott host-ra nem lehet kapcsolódni\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"Ok, kilépés a %s-ből...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "E súgó megjelenítése." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "Host, ahol az aMule fut (alap: localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "Az aMule Távoli Elérés portja (alap: 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Külső kapcsolat jelszava." + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Konfiguráció betöltése fájlból." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "Nem ír ki semmit a szabvány kimenetre." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Legyen bőbeszédű - mutassa a hibakeresési üzeneteket is." + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Beállítja a program nyelvét." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "A parancssori opciók konfig fájlba írása." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "Konfig fájl létrehozása az aMule konfig fájlja alapján." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "A program verziójának kiírása." + +#: src/ClientCreditsList.cpp:168 +#, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "Kredit fájl betöltve, %u kliens ismert" + +#: src/ClientCreditsList.cpp:171 +#, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] " - %u kliens kreditérvényessége lejárt!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "A 'cryptkey.dat' fájlt nem találom, létrehozok egyet." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "HIBA: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Kitiltás megszüntetése" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Feltöltések megjelenítése" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Várakozók megjelenítése" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Kliensek megjelenítése" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Nézet kiválasztása" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Kliens szoftver" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Várakozott" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Feltöltési idő" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Feltöltés/Letöltés" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Távoli állapot" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "QR: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Fájl prioritás" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Pontszám" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Kérve" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Utoljára látott" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Várólistára bejegyezve" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Feltöltési állapot" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Feltöltött" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Letöltési állapot" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Letöltött" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Userhash" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Titkosított" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Megosztott fájlok elrejtése" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Kliens részletei" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Nem támogatott" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Befejezetlen" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Rossz fiú" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Hitelesítés - OK" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Nem elérhető" + +#: src/ClientDetailDialog.cpp:190 +#, c-format +msgid "%u (QR: %u)" +msgstr "%u (QR: %u)" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" +"A minimum méretnek kisebbnek kell lennie a maximum méretnél. Maximum méret " +"figyelmen kívül hagyva." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Keresési figyelmeztetés" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Korlátlan" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "aMule Tálca menü" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Sebesség korlátok:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "Fel: nincs" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "Fel: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "Le: nincs" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "Le: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Letöltési sebesség: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Feltöltési sebesség: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Kliens információk" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Becenév: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "Nem lett Becenév kiválasztva!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "KliensID: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Kiszolgáló Név: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "Kiszolgáló IP: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "TCP Port: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "TCP Port: Nem áll készen" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "UDP Port: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "UDP Port: Nem áll készen" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Online Aláírás: Engedélyezve" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Online Aláírás: Letiltva" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Megosztott fájlok: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Várólistás kliensek: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "Összes letöltés: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "Összes feltöltés: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Feltöltési korlát" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Letöltési korlát" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "aMule elrejtése" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "aMule megjelenítése" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "Csevegési folyamat elindítva: %s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Connected to Client ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** Kapcsolódás a klienshez ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Kapcsolódás sikertelen / Kapcsolat elveszítve ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Fül bezárása" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Az összes fül bezárása" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "A többi fül bezárása" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "server.met fájl betöltése: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "Server.met fájl nem található!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "server.met fájl '%s' betöltése sikertelen: ismeretlen formátum." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "A server.met megnyitása sikertelen!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "server.met fájl sérült, érvénytelen verzió-tag: 0x%x, mérete %i" + +#: src/ServerList.cpp:168 +#, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "%i kiszolgálót találtam a server.met fájlban" + +#: src/ServerList.cpp:170 +#, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d kiszolgáló hozzáadva" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Kiszolgáló nem lett hozzádva: [%s:%d] nem egy érvényes port." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "" +"Kiszolgáló nem lett hozzáadva: Az IP címe [%s:%d]-nek ki van szűrve vagy " +"érvénytelen." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" +"Kiszolgáló nem lett hozzáadva: Ezzel az IP:Port-tal [%s:%d] már van " +"kiszolgáló a listában." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Kiszolgáló hozzáadva: Kiszolgáló [%s:%d] '%s' néven." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"Olyan kiszolgálót próbál törölni, amelyikhez csatlakozva van. Kérém először " +"válassza le." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "A server.met mentése sikertelen!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "Érvénytelen URL" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "Kiszolgáló lista letöltése %s-ről befejeződött." + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Kiszolgáló lista letöltése sikertelen %s-ről" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"Nem található kiszolgálólista-hivatkozás bejegyzés az 'addresses.dat' " +"fájlban. Kérlek érvényes kiszolgálólista-hivatkozást illessz be ebbe a " +"fájlba, hogy automatikusan frissüljön a kiszolgálólista" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "Kiszolgáló lista letöltése %s-ről megkezdve." + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" +"Figyelem, érvénytelen URL lett megadva a kiszolgálók automatikus " +"frissítéséhez: %s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" +"Nincs érvényes url a server.met fájl automatikus letöltéséhez az addresses." +"dat fájlban" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"A helyi kiszolgálót kiszűrte az IP-szűrő, újracsatlakozom egy másik " +"kiszolgálóhoz!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "" +"A(z) '%s' parancsot a(z) '%s' esemény kapcsán nem sikerült végrehajtani." + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"Nyelvi beállításaid a egy konfigurációs változás miatt az alapértelmezettre " +"lett átállítva. Bocs." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"Nincs egyetlen kiszolgáló sem a kiszolgáló-listádban.\n" +"Szeretnéd, hogy az aMule letöltsön egy új listát most?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Kiszolgáló-lista letöltése" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "web kiszolgáló fut, pid=%d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"A webkiszolgáló automatikus indítását kérte, de az amuleweb futtatható " +"állomány nem található. Kérem installálja fel aMule webkiszolgálót " +"tartalmazó csomagot, vagy fordítsa az aMule-t a --enable-webserver opcióval, " +"és futtassa a 'make install' parancsot." + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "A %u port nem elérhető. Alacsony kliens azonosítót kapsz (LOWID)\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"%u port nem elérhető!\n" +"\n" +"Ez azt jelenti, hogy alacsony kliens azonosítót kapsz (LOWID).\n" +"\n" +"Ellenőrízd a hálózatodat, hogy megbizonyosodj, hogy a port nyitva van kifelé " +"és befelé egyaránt." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Online-Aláírás fájl létrehozása sikertelen" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "Az aMule OnlineAláírás fájl létrehozása sikertelen" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"A kiválasztott nyelvi beállítások úgy látszik nincsenek telepítve a gépeden. " +"(Megjegyzés: Mindenesetre mepróbálom ezt beállítani)" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "Ez az első alkalom, hogy az aMule %s-t futtatod" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "Ez egy teszt verzió, naponta frissítve, és\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "nem vállalunk garanciát, hogy nem omlik össze, gyújtja fel a házad,\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "vagy öli meg a kutyád. *Elvileg* nyugodtan használható.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "Az alábbiak változtak meg ebben a kiadásban biztonsági okok miatt:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* Protokoll titkosítás engedélyezve a bejövő és kimenő kapcsolatokra.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* Kiszolgáló-lista frissítése letiltva más ügyfelektől és kiszolgálóktól.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"Több információért ezekről a változásokról keress az aMule wiki-ben\n" +" a http://wiki.amule.org oldalon információt a hamis kiszolgálókról (\"fake " +"servers\").\n" +"Fontos, hogy minden hamis kiszolgálót törölj a kiszolgáló-listádról, hagy az " +"aMule rendesen működjön." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Még több információ, támogatás és új kiadások találhatóak honlapunkon,\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" +"a www.aMule.org-on, vagy az #aMule IRC csatornánkon az irc.freenode.net-en.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Nyugodtan jelezz bármilyen hibát a http://forum.amule.org-on" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"Az Online aláírás fájl könyvtárának megadott hely ÉRVÉNYTELEN!\n" +" Az OnlineAláírás letiltásra kerül, amíg ki nem javítod azt a beállítások " +"menüpontban." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "HIBA: Nem tudom megnyitni a napló fájlt" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "FIGYELEM: a napló üres. Valami nem stimmel." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Napló törölve" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "KiszolgálóÜzenet: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Csomópont-lista letöltése sikertelen." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Nem sikerült megnyitni a letöltött verzió-ellenőrző fájlt" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Sérült verzió-ellenőrző fájl" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Az aMule egy elavult verzióját használod!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "A te aMule verziód %i.%i.%i, a legújabb verzió pedig %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "A legújabb verzió mindig megtalálható a http://www.amule.org honlapon." + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "FIGYELEM: A te aMule verziód elavult: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "Az aMule verziód naprakész." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Verzió-ellenőrzés fájl letöltése sikertelen." + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Kapcsolódva ehhez %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Kapcsolódás %s-hez" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Leválasztva az ED2K-ról" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad elindítva." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad leállítva." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Kapcsolódva a Kad-hoz (rendben)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Kapcsolódva a Kad-hoz (tűzfal mögül)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Leválasztva a Kad-ról" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"A Kad hálózat nem használható, ha az UDP port le van tiltva a " +"beállításokban, nem indítom." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "A Kad hálózat le van tiltva a beállításokban, nem kapcsolódom." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "" +"Barátok listáját tartalmazó 'emfriends.met' fájl olvasáshoz történő " +"megnyitása sikertelen!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "" +"Barátok listáját tartalmazó 'emfriends.met' fájl íráshoz történő megnyitása " +"sikertelen!" + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "" +#~ "A távoli felületről még nem lehet a server.met állományt frissíteni." + +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "%u Kad kapcsolat beolvasva" + +#~ msgid "Disconnect from " +#~ msgstr "Szétkapcsolás ettől: " + +#~ msgid "current server" +#~ msgstr "aktuális kiszolgáló" + +#~ msgid " and " +#~ msgstr " és " + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "Leválaszt minden kiszolgálóról és/vagy a Kad-ról" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "TCP Flags" +#~ msgstr "TCP jelek" + +#~ msgid "UDP Flags" +#~ msgstr "UDP jelek" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "ED2k link(ek) másolása a vágólapra" + +#~ msgid "Client requests %u" +#~ msgstr "A kliens %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "fájl blokk-ot kér %u-%u (%d bájt):" + +#~ msgid "Client request is invalid!" +#~ msgstr "A kliens kérése érvénytelen!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "A kliens kérése érvénytelen! %i / %i" + +#~ msgid "Command: %s" +#~ msgstr "Parancs: %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "Nem lehet megnyitni a %s fájlt - a %s fájlt használom. " + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "Figyelem: a known.met fájl nem létezik." + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles: '%s' eltávolítása a megosztott " +#~ "könyvtárak listájáról: könyvtár nem található." + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "Al-folyamat befejezésére várakozás sikertelen" + +#~ msgid "" +#~ "You cannot connect to a release version from an arbitrary CVS version! " +#~ "*sigh* possible crash prevented" +#~ msgstr "" +#~ "Nem kapcsolódhatsz egy kiadott verzióhoz egy tetszőleges CVS verzióval! " +#~ "*sóhaj* lehetséges összeomlás megelőzve" + +#~ msgid "doesn't work" +#~ msgstr "nem működik" + +#~ msgid "remote gui" +#~ msgstr "távoli felület" + +#~ msgid "" +#~ "Error: Failed to load backup file. Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Hiba: Biztonsági másolat betöltése sikertelen. Keress megoldást a http://" +#~ "forum.amule.org-on a .part.met fájl helyreállítására" + +#~ msgid "" +#~ "Error: Backup part.met file is 0 size! Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Hiba: A part.met fájl biztonsági másolata 0 méretű. A http://forum.amule." +#~ "org-on kereshetsz a .part.met fájl helyreállításához megoldást" + +#~ msgid "Error: part.met backup file is 0 size: %s ==> %s" +#~ msgstr "Hiba: part.met biztonsági másolata 0 méretű: %s ==> %s" + +#~ msgid "" +#~ "Note: These values are\n" +#~ " only used for statistics." +#~ msgstr "" +#~ "Megjegyzés: Ezek az értékek\n" +#~ " csak a statisztikákhoz kellenek." + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ "'Minden-platform' p2p kliens az eMule alapján \n" +#~ "\n" +#~ "Weboldal: http://www.amule.org \n" +#~ "Fórum: http://forum.amule.org \n" +#~ "GYIK: http://wiki.amule.org \n" +#~ "\n" +#~ "Kapcsolat: admin@amule.org (adminisztratív ügyek) \n" +#~ "Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ "Az aMule részben ez alapján \n" +#~ "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ "Copyright (C) 2002 Petar Maymunkov\n" +#~ "http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "FIGYELMEZTETÉS: Low-ID-t kaptál!" + +#~ msgid "Syncronization thread started." +#~ msgstr "Szinkronizációs szál elindítva." + +#, fuzzy +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "AICH szál: Mester hash-ek az ismert fájlokhoz betöltve." + +#, fuzzy +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "IO hiba a known.met fájl olvasása közben: %s" + +#, fuzzy +#~ msgid "Buddy address: " +#~ msgstr "IP-cím:" + +#~ msgid "Client Identification:" +#~ msgstr "Kliens azonosítás:" + +#~ msgid "" +#~ "Secure Identification uses a handshake approch to safely identify clients " +#~ "for use with the credit system." +#~ msgstr "" +#~ "A biztonságos azonosítás egy handshake (kézfogás) eljárást használ a " +#~ "kilensek biztonságos azonosításához a kredit rendszer használatához." + +#~ msgid "Sources Dropping" +#~ msgstr "Forrás-kihagyás" + +#~ msgid "Source Dropping" +#~ msgstr "Forrás-kihagyás" + +#~ msgid "Keep sources" +#~ msgstr "Források megtartása" + +#~ msgid "Drop sources" +#~ msgstr "Források kihagyása" + +#~ msgid "Send sources to any other file before dropping (High CPU)" +#~ msgstr "" +#~ "Források átadása bármely másik fájlnak kihagyás előtt (Erős CPU-t igényel)" + +#~ msgid "Sources with no needed file-parts." +#~ msgstr "Hiányzó fájlrészlettel nem rendelkező források" + +#~ msgid "Full Queue Sources Handling" +#~ msgstr "Teli várólistás források kezelése" + +#~ msgid "Enable auto drop Full Queue Sources" +#~ msgstr "Teli várólistás források automatikus kihagyásának engedélyezése" + +#~ msgid "High Queue Rating Sources Handling" +#~ msgstr "Magas várólistás források kezelése" + +#~ msgid "Enable auto drop High Queue Rating Sources" +#~ msgstr "Magas várólistás források automatikus kihagyásának engedélyezése" + +#~ msgid "High Queue Rating value" +#~ msgstr "Magas várólistás értéke" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(Min 300 / Max 3000)" + +#~ msgid "Auto Drop Sources Timer" +#~ msgstr "Automatikus forráskihagyás időzítő" + +#~ msgid "Timer (in secs)" +#~ msgstr "Időzítés (mp-ben):" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(Min 60 / 3600 Max)" + +#~ msgid "Drop No Needed Sources now" +#~ msgstr "Hiányzó fájlrésszel nem rendelkező források (HFNRF) kihagyása most" + +#~ msgid "Drop Full Queue Sources now" +#~ msgstr "Teli várólistás források (VTF) kihagyása most" + +#~ msgid "Drop High Queue Rating Sources now" +#~ msgstr "Magas Várólistás Források (MVF) kihagyása most" + +#~ msgid "Clean Up Sources now (NNS, FQS && HQRS)" +#~ msgstr "Források rendbetétele most (HFNRF, VTF &és MVF)" + +#~ msgid "English (U.S.)" +#~ msgstr "Angol (Amerikai)" + +#~ msgid "Spanish (Mexican)" +#~ msgstr "Spanyol (Mexikói)" + +#, fuzzy +#~ msgid "Sources: %u" +#~ msgstr "Források:" + +#, fuzzy +#~ msgid "Feedback from: %s" +#~ msgstr "Visszajelzés ettől:" + +#, fuzzy +#~ msgid "Client: aMule %s" +#~ msgstr "Kliens: aMule" + +#, fuzzy +#~ msgid "File Name: %s" +#~ msgstr "Fájlnév:" + +#, fuzzy +#~ msgid "File size: %s" +#~ msgstr "Fájlméret:" + +#, fuzzy +#~ msgid "Download: %s" +#~ msgstr "Letöltés: " + +#, fuzzy +#~ msgid "Complete Sources: %u" +#~ msgstr "Komplett források száma:" + +#, fuzzy +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2006 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ "aMule - 'több platformos' p2p kliens eMule alapokon.\n" +#~ "\n" +#~ " Weboldal: http://www.amule.org \n" +#~ " Fórum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Kapcsolat: admin@amule.org (adminisztratív dolgok) \n" +#~ " Copyright (C) 2003-2004 aMule Project \n" + +#~ msgid "Copy ED2k link to clipboard (Hostname)" +#~ msgstr "ED2K link másolása a vágólapra (Host név)" + +#~ msgid "Connecting to %s (%s - %s:%i)" +#~ msgstr "Kapcsolódás %s-hez (%s - %s:%i)" + +#~ msgid "Minimize to trayicon" +#~ msgstr "Minimalizálás a tálcára" + +#~ msgid "" +#~ "Enabling this will make aMule minimize to the system-tray, rather than " +#~ "the taskbar." +#~ msgstr "" +#~ "Engedélyezve a tálca helyett a rendszertálcára fogja minimalizálni az " +#~ "aMule-t." + +#~ msgid "Unable to open skin file: %s" +#~ msgstr "Nem lehet megnyitni a téma fájlt: %s" + +#~ msgid "Browse skin file" +#~ msgstr "Skin fájlok böngészése" + +#~ msgid "Use skin file to set aMule bitmaps." +#~ msgstr "Téma fájl használata az aMule grafikájának beállításához." + +#~ msgid "Skin file:" +#~ msgstr "Téma fájl:" + +#, fuzzy +#~ msgid "ExternalConn: adding ed2k link '%s'." +#~ msgstr "ExternalConn: ED2k hivatkozás nem értelmezhető: '%s'." + +#~ msgid "theApp.serverlist->GetServerByAddress() returned NULL" +#~ msgstr "theApp.serverlist->GetServerByAddress() returned NULL" + +#~ msgid "Skin file name is empty - loading defaults" +#~ msgstr "Téma fájl neve hiányzik - alapértelmezés betöltése" + +#~ msgid "Skin file %s does not exist - loading defaults" +#~ msgstr "Téma fájl %s nem létezik - alapértelmezés betöltése" + +#~ msgid "IPFilter is %s.\n" +#~ msgstr "IP szűrő %s.\n" + +#, fuzzy +#~ msgid "Turn IP filtering on." +#~ msgstr "IP-szűrés" + +#, fuzzy +#~ msgid "Get IPFilter state." +#~ msgstr "IP szűrő %s.\n" + +#~ msgid "Enable IP-Filtering" +#~ msgstr "IP-szűrés engedélyezése" + +#~ msgid "" +#~ "Enable filtering of the IPs defined in the file ~/.aMule/ipfilter.dat." +#~ msgstr "" +#~ "~/.aMule/ipfilter.dat fájlban meghatározott IP-k szűrésének engedélyezése" + +#~ msgid "ED2K Link Handler" +#~ msgstr "ED2k hivatkozás-kezelő" + +#~ msgid "Local Search" +#~ msgstr "Helyi keresés" + +#~ msgid "Global Search" +#~ msgstr "Globális keresés" + +#~ msgid "FileHash (WWW)" +#~ msgstr "FileHash (WWW)" + +#, fuzzy +#~ msgid "Enable command execution" +#~ msgstr "Hitelesítés engedélyezése" + +#, fuzzy +#~ msgid "Command:" +#~ msgstr "Parancs: %s" + +#~ msgid "Socks5" +#~ msgstr "Socks5" + +#~ msgid "Socks4" +#~ msgstr "Socks4" + +#, fuzzy +#~ msgid "Failed to execute on-completion command. Template is: %s" +#~ msgstr "A '%s' sablon betöltése sikertelen\n" + +#~ msgid "WARNING: aMule is stopped !" +#~ msgstr "FIGYELMEZTETÉS: aMule leállítva !" + +#~ msgid " is STOPPED !" +#~ msgstr " LEÁLLÍTVA !" + +#, fuzzy +#~ msgid "Index file not found: bad template\n" +#~ msgstr "A '%s' sablon betöltése sikertelen\n" + +#~ msgid "" +#~ "WARNING: A file with that name already exists, the file has been renamed" +#~ msgstr "" +#~ "FIGYELMEZTETÉS: Egy fájl már létezik ezzel a névvel, a fájl átnevezésre " +#~ "került" + +#~ msgid "WARNING: Failed to delete %s.seeds" +#~ msgstr "FIGYELMEZTETÉS: %s.seeds törlése sikertelen" + +#~ msgid "" +#~ "Downloaded:\n" +#~ "%s" +#~ msgstr "" +#~ "Letöltve:\n" +#~ "%s" + +#~ msgid "\tStopped" +#~ msgstr "\tMegállítva" + +#~ msgid "\tRemoved from shared" +#~ msgstr "\tEltávolítva a megosztásból" + +#~ msgid "\tRemoved from download queue" +#~ msgstr "\tEltávolítva a letöltési listából" + +#~ msgid "\tRemoved transferwnd" +#~ msgstr "\tEltávolítva az átvitel ablakból" + +#~ msgid "\tClosed" +#~ msgstr "\tBezárva" + +#~ msgid "\tFailed to delete '%s'" +#~ msgstr "\t'%s' törlése sikertelen" + +#~ msgid "\tRemoved .part.met" +#~ msgstr "\t.part.met eltávolítva" + +#~ msgid "Failed to delete '%s'" +#~ msgstr "'%s' törlése sikertelen" + +#~ msgid "\tRemoved .part" +#~ msgstr "\t.part eltávolítva" + +#~ msgid "\tRemoved .BAK" +#~ msgstr "\t.BAK eltávolítva" + +#~ msgid "\tRemoved .seeds" +#~ msgstr "\t.seeds eltávolítva" + +#~ msgid "Done" +#~ msgstr "Kész" + +#, fuzzy +#~ msgid "%s: Expected part-hash: %s" +#~ msgstr "Várt rész-hash: %s" + +#, fuzzy +#~ msgid "%s: Actual part-hash: %s" +#~ msgstr "Tényleges rész-hash: %s" + +#, fuzzy +#~ msgid "Info not Available" +#~ msgstr "Nem elérhető" + +#~ msgid "Hasher: Creating new thread." +#~ msgstr "Hasher: Új szál létrehozása." + +#~ msgid "Hasher: Signaling for remaining threads to terminate." +#~ msgstr "Hasher: A megmaradt szálak felszólítása a befejezésre." + +#~ msgid "Hasher: No files on queue, stopping thread." +#~ msgstr "Hasher: Nincs fájl a listán, szál leállítása." + +#~ msgid "Hasher: Starting to create MD4 and AICH hash for file: %s" +#~ msgstr "Hasher: MD4 és AICH hash létrehozása a '%s' fájlhoz." + +#, fuzzy +#~ msgid "Hasher: Starting to create MD4 hash for file: %s" +#~ msgstr "Hasher: MD4 tördelőalgoritmus létrehozása ehhez a fájlhoz:" + +#~ msgid "Hasher: Finished hashing file: %s" +#~ msgstr "Hasher: %s újrahash-elése befejeződött" + +#~ msgid "Hasher: A thread has died." +#~ msgstr "Hasher: Egy szál meghalt." + +#~ msgid "Client %s on IP:Port %s:%d using %s" +#~ msgstr "Kliens: %s a(z) %s:%d IP címen és porton, %s-t használ" + +#, fuzzy +#~ msgid "Connection to remote aMule is lost. Exiting now." +#~ msgstr "Kapcsolódás a távol aMule-hez" + +#, fuzzy +#~ msgid "Error: connection lost" +#~ msgstr "Kapcsolat megszakadt" + +#~ msgid "aMule Tray Menu Info" +#~ msgstr "aMule Tálca menü Infó" + +#~ msgid "Disconnect from server" +#~ msgstr "Leválaszt a kiszolgálóról" + +#~ msgid "Connect to any server" +#~ msgstr "Kapcsolódás bármelyik kiszolgálóhoz" + +#~ msgid "aMule for Linux" +#~ msgstr "aMule for Linux" + +#, fuzzy +#~ msgid "Loading ipfilter.dat files." +#~ msgstr "server.met fájl betöltése: %s" + +#~ msgid "AICH Thread: Signaling for thread to terminate." +#~ msgstr "AICH szál: A szál felszólítása a befejezésre." + +#~ msgid "AICH Thread: Terminated." +#~ msgstr "AICH szál: Befejezve." + +#~ msgid "AICH Thread: Syncronization thread started." +#~ msgstr "AICH szál: Szinkronizációs szál elindítva." + +#~ msgid "AICH Thread: Starting to hash files. %li files found." +#~ msgstr "AICH szál: Elkezdem a fájlok hash-elését: %li fájlt találtam." + +#~ msgid "AICH Thread: Hashing file: %s, total files left: %li" +#~ msgstr "AICH szál: File hash-elése: %s, összesen maradt: %li" + +#~ msgid "AICH Thread: Hashing completed." +#~ msgstr "AICH szál: Hash-elés befejezve." + +#~ msgid "AICH Thread: No new files found." +#~ msgstr "AICH szál: Nem találtam új fájlt." + +#~ msgid "Desktop integration" +#~ msgstr "Munkaasztal integráció" + +#~ msgid "Get Razorback 2's stats for this file" +#~ msgstr "Razorback 2 statisztikák ehhez a fájlhoz" + +#~ msgid "Copy ED2k link to clipboard (&HTML)" +#~ msgstr "ED2k link másolása a vágólapra (&HTML)" + +#~ msgid "" +#~ "For system tray integration to work,\n" +#~ "you must specify which desktop you are using.\n" +#~ "You can change this later from preferences." +#~ msgstr "" +#~ "A rendszertálcával történő integrációhoz\n" +#~ "meg kell adod, hogy melyik GUI felületett használja.\n" +#~ "Ezt később is megváltoztathatod a beállítások menüpontban." + +#~ msgid "Gnome 2.x (or other XEMBED compatible)" +#~ msgstr "Gnome 2.x (vagy más XEMBED kompatibilis)" + +#~ msgid "KDE 3.x" +#~ msgstr "KDE 3.x" + +#~ msgid "KDE 2.x / Gnome 1.2 " +#~ msgstr "KDE 2.x / Gnome 1.2 " + +#~ msgid "No systray integration, please" +#~ msgstr "Nem kérek integrációt a rendszertálcával" + +#~ msgid "Desktop" +#~ msgstr "Munkaasztal" + +#~ msgid "Jugle (WWW)" +#~ msgstr "Jugle (WWW)" + +#~ msgid "Downloadlist doubleclick to expand" +#~ msgstr "Letöltési lista lenyitása dupla-kattintással" + +#~ msgid "" +#~ "If enabled, it is possible to display the sources associated with " +#~ "downloads by double-clicking on them." +#~ msgstr "" +#~ "Ha engedélyezed, a letöltésre történő dupla-klikk esetén láthatod a " +#~ "letöltési forrásokat." + +#~ msgid "Select Window Manager" +#~ msgstr "Válassz ablakkezelőt" + +#~ msgid "" +#~ "Click here to select the type of systray integration you wish aMule to " +#~ "use." +#~ msgstr "" +#~ "Kattints ide a rendszerrel történő integritás típusának kiválasztásához." + +#~ msgid "Save 5 sources on rare files (< 20 sources)" +#~ msgstr "5 forrás mentése a ritka fájloknál (< 20 forrás)" + +#~ msgid "Default Permissions" +#~ msgstr "Alapértelmezett fájl jogosultságok" + +#~ msgid "Owner permissions, must at least be read/write'able." +#~ msgstr "" +#~ "A tulajdonos hozzáférési jogainak legalább olvasás/írás kell lennie." + +#~ msgid "Group permissions." +#~ msgstr "Csoport jogosultságok." + +#~ msgid "Other permissions." +#~ msgstr "Egyéb jogosultságok." + +#~ msgid "Copy ED2k link to clipboard (HTML)" +#~ msgstr "ED2K link másolása a vágólapra (HTML)" + +#~ msgid "aMule is not connected! Cannot do search." +#~ msgstr "Nem vagy csatlakozva kiszolgálóhoz! Így nem tudsz keresni." + +#~ msgid "Language change will not be applied until aMule is restarted." +#~ msgstr "A nyelvváltoztatás az aMule újraindításáig nem lép életbe." + +#~ msgid "Failed to open shared file (%s), rechecking list of shared files." +#~ msgstr "" +#~ "Nem tudtam megnyitni a megosztott fájlt (%s), megosztott fájlok " +#~ "listájának újraellenőrzése." + +#~ msgid "You are not connected to a server!" +#~ msgstr "Nem vagy csatlakozva kiszolgálóhoz!" + +#, fuzzy +#~ msgid "Client requests invalid %u " +#~ msgstr "A kliens érvénytelen %u." + +#~ msgid "" +#~ "Copied old ~/.xMule config and credit files to ~/.aMule\n" +#~ "However, be sure NOT to remove .xMule if your Incoming / Temp folders are " +#~ "still there ;)" +#~ msgstr "" +#~ "A régi ~/.xMule config és kredit fájlok átmásolásra kerültek ide ~/." +#~ "aMule\n" +#~ "Mindamellett, NE távolítsd el az .xMule könyvtárat, ha a Bejövő / " +#~ "Ideiglenes könyvtárak még ott vannak ;)" + +#~ msgid "" +#~ "Temp dir is placed on a FAT32 partition. Disabling chmod to avoid useless " +#~ "warnings." +#~ msgstr "" +#~ "Az Ideiglenes könyvtár egy FAT32-es partíción van. Chmod letiltásra kerül " +#~ "a használhatatlan figyelmeztetések elkerülése végett." + +#~ msgid "" +#~ "Incoming dir is placed on a FAT32 partition. Disabling chmod to avoid " +#~ "useless warnings." +#~ msgstr "" +#~ "A Bejövő könyvtár egy FAT32-es partíción van. Chmod letiltásra kerül a " +#~ "használhatatlan figyelmeztetések elkerülése végett." + +#~ msgid "" +#~ "ERROR: amule daemon is useless when external connections disabled. Change " +#~ "configuration either from GUI or by editing the config file" +#~ msgstr "" +#~ "HIBA: Az aMule démon használhatatlan, ha a távoli elérés le van tiltva. " +#~ "Változasd meg a beállításokat vagy a grafikus aMule porgramból, vagy a " +#~ "konfig fájl szerkesztésével." + +#~ msgid "Disconnect from current server" +#~ msgstr "Leválasztás a jelenlegi kiszolgálóról" + +#~ msgid "Connected to amule at %s" +#~ msgstr "Kapcsolat létrejött aMule-lal %s-kor" + +#~ msgid "Connection Failed. Unable to connect to the specified host" +#~ msgstr "Kapcsolódás sikertelen. A megadott host-ra nem lehet kapcsolódni" + +#~ msgid "aMule O.S. info is: %s" +#~ msgstr "aMule operációs rendszer információ: %s" + +#~ msgid "Download:" +#~ msgstr "Letöltés:" + +#~ msgid "jugle.net Fake Check" +#~ msgstr "jugle.net-es hamisítvány ellenőrzés" + +#~ msgid "'Donkey Fakes' Fake Check" +#~ msgstr "'Donkey Fakes'-es hamisítvány ellenőrzés" + +#~ msgid "FakeCheck" +#~ msgstr "Hamisítvány ellenőrzése" + +#~ msgid "You are already trying to download the file " +#~ msgstr "Már megkísérelted letölteni ezt a fájlt " + +#~ msgid "ExternalConn: failed to Create thread" +#~ msgstr "ExternalConn: a szál létrehozás sikertelen" + +#~ msgid "Invalid EC packet received" +#~ msgstr "Érvénytelen EC csomag érkezett" + +#~ msgid "" +#~ "Incorrect CVSDATE. Please run core and remote from the same CVS tarball." +#~ msgstr "" +#~ "Nem egyező CVSDATE. Futtassa az aMule-t és a távoli alkalmazást " +#~ "ugyanabból a CVS verzióból." + +#~ msgid "ExternalConnClientThread: Failed to Create thread." +#~ msgstr "ExternalConnClientThread: szál létrehozása sikertelen." + +#~ msgid "ExternalConnClientThread: Connection closed." +#~ msgstr "ExternalConnClientThread: kapcsolat lezárva." + +#~ msgid "Now, doing connection....\n" +#~ msgstr "Kapcsolat létesítése folyamatban....\n" + +#~ msgid "Using host '%s' port: %d\n" +#~ msgstr "Használt host '%s' port: %d\n" + +#~ msgid "Trying to connect (timeout = 10 sec)...\n" +#~ msgstr "Kapcsolódási kísérlet (időtúllépés = 10 mp)...\n" + +#~ msgid "ExternalConn: Access denied because: %s\n" +#~ msgstr "ExternalConn: Hozzáférés megtagadva: %s\n" + +#~ msgid "ExternalConn: Access denied.\n" +#~ msgstr "ExternalConn: Hozzáférés megtagadva.\n" + +#~ msgid "ExternalConn: Bad reply from server. Connection closed.\n" +#~ msgstr "ExternalConn: Rossz válasz a kiszolgálótól. Kapcsolat lezárva.\n" + +#~ msgid "Succeeded! Connection established to aMule %s\n" +#~ msgstr "Sikerült! Kapcsolat létrejött az aMule %s-val\n" + +#~ msgid "Succeeded! Connection established.\n" +#~ msgstr "Sikerült! Kapcsolat létrejött.\n" + +#~ msgid "A socket error occured during authentication. Exiting.\n" +#~ msgstr "Egy socket hiba lépet fel a hitelesítésnél. Kilépés.\n" + +#~ msgid "Failed to read corrupted friendlist file 'emfriends.met'!" +#~ msgstr "" +#~ "Nem tudom olvasni a sérült 'emfriends.met' fájlt, mely a barátok listáját " +#~ "tartlmazza!" + +#~ msgid "Loaded ipfilter with %d new IP addresses." +#~ msgstr "IP szűrő betöltve %d új IP címmel." + +#~ msgid "" +#~ "User %s (%u) requested your requested your sharedfiles-list -> Accepted" +#~ msgstr "" +#~ "A(z) %s (%u) felhasználó lekérdezte a megosztott fájljaid listáját -> " +#~ "Elfogadva" + +#~ msgid "" +#~ "User %s (%u) requested your requested your sharedfiles-list -> Denied" +#~ msgstr "" +#~ "A(z) %s (%u) felhasználó lekérdezte a megosztott fájljaid listáját -> " +#~ "Megtagadva" + +#~ msgid "CListenSocket: Cannot create thread" +#~ msgstr "CListenSocket: szál létrehozása sikertelen" + +#~ msgid "CListenSocket: Destroying" +#~ msgstr "CListenSocket: Törlés" + +#~ msgid "CSocketGlobalThread: Call to Create failed" +#~ msgstr "CSocketGlobalThread: Create meghívása sikertelen" + +#~ msgid "CSocketGlobalThread: Exited" +#~ msgstr "CSocketGlobalThread: kilépett" + +#~ msgid "" +#~ "\n" +#~ "Speed Limits:\n" +#~ msgstr "" +#~ "\n" +#~ "Sebesség korlátok:\n" + +#~ msgid "UL: None, " +#~ msgstr "Fel: nincs, " + +#~ msgid "UL: %u, " +#~ msgstr "Fel: %u, " + +#~ msgid "Nickname: " +#~ msgstr "Becenév: " + +#~ msgid "IP: " +#~ msgstr "IP: " + +#~ msgid "UDP Port: " +#~ msgstr "UDP Port: " + +#~ msgid "Uptime: " +#~ msgstr "Aktivitási idő: " + +#~ msgid "Shared Files: " +#~ msgstr "Megosztott fájlok: " + +#~ msgid "Queued Clients: " +#~ msgstr "Várólistás kliensek: " + +#~ msgid "Total DL: " +#~ msgstr "Összes letöltés: " + +#~ msgid "Total UL: " +#~ msgstr "Összes feltöltés: " + +#~ msgid "" +#~ "switch download list to clients you're downloading from, with files also " +#~ "(some day)" +#~ msgstr "" +#~ "letöltési lista elküldése azoknak a klienseknek, amelyektől letöltesz " +#~ "(néhány nap)" + +#~ msgid " / (" +#~ msgstr " / (" + +#~ msgid ")" +#~ msgstr ")" + +#~ msgid "(" +#~ msgstr "(" + +#~ msgid "Fake Check" +#~ msgstr "Hamisítvány ellenőrzése" + +#~ msgid "my browser" +#~ msgstr "böngészőm" + +#~ msgid "Client UDP port: 4665" +#~ msgstr "Kliens UDP port: 4665" + +#~ msgid "Extract Meta Data Tags" +#~ msgstr "Meta adat azonosítók kicsomagolása" + +#~ msgid "Reduce Fragmentation" +#~ msgstr "Töredezettség csökkentése" + +#~ msgid "Allocate full chunks for .part files" +#~ msgstr "Teljes adatelemek kiosztása a .part fájloknak" + +#~ msgid "" +#~ "Select this to allocate a full chunk each time data is received for it." +#~ msgstr "" +#~ "Válaszd ki ezt, az adatfogadással egyidejű teljes adatelem-kiosztáshoz." + +#~ msgid "Allocate full disk space for .part files" +#~ msgstr "Teljes szabad lemezterület kiosztása a .part fájlokhoz" + +#~ msgid "" +#~ "This option reduces fragmentation but slows down the part file creation " +#~ "and will disable sparse files" +#~ msgstr "" +#~ "Ezzel a beállítással csökken a töredezettség, de lassul a rész fájlok " +#~ "létrehozása és letiltódnak az elszórt fájlok" + +#~ msgid " Min Disk Space: " +#~ msgstr " Min. szabad lemezterület: " + +#~ msgid "mplayer -idx" +#~ msgstr "mplayer -idx" + +#~ msgid "Use TCP ports instead of unix local sockets" +#~ msgstr "TCP portok használata helyi unix socket-ek helyett" + +#~ msgid "External TCP port" +#~ msgstr "Külső TCP port" + +#~ msgid "http://www.srv1000.com/azz/server.met" +#~ msgstr "http://www.srv1000.com/azz/server.met" + +#~ msgid "." +#~ msgstr "." + +#~ msgid "localhost" +#~ msgstr "localhost" + +#~ msgid "4712" +#~ msgstr "4712" + +#~ msgid "amule" +#~ msgstr "amule" + +#~ msgid "Servers List Window" +#~ msgstr "Kiszolgáló-lista ablaka" + +#~ msgid "SharedFiles" +#~ msgstr "Megosztott fájlok" + +#~ msgid "K" +#~ msgstr "K" + +#~ msgid "Error: %s (%s) is corrupt." +#~ msgstr "Hiba: %s (%s) sérült." + +#~ msgid "Error: %s is corrupt, unable to load file." +#~ msgstr "Hiba: %s sérült, a fájl betöltése nem lehetséges." + +#~ msgid "Invalid versiontag in server.met (0x%x , size %i)!" +#~ msgstr "" +#~ "Érvénytelen verzió azonosító a server.met fájlban (0x%x , %i méret)!" + +#~ msgid "Error: the file server.met is corrupted" +#~ msgstr "Hiba: a server.met fájl sérült" + +#~ msgid "CServerSocketHandler: can not create my thread" +#~ msgstr "CServerSocketHandler: nem lehet saját szálat létrehozni" + +#~ msgid "Unknown exception while processing packet from server!" +#~ msgstr "" +#~ "Ismeretlen megszakítás a kiszolgálóról történő adatok feldolgozásánál!" + +#~ msgid "WARNING! Sharing the following directory is not recommended: %s" +#~ msgstr "FIGYELMEZTETÉS! A következő könyvtár megosztása nem ajánlott: %s" + +#~ msgid "Change this file's comment..." +#~ msgstr "Ezen fájl megjegyzéseinek módosítása..." + +#~ msgid "Max Downloadrate Average (Session): %.2f kB/s" +#~ msgstr "Max átlagos letöltési arány (folyamat): %.2f kB/s" + +#~ msgid "waiting for transfer..." +#~ msgstr "várakozás az átvitelre..." + +#~ msgid "Waiting for connection..." +#~ msgstr "Várakozás a kapcsolatra..." + +#~ msgid "Max Connection Limit Reached: Never" +#~ msgstr "Max kapcsolódási korlát elérve: Soha" + +#~ msgid "Session UL:DL Ratio (Total): Not available" +#~ msgstr "Fel:Le töltési folyamat aránya (összesen): Nem elérhető" + +#~ msgid "Compatible: %i (%1.1f%%)" +#~ msgstr "Kompatibilis: %i (%1.1f%%)" + +#~ msgid "HasSocket: %i (%1.1f%%)" +#~ msgstr "HasSocket: %i (%1.1f%%)" + +#~ msgid "ClientID:" +#~ msgstr "KliensID:" + +#~ msgid "ServerName:" +#~ msgstr "Kiszolgáló Név:" + +#~ msgid "ServerIP:" +#~ msgstr "Kiszolgáló IP:" + +#~ msgid "E&xit\tAlt-X" +#~ msgstr "K&ilépés\tAlt-X" + +#~ msgid "Quit amulecmd" +#~ msgstr "Kilépés amulecmd-ből" + +#~ msgid "&About...\tF1" +#~ msgstr "&Névjegy...\tF1" + +#~ msgid "Show about dialog" +#~ msgstr "Névjegy megjelenítése" + +#~ msgid "&File" +#~ msgstr "&Fájl" + +#~ msgid "&Help" +#~ msgstr "&Súgó" + +#~ msgid "" +#~ "\n" +#~ "Ok, exiting Text Client...\n" +#~ msgstr "" +#~ "\n" +#~ "Ok, kilépés a szöveges kliensből...\n" + +#~ msgid "" +#~ "amulecmd DLG version\n" +#~ "Using %s\n" +#~ "(c) aMule Dev Team" +#~ msgstr "" +#~ "amulecmd DLG verzió\n" +#~ "Using %s\n" +#~ "(c) aMule Dev Team" + +#~ msgid "About amulecmd" +#~ msgstr "amulecmd Névjegy" + +#~ msgid "This command requieres an argument. Valid arguments: 'on', 'off'\n" +#~ msgstr "" +#~ "Ez a parancs argumentumot igényel. Érvényes argumentumok: 'on', 'off'\n" + +#~ msgid "" +#~ "This command requieres an argument. Valid arguments: 'all', a number.\n" +#~ msgstr "" +#~ "Ez a parancs argumentumot igényel. Érvényes argumentumok: 'all', egy " +#~ "szám.\n" + +#~ msgid "Hint: Use Show DL or Show UL\n" +#~ msgstr "Javaslat: Használja a letöltés vagy feltöltés megjelenítését\n" + +#~ msgid "IPLevel parameter must be in the range of 0-255.\n" +#~ msgstr "IP szint paraméterének 0-255 között kell lennie.\n" + +#~ msgid "Connected to %s %s " +#~ msgstr "Kapcsolódva ehhez %s %s " + +#~ msgid "" +#~ "\n" +#~ "--------------------> Available commands (case insensitive): " +#~ "<------------------\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "----------------> Elérhető parancsok (nagybetű érzéketlen): " +#~ "<----------------\n" +#~ "\n" + +#~ msgid "server IP" +#~ msgstr "kiszolgáló IP" + +#~ msgid "Connect to given/random server. No warn if failed!\n" +#~ msgstr "" +#~ "Kapcsolódás adott/véletlenszerűen kiválasztott kiszolgálóhoz. Hiba esetén " +#~ "nincs figyelmeztetés!\n" + +#~ msgid "Resume file number n (or 'all').\n" +#~ msgstr "n. számú (vagy az összes) fájl letöltésének folytatása.\n" + +#~ msgid "Pauses file number n (or 'all').\n" +#~ msgstr "n. számú (vagy az összes) fájl letöltésének szüneteltetése.\n" + +#~ msgid "Turn on/off amule IPFilter.\n" +#~ msgstr "amule IP szűrő be/ki kapcsolása.\n" + +#~ msgid "level" +#~ msgstr "szint" + +#~ msgid "ED2k_Link" +#~ msgstr "Ed2k hivatkozás" + +#~ msgid "Adds (file or server) to aMule.\n" +#~ msgstr " elküldése az aMule-nak.\n" + +#~ msgid "limit" +#~ msgstr "korlát" + +#~ msgid "Sets maximum upload bandwidth.\n" +#~ msgstr "Beállítja a maximális feltöltési sávszélességet.\n" + +#~ msgid "Exits aMulecmd.\n" +#~ msgstr "Kilép az aMulecmd-ből.\n" + +#~ msgid "" +#~ "\n" +#~ "----------------------------> End of listing " +#~ "<----------------------------------\n" +#~ msgstr "" +#~ "\n" +#~ "----------------------------> Listázás vége " +#~ "<----------------------------------\n" + +#~ msgid "aMule text client" +#~ msgstr "aMule szöveges kliens" + +#~ msgid "Quit amuleweb" +#~ msgstr "Kilépés amuleweb-ből" + +#~ msgid "" +#~ "\n" +#~ "Ok, exiting Web Client...\n" +#~ msgstr "" +#~ "\n" +#~ "Ok, Web kliens bezárása...\n" + +#~ msgid "" +#~ "amuleweb [DLG version]\n" +#~ "Using %s\n" +#~ "(c) aMule Dev Team" +#~ msgstr "" +#~ "amuleweb [DLG verzió]\n" +#~ "Using %s\n" +#~ "(c) aMule Dev Team" + +#~ msgid "About amuleweb" +#~ msgstr "amuleweb Névjegy" + +#~ msgid "amuleweb DLG" +#~ msgstr "amuleweb DLG" + +#~ msgid "FATAL ERROR: Cannot find template: %s" +#~ msgstr "VÉGZETES HIBA: Nem találom a '%s' témát" + +#~ msgid "" +#~ "\n" +#~ "----------------> Help: Available commands (case insensitive): " +#~ "<----------------\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "----------------> Súgó: Elérhető parancsok (nagybetű érzéketlen): " +#~ "<----------------\n" +#~ "\n" + +#~ msgid "Exits aMuleWeb.\n" +#~ msgstr "aMuleWeb bezárása.\n" + +#~ msgid "" +#~ "\n" +#~ "Use 'Help' for command list\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "A parancslistához használja a --help paramétert\n" +#~ "\n" + +#~ msgid "Very Low" +#~ msgstr "Nagyon alacsony" + +#~ msgid " Auto" +#~ msgstr "Automatikus" + +#~ msgid "Web Server: Restarted\n" +#~ msgstr "Web kiszolgáló: újraindítva\n" + +#~ msgid "Web Server: Stopped\n" +#~ msgstr "Web kiszolgáló: leállítva\n" + +#~ msgid "Web Server: not running\n" +#~ msgstr "Web kiszolgáló: nem fut\n" + +#~ msgid "Can't load templates: Can't open file %s" +#~ msgstr "A sablont nem lehet betölteni: A '%s' fájlt nem lehet megnyitni" + +#~ msgid "" +#~ "Can't find template version number!\n" +#~ "Please replace aMule.tmpl with a newer version!" +#~ msgstr "" +#~ "A sablon verziószáma nem található!\n" +#~ "Kérlek cseréld ki az aMule.tmpl fájlt egy újabbra!" + +#~ msgid "Access denied!" +#~ msgstr "Hozzáférés megtagadva!" + +#~ msgid "Web Control Panel" +#~ msgstr "Web Vezérlőpanel" + +#~ msgid "Server list" +#~ msgstr "Kiszolgálók listája" + +#~ msgid "ED2K Link(s)" +#~ msgstr "ED2K Link(ek)" + +#~ msgid "Log" +#~ msgstr "Napló" + +#~ msgid "Serverinfo" +#~ msgstr "Kiszolgáló Infó" + +#~ msgid "Debug Log" +#~ msgstr "Hibakeresés napló" + +#~ msgid "Logout" +#~ msgstr "Kijelentkezés" + +#~ msgid "IP" +#~ msgstr "IP" + +#~ msgid "users" +#~ msgstr "felhasználók" + +#~ msgid "files" +#~ msgstr "fájlok" + +#~ msgid "Actions" +#~ msgstr "Műveletek" + +#~ msgid "Are you sure to remove this server from list?" +#~ msgstr "Biztos benne, hogy eltávolítja ezt a kiszolgálót a listáról?" + +#~ msgid "This ed2k link is invalid (%s)" +#~ msgstr "Ez az ed2k hivatkozás érvénytelen (%s)" + +#~ msgid "Got no response from aMule." +#~ msgstr "Nem jött válasz az aMule-től." + +#~ msgid "Downloaded total" +#~ msgstr "Összesen letöltve" + +#~ msgid "Uploaded total" +#~ msgstr "Összesen feltöltve" + +#~ msgid "Increase Priority" +#~ msgstr "Prioritás növelése" + +#~ msgid "Decrease Priority" +#~ msgstr "Prioritás csökkentése" + +#~ msgid "Internal error - no item in container" +#~ msgstr "Belső hiba - nincs semmi a tárolóban" + +#~ msgid "Hide Queue" +#~ msgstr "Várólista elrejtése" + +#~ msgid "Clear Completed" +#~ msgstr "Befejezettek eltávolítása" + +#~ msgid "Download Selected" +#~ msgstr "Kijelölt(ek) letöltése" + +#~ msgid "Time" +#~ msgstr "Idő" + +#~ msgid "Refetch graph data" +#~ msgstr "A grafikon adatainak újrakérése" + +#~ msgid "IP or Address" +#~ msgstr "IP vagy Cím" + +#~ msgid "Name" +#~ msgstr "Név" + +#~ msgid "Add to list" +#~ msgstr "Hozzáad a listához" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Web-based Search" +#~ msgstr "Web-alapú keresés" + +#~ msgid "File Settings" +#~ msgstr "Fájl tulajdonságok" + +#~ msgid "Max Sources Per File" +#~ msgstr "Max forrás / fájl" + +#~ msgid "Max. Connections" +#~ msgstr "Max. kapcsolatok" + +#~ msgid "Max. new connections / 5secs" +#~ msgstr "Max új kapcsolat / 5 mp" + +#~ msgid "Gzip Compression" +#~ msgstr "Gzip tömörítés" + +#~ msgid "Save traffic, especially in graphs." +#~ msgstr "Forgalom mentése, főleg grafikonként." + +#~ msgid "Enable or disable the display of waiting queue in transfer page." +#~ msgstr "" +#~ "Várólistások megjelenítésének engedélyezése vagy letiltása az átvitel " +#~ "oldalon." + +#~ msgid "Refresh-Time of Pages" +#~ msgstr "Oldalak fissítési ideje" + +#~ msgid "Time in seconds (zero=disabled)" +#~ msgstr "Idő mp-ben (0=letiltva)" + +#~ msgid "Statistics graphs' settings" +#~ msgstr "Statisztikai grafikonok beállításai" + +#~ msgid "Graph height" +#~ msgstr "A grafikon magassága" + +#~ msgid "Graph width" +#~ msgstr "A grafikon szélessége" + +#~ msgid "pixels" +#~ msgstr "képpont" + +#~ msgid "In the graph, each pixel represents" +#~ msgstr "A grafikonban minden képpont" + +#~ msgid "seconds" +#~ msgstr "másodperc" + +#~ msgid "Enter your password here" +#~ msgstr "Add meg a jelszavad" + +#~ msgid "Login Now" +#~ msgstr "Bejelentkezés" + +#~ msgid "Connected " +#~ msgstr "Csatlakozva" + +#~ msgid "Refetch Results" +#~ msgstr "Eredmények újra lekérdezése" + +#~ msgid "Min Availability" +#~ msgstr "Min. elérhetőség" + +#~ msgid "Method" +#~ msgstr "Mód" + +#~ msgid "Global (Server)" +#~ msgstr "Globális (Kiszolgáló)" diff --git a/po/insert-header.sin b/po/insert-header.sin new file mode 100644 index 00000000..b26de01f --- /dev/null +++ b/po/insert-header.sin @@ -0,0 +1,23 @@ +# Sed script that inserts the file called HEADER before the header entry. +# +# At each occurrence of a line starting with "msgid ", we execute the following +# commands. At the first occurrence, insert the file. At the following +# occurrences, do nothing. The distinction between the first and the following +# occurrences is achieved by looking at the hold space. +/^msgid /{ +x +# Test if the hold space is empty. +s/m/m/ +ta +# Yes it was empty. First occurrence. Read the file. +r HEADER +# Output the file's contents by reading the next line. But don't lose the +# current line while doing this. +g +N +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/po/it.po b/po/it.po new file mode 100644 index 00000000..384c4787 --- /dev/null +++ b/po/it.po @@ -0,0 +1,7211 @@ +# translation of it2.po to +# translation of it.po to +# translation of amule.po to Italian +# Italian language translation +# translation of source_strings.po to +# aMule i18n resource file. +# Copyright (C) 2004,2005 aMule Team +# This file is distributed under the same license as the aMule package. +# Kry , 2004,2005. +# ilbuio , 2004,2005. +# AnonimoVeneziano , 2004. +# GhePeU , 2004,2005. +# BELiAL , 2007. +# Vincenzo Reale , 2007. +# Giuseppe Bilotta , 2007. +# rik, 2008. +msgid "" +msgstr "" +"Project-Id-Version: it2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2008-02-28 17:16+0100\n" +"Last-Translator: rik \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.10.2\n" +"X-Poedit-Language: Italian\n" +"X-Poedit-Country: ITALY\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Devi specificare una password non vuota." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Password non valida, non è un hash MD5!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Connessione non riuscita" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "Connessione EC non riuscita. Risposta vuota." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "ExternalConn: accesso negato perché: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "ExternalConn: accesso negato" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "ExternalConn: risposta negativa dal server. Connessione chiusa." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Fatto! Connessione stabilita con aMule " + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Fatto! Connessione stabilita." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Hashing in corso" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "In completamento" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Completo" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "In pausa" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Errato" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Download in corso" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "In attesa" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Creo gli hash MD4 e AICH del file %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Creazione dell'hash MD4 per il file %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Creazione dell'hash AICH per il file %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "Conversione dei vecchi hashset AICH in '%s' a 64b: '%s'." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" +"ATTENZIONE: '%s' non è un nome di file valido ed è stato rinominato in '%s'." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "" +"ATTENZIONE: il file '%s' esiste già, il nuovo file sarà rinominato in '%s'." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" +"ATTENZIONE: impossibile rimuovere l'originale '%s' dopo aver creato il backup" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "ATTENZIONE: impossibile eliminare %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Impossibile ricevere i file condivisi dall'utente '%s'" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Sconosciuto" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (falso eMule versione %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (falso eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (falso eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (basato su eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Nickname: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, c-format +msgid "Requested: %s\n" +msgstr "Richiesto: %s\n" + +#: src/BaseClient.cpp:1878 +#, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Statistiche file per questa sessione: Accettati %d di %d richiesti, %s " +"trasferiti\n" +msgstr[1] "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" + +#: src/BaseClient.cpp:1881 +#, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Statistiche file per tutte le sezioni: Accettati %d di %d richiesti, %s " +"trasferiti\n" +msgstr[1] "" +"Statistiche file per tutte le sezioni: accettati %d di %d richiesti, %s " +"trasferiti\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Richiesto file sconosciuto" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "Client %s con IP:Porta %s:%d utilizza %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Nome utente" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Amici" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Mostra &dettagli" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Aggiungi amico" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Rimuovi amico" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Invia &messaggio" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Visualizza file" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Crea slot amico" + +#: src/FriendListCtrl.cpp:273 +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Sei sicuro di voler eliminare l'amico selezionato?" + +#: src/FriendListCtrl.cpp:275 +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Sei sicuro di voler eliminare gli amici selezionati?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Annulla" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"Non puoi assegnare più di uno slot amico.\n" +"Assegnato un solo slot." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Selezione multipla" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Nome file" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Dimensione" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Tipo" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Priorità" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "ID File" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Richieste" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Richieste accettate" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Dati trasferiti" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Rapporto di condivisione" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Parti ricevute" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Fonti complete" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Percorso cartella" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "File condivisi" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Molto bassa" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Bassa" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normale" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Alta" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Molto alta" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Release" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Auto" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Aggiungi commento/giudizio" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Modifica commento/giudizio" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Rinomina" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Aggiungi i file della collezione alla lista dei trasferimenti" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Copia &URI magnet negli appunti" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Copia co&llegamento ed2k negli appunti" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Copia collegamento ed2k negli appunti (&Source)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "Copia collegamento ed2k negli appunti (Source) (co&n opzioni Crypt)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Copia collegamento ed2k negli appunti (&Hostname)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "Copia collegamento ed2k negli appunti (Hostname) (con opzioni &Crypt)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Copia collegamento ed2k negli appunti (info &AICH)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Copia feedback negli appunti" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "Hai bisogno di un ID alto per creare un sourcelink valido" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Attenzione" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "File condivisi (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "File in scaricamento" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Inserisci un nuovo nome per questo file:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Rinomina file" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Ripristino invio del file: %s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Sospensione invio del file: %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: chiave di ricerca troppo corta" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Errore: non posso stare in ascolto sulla porta TCP." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "Richiesta non riuscita per l'errore: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "Richiesta non riuscita con errore sconosciuto." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "File indice non trovato: " + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Impossibile creare thread socket web\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Server web: avviato\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Sessione scaduta - accesso richiesto\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Sessione valida, utente registrato\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Sessione valida, utente registrato\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Nessuna sessione aperta - richiesta di accesso\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Sessione creata - richiesta di accesso\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Elaborazione richiesta [originale]: " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Verifica password\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Hash della password non valido\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Password valida\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Password errata\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "" +"Non hai inserito alcuna password e le password vuote non sono ammesse.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Disconnessione richiesta\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Elaborazione richiesta [rediretta]: " + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Carica modello " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Porta HTTP del webserver" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Usa il port forwarding UPnP per la porta del webserver" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "Porta UPnP" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Usa compressione gzip" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Password per l'accesso completo al webserver" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Password guest per il server web" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Permetti l'accesso guest" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Vieta l'accesso guest" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "Carica/salva le impostazioni del webserver da/su aMule remoto" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "Percorso del file di configurazione di aMule. Non usare direttamente!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "Disabilita interprete PHP (deprecato)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Ricompila pagine PHP ad ogni richiesta" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "Server web di aMule " + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Non disponibile" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Mai" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Scaricamento in corso..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Preferenze" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "Cartella contenente il file amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Sfoglia" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Inserire la cartella contenente il file amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Intervallo di aggiornamento in secondi" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Genera un'immagine delle statistiche ad ogni aggiornamento" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "Inserire la cartella nella quale generare l'immagine delle statistiche" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Carica periodicamente l'immagine delle statistiche sul server FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "URL FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "Percorso FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Inserire URL del tuo server FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "Inserire la directory del server FTP nella quale copiare l'immagine" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Utente" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Password" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Inserisci il nome utente per accedere al server FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Inserisci la password per accedere al server FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "Intervallo di aggiornamento FTP in minuti" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Verifica" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Cartella contenente il file di firma" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Cartella nella quale generare l'immagine" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i giorno(i) %i ora(e) %i minuto(i) %i s" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, statistiche in linea di aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Benvenuto!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Velocità di DL massima da quando wxCas è attivo" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "Velocità di DL massima nelle precedenti sessioni di wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Pulisci" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "Sistema" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Ferma aggiornamento automatico" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Salva immagine statistiche in linea" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Stampa immagine statistiche in linea" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Preferenze" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "Informazioni su wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Avvia aggiornamento automatico" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Aggiornamento automatico fermato" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Aggiornamento automatico avviato" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Salva immagine statistiche" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Nessun gestore per questo tipo di file." + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "Il file non è stato salvato" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "Statistiche in linea di aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"C'è stato un problema durante la stampa.\n" +"La stampante potrebbe non essere impostata correttamente?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Stampa in corso" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, Statistiche di firma in linea di aMule\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Basato su CAS di Pedro de Oliveira \n" +"\n" +"Distribuito con licenza GPL" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Oh Oh, aMule non è in esecuzione..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule è in funzione" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule è in esecuzione, ma è disconnesso" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule si sta connettendo..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Oh oh, stato di aMule sconosciuto..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr "è stato in funzione per " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " è fermo !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " non è connesso !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " si sta connettendo..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " sta facendo qualcosa di strano, controllare!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " è connesso a " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "ok" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "Firewalled" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "inattivo" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " è attivo " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +msgid " with " +msgstr " con " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Download totale: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Upload: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Download sessione: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Download: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr "kB/s, Upload: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +msgid " kB/s" +msgstr " kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Condivisione: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr "file, client in coda: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Tempo: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr "attivo " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Carico medio del sistema (1-5-15 min): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Uptime del sistema: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uG %02uore %02umin %02usec" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uore %02umin %02usec" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02umin %02usec" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "ID alto" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "ID basso" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Non connesso" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +msgid "Cancelled !" +msgstr "Anuulato !" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Impossibile aprire %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "" +"Il file %s è troppo grande per la rete eDonkey: dimensione massima 4 GB." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Parametri di ingresso" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "File da esaminare" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Aggiungi URL per questo file" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Inserisci il file di cui vuoi determinare il collegamento ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Inserisci qui l'URL che vuoi aggiungere al collegamento ed2k: inserisci / " +"alla fine affinché aLinkCreator lo aggiunga alla fine del nome del file" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Aggiungi" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Rimuovi" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Pulisci" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Crea collegamento con hash delle parti" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Aiuta a diffondere più in fretta i file nuovi e rari, al costo di una " +"connessione più lunga" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "Hash MD4" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "Hash ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "Collegamento ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Inizia" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Salva" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Copia negli appunti" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Esci" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Apri un file per calcolare il suo collegamento ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Copia collegamento ed2k calcolato negli appunti" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Salva collegamento ed2k appena calcolato in un file" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "Informazioni su aLinkCreator" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Seleziona il file di cui vuoi calcolare il collegamento ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "Non c'è niente da copiare per ora!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Seleziona il file per il link ed2k appena calcolato" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Impossibile aprire " + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Inserire un nome file non vuoto" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "Non c'è niente da salvare per ora!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, il creatore di collegamenti ed2k per aMule\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps da http://www.everaldo.com e http://www.icomania.com\n" +"e http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distribuito con licenza GPL" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Hashing..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Eseguito in %.2f s" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "Hai già aggiunto questo URL!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Inserire un URL non vuoto" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "Elaborazione del file numero %u: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "Hai richiesto l'hash delle parti (solo per file > 9.5 MB)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Attendere... " + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> File inesistente!\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, il generatore di collegamenti ed2k di aMule" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Auto [Bassa]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Auto [No]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Auto [Alta]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Connessione in corso" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Richiesta in corso" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Connessione in corso attraverso il server" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Coda piena" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "In coda" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Trasferimento" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Ricezione hashset in corso" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Nessuna parte utile" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Impossibile connettere un ID basso a un altro ID basso" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Troppe connessioni" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Connessione via Kad" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Troppe connessioni Kad" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Bannati" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Errore di connessione" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Coda piena" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "Vecchio MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "Nuovo MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "eMule compatibile" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Server locale" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Server remoto" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Scambio fonti" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Passiva" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Collegamento" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Fonti salvate" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Predefinita di sistema" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Arabo" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Basco" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Bulgaro" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Catalano" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Cinese (semplificato)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Cinese (tradizionale)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Croato" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "Ceco" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Danese" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Olandese" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Inglese (U.K.)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Estone" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Finlandese" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Francese" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Galiziano" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Tedesco" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "Greco" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Ungherese" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Italiano" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Italiano (Svizzera)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "Giapponese" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Coreano" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "Lituano" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "Norvegese (Nynorsk)" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Polacco" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portoghese" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Portoghese (brasiliano)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Russo" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Sloveno" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Spagnolo" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "Svedese" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Turco" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Impossibile determinare il browser selezionato!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" +"La porta TCP non può essere superiore a 65532 perché il socket UDP è fissato " +"a TCP+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Sarà usata la porta di predefinita (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Nome server" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Indirizzo" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Porta" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Descrizione" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Utenti" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "File" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Fallito" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Statico" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Versione" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Sei connesso al server che stai cercando di eliminare. Disconnettiti prima. " +"Il server NON è stato eliminato." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Info" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(nome sconosciuto)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Sei sicuro di voler eliminare il server statico %s?" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Sì" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "No" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Impossibile aprire '%s'" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Server (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Server" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Connesso al server" + +#: src/ServerListCtrl.cpp:428 +msgid "Mark server as static" +msgstr "Segna il server come statico" + +#: src/ServerListCtrl.cpp:429 +msgid "Mark server as non-static" +msgstr "Segna il server come non statico" + +#: src/ServerListCtrl.cpp:431 +msgid "Mark servers as static" +msgstr "Segna i server come statici" + +#: src/ServerListCtrl.cpp:432 +msgid "Mark servers as non-static" +msgstr "Segna i server come non statici" + +#: src/ServerListCtrl.cpp:438 +msgid "Remove server" +msgstr "Rimuovi il server" + +#: src/ServerListCtrl.cpp:440 +msgid "Remove servers" +msgstr "Rimuovi i server" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Rimuovi tutti i server" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Copia link ed2k negli appunti" + +#: src/ServerListCtrl.cpp:449 +msgid "Copy ED2k links to clipboard" +msgstr "Copia collegamenti ED2k negli appunti" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Riconnetti al server" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Sei sicuro di voler eliminare tutti i server?" + +#: src/ServerListCtrl.cpp:570 +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Sei sicuro di voler eliminare il server selezionato?" + +#: src/ServerListCtrl.cpp:572 +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Sei sicuro di voler eliminare i server selezionati?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Disabilitato [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "Questo è aMule %s basato su eMule." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "In esecuzione su %s" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" +"Visita http://www.amule.org per sapere se è disponibile una nuova versione." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Errore grave: impossibile creare il timer" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "Controllo remoto di aMule " + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Snapshot:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" +" Client p2p multipiattaforma basato su eMule \n" +"\n" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr " Sito Web: http://www.amule.org \n" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr " Forum: http://forum.amule.org \n" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" +" FAQ: http://wiki.amule.org \n" +"\n" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr " Contatti: admin@amule.org (questioni amministrative) \n" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr " Parte di aMule è basata su \n" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr " Kademlia: Peer-to-peer routing basato sulla metrica XOR.\n" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr " Copyright (C) 2002 Petar Maymounkov\n" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr " http://kademlia.scs.cs.nyu.edu\n" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Messaggio" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Messaggio di stato" + +#: src/amuleDlg.cpp:666 +msgid "ED2K: Connecting" +msgstr "ED2K: Connessione in corso" + +#: src/amuleDlg.cpp:670 +msgid "ED2K: Disconnected" +msgstr "ED2K: Disconnesso" + +#: src/amuleDlg.cpp:676 +msgid "Kad: Firewalled" +msgstr "Kad: Firewalled" + +#: src/amuleDlg.cpp:680 +msgid "Kad: Connected" +msgstr "Kad: Connesso" + +#: src/amuleDlg.cpp:685 +msgid "Kad: Connecting" +msgstr "Kad: Connessione in corso" + +#: src/amuleDlg.cpp:689 +msgid "Kad: Off" +msgstr "Kad: Spento" + +#: src/amuleDlg.cpp:718 +msgid "Stop the current connection attempts" +msgstr "Ferma i tentativi di connessione in corso" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Disconnetti" + +#: src/amuleDlg.cpp:722 +msgid "Disconnect from the currently connected networks" +msgstr "Disconnettiti dalla rete" + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Connetti" + +#: src/amuleDlg.cpp:726 +msgid "Connect to the currently enabled networks" +msgstr "Connettiti alle rete" + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Up: %.1f(%.1f) | Down: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Up: %.1f | Down: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | Connesso)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | Disconnesso)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Vuoi veramente uscire da aMule?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Chiedi conferma prima di uscire" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Non è possibile trovare il comando per lanciare il browser." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "La cartella delle skin '%s' non esiste" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "Attenzione: Impossibile leggere la skin dal file '%s'" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Reti" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Finestra reti" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Ricerca" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Finestra ricerche" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Trasferimenti" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Finestra trasferimenti" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Finestra file condivisi" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Messaggi" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Finestra messaggi" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Statistiche" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Finestra grafici e statistiche" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Finestra Preferenze" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Importazione" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "Strumento per l'importazione dei partfile" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "Informazioni" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "Informazioni/Aiuto" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Generale" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Connessione" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Proxy" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Filtro messaggi" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Controlli remoti" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Firma in linea" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Cartelle" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Sicurezza" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "Tweaks GUI" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Tweaks programma" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Eventi" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Debug" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Definito dall'utente" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"aMule deve essere riavviato per rendere effettive queste modifiche:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- Modifica della porta TCP.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- Modifica della porta UDP.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"La tua lista di aggiornamento automatico dei server è vuota.\n" +"L'opzione 'Aggiorna la lista dei server all'avvio' sarà disabilitata." + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"Hai abilitato le connessioni esterne senza però specificare una password.\n" +"Le connessioni esterne non possono essere abilitate a meno che tu non scelga " +"una password valida." + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- Modifica della lingua.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- Modifica della cartella Temp.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Up: 0.0 | Down: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"Le reti ed2k e Kad sono disabilitate.\n" +"Non potrai connetterti finché non ne abiliterai almeno una." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"Kad non può partire se la porta UDP è disabilitata.\n" +"Abilitala o disabilita Kad." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"DEVI riavviare aMule ADESSO.\n" +"Se non lo fai, non lamentarti se succede qualcosa di strano.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "ATTENZIONE" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"La tua lista di aggiornamento automatico dei server è vuota.\n" +"Inserisci l'URL di almeno un server valido nel file server.met.\n" +"Fai clic sul pulsante \"Lista\" per inserire l'URL." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "File temporanei" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "File completi" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Firme in linea" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Scegli una cartella per i %s" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Sfoglia file wav" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "File wav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Sfoglia per trovare un riproduttore video" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Scegli browser" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Eseguibile%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Modifica lista server" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Inserisci l'URL da cui scaricare il file server.met.\n" +"Solo un URL per riga." + +#: src/PrefsUnifiedDlg.cpp:980 +#, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Intervallo aggiornamento: %d secondo(i)" +msgstr[1] "Update delay: %d seconds" + +#: src/PrefsUnifiedDlg.cpp:987 +#, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Intervallo grafico della media: %d minuto(i)" +msgstr[1] "Time for average graph: %d minutes" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Scala grafico delle connessioni: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Intervallo aggiornamento : %d secondo(i)" +msgstr[1] "Update delay : %d seconds" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Dimensione buffer file: %d byte" +msgstr[1] "File Buffer Size: %d bytes" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Dimensione coda upload: %d client" +msgstr[1] "Upload Queue Size: %d clients" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Intervallo aggiornamento connessione ai server: %d minuto(i)" +msgstr[1] "Server connection refresh interval: %d minutes" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Intervallo aggiornamento connessione ai server: disabilitato" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Esegui comando se si verifica l'evento '%s'" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Abilita l'esecuzione del comando sul core" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Comando Core:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Abilita l'esecuzione del comando sulla GUI" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "Comando GUI:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "Le seguenti variabili saranno sostituite:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Tentativo di accesso non autorizzato. Connessione chiusa." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Connessione esterna chiusa." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "Connessioni esterne disabilitate perché la password è vuota!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "Connessioni esterne disabilitate nel file di configurazione" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Accettata nuova connessione esterna" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "ERRORE: impossibile accettare una nuova connessione esterna" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" +"Connessione esterna rifiutata perché la password nelle preferenze è vuota!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "Connessione al client: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Versione sconosciuta" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"ID della versione EC non corretto, potrebbe esserci un'incompatibilità " +"binaria. Usare core e client remoto dello stesso snapshot." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" +"Non puoi connetterti a una versione definitiva da una versione SVN " +"arbitraria! *sigh* possibile crash evitato" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "Autenticazione non riuscita." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Versione protocollo non valida." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Tag versione di protocollo mancante." + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Richiesta non valida, prima devi autenticarti." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Accesso consentito." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "Comando Partfile remoto fallito: hash del file non trovato: %s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "Hash del file non trovato: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "OOPS! errore nel processare l'opcode!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Server non aggiunto" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "server non trovato: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "è necessario definire il server da rimuovere" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "La rete ed2k è disabilitata nelle Preferenze." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "Ricerca in corso. Risultati in arrivo!" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "Non ha senso usare la ricerca Web da interfaccia remota." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "La rete Kad è disabilitata nelle Preferenze." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Niente punti per il grafico." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "Il tuo client non è configurato per questo livello di dettaglio." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "ExternalConn: richiesto spegnimento" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Sto già uscendo." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "ExternalConn: aggiungo il collegamento '%s'." + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Collegamento non valido o già nella lista." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "File non trovato." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Nome file non valido." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Impossibile rinominare il file." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Già connesso alla rete ed2k." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Connessione alla rete ed2k..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Già connesso alla rete Kad." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Connessione alla rete Kad..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Tutte le reti sono disabilitate." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Disconnesso dalla rete ed2k." + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Disconnesso dalla rete Kad." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "ExternalConn: ricevuto opcode non valido: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "Opcode non valido (versione errata del protocollo?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" +"Impossibile aprire il file (%s), rimosso dalla lista dei file condivisi." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "Hashset richiesto per il file sconosciuto: %s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "Il programma `%s' con pid `%d' e' terminato uscendo con stato `%d'." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "Server non aggiunto: non è stato specificato l'IP o il nome dell'host." + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "Server non aggiunto: porta del server specificata non valida." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "Stato ed2k:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Connesso" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Porta" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Stato Kademlia:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Attivo" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Stato:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Disconnesso" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Stato connessione:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Firewalled" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "OK" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Stato firewalled: " + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Connesso all'amico" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "Nessun amico" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Utenti medi:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "File medi:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "Non attivo" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Uptime: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Trasferimento" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Upload" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Dati inviati (sessione (totale)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Overhead totale (pacchetti): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Overhead per richieste file (pacchetti): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "Overhead per scambio fonti (pacchetti): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Overhead server (pacchetti): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Overhead Kad (pacchetti): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Upload attivi: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Upload in attesa: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Totale sessioni di upload riuscite: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Totale sessioni di upload fallite: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Tempo upload medio: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Download" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Dati scaricati (sessione (totale)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Fonti trovate: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Download attivi (parti): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Rapporto UL:DL sessione (totale): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Velocità di download media (sessione): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Velocità di upload media (sessione): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Velocità di download massima (sessione): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Velocità di upload massima (sessione): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Riconnessioni: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Tempo dal primo trasferimento: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Connesso al server da: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Connessioni attive (stima): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Limite massimo connessioni raggiunto: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Connessioni medie (stima): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Picco connessioni (stima): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Client" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Filtrati" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Totale: %i Conosciuti: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Server" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Server attivi: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Server falliti: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Totale: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Server rimossi: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Server filtrati: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Utenti su server attivi: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "File su server attivi: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Utenti totali: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "File totali: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Occupazione server: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Numero di file condivisi: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Dimensione totale file condivisi: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Dimensione media file: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "ID basso: %u (%.2f%% totale %.2f%% noti)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "Identificazione sicura On/Off: %u (%.2f%%) : %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Sistema operativo" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "Non ricevuto" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Taglia" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Copia" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Incolla" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Seleziona tutto" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "" +"Impossibile effettuare una ricerca sulla rete Kad senza esserci connessi" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "" +"Impossibile effettuare una ricerca sulla rete ed2k senza esserci connessi" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Errore imprevisto durante la ricerca su Kad: " + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "Messaggio da '%s' (IP:%s) filtrato" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "Nuovo messaggio da '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" +"L'utente %s (%u) ha richiesto la lista dei file condivisi -> richiesta " +"accettata" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" +"L'utente %s (%u) ha richiesto la lista dei file condivisi -> richiesta negata" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" +"L'utente %s (%u) ha richiesto la lista delle cartelle condivise -> richiesta " +"accettata" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" +"L'utente %s (%u) ha richiesto la lista delle cartelle condivise -> richiesta " +"negata" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"L'utente %s (%u) ha richiesto la lista dei file condivisi nella cartella %s -" +"> richiesta accettata" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"L'utente %s (%u) ha richiesto la lista dei file condivisi nella cartella %s -" +"> richiesta negata" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "L'utente %s (%u) condivide la cartella %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "" +"L'utente %s (%u) ha inviato una lista delle cartelle condivise non richiesta." + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" +"L'utente %s (%u) ha inviato la lista dei file condivisi nella cartella %s" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "L'utente %s (%u) ha finito di inviare la lista dei file condivisi" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "L'utente %s (%u) ha inviato una lista di file condivisi non richiesta" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" +"L'utente %s (%u) ha negato l'accesso alla lista dei file e cartellecondivisi" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Nodi (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "IP non valido per il bootstrap" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Porta non valida per il bootstrap" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Completa tutti i campi obbligatori" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Sei sicuro di voler scaricare un nuovo file nodes.dat?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" +"Così facendo, rimuoverai i nodi attuali e riavvierai la connessione Kademlia." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Continuare?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Errore: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Attenzione: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Aggiungi amico" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Inserire un indirizzo IP e una porta validi!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Informazione" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "L'hash utente specificato non è valido!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Fonti" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "File" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Download" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Categoria" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Principale" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Download nella categoria" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "Ricerca file simili (ED2k, local server)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "Segna come file conosciuto" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Connessione ad aMule remoto" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Connessione fallita " + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Errore" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"ATTENZIONE: Non puoi aggiungerti come fonte per un collegamento ed2k finché " +"avrai un ID basso." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Utenti: E: %s K: %s | File E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Tutto" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Utenti totali: %s | File totali: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Trasferiti" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Completati" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Velocità" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Avanzamento" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Stato" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Tempo rimanente" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Ultima fonte completa vista" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Ultima ricezione" + +#: src/DownloadListCtrl.cpp:578 +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Sei sicuri di voler eliminare il file selezionato?" + +#: src/DownloadListCtrl.cpp:580 +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Sei sicuro di volere eliminare i file selezionati?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Invia messaggio all'utente" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Messaggio da inviare:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "Fer&ma" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Pausa" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Continua" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "&Rimuovi file completati" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Sposta ogni A4AF su questo file" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Sposta ogni A4AF su questo file (Auto)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Sposta ogni A4AF sugli altri file" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Opzioni avanzate" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Anteprima" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Mostra &dettagli file" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Mostra tutti i commenti" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Copia URI magnet negli appunti" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "rimuovi" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Assegna a categoria" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "&Apri file" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Elimina dagli amici" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Inserisci tra gli amici" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Invia messaggio" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Sposta su questo file" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "QR: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Altro file richiesto" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Download (%i)" + +#: src/DownloadListCtrl.cpp:2222 +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"Seleziona il tuo lettore video preferito nelle preferenze.\n" +"Nel frattempo, aMule tenterà di utilizzare mplayer e riceverai questo avviso " +"ad ogni anteprima" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Anteprima" + +#: src/DownloadListCtrl.cpp:2260 +#, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "" +"ERRORE: Impossibile eseguire il lettore multimediale esterno! Comando: `%s'" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "ERRORE: Impossibile aprire il partfile)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "ERRORE: impossibile creare il file .part)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "Caricamento del backup del file met da %s" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "ERRORE: impossibile aprire il file part.met: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "ERRORE: il file part.met è di dimensione 0: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "ERRORE: versione del file part.met non valida: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" +"ERRORE: %s (%s) è danneggiato (tagcount non corretto), impossibile caricare " +"il file." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "Tentativo di recupero informazioni sul file..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" +"Recupero file senza nome - tentativo di recupero come RecoveredFile.dat" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" +"Recuperate tutte le informazioni disponibili :D - Tentativo di utilizzo in " +"corso..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Impossibile recuperare le informazioni sul file :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Impossibile aprire %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "ATTENZIONE: %s potrebbe essere danneggiato (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "Errore durante il salvataggio del file incompleto: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" +"Non è possibile recuperare la lunghezza di '%s' - utilizzando il file %s." + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "'%s' è per qualche motivo di dimensione 0 - uso il file %s." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "Impossibile salvare il file part.met.seeds per %s" + +#: src/PartFile.cpp:1019 +#, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "Salvate %i fonti per il file incompleto: %s (%s)" +msgstr[1] "Saved %i source seeds for partfile: %s (%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "Il file incompleto %s (%s) non ha file delle fonti" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "Il file incompleto %s (%s) ha un file delle fonti vuoto" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "Errore nella lettura del file delle fonti del partfile (%s - %s): %s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"Trovata parte danneggiata (%d) su %d parti totali %s - FileResultHash |%s| " +"FileHash |%s|" +msgstr[1] "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "Trovata parte completata (%i) in %s" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "Nuovo hashing completato %s" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "" +"Si è verificato un errore inaspettato nel completamento del file %s. File in " +"pausa" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Download completato: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "Cancellazione file: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" +"ATTENZIONE: impossibile fare l'hash della parte scaricata - hashet " +"incompleto per '%s'" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"ERRORE: impossibile calcolare l'hash del file part scaricato - hashset " +"incompleto (%s). Ciò non dovrebbe mai accadere" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "" +"ATTENZIONE: non c'è abbastanza spazio libero su disco! Metto in pausa il " +"file: %s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "La parte di file scaricata %i è danneggiata in: %s" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH: recuperata parte danneggiata %i in %s -> risparmiati byte: %s" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Spazio su disco insufficiente" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Fermo" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "Attenzione: impossibile aprire known.met." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" +"Attenzione: lista dei file conosciuti danneggiata, potrebbe contenere un " +"header non valido." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "Errore IO durante la lettura del file known.met: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "Errore nel salvataggio del file known.met: %s" + +#: src/SharedFileList.cpp:352 +#, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "Trovati %i file condivisi conosciuti" +msgstr[1] "Found %i known shared files" + +#: src/SharedFileList.cpp:358 +#, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "Trovati %i file conosciuti, %i conosciuti" +msgstr[1] "Found %i known shared files, %i unknown" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "ERRORE! Tentativo di condividere %s" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Commenti file" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Giudizio" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Commento" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Nessun commento" + +#: src/CommentDialogLst.cpp:104 +#, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%u commento(i)" +msgstr[1] "%u comments" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"Impossibile collegarsi ai server con offuscamento di protocollo. Ci riprovo " +"senza offuscamento." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "" +"Impossibile connettersi a tutti i server in lista. Procedo con un altro " +"tentativo." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "Rete ed2k disattivata dalle opzioni, non stabilisco la connessione." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "" +"Nella lista dei server non è stato trovato nessun server valido a cui " +"connettersi" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Connesso a %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Connessione stabilita con: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"Errore grave durante il tentativo di connessione. La connessione a Internet " +"potrebbe non essere attiva" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Persa connessione a %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) sembra non essere attivo." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) sembra essere pieno." + +#: src/ServerConnect.cpp:391 +#, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "Riconnessione automatica al server tra %d secondo(i)" +msgstr[1] "Automatic connection to server will retry in %d seconds" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Connessione persa" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "Connessione a %s (%s:%i) non riuscita." + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "ERRORE: socket invalido in sede di controllo di timeout" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "Connessione a %s (%s:%i) non riuscita per time-out." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" +"Errore: Impossibile caricare il file di backup. Cerca su http://forum.amule." +"org come recuperare i file .part.met." + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Non è stato trovato alcun file incompleto" + +#: src/DownloadQueue.cpp:175 +#, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "Trovato(i) %u file parziale(i)" +msgstr[1] "Found %u part files" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Download di %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Stai già cercando di scaricare il file '%s'" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Hai già il file '%s'" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Stai già cercando di scaricare il file '%s'" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "Non riesco a convertire il collegamento magnet in ed2k: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "Protocollo del link %s sconosciuto" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Link ed2k non valido! Errore: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "Esegui e esci." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Formato IP non valido. Usa xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" +"Questo comando richiede un argomento. Argomenti validi sono: 'all', nome " +"file, or un numero.\n" + +#: src/TextClient.cpp:343 +msgid "Processing by hash: " +msgstr "Elaborazione dell' hash: " + +#: src/TextClient.cpp:358 +msgid "Processing by filename: " +msgstr "Elaborazione del file: " + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" +"Questo comando richiede un argomento. Argomenti validi: un file hash.\n" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Non è un numero valido\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "Non è un hash valido (la lunghezza deve essere di 32 caratteri)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "Operazione conclusa con successo." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "Richiesta fallita con il seguente errore: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "Filtraggio IP per i client: %s.\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "OFF" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "ON" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "Filtraggio IP per i server: %s.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "Il livello IPFilter attuale è %d\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Limiti di banda: Up: %u kB/s, Down: %u kB/s\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ed2k" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Connesso a %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "con ID basso" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "con ID alto" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Connessione in corso" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Non connesso" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Download:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Upload:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Client in coda:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Fonti totali:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Totale risultati della ricerca: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "TODO - visualizzare l'avanzamento della ricerca" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Ricevuta risposta sconosciuta dal server, OpCode = %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Mostra informazione sullo stato." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "" +"Mostra stato connessione, velocità di upload e download attuali, etc.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Mostra le statistiche complete." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"Opzionalmente, un numero compreso tra 0 e 255 può essere passato come " +"argomento a questo\n" +"comando, per indicare quante versioni mostrare nel sottoalbero dei client. 0 " +"oppure\n" +"nessun numero significa 'infinite'.\n" +"Esempio: 'statistics 5' mostrerà solo le cinque versioni più diffuse per " +"ogni tipo di client.\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "Chiudi aMule." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Spegnimento del core remoto (amule/amuled).\n" +"Questo chiuderà anche il client testuale, che non è utilizzabile\n" +"senza un core.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Ricarica l'oggetto." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "Ricarica la lista dei file condivisi." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "Ricarica il filtro IP da file." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Connessione al network." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"Questo connetterà aMule a tutte le reti attualmente abilitate nelle " +"Preferenze.\n" +"E' anche possibile specificare l'indirizzo IP, nella forma IP:Porta, di un " +"server e\n" +"connettersi solamente a quello. Si può utilizzare un indirizzo IPv4 oppure\n" +"un nome risolvibile da un server DNS." + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Connetti solo alla rete ed2k." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Connetti solo alla rete Kad." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Disconnetti dalla rete." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "Questo disconnetterà aMule da tutte le reti attive.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Disconnetti solo dalla rete ed2k." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Disconnetti solo dalla rete Kad." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Aggiungi un link ed2k o magnet al core." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"Il link ed2k da aggiungere può essere:\n" +"*) un file (ed2k://|file|...), e sarà aggiunto alla coda dei download,\n" +"*) un server (ed2k://|server|...), e sarà aggiunto alla lista dei server,\n" +"*) una lista di server, e tutti i server saranno aggiunti alla lista " +"attuale \n" +"\n" +"Il link magnet deve contenere anche l'hash ed2k e la lunghezza del file.\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Imposta un valore delle preferenze." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "Imposta le preferenze del Filtro IP." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "Attiva il filtro IP per client e server." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "Disattiva il filtro IP per client e server." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "Attiva/Disabilita il filtro IP per i client." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "Attiva il filtro IP per i client." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "Disattiva il filtro IP per i client." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "Attiva/Disabilita il filtro IP per i server." + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "Attiva il filtro IP per i server." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "Disabilita il filtro IP per i server." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "Seleziona il livello del filtraggio degli IP." + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"I livelli di filtraggio validi vanno da 0 a 255 e il default (iniziale)\n" +"è 127.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Imposta limiti di banda." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "" +"Il valore fornito a questi comandi deve essere in kilobyte al secondo.\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Imposta limiti di banda per l'upload." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "Imposta limiti di banda per il download." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Visualizza un'impostazione delle preferenze." + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "Visualizza impostazioni del filtro IP." + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "Ottieni stato del filtro IP per client e server." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "Ottieni stato del filtro IP per i client." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "Ottieni stato del filtro IP per i server." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "Visualizza livello del filtro IP." + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Visualizza limita di banda." + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Effettua una ricerca." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"E' necessario specificare il TIPO della ricerca che può essere:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Esempio: 'search kad file' cercherà \"file\" nella rete Kad.\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Effettua una ricerca globale." + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Effettua una ricerca locale" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Effettua una ricerca su Kad" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Mostra risultati dell'ultima ricerca." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Rende i risultati della ricerca precedente.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "Mostra lo stato d'avanzamento della ricerca." + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "Mostra lo stato d'avanzamento della ricerca.\n" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Scarica un file" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"Bisogna fornire il numero del file relativo all'ultima ricerca.\n" +"Esempio: 'download 12' aggiungerà alla coda dei download il file col numero " +"12 trovato dall'ultima ricerca.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Metti il download in pausa." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Riavvia download." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Annulla download." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Imposta priorità del download." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "Imposta la priorità del download a Bassa, Normale, Alta o Auto.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "Imposta priorità a Bassa." + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "Imposta priorità a Normale." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "Imposta priorità a Alta." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "Imposta priorità a Auto." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Mostra code/liste." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Mostra la coda di upload/download, la lista dei server o la lista dei file " +"condivisi.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Mostra la coda di upload." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Mostra la coda di download." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Mostra log." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Mostra la lista dei server." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Cancella log." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "Comando obsoleto, ora '%s'." + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" +"Questo è un comando obsoleto, e in futuro potrebbe essere rimosso.\n" +"Al suo posto usa '%s'.\n" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() ha restituito NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "ERRORE: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "ATTENZIONE: %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Il nuovo clientID è %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "ATTENZIONE: hai ricevuto un ID basso!" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "\tProbabilmente perché il tuo pc è dietro un firewall o router." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tPer altre informazioni visita http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "Ricevute informazioni sconosciute dal server! - troppo corto" + +#: src/ServerSocket.cpp:539 +#, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "Ricevuto(i) %d nuovo(i) server" +msgstr[1] "Received %d new servers" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Salvataggio della lista dei server completato." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "Il server ha rifiutato l'ultimo comando" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Pacchetto bogus ricevuto dal server: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "Errore non gestito durante l'elaborazione del pacchetto dal server: %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "" +"Non è possibile creare un thread per risolvere il DNS per connettersi a %s" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "L'ip del server %s (%s) è filtrato. Connessione bloccata." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "utilizzo offuscamento del protocollo." + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "Connessione a %s (%s - %s:%i) %s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "" +"Non è possibile risolvere il DNS per il server %s: impossibile connettersi!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "CIP2Country::CIP2Country(): Impossibile ottenere i dati sul Paese da " + +#: src/IP2Country.cpp:73 +#, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "Caricati %d flag bitmap." +msgstr[1] "Loaded %d flag bitmaps." + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"Sei sicuro di voler interrompere e rimuovere tutti i file contenuti in " +"questa categoria?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Conferma richiesta" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Tutto il resto" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Incompleti" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Attivo" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Video" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Audio" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Archivi" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "Immagini CD" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Immagini" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Testo" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Seleziona filtro di visualizzazione" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Aggiungi categoria" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Modifica categoria" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Elimina categoria" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "Importazione %s: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "Lettura cartella dei file temporanei" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "Recupero informazioni di base dal file info del download" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "Creazione file di destinazione" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "Caricamento dati da vecchio file in download (%u su %u)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "Salvataggio blocchi di dati in un singolo file (%u su %u)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "Recupero informazioni fonti e file in download in corso" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "Aggiunta download e salvataggio nuovo partfile in corso" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Verifica stato..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "In corso" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Errore: spazio su disco terminato" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Errore: Partmet non trovato" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Errore: errore IO!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Errore: non riuscito!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "In coda" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Download già in corso" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Formato del file temp sconosciuto o errato." + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Nome file" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Stato" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Filehash" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Importa partfile" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"Scegli una cartella in cui cercare download temporanei! (le sottocartelle " +"saranno incluse)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" +"Vuoi che le fonti per i download importati con successo siano eliminate?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Rimuovere le fonti?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "In attesa..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (Disco: %s)" + +#: src/OtherFunctions.cpp:121 +msgid "byte" +msgid_plural "bytes" +msgstr[0] "byte" +msgstr[1] "bytes" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "byte/s" +msgstr[1] "bytes/sec" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "sec" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "min" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "ore" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "giorni" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Video" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Archivi" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Testi" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programmi" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Qualsiasi" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Senza voto" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Non valido / Danneggiato / Falso" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Mediocre" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Discreto" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Buono" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Eccellente" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "tutti" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "tutti gli altri" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "Carico i filtri IP da 'ipfilter.dat' e 'ipfilter_static.dat'." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" +"Impossibile caricare il file ipfilter.dat '%s', trovato formato sconosciuto." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" +"Impossibile caricare il file ipfilter.dat '%s', impossibile aprire il file." + +#: src/IPFilter.cpp:330 +#, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "Caricati %u intervalli di indirizzi IP da '%s'." +msgstr[1] "Loaded %u IP-ranges from '%s'." + +#: src/IPFilter.cpp:332 +#, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "%u righe non valide sono state scartate." +msgstr[1] "%u malformed lines were discarded." + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Connessioni attive (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Dettagli file" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% completato" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "Collegamento ed2k: " + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Invia" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" +"Fai clic qui per aggiungere il link ed2k nella casella di testo alla tua " +"coda di download." + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "Testo di stato a comparsa" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Caricamento in corso..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"Gli eventi sono visualizzati qui. Per la lista completa, controllare il log " +"nella scheda dei Server." + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Numero di utenti presenti sul server al quale sei connesso..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Utenti: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "Utenti connessi al server attuale e stima del numero totale di utenti." + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"Medie attuali di upload e download. Se l'opzione è stata abilitata i numeri " +"tra parentesi indicano l'overhead dovuto alla comunicazione tra client." + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"Mostra lo stato attuale di connessione e i trasferimenti attivi. Le frecce " +"rosse indicano che attualmente non sei connesso, le frecce gialle indicano " +"che hai un ID basso (probabilmente il tuo pc è dietro un firewall) e le " +"frecce verdi indicano che hai un ID alto (la miglior connessione possibile)." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Non connesso..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Server attualmente connesso." + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Cerca" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Nome:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Locale" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Globale" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "FileHash" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Parametri avanzati" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Filtraggio" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Tipo file" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Estensione" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Dimensione minima" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Byte" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Dimensione massima" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Disponibilità" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Filtro:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Filtra risultati" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Inverti risultati" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Nascondi file conosciuti" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Ancora" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "Ricerca per più risultati su ed2k. Non ancora supportata da Kad." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Ferma" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Azzera campi" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Risultati" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Rimuovi download completati" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Mostra Upload / Coda Upload / Client" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Client in coda:" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Invia" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Invia messaggio specificato." + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Chiudi" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Chiude questa sessione di chat." + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Nome completo:" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "N/D" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "File met:" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Hash:" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Dimensione file:" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Stato file part:" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Ultima volta visto completo:" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Fonti trovate:" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Fonti in trasferimento:" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Numero parti:" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Disponibili:" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Velocità:" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Download Active Time: " + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Trasferiti:" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Completati:" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Intelligent Corruption Handling" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Perdita per corruzione:" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Guadagno per compressione:" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "Pacchetti recuperati da ICH:" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Nomi file" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Sovrascrivi" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Pulisci" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Applica" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Ok" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "Commenta/Giudica il file (il testo sarà visibile a tutti gli utenti)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"Per un film puoi indicare la lunghezza, la trama, la lingua...\n" +"e, se è un falso, puoi farlo presente agli altri utenti di aMule." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Qualità file" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" +"Giudica il file o avvisa gli altri utenti se il file non è quello corretto..." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Nessun commento" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Aggiorna" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Download in corso, attendere..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Dimensione sconosciuta" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Informazioni richieste" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "Indirizzo IP:" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Porta:" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Informazioni aggiuntive" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Nome utente:" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Hash utente:" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Ricarica file condivisi" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Sessione corrente" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Totale" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Richiesto:" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Upload attivi:" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Velocità download" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Corrente" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Media attuale" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Media sessione" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Velocità upload" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Connessioni" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Download attivi" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Connessioni attive (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Upload attivi" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Albero statistiche" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Nome utente:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Hash utente:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Software client:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Versione client:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "Indirizzo IP:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "ID utente:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "IP server:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Nome server:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "Trasferimenti al client" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Richiesta attuale:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Velocità media upload:" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Velocità media download:" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Inviati nella sessione:" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Scaricati nella sessione:" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Inviati in totale:" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Scaricati in totale:" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Punteggi" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "Modificatore DL/UL:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Identificazione sicura:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Giudizio (totale):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Punteggio in coda:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Impostazioni generali" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Nick" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - il mulo per Linux" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "" +"Questo è il nome che gli altri utenti visualizzeranno quando saranno " +"connessi a te." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Lingua" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "Scelta della lingua utilizzata." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Altre opzioni" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Verifica la disponibilità di nuove versioni all'avvio" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" +"Abilitare questa opzione farà sì che aMule all'avvio verifichi la " +"disponibilità di nuove versioni" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Avvia ridotto ad icona" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "" +"Abilitando questa opzione, aMule si minimizzerà automaticamente all'avvio." + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Chiedi conferma prima di uscire" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "Fa sì che aMule chieda conferma prima di uscire." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Abilita icona nel systray" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "" +"Abilita o disabilita l'icona nella system tray o nella barra delle " +"applicazioni." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "Icona per la system tray" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" +"Abilitando questa opzione aMule verrà minimizzato nella system tray invece " +"che nella barra delle applicazioni." + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Ritardo dei suggerimenti in secondi" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "Intervallo di tempo prima che vengano mostrati i suggerimenti." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Selezione browser" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Seleziona il tuo browser" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Browser personalizzato:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Inserisci il nome del tuo browser. Per usare un browser diverso, seleziona " +"Browser personalizzato dal menu a tendina." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Apri in una nuova scheda se possibile" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" +"Se possibile, apri la pagina web in una nuova scheda invece che in una nuova " +"finestra" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Limiti banda" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Upload" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Allocazione slot" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Capacità linea" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" +"Nota: Questi valori sono\n" +"usati solo per le statistiche." + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Porta TCP standard del client:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "Questa è la porta ed2k standard e non può essere disabilitata." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Porta UDP avanzata del client:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "Questa porta UDP è usata per richieste ed2k avanzate e per la rete Kad" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "disabilita" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Bind Address" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "Porta UDP per le richieste estese del server (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Fonti massime per file" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Limite massimo" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Limiti connessione" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Connessioni massime" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Universal Plug and Play" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "Attiva UPnP" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "Porta TCP per UPnP:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Connetti automaticamente all'avvio" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Riconnetti dopo perdita connessione" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Mostra overhead banda" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Opzioni server" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Rimuovi server inattivi dopo" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "tentativi" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Aggiorna lista server all'avvio" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Lista" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Aggiorna lista server quando ci si connette ad un server" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Aggiorna lista server quando un client si connette" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Usa sistema di priorità" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Usa controllo intelligente dell'ID basso in fase di connessione" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Connessione sicura" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Connetti automaticamente solo ai server statici" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Assegna priorità alta ai server aggiunti manualmente" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "ICH attivo" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICH si fida di ogni hash (sconsigliato)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Aggiungi i nuovi file da scaricare mettendoli in pausa" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Aggiungi i nuovi file da scaricare con priorità automatica" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Cerca di scaricare prima la parte iniziale e finale del file" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Assegna priorità automatica ai nuovi file condivisi" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Cerca di trasferire parti complete per ogni upload" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Avvia un file in pausa quando un altro file è stato completato" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "Della stessa categoria" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "Salva 10 fonti per i file rari (< 20 fonti)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Spazio disco" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Verifica spazio disco" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "" +"Seleziona questa opzione per far verificare ad aMule lo spazio su disco" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Spazio su disco minimo:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Inserire lo spazio disco minimo desiderato." + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Cartella dei file scaricati:" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Cartella dei file temporanei:" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Cartelle condivise" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "" +"(fai clic con il tasto destro sulle icone per condividere ricorsivamente)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Condividi file nascosti" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Riproduttore video" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Crea copia di backup per l'anteprima" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Grafici" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Intervallo di aggiornamento: 5 secondi" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Intervallo grafico valori medi: 100 minuti" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Scala grafico connessioni: 100 " + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Seleziona colori statistiche" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Sfondo" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Griglia" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Download attuale" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Media download in corso" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Media sessione di download" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Upload attuale" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Media upload in corso" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Media sessione di upload" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Connessioni attive" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Barra della velocità nell'icona systray" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Nodi Kad attuali" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Nodi Kad attivi" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Nodi Kad nella sessione" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Seleziona" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Numero di versioni di client visualizzate (0=illimitate)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Notifiche" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Messaggi a comparsa" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Usa suono" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Mostra finestra di a comparsa in caso di:" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Nuovo messaggio nel log" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Nuova sessione di chat" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Ricezione nuovo messaggio" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Aggiunta o conclusione di un download" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Nuova versione di aMule disponibile" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "OOD Urgente, persa connessione al server" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Notifica tramite mail" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Invia email quando il download è completo." + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "Server SMTP:" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "Indirizzo email:" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! ATTENZIONE !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Non modificare queste impostazioni se non sai\n" +"esattamente cosa stai facendo: potresti ottenere\n" +"effetti indesiderati.\n" +"\n" +"aMule funzionerà anche senza modificare questi parametri." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Impostazioni avanzate" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Numero massimo nuove connessioni / 5 secondi" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Dimensione buffer file: 240000 byte" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Dimensione coda upload: 5000 client" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Intervallo aggiornamento connessione al server: disabilitato" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "Tweaks GUI" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Avanzamento coda download" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Mostra percentuale" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Mostra barra di avanzamento" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Stile barra di avanzamento" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Piatta" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Arrotondata" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Supporto skin" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Abilita il supporto per le skin" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Skin:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- nessuna skin disponibile -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Ordinamento colonne" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "Ordina automaticamente i file in download (elevato uso CPU)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "aMule ordinerà automaticamente le colonne nella lista dei download" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Tweaks GUI vari" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Mostra gestore rapido di link ed2k" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Mostra informazioni estese sulle schede delle categorie" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Mostra velocità di trasferimento nella barra del titolo" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Orientamento verticale della barra degli strumenti" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Visualizza il numero del partfile prima del nome del file" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Controlli remoti" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Parametri server web" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Lancia amuleweb all'avvio" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Porta server web" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "Utilizza il port forwarding UPnP sulla porta del server web" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Porta TCP del server web UPnP" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Intervallo di aggiornamento pagina (in sec)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Abilita compressione gzip" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Abilita utente con diritti limitati" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Password per diritti completi" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Password per diritti limitati" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Modello web" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Parametri connessioni esterne" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Accetta connessioni esterne" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"IP dell'interfaccia in ascolto\n" +"(o vuoto per qualunque ip)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Inserisci un IP valido nel formato a.b.c.d per l'interfaccia di ascolto EC. " +"Lasciare il campo vuoto o inserire 0.0.0.0 significa qualsiasi interfaccia." + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "Porta TCP" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "Abilita il port forwarding UPnP sulla porta EC" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "Fai clic qui per applicare le modifiche apportate alle impostazioni." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Annulla ogni modifica alle preferenze." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Titolo:" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Commento:" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Cartella file scaricati:" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Cambia priorità per i nuovi file assegnati:" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Non cambiare" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Seleziona colore per questa categoria (attualmente selezionata):" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Mostra motd del server alla connessione..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Informazioni server" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Fai clic su questo pulsante per cancellare il log." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "Log di aMule" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "Fai clic qui per aggiornare la lista dei server dall'indirizzo..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Lista server" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Inserisci l'url di un file server.met e premi il pulsante a sinistra per " +"aggiornare la lista dei server conosciuti." + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Aggiungi server: nome" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Inserisci qui il nome di un nuovo server" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Inserisci qui l'IP del server, nel formato x.x.x.x." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Inserisci qui la porta del server." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "Aggiungi server (riempi campi a sinistra)..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "Informazioni ed2k" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Informazioni Kad" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"La lingua selezionata sembra non essere installata\n" +"Non sarà dunque possibile selezionare questa lingua.\n" +"Nei sistemi linux verificare il file /etc/locale.gen e il programma " +"'locales'\n" +"Buona fortuna!\n" +"(NB: aMule proverà comunque a impostare la lingua selezionata)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Non mostrare più" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "" +"Fai clic su questo pulsante per aggiornare la lista dei nodi da un URL..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Nodi (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"Inserisci l'URL di un file nodes.dat e premi il pulsante a sinistra per " +"aggiornare la lista dei nodi conosciuti." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Statistiche nodi" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Bootstrap" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Nuovo nodo" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Porta:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Bootstrap da\n" +"client noti" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Disconnetti rete Kad" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Offuscamento del protocollo" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Supporta offuscamento del protocollo" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"Questa opzione abilita l'offuscamento del protocollo, e fa sì che aMule " +"accetti connessioni offuscate dagli altri client." + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Utilizza offuscamento per le connessioni in uscita" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"Questa opzione fa sì che aMule utilizzi l'offuscamento del protocollo quando " +"si collega ad altri client/server." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Accetta SOLO connessioni offuscate" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"Attivando questa opzione aMule accetterà solo connessioni offuscate. Avrai " +"meno fonti, ma tutto il tuo traffico sarà offuscato" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Opzioni file" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Chiunque" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Nessuno" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Chi può vedere i file condivisi:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "" +"Seleziona chi può richiedere di vedere la lista dei tuoi file condivisi." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "Filtraggio IP" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Filtra i client" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "Filtra i client in base agli ip contenuti in ~/.aMule/ipfilter.dat." + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Filtra i server" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "Filtra i server in base agli ip contenuti in ~/.aMule/ipfilter.dat." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Ricarica lista" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "Ricarica lista degli IP da filtrare dal file ~/.aMule/ipfilter.dat" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Aggiorna ora" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Aggiorna ipfilter all'avvio" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Livello filtraggio:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Filtra sempre gli IP di una LAN" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Gestione paranoica degli IP non corrispondenti" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Rifiuta pacchetto se l'IP del Client è diverso dall'IP da cui arriva il " +"pacchetto. Utilizzare con cautela." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "Usa l'ipfilter.dat di sistema se disponibile" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" +"Se un file ipfilter.dat locale non viene trovato, consenti l'utilizzo del " +"file ipfilter.dat di sistema." + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "Usa l'Identificazione Sicura Utente" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" +"E' consigliato attivare questa opzione. Non riceverai crediti se l'ISU non è " +"abilitata." + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Abilita/Disabilita" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Abilita firma in linea" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Abilita la scrittura del file OS che può essere usato da applicazioni " +"esterne per creare firme e simili." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Frequenza di aggiornamento (secondi):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "" +"Cambia la frequenza (in secondi) degli aggiornamenti della firma in linea." + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Cartella firma in linea:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" +"Fai clic qui per selezionare la cartella che contiene i file di firma in " +"linea." + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Disabilita/Abilita" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "Filtra messaggi in arrivo (tranne per la chat in corso):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Opzioni filtro:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Filtra tutti i messaggi" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Filtra i messaggi da utenti che non sono nella tua lista degli amici" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Filtra i messaggi da client sconosciuti" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Filtra i messaggi che contengono (usa ',' come separatore):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"aggiungi qui le parole che aMule filtrerà rimuovendo i messaggi che le " +"contengono" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Commenti" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "Filtra i commenti che contengono (usa ',' come separatore):" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Abilita proxy" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Abilita o disabilita il supporto proxy" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Tipo proxy:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "Il tipo di proxy a cui ti stai connettendo" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Indirizzo proxy:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "Il nome host del proxy" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Porta proxy:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "La porta del proxy" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Autenticazione" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Abilita autenticazione" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Abilita o disabilita l'autenticazione con nome utente e password" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "Il nome utente utilizzato per la connessione al proxy" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Password:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "La password usata per la connessione al proxy" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Connessione automatica al server senza proxy" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Connetti a:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Login su aMule remoto" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Nome utente" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Ricorda impostazioni" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Abilita il log dettagliato dei messaggi di debug." + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "Categorie messaggi:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "Aggiunge importazioni" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Riprova selezionati" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Rimuovi selezionati" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Tipi di eventi" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Connetti a qualsiasi server e/o a Kad" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Nuova categoria" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Scegli una cartella per i file scaricati" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Devi specificare un nome per la categoria!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Devi specificare un percorso per la categoria!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"Impossibile creare una cartella per i file in ingresso per questa categoria. " +"Specifica un percorso valido!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "Estensione '%s' sconosciuta per il comando '%s'.\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "Comando sconosciuto '%s'.\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"Questo comando non può avere un argomento.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"Questo comando richiede un argomento.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Questo comando è incompleto, devi usare una delle estensioni qui riportate.\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Estensioni disponibili:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Comandi disponibili:\n" + +#: src/ExternalConnector.cpp:188 +#, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"Tutti i comandi possono essere digitati in maiuscolo e minuscolo.\n" +"Scrivi '%s ' per avere informazioni dettagliate su un .\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Esce dall'applicazione." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Mostra aiuto." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"Per avere aiuto su un comando, digitare 'help '.\n" +"Per avere la lista completa dei comandi, digitare 'help'.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"Usa '%s' per la lista dei comandi\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Errore di sintassi!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Errore nell'eseguire il comando - ciò non dovrebbe mai accadere! Segnala il " +"bug\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Questo comando non deve avere parametri." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Questo comando richiede un parametro." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Argomento non valido." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Questo comando è incompleto." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Digita '%s' per avere altro aiuto.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "Questo è %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "Questo è %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Creazione del client in corso...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "Connessione fallita. Impossibile connettersi all'host specificato\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"Ok, uscita in corso da %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"Non posso connettermi con una password vuota.\n" +"Devi specificare una password nel file di configurazione oppure\n" +"nella linea di comando, o inserirne una quando richiesto.\n" +"\n" +"Sto uscendo...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Mostra questo suggerimento." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "Host su cui aMule è in esecuzione (default: localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "Porta di aMule per le connessioni esterne (default: 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Password connessioni esterne." + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Leggi la configurazione da file." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "Non stampare output sullo stdout." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Verboso - mostra anche i messaggi di debug." + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Imposta il locale del programma (lingua)." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "Salva le opzioni linea di comando nel file di configurazione." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "Crea un file di configurazione basato su quello di aMule." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Mostra la versione del programma." + +#: src/ClientCreditsList.cpp:168 +#, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "Il file dei crediti è stato caricato, %u client conosciuti" +msgstr[1] "Creditfile loaded, %u clients are known" + +#: src/ClientCreditsList.cpp:171 +#, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] " - Crediti scaduti per %u client!" +msgstr[1] " - Credits expired for %u clients!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "" +"Non è stato trovato il file 'cryptkey.dat', creazione del file in corso." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"ERRORE: il demone di aMule non può essere usato se le connessioni esterne " +"sono disattivate. Per abilitare le connessioni esterne, puoi usare un aMule " +"normale, far partire amuled con l'opzione --ec-config o impostare la voce " +"\"AcceptExternalConnections\" a 1 nel file ~/.aMule/amule.conf" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "ERRORE: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Rimuovi ban" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Mostra upload" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Mostra coda" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Mostra client" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Seleziona visuale" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Software client" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Atteso" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Tempo upload" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Upload/Download" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Stato remoto" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "QR: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Priorità file" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Punteggio" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Richiesto" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Ultima volta visto" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Aggiunto in coda" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Stato upload" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Inviati" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Stato download" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Ricevuti" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Hash utente" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Cifrato" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Non mostrare file condivisi" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Dettagli client" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Non supportata" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Non completo" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Cattivo" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Verificata - OK" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Non disponibile" + +#: src/ClientDetailDialog.cpp:190 +#, c-format +msgid "%u (QR: %u)" +msgstr "%u (QR: %u)" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "Min size deve essere più piccola di max size. Ignoro max size." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Avviso di ricerca" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Illimitato" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "Menu di aMule nel systray" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Limiti di velocità:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "UL: nessuno" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "UL: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "DL: nessuno" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "DL: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Velocità di download: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Velocità di upload: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Informazioni client" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Nickname: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "Nessun nickname selezionato!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "ID Client: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Nome server: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "IP server: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "Porta TCP: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "Porta TCP: non pronta" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "Porta UDP: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "Porta UDP: non pronta" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Firma in linea: abilitata" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Firma in linea: disabilitata" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "File condivisi: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Client in coda: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "DL totale: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "UL totale: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Limite upload" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Limite download" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "Nascondi" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "Mostra" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "Sessione di chat iniziata: %s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Connesso al client ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** Connessione al client in corso ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Impossibile connettersi al client / Connessione persa ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Chiudi scheda" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Chiudi tutte le schede" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Chiudi le altre schede" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "Caricamento file server.met: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "File server.met non trovato!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" +"Impossibile caricare il file server.met '%s', trovato formato sconosciuto." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "Impossibile aprire il file server.met!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"Server.met corrotto, trovato tag di versione non valido: 0x%x, dimensione %i" + +#: src/ServerList.cpp:168 +#, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "Trovati %i server nel file server.met" +msgstr[1] "%i servers in server.met found" + +#: src/ServerList.cpp:170 +#, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "Aggiunti %d server" +msgstr[1] "%d servers added" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Server non aggiunto: [%s:%d] non specifica una porta valida." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "Server non aggiunto: l'IP di [%s:%d] è filtrato o non valido." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" +"Server non aggiunto: server con corrispondente IP:Porta [%s:%d] trovato " +"nella lista." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Server aggiunto: server [%s:%d] con il nome '%s'." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "Sei connesso al server che vuoi eliminare. Disconnettiti prima." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Impossibile salvare il file server.met!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "URL non valido" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "Terminato il download della lista dei server da %s" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Impossibile scaricare la lista dei server da %s" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"Non è stato trovato nessun indirizzo nel file 'addresses.dat'. Copia un " +"indirizzo che contenga la lista di server in questo file in modo da poter " +"aggiornare automaticamente la lista" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "Inizia il download della lista dei server da %s" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" +"Attenzione, indicato URL non valido per l'aggiornamento automatico dei " +"server: %s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "Nessun URL di file server.met valido in addresses.dat" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"Il server locale è filtrato dal filtro IP, mi connetto a un altro server!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "Impossibile eseguire il comando `%s' per l'evento `%s'." + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"Le tue impostazioni di localizzazione sono state impostate a quelle " +"predefinite dal sistema in conseguenza al cambio di configurazione. " +"Spiacente." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"Non hai alcun server nella lista dei server.\n" +"Vuoi che aMule scarichi una lista ora?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Scaricamento della lista server" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "Server web attivo con pid %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"Hai scelto di lanciare il server web all'avvio, ma non è stato possibile " +"eseguire amuleweb. Installa il pacchetto comprendente il server web di " +"aMule, oppure compila aMule con l'opzione --enable-webserver." + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "Impossibile aprire le porte sull'indirizzo specificato: %s" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "La porta %u non è disponibile. Otterrai un ID basso\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"La porta %u non è disponibile!\n" +"\n" +"Otterrai un ID basso.\n" +"\n" +"Controlla le impostazioni di rete e verifica che la porta sia aperta in " +"ingresso e in uscita." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Impossibile creare il file per la firma in linea" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "Impossibile creare il file per la firma in linea di aMule" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"L'impostazione locale selezionata non sembra essere installata sul tuo " +"computer (si tenterà ad impostarla in ogni caso)" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "È la prima che volta che avvii aMule %s" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "Questa è una versione di prova, aggiornata quotidianamente, e\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "non garantiamo che essa non distrugga qualcosa, bruci la tua casa,\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "o uccida il tuo cane. Ma *dovrebbe* essere comunque sicura.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" +"Le seguenti opzioni sono state modificate in questa release per motivi di " +"sicurezza:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* Attiva Offuscamento del protocollo per connessioni in ingresso e in " +"uscita.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* Disattivato l'aggiornamento automatico della serverlist dagli altri client " +"e server.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"Per ulteriori informazioni sui motivi di queste modifiche, vedere il\n" +" wiki di aMule su http://wiki.amule.org alla voce \"fake servers\".\n" +"È importante eliminare tutti i fake server dalla tua lista perché aMule " +"funzioni correttamente." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Altre informazioni, supporto e nuove versioni possono essere trovate nella " +"nostra homepage,\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "www.aMule.org, o nel nostro canale IRC #aMule su irc.freenode.net.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Segnalare ogni bug su http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"La cartella scelta per contenere il file di firma in linea non è valida!\n" +"La firma in linea sarà pertanto disabilitata fino a quando il problema non " +"sarà stato risolto attraverso il pannello delle preferenze." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "ERRORE: non posso aprire il file di log" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "ERRORE: il file di log è vuoto. Qualcosa non va." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Il file di log è stato cancellato" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "Messaggio del server: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Impossibile scaricare la lista dei nodi." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Impossibile aprire il file per il controllo della versione scaricato" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "File per il controllo della versione danneggiato" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Stai usando una versione non aggiornata di aMule!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "La tua versione di aMule e' la %i.%i.%i e l'ultima è la %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "L'ultima versione è sempre disponibile su http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "" +"ATTENZIONE: La tua versione di aMuled e' obsoleta: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "La tua copia di aMule è aggiornata." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Impossibile scaricare il file per il controllo della versione" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Connesso a %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Connessione in corso a %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Disconnesso dalla rete ed2k" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad avviato." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad arrestato." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Connesso alla rete Kad (ok)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Connesso alla rete Kad (firewalled)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Disconnesso dalla rete Kad" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"La rete Kad non può essere utilizzata se la porta UDP è disattivata dalle " +"opzioni." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Rete Kad disattivata dalle opzioni, non mi connetto." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "" +"Impossibile aprire in lettura il file della lista degli amici 'emfriend.met'!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "" +"Impossibile aprire in scrittura il file della lista degli amici 'emfriend." +"met'!" + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "" +#~ "Non è ancora possibile effettuare il bootstrap da un IP specifico " +#~ "utilizzando la GUI remota." + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "Non puoi ancora aggiornare il file server.met falla GUI remota." + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "Letti %u contatti Kad" +#~ msgstr[1] "Letti %u contatti Kad" + +#~ msgid "Disconnect from " +#~ msgstr "Disconnetti da " + +#~ msgid "current server" +#~ msgstr "server attuale" + +#~ msgid " and " +#~ msgstr " e " + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "Disconnetti da tutti i server e da Kad" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "TCP Flags" +#~ msgstr "Opzioni TCP" + +#~ msgid "UDP Flags" +#~ msgstr "Opzioni UDP" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "Copia collegamento(i)i ed2k negli appunti" + +#~ msgid "Client requests %u" +#~ msgstr "Richiesta dal client %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "File block %u-%u (%d byte):" + +#~ msgid "Client request is invalid!" +#~ msgstr "La richiesta del client non è valida!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "La richiesta del client non è valida! %i / %i" + +#~ msgid "Command: %s" +#~ msgstr "Comando: %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "Impossibile aprire il file %s - uso il file %s." + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "Attenzione: known.met non esiste." + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles: Elimino %s dalla lista di cartelle " +#~ "condivise: la cartella non esiste." + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "Attesa del termine del sottoprocesso fallita" + +#~ msgid "" +#~ "You cannot connect to a release version from an arbitrary CVS version! " +#~ "*sigh* possible crash prevented" +#~ msgstr "" +#~ "Non puoi connetterti a una versione finale da una versione CVS qualsiasi! " +#~ "*sigh* possibile crash evitato" diff --git a/po/it_CH.po b/po/it_CH.po new file mode 100644 index 00000000..cf5b7623 --- /dev/null +++ b/po/it_CH.po @@ -0,0 +1,7538 @@ +# Italian_CH language translation +# Kry , 2004,2005. +# ilbuio , 2004,2005. +# AnonimoVeneziano , 2004. +# GhePeU , 2004,2005. +# BELiAL , 2007. +# Luca Pagliero +# translation of it_CH.po to Italian +# translation of source_strings.po to +# aMule i18n resource file. +# Copyright (C) 2004,2005 aMule Team +# This file is distributed under the same license as the PACKAGE package. +msgid "" +msgstr "" +"Project-Id-Version: it_CH\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2008-01-17 11:42+0100\n" +"Last-Translator: Luca Pagliero \n" +"Language-Team: Italian_CH\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" +"X-Poedit-Language: Italian_CH\n" +"X-Poedit-Country: ITALY\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Devi specificare una password non vuota." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Password non valida, non e' un hash MD5!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Connessione fallita" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "Connessione EC fallita. Risposta vuota." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "ExternalConn: accesso negato perche': " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "ExternalConn: accesso negato" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "ExternalConn: risposta negativa dal server. Connessione chiusa" + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Fatto! Connessione stabilita con aMule " + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Fatto! Connessione stabilita" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Hashing in corso" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "In completamento" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Completo" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "In pausa" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Errato" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Download in corso" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "In attesa" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Creo gli hash MD4 e AICH del file %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Creo l'hash MD4 del file %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Creo l'hash AICH del file %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "Conversione dei vecchi hashset AICH in '%s' a 64b: '%s'." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" +"ATTENZIONE: '%s' non e' un nome di file valido ed e' stato rinominato in '%" +"s'." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "ATTENZIONE: Esiste gia' un file col nome '%s', rinomino in '%s'." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" +"ATTENZIONE: non e' possibile rimuovere l'originale '%s' dopo aver creato il " +"backup" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "ATTENZIONE: impossibile cancellare %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Impossibile ricevere i file condivisi dall'utente '%s'" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Sconosciuto" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (falso eMule versione %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (falso eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (falso eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (basato su eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Nickname: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "Richiesto:" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Statistiche file per questa sessione: accettate %d di %d richieste, %s " +"trasferite\n" +msgstr[1] "" +"Statistiche file per questa sessione: accettate %d di %d richieste, %s " +"trasferite\n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Statistiche file per tutte le sezioni: accettate %d di %d richieste, %s " +"trasferite\n" +msgstr[1] "" +"Statistiche file per tutte le sezioni: accettate %d di %d richieste, %s " +"trasferite\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Richiesto file sconosciuto" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "Client %s con IP:Porta %s:%d utilizza %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Nome utente" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Amici" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Mostra &Dettagli" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Aggiungi amico" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Rimuovi amico" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Invia &Messaggio" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Visualizza file" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Crea slot amico" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Sei sicuro di voler cancellare l'amico/i selezionato/i?" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Sei sicuro di voler cancellare l'amico/i selezionato/i?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Annulla" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"Non puoi assegnare piu' di uno slot amico.\n" +"Assegnato un solo slot" + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Selezione multipla" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Nome file" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Dimensione" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Tipo" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Priorita'" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "ID File" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Richieste" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Richieste accettate" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Dati trasferiti" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Percentuale Condivisione" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Parti ricevute" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Fonti complete" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Percorso directory" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "File condivisi" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Molto bassa" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Bassa" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normale" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Alta" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Molto alta" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Release" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Auto" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Aggiungi commento/giudizio" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Modifica commento/giudizio" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Rinomina" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Aggiungi i files della collection alla lista dei trasferimenti" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Copia &URI magnet negli appunti" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Copia &link ed2k negli appunti" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Copia link ed2k negli appunti (&Source)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "Copia link ed2k negli appunti (Source) (&With Crypt options)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Copia &link ed2k negli appunti (&Hostname)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "Copia &link ed2k negli appunti (Hostname) (With &Crypt options)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Copia link ed2k negli appunti (info &AICH)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Copia feedback negli appunti" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "Hai bisogno di un HighID per creare un sourcelink valido" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Attenzione" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "File condivisi (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "File in download" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Inserisci un nuovo nome per questo file:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Rinomina file" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Ripristino upload del file: %s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Sospensione upload del file: %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: chiave di ricerca troppo corta" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "ERRORE: non posso stare in ascolto sulla porta TCP" + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "Richiesta fallita per l'errore: %s" + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "Richiesta fallita con errore sconosciuto" + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "File indice non trovato: " + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Impossibile creare thread socket web\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Server web: eseguito\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Sessione scaduta - login richiesto\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Sessione valida, utente loggato\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Sessione valida, utente loggato\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Nessuna sessione aperta - richiesta login\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Sessione creata - richiesta login\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Elaborazione richiesta [originale]:" + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Verifica password\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Hash della password non valido\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Password valida\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Password errata\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "" +"Non hai inserito alcuna password e le password vuote non sono ammesse.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Logout richiesto\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Elaborazione richiesta [rediretta]:" + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Carica modello " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Porta HTTP del webserver" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Usa il port forwarding UPnP per la porta del webserver" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "Porta UPnP" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Usa compressione gzip" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Password per l'accesso completo al webserver" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Password guest per il webserver" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Permetti l'accesso guest" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Vieta l'accesso guest" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "Carica/salva le impostazioni del webserver da/su aMule remoto" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "Percorso del file di configurazione di aMule. Non usare direttamente!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "Disabilita interprete PHP (deprecato)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Ricompila pagine PHP ad ogni richiesta" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "aMule Web Server" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Non disponibile" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Mai" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Scaricamento in corso..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Preferenze" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "Directory contenente il file amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Sfoglia" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Inserire la directory contentente il file amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Intervallo di aggiornamento in secondi" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Genera un'immagine delle statistiche ad ogni aggiornamento" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "" +"Inserire la directory nella quale generare l'immagine delle statistiche" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Carica periodicamente l'immagine delle statistiche sul server FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "URL FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "Percorso FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Inserire URL del tuo server FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "Inserire la directory del server FTP nella quale copiare l'immagine" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Utente" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Password" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Inserire username per il login nel server FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Inserire password per il login nel server FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "Intervallo di aggiornamento FTP in minuti" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Verifica" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Directory contenente il file di firma" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Directory nella quale generare l'immagine" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i giorno(i) %i ora(e) %i minuto(i) %i s" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, statistiche online di aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Benvenuto!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Velocita' di DL massima da quando wxCas e' attivo" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "Velocita' di DL massima nelle precedenti sessioni di wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Pulisci" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "Sistema" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Ferma aggiornamento automatico" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Salva immagine statistiche online" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Stampa immagine statistiche online" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Preferenze" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "Informazioni su wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Avvia aggiornamento automatico" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Aggiornamento automatico fermato" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Aggiornamento automatico avviato" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Salva immagine statistiche" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Nessun gestore per questo tipo di file" + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "Il file non e' stato salvato" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "Statistiche online aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"C'e' stato un problema durante la stampa.\n" +"La stampante potrebbe non essere impostata correttamente?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Stampa in corso" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, Firma Online Statistiche aMule\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Basato su CAS di Pedro de Oliveira \n" +"\n" +"Distribuito con licenza GPL" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Oh Oh, aMule non e' in esecuzione..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule e' in funzione" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule e' in esecuzione, ma e' disconnesso" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule si sta connettendo..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Oh oh, stato di aMule sconosciuto..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr "e' stato in funzione per " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " e' fermo !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " non e' connesso !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " si sta connettendo..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " sta facendo qualcosa di strano, controllare!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " e' connesso a " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "ok" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "firewalled" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "off" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " e' attivo " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +#, fuzzy +msgid " with " +msgstr "] con " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Download totale: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Upload: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Download sessione: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Download: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr "kB/s, Upload: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Condivisione: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr "file, client in coda: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Tempo: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr "attivo " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Carico medio del sistema (1-5-15 min): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Uptime del sistema: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uG %02uore %02umin %02usec" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uore %02umin %02usec" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02umin %02usec" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "HighID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "LowID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Non connesso" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "Cancellato!" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Impossibile aprire %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "" +"Il file %s e' troppo grande per il network eDonkey: dimensione massima 4 GB" + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Parametri di ingresso" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "File da esaminare" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Aggiungi URL per questo file" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Inserisci il file di cui vuoi determinare il link ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Inserisci qui l'URL che vuoi aggiungere al link ed2k: inserisci / alla fine " +"affinche' aLinkCreator lo aggiunga alla fine del nome del file" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Aggiungi" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Rimuovi" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Pulisci" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Crea link con hash delle parti" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Aiuta a diffondere piu' in fretta i file nuovi e rari, al costo di una " +"connessione piu' lunga" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "Hash MD4" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "Hash ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "Link ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Inizia" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Salva" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Copia negli appunti" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Esci" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Apri un file per calcolare il suo link ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Copia link ed2k calcolato negli appunti" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Salva link ed2k appena calcolato in un file" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "Informazioni su aLinkCreator" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Seleziona il file di cui vuoi calcolare il link ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "Non c'e' niente da copiare per ora!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Seleziona il file per il link ed2k appena calcolato" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Impossibile aprire " + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Inserire un nome file non vuoto" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "Non c'e' niente da salvare per ora!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, il creatore di link ed2k per aMule\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps da http://www.everaldo.com e http://www.icomania.com\n" +"e http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distribuito con licenza GPL" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Hashing..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Eseguito in %.2f s" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "Hai gia' aggiunto questo URL!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Inserire un URL non vuoto" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "Elaborazione del file numero %u: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "Hai richiesto l'hash delle parti (solo per file > 9.5 MB)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Attendere... " + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> File inesistente!\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, il generatore di link ed2k di aMule" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Auto [Bassa]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Auto [No]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Auto [Alta]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Connessione in corso" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Richiesta in corso" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Connessione in corso attraverso il server" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Coda piena" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "In coda" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Trasferimento" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Ricezione hashset in corso" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Nessuna parte utile" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Impossibile connettere LowID ad altro LowID" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Troppe connessioni" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Connessione via Kad" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Troppe connessioni Kad" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Bannati" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Errore di connessione" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Coda piena" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "Vecchio MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "Nuovo MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "eMule compatibile" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Server locale" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Server remoto" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Scambio fonti" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Passiva" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Link" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Fonti salvate" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Predefinita di sistema" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Arabo" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Basco" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Bulgaro" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Catalano" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Cinese (semplificato)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Cinese (tradizionale)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Croato" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "Ceco" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Danese" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Olandese" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Inglese (U.K.)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Estone" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Finlandese" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Francese" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Galiziano" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Tedesco" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "Greco" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Ungherese" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Italiano" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Italiano (Svizzera)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "Giapponese" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Coreano" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "Lituano" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "Norvegese" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Polacco" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portoghese" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Portoghese (brasiliano)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Russo" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Sloveno" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Spagnolo" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "Svedese" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Turco" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Impossibile determinare il browser selezionato!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" +"La porta TCP non puo' essere superiore a 65532 perche' il socket UDP e' " +"fissato a TCP+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Verra' usata la porta di default (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Nome server" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Indirizzo" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Porta" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Descrizione" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Utenti" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "File" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Fallito" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Statico" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Versione" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Sei connesso al server che stai cercando di cancellare. Disconnettiti prima. " +"Il server NON e' stato cancellato" + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Info" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(nome sconosciuto)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Sei sicuro di voler cancellare il server statico %s?" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Si'" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "No" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Impossibile aprire '%s'" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Server (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Server" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Connesso al server" + +#: src/ServerListCtrl.cpp:428 +#, fuzzy +msgid "Mark server as static" +msgstr "Segna il server come statico" + +#: src/ServerListCtrl.cpp:429 +#, fuzzy +msgid "Mark server as non-static" +msgstr "Segna il server come non statico" + +#: src/ServerListCtrl.cpp:431 +#, fuzzy +msgid "Mark servers as static" +msgstr "Segna il server come statico" + +#: src/ServerListCtrl.cpp:432 +#, fuzzy +msgid "Mark servers as non-static" +msgstr "Segna il server come non statico" + +#: src/ServerListCtrl.cpp:438 +#, fuzzy +msgid "Remove server" +msgstr "Rimuovi server" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "Rimuovi server" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Elimina tutti i server" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Copia link ed2k negli appunti" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "Copia link ed2k negli appunti" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Riconnetti al server" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Sei sicuro di voler cancellare tutti i server?" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Sei sicuro di voler cancellare i server selezionati?" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Sei sicuro di voler cancellare i server selezionati?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Disabilitato [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "Questo e' aMule %s basato su eMule" + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "In esecuzione su %s" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" +"Visita http://www.amule.org per sapere se e' disponibile una nuova versione" + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "ERRORE FATALE: impossibile creare il timer" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "Controllo remoto di aMule " + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Snapshot:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" +"Client p2p 'All-Platform' basato su eMule \n" +"\n" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "Sito web: http://www.amule.org \n" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "Forum: http://forum.amule.org \n" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" +" FAQ: http://wiki.amule.org \n" +"\n" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "Contatto: admin@amule.org (problemi amministrativi) \n" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" +"Copyright (C) 2003-2008 aMule Team \n" +"\n" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr " Parte di aMule è basata su \n" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "Kademlia: Routing peer-to-peer basato sulla metrica XOR.\n" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr " Copyright (C) 2002 Petar Maymounkov\n" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr " http://kademlia.scs.cs.nyu.edu\n" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Messaggio" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Messaggio di status" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "Connessione in corso" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "Disconnesso" + +#: src/amuleDlg.cpp:676 +#, fuzzy +msgid "Kad: Firewalled" +msgstr "Firewalled" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "Connesso" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "Connessione in corso" + +#: src/amuleDlg.cpp:689 +#, fuzzy +msgid "Kad: Off" +msgstr " Kad: " + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "Ferma i tentativi di connessione in corso" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Disconnetti" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "Disconnetti dalla rete." + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Connetti" + +#: src/amuleDlg.cpp:726 +#, fuzzy +msgid "Connect to the currently enabled networks" +msgstr "Connessione al network." + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Up: %.1f(%.1f) | Down: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Up: %.1f | Down: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | Connesso)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | Disconnesso)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Vuoi veramente uscire da aMule?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Chiedi conferma prima di uscire" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Non e' possibile trovare il comando per lanciare il browser" + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "La directory delle skin '%s' non esiste" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "Attenzione: Impossibile leggere la skin dal file '%s'" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Reti" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Finestra reti" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Ricerca" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Finestra ricerche" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Trasferimenti" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Finestra trasferimenti" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Finestra file condivisi" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Messaggi" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Finestra messaggi" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Statistiche" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Finestra grafici e statistiche" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Finestra Impostazione preferenze" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Importazione" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "Strumento per l'importazione dei partfile" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "Informazioni" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "Informazioni/Aiuto" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Generale" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Connessione" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Proxy" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Filtro messaggi" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Controlli remoti" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Firma Online" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Directory" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Sicurezza" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "Tweaks GUI" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Tweaks programma" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Eventi" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Debug" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Definito dall'utente" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"aMule deve essere riavviato per rendere effettive queste modifiche:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- Modifica della porta TCP.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- Modifica della porta UDP.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"La tua lista di aggiornamento automatico dei server e' vuota.\n" +"L'opzione 'Aggiorna la lista dei server all'avvio' verra' disabilitata" + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"Hai abilitato le connessioni esterne senza pero' specificare una password.\n" +"Le connessioni esterne non possono essere abilitate a meno che tu non scelga " +"una password valida" + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- Modifica della lingua.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- Modifica della cartella Temp.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Up: 0.0 | Down: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"Le reti ed2k e Kad sono disabilitate.\n" +"Non potrai connetterti finche' non ne abiliterai almeno una." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"Kad non puo' partire se la porta UDP e' disabilitata.\n" +"Abilitala o disabilita Kad." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"DEVI riavviare aMule ADESSO.\n" +"Se non lo fai, non lamentarti se succede qualcosa di brutto.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "ATTENZIONE" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"La tua lista di aggiornamento automatico dei server e' vuota.\n" +"Inserisci l'URL di almeno un server valido nel file server.met.\n" +"Clicca sul pulsante \"Lista\" per inserire l'URL" + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "File temporanei" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "File completi" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Firme online" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Scegli una directory per i %s" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Sfoglia file wav" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "File wav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Sfoglia per trovare un riproduttore video" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Scegli browser" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Eseguibile%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Modifica lista server" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Inserisci l'URL da cui scaricare il file server.met.\n" +"Solo un URL per riga" + +#: src/PrefsUnifiedDlg.cpp:980 +#, fuzzy, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Intervallo aggiornamento: %d secondi" +msgstr[1] "Intervallo aggiornamento: %d secondi" + +#: src/PrefsUnifiedDlg.cpp:987 +#, fuzzy, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Intervallo grafico della media: %d minuti" +msgstr[1] "Intervallo grafico della media: %d minuti" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Scala grafico delle connessioni: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, fuzzy, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Intervallo aggiornamento: %d secondi" +msgstr[1] "Intervallo aggiornamento: %d secondi" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, fuzzy, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Dimensione buffer file: %d byte" +msgstr[1] "Dimensione buffer file: %d byte" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, fuzzy, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Dimensione coda upload: %d client" +msgstr[1] "Dimensione coda upload: %d client" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, fuzzy, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Intervallo aggiornamento connessione ai server: %d minuti" +msgstr[1] "Intervallo aggiornamento connessione ai server: %d minuti" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Intervallo aggiornamento connessione ai server: disabilitato" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Esegui comando se si verifica l'evento '%s'" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Abilita l'esecuzione del comando sul core" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Comando Core:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Abilita l'esecuzione del comando sulla GUI" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "Comando GUI:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "Le seguenti variabili saranno sostituite:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Tentativo di accesso non autorizzato. Connessione chiusa." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Connessione esterna chiusa" + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "Connessioni esterne disabilitate perche' la password e' vuota!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "Connessioni esterne disabilitate nel file di configurazione" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Accettata nuova connessione esterna" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "ERRORE: impossibile accettare una nuova connessione esterna" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" +"Connessione esterna rifiutata perche' la password nelle preferenze e' vuota!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "Connessione al client: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Versione sconosciuta" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"ID della versione EC non corretto, potrebbe esserci un'incompatibilita' " +"binaria. Usare core e client remoto dello stesso snapshot." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" +"Non puoi collegarti ad una versione ufficiale usando una versione SVN " +"arbitraria! *sigh* prevenuto possibile crash" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "Autenticazione fallita" + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Versione protocollo non valida" + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Tag versione di protocollo mancante" + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Richiesta non valida, prima devi autenticarti" + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Accesso consentito" + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "Comando Partfile remoto fallito: hash del file non trovato: %s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "Hash del file non trovato: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "OOPS! errore nel processare l'opcode!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Server non aggiunto" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "server non trovato: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "e' necessario definire Il server da rimuovere" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "La rete ed2k e' disabilitata nelle Preferenze." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "Ricerca in corso. Risultati in arrivo!" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "Non ha senso usare la ricerca Web da interfaccia remota." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "La rete Kad e' disabilitata nelle Preferenze." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Niente punti per il grafico." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "Il tuo client non e' configurato per questo livello di dettaglio." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "ExternalConn: richiesto spegnimento" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Sto gia' uscendo." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "ExternalConn: aggiungo il link '%s'" + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Link non valido o gia' nella lista." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "File non trovato." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Nome file non valido." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Impossibile rinominare il file." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Gia' connesso alla rete ed2k." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Connessione alla rete ed2k..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Gia' connesso alla rete Kad." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Connessione alla rete Kad..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Tutte le reti sono disabilitate." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Disconnesso dalla rete ed2k." + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Disconnesso dalla rete Kad." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "ExternalConn: ricevuto opcode non valido: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "Opcode non valido (versione errata del protocollo?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" +"Impossibile aprire il file (%s), rimosso dalla lista dei file condivisi." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "Hashset richiesto per il file sconosciuto: %s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "Il programma `%s' con pid `%d' e' terminato uscendo con status `%d'." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "Server non aggiunto: non e' stato specificato l'IP o il nome dell'host" + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "Server non aggiunto: porta del server specificata non valida" + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "Stato ed2k:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Connesso" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Porta" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Stato Kademlia:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Attivo" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Stato:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Disconnesso" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Stato connessione:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Firewalled" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "OK" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Stato firewalled: " + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Connesso all'amico" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "Nessun amico" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Utenti medi:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "File medi:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "Non attivo" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Uptime: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Trasferimento" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Upload" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Dati inviati (sessione (totale)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Overhead totale (pacchetti): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Overhead per richieste file (pacchetti): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "Overhead per scambio fonti (pacchetti): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Overhead server (pacchetti): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Overhead Kad (pacchetti): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Upload attivi: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Upload in attesa: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Totale sessioni di upload riuscite: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Totale sessioni di upload fallite: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Tempo upload medio: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Download" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Dati scaricati (sessione (totale)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Fonti trovate: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Download attivi (parti): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Rapporto UL:DL sessione (totale): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Velocita' di download media (sessione): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Velocita' di upload media (sessione): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Velocita' di download massima (sessione): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Velocita' di upload massima (sessione): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Riconnessioni: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Tempo dal primo trasferimento: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Connesso al server da: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Connessioni attive (stima): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Limite massimo connessioni raggiunto: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Connessioni medie (stima): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Picco connessioni (stima): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Client" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Filtrati" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Totale: %i Conosciuti: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Server" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Server attivi: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Server falliti: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Totale: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Server rimossi: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Server filtrati: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Utenti su server attivi: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "File su server attivi: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Utenti totali: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "File totali: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Occupazione server: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Numero di file condivisi: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Dimensione totale file condivisi: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Dimensione media file: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "LowID: %u (%.2f%% totale %.2f%% noti)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "Identificazione sicura On/Off: %u (%.2f%%) : %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Sistema operativo" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "Non ricevuto" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Taglia" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Copia" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Incolla" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Seleziona tutto" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "" +"Impossibile effettuare una ricerca sulla rete Kad senza esserci connessi" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "" +"Impossibile effettuare una ricerca sulla rete ed2k senza esserci connessi" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Errore imprevisto durante la ricerca su Kad: " + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "Messaggio da '%s' (IP:%s) filtrato" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "Nuovo messaggio da '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" +"L'utente %s (%u) ha richiesto la lista dei file condivisi -> richiesta " +"accettata" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" +"L'utente %s (%u) ha richiesto la lista dei file condivisi -> richiesta negata" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" +"L'utente %s (%u) ha richiesto la lista delle directory condivise -> " +"richiesta accettata" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" +"L'utente %s (%u) ha richiesto la lista delle directory condivise -> " +"richiesta negata" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"L'utente %s (%u) ha richiesto la lista dei file condivisi nella directory %s " +"-> richiesta accettata" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"L'utente %s (%u) ha richiesto la lista dei file condivisi nella directory %s " +"-> richiesta negata" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "L'utente %s (%u) condivide la directory %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "" +"L'utente %s (%u) ha inviato una lista delle directory condivise non " +"richiesta." + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" +"L'utente %s (%u) ha inviato la lista dei file condivisi nella directory %s" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "L'utente %s (%u) ha finito di inviare la lista dei file condivisi" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "L'utente %s (%u) ha inviato una lista di file condivisi non richiesta" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" +"L'utente %s (%u) ha negato l'accesso alla lista dei file e directory " +"condivisi" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Nodi (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "IP non valido per il bootstrap" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Porta non valida per il bootstrap" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Completa tutti i campi obbligatori" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Sei sicuro di voler scaricare un nuovo file nodes.dat?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" +"Cosi' facendo, rimuoverai i nodi attuali e riavvierai la connessione " +"Kademlia." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Continuare?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Errore: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Attenzione: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Aggiungi amico" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Inserire un indirizzo IP e una porta validi!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Informazione" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "L'hash utente specificato non e' valido!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Fonti" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "File" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Download" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Categoria" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Principale" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Download nella categoria" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "Ricerca file simili (ED2k, local server)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "Segna come file conosciuto" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Connessione ad aMule remoto" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Connessione fallita " + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Errore" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"ATTENZIONE: Non puoi aggiungerti come fonte per un link ed2k finche' avrai " +"un id basso." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Utenti: E: %s K: %s | File E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Tutto" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Utenti totali: %s | File totali: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Trasferiti" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Completati" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Velocita'" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Avanzamento" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Stato" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Tempo rimanente" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Ultima fonte completa vista" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Ultima ricezione" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Sei sicuro di voler cancellare i file selezionati?" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Sei sicuro di voler cancellare i file selezionati?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Invia messaggio all'utente" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Messaggio da inviare:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Stop" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Pausa" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Continua" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "&Rimuovi file completati" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Sposta ogni A4AF su questo file" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Sposta ogni A4AF su questo file (Auto)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Sposta ogni A4AF sugli altri file" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Opzioni avanzate" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Anteprima" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Mostra &dettagli file" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Mostra tutti i commenti" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Copia URI magnet negli appunti" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "rimuovi" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Assegna a categoria" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "&Apri file" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Elimina dagli amici" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Inserisci tra gli amici" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Invia messaggio" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Sposta su questo file" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "QR: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Altro file richiesto" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Download (%i)" + +#: src/DownloadListCtrl.cpp:2222 +#, fuzzy +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"Seleziona il tuo video player preferito nelle preferenze.\n" +"Nel frattempo aMule tentera' di usare mplayer e riceverai questo messaggio " +"in ogni anteprima" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Anteprima" + +#: src/DownloadListCtrl.cpp:2260 +#, fuzzy, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "ERRORE: impossibile eseguire il media player esterno!" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "ERRORE: Impossibile aprire il partfile)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "ERRORE: impossibile creare il file .part)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "Caricamento del backup del file met da %s" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "ERRORE: impossibile aprire il file part.met: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "ERRORE: il file part.met e' di dimensione 0: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "ERRORE: versione del file part.met non valida: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" +"ERRORE: %s (%s) e' corrotto (tagcount non corretto), impossibile caricare il " +"file." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "Tentativo di recupero informazioni sul file..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" +"Recupero file senza nome - tentativo di recupero come RecoveredFile.dat" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" +"Recuperate tutte le informazioni disponibili :D - Tentativo di utilizzo in " +"corso..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Impossibile recuperare le informazioni sul file :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Impossibile aprire %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "ATTENZIONE: %s potrebbe essere corrotto (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "Errore durante il salvataggio del file incompleto: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "Non posso ottenere la lunghezza di '%s' - sto usando il file %s" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "'%s' e' per qualche motivo di dimensione 0 - uso il file %s" + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "Impossibile salvare il file part.met.seeds per %s" + +#: src/PartFile.cpp:1019 +#, fuzzy, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "Salvate %i fonti per il file incompleto: %s (%s)" +msgstr[1] "Salvate %i fonti per il file incompleto: %s (%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "Il file incompleto %s (%s) non ha file seeds" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "Il file incompleto %s (%s) ha un file delle fonti vuoto" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "Errore nella lettura del file delle fonti del partfile (%s - %s): %s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, fuzzy, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"Trovata parte corrotta (%d) su %d parti totali %s - FileResultHash |%s| " +"FileHash |%s|" +msgstr[1] "" +"Trovata parte corrotta (%d) su %d parti totali %s - FileResultHash |%s| " +"FileHash |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "Trovata parte completata (%i) in %s" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "Nuovo hashing completato %s" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "" +"Si e' verificato un errore inaspettato nel completamento del file %s. File " +"in pausa" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Download completato: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "Cancellazione file: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" +"ATTENZIONE: impossibile fare l'hash della parte scaricata - hashet " +"incompleto per '%s'" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"ERRORE: impossibile calcolare l'hash del file part scaricato - hashset " +"incompleto (%s). Cio' non dovrebbe mai accadere" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "" +"ATTENZIONE: non c'e' abbastanza spazio libero su disco! Metto in pausa il " +"file: %s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "La parte di file scaricata %i e' corrotta in: %s" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH: recuperata parte corrotta %i in %s -> risparmiati byte: %s" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Spazio su disco insufficiente" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Fermo" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "Attenzione: impossibile aprire known.met." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" +"Attenzione: lista dei file conosciuti corrotta, potrebbe contenere un header " +"non valido." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "Errore IO durante la lettura del file known.met: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "Errore nel salvataggio del file known.met: %s" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "Trovati %i file condivisi conosciuti" +msgstr[1] "Trovati %i file condivisi conosciuti" + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "Trovati %i file condivisi conosciuti, %i sconosciuti" +msgstr[1] "Trovati %i file condivisi conosciuti, %i sconosciuti" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "ERRORE! Tentativo di condividere %s" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Commenti file" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Giudizio" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Commento" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Nessun commento" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%s commento(i)" +msgstr[1] "%s commento(i)" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"Impossibile collegarsi ai server con offuscamento di protocollo. Ci riprovo " +"senza offuscamento." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "" +"Impossibile connettersi a tutti i server in lista. Procedo con un altro " +"tentativo" + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "Rete ed2k disattivata dalle opzioni, non mi ci connetto." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "" +"Nella lista dei server non e' stato trovato nessun server valido a cui " +"connettersi" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Connesso a %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Connessione stabilita con: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"Errore fatale durante il tentativo di connessione. La connessione a internet " +"potrebbe non essere attiva" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Persa connessione a %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) sembra essere morto" + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) sembra essere pieno" + +#: src/ServerConnect.cpp:391 +#, fuzzy, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "Riconnessione automatica al server tra %d secondi" +msgstr[1] "Riconnessione automatica al server tra %d secondi" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Connessione persa" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "Connessione a %s (%s:%i) fallita" + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "ERRORE: socket invalido in sede di controllo di timeout" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "Connessione a %s (%s:%i) fallita per time-out" + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" +"Errore: Caricamento file di backup fallito. Cerca soluzioni per il recupero " +"di .part.met su http://forum.amule.org" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Non e' stato trovato alcun file incompleto" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "Trovati %u file part." +msgstr[1] "Trovati %u file part." + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Download di %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Stai gia' cercando di scaricare il file '%s'" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Hai gia' il file '%s'" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Stai gia' cercando di scaricare il file '%s'" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "Non riesco a convertire il link magnet in ed2k: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "Protocollo del link %s sconosciuto" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Link ed2k non valido! Errore: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "Esegui e esci" + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Formato IP non valido. Usa xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +#, fuzzy +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" +"Questo comando necessita di un argomento. Argomenti validi: 'all' oppure un " +"numero.\n" + +#: src/TextClient.cpp:343 +#, fuzzy +msgid "Processing by hash: " +msgstr "Elaborazione del file numero %u: %s" + +#: src/TextClient.cpp:358 +#, fuzzy +msgid "Processing by filename: " +msgstr "Elaborazione del file numero %u: %s" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" +"Questo comando necessita di un argomento. Argomenti validi: l'hash di un " +"file.\n" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Non e' un numero valido\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "Non e' un hash valido (la lunghezza deve essere di 32 caratteri)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "Operazione conclusa con successo" + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "Richiesta fallita con il seguente errore: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "Filtraggio IP per i client: %s.\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "OFF" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "ON" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "Filtraggio IP per i server: %s.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "Il livello IPFilter attuale e' %d\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Limit di banda: Up: %u kB/s, Down: %u kB/s\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ed2k" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Connesso a %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "con LowID" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "con HighID" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Connessione in corso" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Non connesso" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Download:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Upload:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Client in coda:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Fonti totali:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Totale risultati della ricerca: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "TODO - visualizzare il progresso della ricerca" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Ricevuta risposta sconosciuta dal server, OpCode = %#x" + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Mostra informazione sullo stato." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "" +"Mostra stato connessione, velocita' di upload e download attuali, etc.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Mostra le statistiche complete." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"Opzionalmente, un numero compreso tra 0 e 255 puo' essere passato come " +"argomento a questo\n" +"comando, per indicare quante versioni mostrare nel sottoalbero dei client. 0 " +"oppure\n" +"nessun numero significa 'infinite'.\n" +"Esempio: 'statistics 5' mostrera' solo le cinque versioni piu' diffuse per " +"ogni tipo di client.\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "Chiudi aMule." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Spegnimento del core remoto (amule/amuled).\n" +"Questo chiudera' anche il client testuale, che non e' utilizzabile\n" +"senza un core.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Ricarica l'oggetto." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "Ricarica la lista dei file condivisi." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "Ricarica il filtro IP da file." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Connessione al network." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"Questo connettera' aMule a tutte le reti attualmente abilitate nelle " +"Preferenze.\n" +"E' anche possibile specificare l'indirizzo IP, nella forma IP:Porta, di un " +"server e\n" +"connettersi solamente a quello. Si puo' utilizzare un indirizzo IPv4 oppure\n" +"un nome risolvibile da un server DNS." + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Connetti solo alla rete ed2k." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Connetti solo alla rete Kad." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Disconnetti dalla rete." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "Questo disconnettera' aMule da tutte le reti attive.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Disconnetti solo dalla rete ed2k." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Disconnetti solo dalla rete Kad." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Aggiungi un link ed2k o magnet al core." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"Il link ed2k da aggiungere puo' essere:\n" +"*) un file (ed2k://|file|...), e sara' aggiunto alla coda dei download,\n" +"*) un server (ed2k://|server|...), e sara' aggiunto alla lista dei server,\n" +"*) una lista di server, e tutti i server saranno aggiunti alla lista " +"attuale \n" +"\n" +"Il link magnet deve contenere anche l'hash ed2k e la lunghezza del file.\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Imposta un valore delle preferenze." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "Imposta le preferenze del Filtro IP." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "Attiva il filtro IP per client e server." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "Disattiva il filtro IP per client e server." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "Attiva/Disabilita il filtro IP per i client." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "Attiva il filtro IP per i client." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "Disattiva il filtro IP per i client." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "Attiva/Disabilita il filtro IP per i server." + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "Attiva il filtro IP per i server." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "Disabilita il filtro IP per i server." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "Seleziona il livello del filtraggio degli IP." + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"I livelli di filtraggio validi vanno da 0 a 255 e il default (iniziale)\n" +"e' 127.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Imposta limiti di banda." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "" +"Il valore fornito a questi comandi deve essere in kilobyte al secondo.\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Imposta limiti di banda per l'upload." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "Imposta limiti di banda per il download." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Visualizza un'impostazione delle preferenze." + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "Visualizza impostazioni Filtro IP." + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "Ottieni stato dell'IPFilter per client e server." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "Ottieni stato dell'IPFilter per i client." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "Ottieni stato dell'IPFilter per i server." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "Visualizza livello Filtro IP." + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Visualizza limita di banda." + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Effettua una ricerca." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"E' necessario specificare il TIPO della ricerca che puo' essere:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Esempio: 'search kad file' cerchera' \"file\" nella rete Kad.\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Effettua una ricerca globale." + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Effettua una ricerca locale" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Effettua una ricerca su Kad" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Mostra risultati dell'ultima ricerca." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Rende i risultati della ricerca precedente.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "Mostra il progresso della ricerca." + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "Mostra il progresso della ricerca.\n" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Scarica un file" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"Bisogna fornire il numero del file relativo all'ultima ricerca.\n" +"Esempio: 'download 12' aggiungera' alla coda dei download il file col numero " +"12 trovato dall'ultima ricerca.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Metti il download in pausa." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Riavvia download." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Cancella download." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Imposta priorita' del download." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "Imposta la priorita' del download a Bassa, Normale, Alta o Auto.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "Imposta priorita' del download.a Bassa." + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "Imposta priorita' del download.a Normale." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "Imposta priorita' del download.a Alta." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "Imposta priorita' del download.a Auto." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Mostra code/liste." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Mostra la coda di upload/download, la lista dei server o la lista dei file " +"condivisi.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Mostra la coda di upload." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Mostra la coda di download." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Mostra log." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Mostra la lista dei server." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Cancella log." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "Comando deprecato, ora '%s'." + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" +"Questo è un comando deprecato, e potrebbe essere rimosso in futuro.\n" +"Usa '%s' al suo posto.\n" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() ha reso NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "ERRORE: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "ATTENZIONE: %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Il nuovo clientID e' %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "ATTENZIONE: Hai ricevuto un ID Basso!" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "\tProbabilmente perche' il tuo pc e' dietro un firewall o router." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tPer altre informazioni visita http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "Ricevute informazioni sconosciute dal server! - troppo corto" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "Ricevuti %d nuovi server" +msgstr[1] "Ricevuti %d nuovi server" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Salvataggio della lista dei server completato" + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "Il server ha rifiutato l'ultimo comando" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Pacchetto bogus ricevuto dal server: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "Errore non gestito durante l'elaborazione del pacchetto dal server: %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "" +"Non e' possibile creare un thread per risolvere il DNS per connettersi a %s" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "L'ip del server %s (%s) e' filtrato. Connessione bloccata." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "utilizzo offuscamento del protocollo." + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "Connessione a %s (%s - %s:%i) %s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "" +"Non e' possibile risolvere il DNS per il server %s: impossibile connettersi!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "CIP2Country::CIP2Country(): Impossibile ottenere i dati sul Paese da " + +#: src/IP2Country.cpp:73 +#, fuzzy, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "Caricati %d flag bitmaps." +msgstr[1] "Caricati %d flag bitmaps." + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"Sei sicuro di voler interrompere e rimuovere tutti i file contenuti in " +"questa categoria?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Conferma richiesta" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Tutto il resto" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Incompleti" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Attivo" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Video" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Audio" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Archivi" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "Immagini CD" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Immagini" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Testo" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Seleziona filtro di visualizzazione" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Aggiungi categoria" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Modifica categoria" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Elimina categoria" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "Importazione %s: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "Lettura directory dei file temporanei" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "Recupero informazioni di base dal file info del download" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "Creazione file di destinazione" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "Caricamento dati da vecchio file in download (%u su %u)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "Salvataggio blocchi di dati in un singolo file (%u su %u)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "Recupero informazioni fonti e file in download in corso" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "Aggiunta download e salvataggio nuovo partfile in corso" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Verifica status..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "In corso" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Errore: spazio su disco terminato" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Errore: Partmet non trovato" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Errore: errore IO!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Errore: fallito!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "In coda" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Download gia' in corso" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Formato del file temp sconosciuto o errato." + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Nome file" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Stato" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Filehash" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Importa partfile" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"Scegli una directory in cui cercare download temporanei! (le sottodirectory " +"saranno incluse)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" +"Vuoi che le fonti per i download importati con successo siano cancellate?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Rimuovi fonti?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "In attesa..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (Disco: %s)" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "byte" +msgstr[1] "byte" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "byte/s" +msgstr[1] "byte/s" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "sec" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "min" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "ore" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "giorni" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Video" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Archivi" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Testi" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programmi" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Qualsiasi" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Senza voto" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Non valido / Corrotto / Falso" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Mediocre" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Discreto" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Buono" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Eccellente" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "tutti" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "tutti gli altri" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "Carico i filtri IP da 'ipfilter.dat' e 'ipfilter_static.dat'." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" +"Impossibile caricare il file ipfilter.dat '%s', trovato formato sconosciuto." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" +"Impossibile caricare il file ipfilter.dat '%s', impossibile aprire il file." + +#: src/IPFilter.cpp:330 +#, fuzzy, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +"Caricati %u intervalli di IP da '%s'. %u righe non valide sono state " +"scartate." +msgstr[1] "" +"Caricati %u intervalli di IP da '%s'. %u righe non valide sono state " +"scartate." + +#: src/IPFilter.cpp:332 +#, fuzzy, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +"Caricati %u intervalli di IP da '%s'. %u righe non valide sono state " +"scartate." +msgstr[1] "" +"Caricati %u intervalli di IP da '%s'. %u righe non valide sono state " +"scartate." + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Connessioni attive (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Dettagli file" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% completato" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "Link ed2k: " + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Invia" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" +"Clicca qui per aggiungere il link ed2k nella casella di testo alla tua coda " +"di download" + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "Apri pop-up" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Caricamento in corso..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"Gli eventi sono visualizzati qui. Per la lista completa, controllare il log " +"nella tab dei Server" + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Numero di utenti presenti sul server al quale sei connesso..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Utenti: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "Utenti connessi al server attuale e stima del numero totale di utenti" + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"Medie attuali di upload e download. Se l'opzione e' stata abilitata i numeri " +"tra parentesi indicano l'overhead dovuto alla comunicazione tra client" + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"Mostra lo stato attuale di connessione e i trasferimenti attivi. Le frecce " +"rosse indicano che attualmente non sei connesso, le frecce gialle indicano " +"che hai un LowID (probabilmente il tuo pc e' diestro un firewall) e le " +"frecce verdi indicano che hai un HighID (la miglior connessione possibile)" + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Non connesso..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Server attualmente connesso" + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Cerca" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Nome:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Locale" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Globale" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "FileHash" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Parametri avanzati" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Filtraggio" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Tipo file" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Estensione" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Dimensione minima" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Bytes" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Dimensione massima" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Disponibilita'" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Filtro:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Filtra risultati" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Inverti risultati" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Nascondi file conosciuti" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Ancora" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "Ricerca per piu' risultati su ed2k. Non ancora supportata da Kad." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Ferma" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Azzera campi" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Risultati" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Rimuovi download completati" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Mostra Upload / Coda Upload / Client" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Client in coda:" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Invia" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Invia messaggio specificato" + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Chiudi" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Chiude questa sessione di chat" + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Nome completo:" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "N/D" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "File met:" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Hash:" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Dimensione file:" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Stato file part:" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Ultima volta visto completo:" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Fonti trovate:" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Fonti in trasferimento:" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Numero parti:" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Disponibili:" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Velocita':" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Download Active Time: " + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Trasferiti:" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Completati:" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Intelligent Corruption Handling" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Perdita per corruzione:" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Guadagno per compressione:" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "Pacchetti recuperati da ICH:" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Nomi file" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Sovrascrivi" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Pulisci" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Applica" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Ok" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "Commenta/Giudica il file (il testo sara' visibile a tutti gli utenti)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"Per un film puoi indicare la lunghezza, la trama, la lingua...\n" +"e, se e' un falso, puoi farlo presente agli altri utenti di aMule" + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Qualita' file" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" +"Giudica il file o avvisa gli altri utenti se il file non e' quello " +"corretto..." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Nessun commento" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Aggiorna" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Download in corso, attendere prego..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Dimensione sconosciuta" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Informazioni richieste" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "Indirizzo IP:" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Porta:" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Informazioni aggiuntive" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Nome utente:" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Hash utente:" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Ricarica file condivisi" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Sessione corrente" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Totale" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Richiesto:" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Upload attivi:" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Velocita' download" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Corrente" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Media attuale" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Media sessione" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Velocita' upload" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Connessioni" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Download attivi" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Connessioni attive (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Upload attivi" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Albero statistiche" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Nome utente:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Hash utente:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Software client:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Versione client:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "Indirizzo IP:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "ID utente:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "IP server:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Nome server:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "Trasferimenti al client" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Richiesta attuale:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Velocita' media upload:" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Velocita' media download:" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Inviati nella sessione:" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Scaricati nella sessione:" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Inviati in totale:" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Scaricati in totale:" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Punteggi" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "Modificatore DL/UL:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Identificazione sicura" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Giudizio (totale):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Punteggio in coda:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Impostazioni generali" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Nick" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - il Mulo per Linux" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "" +"Questo e' il nome che gli altri utenti visualizzeranno quando saranno " +"connessi con te" + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Lingua" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "Scelta della lingua utilizzata" + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Altre opzioni" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Verifica la disponibilita' di nuove versioni all'avvio" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" +"Abilitare questa opzione fara' si' che aMule all'avvio verifichi la " +"disponibilita' di nuove versioni" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Avvia ridotto ad icona" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "" +"Abilitando questa opzione, aMule si minimizzera' automaticamente all'avvio" + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Chiedi conferma prima di uscire" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "Fa si' che aMule chieda conferma prima di uscire" + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Abilita icona nel systray" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "" +"Abilita o disabilita l'icona nella system tray o nella barra delle " +"applicazioni" + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "Icona per la System Tray" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" +"Abilitando questa opzione aMule verra' minimizzato nella System Tray invece " +"che nella barra delle applicazioni" + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Ritardo dei popup in secondi" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "Intervallo di tempo prima che vengano mostrati i popup" + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Selezione browser:" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Seleziona il tuo browser" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Browser personalizzato:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Inserisci il nome del tuo browser. Per usare un browser diverso, seleziona " +"Browser Personalizzato nel menu" + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Apri in un nuovo tab se possibile" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" +"Se possibile, apri la pagina web in un nuovo tab invece che in una nuova " +"finestra" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Limiti banda" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Upload" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Allocazione slot" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Capacita' linea" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" +"Nota: Questi valori sono\n" +"usati solo a fini statistici." + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Porta TCP standard del client:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "Questa e' la porta ed2k standard e non puo' essere disabilitata." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Porta UDP avanzata del client:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" +"Questa porta UDP e' usata per richieste ed2k avanzate e per la rete Kad" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "disabilita" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Bind Address" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "Porta UDP per le richieste estese del server (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Fonti massime per file" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Limite massimo" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Limiti connessione" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Connessioni massime" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Universal Plug and Play" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "Attiva UPnP" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "Porta TCP per UPnP:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Connetti automaticamente all'avvio" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Riconnetti dopo perdita connessione" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Mostra overhead banda" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Opzioni server" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Rimuovi server inattivi dopo" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "tentativi" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Aggiorna lista server all'avvio" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Lista" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Aggiorna lista server quando ci si connette ad un server" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Aggiorna lista server quando un client si connette" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Usa sistema di priorita'" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Usa controllo intelligente del LowID in fase di connessione" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Connessione sicura" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Connetti automaticamente solo ai server statici" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Assegna priorita' alta ai server aggiunti manualmente" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "ICH attivo" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICH si fida di ogni hash (sconsigliato)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Aggiungi i nuovi file da scaricare mettendoli in pausa" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Aggiungi i nuovi file da scaricare con priorita' automatica" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Cerca di scaricare prima la parte iniziale e finale del file" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Assegna priorita' automatica ai nuovi file condivisi" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Cerca di trasferire parti complete per ogni upload" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Avvia un file in pausa quando un altro file e' stato completato" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "Della stessa categoria" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "Salva 10 fonti per i file rari (< 20 fonti)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Spazio disco" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Verifica spazio disco" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "" +"Seleziona questa opzione per far verificare ad aMule lo spazio su disco" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Spazio su disco minimo:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Inserire lo spazio disco minimo desiderato" + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Directory file scaricati:" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Directory file temporanei:" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Directory condivise" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "(clicca col tasto destro sulle icone per condividere ricorsivamente)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Condividi file nascosti" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Riproduttore video" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Crea copia di backup per l'anteprima" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Grafici" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Intervallo di aggiornamento: 5 secondi" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Intervallo grafico valori medi: 100 minuti" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Scala grafico connessioni: 100 " + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Seleziona colori statistiche" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Sfondo" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Griglia" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Download corrente" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Media download in corso" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Media sessione di download" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Upload corrente" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Media upload in corso" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Media sessione di upload" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Connessioni attive" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Barra della velocita' nell'icona systray" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Nodi Kad attuali" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Nodi Kad attivi" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Nodi Kad nella sessione" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Seleziona" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Numero di versioni di client visualizzate (0=illimitate)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Notifiche" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Messaggi popup" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Usa suono" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Mostra finestra di popup in caso di:" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Nuovo messaggio nel log" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Nuova sessione di chat" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Ricezione nuovo messaggio" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Aggiunta o conclusione di un download" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Nuova versione di aMule disponibile" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "OOD Urgente, persa connessione al server" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Notifica tramite mail" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Invia email quando il download e' completo." + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "Server SMTP:" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "Indirizzo email:" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! ATTENZIONE !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Non modificate queste impostazioni se non sapete\n" +"esattamente cosa state facendo: potreste ottenere\n" +"effetti indesiderati.\n" +"\n" +"aMule funzionera' anche senza modificare questi parametri." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Impostazioni avanzate" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Numero massimo nuove connessioni / 5 secondi" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Dimensione buffer file: 240000 bytes" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Dimensione coda upload: 5000 client" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Intervallo aggiornamento connessione al server: disabilitato" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "Tweaks GUI" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Avanzamento coda download" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Mostra percentuale" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Mostra barra di avanzamento" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Stile barra di avanzamento" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Piatta" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Arrotondata" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Supporto skin" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Abilita il supporto per le Skin" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Skin:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- nessuna skin disponibile -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Ordinamento colonne" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "Ordina automaticamente i file in download (elevato uso CPU)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "aMule ordinera' automaticamente le colonne nella lista dei download" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Tweaks GUI vari" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Mostra gestore rapido di link ed2k" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Mosta informazioni estese sulle schede delle categorie" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Mostra velocita' di trasferimento nella barra del titolo" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Orientamento verticale della barra degli strumenti" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Visualizza il numero del partfile prima del nome del file" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Controlli remoti" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Parametri webserver" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Lancia amuleweb all'avvio" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Porta webserver" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "Utilizza il port forwarding UPnP sulla porta del webserver" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Porta TCP del Webserver UPnP" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Intervallo di aggiornamento pagina (in sec)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Abilita compressione gzip" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Abilita utente con diritti limitati" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Password per diritti completi" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Password per diritti limitati" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Web template" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Parametri connessioni esterne" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Accetta connessioni esterne" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"IP dell'interfaccia in ascolto\n" +"(o vuoto per qualunque ip)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Inserisci un IP valido nel formato a.b.c.d per l'interfaccia di ascolto EC. " +"Lasciare il campo vuoto oinserire 0.0.0.0 significa qualsiasi interfaccia." + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "Porta TCP" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "Abilita il port forwarding UPnP sulla porta EC" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "Clicca qui per applicare le modifiche apportate alle impostazioni" + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Annulla ogni modifica alle preferenze" + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Titolo:" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Commento:" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Directory file scaricati:" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Cambia priorita' per i nuovi files assegnati:" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Non cambiare" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Seleziona colore per questa categoria (attualmente selezionata):" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Mostra motd del server alla connessione..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Informazioni server" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Clicca su questo pulsante per cancellare il log" + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "Log di aMule" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "Clicca qui per aggiornare la lista dei server dall'indirizzo..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Lista server" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Inserisci l'url di un file server.met e premi il pulsante a sinistra per " +"aggiornare la lista dei server conosciuti" + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Aggiungi server: nome" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Inserisci qui il nome di un nuovo server" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Inserisci qui l'IP del server, nel formato x.x.x.x" + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Inserisci qui la porta del server" + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "Aggiungi server (riempi campi a sinistra)..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "Informazioni ed2k" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Informazioni Kad" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"La localizzazione (lingua) selezionata sembra non essere installata\n" +"Non sara' dunque possibile selezionare questa lingua.\n" +"Nei sistemi linux verificare il file /etc/locale.gen e il programma " +"'locales'\n" +"Buona Fortuna!\n" +"(NB: aMule provera' comunque a impostare la lingua selezionata)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Non mostrare piu'" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "" +"Clicca su questo pulsante per aggiornare la lista dei nodi da un URL..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Nodi (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"Inserisci l'URL di un file nodes.dat e premi il pulsante a sinistra per " +"aggiornare la lista dei nodi conosciuti." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Statistiche nodi" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Bootstrap" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Nuovo nodo" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Porta:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Bootstrap da\n" +"client noti" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Disconnetti rete Kad" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Offuscamento del Protocollo" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Supporta Offuscamento del Protocollo" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"Questa opzione abilita l'Offuscamento del Protocollo, e fa si che aMule " +"accetti connessioni offuscate dagli altri client." + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Utilizza offuscamento per le connessioni in uscita" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"Questa opzione fa si che aMule utilizzi l'offuscamento del protocollo quando " +"si collega ad altri client/server." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Accetta SOLO connessioni offuscate" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"Attivando questa opzione aMule accettera' solo connessioni offuscate. Avrai " +"meno fonti, ma tutto il tuo traffico sara' offuscato" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Opzioni file" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Chiunque" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Nessuno" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Chi puo' vedere i file condivisi:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "" +"Seleziona chi puo' richiedere di vedere la lista dei tuoi file condivisi" + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "Filtraggio IP" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Filtra i client" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "Filtra i client in base agli ip contenuti in ~/.aMule/ipfilter.dat." + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Filtra i server" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "Filtra i server in base agli ip contenuti in ~/.aMule/ipfilter.dat." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Ricarica lista" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "Ricarica lista degli IP da filtrare dal file ~/.aMule/ipfilter.dat" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Aggiorna ora" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Aggiorna ipfilter all'avvio" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Livello filtraggio:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Filtra sempre gli IP di una LAN" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Gestione paranoica degli IP 'non-matching'" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Rifiuta pacchetto se l'IP del Client e' diverso dall'IP da cui arriva il " +"pacchetto. Utilizzare con cautela." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "Utilizza il file ipfilter.dat di sistema se disponibile" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" +"Se non esiste un file ipfilter.dat locale, consenti utilizzo di un file " +"ipfilter.dat di sistema" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "Utilizza la Secure User Identification" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" +"E' raccomandato abilitare questa opzione. Non riceverai crediti se la SUI " +"non è abilitata." + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Abilita/Disabilita" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Abilita firma online" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Abilita la scrittura del file OS che puo' essere usato da applicazioni " +"esterne per creare firme e simili" + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Frequenza di aggiornamento (secondi):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "" +"Cambia la frequenza (in secondi) degli aggiornamenti della firma online" + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Directory firma online:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" +"Clicca qui per selezionare la directory che contiene i file di firma online" + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Disabilita/Abilita" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "Filtra messaggi in arrivo (tranne per la chat in corso):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Opzioni filtro:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Filtra tutti i messaggi" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Filtra i messaggi da utenti che non sono nella tua lista degli amici" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Filtra i messaggi da client sconosciuti" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Filtra i messaggi che contengono (usa ',' come separatore):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"aggiungi qui le parole che aMule filtrera' rimuovendo i messaggi che le " +"contengono" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Commenti" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "Filtra i commenti contenenti (usa ',' come separatore):" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Abilita proxy" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Abilita o disabilita il supporto proxy" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Tipo proxy:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "Il tipo di proxy a cui ti stai connettendo" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Indirizzo proxy:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "Il nome host del proxy" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Porta proxy:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "La porta del proxy" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Autenticazione" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Abilita autenticazione" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Abilita o disabilita l'autenticazione con username e password" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "Username utilizzato per la connessione al proxy" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Password:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "La password usata per la connessione al proxy" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Connessione automatica al server senza proxy" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Connetti a:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Login su aMule remoto" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Nome utente" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Ricorda impostazioni" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Abilita il log dettagliato dei messaggi di debug" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "Categorie messaggi:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "Aggiunge importazioni" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Riprova selezionati" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Rimuvi selezionati" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Tipi di Eventi" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Connetti a qualsiasi server e/o a Kad" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Nuova categoria" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Scegli una directory per i file scaricati" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Devi specificare un nome per la categoria!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Devi specificare un percorso per la categoria!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"Impossibile creare una directory per i file in ingresso per questa " +"categoria. Specifica un percorso valido!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "Estensione '%s' sconosciuta per il comando '%s'.\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "Comando sconosciuto '%s'.\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"Questo comando non puo' avere un argomento.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"Questo comando richiede un argomento.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Questo comando e' incompleto, devi usare una delle estensioni qui " +"riportate.\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Estensioni disponibili:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Comandi disponibili:\n" + +#: src/ExternalConnector.cpp:188 +#, fuzzy, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"Tutti i comandi possono essere digitati in maiuscolo o minuscolo.\n" +"Digitare 'help ' per avere informazioni dettagliate su un " +".\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Esce dall'applicazione." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Mostra aiuto." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"Per avere aiuto su un comando, digitare 'help '.\n" +"Per avere la lista completa dei comandi, digitare 'help'.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"Usa '%s' per la lista dei comandi\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Errore di sintassi!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Errore nell'eseguire il comando - cio' non dovrebbe mai accadere! Per " +"favore, segnala il bug\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Questo comando non deve avere parametri." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Questo comando richiede un parametro." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Argomento non valido." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Questo comando e' incompleto." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Digita '%s' per avere altro aiuto.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "Questo e' %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "Questo e' %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Creazione del client in corso...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "Connessione fallita. Impossibile connettersi all'host specificato\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"Ok, uscita in corso da %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"Non posso connettermi con una password vuota.\n" +"Devi specificare una password nel file di configurazione oppure\n" +"nella linea di comando, o inserirne una quando richiesto.\n" +"\n" +"Sto uscendo...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Mostra questo suggerimento" + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "Host su cui aMule e' in esecuzione (default: localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "Porta di aMule per le connessioni esterne (default: 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Password connessioni esterne" + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Leggi la configurazione da file" + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "Non stampare output sullo stdout" + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Verboso - mostra anche i messaggi di debug" + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Imposta la localizzazione (lingua) del programma" + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "Salva le opzioni linea di comando nel file di configurazione" + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "Crea un file di configurazione basato su quello di aMule" + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Mostra la versione del programma" + +#: src/ClientCreditsList.cpp:168 +#, fuzzy, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "Il file dei crediti e' stato caricato, %u client conosciuti" +msgstr[1] "Il file dei crediti e' stato caricato, %u client conosciuti" + +#: src/ClientCreditsList.cpp:171 +#, fuzzy, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] "Crediti scaduti per %u client!" +msgstr[1] "Crediti scaduti per %u client!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "" +"Non e' stato trovato il file 'cryptkey.dat', creazione del file in corso." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"ERRORE: il demone di aMule non puo' essere usato se le connessioni esterne " +"sono disattivate. Per abilitare le connessioni esterne, puoi usare un aMule " +"normale, far partire amuled con l'opzione --ec-config o impostare la voce " +"\"AcceptExternalConnections\" a 1 nel file ~/.aMule/amule.conf" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "ERRORE: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Rimuovi ban" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Mostra upload" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Mostra coda" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Mostra client" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Seleziona visuale" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Software client" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Atteso" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Tempo upload" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Upload/Download" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Stato remoto" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "QR: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Priorita' file" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Punteggio" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Richiesto" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Ultima volta visto" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Aggiunto in coda" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Stato upload" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Inviati" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Stato download" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Ricevuti" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Hash utente" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Crittato" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Non mostrare file condivisi" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Dettagli client" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Non supportata" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Non completo" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Cattivo" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Verificata - OK" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Non disponibile" + +#: src/ClientDetailDialog.cpp:190 +#, fuzzy, c-format +msgid "%u (QR: %u)" +msgstr "QR: %u" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "Min size deve essere piu' piccola di max size. Ignoro max size." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Search warning" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Illimitato" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "Menu nel systray" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Limiti di velocita':" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "UL: nessuno" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "UL: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "DL: nessuno" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "DL: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Velocita' di download: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Velocita' di upload: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Informazioni client" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Nickname: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "Nessun nickname selezionato!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "ID Client: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Nome server: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "IP server: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "Porta TCP: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "Porta TCP: non pronta" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "Porta UDP: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "Porta UDP: non pronta" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Firma online: abilitata" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Firma online: disabilitata" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "File condivisi: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Client in coda: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "DL totale: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "UL totale: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Limite upload" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Limite download" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "Nascondi" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "Mostra" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "Sessione di chat iniziata: %s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Connesso al client ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** Connessione al client in corso ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Impossibile connettersi al client / Connessione persa ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Chiudi tab" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Chiudi tutti i tab" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Chiudi altri tab" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "Caricamento file server.met: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "File server.met non trovato!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" +"Impossibile caricare il file server.met '%s', trovato formato sconosciuto." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "Impossibile aprire il file server.met!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"Server.met corrotto, trovato tag di versione non valido: 0x%x, dimensione %i" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "Trovati %i server nel file server.met" +msgstr[1] "Trovati %i server nel file server.met" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "Aggiunti %d server" +msgstr[1] "Aggiunti %d server" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Server non aggiunto: [%s:%d] non specifica una porta valida" + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "Server non aggiunto: l'IP di [%s:%d] e' filtrato o non valido" + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" +"Server non aggiunto: server con corrispondente IP:Porta [%s:%d] trovato " +"nella lista" + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Server aggiunto: server [%s:%d] con il nome '%s'" + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "Sei connesso al server che vuoi cancellare. Disconnettiti prima" + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Impossibile salvare il file server.met!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "URL non valido" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "Completato scaricamento lista server da %s" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Impossibile scaricare la lista dei server da %s" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"Non e' stato trovato nessun indirizzo nel file 'addresses.dat'. Copia un " +"indirizzo che contenga la lista di server in questo file in modo da poter " +"aggiornare automaticamente la lista" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "Iniziato scaricamento lista server da %s" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" +"Attenzione, indicato URL non valido per l'aggiornamento automatico dei " +"server: %s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "Nessun URL di file server.met valido in addresses.dat" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"Il server locale e' filtrato da IPFilter, mi connetto ad un altro server!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "Impossibile eseguire il comando `%s' per l'evento `%s'." + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"Le tue impostazioni di localizzazione sono state impostate a quelle " +"predefinite dal sistema in conseguenza al cambio di configurazione. " +"Spiacente." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"Non hai alcun server nella lista dei server.\n" +"Vuoi che aMule scarichi una lista ora?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Server list download" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "Webserver attivo sul pid %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"Hai scelto di lanciare il webserver all'avvio, ma non e' stato possibile " +"eseguire amuleweb. Installa il pacchetto comprendente il webserver di aMule, " +"oppure compila aMule con l'opzione --enable-webserver." + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "La porta %u non e' disponibile. Otterrai un LowID\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"La porta %u non e' disponibile!\n" +"\n" +"Otterrai un LowID\n" +"\n" +"Controlla le impostazioni di rete e verifica che la porta sia aperta in " +"ingresso e in uscita." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Impossibile creare il file per la firma online" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "Impossibile creare il file per la firma online di aMule" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"L'impostazione locale selezionata non sembra essere installata sul tuo " +"computer (si tentera' ad impostarla in ogni caso)" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "e' la prima che volta che avvii aMule %s" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "Questa e' una versione di prova, aggiornata quotidianamente, e\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "non garantiamo che essa non distrugga qualcosa, bruci la tua casa,\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "o uccida il tuo cane. Ma *dovrebbe* essere comunque sicura.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" +"Le seguenti opzioni sono state modificate in questa release per motivi di " +"sicurezza:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* Attiva Offuscamento del Protocollo per connessioni in ingresso e in " +"uscita.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* Disattivato l'aggiornamento automatico della serverlist dagli altri client " +"e server.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"Per ulteriori informazioni sui motivi di queste modifiche, vedere il\n" +" wiki di aMule su http://wiki.amule.org alla voce \"fake servers\".\n" +"E' importante eliminare tutti i fake server dalla tua lista perche' aMule " +"funzioni correttamente." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Altre informazioni, supporto e nuove versioni possono essere trovate nella " +"nostra homepage,\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "www.aMule.org, o nel nostro canale IRC #aMule su irc.freenode.net.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Riportate ogni bug su http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"La directory scelta per contenere il file di firma online e' invalida!\n" +"La firma online verra' pertanto disabilitata fino a quando il problema non " +"sara' stato risolto attraverso il pannello delle preferenze." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "ERRORE: non posso aprire il file di log" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "ERRORE: il file di log e' vuoto. Qualcosa non va" + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Il file di log e' stato cancellato" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "Messaggio del server: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Impossibile scaricare la lista dei nodi." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Impossibile aprire il file per il controllo della versione scaricato" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "File per il controllo della versione corrotto" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Stai usando una versione non aggiornata di aMule!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "La tua versione di aMule e' la %i.%i.%i e l'ultima e' la %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "L'ultima versione e' sempre disponibile su http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "" +"ATTENZIONE: La tua versione di aMuled e' obsoleta: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "La tua copia di aMule e' aggiornata" + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Impossibile scaricare il file per il controllo della versione" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Connesso a %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Connessione in corso a %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Disconnesso dalla rete ed2k" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad avviato." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad arrestato." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Connesso alla rete Kad (ok)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Connesso alla rete Kad (firewalled)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Disconnesso dalla rete Kad" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"La rete Kad non puo' essere utilizzata se la porta UDP e' disattivata dalle " +"opzioni." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Rete Kad disattivata dalle opzioni, non mi connetto." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "" +"Impossibile aprire in lettura il file della lista degli amici 'emfriend.met'!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "" +"Impossibile aprire in scrittura il file della lista degli amici 'emfriend." +"met'!" + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "" +#~ "Non e' ancora possibile effettuare il bootstrap da un IP specifico " +#~ "utilizzando la GUI remota." + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "Non puoi ancora aggiornare il file server.met falla GUI remota." + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "Letti %u contatti Kad" +#~ msgstr[1] "Letti %u contatti Kad" + +#~ msgid "Disconnect from " +#~ msgstr "Disconnetti da " + +#~ msgid "current server" +#~ msgstr "Server attuale" + +#~ msgid " and " +#~ msgstr " e " + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "Disconnetti da tutti i server e da Kad" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "TCP Flags" +#~ msgstr "Opzioni TCP" + +#~ msgid "UDP Flags" +#~ msgstr "Opzioni UDP" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "Copia link ed2k negli appunti" + +#~ msgid "Client requests %u" +#~ msgstr "Richiesta dal client %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "File block %u-%u (%d byte):" + +#~ msgid "Client request is invalid!" +#~ msgstr "La richiesta del client non e' valida!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "La richiesta del client non e' valida! %i / %i" + +#~ msgid "Command: %s" +#~ msgstr "Comando: %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "Impossibile aprire il file %s - uso il file %s" + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "Attenzione: known.met non esiste." + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles: Elimino %s dalla lista di directory " +#~ "condivise: la directory non esiste." + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "Attesa del termine del sottoprocesso fallita" + +#~ msgid "" +#~ "You cannot connect to a release version from an arbitrary CVS version! " +#~ "*sigh* possible crash prevented" +#~ msgstr "" +#~ "Non puoi connetterti a una versione finale da una versione CVS qualsiasi! " +#~ "*sigh* possibile crash evitato" + +#~ msgid "doesn't work" +#~ msgstr "non funziona" + +#~ msgid "remote gui" +#~ msgstr "gui remota" + +#~ msgid "" +#~ "Error: Failed to load backup file. Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "ERRORE: impossibile caricare il file di backup. Cercare su http://forum." +#~ "amule.org le soluzioni per il recupero dei .part.met" + +#~ msgid "" +#~ "Error: Backup part.met file is 0 size! Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "ERRORE: il backup del file part.met e' di dimensione 0! Cerca una " +#~ "soluzione su http://forum.amule.org/" + +#~ msgid "Error: part.met backup file is 0 size: %s ==> %s" +#~ msgstr "" +#~ "Errore: il file di backup del part.met e' di dimensione 0: %s ==> %s" + +#~ msgid "" +#~ "Note: These values are\n" +#~ " only used for statistics." +#~ msgstr "" +#~ "Nota: questi valori sono\n" +#~ "usati solo nelle statistiche" + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ " 'All-Platform' client p2p basato su eMule \n" +#~ "\n" +#~ " Sito web: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " Domande Frequenti: http://wiki.amule.org \n" +#~ "\n" +#~ " Contatti: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Una Parte di aMule si basa su \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "ATTENZIONE: hai ottenuto un LowID!" + +#~ msgid "" +#~ "This command requieres an argument. Valid arguments: 'all' or a number.\n" +#~ msgstr "" +#~ "Questo comando richiede un argomento. Argomenti validi: 'all' o un " +#~ "numero\n" + +#~ msgid "This command requieres an argument. Valid arguments: a file hash.\n" +#~ msgstr "" +#~ "Questo comando richiede un parametro. Parametri validi: l'hash di un " +#~ "file.\n" + +#~ msgid "Deprecated command, now 'Status'." +#~ msgstr "Comando deprecato, usare 'Status'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Status' instead.\n" +#~ msgstr "" +#~ "Questo comando e' deprecato e in futuro potrebbe essere rimosso.\n" +#~ "Usare 'Status' al suo posto.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter'." +#~ msgstr "Comando deprecato, usare 'Set IPFilter'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter' instead.\n" +#~ msgstr "" +#~ "Questo comando e' deprecato e in futuro potrebbe essere rimosso.\n" +#~ "Usare 'Set IPFilter' al suo posto.\n" + +#~ msgid "Deprecated command, now 'Get IPFilter Level'." +#~ msgstr "Comando deprecato, usare 'Get IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Questo comando e' deprecato e in futuro potrebbe essere rimosso.\n" +#~ "Usare 'Get IPFilter Level' al suo posto.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter Level'." +#~ msgstr "Comando deprecato, usare 'Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Questo comando e' deprecato e in futuro potrebbe essere rimosso.\n" +#~ "Usare 'Set IPFilter Level' al suo posto.\n" + +#~ msgid "Deprecated command, now 'Get/Set IPFilter Level'." +#~ msgstr "Comando deprecato, usare 'Get/Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get/Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Questo comando e' deprecato e in futuro potrebbe essere rimosso.\n" +#~ "Usare 'Get/Set IPFilter Level' al suo posto.\n" + +#~ msgid "Deprecated command, now 'Show Servers'." +#~ msgstr "Comando deprecato, usare 'Show Servers'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Show Servers' instead.\n" +#~ msgstr "" +#~ "Questo comando e' deprecato e in futuro potrebbe essere rimosso.\n" +#~ "Usare 'Show Servers' al suo posto.\n" + +#~ msgid "Deprecated command, now 'Get BwLimits'." +#~ msgstr "Comando deprecato, usare 'Get BwLimits'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get BwLimits' instead.\n" +#~ msgstr "" +#~ "Questo comando e' deprecato e in futuro potrebbe essere rimosso.\n" +#~ "Usare 'Get BwLimits' al suo posto.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Up'." +#~ msgstr "Comando deprecato, usare 'Set BwLimit Up'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Up' instead.\n" +#~ msgstr "" +#~ "Questo comando e' deprecato e in futuro potrebbe essere rimosso.\n" +#~ "Usare 'Set BwLimit Up' al suo posto.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Down'." +#~ msgstr "Comando deprecato, usare 'Set BwLimit Down'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Down' instead.\n" +#~ msgstr "" +#~ "Questo comando e' deprecato e in futuro potrebbe essere rimosso.\n" +#~ "Usare 'Set BwLimit Down' al suo posto.\n" + +#~ msgid "Syncronization thread started." +#~ msgstr "Thread di sincronizzazione avviato." + +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "Caricati i masterhash dei file conosciuti." + +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "Errore nella lettura dei contatti Kad - 0 contatti" + +#~ msgid "Merge attempt" +#~ msgstr "Cerco di riunire" + +#~ msgid "Recursive merge" +#~ msgstr "Riunione ricorsiva" + +#~ msgid "Sucessful merge!" +#~ msgstr "Riunione completata!" + +#~ msgid "No merge possible" +#~ msgstr "Impossibile riunire" + +#~ msgid "Buddy address: " +#~ msgstr "Indirizzo dell'amico: " + +#~ msgid "Allow usage of system wide ipfilter.dat" +#~ msgstr "Consenti utilizzo di un file ipfilter.dat di sistema" + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid " %d" +#~ msgstr " %d" + +#~ msgid ".%d" +#~ msgstr ".%d" + +#~ msgid "Shows the process of a search." +#~ msgstr "Mostra il processo di una ricerca." + +#~ msgid "Shows the process of a search..\n" +#~ msgstr "Mostra il processo di una ricerca..\n" + +#~ msgid "Search warning." +#~ msgstr "Search warning." + +#~ msgid "Client Identification:" +#~ msgstr "Identificazione client:" + +#~ msgid "Use Secure Identification" +#~ msgstr "Usa identificazione sicura" + +#~ msgid "" +#~ "Secure Identification uses a handshake approch to safely identify clients " +#~ "for use with the credit system." +#~ msgstr "" +#~ "L'identificazione sicura usa un approccio handshake per identificare i " +#~ "client che usano il sistema di crediti" + +#~ msgid "Sources Dropping" +#~ msgstr "Gestione fonti" + +#~ msgid "Source Dropping" +#~ msgstr "Gestione fonti" + +#~ msgid "Keep sources" +#~ msgstr "Mantieni fonti" + +#~ msgid "Drop sources" +#~ msgstr "Rilascia fonti" + +#~ msgid "Send sources to any other file before dropping (High CPU)" +#~ msgstr "" +#~ "Invia le fonti agli altri file prima di rilasciarle (elevato uso CPU)" + +#~ msgid "Sources with no needed file-parts." +#~ msgstr "Fonti con parti non necessarie" + +#~ msgid "Full Queue Sources Handling" +#~ msgstr "Gestione Fonti con Coda Piena" + +#~ msgid "Enable auto drop Full Queue Sources" +#~ msgstr "Abilita rilascio automatico Fonti con Coda Piena" + +#~ msgid "High Queue Rating Sources Handling" +#~ msgstr "Gestione Fonti con Coda Molto Lunga" + +#~ msgid "Enable auto drop High Queue Rating Sources" +#~ msgstr "Abilita rilascio automatico Fonti con Coda Molto Lunga" + +#~ msgid "High Queue Rating value" +#~ msgstr "Valore Coda Molto Lunga" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(Min 300 / Max 3000)" + +#~ msgid "Auto Drop Sources Timer" +#~ msgstr "Intervallo rilascio automatico delle fonti" + +#~ msgid "Timer (in secs)" +#~ msgstr "Intervallo (in sec)" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(Min 60 / Max 3600)" + +#~ msgid "Drop No Needed Sources now" +#~ msgstr "Rilascia Fonti Non Necessarie" + +#~ msgid "Drop Full Queue Sources now" +#~ msgstr "Rilascia Fonti con Coda Piena" + +#~ msgid "Drop High Queue Rating Sources now" +#~ msgstr "Rilascia Fonti con Coda Molto Lunga" + +#~ msgid "Clean Up Sources now (NNS, FQS && HQRS)" +#~ msgstr "Pulisci fonti (FNN, FCP && FCML)" + +#~ msgid "English (U.S.)" +#~ msgstr "Inglese (U.S.)" + +#~ msgid "Spanish (Mexican)" +#~ msgstr "Spagnolo (messicano)" diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 00000000..deb9c544 --- /dev/null +++ b/po/ja.po @@ -0,0 +1,7366 @@ +# Japanese translations for PACKAGE package. +# Copyright (C) 2007 Free Software Foundation, Inc. +# This file is distributed under the same license as the PACKAGE package. +# , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: ja\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2007-11-18 11:27+0100\n" +"Last-Translator: \n" +"Language-Team: Japanese\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "空欄のパスワードは無効です。" + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "不正なパスワード、 MD5ハッシュではありません!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "コネクションに失敗しました" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "ECコネクションに失敗しました。回答が空欄でした。" + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr " ExternalConn: アクセスが拒否された理由: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "ExternalConn: アクセスは拒否されました" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "ExternalConn: サーバーからの回答は不利で、コネクションを終了しました。" + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "成功です!コネクションを設立しました:aMule " + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "成功です!コネクションンを設立しました。" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "ハッシュ中です" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "終了中です" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "終了しました" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "ポーズ中です" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "誤りです" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "ダウンロード中です" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "待機中です" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "ファイル %s のためのMD4とAICHハッシュを作り出し中です" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "ファイル %s のためのMD4ハッシュを作り出し中です" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "ファイル %s のためのAICHハッシュを作り出し中です" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "'%s' の古いAICHハッシュセットを '%s' の64bに変換中です。" + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "注意:ファイルネーム '%s' は無効で、 '%s' に改名されました。" + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "" +"注意:ファイル'%s'は既に存在していて、新しいファイルを'%s'に改名しました。" + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" +"注意:バックアップをしてからオリジナル '%s' を消すことが出来ませんでした" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "注意: %s を消すことが出来ませんでした" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "ユーザ '%s' から共有ファイルを回収出来ませんでした" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "不明です" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr "(偽のeMuleバージョン %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr "(偽のeMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule(偽のeMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x(eMule v0.%u に基づいています)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "NickName: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "要求:" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"当セッションのファイル統計: %d 要求の中 %d 認識され、 %s 転送された\n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"全セッションのファイル統計: %d 要求の中 %d 認識され、 %s 転送された\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "不明なファイルが要求されました" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "クライアント %s がIP:ポート %s:%d にいて、 %s %s %s を使用しています" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "ユーザ名" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "友達" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "表示 &Details" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "友達を追加する" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "友達を削除する" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "送信 &Message" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "ファイルを見る" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "友達スロットを設立する" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "確認:選択された友達を削除しますか?" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "確認:選択された友達を削除しますか?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "カンセル" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "スロットが一つのみ提供されました。" + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "複数選択" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "ファイル名" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "サイズ" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "タイプ" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "プライオリティー" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "ファイルID" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "要求" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "認められた要求" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "転送されたデータ" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "共有非" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "得られた部分" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "完成したソース" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "ディレクトリパース" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "共有ファイル" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "非常に低い" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "低い" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "普通" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "高い" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "非常に高い" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "離す" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "オート" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "コメント・レーティングを追加する" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "コメント・レーティングを編集する" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "改名する" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "コレクションに存在するファイルを転送リストに追加する" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "マグネット &URI をクリップボードにコピーする" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "ED2K &link をクリップボードにコピーする" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "ED2kリンクをクリップボードにコピーする(&Source)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "" +"ED2kリンクをクリップボードにコピーする(Source)(&Withクリプトオプション)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "ED2kリンクをクリップボードにコピーする(&Hostname)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" +"ED2kリンクをクリップボードにコピーする(Hostname)(With &Cryptオプション)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "ED2kリンクをクリップボードにコピーする(&AICH インフォ)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "フィードバックをクリップボードにコピーする" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "有効なソースリンク作るにはHighIDが必要です" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "注意" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "共有ファイル(%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[部分ファイル]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "このファイルの新しい名前を記入してください:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "ファイルの改名" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "ファイル %s のアップロードを再開します" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "ファイル %s のアップロードを一時停止します" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: 検索キーワードが短過ぎます" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "エラー:TCPポートを聞くことが出来ませんでした。" + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "次のエラーで要求が失敗しました: %s。" + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "要求が不明なエラーで失敗しました。" + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "インデックスファイルが見付かりませんでした: " + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "ウェッブソッケトスレッドを作ることが出来ません\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "ウェッブサーバ: 始動しました\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "セッション有効期限が切れ間した - ログインを要求しています\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "セッションOK、ログインしています\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "セッションOK、ログインしていません\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "セッションが開いていません - ログインを要求します\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "セッションを作成しました - ログインを要求しています\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "要求を処理中です [original]: " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "パスワードをチェック中です\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "パスワードのハッシュが無効です\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "パスワードOKです\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "パスワードが不利です\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "" +"パスワードを入力しませんでした。空欄のパスワードは許可されていません。\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "ログアウトが要求されました\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "要求を処理中です [変更しました]: " + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "テンプレート をロードします" + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "ウェッブサーバのHTTPポート" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "ウェッブサーバポートでUPnPポート転送を使用してください" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "UPnPポート" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "gzipコンプレションを使用してください" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "ウェッブサーバのフルアクセスパスワード" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "ウェッブサーバのゲストパスワード" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "ゲストアクセスを許可する" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "ゲストアクセスを拒否する" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "リモートaMuleへ/からのウェッブサーバ設定をロード/セーブする" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "aMuleの設定ファイルパス。注意:直接使用しないでください!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "PHPインタープレタを無効にする(廃止予定)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "各リクエストでPHPページを再コンパイルする" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "aMuleウェッブサーバ" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "利用不可能" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "記憶ありません" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "ダウンロード中…" + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s)" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "個人設定" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "amulesig.datファイルの入っているディレクトリー" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "ブラウズ" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "amulesig.datファイルが入っているディレクトリーをここで入力してください" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "秒単位のリフレッシュレート間隔" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "各リフレッシュイベントで統計イメージを生成する" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "統計イメージを生成したいディレクトリーをここで入力してください" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "統計イメージを定期的にFTPサーバへアップロードする" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "FTPのUrl" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "FTPのパース" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "FTPサーバのURLをここで入力してください" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" +"統計イメージを置きたいFTPサーバのディレクトリーをここで入力してください" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "ユーザ" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "パスワード" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "FTPサーバのログインに使うユーザ名をここで入力してください" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "FTPサーバのログインに使うパスワードをここで入力してください" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "分単位のFTPアップデートレート間隔" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "実証" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "署名ファイルが入ているフォルダ" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "統計イメージを生成するフォルダ" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i 日 %i 時間 %i 分 %i 秒" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas、aMuleのオンライン統計" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "ようこそ!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "wxCasの起動以来の最大DLレート" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "前のwxCas起動を含めて記憶した最大DLレート" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "リセット" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "システム" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "オートリフレッシュを中止する" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "オンライン統計イメージを保存する" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "オンライン統計イメージをプリントする" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "個人設定" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "wxCasについて" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "オートリフレッシュを開始する" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "オートリフレッシュを中止しました" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "オートリフレッシュを開始しました" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "統計イメージを保存する" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "このファイルタイプのハンドラがありません。" + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "ファイルは保存されてませでした" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "aMuleのオンライン統計" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "現在選択されたプリンタの設定に異常がありませんか?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "プリント中です" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas、aMuleのオンライン署名統計\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pedro de Oliveira のCASに基いています\n" +"\n" +"GPLの元で配布されます" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "あら、aMuleは始動されていません…" + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMuleは始動しています" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMuleは始動していますが接続はしていません" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMuleは接続中です…" + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "あら、aMuleのステータスは不明です…" + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " の始動時間は " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " は停止しています!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " は接続していません!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " は接続中です…" + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " は何か可笑しいことをやっています。チェックしてくだい!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " は次の物に接続しています: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kas: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "ok" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "ファイアウォールされています" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "オッフ" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " はオンです " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +#, fuzzy +msgid " with " +msgstr "] とともに " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "合計ダウンロード: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr "、 アップロード: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "セションダウンロード: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "ダウンロード: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " キロバイト(毎秒)、アップロード: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "キロバイト(毎秒)" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "共通: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " ファイル、列で待っているクライアント: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "時間: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "毎秒%.2fキロバイト" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " オン " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "システムロード平均 (1-5-15分): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "システムアップタイム: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uD %02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "HighID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "LowID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "接続されていません" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0fバイト" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2fキロバイト" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2fメガバイト" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2fギガバイト" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2fテラバイト" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "キャンセルされました!" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "%s を開くことが出来ません" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "ファイル %s はDonkeyにとって大きすぎます:最大許可サイズは4GBです。" + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "インプットパラメタ" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "ハッシュをするファイル" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "このファイルにオプショナルURLを追加する" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Ed2kリンクを計算したいフィアルをここで記入してください" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Ed2kリンクを追加したいURLをここで記入してください:最後に「/」を書いて、 それ" +"でaLinkCreatorは現在のファイル名を追加ことが出来ます" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "追加" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "消除" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "クリアする" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "パートハッシュでリンクを生成する" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"新しくて珍しいファイルを配布のに手伝って、コストとしてリンクサイズが少し 大き" +"くなります" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "MD4ファイルハッシュ" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "Ed2kファイルハッシュ" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "Ed2kリンク" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "開始" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "保存する" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "クリップボードへコピーする" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "終了" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Ed2kリンクを計算するためにファイルを開く" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "計算したEd2kリンクをクリップボードへコピーする" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "計算したEd2kリンクをフィアルに保存する" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "aLinkCreatorについて" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Ed2kリンクを計算したいファイルを選択してください" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "現在コピー出来る物がありません!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Ed2kリンクに対応するファイルを選択してください" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "次のを開くことが出来ません: " + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "空欄でないファイル名を記入してください" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "現在保存出来る物がありません!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator、aMuleのed2kリンク製作プログラム\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"ピクスマップはhttp://www.everaldo.com、http://www.icomania.com\n" +"とhttp://jimmac.musichall.cz/ikony.php3からです\n" +"\n" +"GPLの元で配布されます" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "ハッシュ中…" + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr " %.2f 秒で出来ました" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "このURLはもう追加しました!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "空欄でないURLを記入してください" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "ファイル %u: %s 番を処理中です" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "" +"パートハッシュを頼みました(9.5MB以上のファイルサイズのみに使用されます)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "お待ちください…" + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> このファイルは存在していません!\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator、aMuleのed2kリンク作成プログラム" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "オート [Lo]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "オート [No]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "オート [Hi]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "接続中" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "頼み中" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "サーバ経由に接続中" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "列が一杯" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "列に入っています" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "転送中" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "ハッシュセットを貰い中" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "必要な部分がありません" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "LowIDとLowIDの間の接続が出来ません" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "コネクションが多すぎます" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Kad経由に接続中" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Kadコネクションが多すぎます" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "禁止された" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "コネクションエラー" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "リモート列が一杯" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "古いMLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "新しいMLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "eMuleと互換性がある" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "ローカルサーバ" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "リモートサーバ" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "ソース交流" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "パシブ" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "リンク" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "ソーヅシード" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "システムデファオルト" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "アラブ語" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "バスク語" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "ブルガリア語" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "カタロニア語" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "中国語(簡体字)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "中国語(繁体字)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "クロアチア語" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "チェコ語" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "デンマーク語" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "オランダ語" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "英語(イギリス)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "エストニア語" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "フィンランド語" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "フランス語" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "ガリシア語" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "ドイツ語" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "ギリシア語" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "ハンガリー語" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "イタリア語" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "イタリア語(スイス)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "日本語" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "韓国語" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "リトアニア語" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "ルウェー語" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "ポーランド語" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "ポルトガル語" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "ポルトガル語(ブラジル)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "ロシア語" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "スロベニア語" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "スペイン語" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "スウェーデン語" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "トルコ語" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "選択されたブラウザが見付かりません!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" +"サーバのUDPソケトがTCP+3であるためTCPポートを65532以上には設定出来ません" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "デフォルトポートを使用します (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "サーバ名" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "アドレス" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "ポート" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "説明" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "ピング" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "ユーザ" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "ファイル" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "失敗しました" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "スタティック" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "バージョン" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"只今接続中のサーバを消除しようとしています。先に切断してください。 このサーバ" +"は消除されませんでした。" + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "インフォ" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(不明な名前)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "確認:次スタティックサーバ %s を本当に消除しますか?" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "はい" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "いいえ" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "'%s'を開くことが出来ませんでした" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "サーバ (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "サーバ" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "サーバへ接続する" + +#: src/ServerListCtrl.cpp:428 +#, fuzzy +msgid "Mark server as static" +msgstr "サーバをスタティックとしてマークする" + +#: src/ServerListCtrl.cpp:429 +#, fuzzy +msgid "Mark server as non-static" +msgstr "サーバをノンスタティックとしてマークする" + +#: src/ServerListCtrl.cpp:431 +#, fuzzy +msgid "Mark servers as static" +msgstr "サーバをスタティックとしてマークする" + +#: src/ServerListCtrl.cpp:432 +#, fuzzy +msgid "Mark servers as non-static" +msgstr "サーバをノンスタティックとしてマークする" + +#: src/ServerListCtrl.cpp:438 +#, fuzzy +msgid "Remove server" +msgstr "サーバを消除する" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "サーバを消除する" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "全てのサーバを消除する" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "ED2kリンクをクリップボードへコピーする" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "ED2kリンクをクリップボードへコピーする" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "サーバへ再接続する" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "確認:全てのサーバを本当に消除しますか?" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "確認:全ての選択されたサーバを本当に消除しますか?" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "確認:全ての選択されたサーバを本当に消除しますか?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "使用不可能 [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "これはeMuleに基ずいたaMule %s です。" + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "%s に起動しています" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "http://www.amule.orgを訪れて、新しいバージョンチェックをしてください。" + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "致命的なエラー:タイマを生成出来ませんでした" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "aMuleリモート制御" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "スナップショット:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" +" eMuleに基づいた'全プラットフォーム'P2Pクライアントです\n" +"\n" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr " ウェッブ・サイト:http://www.amule.org \n" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr " フォーラム:http://forum.amule.org \n" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" +" よくある質問:http://wiki.amule.org \n" +"\n" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr " 問い合わせ:admin@amule.org(事務的関係) \n" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" +" 著作権2003-2008、aMuleのチーム\n" +"\n" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "aMuleのある部分は\n" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "Kademliaにもと基づいています:XORトリックに基づいたP2Pルーティング。\n" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr " 著作権2002、Petar Maymounkov\n" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr " http://kademlia.scs.cs.nyu.edu\n" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "メッセージ" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "ステータステキスト" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "接続中" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "切断" + +#: src/amuleDlg.cpp:676 +#, fuzzy +msgid "Kad: Firewalled" +msgstr "ファイアワォールされています" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "接続" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "接続中" + +#: src/amuleDlg.cpp:689 +#, fuzzy +msgid "Kad: Off" +msgstr " Kas: " + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "現在のコネクション試みを中止する" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "切断する" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "ネットワークから切断します。" + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "接続する" + +#: src/amuleDlg.cpp:726 +#, fuzzy +msgid "Connect to the currently enabled networks" +msgstr "ネットワークへ接続します。" + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "アップ: %.1f(%.1f) | ダウン: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "アップ: %.1f | ダウン: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | 接続しています)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | 切断しています)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "確認:本当にaMuleを終了しますか?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "終了の確認" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "ブラウザを起動させるコマンドを見付けられませんでした。" + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "スキンディレクトリー '%s' は存在しません" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "注意: スキンファイル '%s' を読むために開けませんでした" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "ネットワーク" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "ネットワークウィンドウ" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "検索" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "検索ウィンドウ" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "転送" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "ファイル転送ウィンドウ" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "共通ファイルウィンドウ" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "メッセージ" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "メッセージウィンドウ" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "統計" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "統計グラフウィインドウ" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "個人設定ウィンドウ" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "インポート" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "パートファイルインポータツール" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "について" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "について/ヘルプ" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "全般的" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "コネクション" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "プロクシ" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "メッセージフィルタ" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "リモート制御" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "オンライン署名" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "ディレクトリー" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "セキュリティー" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "GUI設定" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "コア設定" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "イベント" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "ディバッギング" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "ユーザ定義" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "この変更点を有効するにはaMuleを再起動しなければなりません:\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- TCPポートを変更しました。\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- UDPポートを変更しました。\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"オートアップデートサーバリストが空欄です。\n" +"'スタートアップにサーバリストをオートアップデートする'を使用不可能にします。" + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"外部コネクションを有効にしましたがパスワードを設定していません。\n" +"有効なパスワードを設定しないと外部コネクションを可能出来ません。" + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- 言語を変更しました。\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- 臨時フォルダーを変更しました。\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "アップ: 0.0 | ダウン: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"ED2KとKadネットワークの両方が無効です。\n" +"せめてその一つを有効しないと接続出来ません。" + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"UDPポートが無効だとKadは始まりません。\n" +"UDPポートを有効にして、それともKadを無効にしてください。" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"必ず早急にaMuleを再起動してください。\n" +"今再起動しななければおかしいことが行ってもしかたがありません。\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "注意" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"オートアップデートサーバリストが空欄です。\n" +"せめて一つのURLを記入して、有効なserver.metファイルを指示してください。\n" +"このチェックボクスの近くの\"表\"ボタンをクリックして、URLを記入してください。" + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "臨時ファイル" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "到着ファイル" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "オンライン署名" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr " %s のためのフォルダーを選択する" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "wavをブラウズする" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "ファイルwav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "ビデオプレヤーを探すためにブラウズする" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "ブラウザを選択する" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "実行ファイル%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "サーバリストを編集する" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"ここでserver.metファイルをダウンロードするにURLを追加してください。\n" +"一行に一つのURLのみ。" + +#: src/PrefsUnifiedDlg.cpp:980 +#, fuzzy, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "アップデート遅延時間: %d 秒" + +#: src/PrefsUnifiedDlg.cpp:987 +#, fuzzy, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "平均グラフの時間: %d 分" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "コネクショングラフ規模: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, fuzzy, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "アップデート遅延時間: %d 秒" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, fuzzy, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "ファイルバッファサイズ: %d バイト" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, fuzzy, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "アップロード列サイズ: %d クライアント" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, fuzzy, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "サーバコネクションリフレッシュ遅延時間: %d 分" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "サーバコネクションリフレッシュ遅延時間: 無効" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr " `%s' イベントにコマンドを実行する" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "コアにコマンドを実行するのを有効する" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "コアコマンド:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "GUIにコマンドを実行するのを有効する" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "GUIコマンド:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "次の任意は交換されます:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "不正アクセスの試し。コネクションは終了しました。" + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "外部コネクションは終了しました。" + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "外部コネクションは空欄のパスワードのため無効にしました!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "外部コネクションを設定ファイルに無効しました" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "新しい外部コネクションを認められました" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "エラー:新しい外部コネクションを認めることが出来ませんでした" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "外部コネクションを個人設定に空欄のパスワードがあるため許否しました!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "クライアントを接続中: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "不明なバージョン" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"間違ったECバージョンID。バイナリー不互換性の可能性があります。同じスナップ" +"ショットの コアとリモートを使用してください。" + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" +"リリース・バージョンには任意のSVNバージョンから接続は出来ません!あー、可能の" +"クラシュを予防しました" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "認証に失敗しました。" + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "無効なプロトコルバージョン。" + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "プロトコルバージョンタッグがありません。" + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "無効なリクエスト、先に認証をしてください。" + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "アクセスを認められました。" + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" +"リモート部分ファイルコマンドが失敗しました:ファイルハッシュは見付かりません" +"でした: %s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "ファイルハッシュは見付かりませんでした: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "あら!OpCode処理エラーが発生しました!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "サーバは追加しませんでした" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "サーバは見付かりませんでした: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "削除したいサーバを定義しなければなりません" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "Ed2kは個人設定に無効されています。" + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "検索中です。あと少しで結果をもう一度取ってきます!" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "リモートインタフェイスからWebSearchする意味がありません。" + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kadは個人設定に無効されています。" + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "グラフを表示するための点がありません。" + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "あなたのクライアントはこの詳細段階には設定されていません。" + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "ExternalConn:シャットダウンが要求されました" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "もうシャットダウン中です。" + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "ExternalConn:次のリンクを追加中です: '%s'。" + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "不正なリンク、またはリンクがすでにリストに入っています。" + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "ファイルは見付かりませんでした。" + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "不正なファイル名。" + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "ファイルを改名出来ません。" + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "すでにEd2kに接続しています。" + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Ed2kに接続中です…" + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "すでにKadに接続しています。" + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Kadに接続中です…" + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "全てのネットワークが無効されています。" + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Ed2kから切断しています。" + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Kadから切断しています。" + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "ExternalConn:不正なOpCodeを貰いました: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "不正なOpCode(プロトコルバージョンが違いますか?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" +"ファイル(%s)を開くことが出来ませんでした、共通ファイルのリストから外しま" +"す。" + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "不明なファイルのハッシュセットが要求されました: %s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "" +"PID `%2$d' のコマンド `%1$s' がステータスコード `%3$d' で終了しました。" + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "" +"サーバは追加しませんでした:IPまたはホスト名は指示されていませんでした。" + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "サーバは追加しませんでした:不正なサーバ・ポートが指示されました。" + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "Ed2kのステータス:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "接続" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:ポート" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Kademliaのステータス:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "走っています" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "ステータス:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "切断" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "コネクション情況:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "ファイアワォールされています" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "OK" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "ファイアワォールされた情況:" + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "仲間と接続しています" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "仲間がありません" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "平均のユーザ数:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "平均のファイル数:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "走っていません" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "アップタイム: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "転送" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "アップロード数" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "アップロードされたデータ(セッション合計): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "合計オーバヘッド(パッケト数): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "ファイル要求のオーバヘッド(パケット数): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "ソース交換のオーバヘッド(パケット数): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "サーバのオーバヘッド(パケット数): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Kadのオーバヘッド(パケット数): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "アクティブなアップロード数: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "待機中のアップロード数: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "成功したアップロードセッションの合計: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "失敗したアップロードセッションの合計: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "平均アップロード時間: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "ダウンロード数" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "ダウンロードされたデータ(セッション合計): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "見付かったソース: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "アクティブなダウンロード数(塊数): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "セッションの合計UL/DL非: %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "平均ダウンロードレート(セッション): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "平均アップロードレート(セッション): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "最大ダウンロdーレート(セッション): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "最大アップロードレート(セッション): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "再接続数: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "最初の転送から経った時間: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "この時間からサーバに接続されています: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "アクティブなコネクション数(推測): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "最大コネクション数の限定に達しました: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "平均コネクション数(推測): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "ピークコネクション数(推測): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "クライアント数" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "フィルターされた数" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "合計: %i 知られた: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "サーバ数" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "働いているサーバ数: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "失敗したサーバ数: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "合計: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "消除されたサーバ数: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "フィルターされたサーバ数: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "働いているサーバのユーザ数: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "働いているサーバのファイル数: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "ユーザ合計: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "ファイル合計: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "サーバオキュペーション: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "共通ファイル数: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "共通ファイルの合計サイズ: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "平均ファイルサイズ: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "LowID:%u(%.2f%% 合計 %.2f%% 知られている)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "SecIdentオン/オッフ:%u(%.2f%%): %u(%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "オペレーティング・システム" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "受信していません" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "カット" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "コピー" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "ペースト" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "全ての選択" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "Kadが走っていない中にはKadの検索は出来ません" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "Ed2kに接続されていない中にはEd2kの検索は出来ません" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Kadを検索する間に不明なエラーが発生しました: " + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "%s(IP:%s)からのメッセージがフィルターされました" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "%s(IP:%s)から新しいメッセージが届きました" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" +"ユーザ %s(%u)はあなたの共通ファイル・リストを要求しました→許可しました" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" +"ユーザ %s(%u)はあなたの共通ファイル・リストを要求しました→拒否しました" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" +"ユーザ %s(%u)はあなたの共通ディレクトリー・リストを要求しました→許可しまし" +"た" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" +"ユーザ %s(%u)はあなたの共通ディレクトリー・リストを要求しました→拒否しまし" +"た" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"ユーザ %s(%u)はあなたのディレクトリー %s の共通ファイル・リストを要求しまし" +"た→許可しました" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"ユーザ %s(%u)はあなたのディレクトリー %s の共通ファイル・リストを要求しまし" +"た→拒否しました" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "ユーザ %s(%u)はディレクトリー %s の共通しています" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "ユーザ %s(%u)は要求されていない共通ディレクトリーを送りました。" + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" +"ユーザ %s(%u)はディレクトリー %s の共通ファイル・リストを送りました。" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "ユーザ %s(%u)は共通ファイル・リストの送信を終了しました" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "ユーザ %s(%u)は無用の共通ファイル・リストを送りました。" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" +"ユーザ %s(%u)は共通ファイル/ディレクトリー・リストのアクセスを拒否されまし" +"た。" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "ノード数(%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "ブートストラップに不正なIP" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "ブートストラップに不正なポート" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "必要なフィールドの全てを記入してください" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "確認:本当に新しいnodes.datファイルをダウンロードしますか?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" +"そうすると、現在のノードがなくありますし、Kademliaへのコネクションも初期化さ" +"れます。" + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "進みますか?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "エラー: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "注意: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "仲間を追加する" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "正当なIPとポートを記入しなければなりません!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "情報" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "指定されたユーザハッシュは不正です!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "ソース数" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "ファイル" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "ダウンロード" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "カテゴリー" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "メイン" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "カテゴリーにダウンロードする" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "関連ファイルを検索する(ED2k、ローカル・サーバ)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "知られたファイルとしてマークをする" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "リモートamuleへ接続する" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "コネクションに失敗しました " + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "エラー" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"注意:自分がlowidでいながらソースとしてed2kリンクに追加するこたは出来ません。" + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "ユーザ: E: %s K: %s | ファイル E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "全て" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "ユーザ合計: %s | ファイル合計: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "転送された数" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "完成された数" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "スピード" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "進歩" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "ステータス" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "残る時間" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "最後に完全として見た時間" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "最後に受信された時間" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "確認:本当に選択されたファイルを消除しますか?" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "確認:本当に選択されたファイルを消除しますか?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "ユーザへメッセージを送る" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "送りたいメッセージ:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "中止(&Stop)する" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "ポーズ(&Pause)する" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "再開(&Resume)する" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "完成した物をクリアする(C&lear completed)" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "すぐにこのファイルの全てのA4AFを交換する" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "このファイルの全てのA4AFを交換する(オート)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "このファイル以外の全てのA4AFを交換する" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "拡張オプション" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "プレビュー" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "ファイルの詳細(&details)を見せる" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "全てのコメントを表示する" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "マグネットURIをクリップボードへコピーする" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "割り当てない" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "カテゴリーに割り当てる" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "ファイルを開く(&Open)" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "仲間リストから外す" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "仲間リストに追加する" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "メッセージを送る" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "このファイルへ交換する" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "キロバイト(毎秒)" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "QR: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "他のファイルを頼みました" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "ダウンロード数(%i)" + +#: src/DownloadListCtrl.cpp:2222 +#, fuzzy +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"推奨のビデオプレイヤーを個人設定で設定してください。\n" +"その間、aMuleはmplayerを使用しようとしながら、プレビュー毎にこの注意が 表示さ" +"れます" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "ファイル・プレビュー" + +#: src/DownloadListCtrl.cpp:2260 +#, fuzzy, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "エラー:外部メディア・プレイヤーは実行出来ませんでした!" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "エラー:部分ファイルを開くことは出来ませんでした!" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "エラー:部分ファイルは作成出来ませんでした!" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "metファイルのバック・アップを%sからロードしようとしています" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "エラー:part.metファイルは開くことが出来ませんでした:%s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "エラー:part.metファイルはゼロ・サイズです: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "エラー:不正なpart.metファイル・バージョン: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" +"エラー: %s(%s)は破損されて(tagcountが間違っています)、ファイルはロード出" +"来ません。" + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "ファイル情報を回復しようとしています…" + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "無名なファイルを回復中です:RecoveredFile.datとして回復しようとします" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "得られる全てのファイル情報を回復しました:使用しようとしています…" + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "残念ながら、ファイル情報を回復出来ませんでした。" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "%s(%s)を開くことは出来ませんでした" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "注意:%sは破損されている恐れがあります(%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "部分ファイル%s(%s ==> %s)の保存中にエラーが発生しました" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "'%s'の長さを読み込むことができませんでした。%sファイルを使用します。" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "どうか、'%s'はゼロ・サイズです:%sファイルを使用しています。" + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "%sのためのpart.met.seedsファイルは保存出来ませんでした" + +#: src/PartFile.cpp:1019 +#, fuzzy, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "%iソース・シーヅを部分ファイルに保存しました:%s(%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "部分ファイル%s(%s)にはシーヅ・フィアルはありません" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "部分ファイル%s(%s)のシーヅ・フィアルは空ファイルです" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "" +"部分ファイルのシーヅ・ファイルを読む時にエラーが発生しました:(%s - %s)%s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, fuzzy, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"破損されている部分(%d)を%d部分、ファイル%sに見付かりました:FileResultHash " +"|%s| FileHash |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "完成した部分(%i)を%sに見付かりました" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "%sの再ハッシュを終了しました" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "%sを完成しながら予期外のエラーが発生しました:ファイルをポーズしました" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "ダウンロードが終了しました:%s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "ファイルを消除します:%s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" +"注意:ダウンロードした部分はハッシュ出来ません:'%s'のためのハッシュ・セット" +"が未完成です" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"エラー:ダウンロードした部分はハッシュ出来ません:ハッシュ・セットは未完成で" +"す(%s)。こういうことはありえません。" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "注意:ディスク・スペースは足りません!ファイルをポーズします:%s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "ダウンロードした部分%i(ファイル:%s)は損被されています" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "" +"ICH:損被された部分%i(%sのため)を回復しました→:%s バイトを保存しました" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "不十分なディスク・スペース" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "中止されています" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "注意:known.metを開くことは出来ません。" + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "注意:Knownfileリストは損被されて、不正なヘッダーが含まれています。" + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "known.metファイル%sを読む時にIOエラーが発生しました" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "known.metファイル%sを保存する時にIOエラーが発生しました" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "%i知られた共通ファイルを見付かりました" + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "%i知られた共通ファイルを見付かり、%iは知られていません" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "エラー:%sを共通しようとしました" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "ファイル・コメント" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "レーティング" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "コメント" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "コメントありません" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%sコメントあります" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"全てのリストされ、ぼかされたされたサーバに接続のに失敗しました。ぼかすこと無" +"にもう一度パスをします。" + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "全てのリストされたサーバに接続のに失敗しました。もう一度パスをします。" + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "ED2Kネットワークは個人設定に無効されて、接続はしません。" + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "サーバ・リストに接続出来るために正当なサーバは見付かりません" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "%s(%s:%i)に接続しています" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr " %s にコネクションを確立しました" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"接続中に致命的なエラーが発生しました。インターネット・コネクションがダウンの" +"恐れがあります。" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "%s(%s:%i)のコネクションを失いました" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s(%s:%i)は死んでいるそうです。" + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s(%s:%i)は一杯だそうです。" + +#: src/ServerConnect.cpp:391 +#, fuzzy, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "サーバへの自動的な接続で、後%d秒で再試しします" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "接続を失いました" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "%s(%s:%i)の接続に失敗しました。" + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "エラー:timeoutcheckの時ソケットは不正でした" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "%s(%s:%i)の接続の試しがタイム・アウトました。" + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" +"エラー:バックアップ・ファイルはロード出来ませんでした。http://forum.amule." +"orgで.part.metにつぃて検索することで解決方法を見付けてください。" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "部分ファイルは見付かりませんでした" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "%u部分ファイルが見付かりました" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "%sをダウンロード中です" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "あなたはすでにファイル'%s'をダウンロードしようとしています" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "あなたはすでにファイル'%s'を持っています" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "あなたはすでにファイル%sをダウンロードしようとしています" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "マグネット・リンクをED2Kに変更出来ません:%s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "リンクの不明なプロトコル:%s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "不正なED2Kリンク!エラー:%s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "を実行してから終了する。" + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "不正なIPフォーマット。xx.xxx.xxx.xxx:xxxxを使用ください\n" + +#: src/TextClient.cpp:305 +#, fuzzy +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "このコマンドには引数が要ります。有効な引数:'all'、または数字。\n" + +#: src/TextClient.cpp:343 +#, fuzzy +msgid "Processing by hash: " +msgstr "ファイル %u: %s 番を処理中です" + +#: src/TextClient.cpp:358 +#, fuzzy +msgid "Processing by filename: " +msgstr "ファイル %u: %s 番を処理中です" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "このコマンドには引数が要ります。有効な引数:ファイル・ハッシュ。\n" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "正当な数字ではありません\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "正当なハッシュではありません(長さは丁度32半角文字あるべきです)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "オペレーションは成功に終了しました。" + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "リクエストは次のエラーで失敗しました:%s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "クライアントのIPフィルターリングは%sです。\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "オッフ" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "オン" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "サーバのIPフィルターリングは%sです。\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "現在のIPフィルター段階は%dです。\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "バン幅制限:アップ:毎秒%uキロバイト、ダウン:毎秒%uキロバイト。\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "%s %s %sに接続されています" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "LowIDを持っています" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "HighIDを持っています" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "只今接続中です" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "切断しています" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"ダウンロード数:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"アップロード数:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"列に入っているクライアント数:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"合計ソース数:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "検索結果数:%i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "まだ実現されていない:検索結果の進歩を表示する" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "サーバから不明な返事が届きまして、OpCodeは%#xです。" + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "短縮に状態情報を表示する" + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "" +"コネクション状態、現在のアップロード/ダウンロードスピード等を表示する。\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "詳細な統計木を表示する。" + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"オプションとして、, 数0〜255を引数としてこのコマンドに渡すことが出来ます。\n" +"こういう風に、クライアント・バージョン・サッブツリーの表示したいエントリー数" +"を指示出来ます。\n" +"ゼロ、または空欄の引数は'無制限'の意味を示します。\n" +"\n" +"例: 'statistics 5'は各クライアントの一番上の5つのバージョンしか表示しませ" +"ん。\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "aMuleを終了します。" + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"走っているリモート・コア(amule/amuled)を終了します\n" +"すると、同時にテキスト・クライアントも一緒に終了します:走っているコアがなけ" +"れば\n" +"使えないからです。\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "指示されたオブジェクトを再ロードします。" + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "指示された共通ファイル・リストを再ロードします。" + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "指示されたIPフィルター・テーブルをファイルから再ロードします。" + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "ネットワークへ接続します。" + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"これで個人設定に有効になっている全てのネットワークへ接続します。\n" +"オプションとして、一つのサーバのみに接続したいなら、そのサーバのアドレスを" +"「IP:ポート」\n" +"形で指示出来ます。IPアドレスはIPv4形のドット10進数字、或いは解決出来る\n" +"DNS名として指示しなければなりません。" + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "ED2Kのみに接続します。" + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Kadのみに接続します。" + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "ネットワークから切断します。" + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "これで現在に接続している全てのネットワークから切断します。\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "ED2Kのみから切断します。" + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Kadのみから切断します。" + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "コアにED2K、またはマグネット・リンクを追加します。" + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"追加可能なED2Kリンクの種類は次の通りです:\n" +"*) ファイル・リンク(ed2k://|file|...)ならば、ダウンロード列に追加されま" +"す;\n" +"*) サーバ・リンク(ed2k://|server|...)ならば、サーバ・リスト追加されます;\n" +"*) サーバリスト・リンクならば、 そのリストに存在する全てのサーバはサーバ・リ" +"ストに\n" +"追加されます。\n" +"\n" +"マグネット・リンクはED2kハッシュとファイル長さを含めなければなりません。\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "個人設定の値を設定してください。" + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "IPFilterの個人設定を設定してください。" + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "クライアントとサーバの両方のIPフィルターリングをオンします。" + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "クライアントとサーバの両方のIPフィルターリングをオッフします。" + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "クライアントのフィルターリングを有効/無効します。" + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "クライアントのフィルターリングをオンします。" + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "クライアントのフィルターリングをオッフします。" + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "サーバのフィルターリングを有効/無効します。" + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "サーバのフィルターリングをオンします。" + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "サーバのフィルターリングをオッフします。" + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "IPフィルターリング段階を選択してください。" + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"有効なフィルターリング段階は0〜255の間で、\n" +"デフォルト値は127です。\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "バンド幅の制限を設定します。" + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "このコマンドの引数の値は毎秒のキロバイトです。\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "アップロード・バンド幅の制限を設定します。" + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "ダウンロード・バンド幅の制限を設定します。" + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "個人設定の値を取ってきて、表示します。" + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "IPFilterの個人設定の値を取ってきます。" + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "クライアントとサーバの両方のIPFilter状況を取ってきます。" + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "クライアントのみのIPFilter状況を取ってきます。" + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "サーバのみのIPFilter状況を取ってきます。" + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "IPFilter段階を取ってきます。" + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "バンド幅の制限の値を取ってきます。" + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "検索を実行します。" + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"検索(search)の種類を下記から選択してください:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"例:'search kad file'はkadで\"file\"を検索します。\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "グローバル検索(GLOBAL)を実行します。" + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "ローカル検索(LOCAL)を実行します" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Kadを検索します" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "最後の検索の結果を表示します。" + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "以前の検索の結果を回答します。\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "検索の進歩を表示します。" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "検索の進歩を表示します。\n" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "ファイルのダウンロードを開始します" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"以前の検索からファイル番号を選んで指定しなければなりません。\n" +"例: 'download 12'は以前の検索結果で12として指定されたファイルのダウンロード" +"を開始します。\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "ダウンロードをポーズします。" + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "ダウンロードを再開します。" + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "ダウンロードをキャンセルします。" + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "ダウンロードのプライオリティーを設定します。" + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "" +"ダウンロードのプライオリティーを低い(Low)、普通(Normal)、高い(High)、ま" +"たはオート(Auto)に設定します。\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "プライオリティーを低いに設定します。" + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "プライオリティーを普通に設定します。" + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "プライオリティーを高いに設定します。" + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "プライオリティーをオートに設定します。" + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "列/リストを表示します。" + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"アップロード/ダウンロード列、サーバ・リスト、または共通リストを表示しま" +"す。\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "アップロード列を表示します。" + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "ダウンロード列を表示します。" + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "ログを表示します。" + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "サーバ・リストを表示します。" + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "ログを再初期化します。" + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "廃止予定のコマンドで、現在は'%s'です。" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" +"これは廃止予定のコマンドで、将来に存在がなくなる可能性が高いです。\n" +"代わりに'%s'を使用してください。\n" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress()はNULLを回答しました" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "エラー:%s(%s)- %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "注意:%s(%s)- %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "新しいclientidは%uです" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "注意:あなたはLow-IDを得られました!" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "\t恐らくパソコンがファイラウォールやルータの裏にあるのが原因です。" + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\t詳しい情報にはhttp://wiki.amule.orgを参考してください" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "不明なサーバ情報を受信しました!理由:短しぎます" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "%d新しいサーバを受信しました" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "サーバ・リストの保存を終了しました。" + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "サーバは最後のコマンドを断りました" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "サーバ%sから偽造のパケットが届きました" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "サーバ%sのパケットを処理する時に未処理例外エラーが発生しました" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "%sに接続するためのDNS解決スレッドを作成せきません。" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "IPアドレス%sのサーバ%sはフィルターリングされています。接続はしません。" + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "ぼかしているプロトコルを使用しています。" + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "%s(%s - %s:%i)%sへ接続中です。" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "%sに接続するためのDNSは解決出来ませんでした:接続は出来ません!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "CIP2Country::CIP2Country():次から国データはロード出来ませんでした:" + +#: src/IP2Country.cpp:73 +#, fuzzy, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "%dの旗ビットマップをロードしました。" + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"確認:本当にこのカテゴリーの全てのファイルをキャンセルして消除しますか?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "確認が必要です" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "他の全て" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "未完成" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "アクティブ" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "ビデオ" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "オーディオ" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "アーカイブ" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "CDイメージ" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "画像" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "テキスト" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "ビュー・フィルターを選択してください" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "カテゴリーを追加します" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "カテゴリーを編集します" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "カテゴリーを消除します" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "%s:%sをインポートします" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "臨時フォルダーを読み中です" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "基本情報をダウンロード情報ファイルから取ってきます" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "当てファイルを作成中です" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "古いダウンロード・ファイル(%uから%u)からデータをロード中です" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "" +"データ・ブロックを一つの新しいダウンロード・ファイル(%uから%u)に纏め中です" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "ソース・ダウンロードファイル情報を取ってきます" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "ダウンロードを追加して、新しい部分ファイルを保存中です" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "状態を取ってきています…" + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "途中です" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "エラー:ディスク・スペースが無くなりました" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "エラー:Partmetは見つかりませんでした" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "エラー:I/Oエラー!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "エラー:失敗しました!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "列に追加しました" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "すでにダウンロード中です" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "不明な、または不利なtempfileフォーマット。" + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "ファイル名" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "状況" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "ファイル・ハッシュ" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "部分ファイルをインポートをします" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"臨時ダウンロード目標のフォルダーを選択してください(サッブ・フォルダーは含ま" +"れます)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "成功にインポートしたダウンロードのソース・ファイルを消除しますか?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "ソースを消除しますか?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "待期中…" + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s(ディスク:%s)" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "バイト" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "キロバイト" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "メガバイト" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "ギガバイト" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "テラバイト" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "キロ" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "メガ" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "ギガ" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "テラ" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "(毎秒)バイト" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "(毎秒)バイト" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "秒" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "分" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "時" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "日" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "ビデオ" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "アーカイブ" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "テキスト" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "プログラム" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "どれも" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "レーティングされていません" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "不正/損被/偽造" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "悪い" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "順調" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "良い" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "優秀" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "全て" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "他に全て" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "IPフィルター'ipfilter.dat'と'ipfilterstatic.dat'をロード中です。" + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" +"'ipfilter.dat'ファイル'%s'のロードに失敗しました:不明なファイル・フォーマッ" +"トに出会いました。" + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" +"'ipfilter.dat'ファイル'%s'のロードに失敗しました:不明なファイルを開くことは" +"出来ませんでした。" + +#: src/IPFilter.cpp:330 +#, fuzzy, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "%uのIPレンジを'%s'からロードしました。%uの奇形な行を捨てましたた。" + +#: src/IPFilter.cpp:332 +#, fuzzy, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "%uのIPレンジを'%s'からロードしました。%uの奇形な行を捨てましたた。" + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "アクティブなコネクション(1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "ファイルの詳細" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%%終わりました" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "ED2Kリンク:" + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "コミット" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" +"ここで、テキスト・コントロールにあるED2kリンクをダウンロード列に追加するのに" +"クリックをしてください。" + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "ポップ・アップ状態テキスト" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "ロード中…" + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"イベントはここで表示されます。イベントの全てのリストにはサーバ・タブに存在す" +"るログを参考してください。" + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "接続中のサーバのユーザ数…" + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "ユーザ:0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "現在接続中のサーバのユーザ数と合計ユーザ数の推測。" + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"現在のひえ金アップロードダウンロード・レート。有効であれば、ブレースに囲まれ" +"ている数字はクライアント・コミュニケーションのオーバヘッドを意味します。" + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"接続状態とアクティブ転送数を表示します。赤い矢印は現在接続しちないことを意味" +"します。黄色の矢印はlow ID(ファイアウォールされている)を意味します。緑色の" +"矢印はhigh ID(最善のコネクションの種類)を意味します。" + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "切断しています…" + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "現在接続しているサーバ。" + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "検索" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "名前:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "ローカル" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "グローバル" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "ファイル・ハッシュ" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "拡張パラメタ" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "フィルターリング" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "フィルターの種類" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "拡張子" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "最小サイズ" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "バイト" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "キロバイト" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "最大サイズ" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "可用性" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "フィルター:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "フィルターの結果" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "結果を反転する" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "知られているファイルを隠す" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "もっと" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "もっと結果をED2kで検索する。Kadのサポートはまだありません。" + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "中止する" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "フィールドをリセットする" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "結果" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "完成したダウンロードをクリアします" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "アップロード/アップ列を表示します" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "列に入っているクライアント:" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "送信する" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "指示するメッセージを送信します。" + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "閉じる" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "チャット・セションを閉じます。" + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "フル・ネイム:" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "非適用" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "metファイル:" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "ハッシュ:" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "ファイル・サイズ:" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "部分ファイルの状態:" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "最後に完全として見た時間:" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "ソースを見つかりました:" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "ソースを転送中です:" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "ファイル部分の数:" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "入手できます:" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "データ・レート:" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "ダウンロードのアクティブ時間:" + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "転送しました:" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "完全サイズ:" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "知的損被処理" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "損被に失われました:" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "圧縮で得られる:" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "I.C.H.に助かったパケット:" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "ファイル名" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "テークオーバーする" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "掃除する" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "応用する" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Ok" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "コメントレート・ファイル(テキストは全ユーザは見ることが出来ます)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"映画なら、長さ、課題、言語等を説明出来ます…\n" +"万が一偽造なら、それもaMuleの他のユーザに伝えることが出来ます。" + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "ファイルの質" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" +"ファイル・レーティングを選択して、またはユーザに偽造の注意を伝えてください…" + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "コメント無" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "リフレッシュする" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "ダウンロード中で、しばらくお待ちください…" + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "サイズが不明です" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "不可欠な情報" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "IPアドレス:" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "ポート:" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "追加情報" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "ユーザ名:" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "ユーザ・ハッシュ:" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "共通ファイルを再ロードする" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "現在のセッション" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "合計" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "要求数:" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "アクティブなアップロード数:" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "ダウンロード速度:" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "現在" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "移動平均" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "セッション平均" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "アップロード速度" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "コネクション数" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "アクティブなダウンロード数" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "アクティブなコネクション(1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "アクティブなアップロード数" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "統計木" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "ユーザ名:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "ユーザ・ハッシュ:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "クライアント・ソフトウェア:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "クライアント・バージョン:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "IPアドレス:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "ユーザID:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "サーバIP:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "サーバ名:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "クライアントへの転送数" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "現在の要求:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "平均アップロード・レート:" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "平均ダウンロード・レート:" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "アップロードされた(セッション):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "ダウンロードされた(セッション):" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "アップロードされた(合計):" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "ダウンロードされた(合計):" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "スコア" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "DL/UP変更:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "確実認識:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "レーティング(合計):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "列スコア:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "一般設定:" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "ニック" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - Linux Mule" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "あなたに接続してくる方はこの名前を見ることとになっています。" + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "言語" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "コントロールに使う言語はここで設定します。" + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "雑なオプション" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "スタート・アップに新バージョンをチェックする" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" +"これを有効にするとaMuleはスタート・アップの時に新バージョンのチェックするを行" +"う" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "スタートを最小化にした" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "これを有効にするとaMuleはスタートの時に最小化する。" + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "終了の時に確認する" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "これでaMuleが終了するの時に確認します。" + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "トレイ・アイコンを有効にする" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "" +"これでシステム・トレイ、またはタスク・バーのアイコンを有効/無効にします。" + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "トレイ・アイコンを最小化する" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" +"これを有効にするとaMuleはタスク・バーの代わりにシステム・トレイに最小化しま" +"す。" + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "ツール・チップ延期時間(秒単位)" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "ツール・チップを表示するまでの延期時間。" + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "ブラウザー選択" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "こちらで自分のブラウザーを選択してください" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "個人選択のブラウザー:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"こちらで選択したいブラウザーの名前を記入してください。個人選択のブラウザーを" +"利用するには、個人設定のメニュー・アイテムをドロップ・ダウン・メニューから選" +"択してください。" + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "出きれば新しいタッブで開く" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" +"ウエッブ・ページを出きれば新しいウインドーではなくて新しいタッブで開きます" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "バンド幅の制限" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "アップロード" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "スロット割り当て" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "ライン収容" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" +"類意:この値は\n" +"統計のみに使用されます。" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "標準クライアントTCPポート:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "これは標準のED2Kポートなんで、無効にすることは出来ません。" + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "延長クライアントUDPポート:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "このUDPポートは延長ED2KリクエストとKadネットワークに使用されます" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "無効にする" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "アドレスをバインドする" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "延長サーバ・リクエストのUDPポート(TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "一つのファイルに当たる最大のソース数" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "ハード制限" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "コネクション数の制限" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "最大のコネクション数" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "ユニバーサル・プラグ・アンド・プレイ" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "UPnPを有効にする" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "UPnPのTCPポート:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "スタート・アップに自動接続する" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "接続を失う時に再接続する" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "オーバヘッドのバンド幅を表示する" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "サーバのオプション" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "何回か失敗してから死んでいるサーバを放棄する:" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "回の再接続の試み" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "スタート・アップの時にサーバ・リストを自動アップデートする" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "リスト" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "あるサーバに接続する時にサーバ・リストを自動アップデートする" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "クライアントが接続するの時にサーバ・リストを自動アップデートする" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "優先システムを使用する" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "接続の時にLowIDチェックを使用する" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "安全接続" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "スタティック・リストに含まれているサーバのみに自動接続する" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "手で追加したサーバを高い優先度に設定する" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "I.C.H.が有効です" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICHはすべてのハッシュを信頼します(推奨ではありません)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "ダウンロードしたいファイルをポーズ・モードとして追加する" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "ダウンロードしたいファイルを自動優先度として追加する" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "最初と最後のチャンクを先にダウンロードしようとする" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "新しい共通ファイルを自動優先度として追加する" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "すべてにアップロードにフル・チャンクを転送しようとする" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "ファイルが完了されたら直ぐに次のポーズされたファイルを始める" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "同じカテゴリーから" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "珍しいファイルには10ソースを保存する(<20ソース)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "ディスク領域" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "ディスク領域を確かめる" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "aMuleがディスク領域を確かめるにはこれを選択してください" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "最小のディスク領域:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "ここで欲しい最小のディスク領域を記入してください。" + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "メガ・ビット" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "インカミング・ディレクトリー:" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "臨時ディレクトリー:" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "共通ディレクトリー" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "(リカーシブ共通するにはフォルダー・アイコンを右クリックしてください)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "隠れたファイルを共通にする" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "ビデオ・プレイヤー" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "プレビューのバックアップを生成する" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "グラフ" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "アップデート延期:5秒" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "平均グラフの時間:100分" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "コネクション数のグラフ規模:100" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "統計の色を選択する" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "背景" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "グリッド" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "現在をダウンロードする" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "移動平均をダウンロードする" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "セション平均をダウンロードする" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "現在をアップロードする" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "移動平均をアップロードする" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "セション平均をアップロードする" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "アクチブ・コネクション数" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "システム・トレイ・アイコン・スピードバー" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "現在のKadノード数" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "走っているKadノード数" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "セションのKadノード数" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "選択" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "表示されているクライアントのバージョン数(0=無制限)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "知らせ" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "メッセージのポップ・アップ" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "サウンドを使用する" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "次の条件に従ってポップ・アウトする:" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "ログに新しいエントリーがある" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "新しいチャット・セションを始める" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "新しいチャット・メッセージが受信された" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "一つのダウンロードが追加、または完了された" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "新しいaMuleのバージョンが検知された" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "急なOOD、サーバ・コネクションを失った" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "メールで知らせる" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "転送が終わったらメールを送る" + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "SMTPサーバ:" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "メール・アドレス:" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!!注意!!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"この設定は、詳しい知識を持っていなければ変更しない\n" +"方が良いです。変更すれば状況が悪くなる恐れが\n" +"高いです。\n" +"\n" +"この設定を変更しなくてもaMuleはうまく動いて\n" +"います。" + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "詳細な設定" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "最大の新しいコネクション数(毎5秒)" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "ファイル・バファー・サイズ:240000バイト" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "アップロード列サイズ:5000クライアント" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "サーバ接続のリフレッシュ空間:無効にする" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "GUIの調整" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "ダウンロード列にあるファイルの進歩" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "パーセンテージを表示する" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "進歩バーを表示する" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "進歩バーのスタイル" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "フラット" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "ラウンド" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "スキンのサポート" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "スキンのサポートを有効にする" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "スキン:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- スキンがありません -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "コラムのソーティング" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "" +"ダウンロード列にあるファイルを自動ソーティングする(CPUを強く使用する)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "aMuleはダウンロード・リストのコラムを自動的にソーティングする" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "雑なGUIの調整" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "速いED2Kリンク・ダンドラーを表示する" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "延長情報をカテゴリー・タッブで表示する" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "タイトルに転送レートを表示する" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "鉛直ツール・バーの方向" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "ファイル名の前に部分ファイル名を表示する" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "リモート制御" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "ウエッブ・サーバのパラメタ" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "スタート・アップの時にamulewebを起動する" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "ウエッブ・サーバのポート" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "ウエッブ・サーバでUPnPポート転送を有効にする" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "ウエッブ・サーバUPnP用のTCPポート" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "ページのリフレッシュ間隔(秒単位)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "gzip圧縮を有効にする" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "低権利ユーザを有効にする" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "全権利パスワード" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "底権利パスワード" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "ウエッブ・テンプレート" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "外コネクションのパラメタ" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "外コネクションを許可にする" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"聞いているインターフェイスのIPアドレス\n" +"(どちらでもには空欄)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"ここでは聞いているECインターフェイス用の正当なIPアドレスをa.b.c.dのフォーマッ" +"トで記入してください。空欄なフィールド、または0.0.0.0はどちらでものインター" +"フェイスを意味します。" + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "TCPポート" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "ECポートでUPnPポート転送を有効にする" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "先に記入した設定の変更を全て適用するにはここでクリックしてください。" + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "先に記入した設定に変更を全てリセットする" + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "タイトル:" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "コメント:" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "インカミング・えぃレクトリー:" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "新しく割り当てられたファイルの優先度を変更する:" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "変更しない" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "このカテゴリーの色を選択する(現在選択中):" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "接続の時にサーバのmotd(今日のメッセージ)を表示する..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "サーバ情報" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "このボタンをクリックするとログのリセットが行います。" + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "aMuleのログ" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "このボタンをクリックするとサーバ・リストはURLから最新化する..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "サーバ・リスト" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"server.metファイルへのURLをここで記入してから左側のボタンをクリックすると知ら" +"れたサーバのリストがアップデートされます。" + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "手でサーバを追加する:名前" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "新しいサーバの名前をここで記入してください" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "x.x.x.xフォーマットでサーバのIPアドレスを記入してください。" + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "サーバのポートをここで記入してください。" + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "手でサーバを追加する(先に左側のフィールドを記入してください)..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "ED2K情報" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Kad情報" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"選択したロカールがミシンに存在しないようです\n" +"この言語を使用するには先にロカールを生成しなければなりません。\n" +"linuxシステムではファイル/etc/locale.genとパケージ'locales'をご参考ください\n" +"頑張ってください!\n" +"(追伸:それでも、設定を試してみます)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "これを二度と表示しない" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "このボタンをクリックするとノード・リストをURLからアップデートします..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "ノード数(0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"ここであうろnodes.datファイルへのURLを記入してから左側のボタンをクリックする" +"と知られたノード・リストをアップデートします。" + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "ノードの統計" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "ブートストラップ" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "新しいノード" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "ポート:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"知られたクライアントから\n" +"ブートストラップする" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Kadを切断する" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "プロトコルをぼかす" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "プロトコルのぼかしを有効にする" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"このオプションによってプロトコルのぼかしを有効に出来ます。そうすると、aMuleは" +"他のクライアントからのぼかされているコネクションを許可にします。" + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "外へのコネクションにぼかしを使用する" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"このオプションによってaMuleは他のサーバまたはクライアントに接続する時にプロト" +"コルぼかしを使用しています。" + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "ぼかされているコネクションのみを受信にする" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"このオプションによってaMuleはぼかされているコネクションのみを受信します。ソー" +"ス数が減りますが、トラフィックが全てぼかされます" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "ファイル・オプション" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "全員" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "誰も許可しない" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "次の方が共通ファイルを見ることが出来ます:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "" +"あなたの共通ファイル・リストを見ることをリクエスト出来る方を選択してくださ" +"い。" + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "IPフィルターリング" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "フィルター・クライアント" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"~/.aMule/ipfilter.datに登録されちるクライアントIPにフィルタリングをかけること" +"を有効にします。" + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "フィルターされたサーバ" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"~/.aMule/ipfilter.datに登録されちるサーバIPにフィルタリングをかけることを有効" +"にします。" + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "リストを再ロードする" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "" +"フィルターリングをかける目標のIPリストを~/.aMule/ipfilter.datから再ロードをし" +"ます。" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "只今アップデートする" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "スタートアップの時にipfilterを自動アップデートする" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "フィルターリング段階:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "いつもLANのIPにフィルターリングをかける" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "適合しないIPを被害妄想的に扱う" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"クライアントIPがパケットがもともと受信されたIPと違いますとパケットを拒否しま" +"す。使用するに気をつけてください。" + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "提供されていれば、全システム応用のipfilter.datファイルを使用する" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" +"ローカルなipfilter.datファイルが見つからなければ、全システム応用のipfilter." +"datファイルを使用可能します。" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "セキュア・ユーザ保証(SUI)を使用する" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" +"このオプションを有効にするのは推奨されます。SUIが有効でないとあなたはクレジッ" +"トを得られません。" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "有効/無効にする" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "オンライン証明を有効にする" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"OSファイルの書き込みを有効にします。このファイルは外のアプリケーションに証明" +"等を作成するためにを使用されます。" + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "アップデート頻度(秒単位)" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "オンライン証明アップデート頻度(秒単位)を変化します。" + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "オンライン証明でぃレクトリー:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" +"ここでクリックするとオンライン証明ファイルが入っているディレクトリーを選択出" +"来ます。" + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "無効/有効" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "インカミング・メッセージをフィルターする(現在のチャット意外):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "フィルター・オプション:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "全てのメッセージをフィルターする" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "友達リストの入っていない方々からのメッセージをフィルターする" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "知らないクライアントからのメッセージをフィルターする" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "" +"次のストリングが入っているメッセージをフィルターする(','で区分する):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"ここでamuleがメッセージ・フィルター/ブロックの目標にする言葉を追加してくださ" +"い" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "コメント" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "次のストリングが入っていコメントをフィルターする(','で区分する):" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "プロクシーを有効にする" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "プロクシー・サポートを有効/無効にする" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "プロクシーの種類:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "接続するプロクシーの種類" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "プロクシー・ホスト:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "プロクシー・ホスト名:" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "プロクシー・ポート:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "プロクシーのポート" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "認証" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "認証を有効にする" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "ユーザ名/パスワード認証を有効/無効にする" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "プロクシーに接続に使うユーザ名" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "パスワード:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "プロクシーに接続に使うパスワード" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "プロクシー無しの自動的なサーバ接続" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "次に接続する:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "リモートamuleにログインする" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "ユーザ名" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "設定を記憶する" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "冗長なデバッグ・ロギングを有効にする" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "メッセージのカテゴリ:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "インポートを追加する" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "選択したものを再試す" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "選択したものを廃棄する" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "イベントの種類" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "どのサーバにも、もしくはKadに接続する" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "新しいカテゴリ" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "インカミング・ファイルのフォルダーを選択する" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "カテゴリに名前を与えなければなりません!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "カテゴリにパスを与えなければなりません!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"カテゴリにインカミング・ディレクトリーを生成するのに失敗しました。正当なパス" +"を指示してください!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "'%s'コマンドに不明な拡張子'%s'。\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "不明なコマンド'%s'。\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"このコマンドには引数は認められていません。\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"このコマンドには引数が不可欠です。\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"このコマンドは不完全で、下記から一つの拡張子を選択してください。\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"利用可能な拡張子:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "利用可能なコマンド:\n" + +#: src/ExternalConnector.cpp:188 +#, fuzzy, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"コマンドの全ては大文字と小文字を区別します。\n" +"'help <コマンド>'を入力することで<コマンド>の詳細の情報が表示されます。\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "アプリケーションが終了します。" + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "ヘルプを表示します。" + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"コマンドに対してヘルプを得るためには'help <コマンド>'を入力してください。\n" +"全てのコマンドのリストを得るためには'help'を入力してください。\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"コマンド・リストには'%s'を使用してください\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "シンタックス・エラー!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"コマンドを処理する時にエラーが発生しました。これはありえない!バッグをリポー" +"トしてください\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "このコマンドには引数が認められていません。" + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "このコマンドには引数が不可欠です。" + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "引数が不正です。" + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "このコマンドは不完全です。" + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "'%s'を入力して、ヘルプを得てください。\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "これは %s %s %s です\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "これは %s %s です\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"クライアントを生成中です…\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "接続に失敗しました。指示されたホストには接続は出来ませんでし。\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"OK、%s を終了中です…\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"空欄なパスワードでは接続出来ません。\n" +"パスワードは設定ファイル、またはコマンド・ラインで指示し、\n" +"それとも聞かれた時に記入しなければなりません。\n" +"\n" +"終了中です…\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "このヘルプ・テキストを表示する。" + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "aMuleが起動しているホストです。(デフォルト:localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "aMuleの外接続用のポート。(デフォルト:4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "外接続用のパスワード。" + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "設定をファイルから読み込む。" + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "アウトプットをstdoutにプリンとしないように。" + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "冗長にして:デバッグ・メッセージも表示する。" + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "プログラム・ロカールを設定する(言語)。" + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "コマンド・ライン・オプションを設定ファイルに書き込む。" + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "aMuleの設定ファイルを元に設定ファイルを生成する。" + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "プログラム・バージョンをプリンとする。" + +#: src/ClientCreditsList.cpp:168 +#, fuzzy, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "クレジット・ファイルをロードし、%uのクライアントが知られています" + +#: src/ClientCreditsList.cpp:171 +#, fuzzy, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] "〜%uのクライアントのクレジットが期限になりました!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "'cryptkey.dat'が見つからなくて、只今生成中です。" + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"エラー:外接続が無効にされている時にはaMuleのデーモンが使用不可能です。外接続" +"を有効にするには、普通のaMuleを使用して、またはamuledをオプション--ec-config" +"で起動させて、あるいはファイル~/.aMule/amule.confの中でキー" +"\"AcceptExternalConnections\"を1に設定してください。" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "エラ: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "接続禁止を解除する" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "アップロードを表示する" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "列を表示する" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "クライアントを表示する" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "表示モードを選択する" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "クライアント・ソフトウエア" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "待っていた時間" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "アップロードの時間" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "アップロード/ダウンロード" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "リモートの状態" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "QR:%u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "ファイルの優先度" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "スコア" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "聞かれた" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "最後の見ていた時間" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "列に入った" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "アップロードの状態" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "アップに転送された" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "ダウンロードの状態" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "ダウンに転送された" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "ユーザ・ハッシュ" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "暗号化された" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "共通ファイルを隠す" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "クライアントの詳細" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "毎秒%.1fキロ・バイト" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "サポートされていません" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "不完全です" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "悪意の相手" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "検証された:OKです" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "利用不可能です" + +#: src/ClientDetailDialog.cpp:190 +#, fuzzy, c-format +msgid "%u (QR: %u)" +msgstr "QR:%u" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" +"最小サイズは最大サイズより小さくなければなりません。最大サイズを無視します。" + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "検索の注意" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "無制限" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "aMuleのトレイ・メニュー" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "速度制限:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "UL:無制限" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "UL:%u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "DL:無制限" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "DL:%u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "ダウンロード速度:%.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "アップロード速度:%.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "クライアント情報" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "あだ名:%s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "あだ名が選択されていません!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "クライアントID:" + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "サーバ名:" + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "サーバIP:" + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP:%s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "TCPポート:%d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "TCPポート:用意出来ていません" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "UDPポート:%d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "UDPポート:用意出来ていません" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "オンライン証明:有効です" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "オンライン証明:無効です" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "共通ファイル:%d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "並べているクライアント:%d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "DLの合計:%s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "ULの合計:%s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "アップロードの制限" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "ダウンロードの制限" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "aMuleを隠す" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "aMuleを表示する" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "チャット・セションを開始しました:%s(%s:%u)-%s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** クライアントに接続しています ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** クライアントに接続中です ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** クライアントに接続に失敗しました/コネクションを失いました ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "タッブを閉める" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "全てのタッブを閉める" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "他のタッブを閉める" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "server.metファイルをロード中です:%s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "Server.metファイルは見つかりませんでした!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" +"server.metファイル'%s'をロードに失敗しました。不明なフォーマットが原因です。" + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "server.metを開くのに失敗しました!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"server.metファイルは損被で、不正なバージョン・タッグを見つかりました:0x%x、" +"サイズ %i" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "server.metに%iのサーバが見つかりました" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%dのサーバが追加されました" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "サーバは追加されていません:[%s:%d]は正当なポートを指示していません。" + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "サーバは追加されていません:[%s:%d]はフィルターされ、または不正です。" + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" +"サーバは追加されていません:同じ[%s:%d]のIP:ポートはリストに見つかりました。" + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "サーバは追加されました:[%s:%d]は'%s'という名前を使用しています。" + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"削除しようとするサーバには只今接続しています。先に切断を行ってください。" + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "server.metを保存するのに失敗しました!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "不正なURL" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "サーバ・リストを%sからダウンロードするのを完了しました" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "サーバ・リストを%sからダウンロードするのに失敗しました" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"'addresses.dat'にサーバ・リストのアドレス・エントリーが見つかりませんでした。" +"あなたのサーバ・リストを自動更新が出来るように正当なサーバ・リストのアドレス" +"をそのファイルにペーストをしてください。" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "サーバ・リストを%sからダウンロードするのを開始する" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "注意:サーバ・リストの自動更新に指示されたURLは不正です:%s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" +"server.metを自動ダウンロードするためにaddresses.datに正当なURLがありません。" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"ローカル・サーバはIPFiltersにフィルターさてているため、違うサーバに接続しま" +"す!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "イベント'%2$s'にコマンド'%1$s'を起動出来ませんでした。" + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"申し訳ありませんが、設定変更の行ったためあなたのロカールはシステム・デフォル" +"トに変更されました。" + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"サーバ・リストにはサーバが一つも入っていません。n今aMuleに新しいサーバ・リス" +"トをダウンロードしてほしいですか?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "サーバ・リスト・ダウンロード" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "ウェッブ・サーバはpid %dで起動しています" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"あなたはウェッブ・サーバをスタート・アップから起動のを頼みましたが、amuleweb" +"のバイナリーは起動出来ません。aMuleのウェッブ・サーバが含まれているパケージを" +"インストールをして、またはaMuleをオプション--enable-webserverを使用しながらコ" +"ンピ在るをしてから、make installを起動してください" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "ポート%uは利用不可能で、あなたはLOWIDを得られます\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"ポート%uは利用不可能です\n" +"\n" +"あなたにはLOWIDが与えられると結果になります\n" +"\n" +"あなたのネットワークを調べ、ポートがアウトプットとインプットに開いているか確" +"認してください。" + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "オンライン証明ファイルを生成に失敗しました" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "aMuleのオンライン証明ファイルを生成に失敗しました" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"選択したロカールはあなたのシステムにインストールされていないようです。(類" +"意:それでも)設定してみます)" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "初めてaMule %sを始動する時です" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "このバージョンはテスト・バージョンで、毎日更新があって、\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "あなたに損を与えるかどうかについては何も証明しません。。。。\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "だけど、安全に使用出来るはずですよ。\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "このリリースに次のオプションはセキュリティーのために変更されました:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* プロトコルのぼかしをインカミングとアウトゴイング・コネクションのために有効" +"にしました。\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* サーバ・リストを他のサーバやクライアントから更新するのを無効にしました。\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"このん変更につういての詳しい情報にはaMuleのwiki、すなわち\n" +"http://wiki.amule.orgを\"fake servers\"に対して検索してください。\n" +"aMuleが正しく運用するにはあなたのサーバ・リストから全ての囮のサーバを消さない" +"といけません。" + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"私たちのホームページwww.aMule.org、またはIRCチャネルirc.freenode.netの#aMule" +"で、\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "詳細な情報、サポートや新しいリリースを見つけることができます。\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "http://forum.amule.orgで楽にバッグをリポートしてください" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"あなたが指示したオンライン証明付ぃ在るのフォルダーは不正です!\n" +"個人設定でそれを直すまでにはオンライン証明を無効にします。" + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "エラー:ログ・ファイルを開くことは出来ません" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "注意:ログ・ファイルは空くです。何かがおかしいです。" + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "ログはリセットされました" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "サーバ・メッセージ:%s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "ノード・リストをダウンロードのに失敗しました。" + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "ダウンロードされたバージョン確認ファイルを開くのに失敗しました。" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "損被されたバージョン確認ファイル" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "あなたは時代遅れのaMuleを使用しています!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "あなたのaMuleバージョンは%i.%i.%iで、最先端バージョンは%li.%li.%liです" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "最先端バージョンはいつもhttp://www.amule.orgで見つけられます" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "注意:あなたのaMuledバージョンは時代遅れです:%i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "あなたのaMuleは先端のバージョンです。" + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "バージョン確認ファイルをダウンロードのに失敗しました" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "次の接続しています:%s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "%sに接続中です" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "ED2Kから切断しています" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kadを開始しました。" + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kadを中止しました。" + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Kadに接続しています(OKです)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Kadに接続しています(ファイアウォールされた)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Kadから切断しています" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"UDPポートが今設定に無効されている間にはKadネットワークを使用できないため、開" +"始はしません。" + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Kadネットワークは個人設定に無効されているため、接続はしません。" + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "" +"友達リスト・ファイル'emfriends.met'を読み込み用に開くのに失敗しました!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "" +"友達リスト・ファイル'emfriends.met'を書き込み用に開くのに失敗しました!" + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "" +#~ "リモートGUIから指定されたIPをブートストラップすることはまだ不可能です。" + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "リモートGUIからserver.metをアップデートすることはまだ不可能です。" + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "%u Kadコンタクトを読みました" + +#~ msgid "Disconnect from " +#~ msgstr "次の物から切断する: " + +#~ msgid "current server" +#~ msgstr "現在のサーバ" + +#~ msgid " and " +#~ msgstr " と " + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "サーバやKadから切断する" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "TCP Flags" +#~ msgstr "TCPフラッグ" + +#~ msgid "UDP Flags" +#~ msgstr "UDPフラッグ" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "ED2Kリンクをクリップボードへコピーする" + +#~ msgid "Client requests %u" +#~ msgstr "クライアントの要求数: %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "ファイルブロック %u-%u(%d バイト)" + +#~ msgid "Client request is invalid!" +#~ msgstr "クライアントの要求が不正です!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "クライアントの要求が不正です! %i / %i" + +#~ msgid "Command: %s" +#~ msgstr "コマンド: %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "%sファイルを開くことはできません:%sファイルを使用しています。" + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "注意:known.metは存在しません。" + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles:%sを共通ディレクトリーから外します:ディ" +#~ "レクトリーは見付かりません。" + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "サブ・プロセスの終了を待つのに失敗しました。" + +#~ msgid "" +#~ "You cannot connect to a release version from an arbitrary CVS version! " +#~ "*sigh* possible crash prevented" +#~ msgstr "" +#~ "任意CVSバージョンからリリースバージョンに接続は出来ません! *ハァ…*起こり" +#~ "得るクラッシュを予防しました" + +#~ msgid "doesn't work" +#~ msgstr "働きません" + +#~ msgid "remote gui" +#~ msgstr "リモートGUI" + +#~ msgid "" +#~ "Error: Failed to load backup file. Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "エラー:バックアップ・ファイルはロード出来ませんでした。http://forum." +#~ "amule.orgをpart.metで回復ソリューションを検索してください。" + +#~ msgid "" +#~ "Error: Backup part.met file is 0 size! Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "エラー:バックアップpart.metファイルはゼロ・サイズです!http://forum." +#~ "amule.orgでpart.met回復ソリューションを検索してください。" + +#~ msgid "Error: part.met backup file is 0 size: %s ==> %s" +#~ msgstr "" +#~ "エラー:part.metのバックアップ・ファイルはゼロ・サイズです: %s ==> %s" + +#~ msgid "" +#~ "Note: These values are\n" +#~ " only used for statistics." +#~ msgstr "" +#~ "留意:この値は統計にしか\n" +#~ "使われていません。" + +#~ msgid "Your aMule version is %i.%i.%i and the latest version is " +#~ msgstr "あなたのaMuleバージョンは%i.%i.%iで、最先端バージョンはです" + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " ウエッブサイト:http://www.amule.org \n" +#~ " フォーラム:http://forum.amule.org \n" +#~ " FAQ:http://wiki.amule.org \n" +#~ "\n" +#~ " コンタクト:admin@amule.org(事務的関係) \n" +#~ " 著作権 (C) 2003-2008 aMuleチーム \n" +#~ "\n" +#~ " aMuleの一部は \n" +#~ " Kademliaに基ずいてます: XORメトリクに基ずいたPeer-to-peerルーティン" +#~ "グ。\n" +#~ " 著作権 (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "注意:Low-IDを貰いました!" + +#~ msgid "Deprecated command, now 'Status'." +#~ msgstr "廃止予定のコマンドで、現在は'Status'です。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Status' instead.\n" +#~ msgstr "" +#~ "廃止予定のコマンドで、将来に存在しない可能性が高いです。\n" +#~ "代わりに、'Status'を使ってください。\n" + +#~ msgid "Deprecated command, now 'Set IPFilter'." +#~ msgstr "廃棄予定のコマンドで、現在は'Set IPFilter'です。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter' instead.\n" +#~ msgstr "" +#~ "廃止予定のコマンドで、将来に存在しない可能性が高いです。\n" +#~ "代わりに、'Set IPFilter'を使ってください。\n" + +#~ msgid "Deprecated command, now 'Get IPFilter Level'." +#~ msgstr "廃棄予定のコマンドで、現在は'Get IPFilter Level'です。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get IPFilter Level' instead.\n" +#~ msgstr "" +#~ "廃止予定のコマンドで、将来に存在しない可能性が高いです。\n" +#~ "代わりに、'Get IPFilter Level'を使ってください。\n" + +#~ msgid "Deprecated command, now 'Set IPFilter Level'." +#~ msgstr "廃棄予定のコマンドで、現在は'Set IPFilter Level'です。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "廃止予定のコマンドで、将来に存在しない可能性が高いです。\n" +#~ "代わりに、'Set IPFilter Level'を使ってください。\n" + +#~ msgid "Deprecated command, now 'Get/Set IPFilter Level'." +#~ msgstr "廃棄予定のコマンドで、現在は'Get/Set IPFilter Level'です。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get/Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "廃止予定のコマンドで、将来に存在しない可能性が高いです。\n" +#~ "代わりに、'Get/Set IPFilter Level'を使ってください。\n" + +#~ msgid "Deprecated command, now 'Show Servers'." +#~ msgstr "廃棄予定のコマンドで、現在は'Show Servers'です。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Show Servers' instead.\n" +#~ msgstr "" +#~ "廃止予定のコマンドで、将来に存在しない可能性が高いです。\n" +#~ "代わりに、'Show Servers'を使ってください。\n" + +#~ msgid "Deprecated command, now 'Get BwLimits'." +#~ msgstr "廃棄予定のコマンドで、現在は'Get BwLimits'です。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get BwLimits' instead.\n" +#~ msgstr "" +#~ "廃止予定のコマンドで、将来に存在しない可能性が高いです。\n" +#~ "代わりに、'Get BwLimits'を使ってください。\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Up'." +#~ msgstr "廃棄予定のコマンドで、現在は'Set BwLimits Up'です。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Up' instead.\n" +#~ msgstr "" +#~ "廃止予定のコマンドで、将来に存在しない可能性が高いです。\n" +#~ "代わりに、'Set BwLimits Up'を使ってください。\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Down'." +#~ msgstr "廃棄予定のコマンドで、現在は'Set BwLimits Down'です。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Down' instead.\n" +#~ msgstr "" +#~ "廃止予定のコマンドで、将来に存在しない可能性が高いです。\n" +#~ "代わりに、'Set BwLimits Down'を使ってください。\n" + +#~ msgid "Syncronization thread started." +#~ msgstr "同期化スレドを始めました。" + +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "既知のファイルのマースタハッシュはロードされました。" + +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "Kadコンタクトを読む途中にエラーが発生しました - 0 エントリー" + +#~ msgid "Merge attempt" +#~ msgstr "マージ試み" + +#~ msgid "Recursive merge" +#~ msgstr "再帰的マージ" + +#~ msgid "Sucessful merge!" +#~ msgstr "マージ成功!" + +#~ msgid "No merge possible" +#~ msgstr "マージ不嘉納です" + +#~ msgid "Buddy address: " +#~ msgstr "仲間のアドレス:" + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid " %d" +#~ msgstr " %d" + +#~ msgid ".%d" +#~ msgstr ".%d" + +#~ msgid "Shows the process of a search." +#~ msgstr "検索の進歩状態を表示します。" + +#~ msgid "Shows the process of a search..\n" +#~ msgstr "検索の進歩状態を表示します…\n" diff --git a/po/ko_KR.po b/po/ko_KR.po new file mode 100644 index 00000000..e5d6d8df --- /dev/null +++ b/po/ko_KR.po @@ -0,0 +1,7374 @@ +# Translation of amule interface to Korean +# Copyright (C) 2005-2006Free Software Foundation, Inc. +# This file is distributed under the same license as the PACKAGE package. +# Lee, Eun-ho , 2005. +# Hyunju Kang . 2007. +msgid "" +msgstr "" +"Project-Id-Version: ko_KR\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2007-09-12 16:04+0900\n" +"Last-Translator: Hyunju Kang \n" +"Language-Team: Korean \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Poedit-Language: Korean\n" +"X-Poedit-Country: KOREA, REPUBLIC OF\n" +"X-Poedit-SourceCharset: utf-8\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "반드시 암호를 설정해야 합니다." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "잘못된 패스워드, MD5 해시가 아닙니다." + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "연결 실패" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "외부연결 실패. 응답없음." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "외부연결: 다음 이유로 연결이 거부됨: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "외부연결: 접근이 거부됨" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "외부연결: 서버 응답 불량. 연결이 끊겼습니다." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "성공! 어뮬에 연결 되었습니다 " + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "성공! 연결이 되었습니다." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "해시중" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "완료중" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "완료" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "중지됨" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "오류투성이" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "받는중" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "대기중" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "다음 파일에 대해 MD4 및 AICH 해시를 만듭니다: %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "다음 파일에 대해 MD4 해시를 만듭니다: %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "다음 파일에 대해 AICH 해시를 만듭니다: %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "'%s'의 낡은 AICH 해시셋을 64b로 '%s'에 변환합니다." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "경고: 파일 이름 '%s'는 유효하지 않으며 '%s'로 변경되었습니다." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "경고: 파일 이름 '%s'는 이미 존재하며, 새 파일은 '%s'로 변경되었습니다." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "경고: 백업을 생성한 후 원본 '%s'를 제거할수 없습니다." + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "경고: %s를 삭제하지 못했습니다." + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "사용자 %s로부터 공유파일을 찾지 못했습니다." + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "알수없는" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (가짜 이뮬 버젼 %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (가짜 이뮬)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "엑스뮬(가짜 이뮬)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (이뮬 v0.%u 기반)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "별명: %s 아이디: %u" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "요청됨:" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"이 세션의 파일상태: %d가 수락되었습니다.(%d 요청의) %s에게 전달되었습니다.\n" +msgstr[1] "" +"이 세션의 파일상태: %d가 수락되었습니다.(%d 요청의) %s에게 전달되었습니다.\n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"모든 세션의 파일상태: %d가 수락되었습니다.(%d 요청의) %s에게 전달되었습니" +"다.\n" +msgstr[1] "" +"모든 세션의 파일상태: %d가 수락되었습니다.(%d 요청의) %s에게 전달되었습니" +"다.\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "알 수 없는 파일이 요청되었습니다." + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "클라이언트 %s, IP:포트 %s:%d, %s %s %s 사용" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "사용자이름" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "친구" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "상세히 보기(&D)" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "친구 추가" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "친구 제거" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "메시지 보내기(&M)" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "파일 보기" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "친구 칸으로 확정함" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "선택한 친구들을 삭제하시겠습니까?" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "선택한 친구들을 삭제하시겠습니까?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "취소" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"하나 이상의 친구칸으로 설정이 허락되지않습니다\n" +"단지 하나의 칸만 가능합니다." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "다중 선택" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "파일 이름" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "크기" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "종류" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "우선권" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "파일아이디" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "요청" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "허락된 요청" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "전송된 크기" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "공유 비율" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "획득한 부분" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "완료된 자료" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "폴더 경로" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "공유 파일" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "매우 낮음" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "낮음" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "보통" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "높음" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "매우높음" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "개방" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "자동" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "의견/등급 추가" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "의견/등급 편집" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "이름변경" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "컬렉션내의 파일을 전송목록에 추가" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "magnet URI를 클립보드로 복사(&U)" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "ED2k 링크를 클립보드로 복사(&l)" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "ED2k 링크를 클립보드에 복사(&Source)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "ED2k 링크를 클립보드로 복사 (Source) (&With Crypt options)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "ED2k 링크를 클립보드로 복사 (&Hostname)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "ED2k 링크를 클립보드로 복사 (Hostname) (With &Crypt options)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "ED2k 링크를 클립보드에 복사(&AICH info)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "반응을 클립보드에 복사" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "유효한 자료 링크를 만들기 위해서 높은아이디가 필요합니다." + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "경고" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "공유된 파일(%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[부분 파일]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "새이름 넣으세요:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "파일 이름변경" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "파일의 올려주기를 재시작합니다: %s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "파일의 올려주기를 정지합니다: %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "카뎀리아: 검색어가 너무 짧습니다." + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "오류: TCP포트를 열수없습니다." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "다음과 같은 오류로 요청 실패함: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "알 수 없는 오류로 요청이 실패함." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "인덱스 파일을 찾을 수 없음:" + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "웹 소켓 스레드를 생성할수 없음\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "웹 서버: 시작함\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "세션이 만료됨 - 로그인 요청중\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "세션 확인, 로그인 됨\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "세션 확인, 로그인 안됨\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "열린 세션 없음 - 로그인을 요청할 것임\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "세션이 생성됨 - 로그인 요청중\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "요청 처리중 [원본]: " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "암호를 검사중\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "암호 해시가 유효하지 않음\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "암호 맞음\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "암호 틀림\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "암호를 입력하지 않았습니다. 빈암호는 사용할수 없습니다.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "로그아웃이 요청됨\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "요청 처리중[redirected]: " + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "템플릿을 읽음" + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "웹서버 HTTP 포트" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "웹서버 포트에 UPnP 포트포워딩을 사용" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "UPnP 포트" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "gzip 압축 사용" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "웹서버 전체접근 암호" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "웹서버 손님 암호" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "손님 접근 허가" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "손님 접근 금지" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "원격 어뮬로부터 웹서버 설정을 불러오거나 저장합니다." + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "어뮬 설정 파일 경로. DO NOT USE DIRECTLY!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "PHP 해석자를 (권장되지 않는) 사용않함" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "각 요청의 PHP 페이지를 재컴파일함" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "어뮬 웹 서버" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "유효하지 않음" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "결코" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "내려받기중..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "환경설정" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "amulesig.dat 파일을 포함한 폴더" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "탐색" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "amulesig.dat 파일이 있는 폴더를 이곳에 입력하세요." + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "갱신율 초당 간격" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "매회 갱신할 때 통계 이미지를 생성합니다." + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "통계 이미지를 생성하는것을 원하는 장소 폴더를 이곳에 입력하세요." + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "FTP 서버의 통계 이미지를 정기적으로 올려줍니다." + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "FTP Url" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "FTP 경로" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "FTP 서버의 URL을 이곳에 입력하세요." + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "FTP 서버에 통계 이미지가 위치할 폴더를 이곳에 입력하세요." + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "사용자" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "암호" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "FTP 서버로 로그인하기 위한 사용자이름을 이곳에 입력하세요." + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "FTP 서버로 로그인하기 위한 암호를 이곳에 입력하세요." + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "FTP 갱신율 분당 간격" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "유효합니다" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "서명 파일이 있는 폴더" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "통계 이미지를 생성하는곳의 폴더" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i 일 %i 시간 %i 분 %i 초" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, 어뮬 온라인 통계" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "환영합니다!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "어뮬" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "wxCas 현재 실행시 최대 내려받기 속도" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "wxCas 이전 실행시부터 절대적 최대 내려받기 속도" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "초기화" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "시스템" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "자동갱신 멈춤" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "온라인 정적그림을 저장" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "온라인 정적그림을 프린트" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "환경 설정" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "wxCas에 대하여" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "자동갱신을 시작" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "자동갱신을 멈춤" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "자동갱신이 시작됨" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "통계 이미지를 저장" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "이 파일 종류의 처리기가 없습니다." + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "파일은 저장되지 않았습니다." + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "어뮬 온라인 통계" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"프린트하는데 문제가 있습니다.\n" +"혹시 현재 프린터가 올바로 설정되지 않았나요?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "프린트함" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, 어뮬 온라인 서명 통계\n" +"\n" +"(c) 2004 더폴리시 \n" +"\n" +"페드로 드 올리베이라 의 CAS에 기본을 두고있습니다.\n" +"\n" +"GPL로 배포합니다." + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "어어, 어뮬이 실행중이 아닙니다..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "어뮬은 실행중입니다." + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "어뮬은 실행중이나 연결이 끊겨 있습니다." + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "어뮬은 연결중..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "어어, 어뮬의 상태는 알수없음..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "어뮬 " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " 위해 실행되고있는 " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " 은 멈추어져 있습니다." + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " 은 연결되지 않았습니다." + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " 은 연결중..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " 무엇인가 이상하게 동작하고 있음, 확인 요망!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " 는 다음으로 연결중: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "확인" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "방화벽됨" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "끔" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr "켜졌습니다." + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +#, fuzzy +msgid " with " +msgstr "] with " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "전체 내려받기: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", 올려주기: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "내려받기 세션: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "내려받기: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr "올려주기, kB/s: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "공유함: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr "대기열에있는 파일, 클라이언트: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "시간:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr "켬" + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "시스템 부하 평균 (1-5-15 분): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "시스템 연속 작동 시간: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02u일 %02u시 %02u분 %02u초" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02u시 %02u분 %02u초" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02u분 %02u초" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02u초" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "높은아이디" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "낮은아이디" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "아직 연결되지 않았습니다." + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "취소됨!" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "%s를 열수없음." + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "%s 파일은 당나기로 쓰기엔 큽니다: 최대 허용은 4 GB입니다." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "설정값 입력" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "파일을 해시" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "이 파일의 추가주소를 더합니다." + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "ED2k 링크를 계산하기 원하는 파일을 이곳에 입력하세요." + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"ED2k 링크를 추가하기 원하는 주소를 이곳에 입력하세요: aLinkCreator가 현재 파" +"일 이름을 덧붙이게 하려면 끝에 '/'를 추가하세요." + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "추가" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "삭제" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "깨끗이" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "부분해시의 링크를 생성합니다." + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"링크의 크기를 증가시키는 대신 새 파일 및 희귀한 파일을 빠르게 퍼지는 데에 도" +"움을 줍니다." + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "md4 파일 해시" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "ED2k 파일 해시" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "ED2k 링크" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "시작" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "저장" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "클립보드로 복사" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "종료" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "ED2k 링크를 계산하기 위한 파일을 엽니다." + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "계산된 ED2k 링크를 클립보드에 복사합니다." + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "계산된 ED2k 링크를 파일로 저장합니다." + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "aLinkCreator에 대하여" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "ED2k 링크를 계산하기 원하는 파일을 선택하세요." + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "지금 복사할것은 아무것도 없습니다!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "계산된 ED2k 링크파일을 선택하세요." + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "열수 없음" + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "제발, 파일이름을 비우지 마세요." + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "지금 저장한것은 없습니다!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, 어뮬 ED2k 링크 생성자\n" +"\n" +"(c) 2004 더폴리시 \n" +"\n" +"http://jimmac.musichall.cz/ikony.php3 과\n" +"http://www.everaldo.com 과 http://www.icomania.com 으로부터 아이콘\n" +"\n" +"GPL로 배포합니다." + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "해시중..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "%.2f 초만에 완료" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "이미 이 주소가 추가되어 있습니다!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "주소를 비우지 마세요." + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "파일숫자 %u 처리: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "부분 해시를 요청했습니다. (오직 파일크기가 9.5 MB 보다 클때 사용)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "잠시 기다리세요..." + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> 존재하는 파일이 없음!\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, 어뮬 ED2k 링크 생성자" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "자동[낮음]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "자동[아님]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "자동[높음]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "연결중" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "요청" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "서버를 경유하여 연결중" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "대기열이 가득참" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "대기열에" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "전송중" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "해시설정을 받는중입니다." + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "필요없는 부분" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "낮은아이디에서 낮은아이디로 연결할수 없습니다." + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "매우 많은연결" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Kad를 경유하여 연결중" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "매우 많은 Kad 연결" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "퇴장됨" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "연결 오류" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "원격 대기열이 가득참" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "오래된 MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "새로운 MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "이뮬에 호환" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "지역 서버" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "원격 서버" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "자료 교환" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "수동적인" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "링크" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "자료 핵" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "기본 설정" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "아랍어" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "바스크어" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "불가리아어" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "카탈로니아어" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "중국어(간체)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "중국어(번체)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "크로티아어" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "덴마크어" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "네델란드어" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "영어(영국)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "에스토니아어" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "필란드어" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "프랑스어" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "갈리시아어" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "독일어" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "헝가리어" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "이탈리아어" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "이탈리아어(스위스)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "한국어" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "폴란드어" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "포르투갈어" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "포르투갈어(브라질)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "러시아어" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "슬로베니아어" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "스페인어" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "터키어" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "선택된 브라우저를 판단할수 없습니다!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" +"서버 UDP 소켓이 TCP+3이 되기위해서 TCP 포트가 65532보다 커서는 안됩니다." + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "기본 포트가 사용될 것입니다.(%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "서버 이름" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "주소" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "포트" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "설명" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "핑" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "사용자" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "파일" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "실패" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "정적" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "버젼" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"삭제하려는 서버에 연결되어 있습니다. 먼저 연결을 끊으세요. 서버는 삭제되지 않" +"습니다." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "정보" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(알수없는 이름)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "정적 서버 %s를 삭제하시겠습니까?" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "예" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "아니오" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "'%s'을(를) 열지 못했습니다." + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "서버 (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "서버" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "서버에 연결함" + +#: src/ServerListCtrl.cpp:428 +#, fuzzy +msgid "Mark server as static" +msgstr "정적인 서버를 만듦" + +#: src/ServerListCtrl.cpp:429 +#, fuzzy +msgid "Mark server as non-static" +msgstr "비정적인 서버를 만듦" + +#: src/ServerListCtrl.cpp:431 +#, fuzzy +msgid "Mark servers as static" +msgstr "정적인 서버를 만듦" + +#: src/ServerListCtrl.cpp:432 +#, fuzzy +msgid "Mark servers as non-static" +msgstr "비정적인 서버를 만듦" + +#: src/ServerListCtrl.cpp:438 +#, fuzzy +msgid "Remove server" +msgstr "서버를 삭제" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "서버를 삭제" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "모든 서버를 삭제" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "클립보드에 ED2k링크를 복사" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "클립보드에 ED2k링크를 복사" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "서버에 재접속" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "모든 서버를 삭제하시겠습니까?" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "선택된 서버를 삭제하시겠습니까?" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "선택된 서버를 삭제하시겠습니까?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "비활성화 [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "이 어뮬 %s는 이뮬 기반으로 되어있습니다." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "%s에 동작중" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "http://www.amule.org에 방문하셔서 새로운버젼이 있는지 확인하십시오." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "치명적 오류: 타이머 생성 실패" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "어뮬 원격제어" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "스냅삿" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr "" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr "" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "메시지" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "상태 문장" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "연결중" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "연결이 끊김" + +#: src/amuleDlg.cpp:676 +#, fuzzy +msgid "Kad: Firewalled" +msgstr "방화벽" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "연결됨" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "연결중" + +#: src/amuleDlg.cpp:689 +#, fuzzy +msgid "Kad: Off" +msgstr " Kad: " + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "현재 연결시도를 멈춤" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "연결 끊기" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "통신망으로부터 연결을 끊습니다." + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "연결" + +#: src/amuleDlg.cpp:726 +#, fuzzy +msgid "Connect to the currently enabled networks" +msgstr "통신망에 연결합니다." + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "올려주기: %.1f(%.1f) | 내려받기: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "올려주기: %.1f | 내려받기: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "어뮬 (%s | 연결됨)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "어뮬 (%s | 끊김)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "어뮬을 종료하시겠습니까?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "종료 확인" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "기본 브라우저가 선택되지 않았습니다." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "외형 폴더 '%s'가 없습니다." + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "경고: 외형 파일 '%s'(을)를 읽을 수 없습니다." + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "통신망" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "통신망 창" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "검색" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "검색 창" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "전송" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "파일 전송 창" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "공유 파일 창" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "메시지" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "메시지 창" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "통계" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "통계 그래프 창" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "환경 설정 창" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "가져오기" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "부분파일 가져오기 도구" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "정보" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "정보/도움" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "일반" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "연결" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "프록시" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "메시지 차단" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "원격 조정" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "온라인 서명" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "폴더" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "보안" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "GUI 조정" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "코어 조정" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "사건들" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "디버깅" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "사용자 설정" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"변경사항을 활성화 하기위해 어뮬을 재시작해야 합니다:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- TCP 포트가 변경되었습니다.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- UDP 포트가 변경되었습니다.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"자동갱신 서버 목록이 비어있습니다.\n" +"'시작시 서버목록 자동갱신'은 비활성화될 것입니다." + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"외부연결이 횔성화되어 있지만, 암호를 설정하지 않았습니다.\n" +"외부연결은 유효한 암호가 설정되기전까지 활성화되지 않습니다." + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- 언어가 변경되었습니다.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- 임시 폴더가 변경되었습니다.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "올려주기: 0.0 | 내려받기: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"ED2k와 Kad 네트워크 모두가 비활성화되어 있습니다.\n" +"적어도 하나를 활성화 할때까지 연결할 수 없습니다." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"UDP 포트가 비활성화되어 있으면 Kad는 시작하지 않을 것입니다.\n" +"UDP 포트를 활성화시키거나 Kad를 비활성화시키십시오." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"지금 바로 어뮬을 재시작해야 합니다.\n" +"만일 재시작하지 않는다면, 나쁜 일이 일어나도 불평하지 마십시오.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "경고" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"자동갱신 서버 목록이 비어있습니다.\n" +"적어도 한개의 유효한 server.met파일을 가르키는 URL을 적으세요.\n" +"URL을 입력하려면 채크박스 옆의 \"목록\"버튼을 클릭하세요." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "임시 파일" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "내려받은 파일" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "온라인 서명" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "%s하기 위한 폴더를 선택하세요." + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "탐색 효과음" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "웨이브 파일(*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "비디오재생을 위한 브라우즈" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "브라우저 선택" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "실행할수 있는 %s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "서버 목록 편집" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"server.met파일을 내려받을 URL을 추가하세요.\n" +"각 행에 오직 하나의 URL을 넣으세요." + +#: src/PrefsUnifiedDlg.cpp:980 +#, fuzzy, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "갱신 지연: %d 초" +msgstr[1] "갱신 지연: %d 초" + +#: src/PrefsUnifiedDlg.cpp:987 +#, fuzzy, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "평균 그래프 시간: %d 분" +msgstr[1] "평균 그래프 시간: %d 분" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "연결 그래프 크기: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, fuzzy, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "갱신 지연: %d 초" +msgstr[1] "갱신 지연: %d 초" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, fuzzy, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "파일 버퍼 크기: %d 바이트" +msgstr[1] "파일 버퍼 크기: %d 바이트" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, fuzzy, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "올려주기 대기열 크기: %d 클라이언트" +msgstr[1] "올려주기 대기열 크기: %d 클라이언트" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, fuzzy, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "서버 연결 갱신 주기: %d 분" +msgstr[1] "서버 연결 갱신 주기: %d 분" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "서버 연결 갱신 주기: 비활성화" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "`%s' 사건에 명령을 실행" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "코어에 명령 실행 활성화" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "코어 명령어:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "GUI에 명령 실행 활성화" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "GUI 명령어:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "다음 변수들은 교체됩니다.:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "허락되지않은 접속입니다. 연결이 끊깁니다." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "외부연결 끊겼습니다." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "빈암호 때문에 외부연결이 불가능합니다." + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "이 환경설정에서 외부연결은 불가능합니다." + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "새로운 외부연결이 승인되었습니다." + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "오류: 외부연결이 승인되지않았습니다." + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "환경설정의 빈암호로 인해 외부연결이 거부되었습니다." + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "연결중인 클라이언트: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "알수없는 버젼" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"불확실한 외부연결 버젼 아이디, 이것은 바이너리와 호환되지 않습니다. 동일한 스" +"냅삿으로부터 코어와 원격을 사용하세요." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "인증에 실패했습니다." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "유효하지 않은 프로토콜 버젼입니다" + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "프로토콜 버젼 태그 없음" + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "유효하지않은 요청, 먼저 인증을 하세요." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "접근 허가되었습니다." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "원격 부분파일 명령 실패: 파일해시를 찾을 수 없음: %s " + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "파일해시를 찾을 수 없음: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "이런! 명령코드 처리 오류!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "서버가 추가되지 않음" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "서버가 발견되지 않음: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "제거할 서버의 정의가 필요합니다." + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "ED2k가 환경설정에서 비활성화되어 있습니다." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "검색중입니다. 금방 결과를 다시 가져옵니다." + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "원격 인터페이스로부터 웹검색은 좋지않은 선택입니다." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad는 환경설정에서 비활성화되어 있습니다." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "그래프가 비어있음." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "클라이언트는 세부 수준이 구성되지 않았습니다." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "외부연결: 종료가 요청됨" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "이미 종료하는중입니다." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "외부연결: '%s' 링크를 추가합니다." + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "유효하지 않은 링크거나 이미 목록에 존재합니다." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "파일을 찾을 수 없습니다." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "유효하지 않은 파일 이름입니다." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "파일이름을 변경할 수 없습니다." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "이미 ED2k에 연결되었습니다." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "ED2k에 연결중..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "이미 Kad에 연결되었습니다." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Kad에 연결중..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "모든 통신망을 사용할수 없습니다." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "ED2k로부터 연결이 끊겼습니다." + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Kad로부터 연결이 끊겼습니다." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "외부연결: 유효하지 않은 실행코드를 받았음: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "유효하지 않은 실행코드(잘못된 프로토콜 버젼?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "파일 (%s)을 열수없어 공유 파일 목록으로부터 제거합니다." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "알수 없는 파일의 해시설정이 요청되었습니다: %s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "`%s' 명령(pid `%d')은 상태코드 `%d'로 종료되었습니다." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "서버 추가되지 않음: IP나 호스트이름이 지정되지 않았습니다." + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "서버 추가되지 않음: 유효하지 않는 서버 포트가 지정되었습니다." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "ED2k 상태:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "연결됨" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:포트" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "아이디" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "카뎀리아 상태:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "동작중" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "상태:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "연결이 끊김" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "연결 상태:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "방화벽" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "확인" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "방화벽 상태:" + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "친구에게 접속함" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "친구가 없음" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "평균 사용자:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "평균 파일:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "동작되지 않음" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "올려주기 시간: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "전송" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "올려주기" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "올려준 데이터 (세션 (전체)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "전체 추가자원 (패킷): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "파일 요청 추가자원 (패킷): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "자료 교환 추가자원 (패킷): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "서버 추가자원 (패킷): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Kad 추가자원(패킷): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "활성화된 올려주기: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "대기중인 올려주기: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "성공적인 전체 올려주기 세션 : %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "실패한 전체 올려주기 세션: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "평균 올려주기 시간: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "내려받기" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "내려받은 데이터 (세션 (전체)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "발견된 자료: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "활성화된 내려받기 (큰 부분): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "세션 올려주기:내려받기 비율 (전체): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "평균 내려받기율 (세션): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "평균 올려주기율 (세션): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "최대 내려받기율 (세션): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "최대 올려주기율 (세션): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "재접속: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "첫 전송으로부터 시간: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "다음으로부터 서버에 연결됨: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "활성화된 연결 (평가): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "최대 연결 제한 접근함: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "평균 연결 (평가): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "최대 연결 (평가): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "클라이언트" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "차단됨" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "전체: %i 알려진: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "서버" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "동작중인 서버: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "실패한 서버: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "전체: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "삭제된 서버: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "차단된 서버: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "동작중인 서버의 사용자: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "동작중인 서버의 파일: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "전체 사용자: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "전체 파일: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "서버 할당: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "공유된 파일의 수: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "공유파일의 전체 크기: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "평균 파일 크기: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "낮은아이디: %u(%.2f%% 전체 %.2f%% 알려진)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "구간식별 켬/끔: %u(%.2f%%) : %u(%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "운영체제" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "받은게 없음" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "자르기" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "복사" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "붙이기" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "모두 선택" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "Kad를 실행 중이 아니면 Kad 검색을 할 수 없습니다." + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "ED2k가 연결되어 있지 않으면 ED2k 검색을 할 수 없습니다." + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Kad 검색 시도 중에 예기치 못한 에러: " + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "'%s'로부터 차단된 메시지 (IP:%s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "'%s'로부터 새로운 메시지 (IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "사용자 %s(%u)가 공유파일 목록을 요청합니다. -> 허락됨" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "사용자 %s(%u)가 공유파일 목록을 요청합니다. -> 거부됨" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "사용자 %s(%u)가 공유폴더 목록을 요청합니다. -> 허락함" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "사용자 %s(%u)가 공유폴더 목록을 요청합니다. -> 거부됨" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "사용자 %s(%u)가 폴더 %s의 공유파일 목록을 요청합니다. -> 허락됨" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "사용자 %s(%u)가 폴더 %s의 공유파일 목록을 요청합니다. -> 거부됨" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "사용자 %s (%u)는 %s 폴더를 공유하고있습니다." + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "사용자 %s (%u)는 공유폴더를 요청하지 않았습니다." + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "사용자 %s (%u)는 %s 폴더의 공유파일 목록을 보냅니다." + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "사용자 %s (%u)는 공유파일 목록 전송을 마쳤습니다." + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "사용자 %s (%u)는 공유파일 목록을 원하지않습니다." + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "사용자 %s (%u)는 공유파일이나 공유폴더 목록에 접근하는것을 거부합니다." + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "노드 (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "초기적재에 유효하지 않은 IP" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "초기적재에 유효하지 않은 포트" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "모든 항목을 채워주세요." + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "새로운 nodes.dat파일을 내려받으시겠습니까?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "현재노드는 제거되고 카뎀리아 연결이 다시 시작됩니다." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "계속할까요?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "오류: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "경고: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "친구 추가" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "정확한 IP와 포트를 입력하세요!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "정보" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "설정된 사용자 해시가 옳바르지 않습니다!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "자료" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "파일" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "내려받기" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "분류" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "주" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "분류내 내려받기" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "관련 파일 검색 (ED2k, 지역서버)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "원격 어뮬에 연결함" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "연결 실패" + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "오류" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"경고: 낮은아이디를 가지고 있는 동안에는 스스로를 ed2k 링크에 자료로 추가할 " +"수 없습니다." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "사용자: E: %s K: %s | 파일 E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "전부" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "전체 사용자: %s | 전체 파일: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "전송됨" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "완료됨" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "속도" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "진척" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "상태" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "남은 시간" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "최종 완료" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "최종 받음" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "선택된파일을 지우시겠습니까?" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "선택된파일을 지우시겠습니까?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "사용자에게 메시지를 보내기" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "보낼 메시지:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "멈춤(&S)" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "중지(&P)" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "계속(&R)" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "완료된것 정리(&l)" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "모든 A4AF를 이 파일로 바꿈" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "모든 A4AF를 이 파일로 바꿈 (자동)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "모든 A4AF를 다른 파일로 바꿈" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "확장 옵션" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "미리보기" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "파일 상세 보기(&d)" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "모든 의견 보기" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "magnet URI를 클립보드로 복사" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "할당되지않은" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "분류로 할당" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "파일 열기(&O)" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "친구에서 삭제" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "친구에 추가" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "메시지 보내기" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "파일을 교환" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "QR: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "다른 파일을 요청" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "내려받기 (%i)" + +#: src/DownloadListCtrl.cpp:2222 +#, fuzzy +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"환경설정에서 비디오 재생 프로그램을 선택하세요.\n" +"그 동안 어뮬에서 미리보기를 할때마다 mplayer를 사용하도록 시도하며 미리보기" +"할 때마다 이 경고를 받을 것입니다." + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "미리보기" + +#: src/DownloadListCtrl.cpp:2260 +#, fuzzy, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "오류: 외부 재생기를 실행하지 못했습니다." + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "오류: 부분파일을 열지 못했습니다.)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "오류: 부분파일을 생성하지 못했습니다.)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "%s로부터 met파일의 백업을 읽을려고 합니다." + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "오류: part.met 파일을 열지 못했습니다: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "오류: part.met파일은 크기가 0입니다: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "오류: 유효하지 않은 part.met 파일버젼: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" +"오류: %s(%s)은 손상되었습니다. (잘못된 꼬리계수), 파일을 읽을수 없습니다." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "파일 정보를 복구하려고 하고있습니다..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "이름없는 파일을 복구합니다. - RecoveredFile.dat로 복구합니다." + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "모든 가능한 파일정보를 복구되었습니다. :D - 사용해 보세요..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "파일정보 복구가 불가능합니다. :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "%s(%s)을 열지 못했습니다." + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "경고: %s는 손상되었습니다. (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "부분파일을 저장하는 동안에 오류: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "'%s'은 어찌된일인지 크기가 0입니다. - %s 파일을 사용합니다." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "%s에 대한 part.met.seeds 파일을 저장하지 못했습니다." + +#: src/PartFile.cpp:1019 +#, fuzzy, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "부분파일을 위해 %i 자료핵심을 저장되었습니다: %s(%s)" +msgstr[1] "부분파일을 위해 %i 자료핵심을 저장되었습니다: %s(%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "부분파일 %s(%s)은 핵심파일을 가지고 있지 않습니다." + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "부분파일 %s(%s)은 빈 핵심파일을 가지고 있습니다." + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "부분파일의 핵심파일(%s - %s)을 읽는중 오류: %s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, fuzzy, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"손상된 부분(%d)이 발견되었습니다. (%d부분 파일 %s에 있는) - 파일해시결과 |%" +"s| 파일해시 |%s|" +msgstr[1] "" +"손상된 부분(%d)이 발견되었습니다. (%d부분 파일 %s에 있는) - 파일해시결과 |%" +"s| 파일해시 |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "완료된 부분(%i)이 발견되었습니다. (%s에 있는)" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "%s의 재해시가 완료되었습니다." + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "%s가 완료되는중 예상되지 않은 파일오류가 발생하였습니다. 파일 중지" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "내려받기 완료: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "파일 삭제: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "경고: 내려받은 부분의 해시가 불가능합니다. - %s의 해시설정 비완료" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"오류: 내려받은 부분의 해시가 불가능합니다. - 해시설정 비완료 (%s). 발생되어서" +"는 안됩니다." + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "경고: 충분한 디스크공간이 없습니다! 파일 정지: %s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "%i 부분 내려받기는 파일이 손상되었습니다: %s" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH: 손상된 부분 %i를 복구했습니다. (%s의) -> 저장된 바이트: %s" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "불충분한 디스크공간" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "멈춤" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "경고: known.met을 열 수 없습니다." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" +"경고: 알려진파일 목록이 손상됨, 유효하지 않는 머리말을 포함하고 있습니다." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "known.met 파일을 읽는동안 입출력 오류: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "known.met 파일을 저장하는 동안 오류: %s" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "알려진 공유 파일 %i개를 찾았음" +msgstr[1] "알려진 공유 파일 %i개를 찾았음" + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "알려진 공유 파일 %i개, 알수없는 %i개를 찾았음 " +msgstr[1] "알려진 공유 파일 %i개, 알수없는 %i개를 찾았음 " + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "오류! %s 공유를 시도" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "파일 의견" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "등급" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "의견" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "의견이 없음" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%s 의견" +msgstr[1] "%s 의견" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "난독화된 서버들로의 연결이 모두 실패했습니다. 난독화없이 진행합니다." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "모든 서버 목록에 접속하지 못했습니다. 다른 서버를 만드세요." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "ED2k 통신망이 환경설정에서 비활성화되어 있으므로 연결하지 않습니다." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "발견된 서버 목록에서 연결할수 있는 유효한 서버가 없습니다." + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "%s (%s:%i)에 연결되었습니다." + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "다음에 연결이 되었습니다: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"연결하는 동안 치명적 오류가 발생하였습니다. 인터넷 연결이 끊긴것 같습니다." + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "%s(%s:%i)에 연결이 끊김." + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s(%s:%i)가 죽은것 같습니다." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s(%s:%i)가 가득찬것 같습니다." + +#: src/ServerConnect.cpp:391 +#, fuzzy, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "%d 초후에 서버로 자동 접속을 재시도" +msgstr[1] "%d 초후에 서버로 자동 접속을 재시도" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "연결 끊김" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "%s(%s:%i)에 연결하지 못했습니다." + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "오류: 시간초과 검사에 유효하지 않은 소켓" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "%s(%s:%i)에 접속을 시도하는데 시간이 지났습니다." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "부분파일을 찾을 수 없음" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "%u 부분파일을 찾았음" +msgstr[1] "%u 부분파일을 찾았음" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "내려받기 %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "이미 '%s' 파일을 내려받으려고 하고있음" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "이미 %s 파일을 가지고 있음" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "이미 %s 파일을 내려받으려고 하고있음" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "magnet 링크를 ed2k로 변환할 수 없음: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "링크의 알려지지 않은 프로토콜: %s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "유효하지 않은 ED2k링크! 오류: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "을 실행하고 종료합니다." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "유효하지 않은 IP 형식. xxx.xxx.xxx.xxx:xxxx를 사용하세요.\n" + +#: src/TextClient.cpp:305 +#, fuzzy +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "이 명령은 인수를 필요로합니다. 유효한 인수: 'all' 또는 숫자\n" + +#: src/TextClient.cpp:343 +#, fuzzy +msgid "Processing by hash: " +msgstr "파일숫자 %u 처리: %s" + +#: src/TextClient.cpp:358 +#, fuzzy +msgid "Processing by filename: " +msgstr "파일숫자 %u 처리: %s" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "유효한 숫자가 아님\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "유효한 해시가 아님 (길이는 정확히 32자여야 함)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "동작이 성공했습니다." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "다음과 같은 오류로 요청이 실패: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "클라이언트에 대한 IP 차단 %s.\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "끔" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "켬" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "서버에 대한 IP 차단 %s.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "현재 IP 차단 수준은 %d입니다.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "대역폭 제한: 올려주기: %u kB/초, 내려받기: %u kB/초\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2k" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "%s %s %s에 연결됨" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "낮은아이디로" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "높은아이디로" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "지금 연결중" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "연결 안됨" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"내려받기:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"올려주기:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"대기열의 클라이언트:/t %d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"전체 자료:\t% d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "검색된 결과 갯수: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "TODO - 검색의 진행을 보여줌" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "서버로부터 알수없는 반응을 수신했습니다. 실행코드 = %#x" + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "간단한 상태 정보를 보여줍니다." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "연결 상태를 보여줌, 현재 올려주기/내려받기 속도, 기타.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "전체 통계 구조도를 보여줍니다." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"부가적으로, 0-255 범위에 있는 숫자를 이 명령의 인수로 넘길 수 있으며,\n" +"얼마나 많은 항목을 클라이언트 버젼 하위구조에 보여줄 것인지 결정합니다.\n" +"0이나 생략은 '무제한'을 뜻합니다..\n" +"예: 'statistics 5'는 각 클라이언트 종류의 상위 5가지 버전만 보여줍니다.\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "어뮬 종료." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"원격으로 동작하는 코어(어뮬)를 종료합니다.\n" +"동작하는 코어없이는 불안정하기 때문에,\n" +"문자기반 클라이언트도 종료될것입니다.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "주어진 대상을 다시 읽어들입니다." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "공유된 파일 목록을 다시 읽어들입니다." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "파일로부터 IP 차단 테이블을 다시 읽어들입니다." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "통신망에 연결합니다." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"설정되어 있는 가능한 모든 통신망에 연결할 것입니다.\n" +"또한, 부가적으로 연결할 서버를 IP:포트 형식으로 지정할수 있습니다.\n" +"IP는 점과 십진수의 IPv4 주소이거나, 해석 할 수 있는 DNS이름 이어야 합니다.\n" +" " + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "ED2k에만 연결합니다." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Kad에만 연결합니다." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "통신망으로부터 연결을 끊습니다." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "현재 연결되어있는 모든 통신망으로부터 연결을 끊습니다.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "ED2k에서만 연결을 끊습니다." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Kad에서만 연결을 끊습니다." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "ed2k 또는 magnet 링크를 코어에 추가합니다." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"다음의 ed2k 링크가 추가될 수 있습니다.:\n" +"*) 파일 링크 (ed2k://|file|...), 내려받기 대기열에 추가되고,\n" +"*) 서버 링크 (ed2k://|server|...), 서버목록에 추가되고,\n" +"*) 서버목록 링크, 목록에 포함된 모든 서버들이 서버목록에 추가됩니다.\n" +"\n" +"magnet 링크는 ed2k 해시와 파일 길이를 포함해야 합니다.\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "설정값을 정합니다." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "IP 차단 설정을 합니다." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "클라이언트와 서버에 IP 차단을 사용합니다." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "클라이언트와 서버에 IP 차단을 사용하지 않습니다." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "클라이언트에 IP 차단을 활성/비활성화 합니다." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "클라이언트에 IP 차단을 사용합니다." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "클라이언트에 IP 차단을 사용하지 않습니다." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "서버에 IP 차단을 활성화/비활성화 합니다." + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "서버에 IP 차단을 사용합니다." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "서버에 IP 차단을 사용하지 않습니다." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "IP 차단 수준을 선택합니다." + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"유효한 차단 수준은 0-255범위여야 하고, 기본(초기)값은\n" +"127입니다.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "대역폭 제한 설정합니다." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "이 명령에 주어지는 값은 킬로바이트/초 이어야 합니다..\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "올려주기 대역폭 제한 설정합니다." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "내려받기 대역폭 제한 설정합니다." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "설정값 가져와 보여줍니다." + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "IP 차단 설정을 가져옵니다." + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "서버와 클라이언트에서 IP 차단 상태를 가져옵니다." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "클라이언트에서만 IP 차단 상태를 가져옵니다." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "서버에서만 IP 차단 상태를 가져옵니다." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "IP 차단 수준을 가져옵니다." + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "대역폭 제한 가져옵니다." + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "검색을 합니다." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"검색의 종류는 다음중에서 정의되어야 합니다:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"예: 'search kad file'은 \"file\"에대해 kad 검색을 실행합니다.\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "광역 검색을 수행합니다." + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "지역 검색을 수행합니다." + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Kad 검색을 수행합니다." + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "마지막 검색의 결과를 보여줍니다." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "이전 검색의 결과로 돌아갑니다.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "파일의 내려받기를 시작" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"마지막 검색으로부터 파일의 번호가 부여됩니다.\n" +"예: 'download 12' 는 이전 검색에서 12번 번호를 가진 파일의 내려받기를 시작합" +"니다.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "내려받기를 정지합니다." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "내려받기를 재시작합니다." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "내려받기를 취소합니다." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "내려받기의 우선순위를 설정합니다." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "내려받기의 우선순위를 낮음, 보통, 높음 또는 자동으로 설정합니다.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "우선순위를 낮음으로 설정합니다." + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "우선순위를 보통으로 설정합니다." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "우선순위를 높음으로 설정합니다." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "우선순위를 자동으로 설정합니다." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "대기열/목록 보여줍니다." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "올려주기/내려받기 대기열, 서버 목록이나 공유된 파일 목록 보여줍니다.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "올려주기 대기열을 보여줍니다." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "내려받기 대기열을 보여줍니다." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "로그를 보여줍니다." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "서버 목록 보여줍니다." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "로그를 초기화합니다." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress()이 NULL값을 반환했습니다." + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "오류: %s(%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "경고: %s(%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "새로운 클라이어트 아이디는 %u임" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "\t이러한 대부분의 이유는 방화벽이나 라우터때문입니다." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\t더 많은 정보는 http://wiki.amule.org을 참조하세요." + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "알수없는 서버 정보를 받았습니다! - 매우 짧음" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "새로운 서버 %d개를 받음" +msgstr[1] "새로운 서버 %d개를 받음" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "서버목록 저장이 완료되었습니다." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "서버가 마지막 명령을 거부함" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "가짜 패킷을 서버로부터 받았습니다: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "서버로부터 패킷을 처리하는동안 조치할수 없는 오류가 생겼습니다: %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "%s에 연결하기 위한 DNS 해석 쓰레드를 만들수 없음" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "서버 IP %s(%s)가 차단되었습니다. 연결할수 없습니다." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "프로토콜 난독화를 사용합니다." + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "%s (%s - %s:%i) %s에 연결합니다." + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "%s 서버에 대한 DNS를 해석 할 수 없음: 연결할수 없습니다!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "CIP2Country::CIP2Country(): 국가 정보를 읽을 수 없습니다." + +#: src/IP2Country.cpp:73 +#, fuzzy, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "Loaded %d flag bitmaps." +msgstr[1] "Loaded %d flag bitmaps." + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "이 분류에 있는 모든 파일을 취소하고 삭제하시겠습니까?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "확인이 요청됨" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "다른 전부" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "내려받음" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "활성화" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "비디오" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "음악" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "압축" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "CD이미지" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "그림" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "문자" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "보기 필터 선택" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "분류 추가" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "분류 수정" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "분류 삭제" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "가져오는중 %s: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "임시 폴더를 읽는중" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "내려받은 정보 파일로부터 기본적인 정보를 재생" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "대상 파일을 생성" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "오래된 내려받은 파일로부터 데이터를 읽어들임 (%u (%u의))" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "데이터 블럭을 새 내려받은 파일로 저장 (%u (%u의))" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "내려받은 파일 정보 자료를 재생" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "내려받기에 추가하고 새 부분파일을 저장" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "상태를 받는 중..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "진행중" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "에러: 디스크 공간 부족" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "오류: Partmet을 찾을 수 없음" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "오류: 입출력 오류!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "오류: 실패함!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "대기열에 있음" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "이미 내려받는중" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "알수없거나 나쁜 임시 파일 형식입니다." + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "파일 이름" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "상태" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "파일 해시" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "부분파일 가져오기" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "임시 내려받기를 위해 검색할 폴더를 선택하세요! (하위 폴더 포함)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "성공적으로 가져온 내려받기 파일을 삭제하겠습니까?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "자료를 삭제하겠습니까?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "대기중..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s(디스크: %s)" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "bytes" +msgstr[1] "bytes" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "bytes/s" +msgstr[1] "bytes/s" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "초" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "분" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "시" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "일" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "동영상" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "압축" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "문장" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "프로그램" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "어떤" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "선택되지 않은" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "유효하지않은 / 손상된 / 가짜" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "나쁜" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "그저그런" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "좋은" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "아주좋은" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "전부" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "다른 모두" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "'ipfilter.dat' 와 'ipfilter_static.dat'의 IP 차단을 읽어옵니다." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "ipfilter.dat 파일 '%s'을 읽지 못했습니다. 알 수 없는 형식입니다." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "ipfilter.dat 파일 '%s'을 읽지 못했습니다, 파일을 열 수 없습니다." + +#: src/IPFilter.cpp:330 +#, fuzzy, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +"%u 개의 IP 범위를 '%s'로부터 읽었습니다. %u 개의 잘못된 줄은 무시했습니다." +msgstr[1] "" +"%u 개의 IP 범위를 '%s'로부터 읽었습니다. %u 개의 잘못된 줄은 무시했습니다." + +#: src/IPFilter.cpp:332 +#, fuzzy, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +"%u 개의 IP 범위를 '%s'로부터 읽었습니다. %u 개의 잘못된 줄은 무시했습니다." +msgstr[1] "" +"%u 개의 IP 범위를 '%s'로부터 읽었습니다. %u 개의 잘못된 줄은 무시했습니다." + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "활성화된 연결 (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "파일 세부내역" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% 완료" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "ED2K 링크: " + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "확정" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" +"문장 컨트롤내의 ed2k 링크를 내려받기 대기열에 추가하려면 여기를 클릭하세요." + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "팝업 상태 문장" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "읽는중..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"사건은 이곳에 보여집니다. 사건 목록의 전체를 보기위해 서버텝에 있는 로그파일" +"을 참조하세요" + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "접속되어있는 서버의 사용자 수는..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "사용자: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "현재 서버에 연결된 사용자들과 총 사용자수를 측정합니다." + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"현재 올려주기와 내려받기 비율을 평균합니다. 가능하다면 괄호안의 수는 클라이언" +"트 통신으로부터의 추가자원을 의미합니다." + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"연결상태와 활성화된 전송을 보여줍니다. 빨간 화살은 현재 연결되지 않았음을 의" +"미하며, 노란 화살은 낮은아이디(방화벽)를 가지고 있다는 의미이고, 초록 화살은 " +"높은아이디(최적의 연결 형태)를 가지고 있다는 의미입니다." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "연결안됨..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "현재 서버에 연결되었습니다." + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "검색" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "이름:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "지역" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "광역" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "파일해시" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "확장 변수" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "필터링" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "파일 종류" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "확장자" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "최소 크기" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "바이트" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "최대 크기" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "유효성" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "필터:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "필터링 결과" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "반전 결과" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "알려진 파일을 숨김" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "추가" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "ED2K에서 더 많은 결과를 찾습니다. Kad는 아직 지원되지 않습니다." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "멈춤" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "항목 초기화" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "결과" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "완료된 내려받기 정리" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "올려주기 / 올려주기 대기열 보이기" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "대기열속의 클라이언트 :" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "보내기" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "지정된 메시지를 보냅니다." + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "닫기" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "이 채팅세션을 닫습니다." + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "전체 이름 :" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "없음" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "메타파일 :" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "해시" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "파일 크기 :" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "부분파일 상태 :" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "마지막 부분이 완료 :" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "찾은 자료 :" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "전송된 자료 :" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "부분파일 카운트 :" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "가능함 :" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "데이터율 :" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "내려받기 활성화 시간: " + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "전송됨 :" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "완료된 크기 :" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "현명한 오류처리" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "오류로 잃어버림 :" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "압축으로 얻음 :" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "I.C.H에의해 저장된 패키지 :" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "파일 이름" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "인계" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "정돈" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "적용" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "확인" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "파일에 대한 의견/등급(내용은 모든 사용자가 볼 수 있습니다.)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"영화의 상영시간, 줄거리, 언어등을 말할수 있습니다.\n" +"만약 가짜 파일이라면 다른 어뮬 사용자에게 알려줄 수 있습니다." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "파일 품질" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" +"만약 파일이 유용하지 않으면 파일 품질을 선택하거나 사용자에게 충고하세요." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "의견이 없음" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "새롭게하다" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "내려받는중. 잠시만 기다려주세요..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "알수없는 크기" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "요구된 정보" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "IP 주소 :" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "포트 :" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "추가적 정보" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "사용자 이름 :" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "사용자 해시 :" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "공유된 파일을 다시 읽어들임" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "현재 세션" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "전체" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "요청됨 :" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "활성화된 올려주기 :" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "내려받기 속도" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "현재" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "동작중 평균" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "세션 평균" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "올려주기 속도" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "연결" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "활성화된 내려받기" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "활성화된 연결 (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "활성화된 올려주기" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "통계 트리" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "사용자 이름:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "사용자 해시:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "클라이언트 소프트웨어:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "클라이언트 버전:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "IP 주소:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "사용자 아이디:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "서버 IP:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "서버 이름:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "클라이언트에 전송" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "현재 요청:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "평균 올려주기율:" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "평균 내려받기율:" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "올려주기 (세션)" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "내려받기 (세션)" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "올려주기 (전체)" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "내려받기 (전체)" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "점수" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "내려받기/올려주기 변경자:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "안전한 인증:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "평가 (전체)" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "대기열 점수:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "일반 설정" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "별명" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.amule.org - 리눅스 뮬" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "이것은 접속했을때 다른 사용자가 볼 수 있는 이름입니다." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "언어" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "컨트롤에서 사용하는 언어를 설정합니다." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "기타 설정" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "시작할때 새 버젼이 있는지 확인" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" +"이것을 활성화하면 어뮬은 시작할때마다 새로운 버젼이 있는지 확인할것 입니다." + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "최소화된 시작" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "이것은 어뮬을 시작할때 최소화를 가능하게 합니다." + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "종료시 확인창" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "종료하기 전에 확인창을 보여줍니다." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "트레이아이콘 활성화" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "이것은 시스템 트레이(혹은 작업표시줄) 아이콘을 활성화/비활성화 합니다." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "트레이 아이콘으로 최소화" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "어뮬을 작업표시줄보다 시스템 트레이로 최소화 하도록 합니다." + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "도구도움의 지연 시간 (초)" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "도구도움이 보여주기 이전의 지연시간." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "브라우저 선택" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "컨커러" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "모질라" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "불여우" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "불사조" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "오페라" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "넷스케이프" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "갈레온" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "에피파니" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "브라우저 선택" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "특정 브라우저:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"브라우저 이름을 입력하세요. 특정 브라우저를 사용하기 위해서는 위의 메뉴중에" +"서'특정 브라우저'를 선택하세요." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "가능하면 새로운 탭을 생성함" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "가능하면 새로운 창을 여는것 대신 새로운 탭을 생성합니다." + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "대역폭 제한" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "올려주기" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "칸 배분" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "라인 용량" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "표준 클라이언트 TCP 포트:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "이것은 표준 ED2k 포트이며 비활성화 할수 없습니다." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "확장된 클라이언트 UDP 포트:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "이 UDP 포트는 확장된 Ed2k 요청과 Kad 통신망에 사용됩니다." + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "비활성화" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "확장된 서버 요청을 위한 UDP 포트 (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "파일당 최대자료수" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "강한 제한" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "연결 제한" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "최대 연결" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "카뎀리아" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Universal Plug and Play" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "UPnP 활성화" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "UPnP TCP 포트:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "시작시 자동연결" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "끊겼을시 재연결" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "추가자원 대역폭을 보여줌" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "서버 선택사항" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "죽은서버 제거" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "재시도" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "시작시 서버 목록을 자동갱신" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "목록" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "서버에 연결할때 서버 목록을 갱신" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "클라이언트가 연결할때 서버 목록을 갱신" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "우선순위 시스템을 사용" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "연결할때 현명한 낮은아이디 검사를 사용" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "안전한 연결" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "정적목록내의 서버에만 연결" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "수동으로 추가된 서버에 높은 우선권 부여" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "I.C.H. 활성화" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICH가 모든 해시를 신뢰 (추천안함)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "멈춤 상태로 내려받기에 파일 추가" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "자동 우선권으로 내려받기에 파일 추가" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "처음과 마지막 부분을 먼저 내려받음" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "자동 우선권으로 새로운 공유파일을 추가" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "모든 올려주기에 전체부분 전송을 시도" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "파일이 완료되었을때 멈춤상태인 다음파일을 시작" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "동일한 분류로부터" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "희귀한 파일인 경우 10개의 자료 저장 (<20 자료)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "디스크 공간" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "디스크 공간검사" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "어뮬이 디스크공간을 검사하도록 함" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "최소 디스크 공간:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "원하는 최소한의 디스크공간을 입력하세요." + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "내려받는 폴더 :" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "임시 폴더 :" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "공유 폴더" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "(하위폴더 전체를 공유하려면 폴더 아이콘상에서 오른쪽 버튼을 클릭)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "숨은파일 공유" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "비디오 재생기" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "미리보기를 위해 백업파일을 만듦" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "그래프" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "갱신 지연 : 5 초" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "평균 그래프 시간 : 100 분" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "연결 그래프 크기 : 100" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "통계색 선택" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "바탕" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "눈금" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "현재 내려받기" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "내려받기 운용 평균" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "내려받기 세션 평균" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "현재 올려주기" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "올려주기 운용 평균" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "올려주기 세션 평균" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "활성화된 연결" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "시스템트레이 아이콘 속도바" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "현재 Kad-노드" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Kad-노드 운용" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Kad-노드 세션" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "선택" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "표시될 클라이언트 버젼의 수 (0=무제한)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "통지" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "메시지 팝업" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "소리 이용" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "팝아웃 할때 :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "로그의 새로운 항목" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "새로운 채팅 세션을 시작" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "새로운 채팅 메시지가 수신됨" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "내려받기가 추가되거나 완료됨" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "새로운 어뮬 버젼이 발견됨" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "긴급한 OOD, 서버연결이 끊김" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "메일로 통보" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "전송이 완료되었을때 메일을 보냅니다." + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "SMTP 서버 :" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "이메일 주소 :" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! 경고 !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"당신이 무엇을 하는지 알때까지 이 설정들을 바꾸지 마세요.\n" +"당신 스스로 문제를 만들기 쉽습니다.\n" +"\n" +"\n" +"이 설정들을 조정하지 않아도\n" +"어뮬은 잘 동작할 것입니다." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "고급 설정" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "최대 새연결 / 5 초" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "파일 버퍼 크기: 240000 바이트" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "올려주기 대기열 크기: 5000 클라이언트" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "서버 연결 갱신 간격: 사용않함" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "GUI 조정" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "내려받기 대기열 파일 진행" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "퍼센트로 보기" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "진행바로 보기" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "진행바 모양" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "평평한" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "둥근" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "외형 지원" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "외형지원 활성화" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "외형:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- 가능한 외형이 없음 -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "열 정렬" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "내려받기 대기열 자동 정렬 (높은 CPU)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "어뮬은 내려받는 목록의 항목을 자동으로 정렬합니다." + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "기타 GUI 조정" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "빠른 ED2k링크 처리기를 보여줌" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "분류탭의 확장된 정보를 보여줌" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "제목에 전송률을 보여줌" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "수직방향 툴바" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "파일이름 앞에 부분파일 번호를 보여줌" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "원격 조정" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "웹서버 설정" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "시작시 어뮬웹 구동" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "웹서버 포트" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "웹서버 포트로 UPnP 포트포워딩 활성화" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "웹서버 UPnP TCP 포트" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "페이지를 갱신 시간 (초)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Gzip압축을 활성화" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "낮은권한 사용자 활성화" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "모든 권한 암호" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "낮은 권한 암호" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "웹 템플릿" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "외부연결 설정" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "외부연결 받아들임" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"수신대기 인터페이스의 IP\n" +"(모두를 위해서는 비움)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"수신대기 외부연결 인터페이스에 a.b.c.d 형식의 유효한 IP를 입력하세요. 항목이 " +"비었거나 0.0.0.0이면 모든 인터페이스를 의미합니다." + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "TCP 포트" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "외부연결 포트에 UPnP 포트포워딩 활성화" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "환경설정으로 바꾼것을 적용하려면 이곳을 클릭하세요." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "환경설정으로 바꾼것을 초기화합니다." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "제목 :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "의견 :" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "내려받는 폴더 :" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "새롭게 할당된 파일의 우선권를 바꿉니다. :" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "변경 않음" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "이 분류의 색을 선택 (일반적으로 선택된) :" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "연결되었을때 서버 motd를 보여줌..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "서버 정보" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "로그를 초기화하려면 이 버튼을 클릭하세요." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "어뮬 로그" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "URL로부터 서버 목록을 갱신하려면 이 버튼을 클릭..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "서버 목록" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"알려진 서버의 목록을 갱신하기 위해서는 이곳에 server.met파일의 url을 입력하" +"고 왼쪽편의 버튼을 누르세요." + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "수동 서버추가 : 이름" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "새로운 서버의 이름을 입력하세요." + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "x.x.x.x형식으로 서버의 IP를 이곳에 입력하세요." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "서버의 포트를 이곳에 입력하세요." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "서버 수동 추가 (미리 왼쪽 부분을 채울 것) ..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "ED2k 정보" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Kad 정보" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"컴퓨터에 선택한 지역정보(로케일)가 설치 않된것 같습니다.\n" +"이 언어를 사용하기 위해서는 지역정보(로케일)를 생성해야 합니다.\n" +"리눅스 시스템에서 좋은 시작지점은 /etc/local.gen 파일과 'locales' 꾸러미입니" +"다.\n" +"행운을 빕니다!\n" +"(주의: 어쨌든 설정하겠습니다)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "다시 보여주지 않음" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "URL로부터 노드를 갱신하려면 이 버튼을 클릭..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "노드 (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"알려진 노드의 목록을 갱신하기 위해서는 이곳에 nodes.dat파일의 url을 입력하고 " +"왼쪽편의 버튼을 누르세요." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "노드 상태" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "초기적재" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "새로운 노드" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "포트:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"알려진 클라이언트로부터 \n" +"초기적재" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Kad 끊김" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "프로토콜 난독화" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "프로토콜 난독화 지원" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"이 선택은 프로토콜 난독화를 활성화하며, 어뮬이 다른 클라이언트로부터 난독화" +"된 연결을 받아들이도록 합니다. " + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "나가는 연결에 난독화 사용" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"이 선택은 어뮬이 다른 서버나 클라이언트에 연결할때 프로토콜 난독화를 사용하" +"게 합니다." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "난독화된 연결만 받음" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"이 선택은 어뮬이 난독화된 연결만 받아들이도록 합니다. 더 작은 자료를 가지지" +"만 자료교환은 난독화됩니다." + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "파일 설정" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "모두" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "아무도" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "공유 파일을 볼 수 있는 사람:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "공유 파일 목록 보기를 요청할 수 있는 사람을 선택하세요." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "IP 차단" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "클라이언트 차단" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "~/.aMule/ipfilter.dat에 기록된 클라이언트 IP의 차단을 활성화합니다." + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "서버 차단" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "~/.aMule/ipfilter.dat에 기록된 서버 IP의 차단을 활성화합니다." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "목록 다시읽기" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "~/.aMule/ipfilter.dat 파일에서 차단할 IP의 목록을 다시 읽음" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "지금 갱신" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "시작시 IP차단을 자동 갱신" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "차단 수준:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "랜 IP를 항상 차단" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"클라이언트 IP가 패킷이 수신된 IP와 다르면 패킷을 거부합니다. 조심해서 사용하" +"세요." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "활성화/비활성화" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "온라인서명을 활성화" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"서명을 생성할 수 있는 외부 응용프로그램에 의해 사용될 수 있는 운영체제 파일" +"의 기록을 활성화합니다." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "갱신 주기(초)" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "온라인 서명 갱신 주기(초)를 바꿉니다." + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "온라인 서명 폴더:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "온라인서명 파일을 포함하는 폴더를 선택하려면 클릭하세요." + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "비활성화/활성화" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "받는 메시지 차단(현재 채팅은 제외)" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "차단 설정:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "모든 메시지를 차단" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "친구 목록에 없는 사람으로부터 메시지를 차단" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "알 수 없는 클라이언트로부터 메시지를 차단" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "다음 내용이 포함된 메시지를 차단 (쉼표로 분리):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "이곳에 어뮬이 차단하고 막을 메시지에 포함될 단어를 추가하세요." + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "의견들" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "프록시 활성화" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "프록시지원을 활성화/비활성화" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "프록시 종류:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "연결하고 있는 프록시 타입" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "프록시 호스트:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "프록시 호스트 이름" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "프록시 포트:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "프록시 포트" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "인증" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "인증 활성화" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "사용자이름/암호 인증을 활성화/비활성화" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "프록시에 접속하기 위한 사용자이름" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "암호:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "프록시에 접속하기 위한 암호" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "프록시 없이 서버에 자동으로 연결" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "연결함:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "원격 어뮬에 로그인" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "사용자이름" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "설정을 기억" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "상세한 디버그-로깅 활성화" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "메시지 분류:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "가져오기 추가" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "선택된 것을 재시도" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "선택된 것을 삭제" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "사건 종류" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "서버 혹은 Kad에 연결" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "새로운 분류" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "저장할 폴더를 선택" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "분류 이름을 정하세요." + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "분류 경로를 정하세요" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "분류를 저장할 폴더를 생성하지 못했습니다. 유효한 경로를 지정하세요." + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "알수없는 확장 '%s' ('%s'명령에 대해)\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "알수없는 명령 '%s' \n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"이 명령은 인수를 가질 수 없습니다.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"이 명령은 반드시 인수가 있어야 합니다.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"이 명령은 불완전합니다. 반드시 아래의 확장중 하나를 사용해야 합니다.\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"가능한 확장:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "가능한 명령:\n" + +#: src/ExternalConnector.cpp:188 +#, fuzzy, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"모든 명령은 대소문자를 구분하지 않습니다.\n" +"<명령어>에 대한 자세한 정보를 얻으려면 'help <명령어>'를 입력하세요.\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "응용프로그램에서 나감." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "도움말을 보여줍니다." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"명령어에 대한 도움말은, 'help <명령어>'를 입력하세요.\n" +"모든 명령어 목록을 보려면, 'help'를 입력하세요.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"명령 목록을 위해 %s를 사용합니다.\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "문법 오류!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "명령 처리에 오류 발생 - 일어나면 안 됩니다! 버그 리포트를 하세요\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "이 명령은 어떤 변수도 필요하지 않습니다." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "이 명령은 반드시 변수가 있어야 합니다." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "유효하지 않은 인수입니다." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "불완전한 명령입니다." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "더 많은 도움말을 위해서는 '%s'를 입력하세요.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "이것은 %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "이것은 %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"클라이언트 생성중...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "연결 실패. 특정 호스트에 연결할 수 없습니다\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"좋아, 나가는중 %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"빈 암호로 연결할수 없습니다.\n" +"설정 파일에 암호를 정하거나 \n" +"또는 명령줄이나 요청시에 입력해야 합니다.\n" +"\n" +"종료중...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "이 도움말을 보여줍니다." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "어뮬이 실행중인 호스트. (기본: localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "외부연결을 위한 어뮬 포트. (기본: 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "외부연결 암호" + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "파일로부터 환경설정을 읽습니다." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "표준출력으로는 어떤 출력도 하지 않습니다." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "상세하게 - 디버그 메시지도 보여줍니다." + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "프로그램 지역정보 (로케일, 언어)를 설정합니다." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "명령줄 설정을 환경설정 파일에 기록합니다." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "어뮬의 설정 파일에 기초하여 설정 파일을 생성합니다." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "프로그램 버전을 출력합니다." + +#: src/ClientCreditsList.cpp:168 +#, fuzzy, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "신용 파일을 읽었습니다. %u 클라이언트가 인식되었습니다." +msgstr[1] "신용 파일을 읽었습니다. %u 클라이언트가 인식되었습니다." + +#: src/ClientCreditsList.cpp:171 +#, fuzzy, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] "%u 클라이언트에 대한 신용이 만료되었습니다." +msgstr[1] "%u 클라이언트에 대한 신용이 만료되었습니다." + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "'cryptkey.dat' 파일을 찾을 수 없습니다. 생성합니다." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"오류: 외부연결이 비활성화일때 어뮬 데몬은 사용할 수 없습니다. 외부연결을 활성" +"화하기 위해서는 --ec-config를 사용하여 시작하거나 ~/.aMule/amule.conf 파일내" +"에 \"AcceptExternalConnections\" 키를 1로 설정하여야 합니다." + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "오류: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "폐기" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "올려주기 보기" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "대기열 보기" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "클라이언트 보기" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "보기 선택" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "클라이언트 소프트웨어" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "대기됨" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "올려주기 시간" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "올려주기/내려받기" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "원격 상태" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "QR: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "파일 우선권" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "점수" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "요청됨" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "마지막으로 보임" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "입력된 대기열" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "올려주기 상태" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "위로 이양하기" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "내려받기 상태" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "아래로 이양하기" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "사용자 해시" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "암호화됨" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "공유된 파일을 숨김" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "클라이언트 세부내역" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "지원하지 않음" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "완료되지 않음" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "나쁜 사람" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "인증됨" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "불가능" + +#: src/ClientDetailDialog.cpp:190 +#, fuzzy, c-format +msgid "%u (QR: %u)" +msgstr "QR: %u" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "최소 크기가 최대 크기보다 작아야 합니다. 최대 크기는 무시됩니다.." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "검색 경고" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "무제한" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "어뮬 트레이 메뉴" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "속도 제한:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "올려주기: 없음" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "올려주기: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "내려받기: 없음" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "내려받기: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "내려받기 속도: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "올려주기 속도: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "클라이언트 정보" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "별명: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "별명이 선택되지 않음!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "클라이언트 아이디: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "서버 이름: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "서버 IP: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "TCP 포트: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "TCP 포트: 준비되지 않음" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "UDP 포트: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "UDP 포트: 준비되지 않음" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "온라인 서명: 활성화" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "온라인 서명: 비활성화" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "공유된 파일: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "대기열에 있는 클라이언트: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "전체 내려받기: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "전체 올려주기: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "올려주기 제한" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "내려받기 제한" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "어뮬 숨기기" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "어뮬 보이기" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "채팅세션이 시작됨: %s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "***클라이언트에 연결되었습니다***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "***클라이언트에 연결중입니다***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "***클라이언트에 연결하지 못했습니다 / 연결이 끊어졌습니다***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "탭 닫기" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "모든 탭 닫기" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "다른 탭 닫기" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "server.met 파일을 읽음: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "server.met 파일을 찾을 수 없습니다.!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "server.met 파일 '%s' 을 읽지 못했습니다. 알 수 없는 형식입니다." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "server.met 파일을 열지 못했습니다!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"Server.met 파일이 손상됨, 유효하지 않는 버젼정보를 발견함: 0x%x, size %i" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "server.met에서 %i개의 서버가 발견됨" +msgstr[1] "server.met에서 %i개의 서버가 발견됨" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d 서버가 추가됨" +msgstr[1] "%d 서버가 추가됨" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "서버 추가되지 않음: [%s:%d]은 유효한 포트가 정해지지 않았습니다." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "서버 추가되지 않음: [%s:%d]의 IP가 유효하지 않거나 차단되었습니다." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "서버 추가되지 않음: IP:포트[%s:%d]와 같은 서버가 목록에 있습니다." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "서버 추가됨: [%s:%d]서버 '%s'이름을 사용" + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "삭제하려고하는 서버에 접속되어있습니다. 부디 먼저 연결을 끊으세요." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "server.met을 저장하지 못함!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "유효하지 않는 주소입니다." + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "%s로부터 서버 목록를 내려받지 못함" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"'addresses.dat'에 서버 목록 주소 항목이 없습니다. 서버 목록을 자동갱신하려면 " +"유효한 서버 목록 주소를 이 파일에 붙여넣어 주세요." + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "경고, 서버의 자동 갱신을 위한 URL이 유효하지 않음: %s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "adrresses.dat에 유효한 server.met 자동갱신 주소가 없습니다." + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "지역 서버가 IPFilter에 의해 차단되어, 다른 서버로 재연결 합니다." + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "`%s' 명령을 실행하는데 실패했습니다. (`%s' 사건에대해)" + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"지역정보(로케일)가 설정 변경으로 인해 시스템 기본값으로 변경되었습니다. 죄송" +"합니다." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"서버 목록에 서버가 없습니다.\n" +"새로운 서버목록을 내려 받으시겠습니까?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "서버 목록 내려받기" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "웝서버가 PID %d로 작동중" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"시작과 동시에 웹서버 구동을 요청했으나, amuleweb 파일을 실행할 수 없습니다. " +"어뮬 웹서버를 포함한 꾸러미를 설치하거나 , --enable-webserver 옵션 이용하여 " +"어뮬을 컴파일 후 make install을 실행하세요." + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "포트 %u는 사용할 수 없습니다. 낮은아이디를 가질것입니다.\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"포트 %u는 사용할수 없습니다!\n" +"\n" +"이것은 낮은아이디를 가질것이라는걸 의미합니다.\n" +"\n" +"나가고 들어오는것에 대해 포트가 열려있는지 통신망을 체크하세요. " + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "온라인서명 파일을 생성하지 못함" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "어뮬 온라인서명 파일을 생성하지 못함" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"컴퓨터에 선택한 지역정보(로케일)가 설치 않된것 같습니다. (주의: 어쨌든 설정하" +"겠습니다)" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "이번에 어뮬 %s를 처음 실행했습니다." + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "이 버전은 테스트 버젼으로, 매일 업데이트되며, \n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "이 프로그램이 어느 것도 부수지 않는다고, 집을 태우지 않는다고, 혹은 \n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" +"개를 죽이지 않는다고 보장하지 않습니다. 그렇지만 안전하게 사용할 수 있을 것입" +"니다.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "다음 선택사항은 보안문제로 인해 이번 배포판에서 변경되었습니다:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* 들어오고 나가는 연결에 프로토콜 난독화가 지원됐습니다.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* 다른 서버와 클라이언트로부터 서버목록의 갱신이 불가능합니다.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"이 변경에 대한 더 많은 정보는 어뮬 위키(http://wiki.amule.org)의\n" +"\"가짜서버(fake servers)\"에서 찾으십시요.\n" +"어뮬이 잘 실행되기 위해서는 서버목록에서 가짜서버를 제거하는것이 중요합니다." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"더 많은 정보, 지원, 새 릴리즈는 홈페이지 www.amule.org, 또는 IRC 채널\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "(irc.freenode.net의 #aMule)에서 찾을 수 있습니다.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "버그는 http://forum.amule.org로 보고해 주십시오." + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"지정한 온라인 서명 파일을 위한 폴더가 유효하지 않습니다.\n" +" 온라인 서명은 환경설정에서 수정될 때까지 비활성화 됩니다." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "오류: 로그파일을 열 수 없음" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "경고: 로그파일이 비어있습니다. 뭔가 잘못되어 있습니다." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "로그가 초기화되었습니다." + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "서버메시지: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "노드 목록을 내려받지 못했습니다." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "내려받은 버젼 검사 파일을 열지 못했습니다." + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "손상된 버젼 검사 파일" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "오래된 어뮬 버젼을 사용하고 있습니다!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "어뮬 버젼은 %i.%i.%i이며 최신 버젼은 %li.%li.%li입니다." + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "최신 버젼은 항상 http://www.amule.org 에서 찾을 수 있습니다." + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "경고: 어뮬 버젼은 오래되었습니다: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "어뮬은 최신 버전입니다." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "버젼 검사 파일을 내려받지 못했습니다." + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "%s %s에 연결되었음" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "%s에 연결중" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "ED2k로부터 연결이 끊김" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad를 시작했습니다." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad를 멈췄습니다." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Kad에 연결됨 (양호)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Kad에 연결됨 (방화벽)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Kad로부터 연결이 끊김" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"Kad 네트워크는 UDP 포트가 비활성될 시 사용할 수 없으며, 따라서 시작하지 않습" +"니다." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Kad 네트워크가 환경설정에서 비활성되어, 연결하지 않습니다." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "'emfriends.met'파일을 읽기 위해 열지 못했습니다." + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "'emfriends.met'파일을 기록하기 위해 열지 못했습니다." + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "원격 GUI에서 특정 IP를 초기적재할 수 없습니다." + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "아직 원격 GUI로부터 server.met를 갱신할수 없습니다." + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "%u개의 Kad 접속을 읽었음" +#~ msgstr[1] "%u개의 Kad 접속을 읽었음" + +#~ msgid "Disconnect from " +#~ msgstr "다음으로부터 연결이 끊김 " + +#~ msgid "current server" +#~ msgstr "현재 서버" + +#~ msgid " and " +#~ msgstr "와 " + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "서버 또는 Kad 접속이 끊겼습니다." + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "TCP Flags" +#~ msgstr "TCP 플래그" + +#~ msgid "UDP Flags" +#~ msgstr "UDP 플래그" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "ED2k 링크를 클립보드에 복사" + +#~ msgid "Client requests %u" +#~ msgstr "클라이언트가 %u를 요청합니다." + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "파일 블럭 %u-%u (%d 바이트):" + +#~ msgid "Client request is invalid!" +#~ msgstr "클라이언트 요청이 유효하지 않습니다." + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "클라이언트 요청이 유효하지 않습니다. %i / %i" + +#~ msgid "Command: %s" +#~ msgstr "명령: %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "%s파일을 열수 없습니다. - %s 파일을 사용합니다." + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "경고: known.met이 없습니다." + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles: 공유폴더 목록에서 %s를 제거합니다: 폴더" +#~ "를 찾을수 없습니다." + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "부 프로세스 종료 대기에 실패" + +#~ msgid "" +#~ "You cannot connect to a release version from an arbitrary CVS version! " +#~ "*sigh* possible crash prevented" +#~ msgstr "" +#~ "비정식 CVS 버젼으로부터 릴리즈된 버젼에 연결할수없습니다! *휴우* 있을 수 " +#~ "있었던 충돌을 막았습니다." + +#~ msgid "doesn't work" +#~ msgstr "작동하지 않습니다." + +#~ msgid "remote gui" +#~ msgstr "원격 gui" + +#~ msgid "" +#~ "Error: Failed to load backup file. Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "오류: 백업파일을 읽지 못했습니다. .part.met 복구 방법을 http://forum." +#~ "amule.org에서 검색하세요." + +#~ msgid "" +#~ "Error: Backup part.met file is 0 size! Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "오류: 백업 part.met파일은 크기가 0입니다. .part.met회복 방법을 위해 " +#~ "http://forum.amule.org에서 검색하세요." + +#~ msgid "Error: part.met backup file is 0 size: %s ==> %s" +#~ msgstr "오류: part.met 백업파일은 크기가 0입니다: %s ==> %s" + +#~ msgid "" +#~ "Note: These values are\n" +#~ " only used for statistics." +#~ msgstr "" +#~ "알림: 이 값은 오직\n" +#~ " 통계 목적으로 사용함." + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ " 'All-Platform' 이뮬기반 p2p 클라이언트 \n" +#~ "\n" +#~ " 웹사이트: http://www.amule.org \n" +#~ " 게시판: http://forum.amule.org \n" +#~ " 자주하는 질문: http://wiki.amule.org \n" +#~ "\n" +#~ " 연락: admin@amule.org (관리상의 문제) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " 어뮬의 일부분은 카뎀리아기반입니다. \n" +#~ " 카뎀리아: XOR 측정 기반으로 개개인을 연결합니다..\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "경고: 낮은아이디를 받았습니다." + +#~ msgid "This command requieres an argument. Valid arguments: a file hash.\n" +#~ msgstr "이 명령은 인수를 필요로 합니다. 올바른 인수들: 파일 해시.\n" + +#~ msgid "Deprecated command, now 'Status'." +#~ msgstr "권장되지 않는 명령어, 지금 'Status'를 쓰세요." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Status' instead.\n" +#~ msgstr "" +#~ "권장되지 않는 명령어이고, 조만간 제거될것입니다.\n" +#~ "대신에 'Status'를 사용하세요.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter'." +#~ msgstr "권장되지 않는 명령어, 지금 'Set IPFilter'를 쓰세요." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter' instead.\n" +#~ msgstr "" +#~ "권장되지 않는 명령어이고, 조만간 제거될것입니다.\n" +#~ "대신에 'Set IPFilter'를 사용하세요.\n" + +#~ msgid "Deprecated command, now 'Get IPFilter Level'." +#~ msgstr "권장되지 않는 명령어, 지금 'Get IPFilter Level'을 쓰세요." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get IPFilter Level' instead.\n" +#~ msgstr "" +#~ "권장되지 않는 명령어이고, 조만만 제거될것입니다.\n" +#~ "대신에 'Get IPFilter Level'을 사용하세요.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter Level'." +#~ msgstr "권장되지 않는 명령어, 지금 'Set IPFilter Level'을 쓰세요." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "권장되지 않는 명령어이고, 조만만 제거될것입니다.\n" +#~ "대신에 'Set IPFilter Level'을 사용하세요.\n" + +#~ msgid "Deprecated command, now 'Get/Set IPFilter Level'." +#~ msgstr "권장되지 않는 명령어, 지금 'Get/Set IPFilter Level'을 쓰세요." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get/Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "권장되지 않는 명령어이고, 조만만 제거될것입니다.\n" +#~ "대신에 'Get/Set IPFilter Level'을 사용하세요.\n" + +#~ msgid "Deprecated command, now 'Show Servers'." +#~ msgstr "권장되지 않는 명령어, 지금 'Show Severs'를 쓰세요." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Show Servers' instead.\n" +#~ msgstr "" +#~ "권장되지 않는 명령어이고, 조만만 제거될것입니다.\n" +#~ "대신에 'Show Servers'를 사용하세요.\n" + +#~ msgid "Deprecated command, now 'Get BwLimits'." +#~ msgstr "권장되지 않는 명령어, 지금 'Get BwLimits'를 쓰세요." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get BwLimits' instead.\n" +#~ msgstr "" +#~ "권장되지 않는 명령어이고, 조만만 제거될것입니다.\n" +#~ "대신에 'Get BwLimits'를 사용하세요.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Up'." +#~ msgstr "권장되지 않는 명령어, 지금 'Set BwLimit Up'을 쓰세요." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Up' instead.\n" +#~ msgstr "" +#~ "권장되지 않는 명령어이고, 조만만 제거될것입니다.\n" +#~ "대신에 'Set BwLimit Up'을 사용하세요.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Down'." +#~ msgstr "권장되지 않는 명령어, 지금 'Set BwLimit Down'을 쓰세요." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Down' instead.\n" +#~ msgstr "" +#~ "권장되지 않는 명령어이고, 조만만 제거될것입니다.\n" +#~ "대신에 'Set BwLimit Down'을 사용하세요.\n" + +#~ msgid "Syncronization thread started." +#~ msgstr "동기화 스레드가 시작되었습니다." + +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "알려진 파일의 마스터 해시를 읽었습니다." + +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "Kad 접속을 읽는동안 오류가생겼습니다. - 0 참가자" + +#~ msgid "Merge attempt" +#~ msgstr "병합 시도" + +#~ msgid "Recursive merge" +#~ msgstr "재귀적 병합" + +#~ msgid "Sucessful merge!" +#~ msgstr "병합 성공!" + +#~ msgid "No merge possible" +#~ msgstr "병합 가능한 것이 없음" + +#~ msgid "Buddy address: " +#~ msgstr "친구 주소:" + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid " %d" +#~ msgstr " %d" + +#~ msgid ".%d" +#~ msgstr ".%d" + +#~ msgid "Shows the process of a search." +#~ msgstr "검색의 진행을 보여줍니다." + +#~ msgid "Shows the process of a search..\n" +#~ msgstr "검색의 결과를 보여줍니다..\n" + +#~ msgid "Search warning." +#~ msgstr "검색 경고." + +#~ msgid "Client Identification:" +#~ msgstr "클라인트 확인:" + +#~ msgid "Use Secure Identification" +#~ msgstr "안전한 확인을 사용" + +#~ msgid "" +#~ "Secure Identification uses a handshake approch to safely identify clients " +#~ "for use with the credit system." +#~ msgstr "" +#~ "안전한 확인은 신용시스템을 사용함에 있어서 클라이언트를 안전하게 확인하기 " +#~ "위해 핸드쉐이크 접근을 사용합니다." + +#~ msgid "Sources Dropping" +#~ msgstr "자료 버림" + +#~ msgid "Source Dropping" +#~ msgstr "자료 버리기" + +#~ msgid "Keep sources" +#~ msgstr "자료 유지" + +#~ msgid "Drop sources" +#~ msgstr "자료 버림" + +#~ msgid "Send sources to any other file before dropping (High CPU)" +#~ msgstr "버리기 전에 다른 파일로 자료를 보냄 (높은 CPU)" + +#~ msgid "Sources with no needed file-parts." +#~ msgstr "필요없는 파일부분을 가진 자료" + +#~ msgid "Full Queue Sources Handling" +#~ msgstr "가득찬 대기열 자료 처리" + +#~ msgid "Enable auto drop Full Queue Sources" +#~ msgstr "가득찬 대기열 자료 자동 버림을 활성화" + +#~ msgid "High Queue Rating Sources Handling" +#~ msgstr "높은 대기열율 자료 처리" + +#~ msgid "Enable auto drop High Queue Rating Sources" +#~ msgstr "높은 대기열율 자료 자동 버림을 활성화" + +#~ msgid "High Queue Rating value" +#~ msgstr "높은 대기열율 값" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(최소 300 / 최대 3000)" + +#~ msgid "Auto Drop Sources Timer" +#~ msgstr "자동 자료버림 타이머" + +#~ msgid "Timer (in secs)" +#~ msgstr "타이머 (초)" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(최소 60 / 3600 최대)" + +#~ msgid "Drop No Needed Sources now" +#~ msgstr "불필요한 자료를 버림" + +#~ msgid "Drop Full Queue Sources now" +#~ msgstr "가득찬 대기열 자료를 버림" + +#~ msgid "Drop High Queue Rating Sources now" +#~ msgstr "대기열 사용이 많은 자료를 버림" + +#~ msgid "Clean Up Sources now (NNS, FQS && HQRS)" +#~ msgstr "자료를 정리 (NNS, FQS && HQRS)" + +#~ msgid "English (U.S.)" +#~ msgstr "영어(미국)" + +#~ msgid "Spanish (Mexican)" +#~ msgstr "스페인어(멕시코)" diff --git a/po/l10n.xsl b/po/l10n.xsl new file mode 100644 index 00000000..685b78ab --- /dev/null +++ b/po/l10n.xsl @@ -0,0 +1,70 @@ + + + + + + <xsl:value-of select='@name'/> translation statistics + + + + + +

aMule translation statistics

+ Statistics generated

+ + + + + + + + ~ + ~ + + + + + + + + + + + + + +
Language TranslatedFuzzyUntranslatedWarningsProgress
.po ()| ~ %| | %| | %| | + .po.warnings + | + + + + + + + + + + + +
px;px;
+
+
+
generated on + + + + + diff --git a/po/lt.po b/po/lt.po new file mode 100644 index 00000000..e0492824 --- /dev/null +++ b/po/lt.po @@ -0,0 +1,7478 @@ +# translation of lt.new.po to Lithuanian +# Dovydas Sankauskas , 2006, 2007. +# Dovydas Sankauskas , 2006. +# Copyright (C) 2006, 2007 Free Software Foundation, Inc. +# This file is distributed under the same license as the PACKAGE package. +msgid "" +msgstr "" +"Project-Id-Version: lt.new\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2007-09-01 16:53+0100\n" +"Last-Translator: Dovydas Sankauskas \n" +"Language-Team: Lithuanian \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%" +"100<10 || n%100>=20) ? 1 : 2);\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Turite įrašyti netuščią slaptažodį." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Klaidingas slaptažodis, ne MD5 maiša!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Ryšio klaida" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "Nepavyko užmegzti ryšio seanso. Gautas tuščias atsakymas." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "Ryšio seansas: prieiga nesuteikta dėl: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "Ryšio seansas: prieiga nesuteikta" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "" +"Ryšio seansas: iš serverio gautas klaidingas atsakymas. Ryšys nutrauktas." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Pavyko! Užmegztas ryšys su aMule " + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Pavyko! Ryšys užmegztas." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Vykdoma maiša" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Patvirtinama" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Baigta" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Pristabdyta" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Klaidinga" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Atsiunčiama" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Laukiama" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Pradedamos kurti MD4 ir klaidų taisymo maišos failui: %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Pradedama kurti MD4 maišos failui: %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Pradedama kurti klaidų taisymo maiša failui: %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "Senos klaidų taisymo maišos keičiamos „%s“ keičiamos 64b „%s“." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" +"Dėmesio: failo pavadinimas %s yra klaidingas, todėl buvo pakeistas į %s." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "Dėmesio: failas %s jau yra, naujas failas pervadintas į %s." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "Dėmesio: sukūrus atsarginę kopiją nepavyko pašalinti pradinio failo %s" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "Dėmesio: nepavyko pašalinti %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Nepavyko gauti dalinamų failų iš vartotojo „%s“" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Nežinoma" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (neteisinga eMule versija %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (neteisinga eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (neteisinga eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (paremta eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Slapyvardis: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "Paprašė:" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Šio seanso failų statistika: priimta %d iš %d prašymų, %s persiųsta\n" +msgstr[1] "" +"Šio seanso failų statistika: priimta %d iš %d prašymų, %s persiųsta\n" +msgstr[2] "" +"Šio seanso failų statistika: priimta %d iš %d prašymų, %s persiųsta\n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Visų seansų failų statistika: priimta %d iš %d prašymų, %s persiųsta\n" +msgstr[1] "" +"Visų seansų failų statistika: priimta %d iš %d prašymų, %s persiųsta\n" +msgstr[2] "" +"Visų seansų failų statistika: priimta %d iš %d prašymų, %s persiųsta\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Paprašė nežinomo failo" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "Naudotojas %s IP:prievadas %s:%d naudoja %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Vardas" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Draugai" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Rodyti &išsamiau" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Įdėti draugą" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Pašalinti draugą" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Siųsti &žinutę" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Peržiūrėti failus" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Sukurti siuntimo kanalą draugui" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Ar tikrai pašalinti pažymėtus draugus?" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Ar tikrai pašalinti pažymėtus draugus?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Atšaukti" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"Neleidžiama sukurti daugiau nei vieną siuntimo kanalą draugui.\n" +"Buvo sukurtas tik vienas kanalas." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Pažymėta keletas" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Failo pavadinimas" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Dydis" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Tipas" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Prioritetas" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "Failo ID" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Prašymai" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Patenkinti prašymai" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Persiųsta duomenų" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Dalinimo santykis" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Gautos dalys" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Pilni šaltiniai" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Kelias" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Dalinami failai" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Labai žemas" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Žemas" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normalus" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Aukštas" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Labai aukštas" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Leidinys" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Automatiškas" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Įdėti komentarą/įvertinimą" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Keisti komentarą/įvertinimą" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Pervadinti" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Failus iš kolekcijos įkelti į siuntimo sąrašą" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Kopijuoti magneto &URI į talpyklę" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Kopijuoti ED2K &nuorodą į talpyklę" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Kopijuoti ED2K nuorodą į talpyklę (&šaltinį)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "" +"Kopijuoti ED2K nuorodą į talpyklę (šaltinį) (su ši&fravimo parinktimis)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Kopijuoti ED2K nuorodą į talpyklę (&mazgo pavadinimą)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" +"Kopijuoti ED2K nuorodą į talpyklę (mazgo pavadinimą) (su šif&ravimo " +"parinktimis)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Kopijuoti ED2K nuorodą į talpyklę (&klaidų taisymo info)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Kopijuoti aprašymą į talpyklę" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "Norėdami sukurti šaltinio nuorodą, privalote turėti aukštą ID" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Dėmesio" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Dalinami failai (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[Dalių failas]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Įrašykite naują failo pavadinimą:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Pervadinti failą" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Tęsiame failos siuntimą: %s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Nutraukiamas failo siuntimas: %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: ieškomas žodis pernelyg trumpas" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Klaida: nepavyko klausytis TCP prievado." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "Vykdant užduotį įvyko klaida: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "Vykdant užduotį įvyko nežinoma klaida." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "Indekso failas nerastas: " + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Nepavyko sukurti www lizdo gijos\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "www serveris: paleistas\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Seansas baigėsi – prašoma prisijungti iš naujo\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Seansas pradėtas, priega gauta\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Seansas pradėtas, priega negauta\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Seansas nepradėtas – bus prašoma prisijungti\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Seansas sukurtas – prašoma prisijungti\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Apdorojamas prašymas [pradinis]: " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Tikrinamas slaptažodis\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Slaptažodžio maišos funkcija neteisinga\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Slaptažodis priimtas\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Neteisingas slaptažodis\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "Neįrašėte slaptažodžio. Tuščias slaptažodis neleidžiamas.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Prašoma atsijungti\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Apdorojamas prašymas [persiųstas]: " + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Įkelti šabloną " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "www serverio HTTP prievadas" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Naudoti UPnP prievadų perdavimo interneto serverio prievadą" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "UPnP prievadas" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Naudoti gzip pakavimą" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Pilnos prieigos prie www serverio slaptažodis" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Svečio prieigos prie www serverio slaptažodis" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Įjungti svečio prieigą" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Išjungti svečio prieigą" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "Įkelti/įrašyti www serverio parinktis iš/į nutolusio aMule" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "aMule parinkčių failas. NENAUDOKITE TIESIOGIAI!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "Išjungti PHP interpretatorių (pasenusi)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Kiekvieną kartą perkompiliuoti PHP puslapius" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "aMule www serveris" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Nėra" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Niekada" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Atsiunčiama..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Parinktys" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "amulesig.dat failo aplankas" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Naršyti" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Įrašykite aplanką, kuriame yra amulesig.dat failas" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Atnaujinimo intervalas sekudėmis" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Kurti statistikos grafiką po kiekvieno atnaujinimo" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "Įrašykite aplanką, kuriame bus kuriamas statistikos grafikas" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Periodiškai siųsti staitikos grafiką į FTP serverį" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "FTP URL" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "FTP kelias" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Įrašykite FTP serverio adresą" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "Įrašykite FTP serverio aplanką, į kurį kelsite statistikos grafiką" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Vartotojas" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Slaptažodis" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Įrašykite vartotoją, kuriuo jungsitės prie FTP serverio" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Įrašykite vartotojo, kuriuo jungsitės prie FTP serverio, slaptažodį" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "FTP atnaujinimo intervalas minutėmis" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Patvirtinti" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Aplankas, kuriame yra parašo failas" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Aplankas, kuriame kuriamas statistikos grafikas" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i d. %i val. %i min. %i s" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, aMule dabartinė statistika" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Sveikiname!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Didžiausia ats. sparta nuo wxCas paleidimo" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "Pati didžiausia ats. sparta per praeitus wxCas seasus" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Perkrauti" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "Sistema" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Sustabdyti automatinį atnaujinimą" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Įrašyti dabartinės statistikos grafiką" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Spausdinti dabartinės statistikos grafiką" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Parinktys" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "Apie wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Paleisti automatinį atnaujinimą" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Automatinis atnaujinimas sustabdytas" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Automatinis atnaujinimas paleistas" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Įrašyti statistikos grafiką" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Šiam failų tipui nėra paskirtos programos." + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "Failas nebuvo įrašytas" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "aMule dabartinė statistika" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Spausdinant įvyko klaida.\n" +"Gali būti, kad spausdintuvas nėra tinkamai suderintas." + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Spausdinama" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, keičiamo aMule parašo statistika\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Paremta Pedro de Oliveira CAS \n" +"\n" +"Platinama pagal GPL licenciją" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Oi! aMule nepaleista..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule paleista" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule paleista, bet ryšys neužmegztas" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule užmezga ryšį..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Oi! aMule būsena nežinoma..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " vykdoma " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " sustabdyta!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " ryšys neužmegztas!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " užmezga ryšį..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " elgiasi keistai, prašome patikrinti!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " užmezgė ryši su " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "gerai" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "ugniasienė" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "išj." + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " įj." + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +#, fuzzy +msgid " with " +msgstr "] su " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Išviso atsiųsta: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Išsiųsta: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Atsiųsta per šį seansą: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Atsiųsta: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s, Išsiųsta: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Dalinamasi: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " failas(ai), naudotojai eilėje: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Trukmė: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " – " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Vidutinis sistemos apkrovimas (per 1–5–15 min.): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Sistemos veikimo trukmė: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02ud %02uv %02um %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uv %02um %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02um %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "Aukštas ID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "Žemas ID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Neprisijungta" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "Atšaukta!" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Nepavyko atverti %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "failas %s yra per didelis, maksimalus failo dydis yra 4 GB." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Įvesties parametrai" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Pateikti failo maišos funkciją" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Šiam failui įdėti papildomus URL" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Įrašykite failą, kurio ED2K nuorodą norite apskaičiuoti" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Įrašykite URL, kurį norite įdėti į ED2K nuorodą: pridėkite gale „/“, kad " +"aLinkCreator papildytų dabartinį failo pavadinimą" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Įdėti" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Pašalinti" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Išvalyti" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Kurti nuorodas su dalių maišos f-jomis" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "Nauji ir reti failai bus platinamos sparčiau, bet nuoroda taps ilgesnė" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "Failo MD4 maiša" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "Failo ED2K maiša" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "ED2K nuoroda" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Pradėti" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Įrašyti" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Kopijuoti į talpyklę" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Baigti" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Atverti failą ir apskaičiuoti jo ED2K nuorodą" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Kopijuoti apskaičiuotą ED2K nuorodą į talpyklę" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Įrašyti apskaičiuotą ED2K nuorodą į failą" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "Apie aLinkCreator" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Nurodykite failą, kurio ED2K nuorodą pageidaujate apskaičiuoti" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "Kol kas nėra ką kopijuoti!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Nurodykite failą apskaičiuotai ED2K nuorodai" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Nepavyko atverti" + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Įrašykite failo pavadinimą" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "Kol kas nėra ką įrašyti!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, aMule ED2K nuorodų kūrimo įrankis\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Išvaizda iš http://www.everaldo.com, http://www.icomania.com\n" +"ir http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Platinama pagal GPL" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Skaičiuojamos maišos funkcijos..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Atlikta per %.2f s" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "Šis URL jau įdėtas!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Įrašykite URL" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "Apdorojamo failo numeris %u: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "" +"Pageidavote dalinių maišos rezultatų (naudojamų tik didesniems nei 9,5 MB " +"failams)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Prašome palaukti... " + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s —> tokio failo nėra!\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, aMule ED2K nuorodų kūrimo įrankis" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Automatiškai (žemas)" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Automatiškai (normalus)" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Automatiškai (aukštas)" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Jungiamasi" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Klausiama" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Jungiamasi per serverį" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Eilė pilna" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "Eilėje" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Siunčiama" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Laukiama maišos f-jos" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Nėra reikalingų dalių" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Žemam ID nepavyks prisijungti prie kito žemo ID" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Per daug užmegztų ryšių" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Jungiamasi per Kademlia" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Perdaug Kademlia ryšių" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Užblokuota" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Ryšio klaida" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Nutolusi eilė pilna" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "Senasis MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "Naujasis MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "Suderinamas su eMule" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Vietinis serveris" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Nutolęs serveris" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kademlia" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Keičiamasi šaltiniais" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Neveiklus" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Nuoroda" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Pilni šaltiniai" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Numatyta" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Arabic" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Basque" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Bulgarian" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Catalan" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Chinese (Simplified)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Chinese (Traditional)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Croatian" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Danish" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Dutch" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "English (U.K.)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Estonian" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Finnish" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "French" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Galician" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "German" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Hungarian" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Italian" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Italian (Swiss)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Korean" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Polish" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portuguese" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Portuguese (Brazilian)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Russian" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Slovenian" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Spanish" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Turkish" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Nurodytos naršyklės rasti nepavyko!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" +"TCP prievadas negali būti didesnis nei 65532, nes serverio UDP prievadas yra " +"TCP+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Bus naudojamas numatytas prievadas (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Serverio pavadinimas" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Adresas" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Prievadas" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Aprašymas" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping trukmė" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Naudotojų skaičius" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Failai" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Nepavyko" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Statiškas" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Versija" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Prie serverio, kurį norite pašalinti, esate šiuo metu prisijungę. Norėdami " +"pašalinti serverį, iš pradžių turite atsijungti. Serveris kol kas " +"nepašalintas." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Informacija" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(pavadinimas nežinomas)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Ar tikrai norite pašalinti šį statišką serverį %s" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Taip" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Ne" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Nepavyko atverti %s" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Serveriai (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Serveris" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Prisijungti prie serverio" + +#: src/ServerListCtrl.cpp:428 +#, fuzzy +msgid "Mark server as static" +msgstr "Pažymėti, kad serveriai statiški" + +#: src/ServerListCtrl.cpp:429 +#, fuzzy +msgid "Mark server as non-static" +msgstr "Pažymėti, kad serveriai nestatiški" + +#: src/ServerListCtrl.cpp:431 +#, fuzzy +msgid "Mark servers as static" +msgstr "Pažymėti, kad serveriai statiški" + +#: src/ServerListCtrl.cpp:432 +#, fuzzy +msgid "Mark servers as non-static" +msgstr "Pažymėti, kad serveriai nestatiški" + +#: src/ServerListCtrl.cpp:438 +#, fuzzy +msgid "Remove server" +msgstr "Pašalinti serverius" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "Pašalinti serverius" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Pašalinti visus serverius" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Kopijuoti ED2K nuorodą į talpyklę" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "Kopijuoti ED2K nuorodą į talpyklę" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Prisijungti prie serverio iš naujo" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Ar tikrai norite pašalinti visus serverius?" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Ar tikrai norite pašalinti visus pažymėtus serverius?" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Ar tikrai norite pašalinti visus pažymėtus serverius?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Išjungta [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "aMule %s, sukurta eMule pagrindu." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "Vykdoma %s sistemoje" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" +"Aplankykite http://www.amule.org ir pasitikrinkite ar nėra naujesnės " +"versijos." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Kritinė klaida: nepavyko sukurti skaitliuko" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "aMule nuotolinio valdymo pultelis " + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Ekrano kopija:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr "" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr "" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Žinutė" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Būsenos tekstas" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "Jungiamasi" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "Neprisijungta" + +#: src/amuleDlg.cpp:676 +#, fuzzy +msgid "Kad: Firewalled" +msgstr "Už ugniasienės" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "Prisijungta" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "Jungiamasi" + +#: src/amuleDlg.cpp:689 +#, fuzzy +msgid "Kad: Off" +msgstr " Kad: " + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "Nutraukti bandymus prisijungti" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Atsijungti" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "Atsijungti nuo tinklo." + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Prisijungti" + +#: src/amuleDlg.cpp:726 +#, fuzzy +msgid "Connect to the currently enabled networks" +msgstr "Prisijungti prie tinklo." + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Išs.: %.1f(%.1f) | Ats.: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Išs.: %.1f | Ats.: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | prisijungta)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | neprisijungta)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Ar tikrai norite baigti darbą su aMule?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Baigimo patvirtinimas" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Nepavyko suprasti naršyklės paleidimo komandos." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "Išvaizdos failų aplankas %s neegzistuoja" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "Dėmesio: nepavyko atverti išvaizdos failo %s skaitymui" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Tinklas" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Tinklo langas" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Paieška" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Paieškos langas" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Siuntimas" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Failų siuntimo langas" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Dalinamų failų langas" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Žinutės" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Žinučių langas" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Statistika" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Statistikos grafikų langas" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Parinkčių langas" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Įkelti" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "Dalinai atsiųstų failų įkėlimo langas" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "Apie" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "Apie/pagalba" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Bendra" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Kanalas" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Atstovaujantis serveris" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Žinučių filtras" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Nutolęs valdymas" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Keičiamas parašas" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Aplankai" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Saugumas" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "Išvaizdos parametrai" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Programos branduolio parinktys" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Įvykiai" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Taisymas" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Nurodyta naudotojo" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"Kad įsigaliotų šie pakeitimai, aMule reikia paleisti iš naujo:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "– pakeistas TCP prievadas.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "– pakeistas UDP prievadas.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"Automatiškai atnaujinamų serverių sąrašas tuščias.\n" +"Parinktis „automatiškai atnaujinti serverių sąrąšą“ bus išjungta." + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"Įjungėte išorinius ryšius, bet parinktyse nenurodėte slaptažodžio.\n" +"Kol nenurodysite slaptažodžio, išoriniai ryšiai nebus įjungti." + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "– kalba pakeista.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "– laikinų failų aplankas pakeistas.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Išs.: 0.0 | Ats.: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"Tiek ED2K, tiek Kademlia tinklai išjungti.\n" +"Negalėsite prisijungti tol, kol neįjungsite bent vieno iš šių tinklų." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"Nepavyks prisijungti prie Kademlia tinklo, nes išjungtas UDP prievadas.\n" +"Arba įjunkite UDP prievadą, arba išjunkite Kademlia tinklą." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"Būtina paleisti aMule iš naujo.\n" +"Jei dabar pat neperleisite aMule, nesiskųskite jei kas nors bus ne taip.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "DĖMESIO" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"Automatiškai atnaujinamų serverių sąrašas tuščias.\n" +"Įrašykite bent vieną server.met failo URL.\n" +"Norėdami įrašyti URL, paspauskite mygtuką „Sąrašas“." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "Laikini failai" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Atsiunčiami failai" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Keičiami parašai" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Parinkite aplanką %s" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Rodyti wav failus" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "Failas wav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Parinkite video grotuvą" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Parinkite naršyklę" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Vykdomas failas %s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Keisti serverių sąrašą" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Įrašykite server.met failų URL.\n" +"Vieną URL vienoje eilutėje." + +#: src/PrefsUnifiedDlg.cpp:980 +#, fuzzy, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Atnaujinimo intervalas: %d s" +msgstr[1] "Atnaujinimo intervalas: %d s" +msgstr[2] "Atnaujinimo intervalas: %d s" + +#: src/PrefsUnifiedDlg.cpp:987 +#, fuzzy, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Vidurkių grafiko trukmė: %d min." +msgstr[1] "Vidurkių grafiko trukmė: %d min." +msgstr[2] "Vidurkių grafiko trukmė: %d min." + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Ryšių grafiko mastelis: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, fuzzy, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Atnaujinimo intervalas: %d s" +msgstr[1] "Atnaujinimo intervalas: %d s" +msgstr[2] "Atnaujinimo intervalas: %d s" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, fuzzy, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Failų buferio dydis: %d baitų" +msgstr[1] "Failų buferio dydis: %d baitų" +msgstr[2] "Failų buferio dydis: %d baitų" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, fuzzy, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Išsiuntimo eilės dydis: %d klientų" +msgstr[1] "Išsiuntimo eilės dydis: %d klientų" +msgstr[2] "Išsiuntimo eilės dydis: %d klientų" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, fuzzy, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Serverio ryšio atnaujinimo intervalas: %d min." +msgstr[1] "Serverio ryšio atnaujinimo intervalas: %d min." +msgstr[2] "Serverio ryšio atnaujinimo intervalas: %d min." + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Serverio ryšio atnaujinimo intervalas: išjungta" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Įvykus „%s“ įvykiui įvykdyti komandą" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Įjungti komandos vykdymą branduolyje" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Branduolio komanda:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Įjungti komandos vykdymą grafinėje aplinkoje" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "Grafinės aplinkos komanda:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "Šie kintamieji bus pakeisti:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Bandymas gauti prieigą. Prieiga nesuteikta, ryšys nutrauktas." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Išorinis ryšys nutrauktas." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "Išoriniai ryšiai atjungti, nes slaptažodis tuščias!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "Išoriniai ryšiai atjungti parinkčių faile" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Naujas išorinis ryšys priimtas" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "Klaida: nepavyko priimti naujo išorinio ryšio" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" +"Išorinis ryšys nepriimtas, nes parinktyse nurodytas tuščias slaptažodis!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "Jungiasi klientas: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Nežinoma versija" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"Klaidingos išorinių ryšių versijos, taip gali būti dėl skirtingų programų. " +"Programos branduolį ir nutolusią aplinką naudokite kompiliuotą iš tos pačios " +"pradinio kodo versijos." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "Atpažinimas nepavyko." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Neteisinga protokolo versija." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Trūksta protokolo versijos žymės." + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Klaidingas prašymas, iš pradžių turite būti atpažinti." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Prieiga suteikta." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" +"Nutolusio dalinio failo komanda nepavyko. Failo maišos funkcija nerasta: %s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "Failo maišos funkcija nerasta: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "Oi! OpCode vykdymo klaida!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Serveris neįdėtas" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "serveris nerastas: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "Nurodykite serverį, kurį pašalinti" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "ED2K išjungta parinktyse." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "Ieškoma. Tuoj bus gauti rezultatai!" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "www paieška iš nutolusios programos neturi prasmės." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kademlia išjungta parinktyse." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Grafikui nėra duomenų." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "Ši programa nesutvarkyta pateikti tiek detalių." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "Išoriniai ryšiai: prašoma baigti darbą" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Darbas jau baigiamas." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "Išoriniai ryšiai: įdedama nuoroda %s." + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Klaidinga nuoroda arba failas sąraše jau yra." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "Failas nerastas." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Klaidingas failo pavadinimas." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Nepavyko pervadinti failo." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Prie ED2K jau prisijungta." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Jungiamasi prie ED2K..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Prie Kademlia jau prisijungta." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Jungiamsi prie Kademlia..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Visi tinklai išjungti." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Atsijungta nuo ED2K." + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Atsijungta nuo Kademlia." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "Išoriniai ryšiai: gautas klaidingas opcode: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "Klaidingas opcode (bloga protokolo versija?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" +"Nepavyko atverti failo %s, jis bus pašalintas iš dalinamų failų sąrašo." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "Gautas nežinomo failo maišos funkcijos prašymas: %s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "" +"Komanda „%s“, kurios pid „%d“, baigė darbą pranešdama būsenos kodą „%d“." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "Serveris neįdėtas: nenurodytas IP adresas arba mazgo pavadinimas." + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "Serveris neįdėtas: nurodytas neteisingas serverio prievadas." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "ED2K būsena:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Prisijungta" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:prievadas" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Kademlia būsena:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Dirbama" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Būsena:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Neprisijungta" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Ryšio būklė:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Už ugniasienės" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "Gerai" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Ugniasienės rodiklis:" + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Prisijungta prie draugo" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "Nėra draugo" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Naudotojų vidurkis:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "Failų vidurkis:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "Nepaleista" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Seanso trukmė: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Siuntimas" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Išsiuntimai" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Išsiųsta duomenų (per seansą (iš viso)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Tarnybinis srautas iš viso (paketai): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Tarnybinis srautas failų prašymams (paketai): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "Tarnybinis srautas šaltinių apsikeitimui (paketai):%s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Tarnybinis srautas serveriams (paketai): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Kademlia tarnybinis srautas (paketai): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Aktyvūs išsiuntimai: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Laukiantys išsiuntimai: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Iš viso sėkmingų išsiuntimų: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Iš viso nepavykusių išsiuntimų: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Vidutiniškai išsiuntimas trunka: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Siuntimai" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Atsiųsta duomenų (per seansą (iš viso)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Rasta šaltinių: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Aktyvūs atsiuntimai (dalys): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Seanso Išs./Ats. santykis (iš viso): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Vidutinė atsiuntimo sparta (per seansą): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Vidutinė išsiuntimo sparta (per seansą): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Didžiausia atsiuntimo sparta (per seansą): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Didžiausia išsiuntimo sparta (per seansą): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Ryšis pakartotinai užmegztas: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Pirmą kartą siųsta prieš: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Prisijungta prie serverio prieš: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Aktyvių ryšių skaičius (apytikriai): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Didžiausias leistinas ryšių skaičius pasiektas: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Vidutinis ryšių skaičius (apytikriai): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Daugiausia ryšių (apytikriai): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Naudotojai" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Filtruota" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Iš viso: %i Atpažinta: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Serveriai" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Dirbantys serveriai: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Neveikiantys serveriai: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Iš viso: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Pašalinti serveriai: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Filtruoti serveriai: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Naudotojų dirbančiuose serveriuose kiekis: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "Failų kiekis dirbančiuose serveriuose: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Iš viso naudotojų: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "Iš viso failų: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Serverių užimtumas: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Dalinamų failų kiekis: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Bendras dalinamų failų dydis: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Dalinamų failų dydžio vidurkis: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "Žemas ID: %u (%.2f%% Iš viso %.2f%% žinoma)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "Saugus identifikavimas įj./išj.: %u (%.2f%%) : %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Operacinė sistema" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "Negauta" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Iškirpti" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Kopijuoti" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Įterpti" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Pažymėti viską" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "Kad paieška negalima jei nepaleista Kad tarnyba" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "ED2K paieška negalima jei ED2K tarnyba neprijungta" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Vykdant Kad paiešką įvyko netikėta klaida: " + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "Filtras sulaikė %s žinutę (IP %s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "Naują žinutę atsiuntė %s (IP %s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "Naudotojas %s (%u) paprašė dalinamų failų sąrašo –> suteikta" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "Naudotojas %s (%u) paprašė dalinamų failų sąrašo –> atmesta" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "Naudotojas %s (%u) paprašė dalinamų aplankų sąrašo –> suteikta" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "Naudotojas %s (%u) paprašė dalinamų aplankų sąrašo –> atmesta" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"Naudotojas %s (%u) paprašė dalinamų failų iš aplanko %s sąrašo –> suteikta" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"Naudotojas %s (%u) paprašė dalinamų failų iš aplanko %s sąrašo –> atmesta" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "Naudotojas %s (%u) dalinasi aplanku %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "Naudotojas %s (%u) atsiuntė neprašytus dalinamų failų aplankus" + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" +"Naudotojas %s (%u) atsiuntė neprašytą dalinamų failų sąrašą aplankui %s" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "Naudotojas %s (%u) baigė siųsti dalinamų failų sąrašą" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "Naudotojas %s (%u) atsiuntė neprašytą dalinamų failų sąrašą" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" +"Naudotojas %s (%u) nesuteikė prieigos prie dalinamų aplankų/failų sąrašo" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Mazgai (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Prašome užpildyti visus privalomus laukus" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Ar tikrai norite atsisiųsti naują nodes.dat failą?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" +"Atsiuntus naują node.dat failą bus pašalinti dabartiniai mazgai ir bus iš " +"naujo prisijungta prie Kademlia tinklo." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Tęsti?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Klaida:" + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Dėmesio:" + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Įdėti draugą" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Įrašyti IP ir prievadas teisingi!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Informacija" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "Nurodyta naudotojo maišos f-ja klaidinga!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Šaltiniai" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Failas" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Atsiųsti" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Kategorija" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Pagrindinė" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Atsiunčiamą failą įdėti į kategoriją" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "Ieškoti panašių failų (ED2k, vietiniame serveryje)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Prisijungti prie nutolusio aMule" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Prisijungti nepavyko" + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Klaida" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"Dėmesio: jei turite žemą ID, negalite savęs įkelti kaip ed2k nuorodos " +"šaltinio." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Naudotojai ED2K: %s Kad: %s | Failai ED2K: %s Kad: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Viskas" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Iš viso naudotojų: %s | Iš viso failų: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Persiųsta" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Baigtos" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Sparta" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Progresas" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Būsena" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Likęs laikas" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Paskutinį kartą matyta pilna" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Paskutinį kartą siųsta" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Ar tikrai norite pašalinti pažymėtus failus?" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Ar tikrai norite pašalinti pažymėtus failus?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Siųsti žinutę naudotojui" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Siųsti žinutę:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Sustabdyti" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Pauzė" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Tęsti" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "I&švalyti baigtus failus" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Visų naudotojų, turinčių šį failą, prašyti šio failo dabar pat" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Visų naudotojų, turinčių šį failą, prašyti šio failo automatiškai" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Visų naudotojų, turinčių šį failą, prašyti kito failo dabar pat" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Papildomi veiksmai" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Peržiūra" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "&Rodyti failo savybes" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Rodyti komentarus" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Kopijuoti magneto URI į talpyklę" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "Nepriskirti niekur" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Priskirti į kategoriją" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "&Atverti failą" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Pašalinti iš draugų" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Įdėti į draugus" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Siųsti žinutę" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Keisti į šį failą" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "Ats. kitą failą" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "Reitingas: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Atsiunčiamas kitas failas" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Atsiuntimai (%i)" + +#: src/DownloadListCtrl.cpp:2222 +#, fuzzy +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"Nurodykite parinktyse pageidaujamą vi parinktysedeo grotuvą.\n" +"Tuo tarpu aMule bandys naudoti mplayer grotuvą ir kaskart rodys šį pranešimą." + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Failo peržiūra" + +#: src/DownloadListCtrl.cpp:2260 +#, fuzzy, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "KLAIDA: Nepavyko paleisti išorinio vaizdo grotuvo!" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "KLAIDA: nepavyko atverti dalių failo" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "KLAIDA: nepavyko sukurti dalių failo" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "Bandoma įkelti met failo atsarginę kopiją iš %s" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "Klaida: Nepavyko atverti part.met failo: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "Klaida: part.met failo dydis yra 0: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "Klaida: klaidinga part.met failo versija: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "Klaida: %s (%s) sugadinta (blogas žymių indeksas), įkelti nepavyko." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "Bandoma atstatyti failų informaciją..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" +"Atstatomas failas be pavadinimo. Atstačius jis bus pavadintas RecoveredFile." +"dat." + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "Atstatyta visa įmanoma failo informacija – bandoma naudoti failą..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Nepavyko atstatyti failo informacijos :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Nepavyko atverti %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "Dėmesio: %s gali būti sugadinta (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "Įrašant dalių failą įvyko klaida: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "%s failo dydis kažkodėl yra 0 – naudojama %s failas." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "Failui %s nepavyko įrašyti part.met.seeds failo." + +#: src/PartFile.cpp:1019 +#, fuzzy, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "Įrašyta %i pilnų šaltinių atsiunčiamam failui %s (%s)" +msgstr[1] "Įrašyta %i pilnų šaltinių atsiunčiamam failui %s (%s)" +msgstr[2] "Įrašyta %i pilnų šaltinių atsiunčiamam failui %s (%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "Dalių failas %s (%s) neturi pilnų šaltinių failo" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "Dalių failas %s (%s) turi tuščią pilnų šaltinių failą" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "Nuskaitant dalių failo pilnų šaltinių failą įvyko klaida (%s – %s): %s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, fuzzy, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"Aptikta klaidinga dalis (%d) %d dalių faile %s – failo gauta maišos funkcija " +"|%s| failo maišos funkcija |%s|" +msgstr[1] "" +"Aptikta klaidinga dalis (%d) %d dalių faile %s – failo gauta maišos funkcija " +"|%s| failo maišos funkcija |%s|" +msgstr[2] "" +"Aptikta klaidinga dalis (%d) %d dalių faile %s – failo gauta maišos funkcija " +"|%s| failo maišos funkcija |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "Aptikta baigta dalis (%i) %s" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "Baigtas maišos funkcijos perskaičiavimas %s" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "" +"Patvirtinant baigtą failo %s siuntimą įvyko nežinoma klaida. Failas " +"pristabdytas." + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Atsiųsta: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "Šalinamas failas: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" +"Dėmesio: nepavyko apskaičiuoti atsiųstos dalies maišos funkcijos – nebaigta " +"dalis %s." + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"Klaida: nepavyko apskaičiuoti atsiųstos dalie smaišos funkcijos – nebaigta " +"dalis (%s). To neturėjo niekada atsitikti." + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "Dėmesio: diske nepakanka laisvos vietos! Failas pristabdomas: %s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "Atsiųsta sugadinta %i dalis: %s" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "" +"Klaidų taisymo įrankis: atstatyta sugadinta dalis %i %s –> išgelbėta %s baitų" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Nepakanka vietos diske" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Sustabdyta" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "Dėmesio: nepavyko atverti known.met." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" +"Dėmesio: žinomų failų sąrašas sugadintas, nuskaityta antraštė klaidinga." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "Nuskaitant known.met failą įvyko IO klaida: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "Įrašant known.met failą įvyko klaida: %s" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "Aptikti %i žinomi dalinami failai" +msgstr[1] "Aptikti %i žinomi dalinami failai" +msgstr[2] "Aptikti %i žinomi dalinami failai" + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "Aptikti %i žinomi dalinami failai, %i nežinomų" +msgstr[1] "Aptikti %i žinomi dalinami failai, %i nežinomų" +msgstr[2] "Aptikti %i žinomi dalinami failai, %i nežinomų" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "KLAIDA! Bandoma dalintis %s" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Failo komentarai" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Reitingas" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Komentuoti" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Komentarų nėra" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%s komentarai" +msgstr[1] "%s komentarai" +msgstr[2] "%s komentarai" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"Nepavyko prisijungti nei prie vieno iš slepiamų serverių sąraše. Bandoma dar " +"kartą neslepiant." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "" +"Nepavyko prisijungti nei prie vieno iš serverių sąraše. Bandoma dar kartą." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "ED2K tinklas išjungtas parinktyse, ryšys nebus užmezgamas." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "Serverių sąraše nėra teisingų serverių" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Ryšys užmegztas: %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Ryšys užmegztas: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"Bandant prisijungti įvyko kritinė klaida. Gali būti, kad nėra interneto " +"ryšio." + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Ryšys nutrūko %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) neatsako, galbūt išjungtas." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) pilnas." + +#: src/ServerConnect.cpp:391 +#, fuzzy, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "Po %d sekundžių bus bandoma prisijungti prie serverio automatiškai" +msgstr[1] "Po %d sekundžių bus bandoma prisijungti prie serverio automatiškai" +msgstr[2] "Po %d sekundžių bus bandoma prisijungti prie serverio automatiškai" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Ryšys nutrūko" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "Prisijungti prie %s (%s:%i) nepavyko." + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "Klaida: bandymo susijungti laikas tinklo lizdui baigėsi" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "Baigėsi bandymo susijungti laikas %s (%s:%i)." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Nerastas nei vienas dalių failas" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "Rasti %u dalių failai" +msgstr[1] "Rasti %u dalių failai" +msgstr[2] "Rasti %u dalių failai" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Atsiunčiama %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Failas %s jau yra atsiunčiamų failų sąraše" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Failas %s jau buvo atsiųstas" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Failas %s jau yra atsiunčiamų failų sąraše" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "Nepavyko magneto nuorodos konvertuoti į ed2k: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "Nežinomas protokolas arba nuoroda: %s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Klaidinga ED2K nuoroda! Klaida: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "Įvykdyti ir baigti darbą." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Neteisingas IP formatas. Naudokite xxx.xxx.xxx.xxx:xxxx formą\n" + +#: src/TextClient.cpp:305 +#, fuzzy +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" +"Šiai komandai reikia kintamojo. Tinkami kintamieji: „all“ (viskas) arba " +"skaičius.\n" + +#: src/TextClient.cpp:343 +#, fuzzy +msgid "Processing by hash: " +msgstr "Apdorojamo failo numeris %u: %s" + +#: src/TextClient.cpp:358 +#, fuzzy +msgid "Processing by filename: " +msgstr "Apdorojamo failo numeris %u: %s" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Neteisingas skaičius\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "Neteisinga maišos funkcija (turi būti 32 simbolių dydžio)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "Užduotis įvykdyta sėkmingai." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "Nepavyko įvykdyti prašymo. Gauta klaida: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "IP klientų filtras %s.\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "Išjungta" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "Įjungta" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "IP serverių filtras %s.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "Dabartinis IP filtro lygmuo %d.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Kanalo apribojimai: Išs.: %u KB/s, Ats.: %u KB/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Prisijungta prie %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "žemas ID" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "aukštas ID" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Jungiamasi" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Neprisijungta" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Atsiuntimai:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Išsiuntimai:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Klientai eilėje:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Iš viso šaltinių:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Paieškos rezultatų kiekis: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "Planuojama atlikti – rodyti paieškos progreso indikatorių" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Gautas nelauktas atsakymas iš serverio, OpCode = %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Rodyti trumpą būklės informaciją." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "" +"Rodyti ryšio būklę, dabartinę išsiuntimo ir atsiuntimo spartą ir pan.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Rodyti išsamų statistikos medį." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"Šiai komandai gali būti duotas kintamasis – skaičius nuo 0 iki 255. Šis \n" +"kintamasis nurodo kiek klientų programinės įrangos skirtingų versijų " +"rodyti. \n" +"Jei kintamojo nėra arba jo reikšmė 0, bus rodomos visos versijos " +"(neribojama).\n" +"Pavyzdžiui: „statistics 5“ rodys tik 5 populiariausias kiekvieno tipo " +"kliento versijas.\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "Išjungti aMule." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Išjungti nutolusį aMule branduolį (amule/amuled).\n" +"Tekstinis klientas bus taipogi išjungtas, nes be veikiančio branduolio jis " +"neturi prasmės.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Atnaujinti objektą." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "Atnaujinti dalinamų failų sąrašą." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "Atnaujinti IP filtrų sąrašą iš failo." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Prisijungti prie tinklo." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"Bus prisijungta prie visų tinklų, kurie įjungti parinktyse.\n" +"Galite pasirinktinai nurodyti serverio IP adresą ir prievadą naudodami " +"formą\n" +"IP:prievadas. Bus prisijungta tik prie nurodyto serverio. IP turi būti " +"taškais\n" +"atskirtais dešimtainiais skaičiais užrašytas IPv4 adresas arba DNS srities " +"pavadinimas." + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Prisijungti tik prie ED2K." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Prisijungti tik prie Kademlia." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Atsijungti nuo tinklo." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "Atsijungti nuo visų tinklų, prie kurių šiuo metu prisijungta.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Atsijungti tik nuo ED2K." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Atsijungti tik nuo Kademlia." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Įdėti ED2K arba magneto nuorodą į branduolį." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"Gali būti įdėtos tokios ED2K nuorodos:\n" +"*) failo nuoroda (ed2k://|file|...) bus įdėta į atsiunčiamų failų eilę;\n" +"*) serverio nuoroda (ed2k://|server|...) bus įdėta į serverių sąrašą;\n" +"*) serverių sąrašo nuoroda visus serverius tame sąraše įtrauks į serverių " +"sąrašą.\n" +"\n" +"Magneto nuorodoje turi būti ed2k maiša ir failo dydis.\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Nurodyti parinkties reikšmę." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "Nurodyti IP filtro parinktis." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "Įjungti klientų ir serverių IP filtravimą." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "Išjungti klientų ir serverių IP filtravimą." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "Įj./išj. klientų IP filtravimą." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "Įjungti klientų IP filtravimą." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "Išjungti klientų IP filtravimą." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "Įj./išj. serverių IP filtravimą." + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "Įjungti serverių IP filtravimą." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "Išjungti serverių IP filtravimą." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "Nurodyti filtravimo lygmenį." + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"Filtravimo lygmenys yra skaičiai nuo 0 iki 255.\n" +"Numatytas lygmuo 127.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Nurodyti kanalo apribojimus." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "Šioms komandoms reikšmės nurodomos kilobaitais per sekundę.\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Nurodyti išsiuntimo kanalo apribojimą." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "Nurodyti atsiuntimo kanalo apribojimą." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Pateikti parinkties reikšmę." + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "Pateikti IP filtro parinktis." + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "Pateikti klientų ir serverių IP filtro būseną." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "Pateikti tik klientų IP filtro būseną." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "Pateikti tik serverių IP filtro būseną." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "Pateikti IP filtro lygmenį." + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Pateikti kanalo apribojimus." + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Ieškoti." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"Paieškos tipas turi būti vienas iš:\n" +" Globalus\n" +" Vietinis\n" +" Kad\n" +"Pavyzdžiui: „search kad failas“ ieškos „failo“ kad tinkle.\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Ieškoti globaliai." + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Ieškoti vietiniame serveryje" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Ieškoti kad tinkle" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Pateikti paskutinės paieškos rezultatus." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Pateikti ankstesnės paieškos rezultatus.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Pradėti siųsti failą" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"Nurodykite failo numerį ankstesnės paieškos rezultate.\n" +"Pavyzdžiui: „atsisųsti 12“ reikš atsisiųsti failą nr. 12 iš ankstesnės " +"paieškos rezultato.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Pristabdyti atsiunčiamą failą." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Tęsti failo siuntimą." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Atšaukti failo siuntimą." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Nurodyti atsiuntimo prioritetą." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "Nurodyti žemą, normalų, aukštą arba automatinį prioritetą.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "Nurodyti žemą prioritetą." + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "Nurodyti normalų prioritetą." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "Nurodyti aukštą prioritetą." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "Nurodyti automatinį prioritetą." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Rodyti eiles/sąrašus." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Rodyti išsiuntimo/atsiuntimo eilę, serverių sąrašą arba dalinamus failus.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Rodyti išsiuntimo eilę." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Rodyti atsiuntimo eilę." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Rodyti žurnalą." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Rodyti serverių sąrašą." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Atstatyti žurnalą." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() pateikė NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "Klaida: %s (%s) – %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "Dėmesio: %s (%s) – %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Naujas kliento ID yra %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "\tLabiausiai tikėtina, kad esate už ugniasienės ar maršrutizatoriaus." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "" +"\tNorėdami sužinoti daugiau informacijos apsilankykite http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "Gauta nežinomo serverio informacija per trumpa!" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "Aptikta %d naujų serverių" +msgstr[1] "Aptikta %d naujų serverių" +msgstr[2] "Aptikta %d naujų serverių" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Serverių sąrašo įrašymas baigtas." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "Serveris atmetė paskutinę komandą" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Iš serverio %s gautas klaidingas paketas" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "Apdorojant iš serverio %s gautą paketą įvyko nežinoma klaida" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "Prisijungiant prie %s nepavyko sukurti DNS ryšio gijos" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "Serverio IP %s (%s) nepraėjo filtro. Ryšys nebus užmezgamas." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "naudojamas protokolo slėpimas." + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "Prisijungta prie %s (%s – %s:%i) %s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "Nepavyko išsiaiškinti serverio %s DNS. Ryšys nebus užmezgamas!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "CIP2Country::CIP2Country(): nepavyko įkelti šalies duomenų iš " + +#: src/IP2Country.cpp:73 +#, fuzzy, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "Įkelta %d vėliavėlių paveiksliukai." +msgstr[1] "Įkelta %d vėliavėlių paveiksliukai." +msgstr[2] "Įkelta %d vėliavėlių paveiksliukai." + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"Ar tikrai norite atšaukti ir pašalinti visus failus šioje kategorijoje?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Reikalaujama patvirtinimo" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Visa kita" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Neužbaigtos" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Aktyvios" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Vaizdo failai" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Garso failai" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Supakuoti failai" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "CD atvaizdai" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Paveiksliukai" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Teksto failai" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Parinkite filtrą" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Įdėti kategoriją" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Keisti kategoriją" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Pašalinti kategoriją" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "Įkeliama %s: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "Skaitomas laikinų failų aplankas" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "Laukiama pradinės informacijos iš atsiunčiamos informacijos failo" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "Kuriamas paskirties failas" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "Įkeliami duomenys iš seno atsiuntimo failo (%u iš %u)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "Duomenų blokas įrašomas į naują atsiuntimo failą (%u iš %u)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "Laukiama atsiuntimo failo šaltinių informacijos" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "Įkeliamas atsiuntimo failas ir įrašomas naujas dalinis failas" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Atsiunčiama būsenos informacija..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "Dirbama" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Klaida: diske pritrūko vietos" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Klaida: dalių failas nerastas" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Klaida: IO klaida!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Klaida: Nepavyko!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "Eilėje" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Jau siunčiama" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Nežinomas arba klaidingas laikino failo formatas." + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Failo pavadinimas" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Būklė" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Maišos f-ja" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Įkelti dalių failus" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"Įrašykite aplanką, kuriame ieškoti dalinai atsiųstų failų! Paaplankiai bus " +"irgi apieškoti." + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "Ar norite, kad sėmingai įkeltų failų pradiniai failai būtų pašalinti?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Pašalinti pradinius failus?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Laukiama..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (diskas: %s)" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "baitų" +msgstr[1] "baitų" +msgstr[2] "baitų" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "baitų/s" +msgstr[1] "baitų/s" +msgstr[2] "baitų/s" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "s" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "min." + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "val." + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "dienų" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Vaizdo failai" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Supakuoti failai" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Teksto failai" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programos" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Bet kas" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Nevertinta" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Klaidinga/sugadinta" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Prasta" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Labai gera" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Gera" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Puiki" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "Viskas" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "Visa kita" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "Įkeliami IP filtrai ipfilter.dat ir ipfilter_static.dat." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" +"Nepavyko įkelti ipfilter.dat failo „%s“, nepavyko suprasti failo formato." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "Nepavyko įkelti ipfilter.dat failo „%s“, nepavyko atverti failo." + +#: src/IPFilter.cpp:330 +#, fuzzy, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "Įkelta %u IP diapazonų iš „%s“. %u klaidingų įrašų neįkelta." +msgstr[1] "Įkelta %u IP diapazonų iš „%s“. %u klaidingų įrašų neįkelta." +msgstr[2] "Įkelta %u IP diapazonų iš „%s“. %u klaidingų įrašų neįkelta." + +#: src/IPFilter.cpp:332 +#, fuzzy, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "Įkelta %u IP diapazonų iš „%s“. %u klaidingų įrašų neįkelta." +msgstr[1] "Įkelta %u IP diapazonų iš „%s“. %u klaidingų įrašų neįkelta." +msgstr[2] "Įkelta %u IP diapazonų iš „%s“. %u klaidingų įrašų neįkelta." + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Aktyvūs ryšiai (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Failo savybės" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% baigta" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "ED2K nuoroda: " + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Vykdyti" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" +"Spragtelėję šį mygtuką įrašytą nuorodą įtrauksite į atsiunčiamų failų eilę." + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "Iššokantis būsenos tekstas" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Įkeliama..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "Įvykių žurnalas. Pilną įvykių žurnalą galite rasti Serverių kortelėje." + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Naudotojų skaičius serveryje, prie kurio prisijungėte..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Naudotojų: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" +"Naudotojų skaičius dabartiniame serveryje ir apytikslis bendras naudotojų " +"skaičius." + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"Dabartinė vidutinė išsiuntimo ir atsiuntimo sparta. Jei įjungta papildoma " +"parinktis skaičiai skliausteliuose nurodo išnaudojamą tarnybinį srautą." + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"Ryšio būklė ir aktyvūs siuntimai. Raudonos rodyklės žymi, kad ryšys " +"neužmegztas, geltonos rodyklės žymi, kad gavote žemą ID (esate už " +"ugniasienės), žalios rodyklės žymi, kad gavote aukštą ID (geriausia ryšio " +"būklė)." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Neprisijungta..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Dabartinis serveris." + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Paieška" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Pavadinimas:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Vietinis" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Globalus" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "Failo maišos f-ja" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Papildomos parinktys" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Filtrai" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Failo tipas" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Plėtinys" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Min dydis" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Baitai" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Maks dydis" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Skaičius" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Filtras:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Filtruoti rezultatus" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Apversti filtrą" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Slėpti žinomus failus" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Daugiau" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "Ieškoti ED2K daugiau rezultatų. Kad kol kas neveikia." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Sustabdyti" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Atstatyti laukelius" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Paieškos rezultatai" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Išvalyti iš sąrašo atsiųstus failus" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Rodyti išsiunčiamus failus arba išsiuntimo eilę" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Naudotojai eilėje:" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Siųsti" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Išsiųsti įrašytą žinutę." + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Užverti" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Baigti pokalbį ir užverti pokalbio kortelę." + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Pilnas pavadinimas:" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "Nežinoma" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "met failas:" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Maišos funkcija:" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Failo dydis:" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Dalinio failo būsena:" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Paskutinį kartą matytas pilnas:" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Rasti šaltiniai:" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Siunčiantys šaltiniai:" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Dalių skaičius:" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Pasiekiamos dalys:" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Siuntimo sparta:" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Atsiuntimo aktyvi trukmė: " + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Persiųsta duomenų:" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Atsiųstas dydis: " + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Klaidų taisymo įrankis" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Dėl klaidų prarasta:" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Sutaupyta supakuojant:" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "Klaidų taisymo įrankis pataisė paketų:" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Failo pavadinimai" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Panaudoti" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Išvalyti" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Įvykdyti" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Gerai" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "Komentuokite ir įvertinkite failą (komentarą matys visi naudotojai)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"Jei tai filmas, galite parašyti jo trukmę, siužetą, kokia kalba kalbama...\n" +"Jei failas sugadintas, galite apie tai pranešti kitiems aMule naudotojams." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Failo kokybė" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "Įvertinkite failą arba praneškite kitiems, kad failas sugadintas..." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Komentarų nėra" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Atnaujinti" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Atsiunčiama, prašome palaukti..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Dydis nežinomas" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Būtina informacija" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "IP adresas:" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Prievadas:" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Papildoma informacija" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Naudotojo vardas:" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Naudotojo maišos f-ja:" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Atnaujinti dalinamų failų sąrašą" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Dabartinis seansas" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Iš viso" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Gauta prašymų:" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Aktyvūs išsiuntimai:" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Atsiuntimo sparta" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Dabartinė sparta" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Dabartinis vidurkis" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Seanso vidurkis" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Išsiuntimo sparta" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Ryšiai" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Aktyvūs atsiuntimai" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Aktyvūs ryšiai (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Aktyvūs išsiuntimai" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Statistikos duomenų medis" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Naudotojo vardas:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Naudotojo maišos f-ja:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Kliento programinė įranga:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Programinės įrangos versija:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "IP adresas:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "Naudotojo ID:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "Serverio IP:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Serverio pavadinimas:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "Siuntimai naudotojui" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Dabartinis prašymas:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Vidutinė išsiuntimo sparta:" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Vidutinė atsiuntimo sparta:" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Išsiųsta (per šį seansą):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Atsiųsta (per šį seansą):" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Išsiųsta (iš viso):" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Atsiųsta (iš viso):" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Reitingas" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "Ats./išs. indeksas:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Saugus identifikatorius:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Reitingas (bendras):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Reitingas eilėje:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Bendros parinktys" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Slapyvardis" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org – Linux Mule programa" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "Įrašykite vardą, kurį matys kiti su jumis užmezgę ryšį naudotojai." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Kalba" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "Naudotojo aplinkos kalba." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Įvairios parinktys" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Paleidus programą ieškoti naujesnės versijos" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" +"Įjungus šią parinktį aMule kiekieną kartą paleidus programą patikrins ar " +"nėra naujesnės programos versijos." + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Paleidus nuleisti langą" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "" +"Jei ši parinktis įjungta, paleidus programą aMule langas bus iškart " +"nuleistas žemyn." + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Klausti prieš baigiant darbą" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "" +"Įjungus šią parinktį prieš uždarant langą aMule paklaus ar tikrai norite " +"baigti." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Įjungti sistemos dėklo ženkliuką" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "Ši parinktis įjungia ar išjungia sistemos dėklo ženkliuką." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "Sumažinti į sisteminio dėklo ženkliuką" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" +"Jei ši parinktis įungta, nuleidus aMule langą, programa bus sumažinta į " +"sistemos dėklo ženkliuką, o ne į programų juostą." + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Uždelsti prieš parodant patarimą (sekundėmis)" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "" +"Kiek sekundžių uždelsti prieš parodant patarimą užvedus pelę ant objekto." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Naršyklės parintys" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Parinkite naršyklę" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Nurodyta naudotojo:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Naršyklių sąraše nurodykite, kad norite naudoti Naudotojo nurodytą naršyklę " +"ir įrašykite čia naršyklės pavadinimą." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Jei įmanoma, atverti naują kortelę" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" +"Įjungus šią parinktį, stengtis nurodytą puslapį atverti naujoje naršyklės " +"kortelėje, o ne pagrindiniame naršyklės lange." + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Apribojimai kanalui" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Išsiuntimas" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Vieno ryšio sparta" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Kanalo talpa" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Būtinas TCP prievadas:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "" +"Šis prievadas yra būtinas ED2K tinklo parametras; jis negali būti išjungtas." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Papildomas UDP prievadas:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" +"Šis UDP prievadas yra skirtas papildomoms ED2K užklausoms ir Kademlia " +"tinklui." + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "Išjungti" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Susieti adresą" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "UDP prievadas papildomoms serverio užklausoms (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Didžiausias šaltinių skaičius failui" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Griežta riba" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Ryšių skaičius" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Didžiausias ryšių kiekis" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Visuotinis Plug nad Play" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "Įjungti UPnP" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "UPnP TCP prievadas:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Pradėjus darbą prisijungti automatiškai" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Nutrūkus ryšiui prisijungti vėl" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Rodyti tarnybinį srautą" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Serverių parinktys" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Pašalinti neatsiliepiantį serverį po" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "bandymų" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Pradėjus darbą automatiškai atnaujinti serverių sąrašą" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Sąrašas" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Atnaujinti serverių sąrašą jungiantis prie serverio" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Atnaujinti serverių sąrašą prisijungus klientui" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Naudoti prioritetų sistemą" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Jungiantis naudoti išmoningą žemo ID tikrinimą" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Saugus jungimasis" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Automatiškai jungtis tik prie serverių iš pastovaus sąrašo" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Naudotojo įdėtiems serveriams nurodyti aukštą prioritetą" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "Įjungti įrankį" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "Įrankis pasitiki visomis maišos funkcijomis (nerekomenduojama)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Failus į atsiuntimo eilę įdėti pristabdytos būsenos" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Į atsiuntimo eilę įdedamiems failams nurodyti automatinį prioritetą" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Visų pirma bandyti atsiųsti pirmą ir paskutinę failo dalį" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Naujiems dalinamiems failams nurodyti automatinį prioritetą" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Išsiunčiant failus stengtis išsiųsti pilną failo dalį" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Atsiuntus failą pradėti siųsti pristabdytą failą" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "Siųsti tos pačios kategorijos failą" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "Įrašyti 10 šaltinių retiems failams (mažiau nei 20 šaltinių)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Vieta diske" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Tikrinti vietą diske" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "Įjungus šią parinktį aMule tikrins ar pakanka vietos diske." + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Min. laisvos vietos:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Įrašykite kiek diske palikti laisvos vietos." + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Atsiųstų failų aplankas:" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Laikinų failų aplankas:" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Dalinamų failų aplankai" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "(Spragtelėję dešiniu klavišu dalinsitės ir gilesniais paaplankiais)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Dalintis slepiamais failais" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Vaizdo grotuvas" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Sukurti peržiūros atsarginę kopiją" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Grafikai" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Atnaujinimo dažnis: 5 s" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Vidurkių grafiko dydis: 100 min." + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Ryšių grafiko skalė: 100" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Nurodykite grafikų spalvas" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Fonas" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Rėmeliai" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Dabartinė atsiuntimo sparta" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Dabartinis atsiuntimo vidurkis" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Seanso atsiuntimo vidurkis" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Dabartinė išsiuntimo sparta" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Dabartinis išsiuntimo vidurkis" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Seanso išsiuntimo vidurkis" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Aktyvūs ryšiai" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Sistemos dėklo spartos indikatorius" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Dabartiniai Kademlia mazgai" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Kademlia mazgų dabartinis vidurkis" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Kademlia mazgų seanso vidurkis" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Nurodykite spalvą" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Rodomų klientų versijų skaičius (0 – neribojama)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Pranešimai" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Iššokančios žinutės" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Naudoti garsą" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Iššokti: " + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Gavus naują įrašą žurnale" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Pradėjus naują pokalbį" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Gavus naują pokalbio žinutę" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Pradedant arba užbaigus siuntimą" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Išėjus naujai aMule versijai" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "Dingus ryšiui su serveriu" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Pranešti el. paštu" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Išsiųsti laišką baigus siųsti failą." + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "SMTP serveris:" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "El. pašto adresas:" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "DĖMESIO!!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Nekeiskite šių parinkčių, nebent gerai žinote \n" +"ką darote. Neteisingai pakeitę parinktis galite \n" +"gerokai pasibloginti savo siuntimo spartą.\n" +"\n" +"aMule puikiai veikia nieko nepakeitus šiame lange." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Sudėtingesnės parinktys" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Per 5 s užmegzti ne daugiau ryšių, nei nurodyta" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Failo buferio dydis: 240000 baitai" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Išsiuntimo eilė: 5000 klientų" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Serverio ryšio atnaujinimo intervalas: išjungta" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "Programos išvaizda" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Atsiuntimo eilės progresas" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Rodyti procentus" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Rodyti progreso juostą" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Progreso juostos išvaizda" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Plokščia" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Erdvinė" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Keičiama išvaizda" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Įjungti keičiamas išvaizdas" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Išvaizda:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- išvaizdų nėra -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Stulpelių rūšiavimas" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "Automatiškai rūšiuoti failus (apkraunamas procesorius)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "" +"Įjungus šią parinktį atsiuntimo eilėje esantys failai bus rūšiuojami " +"automatiškai" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Įvairios išvaizdos parinktys" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Rodyti ED2K nuorodų juostą" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Rodyti papildomą informaciją kategorijų kortelėse" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Rodyti siuntimo spartą failo pavadinime" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Mygtukus išdėstyti vertikaliai" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Prieš failo pavadinimą rodyti dalinio failo numerį" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Nutolęs valdymas" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "www serverio parinktys" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Paleisti amuleweb pradėjus darbą" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "www serverio prievadas" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "Webserverio prievade įjungti UPnP prievadų perdavimą" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Webserverio UPnP TCP prievadas" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Puslapio atnaujinimo periodas (sekundėmis)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Įjungti Gzip suspaudimą" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Įjungti nepilnos prieigos naudotoją" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Pilnos prieigos slaptažodis" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Nepilnos prieigos slaptažodis" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "www šablonas" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Išorinio ryšio parinktys" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Priimti išorinius ryšius" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"Klausančio įrenginio IP \n" +"(jei tuščia – bet koks IP)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Įrašykite išorinių ryšių besiklausančio įrenginio IP adresą a.b.c.d forma. " +"Tuščias laukelis arba adresas 0.0.0.0 reiškia bet kokį įrenginį." + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "TCP prievadas" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "EC prievade įjungti UPnP prievadų perdavimą" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "Patvirtinti naujai nurodytas parinktis." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Atšaukti bet kokius pakeitimus." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Pavadinimas:" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Komentaras:" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Atsiųstų failų aplankas:" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Keisti naujai priskirtų failų prioritetą:" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Nekeisti" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Nurodykite dabartinės kategorijos spalvą:" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Užmezgus ryšį su serveriu rodyti serverio pranešimą..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Serverio informacija" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Išvalyti įvykių žurnalą." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "aMule žurnalas" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "Paspaudę šį mygtuką atnaujinsite serverių sąrašą iš URL..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Serverių sąrašas" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Įrašykite server.met failo URL ir paspaudę mygtuką kairėje atnaujinsite " +"serverių sąrašą." + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Įdėti serverį: pavadinimas" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Įrašykite serverio pavadinimą" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Įrašykite serverio IP adresą naudodami a.b.c.d formą." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Įrašykite serverio prievadą." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "Įdėti serverį (prieš tai užpildykite laukelius kairėje)..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "ED2K informacija" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Kademlia informacija" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"Nurodyta lokalė jūsų kompiuteryje neįdiegta.\n" +"Norėdami naudoti šią kalbą, turite ją sugeneruoti.\n" +"Linux sistemose reikėtų padėti nuo failo „/etc/locale.gen“ ir paketo " +"„locales“.\n" +"Sėkmės!\n" +"(Dėmesio: šiaip ar taip vis tiek pabandysime naudoti nurodytą lokalę)." + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Niekada neberodyti šio lango" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "Spragtelėję šį mygtuką atnaujinsite mazgų sąrašą iš URL..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Mazgai (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"Įrašykite nodes.dat failo URL ir paspaudę mygtuką kairėje atnaujinsite mazgų " +"sąrašą." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Mazgų statistika" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Naujas mazgas" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Prievadas:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Atjungti Kademlia" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Protokolo slėpimas" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Įjungti protokolo slėpimą" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"Ši parinktis įjungia protokolo slėpimą. Tuomet aMule priiminės slepiamus " +"ryšius iš kitų klientų." + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Slėpti išeinančius ryšius" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"Įjungus šią parinktį aMule, jungdamasi prie kitų klientų ar serverių, slėps " +"išeinančius ryšius." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Priimti tik slepiamus ryšius" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"Įjungus šią parinktį aMule priims tik slepiamus ryšius. Šaltinių bus rasta " +"mažiau, bet visas srautas bus slepiamas" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Failų parinktys" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Visi" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Niekas" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Kas gali matyti dalinamus failus:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "Nurodykite kas gali pamatyti dalinamų failų sąrašą." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "IP filtravimas" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Filtruoti klientus" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Įjungti klientų IP adresų filtravimą, aprašytą ~/.aMule/ipfilter.dat faile." + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Filtruoti serverius" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Įjungti serverių IP adresų filtravimą, aprašytą ~/.aMule/ipfilter.dat faile." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Atnaujinti sąrašą" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "Atnaujinti IP adresų sąrašą iš ~/.aMule/ipfilter.dat failo" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Atnaujinti dabar" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Automatiškai įkelti IP filtrą paleidus programą" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Filtravimo lygmuo:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Visuomet filtruoti LAN IP adresus" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Paranojiškai elgtis su neatitikusiais IP adresais" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Atmesti paketą, jei kliento IP adresas skiriasi nuo paketo šaltinio IP " +"adreso. Naudoti atsargiai." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Įjungti/išjungti" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Įjungti keičiamą parašą" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Įjungus šią parinktį bus įrašomas keičiamo parašo failas, kurį galite " +"naudoti kitoje programoje parašų kūrimui ir pan." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Atnaujinimo dažnis (sekundėmis):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "Keičiamo parašo atnaujinimo dažnis sekundėmis." + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Keičiamo parašo aplankas:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "Nurodykite aplanką, kuriame yra keičiamo parašo failas." + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Įjungti/išjungti" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "Filtruoti gaunamas žinutes (išskyrus dabartinį pokalbį):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Filtravimo parinktys:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Filtruoti visas žinutes" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Filtruoti žinutes nuo naudotojų, nesančių draugų sąraše" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Filtruoti žinutes nuo nežinomų klientų" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Filtruoti žinutes turinčias tekstą („,“ naudokite kaip skirtuką):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"Įrašykite žodžius, kurių aMule ieškos žinutės tekste ir filtruos žinutę." + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Komentarai" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Įjungti atstovaujančius serverius" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Įjungti ar išjungti atstovaujančius serverius." + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Serverio tipas:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "Atstovaujančio serverio, prie kurio jungsitės, tipas" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Serverio mazgas:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "Atstovaujančio serverio mazgo pavadinimas" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Serverio prievadas:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "Atstovaujančio serverio prievadas" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Autentifikavimas" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Įjungti autentifikavimą" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Įjungti ar išjungti naudotojo vardo ir slaptažodžio autentifikavimą" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "Naudotojo vardas prisijungimui prie atstovaujančio serverio" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Slaptažodis:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "Slaptažodis prisijungimui prie atstovaujančio serverio" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Automatiškai prijungti serverį be atstovaujančio serverio" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Prijungti prie:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Prisijungti prie nutolusios aMule" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Naudotojo vardas" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Įsiminti parinktis" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Įjungti išsamų klaidų taisymo žurnalą." + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "Žinučių kategorijos:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "Įdėti failus" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Pažymėtas bandyti iš naujo" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Pašalinti pažymėtas" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Įvykių tipai" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Prisijungti prie bet kurio serverio ir/ar Kademlia tinklo" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Nauja kategorija" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Nurodykite atsiunčiamų failų aplanką" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Nurodykite kategorijos pavadinimą!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Nurodykite kategorijos kelią!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"Nepavyko sukurti atsiunčiamų failų aplanko šiai kategorijai. Nurodykite " +"teisingą kelią!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "Nežinomas plėtinys %s (komandai %s).\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "Nežinoma komanda %s.\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"Ši komanda neturi kintamųjų.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"Šiai komandai reikia kintamojo.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Ši komanda nebaigta, naudokite vieną iš plėtinių žemiau.\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Galimi plėtiniai:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Galimos komandos:\n" + +#: src/ExternalConnector.cpp:188 +#, fuzzy, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"Visoms komandoms svarbu raidžių dydis.\n" +"Įrašę „help “ gausite išsamią informaciją apie .\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Baigti programos darbą." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Rodyti pagalbą." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"Įrašę „help “ gausite išsamią informaciją apie .\n" +"Įrašę „help“ gausite pilną komandų sąrašą.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"Įrašę „%s“ gausite komandų sąrašą\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Sintaksės klaida!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Apdorojant komandą įvyko klaida! To neturėjo niekada atsitikti! Prašome " +"pranešti apie klaidą\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Ši komanda negali turėti parametrų." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Ši komanda privalo turėti parametrą." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Klaidingas kintamasis." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Komanda neužbaigta." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Įrašę „%s“ gausite išsamesnę pagalbą.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "Tai %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "Tai %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Kuriamas klientas...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "Nepavyko užmegzti ryšio. Prie nurodyto mazgo prisijungti nepavyko\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"Darbas baigiamas %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"Nurodžius tuščią slaptažodį prisijungti nepavyks.\n" +"Nurodykite slaptažodį parinkčių faile,\n" +"komandų eilutėje arba įrašykite paklausus.\n" +"\n" +"Darbas baigiamas...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Rodyti šį pagalbos tekstą." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "Mazgas, kuriame paleista aMule. Numatyta: localhost" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "aMule išorinių ryšių prievadas. Numatyta: 4712" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Išorinių ryšių slaptažodis." + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Nuskaityti parinktis iš failo." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "Nepateikti išvesties į stdout įrenginį." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Rodyti išsamius pranešimus, negi klaidų taisymo pranešimus." + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Nurodyti programos kalbą." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "Komandų eilutės parinktis įrašyti į parinkčių failą." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "Sukurti parinkčių failą pagal aMule parinkčių failą." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Atspausdinti programos versiją." + +#: src/ClientCreditsList.cpp:168 +#, fuzzy, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "Kreditų failas įkeltas, rasta %u žinomų klientų" +msgstr[1] "Kreditų failas įkeltas, rasta %u žinomų klientų" +msgstr[2] "Kreditų failas įkeltas, rasta %u žinomų klientų" + +#: src/ClientCreditsList.cpp:171 +#, fuzzy, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] "– %u klientų kreditai nebegalioja!" +msgstr[1] "– %u klientų kreditai nebegalioja!" +msgstr[2] "– %u klientų kreditai nebegalioja!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "Nerasta cryptkey.dat failo. Failas kuriamas." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"KLAIDA: aMule tarnyba negali būti naudojama jei išoriniai ryšiai yra " +"išjungti. Norėdami įjungti išorinius ryšius arba naudokite normalią aMule, " +"arba paleiskite amuled su parametru --ec-config, arba faile ~/.aMule/amule." +"conf nustatykite parametro „AcceptExternalConnections“ reikšmę lygią 1." + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "KLAIDA: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Atblokuoti" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Rodyti išsiunčiamus failus" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Rodyti laukiančius eilėje" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Rodyti klientus" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Parinkti vaizdą" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Klientų progr. įr." + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Laukė" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Išsiuntimo trukmė" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Išsiųsta/Atsiųsta" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Būsena" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "Eilės reitingas: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Failo prioritetas" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Įvertinimas" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Prašė" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Paskutinį kartą matytas" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Atsistojo į eilę" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Išsiuntimo būsena" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Išsiųsta" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Atsiuntimo būsena" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Atsiųsta" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Naudotojo maišos f-ja" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Šifruotas" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Slėpti dalinamus failus" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Kliento savybės" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Neveikia" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Neužbaigta" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Kenkėjas" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Praėjo patikrinimą" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Nepasiekiama" + +#: src/ClientDetailDialog.cpp:190 +#, fuzzy, c-format +msgid "%u (QR: %u)" +msgstr "Eilės reitingas: %u" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" +"Apatinė dydžio riba turi būti mažesnė už viršutinę dydžio ribą. Įvestos " +"viršutinės ribos nebus paisoma." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Dėmesio" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Neribojama" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "aMule dėklo meniu" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Spartos apribojimai:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "Išs.: jokių" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "Išs.: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "Ats.: jokių" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "Ats.: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Atsiuntimo sparta: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Išsiuntimo sparta: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Kliento informacija" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Slapyvardis: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "Slapyvardis nenurodytas!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "Kliento ID:" + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Serverio pavadinimas:" + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "Serverio IP:" + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "TCP prievadas: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "TCP prievadas: neparuoštas" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "UDP prievadas: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "UDP prievadas: neparuoštas" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Keičiamas parašas: įjungta" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Keičiamas parašas: išjungta" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Dalinami failai: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Klientai eilėje: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "Iš viso atsiųsta: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "Iš viso išsiųsta: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Išsiuntimo apribojimas" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Atsiuntimo apribojimas" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "Slėpti aMule" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "Rodyti aMule" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "Pokalbis pradėtas: %s (%s:%u) – %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Prisijungta prie kliento ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** Jungiamasi prie kliento ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Nepavyko prisijungti prie kliento arba ryšys nutrūko ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Užverti kortelę" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Užverti visas korteles" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Užverti kitas korteles" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "Įkeliamas server.met failas: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "Nepavyko aptikti server.met failo!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" +"Nepavyko įkelti server.met failo %s, aptikto failo formatas nesuprantamas." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "Nepavyko atverti failo server.met!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"Failas server.met sugadintas, aptiktas klaidingas versijos įrašas: 0x%x, " +"dydis %i" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "server.met faile rasta %i serverių" +msgstr[1] "server.met faile rasta %i serverių" +msgstr[2] "server.met faile rasta %i serverių" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d serverių įdėta" +msgstr[1] "%d serverių įdėta" +msgstr[2] "%d serverių įdėta" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Serveris neįdėtas: [%s:%d] nurodytas klaidingas prievadas." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "Serveris neįdėtas: [%s:%d] IP adresas klaidingas arba nepraėjo filtro." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "Serveris neįdėtas: [%s:%d] toks serveris jau yra." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Serveris įdėtas: [%s:%d] pavadinimas %s." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"Prie serverio, kurį norite pašalinti, esate šiuo metu prisijungę. Norėdami " +"pašalinti serverį, iš pradžių turite atsijungti." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Nepavyko įrašyti server.met failo!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "Klaidingas URL" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Nepavyko iš %s atsiųsti serverių sąrašo" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"Faile addresses.dat nerasta nei vieno serverių sąrašo adreso. Norėdami " +"automatiškai atnaujinti serverių sąrašą įrašykite teisingą serverių sąrašo " +"adresą į šį failą." + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" +"Dėmesio! Serverių automatiniam atnaujinimui nurodytas klaidingas URL: %s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" +"Faile addresses.dat nerasta nei vieno teisingo server.met failo automatinio " +"atsiuntimo URL" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"Vietinis serveris filtruojamas IP filtro, jungiamasi prie kito serverio!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "Nepavyko įvykdyti komandos „%s„ įvykiui „%s“." + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"Pasikeitus parinktims aplinkos kalba buvo pakeista į sistemoje numatytą " +"kalbą." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"Serverių sąraše nėra nei vieno serverio.\n" +"Ar pageidaujate, kad aMule dabar atsiųstų naują sąrašą?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Serverių sąrašo siuntimas" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "www serverio pid %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"Pageidavote paleisti www serverį aMule paleidimo metu, bet amuleweb " +"programos nepavyko paleisti. Įdiekite paketą, kuriame yra aMule www " +"serveris, arba sukompiliuokite aMule naudodami raktą --enable-webserver ir " +"įvykdykite komandą „make install“." + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "Prievadas %u neprieinamas. Gavote žemą ID\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"Prievadas %u neprieinamas!\n" +"\n" +"Gavote žemą ID.\n" +"\n" +"\n" +"Patikrinkite sistemines tinklo parinktis ir įsitikinkite, kad nurodytas " +"prievadas atviras tiek išsiuntimui, tiek priėmimui." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Nepavyko sukurti keičiamo parašo failo" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "Nepavyko sukurti keičiamo aMule parašo failo" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"Nurodyta lokalė jūsų kompiuteryje neįdiegta. (Dėmesio: šiaip ar taip vis " +"tiek pabandysime naudoti nurodytą lokalę)." + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "aMule paleista pirmą kartą %s" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "Ši versija yra darbinė versija, atnaujinama kasdien, ir\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "todėl negalime garantuoti, kad ji nenulūš, nepadegs namų ar\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "nenumarins šuns. Bet šiaip ar taip ją naudoti turėtų būti saugu.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "Šiame leidime šios parinktys buvo pakeistos dėl saugumo sumetimų:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* Įjungtas protokolo slėpimas įeinantiems ir išeinantiems ryšiams.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* Išjungtas serverių sąrašo atnaujinimas iš kitų serverių ir klientų.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"Norėdami sužinoti daugiau apie šių pasikeitimų priežastis, skaitykite \n" +"apie „netikrus serverius“ aMule wiki, esančiame adresu http://wiki.amule." +"org. \n" +"Kad aMule veiktų korektiškai, labai svarbu, kad pašalintumėte netikrus \n" +"serverius iš savo serverių sąrašo." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Daugiau informacijos, pagalbos ir naujausias galutines versijas rasite mūsų\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" +"svetainėje www.aMule.org arba IRC kanale #aMule serveryje irc.freenode.net.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Nesikuklinkite pranešti rastas klaidas adresu http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"Neteisingai nurodėte keičiamo parašo aplanką!\n" +"Keičiamas parašas bus išjungtas tol, kol pakeisite parinktis." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "KLAIDA: nepavyko atverti žurnalo failo" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "DĖMESIO: žurnalas tuščias. Kažkas čia ne taip." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Žurnalas išvalytas" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "Serverio pranešimas: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Nepavyko atsiųsti mazgų sąrašo." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Nepavyko atverti atsiųstos versijos tikrinimo failo" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Sugadintas versijos tikrinimo failas" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Naudojate pasenusią aMule versiją!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "Ši aMule versija yra %i.%i.%i, o naujausia versija yra %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "Naujausią versiją bet kada galima atsisiųsti iš http://www.amule.org." + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "DĖMESIO: ši aMule versija yra pasenusi: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "Naudojate naują aMule versiją." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Nepavyko atsiųsti versijos tikrinimo failo" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Prisijungta prie %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Jungiamasi prie %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Atsijungta nuo ED2K" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kademlia paleista." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kademlia sustabdyta." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Prisijungta prie Kademlia" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Prisijungta prie Kademlia (už ugniasienės)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Atsijungta nuo Kademlia" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"Nepavyks prisijungti prie Kademlia tinklo, jei parinktyse yra išjungtas UDP " +"prievadas." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Kademlia tinklas išjungtas parinktyse, ryšys nebus užmezgamas." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "Nepavyko draugų sąrašo failo emfriends.met atverti skaitymui!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "Nepavyko draugų sąrašo failo emfriends.met atverti rašymui!" + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "Kol kas neleidžiama atnaujinti server.met failo nutolusiu būdu." + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "Perskaityti %u Kad kontaktus" +#~ msgstr[1] "Perskaityti %u Kad kontaktus" +#~ msgstr[2] "Perskaityti %u Kad kontaktus" + +#~ msgid "Disconnect from " +#~ msgstr "Atsijungti nuo " + +#~ msgid "current server" +#~ msgstr "dabartinis serveris" + +#~ msgid " and " +#~ msgstr " ir " + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "Atsijungti nuo bet kurio serverio ir/ar Kademlia tinklo" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "TCP Flags" +#~ msgstr "TCP žymės" + +#~ msgid "UDP Flags" +#~ msgstr "UDP vėliavėlės" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "Kopijuoti ED2K nuorodas į laikiną talpyklę" + +#~ msgid "Client requests %u" +#~ msgstr "Naudotojas užklausė %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "Failo blokas %u-%u (%d baitų):" + +#~ msgid "Client request is invalid!" +#~ msgstr "Naudotojo užklausa neteisinga!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "Naudotojo užklausa neteisinga! %i / %i" + +#~ msgid "Command: %s" +#~ msgstr "Komanda: %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "Nepavyko atverti %s failo – bus naudojamas %s failas." + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "Dėmesio: known.met neegzistuoja." + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles: iš dalinamų aplankų sąrašo pašalinamas %" +#~ "s: aplankas nerastas." + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "Laukiama ar korektiškai paprogramė baigs darbą" + +#~ msgid "" +#~ "You cannot connect to a release version from an arbitrary CVS version! " +#~ "*sigh* possible crash prevented" +#~ msgstr "" +#~ "Pisijungti prie pagrindinės versijos leidimo iš CVS versijos nepavyks! " +#~ "Atsikvėpkime, išvengta galimo programos lūžimo!" + +#~ msgid "doesn't work" +#~ msgstr "neveikia" + +#~ msgid "remote gui" +#~ msgstr "nutolusi grafinė aplinka" + +#~ msgid "" +#~ "Error: Failed to load backup file. Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Klaida: nepavyko įkelti atsarginio failo. Pasiskaitykite diskusijų " +#~ "svetainėje http://forum.amule.org apie part.met failo atstatymo būdus." + +#~ msgid "" +#~ "Error: Backup part.met file is 0 size! Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Klaida: atsarginio part.met failo dydis yra 0! Pasiskaitykite diskusijų " +#~ "svetainėje http://forum.amule.org apie part.met failo atstatymo būdus." + +#~ msgid "Error: part.met backup file is 0 size: %s ==> %s" +#~ msgstr "Klaida: part.met atsarginio failo dydis yra 0: %s ==> %s" + +#~ msgid "" +#~ "Note: These values are\n" +#~ " only used for statistics." +#~ msgstr "" +#~ "Dėmesio! Šie duomenys naudojami\n" +#~ "tik statistikos grafiko brėžimui." + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ "Visoms sistemoms tinkantis p2p klientas sukurtas eMule pagrindu\n" +#~ "\n" +#~ " Svetainė: http://www.amule.org \n" +#~ " Diskusijos: http://forum.amule.org \n" +#~ " Dažniausiai užduodami klausimai: http://wiki.amule.org \n" +#~ "\n" +#~ " Kontaktai: admin@amule.org (dėl administravimo sutrikimų) \n" +#~ " Autorinės teisės 2003-2006 aMule komanda \n" +#~ "\n" +#~ " Dalis programos sukurta naudojantis \n" +#~ " Kademlia: p2p maršrutizavimas, paremtas XOR metrika.\n" +#~ " Autorinės teisės 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "Dėmesio! Gavote žemą ID!" + +#~ msgid "This command requieres an argument. Valid arguments: a file hash.\n" +#~ msgstr "Šiai komandai reikia kintamojo. Tinkami kintamieji: failo maiša.\n" + +#~ msgid "Deprecated command, now 'Status'." +#~ msgstr "Pasenusi komanda, dabar „Būsena“." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Status' instead.\n" +#~ msgstr "" +#~ "Ši komanda pasenusi ir ateityje gali būti pašalinta.\n" +#~ "Vietoje jos naudokite „Būsena“.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter'." +#~ msgstr "Pasenusi komanda, dabar „Nurodyti IP filtro parinktis“." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter' instead.\n" +#~ msgstr "" +#~ "Ši komanda pasenusi ir ateityje gali būti pašalinta.\n" +#~ "Vietoje jos naudokite „Nurodyti IP filtro parinktis“.\n" + +#~ msgid "Deprecated command, now 'Get IPFilter Level'." +#~ msgstr "Pasenusi komanda, dabar „Pateikti IP filtro lygmenį“." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Ši komanda pasenusi ir ateityje gali būti pašalinta.\n" +#~ "Vietoje jos naudokite „Pateikti IP filtro lygmenį“.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter Level'." +#~ msgstr "Pasenusi komanda, dabar „Nurodyti IP filtro lygmenį“." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Ši komanda pasenusi ir ateityje gali būti pašalinta.\n" +#~ "Vietoje jos naudokite „Nurodyti IP filtro lygmenį“.\n" + +#~ msgid "Deprecated command, now 'Get/Set IPFilter Level'." +#~ msgstr "Pasenusi komanda, dabar „Pateikti/nurodyti IP filtro lygmenį“." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get/Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Ši komanda pasenusi ir ateityje gali būti pašalinta.\n" +#~ "Vietoje jos naudokite „Pateikti/nurodyti IP filtro lygmenį“.\n" + +#~ msgid "Deprecated command, now 'Show Servers'." +#~ msgstr "Pasenusi komanda, dabar „Rodyti serverius“." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Show Servers' instead.\n" +#~ msgstr "" +#~ "Ši komanda pasenusi ir ateityje gali būti pašalinta.\n" +#~ "Vietoje jos naudokite „Rodyti serverius“.\n" + +#~ msgid "Deprecated command, now 'Get BwLimits'." +#~ msgstr "Pasenusi komanda, dabar „Pateikti kanalo apribojimus“." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get BwLimits' instead.\n" +#~ msgstr "" +#~ "Ši komanda pasenusi ir ateityje gali būti pašalinta.\n" +#~ "Vietoje jos naudokite „Pateikti kanalo apribojimus“.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Up'." +#~ msgstr "Pasenusi komanda, dabar „Nurodyti išsiuntimo kanalo apribojimus“." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Up' instead.\n" +#~ msgstr "" +#~ "Ši komanda pasenusi ir ateityje gali būti pašalinta.\n" +#~ "Vietoje jos naudokite „Nurodyti išsiuntimo kanalo apribojimus“.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Down'." +#~ msgstr "Pasenusi komanda, dabar „Nurodyti atsiuntimo kanalo apribojimus“." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Down' instead.\n" +#~ msgstr "" +#~ "Ši komanda pasenusi ir ateityje gali būti pašalinta.\n" +#~ "Vietoje jos naudokite „Nurodyti atsiuntimo kanalo apribojimus“.\n" + +#~ msgid "Syncronization thread started." +#~ msgstr "Sinchronizavimo gija paleista." + +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "Žinomų failų maišos funkcijos įkeltos." + +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "Skaitant Kad kontaktus įvyko klaida – įrašų nėra" + +#~ msgid "Merge attempt" +#~ msgstr "Bandymas įkelti" + +#~ msgid "Recursive merge" +#~ msgstr "Įkelti rekursyviai" + +#~ msgid "Sucessful merge!" +#~ msgstr "Įkelta sėkmingai!" + +#~ msgid "No merge possible" +#~ msgstr "Įkelti negalima" + +#~ msgid "Buddy address: " +#~ msgstr "Draugo adresas:" + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid " %d" +#~ msgstr " %d" + +#~ msgid ".%d" +#~ msgstr ".%d" + +#~ msgid "Shows the process of a search." +#~ msgstr "Rodyti paieškos proceso indikatorių." + +#~ msgid "Shows the process of a search..\n" +#~ msgstr "Rodyti paieškos proceso indikatorių.\n" + +#~ msgid "Search warning." +#~ msgstr "Dėmesio." + +#~ msgid "Client Identification:" +#~ msgstr "Kliento identifikavimas:" + +#~ msgid "Use Secure Identification" +#~ msgstr "Naudoti saugų identifikavimą" + +#~ msgid "" +#~ "Secure Identification uses a handshake approch to safely identify clients " +#~ "for use with the credit system." +#~ msgstr "" +#~ "Saugus identifikavimas naudodamas pasisveikinimo metodą saugiai " +#~ "identifikuoja klientus kreditavimo sistemai." + +#~ msgid "Sources Dropping" +#~ msgstr "Šaltinių atmetimas" + +#~ msgid "Source Dropping" +#~ msgstr "Šaltinių atmetimas" + +#~ msgid "Keep sources" +#~ msgstr "Pasilaikyti" + +#~ msgid "Drop sources" +#~ msgstr "Atmesti" + +#~ msgid "Send sources to any other file before dropping (High CPU)" +#~ msgstr "" +#~ "Prieš atmetant šaltinius, persiųsti kitiems failams (apkraunamas " +#~ "procesorius)" + +#~ msgid "Sources with no needed file-parts." +#~ msgstr "Šaltiniai su nereikalingomis failų dalimis." + +#~ msgid "Full Queue Sources Handling" +#~ msgstr "Šaltiniai, kurių eilės pilnos" + +#~ msgid "Enable auto drop Full Queue Sources" +#~ msgstr "Automatiškai atmesti šaltinius, kurių eilės pilnos" + +#~ msgid "High Queue Rating Sources Handling" +#~ msgstr "Šaltiniai, kurių eilės aukšto reitingo" + +#~ msgid "Enable auto drop High Queue Rating Sources" +#~ msgstr "Automatiškai atmesti šaltinius, kurių eilės aukštais reitingais" + +#~ msgid "High Queue Rating value" +#~ msgstr "Nurodykite per aukštą eilės reitingą" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(Nuo 300 iki 3000)" + +#~ msgid "Auto Drop Sources Timer" +#~ msgstr "Automatinio šaltinių atmetimo periodas" + +#~ msgid "Timer (in secs)" +#~ msgstr "Periodas (sekundėmis)" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(Nuo 60 iki 3600)" + +#~ msgid "Drop No Needed Sources now" +#~ msgstr "Atmesti nereikalingus šaltinius dabar pat" + +#~ msgid "Drop Full Queue Sources now" +#~ msgstr "Atmesti šaltinius, kurių eilės pilnos, dabar pat" + +#~ msgid "Drop High Queue Rating Sources now" +#~ msgstr "Atmesti šaltinius, kurių eilės aukšto reitingo, dabar pat" + +#~ msgid "Clean Up Sources now (NNS, FQS && HQRS)" +#~ msgstr "" +#~ "Išvalyti šaltinius dabar pat (nereikalingus, pilnomis eilėmis ir aukšto " +#~ "reitingo)" + +#~ msgid "English (U.S.)" +#~ msgstr "English (U.S.)" + +#~ msgid "Spanish (Mexican)" +#~ msgstr "Spanish (Mexican)" diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 00000000..225d6b84 --- /dev/null +++ b/po/nl.po @@ -0,0 +1,7547 @@ +# aMule i18n resource file. +# Copyright (C) 2004 aMule Team +# This file is distributed under the same license as the PACKAGE package. +# Kry , 2004. +# Oliver Heesakkers , 2007 +# +msgid "" +msgstr "" +"Project-Id-Version: aMule CVS\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2008-02-28 15:04+0100\n" +"Last-Translator: Frank van der Loo \n" +"Language-Team: aMule Team \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "U moet een niet-leeg wachtwoord opgeven." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Ongeldig wachtwoord, geen MD5 hash!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Verbindingsfout" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "EV Verbinding Mislukt: Leeg antwoord." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "ExterneVerb: Toegang geweigerd omdat: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "ExterneVerb: Toegang geweigerd" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "ExterneVerb: Slecht antwoord van server. Verbinding verbroken." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Succes! Verbinding gemaakt met aMule " + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Gelukt! Verbinding gemaakt." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Hashen" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Voltooien" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Compleet" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Gepauzeerd" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Foutief" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Downloaden" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Wachten" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Begonnen met het maken van MD4 en AICH hash voor bestand: %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Begonnen met het maken van MD4 hash voor bestand: %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Begonnen met het maken van AICH hash voor bestand: %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "Oude AICH hashsets in '%s' worden omgezet in 64b in '%s'." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" +"WAARSCHUWING: De bestandsnaam '%s' is ongeldig en is gewijzigd in '%s'." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "" +"WAARSCHUWING: Het bestand '%s' bestaat al, bestandsnaam van nieuw bestand " +"gewijzigd in '%s'." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" +"WAARSCHUWING: Kon origineel '%s' niet verwijderen na het maken van backup" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "WAARSCHUWING: Kon %s niet verwijderen" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Kon gedeelde bestanden niet ontvangen van gebruiker '%s'" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Onbekend" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (Nep eMule versie %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (Nep eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (Nep eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (gebaseerd op eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "BijNaam: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, c-format +msgid "Requested: %s\n" +msgstr "" + +#: src/BaseClient.cpp:1878 +#, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +msgstr[1] "" + +#: src/BaseClient.cpp:1881 +#, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +msgstr[1] "" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Aangevraagd bestand is onbekend" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "Client %s op IP:Poort %s:%d gebruikt %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Gebruikersnaam" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Vrienden" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Laat &Details Zien" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Voeg een vriend toe" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Verwijder Vriend" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Verstuur &Message" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Bekijk Bestanden" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Maak Vriendenplaats" + +#: src/FriendListCtrl.cpp:273 +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "" + +#: src/FriendListCtrl.cpp:275 +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Annuleren" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"U kunt maximaal ??n vriendenslot instellen.\n" +" Slechts één slot is toegekend." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Meerdere selectie" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Bestandsnaam" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Grootte" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Type" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Prioriteit" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "BestandsID" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Aanvragen" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Geaccepteerde Aanvragen" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Overgebrachte Data" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Deelverhouding" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Ontvangen Delen" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Complete Bronnen" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Directory Pad" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Gedeelde Bestanden" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Heel laag" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Laag" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normaal" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Hoog" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Heel Hoog" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Vrijgeven" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Auto" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Voeg Commentaar/Waardering toe" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Bewerk Commentaar/Waardering" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Hernoemen" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Voeg bestanden in verzameling toe aan overdrachtenlijst" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Kopieer magnet &URI naar klembord" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Kopieer ED2k &link naar klembord" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Kopieer ED2k link naar klembord (&Source)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "Kopieer ED2k link naar klembord (Bron) (&With Crypt options)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Kopieer ED2k link naar klembord (&Hostnaam)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "Kopieer ED2k link naar klembord (Hostnaam) (Met &Crypt opties)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Kopieer ED2k link naar klembord (&AICH info)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Kopieer feedback naar klembord" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "U heeft een Hoog ID nodig om een geldige bronlink te maken" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Waarschuwing" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Gedeelde Bestanden (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[PartBestand]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Voer een nieuwe naam voor dit bestand in:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Naam wijzigen" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Verder gaan met uploads van bestand: %s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Stoppen van upload van bestand: %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: zoekwoord te kort" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Fout: Kan niet luisteren op TCP poort." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "Aanvraag mislukt met de volgende fout: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "Aanvraag mislukt met een onbekende fout." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "Indexbestand niet gevonden: " + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Kan web socket thread niet aanmaken\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Web Server: Gestart\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Sessie verlopen - login wordt aangevraagd\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Sessie ok, ingelogd\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Sessie ok, niet ingelogd\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Geen sessie geopend - login wordt aangevraad\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Sessie aangemaakt - login wordt aangevraagd\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Aanvraag wordt verwerkt [origineel]: " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Controleren van wachtwoord\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Wachtwoordhash ongeldig\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Wachtwoord ok\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Wachtwoord fout\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "" +"U heeft geen wachtwoord ingevoerd. Een leeg wachtwoord is niet toegestaan.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Loguit aangevraagd\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Aanvraag wordt verwerkt [omgeleid]: " + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Laadt template " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Webserver HTTP poort" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Gebruik UPnP port forwarding voor webserverpoort" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "UPnP poort" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Gebruik gzip compressie" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Volledige toegang wachtwoord voor webserver" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Gast wachtwoord voor webserver" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Sta gast toegang toe" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Weiger gast toegang" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "Laad/bewaar webserver instellingen van/naar aMule op afstand" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "aMule config bestand pad. NIET DIRECT GEBRUIKEN!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "Schakel PHP interpreter uit (verouderd)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Compileer PHP pagina's opnieuw bij elke aanvraag" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "aMule Web Server" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Niet beschikbaar" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Nooit" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Downloaden..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Voorkeuren" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "Directory die het bestand amulesig.dat bevat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Bladeren" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Voer hier de directory in waar uw amulesig.dat bestand is" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Tijd tussen de verversingen in seconden" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Genereer een status figuur bij elke verversing" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "" +"Voer hier de directory in waar u het statistieken figuur wilt laten genereren" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Upload uw status figuur regelmatig naar een FTP server" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "FTP Url" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "FTP Pad" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Voer hier de URL in van uw FTP server" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" +"Voer hier de directory in waar uw status figuur op de FTP server moet komen" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Gebruiker" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Wachtwoord" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Voer hier de Gebruikersnaam in om in te loggen op uw FTP server" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Voer hier het Wachtwoord in om in te loggen op uw FTP server" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "Tijd tussen de FTP updates in minuten" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Controleer" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Directory die uw handtekening bestand bevat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Directory waar het statistieken figuur gegenereerd moet worden" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i dag(en) %i u(u)r(en) %i min %i s" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxcas, aMule Online Statistieken" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Welkom!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Maximum DL snelheid sinds wxCas draait" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "Absolute Maximum DL snelheid tijdens vorige keren dat wxCas draaide" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Leegmaken" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "Systeem" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Stop Auto Verversen" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Bewaar Online Statistieken figuur" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Print Online Statistieken figuur" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Voorkeur instellingen" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "Over wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Begin Auto Verversen" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Auto Verversen gestopt" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Auto Verversen gestart" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Bewaar Statistieken FIguur" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Geen afhandelaar voor dit bestandstype." + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "Bestand was niet bewaard" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "aMule Online Statistieken" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Er was een probleem tijdens het printen.\n" +"Misschien is uw printer niet goed ingesteld?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Aan het printen" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, aMule OnLine Handtekening Statistieken\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Gebaseerd op CAS van Pedro de Oliveira \n" +"\n" +"Verspreid onder de GPL" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Oh oh, aMule draait niet..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule draait" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule draait, maar niet verbonden" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule maakt verbinding..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Oh Oh, aMule status is onbekend..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " draait " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " is gestopt !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " is niet verbonden !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " is aan het verbinden..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " doet iets raars, controleer het !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " is verbonden met " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "ok" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "firewalled" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "uit" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " is aan " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +msgid " with " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Totale Download: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Upload: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Sessie Download: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Download: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s, Upload: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +msgid " kB/s" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Deelt: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " bestand(en), Clients in wachtrij: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Tijd: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr "aan" + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Gemiddelde Systeem Belasting (1-5-15 min): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Systeem uptime: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uD %02uu %0umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uu %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "Hoog ID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "Laag ID" + +# msgstr "Verbinden" +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Niet verbonden" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +msgid "Cancelled !" +msgstr "" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Kon %s niet openen" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "Het bestand %s is te groot voor de Donkey: maximum toegestaan is 4 GB." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Invoer parameters" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Bestand om te Hashen" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Voeg Optionele URLs toe aan dit bestand" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Voer hier het bestand in waarvan u de Ed2k link wilt laten berekenen" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Voer hier de URL in die u wilt toevoegen aan de Ed2k link: Voeg / toe aan " +"het eind om aLinkCreator de huidige bestandsnaam toe te laten voegen" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Toevoegen" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Verwijder" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Wissen" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Maak link met deel-hashes" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Help om nieuwe en zeldzame bestanden sneller te verspreiden, ten koste van " +"een verhoogde link grootte" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "MD4 BestandsHash" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "Ed2k BestandsHash" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "Ed2k link" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Start" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Bewaar" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Kopieer naar klembord" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Afsluiten" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Open een bestand om zijn ed2k link te berekenen" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Kopieer berekende ed2k link naar klembord" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Bewaar berekende ed2k link naar bestand" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "Over aLinkCreator" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Selecteer het bestand waarvan u de ed2k link wilt laten berekenen" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "Er is nu niets om te kopiëren !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Selecteer het bestand voor uw berekende ed2k link" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Kon niet openen " + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Voer a.u.b. een niet lege bestandsnaam in" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "Er is nu niets om te bewaren !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, de aMule ed2k link maker\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps van http://www.everaldo.com en http://www.icomania.com\n" +"en http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Verspreid onder de GPL" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Hashen..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Gedaan in %.2f s" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "U heeft deze URL al toegevoegd !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Voer a.u.b. een niet lege URL in" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "Bestand nummer %u wordt verwerkt: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "" +"U heeft om deel hashes gevraagd (Alleen gebruikt voor bestanden > 9,5 MB)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Even geduld aub..." + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> Niet bestaand bestand !\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, de aMule ed2k link maker" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Auto [La]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Auto [No]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Auto [Ho]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Aan het verbinden" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Vragend" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Verbinden via server" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Wachtrij vol" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "In wachtrij" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Overdragen" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Ontvangen van hash set" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Geen benodigde delen" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Kan Laag ID niet verbinden met Laag ID" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Te veel verbindingen" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Verbinding maken via Kad" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Te veel Kad verbindingen" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Geband" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "VerbindingsFout" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Wachtrij op Afstand Vol" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "Oude MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "Nieuwe MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "eMule Compatible" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Lokale Server" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Server op Afstand" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Bron uitwisseling" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Passief" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Link" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Bron Seeds" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Systeem standaard" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Arabisch" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Baskisch" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Bulgaars" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Catalaans" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Chinees (Versimpeld)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Chinees (Traditioneel)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Kroatisch" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Deens" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Nederlands" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Engels (V.K.)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Estonisch" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Fins" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Frans" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Gallisch" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Duits" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Hongaars" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Italiaans" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Italiaans (Zwitsers)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Koreaans" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "Litouws" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "Noors" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Pools" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portugees" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Portugees (Braziliaans)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Russisch" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Sloveens" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Spaans" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "Zweeds" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Turks" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Kon geselecteerde browser niet bepalen!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" +"TCP poort kan niet hoger zijn dan 65532 omdat de server UDP poort de TCP " +"poort + 3 is" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Standaard poort zal worden gebruikt (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Servernaam" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Adres" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Poort" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Beschrijving" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Gebruikers" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Bestanden" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Mislukt" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Statisch" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Versie" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"U bent verbonden met een server die u probeert te verwijderen. Verbreek de " +"verbinding eerst aub. De server is NIET verwijderd." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Info" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(Onbekende naam)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Weet u zeker dat u de statische server %s wilt verwijderen" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Ja" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Nee" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Kon '%s' niet openen" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Servers (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Server" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Verbind met server" + +#: src/ServerListCtrl.cpp:428 +msgid "Mark server as static" +msgstr "" + +#: src/ServerListCtrl.cpp:429 +msgid "Mark server as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:431 +msgid "Mark servers as static" +msgstr "" + +#: src/ServerListCtrl.cpp:432 +msgid "Mark servers as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:438 +msgid "Remove server" +msgstr "" + +#: src/ServerListCtrl.cpp:440 +msgid "Remove servers" +msgstr "" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Verwijder alle servers" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Kopieer ED2k link naar klembord" + +#: src/ServerListCtrl.cpp:449 +msgid "Copy ED2k links to clipboard" +msgstr "" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Verbind opnieuw met server" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Weet u zeker dat u alle servers wilt verwijderen?" + +#: src/ServerListCtrl.cpp:570 +msgid "Are you sure that you wish to delete the selected server?" +msgstr "" + +#: src/ServerListCtrl.cpp:572 +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Uitgeschakeld [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "Dit is aMule %s gebaseerd op eMule." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "Draaiend op %s" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" +"Bezoek http://www.amule.org om te zien of een nieuwe versie beschikbaar is." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Fatale Fout: Kon Timer niet aanmaken" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "aMule controle op afstand " + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Snapshot:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr "" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr "" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Bericht" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Status text" + +#: src/amuleDlg.cpp:666 +msgid "ED2K: Connecting" +msgstr "" + +#: src/amuleDlg.cpp:670 +msgid "ED2K: Disconnected" +msgstr "" + +#: src/amuleDlg.cpp:676 +msgid "Kad: Firewalled" +msgstr "" + +#: src/amuleDlg.cpp:680 +msgid "Kad: Connected" +msgstr "" + +#: src/amuleDlg.cpp:685 +msgid "Kad: Connecting" +msgstr "" + +#: src/amuleDlg.cpp:689 +msgid "Kad: Off" +msgstr "" + +#: src/amuleDlg.cpp:718 +msgid "Stop the current connection attempts" +msgstr "" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Verbreek" + +#: src/amuleDlg.cpp:722 +msgid "Disconnect from the currently connected networks" +msgstr "" + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Verbinden" + +#: src/amuleDlg.cpp:726 +msgid "Connect to the currently enabled networks" +msgstr "" + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Up: %.1f(%.1f) | Down: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Up: %.1f | Down: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | Verbonden)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | Niet Verbonden)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Wilt u aMule echt afsluiten?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Afsluit bevestiging" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Kon het commando om de browser te starten niet bepalen." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "Skindirectory '%s' bestaat niet" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "Waarschuwing: Kon skinbestand '%s' niet openen om te lezen" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Netwerken" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Netwerken Venster" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Zoeken" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Zoekvenster" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Overdrachten" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Bestands Overdrachten Venster" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Gedeelde Bestanden Venster" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Berichten" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Berichten Venster" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Statistieken" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Statistieken Venster (Grafieken)" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Voorkeuren Instellingen Venster" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Importeer" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "Het partbestand importeer programma" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "Over" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "Over/Help" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Algemeen" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Verbinding" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Proxy" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Bericht Filter" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Besturing op Afstand" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Online Handtekening" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Directories" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Beveiliging" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "GUI Tweaks" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Kern Instellingen" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Gebeurtenissen" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Debugging" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Handmatig Gekozen" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"aMule moet opnieuw gestart worden om deze veranderingen toe te passen:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- TCP poort veranderd.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- UDP poort veranderd.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"Uw Auto-update servers lijst is leeg.\n" +"'Auto-update serverlijst bij het opstarten' zal worden uitgeschakeld." + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"U hebt externe verbindingen ingeschakeld maar geen wachtwoord ingesteld.\n" +"Externe verbindingen kunnen niet ingeschakeld worden tenzij een geldig " +"wachtwoord is ingesteld." + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- Taal veranderd.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- Temp directory veranderd.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Up: 0.0 | Down: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"Zowel het ED2K als het Kad netwerk zijn uitgeschakeld.\n" +"U kun niet verbinden tot u minimaal een netwerk inschakelt." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"Kad zal niet starten als uw UDP poort is uitgeschakeld.\n" +"Schakel de UDP poort in of schakel Kad uit." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"U MOET aMule nu opnieuw starten.\n" +"Als u dat niet doet moet u niet klagen als er iets misgaat.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "WAARSCHUWING" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"Uw Auto-update servers lijst is leeg.\n" +"Vul a.u.b. minimaal een URL naar een geldig server.met bestand in.\n" +"Klik op de knop \"Lijst\" hiernaast om een URL in te voeren." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "Tijdelijke bestanden" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Binnenkomende bestanden" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Online Handtekeningen" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Kies een directory voor %s" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Blader wav" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "Bestand wav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Blader naar videospeler" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Selecteer browser" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Uitvoerbare%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Serverlijst bewerken" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Voeg hier URL's toe om server.met bestanden te downloaden.\n" +"Slechts een url per regel." + +#: src/PrefsUnifiedDlg.cpp:980 +#, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:987 +#, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Verbindingen Grafiek Schaal: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Server verbinding verversingstijd: Uitgeschakeld" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Voer commando uit bij gebeurtenis `%s'" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Schakel uitvoeren van commando's in kern in" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Kern commando:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Schakel uitvoeren van commando's in GUI in" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "GUI commando:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "De volgende variabelen worden vervangen:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Poging tot ongeautoriseerde toegang. Verbinding gesloten." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Externe verbinding gesloten." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "Externe verbindingen uitgeschakeld vanwege leeg wachtwoord!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "Externe verbindingen uitgeschakeld in config bestand" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Nieuwe externe verbinding geaccepteerd" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "Fout: kon nieuwe externe verbinding niet accepteren" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "Externe verbinding geweigerd vanwege leeg wachtwoord bij voorkeuren!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "Client verbinden: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Onbekende versie" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"Incorrecte EV versie ID, mogelijk niet compatible. Gebruik kern en op " +"afstand van dezelfde snapshot." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "Authenticatie mislukt." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Ongeldige protocol versie." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Ontbrekend protocol versielabel." + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Ongeldig verzoek, u moet u eerst authenticeren." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Toegang verleend." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" +"PartBestands commando op afstand mislukt: BestandsHash niet gevonden: %s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "BestandsHash niet gevonden: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "OEPS! OpCode verwerkingsfout!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Server niet toegevoegd" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "server niet gevonden: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "moet de te verwijderen server defini?ren" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "ED2K is uitgeschakeld in voorkeuren." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "Bezig met zoeken. Haal de resultaten op over een momentje!" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "WebSearch vanaf afstand is zinloos." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad is uitgeschakeld in voorkeuren." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Geen punten voor grafiek." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "Uw client is niet geconfigureerd voor dit niveau van details." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "ExterneVerb: afsluiten aangevraagd" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Al bezig met afsluiten." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "ExterneVerb: link '%s' wordt toegevoegd." + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Ongeldige link of al op de lijst." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "Bestand niet gevonden." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Ongeldige bestandsnaam." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Kon naam van bestand niet wijzigen." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Al verbonden met ED2K." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Verbinding met ED2K wordt gemaakt..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Al verbonden met Kad." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Verbinding met Kad wordt gemaakt..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Alle netwerken zijn uitgeschakeld." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Verbinding met ED2K verbroken." + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Verbinding met Kad verbroken." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "ExterneVerb: ongeldige opcode ontvangen: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "Ongeldige opcode (verkeerde protocol versie?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" +"Kon bestand niet openen (%s), wordt verwijderd uit de lijst van gedeelde " +"bestanden." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "Hashset opgevraagd voor onbekend bestand: %s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "Commando `%s' met pid `%d' is be?indigd met statuscode `%d'." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "Server niet toegevoegd: Geen IP of hostnaam opgegeven." + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "Server niet toegevoegd: Ongeldige server-poort opgegeven." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "ED2K Status:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Verbonden" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Poort" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Kademlia Status:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Draaiende" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Status:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Niet verbonden" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Verbindingsstatus:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Firewalled" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "OK" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Firewalled status: " + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Verbonden met buddy" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "Geen buddy" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Gemiddelde Gebruikers:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "Gemiddelde Bestanden:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "Niet draaiende" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Uptime: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Overdracht" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Uploads" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Geuploade Data (Sessie (Totaal)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Totale Overhead (Pakketten): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Bestand Aanvraag Overhead (Pakketten): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "Bron Uitwisseling Overhead (Pakketten): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Server Overhead (Pakketten): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Kad Overhead (Pakketten): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Actieve Uploads: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Wachtende Uploads: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Totaal van succesvolle upload sessies: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Totaal van mislukte upload sessies: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Gemiddelde upload tijd: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Downloads" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Gedownloade Data (Sessie (Totaal)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Gevonden Bronnen: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Actieve Download (blokken): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Sessie UL:DL Verhouding (Totaal): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Gemiddelde Downloadsnelheid (Sessie): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Gemiddelde Uploadsnelheid (Sessie): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Max Downloadsnelheid (Sessie): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Max Uploadsnelheid (Sessie): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Hernieuwde verbindingen: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Tijd Sinds Eerste Overdracht: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Verbonden Met Server Sinds: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Actieve Verbindingen (schatting): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Max Verbinding Grens Bereikt: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Gemiddelde Verbindingen (schatting): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Aantal Piek Verbindingen (schatting): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Clients" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Gefilterd" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Totaal: %i Bekend: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Servers" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Werkende Servers: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Mislukte Servers: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Totaal: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Verwijderde Servers: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Gefilterde Servers: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Gebruikers op Werkende Servers: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "Bestanden op Werkende Servers: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Totaal Gebruikers: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "Totaal Bestanden: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Server Bezetting: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Aantal Gedeelde Bestanden: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Totale grootte van Gedeelde Bestanden: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Gemiddelde bestandsgrootte: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "Laag ID: %u (%.2f%% Totaal %.2f%% Bekend)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "SecIdent Aan/Uit: %u (%.2f%%) : %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Besturingssysteem" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "Niet Ontvangen" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Knippen" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Kopiëren" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Plakken" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Alles Selecteren" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "Kad zoekopdracht kan niet worden uitgevoerd als Kad niet draait" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "ED2K zoekopdracht kan niet worden uitgevoerd als ED2K niet draait" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Onverwachte fout bij Kad zoekopdracht: " + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "Bericht van '%s' gefilterd (IP:%s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "Nieuw bericht van '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "Gebruiker %s (%u) vroeg uw gedeeldebestanden-lijst op -> Geaccepteerd" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "Gebruiker %s (%u) vroeg uw gedeeldebestanden-lijst op -> Geweigerd" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "Gebruiker %s (%u) vroeg uw gedeeldedirectories-lijst op -> Toegestaan" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "Gebruiker %s (%u) vroeg uw gedeeldedirectories-lijst op -> Geweigerd" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"Gebruiker %s (%u) vroeg uw gedeeldebestanden-lijst van directory %s op -> " +"geaccepteerd" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"Gebruiker %s (%u) vroeg uw gedeeldebestanden-lijst van directory %s op -> " +"geweigerd" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "Gebruiker %s (%u) deelt directory %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "Gebruiker %s (%u) stuurde niet-opgevraagde gedeelde dirs." + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "Gebruiker %s (%u) stuurde gedeeldebestanden-lijst van directory %s" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "Gebruiker %s (%u) heeft gedeeldebestanden-lijst gestuurd" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "Gebruiker %s (%u) stuurde ongewild gedeeldebestanden-lijst" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" +"Gebruiker %s (%u) weigerde toegang tot gedeelde directories/bestanden lijst" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Nodes (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "Ongeldig ip om van te bootstrappen" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Ongeldige poort om van te bootstrappen" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Vul a.u.b. alle benodigde velden in" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Weet u zeker dat u een nieuw nodes.dat bestand wilt downloaden?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" +"Dat zal uw huidige nodes verwijderen en de Kademlia verbinding opnieuw " +"starten." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Verder gaan?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Fout: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Waarschuwing: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Voeg een Vriend toe" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "U moet een geldig IP adres en poortnummer invoeren!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Informatie" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "De aangegeven userhash is niet geldig!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Bronnen" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Bestand" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Download" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Categorie" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Standaard" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Download in categorie" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "Zoek gelijkwaardige bestanden (ED2k, lokale server)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Verbind met amule op afstand" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Verbinding mislukt " + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Fout" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"WAARSCHUWING: U kunt uzelf niet toevoegen als bron voor een ed2k link " +"terwijl u een laag id hebt." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Gebruikers: E: %s K: %s | Bestanden E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Alle" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Totaal Gebruikers: %s | Totaal Bestanden: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Overgebracht" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Compleet" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Snelheid" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Voortgang" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Status" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Overgebleven Tijd" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Laatst Compleet Gezien" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Laatste Overdracht" + +#: src/DownloadListCtrl.cpp:578 +msgid "Are you sure that you wish to delete the selected file?" +msgstr "" + +#: src/DownloadListCtrl.cpp:580 +msgid "Are you sure that you wish to delete the selected files?" +msgstr "" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Verstuur bericht naar gebruiker" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Bericht om te versturen:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Stop" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Pauzeer" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "Ve&rder gaan" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "Verwijder comp&lete" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Wissel elk A4AF nu uit met dit bestand" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Wissel elk A4AF uit met dit bestand (Auto)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Wissel elk A4AF nu uit met de andere bestanden" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Uitgebreide Opties" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Voorbeeld" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Bekijk &details" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Bekijk alle commentaren" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Kopieer magnet URI naar klembord" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "Verwijder toewijzing" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Toewijzen aan catgorie" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "&Open het bestand" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Verwijder uit vriendenlijst" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Voeg toe aan Vrienden" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Verstuur bericht" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Wissel uit naar dit bestand" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "QR: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Al om een ander bestand gevraagd" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Downloads (%i)" + +#: src/DownloadListCtrl.cpp:2222 +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Voorbeeld" + +#: src/DownloadListCtrl.cpp:2260 +#, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "FOUT: Kon part-bestand niet openen" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "FOUT: Kon part-bestand niet aanmaken)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "Proberen backup van met-bestand te laden van %s" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "Fout: Kon part.met bestand niet openen: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "Fout: part.met bestand heeft grootte 0: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "Fout: Ongeldige part.met bestandsversie: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" +"Fout: %s (%s) is beschadigd (verkeerde tagcount), kan bestand niet laden." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "Poging om bestands info te herstellen..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" +"Naamloos bestand herstellen - zal proberen om het te herstellen als " +"RecoverdFile.dat" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" +"Alle beschikbare bestands info hersteld :D - Poging om het te gebruiken..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Kon bestands info niet herstellen :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Kon %s (%s) niet openen" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "Waarschuwing: %s is mogelijk beschadigd (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "FOUT bij het bewaren van partbestand: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "'%s' heeft grootte 0 - %s bestand wordt gebruikt." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "Kon bestand part.met.seeds niet bewaren voor %s" + +#: src/PartFile.cpp:1019 +#, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "Partbestand %s (%s) heeft geen seeds bestand" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "Partbestand %s (%s) heeft een leeg seeds bestand" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "Fout bij het lezen van partbestands seeds bestand (%s - %s): %s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "Compleet deel (%i) gevonden in %s" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "Klaar met opnieuw hashen %s" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "" +"Onverwachte bestandsfout tijdens het voltooien van %s. Bestand gepauzeerd" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Klaar met downloaden: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "Verwijderen van bestand: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" +"Waarschuwing: Kan gedownload deel niet hashen - incomplete hashset voor '%s'" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"Fout: Kan gedownload deel niet hashen - hashset incompleet (%s). Dit zou " +"nooit mogen gebeuren" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "" +"WAARSCHUWING: Niet voldoende vrije schijfruimte! Pauzeren van bestand: %s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "Gedownload deel %i is beschadigd in bestand: %s" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH: Beschadigd deel %i van %s hersteld -> Bespaarde bytes: %s" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Onvoldoende Schijfruimte" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Gestopt" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "Waarschuwing: known.met kan niet geopend worden." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "Waarschuwing: Knownfile lijst beschadigd, bevat ongeldige header." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "IO fout bij het lezen van known.met bestand: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "Fout bij het bewaren van known.met bestand; %s" + +#: src/SharedFileList.cpp:352 +#, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "" +msgstr[1] "" + +#: src/SharedFileList.cpp:358 +#, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "" +msgstr[1] "" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "FOUT: Poging om %s te delen" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Bestand Commentaren" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Waardering" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Commentaar" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Geen commentaren" + +#: src/CommentDialogLst.cpp:104 +#, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"Kon niet verbinden met een geobfusceerde server. Nogmaals proberen zonder " +"obfuscatie." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "Kon niet verbinden met een server in de lijst. Nogmaals proberen." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "ED2K netwerk is uitgeschakeld in voorkeuren, wordt niet mee verbonden." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "Geen geldige servers in serverlijst gevonden" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Verbonden met %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Verbinding gemaakt met: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"Fatale Fout bij het proberen te verbinden. Internet verbinding kan uit zijn" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Verbinding verbroken met %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) lijkt dood te zijn." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) lijkt vol te zijn." + +#: src/ServerConnect.cpp:391 +#, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Verbinding kwijt" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "Verbinden met %s (%s:%i) is mislukt." + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "Fout: Socket ongeldig op timeoutcheck" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "Poging tot verbinden met %s (%s:%i) gaf time out." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Geen part-bestanden gevonden" + +#: src/DownloadQueue.cpp:175 +#, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "" +msgstr[1] "" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Downloaden van %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "U probeert het bestand '%s' al te downloaden" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "U heeft het bestand '%s' al" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "U probeert het bestand %s al te downloaden" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "Kan magnet link niet omzetten naar ed2k: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "Onbekend protocol in link: %s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Ongeldige ed2k link! Fout: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "Voer uit en sluit af." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Ongeldig IP formaat: Gebruik xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" + +#: src/TextClient.cpp:343 +msgid "Processing by hash: " +msgstr "" + +#: src/TextClient.cpp:358 +msgid "Processing by filename: " +msgstr "" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Niet een geldig nummer\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "Geen geldige hash (lengte moet precies 32 tekens zijn)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "Bewerking was succesvol." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "Aanvraag mislukte met de volgende fout: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "IP filteren van clients is %s.\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "UIT" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "AAN" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "IP filteren van servers is %s.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "Huidige IPFilter Level is %d.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Bandbreedte Grenzen: Up: %u kB/s, Down: %u kB/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Verbonden met %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "met Laag ID" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "met Hoog ID" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Aan het verbinden" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Niet verbonden" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Download:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Upload:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Clients in wachtrij:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Totale Bronnen:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Aantal zoekresultaten: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "TODO - toon voortgang van een zoekopdracht" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Ongeldig antwoord van de server ontvangen, OpCode = %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Toon korte status informatie." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "Toon verbindingsstatus, huidige up/download snelheden, etc.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Toon volledige statistieken boom." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"Optioneel kan een getal van 0-255 worden meegegeven als argument aan dit\n" +"commando, wat aangeeft hoeveel ingangen van de client versie subbomen " +"getoond\n" +"moeten worden. 0 of weglaten betekent 'onbegrensd'.\n" +"\n" +"Voorbeeld: 'statistics 5' toont alleen de bovenste 5 versies van elk client " +"type.\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "Sluit aMule af." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Sluit de kern op afstand (amule/amuled) af.\n" +"Dit sluit ook de text client af, omdat die onbruikbaar is zonder een\n" +"draaiende kern.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Laadt gegeven object opnieuw." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "Laadt gedeelde bestanden lijst opnieuw." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "Laadt IP Filter tabel opnieuw uit bestand." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Verbind met het netwerk." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"Dit verbindt met alle netwerken die ingeschakeld zijn in Voorkeuren.\n" +"U kunt ook een server adres in de vorm IP:Poort specificeren om alleen met " +"die\n" +"server te verbinden. Het IP moet een decimaal IPv4 adres met punten zijn,\n" +"of een DNS naam." + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Verbind alleen met ED2K." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Verbind alleen met Kad." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Verbreek verbinding met het netwerk." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "" +"Dit verbreekt de verbinding met alle netwerken waarmee nu verbinding is.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Verbreek alleen verbinding met ED2K." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Verbreek alleen verbinding met Kad." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Voegt een ed2k of magnet link toe aan de kern." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"De toe te voegen ed2k link kan zijn:\n" +"*) een bestandslink (ed2k://|bestand|...), het wordt toegevoegd aan de " +"download wachtrij,\n" +"*) een serverlink (ed2k://|server|...), het wordt toegevoegd aan de " +"serverlijst,\n" +"*) of een serverlijst link, in dat geval worden alle servers in de lijst " +"toegevoegd aan de\n" +" serverlijst.\n" +"\n" +"De magnet link moet de ed2k hash en bestandsgrootte bevatten.\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Stel een voorkeurswaarde in." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "Stel IPFilter voorkeuren in." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "Schakel IP filteren van zowel clients als servers in." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "Schakel IP filteren van zowel clients als servers uit." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "Schakel IP filteren van clients in/uit." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "Schakel IP filteren van clients in." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "Schakel IP filteren van clients uit." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "Schakel IP filteren van servers in/uit." + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "Schakel IP filteren van servers in." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "Schakel IP filteren van servers uit." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "Selecteer IP filter niveau." + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"Geldige filterniveaus zijn in de reeks 0-255, en zijn standaard (initiele)\n" +"waarde is 127.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Stel bandbreedte grenzen in." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "De waarde gegeven aan deze commando's moet in kilobytes/sec zijn.\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Stel upload bandbreedte grens in." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "Stel download bandbreedte grens in." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Verkrijg en toon een voorkeurswaarde." + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "Verkrijg IPFilter voorkeuren." + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "Verkrijg IPFilter status voor zowel clients als servers." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "Verkrijg IPFilter status alleen voor clients." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "Verkrijg IPFilter status alleen voor servers." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "Verkrijg IPFilter niveau" + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Verkrijg bandbreedte grenzen." + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Voert een zoekopdracht uit." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"Een zoektype moet opgegeven worden door het type te geven:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Voorbeeld: 'search kad bestand' voert een kad zoekopdracht uit naar \"bestand" +"\".\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Voert een globale zoekopdracht uit." + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Voert een lokale zoekopdracht uit" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Voert een kad zoekopdracht uit" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Toont de resultaten van de laatste zoekopdracht." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Levert de resultaten van de vorige zoekopdracht op.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Begin met downloaden van een bestand" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"Het nummer van een bestand uit de laatste zoekopdracht moet gegeven worden.\n" +"Voorbeeld: 'download 12' begint het bestand met nummer 12 uit de vorige " +"zoekopdracht te downloaden.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Pauzeer dowload." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Verder gaan met download." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Download annuleren." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Stel downloadprioriteit in." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "Stel prioriteit van een download in op Laag, Normaal, Hoog of Auto.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "Stel prioriteit in op laag." + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "Stel prioriteit in op normaal." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "Stel prioriteit in op hoog." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "Stel prioriteit in op auto." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Toon wachtrij/lijsten." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Toont upload/download wachtrij, server lijst of gedeelde bestanden lijst.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Toon upload wachtrij." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Toon download wachtrij." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Toon log." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Toon servers lijst." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Log leegmaken." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() leverde NULL op" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "Fout: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "Waarschuwing: %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Nieuwe clientid is %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "\tDit komt waarschijnlijk omdat u achter een firewall of router zit." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tVoor meer informatie, bekijk http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "Onbekende server info ontvangen! - te kort" + +#: src/ServerSocket.cpp:539 +#, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Bewaren van server-lijst compleet." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "Server keurde laatste opdracht af" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Fout pakket ontvangen van server: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "Onafgehandelde fout bij het verwerken van pakket van de server: %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "Kan DNS thread niet aanmaken voor het verbinden met %s" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "Server IP %s (%s) is gefilterd. Wordt niet mee verbonden." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "maakt gebruik van protocol obfuscatie." + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "Verbinding wordt gemaakt met %s (%s - %s:%i) %s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "Kan dns niet vinden voor server %s: Kan niet verbinden!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "CIP2Country::CIP2Country(): Kon landengegevens niet laden uit " + +#: src/IP2Country.cpp:73 +#, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "" +msgstr[1] "" + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"Weet u zeker dat u wilt annuleren en alle bestanden in deze categorie " +"verwijderen?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Bevestiging Nodig" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Alle anderen" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Incompleet" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Actief" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Video" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Geluid" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Archief" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "CD-Images" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Plaatjes" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Tekst" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Selecteer filter" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Voeg categorie toe" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Bewerk categorie" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Verwijder categorie" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "Bezig met importeren van %s: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "Tijdelijke map wordt gelezen" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "Basisinformatie van download info bestand wordt opgehaald" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "Doelbestand wordt aangemaakt" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "Data van oud download bestand wordt geladen (%u van %u)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "Data block wordt bewaard in nieuw enkel download bestand (%u van %u)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "Bron downloadbestand informatie wordt opgehaald" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "Download wordt toegevoegd en nieuw partbestand bewaard" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Status wordt opgehaald..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "Bezig" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Fout: Onvoldoende schijfruimte" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Fout: Partmet niet gevonden" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Fout: IO fout!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Fout: Mislukt!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "In Wachtrij" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Wordt al gedownload" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Onbekend of fout tempbestand formaat." + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Bestandsnaam" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Status" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Bestandshash" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Importeer deelbestanden" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"Kies a.u.b. een map om te doorzoeken naar tijdelijke downloads! " +"(onderliggende mappen worden meegenomen)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" +"Wilt u dat de bron bestanden van succesvol ge?mporteerde bestanden " +"verwijderd worden?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Verwijder bronnen?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Wachtend..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (Schijf: %s)" + +#: src/OtherFunctions.cpp:121 +msgid "byte" +msgid_plural "bytes" +msgstr[0] "" +msgstr[1] "" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "" +msgstr[1] "" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "seconden" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "minuten" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "uren" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "Dagen" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Video's" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Archieven" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Teksten" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programma's" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Alles" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Niet beoordeeld" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Onbruikbaar / Beschadigd / Nep" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Matig" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Redelijk" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Goed" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Uitstekend" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "alle" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "alle anderen" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "IP-filters 'ipfilter.dat' en 'ipfilter_static.dat' worden geladen." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "Kon ipfilter.dat bestand '%s' niet laden, onbekend formaat." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "Kon ipfilter.dat bestand '%s' niet laden, kon bestand niet openen." + +#: src/IPFilter.cpp:330 +#, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +msgstr[1] "" + +#: src/IPFilter.cpp:332 +#, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +msgstr[1] "" + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Actieve verbindingen (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Bestandsdetails" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% compleet" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "ED2K Link: " + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Uitvoeren" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" +"Klik hier om de ed2k link in de text control toe te voegen aan uw download " +"wachtrij." + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "Pop-up status tekst" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Laden ..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"Gebeurtenissen worden hier getoond. Voor een complete lijst van " +"gebeurtenissen, bekijk de log in de Servers-tab." + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Aantal gebruikers op de server waar u mee verbonden bent ..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Gebruikers: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" +"Gebruikers verbonden met de huidge server en een schatting van het totale " +"aantal gebruikers." + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"Huidige gemiddelde upload en download snelheden. Indien ingeschakeld geven " +"de getallen tussen haakjes de overhead door client communicatie aan." + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"Toont de verbonden status en actieve overdrachten. Rode pijlen geven aan dat " +"u nu niet verbonden bent, gele pijlen geven aan dat u een laag ID (door " +"firewall) hebt en groene pijlen geven aan dat u een hoog ID (Het optimale " +"verbindingstype) hebt." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Niet Verbonden ..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Server nu mee verbonden." + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Zoeken" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Naam:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Lokaal" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Globaal" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "BestandsHash" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Uitgebreide Parameters" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Filters" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "BestandsType" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Extensie" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Min Grootte" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Bytes" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "kB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Max Grootte" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Beschikbaarheid" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Filter:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Filter Resultaat" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Resultaat Omkeren" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Verberg Bekende Bestanden" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Meer" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "Zoekt naar meer resultaten op ED2K. Werkt nog niet voor Kad." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Stop" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Velden Leegmaken" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Resultaten" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Verwijderd complete downloads" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Toont Upload / Up-wachtrij" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Clients in wachtrij :" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Verstuur" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Verstuurt het gespecificeerde bericht." + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Sluiten" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Sluit deze chat-sessie." + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Volledige Naam :" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "N/B" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "met-Bestand :" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Hash :" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Bestandsgrootte :" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Partbestandsstatus :" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Laatst compleet gezien :" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Gevonden Bronnen :" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Bronnen Overdragen :" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Bestandsdeel-Teller :" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Beschikbaar :" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Datasnelheid :" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Actieve Downloadtijd: " + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Overgedragen :" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Volledige Grootte :" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Intelligente Beschadigings Afhandeling (I.C.H.)" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Verloren door beschadiging :" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Verkregen door compressie :" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "Pakketten gered door I.C.H. :" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "BestandsNamen" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Neem over" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Opruimen" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Toepassen" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Ok" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "" +"Geef bestand commentaar/waardering (Tekst zichtbaar voor alle gebruikers)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"Voor een film kunt u vertellen: de lengte, het verhaal, de taal ...\n" +"en als het nep is kunt u dat de andere gebruikers van aMule vertellen." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Bestands Kwaliteit" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" +"Kies de bestands waardering of adviseer gebruikers als het bestand ongeldig " +"is ..." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Geen commenta(a)r(en)" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Verversen" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Downloaden, geduld aub ..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Onbekende grootte" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Benodigde Informatie" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "IP Adres :" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Poort :" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Extra Informatie" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Gebruikersnaam :" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Gebruikershash :" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Laad uw gedeelde bestanden opnieuw" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Huidige Sessie" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Totaal" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Opgevraagd :" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Actieve Uploads :" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Download-Snelheid" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Huidige" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Lopende gemiddelde" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Sessie gemiddelde" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Upload-Snelheid" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Verbindingen" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Actieve downloads" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Actieve verbinding (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Actieve uploads" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Statistieken Boom" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Gebruikersnaam:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Gebruikershash:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Client software:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Client versie:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "IP adres:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "Gebruikers ID:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "Server IP:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Servernaam:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "Overdrachten naar client" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Huidige aanvraag:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Gemiddelde upload snelheid:" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Gemiddelde download snelheid:" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Geupload (sessie):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Gedownload (sessie):" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Geupload (totaal):" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Gedownload (totaal):" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Scores" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "DL/UP verhouding:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Veilige identiteit:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Waardering (totaal):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Wachtrij score:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Algemene Instellingen" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Bijnaam" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - the Linux Mule" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "Dit is de naam die andere gebruikers zien wanneer ze met u verbinden." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Taal" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "Dit specificeert de taal waarin aMule wordt getoond." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Overige Opties" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Controleer op nieuwe versie bij het starten" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" +"Ingeschakeld zorgt dit ervoor dat aMule bij het starten controleert op een " +"nieuwe versie" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Start geminimaliseerd" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "Als u dit inschakelt zal aMule zichzelf minimaliseren bij het starten." + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Vraag bevestiging bij afsluiten" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "Zorgt ervoor dat aMule om bevestiging vraagt voor af te sluiten." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Schakel Tray Pictogram in" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "Dit schakelt het systeemvak (of taakbalk) pictogram in/uit." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "Minimaliseer naar Systeemvak" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" +"Deze optie zorgt er voor dat aMule geminimaliseerd wordt naar het " +"Systeemvak, i.p.v. naar de taakbalk." + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Tooltip Vertragings Tijd in seconden" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "De vertraging voordat tool-tips worden getoond." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Browser Selectie" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Selecteer hier uw browser" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Gebruikelijke Browser:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Voer hier de naam van uw browser in. Om de gebruikelijke browser te " +"gebruiken, selecteer Handmatig Gekozen in het dropdown-menu hierboven." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Open in nieuw tabblad indien mogelijk" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" +"Open de web pagina, indien mogelijk, in een nieuw tabblad in plaats van in " +"een nieuw venster" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Bandbreedte Grenzen" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Upload" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Slot Toewijzen" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Lijn Capaciteiten" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Standaard client TCP Poort:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "Dit is de standaard ED2K poort en kan niet uitgeschakeld worden." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Uitgebreide client UDP Poort:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" +"Deze UDP poort wordt gebruikt voor uitgebreide Ed2K aanvragen en Kad netwerk" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "uitschakelen" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Bind Adres" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "UDP poort voor uitgebreide server aanvragen (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Max Bronnen per Bestand" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Harde Grens" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Verbinding Grenzen" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Max Verbindingen" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Universele Plug and Play" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "Schakel UPnP in" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "UPnP TCP Poort:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Autoverbind bij het opstarten" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Verbind opnieuw bij verbroken verbinding" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Toon overhead bandbreedte" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Server Opties" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Verwijder dode server na" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "pogingen" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Auto-update serverlijst bij het opstarten" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Lijst" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Update serverlijst bij het verbinden met een server" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Update serverlijst wanneer een client verbindt" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Gebruik prioriteitssysteem" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Gebruik slimme Laag ID controle bij verbinden" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Veilig verbinden" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Autoverbind alleen met servers in statische lijst" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Zet handmatig toegevoegde servers op Hoge Prioriteit" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "I.C.H. actief" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICH vertrouwt elke hash (niet aanbevolen)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Voeg bestanden aan downloads toe in pauze modus" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Voeg bestanden aan downloads toe met auto prioriteit" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Probeer eerste en laatste delen eerst te downloaden" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Voeg nieuwe gedeelde bestanden toe met auto prioriteit" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Probeer om volledige delen naar alle uploads te overdragen" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Start volgend gepauzeerde bestand als een bestand completeert" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "Uit dezelfde categorie" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "Bewaar 10 bronnen van zeldzame bestanden (<20 bronnen)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Schijfruimte" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Controleer Schijfruimte" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "Selecteer dit als u wilt dat aMule uw Schijfruimte controleert" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Min SchijfRuimte:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Voer hier de gewenste min schijfruimte in." + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Binnenkomende Directory :" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Tijdelijke Directory :" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Gedeelde Directories" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "(Rechtermuisklik op mappictogram om recursief te delen)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Deel verborgen bestanden" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Video Speler" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Cre�er Backup voor voorbeeld" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Grafieken" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Update vertraging : 5 seconden" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Tijd voor gemiddelde grafiek: 100 minuten" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Schaal Verbindings Grafiek: 100" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Selecteer Statistieken Kleuren" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Achtergrond" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Raster" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Huidige download" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Lopend gemiddelde download" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Sessie gemiddelde download" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Huidige upload" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Lopend gemiddelde upload" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Sessie gemiddelde upload" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Actieve verbindingen" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Systeemvak Pictogram Snelheidsbalk" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Kad-nodes huidig" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Kad-nodes draaiende" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Kad-nodes sessie" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Selecteer" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Aantal getoonde Client Versies (0=onbegrensd)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Mededelingen" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Berichten popup" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Gebruik geluid" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Pop uit als :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Nieuwe ingang in log" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Begint nieuwe chat sessie" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Een nieuw chat bericht is ontvangen" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Een download is toegevoegd of afgerond" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Nieuwe aMule versie gevonden" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "Urgente OOD, serververbinding kwijtgeraakt" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Mededelingen via Mail" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Verstuur een Email als een download is afgerond" + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "SMTP server :" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "Email adres :" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! WAARSCHUWING !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Verander deze instellingen niet tenzij u weet\n" +"wat u doet, anders kunt u makkelijk\n" +"dingen erger maken voor uzelf.\n" +"\n" +"aMule zal goed draaien zonder deze instellingen\n" +"te wijzigen." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Geavanceerde Instellingen" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Max nieuwe verbindingen / 5 seconden" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Bestands Buffer Grootte: 240000 bytes" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Upload Wachtrij Grootte: 5000 clients" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Server verbinding verversingsinterval: Uitschakelen" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "GUI Aanpassingen" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Download Wachtrij Bestanden Voortgang" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Toon percentage" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Toon voortgangsindicator" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Voortgangsindicator Stijl" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Plat" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Rond" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Skin Ondersteuning" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Schakel ondersteuning voor skins in " + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Skin:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- geen skins beschikbaar -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Kolom Sortering" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "Auto-sorteer bestanden in de download wachtrij (hoog CPU gebruik)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "aMule zal de kolommen in uw download lijst automatisch sorteren" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Overige Gui Instellingen" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Toon Snelle ED2K Links Afhandelaar" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Geef uitgebreide info weer op categorie-tabs" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Toon overdracht snelheden op titel" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Verticale knoppenbalk" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Toon partbestandsnummer voor bestandsnaam" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Besturing op Afstand" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Webserver Parameters" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Start amuleweb bij het opstarten" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Webserver poort" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "Schakel UPnP port forwarding van de Webserverpoort in" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Webserver UPnP TCP poort" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Pagina Verversings Tijd (in seconden)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Schakel Gzip compressie in" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Schakel Gebruiker met Beperkte rechten in" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Alle rechten wachtwoord" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Beperkte rechten wachtwoord" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Web template" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Externe Verbinding Parameters" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Accepteer externe verbindingen" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"IP van de luisterende interface\n" +"(leeg voor elke)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Voer hier een geldig ip in het formaat a.b.c.d in van de luisterende EV " +"interface. Een leeg veld of 0.0.0.0 betekent elke interface." + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "TCP poort" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "Schakel UPnP port forwarding van de EV-poort in" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "Klik hier om de veranderingen gemaakt aan de voorkeuren toe te passen." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Maak veranderingen aan de voorkeuren ongedaan." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Titel :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Commentaar :" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Binnenkomende Dir :" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Verander prioriteit voor nieuw toegevoegde bestanden :" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Niet veranderen" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Selecteer kleur voor deze Categorie (nu geselecteerd) :" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Toon server motd bij verbinding ..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Server Info" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Klik op deze knop om de log te resetten." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "aMule Log" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "Klik op deze knop om de lijst van servers te updaten van URL ..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Serverlijst" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Voer de url naar een server.met bestand hier in en druk op de knop links om " +"de lijst met bekende servers te vernieuwen." + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Handmatig Server Toevoegen: Naam" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Voer de naam van de nieuwe server hier in" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Voer het IP van de server hier in, gebuik het x.x.x.x formaat." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Voer de poort van de server hier in." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "Voeg een server handmatig toe (vul velden links in voor) ..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "ED2K Info" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Kad Info" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"De gekozen locale lijkt niet geinstalleerd te zijn op uw pc\n" +"U moet dat aanmaken om deze taal te kunnen gebruiken.\n" +"Een goed begin op linux systemen is het bestand /etc/locale/gen en het " +"pakket 'locales'\n" +"Succes!\n" +"(Let op: Ik probeer het toch in te stellen)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Laat dit nooit meer zien" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "Klik op deze knop om de nodes lijst te updaten van URL ..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Nodes (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"Voer hier de url in naar een nodes.dat bestand en druk op de knop links om " +"de lijst van bekende nodes te updaten." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Nodes stats" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Bootstrap" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Nieuwe node" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Poort:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Bootstrap van \n" +"bekende clients" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Verbreek verbinding met Kad" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Protocol Obfuscatie" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Ondersteun Protocol Obfuscatie" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"Deze optie schakelt Protocol Obfuscatie in, en zorgt er voor dat aMule " +"geobfusceerde verbindingen van andere clients accepteert." + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Gebruik obfuscatie voor uitgaande verbindingen" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"Deze optie zorgt er voor dat aMule Protocol Obfuscatie gebruikt bij het " +"verbinden met andere clients/servers." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Accepteer alleen geobfusceerde verbindingen" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"Deze optie zorgt er voor dat aMule alleen gobfusceerde verbindingen " +"accepteert. U heeft minder bronnen, maar al uw verkeer is geobfusceerd." + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Bestand Opties" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Iedereen" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Niemand" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Wie kan gedeelde bestanden zien:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "Selecteer wie een lijst van uw gedeelde bestanden kan opvragen." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "IP-Filteren" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Filter clients" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Schakel filteren van de client IPs in het bestand ~/.aMule/ipfilter.dat in." + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Filter servers" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Schakel filteren van de server IPs in het bestand ~/.aMule/ipfilter.dat in." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Lijst Opnieuw laden" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "" +"Laadt de lijst met IPs om te filteren opnieuw uit het bestand ~/.aMule/" +"ipfilter.dat" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Update nu" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Auto-update ipfilter bij het starten" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Level van Filteren:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Filter LAN IPs altijd" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Paranoïde behandeling van niet-kloppende IPs" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Weigert een pakket als de client ip anders is dan het ip waar het pakket van " +"is ontvangen. Wees voorzichtig hiermee." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Inschakelen/Uitschakelen" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Schakel Online-Handtekening in" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Schakelt het schrijven van het OH bestand in, die kan gebruikt worden door " +"externe applicaties om handtekeningen en dergelijke te maken." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Update Frequentie (Seconden):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "" +"Verander de frequentie (in seconden) van de Online Handtekening updates." + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Online Handtekening Directory:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" +"Klik hier om de directory te selecteren die de Online Handtekening bestanden " +"bevat." + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "In/Uitschakelen" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "Filter binnenkomende berichten (behalve huidige chat):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Filter Opties:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Filter alle berichten" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Filter berichten van mensen niet op uw vriendenlijst" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Filter berichten van onbekende clients" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Filter berichten met (gebruik ',' als scheiding):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"voeg hier de woorden toe die amule moet filteren en berichten daarmee " +"blokkeren" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Commentaren" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "" +"Filter commentaren die de volgende tekens bevatten (gebruik ',' als " +"scheiding):" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Schakel Proxy in" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Schakel proxy ondersteuning in/uit" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Proxy type:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "Het type proxy waarmee u verbinding maakt" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Proxy host:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "De proxy hostnaam" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Proxy poort:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "De proxy poort" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Aanmelding" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Schakel aanmelding in" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Schakel gebruikersnaam/wachtwoord aanmelding in/uit" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "De gebruikersnaam nodig om te verbinden met de proxy" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Wachtwoord:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "Het wachtwoord nodig om te verbinden met de proxy" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Automatische verbinding met server zonder proxy" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Verbind met:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Login op amule op afstand" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Gebruikersnaam" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Onthoud deze instellingen" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Schakel Uitgebreid Debug-Loggen in" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "Bericht Categorie?n" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "Voeg geïmporteerden toe" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Probeer geselecteerde opnieuw" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Verwijder geselecteerde" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Gebeurtenistypes" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Verbind met een server en/of Kad" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Nieuwe Catgorie" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Kies een directory voor binnenkomende bestanden" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "U moet een naam opgeven voor de categorie!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "U moet een pad opgeven voor de categorie!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"Kon binnenkomende dir niet aanmaken voor categorie. Geef a.u.b. een geldig " +"pad op!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "Onbekende extensie '%s' van het '%s' commando.\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "Onbekend commando '%s'.\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"Dit commando heeft geen argumenten.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"Dit commando moet een argument hebben.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Dit commando is niet compleet, u moet een van onderstaande uitbreidingen " +"gebruiken.\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Beschikbare uitbreidingen:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Beschikbare commando's:\n" + +#: src/ExternalConnector.cpp:188 +#, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Sluit het programma af." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Toon help." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"Om help te krijgen over een commando, type 'help '.\n" +"Om de volledige commando lijst te krijgen type 'help'.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"Gebruik '%s' voor commando lijst\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Syntax fout!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Fout bij het verwerken van commando - zou nooit mogen gebeuren! Rapporteer " +"deze bug, a.u.b.\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Dit commando heeft geen parameters." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Dit commando moet een parameter hebben." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Ongeldig argument." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Dit is een incompleet commando." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Type '%s' voor meer help.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "Dit is %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "Dit is %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Aanmaken van client...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "Verbinding Mislukte. Kon niet verbinden met opgegeven host\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"Ok, %s wordt afgesloten...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"Kan niet verbinden met een leeg wachtwoord.\n" +"U moet een wachtwoord opgeven in het config bestand\n" +"of op de commando-regel, of invoeren als daarom gevraagd\n" +"wordt.\n" +"\n" +"Bezig met afsluiten...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Toon deze help tekst" + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "Host waar aMule draait. (standaard: localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "aMules poort voor Externe Verbindingen. (standaard: 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Externe Verbinding wachtwoord." + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Lees configuratie uit bestand." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "Print geen uitvoer naar stdout." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Wees uitgebreid - toon ook debug berichten." + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Stelt programma locale (taal) in." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "Schrijf opties op de opdrachtregel naar config bestand." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "Maakt config bestand gebaseerd op aMules config bestand." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Toon programma versie." + +#: src/ClientCreditsList.cpp:168 +#, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "" +msgstr[1] "" + +#: src/ClientCreditsList.cpp:171 +#, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] "" +msgstr[1] "" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "Geen 'cryptkey.dat' bestand gevonden, wordt aangemaakt." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"FOUT: aMule daemon kan niet gebruikt worden wanneer externe verbindingen " +"zijn uitgeschakeld. Gebruik, om Externe Verbindingen in te schakelen, of een " +"normale aMule, start amuled met de optie --ec-config of verander de waarde " +"van \"AcceptExternalConnections\" in 1 in het bestand ~/.aMule/amule.conf" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "FOUT: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Maak ban ongedaan" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Laat Uploads zien" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Laat Wachtrij zien" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Toon Clients" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Selecteer Weergave" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Client Software" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Gewacht" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Upload Tijd" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Upload/Download" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Remote Status" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "QR: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Bestandsprioriteit" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Score" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Gevraagd" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Laatst Gezien" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "In Wachtrij Gekomen" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Upload Status" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Ge-upload" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Download Status" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Ge-download" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Userhash" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Versleuteld" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Verberg gedeelde bestanden" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Client Details" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f KB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Niet Ondersteund" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Niet compleet" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Slechterik" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Gecontroleerd - OK" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Niet Beschikbaar" + +#: src/ClientDetailDialog.cpp:190 +#, c-format +msgid "%u (QR: %u)" +msgstr "" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" +"Min grootte moet kleiner zijn dan max grootte. Max grootte wordt genegeerd." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Zoekwaarschuwing" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Onbegrensd" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "aMule Systeemvak Menu" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Snelheid Grenzen:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "UL: Geen" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "UL: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "DL: Geen" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "DL: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Download Snelheid: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Upload Snelheid: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Client Informatie" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Bijnaam: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "Geen Bijnaam Geselecteerd!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "ClientID: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "ServerNaam: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "ServerIP: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "TCP Poort: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "TCP Poort: Niet Gereed" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "UDP Poort: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "UDP Poort: Niet Gereed" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Online Handtekening: Ingeschakeld" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Online Handtekening: Uitgeschakeld" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Gedeelde Bestanden: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Clients in Wachtrij: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "Totaal gedownload: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "Totaal geupload: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Upload Limiet" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Download Limiet" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "Verberg aMule" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "Toon aMule" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "Chat-Sessie Begonnen: %s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Verbonden met Client ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** Verbinden maken met Client ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Kon niet Verbinden met client / Verbinding verbroken ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Sluit tabblad" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Sluit alle tabbladen" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Sluit andere tabbladen" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "Laden van server.met bestand: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "Bestand server.met niet gevonden!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "Kon server.met bestand '%s' niet laden, onbekend formaat." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "Kon server.met niet openen!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"Server.met bestand beschadigd, ongeldig versielabel gevonden: 0x%x, grootte %" +"i" + +#: src/ServerList.cpp:168 +#, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerList.cpp:170 +#, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Server niet toegevoegd: [%s:%d] bevat geen geldige poort." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "Server niet toegevoegd: Het IP van [%s:%d] is gefilterd of ongeldig." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" +"Server niet toegevoegd: Server met IP:Poort [%s:%d] al gevonden in lijst." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Server toegevoegd: Server op [%s:%d] met naam '%s'." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"U bent verbonden met de server die u probeert te verwijderen. Vebreek a.u.b. " +"eerst de verbinding." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Kon server.met niet opslaan!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "Ongeldige URL" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Kon serverlijst niet downloaden van %s" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"Geen serverlijst adres in 'addresses.dat' gevonden. Plaats een geldig " +"serverlijst adres in dit bestand om uw serverlijst automatisch te updaten" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" +"Waarschuwing, ongeldige URL gespecificeerd voor het auto-updaten van " +"servers: %s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "Geen geldige server.met auto-download url in addresses.dat" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"De lokale server wordt door de IPFilters weggefilterd, er wordt verbonden " +"met een andere server!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "Kon commando `%s' niet uitvoeren bij gebeurtenis `%s'." + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"De taalinstelling is veranderd in Systeem Standaard vanwege een configuratie " +"wijziging. Sorry." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"U heeft geen servers in de serverlijst.\n" +"Wilt u dat aMule nu een nieuwe lijst download?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Download van serverlijst" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "webserver draait met pid %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"U heeft ingesteld om de webserver te starten bij het opstarten, maar " +"amuleweb kan niet gestart worden. Installeer a.u.b. het pakket met de aMule " +"webserver, of compileer aMule met --enable-webserver en draai make install." + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "Poort %u is niet beschikbaar. U krijgt een LAAG ID\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"Poort %u is niet beschikbaar!\n" +"\n" +"Dit betekent dat u een LAAG ID krijgt.\n" +"\n" +"Controleer uw netwerk en zorg ervoor dat de poort open is voor in- en " +"uitgaand verkeer." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Kon OnlineHandtekening Bestand niet maken" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "Kon aMule OnlineHandtekening Bestand niet maken" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"De gekozen locale lijkt niet ge?nstalleerd te zijn op uw pc. (Let op: Ik " +"probeer het toch in te stellen)" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "Dit is de eerste keer dat u aMule %s draait" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "Dit is een test versie, dagelijks geupdate, en\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "we geven geen garantie dat het niks sloopt, uw huis verbrandt,\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" +"of uw hond doodt. Maar het *zou* veilig moeten zijn om het te gebruiken.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" +"De volgende opties zijn vanwege beveiligingsredenen gewijzigd in deze " +"versie:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* Protocol Obfuscatie ingeschakeld voor binnenkomende en uitgaande " +"verbindingen.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* Serverlijst updaten van andere servers en clients uitgeschakeld.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"Voor meer informatie over de reden voor deze veranderingen, zoek\n" +"op de aMule wiki op http://wiki.amule.org naar \"fake servers\".\n" +"Het is belangrijk dat u alle nepservers uit uw serverlijst verwijderd om " +"aMule goed te laten werken." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Meer informatie, ondersteuning en niuwe versies kunnen gevonden worden op " +"onze homepage,\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "op www.aMule.org, of op ons IRC kanaal #amule op irc.freenode.net.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Bugs kunt u altijd melden op http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"De map voor Online Handtekening bestanden die u heeft opgegeven is " +"ONGELDIG!\n" +" OnlineSignature is UITGESCHAKELD totdat u dit verbetert in voorkeuren." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "FOUT: kan logbestand niet openen" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "WAARSCHUWING: logbestand is leeg. Er is iets mis." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Log is gereset" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "ServerBericht: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Kon nodes lijst niet downloaden." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Kon gedownload versie controle bestand niet openen" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Beschadigd versie controle bestand" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "U gebruikt een verouderde versie van aMule!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "Uw aMule versie is %i.%i.%i en de nieuwste versie is %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "De nieuwste versie kan altijd gevonden worden op http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "WAARSCHUWING: Uw aMuled versie is verouderd: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "U heeft de nieuwste aMule versie." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Kon versie controle bestand niet downloaden" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Verbonden met %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Verbinden met %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Verbinding met ED2K verbroken" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad gestart." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad gestopt." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Verbonden met Kad (ok)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Verbonden met Kad (firewalled)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Verbinding met Kad verbroken" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"Kad netwerk kan niet gebruikt worden als de UDP poort is uitgeschakeld in " +"voorkeuren, wordt niet gestart." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Kad netwerk is uitgeschakeld in voorkeuren, wordt niet mee verbonden." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "Kon vriendenlijst bestand 'emfriends.met' niet lezen!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "Kon niet schrijven naar vriendenlijst bestand 'emfriends.met'!" + +#~ msgid "Syncronization thread started." +#~ msgstr "Synchronisatiethread gestart." + +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "Masterhashes van bekende bestanden zijn geladen." + +#~ msgid "Requested:" +#~ msgstr "Aangevraagd:" + +#~ msgid "" +#~ "Filestats for this session: Accepted %d of %d requests, %s transferred\n" +#~ msgstr "" +#~ "Statistieken voor deze sessie: %d van %d aanvragen zijn geaccepteerd; %s " +#~ "zijn overgebracht\n" + +#~ msgid "" +#~ "Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +#~ msgstr "" +#~ "Bestandsstatistieken van alle sessies: %d van %d aanvragen geaccepteerd, %" +#~ "s overgedragen\n" + +#~ msgid "Are you sure that you wish to delete the selected friend(s)?" +#~ msgstr "Weet u zeker dat u de geselecteerde vriend(en) wilt verwijderen?" + +#~ msgid "Read %u Kad contacts" +#~ msgstr "%u Kad contacten gelezen" + +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "Fout bij het lezen van Kad contacten - 0 ingangen" + +#~ msgid "Merge attempt" +#~ msgstr "Poging om samen te voegen" + +#~ msgid "Recursive merge" +#~ msgstr "Recursief samenvoegen" + +#~ msgid "Sucessful merge!" +#~ msgstr "Succesvol samengevoegd!" + +#~ msgid "No merge possible" +#~ msgstr "Samenvoegen niet mogelijk" + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid "] with " +#~ msgstr "] met " + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "Canceled !" +#~ msgstr "Geannuleerd !" + +#~ msgid "TCP Flags" +#~ msgstr "TCP Vlaggen" + +#~ msgid "UDP Flags" +#~ msgstr "UDP Vlaggen" + +#~ msgid "Mark server(s) as static" +#~ msgstr "Markeer server(s) als statisch" + +#~ msgid "Mark server(s) as non-static" +#~ msgstr "Markeer server(s) als niet-statisch" + +#~ msgid "Remove server(s)" +#~ msgstr "Server(s) op afstand" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "Kopieer ED2k link(s) naar klembord" + +#~ msgid "Are you sure that you wish to delete the selected server(s)?" +#~ msgstr "Weet u zeker dat u de geselecteerde server(s) wilt verwijderen?" + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2007 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ " 'Alle-Platformen' p2p client gebaseerd op eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administratieve zaken) \n" +#~ " Copyright (C) 2003-2007 aMule Team \n" +#~ "\n" +#~ " Een deel van aMule is gebaseerd op \n" +#~ " Kademlia: Peer-to-peer routing gebaseerd op het XOR metriek.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "Stops the current connection attempts" +#~ msgstr "Stopt de huidige verbindingspogingen" + +#~ msgid "Disconnect from " +#~ msgstr "Verbreek verbinding met " + +#~ msgid "current server" +#~ msgstr "huidige server" + +#~ msgid " and " +#~ msgstr " en " + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "WAARSCHUWING: U heeft een Laag ID gekregen!" + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "Verbreek verbinding met elke server en/of Kad" + +#~ msgid "Sources Dropping" +#~ msgstr "Bronnen Laten Vallen" + +#~ msgid "Update delay: %d secs" +#~ msgstr "Update vertraging: %d seconden" + +#~ msgid "Time for average graph: %d mins" +#~ msgstr "Tijd voor gemiddelde grafiek: %d minuten" + +#~ msgid "Update delay : %d secs" +#~ msgstr "Update vertraging : %d seconden" + +#~ msgid "File Buffer Size: %d bytes" +#~ msgstr "BestandsBuffer Grootte: %d bytes" + +#~ msgid "Upload Queue Size: %d clients" +#~ msgstr "Upload Wachtrij Grootte: %d clients" + +#~ msgid "Server connection refresh interval: %d minutes" +#~ msgstr "Server verbinding verversings interval: %d minuten" + +#~ msgid "" +#~ "You cannot connect to a release version from an arbitrary CVS version! " +#~ "*sigh* possible crash prevented" +#~ msgstr "" +#~ "U kunt niet verbinden met de release versie van een willekeurige CVS " +#~ "versie! *zucht* mogelijk crash voorkomen" + +#~ msgid "Client requests %u" +#~ msgstr "Client vraagt om %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "Bestand blok %u-%u (%d bytes):" + +#~ msgid "Client request is invalid!" +#~ msgstr "Clientaanvraag is ongeldig!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "Clientaanvraag is ongeldig! %i / %i" + +#~ msgid "Buddy address: " +#~ msgstr "Buddy adres: " + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "" +#~ "U kunt nog niet bootstrappen van een specifiek ip met GUI op afstand." + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "U kunt de server.met nog niet updaten met GUI op afstand." + +#~ msgid "Are you sure that you wish to delete the selected file(s)?" +#~ msgstr "Weet u zeker dat u de geselecteerde bestand(en) wilt verwijderen?" + +#~ msgid "" +#~ "Please set your prefered video player on preferences.\n" +#~ "Meanwhile, aMule will attempt to use mplayer and you will get this " +#~ "warning on every preview" +#~ msgstr "" +#~ "Stel a.u.b. de video speler van uw voorkeur in bij voorkeuren.\n" +#~ "Ondertussen zal aMule proberen om mplayer te gebruiken en krijgt u deze " +#~ "waarschuwing bij elk voorbeeld" + +#~ msgid "ERROR: Failed to execute external media-player!" +#~ msgstr "FOUT: Kon externe media speler niet starten!" + +#~ msgid "Command: %s" +#~ msgstr "Commando: %s" + +#~ msgid "" +#~ "Error: Failed to load backup file. Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Fout: Kon backup bestand niet laden. Zoek op http://forum.amule.org naar ." +#~ "part.met recovery solutions" + +#~ msgid "" +#~ "Error: Backup part.met file is 0 size! Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Fout: Backup part.met bestand heeft grootte 0! Zoek op http://forum.amule." +#~ "org hoe .part.met bestanden te herstellen" + +#~ msgid "Error: part.met backup file is 0 size: %s ==> %s" +#~ msgstr "Fout: part.met backup bestand heeft grootte 0: %s ==> %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "Kan %s bestand niet openen - %s bestand wordt gebruikt." + +#~ msgid "Saved %i sources seeds for partfile: %s (%s)" +#~ msgstr "%i bronnen seeds bewaard voor partbestand: %s (%s)" + +#~ msgid "" +#~ "Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| " +#~ "FileHash |%s|" +#~ msgstr "" +#~ "Beschadigd deel (%d) gevonden in %d delen bestand %s - " +#~ "BestandsResultaatHash |%s| BestandsHash |%s|" + +#~ msgid "doesn't work" +#~ msgstr "werkt niet" + +#~ msgid "remote gui" +#~ msgstr "gui op afstand" + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "Waarschuwing: known.met bestaat niet." + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles: %s wordt verwijderd uit gedeelde " +#~ "directory lijst: directory niet gevonden." + +#~ msgid "Found %i known shared files" +#~ msgstr "%i bekende gedeelde bestanden gevonden" + +#~ msgid "Found %i known shared files, %i unknown" +#~ msgstr "%i bekende gedeelde bestanden gevonden, %i onbekende" + +#~ msgid "%s comment(s)" +#~ msgstr "%s commenta(a)r(en)" + +#~ msgid "Automatic connection to server will retry in %d seconds" +#~ msgstr "" +#~ "Automatische verbinding met server, zal het opnieuw proberen over %d " +#~ "seconden" + +#~ msgid "Found %u part files" +#~ msgstr "%u part bestanden gevonden" + +#~ msgid "" +#~ "This command requieres an argument. Valid arguments: 'all' or a number.\n" +#~ msgstr "" +#~ "Dit commando heeft een argument nodig. Geldige argumenten: 'all' of een " +#~ "getal.\n" + +#~ msgid "This command requieres an argument. Valid arguments: a file hash.\n" +#~ msgstr "" +#~ "Dit commando heeft een argument nodig. Geldige argumenten: een " +#~ "bestandshash.\n" + +#~ msgid " %d" +#~ msgstr " %d" + +#~ msgid ".%d" +#~ msgstr ".%d" + +#~ msgid "Shows the process of a search." +#~ msgstr "Toont de voortgang van een zoekopdracht." + +#~ msgid "Shows the process of a search..\n" +#~ msgstr "Toont de voortgang van een zoekopdracht..\n" + +#~ msgid "Deprecated command, now 'Status'." +#~ msgstr "Verouderd commando, nu 'Status'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Status' instead.\n" +#~ msgstr "" +#~ "Dit is een verouderd commando, en wordt in de toekomst mogelijk " +#~ "verwijderd.\n" +#~ "Gebruik in plaats hiervan 'Status'.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter'." +#~ msgstr "Verouderd commando, nu 'Set IPFilter'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter' instead.\n" +#~ msgstr "" +#~ "Dit is een verouderd commando, en wordt in de toekomst mogelijk " +#~ "verwijderd.\n" +#~ "Gebruik in plaats hiervan 'Set IPFilter'.\n" + +#~ msgid "Deprecated command, now 'Get IPFilter Level'." +#~ msgstr "Verouderd commando, nu 'Get IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Dit is een verouderd commando, en wordt in de toekomst mogelijk " +#~ "verwijderd.\n" +#~ "Gebruik in plaats hiervan 'Get IPFilter Level'.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter Level'." +#~ msgstr "Verouderd commando, nu 'Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Dit is een verouderd commando, en wordt in de toekomst mogelijk " +#~ "verwijderd.\n" +#~ "Gebruik in plaats hiervan 'Set IPFilter Level'.\n" + +#~ msgid "Deprecated command, now 'Get/Set IPFilter Level'." +#~ msgstr "Verouderd commando, nu 'Get/Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get/Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Dit is een verouderd commando, en wordt in de toekomst mogelijk " +#~ "verwijderd.\n" +#~ "Gebruik in plaats hiervan 'Get/Set IPFilter Level'.\n" + +#~ msgid "Deprecated command, now 'Show Servers'." +#~ msgstr "Verouderd commando, nu 'Show Servers'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Show Servers' instead.\n" +#~ msgstr "" +#~ "Dit is een verouderd commando, en wordt in de toekomst mogelijk " +#~ "verwijderd.\n" +#~ "Gebruik in plaats hiervan 'Show Servers'.\n" + +#~ msgid "Deprecated command, now 'Get BwLimits'." +#~ msgstr "Verouderd commando, nu 'Get BwLimits'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get BwLimits' instead.\n" +#~ msgstr "" +#~ "Dit is een verouderd commando, en wordt in de toekomst mogelijk " +#~ "verwijderd.\n" +#~ "Gebruik in plaats hiervan 'Get BwLimits'.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Up'." +#~ msgstr "Verouderd commando, nu 'Set BwLimit Up'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Up' instead.\n" +#~ msgstr "" +#~ "Dit is een verouderd commando, en wordt in de toekomst mogelijk " +#~ "verwijderd.\n" +#~ "Gebruik in plaats hiervan 'Set BwLimit Up'.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Down'." +#~ msgstr "Verouderd commando, nu 'Set BwLimit Down'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Down' instead.\n" +#~ msgstr "" +#~ "Dit is een verouderd commando, en wordt in de toekomst mogelijk " +#~ "verwijderd.\n" +#~ "Gebruik in plaats hiervan 'Set BwLimit Down'.\n" + +#~ msgid "Received %d new servers" +#~ msgstr "%d nieuwe servers ontvangen" + +#~ msgid "Loaded %d flag bitmaps." +#~ msgstr "%d vlaggen geladen." + +#~ msgid "bytes" +#~ msgstr "bytes" + +#~ msgid "bytes/sec" +#~ msgstr "bytes/sec" + +#~ msgid "Loaded %u IP-ranges from '%s'. %u malformed lines were discarded." +#~ msgstr "%u IP-reeksen geladen uit '%s'. %u foutieve regels genegeerd." + +#~ msgid "" +#~ "Note: These values are\n" +#~ " only used for statistics." +#~ msgstr "" +#~ "Let op: Deze waarden worden\n" +#~ " alleen gebruikt voor statistieken." + +#~ msgid "Source Dropping" +#~ msgstr "Bronnen Laten Vallen" + +#~ msgid "Keep sources" +#~ msgstr "Bronnen behouden" + +#~ msgid "Drop sources" +#~ msgstr "Bronnen laten vallen" + +#~ msgid "Send sources to any other file before dropping (High CPU)" +#~ msgstr "" +#~ "Stuur bronnen naar een ander bestand voor ze te laten vallen (Hoog CPU " +#~ "gebruik)" + +#~ msgid "Sources with no needed file-parts." +#~ msgstr "Bronnen zonder benodigde bestands-delen." + +#~ msgid "Full Queue Sources Handling" +#~ msgstr "Volle Wachtrij Bronnen Afhandeling" + +#~ msgid "Enable auto drop Full Queue Sources" +#~ msgstr "Schakel auto laten vallen Volle Wachtrij Bronnen in" + +#~ msgid "High Queue Rating Sources Handling" +#~ msgstr "Hoge Wachtrij Bronnen Afhadeling" + +#~ msgid "Enable auto drop High Queue Rating Sources" +#~ msgstr "Schakel auto laten vallen Hoge Wachtrij Bronnen in" + +#~ msgid "High Queue Rating value" +#~ msgstr "Hoge Wachtrij waarde" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(Min 300 / Max 3000)" + +#~ msgid "Auto Drop Sources Timer" +#~ msgstr "Auto Bronnen Laten Vallen Timer" + +#~ msgid "Timer (in secs)" +#~ msgstr "Timer (in seconden)" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(min 60 / 3600 Max)" + +#~ msgid "Client Identification:" +#~ msgstr "Client Identificatie:" + +#~ msgid "Use Secure Identification" +#~ msgstr "Gebruik Veilige Identificatie" + +#~ msgid "" +#~ "Secure Identification uses a handshake approch to safely identify clients " +#~ "for use with the credit system." +#~ msgstr "" +#~ "Veilige Identificatie gebruikt een handshake methode om clients veilig te " +#~ "kunnen identificeren voor gebruik met het credit systeem." + +#~ msgid "" +#~ "\n" +#~ "All commands are case insensitive.\n" +#~ "Type 'help ' to get detailed info on .\n" +#~ msgstr "" +#~ "\n" +#~ "Alle commando's zijn hoofdletterongevoelig.\n" +#~ "Type 'help ' om gedetailleerde info te krijgen over " +#~ ".\n" + +#~ msgid "Creditfile loaded, %u clients are known" +#~ msgstr "Creditbestand geladen, %u clients bekend" + +#~ msgid " - Credits expired for %u clients!" +#~ msgstr " - Credits verlopen voor %u clients!" + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "Wachten op beëindiging van subproces mislukt" + +#~ msgid "Search warning." +#~ msgstr "Zoekwaarschuwing." + +#~ msgid "%i servers in server.met found" +#~ msgstr "%i servers gevonden in server.met" + +#~ msgid "%d servers added" +#~ msgstr "%d servers toegevoegd" diff --git a/po/nn.po b/po/nn.po new file mode 100644 index 00000000..bd8039ad --- /dev/null +++ b/po/nn.po @@ -0,0 +1,7408 @@ +# Norwegian Nynorsk translations for aMule package. +# Copyright (C) 2007 Free Software Foundation, Inc. +# This file is distributed under the same license as the aMule package. +# , 2007. +# , 2007. +# +# +msgid "" +msgstr "" +"Project-Id-Version: aMule CVS\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2007-09-28 21:41+0200\n" +"Last-Translator: Hallvor Brunstad \n" +"Language-Team: Norwegian/Nynorsk \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Du må skrive inn eit passord som ikkje er tomt." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Feil passord! Ikkje MD5 hash!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Oppkoplingsfeil" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "EC Kopling feila. Tomt svar." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "Ekstern kopling: Tilgang nekta fordi: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "Ekstern kopling: Tilgang nekta" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "Ekstern kopling: Dårleg svar frå tenar. Koplinga er stengd." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Vellukka! Kopling til aMule er oppretta " + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Vellukka! Kopling oppretta." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Hashar" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Ferdigstiller" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Ferdig" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Pausa" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Feilaktig" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Lastar ned" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Ventar" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Opprettar MD4 og AICH hash for fila: %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Opprettar MD4 hash for fila: %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Opprettar AICH hash for fila: %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "Konverterer gamle AICH hashsett i '%s'·til·64b·i·'%s'." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "ÅTVARING: Filnamnet '%s' er feil og har vorte omdøypt til '%s'." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "ÅTVARING: Fila '%s' finst allereie; ny fil omdøypt til '%s'." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "ÅTVARING: Kunne ikkje fjerne den opphavelege '%s' etter tryggleikskopi" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "ÅTVARING: Greidde ikkje å slette %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Greidde ikkje å hente delte filer frå brukar '%s'" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Ukjend" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (Falsk eMuleutgåve %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (Falsk eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (Falsk eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x·(basert på eMule·v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Brukarnamn: %s·ID:·%u" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "Etterspurt" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Filstatistikk for denne økta:·Godteke·%d·av·%d·etterspurnader,·%s·overført\n" +msgstr[1] "" +"Filstatistikk for denne økta:·Godteke·%d·av·%d·etterspurnader,·%s·overført\n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Filstatistikk for alle økter:·Godteke·%d·av·%d·etterspurnader,·%s·overført\n" +msgstr[1] "" +"Filstatistikk for alle økter:·Godteke·%d·av·%d·etterspurnader,·%s·overført\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Etterspurt ukjend fil" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "Klient %s·på·IP:Port·%s:%d·nyttar·%s·%s·%s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Brukarnamn" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Vener" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Syn &detaljar" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Legg til ein ven" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Ta bort ven" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Send &melding" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Sjå filer" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Opprett venekopling" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Er du sikker på at du vil slette den valde venen/venene?" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Er du sikker på at du vil slette den valde venen/venene?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Avbryt" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"Det er ikkje tillate å opprette meir enn ei venekopling.\n" +" Berre ei venekopling vart oppretta." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Fleirval" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Filnamn" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Storleik" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Sort" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Prioritet" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "FilID" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Etterspurnader" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Godtekne etterspurnader" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Overførte data" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Delingssamsvar" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Nedlasta delar" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Komplette kjelder" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Katalogsti" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Delte filer" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Svært låg" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Låg" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Vanleg" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Høg" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Svært høg" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Offentleggjering" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Automatisk" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Legg til kommentar/Rangering" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Endre kommentar/Rangering" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Endre namn" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Legg filer frå samlinga til overføringslista" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Kopiér magnet &URI til utklippstavla" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Kopiér ED2k &lenke til utklippstavla" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Kopiér ED2k lenke til utklippstavla (&Kjelde)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "Kopiér ED2k lenke til utklippstavla (Kjelde) (&Med krypteringsval)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Kopiér ED2k lenke til utklippstavla (&Vertsnamn)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "Kopiér Ed2k lenke til utklippstavla (Med &Krypteringsval)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Kopiér ED2k lenke til utklippstavla (&AICH info)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Kopiér tilbakemelding til utklippstavla" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "Du treng ein HøgID for å lage ei gangbar kjeldelenke" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Åtvaring" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Delte filer (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[Delfil]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Skriv nytt namn på denne fila:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Døyp om fil" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Held fram opplastingar av fila: %s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Mellombels stogge opplastingar av fila: %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: for kort søkjeord" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Feil: Greidde ikkje å lytte til TCP porten." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "Etterspurnaden mislukka med følgjande feil: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "Etterspurnaden mislukka med ukjend feil." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "Registerfil ikkje funne: " + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Greier ikkje å lage vevkoplingstråd\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Vevtenar: Starta\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Økt utgått - ber om logginn\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Økt ok, logga inn\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Økt ok, ikkje innlogga\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Inga økt opna - vil be om logginn\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Økt oppretta - ber om logginn\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Handsamar etterspurnad [original]: " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Sjekkar passord\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Passord hash feil\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Passord ok\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Feil passord\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "Du skreiv ikkje inn eit passord. Tomt passord er ikkje tillate.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Utlogging etterspurt\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Handsamar etterspurnad [omdirigert]: " + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Lastar modell " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Vevtenar HTTP port" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Nytt UPnP portvidaresending på vevtenarport" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "UPnP port" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Nytt gzipkomprimering" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Fulltilgangspassord for vevtenar" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Gjestepassord for vevtenar" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Gje løyve til gjestetilgang" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Nekt gjestetilgang" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "Last/lagre vevtenarinnstillingar frå/til fjern aMule" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "aMule konfugurasjonsfilsti. IKKJE NYTT DIREKTE!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "Deaktivér PHP tolk (frårådd)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Omkompilér PHP-sider ved kvar etterspurnad" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "aMule vevtenar" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Ikkje tilgjengeleg" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Aldri" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Lastar ned..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Innstillingar" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "Katalog som inneheld amulesig.dat fila" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Bla" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Skriv inn kvar katalogen som inneheld amulesig.dat fila er" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Oppfriskingsintervall i sekund" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Lag eit statistikkbilete ved kvar oppfriskingshending" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "Skriv inn katalogen du vil lage statistikkbiletet i" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Last regelbunde opp statistikkbilete til ein FTP tenar" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "FTP-Url" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "FTPsti" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Skriv inn URL til FTP tenar" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "Skriv inn katalogen du lastar statistikkbiletet til FTPtenaren til" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Brukar" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Passord" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Skriv inn brukarnamnet for å logge inn på FTPtenaren din" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Skriv inn brukarpassordet for å logge inn på FTPtenaren din" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "FTP oppdateringsintervall i minutt" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Validere" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Katalog som inneheld signaturfila di" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Katalog der statistikkbiletet vert laga" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i dag(ar) %i timar %i min %i s" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "WxCas, aMule nettstatistikk" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Velkomen!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Høgaste nedlastingsfart medan wxCas har køyrt" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "Absolutt maksimum nedlastingsfart nokon gong medan wxCas har køyrt" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Still attende" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "System" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Stopp. Autooppfrisking" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Lagre nettstatistikkbiletet" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Skriv ut nettstatistikkbiletet" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Innstillingsval" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "Om wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Start autooppfrisking" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Autooppfrisking stogga" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Autooppfrisking starta" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Lagre statistikkbilete" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Ingen handsamar for denne filtypen" + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "Fila vart ikkje lagra" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "aMule nettstatistikk" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Det oppstod eit problem med utskrifta.\n" +"Kanskje er ikkje skrivaren din innstilt skikkeleg?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Skriv ut" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas,·aMule·nettsignaturstatistikk\n" +"\n" +"(c)·2004·ThePolish·\n" +"\n" +"Basert·på·CAS·av·Pedro·de·Oliveira·\n" +"\n" +"Distribuert·under·GPL" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Å nei, aMule køyrer ikkje..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule køyrer" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule køyrer, men fråkopla" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule koplar til..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Å nei, ukjend status for aMule..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " har køyrt i " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " er stogga !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " er ikkje tilkopla !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " koplar til..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " gjer noko rart, sjekk det !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " er tilkopla " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "ok" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "brannmura" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "av" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " er på " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +#, fuzzy +msgid " with " +msgstr "] med " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Total nedlasting: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr " Opplasting: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Nedlasting denne økta: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Nedlasting: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s, opplasting: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Deler: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " filer, klientar i kø: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Tid: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f·kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " på " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Gjennomsnittleg systembelasting (1-5-15·min): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Oppetid: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uD %02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "HøgID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "LågID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Ikkje tilkopla" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f·KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "Avbrote !" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Ikkje i stand til å opne %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "Fila %s er for stor for Muldyret: maksimal lovleg filstorleik er 4 GB." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Innmatingsparameter" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Fil å hashe" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Legg til valfrie URL`ar for denne fila" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Skriv inn fila du vil lage ED2k-lenkje til" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Skriv inn URL`en du vil leggje til i ED2k lenkja: Skriv / på slutten for å " +"la aLinkCreator leggje til det noverande filnamnet" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Legg til" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Ta bort" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Frigjer plass" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Lag lenkje " + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Hjelp til med å spreie nye og sjeldne filer raskare, men med auka " +"lenkjestorleik" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "MD4 filhash" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "ED2k filhash" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "ED2k lenkje" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Start" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Lagre" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Kopiér til utklippstavle" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Avslutt" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Opne ei fil for å lage fila si ED2k lenkje" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Kopiér skapt ED2k lenkje til utklippstavla" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Lagre skapt ED2k lenkje til fil" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "Om aLinkCreator" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Vel fil for å lage ED2k lenkja" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "Ikkje noko å kopiére no !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Vel fila for di skapte ED2k lenkje" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Ikkje i stand til å opne" + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Vér god å skrive inn eit filnamn som ikkje er tomt" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "Ikkje noko å lagre akkurat no !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator,·the·aMule·ed2k·link·skaparen\n" +"\n" +"(c)·2004·ThePolish·\n" +"\n" +"Pixmaps·frå·http://www.everaldo.com·and·http://www.icomania.com\n" +"og·http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distribuert·under·GPL" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Hashar..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Ferdig om %.2f·s" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "Du har allereie lagt til denne URL`en!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Vér god å skrive inn ein URL som ikkje er tom" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "Handsamar filnummer %u: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "Du har spurt etter delhashar (Berre brukt på filer > 9,5 MB)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Vér god å vente..." + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s·--->·Fila finst ikkje·!\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator,·ED2k lenkjeskaparen" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Auto [Lå]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Auto·[No]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Auto·[Hø]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Koplar til" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Spør" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Koplar til gjennom tenar" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Kø full" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "I kø" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Overfører" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Tek imot hashsett" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Ingen naudsynte delar" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Greier ikkje å kople LågID til LågID" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "For mange koplingar" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Koplar til gjennom Kad" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "For mange kadkoplingar" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Nekta" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Koplingsfeil" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Fjern kø full" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "Gamal MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "Ny MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "eMulekompatibel" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Lokal tenar" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Fjern tenar" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Kjeldeutveksling" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Passiv" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Lenkje" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Kjeldefrø" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Standardinnstillingar" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Arabisk" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Baskisk" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Bulgarsk" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Katalansk" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Kinesisk (forenkla)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Kinesisk (tradisjonell)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Kroatisk" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Dansk" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Nederlansk" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Engelsk (U.K.)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Estisk" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Finsk" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Fransk" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Galisisk" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Tysk" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Ungarsk" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Italiensk" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Italiensk (sveitsisk)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Koreansk" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "Litauisk" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "Norsk (Nynorsk)" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Polsk" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portugisisk" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Portugisisk (Brasil)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Russisk" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Slovensk" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Spansk" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "Svensk" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Tyrkisk" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Ikkje i stand til å fastslå valt vevlesar!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" +"TCP port kan ikkje vere høgare enn 65532 fordi tenaren si UDPkopling er TCP+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Standardport vert nytta (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Tenarnamn" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Addresse" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Port" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Skildring" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Brukarar" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Filer" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Mislukka" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Statisk" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Utgåve" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Du er tilkopla ein tenar du freistar å slette. Vér god å kople frå først. " +"Tenaren vart IKKJE sletta." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Info" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(Ukjent namn)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Er du sikker på at du vil slette den statiske tenaren %s" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Ja" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Nei" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Greidde ikkje å opne '%s'" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Tenarar (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Tenar" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Kople til tenar" + +#: src/ServerListCtrl.cpp:428 +#, fuzzy +msgid "Mark server as static" +msgstr "Merk tenar(ar) som statisk(e)" + +#: src/ServerListCtrl.cpp:429 +#, fuzzy +msgid "Mark server as non-static" +msgstr "Merk tenar(ar) som ikkje statisk(e)" + +#: src/ServerListCtrl.cpp:431 +#, fuzzy +msgid "Mark servers as static" +msgstr "Merk tenar(ar) som statisk(e)" + +#: src/ServerListCtrl.cpp:432 +#, fuzzy +msgid "Mark servers as non-static" +msgstr "Merk tenar(ar) som ikkje statisk(e)" + +#: src/ServerListCtrl.cpp:438 +#, fuzzy +msgid "Remove server" +msgstr "Fjern tenar(ar)" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "Fjern tenar(ar)" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Fjern alle tenarar" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Kopiér ED2k lenke til utklippstavla" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "Kopiér ED2k lenke til utklippstavla" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Kople til tenar att" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Er du sikker på at du vil slette alle tenarane?" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Er du sikker på at du vil slette alle valte tenar(ar)?" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Er du sikker på at du vil slette alle valte tenar(ar)?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Deaktivert [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "Dette er aMule %s basert på eMule." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "Køyrer på %s" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" +"Vitje http://www.amule.org for å sjekke om ei ny utgåve er tilgjengeleg." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Alvorleg feil: Greidde ikkje å lage Timer" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "aMule fjernkontroll" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Bilete:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr "" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr "" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Melding" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Statustekst" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "Koplar til" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "Fråkopla" + +#: src/amuleDlg.cpp:676 +#, fuzzy +msgid "Kad: Firewalled" +msgstr "Brannmura" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "Tilkopla" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "Koplar til" + +#: src/amuleDlg.cpp:689 +#, fuzzy +msgid "Kad: Off" +msgstr " Kad: " + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "Stoppar noverande koplingsfreistnader" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Kople frå" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "Kople frå nettverket." + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Kople til" + +#: src/amuleDlg.cpp:726 +#, fuzzy +msgid "Connect to the currently enabled networks" +msgstr "Kople til nettverket." + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Opp:·%.1f(%.1f)·|·Ned:·%.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Opp:·%.1f·|·Ned:·%.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule·(%s·|·Tilkopla)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule·(%s·|·Fråkopla)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Vil du verkeleg avslutte aMule?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Stadfesting av avslutting" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Fann ikkje kommando for å køyre nettlesar." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "Skinnkatalogen '%s' finst ikkje" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "ÅTVARING: Greidde ikkje å opne skinnfila '%s' for lesing" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Nettverk" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Nettverksavindauge" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Søk" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Søkjevindauge" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Overføringar" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Filoverføringsvindauge" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Vindauge for delte filer" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Meldingar" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Meldingsvindauge" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Statistikk" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Statistikkgrafvindauge" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Innstillingsvalsvindauge" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Importér" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "Verkty for delfilimport" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "Om" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "Om/hjelp" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Generelt" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Kopling" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Proxy" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Meldingsfilter" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Fjernkontrollar" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Nettsignatur" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Katalogar" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Tryggleik" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "Draktinnstillingar" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Kjerneinnstillingar" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Hendingar" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Melde om feil" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Brukardefinert" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"aMule·treng omstart for å gjere endringane moglege:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "-·TCP-porten endra.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "-·UDP-porten endra.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"Lista for automatisk oppdatering av tenarer er tom.\n" +"Automatisk oppdatering av tenarlista ved oppstart er deaktivert." + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"Du har aktivert eksterne koplingar, men har ikkje skrive inn eit passord.\n" +"Eksterne koplingar kan ikkje aktiverast utan eit gyldig passord." + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- Språk endra.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- Mellombels mappe endra.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Opp:·0.0·|·Ned:·0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"Både ED2k og Kad er deaktivert.\n" +"Du kan ikkje kople til før du har aktivert minst ein av dei." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"Kad kan ikkje starte dersom UDP-porten er deaktivert.\n" +"Aktivér UDP-porten eller deaktivér Kad." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"Du MÅ starte om att aMule no.\n" +"Ikkje klag dersom du ikkje gjer dette og du får problem.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "ÅTVARING" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"Lista for automatisk oppdatering av tenarar er tom.\n" +"Vér god og fylle ut ein URL som peikar til ei gyldig server.met fil.\n" +"Klikk på knappen \"Liste\" ved denne boksen for å skrive inn ein URL." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "Mellombelse filer" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Innkomande filer" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Nettsignaturar" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Vel ei mappe for %s" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Bla gjennom wav" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "Wavfil·(*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Bla etter videospelar" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Vél nettlesar" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Køyrbar%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Redigér tenarliste" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Skriv inn URL`en for å laste ned server.met filer.\n" +"Berre ein URL på kvar linje." + +#: src/PrefsUnifiedDlg.cpp:980 +#, fuzzy, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Oppdateringsforseinking: %d sekund" +msgstr[1] "Oppdateringsforseinking: %d sekund" + +#: src/PrefsUnifiedDlg.cpp:987 +#, fuzzy, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Tid for gjennomsnittleg graf: %d minutt" +msgstr[1] "Tid for gjennomsnittleg graf: %d minutt" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Koplingsgrafskala: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, fuzzy, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Oppdateringsforseinking: %d sekund" +msgstr[1] "Oppdateringsforseinking: %d sekund" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, fuzzy, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Filbufferstorleik: %d bytes" +msgstr[1] "Filbufferstorleik: %d bytes" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, fuzzy, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Storleik på opplastingskø: %d klientar" +msgstr[1] "Storleik på opplastingskø: %d klientar" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, fuzzy, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Oppfriskingsintervall for tenarkopling: %d minutt" +msgstr[1] "Oppfriskingsintervall for tenarkopling: %d minutt" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Oppfriskingsintervall for tenarkopling: Deaktivert" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Køyr kommando på `%s' hending" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Aktivér kommandokøyring i kjernen" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Kjernekommando:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Aktivér kommandokøyring på drakt" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "Draktkommando:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "Følgjande variablar vert erstatta:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Uaotorisert freisting på tilgang. Kopling lukka." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Ekstern kopling lukka." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "Eksterne koplingar deaktiverte på grunn av tomt passord!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "Eksterne koplingar deaktiverte i konfigurasjonsfila" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Ny ekstern kopling akseptert" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "Feil: kunne ikkje godta ny ekstern kopling" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "Ekstern kopling nekta på grunn av tomt passord i innstillingar!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "Koplar til klient: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Ukjend utgåve" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"Ikkje rett EC utgåve ID: det kan vere binær inkompatibilitet. Bruk core og " +"remote frå same snapshot." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "Godkjenning mislukka." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Ugyldig protokullutgåve." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Manglande merkelapp for protokollutgåve." + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Ugyldig etterspurnad, du treng godkjenning først." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Tilgang innvilga." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "Kommando for fjern delfil mislukka: Filhash ikkje funnen: %s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "Filhash ikkje funnen: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "OPS! Handsamingsfeil i OpCode!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Tenar ikkje lagd til" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "tenar ikkje funnen: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "treng å velje tenar for fjerning" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "ED2k er deaktivert i innstillingar" + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "Søk i framdrift. Hentar inn att resultata om ein augneblink!" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "Nettsøk frå fjern adresse gir ikkje meining." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad er deaktivert i innstillingar." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Ingen punkt for graf." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "Klienten din er ikkje konfigurert for dette detaljnivået." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "Fjernkopling: ber om avslutting" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Avsluttar allereie." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "Eksternkopling: legg til lenke '%s'." + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Ikkje gangbar lenke eller lenka allereie på lista." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "Fil ikkje funne." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Ikkje gangbart filnamn." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Ikkje i stand til å døype om fila." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Allereie tilkopla ED2k." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Koplar til ED2k..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Allereie tilkopla Kad." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Koplar til Kad..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Alle nettverk er deaktiverte." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Fråkopla ED2k." + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Fråkopla Kad." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "Fjernkopling: ikkje gangbar opkode motteken: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "Ikkje gangbar opkode (feil protokollutgåve?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "Greidde ikkje å opne fila (%s), fjernar frå lista over delte filer." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "Hashsett etterspurt for ukjend fil: %s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "Kommandoen·`%s'·med·pid·`%d'·er ferdig med statuskode·`%d'." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "Tenar ikkje lagd til: Manglar IP eller vertsnamn." + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "Tenar ikkje lagd til: Ikkje gangbar tenarport." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "ED2k status:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Tilkopla" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Port" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Kademlia status" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Køyrer" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Status:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Fråkopla" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Tilkoplingsstatus:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Brannmura" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "OK" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Brannmura status: " + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Tilkopla kamerat" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "Ingen kamerat" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Gjennomsnitt brukarar:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "Gjennomsnitt filer:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "Køyrer ikkje" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Oppetid: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Overføring" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Opplastingar" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Opplasta data (økt (total)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Totalt dataoverskot (pakkar): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Dataoverskot på filetterspurnader (pakkar): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "Dataoverskot på kjeldeutveksling (pakkar): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Dataoverskot på tenar (pakkar): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Dataoverskot Kad (pakkar): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Aktive opplastingar: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Ventande opplastingar: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Tal på samtlege vellukka opplastingar: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Tal på samtlege mislukka opplastingar: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Gjennomsnittleg opplastingstid: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Nedlastingar" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Nedlasta data (økt (total)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Funne kjelder: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Aktive nedlastingar (delar): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Økt OL:NL proporsjon (total): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Gjennomsnittleg nedlastingsfart (økt): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Gjennomsnittleg opplastingsfart (økt): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Maksimal nedlastingsfart (økt): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Maksimal opplastingsfart (økt): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Attkoplingar: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Tid sidan første overføring: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Tilkopla tenar sidan: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Aktive koplingar (berekna): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Maksimal koplingsgrense nådd: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Gjennomsnittleg tal på koplingar (berekna): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Topp koplingar (berekna): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Klientar" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Filtrert" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Total:·%i·Kjend:·%i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Tenarar" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Fungerande tenarar: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Mislukka tenarar: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Total:·%s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Sletta tenarar: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Filtrerte tenarar: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Brukarar på fungerande tenarar: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "Filer på fungerande tenarar: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Totalt brukertal: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "Totalt filtal: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Tenerlast: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Tal på delte filer: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Total storleik på delte filer: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Gjennomsnittleg filstorleik: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "LågID:·%u·(%.2f%%·Total·%.2f%%·Kjend)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "Sikident·På/Av:·%u·(%.2f%%)·:·%u·(%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Operativsystem" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "Ikkje motteke" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Klipp ut" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Kopiér" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Lim inn" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Vél alle" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "Du kan ikkje søkje på Kad dersom Kad ikkje køyrer" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "Du kan ikkje søkje på ED2k dersom du ikkje er tilkopla ED2k" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Uventa feil oppstod under søk på Kad: " + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "Melding filtrért frå '%s'·(IP:%s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "Ny melding frå '%s'·(IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "Brukar %s·(%u) etterspurde liste over dei delte filene dine -> Godteke" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "Brukar·%s (%u)·etterspurde·liste·over·dei·delte·filene·dine·-> Nekta" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "Brukar %s·(%u) etterspurte lista di over delte katalogar -> Godteke" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "Brukar·%s (%u)·etterspurte·lista·di·over·delte·katalogar·->·Nekta" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"Brukar %s·(%u) etterspurte lista over delte filer for katalogen %s·-> godteke" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"Brukar·%s (%u)·etterspurte·lista·over·delte·filer·for·katalogen·%s ->·nekta" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "Brukar %s·(%u) deler katalogen %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "Brukar %s·(%u) sende ikkje etterspurte delte kataloger." + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "Brukar %s·(%u) sende liste over delte filer for katalogen %s" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "Brukar %s·(%u) er ferdig med å sende liste over delte filer" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "Brukar%s·(%u) sende ikkje etterspurt liste over delte filer" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "Brukar %s·(%u) nekta tilgang til delte kataloger/filer" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Noder (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "Ikkje gangbar IP for eigenoppstart" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Ikkje gangbar port for eigenoppstart" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Vér god å fylle ut alle naudsynte felt" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Er du viss på at du vil laste ned ei ny nodes.dat fil?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" +"Å gjere dette vil fjerne dine novérande noder og starte Kademlia på nytt." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Halde fram?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Feil: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Åtvaring: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Legg til ein kamerat" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Du må skrive inn ein gangbar IP og port!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Informasjon" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "Den innskrivne brukarhashen er ikkje gyldig!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Kjelder" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Fil" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Nedlasting" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Kategori" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Hovud" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Nedlasting i kategori" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "Søk beslekta filer (Ed2k, lokal tenar)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Kople til aMule over nettet" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Oppkopling mislukka " + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Feil" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"ÅTVARING: Du kan ikkje leggje deg sjølv til som kjelde for ei ED2k lenkje " +"medan du har lågID." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Brukarar:·E:·%s·K:·%s·|·Filer·E:·%s·K:·%s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Alle" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Brukarar totalt:·%s·|·Filer totalt:·%s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Overført" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Ferdig" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Fart" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Framdrift" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Status" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Attståande tid" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Sist sett komplett" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Sist motteke" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Er du viss på at du vil slette den valde fila/filene?" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Er du viss på at du vil slette den valde fila/filene?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Send melding til brukar" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Melding å sende:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "%Stopp" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Pause" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Hald fram" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "&Ta bort ferdige" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Byt alle A4AF til denne fila no" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Byt alle A4AF til denne fila (auto)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Byt alle A4AF til anna fil no" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Utvida innstillingar" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Førehandssyning" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Syn fil &detaljar" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Syn alle kommentarar" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Kopiér magnet URI til utklippstavla" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "ortildele" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Vel kategori" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "&Opne fila" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Fjerne frå kameratar" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Legg til kameratar" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Send melding" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Byt til denne fila" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d·%H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "QR:·%u·(%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Spurt etter anna fil (A4AF)" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Nedlastingar (%i)" + +#: src/DownloadListCtrl.cpp:2222 +#, fuzzy +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"Vér god å skrive inn videospelaren din i innstillingar.\n" +"I mellomtida vil aMul e freiste å nytte mplayer og du vil få denne åtvaringa " +"ved kvar førehandssyning" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Førehandssyning" + +#: src/DownloadListCtrl.cpp:2260 +#, fuzzy, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "FEIL: Greidde ikkje å køyre ekstern mediespelar!" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "FEIL: Greidde ikkje å opne delfil" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "FEIL: Greidde ikkje å lage delfil" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "Freistar å laste tryggleikskopi av met-fila frå %s" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "Feil: Greidde ikkje å opne part.met-fila: %s·==>·%s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "Feil: part.met fila er 0 i storleik: %s·==>·%s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "Feil: Ugangbar filutgåve av part.met: %s·==>·%s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" +"Feil: %s (%s) er korrupt (feil merkelappstejlar), ikkje i stand til å laste " +"fila." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "Freistar å hente fram att filinformasjon..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "Attskaper fil utan namn - freistar å attskape ho som RecoverdFile.dat" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "Attskapte all tilgjengeleg filinformasjon :D - Freistar å nytte den..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Ikkje i stand til å attskape filinformasjon :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Greidde ikkje å opne %s·(%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "Åtvaring: %s·kan vere korrupt·(%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "FEIL under lagring av delfila: %s·(%s·==>·%s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "'%s'·er 0 i storleik på ein eller annan måte·-·nyttar·%s·fila." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "Greidde ikkje å lagre part.met.seeds fila for %s" + +#: src/PartFile.cpp:1019 +#, fuzzy, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "Lagra %i kjeldefrø for delfila: %s·(%s)" +msgstr[1] "Lagra %i kjeldefrø for delfila: %s·(%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "Delfila %s·(%s) manglar kjeldefil" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "Delfila ·%s·(%s) har ei ugangbar kjeldefil" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "Feil i lesing av delfila si kjeldefil (%s·-·%s):·%s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, fuzzy, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"Fann korrupt del (%d) i %d delfila %s - Filresultathash |%s| Filhash |%s|" +msgstr[1] "" +"Fann korrupt del (%d) i %d delfila %s - Filresultathash |%s| Filhash |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "Fann ferdig del (%i)·i·%s" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "Ferdig med omhashing av %s" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "Uventa feil under ferdigstilling av %s. Fila er sett på pause" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Ferdig med å laste ned: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "Slettar fila: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" +"Åtvaring: Ikkje i stand til å hashe nedlasta del - hashsett ikkje " +"fullstendig for '%s'" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"Feil: Ikkje i stand til å hashe nedlasta del - hashsett ikkje fullstendig (%" +"s). Dette burde aldri skje" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "ÅTVARING: Ikkje nok ledig diskplass! Set fila %s på pause" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "Nedlasta del %i er korrupt i fila: %s" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH: Attskapte korrupt del %i·for·%s·->·Lagra bytes:·%s" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Ikkje nok diskplass" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Stogga" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "Åtvaring: known.met lét seg ikkje opne." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "Åtvaring: Kjendfillista er korrupt, inneheld ugangbar overskrift." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "IO feil underlesing av known.met fila: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "Feil under lagring av known.met fila: %s" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "Funne %i delte filer" +msgstr[1] "Funne %i delte filer" + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "Funne %i delte filer, %i ukjende" +msgstr[1] "Funne %i delte filer, %i ukjende" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "FEIL! Freistar å dele %s" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Filkommentarar" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Verdi" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Kommentar" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Ingen kommentarar" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%s kommentar(ar)" +msgstr[1] "%s kommentar(ar)" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"Greidde ikkje å kople til alle tåkelagde tenarar i lista. Freistar ein gong " +"til utan tåkelegging." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "" +"Greidde ikkje å kople til alle tenarane i lista. Freistar ein gong til." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "ED2k nettverket er deaktivert i innstillingar, koplar ikkje til." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "Ingen gangbare tenarar funne i tenarlista" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Tilkopla %s·(%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Kopling oppretta på: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "Alvorleg feil i oppkopling. Internett kan vere nede" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Mista kopling til %s·(%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s·(%s:%i) ser ut til å vere daud." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s·(%s:%i) ser ut til å vere full." + +#: src/ServerConnect.cpp:391 +#, fuzzy, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "Automatisk tilkopling til tenar; freistar igjen om %d sekund" +msgstr[1] "Automatisk tilkopling til tenar; freistar igjen om %d sekund" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Kopling mista" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "Tilkopling til %s·(%s:%i)·mislukka." + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "Feil: Ugyldig kontakt ved tidsutsjekking" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "Tilkoplingsfreisting til %s·(%s:%i)·gjekk over tida." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Ingen delfiler funne" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "Funne %u delfiler" +msgstr[1] "Funne %u delfiler" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Lastar ned %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Du freistar allereie nedlasting av fila '%s'" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Du har allereie fila: '%s'" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Du freistar allereie nedlasting av fila %s" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "Kan ikkje konvertere magnet lenkje til ED2k: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "Ukjend lenkjeprotokoll for: %s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Ugangbar ED2k lenkje! Feil: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "Køyr og avslutt." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Ugangbart IP-format. Bruk xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +#, fuzzy +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" +"Denne kommandoen treng eit argument. Gangbare argument: 'all' eller eit " +"tal.\n" + +#: src/TextClient.cpp:343 +#, fuzzy +msgid "Processing by hash: " +msgstr "Handsamar filnummer %u: %s" + +#: src/TextClient.cpp:358 +#, fuzzy +msgid "Processing by filename: " +msgstr "Handsamar filnummer %u: %s" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Ikkje gangbart tal\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "Ikkje gangbar hash (lengde må vere nøyaktig 32 teikn)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "Operasjonen var vellukka" + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "Etterspurnaden mislukka med følgjande feil: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "IP-filtréring for klientar er %s.\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "AV" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "PÅ" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "IP-filtréring for tenarar er %s.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "Novérande IPFilternivå er %d.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Bandbreiddegrense: Opp: %u·kB/s,·Ned:·%u·kB/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2k" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Tilkopla %s·%s·%s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "med LågID" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "med HøgID" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Koplar til no" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Ikkje tilkopla" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Nedlasting:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Opplasting:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Klientar i kø:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Alle kjelder:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Tal på søkjeresultat: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "TODO - syne framdrifta på eit søk" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Tok imot ukjend svar frå tenaren, OpCode·=·%#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Syne kort statusinformasjon." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "Syne koplingsstatus, noverande opp- og nedlastingsfart, osb.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Syne fullt statistikktre." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"Alternativt kan eit tal mellom 0-255 skrivast inn som argument for denne\n" +"kommandoen, som fortel kor mange inskripsjonar frå undertréa til " +"klientutgåva skal verte\n" +"synte. Å skrive 0 eller å hoppe over betyr 'ubegrensa'.\n" +"\n" +"Til dømes: 'statistics 5' vil berre syne dei 5 utgåvene på top for kvar " +"klienttype.\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "Avslutt aMule" + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Avslutt den fjerne kjernen (amule/amuled).\n" +"Dette vil i tillegg avslutte tekstklienten, ettersom den er ubrukeleg utan " +"ei\n" +"køyrande kjerne.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Lastar inn att valt objekt." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "Lastar inn att lista over delte filer." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "Lastar om att ipfiltertabell frå fil." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Kople til nettverket." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"Dette vil kople til alle nettverka som er aktiverte i innstillingar.\n" +"Dy kan óg valfritt gje ei tenaradresse i IP:Port form, for å berre kople " +"til\n" +"den tenaren. IP`en må vere ei punktmerka og desimal IPv4-adresse.\n" +"eller eit løyseleg DNS-namn." + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Berre kople til ED2k." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Berre kople til Kad." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Kople frå nettverket." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "Dette vil kople frå alle nettverka som no er kopla til.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Berre kople frå ED2k." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Berre kople frå Kad." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Legg til ei ED2k lenkje eller magnet lenjke til kjerne " + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"ED2k lenkja som skal leggjast til kan vere:\n" +"*) ei fillenkje (ed2k://|file|...), som vil verte lagd til nedlastingskøa,\n" +"*) ei tenarlenkje (ed2k://|server|...), som vil verte lagd til tenarlista,\n" +"*) eller ei tenarlistelenkje, der alle tenarane på lista vert langde til\n" +"...tearlista.\n" +"\n" +"Magnetlenkja må innehalde ED2k hashen og fillengda.\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Set ein brukarvalverdi." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "Set brukarval for ipfilter." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "Slå IP-filtréring på for både klientar og tenarar." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "Slå IP-filtréring av for både klientar og tenarar." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "Aktivér/deaktivér IP-filtrering av klientar." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "Slå IP-filtréring på for klientar." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "Slå IP-filtréring av for klientar." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "Aktivér/deaktivér IP-filtrering av tenarar." + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "Slå IP-filtréring på for tenarar." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "Slå IP-filtréring av for tenarar." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "Vel Ipfilternivå" + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"Gangbart filtréringsnivå er mellom 0-255, og den opprinnelege\n" +"verdien er 127.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Set bandbreiddegrense." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "Verdien i desse kommandoane må vere i kilobytes/sek.\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Set bandbreiddegrense for opplastingar." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "Set bandbreiddegrense for nedlastingar." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Hent og syne ein preferanseverdi." + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "Hent ipfilterinnstillingar" + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "Hent ipfilterstatus for både klientar og tenarar." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "Hent ipfilterstatus for klientar." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "Hent ipfilterstatus for tenarar." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "Få " + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Hent bandbreiddegrense." + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Lagar eit søk." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"Ei søkjetype må verte spesifisert:\n" +"····GLOBAL\n" +"····LOKAL\n" +"····KAD\n" +"Døme:·'søk kad fil'·vil starte eit kadsøk for \"fil\".\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Startar eit globalt søk" + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Startar eit lokalt søk" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Startar eit kadsøk" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Syne resultata av siste søk." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Returnerer resultata frå det tidlegare søket.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Start nedlasting av ei fil" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"Talet på ei fil frå siste søk må verte gjeve.\n" +"Døme: 'download·12' vil starte nedlastinga av fil nummer 12 frå forrige " +"søk.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Set nedlasting på pause" + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Hald fram nedlasting" + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Avbryt nedlasting" + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Set nedlastingsprioritet." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "Gje prioritet Låg, Normal, Høg eller Auto til ei nedlasting.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "Set prioritet til låg." + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "Set prioritet til normal." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "Set prioritet til høg." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "Set prioritet til auto." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Syne køer/lister." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Syner opplastings-/nedlastingskøa, tenarlista eller lista over delte filer.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Syne opplastingskø" + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Syne nedlastingskø." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Syne logg." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Syne tenarlister." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Nullstill logg" + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->tenarliste->GetServerByAddress()·ga attende NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "Feil: %s·(%s)·-·%s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "Åtvaring: %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Ny klientid er %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "\tTruleg har dette skjedd fordi du er bak ein brannmur eller ruter." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tFor meir informasjon, sjå http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "Ukjend tenarinfo motteke! - for kort" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "Tok imot %d nye tenarar" +msgstr[1] "Tok imot %d nye tenarar" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Lagring av tenarlista ferdig." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "Tenar avviste siste kommando" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Falske pakkar mottekne frå tenar: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "Urøyvd feil under handsaming av pakke frå tenar: %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "Kan ikkje skape DNS-løysande tråd for å kople til %s" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "Tenar IP %s·(%s) er filtrert. Koplar ikkje til." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "brukar protokolltåkelegging." + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "Koplar til·%s·(%s·-·%s:%i)·%s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "Greidde ikkje å løyse dns for tenar %s: Greier ikkje å kople til!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "CIP2Country::CIP2Country():·Greidde ikkje å laste landsdata frå " + +#: src/IP2Country.cpp:73 +#, fuzzy, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "Lasta %d flaggbilete." +msgstr[1] "Lasta %d flaggbilete." + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"Er du viss på at du vil avbryte og slette alle filene i denne kategorien?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Stadfesting naudsynt" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Alle andre" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Uferdig" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Aktiv" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Video" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Lyd" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Arkiv" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "CD-bilete" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Bilete" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Tekst" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Vel synsfilter" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Legg til kategori" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Redigér kategori" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Ta bort kategori" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "Importerer %s:·%s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "Les mellombels mappe" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "Hentar grunnleggjande informasjon frå nedlastingsinformasjonfil" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "Lagar målfil" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "Lastar data frå gamal nedlastingsfil (%u·av·%u)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "Lagrer datablokk til ei einaste nedlastingsfil (%u·of·%u)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "Hentar informasjon frå nedlastingsfilkjelde" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "Legg til nedlasting og lagrar ny delfil" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Hentar status..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "I framdrift" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Feil: Tom for diskplass" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Feil: part.met ikkje funnen!" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Feil: IO feil!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Feil: Mislukka!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "I kø" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Lastar allereie ned" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Ukjend eller dårleg format på tempfil." + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Filnamn" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Tilstand" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Filhash" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Importér delfiler" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"Vér god å velje ei katalog til å søkje på mellombelse nedlastingar! " +"(underkatalogar vil verte inkluderte)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "Vil du slette kjeldefilene til vellukka importerte nedlastingar?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Ta bort kjelder?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Ventar..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s·(Disk:·%s)" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "bytes" +msgstr[1] "bytes" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "bytes/sek" +msgstr[1] "bytes/sek" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "sekund" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "minutt" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "timar" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "Dagar" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Videoar" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Arkiv" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Tekstar" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Program" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Alle" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Ikkje gitt verdi" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Ugyldig / Korrupt /Falsk" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Dårleg" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Middels" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "God" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Utmerka" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "alle" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "alle andre" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "Lastar ipfiltra 'ipfilter.dat'·og·'ipfilter_static.dat'." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "Greidde ikkje å laste inn ipfilter.dat fila '%s' - ukjend filformat." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" +"Greidde ikkje å laste inn ipfilter.dat fila '%s' - greidde ikkje å opne fila." + +#: src/IPFilter.cpp:330 +#, fuzzy, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "Lasta %u IP-distansar frå '%s'. %u ugangbare linjer vart forkasta." +msgstr[1] "Lasta %u IP-distansar frå '%s'. %u ugangbare linjer vart forkasta." + +#: src/IPFilter.cpp:332 +#, fuzzy, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "Lasta %u IP-distansar frå '%s'. %u ugangbare linjer vart forkasta." +msgstr[1] "Lasta %u IP-distansar frå '%s'. %u ugangbare linjer vart forkasta." + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Aktive koplingar (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Fildetaljar" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%%·ferdig" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "ED2k-lenkje: " + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Iverksetje" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" +"Klikk her for å leggje til ED2k lenkja i tekstkontrollen til nedlastingskøa " +"di." + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "Utsprett status tekst" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Lastar ..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"Hendingar visast her. Sjå i loggen under Tenarar for å sjå alle hendingane." + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Tal på brukarar på tenaren du er tilkopla ..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Brukarar: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" +"Brukarar tilkopla den aktuelle tenaren or eit overslag over det totalt " +"antalet brukarar." + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"Novérande gjennonmsnittleg opplastings- og nedlastingsrater. Dersom aktivért " +"vil tala i parantés syne dataoverskotet frå klientkommunikasjon." + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"Syner novérande sratus og aktive overføringar. Raude piler syner at du ikkje " +"er tilkopla akkurat no, gule piler syner at du har ein låg ID (brannmura) og " +"grøne piler syner at du har ein høg ID (Denbeste tilkoplingstypen)." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Ikkje tilkopla ..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Novérande tilkopla tenar." + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Søk" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Namn:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Lokal" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Global" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "Filhash" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Utvida parameter" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Filtrerer" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Filtype" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Filetternamn" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Min storleik" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Bytes" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Maks storleik" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Tilgjenge" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Filter:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Filtrér resultat" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Snu resultat" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Gøyme kjende filer" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Meir" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "Søkjer etter flere resultat på ED2k. Ikkje støtta i Kad enno." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Stopp" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Nullstill felta" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Resultat" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Ryddar bort ferdige nedlastingar" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Syner opplasting / oppkøa" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Klientar i kø :" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Send" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Sender meldinga." + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Stengje" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Stengje denne lynmeldingsøkta." + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Fullt namn :" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "I/T" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "metfil :" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Hash :" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Filstorleik :" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Delfilstatus :" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Sist sett komplett :" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Funne kjelder :" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Overfører kjelder :" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Fildelstal :" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Tilgjengeleg:" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Datasnøggleik :" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Aktiv nedlastingstid: " + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Overført :" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Ferdig storleik :" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Intelligent Korrupsjonshandsaming" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Tapt gjennom korrupsjon :" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Vunne gjennom komprimering :" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "Pakkar lagra av I.C.H. :" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Filnamn" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Overtaking" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Opprensking" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Utfør" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Ok" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "Kommentér/verdigjé fila (Teksten vert synleg for alle brukarar)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"For ein film kan du skrive lengda, historia, språket ...\n" +"og dersom den er falsk kan du fortelje det til andre brukarar." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Filkvalitet" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" +"Vél filverdi eller gje melding til andre brukarar dersom fila er falsk ..." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Ingen kommentar(ar)" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Oppfrisk" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Lastar ned, vér god å vente ..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Ukjend storleik" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Naudsynt informasjon" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "IP-adresse :" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Port :" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Tilleggsinformasjon" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Brukarnamn :" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Brukarhash :" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Lastar inn att delte filer" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Novérande økt" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Totalt" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Etterspurt :" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Aktive opplastingar :" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Nedlastingsfart" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Novérande" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Køyregjennomsnitt" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Gjennomsnitt økt" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Opplastingsfart" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Koplingar" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Aktive nedlastingar" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Aktive koplingar (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Aktive opplastingar" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Statistikktre" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Brukarnamn:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Brukarhash:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Klientmjukvare:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Klienten si utgåve:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "IP-adresse:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "BrukarID:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "Tenar IP:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Tenarnamn:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "Overføringar til klient" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Novérande etterspurnader:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Gjennomsnittleg opplastingsfart:" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Gjennomsnittleg nedlastingsfart:" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Opplasta (økt):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Lasta ned (økt)" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Opplasta (totalt):" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Lasta ned (totalt)" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Scorar" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "NL/OL endringsfaktor:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Sikker identifikasjon:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Verdigjeving (total):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Køscore" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Brukarval" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Kallenamn" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org·-·Linux-muldyret" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "Dette er namnet andre brukarar vil sjå når dei koplar til maskina di." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Språk" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "Dette vel språket som vert nytta på kontrollane." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Ymse brukarval" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Sjå etter ny utgåve ved oppstart" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" +"Aktivering av denne vil få aMule til å sjå etter ei ny utgåve ved oppstart." + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Start minimert" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "Aktivering av denne minimerer aMule ved oppstart." + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Stadfest avslutting" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "Får aMule til å be om stadfesting før avslutting." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Aktivér trauikon" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "" +"Dette aktiverer/deaktiverer ikonet i systemtrauet (eller oppgåvelinja)." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "Minimér til trauikon" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" +"Akrivering av denne vil få aMule til å minimere seg til systemtrauet og " +"ikkje til oppgåvelinja." + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Tidsforseinking på verktytips i sekund" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "Forseinkinga før ein syner verktytips." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Nettlesarval" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Vel nettlesar her" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Eigenvalt nettlesar" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Skriv nettlesarnamnet her. For å nytte ein eigen nettlesar, vel ein i " +"nedtrekksmenyen over." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Opne nytt faneblad dersom mogleg" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "Opne ny nettside i nytt faneblad i staden for nytt vindauge når mogleg" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Bandbreiddegrenser" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Opplasting" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Opningsdistribusjon" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Linjekapasitet" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Standard klient TCP-port:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "Dette er den vanlege ED2k-porten og kan ikkje deaktiverast." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Utvida UDP port for klient:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" +"Dette er UDP-porten, som vert nytta til utvida ED2k forespurnader og " +"kadnettverket" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "deaktivere" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Bind adresse" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "UDP-port for utvida tenarførespurnader (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Maks kjelder per fil" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Hard grense" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Koplingsgrenser" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Maks koplingar" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Universell·Plug·and·Play" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "Aktivér UPnP" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "UPnP·TCP-port:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Automatisk tilkopling ved oppstart" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Kople til dersom fråkopla" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Syne dataoverskotsbandbreidde" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Tenarval" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Ta bort daude tenarar etter" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "freistnader" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Automatisk oppdatering av tenarlista ved oppstart" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Liste" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Oppdater tenarlista ved tilkopling til ein tenar" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Oppdatere tenarlista når ein klient koplar til" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Bruk prioritetssystem" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Bruk smart LågID sjekk ved tilkopling" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Trygg tilkopling" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Automatisk tilkopling berre til tenarar i statisk liste" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Gje høg prioritet til manuelt tillagde tenarar" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "I.C.H. aktiv" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICH stolar på alle hashar (ikkje tilrådd)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Legg filer til nedlasting i pausemodus" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Legg filer til nedlasting med autoprioritet" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Prøv å laste ned første og siste del først" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Legg til nye delte filer med autoprioritet" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Forsøk å overføre heile delar til alle opplastingar" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Start neste fil på pause når ei fil vert ferdig." + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "Frå same kategori" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "Lagre 10 kjelder til sjeldne filer (< 20 kjelder)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Diskplass" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Sjekk diskplass" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "Vel dette dersom du vil at aMule skal sjekke diskplassen din" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Minste diskplass" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Skriv inn mimimum ønska diskplass." + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Innkomande mappe :" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Mellombels katalog :" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Delte katalogar" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "(Høgreklikk på mappeikonet for å dele underkatalogar)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Dele gøymde filer" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Videospelar" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Lag tryggleikskopi for førehandssyning" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Grafar" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Oppdateringsforseinking: 5 sek" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Tid for gjennomsnittleg graf: 100 min" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Koplingsgrafskala: 100 " + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Vel statistikkfargar" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Bakgrunn" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Rutenett" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Last ned novérande" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Last ned køyregjennomsnitt" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Last ned øktgjennomsnitt" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Opplasting no" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Gjennomsnittleg køyrande opplasting" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Gjennomsnittleg økt opplasting" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Aktive koplingar" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Fartslinje i ikontrauet" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Kadnodar no" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Køyrande kadnodar" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Kadnodar (økt)" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Velje" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Tal på klienutgåver synt (0=uinnskrenka)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Meldingar" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Oppsprettmeldingar" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Bruk lyd" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Sprett ut når :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Ny oppføring i logg" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Startar ei ny lynmeldingsøkt" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Ei ny melding er motteken" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Ei nedlasting er lagd til eller ferdig" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Ny utgåve av aMule funne" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "Viktig OOD, tenarkopling mista" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Epostmelding" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Send ein epost når overføring er ferdig" + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "SMPT-tenar :" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "Epostadresse :" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! ÅTVARING !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Ikkje endre desse innstillingane med mindre du veit\n" +"kva du gjer, ellers kan du fort\n" +"gjere ting verre for deg sjølv.\n" +"\n" +"aMule køyrer fint utan justering av nokon av\n" +"desse innstillingane." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Avanserte innstillingar" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Maks nye koplingar / 5 sek" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Filbufferstorleik: 240000·bytes" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Storleik på opplastingskø: 5000 klientar" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Oppfriskingsintervall for tenarkopling: Deaktiver" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "Draktinnstillingar" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Filframgang i nedlastingskø" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Syne prosent" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Syne framdriftsbar" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Stil på framdriftsbar" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Flat" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Rund" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Hudstøtte" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Aktiver hudstøtte" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Hud:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- ingen huder tilgjengeleg -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Kolonnesortering" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "Automatisk sortering av filene i nedlastigskøa (høg CPU)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "aMule sorterer kolonnene i nedlastingslista di automatisk" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Ymse draktinnstillingar" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Syne snøgg ED2k lenkjehandsamar" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Syne utvida informasjon i kategorifaneblad" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Syne overføringsfart i tittellinja" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Vertikal verktylinjeorientering" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Syne delfilnummer før filnamn" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Fjernkontroll" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Vevtenarparameter" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Køyre amuleweb ved oppstart" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Vevtenarport" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "Aktivér UPnP portvidaresending på vevtenarporten" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Vevtenaren sin UPnP·TCP-port" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Sideoppfriskingstid (i sekund)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Aktivér Gzipkompresjon" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Aktivér brukar med få rettar" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Passord for fulle rettar" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Passord for låge rettar" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Vevmønster" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Parameter for ekstern kopling" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Akseptér eksterne koplingar" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"IP for lyttande grensesnitt\n" +"(tom for einkvar)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Skriv in ei gyldig IP i a.b.c.d format for det lyttande EC-grensesnittet. " +"Eit tomt felt eller 0.0.0.0 betyr samtlege grensesnitt." + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "TCP-port" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "Aktivér UPnP-portvidaresending på EC-porten" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "Klikk her for å utføre samtlege endringar gjorde i innstillingar." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Nullstill alle endringar i innstillingar." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Tittel :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Kommentar :" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Innkomande kat:" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Endre prioritet for nytileigna filer :" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Ikkje endre" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Vel farge for denne kategprien (no valt)" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Syne tenar motd når tilkopla ..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Tenarinfo" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Klikk denne knappen for å nullstille loggen." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "aMulelogg" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "Klikk på denne knappen for å oppdatere tenarlista frå nettadresse ..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Tenarliste" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Skriv inn nettadressa til ei server.met fil her og klikk på knappen til " +"venstre for å oppdatere tenarlista." + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Legg til tenar manuelt : Namn" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Skriv inn namnet på den nye tenaren her" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Skriv inn IP`en til tenaren her, i x.x.x.x format." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Skriv inn porten til tenaren her." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "Legg til ein tenar manuelt (fyll først ut felta til venstre) ..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "ED2k-info" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Kad-info" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"Dei lokale innstillingane ser ikkje ut til å vere installert på maskina di\n" +"Du må generere den for å nytte dette språket.\n" +"Ein god start på linuxsystem er fila /etc/lokale.gen og pakken 'locales'\n" +"Lukke til!\n" +"(Merk: Eg freistar å velje det likevel)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Aldri syne dette igjen" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "" +"Klikk på denne knappen for å oppdatere nodelista frå internettadresse ..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Nodar (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"Skriv inn internettadressa til ei nodes-dat fil her og klikk på knappen til " +"venstre for å oppdatere lista over kjende nodar." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Nodestatistikk" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Eigenoppstart" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Ny node" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Port:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Eigenoppstart frå \n" +"kjende klientar" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Kople frå Kad" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Protokolltåkeleggjing" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Støtte protokolltåkeleggjing" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"Dette valet aktiverer protokolltåkeleggjing og gjer at aMule tek imot " +"tåkelagde koplingar frå andre klientar." + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Bruk tåkeleggjing for utgåande koplingar" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"Dette valet får aMule til å nytte protokolltåkeleggjing ved tilkopling til " +"andreklientar/tenarar." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Berre godta tåkelagde koplingar" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"Dette valet får aMule til å berre godta tåkelagde koplingar. Du vil få færre " +"kjelder, men all trafikken din vert tåkelagd" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Filinnstillingar" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Alle" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Ingen" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Kven kan sjå delte filer:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "Vel kven som kan be om å sjå ei liste over dei delte filene dine." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "IP-filtrering" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Filtrér klientar" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "Aktivér IP-filterring av klientar i fila ~/.aMule/ipfilter.dat." + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Filtrér tenarar" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "Aktivér filtrering av tenarar i fila ~/.aMule/ipfilter.dat." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Last om att lista" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "Last om att lista av IP`ar å filtre frå fila ~/.aMule/ipfilter.dat" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "Nettadresse:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Oppdatér no" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Automatisk oppdatér ipfilter ved oppstart" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Filternivå:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Alltid filtrér LAN IP`ar" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Paranoid handsaming av ujamne IP`ar" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Avviser pakkar dersom klientadressa er ulik adressa pakken vert motteken " +"frå. Vér varsam med dette." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Aktivér/deaktivér" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Aktivér nettsignatur" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Aktiverer skriving av OS-fila, som kan verte nytta av eksterne program forå " +"lage signaturar og liknande." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Oppdateringsfrekvens (sekund):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "Endre frekvensen (i sekund) for oppdatering av nettsignaturar." + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Nettsignaturkatalog:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "Klikk her for å velje katalogen med nettsignaturfilene." + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Deaktivere/Aktivere" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "Filtrér innkomande meldingar (utanom novérande samtale):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Filterval:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Filtrér alle meldingar" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Filtrér meldingar frå alle som ikkje er på kameratlista" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Filtrér meldingar frå ukjende klientar" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Filtrér meldingar som inneheld (bruk ','som skiljeteikn):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "legg til ord aMule skal filtrére og blokkere" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Kommentarar" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "Filtrér kommentarar som inneheld (bruk ',' som skiljeteikn):" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Aktivér vikar" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Aktivere/deaktivere vikarstøtte" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Vikartype:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "Typen vikar du koplar til" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Vikarvert:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "Vikaren sitt vertsnamn" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Vikarport:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "Vikarport" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Godkjenning" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Aktivér godkjenning" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Aktivér/deaktivér godkjenning av brukarnamn/passord" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "Brukarnamn å nytte for å kople til vikar" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Passord:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "Passord å nytte for å kople til vikar" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Automatisk tenartilkopling utan vikar" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Kople til:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Logge inn på fjern aMule" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Brukarnamn" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Hugs desse innstillingane" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Aktivér utførleg avfeilingslogg." + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "Meldingskategoriar:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "Importér" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Prøv om att valde" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Fjern valde" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Hendingstypar" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Kople til vilkårleg tenar og/eller Kad" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Ny kategori" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Vél ei mappe for innkomande filer" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Du må skrive inn eit namn på kategorien!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Du mp skrive inn ein sti for kategorien!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"Greidde ikkje å skape innkomande katalog for kategorien. Vér god å skrive " +"inn ein gangbar sti!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "Ukjend forlenging·'%s'·for·'%s'·kommandoen.\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "Ukjend kommando '%s'.\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"Denne kommandoen kan ikkje ha eit argument.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"Denne kommandoen må ha eit argument.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Denne kommandoen er ikkje komplett; du må nytte ein av forlengjarane under.\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Tilgjengelege forlengjarar:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Tilgjengelege kommandoar:\n" + +#: src/ExternalConnector.cpp:188 +#, fuzzy, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"Alle kommandoar kan skrivast med store eller små bokstavar.\n" +"Skriv 'help·'for å få detaljert info om·.\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Avsluttar programmet." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Syne hjelp." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"For å få hjelp til ein kommando, skriv 'help·'.\n" +"For full kommandoliste, skriv 'help'.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"Bruk·'%s'·for·kommandoliste\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Syntaksfeil!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Handsamingsfeil av kommando - burde aldri skje! Vér god å rapportere feilen\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Denne kommandoen skulle ikkje ha nokon parameter." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Denne komamndoen må ha eit parameter." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Ugangbart argument." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Denne kommandoen er ikkje komplett." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Skriv '%s'·for å få meir hjelp.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "Dette er %s·%s·%s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "Dette er %s·%s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Opprettar klient...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "" +"Greidde ikkje å opprette kopling. Ikkje i stand til å kople til verten\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"Ok,·avsluttar·%s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"Kan ikkje kople til med eit tomt passord.\n" +"Du må skrive inn eit passord anten i konfigurasjonsfila,\n" +"i kommandolinja eller når du vert spurt.\n" +"\n" +"Avsluttar...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Syne denne hjelpeteksten." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "Vert der aMule køyrer (standard: localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "aMule sin port for eksternkopling (standard: 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Passord for eksternkopling." + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Les innstillingar frå fil." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "Ikkje skriv ut data til stdout." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Vér utførleg - syne óg avfeilingsmeldingar," + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Set programspråk." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "Skriv kommandolinjealternativa til konfigurasjonsfila." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "Lagar konfigurasjonsfil basert på aMule si konfigurasjonsfil." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Skriv programutgåve." + +#: src/ClientCreditsList.cpp:168 +#, fuzzy, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "Kredittfila lasta, %u klientar er kjende" +msgstr[1] "Kredittfila lasta, %u klientar er kjende" + +#: src/ClientCreditsList.cpp:171 +#, fuzzy, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] " - Kredittar gått ut for %u klientar!" +msgstr[1] " - Kredittar gått ut for %u klientar!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "Inga 'cryptkey.dat' fil funne - opprettar." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"FEIL: aMule daemon kan ikkje nyttast dersom eksterne koplingar er " +"deaktiverte. For å aktivere eksterne koplingar må du anten nytte vanleg " +"aMule, starte amuled med valet --ec-config eller set lykelen " +"\"AcceptExternalConnections\" til 1 i fila ~/.aMule/amule.conf" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "Feil: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Gje amnesti" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Syne opplastingar" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Syne kø" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Syne klientar" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Vel utsyn" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Klientmjukvare" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Venta" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Opplastingstid" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Opplasting/nedlasting" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Fjernstatus" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "KR: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Filprioritet" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Score" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Spurt" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Sist sett" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Kom inn i kø" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Opplastingsstatus" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Overført Opp" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Nedlastingsstatus" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Overført Ned" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Brukarhash" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Kryptért" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Gøyme delte filer" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Klientdetaljar" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f·kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Ikkje støtta" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Ikkje ferdig" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Kjeltring" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Granska - OK" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Ikkje tilgjengeleg" + +#: src/ClientDetailDialog.cpp:190 +#, fuzzy, c-format +msgid "%u (QR: %u)" +msgstr "KR: %u" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "Min storleik må vere mindre enn maks storleik. Maks storleik ignorert." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Søkeåtvaring" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Ubegrensa" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "aMule traumeny" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Fartsgrenser:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "OL: Inga" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "OL: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "NL: Ingen" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "NL: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Nedlastingsfart: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Opplastingsfart: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Klientinformasjon" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Kallenamn: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "Ikkje valt kallenamn!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "KlientID: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Tenarnamn: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "TenarIP: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP:·%s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "TCP-port: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "TCP-port: Ikkje klar" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "UDP-port: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "UDP-port: Ikkje klar" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Nettsignatur: Aktivert" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Nettsignatur: Deaktivert" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Delte filer: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Klientar i kø: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "Totalt NL: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "Totalt OL: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Opplastingsgrense" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Nedlastingsgrense" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "Gøyme aMule" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "Syne aMule" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "Lynmeldingsøkt starta: %s·(%s:%u)·-·%s·%s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "***·Tilkopla klient·***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "***·Koplar til klient·***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Greidde ikkje å kople til klient / Kopling mista ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Stengje faneblad" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Stengje alle faneblad" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Stengje andre faneblad" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "Lastar server.met fila: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "Server.met fila ikkje funnen!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "Greidde ikkje å laste inn server.met fila '%s' - ukjend filformat." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "Greidde ikkje å opne server.met!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"Server.met fila er korrupt, ugangbar merkelapp på utgåve: 0x%x,·storleik·%i" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "%i tenarar i server.met funne" +msgstr[1] "%i tenarar i server.met funne" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d tenarar lagde til" +msgstr[1] "%d tenarar lagde til" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Tenar ikkje lagd til: [%s:%d] oppgir ikkje ein gangbar port." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "Tenar ikkje lagd til: IP`en til [%s:%d] er filtrert eller ugangbar." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "Tenar ikkje lagd til: Tenar med lik IP:Port [%s:%d] funne i lista." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Tenar lagd til: Tenar på [%s:%d] som nyttar namnet '%s'." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"Du er tilkopla tenaren du freistar å slette. Vér god å kople frå først." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Greidde ikkje å lagre server.met!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "Ugangbar URL" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Greidde ikkje å laste ned tenarlista frå %s" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"Ingen tenarlisteadresser funne i 'addresses.dat'. Vér god å lime inn ei " +"gangbar adresse til tenarliste i denne fila for automatisk oppdatering av " +"tenarlista di" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" +"Åtvaring, ugangbar nettadresse spesifisert for automatisk oppdatering av " +"tenarane: %s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "Ugangbar autonedlastingsnettside for server.met i addresses.dat" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "Lokal tenar er filtrert av ipfiltra - koplar til ein anna tenar!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "Greidde ikkje å utføre kommendoen `%s'·på·`%s hending." + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"Dine lokale innstilingar har vorte endra til opprinnelege " +"systeminnstillingar på grunn av konfigurasjonsending. Beklager." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"Du har ingen tenarar i tenarlista.\n" +"Vil du at aMule skal laste ned ei ny liste no?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Nedlasting av tenarliste" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "vevtenar køyrer på pid %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"Du freista å køyre vevtenar frå start, men binærane til amuleweb lét seg " +"ikkje køyre. Vér god å installere pakken som inneheld aMule vevtenar, eller " +"kompilér aMule med --aktivér vevtenar og køyr make install." + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "Port·%u er ikkje tilgjengeleg. Du vil få LågID\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"Port·%u·er ikkje tilgjengeleg!\n" +"\n" +"Dette betyr at du vil vere LågID.\n" +"\n" +"Sjekk nettverket ditt for å vere viss på at porten er open for inn- og " +"utgåande trafikk." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Greidde ikkje å lage OnlineSigfil" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "Greidde ikkje å lage aMule si OnlineSigfil." + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"Dei valte lokale innstillingane ser ikkje ut til å vere installerte på " +"maskina di. (Merk: Eg freistar å setje dei likevel)" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "Dette er første gongen du køyrer aMule %s" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "Denne utgåva er ei testutgåve, oppdatert dagleg, og\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "vi gir ingen garanti for skade eller nedbrenning av huset ditt,\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "eller drep hunden din. Men det *burde* vere trygt å nytte uansett.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" +"Dei følgjande alternativa har vorte endra i denne utgåva av " +"tryggleiksomsyn:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"*·Støtte for protokolltåkeleggjing er aktivert for innkomande og utgåande " +"koplingar.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* Oppdatering av tenarlista frå andre tenarar og klientar er deaktivert.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"For meir informasjon om årsaka for desse endringane, søk\n" +"på \"fake servers\" i wikien til aMule på http://wiki.amule.org.\n" +"Det er viktig at du tek bort alle falske tenarar frå tenarlistafor at aMule " +"skal fungere skikkeleg." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Meir informasjon, brukarstøtte og nye utgåver kan verte funne på heimesida " +"vår.\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" +"på www.aMule.org, eller på IRC-kanalen vår #aMule·på·irc.freenode.net.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Vér god å rapportere feil til http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"Mappa spesifisert for nettsignaturar er UGANGBAR!\n" +" Nettsignaturar vert DEAKTIVERT fram til du ordnar det i innstillingar." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "FEIL: Greier ikkje å opne loggfila" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "ÅTVARING: loggfila er tom. Noko er gale." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Loggen har vorte nullstilt" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "Tenarmelding: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Klarte ikkje å laste ned nodelista." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Klarte ikkje å opne den nedlaste utgåvesjekkfila" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Korrupt utgåvesjekkfil" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Du nyttar ei utdatert utgåve av aMule!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "Di utgåve av aMule er %i.%i.%i og den siste utgåva er %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "Den siste utgåva finst alltid på http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "ÅTVARING: Utgåva du av aMule er utdatert: %i.%i.%i·<·%li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "Utgåva di av aMule er oppdatert." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Klarte ikkje å laste ned utgåvesjekkfila" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Tilkopla %s·%s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Koplar til %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Fråkopla ED2k" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad starta" + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad stogga." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Tilkopla Kad (ok)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Tilkopla Kad (brannmura)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Fråkopla Kad" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"Kad kan ikkje nyttast dersom UDP-porten er deaktivert i innstillingar. " +"Startar ikkje." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Kad-nettverket er deaktivert i innstillingar. Koplar ikkje til." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "Klarte ikkje å lese kameratlistefila 'emfriends.met'!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "Klarte·ikkje·å·skrive til·kameratlistefila·'emfriends.met'!" + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "Du kan ikkje eigenoppstarte ein bestemd IP frå ei fjern drakt enno." + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "Du kan ikkje oppdatere server.met frå ei fjern drakt enno." + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "Las %u kadkontaktar" +#~ msgstr[1] "Las %u kadkontaktar" + +#~ msgid "Disconnect from " +#~ msgstr "Fråkople" + +#~ msgid "current server" +#~ msgstr "noverande tenar" + +#~ msgid " and " +#~ msgstr " og " + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "Kople frå einkvar tenar og/eller Kad" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "TCP Flags" +#~ msgstr "TCP flagg" + +#~ msgid "UDP Flags" +#~ msgstr "UDPflagg" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "Kopiér ED2k-lenkjer til utklippstavla" + +#~ msgid "Client requests %u" +#~ msgstr "Etterspurnader frå klient %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "Filblokk %u-%u·(%d·bytes):" + +#~ msgid "Client request is invalid!" +#~ msgstr "Klienten sin etterspurnad er ugangbar!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "Klienten sin etterspurnad er ugangbar! %i·/·%i" + +#~ msgid "Command: %s" +#~ msgstr "Kommando: %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "Ikkje i stand til å opne %s fila - nyttar %s fila." + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "Åtvaring: known.met finst ikkje." + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles:·Fjernar·%s·frå lista over delte " +#~ "katalogar: ·katalog ikkje funnen." + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "Venting på avslutting av underprosess mislukka" + +#~ msgid "" +#~ "You cannot connect to a release version from an arbitrary CVS version! " +#~ "*sigh* possible crash prevented" +#~ msgstr "" +#~ "Du kan ikkje kople til ei utgivingsutgåve frå ei vilkårleg CVS-utgåve! " +#~ "*sukk* mogleg krasj hindra" + +#~ msgid "doesn't work" +#~ msgstr "fungerer ikkje" + +#~ msgid "remote gui" +#~ msgstr "fjern drakt" + +#~ msgid "" +#~ "Error: Failed to load backup file. Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Feil: Greidde ikkje å laste tryggleikskopifila. Søk på http://forum.amule." +#~ "org for å finne måtar å attskape part.met-fila" + +#~ msgid "" +#~ "Error: Backup part.met file is 0 size! Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Feil: Tryggleikskopi part-met er 0 i storleik! Søk på http://forum.amule." +#~ "org·for metodar til å attskape part.met" + +#~ msgid "Error: part.met backup file is 0 size: %s ==> %s" +#~ msgstr "Feil: tryggleikskopien av part.met er 0 i storleik: %s·==>·%s" + +#~ msgid "" +#~ "Note: These values are\n" +#~ " only used for statistics." +#~ msgstr "" +#~ "Merk: Desse verdiane vert\n" +#~ " berre nytta til statistikk." + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ "·Fildelingsklient for 'alle' plattformer basert på eMule\n" +#~ "\n" +#~ "·Nettside:·http://www.amule.org·\n" +#~ "·Forum:·http://forum.amule.org·\n" +#~ "·Vanlege spørsmål:·http://wiki.amule.org·\n" +#~ "\n" +#~ "·Kontakt:·admin@amule.org·(administrative saker)·\n" +#~ "·Opphavsrett·(C)·2003-2008·aMule·Team·\n" +#~ "\n" +#~ "·Deler av·aMule·er basert på·\n" +#~ "·Kademlia:·Fildelingsruting basert på·XOR.\n" +#~ "·Opphavsrett·(C)·2002·Petar·Maymounkov\n" +#~ "·http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "ÅTVARING: Du har fått LågID!" + +#~ msgid "This command requieres an argument. Valid arguments: a file hash.\n" +#~ msgstr "" +#~ "Denne kommandoen treng eit argument. Gangbare argument: ein filhash.\n" + +#~ msgid "Deprecated command, now 'Status'." +#~ msgstr "Frårådd kommando, no 'Status'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Status' instead.\n" +#~ msgstr "" +#~ "Dette·er·ein·ikkje·tilrådd·kommando,·og·kan·verte·fjerna·i·framtida.\n" +#~ "Bruk 'Status'·i staden.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter'." +#~ msgstr "Frårådd kommando, no 'Set·IPFilter'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter' instead.\n" +#~ msgstr "" +#~ "Dette er ein ikkje tilrådd kommendo, og kan verte fjerna i framtida.\n" +#~ "Bruk 'Set·IPFilter'·i staden.\n" + +#~ msgid "Deprecated command, now 'Get IPFilter Level'." +#~ msgstr "Frårådd kommando, no 'Get·IPFilter·Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Dette er ein ikkje tilrådd kommendo, og kan verte fjerna i framtida.\n" +#~ "Bruk 'Get·IPFilter·Level' i staden.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter Level'." +#~ msgstr "Frårådd kommando, no 'Set·IPFilter·Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Dette·er·ein·ikkje·tilrådd·kommando,·og·kan·verte·fjerna·i·framtida.\n" +#~ "Bruk 'Set·IPFilter·Level'·i staden.\n" + +#~ msgid "Deprecated command, now 'Get/Set IPFilter Level'." +#~ msgstr "Frårådd kommando, no 'Get/Set·IPFilter·Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get/Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Dette·er·ein·ikkje·tilrådd·kommendo,·og·kan·verte·fjerna·i·framtida.\n" +#~ "Bruk 'Get/Set·IPFilter·Level' i staden.\n" + +#~ msgid "Deprecated command, now 'Show Servers'." +#~ msgstr "Frårådd kommando, no 'Show·Servers'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Show Servers' instead.\n" +#~ msgstr "" +#~ "Dette er ein ikkje tilrådd kommando, og kan verte fjerna i framtida.\n" +#~ "Bruk 'Show·Servers'·i staden.\n" + +#~ msgid "Deprecated command, now 'Get BwLimits'." +#~ msgstr "Frårådd kommando, no 'Get·BwLimits'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get BwLimits' instead.\n" +#~ msgstr "" +#~ "Dette er ein ikkje tilrådd kommando, og kan verte fjerna i framtida.\n" +#~ "Bruk 'Get·BwLimits'·i staden.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Up'." +#~ msgstr "Frårådd kommando, no 'Set·BwLimit·Up'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Up' instead.\n" +#~ msgstr "" +#~ "Dette·er·ein·ikkje·tilrådd·kommendo,·og·kan·verte·fjerna·i·framtida.\n" +#~ "Bruk 'Set·BwLimit·Up'·i staden.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Down'." +#~ msgstr "Frårådd kommando, no 'Set·BwLimit·Down'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Down' instead.\n" +#~ msgstr "" +#~ "Dette er ein ikkje tilrådd kommendo, og kan verte fjerna i framtida.\n" +#~ "Bruk 'Set·BwLimit·Down'·i staden.\n" + +#~ msgid "Syncronization thread started." +#~ msgstr "Synkronisering av tråd starta." + +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "Meisterhashar av kjende filer har vorte lasta." + +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "Feil under lesing av kadkontaktar - 0 oppføringar" + +#~ msgid "Merge attempt" +#~ msgstr "Sameiningsfreistad" + +#~ msgid "Recursive merge" +#~ msgstr "Gjentakbar sameining" + +#~ msgid "Sucessful merge!" +#~ msgstr "Vellukka sameining!" + +#~ msgid "No merge possible" +#~ msgstr "Inga sameining mogleg" + +#~ msgid "Buddy address: " +#~ msgstr "Kamerat si adresse: " + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid " %d" +#~ msgstr "·····%d" + +#~ msgid ".%d" +#~ msgstr ".%d" + +#~ msgid "Shows the process of a search." +#~ msgstr "Syne søkjeprosessen." + +#~ msgid "Shows the process of a search..\n" +#~ msgstr "Syner søkjeprosessen..\n" + +#~ msgid "Search warning." +#~ msgstr "Søkeåtvaring." + +#~ msgid "Client Identification:" +#~ msgstr "Klientidentifikasjon:" + +#~ msgid "Use Secure Identification" +#~ msgstr "Nytte sikker identifikasjon" + +#~ msgid "" +#~ "Secure Identification uses a handshake approch to safely identify clients " +#~ "for use with the credit system." +#~ msgstr "" +#~ "Sikker identifikasjon nyttar elektroniske handtrykk for å identifisere " +#~ "klientar trygt for bruk med kredittsystemet." + +#~ msgid "Sources Dropping" +#~ msgstr "Kjeldebortstøyting" + +#~ msgid "Source Dropping" +#~ msgstr "Støyt bort kjelder" + +#~ msgid "Keep sources" +#~ msgstr "Behald kjelder" + +#~ msgid "Drop sources" +#~ msgstr "Støyt bort kjelder" + +#~ msgid "Send sources to any other file before dropping (High CPU)" +#~ msgstr "Send kjelder til andre filer før bortstøyting (Høg CPU)" + +#~ msgid "Sources with no needed file-parts." +#~ msgstr "Kjelder utan naudsynte fildelar." + +#~ msgid "Full Queue Sources Handling" +#~ msgstr "Kjeldehandsaming for full kø" + +#~ msgid "Enable auto drop Full Queue Sources" +#~ msgstr "Aktivér automatisk bortstøyting av kjelder med full kø" + +#~ msgid "High Queue Rating Sources Handling" +#~ msgstr "Kjeldehandsaming for lang kø" + +#~ msgid "Enable auto drop High Queue Rating Sources" +#~ msgstr "Aktivér·automatisk·bortstøyting av kjelder med lang kø" + +#~ msgid "High Queue Rating value" +#~ msgstr "Verdi for lang kø" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(Min·300·/·Maks·3000)" + +#~ msgid "Auto Drop Sources Timer" +#~ msgstr "Automatisk bortstøytingstid" + +#~ msgid "Timer (in secs)" +#~ msgstr "Tidtakar (i sekund)" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(Min·60·/·3600·Maks)" + +#~ msgid "Drop No Needed Sources now" +#~ msgstr "Støyt bort unaudsynte kjelder no" + +#~ msgid "Drop Full Queue Sources now" +#~ msgstr "Støyt bort kjelder med full kø no" + +#~ msgid "Drop High Queue Rating Sources now" +#~ msgstr "Støyt bort kjelder med lang kø no" + +#~ msgid "Clean Up Sources now (NNS, FQS && HQRS)" +#~ msgstr "Rydd opp i kjelder no" + +#~ msgid "English (U.S.)" +#~ msgstr "Engelsk (U.S.)" + +#~ msgid "Spanish (Mexican)" +#~ msgstr "Spansk (Mexico)" diff --git a/po/pl.po b/po/pl.po new file mode 100644 index 00000000..ccf5d77d --- /dev/null +++ b/po/pl.po @@ -0,0 +1,7194 @@ +# translation of pl.po to +# aMule i18n resource file. +# Copyright (C) 2004 aMule Team +# This file is distributed under the same license as the PACKAGE package. +# Kry , 2004. +# Ogon , 2004, 2005. +# Mateusz Butowski <>, 2007, 2008. +# +# +msgid "" +msgstr "" +"Project-Id-Version: pl\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2008-01-19 18:26+0100\n" +"Last-Translator: Mateusz Butowski\n" +"Language-Team: \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" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Musisz podać hasło." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Nieprawidłowe hasło, nie skrót MD5!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Błąd połączenia" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "Połączenie EC nieudane. Pusta odpowiedź." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "ExternalConn: Brak dostępu z powodu: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "ExternalConn: Brak dostępu" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "ExternalConn: Zła odpowiedź serwera. Połączenie zakończone." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Sukces! Nawiązano połączenie z aMule" + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Sukces! Nawiązano połączenie." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Tworzenie skrótu" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Zakańczanie" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Ukończono" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Wstrzymano" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Błędne" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Pobieranie" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Czeka" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Rozpoczynam tworzenie skrótu MD4 i AICH dla pliku: %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Rozpoczynam tworzenie skrótu MD4 dla pliku: %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Rozpoczynam tworzenie skrótu AICH dla pliku: %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "Konwertuję stare zestawy skrótów AICH w '%s' do 64b w '%s'." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" +"UWAGA: Nazwa pliku '%s' jest nieprawidłowa i została zmieniona na '%s'." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "UWAGA: Plik '%s' już istnieje, zmieniono nazwę na '%s'." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "UWAGA: Nie można usunąć oryginału '%s' po wykonaniu kopii zapasowej" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "UWAGA: Nie udało się usunąć pliku %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Nieudane pobieranie udostępnionych plików od użytkownika '%s'" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Nieznany" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (Fałszywa wersja eMule %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (Fałszywy eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (Fałszywy eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (oparty na eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Użytkownik: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "Żądany:" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Statystyki plików tej sesji: Zaakceptowano %d z %d żądań, %s przesłano\n" +msgstr[1] "" +"Statystyki plików tej sesji: Zaakceptowano %d z %d żądań, %s przesłano\n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Statystyki plików dla wszystkich sesji: Zaakceptowano %d z %d żądań, %s " +"przesłano\n" +msgstr[1] "" +"Statystyki plików dla wszystkich sesji: Zaakceptowano %d z %d żądań, %s " +"przesłano\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Zażądano nieznany plik" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "Klient %s na IP:Port %s:%d używający %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Nazwa użytkownika" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Znajomi" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Pokaż &szczegóły" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Dodaj znajomego" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Usuń znajomego" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Wyślij &wiadomość" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Pokaż pliki" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Ustaw slot dla znajomego" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "" +"Czy jesteś pewien, że chcesz usunąć wybranego przyjaciela (przyjaciół)?" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "" +"Czy jesteś pewien, że chcesz usunąć wybranego przyjaciela (przyjaciół)?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Anuluj" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"Nie możesz ustanowić więcej niż jeden slot dla znajomego.\n" +"Przydzielono tylko jeden slot." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Wybór wielu" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Nazwa pliku" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Rozmiar" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Typ" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Priorytet" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "ID pliku" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Żądania" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Zaakceptowane żądania" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Przesłane dane" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Ratio wymiany" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Otrzymane części" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Pełne źródła" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Ścieżka katalogu" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Udostępnione pliki" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Bardzo niski" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Niski" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normalny" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Wysoki" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Bardzo wysoki" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Wydanie" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Automatyczny" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Dodaj komentarz/ocenę" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Edytuj komentarz/ocenę" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Zmień nazwę" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Dodaj pliki kolekcji do listy pobierania" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Skopiuj magnet &URI do schowka" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Skopiuj &link ED2k do schowka" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Skopiuj link ED2k do schowka (&Zródło)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "Skopiuj link ED2k do schowka (Źródło) (Z &opcjami szyfrowania)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Skopiuj link ED2k do schowka (Nazwa &hosta)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "Skopiuj link ED2k do schowka (Nazwa hosta) (z opcjami &szyfrowania)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Skopiuj link ed2k do schowka (&AICH info)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Kopiuj wynik do schowka" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "Potrzebujesz HighID, aby stworzyć poprawny link źródłowy" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Ostrzeżenie" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Udostępnione pliki (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[Plik części]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Wprowadź nową nazwę dla tego pliku:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Zmień nazwę" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Wznawianie wysyłania pliku: %s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Wstrzymywanie wysyłania pliku: %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: wyszukiwana fraza jest za krótka" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Błąd: nie mogę nasłuchiwać na porcie TCP." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "Żądanie nie powiodło się z powodu błędu: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "Żądanie nie powiodło się z powodu nieznanego błędu." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "Nie znaleziono pliku indeksu: " + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Nie mogę utworzyć wątku gniazda WWW\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Serwer WWW: uruchomiony\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Sesja wygasła - żądanie loginu\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Sesja ok, zalogowano\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Sesja ok, nie zalogowano\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Nie otwarto sesji - zażądam loginu\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Utworzono sesję - żądam loginu\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Przetwarzam żądanie (oryginalne): " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Sprawdzam hasło\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Nieprawidłowy skrót hasła\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Hasło ok\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Złe hasło\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "Nie wprowadziłeś hasła. Puste hasło nie jest dozwolone.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Zażądano wylogowania\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Przetwarzam żądanie (przekierowane): " + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Ładuje szablon " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Port HTTP serwera WWW" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Użyj przekierowania portu UPnP na port serwera WWW" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "Port UPnP" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Używaj kompresji gzip" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Hasło pełnego dostępu do serwera WWW" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Hasło gościa dla serwera WWW" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Pozwól na dostęp gości" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Zabroń dostępu gościom" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "Otwórz/zapisz ustawienia serwera WWW z/do zdalnego aMule" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "Ścieżka do pliku konfiguracyjnego aMule. NIE UŻYWAJ BEZPOŚREDNIO!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "Zablokuj interpreter PHP (wycofywany)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Przekompiluj strony PHP przy każdym żądaniu" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "Serwer WWW aMule" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Niedostępny" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Nigdy" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Pobieranie..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Preferencje" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "Katalog zawierający plik amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Przeglądaj" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Podaj katalog z twoim plikiem amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Czas pomiędzy odświeżeniami w sekundach" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Generuj obrazek statystyk przy każdym odświeżeniu" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "Wpisz katalog, w którym chcesz generować obrazki statystyk" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Wysyłaj cyklicznie twój obrazek statystyk na serwer FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "Url FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "Ścieżka FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Wpisz URL twojego serwera FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "Wpisz katalog do składowania twoich obrazków statystyk na serwerze FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Użytkownik" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Hasło" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Wpisz nazwę użytkownika. aby zalogować się do twojego serwera FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Wpisz hasło użytkownika. aby zalogować się do twojego serwera FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "Czas pomiędzy odświeżeniami FTP w minutach" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Sprawdź" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Katalog zawierający twój plik sygnatury" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Katalog gdzie będzie wygenerowany statyczny obrazek" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i dni %i godzin %i minut %i " + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, statystyki aMule online" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Witamy!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Maksymalna szybkość DL od czasu uruchomienia wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "" +"Absolutne maksimum szybkości DL podczas poprzedniego uruchomienia wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Resetuj" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "System" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Zatrzymaj automatyczne odświeżanie" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Zapisz obrazek statystyk online" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Wydrukuj obrazek statystyk online" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Ustawienia preferencji" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "Informacje o wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Rozpocznij automatyczne odświeżanie" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Automatyczne odświeżanie zatrzymane" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "automatyczne odświeżanie rozpoczęte" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Zapisz obrazek statystyk" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Nieobsługiwany typ pliku." + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "Plik nie został zapisany" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "Statystyki aMule online" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Wystąpił problem podczas drukowania.\n" +"Może nie masz prawidłowo ustawionej drukarki ?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Drukuję" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, statystyki aMule online\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Oparte na CAS by Pedro de Oliveira \n" +"\n" +"Dystrybucja na zasadach GPL" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Och och, aMule nie jest uruchomiony..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule jest uruchomiony" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule jest uruchomiony, ale nie połączony" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule łączy się..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Och och, status aMule jest nieznany..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " jest uruchomiony od " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " jest zatrzymany !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " jest nie połączony!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " łączy się..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " robi coś dziwnego, sprawdź to !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " jest połączony z " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "ok" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "za firewallem" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "wyłączony" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " jest włączony " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +#, fuzzy +msgid " with " +msgstr "] z " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Razem pobranych: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Wysłanych: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Pobranych w sesji: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Pobranych: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s, Wysłanych: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Udostępnione: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " plik(ów), Klientów w kolejce: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Czas: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " na " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Średnie obciążenie systemu (1-5-15 min): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Uptime systemu: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uD %02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "HighID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "LowID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Nie połączony" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "Anulowane !" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Nie mogę otworzyć %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "Plik %s jest za duży na Donkeya: maksymalny dozwolony rozmiar to 4 GB." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Parametry wejściowe" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Plik do skracania" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Dodaj opcjonalny URL dla tego pliku" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Wpisz plik dla którego chcesz obliczyć link Ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Wpisz URL który chcesz dodać do linków Ed2k: Dodaj / na końcu aby " +"aLinkCreator mógł dołączyć aktualną nazwę pliku" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Dodaj" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Usuń" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Wyczyść" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Utwórz link ze skrótami części" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Pomóż rozpowszechniać nowe i rzadkie pliki szybciej, kosztem zwiększenia " +"rozmiaru linku" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "Skrót typu MD4 pliku" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "Skrót typu ed2k pliku" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "Link ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Start" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Zapisz" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Skopiuj do schowka" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Wyjdź" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Otwórz plik aby obliczyć jego link ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Skopiuj obliczony link ed2k do schowka" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Zapisz obliczony link ed2k do pliku" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "Informacje o aLinkCreator" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Wybierz plik do obliczenia linku ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "W tej chwili nie ma nic do skopiowania !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Wybierz plik do twojego obliczonego linku ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Nie mogę otworzyć " + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Proszę wpisać nazwę pliku" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "W tej chwili nie ma nic do zapisania !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, kreator aMule linków ed2k\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Ikony z http://www.everaldo.com oraz http://www.icomania.com\n" +"i http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Dystrybucja na zasadach GPL" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Tworzę skrót..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Gotowe w %.2f ach" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "Masz już dodany ten URL !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Proszę wpisać adres URL" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "Przetwarzanie pliku numer %u: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "Pytałeś o skróty części (Używane tylko dla plików > 9.5 MB)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Proszę czekać... " + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> Nie istniejący plik !\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, kreator aMule linków ed2k" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Auto [Ni]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Auto [No]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Auto [Wy]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Łączenie" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Pytam" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Połączenie przez serwer" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Pełna kolejka" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "W kolejce" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Przesyłam" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Odbieram zestaw skrótów" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Brak potrzebnych części" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Nie można połączyć LowID do LowID" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Zbyt dużo połączeń" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Połączenie przez Kad" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Zbyt dużo połączeń Kad" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Zbanowany" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Błąd połączenia" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Zdalna kolejka pełna" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "Stary MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "Nowy MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "Kompatybilny z eMule" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Serwer lokalny" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Serwer zdalny" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Wymiana źródeł" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Pasywny" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Link" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Ziarna źródła" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Domyślny systemowy" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Arabski" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Baskijski" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Bułgarski" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Kataloński" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Chiński (Uproszczony)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Chiński (Tradycyjny)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Chorwacki" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "Czeski" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Duński" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Holenderski" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Angielski (U.K.)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Estoński" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Fiński" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Francuski" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Galicyjski" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Niemiecki" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "Grecki" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Węgierski" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Włoski" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Włoski (Szwajcarski)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "Japoński" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Koreański" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "Litewski" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "Norweski (Nynorsk)" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Polski" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portugalski" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Portugalski (Brazylijski)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Rosyjski" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Słoweński" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Hiszpański" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "Szwedzki" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Turecki" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Nie można ustalić wybranej przeglądarki!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" +"Port TCP nie może być większy niż 65532, gdyż gniazdo UDP serwera będzie TCP" +"+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Zostanie użyty domyślny port (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Nazwa serwera" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Adres" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Port" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Opis" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Użytkowników" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Pliki" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Nieudane" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Stałe" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Wersja" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Próbujesz usunąć serwer z którym jesteś połączony. Proszę się najpierw " +"rozłączyć. Serwer NIE został usunięty." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Informacje" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(Nieznana nazwa)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Na pewno chcesz usunąć serwer statyczny %s" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Tak" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Nie" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Nie udało się otworzyć '%s'" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Serwery (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Serwer" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Połącz z serwerem" + +#: src/ServerListCtrl.cpp:428 +#, fuzzy +msgid "Mark server as static" +msgstr "Oznacz serwer(y) jako statyczny" + +#: src/ServerListCtrl.cpp:429 +#, fuzzy +msgid "Mark server as non-static" +msgstr "Oznacz serwer(y) jako niestatyczny" + +#: src/ServerListCtrl.cpp:431 +#, fuzzy +msgid "Mark servers as static" +msgstr "Oznacz serwer(y) jako statyczny" + +#: src/ServerListCtrl.cpp:432 +#, fuzzy +msgid "Mark servers as non-static" +msgstr "Oznacz serwer(y) jako niestatyczny" + +#: src/ServerListCtrl.cpp:438 +#, fuzzy +msgid "Remove server" +msgstr "Usuń serwer(y)" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "Usuń serwer(y)" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Usuń wszystkie serwery" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Skopiuj link ed2k do schowka" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "Skopiuj link ed2k do schowka" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Połącz ponownie z serwerem" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Na pewno chcesz usunąć wszystkie serwery?" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Na pewno chcesz usunąć wybrany(e) serwer(y)?" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Na pewno chcesz usunąć wybrany(e) serwer(y)?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Wyłączone [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "To jest aMule %s oparty na eMule." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "Uruchomiony na %s" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" +"Odwiedź http://www.amule.org aby sprawdzić czy jest dostępna nowa wersja." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Błąd krytyczny: Nie udało się stworzyć zegara" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "zdalna kontrola aMule " + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Zrzut ekranu:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" +" 'Wieloplatformowy' klient p2p oparty na eMule \n" +"\n" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr " Strona domowa: http://www.amule.org \n" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr " Forum: http://forum.amule.org \n" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" +" FAQ: http://wiki.amule.org \n" +"\n" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr " Kontakt: admin@amule.org (sprawy administratorskie) \n" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" +" Copyright (C) 2003-2008 Zespół aMule \n" +"\n" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr " Część aMule jest oparta na \n" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "Kademlia: routing peer-to-peer oparty na metryce XOR.\n" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr " Copyright (C) 2002 Petar Maymounkov\n" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr " http://kademlia.scs.cs.nyu.edu\n" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Wiadomość" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Tekst statusu" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "Łączenie" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "Rozłączony" + +#: src/amuleDlg.cpp:676 +#, fuzzy +msgid "Kad: Firewalled" +msgstr "Za firewallem" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "Połączony" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "Łączenie" + +#: src/amuleDlg.cpp:689 +#, fuzzy +msgid "Kad: Off" +msgstr " Kad: " + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "Zatrzymuje aktualne próby łączenia" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Rozłącz" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "Rozłącz z siecią." + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Podłącz" + +#: src/amuleDlg.cpp:726 +#, fuzzy +msgid "Connect to the currently enabled networks" +msgstr "Połącz z siecią." + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Wysł: %.1f(%.1f) | Pobr: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Wysł: %.1f | Pobr: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | Połączony)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | Rozłączony)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Czy na pewno chcesz opuścić aMule?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Potwierdzenie wyjścia" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Nie można ustalić komendy do uruchomienia przeglądarki." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "Katalog skórek '%s' nie istnieje" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "Ostrzeżenie: niemożliwe otwarcie pliku skórki '%s' do odczytu" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Sieci" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Okno sieci" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Szukaj" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Okno wyszukiwania" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Transfery" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Transfery plików" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Okno udostępnionych plików" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Wiadomości" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Okno wiadomości" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Statystyki" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Okno wykresów statystyk" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Okno preferencji" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Import" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "Narzędzie importowania plików części" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "Informacje o" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "Informacje/Pomoc" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Ogólne" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Połączenie" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Proxy" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Filtr wiadomości" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Zdalna kontrola" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Sygnatura Online" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Katalogi" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Bezpieczeństwo" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "Dostosowanie GUI" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Optymalizacja" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Zdarzenia" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Debugowanie" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Użytkownika" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"aMule musi zostać zrestartowany przed wprowadzeniem tych zmian:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- Zmieniono port TCP.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- Zmieniono port UDP.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"Twoja lista automatycznych aktualizacji serwerów jest pusta.\n" +"Aktualizowanie listy serwerów podczas uruchamiania zostanie wyłączone." + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"Połączenia zewnętrzne zostały włączone, ale nie zostało podane hasło.\n" +"Połączenia zewnętrzne nie mogą być włączone dopóki nie zostanie podane " +"poprawne hasło." + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- Zmieniono język.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- Zmieniono folder tymczasowy.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Wysł: 0.0 | Pobr: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"Zarówno sieć ED2K jak i Kad zostały wyłączone.\n" +"Nie będzie możliwe połączenie, dopóki nie włączysz przynajmniej jednej z " +"nich." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"Kad nie uruchomi się, jeśli twój port UDP jest wyłączony.\n" +"Włącz port UDP lub wyłącz Kad." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"Musisz zrestartować teraz aMule.\n" +"Jeśli nie zrestartujesz go teraz, nie narzekaj, jeśli stanie się coś złego.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "UWAGA" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"Twoja lista automatycznych aktualizacji serwerów jest pusta.\n" +"Proszę wpisać co najmniej jeden URL wskazujący poprawny plik server.met.\n" +" Kliknij na przycisku \"Lista\", aby wpisać URL." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "Pliki tymczasowe" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Pliki przychodzące" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Sygnatury Online" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Wybierz folder na %s" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Przeglądaj wav" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "Plik wav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Szukaj odtwarzacza filmów" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Wybierz przeglądarkę" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Program%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Lista serwerów" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Dodaj jeden URL w każdej linii.\n" +"Tylko jeden URL w każdej linii." + +#: src/PrefsUnifiedDlg.cpp:980 +#, fuzzy, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Odświeżanie co: %d sek" +msgstr[1] "Odświeżanie co: %d sek" + +#: src/PrefsUnifiedDlg.cpp:987 +#, fuzzy, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Czas dla uśrednionego wykresu: %d minut" +msgstr[1] "Czas dla uśrednionego wykresu: %d minut" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Skala wykresu połączeń: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, fuzzy, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Odświeżanie co: %d sek" +msgstr[1] "Odświeżanie co: %d sek" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, fuzzy, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Rozmiar bufora pliku: %d bajtów" +msgstr[1] "Rozmiar bufora pliku: %d bajtów" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, fuzzy, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Rozmiar kolejki wysyłania %d klientów" +msgstr[1] "Rozmiar kolejki wysyłania %d klientów" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, fuzzy, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Odświeżanie połączeń do serwera co: %d minut" +msgstr[1] "Odświeżanie połączeń do serwera co: %d minut" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Odświeżanie połączeń do serwera co: Wyłączone" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Wykonaj komendę przy wydarzeniu `%s'" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Włącz wykonanie komendy w rdzeniu" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Komenda rdzenia:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Włącz wykonanie komendy w GUI" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "Komenda GUI:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "Następujące zmienne zostaną zastąpione:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Próba nieautoryzowanego dostępu. Połączenie zakończone." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Zewnętrzne połączenie zamknięte." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "Zewnętrzne połączenia wyłączone w związku z brakiem hasła!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "Zewnętrzne połączenia wyłączone w pliku konfiguracyjnym" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Nowe zewnętrzne połączenie zaakceptowane" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "Błąd: nie mogę zaakceptować nowego połączenia zewnętrznego" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" +"Zewnętrzne połączenia odrzucone, ze względu na brak hasła w preferencjach!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "Łączę z klientem: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Nieznana wersja" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"Niepoprawny ID wersji EC, może występować niezgodność binarna. Użyj rdzenia " +"i zdalnego z tej samej wersji." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" +"Nie można połączyć się z wersją finałową z dowolnej wersji SVN! " +"*westchnięcie* prawdopodobnie zapobiegnięto awarii" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "Uwierzytelnianie nie powiodło się." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Zła wersja protokołu." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Brak znacznika wersji protokołu." + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Nieprawidłowe żądanie, najpierw musisz się uwierzytelnić." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Dostęp udzielony." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" +"Zdalna komenda pliku części nieudana: Skrót dla pliku nieznaleziony: %s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "Skrót dla pliku nieznaleziony: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "OOPS! Błąd przetwarzania OpCode!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Nie dodano serwera" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "serwer nieznaleziony: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "trzeba zdefiniować serwer do usunięcia" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "ED2K jest wyłączony w preferencjach." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "Wyszukiwanie w trakcie. Odświeżenie rezultatów za chwilę!" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "Szukanie przez WWW ze zdalnych interfejsów nie ma sensu." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad jest wyłączony w preferencjach." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Brak punktów dla wykresu." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "Twój klient nie jest skonfigurowany do tego poziomu szczegółów." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "ExternalConn: żądanie zamknięcia" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Już w trakcie zamykania." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "ExternalConn: dodaję link '%s'." + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Nieprawidłowy lub znajdujący się już na liście link." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "Nie znaleziono pliku." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Nieprawidłowa nazwa pliku." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Nie udało się zmienić nazwy pliku." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Już podłączony do ED2K." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Łączę z ED2K..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Już podłączony do Kad." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Łączę z Kad..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Wszystkie sieci są wyłączone." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Rozłączono z ED2K." + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Rozłączono z Kad." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "ExternalConn: otrzymano nieprawidłowy opcode: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "Nieprawidłowy opcode (zła wersja protokołu?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "Otwarcie pliku (%s) nieudane, usuwam z listy udostępnionych plików." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "Żądanie skrótu dla nieznanego pliku: %s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "Komenda `%s' z pid `%d' zakończyła działanie ze statusem `%d'." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "Serwer nie dodany: Nie podano IP lub nazwy hosta." + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "Serwer nie dodany: Podano nieprawidłowy port serwera." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "Status ED2K:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Połączony" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Port " + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Status Kademlii:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Uruchomiony" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Status:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Rozłączony" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Stan połączenia: " + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Za firewallem" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "OK" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Stan firewalla: " + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Połączony do kolegi" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "Brak kolegów" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Średnio użytkowników: " + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "Średnio plików:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "Nie uruchomiony" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Uptime: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Transfer" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Wysyłanie" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Wysłane dane (Sesja (Razem)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Łączny narzut (Pakiety): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Narzut żądań pliku (Pakiety): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "Narzut wymiany źródeł (Pakiety): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Narzut serwera (Pakiety): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Narzut Kad (Pakiety): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Aktywne wysyłanie: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Oczekujące wysyłanie: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Całkowita ilość udanych sesji wysyłania: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Całkowita ilość nieudanych sesji wysyłania: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Średni czas wysyłania: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Pobieranie" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Pobrane dane (Sesja (Razem)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Znaleziono źródła: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Aktywne pobieranie (części): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Stosunek UL:DL sesji (Razem): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Przeciętna prędkość pobierania (sesja): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Przeciętna prędkość wysyłania (sesja): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Maks. prędkość pobierania (sesja): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Maks. prędkość wysyłania (sesja): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Ponowne łączenia: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Czas od pierwszego transferu: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Podłączony do serwera od: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Aktywne połączenia (szacunkowo): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Osiągnięto maks. limit połączeń: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Średnio połączeń (szacunkowo): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Szczytowe połączenia (szacunkowo): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Klienci" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Filtrowane" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Razem: %i Znanych: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Serwery" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Działające serwery: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Niedziałające serwery: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "W sumie: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Usunięte serwery: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Przefiltrowane serwery: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Użytkowników na działających serwerach: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "Plików na działających serwerach: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "W sumie użytkowników: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "W sumie plików: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Zajętość serwera: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Liczba udostępnianych plików: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Łączny rozmiar udostępnianych plików: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Średni rozmiar pliku: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "LowID: %u (%.2f%% Razem %.2f%% Znanych)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "BezpIdent Wł/Wył: %u (%.2f%%) : %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "System operacyjny" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "Nie otrzymano" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Wytnij" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Kopiuj" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Wklej" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Zaznacz wszystko" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "Nie można wykonać wyszukiwania Kad, jeśli Kad nie jest włączony" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "Nie można wykonać wyszukiwania ED2K, jeśli ED2K nie jest połączony" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Nieoczekiwany błąd podczas próby wyszukiwania Kad: " + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "Wiadomość przefiltrowana od '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "Nowa wiadomość od '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" +"Użytkownik %s (%u) zażądał twojej listy udostępnionych plików-> Zaakceptowano" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" +"Użytkownik %s (%u) zażądał twojej listy udostępnionych plików -> Odmówiono" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" +"Użytkownik %s (%u) zażądał twojej listy udostępnionych katalogów -> " +"Zaakceptowano" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" +"Użytkownik %s (%u) żążądał twojej listy udostępnionych katalogów -> Odmówiono" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"Użytkownik %s (%u) zażądał twojej listy plików udostępnionych w katalogu %s -" +"> Zaakceptowano" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"Użytkownik %s (%u) zażądał twojej listy plików udostępnionych w katalogu %s -" +"> Odmówiono" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "Użytkownik %s (%u) udostępnia katalog %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "Użytkownik %s (%u) wysłał niechciane katalogi udostępnione." + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "Użytkownik %s (%u) wysłał listę plików udostępnionych w katalogu %s" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "Użytkownik %s (%u) zakończył wysyłanie listy udostępnionych plików" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "Użytkownik %s (%u) wysłał niechcianą listę udostępnionych plików" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" +"Użytkownik %s (%u) odmówił dostępu do listy udostępnionych plików/katalogów" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Węzły (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "Nieprawidłowe ip do rozruchu." + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Nieprawidłowy port do rozruchu." + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Proszę wypełnij wszystkie wymagane pola" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Czy jesteś pewien, że chcesz pobrać nowy plik nodes.dat?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" +"Kontynuowanie spowoduje usunięcie obecnych węzłów i restart połączenia " +"Kademlii." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Kontynuować?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Błąd: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Uwaga: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Dodaj znajomego" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Musisz wpisać poprawne IP oraz port!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Informacje" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "Wybrany skrót użytkownika jest niepoprawny!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Źródła" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Plik" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Pobieranie" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Kategoria" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Główne" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Pobieranie w kategorii" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "Szukaj powiązanych plików (ED2k, serwer lokalny)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "Oznacz jako znany plik" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Podłączony do zdalnego amule" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Nieudane połączenie " + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Błąd" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"UWAGA: Nie możesz dodać samego siebie jako źródło linku ed2k, gdy masz lowid." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Użytkowników: E: %s K: %s | Plików E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Wszystkie" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Razem użytkowników: %s | Razem plików: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Przesłano" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Zakończono" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Prędkość" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Postęp" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Status" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Pozostało czasu" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Ostatnio widziano cały" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Ostatnio widziany" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Na pewno chcesz usunąć wybrany plik?" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Na pewno chcesz usunąć wybrany plik?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Wyślij wiadomość do użytkownika" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Wiadomość do wysłania:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Zatrzymaj" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Pauza" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Wznów" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "Wyczyść s&kończone" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Przerzuć wszystkie A4AF do tego pliku" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Przerzuć wszystkie A4AF do tego pliku (Auto)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Przerzuć wszystkie A4AF do każdego innego pliku" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Zaawansowane opcje" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Podgląd" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Pokaż &szczegóły pliku" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Pokaż wszystkie komentarze" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Skopiuj magnet URI do schowka" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "nieprzydzielony" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Przydziel do kategorii" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "&Otwórz plik" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Usuń ze znajomych" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Dodaj do znajomych" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Wyślij wiadomość" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Zamień na ten plik" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "QR: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Proszę o inny plik" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Pobieranie (%i)" + +#: src/DownloadListCtrl.cpp:2222 +#, fuzzy +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"Proszę ustaw swój odtwarzacz video w preferencjach.\n" +"W tym czasie aMule będzie próbował użyć mplayer-a, oraz będziesz otrzymywał " +"to ostrzeżenie" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Podgląd pliku" + +#: src/DownloadListCtrl.cpp:2260 +#, fuzzy, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "BŁĄD: Nie udało się uruchomić zewnętrznego odtwarzacza!" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "BŁĄD: Nie udało się otworzyć pliku części)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "BŁĄD: Nie udało się utworzyć pliku części)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "Próbuję załadować kopię zapasową pliku met z %s" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "Błąd: Nie udało się otworzyć pliku part.met: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "Błąd: plik part.met ma zerowy rozmiar: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "Błąd: Niepoprawna wersja pliku part.met: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" +"Błąd: %s (%s) jest uszkodzony (zła ilość znaków), nie mogę otworzyć pliku." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "Próbuję odzyskać informacje o pliku..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" +"Odzyskiwanie nienazwanego pliku - będę próbował odzyskać go jako " +"RecoveredFile.dat" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" +"Odzyskano wszystkie możliwe informacje o pliku :D - Próbuję ich użyć..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Nie mogę odzyskać informacji o pliku :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Nie udało się otworzyć: %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "Uwaga: %s może być uszkodzony (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "BŁĄD podczas zapisywania pliku części: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "Nie można pobrać długości '%s' - użyto pliku %s." + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "'%s' ma zerowy rozmiar - używam pliku '%s'." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "Nie udało się zapisać pliku part.met.seeds dla %s" + +#: src/PartFile.cpp:1019 +#, fuzzy, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "Zapisano %i zarodków źródeł dla pliku części: %s (%s)" +msgstr[1] "Zapisano %i zarodków źródeł dla pliku części: %s (%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "Plik części %s (%s) nie ma pliku zarodków" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "Plik części %s (%s) ma nieważny plik zarodków" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "Błąd podczas odczytu pliku źródeł plików części (%s - %s): %s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, fuzzy, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"Znaleziono uszkodzoną część (%d) w %d pliku części %s - FileResultHash |%s| " +"FileHash |%s|" +msgstr[1] "" +"Znaleziono uszkodzoną część (%d) w %d pliku części %s - FileResultHash |%s| " +"FileHash |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "Znaleziono kompletnych części (%i) w %s" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "Skończono ponowne tworzenie skrótu %s" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "Nieoczekiwany błąd przy kończeniu pliku %s. Plik wstrzymano" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Skończono pobieranie: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "Usuwanie pliku: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" +"Błąd: Nie można utworzyć skrótu ściągniętej części - zestaw skrótów jest " +"niekompletny dla '%s'" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"Błąd: Nie można utworzyć skrótu ściągniętej części - zestaw skrótów " +"niekompletny (%s). Nie powinno do tego dojść" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "UWAGA: Niewystarczająca ilość wolnego miejsca! Wstrzymywanie pliku: %s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "Pobrana część %i jest uszkodzona w pliku: %s" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH: Odzyskano uszkodzoną część %i dla %s -> Zapisanych bajtów: %s" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Niewystarczająca ilość wolnego miejsca na dysku" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Zatrzymany" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "Uwaga: known.met nie może być otwarty." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "Uwaga: lista Knownfile uszkodzona, zawiera nieprawidłowy nagłówek." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "Błąd IO podczas odczytu pliku known.met: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "Błąd podczas zapisywania pliku known.met: %s" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "Znaleziono %i znanych udostępnionych plików" +msgstr[1] "Znaleziono %i znanych udostępnionych plików" + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "Znaleziono %i znanych udostępnionych plików, %i nieznanych" +msgstr[1] "Znaleziono %i znanych udostępnionych plików, %i nieznanych" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "BŁĄD! Próba udostępnienia %s" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Komentarze pliku" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Ocena" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Komentarz" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Bez komentarza" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%s komentarz(e)" +msgstr[1] "%s komentarz(e)" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"Nie udało się połączyć do wszystkich zamaskowanych serwerów na liście. " +"Próbuję ponownie bez maskowania." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "Nie udało się połączyć do serwerów z listy. Kolejne podejście." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "Sieć ED2K wyłączona w preferencjach, nie łączę." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "Nie ma poprawnych serwerów na liście" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Połączony z %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Nawiązano połączenie z: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"Błąd krytyczny podczas próby łączenia. Może nie ma połączenia do internetu" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Utracono połączenie z %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) wygląda na wyłączony." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) wygląda na pełny." + +#: src/ServerConnect.cpp:391 +#, fuzzy, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "Automatyczne łączenie do serwera nastąpi za %d sekund" +msgstr[1] "Automatyczne łączenie do serwera nastąpi za %d sekund" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Utracono połączenie" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "Łączenie z %s (%s:%i) nieudane." + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "Błąd: Socket nieprawidłowy przy sprawdzaniu timeout-a" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "Próba połączenia z %s (%s:%i) przedawniła się." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" +"Błąd: Załadowanie pliku kopii zapasowej nieudane. Poszukaj na http://forum." +"amule.org sposobów odzyskiwania .part.met." + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Nie znaleziono plików z częściami" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "Znaleziono %u plików z częściami" +msgstr[1] "Znaleziono %u plików z częściami" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Pobieranie %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Starasz się już pobierać plik '%s'" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Masz już ten plik '%s'" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Starasz się już pobierać plik %s" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "Nie można skonwertować magnet linka do ed2k: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "Nieznany protokół linku: %s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Błędny link ed2k! Błąd: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "Wykonaj i wyjdź." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Niepoprawny format IP. Użyj xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +#, fuzzy +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "Komenda ta wymaga argumentu. Prawidłowe argumenty: 'all' lub liczba.\n" + +#: src/TextClient.cpp:343 +#, fuzzy +msgid "Processing by hash: " +msgstr "Przetwarzanie pliku numer %u: %s" + +#: src/TextClient.cpp:358 +#, fuzzy +msgid "Processing by filename: " +msgstr "Przetwarzanie pliku numer %u: %s" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "Komenda ta wymaga argumentu. Prawidłowe arguentu: skrót pliku.\n" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Niepoprawny numer\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "Nieprawidłowy skrót (długość powinna wynosić dokładnie 32 znaki)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "Operacja zakończona pomyślnie." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "Żądanie nieudane z powodu błędu: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "Filtrowanie IP klientów jest %s.\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "WYŁĄCZONE" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "WŁĄCZONE" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "Filtrowanie IP serwerów jest %s.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "Aktualny poziom filtra IP to %d.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Limity przepustowości: Wysł: %u kB/s, Pobr: %u kB/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Połączony z %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "z LowID" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "z HighID" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Łącze" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Nie połączony" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Pobieranie:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Wysyłanie:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Klientów w kolejce:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Razem źródeł:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Liczba wyników wyszukiwania: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "TODO - pokaż postęp wyszukiwania" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Otrzymano nieznaną odpowiedź z serwera, OpCode = %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Pokaż krótką informację o statusie." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "Pokaż stan połączenia, obecne prędkości wysyłania/pobierania itd.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Pokaż pełne drzewo statystyk." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"Opcjonalnie, liczba z zakresu 0-255 może być przekazana do tej komendy jako " +"argument\n" +"który mówi ile wpisów poddrzew wersji klienta powinno zostać\n" +"wyświetlone. 0 lub pusta wartość oznacza 'nieograniczony'.\n" +"\n" +"Przykład: 'statistics 5' wyświetli tylko 5 pierwszych wersji dla każdego " +"typu klienta.\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "Zamknij aMule." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Wyłącz zdalnie działający rdzeń (amule/amuled).\n" +"Spowoduje to również wyłączenie klienta tekstowego, ponieważ jest on " +"bezużyteczny\n" +"bez działającego rdzenia.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Przeładowuje podany obiekt." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "Przeładowuje listę udostępnionych plików." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "Przeładowuje tabelę IP Filter z pliku." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Połącz z siecią." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"Spowoduje to połączenie z wszystkimi sieciami włączonymi w Preferencjach.\n" +"Możesz również opcjonalnie określić adres serwera w formie IP:Port form, aby " +"połączyć się\n" +"tylko z tym serwerem. IP musi być adresem IPv4\n" +"lub odczytywalną nazwą DNS." + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Połącz tylko z ED2K." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Połącz tylko z Kad." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Rozłącz z siecią." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "" +"Spowoduje to rozłączenie z wszystkich sieci, które są obecnie włączone.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Rozłącz tylko z ED2K." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Rozłącz tylko z Kad." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Dodaje link ed2k lub magnet do rdzenia." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"Dodawany link ed2k może być:\n" +"*) linkiem pliku (ed2k://|file|...), zostanie on dodany do kolejki " +"pobierania,\n" +"*) linkiem serwera (ed2k://|server|...), zostanie on dodany do listy " +"serwerów,\n" +"*) linkiem do listy serwerów, który spowoduje dodanie wszystkich serwerów na " +"liście\n" +" do listy serwerów.\n" +"\n" +"Magnet link musi zawierać skrót ed2k i długość pliku.\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Ustaw wartość opcji." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "Ustaw preferencje IPFilter." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "Włącz filtrowanie IP klientów i serwerów." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "Wyłącz filtrowanie IP klientów i serwerów." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "Włącz/wyłącz filtrowanie IP klientów." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "Włącz filtrowanie IP klientów." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "Wyłącz filtrowanie IP klientów." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "Włącz/Wyłącz filtrowanie IP serwerów," + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "Włącz filtrowanie IP serwerów." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "Wyłącz filtrowanie IP serwerów." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "Wybierz poziom filtrowania IP." + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"Prawidłowe poziomy filtrowania mieszczą się w zakresie 0-255, a wartością\n" +"domyślną (początkową) jest 127.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Ustaw limity przepustowości." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "Wartości podane w tych komendach muszą być w kilobajtach/sekundę.\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Ustaw limit przepustowości wysyłania." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "Ustaw limit przepustowości pobierania." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Pobierz i wyświetl wartość preferencji." + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "Pobierz preferencje IPFilter." + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "Pobierz stan IPFilter dla klientów i serwerów." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "Pobierz stan IPFilter tylko dla klientów." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "Pobierz stan IPFilter tylko dla serwerów." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "Pobierz poziom IPFilter." + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Pobierz limity przepustowości." + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Tworzy wyszukiwanie." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"Musi zostać określony typ wyszukiwania przez podanie typu:\n" +" GLOBALNY\n" +" LOKALNY\n" +" KAD\n" +"Przykład: 'search kad plik' uruchomi wyszukiwanie kad dla \"plik\".\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Wykonuje globalne wyszukiwanie." + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Wykonuje lokalne wyszukiwanie." + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Wykonuje wyszukiwanie kad." + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Pokazuje wyniki ostatniego wyszukiwania." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Zwraca wyniki poprzedniego wyszukiwania.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "Pokazuje postęp wyszukiwania." + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "Pokazuje postęp wyszukiwania.\n" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Rozpocznij pobieranie pliku" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"Musi zostać podany numer pliku z ostatniego wyszukiwania.\n" +"Przykład: 'download 12' rozpocznie pobieranie pliku o numerze 12 z " +"poprzedniego wyszukiwania.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Wstrzymaj pobieranie." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Wznów pobieranie." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Anuluj pobieranie." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Ustaw priorytet pobierania." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "Ustaw priorytet pobierania na Niski, Normalny, Wysoki lub Auto.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "Ustaw priorytet na niski." + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "Ustaw priorytet na normalny." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "Ustaw priorytet na wysoki." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "Ustaw priorytet na auto." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Pokaż kolejki/listy." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Pokazuje kolejkę wysyłania/pobierania, listę serwerów lub udostępnionych " +"plików.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Pokaż kolejkę wysyłania." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Pokaż kolejkę pobierania." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Pokaż log." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Pokaż listę serwerów." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Zresetuj log." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "Wycofywana komenda, obecnie '%s'." + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" +"Komenda ta jest wycofywana i może zostać usunięta w przyszłości.\n" +"Użyj zamiast niej '%s'.\n" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() zwrócił NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "Błąd: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "Uwaga: %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Twoje nowe id to %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "OSTRZEŻENIE: Otrzymałeś Low-ID!" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "" +"\tNajprawdopodobniej jest to spowodowane tym, że jesteś za firewallem lub " +"routerem." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tPo więcej informacji udaj się na http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "Otrzymane info nieznanego serwera! - za krótkie" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "Otrzymano %d nowych serwerów" +msgstr[1] "Otrzymano %d nowych serwerów" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Zapisywanie listy serwerów zakończone." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "Serwer odrzucił ostatnią komendę" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Otrzymano podrobiony pakiet z serwera: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "Nieobsługiwany błąd w trakcie przetwarzania pakietu z serwera: %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "Nie mogę utworzyć wątku rozwiązywania dns dla połączenia do %s" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "IP serwera %s (%s) jest filtrowane. Nie łącze." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "używa maskowania protokołu." + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "Łączę z %s (%s - %s:%i) %s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "Nie mogę rozwiązać dns dla serwera %s: Nie mogę połączyć!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "CIP2Country::CIP2Country(): Nie udało się załadować danych kraju z " + +#: src/IP2Country.cpp:73 +#, fuzzy, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "Załadowano %d bitmap flag." +msgstr[1] "Załadowano %d bitmap flag." + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"Jesteś pewien, że chcesz anulować i usunąć wszystkie pliki z tej kategorii?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Wymagane potwierdzenie" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Wszystkie inne" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Niekompletne" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Aktywny" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Film" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Audio" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Archiwum" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "Obrazy CD" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Obrazki" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Tekst" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Wybierz filtr przeglądania" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Dodaj kategorię" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Edytuj kategorię" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Usuń kategorię" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "Importowanie %s: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "Wczytywanie katalogu temp" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "Odbieranie podstawowych informacji z info pobieranego pliku" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "Tworzenie pliku docelowego" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "Ładowanie danych ze starego pobieranego pliku (%u z %u)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "Zapisywanie bloku w nowym pojedynczym pobieranym pliku (%u z %u)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "Odbieranie informacji o źródłach pobieranego pliku" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "Dodawanie pobierania i zapisywanie nowego pliku części" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Status ściągania..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "W trakcie" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Błąd: Brak miejsca na dysku" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Błąd: Partmet nie znaleziony" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Błąd: Błąd IO!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Błąd: Nieudane!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "W kolejce" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Aktualnie pobierane" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Nieznany lub błędny format pliku tymczasowego." + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Nazwa pliku" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Stan" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Skrót pliku" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Import pliku części" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"Proszę wybraćkatalog w celu poszukiwania tymczasowych pobierań! (Podkatalogi " +"zostaną uwzględnione)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" +"Czy chcesz, aby źródła pomyślnie zaimportowanych pobierań zostały usunięte?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Usunąć źródła?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Czekam..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (Dysk: %s)" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "bajtów" +msgstr[1] "bajtów" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "bajtów/sek" +msgstr[1] "bajtów/sek" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "sek" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "min" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "godzin" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "Dni" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Filmy" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Archiwa" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Teksty" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programy" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Dowolny" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Nieoceniony" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Nieprawidłowy / Uszkodzony / Fałszywy" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Marny" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "W miarę" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Dobry" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Znakomity" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "wszystkie" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "wszystkie inne" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "Ładowanie filtrów IP 'ipfilter.dat' i 'ipfilter_static.dat'." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "Ładowanie pliku ipfilter.dat nieudane '%s', napotkano nieznany format." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "Ładowanie pliku ipfilter.dat nieudane '%s', nie można otworzyć pliku." + +#: src/IPFilter.cpp:330 +#, fuzzy, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +"Załadowano %u zakresów IP z '%s'. %u niepoprawnych linii zostało odrzuconych." +msgstr[1] "" +"Załadowano %u zakresów IP z '%s'. %u niepoprawnych linii zostało odrzuconych." + +#: src/IPFilter.cpp:332 +#, fuzzy, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +"Załadowano %u zakresów IP z '%s'. %u niepoprawnych linii zostało odrzuconych." +msgstr[1] "" +"Załadowano %u zakresów IP z '%s'. %u niepoprawnych linii zostało odrzuconych." + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Aktywnych połączeń (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Szczegóły pliku" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% skończone" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "Link ED2K: " + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Zatwierdź" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" +"Kliknij tu aby dodać link ed2k w linii poleceń do twojej kolejki pobierań." + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "tekst statusu jako Pop-up" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Ładuje..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"Zdarzenie są wyświetlane tu. Dla pełnej listy zdarzeń, definiuj logowanie w " +"zakładce serwerów." + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Ilość użytkowników na serwerze do którego jesteś połączony ..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Użytkowników: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" +"Użytkowników połączonych do aktualnego serwera i szacunkowa liczba " +"wszystkich użytkowników." + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"Aktualna średnia wysyłania i szybkość pobierania. Jeżeli włączone liczby w " +"nawiasach wskazują narzut komunikacji z klientem." + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"Wyświetla status połączonych i aktywnych transferów. Czerwone strzałki " +"wskazują, że nie jesteś aktualnie połączony, żółte, że masz niskie ID (za " +"firewallem) i zielone strzałki wskazują, że masz wysokie ID (optymalny typ " +"połączenia)." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Niepołączony ..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Aktualnie połączony serwer." + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Szukaj" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Nazwa:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Lokalne" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Globalne" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "Skrót pliku" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Parametry dodatkowe" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Filtrowanie" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Typ Pliku" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Rozszerzenie" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Min rozmiar" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Bajtów" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Maks. rozmiar" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Dostępność" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Filtr:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Wyniki filtrowania" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Odwróć wyniki" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Ukryj znane pliki" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Więcej" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "Wyszukuje więcej wyników na ED2K. Nieobsługiwane jeszcze dla Kad." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Zatrzymaj" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Zresetuj pola" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Wyniki" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Wyczyść skończone pobierania" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Pokaż wysłane / Kolejkę wysyłań" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Klientów w kolejce :" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Wyślij" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Wysyła wybraną wiadomość." + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Zamknij" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Zamknij tę sesję czata." + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Pełna nazwa :" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "Brak" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "plik met :" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Skrót :" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Rozmiar pliku :" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Status pliku części:" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Ostatnio widziano całość :" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Znaleziono źródeł :" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Przesyłam ze źródeł :" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Części pliku :" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Dostępne :" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Prędkość transmisji danych :" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Aktywny czas pobierania: " + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Przesłano :" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Zakończono :" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Inteligentny System Obsługi Błędów" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Utracono z powodu błędów :" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Zyskano przez kompresję :" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "Pakietów uratowanych przez I.C.H. :" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Nazwy plików" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Przejmij" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Wyczyść" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Zastosuj" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "OK" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "Komentuj/Oceń plik (tekst będą widzieli wszyscy użytkownicy)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"W przypadku filmu możesz podać jego długość, język ...\n" +"oraz jeżeli jest fałszywy możesz powiedzieć o tym innym użytkownikom aMule." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Jakość pliku" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" +"Wybierz ocenę pliku lub skonsultuj z użytkownikiem jeżeli jest " +"nieprawidłowy ..." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Bez komentarza" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Odśwież" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Pobieranie, proszę czekać..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Nieznany rozmiar" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Wymagane informacje" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "Adres IP :" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Port :" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Dodatkowe informacje" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Nazwa użytkownika :" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Skrót użytkownika :" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Przeładuj twoje udostępnione pliki" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Aktualna sesja" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Razem" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Żądany :" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Aktywne wysyłania :" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Prędkość pobierania" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Aktualna" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Bieżąca średnia" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Średnia sesji" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Prędkość wysyłania" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Połączenie" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Aktywne pobierania" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Aktywnych połączeń (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Aktywne wysyłania" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Drzewo statystyk" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Nazwa użytkownika:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Skrót użytkownika:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Oprogramowanie klienta:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Wersja klienta:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "Adres IP:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "ID użytkownika:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "IP Serwera:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Nazwa serwera:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "Transfery do klientów" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Aktualnie żądań:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Średnia prędkość wysyłania:" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Średnia prędkość pobierania:" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Wysłane (sesja):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Pobrane (sesja):" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Wysłanych (razem):" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Pobranych (razem):" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Punkty" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "Modyfikator DL/UL:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Bezpieczny identyfikator:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Ocena (razem):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Punkty kolejki:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Ustawienia ogólne" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Ksywa" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - linuksowy Muł" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "" +"To jest nazwa jaką inni użytkownicy będą widzieli łącząc się do Ciebie." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Język" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "Określa język jaki będzie używany do sterowania." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Różne opcje" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Sprawdź podczas startu czy jest nowa wersja" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" +"Włączenie tego spowoduje, że aMule będzie sprawdzał, czy jest nowa wersja " +"podczas startu" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Uruchom zminimalizowany" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "Włączenie tego spowoduje minimalizowanie aMule podczas startu." + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Pytaj przy wyjściu" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "Włącza pytanie przed wyjściem z aMule." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Włącz ikonę w zasobniku" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "To włącza/wyłącza ikonę w zasobniku systemowym." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "Zminimalizuj do ikony zasobnika." + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" +"Włączenie opcji spowoduje, że aMule będzie minimalizował się do paska " +"systemowego zamiast paska stanu." + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Opóźnienie podpowiedzi w sekundach" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "Opóźnienie przed pokazaniem podpowiedzi." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Wybór przeglądarki" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Wybierz tu swoją przeglądarkę" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Przeglądarka użytkownika:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Wpisz tu nazwę swojej przeglądarki. Aby użyć zdefiniowanej przeglądarki " +"wybierz opcje Użytkownika z rozwijanego menu." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Otwórz w nowej karcie jeśli to możliwe" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" +"Otwórz stronę WWW w nowej karcie zamiast w nowym oknie jeśli to możliwe" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Limity przepustowości" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Wysyłanie" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Przydział slotów" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Możliwości łącza" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" +"Uwaga: Wartości te są\n" +"używane tylko w statystykach." + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Standardowy port TCP klienta:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "To jest standardowy port ED2K i nie może być on wyłączony." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Rozszerzony port UDP klienta:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "Ten port UDP jest używany w rozszerzonych żądaniach sieci Ed2K i Kad." + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "wyłącz" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Adres bindowania" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "Port UDP dla rozszerzonych żądań serwera (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Ilość źródeł na plik" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Ostateczny limit" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Limit połączeń" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Maks. połączeń" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Uniwersalne Plug and Play" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "Włącz UPnP" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "Port TCP UPnP:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Automatycznie połącz przy uruchomieniu" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Połącz ponownie po rozłączeniu" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Pokaż narzut przepustowości" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Opcje serwera" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Usuń martwe serwery po" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "próbach" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Aktualizuj listę serwerów podczas uruchamiania" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Lista" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Aktualizuj listę w czasie łączenia do serwera" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Aktualizuj listę serwerów po połączeniu do serwera" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Używaj systemu priorytetów" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Używaj inteligentnego sprawdzania LowID przy połączeniu" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Bezpieczne połączenie" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Automatyczne łączenie tylko do serwerów statycznych" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Ustaw priorytet ręcznie dodanych serwerów na Wysoki" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "I.C.H. aktywny" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICH ufa każdemu skrótowi (niezalecane)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Dodaj pliki do pobrania w trybie wstrzymania" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Dodaj pliki do pobrania z automatycznym priorytetem" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Próbuj najpierw pobrać pierwszy i ostatni kawałek" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Dodaj udostępnione pliki z automatycznym priorytetem" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Próbuj przesłać pełne części do wszystkich pobierających" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Zacznij pobierać następny plik po skończeniu poprzedniego" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "Z tej samej kategorii" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "Zapisz 10 źródeł dla rzadkich plików (< 20 źródeł)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Miejsce na dysku" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Sprawdź miejsce na dysku" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "Wybierz to jeżeli chcesz aby aMule sprawdzał ilość miejsca na dysku" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Min. przestrzeń dyskowa:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Wpisz tu minimalną ilość miejsca na dysku." + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Katalog przychodzących :" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Katalog tymczasowy :" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Katalogi udostępnione" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "" +"(Kliknij prawym przyciskiem na katalog, aby udostępnić go razem z " +"podkatalogami)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Udostępnij pliki ukryte" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Odtwarzacz filmów" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Twórz kopie do podglądu" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Wykresy" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Odśwież co : 5 sekund" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Czas dla wykresów średnich: 100 minut" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Skala wykresu połączeń: 100" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Wybierz kolory statystyk" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Tło" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Siatka" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Aktualnie pobierane" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Bieżąca średnia pobierania" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Średnia pobierania sesji" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Aktualnie wysyłane" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Bieżąca średnia wysyłania" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Średnia wysyłania sesji" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Aktywnych połączeń" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Ikona prędkości w zasobniku systemowym" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Obecne Kad-węzły " + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Działające Kad-węzły" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Sesyjne Kad-węzły" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Wybierz" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Liczba wyświetlanych wersji klienta (0=nieograniczona)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Powiadomienia" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Wiadomości wyskakujące" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Używaj dźwięku" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Pokaż wiadomość kiedy :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Nowy wpis w logu" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Uruchom nową sesje czata" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Przyszła nowa wiadomość czatu" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Pobieranie zostało dodane lub skończone" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Wykryto nową wersję aMule" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "Pilny OOD, połączenie do serwera utracone" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Powiadomienie pocztą" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Wyślij pocztę jeżeli transfer został ukończony." + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "Serwer SMTP :" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "Adres e-mail :" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! UWAGA !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Nie zmieniaj tych ustawień, chyba że dobrze wiesz co robisz - \n" +"w przeciwnym wypadku możesz coś łatwo zepsuć.\n" +"\n" +"aMule będzie działał prawidłowo bez zmiany tych ustawień." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Ustawienia zaawansowane" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Maks. nowych połączeń" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Rozmiar bufora plików: 240000 bajtów" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Rozmiar kolejki wysyłania: 5000 klientów" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Odświeżanie połączeń do serwera co: Wyłączone" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "Dostosowanie GUI" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Postęp Kolejki Ściąganych Plików " + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Pokaż procentowo" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Pokaż pasek postępu " + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Styl paska postępu" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Płaski" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Okrągły" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Wsparcie skórek" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Włącz obsługę skórek " + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Skórka:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- brak dostępnych skórek -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Sortowanie kolumn" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "Automatyczne sortowanie plików w kolejce pobierania (mocne CPU)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "aMule będzie sortował kolumny w liście pobierania automatycznie" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Inne ustawienia GUI" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Szybkie wyłapywanie linków ED2K" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Pokaż rozszerzone info w kartach kategorii" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Pokaż prędkość transferu w tytule" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Pionowa orientacja paska narzędzi" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Pokaż numer pliku części przed nazwą pliku" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Zdalna kontrola" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Parametry serwera WWW" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Uruchom amuleweb podczas startu" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Port serwera WWW" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "Włącz forwarding portu UPnP na porcie serwera WWW" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Port TCP UPnP serwera WWW" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Odświeżanie strony co: (w sekundach)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Włącz kompresję Gzip" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Włącz użytkowników z niskimi uprawnieniami" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Hasło pełnych uprawnień" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Hasło niskich uprawnień" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Szablon WWW" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Parametry zewnętrznych połączeń" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Akceptuj zewnętrzne połączenia" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"IP nasłuchującego interfejsu\n" +"(puste jeśli dowolny)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Wprowadź tutaj w formacie a.b.c.d prawidłowy adres ip nasłuchującego " +"interfejsu EC. Puste pole lub 0.0.0.0 oznacza dowolny interfejs." + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "Port TCP" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "Włącz forwarding portu UPnP na porcie EC" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "Kliknij tu aby zastosować wszystkie zmiany dokonane w preferencjach." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Reset wszystkich zmian dokonanych w preferencjach." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Tytuł :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Komentarz :" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Katalog przychodzących :" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Zmień priorytet nowo przydzielonych plików :" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Nie zmieniaj" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Wybierz kolor dla tej kategorii (aktualnie wybrany) :" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Wyświetl motd serwera po połączeniu ..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Serwer Info" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Kliknij tu aby wyczyścić logi." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "Logi aMule" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "Kliknij na tym przycisku aby uaktualnić listę serwerów z URL-a ..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Lista serwerów" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Wpisz tu url do pliku server.met i przyciśnij przycisk po lewej aby " +"zaktualizować listę znanych serwerów." + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Ręcznie dodaj serwer : Nazwa" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Wpisz tu nazwę nowego serwera" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Wpisz tu IP serwera, używając formatu x.x.x.x ." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Wpisz tu port serwera." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "Dodaj ręcznie serwer (wypełnij pola od lewej) ..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "ED2K Info" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Kad Info" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"Wybrane lokale wydają się być nie zainstalowane\n" +"Musisz wygenerować je aby używać tego języka.\n" +"Dobrym początkiem będzie plik /etc/locale.gen i pakiet 'locale'\n" +"Powodzenia!\n" +"(Notatka: I tak spróbuję je ustawić)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Nie pokazuj tego więcej" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "Kliknij ten przycisk, aby uaktualnić listę węzłów z adresu URL ..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Węzły (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"Wprowadź tutaj url pliku nodes.dat i naciśnij przycisk z lewej, aby " +"zaktualizować listę znanych węzłów." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Statystyki węzłów" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Bootstrap" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Nowy węzeł" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Port:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Rozruch od \n" +"znanych klientów." + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Rozłącz z Kad" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Maskowanie protokołu" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Obsługa maskowania protokołu" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"Opcja ta włącza maskowanie protokołu i powoduje, że aMule będzie akceptował " +"zamaskowane połączenia od innych klientów." + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Użyj maskowania dla połączeń wychodzących" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"Opcja ta powoduje, że aMule będzie używał maskowania protokołu podczas " +"łączenia z innymi klientami/serwerami." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Akceptuj tylko zamaskowane połączenia" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"Opcja ta powoduje, że aMule akceptuje tylko zamaskowane połączenia. Uzyskasz " +"mniej źródeł, ale cały twój ruch będzie zamaskowany." + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Opcje plików" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Wszyscy" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Nikt" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Kto może zobaczyć udostępnione pliki:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "Wybierz kto może zażądać pokazania listy twoich udostępnionych plików." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "Filtrowanie IP" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Filtruj klientów" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Włącza filtrowanie IP klientów zdefiniowanych w pliku ~/.aMule/ipfilter.dat." + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Filtruj serwery" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Włącza filtrowanie IP serwerów zdefiniowanych w pliku ~/.aMule/ipfilter.dat." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Odśwież listę" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "Przeładuj listę filtrowanych IP z pliku ~/.aMule/ipfilter.dat" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Uaktualnij teraz" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Uaktualniaj filtr IP przy starcie" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Poziom filtrowania:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Zawsze filtruj IP z LAN" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Paranoidalna obsługa niepasujących IP" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Odrzuca pakiety, gdy ip klienta jest różne od ip, z którego pakiet jest " +"otrzymywany. Używaj z ostrożnością." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "Użyj ogólno-systemowego ipfilter.dat jeśli dostępny" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" +"Jeśli ipfilter.dat nie istnieje lokalnie, zezwól na użycie ogólno-" +"systemowego pliku ipfilter." + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "Użyj bezpiecznej identyfikacji użytkownika" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" +"Zalecane jest włączenie tej opcji. Nic nie zyskasz wyłączając bezpieczną " +"identyfikację użytkownika." + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Włącz/wyłącz" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Włącz podpis online" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Włącza zapisywanie pliku OS, który może być użyty przez zewnętrzne aplikacje " +"do stworzenia sygnatury itp." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Częstotliwość odświeżania (sek):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "Zmień częstotliwość (w sekundach) aktualizacji Sygnatury Online." + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Katalog podpisu online:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "Kliknij tu aby wskazać katalog zawierający pliki Sygnatur Online." + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Wyłączony/Włączony" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "Filtruj wiadomości przychodzące (za wyjątkiem aktualnej rozmowy):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Opcje filtrowania:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Filtruj wszystkie wiadomości" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Filtruj wiadomości od ludzi, którzy nie są na twojej liście znajomych" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Filtruj wiadomości od nieznanych klientów" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Filtruj wiadomości zawierające (jako separatora użyj ','):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"dodaj frazy które według których amule powinien filtrować i blokować " +"wiadomości" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Komentarze" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "Filtruj komentarze zawierające (użyj ',' jako separatora):" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Włącz proxy" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Włącza/Wyłącza obsługę proxy" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Typ proxy:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "Typ serwera proxy do którego się łączysz" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Adres proxy:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "Nazwa hosta proxy" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Port proxy:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "Port serwera proxy" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Uwierzytelnianie" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Włącz uwierzytelnianie" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Włącza/Wyłącza uwierzytelnianie login/hasło" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "Login używany do połączeń z proxy" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Hasło:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "Hasło używane do połączeń z proxy" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Automatyczne łączenie z serwerem bez proxy" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Połącz z:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Login do zdalnego amule" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Nazwa użytkownika" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Zapamiętaj te ustawienia" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Włącz gadatliwe logowanie debugowe." + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "Kategorie wiadomości:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "Dodaj importy" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Przywróć wybrane" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Usuń wybrane" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Typy zdarzeń" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Podłącz do dowolnego serwera i/lub Kad" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Nowa kategoria" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Wybierz folder na pobierane pliki" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Musisz określić nazwę kategorii!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Musisz określić ścieżkę dla kategorii!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"Nie udało się utworzyć katalogu przychodzących dla kategorii. Proszę podać " +"właściwą ścieżkę!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "Nieznane rozszerzenie '%s' dla komendy '%s'.\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "Nieznana komenda '%s'.\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"Ta komenda nie może posiadać argumentu.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"Ta komenda musi posiadać argument.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Ta komenda jest niekompletna, użyj jednego z rozszerzeń podanych niżej.\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Dostępne rozszerzenia:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Dostępne komendy:\n" + +#: src/ExternalConnector.cpp:188 +#, fuzzy, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"Wszystkie komendy są niewrażliwe na wielkość znaków.\n" +"Wpisz 'help ', aby uzyskać szczegółowe informacje na temat " +".\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Wychodzi z programu." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Pokaż pomoc." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"Aby uzyskać pomoc dotyczącą komendy, wpisz 'help '.\n" +"Aby uzyskać pełną listę komend, wpisz 'help'.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"Użyj '%s' aby otrzymać listę komend\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Błąd składni!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Błąd przetwarzania komendy - to nie powinno się zdarzyć! Proszę zgłosić " +"błąd\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Ta komenda nie powinna posiadać żadnego parametru." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Ta komenda musi posiadać parametr." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Nieprawidłowy argument." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "To jest niekompletna komenda." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Wpisz '%s' , aby uzyskać więcej pomocy.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "To jest %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "To jest %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Tworzenie klienta...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "Połączenie nieudane. Nie można się połączyć z wybranym hostem\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"OK, wychodzę %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"Nie można połączyć z pustym hasłem.\n" +"Musisz podać hasło poprzez edycję pliku konfiguracyjnego\n" +"lub poprzez linię poleceń, lub podaj je kiedy zostaniesz o to poproszony.\n" +"\n" +"Wychodzę...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Pokazuj ten tekst pomocy." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "Host gdzie jest uruchomiony aMule. (domyślny: localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "Port zewnętrznych połączeń aMule. (domyślny: 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Hasło połączeń zewnętrznych." + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Czyta konfiguracje z pliku." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "Nie wysyłaj żadnego wyjścia na stdout." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Bądź gadatliwy - pokazuj także wiadomości diagnostyczne." + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Ustawia locale programu (język)." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "Zapisuje opcje listy komend do pliku konfiguracyjnego." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "Tworzy plik konfiguracyjny oparty na pliku konfiguracyjnym aMule." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Drukuj wersję programu." + +#: src/ClientCreditsList.cpp:168 +#, fuzzy, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "Plik kredytów załadowany, %u znanych klientów" +msgstr[1] "Plik kredytów załadowany, %u znanych klientów" + +#: src/ClientCreditsList.cpp:171 +#, fuzzy, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] " - Kredyty wyczerpane dla %u klientów!" +msgstr[1] " - Kredyty wyczerpane dla %u klientów!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "Nie znaleziono pliku cryptkey.dat, tworzenie." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"BŁĄD: daemon aMule nie może być użyty, gdy zewnętrzne połączenia są " +"zablokowane. Aby włączyć połączenia zewnętrzne użyj normalnego aMule, włącz " +"amuled z opcją --ec-config lub ustaw klucz \"AcceptExternalConnections\" na " +"1 w pliku ~/.aMule/amule.conf" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "BŁĄD: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Odbanuj" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Pokaż wysyłane" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Pokaż kolejkę" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Pokaż klientów" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Wybierz widok" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Oprogramowanie klienta" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Czekał" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Czas wysyłania" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Wysyłanie/Pobieranie" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Zdalny Status" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "QR: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Priorytet pliku" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Punkty" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Poprosił" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Ostatnio widziany" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Wszedł do kolejki" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Status wysyłania" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Wysłanych" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Status pobierania" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Pobranych" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Skrót użytkownika" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Zaszyfrowane" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Ukryj udostępniane pliki" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Szczegóły klienta" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Niewspierane" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Niekompletne" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Zły człowiek" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Weryfikacja - OK" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Niedostępne" + +#: src/ClientDetailDialog.cpp:190 +#, fuzzy, c-format +msgid "%u (QR: %u)" +msgstr "QR: %u" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "Min. rozmiar musi być mniejszy od maks. Zignorowano maks. rozmiar." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Ostrzeżenie wyszukiwania" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Nielimitowane" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "Menu podajnika aMule" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Limity prędkości:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "UL: Brak" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "UL: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "DL: Brak" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "DL: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Prędkość pobierania: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Prędkość wysyłania: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Informacje o kliencie" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Ksywka: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "Nie wybrano ksywki!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "ID klienta: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Nazwa serwera: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "IP serwera: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "Port TCP: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "Port TCP: Niegotowy" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "Port UDP: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "Port UDP: Niegotowy" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Podpis online: Włączony" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Podpis online: Wyłączony" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Udostępnionych plików: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Klientów w kolejce: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "Razem DL: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "Razem UL: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Limit wysyłania" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Limit pobierania" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "Ukryj aMule" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "Pokaż aMule" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "Rozpoczęto sesję czata: %s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Połączony do klienta ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** Łączenie z klientem ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Nie udało się połączyć do klienta / Połączenie utracone ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Zamknij kartę" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Zamknij wszystkie karty" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Zamknij inne karty" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "Otwieram plik server.met: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "Nieznaleziono pliku server.met!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" +"Nie udało się załadować pliku server.met '%s', napotkano nieznany format." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "Nie udało się otworzyć server.met!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"Uszkodzony plik server.met, znaleziono nieprawidłowy versiontag: 0x%x, " +"rozmiar %i" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "%i serwerów znaleziono w server.met" +msgstr[1] "%i serwerów znaleziono w server.met" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d serwerów dodanych" +msgstr[1] "%d serwerów dodanych" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Serwer nie dodany: [%s:%d] nie określa prawidłowego portu." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "Serwer nie dodany: Ten IP [%s:%d] jest filtrowany lub niepoprawny." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" +"Serwer nie dodany: Serwer z takim IP:Portem [%s:%d] znaleziony na liście." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Serwer dodany: Serwer na [%s:%d] używający nazwy '%s'." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"Jesteś połączony do serwera który chcesz usunąć. Proszę rozłącz się najpierw." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Nie udało się zapisać server.met!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "Nieprawidłowy URL" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "Zakończono pobieranie listy serwerów z %s" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Nie udało się pobrać listy serwerów z %s" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"Brak adresów serwerów w 'adresses.dat'. Proszę wkleić kolejno dobre adres " +"listy serwerów do tego pliku aby aktualizować listę automatycznie" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "Rozpocznij pobieranie listy serwerów z %s" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "Uwaga: niepoprawny URL podany do auto-aktualizacji serwerów: %s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "Niepoprawny url do auto-pobierania serwer.met w adresses.dat" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"Serwer lokalny jest filtrowany przez IPFilters, podłączam ponownie do innego " +"serwera!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "Nie powiodło się wykonanie komendy `%s' przy zdarzeniu `%s'." + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"Twoje ustawienia lokalne zostały zmienione na domyślne systemowe w związku " +"ze zmianą konfiguracji. Przepraszamy." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"Nie masz żadnego serwera na twojej liście serwerów.\n" +"Czy chcesz, żeby aMule pobrał nową listę teraz?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Pobieranie listy serwerów" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "serwer WWW uruchomiony z pid %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"Żądasz startu serwera WWW podczas uruchamiania, ale binarka amuleweb nie " +"może być uruchomiona. Proszę zainstaluj pakiet zawierający serwer WWW aMule " +"lub skompiluj aMule używając --enable-webserver i uruchom make install" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "Port %u jest niedostępny. Będziesz mieć LowID\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"Port %u jest niedostępny!\n" +"\n" +"To oznacza, że będziesz mieć LowID.\n" +"\n" +"Sprawdź swoją sieć aby mieć pewność, że port jest otwarty dla wejścia i " +"wyjścia." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Nie udało się utworzyć pliku podpisu online" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "Nie udało się utworzyć pliku podpisu online aMule" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"Wybrane lokale wydają się być niezainstalowane. (Uwaga: I tak spróbuję je " +"ustawić)" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "Po raz pierwszy uruchomiłeś aMule %s" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "Ta wersja jest aktualizowaną codziennie wersją testową i\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "" +"nie dajemy żadnej gwarancji, że nie zniszczy ona niczego, nie spali twojego " +"domu\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" +"lub zabije twojego psa. *Powinna* ona jednak mimo wszystko działać " +"poprawnie.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" +"Następujące opcje zostały zmienione w tym wydaniu z przyczyn " +"bezpieczeństwa:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* Włączono obsługę maskowania protokołu dla połączeń przychodzących i " +"wychodzących.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* Zablokowano aktualizację listy serwerów od innych serwerów i klientów.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"Aby uzyskać więcej informacji na temat tej zmiany, poszukaj\n" +"hasła \"fake servers\" na wiki aMule na http://wiki.amule.org.\n" +"Ważne jest, abyś usunął wszystkie fałszywe serwery z twojej listy serwerów, " +"aby aMule działał poprawnie." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Więcej informacji, pomoc i nowe wydania znajdziesz na naszej stronie \n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "www.aMule.org lub na naszym kanale IRC: #aMule na irc.freenode.net.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Nie wahaj się zgłaszać jakichkolwiek błędów na http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"Katalog wybrany na pliki sygnatury online jest nieprawidłowy!\n" +" Sygnatura online zostanie wyłączona dopóki nie poprawisz tego w " +"preferencjach." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "BŁĄD: nie mogę otworzyć pliku logów" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "UWAGA: plik logów jest pusty. Coś jest nie tak." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Logi zostały zresetowane" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "Wiadomość z serwera: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Pobieranie listy węzłów nie powiodło się." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Nie można otworzyć pobranego pliku kontroli wersji" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Uszkodzony plik kontorli wersji" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Używasz przestarzałej wersji aMule!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "Twoje wersja eMule to %i.%i.%i, najnowszą wersją jest %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "Najnowsza wersja jest zawsze dostępna na http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "UWAGA: Twoja wersja aMule jest przestarzała: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "Twoja kopia aMule jest przestarzała." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Nie udało się pobrać pliku kontroli wersji" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Połączony z %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Łączenie z %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Rozłączono z ED2K" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Włączono Kad." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Zatrzymano Kad." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Połączono z Kad (ok)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Połączono z Kad (za firewallem)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Rozłączono z Kad." + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"Nie można użyć sieci Kad, jeśli port UDP jest wyłączony w preferencjach, nie " +"włączam." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Zablokowano sieć Kad w preferencjach, nie łączę." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "" +"Nie udało się otworzyć pliku listy znajomych 'emfriends.met' do odczytu!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "" +"Nie udało się otworzyć pliku listy znajomych 'emfriends.met' do zapisu!" + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "" +#~ "Nie możesz jeszcze przeprowadzić rozruchu z określonego ip ze zdalnego " +#~ "GUI." + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "Nie możesz jeszcze zaktualizować server.met ze zdalnego GUI." + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "Wczytaj %u kontaktów Kad" +#~ msgstr[1] "Wczytaj %u kontaktów Kad" + +#~ msgid "Disconnect from " +#~ msgstr "Rozłącz z " + +#~ msgid "current server" +#~ msgstr "aktualny serwer" + +#~ msgid " and " +#~ msgstr " i " + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "Rozłącz z dowolnego serwera i/lub Kad" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "TCP Flags" +#~ msgstr "Flagi TCP" + +#~ msgid "UDP Flags" +#~ msgstr "Flagi UDP" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "Skopiuj link(i) ed2k do schowka" + +#~ msgid "Client requests %u" +#~ msgstr "Klient żąda %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "Blok pliku %u-%u (%d bajtów):" + +#~ msgid "Client request is invalid!" +#~ msgstr "Żądanie klienta jest nieprawidłowe!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "Żądanie klienta jest nieprawidłowe! %i / %i" + +#~ msgid "Command: %s" +#~ msgstr "Komenda: %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "Nie mogę otworzyć pliku %s - używam pliku %s." + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "Uwaga: known.met nie istnieje." + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles: Usuwa %s z listy udostępnionych " +#~ "katalogów: nie znaleziono katalogu." + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "Oczekiwanie na zakończenie podprocesu nieudane." diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 00000000..b811584c --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,7164 @@ +# aMule i18n resource file. +# Copyright (C) 2004 aMule Team +# This file is distributed under the same license as the aMule package. +# Kry , 2004. +# IgoR , 2004. +# Fabio Jr. Beneditto , 2004, 2005, +# felipe augusto , 2007, +# Israel Rodrigo Faria , 2007. +# Fabio Jr. Beneditto , 2008. +# +# +msgid "" +msgstr "" +"Project-Id-Version: aMule CVS\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2008-02-08 22:00-0300\n" +"Last-Translator: Fabio Jr. Beneditto \n" +"Language-Team: Brazilian Portuguese aMule TeaM (see header for more)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Você deve informar uma senha não-vazia." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Senha inválida, não é um hash MD5!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Falha ao conectar" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "Conexão EC falhou. Resposta vazia." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "ConexaoExterna: Acesso negado porque: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "ConexaoExterna: Acesso negado" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "ConexaoExterna: Resposta incorreta do servidor. Conexao Encerrada." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Sucesso! Conexão estabelecida com o aMule " + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Sucesso! Conexão estabelecida." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Calculando hash" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Completando" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Completo" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Pausa" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Com Erro" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Baixando" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Esperando" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Iniciando para criar de um hash para arquivo MD4 e AICH: %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Iniciando para criar um hash MD4 para arquivo: %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Iniciando para criar um hash AICH para arquivo: %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "Convertendo velhos hashsets AICH em '%s' para 64b em '%s'." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "AVISO: O nome de arquivo '%s' é inválido e foi renomeado para '%s'." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "AVISO: O arquivo '%s' já existe, novo arquivo renomeado para '%s'." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "AVISO: Não foi possível remover arquivo '%s' depois de criar o backup" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "AVISO: Falha ao deletar %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Falha ao receber lista de compartilhamentos do usuário '%s'" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Desconhecido" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (versão de eMule FALSA %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (eMule Falso)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (eMule Falso)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (baseado no eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Nickname: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "Solicitado:" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Estatísticas dessa sessão: Aceitos %d de %d pedidos, %s transferidos\n" +msgstr[1] "" +"Estatísticas dessa sessão: Aceitos %d de %d pedidos, %s transferidos\n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Estatísticas de todas as sessões: Aceitos %d de %d pedidos, %s transferidos\n" +msgstr[1] "" +"Estatísticas de todas as sessões: Aceitos %d de %d pedidos, %s transferidos\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Solicitado um arquivo desconhecido" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "Cliente %s em IP:Porta %s:%d usando %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Nome do usuário" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Amigos" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Exibir &Detalhes" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Adicionar amigo" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Remover amigo" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Enviar &Mensagem" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Exibir Arquivos" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Abrir slot para amigos" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Deseja eliminar o(s) amigo(s) selecionado(s) de sua lista?" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Deseja eliminar o(s) amigo(s) selecionado(s) de sua lista?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Cancelar" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"Você não pode definir mais de um slot para amigos.\n" +" Apenas um foi definido." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Seleção múltipla" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Nome do arquivo" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Tamanho" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Tipo" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Prioridade" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "ID do arquivo" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Pedidos" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Pedidos aceitos" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Dados tranferidos" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Taxa Compartilhada" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Partes já baixadas" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Fontes Completas" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Caminho completo" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Arquivos Compartilhados" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Muito baixo" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Baixo" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normal" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Alto" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Muito Alto" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Lançamento" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Auto" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Adicionar Comentário/Avaliação" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Editar Comentário/Avaliação" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Renomear" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Adcionar arquivo na coleção para lista de transfência" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Copiar &URL Magnet para Área de Tranferência" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Copiar &link ED2k para Área de Transferência" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Copiar link ED2k para Área de Transferência (&Fonte)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "" +"Copiar link ED2k para Área de Transferência (Fonte) (&Com opções de " +"Criptografia)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Copiar link ED2k para Área de Transferência (&Hostname)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" +"Copiar link ED2k para Área de Transferência (Hostname) (Com &opções de " +"Criptografia)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Copiar link ED2K para a Área de Transferência (info &AICH)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Copiar retorno para a Área de Transferência" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "Você precisa ter HighID para criar uma fonte ED2K válida" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Cuidado" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Arquivos Compartilhados (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[PartFile]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Informe o novo nome para o arquivo:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Renomear" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Continuando os uploads para o arquivo: %s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Suspendendo os uploads para o arquivo: %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: chave de pesquisa muito curta" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Erro: Não foi possível escutar na porta TCP." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "Solicitação falhou com o seguinte erro: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "Solicitação falhou com erro desconhecido." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "Arquivo index não encontrado:" + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Não foi possível criar thread de socket web\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Web Server: Iniciado\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Sessão expirada - solicitando login\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Sessão Ok, logado\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Sessão Ok, ainda não logado\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Nenhuma sessão aberta - solicitando login\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Sessão criada - solicitando login\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Processando pedido [original]: " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Verificando senha\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Hash da senha inválido\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Senha Ok\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Senha inválida\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "Você não digitou nenhuma senha. Senha em branco não é permitido.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Solicitado logout\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Processando solicitação [redirecionado]: " + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Carregar modelo " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Porta do servidor HTTP" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Usar redirecionamento de porta UPnP na porta do webserver" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "Porta UPnP" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Utilizar compressão gzip" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Senha para acesso completo ao servidor" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Senha de acesso restrito ao servidor" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Permitir acesso restrito" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Negar acesso restrito" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "Carregar/Salvar definições do/para aMule remoto" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "Caminho para arquivo amule.conf - NÃO USE DIRETAMENTE!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "Desativar interpretador PHP (depreciado)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Recompilar páginas PHP a cada solicitação" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "Servidor Web do aMule" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Não disponível" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Nunca" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Baixando..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Preferências" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "Pasta contendo arquivo amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Procurar" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Informe aqui a pasta onde está o arquivo amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Taxa de atualização (em segundos)" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Gerar imagem de estatística a cada atualização" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "Informe aqui a pasta onde gravar a imagem de estatística gerada" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Fazer upload periódico da imagem para servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "URL do FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "Caminho no FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Informe a URL do seu servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "Informe a pasta onde colocar a sua imagem estatística no servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Usuário" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Senha" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Informe o nome do usuário de login, para o servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Informe a senha para o usuário do servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "Intervalo entre atualizações do servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Validar" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Pasta contendo seu arquivo de assinatura" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Pasta para colocar imagem estatística gerada" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i dias %i horas %i min %i s" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, Estatísticas Online do aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Bem-vindo!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Taxa máxima de DL enquanto roda o wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "Taxa máxima absoluta de DL enquanto rodava o wxCas (anterior)" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Limpar" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "Sistema" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Parar atualização automática" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Salvar imagem de estatística Online" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Imprimir imagem de estatística Online" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Preferências" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "Sobre wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Iniciar atualização automática" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Atualização automática parada" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Atualização automática iniciada" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Salvar imagem das estatísticas" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Não há um programa definido para esse tipo de arquivo." + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "Arquivo não foi salvo" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "Eststísticas Online do aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Encontrei um problema na hora de imprimir.\n" +"A sua impressora está configurada corretamente?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Imprimindo" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, Gerador de Assinaturas Online com estatísticas do aMule\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Baseado no CAS, por Pedro de Oliveira \n" +"\n" +"Distribuído sob licença GPL" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Oh Oh, aMule não está rodando..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule está rodando" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule está rodando, mas desconectado" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule está conectando..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Oh Oh, o status do aMule é desconhecido..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " está rodando há " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr "esta parado !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " não esta conectado !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " está conectando..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " está fazendo algo de estranho, verifique!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " conectado em " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "Ok" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "com firewall" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "desligado" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " está ativo " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +#, fuzzy +msgid " with " +msgstr "] com " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Download Total: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Upload: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Download da Sessão: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Download: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s, Upload: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Compartilhando: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " arquivos, Clientes na fila: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Tempo: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " em " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Média de carga do Sistema (1-5-15 min): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Uptime do Sistema: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uD %02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "HighID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "LowID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Não conectado" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "Cancelado !" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Impossível abrir %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "O arquivo %s é muito grande para a Mula: máximo suportado é 4 GB." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Parâmetros de Entrada" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Arquivo a gerar hash" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "URL para esse arquivo (opcional)" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Informe o arquivo que deseja criar o link ED2K" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Informe a URL que deseja adicionar ao link ED2k: adicione / no final para " +"deixar o aLinkCreator adicionar ao nome atual" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Adicionar" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Remover" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Limpar" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Criar link com hash de partes" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Ajuda a espalhar arquivos novos e raros mais rápido, mas aumenta o tamanho " +"do link" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "Hash MD4 do arquivo" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "Hash ED2k do arquivo" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "Link ED2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Iniciar" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Salvar" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Copiar para a Área de Transferência" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Sair" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Abrir um arquivo e computá-lo como link ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Copiar link computado para a Área de Transferência" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Salvar link computado para arquivo" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "Sobre o aLinkCreator" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Selecione um arquivo que deseja computar como link ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "Nada a ser copiado!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Selecione um arquivo para seu link computado" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Impossível abrir " + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Por favor, informe um nome não-vazio" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "Nada a ser salvo!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, o criador de links ed2k do aMule\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps de http://www.everaldo.com e http://www.icomania.com\n" +"e http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distribído sob licença GPL" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Criando Hash..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Pronto em %.2f s" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "Você já adicionou essa URL!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Informe uma URL não-vazia" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "Processando arquivo número %u: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "Você pediu por hash de partes (só é usado para arquivos > 9,5MB)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Aguarde..." + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> Arquivo não existe !\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, o criador de Links ed2k do aMule" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Auto [Baixo]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Auto [Normal]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Auto [Alto]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Conectando" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Perguntando" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Conectando via servidor" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Fila de espera cheia" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "Na fila de espera" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Transferindo" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Recebendo hashset" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Nenhuma parte necessária" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Não se pode conectar LowID com LowID" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Excesso de conexões" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Conectando via Kad" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Muitas conexões Kad" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Banido" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Erro ao conectar" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Fila de espera remota cheia" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "MlDonkey velho" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "Novo MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "Compatível com eMule" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Servidor Local" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Servidor Remoto" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Troca de Fontes" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Passivo" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Link" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Fontes de arquivo" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Padrão do sistema" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Árabe" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Basco" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Búlgaro" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Catalão" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Chinês (Simplificado)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Chinês (Tradicional)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Croácia" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "Tcheco" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Dinamarquês" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Holandês" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Inglês (UK)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Estônia" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Finlandês" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Francês" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Galego" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Alemão" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "Grego" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Hungria" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Italiano" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Italiano (Suíço)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "Japonês" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Coreano" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "Lituânia" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "Noruêga (Nynorsk)" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Polonês" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Português (Portugal)" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Português do Brasil" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Russo" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Esloveno" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Espanhol" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "Suécia" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Turquia" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Impossível determinar browser selecionado!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "Porta TCP nao pode ser maior do que 65532, pois a UDP escuta em TCP+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Porta padrão será utilizada (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Nome do Servidor" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Endereço" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Porta" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Descrição" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Usuários" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Arquivos" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Falha" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Fixo" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Versão" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Você está conectado a um servidor que está tentando apagar. Desconecte " +"antes. O servidor NÃO foi apagado." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Info" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(Nome Desconhecido)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Deseja remover o servidor estático %s" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Sim" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Não" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Falha ao abrir '%s'" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Servidores (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Servidor" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Conectar ao servidor" + +#: src/ServerListCtrl.cpp:428 +#, fuzzy +msgid "Mark server as static" +msgstr "Marcar servidor(es) como fixo" + +#: src/ServerListCtrl.cpp:429 +#, fuzzy +msgid "Mark server as non-static" +msgstr "Marcar servidor(es) como não-fixos" + +#: src/ServerListCtrl.cpp:431 +#, fuzzy +msgid "Mark servers as static" +msgstr "Marcar servidor(es) como fixo" + +#: src/ServerListCtrl.cpp:432 +#, fuzzy +msgid "Mark servers as non-static" +msgstr "Marcar servidor(es) como não-fixos" + +#: src/ServerListCtrl.cpp:438 +#, fuzzy +msgid "Remove server" +msgstr "Apagar servidor(es)" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "Apagar servidor(es)" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Remover todos servidores" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Copiar link ED2k para a Área de Transferência" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "Copiar link ED2k para a Área de Transferência" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Reconectar ao servidor" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Deseja remover todos os servidores?" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Deseja remover o servidor(es) selecionado(s)?" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Deseja remover o servidor(es) selecionado(s)?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Desativado [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "Esse é o aMule %s, baseado no eMule" + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "Executando em %s" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "Visite http://www.amule.org para ver se há nova versão disponível." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "ERRO FATAL: Falha ao criar 'Timer'" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "Controle Remoto do aMule" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Snapshot:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" +"Cliente p2p 'Multiplataforma' baseado no eMule \n" +"\n" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr " Página: http://www.amule.org \n" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr " Fórum: http://forum.amule.org \n" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" +" FAQ (ajuda): http://wiki.amule.org \n" +"\n" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr " Contato: admin@amule.org (assuntos administrativos) \n" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr " Trechos do aMule são baseados em \n" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "Kademlia: roteamento peer-to-peer baseado em métrica XOR.\n" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr " Copyright (C) 2002 Petar Maymounkov\n" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr " http://kademlia.scs.cs.nyu.edu\n" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Mensagem" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Texto de Status" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "Conectando" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "Desconectado" + +#: src/amuleDlg.cpp:676 +#, fuzzy +msgid "Kad: Firewalled" +msgstr "Atrás de Firewall" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "Conectado" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "Conectando" + +#: src/amuleDlg.cpp:689 +#, fuzzy +msgid "Kad: Off" +msgstr " Kad: " + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "Cancelar as tentativas atuais de conexão" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Desconectar" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "Desconectar da rede." + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Conectar" + +#: src/amuleDlg.cpp:726 +#, fuzzy +msgid "Connect to the currently enabled networks" +msgstr "Conectar a rede." + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Up: %.1f(%.1f) | Down: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Up: %.1f | Down: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | Conectado)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | Desconectado)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Você realmente quer sair do aMule?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Confirmação de saída" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Não foi possível determinar o comando executado pelo navegador." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "O diretório '%s' de skins não existe" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "Cuidado: Não foi possível abrir o arquivo de skin '%s' para leitura" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Redes" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Janela de redes" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Pesquisas" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Janela de Pesquisas" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Transferências" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Janela de Transferências" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Janela de compartilhados" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Mensagens" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Janela de Mensagens" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Estatísticas" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Janela de Estatísticas" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Janela de Preferências" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Importar" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "Ferramenta de importação de arquivos .part" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "Sobre" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "Sobre/Ajuda" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Geral" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Conexão" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Proxy" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Filtro de Mensagens" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Controles remotos" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Assinatura Online" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Diretórios" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Segurança" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "Ajustes finos" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "CORE Tweaks" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Eventos" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Debugando" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Definido pelo Usuário" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"O aMule deve ser reiniciado para habilitar estas mudanças:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "-Porta TCP alterada.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "-Porta UDP alterada.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"Sua lista de servidores para o autoupdate está vazia.\n" +"'Atualizar lista de servidores ao iniciar' será desativado." + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"Você ativou as conexões externas (EC) mas não definiu uma senha.\n" +"Conexões Externas só podem ser feitas se for especificada uma senha válida." + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "-Idioma alterado.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "-Diretório temp alterado.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Up: 0.0 | Down: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"Ambos ED2K e rede Kad estão disabilitados.\n" +"Voce não será capaz de conectar até que você habilite uma delas." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"Kad não iniciará se sua porta UDP estiver desabilitada.\n" +"Habilite a porta UDP ou disabilite o Kad." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"Você DEVE reiniciar o aMule agora.\n" +"Se você não reiniciá-lo agora, não reclame se algo de ruim acontecer.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "CUIDADO" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"Sua lista de atualização de servidores está em branco.\n" +"Coloque pelo menos uma linha que aponte para um server.met válido.\n" +"Clique no botão \"Lista\" para abrir a caixa para digitar uma URL." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "Arquivos Temporários" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Arquivos Recebidos" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Assinatura Online" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Escolha uma pasta para %s" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Defina um arquivo .wav " + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "Arquivo wav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Defina seu videoplayer preferido" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Selecione o Browser" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Executavel%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Edite a lista de Servidores" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Adicione aqui URL's para baixar arquivo 'server.met'\n" +"Somente uma URL por Linha." + +#: src/PrefsUnifiedDlg.cpp:980 +#, fuzzy, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Delay na atualização: %d s" +msgstr[1] "Delay na atualização: %d s" + +#: src/PrefsUnifiedDlg.cpp:987 +#, fuzzy, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Tempo do gráfico de média: %d min" +msgstr[1] "Tempo do gráfico de média: %d min" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Escala do gráfico de conexões: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, fuzzy, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Espera na atualização: %d s" +msgstr[1] "Espera na atualização: %d s" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, fuzzy, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Tamanho do Buffer de Arquivo: %d bytes" +msgstr[1] "Tamanho do Buffer de Arquivo: %d bytes" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, fuzzy, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Tamanho de Espera de Upload: %d clientes" +msgstr[1] "Tamanho de Espera de Upload: %d clientes" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, fuzzy, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Atualizar conexão com servidor: %d minutos" +msgstr[1] "Atualizar conexão com servidor: %d minutos" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Intervalo para atualizar conexão no servidor: Desativado" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Executar comando em evento `%s'" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Habilitar execução de comando no núcleo" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Comando do Núcleo:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Habilitar execução de comando na GUI" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "Comando da GUI:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "As seguinte váriaveis serão substituidas:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Tentaviva de acesso não autorizado. Conexão encerrada." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Conexão externa encerrada." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "Conexões externas desativadas por não ter sido definida uma senha!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "Conexões externas desativadas no arquivo de configuração" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Novas conexões externas aceitas" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "Erro: não é possível aceitar nova conexão externa" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" +"Conexão externa recusada por não ter sido definida uma senha nas " +"preferências!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "Cliente conectando: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Versão desconhecida" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"Id de versão do EC incorreta, deve ser incompatibilidade binária. Use o core " +"e o remote da mesma versão" + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" +"Você não pode conectar a uma versão oficial a partir de um cliente SVN! " +"*droga* Possível travamento evitado" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "Falha na autenticação." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Versão do protocolo inválida." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Falta tag de versão do protocolo." + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Pedido negado, você precisa autenticar primeiro." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Acesso liberado." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "Comando de PartFile remoto falhou: Filehash não encontrada: %s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "Hash do arquivo não encontrada: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "OOPS! Processando erro OpCode!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Servidor não adicionado" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "servidor não encontrado: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "precisa definir o servidor a ser removido" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "ED2K está desabilitado nas preferências" + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "Pesquisa em andamento, aguarde..." + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "Pesquisa web pela interface remota não faz sentido." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad está desabilitado nas preferências" + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Sem dados para gráfico." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "Seu cliente não está configurado para esse nível de detalhes." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "ExternalConn: desligamento solicitado" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Já estou desligando." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "ExternalConn: adicionar link '%s'." + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Link inválido ou já está na lista." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "Arquivo não encontrado." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Nome de arquivo inválido." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Não foi possível renomear o arquivo." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Já conectado a rede ED2K." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Conectando a rede ED2K..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Já conectado a rede Kad." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Conectando a rede Kad..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Todas as redes estão DESATIVADAS." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Desconectado da rede ED2k." + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Desconectado da rede Kad." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "ExternalConn: opcode inválido recebido: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "opcode inválido (versão errada do protocolo?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "Falha ao abrir o arquivo (%s), removendo da lista de compartilhados." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "Hashset solicitado para arquivo desconhecido: %s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "Comando `%s' com pid `%d' foi finalizado com o status `%d'." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "Servidor não adicionado: sem IP ou hostname." + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "Servidor não adicionado: porta informada inválida." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "Status ED2K:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Conectado" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Porta:" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Status Kademlia:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Rodando" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Status:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Desconectado" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Estado da Conexão:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Atrás de Firewall" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "OK" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Estado do Firewall:" + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Conectado ao amigo" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "Sem amigos" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Média de Usuários:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "Média de Arquivos:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "Parado" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Uptime: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Tranferência" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Uploads" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Dados enviados (Sessão (Total)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Overhead Total (pacotes): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Solicitações de Arquivo (pacotes): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "Troca de fontes (Pacotes): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Overhead de servidor (Pacotes): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Overhead Kad (pacotes): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Uploads ativos: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Uploads em espera: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Total de sessões de UP com sucesso: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Total de sessões de UP que falharam: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Tempo médio de upload: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Downloads" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Dados baixados (Sessão (Total)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Fontes encontradas: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Downloads ativos (pedaços): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Média de UL:DL da Sessão (Total): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Média de taxa de Down (Sessão): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Média de taxa de Up (sessão): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Taxa máxima de Down (sessão): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Taxa máxima de Upload (Sessão): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Reconectados: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Tempo desde a primeira transferência: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Conectado ao servidor desde: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Conexões ativas (estimada): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Máximo de conexões que atingiram tempo limite: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Média de conexões (estimativa): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Pico de conexões (estimada): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Clientes" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Filtrado" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Total: %i Conhecidos: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Servidores" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Servidores ativos: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Servidores que falharam: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Total: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Servidores eliminados: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Servidores Filtrados: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Usuários em servidores ativos: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "Arquivos nos servidores ativos: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Total de usuários: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "Total de arquivos: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Ocupação do Servidor: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Número de arquivos compartilhados: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Tamanho total de compartilhados: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Média de tamanho: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "LowID: %u (%.2f%% Total %.2f%% Conhecidos)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "SecIdent ON/OFF: %u (%.2f%%) : %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Sistema Operacional" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "Não recebido" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Recortar" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Copiar" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Colar" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Selecionar Tudo" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "A busca do Kad não pode ser feita se o Kad não estiver rodando" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "A busca do ED2K não pode ser feita se o ED2K não estiver conectado" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Erro inexperado quando tentava fazer a busca do Kad:" + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "Mensagem filtrada de '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "Nova mensagem de '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "Usuário %s (%u) pediu sua lista de shares -> Aceito" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "Usuário %s (%u) pediu sua lista de shares -> Negado" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" +"O usuário %s (%u) solicitou sua lista de pastas compartilhadas -> Aceito" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" +"O usuário %s (%u) solicitou sua lista de pastas compartilhadas -> Negado" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "Usuário %s (%u) solicitou sua lista de shares na pasta %s -> Aceito" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "Usuário %s (%u) solicitou sua lista de shares na pasta %s -> Negado" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "Usuário %s (%u) compartilha diretório %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "Usuário %s (%u) enviou pastas não solicitadas." + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "Usuário %s (%u) enviou lista de compartilhamentos da pasta %s" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "Usuário %s (%u) terminou de enviar seus compartilhamentos" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "Usuário %s (%u) enviou compartilhamentos não-solicitados" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "Usuário %s (%u) negou o acesso a lista de arquivos compartilhados" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Nodes (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "IP Inválido para incialização" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Porta inválida para inicialização" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Preencha todos os campos necessários" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Deseja baixar uma nova versão do arquivo nodes.dat?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" +"Fazendo isso, seus nodes atuais serão removidos e a conexão Kademlia será " +"reiniciada." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Continuar?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Erro: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Aviso: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Adicionar um amigo" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Você deve digitar um IP e porta válidos!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Informação" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "A Hash do usuário especificado é inválida" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Fontes" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Arquivo" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Download" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Categoria" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Principal" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Baixar na categoria" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "Buscar arquivos relacionados (ED2k, servidor local)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "Marcar como arquivo conhecido" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Conectar a aMule remoto" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Conexão falhou " + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Erro" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"CUIDADO: Você não pode adicionar você mesmo como fonte para uma ligação ed2k " +"enquanto estiver com id baixo." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Users: E: %s K: %s | Arquivos E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Tudo" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Total Users: %s | Total arquivos: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Transferido" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Completado" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Velocidade" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Progresso" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Status" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Tempo Restante" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Última vez concluído" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Último recebimento" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Deseja remover os arquivo(s) selecionado(s)?" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Deseja remover os arquivo(s) selecionado(s)?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Enviar mensagem ao usuário" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Mensagem a Enviar:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Parar" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "Pau&se" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Continuar" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "Limpar Down&loads concluídos" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Trocar cada entrada A4AF para este arquivo agora" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Trocar cada entrada A4AF para este arquivo (auto)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Trocar agora cada entrada A4AF para outro arquivo" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Opções Extras" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Pré-visualizar" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Exibir &detalhes do arquivo" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Exibir todos os comentários" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Copiar URL Magnet para Área de Transferência" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "não definido" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Adicionar na Categoria" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "Abrir &o arquivo" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Remover dos amigos" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Adicionar aos Amigos" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Enviar mensagem" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Trocar para esse arquivo" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "QR: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Pedindo por outro arquivo(A4AF)" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Downloads (%i)" + +#: src/DownloadListCtrl.cpp:2222 +#, fuzzy +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"Defina o seu player de vídeo favorito nas preferências.\n" +"Por enquanto, o aMule vai tentar usar o mplayer e você verá esse aviso a " +"cada pré-visualização." + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Pré-visualização" + +#: src/DownloadListCtrl.cpp:2260 +#, fuzzy, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "ERRO: Falha ao executar o player de mídia externo!" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "ERRO: Falha ao abrir arquivo .part)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "ERRO: falha na criação do arquivo .part)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "Tentando carregar backup do met-file de %s" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "Erro: Falha ao abrir arquivo part.met: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "Erro: part.net está zerado: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "Erro: versão do arquivo part.met inválida: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "Erro: %s (%s) está corrompido, impossível carregar arquivo." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "Tentando recuperar info do arquivo..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" +"Recuperando arquivo sem nome - tentarei recuperá-lo como RecoveredFile.dat" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "Recuperada todas as informações do arquivo :D - Tente usá-lo..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Não foi possível recuperar o arquivo :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Falha ao abrir %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "Aviso: %s parece estar corrompido (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "Erro ao salvar arquivo .part: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "Não foi possível identificar o tamanho de '%s' - usando arquivo '%s'." + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "De alguma forma o arquivo '%s' está zerado - usando arquivo %s" + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "Falha ao salvar part.met.seeds para %s" + +#: src/PartFile.cpp:1019 +#, fuzzy, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "Salvo %i fontes do .part: %s (%s)" +msgstr[1] "Salvo %i fontes do .part: %s (%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "Arquivo .part %s (%s) não possui fontes disponíveis" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "Arquivo .part %s (%s) tem fontes expiradas." + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "Erro lendo arquivo .seeds do arquivo (%s - %s): %s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, fuzzy, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"Encontrada parte corrompida (%d) em %d arquivo .part %s - Resultado |%s| " +"Hash |%s|" +msgstr[1] "" +"Encontrada parte corrompida (%d) em %d arquivo .part %s - Resultado |%s| " +"Hash |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "Achado parte completa (%i) em %s" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "Terminado o rehash %s" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "Erro inesperado ao completar %s. Arquivo pausado" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Download concluído: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "Apagando arquivo: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" +"Aviso: Impossível fazer hash de parte baixada - hash incompleto para '%s'" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"Impossível calcular hash da parte baixada - informação do hash incompleta (%" +"s).Isso nunca deveria ter acontecido..." + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "" +"AVISO: Não há espaço em disco suficiente! Colocando arquivo %s em pausa" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "Parte baixada %i do arquivo %s está corrompida" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH: Recuperada parte corrompida %i para %s -> Bytes salvos: %s" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Espaço em disco insuficiente" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Parado" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "Cuidado: Known.met não pode ser aberto." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "Aviso: lista de arquivos conhecidos corrompida, cabeçalho inválido." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "Erro de I/O ao ler arquivo known.met: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "Erro ao salvar arquivo known.met: %s" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "Encontrados %i arquivos conhecidos compartilhados" +msgstr[1] "Encontrados %i arquivos conhecidos compartilhados" + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "Encontrados %i arquivos conhecidos, %i desconhecidos" +msgstr[1] "Encontrados %i arquivos conhecidos, %i desconhecidos" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "ERRO: Tentando compartilhar %s" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Comentários do arquivo" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Avaliação" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Comentário" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Sem comentários" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%s comentário(s)" +msgstr[1] "%s comentário(s)" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"Falha ao conectar em todos servidores obscurecidos listados. Criando outro " +"passe sem obscuridade." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "Falha ao conectar em todos os servidores listados. Tentando novamente" + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "Rede ED2K esta desativada nas preferências, não conectável." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "Não houve conexões validas na lista de servidores" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Conectado a %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Conexão estabelecida em: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"Erro Fatal durante tentativa de conexão. Talvez seu link Internet tenha caído" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Conexão perdida com %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) parece estar desativado." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) parece estar cheio." + +#: src/ServerConnect.cpp:391 +#, fuzzy, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "Conexão automática com o servidor irá se repetir em %d segundos" +msgstr[1] "Conexão automática com o servidor irá se repetir em %d segundos" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Conexão perdida" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "Conexão a %s (%s:%i) falhou" + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "Erro: Socket inválido durante tempo de verificação" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "Expirado tempo de espera para conectar a %s (%s:%i)." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" +"Erro: Falha ao carregar arquivo de backup. Procure em http://forum.amule.org " +"por .part.met recovery solutions." + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Nenhum arquivo parcial (.part) encontrado" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "Encontrados %u arquivos parciais" +msgstr[1] "Encontrados %u arquivos parciais" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Baixando %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Ooops! Você já está tentando baixar o arquivo '%s'" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Você já tem o arquivo '%s'" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Ooops! Você já está tentando baixar o arquivo %s" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "Não foi possível converter links Magnet para ed2k: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "Protocolo de link desconhecido: %s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Link ed2k inválido! Erro: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "Executar e sair." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Formato do IP inválido. Use xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +#, fuzzy +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "Esse comando requer um parâmetro. Válidos: 'all' ou um número.\n" + +#: src/TextClient.cpp:343 +#, fuzzy +msgid "Processing by hash: " +msgstr "Processando arquivo número %u: %s" + +#: src/TextClient.cpp:358 +#, fuzzy +msgid "Processing by filename: " +msgstr "Processando arquivo número %u: %s" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "Esse comando requer um parâmetro. Válido: hash de um arquivo.\n" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Não é um número válido\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "Não é uma hash válida (precisa ter exatamente 32 caracteres)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "Operação executada com sucesso." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "Solicitação falhou com os seguintes erros: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "Filtragem IP para clientes é %s.\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "Desligado" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "Ligado" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "Filtragem IP para servidores é %s.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "Nível atual do IPFilter é %d.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Limites de tráfego: Up: %u kB/s, Down: %u kB/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Conectado a %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "com LowID" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "com HighID (Id alta)" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Conectando" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Não conectado" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Download:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Upload:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Clientes na fila:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Fontes totais:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Número de resultados da busca: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "TODO - mostrar progresso de uma busca" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Resposta recebida do servidor desconhecida, OpCode = %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Exibir informações de status resumidas." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "Exibir informações de conexão, taxa de Down/Up, etc.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Exibir árvore de estatísticas completas." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"Opcionalmente, um número entre 0-255 pode ser informado como parâmetro para\n" +"esse comando, que vai dizer quantas entradas de versões de clientes foram \n" +"encontradas. Informar 0 ou nada quer dizer 'sem limites'.\n" +"\n" +"Exemplo: 'statistics 5' vai mostrar apenas as 5 maiores versões de cada tipo " +"de cliente.\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "Desligar o aMule." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Desligar o servidor remoto (amule/amuled).\n" +"Isso também vai finalizar o amulecmd, já que ele não funciona sem estar\n" +"conectado a um servidor remoto.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Recarregar objeto selecionado." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "Recarregar a lista de compartilhamentos." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "Recarregar a tabela IPFilter do arquivo." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Conectar a rede." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"Isso vai fazer com que o aMule se conecte às redes definidas nas " +"Preferências.\n" +"Opcionalmente. você pode informar um servidor (servidor:porta) para se " +"conectar\n" +"a esse servidor apenas. O IP deve ter notação decimal IPv4,\n" +"ou um nome DNS que possa ser resolvido." + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Conectar a rede ED2K apenas." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Conectar a rede Kad apenas." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Desconectar da rede." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "Isso irá desconectar você de todas as redes conectadas atualmente.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Desconectar apenas da rede ED2K." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Desconectar apenas da rede Kad." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Adicionar uma ligação magnética ou ed2k ao núcleo." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"A ligação ed2k a ser adicionada por ser:\n" +"*) um link de arquivo (ed2k://|file|...), que será adicionado à fila de " +"download,\n" +"*) uma link de servidor (ed2k://|server|...), ele será adicionado à lista de " +"servidores,\n" +"*) ou uma ligação de serverlist, neste caso todos servidores serão " +"adicionados na\n" +" lista de servidor.\n" +"\n" +"Links Magnet devem conter o hash ed2k e o tamanho do arquivo.\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Defina as preferências." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "Preferências do IPFilter." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "Ligar filtragem IP para ambos clientes e servidores." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "Desligar filtragem IP para ambos clientes e servidores." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "Habilitar/Desabilitar filtragem IP para clientes." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "Ligar filtragem IP para clientes." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "Desligar filtragem IP para clientes." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "Habilitar/Desabilitar filtragem IP para servidores." + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "Ligar filtragem IP para servidores." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "Desligar filtragem IP para servidores." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "Definir no nível do IP Filter." + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"Qualquer valor entre 0 e 255 é válido, e o valor padrão (inicial)\n" +"é 127.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Limitação de Uso de Banda" + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "O Valor informado nesses comandos deve ser em kilobytes/s.\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Definir limite de Upload." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "Definir limite de Download." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Obter e mostrar o valor da opção selecionada." + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "Obter preferências do IPFilter." + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "Obter estado do IPFilter para ambos clientes e servidores." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "Obter estado do IPFilter somente para clientes." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "Obter estado do IPFilter somente para servidores." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "Obter nível do IPFilter" + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Obter limites de Up/Down" + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Faça uma busca" + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"Um tipo de busca poderá ser especificado escolhendo o tipo:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Exemplo: 'search kad file' será feita pesquisa na rede kad para o \"arquivo" +"\".\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Executa uma pesquisa global." + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Executa uma pesquisa local" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Executa uma pesquisa no kad" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Mostra resultados da última pesquisa." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Retorna os resultados da pesquisa anterior.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "Exibe progresso de uma pesquisa." + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "Exibe o progresso de uma pesquisa.\n" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Iniciar download de um arquivo" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"O número de um arquivo de uma última busca poderá ser obtido.\n" +"Exemplo: 'download 12' começará a baixar o arquivo com o número 12 da busca " +"anterior.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Parar Download." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Continuar Download." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Cancelar Download" + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Definir prioridade de download." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "Mudar prioridade de um download para Baixo, Normal, Alto ou Auto.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "Definir prioridade baixa." + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "Definir prioridade normal." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "Definir prioridade alta." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "Definir prioridade auto." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Exibir as listas de Up/Down" + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Exibe listas de Down/Up, lista de servidores ou lista de compartilhados.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Mostrar fila de Upload." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Mostrar fila de Download." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Mostrar log." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Mostrar lista de servidores." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Reiniciar log." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "Comando depreciado, agora é '%s'." + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" +"Esse comando foi depreciado e será removido no futuro.\n" +"Ao invés desse, use '%s'.\n" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() returned NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "Erro: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "AVISO: %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Novo ID do cliente é %u." + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "AVISO: você recebeu uma ID baixa (Low-ID)!" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "" +"\tGeralmente isso acontece quando você está atrás de um firewall/router." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tPara maiores informações, vá até http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "Info desconhecida recebida do servidor - muito curta" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "Recebido %d servidores novos" +msgstr[1] "Recebido %d servidores novos" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Salvamento da lista de servidores concluído." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "O servidor rejeitou o último comando" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Pacote falso recebido do servidor: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "Ocorreu um erro imprevisto ao processar os pacotes do servidor: %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "Não foi possível ativar resolução DNS para conectar a %s" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "IP do servidor %s (%s) está filtrado. Não conectando." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "usando obscurecimento de protocolo." + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "Conectando para %s (%s - %s:%i) %s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "Não foi possível resolver o DNS para %s: Impossível conectar!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "CIP2Country::CIP2Country(): Falha ao carrega dado do país de" + +#: src/IP2Country.cpp:73 +#, fuzzy, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "Carregado bitmaps de bandeiras %d." +msgstr[1] "Carregado bitmaps de bandeiras %d." + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "Deseja cancelar e APAGAR TODOS os arquivos desta categoria?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Confirmação requerida" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Todos os outros" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Incompleto" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Ativos" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Vídeo" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Áudio" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Arquivo" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "Imagem-CD" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Figuras" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Texto" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Selecione o filtro de exibiçao" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Adicionar categoria" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Editar categoria" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Remover categoria" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "Importando %s: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "Lendo pasta temp" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "Recebendo informações básicas do arquivo info de download" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "Criando arquivo de destino" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "Carregando dados do download antigo (%u de %u)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "Salvando bloco de dados em novo arquivo de download (%u de %u)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "Recebendo informações sobre fontes do arquivo a baixar" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "Adicionando download e salvando novo arquivo .part" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Recebendo status..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "Em progresso" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Erro: Sem espaço em disco" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Erro: Arquivo .part.met não encontrado" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Erro: erro de I/O!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Erro: Falhou!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "Na fila de espera" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Já baixando" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Arquivo temp desconhecido ou danificado" + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Nome do Arquivo" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Estado" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Hash do arquivo" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Importar arquivos .part" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"Escolha uma pasta para procurar por downloads temporários! (subdiretórios " +"serão incluídos)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "Deseja excluir os temporários dos que foram importados com sucesso?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Remover temporários?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Aguardando..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (Disco: %s)" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "bytes" +msgstr[1] "bytes" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "bytes/s" +msgstr[1] "bytes/s" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "s" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "min" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "horas" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "dias" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Vídeos" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Arquivos" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Textos" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programas" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Todos" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Não avaliado" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Inválido / Corrompido / Falso" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Ruim" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Regular" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Bom" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Excelente" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "todos" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "todos os outros" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "Carregando Filtros-IP 'ipfilter.dat' e 'ipfilter_static.dat'." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "Falha ao carregar arquivo ipfilter.dat '%s', formato desconhecido." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "Falha ao carregar arquivo ipfilter.dat '%s', impossível abrir arquivo." + +#: src/IPFilter.cpp:330 +#, fuzzy, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +"Carregadas %u Faixas de Ip de '%s'. %u linhas mal-formadas foram ignoradas." +msgstr[1] "" +"Carregadas %u Faixas de Ip de '%s'. %u linhas mal-formadas foram ignoradas." + +#: src/IPFilter.cpp:332 +#, fuzzy, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +"Carregadas %u Faixas de Ip de '%s'. %u linhas mal-formadas foram ignoradas." +msgstr[1] "" +"Carregadas %u Faixas de Ip de '%s'. %u linhas mal-formadas foram ignoradas." + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Conexões ativas (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Detalhes do Arquivo" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% concluído" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "Ligação ED2K:" + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Adicionar" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "Clique aqui para adicionar o link ed2k para a fila de espera." + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "Pop-Up do texto de status" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Carregando..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"Os eventos são exibidos aqui. Para uma lista completa, veja o log na aba " +"Servidores." + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Número de usuários conectados neste servidor..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Usuários: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" +"Usuários conectados a esse servidor e número estimado do total de usuários." + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"Média atual de Download e Upload. Se há número entre os parêntesis, " +"significa que atingiu o número máximo de conexões com o cliente." + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"Exibe o status atual da conexão e transferências ativas. Seta VERMELHA " +"significa que você nao está conectado, AMARELA significa que você está com " +"low ID (firewalled) e VERDE significa que você está com uma Id Alta (High " +"ID, o melhor tipo de conexão)." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Não Conectado..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Servidor atualmente conectado." + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Pesquisar" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Nome:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Local" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Global" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "ArquivoHash" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Paramêtros Extendidos" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Filtrando" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Tipo de Arquivo" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Extensão" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Tamanho Mínimo" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Bytes" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Tamanho Máximo" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Disponível" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Filtro:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Resultados do Filtro" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Inverter resultado" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Esconder arquivos conhecidos" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Mais" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "Buscando por mais resultados em ED2K. Não suportado pelo Kad ainda." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Pare" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Reiniciar Campos" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Resultados" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Limpar downloads completados" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Exibir Uploads / Fila de espera" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Clientes em espera: " + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Enviar" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Enviar a mensagem especificada" + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Fechar" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Encerrar sessão de Chat" + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Nome Completo:" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "N/A" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "arquivo-met :" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Hash :" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Tamanho :" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Status parcial :" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Última vez completo:" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Fontes encontradas:" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Transferindo de (fontes):" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Contador de partes: " + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Disponíveis: " + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Taxa de transf.: " + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Tempo ativo de download:" + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Transferido :" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Tamanho completo: " + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Manipulador Inteligente de Corrupção (I.C.H.)" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Perdido ao corromper: " + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Ganho com compressão: " + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "Pacotes recuperados pelo I.C.H.: " + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Nomes do arquivo" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Assumir" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Limpar" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Aplicar" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Certo" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "Comente/Avalie o arquivo (o texto será exibido para todos)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"Para um filme, Você pode falar do tamanho, idioma, história...\n" +"e se ele for falso (fake), Você poderá informar aos demais usuários." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Qualidade do arquivo" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" +"Escolha uma classe ou avise os demais usuários se o arquivo é inválido..." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Sem comentário(s)" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Atualizar" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Baixando, aguarde..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Tamanho desconhecido" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Informação necessária" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "Endereco IP:" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Porta:" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Informações adicionais" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Usuário :" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Userhash :" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Atualizar lista de compartilhados" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Sessão atual" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Total" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Solicitados:" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Uploads ativos:" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Download (Velocidade)" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Atual" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Média de execução" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Média da sessão" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Upload (velocidade)" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Conexões" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Downloads ativos" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Conexões ativas (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Uploads ativos" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Árvore de Estatísticas" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Nome do Usuário:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Hash do Usuário:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Software Cliente" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Versão do Cliente" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "Endereço IP:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "ID do Usuário:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "IP do servidor" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Nome do Servidor:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "Transferir para o cliente" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Solicitação atual:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Taxa upload (média):" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Taxa download (média):" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Upload (Sessão):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Download (sessão):" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Upload (total):" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Download (total):" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Pontuação" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "Modificador Down/Up:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Secure ident:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Avaliação (total):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Pontuação de fila:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Opções Gerais" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Nick (identificação)" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - a Mula do Linux" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "Esse é o nome que os usuários verão quando se conectarem à você." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Idioma" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "Especifica a linguagem do aMule que você quer usar." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Opções Diversas" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Procurar por nova versão ao iniciar" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "Ativar faz com que o aMule verifique por nova versão ao iniciar" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Iniciar minimizado" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "Ativando isto deixará o aMule minimizado na inicialização." + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Perguntar ao sair" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "Faz com que o aMule confirme antes de sair." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Ativar ícone no Systray" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "Essa opção ativa/desativa o ícone no system tray (ou taskbar)." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "Minimizar para a bandeja" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" +"Ativando isso, o aMule vai minimizar para o ícone de bandeja, ao invés da " +"barra de tarefas." + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Tempo de Espera (dicas) em secs" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "Tempo de espera antes de mostrar as dicas." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Browser Padrão" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Selecione seu navegador aqui" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Definido pelo Usuário:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Defina seu browser aqui, selecionando a opção 'definido pelo usuário' acima." +"Para browser personalizado, selecione essa opção na lista." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Abrir em nova aba se possível" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" +"Abrir a webpage em nova aba quando possível, ao invés de uma nova janela" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Limitação de Banda" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Upload" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Alocação de Slots" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Capacidades de Linha" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" +"Nota: Esses valores são\n" +"usados só nas estatísticas." + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Porta TCP do Cliente:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "Essa é uma porta essencial do ED2K e não pode ser desativada." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Porta UDP do cliente (Extendida):" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "Essa porta UDP é usada para solicitações ED2K extendidas e rede Kad" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "desativado" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Casar Endereço" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "Porta UDP para solicitações extendidas (TCP+3):4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "No. Max. de fontes por arquivo" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Limite Rígido" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Limites de conexão" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "No. Máximo de Conexões" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Plug and Play Universal" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "Habilitar UPnP" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "Porta TCP UPnP" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Auto-conectar ao iniciar" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Reconectar ao ser desconectado" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Exibir estatísticas da conexão" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Opções do Servidor" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Remover servidores inativos após" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "tentativas" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Atualizar lista de servidores ao iniciar" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Lista" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Atualizar lista de servidores quando conectar a um servidor" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Atualizar lista quando um cliente conectar" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Usar sistema de prioridades" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Usar verificação inteligente de LowID ao conectar" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Conexão segura" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Auto-conectar somente em servidores da lista estática" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Definir servidores adicionados manualmente com prioridade Alta" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "I.C.H. ativo" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICH a cada hash novo (não recomendado)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Adicionar novos downloads em pausa" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Adicionar novos downloads com prioridade automática" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Tentar baixar o primeiro e o último pedaço do arquivo primeiro" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Adicionar novos compartilhamentos com prioridade automática" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Tentar transferir pedaços completos em cada upload" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Iniciar próximo arquivo em pausa ao concluir download" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "Da mesma categoria" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "Salvar 10 fontes em arquivos raros (< 20 fontes)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Espaço de Disco" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Verificar espaço em disco" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "Selecione se você quer que o aMule verifique o espaço em disco" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Espaço em disco min:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Digite aqui o espaço min. de disco desejado" + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Diretório de arquivos recebidos:" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Diretório de arquivos temporários:" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Diretórios Compartilhados" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "(Botão direito na pasta para compartilhar recursivamente)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Compartilhar arquivos ocultos" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Player de Video" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Criar backup para visualizar" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Gráficos" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Tempo de atualização: 5s" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Tempo para gráfico de média: 100min" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Escala dos graficos das conexões: 100 " + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Selecionar cores das estatísticas" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Fundo" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Grade" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Download atual" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Média dos Downloads ativos" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Média dos Downloads da sessão" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Upload Atual" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Média dos Uploads ativos" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Média dos Uploads da sessão" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Conexões ativas" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Indicador do SystemTray" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Kad-nodes atuais" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Kad-nodes rodando" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Sessões Kad-nodes" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Selecione" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Número de versões a exibir (0=sem limite)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Notificações" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Mensagens PopUp" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Usar som" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "PopUp quando :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Nova entrada no log" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Iniciar nova sessão de Chat" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Nova mensagem de Chat recebida" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Download adicionado ou concluído" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Nova versão do aMule detectada" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "Urgente OOD, conexão com o servidor perdida" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Notificar via eMail" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Enviar eMail quando uma transf. concluir" + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "Servidor SMTP:" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "Endereço de eMail:" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! CUIDADO !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Não mude esses valores, a menos que você saiba o\n" +"que esteje fazendo, se não você poderá facilmente\n" +"tornar as coisas uma bagunça.\n" +"\n" +"O aMule funciona corretamente sem qualquer tipo de\n" +"alteração nessas opções." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Configurações Avançadas" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "No. Max. de conexões / 5s" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Tamanho do arquivo buffer: 240000 bytes" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Tamanho de Espera de Upload: 5000 clientes" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Atualizar conexão com servidor: desativado" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "GUI Tweaks" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Progresso dos arquivos em espera" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Exibir porcentagem" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Exibir barra de progresso" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Estilo da Barra de progresso" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Plana" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Arredondada" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Suporte a Skin" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Habilitar suporte a pele" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Pele:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- Nenhuma pele disponível -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Ordenação das Colunas" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "Auto-organizar arquivos na fila de espera (ALTO uso de CPU)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "" +"O aMule vai organizar automaticamente as colunas da lista de downloads." + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Tweaks de Interface" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Mostrar gerênciador de links ED2K" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Mostrar info. extras nas tabs de categoria" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Exibir taxa de transferência no título" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Orientação Vertical da Barra de Ferramentas" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Mostrar número da parte do arquivo antes do nome do arquivo" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Controle Remoto" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Parâmetros Webserver" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Execuatr o amuleweb na inicialização" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Webserver porta" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "Habilitar redirecionamento de porta UPnP na porta do Webserver" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Porta TCP UPnP do Webserver" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Tempo atualização (secs)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Ativar compactção Gzip" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Usuário com direitos limitados" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Password para acesso completo" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Password para acesso limitado" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Modelo de rede" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Parâmetros de conexão externa" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Aceitar conexões externas" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"IP da interface de audição\n" +"(vazio para qualquer)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Informe um IP válido no formato a.b.c.d para a interface EC que ficará " +"aguardando. Um campo vazio ou 0.0.0.0 quer dizer 'qualquer interface'" + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "Porta TCP" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "Habilitar redirecionamento de porta UPnP para porta EC" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "Clique aqui para aplicar as alterações feitas." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Ignora todas as alterações feitas." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Título: " + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Comentário: " + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Dir incoming:" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Alterar prioridade para novos arquivos:" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Não Alterar" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Selecione a cor para esta Categoria (selecionada): " + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Exibir a mensagem do dia (motd) ao conectar" + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Informações do Servidor" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Clique nesse botão para limpar o log." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "Log do aMule" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "Clique nesse botão para atualizar a lista de servidores..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Lista de Servidores" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Informe a URL com o arquivo server.met aqui e pressione o botão a esquerda " +"para atualizar a lista de servidores." + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Adicionar Servidor: Nome" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Informe o nome do novo servidor aqui" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Informe o IP do servidor no formato x.x.x.x nesse espaço." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Informe a porta do servidor aqui." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "Adicionar manualmente um servidor (preencha os campos ao lado antes)" + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "ED2K Info" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Kad Info" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"O locale (idioma) selecionado aparentemente não esta instalado.\n" +"Você tem que gerar ele para usar esta lingua.\n" +"Um bom início em sistemas linux e o arquivo /etc/locale.gen e o pacote " +"'locales'\n" +"Boa sorte!\n" +"(Nota: Eu vou tentar definir ele mesmo assim)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Nunca exiba isto novamente" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "Clique nesse botão para atualizar a lista de nodes da URL..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Nodes (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"informe uma URL para um arquivo nodes.dat e pressione o botão da esquerda " +"para atualizar a lista de nodes conhecidos." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Estatísticas dos Nodes" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Inicialização" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Novo node" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Porta:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Inicializando com \n" +"clientes conhecidos" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Desconectar da rede Kad" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Obscurecimento de Protocolo" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Suporta Obscurecimento de Protocolo" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"Esta opção habilita Obscurecimento de Protocolo, e faz o aMule aceitar " +"concexões obscuras de outros clientes." + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Usar obscurecimento para conexões externas" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"Esta opção faz o aMule usar Obscurecimento de Protocolo quando conectando " +"outros clientes/servidores." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Aceitar somente conexões obscuras" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"Esta opção faz o aMule aceitar somente conexões obscurecidas. Você terá " +"menos fontes, mas todo seu tráfego será obscurecido" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Opções de Arquivo" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Todos" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Ninguém" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Quem pode ver os compartilhados:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "Selecione quem pode pedir a sua lista de compartilhamentos." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "Filtro de IP" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Filtrar clientes" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Habilitar filtragem de IPs de clientes definidos no arquivo ~/.aMule/" +"ipfilter.dat." + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Filtrar servidores" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Habilitar filtragem de IPs de servidores definidos no arquivo ~/.aMule/" +"ipfilter.dat." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Recarregar lista" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "Recarregar lista de IPs a filtrar do arquivo ~/.aMule/ipfilter.dat" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Atualizar agora" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Auto-atualizar ipfilter ao iniciar" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Níveis de Filtro:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Sempre filtrar IPs de redes LAN" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Manuseio paranóico de IPs não-casados" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Rejeitar pacotes se o ip do cliente é diferente do ip onde o pacote foi " +"recebido. Use com cuidado." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "Utilizar ipfilter.dat global se disponível" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" +"Se nenhum ipfilter.dat local for encontrado, permita o uso de um arquivo " +"global." + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "Utilizar Identificação Segura de Usuário" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" +"É recomendável ativar essa opção. Você não receberá seus créditos se a " +"identificação segura não estiver ativada." + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Ativar/Desativar" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Ativar Assinatura Online" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Habilita a gravação do arquivo, que pode ser usado por programas externos." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Frequência de atualização (Seg):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "Alterar frequencia (em segundos) da atualização da Assinatura." + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Diretório da Assinatura Online:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" +"Clique aqui para definir pasta contendo os arquivos da Assinatura Online" + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Desativar/Ativar" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "Filtrar mensagens (Exceto chat atual): " + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Opções de Filtragem:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Filtrar todas as mensagens" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Filtrar mensagens de pessoas que não estão em sua lista" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Filtrar mensagens de clientes desconhecidos" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Filtrar mensagens contendo (use ',' como separador):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"adicione aqui as palavras que o amule deve filtrar e bloquear nas mensagens" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Comentários" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "Filtrar comentários contendo (use '.' como separador):" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Ativar proxy" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Ativa/desativa suporte a proxy" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Tipo de proxy:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "Tipo de proxy ao qual você está conectado" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Host do Proxy:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "Nome do host do proxy" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Porta do Proxy:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "Porta do Proxy" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Autenticação" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Ativar autenticação" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Ativa/Desativa autenticação por usuário/senha" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "Nome do usuário para conectar ao proxy" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Senha:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "Senha utilizada para conectar ao proxy" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Conexão direta, sem proxy" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Conectar em:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Fazer login em amule remoto" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Usuário" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Lembrar essas definições" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Ativar log de debug detalhado" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "Categorias de Mensagens:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "Adicionar importadas" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Tentar novamente selecionada" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Remover selecionada" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Tipos de eventos" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Conectar a qualquer servidor e/ou Kad" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Nova Categoria" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Escolha um diretório para os arquivos" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Você precisa dar um nome para a categoria!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Você precisa definir um caminho para a categoria!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"Falha ao definir pasta para a categoria. Favor informar um caminho válido!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "Extensão '%s' desconhecida para o comando '%s'.\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "Comando desconhecido '%s'.\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"Esse comando não precisa de argumentos.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"Esse comando precisa de um argumento.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Esse comando está incompleto, você precisa de uma das extensões abaixo.\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Extensões disponíveis:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Comandos disponíveis:\n" + +#: src/ExternalConnector.cpp:188 +#, fuzzy, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"Todos os comandos são case-insensitive (MAIÚSCULAS ou minúsculas).\n" +"Digite 'help ' para obter ajuda sobre o .\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Sair do programa." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Exibe a ajuda." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"Para obter ajuda sobre um comando, digite 'help '.\n" +"Para obter a lista completa de comandos, digite 'help'.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"Use '%s' para lista de comandos\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Erro na sintaxe!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Erro processando comando - isso jamais deveria acontecer! Reporte o bug, por " +"favor\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Este comando não precisa de parâmetros." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Este comando precisa de um parâmetro." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Argumento inválido." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Este comando está incompleto." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Digite '%s' para maiores informações.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "Este é %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "Este é %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Criando cliente..\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "Conexão Falhou. Impossível conectar ao host especificado\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"Ok, abandonando %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"Não é possível conectar sem senha.\n" +"Você deve informar uma no arquivo de configuração\n" +"ou na linha de comando, ou informar um quando pedido.\n" +"\n" +"Finalizando...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Exibir esse texto de ajuda." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "Host onde o aMule está rodando. (padrão: localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "Porta em que o aMule está esperando Conexões Externas (padrão: 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Senha para Conexão Externa." + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Ler configuração de arquivo." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "Não exiba mensagens no stdout (silencioso)" + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Verbose - exiba até as mensagens de debug." + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Defina o locale (idioma)." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "Gravar opções de linha de comando" + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "Criar arquivo de configuração baseado no do aMule." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Exibir versão do programa." + +#: src/ClientCreditsList.cpp:168 +#, fuzzy, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "Arquivo de créditos carregado, %u clientes reconhecidos" +msgstr[1] "Arquivo de créditos carregado, %u clientes reconhecidos" + +#: src/ClientCreditsList.cpp:171 +#, fuzzy, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] " - Créditos expirados para %u clientes!" +msgstr[1] " - Créditos expirados para %u clientes!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "Arquivo 'cryptkey.dat' não foi encontrado, criando." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"ERRO: O daemon aMule não pode ser usado quando conexões externas estão " +"disabilitadas. Para habilitar conexões externas, use um dos dois normal no " +"aMule, inicie o amuled com a opção --ec-config ou mude o comando" +"\"AcceptExternalConnections\" para 1 no arquivo ~/.aMule/amule.conf" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "ERRO: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "DesBanir" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Exibir Uploads" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Exibir lista de espera" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Exibir Clientes" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Selecionar modo de visão" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Software Cliente" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Aguardou" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Tempo de Upload" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Upload/Download" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Status Remoto" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "QR: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Prioridade de Arquivo" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Contagem" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Pedidos" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Última visita" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Lista de Espera" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Status de Upload" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Transferido (Up)" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Status de Download" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Transferido (Down)" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Userhash" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Encriptado" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Esconder arquivos compartilhados" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Detalhes do Cliente" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Não Suportado" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Incompleto" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Cara Mau" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Verificado - OK" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Não Disponível" + +#: src/ClientDetailDialog.cpp:190 +#, fuzzy, c-format +msgid "%u (QR: %u)" +msgstr "QR: %u" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "Tamanho min deve ser menor que tamanho max. Tamanho max ignorado" + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Alerta da busca" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Ilimitado" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "Menu do Tray aMule" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Limites de Velocidade:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "UL: Nenhum" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "UL: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "DL: Nenhum" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "DL: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Velocidade de Down: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Velocidade de UP: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Informacao do Cliente" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Nickname: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "Nenhum nickname definido!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "ClienteID: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Nome do Servidor: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "Ip do Servidor: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "Porta TCP: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "Porta TCP: Nao pronta" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "Porta UDP: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "Porta UDP: Nao pronta" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Online Signature: Ativado" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Online Signature: Desativado" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Compartilhando: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Em espera: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "DL Total: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "UL Total: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Limite de Upload" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Limite de Download" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "Ocultar aMule" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "Mostrar aMule" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "Sessão de Chat iniciada: %s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Conectado ao Cliente ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** Conectando ao Cliente ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Falha ao conectar ao Cliente / Conexão perdida ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Fechar aba" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Fechar todas as abas" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Fechar outras abas" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "Carregando arquivo server.met: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "Arquivo server.met não encontrado!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "Falha ao carregar arquivo server.met '%s', formato desconhecido." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "Falha ao abrir arquivo server.met !" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"Arquivo server.met corrompido, encontrada tag de versão inválida: 0x%x, " +"tamanho %i" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "Encontrados %i servidores no server.met" +msgstr[1] "Encontrados %i servidores no server.met" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "Adicionados %d servidores" +msgstr[1] "Adicionados %d servidores" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Servidor não adicionado: [%s:%d] não possui uma porta válida." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "Servidor não adicionado: o IP de [%s:%d] está filtrado ou é inválido." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" +"Servidor não adicionado: Servidor com esse IP:Porta [%s:%d] já na lista." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Servidor adicionado: Servidor em [%s:%d] usando o nome '%s'." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"Você está conectado a um servidor que está tentando apagar. Desconecte " +"primeiro." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Falha ao salvar server.met!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "URL inválida" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "Download da lista de servidores de %s concluída" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Falha ao obter a lista de servidores de %s" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"Não foi encontrado nenhum endereço de servidor em 'addresses.dat'. Favor " +"adicionar um endereço server.met correto para o auto-update funcionar." + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "Iniciando download da lista de servidores de %s" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "Cuidado, URL para atualizar servidores é inválida: %s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "Nenhuma URL com server.met da lista addresses.dat é válida" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"Servidor local é filtrado pelo IPFilters, reconectando em um servidor " +"diferente!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "Falha ao executar comando `%s' no evento `%s'." + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"Seu locale foi alterado para o padrão do Sistema devido a mudança na " +"configuração. Desculpe." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"Você não tem nenhum servidor na lista de servidor.\n" +"Você quer que o aMule baixe uma nova lista agora?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Lista de servidor baixada" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "webserver rodando com pid %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"Você ativou o webserver na inicialização, mas o binário do amuleweb não pode " +"ser executado. Por favor, instale o pacote contendo o aMule webserver, ou " +"compile o aMule usando --enable-webserver e rode make install" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "Porta %u não disponível. Você ficará com LOWID (id baixa)\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"A Porta %u não está disponível!\n" +"\n" +"Isso quer dizer que você ficará com LOWID (ID baixa).\n" +"\n" +"Verifique sua rede para ver se essa porta está aberta para entrada e saída." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Falha ao criar o arquivo OnlineSig" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "Falha ao criar o arquivo OnlineSig do aMule" + +# src/amuled.cpp:1246: +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"Parece que o idioma selecionado não está instalado no seu computador. (Nota: " +"eu irei defini-lo mesmo assim)." + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "Essa é a primeira vez que você executa o aMule %s" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "Essa é uma versão de testes, atualizada diariamente, e\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "não daremos garantia se ela quebrar algo, queimar sua casa,\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" +"ou matar seu cachorro. Mas ela *deve* ser segura para uso mesmo assim.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" +"As seguintes opções serão mudadas nesta versão por razões de segurança:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* Habilitar suporte a Obscurecimento de Protocolo para conexões de entrada e " +"saída.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* Desabilitar atualizando o servidor através de outras listas de servidores " +"e clientes.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"Para mais informações sobre a razão dessas mudanças, procure\n" +"o wiki do aMule em http://wiki.amule.org para info de \"servidores falsos" +"\".\n" +"É importante que você limpe qualquer servidor falso de sua lista para o que " +"aMule funcione apropriadamente." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Maiores informações, suporte e novas versões podem ser encontradas em nossa\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" +"homepage www.aMule.org ou em nosso canal de irc #aMule na irc.freenode.net.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Esteja a vontade para notificar qualquer bug em http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"A pasta especificada para os arquivos da Online Signature é INVÁLIDA!\n" +"OnlineSignature ficará DESATIVADA até você atualizar as preferências." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "ERRO: não foi possível abrir arquivo de log" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "AVISO: o arquivo de log está vazio. Algo está errado." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Arquivo de log resetado" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "MensagemDoServidor: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Falha ao obter a lista de nodes." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Falha ao abrir arquivo de versão baixado" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Arquivo de versão corrompido" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Você está utilizando uma versão anterior do aMule!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "Sua versão do aMule é %i.%i.%i e a última versão é %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "A mais recente versão pode ser obtida em http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "" +"CUIDADO: Sua versão do aMuled esta ultrapassada: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "Sua versão do aMule está em dia :)" + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Falha ao baixar arquivo de controle de versão" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Conectado a %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Conectando a %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Desconectado da rede ED2k" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad iniciado." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad parado." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Conectado a rede Kad (ok)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Conectado a rede Kad (com firewall)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Desconectado da rede Kad" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"A rede Kad não pode ser usada se a porta UDP está desabilitada em " +"preferências, não iniciará." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "A rede Kad está desabilitada em preferências, não iniciará." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "Falha ao abrir a lista de amigos 'emfriends.met' para leitura!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "Falha ao abrir a lista de amigos 'emfriends.met' para escrita!" + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "" +#~ "Você não pode auto-suficientizar um ip específico da GUI remota ainda." + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "Você ainda não pode atualizar o arquivo server.met pela GUI remota." + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "Lendo %u contatos Kad" +#~ msgstr[1] "Lendo %u contatos Kad" + +#~ msgid "Disconnect from " +#~ msgstr "Desconectar de " + +#~ msgid "current server" +#~ msgstr "servidor atual" + +#~ msgid " and " +#~ msgstr " e " + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "Desconectar de qualquer servidor e/ou Kad" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "TCP Flags" +#~ msgstr "Flags TCP" + +#~ msgid "UDP Flags" +#~ msgstr "Flags UDP" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "Copiar links ED2K da Área de Transferência" + +#~ msgid "Client requests %u" +#~ msgstr "Requisição do cliente %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "Bloco do arquivo %u-%u (%d bytes):" + +#~ msgid "Client request is invalid!" +#~ msgstr "Requisição do cliente é inválida!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "Requisição do cliente é inválida! %i / %i" + +#~ msgid "Command: %s" +#~ msgstr "Comando: %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "Não foi possível carregar o arquivo %s - usando arquivo %s." + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "Cuidado: Known.met não existe." + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles: Removendo %s da lista do diretório de " +#~ "compartilhamento: diretório não encontrado." + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "Esperando pela terminação de subprocessos falhados" diff --git a/po/pt_PT.po b/po/pt_PT.po new file mode 100644 index 00000000..9578a37b --- /dev/null +++ b/po/pt_PT.po @@ -0,0 +1,8059 @@ +# Copyright (C) 2004 aMule Team +# This file is distributed under the same license as the aMule package. +# Kry , 2004. +# IgoR , 2004. +# Fabio Jr. Beneditto , 2004. +# LPP +# Helder Correia , 2005 +# (special thanks to Pedro Rodrigues ) +# Helder Correia , 2007. +# +# +msgid "" +msgstr "" +"Project-Id-Version: aMule 2.2.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2007-11-08 12:11+0000\n" +"Last-Translator: Miguel Almeida \n" +"Language-Team: Portuguese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Deve especificar uma palavra-chave não vazia." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Senha Invalida, não é uma chave MD5!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Falha de conexão" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "Falha de Conexão EC. Resposta vazia." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "ExternalConn: Acesso negado devido: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "ExternalConn: Acesso negado" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "ExternalConn: Má resposta do servidor. Conexão fechada." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Sucesso! Conexão ao aMule estabelecida " + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Sucesso! Conexão estabelecida." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "A gerar chave" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "A completar" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Completo" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Pausa" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Erróneo" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "A transferir" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "À espera" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Inicio da criação de chaves MD4 e AICH para o ficheiro: %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Início da criação de uma chave MD4 para o ficheiro: %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Início da criação de uma chave AICH para o ficheiro: %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "Conversão de grupos de chaves AICH antigas em '%s' para 64b em '%s'." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "AVISO: O nome do ficheiro '%s' é invalido e foi mudado para '%s'." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "" +"AVISO: O ficheiro '%s' já existe, o novo ficheiro tem agora o nome '%s'." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "AVISO: Não é possível remover o original '%s' após criar a salvaguarda" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "AVISO: falha ao remover %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Erro ão receber ficheiros partilhados do utilizador '%s'" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "desconhecido" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (Versão eMule Falsa %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (eMule falso)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (eMule falso)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (baseado no eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Alcunha: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "Pedido:" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Estatística desta sessão: aceites %d de %d pedidos, %s transferidos\n" +msgstr[1] "" +"Estatística desta sessão: aceites %d de %d pedidos, %s transferidos\n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Estatística de todas as sessões: Aceites %d de %d pedidos, %s transferidos\n" +msgstr[1] "" +"Estatística de todas as sessões: Aceites %d de %d pedidos, %s transferidos\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Pedido um ficheiro desconhecido" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "Cliente %s com IP:porta %s:%d utilizando %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Nome do utilizador" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Amigos" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Exibir &detalhes" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Adicionar um amigo" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Remover amigo" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Enviar &mensagem" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Exibir ficheiros" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Estabelecer vaga para amigos" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Tem a certeza que deseja remover o(s) amigo(s) seleccionado(s)?" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Tem a certeza que deseja remover o(s) amigo(s) seleccionado(s)?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Cancelar" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"Não lhe é permitido definir mais do que uma vaga para amigos.\n" +"Apenas uma vaga foi atribuída." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Selecção múltipla" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Nome do ficheiro" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Tamanho" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Tipo" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Prioridade" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "Chave" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Pedidos" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Pedidos aceites" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Dados transferidos" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Grau de partilha" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Partes já transferidas" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Fontes completas" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Caminho da pasta" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Ficheiros partilhados" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Muito baixa" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Baixa" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normal" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Alta" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Muito Alta" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Lançamento" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Automática" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Adicionar Comentário/Avaliação" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Editar Comentário/Avaliação" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Renomear" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Adicionar ficheiros na coleção a lista de transferências" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Copiar ímã &URI" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Copiar &ligação ED2k para a área de transferência" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Copiar link ED2k para o clipboard (&Fonte)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "Copiar link ED2k (Origem) (&With Crypt options)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Copiar link ED2k (&Hostname)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "Copiar o link ED2k (Hostname) (Com opções &Crypt)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Copiar ligação ED2k para área de transferência (informação &AICH)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Copiar a resposta para a área de transferência" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "Necessita ter alta identidade para criar uma ligação de fonte válida" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Aviso" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Ficheiros partilhados (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[FicheiroDeParte]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Insira o novo nome para este ficheiro:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Renomeação de ficheiro" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "A continuar saídas do ficheiro: %s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "A suspender saída do ficheiro: %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: palavra-chave de pesquisa demasiado curta" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Erro: Não é possível escutar o porto TCP." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "O pedido falhou com o seguinte erro: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "O pedido falhou com um erro desconhecido." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "Ficheiro índice não foi encontrado: " + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Não é possível criar o processo leve de 'socket' do servidor\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Servidor HTTP: iniciado\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "A sessão expirou - a pedir entrada\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Sessão boa, dentro do sistema\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Sessão boa, fora do sistema\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Sessão não aberta - requerer-se-á entrada no sistema\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Sessão criada - a requerer entrada no sistema\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "A processar pedido [original]: " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "A verificar a palavra-chave\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Chave da senha invalida\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Palavra-chave correcta\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Palavra-chave incorrecta\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "Não entrou uma senha. Senhas vazias não são autorizadas.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Saída do sistema pedida\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "A processar pedido [redireccionado]: " + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Carrega o molde " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Porto do servidor HTTP" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Utilizar UPnP para transferencia de portas na porta do servidor web" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "Porta UPnP" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Usar compressão gzip" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Senha de acesso total para o servidor HTTP" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Senha de convidado para o servidor HTTP" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Permitir acesso convidado" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Negar acesso convidado" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "Carregar/guardar as preferências do servidor HTTP de/para aMule remoto" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "Caminho do ficheiro de configuração do aMule. NÃO USE DIRECTAMENTE!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "Desactivar o interpretador PHP (obsoleto)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Recompilar as páginas PHP em cada pedido" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "Servidor HTTP do aMule" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Indisponível" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Nunca" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "A transferir..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Preferências" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "A pasta contém o ficheiro amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Navegar" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Insira a pasta onde se encontra o seu ficheiro amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Intervalo de refrescamento em segundos" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Gerar uma imagem estatística a cada evento de refrescamento" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "Insira a pasta onde deseja gerar a imagem estatística" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Transfira periodicamente a sua imagem estatística para o servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "URL FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "Caminho FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Insira o RUL do seu servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" +"Insira a pasta do serviro FTP onde deseja colocar a sua imagem estatística" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Utilizador" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Senha" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Insira o nome de utilizador para entrar no seu servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Insira a saenha para entrar no seu servidor FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "Intervalo de actualização FTP em minutos" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Validar" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Pasta que contém o seu ficheiro de assinatura" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Pasta onde se gera a imagem estatística" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i dia(s) %i hora(s) %i minuto(s) %i segundo(s)" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "WxCas, Estísticas em-linha do aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Bem-vindo!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Taxa máxima de entrada desde que o wxCas está em execução" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "" +"Taxa máxima absoluta de entrada durante as execuções anteriores do wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Limpar" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "Sistema" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Parar o refrescamento automático" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Gravar imagem de estatísticas em-linha" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Imprimir a imagem de estatísticas em-linha" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Definição de preferências" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "Acerca do wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Iniciar o refrescamento automático" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Refrescamento automático parado" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Refrescamento automático iniciado" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Gravar a imagem de estatísticas" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Não há manipulador para este tipo de ficheiro" + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "O ficheiro não foi gravado" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "Estatísticas em-linha do aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Ocorreu um erro ao imprimir.\n" +"Talvez a sua impressora actural não esteja bem configurada." + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "A imprimir" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, Estatísticas de assinatura em-linha do aMule\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Baseado no CAS por Pedro de Oliveira \n" +"\n" +"Distribuído sob a licença GPL" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Ai Ai, o aMule não esta ligado..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "O aMule está em execução" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule esta a funcionar mas esta desligado" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "O aMule está a conectar..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "O estado do aMule é desconhecido..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " está em execução há " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " esta parado !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " não esta ligado !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " está a conectar..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " está a fazer algo estranho, verifique!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " esta ligado a " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "ok" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "protegido" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "parado" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " está em " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +#, fuzzy +msgid " with " +msgstr "] com " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Total recebido: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", enviado: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Recebido (Sessão): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Recebido: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s, enviado: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "A partilhar: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " ficheiro(s). Clientes na fila de espera: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Hora: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " no " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Média de carga do sistema (1-5-15 minutos): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Tempo de funcionamento do sistema: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uD %02uh %02um %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uh %02um %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02um %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "Alta identidade" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "Baixa identidade" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Não conectado" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f kB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "Cancelado!" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Não é possível abrir %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "" +"O ficheiro %s é muito grande para a rede Donkey: máximo permitido é 4 GB." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Parâmetros de entrada" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Ficheiro para gerar identificação" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Adicionar URLs adicionais para este ficheiro" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Insira o ficheiro que deseja computar a ligação Ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Insira o URL que deseja adicionar à ligação Ed2k: acrescente '/' no final " +"para permitir ao aLinkCreator acrescentar o nome do ficheiro corrente" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Adicionar" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Remover" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Limpar" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Limpar a ligação com chaves parciais" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Ajuda a espalhar ficheiros novos e raros mais rapidamente, com o custo de um " +"maior tamanho de ligação" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "Chave de ficheiro MD4" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "Chave de ficheiro Ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "Ligação Ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Iniciar" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Gravar" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Copiar para a área de transferência" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Sair" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Abrir um ficheiro para computar a sua ligação ED2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Copiar a ligação ED2k computada para a área de transferência" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Gravar a ligação ED2k computada para ficheiro" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "Acerca do aLinkCreator" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Seleccione o ficheiro que deseja computar a ligação ED2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "NAda a copiar por agora!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Seleccione o ficheiro para a sua ligação ED2k computada" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Não é possível abrir " + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Por favor, insira um nome de ficheiro" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "Nadaa gravar por agora!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, o criador de ligações ED2k do aMule\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Gráficos de http://www.everaldo.com, http://www.icomania.com\n" +"e http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distribuído sob a licença GPL" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "A gerar chaves..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Concluído em %.2f s" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "Já adicionou este URL!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Por favor, insira um URL" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "A processar o ficheiro número %u: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "Requisitou chaves parciais (usado apenas para ficheiros > 9.5 MB)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Por favor, aguarde..." + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> Ficheiro inexistente!\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, o criador de ligações ED2k do aMule" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Automática [baixa]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Automática [normal]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Automática [alta]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "A conectar" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "A pedir" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "A conectar via servidor" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Lista de espera cheia" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "Na fila de espera" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "A transferir" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "A receber o conjunto de chaves" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Não há partes necessárias" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Não é possível conectar dois clientes com baixa identidade" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Demasiadas conexões" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "A conectar via Kad" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Demasiadas conexões Kad" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "banidos" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Erro de Conexão" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Fila Remota Cheia" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "MLDonkey antigo" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "MLDonkey Novo" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "Compatível com eMule" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Servidor Local" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Servidor Remoto" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Troca de Fontes" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Passivo" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Ligação" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Sementes de Fontes" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Predefinido do sistema" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Árabe" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Basco" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Búlgaro" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Catalão" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Chinês (simplificado)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Chinês (tradicional)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Croata" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Dinamarquês" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Holandês" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Inglês" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Estoniano" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Finlandês" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Francês" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Galego" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Alemão" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Húngaro" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Italiano" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Italiano (Suíço)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Coreano" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "Lituano" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "Norueguês (Nynorsk)" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Polaco" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Português" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Português (Brasil)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Russo" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Esloveno" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Espanhol" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "Sueco" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Turco" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Não é possível determinar o navegador seleccionado!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" +"O porto TCP não pode ser superior a 65532 devido ao socket UDP do servidor " +"ser TCP+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "O porto predefinido será usado (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Nome do servidor" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Endereço" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Porto" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Descrição" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Distância (ping)" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Utilizadores" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Ficheiros" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Falhas" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Estático" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Versão" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Encontra-se conectado a um servidor que está a tentar remover. Por favor, " +"desconecte-se primeiro. O servidor NÃO foi removido." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Informação" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(Nome desconhecido)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Tem a certeza que deseja eliminar o servidor estático %s" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Sim" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Não" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Erro ao abrir '%s'" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Servidores (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Servidor" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Conectar ao servidor" + +#: src/ServerListCtrl.cpp:428 +#, fuzzy +msgid "Mark server as static" +msgstr "Marcar o(s) servidor(es) como estático(s)" + +#: src/ServerListCtrl.cpp:429 +#, fuzzy +msgid "Mark server as non-static" +msgstr "Marcar os servidor(es) como não estático(s)" + +#: src/ServerListCtrl.cpp:431 +#, fuzzy +msgid "Mark servers as static" +msgstr "Marcar o(s) servidor(es) como estático(s)" + +#: src/ServerListCtrl.cpp:432 +#, fuzzy +msgid "Mark servers as non-static" +msgstr "Marcar os servidor(es) como não estático(s)" + +#: src/ServerListCtrl.cpp:438 +#, fuzzy +msgid "Remove server" +msgstr "Remover o(s) servidor(es)" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "Remover o(s) servidor(es)" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Remover todos os servidores" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Copiar a ligação ED2k para a área de transferência" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "Copiar a ligação ED2k para a área de transferência" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Reconectar ao servidor" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Tem a certeza que deseja eliminar todos os servidores?" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Tem a certeza que deseja eliminar o(s) servidor(es) seleccionado(s)?" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Tem a certeza que deseja eliminar o(s) servidor(es) seleccionado(s)?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Desactivado [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "Isto é o aMule %s baseado no eMule." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "A correr em %s" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" +"Visite http://www.amule.org para verificar se há uma nova versão disponível." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Erro grave: Falha ao criar temporizador" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "controlo remoto do aMule" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Captura:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr "" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr "" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Mensagem" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Texto de estado" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "A conectar" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "Desconectado" + +#: src/amuleDlg.cpp:676 +#, fuzzy +msgid "Kad: Firewalled" +msgstr "Protegido" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "Conectado" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "A conectar" + +#: src/amuleDlg.cpp:689 +#, fuzzy +msgid "Kad: Off" +msgstr " Kad: " + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "Cancela as actuais tentativas de conexão" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Desconectar" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "Desconectar da rede." + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Conectar" + +#: src/amuleDlg.cpp:726 +#, fuzzy +msgid "Connect to the currently enabled networks" +msgstr "Conectar à rede." + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Saida: %.1f(%.1f) | Entrada: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Saida: %.1f | Entrada: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | Conectado)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | Desconectado)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Quer mesmo sair do aMule?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Confirmação de saída" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Não foi possível determinar o comando para executar o navegador." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "Diretório para os temas '%s' não existe" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "Aviso: Ficheiro de tema '%s' não pode ser aberto para leitura" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Redes" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Janela de Redes" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Pesquisas" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Janela de pesquisas" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Transferências" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Janela de transferências" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Janela de ficheiros partilhados" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Mensagens" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Janela de mensagens" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Estatísticas" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Janela de estatísticas" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Janela de preferências" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Importar" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "A ferramenta de importação de ficheiro de partes" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "Acerca" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "Acerca/Ajuda" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Geral" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Conexão" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Proxy" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Filtro de mensagem" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Controlos remotos" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Signatura em-linha" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Pastas" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Segurança" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "Ajustes da interface gráfica" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Ajustes nucleares" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Eventos" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Depuração" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Personalizado" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"aMule tem de ser reinicializado para activar estas mudanças:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- Porta TCP foi mudada.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- Porta UDP for mudada.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"A sua lista de servidores com actualização automática está vazia.\n" +"Actualização automática de servidores no arranque será desactivada." + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"Activou conexões externas mas não especificou uma senha.\n" +"Conexões externas não podem ser activadas a menos que uma senha válida seja " +"especificada" + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- A lingua foi mudada.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- Diretório provisorio foi mudado.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Saída: 0.0 | Entrada: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"ED2K e Kad estão desactivados.\n" +"Não vai conseguir uma ligação até activar pelo menos um deles." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"Kad nao vai funcionar se a porta UDP estiver deactivada.\n" +"Active a porta UDP ou deactive Kad." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"DEVE reinicializar aMule agora.\n" +"Se não o fizer, não se queixe se más coisas acontecerem.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "AVISO" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"A sua lista de servidores com actualização automática está vazia.\n" +"Por favor, preencha pelo menos uma localização que aponte para um ficheiro " +"'server.met' válido.\n" +"Clique no botão \"Lista\" para inserir uma localização." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "Ficheiros temporários" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Ficheiros a entrar" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Assinaturas em-linha" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Seleccione uma pasta para %s" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Procurar WAV" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "Ficheiro WAV (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Procurar leitor de vídeo" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Seleccionar Navegador" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Executável%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Editar a lista de servidores" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Adicione localizações para obter ficheiros 'server.met'\n" +"Apenas uma localização por linha." + +#: src/PrefsUnifiedDlg.cpp:980 +#, fuzzy, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Intervalo de actualização: %d segundos" +msgstr[1] "Intervalo de actualização: %d segundos" + +#: src/PrefsUnifiedDlg.cpp:987 +#, fuzzy, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Tempo para o gráfico de média: %d minutos" +msgstr[1] "Tempo para o gráfico de média: %d minutos" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Escala do gráfico de conexões: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, fuzzy, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Intervalo de actualização: %d segundos" +msgstr[1] "Intervalo de actualização: %d segundos" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, fuzzy, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Tamanho de memória temporária de ficheiros: %d B" +msgstr[1] "Tamanho de memória temporária de ficheiros: %d B" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, fuzzy, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Tamanho da fila de espera de saída: %d clientes" +msgstr[1] "Tamanho da fila de espera de saída: %d clientes" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, fuzzy, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Intervalo de refrescamento de conexão ao servidor: %d minutos" +msgstr[1] "Intervalo de refrescamento de conexão ao servidor: %d minutos" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Interval de refrescamento de conexão ao servidor: desactivado" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Execute o programa quando ocorrer o evento `%s'" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Active execução de commandos no núcleo" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Commando núcleo:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Active execução de commando na interface grafica" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "Commando da interface grafica:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "As variaveis seguintes vão ser substituidas:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Tentativa de acesso não autorizado. Conexão fechada." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Conexão externa fechada." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "Conexões externas desactivadas devido a senha vazia!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "Conexões externas desactivadas no ficheiro de configuração" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Nova conexão externa aceite" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "Erro: não foi possível aceitar uma nova conexão externa" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" +"Conexão externa recusada devido a senha não preenchida nas preferências!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "A conectar cliente: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Versão desconhecida" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"Versão EC incorrecta, pode haver incompatibilidade binária. Utilize núcleo e " +"remoto da mesma captura." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "A autenticação falhou." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Versão de protocolo inválida." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Elemento de versão de protocolo em falta." + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Pedido inválido, deve autenticar-se primeiro." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Acesso concedido." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" +"Falha no comando de ficheiro de partes remoto: Chave não encontrada: %s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "Chave não encontrada: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "OPS! Erro de processamento de 'OpCode'!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Servidor não adicionado" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "servidor não encontrado: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "é necessário definir o servidor a remover" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "ED2K desactivado nas preferências." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "A pesquisar. Resultados dentro de momentos!" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "Pesquisa a partir da interface remota não faz sentido." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad desactivado nas preferências." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Sem pontos para gráfico." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "O cliente não está configurado para este nível de detalhe." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "ExternalConn: finalização pedida" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Já a desligar." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "LigaçãoExterna: addicionado o link '%s'." + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Ligação inválida ou já na lista." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "Ficheiro não encontrado." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Nome de ficheiro inválido." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Não é possível renomear o ficheiro." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Já conectado a ED2K." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "A conectar a ED2K..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Já conectado a Kad." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "A conectar a Kad..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Todas as redes estão desactivadas." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Desconectado de ED2K." + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Desconectado de Kad." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "ExternalConn: código de operação inválida recebida: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "Instrução inválida (versão de protocol errada?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" +"Abertura do ficheiro (%s) falhou, remoção da lista de ficheiros partilhados." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "Conjunto de chaves pedido para ficheiro desconhecido: %s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "Commando `%s' com pid `%d' terminou com codigo `%d'." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "Servidor não adicionar: IP ou nome de máquina não especificado" + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "Servidor não adicionado: Porto de servidor especificado inválido." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "Estado eD2k" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Conectado" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Porto" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "Identificador" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Estado Kademlia" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "A correr" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Estado" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Desconectado" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Estado da Conexão" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Protegido" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "OK" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Estado Protegido: " + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Conectado a amigo" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "Sem amigo" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Média de Utilizadores" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "Média de Ficheiros" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "Parado" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Tempo de funcionamento: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Transferência" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Saídas" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Dados enviados (sessão (total)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Sobrecarga total (pacotes): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Sobrecarga de pedidos de ficheiro (pacotes): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "Sobrecarga de mudanças de fonte (pacotes): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Sobrecarga do servidor (pacotes): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Excesso Kad (Pacotes): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Saídas activas: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Saídas em espera: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Total de sessões de saída com sucesso: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Total de sessões de saída falhadas: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Tempo médio de envio: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Entradas" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Dados recebidos (sessão (total)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Fontes encontradas: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Entradas activas (pedaços): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Taxa enviado:recebido da sessão (total): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Taxa média de entrada (Sessão): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Taxa média de saída (Sessão): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Taxa máxima de entrada (Sessão): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Taxa máxima de saída (Sessão): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Reconexões: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Tempo desde a primeira transferência: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Conectado ao servidor desde: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Conexões activas (estimativa): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Limite Máximo Conexões Alcançado: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Média Conexões (estimativa): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Picos de conexões (estimativa): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Clientes" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Filtrados" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Total: %i Conhecido: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Servidores" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Servidores Activos: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Servidores com Falha: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Total: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Servidores Removidos: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Servers Filtrados: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Utilizadores em Servidores Activos: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "Ficheiros em Servers Activos: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Total Utilizadores: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "Total Ficheiros: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Ocupacão do servidor: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Número Ficheiros Partilhados: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Tamanho total de ficheiros partilhados: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Tamanho médio de ficheiro: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "Baixa identidade: %u (%.2f%% Total %.2f%% conhecido)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "SecIdent (des)activado: %u (%.2f%%) : %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Sistema Operativo" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "Não recebido" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Cortar" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Copiar" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Colar" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Seleccionar tudo" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "Buscas no Kad não podem ser feitas se o Kad não estiver ligado" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "Buscas no ED2K não podem ser feitas se o ED2K não estiver ligado" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Erro inesperado enquanto tentava fazer uma busca no Kad: " + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "Mensagem filtrada de '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "Nova mensagem de '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" +"O utilizador %s (%u) pediu a sua lista de ficheiros partilhados -> Aceite" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" +"O utilizador %s (%u) pediu a sua lista de ficheiros partilhados -> Negado" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "O utilizador %s (%u) pediu a sua lista de pastas partilhadas -> Aceite" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "O utilizador %s (%u) pediu a sua lista de pastas partilhadas -> Negado" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"O utilizador %s (%u) pediu a sua lista de ficheiros partilhados para a pasta " +"%s -> aceite" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"O utilizador %s (%u) pediu a sua lista de ficheiros partilhados para a pasta " +"%s -> negado" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "O utilizador %s (%u) partilha a pasta %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "O utilizador %s (%u) enviou pastas partilhadas não requisitadas." + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" +"O utilizador %s (%u) enviou a lista de ficheiros partilhados para a pasta %s" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "" +"O utilizador %s (%u) terminou o envio da lista de ficheiros partilhados" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "" +"O utilizador %s (%u) enviou lista de ficheiros partilhados não desejada" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" +"O utilizador %s (%u) negou acesso à lista de ficheiros/pastas partilhados" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Nós (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "Endereço IP inválido para arranque" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Porto inválido para arranque" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Por favor, preencha todos os campos pedidos" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Tem a certeza que deseja transferir um ficheiro nodes.dat novo?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" +"Ao fazê-lo, irá remover os seus nós correntes e reiniciar a conexão Kademlia." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Continuar?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Erro: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Aviso: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Adicionar um amigo" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Deve indicar um endereço IP e um porto válidos" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Informação" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "A chave de utilizador especificada não é válida!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Fontes" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Ficheiro" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Transferir" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Categoria" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Principal" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Descarregar na categoria" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "Buscar ficheiros relacionados (ED2K, servidor local)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Conectar ao amule remoto" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Ligação falhou " + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Erro" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"AVISO: Não se poderá adicionar a si próprio como fonte para um link ed2k " +"enquanto tiver lowid." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Utilizadores: E: %s K: %s | Ficheiros E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Todos" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Utilizadores: %s | Ficheiros: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Transferido" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Concluído" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Velocidade" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Progresso" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Estado" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Tempo restante" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Visto completo pela última vez" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Útima recepção" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Tem a certeza que deseja eliminar o(s) ficheiro(s) seleccionado(s)?" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Tem a certeza que deseja eliminar o(s) ficheiro(s) seleccionado(s)?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Enviar uma mensagem ao utilizador" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Mensagem a enviar:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "P&arar" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Pausar" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Continuar" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "&Limpar terminados" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Trocar cada A4AF para este ficheiro" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Trocar cada A4AF para este ficheiro (automático)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Trocar cada A4AF para outro ficheiro" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Opções extendidas" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Previsualizar" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Exibir os &detalhes do ficheiro" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Exibir todos os comentários" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Copiar ímã" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "destituir" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Atribuir à categoria" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "&Abrir o ficheiro" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Tirar da lista dos amigos" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Adicionar à lista de amigos" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Enviar mensagem" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Mudar para este ficheiro" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "QR: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "A pedir outro ficheiro" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Entradas (%i)" + +#: src/DownloadListCtrl.cpp:2222 +#, fuzzy +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"Por favor, defina o seu leitor de vídeo preferido nas preferências.\n" +"Entretanto, o aMule tentará usar o mplayer e obterá este aviso em cada " +"previsualização" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Previsualização do ficheiro" + +#: src/DownloadListCtrl.cpp:2260 +#, fuzzy, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "ERRO: Erro na execução do leitor multimédia externo!" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "EERO: falha ao abrir o ficheiro de partes)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "ERRO: falha na criação do ficheiro de partes)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "A tentar carregar a salvaguarda do ficheiro met de %s" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "Erro: Falha ao abrir o ficheiro part.met: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "Erro: O ficheiro part.met está vazio: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "Erro: Versão inválida do ficheiro part.met: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" +"Erro: %s (%s) está corrompido (contagem de elementos errada), não é possível " +"carregar o ficheiro." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "A tentar recuperar a informação do ficheiro..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" +"A recuperar ficheiro sem sem nome - tentar-se-á recuperá-lo como " +"'RecoveredFile.dat'" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" +"Recuperada toda a informação disponível do ficheiro :D - A tentar usá-la..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Não é possível recuperar a informação do ficheiro :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Falha ao abrir %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "Aviso: %s parece estar corrompido (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "ERRO ao gravar ficheiro parcial: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "'%s' está vazio - a usar o ficheiro %s." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "Erro ao gravar o ficheiro 'part.met.seeds' para %s" + +#: src/PartFile.cpp:1019 +#, fuzzy, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "Gravadas %i sementes de fontes para o ficheiro de partes: %s (%s)" +msgstr[1] "Gravadas %i sementes de fontes para o ficheiro de partes: %s (%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "O ficheiro de partes %s (%s) não tem ficheiro de sementes" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "O ficheiro de partes %s (%s) tem um ficheiro de sementes indefinido" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "Erro ao ler o ficheiro de sementes de ficheiro de partes (%s - %s): %s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, fuzzy, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"Encontrada parte corrompida (%d) no ficheiro de %d partes %s - " +"FileResultHash |%s| FileHash |%s|" +msgstr[1] "" +"Encontrada parte corrompida (%d) no ficheiro de %d partes %s - " +"FileResultHash |%s| FileHash |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "Encontrada parte completa (%i) em %s" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "Terminado a regeneração da chave de %s" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "Erro inesperado ao completar %s. ficheiro em pausa" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Transferência concluída: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "A eliminar o ficheiro: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" +"Aviso: Não é possível calcular a chave de uma parte recebida - conjunto de " +"chaves incompleto para '%s'" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"Erro: Impossível calcular a chave de uma parte recebida - conjunto de chaves " +"incompleto (%s). Isto nunca deveria acontecer." + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "AVISO: Espaço livre em disco insuficiente! A pausar o ficheiro: %s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "Parte recebida %i está corrompida no ficheiro: %s" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH: Recuperada parte corrompida %i para %s -> bytes guardados: %s" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Espaço no disco insuficiente" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Parado" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "Aviso: known.met não pode ser aberto." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" +"Aviso: Lista de ficheiros conhecidos corrompida, contém cabeçalho inválido." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "Erro de entrada/saída ao ler ficheiro known.met: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "Erro ao gravar ficheiro known.met: %s" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "Foram encontrados %i ficheiros partilhados" +msgstr[1] "Foram encontrados %i ficheiros partilhados" + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "Encontrados %i ficheiros partilhados conhecidos, %i desconhecidos" +msgstr[1] "Encontrados %i ficheiros partilhados conhecidos, %i desconhecidos" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "ERRO! Tentado partilhar %s" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Comentários do ficheiro" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Classificação" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Comentário" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Sem comentários" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%s comentário(s)" +msgstr[1] "%s comentário(s)" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"Ligação a servidores obfuscados falhou. Mais uma tentativa sem obfuscaçao" + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "Falha ao conectar em todos os servidores listados. Tentando novamente." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "Rede ED2K desactivada nas preferências, a ligaçao não vai ser feita." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "Não houve conexões válidas na lista de servidores" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Conectado a %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Conexão estabelecida com: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"Erro Fatal durante tentativa de conexão. Talvez a sua conexão tenha caído." + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Perdida a conexão com %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) aparenta estar morto." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) aparenta estar cheio." + +#: src/ServerConnect.cpp:391 +#, fuzzy, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "Conexão automática com o servidor irá repetir-se em %d segundos" +msgstr[1] "Conexão automática com o servidor irá repetir-se em %d segundos" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Conexão perdida" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "A conexão com %s (%s:%i) falhou." + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "Erro: Socket inválido durante a verificacão" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "A tentativa de conexão com %s (%s:%i) expirou." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Nenhum ficheiro de partes (.part) encontrado" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "Encontrados %u ficheiros de partes" +msgstr[1] "Encontrados %u ficheiros de partes" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "A transferir %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Já está a tentar obter o ficheiro '%s'" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Já possui o ficheiro '%s'" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Já está a tentar transferir o ficheiro %s" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "Conversão de ed2k para ímã nao pode ser feita: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "Protocolo do link desconhecido: %s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Ligação ed2k inválida!: Erro: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "Executar e sair." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Formato de IP inválido. Use xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +#, fuzzy +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" +"Este comando requere um argumento. Argumentos válidos: 'all' ou um número.\n" + +#: src/TextClient.cpp:343 +#, fuzzy +msgid "Processing by hash: " +msgstr "A processar o ficheiro número %u: %s" + +#: src/TextClient.cpp:358 +#, fuzzy +msgid "Processing by filename: " +msgstr "A processar o ficheiro número %u: %s" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Número inválido\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "Não é uma chave válida (o comprimento deveria ser de 32 caracteres)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "Operação com sucesso." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "Falha no pedido com o seguinte erro: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "Filtro de IP para clientes esta %s.\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "desactivado" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "activado" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "Filtro para servidores esta %s.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "O nível corrente do filtro de IPs é %d.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Limites de largura de banda: Saída: %u kB/s, Entrada: %u kB/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Conectado a %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "com baixa identidade" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "com alta identidade'" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "A conectar" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Não conectado" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Entrada:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Saída:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Clientes na fila de espera:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Total de fontes:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Numero de resultados: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "A fazer - mostrar o progresso duma busca" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Recebida resposta desconhecida do servidor, instrução %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Exibir informação curta de estado." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "Exibir estado da conexão, velocidade de transferência actual, etc.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Exibir a árvore de estatísticas completa." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"Opcionalmente, um número no intervalo 0-255 pode ser passado como parâmetro " +"a este\n" +"comando, que diz quantas entradas das sub-árvores de versão do cliente devem " +"ser\n" +"exibidas. Passar 0 ou omitir significa 'ilimitado'.\n" +"\n" +"Exemplo: 'statistics 5' exibirá apenas as 5 versões de topo para cada tipo " +"de cliente.\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "Terminar o aMule." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Desligar o núcleo remoto em execução (amule/amuled).\n" +"O cliente em texto também será desligado, uma vez que é inútil sem um\n" +"núcleo em execução.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Recarrega o objecto dado." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "Recarrega a lista de ficheiros partilhados." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "Recarrega a tabela de filtros de IP a partir do ficheiro." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Conectar à rede." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"Isto conectará a todas as redes activadas nas Preferências.\n" +"Pode também especificar opcionalmente um endereço de servidor na forma IP:" +"Porto,para\n" +"conectar apenas a esse servidor. O endereço IP deve ser na forma IPv4 ou um\n" +"nome resolúvel por DNS." + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Conectar apenas a ED2K." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Conectar apenas a Kad" + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Desconectar da rede." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "Isto desconectará de todas as redes actualmente ligadas.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Desconectar apenas de ED2K." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Desconectar apenas de Kad." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Adiciona um link ed2k ou ímã para o nucleo." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"O link ed2k a ser adicionado pode ser:\n" +"*) link dum ficheiro (ed2k://|file|...), sera adicionado a lista de \n" +"ficheiros a serem descarregados,\n" +"*) link dum servidor (ed2k://|server|...), sera adicionado a lista \n" +"dos servidores,\n" +"*) ou um link para uma lista de servidores, todos dos quais \n" +"serão adicionados a lista dos servidores \n" +"O ímã tem de conter a chave ed2k e o tamanho do ficheiro.\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Definir um valor de preferência." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "Definir preferências de filtros de IP." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "Activar o filtro do IP para servidores e clientes." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "Desactivar o filtro de IPs para clientes e servidores." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "Activar/Desactivar filtro de IPs para clientes." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "Activar filtro de IPs para clientes." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "Desactivar filtro de IPs para clientes." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "Activar/Desactivar filtor de IPs para servidores." + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "Activar filtro de IPs para servidores." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "Desactivar filtro de IPs para servidores." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "Seleccionar nível de filtragem de IP." + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"Níveis de filtragem válidos pertencem ao intervalo 0-255 e o valor padrão\n" +"(inicial) é 127.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Definir limites de largura de banda." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "O valor dado aos comandos deve ser em kilobytes/s.\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Definir limite de largura de banda de saída." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "Definir limite de largura de banda de entrada." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Obter e exibir um valor de preferência." + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "Obter preferências de filtragem de IP." + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "Obter estado do filtro de IPs para clientes e servidores." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "Obter estado do filtro de IPs para clientes." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "Obter estado do filtro de IPs para servidores." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "Obter nível de filtragem de IP." + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Obter limites de largura de banda." + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Faz um busca." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"O tipo de busca tem de ser definido com um tipo:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Exemplo:'search kad file' fara uma busca para \"file\" \n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Faz uma busca global." + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Faz uma busca local" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Faz uma busca no Kad" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Mostra os resultados da ultima busca." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Mostra os resultados da busca anterior.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Inicio do descarregamento dum ficheiro" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"O número do ficheiro da última pesquisa tem de ser especificado.\n" +"Exemplo: 'download 12' iniciará o download do ficheiro com o número 12 da " +"última pesquisa.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Pausar transferência." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Continuar transferência." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Cancelar transferência." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Estabelecer a prioridade." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "Estabelecer a prioridade para Baixo, Normal, Alto ou Auto.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "Estabelecer a prioridade para Baixo." + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "Estabelecer a prioridade para normal." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "Estabelecer a prioridade para alto." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "Estabelecer a prioridade para auto." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Mostrar filas/listas." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Exibe as filas de entrada/saída, listas de servidores ou ficheiros " +"partilhados.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Mostrar fila de saída." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Mostrar fila de entrada." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Mostrar o registro." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Mostrar lista de servidores." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Apagar o registro." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() devolveu NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "Erro: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "Aviso: %s (%s)- %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "O novo identificador de cliente é %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "" +"\tMuito provavelmente, isso deve-se ao facto de estar por detrás de um " +"protector ('firewall') ou roteador ('router')." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tPara mais informação, por favor, refira-se a http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "Recebida informação do servidor desconhecida! - demasiado curta" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "Recebidos %d servidores novos" +msgstr[1] "Recebidos %d servidores novos" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Gravação da lista de servidores completada." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "O servidor rejeitou o último comando" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Pacote malformado recebido do servidor: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "Erro não tratado ao processar pacote do servidor: %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "" +"Não é possível criar o processo leve de resolução de nomes para conectar a %s" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "O endereço IP do servidor %s (%s) está filtrado. A não conectar." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "a utilizar o protocolo de obfuscação." + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "A estabelecer a ligação para %s·(%s·-·%s:%i)·%s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "Não é possível resolver o nome do servidor %s: Incapaz de conectar!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "CIP2Country::CIP2Country(): Carregamento dos dados do pais falhou de " + +#: src/IP2Country.cpp:73 +#, fuzzy, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "%d imagens de bandeiras forão carregadas." +msgstr[1] "%d imagens de bandeiras forão carregadas." + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"Tem a certeza que deseja cancelar e apagar todos os ficheiros desta " +"categoria?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Confirmacão necessária" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Todos os outros" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Incompleto" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Activo" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Vídeo" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Áudio" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Ficheiro" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "Imagem de CD" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Fotografia" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Texto" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Seleccione o filtro de exibição" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Adicionar categoria" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Editar categoria" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Remover categoria" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "A importar %s: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "A ler pasta temporária" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "A obter informação básica" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "A criar ficheiro de destino" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "A carregar dados a partir do ficheiro de entrada antigo (%u de %u)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "A gravar bloco de dados como único ficheiro (%u de %u)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "A obter informação de ficheiro de fontes" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "A adicionar entrada e a gravar novo ficheiro de partes" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "A obter estado..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "Em progresso" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Erro: Sem espaço em disco" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Erro: Partmet não encontrado" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Erro: erro de entrada/saída!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Erro: Falha!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "Em fila" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Já a transferir" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Formato de ficheiro temporário desconhecido ou mau" + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Nome de ficheiro" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Estado" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Chave de ficheiro" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Importar ficheiros de partes" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"Por favor, escolha uma pasta para pesquisar por entradas temporárias! " +"(subpastas serão incluídas)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" +"Deseja que os ficheiros de fontes de entradas importadas com sucesso sejam " +"removidos?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Remover fontes?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "A aguardar..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (Disco: %s)" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "bytes" +msgstr[1] "bytes" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "bytes/s" +msgstr[1] "bytes/s" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "segundos" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "minutos" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "horas" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "Dias" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Vídeos" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Arquivos" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Textos" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programas" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Quaisquer" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Não avaliado" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Inválido / Corrompido / Falso" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Pobre" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Regular" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Bom" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Excelente" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "todos" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "todos os outros" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "A carregar os filtros de ip 'ipfilter.dat' e 'ipfilter_static.dat'." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" +"Erro ao carregar o ficheiro ipfilter.dat '%s', formato desconhecido " +"encontrado." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" +"Erro ao carregar o ficheiro ipfilter.dat '%s', não foi possível abrir o " +"ficheiro." + +#: src/IPFilter.cpp:330 +#, fuzzy, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +"%u intervalos IP carregados de '%s'. Foram ignoradas %u linhas defeituosas." +msgstr[1] "" +"%u intervalos IP carregados de '%s'. Foram ignoradas %u linhas defeituosas." + +#: src/IPFilter.cpp:332 +#, fuzzy, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +"%u intervalos IP carregados de '%s'. Foram ignoradas %u linhas defeituosas." +msgstr[1] "" +"%u intervalos IP carregados de '%s'. Foram ignoradas %u linhas defeituosas." + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Conexões activas (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Detalhes do ficheiro" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% terminado" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "Link ED2K: " + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Adicionar" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" +"Clique para adicionar a ligação ED2k (na caixa de texto ao lado) à sua lista " +"de transferências." + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "Mostrar texto de estado" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "A carregar..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"Os eventos são mostrados aqui. Pra uma llista completa de eventos, refira-se " +"ao registo na aba Servidores." + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Número de utilizadores conectados a este servidor..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Utilizadores: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" +"uUtilizadores conectados ao servidor actual e um estimativa do número total " +"de utilizadores." + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"Médias de entrada e saída actuais. Se activado, os números entre parêntesis " +"representam a sobrecarga da comunicação do cliente." + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"Exibe o estado de conexão e as transferências activas. Setas encarnadas " +"significam que actualmente não está conectado, setas amarelas significam que " +"tem baixa identidade ('LowID', com protector - 'firewall') e setas verdes " +"significam que tem alta identidade ('HighID', o tipo de conexão óptimo)." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Desconectado..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Servidor conectado actual." + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Pesquisar" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Nome:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Local" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Global" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "ChaveDeFicheiro" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Parâmetros extendidos" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Filtragen" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Tipo de ficheiro" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Extensão" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Tamanho mínimo" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "B" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "kB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Tamanho máximo" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Disponibilidade" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Filtro:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Resultados Filtragem" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Inverter Resultados" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Esconder Ficheiros Conhecidos" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Mais" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "Procura mais resultados para ED2K. Ainda não funciona com Kad." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Parar" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Reinicializar os campos" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Resultados" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Limpas as transferências concluídas" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Mostra a saída / fila de espera de saída" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Clientes na lista de espera :" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Enviar" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Envia a mensagem especificada." + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Fechar" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Fechar esta conversa." + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Nome completo :" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "N/D" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "Ficheiro de servidores conhecidos :" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Chave :" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Tamanho do ficheiro :" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Estado do ficheiro de partes :" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Última vez visto completo :" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Fontes encontradas:" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Fontes de transferência:" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Contagem de partes: " + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Disponíveis :" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Taxa de transferência :" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Tempo de descarregamento activo: " + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Transferido:" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Tamanho completo :" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Manipulador de corrupção inteligente (M.C.I.)" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Perdido por corrupção :" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Ganho de compressão :" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "Pacotes recuperados pelo M.C.I.:" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Nomes de ficheiros" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Assumir" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Limpar" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Aplicar" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Ok" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "Comentar/Avaliar ficheiro (Texto será visível a todos os utilizadores)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"Para um filme, pode dizer a duração, idioma, enredo...\n" +"e se ele for falso, poderá transmiti-lo aos outros utilizadores." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Qualidade do ficheiro" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" +"Escolha a classificação ou avise os utilizadores se o ficheiro for " +"inválido..." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Sem comentário(s)" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Actualizar" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "A transferir, por favor, aguarde ..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Tamanho desconhecido" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Informação necessária" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "Endereço IP :" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Porto :" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Informações adicionais" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Utilizador :" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Chave do utilizador :" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Recarregar os seus ficheiros partilhados" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Sessão actual" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Total" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Solicitados :" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Saídas activas :" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Veloc. de entrada" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Actual" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Média corrente" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Média da sessão" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Veloc. de saída" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Conexões" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Entradas activas" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Conexões activas (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Saídas activas" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Árvore de estatística" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Utilizador:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Chave do utilizador:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Programa cliente:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Versão do cliente:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "Endereço IP:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "Identificador do utilizador:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "IP do servidor:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Nome do servidor:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "A transferir" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Pedidos actuais:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Taxa média de envio:" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Taxa média de recepção:" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Enviado (sessão):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Recebido (sessão) :" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Enviado (total):" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Recebido (total):" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Pontuações" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "Modificador recebido/enviado:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Identificação segura:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Classificação (total):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Pontuação de fila de espera:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Preferências gerais" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Alcunha" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - a Mula para o Linux" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "Este é o nome que os outros utilizadores verão ao conectar-se consigo." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Idioma" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "Especifica o idioma usado nos controlos." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Opções diversas" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Procurar nova versão no arranque" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "Ao activar, fará o aMule procurar por uma nova versão no arranque" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Iniciar minimizado" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "Quando activado, o aMule minimiza automaticamente no arranque." + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Confirmar a saída" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "Faz com que o aMule peça confirmação de saída." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Activar o ícone da bandeja do sistema" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "Activa/desactiva o ícone da bandeja do sistema (ou barra de tarefas)." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "Icone minimizar" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" +"Se activar isto aMule vai minimizar para o system tray inves de para o " +"taskbar." + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Atraso de exibição de dicas em segundos" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "O tempo que decorre até serem mostradas as dicas." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Selecção de Navegador" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Seleccione o seu navegador" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Navegador personalizado:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Insira o nome do seu navegador. Para usar o navegador personalizado, " +"seleccione o item Personalizado do menu acima." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Abrir numa nova aba, se possível" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" +"Abrir a nova página numa nova aba em vez de uma nova janela, quando possível" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Limites de largura de banda" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Saída" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Atribuição de vagas" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Capacidades da ligação" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Porto TCP padrão do cliente:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "Este é o porto ED2K padrão e não pode ser desactivado." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Porto UDP extendido do cliente:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "Este porto UDP é usado para pedidos Ed2K extendidos e rede Kad" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "desactivar" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Endereço de ligação" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "Porto UDP para pedidos de servidor extendidos (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Máximo de fontes por ficheiro" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Limite rígido" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Limites de conexão" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Máximo de conexões" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Universal Plug and Play" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "Activar UPnP" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "Porta TCP UPnP:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Auto-conectar ao início" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Reconectar ao perder conexão" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Exibir excesso de largura de banda" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Opções do servidor" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Remover servidores inactivos após" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "tentativas" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Actualizar a lista de servidores automaticamente no arranque" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Lista" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Actualizar a lista de servidores ao conectar" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Actualizar a lista de servidores quando um cliente conectar" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Usar sistema de prioridades" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Usar verificação inteligente de baixa identidade ao conectar" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Conexão segura" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Auto-conectar apenas aos servidores da lista estática" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Atribuir alta prioridade a servidores adicionados manualmente" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "M.C.I. activo" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICH confia em todas as chaves (não recomendado)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Adicionar ficheiros para transferir quando em pausa" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Adicionar ficheiros para transferir com prioridade automática" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Tentar transferir o primeiro e o último pedaços primeiro" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Adicionar novos ficheiros partilhados com prioridade automática" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Tentar transferir pedaços completos a todas as saídas" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "" +"Iniciar a transferência em pausa seguinte quando uma transferência terminar" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "Da mesma categoria" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "Salvar 10 fontes para ficheiros raros (< 20 fontes)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Espaço no disco" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Verificar espaço no disco" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "Seleccione se quiser que o aMule verifique o espaço no seu disco" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Espaço mínimo em disco:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Insira o espaço no disco mínimo desejado." + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Pasta de entrada :" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Pasta temporária :" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Pastas partilhadas" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "(Clique com o botão direito no ícone da pasta para partilha recursiva)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Partilhar ficheiros escondidos" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Leitor de vídeo" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "criar cópia de segurança antes de previsualizar" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Gráficos" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Atraso de actualização: 5 segundos" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Tempo para gráfico de média: 100 minutos" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Escala do gráfico de conexões: 100" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Seleccionar as cores das estatísticas" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Fundo" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Grelha" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Entrada actual" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Média corrente de entrada" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Média de entrada da sessão" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Saída actual" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Média corrente de saída" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Média de saída da sessão" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Conexões activas" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Barra de velocidade na bandeja do sistema" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Nós Kad corrente" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Nós Kad a executar" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Nós-Kad sessão" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Seleccionar" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Número de Versões de Cliente exibidas (0=ilimitado)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Notificações" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Notificações" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Usar som" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Notificar quando :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Nova entrada no registo" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Inicia uma nova conversa" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Uma nova mensagem é recebida" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Uma entrada é adicionada ou terminou" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Nova versão do aMule detectada" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "Urgente, conexão com o servidor perdida" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Notificar por correio electrónico" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Enviar um correio electrónico quando a transferência terminar." + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "Servidor SMTP :" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "Endereço de correio electrónico :" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! AVISO !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Não altere estas preferências, a menos que saiba\n" +"o que está a fazer, caso contrário, pode facilmente\n" +"fazer piorar a situação.\n" +"\n" +"O aMule correrá perfeitamente sem ajustar qualquer\n" +"uma destas opções." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Preferências avançadas" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Máximo de conexões novas / 5 segundos" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Tamanho da memória temporária de ficheiro: 240000 B" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Tam. Lista de espera Upload: 5000 clientes" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Intervalo refresc. ligação ao servidor: Desactivado" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "Ajustes da interface gráfica" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Progresso das entradas" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Mostrar a percentagem" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Mostrar barra de progresso" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Estilo da barra de progresso" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Plana" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Arredondada" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Suporte de temas" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Activar supporte de temas" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Tema:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- Nenhum tema esta disponivel" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Ordenação da coluna" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "" +"Ordenar automaticamente os ficheiros na fila de transferência (processador " +"rápido)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "" +"O aMule ordenará as colunas na sua lista de transferências automaticamente" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Ajustes de interface miscelâneos" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Mostrar a entrada rápida de ligações ED2k" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Mostrar informação extra nas abas de categorias" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Mostrar taxas de transferência no título" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Orientação da barra de ferramentas vertical" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Mostrar o número do ficheiro parcial antes do nome do ficheiro" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Controlo remoto" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Parâmetros do servidor HTTP" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Executar o servidor HTTP no arranque" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Porto do servidor HTTP" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "Activar a transferência de portas UPnP na porta do servidor" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Porta UPnP do servidor web" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Taxa de refrescamento (em segundos)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Permitir compressão Gzip" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Activar utilizador restricto" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Senha de controlo total" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Senha de controlo parcial" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Padrão web" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Parâmetros de conexão externa" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Aceitar conexões externas" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"IP da interface do servidor\n" +"(deixe em branco para qualquer um)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Insira um endereço IP válido no formato a.b.c.d para a interface EC ouvinte. " +"Um campo vazio ou 0.0.0.0 significará qualquer interface." + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "Porto TCP" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "Activar a transferência de portas UPnP na porta EC" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "Clique para aplicar as alterações efectuadas nas preferências." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Anular as alterações efectuadas nas preferências" + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Título :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Comentário :" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Pasta de entrada :" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Trocar prioridade nos novos ficheiros :" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Não trocar" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Seleccionar a cor para a categoria seleccionada :" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Exibir a mensagem do dia ao conectar ao servidor..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Informações do servidor" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Clique para limpar o registo." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "Registo" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "" +"Clique neste botão para actualizar a lista de servidores a partir do " +"endereço ..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Lista de Servidores" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Insira a localização de um ficheiro 'server.met' e pressione o botão à " +"esquerda para actualizar a lista de servidores conhecidos." + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Adicionar servidor manualmente : Nome" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Insira o nome do novo servidor" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Insira o IP do servidor, use o formato x.x.x.x." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Insira o porto do servidor." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "Adicionar manualmente um servidor (preencher os campos ao lado) ..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "Informação ED2K" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Informação Kad" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"O idioma seleccionado aparenta não estar instalada no seu sistema\n" +" Deve gerá-la para usar este idioma.\n" +"Um bom começo em sistemas Linux é o ficheiro '/etc/locale.gen' e o pacote " +"'locales'\n" +"Boa sorte!\n" +"(nota: tentar-se-á activá-la, de qualquer forma)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Não voltar a mostrar isto" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "" +"Clique neste botão para actualizar a lista de nós a partir do endereço ..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Nós (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"Insira o endereço de um ficheiro nodes.dat e pressione o botão à esquerda " +"para actualizar a lista de nós conhecidos." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Estados dos nós" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Inicialização" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Novo nó" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Porto:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Arrancar a partir de \n" +"clientes conhecidos" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Desconectar Kad" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Obfuscação do protocolo" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Supporte do Protocolo de Obfuscação" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"Esta opção activou a Obfuscação de Protocolo e faz com que o aMule aceite " +"ligações obfuscadas de outros clientes." + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Usar obfuscação para ligações para fora" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"Esta opção faz com que o aMule use a Obfuscação de Protocolo quando ligando " +"a outros clientes/servidores." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Aceitar apenas ligações obfuscadas" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"Esta opção faz com que o aMUle aceite apenas ligações obfuscadas. Terá menos " +"fontes, mas todo o tráfico será obfuscado" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Opções do ficheiro" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Todos" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Ninguém" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Quem pode ver os ficheiros partilhados:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "Seleccione quem pode pedir a lista dos seus ficheiros partilhados." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "Filtragem de IP" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Filtrar clientes" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Activar filtragem por IPs dos clientes definidos no ficheiro ~/.aMule/" +"ipfilter.dat" + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Filtrar servidores" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Activar filtragem da lista de IPs definia no ficheiro ~/.aMule/ipfilter.dat." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Recarregar a lista" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "" +"Recarregar a lista de IPs a filtrar a partir do ficheiro ~/.aMule/ipfilter." +"dat" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "Localização:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Actualizar agora" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Actualizar o filtro de IPs automaticamente no arranque" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Nível de filtragem:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Filtrar sempre endereços IP de rede local" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Tratamento paranóico de IPs sem correspondência" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Rejeitar pacotes se o IP do cliente é diferente do IP de onde o pacote é " +"recebido. Usar com cautela." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" +"Se não existir um ficheiro ipfilter.dat, permitir a utilização de um " +"ficheiro ipfilter global do sistema" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "(Des)activar" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Activar assinatura em-linha" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Activa a escrita do ficheiro do S.O., o qual pode ser usado por aplicações " +"externas para criar assinaturas e afins." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Frequência de actualização (segundos):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "" +"Alterar a frequência (em segundos) das actualizações de assinatura em linha." + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Pasta de assinatura em-linha:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" +"Clique para seleccionar a pasta que contém os ficheiros de assinatura em-" +"linha." + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "(Des)activar" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "Filtrar mensagens recebidas (excepto da conversa corrente):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Opções de filtragem:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Filtrar todas as mensagens" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "" +"Filtrar mensagens de utilizadores que não pertençam à sua lista de amigos" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Filtrar mensagens de clientes desconhecidos" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Filtrar mensagens que contenham (use ',' como separador):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"adicione as palavras que o aMule deve filtrar e bloquear as mensagens que as " +"contenham." + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Commentarios" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "Filtrar comentários contendo (usar ',' como separador):" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Activar o proxy" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Activar/desactivar o suporte de proxy" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Tipo de proxy:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "O tipo de proxy ao qual está a conectar-se" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Máquina proxy:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "O nome da máquina proxy" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Porto do proxy:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "O porto do proxy" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Autenticação" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Activar autenticação" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Activar/desactivar autenticação utilizador/senha" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "O nome de utilizador para conectar ao proxy" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Senha:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "A senha a usar para conectar ao proxy" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Conexão ao servidor automática sem proxy" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Conectado a:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Autenticação remota" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Nome do utilizador" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Lembrar as preferências" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Activar depuração e registo verbosos." + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "Categorias de mensagem:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "Adicionar importações" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Reassumir seleccionados" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Remover seleccionados" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Tipos de eventos" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Conectar a qualquer servidor e/ou Kad" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Nova categoria" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Seleccione uma pasta de destino para os ficheiros descarregados" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Deve especificar um nome para a categoria!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Deve especificar um caminho para a category!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"Erro ao criar pasta de entrada para categoria. Por favor, especifique um " +"caminho válido!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "Extensão '%s' desconhecida para o comando '%s'.\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "Comando '%s' desconhecido.\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"Este comando não pode ter um argumento.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"Este comando deve ter um argumento.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Este comando está incompleto, deve usar uma das extensões abaixo.\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Extensões disponíveis:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Comandos disponíveis:\n" + +#: src/ExternalConnector.cpp:188 +#, fuzzy, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"Todos os comandos consideram a capitalização das letras.\n" +"Escreva 'help ' para obter mais detalhes sobre .\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Sai do programa." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Exibir ajuda." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"Para obter ajuda num comando, escreva 'help '.\n" +"Para obter a lista completa de comandos escreva 'help'.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"Use '%s' para lista de comandos\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Erro de sintaxe!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Erro ao processar o comando - nunca deveria acontecer! Por favor, comunique " +"o erro\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Este comando não deveria ter quaisquer parâmetros." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Este comando deve ter um parâmetro." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Argumento inválido." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Este comando está incompleto." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Escreva '%s' para obter mais ajuda.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "Isto é %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "Isto é %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"A criar o cliente...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "A conexão falhou. Não é possível conectar à máquina especificada\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"OK, a sair %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"Não é possível conectar com uma palavra-chave vazia.\n" +"Deve especificar uma palavra-chave no ficheiro de configuração\n" +"ou na linha de comandos, ou insira uma quando lhe for pedida.\n" +"\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Mostra esta ajuda." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "Máquina onde o aMule está a ser executado. (predefinida: localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "Porto do aMule para conexão externa. (predefinido: 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Senha de conexão externa." + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Ler a configuração a partir do ficheiro." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "Não exibir qualquer mensagem para a saída padrão." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Verboso - mostrar também mensagens de depuração" + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Define a localização do programa (idioma)." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "" +"Escrever as opções da linha de comandos para o ficheiro de configuração." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "" +"Cria ficheiro de configuração baseado no ficheiro de configuração do aMule." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Exibir a versão do programa." + +#: src/ClientCreditsList.cpp:168 +#, fuzzy, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "Ficheiro de créditos carregado, %u clientes conhecidos" +msgstr[1] "Ficheiro de créditos carregado, %u clientes conhecidos" + +#: src/ClientCreditsList.cpp:171 +#, fuzzy, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] " - os créditos expiraram para %u clientes!" +msgstr[1] " - os créditos expiraram para %u clientes!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "Ficheiro 'cryptkey.dat' não encontrado, a criar." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"ERRO: o daemon do aMule não pode ser usado quando as ligações externas estão " +"desactivadas. Paraactivar as Ligações Externas, use um aMule normal, inicie " +"o amuled com a opção --ec-config ou mude a chave \"AcceptExternalConnections" +"\" para 1 no ficheiro ~/.aMule/amule.conf" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "ERRO: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Remover exclusão" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Exibir saídas" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Mostrar a lista de espera" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Exibir clientes" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Seleccione a vista" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Programa do cliente" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Aguardou" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Tempo de transferência (saída)" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Saída / Entrada" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Estado remoto" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "QR: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Prioridade do ficheiro" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Pontuação" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Pedidos" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Ultima vez visto" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Lista de Espera" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Estado de envio" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Enviado" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Estado das transferências" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Recebido" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Chave do utilizador" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Encriptado" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Esconder ficheiros partilhados" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Detalhes do cliente" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Não suportado" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Incompleto" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Pessoa má" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Verificado - OK" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Indisponível" + +#: src/ClientDetailDialog.cpp:190 +#, fuzzy, c-format +msgid "%u (QR: %u)" +msgstr "QR: %u" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" +"Tamanho mínimo tem de ser menor que o tamanho máximo. Tamanho máximo ignorado" + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Procurar aviso" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Ilimitado" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "Menu de bandeja do aMule" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Limites de Velocidade:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "Saída: Nada" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "Saída: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "Entrada: nenhum" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "Entrada: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Velocidade de Entrada: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Velocidade de Saida: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Informacao do cliente" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Alcunha: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "Nenhuma alcunha seleccionada!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "Identificador do cliente: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Nome do servidor: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "IP do servidor: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "Porto TCP: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "Porto TCP: Não pronto" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "Porto UDP: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "Porto UDP: Não pronto" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Assinatura em-linha: activada" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Assinatura em-linha: desactivada" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Ficehiros Partilhados: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Clientes em espera: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "Total de entrada: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "Total de saida: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Limite de saida" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Limite de entrada" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "Esconder" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "Mostrar" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "Sessão de Conversa Iniciada: %s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Conectado ao cliente ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** A conectar ao cliente ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Erro na conexão ao cliente / Conexão perdida ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Fechar a aba" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Fechar todas as abas" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Fechar as outras abas" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "A carregar o ficheiro server.met: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "Ficheiro server.met não encontrado!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" +"Falha ao carregar o ficheiro server.met '%s', formato desconhecido " +"encontrado." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "Falha ao abrir server.met!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"Ficheiro server.met corrompido, versão inválida encontrada: 0x%x, tamanho %i" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "Foram encontrados %i servidores no server.met" +msgstr[1] "Foram encontrados %i servidores no server.met" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "Adicionados %d servidores" +msgstr[1] "Adicionados %d servidores" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Servidor não adicionado: [%s:%d] não especifica um porto válido." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "Servidor não adicionado: O IP de [%s:%d] está filtrado ou é inválido." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" +"Servidor não adicionado: Servidor com IP:Porto correspondente [%s:%d] " +"encontrado na lista." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Servidor adicionado: Servidor em [%s:%d] a usar o nome '%s'." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"Está conectado ao servidor que está a tenta remover, por favor, desconecte " +"primeiro." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Falha ao gravar server.met!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "URL inválida" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Erro ao obter a lista de servidores a partir de %s" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"Não foi encontrado nenhuma lista de servidores em 'addresses.dat'. Por favor " +"adicionar um endereço correcto a este ficheiro para a auto-actualização " +"funcionar." + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" +"Aviso, lcoalização inválida especificada para a actualização automática de " +"servidores: %s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" +"Nenhuma localização server.met válida de obtenção automática em addresses-dat" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"Servidor local filtrado pelo Filtro de IPs, ligando a um servidor diferente!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "A execução do comando `%s' no evento `%s' falhou." + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"O seu idioma foi alterado para o valor predefinido do sistema devido a uma " +"mudança de configuração. Desculpe." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"Não tem nenhum servidor na lista de servidores.\n" +"Quer que o aMule descarrege uma lista nova agora?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Descarregar lista de servidores" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "servidor HTTP a executar com identificador de processo (PID) %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"Pediu para executar o servidor HTTP no arranque, mas o executável não pode " +"ser lançado. Por favor, instale o pacote que contém o servidor HTTP ou " +"compile o aMule com --enable-webserver e execute make install" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "O porto %u não está disponível. Ficará com baixa identidade\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"O porto %u não está disponível!\n" +"\n" +"Isso significa que ficará com baixa identidade.\n" +"\n" +"Verifique a sua rede para se certificar que o porto está aberto para leitura " +"e escrita." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Erro ao criar o ficheiro de assinatura em linha" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "Erro a criar o ficheiro de assinatura em linha do aMule" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"O idioma seleccionado parece não estar instalado no seu computador. (nota: " +"de qualquer forma, tentar-se-á activá-lo)." + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "Esta é a primeira vez que executa o aMule %s" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "Esta é uma versão de teste actualizada diariamente e\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "não há qualquer garantia de que não lhe causará danos,\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "mas, em princípio, deverá ser seguro usá-lo.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" +"As seguintes opções foram mudadas nesta distribuição por motivos de " +"segurança:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* Activado o suporte de Obfuscação de Protocolo para todas as ligações de " +"entrada e saída.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* Desactivado o update da lista de servidores de outros servidores e " +"clientes.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"Para mais informação acerca da razão para estas mudanças, procure\n" +"informação na wiki do aMule em http://wiki.amule.org for \"fake servers\"\n" +"É importante que remova todos os servidores falsos da sua lista para que o " +"aMule funcione correctamente." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "Mais informação, suporte e novos lançamentos na nossa página\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "em www.amule.org ou no canal de IRC #aMule em irc.freenode.net.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Sinta-se à vontade para comunicar erros em forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"A pasta especificada para ficheiros de assinatura em linha é INVÁLIDA!\n" +" Assinatura em linha será DESACTIVADA até que resolva a situação nas " +"preferências." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "ERRO: erro ao abrir o ficheiro de registo" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "AVISO: o ficheiro de registo está vazio. Algo está errado." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "O registo foi limpo" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "Mensagem do servidor: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Falha ao transferir a lista de nós." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Falha ao abrir o ficheiro de verificação de versão transferido" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Ficheiro de verificação de versão corrompido" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Está a usar uma versão antiga do aMule!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "A sua versão do aMule é %i.%i.%i e a última versão é %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "A última versão pode ser sempre encontrada em http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "" +"AVISO: A sua versao do aMuled está desactualizada: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "A sua cópia do aMule está actualizada." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Falha ao transferir o ficheiro de verificação de versão" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Conectado a %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "A conectar a %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Desconectado de ED2K" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad iniciado." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad parado." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Conectado a Kad (ok)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Conectado a Kad (protegido)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Desconectado de Kad" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"A rede Kad não pode ser usada se a porta UDP está desactivada nas " +"preferências, inicialização não efectuada." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Rede Kad desligada nas preferências, a ligação não será efectuada." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "" +"Erro ao abrir o ficheiro de lista de amigos 'emfriends.met' para leitura!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "" +"Erro ao abrir o ficheiro de lista de amigos 'emfriends.met' para escrita!" + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "Ainda não pode inicializar um ip específico do GUI remoto." + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "" +#~ "Ainda não é possível actualizar server.met a partir da interface gráfica " +#~ "remota." + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "Ler %u contactos Kad" +#~ msgstr[1] "Ler %u contactos Kad" + +#~ msgid "Disconnect from " +#~ msgstr "Desconectado de " + +#~ msgid "current server" +#~ msgstr "servidor actual" + +#~ msgid " and " +#~ msgstr " e " + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "Desligar de qualquer servido e/ou Kad" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "TCP Flags" +#~ msgstr "Funções TCP" + +#~ msgid "UDP Flags" +#~ msgstr "Funções UDP" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "Copiar a(s)lligação(ões) ED2k para a área de transferência" + +#~ msgid "Client requests %u" +#~ msgstr "Pedidos do cliente %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "Bloco do ficheiro %u-%u (%d bytes):" + +#~ msgid "Client request is invalid!" +#~ msgstr "Pedido do cliente é invalido!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "Pedido do cliente é invalido! %i / %i" + +#~ msgid "Command: %s" +#~ msgstr "Comando: %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "Não é possível abrir o ficheiro %s - a usar o ficheiro %s." + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "Aviso: known.met não existe" + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles: Remoção de %s da lista de directórios " +#~ "partilhados: Directório não foi encontrado." + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "A espera pelo fim do subprocesso falhou" + +#~ msgid "" +#~ "You cannot connect to a release version from an arbitrary CVS version! " +#~ "*sigh* possible crash prevented" +#~ msgstr "" +#~ "Não pode conectar a uma versão lançada de uma versão CVS arbitrária! * " +#~ "possível falha evitada" + +#~ msgid "doesn't work" +#~ msgstr "não funciona" + +#~ msgid "remote gui" +#~ msgstr "interface grafica remota" + +#~ msgid "" +#~ "Error: Failed to load backup file. Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Erro: falha ao carregar o ficheiro de salvaguarda. Procure em http://" +#~ "forum.amule.org por soluções encontradas para recuperação de ficheiros '." +#~ "part.met'." + +#~ msgid "" +#~ "Error: Backup part.met file is 0 size! Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Erro: O ficheiro de salvaguarda part.met está vazio! Procure em http://" +#~ "forum.amule.org por soluções de recuperação" + +#~ msgid "Error: part.met backup file is 0 size: %s ==> %s" +#~ msgstr "Erro: o ficheiro de salvaguarda de part.met está vazio: %s ==> %s" + +#~ msgid "" +#~ "Note: These values are\n" +#~ " only used for statistics." +#~ msgstr "" +#~ "Nota: estes valores são\n" +#~ " usados apenas para estatísticas." + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ " Programa p2p para todas as plataformas baseado no eMule \n" +#~ "\n" +#~ " Pagina web: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " Ajuda: http://wiki.amule.org \n" +#~ "\n" +#~ " Contacto: admin@amule.org (Assuntos administrativos) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Uma parte do aMule é baseado no \n" +#~ " Kademlia: Routing p2p baseado no metodo de calculo XOR\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "AVISO: recebeu baixa identidade!" + +#~ msgid "This command requieres an argument. Valid arguments: a file hash.\n" +#~ msgstr "" +#~ "Este commando requer um argumento. Argumentos validos: chave de " +#~ "ficheiro.\n" + +#~ msgid "Deprecated command, now 'Status'." +#~ msgstr "Comando obsoleto, agora 'Status'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Status' instead.\n" +#~ msgstr "" +#~ "Este comando está obsoleto e pode ser removido no futuro.\n" +#~ "Utilize 'Status'.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter'." +#~ msgstr "Comando obsoleto, agora 'Set IPFilter'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter' instead.\n" +#~ msgstr "" +#~ "Este comando está obsoleto e pode ser removido no futuro.\n" +#~ "Utilize 'Set IPFilter'.\n" + +#~ msgid "Deprecated command, now 'Get IPFilter Level'." +#~ msgstr "Comando obsoleto, agora 'Get IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Este comando está obsoleto e pode ser removido no futuro.\n" +#~ "Utilize 'Get IPFilter Level'.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter Level'." +#~ msgstr "Comando obsoleto, agora 'Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Este comando está obsoleto e pode ser removido no futuro.\n" +#~ "Utilize 'Set IPFilter Level'.\n" + +#~ msgid "Deprecated command, now 'Get/Set IPFilter Level'." +#~ msgstr "Comando obsoleto, agora 'Get/Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get/Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Este comando está obsoleto e pode ser removido no futuro.\n" +#~ "Utilize 'Get/Set IPFilter Level'.\n" + +#~ msgid "Deprecated command, now 'Show Servers'." +#~ msgstr "Comando obsoleto, agora 'Show Servers'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Show Servers' instead.\n" +#~ msgstr "" +#~ "Este comando está obsoleto e pode ser removido no futuro.\n" +#~ "Utilize 'Show Servers'.\n" + +#~ msgid "Deprecated command, now 'Get BwLimits'." +#~ msgstr "Comando obsoleto, agora 'Get BwLimits'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get BwLimits' instead.\n" +#~ msgstr "" +#~ "Este comando está obsoleto e pode ser removido no futuro.\n" +#~ "Utilize 'Get BwLimits'.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Up'." +#~ msgstr "Comando obsoleto, agora 'Set BwLimit Up'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Up' instead.\n" +#~ msgstr "" +#~ "Este comando está obsoleto e pode ser removido no futuro.\n" +#~ "Utilize 'Set BwLimit Up'.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Down'." +#~ msgstr "Comando obsoleto, agora 'Set BwLimit Down'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Down' instead.\n" +#~ msgstr "" +#~ "Este comando está obsoleto e pode ser removido no future.\n" +#~ "Utilize 'Set BwLimit Down'.\n" + +#~ msgid "Syncronization thread started." +#~ msgstr "Processo de sincronização iniciado." + +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "Chaves mestres dos ficheiros conhecidos foram carregados." + +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "Erro ao ler os contactos Kad - 0 entradas" + +#~ msgid "Merge attempt" +#~ msgstr "Tentativa de fusão" + +#~ msgid "Recursive merge" +#~ msgstr "Fusão recursiva" + +#~ msgid "Sucessful merge!" +#~ msgstr "Fusão foi um sucesso" + +#~ msgid "No merge possible" +#~ msgstr "Fusão não foi possível" + +#~ msgid "Buddy address: " +#~ msgstr "Endereço do Amigo: " + +#~ msgid "Allow usage of system wide ipfilter.dat" +#~ msgstr "Permitir a utilização de um ficheiro ipfilter.dat global do sistema" + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid " %d" +#~ msgstr " %d" + +#~ msgid ".%d" +#~ msgstr ".%d" + +#~ msgid "Shows the process of a search." +#~ msgstr "Mostra o progresso duma busca." + +#~ msgid "Shows the process of a search..\n" +#~ msgstr "Mostra o progresso duma busca..\n" + +#~ msgid "Search warning." +#~ msgstr "Aviso de pesquisa" + +#~ msgid "Client Identification:" +#~ msgstr "Identificação do cliente:" + +#~ msgid "Use Secure Identification" +#~ msgstr "Usar identificação segura" + +#~ msgid "" +#~ "Secure Identification uses a handshake approch to safely identify clients " +#~ "for use with the credit system." +#~ msgstr "" +#~ "Identificação segura usa uma abordagem de aperto de mão para " +#~ "identificar de forma segura os clientes de forma segura a usar com o " +#~ "sistema de créditos." + +#~ msgid "Sources Dropping" +#~ msgstr "Abdicação de fontes" + +#~ msgid "Source Dropping" +#~ msgstr "Abdicação de fontes" + +#~ msgid "Keep sources" +#~ msgstr "Guardar fontes" + +#~ msgid "Drop sources" +#~ msgstr "Largar fontes" + +#~ msgid "Send sources to any other file before dropping (High CPU)" +#~ msgstr "" +#~ "Enviar fontes para outro ficheiro antes de eliminar (bom processador)" + +#~ msgid "Sources with no needed file-parts." +#~ msgstr "Fontes com partes de ficheiros não necessárias" + +#~ msgid "Full Queue Sources Handling" +#~ msgstr "Tratamento de fontes com fila de espera cheia" + +#~ msgid "Enable auto drop Full Queue Sources" +#~ msgstr "Activar abdicação automática de fontes com fila de espera cheia" + +#~ msgid "High Queue Rating Sources Handling" +#~ msgstr "Tratamento de fontes com grande fila de espera" + +#~ msgid "Enable auto drop High Queue Rating Sources" +#~ msgstr "Activar abdicação automática de fontes com grande fila de espera" + +#~ msgid "High Queue Rating value" +#~ msgstr "Valor de grandeza de fila de espera" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(Mín. 300 / Máx. 3000)" + +#~ msgid "Auto Drop Sources Timer" +#~ msgstr "Temporizador de abdicação automática de fontes" + +#~ msgid "Timer (in secs)" +#~ msgstr "Temporizador (em segundos)" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(Min 60 / 3600 Max)" + +#~ msgid "Drop No Needed Sources now" +#~ msgstr "Descartar fontes desnecessárias" + +#~ msgid "Drop Full Queue Sources now" +#~ msgstr "Descartar fontes com fila de espera cheia" + +#~ msgid "Drop High Queue Rating Sources now" +#~ msgstr "Eliminar fontes com fila de espera grande" + +#~ msgid "Clean Up Sources now (NNS, FQS && HQRS)" +#~ msgstr "Limpar as fontes (NNS, FQS e HQRS)" + +#~ msgid "English (U.S.)" +#~ msgstr "Inglês (E.U.A.)" + +#~ msgid "Spanish (Mexican)" +#~ msgstr "Espanhol (México)" + +#~ msgid "" +#~ "ERROR: aMule daemon cannot be used when external connections are " +#~ "disabled. To enable External Connections, use either a normal aMule or " +#~ "set the key\"AcceptExternalConnections\" to 1 in the file ~/.aMule/amule." +#~ "conf" +#~ msgstr "" +#~ "ERRO: o servidor do aMule não pode ser usado quando conexões " +#~ "externas estão desactivadas. Para activar Conexões Externas, use " +#~ "o aMule normal ou defina a chave\"AcceptExternalConnections\" como 1 no " +#~ "ficheiro ~/.aMule/amule.conf" + +#~ msgid "Sources: %u" +#~ msgstr "Fontes: %u" + +#~ msgid "Feedback from: %s" +#~ msgstr "Resposta de: %s" + +#~ msgid "Client: aMule %s" +#~ msgstr "Cliente: aMule %s" + +#~ msgid "File Name: %s" +#~ msgstr "Nome Ficheiro: %s" + +#~ msgid "File size: %s" +#~ msgstr "Tamanho Ficheiro: %s" + +#~ msgid "Download: %s" +#~ msgstr "Transferência: %s" + +#~ msgid "Complete Sources: %u" +#~ msgstr "Fontes Completas: %u" + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2006 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ " Cliente 'Peer-to-Peer' (P2P) para todas as plataformas basedo no eMule \n" +#~ "\n" +#~ " Sítio Internet: http://www.amule.org \n" +#~ " Fórum: http://forum.amule.org \n" +#~ " Perguntas e Respostas: http://wiki.amule.org \n" +#~ "\n" +#~ " Contacto: admin@amule.org (questões administrativas) \n" +#~ " Copyright (C) 2003-2006 Equipa aMule \n" +#~ "\n" +#~ " Parte do aMule é baseado em \n" +#~ " Kademlia: Roteamento P2P baseado na métrica XOR.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "http://download.overnet2000.de/nodes.dat" +#~ msgstr "http://download.overnet2000.de/nodes.dat" + +#~ msgid "Copy ED2k link to clipboard (Hostname)" +#~ msgstr "Copiar link ED2k para o clipboard (Hostname)" + +#~ msgid "Session is not logged and request have no password\n" +#~ msgstr "" +#~ "A sessão não está completa e o pedido não tem palavra-" +#~ "chave\n" + +#~ msgid "Connecting to %s (%s - %s:%i)" +#~ msgstr "A conectar a %s (%s - %s:%i)" + +#~ msgid "Minimize to trayicon" +#~ msgstr "Minimizar para a bandeja do sistema" + +#~ msgid "" +#~ "Enabling this will make aMule minimize to the system-tray, rather than " +#~ "the taskbar." +#~ msgstr "" +#~ "Quando activado, o aMule é minimizado para a bandeja do sistema em " +#~ "vez da barra de tarefas." + +#~ msgid "Unable to open skin file: %s" +#~ msgstr "Não é possível abrir o ficheiro de tema: %s" + +#~ msgid "Browse skin file" +#~ msgstr "Procurar ficheiro de tema" + +#~ msgid "Use skin file to set aMule bitmaps." +#~ msgstr "Usar ficheiro de tema para definir as imagens do aMule." + +#~ msgid "Skin file:" +#~ msgstr "Ficheiro de tema:" + +#~ msgid "ExternalConn: adding ed2k link '%s'." +#~ msgstr "ExternalConn: a adicionar ligação ed2k '%s'." + +#~ msgid "Adds an ed2k link to core." +#~ msgstr "Adiciona uma ligação ed2k ao núcleo." + +#~ msgid "" +#~ "The ed2k link to be added can be:\n" +#~ "*) a file link (ed2k://|file|...), it will be added to the download " +#~ "queue,\n" +#~ "*) a server link (ed2k://|server|...), it will be added to the server " +#~ "list,\n" +#~ "*) or a serverlist link, in which case all servers in the list will be " +#~ "added to the\n" +#~ " server list.\n" +#~ msgstr "" +#~ "A ligação ed2k a ser adicionada pode ser:\n" +#~ "*) uma ligação de ficheiro (ed2k://|fich|...), irá para a " +#~ "fila de entrada,\n" +#~ "*) uma ligação de servidor (ed2k://|serv|...), irá para a " +#~ "lista de servidores,\n" +#~ "*) ou uma ligação de lista de servidores, em que todos os " +#~ "servidores na lista serão\n" +#~ " adicionados à lista de servidores.\n" + +#~ msgid "theApp.serverlist->GetServerByAddress() returned NULL" +#~ msgstr "theApp.serverlist->GetServerByAddress() retornou NULL" + +#~ msgid "IP of the listening interface (empty for any)" +#~ msgstr "Endereço IP da interface ouvinte (vazio para qualquer)" + +#~ msgid "Skin file name is empty - loading defaults" +#~ msgstr "" +#~ "O nome do ficheiro de tema é vazio - a carregar predefinições" + +#~ msgid "Skin file %s does not exist - loading defaults" +#~ msgstr "" +#~ "O ficheiro de tema %s não existe - a carregar as predefinições" + +#~ msgid "IPFilter is %s.\n" +#~ msgstr "O filtro de IPs está %s.\n" + +#~ msgid "Turn IP filtering on." +#~ msgstr "Activar filtros de IP." + +#~ msgid "Turn IP filtering off." +#~ msgstr "Desactivar filtros de IP." + +#~ msgid "Get IPFilter state." +#~ msgstr "Obter estado de filtragem de IP." + +#~ msgid "Enable IP-Filtering" +#~ msgstr "Activar filtragem de IP" + +#~ msgid "" +#~ "Enable filtering of the IPs defined in the file ~/.aMule/ipfilter.dat." +#~ msgstr "" +#~ "Activar a filtragem dos IPs definidos no ficheiro ~/.aMule/ipfilter.dat." + +#~ msgid "ED2K Link Handler" +#~ msgstr "Ligação eD2k (eDonkey 2000)" + +#~ msgid "Local Search" +#~ msgstr "Pesquisa local" + +#~ msgid "Global Search" +#~ msgstr "Pesquisa global" + +#~ msgid "FileHash (WWW)" +#~ msgstr "Chave de ficheiro" + +#~ msgid "Execute command on file completion" +#~ msgstr "Executar comando após completação" + +#~ msgid "Enable command execution" +#~ msgstr "Activar executação de comando" + +#~ msgid "Command:" +#~ msgstr "Comando:" + +#~ msgid "" +#~ "The following variables will be replaced by the\n" +#~ "values from the completed file:\n" +#~ " %FILE - The full path to the file.\n" +#~ " %HASH - The ED2k hash of the file." +#~ msgstr "" +#~ "As seguintes variáveis serão substituídas pelos\n" +#~ "valores do ficheiro completo:\n" +#~ " %FILE - O caminho completo para o ficheiro.\n" +#~ " %HASH - A chave ED2k do ficheiro." + +#~ msgid "Socks5" +#~ msgstr "Socks5" + +#~ msgid "Socks4" +#~ msgstr "Socks4" + +#~ msgid "Failed to execute on-completion command. Template is: %s" +#~ msgstr "Falha ao executar comando em completação. O molde é: %s" + +#~ msgid "WARNING: aMule is stopped !" +#~ msgstr "AVISO: o aMule está parado!" + +#~ msgid " is STOPPED !" +#~ msgstr " está PARADO!" + +#~ msgid "Index file not found: bad template\n" +#~ msgstr "Ficheiro de índice não encontrado: mau molde\n" + +#~ msgid "" +#~ "WARNING: A file with that name already exists, the file has been renamed" +#~ msgstr "" +#~ "AVISO: já existe um ficheiro com esse nome, o ficheiro foi renomeado" + +#~ msgid "WARNING: Failed to delete %s.seeds" +#~ msgstr "AVISO: Falha ao eliminar %s.seeds" + +#~ msgid "" +#~ "Downloaded:\n" +#~ "%s" +#~ msgstr "" +#~ "Transferido:\n" +#~ "%s" + +#~ msgid "\tStopped" +#~ msgstr "\tParado" + +#~ msgid "\tRemoved from shared" +#~ msgstr "\tRemovido das partilhas" + +#~ msgid "\tRemoved from download queue" +#~ msgstr "\tRemovido da file de entrada" + +#~ msgid "\tRemoved transferwnd" +#~ msgstr "\tRemovido transferwnd" + +#~ msgid "\tClosed" +#~ msgstr "\tFechado" + +#~ msgid "\tFailed to delete '%s'" +#~ msgstr "\tFalha ao eliminar '%s'" + +#~ msgid "\tRemoved .part.met" +#~ msgstr "\tRemovido .part.met" + +#~ msgid "Failed to delete '%s'" +#~ msgstr "Falha ao eliminar '%s'" + +#~ msgid "\tRemoved .part" +#~ msgstr "\tRemovido .part" + +#~ msgid "\tRemoved .BAK" +#~ msgstr "\tRemovido .BAK" + +#~ msgid "\tRemoved .seeds" +#~ msgstr "\tRemovido .seeds" + +#~ msgid "Done" +#~ msgstr "Terminado" + +#~ msgid "%s: Expected part-hash: %s" +#~ msgstr "%s: Chave de parte esperada: %s" + +#~ msgid "%s: Actual part-hash: %s" +#~ msgstr "%s: Chave de parte encontrada: %s" + +#~ msgid "Info not Available" +#~ msgstr "Informação Indisponível" + +#~ msgid "Hasher: Creating new thread." +#~ msgstr "Gerador: A criar novo processo leve." + +#~ msgid "Hasher: Signaling for remaining threads to terminate." +#~ msgstr "Gerador: A pedir aos processos leves restantes para terminar." + +#~ msgid "Hasher: No files on queue, stopping thread." +#~ msgstr "Gerador: Nenhum ficheiro em fila, a parar o processo leve." + +#~ msgid "Hasher: Starting to create MD4 and AICH hash for file: %s" +#~ msgstr "Gerador: A começar a criar chaves MD4 e AICH para ficheiro: %s" + +#~ msgid "Hasher: Starting to create MD4 hash for file: %s" +#~ msgstr "Gerador: A começar a criar chaves MD4 para ficheiro: %s" + +#~ msgid "Hasher: Finished hashing file: %s" +#~ msgstr "Gerador: Regeneração de chave terminada: %s" + +#~ msgid "Hasher: A thread has died." +#~ msgstr "Gerador: Morreu um processo leve." + +#~ msgid "Client %s on IP:Port %s:%d using %s" +#~ msgstr "Cliente %s no IP:Porto %s:%d usando %s" + +#~ msgid "You can't bootstrap from remote GUI yet." +#~ msgstr "" +#~ "Ainda não é possível arrancar a partir da interface " +#~ "gráfica remota." + +#~ msgid "aMule Tray Menu Info" +#~ msgstr "Informação do menu de bandeja do aMule" + +#~ msgid "Disconnect from server" +#~ msgstr "Desconectar do servidor" + +#~ msgid "Connect to any server" +#~ msgstr "Conectar com qualquer servidor" + +#~ msgid "aMule for Linux" +#~ msgstr "aMule para Linux" + +#~ msgid "Loading ipfilter.dat files." +#~ msgstr "A carregar ficheiros ipfilter.dat." + +#~ msgid "Your aMule version is %i.%i.%i and the latest version is %i.%i.%i" +#~ msgstr "" +#~ "A sua versão do aMule é a %i.%i.%i e a última versão " +#~ "é a %i.%i.%i" + +#~ msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %i.%i.%i\n" +#~ msgstr "" +#~ "AVISO: A sua versão do aMuled é antiga: %i.%i.%i < %i.%i.%i\n" + +#~ msgid "AICH Thread: Signaling for thread to terminate." +#~ msgstr "Processo leve AICH: A pedir o término do processo leve." + +#~ msgid "AICH Thread: Terminated." +#~ msgstr "Processo leve AICH: Terminado." + +#~ msgid "AICH Thread: Syncronization thread started." +#~ msgstr "" +#~ "Processo leve AICH: Processo leve de sincronização iniciado." + +#~ msgid "AICH Thread: Masterhashes of known files have been loaded." +#~ msgstr "Processo leve AICH: Carregadas chaves de ficheiros conhecidos." + +#~ msgid "AICH Thread: Starting to hash files. %li files found." +#~ msgstr "" +#~ "Processo leve AICH: A gerar chaves de ficheiros. %li ficheiros " +#~ "encontrados." + +#~ msgid "AICH Thread: Hashing file: %s, total files left: %li" +#~ msgstr "" +#~ "Processo leve AICH: A gerar chave de ficheiro: %s, ficheiros restantes: %" +#~ "li" + +#~ msgid "AICH Thread: Hashing completed." +#~ msgstr "Processo leve AICH: Geração de chaves completadas." + +#~ msgid "AICH Thread: No new files found." +#~ msgstr "Processo leve AICH: Nenhum ficheiro novo encontrado." + +#~ msgid "Desktop integration" +#~ msgstr "Integração com o ambiente de trabalho" + +#~ msgid "Get Razorback 2's stats for this file" +#~ msgstr "Obter as estatísticas de 'Razorback 2' para este ficheiro" + +#~ msgid "Copy ED2k link to clipboard (&HTML)" +#~ msgstr "" +#~ "Copiar ligação ED2k para a área de transferência (&HTML)" + +#~ msgid "" +#~ "For system tray integration to work,\n" +#~ "you must specify which desktop you are using.\n" +#~ "You can change this later from preferences." +#~ msgstr "" +#~ "Para que a integração com a bandeja do sistema funcione,\n" +#~ "é necessário especificar o seu ambiente de trabalho.\n" +#~ "Se necessário, pode alterar esta informação, mais tarde, nas " +#~ "preferências." + +#~ msgid "Gnome 2.x (or other XEMBED compatible)" +#~ msgstr "Gnome 2.x (ou outro compatível com XEMBED)" + +#~ msgid "KDE 3.x" +#~ msgstr "KDE 3.x" + +#~ msgid "KDE 2.x / Gnome 1.2 " +#~ msgstr "KDE 2.x / Gnome 1.2 " + +#~ msgid "No systray integration, please" +#~ msgstr "Sem integração com a bandeja do sistema" + +#~ msgid "Desktop" +#~ msgstr "Ambiente de trabalho" + +#~ msgid "Jugle (WWW)" +#~ msgstr "Jugle" + +#~ msgid "Downloadlist doubleclick to expand" +#~ msgstr "Duplo clique para expandir a lista de entradas" + +#~ msgid "" +#~ "If enabled, it is possible to display the sources associated with " +#~ "downloads by double-clicking on them." +#~ msgstr "" +#~ "Quando activado, é possível mostrar as fontes associadas com as " +#~ "transferências clicando duplamente nelas." + +#~ msgid "Select Window Manager" +#~ msgstr "Seleccionar o gestor de janelas" + +#~ msgid "" +#~ "Click here to select the type of systray integration you wish aMule to " +#~ "use." +#~ msgstr "" +#~ "Clique para seleccionar o tipo de bandeja de sistema que deseja que o " +#~ "aMule use." + +#~ msgid "Save 5 sources on rare files (< 20 sources)" +#~ msgstr "Gravar 5 fontes em ficheiros raros (<20 fontes)" + +#~ msgid "Default Permissions" +#~ msgstr "Permissões predefinidas" + +#~ msgid "Owner permissions, must at least be read/write'able." +#~ msgstr "Permissões do dono, deve ter, pelo menos, leitura e escrita." + +#~ msgid "Group permissions." +#~ msgstr "Permissões de grupo" + +#~ msgid "Other permissions." +#~ msgstr "Permissões para outros." + +#~ msgid "Copy ED2k link to clipboard (HTML)" +#~ msgstr "" +#~ "Copiar a ligação ED2k para a área de transferência (HTML)" + +#~ msgid "aMule is not connected! Cannot do search." +#~ msgstr "" +#~ "O aMule não está conectado! Não é possível pesquisar." + +#~ msgid "Language change will not be applied until aMule is restarted." +#~ msgstr "O Idioma será modificado após o aMule ser reiniciado." + +#~ msgid "Failed to open shared file (%s), rechecking list of shared files." +#~ msgstr "" +#~ "Erro ao abrir ficheiro partilhado (%s), a verificar a lista de ficheiros " +#~ "partilhados." + +#~ msgid "" +#~ "Impossible to make Kad search (invalid chars? keywords too short? not " +#~ "connected?)" +#~ msgstr "" +#~ "Não é possível efectuar pesquisa Kad (caracteres " +#~ "inválidos? palavras demasiado curtas? desconectado?)" + +#~ msgid "You are not connected to a server!" +#~ msgstr "Não há conexão!" + +#~ msgid "Search not possible" +#~ msgstr "Pesquisa não possível" + +#~ msgid "Client requests invalid %u " +#~ msgstr "O cliente pede inválido %u " + +#~ msgid "Connection to remote aMule is lost. Exiting now." +#~ msgstr "Conexão com aMule remoto perdida. A sair." + +#~ msgid "Error: connection lost" +#~ msgstr "Erro: conexão perdida" + +#~ msgid "Enter hostname or ip of the box running aMule" +#~ msgstr "" +#~ "Insira o nome da máquina ou endereço IP onde o aMule é " +#~ "executado" + +#~ msgid "Enter Hostname" +#~ msgstr "Insira o Nome da Máquina" + +#~ msgid "Enter port for aMule's External Connection" +#~ msgstr "Insira o porto para a Conexão Externa do aMule" + +#~ msgid "Enter Port" +#~ msgstr "Insira o Porto" + +#~ msgid "Enter password for mule connection" +#~ msgstr "Insira palavra-chave para a conexão" + +#~ msgid "Enter Password" +#~ msgstr "Insira a Palavra-Chave" + +#~ msgid "IO failure while loading '%s': %s" +#~ msgstr "Erro de entrada/saída ao carregar '%s': %s" + +#~ msgid "Error saving partfile's seeds file (%s - %s): %s" +#~ msgstr "" +#~ "Erro ao gravar o ficheiro de sementes de ficheiro de partes (%s - %s): %s" + +#~ msgid "IO failure while hashing downloaded part of partfile '%s'." +#~ msgstr "" +#~ "Erro de entrada/saída ao gerar a chave de parte transferida do " +#~ "ficheiro de partes '%s'." + +#~ msgid "EC Connection Failed. Unable to write data to the socket." +#~ msgstr "Falha de Conexão EC. Não foi possível enviar dados." + +#~ msgid "" +#~ "Temp dir is placed on a FAT32 partition. Disabling chmod to avoid useless " +#~ "warnings." +#~ msgstr "" +#~ "A pasta temporária situa-se numa partição FAT32. A desactivar " +#~ "o 'chmod' para evitar avisos inúteis." + +#~ msgid "" +#~ "Incoming dir is placed on a FAT32 partition. Disabling chmod to avoid " +#~ "useless warnings." +#~ msgstr "" +#~ "A pasta de entradas situa-se numa partition FAT32. A desactivar o 'chmod' " +#~ "para evitar avisos inúteis." + +#~ msgid "" +#~ "switch download list to clients you're downloading from, with files also " +#~ "(some day)" +#~ msgstr "" +#~ "mudar a lista de entradas para clientes de onde esteja a receber, " +#~ "também com ficheiros (um dia)" + +#~ msgid "Client TCP Port:" +#~ msgstr "Porto TCP do cliente:" + +#~ msgid "Client UDP port: 4665" +#~ msgstr "Porto UDP do cliente: 4665" + +#~ msgid "eMule extended UDP Port:" +#~ msgstr "Porto UDP extendido do eMule:" + +#~ msgid "Extract Meta Data Tags" +#~ msgstr "Extrair meta-elementos de dados" + +#~ msgid "Reduce Fragmentation" +#~ msgstr "Reduzir a fragmentação" + +#~ msgid "Allocate full chunks for .part files" +#~ msgstr "Reservar pedaços inteiros para os ficheiros de partes" + +#~ msgid "" +#~ "Select this to allocate a full chunk each time data is received for it." +#~ msgstr "" +#~ "Seleccione para reservar um pedaço inteiro cada vez que forem " +#~ "recebidos dados." + +#~ msgid "Allocate full disk space for .part files" +#~ msgstr "Reservar espaço de disco inteiro para os ficheiros de partes" + +#~ msgid "" +#~ "This option reduces fragmentation but slows down the part file creation " +#~ "and will disable sparse files" +#~ msgstr "" +#~ "Esta opção reduz a fragmentação mas atrasa a criaçÃÂÂ" +#~ "£o do ficheiro de partes e desactivará ficheiros dispersos" + +#~ msgid " Min Disk Space: " +#~ msgstr " Espaço no disco mínimo: " + +#~ msgid "Nodes list" +#~ msgstr "Lista de nós" + +#~ msgid "" +#~ "Enter the url to a nodes.dat file here and press the button to the left " +#~ "to update the list of known servers." +#~ msgstr "" +#~ "Insira o endereço dum ficheiro nodes.dat e pressione o botão " +#~ "à esquerda para actualizar a lista de servidores conhecidos." + +#~ msgid "SharedFiles" +#~ msgstr "Ficheiros partilhados" + +#~ msgid "Invalid EC packet received" +#~ msgstr "Recebido pacote EC inválido" + +#~ msgid "ExternalConn: invalid opcode received: %i" +#~ msgstr "ExternalConn: instrução inválida recebida: %i" diff --git a/po/quot.sed b/po/quot.sed new file mode 100644 index 00000000..0122c463 --- /dev/null +++ b/po/quot.sed @@ -0,0 +1,6 @@ +s/"\([^"]*\)"/“\1”/g +s/`\([^`']*\)'/‘\1’/g +s/ '\([^`']*\)' / ‘\1’ /g +s/ '\([^`']*\)'$/ ‘\1’/g +s/^'\([^`']*\)' /‘\1’ /g +s/“”/""/g diff --git a/po/remove-potcdate.sin b/po/remove-potcdate.sin new file mode 100644 index 00000000..2436c49e --- /dev/null +++ b/po/remove-potcdate.sin @@ -0,0 +1,19 @@ +# Sed script that remove the POT-Creation-Date line in the header entry +# from a POT file. +# +# The distinction between the first and the following occurrences of the +# pattern is achieved by looking at the hold space. +/^"POT-Creation-Date: .*"$/{ +x +# Test if the hold space is empty. +s/P/P/ +ta +# Yes it was empty. First occurrence. Remove the line. +g +d +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 00000000..40eb7f73 --- /dev/null +++ b/po/ru.po @@ -0,0 +1,7490 @@ +# translation of amule_2007-08-29.po to Русский +# aMule project source code strings for i18n. +# This file is distributed under the same license as the aMule package. +# +# +# Nick Shaforostoff , 2005. +# Konstantin , 2005. +# toshi , 2006. +# Ivan Nazimov , 2007. +msgid "" +msgstr "" +"Project-Id-Version: amule_2007-08-29\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2007-09-03 00:17+0300\n" +"Last-Translator: Dmitry \n" +"Language-Team: Русский\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Russian\n" +"X-Poedit-Country: RUSSIAN FEDERATION\n" +"X-Poedit-SourceCharset: utf-8\n" +"X-Generator: KBabel 1.11.4\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Вы должны указать не пустой пароль." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Неверный пароль. Не MD5 хеш!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Подключение не удалось" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "ВС-соединение не удалось. Получен пустой ответ." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "Внешнее подключение: Отказано в доступе: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "Внешнее соединение: отказано в доступе" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "Внешнее соединение: недопустимый ответ сервера. Соединение закрыто." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Успешное подключение к aMule " + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Соединение установлено." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Хешируется" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Завершается" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Завершён" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Приостановлен" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Ошибочный" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Загружается" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Ожидает" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Начинаю создавать MD4 и AICH хеши для файла: %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Начинаю создавать MD4-хеш для файла: %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Начинаю создавать AICH-хеш для файла: %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "Конвертирую старые AICH хеши из '%s' в 64b в '%s'" + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "ПРЕДУПРЕЖДЕНИЕ: Имя файла '%s' - неверно и было изменено на '%s'." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "ПРЕДУПРЕЖДЕНИЕ: Файл '%s' уже существует. Новый файл назван '%s'." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" +"ПРЕДУПРЕЖДЕНИЕ: не удалось удалить оригинал '%s' после создания резервной " +"копии." + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "ПРЕДУПРЕЖДЕНИЕ: не удалось удалить %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Не удалось получить список доступных файлов от '%s'" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Неизвестны" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (Поддельная версия eMule %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (имитация eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (имитация eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (основанна на eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Псевдоним: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "Запросы:" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Статистика для текущего сеанса: принято %d из %d запросов, %s передано\n" +msgstr[1] "" +"Статистика для текущего сеанса: принято %d из %d запросов, %s передано\n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Статистика для всех сеансов: принято %d из %d запросов, %s передано\n" +msgstr[1] "" +"Статистика для всех сеансов: принято %d из %d запросов, %s передано\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Запрошен неизвестный файл" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "Клиент %s на IP:порт %s:%d используя %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Имя пользователя" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Друзья" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Показать &подробности" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Добавить в друзья" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Удалить из друзей" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Послать &сообщение" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Просмотр файлов" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Создать слот для друга" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Вы уверены, что хотите удалить выбранных друзей из списка?" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Вы уверены, что хотите удалить выбранных друзей из списка?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Отменить" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"Вы не можете устанавливать более одного слота для друзей.\n" +" Только один слот был создан." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Множественный выбор" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Имя файла" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Размер" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Тип" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Приоритет" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "FileID" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Запросов" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Принятых запросов" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Передано данных" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Коэффициент передачи" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Полученные части" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Полных источников" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Каталог" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Публикуемые файлы" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Очень низкий" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Низкий" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Нормальный" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Высокий" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Очень высокий" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Релиз" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Авто" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Добавить комментарий/рейтинг" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Редактировать комментарий/рейтинг" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Переименовать" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Добавить файлы коллекции в список для закачки" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Скопировать magnet &URI в буфер обмена" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Скопировать ed2k-&ссылку в буфер обмена" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Скопировать ed2k-ссылку в буфер обмена (&источник)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "" +"Скопировать ed2k-ссылку в буфер обмена (источник) (использовать опции " +"&шифрования)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Скопировать ed2k-ссылку в буфер обмена (&Имя хоста)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" +"Скопировать ed2k-ссылку в буфер обмена (Имя хоста) (использовать опции " +"&шифрования)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Скопировать ed2k-ссылку в буфер обмена (AICH инфо)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Скопировать доп. информацию в буфер обмена" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "Для создания ссылки на источник требуется HighID" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Предупреждение" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Публикуемые файлы (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[частично]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Введите новое имя файла:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Переименовать файл" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Возобновляется отдача файла: %s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Приостанавливается отдача файла: %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kad: слово запроса лишком коротоко" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Ошибка: не удалось открыть TCP порт." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "Запрос не удался из-за следующей ошибки: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "Запрос не удался - неизвестная ошибка." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "Индексный файл не найден:" + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Не удалось создать поток веб-сокета\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Веб-сервер: запущен\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Сессия просрочена - запрашиваю логин\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Сессия в порядке, авторизован\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Сессия в порядке, не авторизован\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Нет открытых сессий - буду запрашивать логин\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Сессия открыта - запрашиваю логин\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Обрабатываю запрос [исходный]:" + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Проверяю пароль\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Хеш пароля неверен\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Пароль верен\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Неверный пароль\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "Вы не ввели пароль. Пустой пароль недопустим.\n" + +# в eMule - так и пишут: логин/логаут, но мне не нравится +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Запрошено отсоединение:\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Обрабатываю запрос [перенаправленный]:" + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Загрузить шаблон " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "HTTP порт web-сервера" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Использовать UPnP для порта веб-сервера" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "UPnP-порт" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Использовать gzip-сжатие" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Привилегированный пароль для веб-сервера" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Пароль ограниченного доступа" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Позволять ограниченный доступ" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Запрещать ограниченный доступ" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "Загружать/сохранять настройки веб-сервера c/на удалённый aMule" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "Путь к файл конфигурации aMule. НЕ ИСПОЛЬЗУЙТЕ ПРЯМОЙ ПУТЬ!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "Отключить PHP (не рекомендуется)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Компилировать PHP-страницы при каждом запросе" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "Веб-сервер aMule" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Недоступен" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Никогда" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Принимается..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Настройки" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "Каталог, содержащий файл amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Открыть" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Введите путь к вашему файлу amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Интервал обновления в секундах" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Генерировать картинку со статистикой после каждого события обновления" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "" +"Укажите здесь каталог, в который вы хотите сохранять картинку со статистикой" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Периодическая загрузка картинки со статистикой на FTP сервер" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "FTP Url" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "FTP путь" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Введите здесь адрес вашего FTP сервера" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" +"Введите здесь путь для сохранения картинки со статистикой на FTP сервере" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Пользователь" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Пароль" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Введите здесь имя пользователя для вашего FTP сервера" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Введите здесь пароль для вашего FTP сервера" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "Интервал обновления через FTP в минутах" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Проверить" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Каталог, в котором хранится файл-подпись" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Каталог, в котором будет сохранятся картинка со статистикой" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i дней %i часов %i минут %i секунд" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, модуль статистики aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Добро пожаловать!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Максимальная скорость загрузки за время работы wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "Абсолютная максимальная скорость загрузки за время работы wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Сбросить" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "Система" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Остановить автоматическое обновление" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Сохранить картинку со статистикой" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Распечатать картинку со статистикой" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Настройки" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "О модуле wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Начать авто обновление" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Автоматическое обновление остановлено" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Автоматическое обновление начато" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Сохранить картинку со статистикой" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Обработчик для этого типа файла не предусмотрен." + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "Не удалось сохранить" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "Онлайн-статистика" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Проблема с печатью.\n" +"Возможно принтер неправильно установлен." + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Печать" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, aMule модуль OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Основано на CAS, написанным Pedro de Oliveira \n" +"\n" +"Лицензия - GPL" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Ох-ох... aMule то не запущен..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule запущен" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule запущен, но не подключен" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule подключается..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Ох, ох, статус aMule неизвестен..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " работает " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " остановлен!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " не подключен!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " подключается..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " делает что-то непонятное, проверьте!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " подключен к " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "ok" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "за брандмауэром" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "отключен" + +# stands for $User is on $server +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " на " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +#, fuzzy +msgid " with " +msgstr "] с " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Всего принято: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Передано: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Принято за сеанс: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Приём: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s, Передача: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "кБ/сек" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr " " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr "файлов, клиентов в очереди: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Время:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f КБ/с" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " на " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Системная загрузка (за 1-5-15 мин): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Время работы системы: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uд %02uч %02uмин %02uс" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uч %02uмин %02uс" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02uмин %02uс" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02uс" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "HighID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "LowID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Не подключен" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "Отменено!" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Не удалось открыть %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "Файл %s слишком велик для сети Donkey: максимальный размер - 4 ГБ." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Параметры ввода" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Файл для хеширования" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Добавьте возможные URL для этого файла" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Введите здесь имя файла, для которого вы хотите составить ed2k-ссылку" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Введите здесь URL, который вы хотите добавить в Ed2k-ссылку: Добавьте / в " +"конце, чтобы aLinkCreator добавил имя файла" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Добавить" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Удалить" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Очистить" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Создать ссылку с хешами частей" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Помогите распространить новые и редкие файлы быстрее, за счет увеличения " +"размера ссылки" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "Хеш MD4" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "Хеш ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "Ссылка ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Начать" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Сохранить" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Скопировать в буфер обмена" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Выйти" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Открыть файл для расчёта его ed2k-ссылки" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Скопировать ed2k ссылку в буфер обмена" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Сохранить вычисленные ed2k-ссылки в файл" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "О программе aLinkCreator" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Выберите файл, для которого вам нужно создать ed2k ссылку" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "Сейчас нечего копировать!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Выберите файл для вашей ed2k ссылке" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Невозможно открыть " + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Пожалуйста, введите не пустое имя файла" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "Сейчас нечего сохранять!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, генератор ed2k-ссылок для aMule\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Графика с http://www.everaldo.com, http://www.icomania.com\n" +"и http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Лицензия - GPL" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Идёт хеширование..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Выполнено за %.2f s" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "Этот URL уже добавлен !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Введите URL" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "Обрабатывается файл под номером %u: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "Вы запросили частичные хеши (используется только для файлов > 9.5 MБ)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Пожалуйста, подождите... " + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> Файл не существует !\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, генератор ссылок ed2k для aMule" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Авто [Низк]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Авто [Норм]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Авто [Выс]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Идёт подключение" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Запрос" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Соединение через сервер" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Очередь заполнена" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "В очереди" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Передача" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Получение контрольных сумм" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Нет нужных частей" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Клиенты с LowID не могут подключаться один к одному" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Слишком много соединений" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Подключение Kad" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Слишком много соединений Kad" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Заблокированы" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Ошибка подключения" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Удаленная очередь полна" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "Старый MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "Новый MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "Совместимый с eMule" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Локальный сервер" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Удаленный сервер" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Обмен источниками" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Пассивный" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Ссылка" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Системный" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Арабский" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Баскский" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Болгарский" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Каталонский" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Китайский (упрощенный)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Китайский (традиционный)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Хорватский" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Датский" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Голландский" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Английский (Великобритания)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Эстонский" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Финский" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Французский" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Гальский" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Немецкий" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Венгерский" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Итальянский" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Итальянский (Швеция)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Корейский" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Польский" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Португальский" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Португальский (Бразилия)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Русский" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Словакский" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Испанский" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Турецкий" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Не удалось найти выбранный броузер!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "TCP порт не может быть выше 65532, так как UDP сокет - TCP+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Используется пот по умолчанию (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Имя сервера" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Адрес" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Порт" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Описание" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Пользователей" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Файлы" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Сбоев" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Статический" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Версия" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Вы соединены с сервером, который вы пытаетесь удалить. Сначала нужно " +"отключиться от него. Сервер НЕ удален." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Сведения" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(Неизвестное имя)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Вы уверены, что хотите удалить сервер %s из статического списка " + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Да" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Нет" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Невозможно открыть %s" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Серверов (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Сервер" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Подключиться к серверу" + +#: src/ServerListCtrl.cpp:428 +#, fuzzy +msgid "Mark server as static" +msgstr "Внести в список статических серверов" + +#: src/ServerListCtrl.cpp:429 +#, fuzzy +msgid "Mark server as non-static" +msgstr "Удалить из списка статических серверов" + +#: src/ServerListCtrl.cpp:431 +#, fuzzy +msgid "Mark servers as static" +msgstr "Внести в список статических серверов" + +#: src/ServerListCtrl.cpp:432 +#, fuzzy +msgid "Mark servers as non-static" +msgstr "Удалить из списка статических серверов" + +#: src/ServerListCtrl.cpp:438 +#, fuzzy +msgid "Remove server" +msgstr "Удалить выбранные" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "Удалить выбранные" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Удалить все сервера" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Скопировать ed2k-ссылку в буфер обмена" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "Скопировать ed2k-ссылку в буфер обмена" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Восстановить соединение с сервером" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Вы уверены, что хотите удалить все сервера?" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Вы уверены, что хотите удалить выбранные сервера?" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Вы уверены, что хотите удалить выбранные сервера?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Отключено [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "aMule %s (основан на eMule)." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "Работает на %s" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "Посетите http://www.amule.org для проверки наличия новой версии." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Фатальная ошибка: не удалось создать таймер" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "Удалённое управление aMule" + +# Used only in CVS! +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Версия CVS:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr "" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr "" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Сообщение" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Статус" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "Идёт подключение" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "Отключен" + +#: src/amuleDlg.cpp:676 +#, fuzzy +msgid "Kad: Firewalled" +msgstr "За брандмауэром" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "Подключен" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "Идёт подключение" + +#: src/amuleDlg.cpp:689 +#, fuzzy +msgid "Kad: Off" +msgstr " Kad: " + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "Останавливает попытки соединения" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Отключиться" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "Отключиться от сети." + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Подключиться" + +#: src/amuleDlg.cpp:726 +#, fuzzy +msgid "Connect to the currently enabled networks" +msgstr "Подключиться к сети." + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Передача: %.1f(%.1f) | Приём: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Передача: %.1f | Приём: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | Подключен)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | Отключен)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Вы действительно хотите выйти из aMule?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Подтверждение выхода" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Невозможно определить команду для запуска обозревателя." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "Каталог с темами оформления '%s' не существует." + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "Предупреждение: Невозможно открыть файл темы '%s' на чтение" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Сети" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Окно сетей" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Поиск" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Окно поиска" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Передачи" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Окно передач" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Окно публикуемых файлов" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Сообщения" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Сообщения" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Статистика" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Статистика" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Окно настроек клиента" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Импорт" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "Инструмент импортирования частично загруженных файлов (part files)" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "О программе" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "О программе" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Общие" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Соединение" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Прокси" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Фильтр сообщений" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Удалённый контроль" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Online-подпись" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Каталоги" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Безопасность" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "Внешний вид" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Настройки ядра" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "События" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Отладчик" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Другой" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"Необходимо перезапустить aMule чтобы следующие изменения вступили в силу:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- изменен порт TCP.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- изменен порт UDP.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"Список автоматического обновления серверов пуст.\n" +"Автоматическое обновление серверов при запуске будет отключено." + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"Вы включили внешние соединения, но не указали пароль.\n" +"Внешние соединения нельзя включить до тех пор, пока не указан пароль." + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- Изменен язык.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- Изменен временный каталог.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Передача: 0.0 | Приём: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"Обе сети, и ED2K и Kad выключены.\n" +"Вы не сможете подключиться, пока не включите хотя бы одну." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"Kad не будет запущена, если UDP-порт выключен.\n" +"Включите UDP-порт или выключите Kad." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"Вам НЕОБХОДИМО перезапустить aMule немедленно.\n" +"Иначе не жалуйтесь, если произойдет какая-нибудь неприятность.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "ПРЕДУПРЕЖДЕНИЕ" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"Ваш список авто обновления серверов пуст.\n" +"Пожалуйста, внесите в список хотя бы один URL, указывающий на корректный " +"'server.met'.\n" +"Щёлкните на кнопке \"Список\" чтобы ввести URL." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "Временные файлы" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Входящие файлы" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Online-подписи" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Выберите каталог для %s" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Выбрать wav" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "Файл wav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Выбрать видео-проигрыватель" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Выберите броузер" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Команда запуска%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Редактировать список серверов" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Впишите сюда адреса для получения файлов 'server.met'.\n" +"Только один URL в одной строчке." + +#: src/PrefsUnifiedDlg.cpp:980 +#, fuzzy, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Интервал обновления: %d сек" +msgstr[1] "Интервал обновления: %d сек" + +#: src/PrefsUnifiedDlg.cpp:987 +#, fuzzy, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Отрезок времени, охватывающийся графиком: %d минут" +msgstr[1] "Отрезок времени, охватывающийся графиком: %d минут" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Масштаб графика соединений: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, fuzzy, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Интервал обновления: %d секунд" +msgstr[1] "Интервал обновления: %d секунд" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, fuzzy, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Размер буфера: %d байт" +msgstr[1] "Размер буфера: %d байт" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, fuzzy, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Размер очереди отдачи: %d клиентов" +msgstr[1] "Размер очереди отдачи: %d клиентов" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, fuzzy, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Интервал обновления соединения с сервером: %d минут" +msgstr[1] "Интервал обновления соединения с сервером: %d минут" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Обновление соединения с сервером: Отключено" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Выполнить команду при событии '%s'" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Включить выполнение команд в ядре" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Команда ядра:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Включить выполнение команд в ГИП" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "Команда ГИП:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "Следующие переменные будут заменены:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Попытка неавторизированного доступа. Соединение разорвано." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Внешнее соединение закрыто." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "Внешние соединения выключены из-за отсутствия пароля." + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "Внешние соединения выключены в конфигурационном файле" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Принято новое внешнее соединение" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "Ошибка: не удалось принять новое внешнее соединение" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "Отказано во внешнем соединении из-за пустого пароля" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "Соединение с клиентом: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Неизвестная версия" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"Неверный идентификатор версии ВС. Возможна бинарная несовместимость. " +"Используйте ядро и компонент удаленного доступа одинаковой версии." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "Ошибка идентификации." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Недопустимая версия протокола." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Тег версии протокола отсутствует." + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Неверный запрос, сначала пройдите идентификацию." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Доступ получен." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "Удаленная команда PartFile не удалась: хеш файла не найден: %s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "Хеш файла не найден: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "Ошибка при выполнении OpCode." + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Сервер не добавлен" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "сервер не найден: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "необходимо выделить сервер для удаления" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "ED2K выключена в настройках." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "Поиск запущен. Ждите результатов." + +# Explained by Jacobo221. +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "При удаленном использовании aMule WWW поиск бесполезен." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad выключена в настройках." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "В графике нет точек." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "Ваш клиент не настроен на этот уровень детализации." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "Внешнее соединение: запрос на выключение" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Уже завершаю работу." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "ExternalConn: добавляю ссылку '%s'." + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Ссылка неверна, или уже в списке." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "Файл не найден." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Неверное имя файла." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Невозможно переименовать файл." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Уже подключен к ED2K." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Подключаюсь к ED2K..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Уже подключен к Kad." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Подключаюсь к Kad..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Все сети выключены." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Отключен от ED2K" + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Отключен от Kad." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "ExternalConn: получен неверный opcode: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "Неверный opcode (Возможно, не та версия протокола)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "Не удалось открыть файл (%s), удаляю из списка публикуемых файлов." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "Запрошен набор хешей для неизвестного файла: %s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "Команда `%s' с pid `%d' завершилась с кодом статуса `%d'." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "Сервер не был добавлен: не указан адрес сервера." + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "Сервер не был добавлен: указан неверный порт сервера." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "Статус ED2K:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Подключен" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Порт" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Статус Kademlia:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Выполняется" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Статус:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Отключен" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Состояние соединения:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "За брандмауэром" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "ОК" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Состояние брандмауэра:" + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Соединен с другом" + +#: src/ServerWnd.cpp:224 +#, fuzzy +msgid "No buddy" +msgstr "Не друг" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Пользователей в среднем:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "Файлов в среднем:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "Не запущен" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Время работы: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Передача" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Отдача" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Передано за сеанс (всего): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Служебный трафик (пакеты): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Трафик запросов (пакеты): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "Трафик обмена источниками (пакеты): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Трафик с сервером (пакеты): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Служебный трафик Kad (пакеты): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Активные отдачи: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Ожидающие отдачи: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Всего успешных сессий отдачи: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Всего неудачных сессий отдачи: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Среднее время отдачи: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Загрузки" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Принято за сеанс (всего): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Найдено источников: %s" + +# chunk, конечно, никакой не пакет.... но фиг знает +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Активных загрузок (фрагменты файлов): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Соотношение UL:DL (всего): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Средн. скорость загрузки (за сессию): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Средн. скорость отдачи (за сессию): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Макс. скорость загрузки (за сессию): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Макс. скорость отдачи (за сессию): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Пересоединений: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Прошло после первой передачи: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "Время подключения к серверу: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Активных соединений (примерно): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Достигнуто макс. число соединений: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Соединений в среднем (прибл.): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Максимальное число соединений (примерно): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Клиенты" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Отфильтрованы" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Всего: %i Известно: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Сервера" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Работающих серверов: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Сбойных серверов: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Всего: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Удаленных серверов: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Отфильтрованных серверов: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Пользователей на работающих серверах: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "Файлов на работающих серверах: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Всего пользователей: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "Всего файлов: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Загруженность сервера: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Число публикуемых файлов: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Общий размер публикуемых файлов: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Средний размер файла: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "LowID: %u (%.2f%% Всего %.2f%% Известно)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "Безопасная идентификация Вкл/Выкл: %u (%.2f%%) : %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Операционная система" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "Не получено" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Вырезать" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Копировать" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Вставить" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Выделить все" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "Невозможно осуществить поиск через Kad если Кад не запущен" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "Неворзможно осуществить поиск через ED2K если нет соединения с ED2K" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Ошибка при поиске через Kad: " + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "Отфильтрованное сообщение от '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "Новое сообщение от '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "Пользователь %s (%u) запросил список публикуемых файлов -> Принято" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "Пользователь %s (%u) запросил список публикуемых файлов -> Отказано" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "Пользователь %s (%u) запросил список публикуемых папок -> Принято" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "Пользователь %s (%u) запросил список публикуемых папок -> Отказано" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"Пользователь %s (%u) запросил список публикуемых каталогов из каталога %s -> " +"Принято" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"Пользователь %s (%u) запросил список публикуемых каталогов из каталога %s -> " +"Отказано" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "Пользователь %s (%u) сделал доступной каталог %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "Пользователь %s (%u) отправил незапрошенный список публикуемых папок." + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" +"Пользователь %s (%u) отправил список публикуемых каталогов из каталога %s" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "Пользователь %s (%u) закончил передачу списка публикуемых файлов." + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "" +"Пользователь %s (%u) отправил список публикуемых файлов, который не нужен." + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" +"Пользователь %s (%u) отказал в доступе к списку публикуемых файлов/папок" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Узлы (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "Неверный IP для инициализации" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Неверный порт для инициализации" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Пожалуйста, заполните все необходимые поля" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Вы уверены что хотите загрузить новый файл nodes.dat?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "Это удалит используемые в данный момент узлы и перезапустит Kademlia." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Продолжить?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Ошибка: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Предупреждение: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Добавить в друзья" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Вы должны ввести правильный IP-адрес и порт." + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Информация" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "Указанный хеш пользователя недопустим." + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Источники" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Файл" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Загрузить" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Категория" + +# It's about default category to download to. +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Основная" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Загрузить в категории" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "Искать похожие файлы (ED2K, локальный сервер)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Подключиться к удалённому aMule" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Попытка подключиться не удалась " + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Ошибка" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"Предупреждение: Вы не можете добавить себя как источник для ed2k ссылки под " +"низким ID." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Пользователей: E: %s K: %s | Файлов E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Все" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Всего пользователей: %s | Всего файлов: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Передано" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Завершён" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Скорость" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Выполнено" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Состояние" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Осталось времени" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Последний раз файл был доступен полностью" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Последнее получение данных" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Вы уверены, что хотите удалить выделенные файлы?" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Вы уверены, что хотите удалить выделенные файлы?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Послать сообщение пользователю" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Сообщение:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Остановить" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Пауза" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Возобновить" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "&Очистить завершённые" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Использовать все A4AF источники для этого файла" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Использовать все A4AF источники для этого файла (авто)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Отдать все A4AF источники этого файла другим файлам" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Дополнительные настройки" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Предварительный просмотр" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Показать &подробности" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Показать все комментарии" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Скопировать magnet URI в буфер обмена" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "отменить категорию" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Присвоить категорию" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "&Открыть файл" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Удалить из списка друзей" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Добавить в список друзей" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Отправить сообщение" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Переключить на этот файл" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "кБ/сек" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "QR: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Запрошен другой файл" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Загрузки (%i)" + +#: src/DownloadListCtrl.cpp:2222 +#, fuzzy +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"Пожалуйста, укажите в настройках используемый Вами видео-проигрыватель.\n" +"Без этого aMule будет пытаться использовать 'mplayer' и вы будете получать " +"данное предупреждение при каждой попытке предварительного просмотра" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Предварительный просмотр" + +#: src/DownloadListCtrl.cpp:2260 +#, fuzzy, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "ОШИБКА: невозможно запустить видео-проигрыватель." + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "Ошибка: невозможно открыть part-файл)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "Ошибка: невозможно создать part-файл)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "Попытка загрузки резервной копии файла '.met' из %s" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "Ошибка: невозможно открыть файл 'part.met': %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "Ошибка: размер файла 'part.met' - 0: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "Ошибка: неверная версия файла 'part.met': %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "Ошибка: %s (%s) повреждён, невозможно загрузить файл" + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "Попытка восстановления информации о файле..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" +"Восстановление безымянного файла - попытка восстановить его как " +"'RecoveredFile.dat'" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" +"Восстановлена вся возможная информация о файлах ;-))) Попытаемся ее " +"использовать..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Не удалось восстановить информацию о файлах :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Не удалось открыть %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "Предупреждение: %s вероятно повреждён (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "Ошибка сохранения part-файла: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "Файл '%s' имеет размер в ноль байт - используется %s." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "Не удалось сохранить файл 'part.met.seeds' для %s" + +#: src/PartFile.cpp:1019 +#, fuzzy, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "Сохранено %i источников для файла %s (%s)" +msgstr[1] "Сохранено %i источников для файла %s (%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "Файл %s (%s) не имеет сохранённых источников" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "Файл %s (%s) не имеет сохранённых источников" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "Ошибка при чтении источников частично загруженного файла (%s - %s): %s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, fuzzy, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"Найдена испорченная часть (%d) в %d частях файла %s - FileResultHash |%s| " +"FileHash |%s|" +msgstr[1] "" +"Найдена испорченная часть (%d) в %d частях файла %s - FileResultHash |%s| " +"FileHash |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "Найдена завершённая часть (%i) в %s" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "Завершено повторное хеширование %s" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "Неожиданная ошибка во время завершения %s. Пауза" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Загрузка завершена: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "Удаление файла: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" +"Предупреждение: Невозможно хешировать загруженную часть - неполная " +"контрольная сумма для '%s'" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"Ошибка: Невозможно хешировать загруженную часть - контрольная сумма неполная " +"(%s). Так быть не должно." + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "" +"ПРЕДУПРЕЖДЕНИЕ: не достаточно свободного места на диске. Файл приостановлен: " +"%s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "Загруженная часть %i повреждена: %s" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH: Восстановлена повреждённая часть %i для %s -> Выигрыш: %s Б" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Недостаточно места на диске" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Остановлен" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "Предупреждение: невозможно открыть файл known.met." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" +"Предупреждение: Список известных файлов поврежден - неверный заголовок." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "Ошибка ввода/вывода при чтении файла known.met: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "Ошибка при сохранении файла known.met: %s" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "Найдено %i известных публикуемых файлов." +msgstr[1] "Найдено %i известных публикуемых файлов." + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "Найдено %i известных публикуемых файлов, %i неизвестных." +msgstr[1] "Найдено %i известных публикуемых файлов, %i неизвестных." + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "Ошибка! Попытка публикации %s" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Комментарии к файлам" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Рейтинг" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Комментарий" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Нет комментариев" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "комментариев: %s" +msgstr[1] "комментариев: %s" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"Не могу соединиться ни с одним завуалированным сервером в списке. Пробую ещё " +"раз, но без вуалирования." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "Не удалось соединиться ни с одним указанным сервером. Еще один заход." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "Сеть ED2K выключена в настройках. Не устанавливаю соединение." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "Ни одного действительного сервера для соединения в списке не найдено." + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Подключен к %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Установлено соединение с: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "Ошибка во время соединения. Возможно нет соединения с Интернет." + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Утеряно соединение с %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) вероятно умер." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) вероятно заполнен." + +#: src/ServerConnect.cpp:391 +#, fuzzy, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "" +"Автоматическое соединение с сервером будет предпринято через %d секунд" +msgstr[1] "" +"Автоматическое соединение с сервером будет предпринято через %d секунд" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Соединение утрачено" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "Подключение к %s (%s:%i) завершилось ошибкой." + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "Ошибка: неверный сокет по истечении времени ожидания" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "Время ожидания соединения с %s (%s:%i) вышло." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Частично загруженных файлов не найдено" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "Найдено %u частей файлов" +msgstr[1] "Найдено %u частей файлов" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Приём %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Вы уже загружаете файл '%s'" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "У вас уже есть файл '%s'" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Вы уже пытаетесь загрузить файл %s" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "Не могу конвертировать magnet-ссылку в ed2k-ссылку: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "Неизвестный протокол ссылки: %s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Неправильная ed2k-ссылка. Ошибка: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "Выполнить и выйти." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Неверный формат IP-адреса. Пример: xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +#, fuzzy +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" +"Этой команде требуется аргумент. Доступные аргументы: 'all' или число.\n" + +#: src/TextClient.cpp:343 +#, fuzzy +msgid "Processing by hash: " +msgstr "Обрабатывается файл под номером %u: %s" + +#: src/TextClient.cpp:358 +#, fuzzy +msgid "Processing by filename: " +msgstr "Обрабатывается файл под номером %u: %s" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Недопустимое число\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "Недопустимый хеш (длина должна быть равна 32 символам)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "Операция выполнена успешно." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "Запрос не удался: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "IP-фильтрация клиентов: %s\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "ВЫКЛ" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "ВКЛ" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "IP-фильтрация серверов: %s\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "Текущий уровень IP-фильтра: %d.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Ограничения скорости: Передача: %u КБ/с, Приём: %u КБ/с.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Подключен с %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "LowID" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "HighID" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Идёт подключение" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Отсоединен" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Закачка:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Отдача:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Клиентов в очереди:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Всего источников:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Число результатов поиска: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "СДЕЛАТЬ - отобразить прогресс поиска" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Получен неверный ответ сервера, OpCode = %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Показать краткую информацию о статусе." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "" +"Показать состояние соединения, такущие скорости отдачи/закачки, и т.д.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Показать полную статистику." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"Дополнительно этой команде в качестве аргумента может быть передано число от " +"0 до 255,\n" +"которое указывает сколько версий клиентов должно быть показано.\n" +"0 или пустое значение отключает ограничение.\n" +"\n" +"Пример: 'statistics 5' покажет только пять наиболее частых номеров версий " +"каждого клиента .\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "Остановить aMule." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Остановить удаленный aMule (amule/amuled).\n" +"Это также остановит текстовый клиент, так как он не может\n" +"функционировать без действующего ядра aMule.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Обновляет данный объект." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "Обновляет список публикуемых файлов." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "Обновляет IP фильтр из файла." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Подключиться к сети." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"Соединяет со всеми сетями, включенными в настройках\n" +"Также Вы можете указать адрес сервера, к которому надо\n" +"подключиться, в форме IP:Порт. В поле IP вводится либо сетевой адрес вида x." +"x.x.x,\n" +"либо доменное имя." + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Подключиться только к ED2K." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Подключиться только к Kad." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Отключиться от сети." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "Это отключит от всех подсоединенных сетей.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Отсоединиться от ED2K." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Отсоединиться от Kad." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Добавляет ED2K или magnet-ссылку." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"ED2K-ссылка, которую надо добавить может быть:\n" +"*) ссылкой на файл (ed2k://|file|...), и будет добавлена в очередь " +"загрузки,\n" +"*) ссылкой на сервер (ed2k://|server|...), и будет добавлена в список " +"серверов,\n" +"*) ссылкой на список серверов, и тогда все серверы из этого списка будутn " +"добавлены в ваш список серверов.\n" +"\n" +"magnet-ссылка должна содержать хеш ED2K и длину файла.\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Установить значение параметра." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "Установить настройки IPFilter." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "Включить IP-фильтрацию для клиентов и серверов." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "Выключить IP-фильтрацию для клиентов и серверов." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "Включить/выключить IP-фильтрацию для клиентов." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "Включить IP-фильтрацию для клиентов." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "Выключить IP-фильтрацию для клиентов." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "Включить/выключить IP-фильтрацию для серверов." + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "Включить IP-фильтрацию для серверов." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "Выключить IP-фильтрацию для серверов." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "Выбирите уровень IP фильтрации." + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"Допустимые уровни фильтрации находятся в диапазоне 0-255,\n" +"значением по умолчанию является 127.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Укажите пределы канала." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "Значения тут указываются в кб/сек (килобайтах в секунду).\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Укажите ограничение скорости по даче." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "Укажите ограничение скорости по закачке." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Получить и отобразить значение параметра." + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "Получить параметры IPFilter." + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "Получить состояние IPFilter для клиентов и серверов." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "Получить состояние IPFilter только для клиентов." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "Получить состояние IPFilter только для серверов." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "Получить уровень IPFilter." + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Получить ограничения полосы пропускания." + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Выполняет поиск." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"Необходимо указать тип поиска с помощью следующих значений:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Пример: 'search kad file' выполнит поиск в Kad файла \"file\".\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Выполняет глобальный поиск" + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Выполняет локальный поиск" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Выполняет поиск в Kad" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Показывает результат последнего поиска." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Возвращает результат предыдущего поиска.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Начать загрузку файла." + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"Должен быть указан номер файла из последнего поиска.\n" +"Пример: 'download 12' запустит загрузку файла номер 12 из последнего " +"поиска.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Приостановить закачку." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Продолжить закачку." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Отменить закачку." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Установить приоритет загрузки." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "" +"Установить для загрузки низкий, нормальный, высокий или автоматический " +"приоритет.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "Установить низкий приоритет." + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "Установить нормальный приоритет." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "Установить высокий приоритет." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "Установить авто-приоритет." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Показать очереди/списки." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Показывает очереди на закачку/отдачу, список серверов или публикуемых " +"файлов.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Показать очередь на отдачу." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Показать очередь на закачку." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Показать журнал." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Показать список серверов." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Очистить журнал." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() returned NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "Ошибка: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "Предупреждение: %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Новый ID клиента %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "" +"\tСкорее всего это из-за того, что вы находитесь за брандмауэром или " +"маршрутизатором." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tДля подробностей, обратитесь к http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "Получена неизвестная информация о сервере. - слишком коротко" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "Получено %d новых серверов" +msgstr[1] "Получено %d новых серверов" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Сохранение списка серверов завершено." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "Сервер отклонил последнюю команду" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Подложный пакет получен от сервера: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "Неизвестная ошибка при обработке пакета от сервера: %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "Невозможно создать поток разрешения DNS для соединения с %s" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "IP адрес сервера %s (%s) запрещен фильтром. Соединение отменено." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "использую вуалирование протокола." + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "Установка соединения с %s (%s - %s:%i) %s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "Не удалось разрешить DNS для сервера %s: Невозможно подключиться." + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "CIP2Country::CIP2Country(): Не удалось загрузить данные о стране" + +#: src/IP2Country.cpp:73 +#, fuzzy, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "Загружено %d карт флагов." +msgstr[1] "Загружено %d карт флагов." + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "Вы уверены, что хотите отменить и удалить все файлы в этой категории?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Требуется подтверждение" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Все остальные" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Незавершенные" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Активный" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Видео" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Аудио" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Архив" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "CD-образ" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Изображение" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Текст" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Выбрать фильтр просмотра" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Добавить категорию" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Редакировать категорию" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Удалить категорию" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "Импортируется %s: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "Чтение из временного каталога" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "Извлекаю основную информацию из информационного файла загрузки" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "Создаю целевой файл" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "Загружаю данные из старого файла загрузки (%u из %u)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "Сохраняю данные в новый монолитный файл загрузки (%u из %u)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "Добавляю загрузку и сохраняю новый частично закачанный файл" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Получение информации о состоянии..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "В процессе" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Ошибка: нет места на диске" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Ошибка: partmet не найден" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Ошибка: ошибка ввода/вывода" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Ошибка: неудача!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "В очереди" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Уже скачивается" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Неизвестный или нарушенный формат временного файла." + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Имя файла" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Состояние" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Хеш файла" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Импорт частично загруженных файлов" + +# Полностью лучше не переводить - это титул небольшого диалога. +# Если перевести полностью - будет маленький, но широоооокий диалог :) +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "Укажите каталог для поиска незавершенных загрузок." + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "Вы хотите, чтобы исходные файлы импортированных закачек были удалены?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Удалить исходные файлы?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Ожидание..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (Диск: %s)" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "байт" +msgstr[1] "байт" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "КБ" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "МБ" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "ГБ" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "ТБ" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "к" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "М" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "Г" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "Т" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "байт/сек" +msgstr[1] "байт/сек" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "МБ/с" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "секунд" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "минут" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "часов" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "Дней" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Видео" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Архив" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Текст" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Программа" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Любой" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Без оценки" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Ошибочный / Повреждённый / Фальшивка" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Плохой" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Очень хороший" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Хороший" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Великолепный" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "все" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "все остальные" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "Загружаю IP-фильтры 'ipfilter.dat' и 'ipfilter_static.dat'." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "Не удалось загрузить ipfilter.dat файл '%s', формат файла неизвестен." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "Не удалось загрузить ipfilter.dat файл '%s', не удалось открыть файл." + +#: src/IPFilter.cpp:330 +#, fuzzy, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +"Загружено %u IP-диапазонов из '%s'. %u испорченных строк было пропущено." +msgstr[1] "" +"Загружено %u IP-диапазонов из '%s'. %u испорченных строк было пропущено." + +#: src/IPFilter.cpp:332 +#, fuzzy, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +"Загружено %u IP-диапазонов из '%s'. %u испорченных строк было пропущено." +msgstr[1] "" +"Загружено %u IP-диапазонов из '%s'. %u испорченных строк было пропущено." + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Активные соединения (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Детали файла" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% готово" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "ED2k-ссылка:" + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Добавить" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "Кликните тут, чтобы добавить ed2k-ссылку в очередь на загрузку." + +# это тултип для кнопульки в левом нижнем углу +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "Показать статус." + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Загружается..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"Тут отображаются события. Для полного списка событий, обратитесь к журналу в " +"окне \"Сети\"." + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Количество пользователей на сервере, к которым вы подключены..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Пользователей: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" +"Пользователи, подключенные к данному серверу и оценка общего количества " +"пользователей." + +# Тултип. Лучше оставить как можно более коротким (не все системы автоматом делают их многострочными ;-)) +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"Входящая и исходящая усредненные скорости. Значения в скобках (если " +"включены), отображают служебный трафик (трафик связи между клиентами)." + +# Тултип. Лучше оставить как можно более коротким (не все системы автоматом делают их многострочными ;-)) +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"Статус соединения. Красная стрелка - нет соединения, жёлтая - LowID (вы за " +"маршрутизатором или брандмауэром), зелёная - HighID (оптимальный вариант)." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Не подключен..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Подключен к серверу." + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Поиск" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Имя:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Локальный" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Глобальный" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "По хешу" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Дополнительные параметры" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Фильтрация" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Тип файла" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Расширение" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Мин. размер" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Байт" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "КБ" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Макс. размер" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Доступность" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Фильтр:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Фильтровать результаты" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Инвертировать" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Скрывать известные файлы" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Дополнительно" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "Находит больше результатов в ED2K. В Kad пока не поддерживается." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Остановить" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Сбросить значения" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Результаты" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Очистить результаты" + +# Неточно, но соответствует тому, что делает кнопка +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Отдача/Очередь/Клиенты" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Клиентов в очереди:" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Отправить" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Отправить данное сообщение." + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Закрыть" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Закрыть данный чат." + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Полное имя :" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "N/A" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "Файл met:" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Хеш:" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Размер файла:" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Статус:" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Последний раз полный файл был доступен :" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Найдено источников:" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Передающие источники:" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Число частей:" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Доступно:" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Скорость передачи:" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Время активности закачки:" + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Передано:" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Завершено:" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "I.C.H. (интеллектуальная обработка повреждений)" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Потери из-за повреждений :" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Выигрыш сжатия:" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "Экономия пакетов I.C.H. :" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Имя файла" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Выбрать" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Очистить" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Применить" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Ok" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "Комментарий/Оценка файла (Текст будет доступен всем пользователям)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"Например, для фильма вы можете указать его длительность, сюжет, язык...\n" +"Если это - фальшивка, вы можете сообщить об этом остальным пользователям " +"aMule." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Качество файла" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "Выберите оценку файлу, или сообщите пользователям, что это - утка..." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Нет комментариев" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Обновить" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Идет загрузка, подождите..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Неизвестный размер" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Обязательная информация" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "IP адрес :" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Порт :" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Дополнительная информация" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Имя пользователя :" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Хеш пользователя :" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Обновить список публикуемых файлов" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Текущий сеанс" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Всего" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Запрошено:" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Активных загрузок: " + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Скорость приёма" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Текущая" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Средняя за все время" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "В среднем за сеанс" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Скорость отдачи" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Соединения" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Активные загрузки" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Активные соединения (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Активные передачи" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Дерево статистики" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Имя пользователя:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Хеш пользователя:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Клиентское ПО:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Версия клиентского ПО:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "IP адрес:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "ID пользователя:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "IP сервера:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Имя сервера:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "Передача" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Текущий запрос:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Средняя скорость отдачи:" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Средняя скорость приёма:" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Передано (сеанс):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Принято (этот сеанс):" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Передано всего:" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Принято всего:" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Счёт" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "Модификатор DL/UP:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Безопасная идентификация:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Рейтинг (всего):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Счёт на передачу:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Общие настройки" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Псевдоним" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - the Linux Mule" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "Это имя, которое будет показано пользователям, подключающимся к вам." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Язык" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "Выберите язык интерфейса." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Прочие параметры" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Проверка наличия новой версии при запуске" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "При запуске aMule будет проверено наличие новой версии" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Сворачиваться при запуске" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "Сразу после запуска aMule будет минимизирован в область уведомлений." + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Подтверждение при выходе" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "Подтверждение на закрытие aMule." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Значок в области уведомлений" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "Эта опция включает/выключает значок в области уведомлений" + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "Сворачивать в область уведомлений" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "Сворачивать aMule в область уведомлений, а не в панель задач." + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Задержка контекстных подсказок в секундах" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "Задержка отображения контекстных подсказок (как эта) в секундах." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Выбор браузера" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Выберите браузер" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Команда вызова браузера:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Введите здесь имя браузера. Чтобы использовать другой браузер, выберите " +"'Свой браузер' из выпадающего меню чуть выше." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Открывать в новой вкладке" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" +"Открывать веб-страницы в новой вкладке, а не в отдельном окне, если это " +"возможно" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Ограничения скорости" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Отдача" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Слот" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Пропускная способность линии" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Стандартный TCP-порт клиента:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "Это стандартный порт ED2k, и он не может быть выключен." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Дополнительный UDP-порт клиента:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" +"Этот UDP-порт используется для дополнительных запросов ED2K и сети Kad." + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "выключить" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Локальный адрес" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "UDP-порт для расширенных запросов сервера (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Макс. количество источников на файл" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Жёсткое ограничение" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Ограничение количества соединений" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Макс. соединений" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Универсальный Plug and Play" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "Включить UPnP" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "UPnP TCP-порт:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Соединяться автоматически после запуска" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Восстановить соединение в случае разрыва" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Показывать служебный трафик" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Настройки сервера" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Удалить нерабочий сервер после" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "попыток" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Автоматическое обновление списка серверов при запуске" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Список" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Обновление списка серверов при соединении с сервером" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Обновление списка серверов при соединении с клиентами" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Использовать систему приоритетов" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Проверка на LowID при подключении к серверу" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Безопасное подключение" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Автоподключение только к статическим серверам" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Высокий приоритет серверов, добавленных вручную" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "I.C.M. включено" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICH доверяет всем хешам (не рекомендуется)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Добавлять файлы на загрузку в режиме паузы" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Добавлять файлы в загрузку с авто приоритетом" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Пытаться сначала загрузить первую и последнюю части" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Добавлять новые файлы для публикации с авто приоритетом" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Пытаться передать полные части всем клиентам" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Снимать с паузы файл при завершении загрузки другого" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "Из той же категории" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "Оставлять 10 источников для редких файлов (<20 источников)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Место на диске" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Проверять место на диске" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "" +"Включите, если вы хотите, чтобы aMule проверял наличие свободного места на " +"диске." + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Мин. дисковое пространство:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Введите здесь минимальное количество свободного места на диске." + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Входящие файлы:" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Временный каталог:" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Каталоги с публикуемыми файлами" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "" +"(кликните правой кнопкой на значке каталога для рекурсивной публикации)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Включая скрытые файлы" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Видео-проигрыватель" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Создать резервную копию для просмотра" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Графики" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Интервал обновления: 5 сек" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Время для среднестатического графика: 100 минут" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Масштаб графика соединений: 100 " + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Выберите цвета для статистики" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Фон" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Сетка" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Загрузить текущий" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Средняя общая загрузка" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Средняя загрузка за сеанс" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Текущая отдача" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Средняя общая отдача" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Средняя отдача за сеанс" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Активные соединения" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Скорость передачи в области уведомлений" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Узлы Kad (текущие)" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Узлы Kad (действующие)" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Узлы Kad (сессия)" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Выбрать" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Число отображаемых версий клиентов (0=неогр.)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Уведомления" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Всплывающие окна" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Включить звуки" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Уведомлять при :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Новая запись в журнал" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Начат новый чат" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Получено новое сообщение" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Добавлена или завершена загрузка" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Обнаружена новая версия aMule" + +# OOD - Out Of Delivery +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Уведомление по e-mail" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Послать email, когда загрузка завершена" + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "SMTP сервер :" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "E-mail:" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! ВНИМАНИЕ !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Не изменяйте следующие настройки до тех пор, пока\n" +"вы не будете абсолютно не уверены в том, что вы делаете,\n" +"в противном случае может случиться непоправимое.\n" +"\n" +"aMule будет превосходно работать и БЕЗ ИЗМЕНЕНИЯ вами\n" +"этих настроек." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Дополнительные настройки" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Предел количества новых соединений за 5 секунд" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Размер буфера: 240000 байт" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Размер очереди: 5000 клиентов" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Интервал обновления соединения с сервером: Отключено" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "Внешний вид" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Индикатор процесса загрузки файлов" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Показывать процентное значение" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Показывать полосу выполнения" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Стиль полоски процесса" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Плоская" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Круглая" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Скины" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Включить поддержку тем оформления" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Тема:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- темы не установлены -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Сортировка колонок" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "Автосортировка в списке загрузок (большая нагрузка на процессор)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "aMule будет сортировать файлы в списке загрузок автоматически." + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Прочие настройки" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Показывать поле для ed2k-ссылок" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Показывать дополнительную информацию на закладках категорий" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Выводить скорость передачи в заголовке" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Вертикальное расположение панели инструментов" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Отображать номер частично закачанного файла перед именем" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Удалённый контроль" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Параметры web-сервера" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Запуск 'amuleweb' при загрузке aMule" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Порт web-сервера" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "Использовать UPnP для порта веб-сервера" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "UPnP -порт веб-сервера:" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Период обновления страницы (в секундах)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Включить сжатие Gzip" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Допустить не привилегированных пользователей" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Пароль для привилегированного доступа" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Пароль ограниченного доступа" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Веб-шаблон" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Параметры внешних соединений" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Принимать внешние соединения" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"IP целевого интерфейса\n" +"(оставьте пустым для любого)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Введите сюда актуальный IP в формате a.b.c.d для целевого интерфейса ВС. " +"Пустое поле или значение 0.0.0.0 означают любой интерфейс." + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "TCP-порт" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "Включить UPnP для порта ВС" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "Кликните тут, чтобы сохранить внесенные вами изменения." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Сбросить все изменения, внесенные вами." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Заголовок :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Комментарий :" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Каталог загрузок:" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Установить приоритет для новых файлов:" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Не изменять" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Выбрать цвет для этой категории:" + +# MOTD - Message Of The Day +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Показывать \"сообщение дня\" с сервера при подключении..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Сообщение сервера" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Кликните тут для очистки журнала." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "Журнал aMule" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "Кликните здесь чтобы обновить список серверов через URL ..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Список серверов" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Введите URL к файлу 'server.met' сервера и нажмите кнопку слева для " +"обновления списка известных файлов." + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Ручное добавление сервера: Имя" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Введите имя нового сервера" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Введите здесь IP-адрес сервера в формате: x.x.x.x" + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Введите здесь порт сервера." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "Добавить сервер (предварительно заполнив поля слева) ..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "Инфо ED2K" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Инфо Kad" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"Возможно, что выбранная вами локаль не установлена на вашей системе.\n" +"Вам нужно сгенерировать её, чтобы использовать данный язык.\n" +"Проверьте файл '/etc/locale.gen' и пакет 'locales'.\n" +"Удачи! ;-)\n" +"(и всё же будет произведена попытка включить эту локаль)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Не выводить это сообщение в будущем" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "Нажмите на эту кнопку чтобы обновить список узлов из URL..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Узлы (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"Ведите сюда URL к файлу nodes.dat и нажмите кнопку слева чтобы обновить " +"список известных узлов." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Статистика узлов" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Подключиться" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Новый узел" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Порт:" + +# Похоже, bootstrap в eMule перевели как инициализация +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Инициализация от \n" +"известных клиентов" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Отключить Kad" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Вуалирование протокола" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Поддержка вуалирования протокола" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"Включает вуалирование протокола и позволяет aMule принимать завуалированные " +"соединения от других клиентов." + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Использовать вуалирование исходящих соединений" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"Включает вуалирование протокола при соединении с другими клиентами и " +"серверами." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Принимать только завуалированные соединения" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"aMule будет принимать только завуалированные соединения. У вас будет меньше " +"источников, но зато весь трафик будет завуалирован." + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Настройки файлов" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Всем" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Никому" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Кому показывать публикуемые файлы:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "Выберите, кому показывать список ваших файлов." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "Фильтрование IP" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Фильтровать клиентов." + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Включает фильтрацию IP клиентов в соответствии с файлом ~/.aMule/ipfilter." +"dat." + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Фильтровать сервера" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Включает фильтрацию IP серверов в соответствии с файлом ~/.aMule/ipfilter." +"dat." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Обновить список" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "Прочесть список IP адресов, указанных в файле '~/.aMule/ipfilter.dat'." + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Обновить сейчас" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Автоматически обновлять IP-фильтр при запуске" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Уровень фильтрации:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Всегда фильтровать IP-адреса LAN" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Параноидная обработка несовпадающих IP " + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Отбрасывает пакеты у которых IP клиента отличается от IP с которого пришел " +"пакет. Используйте осторожно." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Включить/Выключить" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Включить Online-подпись" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Включает запись файла OS, который может использоваться другими приложениями " +"для создания подписей." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Частота обновления (в секундах):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "Изменить частоту обновления для Online-подписи в секундах." + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Каталог Online-подписи:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "Кликните здесь, чтобы выбрать каталок для файлов Online-подписи." + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Отключить/Включить" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "Фильтровать входящие сообщения (кроме текущего чата):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "настройки фильтра:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Фильтровать все сообщения" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Фильтровать сообщения пользователей не из вашего списка друзей" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Фильтровать сообщения от неизвестных клиентов" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Фильтровать сообщения по содержанию (используйте ',' как разделитель):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"Добавьте сюда ключевые слова, при наличии которых aMule будет " +"отфильтровывать и блокировать входящие сообщения." + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Комментарии" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Использовать прокси-сервер" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Включить/выключить поддержку прокси-сервера" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Тип прокси-сервера:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "Тип прокси-сервера, который вы используете" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Прокси-сервер:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "Имя прокси-сервера" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Порт:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "Порт прокси сервера" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Идентификация" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Включить идентификацию" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Включить/выключить использование пароля и логина" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "Имя пользователя для подключения" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Пароль:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "Пароль для подключения к прокси-серверу" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Автоматическое соединение с сервером без прокси" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Соединиться с:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Войти на удалённый aMule" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Имя пользователя" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Запомнить настройки" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Записывать в журнал подробные сообщения отладчика." + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "Категории сообщений:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "Добавить файлы" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Перезапустить выбранное" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Удалить выбранное" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Типы событий" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Соединиться с произвольным сервером и/или Kad" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Новая категория" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Выберите каталог для входящих файлов" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Вы должны указать имя для категории!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Вы должны указать путь для категории!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"Не удалось создать каталог для загружаемых файлов категории. Укажите верный " +"путь." + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "Неизвестное расширение '%s' для команды '%s'.\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "Неизвестная команда '%s.'\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"У этой команды не может быть аргументов.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"У этой команды должен быть аргумент.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Команда не завершена. Необходимо использовать одно из следующих расширений.\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Доступные расширения:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Доступные команды:\n" + +#: src/ExternalConnector.cpp:188 +#, fuzzy, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"Все команды чувствительны к регистру.\n" +"Наберите 'help <имя команды>' чтобы получить справку по этой команде.\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Завершает приложение." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Отобразить справку." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"Чтобы получить справку по команде, наберите 'help <имя команды>'.\n" +"Чтобы получить полный список команд, наберите 'help'.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"Введите '%s' для получения списка команд\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Синтаксическая ошибка!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Ошибка при обработке команды - это не должно было произойти! Пожалуйста, " +"сообщите нам об этой ошибке\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "У этой команды не должно быть параметров." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "У этой команды должен быть параметр." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Неверный аргумент." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Команда введена не полность." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Наберите '%s' для подробной справки.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "Это %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "Это %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Создается клиент...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "Соединение не установлено. Невозможно подключиться к указанному узлу\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"Ok, выход из %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"Невозможно подключиться без пароля.\n" +"Вы должны указать пароль либо в конфигурационном файле,\n" +"либо используя командную строку.\n" +"\n" +"Завершение работы...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Показать эту справку." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "Узел, на котором работает aMule (по умолчанию - 'localhost')" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "Порт aMule для внешних подключений (по умолчанию: 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Пароль для внешнего соединения." + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Прочесть настройки из файла." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "Не выводить ничего в поток стандартного вывода." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Детально - выводить отладочную информацию." + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Установить локаль программы (язык)." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "Записать параметры командной строки в конфигурационный файл." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "Создаёт конфигурационный файл на основе оного из aMule." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Вывести версию программы." + +#: src/ClientCreditsList.cpp:168 +#, fuzzy, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "Файл кредитов загружен, %u клиентов известно" +msgstr[1] "Файл кредитов загружен, %u клиентов известно" + +#: src/ClientCreditsList.cpp:171 +#, fuzzy, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] " - Кредиты перестали действовать для %u клиентов!" +msgstr[1] " - Кредиты перестали действовать для %u клиентов!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "Файл 'cryptkey.dat' не найден. Создаю заново." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"ОШИБКА: демон aMule не может быть использован когда внешние соединения " +"выключены. Чтобы включить внешние соединения, используйте aMule, или " +"запустите amuled с параметром --ec-config, или установите ключ " +"\"AcceptExternalConnections\" равным 1 в файле ~/.aMule/amule.conf" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "Ошибка: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Разблокировать" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Показать передачу" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Показать очередь" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Показать клиентов" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Выбрать вид" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Клиентская программа" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Время ожидания" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Время загрузки" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Передача/Загрузка" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Удалённый статус" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "QR: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Приоритет файла" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Счет" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Запрошено" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Последний раз был доступен" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Встал в очередь" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Статус передаваемых файлов" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Передано" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Статус принимаемых файлов" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Принято" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Хеш пользователя" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Зашифровано" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Скрыть публикуемые файлы" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Сведения о клиенте" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Не поддерживается" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Не завершён" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Нарушитель" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Проверено - OK" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Не доступно" + +#: src/ClientDetailDialog.cpp:190 +#, fuzzy, c-format +msgid "%u (QR: %u)" +msgstr "QR: %u" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "Мин. размер должен быть меньше макс. размера. Игнорирую макс. размер." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Неограниченно" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "Меню aMule в области уведомлений" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Ограничения скорости:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "UL: Нет" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "UL: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "DL: Нет" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "DL: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Скорость приёма: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Скорость отдачи: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Информация о клиенте" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Псевдоним: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "Псевдоним не выбран!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "ID клиента: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Имя сервера: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "IP-адрес сервера: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "TCP порт: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "TCP порт: не готов" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "UDP порт: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "UDP порт: не готов" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Онлайн-подпись: Включена" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Онлайн-подпись: Выключена" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Публикуемые файлы: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Клиентов в очереди: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "Всего загружено: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "Всего передано: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Ограничение скорости отдачи" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Ограничение скорости приёма" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "Свернуть aMule" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "Показать aMule" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "Сеанс чата запущен: %s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Соединён с клиентом ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** Соединение с клиентом ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Не удалость соединиться с клиентом / Соединение разорвано ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Закрыть вкладку" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Закрыть все вкладки" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Закрыть остальные вкладки" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "Загружается файл 'server.met': %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "Файл 'server.met' не найден!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" +"Не удалось загрузить файл server.met '%s', потому что он имеет неправильный " +"формат." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "Не удалось открыть файл 'server.met'!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "Файл server.met поврежден. Неверная метка версии: 0x%x, размер %i" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "В файле 'server.met' найдено %i серверов" +msgstr[1] "В файле 'server.met' найдено %i серверов" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d серверов добавлено" +msgstr[1] "%d серверов добавлено" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Сервер не был добавлен: [%s:%d] не указывает на подходящий порт." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "Сервер не был указан: IP адрес [%s:%d] был отфильтрован или неверен." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" +"Сервер не был добавлен: сервер с совпадающим IP:порт [%s:%d] был найден в " +"списке." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Сервер добавлен: сервер [%s:%d] использует имя '%s'." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"Вы соединены с сервером, который вы пытаетесь удалить. Отключитесь от него." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Не удалось сохранить файл 'server.met'." + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "Неверный URL" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Не удалось получить список серверов из %s" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"В указанном файле 'addresses.dat' не найден адрес списка серверов. " +"Пожалуйста, укажите верный адрес списка серверов, чтобы автоматически " +"обновлять ваш список серверов" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" +"Внимание, указан неверный URL для автоматического обновления списка " +"серверов: %s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" +"Отсутствует допустимый 'server.met' файл по адресу для автоматического " +"обновления серверов" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"Локальный сервер отфильтрован через IPFilters. Подключаюсь к другому серверу!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "Не удалось выполнить команду `%s' при событии `%s'." + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"В связи со сменой версии, значение вашей локали было изменено на значение по " +"умолчанию. Извините." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "Ваш список серверов пуст. Скачать новый список?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Загрузить список серверов" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "номер процесса веб сервера %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"Вы настроили веб-сервер на запуск при открытии aMule, но 'amuleweb' не может " +"быть запущен. Пожалуйста, установите пакет, содержащий веб-сервер, или " +"соберите aMule используя параметр '--enable-webserver' при конфигурации." + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "Порт %u не доступен. У Вас будет LowID\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"Порт %u недоступен!\n" +"\n" +"Это означает что вам будет выдан LowID.\n" +"\n" +"Проверьте вашу сетевую конфигурацию, убедитесь что необходимый порт открыт." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Не удалось создать aMule OnlineSig файл" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "Не удалось создать aMule OnlineSig файл" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"Выбранная локаль отсутствует в вашей системе (тем не менее, будет " +"произведена попытка её использовать)." + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "Это первый запуск aMule %s" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "Эта версия является тестовой и обновляется ежедневно.\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "" +"Мы не предоставляем никаких гарантий на случай каких либо повреждений, " +"пожара \n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" +"или же смерти вашей любимой собачки. И всё же использование её *должно* быть " +"безопасным. \n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" +"Эти опции были изменены в данном релизе по соображениям безопасности:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"*Включена поддержка вуалирования протокола для входящих и исходящих " +"соединений.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* Отключено обновление списка серверов с других серверов и от клиентов.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"Больше информации о причинах этих изменений, выполните поиск\n" +"в вики aMule по адресу http://wiki.amule.org, используя фразу\"fake servers" +"\".\n" +"Важно, чтобы вы удалили все поддельные сервера из списка, чтобы aMule " +"работал правильно." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Дополнительную информацию, поддержку и обновленные версии вы найдёте на " +"нашем сайте \n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" +"www.aMule.org, или на нашем irc-канале #aMule, находящемся на сервере irc." +"freenode.net. \n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Сообщайте нам о найденных ошибках на форум http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"Указан неверный каталог для файлов Online-подписей!\n" +"Online-подписи будут отключены пока вы не исправите это в настройках." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "Ошибка: невозможно открыть файл журнала" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "ПРЕДУПРЕЖДЕНИЕ: файл журнала пуст. Что-то здесь не так :-(" + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Журнал был очищен" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "Сообщение сервера: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Ошибка при загрузке списка узлов." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Ошибка при загрузке файла контроля версии" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Поврежден файл контроля версии" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Вы используете устаревшую версию aMule!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "" +"Версия вашего aMule - %i.%i.%i, тогда как актуальная версия - %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "Актуальная версия aMule всегда доступна тут: http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "ВНИМАНИЕ: Версия вашего aMule устарела: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "Ваша копия aMule актуальна." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Ошибка при загрузке файла контроля версии" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Соединён с %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Подключение к %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Отключен от ED2K" + +# Kad как сеть, или служба - поэтому в женском роде +# да, согласен +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad запущена." + +# Kad как сеть, или служба - поэтому в женском роде +# согласен +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad остановлена." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Подключен к Kad (норм.)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Подключен к Kad (за брандмауэром)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Отключился от Kad" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"Сеть Kad не может быть использована если порт UDP выключен в настройках. " +"Отменяю запуск." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Сеть Kad выключена в настройках. Отменяю соединение." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "Не удалось открыть файл со списком друзей 'emfriends.met' для чтения!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "Не удалось открыть файл со списком друзей 'emfriends.met' для записи." + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "" +#~ "В данный момент вы не можете обновить файл server.met из удалённого ГИП." + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "Считано %u контактов Kad" +#~ msgstr[1] "Считано %u контактов Kad" + +#~ msgid "Disconnect from " +#~ msgstr "Отсоединение от " + +#~ msgid "current server" +#~ msgstr "текущий сервер" + +#~ msgid " and " +#~ msgstr " и " + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "Отключитесь ото всех серверов и/или от Kad" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "TCP Flags" +#~ msgstr "Флаги TCP" + +#~ msgid "UDP Flags" +#~ msgstr "Флаги UDP" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "Скопировать ed2k-ссылки в буфер обмена" + +#~ msgid "Client requests %u" +#~ msgstr "Клиент запрашивает %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "Блок файла %u-%u (%d Б):" + +#~ msgid "Client request is invalid!" +#~ msgstr "Недопустимый запрос от клиента!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "Недопустимый запрос от клиента! %i / %i" + +#~ msgid "Command: %s" +#~ msgstr "Команда: %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "Не удалось открыть %s - используется %s." + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "Предупреждение: файл known.met не существует." + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles: Удаляю %s из публикуемого каталога: " +#~ "Каталог не найден" + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "Ожидание завершения дочернего процесса прервано." + +#~ msgid "" +#~ "You cannot connect to a release version from an arbitrary CVS version! " +#~ "*sigh* possible crash prevented" +#~ msgstr "" +#~ "Вы не можете подключиться к стабильной версии, используя произвольную CVS " +#~ "версию." + +#~ msgid "doesn't work" +#~ msgstr "не работает" + +#~ msgid "remote gui" +#~ msgstr "далённый гип" + +#~ msgid "" +#~ "Error: Failed to load backup file. Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Ошибка: не удалось открыть файл. Узнайте на http://forum.amule.org о " +#~ "методах восстановления '.part' файлов." + +#~ msgid "" +#~ "Error: Backup part.met file is 0 size! Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Ошибка: размер файла 'part.met' - 0. Узнайте на http://forum.amule.org о " +#~ "методах восстановления 'part.met' файлов." + +#~ msgid "Error: part.met backup file is 0 size: %s ==> %s" +#~ msgstr "Ошибка: размер бэкапа файла 'part.met' равен нулю: %s ==> %s" + +#~ msgid "" +#~ "Note: These values are\n" +#~ " only used for statistics." +#~ msgstr "" +#~ "Это используется только \n" +#~ "для статистики." + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ "'Многоплатформенный' p2p-клиент, основанный на eMule \n" +#~ "\n" +#~ "Веб-сайт: http://www.amule.org \n" +#~ "Форум: http://forum.amule.org \n" +#~ "ЧаВо: http://wiki.amule.org \n" +#~ "\n" +#~ "Писать на: admin@amule.org (по административным вопросам) \n" +#~ "Все права защищены (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ "Часть aMule основана на \n" +#~ "Kademlia: маршрутизация peer-to-peer на основе XOR-метрики.\n" +#~ "Все права защищены (C) 2002 Petar Maymounkov\n" +#~ "http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "Предупреждение: Вы получили LowID!" + +#~ msgid "This command requieres an argument. Valid arguments: a file hash.\n" +#~ msgstr "Этой команде требуется аргумент. Допустимые аргументы: хеш файла\n" + +#~ msgid "Deprecated command, now 'Status'." +#~ msgstr "" +#~ "Команда не рекомендована к использованию. Используйте вместо неё 'Status'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Status' instead.\n" +#~ msgstr "" +#~ "Эта команда не рекомендована к использованию и может быть удалена в " +#~ "будущем.\n" +#~ "Используйте вместо неё 'Status'\n" + +#~ msgid "Deprecated command, now 'Set IPFilter'." +#~ msgstr "" +#~ "Команда не рекомендована к использованию. Используйте вместо неё 'Set " +#~ "IPFilter'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter' instead.\n" +#~ msgstr "" +#~ "Эта команда не рекомендована к использованию и может быть удалена в " +#~ "будущем.\n" +#~ "Используйте вместо неё 'Set IPFilter'\n" + +#~ msgid "Deprecated command, now 'Get IPFilter Level'." +#~ msgstr "" +#~ "Команда не рекомендована к использованию. Используйте вместо неё 'Get " +#~ "IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Эта команда не рекомендована к использованию и может быть удалена в " +#~ "будущем.\n" +#~ "Используйте вместо неё 'Get IPFilter Level'\n" + +#~ msgid "Deprecated command, now 'Set IPFilter Level'." +#~ msgstr "" +#~ "Команда не рекомендована к использованию. Используйте вместо неё 'Set " +#~ "IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Эта команда не рекомендована к использованию и может быть удалена в " +#~ "будущем.\n" +#~ "Используйте вместо неё 'Set IPFilter Level'\n" + +#~ msgid "Deprecated command, now 'Get/Set IPFilter Level'." +#~ msgstr "" +#~ "Команда не рекомендована к использованию. Используйте вместо неё 'Get/Set " +#~ "IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get/Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Эта команда не рекомендована к использованию и может быть удалена в " +#~ "будущем.\n" +#~ "Используйте вместо неё 'Get/Set IPFilter Level'\n" + +#~ msgid "Deprecated command, now 'Show Servers'." +#~ msgstr "" +#~ "Команда не рекомендована к использованию. Используйте вместо неё 'Show " +#~ "Servers'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Show Servers' instead.\n" +#~ msgstr "" +#~ "Эта команда не рекомендована к использованию и может быть удалена в " +#~ "будущем.\n" +#~ "Используйте вместо неё 'Show Servers'\n" + +#~ msgid "Deprecated command, now 'Get BwLimits'." +#~ msgstr "" +#~ "Команда не рекомендована к использованию. Используйте вместо неё 'Get " +#~ "BwLimits'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get BwLimits' instead.\n" +#~ msgstr "" +#~ "Эта команда не рекомендована к использованию и может быть удалена в " +#~ "будущем.\n" +#~ "Используйте вместо неё 'Get BwLimits'\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Up'." +#~ msgstr "" +#~ "Команда не рекомендована к использованию. Используйте вместо неё 'Set " +#~ "BwLimit Up'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Up' instead.\n" +#~ msgstr "" +#~ "Эта команда не рекомендована к использованию и может быть удалена в " +#~ "будущем.\n" +#~ "Используйте вместо неё 'Set BwLimit Up'\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Down'." +#~ msgstr "" +#~ "Команда не рекомендована к использованию. Используйте вместо неё 'Set " +#~ "BwLimit Down'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Down' instead.\n" +#~ msgstr "" +#~ "Эта команда не рекомендована к использованию и может быть удалена в " +#~ "будущем.\n" +#~ "Используйте вместо неё 'Set BwLimit Down'\n" + +#~ msgid "Syncronization thread started." +#~ msgstr "Поток синхронизации запущен." + +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "Мастер-хеши известных файлов загружены." + +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "Ошибка чтения контактов Kad - 0 контактов" + +#~ msgid "Merge attempt" +#~ msgstr "Попытка совмещения" + +#~ msgid "Recursive merge" +#~ msgstr "рекурсивное совмещение" + +#~ msgid "Sucessful merge!" +#~ msgstr "Совмещение удалось!" + +#~ msgid "No merge possible" +#~ msgstr "Совмещение невозможно" + +#~ msgid "Buddy address: " +#~ msgstr "Адрес друга:" + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid " %d" +#~ msgstr " %d" + +#~ msgid ".%d" +#~ msgstr ".%d" + +#~ msgid "Shows the process of a search." +#~ msgstr "Показывает процесс поиска." + +#~ msgid "Shows the process of a search..\n" +#~ msgstr "Показывает процесс поиска..\n" + +#~ msgid "Client Identification:" +#~ msgstr "Идентификация клиента:" + +#~ msgid "Use Secure Identification" +#~ msgstr "Использовать безопасную идентификацию" + +#~ msgid "" +#~ "Secure Identification uses a handshake approch to safely identify clients " +#~ "for use with the credit system." +#~ msgstr "" +#~ "Безопасная идентификация использует метод согласования для безопасного " +#~ "опеределения клиентов, для последующего использования в системе кредитов." + +#~ msgid "Sources Dropping" +#~ msgstr "Отброс источников" + +#~ msgid "Source Dropping" +#~ msgstr "Отброс источников" + +#~ msgid "Keep sources" +#~ msgstr "Оставлять" + +#~ msgid "Drop sources" +#~ msgstr "Отбрасывать" + +#~ msgid "Send sources to any other file before dropping (High CPU)" +#~ msgstr "Перебрасывать на другие файлы (большая нагрузка на процессор)" + +#~ msgid "Sources with no needed file-parts." +#~ msgstr "Источники без нужных частей." + +#~ msgid "Full Queue Sources Handling" +#~ msgstr "Источники с полной очередью" + +#~ msgid "Enable auto drop Full Queue Sources" +#~ msgstr "Отбрасывать источники с полной очередью" + +#~ msgid "High Queue Rating Sources Handling" +#~ msgstr "Обработка источников с большой очередью" + +#~ msgid "Enable auto drop High Queue Rating Sources" +#~ msgstr "Отбрасывать источники с большой очередью" + +#~ msgid "High Queue Rating value" +#~ msgstr "Значение большой очереди" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(Мин. - 300, Макс. - 3000)" + +#~ msgid "Auto Drop Sources Timer" +#~ msgstr "Таймер авто-отброса источников" + +#~ msgid "Timer (in secs)" +#~ msgstr "Таймер (в секундах)" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(Мин. - 60, Макс. - 3600)" + +#~ msgid "Drop No Needed Sources now" +#~ msgstr "Отбросить немедленно ненужные источники" + +#~ msgid "Drop Full Queue Sources now" +#~ msgstr "Отбросить источники с полной очередью" + +#~ msgid "Drop High Queue Rating Sources now" +#~ msgstr "Отбросить источники с превышением макс. очереди" + +#~ msgid "Clean Up Sources now (NNS, FQS && HQRS)" +#~ msgstr "Отбросить бесполезные источники (NNS, FQS && HQRS)" + +#~ msgid "English (U.S.)" +#~ msgstr "Английский (США)" + +#~ msgid "Spanish (Mexican)" +#~ msgstr "Испанский (Мексика)" diff --git a/po/sl.po b/po/sl.po new file mode 100644 index 00000000..46828eee --- /dev/null +++ b/po/sl.po @@ -0,0 +1,7456 @@ +# translation of sl.po to Slovenščina +# This file is distributed under the same license as the aMule package. +# +# Uros Vampl , 2005-2008. +# Aljosa Vidmar , 2006-2008. +# Aljoša Vidmar , 2007. +msgid "" +msgstr "" +"Project-Id-Version: sl\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2007-08-30 22:58+0200\n" +"Last-Translator: Aljoša Vidmar \n" +"Language-Team: Slovenščina \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" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Navesti morate neprazno geslo." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Neveljavno geslo, ni MD5 hash!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Napaka med povezovanjem" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "EC povezava ni uspela. Prazen odgovor." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "ExternalConn: Dostop zavrnjen zaradi: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "ExternalConn: Dostop zavrnjen" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "ExternalConn: Slab odgovor strežnika. Povezava prekinjena." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Uspeh! Vzpostavljena povezava z aMule " + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Uspeh! Povezava vzpostavljena." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Ustvarjanje hasha" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Zaključevanje" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Končano" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Na premoru" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Vsebuje napake" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Prenašanje" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Na čakanju" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "Začetek ustvarjanja hasha MD4 in AICH za datoteko: %s" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "Začetek ustvarjanja hasha MD4 za datoteko: %s" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "Začetek ustvarjanja hasha AICH za datoteko: %s" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "Pretvarjanje starih hashov AICH v '%s' v 64b v '%s'." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" +"OPOZORILO: Ime datoteke '%s' ni veljavno in je bilo preimenovano v '%s'." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "" +"OPOZORILO: Datoteka '%s' že obstaja, nova datoteka je preimenovana v '%s'." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" +"OPOZORILO: Ni bilo mogoče odstraniti izvirnika '%s' po izdelavi varnostne " +"kopije" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "OPOZORILO: Ni bilo mogoče zbrisati %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "Ni bilo mogoče dobiti deljenih datotek od uporabnika '%s'" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Neznano" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (Lažna različica eMule %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (Lažna eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (Lažna eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (temelji na eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Vzdevek: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "Zahtevano:" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Statistika datotek v tej seji: Sprejetih %d od %d zahtev, %s prenesenih\n" +msgstr[1] "" +"Statistika datotek v tej seji: Sprejetih %d od %d zahtev, %s prenesenih\n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Statistika datotek vseh sej: Sprejetih %d od %d zahtev, %s prenesenih\n" +msgstr[1] "" +"Statistika datotek vseh sej: Sprejetih %d od %d zahtev, %s prenesenih\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Zahtevana neznana datoteka" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "Odjemalec %s na IP:Vratih %s:%d uporablja %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Uporabniško ime" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Prijatelji" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Prikaži Po&drobnosti" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Dodaj prijatelja" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Odstrani prijatelja" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Pošlji &sporočilo" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Poglej datoteke" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Ustvari mesto za prijatelja" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Ali ste prepričani, da želite zbrisati izbrane prijatelje?" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Ali ste prepričani, da želite zbrisati izbrane prijatelje?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Prekliči" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"Nimate dovoljenja za dodelitev več kot enega mesta za prijatelje.\n" +"Samo eno mesto je bilo dodeljeno." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Izbira večih" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Ime datoteke" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Velikost" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Vrsta" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Prioriteta" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "ID datoteke" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "Zahtev" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Sprejetih zahtev" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Prenesenih podatkov" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Delilno razmerje" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Dobljeni deli" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Celotni viri" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Pot imenika" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Deljene datoteke" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Zelo nizka" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Nizka" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normalna" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Visoka" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Zelo visoka" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Najvišja" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Samod." + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Dodaj komentar/oceno" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Uredi komentar/oceno" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Preimenuj" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Dodaj datoteke iz zbirke na seznam prenosov" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Kopiraj magnet &URI v odložišče" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Kopiraj pove&zavo ED2k v odložišče" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Kopiraj povezavo ED2k v odložišče (&Vir)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "Kopiraj povezavo ED2k v odložišče (Vir) (s &kripto nastavitvami)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Kopiraj povezavo ED2k v odložišče (&Ime gostitelja)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" +"Kopiraj povezavo ED2k v odložišče (Ime gostitelja) (s k&ripto nastavitvami)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Kopiraj povezavo ED2k v odložišče (&AICH info)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Kopiraj odziv v odložišče" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "Potrebujete visok ID, da ustvarite povezavo z virom" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Opozorilo" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Deljene datoteke (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[Delna datoteka]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Vnesite novo ime za to datoteko:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Preimenuj datoteko" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Nadaljevanje prenosov gor za datoteko: %s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Ustavljanje prenosa gor za datoteko: %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: iskalni niz je prekratek" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Napaka: Ni mogoče poslušati vrat TCP." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "Zahteve ni bilo mogoče izvesti zaradi napake: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "Zahteva prekinjena z neznano napako." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "Indeksne datoteke ni mogoče najti: " + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Ni mogoče ustvariti niti spletne vtičnice\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Spletni strežnik: Zagnan\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Seja potekla - zahtevek za prijavo\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Seja v redu, prijavljen\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Seja v redu, ni prijave\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Ni odprte seje - zahtevek za prijavo\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Seja ustvarjena - zahtevek za prijavo\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "Obdelovanje zahteve [izvirno]: " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Preverjanje gesla\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Hash gesla ni veljaven\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Geslo v redu\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Napačno geslo\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "Niste navedli gesla. Prazno geslo ni dovoljeno.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Zahtevana odjava\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "Obdelovanje zahteve [preusmerjeno]: " + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Naloži predlogo " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Vrata HTTP spletnega strežnika" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Uporabi preusmerjanje vrat UPnP za vrata spletnega strežnika" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "Vrata UPnP" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Uporabi kompresijo gzip" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Geslo s polnim dostopom za spletni strežnik" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Geslo gosta za spletni strežnik" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Dovoli dostop gostom" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Zavrni dostop gostom" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "Naloži/shrani nastavitve spletnega strežnika iz/v oddaljeno aMule" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "Pot do nastavitvene datoteke. NE UPORABI NEPOSREDNO!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "Onemogoči tolmač PHP (zastarelo)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Ponovno prevedi strani PHP ob vsaki zahtevi" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "Spletni strežnik aMule" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Ni na voljo" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Nikoli" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Prenašanje..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Nastavitve" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "Imenik, ki vsebuje datoteko amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Prebrskaj" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Tu vnesite imenik, ki vsebuje datoteko amulesig.dat" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Interval med osvežitvami v sekundah" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Ustvari statistično sliko ob vsaki osvežitvi" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "Tu vnesite imenik, v katerem želite ustvariti statistično sliko" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Periodično prenesi statistično sliko na strežnik FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "FTP URL" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "Pot FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Tu vnesite URL vašega strežnika FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" +"Tu vnesite imenik na strežniku FTP, v katerega se naj shrani statistična " +"slika" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Uporabnik" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Geslo" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "Tu vnesite uporabniško ime za prijavo na vaš strežnik FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "Tu vnesite geslo za prijavo na vaš strežnik FTP" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "Interval med osvežitvami prenosov na FTP v minutah" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Preveri veljavnost" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Mapa, ki vsebuje vašo datoteko s podpisom" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "Mapa, v katerem je ustvarjena statistična slika" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i dni %i ur %i min. %i sek." + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, spletna statistika aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Dobrodošli!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "Največji prenos dol odkar teče wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "Absolutni največji prenos dol med vsemi prejšnjimi sejami wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Počisti" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "Sistem" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Ustavi samodejno osveževanje" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Shrani sliko spletne statistike" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Natisni sliko spletne statistike" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Nastavitve" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "O wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Zaženi samodejno osveževanje" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Samodejno osveževanje ustavljeno" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Samodejno osveževanje začeto" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "Shrani statistično sliko" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Ni upravitelja za to vrsto datoteke." + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "Datoteka ni bila shranjena" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "Spletna statistika aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Pri tiskanju se je pojavil problem.\n" +"Ali je privzet tiskalnik pravilno nastavljen?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Tiskanje" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, aMule statistika spletnega podpisa\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Temelji na CAS, avtorja Pedro de Oliveira \n" +"\n" +"Na voljo pod licenco GPL" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "aMule ne teče..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule teče" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule teče, vendar brez povezave" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule se povezuje..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Status aMule je neznan..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr "teče že" + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " je ustavljena !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " ni povezana !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " se povezuje..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " dela nekaj nenavadnega, preverite !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " je povezana z " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "V redu" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "za požarnim zidom" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "ugasnjen" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " je povezan" + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +#, fuzzy +msgid " with " +msgstr "] z " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Skupni prenos dol: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Prenos gor: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Prenos dol to sejo: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Prenos dol: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s, Prenos gor: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Deljenih: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " datotek, Odjemalcev v vrsti: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Čas: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " na " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Povprečna obremenitev sistema (1-5-15 min.):" + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Neprekinjeno delovanje: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uD %02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uh %02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02umin %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "Visok ID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "Nizek ID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Ni povezave" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "Preklicano !" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Ni mogoče odpreti %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "" +"Datoteka %s je prevelika za Donkey: največja dovoljena velikost je 4 GB." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Vhodni parametri" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Ustvari hash za datoteko" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Dodaj URL-je za to datoteko (neobvezno)" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Tu vnesite datoteko za katero želite izračunati Ed2k povezavo" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Tu vnesite URL, ki ga želite dodati Ed2k povezavi : Dodajte / na koncu, da " +"bo aLinkCreator samodejno dodal trenutno ime datoteke" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Dodaj" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Odstrani" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Počisti" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Ustvari povezavo z delnimi hashi" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Pomaga pri hitrejšem razširjanju novih in redkih datotek, za ceno večje " +"dolžine povezave" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "Hash MD4 datoteke" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "Hash datoteke Ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "Povezava Ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Začni" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Shrani" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Kopiraj v odložišče" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Izhod" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Odpri datoteko za izračun njene povezave ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Kopiraj izračunano povezavo ed2k v odložišče" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Shrani izračunano povezavo ed2k v datoteko" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "O aLinkCreator" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Izberite datoteko za katero želite izračunati povezavo ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "Zaenkrat ni nič za skopirati !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Izberite datoteko k izračunani povezavi ed2k" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Ni mogoče odpreti " + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Prosim, vnesite neprazno ime datoteke" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "Zaenkrat ni nič za shraniti !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, aMule izdelovalec povezav ed2k\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Ikone iz http://www.everaldo.com in http://www.icomania.com\n" +"in http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Na voljo pod licenco GPL" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Ustvarjanje hasha..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Končano v %.2f s" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "Ta URL ste že dodali !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Prosim, vnesite neprazen URL" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "Obdelovanje datoteke številka %u: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "Zahtevali ste delne hashe (na voljo samo za datoteke > 9.5 MB)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Prosim, počakajte... " + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> Datoteka ne obstaja !\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, aMule izdelovalec povezav ed2k" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Samod. [Ni]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Samod. [No]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Samod. [Vi]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Povezovanje" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Povpraševanje" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Povezovanje preko strežnika" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Vrsta polna" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "V vrsti" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Prenašanje" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Sprejemanje hashseta" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Nič uporabnih delov" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "Povezava Nizkega ID-ja z Nizkim ID-jem ni mogoča" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Preveč povezav" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Povezovanje preko Kad" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Preveč povezav Kad" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Izločen" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Napaka povezave" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Oddaljena vrsta polna" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "Star MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "Nov MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "eMule združljiv" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Krajeven strežnik" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Oddaljen strežnik" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Izmenjava virov" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Pasivno" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Povezava" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Izvirna semena" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Sistemsko privzeto" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "arabski" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "baskovski" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "bolgarski" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "katalonski" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "kitajski (poenostavljen)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "kitajski (tradicionalen)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "hrvaški" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "danski" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "nizozemski" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "angleški (UK)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "estonski" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "finski" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "francoski" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "galicijski" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "nemški" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "madžarski" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "italijanski" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "italijanski (švicarski)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "korejski" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "poljski" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "portugalski" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "portugalski (brazilski)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "ruski" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "slovenski" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "španski" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "turški" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Ni mogoče določiti izbranega brskalnika!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "Vrata TCP ne smejo biti večja od 65532, ker so vrata UDP TCP+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Uporabljena bodo privzeta vrata (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Ime strežnika" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Naslov" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Vrata" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Opis" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Uporabnikov" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Datotek" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Neuspeh" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Statičen" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Različica" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Povezani ste na strežnik, ki ga hočete izbrisati. Prosimo, najprej prekinite " +"povezavo. Strežnik NI bil zbrisan." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Info" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(Neznano ime)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Ali ste prepričani, da želite izbrisati statičen strežnik %s?" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Da" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Ne" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Ni bilo mogoče odpreti '%s'" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Strežniki (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Strežnik" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Poveži se na strežnik" + +#: src/ServerListCtrl.cpp:428 +#, fuzzy +msgid "Mark server as static" +msgstr "Označi strežnik(e) kot statičen" + +#: src/ServerListCtrl.cpp:429 +#, fuzzy +msgid "Mark server as non-static" +msgstr "Označi strežnik(e) kot ne-statičen" + +#: src/ServerListCtrl.cpp:431 +#, fuzzy +msgid "Mark servers as static" +msgstr "Označi strežnik(e) kot statičen" + +#: src/ServerListCtrl.cpp:432 +#, fuzzy +msgid "Mark servers as non-static" +msgstr "Označi strežnik(e) kot ne-statičen" + +#: src/ServerListCtrl.cpp:438 +#, fuzzy +msgid "Remove server" +msgstr "Odstrani strežnik(e)" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "Odstrani strežnik(e)" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Odstrani vse strežnike" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Kopiraj povezavo ED2k v odložišče" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "Kopiraj povezavo ED2k v odložišče" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Ponovno se poveži s strežnikom" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Ali ste prepričani, da želite zbrisati vse strežnike?" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Ali ste prepričani, da želite zbrisati izbrane strežnike?" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Ali ste prepričani, da želite zbrisati izbrane strežnike?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Onemogočeno [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "To je aMule %s, ki temelji na eMule." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "Operacijski sistem: %s" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" +"Obiščite http://www.amule.org da preverite, če je na voljo nova različica." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Usodna napaka: ni bilo mogoče ustvariti Merilnika časa" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "Oddaljen nadzor aMule " + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Posnetek:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr "" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr "" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Sporočilo" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Besedilo stanja" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "Povezovanje" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "Ni povezave" + +#: src/amuleDlg.cpp:676 +#, fuzzy +msgid "Kad: Firewalled" +msgstr "Za požarnim zidom" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "Povezan" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "Povezovanje" + +#: src/amuleDlg.cpp:689 +#, fuzzy +msgid "Kad: Off" +msgstr " Kad: " + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "Ustavi trenutne poskuse povezovanja" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Prekini" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "Prekini povezavo z omrežjem." + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Poveži" + +#: src/amuleDlg.cpp:726 +#, fuzzy +msgid "Connect to the currently enabled networks" +msgstr "Poveži se z omrežjem." + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Gor: %.1f(%.1f) | Dol: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Gor: %.1f | Dol: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | Povezan)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | Ni povezave)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Ali ste prepričani, da želite zapustiti aMule?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Potrditev izhoda" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Ukaza za zagon brskalnika ni bilo mogoče določiti." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "Imenik za preobleke '%s' ne obstaja" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "Opozorilo: Ni mogoče odpreti datoteke za preobleko '%s'" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Omrežja" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Okno z omrežji" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Iskanje" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Okno iskalnika" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Prenosi" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Okno s prenosi datotek" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Okno z deljenimi datotekami" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Sporočila" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Okno s sporočili" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Statistika" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "Okno s statističnimi grafi" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Okno z nastavitvami" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Uvoz" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "Orodje za uvažanje delnih datotek" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "O programu" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "O programu/Pomoč" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Splošno" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Povezava" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Proksi" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Filter za sporočila" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Oddaljeno upravljanje" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Spletni podpis" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Imeniki" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Varnost" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "Prilagoditve vmesnika" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Prilagoditve jedra" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Dogodki" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Iskanje napak" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Uporabniško določeno" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"Potreben je ponoven zagon aMule za uveljavitev teh sprememb:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- Vrata TCP so spremenjena.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- Vrata UDP so spremenjena.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"Seznam za samodejno posodabljanje strežnikov je prazen.\n" +"'Samodejna posodobitev seznama strežnikov ob zagonu bo izklopljena." + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"Omogočili ste zunanje povezave, vendar niste navedli gesla.\n" +"Zunanje povezave ne morejo biti omogočene, dokler ne navedete veljavnega " +"gesla." + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- Jezik spremenjen.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- Mapa za začasne datoteke spremenjena.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Gor: 0.0 | Dol: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"Omrežji ED2k in Kad sta onemogočeni.\n" +"Ne boste se morali povezati, dokler ne omogočite vsaj enega." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"Kad se ne bo zagnal, če so vrata UDP onemogočena.\n" +"Omogočite vrata UDP ali pa onemogočite Kad." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"aMule morate NUJNO ponovno zagnati.\n" +"Če tega ne storite zdaj, se ne pritožujte, če se zgodi kaj slabega.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "OPOZORILO" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"Seznam za samodejno posodabljanje strežnikov je prazen.\n" +"Vnesite vsaj en URL do veljavne server.met datoteke.\n" +"Kliknite na gumb \"Seznam\", zraven potrditvenega polja, za vnos URL-ja." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "Začasne datoteke" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Prihajajoče datoteke" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Spletni podpisi" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Izberite mapo za %s" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "Prebrskajte za wav" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "Datoteka wav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Prebrskajte za video predvajalnik" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Izberite brskalnik" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Izvedljiva datoteka %s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Uredi seznam strežnikov" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Tu dodajte URL-je do datotek server.met.\n" +"Po en URL v vsako vrstico." + +#: src/PrefsUnifiedDlg.cpp:980 +#, fuzzy, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Osveži vsakih: %d sek." +msgstr[1] "Osveži vsakih: %d sek." + +#: src/PrefsUnifiedDlg.cpp:987 +#, fuzzy, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Čas za graf trenutnega povprečja: %i min." +msgstr[1] "Čas za graf trenutnega povprečja: %i min." + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Merilo za graf povezav: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, fuzzy, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Čas med posodobitvami: %d sek." +msgstr[1] "Čas med posodobitvami: %d sek." + +#: src/PrefsUnifiedDlg.cpp:1005 +#, fuzzy, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Velikost medpomnilnika: %d bajtov" +msgstr[1] "Velikost medpomnilnika: %d bajtov" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, fuzzy, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Velikost čakalne vrste: %d odjemalcev" +msgstr[1] "Velikost čakalne vrste: %d odjemalcev" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, fuzzy, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Interval osvežitev povezave s strežnikom: %d min." +msgstr[1] "Interval osvežitev povezave s strežnikom: %d min." + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Interval osvežitev povezave s strežnikom: Onemogočeno" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "Izvrši ukaz ob dogodku '%s'" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Omogoči izvrševanje ukazov na jedru" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Ukaz jedra:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Omogoči izvrševanje ukazov v vmesniku" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "Ukaz vmesnika:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "Sledeče spremenljivke bodo zamenjane:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Nepooblaščen poskus dostopa. Povezava prekinjena." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Zunanja povezava se je zaprla." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "Zunanje povezave onemogočene zaradi praznega gesla!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "Zunanje povezave onemogočene v nastavitveni datoteki" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Nova zunanja povezava sprejeta" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "Napaka: ni bilo mogoče sprejeti nove zunanje povezave" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "Zunanja povezava zavrnjena zaradi praznega gesla v nastavitvah!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "Povezovanje z odjemalcem: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Neznana različica" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"Napačna različica EC ID-ja; lahko pride do binarne neskladnosti. Uporabite " +"jedro in oddaljen odjemalec iz istega posnetka." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "Overjanje ni uspelo." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Neveljavna različica protokola." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Manjka označevalec različice protokola." + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Neveljavna zahteva, najprej se morate overoviti." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Dostop sprejet." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" +"Ukaz za oddaljeno delno datoteko ni uspel: Ni bilo mogoče najti hasha " +"datoteke: %s " + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "Hasha datoteke ni mogoče najti: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "Ups! Napaka pri obdelavi OpCode!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Strežnik ni bil dodan" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "strežnika ni mogoče najti: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "morate navesti strežnik za odstranitev" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "ED2K je izklopljen v nastavitvah." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "Iskanje poteka. Ponovno poglejte za rezultati čez nekaj trenutkov!" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "Spletno iskanje iz oddaljenega vmesnika nima smisla." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad je onemogočen v nastavitvah." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Ni točk za graf." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "Vaš odjemalec ni nastavljen za to stopnjo podrobnosti." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "ExternalConn: zahteva za ustavitev" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Ustavljanje že poteka." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "ExternalConn: dodajanje povezave '%s'." + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Neveljavna povezava oz. je že na seznamu." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "Datoteke ni mogoče najti." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Neveljavno ime datoteke." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Ni mogoče preimenovati datoteke." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Povezava z ED2K že obstaja." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Povezovanje z ED2K..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Povezava s Kad že obstaja." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Povezovanje s Kad..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Vsa omrežja so onemogočena." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Povezava z ED2K prekinjena." + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Povezava s Kad prekinjena." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "ExternalConn: sprejet neveljaven 'opcode': %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "Neveljaven 'opcode' (napačna različica protokola?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" +"Ni bilo mogoče odpreti datoteke (%s), odstranjevanje iz seznama deljenih " +"datotek." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "Zahtevan je bil hashset za neznano datoteko: %s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "Ukaz '%s' z id-jem '%d' se je končal s statusno kodo '%d'." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "Strežnik ni bil dodan: IP ali ime gostitelja nista navedena." + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "Strežnik ni bil dodan: navedena so neveljavna vrata strežnika." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "Stanje ED2K:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Povezan" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Vrata" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Stanje Kademlia:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Teče" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Stanje:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Ni povezave" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Stanje povezave:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Za požarnim zidom" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "V redu" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Stanje za požarnim zidom: " + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "Povezan s kolegom" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "Brez kolegov" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Povprečno uporabnikov: " + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "Povprečno datotek:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "Ne teče" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Neprekinjeno delovanje: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Prenos" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Prenosi gor" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Prenesenih podatkov gor (Seja (Skupno)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Celotni presežek (paketov): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Presežek zahtev datotek (paketov): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "Presežek izmenjav virov (paketov): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Presežek strežnikov (paketov): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Presežek Kad (paketov): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Aktivni prenosi gor: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Čakajoči prenosi gor: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Skupno št. uspelih prenosov gor: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Skupno št. neuspelih prenosov gor: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Povprečen čas prenosov gor: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Prenosi dol" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Prenesenih podatkov dol (Seja (Skupno)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Najdenih virov: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Aktivni prenosi (deli): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Razmerje med prenosi gor:dol to sejo (skupno): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Povprečen prenos dol (seja): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Povprečen prenos gor (seja): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "Največji prenos dol (seja): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "Največji prenos gor (seja): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Ponovnih povezav: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "Čas od prvega prenosa: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "S strežnikom povezan že: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Aktivnih povezav (približek): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Dosežnih največ možnih povezav: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Povprečnih povezav (približek): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Povezav v konici (približek): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Odjemalci" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Filtrirani" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Skupno: %i Znani: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Strežniki" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Delujoči strežniki: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Nedelujoči strežniki: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Skupno: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Zbrisani strežniki: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Filtrirani strežniki: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Uporabnikov na delujočih strežnikih: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "Datotek na delujočih strežnikih: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Skupno uporabnikov: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "Skupno datotek: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Zasedenost strežnikov: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Število deljenih datotek: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Celotna velikost deljenih datotek: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Povprečna velikost datoteke: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "Nizek ID: %u (%.2f%% Skupno %.2f%% Znanih)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "SecIdent Da/Ne: %u (%.2f%%) : %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Operacijski sistem" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "Ni prejeto" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Izreži" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Kopiraj" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Prilepi" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Izberi vse" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "Iskanje preko Kad ni mogoče, če Kad ne teče" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "Iskanje preko ED2K ni mogoče, če ED2K ni povezan" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Nepričakovana napaka med iskanjem Kad: " + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "Filtrirano sporočilo od '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "Novo sporočilo od '%s' (IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "Uporabnik %s (%u) je zahteval vaš seznam deljenih datotek -> Sprejeto" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "Uporabnik %s (%u) je zahteval vaš seznam deljenih datotek -> Zavrnjeno" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "Uporabnik %s (%u) je zahteval vaš seznam deljenih imenikov -> Sprejeto" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" +"Uporabnik %s (%u) je zahteval vaš seznam deljenih imenikov -> Zavrnjeno" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"Uporabnik %s (%u) je zahteval seznam deljenih datotek za imenik %s -> " +"sprejeto" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"Uporabnik %s (%u) je zahteval seznam deljenih datotek za imenik %s -> " +"zavrnjeno" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "Uporabnik %s (%u) deli imenik %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "Uporabnik %s (%u) je poslal nezahtevane deljene imenike." + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "Uporabnik %s (%u) je poslal seznam deljenih datotek za imenik %s" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "Uporabnik %s (%u) je končal s prenosom seznama deljenih datotek" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "Uporabnik %s (%u) je poslal nezaželen seznam deljenih datotek" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" +"Uporabnik %s (%u) je zavrnil dostop do seznama deljenih datotek/imenikov" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Vozlišča (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "Neveljaven IP za začetno nalaganje" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Neveljavna vrata za začetno nalaganje" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "Prosimo, izpolnite vsa zahtevana polja" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Ali ste prepričani, da želite prenesti novo datoteko nodes.dat?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" +"S tem boste odstranili trenutna vozlišča in ponovno zagnali povezavo Kad." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Nadaljuj?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Napaka: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Opozorilo: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Dodaj prijatelja" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Vnesti morate veljaven IP in vrata!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Informacije" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "Naveden hash uporabnika ni veljaven!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Viri" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Datoteka" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Prenos" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Kategorija" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Glavna" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Prenesi v kategorijo" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "Išči sorodne datoteke (ED2K, krajevni strežnik)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Poveži se z oddaljeno aMule" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Povezovanje ni uspelo " + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Napaka" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"OPOZORILO: Ne morete dodati sebe kot vir za ed2k povezave, če imate nizek ID." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Uporabnikov: E: %s K: %s | Datoteke E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Vse" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Skupno uporabnikov: %s | Skupno datotek: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Preneseno" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Končano" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Hitrost" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Potek" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Stanje" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Preostaja še" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Nazadnje videno celotno" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Zadnji sprejem" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Ali ste prepričani, da želite zbrisati označene datoteke?" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Ali ste prepričani, da želite zbrisati označene datoteke?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Pošlji uporabniku sporočilo" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Sporočilo:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Ustavi" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Premor" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Nadaljuj" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "Počisti &končane" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Prenesi vse vire A4AF na to datoteko zdaj" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Prenesi vse vire A4AF na to dat. (samod.)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Prenesi vse vire A4AF na druge datoteke" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Dodatne možnosti" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Predogled" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Prikaži po&drobnosti datoteke" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Prikaži vse komentarje" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Kopiraj magnet URI v odložišče" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "prekliči dodelitev" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Dodeli kategoriji" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "&Odpri datoteko" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Odstrani iz seznama prijateljev" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Dodaj med prijatelje" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Pošlji sporočilo" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Prenesi k tej datoteki" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "QR: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Prosil za drugo datoteko" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Prenosi dol (%i)" + +#: src/DownloadListCtrl.cpp:2222 +#, fuzzy +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"Prosimo, nastavite predvajalnik v nastavitvah.\n" +"Medtem bo aMule poskusil uporabiti MPlayer. To opozorilo boste dobili ob " +"vsakem predogledu." + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Predogled datoteke" + +#: src/DownloadListCtrl.cpp:2260 +#, fuzzy, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "NAPAKA: Ni bilo mogoče zagnati zunanjega predvajalnika!" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "NAPAKA: Delne datoteke ni bilo mogoče odpreti)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "NAPAKA: Delne datoteke ni bilo mogoče ustvariti)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "Poskus nalaganja varnostne kopije met datoteke iz %s" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "Napaka: Ni bilo mogoče odpreti part.met datoteke: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "Napaka: Velikost part.met datoteke je 0: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "Napaka: Neveljavna različica part.met datoteke: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" +"Napaka: %s (%s) je pokvarjen (napačen 'tagcount'), ni mogoče naložiti " +"datoteke." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "Poskus reševanja informacije o datoteki..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "Reševanje neimenovane datoteke - rešena bo kot RecoveredFile.dat" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" +"Rešene vse informacije o datoteki ki so na voljo :D - Poskus njihove " +"uporabe..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Ni mogoče rešiti informacij o datoteki :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Ni bilo mogoče odpreti %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "Opozorilo: možno, da je %s pokvarjen (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "NAPAKA med shranjevanjem delne datoteke: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "Velikost '%s' je 0 - uporabljena bo datoteka %s." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "Ni bilo mogoče shraniti datoteke part.met.seeds za %s" + +#: src/PartFile.cpp:1019 +#, fuzzy, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "Shranjenih %i virov za delno datoteko: %s (%s)" +msgstr[1] "Shranjenih %i virov za delno datoteko: %s (%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "Delna datoteka %s (%s) nima datoteke seeds" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "Delna datoteka %s (%s) ima prazno datoteko seeds" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "Napaka pri branju delne datoteke 'seeds' (%s - %s): %s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, fuzzy, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"Najden pokvarjen del (%d) v %d delni datoteki %s - - FileResultHash |%s| " +"FileHash |%s|" +msgstr[1] "" +"Najden pokvarjen del (%d) v %d delni datoteki %s - - FileResultHash |%s| " +"FileHash |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "Najden končan del (%i) v %s" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "Končano ponovno ustvarjanje hasha za %s" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "Nepričakovana datotečna napaka med končevanjem %s. Datoteka na premoru" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Končan prenos: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "Brisanje datoteke: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" +"Opozorilo: Ni mogoče ustvariti hasha za prenesen del - hashset nepopoln za '%" +"s'" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"Napaka: Ni mogoče ustvariti hasha za prenesen del, hashset nepopoln (%s). To " +"se ne bi smelo zgoditi" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "OPOZORILO: Na disku ni dovolj prostora! Datoteka %s na premoru" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "Prenesen del %i v datoteki je pokvarjeni: %s" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "IRN: Rešen pokvarjen del %i za %s -> Rešenih bajtov: %s" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Ni dovolj prostora na disku" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Ustavljeno" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "Opozorilo: known.met ni mogoče odpreti." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" +"Opozorilo: Seznam znanih datotek je pokvarjen, vsebuje neveljavno glavo." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "Vhodno/izhodna napaka med branjem datoteke known.met: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "Napaka med shranjevanjem datoteke known.met: %s" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "Najdenih %i znanih deljenih datotek" +msgstr[1] "Najdenih %i znanih deljenih datotek" + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "Najdenih %i znanih deljenih datotek, %i neznanih" +msgstr[1] "Najdenih %i znanih deljenih datotek, %i neznanih" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "NAPAKA! Poskus deljenja %s" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Komentarji o datoteki" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Ocena" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Komentar" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Ni komentarjev" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%s komentarjev" +msgstr[1] "%s komentarjev" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"Ni bilo mogoče vzpostaviti maskirane povezave s strežniki na seznamu. " +"Ponoven poskus brez maskiranja." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "" +"Ni se bilo mogoče povezati na katerega koli izmed strežnikov na seznamu. " +"Ponoven poskus." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "Omrežje ED2K onemogočeno v nastavitvah, ni povezave." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "" +"Na seznamu strežnikov ni veljavnih strežnikov s katerimi bi se lahko " +"povezali." + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Povezan z %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Povezava vzpostavljena z: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"Kritična napaka med povezovanjem. Internetna povezava je mogoče prekinjena" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Izgubljena povezava z %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) je nedosegljiv." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) je poln." + +#: src/ServerConnect.cpp:391 +#, fuzzy, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "" +"Samodejen poskus povezovanja s strežnikom se bo izvedel čez %d sekund" +msgstr[1] "" +"Samodejen poskus povezovanja s strežnikom se bo izvedel čez %d sekund" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Povezava izgubljena" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "Povezovanje z %s (%s:%i) ni uspelo." + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "Napaka: Vtičnica ni bila veljavna ob preverjanju časovne omejitve" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "Poskus povezovanja z %s (%s:%i) je potekel." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Ni mogoče najti delnih datotek" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "Najdenih %u delnih datotek" +msgstr[1] "Najdenih %u delnih datotek" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Prenašanje %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Datoteko '%s' že poskušate prenesti." + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Datoteko '%s' že imate." + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "Datoteko %s že poskušate prenesti." + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "Ni mogoče pretvoriti povezave magnet v povezavo ed2k: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "Neznan protokol povezave: %s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Neveljavna povezava ed2k! Napaka: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "Izvrši in končaj." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Neveljaven format IP. Uporabite xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +#, fuzzy +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "Ta ukaz potrebuje argument. Veljavni argumenti: 'all' ali število.\n" + +#: src/TextClient.cpp:343 +#, fuzzy +msgid "Processing by hash: " +msgstr "Obdelovanje datoteke številka %u: %s" + +#: src/TextClient.cpp:358 +#, fuzzy +msgid "Processing by filename: " +msgstr "Obdelovanje datoteke številka %u: %s" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Ni veljavno število\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "Ni veljaven hash (dolžina mora biti točno 32 znakov)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "Operacija je bila uspešna." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "Zahteva ni uspela zaradi napake: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "Filtriranje IP za odjemalce je %s.\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "IZKLOPLJENO" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "VKLOPLJENO" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "Filtriranje IP za strežnike je %s.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "Trenutna stopnja IP Filtra je %d.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Omejitve prenosa: Gor: %u kB/s, Dol: %u kB/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Povezan z %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "z Nizkim ID-jem" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "z Visokim ID-jem" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Povezovanje" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Ni povezave" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Prenos dol:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Prenos gor:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Odjemalcev v vrsti:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Vseh virov:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Število rezultatov: %i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "V PRIHODNJE - prikaz poteka iskanja" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Prejet neznan odgovor od strežnika, OpCode = %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Prikaži kratke informacije o stanju." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "Prikaži stanje povezave, trenutne hitrosti prenosa gor/dol, itd.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Prikaži celotno statistično drevo." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"Neobvezno: kot argument tega ukaza lahko podate število v obsegu 0-255, ki " +"določa,\n" +"koliko različic odjemalca naj bo prikazanih v poddrevesu tipa odjemalcev.\n" +"Vrednost 0 ali izpuščen argument pomeni 'neomejeno'.\n" +"\n" +"Primer: 'statistics 5' bo prikazalo 5 najpogostejših različic vsakega tipa " +"odjemalca.\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "Zaustavi aMule." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Zaustavi oddaljeno jedro v teku (amule/amuled).\n" +"To bo zaustavilo tudi tekstovni odjemalec, saj je brez oddaljenega\n" +"jedra v teku neuporaben.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Ponovno naloži naveden objekt." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "Ponovno naloži seznam deljenih datotek." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "Ponovno naloži IP-Filtre iz datoteke." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Poveži se z omrežjem." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"Ta možnost bo vzpostavila povezavo z vsemi omrežji, omogočenimi v " +"nastavitvah.\n" +"Neobvezno: Lahko navedete naslov strežnika v obliki IP:Vrata,\n" +"za povezavo samo s tem strežnikom. IP mora biti s pikami ločen\n" +"decimalen naslov IPv4 ali razrešljivo ime DNS." + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Poveži se samo z ED2K." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Poveži se samo s Kad." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Prekini povezavo z omrežjem." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "To bo prekinilo povezavo z vsemi omrežji s katerimi ste povezani.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Prekini samo povezavo ED2K." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Prekini samo povezavo Kad." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Dodaj povezavo magnet ali povezavo ed2k v jedro." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"Dodana povezava ed2k je lahko:\n" +"*) datotečna povezava (ed2k://|datoteka|...), ki bo dodana na seznam " +"prenosov\n" +"*) strežniška povezava (ed2k://|strežnik|...), ki bo dodana na seznam " +"strežnikov\n" +"*) povezava do seznama strežnikov, vsi strežniki bodo dodani na seznam " +"strežnikov\n" +"\n" +"Povezava magnet mora vsebovati hash ed2k in velikost datoteke.\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Nastavitvi izbrano vrednost." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "Nastavi IP Filter." + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "Vključi filtriranje IP-jev za odjemalce in strežnike." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "Izključi filtriranje IP-jev za odjemalce in strežnike." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "Omogoči/Onemogoči filtriranje IP-jev za odjemalce." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "Vključi filtriranje IP-jev za odjemalce." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "Izključi filtriranje IP-jev za odjemalce." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "Omogoči/Onemogoči filtriranje IP-jev za strežnike." + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "Vključi filtriranje IP-jev za strežnike." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "Izključi filtriranje IP-jev za strežnike." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "Izberite stopnjo filtriranja IP-jev." + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "Veljavne stopnje filtriranja so od 0-255, privzeta stopnja je 127.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Nastavi omejitve povezave." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "Vrednost teh ukazov mora biti v kilobajtih/sek.\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Nastavi omejitev prenosa gor." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "Nastavi omejitev prenosa dol." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Dobi in prikaži vrednost nastavitve." + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "Dobi nastavitve filtriranja IP-jev." + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "Dobi stanje IP Filtra za odjemalce in strežnike." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "Dobi stanje IP Filtra samo za odjemalce." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "Dobi stanje IP Filtra samo za strežnike." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "Dobi stopnjo IP Filtra." + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Dobi omejitve prenosa." + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Začne iskanje." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"Vrsta iskanja mora biti navedena s sledečimi tipi:\n" +" GLOBAL (globalno)\n" +" LOCAL (krajevno)\n" +" KAD (kad)\n" +"Primer: search kad datoteka' bo izvršilo kad iskanje za \"datoteka\".\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Izvrši globalno iskanje." + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Izvrši krajevno iskanje." + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Izvrši kad iskanje." + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Prikaže rezultate zadnjega iskanja." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Vrne rezultate prejšnjega iskanja.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Začni prenašati datoteko" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"Navesti morate številko datoteke iz predhodnega iskanja.\n" +"Primer: ukaz 'download 12' bo dodal na seznam prenosov datoteko št. 12 iz " +"predhodnega iskanja.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Pavziraj prenos." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Nadaljuj prenos." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Prekliči prenos." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Nastavi prioriteto prenosa dol." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "" +"Nastavi prioriteto prenosa dol na 'Nizka', 'Normalna', 'Visoka' ali " +"'Samodejna'.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "Nastavi prioriteto na 'Nizka'." + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "Nastavi prioriteto na 'Normalna'." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "Nastavi prioriteto na 'Visoka'." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "Nastavi prioriteto na 'Samodejna'." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Prikaži čakalne vrste/seznam." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Prikaži čakalno vrsto prenosov gor/dol, seznam strežnikov ali deljenih " +"datotek.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Prikaži čakalno vrsto prenosov gor." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Prikaži čakalno vrsto prenosov dol." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Prikaži dnevnik." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Prikaži seznam strežnikov." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Ponastavi dnevnik." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() returned NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "Napaka: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "Opozorilo: %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Nov odjemalčev ID je %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "\tPo vsej verjetnosti ste za požarnim zidom ali usmerjevalnikom." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tZa več informacij se obrnite na http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "Prejete neznane informacije strežnika! - prekratke" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "Prejetih %d novih strežnikov" +msgstr[1] "Prejetih %d novih strežnikov" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Shranjevanje seznama strežnikov končano." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "Strežnik je zavrnil zadnji ukaz" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Nepravi paket prejet od strežnika: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "Napaka med obdelavo paketa iz strežnika: %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "Ni mogoče ustvariti niti za razrešitev DNS pri povezavi z %s" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "Strežnikov IP %s (%s) je filtriran. Ni povezave." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "z maskiranim protokolom." + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "Povezovanje z %s (%s - %s:%i) %s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "Ni mogoče razrešiti DNS za strežnik: %s: Povezava ni mogoča!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "" +"CIP2Country::CIP2Country(): Ni bilo mogoče naložiti podatkov o državah iz " + +#: src/IP2Country.cpp:73 +#, fuzzy, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "Naloženih %d slik zastav." +msgstr[1] "Naloženih %d slik zastav." + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"Ali ste prepričani, da želite preklicati prenos in zbrisati vse datoteke v " +"tej kategoriji?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Potrebna je potrditev" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Vse ostalo" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Nedokončano" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Aktivno" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Video" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Avdio" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Arhiv" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "Slike CD-jev" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Slike" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Besedilo" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Izberi filter prikaza" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Dodaj kategorijo" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Uredi kategorijo" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Odstrani kategorijo" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "Uvažanje %s: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "Branje mape začasnih datotek" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "Prenašanje splošnih informacij iz info-datoteke prenosa" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "Ustvarjanje ciljne datoteke" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "Nalaganje podatkov iz stare datoteke prenosa (%u od %u)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "Shranjevanje podatkovnega bloka v novo datoteko prenosa (%u od %u)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "Prenašanje informacij o izvirni datoteki prenosa" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "Dodajanje prenosa in shranjevanje nove delne datoteke" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Prenašanje stanja..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "Poteka" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Napaka: Ni dovolj prostora na disku" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Napaka: Ni mogoče najti delne datoteke" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Napaka: Vhodno/izhodna napaka!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Napaka: Ni uspelo!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "V vrsti" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Datoteka se že prenaša" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Neznan ali pokvarjen format začasne datoteke." + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Ime datoteke" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Stanje" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Hash datoteke" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Uvozi delne datoteke" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"Prosimo, izberite mapo za iskanje delnih prenosov! (vključene bodo tudi " +"podmape)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "Ali želite zbrisati izvirne datoteke uspešno uvoženih prenosov?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Ali želite odstraniti vire?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Čakanje..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (Disk: %s)" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "bajtov" +msgstr[1] "bajtov" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "bajtov/sek." +msgstr[1] "bajtov/sek." + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "sek." + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "min." + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "ur" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "dni" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Video" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Arhivi" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Besedila" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programi" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Vse" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Ni ocenjeno" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Neveljaven / Pokvarjen / Lažen" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Slabo" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Povprečno" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Dobro" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Odlično" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "vse" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "vse ostalo" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "Nalaganje datotek IP filtrov 'ipfilter.dat' in 'ipfilter_static.dat'." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "Ni bilo mogoče naložiti datoteke ipfilter.dat '%s', neznan format." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" +"Ni bilo mogoče naložiti datoteke ipfilter.dat '%s', datoteke ni mogoče " +"odpreti." + +#: src/IPFilter.cpp:330 +#, fuzzy, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "Naloženih %u nizov IP iz '%s'. %u nepravilnih vrstic izpuščenih." +msgstr[1] "Naloženih %u nizov IP iz '%s'. %u nepravilnih vrstic izpuščenih." + +#: src/IPFilter.cpp:332 +#, fuzzy, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "Naloženih %u nizov IP iz '%s'. %u nepravilnih vrstic izpuščenih." +msgstr[1] "Naloženih %u nizov IP iz '%s'. %u nepravilnih vrstic izpuščenih." + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Aktivne povezave (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Podrobnosti" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% končano" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "Povezava ED2K: " + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Izvrši" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "Kliknite tukaj, da dodate povezavo ed2k na seznam prenosov." + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "Prikaži okno z besedilom stanja" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Nalaganje ..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"Dogodki so prikazani tukaj. Za poln seznam dogodkov, poglejte v zapisnik v " +"zavihku Strežniki." + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Število uporabnikov na strežniku na katerega ste povezani ..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Uporabnikov: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" +"Št. uporabnikov povezanih na ta strežnik in približek celotnega števila " +"uporabnikov." + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"Trenutno povprečje prenosa v obe smeri. Če je vklopljen prikaz presežka, " +"številke v oklepaju ponazarjajo presežek prenosa od komunikacije med " +"uporabniki." + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"Prikazuje stanje povezave. Rdeče puščice pomenijo, da trenutno niste " +"povezani, rumene puščice pomenijo, da imate nizek ID (ste za požarnim zidom) " +"in zelene puščice pomenijo da imate visok ID (optimalna povezava)." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Ni povezave ..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Trenutno povezan strežnik." + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Iskanje" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Ime:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Krajevno" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Globalno" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "Hash datoteke" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Dodatni parametri" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Filtriranje" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Vrsta datoteke" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Končnica" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Min. velikost" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Bajtov" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Maks. velikost" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Razpoložljivost" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Filter:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Filtriraj rezultate" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Obraten rezultat" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Skrij znane datoteke" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Več" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "Poizvedi za več rezultatov na ED2K. Podpora za Kad še ne obstaja." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Ustavi" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Počisti polja" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Rezultati" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Počisti končane prenose" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Prikaže čakalno vrsto prenosov gor" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Uporabnikov v vrsti :" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Pošlji" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Pošlje navedeno sporočilo." + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Zapri" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Zapri to pogovorno sejo." + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Polno Ime :" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "N/A" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "Datoteka met :" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Hash :" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Velikost :" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Stanje delne datoteke :" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Nazadnje videno celotno: " + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Najdenih virov :" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Prenašajoči viri :" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Število delov :" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Razpoložljivih :" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Razmerje podatkov :" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Čas aktivnih prenosov dol: " + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Preneseno :" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Končano :" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Inteligentno Reševanje Napak" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Izguba zaradi napak :" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Pridobitev zaradi kompresije :" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "Paketi rešeni z I.R.N. :" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Imena datoteke" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Prevzemi" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Počisti" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Uporabi" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "V redu" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "Komentiraj/Oceni datoteko (besedilo bo vidno vsem uporabnikom)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"Za film lahko navedete zgodbo, dolžino, jezik ...\n" +"in če je lažen, lahko opozorite ostale uporabnike aMule." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Kakovost datoteke" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" +"Izberite oceno datoteke ali sporočite uporabnikom, če datoteka ni " +"veljavna ..." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Ni komentarjev" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Osveži" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Prenašanje, prosimo počakajte ..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Neznana velikost" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Zahtevane informacije" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "Naslov IP :" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Vrata :" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Dodatne informacije" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Uporabniško ime :" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Hash uporabnika :" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Ponovno naloži deljene datoteke" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Trenutna seja" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Skupno" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "Zahtevano :" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Aktivni prenosi gor :" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "Hitrost prenosa dol" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Trenutno" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Trenutno povprečje" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Povprečje seje" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Hitrost prenosa gor" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Povezave" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Aktivni prenosi dol" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Aktivne povezave (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Aktivni prenosi gor" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "Statistično drevo" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Uporabniško ime:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Hash uporabnika:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Program odjemalca:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Različica odjemalca:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "Naslov IP:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "ID uporabnika:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "IP strežnika:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Ime strežnika:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "Prenosi k/od uporabnika" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Trenutna zahteva:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Povprečni prenos gor:" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Povprečni prenos dol:" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Preneseno gor (seja):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Preneseno dol (seja):" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Preneseno gor (skupno):" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Preneseno dol (skupno):" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Točke" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "Gor/Dol količnik:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Varna identifikacija:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Ocena (skupna):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Točke čakalne vrste:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Splošne nastavitve" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Vzdevek" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - mula za Linux" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "To je ime, ki ga vidijo ostali uporabniki, ko se povežejo z vami." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Jezik" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "To določa jezik programa." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Razne možnosti" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Ob zagonu preveri za novo različico" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" +"Ob vklopu te možnosti, bo aMule ob vsakem zagonu preveril za novo različico " +"programa." + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Zaženi pomanjšano" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "Vklop te možnosti pomanjša aMule ob zagonu." + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Opozori ob izhodu." + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "aMule prikaže opozorilo ob izhodu." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Prikaži ikono v sistemski vrstici." + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "Vklopi/Izklopi ikono v sistemski vrstici." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "Pomanjšaj v sistemsko vrstico" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" +"Ob vklopu te možnosti se bo aMule pomanjšal v sistemsko vrstico, namesto v " +"opravilno vrstico." + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "Zakasnitev v sek. pri prikazu namigov" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "Zakasnitev preden se pojavi namig z navodili." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Izbira brskalnika" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Tu izberite svoj brskalnik" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Ročna nastavitev:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Tu navedite ime vašega brskalnika. Da ga boste lahko uporabili, izberite " +"'Ročno' v zgornjem meniju." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Odpri v novem zavihku, če je mogoče" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "Če je mogoče, odpre stran v novem zavihku namesto v novem oknu." + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Omejitve povezave" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Prenos gor" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Hitrost prenosa za eno mesto" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Zmožnosti povezave" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Vrata TCP standardnega odjemalca:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "To so standardna vrata ED2K in jih ni mogoče onemogočiti." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Vrata UDP razširjenega odjemalca:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" +"Ta vrata UDP se uporabljajo za razširjene zahteve ED2K in za omrežje Kad." + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "onemogoči" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Naslov za vezavo" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "Vrata UDP za razširjene zahteve strežnika (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Maks. število virov na datoteko" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Zgornja meja" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Omejitve povezave" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Največ povezav" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Univerzalen 'Plug and Play'" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "Omogoči UPnP" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "Vrata UPnP TCP:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Samodejno poveži ob zagonu" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Ponovno poveži ob prekinjeni povezavi" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Prikaži presežek prenosa" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Strežniške možnosti" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Zbriši nedosegljiv strežnik po" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "poskusih" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Samodejno posodobi seznam strežnikov ob zagonu" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Seznam" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Posodobi seznam strežnikov ob povezavi s strežnikom" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Posodobi seznam strežnikov ob povezavi z odjemalcem" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Uporabi sistem prioritete" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Uporabi preverjanje za Nizek ID ob povezavi" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Varno povezovanje" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Samodejna povezava samo s strežniki na statičnem seznamu." + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Nastavi ročno dodane strežnike na visoko prioriteto" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "I.R.N. aktiven" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICH zaupa vsakemu hashu (ni priporočeno)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Na novo dodani prenosi naj bodo na premoru" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Na novo dodani prenosi naj imajo avtoprioriteto" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "Najprej poskusi prenesti prvi in zadnji del" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Nove deljene datoteke naj imajo avtoprioriteto" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Poskušaj pošiljati cele dele vsem odjemalcem" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Ob končanem prenosu začni prenašati naslednjo datoteko na premoru" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "Iz iste kategorije" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "Shrani 10 virov pri redkih datotekah (< 20 virov)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Prostor na disku" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Preveri prostor na disku" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "" +"Vklopite to, če želite, da aMule preverja ali je na disku dovolj prostora" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "Min. prostora na disku: " + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Tu vnesite min. želen prostor na disku." + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Imenik prihajajočih datotek :" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Imenik začasnih datotek :" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Deljeni imeniki" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "(Desni klik na ikono mape izbere tudi podmape)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Deli skrite datoteke" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Video predvajalnik" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Ustvari varnostno kopijo za predogled" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Grafi" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Zamik posodabljanja : 5 sek." + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Čas za graf trenutnega povprečja : 100 min." + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Merilo za graf povezav: 100 " + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "Izberi barve za statistiko" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Ozadje" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Mreža" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Trenuten prenos dol" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Povprečje za prenos dol" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Povprečje seje za prenos dol" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Trenuten prenos gor" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Povprečje za prenos gor" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Povprečje seje za prenos gor" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Aktivne povezave" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Merilnik hitrosti v sistemski vrstici" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Trenutna vozlišča Kad" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "Vozlišča Kad v teku" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Vozlišča Kad te seje" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Izberi" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Število prikazanih različic odjemalcev (0=neomejeno)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Obvestila" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "Pojavno okno za sporočila" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Uporabi zvok" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Obvesti ob :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Nov vnos v dnevniku" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Začetek nove pogovorne seje" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Sprejeto je novo pogovorno sporočilo" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Prenos je dodan ali se je končal" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Na voljo je nova različica aMule" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "Urgenten OOD, prekinjena povezava s strežnikom" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "Obvestilo po e-pošti" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Pošlji e-pošto ob končanem prenosu." + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "Strežnik SMTP :" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "E-poštni naslov :" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! OPOZORILO !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Ne spreminjajte teh nastavitev, razen če dobro\n" +"veste kaj počnete. V nasprotnem primeru lahko\n" +"hitro zadeve poslabšate.\n" +"\n" +"aMule bo deloval dobro tudi brez\n" +"spreminjanja teh nastavitev." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "Napredne nastavitve" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "Maks. novih povezav / 5 sek." + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Velikost datotečnega predpomnilnika: 240000 bajtov" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Velikost vrste prenosov gor: 5000 odjemalcev" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Interval med osvežitvama povezave na strežnik: onemogoči" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "Prilagoditve vmesnika" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Napredek prenosov dol" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Prikaži odstotke" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Prikaži vrstico napredka " + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "Slog vrstice napredka" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Plosko" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Zaokroženo" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Podpora preoblekam" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Omogoči preobleke " + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Preobleka:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr " - nič preoblek na voljo -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Razvrščanje stolpcev" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "Samodejno razvrsti dat. v vrsti prenosov (visoka poraba CPU)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "aMule bo samodejno razvrstil datoteke na vašem seznamu ponosov." + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Razne prilagoditve vmesnika" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Prikaži Hiter upravljalec povezav ED2K" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Prikaži razširjene informacije na zavihkih kategorij" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Prikaži hitrosti prenosa v naslovu" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Usmeri orodjarno navpično" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "Pred imenom datoteke prikaži ime .part datoteke" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Oddaljeno upravljanje" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Parametri spletnega strežnika" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Zaženi amuleweb ob zagonu" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Vrata spletnega strežnika" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "Vklopi preusmerjanje vrat UPnP za vrata spletnega strežnika" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Vrata UPnP TCP spletnega strežnika" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Čas med osvežitvami strani (v sek.)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Omogoči gzip kompresijo" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Omogoči uporabnika z nizkimi pravicami" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Geslo za vse pravice" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Geslo za nizke pravice" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Spletna predloga" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Parametri za zunanje povezave" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Sprejmi zunanje povezave" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"IP poslušalnega vmesnika\n" +"(prazno za vse)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Tu vnesite veljaven IP v formatu a.b.c.d za poslušalen vmesnik EC. Prazno " +"polje ali 0.0.0.0 pomeni katerikoli vmesnik." + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "Vrata TCP" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "Vklopi preusmerjanje vrat UPnP za vrata zunanjih povezav" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "Kliknite tukaj za uveljavitev sprememb v nastavitvah." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Razveljavi vse spremembe v nastavitvah." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Naslov :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Komentar :" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Imenik prihajajočih dat. :" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Spremeni prioriteto novo dodeljenim datotekam :" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Ne spremeni" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Izberi barvo za to kategorijo (trenutno izbrano) :" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Pokaži 'motd' strežnika ob povezavi ..." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Info. strežnika" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Kliknite tukaj, da počistite dnevnik." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "aMule dnevnik" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "Kliknite tukaj za posodobitev seznama strežnikov iz URL-ja ..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Seznam strežnikov" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Vnesite URL do server.met datoteke in pritisnite gumb na levi, da posodobite " +"seznam strežnikov." + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Ročno dodajanje strežnika : Ime" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Tukaj vnesite ime strežnika" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Tukaj vnesite IP strežnika v x.x.x.x formatu." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Tukaj vnesite vrata strežnika." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "Ročno dodaj strežnik (najprej izpolnite vsa polja) ..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "Info. o ED2K" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Info. o Kad" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"Izgleda, da izbrana področna nastavitev ni nameščena na vašem računalniku.\n" +"Morate jo ustvariti, če bi radi uporabljali ta jezik.\n" +"V Linuxu si za začetek oglejte datoteko /etc/locale.gen in paket 'locales'.\n" +"Veliko sreče!\n" +"(Opomba: vseeno bo nastavljena)" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Tega sporočila ne kaži več" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "Kliknite tukaj za posodobitev seznama vozlišč iz URL-ja ..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Vozlišča (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"Vnesite URL do datoteke nodes.dat in pritisnite gumb na levi za posodobitev " +"seznama vozlišč." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Statistika vozlišč" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Začetno nalaganje" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Novo vozlišče" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Vrata:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Naloži od znanih \n" +"odjemalcev" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Prekini Kad" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Maskiranje protokola" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Omogoči maskiranje protokola" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"Ob vklopu te možnosti, bo aMule sprejemal maskirane povezave od drugih " +"odjemalcev." + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Uporabi maskiranje za odhajajoče povezave" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"Ob vklopu te možnosti, bo aMule uporabil maskiranje pri povezavi z drugimi " +"odjemalci in s strežniki." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Dovoli samo maskirane povezave" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"Ob vklopu te možnosti, bo aMule sprejemal samo maskirane povezave. Imeli " +"boste manj virov, vendar bodo vse povezave maskirane." + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Nastavitve datotek" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Vsi" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Nihče" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Kdo lahko vidi deljene datoteke:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "Izberite, kdo lahko vidi vaš seznam deljenih datotek." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "Filtriranje IP-jev" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Filtriraj odjemalce" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Omogoči filtriranje odjemalčevih IP-jev, določenih v datoteki ~/.aMule/" +"ipfilter.dat." + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Filtriraj strežnike" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"Omogoči filtriranje strežnikovih IP-jev, določenih v datoteki ~/.aMule/" +"ipfilter.dat." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Ponovno naloži seznam" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "Ponovno naloži seznam IP-jev za filtriranje iz ~/.aMule/ipfilter.dat." + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Posodobi zdaj" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Samodejno posodobi IP Filter ob zagonu" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Stopnja filtriranja:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Vedno filtriraj LAN IP-je" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Paranoično rokovanje z ne-ujemajočimi IP-ji" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Zavrne paket, če se odjemalčev IP razlikuje od IP-ja kjer paket izvira. " +"Bodite pazljivi pri uporabi te možnosti." + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Omogoči/Onemogoči" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Omogoči Spletni podpis" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Omogoči pisanje v datoteko SP, katero lahko uporabljajo zunanji programi za " +"izdelavo podpisov in podobnih stvari." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Frekvenca posodobitve (sek.):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "Spremeni frekvenco (v sekundah) posodobitev Spletnega podpisa." + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Imenik za Spletni podpis:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" +"Kliknite tukaj, da nastavite imenik, ki vsebuje datoteke za Spletni podpis." + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Onemogoči/Omogoči" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "Filtriraj prihajajoča sporočila (razen v trenutnem pogovoru):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Možnosti filtriranja: " + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Filtriraj vsa sporočila" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Filtriraj sporočila vseh, ki niso na seznamu prijateljev" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Filtriraj sporočila neznanih uporabnikov" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Filtriraj sporočila, ki vsebujejo (uporabi ',' kot ločilnik):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"Tu dodajte besede ki jih naj aMule filtrira, vključno s sporočili v katerih " +"se nahajajo." + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Komentarji" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Omogoči proksi" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Omogoči/Onemogoči podporo za proksi" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Tip proksija:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "Tip proksija na katerega se hočete povezati" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Proksi gostitelj:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "Ime gostitelja proksi strežnika" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Proksi vrata:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "Vrata proksi strežnika" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Overjanje" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Omogoči overjanje" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Omogoči/Onemogoči overjanje uporabniškega imena/gesla" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "Uporabniško ime za povezavo s proksijem" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Geslo:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "Geslo za povezavo s proksijem" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Samodejna povezava s strežnikom brez proksija" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Poveži se z:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Poveži se z oddaljenim aMule" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Uporabniško ime" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Zapomni si te nastavitve" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Omogoči zgovorno beleženje odpravljanja napak." + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "Kategorije sporočil:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "Dodaj uvoze" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Ponovno poskusi izbrane" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Odstrani izbrane" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Vrste dogodkov" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Poveži se s katerimkoli strežnikom in/ali s Kad" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Nova kategorija" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Izberite mapo za prihajajoče datoteke" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Navesti morate ime za kategorijo!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Navesti morate pot za kategorijo!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"Ni bilo mogoče ustvariti imenika prihajajočih datotek za kategorijo. " +"Prosimo, navedite veljavno pot!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "Neznana končnica '%s' za ukaz '%s'.\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "Neznan ukaz '%s'.\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"Ta ukaz nima argumentov.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"Ta ukaz mora imeti argument.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Ta ukaz je nepopoln, uporabiti morate enega od spodaj navedenih dodatnih " +"ukazov.\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Razpoložljivi ukazi:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Ukazi, ki so na voljo:\n" + +#: src/ExternalConnector.cpp:188 +#, fuzzy, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"Ukazi niso občutljivi na velike in male začetnice.\n" +"Napišite 'help ' za podrobne informacije o .\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Izhod iz programa." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Prikaži pomoč." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"Za pomoč pri ukazu napišite 'help '.\n" +"Za celoten seznam ukazov napišite 'help'.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"Uporabite '%s' za seznam ukazov\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Napaka v sintaksi!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Napaka pri obdelavi ukaza - se ne bi smelo zgoditi! Prosimo, poročajte o " +"hrošču.\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Ta ukaz ne sme imeti parametrov." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Ta ukaz mora imeti parameter." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Neveljaven argument." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Ukaz ni popoln." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Napišite '%s' za dodatno pomoč.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "To je %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "To je %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Ustvarjanje odjemalca...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "" +"Povezava ni uspela. Ni se bilo mogoče povezati z navedenim gostiteljem\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"V redu, zapuščanje %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"Ne morete se povezati s praznim geslom.\n" +"Vnesti morate geslo v nastavitveni datoteki,\n" +"ukazni vrstici ali pa ko boste vprašani za geslo.\n" +"\n" +"Zapuščanje...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Prikaži to besedilo pomoči." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "Gostitelj kjer teče aMule. (privzeto: localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "Vrata aMule za zunanje povezave. (privzeto: 4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Geslo za zunanje povezave." + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Preberi nastavitve iz datoteke." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "Ne napiši izhodnih podatkov v stdout." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Zgovorno - prikaži tudi razhroščevalna sporočila." + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Nastavi področne nastavitve (jezik) programa." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "Zapiši možnosti ukazne vrstice v nastavitveno datoteko." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "" +"Ustvari nastavitveno datoteko, ki temelji na nastavitveni datoteki aMule." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Izpiši različico programa." + +#: src/ClientCreditsList.cpp:168 +#, fuzzy, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "Datoteka s krediti naložena, %u znanih odjemalcev" +msgstr[1] "Datoteka s krediti naložena, %u znanih odjemalcev" + +#: src/ClientCreditsList.cpp:171 +#, fuzzy, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] " - Krediti potekli za %u odjemalcev!" +msgstr[1] " - Krediti potekli za %u odjemalcev!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "Datoteka 'cryptkey.dat' ne obstaja. Ustvarjanje." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"NAPAKA: Ne morete uporabljati demona aMule, ko so zunanje povezave " +"onemogočene. Za vklop zunanjih povezav uporabite ali navaden aMule ali " +"zaženite amuled z možnostjo --ec-config ali pa nastavite vrednost ključa" +"\"AcceptExternalConnections\" na 1 v datoteki ~/.aMule/amule.conf" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "NAPAKA: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Dovoli nazaj" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Prikaži prenose gor" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Prikaži čakalno vrsto" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Prikaži odjemalce" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Izberi pogled" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Program odjemalca" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Čakal" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Čas prenosa gor" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Preneseno gor/dol" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Oddaljeno stanje" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "QR: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Prioriteta datoteke" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Točke" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Zahteval" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Nazadnje viden" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Vstopil v vrsto" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Stanje prenosa gor" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Prenesel gor" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Stanje prenosa dol" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Prenesel dol" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Hash uporabnika" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Maskiranje" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Skrite deljene datoteke" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Podrobnosti o odjemalcu" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Ni podprt" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Nedokončano" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Baraba" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Preverjeno - V redu" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Ni na voljo" + +#: src/ClientDetailDialog.cpp:190 +#, fuzzy, c-format +msgid "%u (QR: %u)" +msgstr "QR: %u" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" +"Min. velikost mora biti manjša kot maks. velikost. Maks. velikost ni " +"upoštevana." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Opozorilo iskanja" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Neomejeno" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "aMule meni sistemske vrstice" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Omejitve hitrosti:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "Gor: brez" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "Gor: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "Dol: brez" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "Dol: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Prenos dol: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Prenos gor: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Informacije o odjemalcu" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Vzdevek: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "Vzdevek ni izbran!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "Odjemalčev ID: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Ime strežnika: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "IP strežnika: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "Vrata TCP: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "Vrata TCP: Niso pripravljena" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "Vrata UDP: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "Vrata UDP: Niso pripravljena" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Spletni podpis: Omogočen" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Spletni podpis: Onemogočen" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Deljenih datotek: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Odjemalcev v vrsti: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "Skupno dol: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "Skupno gor: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Omejitev gor" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Omejitev dol" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "Skrij aMule" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "Prikaži aMule" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "Pogovorna seja se je začela: %s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Povezan z odjemalcem ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** Povezovanje z odjemalcem ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Povezava z odjemalcem ni uspela / povezava izgubljena ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Zapri zavihek" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Zapri vse zavihke" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Zapri ostale zavihke" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "Nalaganje datoteko server.met: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "Ni bilo mogoče najti datoteke server.met!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "Ni bilo mogoče naložiti datoteke server.met '%s', neznan format." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "Ni bilo mogoče odpreti server.met!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" +"Datoteke server.met je pokvarjena, napačen zaznamek različice " +"('versiontag'): 0x%x, velikost %i" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "%i najdenih strežnikov v server.met" +msgstr[1] "%i najdenih strežnikov v server.met" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d strežnikov dodanih" +msgstr[1] "%d strežnikov dodanih" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Strežnik ni bil dodan: [%s:%d] nima navedenih veljavnih vrat." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "Strežnik ni bil dodan: [%s:%d] IP je filtriran ali neveljaven." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" +"Strežnik ni bil dodan: Strežnik z IP:vrata [%s:%d] že obstaja na seznamu." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Strežnik dodan: Strežnik na [%s:%d], z imenom '%s'." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"Povezani ste s strežnikom, ki ga hočete izbrisati. Prosim, najprej prekinite " +"povezavo." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Ni bilo mogoče shraniti server.met!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "Neveljaven URL" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "Ni bilo mogoče prenesti seznama strežnikov iz %s" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"V addresses.dat ni naslova do seznama strežnikov. Prosim, prilepite veljaven " +"naslov do seznama strežnikov v to datoteko, da bo možna samodejna " +"posodobitev seznama." + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" +"Opozorilo: naveden je neveljaven URL za samodejno posodabljanje strežnikov: %" +"s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" +"V addresses.dat ni veljavnega server.met URL-ja za samodejno posodabljanje." + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"IP Filter je filtriral krajevni strežnik. Povezovanje z drugim strežnikom!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "Ni bilo mogoče izvesti ukaza '%s' za dogodek '%s'." + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"Vaše področne nastavitve so bile spremenjene na sistemsko privzete zaradi " +"spremembe v nastavitvah. Oprostite." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"Na seznamu strežnikov nimate nobenega strežnika.\n" +"Ali želite, da aMule zdaj prenese nov seznam?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Prenos seznama strežnikov" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "Spletni strežnik uporablja pid %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"Zahtevali ste vklop Spletnega strežnika ob zagonu, vendar binarnega programa " +"amuleweb ni mogoče zagnati. Prosim, namestite paket, ki vsebuje aMule " +"Spletni strežnik ali pa prevedite aMule z --enable-webserver in zaženite " +"make install" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "Vrata %u niso dosegljiva. Imeli boste Nizek ID\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"Vrata %u niso dosegljiva!\n" +"\n" +"To pomeni, da boste imeli Nizek ID.\n" +"\n" +"Preverite omrežje in se prepričajte, da so vhodna in izhodna vrata odprta." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Ni bilo mogoče ustvariti datoteke Spletnega podpisa" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "Ni bilo mogoče ustvariti aMule datoteke Spletnega podpisa" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"Zgleda, da izbrana področna nastavitev ni nameščena na vašem računalniku. " +"(Opomba: Vseeno bo nastavljena)" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "To je vaš prvi zagon aMule %s" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "To je testna različica, posodobljena dnevno in\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "" +"ne dajemo zagotovila, da ne bo ničesar poškodovala, zažgala vaše hiše \n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "ali ubila vašega psa. Vendar bi vseeno morala biti varna za uporabo.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" +"Naslednje nastavitve so bile spremenjene v tej različici iz varnostnih " +"razlogov:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* Vklop maskiranja protokola za prihajajoče in odhajajoče povezave.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* Izklop posodobitev seznama strežnikov ob povezavi s strežnikom in z " +"odjemalcem.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"Za več informacij o razlogih za te spremembe, preiščite wiki\n" +"na http://wiki.amule.org za informacije o \"lažnih strežnikih\".\n" +"Za pravilno delovanje aMule je zelo pomembno, da odstranite vse lažne " +"strežnike iz seznama strežnikov." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "" +"Več informacij, podporo in nove različice, lahko najdete na naši domači " +"strani,\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" +"na www.aMule.org, ali na kanalu IRC #aMule, na strežniku irc.freenode.net.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Morebitne hrošče lahko sporočite na http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"Mapa za Spletni podpis, ki ste jo navedli, je NEVELJAVNA!\n" +"Spletni podpis bo ONEMOGOČEN, dokler težave ne odpravite v nastavitvah." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "NAPAKA: Ni mogoče odpreti dnevniške datoteke" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "OPOZORILO: Dnevniška datoteka je prazna. Nekaj je narobe." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Dnevnik počiščen." + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "Sporočilo strežnika: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Ni bilo mogoče prenesti seznama vozlišč." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Ni bilo mogoče odpreti datoteke za preverjanje različice" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Datoteka za preverjanje različice je pokvarjena" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Uporabljate zastarelo različico aMule!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "" +"Različica vaše aMule je %i.%i.%i, najnovejša različica pa je %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "Najnovejšo različico lahko vedno najdete na http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "OPOZORILO: Vaša različica aMule je zastarela: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "Uporabljate najnovejšo različico." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Ni bilo mogoče prenesti datoteke za preverjanje različice" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Povezan z %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Povezovanje z %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Povezava z ED2K prekinjena" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad zagnan." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad ustavljen." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Povezan s Kad (V redu)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Povezan s Kad (za požarnim zidom)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Povezava s Kad prekinjena" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"Omrežja Kad ni mogoče uporabljati, če so vrata UDP onemogočena v " +"nastavitvah. Kad ni zagnan." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Omrežje Kad je onemogočeno v nastavitvah. Ni povezave." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "Ni bilo mogoče odpreti datoteke prijateljev 'emfriends.met' za branje!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "" +"Ni bilo mogoče odpreti datoteke prijateljev 'emfriends.met' za pisanje!" + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "" +#~ "V oddaljenem vmesniku še ni mogoče izvesti začetnega nalaganja iz " +#~ "določenega IP-ja." + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "V oddaljenem vmesniku še ni mogoče posodobiti server.met" + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "Prebranih %u stikov Kad" +#~ msgstr[1] "Prebranih %u stikov Kad" + +#~ msgid "Disconnect from " +#~ msgstr "Prekini povezavo z" + +#~ msgid "current server" +#~ msgstr "trenutnim strežnikom" + +#~ msgid " and " +#~ msgstr "in" + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "Prekini povezavo s strežnikom in/ali Kad" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "TCP Flags" +#~ msgstr "Zastavice TCP" + +#~ msgid "UDP Flags" +#~ msgstr "Zastavice UDP" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "Kopiraj povezavo ED2k v odložišče" + +#~ msgid "Client requests %u" +#~ msgstr "Zahteve odjemalcev %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "Datotečni blok %u-%u (%d bajtov):" + +#~ msgid "Client request is invalid!" +#~ msgstr "Zahteva odjemalca ni veljavna!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "Zahteva odjemalca ni veljavna! %i / %i" + +#~ msgid "Command: %s" +#~ msgstr "Ukaz: %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "Ni mogoče odpreti datoteke %s - uporabljena bo datoteka %s." + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "Opozorilo: known.met ne obstaja." + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles: Odstranjevanje %s iz seznama deljenih " +#~ "imenikov: imenika ni mogoče najti." + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "Čakanje na končanje podprocesa je spodletelo." + +#~ msgid "" +#~ "You cannot connect to a release version from an arbitrary CVS version! " +#~ "*sigh* possible crash prevented" +#~ msgstr "" +#~ "Ne morete se povezati z uradno različico iz poljubne CVS različice! " + +#~ msgid "doesn't work" +#~ msgstr "ne dela" + +#~ msgid "remote gui" +#~ msgstr "oddaljen vmesnik" + +#~ msgid "" +#~ "Error: Failed to load backup file. Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Napaka: Varnostne datoteke ni mogoče naložiti. Preiščite http://forum." +#~ "amule.org za reševanje .part.met datotek." + +#~ msgid "" +#~ "Error: Backup part.met file is 0 size! Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "Napaka: Velikost varnostne kopije part.met je 0! Preiščite na http://" +#~ "forum.amule.org za reševanje .part.met datotek." + +#~ msgid "Error: part.met backup file is 0 size: %s ==> %s" +#~ msgstr "Napaka: Velikost varnostne kopije od part.met je 0: %s ==> %s" + +#~ msgid "" +#~ "Note: These values are\n" +#~ " only used for statistics." +#~ msgstr "" +#~ "Opomba: Te vrednosti\n" +#~ "vplivajo samo na statistiko." + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ " 'All-Platform P2P odjemalec, ki temelji na eMule \n" +#~ "\n" +#~ " Domača stran: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " Pogosta vprašanja: http://wiki.amule.org \n" +#~ "\n" +#~ " Stik: admin@amule.org (administrativna vprašanja) \n" +#~ " Avtorske pravice (C) 2003-2006 aMule Team \n" +#~ "\n" +#~ " Del aMule temelji na \n" +#~ " 'Kademlia: Peer-to-peer routing', ki temelji na metriki XOR.\n" +#~ " Avtorske pravice (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "OPOZORILO: Imate Nizek ID!" + +#~ msgid "This command requieres an argument. Valid arguments: a file hash.\n" +#~ msgstr "Ta ukaz potrebuje argument. Veljavni argumenti: hash datoteke.\n" + +#~ msgid "Deprecated command, now 'Status'." +#~ msgstr "Zastarel ukaz, uporabite 'Status'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Status' instead.\n" +#~ msgstr "" +#~ "Ta ukaz je zastarel in bo v prihodnosti odstranjen.\n" +#~ "Namesto njega uporabite 'Status'.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter'." +#~ msgstr "Zastarel ukaz, uporabite 'Set IPFilter'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter' instead.\n" +#~ msgstr "" +#~ "Ta ukaz je zastarel in bo v prihodnosti odstranjen.\n" +#~ "Namesto njega uporabite 'Set IPFilter'.\n" + +#~ msgid "Deprecated command, now 'Get IPFilter Level'." +#~ msgstr "Zastarel ukaz, uporabite 'Get IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Ta ukaz je zastarel in bo v prihodnosti odstranjen.\n" +#~ "Namesto njega uporabite 'Get IPFilter Level'.\n" + +#~ msgid "Deprecated command, now 'Set IPFilter Level'." +#~ msgstr "Zastarel ukaz, uporabite 'Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Ta ukaz je zastarel in bo v prihodnosti odstranjen.\n" +#~ "Namesto njega uporabite 'Set IPFilter Level'.\n" + +#~ msgid "Deprecated command, now 'Get/Set IPFilter Level'." +#~ msgstr "Zastarel ukaz, uporabite 'Get/Set IPFilter Level'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get/Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "Ta ukaz je zastarel in bo v prihodnosti odstranjen.\n" +#~ "Namesto njega uporabite 'Get/Set IPFilter Level'.\n" + +#~ msgid "Deprecated command, now 'Show Servers'." +#~ msgstr "Zastarel ukaz, uporabite 'Show Servers'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Show Servers' instead.\n" +#~ msgstr "" +#~ "Ta ukaz je zastarel in bo v prihodnosti odstranjen.\n" +#~ "Namesto njega uporabite 'Show Servers'.\n" + +#~ msgid "Deprecated command, now 'Get BwLimits'." +#~ msgstr "Zastarel ukaz, uporabite 'Get BwLimits'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get BwLimits' instead.\n" +#~ msgstr "" +#~ "Ta ukaz je zastarel in bo v prihodnosti odstranjen.\n" +#~ "Namesto njega uporabite 'Get BwLimits'.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Up'." +#~ msgstr "Zastarel ukaz, uporabite'Set BwLimit Up'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Up' instead.\n" +#~ msgstr "" +#~ "Ta ukaz je zastarel in bo v prihodnosti odstranjen.\n" +#~ "Namesto njega uporabite 'Set BwLimit Up'.\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Down'." +#~ msgstr "Zastarel ukaz, uporabite 'Set BwLimit Down'." + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Down' instead.\n" +#~ msgstr "" +#~ "Ta ukaz je zastarel in bo v prihodnosti odstranjen.\n" +#~ "Namesto njega uporabite 'Set BwLimit Down'.\n" + +#~ msgid "Syncronization thread started." +#~ msgstr "Zagon sinhronizacijske niti." + +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "Glavni hashi znanih datotek so bili naloženi." + +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "Napaka med branjem stikov Kad - 0 vnosov" + +#~ msgid "Merge attempt" +#~ msgstr "Poizkus spajanja" + +#~ msgid "Recursive merge" +#~ msgstr "Rekurzivno spajanje" + +#~ msgid "Sucessful merge!" +#~ msgstr "Spajanje uspešno!" + +#~ msgid "No merge possible" +#~ msgstr "Spajanje ni mogoče" + +#~ msgid "Buddy address: " +#~ msgstr "Naslov kolega: " + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid " %d" +#~ msgstr " %d" + +#~ msgid ".%d" +#~ msgstr ".%d" + +#~ msgid "Shows the process of a search." +#~ msgstr "Prikaže postopek iskanja." + +#~ msgid "Shows the process of a search..\n" +#~ msgstr "Prikaže postopek iskanja..\n" + +#~ msgid "Search warning." +#~ msgstr "Opozorilo iskanja." + +#~ msgid "Client Identification:" +#~ msgstr "Identifikacija odjemalca:" + +#~ msgid "Use Secure Identification" +#~ msgstr "Uporabi Varno identifikacijo" + +#~ msgid "" +#~ "Secure Identification uses a handshake approch to safely identify clients " +#~ "for use with the credit system." +#~ msgstr "" +#~ "Varna identifikacija se uporablja za overjanje med odjemalci za varno " +#~ "uporabo sistema s krediti." + +#~ msgid "Sources Dropping" +#~ msgstr "Opuščanje virov" + +#~ msgid "Source Dropping" +#~ msgstr "Opuščanje virov" + +#~ msgid "Keep sources" +#~ msgstr "Ohrani vire" + +#~ msgid "Drop sources" +#~ msgstr "Opusti vire" + +#~ msgid "Send sources to any other file before dropping (High CPU)" +#~ msgstr "Pošlji vire k drugim datotekam pred opuščanjem (visoka poraba CPU)" + +#~ msgid "Sources with no needed file-parts." +#~ msgstr "Viri brez potrebnih delov za datoteko." + +#~ msgid "Full Queue Sources Handling" +#~ msgstr "Upravljanje z viri s polno vrsto" + +#~ msgid "Enable auto drop Full Queue Sources" +#~ msgstr "Omogoči avtomatsko opuščanje virov s polno vrsto" + +#~ msgid "High Queue Rating Sources Handling" +#~ msgstr "Upravljanje z viri z visokim mestom v vrsti" + +#~ msgid "Enable auto drop High Queue Rating Sources" +#~ msgstr "Omogoči opuščanje virov z visokim mestom v vrsti" + +#~ msgid "High Queue Rating value" +#~ msgstr "Opusti vir pri tem mestu" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(Min. 300 / Maks. 3000)" + +#~ msgid "Auto Drop Sources Timer" +#~ msgstr "Merilnik časa za samodejno opuščanje virov" + +#~ msgid "Timer (in secs)" +#~ msgstr "Merilnik časa (v sek.)" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(Min. 60 / 3600 Maks.)" + +#~ msgid "Drop No Needed Sources now" +#~ msgstr "Opusti vse nepotrebne vire" + +#~ msgid "Drop Full Queue Sources now" +#~ msgstr "Opusti vire s polno vrsto" + +#~ msgid "Drop High Queue Rating Sources now" +#~ msgstr "Opusti vire z visokim mestom v vrsti" + +#~ msgid "Clean Up Sources now (NNS, FQS && HQRS)" +#~ msgstr "Počisti vire (NNS, FQS && HQRS)" + +#~ msgid "English (U.S.)" +#~ msgstr "angleški (US)" + +#~ msgid "Spanish (Mexican)" +#~ msgstr "španski (mehiški)" diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 00000000..f327bb6d --- /dev/null +++ b/po/sv.po @@ -0,0 +1,6969 @@ +# Swedish tranlation for aMule +# Copyright (C) 2007 Free Software Foundation, Inc. +# This file is distributed under the same license as the amule package. +# Daniel Nylander , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: aMule\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2007-03-12 22:49+0100\n" +"Last-Translator: Daniel Nylander \n" +"Language-Team: Swedish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "" + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Lyckades! Anslutning etablerad till aMule " + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Lyckades! Anslutning etablerad." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Färdig" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Pausad" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Hämtar" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Väntar" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "" + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "VARNING: Misslyckades med att ta bort %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Okänd" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (Fake eMule version %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (Fake eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (Fake eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (baserad på eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Smeknamn: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, c-format +msgid "Requested: %s\n" +msgstr "" + +#: src/BaseClient.cpp:1878 +#, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +msgstr[1] "" + +#: src/BaseClient.cpp:1881 +#, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +msgstr[1] "" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Användarnamn" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Vänner" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "Visa &detaljer" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Lägg till en vän" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Ta bort vän" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "Skicka &meddelande" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Visa filer" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Är du säker på att du vill ta bort alla servrar?" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Är du säker på att du vill ta bort alla servrar?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "Avbryt" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Filnamn" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Storlek" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Typ" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Prioritet" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Utdelningsratio" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Utdelade filer" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Mycket låg" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Låg" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normal" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Hög" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Mycket hög" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Utgåva" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Auto" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Byt namn" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "Kopiera ED2k-&länk till urklipp" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Varning" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Utdelade filer (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Ange nytt namn för den här filen:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "" + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "" + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "" + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "" + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Webbserver: Startad\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "" + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Kontrollerar lösenord\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "" + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "" + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "UPnP-port" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Använd gzip-komprimering" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Gästlösenord för webbserver" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Inte tillgänglig" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Aldrig" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Hämtar..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Inställningar" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Bläddra" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Användare" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Lösenord" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Validera" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Välkommen!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Nollställ" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "System" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "Om wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Oh Oh, aMule kör inte..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule kör" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule kör men är frånkopplad" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule ansluter..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Oh oh, status för aMule är okänd..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " har kört i " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " är stoppad !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " är inte ansluten!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " ansluter..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " gör någonting konstigt, kontrollera det!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " är ansluten till " + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr " Kad: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "ok" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "brandvägg" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "av" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " är på " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +#, fuzzy +msgid " with " +msgstr "] med " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "" + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "HighID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "LowID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Inte ansluten" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "Avbruten!" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "Kunde inte öppna %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Lägg till" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Ta bort" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Töm" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Spara" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Kopiera till urklipp" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Avsluta" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "Om aLinkCreator" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Kunde inte öppna" + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Hashar..." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "Klar om %.2f s" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Vänta..." + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Auto [Lå]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Auto [No]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Auto [Hö]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Ansluter" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Ansluter via server" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Överför" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "För många anslutningar" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Ansluter via Kad" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "För många Kad-anslutningar" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Bannlyst" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Anslutningsfel" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "Gammal MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "Ny MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "eMule-kompatibel" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Lokal server" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Fjärrserver" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Passiv" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Länk" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Systemets standard" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Arabiska" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Basiska" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Bulgariska" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Katalanska" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Kinesiska (Förenklad)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Kinesiska (Traditionell)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Kroatiska" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Danska" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Nederländska" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "Engelska (Storbritannien)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Estniska" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Finska" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Franska" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Galiciska" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Tyska" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Ungerska" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "Italienska" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "Italienska (Schweiz)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Koreanska" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Polska" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portugisiska" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Portugisiska (Brasilien)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Ryska" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Slovenska" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "Spanska" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Servernamn" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Adress" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Port" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Beskrivning" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Användare" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Filer" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Misslyckades" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Statisk" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Version" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Info" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(Okänt namn)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Ja" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Nej" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "Misslyckades med att öppna \"%s\"" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Servrar (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Server" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Anslut till server" + +#: src/ServerListCtrl.cpp:428 +msgid "Mark server as static" +msgstr "" + +#: src/ServerListCtrl.cpp:429 +msgid "Mark server as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:431 +msgid "Mark servers as static" +msgstr "" + +#: src/ServerListCtrl.cpp:432 +msgid "Mark servers as non-static" +msgstr "" + +#: src/ServerListCtrl.cpp:438 +#, fuzzy +msgid "Remove server" +msgstr "Ta bort servrar" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "Ta bort servrar" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Ta bort alla servrar" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "Kopiera ED2k-länk till urklipp" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "Kopiera ED2k-länk till urklipp" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Återanslut till server" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Är du säker på att du vill ta bort alla servrar?" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Är du säker på att du vill ta bort alla servrar?" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Är du säker på att du vill ta bort alla servrar?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Inaktiverad [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "Det här är aMule %s baserad på eMule." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "Kör på %s" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "" +"Besök http://www.amule.org för att se om en ny version finns tillgänglig." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr "" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr "" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr "" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr "" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr "" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "Meddelande" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Statustext" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "Ansluter" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "Frånkopplad" + +#: src/amuleDlg.cpp:676 +#, fuzzy +msgid "Kad: Firewalled" +msgstr "brandvägg" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "Ansluten" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "Ansluter" + +#: src/amuleDlg.cpp:689 +#, fuzzy +msgid "Kad: Off" +msgstr " Kad: " + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "Stoppar de aktuella anslutningsförsöken" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Koppla från" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "Koppla från nätverket." + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Anslut" + +#: src/amuleDlg.cpp:726 +#, fuzzy +msgid "Connect to the currently enabled networks" +msgstr "Anslut till nätverket." + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Upp: %.1f(%.1f) | Ner: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Upp: %.1f | Ner: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | Ansluten)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | Frånkopplad)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "Vill du verkligen avsluta aMule?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Bekräfta avslutning" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Kunde inte fastställa kommandot för att köra webbläsaren." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Nätverk" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Sökningar" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Överföringar" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Meddelanden" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "Statistik" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "Importera" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "Om" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "Om/Hjälp" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Allmänt" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Anslutning" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Proxy" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "Meddelandefilter" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Kataloger" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Säkerhet" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Händelser" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Felsökning" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "" +"aMule måste startas om för att aktivera dessa ändringar:\n" +"\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- TCP-port ändrad.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- UDP-port ändrad.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- Språk ändrat.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Upp: 0.0 | Ner: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "VARNING" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "Temporära filer" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Inkommande filer" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "Välj en mapp för %s" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Välj webbläsare" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Redigera serverlista" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:980 +#, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:987 +#, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:999 +#, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "" +msgstr[1] "" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1098 +#, fuzzy +msgid "Core command:" +msgstr "Tillgängliga kommandon:\n" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "" + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "" + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Okänd version" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "" + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "" + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "" + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "" + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "" + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "" + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "" + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "" + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "" + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "" + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "" + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "" + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "" + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "Filen hittades inte." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Ogiltigt filnamn." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Kunde inte byta namn på fil." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "Redan ansluten till ED2K." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Ansluter till ED2K..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Redan ansluten till Kad." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Ansluter till Kad..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Alla nätverk är inaktiverade." + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "" + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "" + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "" + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "" + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "" + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "ED2K-status:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Ansluten" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Port" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Kademlia-status:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Kör" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Status:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Frånkopplad" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Anslutningstillstånd:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "OK" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "" + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "Kör inte" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Upptid: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Överför" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Sändningar" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Aktiva sändningar: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Väntande sändningar: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "Hämtningar" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Klienter" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Filtrered" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Servrar" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Fungerande servrar: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Totalt: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Borttagna servrar: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Filtrerade servrar: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "Totalt antal filer: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "Operativsystem" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Klipp ut" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Kopiera" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Klistra in" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Markera alla" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "" + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "Meddelande filtrerat från \"%s\" (IP:%s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "Nytt meddelande från \"%s\" (IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "" + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Noder (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Fortsätt?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Fel: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Varning: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Lägg till en vän" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Du måste ange en giltig IP-adress och port!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Information" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "Angiven userhash är inte giltig!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Källor" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Fil" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "Hämta" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Kategori" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Anslutningen misslyckades " + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Fel" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Användare: E: %s K: %s | Filer E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Alla" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Totalt antal användare: %s | Totalt antal filer: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Överfört" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Färdig" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Hastighet" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "Förlopp" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Status" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Är du säker på att du vill ta bort alla servrar?" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Är du säker på att du vill ta bort alla servrar?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Skicka meddelande till användare" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Meddelande att skicka:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Stoppa" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Pausa" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Fortsätt" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Förhandsgranska" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Visa fil&detaljer" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Visa alla kommentarer" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "&Öppna filen" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +#, fuzzy +msgid "Remove from friends" +msgstr "Ta bort vän" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Lägg till i vänner" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "Skicka meddelande" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Växla till den här filen" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H.%M.%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "Hämtningar (%i)" + +#: src/DownloadListCtrl.cpp:2222 +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "" + +#: src/DownloadListCtrl.cpp:2260 +#, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "" + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "" + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "" + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "Misslyckades med att öppna %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "" + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "" + +#: src/PartFile.cpp:1019 +#, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +msgstr[1] "" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "Tar bort fil: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Otillräckligt diskutrymme" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Stoppad" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "" + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "" + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "" + +#: src/SharedFileList.cpp:352 +#, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "" +msgstr[1] "" + +#: src/SharedFileList.cpp:358 +#, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "" +msgstr[1] "" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Filkommentarer" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Rankning" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Kommentar" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Inga kommentarer" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%s kommentar(er)" +msgstr[1] "%s kommentar(er)" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "" +"Misslyckades med att ansluta till alla listade servrar. Gör ett nytt försök." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "" + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "Inga giltiga servrar att ansluta till hittades i serverlista" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "Ansluten till %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "Anslutning etablerad: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Förlorade anslutningen till %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) verkar vara död." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) verkar vara full." + +#: src/ServerConnect.cpp:391 +#, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "" +msgstr[1] "" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Anslutningen förlorades" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "" + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "" + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "" + +#: src/DownloadQueue.cpp:175 +#, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "" +msgstr[1] "" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Hämtar %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Du har redan filen \"%s\"" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "" + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "" + +#: src/TextClient.cpp:305 +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" + +#: src/TextClient.cpp:343 +msgid "Processing by hash: " +msgstr "" + +#: src/TextClient.cpp:358 +msgid "Processing by filename: " +msgstr "" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "" + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "AV" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "PÅ" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Ansluten till %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "med LowID" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "med HighID" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Ansluter nu" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Inte ansluten" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Hämta:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Skicka:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Klienter i kö:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "" + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "" + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "" + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "Stäng av aMule." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "" + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "" + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "" + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Anslut till nätverket." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Anslut endast till ED2K." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Anslut endast till Kad." + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Koppla från nätverket." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Koppla endast från ED2K." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Koppla endast från Kad." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "" + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "" + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "" + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "" + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "" + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "" + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "" + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "" + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "" + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "" + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "" + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "" + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "" + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "" + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "" + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "" + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "" + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "" + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "" + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "" + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "" + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Pausa hämtning." + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Fortsätt hämtning." + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Avbryt hämtning." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "Ställ in hämtningsprioritet." + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "" + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "" + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "" + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "" + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Visa köer/listor." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Visa sändningskö." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "Visa hämtningskö." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Visa logg." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Visa serverlista." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Nollställ logg." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "Fel: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "Varning: %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "" +"\tMest sannolikt att det på grund av du är bakom en brandvägg eller router." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tFör mer information, referera till http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "Ta bort död server efter" +msgstr[1] "Ta bort död server efter" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "" + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "" + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "" + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "" + +#: src/IP2Country.cpp:73 +#, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "" +msgstr[1] "" + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Aktiv" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Video" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Ljud" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Arkiv" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Bilder" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Text" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Lägg till kategori" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Redigera kategori" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Ta bor kategori" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "Importerar %s: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Hämtar status..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "Pågår" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "" + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Filnamn" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Tillstånd" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Ta bort källor?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Väntar..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (Disk: %s)" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "byte" +msgstr[1] "byte" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "byte/s" +msgstr[1] "byte/s" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "sekunder" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "minuter" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "timmar" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "Dagar" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Videoklipp" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Arkiv" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Texter" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Program" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Dålig" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Bra" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "Normal" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Utmärkt" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "" + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "" + +#: src/IPFilter.cpp:330 +#, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "" +msgstr[1] "" + +#: src/IPFilter.cpp:332 +#, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "" +msgstr[1] "" + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Aktiva anslutningar (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Fildetaljer" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% färdig" + +#: src/muuli_wdr.cpp:69 +#, fuzzy +msgid "ED2K Link: " +msgstr "ED2K-info" + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Verkställ" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Läser in ..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "" + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Användare: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "" + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Inte ansluten ..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "" + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Sök" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Namn:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Lokal" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Global" + +#: src/muuli_wdr.cpp:196 +#, fuzzy +msgid "FileHash" +msgstr "Filer" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Filtyp" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Filändelse" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "Min storlek" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Byte" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "Max storlek" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Tillgänglighet" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Filter:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Filtrera resultat" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Invertera resultat" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Dölj kända filer" + +#: src/muuli_wdr.cpp:353 +#, fuzzy +msgid "More" +msgstr "Koreanska" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "" + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Stoppa" + +#: src/muuli_wdr.cpp:375 +#, fuzzy +msgid "Reset Fields" +msgstr "Ta bort vän" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Resultat" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Skicka" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "" + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Stäng" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "" + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "-" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Hash :" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Filstorlek :" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Tillgänglig :" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Datahastighet :" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "" + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Överförd :" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Filnamn" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Verkställ" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Ok" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Uppdatera" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Hämtar, vänta ..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Okänd storlek" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "IP-adress :" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Port :" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Användarnamn :" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Aktuell session" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Aktuell" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Anslutningar" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Aktiva hämtningar" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Aktiva anslutningar (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Användarnamn:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Klientprogramvara:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Klientversion:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "IP-adress:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Skickat (session):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "Hämtat (session):" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Skickat (totalt):" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "Hämtat (totalt):" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "" + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Språk" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "" + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "" + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "" + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "" + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "" + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "" + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "" + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "inaktivera" + +#: src/muuli_wdr.cpp:1858 +#, fuzzy +msgid "Bind Address" +msgstr "Adress" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "Max anslutningar" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "" + +#: src/muuli_wdr.cpp:1946 +#, fuzzy +msgid "Enable UPnP" +msgstr "Aktivera proxy" + +#: src/muuli_wdr.cpp:1951 +#, fuzzy +msgid "UPnP TCP Port:" +msgstr "TCP-port: %d" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Ta bort död server efter" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "försök" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "" + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Katalog för inkommande :" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Temporär katalog :" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Utdelade kataloger" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Dela ut dolda filer" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Videouppspelare" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Diagram" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Bakgrund" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Välj" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Notifieringar" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Använd ljud" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Startar en ny chattsession" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "" + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "E-postadress :" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! VARNING !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Visa procentandel" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "Visa förloppsmätare" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Flat" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Rund" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Kolumnsortering" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Acceptera externa anslutningar" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "TCP-port" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "" + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "" + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Titel :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Kommentar :" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Ändra inte" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "" + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Serverinformation" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "" + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "aMule-logg" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "" + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Serverlista" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Lägg till server manuellt : Namn" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "" + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "" + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "" + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "ED2K-info" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Kad-info" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Visa aldrig det här igen" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "" + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Noder (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Ny nod" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Port:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Koppla från Kad" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Filalternativ" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Alla" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Ingen" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Vem kan se utdelade filer:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "" + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "IP-filtrering" + +#: src/muuli_wdr.cpp:3390 +#, fuzzy +msgid "Filter clients" +msgstr "Fildetaljer" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" + +#: src/muuli_wdr.cpp:3395 +#, fuzzy +msgid "Filter servers" +msgstr "Filtreringsnivå:" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Läs om lista" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Uppdatera nu" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Filtreringsnivå:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Aktivera/Inaktivera" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "" + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "" + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Inaktivera/Aktivera" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Filtrera alla meddelanden" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Kommentarer" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Aktivera proxy" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Proxytyp:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Proxyserver:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "Proxyserverns värdnamn" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Proxyport:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "Proxyporten" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Autentisering" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Aktivera autentisering" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Lösenord:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Anslut till:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Användarnamn" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Anslut till någon server och/eller Kad" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Ny kategori" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Välj en mapp för inkommande filer" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Du måste ange ett namn för kategorin!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Du måste ange en sökväg för kategorin!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Tillgängliga kommandon:\n" + +#: src/ExternalConnector.cpp:188 +#, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Avslutar programmet." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Visa hjälp." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"Använd \"%s\" för kommandolista\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Syntaxfel!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "" + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "" + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Ogiltigt argument." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "" + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Skriv \"%s\" för att få mer hjälp.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "Det här är %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "Det här är %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Skapar klient...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"Ok, avslutar %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Visa den här hjälptexten." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "" + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Läs in konfiguration från fil." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "" + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "" + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Ställer in programlokalen (språk)." + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "" + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "" + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Skriv ut programversion." + +#: src/ClientCreditsList.cpp:168 +#, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "" +msgstr[1] "" + +#: src/ClientCreditsList.cpp:171 +#, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] "" +msgstr[1] "" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "" + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "FEL: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Avbannlys" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Visa sändningar" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Visa kö" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Visa klienter" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Välj vy" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Klientprogramvara" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Väntande" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Sändningstid" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Skicka/Hämta" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Fjärrstatus" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Filprioritet" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Betyg" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Senast sedd" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Sändningsstatus" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Hämtningsstatus" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Klientdetaljer" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Stöds inte" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Inte färdig" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "Verifierad - OK" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Inte tillgänglig" + +#: src/ClientDetailDialog.cpp:190 +#, c-format +msgid "%u (QR: %u)" +msgstr "" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Obegränsad" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Hämtningshastighet: %.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Sändningshastighet: %.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Klientinformation" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Smeknamn: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "" + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Servernamn: " + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "ServerIP: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "TCP-port: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "UDP-port: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Utdelade filer: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "Dölj aMule" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "Visa aMule" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Ansluten till klient ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** Ansluter till klient ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Stäng flik" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Stäng alla flikar" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Stäng andra flikar" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "" + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "Inga giltiga servrar att ansluta till hittades i serverlista" +msgstr[1] "Inga giltiga servrar att ansluta till hittades i serverlista" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "Servernamn" +msgstr[1] "Servernamn" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "" + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "" + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "" + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "" + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "Ogiltig URL" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "" + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"Din lokal har ändrats till systemets standardlokal på grund av en " +"konfigurationsändring. Ursäkta." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"Du har inga servrar i serverlistan.\n" +"Vill du att aMule ska hämta en ny lista nu?" + +#: src/amule.cpp:766 +#, fuzzy +msgid "Server list download" +msgstr "Serverlista" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "webbserver kör på pid %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "Port %u är inte tillgänglig. Du kommer att bli LOWID\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Misslyckades med att skapa OnlineSig File" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "Misslyckades med att skapa aMule OnlineSig File" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "Det här är första gången som du kör aMule %s" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "Den här versionen är en testversion, uppdaterad dagligen, och\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "" +"vi ger ingen garanti, den kommer inte att förstöra någonting, bränna,\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "när ditt hus eller döda din hund. Men den *bör* vara användbar ändå.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "Mer information, support och nya utgåvor kan hittas på vår,\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "" +"webbplats, www.aMule.org, eller i vår IRC-kanal #aMule på irc.freenode.net.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Rapportera gärna eventuella fel på http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "FEL: kan inte öppna loggfilen" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "VARNING: loggfilen är tom. Någonting är fel." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Loggen har nollställts" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "Servermeddelande: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Misslyckades med att hämta nodlistan." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "Misslyckades med att öppna den hämtade versionskontrollfilen" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Skadad versionskontrollfil" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "Du använder en utdaterad version av aMule!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "" +"Din version av aMule är %i.%i.%i och den senaste versionen är %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "Den senaste versionen kan alltid hittas på http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "VARNING: Din version av aMuled är utdaterad: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "Din kopia av aMule är uppdaterad." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Misslyckades med att hämta versionskontrollfilen" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Ansluten till %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Ansluter till %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "Frånkopplad från ED2K" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad startad." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad stoppad." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Ansluten till Kad (ok)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Ansluten till Kad (brandvägg)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Frånkopplad från Kad" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "" + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "" + +#~ msgid "Disconnect from " +#~ msgstr "Koppla från " + +#~ msgid "current server" +#~ msgstr "aktuell server" + +#~ msgid " and " +#~ msgstr " och " + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "Command: %s" +#~ msgstr "Kommando: %s" + +#~ msgid "doesn't work" +#~ msgstr "fungerar inte" + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "VARNING: Du har tagit emot Low-ID!" + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid " %d" +#~ msgstr " %d" + +#~ msgid ".%d" +#~ msgstr ".%d" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(Min 60 / 3600 Max)" + +#~ msgid "English (U.S.)" +#~ msgstr "Engelska (U.S.A)" + +#~ msgid "Spanish (Mexican)" +#~ msgstr "Spanska (Mexiko)" + +#~ msgid "Set riority to low." +#~ msgstr "Ställ in prioritet till låg." + +#~ msgid "Set riority to normal." +#~ msgstr "Ställ in prioritet till normal." + +#~ msgid "Set riority to high." +#~ msgstr "Ställ in prioritet till hög." + +#~ msgid "Set riority to auto." +#~ msgstr "Ställ in prioritet till auto." + +#~ msgid "Sources: %u" +#~ msgstr "Källor: %u" + +#~ msgid "Client: aMule %s" +#~ msgstr "Klient: aMule %s" + +#~ msgid "File Name: %s" +#~ msgstr "Filnamn: %s" + +#~ msgid "File size: %s" +#~ msgstr "Filstorlek: %s" + +#~ msgid "Download: %s" +#~ msgstr "Hämta: %s" + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2006 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ " Plattformsoberoende P2P-klient baserad på eMule \n" +#~ "\n" +#~ " Webbplats: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " Vanliga frågor: http://wiki.amule.org \n" +#~ "\n" +#~ " Kontakt: admin@amule.org (administrativa frågor) \n" +#~ " Copyright © 2003-2006 aMule Team \n" +#~ "\n" +#~ " Del av aMule är baserad på \n" +#~ " Kademlia: Peer-to-peer-routing baserad på XOR metric.\n" +#~ " Copyright © 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "http://download.overnet2000.de/nodes.dat" +#~ msgstr "http://download.overnet2000.de/nodes.dat" + +#~ msgid "Skin file name is empty" +#~ msgstr "Skalfilnamnet är tomt" + +#~ msgid "Skin file %s does not exist" +#~ msgstr "Skalfilen %s finns inte" + +#~ msgid "Unable to open skin file: %s" +#~ msgstr "Kunde inte öppna skalfil: %s" + +#~ msgid " - loading defaults" +#~ msgstr " - läser in standardvärden" + +#~ msgid " - loading toolbar defaults" +#~ msgstr " - läser in standardvärden för verktygsrad" + +#~ msgid "Skin file:" +#~ msgstr "Skalfil:" + +#~ msgid "theApp.serverlist->GetServerByAddress() returned NULL" +#~ msgstr "theApp.serverlist->GetServerByAddress() returnerade NULL" + +#~ msgid "Default Permissions" +#~ msgstr "Standardrättigheter" + +#~ msgid "Enable IP-Filtering" +#~ msgstr "Aktivera IP-filtrering" + +#~ msgid "aMule is not connected!" +#~ msgstr "aMule är inte ansluten!" diff --git a/po/tr.po b/po/tr.po new file mode 100644 index 00000000..e67d6e1a --- /dev/null +++ b/po/tr.po @@ -0,0 +1,7032 @@ +# translation of amule.po to Türkçe +# Copyright (C) 2008 Free Software Foundation, Inc. +# This file is distributed under the same license as the PACKAGE package. +# +# Atilla ÖNTAŞ , 2008. +msgid "" +msgstr "" +"Project-Id-Version: amule\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2008-02-28 12:48+0200\n" +"Last-Translator: Atilla ÖNTAŞ \n" +"Language-Team: Türkçe \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural= (1 != 1);\n" +"X-Generator: KBabel 1.11.4\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "Boş olmayan bir şifre girmelisiniz." + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "Geçersiz şifre, bir MD5 adreslemesi değil!" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "Bağlantı başarısız" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "EC bağlantısı başarısız.:Boş cevap." + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "Dış.Bağ.:Reddedildi. Çünkü: " + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "Dış.Bağ.: Reddedildi" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "Dış.Bağ.:Sunucudan kötü cevap. Bağlantı kapatıldı." + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "Başarıldı! aMule'ye bağlantı kuruldu. " + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "Başarıldı! Bağlantı kuruldu." + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "Adreslemesi Yapılıyor" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "Tamamlanıyor" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "Tamamlandı" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "Duraklatıldı" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "Hatalı" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "Aktarılıyor" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "Bekliyor" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "%s dosyası için MD4 ve AICH adreslemesi oluşturulmaya başlanıyor " + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "%s dosyası için MD4 adreslemesi oluşturulmaya başlanıyor." + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "%s dosyası için AICH adreslemesi oluşturulmaya başlanıyor." + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "" +"'%s' içindeki eski AICH adresleme setleri '%s' içindeki 64 b'ye çevriliyor." + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "UYARI: '%s' dosya adı geçersiz ve'%s'olarak yeniden adlandırıldı." + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "UYARI: '%s' dosyası zaten var ve '%s'olarak yeniden adlandırıldı." + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "UYARI: Yedekleme oluşturulduktan sonra özgün '%s' çıkartılamıyor" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "UYARI: %s dosyası silinemiyor" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "'%s' kullanıcısının paylaşılmış dosyalarını alma başarısız" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "Bilinmiyor" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (Sahte eMule sürümü %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr "(Sahte eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (Sahte eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (eMule s.0.%u üzerine kurulu)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "Rumuz: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, c-format +msgid "Requested: %s\n" +msgstr "İstek: %s\n" + +#: src/BaseClient.cpp:1878 +#, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Bu oturum için dosya durumu: Kabul edilen istek %d si %d nin, %s aktarıldı\n" + +#: src/BaseClient.cpp:1881 +#, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "" +"Tüm oturumlar için dosya durumu: Kabul edilen istek %d si %d nin, %s " +"aktarıldı\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "Bilinmeyen dosya istendi" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "%s Kullanıcısı IP:Port %s:%d üzerinde ve %s %s %s kullanıyor" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "Kullanıcı Adı" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "Arkadaşlar" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "&Ayrıntıları Göster" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "Arkadaş ekle" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "Arkadaş sil" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "&İleti Gönder" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "Paylaşılmış Dosyalara bak" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "Arkadaş Slotu Kur" + +#: src/FriendListCtrl.cpp:273 +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "Seçili arkadaşı silmek istediğinizden emin misiniz?" + +#: src/FriendListCtrl.cpp:275 +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "Seçili arkadaşları silmek istediğinizden emin misiniz?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "İptal" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"Birden fazla arkadaş slotu kuramazsınız.\n" +"Sadece bir slot kuruldu." + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "Çoklu seçim" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "Dosya Adı" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "Boyut" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "Tür" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "Öncelik" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "Dosya Adresi" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "İstekler" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "Kabul Edilen İstekler" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "Aktarılan Veri" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "Paylaşım Oranı" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "Alınan Parçalar" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "Tam Kaynaklar" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "Dizin Yolu" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "Paylaşılan Dosyalar" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "Çok düşük" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "Düşük" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "Normal" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "Yüksek" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "Çok Yüksek" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "Yayım" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "Otomatik" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "Yorum/Puanlama Ekle" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "Yorum/Puanlama Düzenle" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "Yeniden Adlandır" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "Koleksiyondaki dosyaları aktarım listesine ekle" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "Magnet &bağlantısını panoya kopyala" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "ED2k &bağlantısını panoya kopyala" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "Ed2k bağlantısını panoya kopyalayın (&Kaynak)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "" +"Ed2k bağlantısını panoya kopyala.(Kaynak) (Şifreleme seçeneğiyle &birlikte)" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "Ed2k bağlantısını panoya kopyala (&Hostname)" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "" +"Ed2k bağlantısını panoya kopyala (Hostname)(Şifreleme &seçeneğiyle birlikte)" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "Ed2k bağlantısını panoya kopyala (&AICH bilgisi)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "Geri beslemeyi panoya kopyala" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "" +"Geçerli bir kaynak bağlantısı oluşturmak için YüksekID almanız gerekiyor" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "Uyarı" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "Paylaşılan Dosyalar (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[Parça Dosyası]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "Bu dosya için yeni bir isim girin:" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "Dosya yeniden adlandır" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "Şu dosya için gönderimler başlatılıyor:%s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "Şu dosya için gönderimler bekletiliyor: %s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kademlia: Arama sözcüğü çok kısa" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "Hata: TCP portu dinlenilemiyor." + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "İstem şu hatayla başarısız oldu: %s." + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "İstem bilinmeyen bir hatayla başarısız oldu." + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "İndeks dosyası bulunamadı: " + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "Web soketi oluşturulamıyor.\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Web Sunucusu: Başladı\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "Oturum sona erdi - giriş gerekiyor\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "Oturum tamam, giriş yapıldı.\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "Oturum tamam, giriş yapılmadı.\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "Hiç oturum açılmadı - giriş gerekecek\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "Oturum oluşturuldu.- giriş gerekiyor\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "İstem işleniyor [özgün]: " + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "Şifre kontrol ediliyor\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "Şifre adreslemesi geçersiz.\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "Şifre kabul edildi.\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "Şifre kötü.\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "Herhangi bir şifre girmediniz. Boş şifre kullanılamaz.\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "Çıkış istendi.\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "İstem işleniyor [yönlendirilmiş]: " + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "Şablonu yükler " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Web Sunucusu HTTP portu" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "Web Sunucusu portuna yönlendirmek için UPnP portunu kullanınız" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "UPnP portu" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "Gzip sıkıştırması kullan" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Web Sunucusu için tam giriş şifresi" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "Web Sunucusu için konuk şifresi" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "Konuk girişine izin ver" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "Konuk girişini reddet" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "web sunucusu ayarlarını aMule'ye/aMule'den Kaydet/Yükle" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "aMule yapılandırma yolu: DOĞRUDAN KULLANMAYINIZ!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "PHP yorumcusunu devreden çıkar. (onaylanmamış)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "Her istemde PHP sayfalarını yeniden oluştur" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "aMule Web Sunucusu" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "Devre dışı" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "Hiç" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "Aktarılıyor..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "Ayarlar" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "Dizin amulesig.dat dosyası içeriyor" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "Göz at" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "Buraya amulesig.dat dosyasının bulunduğu dizini giriniz" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "Saniye bazında yenileme döngüsü" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "Her yenileme olayında bir durum imajı oluştur" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "Buraya istatistik imajının oluşturulacağı dizini giriniz." + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "Durum imajını düzenli olarak FTP sunucusuna gönder." + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "FTP bağlantısı" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "FTP Yolu" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "Buraya FTP Sunucunuz için adresi giriniz." + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "Buraya durum imajını koyacağınız FTP Sunucusundaki bir dizini giriniz." + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "Kullanıcı" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "Şifre" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "FTP sunucunuza girebilmek için bir Kullanıcı adı giriniz." + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "FTP sunucunuza girebilmek için bir Şifre giriniz." + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "Dakika bazında FTP günceleme hızı" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "Onayla" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "Dizin imza dosyanızı içeriyor." + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "İstatistik imajının üretildiği dizin" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i gün %i saat %i dakika %i saniye" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas,aMule Bağlantı İstatistikleri" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "Hoş geldiniz!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "wxCas çalışmaya başladığından beri en fazla aktarım oranı" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "wxCas'ın önceki açılışlarındaki kesin En Fazla İND. oranı" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "Sıfırla" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "Sistem" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "Otomatik Yenilemeyi Durdur." + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "Bağlantı İstatistikleri imajını kaydet." + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "Bağlantı İstatistikleri imajını yazdır." + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "Ayarlar" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "wxCas Hakkında" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "Otomatik Yenilemeyi Başlat" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "Otomatik Yenilemeyi Durdu." + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "Otomatik Yenileme Başladı." + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "İstatistik imajını kaydet." + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "Bu dosya türü için ilişkilendirilmiş uygulama yok." + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "Dosya kaydedilmedi." + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "aMule Bağlantı İstatistikleri" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"Yazdırmada bir sorun var.\n" +"Yazıcınız doğru ayarlanmamış olabilir mi?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "Yazdırılıyor" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, aMule Çevrim içi İmza İstatistikleri\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +" Pedro de Oliveira' nın geliştirdiği CAS üzerine " +"kurulmuştur.\n" +"\n" +"GPL altında dağıtımı yapılır." + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "Aman Aman, aMule çalışmıyor..." + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule çalışıyor" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule çalışıyor ama bağlı değil." + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule bağlanıyor..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "Aman aman, aMule'nin durumu bilinmiyor..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr "çalışıyor" + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr " durdu !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr " bağlı değil !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr "bağlanıyor..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr "garip şeyler yapıyor, kontrol ediniz !" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr " şuna bağlandı:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr "Kad:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "tamam" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "güvenlik duvarı" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "bağlı değil" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr "bağlı" + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +msgid " with " +msgstr "ile" + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "Toplam Aktarım: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", Gönderme: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "Oturumdaki Aktarım: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "Aktarım: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s, Gönderme " + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +msgid " kB/s" +msgstr "kB" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "Paylaşılan: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " dosya(lar), Sıradaki kullanıcılar:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "Süre: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " bağlı " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "Sistem Yükü Ortalaması (1-5-15 dk.): " + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "Sistem çalışma süresi: " + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02uD %02uh %02udk. %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02uh %02udk. %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02udk. %02us" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02us" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "YüksekID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "DüşükID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "Bağlanmadı" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +msgid "Cancelled !" +msgstr "İptal Edildi !" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "%s açılamıyor." + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "%s dosyası Donkey için fazla büyük.:İzin verilen en fazla boyu:4 GB." + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "Girdi parametreleri" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "Adreslenecek Dosya" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "Bu dosya için isteğe bağlı adres ekleyin" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "Buraya Ed2k bağlantısı hesaplanacak dosyayı giriniz." + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "" +"Buraya Ed2k bağlantısına eklemek istediğiniz adresi giriniz: Ekle / " +"aLinkCreator' un, o dosya adına ekleyebilmesi için." + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "Ekle" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "Çıkar" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "Temizle" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "Parça adreslemesi içeren bağlantı oluştur." + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "" +"Yeni ve nadir dosyaların yayılmasına yardımcı olun;bunun bedeli ise artan " +"bağlantı boyutu olacaktır." + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "MD4 Dosya Adreslemesi" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "Ed2k Dosya Adreslemesi" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "Ed2k Bağlantısı" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "Başlat" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "Kaydet" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "Panoya kopyala" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "Çıkış" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "Ed2k bağlantısını hesaplamak için bir dosya açınız." + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "Hesaplanan ed2k bağlantısını panoya kopyala." + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "Hesaplanan ed2k bağlantısını dosyaya kaydet." + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "aLinkCreator Hakkında" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "Ed2k bağlantısı hesaplanacak dosyayı seçiniz." + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "Şimdilik kopyalanacak bir şey yok !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "Hesaplanmış ed2k bağlantısı için dosyayı seçiniz." + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "Açılamıyor" + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "Lütfen boş olmayan bir dosya adı giriniz." + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "Şimdilik kaydedilecek bir şey yok !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, aMule ed2k bağlantı oluşturucu\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmap kaynağı: http://www.everaldo.com ve http://www.icomania.com\n" +"ve http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"GPL altında dağıtımı yapılır." + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "Adreslemesi Yapılıyor." + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "%.2f s içinde tamamlandı." + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "Bu adresi zaten eklemiştiniz. !" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "Lütfen boş olmayan bir adres giriniz." + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "İşlenmekte olan dosya sayısı %u: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "Parça dosyalarını sormuştunuz (Sadece 9.5 MB' tan büyük dosyalar)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "Lütfen bekleyiniz... " + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> Var olmayan dosya !\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, aMule ed2k bağlantı oluşturucu." + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "Oto (Düş)" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "Oto [Nor]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "Oto (Yük)" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "Bağlanıyor" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "Soruyor" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "Sunucu yoluyla bağlanıyor" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "Sıra dolu" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "Sırada" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "Aktarılıyor" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "Adresleme seti alınıyor" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "Gereksiz parçalar" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "DüşükID'den DüşükID'ye bağlanılamaz" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "Çok fazla bağlantı" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "Kad.yoluyla bağlanıyor" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Çok fazla Kad. bağlantısı" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "Engellendi" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "Bağlantı Hatası" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "Uzaktaki Sıra Dolu" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "Eski MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "Yeni MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "eMule" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "Sunucu" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "Uzak Sunucu" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kademlia" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "Kaynak Değişimi" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "Pasif" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "Bağlantı" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "Kaynak Girdileri" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "Sistem Varsayılanı" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "Arapça" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "Baskça" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "Bulgarca" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "Katalanca" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "Çince (Simplified)" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "Çince (Traditional)" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "Hırvatça" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "Çekçe" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "Danca" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "Felemenkçe" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "İngilizce (U.K)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "Estonyaca" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "Fince" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "Fransızca" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "Galce" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "Almanca" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "Yunanca" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "Macarca" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "İtalyanca" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "İtalyanca (İsviçre)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "Japonca" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "Korece" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "Litvanyaca" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "Norveççe(Nynorsk)" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "Lehçe" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "Portekizce" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "Portekizce (Brezilya)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "Rusça" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "Slovence" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "İspanyolca" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "İsveççe" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "Türkçe" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "Seçili tarayıcı tanımlanamıyor!" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "" +"TCP portu numarası, UDP soketi TCP+3 olduğundan 65532' den yüksek olamaz" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "Varsayılan port kullanılacak (%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "Sunucu Adı" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "Adres" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "Port" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "Açıklama" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "Kullanıcılar" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "Dosyalar" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "Başarısız" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "Statik Sunucu" + +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "Sürüm" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "" +"Silmeye çalıştığınız bir sunucuya bağlısınız. Lütfen önce bağlantıyı " +"kesiniz. Sunucu SİLİNMEDİ." + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "Bilgi" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(Bilinmeyen ad)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "Statik sunucu %s'i silmek istediğinizden emin misiniz?" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "Evet" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "Hayır" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "'%s' açma başarısız" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "Sunucular (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "Sunucu" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "Sunucuya bağlan" + +#: src/ServerListCtrl.cpp:428 +msgid "Mark server as static" +msgstr "Sunucuyu statik olarak işaretle" + +#: src/ServerListCtrl.cpp:429 +msgid "Mark server as non-static" +msgstr "Sunucuyu statik olmayan olarak işaretle" + +#: src/ServerListCtrl.cpp:431 +msgid "Mark servers as static" +msgstr "Sunucuları statik olarak işaretle" + +#: src/ServerListCtrl.cpp:432 +msgid "Mark servers as non-static" +msgstr "Sunucuları statik olmayan olarak işaretle" + +#: src/ServerListCtrl.cpp:438 +msgid "Remove server" +msgstr "Çıkar" + +#: src/ServerListCtrl.cpp:440 +msgid "Remove servers" +msgstr "Çıkar" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "Bütün sunucuları kaldır" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "ED2K bağlantısını panoya kopyala" + +#: src/ServerListCtrl.cpp:449 +msgid "Copy ED2k links to clipboard" +msgstr "Kopyala" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "Sunucuya yeniden bağlan" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "Hepsini silmek istediğinizden emin misiniz?" + +#: src/ServerListCtrl.cpp:570 +msgid "Are you sure that you wish to delete the selected server?" +msgstr "Seçili sunucuyu silmek istediğinizden emin misiniz?" + +#: src/ServerListCtrl.cpp:572 +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "Seçili sunucuları silmek istediğinizden emin misiniz?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "Devre dışı [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "Bu, eMule üzerine kurulu olan aMule %s yazılımıdır." + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "%s üzerinde çalışıyor" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "Yeni sürüm kontrolü için http://www.amule.org adresini ziyaret ediniz." + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "Önemli Hata: Zamanlayıcı oluşturma başarısız" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "aMule uzak kontrolü" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "Bilgileri:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr "" +" eMule üzerine kurulu 'Sistem-Üstü' p2p yazılımı\n" +"\n" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr " Website: http://www.amule.org \n" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr " Forum: http://forum.amule.org \n" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" +" S.S.S.: http://wiki.amule.org \n" +"\n" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr " İletişim: admin@amule.org (administrative issues) \n" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" +" Copyright (C) 2003-2008 aMule Ekibi \n" +"\n" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr " aMule'nin üzerine kurulduğu parçalar: \n" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr " Kademlia: XOR matrisi üzerine kurulu bire-bir iletişim.\n" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr " Copyright (C) 2002 Petar Maymounkov\n" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr " http://kademlia.scs.cs.nyu.edu\n" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "İleti" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "Durum iletisi" + +#: src/amuleDlg.cpp:666 +msgid "ED2K: Connecting" +msgstr "ED2K Bağlanıyor" + +#: src/amuleDlg.cpp:670 +msgid "ED2K: Disconnected" +msgstr "ED2K Bağlantı kesildi" + +#: src/amuleDlg.cpp:676 +msgid "Kad: Firewalled" +msgstr "Kademlia Güvenlik Duvarı" + +#: src/amuleDlg.cpp:680 +msgid "Kad: Connected" +msgstr "Kademlia Bağlandı" + +#: src/amuleDlg.cpp:685 +msgid "Kad: Connecting" +msgstr "Kademlia Bağlanıyor" + +#: src/amuleDlg.cpp:689 +msgid "Kad: Off" +msgstr "Kademlia" + +#: src/amuleDlg.cpp:718 +msgid "Stop the current connection attempts" +msgstr "Durdur" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "Bağlantıyı Kes" + +#: src/amuleDlg.cpp:722 +msgid "Disconnect from the currently connected networks" +msgstr "Bağlantıyı Kes" + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "Bağlan" + +#: src/amuleDlg.cpp:726 +msgid "Connect to the currently enabled networks" +msgstr "Bağlan" + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "Gön: %.1f(%.1f) | İnd:%.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "Gön: %.1f | İnd:%.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | Bağlandı)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | Bağlantı kesildi)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "aMule'den çıkmayı gerçekten istiyor musunuz?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "Çıkışı onaylayınız" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "Tarayıcıyı çalıştırmak için gerekli komut belirlenemedi." + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "Kaplama dizini '%s'yok." + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "Uyarı: Kaplama dosyası '%s' açılamıyor" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "Ağ" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "Ağ Penceresi" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "Ara" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "Arama Penceresi" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "Aktarımlar" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "Dosya Aktarım Penceresi" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "Paylaşılan Dosya Penceresi" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "Sohbet" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "Sohbet Penceresi" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "İstatistikler" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "İstatistik Grafik Penceresi" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "Ayar Penceresi" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "İçe Aktar" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "Parça dosyası içe aktarım aracı" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "Hakkında" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "Hakkında/Yardım" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "Genel" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "Bağlantı" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "Proksi" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "İleti Süzgeci" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "Uzaktan Kontroller" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "Çevrim içi İmza" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "Dizinler" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "Güvenlik" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "Görünüm Seçenekleri" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "Hassas Ayarlar" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "Olaylar" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "Hata Çıktısı" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "Kullanıcı Tanımlı" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "Değişikliklerin uygulanması için, aMule yeniden başlatılmalı\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- TCP portu değişti.\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- UDP Portu değişti.\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"Sunucuları Otomatik-Güncelleme listeniz boş.\n" +"Sunucuları başlangıçta 'Otomatik-Güncelleme' devre dışı bırakılacak." + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"Dışarıdan bağlantıları aktifleştirmiş ama bir şifre belirlememişsiniz.\n" +"Geçerli bir şifre belirlenmedikçe dışarıdan bağlantılar devre dışı " +"kalacaktır." + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- Dil ayarları değişti.\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- Geçici Dosyalar dizini değişti.\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "Gön: 0.0 | İnd: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"ED2K ve Kad. ağlarının ikisi de devre dışı bırakılmış.\n" +"Birini etkinleştirene kadar bağlanamayacaksınız." + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"UDP portu devre dışı bırakılmışsa Kad. başlamayacaktır.\n" +"UDP portu açın veya Kademlia'yı devre dışı bırakın." + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"aMule' yi ŞİMDİ yeniden başlatmalısınız.\n" +"Şimdi yeniden başlatmazsanız, kötü şeyler olabilir.\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "UYARI" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"Sunucuları Otomatik-Güncelleme listeniz boş.\n" +"Lütfen geçerli bir server.met dosyasını gösteren en az bir adres yazınız.\n" +"Bir adres girmek için bu kutucuğun yanındaki \"Liste\" düğmesine basınız." + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "Geçici dosya(lar)" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "Gelen dosya(lar)" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "Çevrim içi İmzalar" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "%s için bir dizin seçiniz." + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "wav dosyasına göz at" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "wav dosyası (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "Ortam Çalıcısı için göz at" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "Tarayıcı Seçiniz" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "Çalıştırılabilir %s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "Sunucu Listesini Düzenle" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"Server.met dosyasını indirmek için buraya bağlantı adresi girin.\n" +"Her satıra sadece bir adres yazılmalıdır." + +#: src/PrefsUnifiedDlg.cpp:980 +#, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "Güncelleme gecikmesi: %d saniye" + +#: src/PrefsUnifiedDlg.cpp:987 +#, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "Ortalama grafiği için süre: %d dakika" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "Bağlantı Grafik Ölçüsü: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "Güncelleme gecikmesi: %d saniye" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "Dosya Alım Boyutu: %d bit" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "Gönderme Sıra Boyutu: %d kullanıcı" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "Sunucu bağlantısı yenileme sıklığı: %d dakika" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "Sunucu bağlantısı yenileme döngüsü: Devre dışı" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "'%s' olayında komut çalıştır." + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "Çekirdekte komut çalıştırmayı aktifleştir." + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "Çekirdek komutu:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "Arayüzde komut çalıştırmayı etkinleştir." + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "Arayüz komutu:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "Şu girdiler değiştirilecek:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "Yetkilendirilmemiş giriş denemesi. Bağlantı kesildi." + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "Dışarıdan bağlantı kesildi." + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "Boş şifre sebebiyle dışarıdan bağlantı devre dışı!" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "Yapılandırma dosyasında dışarıdan bağlantılar devre dışı bırakılmış." + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "Yeni dışarıdan bağlantı kabul edildi" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "Hata: yeni bir dışarıdan bağlantı kabul edilemiyor." + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "Ayarlardaki boş şifre sebebiyle dışarıdan bağlantılar reddedildi." + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "Kullanıcıya bağlanılıyor: %s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "Bilinmeyen sürüm" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"Yanlış EC sürüm ID, bir çift uyumsuzluğu olabilir. Aynı görüntüden çekirdek " +"ve uzak kullanınız." + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" +"Keyfi bir SVN sürümden dengeli bir sürüme bağlanamazsınız! muhtemel bir kaza " +"önlendi" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "Doğrulanamadı." + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "Geçersiz protokol sürümü." + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "Kayıp protokol sürüm eki." + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "Geçersiz istem, öncelikle doğrulatmanız lazım." + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "Giriş izni verildi." + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "Uzak Parça Dosyası komutu başarısız: Dosya Adreslemesi bulunamadı: %s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "Dosya adreslemesi bulunamadı: %s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "Aman aman! OpCode işleme hatası!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "Sunucu eklenmedi." + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "sunucu bulunamadı: %s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "çıkarılacak sunucunun tanımlanması gerekli" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "ED2K ayarlarda devre dışı bırakılmış." + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "Arama sürüyor.Bir dakikaya sonuçlanır!" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "Uzak arayüzden Web araması yapmak anlamsız." + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad. ayarlarda devre dışı bırakılmış." + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "Grafik için hiç nokta yok." + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "Yazılımınız bu ayrıntı düzeyi için yapılandırılmamış." + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "Dışarıdan Bağ.: kapatma istendi." + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "Zaten kapatılıyor." + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "Dışarıdan Bağ.:'%s' bağlantısı ekleniyor." + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "Geçersiz bağlantı veya zaten listede mevcut." + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "Dosya bulunamadı." + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "Geçersiz dosya adı." + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "Dosya yeniden adlandırılamıyor." + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "ED2K'ya zaten bağlı." + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "Ed2k bağlanıyor..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "Kad. zaten bağlı." + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "Kad.' a bağlanıyor..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "Bütün ağlar devre dışı" + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "Bağlantı kesildi.:ED2K" + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "Bağlantı kesildi :Kad." + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "Dışarıdan Bağ.: geçersiz opcode alındı: %#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "Geçersiz opcode (yanlış protokol sürümü mü?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "" +"(%s) dosyasını açma başarısız. Paylaşılan dosya listesinden çıkartılıyor." + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "Bilinmeyen dosya için adresleme seti istendi: %s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "`%s' komutu, pid `%d' içermekteydi ve durum kodu `%d' ile bitti." + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "Sunucu eklenmedi: Bir IP veya host adı girilmedi." + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "Sunucu eklenmedi: Geçersiz sunucu portu girildi." + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "ED2K Durumu:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "Bağlandı" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP:Port" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Kademlia Durumu:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "Çalışıyor" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "Durum:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "Bağlantı kesildi" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "Bağlantı Durumu:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "Güvenlik Duvarı" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "Tamam" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "Güvenlik duvarı durumu: " + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "En yakına Bağlandı" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "Yakın yok" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "Kullanıcı Ortalaması:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "Dosya Ortalaması:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "Çalışmıyor" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "Çalışma Süresi: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "Aktarım" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "Gönderilenler" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "Gönderilen Veri (Oturum (Toplam)): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "Toplam Ek Yük (Paket): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "Dosya İstemi Ek Yükü (Paket): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "Kaynak Değişimi Ek Yükü (Paket): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "Sunucu Ek Yükü (Paket):%s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Kad. Ek Yükü (Paketler): %s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "Aktif Gönderimler: %s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "Bekleyen Gönderimler: %s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "Toplam başarılı gönderme oturumu: %s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "Toplam başarısız gönderme oturumu: %s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "Ortalama gönderme süresi: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "İndirmeler" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "Aktarılan Veri (Oturum (Toplam)): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "Bulunan Kaynaklar: %s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "Aktif İndirmeler (parçalar): %s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "Oturum GÖN:İND Oranı (Toplam): %s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "Ortalama Aktarım Oranı (Oturum): %s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "Ortalama Gönderim Oranı (Oturum): %s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "En Fazla Aktarım Oranı (Oturum): %s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "En Fazla Gönderim Oranı (Oturum): %s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "Yeniden Bağlanma: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "İlk Aktarımdan Beri Geçen Süre: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "%s beri Sunucuya Bağlı" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "Aktif Bağlantılar (yaklaşık): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "Ulaşılan En Fazla Bağlantı Sınırı: %s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "Ortalama Bağlantılar (yaklaşık): %g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "Doruk Bağlantılar (yaklaşık): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "Kullanıcılar" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "Süzülen" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "Toplam: %i Bilinen: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "Sunucular" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "Çalışan Sunucular: %i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "Başarısız Sunucular: %i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "Toplam: %s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "Silinen Sunucular: %s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "Süzülen Sunucular: %s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "Çalışan Sunuculardaki Kullanıcı Sayısı: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "Çalışan Sunuculardaki Dosya Sayısı: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "Toplam Kullanıcılar: %llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "Toplam Dosyalar: %llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "Sunucu Bağlantısı: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "Paylaşılmış Dosya Sayısı: %s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "Paylaşılan Dosyaların Toplam Boyutu: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "Ortalama dosya boyutu: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "DüşükID: %u (%.2f%% Toplam %.2f%% Biliniyor)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "Güv.Kimlik Açık/Kapalı: %u (%.2f%%) : %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "İşletim Sistemi" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "Alınmadı" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "Kes" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "Kopyala" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "Yapıştır" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "Hepsini Seçiniz" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "Kad. çalışmıyorsa, Kad. araması yapılamaz." + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "ED2k bağlı değilse, ED2K araması yapılamaz." + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "Kad. araması sırasında beklenilmeyen hata oluştu." + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "'%s' kullanıcısından gelen ileti engellendi. (IP: %s)" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "'%s' kullanıcısından yeni ileti geldi (IP: %s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "Kullanıcı %s (%u), paylaşılmış dosya listenizi istedi. -> Kabul edildi" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "Kullanıcı %s (%u), paylaşılmış dosya listenizi istedi. -> Reddedildi" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "Kullanıcı %s (%u), paylaşılmış dizin listenizi istedi. -> Kabul edildi" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "Kullanıcı %s (%u), paylaşılmış dizin listenizi istedi. -> Reddedildi" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "" +"Kullanıcı %s (%u), %s dizini için paylaşılmış dosya listenizi istedi. -> " +"kabul edildi" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "" +"Kullanıcı %s (%u), %s dizini için paylaşılmış dosya listenizi istedi. -> " +"reddedildi." + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "Kullanıcı %s (%u), %s dizinini paylaşıyor" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "Kullanıcı %s (%u) istenmeyen paylaşılmış dosya listesi gönderdi" + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "Kullanıcı %s (%u) %s dizini için paylaşılmış dosya listesini gönderdi" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "Kullanıcı %s (%u) paylaşılmış dosya listesini göndermeyi tamamladı" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "Kullanıcı %s (%u) istenmeyen paylaşılmış dosya listesi gönderdi" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "Kullanıcı %s (%u)nın paylaşılmış dizin/dosyalara erişimi reddedildi." + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "Nodlar (%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "Ön yükleme için geçersiz ip" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "Ön yükleme için geçersiz port" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "İstenilen tüm alanları doldurunuz." + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "Yeni bir nodes.dat dosyası indirmek istediğinizden emin misiniz?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "" +"Bunu yapmanız şu anki nodları silecek ve Kademlia bağlantısını baştan " +"başlatacaktır." + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "Devam mı?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "Hata: " + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "Uyarı: " + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "Arkadaş Ekle" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "Geçerli bir IP ve port girmelisiniz" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "Bilgi" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "Belirlenen kullanıcı adreslemesi geçersiz!" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "Kaynaklar" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "Dosya" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "İndir(me)" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "Kategori" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "Ana" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "Kategoriye göre indir" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "İlgili alanlarda ara (ED2k, sunucu)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "Bilinmeyen dosya olarak işaretle" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "Uzak aMule'ye bağlan" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "Bağlantı başarısız " + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "Hata" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "" +"UYARI: Kendinizi bir ed'k bağlantısına kaynak olarak ekleyebilirsiniz; ancak " +"DüşükID alırsınız." + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "Kullanıcı: E: %s K: %s | Dosya E: %s K: %s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "Tümü" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "Toplam Kullanıcılar: %s | Toplam Dosyalar: %s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "Aktarıldı" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "Tamamlandı" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "Hız" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "İşlem" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "Durum" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "Kalan Süre" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "Son Tamamlanmış Görülme" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "Son Alım" + +#: src/DownloadListCtrl.cpp:578 +msgid "Are you sure that you wish to delete the selected file?" +msgstr "Seçili dosyayı silmek istediğinizden emin misiniz?" + +#: src/DownloadListCtrl.cpp:580 +msgid "Are you sure that you wish to delete the selected files?" +msgstr "Seçili dosyaları silmek istediğinizden emin misiniz?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "Kullanıcıya ileti gönder" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "Gönderilecek ileti:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "&Dur" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "&Durakla" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "&Başlat" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "Tamamlananları T&emizle" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "Tüm A4Afleri derhal bu dosyaya geçir" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "Tüm A4Afleri bu dosyaya geçir (Otomatik)" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "Tüm A4Afleri derhal bir başka dosyaya geçir" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "Genişletilmiş Seçenekler" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "Ön İzleme" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "Dosya &ayrıntılarını göster" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "Tüm yorumları göster" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "Magnet bağlantısını panoya kopyala" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "Ekleme" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "Kategoriye Ekle" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "Dosyayı &Aç" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "Arkadaşlardan Çıkar" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "Arkadaşlara Ekle" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "İleti Gönder" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "Bu dosyaya geçir" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "A4AF" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "SR: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "Başka dosya için soruldu" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "İndirmeler (%i)" + +#: src/DownloadListCtrl.cpp:2222 +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "aMule" + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "Dosya Önizlemesi" + +#: src/DownloadListCtrl.cpp:2260 +#, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "Hata: Ortam oynatıcısını çalıştırma başarısız! Komut : `%s'" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "HATA: Part dosyası açma başarısız)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "HATA: Part dosyası oluşturma başarısız)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "Met-dosyası yedeklemesi %s konumundan yüklenmeye çalışılıyor." + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "Hata: part.met dosyasını açma başarısız: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "Hata: part.met 0 boyutlu: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "Hata: Geçersiz part.met sürümü: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "Hata: %s (%s) bozuk(yanlış ek sayısı).Dosya yüklenemiyor." + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "Dosya bilgisi kurtarılmaya çalışılıyor..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "" +"İsimsiz dosya kurtarılmaya çalışılıyor-RecoveredFile.dat olarak kaydedilecek." + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "Uygun olan tüm bilgiler kurtarıldı. :-D - bunlar kullanılacak..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "Dosya bilgisi kurtarılamıyor :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "%s (%s) açma başarısız" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "Uyarı: %s bozulmuş olabilir. (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "Parça dosyası kaydedilirken HATA: %s (%s ==> %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "'%s' dosyasının uzunluğu alınamıyor - %s dosyası kullanılıyor." + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "'%s' bir şekilde 0 boyutlu-%s dosyası kullanılacak." + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "%s için pat.met girdilerini kaydetme başarısız." + +#: src/PartFile.cpp:1019 +#, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "%i kaynak tohumu parça dosyası için kaydedildi: %s (%s)" + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "%s (%s) parça dosyası girdi dosyasına sahip değil." + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "Parça dosyası %s (%s) geçersiz girdi dosyası içeriyor." + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "Parça dosyasına ait girdi dosyası (%s - %s): %s okunamıyor." + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"Bozuk parça (%d) %d parçadosyası %s içinde bulundu -Dosya sonuç adreslemesi |" +"%s| Dosya adreslemesi |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "Tamamlanmış (%i) parçası %s içinde bulundu." + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "%s dosyasının yeniden adreslenmesi bitti" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "" +"%s dosyası tamamlanırken beklenmeyen bir hata oluştu. Dosya duraklatıldı" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "Aktarım tamamlandı: %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "Dosya siliniyor: %s" + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "Uyarı: İndirilen dosya adreslenemiyor.-'%s' için adresleme seti eksik." + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "" +"Uyarı: Aktarılan parçanın adreslemesi yapılamıyor - adres seti eksik (%s). " +"Bu hiç olmamalıydı" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "UYARI: Yetersiz disk alanı! %s dosyası duraklatılıyor." + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "İndirilen %i parçası %s dosyasındaydı ve bozuk." + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "" +"ICH: Bozulan %i parçası %s dosyasındaydı ve kurtarıldı -> Kaydedilen miktar: " +"%s bayt" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "Yetersiz Disk Alanı" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "Durduruldu" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "Uyarı: 'known.met' dosyası açılamıyor." + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "Uyarı: Bilinen Dosyalar listesi bozuk, geçersiz başlıklar içeriyor." + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "known.met dosyası okumada IO hatası: %s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "known.met dosyası kaydedilirken hata: %s" + +#: src/SharedFileList.cpp:352 +#, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "Bilinen %i adet paylaşılmış dosya bulundu" + +#: src/SharedFileList.cpp:358 +#, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "Bilinen %i adet paylaşılmış dosya bulundu. Bilinmeyen %i adet" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "HATA! Paylaşma denemesi %s" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "Dosya Yorumları" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "Puanlama" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "Yorum" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "Yorum yok" + +#: src/CommentDialogLst.cpp:104 +#, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%u adet yorum" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "" +"Listelenen gizlenmiş bağlantılı tüm sunuculara bağlanma başarısız.Gizlenmiş " +"bağlantı olmadan geçiş yapılacak." + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "" +"Listelenen sunucuların hiç birine bağlanılamadı. Başka bir geçiş yapılıyor." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "ED2K ağı ayarlarda devre dışı bırakılmış, bağlanılmıyor." + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "Sunucu listesinde bağlanılabilecek geçerli bir sunucu bulunamadı" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr " %s (%s:%i) sunucusuna bağlanıldı" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "%s sunucusuna bağlanıldı" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "" +"Önemli Hata: Bağlantı sağlanamıyor. İnternet bağlantınız kopmuş olabilir." + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "Bağlantı kaybedildi: %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) görünüşe göre ölü." + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) görünüşe göre dolu." + +#: src/ServerConnect.cpp:391 +#, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "Sunucuya otomatik bağlanma %d saniye içinde tekrar denenecek" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "Bağlantı Koptu" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "%s (%s:%i) adresine bağlantı başarısız." + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "Hata: Zaman aşımı kontrolündeki soket geçersiz" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "%s (%s:%i) adresine bağlanma denemesi zamanaşımına uğradı." + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" +"Hata: Yedekleme dosyasını yükleme başarısız. .part.met kurtarma çözümleri " +"içinhttp://forum.amule.org adresinde araştırma yapın." + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "Hiç part dosyası bulunamadı" + +#: src/DownloadQueue.cpp:175 +#, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "%u adet parça dosyası bulundu" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "Aktarılıyor %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "Zaten %s dosyasını indirmeye çalışıyorsunuz." + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "Zaten %s dosyası var." + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "%s dosyasını indirmeyi zaten deniyorsunuz" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "Magnet bağlantısı ed2k bağlantısına çevrilemiyor: %s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "Bağlantı için bilinmeyen protokol: %s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "Geçersiz ed2k bağlantısı! Hata: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr " çalıştır ve çık." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "Geçersiz IP biçimi. xxx.xxx.xxx.xxx:xxxx kullanınız.\n" + +#: src/TextClient.cpp:305 +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "" +"Bu komut bir argüman gerektiriyor. Geçerli argümanlar: 'all', dosya adı veya " +"birsayı.\n" + +#: src/TextClient.cpp:343 +msgid "Processing by hash: " +msgstr "Hash ile işleniyor: " + +#: src/TextClient.cpp:358 +msgid "Processing by filename: " +msgstr "Dosya adı ile işleniyor: " + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "" +"Bu komut bir argüman gerektirir. Geçerli argümanlar: bir dosya adreslemesi.\n" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "Geçerli bir sayı değil\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "Geçerli bir adresleme değil (uzunluğu tam olarak 32 karakter olmalı)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "İşlem başarılı." + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "İstek şu hata ile başarısız oldu: %s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "Kullanıcılar için IP Süzgeci %s.\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "KAPALI" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "AÇIK" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "Sunucular için IP süzgeci %s.\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "Şu anki IP Süzgeç seviyesi %d.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "Bağlantı Sınırları: Gön.: %u kB/s, İND.: %u kB/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "Bağlandı: %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "DüşükID ile" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "YüksekID ile" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "Şimdi bağlanıyor" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "Bağlı değil" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"Aktarım:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"Gönderim:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"Sıradaki Kullanıcılar:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"Toplam Kaynak:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "Arama sonuçları sayısı:%i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "YAPILACAK - bir aramanın gidişatını göstermek." + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "Sunucudan bilinmeyen bir cevap alındı.: OpCode = %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "Kısa durum bilgisi göster." + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "Bağlantı durumunu, o anki gönderim/aktarım hızını v.b. göster.\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "Tüm istatistik ağacını göster." + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"İsteğe bağlı olarak, yazılım alt dallarının kaç girdisinin gösterilmesi " +"gerektiğini söyleyen\n" +"bu komuta 0-255 aralığında bir sayı, argüman olarak\n" +"verilebilir.\n" +"Boş bırakma veya 0 değerini verme 'sınırsız' demektir.\n" +"\n" +"Örnek: 'istatistik 5 sadece her yazılım türünün en üstteki 5 sürümünü " +"gösterecektir.\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "aMule'yi kapat." + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"Uzak çalışan .çekirdeği kapat (amule/amuled).\n" +"Bu, aynı zamanda komut satırı yazılımını da kapatacaktır ki,\n" +"çalışan bir çekirdek yoktur.\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "Verilen nesne yeniden yükleniyor." + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "Paylaşılmış dosya listesini yeniden yükler." + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "Dosyadan IP süzgeci tablosunu yeniden yükler." + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "Ağa bağlan." + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"Bu, ayarlarda etkinleştirilen tüm ağlara bağlar.\n" +"Bağlanılacak bir sunucu adresini de IP:Port biçiminde belirleyebilirsiniz.\n" +"IP onluk IPv4 adresi biçiminde veya çözümlenebilir\n" +"bir DNS adı olmalıdır." + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "Sadece ED2K'ya bağlan." + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "Sadece Kad'a bağlan" + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "Ağ bağlantısını kes." + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "Bu, şu anda bağlı olduğunuz tüm ağlarla bağlantıyı kesecektir.\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "Sadece ED2K'dan bağlantıyı kes." + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "Sadece Kad'dan bağlantıyı kes." + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "Çekirdeğe bir ed2k veya magnet bağlantısı ekler." + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"Eklenecek ed2k bağlantısı:\n" +"*)bir dosya bağlantısı (ed2k://|file|...),aktarım sırasına eklenecektir,\n" +"*)bir sunucu bağlantısı (ed2k://|server|...), sunucu listesine " +"eklenecektir;\n" +"*)veya bir sunucu listesi bağlantısı,bu durumda listedeki tüm sunucular " +"sunucu listesine eklenecektir;\n" +" olabilir.\n" +"\n" +"Magnet bağlantı ed2k adreslemesi ve dosya uzunluğunu içermelidir.\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "Bir ayar değeri girin." + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "IP Süzgeci ayarları girin" + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "IP süzgecini hem kullanıcılar hem de sunucular için aç." + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "IP süzgecini hem kullanıcılar hem de sunucular için kapat." + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "IP süzgecini kullanıcılar için Aç/Kapat." + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "IP süzgecini kullanıcılar için aç." + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "IP süzgecini kullanıcılar için kapat." + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "IP süzgecini sunucular için Aç/Kapa" + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "IP süzgecini sunucular için aç." + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "IP süzgecini sunucular için kapat." + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "IP süzme seviyesini seçiniz." + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"Geçerli süzme seviyeleri 0-255 aralığındadır.Varsayılan\n" +"değer 127'dir.\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "Bağlantı sınırlarını girin." + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "Bu komutlar için girdiler kilobayt/saniye cinsinden olmalıdır.\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "Gönderme sınırını girin." + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "İndirme sınırını girin." + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "Bir ayar değerini al ve göster" + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "IP Süzgeci ayarlarını al" + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "Hem kullanıcılar hem de sunucular için IP süzgeci durumunu al." + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "Sadece kullanıcılar için IP süzgeci durumunu al." + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "Sadece sunucular için IP süzgeci durumunu al." + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "IP Süzgeç seviyesini al." + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "Bağlantı sınırlarını al." + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "Arama yapar." + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"Bir arama türü şu seçeneklerle belirlenmelidir:\n" +" GENEL\n" +" SUNUCU\n" +" KAD\n" +"Örnek:'kad dosyası ara' dosya için bir kad araması \"gerçekleştirir\".\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "Genel arama yapar." + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "Sunucuda arama yapar." + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "Kad. araması yapar." + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "Son arama sonuçlarını gösterir." + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "Önceki aramanın sonuçlarına döner.\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "Bir aramanın işleyişini göster" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "Bir aramanın işleyişini gösterir.\n" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "Dosyayı indirmeye başla." + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"Son arama sonucunda elde edilen dosya numarası verilmelidir.\n" +"Örnek: '12 İndir' bir önceki aramadaki 12 numaralı dosyayı indirmeye " +"başlayacaktır.\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "Aktarımı duraklat" + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "Aktarıma devam et" + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "Aktarım İptal." + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "İndirme önceliği ayarla" + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "Bir aktarımın önceliğini Düşük, Normal, Yüksek veya OTO. ayarla.\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "Önceliği Düşük ayarla." + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "Önceliği Normal ayarla." + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "Önceliği Yüksek ayarla." + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "Önceliği Otomatik ayarla." + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "Sıra/liste göster." + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "" +"Gönderme/indirme sırasını,sunucu listesini veya paylaşılmış dosya listesini " +"gösterir.\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "Gönderim sırasını göster." + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "İndirme sırasını göster." + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "Kayıtları göster." + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "Sunucu listesini göster." + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "Kaydı (Log) Sıfırla." + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "Onaylanmayan komut, şimdi '%s'." + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "" +"Bu geçersiz bir komut, ve gelecekti belki çıkartılabilir.\n" +"Bunun yerine '%s' kullanın.\n" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() returned NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "Hata: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "Uyarı: %s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "Yeni kullanıcı kimliğiniz %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "UYARI Düşük ID!" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "\tBüyük ihtimalle bir güvenlik duvarı veya router arkasındasınız." + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\tDaha fazla bilgi için: http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "Bilinmeyen sunucu bilgisi alındı! - çok kısa" + +#: src/ServerSocket.cpp:539 +#, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "%d adet yeni sunucu alındı" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "Sunucu listesinin kaydı tamamlandı." + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "Sunucu son komutu reddetti" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "Sunucudan Bogus paketi alındı: %s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "Sunucudan paket alınırken beklenmeyen hata: %s" + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "%s bağlantısı için DNS çözümlemesi yapılamıyor." + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "Sunucu IP. %s (%s) süzüldü. Bağlanılmıyor." + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "protokol gizleme kullanılarak bağlanıyor." + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "%s (%s - %s:%i) adresine %s ." + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "Sunucu %s için DNS çözümlenemiyor: Bağlanmak imkansız!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "CIP2Country::CIP2Country(): Ülke verisi yükleme başarısız " + +#: src/IP2Country.cpp:73 +#, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "%d adet bayrak bitmapi yüklendi" + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "" +"Bu kategori içindeki bütün dosyaları iptal edip silmek istediğinizden emin " +"misiniz?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "Onaylama Gerekiyor" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "Tüm Diğerleri" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "Tamamlanmamış" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "Aktif" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "Görüntü" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "Ses" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "Sıkıştırılmış" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "CD-İmajı" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "Resim" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "Döküman" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "Görünüm Süzgeci Seç" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "Kategori Ekle" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "Kategoriyi Düzenle" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "Kategoriyi Kaldır" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "İçe Aktarılıyor %s: %s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "Geçici dosyalar dizini okunuyor." + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "Aktarım bilgisi dosyasından temel bilgiler alınıyor." + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "Hedef dosya oluşturuluyor." + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "Eski aktarım dosyasından veri yükleniyor. (%u of %u)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "Yeni tek aktarım dosyasına veri bloku kaydediliyor. (%u of %u)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "Kaynak aktarım dosyası bilgisi alınıyor." + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "Aktarım ekleniyor ve yeni parça dosyası kaydediliyor." + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "Aktarım durumu ..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "İşlem yapılıyor" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "Hata: Disk dolu" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "Hata: part.met bulunamadı" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "Hata: IO hatası !" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "Hata: Başarısız!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "Sıraya girdi" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "Zaten aktarılıyor" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "Bilinmeyen yada bozuk geçici dosya formatı." + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "Dosya adı" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "Durum" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "Dosya adreslemesi" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "Parça dosyalarını içe aktar" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "" +"Lütfen geçici aktarım dosyaları için bir dizin seçiniz. (Alt dizinler de " +"taranacaktır.)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "" +"İçe aktarımı başarılı olan kaynak dosyalarının silinmesini ister misiniz?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "Kaynakları çıkar?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "Bekliyor..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (Disk: %s)" + +#: src/OtherFunctions.cpp:121 +msgid "byte" +msgid_plural "bytes" +msgstr[0] "bit" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "bit/sn" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "sn" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "dk" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "saat" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "Gün" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "Görüntüler" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "Sıkıştırılmış Dosyalar" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "Dokümanlar" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "Programlar" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "Herhangi" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "Derecelendirilmemiş" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "Geçersiz / Bozuk / Sahte" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "Zayıf" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "Doğru" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "İyi" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "Mükemmel" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "Tümü" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "Diğer" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "IP süzgeçleri 'ipfilter.dat' ve 'ipfilter_static.dat' yükleniyor." + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "" +"ipfilter.dat dosyasını '%s' yükleme başarısız. bilinmeyen format algılandı." + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "ipfilter.dat dosyasını '%s' yükleme başarısız. Dosya açılamıyor." + +#: src/IPFilter.cpp:330 +#, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "%u adet IP-aralığı '%s' den yüklendi." + +#: src/IPFilter.cpp:332 +#, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "%u adet bozuk satır göz ardı edildi." + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "Aktif Bağlantılar (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "Dosya Ayrıntıları" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% tamamlandı" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "ED2K Bağlantısı: " + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "Onayla" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "" +"ED2k bağlantısı ekleyerek aktarım sıranızı kontrol etmek için buraya " +"tıklayınız." + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "Durum bilgi penceresi" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "Yükleniyor..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "" +"Olaylar burada gösterilir. Olayların tam listesi için Sunucu sekmesine " +"bakınız." + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "Sunucu üzerinden bağlandığınız kullanıcı sayısı..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "Kullanıcılar: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "Şu anki sunucuya bağlı kullanıcılar ve kullanıcıların yaklaşık sayısı." + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "" +"Şu anki ortalama gönderim ve aktarım oranları. Etkinleştirilirse, ızgaralar " +"üzerindeki rakamlar kullanıcı iletişiminden kaynaklanan ek yükü gösterir." + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"Bağlantı durumu ve aktif aktarımları gösterir. Kırmızı ok henüz " +"bağlanmadığınızı, sarı ok düşük ID (güvenlik duvarı)aldığınızı ve yeşil ok " +"ise yüksek ID (En verimli bağlantı türü) aldığınızı simgeler." + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "Bağlanmadı ..." + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "Şu an bağlanılan sunucu." + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "Ara" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "Ad:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "Sunucu" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "Genel" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "Dosya Adreslemesi" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "Genişletilmiş Parametreler" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "Süzgeç" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "Dosya Türü" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "Uzantı" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "En Az Boyut" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "Bit" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "En Fazla Boyut" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "Uygunluk" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "Süz:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "Süzme Sonuçları" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "Sonuçları tersine çevir." + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "Bilinen Dosyaları Gizle" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "Daha Fazla" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "ED2k üzerinde daha fazla sonuç arar. Henüz Kad desteklenmemektedir." + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "Durdur" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "Alanları Sıfırla" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "Sonuçlar" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "Tamamlanan aktarımları temizler." + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "Gönderim/Gön-sırasını Gösterir." + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "Sıradaki Kullanıcılar:" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "Gönder" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "Belirlenen iletiyi gönderir." + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "Kapat" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "Bu sohbet oturumunu kapatır." + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "Tam Ad :" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "N/A" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "met-Dosyası :" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "Adresleme:" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "Dosya Boyutu :" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Parça Dosya Durumu :" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "Son Görülen Tamamlama :" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "Bulunan Kaynaklar:" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "Aktarılan Kaynaklar:" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "Dosya Parçası-Sayısı:" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "Uygun:" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "Veri Oranı:" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "Aktarım Süresi: " + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "Aktarılan:" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "Tamamlanmış Boyut:" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "Akıllı Bozulma Yakalayıcısı" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "Bozulma ile kaybedilen:" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "Sıkıştırma ile kazanılan:" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "I.C.H ile kurtarılan paketler :" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "Dosya Adları" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "Devral" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "Temizle" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "Uygula" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "Tamam" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "Dosyayı Yorumla/Puanla (İçerik tüm kullanıcılara gösterilecektir.)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"Bir filmin uzunluğu, öyküsü, dili hakkında yorumda bulunabilir\n" +" ve sahteyse diğer kullanıcıları uyarabilirsiniz." + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "Dosya Kalitesi" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "" +"Dosya puanlaması seçiniz veya geçersiz ise diğer kullanıcıları uyarınız." + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "Yorum Yok" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "Yenile" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "Aktarılıyor, lütfen bekleyiniz ..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "Boyut bilinmiyor" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "Gerekli Bilgiler" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "IP Adresi:" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "Port:" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "Ek Bilgi" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "Kullanıcı Adı :" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "Kullanıcı Adreslemesi :" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "Paylaşılan dosyalarınızı yeniden yükleyin" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "Şimdiki Oturum" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "Toplam" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "İstenilen :" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "Aktif Göndermeler:" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "İndirme Hızı" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "Şimdiki" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "Çalışma ortalaması" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "Oturum ortalaması" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "Gönderim Hızı" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "Bağlantılar" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "Aktif İndirmeler" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "Aktif Bağlantılar (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "Aktif Göndermeler" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "İstatistik Ağacı" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "Kullanıcı Adı:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "Kullanıcı Adreslemesi:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "Yazılım:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "Yazılım Sürümü:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "IP :" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "Kullanıcı ID:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "Sunucu IP:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "Sunucu:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "Yapılan aktarımlar" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "Şimdiki İstek:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "Ortalama gönderim oranı:" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "Ortalama aktarım oranı:" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "Gönderilen (oturum):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "İndirilen (oturum):" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "Gönderilen (toplam):" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "İndirilen (toplam):" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "Skor" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "İND./GÖN. niteleyici:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "Güvenli Kimlik:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "Puanlama (toplam):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "Sıra skoru:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "Genel Ayarlar" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "Rumuz" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - Linux Katırı" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "Bağlandığınızda diğerlerinin göreceği isminiz budur." + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "Dil" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "Arayüzde kullanılacak dil." + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "Çeşitli Seçenekler" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "Yeni sürümü başlangıçta kontrol et." + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "Bunu etkinleştirmek, aMule'nin yeni sürümleri aramasını sağlar." + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "Küçültülmüş başla" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "Bunu etkinleştirmek aMule'nin küçültülmüş durumda başlamasını sağlar." + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "Çıkışta uyar" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "aMule'nin çıkışta sizi uyarmasını sağlar." + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "Sistem tablası simgesini etkinleştir." + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "" +"Bu, sistem tablası (ya da görev çubuğu) simgesini Etkinleştirir/Devreden " +"çıkarır." + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "Sistem tablasına küçült." + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "Bu, aMule'nin görev çubuğu yerine sistem tablasına küçülmesini sağlar." + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "İpucu gösterme gecikmesi" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "İpuçlarını göstermeden önce geçecek süreyi belirler." + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "Tarayıcı Seçimi" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "Tarayıcınızı burada seçiniz" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "Kullanıcı Tanımlı Tarayıcı:" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"Tarayıcınızın adını buraya giriniz. Kişisel bir tarayıcı kullanmak için " +"yukarıdaki 'Kullanıcı Tanımlı' seçeneğini seçiniz." + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "Mümkünse yeni sekmede aç" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "Web sayfasını ,yeni pencere yerine mümkünse yeni sekmede açar." + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "Bağlantı Sınırları" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "Gönderme" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "Slot Tahsis Boyutu" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "Bağlantı Kapasitesi" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" +"Not: Bu değerler sadece\n" +"istatistiklerde kullanılacak." + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "Standart TCP Portu:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "Bu, standart ED2K portudur ve devre dışı bırakılamaz." + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "Genişletilmiş UDP Portu:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "Bu port, genişletilmiş Ed2K istemleri ve Kademlia ağı için kullanılır." + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "devre dışı" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "Bağlı Adres" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "Genişletilmiş sunucu istemleri için UDP portu (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "Dosya başına En Fazla Kaynak" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "Azami Sınır" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "Bağlantı Sınırları" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "En Fazla bağlantı sayısı" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kademlia" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "Evrensel Tak ve Çalıştır" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "UPnP'yi aktifleştir." + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "UPnP TCP Portu:" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "Başlangıçta otomatik bağlan" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "Bağlantı koptuğunda yeniden bağlan" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "Ek Yük Sınırını Göster" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "Sunucu Seçenekleri" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "Ölü sunucuları" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "denemeden sonra kaldır" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "Başlangıçta sunucu listesini otomatikman güncelle" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "Liste" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "Bir sunucuya bağlandığında sunucu listesini otomatikman güncelle" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "Bir kullanıcıya bağlandığında sunucu listesini otomatikman güncelle" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "Öncelik sistemini kullan" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "Bağlanırken akıllı DüşükID kontrolü yap" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "Güvenli Bağlantı" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "Sadece statik listesindeki sunuculara otomatikman bağlan" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "Elle eklenmiş sunuculara Yüksek Öncelik ata" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "I.C.H aktif" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "AICH her adreslemeyi doğru kabul etsin. (önerilmez)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "Dosyaları aktarımlara duraklatılmış modda ekle" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "Dosyaları, aktarımlara otomatik öncelikle ekle" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "İlk ve son parçaları en önce indirmeye çalış" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "Dosyaları paylaşılanlara otomatik öncelikle ekle" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "Bütün gönderimlere tam parçaları yollamayı dene" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "Bir dosya tamamlandığında sonraki duraklatılmış dosyayı başlat" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "Aynı kategoriden" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "Nadir bulunan dosyalarda 10 kaynak sakla (<20 kaynak)" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "Disk Alanı" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "Disk Alanını kontrol et" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "aMule'nin Disk Alanını kontrol etmesi için seçiniz" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "En Az Disk Alanı:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "Buraya istenilen en az disk alanını giriniz" + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "Gelen Dosyalar Dizini :" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "Geçici Dosyalar Dizini :" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "Paylaşılan Dizinler" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "(Sürekli paylaşım için dizin simgesine sağ tıklayınız.)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "Gizli dosyaları paylaş" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "Ortam Çalıcısı" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "Ön İzleme için yedekleme oluştur" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "Grafikler" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "Güncelleme gecikmesi: 5 sn" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "Ortalama grafiği için süre: 100 dk" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "Bağlantı Grafik Ölçüsü: 100" + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "İstatistik Renklerini Seçiniz" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "Arkaplan" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "Izgara" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "Şu anki aktarımlar" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "Aktarım çalışma ortalaması" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "Aktarım oturum ortalaması" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "Şu anki gönderme" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "Gönderme çalışma Ortalaması" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "Gönderme oturum ortalaması" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "Aktif bağlantılar" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "Sistem Tablası Simgesi Hız Göstergesi" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "Şu anki Kad nodları" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "İşlemdeki Kad-nodları" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "Oturumdaki Kad-nodları" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "Seçiniz" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "Gösterilen Yazılım Sürümü Sayısı (0=sınırsız)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "Bildirimler" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "İleti Penceresi" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "Ses Kullan" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "Şu durumda pencere aç :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "Kayıt (Log)da yeni giriş" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "Yeni bir sohbet başladığında" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "Yeni bir ileti alındığında" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "Bir aktarım eklendiğinde veya tamamlandığında" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "Yeni bir aMule sürümü bulunduğunda" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "Sunucuyla bağlantı kesildiğinde" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "E-Posta ile Uyar" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "Bir aktarım tamamlandığında e-posta gönder." + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "SMTP sunucusu :" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "E- Posta Adresi :" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! UYARI !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"Ne yaptığınızı bilmediğiniz sürece \n" +"bu ayarları değiştirmeyiniz.\n" +"Yoksa her şeyi karıştırabilirsiniz.\n" +"\n" +"Bu ayarlarla oynanmasa da\n" +"aMule gayet iyi işleyecektir." + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "İleri Ayarlar" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "En fazla yeni bağlantı / 5 sn" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "Dosya Tampon Boyutu: 240000 bayt" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "Gönderme Sıra Boyutu: 5000 kullanıcı" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "Sunucu bağlantısı yenileme sıklığı :Devre dışı" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "Arayüz Seçenekleri:" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "Aktarım Sırası Dosya İşlemi" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "Tamamlanmış aktarım yüzdesini göster." + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "İşlem çubuğunu göster. " + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "İşlem çubuğu biçemi" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "Düz" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "Yuvarlatılmış" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "Kaplama Desteği" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "Kaplama desteğini etkinleştir." + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "Kaplama:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "-kaplama yok-" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "Sütun Sıralama" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "" +"Aktarım sırasındaki dosyaları, otomatikman sırala (Yüksek işlemci yükü)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "aMule aktarım listenizdeki sütunları otomatikman sıralayacaktır." + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "Çeşitli Arayüz Seçenekleri" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "Hızlı ED2K Alıcısını göster." + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "Kategori sekmelerinde genişletilmiş bilgi göster." + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "Başlık çubuğunda aktarım oranlarını göster." + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "Dikey araç çubuğu yerleşimi" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "İsimden önce parça dosyası numarasını göster." + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "Uzaktan Kontrol" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Web Sunucusu Parametreleri" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "Başlangıçta amuleweb'i çalıştır." + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Web Sunucusu portu" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "Web Sunucusu portuna UPnP port yönlendirmesini etkinleştir." + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Web Sunucusu UPnP TCP portu" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "Sayfa yenileme zamanı (sn)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "Gzip sıkıştırmayı etkinleştir." + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "Düşük hakka sahip kullanıcıyı etki kıl." + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "Tam hak şifresi" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "Düşük hak şifresi" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Web şablonu" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "Dışarıdan Bağlantı Parametreleri" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "Dışarıdan bağlantıları kabul et." + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"Dinleme arayüzü için IP\n" +"(yok ise boş)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "" +"Dinleme EC arayüzü için a.b.c.d biçiminde geçerli bir ip giriniz. Boş " +"bırakılan alan veya 0.0.0.0 arayüz yok demektir." + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "TCP portu" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "EC portuna UPnP port yönlendirmesi etkin." + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "Ayarlarda yapılan değişikliklerin uygulanması için buraya tıklayınız." + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "Ayarlarda yapılan değişiklikleri sil." + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "Başlık :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "Yorum:" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "Gelen Dosyalar Dizini :" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "Yeni eklenen dosyalar için öncelikleri değiştir." + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "Değiştirme" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "Bu kategori için renk seçiniz. (varsayılan) :" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "Bağlanıldığında sunucu motd göster...." + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "Sunucu Bilgisi" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "Kayıtları (Log) silmek için bu düğmeye basınız." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "aMule Kayıtları" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "Sunucu listesini İnternet'ten güncellemek için bu düğmeye basınız..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "Sunucu Listesi" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "" +"Adresi server.met dosyasına buradan giriniz. Sonra, bilinen sunucuları " +"güncellemek için soldaki düğmeye tıklayınız." + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "Elle Sunucu Ekle : Ad" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "Yeni sunucunun adını buraya giriniz." + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "Yeni sunucun IP numarasını x.x.x.x biçiminde buraya giriniz." + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "Sunucunu portunu buraya giriniz." + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "Sunucuyu elle ekle (önce soldaki alanları doldurunuz) ..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "ED2K Bilgileri" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Kademlia Bilgileri" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"Seçilen yerel dil sisteminizde yüklü değil.\n" +"Bu dili kullanmak için oluşturmalısınız.\n" +"Linux sistemlerinde en iyi başlangıç yeri /etc/locale.gen dosyası ve locales " +"paketidir.\n" +"İyi Şanslar!\n" +"(Not: Bir şekilde bunu ayarlamaya çalışacağım]" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "Bunu tekrar gösterme." + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "Nod listesini İnternet'ten güncellemek için bu düğmeye tıklayınız." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "Nodlar (0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "" +"Bilinen nodları güncellemek için buraya adresi giriniz ve soldaki düğmeye " +"tıklayınız." + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "Nod Durumu" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "Ön Yükleme" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "Yeni nod" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "Port:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "" +"Bilinen kullanıcılardan\n" +"Ön Yükleme" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "Kad. Bağlantısını Kes" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "Protokol Gizleme" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "Protokol Gizleme etkin" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "" +"Bu seçenek Protokol Gizleme'yi etkinleştirir ve aMule'nin gizlenmiş " +"bağlantıları kabul etmesini sağlar." + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "Giden bağlantılar için gizleme kullan" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "" +"Bu seçenek diğer kullanıcı veya sunucularla olan bağlantılarda Protokol " +"Gizleme'yi etkinleştirir." + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "Sadece gizlenmiş bağlantıları kabul et" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"Bu seçenek aMule'nin sadece gizlenmiş bağlantıları kabul etmesini sağlar." +"Daha az kaynak bulursunuz;ancak tüm trafiğiniz de gizlenmiş olur." + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "Dosya Seçenekleri" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "Herkes" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "Hiç Kimse" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "Paylaşılan dosyaları görebilecek olanlar:" + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "Paylaşılan dosyalarınızı kime göstereceğinizi seçiniz." + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "IP_Süzme" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "Kullanıcıları Süz" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"~/.aMule/ipfilter.dat dosyasında tanımlanan kullanıcı IP'lerini süzmeyi " +"etkinleştir." + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "Sunucuları süz" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "" +"~/.aMule/ipfilter.dat dosyasında tanımlanan sunucu IP'lerini süzmeyi " +"etkinleştir." + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "Listeyi yeniden yükle" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "~/.aMule/ipfilter.dat dosyasından IP'leri süzgece yeniden yükle." + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "Adres:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "Şimdi güncelle" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "Ip süzgecini başlangıçta otomatikman güncelle." + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "Süzme Seviyesi:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "Her zaman LAN IP'lerini süz." + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "Uyuşmayan IP'lere şüpheci yaklaşım." + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "" +"Paketin alındığı ip ile kullanıcı ip numarası farklıysa paket reddedilir." +"(Dikkatli kullanın)" + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "Varsa, sistem geneli ipfilter.dat kullan" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "" +"Yerel bir ipfilter.dat dosyası bulunamazsa, sistem geneli ipfilter " +"kullanımına izin ver" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "Kullanıcı" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "" +"Bu seçeneği aktifleştirmeniz önerilir. SUI aktif değilse, kredi alamazsınız." + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "Etkinleştir/Devre dışı bırak" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "Çevrimiçi-İmza Etkin" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "" +"Diğer uygulamaların imzalar ve benzerlerini oluşturabilmesi için " +"kullanabileceği Çev.İmza dosyasını yazmayı etkinleştirir." + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "Güncelleme Sıklığı (Sn.):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "" +"Çevrim içi İmza güncellemeleri için (saniye bazında) sıklığı değiştirir." + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "Çevrim içi İmza Dizini:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "Çevrim içi İmza dosyalarını içeren dizini seçiniz." + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "Etkinleştir/Devre dışı bırak" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "Gelen iletileri süz (o anki sohbet dışında.)" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "Süzgeç Seçenekleri:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "Hepsini süz." + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "Arkadaş listesindekiler dışında herkesi süz." + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "Bilinmeyen yazılımlardan gelenleri süz." + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "Şu içerikteki iletileri süz (ayraç olarak ',' kullanınız.):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "" +"Buraya ekleyeceğiniz sözcükleri içeren iletiler aMule tarafından engellenir." + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "Yorumlar" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "Şu içerikteki iletileri süz (ayraç olarak ',' kullanınız.):" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "Proksiyi Etkinleştir." + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "Proksi desteğini etkinleştir/devre dışı bırak" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "Proksi Türü:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "Bağlanacağınız proksi türü" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "Proksi host:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "Proksi host adı" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "Proksi Portu:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "Proksi portu" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "Yetkilendirme" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "Yetkilendirmeyi etkinleştir." + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "Kullanıcı adı/şifre yetkilendirmeyi etkinleştir/devre dışı bırak." + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "Proksiye bağlanmak için gerekli kullanıcı adı" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "Şifre:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "Proksiye bağlanmak için gerekli şifre" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "Proksi kullanmadan otomatik sunucu bağlantısı" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "Bağlan:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "Uzaktan aMule'ye giriş yapınız." + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "Kullanıcı adı" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "Bu ayarları hatırla" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "Fazladan Hata Çıktısı Kaydını Etkinleştir." + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "İleti Kategorileri:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "İçe aktarımları ekle" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "Seçileni tekrar dene" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "Seçileni çıkar" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "Olay türleri" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "Herhangi bir sunucuya ve/ya Kad.'a bağlan." + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "Yeni Kategori" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "Gelen dosyalar için bir dizin seçin" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "Kategori için bir isim girmelisiniz!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "Kategori için bir yol girmelisiniz!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "" +"Kategori için gelen dizini oluşturma başarısız. Lütfen geçerli bir yol " +"giriniz!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "Bilinmeyen %s uzantısı, %s komutu için.\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "Bilinmeyen komut '%s' .\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"Bu komut bir argüman içeremez.\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"Bu komut bir argüman içermelidir.\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"Bu komut eksik.Aşağıdaki uzantılardan birini girmelisiniz.\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"Uygun uzantılar:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "Uygun komutlar:\n" + +#: src/ExternalConnector.cpp:188 +#, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"Tüm komutlar büyük-küçük harf duyarlıdır.\n" +"'%s ' tuşlayarak hakkında detaylı bilgi alabilirsiniz.\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "Uygulamadan çıkar." + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "Yardımı göster." + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"Bir komut hakkında yardım çağırmak için 'help ' yazınız.\n" +"Tüm komutları görmek için 'help' yazınız.\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"Komut listesi için '%s' kullanınız.\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "Syntax hatası!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "" +"Komut çalıştırmada hata.- Bu hiç olmamalıydı! Lütfen hatayı bildiriniz.\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "Bu komut herhangi bir parametre içermemeli." + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "Bu komut bir parametre içermeli." + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "Geçersiz argüman." + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "Bu eksik bir komut." + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "Daha fazla yardım için '%s' yazınız.\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "Bu bir %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "Bu bir %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"Yazılım oluşturuluyor...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "Belirtilen hosta bağlanılamadı.\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"Tamam, çıkılıyor %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"Boş bir şifreyle bağlanılamaz.\n" +"Ya yapılandırma dosyasında ya da komut\n" +"satırında bir şifre olmalı veyahut da istendiğinde girmelisiniz\n" +"\n" +"Çıkılıyor...\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "Bu yardım dosyasını göster." + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "aMule'nin çalıştığı host. (varsayılan: localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "Dışarıdan bağlantı için aMule portu. (Varsayılan:4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "Dışarıdan bağlantı şifresi." + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "Yapılandırmayı dosyadan oku." + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "stdout' a herhangi bir çıktı yazdırma." + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "Geveze ol - hata iletilerini de göster." + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "Yazılım yerelini ayarla (dil)" + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "Komut satırı seçeneklerini yapılandırma dosyasına yaz." + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "" +"aMule' nin yapılandırma dosyasını temel alan yapılandırma dosyası oluşturur." + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "Yazılım sürümünü yazdır." + +#: src/ClientCreditsList.cpp:168 +#, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "Kredi dosyası yüklendi. %u adet kullanıcı biliniyor" + +#: src/ClientCreditsList.cpp:171 +#, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] " - %u adet kullanıcı için krediler bitti!" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "'cryptkey.dat' dosyası bulunamadı. Oluşturuluyor..." + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"HATA: aMule daemon dış bağlantılar devre dışı bırakıldığında kullanılamaz. " +"Dış Bağlantıları etkinleştirmek için ya aMule'yi, --ec-config seçeneği ile " +"birlikte amuledi başlatarak ya da ~/.aMule/amule.conf dosyasındaki " +"\"AcceptExternalConnections\" seçeneğini 1 olarak ayarlayın." + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "HATA: %s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "Yasaklama" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "Gönderimleri Göster" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "Sırayı Göster" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "Kullanıcıları Göster" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "Görünüm Seçiniz" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "Kullanıcı Yazılımı" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "Beklenen" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "Gönderme Süresi" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "Gönderme/İndirme" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "Uzak Durumu" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "SR: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "Dosya Önceliği" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "Skor" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "Soruldu" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "Son görülme" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "Girilen Sıra" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "Gönderme Durumu" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "Gönderilen" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "Aktarım Durumu" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "Aktarılan" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "Kullanıcı Adreslemesi" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "Şifrelenmiş" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "Paylaşılan dosyaları gizle" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "Kullanıcı Ayrıntıları" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "Desteklenmiyor." + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "Eksik" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "Kötü Çocuk" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "İncelendi - Tamam" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "Uygun değil." + +#: src/ClientDetailDialog.cpp:190 +#, c-format +msgid "%u (QR: %u)" +msgstr "%u (SR: %u)" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "" +"En küçük boyut, en büyük boyuttan küçük olmalıdır. En büyük boyut göz ardı " +"ediliyor." + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "Arama uyarısı." + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "Sınırsız" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "aMule Sistem Tablası Menüsü" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "Hız Sınırları:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "GÖN: Yok" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "GÖN: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "İND: Yok" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "İND: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "Aktarım Hızı: %1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "Gönderme Hızı: %1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "Yazılım Bilgisi" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "Rumuz: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "Rumuz Seçilmedi!" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "KullanıcıID: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "Sunucu Adı:" + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "SunucuIP:" + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "TCP Port: %d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "TCP Port: Hazır Değil" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "UDP Port: %d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "UDP Port: Hazır Değil" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "Çevrim içi İmza: Devrede" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "Çevrim içi İmza: Devre dışı" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "Paylaşılan Dosyalar: %d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "Sıralı Kullanıcılar: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "Toplam İND: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "Toplam GÖN: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "Gönderme Sınırı" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "Aktarma Sınırı" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "aMule'yi Gizle" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "aMule'yi Göster" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "Sohbet Oturumu Başladı: %s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** Kullanıcıya Bağlandı. ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** Kullanıcıya Bağlanıyor.***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** Kullanıcıya bağlantı başarısız. / Bağlantı koptu.***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "Sekmeyi Kapat" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "Tüm sekmeleri kapat" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "Diğer sekmeleri kapat" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "Server.met dosyası yükleniyor: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "Server.met dosyası bulunamadı!" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "Server.met dosyası '%s' açılamadı. Bilinmeyen format." + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "Server.met açılamadı!" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "Server.met dosyası bozuk, geçersiz sürüm eki bulundu: 0x%x, size %i" + +#: src/ServerList.cpp:168 +#, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "%i adet sunucu server.met dosyasında bulundu" + +#: src/ServerList.cpp:170 +#, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d adet sunucu eklendi" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "Sunucu eklenmedi: [%s:%d] geçerli bir port içermiyor." + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "Sunucu eklenmedi: [%s:%d] IP'si süzüldü veya geçersiz." + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "Sunucu eklenmedi: Listede IP:Portu [%s:%d] eşleşen bir sunucu bulundu." + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "Sunucu eklendi: [%s:%d] adresindeki sunucu '%s' adını kullanıyor." + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "" +"Silmeye çalıştığınız sunucuya bağlı durumdasınız. Lütfen, öncelikle " +"bağlantıyı kesiniz." + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "Server.met kaydetme işlemi başarısız!" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "Geçersiz adres" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "%s adresinden sunucu aktarımı tamamlandı." + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "%s adresinden sunucu listesi alınamadı." + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"addresses.met dosyasında hiç sunucu listesi adresi bulunamadı. Lütfen " +"otomatik güncelleyebilmek için bu dosyaya geçerli bir sunucu listesi adresi " +"yapıştırınız." + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "Sunucu listesini %s adresinden indirmeye başla." + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "" +"Uyarı, şu sunucuların otomatikman güncellenmesi için girilen adres geçersiz: " +"%s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "" +"address.dat üzerinde, geçerli bir server.met güncelleme adresi bulunamadı." + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "" +"Yerel sunucu IP Süzgeci tarafından engellendi, başka bir sunucuya " +"bağlanılıyor!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "%s komutunun %s olayında çalıştırılması başarısız oldu." + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "" +"Bir yapılandırma değişikliği nedeniyle dil ayarınız 'Sistem Varsayılanı'na " +"çevrildi.Üzgünüm. Valla..." + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"Sunucu listesinde mevcut bir sunucu yok.\n" +"aMule'nin yeni bir liste indirmesini ister misiniz?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "Sunucu listesi indirme" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "web sunucusu pid %d üzerinde çalışıyor." + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"Web sunucusunun başlangıçta çalışmasını istemişsiniz, ancak amuleweb paketi " +"çalıştırılamıyor. Lütfen ya web sunucusu içeren aMule paketini yükleyin ya " +"da aMule'yi --enable-webserver kullanarak derleyip kurun." + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "Belirtilen şu adrese protlar bağlanamıyor: %s" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "Port. %u kullanılamıyor. DÜŞÜKID alacaksınız.\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"Port. %u kullanılamıyor!\n" +"\n" +"Bunun anlamı DÜŞÜKID alacağınızdır.\n" +"\n" +"Ağ ayarlarınızı kontrol ederek portun giriş ve çıkışlar için açık olup " +"olmadığını kontrol ediniz." + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "Çevrim içi İmza dosyası oluşturma başarısız." + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "aMule Çevrim içi İmza dosyası oluşturma başarısız." + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"Seçilen yerelleştirme görünüşe göre bilgisayarınızda yüklü değil. (Not: Bunu " +"yine de yapmaya çalışacağım)" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "Hoş geldiniz! aMule %s sürümünü ilk kez kullanıyorsunuz." + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "Bu sürüm bir deneme sürümü, her gün güncellenir ve\n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "bir şeyleri bozmayacağını veya evinizi yakmayacağını \n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "" +"yahut da köpeğinizi öldürmeyeceğini garanti edemeyiz. Fakat bir *sorun* " +"yaratmayacağını da umuyoruz.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "Aşağıdaki seçenekler güvenlik sebebiyle bu sürümde değiştirilmiştir:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* Gelen ve giden bağlantılar için Protokol Gizleme \n" +"etkinleştirildi.\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* Sunucu listesinin diğer sunucular ve kullanıcılardan güncellenmesi devre " +"dışı bırakıldı.\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"Bu değişikliklerin sebepleri hakkında bilgi için;\n" +" http://wiki.amule.org adresindeki aMule Wiki \"sahte sunucular\" bilgisini " +"araştırın.\n" +"aMule'nin düzgün çalışabilmesi için sunucu listenizdeki sahte sunucuları " +"temizlemeniz çok önemlidir." + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "Daha fazla bilgi, destek ve yeni sürümler ana sayfamızda bulunabilir\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "www.aMule.org veya IRC Kanalımız: #aMule at irc.freenode.net.\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "Her türlü hatayı bize bildirmekten çekinmeyin http://forum.amule.org" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"Belirlediğiniz Çevrim içi İmza dosyaları dizini GEÇERSİZ!\n" +" Çevrim içi İmza, ayarlarınızda düzeltene kadar DEVREDIŞI bırakıldı." + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "HATA: Kayıt dosyası açılamıyor." + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "UYARI: Kayıt dosyası boş, bir şeyler yanlış." + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "Kayıt silindi." + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "Sunucu İletisi: %s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "Nod listesini indirme başarısız." + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "İndirilen sürüm kontrol dosyasını açma başarısız oldu." + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "Bozuk sürüm kontrol dosyası" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "aMule'nin eski bir sürümünü kullanıyorsunuz!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "aMule sürümünüz %i.%i.%i ve en güncel sürüm %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "En güncel sürüm her zaman http://www.amule.org adresinde bulunabilir." + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "UYARI: aMuled sürümünüz eski: %i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "aMule sürümünüz güncel." + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "Sürüm kontrol dosyasını indirme başarısız oldu." + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "Bağlandı: %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "Bağlanıyor: %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "ED2K bağlantısı kesildi" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kademlia başladı." + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kademlia durdu." + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "Kademila ağına bağlanıldı (tamam)" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "Kademlia ağına bağlanıldı. (Güvenlik duvarı)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "Kademlia bağlantısı kesildi." + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "" +"UDP portu ayarlarda devre dışı bırakılmışsa Kad ağı kullanılamaz. " +"Başlatılmıyor." + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Kad. ağı ayarlarda devre dışı bırakılmış, bağlanılmıyor." + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "Okuma için arkadaş listesi dosyası 'emfriends.met'açılamıyor." + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "Yazım için arkadaş listesi dosyası 'emfriends.met'açılamıyor." diff --git a/po/zh_CN.po b/po/zh_CN.po new file mode 100644 index 00000000..40d5dc46 --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,8497 @@ +# Chinese translation of aMule. +# Copyright (C) YEAR Free Software Foundation, Inc. +# This file is distributed under the same license as the PACKAGE package. +# Chen Nan, 2004. +# xiaoqiao <29551030@qq.com>, 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: aMule 2.2.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2007-12-21 23:00+0800\n" +"Last-Translator: 小桥 <29551030@qq.com>\n" +"Language-Team: 小桥 <29551030@qq.com>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "您必须输入密码" + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "非法密码,不是合法的MD5校验码" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "连接失败" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "连接外部连接失败,回复为空" + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "外部连接:访问被拒绝,原因:" + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "外部连接:请求被拒绝" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "外部连接:服务器回复错误。已断开连接。" + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "成功!连接成功建立" + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "已成功连接。" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "正在校检" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "正在完成" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "完成" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "已暂停" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "已出错" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "正在下载" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "等待中" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "开始为文件 %s 创建 MD4 和 AICH 校验码" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "开始为文件 %s 创建 MD4 校验码" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "开始为文件 %s 创建 AICH 校验码" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "正在转换在 '%s'在 '%s' 中旧的 AICH 校验集至64b" + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "警告:文件名 '%s' 非法,已经重命名为 '%s'。" + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "警告:文件 '%s' 已经存在,新文件重命名为 '%s'。" + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "警告:为 '%s' 建立备份后无法删除原文件" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "警告:无法删除 %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "无法获取用户 %s 的共享文件" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "未知" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (假冒 eMule 版本 %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (假冒 eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (假冒 eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (基于 eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "昵称:%s ID:%u" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "已请求:" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "本次运行文件统计:接受了 %d 个请求(总请求数 %d),已传送 %s\n" +msgstr[1] "本次运行文件统计:接受了 %d 个请求(总请求数 %d),已传送 %s\n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "历史运行文件统计:接受了 %d 个请求(总请求数 %d),已传送 %s\n" +msgstr[1] "历史运行文件统计:接受了 %d 个请求(总请求数 %d),已传送 %s\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "请求了未知文件" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "用户 %s 位于 %s:%d,使用 %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "用户名" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "好友" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "显示详细信息 (&D)" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "添加好友" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "删除好友" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "发送消息 (&M)" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "查看共享文件" + +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "建立好友通道" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "确定删除选中的好友吗?" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "确定删除选中的好友吗?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "取消" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"只设计了一个通道,不允许设置超过一个好友通道。\n" +" " + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "多选" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "文件名" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "大小" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "类型" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "优先级" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "文件编号" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "请求" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "接受的请求" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "已传送数据" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "共享比例" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "已下载数据段" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "完整源" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "所在目录" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "共享文件" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "极低" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "低" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "普通" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "高" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "极高" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "发布" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "自动" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "添加注释" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "编辑注释" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "更名" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "添加收藏中的文件至传输列表" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "复制 magnet 地址到剪贴板(&U)" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "复制 ED2k 链接到剪贴板 (&L)" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "复制 ED2K 链接到剪贴板 (源(&S))" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "复制 ED2K 链接到剪贴板(源) (使用加密选项(&W))" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "复制 ED2K 链接到剪贴板(主机名(&H))" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "复制 ED2K 链接到剪贴板(主机名) (使用加密选项(&C))" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "复制 ED2K 链接到剪贴板(&AICH 信息)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "复制反馈信息到剪贴板" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "你需要高 ID 来产生源链接" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "警告" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "共享文件 (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[part 文件]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "请输入新文件名" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "更改文件名" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "继续上传此文件:%s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "暂停上传此文件:%s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kad:搜索关键词太短" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "错误:无法监听TCP端口。" + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "请求失败,错误为:%s" + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "请求失败,错误未知。" + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "索引文件未找到:" + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "无法创建 Web 端口进程\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Web 服务器:已启动\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "会话过期 - 正在请求登录\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "会话正常,已登录\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "会话正常,未登录\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "没有会话已打开 - 将请求登录\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "会话已创建 - 正在请求登录\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "正在处理请求 [原始]:" + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "检查密码\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "密码校验值错误\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "密码正确\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "密码错误\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "您没有输入密码,不允许空密码。\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "已请求注销\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "正在处理请求 [已重定向]:" + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "载入模板 " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "HTTP服务器端口" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "在 Web 服务器端口使用 UPnP端口转发" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "UPnP 端口" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "使用 gzip 压缩" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Web 服务器最高访问权密码" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "服务器访客密码" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "允许访客访问" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "拒绝访客访问" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "载入/保存 Web 服务器设置 自/至 远程 aMule" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "aMule 设置文件路径。不要直接使用!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "禁用 PHP 解释器(已废弃)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "为每个请求重编译 PHP 页面" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "aMule Web 服务器" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "不可用" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "从不" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "正在下载..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "(%s / %s)" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "设置" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "amulesig.dat 文件所在的目录" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "浏览" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "请输入 amulesig.dat 文件所在的目录" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "刷新周期(秒)" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "每次刷新都生成统计图" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "输入存放所产生的统计图的目录" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "周期性上传统计图到 FTP 服务器" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "FTP 地址" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "FTP 路径" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "输入 FTP 服务器的地址" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "输入 FTP 服务器上存放统计图的目录" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "用户名" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "密码" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "输入登录 FTP 服务器的用户名" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "输入登录FTP服务器的密码" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "FTP上传周期(分钟)" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "检测" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "统计文件所在文件夹" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "统计图存放文件夹" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i 天 %i 小时 %i 分钟 %i 秒" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas,aMule 在线统计" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "欢迎!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "本次运行最高下载速度" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "历史最高下载速度" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "重置" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "系统" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "停止自动刷新" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "保存在线统计图" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "打印在线统计图" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "设置" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "关于 wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "开始自动刷新" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "自动刷新已停止" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "自动刷新已开始" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "保存统计图" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "无法处理该文件类型" + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "文件未被保存" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "aMule 在线统计" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"打印时出现问题。\n" +"可能当前打印机没有设置正确?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "打印中" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, aMule 在线统计\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"基于 GPL 协议分发" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "aMule 没有运行" + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule 正在运行" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule 正在运行,但是已断开连接" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule 正在连接..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "aMule状态不明..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " 已经运行 " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr "已停止!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr "未连接!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " 正在连接..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " 状态不正常,请检查!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr "已连接至" + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr "Kad:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "确定" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "被防火墙阻挡" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "关闭" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " 是在 " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +#, fuzzy +msgid " with " +msgstr "] 和 " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "总下载:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ",上传:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "本次运行下载:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "下载:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s,上传:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "共享:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " 文件,队列长度:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "时间:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " 在 " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "系统平均负载(1-5-15 分钟):" + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "系统运行时间:" + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02u天 %02u小时 %02u分钟 %02u秒" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02u小时 %02u分钟 %02u秒" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02u分钟 %02u秒" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02u秒" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "高ID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "低ID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "未连接" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "已取消!" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "无法打开 %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "文件 %s 过大:上限为4GB。" + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "输入参数" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "需计算校检码的文件" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "添加附加链接到该文件" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "输入需要创建 ED2K 链接的文件" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "在这里输入要添加的 ED2K 链接,在结尾加 '/' 以附加此文件名" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "添加" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "删除" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "清除" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "创建有文件块校检码的链接" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "该选项可以帮助新文件和稀有文件更快散播,只是链接长度会增加" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "MD4 文件校检码" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "ED2K 文件校检码" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "ED2k 链接" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "开始" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "保存" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "复制到剪贴板" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "退出" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "打开要创建 ED2K 链接的文件" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "复制 ED2K 链接到剪贴板" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "保存 ED2K 链接到文件" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "关于 aLinkCreator" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "选择要创建 ED2K 链接的文件" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "当前无内容需要复制!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "请选择要创建 ED2K 链接的文件" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "无法读取 " + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "请输入一个非空的文件名" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "暂时没有东西可保存!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, 用于创建 ed2k 链接\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"图片来自 http://www.everaldo.com 和 http://www.icomania.com\n" +"以及 http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"基于 GPL 协议发布" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "正在生成校检码" + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "在 %.2f 秒内完成" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "您已添加了该链接!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "请输入一个非空的链接" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "正在处理文件号 %u: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "您要求了文件块校检码(只用于大于 9.5 MB 的文件)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "请等待 ..." + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> 文件不存在!\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, aMule ED2K 链接生成器" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "自动 [低]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "自动 [普]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "自动 [高]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "正在连接" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "正在询问" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "通过服务器连接中" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "队列已满" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "在排队" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "正在传送" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "正在接收校检码" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "没有需要的部分" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "无法连接两个低ID用户" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "连接过多" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "正在用 Kad 连接" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Kad 连接过多" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "封杀" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "连接错误" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "远程队列已满" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "旧版 MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "新版 MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "eMule 兼容程序" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "本地服务器" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "远程服务器" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "源交换" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "被动" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "链接" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "资源种子" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "系统默认" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "阿拉伯语" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "巴斯克语" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "保加利亚语" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "加泰罗尼亚语" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "简体中文" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "繁体中文" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "克罗的亚语" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "丹麦语" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "荷兰语" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "英语(英国)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "爱斯托尼亚语" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "芬兰语" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "法语" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "加利西亚语" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "德语" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "希腊语" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "匈牙利语" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "意大利语" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "意大利语(瑞士)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "日语" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "韩语" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "立陶宛语" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "新挪威语" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "芬兰语" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "葡萄牙语" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "葡萄牙语(巴西)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "俄语" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "斯洛文尼亚语" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "西班牙语" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "瑞典语" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "土耳其语" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "未检测到所选择的浏览器" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "TCP端口不可高于65532,因为服务器UDP端口值为TCP端口值+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "缺省端口将被使用(%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "服务器名称" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "地址" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "端口" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "描述" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "响应时间" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "用户数" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "文件" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "失败次数" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "静态" + +# +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "版本" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "现在正连接在要删除的服务器。该服务器暂时无法删除。请先断开连接。" + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "信息" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(未知名称)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "您确定要删除静态服务器 %s ?" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "是" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "否" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "无法读取 '%s'" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "服务器(%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "服务器" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "连接到服务器" + +#: src/ServerListCtrl.cpp:428 +#, fuzzy +msgid "Mark server as static" +msgstr "标记服务器为静态" + +#: src/ServerListCtrl.cpp:429 +#, fuzzy +msgid "Mark server as non-static" +msgstr "标记服务器为非静态" + +#: src/ServerListCtrl.cpp:431 +#, fuzzy +msgid "Mark servers as static" +msgstr "标记服务器为静态" + +#: src/ServerListCtrl.cpp:432 +#, fuzzy +msgid "Mark servers as non-static" +msgstr "标记服务器为非静态" + +#: src/ServerListCtrl.cpp:438 +#, fuzzy +msgid "Remove server" +msgstr "删除服务器" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "删除服务器" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "删除所有服务器" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "复制 ED2K 链接到剪贴板" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "复制 ED2K 链接到剪贴板" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "重新连接到服务器" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "您确定要删除所有服务器吗?" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "您确定要删除已选的服务器吗?" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "您确定要删除已选的服务器吗?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "已禁用 [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "这是 基于eMule 的 aMule %s。" + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "运行于 %s" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "访问 http://www.amule.org 可查看是否有新版本" + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "严重错误:无法建立计时器" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "aMule 远程控制" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "快照:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr " 基于 eMule 的“全平台”P2P 客户端\n" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr " 网站:http://www.amule.org \n" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr " 论坛:http://forum.amule.org \n" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" +" FAQ: http://wiki.amule.org \n" +"\n" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr " 联系邮件:admin@amule.org (管理问题) \n" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr "" +" 版权所有 (C) 2003-2008 aMule 团队 \n" +"\n" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr " aMule 的一部分是基于 \n" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr "KAD:基于异或算法的点对点路由。\n" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr " 版权所有 (C) 2002 Petar Maymounkov\n" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr " http://kademlia.scs.cs.nyu.edu\n" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "消息" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "状态" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "正在连接" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "连接已断" + +#: src/amuleDlg.cpp:676 +#, fuzzy +msgid "Kad: Firewalled" +msgstr "有防火墙" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "已连接" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "正在连接" + +#: src/amuleDlg.cpp:689 +#, fuzzy +msgid "Kad: Off" +msgstr "Kad:" + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "终止连接尝试" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "断开连接" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "断开网络。" + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "连接" + +#: src/amuleDlg.cpp:726 +#, fuzzy +msgid "Connect to the currently enabled networks" +msgstr "连接至网络。" + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "上传:%.1f(%.1f) | 下载:%.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "上传:%.1f | 下载:%.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule(%s | 已连接)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule(%s | 已断开)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "您确定要关闭 aMule 吗?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "退出确认" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "无法确定运行浏览器的命令" + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "皮肤目录 %s 不存在" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "警告:无法打开皮肤文件 %s" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "网络" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "网络窗口" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "搜索" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "搜索窗口" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "传输文件" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "文件传送窗口" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "共享文件窗口" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "消息" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "消息窗口" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "统计" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "统计图窗口" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "设置窗口" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "导入" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "part 文件导入工具" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "关于" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "关于/帮助" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "常规" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "连接" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "代理" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "消息过滤" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "远程控制" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "在线统计" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "目录" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "安全" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "界面设置" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "核心设置" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "事件" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "调试" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "用户定义的" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "重启 aMule 后设置才能生效:\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- TCP 端口已更改。\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- UDP 端口已更改。\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"自动更新服务器列表空白。\n" +"自动更新服务器已被禁用。" + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"您已经启用了外部连接但还没有设置密码。\n" +"外部连接在没有有效密码的情况下不能使用。" + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- 语言已更改。\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- 临时文件目录已更改。\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "上传:0.0 | 下载:0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"ED2K 和 Kad 网络都已被禁用,\n" +"你至少必须启用其中的一项才能连接。" + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"如果你的 UDP 端口被禁用,Kad 将不能启动。\n" +"启动 UDP 端口或禁用 Kad。" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"你必须现在重启aMule,\n" +"如果现在不重启的话,出现任何问题可别怪别人。\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "警告" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"您的自动更新服务器列表是的空的,\n" +"请输入至少一个指向有效 server.met 的网址,\n" +"点击这个勾选框旁边的\"列表\"按钮然后输入网址。" + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "临时文件" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "传入文件" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "在线统计" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "为%s选择文件夹" + +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "浏览 wav 文件" + +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "文件 wav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "浏览寻找视频播放器" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "选择浏览器" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "可执行%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "编辑服务器列表" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"加入下载 server.met 文件的网址,每行只限一个网址。\n" +" " + +#: src/PrefsUnifiedDlg.cpp:980 +#, fuzzy, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "刷新时间:%d秒" +msgstr[1] "刷新时间:%d秒" + +#: src/PrefsUnifiedDlg.cpp:987 +#, fuzzy, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "平均值图表显示时间:%d分钟" +msgstr[1] "平均值图表显示时间:%d分钟" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "网络连接图表缩放:%d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, fuzzy, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "刷新时间:%d秒" +msgstr[1] "刷新时间:%d秒" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, fuzzy, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "文件缓冲区大小:%d字节" +msgstr[1] "文件缓冲区大小:%d字节" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, fuzzy, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "上传队列长度:%d个用户" +msgstr[1] "上传队列长度:%d个用户" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, fuzzy, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "服务器连接刷新周期:%d分钟" +msgstr[1] "服务器连接刷新周期:%d分钟" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "服务器连接刷新周期:已禁用" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "发生 '%s' 事件时执行命令" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "在核心启用执行命令" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "核心命令:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "在图形界面端启用执行命令" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "图形界面命令:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "以下变量将被替换:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "非法登录尝试。已关闭连接。" + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "已关闭外部连接。" + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "密码未设置,外部连接已被禁止" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "配置文件禁止外部连接" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "接受了新的外部连接" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "错误:无法接受外来连接" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "由于未设置密码,外部连接已被拒绝!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "正在连接用户:%s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "未知版本" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"错误的外部连接版本号,这将出现二进制不兼容,请使用相同版本的核心和远程程序。" + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "登录失败。" + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "非法协议版本。" + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "缺失协议版本标签。" + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "无效请求,请现登录。" + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "登录成功" + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "远程 Part 文件命令失败:文件校验码不存在:%s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "文件校验码不存在:%s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "哇靠! OpCode处理错误!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "服务器没有被添加" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "找不到服务器:%s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "必须定义需删除的服务器" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "ED2K 在设置中被禁用了。" + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "正在搜索,请稍等然后刷新结果!" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "远程界面使用网络搜索没有意义。" + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad 在设置中被禁用了" + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "此图没有节点" + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "你的客户端没有为详细级别进行配置。" + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "外部连接:收到关机请求" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "已经在关闭。" + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "外部连接:正在添加链接 '%s'。" + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "非法链接或已经存在列表中。" + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "文件未找到。" + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "非法文件名。" + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "无法重命名文件。" + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "已连接至 ED2K。" + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "正在连接至 ED2K..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "已连接至 Kad。" + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "正在连接至 Kad..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "全部网络都被禁用了。" + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "断开 ED2K。" + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "断开 Kad。" + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "外部连接:收到错误的操作码:%#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "错误的操作码(错误的协议版本?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "打开文件(%s)失败,从共享文件列表删除。" + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "请求未知文件校检码:%s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "命令 '%s' 已启动进程 %d,返回值为 %d。" + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "没有添加服务器: 没有 IP 地址或主机名" + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "没有添加服务器: 服务器端口无效" + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "ED2K 状态:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "已连接" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP 地址:端口" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Kad 状态:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "正在运行" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "状态:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "连接已断" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "连接状态:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "有防火墙" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "确定" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "防火墙状态:" + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "已连接至好友" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "没有好友" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "平均用户:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "平均文件:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "没有运行" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "运行时间:%s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "传输" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "上传" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "本次上传(全部): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "总开销 (数据包): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "文件请求开销(数据包): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "源交换开销(数据包): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "服务器开销(数据包): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Kad 开销(数据包):%s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "活动上传:%s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "等待上传:%s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "成功上传会话总数:%s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "失败上传会话总数:%s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "平均上传时间:%s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "下载" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "本次下载(总共): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "发现的源:%s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "活动下载(块数):%s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "本次上传下载比率:%s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "平均下载速度(本次运行):%s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "平均上传速度(本次运行):%s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "最大下载速度(本次运行):%s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "最大上传速度(本次运行):%s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "重新连接:%i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "首次传输到现在时间:%s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "与服务器连接时间:%s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "活跃连接(估计值):%i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "达到最大连接数:%s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "平均连接数(估计):%g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "最高连接(估计值): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "用户" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "过滤" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "总数:%i 已知:%i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "服务器" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "有效服务器:%i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "无效服务器:%i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "总共:%s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "已删除服务器:%s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "被过滤的服务器:%s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "有效服务器中的用户数: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "有效服务器中的文件数: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "用户总数:%llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "文件总数:%llu" + +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "服务器开销:%.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "共享文件数:%s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "共享文件大小总和:%s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "平均文件大小:%s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "低ID:%u(总计 %.2f%% 已知 %.2f%%)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "安全身份认证 开/关:%u(%.2f%%):%u(%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "操作系统" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "没有收到" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "剪切" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "复制" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "粘贴" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "选择全部" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "Kad 搜索不能使用,因为 Kad 没有连接" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "ED2K 搜索不能使用,因为 ED2K 没有连接" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "尝试 Kad 搜索时出现不可预料的错误:" + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "来自 %s(IP:%s)的消息被过滤掉了" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "新消息来自于 %s(IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "用户 %s (%u) 请求您的共享文件列表 -> 已接受" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "用户 %s(%u)请求您的共享文件列表 -> 已拒绝" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "用户 %s(%u)请求了共享文件夹列表 -> 已接受" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "用户 %s(%u)请求了共享文件夹列表 -> 已拒绝" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "用户 %s(%u)请求目录 %s 的共享文件列表 -> 已接受" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "用户 %s(%u)请求目录 %s 的共享文件列表 -> 已拒绝" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "用户 %s(%u)共享了目录 %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "用户%s(%u)发送了未经请求的共享文件夹列表" + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "用户%s(%u)发送了目录 %s 内的共享文件列表" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "用户%s(%u)完成了共享文件列表的发送" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "用户%s(%u)发送了未经请求的共享文件列表" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "用户 %s(%u)拒绝了目录/文件列表的访问" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "节点(%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "无效 IP" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "无效端口" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "请填写所有必要信息" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "确定要下载新的 node.dat 文件吗?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "这样将删除您当前节点并重启Kad连接。" + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "继续?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "错误:" + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "警告:" + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "添加好友" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "请输入正确 IP 地址和端口!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "信息" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "该用户编码无效" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "源" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "文件" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "下载" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "分类" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "主要" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "下载分类" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "搜索相关文件(ED2K,本地服务器)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "标记为已知文件" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "连接到远程 amule" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "连接失败" + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "错误" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "警告:在低 ID 的情况下,你不能添加你自己作为 ed2k 链接的源" + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "用户:E:%s K:%s | 文件 E:%s K:%s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "全部" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "用户总数:%s | 文件总数:%s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "已传输" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "已完成" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "速度" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "进度" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "状态" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "剩余时间" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "最后一次发现完整文件" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "最后一次下载" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "您确定要取消下载并删除这些文件吗?" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "您确定要取消下载并删除这些文件吗?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "发消息给用户" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "发送消息:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "停止(&S)" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "暂停 (&P)" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "续传(&R)" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "清除已完成的文件 (&l)" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "立即转移所有 A4AF 到这个文件" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "自动转移所有 A4AF 到这个文件" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "立即转移所有 A4AF 到其它文件" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "扩展选项" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "预览" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "显示文件信息" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "显示所有注释" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "复制 magnet 地址到剪贴板" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "清除" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "分类" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "打开文件 (&O)" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "从好友中删除" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "加为好友" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "发送消息" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "转移到这个文件" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "已请求其它文件" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "排队顺序:%u(%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "已要求其它文件 (A4AF)" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "下载(%i)" + +#: src/DownloadListCtrl.cpp:2222 +#, fuzzy +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"请在设置中设置您的视频播放器,\n" +"同时 aMule 会尝试使用 mplayer,并在每次预览时你都会看到这个提示 " + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "文件预览" + +#: src/DownloadListCtrl.cpp:2260 +#, fuzzy, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "错误:无法运行媒体播放器!" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "错误:无法打开 part 文件)" + +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "错误:无法创建 part 文件)" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "尝试从 %s 载入 met 文件的备份" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "错误:无法打开 part.met 文件:%s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "错误:part.met 文件长度为 0: %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "错误:无效的 part.met 文件版本:%s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "错误:文件 %s(%s)已损坏(标签数不对),无法读取文件。" + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "尝试恢复文件信息..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "尝试恢复无名文件 - 保存为 RecoveredFile.dat" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "成功恢复所有文件信息 :D - 尝试使用文件信息..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "无法恢复文件:(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "无法读取 %s(%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "警告:%s 可能已损坏(%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "part 文件存盘时发生错误:%s(%s => %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "'%s' 文件长度为 0 - 使用 %s 文件。" + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "%s 的 part.met.seeds 文件存盘失败" + +#: src/PartFile.cpp:1019 +#, fuzzy, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "保存了 %i 个源给 part 文件 %s(%s)的 " +msgstr[1] "保存了 %i 个源给 part 文件 %s(%s)的 " + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "Part 文件 %s(%s)没有种子文件" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "Part 文件 %s(%s)的种子文件为空" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "读取 part 文件的种子文件出错(%s - %s):%s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, fuzzy, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"发现损坏的数据块 (%d) 于%d段文件 %s - 文件结果校检码 |%s| 文件校检码 |%s|" +msgstr[1] "" +"发现损坏的数据块 (%d) 于%d段文件 %s - 文件结果校检码 |%s| 文件校检码 |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "发现了已完成的数据段 %i 在%s" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "重新校验 %s 完成" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "在完成文件 %s 时遇到意外文件错误,文件已暂停" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "完成下载:%s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "正在删除文件:%s " + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "警告:无法为已下载的数据段计算校检码 - 校检码集残缺 '%s'" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "警告:无法生成校检码 - 校检码残缺(%s), 正常情况下这是不应该发生的" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "警告:硬盘空间不足!暂停文件:%s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "下载的数据段 %i 已损坏 文件: (%s)" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH:修复了损坏的数据段 %i(%s),挽救数据(字节): %s" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "硬盘空间不足" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "已停止" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "警告:know.net文件无法打开。" + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "警告:已知文件列表已损坏,文件头无效" + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "读取known.net文件时发生IO错误:%s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "保存known.met文件时发生错误:%s" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "发现 %i 个已知共享文件" +msgstr[1] "发现 %i 个已知共享文件" + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "发现 %i 个已知共享的文件, %i 个未知" +msgstr[1] "发现 %i 个已知共享的文件, %i 个未知" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "错误!试图共享 %s" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "文件注释" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "评级" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "注释" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "没有注释" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%s 条注释" +msgstr[1] "%s 条注释" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "无法连接至列出的全部模糊服务器,尝试不使用模糊。" + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "无法连接列表中的所有服务器. 开始新的一轮尝试." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "ED2K网络在设置被禁用,没有连接。" + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "服务器列表中没有有效服务器可供连接" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "已连接至 %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "已成功连接到:%s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "尝试连接时出现严重错误,网络可能没有连接" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "连接已断开 %s(%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s(%s:%i)可能已当机" + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s(%s:%i)可能已没有空位" + +#: src/ServerConnect.cpp:391 +#, fuzzy, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "服务器自动连接会在 %d 秒后重新尝试" +msgstr[1] "服务器自动连接会在 %d 秒后重新尝试" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "连接已断" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "连接失败 %s(%s:%i)" + +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "错误:接口无效" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "连接超时 %s(%s:%i)" + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "没有找到 part 文件" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "发现 %u 个 part 文件" +msgstr[1] "发现 %u 个 part 文件" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "正在下载 %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "您已经在下载文件 '%s'" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "您已下载了文件 '%s'" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "您已经尝试下载文件 %s" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "无法转换 magnet 链接至 ed2k:%s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "未知链接协议:%s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "无效 ed2k 链接!错误:%s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "执行 然后退出。" + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "无效 IP 地址格式,请使用 xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +#, fuzzy +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "此命令需要一个参数,合法参数为 'all' 或一个数字。\n" + +#: src/TextClient.cpp:343 +#, fuzzy +msgid "Processing by hash: " +msgstr "正在处理文件号 %u: %s" + +#: src/TextClient.cpp:358 +#, fuzzy +msgid "Processing by filename: " +msgstr "正在处理文件号 %u: %s" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "此命令需要一个参数,合法参数为文件校验码。\n" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "非有效数字\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "无效的校验值(长度必须为32个字符)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "操作成功。" + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "请求失败,错误为:%s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "用户的IP过滤器是:%s。\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "关" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "开" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "服务器的IP过滤器是%s。\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "当前IP过滤级别时 %d.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "带宽限制:上传: %u kB/s, 下载: %u kB/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "已连接到 %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "有低ID" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "有高ID" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "正在连接" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "未连接" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"下载:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"上传:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"队列长度:\t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"源总数:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "搜索结果数量:%i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "待办事项 - 显示搜索进度" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "从服务器收到未知的回复,操作码是 %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "显示简短的状态信息。" + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "显示连接状态,当前上传下载速度等等。\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "显示全部统计树" + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"可选,一个0-255之间的数字可作为此命令的参数, \n" +"用于设置用户版本树显示的节点数量。 n参数设为0表示无限制。\n" +"\n" +"示例: 'statistics 5' 将显示每个用户软件的5个版本。\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "关闭aMule。" + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"关闭远程运行核心程序(amule/amuled)。\n" +"这也将关闭文本客户端,直至没有一个在运行的核心可用。\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "重新载入所给的对象。" + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "重新载入共享文件列表。" + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "重新从文件载入IP过滤表。" + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "连接至网络。" + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"这将连接至全部在设置中启用的网络。\n" +"您也可以使用此格式(IP:端口)定义一个服务器地址,并只连接至此服务器。\n" +"此IP必须是用点分隔的十进制IPv4地址,\n" +"或者是可以解析的DNS名称。" + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "只连接 ED2K。" + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "只连接 Kad。" + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "断开网络。" + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "这将断开当前已连接的全部网络。\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "只断开 ED2K 连接。" + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "只断开 Kad 连接。" + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "添加一个 ed2k 或 magnet 链接至核心。" + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"添加的 ed2k 链接可以是:\n" +"*) 文件链接(ed2k://|file|..),将添加至下载队列,\n" +"*) 服务器链接(ed2k://|server|...),将添加至服务器列表,\n" +"*) 或服务器列表链接,这种情况将添加此列表中的所有服务器至服务器列表。\n" +"\n" +"\n" +"magnet 链接必须包含 ed2k 校验码和文件大小。\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "设置一个参数值。" + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "设置IP过滤参数。" + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "开启用户和服务器的 IP 过滤。" + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "关闭用户和服务器的 IP 过滤。" + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "启动/禁用用户 IP 过滤。" + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "开启用户 IP 过滤。" + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "关闭用户 IP 过滤。" + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "启用/禁用服务器 IP 过滤。" + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "开启服务器 IP 过滤。" + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "关闭服务器 IP 过滤。" + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "选择 IP 过滤级别。" + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"正确的 IP 过滤级别是在0-255之间,\n" +"默认(初始)值是127。\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "设置带宽限制。" + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "给此命令的值必须使用kB/s。\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "设置上传带宽限制。" + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "设置下载带宽限制。" + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "获取并显示设置值。" + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "获取 IP 过滤器设置。" + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "获取用户和服务器的 IP 过滤器状态。" + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "只获取用户的 IP 过滤器状态。" + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "只获取服务器的 IP 过滤器状态。" + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "获取 IP 过滤级别。" + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "获取带宽限制。" + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "进行搜索。" + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"搜索类型必须使用设定的类型:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"示例: 'search kad 文件' 将对 \"文件\"执行 Kad 搜索。\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "执行全球搜索。" + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "执行本地搜索" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "执行 Kad 搜索" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "显示上次搜索的结果。" + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "返回以前搜索的结果。\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "显示搜索进度。" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "显示搜索进度。\n" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "开始下载文件" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"必须指定上次搜索的文件数量。\n" +"示例:'download 12' 将开始下载上次搜索结果中的12个文件。\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "停止下载。" + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "继续下载。" + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "取消下载。" + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "设置下载优先级。" + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "设置下载的优先级为低、正常、高或自动。\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "设为低优先级。" + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "设为正常优先级。" + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "设为高优先级。" + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "设为自动优先级。" + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "显示队列/列表。" + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "显示上传/下载队列,服务器列表或共享文件列表。\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "显示上传队列。" + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "显示下载队列。" + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "显示日志。" + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "显示服务器列表。" + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "重设日志。" + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "已废弃的命令,现用 '%s'。" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "这是一个已废弃的命令,将来可能被删除,请使用 '%s' 替代。\n" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() 返回了 NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "错误: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "警告:%s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "新的用户编号是 %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "警告:你收到了低 ID!" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "\t大概这是因为您处在防火墙或路由器后面。" + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\t如需了解更多相关信息,请访问 http://wiki.amule.org" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "收到未知服务器信息 ! - 长度过短" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "收到 %d 个新服务器" +msgstr[1] "收到 %d 个新服务器" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "服务器列表保存完毕。" + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "服务器拒绝了上一个明令" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "服务器数据包无效:%s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "在处理从服务器接收的数据有无法处理的错误 : %s " + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "无法建立DNS线程以连接 %s" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "服务器 IP %s (%s) 已被过滤,不在连接。" + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "使用模糊协议。" + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "正在连接至 %s (%s - %s:%i) %s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "无法查找服务器%s的DNS记录: 无法连接!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "CIP2Country::CIP2Country():载入国家数据失败" + +#: src/IP2Country.cpp:73 +#, fuzzy, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "%d个国旗图片已载入。" +msgstr[1] "%d个国旗图片已载入。" + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "您确定要删除分类中的所有下载文件吗?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "需要确认" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "所有其它" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "未完成" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "活动" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "视频" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "音乐" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "归档" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "CD映象" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "图片" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "文本" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "选择显示过滤" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "新建分类" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "编辑分类" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "删除分类" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "正在导入 %s:%s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "正在读取临时文件夹" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "正在从下载信息文件获取基本信息" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "创建目标文件" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "从旧下载文件载入数据(%u 共 %u)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "正在保存数据块至新的单个下载文件(%u 共 %u)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "正在获取源下载文件信息" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "正在下载和保存新part文件" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "正在获取状态..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "正在处理" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "错误:磁盘空间不足" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "错误:partmet文件未找到" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "错误:IO错误!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "错误:失败!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "已加入队列" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "已经在下载" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "未知或错误的临时文件格式。" + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "文件名" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "状态" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "文件校验码" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "导入 part 文件" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "请选择一个目录用于搜索临时下载文件!(子目录也将被包括)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "要删除成功导入下载的源文件吗?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "删除源?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "等待中..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (磁盘:%s)" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "字节" +msgstr[1] "字节" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "字节/秒" +msgstr[1] "字节/秒" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "秒" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "分钟" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "小时" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "日" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "录像" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "存档" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "文本" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "程序" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "任何" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "未评级" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "无效 / 损坏 / 假冒" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "差" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "一般" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "好" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "很好" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "所有" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "其它" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "正在载入 IP 过滤文件 ipfilter.dat 和 ipfilter_static.dat。" + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "载入 ipfilter.dat 文件 '%s' 失败,遇到未知格式。" + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "载入 ipfilter.dat 文件 '%s' 失败,无法打开文件。" + +#: src/IPFilter.cpp:330 +#, fuzzy, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "载入 %u 个IP段自 %s,丢弃了 %u 行错误数据。" +msgstr[1] "载入 %u 个IP段自 %s,丢弃了 %u 行错误数据。" + +#: src/IPFilter.cpp:332 +#, fuzzy, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "载入 %u 个IP段自 %s,丢弃了 %u 行错误数据。" +msgstr[1] "载入 %u 个IP段自 %s,丢弃了 %u 行错误数据。" + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "活跃连接 (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "文件信息" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% 已完成" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "ED2K 链接:" + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "确定" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "请点击这里把输入的ED2K链接加入下载队列。" + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "弹出状态显示" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "正在载入" + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "此处显示系统事件。如需完整事件列表,请到服务器分页。" + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "当前服务器上用户数 ..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "用户: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "当前服务器上的用户和估算总用户数。" + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "当前平均上传下载速度。括号中的值为于其他用户连接所消耗的带宽。" + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"显示当前连接状态及当前传送状态。红色箭头表示未连接,黄色箭头表示低ID,绿色箭" +"头表示正常连接。" + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "未连接" + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "现在已连接的服务器。" + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "查找" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "名字:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "本地" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "全球" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "文件校验码" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "附加参数" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "过滤" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "文件类型" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "扩展名" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "大小下限" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "字节" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "大小上限" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "最低源数" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "过滤:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "过滤结果" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "反向排序结果" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "隐藏已知文件" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "其他" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "在 ED2K 上搜索更多结果,暂不支持 Kad" + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "停止" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "复位" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "搜索结果" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "清除已完成的下载" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "显示上传/上传队列" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "队列长度:" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "发送" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "发送指定消息。" + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "关闭" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "结束本次聊天。" + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "全名:" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "N/A" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "met 文件:" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "校检码:" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "文件大小:" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "part 文件状态:" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "最后发现完整共享文件:" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "已发现源:" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "正在传输的源:" + +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "文件部分数:" + +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "可用:" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "数据率:" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "下载活动时间:" + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "已传输:" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "已完成大小:" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "智能损坏数据处理 (ICH)" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "因数据损坏而丢失:" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "压缩效益:" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "由 ICH 挽救的数据包:" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "文件名" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "接管" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "清除" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "应用" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "确定" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "注释文件(文本将对全部用户可见)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"您可以说明电影的长度,情节和语言等等...\n" +"如果电影是假冒的,您可以提醒其它用户。" + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "文件质量" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "选择文件评级或者提醒其它用户该文件是无效的" + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "无注释" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "刷新" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "正在下载,请等待 ..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "未知大小" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "必填信息" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "IP 地址:" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "端口:" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "附加信息" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "用户名:" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "用户编码:" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "刷新共享文件" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "本次运行" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "总和" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "已请求:" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "活跃上传:" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "下载速度" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "当前" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "动态平均值" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "本次运行平均值" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "上传速度" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "连接" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "活跃下载" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "活跃连接(1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "活跃上传" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "统计树" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "用户名:" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "用户编码:" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "用户软件:" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "用户软件版本:" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "IP 地址:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "用户 ID:" + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "服务器 IP:" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "服务器名称:" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "上传" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "当前请求:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "平均上传速度:" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "平均下载速度:" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "上传(本次运行):" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "下载(本次运行):" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "上传总量:" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "下载总量:" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "分数" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "下载上传比率:" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "安全身份认证:" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "评级(总和):" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "队列积分:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "综合设置" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "昵称" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - Linux 平台的 Mule" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "这是其他用户看到的名字。" + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "语言" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "选择界面语言。" + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "其它选项" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "启动时检查新版本" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "启用此选项将让 aMule 启动时检查新版本" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "启动后最小化" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "启用后 aMule 启动后立即最小化。" + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "退出时确认" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "退出前确认。" + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "启用状态栏图标" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "启用/禁用系统状态栏图标。" + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "最小化至系统状态栏图标" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "启用此选项将使 aMule 最小化到系统状态栏,而不是任务栏。" + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "提示延迟时间(秒)" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "显示提示前的延迟时间。" + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "浏览器选择" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "请选择您的网络浏览器" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "其它浏览器" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"请输入网络浏览器名称。如需使用自定义浏览器,在以上弹出菜单中选择自定义。" + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "在新分页中打开" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "如果可能的话在新的分页中打开而不是新的窗口" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "带宽限制" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "上传" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "单用户上传速度" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "连接带宽" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "标准用户 TCP 端口:" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "这是标准 ED2K 端口,不能被禁用" + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "扩展用户 UDP 端口:" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "此 UDP 端口用于扩展的 Ed2k 请求和 Kad 网络" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "禁用" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "绑定地址" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "用于扩展的服务器请求的 UDP 端口 (TCP+3):4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "单个文件最大源数" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "绝对上限" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "连接限制" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "最大连接数" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kad" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "通用即插即用(UPnP)" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "启用 UPnP" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "UPnP TCP 端口" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "启动后自动连接" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "断线后自动重连" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "显示通信开销带宽" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "服务器选项" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "如果" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "次连接失败,则删除该服务器。" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "启动后自动更新服务器列表" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "列表" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "与服务器连接时更新服务器列表" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "与其它用户连接时更新服务器列表" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "启用优先级系统" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "连接时启用智能低ID检测" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "安全连接" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "只自动连接到静态服务器列表里的服务器" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "设置用户输入的服务器为高优先级" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "启用ICH" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "高级智能损坏数据处理(AICH)信任所有校验码(建议不要使用)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "添加新下载文件时设为暂停状态" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "添加新下载文件时设优先级为自动" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "尝试先下载文件的第一段和最后一段" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "添加新共享文件时设优先级为自动状态" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "尝试传送完整数据段给所有用户" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "文件下载完毕时开始下一个暂停的文件" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "来自同一分类" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "保存稀有文件(少于20个源)的10个源" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "硬盘空间" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "检查硬盘空间" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "如果需要 aMule 检查硬盘空间请选此项" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "最低磁盘空间:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "请输入最低硬盘空间。" + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "已下载文件存放目录:" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "临时文件存放目录:" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "共享的目录" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "(鼠标右键单击文件夹图标来递归共享)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "共享隐藏文件" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "录像播放器" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "预览前备份文件" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "图表" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "刷新延迟:5 秒" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "平均值图表显示时间:100 分钟" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "连接图表尺寸:100 " + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "选择统计图表使用颜色" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "背景" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "网格" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "目前下载" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "动态平均下载" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "本次运行平均下载" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "目前上传" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "动态平均上传" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "本次运行平均上传" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "活跃连接" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "系统状态栏图标速度显示" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "当前 Kad 节点" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "运行的 Kad 节点" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "本次运行的 Kad 节点" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "选择" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "显示用户软件版本的数量(0代表不限制)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "通知" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "消息弹出" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "启用声音" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "以下情况弹出窗口::" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "日志中添加了新内容" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "开始新的消息对话" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "收到新用户消息" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "添加或完成了下载文件" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "发现新 aMule 版本" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "硬盘已满,服务器连接已断" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "邮件通知" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "下载完成后用电子邮件通知" + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "SMTP 服务器:" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "电子邮件地址:" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!!警告!!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"注意:如果你不清楚以下设置的含义请不要随意更改,\n" +"否则你可能弄巧成拙。即使不改动这些设置,aMule\n" +"也完全可以正常运行。" + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "高级设置" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "5 秒内最大新连接数" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "文件缓冲:24000 字节" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "上传队列长度:5000 用户" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "服务器连接刷新周期:禁用" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "界面设置" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "下载队列文件进度" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "显示百分比" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "显示进度条" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "进度条风格" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "扁平" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "圆润" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "皮肤支持" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "启用皮肤支持" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "皮肤:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- 没有皮肤可用 -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "列排序" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "自动排列下载队列中的文件 (大CPU用量)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "自动逐列排序" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "界面设置" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "显示 ED2K 链接处理栏" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "在分类页中显示附加信息" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "标题栏显示传送速度" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "垂直显示工具栏" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "在文件名前显示 part 文件编号" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "远程控制" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Web 服务器参数" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "开启时运行 Web 服务器" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Web 服务器端口" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "在 Web 服务器端口上启动 UPnP 端口转发" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Web 服务器 UPnP TCP 端口" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "页刷新周期 (秒)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "启用 Gzip 压缩" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "启用低权限用户" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "最高权限密码" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "低权限密码" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Web 模板" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "外部连接参数" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "接收外部连接" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"监听接口的 IP\n" +"(留空则监听全部)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "在此输入正确的IP(格式:a.b.c.d)用于监听外部连接接口。" + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "TCP 端口" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "在外部连接端口启用 UPnP 端口转发" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "点击这里立即使用新的设置。" + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "取消所有设置改动。" + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "标题:" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "注释:" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "下载文件目录:" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "设置新加入的文件优先级为 :" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "不要改变" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "选择该类别颜色 (当前选择) :" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "连接后显示服务器当日通告" + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "服务器信息" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "按此按钮清空日志." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "aMule 日志" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "按此按钮从该网址更新服务器列表 ..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "服务器列表" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "输入 server.met 文件的地址,然后按此按钮更新服务器列表。" + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "手动添加服务器:名称" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "在此输入新服务器的名称" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "输入新服务器的 IP 地址(x.x.x.x格式)。" + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "在此请输入服务器端口。" + +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "添加新服务器(先填写左侧的内容) ..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "ED2K 信息" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Kad 信息" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"您所选择的地区设置在您的计算机上似乎没有安装\n" +"您需要先产生它.您可以在/etc/locale.gen文件和locales软件包开始,祝您好运!无论如" +"何,我还是会先尝试你所选择的地区设置。" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "下次不需要再显示" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "按此更新节点列表自网址..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "节点(0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "输入 nodes.dat 文件的地址并按左边的按钮以更新已知节点列表" + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "节点状态" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "启动" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "新节点" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP 地址:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "端口:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "从已知用户启动" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "断开 Kad" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "模糊协议" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "支持模糊协议" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "此选项启用了模糊协议,可让 aMule 从其他用户接收模糊的连接" + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "为对外连接使用模糊协议" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "此选项使 aMule 在连接其他用户或服务器时使用模糊协议。" + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "只接受模糊连接" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"此选项让 aMule 只接受模糊的连接,你将有较少的源,但你的全部连接都将是模糊的" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "文件选项" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "任何人" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "没人可以" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "谁可以查看我共享的文件: " + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "选择可以浏览共享文件列表的用户。" + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "IP 过滤" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "过滤用户" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "过滤在文件~/.aMule/ipfilter.dat中定义的用户IP" + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "过滤服务器" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "过滤在文件~/.aMule/ipfilter.dat中定义的服务器IP" + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "刷新列表" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "更新IP 地址过滤列表 ~/.aMule/ipfilter.dat" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "地址:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "立即更新" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "启动后自动更新IP 地址过滤列表" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "过滤级别:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "永远过滤局域网 IP 地址" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "处理不匹配的 IP" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "拒绝用户IP不同于接收包中的IP的数据包,请谨慎使用。" + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "在可用的情况下使用系统级的 ipfilter.dat" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "如果没有找到本地 ipfilter.dat 文件,则允许使用系统级的IP过滤文件。" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "使用安全用户认证" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "建议使用此选项,如果安全用户认证没有启用,将不会接收信用证明。" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "启用/禁用" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "启用在线统计" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "输出该文件以用于在线统计等等。" + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "更新频率(秒):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "更改在线统计文件的更新频率(秒)。" + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "在线统计目录:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "点击选择包含在线统计文件的目录。" + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "禁用/启用" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "过滤收到的消息(不包括当前对话):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "过滤选项:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "过滤所有消息" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "过滤来自好友列表外的消息" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "过滤来自未知用户的消息" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "过滤包含以下内容的消息(用半角逗号分隔):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "输入需过滤的词组" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "备注" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "过滤包含以下内容的备注(使用‘,’作为分隔符):" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "启用代理" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "启用/禁用代理支持" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "代理类型:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "正在连接的代理服务器类型" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "代理服务器:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "代理服务器名称" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "代理端口:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "代理端口" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "验证" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "启用验证:" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "启用/禁用用户名/密码验证" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "连接代理服务器的用户名" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "密码:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "连接代理服务器的密码" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "自动连接服务器时忽略代理设置" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "连接到:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "登录远程 amule" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "用户名" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "记住这些设置" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "启用详细调试日志。" + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "消息分类:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "添加导入文件" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "重试所选" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "删除所选" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "事件类型" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "连接至任何服务器和/或 Kad" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "新分类" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "请选择下载文件夹" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "必须定义分类名称!" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "必须定义分类路径!" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "无法建立该分类的接收文件夹,请给出一个有效的分类路径!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "未知扩展选项 '%s' 用于命令 '%s'。\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "未知命令 '%s'。\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"此命令不需要参数。\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"此命令必须要参数。\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"此命令不完整,您必须使用以下中的一个扩展选项。\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"可用扩展选项:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "可用命令:\n" + +#: src/ExternalConnector.cpp:188 +#, fuzzy, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"全部命令都不区分大小写。\n" +"输入 'help <命令>' 获取在 <命令> 中的详细信息。\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "退出程序。" + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "显示帮助。" + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"输入 'help <命令>' 可显示命令的帮助。\n" +"输入 'help' 可显示全部命令列表。\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"使用 '%s' 列出所有命令\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "语法错误!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "处理指令时发生意外错误!请提交错误报告\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "此命令不需要任何参数。" + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "此命令必须要参数。" + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "无效参数" + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "此命令不完整。" + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "输入 '%s' 显示更多帮助信息。\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "这是 %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "这是 %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"正在建立用户...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "连接失败,无法连接到指定的计算机\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"完成,正在退出 %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"不能使用空密码连接,\n" +"你必须在配置文件\n" +"或在命令行设置一个,或者在询问时输入。\n" +"\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "显示帮助信息。" + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "aMule正在运行的主机。(缺省:localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "aMule 的外部连接端口。(缺省:4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "外部连接密码。" + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "从文件读取设置。" + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "不打印任何信息到控制台。" + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "详细显示调试信息。" + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "设置程序地区(语言)。" + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "把命令行参数写入设置文件。" + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "基于aMule的设置文件建立新设置文件。" + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "打印程序版本。" + +#: src/ClientCreditsList.cpp:168 +#, fuzzy, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "积分文件已载入,%u个已知用户" +msgstr[1] "积分文件已载入,%u个已知用户" + +#: src/ClientCreditsList.cpp:171 +#, fuzzy, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] " - %u 个用户的积分已过期" +msgstr[1] " - %u 个用户的积分已过期" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "文件 'crytkey.dat' 未找到,正在创建。" + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"错误:当外部连接被禁用的时,aMule daemon 无法使用。要启用外部连接,请使用标准" +"的 aMule,或使用 --ec-config选项启动 amuled 或在文件 ~/aMule/amule.conf 中设" +"置选项\"AcceptExternalConnections\"" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "错误:%s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "取消封杀" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "显示上传" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "显示队列" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "显示用户" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "选择视角" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "用户软件" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "已等待" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "上传时间" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "上传/下载" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "远程状态" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "排队顺序:%u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "文件优先级" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "分数" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "已请求" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "最后连接" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "进入队列" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "上传状态" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "已传输" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "下载状态" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "已传输" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "用户编码" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "已加密" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "隐藏共享文件" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "用户信息" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "不被支持" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "未完成" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "坏蛋" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "验证已通过" + +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "不可用" + +#: src/ClientDetailDialog.cpp:190 +#, fuzzy, c-format +msgid "%u (QR: %u)" +msgstr "排队顺序:%u" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "最小值必须小于最大值,最大值已被忽略。" + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "搜索警告" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "无限制" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "aMule 状态栏 菜单" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "速度限制:" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "上传:无" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "上传:%u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "下载:无" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "下载:%u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "下载速度:%.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "上传速度:%.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "用户信息" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "昵称:%s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "未选择昵称" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "用户 ID:" + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "服务器名称:" + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "服务器 IP:" + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP:%s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "TCP 端口:%d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "TCP 端口:未就绪" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "UDP 端口:%d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "UDP 端口:未就绪" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "在线统计: 启用" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "在线统计: 禁用" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "共享文件:%d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "队列用户:%d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "总下载:%s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "总上传:%s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "上传限制" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "下载限制" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "隐藏 aMule" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "显示 aMule" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "聊天已开始:%s(%s:%u)- %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** 已连接到用户 ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** 正在连接用户 ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** 无法连接用户/连接中断 ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "关闭分页" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "关闭所有分页" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "关闭其它分页" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "正在载入 server.met 文件:%s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "找不到server.met 文件" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "载入 server.met 文件 '%s' 失败,遇到未知格式。" + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "无法打开 server.met 文件" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "Server.met 文件损坏,发现错误的版本标记:0x%x,大小 %i" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "server.met 中有 %i 个服务器" +msgstr[1] "server.met 中有 %i 个服务器" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d 新增添的服务器" +msgstr[1] "%d 新增添的服务器" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "没有添加服务器:[%s:%d] 端口无效" + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "没有添加服务器:[%s:%d] IP 地址无效" + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "没有添加服务器: 服务器列表中已有[%s:%d]" + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "成功添加服务器:[%s:%d] 服务器名为 '%s'" + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "您在连接您已决定删除的服务器,请断开连接。" + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "无法 server.met 保存" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "无效 URL" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "从 %s 下载服务器列表完成" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "无法从 %s 下载服务器列表" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"'addresses.dat' 文件内没有服务器列表地址. 请粘贴一个有效服务器列表地址到该文" +"件以自动更新服务器列表." + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "正在开始从 %s 下载服务器列表" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "警告,该自动更新地址无效:%s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "addresses.dat 文件中没有有效的自动更新服务器列表URL" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "本地服务器被IP过滤器过滤掉了,正在重新连接至其他服务器!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "执行`%s' 事件中的命令`%s' 失败。" + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "对不起,由于版本变动,您的地区设置已经被变为系统默认值。" + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"在服务器列表中没有任何服务器。\n" +"需要 aMule 现在就下载一个新的列表吗?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "服务器列表已下载" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "Web 服务器正在运行,进程号是 %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"您要求启动时运行 Web 服务器,但 amuleweb 程序无法运行。请先安装包含 aMule " +"Web 服务器的 aMule 版本,或者使用 --enable-webserver选项编译 aMule,然后运行 " +"make install进行安装" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "端口 %u 已被占用,你会成为低 ID。\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"端口 %u 已被占用。\n" +"\n" +"这意味着你会成为低ID。\n" +"\n" +"请检测网络设置以确保端口可用于输入输出。" + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "创建在线统计文件失败" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "创建 aMule 在线统计文件失败" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"您所选择的地区设置在您的计算机上似乎没有安装.但无论如何,我还是会采用你所选择" +"的地区设置。" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "这是您第一次运行 aMule %s" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "这个版本是测试版,每天更新, 而且 \n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "我们无法承诺它一定不会损坏任何东西或烧毁你的房子,\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "或杀死你的狗,但一般来讲它应该是安全的。\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "此版本中,以下选项因为安全问题已经被更改:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* 为进站和出站连接启用模糊协议支持。\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* 禁用从其他服务器和用户更新服务器列表。\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"想更多地了解更改的原因, 请访问\n" +"aMule 为\"fake servers\" 信息的 wiki,地址是: http://wiki.amule.org。\n" +"有一点很重要,为了让你的 aMule 正常工作,请从服务器列表中清除假冒服务器。" + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "如要获取使用信息,用户支持以及下载最新版本,请访问我们的首页\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "www.aMule.org,或我们在 irc.freenode.net 的 IRC 频道 #aMule。\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "欢迎您到 http://forum.amule.org 去提交错误报告" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"您为在线统计文件所选择的文件夹无效!\n" +"在您更正设置之前在线统计将被禁用。" + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "错误: 无法打开日志文件" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "警告:日志文件为空。肯定有什么地方出错了。" + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "记录文件已被重启" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "服务器消息:%s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "下载节点列表失败。" + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "打开已下载的版本检查文件失败" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "损坏的版本检查文件" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "你使用的是老版本的 aMule!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "你的 aMule 版本是%i.%i.%i,最新版本是 %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "最新版本可从此下载:http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "警告:你的 aMuled 版本太旧:%i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "你的 aMule 是最新版本。" + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "下载版本检查文件失败" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "已连接到 %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "正在连接到 %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "已断开 ED2K" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad 已启动。" + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad 已停止。" + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "已连接至 Kad" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "已连接至 Kad 网络(有防火墙)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "已断开 Kad 连接" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "如果在设置中禁用了 UDP 端口,Kad 网络将不能使用,没有启动。" + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Kad 网络在设置中被禁用了,没有连接。" + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "无法打开好友列表文件 'emfriends.met'!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "无法写入好友列表文件 'emfriends.met'!" + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "您不能使用远程GUI用指定的IP启动" + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "不能从远程GUI更新 server.met。" + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "读取 %u 个 Kad 联系人" +#~ msgstr[1] "读取 %u 个 Kad 联系人" + +#~ msgid "Disconnect from " +#~ msgstr "断开连接从" + +#~ msgid "current server" +#~ msgstr "当前服务器" + +#~ msgid " and " +#~ msgstr "和 " + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "从全部服务器 和/或 Kad 断开" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad:" + +#~ msgid "TCP Flags" +#~ msgstr "TCP 标志" + +#~ msgid "UDP Flags" +#~ msgstr "UDP 标志" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "复制 ED2K 链接到剪贴板" + +#~ msgid "Client requests %u" +#~ msgstr "用户请求 %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "文件数据段 %u-%u (%d 字节):" + +#~ msgid "Client request is invalid!" +#~ msgstr "用户请求非法!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "用户请求非法!%i / %i" + +#~ msgid "Command: %s" +#~ msgstr "命令:%s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "无法读取 %s - 现在使用 %s" + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "警告:known.net文件不存在。" + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles: 从共享文件列表中删除 %s:目录未找到" + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "等待子进程终止失败" + +#~ msgid "" +#~ "You cannot connect to a release version from an arbitrary CVS version! " +#~ "*sigh* possible crash prevented" +#~ msgstr "你不能连接至任意 CVS 版本的发布!目的是为了不让程序崩溃。" + +#~ msgid "doesn't work" +#~ msgstr "没有工作" + +#~ msgid "remote gui" +#~ msgstr "远程GUI" + +#~ msgid "" +#~ "Error: Failed to load backup file. Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "错误:无法载入备份文件,请到 http://forum.amule.org 搜索关于恢复 .part." +#~ "met 文件的解决办法" + +#~ msgid "" +#~ "Error: Backup part.met file is 0 size! Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "错误:备份的 part.met 文件长度为 0,请到 http://forum.amule.org 搜索关于恢" +#~ "复 .part.met 文件的解决办法" + +#~ msgid "Error: part.met backup file is 0 size: %s ==> %s" +#~ msgstr "错误:part.met文件大小为 0:%s ==> %s" + +#~ msgid "" +#~ "Note: These values are\n" +#~ " only used for statistics." +#~ msgstr "" +#~ "注意:这些数值只作为统计用途。\n" +#~ " " + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ " 基于 eMule 的跨平台 P2P 软件\n" +#~ "\n" +#~ " 网站: http://www.amule.org \n" +#~ " 论坛:http://forum.amule.org \n" +#~ " FAQ:http://wiki.amule.org \n" +#~ "\n" +#~ " 联系人:admin@amule.org (administrative issues) \n" +#~ " 版权所有 (C) 2003-2008 aMule 开发团队 \n" +#~ "\n" +#~ " aMule 的一部分是基于 \n" +#~ " Kad:基于异或算法的 P2P 路由协议。\n" +#~ " 版权所有 (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "警告:您收到了低ID!" + +#~ msgid "" +#~ "This command requieres an argument. Valid arguments: 'all' or a number.\n" +#~ msgstr "该命令需要一个参数,有效参数为:'all',或一数字\n" + +#~ msgid "This command requieres an argument. Valid arguments: a file hash.\n" +#~ msgstr "此命令需要一个参数,参数无效,需要文件校验码。\n" + +#~ msgid "Deprecated command, now 'Status'." +#~ msgstr "过时的命令,现已改为 'Status'。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Status' instead.\n" +#~ msgstr "" +#~ "此命令已过时,将来可能会删除。\n" +#~ "'Status' 替代。\n" + +#~ msgid "Deprecated command, now 'Set IPFilter'." +#~ msgstr "过时的命令,现已改为 'Set IPFilter'。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter' instead.\n" +#~ msgstr "" +#~ "此命令已过时,将来可能会删除。\n" +#~ "请用 'Set IPFilter' 替代。\n" + +#~ msgid "Deprecated command, now 'Get IPFilter Level'." +#~ msgstr "过时的命令,现已改为 'Get IPFilter Level'。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get IPFilter Level' instead.\n" +#~ msgstr "" +#~ "此命令已过时,将来可能会删除。\n" +#~ "请用 'Get IPFilter Level' 替代。\n" + +#~ msgid "Deprecated command, now 'Set IPFilter Level'." +#~ msgstr "过时的命令,现已改为 'Set IPFilter Level'。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "此命令已过时,将来可能会删除。\n" +#~ "请用 'Set IPFilter Level' 替代。\n" + +#~ msgid "Deprecated command, now 'Get/Set IPFilter Level'." +#~ msgstr "过时的命令,现已改为 'Get/Set IPFilter Level'。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get/Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "此命令已过时,将来可能会删除。\n" +#~ "请用 'Get/Set IPFilter Level' 替代。\n" + +#~ msgid "Deprecated command, now 'Show Servers'." +#~ msgstr "过时的命令,现已改为 'Show Servers'。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Show Servers' instead.\n" +#~ msgstr "" +#~ "此命令已过时,将来可能会删除。\n" +#~ "请用 'Show Servers' 替代。\n" + +#~ msgid "Deprecated command, now 'Get BwLimits'." +#~ msgstr "过时的命令,现已改为 'Get BwLimits'。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get BwLimits' instead.\n" +#~ msgstr "" +#~ "此命令已过时,将来可能会删除。\n" +#~ "请用 'Get BwLimits' 替代。\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Up'." +#~ msgstr "过时的命令,现已改为 'Set BwLimit Up'。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Up' instead.\n" +#~ msgstr "" +#~ "此命令已过时,将来可能会删除。\n" +#~ "请用 'Set BwLimit Up' 替代。\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Down'." +#~ msgstr "过时的命令,现已改为 'Set BwLimit Down'。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Down' instead.\n" +#~ msgstr "" +#~ "此命令已过时,将来可能会删除。\n" +#~ "请用 'Set BwLimit Down' 替代。\n" + +#~ msgid "Syncronization thread started." +#~ msgstr "同步线程已开始" + +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "已经文件的主校验码已经载入" + +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "读取 Kad 联系人时出错 - 没有记录 " + +#~ msgid "Merge attempt" +#~ msgstr "尝试合并" + +#~ msgid "Recursive merge" +#~ msgstr "递归合并" + +#~ msgid "Sucessful merge!" +#~ msgstr "成功合并!" + +#~ msgid "No merge possible" +#~ msgstr "没有合并的可能" + +#~ msgid "Buddy address: " +#~ msgstr "好友地址:" + +#~ msgid "Allow usage of system wide ipfilter.dat" +#~ msgstr "允许使用系统级别的 ipfilter.dat" + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid " %d" +#~ msgstr " %d" + +#~ msgid ".%d" +#~ msgstr ".%d" + +#~ msgid "Shows the process of a search." +#~ msgstr "显示搜索进度。" + +#~ msgid "Shows the process of a search..\n" +#~ msgstr "显示搜索进度..\n" + +#~ msgid "Search warning." +#~ msgstr "搜索警告" + +#~ msgid "Client Identification:" +#~ msgstr "用户身份认证:" + +#~ msgid "Use Secure Identification" +#~ msgstr "使用安全身份认证" + +#~ msgid "" +#~ "Secure Identification uses a handshake approch to safely identify clients " +#~ "for use with the credit system." +#~ msgstr "安全身份认证使用握手协议来确认用户身份以计算积分。" + +#~ msgid "Sources Dropping" +#~ msgstr "源的清理" + +#~ msgid "Source Dropping" +#~ msgstr "源清理" + +#~ msgid "Keep sources" +#~ msgstr "保留源" + +#~ msgid "Drop sources" +#~ msgstr "清除源" + +#~ msgid "Send sources to any other file before dropping (High CPU)" +#~ msgstr "清除前把源分配到其它下载文件(高 CPU 占用)" + +#~ msgid "Sources with no needed file-parts." +#~ msgstr "没有需要文件段的源。" + +#~ msgid "Full Queue Sources Handling" +#~ msgstr "队列已满的源的处理" + +#~ msgid "Enable auto drop Full Queue Sources" +#~ msgstr "启用自动清除队列已满的源" + +#~ msgid "High Queue Rating Sources Handling" +#~ msgstr "队列过长的源的处理" + +#~ msgid "Enable auto drop High Queue Rating Sources" +#~ msgstr "启用自动清除队列过长的源" + +#~ msgid "High Queue Rating value" +#~ msgstr "队列长度" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(最低 300 / 最高 3000)" + +#~ msgid "Auto Drop Sources Timer" +#~ msgstr "自动清除源计时器" + +#~ msgid "Timer (in secs)" +#~ msgstr "计时(秒)" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(最低 60 / 最高 3600)" + +#~ msgid "Drop No Needed Sources now" +#~ msgstr "立即清理无可供下载的源" + +#~ msgid "Drop Full Queue Sources now" +#~ msgstr "立即清理队列已满的源" + +#~ msgid "Drop High Queue Rating Sources now" +#~ msgstr "立即清理队列超长的源" + +#~ msgid "Clean Up Sources now (NNS, FQS && HQRS)" +#~ msgstr "立即清理所有无用源" + +#~ msgid "English (U.S.)" +#~ msgstr "英语(美国)" + +#~ msgid "Spanish (Mexican)" +#~ msgstr "西班牙语(墨西哥)" + +#~ msgid "Nothing to copy for now!" +#~ msgstr "暂时没有东西可复制!" + +#~ msgid "Copy ED2k link to clipboard (Hostname)" +#~ msgstr "拷贝 ED2K 链接到剪贴板 (计算机名)" + +#~ msgid "Connecting to %s (%s - %s:%i)" +#~ msgstr "正在连接到%s (%s - %s:%i)" + +#~ msgid "Minimize to trayicon" +#~ msgstr "最小化到系统状态栏" + +#~ msgid "" +#~ "Enabling this will make aMule minimize to the system-tray, rather than " +#~ "the taskbar." +#~ msgstr "启用后最小化系统状态栏而不是系统任务栏。" + +#~ msgid "Unable to open skin file: %s" +#~ msgstr "无法读取面板文件:%s" + +#~ msgid "Browse skin file" +#~ msgstr "浏览skin面板文件" + +#~ msgid "Use skin file to set aMule bitmaps." +#~ msgstr "使用skin面板来设置aMule bitmaps." + +#~ msgid "Skin file:" +#~ msgstr "Skin 文件:" + +#~ msgid "theApp.serverlist->GetServerByAddress() returned NULL" +#~ msgstr "theApp.serverlist->GetServerByAddress() returned NULL" + +#~ msgid "Skin file name is empty - loading defaults" +#~ msgstr "面板文件未设置 - 正在加载默认面板" + +#~ msgid "Skin file %s does not exist - loading defaults" +#~ msgstr "面板文件 %s 不存在 - 正在加载默认面板" + +#~ msgid "IPFilter is %s.\n" +#~ msgstr "IP 过滤当前状态是 %s.\n" + +#~ msgid "Enable IP-Filtering" +#~ msgstr "启用IP过滤" + +#~ msgid "" +#~ "Enable filtering of the IPs defined in the file ~/.aMule/ipfilter.dat." +#~ msgstr "启用IP 地址过滤列表 ~/.aMule/ipfilter.dat" + +#~ msgid "ED2K Link Handler" +#~ msgstr "ED2K 链接处理" + +#~ msgid "Local Search" +#~ msgstr "本地搜索" + +#~ msgid "Global Search" +#~ msgstr "全球搜索" + +#~ msgid "FileHash (WWW)" +#~ msgstr "文件校检码 (WWW)" + +#~ msgid "Socks5" +#~ msgstr "Socks5" + +#~ msgid "Socks4" +#~ msgstr "Socks4" + +#~ msgid "Hasher: Creating new thread." +#~ msgstr "Hasher: 正在产生新线程。" + +#~ msgid "Hasher: Signaling for remaining threads to terminate." +#~ msgstr "Hasher: 正在通知剩余线程结束。" + +#~ msgid "Hasher: No files on queue, stopping thread." +#~ msgstr "Hasher: 队列上没有文件,正在结束线程。" + +#~ msgid "Hasher: Starting to create MD4 and AICH hash for file: %s" +#~ msgstr "Hasher: 开始计算MD4和AICH校检码:%s" + +#~ msgid "Hasher: Starting to create MD4 hash for file: " +#~ msgstr "Hasher: 开始计算MD4校检码:" + +#~ msgid "Hasher: Finished hashing file: %s" +#~ msgstr "校检码生成器:完成了文件: %s" + +#~ msgid "Hasher: A thread has died." +#~ msgstr "校检码生成器:一个线程死亡了。" + +#~ msgid "AICH Thread: Signaling for thread to terminate." +#~ msgstr "AICH Thread: 正在通知线程退出。" + +#~ msgid "AICH Thread: Terminated." +#~ msgstr "AICH Thread: 已退出" + +#~ msgid "AICH Thread: Syncronization thread started." +#~ msgstr "AICH Thread: 同步线程已启动" + +#~ msgid "AICH Thread: Masterhashes of known files have been loaded." +#~ msgstr "AICH Thread: 已载入已知文件的主校检码" + +#~ msgid "AICH Thread: Starting to hash files. %li files found." +#~ msgstr "AICH Thread: 开始计算文件校检码。找到 %li 个文件。" + +#~ msgid "AICH Thread: Hashing file: %s, total files left: %li" +#~ msgstr "AICH Thread: 正在计算校检码: %s, 剩余文件数: %li" + +#~ msgid "AICH Thread: Hashing completed." +#~ msgstr "AICH Thread: 计算完成" + +#~ msgid "AICH Thread: No new files found." +#~ msgstr "AICH Thread: 没有发现新文件。" + +#~ msgid "" +#~ "Copied old ~/.xMule config and credit files to ~/.aMule\n" +#~ "However, be sure NOT to remove .xMule if your Incoming / Temp folders are " +#~ "still there ;)" +#~ msgstr "" +#~ "已复制旧的 ~/.xMule 配置及积分文件到 ~/.aMule\n" +#~ "但如果你的临时文件夹或接收文件夹在 ~/.xMule ,就不要删除该目录 ;)" + +#~ msgid "" +#~ "Temp dir is placed on a FAT32 partition. Disabling chmod to avoid useless " +#~ "warnings." +#~ msgstr "" +#~ "临时文件夹位于FAT32硬盘分区。正在关闭chmod以避免没有意义的警告信息。" + +#~ msgid "" +#~ "Incoming dir is placed on a FAT32 partition. Disabling chmod to avoid " +#~ "useless warnings." +#~ msgstr "" +#~ "接收文件夹位于FAT32硬盘分区。正在关闭chmod以避免没有意义的警告信息。" + +#~ msgid "" +#~ "ERROR: amule daemon is useless when external connections disabled. Change " +#~ "configuration either from GUI or by editing the config file" +#~ msgstr "错误:禁用外部连接时amule服务进程毫无意义。请更改您的设置。" + +#~ msgid "Desktop integration" +#~ msgstr "桌面集成" + +#~ msgid "aMule remote control" +#~ msgstr "aMule 远程控制" + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2006 aMule Team \n" +#~ msgstr "" +#~ "多平台P2P客户端软件.\n" +#~ "\n" +#~ " 网站: http://www.amule.org\n" +#~ " 论坛: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " 联系: admin@amule.org (管理事务) \n" +#~ " Copyright (C) 2003-2006 aMule Project \n" + +#~ msgid "Disconnect from current server" +#~ msgstr "服务器连接已中断" + +#~ msgid "Connect to any server" +#~ msgstr "连接到任意服务器" + +#~ msgid "Users: %s (%s) | Files %s (%s)" +#~ msgstr "用户: %s (%s) | 文件 %s (%s)" + +#~ msgid "Connected to amule at %s" +#~ msgstr "已连接到 %s" + +#~ msgid "Connection Failed. Unable to connect to the specified host" +#~ msgstr "连接失败。无法连接到指定的计算机" + +#~ msgid "ExternalConn: Access denied because: %s" +#~ msgstr "外部连接:请求被拒绝,具体原因:%s" + +#~ msgid "Succeeded! Connection established to aMule %s" +#~ msgstr "已成功连接 aMule %s" + +#~ msgid " (Fake eMule version %x)" +#~ msgstr " (假冒 eMule 版本%x)" + +#~ msgid " (based on eMule v0.%u)" +#~ msgstr "(基于 eMule v0.%u)" + +#~ msgid "Client %s on IP:Port %s:%d using %s" +#~ msgstr "用户 %s 在 IP:Port %s:%d 使用 %s" + +#~ msgid "Chat-Session Started: %s - %s %s" +#~ msgstr "聊天开始: %s - %s %s" + +#~ msgid "No 'cryptkey.dat' file found, creating" +#~ msgstr "没找到'cryptkey.dat',产生新文件" + +#~ msgid "aMule O.S. info is: %s" +#~ msgstr "aMule 操作系统信息:%s" + +#~ msgid "Feedback from:" +#~ msgstr "反馈 - 来自:" + +#~ msgid "Client: aMule" +#~ msgstr "客户: aMule " + +#~ msgid "File Name:" +#~ msgstr "文件名:" + +#~ msgid "File size:" +#~ msgstr "文件大小 :" + +#~ msgid "Download:" +#~ msgstr "下载:" + +#~ msgid "Sources:" +#~ msgstr "源:" + +#~ msgid "Complete Sources:" +#~ msgstr "完整源:" + +#~ msgid "Get Razorback 2's stats for this file" +#~ msgstr "获取Razorback 2上该文件的信息" + +#~ msgid "jugle.net Fake Check" +#~ msgstr "jugle.net 假冒检查" + +#~ msgid "'Donkey Fakes' Fake Check" +#~ msgstr "'Donkey Fakes'假冒检查" + +#~ msgid "FakeCheck" +#~ msgstr "假冒检查" + +#~ msgid "Copy ED2k link to clipboard (&HTML)" +#~ msgstr "拷贝 ED2k 连接到剪贴板 (HTML)" + +#~ msgid "You are already trying to download the file " +#~ msgstr "您已经在下载该文件" + +#~ msgid "ExternalConn: failed to Create thread" +#~ msgstr "ExternalConn: failed to Create thread" + +#~ msgid "Invalid EC packet received" +#~ msgstr "收到无效EC数据包" + +#~ msgid "" +#~ "Incorrect CVSDATE. Please run core and remote from the same CVS tarball." +#~ msgstr "CVSDATE不正确。请确保核心和远程部分来自同一CVS源文件包。" + +#~ msgid "aMule is not connected! Cannot do search." +#~ msgstr "您现在没有连接到服务器上!所以无法搜索。" + +#~ msgid "ExternalConn: Unable to understand ed2k link '%s'." +#~ msgstr "外部连接:无法理解ED2K链接 '%s'." + +#~ msgid "ExternalConn: invalid opcode received" +#~ msgstr "外部连接:收到无效 opcode" + +#~ msgid "ExternalConnClientThread: Failed to Create thread." +#~ msgstr "ExternalConnClientThread: 无法建立新线程。" + +#~ msgid "ExternalConnClientThread: Connection closed." +#~ msgstr "ExternalConnClientThread: 已关闭连接。" + +#~ msgid "Syntax error!\n" +#~ msgstr "格式错误!\n" + +#~ msgid "Now, doing connection....\n" +#~ msgstr "现在正在连接....\n" + +#~ msgid "Using host '%s' port: %d\n" +#~ msgstr "使用主机 '%s' 端口: %d\n" + +#~ msgid "Trying to connect (timeout = 10 sec)...\n" +#~ msgstr "正在连接 (时限=10秒)...\n" + +#~ msgid "ExternalConn: Access denied because: %s\n" +#~ msgstr "外部连接:请求被拒绝,具体原因:%s\n" + +# +#~ msgid "ExternalConn: Access denied.\n" +#~ msgstr "外部连接:请求被拒绝\n" + +#~ msgid "ExternalConn: Bad reply from server. Connection closed.\n" +#~ msgstr "外部连接:服务器回复错误。已断开连接。\n" + +#~ msgid "Succeeded! Connection established to aMule %s\n" +#~ msgstr "已成功连接到aMule %s\n" + +#~ msgid "Succeeded! Connection established.\n" +#~ msgstr "已成功连接。\n" + +#~ msgid "A socket error occured during authentication. Exiting.\n" +#~ msgstr "登录时出现端口错误。正在退出。\n" + +#~ msgid "Failed to read corrupted friendlist file 'emfriends.met'!" +#~ msgstr "无法读取损坏的好友列表文件 'emfriends.met'!" + +#~ msgid "Loaded ipfilter with %d new IP addresses." +#~ msgstr "成功载入IP地址过滤,共有 %d 个新IP地址。" + +#~ msgid "Error reading known.met file! (corrupted?)" +#~ msgstr "无法读取 known.met (文件损坏?)" + +#~ msgid "Client requests invalid %u." +#~ msgstr "用户请求非法%u。" + +#~ msgid "" +#~ "User %s (%u) requested your requested your sharedfiles-list -> Accepted" +#~ msgstr "用户 %s (%u) 请求了共享文件列表 -> 接受" + +#~ msgid "" +#~ "User %s (%u) requested your requested your sharedfiles-list -> Denied" +#~ msgstr "用户 %s (%u) 请求了共享文件列表 -> 拒绝" + +#~ msgid "User %s (%u) denied access to shareddirectories/files-list" +#~ msgstr "用户%s (%u) 拒绝提供共享文件/文件夹列表" + +#~ msgid "CListenSocket: Cannot create thread" +#~ msgstr "CListenSocket: 无法产生新线程" + +#~ msgid "CListenSocket: Destroying" +#~ msgstr "CListenSocket: 正在销毁中" + +#~ msgid "CSocketGlobalThread: Call to Create failed" +#~ msgstr "CSocketGlobalThread: Create调用失败" + +#~ msgid "CSocketGlobalThread: Exited" +#~ msgstr "CSocketGlobalThread: 已退出" + +#~ msgid "Download Speed: %.1f\n" +#~ msgstr "下载速度: %.1f\n" + +#~ msgid "Upload Speed: %.1f\n" +#~ msgstr "上传速度: %.1f\n" + +#~ msgid "" +#~ "\n" +#~ "Speed Limits:\n" +#~ msgstr "" +#~ "\n" +#~ "速度限制:\n" + +#~ msgid "UL: None, " +#~ msgstr "上传: 无" + +#~ msgid "UL: %u, " +#~ msgstr "上传:%u, " + +#~ msgid "Nickname: " +#~ msgstr "昵称: " + +#~ msgid "IP: " +#~ msgstr "IP: " + +#~ msgid "TCP Port: " +#~ msgstr "TCP 端口:" + +#~ msgid "UDP Port: " +#~ msgstr "UDP 端口:" + +#~ msgid "Uptime: " +#~ msgstr "运行时间: " + +#~ msgid "Shared Files: " +#~ msgstr "共享文件: " + +#~ msgid "Queued Clients: " +#~ msgstr "队列中用户: " + +#~ msgid "Total DL: " +#~ msgstr "总下载: " + +#~ msgid "Total UL: " +#~ msgstr "总上传: " + +#~ msgid "Disconnect from server" +#~ msgstr "服务器连接中断" + +#~ msgid "" +#~ "For system tray integration to work,\n" +#~ "you must specify which desktop you are using.\n" +#~ "You can change this later from preferences." +#~ msgstr "" +#~ "为了使系统状态栏集成正常工作,\n" +#~ "您必需确定您所使用的桌面系统。\n" +#~ "您以后可以设置中更改此选项。" + +#~ msgid "Gnome 2.x (or other XEMBED compatible)" +#~ msgstr "Gnome 2.x (或其它 XEMBED 兼容系统)" + +#~ msgid "KDE 3.x" +#~ msgstr "KDE 3.x" + +#~ msgid "KDE 2.x / Gnome 1.2 " +#~ msgstr "KDE 2.x / Gnome 1.2 " + +#~ msgid "No systray integration, please" +#~ msgstr "取消系统状态栏集成" + +#~ msgid "Desktop" +#~ msgstr "桌面" + +#~ msgid "Jugle (WWW)" +#~ msgstr "Jugle (WWW)" + +#~ msgid "" +#~ "switch download list to clients you're downloading from, with files also " +#~ "(some day)" +#~ msgstr "调换至下载中的源列表。" + +#~ msgid " / (" +#~ msgstr " / (" + +#~ msgid ")" +#~ msgstr ")" + +#~ msgid "Comment this file (this text will be show by all users)" +#~ msgstr "为该文件加注释 (给所有用户看)" + +#~ msgid "(" +#~ msgstr "(" + +#~ msgid "Downloadlist doubleclick to expand" +#~ msgstr "鼠标双击展开下载列表" + +#~ msgid "" +#~ "If enabled, it is possible to display the sources associated with " +#~ "downloads by double-clicking on them." +#~ msgstr "启用后可双击显示下载源。" + +#~ msgid "Select Window Manager" +#~ msgstr "选择窗口管理器" + +#~ msgid "" +#~ "Click here to select the type of systray integration you wish aMule to " +#~ "use." +#~ msgstr "点击选择系统状态栏集成方式。" + +#~ msgid "Fake Check" +#~ msgstr "真伪鉴别" + +#~ msgid "my browser" +#~ msgstr "我的浏览器" + +#~ msgid "Client TCP Port:" +#~ msgstr "用户TCP端口:" + +#~ msgid "Client UDP port: 4665" +#~ msgstr "用户UDP端口:4665" + +#~ msgid "eMule extended UDP Port:" +#~ msgstr "用户拓展UDP端口:" + +#~ msgid "Save 5 sources on rare files (< 20 sources)" +#~ msgstr "保存稀有文件的5个源 (< 20 个源)" + +#~ msgid "Extract Meta Data Tags" +#~ msgstr "提取信息标签" + +#~ msgid "Reduce Fragmentation" +#~ msgstr "降低硬盘数据散乱度" + +#~ msgid "Allocate full chunks for .part files" +#~ msgstr "预留数据段硬盘空间" + +#~ msgid "" +#~ "Select this to allocate a full chunk each time data is received for it." +#~ msgstr "该选项在接收数据段前为其预留硬盘空间" + +#~ msgid "Allocate full disk space for .part files" +#~ msgstr "预留整个硬盘空间给.part文件" + +#~ msgid "" +#~ "This option reduces fragmentation but slows down the part file creation " +#~ "and will disable sparse files" +#~ msgstr "该选项可以降低硬盘数据散乱度但会使part文件的产生变慢" + +#~ msgid " Min Disk Space: " +#~ msgstr " 最低硬盘空间: " + +#~ msgid "mplayer -idx" +#~ msgstr "mplayer -idx" + +#~ msgid "Use TCP ports instead of unix local sockets" +#~ msgstr "使用TCP端口而不是Unix的本地接口" + +#~ msgid "External TCP port" +#~ msgstr "外部TCP端口" + +#~ msgid "http://www.srv1000.com/azz/server.met" +#~ msgstr "http://www.srv1000.com/azz/server.met" + +#~ msgid "My Info" +#~ msgstr "我的信息" + +#~ msgid "." +#~ msgstr "." + +#~ msgid "Bootstrap known clients" +#~ msgstr "启动已知用户" + +#~ msgid "Current Searches" +#~ msgstr "当前搜索" + +#~ msgid "Default Permissions" +#~ msgstr "默认许可" + +#~ msgid "Owner permissions, must at least be read/write'able." +#~ msgstr "拥有者许可,至少需要可读可写。" + +#~ msgid "Group permissions." +#~ msgstr "用户组许可" + +#~ msgid "Other permissions." +#~ msgstr "其他许可" + +#~ msgid "localhost" +#~ msgstr "本机" + +#~ msgid "4712" +#~ msgstr "4712" + +#~ msgid "amule" +#~ msgstr "amule" + +#~ msgid "Servers List Window" +#~ msgstr "服务器列表窗口" + +#~ msgid "Kademlia bootstrap" +#~ msgstr "Kademlia bootstrap" + +#~ msgid "SharedFiles" +#~ msgstr "共享文件" + +#~ msgid "K" +#~ msgstr "K" + +#~ msgid "Error: part.met nackups file is 0 size: %s ==> %s" +#~ msgstr "错误: part.met 文件长度为0 : %s ==> %s" + +#~ msgid "Error: %s (%s) is corrupt." +#~ msgstr "错误: %s (%s) 已损坏" + +#~ msgid "Error: %s is corrupt, unable to load file." +#~ msgstr "错误: 文件 %s 已损坏,无法读取文件" + +#~ msgid "" +#~ "WARNING: A file with that name already exists, the file has been renamed" +#~ msgstr "警告:文件名已存在, 现有文件已被更名" + +#~ msgid "WARNING: Failed to delete %s.seeds" +#~ msgstr "警告:无法删除 %s.seeds" + +#~ msgid "" +#~ "Downloaded:\n" +#~ "%s" +#~ msgstr "" +#~ "已下载:\n" +#~ "%s" + +#~ msgid "\tStopped" +#~ msgstr "\t已停止" + +#~ msgid "\tRemoved from shared" +#~ msgstr "\t已从共享中移除" + +#~ msgid "\tRemoved from download queue" +#~ msgstr "\t已从下载队列中删除" + +#~ msgid "\tRemoved transferwnd" +#~ msgstr "\t已删除下载窗口" + +#~ msgid "\tClosed" +#~ msgstr "\t已关闭" + +#~ msgid "\tFailed to delete '%s'" +#~ msgstr "\t无法删除 '%s'" + +#~ msgid "\tRemoved .part.met" +#~ msgstr "\t已删除 .part.met" + +#~ msgid "Failed to delete '%s'" +#~ msgstr "无法删除 '%s'" + +#~ msgid "\tRemoved .part" +#~ msgstr "\t已删除 .part" + +#~ msgid "\tRemoved .BAK" +#~ msgstr "\t已删除 .BAK" + +#~ msgid "\tRemoved .seeds" +#~ msgstr "\t已删除 .seeds" + +#~ msgid "Done" +#~ msgstr "完成" + +#~ msgid "Expected part-hash: %s" +#~ msgstr "part-hash期望值:%s" + +#~ msgid "Actual part-hash: %s" +#~ msgstr "part-hash实际值:%s" + +#~ msgid "Language change will not be applied until aMule is restarted." +#~ msgstr "语言设置更动在重新启动 aMule 后才会生效" + +#~ msgid "Incomming files" +#~ msgstr "接收文件" + +#~ msgid "Executable (*)|*||" +#~ msgstr "可执行文件 (*)|*||" + +#~ msgid "You are not connected to a server!" +#~ msgstr "您现在没有连接到服务器上!" + +#~ msgid "Copy ED2k link to clipboard (HTML)" +#~ msgstr "拷贝 ED2K 链接到剪贴板 (HTML)" + +#~ msgid "Invalid versiontag in server.met (0x%x , size %i)!" +#~ msgstr "server.met 中的版本标签无效 (0x%x , 大小 %i)!" + +#~ msgid "Error: the file server.met is corrupted" +#~ msgstr "错误: server.met 文件已损坏" + +#~ msgid "Failed to download the server list from " +#~ msgstr "无法下载服务器列表 " + +#~ msgid "CServerSocketHandler: can not create my thread" +#~ msgstr "CServerSocketHandler: can not create my thread" + +#~ msgid "Unknown exception while processing packet from server!" +#~ msgstr "在处理从服务器接收的数据是有无法处理的错误!" + +#~ msgid "WARNING! Sharing the following directory is not recommended: %s" +#~ msgstr "警告!建议不要共享下列文件夹:%s" + +#~ msgid "Change this file's comment..." +#~ msgstr "更改该文件的注释" + +#~ msgid "Operative System" +#~ msgstr "操作系统" + +#~ msgid "Found Sources: %i" +#~ msgstr "发现源: %i" + +#~ msgid "Active Downloads (chunks): %i" +#~ msgstr "活跃下载 (数据段): %i" + +#~ msgid "Active Uploads: %i" +#~ msgstr "活跃上传: %i" + +#~ msgid "Waiting Uploads: %i" +#~ msgstr "等待上传: %i" + +#~ msgid "Total successful upload sessions: %i" +#~ msgstr "总成功上传片段: %i" + +#~ msgid "Total failed upload sessions: %i" +#~ msgstr "总失败上传片段: %i" + +#~ msgid "Average Downloadrate (Session): %.2f kB/s" +#~ msgstr "平均下载速度 (本次运行): %.2f kB/s" + +#~ msgid "Average Uploadrate (Session): %.2f kB/s" +#~ msgstr "平均上传速度 (本次运行): %.2f kB/s" + +#~ msgid "Max Downloadrate Average (Session): %.2f kB/s" +#~ msgstr "平均最高下载速度 (本次运行): %.2f kB/s" + +#~ msgid "Max Downloadrate (Session): %.2f kB/s" +#~ msgstr "最高下载速度 (本次运行): %.2f kB/s" + +#~ msgid "waiting for transfer..." +#~ msgstr "等待传输..." + +#~ msgid "Waiting for connection..." +#~ msgstr "等待连接..." + +#~ msgid "Max Connection Limit Reached: %i : %s" +#~ msgstr "连接总数达到上限: %i : %s" + +#~ msgid "Max Connection Limit Reached: Never" +#~ msgstr "连接总数达到上限: 从来没有" + +#~ msgid "Average Connections (estimate): %f" +#~ msgstr "平均连接 (估计值): %f" + +#~ msgid "Session UL:DL Ratio (Total): Not available" +#~ msgstr "本次运行 上传:下载 比率 (总和): 无有效数据" + +#~ msgid "Number of Shared Files: %i" +#~ msgstr "共享文件数: %i" + +#~ msgid "Old MLDonkey: %i (%1.1f%%)" +#~ msgstr "旧 MLDonkey: %i (%1.1f%%)" + +#~ msgid "New MLDonkey: %i (%1.1f%%)" +#~ msgstr "新 MLDonkey: %i (%1.1f%%)" + +#~ msgid "Compatible: %i (%1.1f%%)" +#~ msgstr "兼容: %i (%1.1f%%)" + +#~ msgid "Unknown: %i" +#~ msgstr "未知: %i" + +#~ msgid "Filtered: %i" +#~ msgstr "屏蔽: %i" + +#~ msgid "HasSocket: %i (%1.1f%%)" +#~ msgstr "HasSocket: %i (%1.1f%%)" + +#~ msgid "Working Servers" +#~ msgstr "正常运行的服务器" + +#~ msgid "Failed Servers" +#~ msgstr "当机的服务器" + +#~ msgid "Deleted Servers" +#~ msgstr "已删除的服务器" + +#~ msgid "Users on Working Servers" +#~ msgstr "正常运行服务器上的用户总数" + +#~ msgid "Files on Working Servers" +#~ msgstr "正常运行服务器上的文件总数" + +#~ msgid "Total Users" +#~ msgstr "用户总数" + +#~ msgid "Total Files" +#~ msgstr "文件总数" + +#~ msgid "aMule Tray Menu Info" +#~ msgstr "aMule 状态栏 菜单 信息" + +#~ msgid "ClientID:" +#~ msgstr "客户代号: " + +#~ msgid "ServerName:" +#~ msgstr "服务器名称:" + +#~ msgid "ServerIP:" +#~ msgstr "服务器 IP:" + +#~ msgid "Shared Files: %s" +#~ msgstr "共享文件: %s" + +#~ msgid "aMule for Linux" +#~ msgstr "aMule for Linux" + +#~ msgid "E&xit\tAlt-X" +#~ msgstr "退出(&x)\tAlt-X" + +#~ msgid "Quit amulecmd" +#~ msgstr "退出 amulecmd" + +#~ msgid "&About...\tF1" +#~ msgstr "关于(&A)...\tF1" + +#~ msgid "Show about dialog" +#~ msgstr "显示‘关于’对话框" + +#~ msgid "&File" +#~ msgstr "文件(&F)" + +#~ msgid "&Help" +#~ msgstr "帮助(&H)" + +#~ msgid "" +#~ "\n" +#~ "Ok, exiting Text Client...\n" +#~ msgstr "" +#~ "\n" +#~ "退出...\n" + +#~ msgid "" +#~ "amulecmd DLG version\n" +#~ "Using %s\n" +#~ "(c) aMule Dev Team" +#~ msgstr "" +#~ "amulecmd DLG version\n" +#~ "Using %s\n" +#~ "(c) aMule Dev Team" + +#~ msgid "About amulecmd" +#~ msgstr "关于 amulecmd" + +#~ msgid "This command requieres an argument. Valid arguments: 'on', 'off'\n" +#~ msgstr "该命令需要一个参数。有效参数为:'on', 'off'\n" + +#~ msgid "" +#~ "This command requieres an argument. Valid arguments: 'all', a number.\n" +#~ msgstr "该命令需要一个参数。有效参数为:'all', 或一数字\n" + +#~ msgid "Hint: Use Show DL or Show UL\n" +#~ msgstr "提示:使用 Show DL or Show UL\n" + +#~ msgid "IPLevel parameter must be in the range of 0-255.\n" +#~ msgstr "IPLevel 命令参数一定要在 0-255 的范围。\n" + +#~ msgid "This option requires an argument." +#~ msgstr "该选项需要一个参数。" + +#~ msgid "Connected to %s %s " +#~ msgstr "已连接到 %s %s " + +#~ msgid "" +#~ "\n" +#~ "Download:\t %d/sec" +#~ msgstr "" +#~ "\n" +#~ "下载:\t %d/秒" + +#~ msgid "" +#~ "\n" +#~ "Upload:\t%d/sec" +#~ msgstr "" +#~ "\n" +#~ "上传:\t %d/秒" + +#~ msgid "%s/sec" +#~ msgstr "%s/秒" + +#~ msgid "" +#~ "\n" +#~ "--------------------> Available commands (case insensitive): " +#~ "<------------------\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "----------------> 有效命令 (分大小写): <----------------\n" +#~ "\n" + +#~ msgid "server IP" +#~ msgstr "服务器 IP" + +#~ msgid "Connect to given/random server. No warn if failed!\n" +#~ msgstr "连接到随机服务器。失败后无警告信息!\n" + +#~ msgid "Disconnect from server.\n" +#~ msgstr "中断服务器连接。\n" + +#~ msgid "Show server list.\n" +#~ msgstr "显示服务器列表。\n" + +#~ msgid "Shows status and statistics.\n" +#~ msgstr "显示状态和统计\n" + +#~ msgid "Shows Download/Upload queue.\n" +#~ msgstr "显示下载/上传队列。\n" + +#~ msgid "Resume file number n (or 'all').\n" +#~ msgstr "续传文件编号 n (或 'all').\n" + +#~ msgid "Pauses file number n (or 'all').\n" +#~ msgstr "暂停文件编号 n (或 'all').\n" + +#~ msgid "Turn on/off amule IPFilter.\n" +#~ msgstr "开关IP过滤。\n" + +#~ msgid "Reload IPFilter table from file.\n" +#~ msgstr "重新载入IP过滤列表文件。\n" + +#~ msgid "level" +#~ msgstr "级别" + +#~ msgid "Shows/Sets current IP Filter level.\n" +#~ msgstr "显示/设置IP过滤级别。\n" + +#~ msgid "ED2k_Link" +#~ msgstr "ED2K_Link" + +#~ msgid "Adds (file or server) to aMule.\n" +#~ msgstr "添加 (文件或服务器)到aMule.\n" + +#~ msgid "limit" +#~ msgstr "限制" + +#~ msgid "Sets maximum upload bandwidth.\n" +#~ msgstr "设置最高上传带宽。\n" + +#~ msgid "Sets maximum download bandwidth.\n" +#~ msgstr "设置最高下载带宽。\n" + +#~ msgid "Displays bandwidth limits.\n" +#~ msgstr "显示带宽限制.\n" + +#~ msgid "Displays full statistics tree.\n" +#~ msgstr "显示完整统计数据树。\n" + +#~ msgid "Reload shared files list.\n" +#~ msgstr "刷新共享文件列表。\n" + +#~ msgid "Shows this help.\n" +#~ msgstr "显示帮助。\n" + +#~ msgid "Exits aMulecmd.\n" +#~ msgstr "退出 aMulecmd.\n" + +#~ msgid "Shutdown aMule\n" +#~ msgstr "关闭 aMule\n" + +#~ msgid "" +#~ "\n" +#~ "----------------------------> End of listing " +#~ "<----------------------------------\n" +#~ msgstr "" +#~ "\n" +#~ "----------------------------> 列表完毕 " +#~ "<----------------------------------\n" + +#~ msgid "aMule text client" +#~ msgstr "aMule 文本客户端" + +#~ msgid "Failed to open shared file (%s), rechecking list of shared files." +#~ msgstr "无法打开共享文件(%s),正在重新检查共享文件名单。" + +#~ msgid "WARNING: aMule is stopped !" +#~ msgstr "警告: aMule 已经停止运行!" + +#~ msgid " is STOPPED !" +#~ msgstr " 已经停止运行!" + +#~ msgid "Quit amuleweb" +#~ msgstr "退出 amuleweb" + +#~ msgid "" +#~ "\n" +#~ "Ok, exiting Web Client...\n" +#~ msgstr "" +#~ "\n" +#~ "正在退出 Web Client...\n" + +#~ msgid "" +#~ "amuleweb [DLG version]\n" +#~ "Using %s\n" +#~ "(c) aMule Dev Team" +#~ msgstr "" +#~ "amuleweb [DLG version]\n" +#~ "Using %s\n" +#~ "(c) aMule Dev Team" + +#~ msgid "About amuleweb" +#~ msgstr "关于 amuleweb" + +#~ msgid "amuleweb DLG" +#~ msgstr "amuleweb DLG" + +#~ msgid "FATAL ERROR: Cannot find template: %s" +#~ msgstr "错误: 找不到模板:%s" + +#~ msgid "" +#~ "\n" +#~ "----------------> Help: Available commands (case insensitive): " +#~ "<----------------\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "----------------> 帮助: 有效命令 (分大小写): <----------------\n" +#~ "\n" + +#~ msgid "Exits aMuleWeb.\n" +#~ msgstr "退出 aMuleWeb.\n" + +#~ msgid "" +#~ "\n" +#~ "Use 'Help' for command list\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "使用 'Help' 列出所有命令\n" +#~ "\n" + +#~ msgid "Very Low" +#~ msgstr "极低" + +#~ msgid " Auto" +#~ msgstr "自动" + +#~ msgid "Web Server: running\n" +#~ msgstr "Web服务器:正在运行\n" + +#~ msgid "Web Server: Restarted\n" +#~ msgstr "Web服务器:重启动完毕\n" + +#~ msgid "Web Server: Stopped\n" +#~ msgstr "Web服务器:已停止\n" + +#~ msgid "Web Server: not running\n" +#~ msgstr "Web服务器:没有运行\n" + +#~ msgid "Can't load templates: Can't open file %s" +#~ msgstr "无法加载模板: 无法开启文件 %s" + +#~ msgid "" +#~ "Can't find template version number!\n" +#~ "Please replace aMule.tmpl with a newer version!" +#~ msgstr "" +#~ "找不到模板版本号!\n" +#~ "请升级 aMule.tmpl 到新版本!" + +#~ msgid "Failed to load template %s\n" +#~ msgstr "无法加载模板 %s\n" + +# +#~ msgid "Access denied!" +#~ msgstr "请求被拒绝" + +#~ msgid "Web Control Panel" +#~ msgstr "网络服务器控制板" + +#~ msgid "Server list" +#~ msgstr "服务器列表" + +#~ msgid "ED2K Link(s)" +#~ msgstr "ED2K链接" + +#~ msgid "Log" +#~ msgstr "日志" + +#~ msgid "Serverinfo" +#~ msgstr "服务器信息" + +#~ msgid "Debug Log" +#~ msgstr "调试日志" + +#~ msgid "Logout" +#~ msgstr "登出" + +#~ msgid "Server name" +#~ msgstr "服务器名称" + +#~ msgid "IP" +#~ msgstr "IP" + +#~ msgid "users" +#~ msgstr "用户" + +#~ msgid "files" +#~ msgstr "文件" + +#~ msgid "Actions" +#~ msgstr "动作" + +#~ msgid "Remove selected server" +#~ msgstr "删除选择的服务器" + +#~ msgid "Are you sure to remove this server from list?" +#~ msgstr "您确定要把该服务器从列表中删除吗?" + +#~ msgid "This ed2k link is invalid (%s)" +#~ msgstr "该 ED2K 链接无效 (%s)" + +#~ msgid "Got no response from aMule." +#~ msgstr "aMule 没有响应" + +#~ msgid "Downloaded total" +#~ msgstr "下载总量" + +#~ msgid "Uploaded total" +#~ msgstr "上传总量" + +#~ msgid "Increase Priority" +#~ msgstr "提高优先级" + +#~ msgid "Decrease Priority" +#~ msgstr "降低优先级" + +#~ msgid "Internal error - no item in container" +#~ msgstr "内部错误 - no item in container" + +#~ msgid "Hide Queue" +#~ msgstr "隐藏队列" + +#~ msgid "Clear Completed" +#~ msgstr "清除已完成的文件" + +#~ msgid "Uploads (%i)" +#~ msgstr "上传 (%i)" + +#~ msgid "Download Selected" +#~ msgstr "下载已选文件" + +#~ msgid "Time" +#~ msgstr "时间" + +#~ msgid "Refetch graph data" +#~ msgstr "重新获取图数据" + +#~ msgid "IP or Address" +#~ msgstr "IP 或地址:" + +#~ msgid "Name" +#~ msgstr "名字" + +#~ msgid "Add to list" +#~ msgstr "加入列表" + +#~ msgid "Update server.met from URL" +#~ msgstr "读取URL以更新server.met" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Web-based Search" +#~ msgstr "网上搜索" + +#~ msgid "File Settings" +#~ msgstr "文件设置" + +#~ msgid "Max Sources Per File" +#~ msgstr "单个文件最大源数" + +#~ msgid "Max. Connections" +#~ msgstr "最大连接数" + +#~ msgid "Max. new connections / 5secs" +#~ msgstr "5 秒内最大新连接数" + +#~ msgid "Gzip Compression" +#~ msgstr "启用 Gzip 压缩" + +#~ msgid "Save traffic, especially in graphs." +#~ msgstr "保存传输数据,特别是在图里" + +#~ msgid "Enable or disable the display of waiting queue in transfer page." +#~ msgstr "启用或禁用传输页内的等待队列显示" + +#~ msgid "Refresh-Time of Pages" +#~ msgstr "页刷新周期" + +#~ msgid "Time in seconds (zero=disabled)" +#~ msgstr "时间秒数 (0代表禁用)" + +#~ msgid "Speed Limits" +#~ msgstr "速度限制" + +#~ msgid "Bandwidth Limits" +#~ msgstr "带宽限制" + +#~ msgid "Statistics graphs' settings" +#~ msgstr "统计图像窗口设置" + +#~ msgid "Graph height" +#~ msgstr "图表高度" + +#~ msgid "Graph width" +#~ msgstr "图表宽度" + +#~ msgid "pixels" +#~ msgstr "像素" + +#~ msgid "In the graph, each pixel represents" +#~ msgstr "在图表中每个像素代表" + +#~ msgid "seconds" +#~ msgstr "seconds" + +#~ msgid "Login" +#~ msgstr "登录" + +#~ msgid "Enter your password here" +#~ msgstr "请输入密码" + +#~ msgid "Login Now" +#~ msgstr "现在登录" + +#~ msgid "Server Preferences" +#~ msgstr "服务器设置" + +#~ msgid "Connected " +#~ msgstr "已连接" + +#~ msgid "Search Results" +#~ msgstr "搜索结果" + +#~ msgid "Refetch Results" +#~ msgstr "刷新结果" + +#~ msgid "File Hash" +#~ msgstr "文件校检码" + +#~ msgid "Min Availability" +#~ msgstr "最低源数" + +#~ msgid "Method" +#~ msgstr "方式" + +#~ msgid "Global (Server)" +#~ msgstr "全球 (服务器)" diff --git a/po/zh_TW.po b/po/zh_TW.po new file mode 100644 index 00000000..457d2abe --- /dev/null +++ b/po/zh_TW.po @@ -0,0 +1,8625 @@ +# aMule Translation file. +# Copyright (C) 2004 aMule Team +# This file is distributed under the same license as the aMule package. +# Chen yu-kai , 2004. +# xiaoqiao <29551030@qq.com>, 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: aMule 2.2.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-02-28 03:31+0100\n" +"PO-Revision-Date: 2007-12-21 23:00+0800\n" +"Last-Translator: 小橋 <29551030@qq.com>\n" +"Language-Team: Chinese <29551030@qq.com>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/libs/ec/cpp/RemoteConnect.cpp:86 src/libs/ec/cpp/RemoteConnect.cpp:94 +msgid "You must specify a non-empty password." +msgstr "您必須輸入密碼" + +#: src/libs/ec/cpp/RemoteConnect.cpp:91 +msgid "Invalid password, not a MD5 hash!" +msgstr "非法密碼,不是合法的MD5校驗碼" + +#: src/libs/ec/cpp/RemoteConnect.cpp:136 +msgid "Connection failure" +msgstr "連接失敗" + +#: src/libs/ec/cpp/RemoteConnect.cpp:194 +msgid "EC Connection Failed. Empty reply." +msgstr "連接外部連接失敗,回複爲空" + +#: src/libs/ec/cpp/RemoteConnect.cpp:200 +msgid "ExternalConn: Access denied because: " +msgstr "外部連接:訪問被拒絕,原因:" + +#: src/libs/ec/cpp/RemoteConnect.cpp:203 +msgid "ExternalConn: Access denied" +msgstr "外部連接:請求被拒絕" + +#: src/libs/ec/cpp/RemoteConnect.cpp:207 +msgid "ExternalConn: Bad reply from server. Connection closed." +msgstr "外部連接:服務器回複錯誤。已斷開連接。" + +#: src/libs/ec/cpp/RemoteConnect.cpp:211 +msgid "Succeeded! Connection established to aMule " +msgstr "成功!連接成功建立" + +#: src/libs/ec/cpp/RemoteConnect.cpp:214 +msgid "Succeeded! Connection established." +msgstr "已成功連接。" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:39 src/PartFile.cpp:3830 +msgid "Hashing" +msgstr "正在生成檢驗碼" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:43 src/PartFile.cpp:3834 +msgid "Completing" +msgstr "正在完成" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:45 src/PartFile.cpp:3837 +msgid "Complete" +msgstr "完成" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:47 src/PartFile.cpp:3840 +#: src/TransferWnd.cpp:351 src/OtherFunctions.cpp:752 +msgid "Paused" +msgstr "已暫停" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:49 src/PartFile.cpp:3843 +#: src/TransferWnd.cpp:350 src/OtherFunctions.cpp:751 +msgid "Erroneous" +msgstr "已出錯" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:52 src/PartFile.cpp:3850 +#: src/TransferWnd.cpp:349 src/OtherFunctions.cpp:750 +msgid "Downloading" +msgstr "正在下載" + +#: src/libs/ec/cpp/ECSpecialTags.cpp:54 src/PartFile.cpp:3852 +#: src/TransferWnd.cpp:348 src/OtherFunctions.cpp:749 +msgid "Waiting" +msgstr "等待中" + +#: src/ThreadTasks.cpp:131 +#, c-format +msgid "Starting to create MD4 and AICH hash for file: %s" +msgstr "開始爲文件 %s 創建MD4和AICH校驗碼" + +#: src/ThreadTasks.cpp:135 +#, c-format +msgid "Starting to create MD4 hash for file: %s" +msgstr "開始爲文件 %s 創建MD4校驗碼" + +#: src/ThreadTasks.cpp:139 +#, c-format +msgid "Starting to create AICH hash for file: %s" +msgstr "開始爲文件 %s 創建AICH校驗碼" + +#: src/ThreadTasks.cpp:348 +#, c-format +msgid "Converting old AICH hashsets in '%s' to 64b in '%s'." +msgstr "正在轉換在 '%s'在 '%s' 中舊的 AICH 校驗集至64b" + +#: src/ThreadTasks.cpp:429 +#, c-format +msgid "WARNING: The filename '%s' is invalid and has been renamed to '%s'." +msgstr "警告:文件名 '%s' 非法,已經重命名爲 '%s'。" + +#: src/ThreadTasks.cpp:442 +#, c-format +msgid "WARNING: The file '%s' already exists, new file renamed to '%s'." +msgstr "警告:文件 '%s' 已經存在,新文件重命名爲 '%s'。" + +#: src/ThreadTasks.cpp:455 +#, c-format +msgid "WARNING: Could not remove original '%s' after creating backup" +msgstr "警告:爲 '%s' 建立備份後無法刪除原文件" + +#: src/ThreadTasks.cpp:467 +#, c-format +msgid "WARNING: Failed to delete %s" +msgstr "警告:無法刪除 %s" + +#: src/BaseClient.cpp:1258 +#, c-format +msgid "Failed to retrieve shared files from user '%s'" +msgstr "無法獲取用戶 '%s' 的共享文件" + +#: src/BaseClient.cpp:1635 src/BaseClient.cpp:2157 src/BaseClient.cpp:2429 +#: src/HTTPDownload.cpp:86 src/DataToText.cpp:52 src/DataToText.cpp:68 +#: src/DataToText.cpp:78 src/DataToText.cpp:114 src/DataToText.cpp:134 +#: src/ExternalConn.cpp:251 src/Statistics.cpp:697 src/Statistics.cpp:883 +#: src/Server.cpp:160 src/Server.cpp:235 src/DownloadListCtrl.cpp:1408 +#: src/DownloadListCtrl.cpp:1421 src/DownloadListCtrl.cpp:1432 +#: src/PartFile.cpp:2609 src/PartFile.cpp:2615 src/KnownFile.cpp:885 +#: src/KnownFile.cpp:891 src/FileDetailDialog.cpp:130 +#: src/ClientListCtrl.cpp:671 src/ClientListCtrl.cpp:694 +#: src/ClientListCtrl.cpp:702 src/ClientListCtrl.cpp:841 +#: src/ClientDetailDialog.cpp:82 src/ClientDetailDialog.cpp:83 +#: src/ClientDetailDialog.cpp:84 src/ClientDetailDialog.cpp:119 +#: src/ClientDetailDialog.cpp:120 src/MuleTrayIcon.cpp:408 +msgid "Unknown" +msgstr "不明" + +#: src/BaseClient.cpp:1652 +#, c-format +msgid " (Fake eMule version %#x)" +msgstr " (假冒 eMule 版本 %#x)" + +#: src/BaseClient.cpp:1663 +msgid " (Fake eMule)" +msgstr " (假冒 eMule)" + +#: src/BaseClient.cpp:1665 +msgid "xMule (Fake eMule)" +msgstr "xMule (假冒 eMule)" + +#: src/BaseClient.cpp:1704 +#, c-format +msgid "1.x (based on eMule v0.%u)" +msgstr "1.x (基于 eMule v0.%u)" + +#: src/BaseClient.cpp:1874 +#, c-format +msgid "NickName: %s ID: %u" +msgstr "昵稱: %s ID: %u" + +#: src/BaseClient.cpp:1876 +#, fuzzy, c-format +msgid "Requested: %s\n" +msgstr "請求:" + +#: src/BaseClient.cpp:1878 +#, fuzzy, c-format +msgid "Filestats for this session: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for this session: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "本次執行檔案統計: 接受了 %d/%d 個請求,已傳送 %s\n" +msgstr[1] "本次執行檔案統計: 接受了 %d/%d 個請求,已傳送 %s\n" + +#: src/BaseClient.cpp:1881 +#, fuzzy, c-format +msgid "Filestats for all sessions: Accepted %d of %d request, %s transferred\n" +msgid_plural "" +"Filestats for all sessions: Accepted %d of %d requests, %s transferred\n" +msgstr[0] "曆史運行文件統計: 接受了%d個請求(總請求數%d),已傳送 %s\n" +msgstr[1] "曆史運行文件統計: 接受了%d個請求(總請求數%d),已傳送 %s\n" + +#: src/BaseClient.cpp:1884 +msgid "Requested unknown file" +msgstr "請求不名檔案" + +#: src/BaseClient.cpp:2156 +#, c-format +msgid "Client %s on IP:Port %s:%d using %s %s %s" +msgstr "客戶 %s 位于 %s:%d,使用 %s %s %s" + +#: src/FriendListCtrl.cpp:79 src/CommentDialogLst.cpp:55 +#: src/ClientListCtrl.cpp:502 src/ClientListCtrl.cpp:803 +#: src/ClientListCtrl.cpp:971 +msgid "Username" +msgstr "使用者名稱" + +#: src/FriendListCtrl.cpp:226 src/muuli_wdr.cpp:509 src/muuli_wdr.cpp:3374 +msgid "Friends" +msgstr "好友" + +#: src/FriendListCtrl.cpp:230 src/DownloadListCtrl.cpp:1006 +#: src/ClientListCtrl.cpp:251 +msgid "Show &Details" +msgstr "顯示附加訊息 (&D)" + +#: src/FriendListCtrl.cpp:234 +msgid "Add a friend" +msgstr "加入好友" + +#: src/FriendListCtrl.cpp:237 +msgid "Remove Friend" +msgstr "移除好友" + +#: src/FriendListCtrl.cpp:238 +msgid "Send &Message" +msgstr "發訊息 (&M)" + +#: src/FriendListCtrl.cpp:239 src/DownloadListCtrl.cpp:1008 +#: src/ClientListCtrl.cpp:253 +msgid "View Files" +msgstr "顯示檔案" + +# fuzzy +#: src/FriendListCtrl.cpp:240 +msgid "Establish Friend Slot" +msgstr "建立好友條" + +#: src/FriendListCtrl.cpp:273 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friend?" +msgstr "確定刪除選中的好友嗎?" + +#: src/FriendListCtrl.cpp:275 +#, fuzzy +msgid "Are you sure that you wish to delete the selected friends?" +msgstr "確定刪除選中的好友嗎?" + +#: src/FriendListCtrl.cpp:278 src/utils/wxCas/src/wxcasprefs.cpp:298 +#: src/ServerListCtrl.cpp:149 src/ServerListCtrl.cpp:556 +#: src/ServerListCtrl.cpp:575 src/amuleDlg.cpp:717 +#: src/DownloadListCtrl.cpp:582 src/DownloadListCtrl.cpp:896 +#: src/TransferWnd.cpp:376 src/muuli_wdr.cpp:867 src/muuli_wdr.cpp:937 +#: src/muuli_wdr.cpp:1011 src/muuli_wdr.cpp:1077 src/muuli_wdr.cpp:2796 +#: src/muuli_wdr.cpp:2898 src/muuli_wdr.cpp:3771 +msgid "Cancel" +msgstr "取消" + +#: src/FriendListCtrl.cpp:359 +msgid "" +"You are not allowed to set more than one friendslot.\n" +" Only one slot was assigned." +msgstr "" +"不允許設置超過一個好友空檔。\n" +"只設置了一個空檔" + +#: src/FriendListCtrl.cpp:359 +msgid "Multiple selection" +msgstr "多選" + +#: src/SharedFilesCtrl.cpp:102 src/SearchListCtrl.cpp:87 +#: src/DownloadListCtrl.cpp:189 src/CommentDialogLst.cpp:56 +#: src/FileDetailListCtrl.cpp:43 +msgid "File Name" +msgstr "檔案名稱" + +#: src/SharedFilesCtrl.cpp:103 src/SearchListCtrl.cpp:88 +#: src/DownloadListCtrl.cpp:190 src/PartFileConvert.cpp:630 +msgid "Size" +msgstr "大小" + +#: src/SharedFilesCtrl.cpp:104 src/SearchListCtrl.cpp:90 src/muuli_wdr.cpp:188 +msgid "Type" +msgstr "類型" + +#: src/SharedFilesCtrl.cpp:105 src/SharedFilesCtrl.cpp:140 +#: src/ServerListCtrl.cpp:94 src/ServerListCtrl.cpp:423 +#: src/DownloadListCtrl.cpp:196 src/DownloadListCtrl.cpp:895 +msgid "Priority" +msgstr "優先等級" + +#: src/SharedFilesCtrl.cpp:106 src/SearchListCtrl.cpp:91 +msgid "FileID" +msgstr "檔案編號" + +#: src/SharedFilesCtrl.cpp:107 +msgid "Requests" +msgstr "請求" + +#: src/SharedFilesCtrl.cpp:108 +msgid "Accepted Requests" +msgstr "接受的請求" + +#: src/SharedFilesCtrl.cpp:109 +msgid "Transferred Data" +msgstr "已傳送資料" + +#: src/SharedFilesCtrl.cpp:110 +msgid "Share Ratio" +msgstr "共享比例" + +#: src/SharedFilesCtrl.cpp:111 src/ClientListCtrl.cpp:510 +#: src/ClientListCtrl.cpp:813 +msgid "Obtained Parts" +msgstr "已下載資料段" + +#: src/SharedFilesCtrl.cpp:112 +msgid "Complete Sources" +msgstr "完整源" + +#: src/SharedFilesCtrl.cpp:113 +msgid "Directory Path" +msgstr "所在目錄" + +#: src/SharedFilesCtrl.cpp:130 src/amuleDlg.cpp:1291 src/Statistics.cpp:721 +#: src/muuli_wdr.cpp:1102 src/muuli_wdr.cpp:3999 +msgid "Shared Files" +msgstr "分享的檔案" + +#: src/SharedFilesCtrl.cpp:132 src/DataToText.cpp:41 +msgid "Very low" +msgstr "極低" + +#: src/SharedFilesCtrl.cpp:133 src/DataToText.cpp:42 +#: src/ServerListCtrl.cpp:230 src/ServerListCtrl.cpp:419 +#: src/DownloadListCtrl.cpp:890 src/muuli_wdr.cpp:2860 +msgid "Low" +msgstr "低" + +#: src/SharedFilesCtrl.cpp:134 src/DataToText.cpp:43 +#: src/ServerListCtrl.cpp:231 src/ServerListCtrl.cpp:420 +#: src/DownloadListCtrl.cpp:891 src/muuli_wdr.cpp:2861 +msgid "Normal" +msgstr "普通" + +#: src/SharedFilesCtrl.cpp:135 src/DataToText.cpp:44 +#: src/ServerListCtrl.cpp:232 src/ServerListCtrl.cpp:421 +#: src/DownloadListCtrl.cpp:892 src/muuli_wdr.cpp:2862 +msgid "High" +msgstr "高" + +#: src/SharedFilesCtrl.cpp:136 src/DataToText.cpp:45 +msgid "Very High" +msgstr "極高" + +#: src/SharedFilesCtrl.cpp:137 src/DataToText.cpp:46 +msgid "Release" +msgstr "發行" + +#: src/SharedFilesCtrl.cpp:138 src/DownloadListCtrl.cpp:893 +#: src/muuli_wdr.cpp:2863 +msgid "Auto" +msgstr "自動" + +#: src/SharedFilesCtrl.cpp:145 +msgid "Add Comment/Rating" +msgstr "添加注釋/率" + +#: src/SharedFilesCtrl.cpp:147 +msgid "Edit Comment/Rating" +msgstr "編輯注釋/率" + +#: src/SharedFilesCtrl.cpp:151 +msgid "Rename" +msgstr "更名" + +#: src/SharedFilesCtrl.cpp:158 +msgid "Add files in collection to transfer list" +msgstr "添加收藏中的文件至傳輸列表" + +#: src/SharedFilesCtrl.cpp:161 +msgid "Copy magnet &URI to clipboard" +msgstr "複制 magnet 地址到剪貼板(&U)" + +#: src/SharedFilesCtrl.cpp:162 src/DownloadListCtrl.cpp:937 +msgid "Copy ED2k &link to clipboard" +msgstr "拷貝 ED2k 連線到剪貼簿 (&l)" + +#: src/SharedFilesCtrl.cpp:163 +msgid "Copy ED2k link to clipboard (&Source)" +msgstr "拷貝 ED2K 連結到剪貼簿 (源)" + +#: src/SharedFilesCtrl.cpp:164 +msgid "Copy ED2k link to clipboard (Source) (&With Crypt options)" +msgstr "複制 ED2K 鏈接到剪貼板 (源) (使用加密選項(&W))" + +#: src/SharedFilesCtrl.cpp:165 +msgid "Copy ED2k link to clipboard (&Hostname)" +msgstr "複制 ED2K 鏈接到剪貼板(主機名(&H))" + +#: src/SharedFilesCtrl.cpp:166 +msgid "Copy ED2k link to clipboard (Hostname) (With &Crypt options)" +msgstr "複制 ED2K 鏈接到剪貼板(主機名) (使用加密選項(&C))" + +#: src/SharedFilesCtrl.cpp:167 +msgid "Copy ED2k link to clipboard (&AICH info)" +msgstr "複制 ED2K 鏈接到剪貼板(&AICH 信息)" + +#: src/SharedFilesCtrl.cpp:168 src/DownloadListCtrl.cpp:939 +msgid "Copy feedback to clipboard" +msgstr "拷貝反饋信息到剪貼板" + +#: src/SharedFilesCtrl.cpp:306 +msgid "You need a HighID to create a valid sourcelink" +msgstr "你需要高ID來產生源連結" + +#: src/SharedFilesCtrl.cpp:306 src/KadDlg.cpp:166 src/KadDlg.cpp:172 +#: src/amule.cpp:664 +msgid "Warning" +msgstr "警告" + +#: src/SharedFilesCtrl.cpp:451 +#, c-format +msgid "Shared Files (%i)" +msgstr "分享的檔案 (%i)" + +#: src/SharedFilesCtrl.cpp:609 +msgid "[PartFile]" +msgstr "[PartFile]" + +#: src/SharedFilesCtrl.cpp:689 src/DownloadListCtrl.cpp:1065 +msgid "Enter new name for this file:" +msgstr "請輸入新文件名" + +#: src/SharedFilesCtrl.cpp:690 src/DownloadListCtrl.cpp:1066 +msgid "File rename" +msgstr "更改文件名" + +#: src/UploadQueue.cpp:512 +#, c-format +msgid "Resuming uploads of file: %s" +msgstr "繼續上傳此文件:%s" + +#: src/UploadQueue.cpp:521 +#, c-format +msgid "Suspending upload of file: %s" +msgstr "暫停上傳此文件:%s" + +#: src/kademlia/kademlia/SearchManager.cpp:134 +msgid "Kademlia: search keyword too short" +msgstr "Kad:搜索關鍵詞太短" + +#: src/ListenSocket.cpp:68 +msgid "Error: Could not listen to TCP port." +msgstr "錯誤:無法監聽TCP端口。" + +#: src/webserver/src/WebServer.cpp:327 +#, c-format +msgid "Request failed with the following error: %s." +msgstr "請求失敗,錯誤爲:%s" + +#: src/webserver/src/WebServer.cpp:330 src/TextClient.cpp:623 +msgid "Request failed with an unknown error." +msgstr "請求失敗,錯誤未知。" + +#: src/webserver/src/WebServer.cpp:1691 +msgid "Index file not found: " +msgstr "索引文件未找到:" + +#: src/webserver/src/WebServer.cpp:1711 +msgid "Can't create web socket thread\n" +msgstr "無法創建 Web 端口進程\n" + +#: src/webserver/src/WebServer.cpp:1716 +msgid "Web Server: Started\n" +msgstr "Web 服務器:已啓動\n" + +#: src/webserver/src/WebServer.cpp:1794 +msgid "Session expired - requesting login\n" +msgstr "會話過期 - 正在請求登錄\n" + +#: src/webserver/src/WebServer.cpp:1799 +msgid "Session ok, logged in\n" +msgstr "會話正常,已登錄\n" + +#: src/webserver/src/WebServer.cpp:1801 +msgid "Session ok, not logged in\n" +msgstr "會話正常,未登錄\n" + +#: src/webserver/src/WebServer.cpp:1806 +msgid "No session opened - will request login\n" +msgstr "沒有會話已打開 - 將請求登錄\n" + +#: src/webserver/src/WebServer.cpp:1815 +msgid "Session created - requesting login\n" +msgstr "會話已創建 - 正在請求登錄\n" + +#: src/webserver/src/WebServer.cpp:1832 +msgid "Processing request [original]: " +msgstr "正在處理請求 [原始]:" + +#: src/webserver/src/WebServer.cpp:1848 +msgid "Checking password\n" +msgstr "檢查密碼\n" + +#: src/webserver/src/WebServer.cpp:1853 +msgid "Password hash invalid\n" +msgstr "密碼校驗值錯誤\n" + +#: src/webserver/src/WebServer.cpp:1868 +msgid "Password ok\n" +msgstr "密碼正確\n" + +#: src/webserver/src/WebServer.cpp:1870 +msgid "Password bad\n" +msgstr "密碼錯誤\n" + +#: src/webserver/src/WebServer.cpp:1873 +msgid "You did not enter any password. Blank password is not allowed.\n" +msgstr "您沒有輸入密碼,不允許空密碼。\n" + +#: src/webserver/src/WebServer.cpp:1881 +msgid "Logout requested\n" +msgstr "已請求注銷\n" + +#: src/webserver/src/WebServer.cpp:1886 +msgid "Processing request [redirected]: " +msgstr "正在處理請求 [已重定向]:" + +#: src/webserver/src/WebInterface.cpp:182 +msgid "Loads template " +msgstr "載入模板 " + +#: src/webserver/src/WebInterface.cpp:186 +msgid "Webserver HTTP port" +msgstr "Web 服務器端口" + +#: src/webserver/src/WebInterface.cpp:190 +msgid "Use UPnP port forwarding on webserver port" +msgstr "在 Web 服務器端口使用 UPnP端口轉發" + +#: src/webserver/src/WebInterface.cpp:194 +msgid "UPnP port" +msgstr "UPnP 端口" + +#: src/webserver/src/WebInterface.cpp:198 +msgid "Use gzip compression" +msgstr "使用 gzip 壓縮" + +#: src/webserver/src/WebInterface.cpp:206 +msgid "Full access password for webserver" +msgstr "Web 服務器最高訪問權密碼" + +#: src/webserver/src/WebInterface.cpp:210 +msgid "Guest password for webserver" +msgstr "服務器訪客密碼" + +#: src/webserver/src/WebInterface.cpp:214 +msgid "Allow guest access" +msgstr "允許訪客訪問" + +#: src/webserver/src/WebInterface.cpp:218 +msgid "Deny guest access" +msgstr "拒絕訪客訪問" + +#: src/webserver/src/WebInterface.cpp:222 +msgid "Load/save webserver settings from/to remote aMule" +msgstr "載入/保存 Web 服務器設置 自/至 遠程 aMule" + +#: src/webserver/src/WebInterface.cpp:226 +msgid "aMule config file path. DO NOT USE DIRECTLY!" +msgstr "aMule 設置文件路徑。不要直接使用!" + +#: src/webserver/src/WebInterface.cpp:234 +msgid "Disable PHP interpreter (deprecated)" +msgstr "禁用 PHP 解釋器(已廢棄)" + +#: src/webserver/src/WebInterface.cpp:242 +msgid "Recompile PHP pages on each request" +msgstr "爲每個請求重編譯 PHP 頁面" + +#: src/webserver/src/WebInterface.cpp:340 +msgid "aMule Web Server" +msgstr "aMule Web 服務器" + +#: src/StatTree.cpp:548 src/StatTree.cpp:563 +msgid "Not available" +msgstr "不可用" + +#: src/StatTree.cpp:599 src/StatTree.cpp:613 +msgid "Never" +msgstr "從不" + +#: src/HTTPDownload.cpp:60 +msgid "Downloading..." +msgstr "正在下載..." + +#: src/HTTPDownload.cpp:80 +#, c-format +msgid "( %s / %s )" +msgstr "( %s / %s )" + +#: src/utils/wxCas/src/wxcasprefs.cpp:50 src/amuleDlg.cpp:1304 +#: src/PrefsUnifiedDlg.cpp:196 src/muuli_wdr.cpp:4003 +msgid "Preferences" +msgstr "設定" + +#: src/utils/wxCas/src/wxcasprefs.cpp:60 +msgid "Directory containing amulesig.dat file" +msgstr "amulesig.dat 文件所在的文件夾" + +#: src/utils/wxCas/src/wxcasprefs.cpp:65 +#: src/utils/wxCas/src/wxcasprefs.cpp:142 +#: src/utils/aLinkCreator/src/alcframe.cpp:141 src/muuli_wdr.cpp:1713 +#: src/muuli_wdr.cpp:2176 src/muuli_wdr.cpp:2187 src/muuli_wdr.cpp:2216 +#: src/muuli_wdr.cpp:2362 src/muuli_wdr.cpp:3509 +msgid "Browse" +msgstr "瀏覽" + +#: src/utils/wxCas/src/wxcasprefs.cpp:80 +msgid "Enter here the directory where your amulesig.dat file is" +msgstr "請輸入 amulesig.dat 文件所在的文件夾" + +#: src/utils/wxCas/src/wxcasprefs.cpp:99 +msgid "Refresh rate interval in seconds" +msgstr "刷新周期 (秒)" + +#: src/utils/wxCas/src/wxcasprefs.cpp:115 +msgid "Generate a stat image at every refresh event" +msgstr "每次刷新都生成統計圖" + +#: src/utils/wxCas/src/wxcasprefs.cpp:139 +msgid "Enter here the directory where you want to generate the statistic image" +msgstr "輸入存放所産生的統計圖的文件夾" + +#: src/utils/wxCas/src/wxcasprefs.cpp:166 +msgid "Upload periodicaly your stat image to FTP server" +msgstr "周期性上傳統計圖到FTP服務器" + +#: src/utils/wxCas/src/wxcasprefs.cpp:174 +msgid "FTP Url" +msgstr "FTP 地址" + +#: src/utils/wxCas/src/wxcasprefs.cpp:178 +msgid "FTP Path" +msgstr "FTP 路徑" + +#: src/utils/wxCas/src/wxcasprefs.cpp:188 +msgid "Enter here the URL of your FTP server" +msgstr "輸入 FTP 服務器的地址" + +#: src/utils/wxCas/src/wxcasprefs.cpp:200 +msgid "Enter here the directory where putting your stat image on FTP server" +msgstr "輸入FTP服務器上存放統計圖的文件夾" + +#: src/utils/wxCas/src/wxcasprefs.cpp:206 +msgid "User" +msgstr "用戶名" + +#: src/utils/wxCas/src/wxcasprefs.cpp:210 src/muuli_wdr.cpp:2723 +#: src/muuli_wdr.cpp:3743 +msgid "Password" +msgstr "密碼" + +#: src/utils/wxCas/src/wxcasprefs.cpp:221 +msgid "Enter here the User name to log into your FTP server" +msgstr "輸入登錄FTP服務器的用戶名" + +#: src/utils/wxCas/src/wxcasprefs.cpp:233 +msgid "Enter here the User password to log into your FTP server" +msgstr "輸入登錄FTP服務器的密碼" + +#: src/utils/wxCas/src/wxcasprefs.cpp:252 +msgid "FTP update rate interval in minutes" +msgstr "FTP上傳周期(分鍾)" + +#: src/utils/wxCas/src/wxcasprefs.cpp:296 +msgid "Validate" +msgstr "檢測" + +#: src/utils/wxCas/src/wxcasprefs.cpp:330 +msgid "Folder containing your signature file" +msgstr "簽名文件所在文件夾" + +#: src/utils/wxCas/src/wxcasprefs.cpp:344 +msgid "Folder where generating the statistic image" +msgstr "統計圖存放文件夾" + +#: src/utils/wxCas/src/linuxmon.cpp:86 +#, c-format +msgid "%i day(s) %i hour(s) %i min %i s" +msgstr "%i 天 %i 小時 %i 分鍾 %i 秒" + +#: src/utils/wxCas/src/wxcas.cpp:85 +msgid "wxCas, aMule Online Statistics" +msgstr "wxCas, aMule 在線統計" + +#: src/utils/wxCas/src/wxcasframe.cpp:96 +#: src/utils/aLinkCreator/src/alcframe.cpp:84 +msgid "Welcome!" +msgstr "歡迎!" + +#: src/utils/wxCas/src/wxcasframe.cpp:116 +msgid "aMule" +msgstr "aMule" + +#: src/utils/wxCas/src/wxcasframe.cpp:120 +msgid "Maximum DL rate since wxCas is running" +msgstr "本次運行最高下載速度" + +#: src/utils/wxCas/src/wxcasframe.cpp:124 +msgid "Absolute Maximum DL rate during wxCas previous runs" +msgstr "曆史最高下載速度" + +#: src/utils/wxCas/src/wxcasframe.cpp:138 +#: src/utils/wxCas/src/wxcasframe.cpp:142 src/muuli_wdr.cpp:2958 +#: src/muuli_wdr.cpp:2993 +msgid "Reset" +msgstr "重置" + +#: src/utils/wxCas/src/wxcasframe.cpp:147 +msgid "System" +msgstr "系統" + +#: src/utils/wxCas/src/wxcasframe.cpp:211 +#: src/utils/wxCas/src/wxcasframe.cpp:340 +msgid "Stop Auto Refresh" +msgstr "停止自動刷新" + +#: src/utils/wxCas/src/wxcasframe.cpp:216 +msgid "Save Online Statistics image" +msgstr "保存統計圖表" + +#: src/utils/wxCas/src/wxcasframe.cpp:219 +msgid "Print Online Statistics image" +msgstr "打印統計圖表" + +#: src/utils/wxCas/src/wxcasframe.cpp:222 +msgid "Preferences setting" +msgstr "設置" + +#: src/utils/wxCas/src/wxcasframe.cpp:227 +#: src/utils/wxCas/src/wxcasframe.cpp:406 +msgid "About wxCas" +msgstr "關于 wxCas" + +#: src/utils/wxCas/src/wxcasframe.cpp:331 +msgid "Start Auto Refresh" +msgstr "開始自動刷新" + +#: src/utils/wxCas/src/wxcasframe.cpp:333 +msgid "Auto Refresh stopped" +msgstr "自動刷新已停止" + +#: src/utils/wxCas/src/wxcasframe.cpp:342 +msgid "Auto Refresh started" +msgstr "自動刷新已開始" + +#: src/utils/wxCas/src/wxcasframe.cpp:353 +msgid "Save Statistics Image" +msgstr "保存統計圖表" + +#: src/utils/wxCas/src/wxcasframe.cpp:367 +msgid "No handler for this file type." +msgstr "無法處理該文件類型" + +#: src/utils/wxCas/src/wxcasframe.cpp:368 +msgid "File was not saved" +msgstr "文件未被保存" + +#: src/utils/wxCas/src/wxcasframe.cpp:379 +msgid "aMule Online Statistics" +msgstr "aMule線上統計" + +#: src/utils/wxCas/src/wxcasframe.cpp:383 +msgid "" +"There was a problem printing.\n" +"Perhaps your current printer is not set correctly?" +msgstr "" +"打印時出現問題。\n" +"可能當前打印機沒有設置正確?" + +#: src/utils/wxCas/src/wxcasframe.cpp:384 +msgid "Printing" +msgstr "打印中" + +#: src/utils/wxCas/src/wxcasframe.cpp:402 +msgid "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"Distributed under GPL" +msgstr "" +"wxCas, aMule OnLine Signature Statistics\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Based on CAS by Pedro de Oliveira \n" +"\n" +"基于 GPL 協議分發" + +#: src/utils/wxCas/src/wxcasframe.cpp:573 +msgid "Oh Oh, aMule is not running..." +msgstr "aMule 沒有運行" + +#: src/utils/wxCas/src/wxcasframe.cpp:649 +#: src/utils/wxCas/src/wxcasframe.cpp:719 +#: src/utils/wxCas/src/wxcasframe.cpp:788 +msgid "aMule is running" +msgstr "aMule 正在運行" + +#: src/utils/wxCas/src/wxcasframe.cpp:858 +msgid "aMule is running, but disconnected" +msgstr "aMule 正在運行,但是已斷開連接" + +#: src/utils/wxCas/src/wxcasframe.cpp:929 +msgid "aMule is connecting..." +msgstr "aMule 正在連接..." + +#: src/utils/wxCas/src/wxcasframe.cpp:933 +msgid "Oh Oh, aMule status is unknown..." +msgstr "aMule狀態不明..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1004 +#: src/utils/wxCas/src/wxcasframe.cpp:1009 +#: src/utils/wxCas/src/wxcasframe.cpp:1013 +#: src/utils/wxCas/src/wxcasframe.cpp:1017 +#: src/utils/wxCas/src/wxcasframe.cpp:1021 +msgid "aMule " +msgstr "aMule " + +#: src/utils/wxCas/src/wxcasframe.cpp:1006 +msgid " has been running for " +msgstr " 已經運行 " + +#: src/utils/wxCas/src/wxcasframe.cpp:1011 +msgid " is stopped !" +msgstr "已停止!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1015 +#: src/utils/wxCas/src/wxcasframe.cpp:1039 +msgid " is not connected !" +msgstr "未連接!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1019 +msgid " is connecting..." +msgstr " 正在連接..." + +#: src/utils/wxCas/src/wxcasframe.cpp:1023 +msgid " is doing something strange, check it !" +msgstr " 狀態不正常,請檢查!" + +#: src/utils/wxCas/src/wxcasframe.cpp:1044 +msgid " is connected to " +msgstr "已連接至" + +#: src/utils/wxCas/src/wxcasframe.cpp:1045 +#: src/utils/wxCas/src/wxcasframe.cpp:1067 +msgid " Kad: " +msgstr "Kad:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1047 +#: src/utils/wxCas/src/wxcasframe.cpp:1069 src/TextClient.cpp:708 +msgid "ok" +msgstr "確定" + +#: src/utils/wxCas/src/wxcasframe.cpp:1049 +#: src/utils/wxCas/src/wxcasframe.cpp:1071 src/TextClient.cpp:706 +msgid "firewalled" +msgstr "被防火牆阻擋" + +#: src/utils/wxCas/src/wxcasframe.cpp:1051 +#: src/utils/wxCas/src/wxcasframe.cpp:1073 +msgid "off" +msgstr "關閉" + +#: src/utils/wxCas/src/wxcasframe.cpp:1057 +msgid " is on " +msgstr " 是在 " + +#: src/utils/wxCas/src/wxcasframe.cpp:1064 +#, fuzzy +msgid " with " +msgstr "] 和 " + +#: src/utils/wxCas/src/wxcasframe.cpp:1082 +msgid "Total Download: " +msgstr "總下載: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1084 +#: src/utils/wxCas/src/wxcasframe.cpp:1095 +msgid ", Upload: " +msgstr ", 上傳: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1093 +msgid "Session Download: " +msgstr "本次運行下載:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1104 +msgid "Download: " +msgstr "下載" + +#: src/utils/wxCas/src/wxcasframe.cpp:1106 +msgid " kB/s, Upload: " +msgstr " kB/s, 上傳:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1108 +#, fuzzy +msgid " kB/s" +msgstr "kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1116 +msgid "Sharing: " +msgstr "共享: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1118 +msgid " file(s), Clients on queue: " +msgstr " 文件,隊列長度: " + +#: src/utils/wxCas/src/wxcasframe.cpp:1128 +msgid "Time: " +msgstr "時間:" + +#: src/utils/wxCas/src/wxcasframe.cpp:1137 +#: src/utils/wxCas/src/wxcasframe.cpp:1147 src/FileDetailDialog.cpp:116 +#, c-format +msgid "%.2f kB/s" +msgstr "%.2f kB/s" + +#: src/utils/wxCas/src/wxcasframe.cpp:1138 +#: src/utils/wxCas/src/wxcasframe.cpp:1148 +msgid " on " +msgstr " 在 " + +#: src/utils/wxCas/src/wxcasframe.cpp:1158 +msgid "System Load Average (1-5-15 min): " +msgstr "系統平均負載 (1-5-15 分鍾):" + +#: src/utils/wxCas/src/wxcasframe.cpp:1169 +msgid "System uptime: " +msgstr "系統運行時間:" + +#: src/utils/wxCas/src/onlinesig.cpp:234 +#, c-format +msgid "%02uD %02uh %02umin %02us" +msgstr "%02u天 %02u小時 %02u分鍾 %02u秒" + +#: src/utils/wxCas/src/onlinesig.cpp:236 +#, c-format +msgid "%02uh %02umin %02us" +msgstr "%02u小時 %02u分鍾 %02u秒" + +#: src/utils/wxCas/src/onlinesig.cpp:238 +#, c-format +msgid "%02umin %02us" +msgstr "%02u分鍾 %02u秒" + +#: src/utils/wxCas/src/onlinesig.cpp:240 +#, c-format +msgid "%02us" +msgstr "%02u秒" + +#: src/utils/wxCas/src/onlinesig.cpp:267 src/ServerWnd.cpp:184 +#: src/ClientDetailDialog.cpp:103 +msgid "HighID" +msgstr "高ID" + +#: src/utils/wxCas/src/onlinesig.cpp:269 src/ServerWnd.cpp:171 +#: src/ServerWnd.cpp:181 src/ClientListCtrl.cpp:852 +#: src/ClientDetailDialog.cpp:103 +msgid "LowID" +msgstr "低ID" + +#: src/utils/wxCas/src/onlinesig.cpp:272 src/ServerWnd.cpp:189 +#: src/MuleTrayIcon.cpp:385 src/MuleTrayIcon.cpp:399 src/MuleTrayIcon.cpp:400 +msgid "Not Connected" +msgstr "未連線" + +#: src/utils/wxCas/src/onlinesig.cpp:339 +#, c-format +msgid "%.0f B" +msgstr "%.0f B" + +#: src/utils/wxCas/src/onlinesig.cpp:342 +#, c-format +msgid "%.2f KB" +msgstr "%.2f KB" + +#: src/utils/wxCas/src/onlinesig.cpp:345 +#, c-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: src/utils/wxCas/src/onlinesig.cpp:348 +#, c-format +msgid "%.2f GB" +msgstr "%.2f GB" + +#: src/utils/wxCas/src/onlinesig.cpp:351 +#, c-format +msgid "%.2f TB" +msgstr "%.2f TB" + +#: src/utils/aLinkCreator/src/md4.cpp:359 +#: src/utils/aLinkCreator/src/alcframe.cpp:566 +#: src/utils/aLinkCreator/src/alcframe.cpp:567 +#, fuzzy +msgid "Cancelled !" +msgstr "已取消!" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:82 +#, c-format +msgid "Unable to open %s" +msgstr "無法打開 %s" + +#: src/utils/aLinkCreator/src/ed2khash.cpp:87 +#, c-format +msgid "The file %s is to big for the Donkey: maximum allowed is 4 GB." +msgstr "文件 %s 過大:上限爲4GB。" + +#: src/utils/aLinkCreator/src/alcframe.cpp:104 +msgid "Input parameters" +msgstr "輸入參數" + +#: src/utils/aLinkCreator/src/alcframe.cpp:115 +msgid "File to Hash" +msgstr "需計算校檢碼的文件" + +#: src/utils/aLinkCreator/src/alcframe.cpp:119 +msgid "Add Optional URLs for this file" +msgstr "添加附加URL到該文件" + +#: src/utils/aLinkCreator/src/alcframe.cpp:127 +msgid "Enter here the file you want to compute the Ed2k link" +msgstr "輸入需要産生ED2K鏈接的文件" + +#: src/utils/aLinkCreator/src/alcframe.cpp:133 +msgid "" +"Enter here the URL you want to add to the Ed2k link: Add / at the end to let " +"aLinkCreator append the current file name" +msgstr "在這裏輸入添加到ED2K鏈接的URL。在結尾加'/'以便添加後綴文件名" + +#: src/utils/aLinkCreator/src/alcframe.cpp:144 src/muuli_wdr.cpp:1073 +#: src/muuli_wdr.cpp:3053 +msgid "Add" +msgstr "加入" + +#: src/utils/aLinkCreator/src/alcframe.cpp:149 +msgid "Remove" +msgstr "刪除" + +#: src/utils/aLinkCreator/src/alcframe.cpp:151 src/MuleTextCtrl.cpp:82 +#: src/muuli_wdr.cpp:382 src/muuli_wdr.cpp:899 +msgid "Clear" +msgstr "清除" + +#: src/utils/aLinkCreator/src/alcframe.cpp:160 +msgid "Create link with part-hashes" +msgstr "産生有部分校檢碼的鏈接" + +#: src/utils/aLinkCreator/src/alcframe.cpp:166 +msgid "" +"Help to spread new and rare files faster, at the cost of an increased link " +"size" +msgstr "該選項可以幫助新文件和希有文件更快散播,只是鏈接長度會增加" + +#: src/utils/aLinkCreator/src/alcframe.cpp:192 +msgid "MD4 File Hash" +msgstr "MD4 文件校檢碼" + +#: src/utils/aLinkCreator/src/alcframe.cpp:204 +msgid "Ed2k File Hash" +msgstr "ED2K 文件校檢碼" + +#: src/utils/aLinkCreator/src/alcframe.cpp:215 +msgid "Ed2k link" +msgstr "ED2k 鏈接" + +#: src/utils/aLinkCreator/src/alcframe.cpp:228 src/muuli_wdr.cpp:346 +msgid "Start" +msgstr "開始" + +#: src/utils/aLinkCreator/src/alcframe.cpp:230 +msgid "Save" +msgstr "保存" + +#: src/utils/aLinkCreator/src/alcframe.cpp:232 +msgid "Copy to clipboard" +msgstr "拷貝到剪貼板" + +#: src/utils/aLinkCreator/src/alcframe.cpp:234 src/MuleTrayIcon.cpp:560 +msgid "Exit" +msgstr "離開" + +#: src/utils/aLinkCreator/src/alcframe.cpp:260 +msgid "Open a file to compute its ed2k link" +msgstr "打開文件以計算它的ED2K鏈接" + +#: src/utils/aLinkCreator/src/alcframe.cpp:263 +msgid "Copy computed ed2k link to clipboard" +msgstr "拷貝ED2K鏈接到剪貼板" + +#: src/utils/aLinkCreator/src/alcframe.cpp:266 +msgid "Save computed ed2k link to file" +msgstr "保存ED2K鏈接到文件" + +#: src/utils/aLinkCreator/src/alcframe.cpp:271 +#: src/utils/aLinkCreator/src/alcframe.cpp:467 +msgid "About aLinkCreator" +msgstr "關于 aLinkCreator" + +#: src/utils/aLinkCreator/src/alcframe.cpp:364 +msgid "Select the file you want to compute the ed2k link" +msgstr "選擇要産生ED2K鏈接的文件" + +#: src/utils/aLinkCreator/src/alcframe.cpp:407 +msgid "Nothing to copy for now !" +msgstr "暫時沒有東西可拷貝!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:434 +msgid "Select the file to your computed ed2k link" +msgstr "請選擇要計算ED2K鏈接的文件" + +#: src/utils/aLinkCreator/src/alcframe.cpp:445 +msgid "Unable to open " +msgstr "無法讀取 " + +#: src/utils/aLinkCreator/src/alcframe.cpp:452 +#: src/utils/aLinkCreator/src/alcframe.cpp:581 +msgid "Please, enter a non empty file name" +msgstr "請輸入一個非空的文件名" + +#: src/utils/aLinkCreator/src/alcframe.cpp:457 +msgid "Nothing to save for now !" +msgstr "暫時沒有東西可保存!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:466 +msgid "" +"aLinkCreator, the aMule ed2k link creator\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"Distributed under GPL" +msgstr "" +"aLinkCreator, 用于創建 ed2k 鏈接\n" +"\n" +"(c) 2004 ThePolish \n" +"\n" +"Pixmaps from http://www.everaldo.com and http://www.icomania.com\n" +"and http://jimmac.musichall.cz/ikony.php3\n" +"\n" +"基于 GPL 協議發布" + +#: src/utils/aLinkCreator/src/alcframe.cpp:511 +#: src/utils/aLinkCreator/src/alcframe.cpp:512 +#: src/utils/aLinkCreator/src/alcframe.cpp:518 +msgid "Hashing..." +msgstr "正在生成校檢碼" + +#: src/utils/aLinkCreator/src/alcframe.cpp:575 +#, c-format +msgid "Done in %.2f s" +msgstr "在 %.2f 秒內完成" + +#: src/utils/aLinkCreator/src/alcframe.cpp:614 +msgid "You have already added this URL !" +msgstr "您已添加了鏈接!" + +#: src/utils/aLinkCreator/src/alcframe.cpp:619 +msgid "Please, enter a non empty URL" +msgstr "請輸入一個非空的鏈接" + +#: src/utils/aLinkCreator/src/alcc.cpp:66 +#, c-format +msgid "Processing file number %u: %s" +msgstr "正在處理文件號 %u: %s" + +#: src/utils/aLinkCreator/src/alcc.cpp:70 +msgid "You have asked for part hashes (Only used for files > 9.5 MB)" +msgstr "您要求了數據段校檢碼(只用于大于9.5MB的文件)" + +#: src/utils/aLinkCreator/src/alcc.cpp:74 +msgid "Please wait... " +msgstr "請等待 ..." + +#: src/utils/aLinkCreator/src/alcc.cpp:84 +#, c-format +msgid "%s ---> Non existant file !\n" +msgstr "%s ---> 文件不存在!\n" + +#: src/utils/aLinkCreator/src/alc.cpp:55 +msgid "aLinkCreator, the aMule ed2k link creator" +msgstr "aLinkCreator, aMule ED2K 鏈接生成器" + +#: src/DataToText.cpp:35 +msgid "Auto [Lo]" +msgstr "自動 [低]" + +#: src/DataToText.cpp:36 +msgid "Auto [No]" +msgstr "自動 [普]" + +#: src/DataToText.cpp:37 +msgid "Auto [Hi]" +msgstr "自動 [高]" + +#: src/DataToText.cpp:59 src/amuleDlg.cpp:516 src/ClientListCtrl.cpp:650 +#: src/amule.cpp:782 +msgid "Connecting" +msgstr "正在連線" + +#: src/DataToText.cpp:60 +msgid "Asking" +msgstr "正在詢問" + +#: src/DataToText.cpp:61 src/ClientListCtrl.cpp:654 +msgid "Connecting via server" +msgstr "通過伺服器連線中" + +#: src/DataToText.cpp:62 src/DownloadListCtrl.cpp:1678 +#: src/ClientListCtrl.cpp:689 +msgid "Queue Full" +msgstr "等候已滿" + +#: src/DataToText.cpp:62 src/TransferWnd.cpp:449 src/ClientListCtrl.cpp:667 +msgid "On Queue" +msgstr "在等候" + +#: src/DataToText.cpp:63 src/ClientListCtrl.cpp:659 +msgid "Transferring" +msgstr "下載中" + +#: src/DataToText.cpp:64 +msgid "Receiving hashset" +msgstr "正在接收檢驗碼" + +#: src/DataToText.cpp:65 +msgid "No needed parts" +msgstr "沒有需要的部分" + +#: src/DataToText.cpp:66 +msgid "Cannot connect LowID to LowID" +msgstr "無法連線兩個低ID使用者" + +#: src/DataToText.cpp:67 +msgid "Too many connections" +msgstr "連線過多" + +#: src/DataToText.cpp:69 +msgid "Connecting via Kad" +msgstr "正在用 Kad 連接" + +#: src/DataToText.cpp:70 +msgid "Too many Kad connections" +msgstr "Kad 連接過多" + +#: src/DataToText.cpp:71 src/Statistics.cpp:704 src/TransferWnd.cpp:309 +#: src/ClientListCtrl.cpp:812 +msgid "Banned" +msgstr "封殺" + +#: src/DataToText.cpp:72 +msgid "Connection Error" +msgstr "連接錯誤" + +#: src/DataToText.cpp:73 +msgid "Remote Queue Full" +msgstr "遠程隊列已滿" + +#: src/DataToText.cpp:103 +msgid "Old MLDonkey" +msgstr "舊版 MLDonkey" + +#: src/DataToText.cpp:106 +msgid "New MLDonkey" +msgstr "新版 MLDonkey" + +#: src/DataToText.cpp:116 +msgid "eMule Compatible" +msgstr "eMule 兼容程序" + +#: src/DataToText.cpp:126 +msgid "Local Server" +msgstr "本地服務器" + +#: src/DataToText.cpp:127 +msgid "Remote Server" +msgstr "遠程服務器" + +#: src/DataToText.cpp:128 src/TextClient.cpp:701 src/muuli_wdr.cpp:195 +#: src/muuli_wdr.cpp:3937 src/SearchDlg.cpp:108 +msgid "Kad" +msgstr "Kad" + +#: src/DataToText.cpp:129 +msgid "Source Exchange" +msgstr "資源交換" + +#: src/DataToText.cpp:130 +msgid "Passive" +msgstr "被動" + +#: src/DataToText.cpp:131 +msgid "Link" +msgstr "鏈接" + +#: src/DataToText.cpp:132 +msgid "Source Seeds" +msgstr "資源種子" + +#: src/Preferences.cpp:629 src/PrefsUnifiedDlg.cpp:242 +msgid "System default" +msgstr "系統預設" + +#: src/Preferences.cpp:630 +msgid "Arabic" +msgstr "阿拉伯語" + +#: src/Preferences.cpp:631 +msgid "Basque" +msgstr "巴斯克語" + +#: src/Preferences.cpp:632 +msgid "Bulgarian" +msgstr "保加利亞語" + +#: src/Preferences.cpp:633 +msgid "Catalan" +msgstr "加泰羅尼亞語" + +#: src/Preferences.cpp:634 +msgid "Chinese (Simplified)" +msgstr "中文簡體" + +#: src/Preferences.cpp:635 +msgid "Chinese (Traditional)" +msgstr "中文繁體" + +#: src/Preferences.cpp:636 +msgid "Croatian" +msgstr "克羅的亞語" + +#: src/Preferences.cpp:637 +msgid "Czech" +msgstr "" + +#: src/Preferences.cpp:638 +msgid "Danish" +msgstr "丹麥語" + +#: src/Preferences.cpp:639 +msgid "Dutch" +msgstr "荷蘭語" + +#: src/Preferences.cpp:640 +msgid "English (U.K.)" +msgstr "英語 (英國)" + +#: src/Preferences.cpp:643 +msgid "Estonian" +msgstr "愛斯托尼亞語" + +#: src/Preferences.cpp:644 +msgid "Finnish" +msgstr "芬蘭語" + +#: src/Preferences.cpp:645 +msgid "French" +msgstr "法語" + +#: src/Preferences.cpp:646 +msgid "Galician" +msgstr "加利西亞語" + +#: src/Preferences.cpp:647 +msgid "German" +msgstr "德語" + +#: src/Preferences.cpp:648 +msgid "Greek" +msgstr "希臘語" + +#: src/Preferences.cpp:649 +msgid "Hungarian" +msgstr "匈牙利語" + +#: src/Preferences.cpp:650 +msgid "Italian" +msgstr "意大利語" + +#: src/Preferences.cpp:651 +msgid "Italian (Swiss)" +msgstr "意大利語 (瑞士)" + +#: src/Preferences.cpp:652 +msgid "Japanese" +msgstr "日語" + +#: src/Preferences.cpp:653 +msgid "Korean" +msgstr "韓語" + +#: src/Preferences.cpp:654 +msgid "Lithuanian" +msgstr "立托尼亞語" + +#: src/Preferences.cpp:655 +msgid "Norwegian (Nynorsk)" +msgstr "新挪威語" + +#: src/Preferences.cpp:656 +msgid "Polish" +msgstr "芬蘭語" + +#: src/Preferences.cpp:657 +msgid "Portuguese" +msgstr "葡萄牙語" + +#: src/Preferences.cpp:658 +msgid "Portuguese (Brazilian)" +msgstr "葡萄牙語 (巴西)" + +#: src/Preferences.cpp:659 +msgid "Russian" +msgstr "俄語" + +#: src/Preferences.cpp:660 +msgid "Slovenian" +msgstr "斯洛文尼亞語" + +#: src/Preferences.cpp:661 +msgid "Spanish" +msgstr "西班牙語" + +#: src/Preferences.cpp:662 +msgid "Swedish" +msgstr "瑞典語" + +#: src/Preferences.cpp:665 +msgid "Turkish" +msgstr "土耳其語" + +#: src/Preferences.cpp:1616 src/Preferences.cpp:1630 src/Preferences.cpp:1637 +msgid "Unable to determine selected browser!" +msgstr "未檢測到所選擇的浏覽器" + +#: src/Preferences.cpp:1668 +msgid "" +"TCP port can't be higher than 65532 due to server UDP socket being TCP+3" +msgstr "TCP端口不可高于65532,因爲服務器UDP端口值爲TCP端口值+3" + +#: src/Preferences.cpp:1669 +#, c-format +msgid "Default port will be used (%d)" +msgstr "缺省端口將被使用(%d)" + +#: src/ServerListCtrl.cpp:87 +msgid "Server Name" +msgstr "伺服器名稱" + +#: src/ServerListCtrl.cpp:88 +msgid "Address" +msgstr "地址" + +#: src/ServerListCtrl.cpp:89 +msgid "Port" +msgstr "連接埠" + +#: src/ServerListCtrl.cpp:90 +msgid "Description" +msgstr "描述" + +#: src/ServerListCtrl.cpp:91 +msgid "Ping" +msgstr "Ping" + +#: src/ServerListCtrl.cpp:92 +msgid "Users" +msgstr "使用者數" + +#: src/ServerListCtrl.cpp:93 src/PrefsUnifiedDlg.cpp:179 +#: src/muuli_wdr.cpp:2071 +msgid "Files" +msgstr "檔案" + +#: src/ServerListCtrl.cpp:95 src/ClientDetailDialog.cpp:171 +msgid "Failed" +msgstr "失敗次數" + +#: src/ServerListCtrl.cpp:96 +msgid "Static" +msgstr "靜態" + +# +#: src/ServerListCtrl.cpp:97 src/Statistics.cpp:870 +msgid "Version" +msgstr "版本" + +#: src/ServerListCtrl.cpp:144 +msgid "" +"You are connected to a server you are trying to delete. Please disconnect " +"first. The server was NOT deleted." +msgstr "現在正連接在要刪除的服務器。該服務器暫時無法刪除。請先斷開連接。" + +#: src/ServerListCtrl.cpp:144 src/muuli_wdr.cpp:3122 src/CatDialog.cpp:142 +#: src/CatDialog.cpp:152 src/CatDialog.cpp:160 src/ServerList.cpp:341 +#: src/amule.cpp:704 src/amule.cpp:1309 +msgid "Info" +msgstr "訊息" + +#: src/ServerListCtrl.cpp:147 +msgid "(Unknown name)" +msgstr "(未知名稱)" + +#: src/ServerListCtrl.cpp:149 +#, c-format +msgid "Are you sure you want to delete the static server %s" +msgstr "您確定要刪除靜態服務器 %s ?" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:881 +#: src/ClientListCtrl.cpp:1024 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "Yes" +msgstr "是" + +#: src/ServerListCtrl.cpp:237 src/ClientListCtrl.cpp:883 +#: src/ClientListCtrl.cpp:1026 src/ClientListCtrl.cpp:1037 +#: src/ClientListCtrl.cpp:1043 +msgid "No" +msgstr "無" + +#: src/ServerListCtrl.cpp:346 +#, c-format +msgid "Failed to open '%s'" +msgstr "無法讀取 '%s'" + +#: src/ServerListCtrl.cpp:369 +#, c-format +msgid "Servers (%i)" +msgstr "伺服器 (%i)" + +#: src/ServerListCtrl.cpp:417 src/PrefsUnifiedDlg.cpp:178 +#: src/ServerWnd.cpp:180 src/ServerSocket.cpp:257 src/ServerSocket.cpp:272 +msgid "Server" +msgstr "伺服器" + +#: src/ServerListCtrl.cpp:422 +msgid "Connect to server" +msgstr "連接到服務器" + +#: src/ServerListCtrl.cpp:428 +#, fuzzy +msgid "Mark server as static" +msgstr "標記服務器爲靜態" + +#: src/ServerListCtrl.cpp:429 +#, fuzzy +msgid "Mark server as non-static" +msgstr "標記服務器爲非靜態" + +#: src/ServerListCtrl.cpp:431 +#, fuzzy +msgid "Mark servers as static" +msgstr "標記服務器爲靜態" + +#: src/ServerListCtrl.cpp:432 +#, fuzzy +msgid "Mark servers as non-static" +msgstr "標記服務器爲非靜態" + +#: src/ServerListCtrl.cpp:438 +msgid "Remove server" +msgstr "移除伺服器" + +#: src/ServerListCtrl.cpp:440 +#, fuzzy +msgid "Remove servers" +msgstr "移除伺服器" + +#: src/ServerListCtrl.cpp:442 +msgid "Remove all servers" +msgstr "移除所有伺服器" + +#: src/ServerListCtrl.cpp:447 src/SearchListCtrl.cpp:577 +msgid "Copy ED2k link to clipboard" +msgstr "拷貝 ED2K 連結到剪貼簿" + +#: src/ServerListCtrl.cpp:449 +#, fuzzy +msgid "Copy ED2k links to clipboard" +msgstr "拷貝 ED2K 連結到剪貼簿" + +#: src/ServerListCtrl.cpp:457 +msgid "Reconnect to server" +msgstr "重新連接到服務器" + +#: src/ServerListCtrl.cpp:554 +msgid "Are you sure that you wish to delete all servers?" +msgstr "您確定要刪除所有服務器嗎?" + +#: src/ServerListCtrl.cpp:570 +#, fuzzy +msgid "Are you sure that you wish to delete the selected server?" +msgstr "您確定要刪除已選的服務器嗎?" + +#: src/ServerListCtrl.cpp:572 +#, fuzzy +msgid "Are you sure that you wish to delete the selected servers?" +msgstr "您確定要刪除已選的服務器嗎?" + +#: src/OScopeCtrl.cpp:288 +#, c-format +msgid "Disabled [%s]" +msgstr "已停用 [%s]" + +#: src/amuleDlg.cpp:219 +#, c-format +msgid "This is aMule %s based on eMule." +msgstr "這是aMule %s (基于 eMule)" + +#: src/amuleDlg.cpp:221 +#, c-format +msgid "Running on %s" +msgstr "運行于 %s" + +#: src/amuleDlg.cpp:223 +msgid "Visit http://www.amule.org to check if a new version is available." +msgstr "請訪問 http://www.amule.org 以下載最新版本" + +#: src/amuleDlg.cpp:246 +msgid "Fatal Error: Failed to create Timer" +msgstr "嚴重錯誤: 無法建立計時器" + +#: src/amuleDlg.cpp:438 +msgid "aMule remote control " +msgstr "aMule 遠程控制" + +#: src/amuleDlg.cpp:444 +msgid "Snapshot:" +msgstr "快照:" + +#: src/amuleDlg.cpp:446 +msgid "" +" 'All-Platform' p2p client based on eMule \n" +"\n" +msgstr " 基於 eMule 的“全平台”P2P 客戶端 \n" + +#: src/amuleDlg.cpp:447 +msgid " Website: http://www.amule.org \n" +msgstr " 網站:http://www.amule.org \n" + +#: src/amuleDlg.cpp:448 +msgid " Forum: http://forum.amule.org \n" +msgstr " 論壇:http://forum.amule.org \n" + +#: src/amuleDlg.cpp:449 +msgid "" +" FAQ: http://wiki.amule.org \n" +"\n" +msgstr "" +" FAQ: http://wiki.amule.org \n" +"\n" + +#: src/amuleDlg.cpp:450 +msgid " Contact: admin@amule.org (administrative issues) \n" +msgstr " 聯繫郵件:admin@amule.org (管理問題) \n" + +#: src/amuleDlg.cpp:451 +msgid "" +" Copyright (C) 2003-2008 aMule Team \n" +"\n" +msgstr " 版權所有 (C) 2003-2008 aMule 團隊 \n" + +#: src/amuleDlg.cpp:452 +msgid " Part of aMule is based on \n" +msgstr " aMule 的一部分是基於 \n" + +#: src/amuleDlg.cpp:453 +msgid "Kademlia: Peer-to-peer routing based on the XOR metric.\n" +msgstr " KAD:基於異或算法的點對點路由。\n" + +#: src/amuleDlg.cpp:454 +msgid " Copyright (C) 2002 Petar Maymounkov\n" +msgstr " 版權所有 (C) 2002 Petar Maymounkov\n" + +#: src/amuleDlg.cpp:455 +msgid " http://kademlia.scs.cs.nyu.edu\n" +msgstr " http://kademlia.scs.cs.nyu.edu\n" + +#: src/amuleDlg.cpp:458 src/PrefsUnifiedDlg.cpp:517 +#: src/PrefsUnifiedDlg.cpp:612 src/PrefsUnifiedDlg.cpp:695 src/KadDlg.cpp:176 +#: src/PartFile.cpp:917 src/PartFile.cpp:925 +msgid "Message" +msgstr "消息" + +#: src/amuleDlg.cpp:545 +msgid "Status text" +msgstr "狀態" + +#: src/amuleDlg.cpp:666 +#, fuzzy +msgid "ED2K: Connecting" +msgstr "正在連線" + +#: src/amuleDlg.cpp:670 +#, fuzzy +msgid "ED2K: Disconnected" +msgstr "連線已斷" + +#: src/amuleDlg.cpp:676 +#, fuzzy +msgid "Kad: Firewalled" +msgstr "有防火牆" + +#: src/amuleDlg.cpp:680 +#, fuzzy +msgid "Kad: Connected" +msgstr "已建立連線" + +#: src/amuleDlg.cpp:685 +#, fuzzy +msgid "Kad: Connecting" +msgstr "正在連線" + +#: src/amuleDlg.cpp:689 +#, fuzzy +msgid "Kad: Off" +msgstr "Kad:" + +#: src/amuleDlg.cpp:718 +#, fuzzy +msgid "Stop the current connection attempts" +msgstr "終止連線嘗試" + +#: src/amuleDlg.cpp:721 src/muuli_wdr.cpp:3060 src/MuleTrayIcon.cpp:539 +msgid "Disconnect" +msgstr "中斷連線" + +#: src/amuleDlg.cpp:722 +#, fuzzy +msgid "Disconnect from the currently connected networks" +msgstr "斷開網絡。" + +#: src/amuleDlg.cpp:725 src/muuli_wdr.cpp:3276 src/muuli_wdr.cpp:3767 +#: src/muuli_wdr.cpp:3993 src/MuleTrayIcon.cpp:542 +msgid "Connect" +msgstr "連線" + +#: src/amuleDlg.cpp:726 +#, fuzzy +msgid "Connect to the currently enabled networks" +msgstr "連接至網絡。" + +#: src/amuleDlg.cpp:769 +#, c-format +msgid "Up: %.1f(%.1f) | Down: %.1f(%.1f)" +msgstr "上傳: %.1f(%.1f) | 下載: %.1f(%.1f)" + +#: src/amuleDlg.cpp:771 +#, c-format +msgid "Up: %.1f | Down: %.1f" +msgstr "上傳: %.1f | 下載: %.1f" + +#: src/amuleDlg.cpp:793 +#, c-format +msgid "aMule (%s | Connected)" +msgstr "aMule (%s | 已連接)" + +#: src/amuleDlg.cpp:795 +#, c-format +msgid "aMule (%s | Disconnected)" +msgstr "aMule (%s | 已斷開)" + +#: src/amuleDlg.cpp:826 +msgid "Do you really want to exit aMule?" +msgstr "您確定要關閉 aMule 嗎?" + +#: src/amuleDlg.cpp:827 +msgid "Exit confirmation" +msgstr "離開確認" + +#: src/amuleDlg.cpp:1113 +msgid "Could not determine the command for running the browser." +msgstr "無法確定執行瀏覽器的指令" + +#: src/amuleDlg.cpp:1173 +#, c-format +msgid "Skin directory '%s' does not exist" +msgstr "皮膚目錄 '%s' 不存在" + +#: src/amuleDlg.cpp:1178 +#, c-format +msgid "Warning: Unable to open skin file '%s' for read" +msgstr "警告:無法打開皮膚文件 '%s'" + +#: src/amuleDlg.cpp:1278 src/muuli_wdr.cpp:1916 src/muuli_wdr.cpp:3995 +msgid "Networks" +msgstr "網絡" + +#: src/amuleDlg.cpp:1280 src/muuli_wdr.cpp:3995 +msgid "Networks Window" +msgstr "網絡窗口" + +#: src/amuleDlg.cpp:1283 src/muuli_wdr.cpp:3997 +msgid "Searches" +msgstr "搜尋" + +#: src/amuleDlg.cpp:1285 src/muuli_wdr.cpp:3997 +msgid "Searches Window" +msgstr "搜尋視窗" + +#: src/amuleDlg.cpp:1287 src/muuli_wdr.cpp:3998 +msgid "Transfers" +msgstr "傳輸檔案" + +#: src/amuleDlg.cpp:1289 src/muuli_wdr.cpp:3998 +msgid "Files Transfers Window" +msgstr "檔案傳送視窗" + +#: src/amuleDlg.cpp:1293 src/muuli_wdr.cpp:3999 +msgid "Shared Files Window" +msgstr "分享的檔案視窗" + +#: src/amuleDlg.cpp:1295 src/muuli_wdr.cpp:527 src/muuli_wdr.cpp:3534 +#: src/muuli_wdr.cpp:4000 +msgid "Messages" +msgstr "訊息" + +#: src/amuleDlg.cpp:1297 src/muuli_wdr.cpp:4000 +msgid "Messages Window" +msgstr "訊息視窗" + +#: src/amuleDlg.cpp:1299 src/PrefsUnifiedDlg.cpp:181 src/Statistics.cpp:637 +#: src/Statistics.cpp:936 src/muuli_wdr.cpp:1116 src/muuli_wdr.cpp:2245 +#: src/muuli_wdr.cpp:4001 +msgid "Statistics" +msgstr "統計" + +#: src/amuleDlg.cpp:1301 src/muuli_wdr.cpp:4001 +msgid "Statistics Graph Window" +msgstr "統計圖像視窗" + +#: src/amuleDlg.cpp:1306 src/muuli_wdr.cpp:4003 +msgid "Preferences Settings Window" +msgstr "設定視窗" + +#: src/amuleDlg.cpp:1308 src/muuli_wdr.cpp:4004 +msgid "Import" +msgstr "導入" + +#: src/amuleDlg.cpp:1310 src/muuli_wdr.cpp:4004 +msgid "The partfile importer tool" +msgstr "part文件導入工具" + +#: src/amuleDlg.cpp:1312 src/muuli_wdr.cpp:4005 +msgid "About" +msgstr "關于" + +#: src/amuleDlg.cpp:1314 src/muuli_wdr.cpp:4005 +msgid "About/Help" +msgstr "關于/幫助" + +#: src/PrefsUnifiedDlg.cpp:172 src/muuli_wdr.cpp:575 src/muuli_wdr.cpp:1386 +#: src/muuli_wdr.cpp:3618 +msgid "General" +msgstr "一般" + +#: src/PrefsUnifiedDlg.cpp:173 src/Statistics.cpp:682 +msgid "Connection" +msgstr "連線" + +#: src/PrefsUnifiedDlg.cpp:174 src/muuli_wdr.cpp:3613 +msgid "Proxy" +msgstr "代理" + +#: src/PrefsUnifiedDlg.cpp:175 +msgid "Message Filter" +msgstr "消息過濾" + +#: src/PrefsUnifiedDlg.cpp:176 +msgid "Remote Controls" +msgstr "遠端控制" + +#: src/PrefsUnifiedDlg.cpp:177 src/muuli_wdr.cpp:3478 +msgid "Online Signature" +msgstr "在線簽名" + +#: src/PrefsUnifiedDlg.cpp:180 src/muuli_wdr.cpp:2165 +msgid "Directories" +msgstr "目錄" + +#: src/PrefsUnifiedDlg.cpp:182 src/muuli_wdr.cpp:3344 +msgid "Security" +msgstr "安全" + +#: src/PrefsUnifiedDlg.cpp:185 +msgid "Gui Tweaks" +msgstr "界面設定" + +#: src/PrefsUnifiedDlg.cpp:186 src/muuli_wdr.cpp:2452 +msgid "Core Tweaks" +msgstr "核心特殊設置" + +#: src/PrefsUnifiedDlg.cpp:187 src/muuli_wdr.cpp:3962 +msgid "Events" +msgstr "事件" + +#: src/PrefsUnifiedDlg.cpp:189 src/muuli_wdr.cpp:3795 +msgid "Debugging" +msgstr "調試" + +#: src/PrefsUnifiedDlg.cpp:243 src/muuli_wdr.cpp:1696 +msgid "User Defined" +msgstr "使用者定義的" + +#: src/PrefsUnifiedDlg.cpp:495 +msgid "" +"aMule must be restarted to enable these changes:\n" +"\n" +msgstr "重啓 aMule 後設置才能生效:\n" + +#: src/PrefsUnifiedDlg.cpp:502 +msgid "- TCP port changed.\n" +msgstr "- TCP 端口已更改。\n" + +#: src/PrefsUnifiedDlg.cpp:507 +msgid "- UDP port changed.\n" +msgstr "- UDP 端口已更改。\n" + +#: src/PrefsUnifiedDlg.cpp:516 +msgid "" +"Your Auto-update servers list is in blank.\n" +"'Auto-update serverlist at startup' will be disabled." +msgstr "" +"自動更新服務器列表空白。\n" +"自動更新服務器已被禁用。" + +#: src/PrefsUnifiedDlg.cpp:523 +msgid "" +"You have enabled external connections but have not specified a password.\n" +"External connections cannot be enabled unless a valid password is specified." +msgstr "" +"您已經啓用了外部連接但還沒有設置密碼。\n" +"外部連接在沒有有效密碼的情況下不能使用。" + +#: src/PrefsUnifiedDlg.cpp:535 +msgid "- Language changed.\n" +msgstr "- 語言已更改。\n" + +#: src/PrefsUnifiedDlg.cpp:540 +msgid "- Temp folder changed.\n" +msgstr "- 臨時文件目錄已更改。\n" + +#: src/PrefsUnifiedDlg.cpp:565 src/muuli_wdr.cpp:112 +msgid "Up: 0.0 | Down: 0.0" +msgstr "上傳: 0.0 | 下載: 0.0" + +#: src/PrefsUnifiedDlg.cpp:607 +msgid "" +"Both ED2K and Kad network are disabled.\n" +"You won't be able to connect until you enable at least one of them." +msgstr "" +"ED2K 和 Kad 網絡都已被禁用,\n" +"你至少必須啓用其中的一項才能連接。" + +#: src/PrefsUnifiedDlg.cpp:611 +msgid "" +"Kad will not start if your UDP port is disabled.\n" +"Enable UDP port or disable Kad." +msgstr "" +"如果你的 UDP 端口被禁用,Kad 將不能啓動。\n" +"啓動 UDP 端口或禁用 Kad。" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "" +"\n" +"You MUST restart aMule now.\n" +"If you do not restart now, don't complain if anything bad happens.\n" +msgstr "" +"\n" +"你必須現在重啓aMule,\n" +"如果現在不重啓的話,出現任何問題可別怪別人。\n" + +#: src/PrefsUnifiedDlg.cpp:616 +msgid "WARNING" +msgstr "警告" + +#: src/PrefsUnifiedDlg.cpp:694 +msgid "" +"Your Auto-update servers list is in blank.\n" +"Please fill in at least one URL to point to a valid server.met file.\n" +"Click on the button \"List\" by this checkbox to enter an URL." +msgstr "" +"自動更新服務器列表空白。\n" +"請輸入至少一個指向有效server.met的URL。\n" +"點擊這個檢驗欄旁邊的\"列表\"按鈕然後輸入URL。" + +#: src/PrefsUnifiedDlg.cpp:835 +msgid "Temporary files" +msgstr "臨時文件" + +#: src/PrefsUnifiedDlg.cpp:840 +msgid "Incoming files" +msgstr "傳入文件" + +#: src/PrefsUnifiedDlg.cpp:845 +msgid "Online Signatures" +msgstr "在線簽名" + +#: src/PrefsUnifiedDlg.cpp:858 +#, c-format +msgid "Choose a folder for %s" +msgstr "爲%s選擇文件夾" + +# fuzzy +#: src/PrefsUnifiedDlg.cpp:874 +msgid "Browse wav" +msgstr "瀏覽 wav 檔案" + +# fuzzy +#: src/PrefsUnifiedDlg.cpp:875 +msgid "File wav (*.wav)|*.wav||" +msgstr "檔案 wav (*.wav)|*.wav||" + +#: src/PrefsUnifiedDlg.cpp:892 +msgid "Browse for videoplayer" +msgstr "瀏覽尋找影片播放器" + +#: src/PrefsUnifiedDlg.cpp:896 +msgid "Select browser" +msgstr "選擇浏覽器" + +#: src/PrefsUnifiedDlg.cpp:902 +#, c-format +msgid "Executable%s" +msgstr "可執行%s" + +#: src/PrefsUnifiedDlg.cpp:923 +msgid "Edit Serverlist" +msgstr "編輯伺服器清單" + +#: src/PrefsUnifiedDlg.cpp:924 +msgid "" +"Add here URL's to download server.met files.\n" +"Only one url on each line." +msgstr "" +"加入下載 server.met 檔案的網址.\n" +"每行只限一個網址." + +#: src/PrefsUnifiedDlg.cpp:980 +#, fuzzy, c-format +msgid "Update delay: %d second" +msgid_plural "Update delay: %d seconds" +msgstr[0] "刷新時間 : %d 秒" +msgstr[1] "刷新時間 : %d 秒" + +#: src/PrefsUnifiedDlg.cpp:987 +#, fuzzy, c-format +msgid "Time for average graph: %d minute" +msgid_plural "Time for average graph: %d minutes" +msgstr[0] "平均值圖表顯示時間: %d 分鍾" +msgstr[1] "平均值圖表顯示時間: %d 分鍾" + +#: src/PrefsUnifiedDlg.cpp:993 +#, c-format +msgid "Connections Graph Scale: %d" +msgstr "網絡連接圖表縮放: %d" + +#: src/PrefsUnifiedDlg.cpp:999 +#, fuzzy, c-format +msgid "Update delay : %d second" +msgid_plural "Update delay : %d seconds" +msgstr[0] "刷新時間 : %d 秒" +msgstr[1] "刷新時間 : %d 秒" + +#: src/PrefsUnifiedDlg.cpp:1005 +#, fuzzy, c-format +msgid "File Buffer Size: %d byte" +msgid_plural "File Buffer Size: %d bytes" +msgstr[0] "文件緩沖區大小: %d bytes" +msgstr[1] "文件緩沖區大小: %d bytes" + +#: src/PrefsUnifiedDlg.cpp:1011 +#, fuzzy, c-format +msgid "Upload Queue Size: %d client" +msgid_plural "Upload Queue Size: %d clients" +msgstr[0] "上傳隊列長度: %d 個用戶" +msgstr[1] "上傳隊列長度: %d 個用戶" + +#: src/PrefsUnifiedDlg.cpp:1018 +#, fuzzy, c-format +msgid "Server connection refresh interval: %d minute" +msgid_plural "Server connection refresh interval: %d minutes" +msgstr[0] "服務器連接刷新周期: %d 分鍾" +msgstr[1] "服務器連接刷新周期: %d 分鍾" + +#: src/PrefsUnifiedDlg.cpp:1020 +msgid "Server connection refresh interval: Disabled" +msgstr "伺服器連線重新整理週期: 已停用" + +#: src/PrefsUnifiedDlg.cpp:1087 +#, c-format +msgid "Execute command on `%s' event" +msgstr "發生 '%s' 事件時執行命令" + +#: src/PrefsUnifiedDlg.cpp:1090 +msgid "Enable command execution on core" +msgstr "在核心啓用執行命令" + +#: src/PrefsUnifiedDlg.cpp:1098 +msgid "Core command:" +msgstr "核心命令:" + +#: src/PrefsUnifiedDlg.cpp:1107 +msgid "Enable command execution on GUI" +msgstr "在圖形界面端啓用執行命令" + +#: src/PrefsUnifiedDlg.cpp:1115 +msgid "GUI command:" +msgstr "圖形界面命令:" + +#: src/PrefsUnifiedDlg.cpp:1124 +msgid "The following variables will be replaced:" +msgstr "以下變量將被替換:" + +#: src/ExternalConn.cpp:102 +msgid "Unauthorized access attempt. Connection closed." +msgstr "非法登錄嘗試。已關閉連接。" + +#: src/ExternalConn.cpp:117 +msgid "External connection closed." +msgstr "已關閉外部連接。" + +#: src/ExternalConn.cpp:144 +msgid "External connections disabled due to empty password!" +msgstr "密碼未設置,外部連接已被禁止" + +#: src/ExternalConn.cpp:169 +msgid "External connections disabled in config file" +msgstr "配置文件禁止外部連接" + +#: src/ExternalConn.cpp:218 +msgid "New external connection accepted" +msgstr "接受了新的外部連接" + +#: src/ExternalConn.cpp:221 +msgid "Error: couldn't accept a new external connection" +msgstr "錯誤: 無法接受外來連接" + +#: src/ExternalConn.cpp:240 +msgid "External connection refused due to empty password in preferences!" +msgstr "由于未設置密碼,外部連接已被拒絕!" + +#: src/ExternalConn.cpp:250 +#, c-format +msgid "Connecting client: %s %s" +msgstr "正在連接用戶:%s %s" + +#: src/ExternalConn.cpp:252 +msgid "Unknown version" +msgstr "未知版本" + +#: src/ExternalConn.cpp:263 +msgid "" +"Incorrect EC version ID, there might be binary incompatibility. Use core and " +"remote from same snapshot." +msgstr "" +"錯誤的外部連接版本 ID,這將出現二進制不兼容,請使用相同版本的核心和遠程程序。" + +#: src/ExternalConn.cpp:268 +msgid "" +"You cannot connect to a release version from an arbitrary SVN version! " +"*sigh* possible crash prevented" +msgstr "" + +#: src/ExternalConn.cpp:289 +msgid "Authentication failed." +msgstr "登錄失敗。" + +#: src/ExternalConn.cpp:293 +msgid "Invalid protocol version." +msgstr "非法協議版本。" + +#: src/ExternalConn.cpp:297 +msgid "Missing protocol version tag." +msgstr "缺失協議版本標簽。" + +#: src/ExternalConn.cpp:301 +msgid "Invalid request, you should first authenticate." +msgstr "無效請求,請現登錄。" + +#: src/ExternalConn.cpp:307 +msgid "Access granted." +msgstr "登錄成功" + +#: src/ExternalConn.cpp:565 +#, c-format +msgid "Remote PartFile command failed: FileHash not found: %s" +msgstr "遠程PartFile命令失敗:FileHash不存在:%s" + +#: src/ExternalConn.cpp:567 +#, c-format +msgid "FileHash not found: %s" +msgstr "FileHash不存在:%s" + +#: src/ExternalConn.cpp:630 src/ExternalConn.cpp:714 +msgid "OOPS! OpCode processing error!" +msgstr "哇靠! OpCode處理錯誤!" + +#: src/ExternalConn.cpp:660 +msgid "Server not added" +msgstr "服務器沒有被添加" + +#: src/ExternalConn.cpp:678 +#, c-format +msgid "server not found: %s" +msgstr "找不到服務器:%s" + +#: src/ExternalConn.cpp:694 +msgid "need to define server to be removed" +msgstr "必須定義需刪除的服務器" + +#: src/ExternalConn.cpp:708 +msgid "ED2K is disabled in preferences." +msgstr "ED2K 在設置中被禁用了。" + +#: src/ExternalConn.cpp:804 +msgid "Search in progress. Refetch results in a moment!" +msgstr "正在搜尋。請稍等然後重新整理結果" + +#: src/ExternalConn.cpp:809 +msgid "WebSearch from remote interface makes no sense." +msgstr "遠程界面使用網絡搜索沒有意義。" + +#: src/ExternalConn.cpp:860 +msgid "Kad is disabled in preferences." +msgstr "Kad 在設置中被禁用了" + +#: src/ExternalConn.cpp:1021 +msgid "No points for graph." +msgstr "此圖沒有節點" + +#: src/ExternalConn.cpp:1030 +msgid "Your client is not configured for this detail level." +msgstr "你的客戶端沒有爲詳細級別進行配置。" + +#: src/ExternalConn.cpp:1058 +msgid "ExternalConn: shutdown requested" +msgstr "外部連接:收到關機請求" + +#: src/ExternalConn.cpp:1070 +msgid "Already shutting down." +msgstr "已經在關閉。" + +#: src/ExternalConn.cpp:1078 +#, c-format +msgid "ExternalConn: adding link '%s'." +msgstr "外部連接:正在添加鏈接 '%s'。" + +#: src/ExternalConn.cpp:1084 +msgid "Invalid link or already on list." +msgstr "非法鏈接或已經存在列表中。" + +#: src/ExternalConn.cpp:1169 +msgid "File not found." +msgstr "文件未找到。" + +#: src/ExternalConn.cpp:1174 +msgid "Invalid file name." +msgstr "非法文件名。" + +#: src/ExternalConn.cpp:1182 +msgid "Unable to rename file." +msgstr "無法重命名文件。" + +#: src/ExternalConn.cpp:1406 +msgid "Already connected to ED2K." +msgstr "已連接至 ED2K。" + +#: src/ExternalConn.cpp:1409 +msgid "Connecting to ED2K..." +msgstr "正在連接至 ED2K..." + +#: src/ExternalConn.cpp:1417 +msgid "Already connected to Kad." +msgstr "已連接至 Kad。" + +#: src/ExternalConn.cpp:1420 +msgid "Connecting to Kad..." +msgstr "正在連接至 Kad..." + +#: src/ExternalConn.cpp:1425 +msgid "All networks are disabled." +msgstr "全部網絡都被禁用了。" + +#: src/ExternalConn.cpp:1433 +msgid "Disconnected from ED2K." +msgstr "斷開 ED2K。" + +#: src/ExternalConn.cpp:1437 +msgid "Disconnected from Kad." +msgstr "斷開 Kad。" + +#: src/ExternalConn.cpp:1445 +#, c-format +msgid "ExternalConn: invalid opcode received: %#x" +msgstr "外部連接:收到錯誤的操作碼:%#x" + +#: src/ExternalConn.cpp:1448 +msgid "Invalid opcode (wrong protocol version?)" +msgstr "錯誤的操作碼(錯誤的協議版本?)" + +#: src/UploadClient.cpp:269 +#, c-format +msgid "Failed to open file (%s), removing from list of shared files." +msgstr "打開文件(%s)失敗,從共享文件列表刪除。" + +#: src/UploadClient.cpp:714 +#, c-format +msgid "Hashset requested for unknown file: %s" +msgstr "請求未知文件校檢碼:%s" + +#: src/TerminationProcess.cpp:48 +#, c-format +msgid "Command `%s' with pid `%d' has finished with status code `%d'." +msgstr "命令 '%s' 已生成進程 '%d',返回值爲 %d。 " + +#: src/ServerWnd.cpp:104 +msgid "Server not added: No IP or hostname specified." +msgstr "沒有添加服務器: 沒有IP地址或主機名" + +#: src/ServerWnd.cpp:109 +msgid "Server not added: Invalid server-port specified." +msgstr "沒有添加服務器: 服務器端口無效" + +#: src/ServerWnd.cpp:162 +msgid "ED2K Status:" +msgstr "ED2K 狀態:" + +#: src/ServerWnd.cpp:165 src/ServerWnd.cpp:215 src/TextClient.cpp:704 +#: src/ClientListCtrl.cpp:977 +msgid "Connected" +msgstr "已建立連線" + +#: src/ServerWnd.cpp:169 src/muuli_wdr.cpp:3039 +msgid "IP:Port" +msgstr "IP位址:連接埠" + +#: src/ServerWnd.cpp:173 +msgid "ID" +msgstr "ID" + +#: src/ServerWnd.cpp:205 +msgid "Kademlia Status:" +msgstr "Kad 狀態:" + +#: src/ServerWnd.cpp:208 +msgid "Running" +msgstr "正在運行" + +#: src/ServerWnd.cpp:214 +msgid "Status:" +msgstr "狀態:" + +#: src/ServerWnd.cpp:215 +msgid "Disconnected" +msgstr "連線已斷" + +#: src/ServerWnd.cpp:218 +msgid "Connection State:" +msgstr "連接狀態:" + +#: src/ServerWnd.cpp:219 +msgid "Firewalled" +msgstr "有防火牆" + +#: src/ServerWnd.cpp:219 src/muuli_wdr.cpp:2791 src/muuli_wdr.cpp:2894 +#: src/muuli_wdr.cpp:3132 +msgid "OK" +msgstr "確定" + +#: src/ServerWnd.cpp:223 +msgid "Firewalled state: " +msgstr "防火牆狀態:" + +#: src/ServerWnd.cpp:224 +msgid "Connected to buddy" +msgstr "已連接至好友" + +#: src/ServerWnd.cpp:224 +msgid "No buddy" +msgstr "沒有好友" + +#: src/ServerWnd.cpp:243 +msgid "Average Users:" +msgstr "平均用戶:" + +#: src/ServerWnd.cpp:246 +msgid "Average Files:" +msgstr "平均文件:" + +#: src/ServerWnd.cpp:253 src/TextClient.cpp:715 +msgid "Not running" +msgstr "沒有運行" + +#: src/Statistics.cpp:642 src/MuleTrayIcon.cpp:449 +#, c-format +msgid "Uptime: %s" +msgstr "執行時間: %s" + +#: src/Statistics.cpp:644 src/muuli_wdr.cpp:653 +msgid "Transfer" +msgstr "傳輸" + +#: src/Statistics.cpp:646 src/TransferWnd.cpp:445 src/muuli_wdr.cpp:469 +msgid "Uploads" +msgstr "上傳" + +#: src/Statistics.cpp:647 +#, c-format +msgid "Uploaded Data (Session (Total)): %s" +msgstr "本次上傳(全部): %s" + +#: src/Statistics.cpp:649 src/Statistics.cpp:668 +#, c-format +msgid "Total Overhead (Packets): %s" +msgstr "總開銷 (數據包): %s" + +#: src/Statistics.cpp:650 src/Statistics.cpp:669 +#, c-format +msgid "File Request Overhead (Packets): %s" +msgstr "文件請求開銷(數據包): %s" + +#: src/Statistics.cpp:652 src/Statistics.cpp:671 +#, c-format +msgid "Source Exchange Overhead (Packets): %s" +msgstr "源交換開銷(數據包): %s" + +#: src/Statistics.cpp:654 src/Statistics.cpp:673 +#, c-format +msgid "Server Overhead (Packets): %s" +msgstr "服務器開銷(數據包): %s" + +#: src/Statistics.cpp:656 src/Statistics.cpp:675 +#, c-format +msgid "Kad Overhead (Packets): %s" +msgstr "Kad 開銷(數據包):%s" + +#: src/Statistics.cpp:658 +#, c-format +msgid "Active Uploads: %s" +msgstr "活動上傳:%s" + +#: src/Statistics.cpp:659 +#, c-format +msgid "Waiting Uploads: %s" +msgstr "等待上傳:%s" + +#: src/Statistics.cpp:660 +#, c-format +msgid "Total successful upload sessions: %s" +msgstr "成功上傳會話總數:%s" + +#: src/Statistics.cpp:661 +#, c-format +msgid "Total failed upload sessions: %s" +msgstr "失敗上傳會話總數:%s" + +#: src/Statistics.cpp:663 +#, c-format +msgid "Average upload time: %s" +msgstr "平均上傳時間: %s" + +#: src/Statistics.cpp:665 src/DownloadListCtrl.cpp:887 src/muuli_wdr.cpp:423 +msgid "Downloads" +msgstr "下載" + +#: src/Statistics.cpp:666 +#, c-format +msgid "Downloaded Data (Session (Total)): %s" +msgstr "本次下載(總共): %s" + +#: src/Statistics.cpp:677 +#, c-format +msgid "Found Sources: %s" +msgstr "發現的源:%s" + +#: src/Statistics.cpp:678 +#, c-format +msgid "Active Downloads (chunks): %s" +msgstr "活動下載(塊數):%s" + +#: src/Statistics.cpp:680 +#, c-format +msgid "Session UL:DL Ratio (Total): %s" +msgstr "本次上傳下載比率:%s" + +#: src/Statistics.cpp:683 +#, c-format +msgid "Average Downloadrate (Session): %s" +msgstr "平均下載速度(本次運行):%s" + +#: src/Statistics.cpp:684 +#, c-format +msgid "Average Uploadrate (Session): %s" +msgstr "平均上傳速度(本次運行):%s" + +#: src/Statistics.cpp:685 +#, c-format +msgid "Max Downloadrate (Session): %s" +msgstr "最大下載速度(本次運行):%s" + +#: src/Statistics.cpp:686 +#, c-format +msgid "Max Uploadrate (Session): %s" +msgstr "最大上傳速度(本次運行):%s" + +#: src/Statistics.cpp:687 +#, c-format +msgid "Reconnects: %i" +msgstr "再連線: %i" + +#: src/Statistics.cpp:688 +#, c-format +msgid "Time Since First Transfer: %s" +msgstr "首次傳輸到現在時間: %s" + +#: src/Statistics.cpp:689 +#, c-format +msgid "Connected To Server Since: %s" +msgstr "與伺服器連線時間: %s" + +#: src/Statistics.cpp:690 +#, c-format +msgid "Active Connections (estimate): %i" +msgstr "活躍連接 (估計值): %i" + +#: src/Statistics.cpp:691 +#, c-format +msgid "Max Connection Limit Reached: %s" +msgstr "達到最大連接數:%s" + +#: src/Statistics.cpp:692 +#, c-format +msgid "Average Connections (estimate): %g" +msgstr "平均連接數(估計):%g" + +#: src/Statistics.cpp:694 +#, c-format +msgid "Peak Connections (estimate): %i" +msgstr "最高連接 (估計值): %i" + +#: src/Statistics.cpp:696 src/TransferWnd.cpp:453 src/ClientListCtrl.cpp:250 +msgid "Clients" +msgstr "客戶" + +#: src/Statistics.cpp:703 +msgid "Filtered" +msgstr "被過濾" + +#: src/Statistics.cpp:705 +#, c-format +msgid "Total: %i Known: %i" +msgstr "總數: %i 已知: %i" + +#: src/Statistics.cpp:708 src/muuli_wdr.cpp:1994 +msgid "Servers" +msgstr "伺服器" + +#: src/Statistics.cpp:709 +#, c-format +msgid "Working Servers: %i" +msgstr "有效服務器:%i" + +#: src/Statistics.cpp:710 +#, c-format +msgid "Failed Servers: %i" +msgstr "無效服務器:%i" + +#: src/Statistics.cpp:711 +#, c-format +msgid "Total: %s" +msgstr "總共:%s" + +#: src/Statistics.cpp:712 +#, c-format +msgid "Deleted Servers: %s" +msgstr "已刪除服務器:%s" + +#: src/Statistics.cpp:713 +#, c-format +msgid "Filtered Servers: %s" +msgstr "被過濾的服務器:%s" + +#: src/Statistics.cpp:714 +#, c-format +msgid "Users on Working Servers: %llu" +msgstr "有效服務器中的用戶數: %llu" + +#: src/Statistics.cpp:715 +#, c-format +msgid "Files on Working Servers: %llu" +msgstr "有效服務器中的文件數: %llu" + +#: src/Statistics.cpp:716 +#, c-format +msgid "Total Users: %llu" +msgstr "用戶總數:%llu" + +#: src/Statistics.cpp:717 +#, c-format +msgid "Total Files: %llu" +msgstr "文件總數:%llu" + +# fuzzy +#: src/Statistics.cpp:718 +#, c-format +msgid "Server Occupation: %.2f%%" +msgstr "伺服器占用率: %.2f%%" + +#: src/Statistics.cpp:722 +#, c-format +msgid "Number of Shared Files: %s" +msgstr "共享文件數:%s" + +#: src/Statistics.cpp:723 +#, c-format +msgid "Total size of Shared Files: %s" +msgstr "分享的檔案總和: %s" + +#: src/Statistics.cpp:725 +#, c-format +msgid "Average filesize: %s" +msgstr "平均檔案大小: %s" + +#: src/Statistics.cpp:741 +#, c-format +msgid "LowID: %u (%.2f%% Total %.2f%% Known)" +msgstr "低ID: %u (總計 %.2f%% 已知 %.2f%%)" + +#: src/Statistics.cpp:742 +#, c-format +msgid "SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)" +msgstr "安全身份 開/關:%u (%.2f%%) : %u (%.2f%%)" + +#: src/Statistics.cpp:871 +msgid "Operating System" +msgstr "操作系統" + +#: src/Statistics.cpp:896 +msgid "Not Received" +msgstr "沒有收到" + +#: src/MuleTextCtrl.cpp:79 +msgid "Cut" +msgstr "剪切" + +#: src/MuleTextCtrl.cpp:80 src/PartFileConvert.cpp:426 +msgid "Copy" +msgstr "複制" + +#: src/MuleTextCtrl.cpp:81 +msgid "Paste" +msgstr "粘貼" + +#: src/MuleTextCtrl.cpp:86 +msgid "Select All" +msgstr "選擇全部" + +#: src/SearchList.cpp:313 +msgid "Kad search can't be done if Kad is not running" +msgstr "Kad 搜索不能使用,因爲 Kad 沒有連接" + +#: src/SearchList.cpp:315 +msgid "ED2K search can't be done if ED2K is not connected" +msgstr "ED2k 搜索不能使用,因爲 ED2K 沒有連接" + +#: src/SearchList.cpp:359 +msgid "Unexpected error while attempting Kad search: " +msgstr "嘗試 Kad 搜索時出現不可預料的錯誤:" + +#: src/ClientTCPSocket.cpp:796 +#, c-format +msgid "Message filtered from '%s' (IP:%s)" +msgstr "來自 '%s'(IP:%s)的消息被過濾掉了" + +#: src/ClientTCPSocket.cpp:798 +#, c-format +msgid "New message from '%s' (IP:%s)" +msgstr "新消息來自于 '%s'(IP:%s)" + +#: src/ClientTCPSocket.cpp:816 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Accepted" +msgstr "用戶 %s (%u) 請求您的共享文件列表 -> 已接受" + +#: src/ClientTCPSocket.cpp:837 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list -> Denied" +msgstr "用戶 %s (%u) 請求您的共享文件列表 -> 已拒絕" + +#: src/ClientTCPSocket.cpp:869 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Accepted" +msgstr "用戶 %s (%u) 請求了共享文件夾列表 -> 接受" + +#: src/ClientTCPSocket.cpp:909 +#, c-format +msgid "User %s (%u) requested your shareddirectories-list -> Denied" +msgstr "用戶 %s (%u) 請求了共享文件夾列表 -> 拒絕" + +#: src/ClientTCPSocket.cpp:934 +#, c-format +msgid "" +"User %s (%u) requested your sharedfiles-list for directory %s -> accepted" +msgstr "用戶 %s (%u) 請求目錄 %s 的共享文件列表 -> 已接受" + +#: src/ClientTCPSocket.cpp:971 +#, c-format +msgid "User %s (%u) requested your sharedfiles-list for directory %s -> denied" +msgstr "用戶 %s (%u) 請求目錄 %s 的共享文件列表 -> 已拒絕" + +#: src/ClientTCPSocket.cpp:990 +#, c-format +msgid "User %s (%u) shares directory %s" +msgstr "使用者 %s (%u) 分享的檔案夾 %s" + +#: src/ClientTCPSocket.cpp:1005 +#, c-format +msgid "User %s (%u) sent unrequested shared dirs." +msgstr "用戶%s (%u) 發送了未經請求的共享文件夾列表" + +#: src/ClientTCPSocket.cpp:1020 +#, c-format +msgid "User %s (%u) sent sharedfiles-list for directory %s" +msgstr "使用者 %s (%u) 傳送了資料夾 %s 內的共享檔案清單" + +#: src/ClientTCPSocket.cpp:1027 +#, c-format +msgid "User %s (%u) finished sending sharedfiles-list" +msgstr "使用者 %s (%u) 完成了共享檔案清單的傳送" + +#: src/ClientTCPSocket.cpp:1032 +#, c-format +msgid "User %s (%u) sent unwanted sharedfiles-list" +msgstr "使用者 %s (%u) 傳送了未經請求的共享檔案清單" + +#: src/ClientTCPSocket.cpp:1044 +#, c-format +msgid "User %s (%u) denied access to shared directories/files list" +msgstr "用戶 %s (%u) 拒絕了目錄/文件列表的訪問" + +#: src/KadDlg.cpp:131 +#, c-format +msgid "Nodes (%u)" +msgstr "節點(%u)" + +#: src/KadDlg.cpp:166 +msgid "Invalid ip to bootstrap" +msgstr "無效IP" + +#: src/KadDlg.cpp:172 +msgid "Invalid port to bootstrap" +msgstr "無效端口" + +#: src/KadDlg.cpp:176 +msgid "Please fill all fields required" +msgstr "請填寫所有必要信息" + +#: src/KadDlg.cpp:195 +msgid "Are you sure you want to download a new nodes.dat file?\n" +msgstr "確定要下載新的 node.dat 文件嗎?\n" + +#: src/KadDlg.cpp:196 +msgid "" +"Doing so will remove your current nodes and restart Kademlia connection." +msgstr "這樣將刪除您當前節點並重啓Kad連接。" + +#: src/KadDlg.cpp:197 +msgid "Continue?" +msgstr "繼續?" + +#: src/Logger.cpp:267 +msgid "Error: " +msgstr "錯誤:" + +#: src/Logger.cpp:267 +msgid "Warning: " +msgstr "警告:" + +#: src/AddFriend.cpp:45 +msgid "Add a Friend" +msgstr "加入好友" + +#: src/AddFriend.cpp:61 +msgid "You have to enter a valid IP and port!" +msgstr "請輸入正確IP位址和連接埠!" + +#: src/AddFriend.cpp:61 src/AddFriend.cpp:67 +msgid "Information" +msgstr "信息" + +#: src/AddFriend.cpp:67 +msgid "The specified userhash is not valid!" +msgstr "這個使用者碼有錯" + +#: src/SearchListCtrl.cpp:89 src/DownloadListCtrl.cpp:195 +#: src/FileDetailListCtrl.cpp:44 +msgid "Sources" +msgstr "來源" + +#: src/SearchListCtrl.cpp:552 src/ClientListCtrl.cpp:503 +#: src/ClientListCtrl.cpp:804 +msgid "File" +msgstr "檔案" + +#: src/SearchListCtrl.cpp:553 src/muuli_wdr.cpp:368 src/muuli_wdr.cpp:1754 +#: src/muuli_wdr.cpp:1798 +msgid "Download" +msgstr "下載" + +#: src/SearchListCtrl.cpp:555 src/DownloadListCtrl.cpp:944 +#: src/TransferWnd.cpp:336 src/muuli_wdr.cpp:241 src/CatDialog.cpp:60 +msgid "Category" +msgstr "分類" + +#: src/SearchListCtrl.cpp:556 src/SearchDlg.cpp:599 +msgid "Main" +msgstr "主要" + +#: src/SearchListCtrl.cpp:562 +msgid "Download in category" +msgstr "下載分類" + +#: src/SearchListCtrl.cpp:568 +msgid "Search related files (ED2k, local server)" +msgstr "搜索相關文件(ED2K,本地服務器)" + +#: src/SearchListCtrl.cpp:573 +msgid "Mark as known file" +msgstr "標記為已知文件" + +#: src/amule-remote-gui.cpp:73 +msgid "Connect to remote amule" +msgstr "連接到遠程amule" + +#: src/amule-remote-gui.cpp:289 +msgid "Connection failed " +msgstr "連接失敗" + +#: src/amule-remote-gui.cpp:289 src/OtherFunctions.cpp:131 +#: src/OtherFunctions.cpp:149 src/OtherFunctions.cpp:203 src/amule.cpp:833 +#: src/amule.cpp:954 src/amule.cpp:1320 +msgid "Error" +msgstr "錯誤" + +#: src/amule-remote-gui.cpp:482 src/amule.cpp:1059 +msgid "" +"WARNING: You can't add yourself as a source for a ed2k link while being " +"lowid." +msgstr "警告:在低ID的情況下,你不能添加你自己作爲 ed2k 鏈接的源" + +#: src/amule-remote-gui.cpp:577 src/amule.cpp:1982 +#, c-format +msgid "Users: E: %s K: %s | Files E: %s K: %s" +msgstr "用戶:E:%s K:%s | 文件 E:%s K:%s" + +#: src/amule-remote-gui.cpp:635 src/TransferWnd.cpp:341 +msgid "All" +msgstr "全部" + +#: src/amule-remote-gui.cpp:873 +#, c-format +msgid "Total Users: %s | Total Files: %s" +msgstr "用戶總數:%s | 文件總數:%s" + +#: src/DownloadListCtrl.cpp:191 src/ClientListCtrl.cpp:506 +msgid "Transferred" +msgstr "已傳輸" + +#: src/DownloadListCtrl.cpp:192 src/TransferWnd.cpp:347 +#: src/PartFileConvert.cpp:611 src/OtherFunctions.cpp:748 +msgid "Completed" +msgstr "已完成" + +#: src/DownloadListCtrl.cpp:193 src/ClientListCtrl.cpp:505 +msgid "Speed" +msgstr "速度" + +#: src/DownloadListCtrl.cpp:194 +msgid "Progress" +msgstr "進度" + +#: src/DownloadListCtrl.cpp:197 src/ClientListCtrl.cpp:509 +msgid "Status" +msgstr "狀態" + +#: src/DownloadListCtrl.cpp:198 +msgid "Time Remaining" +msgstr "剩餘時間" + +#: src/DownloadListCtrl.cpp:199 +msgid "Last Seen Complete" +msgstr "最後一次發現完整檔案" + +#: src/DownloadListCtrl.cpp:200 +msgid "Last Reception" +msgstr "最後一次下載" + +#: src/DownloadListCtrl.cpp:578 +#, fuzzy +msgid "Are you sure that you wish to delete the selected file?" +msgstr "您確定要取消下載並刪除這些文件嗎?" + +#: src/DownloadListCtrl.cpp:580 +#, fuzzy +msgid "Are you sure that you wish to delete the selected files?" +msgstr "您確定要取消下載並刪除這些文件嗎?" + +#: src/DownloadListCtrl.cpp:836 src/ClientListCtrl.cpp:358 +msgid "Send message to user" +msgstr "發消息給用戶" + +#: src/DownloadListCtrl.cpp:837 src/ClientListCtrl.cpp:358 +msgid "Message to send:" +msgstr "發送消息:" + +#: src/DownloadListCtrl.cpp:897 src/TransferWnd.cpp:377 +msgid "&Stop" +msgstr "停止(&S)" + +#: src/DownloadListCtrl.cpp:898 src/TransferWnd.cpp:378 +msgid "&Pause" +msgstr "暫停 (&P)" + +#: src/DownloadListCtrl.cpp:899 src/TransferWnd.cpp:379 +msgid "&Resume" +msgstr "續傳(&R)" + +#: src/DownloadListCtrl.cpp:900 +msgid "C&lear completed" +msgstr "清除已完成的檔案 (&l)" + +#: src/DownloadListCtrl.cpp:906 +msgid "Swap every A4AF to this file now" +msgstr "立即轉移所有 A4AF 到這個檔案" + +#: src/DownloadListCtrl.cpp:908 +msgid "Swap every A4AF to this file (Auto)" +msgstr "自動轉移所有 A4AF 到這個檔案" + +#: src/DownloadListCtrl.cpp:913 +msgid "Swap every A4AF to any other file now" +msgstr "立即轉移所有 A4AF 到其它檔案" + +#: src/DownloadListCtrl.cpp:916 +msgid "Extended Options" +msgstr "延伸選項" + +#: src/DownloadListCtrl.cpp:927 src/DownloadListCtrl.cpp:980 +msgid "Preview" +msgstr "預覽" + +#: src/DownloadListCtrl.cpp:928 +msgid "Show file &details" +msgstr "顯示檔案訊息" + +#: src/DownloadListCtrl.cpp:930 src/muuli_wdr.cpp:838 +msgid "Show all comments" +msgstr "顯示所有註釋" + +#: src/DownloadListCtrl.cpp:935 +msgid "Copy magnet URI to clipboard" +msgstr "複制 magnet 地址到剪貼板" + +#: src/DownloadListCtrl.cpp:948 +msgid "unassign" +msgstr "清除" + +#: src/DownloadListCtrl.cpp:955 +msgid "Assign to category" +msgstr "分類" + +#: src/DownloadListCtrl.cpp:983 +msgid "&Open the file" +msgstr "開啟檔案 (&O)" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Remove from friends" +msgstr "從好友中刪除" + +#: src/DownloadListCtrl.cpp:1007 src/ClientListCtrl.cpp:252 +msgid "Add to Friends" +msgstr "加入好友" + +#: src/DownloadListCtrl.cpp:1009 src/ClientListCtrl.cpp:254 +msgid "Send message" +msgstr "發送短消息" + +#: src/DownloadListCtrl.cpp:1010 +msgid "Swap to this file" +msgstr "轉移到這個文件" + +#: src/DownloadListCtrl.cpp:1296 src/DownloadListCtrl.cpp:1599 +#: src/OtherFunctions.cpp:158 src/StatisticsDlg.cpp:100 +#: src/StatisticsDlg.cpp:102 src/muuli_wdr.cpp:1762 src/muuli_wdr.cpp:1775 +#: src/muuli_wdr.cpp:1788 src/muuli_wdr.cpp:1806 src/muuli_wdr.cpp:1819 +#: src/ClientListCtrl.cpp:632 src/ClientListCtrl.cpp:700 +msgid "kB/s" +msgstr "kB/s" + +#: src/DownloadListCtrl.cpp:1419 src/DownloadListCtrl.cpp:1430 +msgid "%y/%m/%d %H:%M:%S" +msgstr "%y/%m/%d %H:%M:%S" + +#: src/DownloadListCtrl.cpp:1647 +msgid "A4AF" +msgstr "已請求其它文件" + +#: src/DownloadListCtrl.cpp:1697 +#, c-format +msgid "QR: %u (%i)" +msgstr "QR: %u (%i)" + +#: src/DownloadListCtrl.cpp:1711 +msgid "Asked for another file" +msgstr "已要求其它檔案 (A4AF)" + +#: src/DownloadListCtrl.cpp:2034 +#, c-format +msgid "Downloads (%i)" +msgstr "下載 (%i)" + +#: src/DownloadListCtrl.cpp:2222 +#, fuzzy +msgid "" +"Please set your preferred video player on preferences.\n" +"Meanwhile, aMule will attempt to use mplayer and you will get this warning " +"on every preview" +msgstr "" +"請設置您的動畫播放器。\n" +"aMule會嘗試使用mplayer。這個提示會在每次預覽時出現 " + +#: src/DownloadListCtrl.cpp:2224 +msgid "File preview" +msgstr "文件預覽" + +#: src/DownloadListCtrl.cpp:2260 +#, fuzzy, c-format +msgid "ERROR: Failed to execute external media-player! Command: `%s'" +msgstr "錯誤: 無法運行媒體播放器!" + +#: src/PartFile.cpp:284 +msgid "ERROR: Failed to open partfile)" +msgstr "錯誤: 無法打開 part 文件)" + +# fuzzy +#: src/PartFile.cpp:288 +msgid "ERROR: Failed to create partfile)" +msgstr "錯誤: 無法建立 part 檔案" + +#: src/PartFile.cpp:322 +#, c-format +msgid "Trying to load backup of met-file from %s" +msgstr "嘗試使用met-file備份文件 %s" + +#: src/PartFile.cpp:329 +#, c-format +msgid "Error: Failed to open part.met file: %s ==> %s" +msgstr "錯誤: 無法打開 part.met 文件: %s ==> %s" + +#: src/PartFile.cpp:335 +#, c-format +msgid "Error: part.met file is 0 size: %s ==> %s" +msgstr "錯誤: part.met 文件長度爲0 : %s ==> %s" + +#: src/PartFile.cpp:346 +#, c-format +msgid "Error: Invalid part.met fileversion: %s ==> %s" +msgstr "錯誤: 無效 part.met 文件版本: %s ==> %s" + +#: src/PartFile.cpp:596 +#, c-format +msgid "Error: %s (%s) is corrupt (wrong tagcount), unable to load file." +msgstr "錯誤: 文件 %s (%s) 已損壞(標簽數不對),無法讀取文件" + +#: src/PartFile.cpp:599 +msgid "Trying to recover file info..." +msgstr "嘗試恢複文件信息..." + +#: src/PartFile.cpp:614 +msgid "Recovering no-named file - will try to recover it as RecoveredFile.dat" +msgstr "嘗試恢複無名文件 - 保存爲 RecoveredFile.dat" + +#: src/PartFile.cpp:619 +msgid "Recovered all available file info :D - Trying to use it..." +msgstr "成功恢複所有文件信息 :D - 嘗試使用文件信息..." + +#: src/PartFile.cpp:621 +msgid "Unable to recover file info :(" +msgstr "無法恢複文件 :(" + +#: src/PartFile.cpp:655 +#, c-format +msgid "Failed to open %s (%s)" +msgstr "無法讀取 %s (%s)" + +#: src/PartFile.cpp:703 +#, c-format +msgid "Warning: %s might be corrupted (%i)" +msgstr "警告: %s 可能已損壞 (%i)" + +#: src/PartFile.cpp:886 src/PartFile.cpp:891 +#, c-format +msgid "ERROR while saving partfile: %s (%s ==> %s)" +msgstr "part 文件存盤時發生錯誤: %s (%s => %s)" + +#: src/PartFile.cpp:914 +#, c-format +msgid "Could not retrieve length of '%s' - using %s file." +msgstr "" + +#: src/PartFile.cpp:922 +#, c-format +msgid "'%s' is 0 size somehow - using %s file." +msgstr "'%s' 文件長度爲0 - 使用 %s 文件。" + +#: src/PartFile.cpp:993 +#, c-format +msgid "Failed to save part.met.seeds file for %s" +msgstr "%s 的 part.met.seeds 檔案存檔失敗" + +#: src/PartFile.cpp:1019 +#, fuzzy, c-format +msgid "Saved %i source seed for partfile: %s (%s)" +msgid_plural "Saved %i source seeds for partfile: %s (%s)" +msgstr[0] "儲存了 %i 個源給 part 檔案 %s (%s) 的 " +msgstr[1] "儲存了 %i 個源給 part 檔案 %s (%s) 的 " + +#: src/PartFile.cpp:1048 +#, c-format +msgid "Partfile %s (%s) has no seeds file" +msgstr "Part檔案 %s (%s) 沒有種子檔案" + +#: src/PartFile.cpp:1057 +#, c-format +msgid "Partfile %s (%s) has a void seeds file" +msgstr "Part文件 %s (%s) 的種子文件爲空" + +#: src/PartFile.cpp:1113 +#, c-format +msgid "Error reading partfile's seeds file (%s - %s): %s" +msgstr "讀取part文件的種子文件出錯(%s - %s):%s" + +#: src/PartFile.cpp:1131 src/PartFile.cpp:1159 +#, fuzzy, c-format +msgid "" +"Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |" +"%s|" +msgid_plural "" +"Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash " +"|%s|" +msgstr[0] "" +"發現損壞的數據塊 (%d) 于%d段文件 %s - 文件結果校檢碼 |%s| 文件校檢碼 |%s|" +msgstr[1] "" +"發現損壞的數據塊 (%d) 于%d段文件 %s - 文件結果校檢碼 |%s| 文件校檢碼 |%s|" + +#: src/PartFile.cpp:1176 +#, c-format +msgid "Found completed part (%i) in %s" +msgstr "發現了已完成的資料段 %i 在%s" + +#: src/PartFile.cpp:1213 +#, c-format +msgid "Finished rehashing %s" +msgstr "完成了檢驗碼生成 %s" + +#: src/PartFile.cpp:2230 +#, c-format +msgid "Unexpected file error while completing %s. File paused" +msgstr "在完成檔案 %s 時遇到意外性檔案錯誤. 檔案已暫停" + +#: src/PartFile.cpp:2256 +#, c-format +msgid "Finished downloading: %s" +msgstr "完成下載 %s" + +#: src/PartFile.cpp:2313 +#, c-format +msgid "Deleting file: %s" +msgstr "刪除文件: %s " + +#: src/PartFile.cpp:2374 +#, c-format +msgid "Warning: Unable to hash downloaded part - hashset incomplete for '%s'" +msgstr "警告: 無法爲已下載的數據段計算校檢碼 - 校檢碼集殘缺 '%s'" + +#: src/PartFile.cpp:2379 +#, c-format +msgid "" +"Error: Unable to hash downloaded part - hashset incomplete (%s). This should " +"never happen" +msgstr "警告: 無法生成檢驗碼 - 檢驗碼殘缺 (%s). 正常情況下這是不應該發生的" + +#: src/PartFile.cpp:3059 +#, c-format +msgid "WARNING: Not enough free disk-space! Pausing file: %s" +msgstr "警告:硬盤空間不足!暫停文件:%s" + +#: src/PartFile.cpp:3144 +#, c-format +msgid "Downloaded part %i is corrupt in file: %s" +msgstr "下載的數據段 %i 已損壞 文件: (%s)" + +#: src/PartFile.cpp:3187 +#, c-format +msgid "ICH: Recovered corrupted part %i for %s -> Saved bytes: %s" +msgstr "ICH:修複了損壞的數據段 %i (%s) -> 挽救數據(字節): %s" + +#: src/PartFile.cpp:3846 +msgid "Insufficient Diskspace" +msgstr "硬盤空間不足" + +#: src/PartFile.cpp:3857 src/TransferWnd.cpp:352 src/OtherFunctions.cpp:753 +msgid "Stopped" +msgstr "已停止" + +#: src/KnownFileList.cpp:79 +msgid "Warning: known.met cannot be opened." +msgstr "警告:know.net文件無法打開。" + +#: src/KnownFileList.cpp:86 +msgid "Warning: Knownfile list corrupted, contains invalid header." +msgstr "警告:已知文件列表已損壞,文件頭無效" + +#: src/KnownFileList.cpp:112 +#, c-format +msgid "IO error while reading known.met file: %s" +msgstr "讀取known.net文件時發生IO錯誤:%s" + +#: src/KnownFileList.cpp:158 +#, c-format +msgid "Error while saving known.met file: %s" +msgstr "保存known.met文件時發生錯誤:%s" + +#: src/SharedFileList.cpp:352 +#, fuzzy, c-format +msgid "Found %i known shared file" +msgid_plural "Found %i known shared files" +msgstr[0] "發現 %i 已知分享的檔案" +msgstr[1] "發現 %i 已知分享的檔案" + +#: src/SharedFileList.cpp:358 +#, fuzzy, c-format +msgid "Found %i known shared file, %i unknown" +msgid_plural "Found %i known shared files, %i unknown" +msgstr[0] "發現 %i 已知分享的檔案, %i 不名" +msgstr[1] "發現 %i 已知分享的檔案, %i 不名" + +#: src/SharedFileList.cpp:367 +#, c-format +msgid "ERROR! Attempted to share %s" +msgstr "錯誤!試圖共享 %s" + +#: src/CommentDialogLst.cpp:47 src/CommentDialog.cpp:34 +msgid "File Comments" +msgstr "檔案註釋" + +#: src/CommentDialogLst.cpp:57 src/ClientListCtrl.cpp:807 +msgid "Rating" +msgstr "評價" + +#: src/CommentDialogLst.cpp:58 +msgid "Comment" +msgstr "注釋" + +#: src/CommentDialogLst.cpp:102 +msgid "No comments" +msgstr "沒有註釋" + +#: src/CommentDialogLst.cpp:104 +#, fuzzy, c-format +msgid "%u comment" +msgid_plural "%u comments" +msgstr[0] "%s 注釋" +msgstr[1] "%s 注釋" + +#: src/ServerConnect.cpp:69 +msgid "" +"Failed to connect to all obfuscated servers listed. Making another pass " +"without obfuscation." +msgstr "無法連接至列出的全部模糊服務器,嘗試不使用模糊。" + +#: src/ServerConnect.cpp:74 +msgid "Failed to connect to all servers listed. Making another pass." +msgstr "無法連線清單中的所有伺服器. 開始新的一輪嘗試." + +#: src/ServerConnect.cpp:88 src/ServerConnect.cpp:137 +msgid "ED2K network disabled on preferences, not connecting." +msgstr "ED2K網絡在設置被禁用,沒有連接。" + +#: src/ServerConnect.cpp:111 src/ServerConnect.cpp:124 +msgid "No valid servers to connect in serverlist found" +msgstr "伺服器清單中沒有有效伺服器可供連線" + +#: src/ServerConnect.cpp:197 +#, c-format +msgid "Connected to %s (%s:%i)" +msgstr "已連線到 %s (%s:%i)" + +#: src/ServerConnect.cpp:273 +#, c-format +msgid "Connection established on: %s" +msgstr "已連線到: %s" + +#: src/ServerConnect.cpp:345 +msgid "Fatal Error while trying to connect. Internet connection might be down" +msgstr "連線出現嚴重錯誤. 網絡連線可能有問題" + +#: src/ServerConnect.cpp:349 +#, c-format +msgid "Lost connection to %s (%s:%i)" +msgstr "連線已斷 %s (%s:%i)" + +#: src/ServerConnect.cpp:359 +#, c-format +msgid "%s (%s:%i) appears to be dead." +msgstr "%s (%s:%i) 可能已當機" + +#: src/ServerConnect.cpp:372 +#, c-format +msgid "%s (%s:%i) appears to be full." +msgstr "%s (%s:%i) 可能已沒有空位" + +#: src/ServerConnect.cpp:391 +#, fuzzy, c-format +msgid "Automatic connection to server will retry in %d second" +msgid_plural "Automatic connection to server will retry in %d seconds" +msgstr[0] "伺服器自動連線會在 %d 秒后重新嘗試" +msgstr[1] "伺服器自動連線會在 %d 秒后重新嘗試" + +#: src/ServerConnect.cpp:411 +msgid "Connection lost" +msgstr "連線已斷" + +#: src/ServerConnect.cpp:418 +#, c-format +msgid "Connecting to %s (%s:%i) failed." +msgstr "連接失敗 %s (%s:%i)" + +# fuzzy +#: src/ServerConnect.cpp:460 +msgid "Error: Socket invalid at timeoutcheck" +msgstr "錯誤: 接口無效" + +#: src/ServerConnect.cpp:470 +#, c-format +msgid "Connection attempt to %s (%s:%i) timed out." +msgstr "連接超時 %s (%s:%i)" + +#: src/DownloadQueue.cpp:159 +msgid "" +"Error: Failed to load backup file. Search http://forum.amule.org for .part." +"met recovery solutions." +msgstr "" + +#: src/DownloadQueue.cpp:173 +msgid "No part files found" +msgstr "沒有找到 part 檔案" + +#: src/DownloadQueue.cpp:175 +#, fuzzy, c-format +msgid "Found %u part file" +msgid_plural "Found %u part files" +msgstr[0] "發現 %u 個 part 文件" +msgstr[1] "發現 %u 個 part 文件" + +#: src/DownloadQueue.cpp:315 +#, c-format +msgid "Downloading %s" +msgstr "正在下載 %s" + +#: src/DownloadQueue.cpp:323 +#, c-format +msgid "You are already trying to download the file '%s'" +msgstr "您已經在下載文件 '%s'" + +#: src/DownloadQueue.cpp:335 +#, c-format +msgid "You already have the file '%s'" +msgstr "您已下載了文件 '%s'" + +#: src/DownloadQueue.cpp:340 +#, c-format +msgid "You are already trying to download the file %s" +msgstr "您已經在下載檔案 %s" + +#: src/DownloadQueue.cpp:1297 +#, c-format +msgid "Cannot convert magnet link to ed2k: %s" +msgstr "無法轉換magnet連接至ed2k:%s" + +#: src/DownloadQueue.cpp:1305 +#, c-format +msgid "Unknown protocol of link: %s" +msgstr "未知連接協議:%s" + +#: src/DownloadQueue.cpp:1326 +#, c-format +msgid "Invalid ed2k link! Error: %s" +msgstr "無效 ed2k 鏈接! 錯誤: %s" + +#: src/TextClient.cpp:130 +msgid "Execute and exit." +msgstr "執行 然後退出." + +#: src/TextClient.cpp:197 +msgid "Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n" +msgstr "無效IP地址格式。請使用 xxx.xxx.xxx.xxx:xxxx\n" + +#: src/TextClient.cpp:305 +#, fuzzy +msgid "" +"This command requires an argument. Valid arguments: 'all', filename, or a " +"number.\n" +msgstr "此命令需要一個參數,合法參數為:'all'或一個數字。\n" + +#: src/TextClient.cpp:343 +#, fuzzy +msgid "Processing by hash: " +msgstr "正在處理文件號 %u: %s" + +#: src/TextClient.cpp:358 +#, fuzzy +msgid "Processing by filename: " +msgstr "正在處理文件號 %u: %s" + +#: src/TextClient.cpp:381 +msgid "This command requires an argument. Valid arguments: a file hash.\n" +msgstr "此命令需要一個參數,合法參數為文件校驗碼。\n" + +#: src/TextClient.cpp:407 +msgid "Not a valid number\n" +msgstr "非有效數字\n" + +#: src/TextClient.cpp:411 +msgid "Not a valid hash (length should be exactly 32 chars)\n" +msgstr "無效的校驗值(長度必須爲32個字符)\n" + +#: src/TextClient.cpp:627 +msgid "Operation was successful." +msgstr "操作成功。" + +#: src/TextClient.cpp:633 +#, c-format +msgid "Request failed with the following error: %s" +msgstr "請求失敗,錯誤爲:%s" + +#: src/TextClient.cpp:649 +#, c-format +msgid "IP filtering for clients is %s.\n" +msgstr "客戶端的IP過濾器是:%s。\n" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "OFF" +msgstr "關" + +#: src/TextClient.cpp:650 src/TextClient.cpp:656 +msgid "ON" +msgstr "開" + +#: src/TextClient.cpp:655 +#, c-format +msgid "IP filtering for servers is %s.\n" +msgstr "服務器的IP過濾器是%s。\n" + +#: src/TextClient.cpp:660 +#, c-format +msgid "Current IPFilter Level is %d.\n" +msgstr "當前IP過濾級別時 %d.\n" + +#: src/TextClient.cpp:668 +#, c-format +msgid "Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n" +msgstr "帶寬限制:上傳: %u kB/s, 下載: %u kB/s.\n" + +#: src/TextClient.cpp:686 src/muuli_wdr.cpp:1928 src/muuli_wdr.cpp:3932 +msgid "ED2K" +msgstr "ED2K" + +#: src/TextClient.cpp:691 +#, c-format +msgid "Connected to %s %s %s" +msgstr "已連接到 %s %s %s" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with LowID" +msgstr "有低ID" + +#: src/TextClient.cpp:694 src/amule.cpp:2047 +msgid "with HighID" +msgstr "有高ID" + +#: src/TextClient.cpp:697 +msgid "Now connecting" +msgstr "正在連接" + +#: src/TextClient.cpp:699 src/TextClient.cpp:712 +msgid "Not connected" +msgstr "未連接" + +#: src/TextClient.cpp:721 +#, c-format +msgid "" +"\n" +"Download:\t%s" +msgstr "" +"\n" +"下載:\t%s" + +#: src/TextClient.cpp:724 +#, c-format +msgid "" +"\n" +"Upload:\t%s" +msgstr "" +"\n" +"上傳:\t%s" + +#: src/TextClient.cpp:727 +#, c-format +msgid "" +"\n" +"Clients in queue:\t%d\n" +msgstr "" +"\n" +"隊列長度: \t%d\n" + +#: src/TextClient.cpp:730 +#, c-format +msgid "" +"\n" +"Total sources:\t%d\n" +msgstr "" +"\n" +"源總數:\t%d\n" + +#: src/TextClient.cpp:807 +#, c-format +msgid "Number of search results: %i\n" +msgstr "搜索結果數量:%i\n" + +#: src/TextClient.cpp:820 +msgid "TODO - show progress of a search" +msgstr "待辦事項 - 顯示搜索進度" + +#: src/TextClient.cpp:826 +#, c-format +msgid "Received an unknown reply from the server, OpCode = %#x." +msgstr "從服務器收到未知的回複,操作碼是 %#x." + +#: src/TextClient.cpp:839 +msgid "Show short status information." +msgstr "顯示簡短的狀態信息。" + +#: src/TextClient.cpp:840 +msgid "Show connection status, current up/download speeds, etc.\n" +msgstr "顯示連接狀態,當前上傳下載速度等等。\n" + +#: src/TextClient.cpp:842 +msgid "Show full statistics tree." +msgstr "顯示全部統計樹" + +#: src/TextClient.cpp:843 +msgid "" +"Optionally, a number in the range 0-255 can be passed as an argument to " +"this\n" +"command, which tells how many entries of the client version subtrees should " +"be\n" +"shown. Passing 0 or omitting it means 'unlimited'.\n" +"\n" +"Example: 'statistics 5' will show only the top 5 versions for each client " +"type.\n" +msgstr "" +"可選,一個0-255之間的數字可作爲此命令的參數, \n" +"用于設置客戶端版本樹顯示的節點數量。 n參數設爲0表示無限制。\n" +"\n" +"示例: 'statistics 5' 將顯示每個客戶端軟件的5個版本。\n" + +#: src/TextClient.cpp:849 +msgid "Shutdown aMule." +msgstr "關閉aMule。" + +#: src/TextClient.cpp:850 +msgid "" +"Shutdown the remote running core (amule/amuled).\n" +"This will also shut down the text client, since it is unusable without a\n" +"running core.\n" +msgstr "" +"關閉遠程運行核心程序(amule/amuled)。\n" +"這也將關閉文本客戶端,直至沒有一個在運行的核心可用。\n" + +#: src/TextClient.cpp:854 +msgid "Reloads the given object." +msgstr "重新載入所給的對象。" + +#: src/TextClient.cpp:855 +msgid "Reloads shared files list." +msgstr "重新載入共享文件列表。" + +#: src/TextClient.cpp:856 +msgid "Reloads IP Filter table from file." +msgstr "重新從文件載入IP過濾表。" + +#: src/TextClient.cpp:858 +msgid "Connect to the network." +msgstr "連接至網絡。" + +#: src/TextClient.cpp:859 +msgid "" +"This will connect to all networks that are enabled in Preferences.\n" +"You may also optionally specify a server address in IP:Port form, to connect " +"to\n" +"that server only. The IP must be a dotted decimal IPv4 address,\n" +"or a resolvable DNS name." +msgstr "" +"這將連接至全部在設置中啓用的網絡。\n" +"您也可以使用此格式(IP:端口)定義一個服務器地址,並只連接至此服務器。\n" +"此IP必須是用點分隔的十進制IPv4地址,\n" +"或者是可以解析的DNS名稱。" + +#: src/TextClient.cpp:863 +msgid "Connect to ED2K only." +msgstr "只連接ED2K。" + +#: src/TextClient.cpp:864 +msgid "Connect to Kad only." +msgstr "只連接Kad。" + +#: src/TextClient.cpp:866 +msgid "Disconnect from the network." +msgstr "斷開網絡。" + +#: src/TextClient.cpp:867 +msgid "This will disconnect from all networks that are currently connected.\n" +msgstr "這將斷開當前已連接的全部網絡。\n" + +#: src/TextClient.cpp:868 +msgid "Disconnect from ED2K only." +msgstr "只斷開ED2K連接。" + +#: src/TextClient.cpp:869 +msgid "Disconnect from Kad only." +msgstr "只斷開Kad連接。" + +#: src/TextClient.cpp:871 +msgid "Adds an ed2k or magnet link to core." +msgstr "添加一個ed2k或magnet連接至核心。" + +#: src/TextClient.cpp:872 +msgid "" +"The ed2k link to be added can be:\n" +"*) a file link (ed2k://|file|...), it will be added to the download queue,\n" +"*) a server link (ed2k://|server|...), it will be added to the server list,\n" +"*) or a serverlist link, in which case all servers in the list will be added " +"to the\n" +" server list.\n" +"\n" +"The magnet link must contain the ed2k hash and file length.\n" +msgstr "" +"添加的 ed2k 鏈接可以是:\n" +"*) 文件鏈接(ed2k://|file|..),將添加至下載隊列,\n" +"*) 服務器鏈接(ed2k://|server|...),將添加至服務器列表,\n" +"*) 或服務器列表鏈接,這種情況將添加此列表中的所有服務器至服務器列表。\n" +"\n" +"\n" +"magnet 鏈接必須包含 ed2k 校驗碼和文件大小。\n" + +#: src/TextClient.cpp:880 +msgid "Set a preference value." +msgstr "設置一個參數值。" + +#: src/TextClient.cpp:883 +msgid "Set IPFilter preferences." +msgstr "設置IP過濾參數。" + +#: src/TextClient.cpp:884 +msgid "Turn IP filtering on for both clients and servers." +msgstr "開啓客戶端和服務器的IP過濾。" + +#: src/TextClient.cpp:885 +msgid "Turn IP filtering off for both clients and servers." +msgstr "關閉客戶端和服務器的IP過濾。" + +#: src/TextClient.cpp:886 +msgid "Enable/Disable IP filtering for clients." +msgstr "啓動/禁用客戶端IP過濾。" + +#: src/TextClient.cpp:887 +msgid "Turn IP filtering on for clients." +msgstr "開啓客戶端IP過濾。" + +#: src/TextClient.cpp:888 +msgid "Turn IP filtering off for clients." +msgstr "關閉客戶端IP過濾。" + +#: src/TextClient.cpp:889 +msgid "Enable/Disable IP filtering for servers." +msgstr "啓用/禁用服務器IP過濾。" + +#: src/TextClient.cpp:890 +msgid "Turn IP filtering on for servers." +msgstr "開啓服務器IP過濾。" + +#: src/TextClient.cpp:891 +msgid "Turn IP filtering off for servers." +msgstr "關閉服務器IP過濾。" + +#: src/TextClient.cpp:892 +msgid "Select IP filtering level." +msgstr "選擇IP過濾級別。" + +#: src/TextClient.cpp:893 +msgid "" +"Valid filtering levels are in the range 0-255, and it's default (initial)\n" +"value is 127.\n" +msgstr "" +"正確的IP過濾級別是在0-255之間,\n" +"默認(初始)值是127。\n" + +#: src/TextClient.cpp:896 +msgid "Set bandwidth limits." +msgstr "設置帶寬限制。" + +#: src/TextClient.cpp:897 +msgid "The value given to these commands has to be in kilobytes/sec.\n" +msgstr "給此命令的值必須使用kB/s。\n" + +#: src/TextClient.cpp:898 +msgid "Set upload bandwidth limit." +msgstr "設置上傳帶寬限制。" + +#: src/TextClient.cpp:900 +msgid "Set download bandwidth limit." +msgstr "設置下載帶寬限制。" + +#: src/TextClient.cpp:903 +msgid "Get and display a preference value." +msgstr "獲取並顯示設置值。" + +#: src/TextClient.cpp:906 +msgid "Get IPFilter preferences." +msgstr "獲取IP過濾器設置。" + +#: src/TextClient.cpp:907 +msgid "Get IPFilter state for both clients and servers." +msgstr "獲取客戶端和服務器的IP過濾器狀態。" + +#: src/TextClient.cpp:908 +msgid "Get IPFilter state for clients only." +msgstr "只獲取客戶端的IP過濾器狀態。" + +#: src/TextClient.cpp:909 +msgid "Get IPFilter state for servers only." +msgstr "只獲取服務器的IP過濾器狀態。" + +#: src/TextClient.cpp:910 +msgid "Get IPFilter level." +msgstr "獲取IP過濾級別。" + +#: src/TextClient.cpp:912 +msgid "Get bandwidth limits." +msgstr "獲取帶寬限制。" + +#: src/TextClient.cpp:914 +msgid "Makes a search." +msgstr "進行搜索。" + +#: src/TextClient.cpp:915 +msgid "" +"A search type has to be specified by giving the type:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"Example: 'search kad file' will execute a kad search for \"file\".\n" +msgstr "" +"搜索類型必須使用設定的類型:\n" +" GLOBAL\n" +" LOCAL\n" +" KAD\n" +"示例: 'search kad 文件' 將對 \"文件\"執行 Kad 搜索。\n" + +#: src/TextClient.cpp:920 +msgid "Executes a global search." +msgstr "執行全球搜索。" + +#: src/TextClient.cpp:921 +msgid "Executes a local search" +msgstr "執行本地搜索" + +#: src/TextClient.cpp:922 +msgid "Executes a kad search" +msgstr "執行 Kad 搜索" + +#: src/TextClient.cpp:924 +msgid "Shows the results of the last search." +msgstr "顯示上次搜索的結果。" + +#: src/TextClient.cpp:925 +msgid "Returns the results of the previous search.\n" +msgstr "返回以前搜索的結果。\n" + +#: src/TextClient.cpp:927 +msgid "Shows the progress of a search." +msgstr "顯示搜索進度。" + +#: src/TextClient.cpp:928 +msgid "Shows the progress of a search.\n" +msgstr "顯示搜索進度。\n" + +#: src/TextClient.cpp:930 +msgid "Start downloading a file" +msgstr "開始下載文件" + +#: src/TextClient.cpp:931 +msgid "" +"The number of a file from the last search has to be given.\n" +"Example: 'download 12' will start to download the file with the number 12 of " +"the previous search.\n" +msgstr "" +"必須指定上次搜索的文件數量。\n" +"示例:'download 12' 將開始下載上次搜索結果中的12個文件。\n" + +#: src/TextClient.cpp:939 +msgid "Pause download." +msgstr "停止下載。" + +#: src/TextClient.cpp:942 +msgid "Resume download." +msgstr "繼續下載。" + +#: src/TextClient.cpp:945 +msgid "Cancel download." +msgstr "取消下載。" + +#: src/TextClient.cpp:948 +msgid "Set download priority." +msgstr "設置下載優先級。" + +#: src/TextClient.cpp:949 +msgid "Set priority of a download to Low, Normal, High or Auto.\n" +msgstr "設置下載的優先級爲低、正常、高或自動。\n" + +#: src/TextClient.cpp:950 +msgid "Set priority to low." +msgstr "設爲低優先級。" + +#: src/TextClient.cpp:951 +msgid "Set priority to normal." +msgstr "設爲正常優先級。" + +#: src/TextClient.cpp:952 +msgid "Set priority to high." +msgstr "設爲高優先級。" + +#: src/TextClient.cpp:953 +msgid "Set priority to auto." +msgstr "設爲自動優先級。" + +#: src/TextClient.cpp:955 +msgid "Show queues/lists." +msgstr "顯示隊列/列表。" + +#: src/TextClient.cpp:956 +msgid "Shows upload/download queue, server list or shared files list.\n" +msgstr "顯示上傳/下載隊列,服務器列表或共享文件列表。\n" + +#: src/TextClient.cpp:957 +msgid "Show upload queue." +msgstr "顯示上傳隊列。" + +#: src/TextClient.cpp:958 +msgid "Show download queue." +msgstr "顯示下載隊列。" + +#: src/TextClient.cpp:959 +msgid "Show log." +msgstr "顯示日志。" + +#: src/TextClient.cpp:960 +msgid "Show servers list." +msgstr "顯示服務器列表。" + +#: src/TextClient.cpp:963 +msgid "Reset log." +msgstr "重設日志。" + +#: src/TextClient.cpp:970 +#, c-format +msgid "Deprecated command, now '%s'." +msgstr "已廢棄的命令,現用'%s'。" + +#: src/TextClient.cpp:971 +#, c-format +msgid "" +"This is a deprecated command, and may be removed in the future.\n" +"Use '%s' instead.\n" +msgstr "這是一個已廢棄的命令,將來可能被刪除,請使用'%s'替代。\n" + +#: src/ServerSocket.cpp:176 +msgid "theApp->serverlist->GetServerByAddress() returned NULL" +msgstr "theApp->serverlist->GetServerByAddress() 返回了 NULL" + +#: src/ServerSocket.cpp:259 +#, c-format +msgid "Error: %s (%s) - %s" +msgstr "錯誤: %s (%s) - %s" + +#: src/ServerSocket.cpp:274 +#, c-format +msgid "Warning: %s (%s) - %s" +msgstr "警告:%s (%s) - %s" + +#: src/ServerSocket.cpp:417 +#, c-format +msgid "New clientid is %u" +msgstr "新使用者 %u" + +#: src/ServerSocket.cpp:419 +msgid "WARNING: You have received Low-ID!" +msgstr "警告:你收到了低ID!" + +#: src/ServerSocket.cpp:420 +msgid "\tMost likely this is because you're behind a firewall or router." +msgstr "\t大概這是因爲您處在防火牆或路由器後面。" + +#: src/ServerSocket.cpp:421 +msgid "\tFor more information, please refer to http://wiki.amule.org" +msgstr "\t請到 http://wiki.amule.org 獲取詳情" + +#: src/ServerSocket.cpp:478 +msgid "Unknown server info received! - too short" +msgstr "收到未知服務器信息 ! - 長度過短" + +#: src/ServerSocket.cpp:539 +#, fuzzy, c-format +msgid "Received %d new server" +msgid_plural "Received %d new servers" +msgstr[0] "收到 %d 個新伺服器" +msgstr[1] "收到 %d 個新伺服器" + +#: src/ServerSocket.cpp:542 +msgid "Saving of server-list completed." +msgstr "服務器列表保存完畢。" + +#: src/ServerSocket.cpp:597 +msgid "Server rejected last command" +msgstr "伺服器拒絕了上一個明令" + +#: src/ServerSocket.cpp:607 src/ServerSocket.cpp:609 +#, c-format +msgid "Bogus packet received from server: %s" +msgstr "服務器數據包無效:%s" + +#: src/ServerSocket.cpp:611 +#, c-format +msgid "Unhandled error while processing packet from server: %s" +msgstr "在處理從服務器接收的數據有無法處理的錯誤 : %s " + +#: src/ServerSocket.cpp:650 src/ServerSocket.cpp:654 +#, c-format +msgid "Cannot create DNS solving thread for connecting to %s" +msgstr "無法建立DNS線程以連接 %s" + +#: src/ServerSocket.cpp:733 +#, c-format +msgid "Server IP %s (%s) is filtered. Not connecting." +msgstr "服務器 IP %s (%s) 已被過濾。不在連接。" + +#: src/ServerSocket.cpp:743 +msgid "using protocol obfuscation." +msgstr "使用模糊協議。" + +#: src/ServerSocket.cpp:752 +#, c-format +msgid "Connecting to %s (%s - %s:%i) %s" +msgstr "正在連接至 %s (%s - %s:%i) %s" + +#: src/ServerSocket.cpp:764 +#, c-format +msgid "Could not solve dns for server %s: Unable to connect!" +msgstr "無法查找服務器%s的DNS記錄: 無法連接!" + +#: src/IP2Country.cpp:68 +msgid "CIP2Country::CIP2Country(): Failed to load country data from " +msgstr "CIP2Country::CIP2Country():載入國家數據失敗" + +#: src/IP2Country.cpp:73 +#, fuzzy, c-format +msgid "Loaded %d flag bitmap." +msgid_plural "Loaded %d flag bitmaps." +msgstr[0] "%d個國旗圖片已載入。" +msgstr[1] "%d個國旗圖片已載入。" + +#: src/TransferWnd.cpp:194 +msgid "Are you sure you wish to cancel and delete all files in this category?" +msgstr "您確定要移除分類中的所有下載檔案嗎?" + +#: src/TransferWnd.cpp:194 +msgid "Confirmation Required" +msgstr "需要確認" + +#: src/TransferWnd.cpp:342 +msgid "All others" +msgstr "所有其它" + +#: src/TransferWnd.cpp:346 src/OtherFunctions.cpp:747 +msgid "Incomplete" +msgstr "未完成" + +#: src/TransferWnd.cpp:353 src/OtherFunctions.cpp:760 +msgid "Active" +msgstr "活動" + +#: src/TransferWnd.cpp:357 src/OtherFunctions.cpp:754 +msgid "Video" +msgstr "視訊" + +#: src/TransferWnd.cpp:358 src/OtherFunctions.cpp:237 +#: src/OtherFunctions.cpp:755 src/muuli_wdr.cpp:228 +msgid "Audio" +msgstr "音樂" + +#: src/TransferWnd.cpp:359 src/OtherFunctions.cpp:756 +msgid "Archive" +msgstr "歸檔" + +#: src/TransferWnd.cpp:360 src/OtherFunctions.cpp:251 +#: src/OtherFunctions.cpp:757 src/muuli_wdr.cpp:229 +msgid "CD-Images" +msgstr "CD影像" + +#: src/TransferWnd.cpp:361 src/OtherFunctions.cpp:258 +#: src/OtherFunctions.cpp:758 src/muuli_wdr.cpp:230 +msgid "Pictures" +msgstr "圖片" + +#: src/TransferWnd.cpp:362 src/OtherFunctions.cpp:759 +msgid "Text" +msgstr "純文字" + +#: src/TransferWnd.cpp:364 +msgid "Select view filter" +msgstr "選擇顯示過濾" + +#: src/TransferWnd.cpp:367 +msgid "Add category" +msgstr "新增分類" + +#: src/TransferWnd.cpp:370 +msgid "Edit category" +msgstr "編輯分類" + +#: src/TransferWnd.cpp:371 +msgid "Remove category" +msgstr "移除分類" + +#: src/PartFileConvert.cpp:236 +#, c-format +msgid "Importing %s: %s" +msgstr "正在導入 %s:%s" + +#: src/PartFileConvert.cpp:267 +msgid "Reading temp folder" +msgstr "正在讀取臨時文件夾" + +#: src/PartFileConvert.cpp:271 +msgid "Retrieving basic information from download info file" +msgstr "正在從下載信息文件獲取基本信息" + +#: src/PartFileConvert.cpp:350 +msgid "Creating destination file" +msgstr "創建目標文件" + +#: src/PartFileConvert.cpp:359 +#, c-format +msgid "Loading data from old download file (%u of %u)" +msgstr "從舊下載文件載入數據(%u 共 %u)" + +#: src/PartFileConvert.cpp:379 +#, c-format +msgid "Saving data block into new single download file (%u of %u)" +msgstr "正在保存數據塊至新的單個下載文件(%u 共 %u)" + +#: src/PartFileConvert.cpp:446 +msgid "Retrieving source downloadfile information" +msgstr "正在獲取源下載文件信息" + +#: src/PartFileConvert.cpp:471 +msgid "Adding download and saving new partfile" +msgstr "正在下載和保存新part文件" + +#: src/PartFileConvert.cpp:548 +msgid "Fetching status..." +msgstr "正在獲取狀態..." + +#: src/PartFileConvert.cpp:612 +msgid "In progress" +msgstr "正在處理" + +#: src/PartFileConvert.cpp:613 +msgid "Error: Out of diskspace" +msgstr "錯誤:磁盤空間不足" + +#: src/PartFileConvert.cpp:614 +msgid "Error: Partmet not found" +msgstr "錯誤:partmet文件未找到" + +#: src/PartFileConvert.cpp:615 +msgid "Error: IO error!" +msgstr "錯誤:IO錯誤!" + +#: src/PartFileConvert.cpp:616 +msgid "Error: Failed!" +msgstr "錯誤:失敗!" + +#: src/PartFileConvert.cpp:617 +msgid "Queued" +msgstr "已加入隊列" + +#: src/PartFileConvert.cpp:618 +msgid "Already downloading" +msgstr "已經在下載" + +#: src/PartFileConvert.cpp:619 +msgid "Unknown or bad tempfile format." +msgstr "未知或錯誤的臨時文件格式。" + +#: src/PartFileConvert.cpp:628 +msgid "File name" +msgstr "文件名" + +#: src/PartFileConvert.cpp:629 +msgid "State" +msgstr "狀態" + +#: src/PartFileConvert.cpp:631 +msgid "Filehash" +msgstr "文件校驗碼" + +#: src/PartFileConvert.cpp:677 +msgid "Import partfiles" +msgstr "導入 part 文件" + +#: src/PartFileConvert.cpp:697 +msgid "" +"Please choose a folder to search for temporary downloads! (subfolders will " +"be included)" +msgstr "請選擇一個目錄用于搜索臨時下載文件!(子目錄也將被包括)" + +#: src/PartFileConvert.cpp:701 +msgid "" +"Do you want the source files of succesfully imported downloads be deleted?" +msgstr "要刪除成功導入下載的源文件嗎?" + +#: src/PartFileConvert.cpp:702 +msgid "Remove sources?" +msgstr "刪除源?" + +#: src/PartFileConvert.cpp:723 src/muuli_wdr.cpp:3838 +msgid "Waiting..." +msgstr "等待中..." + +#: src/PartFileConvert.cpp:738 +#, c-format +msgid "%s (Disk: %s)" +msgstr "%s (磁盤:%s)" + +#: src/OtherFunctions.cpp:121 +#, fuzzy +msgid "byte" +msgid_plural "bytes" +msgstr[0] "字節" +msgstr[1] "字節" + +#: src/OtherFunctions.cpp:123 +msgid "kB" +msgstr "kB" + +#: src/OtherFunctions.cpp:125 src/muuli_wdr.cpp:269 src/muuli_wdr.cpp:292 +msgid "MB" +msgstr "MB" + +#: src/OtherFunctions.cpp:127 src/muuli_wdr.cpp:270 src/muuli_wdr.cpp:293 +msgid "GB" +msgstr "GB" + +#: src/OtherFunctions.cpp:129 +msgid "TB" +msgstr "TB" + +#: src/OtherFunctions.cpp:141 +msgid "k" +msgstr "k" + +#: src/OtherFunctions.cpp:143 +msgid "M" +msgstr "M" + +#: src/OtherFunctions.cpp:145 +msgid "G" +msgstr "G" + +#: src/OtherFunctions.cpp:147 +msgid "T" +msgstr "T" + +#: src/OtherFunctions.cpp:156 +#, fuzzy +msgid "byte/sec" +msgid_plural "bytes/sec" +msgstr[0] "字節/秒" +msgstr[1] "字節/秒" + +#: src/OtherFunctions.cpp:160 +msgid "MB/s" +msgstr "MB/s" + +#: src/OtherFunctions.cpp:171 src/OtherFunctions.cpp:175 +msgid "secs" +msgstr "秒" + +#: src/OtherFunctions.cpp:183 +msgid "mins" +msgstr "分鍾" + +#: src/OtherFunctions.cpp:190 src/OtherFunctions.cpp:200 +msgid "hours" +msgstr "小時" + +#: src/OtherFunctions.cpp:198 +msgid "Days" +msgstr "日" + +#: src/OtherFunctions.cpp:230 src/muuli_wdr.cpp:233 +msgid "Videos" +msgstr "影片" + +#: src/OtherFunctions.cpp:244 src/muuli_wdr.cpp:227 +msgid "Archives" +msgstr "存檔" + +#: src/OtherFunctions.cpp:265 src/muuli_wdr.cpp:232 +msgid "Texts" +msgstr "文本" + +#: src/OtherFunctions.cpp:272 src/muuli_wdr.cpp:231 +msgid "Programs" +msgstr "程式" + +#: src/OtherFunctions.cpp:279 src/muuli_wdr.cpp:226 +msgid "Any" +msgstr "任何" + +#: src/OtherFunctions.cpp:336 src/OtherFunctions.cpp:342 src/muuli_wdr.cpp:918 +msgid "Not rated" +msgstr "未評價" + +#: src/OtherFunctions.cpp:337 src/muuli_wdr.cpp:919 +msgid "Invalid / Corrupt / Fake" +msgstr "無效 / 損壞 / 假冒" + +#: src/OtherFunctions.cpp:338 src/muuli_wdr.cpp:920 +msgid "Poor" +msgstr "差" + +#: src/OtherFunctions.cpp:339 src/muuli_wdr.cpp:921 +msgid "Fair" +msgstr "一般" + +#: src/OtherFunctions.cpp:340 src/muuli_wdr.cpp:922 +msgid "Good" +msgstr "好" + +#: src/OtherFunctions.cpp:341 src/muuli_wdr.cpp:923 +msgid "Excellent" +msgstr "優良" + +#: src/OtherFunctions.cpp:745 +msgid "all" +msgstr "所有" + +#: src/OtherFunctions.cpp:746 +msgid "all others" +msgstr "其它" + +#: src/IPFilter.cpp:109 +msgid "Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'." +msgstr "正在載入IP過濾文件 'ipfilter.dat' and 'ipfilter_static.dat'。" + +#: src/IPFilter.cpp:284 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', unknown format encountered." +msgstr "載入 ipfilter.dat 文件 '%s' 失敗,遇到未知格式。" + +#: src/IPFilter.cpp:325 +#, c-format +msgid "Failed to load ipfilter.dat file '%s', could not open file." +msgstr "載入 ipfilter.dat 文件 '%s' 失敗,無法打開文件。" + +#: src/IPFilter.cpp:330 +#, fuzzy, c-format +msgid "Loaded %u IP-range from '%s'." +msgid_plural "Loaded %u IP-ranges from '%s'." +msgstr[0] "載入 %u 個IP段自 %s,丟棄了 %u 行錯誤數據。" +msgstr[1] "載入 %u 個IP段自 %s,丟棄了 %u 行錯誤數據。" + +#: src/IPFilter.cpp:332 +#, fuzzy, c-format +msgid "%u malformed line was discarded." +msgid_plural "%u malformed lines were discarded." +msgstr[0] "載入 %u 個IP段自 %s,丟棄了 %u 行錯誤數據。" +msgstr[1] "載入 %u 個IP段自 %s,丟棄了 %u 行錯誤數據。" + +#: src/StatisticsDlg.cpp:189 +#, c-format +msgid "Active connections (1:%u)" +msgstr "作用中連線 (1:%u)" + +#: src/FileDetailDialog.cpp:59 +msgid "File Details" +msgstr "文件信息" + +#: src/FileDetailDialog.cpp:114 +#, c-format +msgid "%.2f%% done" +msgstr "%.2f%% 已完成" + +#: src/muuli_wdr.cpp:69 +msgid "ED2K Link: " +msgstr "ED2K 鏈接:" + +#: src/muuli_wdr.cpp:76 +msgid "Commit" +msgstr "確定" + +#: src/muuli_wdr.cpp:77 +msgid "" +"Click here to add the ed2k link in the text control to your download queue." +msgstr "請點擊這裏把輸入的ED2K鏈接加入下載隊列。" + +#: src/muuli_wdr.cpp:85 +msgid "Pop-up status text" +msgstr "彈出狀態顯示" + +#: src/muuli_wdr.cpp:88 +msgid "Loading ..." +msgstr "正在裝入..." + +#: src/muuli_wdr.cpp:89 +msgid "" +"Events are displayed here. For a complete list of events, refer to the log " +"in the Servers-tab." +msgstr "此處顯示系統事件。如需完整事件列表,請到服務器分頁。" + +#: src/muuli_wdr.cpp:97 +msgid "Number of users on the server you are connected to ..." +msgstr "目前伺服器上使用者數 ..." + +#: src/muuli_wdr.cpp:100 +msgid "Users: 0" +msgstr "使用者: 0" + +#: src/muuli_wdr.cpp:101 +msgid "" +"Users connected to the current server and an estimate of the total number of " +"users." +msgstr "當前服務器上的用戶和估算總用戶數。" + +#: src/muuli_wdr.cpp:113 +msgid "" +"Current average upload and download rates. If enabled the numbers in the " +"braces signify the overhead from client communication." +msgstr "當前平均上傳下載速度。括號中的值爲于其他用戶連接所消耗的帶寬。" + +#: src/muuli_wdr.cpp:121 +msgid "" +"Displays the connected status and active transfers. Red arrows signifies " +"that you are currently not connected, yellow arrows signify that you have " +"low ID (firewalled) and green arrows signify that you have high ID (The " +"optimal connection type)." +msgstr "" +"顯示當前連接狀態及當前傳送狀態。紅色箭頭表示未連接,黃色箭頭表示低ID,綠色箭" +"頭表示正常連接。" + +#: src/muuli_wdr.cpp:125 +msgid "Not Connected ..." +msgstr "未連線" + +#: src/muuli_wdr.cpp:126 +msgid "Currently connected server." +msgstr "現在已連接的服務器。" + +#: src/muuli_wdr.cpp:174 +msgid "Search" +msgstr "尋找" + +#: src/muuli_wdr.cpp:180 +msgid "Name:" +msgstr "名字:" + +#: src/muuli_wdr.cpp:193 src/SearchDlg.cpp:107 +msgid "Local" +msgstr "本地" + +#: src/muuli_wdr.cpp:194 +msgid "Global" +msgstr "全球" + +#: src/muuli_wdr.cpp:196 +msgid "FileHash" +msgstr "文件校驗碼" + +#: src/muuli_wdr.cpp:204 +msgid "Extended Parameters" +msgstr "附加參數" + +#: src/muuli_wdr.cpp:210 +msgid "Filtering" +msgstr "過濾" + +#: src/muuli_wdr.cpp:221 +msgid "File Type" +msgstr "文件類型" + +#: src/muuli_wdr.cpp:251 +msgid "Extension" +msgstr "副檔名" + +#: src/muuli_wdr.cpp:257 +msgid "Min Size" +msgstr "大小下限" + +#: src/muuli_wdr.cpp:267 src/muuli_wdr.cpp:290 +msgid "Bytes" +msgstr "字節" + +#: src/muuli_wdr.cpp:268 src/muuli_wdr.cpp:291 +msgid "KB" +msgstr "KB" + +#: src/muuli_wdr.cpp:280 +msgid "Max Size" +msgstr "大小上限" + +#: src/muuli_wdr.cpp:303 +msgid "Availability" +msgstr "最低源數" + +#: src/muuli_wdr.cpp:316 +msgid "Filter:" +msgstr "過濾:" + +#: src/muuli_wdr.cpp:325 +msgid "Filter Results" +msgstr "過濾結果" + +#: src/muuli_wdr.cpp:331 +msgid "Invert Result" +msgstr "反向排序結果" + +#: src/muuli_wdr.cpp:337 +msgid "Hide Known Files" +msgstr "隱藏已知文件" + +#: src/muuli_wdr.cpp:353 +msgid "More" +msgstr "其他" + +#: src/muuli_wdr.cpp:354 +msgid "Searches for more results on ED2K. Not supported for Kad yet." +msgstr "在 ED2K 上搜索更多結果,咱不支持 Kad" + +#: src/muuli_wdr.cpp:361 +msgid "Stop" +msgstr "停止" + +#: src/muuli_wdr.cpp:375 +msgid "Reset Fields" +msgstr "複位" + +#: src/muuli_wdr.cpp:390 +msgid "Results" +msgstr "搜索結果" + +#: src/muuli_wdr.cpp:428 +msgid "Clears completed downloads" +msgstr "清除已完成的文件" + +#: src/muuli_wdr.cpp:466 +msgid "Shows Upload / Up-queue" +msgstr "顯示上傳/隊列" + +#: src/muuli_wdr.cpp:475 +msgid "Clients on queue :" +msgstr "等候長度 :" + +#: src/muuli_wdr.cpp:478 +msgid "0" +msgstr "0" + +#: src/muuli_wdr.cpp:542 +msgid "Send" +msgstr "傳送" + +#: src/muuli_wdr.cpp:543 +msgid "Sends the specified message." +msgstr "發送指定短消息。" + +#: src/muuli_wdr.cpp:547 src/muuli_wdr.cpp:975 src/muuli_wdr.cpp:1592 +#: src/muuli_wdr.cpp:3875 src/MuleNotebook.cpp:155 +msgid "Close" +msgstr "關閉" + +#: src/muuli_wdr.cpp:548 +msgid "Close this chat-session." +msgstr "結束本次聊天。" + +#: src/muuli_wdr.cpp:581 +msgid "Full Name :" +msgstr "全名︰" + +#: src/muuli_wdr.cpp:584 src/muuli_wdr.cpp:595 src/muuli_wdr.cpp:606 +#: src/muuli_wdr.cpp:621 src/muuli_wdr.cpp:632 src/muuli_wdr.cpp:643 +#: src/muuli_wdr.cpp:666 src/muuli_wdr.cpp:677 src/muuli_wdr.cpp:688 +#: src/muuli_wdr.cpp:699 src/muuli_wdr.cpp:710 src/muuli_wdr.cpp:721 +#: src/muuli_wdr.cpp:732 src/muuli_wdr.cpp:745 src/muuli_wdr.cpp:752 +#: src/muuli_wdr.cpp:780 src/muuli_wdr.cpp:791 src/muuli_wdr.cpp:802 +#: src/muuli_wdr.cpp:1141 src/muuli_wdr.cpp:1152 src/muuli_wdr.cpp:1161 +#: src/muuli_wdr.cpp:1172 src/muuli_wdr.cpp:1181 src/muuli_wdr.cpp:1192 +#: src/muuli_wdr.cpp:1403 src/muuli_wdr.cpp:1407 src/muuli_wdr.cpp:1422 +#: src/muuli_wdr.cpp:1431 src/muuli_wdr.cpp:1438 src/muuli_wdr.cpp:1447 +#: src/muuli_wdr.cpp:1454 src/muuli_wdr.cpp:1463 src/muuli_wdr.cpp:1485 +#: src/muuli_wdr.cpp:1500 src/muuli_wdr.cpp:1509 src/muuli_wdr.cpp:1516 +#: src/muuli_wdr.cpp:1525 src/muuli_wdr.cpp:1532 src/muuli_wdr.cpp:1541 +#: src/muuli_wdr.cpp:1559 src/muuli_wdr.cpp:1568 src/muuli_wdr.cpp:1575 +#: src/muuli_wdr.cpp:1584 src/ClientListCtrl.cpp:620 +msgid "N/A" +msgstr "N/A" + +#: src/muuli_wdr.cpp:592 +msgid "met-File :" +msgstr "met 檔案" + +#: src/muuli_wdr.cpp:603 +msgid "Hash :" +msgstr "檢驗碼 :" + +#: src/muuli_wdr.cpp:618 +msgid "Filesize :" +msgstr "檔案大小 :" + +#: src/muuli_wdr.cpp:629 +msgid "Partfilestatus :" +msgstr "Part 檔案狀態 :" + +#: src/muuli_wdr.cpp:640 +msgid "Last seen complete :" +msgstr "最後發現完整分享的檔案 :" + +#: src/muuli_wdr.cpp:663 +msgid "Found Sources :" +msgstr "已發現源 :" + +#: src/muuli_wdr.cpp:674 +msgid "Transferring Sources :" +msgstr "正在傳輸的源 :" + +# fuzzy +#: src/muuli_wdr.cpp:685 +msgid "Filepart-Count :" +msgstr "檔案部分數 :" + +# fuzzy +#: src/muuli_wdr.cpp:696 +msgid "Available :" +msgstr "可用 :" + +#: src/muuli_wdr.cpp:707 +msgid "Datarate :" +msgstr "資料率 :" + +#: src/muuli_wdr.cpp:718 +msgid "Download Active Time: " +msgstr "下載活動時間:" + +#: src/muuli_wdr.cpp:729 src/muuli_wdr.cpp:1178 src/muuli_wdr.cpp:1189 +msgid "Transferred :" +msgstr "已傳輸" + +#: src/muuli_wdr.cpp:740 +msgid "Completed Size :" +msgstr "已完成大小 :" + +#: src/muuli_wdr.cpp:767 src/muuli_wdr.cpp:2076 +msgid "Intelligent Corruption Handling" +msgstr "智慧資料損壞處理 (ICH)" + +#: src/muuli_wdr.cpp:777 +msgid "Lost to corruption :" +msgstr "因資料損壞而丟失 :" + +#: src/muuli_wdr.cpp:788 +msgid "Gained by compression :" +msgstr "壓縮效益 :" + +#: src/muuli_wdr.cpp:799 +msgid "Packages saved by I.C.H. :" +msgstr "由 ICH 挽救的資料包 :" + +#: src/muuli_wdr.cpp:819 +msgid "File Names" +msgstr "文件名" + +#: src/muuli_wdr.cpp:833 +msgid "Takeover" +msgstr "接管" + +#: src/muuli_wdr.cpp:843 +msgid "Cleanup" +msgstr "清除" + +#: src/muuli_wdr.cpp:857 src/muuli_wdr.cpp:933 +msgid "Apply" +msgstr "套用" + +#: src/muuli_wdr.cpp:862 +msgid "Ok" +msgstr "確定" + +#: src/muuli_wdr.cpp:891 +msgid "Comment/Rate file (Text will be visible to all users)" +msgstr "注釋/率 文件(文本將對全部用戶可見)" + +#: src/muuli_wdr.cpp:905 +msgid "" +"For a film you can say its length, its story, language ...\n" +"and if it's a fake, you can tell that to other users of aMule." +msgstr "" +"您可以說明電影的長度,情節和語言等等...\n" +"如果電影是假冒的,您可以提醒其它使用者。" + +#: src/muuli_wdr.cpp:913 +msgid "File Quality" +msgstr "檔案品質" + +#: src/muuli_wdr.cpp:928 +msgid "Choose the file rating or advice users if the file is invalid ..." +msgstr "選擇檔案評價或者提醒其它使用者該檔案是無效的" + +#: src/muuli_wdr.cpp:965 +msgid "No comment(s)" +msgstr "無註釋" + +#: src/muuli_wdr.cpp:972 +msgid "Refresh" +msgstr "重新整理" + +#: src/muuli_wdr.cpp:999 +msgid "Downloading, please wait ..." +msgstr "正在下載,請等待 ..." + +#: src/muuli_wdr.cpp:1005 +msgid "Unknown size" +msgstr "未知大小" + +#: src/muuli_wdr.cpp:1029 +msgid "Required Information" +msgstr "要求的訊息" + +#: src/muuli_wdr.cpp:1034 +msgid "IP Address :" +msgstr "IP 位址︰" + +#: src/muuli_wdr.cpp:1040 +msgid "Port :" +msgstr "連接埠︰" + +#: src/muuli_wdr.cpp:1050 +msgid "Additional Information" +msgstr "附加訊息" + +#: src/muuli_wdr.cpp:1055 +msgid "Username :" +msgstr "使用者名稱︰" + +#: src/muuli_wdr.cpp:1061 +msgid "Userhash :" +msgstr "使用者編碼" + +#: src/muuli_wdr.cpp:1107 +msgid "Reload your shared files" +msgstr "刷新共享文件" + +#: src/muuli_wdr.cpp:1124 +msgid "Current Session" +msgstr "本次執行" + +#: src/muuli_wdr.cpp:1131 +msgid "Total" +msgstr "總和" + +#: src/muuli_wdr.cpp:1138 src/muuli_wdr.cpp:1149 +msgid "Requested :" +msgstr "已請求 :" + +#: src/muuli_wdr.cpp:1158 src/muuli_wdr.cpp:1169 +msgid "Active Uploads :" +msgstr "作用中上傳 :" + +#: src/muuli_wdr.cpp:1216 +msgid "Download-Speed" +msgstr "下載速度" + +#: src/muuli_wdr.cpp:1234 src/muuli_wdr.cpp:1283 src/muuli_wdr.cpp:3198 +msgid "Current" +msgstr "目前" + +#: src/muuli_wdr.cpp:1245 src/muuli_wdr.cpp:1294 src/muuli_wdr.cpp:3209 +msgid "Running average" +msgstr "動態平平均值" + +#: src/muuli_wdr.cpp:1256 src/muuli_wdr.cpp:1305 src/muuli_wdr.cpp:3220 +msgid "Session average" +msgstr "本次執行平平均值" + +#: src/muuli_wdr.cpp:1265 +msgid "Upload-Speed" +msgstr "上傳速度" + +#: src/muuli_wdr.cpp:1314 src/muuli_wdr.cpp:1744 +msgid "Connections" +msgstr "連接" + +#: src/muuli_wdr.cpp:1332 src/muuli_wdr.cpp:2287 +msgid "Active downloads" +msgstr "作用中下載" + +#: src/muuli_wdr.cpp:1343 +msgid "Active connections (1:1)" +msgstr "作用中連線 (1:1)" + +#: src/muuli_wdr.cpp:1354 src/muuli_wdr.cpp:2288 +msgid "Active uploads" +msgstr "作用中上傳" + +#: src/muuli_wdr.cpp:1363 src/muuli_wdr.cpp:2304 +msgid "Statistics Tree" +msgstr "統計樹" + +#: src/muuli_wdr.cpp:1393 src/muuli_wdr.cpp:3672 +msgid "Username:" +msgstr "使用者名稱︰" + +#: src/muuli_wdr.cpp:1396 +msgid "Userhash:" +msgstr "用戶編碼" + +#: src/muuli_wdr.cpp:1419 +msgid "Client software:" +msgstr "客戶軟件 :" + +#: src/muuli_wdr.cpp:1428 +msgid "Client version:" +msgstr "客戶軟件版本 :" + +#: src/muuli_wdr.cpp:1435 +msgid "IP address:" +msgstr "IP 地址:" + +#: src/muuli_wdr.cpp:1444 +msgid "User ID:" +msgstr "用戶ID: " + +#: src/muuli_wdr.cpp:1451 +msgid "Server IP:" +msgstr "服務器 IP :" + +#: src/muuli_wdr.cpp:1460 +msgid "Server name:" +msgstr "服務器名稱" + +#: src/muuli_wdr.cpp:1471 +msgid "Transfers to client" +msgstr "上傳" + +#: src/muuli_wdr.cpp:1478 +msgid "Current request:" +msgstr "當前請求:" + +#: src/muuli_wdr.cpp:1497 +msgid "Average upload rate:" +msgstr "平均上傳速度 :" + +#: src/muuli_wdr.cpp:1506 +msgid "Average download rate:" +msgstr "平均下載速度 :" + +#: src/muuli_wdr.cpp:1513 +msgid "Uploaded (session):" +msgstr "上傳 (本次運行) :" + +#: src/muuli_wdr.cpp:1522 +msgid "Downloaded (session):" +msgstr "下載 (本次運行) :" + +#: src/muuli_wdr.cpp:1529 +msgid "Uploaded (total):" +msgstr "上傳總量 :" + +#: src/muuli_wdr.cpp:1538 +msgid "Downloaded (total):" +msgstr "下載總量 :" + +#: src/muuli_wdr.cpp:1549 +msgid "Scores" +msgstr "分數" + +#: src/muuli_wdr.cpp:1556 +msgid "DL/UP modifier:" +msgstr "下載/上傳 比率 :" + +#: src/muuli_wdr.cpp:1565 +msgid "Secure ident:" +msgstr "安全 Ident :" + +#: src/muuli_wdr.cpp:1572 +msgid "Rating (total):" +msgstr "評級 (總和) :" + +#: src/muuli_wdr.cpp:1581 +msgid "Queue score:" +msgstr "隊列積分:" + +#: src/muuli_wdr.cpp:1616 +msgid "General Settings" +msgstr "綜合設置" + +#: src/muuli_wdr.cpp:1623 +msgid "Nick" +msgstr "暱稱" + +#: src/muuli_wdr.cpp:1626 +msgid "http://www.aMule.org - the Linux Mule" +msgstr "http://www.aMule.org - the Linux Mule" + +#: src/muuli_wdr.cpp:1627 +msgid "This is the name that other users will see when connecting to you." +msgstr "這是其他用戶看到的名字。" + +#: src/muuli_wdr.cpp:1632 +msgid "Language" +msgstr "語言" + +#: src/muuli_wdr.cpp:1637 +msgid "This specifies the language used on controls." +msgstr "選擇界面語言。" + +#: src/muuli_wdr.cpp:1644 +msgid "Misc Options" +msgstr "其它選項" + +#: src/muuli_wdr.cpp:1648 +msgid "Check for new version at startup" +msgstr "啓動時檢查新版本" + +#: src/muuli_wdr.cpp:1649 +msgid "Enabling this will make aMule check for new version at startup" +msgstr "啓用此選項將讓 aMule 啓動時檢查新版本" + +#: src/muuli_wdr.cpp:1652 +msgid "Start minimized" +msgstr "啟動后縮到最小" + +#: src/muuli_wdr.cpp:1653 +msgid "Enabling this makes aMule minimize itself upon start." +msgstr "啓用後 aMule 啓動後立即最小化。" + +#: src/muuli_wdr.cpp:1656 +msgid "Prompt on exit" +msgstr "離開時確認" + +#: src/muuli_wdr.cpp:1658 +msgid "Makes aMule promt before exiting." +msgstr "退出前確認。" + +#: src/muuli_wdr.cpp:1661 +msgid "Enable Tray Icon" +msgstr "啓用狀態欄圖標" + +#: src/muuli_wdr.cpp:1662 +msgid "This Enables/Disables the system tray (or taskbar) icon." +msgstr "啓用/禁用系統狀態欄圖標。" + +#: src/muuli_wdr.cpp:1665 +msgid "Minimize to Tray Icon" +msgstr "最小化至系統狀態欄圖標" + +#: src/muuli_wdr.cpp:1666 +msgid "" +"Enabling this will make aMule minimize to the System Tray, rather than the " +"taskbar." +msgstr "啓用此選項將使 aMule 最小化到系統狀態欄,而不是任務欄。" + +#: src/muuli_wdr.cpp:1671 +msgid "Tooltip Delay Time in secs" +msgstr "提示延遲時間秒數" + +#: src/muuli_wdr.cpp:1672 src/muuli_wdr.cpp:1676 +msgid "The delay before showing tool-tips." +msgstr "顯示提示的延遲時間。" + +#: src/muuli_wdr.cpp:1683 +msgid "Browser Selection" +msgstr "浏覽器選擇" + +#: src/muuli_wdr.cpp:1688 +msgid "Konqueror" +msgstr "Konqueror" + +#: src/muuli_wdr.cpp:1689 +msgid "Mozilla" +msgstr "Mozilla" + +#: src/muuli_wdr.cpp:1690 +msgid "Firefox" +msgstr "Firefox" + +#: src/muuli_wdr.cpp:1691 +msgid "Firebird" +msgstr "Firebird" + +#: src/muuli_wdr.cpp:1692 +msgid "Opera" +msgstr "Opera" + +#: src/muuli_wdr.cpp:1693 +msgid "Netscape" +msgstr "Netscape" + +#: src/muuli_wdr.cpp:1694 +msgid "Galeon" +msgstr "Galeon" + +#: src/muuli_wdr.cpp:1695 +msgid "Epiphany" +msgstr "Epiphany" + +#: src/muuli_wdr.cpp:1699 +msgid "Select your browser here" +msgstr "請選擇您的網絡瀏覽器" + +#: src/muuli_wdr.cpp:1705 +msgid "Custom Browser:" +msgstr "其它瀏覽器" + +#: src/muuli_wdr.cpp:1709 +msgid "" +"Enter your browser name here. To use the custom browser, select the Custom " +"menu-item from the dropdown-menu above." +msgstr "" +"請輸入網絡浏覽器名稱。如需使用自定義浏覽器,在以上彈出菜單中選擇自定義。" + +#: src/muuli_wdr.cpp:1718 +msgid "Open in new tab if possible" +msgstr "在新分頁中打開" + +#: src/muuli_wdr.cpp:1720 +msgid "Open the web page in a new tab instead of in a new window when possible" +msgstr "如果可能的話在新的分頁中打開而不是新的窗口" + +#: src/muuli_wdr.cpp:1751 +msgid "Bandwith Limits" +msgstr "頻寬限制" + +#: src/muuli_wdr.cpp:1767 src/muuli_wdr.cpp:1811 +msgid "Upload" +msgstr "上傳" + +#: src/muuli_wdr.cpp:1780 +msgid "Slot Allocation" +msgstr "空擋分派" + +#: src/muuli_wdr.cpp:1795 +msgid "Line Capacities" +msgstr "連線容量" + +#: src/muuli_wdr.cpp:1825 +msgid "" +"Note: These values are\n" +"only used for statistics." +msgstr "" + +#: src/muuli_wdr.cpp:1835 +msgid "Standard client TCP Port:" +msgstr "標准客戶端 TCP 端口" + +#: src/muuli_wdr.cpp:1839 +msgid "This is the standard ED2K port and cannot be disabled." +msgstr "這是標准 ED2K 端口,不能被禁用" + +#: src/muuli_wdr.cpp:1844 +msgid "Extended client UDP Port:" +msgstr "擴展客戶端 UDP 端口" + +#: src/muuli_wdr.cpp:1848 +msgid "This UDP port is used for extended Ed2K requests and Kad network" +msgstr "此 UDP 端口用于擴展的 Ed2k 請求和 Kad 網絡" + +#: src/muuli_wdr.cpp:1851 +msgid "disable" +msgstr "停用" + +#: src/muuli_wdr.cpp:1858 +msgid "Bind Address" +msgstr "綁定地址" + +#: src/muuli_wdr.cpp:1869 +msgid "UDP port for extended server requests (TCP+3): 4665" +msgstr "用于擴展的服務器請求的 UDP 端口 (TCP+3): 4665" + +#: src/muuli_wdr.cpp:1876 +msgid "Max Sources per File" +msgstr "單個檔案最大源數" + +#: src/muuli_wdr.cpp:1883 +msgid "Hard Limit" +msgstr "絕對上限" + +#: src/muuli_wdr.cpp:1895 +msgid "Connection Limits" +msgstr "連線限制" + +#: src/muuli_wdr.cpp:1902 +msgid "Max Connections" +msgstr "最大連線數" + +#: src/muuli_wdr.cpp:1935 +msgid "Kademlia" +msgstr "Kad" + +#: src/muuli_wdr.cpp:1943 +msgid "Universal Plug and Play" +msgstr "通用即插即用(UPnP)" + +#: src/muuli_wdr.cpp:1946 +msgid "Enable UPnP" +msgstr "啓用 UPnP" + +#: src/muuli_wdr.cpp:1951 +msgid "UPnP TCP Port:" +msgstr "UPnP TCP 端口" + +#: src/muuli_wdr.cpp:1962 +msgid "Autoconnect on startup" +msgstr "啟動后自動連線" + +#: src/muuli_wdr.cpp:1965 +msgid "Reconnect on loss" +msgstr "斷線后自動重接" + +#: src/muuli_wdr.cpp:1969 +msgid "Show overhead bandwith" +msgstr "顯示頻寬浪費" + +#: src/muuli_wdr.cpp:1999 +msgid "Server Options" +msgstr "服務器選項" + +#: src/muuli_wdr.cpp:2004 +msgid "Remove dead server after" +msgstr "移除無法連線伺服器如果" + +#: src/muuli_wdr.cpp:2010 +msgid "retries" +msgstr "次連線失敗" + +#: src/muuli_wdr.cpp:2017 +msgid "Auto-update serverlist at startup" +msgstr "啟動后自動更新伺服器清單" + +#: src/muuli_wdr.cpp:2020 +msgid "List" +msgstr "清單" + +#: src/muuli_wdr.cpp:2025 +msgid "Update serverlist when connecting to a server" +msgstr "與伺服器連線時更新伺服器清單" + +#: src/muuli_wdr.cpp:2028 +msgid "Update serverlist when a client connect" +msgstr "與其它使用者連線時更新伺服器清單" + +#: src/muuli_wdr.cpp:2031 +msgid "Use priority system" +msgstr "啟用優先等級系統" + +#: src/muuli_wdr.cpp:2035 +msgid "Use smart LowID check on connect" +msgstr "連線時啟用智慧低ID偵測" + +#: src/muuli_wdr.cpp:2039 +msgid "Safe connect" +msgstr "安全連線" + +#: src/muuli_wdr.cpp:2043 +msgid "Autoconnect to servers in static list only" +msgstr "只自動連線到靜態伺服器清單裡的伺服器" + +#: src/muuli_wdr.cpp:2046 +msgid "Set manually added servers to High Priority" +msgstr "設定使用者輸入的伺服器為高優先等級" + +#: src/muuli_wdr.cpp:2079 +msgid "I.C.H. active" +msgstr "I.C.H 已啟用" + +#: src/muuli_wdr.cpp:2083 +msgid "AICH trusts every hash (not recomended)" +msgstr "高級智能損壞數據處理(AICH)信任所有校驗碼(建議不要使用)" + +#: src/muuli_wdr.cpp:2091 +msgid "Add files to download in pause mode" +msgstr "加入新下載檔案時設為暫停狀態" + +#: src/muuli_wdr.cpp:2094 +msgid "Add files to download with auto priority" +msgstr "加入新下載檔案時設優先等級為自動狀態" + +#: src/muuli_wdr.cpp:2097 +msgid "Try to download first and last chunks first" +msgstr "嘗試先下載檔案的第一段和最後一段" + +#: src/muuli_wdr.cpp:2101 +msgid "Add new shared files with auto priority" +msgstr "加入新分享的檔案時設優先等級為自動狀態" + +#: src/muuli_wdr.cpp:2104 +msgid "Try to transfer full chunks to all uploads" +msgstr "嘗試傳送完整資料段給所有使用者" + +#: src/muuli_wdr.cpp:2108 +msgid "Start next paused file when a file completed" +msgstr "檔案下載完畢是開始下一個暫停的檔案" + +#: src/muuli_wdr.cpp:2112 +msgid "From the same category" +msgstr "來自同一分類" + +#: src/muuli_wdr.cpp:2115 +msgid "Save 10 sources on rare files (< 20 sources)" +msgstr "保存稀有文件(少于20個源)的10個源" + +#: src/muuli_wdr.cpp:2121 +msgid "Disk Space" +msgstr "硬碟空間" + +#: src/muuli_wdr.cpp:2124 +msgid "Check Disk Space" +msgstr "檢查硬碟空間" + +#: src/muuli_wdr.cpp:2125 +msgid "Select this if you want aMule to check your Disk Space" +msgstr "這個選項使aMule檢查硬碟空間" + +#: src/muuli_wdr.cpp:2132 +msgid "Min Disk Space:" +msgstr "最低磁盤空間:" + +#: src/muuli_wdr.cpp:2136 +msgid "Enter here the min disk space desired." +msgstr "請輸入最低硬碟空間." + +#: src/muuli_wdr.cpp:2139 +msgid "Mb" +msgstr "Mb" + +#: src/muuli_wdr.cpp:2170 +msgid "Incoming Directory :" +msgstr "接收資料夾 :" + +#: src/muuli_wdr.cpp:2181 +msgid "Temporary Directory :" +msgstr "暫時檔案夾" + +#: src/muuli_wdr.cpp:2192 +msgid "Shared Directories" +msgstr "共享的資料夾" + +#: src/muuli_wdr.cpp:2195 +msgid "(Right click on folder icon for recursive share)" +msgstr "(鼠標右鍵單擊文件夾圖標來遞歸共享)" + +#: src/muuli_wdr.cpp:2202 +msgid "Share hidden files" +msgstr "共享隱藏文件" + +#: src/muuli_wdr.cpp:2208 +msgid "Video Player" +msgstr "影片播放器" + +#: src/muuli_wdr.cpp:2221 +msgid "Create Backup to preview" +msgstr "預覽前備份檔案" + +#: src/muuli_wdr.cpp:2250 +msgid "Graphs" +msgstr "圖表" + +#: src/muuli_wdr.cpp:2253 src/muuli_wdr.cpp:2307 +msgid "Update delay : 5 secs" +msgstr "重新整理延遲 : 5 秒" + +#: src/muuli_wdr.cpp:2259 +msgid "Time for average graph: 100 mins" +msgstr "平平均值圖表顯示時間: 100 分鐘" + +#: src/muuli_wdr.cpp:2265 +msgid "Connections Graph Scale: 100 " +msgstr "連線圖表尺寸: 100 " + +#: src/muuli_wdr.cpp:2271 +msgid "Select Statistics Colors" +msgstr "選擇統計圖表使用色彩" + +#: src/muuli_wdr.cpp:2278 +msgid "Background" +msgstr "背景" + +#: src/muuli_wdr.cpp:2279 +msgid "Grid" +msgstr "網格" + +#: src/muuli_wdr.cpp:2280 +msgid "Download current" +msgstr "目前下載" + +#: src/muuli_wdr.cpp:2281 +msgid "Download running average" +msgstr "動態平均下載" + +#: src/muuli_wdr.cpp:2282 +msgid "Download session average" +msgstr "本次執行平均下載" + +#: src/muuli_wdr.cpp:2283 +msgid "Upload current" +msgstr "目前上傳" + +#: src/muuli_wdr.cpp:2284 +msgid "Upload running average" +msgstr "動態平均上傳" + +#: src/muuli_wdr.cpp:2285 +msgid "Upload session average" +msgstr "本次執行平均上傳" + +#: src/muuli_wdr.cpp:2286 +msgid "Active connections" +msgstr "作用中連線" + +#: src/muuli_wdr.cpp:2289 +msgid "Systray Icon Speedbar" +msgstr "系統狀態列圖示速度顯示" + +#: src/muuli_wdr.cpp:2290 +msgid "Kad-nodes current" +msgstr "當前 Kad 節點" + +#: src/muuli_wdr.cpp:2291 +msgid "Kad-nodes running" +msgstr "運行的 Kad 節點" + +#: src/muuli_wdr.cpp:2292 +msgid "Kad-nodes session" +msgstr "本次運行的 Kad 節點" + +#: src/muuli_wdr.cpp:2297 src/muuli_wdr.cpp:2884 +msgid "Select" +msgstr "選擇" + +#: src/muuli_wdr.cpp:2315 +msgid "Number of Client Versions shown (0=unlimited)" +msgstr "顯示客戶端版本的數量(0代表不限制)" + +#: src/muuli_wdr.cpp:2344 +msgid "Notifications" +msgstr "通知" + +#: src/muuli_wdr.cpp:2349 +msgid "Messages popup" +msgstr "訊息跳出" + +#: src/muuli_wdr.cpp:2352 +msgid "Use sound" +msgstr "啟用聲音" + +#: src/muuli_wdr.cpp:2370 +msgid "Pop out when :" +msgstr "以下情況跳出視窗 :" + +#: src/muuli_wdr.cpp:2373 +msgid "New entry on log" +msgstr "日誌中加入了新內容" + +#: src/muuli_wdr.cpp:2377 +msgid "Starts a new chat session" +msgstr "開始新的短訊息對話" + +#: src/muuli_wdr.cpp:2381 +msgid "A new chat message is received" +msgstr "收到新短訊息" + +#: src/muuli_wdr.cpp:2385 +msgid "A download is added or finished" +msgstr "加入或完成了下載檔案" + +#: src/muuli_wdr.cpp:2389 +msgid "New aMule version detected" +msgstr "發現新 aMule 版本" + +#: src/muuli_wdr.cpp:2393 +msgid "Urgent OOD, serverconnection lost" +msgstr "硬碟已滿, 伺服器連線已斷" + +#: src/muuli_wdr.cpp:2402 +msgid "Notify by Mail" +msgstr "信件知會" + +#: src/muuli_wdr.cpp:2405 +msgid "Send an Email when transfer complete." +msgstr "下載完成后用電子信件知會" + +#: src/muuli_wdr.cpp:2412 +msgid "SMTP server :" +msgstr "電郵伺服器 :" + +#: src/muuli_wdr.cpp:2419 +msgid "Email Address :" +msgstr "電郵位址 :" + +#: src/muuli_wdr.cpp:2459 +msgid "!!! WARNING !!!" +msgstr "!!! 警告 !!!" + +#: src/muuli_wdr.cpp:2465 +msgid "" +"Do not change these setting unless you know\n" +"what you are doing, otherwise you can easily\n" +"make things worse for yourself.\n" +"\n" +"aMule will run fine without adjusting any of\n" +"these settings." +msgstr "" +"注意︰如果你不清楚以下設定的含義請不要隨意變更,\n" +"否則你可能弄巧成拙。即使不改動這些設定,aMule\n" +"也完全可以正常執行。" + +#: src/muuli_wdr.cpp:2472 +msgid "Advanced Settings" +msgstr "高級設置" + +#: src/muuli_wdr.cpp:2475 +msgid "Max new connections / 5 secs" +msgstr "5 秒內最大新連線數" + +#: src/muuli_wdr.cpp:2481 +msgid "File Buffer Size: 240000 bytes" +msgstr "檔案緩衝: 24000 bytes" + +#: src/muuli_wdr.cpp:2487 +msgid "Upload Queue Size: 5000 clients" +msgstr "上傳等候長度: 5000 使用者" + +#: src/muuli_wdr.cpp:2493 +msgid "Server connection refresh interval: Disable" +msgstr "伺服器連線重新整理週期: 停用" + +#: src/muuli_wdr.cpp:2521 +msgid "GUI Tweaks" +msgstr "界面設定" + +#: src/muuli_wdr.cpp:2526 +msgid "Download Queue Files Progress" +msgstr "下載等候檔案進度" + +#: src/muuli_wdr.cpp:2529 +msgid "Show percentage" +msgstr "顯示百分值" + +#: src/muuli_wdr.cpp:2533 +msgid "Show progressbar " +msgstr "顯示處理序條" + +#: src/muuli_wdr.cpp:2539 +msgid "Progressbar Style" +msgstr "處理序條風格" + +#: src/muuli_wdr.cpp:2549 +msgid "Flat" +msgstr "平" + +#: src/muuli_wdr.cpp:2552 +msgid "Round" +msgstr "圓弧" + +#: src/muuli_wdr.cpp:2563 +msgid "Skin Support" +msgstr "皮膚支持" + +#: src/muuli_wdr.cpp:2566 +msgid "Enable skin support " +msgstr "啓用皮膚支持" + +#: src/muuli_wdr.cpp:2569 +msgid "Skin:" +msgstr "皮膚:" + +#: src/muuli_wdr.cpp:2574 +msgid "- no skins available -" +msgstr "- 沒有皮膚可用 -" + +#: src/muuli_wdr.cpp:2583 +msgid "Column Sorting" +msgstr "列排序" + +#: src/muuli_wdr.cpp:2586 +msgid "Auto-sort files in the download queue (high CPU)" +msgstr "自動排列下載隊列中的文件 (大CPU用量)" + +#: src/muuli_wdr.cpp:2588 +msgid "aMule will sort the columns in your download list automatically" +msgstr "自動逐列排序" + +#: src/muuli_wdr.cpp:2593 +msgid "Misc Gui Tweaks" +msgstr "使用者界面特殊設定" + +#: src/muuli_wdr.cpp:2596 +msgid "Show Fast ED2K Links Handler" +msgstr "顯示快捷 ED2K 連結處理" + +#: src/muuli_wdr.cpp:2600 +msgid "Show extended info on categories tabs" +msgstr "在分類頁中顯示附加信息" + +#: src/muuli_wdr.cpp:2604 +msgid "Show transfer rates on title" +msgstr "標題欄顯示傳送速度" + +#: src/muuli_wdr.cpp:2608 +msgid "Vertical toolbar orientation" +msgstr "垂直顯示工具欄" + +#: src/muuli_wdr.cpp:2611 +msgid "Show part file number before file name" +msgstr "在文件名前顯示 part 文件編號" + +#: src/muuli_wdr.cpp:2637 +msgid "Remote Control" +msgstr "遠程控制" + +#: src/muuli_wdr.cpp:2642 +msgid "Webserver Parameters" +msgstr "Web 伺服器參數" + +#: src/muuli_wdr.cpp:2645 +msgid "Run amuleweb on startup" +msgstr "開啓時運行 Web 服務器" + +#: src/muuli_wdr.cpp:2650 +msgid "Webserver port" +msgstr "Web 伺服器連接埠" + +#: src/muuli_wdr.cpp:2658 +msgid "Enable UPnP port forwarding on the Webserver port" +msgstr "在 Web 服務器端口上啓動 UPnP 端口轉發" + +#: src/muuli_wdr.cpp:2663 +msgid "Webserver UPnP TCP port" +msgstr "Web 服務器 UPnP TCP 端口" + +#: src/muuli_wdr.cpp:2673 +msgid "Page Refresh Time (in secs)" +msgstr "頁重新整理週期 (秒)" + +#: src/muuli_wdr.cpp:2681 +msgid "Enable Gzip compression" +msgstr "啟用 Gzip 壓縮" + +#: src/muuli_wdr.cpp:2685 +msgid "Enable Low rights User" +msgstr "啟用低權限使用者" + +#: src/muuli_wdr.cpp:2692 +msgid "Full rights password" +msgstr "絕對權限使用者" + +#: src/muuli_wdr.cpp:2698 +msgid "Low rights password" +msgstr "低權限使用者密碼" + +#: src/muuli_wdr.cpp:2704 +msgid "Web template" +msgstr "Web 模板" + +#: src/muuli_wdr.cpp:2715 +msgid "External Connection Parameters" +msgstr "外部連線參數" + +#: src/muuli_wdr.cpp:2718 +msgid "Accept external connections" +msgstr "接收外部連線" + +#: src/muuli_wdr.cpp:2736 +msgid "" +"IP of the listening interface\n" +"(empty for any)" +msgstr "" +"監聽接口的 IP\n" +"(留空則監聽全部)" + +#: src/muuli_wdr.cpp:2741 +msgid "" +"Enter here a valid ip in the a.b.c.d format for the listening EC interface. " +"An empty field or 0.0.0.0 will mean any interface." +msgstr "在此輸入正確的IP(格式:a.b.c.d)用于監聽外部連接接口。" + +#: src/muuli_wdr.cpp:2748 +msgid "TCP port" +msgstr "TCP 端口" + +#: src/muuli_wdr.cpp:2756 +msgid "Enable UPnP port forwarding on the EC port" +msgstr "在外部連接端口啓用 UPnP 端口轉發" + +#: src/muuli_wdr.cpp:2793 +msgid "Click here to apply any changes made to the preferences." +msgstr "點擊這裏立即使用新的設置。" + +#: src/muuli_wdr.cpp:2797 +msgid "Reset any changes made to the preferences." +msgstr "取消所有設置改動。" + +#: src/muuli_wdr.cpp:2821 +msgid "Title :" +msgstr "標題 :" + +#: src/muuli_wdr.cpp:2831 +msgid "Comment :" +msgstr "註釋 :" + +#: src/muuli_wdr.cpp:2841 +msgid "Incoming Dir :" +msgstr "接收資料夾" + +#: src/muuli_wdr.cpp:2847 +msgid "..." +msgstr "..." + +#: src/muuli_wdr.cpp:2854 +msgid "Change priority for new assigned files :" +msgstr "設定新加入的檔案優先等級為 :" + +#: src/muuli_wdr.cpp:2859 +msgid "Dont change" +msgstr "不要改變" + +#: src/muuli_wdr.cpp:2873 +msgid "Select color for this Category (currently selected) :" +msgstr "選擇該類別色彩 (目前選擇) :" + +#: src/muuli_wdr.cpp:2945 +msgid "Display server motd when connected ..." +msgstr "連線后顯示伺服器當日通告" + +#: src/muuli_wdr.cpp:2948 src/muuli_wdr.cpp:3096 +msgid "Server Info" +msgstr "伺服器訊息" + +#: src/muuli_wdr.cpp:2959 src/muuli_wdr.cpp:2994 +msgid "Click this button to reset the log." +msgstr "按此按鈕清空日志." + +#: src/muuli_wdr.cpp:2983 src/muuli_wdr.cpp:3092 +msgid "aMule Log" +msgstr "aMule 日誌" + +#: src/muuli_wdr.cpp:3016 +msgid "Click on this button to update the servers list from URL ..." +msgstr "按此按鈕從該網址更新伺服器清單 ..." + +#: src/muuli_wdr.cpp:3020 +msgid "Serverlist" +msgstr "伺服器清單" + +#: src/muuli_wdr.cpp:3025 +msgid "" +"Enter the url to a server.met file here and press the button to the left to " +"update the list of known servers." +msgstr "輸入server.met文件的URL然後按這個按鈕更新服務器列表。" + +#: src/muuli_wdr.cpp:3032 +msgid "Manual Server Add : Name" +msgstr "加入伺服器: 名稱" + +#: src/muuli_wdr.cpp:3036 +msgid "Enter the name of the new server here" +msgstr "輸入新服務器的名稱" + +#: src/muuli_wdr.cpp:3043 +msgid "Enter the IP of the server here, using the x.x.x.x format." +msgstr "輸入新服務器的IP地址(x.x.x.x格式)。" + +#: src/muuli_wdr.cpp:3046 +msgid ":" +msgstr ":" + +#: src/muuli_wdr.cpp:3050 +msgid "Enter the port of the server here." +msgstr "請輸入服務器端口" + +# fuzzy +#: src/muuli_wdr.cpp:3054 +msgid "Add manually a server (fill fields to the left before) ..." +msgstr "手動加入新伺服器 (添入左側空格) ..." + +#: src/muuli_wdr.cpp:3100 src/muuli_wdr.cpp:3317 +msgid "ED2K Info" +msgstr "ED2K 信息" + +#: src/muuli_wdr.cpp:3104 src/muuli_wdr.cpp:3899 +msgid "Kad Info" +msgstr "Kad 信息" + +#: src/muuli_wdr.cpp:3126 +msgid "" +"The selected locale seems not to be installed on your box\n" +"You must generate it to use this language.\n" +"A good start on linux systems is the file /etc/locale.gen and the package " +"'locales'\n" +"Good luck!\n" +"(Note: I'll try to set it anyway)" +msgstr "" +"您所選擇的地區設定在您的計算機上似乎沒有安裝\n" +"您需要先產生它.您可以在/etc/locale.gen檔案和locales套裝軟體開始,祝您好運!無論" +"如何,我還是會先嘗試你所選擇的地區設定。" + +#: src/muuli_wdr.cpp:3136 +msgid "Never show this again" +msgstr "下次不需要再顯示" + +#: src/muuli_wdr.cpp:3166 +msgid "Click on this button to update the nodes list from URL ..." +msgstr "按此更新節點列表自網址..." + +#: src/muuli_wdr.cpp:3170 +msgid "Nodes (0)" +msgstr "節點(0)" + +#: src/muuli_wdr.cpp:3175 +msgid "" +"Enter the url to a nodes.dat file here and press the button to the left to " +"update the list of known nodes." +msgstr "輸入 nodes.dat 文件的地址並按左邊的按鈕以更新已知節點列表" + +#: src/muuli_wdr.cpp:3180 +msgid "Nodes stats" +msgstr "節點狀態" + +#: src/muuli_wdr.cpp:3231 +msgid "Bootstrap" +msgstr "啓動" + +#: src/muuli_wdr.cpp:3234 +msgid "New node" +msgstr "新節點" + +#: src/muuli_wdr.cpp:3239 +msgid "IP:" +msgstr "IP地址:" + +#: src/muuli_wdr.cpp:3268 +msgid "Port:" +msgstr "端口:" + +#: src/muuli_wdr.cpp:3285 +msgid "" +"Bootstrap from \n" +"known clients" +msgstr "從已知客戶端啓動" + +#: src/muuli_wdr.cpp:3291 +msgid "Disconnect Kad" +msgstr "斷開 Kad" + +#: src/muuli_wdr.cpp:3349 +msgid "Protocol Obfuscation" +msgstr "模糊協議" + +#: src/muuli_wdr.cpp:3352 +msgid "Support Protocol Obfuscation" +msgstr "支持模糊協議" + +#: src/muuli_wdr.cpp:3354 +msgid "" +"This option enabled Protocol Obfuscation, and makes aMule accept obfuscated " +"connections from other clients." +msgstr "此選項啓用了模糊協議,可讓 aMule 從其他客戶端接收模糊的連接" + +#: src/muuli_wdr.cpp:3357 +msgid "Use obfuscation for outgoing connections" +msgstr "爲對外連接使用模糊協議" + +#: src/muuli_wdr.cpp:3359 +msgid "" +"This option makes aMule use Protocol Obfuscation when connecting other " +"clients/servers." +msgstr "此選項使 aMule 在連接其他客戶端或服務器時使用模糊協議。" + +#: src/muuli_wdr.cpp:3362 +msgid "Accept only obfuscated connections" +msgstr "只接受模糊連接" + +#: src/muuli_wdr.cpp:3363 +msgid "" +"This option makes aMule only accept obfuscated connections. You will have " +"less sources, but all your traffic will be obfuscated" +msgstr "" +"此選項讓 aMule 只接受模糊的連接,你將有較少的源,但你的全部連接都將是模糊的" + +#: src/muuli_wdr.cpp:3368 +msgid "File Options" +msgstr "文件選項" + +#: src/muuli_wdr.cpp:3373 +msgid "Everybody" +msgstr "任何人都可以" + +#: src/muuli_wdr.cpp:3375 +msgid "No One" +msgstr "任何人都不可以" + +#: src/muuli_wdr.cpp:3377 +msgid "Who can see shared files:" +msgstr "誰可以查看我共享的文件: " + +#: src/muuli_wdr.cpp:3378 +msgid "Select who can request to view a list of your shared files." +msgstr "選擇可以浏覽共享文件列表的用戶。" + +#: src/muuli_wdr.cpp:3383 +msgid "IP-Filtering" +msgstr "IP 過濾" + +#: src/muuli_wdr.cpp:3390 +msgid "Filter clients" +msgstr "過濾客戶端" + +#: src/muuli_wdr.cpp:3392 +msgid "" +"Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "過濾在文件~/.aMule/ipfilter.dat中定義的客戶端IP" + +#: src/muuli_wdr.cpp:3395 +msgid "Filter servers" +msgstr "過濾服務器" + +#: src/muuli_wdr.cpp:3397 +msgid "" +"Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat." +msgstr "過濾在文件~/.aMule/ipfilter.dat中定義的服務器IP" + +#: src/muuli_wdr.cpp:3404 +msgid "Reload List" +msgstr "刷新列表" + +#: src/muuli_wdr.cpp:3405 +msgid "Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat" +msgstr "更新IP 地址過濾列表 ~/.aMule/ipfilter.dat" + +#: src/muuli_wdr.cpp:3413 +msgid "URL:" +msgstr "URL:" + +#: src/muuli_wdr.cpp:3419 +msgid "Update now" +msgstr "立即更新" + +#: src/muuli_wdr.cpp:3424 +msgid "Auto-update ipfilter at startup" +msgstr "啓動後自動更新IP 地址過濾列表" + +#: src/muuli_wdr.cpp:3429 +msgid "Filtering Level:" +msgstr "過濾級別:" + +#: src/muuli_wdr.cpp:3439 +msgid "Always filter LAN IPs" +msgstr "永遠過濾局域網 IP 地址" + +#: src/muuli_wdr.cpp:3443 +msgid "Paranoid handling of non-matching IPs" +msgstr "處理不匹配的IP" + +#: src/muuli_wdr.cpp:3445 +msgid "" +"Rejects packet if the client ip is different from the ip where the packet is " +"received from. Use with caution." +msgstr "拒絕客戶端IP不同于接收包中的IP的數據包,請謹慎使用。" + +#: src/muuli_wdr.cpp:3448 +msgid "Use system-wide ipfilter.dat if available" +msgstr "在可用的情況下使用系統級的 ipfilter.dat" + +#: src/muuli_wdr.cpp:3449 +msgid "" +"If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter " +"file." +msgstr "如果沒有找到本地ipfilter.dat文件,則允許使用系統級的IP過濾文件。" + +#: src/muuli_wdr.cpp:3452 +msgid "Use Secure User Identification" +msgstr "使用安全用戶認證" + +#: src/muuli_wdr.cpp:3454 +msgid "" +"It is recommended to enable this option. You will not receive credits if SUI " +"is not enabled." +msgstr "建議使用此選項,如果安全用戶認證沒有啟用,將不會接收信用證明。" + +#: src/muuli_wdr.cpp:3483 +msgid "Enable/Disable" +msgstr "啓用/禁用" + +#: src/muuli_wdr.cpp:3486 +msgid "Enable Online-Signature" +msgstr "啟用線上簽名" + +#: src/muuli_wdr.cpp:3488 +msgid "" +"Enables the writing of the OS file, which can be used by external apps to " +"create signatures and the like." +msgstr "輸出該文件以用于網上簽名等等。" + +#: src/muuli_wdr.cpp:3493 +msgid "Update Frequency (Secs):" +msgstr "更新頻率(秒):" + +#: src/muuli_wdr.cpp:3497 +msgid "Change the frequency (in seconds) of Online Signature updates." +msgstr "更改在線簽名文件的更行頻率(秒)。" + +#: src/muuli_wdr.cpp:3503 +msgid "Online Signature Directory:" +msgstr "在線簽名目錄:" + +#: src/muuli_wdr.cpp:3510 +msgid "" +"Click here to select the directory containing the the Online Signature files." +msgstr "點擊選擇包含在線簽名文件的目錄。" + +#: src/muuli_wdr.cpp:3539 src/muuli_wdr.cpp:3578 src/muuli_wdr.cpp:3800 +msgid "Disable/Enable" +msgstr "禁用/啓用" + +#: src/muuli_wdr.cpp:3542 +msgid "Filter incoming messages (except current chat):" +msgstr "過濾收到的消息(不包括當前對話):" + +#: src/muuli_wdr.cpp:3545 +msgid "Filtering Options:" +msgstr "過濾選項:" + +#: src/muuli_wdr.cpp:3548 +msgid "Filter all messages" +msgstr "過濾所有消息" + +#: src/muuli_wdr.cpp:3551 +msgid "Filter messages from people not on your friend list" +msgstr "過濾來自好友列表外的消息" + +#: src/muuli_wdr.cpp:3554 +msgid "Filter messages from unknown clients" +msgstr "過濾來自未知客戶端的消息" + +#: src/muuli_wdr.cpp:3557 +msgid "Filter messages containing (use ',' as separator):" +msgstr "過濾包含以下內容的消息(用半角逗號分隔):" + +#: src/muuli_wdr.cpp:3561 src/muuli_wdr.cpp:3585 +msgid "add here the words amule should filter and block messages including it" +msgstr "輸入需過濾的詞組" + +#: src/muuli_wdr.cpp:3573 +msgid "Comments" +msgstr "備注" + +#: src/muuli_wdr.cpp:3581 +msgid "Filter comments containing (use ',' as separator):" +msgstr "過濾包含以下內容的備註(使用‘,’作為分隔符):" + +#: src/muuli_wdr.cpp:3624 +msgid "Enable Proxy" +msgstr "啓用代理" + +#: src/muuli_wdr.cpp:3625 +msgid "Enable/disable proxy support" +msgstr "啓用/禁用代理支持" + +#: src/muuli_wdr.cpp:3630 +msgid "Proxy type:" +msgstr "代理類型:" + +#: src/muuli_wdr.cpp:3635 +msgid "SOCKS5" +msgstr "SOCKS5" + +#: src/muuli_wdr.cpp:3636 +msgid "SOCKS4" +msgstr "SOCKS4" + +#: src/muuli_wdr.cpp:3637 +msgid "HTTP" +msgstr "HTTP" + +#: src/muuli_wdr.cpp:3638 +msgid "SOCKS4a" +msgstr "SOCKS4a" + +#: src/muuli_wdr.cpp:3641 +msgid "The type of proxy you are connecting to" +msgstr "正在連接的代理服務器類型" + +#: src/muuli_wdr.cpp:3644 +msgid "Proxy host:" +msgstr "代理主機:" + +#: src/muuli_wdr.cpp:3648 +msgid "The proxy host name" +msgstr "代理主機名" + +#: src/muuli_wdr.cpp:3651 +msgid "Proxy port:" +msgstr "代理服務器端口:" + +#: src/muuli_wdr.cpp:3655 +msgid "The proxy port" +msgstr "代理服務器端口" + +#: src/muuli_wdr.cpp:3662 +msgid "Authentication" +msgstr "登錄驗證" + +#: src/muuli_wdr.cpp:3665 +msgid "Enable authentication" +msgstr "啓用登錄驗證:" + +#: src/muuli_wdr.cpp:3666 +msgid "Enable/disable username/password authentication" +msgstr "啓用/禁用用戶名/密碼登錄驗證" + +#: src/muuli_wdr.cpp:3676 +msgid "The username to use to connect to the proxy" +msgstr "連接代理服務器的用戶名" + +#: src/muuli_wdr.cpp:3679 +msgid "Password:" +msgstr "密碼:" + +#: src/muuli_wdr.cpp:3683 +msgid "The password to use to connect to the proxy" +msgstr "連接代理服務器的密碼" + +#: src/muuli_wdr.cpp:3690 +msgid "Automatic server connect without proxy" +msgstr "自動連接服務器時忽略代理設置" + +#: src/muuli_wdr.cpp:3713 +msgid "Connect to:" +msgstr "已連接到:" + +#: src/muuli_wdr.cpp:3727 +msgid "Login to remote amule" +msgstr "登錄遠端amule" + +#: src/muuli_wdr.cpp:3732 +msgid "User name" +msgstr "用戶名" + +#: src/muuli_wdr.cpp:3759 +msgid "Remember those settings" +msgstr "記住這些設置" + +#: src/muuli_wdr.cpp:3805 +msgid "Enable Verbose Debug-Logging." +msgstr "啓用詳細調試日志." + +#: src/muuli_wdr.cpp:3810 +msgid "Message Categories:" +msgstr "消息分類:" + +#: src/muuli_wdr.cpp:3865 +msgid "Add imports" +msgstr "添加導入文件" + +#: src/muuli_wdr.cpp:3869 +msgid "Retry selected" +msgstr "重試所選" + +#: src/muuli_wdr.cpp:3872 +msgid "Remove selected" +msgstr "刪除所選" + +#: src/muuli_wdr.cpp:3967 +msgid "Event types" +msgstr "事件類型" + +#: src/muuli_wdr.cpp:3993 +msgid "Connect to any server and/or Kad" +msgstr "連接至任何服務器 和/或 Kad" + +#: src/CatDialog.cpp:87 +msgid "New Category" +msgstr "新分類" + +#: src/CatDialog.cpp:126 +msgid "Choose a folder for incoming files" +msgstr "請選擇下載資料夾" + +#: src/CatDialog.cpp:141 +msgid "You must specify a name for the category!" +msgstr "請給出分類名稱" + +#: src/CatDialog.cpp:151 +msgid "You must specify a path for the category!" +msgstr "請給出分類路徑" + +#: src/CatDialog.cpp:159 +msgid "" +"Failed to create incoming dir for category. Please specify a valid path!" +msgstr "無法建立該分類的接收文件夾。請給出一個有效的分類路徑!" + +#: src/ExternalConnector.cpp:144 +#, c-format +msgid "Unknown extension '%s' for the '%s' command.\n" +msgstr "未知擴展選項 '%s' 用于命令 '%s'。\n" + +#: src/ExternalConnector.cpp:146 +#, c-format +msgid "Unknown command '%s'.\n" +msgstr "未知命令 '%s'。\n" + +#: src/ExternalConnector.cpp:158 +msgid "" +"\n" +"This command cannot have an argument.\n" +msgstr "" +"\n" +"此命令不需要參數。\n" + +#: src/ExternalConnector.cpp:160 +msgid "" +"\n" +"This command must have an argument.\n" +msgstr "" +"\n" +"此命令必須要參數。\n" + +#: src/ExternalConnector.cpp:163 +msgid "" +"\n" +"This command is incomplete, you must use one of the extensions below.\n" +msgstr "" +"\n" +"此命令不完整,您必須使用以下中的一個擴展選項。\n" + +#: src/ExternalConnector.cpp:169 +msgid "" +"\n" +"Available extensions:\n" +msgstr "" +"\n" +"可用擴展選項:\n" + +#: src/ExternalConnector.cpp:171 +msgid "Available commands:\n" +msgstr "可用命令:\n" + +#: src/ExternalConnector.cpp:188 +#, fuzzy, c-format +msgid "" +"\n" +"All commands are case insensitive.\n" +"Type '%s ' to get detailed info on .\n" +msgstr "" +"\n" +"全部命令都不區分大小寫。\n" +"輸入 'help <命令>' 獲取在 <命令> 中的詳細信息。\n" + +#: src/ExternalConnector.cpp:217 src/ExternalConnector.cpp:218 +msgid "Exits from the application." +msgstr "退出程序。" + +#: src/ExternalConnector.cpp:219 +msgid "Show help." +msgstr "顯示幫助。" + +#. TRANSLATORS: +#. Do not translate the word 'help', it is a command to the program! +#: src/ExternalConnector.cpp:222 +msgid "" +"To get help on a command, type 'help '.\n" +"To get the full command list type 'help'.\n" +msgstr "" +"輸入 'help <命令>' 可顯示命令的幫助。\n" +"輸入 'help' 可顯示全部命令列表。\n" + +#: src/ExternalConnector.cpp:243 +#, c-format +msgid "" +"\n" +"Use '%s' for command list\n" +"\n" +msgstr "" +"\n" +"使用 '%s' 列出所有命令\n" +"\n" + +#: src/ExternalConnector.cpp:273 +msgid "Syntax error!" +msgstr "語法錯誤!" + +#: src/ExternalConnector.cpp:276 +msgid "Error processing command - should never happen! Report bug, please\n" +msgstr "處理指令時發生意外錯誤!請提交錯誤報告\n" + +#: src/ExternalConnector.cpp:279 +msgid "This command should not have any parameters." +msgstr "此命令不需要任何參數。" + +#: src/ExternalConnector.cpp:282 +msgid "This command must have a parameter." +msgstr "此命令必須要參數。" + +#: src/ExternalConnector.cpp:285 +msgid "Invalid argument." +msgstr "無效參數" + +#: src/ExternalConnector.cpp:288 +msgid "This is an incomplete command." +msgstr "此命令不完整。" + +#: src/ExternalConnector.cpp:297 +#, c-format +msgid "Type '%s' to get more help.\n" +msgstr "輸入 '%s' 顯示更多幫助信息。\n" + +#: src/ExternalConnector.cpp:364 +#, c-format +msgid "This is %s %s %s\n" +msgstr "這是 %s %s %s\n" + +#: src/ExternalConnector.cpp:366 +#, c-format +msgid "This is %s %s\n" +msgstr "這是 %s %s\n" + +#: src/ExternalConnector.cpp:397 +msgid "" +"\n" +"Creating client...\n" +msgstr "" +"\n" +"正在建立客戶...\n" + +#: src/ExternalConnector.cpp:407 +msgid "Connection Failed. Unable to connect to the specified host\n" +msgstr "連接失敗。無法連接到指定的計算機\n" + +#: src/ExternalConnector.cpp:428 +#, c-format +msgid "" +"\n" +"Ok, exiting %s...\n" +msgstr "" +"\n" +"完成,正在退出 %s...\n" + +#: src/ExternalConnector.cpp:433 +msgid "" +"Cannot connect with an empty password.\n" +"You must specify a password either in config file\n" +"or on command-line, or enter one when asked.\n" +"\n" +"Exiting...\n" +msgstr "" +"不能使用空密碼連接。\n" +"你必須在配置文件\n" +"或在命令行設置一個,或者在詢問時輸入。\n" +"\n" + +#: src/ExternalConnector.cpp:440 +msgid "Show this help text." +msgstr "顯示幫助信息。" + +#: src/ExternalConnector.cpp:443 +msgid "Host where aMule is running. (default: localhost)" +msgstr "aMule正在運行的主機。(缺省:localhost)" + +#: src/ExternalConnector.cpp:446 +msgid "aMule's port for External Connection. (default: 4712)" +msgstr "aMule 的外部連接端口。(缺省:4712)" + +#: src/ExternalConnector.cpp:449 +msgid "External Connection password." +msgstr "外部連接密碼。" + +#: src/ExternalConnector.cpp:452 +msgid "Read configuration from file." +msgstr "從文件讀取設置。" + +#: src/ExternalConnector.cpp:455 +msgid "Do not print any output to stdout." +msgstr "不打印任何信息到控制台。" + +#: src/ExternalConnector.cpp:458 +msgid "Be verbose - show also debug messages." +msgstr "詳細顯示調試信息。" + +#: src/ExternalConnector.cpp:461 +msgid "Sets program locale (language)." +msgstr "設置程序地區(語言)。" + +#: src/ExternalConnector.cpp:464 +msgid "Write command line options to config file." +msgstr "把命令行參數寫入設置文件。" + +#: src/ExternalConnector.cpp:467 +msgid "Creates config file based on aMule's config file." +msgstr "基于aMule的設置文件建立新設置文件。" + +#: src/ExternalConnector.cpp:470 +msgid "Print program version." +msgstr "打印程序版本。" + +#: src/ClientCreditsList.cpp:168 +#, fuzzy, c-format +msgid "Creditfile loaded, %u client is known" +msgid_plural "Creditfile loaded, %u clients are known" +msgstr[0] "積分檔案已載入,%u個已知使用者" +msgstr[1] "積分檔案已載入,%u個已知使用者" + +#: src/ClientCreditsList.cpp:171 +#, fuzzy, c-format +msgid " - Credits expired for %u client!" +msgid_plural " - Credits expired for %u clients!" +msgstr[0] " - %u 個用戶的積分已過期" +msgstr[1] " - %u 個用戶的積分已過期" + +#: src/ClientCreditsList.cpp:315 +msgid "No 'cryptkey.dat' file found, creating." +msgstr "文件 'crytkey.dat' 未找到,正在創建。" + +#: src/amuled.cpp:525 +msgid "" +"ERROR: aMule daemon cannot be used when external connections are disabled. " +"To enable External Connections, use either a normal aMule, start amuled with " +"the option --ec-config or set the key\"AcceptExternalConnections\" to 1 in " +"the file ~/.aMule/amule.conf" +msgstr "" +"錯誤:當外部連接被禁用的時,aMule daemon 無法使用。要啓用外部連接,請使用標准" +"的 aMule,或使用 --ec-config選項啓動 amuled 或在文件 ~/aMule/amule.conf 中設" +"置選項\"AcceptExternalConnections\"" + +#: src/amuled.cpp:681 +#, c-format +msgid "ERROR: %s" +msgstr "錯誤:%s" + +#: src/ClientListCtrl.cpp:255 +msgid "Unban" +msgstr "取消封殺" + +#: src/ClientListCtrl.cpp:260 +msgid "Show Uploads" +msgstr "顯示上傳" + +#: src/ClientListCtrl.cpp:261 +msgid "Show Queue" +msgstr "顯示等候" + +#: src/ClientListCtrl.cpp:262 +msgid "Show Clients" +msgstr "顯示客戶" + +#: src/ClientListCtrl.cpp:266 +msgid "Select View" +msgstr "選擇視角" + +#: src/ClientListCtrl.cpp:504 src/ClientListCtrl.cpp:805 +#: src/ClientListCtrl.cpp:976 +msgid "Client Software" +msgstr "用戶軟件" + +#: src/ClientListCtrl.cpp:507 +msgid "Waited" +msgstr "已等待" + +#: src/ClientListCtrl.cpp:508 +msgid "Upload Time" +msgstr "上傳時間" + +#: src/ClientListCtrl.cpp:511 +msgid "Upload/Download" +msgstr "上傳/下載" + +#: src/ClientListCtrl.cpp:512 +msgid "Remote Status" +msgstr "遠程狀態" + +#: src/ClientListCtrl.cpp:692 +#, c-format +msgid "QR: %u" +msgstr "QR: %u" + +#: src/ClientListCtrl.cpp:806 +msgid "File Priority" +msgstr "檔案優先等級" + +#: src/ClientListCtrl.cpp:808 +msgid "Score" +msgstr "分數" + +#: src/ClientListCtrl.cpp:809 +msgid "Asked" +msgstr "已請求" + +#: src/ClientListCtrl.cpp:810 +msgid "Last Seen" +msgstr "最後連線" + +#: src/ClientListCtrl.cpp:811 +msgid "Entered Queue" +msgstr "進入等候" + +#: src/ClientListCtrl.cpp:972 +msgid "Upload Status" +msgstr "上傳狀態" + +#: src/ClientListCtrl.cpp:973 +msgid "Transferred Up" +msgstr "已傳輸" + +#: src/ClientListCtrl.cpp:974 +msgid "Download Status" +msgstr "下載狀態" + +#: src/ClientListCtrl.cpp:975 +msgid "Transferred Down" +msgstr "已傳輸" + +#: src/ClientListCtrl.cpp:978 +msgid "Userhash" +msgstr "用戶編碼" + +#: src/ClientListCtrl.cpp:979 +msgid "Encrypted" +msgstr "已加密" + +#: src/ClientListCtrl.cpp:980 +msgid "Hide shared files" +msgstr "隱藏共享檔案" + +#: src/ClientDetailDialog.cpp:49 +msgid "Client Details" +msgstr "使用者訊息" + +#: src/ClientDetailDialog.cpp:143 src/ClientDetailDialog.cpp:148 +#, c-format +msgid "%.1f kB/s" +msgstr "%.1f kB/s" + +# fuzzy +#: src/ClientDetailDialog.cpp:168 +msgid "Not Supported" +msgstr "不被支援" + +#: src/ClientDetailDialog.cpp:174 +msgid "Not complete" +msgstr "未完成" + +#: src/ClientDetailDialog.cpp:177 +msgid "Bad Guy" +msgstr "壞蛋" + +#: src/ClientDetailDialog.cpp:180 +msgid "Verified - OK" +msgstr "驗證已通過" + +# fuzzy +#: src/ClientDetailDialog.cpp:184 +msgid "Not Available" +msgstr "不在" + +#: src/ClientDetailDialog.cpp:190 +#, fuzzy, c-format +msgid "%u (QR: %u)" +msgstr "QR: %u" + +#: src/SearchDlg.cpp:491 +msgid "Min size must be smaller than max size. Max size ignored." +msgstr "最小值必須小于最大值,最大值已被忽略。" + +#: src/SearchDlg.cpp:492 src/SearchDlg.cpp:539 +msgid "Search warning" +msgstr "搜索警告" + +#: src/MuleTrayIcon.cpp:121 src/MuleTrayIcon.cpp:142 src/MuleTrayIcon.cpp:494 +#: src/MuleTrayIcon.cpp:515 +msgid "Unlimited" +msgstr "無限制" + +#: src/MuleTrayIcon.cpp:332 +msgid "aMule Tray Menu" +msgstr "aMule 狀態列 選單" + +#: src/MuleTrayIcon.cpp:338 +msgid "Speed Limits:" +msgstr "速度限制" + +#: src/MuleTrayIcon.cpp:343 +msgid "UL: None" +msgstr "上傳: 無" + +#: src/MuleTrayIcon.cpp:346 +#, c-format +msgid "UL: %u" +msgstr "上傳: %u" + +#: src/MuleTrayIcon.cpp:353 +msgid "DL: None" +msgstr "下載: 無" + +#: src/MuleTrayIcon.cpp:356 +#, c-format +msgid "DL: %u" +msgstr "下載: %u" + +#: src/MuleTrayIcon.cpp:360 +#, c-format +msgid "Download Speed: %.1f" +msgstr "下載速度:%.1f" + +#: src/MuleTrayIcon.cpp:362 +#, c-format +msgid "Upload Speed: %.1f" +msgstr "上傳速度:%.1f" + +#: src/MuleTrayIcon.cpp:368 +msgid "Client Information" +msgstr "用戶信息" + +#: src/MuleTrayIcon.cpp:372 +#, c-format +msgid "Nickname: %s" +msgstr "昵稱: %s" + +#: src/MuleTrayIcon.cpp:372 +msgid "No Nickname Selected!" +msgstr "未選擇昵稱" + +#: src/MuleTrayIcon.cpp:379 +msgid "ClientID: " +msgstr "客戶代號: " + +#: src/MuleTrayIcon.cpp:392 +msgid "ServerName: " +msgstr "伺服器名稱" + +#: src/MuleTrayIcon.cpp:393 +msgid "ServerIP: " +msgstr "伺服器 IP: " + +#: src/MuleTrayIcon.cpp:408 +#, c-format +msgid "IP: %s" +msgstr "IP: %s" + +#: src/MuleTrayIcon.cpp:417 +#, c-format +msgid "TCP Port: %d" +msgstr "TCP 端口:%d" + +#: src/MuleTrayIcon.cpp:419 +msgid "TCP Port: Not Ready" +msgstr "TCP 連接埠︰未就緒" + +#: src/MuleTrayIcon.cpp:428 +#, c-format +msgid "UDP Port: %d" +msgstr "UDP 端口:%d" + +#: src/MuleTrayIcon.cpp:430 +msgid "UDP Port: Not Ready" +msgstr "UDP 連接埠︰未就緒" + +#: src/MuleTrayIcon.cpp:439 +msgid "Online Signature: Enabled" +msgstr "線上簽名: 啟用" + +#: src/MuleTrayIcon.cpp:442 +msgid "Online Signature: Disabled" +msgstr "線上簽名: 停用" + +#: src/MuleTrayIcon.cpp:455 +#, c-format +msgid "Shared Files: %d" +msgstr "已共享的文件:%d" + +#: src/MuleTrayIcon.cpp:461 +#, c-format +msgid "Queued Clients: %d" +msgstr "隊列中用戶: %d" + +#: src/MuleTrayIcon.cpp:468 +#, c-format +msgid "Total DL: %s" +msgstr "總下載: %s" + +#: src/MuleTrayIcon.cpp:475 +#, c-format +msgid "Total UL: %s" +msgstr "總上傳: %s" + +#: src/MuleTrayIcon.cpp:486 +msgid "Upload Limit" +msgstr "上傳限制" + +#: src/MuleTrayIcon.cpp:490 +msgid "Download Limit" +msgstr "下載限制" + +#: src/MuleTrayIcon.cpp:550 +msgid "Hide aMule" +msgstr "隱藏 aMule" + +#: src/MuleTrayIcon.cpp:553 +msgid "Show aMule" +msgstr "顯示 aMule" + +#: src/ChatSelector.cpp:127 +#, c-format +msgid "Chat-Session Started: %s (%s:%u) - %s %s" +msgstr "聊天已開始:%s (%s:%u) - %s %s" + +#: src/ChatSelector.cpp:206 src/ChatSelector.cpp:286 +msgid "*** Connected to Client ***" +msgstr "*** 已連接到用戶 ***" + +#: src/ChatSelector.cpp:249 +msgid "*** Connecting to Client ***" +msgstr "*** 正在連接用戶 ***" + +#: src/ChatSelector.cpp:280 +msgid "*** Failed to Connect to client / Connection lost ***" +msgstr "*** 無法連接用戶/連接中斷 ***" + +#: src/MuleNotebook.cpp:156 +msgid "Close tab" +msgstr "關閉分頁" + +#: src/MuleNotebook.cpp:157 +msgid "Close all tabs" +msgstr "關閉所有分頁" + +#: src/MuleNotebook.cpp:158 +msgid "Close other tabs" +msgstr "關閉其它分頁" + +#: src/ServerList.cpp:83 +#, c-format +msgid "Loading server.met file: %s" +msgstr "正在載入 server.met 文件: %s" + +#: src/ServerList.cpp:88 +msgid "Server.met file not found!" +msgstr "找不到server.met 文件" + +#: src/ServerList.cpp:96 +#, c-format +msgid "Failed to load server.met file '%s', unknown format encountered." +msgstr "載入 server.met 文件 '%s' 失敗,遇到未知格式。" + +#: src/ServerList.cpp:102 +msgid "Failed to open server.met!" +msgstr "無法打開 server.met 文件" + +#: src/ServerList.cpp:113 +#, c-format +msgid "Server.met file corrupt, found invalid versiontag: 0x%x, size %i" +msgstr "Server.met 文件損壞,發現錯誤的版本標記:0x%x, 大小 %i" + +#: src/ServerList.cpp:168 +#, fuzzy, c-format +msgid "%i server in server.met found" +msgid_plural "%i servers in server.met found" +msgstr[0] "server.met 中有 %i 個伺服器" +msgstr[1] "server.met 中有 %i 個伺服器" + +#: src/ServerList.cpp:170 +#, fuzzy, c-format +msgid "%d server added" +msgid_plural "%d servers added" +msgstr[0] "%d 新增添的伺服器" +msgstr[1] "%d 新增添的伺服器" + +#: src/ServerList.cpp:191 +#, c-format +msgid "Server not added: [%s:%d] does not specify a valid port." +msgstr "沒有添加服務器:[%s:%d] 端口無效" + +#: src/ServerList.cpp:207 +#, c-format +msgid "Server not added: The IP of [%s:%d] is filtered or invalid." +msgstr "沒有添加服務器:[%s:%d] IP地址無效" + +#: src/ServerList.cpp:227 +#, c-format +msgid "Server not added: Server with matching IP:Port [%s:%d] found in list." +msgstr "沒有添加服務器: 服務器列表中已有[%s:%d]" + +#: src/ServerList.cpp:246 +#, c-format +msgid "Server added: Server at [%s:%d] using the name '%s'." +msgstr "成功添加服務器:[%s:%d] 服務器名爲 '%s'" + +#: src/ServerList.cpp:341 +msgid "" +"You are connected to the server you are trying to delete. please disconnect " +"first." +msgstr "現在正連接在要刪除的服務器。請先斷開連接。" + +#: src/ServerList.cpp:628 +msgid "Failed to save server.met!" +msgstr "無法存檔 server.met" + +#: src/ServerList.cpp:781 +msgid "Invalid URL" +msgstr "無效 URL" + +#: src/ServerList.cpp:804 +#, c-format +msgid "Finished to download the server list from %s" +msgstr "從%s下載服務器列表完成" + +#: src/ServerList.cpp:806 src/ServerList.cpp:860 +#, c-format +msgid "Failed to download the server list from %s" +msgstr "無法從 %s 下載服務器列表" + +#: src/ServerList.cpp:817 +msgid "" +"No serverlist address entry in 'addresses.dat' found. Please paste a valid " +"serverlist address into this file in order to auto-update your serverlist" +msgstr "" +"'addresses.dat' 檔案內沒有伺服器清單位址. 請貼上一個有效伺服器清單位址到該文" +"件以自動更新伺服器清單." + +#: src/ServerList.cpp:830 +#, c-format +msgid "Start downloading server list from %s" +msgstr "正在開始從%s下載服務器列表" + +#: src/ServerList.cpp:839 +#, c-format +msgid "Warning, invalid URL specified for auto-updating of servers: %s" +msgstr "警告,該自動更新URL無效:%s" + +#: src/ServerList.cpp:843 +msgid "No valid server.met auto-download url on addresses.dat" +msgstr "addresses.dat 文件中沒有有效的自動更新服務器列表URL" + +#: src/ServerList.cpp:936 +msgid "" +"Local server is filtered by the IPFilters, reconnecting to a different " +"server!" +msgstr "本地服務器被IP過濾器過濾掉了,正在重新連接至其他服務器!" + +#: src/UserEvents.cpp:132 +#, c-format +msgid "Failed to execute command `%s' on `%s' event." +msgstr "執行`%s' 事件中的命令`%s' 失敗。" + +#: src/amule.cpp:702 +msgid "" +"Your locale has been changed to System Default due to a configuration " +"change. Sorry." +msgstr "對不起,由于版本變動,您的地區設置已經被變爲系統默認值。" + +#: src/amule.cpp:765 +msgid "" +"You don't have any server in the server list.\n" +"Do you want aMule to download a new list now?" +msgstr "" +"在服務器列表中沒有任何服務器。\n" +"需要 aMule 現在就下載一個新的列表嗎?" + +#: src/amule.cpp:766 +msgid "Server list download" +msgstr "服務器列表已下載" + +#: src/amule.cpp:825 +#, c-format +msgid "webserver running on pid %d" +msgstr "Web 服務器正在運行,pid 是 %d" + +#: src/amule.cpp:829 +msgid "" +"You requested to run webserver from startup, but the amuleweb binary cannot " +"be run. Please install the package containing aMule webserver, or compile " +"aMule using --enable-webserver and run make install" +msgstr "" +"您要求啓動時運行 Web 服務器,但 amuleweb 程序無法運行。請先安裝包含 aMule " +"Web 服務器的 aMule 版本,或者使用 --enable-webserver選項編譯 aMule,然後運行 " +"make install進行安裝" + +#: src/amule.cpp:919 +#, c-format +msgid "Could not bind ports to the specified address: %s" +msgstr "" + +#: src/amule.cpp:946 +#, c-format +msgid "Port %u is not available. You will be LOWID\n" +msgstr "端口 %u 已被占用。你會成爲低ID。\n" + +#: src/amule.cpp:952 +#, c-format +msgid "" +"Port %u is not available!\n" +"\n" +"This means that you will be LOWID.\n" +"\n" +"Check your network to make sure the port is open for output and input." +msgstr "" +"端口 %u 已被占用。\n" +"\n" +"這意味著你會成爲低ID。\n" +"\n" +"請檢測網絡設置以確保端口可用于輸入輸出。" + +#: src/amule.cpp:1103 +msgid "Failed to create OnlineSig File" +msgstr "創建在線簽名文件失敗" + +#: src/amule.cpp:1111 +msgid "Failed to create aMule OnlineSig File" +msgstr "創建 aMule 在線簽名文件失敗" + +#: src/amule.cpp:1279 +msgid "" +"The selected locale seems not to be installed on your box. (Note: I'll try " +"to set it anyway)" +msgstr "" +"您所選擇的地區設置在您的計算機上似乎沒有安裝.但無論如何,我還是會采用你所選擇" +"的地區設置。" + +#: src/amule.cpp:1288 +#, c-format +msgid "This is the first time you run aMule %s" +msgstr "這是您第一次運行 aMule %s" + +#: src/amule.cpp:1290 +msgid "This version is a testing version, updated daily, and\n" +msgstr "這個版本是測試版, 每天更新, 而且 \n" + +#: src/amule.cpp:1291 +msgid "we give no warranty it won't break anything, burn your house,\n" +msgstr "我們無法承諾它一定不會損壞任何東西或燒掉你的房子,\n" + +#: src/amule.cpp:1292 +msgid "or kill your dog. But it *should* be safe to use anyway.\n" +msgstr "或殺死你的狗. 但一般來講它應該是安全的.\n" + +#: src/amule.cpp:1296 +msgid "" +"The following options have been changed in this release for security " +"reasons:\n" +msgstr "此版本中,因爲安全問題以下選項已經被更改:\n" + +#: src/amule.cpp:1297 +msgid "" +"\n" +"* Enabled Protocol Obfuscation support for incoming and outgoing " +"connections.\n" +msgstr "" +"\n" +"* 爲進站和出站連接啓用模糊協議支持。\n" + +#: src/amule.cpp:1298 +msgid "" +"\n" +"* Disabled updating the server list from other server and clients.\n" +msgstr "" +"\n" +"* 禁用從其他服務器和客戶端更新服務器列表。\n" + +#: src/amule.cpp:1299 +msgid "" +"\n" +"For more information on the reason for this changes, seach\n" +"the aMule wiki at http://wiki.amule.org for \"fake servers\" info.\n" +"It's important that you clear any fake server from your server list for " +"aMule to work properly." +msgstr "" +"\n" +"想更多地了解更改的原因, 請訪問\n" +"aMule 爲\"fake servers\" 信息的 wiki,地址是: http://wiki.amule.org。\n" +"有一點很重要,爲了讓你的 aMule 正常工作,請從服務器列表中清除假冒服務器。" + +#: src/amule.cpp:1304 +msgid "More information, support and new releases can found at our homepage,\n" +msgstr "如要獲取使用信息,用戶支援以及下載最新版本,請到我們的網頁\n" + +#: src/amule.cpp:1305 +msgid "at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n" +msgstr "www.aMule.org,或我們在irc.freenode.net的IRC頻道 #aMule。\n" + +#: src/amule.cpp:1307 +msgid "Feel free to report any bugs to http://forum.amule.org" +msgstr "歡迎您到 forum.amule.org 去提交錯誤報告" + +#: src/amule.cpp:1320 +msgid "" +"The folder for Online Signature files you specified is INVALID!\n" +" OnlineSignature will be DISABLED until you fix it on preferences." +msgstr "" +"您爲在線簽名文件所選擇的文件夾無效!\n" +"在您更正設置之前在線簽名將被禁用。" + +#: src/amule.cpp:1733 +msgid "ERROR: can't open logfile" +msgstr "錯誤: 無法打開日志文件" + +#: src/amule.cpp:1737 +msgid "WARNING: logfile is empty. Something is wrong." +msgstr "警告:日志文件爲空。肯定有什麽地方出錯了。" + +#: src/amule.cpp:1756 +msgid "Log has been reset" +msgstr "記錄文件已被重啓" + +#: src/amule.cpp:1784 +#, c-format +msgid "ServerMessage: %s" +msgstr "服務器消息:%s" + +#: src/amule.cpp:1822 +msgid "Failed to download the nodes list." +msgstr "下載節點列表失敗。" + +#: src/amule.cpp:1835 +msgid "Failed to open the downloaded version check file" +msgstr "打開已下載的版本檢查文件失敗" + +#: src/amule.cpp:1838 src/amule.cpp:1848 src/amule.cpp:1854 +msgid "Corrupted version check file" +msgstr "損壞的版本檢查文件" + +#: src/amule.cpp:1864 +msgid "You are using an outdated version of aMule!" +msgstr "你使用的是老版本的 aMule!" + +#: src/amule.cpp:1865 +#, c-format +msgid "Your aMule version is %i.%i.%i and the latest version is %li.%li.%li" +msgstr "你的 aMule 版本是%i.%i.%i,最新版本是 %li.%li.%li" + +#: src/amule.cpp:1866 +msgid "The latest version can always be found at http://www.amule.org" +msgstr "最新版本可從此下載:http://www.amule.org" + +#: src/amule.cpp:1869 +#, c-format +msgid "WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li" +msgstr "警告:你的 aMuled 版本太舊:%i.%i.%i < %li.%li.%li" + +#: src/amule.cpp:1873 +msgid "Your copy of aMule is up to date." +msgstr "你的 aMule 是最新版本。" + +#: src/amule.cpp:1880 +msgid "Failed to download the version check file" +msgstr "下載版本檢查文件失敗" + +#: src/amule.cpp:2049 +#, c-format +msgid "Connected to %s %s" +msgstr "已連接到 %s %s" + +#: src/amule.cpp:2052 +#, c-format +msgid "Connecting to %s" +msgstr "正在連接到 %s" + +#: src/amule.cpp:2054 +msgid "Disconnected from ED2K" +msgstr "已斷開 ED2K" + +#: src/amule.cpp:2061 +msgid "Kad started." +msgstr "Kad 已啓動。" + +#: src/amule.cpp:2063 +msgid "Kad stopped." +msgstr "Kad 已停止。" + +#: src/amule.cpp:2070 +msgid "Connected to Kad (ok)" +msgstr "已連接至 Kad" + +#: src/amule.cpp:2072 +msgid "Connected to Kad (firewalled)" +msgstr "已連接至 Kad 網絡(有防火牆)" + +#: src/amule.cpp:2075 +msgid "Disconnected from Kad" +msgstr "已斷開 Kad 連接" + +#: src/amule.cpp:2138 +msgid "" +"Kad network cannot be used if UDP port is disabled on preferences, not " +"starting." +msgstr "如果在設置中禁用了 UDP 端口,Kad 網絡將不能使用,沒有啓動。" + +#: src/amule.cpp:2141 +msgid "Kad network disabled on preferences, not connecting." +msgstr "Kad 網絡在設置中被禁用了,沒有連接。" + +#: src/FriendList.cpp:120 +msgid "Failed to open friendlist file 'emfriends.met' for reading!" +msgstr "無法打開好友列表文件 'emfriends.met'!" + +#: src/FriendList.cpp:146 +msgid "Failed to open friendlist file 'emfriends.met' for writing!" +msgstr "無法寫入好友列表文件 'emfriends.met'!" + +#~ msgid "You can't bootstrap an specific ip from remote GUI yet." +#~ msgstr "您不能使用遠程GUI用指定的IP啓動" + +#~ msgid "You can't update server.met from remote GUI yet." +#~ msgstr "不能從遠程GUI更新 server.met。" + +#, fuzzy +#~ msgid "Read %u Kad contact" +#~ msgid_plural "Read %u Kad contacts" +#~ msgstr[0] "讀取 %u 個 Kad 聯系人" +#~ msgstr[1] "讀取 %u 個 Kad 聯系人" + +#~ msgid "Disconnect from " +#~ msgstr "斷開連接" + +#~ msgid "current server" +#~ msgstr "當前服務器" + +#~ msgid " and " +#~ msgstr " 和 " + +#~ msgid "Disconnect from any server and/or Kad" +#~ msgstr "從全部服務器和/或 Kad 斷開" + +#~ msgid " [" +#~ msgstr " [" + +#~ msgid " | Kad: " +#~ msgstr " | Kad: " + +#~ msgid "TCP Flags" +#~ msgstr "TCP 標志" + +#~ msgid "UDP Flags" +#~ msgstr "UDP 標志" + +#~ msgid "Remove server(s)" +#~ msgstr "刪除服務器" + +#~ msgid "Copy ED2k link(s) to clipboard" +#~ msgstr "拷貝 ED2K 鏈接到剪貼板" + +#~ msgid "Client requests %u" +#~ msgstr "客戶請求 %u" + +#~ msgid "File block %u-%u (%d bytes):" +#~ msgstr "文件數據段 %u-%u (%d 比特): " + +#~ msgid "Client request is invalid!" +#~ msgstr "客戶端請求非法!" + +#~ msgid "Client request is invalid! %i / %i" +#~ msgstr "客戶端請求非法!%i / %i" + +#~ msgid "Command: %s" +#~ msgstr "命令: %s" + +#~ msgid "Unable to open %s file - using %s file." +#~ msgstr "無法讀取 %s - 現在使用 %s" + +#~ msgid "Warning: known.met does not exist." +#~ msgstr "警告:known.net文件不存在。" + +#~ msgid "" +#~ "CSharedFileList::FindSharedFiles: Removing %s from shared directory list: " +#~ "directory not found." +#~ msgstr "" +#~ "CSharedFileList::FindSharedFiles: 從共享文件列表中刪除 %s:目錄未找到" + +#~ msgid "Waiting for subprocess termination failed" +#~ msgstr "等待子進程終止失敗" + +#~ msgid "" +#~ "You cannot connect to a release version from an arbitrary CVS version! " +#~ "*sigh* possible crash prevented" +#~ msgstr "你不能連接至任意 CVS 版本的發布!目的是爲了不讓程序崩潰。" + +#~ msgid "doesn't work" +#~ msgstr "沒有工作" + +#~ msgid "remote gui" +#~ msgstr "遠程GUI" + +#~ msgid "" +#~ "Error: Failed to load backup file. Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "錯誤: 無法載入備份檔案. 請到http://forum.amule.org搜尋關於.part和.met的恢" +#~ "復的貼子" + +#~ msgid "" +#~ "Error: Backup part.met file is 0 size! Search http://forum.amule.org for ." +#~ "part.met recovery solutions" +#~ msgstr "" +#~ "錯誤: 備份 part.met 文件長度爲0. 請到http://forum.amule.org搜索關于.part." +#~ "met文件恢複的貼子" + +#~ msgid "Error: part.met backup file is 0 size: %s ==> %s" +#~ msgstr "錯誤:part.met文件大小爲0:%s ==> %s" + +#~ msgid "" +#~ "Note: These values are\n" +#~ " only used for statistics." +#~ msgstr "" +#~ "注意:這些數值只是\n" +#~ " 作爲統計用途。" + +#~ msgid "" +#~ " 'All-Platform' p2p client based on eMule \n" +#~ "\n" +#~ " Website: http://www.amule.org \n" +#~ " Forum: http://forum.amule.org \n" +#~ " FAQ: http://wiki.amule.org \n" +#~ "\n" +#~ " Contact: admin@amule.org (administrative issues) \n" +#~ " Copyright (C) 2003-2008 aMule Team \n" +#~ "\n" +#~ " Part of aMule is based on \n" +#~ " Kademlia: Peer-to-peer routing based on the XOR metric.\n" +#~ " Copyright (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" +#~ msgstr "" +#~ " 基于 eMule 的跨平台 P2P 軟件\n" +#~ "\n" +#~ " 網站: http://www.amule.org \n" +#~ " 論壇:http://forum.amule.org \n" +#~ " FAQ:http://wiki.amule.org \n" +#~ "\n" +#~ " 聯系人:admin@amule.org (administrative issues) \n" +#~ " 版權所有 (C) 2003-2008 aMule 開發團隊 \n" +#~ "\n" +#~ " aMule 的一部分是基于 \n" +#~ " Kad:基于異或算法的P2P路由協議。\n" +#~ " 版權所有 (C) 2002 Petar Maymounkov\n" +#~ " http://kademlia.scs.cs.nyu.edu\n" + +#~ msgid "WARNING: You have recieved Low-ID!" +#~ msgstr "警告:您收到了低ID!" + +#~ msgid "" +#~ "This command requieres an argument. Valid arguments: 'all' or a number.\n" +#~ msgstr "該命令需要一個參數。有效參數爲:'all', 或一數字\n" + +#~ msgid "This command requieres an argument. Valid arguments: a file hash.\n" +#~ msgstr "此命令需要一個參數,參數無效,需要文件校驗碼。\n" + +#~ msgid "Deprecated command, now 'Status'." +#~ msgstr "過時的命令,現已改爲 'Status'。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Status' instead.\n" +#~ msgstr "" +#~ "此命令已過時,將來可能會刪除。\n" +#~ "'Status' 替代。\n" + +#~ msgid "Deprecated command, now 'Set IPFilter'." +#~ msgstr "過時的命令,現已改爲 'Set IPFilter'。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter' instead.\n" +#~ msgstr "" +#~ "此命令已過時,將來可能會刪除。\n" +#~ "請用 'Set IPFilter' 替代。\n" + +#~ msgid "Deprecated command, now 'Get IPFilter Level'." +#~ msgstr "過時的命令,現已改爲 'Get IPFilter Level'。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get IPFilter Level' instead.\n" +#~ msgstr "" +#~ "此命令已過時,將來可能會刪除。\n" +#~ "請用 'Get IPFilter Level' 替代。\n" + +#~ msgid "Deprecated command, now 'Set IPFilter Level'." +#~ msgstr "過時的命令,現已改爲 'Set IPFilter Level'。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "此命令已過時,將來可能會刪除。\n" +#~ "請用 'Set IPFilter Level' 替代。\n" + +#~ msgid "Deprecated command, now 'Get/Set IPFilter Level'." +#~ msgstr "過時的命令,現已改爲 'Get/Set IPFilter Level'。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get/Set IPFilter Level' instead.\n" +#~ msgstr "" +#~ "此命令已過時,將來可能會刪除。\n" +#~ "請用 'Get/Set IPFilter Level' 替代。\n" + +#~ msgid "Deprecated command, now 'Show Servers'." +#~ msgstr "過時的命令,現已改爲 'Show Servers'。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Show Servers' instead.\n" +#~ msgstr "" +#~ "此命令已過時,將來可能會刪除。\n" +#~ "請用 'Show Servers' 替代。\n" + +#~ msgid "Deprecated command, now 'Get BwLimits'." +#~ msgstr "過時的命令,現已改爲 'Get BwLimits'。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Get BwLimits' instead.\n" +#~ msgstr "" +#~ "此命令已過時,將來可能會刪除。\n" +#~ "請用 'Get BwLimits' 替代。\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Up'." +#~ msgstr "過時的命令,現已改爲 'Set BwLimit Up'。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Up' instead.\n" +#~ msgstr "" +#~ "此命令已過時,將來可能會刪除。\n" +#~ "請用 'Set BwLimit Up' 替代。\n" + +#~ msgid "Deprecated command, now 'Set BwLimit Down'." +#~ msgstr "過時的命令,現已改爲 'Set BwLimit Down'。" + +#~ msgid "" +#~ "This is a deprecated command, and may be removed in the future.\n" +#~ "Use 'Set BwLimit Down' instead.\n" +#~ msgstr "" +#~ "此命令已過時,將來可能會刪除。\n" +#~ "請用 'Set BwLimit Down' 替代。\n" + +#~ msgid "Syncronization thread started." +#~ msgstr "同步線程已開始" + +#~ msgid "Masterhashes of known files have been loaded." +#~ msgstr "已經文件的主校驗碼已經載入" + +#~ msgid "Error while reading Kad contacts - 0 entries" +#~ msgstr "讀取 Kad 聯系人時出錯 - 沒有記錄 " + +#~ msgid "Merge attempt" +#~ msgstr "嘗試合並" + +#~ msgid "Recursive merge" +#~ msgstr "遞歸合並" + +#~ msgid "Sucessful merge!" +#~ msgstr "成功合並!" + +#~ msgid "No merge possible" +#~ msgstr "沒有合並的可能" + +#~ msgid "Buddy address: " +#~ msgstr "好友地址:" + +#~ msgid "Allow usage of system wide ipfilter.dat" +#~ msgstr "允許使用系統級別的ipfilter.dat" + +#~ msgid "%d" +#~ msgstr "%d" + +#~ msgid " %d" +#~ msgstr " %d" + +#~ msgid ".%d" +#~ msgstr ".%d" + +#~ msgid "Shows the process of a search." +#~ msgstr "顯示搜索進度。" + +#~ msgid "Shows the process of a search..\n" +#~ msgstr "顯示搜索進度..\n" + +#~ msgid "Search warning." +#~ msgstr "搜索警告" + +#~ msgid "Client Identification:" +#~ msgstr "用戶身份:" + +#~ msgid "Use Secure Identification" +#~ msgstr "使用安全身份" + +#~ msgid "" +#~ "Secure Identification uses a handshake approch to safely identify clients " +#~ "for use with the credit system." +#~ msgstr "安全身份使用握手協議來確認用戶身份以計算積分。" + +#~ msgid "Sources Dropping" +#~ msgstr "源的精簡" + +#~ msgid "Source Dropping" +#~ msgstr "源的清理" + +#~ msgid "Keep sources" +#~ msgstr "保留源" + +#~ msgid "Drop sources" +#~ msgstr "清除源" + +#~ msgid "Send sources to any other file before dropping (High CPU)" +#~ msgstr "清除無用源前把源指派到其它下載檔案 (大CPU用量)" + +#~ msgid "Sources with no needed file-parts." +#~ msgstr "無需要文件段的源。" + +#~ msgid "Full Queue Sources Handling" +#~ msgstr "等候已滿的源的處理" + +#~ msgid "Enable auto drop Full Queue Sources" +#~ msgstr "啟用自動清除等候已滿的源" + +#~ msgid "High Queue Rating Sources Handling" +#~ msgstr "等候過長的源的處理" + +#~ msgid "Enable auto drop High Queue Rating Sources" +#~ msgstr "啟用自動清除等候過長的源" + +#~ msgid "High Queue Rating value" +#~ msgstr "等候長度" + +#~ msgid "(Min 300 / Max 3000)" +#~ msgstr "(最低 300 / 最高 3000)" + +#~ msgid "Auto Drop Sources Timer" +#~ msgstr "自動源清楚計時" + +#~ msgid "Timer (in secs)" +#~ msgstr "計時 (秒)" + +#~ msgid "(Min 60 / 3600 Max)" +#~ msgstr "(最低 60 / 最高 3600)" + +#~ msgid "Drop No Needed Sources now" +#~ msgstr "立即清理無可供下載的源" + +#~ msgid "Drop Full Queue Sources now" +#~ msgstr "立即清理等候已滿的源" + +#~ msgid "Drop High Queue Rating Sources now" +#~ msgstr "立即清理等候超長的源" + +#~ msgid "Clean Up Sources now (NNS, FQS && HQRS)" +#~ msgstr "立即清理所有無用源" + +#~ msgid "English (U.S.)" +#~ msgstr "英語 (美國)" + +#~ msgid "Spanish (Mexican)" +#~ msgstr "西班牙語 (墨西哥)" + +#~ msgid "Copy ED2k link to clipboard (Hostname)" +#~ msgstr "拷貝 ED2K 連結到剪貼簿 (計算機名)" + +#~ msgid "Minimize to trayicon" +#~ msgstr "縮到最小到系統狀態列" + +#~ msgid "Global Search" +#~ msgstr "全球搜尋" + +#~ msgid "Port %d is not available. You will be LOWID" +#~ msgstr "連接埠 %d 已被占用。你會成為低ID。" + +#~ msgid "" +#~ "Port %d is not available !!\n" +#~ "\n" +#~ "This will mean that you will be LOWID.\n" +#~ "\n" +#~ "Use netstat to determine when port becomes available\n" +#~ "and try starting amule again." +#~ msgstr "" +#~ "連接埠 %d 已被占用。\n" +#~ "這意味著你會成為低ID。\n" +#~ "\n" +#~ "請先用 netstat 指令來察看連接埠是否被占用,\n" +#~ "然後再啟動 aMule。" + +#~ msgid "Failed to save" +#~ msgstr "存檔失敗: " + +#~ msgid " OnlineSig File" +#~ msgstr "線上簽名檔案" + +#~ msgid "" +#~ "Unable to launch browser. Please set correct browser executable path in " +#~ "Preferences." +#~ msgstr "無法執行瀏覽器。請更正設定中的瀏覽器路徑。" + +#~ msgid "" +#~ " --- This is the first time you run aMule %s ---\n" +#~ "\n" +#~ msgstr "" +#~ " --- 這是您第一次執行 aMule %s ---\n" +#~ "\n" + +#~ msgid "This version is a testing version, updated daily, and \n" +#~ msgstr "這個版本是測試版, 每天更新, 而且 \n" + +#~ msgid "or kill your dog. But it *should* be safe to use anyway. \n" +#~ msgstr "或殺死你的狗. 但一般來講它應該是安全的.\n" + +#~ msgid "This version has new SecureIdent support, so your \n" +#~ msgstr "這個版本有新的安全代碼的功能, 所以你的\n" + +#~ msgid "client credits will be lost on this first run. \n" +#~ msgstr "使用者信用積分會在這次執行時丟失.\n" + +#~ msgid "There is no way to fix that, and eMule did the same.\n" +#~ msgstr "沒有辦法可以解決這個問題,即使是 eMule 也有同樣的問題.\n" + +#~ msgid "But your hash will be safe against stealers now, and your\n" +#~ msgstr "但你的代碼再也不會被盜用了, 並且你的\n" + +#~ msgid "" +#~ "cryptkey.dat, clients.met and preferences.dat are eMule compatible now.\n" +#~ msgstr "aMule的 cryptokey.dat 和 clients.met 檔案現在和 eMule 相容了.\n" + +#~ msgid "" +#~ "Just take them from your eMule config dir and put then on ~/.aMule.\n" +#~ msgstr "您可以從您的 eMule 的設定資料夾拷貝這兩了檔案到 ~/.aMule.\n" + +#~ msgid "" +#~ "This rc2 version fixes most of the rc1 version bugs and adds new " +#~ "features.\n" +#~ msgstr "" +#~ "這個RC2測試版已經改正了前一個測試版中的絕大多數錯誤並且增加了新的功能.\n" + +#~ msgid "" +#~ "For a full changes review, check Changelog file or www.amule.org, section " +#~ "Changelog.\n" +#~ msgstr "如要瞭解所有改動請到網站(www.amule.org)查詢Changelog.\n" + +#~ msgid "" +#~ "You locale has been changed to System Default due to version change. " +#~ "Sorry." +#~ msgstr "對不起,由於版本變動,您的地區設定已經被變為系統預設地區" + +#~ msgid "Feel free to report any bugs to forum.amule.org" +#~ msgstr "歡迎請您到 forum.amule.org 去回報錯誤報告" + +#~ msgid "Desktop integration" +#~ msgstr "桌面整合" + +#~ msgid "Disconnect from current server" +#~ msgstr "伺服器連線已中斷" + +#~ msgid "Connection established on:" +#~ msgstr "已成功連線到:" + +#~ msgid "Connect to any server" +#~ msgstr "連線到任意伺服器" + +#~ msgid "You are not connected to a server!" +#~ msgstr "您現在沒有連線到伺服器上!" + +#~ msgid "This ed2k link is invalid (%s)" +#~ msgstr "該 ED2K 連結無效 (%s)" + +#~ msgid "Invalid link: %s" +#~ msgstr "無效連結: %s" + +#~ msgid "Filtered IP: %s (%s)" +#~ msgstr "過濾 IP: %s (%s)" + +#~ msgid "Rating for file '%s' received: %i" +#~ msgstr "檔案 '%s' 的評價已收到: %i" + +#~ msgid "Description for file '%s' received: %s" +#~ msgstr "檔案 '%s' 的描述已收到: %s" + +#~ msgid "Unable to retrieve shared files from '%s'" +#~ msgstr "無法獲取 '%s' 的分享的檔案" + +#~ msgid "Old MlDonkey" +#~ msgstr "舊 MlDonkey" + +#~ msgid "New MlDonkey" +#~ msgstr "新 MlDonkey" + +#~ msgid "MLdonkey" +#~ msgstr "MlDonkey" + +#~ msgid "Requesting shared files from '%s'" +#~ msgstr "正在請求 '%s' 的分享的檔案" + +#~ msgid "Requesting shared files from user %s (%u) is already in progress" +#~ msgstr "已經在請求 %s (%u) 的分享的檔案" + +#~ msgid "NickName: %s\n" +#~ msgstr "暱稱: %s\n" + +#~ msgid "Filestats for all sessions: Accepted %d of %d requests" +#~ msgstr "整體檔案統計: 接受了 %d/%d 個請求" + +#~ msgid "Handshake not finished while processing packet." +#~ msgstr "處理資料包時未能完成協定擬定" + +#~ msgid "can't create file '%s'" +#~ msgstr "無法產生檔案: '%s'" + +#~ msgid "Can't open file '%s'" +#~ msgstr "無法開啟檔案: '%s'" + +#~ msgid "can't close file descriptor %d" +#~ msgstr "無法關閉檔案導引 %d" + +#~ msgid "can't read from file descriptor %d" +#~ msgstr "無法讀取檔案導引 %d" + +#~ msgid "can't write to file descriptor %d" +#~ msgstr "無法寫入檔案導引 %d" + +#~ msgid "can't flush file descriptor %d" +#~ msgstr "無法清空檔案導引 %d" + +#~ msgid "unknown seek origin" +#~ msgstr "不名搜尋原點" + +#~ msgid "can't get seek position on file descriptor %d" +#~ msgstr "無法在檔案導引 %d 中讀取搜尋位置" + +#~ msgid "can't find length of file on file descriptor %d" +#~ msgstr "無法在檔案導引 %d 中讀取檔案大小" + +#~ msgid "can't determine if the end of file is reached on descriptor %d" +#~ msgstr "無法基於檔案導引 %d 中確定是否抵達檔案終點" + +#~ msgid "invalid eof() return value." +#~ msgstr "eof() 返回值無效" + +#~ msgid "*** Chatsession Start : " +#~ msgstr "*** 對話開始 : " + +#~ msgid "failed" +#~ msgstr "失敗" + +#~ msgid "*** Disconnected" +#~ msgstr "*** 連線已斷" + +#~ msgid "Failed to load creditfile" +#~ msgstr "積分檔案載入失敗" + +#~ msgid "Creditfile is out of date and will be replaced" +#~ msgstr "積分檔案已過期,將會被取代" + +#~ msgid "Credits expired!" +#~ msgstr "積分已過期" + +#~ msgid "Failed to save creditfile" +#~ msgstr "積分檔案存檔失敗" + +#~ msgid "ClientSoftware ->" +#~ msgstr "使用者軟體" + +#~ msgid "<- ClientVersion ->v" +#~ msgstr "<- 使用者軟體版本 ->v" + +# fuzzy +#~ msgid "<- ClientModString ->" +#~ msgstr "使用者軟體版本代號" + +#~ msgid "" +#~ "WARNING! Found matching client, to a currently connected client: %s (%s) " +#~ "and with %s" +#~ msgstr "警告! 發現與已連線使用者重覆的使用者︰ %s (%s) 和 %s" + +#~ msgid "" +#~ "Error while processing incoming UDP Packet (Most likely a misconfigured " +#~ "server)" +#~ msgstr "接收的UDP資料包處理過程中發生錯誤極有可能是由於該伺服器的設定有問題" + +#~ msgid "" +#~ "Ignoring %u bytes of block %u-%u because of errornous zstream state for " +#~ "file \"%s\"" +#~ msgstr "" +#~ "由於檔案壓縮資料流狀態出現錯誤,放棄了 %u bytes 於資料塊 %u-%u 於檔案 \"%s" +#~ "\"" + +#~ msgid "Corrupted compressed packet for %s received (error %i)" +#~ msgstr "接收到損壞的壓縮封包 %s (error %i)" + +#~ msgid "Unknown exception in %s: file \"%s\"" +#~ msgstr "%s 中出現不名異常: file \"%s\"" + +#~ msgid "Check Fake" +#~ msgstr "檢查假檔" + +#~ msgid "Copy ED2k link to clipboard (&HTML)" +#~ msgstr "拷貝 ED2k 連線到剪貼簿 (HTML)" + +#~ msgid "Preview [" +#~ msgstr "預覽 [" + +#~ msgid "Are you sure that you want to cancel and delete this file ?\n" +#~ msgstr "您確定要取消下載並移除該檔案嗎?\n" + +#~ msgid "Are you sure that you want to cancel and delete these files ?\n" +#~ msgstr "您確定要取消下載並移除這些檔案嗎?\n" + +#~ msgid "Found %i part files" +#~ msgstr "發現 %i 個 part 檔案" + +#~ msgid "You already have the file %s" +#~ msgstr "您已下載了檔案 %s" + +#~ msgid "Bad link." +#~ msgstr "無效連線" + +#~ msgid "not a well-formed ed2k link" +#~ msgstr "ED2K 連結格式錯誤" + +#~ msgid "Not an ED2K server or file link" +#~ msgstr "不是 ED2K 伺服器或檔案連結" + +#~ msgid "can't write file '%s'" +#~ msgstr "無法寫檔案 '%s'" + +#~ msgid "New external connection accepted\n" +#~ msgstr "接受了新的外部連線\n" + +#~ msgid "" +#~ "Error: couldn't accept a new external connection\n" +#~ "\n" +#~ msgstr "" +#~ "錯誤: 無法接收外來連線\n" +#~ "\n" + +#~ msgid "done" +#~ msgstr "完成" + +#~ msgid "Failed to copy the file '%s' to '%s'" +#~ msgstr "無法拷貝檔案 '%s' 到 '%s'" + +#~ msgid "Impossible to get permissions for file '%s'" +#~ msgstr "無法取得檔案 '%s' 的許可" + +#~ msgid "Impossible to overwrite the file '%s'" +#~ msgstr "無法覆寫檔案 '%s'" + +#~ msgid "Impossible to set permissions for the file '%s'" +#~ msgstr "無法設定檔案 '%s' 的許可" + +#~ msgid "Loaded ipfilter with %d IP addresses." +#~ msgstr "成功載入IP位址過濾,共有 %d 個IP位址。" + +#~ msgid "Error: the file known.met is corrupted, unable to load known files" +#~ msgstr "錯誤: 檔案 known.met 已損壞,無法讀取已知檔案清單" + +#~ msgid "" +#~ "Unexpected file error while reading known.met: %s, unable to load known " +#~ "files" +#~ msgstr "讀取檔案 known.met 過程中發生意外錯誤: %s, 無法讀取已知檔案清單" + +#~ msgid "KnownFileList Save Starts" +#~ msgstr "已知檔案清單存檔開始" + +#~ msgid "KnownFileList Save Ends" +#~ msgstr "已知檔案清單存檔結束" + +#~ msgid "User %s (%u) requested your sharedfiles-list -> %s" +#~ msgstr "使用者 %s (%u) 請求了共享檔案清單 -> %s" + +#~ msgid "accepted" +#~ msgstr "已接受" + +#~ msgid "denied" +#~ msgstr "已拒絕" + +#~ msgid "User %s (%u) requested your shareddirectories-list -> %s" +#~ msgstr "使用者 %s (%u) 請求了分享的檔案夾清單 -> %s" + +#~ msgid "User %s (%u) requested your sharedfiles-list for directory %s -> %s" +#~ msgstr "使用者 %s (%u) 請求了資料夾 %s 內的共享檔案清單 -> %s" + +#~ msgid "User %s (%u) denied access to shareddirectories/files-list" +#~ msgstr "使用者 %s (%u) 拒絕提供分享的檔案/資料夾清單" + +#~ msgid "Client '%s' (IP:%s) caused an error: %s. Disconnecting client!" +#~ msgstr "使用者 '%s' (IP:%s) 造成錯誤: %s. 正在中斷連線!" + +#~ msgid "" +#~ "A client caused an error or did something bad: %s. Disconnecting client!" +#~ msgstr "某使用者造成錯誤或試圖攻擊: %s. 正在中斷連線!" + +#~ msgid "Client '%s' (IP:%s) caused an error: %u. Disconnecting client!" +#~ msgstr "使用者 '%s' (IP:%s) 造成錯誤: %u. 正在中斷連線!" + +#~ msgid "Unknown client (IP:%s) caused an error: %u. Disconnecting client!" +#~ msgstr "不名使用者 (IP:%s) 造成錯誤: %u. 正在中斷連線!" + +#~ msgid "" +#~ "A client caused an error or did something bad (error %u). Disconnecting " +#~ "client !" +#~ msgstr "某使用者造成錯誤或試圖攻擊(%u),正在中斷連線!" + +#~ msgid "" +#~ "For system tray integration to work,\n" +#~ "you must specify which desktop you are using.\n" +#~ "You can change this later from preferences." +#~ msgstr "" +#~ "為了使系統狀態列整合正常工作,\n" +#~ "您必需確定您所使用的桌面系統。\n" +#~ "您以後可以設定中變更此選項。" + +#~ msgid "Gnome 2.x (or other XEMBED compatible)" +#~ msgstr "Gnome 2.x (或其它 XEMBED 相容系統)" + +#~ msgid "No systray integration, please" +#~ msgstr "取消系統狀態列整合" + +#~ msgid "Desktop" +#~ msgstr "桌面" + +#~ msgid "Fast ED2K Links Handler (Direct Download)" +#~ msgstr "快速 ED2K 連結處理 (直接下載)" + +#~ msgid "Name" +#~ msgstr "名字" + +#~ msgid "Automatically assign new downloads to selected category" +#~ msgstr "自動設定新下載檔案到選擇的分類" + +#~ msgid "Min Availability" +#~ msgstr "最低源數" + +#~ msgid "Search global" +#~ msgstr "全球搜尋" + +#~ msgid "Clear All" +#~ msgstr "清除所有" + +#~ msgid "Download selected" +#~ msgstr "下載已選項" + +#~ msgid "Media Info" +#~ msgstr "媒體訊息" + +#~ msgid "Codec:" +#~ msgstr "編解碼器:" + +#~ msgid "Bitrate:" +#~ msgstr "資料率:" + +#~ msgid "Length:" +#~ msgstr "長度:" + +#~ msgid "Source Names" +#~ msgstr "源名稱" + +#~ msgid "Comment this file (this text will be show by all users)" +#~ msgstr "為該檔案加註釋 (給所有使用者看)" + +#~ msgid "Reload" +#~ msgstr "重新整理" + +#~ msgid "Clientsoftware :" +#~ msgstr "客戶軟體 :" + +#~ msgid "Server IP :" +#~ msgstr "伺服器 IP :" + +#~ msgid "Clientversion :" +#~ msgstr "客戶軟體版本 :" + +#~ msgid "Servername :" +#~ msgstr "伺服器名稱" + +#~ msgid "Currently downloading :" +#~ msgstr "正在下載 :" + +#~ msgid "Downloaded (this session) :" +#~ msgstr "下載 (本次執行) :" + +#~ msgid "Average downloadrate :" +#~ msgstr "平均下載速度 :" + +#~ msgid "Downloaded total :" +#~ msgstr "下載總量 :" + +#~ msgid "Uploaded (this session) :" +#~ msgstr "上傳 (本次執行) :" + +#~ msgid "Average Uploadrate :" +#~ msgstr "平均上傳速度 :" + +#~ msgid "Uploaded total :" +#~ msgstr "上傳總量 :" + +#~ msgid "DL/UP Modifier :" +#~ msgstr "下載/上傳 比率 :" + +#~ msgid "Rating (total) :" +#~ msgstr "評價 (總和) :" + +# +#~ msgid "Secure Ident :" +#~ msgstr "安全 Ident :" + +#~ msgid "Uploadqueue score :" +#~ msgstr "上傳等候分數 :" + +#~ msgid "Chinese" +#~ msgstr "中文" + +#~ msgid "English" +#~ msgstr "英語" + +#~ msgid "German (Swiss)" +#~ msgstr "德語 (瑞士)" + +#~ msgid "Portuguese (Brazil)" +#~ msgstr "葡萄牙語 (巴西)" + +#~ msgid "Spanish (Chile)" +#~ msgstr "西班牙語 (智利)" + +#~ msgid "Spanish (Mexico)" +#~ msgstr "西班牙語 (墨西哥)" + +#~ msgid "Turkey" +#~ msgstr "土耳其語" + +#~ msgid "Italian (Napoletan)" +#~ msgstr "意大利語 (Napoletan)" + +#~ msgid "Beep on errors" +#~ msgstr "遇錯誤發出蜂鳴警示" + +#~ msgid "Bring to front on link click" +#~ msgstr "滑鼠點擊連結是將程式移至前台" + +#~ msgid "Downloadlist doubleclick to expand" +#~ msgstr "滑鼠按二下展開下載清單" + +#~ msgid "Tooltip Delay Time in secs (1s to 5s)" +#~ msgstr "工具提示延遲時間秒數 (1-5)" + +#~ msgid "Systray Integration" +#~ msgstr "系統狀態列整合" + +#~ msgid "Startup" +#~ msgstr "啟動" + +#~ msgid "5 Days" +#~ msgstr "5 天" + +#~ msgid "Check for new version" +#~ msgstr "獲取新版本訊息" + +#~ msgid "Show Splashscreen" +#~ msgstr "顯示啟動畫面" + +#~ msgid "my browser" +#~ msgstr "我的瀏覽器" + +# +#~ msgid "Enter your browser name here" +#~ msgstr "請輸入瀏覽器名稱" + +#~ msgid "Clientport" +#~ msgstr "使用者連接埠" + +#~ msgid "Use Secure Ident" +#~ msgstr "使用安全 Ident" + +#~ msgid "IP-Filter" +#~ msgstr "IP 過濾" + +#~ msgid "IP-Filter ON / OFF" +#~ msgstr "IP 過濾 開/關" + +#~ msgid "Always filter bad IPs" +#~ msgstr "過濾無效 IP 位址" + +#~ msgid "See my shares" +#~ msgstr "查詢本地共享檔案清單" + +#~ msgid "Save 5 sources on rare files (< 20 sources)" +#~ msgstr "儲存稀有檔案的5個源 (< 20 個源)" + +#~ msgid "Extract Meta Data Tags" +#~ msgstr "提取訊息標籤" + +#~ msgid "Reduce Fragmentation" +#~ msgstr "降低硬碟資料散亂度" + +#~ msgid "Allocate full disk space for .part files" +#~ msgstr "預留整個硬碟空間給.part檔案" + +#~ msgid "" +#~ "This option reduces fragmentation but slows down the part file creation " +#~ "and will disable sparse files" +#~ msgstr "這個選項可以降低硬碟資料散亂度但會使part檔案的產生變慢" + +#~ msgid "Allocate full chucks for .part files" +#~ msgstr "預留資料段硬碟空間" + +#~ msgid "" +#~ "Select this to allocate a full chunk each time data is received for it." +#~ msgstr "這個選項在接收資料段前為其預留硬碟空間" + +#~ msgid " Min Disk Space: " +#~ msgstr " 最低硬碟空間: " + +#~ msgid "aMule Tweaks Advertisements && Parameters" +#~ msgstr "aMule 特殊設定" + +#~ msgid "Verbose (additional program feedback)" +#~ msgstr "顯示詳細資訊" + +#~ msgid "Autotake ED2K Links only during runtime" +#~ msgstr "祇有正在執行時才處理 ED2K 連結" + +#~ msgid "Arrange Downloads" +#~ msgstr "排列下載檔案" + +#~ msgid "Enable auto-arranging download list " +#~ msgstr "啟用自動排列下載檔案清單" + +#~ msgid "Download speed" +#~ msgstr "下載速度" + +#~ msgid "Number of sources" +#~ msgstr "源的數量" + +#~ msgid "GTK Theme Selector" +#~ msgstr "GTK 主題選擇" + +#~ msgid "Theme :" +#~ msgstr "主題 :" + +#~ msgid "Use Font " +#~ msgstr "使用字體 " + +#~ msgid "Font" +#~ msgstr "字體" + +#~ msgid "Use old style tabs on preferences" +#~ msgstr "使用舊式設定分葉" + +#~ msgid "No Needed Sources Handling" +#~ msgstr "無可供下載資料斷的源的處理" + +#~ msgid "Enable auto drop No Needed Sources" +#~ msgstr "啟用自動清除無可供下載資料斷的源" + +#~ msgid "Extended Dropping" +#~ msgstr "開拓與延伸無用源清除" + +# fuzzy +#~ msgid "Drop sources anyway" +#~ msgstr "無條件清除無用源" + +#~ msgid "Enable Webserver" +#~ msgstr "啟用HTTP伺服器" + +#~ msgid "Use TCP ports instead of unix local sockets" +#~ msgstr "使用TCP連接埠而不是Unix的本地接口" + +#~ msgid "External TCP port" +#~ msgstr "外部TCP連接埠" + +#~ msgid "Enable password" +#~ msgstr "啟用密碼" + +#~ msgid "Notify" +#~ msgstr "知會" + +#~ msgid "aMule Tweaks" +#~ msgstr "aMule 特殊設定" + +#~ msgid "Servers List Window" +#~ msgstr "伺服器清單視窗" + +#~ msgid "SharedFiles" +#~ msgstr "分享的檔案" + +#~ msgid "Error: Failed to open part.met file! (%s => %s)" +#~ msgstr "錯誤: 無法讀取 part.met 檔案 (%s => %s)" + +#~ msgid "Error: part.met fileis 0 size! (%s => %s)" +#~ msgstr "錯誤: part.met 檔案長度為零 (%s => %s)" + +#~ msgid "Trying backup of met file on (%s%s)" +#~ msgstr "嘗試把met檔案備份到 (%s%s)" + +#~ msgid "Error: Invalid part.met fileversion! (%s => %s)" +#~ msgstr "錯誤: 無效 part.met 檔案 (%s => %s)" + +#~ msgid "Error: %s (%s) is corrupt" +#~ msgstr "錯誤: %s (%s) 已損壞" + +#~ msgid "Error: %s (%s) is corrupt, unable to load file" +#~ msgstr "錯誤: 檔案 %s (%s) 已損壞,無法讀取檔案" + +#~ msgid "" +#~ "Unexpected file error while reading server.met: %s, unable to load " +#~ "serverlist" +#~ msgstr "讀取檔案 server.met 過程中發生意外錯誤: %s, 無法讀取伺服器清單" + +#~ msgid "Warning: %s might be corrupted" +#~ msgstr "警告: %s 可能已損壞" + +#~ msgid "ERROR while saving partfile: %s (%s => %s)" +#~ msgstr "part 檔案存檔是發生錯誤: %s (%s => %s)" + +#~ msgid ".part file not found" +#~ msgstr "找不到 .part 檔案" + +#~ msgid "Unable to open %s file - using %s file.\n" +#~ msgstr "無法讀取檔案 %s - 用 %s 檔案替代.\n" + +#~ msgid "" +#~ "%s file is 0 size somehow - using %s file.\n" +#~ " Please report on http://forum.amule.org\n" +#~ msgstr "" +#~ "%s 檔案長度為零 - 用 %s 檔案替代.\n" +#~ "請到我們的論壇彙報這個bug (http://forum.amule.org)\n" + +#~ msgid "Partfile %s (%s) has void seeds file" +#~ msgstr "Part檔案 %s (%s) 的種子檔案為空" + +#~ msgid "" +#~ "Found corrupted part (%i) in 0 parts file %s - FileResultHash |%s| " +#~ "FileHash |%s|" +#~ msgstr "" +#~ "發現損壞的資料塊 (%i) 於0段檔案 %s - 檔案結果檢驗碼 |%s| 檔案檢驗碼 |%s|" + +#~ msgid "" +#~ "Found corrupted part (%i) in %i parts file %s - FileResultHash |%s| " +#~ "FileHash |%s|" +#~ msgstr "" +#~ "發現損壞的資料塊 (%i) 於%i段檔案 %s - 檔案結果檢驗碼 |%s| 檔案檢驗碼 |%s|" + +#~ msgid "Failed to delete %s" +#~ msgstr "無法移除 %s" + +#~ msgid "Failed to delete %s%s" +#~ msgstr "無法移除 %s%s" + +# +#~ msgid "A file with that name already exists, the file has been renamed" +#~ msgstr "檔案名稱已存在, 現有檔案已被更名" + +#~ msgid "Finished downloading %s :-)" +#~ msgstr "完成下載 %s :-)" + +#~ msgid "Downloaded:" +#~ msgstr "已下載:" + +#~ msgid "Warning: Unable to hash downloaded part - hashset incomplete (%s)" +#~ msgstr "警告: 無法生成檢驗碼 - 檢驗碼殘缺 (%s)" + +#~ msgid "ERROR: Cannot write to disk" +#~ msgstr "錯誤: 無法寫入硬碟" + +#~ msgid "Downloaded part %i is corrupt :( (%s)" +#~ msgstr "下載的資料段 %i 已損壞 :( (%s)" + +#~ msgid "ICH: Recovered corrupted part %i (%s)" +#~ msgstr "ICH: 修復了損壞的資料段 %i (%s)" + +#~ msgid "Unexpected file error while writing %s : %s" +#~ msgstr "些入檔案 %s 時發生意外錯誤 : %s" + +#~ msgid "" +#~ "Partfilename: %s\n" +#~ "Parts: %d , %s: %d (%.1f%%)\n" +#~ msgstr "" +#~ "Part 檔案名稱: %s\n" +#~ "資料段: %d , %s: %d (%.1f%%)\n" + +#~ msgid "%d%% done (%s) - Transferring from %d sources" +#~ msgstr "%d%% 已完成 (%s) - 下載源 %d" + +#~ msgid "Available" +#~ msgstr "可用" + +#~ msgid "Last Seen Complete :" +#~ msgstr "最後一次發現完整源 :" + +#~ msgid "Last Reception:" +#~ msgstr "最後一次下載:" + +#~ msgid "Choose a folder for " +#~ msgstr "請選擇資料夾以用來 " + +#~ msgid "Update period: %i secs" +#~ msgstr "重新整理週期: %i 秒" + +#~ msgid "Update period: %i sec" +#~ msgstr "重新整理週期: %i 秒" + +#~ msgid "Update: Disabled" +#~ msgstr "重新整理: 已停用" + +#~ msgid "Server connection refresh interval %i mins" +#~ msgstr "伺服器連線重新整理週期: %i 分鐘" + +#~ msgid "Server connection refresh interval %i min" +#~ msgstr "伺服器連線重新整理週期: %i 分鐘" + +#~ msgid "Connections Graph Scale: %i" +#~ msgstr "網絡連線圖表規格: %i" + +#~ msgid "Time for running averages: %i mins" +#~ msgstr "動態平均統計時間範圍: %i 分鐘" + +#~ msgid "File Buffer Size %i bytes" +#~ msgstr "檔案緩衝區大小: %i bytes" + +#~ msgid "Upload Queue Size %i clients" +#~ msgstr "上傳等候長度: %i 個使用者" + +#~ msgid "%i days" +#~ msgstr "%i 天" + +#~ msgid "%i day" +#~ msgstr "%i 天" + +#~ msgid "Language change will not be applied until aMule is restarted." +#~ msgstr "語言設定更動在重新啟動 aMule 后纔會生效" + +#~ msgid "Executable (*)|*||" +#~ msgstr "可執行檔案 (*)|*||" + +#~ msgid "PowerShare[Release]" +#~ msgstr "發布" + +#~ msgid "Copy ED2k link to clipboard (HTML)" +#~ msgstr "拷貝 ED2K 連結到剪貼簿 (HTML)" + +#~ msgid "Close this search result" +#~ msgstr "關閉該搜尋結果" + +#~ msgid "Description: %s" +#~ msgstr "訊息: %s" + +#~ msgid "User: %i" +#~ msgstr "使用者: %i" + +#~ msgid "Unable to retrieve serverlist" +#~ msgstr "無法取得伺服器清單" + +#~ msgid "Failed to download the serverlist from %s" +#~ msgstr "無法從 %s 下載伺服器清單" + +#~ msgid "Failed to load server.met!" +#~ msgstr "無法載入 server.met!" + +#~ msgid "Invalid versiontag in server.met (0x%i , size %i)!" +#~ msgstr "server.met 中的版本標籤無效 (0x%i , size %i)!" + +#~ msgid "Error: the file server.met is corrupted" +#~ msgstr "錯誤: server.met 檔案已損壞" + +#~ msgid "Server added: " +#~ msgstr "增添伺服器: " + +#~ msgid "Connect to this server" +#~ msgstr "連線到該伺服器" + +#~ msgid "Add to static" +#~ msgstr "加入靜態清單" + +#~ msgid "Remove from static server list" +#~ msgstr "從靜態清單中移除" + +# +#~ msgid "Reconnect to this server" +#~ msgstr "重新連線到該伺服器" + +#~ msgid "Preference" +#~ msgstr "設定" + +#~ msgid "No Pref" +#~ msgstr "無設定" + +#~ msgid "Failed to open staticservers.dat" +#~ msgstr "無法開啟檔案 staticservers.dat" + +#~ msgid "Added to static server list" +#~ msgstr "已加入靜態檔案清單" + +#~ msgid "Unknown server info received !" +#~ msgstr "收到不名伺服器訊息 !" + +#~ msgid "Unhandled error while processing packet from server (%s)" +#~ msgstr "在處理從伺服器接收的資料是有無法處理的錯誤 (%s)" + +#~ msgid "Connecting to %s (%s:%i)..." +#~ msgstr "正在連線 %s (%s:%i)..." + +#~ msgid "Error in serversocket: %s (%s:%i): %u" +#~ msgstr "伺服器接口錯誤: %s (%s:%i): %u" + +#~ msgid "This is " +#~ msgstr "這是 " + +#~ msgid " (based on " +#~ msgstr "(基於 " + +#~ msgid "Visit http://www.amule.org to check if a new version is available.\n" +#~ msgstr "請存取 http://www.amule.org 以下載最新版本\n" + +#~ msgid "Please enter a serveraddress" +#~ msgstr "請輸入伺服器位址" + +#~ msgid "Incomplete serverport: Please enter a serverport" +#~ msgstr "伺服器連接埠不完整: 請輸入伺服器連接埠" + +#~ msgid "Server not added!" +#~ msgstr "沒有記錄伺服器!" + +#~ msgid "Low ID" +#~ msgstr "低 ID" + +#~ msgid "High ID" +#~ msgstr "高 ID" + +#~ msgid "Loading..." +#~ msgstr "正在裝入..." + +#~ msgid "Permission" +#~ msgstr "許可" + +#~ msgid "Public" +#~ msgstr "公共" + +#~ msgid "Friends only" +#~ msgstr "只限好友" + +#~ msgid "Locked" +#~ msgstr "已鎖定" + +#~ msgid "Permissions" +#~ msgstr "許可" + +#~ msgid "Change this file's comment..." +#~ msgstr "變更該檔案的註釋" + +#~ msgid "Auto [Re]" +#~ msgstr "自動 [發布]" + +# +#~ msgid "Auto [UNK]" +#~ msgstr "自動 [UNK]" + +#~ msgid "Hidden" +#~ msgstr "隱藏" + +#~ msgid "You cannot change permissions while a file is still downloading!" +#~ msgstr "檔案正在下載,無法改變許可." + +#~ msgid "%s (%s:%i) appears to be full" +#~ msgstr "%s (%s:%i) 可能已沒有空位" + +#~ msgid "Connecting to %s (%s:%i ) failed." +#~ msgstr "連線失敗 %s (%s:%i )" + +#~ msgid "Connection attempt to %s (%s:%i ) timed out" +#~ msgstr "連線逾時 %s (%s:%i )" + +#~ msgid "Refreshing server connection" +#~ msgstr "正在重新整理伺服器連線" + +#~ msgid "Filtered: %i" +#~ msgstr "過濾: %i" + +#~ msgid "Uptime: " +#~ msgstr "執行時間: " + +#~ msgid "Downloaded Data (Session (Total)): %s (%s)" +#~ msgstr "下載資料量 (本次執行 (總和)): %s (%s)" + +#~ msgid "Total Overhead (Packets): %s (%s)" +#~ msgstr "總無用資料量 (本次執行 (總和)): %s (%s)" + +#~ msgid "File Request Overhead (Packets): %s (%s)" +#~ msgstr "檔案請求無用資料 (本次執行 (總和)): %s (%s)" + +#~ msgid "Source Exchange Overhead (Packets): %s (%s)" +#~ msgstr "源交換無用資料 (本次執行 (總和)): %s (%s)" + +#~ msgid "Server Overhead (Packets): %s (%s)" +#~ msgstr "伺服器無用資料 (本次執行 (總和)): %s (%s)" + +#~ msgid "Found Sources: %i" +#~ msgstr "發現源: %i" + +#~ msgid "Active Downloads (chunks): %i" +#~ msgstr "作用中下載 (資料段): %i" + +#~ msgid "Uploaded Data (Session (Total)): %s (%s)" +#~ msgstr "上傳資料量 (本次執行 (總和)): %s (%s)" + +#~ msgid "Active Uploads: %i" +#~ msgstr "作用中上傳: %i" + +#~ msgid "Waiting Uploads: %i" +#~ msgstr "等待上傳: %i" + +#~ msgid "Total successful upload sessions: %i" +#~ msgstr "總成功上傳片段: %i" + +#~ msgid "Total failed upload sessions: %i" +#~ msgstr "總失敗上傳片段: %i" + +#~ msgid "Average Downloadrate (Session): %.2f kB/s" +#~ msgstr "平均下載速度 (本次執行): %.2f kB/s" + +#~ msgid "Average Uploadrate (Session): %.2f kB/s" +#~ msgstr "平均上傳速度 (本次執行): %.2f kB/s" + +#~ msgid "Max Downloadrate Average (Session): %.2f kB/s" +#~ msgstr "平均最高下載速度 (本次執行): %.2f kB/s" + +#~ msgid "Max Downloadrate (Session): %.2f kB/s" +#~ msgstr "最高下載速度 (本次執行): %.2f kB/s" + +#~ msgid "waiting for transfer..." +#~ msgstr "等待傳輸..." + +#~ msgid "waiting for connection..." +#~ msgstr "等待連線..." + +#~ msgid "Session UL:DL Ratio (Total):" +#~ msgstr "本次執行 上傳:下載 比率 (總和):" + +#~ msgid "%s Not available" +#~ msgstr "%s 無" + +#~ msgid "Number of Shared Files: %i" +#~ msgstr "分享的檔案數: %i" + +#~ msgid "Old MLDonkey: %i (%1.1f%%)" +#~ msgstr "舊 MLDonkey: %i (%1.1f%%)" + +#~ msgid "New MLDonkey: %i (%1.1f%%)" +#~ msgstr "新 MLDonkey: %i (%1.1f%%)" + +#~ msgid "Unknown: %i" +#~ msgstr "不名: %i" + +#~ msgid "Working Servers" +#~ msgstr "正常執行的伺服器" + +#~ msgid "Failed Servers" +#~ msgstr "當機的伺服器" + +#~ msgid "Deleted Servers" +#~ msgstr "已移除的伺服器" + +#~ msgid "Users on Working Servers" +#~ msgstr "正常執行伺服器上的使用者總數" + +#~ msgid "Files on Working Servers" +#~ msgstr "正常執行伺服器上的檔案總數" + +#~ msgid "Total Users" +#~ msgstr "使用者總數" + +#~ msgid "Total Files" +#~ msgstr "檔案總數" + +#~ msgid "Active Connections (estimate)" +#~ msgstr "作用中連線 (估計值)" + +#~ msgid "Max Connection Limit Reached" +#~ msgstr "連線總數已達到上限" + +#~ msgid "Average Connections (estimate)" +#~ msgstr "平均連線 (估計值)" + +#~ msgid "Peak Connections (estimate)" +#~ msgstr "最高連線 (估計值)" + +#~ msgid "Detection Disabled" +#~ msgstr "探測已停用" + +# +#~ msgid "Not Found" +#~ msgstr "找不到" + +#~ msgid "Actual Speed Limits:" +#~ msgstr "實際速度限制: " + +#~ msgid "DL: " +#~ msgstr "下載: " + +#~ msgid "UP: " +#~ msgstr "上傳: " + +#~ msgid "aMule Tray Menu Info" +#~ msgstr "aMule 狀態列 選單 訊息" + +# +#~ msgid "Nick: " +#~ msgstr "暱稱: " + +# fuzzy +#~ msgid "Nick: Not Ready" +#~ msgstr "暱稱: 未就緒" + +#~ msgid "Hash: " +#~ msgstr "檢驗碼: " + +# fuzzy +#~ msgid "Hash: Not Ready" +#~ msgstr "檢驗碼: 未就緒" + +#~ msgid "ID: Not Connected" +#~ msgstr "代號: 未連線" + +#~ msgid "TCP Port: " +#~ msgstr "TCP 連接埠︰" + +#~ msgid "UDP Port: " +#~ msgstr "UDP 連接埠︰" + +#~ msgid "Uptime: None" +#~ msgstr "執行時間: 無" + +#~ msgid "ServerName: Not Connected" +#~ msgstr "伺服器名稱: 未連線" + +#~ msgid "ServerIP: Not Connected" +#~ msgstr "伺服器 IP: 未連線" + +#~ msgid "Shared Files: " +#~ msgstr "分享的檔案: " + +#~ msgid "Queued Clients: " +#~ msgstr "等候中使用者: " + +#~ msgid "Total DL: " +#~ msgstr "總下載: " + +#~ msgid "Total UP: " +#~ msgstr "總上傳: " + +#~ msgid "Personal Infos" +#~ msgstr "個人訊息" + +#~ msgid "Hide" +#~ msgstr "隱藏" + +#~ msgid "Show" +#~ msgstr "顯示" + +#~ msgid "All To Max Speed" +#~ msgstr "全設為最高速度" + +#~ msgid "All To Min Speed" +#~ msgstr "全設為最低速度" + +#~ msgid "Disconnect from server" +#~ msgstr "伺服器連線中斷" + +#~ msgid "Error while processing incoming extended protocol UDP Packet" +#~ msgstr "處理接收到的開拓與延伸協定UDP資料包時發生錯誤" + +#~ msgid "" +#~ "Client '%s' caused error while creating package (%s) - disconnecting " +#~ "client" +#~ msgstr "使用者 '%s' 在產生資料包 (%s) 時造成錯誤 - 正在中斷這個使用者連線" + +#~ msgid "requested file not found" +#~ msgstr "找不到請求的檔案" + +#~ msgid "" +#~ "Client '%s' seems to be an aggressive client and is banned from the " +#~ "uploadqueue" +#~ msgstr "使用者 '%s' 可能使用的是妖魔版 - 這個使用者已被封殺." + +#~ msgid "%s [%s:%i] using %s removed : invalide eMule client" +#~ msgstr "使用者 %s [%s:%i] 使用軟體 %s 已被移除 : 非法 eMule 版本" + +#~ msgid "%s [%s:%i] using %s removed : suspicious mod string change" +#~ msgstr "使用者 %s [%s:%i] 使用軟體 %s 已被移除 : 可疑版本代號" + +#~ msgid "%s [%s:%i] using %s removed : known leecher" +#~ msgstr "使用者 %s [%s:%i] 使用軟體 %s 已被移除 : 已知的吸血鬼" + +#~ msgid "%s [%s:%i] using %s removed : suspicious hash change" +#~ msgstr "使用者 %s [%s:%i] 使用軟體 %s 已被移除 : 可疑的使用者代碼變動" + +#~ msgid "%s [%s:%i] using %s removed : use your own hash" +#~ msgstr "使用者 %s [%s:%i] 使用軟體 %s 已被移除 : 盜用他人使用者代碼" + +#~ msgid "%s [%s:%i] using %s removed : suspicious name change" +#~ msgstr "使用者 %s [%s:%i] 使用軟體 %s 已被移除 : 可疑的使用者名稱變動" + +#~ msgid "" +#~ "%s [%s:%i] using %s removed : leecher, invalid eMule or irregular Donkey" +#~ msgstr "使用者 %s [%s:%i] 使用軟體 %s 已被移除 : 吸血鬼, 非法版本" + +#~ msgid "Client '%s' and '%s' have the same userhash or IP - removed '%s'" +#~ msgstr "使用者 '%s' 和 '%s' 使用者代碼或IP覆疊 - 已移除 '%s'" + +#~ msgid "Can't load templates: Can't open file %s" +#~ msgstr "無法載入範本: 無法開啟檔案: '%s'" + +#~ msgid "" +#~ "Can't find template version number!\n" +#~ "Please replace aMule.tmpl with a newer version!" +#~ msgstr "" +#~ "找不到範本版本號!\n" +#~ "請升級 aMule.tmpl 到新版本!" + +#~ msgid "Failed to load template %s\n" +#~ msgstr "無法載入範本 %s\n" + +# +#~ msgid "Access denied!" +#~ msgstr "請求被拒絕" + +#~ msgid "Web Control Panel" +#~ msgstr "網絡伺服器控制板" + +#~ msgid "Server list" +#~ msgstr "伺服器清單" + +#~ msgid "ED2K Link(s)" +#~ msgstr "ED2K連結" + +#~ msgid "Log" +#~ msgstr "日誌" + +#~ msgid "Serverinfo" +#~ msgstr "伺服器訊息" + +#~ msgid "Debug Log" +#~ msgstr "除錯日誌" + +#~ msgid "&Preferences" +#~ msgstr "偏好項 (&P)" + +#~ msgid "Logout" +#~ msgstr "登出" + +#~ msgid "users" +#~ msgstr "使用者" + +#~ msgid "Limits" +#~ msgstr "限制" + +#~ msgid "Server name" +#~ msgstr "伺服器名稱" + +#~ msgid "files" +#~ msgstr "檔案" + +#~ msgid "Actions" +#~ msgstr "動作" + +#~ msgid "Remove selected server" +#~ msgstr "移除選擇的伺服器" + +#~ msgid "Are you sure to remove this server from list?" +#~ msgstr "您確定要把該伺服器從清單中移除嗎?" + +#~ msgid "Downloaded total" +#~ msgstr "下載總量" + +#~ msgid "Uploaded total" +#~ msgstr "上傳總量" + +#~ msgid "Are you sure that you want to cancel and delete this file?\\n" +#~ msgstr "您確定要取消下載並移除該檔案嗎?\\n" + +#~ msgid "Increase Priority" +#~ msgstr "提高優先等級" + +#~ msgid "Decrease Priority" +#~ msgstr "降低優先等級" + +#~ msgid "Hide Queue" +#~ msgstr "隱藏等候" + +#~ msgid "Download Selected" +#~ msgstr "下載已選檔案" + +#~ msgid "Time" +#~ msgstr "時間" + +#~ msgid "IP or Address" +#~ msgstr "IP 或位址︰" + +#~ msgid "Add to list" +#~ msgstr "加入清單" + +#~ msgid "Update server.met from URL" +#~ msgstr "讀取URL以更新server.met" + +#~ msgid "Web-based Search" +#~ msgstr "網上搜尋" + +#~ msgid "File Settings" +#~ msgstr "檔案設定" + +#~ msgid "Max Sources Per File" +#~ msgstr "單個檔案最大源數" + +#~ msgid "Max. Connections" +#~ msgstr "最大連線數" + +#~ msgid "max. new connections / 5secs" +#~ msgstr "5 秒內最大新連線數" + +#~ msgid "Gzip Compression" +#~ msgstr "啟用 Gzip 壓縮" + +#~ msgid "Save traffic, especially in graphs." +#~ msgstr "儲存傳輸資料,特別是在圖裡" + +#~ msgid "Enable or disable the display of waiting queue in transfer page." +#~ msgstr "啟用或停用傳輸頁內的等待等候顯示" + +#~ msgid "Refresh-Time of Pages" +#~ msgstr "頁重新整理週期" + +#~ msgid "Time in seconds (zero=disabled):" +#~ msgstr "時間秒數 (0代表停用)" + +#~ msgid "Speed Limits" +#~ msgstr "速度限制" + +#~ msgid "Bandwidth Limits" +#~ msgstr "頻寬限制" + +#~ msgid "Login" +#~ msgstr "登入" + +# +#~ msgid "Enter your password here" +#~ msgstr "請輸入密碼" + +#~ msgid "Login Now" +#~ msgstr "現在登入" + +#~ msgid "Webserver: Logout" +#~ msgstr "伺服器: 登出" + +#~ msgid "Search Results" +#~ msgstr "搜尋結果" + +#~ msgid "Refetch Results" +#~ msgstr "重新整理結果" + +#~ msgid "File Hash" +#~ msgstr "檔案檢驗碼" + +#~ msgid "Method" +#~ msgstr "方式" + +#~ msgid "Global (Server)" +#~ msgstr "全球 (伺服器)" diff --git a/src/AddFriend.cpp b/src/AddFriend.cpp new file mode 100644 index 00000000..75b13e5c --- /dev/null +++ b/src/AddFriend.cpp @@ -0,0 +1,87 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "AddFriend.h" // Interface declarations. +#include "muuli_wdr.h" // Needed for addFriendDlg +#include "amule.h" // Needed for theApp +#include "amuleDlg.h" // Needed for amuleDlg +#include "ChatWnd.h" +#include "NetworkFunctions.h" +#include "OtherFunctions.h" +#include "MD4Hash.h" +#include // Needed for unicode2char + + +BEGIN_EVENT_TABLE(CAddFriend, wxDialog) + EVT_BUTTON(ID_ADDFRIEND, CAddFriend::OnAddBtn) + EVT_BUTTON(ID_CLOSEDLG, CAddFriend::OnCloseBtn) +END_EVENT_TABLE() + + +CAddFriend::CAddFriend(wxWindow* parent) +: wxDialog(parent, 9995, _("Add a Friend"), wxDefaultPosition, wxDefaultSize, +wxDEFAULT_DIALOG_STYLE|wxSYSTEM_MENU) +{ + wxSizer* content=addFriendDlg(this, TRUE); + content->Show(this, TRUE); +} + +void CAddFriend::OnAddBtn(wxCommandEvent& WXUNUSED(evt)) +{ + wxString name = CastChild(ID_USERNAME, wxTextCtrl)->GetValue().Strip(wxString::both); + wxString hash = CastChild(ID_USERHASH, wxTextCtrl)->GetValue().Strip(wxString::both); + wxString fullip = CastChild(ID_IPADDRESS, wxTextCtrl)->GetValue().Strip(wxString::both); + uint16 port = StrToULong( CastChild(ID_IPORT, wxTextCtrl)->GetValue() ); + uint32 ip = StringIPtoUint32(fullip); + + if (!ip || !port) { + wxMessageBox(_("You have to enter a valid IP and port!"), _("Information"), wxOK | wxICON_INFORMATION, this); + return; + } + + CMD4Hash userhash; + if ((!hash.IsEmpty()) && (!userhash.Decode(hash))) { + wxMessageBox(_("The specified userhash is not valid!"), _("Information"), wxOK | wxICON_INFORMATION, this); + return; + }; + + // Better than nothing at all... + if ( name.IsEmpty() ) { + name = fullip; + } + + theApp->amuledlg->m_chatwnd->AddFriend( userhash,name, ip, port); + + EndModal(true); // Friend added +} + + +void CAddFriend::OnCloseBtn(wxCommandEvent& WXUNUSED(evt)) +{ + EndModal(false); // Friend not added +} + +// File_checked_for_headers diff --git a/src/AddFriend.h b/src/AddFriend.h new file mode 100644 index 00000000..6ec1c574 --- /dev/null +++ b/src/AddFriend.h @@ -0,0 +1,46 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef ADDFRIEND_H +#define ADDFRIEND_H + +#include // Needed for wxDialog + +class CAddFriend : public wxDialog +{ +public: + CAddFriend(wxWindow* parent); + ~CAddFriend() {}; + +protected: + DECLARE_EVENT_TABLE() + +private: + void OnAddBtn(wxCommandEvent& evt); + void OnCloseBtn(wxCommandEvent& evt); +}; + +#endif +// File_checked_for_headers diff --git a/src/ArchSpecific.h b/src/ArchSpecific.h new file mode 100644 index 00000000..00c9e7ca --- /dev/null +++ b/src/ArchSpecific.h @@ -0,0 +1,231 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef ARCHSPECIFIC_H +#define ARCHSPECIFIC_H + +#include "Types.h" + +#define ENDIAN_SWAP_16(x) (wxUINT16_SWAP_ON_BE(x)) +#define ENDIAN_SWAP_I_16(x) x = wxUINT16_SWAP_ON_BE(x) +#define ENDIAN_SWAP_32(x) (wxUINT32_SWAP_ON_BE(x)) +#define ENDIAN_SWAP_I_32(x) x = wxUINT32_SWAP_ON_BE(x) + +#if ((defined __GNUC__) && __GNUC__ >= 2) || defined (_MSC_VER) + #define ENDIAN_SWAP_64(x) (wxUINT64_SWAP_ON_BE(x)) + #define ENDIAN_SWAP_I_64(x) x = wxUINT64_SWAP_ON_BE(x) +#endif + +// ntohs +#define ENDIAN_NTOHS(x) ( wxUINT16_SWAP_ON_LE(x) ) +// ntohl +#define ENDIAN_NTOHL(x) ( wxUINT32_SWAP_ON_LE(x) ) +// new +#define ENDIAN_NTOHLL(x) ( wxUINT64_SWAP_ON_LE(x) ) +// htons +#define ENDIAN_HTONS(x) ( wxUINT16_SWAP_ON_LE(x) ) +// htonl +#define ENDIAN_HTONL(x) ( wxUINT32_SWAP_ON_LE(x) ) +// new +#define ENDIAN_HTONLL(x) ( wxUINT64_SWAP_ON_LE(x) ) + + +/** + * Returns the value in the given bytestream. + * + * The value is returned exactly as it is found. + */ +// \{ +inline uint16 RawPeekUInt16(const void* p); +inline uint32 RawPeekUInt32(const void* p); +inline uint64 RawPeekUInt64(const void* p); +// \} + + + +/** + * Writes the specified value into the bytestream. + * + * The value is written exactly as it is. + */ +// \{ +inline void RawPokeUInt16(void* p, uint16 nVal); +inline void RawPokeUInt32(void* p, uint32 nVal); +inline void RawPokeUInt64(void* p, uint64 nVal); +// \} + + +/** + * Returns the value in the given bytestream. + * + * The value is returned as little-endian. + */ +// \{ +inline uint8 PeekUInt8(const void* p); +inline uint16 PeekUInt16(const void* p); +inline uint32 PeekUInt32(const void* p); +inline uint64 PeekUInt64(const void* p); +// \} + + +/** + * Writes the specified value into the bytestream. + * + * The value is written as little-endian. + */ +// \{ +inline void PokeUInt8(void* p, uint8 nVal); +inline void PokeUInt16(void* p, uint16 nVal); +inline void PokeUInt32(void* p, uint32 nVal); +inline void PokeUInt64(void* p, uint64 nVal); +// \} + + +#if defined(__arm__) || defined(__sparc__) + #define ARM_OR_SPARC +#endif + + +/////////////////////////////////////////////////////////////////////////////// +// Peek - helper functions for read-accessing memory without modifying the memory pointer + +inline uint16 RawPeekUInt16(const void* p) +{ +#ifndef ARM_OR_SPARC + return *((uint16*)p); +#else + uint16 value; + memcpy( &value, p, sizeof( uint16 ) ); + return value; +#endif +} + + +inline uint32 RawPeekUInt32(const void* p) +{ +#ifndef ARM_OR_SPARC + return *((uint32*)p); +#else + uint32 value; + memcpy( &value, p, sizeof( uint32 ) ); + return value; +#endif +} + + +inline uint64 RawPeekUInt64(const void* p) +{ +#ifndef ARM_OR_SPARC + return *((uint64*)p); +#else + uint64 value; + memcpy( &value, p, sizeof( uint64 ) ); + return value; +#endif +} + + +inline uint8 PeekUInt8(const void* p) +{ + return *((uint8*)p); +} + + +inline uint16 PeekUInt16(const void* p) +{ + return ENDIAN_SWAP_16( RawPeekUInt16( p ) ); +} + + +inline uint32 PeekUInt32(const void* p) +{ + return ENDIAN_SWAP_32( RawPeekUInt32( p ) ); +} + +inline uint64 PeekUInt64(const void* p) +{ + return ENDIAN_SWAP_64( RawPeekUInt64( p ) ); +} + + + +/////////////////////////////////////////////////////////////////////////////// +// Poke - helper functions for write-accessing memory without modifying the memory pointer + + +inline void RawPokeUInt16(void* p, uint16 nVal) +{ +#ifndef ARM_OR_SPARC + *((uint16*)p) = nVal; +#else + memcpy( p, &nVal, sizeof(uint16) ); +#endif +} + + +inline void RawPokeUInt32(void* p, uint32 nVal) +{ +#ifndef ARM_OR_SPARC + *((uint32*)p) = nVal; +#else + memcpy( p, &nVal, sizeof(uint32) ); +#endif +} + + +inline void RawPokeUInt64(void* p, uint64 nVal) +{ +#ifndef ARM_OR_SPARC + *((uint64*)p) = nVal; +#else + memcpy( p, &nVal, sizeof(uint64) ); +#endif +} + + +inline void PokeUInt8(void* p, uint8 nVal) +{ + *((uint8*)p) = nVal; +} + + +inline void PokeUInt16(void* p, uint16 nVal) +{ + RawPokeUInt16( p, ENDIAN_SWAP_16( nVal ) ); +} + + +inline void PokeUInt32(void* p, uint32 nVal) +{ + RawPokeUInt32( p, ENDIAN_SWAP_32( nVal ) ); +} + +inline void PokeUInt64(void* p, uint64 nVal) +{ + RawPokeUInt64( p, ENDIAN_SWAP_64( nVal ) ); +} + +#endif +// File_checked_for_headers diff --git a/src/AsyncDNS.cpp b/src/AsyncDNS.cpp new file mode 100644 index 00000000..5d688977 --- /dev/null +++ b/src/AsyncDNS.cpp @@ -0,0 +1,75 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal Veiga - Kry (kry@amule.org) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "AsyncDNS.h" // Interface declaration + +#include "InternalEvents.h" // Needed for wxEVT_* +#include "NetworkFunctions.h" // Needed for StringHosttoUint32 + + +CAsyncDNS::CAsyncDNS(const wxChar* ipName, DnsSolveType type, wxEvtHandler* handler, void* socket) + : wxThread(wxTHREAD_DETACHED) +{ + m_type = type; + m_ipName = ipName; + m_socket = socket; + m_handler = handler; +} + + +wxThread::ExitCode CAsyncDNS::Entry() +{ + uint32 result = StringHosttoUint32(m_ipName); + uint32 event_id = 0; + void* event_data = NULL; + + switch (m_type) { + case DNS_UDP: + event_id = wxEVT_CORE_UDP_DNS_DONE; + event_data = m_socket; + break; + case DNS_SOURCE: + event_id = wxEVT_CORE_SOURCE_DNS_DONE; + event_data = NULL; + break; + case DNS_SERVER_CONNECT: + event_id = wxEVT_CORE_SERVER_DNS_DONE; + event_data = m_socket; + break; + default: + printf("WRONG TYPE ID ON ASYNC DNS SOLVING!!!\n"); + } + + if (event_id) { + CMuleInternalEvent evt(event_id); + evt.SetExtraLong(result); + evt.SetClientData(event_data); + wxPostEvent(m_handler,evt); + } + + return NULL; +} +// File_checked_for_headers diff --git a/src/AsyncDNS.h b/src/AsyncDNS.h new file mode 100644 index 00000000..59e3c38f --- /dev/null +++ b/src/AsyncDNS.h @@ -0,0 +1,64 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal Veiga - Kry (kry@amule.org) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef ASYNCDNS_H +#define ASYNCDNS_H + +#include +#include + +// Implementation of Asynchronous dns resolving using wxThread +// and internal wxIPV4address handling of dns + +class wxEvtHandler; + +enum DnsSolveType { + DNS_UDP, + DNS_SOURCE, + DNS_SERVER_CONNECT +}; + +// Time between DNS solving the same address +// 30 minutes * 60 s/m * 1000 ms/s +#define DNS_SOLVE_TIME 30*60*1000 + + +class CAsyncDNS : public wxThread +{ +public: + /** Note: wxChar* is used to circument the thread-unsafe wxString reference counting. */ + CAsyncDNS(const wxChar* ipName, DnsSolveType type, wxEvtHandler* handler, void* socket = NULL); + virtual ExitCode Entry(); + +private: + DnsSolveType m_type; + wxString m_ipName; + void* m_socket; + wxEvtHandler* m_handler; +}; + +#endif // ASYNCDNS_H +// File_checked_for_headers diff --git a/src/BarShader.cpp b/src/BarShader.cpp new file mode 100644 index 00000000..db72391c --- /dev/null +++ b/src/BarShader.cpp @@ -0,0 +1,283 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include +#include "Color.h" // Needed for RGB + +#include "BarShader.h" // Interface declarations. + +const double Pi = 3.14159265358979323846264338328; + +#define HALF(X) (((X) + 1) / 2) +#define DEFAULT_DEPTH 10 + + +CBarShader::CBarShader(uint32 height, uint32 width) +: m_Width( width ), + m_Height( height ), + m_FileSize( 1 ), + m_Modifiers( NULL ), + m_used3dlevel( DEFAULT_DEPTH ) +{ + Fill( 0 ); +} + + +CBarShader::~CBarShader() +{ + if ( m_Modifiers ) { + delete[] m_Modifiers; + } +} + + +void CBarShader::Reset() +{ + m_spanlist.clear(); + Fill(0); +} + + +void CBarShader::SetFileSize(uint64 fileSize) +{ + m_FileSize = fileSize; + Reset(); +} + + +void CBarShader::SetHeight( int height ) +{ + if( m_Height != height ) { + m_Height = height; + + // Reset the modifers + if ( m_Modifiers ) { + delete[] m_Modifiers; + m_Modifiers = NULL; + } + } +} + + +void CBarShader::Set3dDepth( int depth ) +{ + if ( depth < 1 ) { + depth = 1; + } else if ( depth > 5 ) { + depth = 5; + } + + if ( m_used3dlevel != depth ) { + m_used3dlevel = depth; + + // Reset the modifers + if ( m_Modifiers ) { + delete[] m_Modifiers; + m_Modifiers = NULL; + } + } +} + + +void CBarShader::BuildModifiers() +{ + if ( m_Modifiers ) { + delete[] m_Modifiers; + } + + int depth = (7-m_used3dlevel); + int count = HALF(m_Height); + double piOverDepth = Pi/depth; + double base = piOverDepth * ((depth / 2.0) - 1); + double increment = piOverDepth / (count - 1); + + m_Modifiers = new double[count]; + for (int i = 0; i < count; i++) + m_Modifiers[i] = (double)(sin(base + i * increment)); +} + + +void CBarShader::FillRange(uint64 start, uint64 end, const uint32 color) +{ + // Sanity check + wxASSERT( start <= end ); + + if ( start >= m_FileSize ) { + return; + } + + if ( end >= m_FileSize ) { + end = m_FileSize - 1; + } + + m_spanlist.insert( start, end, color ); +} + + +void CBarShader::Fill(uint32 color) +{ + m_spanlist.clear(); + m_spanlist.insert( 0, m_FileSize - 1, color ); +} + + +void CBarShader::Draw( wxDC* dc, int iLeft, int iTop, bool bFlat ) +{ + wxASSERT( dc ); + + // Check if there's anything to do ... + if ( m_spanlist.empty() ) { + return; + } + + + // Do we need to rebuild the modifiers? + if ( !bFlat && !m_Modifiers ) { + BuildModifiers(); + } + + wxRect rectSpan; + rectSpan.x = iLeft; + rectSpan.y = iTop; + rectSpan.height = m_Height; + rectSpan.width = 0; + + dc->SetPen(*wxTRANSPARENT_PEN); + + // This modifier is multipled with sizes to allow for better handling of small ranges + const uint64 MOD = 1000; + // This is the number of bits each pixel should contain. + const uint64 bitsPerPixel = (m_FileSize * MOD) / (uint64)m_Width; + + // The initial values for partial pixel drawing + uint64 curPixel = 0; + uint64 curRed = 0; + uint64 curGreen = 0; + uint64 curBlue = 0; + + // Initialize to the first range + SpanList::iterator it = m_spanlist.begin(); + uint64 size = (uint64)( it.keyEnd() - it.keyStart() + 1 ) * MOD; + uint32 color = *it++; + + // Loop until everything has been drawn + while ( size || curPixel ) { + if ( !size && it != m_spanlist.end() ) { + // Fetch the next range and increment the iterator + size = (uint64)( it.keyEnd() - it.keyStart() + 1 ) * MOD; + color = *it++; + } else if ( curPixel || size < bitsPerPixel ) { + // This block is responsible for drawing ranges that are too small + // to fill a single pixel. To overcome this problem, we gather the + // sum of ranges until we have enough to draw a single pixel. The + // color of this pixel will be the sum of the colors of the ranges + // within the single pixel, each weighted after its relative size. + + // See how much we can take from the current range + uint64 curDiff = std::min( size, bitsPerPixel - curPixel ); + + // Increment the current size of the partial pixel + curPixel += curDiff; + + // Add the color of the current range times the ammount of the current + // range that was added to the partial pixel. The result will be divided + // by the length of the partial pixel to get the average. + curRed += curDiff * GetRValue( color ); + curGreen += curDiff * GetGValue( color ); + curBlue += curDiff * GetBValue( color ); + + // If we have a complete pixel, or if we have run out of usable ranges, + // then draw the partial pixel. Note that size is modified below this + // check, so that it only triggers when size was 0 to begin with. + if ( curPixel == bitsPerPixel || !size ) { + // Draw a single line containing the average of the smaller parts + uint32 col = RGB( (uint32)(curRed / curPixel), + (uint32)(curGreen / curPixel), + (uint32)(curBlue / curPixel) ); + + // Reset the partial-pixel + curPixel = curRed = curGreen = curBlue = 0; + + // Increment the position on the device-context + rectSpan.x += rectSpan.width; + rectSpan.width = 1; + + // Draw the line + FillRect(dc, rectSpan, col, bFlat); + } + + // Decrement size + size -= curDiff; + } else { + // We are dealing with a range that is large enough to draw by itself. + // We will draw as many complete pixels as we can, and allow the rest + // to be absorbed by the partial pixel. + rectSpan.x += rectSpan.width; + rectSpan.width = size / bitsPerPixel; + + // Unused size will be used by the partial-pixel drawing code. + size = size % bitsPerPixel; + + // Draw the range + FillRect(dc, rectSpan, color, bFlat); + } + } +} + + +void CBarShader::FillRect(wxDC *dc, const wxRect& rectSpan, uint32 color, bool bFlat) +{ + wxASSERT( dc ); + + if( bFlat || !color ) { + wxBrush brush( WxColourFromCr(color), wxSOLID ); + dc->SetBrush( brush ); + dc->DrawRectangle( rectSpan ); + } else { + int x1 = rectSpan.x; + int x2 = rectSpan.x + rectSpan.width; + int y1 = rectSpan.y; + int y2 = rectSpan.GetBottom(); + + int Max = HALF(m_Height); + for (int i = 0; i < Max; i++) { + int cRed = std::min( 255, (int)(GetRValue(color) * m_Modifiers[i] + .5f) ); + int cGreen = std::min( 255, (int)(GetGValue(color) * m_Modifiers[i] + .5f) ); + int cBlue = std::min( 255, (int)(GetBValue(color) * m_Modifiers[i] + .5f) ); + + wxPen pen( wxColour( cRed, cGreen, cBlue ), 1, wxSOLID ); + dc->SetPen( pen ); + + // Draw top row + dc->DrawLine( x1, y1 + i, x2, y1 + i ); + + // Draw bottom row + dc->DrawLine( x1, y2 - i, x2, y2 - i ); + } + } + + dc->SetBrush(wxNullBrush); +} +// File_checked_for_headers diff --git a/src/BarShader.h b/src/BarShader.h new file mode 100644 index 00000000..d47fa133 --- /dev/null +++ b/src/BarShader.h @@ -0,0 +1,211 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef BARSHADER_H +#define BARSHADER_H + +#include "Types.h" // Needed for uint16 and uint32 +#include "RangeMap.h" // Needed for CRangeMap + + +class wxRect; +class wxDC; + + +/** + * The barshader class is responsible for drawing the chunk-based progress bars used in aMule. + * + * CBarShader represents the chunks of a file through the use of spans, which + * cover a range in the file with a certain color. New spans can be added on + * the fly and old spans are automatically removed, resized or merged when + * necessary. + * + * CBarShader will try to minimize the number of spans when possible. + */ +class CBarShader +{ +public: + /** + * Constructor. + * + * @param height The height of the area upon which the span is drawn. + * @param width The width of the area upon which the span is drawn. + */ + CBarShader(uint32 height = 1, uint32 width = 1); + + /** + * Destructor. + */ + ~CBarShader(); + + /** + * Sets the width of the drawn bar. + * + * @param width The new width. + * + * Setting this sets the width the bar which is used when it + * is drawn. The BarShader automatically fits the intire span- + * structure inside this area. + */ + void SetWidth(int width) { + m_Width = width; + } + + /** + * Sets the height of the drawn bar. + * + * @param height The new height. + * + * Changes the height of the bar, used when it is drawn. + */ + void SetHeight( int height ); + + + /** + * Sets the 3D-depth of the bar + * + * @param depth A value in the range from 1 to 5. + */ + void Set3dDepth( int depth ); + + + /** + * Returns the current width of the bar. + * + * @return The width of the bar. + */ + int GetWidth() const { + return m_Width; + } + + /** + * Returns the current height of the bar. + * + * @return The height of the bar. + */ + int GetHeight() const { + return m_Height; + } + + /** + * Returns the current 3D-depth of the bar. + * + * @return The 3D-depth of the bar. + */ + int Get3dDepth() const { + return m_used3dlevel; + } + + + /** + * Removes all spans from the bar. + * + * Calling this function deletes all current spans and fills the + * bar with a black span from 0 to filesize. + */ + void Reset(); + + /** + * Sets a new filesize. + * + * @param fileSize The new filesize. + * + * Calling this function sets a new filesize, which is the virtual + * length of the bar. This function does not change any spans already + * present and therefore, they might end up pointing past current + * filesize if the size if smaller than before. + */ + void SetFileSize(uint64 fileSize); + + /** + * Fills in a range with a certain color. + * + * @param start The starting position of the new span. + * @param end The ending position of the new span. Must be larger than start. + * @param color The color of the new span. + * + * Calling this function fill the specified range with the specified color. + * Any spans completly or partially covered by the new span are either + * removed or resized. If the value of end is larger than the current + * filesize, the filesize is increased to the value of end. + */ + void FillRange(uint64 start, uint64 end, const uint32 color); + + /** + * Fill the entire bar with a span of the specified color. + * + * @param color The color of the new span. + */ + void Fill(uint32 color); + + /** + * Draws the bar on the specifed wxDC. + * + * @param dc The wxDC upon which the bar should be drawn. + * @param iLeft The left position from where to start drawing. + * @param iTop The top position from where to start drawing. + * @param bFlat 3D effect is not applied if this is true. + * + * This functions draws the bar with the height and width specified + * through either the contructor or with SetWidth() and SetHeight(). + */ + void Draw( wxDC* dc, int iLeft, int iTop, bool bFlat ); + +private: + /** + * Calculates the modifiers used to create 3d effect. + */ + void BuildModifiers(); + + /** + * Fills a rectangle with a given color. + * + * @param dc The DC upon which to draw the bar. + * @param rectSpan The area within the specifed DC upon which to draw. + * @param color The color of the rectangle. + * @param bFlat If this is true, a simple rectangle will be drawn, otherwise the modifers will be applyed to achive a 3D effect. + */ + void FillRect(wxDC* dc, const wxRect& rectSpan, uint32 color, bool bFlat); + + //! The width of the drawn bar + int m_Width; + //! The height of the drawn bar + int m_Height; + //! The virtual filesize assosiated with the bar + uint64 m_FileSize; + //! Pointer to array of modifers used to create 3D effect. Size is (m_Height+1)/2 when set. + double* m_Modifiers; + //! The current 3d level + uint16 m_used3dlevel; + + + //! SpanList is defined as a CRangeMap with uint32s as range-data + typedef CRangeMap SpanList; + //! The list of spans. This list is kept sorted. + SpanList m_spanlist; +}; + +#endif +// File_checked_for_headers diff --git a/src/BaseClient.cpp b/src/BaseClient.cpp new file mode 100644 index 00000000..55d8a0df --- /dev/null +++ b/src/BaseClient.cpp @@ -0,0 +1,2440 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include + +#include "updownclient.h" // Needed for CUpDownClient + +#include +#include +#include +#include + +#include + +#include + +#include // Needed for inflateEnd + +#include // Needed for CFormat + +#include "SearchList.h" // Needed for CSearchList +#include "DownloadQueue.h" // Needed for CDownloadQueue +#include "UploadQueue.h" // Needed for CUploadQueue +#include "IPFilter.h" // Needed for CIPFilter +#include "ServerConnect.h" // Needed for CServerConnect +#include "ClientCredits.h" // Needed for CClientCredits +#include "ClientCreditsList.h" // Needed for CClientCreditsList +#include "Server.h" // Needed for CServer +#include "Preferences.h" // Needed for CPreferences +#include "MemFile.h" // Needed for CMemFile +#include "Packet.h" // Needed for CPacket +#include "Friend.h" // Needed for CFriend +#include "ClientList.h" // Needed for CClientList +#include "amule.h" // Needed for theApp +#include "PartFile.h" // Needed for CPartFile +#include "ClientTCPSocket.h" // Needed for CClientTCPSocket +#include "ListenSocket.h" // Needed for CListenSocket +#include "FriendList.h" // Needed for CFriendList +#include "Statistics.h" // Needed for theStats +#include "ClientUDPSocket.h" +#include "Logger.h" +#include "DataToText.h" // Needed for GetSoftName() +#include "GuiEvents.h" // Needed for Notify_ +#include "ServerList.h" // For CServerList + +#include "kademlia/kademlia/Kademlia.h" +#include "kademlia/kademlia/Prefs.h" +#include "kademlia/kademlia/Search.h" + + +//#define __PACKET_DEBUG__ + + +// some client testing variables +static wxString crash_name = wxT("[Invalid User Name]"); +static wxString empty_name = wxT("[Empty User Name]"); + +// members of CUpDownClient +// which are used by down and uploading functions + + +CUpDownClient::CUpDownClient(CClientTCPSocket* sender) +{ +#ifdef __DEBUG__ + m_socket = NULL; + SetSocket(sender); +#else + m_socket = sender; +#endif + Init(); +} + +CUpDownClient::CUpDownClient(uint16 in_port, uint32 in_userid, uint32 in_serverip, uint16 in_serverport, CPartFile* in_reqfile, bool ed2kID, bool checkfriend) +{ + m_socket = NULL; + Init(); + m_nUserPort = in_port; + + if(ed2kID && !IsLowID(in_userid)) { + SetUserIDHybrid( wxUINT32_SWAP_ALWAYS(in_userid) ); + } else { + SetUserIDHybrid( in_userid); + } + + //If highID and ED2K source, incoming ID and IP are equal.. + //If highID and Kad source, incoming IP needs swap for the IP + + if (!HasLowID()) { + if (ed2kID) { + m_nConnectIP = in_userid; + } else { + m_nConnectIP = wxUINT32_SWAP_ALWAYS(in_userid); + } + // Will be on right endianess now + m_FullUserIP = Uint32toStringIP(m_nConnectIP); + } + + m_dwServerIP = in_serverip; + m_nServerPort = in_serverport; + SetRequestFile( in_reqfile ); + ReGetClientSoft(); + + if (checkfriend) { + if ((m_Friend = theApp->friendlist->FindFriend(CMD4Hash(), m_dwUserIP, m_nUserPort)) != NULL){ + m_Friend->LinkClient(this); + } else{ + // avoid that an unwanted client instance keeps a friend slot + m_bFriendSlot = false; + } + } + +} + +void CUpDownClient::Init() +{ + m_bAddNextConnect = false; + credits = NULL; + m_byChatstate = MS_NONE; + m_nKadState = KS_NONE; + m_cShowDR = 0; + m_reqfile = NULL; // No file required yet + m_nTransferredUp = 0; + m_cSendblock = 0; + m_cAsked = 0; + msReceivedPrev = 0; + kBpsDown = 0.0; + fDownAvgFilter = 1.0; + bytesReceivedCycle = 0; + m_nServerPort = 0; + m_iFileListRequested = 0; + m_dwLastUpRequest = 0; + m_bEmuleProtocol = false; + m_bCompleteSource = false; + m_bFriendSlot = false; + m_bCommentDirty = false; + m_bReaskPending = false; + m_bUDPPending = false; + m_nUserPort = 0; + m_nPartCount = 0; + m_dwLastAskedTime = 0; + m_nDownloadState = DS_NONE; + m_dwUploadTime = 0; + m_nTransferredDown = 0; + m_nUploadState = US_NONE; + m_dwLastBlockReceived = 0; + m_bUnicodeSupport = false; + + m_fSentOutOfPartReqs = 0; + m_nCurQueueSessionPayloadUp = 0; + m_addedPayloadQueueSession = 0; + m_nUpDatarate = 0; + m_nSumForAvgUpDataRate = 0; + + m_nRemoteQueueRank = 0; + m_nOldRemoteQueueRank = 0; + m_dwLastSourceRequest = 0; + m_dwLastSourceAnswer = 0; + m_dwLastAskedForSources = 0; + + m_SecureIdentState = IS_UNAVAILABLE; + m_dwLastSignatureIP = 0; + + m_byInfopacketsReceived = IP_NONE; + + m_bIsHybrid = false; + m_bIsML = false; + m_Friend = NULL; + m_iRating = 0; + m_nCurSessionUp = 0; + m_clientSoft=SO_UNKNOWN; + + m_bRemoteQueueFull = false; + m_HasValidHash = false; + SetWaitStartTime(); + + m_fHashsetRequesting = 0; + m_fSharedDirectories = 0; + m_lastPartAsked = 0xffff; + m_nUpCompleteSourcesCount= 0; + m_lastRefreshedDLDisplay = 0; + m_bHelloAnswerPending = false; + m_fSentCancelTransfer = 0; + m_Aggressiveness = 0; + m_LastFileRequest = 0; + + m_clientState = CS_NEW; + + ClearHelloProperties(); + + m_pReqFileAICHHash = NULL; + m_fSupportsAICH = 0; + m_fAICHRequested = 0; + m_fSupportsLargeFiles = 0; + m_fExtMultiPacket = 0; + + m_dwUserIP = 0; + m_nConnectIP = 0; + m_dwServerIP = 0; + + m_fNeedOurPublicIP = false; + m_bHashsetRequested = false; + + m_nLastBlockOffset = 0; + + m_uploadingfile = NULL; + + m_OSInfo_sent = false; + + /* Kad stuff */ + SetBuddyID(NULL); + m_nBuddyIP = 0; + m_nBuddyPort = 0; + m_nUserIDHybrid = 0; + + m_nSourceFrom = SF_NONE; + + if (m_socket) { + amuleIPV4Address address; + m_socket->GetPeer(address); + m_FullUserIP = address.IPAddress(); + SetIP(StringIPtoUint32(m_FullUserIP)); + } else { + SetIP(0); + } + + /* Statistics */ + m_lastClientSoft = (uint32)(-1); + m_lastClientVersion = 0; + + /* Creation time (for buddies timeout) */ + m_nCreationTime = ::GetTickCount(); + + m_MaxBlockRequests = STANDARD_BLOCKS_REQUEST; // Safe starting amount + + m_last_block_start = 0; + m_lastaverage = 0; + + SetLastBuddyPingPongTime(); + m_fRequestsCryptLayer = 0; + m_fSupportsCryptLayer = 0; + m_fRequiresCryptLayer = 0; + m_fSupportsSourceEx2 = 0; + + m_hasbeenobfuscatinglately = false; +} + + +CUpDownClient::~CUpDownClient() +{ + #ifdef __DEBUG__ + if (!connection_reason.IsEmpty()) { + printf("Client to check for %s was deleted without connection.\n",(const char*)unicode2char(connection_reason)); + } + #endif + + if (m_lastClientSoft == SO_UNKNOWN) { + theStats::RemoveUnknownClient(); + } else if (m_lastClientSoft != (uint32)(-1)) { + theStats::RemoveKnownClient(m_lastClientSoft, m_lastClientVersion, m_lastOSInfo); + } + + // Indicate that we are not anymore on stats + m_lastClientSoft = (uint32)(-1); + + + if (IsAICHReqPending()){ + m_fAICHRequested = FALSE; + CAICHHashSet::ClientAICHRequestFailed(this); + } + + //theApp->clientlist->RemoveClient(this, wxT("Destructing client object")); + + if (m_Friend) { + m_Friend->UnLinkClient(); + Notify_ChatRefreshFriend(m_Friend->GetIP(), m_Friend->GetPort(), wxEmptyString); + m_Friend = NULL; + } + + // The socket should have been removed in Safe_Delete, but it + // doesn't hurt to have an extra check. + if (m_socket) { + m_socket->Safe_Delete(); + // Paranoia + SetSocket(NULL); + } + + + ClearUploadBlockRequests(); + ClearDownloadBlockRequests(); + + DeleteContents(m_WaitingPackets_list); + + if (m_iRating>0 || !m_strComment.IsEmpty()) { + m_iRating = 0; + m_strComment.Clear(); + if (m_reqfile) { + m_reqfile->UpdateFileRatingCommentAvail(); + } + } + + // Ensure that source-counts gets updated in case + // of a source not on the download-queue + SetRequestFile( NULL ); + + SetUploadFileID(NULL); + + if (m_pReqFileAICHHash != NULL) { + delete m_pReqFileAICHHash; + m_pReqFileAICHHash = NULL; + } +} + +void CUpDownClient::ClearHelloProperties() +{ + m_nUDPPort = 0; + m_byUDPVer = 0; + m_byDataCompVer = 0; + m_byEmuleVersion = 0; + m_bySourceExchange1Ver = 0; + m_byAcceptCommentVer = 0; + m_byExtendedRequestsVer = 0; + m_byCompatibleClient = 0; + m_nKadPort = 0; + m_bySupportSecIdent = 0; + m_bSupportsPreview = 0; + m_nClientVersion = 0; + m_fSharedDirectories = 0; + m_bMultiPacket = 0; + m_fOsInfoSupport = 0; + m_fValueBasedTypeTags = 0; + SecIdentSupRec = 0; + m_byKadVersion = 0; + m_fRequestsCryptLayer = 0; + m_fSupportsCryptLayer = 0; + m_fRequiresCryptLayer = 0; + m_fSupportsSourceEx2 = 0; +} + +bool CUpDownClient::ProcessHelloPacket(const byte* pachPacket, uint32 nSize) +{ + const CMemFile data(pachPacket,nSize); + uint8 hashsize = data.ReadUInt8(); + if ( 16 != hashsize ) { + /* + * Hint: We can not accept other sizes here because: + * - the magic number is spread all over the source + * - the answer packet lacks the size field + */ + throw wxString(wxT("Invalid Hello packet: Other userhash sizes than 16 are not implemented")); + } + // eMule 0.42: reset all client properties; a client may not send a particular emule tag any longer + ClearHelloProperties(); + + return ProcessHelloTypePacket(data); +} + +void CUpDownClient::Safe_Delete() +{ + // Because we are delaying the deletion, we might end up trying to delete + // it twice, however, this is normal and shouldn't trigger any failures + if ( m_clientState == CS_DYING ) { + return; + } + + m_clientState = CS_DYING; + + // Close the socket to avoid any more connections and related events + if ( m_socket ) { + m_socket->Safe_Delete(); + // Paranoia + SetSocket(NULL); + } + + // Schedule the client for deletion if we still have the clientlist + if ( theApp->clientlist ) { + theApp->clientlist->AddToDeleteQueue( this ); + } else { + delete this; + } +} + + +bool CUpDownClient::ProcessHelloAnswer(const byte* pachPacket, uint32 nSize) +{ + const CMemFile data(pachPacket,nSize); + bool bIsMule = ProcessHelloTypePacket(data); + m_bHelloAnswerPending = false; + return bIsMule; +} + +bool CUpDownClient::ProcessHelloTypePacket(const CMemFile& data) +{ + + m_bIsHybrid = false; + m_bIsML = false; + m_fNoViewSharedFiles = 0; + m_bUnicodeSupport = false; + uint32 dwEmuleTags = 0; + + CMD4Hash hash = data.ReadHash(); + SetUserHash( hash ); + SetUserIDHybrid( data.ReadUInt32() ); + uint16 nUserPort = data.ReadUInt16(); // hmm clientport is sent twice - why? + uint32 tagcount = data.ReadUInt32(); + for (uint32 i = 0;i < tagcount; i++){ + CTag temptag(data, true); + switch(temptag.GetNameID()){ + case CT_NAME: + m_Username = temptag.GetStr(); + break; + + case CT_VERSION: + m_nClientVersion = temptag.GetInt(); + break; + + case ET_MOD_VERSION: + if (temptag.IsStr()) { + m_strModVersion = temptag.GetStr(); + } else if (temptag.IsInt()) { + m_strModVersion = wxString::Format(wxT("ModID=%u"), temptag.GetInt()); + } else { + m_strModVersion = wxT("ModID="); + } + + break; + + case CT_PORT: + nUserPort = temptag.GetInt(); + break; + + case CT_EMULE_UDPPORTS: + // 16 KAD Port + // 16 UDP Port + SetKadPort((temptag.GetInt() >> 16) & 0xFFFF); + m_nUDPPort = temptag.GetInt() & 0xFFFF; + dwEmuleTags |= 1; + #ifdef __PACKET_DEBUG__ + printf("Hello type packet processing with eMule ports UDP=%i KAD=%i\n",m_nUDPPort,m_nKadPort); + #endif + break; + + case CT_EMULE_BUDDYIP: + // 32 BUDDY IP + m_nBuddyIP = temptag.GetInt(); + #ifdef __PACKET_DEBUG__ + printf("Hello type packet processing with eMule BuddyIP=%u (%s)\n",m_nBuddyIP, (const char*)unicode2char(Uint32toStringIP(m_nBuddyIP))); + #endif + break; + + case CT_EMULE_BUDDYUDP: + // 16 --Reserved for future use-- + // 16 BUDDY Port + m_nBuddyPort = (uint16)temptag.GetInt(); + #ifdef __PACKET_DEBUG__ + printf("Hello type packet processing with eMule BuddyPort=%u\n",m_nBuddyPort); + #endif + break; + + case CT_EMULE_MISCOPTIONS1: { + // 3 AICH Version (0 = not supported) + // 1 Unicode + // 4 UDP version + // 4 Data compression version + // 4 Secure Ident + // 4 Source Exchange + // 4 Ext. Requests + // 4 Comments + // 1 PeerChache supported + // 1 No 'View Shared Files' supported + // 1 MultiPacket + // 1 Preview + uint32 flags = temptag.GetInt(); + m_fSupportsAICH = (flags >> (4*7+1)) & 0x07; + m_bUnicodeSupport = (flags >> 4*7) & 0x01; + m_byUDPVer = (flags >> 4*6) & 0x0f; + m_byDataCompVer = (flags >> 4*5) & 0x0f; + m_bySupportSecIdent = (flags >> 4*4) & 0x0f; + m_bySourceExchange1Ver = (flags >> 4*3) & 0x0f; + m_byExtendedRequestsVer = (flags >> 4*2) & 0x0f; + m_byAcceptCommentVer = (flags >> 4*1) & 0x0f; + m_fNoViewSharedFiles = (flags >> 1*2) & 0x01; + m_bMultiPacket = (flags >> 1*1) & 0x01; + m_fSupportsPreview = (flags >> 1*0) & 0x01; + dwEmuleTags |= 2; + #ifdef __PACKET_DEBUG__ + printf("Hello type packet processing with eMule Misc Options:\n"); + printf("m_byUDPVer = %i\n",m_byUDPVer); + printf("m_byDataCompVer = %i\n",m_byDataCompVer); + printf("m_bySupportSecIdent = %i\n",m_bySupportSecIdent); + printf("m_bySourceExchangeVer = %i\n",m_bySourceExchange1Ver); + printf("m_byExtendedRequestsVer = %i\n",m_byExtendedRequestsVer); + printf("m_byAcceptCommentVer = %i\n",m_byAcceptCommentVer); + printf("m_fNoViewSharedFiles = %i\n",m_fNoViewSharedFiles); + printf("m_bMultiPacket = %i\n",m_bMultiPacket); + printf("m_fSupportsPreview = %i\n",m_fSharedDirectories); + printf("That's all.\n"); + #endif + SecIdentSupRec += 1; + break; + } + + case CT_EMULE_MISCOPTIONS2: + // 22 Reserved + m_fSupportsSourceEx2 = (temptag.GetInt() >> 10) & 0x01; + m_fRequiresCryptLayer = (temptag.GetInt() >> 9) & 0x01; + m_fRequestsCryptLayer = (temptag.GetInt() >> 8) & 0x01; + m_fSupportsCryptLayer = (temptag.GetInt() >> 7) & 0x01; + // reserved 1 + m_fExtMultiPacket = (temptag.GetInt() >> 5) & 0x01; + m_fSupportsLargeFiles = (temptag.GetInt() >> 4) & 0x01; + m_byKadVersion = (temptag.GetInt() >> 0) & 0x0f; + dwEmuleTags |= 8; + + m_fRequestsCryptLayer &= m_fSupportsCryptLayer; + m_fRequiresCryptLayer &= m_fRequestsCryptLayer; + + #ifdef __PACKET_DEBUG__ + printf("Hello type packet processing with eMule Misc Options 2:\n"); + printf(" KadVersion = %u\n" , m_byKadVersion ); + printf("That's all.\n"); + #endif + break; + + // Special tag fo Compat. Clients Misc options. + case CT_EMULECOMPAT_OPTIONS: + // 1 Operative System Info + // 1 Value-based-type int tags (experimental!) + m_fValueBasedTypeTags = (temptag.GetInt() >> 1*1) & 0x01; + m_fOsInfoSupport = (temptag.GetInt() >> 1*0) & 0x01; + break; + + case CT_EMULE_VERSION: + // 8 Compatible Client ID + // 7 Mjr Version (Doesn't really matter..) + // 7 Min Version (Only need 0-99) + // 3 Upd Version (Only need 0-5) + // 7 Bld Version (Only need 0-99) + m_byCompatibleClient = (temptag.GetInt() >> 24); + m_nClientVersion = temptag.GetInt() & 0x00ffffff; + m_byEmuleVersion = 0x99; + m_fSharedDirectories = 1; + dwEmuleTags |= 4; + break; + } + } + + m_nUserPort = nUserPort; + m_dwServerIP = data.ReadUInt32(); + m_nServerPort = data.ReadUInt16(); + // Hybrid now has an extra uint32.. What is it for? + // Also, many clients seem to send an extra 6? These are not eDonkeys or Hybrids.. + if ( data.GetLength() - data.GetPosition() == sizeof(uint32) ) { + uint32 test = data.ReadUInt32(); + /*if (test == 'KDLM') below kdlm is converted to ascii values. + This fixes a warning with gcc 3.4. + K=4b D=44 L=4c M=4d + */ + if (test == 0x4b444c4d) { //if it's == "KDLM" + m_bIsML=true; + } else{ + m_bIsHybrid = true; + m_fSharedDirectories = 1; + } + } + + if (m_socket) { + amuleIPV4Address address; + m_socket->GetPeer(address); + m_FullUserIP = address.IPAddress(); + SetIP(StringIPtoUint32(m_FullUserIP)); + } else { + throw wxString(wxT("Huh, socket failure. Avoided crash this time.")); + } + + if (thePrefs::AddServersFromClient()) { + CServer* addsrv = new CServer(m_nServerPort, Uint32toStringIP(m_dwServerIP)); + addsrv->SetListName(addsrv->GetAddress()); + if (!theApp->AddServer(addsrv)) { + delete addsrv; + } + } + + //(a)If this is a highID user, store the ID in the Hybrid format. + //(b)Some older clients will not send a ID, these client are HighID users that are not connected to a server. + //(c)Kad users with a *.*.*.0 IPs will look like a lowID user they are actually a highID user.. They can be detected easily + //because they will send a ID that is the same as their IP.. + if(!HasLowID() || m_nUserIDHybrid == 0 || m_nUserIDHybrid == m_dwUserIP ) { + SetUserIDHybrid(wxUINT32_SWAP_ALWAYS(m_dwUserIP)); + } + + // get client credits + CClientCredits* pFoundCredits = theApp->clientcredits->GetCredit(m_UserHash); + if (credits == NULL){ + credits = pFoundCredits; + if (!theApp->clientlist->ComparePriorUserhash(m_dwUserIP, m_nUserPort, pFoundCredits)){ + AddDebugLogLineM( false, logClient, CFormat( wxT("Client: %s (%s) Banreason: Userhash changed (Found in TrackedClientsList)") ) % GetUserName() % GetFullIP() ); + Ban(); + } + } else if (credits != pFoundCredits){ + // userhash change ok, however two hours "waittime" before it can be used + credits = pFoundCredits; + AddDebugLogLineM( false, logClient, CFormat( wxT("Client: %s (%s) Banreason: Userhash changed") ) % GetUserName() % GetFullIP() ); + Ban(); + } + + if ((m_Friend = theApp->friendlist->FindFriend(m_UserHash, m_dwUserIP, m_nUserPort)) != NULL){ + m_Friend->LinkClient(this); + } else{ + // avoid that an unwanted client instance keeps a friend slot + SetFriendSlot(false); + } + + + ReGetClientSoft(); + + m_byInfopacketsReceived |= IP_EDONKEYPROTPACK; + + // check if at least CT_EMULEVERSION was received, all other tags are optional + bool bIsMule = (dwEmuleTags & 0x04) == 0x04; + if (bIsMule) { + m_bEmuleProtocol = true; + m_byInfopacketsReceived |= IP_EMULEPROTPACK; + } + + if( GetKadPort() ) { + Kademlia::CKademlia::Bootstrap(wxUINT32_SWAP_ALWAYS(GetIP()), GetKadPort()); + } + + return bIsMule; +} + + +bool CUpDownClient::SendHelloPacket() { + + if (m_socket == NULL){ + wxASSERT(0); + return true; + } + + // if IP is filtered, dont greet him but disconnect... + amuleIPV4Address address; + m_socket->GetPeer(address); + if ( theApp->ipfilter->IsFiltered(StringIPtoUint32(address.IPAddress()))) { + if (Disconnected(wxT("IPFilter"))) { + Safe_Delete(); + return false; + } + return true; + } + + CMemFile data(128); + data.WriteUInt8(16); // size of userhash + SendHelloTypePacket(&data); + + CPacket* packet = new CPacket(data, OP_EDONKEYPROT, OP_HELLO); + theStats::AddUpOverheadOther(packet->GetPacketSize()); + SendPacket(packet,true); + m_bHelloAnswerPending = true; + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_HELLO to ") + GetFullIP() ); + return true; +} + +void CUpDownClient::SendMuleInfoPacket(bool bAnswer, bool OSInfo) { + + if (m_socket == NULL){ + wxASSERT(0); + return; + } + + CPacket* packet = NULL; + CMemFile data; + + data.WriteUInt8(CURRENT_VERSION_SHORT); + + if (OSInfo) { + + // Special MuleInfo packet for clients supporting it. + // This means aMule >= 2.0.0 and Hydranode + + // Violently mark it as special Mule Info packet + // Sending this makes non-supporting-osinfo clients to refuse to read this + // packet. Anyway, this packet should NEVER get to non-supporting clients. + + data.WriteUInt8(/*EMULE_PROTOCOL*/ 0xFF); + + data.WriteUInt32(1); // One Tag (OS_INFO) + + CTagString tag1(ET_OS_INFO,theApp->GetOSType()); + tag1.WriteTagToFile(&data); + + m_OSInfo_sent = true; // So we don't send it again + + } else { + + // Normal MuleInfo packet + + // Kry - There's no point on upgrading to VBT tags here + // as no client supporting it uses mule info packet. + + data.WriteUInt8(EMULE_PROTOCOL); + + // Tag number + data.WriteUInt32(9); + + CTagInt32 tag1(ET_COMPRESSION,1); + tag1.WriteTagToFile(&data); + CTagInt32 tag2(ET_UDPVER,4); + tag2.WriteTagToFile(&data); + CTagInt32 tag3(ET_UDPPORT, thePrefs::GetEffectiveUDPPort()); + tag3.WriteTagToFile(&data); + CTagInt32 tag4(ET_SOURCEEXCHANGE,3); + tag4.WriteTagToFile(&data); + CTagInt32 tag5(ET_COMMENTS,1); + tag5.WriteTagToFile(&data); + CTagInt32 tag6(ET_EXTENDEDREQUEST,2); + tag6.WriteTagToFile(&data); + + uint32 dwTagValue = (theApp->CryptoAvailable() ? 3 : 0); + // Kry - Needs the preview code from eMule + /* + // set 'Preview supported' only if 'View Shared Files' allowed + if (thePrefs::CanSeeShares() != vsfaNobody) { + dwTagValue |= 128; + } + */ + CTagInt32 tag7(ET_FEATURES, dwTagValue); + tag7.WriteTagToFile(&data); + + CTagInt32 tag8(ET_COMPATIBLECLIENT,SO_AMULE); + tag8.WriteTagToFile(&data); + + // Support for tag ET_MOD_VERSION + wxString mod_name(MOD_VERSION_LONG); + CTagString tag9(ET_MOD_VERSION, mod_name); + tag9.WriteTagToFile(&data); + // Maella end + + } + + packet = new CPacket(data, OP_EMULEPROT, (bAnswer ? OP_EMULEINFOANSWER : OP_EMULEINFO)); + + if (m_socket) { + theStats::AddUpOverheadOther(packet->GetPacketSize()); + SendPacket(packet,true,true); + + if (!bAnswer) { + if (!OSInfo) { + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_EMULEINFO to ") + GetFullIP() ); + } else { + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_EMULEINFO/OS_INFO to ") + GetFullIP() ); + } + } else { + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_EMULEINFOANSWER to ") + GetFullIP() ); + } + } +} + +bool CUpDownClient::ProcessMuleInfoPacket(const byte* pachPacket, uint32 nSize) +{ + uint8 protocol_version; + + const CMemFile data(pachPacket,nSize); + + // The version number part of this packet will soon be useless since + // it is only able to go to v.99. Why the version is a uint8 and why + // it was not done as a tag like the eDonkey hello packet is not known. + // Therefore, sooner or later, we are going to have to switch over to + // using the eDonkey hello packet to set the version. No sense making + // a third value sent for versions. + uint8 mule_version = data.ReadUInt8(); + protocol_version = data.ReadUInt8(); + uint32 tagcount = data.ReadUInt32(); + if (protocol_version == 0xFF) { + // OS Info supporting clients sending a recycled Mule info packet + for (uint32 i = 0;i < tagcount; i++){ + CTag temptag(data, true); + switch(temptag.GetNameID()){ + case ET_OS_INFO: + // Special tag, only supporting clients (aMule/Hydranode) + // It was recycled from a mod's tag, so if the other side + // is not supporting OS Info, we're seriously fucked up :) + m_sClientOSInfo = temptag.GetStr(); + + // If we didn't send our OSInfo to this client, just send it + if (!m_OSInfo_sent) { + SendMuleInfoPacket(false,true); + } + + UpdateStats(); + + break; + + // Your ad... er... I mean TAG, here + + default: + break; + } + } + } else { + // Old eMule sending tags + m_byCompatibleClient = 0; + m_byEmuleVersion = mule_version; + + if( m_byEmuleVersion == 0x2B ) { + m_byEmuleVersion = 0x22; + } + + if (!(m_bEmuleProtocol = (protocol_version == EMULE_PROTOCOL))) { + return false; + } + + for (uint32 i = 0;i < tagcount; i++){ + CTag temptag(data, false); + switch(temptag.GetNameID()){ + case ET_COMPRESSION: + // Bits 31- 8: 0 - reserved + // Bits 7- 0: data compression version + m_byDataCompVer = temptag.GetInt(); + break; + + case ET_UDPPORT: + // Bits 31-16: 0 - reserved + // Bits 15- 0: UDP port + m_nUDPPort = temptag.GetInt(); + break; + + case ET_UDPVER: + // Bits 31- 8: 0 - reserved + // Bits 7- 0: UDP protocol version + m_byUDPVer = temptag.GetInt(); + break; + + case ET_SOURCEEXCHANGE: + // Bits 31- 8: 0 - reserved + // Bits 7- 0: source exchange protocol version + m_bySourceExchange1Ver = temptag.GetInt(); + break; + + case ET_COMMENTS: + // Bits 31- 8: 0 - reserved + // Bits 7- 0: comments version + m_byAcceptCommentVer = temptag.GetInt(); + break; + + case ET_EXTENDEDREQUEST: + // Bits 31- 8: 0 - reserved + // Bits 7- 0: extended requests version + m_byExtendedRequestsVer = temptag.GetInt(); + break; + + case ET_COMPATIBLECLIENT: + // Bits 31- 8: 0 - reserved + // Bits 7- 0: compatible client ID + m_byCompatibleClient = temptag.GetInt(); + break; + + case ET_FEATURES: + // Bits 31- 8: 0 - reserved + // Bit 7: Preview + // Bit 6- 0: secure identification + m_bySupportSecIdent = temptag.GetInt() & 3; + m_bSupportsPreview = (temptag.GetInt() & 128) > 0; + SecIdentSupRec += 2; + break; + + case ET_MOD_VERSION: + if (temptag.IsStr()) { + m_strModVersion = temptag.GetStr(); + } else if (temptag.IsInt()) { + m_strModVersion = wxString::Format(wxT("ModID=%u"), temptag.GetInt()); + } else { + m_strModVersion = wxT("ModID="); + } + + break; + + default: + AddDebugLogLineM( false, logPacketErrors, + CFormat( wxT("Unknown Mule tag (%s) from client: %s") ) + % temptag.GetFullInfo() + % GetClientFullInfo() + ); + + break; + } + } + + if( m_byDataCompVer == 0 ){ + m_bySourceExchange1Ver = 0; + m_byExtendedRequestsVer = 0; + m_byAcceptCommentVer = 0; + m_nUDPPort = 0; + } + + //implicitly supported options by older clients + //in the future do not use version to guess about new features + if(m_byEmuleVersion < 0x25 && m_byEmuleVersion > 0x22) { + m_byUDPVer = 1; + } + + if(m_byEmuleVersion < 0x25 && m_byEmuleVersion > 0x21) { + m_bySourceExchange1Ver = 1; + } + + if(m_byEmuleVersion == 0x24) { + m_byAcceptCommentVer = 1; + } + + // Shared directories are requested from eMule 0.28+ because eMule 0.27 has a bug in + // the OP_ASKSHAREDFILESDIR handler, which does not return the shared files for a + // directory which has a trailing backslash. + if(m_byEmuleVersion >= 0x28 && !m_bIsML) {// MLdonkey currently does not support shared directories + m_fSharedDirectories = 1; + } + + ReGetClientSoft(); + + m_byInfopacketsReceived |= IP_EMULEPROTPACK; + } + + return (protocol_version == 0xFF); // This was a OS_Info? +} + + +void CUpDownClient::SendHelloAnswer() +{ + if (m_socket == NULL){ + wxASSERT(0); + return; + } + + CMemFile data(128); + SendHelloTypePacket(&data); + CPacket* packet = new CPacket(data, OP_EDONKEYPROT, OP_HELLOANSWER); + theStats::AddUpOverheadOther(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_HELLOANSWER to ") + GetFullIP() ); + SendPacket(packet,true); +} + + +void CUpDownClient::SendHelloTypePacket(CMemFile* data) +{ + data->WriteHash(thePrefs::GetUserHash()); + data->WriteUInt32(theApp->GetID()); + data->WriteUInt16(thePrefs::GetPort()); + + uint32 tagcount = 6; + + if( theApp->clientlist->GetBuddy() && theApp->IsFirewalled() ) { + tagcount += 2; + } + tagcount ++; // eMule misc flags 2 (kad version) + + #ifdef __SVN__ + // Kry - This is the tagcount!!! Be sure to update it!! + // Last update: CT_EMULECOMPAT_OPTIONS included + data->WriteUInt32(tagcount + 1); + #else + data->WriteUInt32(tagcount); // NO MOD_VERSION + #endif + + + CTagString tagname(CT_NAME,thePrefs::GetUserNick()); + tagname.WriteTagToFile(data, utf8strRaw); + + CTagVarInt tagversion(CT_VERSION, EDONKEYVERSION, GetVBTTags() ? 0 : 32); + tagversion.WriteTagToFile(data); + // eMule UDP Ports + + uint32 kadUDPPort = 0; + + if(Kademlia::CKademlia::IsConnected()) { + kadUDPPort = thePrefs::GetEffectiveUDPPort(); + } + + CTagVarInt tagUdpPorts(CT_EMULE_UDPPORTS, + (kadUDPPort << 16) | + ((uint32)thePrefs::GetEffectiveUDPPort() ), + GetVBTTags() ? 0 : 32); + tagUdpPorts.WriteTagToFile(data); + + if( theApp->clientlist->GetBuddy() && theApp->IsFirewalled() ) { + CTagVarInt tagBuddyIP(CT_EMULE_BUDDYIP, theApp->clientlist->GetBuddy()->GetIP(), GetVBTTags() ? 0 : 32); + tagBuddyIP.WriteTagToFile(data); + + CTagVarInt tagBuddyPort(CT_EMULE_BUDDYUDP, +// ( RESERVED ) + ((uint32)theApp->clientlist->GetBuddy()->GetUDPPort() ) + , GetVBTTags() ? 0 : 32); + tagBuddyPort.WriteTagToFile(data); + } + + // aMule Version + CTagVarInt tagMuleVersion(CT_EMULE_VERSION, + (SO_AMULE << 24) | + make_full_ed2k_version(VERSION_MJR, VERSION_MIN, VERSION_UPDATE) + // | (RESERVED ) + , GetVBTTags() ? 0 : 32); + tagMuleVersion.WriteTagToFile(data); + + + // eMule Misc. Options #1 + const uint32 uUdpVer = 4; + const uint32 uDataCompVer = 1; + const uint32 uSupportSecIdent = theApp->CryptoAvailable() ? 3 : 0; + const uint32 uSourceExchangeVer = 3; + const uint32 uExtendedRequestsVer = 2; + const uint32 uAcceptCommentVer = 1; + const uint32 uNoViewSharedFiles = (thePrefs::CanSeeShares() == vsfaNobody) ? 1 : 0; // for backward compatibility this has to be a 'negative' flag + const uint32 uMultiPacket = 1; + const uint32 uSupportPreview = 0; // No network preview at all. + const uint32 uPeerCache = 0; // No peercache for aMule, baby + const uint32 uUnicodeSupport = 1; + const uint32 nAICHVer = 1; // AICH is ENABLED right now. + + CTagVarInt tagMisOptions(CT_EMULE_MISCOPTIONS1, + (nAICHVer << ((4*7)+1)) | + (uUnicodeSupport << 4*7) | + (uUdpVer << 4*6) | + (uDataCompVer << 4*5) | + (uSupportSecIdent << 4*4) | + (uSourceExchangeVer << 4*3) | + (uExtendedRequestsVer << 4*2) | + (uAcceptCommentVer << 4*1) | + (uPeerCache << 1*3) | + (uNoViewSharedFiles << 1*2) | + (uMultiPacket << 1*1) | + (uSupportPreview << 1*0) + , GetVBTTags() ? 0 : 32); + tagMisOptions.WriteTagToFile(data); + + // eMule Misc. Options #2 + const uint32 uKadVersion = 1; + const uint32 uSupportLargeFiles = 1; + const uint32 uExtMultiPacket = 1; + const uint32 uReserved = 0; // mod bit + const uint32 uSupportsCryptLayer = thePrefs::IsClientCryptLayerSupported() ? 1 : 0; + const uint32 uRequestsCryptLayer = thePrefs::IsClientCryptLayerRequested() ? 1 : 0; + const uint32 uRequiresCryptLayer = thePrefs::IsClientCryptLayerRequired() ? 1 : 0; + const uint32 uSupportsSourceEx2 = 1; + CTagVarInt tagMisOptions2(CT_EMULE_MISCOPTIONS2, +// (RESERVED ) + (uSupportsSourceEx2 << 10) | + (uRequiresCryptLayer << 9) | + (uRequestsCryptLayer << 8) | + (uSupportsCryptLayer << 7) | + (uReserved << 6) | + (uExtMultiPacket << 5) | + (uSupportLargeFiles << 4) | + (uKadVersion << 0) + , GetVBTTags() ? 0 : 32 ); + tagMisOptions2.WriteTagToFile(data); + + const uint32 nOSInfoSupport = 1; // We support OS_INFO + const uint32 nValueBasedTypeTags = 0; // Experimental, disabled + + CTagVarInt tagMisCompatOptions(CT_EMULECOMPAT_OPTIONS, + (nValueBasedTypeTags << 1*1) | + (nOSInfoSupport << 1*0) + , GetVBTTags() ? 0 : 32); + + tagMisCompatOptions.WriteTagToFile(data); + +#ifdef __SVN__ + wxString mod_name(MOD_VERSION_LONG); + CTagString tagModName(ET_MOD_VERSION, mod_name); + tagModName.WriteTagToFile(data); +#endif + + uint32 dwIP = 0; + uint16 nPort = 0; + if (theApp->IsConnectedED2K()) { + dwIP = theApp->serverconnect->GetCurrentServer()->GetIP(); + nPort = theApp->serverconnect->GetCurrentServer()->GetPort(); + } + data->WriteUInt32(dwIP); + data->WriteUInt16(nPort); +} + + +void CUpDownClient::ProcessMuleCommentPacket(const byte* pachPacket, uint32 nSize) +{ + if (!m_reqfile) { + throw CInvalidPacket(wxT("Comment packet for unknown file")); + } + + if (!m_reqfile->IsPartFile()) { + throw CInvalidPacket(wxT("Comment packet for completed file")); + } + + const CMemFile data(pachPacket, nSize); + + uint8 rating = data.ReadUInt8(); + if (rating > 5) { + AddDebugLogLineM( false, logClient, wxString(wxT("Invalid Rating for file '")) << m_clientFilename << wxT("' received: ") << rating); + m_iRating = 0; + } else { + m_iRating = rating; + AddDebugLogLineM( false, logClient, wxString(wxT("Rating for file '")) << m_clientFilename << wxT("' received: ") << m_iRating); + } + + // The comment is unicoded, with a uin32 len and safe read + // (won't break if string size is < than advertised len) + // Truncated to MAXFILECOMMENTLEN size + m_strComment = data.ReadString(GetUnicodeSupport(), 4 /* bytes (it's a uint32)*/, true).Left(MAXFILECOMMENTLEN); + + AddDebugLogLineM( false, logClient, wxString(wxT("Description for file '")) << m_clientFilename << wxT("' received: ") << m_strComment); + + // Update file rating + m_reqfile->UpdateFileRatingCommentAvail(); +} + + +void CUpDownClient::ClearDownloadBlockRequests() +{ + { + std::list::iterator it = m_DownloadBlocks_list.begin(); + for (; it != m_DownloadBlocks_list.end(); ++it) { + Requested_Block_Struct* cur_block = *it; + + if (m_reqfile){ + m_reqfile->RemoveBlockFromList(cur_block->StartOffset, cur_block->EndOffset); + } + + delete cur_block; + } + + m_DownloadBlocks_list.clear(); + } + + { + std::list::iterator it = m_PendingBlocks_list.begin(); + for (; it != m_PendingBlocks_list.end(); ++it) { + Pending_Block_Struct* pending = *it; + + if (m_reqfile) { + m_reqfile->RemoveBlockFromList(pending->block->StartOffset, pending->block->EndOffset); + } + + delete pending->block; + // Not always allocated + if (pending->zStream){ + inflateEnd(pending->zStream); + delete pending->zStream; + } + + delete pending; + } + + m_PendingBlocks_list.clear(); + } +} + + +bool CUpDownClient::Disconnected(const wxString& strReason, bool bFromSocket){ + + // Kad reviewed + + //If this is a KAD client object, just delete it! + SetKadState(KS_NONE); + + if (GetUploadState() == US_UPLOADING) { + theApp->uploadqueue->RemoveFromUploadQueue(this); + } + + if (GetDownloadState() == DS_DOWNLOADING) { + SetDownloadState(DS_ONQUEUE); + } else{ + // ensure that all possible block requests are removed from the partfile + ClearDownloadBlockRequests(); + + if ( GetDownloadState() == DS_CONNECTED ){ + theApp->clientlist->AddDeadSource(this); + theApp->downloadqueue->RemoveSource(this); + } + } + + // we had still an AICH request pending, handle it + if (IsAICHReqPending()){ + m_fAICHRequested = FALSE; + CAICHHashSet::ClientAICHRequestFailed(this); + } + + // The remote client does not have to answer with OP_HASHSETANSWER *immediatly* + // after we've sent OP_HASHSETREQUEST. It may occure that a (buggy) remote client + // is sending use another OP_FILESTATUS which would let us change to DL-state to DS_ONQUEUE. + if (((GetDownloadState() == DS_REQHASHSET) || m_fHashsetRequesting) && (m_reqfile)) { + m_reqfile->SetHashSetNeeded(true); + } + + //check if this client is needed in any way, if not delete it + bool bDelete = true; + switch(m_nUploadState){ + case US_ONUPLOADQUEUE: + bDelete = false; + break; + }; + switch(m_nDownloadState){ + case DS_ONQUEUE: + case DS_TOOMANYCONNS: + case DS_NONEEDEDPARTS: + case DS_LOWTOLOWIP: + bDelete = false; + }; + + switch(m_nUploadState){ + case US_CONNECTING: + case US_WAITCALLBACK: + case US_ERROR: + theApp->clientlist->AddDeadSource(this); + bDelete = true; + }; + switch(m_nDownloadState){ + case DS_CONNECTING: + case DS_WAITCALLBACK: + case DS_ERROR: + theApp->clientlist->AddDeadSource(this); + bDelete = true; + }; + + + if (GetChatState() != MS_NONE){ + bDelete = false; + m_pendingMessage.Clear(); + Notify_ChatConnResult(false,GUI_ID(GetIP(),GetUserPort()),wxEmptyString); + } + + if (!bFromSocket && m_socket){ + wxASSERT (theApp->listensocket->IsValidSocket(m_socket)); + m_socket->Safe_Delete(); + } + + SetSocket(NULL); + + if (m_iFileListRequested){ + AddLogLineM( false, CFormat(_("Failed to retrieve shared files from user '%s'")) % GetUserName() ); + m_iFileListRequested = 0; + } + + Notify_ClientCtrlRefreshClient( this ); + + if (bDelete) { + if (m_Friend) { + // Remove the friend linkage + Notify_ChatRefreshFriend(m_Friend->GetIP(), m_Friend->GetPort(), wxEmptyString); + } + AddDebugLogLineM( false, logClient, wxString() << + wxT("--- Deleted client \"") << GetClientFullInfo() << + wxT("\"; Reason was ") << strReason ); + } else { + AddDebugLogLineM( false, logClient, wxString() << + wxT("--- Disconnected client \"") << GetClientFullInfo() << + wxT("\"; Reason was ") << strReason ); + m_fHashsetRequesting = 0; + SetSentCancelTransfer(0); + m_bHelloAnswerPending = false; + m_fSentOutOfPartReqs = 0; + } + + return bDelete; +} + +//Returned bool is not if the TryToConnect is successful or not.. +//false means the client was deleted! +//true means the client was not deleted! +bool CUpDownClient::TryToConnect(bool bIgnoreMaxCon) +{ + // Kad reviewed + if (theApp->listensocket->TooManySockets() && !bIgnoreMaxCon ) { + if (!(m_socket && m_socket->IsConnected())) { + if(Disconnected(wxT("Too many connections"))) { + Safe_Delete(); + return false; + } + return true; + } + } + + // Do not try to connect to source which are incompatible with our encryption setting (one requires it, and the other one doesn't supports it) + if ( (RequiresCryptLayer() && !thePrefs::IsClientCryptLayerSupported()) || (thePrefs::IsClientCryptLayerRequired() && !SupportsCryptLayer()) ){ + if(Disconnected(wxT("CryptLayer-Settings (Obfuscation) incompatible"))){ + Safe_Delete(); + return false; + } else { + return true; + } + } + + // Ipfilter check + uint32 uClientIP = GetIP(); + if (uClientIP == 0 && !HasLowID()) { + uClientIP = wxUINT32_SWAP_ALWAYS(m_nUserIDHybrid); + } + + if (uClientIP) { + // Although we filter all received IPs (server sources, source exchange) and all incomming connection attempts, + // we do have to filter outgoing connection attempts here too, because we may have updated the ip filter list + if (theApp->ipfilter->IsFiltered(uClientIP)) { + AddDebugLogLineM(false, logIPFilter, CFormat(wxT("Filtered ip %u (%s) on TryToConnect\n")) % uClientIP % Uint32toStringIP(uClientIP)); + if (Disconnected(wxT("IPFilter"))) { + Safe_Delete(); + return false; + } else { + return true; + } + } + + // for safety: check again whether that IP is banned + if (theApp->clientlist->IsBannedClient(uClientIP)) { + AddDebugLogLineM(false, logClient, wxT("Refused to connect to banned client ") + Uint32toStringIP(uClientIP)); + if (Disconnected(wxT("Banned IP"))) { + Safe_Delete(); + return false; + } + return true; + } + } + + if( GetKadState() == KS_QUEUED_FWCHECK ) { + SetKadState(KS_CONNECTING_FWCHECK); + } + + if ( HasLowID() ) { + if (!theApp->DoCallback(this)) { + //We cannot do a callback! + if (GetDownloadState() == DS_CONNECTING) { + SetDownloadState(DS_LOWTOLOWIP); + } else if (GetDownloadState() == DS_REQHASHSET) { + SetDownloadState(DS_ONQUEUE); + m_reqfile->SetHashSetNeeded(true); + } + if (GetUploadState() == US_CONNECTING) { + if(Disconnected(wxT("LowID->LowID and US_CONNECTING"))) { + Safe_Delete(); + return false; + } + } + return true; + } + + //We already know we are not firewalled here as the above condition already detected LowID->LowID and returned. + //If ANYTHING changes with the "if(!theApp->DoCallback(this))" above that will let you fall through + //with the condition that the source is firewalled and we are firewalled, we must + //recheck it before the this check.. + if( HasValidBuddyID() && !GetBuddyIP() && !GetBuddyPort() && !theApp->serverconnect->IsLocalServer(GetServerIP(), GetServerPort())) { + //This is a Kad firewalled source that we want to do a special callback because it has no buddyIP or buddyPort. + if( Kademlia::CKademlia::IsConnected() ) { + //We are connect to Kad + if( Kademlia::CKademlia::GetPrefs()->GetTotalSource() > 0 || Kademlia::CSearchManager::AlreadySearchingFor(Kademlia::CUInt128(GetBuddyID()))) { + //There are too many source lookups already or we are already searching this key. + SetDownloadState(DS_TOOMANYCONNSKAD); + return true; + } + } + } + } + + if (!m_socket || !m_socket->IsConnected()) { + if (m_socket) { + m_socket->Safe_Delete(); + } + m_socket = new CClientTCPSocket(this, thePrefs::GetProxyData()); + } else { + ConnectionEstablished(); + return true; + } + + + if (HasLowID()) { + if (GetDownloadState() == DS_CONNECTING) { + SetDownloadState(DS_WAITCALLBACK); + } + if (GetUploadState() == US_CONNECTING) { + if(Disconnected(wxT("LowID and US_CONNECTING"))) { + Safe_Delete(); + return false; + } + return true; + } + + if (theApp->serverconnect->IsLocalServer(m_dwServerIP,m_nServerPort)) { + CMemFile data; + // AFAICS, this id must be reversed to be sent to clients + // But if I reverse it, we do a serve violation ;) + data.WriteUInt32(m_nUserIDHybrid); + CPacket* packet = new CPacket(data, OP_EDONKEYPROT, OP_CALLBACKREQUEST); + theStats::AddUpOverheadServer(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_CALLBACKREQUEST to ") + GetFullIP()); + theApp->serverconnect->SendPacket(packet); + SetDownloadState(DS_WAITCALLBACK); + } else { + if (GetUploadState() == US_NONE && (!GetRemoteQueueRank() || m_bReaskPending)) { + + if( !HasValidBuddyID() ) { + theApp->downloadqueue->RemoveSource(this); + if (Disconnected(wxT("LowID and US_NONE and QR=0"))) { + Safe_Delete(); + return false; + } + return true; + } + + if( !Kademlia::CKademlia::IsConnected() ) { + //We are not connected to Kad and this is a Kad Firewalled source.. + theApp->downloadqueue->RemoveSource(this); + if(Disconnected(wxT("Kad Firewalled source but not connected to Kad."))) { + Safe_Delete(); + return false; + } + return true; + } + + if( GetDownloadState() == DS_WAITCALLBACK ) { + if( GetBuddyIP() && GetBuddyPort()) { + CMemFile bio(34); + bio.WriteUInt128(Kademlia::CUInt128(GetBuddyID())); + bio.WriteUInt128(Kademlia::CUInt128(m_reqfile->GetFileHash().GetHash())); + bio.WriteUInt16(thePrefs::GetPort()); + CPacket* packet = new CPacket(bio, OP_KADEMLIAHEADER, KADEMLIA_CALLBACK_REQ); + // eMule FIXME: We dont know which kadversion the buddy has, so we need to send unencrypted + theApp->clientudp->SendPacket(packet, GetBuddyIP(), GetBuddyPort(), false, NULL, true, 0); + AddDebugLogLineM(false,logLocalClient, wxString::Format(wxT("KADEMLIA_CALLBACK_REQ (%i) to"),packet->GetPacketSize()) + GetFullIP()); + theStats::AddUpOverheadKad(packet->GetRealPacketSize()); + SetDownloadState(DS_WAITCALLBACKKAD); + } else { + printf("Searching buddy for lowid connection\n"); + //Create search to find buddy. + Kademlia::CSearch *findSource = new Kademlia::CSearch; + findSource->SetSearchTypes(Kademlia::CSearch::FINDSOURCE); + findSource->SetTargetID(Kademlia::CUInt128(GetBuddyID())); + findSource->AddFileID(Kademlia::CUInt128(m_reqfile->GetFileHash().GetHash())); + if(Kademlia::CSearchManager::StartSearch(findSource)) { + //Started lookup.. + SetDownloadState(DS_WAITCALLBACKKAD); + } else { + //This should never happen.. + wxASSERT(0); + } + } + } + } else { + if (GetDownloadState() == DS_WAITCALLBACK) { + m_bReaskPending = true; + SetDownloadState(DS_ONQUEUE); + } + } + } + } else { + if (!Connect()) { + return false; + } + } + return true; +} + +bool CUpDownClient::Connect() +{ + m_hasbeenobfuscatinglately = false; + + if (!m_socket->IsOk()) { + // Enable or disable crypting based on our and the remote clients preference + if (HasValidHash() && SupportsCryptLayer() && thePrefs::IsClientCryptLayerSupported() && (RequestsCryptLayer() || thePrefs::IsClientCryptLayerRequested())){ +// printf("Set connection encryption for socket\n"); + //DebugLog(_T("Enabling CryptLayer on outgoing connection to client %s"), DbgGetClientInfo()); // to be removed later + m_socket->SetConnectionEncryption(true, GetUserHash().GetHash(), false); + } else { + m_socket->SetConnectionEncryption(false, NULL, false); + } + amuleIPV4Address tmp; + tmp.Hostname(GetConnectIP()); + tmp.Service(GetUserPort()); + AddDebugLogLineM(false, logClient, wxT("Trying to connect to ") + Uint32_16toStringIP_Port(GetConnectIP(),GetUserPort())); + m_socket->Connect(tmp, false); + // We should send hello packets AFTER connecting! + // so I moved it to OnConnect + return true; + } else { + return false; + } +} + +void CUpDownClient::ConnectionEstablished() +{ + + /* Kry - First thing, check if this client was just used to retrieve + info. That's some debug thing for myself... check connection_reason + definition */ + + m_hasbeenobfuscatinglately = (m_socket && m_socket->IsConnected() && m_socket->IsObfusicating()); + + #ifdef __DEBUG__ + if (!connection_reason.IsEmpty()) { + printf("Got client info checking for %s: %s\nDisconnecting and deleting.\n",(const char*)unicode2char(connection_reason),(const char*)unicode2char(GetClientFullInfo())); + connection_reason.Clear(); // So we don't re-printf on destructor. + Safe_Delete(); + return; + } + #endif + + // Check if we should use this client to retrieve our public IP + // Ignore local ip on GetPublicIP (could be wrong) + if (theApp->GetPublicIP(true) == 0 && theApp->IsConnectedED2K()) { + SendPublicIPRequest(); + } + + switch (GetKadState()) { + case KS_CONNECTING_FWCHECK: + SetKadState(KS_CONNECTED_FWCHECK); + break; + case KS_CONNECTING_BUDDY: + case KS_INCOMING_BUDDY: + SetKadState(KS_CONNECTED_BUDDY); + break; + default: + break; + } + + // ok we have a connection, lets see if we want anything from this client + if (GetChatState() == MS_CONNECTING) { + SetChatState( MS_CHATTING ); + } + + if (GetChatState() == MS_CHATTING) { + bool result = true; + if (!m_pendingMessage.IsEmpty()) { + result = SendMessage(m_pendingMessage); + } + Notify_ChatConnResult(result,GUI_ID(GetIP(),GetUserPort()),m_pendingMessage); + m_pendingMessage.Clear(); + } + + switch(GetDownloadState()) { + case DS_CONNECTING: + case DS_WAITCALLBACK: + case DS_WAITCALLBACKKAD: + m_bReaskPending = false; + SetDownloadState(DS_CONNECTED); + SendFileRequest(); + } + if (m_bReaskPending){ + m_bReaskPending = false; + if (GetDownloadState() != DS_NONE && GetDownloadState() != DS_DOWNLOADING) { + SetDownloadState(DS_CONNECTED); + SendFileRequest(); + } + } + switch(GetUploadState()){ + case US_CONNECTING: + case US_WAITCALLBACK: + if (theApp->uploadqueue->IsDownloading(this)) { + SetUploadState(US_UPLOADING); + CPacket* packet = new CPacket(OP_ACCEPTUPLOADREQ, 0, OP_EDONKEYPROT); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + SendPacket(packet,true); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_ACCEPTUPLOADREQ to ") + GetFullIP() ); + } + } + if (m_iFileListRequested == 1) { + CPacket* packet = new CPacket(m_fSharedDirectories ? OP_ASKSHAREDDIRS : OP_ASKSHAREDFILES, 0, OP_EDONKEYPROT); + theStats::AddUpOverheadOther(packet->GetPacketSize()); + SendPacket(packet,true,true); + if (m_fSharedDirectories) { + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_ASKSHAREDDIRS to ") + GetFullIP() ); + } else { + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_ASKSHAREDFILES to ") + GetFullIP() ); + } + } + + while (!m_WaitingPackets_list.empty()) { + CPacket* packet = m_WaitingPackets_list.front(); + m_WaitingPackets_list.pop_front(); + + SendPacket(packet); + } +} + + +int CUpDownClient::GetHashType() const +{ + if ( m_UserHash[5] == 13 && m_UserHash[14] == 110 ) { + return SO_OLDEMULE; + } + + if ( m_UserHash[5] == 14 && m_UserHash[14] == 111 ) { + return SO_EMULE; + } + + if ( m_UserHash[5] == 'M' && m_UserHash[14] == 'L' ) { + return SO_MLDONKEY; + } + + return SO_UNKNOWN; +} + + +void CUpDownClient::SetSocket(CClientTCPSocket* socket) +{ +#if defined(__DEBUG__) && !defined(EC_REMOTE) + if (m_socket == NULL && socket != NULL) { + theStats::SocketAssignedToClient(); + } else if (m_socket != NULL && socket == NULL) { + theStats::SocketUnassignedFromClient(); + } +#endif + m_socket = socket; +} + + +void CUpDownClient::ReGetClientSoft() +{ + if (m_Username.IsEmpty()) { + m_clientSoft=SO_UNKNOWN; + m_clientVerString = m_clientSoftString = m_clientVersionString = m_fullClientVerString = _("Unknown"); + UpdateStats(); + return; + } + + int iHashType = GetHashType(); + wxString clientModString; + if (iHashType == SO_EMULE) { + + m_clientSoft = m_byCompatibleClient; + m_clientSoftString = GetSoftName(m_clientSoft); + // Special issues: + if(!GetClientModString().IsEmpty() && (m_clientSoft != SO_EMULE)) { + m_clientSoftString = GetClientModString(); + } + // Isn't xMule annoying? + if ((m_clientSoft == SO_LXMULE) && (GetMuleVersion() > 0x26) && (GetMuleVersion() != 0x99)) { + m_clientSoftString += wxString::Format(_(" (Fake eMule version %#x)"),GetMuleVersion()); + } + if ((m_clientSoft == SO_EMULE) && + ( + wxString(GetClientModString()).MakeLower().Find(wxT("xmule")) != -1 + || GetUserName().Find(wxT("xmule.")) != -1 + ) + ) { + // FAKE eMule -a newer xMule faking is ident. + m_clientSoft = SO_LXMULE; + if (GetClientModString().IsEmpty() == false) { + m_clientSoftString = GetClientModString() + _(" (Fake eMule)"); + } else { + m_clientSoftString = _("xMule (Fake eMule)"); // don't use GetSoftName, it's not lmule. + } + } + // Now, what if we don't know this SO_ID? + if (m_clientSoftString.IsEmpty()) { + if(m_bIsML) { + m_clientSoft = SO_MLDONKEY; + m_clientSoftString = GetSoftName(m_clientSoft); + } else if (m_bIsHybrid) { + m_clientSoft = SO_EDONKEYHYBRID; + m_clientSoftString = GetSoftName(m_clientSoft); + } else if (m_byCompatibleClient != 0) { + m_clientSoft = SO_COMPAT_UNK; + #ifdef __DEBUG__ + if ( + // Exceptions: + (m_byCompatibleClient != 0xf0) // Chinese leech mod + && (1==1) // Your ad here + ) { + printf("Compatible client found with ET_COMPATIBLECLIENT of %#x\n",m_byCompatibleClient); + } + #endif + m_clientSoftString = GetSoftName(m_clientSoft) + wxString::Format(wxT("(%#x)"),m_byCompatibleClient); + } else { + // If we step here, it might mean 2 things: + // a eMule + // a Compat Client that has sent no MuleInfo packet yet. + m_clientSoft = SO_EMULE; + m_clientSoftString = wxT("eMule"); + } + } + + if (m_byEmuleVersion == 0) { + m_nClientVersion = MAKE_CLIENT_VERSION(0,0,0); + } else if (m_byEmuleVersion != 0x99) { + uint32 nClientMinVersion = (m_byEmuleVersion >> 4)*10 + (m_byEmuleVersion & 0x0f); + m_nClientVersion = MAKE_CLIENT_VERSION(0,nClientMinVersion,0); + switch (m_clientSoft) { + case SO_AMULE: + m_clientVerString = wxString::Format(_("1.x (based on eMule v0.%u)"), nClientMinVersion); + break; + case SO_LPHANT: + m_clientVerString = wxT("< v0.05"); + break; + default: + clientModString = GetClientModString(); + m_clientVerString = wxString::Format(wxT("v0.%u"), nClientMinVersion); + break; + } + } else { + uint32 nClientMajVersion = (m_nClientVersion >> 17) & 0x7f; + uint32 nClientMinVersion = (m_nClientVersion >> 10) & 0x7f; + uint32 nClientUpVersion = (m_nClientVersion >> 7) & 0x07; + + m_nClientVersion = MAKE_CLIENT_VERSION(nClientMajVersion, nClientMinVersion, nClientUpVersion); + + switch (m_clientSoft) { + case SO_AMULE: + case SO_LXMULE: + case SO_HYDRANODE: + // Kry - xMule started sending correct version tags on 1.9.1b. + // It only took them 4 months, and being told by me and the + // eMule+ developers, so I think they're slowly getting smarter. + // They are based on our implementation, so we use the same format + // for the version string. + m_clientVerString = wxString::Format(wxT("v%u.%u.%u"), nClientMajVersion, nClientMinVersion, nClientUpVersion); + break; + case SO_LPHANT: + m_clientVerString = wxString::Format(wxT(" v%u.%.2u%c"), nClientMajVersion-1, nClientMinVersion, 'a' + nClientUpVersion); + break; + case SO_EMULEPLUS: + m_clientVerString = wxString::Format(wxT("v%u"), nClientMajVersion); + if(nClientMinVersion != 0) { + m_clientVerString += wxString::Format(wxT(".%u"), nClientMinVersion); + } + if(nClientUpVersion != 0) { + m_clientVerString += wxString::Format(wxT("%c"), 'a' + nClientUpVersion - 1); + } + break; + default: + clientModString = GetClientModString(); + m_clientVerString = wxString::Format(wxT("v%u.%u%c"), nClientMajVersion, nClientMinVersion, 'a' + nClientUpVersion); + break; + } + } + } else if (m_bIsHybrid) { + // seen: + // 105010 50.10 + // 10501 50.1 + // 1051 51.0 + // 501 50.1 + + m_clientSoft = SO_EDONKEYHYBRID; + m_clientSoftString = GetSoftName(m_clientSoft); + + uint32 nClientMajVersion; + uint32 nClientMinVersion; + uint32 nClientUpVersion; + if (m_nClientVersion > 100000) { + uint32 uMaj = m_nClientVersion/100000; + nClientMajVersion = uMaj - 1; + nClientMinVersion = (m_nClientVersion - uMaj*100000) / 100; + nClientUpVersion = m_nClientVersion % 100; + } + else if (m_nClientVersion > 10000) { + uint32 uMaj = m_nClientVersion/10000; + nClientMajVersion = uMaj - 1; + nClientMinVersion = (m_nClientVersion - uMaj*10000) / 10; + nClientUpVersion = m_nClientVersion % 10; + } + else if (m_nClientVersion > 1000) { + uint32 uMaj = m_nClientVersion/1000; + nClientMajVersion = uMaj - 1; + nClientMinVersion = m_nClientVersion - uMaj*1000; + nClientUpVersion = 0; + } + else if (m_nClientVersion > 100) { + uint32 uMin = m_nClientVersion/10; + nClientMajVersion = 0; + nClientMinVersion = uMin; + nClientUpVersion = m_nClientVersion - uMin*10; + } + else{ + nClientMajVersion = 0; + nClientMinVersion = m_nClientVersion; + nClientUpVersion = 0; + } + m_nClientVersion = MAKE_CLIENT_VERSION(nClientMajVersion, nClientMinVersion, nClientUpVersion); + if (nClientUpVersion) { + m_clientVerString = wxString::Format(wxT("v%u.%u.%u"), nClientMajVersion, nClientMinVersion, nClientUpVersion); + } else { + m_clientVerString = wxString::Format(wxT("v%u.%u"), nClientMajVersion, nClientMinVersion); + } + } else if (m_bIsML || (iHashType == SO_MLDONKEY)) { + m_clientSoft = SO_MLDONKEY; + m_clientSoftString = GetSoftName(m_clientSoft); + uint32 nClientMinVersion = m_nClientVersion; + m_nClientVersion = MAKE_CLIENT_VERSION(0, nClientMinVersion, 0); + m_clientVerString = wxString::Format(wxT("v0.%u"), nClientMinVersion); + } else if (iHashType == SO_OLDEMULE) { + m_clientSoft = SO_OLDEMULE; + m_clientSoftString = GetSoftName(m_clientSoft); + uint32 nClientMinVersion = m_nClientVersion; + m_nClientVersion = MAKE_CLIENT_VERSION(0, nClientMinVersion, 0); + m_clientVerString = wxString::Format(wxT("v0.%u"), nClientMinVersion); + } else { + m_clientSoft = SO_EDONKEY; + m_clientSoftString = GetSoftName(m_clientSoft); + m_nClientVersion *= 10; + m_clientVerString = wxString::Format(wxT("v%u.%u"), m_nClientVersion / 100000, (m_nClientVersion / 1000) % 100); + } + + m_clientVersionString = m_clientVerString; + if (!clientModString.IsEmpty()) { + m_clientVerString += wxT(" - ") + clientModString; + } + m_fullClientVerString = m_clientSoftString + wxT(" ") + m_clientVerString; + + UpdateStats(); +} + +void CUpDownClient::RequestSharedFileList() +{ + if (m_iFileListRequested == 0) { + AddDebugLogLineM( false, logClient, wxString( wxT("Requesting shared files from ") ) + GetUserName() ); + m_iFileListRequested = 1; + TryToConnect(true); + } else { + AddDebugLogLineM( false, logClient, CFormat( wxT("Requesting shared files from user %s (%u) is already in progress") ) % GetUserName() % GetUserIDHybrid() ); + } +} + + +void CUpDownClient::ProcessSharedFileList(const byte* pachPacket, uint32 nSize, wxString& pszDirectory) +{ + if (m_iFileListRequested > 0) { + m_iFileListRequested--; + theApp->searchlist->ProcessSharedFileList(pachPacket, nSize, this, NULL, pszDirectory); + } +} + + +void CUpDownClient::ResetFileStatusInfo() +{ + m_nPartCount = 0; + + if ( m_reqfile ) { + m_reqfile->UpdatePartsFrequency( this, false ); + } + m_downPartStatus.clear(); + + m_clientFilename.Clear(); + + m_bCompleteSource = false; + m_dwLastAskedTime = 0; + m_iRating = 0; + m_strComment.Clear(); + + if (m_pReqFileAICHHash != NULL) { + delete m_pReqFileAICHHash; + m_pReqFileAICHHash = NULL; + } + +} + +wxString CUpDownClient::GetUploadFileInfo() +{ + // build info text and display it + wxString sRet; + sRet = (CFormat(_("NickName: %s ID: %u")) % GetUserName() % GetUserIDHybrid()) + wxT(" "); + if (m_reqfile) { + sRet += CFormat(_("Requested: %s\n")) % m_reqfile->GetFileName(); + sRet += CFormat( + wxPLURAL("Filestats for this session: Accepted %d of %d request, %s transferred\n", "Filestats for this session: Accepted %d of %d requests, %s transferred\n", m_reqfile->statistic.GetRequests()) + ) % m_reqfile->statistic.GetAccepts() % m_reqfile->statistic.GetRequests() % CastItoXBytes(m_reqfile->statistic.GetTransferred()); + sRet += CFormat( + wxPLURAL("Filestats for all sessions: Accepted %d of %d request, %s transferred\n", "Filestats for all sessions: Accepted %d of %d requests, %s transferred\n", m_reqfile->statistic.GetAllTimeRequests()) + ) % m_reqfile->statistic.GetAllTimeAccepts() % m_reqfile->statistic.GetAllTimeRequests() % CastItoXBytes(m_reqfile->statistic.GetAllTimeTransferred()); + } else { + sRet += _("Requested unknown file"); + } + return sRet; +} + +// sends a packet, if needed it will establish a connection before +// options used: ignore max connections, control packet, delete packet +// !if the functions returns false it is _possible_ that this clientobject was deleted, because the connectiontry fails +bool CUpDownClient::SafeSendPacket(CPacket* packet) +{ + if (IsConnected()) { + SendPacket(packet); + return true; + } else { + m_WaitingPackets_list.push_back(packet); + return TryToConnect(true); + } +} + +void CUpDownClient::SendPublicKeyPacket(){ + // send our public key to the client who requested it + if (m_socket == NULL || credits == NULL || m_SecureIdentState != IS_KEYANDSIGNEEDED){ + wxASSERT ( false ); + return; + } + if (!theApp->CryptoAvailable()) + return; + + CMemFile data; + data.WriteUInt8(theApp->clientcredits->GetPubKeyLen()); + data.Write(theApp->clientcredits->GetPublicKey(), theApp->clientcredits->GetPubKeyLen()); + CPacket* packet = new CPacket(data, OP_EMULEPROT, OP_PUBLICKEY); + + theStats::AddUpOverheadOther(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_PUBLICKEY to ") + GetFullIP() ); + SendPacket(packet,true,true); + m_SecureIdentState = IS_SIGNATURENEEDED; +} + + +void CUpDownClient::SendSignaturePacket(){ + // signate the public key of this client and send it + if (m_socket == NULL || credits == NULL || m_SecureIdentState == 0){ + wxASSERT ( false ); + return; + } + + if (!theApp->CryptoAvailable()) { + return; + } + if (credits->GetSecIDKeyLen() == 0) { + return; // We don't have his public key yet, will be back here later + } + // do we have a challenge value received (actually we should if we are in this function) + if (credits->m_dwCryptRndChallengeFrom == 0){ + AddDebugLogLineM( false, logClient, wxString(wxT("Want to send signature but challenge value is invalid - User ")) + GetUserName()); + return; + } + // v2 + // we will use v1 as default, except if only v2 is supported + bool bUseV2; + if ( (m_bySupportSecIdent&1) == 1 ) + bUseV2 = false; + else + bUseV2 = true; + + uint8 byChaIPKind = 0; + uint32 ChallengeIP = 0; + if (bUseV2){ + if (::IsLowID(theApp->GetED2KID())) { + // we cannot do not know for sure our public ip, so use the remote clients one + ChallengeIP = GetIP(); + byChaIPKind = CRYPT_CIP_REMOTECLIENT; + } else { + ChallengeIP = theApp->GetED2KID(); + byChaIPKind = CRYPT_CIP_LOCALCLIENT; + } + } + //end v2 + byte achBuffer[250]; + + uint8 siglen = theApp->clientcredits->CreateSignature(credits, achBuffer, 250, ChallengeIP, byChaIPKind ); + if (siglen == 0){ + wxASSERT ( false ); + return; + } + CMemFile data; + data.WriteUInt8(siglen); + data.Write(achBuffer, siglen); + if (bUseV2) { + data.WriteUInt8(byChaIPKind); + } + + CPacket* packet = new CPacket(data, OP_EMULEPROT, OP_SIGNATURE); + + theStats::AddUpOverheadOther(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_SIGNATURE to ") + GetFullIP() ); + SendPacket(packet,true,true); + m_SecureIdentState = IS_ALLREQUESTSSEND; +} + + +void CUpDownClient::ProcessPublicKeyPacket(const byte* pachPacket, uint32 nSize) +{ + theApp->clientlist->AddTrackClient(this); + + if (m_socket == NULL || credits == NULL || pachPacket[0] != nSize-1 + || nSize == 0 || nSize > 250){ + wxASSERT ( false ); + return; + } + if (!theApp->CryptoAvailable()) + return; + // the function will handle everything (mulitple key etc) + if (credits->SetSecureIdent(pachPacket+1, pachPacket[0])){ + // if this client wants a signature, now we can send him one + if (m_SecureIdentState == IS_SIGNATURENEEDED){ + SendSignaturePacket(); + } + else if(m_SecureIdentState == IS_KEYANDSIGNEEDED){ + // something is wrong + AddDebugLogLineM( false, logClient, wxT("Invalid State error: IS_KEYANDSIGNEEDED in ProcessPublicKeyPacket") ); + } + } else{ + AddDebugLogLineM( false, logClient, wxT("Failed to use new received public key") ); + } +} + + +void CUpDownClient::ProcessSignaturePacket(const byte* pachPacket, uint32 nSize) +{ + // here we spread the good guys from the bad ones ;) + + if (m_socket == NULL || credits == NULL || nSize == 0 || nSize > 250){ + wxASSERT ( false ); + return; + } + + uint8 byChaIPKind; + if (pachPacket[0] == nSize-1) + byChaIPKind = 0; + else if (pachPacket[0] == nSize-2 && (m_bySupportSecIdent & 2) > 0) //v2 + byChaIPKind = pachPacket[nSize-1]; + else{ + wxASSERT ( false ); + return; + } + + if (!theApp->CryptoAvailable()) + return; + + // we accept only one signature per IP, to avoid floods which need a lot cpu time for cryptfunctions + if (m_dwLastSignatureIP == GetIP()){ + AddDebugLogLineM( false, logClient, wxT("received multiple signatures from one client") ); + return; + } + // also make sure this client has a public key + if (credits->GetSecIDKeyLen() == 0){ + AddDebugLogLineM( false, logClient, wxT("received signature for client without public key") ); + return; + } + // and one more check: did we ask for a signature and sent a challange packet? + if (credits->m_dwCryptRndChallengeFor == 0){ + AddDebugLogLineM( false, logClient, wxT("received signature for client with invalid challenge value - User ") + GetUserName() ); + return; + } + + if (theApp->clientcredits->VerifyIdent(credits, pachPacket+1, pachPacket[0], GetIP(), byChaIPKind ) ){ + // result is saved in function above + AddDebugLogLineM( false, logClient, CFormat( wxT("'%s' has passed the secure identification, V2 State: %i") ) % GetUserName() % byChaIPKind ); + } else { + AddDebugLogLineM( false, logClient, CFormat( wxT("'%s' has failed the secure identification, V2 State: %i") ) % GetUserName() % byChaIPKind ); + } + + m_dwLastSignatureIP = GetIP(); +} + +void CUpDownClient::SendSecIdentStatePacket(){ + // check if we need public key and signature + uint8 nValue = 0; + if (credits){ + if (theApp->CryptoAvailable()){ + if (credits->GetSecIDKeyLen() == 0) { + nValue = IS_KEYANDSIGNEEDED; + } else if (m_dwLastSignatureIP != GetIP()) { + nValue = IS_SIGNATURENEEDED; + } + } + if (nValue == 0){ + AddDebugLogLineM( false, logClient, wxT("Not sending SecIdentState Packet, because State is Zero") ); + return; + } + // crypt: send random data to sign + uint32 dwRandom = rand()+1; + credits->m_dwCryptRndChallengeFor = dwRandom; + + CMemFile data; + data.WriteUInt8(nValue); + data.WriteUInt32(dwRandom); + CPacket* packet = new CPacket(data, OP_EMULEPROT, OP_SECIDENTSTATE); + + theStats::AddUpOverheadOther(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_SECIDENTSTATE to ") + GetFullIP() ); + SendPacket(packet,true,true); + } else { + wxASSERT ( false ); + } +} + + +void CUpDownClient::ProcessSecIdentStatePacket(const byte* pachPacket, uint32 nSize) +{ + if ( nSize != 5 ) { + return; + } + + if ( !credits ) { + wxASSERT( credits ); + return; + } + + CMemFile data(pachPacket,nSize); + + switch ( data.ReadUInt8() ) { + case 0: + m_SecureIdentState = IS_UNAVAILABLE; + break; + case 1: + m_SecureIdentState = IS_SIGNATURENEEDED; + break; + case 2: + m_SecureIdentState = IS_KEYANDSIGNEEDED; + break; + default: + return; + } + + credits->m_dwCryptRndChallengeFrom = data.ReadUInt32(); +} + + +void CUpDownClient::InfoPacketsReceived() +{ + // indicates that both Information Packets has been received + // needed for actions, which process data from both packets + wxASSERT ( m_byInfopacketsReceived == IP_BOTH ); + m_byInfopacketsReceived = IP_NONE; + + if (m_bySupportSecIdent){ + SendSecIdentStatePacket(); + } +} + + +bool CUpDownClient::CheckHandshakeFinished(uint32 WXUNUSED(protocol), uint32 WXUNUSED(opcode)) const +{ + if (m_bHelloAnswerPending){ + // this triggers way too often.. need more time to look at this -> only create a warning + AddDebugLogLineM( false, logClient, wxT("Handshake not finished while processing packet.") ); + return false; + } + + return true; +} + + +wxString CUpDownClient::GetClientFullInfo() { + + if (m_clientVerString.IsEmpty()) { + ReGetClientSoft(); + } + + return CFormat( _("Client %s on IP:Port %s:%d using %s %s %s") ) + % ( m_Username.IsEmpty() ? wxString(_("Unknown")) : m_Username ) + % GetFullIP() + % GetUserPort() + % m_clientSoftString + % m_clientVerString + % m_strModVersion; +} + + + +void CUpDownClient::SendPublicIPRequest(){ + if (IsConnected()){ + CPacket* packet = new CPacket(OP_PUBLICIP_REQ,0,OP_EMULEPROT); + theStats::AddUpOverheadOther(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_PUBLICIP_REQ to") + GetFullIP()); + SendPacket(packet,true); + m_fNeedOurPublicIP = true; + } +} + +void CUpDownClient::ProcessPublicIPAnswer(const byte* pbyData, uint32 uSize){ + if (uSize != 4) { + throw wxString(wxT("Wrong Packet size on Public IP answer")); + } + uint32 dwIP = PeekUInt32(pbyData); + if (m_fNeedOurPublicIP == true){ // did we? + m_fNeedOurPublicIP = false; + // Ignore local ip on GetPublicIP (could be wrong) + if (theApp->GetPublicIP(true) == 0 && !IsLowID(dwIP) ) { + theApp->SetPublicIP(dwIP); + } + } +} + + +bool CUpDownClient::IsConnected() const +{ + return m_socket && m_socket->IsConnected(); +} + +bool CUpDownClient::SendPacket(CPacket* packet, bool delpacket, bool controlpacket) +{ + if ( m_socket ) { + m_socket->SendPacket(packet, delpacket, controlpacket ); + return true; + } else { + printf("CAUGHT DEAD SOCKET IN SENDPACKET()\n"); + return false; + } +} + +float CUpDownClient::SetDownloadLimit(uint32 reducedownload) +{ + + // lfroen: in daemon it actually can happen + wxASSERT( m_socket ); + + float kBpsClient = CalculateKBpsDown(); + + if ( m_socket ) { + + if (reducedownload) { + // (% to reduce * current speed) / 100 and THEN, / 10 because this + // gets called 10 times per second. + uint32 limit = (uint32)(((float)reducedownload*(kBpsClient*1024.0))/1000); + + if(limit<1024 && reducedownload >= 200) { + // If we're going up and this download is < 1kB, + // we want it to go up fast. Can be reduced later, + // and it'll probably be in a more fair way with + // other downloads that are faster. + limit +=1024; + } else if(limit == 0) { + // This download is not transferring yet... make it + // 1024 so we don't fill the TCP stack and lose the + // connection. + limit = 1024; + } + + m_socket->SetDownloadLimit(limit); + } else { + m_socket->DisableDownloadLimit(); + } + + } else { + printf("CAUGHT DEAD SOCKET IN SETDOWNLOADLIMIT() WITH SPEED %f\n", kBpsClient); + } + + return kBpsClient; + +} + +void CUpDownClient::SetUserIDHybrid(uint32 nUserID) +{ + theApp->clientlist->UpdateClientID( this, nUserID ); + + m_nUserIDHybrid = nUserID; +} + + +void CUpDownClient::SetIP( uint32 val ) +{ + theApp->clientlist->UpdateClientIP( this, val ); + + m_dwUserIP = val; + + m_nConnectIP = val; +} + + +void CUpDownClient::SetUserHash(const CMD4Hash& userhash) +{ + theApp->clientlist->UpdateClientHash( this, userhash ); + + m_UserHash = userhash; + + ValidateHash(); +} + +EUtf8Str CUpDownClient::GetUnicodeSupport() const +{ + return m_bUnicodeSupport ? utf8strRaw : utf8strNone; +} + + +uint8 CUpDownClient::GetSecureIdentState() { + if (m_SecureIdentState != IS_UNAVAILABLE) { + if (!SecIdentSupRec) { + // This can be caused by a 0.30x based client which sends the old + // style Hello packet, and the mule info packet, but between them they + // send a secure ident state packet (after a hello but before we have + // the SUI capabilities). This is a misbehaving client, and somehow I + // Feel like ti should be dropped. But then again, it won't harm to use + // this SUI state if they are reporting no SUI (won't be used) and if + // they report using SUI on the mule info packet, it's ok to use it. + + AddDebugLogLineM(false, logClient, wxT("A client sent secure ident state before telling us the SUI capabilities")); + AddDebugLogLineM(false, logClient, wxT("Client info: ") + GetClientFullInfo()); + AddDebugLogLineM(false, logClient, wxT("This client won't be disconnected, but it should be. :P")); + } + } + + return m_SecureIdentState; +} + + +bool CUpDownClient::SendMessage(const wxString& message) +{ + // Already connecting? + if (GetChatState() == MS_CONNECTING) { + // Queue all messages till we're able to send them (or discard them) + if (!m_pendingMessage.IsEmpty()) { + m_pendingMessage += wxT("\n"); + } else { + // There must be a message to send + wxASSERT(0); + } + m_pendingMessage += message; + return false; + } + if (IsConnected()) { + CMemFile data; + data.WriteString(message, GetUnicodeSupport()); + CPacket* packet = new CPacket(data, OP_EDONKEYPROT, OP_MESSAGE); + theStats::AddUpOverheadOther(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_MESSAGE to ") + GetFullIP()); + SendPacket(packet, true, true); + return true; + } else { + m_pendingMessage = message; + SetChatState(MS_CONNECTING); + // True to ignore "Too Many Connections" + TryToConnect(true); + return false; + } +} + +/* Kad stuff */ + +void CUpDownClient::SetBuddyID(const byte* pucBuddyID) +{ + if( pucBuddyID == NULL ){ + md4clr(m_achBuddyID); + m_bBuddyIDValid = false; + return; + } + m_bBuddyIDValid = true; + md4cpy(m_achBuddyID, pucBuddyID); +} + +// Kad added by me + +bool CUpDownClient::SendBuddyPing() { + SetLastBuddyPingPongTime(); + CPacket* buddyPing = new CPacket(OP_BUDDYPING, 0, OP_EMULEPROT); + theStats::AddUpOverheadKad(buddyPing->GetPacketSize()); + AddDebugLogLineM(false, logLocalClient,wxT("Local Client: OP_BUDDYPING to ") + GetFullIP()); + return SafeSendPacket(buddyPing); +} + + +/* Statistics */ + +void CUpDownClient::UpdateStats() +{ + if (m_lastClientSoft != m_clientSoft || m_lastClientVersion != m_nClientVersion || m_lastOSInfo != m_sClientOSInfo) { + if (m_lastClientSoft == SO_UNKNOWN) { + theStats::RemoveUnknownClient(); + } else if (m_lastClientSoft != (uint32)(-1)) { + theStats::RemoveKnownClient(m_lastClientSoft, m_lastClientVersion, m_lastOSInfo); + } + + m_lastClientSoft = m_clientSoft; + m_lastClientVersion = m_nClientVersion; + m_lastOSInfo = m_sClientOSInfo; + + if (m_clientSoft == SO_UNKNOWN) { + theStats::AddUnknownClient(); + } else { + theStats::AddKnownClient(this); + } + } +} + +bool CUpDownClient::IsIdentified() const +{ + return (credits && credits->GetCurrentIdentState(GetIP()) == IS_IDENTIFIED); +} + +bool CUpDownClient::IsBadGuy() const +{ + return (credits && credits->GetCurrentIdentState(GetIP()) == IS_IDBADGUY); +} + +bool CUpDownClient::SUIFailed() const +{ + return (credits && credits->GetCurrentIdentState(GetIP()) == IS_IDFAILED); +} + +bool CUpDownClient::SUINeeded() const +{ + return (credits && credits->GetCurrentIdentState(GetIP()) == IS_IDNEEDED); +} + +bool CUpDownClient::SUINotSupported() const +{ + return (credits && credits->GetCurrentIdentState(GetIP()) == IS_NOTAVAILABLE); +} + +uint64 CUpDownClient::GetDownloadedTotal() const +{ + return credits ? credits->GetDownloadedTotal() : 0; +} + +uint64 CUpDownClient::GetUploadedTotal() const +{ + return credits ? credits->GetUploadedTotal() : 0; +} + +double CUpDownClient::GetScoreRatio() const { + return credits ? credits->GetScoreRatio(GetIP(), theApp->CryptoAvailable()) : 0; +} + +const wxString CUpDownClient::GetServerName() const +{ + wxString ret; + wxString srvaddr = Uint32toStringIP(GetServerIP()); + CServer* cserver = theApp->serverlist->GetServerByAddress( + srvaddr, GetServerPort()); + if (cserver) { + ret = cserver->GetListName(); + } else { + ret = _("Unknown"); + } + + return ret; +} + +bool CUpDownClient::ShouldReceiveCryptUDPPackets() const { + return (thePrefs::IsClientCryptLayerSupported() && SupportsCryptLayer() && theApp->GetPublicIP() != 0 + && HasValidHash() && (thePrefs::IsClientCryptLayerRequested() || RequestsCryptLayer()) ); +} + +// File_checked_for_headers diff --git a/src/CFile.cpp b/src/CFile.cpp new file mode 100644 index 00000000..54e5ef61 --- /dev/null +++ b/src/CFile.cpp @@ -0,0 +1,410 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 1998 Vadim Zeitlin ( zeitlin@dptmaths.ens-cachan.fr ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "CFile.h" // Interface declarations. +#include "Logger.h" // Needed for AddDebugLogLineM +#include // Needed for CPath + + +#ifdef HAVE_CONFIG_H +#include "config.h" // Needed for HAVE_SYS_PARAM_H +#endif + + +#ifdef HAVE_SYS_PARAM_H +#include +#endif + +// standard +#if defined(__WXMSW__) && !defined(__GNUWIN32__) && !defined(__WXWINE__) && !defined(__WXMICROWIN__) +# include +# ifndef __SALFORDC__ +# define WIN32_LEAN_AND_MEAN +# define NOSERVICE +# define NOIME +# define NOATOM +# define NOGDI +# define NOGDICAPMASKS +# define NOMETAFILE +# define NOMINMAX +# define NOMSG +# define NOOPENFILE +# define NORASTEROPS +# define NOSCROLL +# define NOSOUND +# define NOSYSMETRICS +# define NOTEXTMETRIC +# define NOWH +# define NOCOMM +# define NOKANJI +# define NOCRYPT +# define NOMCX +# endif +#elif (defined(__UNIX__) || defined(__GNUWIN32__)) +# ifdef __GNUWIN32__ +# include +# endif +#elif (defined(__WXPM__)) +# include +#elif (defined(__WXSTUBS__)) + // Have to ifdef this for different environments +# include +#elif (defined(__WXMAC__)) +#if __MSL__ < 0x6000 +int access( const char *path, int mode ) { return 0 ; } +#else +int _access( const char *path, int mode ) { return 0 ; } +#endif +char* mktemp( char * path ) { return path ;} +# include +#else +# error "Please specify the header with file functions declarations." +#endif //Win/UNIX + +// there is no distinction between text and binary files under Unix, so define +// O_BINARY as 0 if the system headers don't do it already +#if defined(__UNIX__) && !defined(O_BINARY) +# define O_BINARY (0) +#endif //__UNIX__ + +#ifdef __WXMSW__ +#include +#endif + + +// The following defines handle different names across platforms, +// and ensures that we use 64b IO on windows (only 32b by default). +#ifdef __WXMSW__ + #define FLUSH_FD(x) _commit(x) + #define SEEK_FD(x, y, z) _lseeki64(x, y, z) + #define TELL_FD(x) _telli64(x) + + #if (__MSVCRT_VERSION__ < 0x0601) + //#warning MSCVRT-Version smaller than 6.01 + #define STAT_FD(x, y) _fstati64(x, y) + #define STAT_STRUCT struct _stati64 + #else + #define STAT_FD(x, y) _fstat64(x, y) + #define STAT_STRUCT struct __stat64 + #endif +#else + +// We don't need to sync all meta-data, just the contents, +// so use fdatasync when possible (see man fdatasync). + #if defined(_POSIX_SYNCHRONIZED_IO) && (_POSIX_SYNCHRONIZED_IO > 0) + #define FLUSH_FD(x) fdatasync(x) + #else + #define FLUSH_FD(x) fsync(x) + #endif + + #define SEEK_FD(x, y, z) lseek(x, y, z) + #define TELL_FD(x) wxTell(x) + #define STAT_FD(x, y) fstat(x, y) + #define STAT_STRUCT struct stat +#endif + + +// This function is used to check if a syscall failed, in that case +// log an appropriate message containing the errno string. +inline void syscall_check( + bool check, + const CPath& filePath, + const wxString& what) +{ + if (!check) { + AddDebugLogLineM(true, logCFile, + CFormat(wxT("Error when %s (%s): %s")) + % what % filePath % wxSysErrorMsg()); + } +} + + +CSeekFailureException::CSeekFailureException(const wxString& desc) + : CIOFailureException(wxT("SeekFailure"), desc) +{} + + +CFile::CFile() + : m_fd(fd_invalid) +{} + + +CFile::CFile(const CPath& fileName, OpenMode mode) + : m_fd(fd_invalid) +{ + Open(fileName, mode); +} + + +CFile::CFile(const wxString& fileName, OpenMode mode) + : m_fd(fd_invalid) +{ + Open(fileName, mode); +} + + +CFile::~CFile() +{ + if (IsOpened()) { + Close(); + } +} + + +int CFile::fd() const +{ + return m_fd; +} + + +bool CFile::IsOpened() const +{ + return m_fd != fd_invalid; +} + + +const CPath& CFile::GetFilePath() const +{ + MULE_VALIDATE_STATE(IsOpened(), wxT("CFile: Cannot return path of closed file.")); + + return m_filePath; +} + + +bool CFile::Create(const CPath& path, bool overwrite, int accessMode) +{ + if (!overwrite && path.FileExists()) { + return false; + } + + return Open(path, write, accessMode); +} + +bool CFile::Create(const wxString& path, bool overwrite, int accessMode) +{ + return Create(CPath(path), overwrite, accessMode); +} + + +bool CFile::Open(const wxString& fileName, OpenMode mode, int accessMode) +{ + MULE_VALIDATE_PARAMS(fileName.Length(), wxT("CFile: Cannot open, empty path.")); + + return Open(CPath(fileName), mode, accessMode); +} + + +bool CFile::Open(const CPath& fileName, OpenMode mode, int accessMode) +{ + MULE_VALIDATE_PARAMS(fileName.IsOk(), wxT("CFile: Cannot open, empty path.")); + +#ifdef __linux__ + int flags = O_BINARY | O_LARGEFILE; +#else + int flags = O_BINARY; +#endif + switch ( mode ) { + case read: + flags |= O_RDONLY; + break; + + case write_append: + if (fileName.FileExists()) + { + flags |= O_WRONLY | O_APPEND; + break; + } + //else: fall through as write_append is the same as write if the + // file doesn't exist + + case write: + flags |= O_WRONLY | O_CREAT | O_TRUNC; + break; + + case write_excl: + flags |= O_WRONLY | O_CREAT | O_EXCL; + break; + + case read_write: + flags |= O_RDWR; + break; + } + + if (IsOpened()) { + Close(); + } + + + + Unicode2CharBuf tmpFileName = filename2char(fileName.GetRaw()); + wxASSERT_MSG(tmpFileName, wxT("Convertion failed in CFile::Open")); + + m_filePath = fileName; + m_fd = open(tmpFileName, flags, accessMode); + syscall_check(m_fd != fd_invalid, m_filePath, wxT("opening file")); + + return IsOpened(); +} + + +bool CFile::Close() +{ + MULE_VALIDATE_STATE(IsOpened(), wxT("CFile: Cannot close closed file.")); + + bool closed = (close(m_fd) != -1); + syscall_check(closed, m_filePath, wxT("closing file")); + + m_fd = fd_invalid; + + return closed; +} + + +bool CFile::Flush() +{ + MULE_VALIDATE_STATE(IsOpened(), wxT("CFile: Cannot flush closed file.")); + + bool flushed = (FLUSH_FD(m_fd) != -1); + syscall_check(flushed, m_filePath, wxT("flushing file")); + + return flushed; +} + + +sint64 CFile::doRead(void* buffer, size_t count) const +{ + MULE_VALIDATE_PARAMS(buffer, wxT("CFile: Invalid buffer in read operation.")); + MULE_VALIDATE_STATE(IsOpened(), wxT("CFile: Cannot read from closed file.")); + + size_t totalRead = 0; + while (totalRead < count) { + int current = ::read(m_fd, (char*)buffer + totalRead, count - totalRead); + + if (current == -1) { + // Read error, nothing we can do other than abort. + throw CIOFailureException(wxString(wxT("Error reading from file: ")) + wxSysErrorMsg()); + } else if ((totalRead + current < count) && Eof()) { + // We may fail to read the specified count in a couple + // of situations: EOF and interrupts. The check for EOF + // is needed to avoid inf. loops. + break; + } + + totalRead += current; + } + + return totalRead; +} + + +sint64 CFile::doWrite(const void* buffer, size_t nCount) +{ + MULE_VALIDATE_PARAMS(buffer, wxT("CFile: Invalid buffer in write operation.")); + MULE_VALIDATE_STATE(IsOpened(), wxT("CFile: Cannot write to closed file.")); + + sint64 result = ::write(m_fd, buffer, nCount); + + if (result != (sint64)nCount) { + throw CIOFailureException(wxString(wxT("Error writing to file: ")) + wxSysErrorMsg()); + } + + return result; +} + + +sint64 CFile::doSeek(sint64 offset) const +{ + MULE_VALIDATE_STATE(IsOpened(), wxT("Cannot seek on closed file.")); + MULE_VALIDATE_PARAMS(offset >= 0, wxT("Invalid position, must be positive.")); + + sint64 result = SEEK_FD(m_fd, offset, SEEK_SET); + + if (result == offset) { + return result; + } else if (result == wxInvalidOffset) { + throw CSeekFailureException(wxString(wxT("Seeking failed: ")) + wxSysErrorMsg()); + } else { + throw CSeekFailureException(wxT("Seeking returned incorrect position")); + } +} + + +uint64 CFile::GetPosition() const +{ + MULE_VALIDATE_STATE(IsOpened(), wxT("Cannot get position in closed file.")); + + sint64 pos = TELL_FD(m_fd); + if (pos == wxInvalidOffset) { + throw CSeekFailureException(wxString(wxT("Failed to retrieve position in file: ")) + wxSysErrorMsg()); + } + + return pos; +} + + +uint64 CFile::GetLength() const +{ + MULE_VALIDATE_STATE(IsOpened(), wxT("CFile: Cannot get length of closed file.")); + + STAT_STRUCT buf; + if (STAT_FD(m_fd, &buf) == -1) { + throw CIOFailureException(wxString(wxT("Failed to retrieve length of file: ")) + wxSysErrorMsg()); + } + + return buf.st_size; +} + + +uint64 CFile::GetAvailable() const +{ + const uint64 length = GetLength(); + const uint64 position = GetPosition(); + + // Safely handle seeking past EOF + if (position < length) { + return length - position; + } + + // File is at or after EOF + return 0; +} + + +bool CFile::SetLength(size_t new_len) +{ + MULE_VALIDATE_STATE(IsOpened(), wxT("CFile: Cannot set length when no file is open.")); + +#ifdef __WXMSW__ + int result = chsize(m_fd, new_len); +#else + int result = ftruncate(m_fd, new_len); +#endif + + syscall_check((result != -1), m_filePath, wxT("truncating file")); + + return (result != -1); +} +// File_checked_for_headers diff --git a/src/CFile.h b/src/CFile.h new file mode 100644 index 00000000..5a1ee35d --- /dev/null +++ b/src/CFile.h @@ -0,0 +1,201 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 1998 Vadim Zeitlin ( zeitlin@dptmaths.ens-cachan.fr ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef CFILE_H +#define CFILE_H + +#include // Needed for CPath +#include "SafeFile.h" // Needed for CFileDataIO + +#include // Needed for constants + + +/** + * This class is a modified version of the wxFile class. + * + * In addition to implementing the CFileDataIO interface, + * it offers improved support for UTF8 filenames and 64b + * file-IO on both windows and unix-like systems. + * + * @see wxFile + */ +class CFile : public CFileDataIO +{ +public: + //! Standard values for file descriptor + enum { fd_invalid = -1, fd_stdin, fd_stdout, fd_stderr }; + + /** @see wxFile::OpenMode */ + enum OpenMode { read, write, read_write, write_append, write_excl }; + + + /** + * Creates a closed file. + */ + CFile(); + + /** + * Constructor, calls Open on the specified file. + * + * To check if the file was successfully opened, a + * call to IsOpened() is required. + */ + CFile(const CPath& path, OpenMode mode = read); + CFile(const wxString& path, OpenMode mode = read); + + /** + * Destructor, closes the file if opened. + */ + virtual ~CFile(); + + + /** + * Opens a file. + * + * @param path The full or relative path to the file. + * @param mode The opening mode. + * @param accessMode The permissions in case a new file is created. + * @return True if the file was opened, false otherwise. + * + * Calling Open with the openmodes 'write' or 'write_append' will + * create the specified file if it does not already exist. + * + * If an accessMode is not explicitly specified, the accessmode + * specified via CPreferences::GetFilePermissions will be used. + */ + bool Open(const CPath& path, OpenMode mode = read, int accessMode = wxS_DEFAULT); + bool Open(const wxString& path, OpenMode mode = read, int accessMode = wxS_DEFAULT); + + /** + * Calling Create is equivilant of calling open with OpenMode 'write'. + * + * @param overwrite Specifies if the target file should be overwritten, + * in case that it already exists. + * + * @see CFile::Open + */ + bool Create(const CPath& path, bool overwrite = false, int accessMode = wxS_DEFAULT); + bool Create(const wxString& path, bool overwrite = false, int accessMode = wxS_DEFAULT); + + /** + * Closes the file. + * + * Note that calling Close on an closed file + * is an illegal operation. + */ + bool Close(); + + + /** + * Returns the file descriptior assosiated with the file. + * + * Note that direct manipulation of the descriptor should + * be avoided! That's what this class is for. + */ + int fd() const; + + /** + * Flushes data not yet written. + * + * Note that calling Flush on an closed file + * is an illegal operation. + */ + bool Flush(); + + + /** + * @see CSafeFileIO::GetLength + * + * Note that calling GetLength on a closed file + * is an illegal operation. + */ + virtual uint64 GetLength() const; + + /** + * Resizes the file to the specified length. + */ + bool SetLength(size_t newLength); + + /** + * @see CSafeFileIO::GetPosition + * + * Note that calling GetPosition on a closed file + * is an illegal operation. + */ + virtual uint64 GetPosition() const; + + /** + * Returns the current available bytes to read on the file before EOF + * + */ + virtual uint64 GetAvailable() const; + + /** + * Returns the path of the currently opened file. + * + * Calling this function on an closed file is + * an illegal operation. + */ + const CPath& GetFilePath() const; + + + /** + * Returns true if the file is opened, false otherwise. + */ + bool IsOpened() const; + +protected: + /** @see CFileDataIO::doRead **/ + virtual sint64 doRead(void* buffer, size_t count) const; + /** @see CFileDataIO::doWrite **/ + virtual sint64 doWrite(const void* buffer, size_t count); + /** @see CFileDataIO::doSeek **/ + virtual sint64 doSeek(sint64 offset) const; + +private: + //! A CFile is neither copyable nor assignable. + //@{ + CFile(const CFile&); + CFile& operator=(const CFile&); + //@} + + //! File descriptor or 'fd_invalid' if not opened + int m_fd; + + //! The full path to the current file. + CPath m_filePath; +}; + + +/** + * This exception is thrown by CFile if a seek or tell fails. + */ +struct CSeekFailureException : public CIOFailureException { + CSeekFailureException(const wxString& desc); +}; + + +#endif // CFILE_H +// File_checked_for_headers diff --git a/src/CatDialog.cpp b/src/CatDialog.cpp new file mode 100644 index 00000000..8c17eac3 --- /dev/null +++ b/src/CatDialog.cpp @@ -0,0 +1,218 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) created by Ornis +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include +#include + +#ifdef __WXMSW__ + #include // Do_not_auto_remove +#endif + +#include "CatDialog.h" // Interface declarations. +#include "DownloadListCtrl.h" // Needed for CDownloadListCtrl +#include "TransferWnd.h" // Needed for CTransferWnd +#include "amuleDlg.h" // Needed for CamuleDlg +#include "SearchDlg.h" // Needed for UpdateCatChoice +#include // Needed for MakeFoldername +#include "OtherFunctions.h" // Needed for CastChild +#include "Preferences.h" // Needed for CPreferences +#include "amule.h" // Needed for theApp +#include "muuli_wdr.h" // Needed for CategoriesEditWindow + + +BEGIN_EVENT_TABLE(CCatDialog,wxDialog) + EVT_BUTTON(wxID_OK, CCatDialog::OnBnClickedOk) + EVT_BUTTON(IDC_CATCOLOR, CCatDialog::OnBnClickColor) + EVT_BUTTON(IDC_BROWSE, CCatDialog::OnBnClickedBrowse) +END_EVENT_TABLE() + +/* + * This class is used in both amule and amulegui. It cannot go into + * libmuleappgui because of preferences. When the compiler must passes + * here on the remote client, the variable glob_prefs has two different + * types, in one case it is (CPreferences *), on the other case it is + * (CPreferencesRem *). A proper fix involves a class hierarchy redesign. + */ +CCatDialog::CCatDialog(wxWindow* parent, bool allowbrowse, int index) +: +wxDialog(parent, -1, _("Category"), + wxDefaultPosition, wxDefaultSize, + wxDEFAULT_DIALOG_STYLE|wxSYSTEM_MENU) +{ + wxSizer* content = CategoriesEditWindow(this, true); + content->Show(this, true); + Center(); + m_category = NULL; + + // Attempt to get the specified category, this may or may not succeed, + // we dont really care. If it fails (too high index or such), then we + // simply get NULL and create a new category + if (index > -1) { + m_category = theApp->glob_prefs->GetCategory(index); + } + + if (m_category) { + // Filling values by the specified category + CastChild(IDC_TITLE, wxTextCtrl)->SetValue(m_category->title); + // We use the 'raw' filename, since the value is also passed to wxDirSelector + CastChild(IDC_INCOMING, wxTextCtrl)->SetValue(m_category->path.GetRaw()); + CastChild(IDC_COMMENT, wxTextCtrl)->SetValue(m_category->comment); + CastChild(IDC_PRIOCOMBO,wxChoice)->SetSelection(m_category->prio); + + m_color = m_category->color; + } else { + // Default values for new categories + CastChild(IDC_TITLE, wxTextCtrl)->SetValue(_("New Category")); + CastChild(IDC_INCOMING, wxTextCtrl)->SetValue(thePrefs::GetIncomingDir().GetRaw()); + CastChild(IDC_COMMENT, wxTextCtrl)->SetValue(wxEmptyString); + CastChild(IDC_PRIOCOMBO,wxChoice)->SetSelection(0); + + m_color = RGB(rand() % 255, rand() % 255, rand() % 255); + } + + CastChild(ID_BOX_CATCOLOR, wxStaticBitmap)-> + SetBitmap(MakeBitmap(WxColourFromCr(m_color))); + + if (!allowbrowse) { + CastChild(IDC_BROWSE, wxButton)->Destroy(); + } +} + + +CCatDialog::~CCatDialog() +{ +} + + +wxBitmap CCatDialog::MakeBitmap(wxColour colour) +{ + wxBitmap bitmap(16, 16); + wxMemoryDC dc(bitmap); + + dc.SetBrush(wxBrush(colour, wxSOLID)); + dc.DrawRectangle(0, 0, 16, 16); + + return bitmap; +} + + +void CCatDialog::OnBnClickedBrowse(wxCommandEvent& WXUNUSED(evt)) +{ + wxString dir = CastChild(IDC_INCOMING, wxTextCtrl)->GetValue(); + + dir = wxDirSelector( + _("Choose a folder for incoming files"), + dir, wxDD_DEFAULT_STYLE, wxDefaultPosition, this); + if (!dir.IsEmpty()) { + CastChild(IDC_INCOMING, wxTextCtrl)->SetValue(dir); + } +} + + +void CCatDialog::OnBnClickedOk(wxCommandEvent& WXUNUSED(evt)) +{ + wxString newname = CastChild(IDC_TITLE, wxTextCtrl)->GetValue(); + + // No empty names + if (newname.IsEmpty()) { + wxMessageBox( + _("You must specify a name for the category!"), + _("Info"), wxOK, this); + return; + } + + CPath newpath = CPath(CastChild(IDC_INCOMING, wxTextCtrl)->GetValue()); + + // No empty dirs please + if (!newpath.IsOk()) { + wxMessageBox( + _("You must specify a path for the category!"), + _("Info"), wxOK, this); + + return; + } + + if (!newpath.DirExists()) { + if (!CPath::MakeDir(newpath)) { + wxMessageBox(_("Failed to create incoming dir for category. Please specify a valid path!"), + _("Info"), wxOK, this); + return; + } + } + + // Check if we are using an existing category, and if we are, if it has + // been removed in the mean-while. Otherwise create new category. + // lfroen: The only place where it could happen, is removing category + // from remote gui, while local gui amule have dialog opened in this + // category. + int index = -1; + if (m_category) { + // Check if the original category still exists + bool found = false; + for (uint32 i = 0; i < theApp->glob_prefs->GetCatCount(); ++i) { + if (m_category == theApp->glob_prefs->GetCategory(i)) { + found = true; + index = i; + break; + } + } + if (!found) { + m_category = 0; + } + } + + if (!m_category) { + // New category, or the old one is gone + m_category = theApp->glob_prefs->CreateCategory( + newname, newpath, + CastChild(IDC_COMMENT, wxTextCtrl)->GetValue(), + m_color, + CastChild(IDC_PRIOCOMBO, wxChoice)->GetSelection()); + + theApp->amuledlg->m_transferwnd->AddCategory(m_category); + } else { + theApp->glob_prefs->UpdateCategory(index, newname, newpath, + CastChild(IDC_COMMENT, wxTextCtrl)->GetValue(), m_color, + CastChild(IDC_PRIOCOMBO, wxChoice)->GetSelection()); + + theApp->amuledlg->m_transferwnd->UpdateCategory(index); + theApp->amuledlg->m_transferwnd->downloadlistctrl->Refresh(); + theApp->amuledlg->m_searchwnd->UpdateCatChoice(); + } + + EndModal(wxID_OK); +} + + +void CCatDialog::OnBnClickColor(wxCommandEvent& WXUNUSED(evt)) +{ + wxColour newcol = wxGetColourFromUser(this, WxColourFromCr(m_color)); + if (newcol.Ok()) { + m_color = CrFromWxColour(newcol); + CastChild(ID_BOX_CATCOLOR, wxStaticBitmap)-> + SetBitmap(MakeBitmap(WxColourFromCr(m_color))); + } +} +// File_checked_for_headers diff --git a/src/CatDialog.h b/src/CatDialog.h new file mode 100644 index 00000000..b066c6ec --- /dev/null +++ b/src/CatDialog.h @@ -0,0 +1,109 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 quekky +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef CATDIALOG_H +#define CATDIALOG_H + +#include // Needed for wxDialog +#include "Types.h" // Needed for uint32 + + +class Category_Struct; +class wxStaticBitmap; +class wxBitmap; +class wxColour; + + +/** + * This dialog takes of displaying either existing or new categories, so that + * the user can add or change them. + * + * It is a self-contained entity, and does not rely on the categories staying + * the same while the dialog is visble, though it will overwrite any changes + * made to the selected category in the mean time. Also, if the selected category + * has been deleted then it will simply be readded. + * + * It does however rely on the Transferwnd keeping its own list of categories up- + * to-date. + */ +class CCatDialog : public wxDialog +{ +public: + /** + * Constructor. + * + * @param parent The parent of the new dialog. + * @param catindex The category to be edited. + * + * The parameter catindex can be a valid index, in which case that category + * will be selected, or it can be less than zero, in which case a new + * category will be created. + */ + CCatDialog(wxWindow* parent, bool allowbrowse, int catindex = -1 ); + + /** + * Destructor. + */ + ~CCatDialog(); + +private: + /** + * Helper function for making the color-preview. + * + * @param colour The color with which to fill the bitmap. + * + * This function creates a single-color 16x16 image, using the + * specified colour. + */ + wxBitmap MakeBitmap( wxColour colour ); + + + //! Variable used to store the user-selected color. + uint32 m_color; + + //! Pointer to category to be edited or NULL if we are adding a new category. + Category_Struct* m_category; + + + /** + * Event-handler for selecting incomming dir. + */ + void OnBnClickedBrowse(wxCommandEvent& evt); + + /** + * Event-handler for saving the changes. + */ + void OnBnClickedOk(wxCommandEvent& evt); + + /** + * Event-handler for selecting category color. + */ + void OnBnClickColor(wxCommandEvent& evt); + + DECLARE_EVENT_TABLE() +}; + +#endif +// File_checked_for_headers diff --git a/src/ChatSelector.cpp b/src/ChatSelector.cpp new file mode 100644 index 00000000..f2e9f1a0 --- /dev/null +++ b/src/ChatSelector.cpp @@ -0,0 +1,326 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include +#include + +#include "pixmaps/chat.ico.xpm" +#include "ChatSelector.h" // Interface declarations +#include "Preferences.h" // Needed for CPreferences +#include "amule.h" // Needed for theApp +#include "updownclient.h" // Needed for CUpDownClient +#include "OtherFunctions.h" +#include "muuli_wdr.h" // Needed for amuleSpecial +#include "UserEvents.h" + +//#warning Needed while not ported +#include "ClientList.h" +#include // Needed for CFormat + + +// Default colors, +#define COLOR_BLACK wxTextAttr( wxColor( 0, 0, 0 ) ) +#define COLOR_BLUE wxTextAttr( wxColor( 0, 0, 255 ) ) +#define COLOR_GREEN wxTextAttr( wxColor( 0, 102, 0 ) ) +#define COLOR_RED wxTextAttr( wxColor( 255, 0, 0 ) ) + +CChatSession::CChatSession(wxWindow* parent, wxWindowID id, const wxString& value, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name) +: CMuleTextCtrl( parent, id, value, pos, size, style | wxTE_READONLY | wxTE_RICH | wxTE_MULTILINE, validator, name ) +{ + m_client_id = 0; + m_active = false; + SetBackgroundColour(*wxWHITE); +} + + +CChatSession::~CChatSession() +{ + //#warning EC NEEDED + #ifndef CLIENT_GUI + theApp->clientlist->SetChatState(m_client_id,MS_NONE); + #endif +} + + +void CChatSession::AddText(const wxString& text, const wxTextAttr& style, bool newline) +{ + // Split multi-line messages into individual lines + wxStringTokenizer tokens( text, wxT("\n") ); + + while ( tokens.HasMoreTokens() ) { + // Check if we should add a time-stamp + if ( GetNumberOfLines() > 1 ) { + // Check if the last line ended with a newline + wxString line = GetLineText( GetNumberOfLines() - 1 ); + if ( line.IsEmpty() ) { + SetDefaultStyle( COLOR_BLACK ); + + AppendText( wxT(" [") + wxDateTime::Now().FormatISOTime() + wxT("] ") ); + } + } + + SetDefaultStyle(style); + + AppendText( tokens.GetNextToken() ); + + // Only add newlines after the last line if it is desired + if ( tokens.HasMoreTokens() || newline ) { + AppendText( wxT("\n") ); + } + } +} + + + + +CChatSelector::CChatSelector(wxWindow* parent, wxWindowID id, const wxPoint& pos, wxSize siz, long style) +: CMuleNotebook(parent, id, pos, siz, style) +{ + wxImageList* imagelist = new wxImageList(16,16); + + // Chat icon -- default state + imagelist->Add(wxBitmap(chat_ico_xpm)); + // Close icon -- on mouseover + imagelist->Add(amuleSpecial(4)); + + AssignImageList(imagelist); +} + +CChatSession* CChatSelector::StartSession(uint64 client_id, const wxString& client_name, bool show) +{ + // Check to see if we've already opened a session for this user + if ( GetPageByClientID( client_id ) ) { + if ( show ) { + SetSelection( GetTabByClientID( client_id ) ); + } + + return NULL; + } + + CChatSession* chatsession = new CChatSession(this); + + chatsession->m_client_id = client_id; + + wxString text; + text = wxT(" *** ") + (CFormat(_("Chat-Session Started: %s (%s:%u) - %s %s")) + % client_name + % Uint32toStringIP(IP_FROM_GUI_ID(client_id)) + % PORT_FROM_GUI_ID(client_id) + % wxDateTime::Now().FormatISODate() + % wxDateTime::Now().FormatISOTime()); + + chatsession->AddText( text, COLOR_RED ); + AddPage(chatsession, client_name, show, 0); + + CUserEvents::ProcessEvent(CUserEvents::NewChatSession, &client_name); + + return chatsession; +} + + +CChatSession* CChatSelector::GetPageByClientID(uint64 client_id) +{ + for ( unsigned int i = 0; i < (unsigned int ) GetPageCount(); i++ ) { + CChatSession* page = (CChatSession*)GetPage( i ); + + if( page->m_client_id == client_id ) { + return page; + } + } + + return NULL; +} + + +int CChatSelector::GetTabByClientID(uint64 client_id) +{ + for ( unsigned int i = 0; i < (unsigned int) GetPageCount(); i++ ) { + CChatSession* page = (CChatSession*)GetPage( i ); + + if( page->m_client_id == client_id ) { + return i; + } + } + + return -1; +} + + +bool CChatSelector::ProcessMessage(uint64 sender_id, const wxString& message) +{ + CChatSession* session = GetPageByClientID(sender_id); + + // Try to get the name (core sent it?) + int separator = message.Find(wxT("|")); + wxString client_name; + wxString client_message; + if (separator != -1) { + client_name = message.Left(separator); + client_message = message.Mid(separator+1); + } else { + // No need to define client_name. If needed, will be build on tab creation. + client_message = message; + } + + bool newtab = !session; + + if ( !session ) { + // This must be a mesage from a client that is not already chatting + if (client_name.IsEmpty()) { + // Core did not send us the name. + // This must NOT happen. + // Build a client name based on the ID + uint32 ip = IP_FROM_GUI_ID(sender_id); + client_name = wxString::Format(wxT("IP: %u.%u.%u.%u Port: %u"),(uint8)ip,(uint8)(ip>>8),(uint8)(ip>>16),(uint8)(ip>>24),(unsigned)PORT_FROM_GUI_ID(sender_id)); + } + + session = StartSession( sender_id, client_name, true ); + } + + // Other client connected after disconnection or a new session + if ( !session->m_active ) { + session->m_active = true; + + session->AddText( _("*** Connected to Client ***"), COLOR_RED ); + } + + // Page text is client name + session->AddText( GetPageText(GetTabByClientID(sender_id)), COLOR_BLUE, false ); + session->AddText( wxT(": ") + client_message, COLOR_BLACK ); + + return newtab; +} + +bool CChatSelector::SendMessage( const wxString& message, const wxString& client_name, uint64 to_id ) +{ + // Dont let the user send empty messages + // This is also a user-fix for people who mash the enter-key ... + if ( message.IsEmpty() ) { + return false; + } + + if (to_id) { + // Checks if there's a page with this client, and selects it or creates it + StartSession(to_id, client_name, true); + } + + int usedtab = GetSelection(); + // Workaround for a problem with wxNotebook, where an invalid selection is returned + if (usedtab >= (int)GetPageCount()) { + usedtab = GetPageCount() - 1; + } + if (usedtab == -1) { + return false; + } + + CChatSession* ci = (CChatSession*)GetPage( usedtab ); + + ci->m_active = true; + + //#warning EC needed here. + + #ifndef CLIENT_GUI + if (theApp->clientlist->SendMessage(ci->m_client_id, message)) { + ci->AddText( thePrefs::GetUserNick(), COLOR_GREEN, false ); + ci->AddText( wxT(": ") + message, COLOR_BLACK ); + } else { + ci->AddText( _("*** Connecting to Client ***"), COLOR_RED ); + } + #endif + + return true; +} + +//#warning Creteil? I know you are here Creteil... follow the white rabbit. +/* Madcat - knock knock ... + ,-.,-. + \ \\ \ + \ \\_\ + / \ + __| a a| + /` `'. = y)= + / `"`} + _| \ } + { \ ), // + '-', /__\ ( ( + jgs (______)\_)_) +*/ + + +void CChatSelector::ConnectionResult(bool success, const wxString& message, uint64 id) +{ + CChatSession* ci = GetPageByClientID(id); + if ( !ci ) { + return; + } + + if ( !success ) { + ci->AddText( _("*** Failed to Connect to client / Connection lost ***"), COLOR_RED ); + + ci->m_active = false; + } else { + // Kry - Woops, fix for the everlasting void message sending. + if ( !message.IsEmpty() ) { + ci->AddText( _("*** Connected to Client ***"), COLOR_RED ); + ci->AddText( thePrefs::GetUserNick(), COLOR_GREEN, false ); + ci->AddText( wxT(": ") + message, COLOR_BLACK ); + } + } +} + + +void CChatSelector::EndSession(uint64 client_id) +{ + int usedtab; + if (client_id) { + usedtab = GetTabByClientID(client_id); + } else { + usedtab = GetSelection(); + } + + if (usedtab == -1) { + return; + } + + DeletePage(usedtab); +} + + +// Refresh the tab assosiated with a client +void CChatSelector::RefreshFriend(uint64 toupdate_id, const wxString& new_name) +{ + wxASSERT( toupdate_id ); + + int tab = GetTabByClientID(toupdate_id); + + if (tab != -1) { + // This client has a tab. + SetPageText(tab,new_name); + } else { + // This client has no tab (friend disconnecting, etc) + // Nothing to be done here. + } +} +// File_checked_for_headers diff --git a/src/ChatSelector.h b/src/ChatSelector.h new file mode 100644 index 00000000..d6ec8455 --- /dev/null +++ b/src/ChatSelector.h @@ -0,0 +1,81 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef CHATSELECTOR_H +#define CHATSELECTOR_H + +#include "MuleTextCtrl.h" +#include "MuleNotebook.h" +#include "Types.h" // Needed for uint16 + +class CUpDownClient; +class CFriend; +class CDlgFriend; + + +/** + * This class is used to display chat sessions. + */ +class CChatSession : public CMuleTextCtrl +{ +public: + CChatSession(wxWindow *parent, wxWindowID id = -1, const wxString& value = wxT(""), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxTextCtrlNameStr ); + ~CChatSession(); + + uint64 m_client_id; + bool m_active; + + /** + * Appends the specified text. + * + * @param text The text to add. + * @param style The style of the new text. + * @param newline If a newline should be added to the end of the line. + * + * If newline is false, then no newlines will be at the end of added text, + * even if the passed string ends with newlines. Multiline strings are + * broken into indivudual lines and each are timestamped with the same date. + */ + void AddText( const wxString& text, const wxTextAttr& style, bool newline = true ); +}; + + +class CChatSelector : public CMuleNotebook +{ +public: + CChatSelector(wxWindow* parent, wxWindowID id, const wxPoint& pos, wxSize siz, long style); + virtual ~CChatSelector() {}; + CChatSession* StartSession(uint64 client_id, const wxString& client_name, bool show = true); + void EndSession(uint64 client_id = 0); + CChatSession* GetPageByClientID(uint64 client_id); + int GetTabByClientID(uint64 client_id); + bool ProcessMessage(uint64 sender_id, const wxString& message); + bool SendMessage(const wxString& message, const wxString& client_name = wxEmptyString, uint64 to_id = 0); + void ConnectionResult(bool success, const wxString& message, uint64 id); + void RefreshFriend(uint64 toupdate_id, const wxString& new_name); +}; + +#endif +// File_checked_for_headers diff --git a/src/ChatWnd.cpp b/src/ChatWnd.cpp new file mode 100644 index 00000000..44c84e75 --- /dev/null +++ b/src/ChatWnd.cpp @@ -0,0 +1,178 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include + +#include "ChatWnd.h" // Interface declarations + +#include "amule.h" // Needed for theApp +#include "amuleDlg.h" // Needed for CamuleDlg +#include "FriendListCtrl.h" // Needed for CFriendListCtrl +#include "ChatSelector.h" // Needed for CChatSelector +#include "muuli_wdr.h" // Needed for messagePage +#include "OtherFunctions.h" + +BEGIN_EVENT_TABLE(CChatWnd, wxPanel) + EVT_TEXT_ENTER(IDC_CMESSAGE, CChatWnd::OnBnClickedCsend) + EVT_BUTTON(IDC_CSEND, CChatWnd::OnBnClickedCsend) + EVT_BUTTON(IDC_CCLOSE, CChatWnd::OnBnClickedCclose) + EVT_MULENOTEBOOK_ALL_PAGES_CLOSED(IDC_CHATSELECTOR, CChatWnd::OnAllPagesClosed) +END_EVENT_TABLE() + + +CChatWnd::CChatWnd(wxWindow* pParent) +: wxPanel(pParent, -1) +{ + wxSizer* content = messagePage(this, true); + content->Show(this, true); + + chatselector = CastChild( IDC_CHATSELECTOR, CChatSelector ); + friendlistctrl = CastChild( ID_FRIENDLIST, CFriendListCtrl ); +} + +void CChatWnd::StartSession(CDlgFriend* friend_client, bool setfocus) +{ + + if ( !friend_client->m_name.IsEmpty() ) { + if (setfocus) { + theApp->amuledlg->SetActiveDialog(CamuleDlg::DT_CHAT_WND, this); + } + chatselector->StartSession(GUI_ID(friend_client->m_ip, friend_client->m_port), friend_client->m_name, true); + } + + // Check to enable the window controls if needed + CheckNewButtonsState(); +} + + +void CChatWnd::OnBnClickedCsend(wxCommandEvent& WXUNUSED(evt)) +{ + wxString message = CastChild(IDC_CMESSAGE, wxTextCtrl)->GetValue(); + + SendMessage(message); +} + + +void CChatWnd::OnBnClickedCclose(wxCommandEvent& WXUNUSED(evt)) +{ + chatselector->EndSession(); +} + + +void CChatWnd::OnAllPagesClosed(wxNotebookEvent& WXUNUSED(evt)) +{ + CastChild(IDC_CMESSAGE, wxTextCtrl)->Clear(); + // Check to disable the window controls + CheckNewButtonsState(); +} + + +CDlgFriend* CChatWnd::FindFriend(const CMD4Hash& userhash, uint32 dwIP, uint16 nPort) +{ + return friendlistctrl->FindFriend(userhash, dwIP, nPort); +} + + +void CChatWnd::AddFriend(CUpDownClient* toadd) +{ + friendlistctrl->AddFriend(toadd); +} + + +void CChatWnd::AddFriend(const CMD4Hash& userhash, const wxString& name, uint32 lastUsedIP, uint32 lastUsedPort) +{ + friendlistctrl->AddFriend( userhash, name, lastUsedIP, lastUsedPort); +} + +void CChatWnd::RemoveFriend(const CMD4Hash& userhash, uint32 lastUsedIP, uint32 lastUsedPort) +{ + friendlistctrl->RemoveFriend(friendlistctrl->FindFriend(userhash, lastUsedIP, lastUsedPort)); +} + +void CChatWnd::RefreshFriend(const CMD4Hash& userhash, const wxString& name, uint32 lastUsedIP, uint32 lastUsedPort) +{ + CDlgFriend* toupdate = friendlistctrl->FindFriend(userhash, lastUsedIP, lastUsedPort); + if (toupdate) { + if (!name.IsEmpty()) { + toupdate->m_name = name; + } + + // If name is empty, this is a disconnection/deletion event + toupdate->islinked = !name.IsEmpty(); + friendlistctrl->RefreshFriend(toupdate); + chatselector->RefreshFriend(GUI_ID(toupdate->m_ip, toupdate->m_port), toupdate->m_name); + } +} + +void CChatWnd::ProcessMessage(uint64 sender, const wxString& message) +{ + if ( !theApp->amuledlg->IsDialogVisible(CamuleDlg::DT_CHAT_WND) ) { + theApp->amuledlg->SetMessageBlink(true); + } + if (chatselector->ProcessMessage(sender, message)) { + // Check to enable the window controls if needed + CheckNewButtonsState(); + } +} + +void CChatWnd::ConnectionResult(bool success, const wxString& message, uint64 id) +{ + chatselector->ConnectionResult(success, message, id); +} + +void CChatWnd::SendMessage(const wxString& message, const wxString& client_name, uint64 to_id) +{ + + if (chatselector->SendMessage( message, client_name, to_id )) { + CastChild(IDC_CMESSAGE, wxTextCtrl)->Clear(); + } + + // Check to enable the window controls if needed + CheckNewButtonsState(); + CastChild(IDC_CMESSAGE, wxTextCtrl)->SetFocus(); +} + + +void CChatWnd::CheckNewButtonsState() { + switch (chatselector->GetPageCount()) { + case 0: + GetParent()->FindWindow(IDC_CSEND)->Enable(false); + GetParent()->FindWindow(IDC_CCLOSE)->Enable(false); + GetParent()->FindWindow(IDC_CMESSAGE)->Enable(false); + break; + case 1: + GetParent()->FindWindow(IDC_CSEND)->Enable(true); + GetParent()->FindWindow(IDC_CCLOSE)->Enable(true); + GetParent()->FindWindow(IDC_CMESSAGE)->Enable(true); + break; + default: + // Nothing to be done here. Keep current state, which should be enabled. + wxASSERT(GetParent()->FindWindow(IDC_CSEND)->IsEnabled()); + wxASSERT(GetParent()->FindWindow(IDC_CCLOSE)->IsEnabled()); + wxASSERT(GetParent()->FindWindow(IDC_CMESSAGE)->IsEnabled()); + break; + } +} +// File_checked_for_headers diff --git a/src/ChatWnd.h b/src/ChatWnd.h new file mode 100644 index 00000000..a96a3b4c --- /dev/null +++ b/src/ChatWnd.h @@ -0,0 +1,71 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef CHATWND_H +#define CHATWND_H + +#include // Needed for wxPanel +#include // Needed for wxNotebookEvent +#include "Types.h" + +class CDlgFriend; +class CUpDownClient; +class CChatSelector; +class CFriendListCtrl; +class CMD4Hash; + +class CChatWnd : public wxPanel +{ +public: + CChatWnd(wxWindow* pParent = NULL); + ~CChatWnd() {}; + + void StartSession(CDlgFriend* friend_client, bool setfocus = true); + + CDlgFriend* FindFriend(const CMD4Hash& userhash, uint32 dwIP, uint16 nPort); + void AddFriend(CUpDownClient* toadd); + void AddFriend(const CMD4Hash& userhash, const wxString& name, uint32 lastUsedIP, uint32 lastUsedPort); + void RemoveFriend(const CMD4Hash& userhash, uint32 lastUsedIP, uint32 lastUsedPort); + void RefreshFriend(const CMD4Hash& userhash, const wxString& name, uint32 lastUsedIP, uint32 lastUsedPort); + + void ProcessMessage(uint64 sender, const wxString& message); + void ConnectionResult(bool success, const wxString& message, uint64 id); + + void SendMessage(const wxString& message, const wxString& client_name = wxEmptyString, uint64 to_id = 0); + +protected: + void OnBnClickedCsend(wxCommandEvent& evt); + void OnBnClickedCclose(wxCommandEvent& evt); + void OnAllPagesClosed(wxNotebookEvent& evt); + void CheckNewButtonsState(); + + DECLARE_EVENT_TABLE() + + CFriendListCtrl* friendlistctrl; + CChatSelector* chatselector; +}; + +#endif +// File_checked_for_headers diff --git a/src/ClientCredits.cpp b/src/ClientCredits.cpp new file mode 100644 index 00000000..6605429e --- /dev/null +++ b/src/ClientCredits.cpp @@ -0,0 +1,277 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "ClientCredits.h" // Interface declarations + +#include + +#include "GetTickCount.h" // Needed for GetTickCount +#include "Logger.h" // Needed for Add(Debug)LogLine + +CreditStruct::CreditStruct() + : uploaded(0), + downloaded(0), + nLastSeen(0), + nReserved3(0), + nKeySize(0) +{ + memset(abySecureIdent, 0, MAXPUBKEYSIZE); +} + + +CClientCredits::CClientCredits(CreditStruct* in_credits) +{ + m_pCredits = in_credits; + InitalizeIdent(); + m_dwUnSecureWaitTime = 0; + m_dwSecureWaitTime = 0; + m_dwWaitTimeIP = 0; +} + + +CClientCredits::CClientCredits(const CMD4Hash& key) +{ + m_pCredits = new CreditStruct(); + m_pCredits->key = key; + + InitalizeIdent(); + m_dwUnSecureWaitTime = ::GetTickCount(); + m_dwSecureWaitTime = ::GetTickCount(); + m_dwWaitTimeIP = 0; +} + + +CClientCredits::~CClientCredits() +{ + delete m_pCredits; +} + + +void CClientCredits::AddDownloaded(uint32 bytes, uint32 dwForIP, bool cryptoavail) +{ + switch (GetCurrentIdentState(dwForIP)) { + case IS_IDFAILED: + case IS_IDBADGUY: + case IS_IDNEEDED: + if (cryptoavail) { + return; + } + break; + case IS_NOTAVAILABLE: + case IS_IDENTIFIED: + break; + } + + m_pCredits->downloaded += bytes; +} + + +void CClientCredits::AddUploaded(uint32 bytes, uint32 dwForIP, bool cryptoavail) +{ + switch (GetCurrentIdentState(dwForIP)) { + case IS_IDFAILED: + case IS_IDBADGUY: + case IS_IDNEEDED: + if (cryptoavail) { + return; + } + break; + case IS_NOTAVAILABLE: + case IS_IDENTIFIED: + break; + } + + m_pCredits->uploaded += bytes; +} + + +uint64 CClientCredits::GetUploadedTotal() const +{ + return m_pCredits->uploaded; +} + + +uint64 CClientCredits::GetDownloadedTotal() const +{ + return m_pCredits->downloaded; +} + + +float CClientCredits::GetScoreRatio(uint32 dwForIP, bool cryptoavail) +{ + // check the client ident status + switch (GetCurrentIdentState(dwForIP)) { + case IS_IDFAILED: + case IS_IDBADGUY: + case IS_IDNEEDED: + if (cryptoavail) { + // bad guy - no credits for you + return 1.0f; + } + break; + case IS_NOTAVAILABLE: + case IS_IDENTIFIED: + break; + } + + if (GetDownloadedTotal() < 1000000) { + return 1.0f; + } + + float result = 0.0f; + if (!GetUploadedTotal()) { + result = 10.0f; + } else { + result = (GetDownloadedTotal() * 2.0f) / GetUploadedTotal(); + } + + float result2 = sqrt((GetDownloadedTotal() / 1048576.0) + 2.0f); + if (result > result2) { + result = result2; + } + + if (result < 1.0f) { + return 1.0f; + } else if (result > 10.0f) { + return 10.0f; + } + + return result; +} + + +void CClientCredits::SetLastSeen() +{ + m_pCredits->nLastSeen = time(NULL); +} + + +void CClientCredits::InitalizeIdent() +{ + if (m_pCredits->nKeySize == 0 ){ + memset(m_abyPublicKey,0,80); // for debugging + m_nPublicKeyLen = 0; + m_identState = IS_NOTAVAILABLE; + } + else{ + m_nPublicKeyLen = m_pCredits->nKeySize; + memcpy(m_abyPublicKey, m_pCredits->abySecureIdent, m_nPublicKeyLen); + m_identState = IS_IDNEEDED; + } + m_dwCryptRndChallengeFor = 0; + m_dwCryptRndChallengeFrom = 0; + m_dwIdentIP = 0; +} + + +void CClientCredits::Verified(uint32 dwForIP) +{ + m_dwIdentIP = dwForIP; + // client was verified, copy the keyto store him if not done already + if (m_pCredits->nKeySize == 0){ + m_pCredits->nKeySize = m_nPublicKeyLen; + memcpy(m_pCredits->abySecureIdent, m_abyPublicKey, m_nPublicKeyLen); + if (GetDownloadedTotal() > 0){ + // for security reason, we have to delete all prior credits here + // in order to save this client, set 1 byte + m_pCredits->downloaded = 1; + m_pCredits->uploaded = 1; + AddDebugLogLineM( false, logCredits, wxT("Credits deleted due to new SecureIdent") ); + } + } + m_identState = IS_IDENTIFIED; +} + + +bool CClientCredits::SetSecureIdent(const byte* pachIdent, uint8 nIdentLen) +{ // verified Public key cannot change, use only if there is not public key yet + if (MAXPUBKEYSIZE < nIdentLen || m_pCredits->nKeySize != 0 ) { + return false; + } + memcpy(m_abyPublicKey,pachIdent, nIdentLen); + m_nPublicKeyLen = nIdentLen; + m_identState = IS_IDNEEDED; + return true; +} + + +EIdentState CClientCredits::GetCurrentIdentState(uint32 dwForIP) const +{ + if (m_identState != IS_IDENTIFIED) + return m_identState; + else{ + if (dwForIP == m_dwIdentIP) + return IS_IDENTIFIED; + else + return IS_IDBADGUY; + // mod note: clients which just reconnected after an IP change and have to ident yet will also have this state for 1-2 seconds + // so don't try to spam such clients with "bad guy" messages (besides: spam messages are always bad) + } +} + + +uint32 CClientCredits::GetSecureWaitStartTime(uint32 dwForIP) +{ + if (m_dwUnSecureWaitTime == 0 || m_dwSecureWaitTime == 0) + SetSecWaitStartTime(dwForIP); + + if (m_pCredits->nKeySize != 0){ // this client is a SecureHash Client + if (GetCurrentIdentState(dwForIP) == IS_IDENTIFIED){ // good boy + return m_dwSecureWaitTime; + } + else{ // not so good boy + if (dwForIP == m_dwWaitTimeIP){ + return m_dwUnSecureWaitTime; + } + else{ // bad boy + // this can also happen if the client has not identified himself yet, but will do later - so maybe he is not a bad boy :) . + + m_dwUnSecureWaitTime = ::GetTickCount(); + m_dwWaitTimeIP = dwForIP; + return m_dwUnSecureWaitTime; + } + } + } + else{ // not a SecureHash Client - handle it like before for now (no security checks) + return m_dwUnSecureWaitTime; + } +} + + +void CClientCredits::SetSecWaitStartTime(uint32 dwForIP) +{ + m_dwUnSecureWaitTime = ::GetTickCount()-1; + m_dwSecureWaitTime = ::GetTickCount()-1; + m_dwWaitTimeIP = dwForIP; +} + + +void CClientCredits::ClearWaitStartTime() +{ + m_dwUnSecureWaitTime = 0; + m_dwSecureWaitTime = 0; +} + +// File_checked_for_headers diff --git a/src/ClientCredits.h b/src/ClientCredits.h new file mode 100644 index 00000000..8bd60c74 --- /dev/null +++ b/src/ClientCredits.h @@ -0,0 +1,110 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef CLIENTCREDITS_H +#define CLIENTCREDITS_H + +#include "MD4Hash.h" // Needed for CMD4Hash + +#define MAXPUBKEYSIZE 80 + +#define CRYPT_CIP_REMOTECLIENT 10 +#define CRYPT_CIP_LOCALCLIENT 20 +#define CRYPT_CIP_NONECLIENT 30 + +#ifdef _MSC_VER +#pragma pack(1) +#endif +struct CreditStruct +{ + CreditStruct(); + + CMD4Hash key; + uint64 uploaded; // uploaded TO him + uint64 downloaded; // downloaded from him + uint32 nLastSeen; + uint16 nReserved3; + uint8 nKeySize; + byte abySecureIdent[MAXPUBKEYSIZE]; +} +#ifdef _MSC_VER +; +#pragma pack() +#else +__attribute__((__packed__)); +#endif + +enum EIdentState{ + IS_NOTAVAILABLE, + IS_IDNEEDED, + IS_IDENTIFIED, + IS_IDFAILED, + IS_IDBADGUY +}; + +class CClientCredits +{ + +public: + CClientCredits(CreditStruct* in_credits); + CClientCredits(const CMD4Hash& key); + ~CClientCredits(); + + const CMD4Hash& GetKey() const {return m_pCredits->key;} + const byte* GetSecureIdent() const {return m_abyPublicKey;} + uint8 GetSecIDKeyLen() const {return m_nPublicKeyLen;} + const CreditStruct* GetDataStruct() const {return m_pCredits;} + void ClearWaitStartTime(); + void AddDownloaded(uint32 bytes, uint32 dwForIP, bool cryptoavail); + void AddUploaded(uint32 bytes, uint32 dwForIP, bool cryptoavail); + uint64 GetUploadedTotal() const; + uint64 GetDownloadedTotal() const; + float GetScoreRatio(uint32 dwForIP, bool cryptoavail); + void SetLastSeen(); + bool SetSecureIdent(const byte* pachIdent, uint8 nIdentLen); // Public key cannot change, use only if there is not public key yet + uint32 m_dwCryptRndChallengeFor; + uint32 m_dwCryptRndChallengeFrom; + EIdentState GetCurrentIdentState(uint32 dwForIP) const; // can be != m_identState + uint32 GetSecureWaitStartTime(uint32 dwForIP); + void SetSecWaitStartTime(uint32 dwForIP); + void Verified(uint32 dwForIP); + EIdentState GetIdentState() const { return m_identState; } + void SetIdentState(EIdentState state) { m_identState = state; } + +private: + EIdentState m_identState; + void InitalizeIdent(); + CreditStruct* m_pCredits; + byte m_abyPublicKey[80]; // even keys which are not verified will be stored here, and - if verified - copied into the struct + uint8 m_nPublicKeyLen; + uint32 m_dwIdentIP; + uint32 m_dwWaitTime; + uint32 m_dwSecureWaitTime; + uint32 m_dwUnSecureWaitTime; + uint32 m_dwWaitTimeIP; // client IP assigned to the waittime +}; + +#endif // CLIENTCREDITS_H +// File_checked_for_headers diff --git a/src/ClientCreditsList.cpp b/src/ClientCreditsList.cpp new file mode 100644 index 00000000..51543fc5 --- /dev/null +++ b/src/ClientCreditsList.cpp @@ -0,0 +1,504 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "ClientCreditsList.h" // Interface declarations + + +#include +#include +#include +#include // Needed for GetFileSize + + +#include "GetTickCount.h" // Needed for GetTickCount +#include "Preferences.h" // Needed for thePrefs +#include "ClientCredits.h" // Needed for CClientCredits +#include "amule.h" // Needed for theApp +#include "CFile.h" // Needed for CFile +#include "Logger.h" // Needed for Add(Debug)LogLine +#include "CryptoPP_Inc.h" // Needed for Crypto functions + + +#define CLIENTS_MET_FILENAME wxT("clients.met") +#define CLIENTS_MET_BAK_FILENAME wxT("clients.met.BAK") +#define CRYPTKEY_FILENAME wxT("cryptkey.dat") + + +CClientCreditsList::CClientCreditsList() +{ + m_nLastSaved = ::GetTickCount(); + LoadList(); + + InitalizeCrypting(); +} + + +CClientCreditsList::~CClientCreditsList() +{ + ClientMap::iterator it = m_mapClients.begin(); + for ( ; it != m_mapClients.end(); ++it ){ + delete it->second; + } + m_mapClients.clear(); + delete static_cast(m_pSignkey); +} + + +void CClientCreditsList::LoadList() +{ + CFile file; + CPath fileName = CPath(theApp->ConfigDir + CLIENTS_MET_FILENAME); + + if (!fileName.FileExists()) { + return; + } + + try { + file.Open(fileName, CFile::read); + + if (file.ReadUInt8() != CREDITFILE_VERSION) { + AddDebugLogLineM( true, logCredits, + wxT("Creditfile is out of date and will be replaced") ); + file.Close(); + return; + } + + // everything is ok, lets see if the backup exist... + CPath bakFileName = CPath(theApp->ConfigDir + CLIENTS_MET_BAK_FILENAME); + + bool bCreateBackup = TRUE; + if (bakFileName.FileExists()) { + // Ok, the backup exist, get the size + CFile hBakFile(bakFileName); + if ( hBakFile.GetLength() > file.GetLength()) { + // the size of the backup was larger then the + // org. file, something is wrong here, don't + // overwrite old backup.. + bCreateBackup = FALSE; + } + // else: backup is smaller or the same size as org. + // file, proceed with copying of file + } + + //else: the backup doesn't exist, create it + if (bCreateBackup) { + file.Close(); // close the file before copying + if (!CPath::CloneFile(fileName, bakFileName, true)) { + AddDebugLogLineM(true, logCredits, + CFormat(wxT("Could not create backup file '%s'")) % fileName); + } + // reopen file + if (!file.Open(fileName, CFile::read)) { + AddDebugLogLineM( true, logCredits, + wxT("Failed to load creditfile") ); + return; + } + + file.Seek(1); + } + + + uint32 count = file.ReadUInt32(); + + const uint32 dwExpired = time(NULL) - 12960000; // today - 150 day + uint32 cDeleted = 0; + for (uint32 i = 0; i < count; i++){ + CreditStruct* newcstruct = new CreditStruct(); + + newcstruct->key = file.ReadHash(); + newcstruct->uploaded = file.ReadUInt32(); + newcstruct->downloaded = file.ReadUInt32(); + newcstruct->nLastSeen = file.ReadUInt32(); + newcstruct->uploaded += static_cast(file.ReadUInt32()) << 32; + newcstruct->downloaded += static_cast(file.ReadUInt32()) << 32; + newcstruct->nReserved3 = file.ReadUInt16(); + newcstruct->nKeySize = file.ReadUInt8(); + file.Read(newcstruct->abySecureIdent, MAXPUBKEYSIZE); + + if ( newcstruct->nKeySize > MAXPUBKEYSIZE ) { + // Oh dear, this is bad mojo, the file is most likely corrupt + // We can no longer assume that any of the clients in the file are valid + // and will have to discard it. + delete newcstruct; + + // Remove already read, and possibly invalid, entries + ClientMap::iterator it = m_mapClients.begin(); + for ( ; it != m_mapClients.end(); ++it ){ + delete it->second; + } + m_mapClients.clear(); + + AddDebugLogLineM( true, logCredits, + wxT("WARNING: Corruptions found while reading Creditfile!") ); + return; + } + + if (newcstruct->nLastSeen < dwExpired){ + cDeleted++; + delete newcstruct; + continue; + } + + CClientCredits* newcredits = new CClientCredits(newcstruct); + m_mapClients[newcredits->GetKey()] = newcredits; + } + + AddLogLineM(false, wxString::Format(wxPLURAL("Creditfile loaded, %u client is known", "Creditfile loaded, %u clients are known", count - cDeleted), count - cDeleted)); + + if (cDeleted) { + AddLogLineM(false, wxString::Format(wxPLURAL(" - Credits expired for %u client!", " - Credits expired for %u clients!", cDeleted), cDeleted)); + } + } catch (const CSafeIOException& e) { + AddDebugLogLineM(true, logCredits, wxT("IO error while loading clients.met file: ") + e.what()); + } +} + + +void CClientCreditsList::SaveList() +{ + AddDebugLogLineM( false, logCredits, wxT("Saved Credit list")); + m_nLastSaved = ::GetTickCount(); + + wxString name(theApp->ConfigDir + CLIENTS_MET_FILENAME); + CFile file; + + if ( !file.Create(name, true) ) { + AddDebugLogLineM( true, logCredits, wxT("Failed to create creditfile") ); + return; + } + + if ( file.Open(name, CFile::write) ) { + try { + uint32 count = 0; + + file.WriteUInt8( CREDITFILE_VERSION ); + // Temporary place-holder for number of stucts + file.WriteUInt32( 0 ); + + ClientMap::iterator it = m_mapClients.begin(); + for ( ; it != m_mapClients.end(); ++it ) { + CClientCredits* cur_credit = it->second; + + if ( cur_credit->GetUploadedTotal() || cur_credit->GetDownloadedTotal() ) { + const CreditStruct* const cstruct = cur_credit->GetDataStruct(); + file.WriteHash(cstruct->key); + file.WriteUInt32(static_cast(cstruct->uploaded)); + file.WriteUInt32(static_cast(cstruct->downloaded)); + file.WriteUInt32(cstruct->nLastSeen); + file.WriteUInt32(static_cast(cstruct->uploaded >> 32)); + file.WriteUInt32(static_cast(cstruct->downloaded >> 32)); + file.WriteUInt16(cstruct->nReserved3); + file.WriteUInt8(cstruct->nKeySize); + // Doesn't matter if this saves garbage, will be fixed on load. + file.Write(cstruct->abySecureIdent, MAXPUBKEYSIZE); + count++; + } + } + + // Write the actual number of structs + file.Seek( 1 ); + file.WriteUInt32( count ); + } catch (const CIOFailureException& e) { + AddDebugLogLineM(true, logCredits, wxT("IO failure while saving clients.met: ") + e.what()); + } + } else { + AddDebugLogLineM(true, logCredits, wxT("Failed to open existing creditfile!")); + } +} + + +CClientCredits* CClientCreditsList::GetCredit(const CMD4Hash& key) +{ + CClientCredits* result; + + ClientMap::iterator it = m_mapClients.find( key ); + + + if ( it == m_mapClients.end() ){ + result = new CClientCredits(key); + m_mapClients[result->GetKey()] = result; + } else { + result = it->second; + } + + result->SetLastSeen(); + + return result; +} + + +void CClientCreditsList::Process() +{ + if (::GetTickCount() - m_nLastSaved > MIN2MS(13)) + SaveList(); +} + + +bool CClientCreditsList::CreateKeyPair() +{ + try{ + CryptoPP::AutoSeededX917RNG rng; + CryptoPP::InvertibleRSAFunction privkey; + privkey.Initialize(rng, RSAKEYSIZE); + + // Nothing we can do against this filename2char :/ + wxCharBuffer filename = filename2char(theApp->ConfigDir + CRYPTKEY_FILENAME); + CryptoPP::FileSink *fileSink = new CryptoPP::FileSink(filename); + CryptoPP::Base64Encoder *privkeysink = new CryptoPP::Base64Encoder(fileSink); + privkey.DEREncode(*privkeysink); + privkeysink->MessageEnd(); + + // Do not delete these pointers or it will blow in your face. + // cryptopp semantics is giving ownership of these objects. + // + // delete privkeysink; + // delete fileSink; + + AddDebugLogLineM( true, logCredits, wxT("Created new RSA keypair")); + } catch(const CryptoPP::Exception& e) { + AddDebugLogLineM(true, logCredits, + wxString(wxT("Failed to create new RSA keypair: ")) + + char2unicode(e.what())); + wxASSERT(false); + return false; + } + + return true; +} + + +void CClientCreditsList::InitalizeCrypting() +{ + m_nMyPublicKeyLen = 0; + memset(m_abyMyPublicKey,0,80); // not really needed; better for debugging tho + m_pSignkey = NULL; + + if (!thePrefs::IsSecureIdentEnabled()) { + return; + } + + try { + // check if keyfile is there + if (wxFileExists(theApp->ConfigDir + CRYPTKEY_FILENAME)) { + off_t keySize = CPath::GetFileSize(theApp->ConfigDir + CRYPTKEY_FILENAME); + + if (keySize == wxInvalidOffset) { + AddDebugLogLineM(true, logCredits, wxT("Cannot access 'cryptkey.dat', please check permissions.")); + return; + } else if (keySize == 0) { + AddDebugLogLineM(true, logCredits, wxT("'cryptkey.dat' is empty, recreating keypair.")); + CreateKeyPair(); + } + } else { + AddLogLineM( false, _("No 'cryptkey.dat' file found, creating.") ); + CreateKeyPair(); + } + + // load private key + CryptoPP::FileSource *filesource = new CryptoPP::FileSource( + filename2char(theApp->ConfigDir + CRYPTKEY_FILENAME), + true, new CryptoPP::Base64Decoder); + m_pSignkey = new CryptoPP::RSASSA_PKCS1v15_SHA_Signer(*filesource); + // calculate and store public key + CryptoPP::RSASSA_PKCS1v15_SHA_Verifier pubkey( + *static_cast(m_pSignkey)); + CryptoPP::ArraySink *asink = new CryptoPP::ArraySink(m_abyMyPublicKey, 80); + pubkey.DEREncode(*asink); + m_nMyPublicKeyLen = asink->TotalPutLength(); + asink->MessageEnd(); + } catch (const CryptoPP::Exception& e) { + delete static_cast(m_pSignkey); + m_pSignkey = NULL; + + AddDebugLogLineM(true, logCredits, + wxString(wxT("Error while initializing encryption keys: ")) + + char2unicode(e.what())); + } +} + + +uint8 CClientCreditsList::CreateSignature(CClientCredits* pTarget, byte* pachOutput, uint8 nMaxSize, uint32 ChallengeIP, uint8 byChaIPKind, void* sigkey) +{ + CryptoPP::RSASSA_PKCS1v15_SHA_Signer* signer = + static_cast(sigkey); + // signer param is used for debug only + if (signer == NULL) + signer = static_cast(m_pSignkey); + + // create a signature of the public key from pTarget + wxASSERT( pTarget ); + wxASSERT( pachOutput ); + + if ( !CryptoAvailable() ) { + return 0; + } + + try { + CryptoPP::SecByteBlock sbbSignature(signer->SignatureLength()); + CryptoPP::AutoSeededX917RNG rng; + byte abyBuffer[MAXPUBKEYSIZE+9]; + uint32 keylen = pTarget->GetSecIDKeyLen(); + memcpy(abyBuffer,pTarget->GetSecureIdent(),keylen); + // 4 additional bytes random data send from this client + uint32 challenge = pTarget->m_dwCryptRndChallengeFrom; + wxASSERT ( challenge != 0 ); + PokeUInt32(abyBuffer+keylen,challenge); + + uint16 ChIpLen = 0; + if ( byChaIPKind != 0){ + ChIpLen = 5; + PokeUInt32(abyBuffer+keylen+4, ChallengeIP); + PokeUInt8(abyBuffer+keylen+4+4,byChaIPKind); + } + signer->SignMessage(rng, abyBuffer ,keylen+4+ChIpLen , sbbSignature.begin()); + CryptoPP::ArraySink asink(pachOutput, nMaxSize); + asink.Put(sbbSignature.begin(), sbbSignature.size()); + + return asink.TotalPutLength(); + } catch (const CryptoPP::Exception& e) { + AddDebugLogLineM(true, logCredits, wxString(wxT("Error while creating signature: ")) + char2unicode(e.what())); + wxASSERT(false); + + return 0; + } +} + + +bool CClientCreditsList::VerifyIdent(CClientCredits* pTarget, const byte* pachSignature, uint8 nInputSize, uint32 dwForIP, uint8 byChaIPKind) +{ + wxASSERT( pTarget ); + wxASSERT( pachSignature ); + if ( !CryptoAvailable() ){ + pTarget->SetIdentState(IS_NOTAVAILABLE); + return false; + } + bool bResult; + try { + CryptoPP::StringSource ss_Pubkey((byte*)pTarget->GetSecureIdent(),pTarget->GetSecIDKeyLen(),true,0); + CryptoPP::RSASSA_PKCS1v15_SHA_Verifier pubkey(ss_Pubkey); + // 4 additional bytes random data send from this client +5 bytes v2 + byte abyBuffer[MAXPUBKEYSIZE+9]; + memcpy(abyBuffer,m_abyMyPublicKey,m_nMyPublicKeyLen); + uint32 challenge = pTarget->m_dwCryptRndChallengeFor; + wxASSERT ( challenge != 0 ); + PokeUInt32(abyBuffer+m_nMyPublicKeyLen, challenge); + + // v2 security improvments (not supported by 29b, not used as default by 29c) + uint8 nChIpSize = 0; + if (byChaIPKind != 0){ + nChIpSize = 5; + uint32 ChallengeIP = 0; + switch (byChaIPKind){ + case CRYPT_CIP_LOCALCLIENT: + ChallengeIP = dwForIP; + break; + case CRYPT_CIP_REMOTECLIENT: + // Ignore local ip... + if (!theApp->GetPublicIP(true)) { + if (::IsLowID(theApp->GetED2KID())){ + AddDebugLogLineM( false, logCredits, wxT("Warning: Maybe SecureHash Ident fails because LocalIP is unknown")); + // Fallback to local ip... + ChallengeIP = theApp->GetPublicIP(); + } else { + ChallengeIP = theApp->GetED2KID(); + } + } else { + ChallengeIP = theApp->GetPublicIP(); + } + break; + case CRYPT_CIP_NONECLIENT: // maybe not supported in future versions + ChallengeIP = 0; + break; + } + PokeUInt32(abyBuffer+m_nMyPublicKeyLen+4, ChallengeIP); + PokeUInt8(abyBuffer+m_nMyPublicKeyLen+4+4, byChaIPKind); + } + //v2 end + + bResult = pubkey.VerifyMessage(abyBuffer, m_nMyPublicKeyLen+4+nChIpSize, pachSignature, nInputSize); + } catch (const CryptoPP::Exception& e) { + AddDebugLogLineM(true, logCredits, wxString(wxT("Error while verifying identity: ")) + char2unicode(e.what())); + bResult = false; + } + + if (!bResult){ + if (pTarget->GetIdentState() == IS_IDNEEDED) + pTarget->SetIdentState(IS_IDFAILED); + } else { + pTarget->Verified(dwForIP); + } + + return bResult; +} + + +bool CClientCreditsList::CryptoAvailable() const +{ + return m_nMyPublicKeyLen > 0 && m_pSignkey != NULL; +} + + +#ifdef _DEBUG +bool CClientCreditsList::Debug_CheckCrypting(){ + // create random key + CryptoPP::AutoSeededX917RNG rng; + + CryptoPP::RSASSA_PKCS1v15_SHA_Signer priv(rng, 384); + CryptoPP::RSASSA_PKCS1v15_SHA_Verifier pub(priv); + + byte abyPublicKey[80]; + CryptoPP::ArraySink asink(abyPublicKey, 80); + pub.DEREncode(asink); + int8 PublicKeyLen = asink.TotalPutLength(); + asink.MessageEnd(); + uint32 challenge = rand(); + // create fake client which pretends to be this emule + CreditStruct* newcstruct = new CreditStruct(); + CClientCredits newcredits(newcstruct); + newcredits.SetSecureIdent(m_abyMyPublicKey,m_nMyPublicKeyLen); + newcredits.m_dwCryptRndChallengeFrom = challenge; + // create signature with fake priv key + byte pachSignature[200]; + memset(pachSignature,0,200); + uint8 sigsize = CreateSignature(&newcredits,pachSignature,200,0,false, &priv); + + + // next fake client uses the random created public key + CreditStruct* newcstruct2 = new CreditStruct(); + CClientCredits newcredits2(newcstruct2); + newcredits2.m_dwCryptRndChallengeFor = challenge; + + // if you uncomment one of the following lines the check has to fail + //abyPublicKey[5] = 34; + //m_abyMyPublicKey[5] = 22; + //pachSignature[5] = 232; + + newcredits2.SetSecureIdent(abyPublicKey,PublicKeyLen); + + //now verify this signature - if it's true everything is fine + return VerifyIdent(&newcredits2,pachSignature,sigsize,0,0); +} +#endif +// File_checked_for_headers diff --git a/src/ClientCreditsList.h b/src/ClientCreditsList.h new file mode 100644 index 00000000..53a68fcb --- /dev/null +++ b/src/ClientCreditsList.h @@ -0,0 +1,69 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef CLIENTCREDITSLIST_H +#define CLIENTCREDITSLIST_H + +#include "MD4Hash.h" // Needed for CMD4Hash + +#include + +class CClientCredits; + +class CClientCreditsList +{ +public: + CClientCreditsList(); + ~CClientCreditsList(); + + // return signature size, 0 = Failed | use sigkey param for debug only + uint8 CreateSignature(CClientCredits* pTarget, byte* pachOutput, uint8 nMaxSize, uint32 ChallengeIP, uint8 byChaIPKind, void* sigkey = NULL); + bool VerifyIdent(CClientCredits* pTarget, const byte* pachSignature, uint8 nInputSize, uint32 dwForIP, uint8 byChaIPKind); + + CClientCredits* GetCredit(const CMD4Hash& key); + void Process(); + uint8 GetPubKeyLen() const {return m_nMyPublicKeyLen;} + const byte* GetPublicKey() const {return m_abyMyPublicKey;} + bool CryptoAvailable() const; + void SaveList(); +protected: + void LoadList(); + void InitalizeCrypting(); + bool CreateKeyPair(); +#ifdef _DEBUG + bool Debug_CheckCrypting(); +#endif +private: + typedef std::map ClientMap; + ClientMap m_mapClients; + uint32 m_nLastSaved; + // A void* to avoid having to include the large CryptoPP.h file + void* m_pSignkey; + byte m_abyMyPublicKey[80]; + uint8 m_nMyPublicKeyLen; +}; + +#endif // CLIENTCREDITSLIST_H +// File_checked_for_headers diff --git a/src/ClientDetailDialog.cpp b/src/ClientDetailDialog.cpp new file mode 100644 index 00000000..55b7b600 --- /dev/null +++ b/src/ClientDetailDialog.cpp @@ -0,0 +1,201 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "ClientDetailDialog.h" // Interface declarations +#include "PartFile.h" // Needed for CPartFile +#include "UploadQueue.h" // Needed for CUploadQueue +#include "ServerList.h" // Needed for CServerList +#include "amule.h" // Needed for theApp +#include "Server.h" // Needed for CServer +#include "updownclient.h" // Needed for CUpDownClient +#include "muuli_wdr.h" // Needed for ID_CLOSEWND + +// CClientDetailDialog dialog + +BEGIN_EVENT_TABLE(CClientDetailDialog,wxDialog) + EVT_BUTTON(ID_CLOSEWND,CClientDetailDialog::OnBnClose) +END_EVENT_TABLE() + + +CClientDetailDialog::CClientDetailDialog( + wxWindow *parent, + CUpDownClient *client) +: +wxDialog( + parent, + 9997, + _("Client Details"), + wxDefaultPosition, + wxDefaultSize, + wxDEFAULT_DIALOG_STYLE) +{ + m_client = client; + wxSizer* content = clientDetails(this, true); + OnInitDialog(); + content->SetSizeHints(this); + content->Show(this, true); +} + +CClientDetailDialog::~CClientDetailDialog() +{ +} + +void CClientDetailDialog::OnBnClose(wxCommandEvent& WXUNUSED(evt)) +{ + EndModal(0); +} + +bool CClientDetailDialog::OnInitDialog() { + // Username, Userhash and Rating + if (!m_client->GetUserName().IsEmpty()) { + CastChild(ID_DNAME, wxStaticText)->SetLabel( + m_client->GetUserName()); + // if we have client name we have userhash + wxASSERT(!m_client->GetUserHash().IsEmpty()); + CastChild(ID_DHASH, wxStaticText)->SetLabel( + m_client->GetUserHash().Encode()); + CastChild(ID_DRATING, wxStaticText)->SetLabel( + wxString::Format(wxT("%.1f"), m_client->GetRating())); + } else { + CastChild(ID_DNAME, wxStaticText)->SetLabel(_("Unknown")); + CastChild(ID_DHASH, wxStaticText)->SetLabel(_("Unknown")); + CastChild(ID_DRATING, wxStaticText)->SetLabel(_("Unknown"));; + } + + // Client Software + wxString OSInfo = m_client->GetClientOSInfo(); + if (!OSInfo.IsEmpty()) { + CastChild(ID_DSOFT, wxStaticText)->SetLabel( + m_client->GetSoftStr()+wxT(" (")+OSInfo+wxT(")")); + } else { + CastChild(ID_DSOFT, wxStaticText)->SetLabel( + m_client->GetSoftStr()); + } + + // Client Version + CastChild(ID_DVERSION, wxStaticText)->SetLabel( + m_client->GetSoftVerStr()); + + // User ID + CastChild(ID_DID, wxStaticText)->SetLabel( + CFormat(wxT("%u (%s)")) % ENDIAN_NTOHL(m_client->GetIP()) % (m_client->HasLowID() ? _("LowID") : _("HighID"))); + + // Client IP/Port + CastChild(ID_DIP, wxStaticText)->SetLabel( + m_client->GetFullIP() + + wxString::Format(wxT(":%i"), m_client->GetUserPort())); + + // Server IP/Port/Name + if (m_client->GetServerIP()) { + wxString srvaddr = Uint32toStringIP(m_client->GetServerIP()); + CastChild(ID_DSIP, wxStaticText)->SetLabel( + srvaddr + + wxString::Format(wxT(":%i"),m_client->GetServerPort())); + CastChild(ID_DSNAME, wxStaticText)->SetLabel( + m_client->GetServerName()); + } else { + CastChild(ID_DSIP, wxStaticText)->SetLabel(_("Unknown")); + CastChild(ID_DSNAME, wxStaticText)->SetLabel(_("Unknown")); + } + + // File Name + const CKnownFile* file = m_client->GetUploadFile(); + if (file) { + wxString filename = MakeStringEscaped( + TruncateFilename(file->GetFileName(), 60)); + CastChild(ID_DDOWNLOADING, wxStaticText)->SetLabel(filename); + } else { + CastChild(ID_DDOWNLOADING, wxStaticText)->SetLabel(wxT("-")); + } + + // Upload + CastChild(ID_DDUP, wxStaticText)->SetLabel( + CastItoXBytes(m_client->GetTransferredDown())); + + // Download + CastChild(ID_DDOWN, wxStaticText)->SetLabel( + CastItoXBytes(m_client->GetTransferredUp())); + + // Average Upload Rate + CastChild(ID_DAVUR, wxStaticText)->SetLabel( + wxString::Format(_("%.1f kB/s"), + m_client->GetKBpsDown())); + + // Average Download Rate + CastChild(ID_DAVDR, wxStaticText)->SetLabel( + wxString::Format(_("%.1f kB/s"), + m_client->GetUploadDatarate() / 1024.0f)); + + // Total Upload + CastChild(ID_DUPTOTAL, wxStaticText)->SetLabel( + CastItoXBytes(m_client->GetDownloadedTotal())); + + // Total Download + CastChild(ID_DDOWNTOTAL, wxStaticText)->SetLabel( + CastItoXBytes(m_client->GetUploadedTotal())); + + // DL/UP Modifier + CastChild(ID_DRATIO, wxStaticText)->SetLabel( + wxString::Format(wxT("%.1f"), + (float)m_client->GetScoreRatio())); + + // Secure Ident + if (theApp->CryptoAvailable()) { + if (m_client->SUINotSupported()) { + CastChild(IDC_CDIDENT, wxStaticText)->SetLabel( + _("Not Supported")); + } else if (m_client->SUIFailed()) { + CastChild(IDC_CDIDENT, wxStaticText)->SetLabel( + _("Failed")); + } else if (m_client->SUINeeded()) { + CastChild(IDC_CDIDENT, wxStaticText)->SetLabel( + _("Not complete")); + } else if (m_client->IsBadGuy()) { + CastChild(IDC_CDIDENT, wxStaticText)->SetLabel( + _("Bad Guy")); + } else if (m_client->IsIdentified()) { + CastChild(IDC_CDIDENT, wxStaticText)->SetLabel( + _("Verified - OK")); + } + } else { + CastChild(IDC_CDIDENT, wxStaticText)->SetLabel( + _("Not Available")); + } + + // Queue Score + if (m_client->GetUploadState() != US_NONE) { + CastChild(ID_DSCORE, wxStaticText)->SetLabel( + wxString::Format(_("%u (QR: %u)"), + m_client->GetScore( + false, m_client->IsDownloading(), false), + theApp->uploadqueue->GetWaitingPosition(m_client))); + } else { + CastChild(ID_DSCORE, wxStaticText)->SetLabel(wxT("-")); + } + Layout(); + + return true; +} +// File_checked_for_headers diff --git a/src/ClientDetailDialog.h b/src/ClientDetailDialog.h new file mode 100644 index 00000000..caa7fa68 --- /dev/null +++ b/src/ClientDetailDialog.h @@ -0,0 +1,85 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef CLIENTDETAILDIALOG_H +#define CLIENTDETAILDIALOG_H + +#include // Needed for wxDialog + +class CUpDownClient; + +/** + * The ClientDetailDialog class is responsible for showing the info about a client. + * + * It shows all releavant data about the client: ip, port, hash, name, client + * type and version, uploading/downloading data, credits, server... etc + * + * It's wxDialog, modal, with return value always '0'. + * + */ + +class CClientDetailDialog : public wxDialog +{ +public: + /** + * Constructor. + * + * @param parent The window that created the dialog. + * @param client The client whose details we're showing. + */ + CClientDetailDialog(wxWindow*parent,CUpDownClient* client); + + /** + * Destructor. + * + * Does nothing currently. + */ + virtual ~CClientDetailDialog(); + +protected: + + /** + * Creates all the data objects in the dialog, filling them accordingly. + * + * Called when the dialog object is created. + */ + virtual bool OnInitDialog(); + + /** + * Ends the dialog, calling EndModal with return value 0 + * + * @param evt The close event, unused right now + */ + void OnBnClose(wxCommandEvent& evt); + + DECLARE_EVENT_TABLE() + +private: + + //! The CUpDownClient whose data is drawn + CUpDownClient* m_client; +}; +#endif // CLIENTDETAILDIALOG_H +// File_checked_for_headers diff --git a/src/ClientList.cpp b/src/ClientList.cpp new file mode 100644 index 00000000..54cfc88f --- /dev/null +++ b/src/ClientList.cpp @@ -0,0 +1,1009 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "ClientList.h" // Interface declarations. + +#include +#include +#include + +#include "amule.h" // Needed for theApp +#include "ClientTCPSocket.h" // Needed for CClientTCPSocket +#include "DownloadQueue.h" // Needed for CDownloadQueue +#include "UploadQueue.h" // Needed for CUploadQueue +#include "IPFilter.h" // Needed for CIPFIlter +#include "updownclient.h" // Needed for CUpDownClient +#include "Preferences.h" // Needed for thePrefs +#include "Statistics.h" // Needed for theStats +#include "Logger.h" +#include "GuiEvents.h" // Needed for Notify_* + +#include + + +#include "kademlia/routing/Contact.h" + +#include "kademlia/kademlia/Search.h" +#include "kademlia/net/KademliaUDPListener.h" + +/** + * CDeletedClient Class + * + * This class / list is a bit overkill, but currently needed to avoid any + * exploit possibility. It will keep track of certain clients attributes + * for 2 hours, while the CUpDownClient object might be deleted already. + * Currently saves: IP, Port, UserHash. + */ +class CDeletedClient +{ +public: + CDeletedClient(CUpDownClient* pClient) + { + m_dwInserted = ::GetTickCount(); + PortAndHash porthash = { pClient->GetUserPort(), pClient->GetCreditsHash()}; + m_ItemsList.push_back(porthash); + } + + struct PortAndHash + { + uint16 nPort; + void* pHash; + }; + + typedef std::list PaHList; + PaHList m_ItemsList; + uint32 m_dwInserted; +}; + + + +CClientList::CClientList() + : m_deadSources( true ) +{ + m_dwLastBannCleanUp = 0; + m_dwLastTrackedCleanUp = 0; + m_dwLastClientCleanUp = 0; + m_pBuddy = NULL; + m_nBuddyStatus = Disconnected; +#ifdef __WXDEBUG__ + m_delete_queue_closed = false; +#endif +} + + +CClientList::~CClientList() +{ + std::map::iterator it = m_trackedClientsList.begin(); + for ( ; it != m_trackedClientsList.end(); ++it ){ + delete it->second; + } + + m_trackedClientsList.clear(); + + wxASSERT(m_clientList.empty()); + wxASSERT(m_delete_queue.empty()); +} + + +void CClientList::AddClient( CUpDownClient* toadd ) +{ + // Ensure that only new clients can be added to the list + if ( toadd->GetClientState() == CS_NEW ) { + // Update the client-state + toadd->m_clientState = CS_LISTED; + + Notify_ClientCtrlAddClient( toadd ); + + // We always add the ID/ptr pair, regardles of the actual ID value + m_clientList.insert( IDMapPair( toadd->GetUserIDHybrid(), toadd ) ); + + // We only add the IP if it is valid + if ( toadd->GetIP() ) { + m_ipList.insert( IDMapPair( toadd->GetIP(), toadd ) ); + } + + // We only add the hash if it is valid + if ( toadd->HasValidHash() ) { + m_hashList.insert( HashMapPair( toadd->GetUserHash(), toadd ) ); + } + + toadd->UpdateStats(); + } +} + + +void CClientList::AddToDeleteQueue(CUpDownClient* client) +{ + RemoveFromKadList( client ); + + // We have to remove the client from the list immediatly, to avoit it getting + // found by functions such as AttachToAlreadyKnown and GetClientsFromIP, + // however, if the client isn't on the clientlist, then it is safe to delete + // it right now. Otherwise, push it onto the queue. + if ( RemoveIDFromList( client ) ) { + // Also remove the ip and hash entries + RemoveIPFromList( client ); + RemoveHashFromList( client ); + + wxASSERT(!m_delete_queue_closed); + m_delete_queue.push_back( client ); + } else { + delete client; + } +} + + +void CClientList::UpdateClientID( CUpDownClient* client, uint32 newID ) +{ + // Sanity check + if ( ( client->GetClientState() != CS_LISTED ) || ( client->GetUserIDHybrid() == newID ) ) + return; + + // First remove the ID entry + RemoveIDFromList( client ); + + // Add the new entry + m_clientList.insert( IDMapPair( newID, client ) ); +} + + +void CClientList::UpdateClientIP( CUpDownClient* client, uint32 newIP ) +{ + // Sanity check + if ( ( client->GetClientState() != CS_LISTED ) || ( client->GetIP() == newIP ) ) + return; + + // Remove the old IP entry + RemoveIPFromList( client ); + + if ( newIP ) { + m_ipList.insert( IDMapPair( newIP, client ) ); + } +} + + +void CClientList::UpdateClientHash( CUpDownClient* client, const CMD4Hash& newHash ) +{ + // Sanity check + if ( ( client->GetClientState() != CS_LISTED ) || ( client->GetUserHash() == newHash ) ) + return; + + + // Remove the old entry + RemoveHashFromList( client ); + + // And add the new one if valid + if ( !newHash.IsEmpty() ) { + m_hashList.insert( HashMapPair( newHash, client ) ); + } +} + + +bool CClientList::RemoveIDFromList( CUpDownClient* client ) +{ + bool result = false; + + // First remove the ID entry + std::pair range = m_clientList.equal_range( client->GetUserIDHybrid() ); + + for ( ; range.first != range.second; ++range.first ) { + if ( client == range.first->second ) { + /* erase() will invalidate the iterator, but we're not using it anymore + anyway (notice the break;) */ + m_clientList.erase( range.first ); + result = true; + + break; + } + } + + return result; +} + + +void CClientList::RemoveIPFromList( CUpDownClient* client ) +{ + // Check if we need to look for the IP entry + if ( !client->GetIP() ) { + return; + } + + // Remove the IP entry + std::pair range = m_ipList.equal_range( client->GetIP() ); + + for ( ; range.first != range.second; ++range.first ) { + if ( client == range.first->second ) { + /* erase() will invalidate the iterator, but we're not using it anymore + anyway (notice the break;) */ + m_ipList.erase( range.first ); + break; + } + } +} + +void CClientList::RemoveHashFromList( CUpDownClient* client ) +{ + // Nothing to remove + if ( !client->HasValidHash() ) { + return; + } + + // Find all items with the specified hash + std::pair range = m_hashList.equal_range( client->GetUserHash() ); + + for ( ; range.first != range.second; ++range.first ) { + if ( client == range.first->second ) { + /* erase() will invalidate the iterator, but we're not using it anymore + anyway (notice the break;) */ + m_hashList.erase( range.first ); + break; + } + } +} + + +CUpDownClient* CClientList::FindMatchingClient( CUpDownClient* client ) +{ + typedef std::pair IDMapIteratorPair; + wxCHECK(client, NULL); + + const uint32 userIP = client->GetIP(); + const uint32 userID = client->GetUserIDHybrid(); + const uint16 userPort = client->GetUserPort(); + const uint16 userKadPort = client->GetKadPort(); + + + // LowID clients need a different set of checks + if (client->HasLowID()) { + // User is firewalled ... Must do two checks. + if (userIP && (userPort || userKadPort)) { + IDMapIteratorPair range = m_ipList.equal_range(userIP); + + for ( ; range.first != range.second; ++range.first ) { + CUpDownClient* other = range.first->second; + wxASSERT(userIP == other->GetIP()); + + if (userPort && (userPort == other->GetUserPort())) { + return other; + } else if (userKadPort && (userKadPort == other->GetKadPort())) { + return other; + } + } + } + + const uint32 serverIP = client->GetServerIP(); + const uint32 serverPort = client->GetServerPort(); + if (userID && serverIP && serverPort) { + IDMapIteratorPair range = m_clientList.equal_range(userID); + + for (; range.first != range.second; ++range.first) { + CUpDownClient* other = range.first->second; + wxASSERT(userID == other->GetUserIDHybrid()); + + // For lowid, we also have to check the server + if (serverIP == other->GetServerIP()) { + if (serverPort == other->GetServerPort()) { + return other; + } + } + } + } + } else if (userPort || userKadPort) { + // Check by IP first, then by ID + struct { const IDMap& map; uint32 value; } toCheck[] = { + { m_ipList, userIP }, { m_clientList, userID } + }; + + for (size_t i = 0; i < itemsof(toCheck); ++i) { + if (toCheck[i].value == 0) { + // We may not have both (or any) of these values. + continue; + } + + IDMapIteratorPair range = toCheck[i].map.equal_range(toCheck[i].value); + + if (userPort) { + IDMap::const_iterator it = range.first; + for (; it != range.second; ++it) { + if (userPort == it->second->GetUserPort()) { + return it->second; + } + } + } + + if (userKadPort) { + IDMap::const_iterator it = range.first; + for (; it != range.second; ++it) { + if (userKadPort == it->second->GetKadPort()) { + return it->second; + } + } + } + } + } + + + // If anything else fails, then we look at hashes + if ( client->HasValidHash() ) { + // Find all items with the specified hash + std::pair range = m_hashList.equal_range( client->GetUserHash() ); + + // Just return the first item if any + if ( range.first != range.second ) { + return range.first->second; + } + } + + // Nothing found, must be a new client + return NULL; +} + + +uint32 CClientList::GetClientCount() const +{ + return m_clientList.size(); +} + + +void CClientList::DeleteAll() +{ + m_ipList.clear(); + m_hashList.clear(); + + while ( !m_clientList.empty() ) { + IDMap::iterator it = m_clientList.begin(); + + // Will call the removal of the item on this same class + it->second->Disconnected(wxT("Removed while deleting all from ClientList.")); + it->second->Safe_Delete(); + } + + // Clean up the clients now queued for deletion +#ifdef __WXDEBUG__ + m_delete_queue_closed = true; +#endif + ProcessDeleteQueue(); +} + + +bool CClientList::AttachToAlreadyKnown(CUpDownClient** client, CClientTCPSocket* sender) +{ + CUpDownClient* tocheck = (*client); + + CUpDownClient* found_client = FindMatchingClient( tocheck ); + + if ( tocheck == found_client ) { + // We found the same client instance (client may have sent more than one OP_HELLO). do not delete that client! + return true; + } + + if (found_client != NULL){ + if (sender) { + if (found_client->GetSocket()) { + if (found_client->IsConnected() + && (found_client->GetIP() != tocheck->GetIP() || found_client->GetUserPort() != tocheck->GetUserPort() ) ) + { + // if found_client is connected and has the IS_IDENTIFIED, it's safe to say that the other one is a bad guy + if (found_client->IsIdentified()){ + AddDebugLogLineM( false, logClient, wxT("Client: ") + tocheck->GetUserName() + wxT("(") + tocheck->GetFullIP() + wxT("), Banreason: Userhash invalid")); + tocheck->Ban(); + return false; + } + + AddDebugLogLineM( false, logClient, wxT("WARNING! Found matching client, to a currently connected client: ") + + tocheck->GetUserName() + wxT("(") + tocheck->GetFullIP() + + wxT(") and ") + found_client->GetUserName() + wxT("(") + found_client->GetFullIP() + wxT(")")); + return false; + } + found_client->GetSocket()->Safe_Delete(); + } + found_client->SetSocket( sender ); + tocheck->SetSocket( NULL ); + } + *client = 0; + tocheck->Safe_Delete(); + *client = found_client; + return true; + } + + return false; +} + + +CUpDownClient* CClientList::FindClientByIP( uint32 clientip, uint16 port ) +{ + // Find all items with the specified ip + std::pair range = m_ipList.equal_range( clientip ); + + for ( ; range.first != range.second; ++range.first ) { + CUpDownClient* cur_client = range.first->second; + // Check if it's actually the client we want + if ( cur_client->GetUserPort() == port ) { + return cur_client; + } + } + + return NULL; +} + + +bool CClientList::ComparePriorUserhash(uint32 dwIP, uint16 nPort, void* pNewHash) +{ + std::map::iterator it = m_trackedClientsList.find( dwIP ); + + if ( it != m_trackedClientsList.end() ) { + CDeletedClient* pResult = it->second; + + CDeletedClient::PaHList::iterator it2 = pResult->m_ItemsList.begin(); + for ( ; it2 != pResult->m_ItemsList.end(); ++it2 ) { + if ( it2->nPort == nPort ) { + if ( it2->pHash != pNewHash) { + return false; + } else { + break; + } + } + } + } + return true; +} + + +void CClientList::AddTrackClient(CUpDownClient* toadd) +{ + std::map::iterator it = m_trackedClientsList.find( toadd->GetIP() ); + + if ( it != m_trackedClientsList.end() ) { + CDeletedClient* pResult = it->second; + + pResult->m_dwInserted = ::GetTickCount(); + + CDeletedClient::PaHList::iterator it2 = pResult->m_ItemsList.begin(); + for ( ; it2 != pResult->m_ItemsList.end(); ++it2 ) { + if ( it2->nPort == toadd->GetUserPort() ) { + // already tracked, update + it2->pHash = toadd->GetCreditsHash(); + return; + } + } + + // New client for that IP, add an entry + CDeletedClient::PortAndHash porthash = { toadd->GetUserPort(), toadd->GetCreditsHash()}; + pResult->m_ItemsList.push_back(porthash); + } else { + m_trackedClientsList[ toadd->GetIP() ] = new CDeletedClient(toadd); + } +} + + +uint16 CClientList::GetClientsFromIP(uint32 dwIP) +{ + std::map::iterator it = m_trackedClientsList.find( dwIP ); + + if ( it != m_trackedClientsList.end() ) { + return it->second->m_ItemsList.size(); + } else { + return 0; + } +} + + +void CClientList::ProcessDeleteQueue() +{ + // Delete pending clients + while ( !m_delete_queue.empty() ) { + CUpDownClient* toremove = m_delete_queue.front(); + m_delete_queue.pop_front(); + + // Doing what RemoveClient used to do. Just to be sure... + theApp->uploadqueue->RemoveFromUploadQueue( toremove ); + theApp->uploadqueue->RemoveFromWaitingQueue( toremove ); + theApp->downloadqueue->RemoveSource( toremove ); + + Notify_ClientCtrlRemoveClient( toremove ); + + delete toremove; + } +} + + +void CClientList::Process() +{ + const uint32 cur_tick = ::GetTickCount(); + + ProcessDeleteQueue(); + + if (m_dwLastBannCleanUp + BAN_CLEANUP_TIME < cur_tick) { + m_dwLastBannCleanUp = cur_tick; + + ClientMap::iterator it = m_bannedList.begin(); + while ( it != m_bannedList.end() ) { + if ( it->second + CLIENTBANTIME < cur_tick ) { + ClientMap::iterator tmp = it++; + + m_bannedList.erase( tmp ); + theStats::RemoveBannedClient(); + } else { + ++it; + } + } + } + + + if ( m_dwLastTrackedCleanUp + TRACKED_CLEANUP_TIME < cur_tick ) { + m_dwLastTrackedCleanUp = cur_tick; + + std::map::iterator it = m_trackedClientsList.begin(); + while ( it != m_trackedClientsList.end() ) { + std::map::iterator cur_src = it++; + + if ( cur_src->second->m_dwInserted + KEEPTRACK_TIME < cur_tick ) { + delete cur_src->second; + m_trackedClientsList.erase( cur_src ); + } + } + } + + //We need to try to connect to the clients in m_KadList + //If connected, remove them from the list and send a message back to Kad so we can send a ACK. + //If we don't connect, we need to remove the client.. + //The sockets timeout should delete this object. + + // buddy is just a flag that is used to make sure we are still connected or connecting to a buddy. + buddyState buddy = Disconnected; + + std::set::iterator current_it = m_KadSources.begin(); + while (current_it != m_KadSources.end()) { + CUpDownClient* cur_client = *current_it; + ++current_it; // Won't be used anymore till while loop + if( !Kademlia::CKademlia::IsRunning() ) { + //Clear out this list if we stop running Kad. + //Setting the Kad state to KS_NONE causes it to be removed in the switch below. + cur_client->SetKadState(KS_NONE); + } + switch (cur_client->GetKadState()) { + case KS_QUEUED_FWCHECK: + //Another client asked us to try to connect to them to check their firewalled status. + cur_client->TryToConnect(true); + break; + + case KS_CONNECTING_FWCHECK: + //Ignore this state as we are just waiting for results. + break; + + case KS_CONNECTED_FWCHECK: + //We successfully connected to the client. + //We now send a ack to let them know. + Kademlia::CKademlia::GetUDPListener()->SendNullPacket(KADEMLIA_FIREWALLED_ACK, wxUINT32_SWAP_ALWAYS(cur_client->GetIP()), cur_client->GetKadPort()); + //We are done with this client. Set Kad status to KS_NONE and it will be removed in the next cycle. + cur_client->SetKadState(KS_NONE); + break; + + case KS_INCOMING_BUDDY: + //A firewalled client wants us to be his buddy. + //If we already have a buddy, we set Kad state to KS_NONE and it's removed in the next cycle. + //If not, this client will change to KS_CONNECTED_BUDDY when it connects. + if( m_nBuddyStatus == Connected ) { + cur_client->SetKadState(KS_NONE); + } + break; + + case KS_QUEUED_BUDDY: + //We are firewalled and want to request this client to be a buddy. + //But first we check to make sure we are not already trying another client. + //If we are not already trying. We try to connect to this client. + //If we are already connected to a buddy, we set this client to KS_NONE and it's removed next cycle. + //If we are trying to connect to a buddy, we just ignore as the one we are trying may fail and we can then try this one. + if( m_nBuddyStatus == Disconnected ) { + buddy = Connecting; + m_nBuddyStatus = Connecting; + cur_client->SetKadState(KS_CONNECTING_BUDDY); + cur_client->TryToConnect(true); + Notify_ServerUpdateED2KInfo(); + } else { + if( m_nBuddyStatus == Connected ) { + cur_client->SetKadState(KS_NONE); + } + } + break; + + case KS_CONNECTING_BUDDY: + //We are trying to connect to this client. + //Although it should NOT happen, we make sure we are not already connected to a buddy. + //If we are we set to KS_NONE and it's removed next cycle. + //But if we are not already connected, make sure we set the flag to connecting so we know + //things are working correctly. + if( m_nBuddyStatus == Connected ) { + cur_client->SetKadState(KS_NONE); + } else { + wxASSERT( m_nBuddyStatus == Connecting ); + buddy = Connecting; + } + break; + + case KS_CONNECTED_BUDDY: + //A potential connected buddy client wanting to me in the Kad network + //We set our flag to connected to make sure things are still working correctly. + buddy = Connected; + + //If m_nBuddyStatus is not connected already, we set this client as our buddy! + if( m_nBuddyStatus != Connected ) { + m_pBuddy = cur_client; + m_nBuddyStatus = Connected; + Notify_ServerUpdateED2KInfo(); + } + if( m_pBuddy == cur_client && theApp->IsFirewalled() && cur_client->SendBuddyPingPong() ) { + cur_client->SendBuddyPing(); + } + break; + + default: + RemoveFromKadList(cur_client); + } + } + + //We either never had a buddy, or lost our buddy.. + if( buddy == Disconnected ) { + if( m_nBuddyStatus != Disconnected || m_pBuddy ) { + if( Kademlia::CKademlia::IsRunning() && theApp->IsFirewalled() ) { + //We are a lowID client and we just lost our buddy. + //Go ahead and instantly try to find a new buddy. + Kademlia::CKademlia::GetPrefs()->SetFindBuddy(); + } + m_pBuddy = NULL; + m_nBuddyStatus = Disconnected; + Notify_ServerUpdateED2KInfo(); + } + } + + if ( Kademlia::CKademlia::IsConnected() ) { + if( Kademlia::CKademlia::IsFirewalled() ) { + if( m_nBuddyStatus == Disconnected && Kademlia::CKademlia::GetPrefs()->GetFindBuddy() ) { + //We are a firewalled client with no buddy. We have also waited a set time + //to try to avoid a false firewalled status.. So lets look for a buddy.. + Kademlia::CSearch *findBuddy = new Kademlia::CSearch; + findBuddy->SetSearchTypes(Kademlia::CSearch::FINDBUDDY); + Kademlia::CUInt128 ID(true); + ID.XOR(Kademlia::CKademlia::GetPrefs()->GetKadID()); + findBuddy->SetTargetID(ID); + if( !Kademlia::CSearchManager::StartSearch(findBuddy) ) { + //This search ID was already going. Most likely reason is that + //we found and lost our buddy very quickly and the last search hadn't + //had time to be removed yet. Go ahead and set this to happen again + //next time around. + Kademlia::CKademlia::GetPrefs()->SetFindBuddy(); + } + } + } else { + if( m_pBuddy ) { + //Lets make sure that if we have a buddy, they are firewalled! + //If they are also not firewalled, then someone must have fixed their firewall or stopped saturating their line.. + //We just set the state of this buddy to KS_NONE and things will be cleared up with the next cycle. + if( !m_pBuddy->HasLowID() ) { + m_pBuddy->SetKadState(KS_NONE); + } + } + } + } else { + if( m_pBuddy ) { + //We are not connected anymore. Just set this buddy to KS_NONE and things will be cleared out on next cycle. + m_pBuddy->SetKadState(KS_NONE); + } + } + + CleanUpClientList(); +} + + +void CClientList::AddBannedClient(uint32 dwIP) +{ + m_bannedList[dwIP] = ::GetTickCount(); + theStats::AddBannedClient(); +} + + +bool CClientList::IsBannedClient(uint32 dwIP) +{ + ClientMap::iterator it = m_bannedList.find( dwIP ); + + if ( it != m_bannedList.end() ) { + if ( it->second + CLIENTBANTIME > ::GetTickCount() ) { + return true; + } else { + RemoveBannedClient(dwIP); + } + } + return false; +} + + +void CClientList::RemoveBannedClient(uint32 dwIP) +{ + m_bannedList.erase(dwIP); + theStats::RemoveBannedClient(); +} + + +void CClientList::FilterQueues() +{ + // Filter client list + for ( IDMap::iterator it = m_ipList.begin(); it != m_ipList.end(); ) { + IDMap::iterator tmp = it++; // Don't change this to a ++it! + + if ( theApp->ipfilter->IsFiltered(tmp->second->GetConnectIP())) { + tmp->second->Disconnected(wxT("Filtered by IPFilter")); + tmp->second->Safe_Delete(); + } + } +} + + +CClientList::SourceList CClientList::GetClientsByHash( const CMD4Hash& hash ) +{ + SourceList results; + + // Find all items with the specified hash + std::pair range = m_hashList.equal_range( hash ); + + for ( ; range.first != range.second; ++range.first) { + results.push_back( range.first->second ); + } + + return results; +} + + +CClientList::SourceList CClientList::GetClientsByIP( unsigned long ip ) +{ + SourceList results; + + // Find all items with the specified hash + std::pair range = m_ipList.equal_range( ip ); + + for ( ; range.first != range.second; range.first++ ) { + results.push_back( range.first->second ); + } + + return results; +} + + +const CClientList::IDMap& CClientList::GetClientList() +{ + return m_clientList; +} + + +void CClientList::AddDeadSource(const CUpDownClient* client) +{ + m_deadSources.AddDeadSource( client ); +} + + +bool CClientList::IsDeadSource(const CUpDownClient* client) +{ + return m_deadSources.IsDeadSource( client ); +} + +bool CClientList::SendMessage(uint64 client_id, const wxString& message) +{ + CUpDownClient* client = FindClientByIP(IP_FROM_GUI_ID(client_id), PORT_FROM_GUI_ID(client_id)); + AddDebugLogLineM( false, logClient, wxT("Trying to Send Message.") ); + if (client) { + AddDebugLogLineM( false, logClient, wxT("Sending.") ); + } else { + AddDebugLogLineM( true, logClient, + CFormat( wxT("No client (GUI_ID %lli [%s:%llu]) found in CClientList::SendMessage(). Creating") ) + % client_id + % Uint32toStringIP(IP_FROM_GUI_ID(client_id)) + % PORT_FROM_GUI_ID(client_id) ); + client = new CUpDownClient(PORT_FROM_GUI_ID(client_id),IP_FROM_GUI_ID(client_id),0,0,NULL, true, true); + AddClient(client); + } + return client->SendMessage(message); +} + +void CClientList::SetChatState(uint64 client_id, uint8 state) { + CUpDownClient* client = FindClientByIP(IP_FROM_GUI_ID(client_id), PORT_FROM_GUI_ID(client_id)); + if (client) { + client->SetChatState(state); + } +} + +/* Kad stuff */ + +void CClientList::RequestTCP(Kademlia::CContact* contact) +{ + uint32 nContactIP = wxUINT32_SWAP_ALWAYS(contact->GetIPAddress()); + // don't connect ourself + if (theApp->GetPublicIP() == nContactIP && thePrefs::GetPort() == contact->GetTCPPort()) { + return; + } + + CUpDownClient* pNewClient = FindClientByIP(nContactIP, contact->GetTCPPort()); + + if (!pNewClient) { + //#warning Do we actually have to check friendstate here? + pNewClient = new CUpDownClient(contact->GetTCPPort(), contact->GetIPAddress(), 0, 0, NULL, false, true); + } + + //Add client to the lists to be processed. + pNewClient->SetKadPort(contact->GetUDPPort()); + pNewClient->SetKadState(KS_QUEUED_FWCHECK); + AddToKadList(pNewClient); // This was a direct adding, but I like to check duplicates + //This method checks if this is a dup already. + AddClient(pNewClient); +} + +void CClientList::RequestBuddy(Kademlia::CContact* contact) +{ + + uint32 nContactIP = wxUINT32_SWAP_ALWAYS(contact->GetIPAddress()); + // Don't connect to ourself + if (theApp->GetPublicIP() == nContactIP && thePrefs::GetPort() == contact->GetTCPPort()) { + return; + } + + CUpDownClient* pNewClient = FindClientByIP(nContactIP, contact->GetTCPPort()); + if (!pNewClient) { + pNewClient = new CUpDownClient(contact->GetTCPPort(), contact->GetIPAddress(), 0, 0, NULL, false, true ); + } + + //Add client to the lists to be processed. + pNewClient->SetKadPort(contact->GetUDPPort()); + pNewClient->SetKadState(KS_QUEUED_BUDDY); + byte ID[16]; + contact->GetClientID().ToByteArray(ID); + pNewClient->SetUserHash(CMD4Hash(ID)); + AddToKadList(pNewClient); + //This method checks if this is a dup already. + AddClient(pNewClient); + +} + +void CClientList::IncomingBuddy(Kademlia::CContact* contact, Kademlia::CUInt128* buddyID ) +{ + + uint32 nContactIP = wxUINT32_SWAP_ALWAYS(contact->GetIPAddress()); + //If aMule already knows this client, abort this.. It could cause conflicts. + //Although the odds of this happening is very small, it could still happen. + if (FindClientByIP(nContactIP, contact->GetTCPPort())) { + return; + } + + // Don't connect ourself + if (theApp->GetPublicIP() == nContactIP && thePrefs::GetPort() == contact->GetTCPPort()) { + return; + } + + //Add client to the lists to be processed. + CUpDownClient* pNewClient = new CUpDownClient(contact->GetTCPPort(), contact->GetIPAddress(), 0, 0, NULL, false, true ); + pNewClient->SetKadPort(contact->GetUDPPort()); + pNewClient->SetKadState(KS_INCOMING_BUDDY); + byte ID[16]; + contact->GetClientID().ToByteArray(ID); + pNewClient->SetUserHash(CMD4Hash(ID)); + buddyID->ToByteArray(ID); + pNewClient->SetBuddyID(ID); + AddToKadList(pNewClient); + AddClient(pNewClient); +} + + +void CClientList::RemoveFromKadList(CUpDownClient* torem) +{ + wxCHECK_RET(torem, wxT("NULL pointer in RemoveFromKadList")); + + if (m_KadSources.erase(torem)) { + if(torem == m_pBuddy) { + m_pBuddy = NULL; + Notify_ServerUpdateED2KInfo(); + } + } + +} + + +void CClientList::AddToKadList(CUpDownClient* toadd) +{ + wxCHECK_RET(toadd, wxT("NULL pointer in AddToKadList")); + + m_KadSources.insert(toadd); // This will take care of duplicates. +} + + +void CClientList::CleanUpClientList() +{ + // We remove clients which are not needed any more by time + // this check is also done on CUpDownClient::Disconnected, however it will not catch all + // cases (if a client changes the state without beeing connected + // + // Adding this check directly to every point where any state changes would be more effective, + // is however not compatible with the current code, because there are points where a client has + // no state for some code lines and the code is also not prepared that a client object gets + // invalid while working with it (aka setting a new state) + // so this way is just the easy and safe one to go (as long as amule is basically single threaded) + const uint32 cur_tick = ::GetTickCount(); + if (m_dwLastClientCleanUp + CLIENTLIST_CLEANUP_TIME < cur_tick ){ + m_dwLastClientCleanUp = cur_tick; + uint32 cDeleted = 0; + IDMap::iterator current_it = m_clientList.begin(); + while (current_it != m_clientList.end()) { + CUpDownClient* pCurClient = current_it->second; + ++current_it; // Won't be used till while loop again + // Don't delete sources coming from source seeds for 10 mins, + // to give them a chance to connect and become a useful source. + if (pCurClient->GetSourceFrom() == SF_SOURCE_SEEDS && cur_tick - (uint32)theStats::GetStartTime() < MIN2MS(10)) continue; + if ((pCurClient->GetUploadState() == US_NONE || pCurClient->GetUploadState() == US_BANNED && !pCurClient->IsBanned()) + && pCurClient->GetDownloadState() == DS_NONE + && pCurClient->GetChatState() == MS_NONE + && ( + (pCurClient->GetKadState() == KS_NONE) + || ( + (pCurClient->GetKadState() == KS_INCOMING_BUDDY) + && + // We didn't receive the promised buddy on 10 min + ((::GetTickCount() - pCurClient->GetCreationTime()) > KADEMLIABUDDYTIMEOUT) + ) + ) + && pCurClient->GetSocket() == NULL) + { + cDeleted++; + pCurClient->Disconnected(wxT("Removed during ClientList cleanup.")); + pCurClient->Safe_Delete(); + } else { + if (!(pCurClient->GetUploadState() == US_NONE || pCurClient->GetUploadState() == US_BANNED && !pCurClient->IsBanned())) { + AddDebugLogLineM(false, logProxy, + CFormat(wxT("Debug: Not deleted client %x with up state: %i ")) + % (long int)pCurClient % pCurClient->GetUploadState()); + } + if (!(pCurClient->GetDownloadState() == DS_NONE)) { + AddDebugLogLineM(false, logProxy, + CFormat(wxT("Debug: Not deleted client %x with down state: %i ")) + % (long int)pCurClient % pCurClient->GetDownloadState()); + } + if (!(pCurClient->GetChatState() == MS_NONE)) { + AddDebugLogLineM(false, logProxy, + CFormat(wxT("Debug: Not deleted client %x with chat state: %i ")) + % (long int)pCurClient % pCurClient->GetChatState()); + } + if (!(pCurClient->GetKadState() == KS_NONE)) { + AddDebugLogLineM(false, logProxy, + CFormat(wxT("Debug: Not deleted client %x with kad state: %i ip: %s time left: %i")) + % (long int)pCurClient % pCurClient->GetKadState() % pCurClient->GetFullIP() % (pCurClient->GetCreationTime()+KADEMLIABUDDYTIMEOUT-::GetTickCount())); + } + if (!(pCurClient->GetSocket() == NULL)) { + AddDebugLogLineM(false, logProxy, + CFormat(wxT("Debug: Not deleted client %x: has socket")) % (long int)pCurClient); + } + AddDebugLogLineM(false, logProxy, + CFormat(wxT("Debug: Not deleted client %x with kad version: %i")) + % (long int)pCurClient % pCurClient->GetKadVersion()); + } + } + AddDebugLogLineM(false, logClient, wxString::Format(wxT("Cleaned ClientList, removed %i not used known clients"), cDeleted)); + } +} +// File_checked_for_headers diff --git a/src/ClientList.h b/src/ClientList.h new file mode 100644 index 00000000..b21b262e --- /dev/null +++ b/src/ClientList.h @@ -0,0 +1,417 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef CLIENTLIST_H +#define CLIENTLIST_H + +#include "DeadSourceList.h" // Needed for CDeadSourceList + +#include +#include + +class CUpDownClient; +class CClientTCPSocket; +class CDeletedClient; +class CMD4Hash; +namespace Kademlia { + class CContact; + class CUInt128; +} + +enum buddyState +{ + Disconnected, + Connecting, + Connected +}; + + +#define BAN_CLEANUP_TIME 1200000 // 20 min + + +/** + * This class takes care of managing existing clients. + * + * This class tracks a number of attributes related to existing and deleted + * clients. Among other things, it keeps track of existing, banned, dead and + * dying clients, as well as offers support for matching new client-instances + * against already exist clients to avoid duplicates. + */ +class CClientList +{ +public: + /** + * Constructor. + */ + CClientList(); + + /** + * Destructor. + */ + ~CClientList(); + + + /** + * Adds a client to the global list of clients. + * + * @param toadd The new client. + */ + void AddClient( CUpDownClient* toadd ); + + /** + * Schedules a client for deletion. + * + * @param client The client to be deleted. + * + * Call this function whenever a client is to be deleted, rather than + * directly deleting the client. If the client is on the global client- + * list, then it will be scheduled for deletion, otherwise it will be + * deleted immediatly. Please check CUpDownClient::Safe_Delete for the + * proper way to do this. + */ + void AddToDeleteQueue( CUpDownClient* client ); + + + /** + * Updates the recorded IP of the specified client. + * + * @param client The client to have its entry updated. + * @param newIP The new IP adress of the client. + * + * This function is to be called before the client actually changes its + * IP-address, and will update the old entry with the new value. There + * will only be added an entry if the new IP isn't zero. + */ + void UpdateClientIP( CUpDownClient* client, uint32 newIP ); + + /** + * Updates the recorded ID of the specified client. + * + * @param client The client to have its entry updated. + * @param newID The new ID of the client. + * + * This function is to be called before the client actually changes its + * ID, and will update the old entry with the new value. Unlike the other + * two functions, this function will always ensure that there is an entry + * for the client, regardless of the value of newID. + */ + void UpdateClientID( CUpDownClient* client, uint32 newID ); + + /** + * Updates the recorded hash of the specified client. + * + * @param client The client to have its entry updated. + * @param newHash The new user-hash. + * + * This function is to be called before the client actually changes its + * user-hash, and will update the old entry with the new value. There will + * only be added an entry if the new hash is valid. + */ + void UpdateClientHash( CUpDownClient* client, const CMD4Hash& newHash ); + + + /** + * Returns the number of listed clients. + */ + uint32 GetClientCount() const; + + + /** + * Deletes all tracked clients. + */ + void DeleteAll(); + + + /** + * Replaces a new client-instance with the an already existing client, if one such exist. + * + * @param client A pointer to the pointer of the new instance. + * @param sender The socket assosiated with the new instance. + * + * Call this function when a new client-instance has been created. This function will then + * compare it against all existing clients and see if we already have an instance matching + * the new one. If that is the case, it will delete the new instance and set the pointer to + * the existing one. + */ + bool AttachToAlreadyKnown( CUpDownClient** client, CClientTCPSocket* sender ); + + + /** + * Finds a client with the specified ip and port. + * + * @param clientip The IP of the client to find. + * @param port The port used by the client. + */ + CUpDownClient* FindClientByIP( uint32 clientip, uint16 port ); + + + //! The list-type used to store clients IPs and other information + typedef std::map ClientMap; + + + /** + * Adds a client to the list of tracked clients. + * + * @param toadd The client to track. + * + * This function is used to keep track of clients after they + * have been deleted and makes it possible to spot port or hash + * changes. + */ + void AddTrackClient(CUpDownClient* toadd); + + /** + * Returns the number of tracked client. + * + * @param dwIP The IP-adress which of the clients. + * @return The number of clients tracked at the specifed IP. + */ + uint16 GetClientsFromIP(uint32 dwIP); + + /** + * Checks if a client has changed its user-hash. + * + * @param dwIP The IP of the client. + * @param nPort The port of the client. + * @param pNewHash The userhash assosiated with the client. + * + */ + bool ComparePriorUserhash( uint32 dwIP, uint16 nPort, void* pNewHash ); + + + /** + * Bans an IP address for 2 hours. + * + * @param dwIP The IP from which all clients will be banned. + */ + void AddBannedClient(uint32 dwIP); + + /** + * Checks if a client has been banned. + * + * @param dwIP The IP to check. + * @return True if the IP is banned, false otherwise. + */ + bool IsBannedClient(uint32 dwIP); + + /** + * Unbans an IP address, if it has been banned. + * + * @param dwIP The IP address to unban. + */ + void RemoveBannedClient(uint32 dwIP); + + + /** + * Main loop. + * + * This function takes care of cleaning the various lists and deleting + * pending clients on the deletion-queue. + */ + void Process(); + + + /** + * Deletes clients previously queued for deletion + * + * This function takes care of deleting pending clients on the + * deletion-queue. + */ + void ProcessDeleteQueue(); + + + /** + * This function removes all clients filtered by the current IPFilter. + * + * Call this function after changing the current IPFiler list, to ensure + * that no client-connections to illegal IPs exist. These would otherwise + * be allowed to exist, bypassing the IPFilter. + */ + void FilterQueues(); + + + //! The type of the list used to store client-pointers for a couple of tasks. + typedef std::deque SourceList; + + + /** + * Returns a list of clients with the specified user-hash. + * + * @param hash The userhash to search for. + * + * This function will return a list of clients with the specified userhash, + * provided that the hash is a valid non-empty userhash. Empty hashes will + * simply result in nothing being found. + */ + SourceList GetClientsByHash( const CMD4Hash& hash ); + + /** + * Returns a list of clients with the specified IP. + * + * @param ip The IP-address to search for. + * + * This function will return a list of clients with the specified IP, + * provided that the IP is a non-zero value. A value of zero will not + * result in any results. + */ + SourceList GetClientsByIP( unsigned long ip ); + + + //! The type of the lists used to store IPs and IDs. + typedef std::multimap IDMap; + //! The pairs of the IP/ID list. + typedef std::pair IDMapPair; + + + /** + * Returns a list of all clients. + * + * @return The complete list of clients. + */ + const IDMap& GetClientList(); + + + /** + * Adds a source to the list of dead sources. + * + * @param client The source to be recorded as dead. + */ + void AddDeadSource(const CUpDownClient* client); + + /** + * Checks if a source is recorded as being dead. + * + * @param client The client to evaluate. + * @return True if dead, false otherwise. + * + * Sources that are dead are not to be considered valid + * sources and should not be added to partfiles. + */ + bool IsDeadSource(const CUpDownClient* client); + + /** + * Sends a message to a client, identified by a GUI_ID + * + * @return Success + */ + bool SendMessage(uint64 client_id, const wxString& message); + + /** + * Stops a chat session with a client. + * + */ + void SetChatState(uint64 client_id, uint8 state); + + /* + * Avoids unwanted clients to be forever in the client list + */ + void CleanUpClientList(); + + uint8 GetBuddyStatus() const {return m_nBuddyStatus;} + // This must be used on CreateKadSourceLink and if we ever add the columns + // on shared files control. + CUpDownClient* GetBuddy() const { return m_pBuddy; } + void RequestTCP(Kademlia::CContact* contact); + void RequestBuddy(Kademlia::CContact* contact); + void IncomingBuddy(Kademlia::CContact* contact, Kademlia::CUInt128* buddyID ); + void RemoveFromKadList(CUpDownClient* torem); + void AddToKadList(CUpDownClient* toadd); + + // We lack the kad firewall check +// //#warning ALSO FIX THIS, NOW!!! + bool IsKadFirewallCheckIP(uint32 /*ip*/) { return false; } + +private: + /** + * Helperfunction which finds a client matching the specified client. + * + * @param client The client to search for. + * @return The matching client or NULL. + * + * This functions searches through the list of clients and finds the first match + * using the same checks as CUpDownClient::Compare, but without the overhead. + */ + CUpDownClient* FindMatchingClient( CUpDownClient* client ); + + + /** + * Helperfunction which removes the client from the IP-list. + */ + void RemoveIPFromList( CUpDownClient* client ); + /** + * Helperfunction which removes the client from the ID-list. + */ + bool RemoveIDFromList( CUpDownClient* client ); + /** + * Helperfunction which removes the client from the hash-list. + */ + void RemoveHashFromList( CUpDownClient* client ); + + + //! The type of the list used to store user-hashes. + typedef std::multimap HashMap; + //! The pairs of the Hash-list. + typedef std::pair HashMapPair; + + + //! The map of clients with valid hashes + HashMap m_hashList; + + //! The map of clients with valid IPs + IDMap m_ipList; + + //! The full lists of clients + IDMap m_clientList; + + //! This is the lists of clients that should be deleted + SourceList m_delete_queue; +#ifdef __WXDEBUG__ + bool m_delete_queue_closed; +#endif + + //! This is the map of banned clients. + ClientMap m_bannedList; + //! This variable is used to keep track of the last time the banned-list was pruned. + uint32 m_dwLastBannCleanUp; + + //! This is the map of tracked clients. + std::map m_trackedClientsList; + //! This keeps track of the last time the tracked-list was pruned. + uint32 m_dwLastTrackedCleanUp; + + //! This keeps track of the last time the client-list was pruned. + uint32 m_dwLastClientCleanUp; + + //! List of unusable sources. + CDeadSourceList m_deadSources; + + /* Kad Stuff */ + std::set m_KadSources; + CUpDownClient* m_pBuddy; + uint8 m_nBuddyStatus; +}; + +#endif +// File_checked_for_headers diff --git a/src/ClientListCtrl.cpp b/src/ClientListCtrl.cpp new file mode 100644 index 00000000..005e3f94 --- /dev/null +++ b/src/ClientListCtrl.cpp @@ -0,0 +1,1109 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "ClientListCtrl.h" + +#include +#include + +#include "amule.h" +#include "amuleDlg.h" +#include "ChatWnd.h" +#include "ClientDetailDialog.h" +#include "ClientList.h" +#include "Color.h" +#include "DataToText.h" +#ifdef ENABLE_IP2COUNTRY + #include "IP2Country.h" // Needed for IP2Country +#endif +#include "KnownFile.h" +#include "updownclient.h" +#include "UploadQueue.h" + +#include +#include +#include +#include + +//////////////////////////////////////////////////////////// +// Sorter functions. + +int CompareVersions(const CUpDownClient* client1, const CUpDownClient* client2) +{ + if (client1->GetClientSoft() != client2->GetClientSoft()) { + return client1->GetSoftStr().Cmp(client2->GetSoftStr()); + } + + if (client1->GetVersion() != client2->GetVersion()) { + return CmpAny(client1->GetVersion(), client2->GetVersion()); + } + + return client1->GetClientModString().Cmp(client2->GetClientModString()); +} + + +//////////////////////////////////////////////////////////// +// CClientListCtrl + + +BEGIN_EVENT_TABLE( CClientListCtrl, CMuleListCtrl ) + EVT_RIGHT_DOWN(CClientListCtrl::OnRightClick) + EVT_LIST_ITEM_MIDDLE_CLICK(-1, CClientListCtrl::OnMiddleClick) + + EVT_MENU( MP_DETAIL, CClientListCtrl::OnShowDetails ) + EVT_MENU( MP_ADDFRIEND, CClientListCtrl::OnAddFriend ) + EVT_MENU( MP_SHOWLIST, CClientListCtrl::OnViewFiles ) + EVT_MENU( MP_SENDMESSAGE, CClientListCtrl::OnSendMessage ) + EVT_MENU( MP_UNBAN, CClientListCtrl::OnUnbanClient ) + EVT_MENU_RANGE( MP_SWITCHCTRL_0, MP_SWITCHCTRL_9, CClientListCtrl::OnChangeView ) +END_EVENT_TABLE() + + +#define m_imagelist theApp->amuledlg->m_imagelist + + +/** + * This struct is used to keep track of the different view-types. + * + * Each view has a number of attributes, namely a title and serveral functions + * which are used by the CClientListCtrl class. This struct is used to store these + * for easier access. + * + * Please note that none of the values are required, however for a fully functional + * view, it is nescesarry to specificy all of them. + */ +struct ClientListView +{ + //! The name of the view, this is used to load and save column-preferences. + wxString m_title; + + //! Pointer to the initialization function. + void (*m_init)(CClientListCtrl*); + + //! Pointer to the drawing function + void (*m_draw)(CUpDownClient*, int, wxDC*, const wxRect&); + + //! Pointer to the sorting function. + MuleListCtrlCompare m_sort; +}; + + +//! This is the list of currently usable views, in the same order as the ViewType enum. +ClientListView g_listViews[] = +{ + //! None: This view does nothing at all. + { + wxEmptyString, + NULL, + NULL, + NULL, + }, + + //! Uploading: The clients currently being uploaded to. + { + wxT("Uploads"), + CUploadingView::Initialize, + CUploadingView::DrawCell, + CUploadingView::SortProc, + }, + + //! Queued: The clients currently queued for uploading. + { + wxT("Queue"), + CQueuedView::Initialize, + CQueuedView::DrawCell, + CQueuedView::SortProc, + }, + + //! Clients The complete list of all known clients. + { + wxT("Clients"), + CClientsView::Initialize, + CClientsView::DrawCell, + CClientsView::SortProc, + } +}; + + + +CClientListCtrl::CClientListCtrl( wxWindow *parent, wxWindowID winid, const wxPoint &pos, const wxSize &size, long style, const wxValidator& validator, const wxString& name ) +: +CMuleListCtrl( parent, winid, pos, size, style | wxLC_OWNERDRAW, validator, name ) +{ + m_viewType = vtNone; + + m_menu = NULL; + + wxColour col = SYSCOLOR( wxSYS_COLOUR_HIGHLIGHT ); + m_hilightBrush = new wxBrush( BLEND( col, 125), wxSOLID ); + + col = SYSCOLOR( wxSYS_COLOUR_BTNSHADOW ); + m_hilightUnfocusBrush = new wxBrush( BLEND( col, 125), wxSOLID ); + + + // We show the uploading-list initially + SetListView( vtUploading ); +} + + +CClientListCtrl::~CClientListCtrl() +{ + delete m_hilightBrush; + delete m_hilightUnfocusBrush; +} + + +ViewType CClientListCtrl::GetListView() +{ + return m_viewType; +} + + +void CClientListCtrl::SetListView( ViewType newView ) +{ + if ( m_viewType != newView ) { + if (m_viewType != vtNone) { + SaveSettings(); + ClearAll(); + } + + m_viewType = newView; + + const ClientListView& view = g_listViews[ (int)newView ]; + + // Initialize the selected view + if ( view.m_init ) { + view.m_init( this ); + } + + SetTableName( view.m_title ); + SetSortFunc( view.m_sort ); + + if (newView != vtNone) { + LoadSettings(); + } + } +} + + +void CClientListCtrl::ToggleView() +{ + // Disallow toggling if the list is disabled + if ( m_viewType == vtNone ) { + return; + } + + unsigned int view = (int)m_viewType + 1; + + if ( view < itemsof(g_listViews) ) { + SetListView( (ViewType)(view) ); + } else { + SetListView( (ViewType)(1) ); + } +} + + +///////////////////////////////////////////////////////////////////////////////////////////// +void CClientListCtrl::OnRightClick(wxMouseEvent& event) +{ + long index = CheckSelection(event); + + if ( m_menu == NULL ) { + + bool banned = false; + bool validIP = false; + bool isfriend = false; + bool hasdisabledsharedfiles = false; + + // Check if the client is banned + if ( index > -1 ) { + CUpDownClient *client = reinterpret_cast(GetItemData( index )); + + banned = client->IsBanned(); + validIP = client->GetIP(); + isfriend = client->IsFriend(); + hasdisabledsharedfiles = client->HasDisabledSharedFiles(); + } + + m_menu = new wxMenu(_("Clients")); + m_menu->Append( MP_DETAIL, _("Show &Details") ); + m_menu->Append( MP_ADDFRIEND, isfriend ? _("Remove from friends") : _("Add to Friends") ); + m_menu->Append( MP_SHOWLIST, _("View Files") ); + m_menu->Append( MP_SENDMESSAGE, _("Send message") ); + m_menu->Append( MP_UNBAN, _("Unban") ); + + m_menu->AppendSeparator(); + + wxMenu* view = new wxMenu(); + view->Append( MP_SWITCHCTRL_0 + 1, _("Show Uploads") ); + view->Append( MP_SWITCHCTRL_0 + 2, _("Show Queue") ); + view->Append( MP_SWITCHCTRL_0 + 3, _("Show Clients") ); + + view->Enable( MP_SWITCHCTRL_0 + (int)m_viewType, false ); + + m_menu->Append( 0, _("Select View"), view ); + + m_menu->Enable( MP_DETAIL, index > -1 ); + m_menu->Enable( MP_SHOWLIST, index > -1 ); + + m_menu->Enable( MP_UNBAN, banned ); + m_menu->Enable( MP_SHOWLIST, !hasdisabledsharedfiles ); + m_menu->Enable( MP_ADDFRIEND, validIP ); + m_menu->Enable( MP_SENDMESSAGE, validIP ); + + PopupMenu( m_menu, event.GetPosition() ); + + delete m_menu; + + m_menu = NULL; + } +} + + +void CClientListCtrl::OnMiddleClick(wxListEvent& event) +{ + long index = CheckSelection(event); + + if (index > -1) { + CUpDownClient *client = reinterpret_cast(GetItemData( index )); + + CClientDetailDialog dialog(this, client); + + dialog.ShowModal(); + } +} + + +void CClientListCtrl::OnChangeView( wxCommandEvent& event ) +{ + int view = event.GetId() - MP_SWITCHCTRL_0; + + SetListView( (ViewType)view ); +} + + +void CClientListCtrl::OnAddFriend( wxCommandEvent& WXUNUSED(event) ) +{ + long index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + + while ( index != -1 ) { + CUpDownClient *client = reinterpret_cast(GetItemData( index )); + if (client->IsFriend()) { + theApp->amuledlg->m_chatwnd->RemoveFriend(client->GetUserHash(), client->GetIP(), client->GetUserPort()); + } else { + theApp->amuledlg->m_chatwnd->AddFriend( client ); + } + index = GetNextItem( index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + } +} + + +void CClientListCtrl::OnShowDetails( wxCommandEvent& WXUNUSED(event) ) +{ + long index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + + if ( index > -1 ) { + CUpDownClient *client = reinterpret_cast(GetItemData( index )); + CClientDetailDialog dialog(this, client); + dialog.ShowModal(); + } +} + + +void CClientListCtrl::OnViewFiles( wxCommandEvent& WXUNUSED(event) ) +{ + long index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + + if ( index > -1 ) { + CUpDownClient *client = reinterpret_cast(GetItemData( index )); + client->RequestSharedFileList(); + } +} + + +void CClientListCtrl::OnSendMessage( wxCommandEvent& WXUNUSED(event) ) +{ + long index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + + if ( index > -1 ) { + CUpDownClient *client = reinterpret_cast(GetItemData( index )); + + // These values are cached, since calling wxGetTextFromUser will + // start an event-loop, in which the client may be deleted. + wxString userName = client->GetUserName(); + uint64 userID = GUI_ID(client->GetIP(),client->GetUserPort()); + + wxString message = ::wxGetTextFromUser( _("Send message to user"), _("Message to send:") ); + + if (!message.IsEmpty()) { + theApp->amuledlg->m_chatwnd->SendMessage(message, userName, userID); + } + } +} + + +void CClientListCtrl::OnUnbanClient( wxCommandEvent& WXUNUSED(event) ) +{ + long index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + + if ( index > -1 ) { + CUpDownClient *client = reinterpret_cast(GetItemData( index )); + if ( client->IsBanned() ) { + client->UnBan(); + } + } +} + + +void CClientListCtrl::InsertClient( CUpDownClient* client, ViewType view ) +{ + wxCHECK_RET(client, wxT("Attempted to add NULL client pointer.")); + + if ( ( m_viewType != view ) || ( view == vtNone ) ) { + return; + } + + long index = InsertItem( GetItemCount(), wxEmptyString ); + SetItemPtrData( index, reinterpret_cast(client) ); + + wxListItem myitem; + myitem.SetId( index ); + myitem.SetBackgroundColour( SYSCOLOR(wxSYS_COLOUR_LISTBOX) ); + + SetItem(myitem); + + RefreshItem( index ); +} + + +void CClientListCtrl::RemoveClient( CUpDownClient* client, ViewType view ) +{ + wxCHECK_RET(client, wxT("Attempted to remove NULL client pointer.")); + + if ( ( m_viewType != view ) || ( view == vtNone ) ) { + return; + } + + long index = FindItem( -1, reinterpret_cast(client) ); + + if ( index > -1 ) { + DeleteItem( index ); + } +} + + +void CClientListCtrl::UpdateClient( CUpDownClient* client, ViewType view ) +{ + wxCHECK_RET(client, wxT("Attempted to update NULL client pointer.")); + + if ( ( m_viewType != view ) || ( view == vtNone ) ) { + return; + } + + if ( theApp->amuledlg->IsDialogVisible( CamuleDlg::DT_TRANSFER_WND ) ) { + // Visible lines, default to all because not all platforms support the GetVisibleLines function + long first = 0, last = GetItemCount(); + long result = FindItem( -1, reinterpret_cast(client) ); + if ( result > -1 ) { +#ifndef __WXMSW__ + GetVisibleLines( &first, &last ); +#endif + if ( result >= first && result <= last) { + RefreshItem(result); + } + } + } +} + + +void CClientListCtrl::OnDrawItem( int item, wxDC* dc, const wxRect& rect, const wxRect& rectHL, bool highlighted ) +{ + // Don't do any drawing if we not being watched. + if ( !theApp->amuledlg || !theApp->amuledlg->IsDialogVisible( CamuleDlg::DT_TRANSFER_WND ) ) { + return; + } + + if ( highlighted ) { + if ( GetFocus() ) { + dc->SetBackground(*m_hilightBrush); + dc->SetTextForeground( SYSCOLOR(wxSYS_COLOUR_HIGHLIGHTTEXT) ); + } else { + dc->SetBackground(*m_hilightUnfocusBrush); + dc->SetTextForeground( SYSCOLOR(wxSYS_COLOUR_HIGHLIGHTTEXT)); + } + + wxColour colour = GetFocus() ? m_hilightBrush->GetColour() : m_hilightUnfocusBrush->GetColour(); + dc->SetPen( wxPen( BLEND(colour, 65), 1, wxSOLID) ); + } else { + dc->SetBackground( wxBrush( SYSCOLOR(wxSYS_COLOUR_LISTBOX), wxSOLID ) ); + dc->SetTextForeground( SYSCOLOR(wxSYS_COLOUR_WINDOWTEXT) ); + dc->SetPen(*wxTRANSPARENT_PEN); + } + + dc->SetBrush(dc->GetBackground()); + dc->DrawRectangle(rectHL); + dc->SetPen(*wxTRANSPARENT_PEN); + + CUpDownClient* client = reinterpret_cast(GetItemData(item)); + wxRect cur_rect = rect; + cur_rect.x += 4; + + const ClientListView& view = g_listViews[ (int)m_viewType ]; + + if ( view.m_draw ) { + for ( int i = 0; i < GetColumnCount(); i++ ) { + int width = GetColumnWidth( i ); + if ( width ) { + cur_rect.width = width - 8; + + wxDCClipper clipper( *dc, cur_rect ); + + view.m_draw( client, i, dc, cur_rect ); + } + cur_rect.x += width; + } + } +} + + +wxString CClientListCtrl::GetTTSText(unsigned item) const +{ + CUpDownClient *client = reinterpret_cast(GetItemData( item )); + + return client->GetUserName(); +} + + +///////////////////////////////////////////////////////////////////////////////////////////// +void CUploadingView::Initialize( CClientListCtrl* list ) +{ + list->InsertColumn( 0, _("Username"), wxLIST_FORMAT_LEFT, 150 ); + list->InsertColumn( 1, _("File"), wxLIST_FORMAT_LEFT, 275 ); + list->InsertColumn( 2, _("Client Software"), wxLIST_FORMAT_LEFT, 100 ); + list->InsertColumn( 3, _("Speed"), wxLIST_FORMAT_LEFT, 60 ); + list->InsertColumn( 4, _("Transferred"), wxLIST_FORMAT_LEFT, 65 ); + list->InsertColumn( 5, _("Waited"), wxLIST_FORMAT_LEFT, 60 ); + list->InsertColumn( 6, _("Upload Time"), wxLIST_FORMAT_LEFT, 60 ); + list->InsertColumn( 7, _("Status"), wxLIST_FORMAT_LEFT, 110 ); + list->InsertColumn( 8, _("Obtained Parts"), wxLIST_FORMAT_LEFT, 100 ); + list->InsertColumn( 9, _("Upload/Download"), wxLIST_FORMAT_LEFT, 100 ); + list->InsertColumn( 10, _("Remote Status"), wxLIST_FORMAT_LEFT, 100 ); + + // Insert any existing items on the list + const CClientPtrList& uploading = theApp->uploadqueue->GetUploadingList(); + CClientPtrList::const_iterator it = uploading.begin(); + for (; it != uploading.end(); ++it) { + list->InsertClient( *it, list->GetListView() ); + } +} + + +void CUploadingView::DrawCell( CUpDownClient* client, int column, wxDC* dc, const wxRect& rect ) +{ + wxString buffer; + + switch ( column ) { + case 0: { + uint8 clientImage; + + if ( client->IsFriend() ) { + clientImage = Client_Friend_Smiley; + } else { + switch (client->GetClientSoft()) { + case SO_AMULE: + clientImage = Client_aMule_Smiley; + break; + case SO_MLDONKEY: + case SO_NEW_MLDONKEY: + case SO_NEW2_MLDONKEY: + clientImage = Client_mlDonkey_Smiley; + break; + case SO_EDONKEY: + case SO_EDONKEYHYBRID: + // Maybe we would like to make different icons? + clientImage = Client_eDonkeyHybrid_Smiley; + break; + case SO_EMULE: + clientImage = Client_eMule_Smiley; + break; + case SO_LPHANT: + clientImage = Client_lphant_Smiley; + break; + case SO_SHAREAZA: + case SO_NEW_SHAREAZA: + case SO_NEW2_SHAREAZA: + clientImage = Client_Shareaza_Smiley; + break; + case SO_LXMULE: + clientImage = Client_xMule_Smiley; + break; + default: + // cDonkey, Compat Unk + // No icon for those yet. Using the eMule one + '?' + clientImage = Client_Unknown; + break; + } + } + + m_imagelist.Draw(clientImage, *dc, rect.x, rect.y + 1, + wxIMAGELIST_DRAW_TRANSPARENT); + + if (client->GetScoreRatio() > 1) { + // Has credits, draw the gold star + m_imagelist.Draw(Client_CreditsYellow_Smiley, *dc, rect.x, rect.y + 1, + wxIMAGELIST_DRAW_TRANSPARENT ); + } else if (client->ExtProtocolAvailable()) { + // Ext protocol -> Draw the '+' + m_imagelist.Draw(Client_ExtendedProtocol_Smiley, *dc, rect.x, rect.y + 1, + wxIMAGELIST_DRAW_TRANSPARENT ); + } + + if (client->IsIdentified()) { + // the 'v' + m_imagelist.Draw(Client_SecIdent_Smiley, *dc, rect.x, rect.y + 1, + wxIMAGELIST_DRAW_TRANSPARENT); + } else if (client->IsBadGuy()) { + // the 'X' + m_imagelist.Draw(Client_BadGuy_Smiley, *dc, rect.x, rect.y + 1, + wxIMAGELIST_DRAW_TRANSPARENT); + } + + if (client->HasObfuscatedConnectionBeenEstablished()) { + // the "¿" except it's a key + m_imagelist.Draw(Client_Encryption_Smiley, *dc, rect.x, rect.y + 1, + wxIMAGELIST_DRAW_TRANSPARENT); + } + + wxString userName; +#ifdef ENABLE_IP2COUNTRY + // Draw the flag + const CountryData& countrydata = + theApp->amuledlg->m_IP2Country->GetCountryData(client->GetFullIP()); + dc->DrawBitmap(countrydata.Flag, rect.x + 20, rect.y + 5, + wxIMAGELIST_DRAW_TRANSPARENT); + + userName << countrydata.Name; + userName << wxT(" - "); +#endif // ENABLE_IP2COUNTRY + userName << client->GetUserName(); + dc->DrawText(userName, rect.x + 40, rect.y + 3); + + return; + } + + case 1: + if ( client->GetUploadFile() ) { + buffer = client->GetUploadFile()->GetFileName().GetPrintable(); + } else { + buffer = _("N/A"); + } + break; + + case 2: + buffer = client->GetClientVerString(); + break; + + case 3: + buffer = wxString::Format( wxT("%.1f"), client->GetUploadDatarate() / 1024.0f ); + + buffer += wxT(" "); + buffer += _("kB/s"); + break; + + case 4: + buffer = CastItoXBytes(client->GetSessionUp()); + break; + + case 5: + buffer = CastSecondsToHM((client->GetWaitTime())/1000); + break; + + case 6: + buffer = CastSecondsToHM((client->GetUpStartTimeDelay())/1000); + break; + + case 7: + switch ( client->GetUploadState() ) { + case US_CONNECTING: + buffer = _("Connecting"); + break; + + case US_WAITCALLBACK: + buffer = _("Connecting via server"); + break; + + case US_UPLOADING: + buffer = wxT("<-- "); + buffer.Append(_("Transferring")); + + if (client->GetDownloadState() == DS_DOWNLOADING) { + buffer.Append(wxT(" -->")); + } + break; + + case US_ONUPLOADQUEUE: + buffer = _("On Queue"); + break; + + default: + buffer = _("Unknown"); + } + break; + + case 8: + if ( client->GetUpPartCount() ) { + CUploadingView::DrawStatusBar( client, dc, rect ); + } + return; + + case 9: + buffer = CastItoXBytes( client->GetUploadedTotal() ) + + wxT(" / ") + CastItoXBytes(client->GetDownloadedTotal()); + break; + + case 10: + if ( client->GetDownloadState() == DS_ONQUEUE ) { + if ( client->IsRemoteQueueFull() ) { + buffer = _("Queue Full"); + } else { + if (client->GetRemoteQueueRank()) { + buffer = wxString::Format(_("QR: %u"), client->GetRemoteQueueRank()); + } else { + buffer = _("Unknown"); + } + } + } else if ( client->GetDownloadState() == DS_DOWNLOADING ) { + buffer += wxString::Format( wxT("%.1f"), client->GetKBpsDown() ); + buffer += wxT(" "); + buffer += _("kB/s"); + } else { + buffer = _("Unknown"); + } + break; + } + + dc->DrawText( buffer, rect.x, rect.y + 3 ); +} + + +int CUploadingView::SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData) +{ + CUpDownClient* client1 = (CUpDownClient*)item1; + CUpDownClient* client2 = (CUpDownClient*)item2; + + // Sorting ascending or decending + int mode = (sortData & CMuleListCtrl::SORT_DES) ? -1 : 1; + + switch (sortData & CMuleListCtrl::COLUMN_MASK) { + // Sort by username + case 0: return mode * client1->GetUserName().CmpNoCase( client2->GetUserName() ); + + + // Sort by requested file + case 1: { + const CKnownFile* file1 = client1->GetUploadFile(); + const CKnownFile* file2 = client2->GetUploadFile(); + + if ( file1 && file2 ) { + return mode * CmpAny(file1->GetFileName(), file2->GetFileName()); + } + + return mode * CmpAny( file1, file2 ); + } + + // Sort by client software + case 2: return mode * CompareVersions(client1, client2); + + // Sort by speed + case 3: return mode * CmpAny( client1->GetUploadDatarate(), client2->GetUploadDatarate() ); + + // Sort by transferred + case 4: return mode * CmpAny( client1->GetSessionUp(), client2->GetSessionUp() ); + + // Sort by wait-time + case 5: return mode * CmpAny( client1->GetWaitTime(), client2->GetWaitTime() ); + + // Sort by upload time + case 6: return mode * CmpAny( client1->GetUpStartTimeDelay(), client2->GetUpStartTimeDelay() ); + + // Sort by state + case 7: return mode * CmpAny( client1->GetUploadState(), client2->GetUploadState() ); + + // Sort by partcount + case 8: return mode * CmpAny( client1->GetUpPartCount(), client2->GetUpPartCount() ); + + // Sort by U/D ratio + case 9: return mode * CmpAny( client2->GetDownloadedTotal(), client1->GetDownloadedTotal() ); + + // Sort by remote rank + case 10: return mode * CmpAny( client2->GetRemoteQueueRank(), client1->GetRemoteQueueRank() ); + + default: + return 0; + } +} + + +void CUploadingView::DrawStatusBar( CUpDownClient* client, wxDC* dc, const wxRect& rect1 ) +{ + wxRect rect = rect1; + rect.y += 2; + rect.height -= 2; + + wxPen old_pen = dc->GetPen(); + wxBrush old_brush = dc->GetBrush(); + + dc->SetPen(*wxTRANSPARENT_PEN); + dc->SetBrush( wxBrush( wxColour(220,220,220), wxSOLID ) ); + + dc->DrawRectangle( rect ); + dc->SetBrush(*wxBLACK_BRUSH); + + uint32 partCount = client->GetUpPartCount(); + + float blockpixel = (float)(rect.width)/((float)(PARTSIZE*partCount)/1024); + for ( uint32 i = 0; i < partCount; i++ ) { + if ( client->IsUpPartAvailable( i ) ) { + int right = rect.x + (uint32)(((float)PARTSIZE*i/1024)*blockpixel); + int left = rect.x + (uint32)((float)((float)PARTSIZE*(i+1)/1024)*blockpixel); + dc->DrawRectangle( (int)left, rect.y, right - left, rect.height ); + } + } + + dc->SetPen( old_pen ); + dc->SetBrush( old_brush ); +} + + +///////////////////////////////////////////////////////////////////////////////////////////// +void CQueuedView::Initialize( CClientListCtrl* list ) +{ + list->InsertColumn( 0, _("Username"), wxLIST_FORMAT_LEFT, 150 ); + list->InsertColumn( 1, _("File"), wxLIST_FORMAT_LEFT, 275 ); + list->InsertColumn( 2, _("Client Software"), wxLIST_FORMAT_LEFT, 100 ); + list->InsertColumn( 3, _("File Priority"), wxLIST_FORMAT_LEFT, 110 ); + list->InsertColumn( 4, _("Rating"), wxLIST_FORMAT_LEFT, 60 ); + list->InsertColumn( 5, _("Score"), wxLIST_FORMAT_LEFT, 60 ); + list->InsertColumn( 6, _("Asked"), wxLIST_FORMAT_LEFT, 60 ); + list->InsertColumn( 7, _("Last Seen"), wxLIST_FORMAT_LEFT, 110 ); + list->InsertColumn( 8, _("Entered Queue"), wxLIST_FORMAT_LEFT, 110 ); + list->InsertColumn( 9, _("Banned"), wxLIST_FORMAT_LEFT, 60 ); + list->InsertColumn( 10, _("Obtained Parts"), wxLIST_FORMAT_LEFT, 100 ); + + // Insert any existing items on the list + // Insert any existing items on the list + const CClientPtrList& uploading = theApp->uploadqueue->GetWaitingList(); + CClientPtrList::const_iterator it = uploading.begin(); + for (; it != uploading.end(); ++it) { + list->InsertClient( *it, list->GetListView() ); + } +} + + +void CQueuedView::DrawCell( CUpDownClient* client, int column, wxDC* dc, const wxRect& rect ) +{ + wxString buffer; + + switch ( column ) { + // These 3 are the same for both lists + case 0: + case 1: + case 2: + CUploadingView::DrawCell( client, column, dc, rect ); + return; + + case 3: + if ( client->GetUploadFile() ) { + buffer = PriorityToStr( client->GetUploadFile()->GetUpPriority(), false ); + } else { + buffer = _("Unknown"); + } + + break; + + case 4: + buffer = wxString::Format( wxT("%.1f"), (float)client->GetScore(false,false,true) ); + break; + + case 5: + if ( client->HasLowID() ) { + buffer = wxString::Format( wxT("%i %s"), client->GetScore(false), _("LowID") ); + } else { + buffer = wxString::Format(wxT("%i"),client->GetScore(false)); + } + break; + + case 6: + buffer = wxString::Format( wxT("%i"), client->GetAskedCount() ); + break; + +#ifndef CLIENT_GUI + case 7: + buffer = CastSecondsToHM((::GetTickCount() - client->GetLastUpRequest())/1000); + break; + + case 8: + buffer = CastSecondsToHM((::GetTickCount() - client->GetWaitStartTime())/1000); + break; +#else + case 7: + buffer = CastSecondsToHM(client->GetLastUpRequest()/1000); + break; + + case 8: + buffer = CastSecondsToHM(client->GetWaitStartTime()/1000); + break; +#endif + case 9: + if ( client->IsBanned() ) { + buffer = _("Yes"); + } else { + buffer = _("No"); + } + + break; + + case 10: + if ( client->GetUpPartCount() ) { + CUploadingView::DrawStatusBar( client, dc, rect ); + } + + return; + } + + dc->DrawText( buffer, rect.x, rect.y + 3 ); +} + + +int CQueuedView::SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData) +{ + CUpDownClient* client1 = (CUpDownClient*)item1; + CUpDownClient* client2 = (CUpDownClient*)item2; + + // Ascending or decending? + int mode = (sortData & CMuleListCtrl::SORT_DES) ? -1 : 1; + + switch (sortData & CMuleListCtrl::COLUMN_MASK) { + // Sort by username + case 0: return mode * client1->GetUserName().CmpNoCase( client2->GetUserName() ); + + // Sort by filename + case 1: { + const CKnownFile* file1 = client1->GetUploadFile(); + const CKnownFile* file2 = client2->GetUploadFile(); + + if ( file1 && file2 ) { + return mode * CmpAny(file1->GetFileName(), file2->GetFileName()); + } + + // Place files with filenames on top + return -mode * CmpAny( file1, file2 ); + } + + // Sort by client software + case 2: return mode * CompareVersions(client1, client2); + + // Sort by file upload-priority + case 3: { + const CKnownFile* file1 = client1->GetUploadFile(); + const CKnownFile* file2 = client2->GetUploadFile(); + + if ( file1 && file2 ) { + int8 prioA = file1->GetUpPriority(); + int8 prioB = file2->GetUpPriority(); + + // Work-around for PR_VERYLOW which has value 4. See KnownFile.h for that stupidity ... + return mode * CmpAny( ( prioA != PR_VERYLOW ? prioA : -1 ), ( prioB != PR_VERYLOW ? prioB : -1 ) ); + } + + // Place files with priorities on top + return -mode * CmpAny( file1, file2 ); + } + + // Sort by rating + case 4: return mode * CmpAny( client1->GetScore(false,false,true), client2->GetScore(false,false,true) ); + + // Sort by score + case 5: return mode * CmpAny( client1->GetScore(false), client2->GetScore(false) ); + + // Sort by Asked count + case 6: return mode * CmpAny( client1->GetAskedCount(), client2->GetAskedCount() ); + + // Sort by Last seen + case 7: return mode * CmpAny( client1->GetLastUpRequest(), client2->GetLastUpRequest() ); + + // Sort by entered time + case 8: return mode * CmpAny( client1->GetWaitStartTime(), client2->GetWaitStartTime() ); + + // Sort by banned + case 9: return mode * CmpAny( client1->IsBanned(), client2->IsBanned() ); + + default: return 0; + } +} + + +///////////////////////////////////////////////////////////////////////////////////////////// +void CClientsView::Initialize( CClientListCtrl* list ) +{ + list->InsertColumn( 0, _("Username"), wxLIST_FORMAT_LEFT, 150 ); + list->InsertColumn( 1, _("Upload Status"), wxLIST_FORMAT_LEFT, 150 ); + list->InsertColumn( 2, _("Transferred Up"), wxLIST_FORMAT_LEFT, 150 ); + list->InsertColumn( 3, _("Download Status"), wxLIST_FORMAT_LEFT, 150 ); + list->InsertColumn( 4, _("Transferred Down"), wxLIST_FORMAT_LEFT, 150 ); + list->InsertColumn( 5, _("Client Software"), wxLIST_FORMAT_LEFT, 150 ); + list->InsertColumn( 6, _("Connected"), wxLIST_FORMAT_LEFT, 150 ); + list->InsertColumn( 7, _("Userhash"), wxLIST_FORMAT_LEFT, 150 ); + list->InsertColumn( 8, _("Encrypted"), wxLIST_FORMAT_LEFT, 100 ); + list->InsertColumn( 9, _("Hide shared files"), wxLIST_FORMAT_LEFT, 100 ); + + const CClientList::IDMap& clist = theApp->clientlist->GetClientList(); + CClientList::IDMap::const_iterator it = clist.begin(); + + for ( ; it != clist.end(); ++it ) { + list->InsertClient( it->second, list->GetListView() ); + } +} + + +void CClientsView::DrawCell( CUpDownClient* client, int column, wxDC* dc, const wxRect& rect ) +{ + wxString buffer; + + switch ( column ) { + case 0: + CUploadingView::DrawCell( client, column, dc, rect ); + return; + + case 1: + CUploadingView::DrawCell( client, 7, dc, rect ); + return; + + case 2: + buffer = CastItoXBytes( client->GetUploadedTotal() ); + + break; + + case 3: + buffer = DownloadStateToStr( client->GetDownloadState(), + client->IsRemoteQueueFull() ); + break; + + case 4: + buffer = CastItoXBytes( client->GetDownloadedTotal() ); + break; + + case 5: + buffer = client->GetClientVerString(); + break; + + case 6: + if ( client->IsConnected() ) { + buffer = _("Yes"); + } else { + buffer = _("No"); + } + + break; + + case 7: + buffer = client->GetUserHash().Encode(); + break; + + case 8: + buffer = client->HasObfuscatedConnectionBeenEstablished() ? + _("Yes") : _("No"); + break; + + case 9: + buffer = client->GetUserName().IsEmpty() ? + wxT("?") : + (client->HasDisabledSharedFiles() ? _("Yes") : _("No")); + break; + } + + dc->DrawText( buffer, rect.x, rect.y + 3 ); +} + + +int CClientsView::SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData) +{ + CUpDownClient* client1 = (CUpDownClient*)item1; + CUpDownClient* client2 = (CUpDownClient*)item2; + + // Ascending or decending? + int mode = (sortData & CMuleListCtrl::SORT_DES) ? -1 : 1; + + switch (sortData & CMuleListCtrl::COLUMN_MASK) { + // Sort by Username + case 0: return mode * client1->GetUserName().CmpNoCase( client2->GetUserName() ); + + // Sort by Uploading-state + case 1: return mode * CmpAny( client1->GetUploadState(), client2->GetUploadState() ); + + // Sort by data-uploaded + case 2: + return mode * CmpAny( client1->GetUploadedTotal(), client2->GetUploadedTotal() ); + + // Sort by Downloading-state + case 3: + if( client1->GetDownloadState() == client2->GetDownloadState() ){ + if( client1->IsRemoteQueueFull() && client2->IsRemoteQueueFull() ) { + return mode * 0; + } else if( client1->IsRemoteQueueFull() ) { + return mode * 1; + } else if( client2->IsRemoteQueueFull() ) { + return mode * -1; + } else { + return mode * 0; + } + } + return mode * CmpAny( client1->GetDownloadState(), client2->GetDownloadState() ); + + // Sort by data downloaded + case 4: + return mode * CmpAny( client1->GetDownloadedTotal(), client2->GetDownloadedTotal() ); + + // Sort by client-software + case 5: return mode * CompareVersions(client1, client2); + + // Sort by connection + case 6: return mode * CmpAny( client1->IsConnected(), client2->IsConnected() ); + + // Sort by user-hash + case 7: return mode * CmpAny( client1->GetUserHash(), client2->GetUserHash() ); + + // Sort by Obfuscation state + case 8: return mode * CmpAny( client2->HasObfuscatedConnectionBeenEstablished(), client1->HasObfuscatedConnectionBeenEstablished() ); + + // Sort by Shared Files DISabled + case 9: return mode * CmpAny( client2->HasDisabledSharedFiles(), client1->HasDisabledSharedFiles() ); + + default: + return 0; + } + +} +// File_checked_for_headers diff --git a/src/ClientListCtrl.h b/src/ClientListCtrl.h new file mode 100644 index 00000000..b496efaa --- /dev/null +++ b/src/ClientListCtrl.h @@ -0,0 +1,303 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef CLIENTLISTCTRL_H +#define CLIENTLISTCTRL_H + +#include "MuleListCtrl.h" // Needed for CMuleListCtrl +#include "Constants.h" // Needed for ViewType + + +class CUpDownClient; + + +/** + * This class represents a number of ways of displaying clients, currently + * supporting 3 different "ViewTypes". In other words, this class superseeds + * the 3 widgets that were used to display clients beforehand: + * - CUploadListCtrl + * - CQueueListCtrl + * - CClientListCtrl + * + * This is done in an modular fashion, which means that adding new views is a + * rather trivial task. This approch has the advantage that only one widget exists + * and thus only one actual list is maintained at a time, even though the number + * of calls to the list wont decrease. This however can be trivially fixed if needed. + */ +class CClientListCtrl : public CMuleListCtrl +{ +public: + /** + * Constructor. + * + * @see CMuleListCtrl::CMuleListCtrl + */ + CClientListCtrl( + wxWindow *parent, + wxWindowID winid = -1, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxLC_ICON, + const wxValidator& validator = wxDefaultValidator, + const wxString &name = wxT("clientlistctrl") ); + + /** + * Destructor. + */ + ~CClientListCtrl(); + + + /** + * Returns the current view-type. + * + * @return The viewtype set by the user or the default value. + */ + ViewType GetListView(); + + /** + * Sets another view-type. + * + * @param newView A view-mode different from the current view-type. + * + * Calling this function resets the list and re-initializes it to display + * clients acording to the specifications of that view-mode. If you wish + * to susspend the list, then use vtNone as the argument. + */ + void SetListView( ViewType newView ); + + + /** + * Adds a new client to the list. + * + * @param client The client to be added. + * @param view The view where the client should be displayed. + * + * This function adds the specified client to the list, provided that the + * view parameter matches the currently selected view-mode. + */ + void InsertClient( CUpDownClient* client, ViewType view ); + + /** + * Removes a client from the list. + * + * @param client The client to be removed. + * @param view The view where the client is being displayed. + * + * This function removes the specified client from the list, provided that + * the view parameter matches the currently selected view-mode. + */ + void RemoveClient( CUpDownClient* client, ViewType view ); + + /** + * Updates a client on the list. + * + * @param client The client to be updated. + * @param view The view where the client is being displayed. + * + * This function updates (redraws) the specified client on the list, provided + * that the view parameter matches the currently selected view-mode. Clients + * that are outside the currently visible range will also be ignored. + */ + void UpdateClient( CUpDownClient* client, ViewType view ); + + + /** + * This function toggles between the different view-types. + * + * Calling this function makes the list switch to the next view-type + * available, provided that the current view-type isn't vtNone. The + * sequence is as specified in the ViewType enum, with the exception + * that vtNone will be skipped. + */ + void ToggleView(); + + +private: + /** + * Custom cell-drawing function. + */ + virtual void OnDrawItem(int item, wxDC* dc, const wxRect& rc, const wxRect& rectHL, bool hl); + + /** + * @see CMuleListCtrl::GetTTSText + */ + virtual wxString GetTTSText(unsigned item) const; + + + /** + * Event-handler for displaying a menu at right-clicks. + */ + void OnRightClick( wxMouseEvent& event ); + + /** + * Event-handler for displaying the client-details dialog upon middle-clicks. + */ + void OnMiddleClick( wxListEvent& event ); + + /** + * Event-handler for switching between the different view-types. + */ + void OnChangeView( wxCommandEvent& event ); + + /** + * Event-handler for adding a client on the list to the list of friends. + */ + void OnAddFriend( wxCommandEvent& event ); + + /** + * Event-handler for showing details about a client. + */ + void OnShowDetails( wxCommandEvent& event ); + + /** + * Event-handler for requesting the sharedfiles-list of a client. + */ + void OnViewFiles( wxCommandEvent& event ); + + /** + * Event-handler for sending a message to a specific client. + */ + void OnSendMessage( wxCommandEvent& event ); + + /** + * Event-handler for un-banning a client. + */ + void OnUnbanClient( wxCommandEvent& event ); + + + //! The current view-type. The default value is vtUploading. + ViewType m_viewType; + + //! A pointer to the displayed menu, used to ensure that only one menu is displayed at a time. + wxMenu* m_menu; + + //! A pointer to one of the two most used brushes, cached for performance reasons. + wxBrush* m_hilightBrush; + + //! A pointer to one of the two most used brushes, cached for performance reasons. + wxBrush* m_hilightUnfocusBrush; + + + DECLARE_EVENT_TABLE() +}; + + + +/** + * This is the default view for the list, representing a list of clients recieving files. + * + * This struct contains the functions needed to realize the uploading-view. It contains + * the functions used by the CClientListCtrl to prepare, sort and draw the list when the + * Uploading-view is enabled. + */ +struct CUploadingView +{ + /** + * Initializes the view. + * + * @param list The list which wants to make use of the view. + * + * This function is called when the CClientListCtrl changes to this view-type, + * and it is responsible for setting the initial columns and contents. By the + * time this function is called, the list will already be completly empty. + */ + static void Initialize( CClientListCtrl* list ); + + /** + * Draws a specific cell. + * + * @param client The client used as a reference. + * @param column The column to be drawn. + * @param dc The device-context to draw onto. + * @param rect The rectangle to draw in. + * + * This function is used to draw the contents of each row, and is called for + * every visible column. + */ + static void DrawCell( CUpDownClient* client, int column, wxDC* dc, const wxRect& rect ); + + /** + * This is the sorter-function used by the listctrl to sort the contents. + * + * @see wxListCtrl::SortItems + */ + static int wxCALLBACK SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData); + + /** + * Helperfunction which draws a simple bar-span over the clients requested file. + */ + static void DrawStatusBar( CUpDownClient* client, wxDC* dc, const wxRect &rect ); +}; + + +/** + * This struct contains the functions needed to realize the Queued-clients view. + * + * @see CUploadingView + */ +struct CQueuedView +{ + /** + * @see CUploadingView::Initialize + */ + static void Initialize( CClientListCtrl* list ); + + /** + * @see CUploadingView::DrawCell + */ + static void DrawCell( CUpDownClient* client, int column, wxDC* dc, const wxRect& rect ); + + /** + * @see CUploadingView::SortProc + */ + static int wxCALLBACK SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData); +}; + + +/** + * This struct contains the functions needed to realize the Clients view. + * + * @see CUploadingView + */ +struct CClientsView +{ + /** + * @see CUploadingView::Initialize + */ + static void Initialize( CClientListCtrl* list ); + + /** + * @see CUploadingView::DrawCell + */ + static void DrawCell( CUpDownClient* client, int column, wxDC* dc, const wxRect& rect ); + + /** + * @see CUploadingView::SortProc + */ + static int wxCALLBACK SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData); +}; + +#endif +// File_checked_for_headers diff --git a/src/ClientTCPSocket.cpp b/src/ClientTCPSocket.cpp new file mode 100644 index 00000000..01f7a787 --- /dev/null +++ b/src/ClientTCPSocket.cpp @@ -0,0 +1,2108 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "ClientTCPSocket.h" // Interface declarations + +#include +#include +#include // Sometimes we reply with UDP packets. +#include +#include + +#include "Preferences.h" // Needed for thePrefs +#include "Packet.h" // Needed for CPacket +#include "Statistics.h" // Needed for theStats +#include "Logger.h" // Neeed for logRemoteClient +#include "updownclient.h" // Needed for CUpDownClient +#include // Needed for CFormat +#include "amule.h" // Needed for theApp +#include "SharedFileList.h" // Needed for CSharedFileList +#include "ClientList.h" // Needed for CClientList +#include "UploadQueue.h" // Needed for CUploadQueue +#include "ClientUDPSocket.h" // Needed for CClientUDPSocket +#include "PartFile.h" // Needed for CPartFile +#include "MemFile.h" // Needed for CMemFile +#include "kademlia/kademlia/Kademlia.h" // Needed for CKademlia::Kademlia +#include "kademlia/kademlia/Prefs.h" // Needed for CKademlia::CPrefs +#include "DownloadQueue.h" // Needed for CDownloadQueue +#include "Server.h" // Needed for CServer +#include "ServerList.h" // Needed for CServerList +#include "IPFilter.h" // Needed for CIPFilter +#include "ListenSocket.h" // Needed for CListenSocket +#include "GuiEvents.h" // Needed for Notify_* + + +//#define __PACKET_RECV_DUMP__ + +//------------------------------------------------------------------------------ +// CClientTCPSocketHandler +//------------------------------------------------------------------------------ + +class CClientTCPSocketHandler: public wxEvtHandler +{ +public: + CClientTCPSocketHandler() {}; + +private: + void ClientTCPSocketHandler(wxSocketEvent& event); + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(CClientTCPSocketHandler, wxEvtHandler) + EVT_SOCKET(ID_CLIENTTCPSOCKET_EVENT, CClientTCPSocketHandler::ClientTCPSocketHandler) +END_EVENT_TABLE() + +void CClientTCPSocketHandler::ClientTCPSocketHandler(wxSocketEvent& event) +{ + CClientTCPSocket *socket = dynamic_cast(event.GetSocket()); + wxASSERT(socket); + if (!socket) { + return; + } + + if (socket->OnDestroy() || socket->ForDeletion()) { + return; + } + + switch(event.GetSocketEvent()) { + case wxSOCKET_LOST: + socket->OnError(0xFEFF /* SOCKET_LOST is not an error */); + break; + case wxSOCKET_INPUT: + socket->OnReceive(0); + break; + case wxSOCKET_OUTPUT: + socket->OnSend(0); + break; + case wxSOCKET_CONNECTION: + // connection stablished, nothing to do about it? + socket->OnConnect(socket->Error() ? socket->LastError() : 0); + break; + default: + // Nothing should arrive here... + wxASSERT(0); + break; + } +} + +// +// There can be only one. :) +// +static CClientTCPSocketHandler g_clientReqSocketHandler; + + +//------------------------------------------------------------------------------ +// CClientTCPSocket +//------------------------------------------------------------------------------ + +CClientTCPSocket::CClientTCPSocket(CUpDownClient* in_client, const CProxyData *ProxyData) + : CEMSocket(ProxyData) +{ + SetClient(in_client); + if (in_client) { + m_remoteip = wxUINT32_SWAP_ALWAYS(in_client->GetUserIDHybrid()); + } else { + m_remoteip = 0; + } + + ResetTimeOutTimer(); + m_ForDeletion = false; + + SetEventHandler(g_clientReqSocketHandler, ID_CLIENTTCPSOCKET_EVENT); + SetNotify( + wxSOCKET_CONNECTION_FLAG | + wxSOCKET_INPUT_FLAG | + wxSOCKET_OUTPUT_FLAG | + wxSOCKET_LOST_FLAG); + Notify(true); + + theApp->listensocket->AddSocket(this); + theApp->listensocket->AddConnection(); +} + +CClientTCPSocket::~CClientTCPSocket() +{ + // remove event handler + SetNotify(0); + Notify(false); + + if (m_client) { + m_client->SetSocket( NULL ); + } + m_client = NULL; + + if (theApp->listensocket && !theApp->listensocket->OnShutdown()) { + theApp->listensocket->RemoveSocket(this); + } +} + +bool CClientTCPSocket::InitNetworkData() { + wxASSERT(!m_remoteip); + wxASSERT(!m_client); + amuleIPV4Address addr; + GetPeer(addr); + m_remoteip = StringIPtoUint32(addr.IPAddress()); + + MULE_CHECK(m_remoteip, false); + + if (theApp->ipfilter->IsFiltered(m_remoteip)) { + AddDebugLogLineM(false, logClient, wxT("Denied connection from ") + addr.IPAddress() + wxT("(Filtered IP)")); + return false; + } else { + AddDebugLogLineM(false, logClient, wxT("Accepted connection from ") + addr.IPAddress()); + return true; + } +} + +void CClientTCPSocket::ResetTimeOutTimer() +{ + timeout_timer = ::GetTickCount(); +} + + +bool CClientTCPSocket::CheckTimeOut() +{ + // 0.42x + uint32 uTimeout = GetTimeOut(); + if (m_client) { + + if (m_client->GetKadState() == KS_CONNECTED_BUDDY) { + //We originally ignored the timeout here for buddies. + //This was a stupid idea on my part. There is now a ping/pong system + //for buddies. This ping/pong system now prevents timeouts. + //This release will allow lowID clients with KadVersion 0 to remain connected. + //But a soon future version needs to allow these older clients to time out to prevent dead connections from continuing. + //JOHNTODO: Don't forget to remove backward support in a future release. + if ( m_client->GetKadVersion() == 0 ) { + return false; + } + + uTimeout += MIN2MS(15); + } + + if (m_client->GetChatState() != MS_NONE) { + uTimeout += CONNECTION_TIMEOUT; + } + } + + if (::GetTickCount() - timeout_timer > uTimeout){ + timeout_timer = ::GetTickCount(); + Disconnect(wxT("Timeout")); + return true; + } + + return false; +} + + +void CClientTCPSocket::SetClient(CUpDownClient* pClient) +{ + m_client = pClient; + if (m_client) { + m_client->SetSocket( this ); + } +} + + +void CClientTCPSocket::OnClose(int nErrorCode) +{ + // 0.42x + wxASSERT(theApp->listensocket->IsValidSocket(this)); + CEMSocket::OnClose(nErrorCode); + if (nErrorCode) { + Disconnect(wxString::Format(wxT("Closed: %u"), nErrorCode)); + } else { + Disconnect(wxT("Close")); + } +} + + +void CClientTCPSocket::Disconnect(const wxString& strReason) +{ + byConnected = ES_DISCONNECTED; + if (m_client) { + if (m_client->Disconnected(strReason, true)) { + // Somehow, Safe_Delete() is beeing called by Disconnected(), + // or any other function that sets m_client to NULL, + // so we must check m_client first. + if (m_client) { + m_client->SetSocket( NULL ); + m_client->Safe_Delete(); + } + } + m_client = NULL; + } + + Safe_Delete(); +} + + +void CClientTCPSocket::Safe_Delete() +{ + if ( !ForDeletion() && !OnDestroy() ) { + // Paranoia is back. + SetNotify(0); + Notify(false); + // lfroen: first of all - stop handler + m_ForDeletion = true; + + if (m_client) { + m_client->SetSocket( NULL ); + m_client = NULL; + } + + byConnected = ES_DISCONNECTED; + Close(); // Destroy is suposed to call Close(), but.. it doesn't hurt. + Destroy(); + } +} + + +bool CClientTCPSocket::ProcessPacket(const byte* buffer, uint32 size, uint8 opcode) +{ + #ifdef __PACKET_RECV_DUMP__ + //printf("Rec: OPCODE %x \n",opcode); + DumpMem(buffer, size); + #endif + if (!m_client && opcode != OP_HELLO) { + throw wxString(wxT("Asks for something without saying hello")); + } else if (m_client && opcode != OP_HELLO && opcode != OP_HELLOANSWER) { + m_client->CheckHandshakeFinished(OP_EDONKEYPROT, opcode); + } + + switch(opcode) { + case OP_HELLOANSWER: { // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_HELLOANSWER from ") + m_client->GetFullIP()); + theStats::AddDownOverheadOther(size); + m_client->ProcessHelloAnswer(buffer, size); + + // start secure identification, if + // - we have received OP_EMULEINFO and OP_HELLOANSWER (old eMule) + // - we have received eMule-OP_HELLOANSWER (new eMule) + if (m_client->GetInfoPacketsReceived() == IP_BOTH) { + m_client->InfoPacketsReceived(); + } + + // Socket might die because of sending in InfoPacketsReceived, so check + if (m_client) { + m_client->ConnectionEstablished(); + } + + // Socket might die on ConnectionEstablished somehow. Check it. + if (m_client) { + Notify_UploadCtrlRefreshClient( m_client ); + } + + break; + } + case OP_HELLO: { // 0.43b + + theStats::AddDownOverheadOther(size); + bool bNewClient = !m_client; + if (bNewClient) { + // create new client to save standart informations + m_client = new CUpDownClient(this); + } + + // Do not move up! + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_HELLO from ") + m_client->GetFullIP() ); + + bool bIsMuleHello = false; + + try{ + bIsMuleHello = m_client->ProcessHelloPacket(buffer, size); + } catch(...) { + if (bNewClient && m_client) { + // Don't let CUpDownClient::Disconnected be processed for a client which is not in the list of clients. + m_client->Safe_Delete(); + m_client = NULL; + } + throw; + } + + if (thePrefs::ParanoidFilter() && !IsLowID(m_client->GetUserIDHybrid()) && (GetRemoteIP() != wxUINT32_SWAP_ALWAYS(m_client->GetUserIDHybrid()))) { + wxString reason = wxT("Client claims a different IP from the one we received the hello packet from: "); + reason += Uint32toStringIP(wxUINT32_SWAP_ALWAYS(m_client->GetUserIDHybrid())) + wxT(" / ") + Uint32toStringIP(GetRemoteIP()); + AddDebugLogLineM(false, logClient, reason); + if (bNewClient) { + m_client->Safe_Delete(); + m_client = NULL; + } + Disconnect(wxT("Paranoid disconecting: ") + reason); + return false; + } + + // if IP is filtered, dont reply but disconnect... + if (theApp->ipfilter->IsFiltered(m_client->GetIP())) { + if (bNewClient) { + m_client->Safe_Delete(); + m_client = NULL; + } + Disconnect(wxT("IPFilter")); + return false; + } + + wxASSERT(m_client); + + // now we check if we now this client already. if yes this socket will + // be attached to the known client, the new client will be deleted + // and the var. "client" will point to the known client. + // if not we keep our new-constructed client ;) + if (theApp->clientlist->AttachToAlreadyKnown(&m_client,this)) { + // update the old client informations + bIsMuleHello = m_client->ProcessHelloPacket(buffer, size); + } else { + theApp->clientlist->AddClient(m_client); + m_client->SetCommentDirty(); + } + Notify_UploadCtrlRefreshClient( m_client ); + // send a response packet with standart informations + if ((m_client->GetHashType() == SO_EMULE) && !bIsMuleHello) { + m_client->SendMuleInfoPacket(false); + } + + // Client might die from Sending in SendMuleInfoPacket, so check + if ( m_client ) { + m_client->SendHelloAnswer(); + } + + // Kry - If the other side supports it, send OS_INFO + // Client might die from Sending in SendHelloAnswer, so check + if (m_client && m_client->GetOSInfoSupport()) { + m_client->SendMuleInfoPacket(false,true); // Send the OS Info tag on the recycled Mule Info + } + + // Client might die from Sending in SendMuleInfoPacket, so check + if ( m_client ) { + m_client->ConnectionEstablished(); + } + + // start secure identification, if + // - we have received eMule-OP_HELLO (new eMule) + if (m_client && m_client->GetInfoPacketsReceived() == IP_BOTH) { + m_client->InfoPacketsReceived(); + } + + break; + } + case OP_REQUESTFILENAME: { // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_REQUESTFILENAME from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadFileRequest(size); + // IP banned, no answer for this request + if (m_client->IsBanned()) { + break; + } + if (size >= 16) { + if (!m_client->GetWaitStartTime()) { + m_client->SetWaitStartTime(); + } + CMemFile data_in(buffer, size); + CMD4Hash reqfilehash = data_in.ReadHash(); + CKnownFile *reqfile = theApp->sharedfiles->GetFileByID(reqfilehash); + if ( reqfile == NULL ) { + reqfile = theApp->downloadqueue->GetFileByID(reqfilehash); + if ( !( reqfile != NULL && reqfile->GetFileSize() > PARTSIZE ) ) { + break; + } + } + // if we are downloading this file, this could be a new source + // no passive adding of files with only one part + if (reqfile->IsPartFile() && reqfile->GetFileSize() > PARTSIZE) { + if (thePrefs::GetMaxSourcePerFile() > + ((CPartFile*)reqfile)->GetSourceCount()) { + theApp->downloadqueue->CheckAndAddKnownSource((CPartFile*)reqfile, m_client); + } + } + + // check to see if this is a new file they are asking for + if (m_client->GetUploadFileID() != reqfilehash) { + m_client->SetCommentDirty(); + } + + m_client->SetUploadFileID(reqfile); + m_client->ProcessExtendedInfo(&data_in, reqfile); + + // send filename etc + CMemFile data_out(128); + data_out.WriteHash(reqfile->GetFileHash()); + + // Since it's for somebody else to see, we need to send the prettified + // filename, rather than the (possibly) mangled actual filename. + data_out.WriteString(reqfile->GetFileName().GetPrintable(), m_client->GetUnicodeSupport()); + + CPacket* packet = new CPacket(data_out, OP_EDONKEYPROT, OP_REQFILENAMEANSWER); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_REQFILENAMEANSWER to ") + m_client->GetFullIP() ); + SendPacket(packet,true); + + // SendPacket might kill the socket, so check + if (m_client) + m_client->SendCommentInfo(reqfile); + + break; + } + throw wxString(wxT("Invalid OP_REQUESTFILENAME packet size")); + break; + } + case OP_SETREQFILEID: { // 0.43b EXCEPT track of bad clients + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_SETREQFILEID from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadFileRequest(size); + + if (m_client->IsBanned()) { + break; + } + + // DbT:FileRequest + if (size == 16) { + if (!m_client->GetWaitStartTime()) { + m_client->SetWaitStartTime(); + } + + const CMD4Hash fileID(buffer); + CKnownFile *reqfile = theApp->sharedfiles->GetFileByID(fileID); + if ( reqfile == NULL ) { + reqfile = theApp->downloadqueue->GetFileByID(fileID); + if ( !( reqfile != NULL && reqfile->GetFileSize() > PARTSIZE ) ) { + CPacket* replypacket = new CPacket(OP_FILEREQANSNOFIL, 16, OP_EDONKEYPROT); + replypacket->Copy16ToDataBuffer(fileID.GetHash()); + theStats::AddUpOverheadFileRequest(replypacket->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_FILERE to ") + m_client->GetFullIP() ); + SendPacket(replypacket, true); + break; + } + } + + // check to see if this is a new file they are asking for + if (m_client->GetUploadFileID() != fileID) { + m_client->SetCommentDirty(); + } + + m_client->SetUploadFileID(reqfile); + // send filestatus + CMemFile data(16+16); + data.WriteHash(reqfile->GetFileHash()); + if (reqfile->IsPartFile()) { + ((CPartFile*)reqfile)->WritePartStatus(&data); + } else { + data.WriteUInt16(0); + } + CPacket* packet = new CPacket(data, OP_EDONKEYPROT, OP_FILESTATUS); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_FILESTATUS to ") + m_client->GetFullIP() ); + SendPacket(packet, true); + break; + } + throw wxString(wxT("Invalid OP_FILEREQUEST packet size")); + break; + // DbT:End + } + + case OP_FILEREQANSNOFIL: { // 0.43b protocol, lacks ZZ's download manager on swap + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_FILEREQANSNOFIL from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadFileRequest(size); + if (size == 16) { + // if that client does not have my file maybe has another different + CPartFile* reqfile = theApp->downloadqueue->GetFileByID(CMD4Hash(buffer)); + if ( reqfile) { + reqfile->AddDeadSource( m_client ); + } else { + break; + } + + // we try to swap to another file ignoring no needed parts files + switch (m_client->GetDownloadState()) { + case DS_CONNECTED: + case DS_ONQUEUE: + case DS_NONEEDEDPARTS: + if (!m_client->SwapToAnotherFile(true, true, true, NULL)) { + theApp->downloadqueue->RemoveSource(m_client); + } + break; + } + break; + } + throw wxString(wxT("Invalid OP_FILEREQUEST packet size")); + break; + } + + case OP_REQFILENAMEANSWER: { // 0.43b except check for bad clients + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_REQFILENAMEANSWER from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadFileRequest(size); + CMemFile data(buffer, size); + CMD4Hash hash = data.ReadHash(); + const CPartFile* file = theApp->downloadqueue->GetFileByID(hash); + m_client->ProcessFileInfo(&data, file); + break; + } + + case OP_FILESTATUS: { // 0.43b except check for bad clients + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_FILESTATUS from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadFileRequest(size); + CMemFile data(buffer, size); + CMD4Hash hash = data.ReadHash(); + const CPartFile* file = theApp->downloadqueue->GetFileByID(hash); + m_client->ProcessFileStatus(false, &data, file); + break; + } + + case OP_STARTUPLOADREQ: { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_STARTUPLOADREQ from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadFileRequest(size); + + if (!m_client->CheckHandshakeFinished(OP_EDONKEYPROT, opcode)) { + break; + } + + m_client->CheckForAggressive(); + if ( m_client->IsBanned() ) { + break; + } + + if (size == 16) { + const CMD4Hash fileID(buffer); + CKnownFile* reqfile = theApp->sharedfiles->GetFileByID(fileID); + if (reqfile) { + if (m_client->GetUploadFileID() != fileID) { + m_client->SetCommentDirty(); + } + m_client->SetUploadFileID(reqfile); + m_client->SendCommentInfo(reqfile); + + // Socket might die because of SendCommentInfo, so check + if (m_client) + theApp->uploadqueue->AddClientToQueue(m_client); + } + } + break; + } + + case OP_QUEUERANK: { // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_QUEUERANK from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadFileRequest(size); + CMemFile data(buffer, size); + uint32 rank = data.ReadUInt32(); + + m_client->SetRemoteQueueRank(rank); + break; + } + + case OP_ACCEPTUPLOADREQ: { // 0.42e (xcept khaos stats) + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_ACCEPTUPLOADREQ from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadFileRequest(size); + if (m_client->GetRequestFile() && !m_client->GetRequestFile()->IsStopped() && (m_client->GetRequestFile()->GetStatus()==PS_READY || m_client->GetRequestFile()->GetStatus()==PS_EMPTY)) { + if (m_client->GetDownloadState() == DS_ONQUEUE ) { + m_client->SetDownloadState(DS_DOWNLOADING); + m_client->SetLastPartAsked(0xffff); // Reset current downloaded Chunk // Maella -Enhanced Chunk Selection- (based on jicxicmic) + m_client->SendBlockRequests(); + } + } else { + if (!m_client->GetSentCancelTransfer()) { + CPacket* packet = new CPacket(OP_CANCELTRANSFER, 0, OP_EDONKEYPROT); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_CANCELTRANSFER to ") + m_client->GetFullIP() ); + m_client->SendPacket(packet,true,true); + + // SendPacket can cause the socket to die, so check + if (m_client) + m_client->SetSentCancelTransfer(1); + } + + if (m_client) + m_client->SetDownloadState((m_client->GetRequestFile()==NULL || m_client->GetRequestFile()->IsStopped()) ? DS_NONE : DS_ONQUEUE); + } + break; + } + + case OP_REQUESTPARTS: { // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_REQUESTPARTS from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadFileRequest(size); + + m_client->ProcessRequestPartsPacket(buffer, size, false); + + break; + } + + case OP_CANCELTRANSFER: { // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_CANCELTRANSFER from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadFileRequest(size); + theApp->uploadqueue->RemoveFromUploadQueue(m_client); + if ( CLogger::IsEnabled( logClient ) ) { + AddDebugLogLineM( false, logClient, m_client->GetUserName() + wxT(": Upload session ended due canceled transfer.")); + } + break; + } + + case OP_END_OF_DOWNLOAD: { // 0.43b except check for bad clients + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_END_OF_DOWNLOAD from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadFileRequest(size); + if (size>=16 && m_client->GetUploadFileID() == CMD4Hash(buffer)) { + theApp->uploadqueue->RemoveFromUploadQueue(m_client); + if ( CLogger::IsEnabled( logClient ) ) { + AddDebugLogLineM( false, logClient, m_client->GetUserName() + wxT(": Upload session ended due ended transfer.")); + } + } + break; + } + + case OP_HASHSETREQUEST: { // 0.43b except check for bad clients + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_HASHSETREQUEST from ") + m_client->GetFullIP() ); + + + theStats::AddDownOverheadFileRequest(size); + if (size != 16) { + throw wxString(wxT("Invalid OP_HASHSETREQUEST packet size")); + } + m_client->SendHashsetPacket(CMD4Hash(buffer)); + break; + } + + case OP_HASHSETANSWER: { // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_HASHSETANSWER from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadFileRequest(size); + m_client->ProcessHashSet(buffer, size); + break; + } + + case OP_SENDINGPART: { // 0.47a + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_SENDINGPART from ") + m_client->GetFullIP() ); + + if ( m_client->GetRequestFile() && + !m_client->GetRequestFile()->IsStopped() && + (m_client->GetRequestFile()->GetStatus() == PS_READY || m_client->GetRequestFile()->GetStatus()==PS_EMPTY)) { + + m_client->ProcessBlockPacket(buffer, size, false, false); + + if ( m_client && + ( m_client->GetRequestFile()->IsStopped() || + m_client->GetRequestFile()->GetStatus() == PS_PAUSED || + m_client->GetRequestFile()->GetStatus() == PS_ERROR) ) { + if (!m_client->GetSentCancelTransfer()) { + CPacket* packet = new CPacket(OP_CANCELTRANSFER, 0, OP_EDONKEYPROT); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_CANCELTRANSFER to ") + m_client->GetFullIP() ); + m_client->SendPacket(packet,true,true); + + // Socket might die because of SendPacket, so check + if (m_client) + m_client->SetSentCancelTransfer(1); + } + + if (m_client) + m_client->SetDownloadState(m_client->GetRequestFile()->IsStopped() ? DS_NONE : DS_ONQUEUE); + } + } else { + if (!m_client->GetSentCancelTransfer()) { + CPacket* packet = new CPacket(OP_CANCELTRANSFER, 0, OP_EDONKEYPROT); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_CANCELTRANSFER to ") + m_client->GetFullIP() ); + m_client->SendPacket(packet,true,true); + + // Socket might die because of SendPacket, so check + m_client->SetSentCancelTransfer(1); + } + m_client->SetDownloadState((m_client->GetRequestFile()==NULL || m_client->GetRequestFile()->IsStopped()) ? DS_NONE : DS_ONQUEUE); + } + break; + } + + case OP_OUTOFPARTREQS: { // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_OUTOFPARTREQS from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadFileRequest(size); + if (m_client->GetDownloadState() == DS_DOWNLOADING) { + m_client->SetDownloadState(DS_ONQUEUE); + } + break; + } + + case OP_CHANGE_CLIENT_ID: { // Kad reviewed + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_CHANGE_CLIENT_ID from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadOther(size); + CMemFile data(buffer, size); + uint32 nNewUserID = data.ReadUInt32(); + uint32 nNewServerIP = data.ReadUInt32(); + + if (IsLowID(nNewUserID)) { // client changed server and gots a LowID + CServer* pNewServer = theApp->serverlist->GetServerByIP(nNewServerIP); + if (pNewServer != NULL){ + m_client->SetUserIDHybrid(nNewUserID); // update UserID only if we know the server + m_client->SetServerIP(nNewServerIP); + m_client->SetServerPort(pNewServer->GetPort()); + } + } else if (nNewUserID == m_client->GetIP()) { // client changed server and gots a HighID(IP) + m_client->SetUserIDHybrid(wxUINT32_SWAP_ALWAYS(nNewUserID)); + CServer* pNewServer = theApp->serverlist->GetServerByIP(nNewServerIP); + if (pNewServer != NULL){ + m_client->SetServerIP(nNewServerIP); + m_client->SetServerPort(pNewServer->GetPort()); + } + } + + break; + } + + case OP_CHANGE_SLOT:{ // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_CHANGE_SLOT from ") + m_client->GetFullIP() ); + + // sometimes sent by Hybrid + theStats::AddDownOverheadOther(size); + break; + } + + case OP_MESSAGE: { // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_MESSAGE from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadOther(size); + + CMemFile message_file(buffer, size); + + wxString message = message_file.ReadString(m_client->GetUnicodeSupport()); + if (IsMessageFiltered(message, m_client)) { + AddLogLineM( true, CFormat(_("Message filtered from '%s' (IP:%s)")) % m_client->GetUserName() % m_client->GetFullIP()); + } else { + AddLogLineM( true, CFormat(_("New message from '%s' (IP:%s)")) % m_client->GetUserName() % m_client->GetFullIP()); + + Notify_ChatProcessMsg(GUI_ID(m_client->GetIP(),m_client->GetUserPort()), m_client->GetUserName() + wxT("|") + message); + } + break; + } + + case OP_ASKSHAREDFILES: { // 0.43b (well, er, it does the same, but in our own way) + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_ASKSHAREDFILES from ") + m_client->GetFullIP() ); + + // client wants to know what we have in share, let's see if we allow him to know that + theStats::AddDownOverheadOther(size); + // IP banned, no answer for this request + if (m_client->IsBanned()) { + break; + } + + if (thePrefs::CanSeeShares() == vsfaEverybody || (thePrefs::CanSeeShares() == vsfaFriends && m_client->IsFriend())) { + AddLogLineM( true, CFormat( _("User %s (%u) requested your sharedfiles-list -> Accepted")) + % m_client->GetUserName() + % m_client->GetUserIDHybrid() ); + + std::vector list; + theApp->sharedfiles->CopyFileList(list); + + CMemFile tempfile(80); + tempfile.WriteUInt32(list.size()); + for (unsigned i = 0; i < list.size(); ++i) { + if (!list[i]->IsLargeFile() || m_client->SupportsLargeFiles()) { + theApp->sharedfiles->CreateOfferedFilePacket(list[i], &tempfile, NULL, m_client); + } + } + + // create a packet and send it + CPacket* replypacket = new CPacket(tempfile, OP_EDONKEYPROT, OP_ASKSHAREDFILESANSWER); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_ASKSHAREDFILESANSWER to ") + m_client->GetFullIP() ); + theStats::AddUpOverheadOther(replypacket->GetPacketSize()); + SendPacket(replypacket, true, true); + } else { + AddLogLineM( true, CFormat( _("User %s (%u) requested your sharedfiles-list -> Denied")) + % m_client->GetUserName() + % m_client->GetUserIDHybrid() ); + + CPacket* replypacket = new CPacket(OP_ASKSHAREDDENIEDANS, 0, OP_EDONKEYPROT); + theStats::AddUpOverheadOther(replypacket->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_ASKSHAREDDENIEDANS to ") + m_client->GetFullIP() ); + SendPacket(replypacket, true, true); + } + + break; + } + + case OP_ASKSHAREDFILESANSWER: { // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_ASKSHAREDFILESANSWER from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadOther(size); + wxString EmptyStr; + m_client->ProcessSharedFileList(buffer, size, EmptyStr); + break; + } + + case OP_ASKSHAREDDIRS: { // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_ASKSHAREDDIRS from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadOther(size); + wxASSERT( size == 0 ); + // IP banned, no answer for this request + if (m_client->IsBanned()) { + break; + } + if ((thePrefs::CanSeeShares()==vsfaEverybody) || ((thePrefs::CanSeeShares()==vsfaFriends) && m_client->IsFriend())) { + AddLogLineM( true, CFormat( _("User %s (%u) requested your shareddirectories-list -> Accepted") ) + % m_client->GetUserName() + % m_client->GetUserIDHybrid() ); + + // This list will contain all (unique) folders. + std::list foldersToSend; + + // The shared folders + const unsigned folderCount = theApp->glob_prefs->shareddir_list.size(); + for (unsigned i = 0; i < folderCount; ++i) { + foldersToSend.push_back(theApp->glob_prefs->shareddir_list[i]); + } + + // ... the categories folders ... (category 0 -> incoming) + for (unsigned i = 0; i < theApp->glob_prefs->GetCatCount(); ++i) { + foldersToSend.push_back(theApp->glob_prefs->GetCategory(i)->path); + } + + // ... and the Magic thing from the eDonkey Hybrids... + foldersToSend.push_back(CPath(OP_INCOMPLETE_SHARED_FILES)); + + // Strip duplicates + foldersToSend.sort(); + foldersToSend.unique(); + + // Send packet. + CMemFile tempfile(80); + tempfile.WriteUInt32(foldersToSend.size()); + + std::list::iterator it = foldersToSend.begin(); + for (; it != foldersToSend.end(); ++it) { + // We need to send the 'raw' filename, so we can recognize it again. + tempfile.WriteString(it->GetRaw(), m_client->GetUnicodeSupport()); + } + + CPacket* replypacket = new CPacket(tempfile, OP_EDONKEYPROT, OP_ASKSHAREDDIRSANS); + theStats::AddUpOverheadOther(replypacket->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_ASKSHAREDDIRSANS to ") + m_client->GetFullIP() ); + SendPacket(replypacket, true, true); + } else { + AddLogLineM( true, CFormat( _("User %s (%u) requested your shareddirectories-list -> Denied") ) + % m_client->GetUserName() + % m_client->GetUserIDHybrid() ); + + CPacket* replypacket = new CPacket(OP_ASKSHAREDDENIEDANS, 0, OP_EDONKEYPROT); + theStats::AddUpOverheadOther(replypacket->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_ASKSHAREDDENIEDANS to ") + m_client->GetFullIP() ); + SendPacket(replypacket, true, true); + } + + break; + } + + case OP_ASKSHAREDFILESDIR: { // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_ASKSHAREDFILESDIR from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadOther(size); + // IP banned, no answer for this request + if (m_client->IsBanned()) { + break; + } + CMemFile data(buffer, size); + + wxString strReqDir = data.ReadString(m_client->GetUnicodeSupport()); + if (thePrefs::CanSeeShares()==vsfaEverybody || (thePrefs::CanSeeShares()==vsfaFriends && m_client->IsFriend())) { + AddLogLineM( true, CFormat(_("User %s (%u) requested your sharedfiles-list for directory %s -> accepted")) % m_client->GetUserName() % m_client->GetUserIDHybrid() % strReqDir); + wxASSERT( data.GetPosition() == data.GetLength() ); + + CKnownFilePtrList list; + + if (strReqDir == OP_INCOMPLETE_SHARED_FILES) { + // get all shared files from download queue + int iQueuedFiles = theApp->downloadqueue->GetFileCount(); + for (int i = 0; i < iQueuedFiles; i++) { + CPartFile* pFile = theApp->downloadqueue->GetFileByIndex(i); + if (pFile == NULL || pFile->GetStatus(true) != PS_READY) { + continue; + } + + list.push_back(pFile); + } + } else { + theApp->sharedfiles->GetSharedFilesByDirectory(strReqDir, list); + } + + CMemFile tempfile(80); + tempfile.WriteString(strReqDir, m_client->GetUnicodeSupport()); + tempfile.WriteUInt32(list.size()); + + while (!list.empty()) { + if (!list.front()->IsLargeFile() || m_client->SupportsLargeFiles()) { + theApp->sharedfiles->CreateOfferedFilePacket(list.front(), &tempfile, NULL, m_client); + } + + list.pop_front(); + } + + CPacket* replypacket = new CPacket(tempfile, OP_EDONKEYPROT, OP_ASKSHAREDFILESDIRANS); + theStats::AddUpOverheadOther(replypacket->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_ASKSHAREDFILESDIRANS to ") + m_client->GetFullIP() ); + SendPacket(replypacket, true, true); + } else { + AddLogLineM( true, CFormat(_("User %s (%u) requested your sharedfiles-list for directory %s -> denied")) % m_client->GetUserName() % m_client->GetUserIDHybrid() % strReqDir); + + CPacket* replypacket = new CPacket(OP_ASKSHAREDDENIEDANS, 0, OP_EDONKEYPROT); + theStats::AddUpOverheadOther(replypacket->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_ASKSHAREDDENIEDANS to ") + m_client->GetFullIP() ); + SendPacket(replypacket, true, true); + } + break; + } + + case OP_ASKSHAREDDIRSANS:{ // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_ASKSHAREDDIRSANS from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadOther(size); + if (m_client->GetFileListRequested() == 1){ + CMemFile data(buffer, size); + uint32 uDirs = data.ReadUInt32(); + for (uint32 i = 0; i < uDirs; i++){ + wxString strDir = data.ReadString(m_client->GetUnicodeSupport()); + AddLogLineM( true, CFormat( _("User %s (%u) shares directory %s") ) + % m_client->GetUserName() + % m_client->GetUserIDHybrid() + % strDir ); + + CMemFile tempfile(80); + tempfile.WriteString(strDir, m_client->GetUnicodeSupport()); + CPacket* replypacket = new CPacket(tempfile, OP_EDONKEYPROT, OP_ASKSHAREDFILESDIR); + theStats::AddUpOverheadOther(replypacket->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_ASKSHAREDFILESD to ") + m_client->GetFullIP() ); + SendPacket(replypacket, true, true); + } + wxASSERT( data.GetPosition() == data.GetLength() ); + m_client->SetFileListRequested(uDirs); + } else { + AddLogLineM( true, CFormat( _("User %s (%u) sent unrequested shared dirs.") ) + % m_client->GetUserName() + % m_client->GetUserIDHybrid() ); + } + break; + } + + case OP_ASKSHAREDFILESDIRANS: { // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_ASKSHAREDFILESDIRANS from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadOther(size); + CMemFile data(buffer, size); + wxString strDir = data.ReadString(m_client->GetUnicodeSupport()); + + if (m_client->GetFileListRequested() > 0){ + AddLogLineM( true, CFormat( _("User %s (%u) sent sharedfiles-list for directory %s") ) + % m_client->GetUserName() + % m_client->GetUserIDHybrid() + % strDir ); + + m_client->ProcessSharedFileList(buffer + data.GetPosition(), size - data.GetPosition(), strDir); + if (m_client->GetFileListRequested() == 0) { + AddLogLineM( true, CFormat( _("User %s (%u) finished sending sharedfiles-list") ) + % m_client->GetUserName() + % m_client->GetUserIDHybrid() ); + } + } else { + AddLogLineM( true, CFormat( _("User %s (%u) sent unwanted sharedfiles-list") ) + % m_client->GetUserName() + % m_client->GetUserIDHybrid() ); + } + break; + } + + case OP_ASKSHAREDDENIEDANS: + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_ASKSHAREDDENIEDANS from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadOther(size); + wxASSERT( size == 0 ); + AddLogLineM( true, CFormat( _("User %s (%u) denied access to shared directories/files list") ) + % m_client->GetUserName() + % m_client->GetUserIDHybrid() ); + + m_client->SetFileListRequested(0); + break; + + default: + theStats::AddDownOverheadOther(size); + AddDebugLogLineM( false, logRemoteClient, wxString::Format(wxT("Edonkey packet: unknown opcode: %i %x from "), opcode, opcode) + m_client->GetFullIP()); + return false; + } + + return true; +} + + +bool CClientTCPSocket::ProcessExtPacket(const byte* buffer, uint32 size, uint8 opcode) +{ + #ifdef __PACKET_RECV_DUMP__ + //printf("Rec: OPCODE %x \n",opcode); + DumpMem(buffer,size); + #endif + + // 0.42e - except the catchs on mem exception and file exception + if (!m_client) { + throw wxString(wxT("Unknown clients sends extended protocol packet")); + } + /* + if (!client->CheckHandshakeFinished(OP_EMULEPROT, opcode)) { + // Here comes a extended packet without finishing the hanshake. + // IMHO, we should disconnect the client. + throw wxString(wxT("Client send extended packet before finishing handshake")); + } + */ + switch(opcode) { + case OP_MULTIPACKET_EXT: + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_MULTIPACKET_EXT from ") + m_client->GetFullIP()); + case OP_MULTIPACKET: { + if (opcode == OP_MULTIPACKET) AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_MULTIPACKET from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadFileRequest(size); + + if (m_client->IsBanned()) { + break; + } + + if (!m_client->CheckHandshakeFinished(OP_EMULEPROT, opcode)) { + // Here comes a extended packet without finishing the hanshake. + // IMHO, we should disconnect the client. + throw wxString(wxT("Client send OP_MULTIPACKET before finishing handshake")); + } + + CMemFile data_in(buffer, size); + CMD4Hash reqfilehash = data_in.ReadHash(); + uint64 nSize = (opcode == OP_MULTIPACKET_EXT) ? data_in.ReadUInt64() : 0; + + bool file_not_found = false; + CKnownFile* reqfile = theApp->sharedfiles->GetFileByID(reqfilehash); + if ( reqfile == NULL ){ + reqfile = theApp->downloadqueue->GetFileByID(reqfilehash); + if ( !( reqfile != NULL && reqfile->GetFileSize() > PARTSIZE ) ) { + AddDebugLogLineM(false, logRemoteClient, wxT("Remote client asked for a non-shared file")); + file_not_found = true; + } + } + + if (!file_not_found && reqfile->IsLargeFile() && !m_client->SupportsLargeFiles()) { + AddDebugLogLineM(false, logRemoteClient, wxT("Remote client asked for a large file but doesn't support them")); + file_not_found = true; + } + + if (!file_not_found && nSize && (reqfile->GetFileSize() != nSize)) { + AddDebugLogLineM(false, logRemoteClient, wxT("Remote client asked for a file but specified wrong size")); + file_not_found = true; + } + + if (file_not_found) { + CPacket* replypacket = new CPacket(OP_FILEREQANSNOFIL, 16, OP_EDONKEYPROT); + replypacket->Copy16ToDataBuffer(reqfilehash.GetHash()); + theStats::AddUpOverheadFileRequest(replypacket->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_FILEREQANSNOFIL to ") + m_client->GetFullIP() ); + SendPacket(replypacket, true); + break; + } + + if (!m_client->GetWaitStartTime()) { + m_client->SetWaitStartTime(); + } + // if we are downloading this file, this could be a new source + // no passive adding of files with only one part + if (reqfile->IsPartFile() && reqfile->GetFileSize() > PARTSIZE) { + if (thePrefs::GetMaxSourcePerFile() > ((CPartFile*)reqfile)->GetSourceCount()) { + theApp->downloadqueue->CheckAndAddKnownSource((CPartFile*)reqfile, m_client); + } + } + // check to see if this is a new file they are asking for + if (m_client->GetUploadFileID() != reqfilehash) { + m_client->SetCommentDirty(); + } + m_client->SetUploadFileID(reqfile); + CMemFile data_out(128); + data_out.WriteHash(reqfile->GetFileHash()); + while(data_in.GetLength()-data_in.GetPosition()) { + if (!m_client) { + throw wxString(wxT("Client suddenly disconnected")); + } + uint8 opcode_in = data_in.ReadUInt8(); + switch(opcode_in) { + case OP_REQUESTFILENAME: { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_MULTIPACKET has OP_REQUESTFILENAME") ); + m_client->ProcessExtendedInfo(&data_in, reqfile); + data_out.WriteUInt8(OP_REQFILENAMEANSWER); + + // Since it's for somebody else to see, we need to send the prettified + // filename, rather than the (possibly) mangled actual filename + data_out.WriteString(reqfile->GetFileName().GetPrintable(), m_client->GetUnicodeSupport()); + break; + } + case OP_AICHFILEHASHREQ: { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_MULTIPACKET has OP_AICHFILEHASHANS") ); + if (m_client->IsSupportingAICH() && reqfile->GetAICHHashset()->GetStatus() == AICH_HASHSETCOMPLETE + && reqfile->GetAICHHashset()->HasValidMasterHash()) + { + data_out.WriteUInt8(OP_AICHFILEHASHANS); + reqfile->GetAICHHashset()->GetMasterHash().Write(&data_out); + } + break; + } + case OP_SETREQFILEID: { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_MULTIPACKET has OP_SETREQFILEID") ); + data_out.WriteUInt8(OP_FILESTATUS); + if (reqfile->IsPartFile()) { + ((CPartFile*)reqfile)->WritePartStatus(&data_out); + } else { + data_out.WriteUInt16(0); + } + break; + } + //We still send the source packet separately.. + //We could send it within this packet.. If agreeded, I will fix it.. + case OP_REQUESTSOURCES2: + case OP_REQUESTSOURCES: { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_MULTIPACKET has OP_REQUESTSOURCES(2)") ); + uint8 byRequestedVersion = 0; + uint16 byRequestedOptions = 0; + if (opcode == OP_REQUESTSOURCES2){ // SX2 requests contains additional data + byRequestedVersion = data_in.ReadUInt8(); + byRequestedOptions = data_in.ReadUInt16(); + } + + //Although this shouldn't happen, it's a just in case to any Mods that mess with version numbers. + + if (byRequestedVersion > 0 || m_client->GetSourceExchange1Version() > 1) { + uint32 dwTimePassed = ::GetTickCount() - m_client->GetLastSrcReqTime() + CONNECTION_LATENCY; + bool bNeverAskedBefore = m_client->GetLastSrcReqTime() == 0; + if( + //if not complete and file is rare + ( reqfile->IsPartFile() + && (bNeverAskedBefore || dwTimePassed > SOURCECLIENTREASKS) + && ((CPartFile*)reqfile)->GetSourceCount() <= RARE_FILE + ) || + //OR if file is not rare or if file is complete + ( (bNeverAskedBefore || dwTimePassed > SOURCECLIENTREASKS * MINCOMMONPENALTY) ) + ) + { + m_client->SetLastSrcReqTime(); + CPacket* tosend = reqfile->CreateSrcInfoPacket(m_client, byRequestedVersion, byRequestedOptions); + if(tosend) { + theStats::AddUpOverheadSourceExchange(tosend->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_ANSWERSOURCES to ") + m_client->GetFullIP() ); + SendPacket(tosend, true); + } + } + } + break; + } + } + + } + if( data_out.GetLength() > 16 ) { + CPacket* reply = new CPacket(data_out, OP_EMULEPROT, OP_MULTIPACKETANSWER); + theStats::AddUpOverheadFileRequest(reply->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_MULTIPACKETANSWER to ") + m_client->GetFullIP() ); + SendPacket(reply, true); + } + break; + } + + case OP_MULTIPACKETANSWER: { // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_MULTIPACKETANSWER from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadFileRequest(size); + + if (m_client->IsBanned()) { + break; + } + + if( m_client->GetKadPort() ) { + Kademlia::CKademlia::Bootstrap(wxUINT32_SWAP_ALWAYS(m_client->GetIP()), m_client->GetKadPort()); + } + + if (!m_client->CheckHandshakeFinished(OP_EMULEPROT, opcode)) { + // Here comes a extended packet without finishing the hanshake. + // IMHO, we should disconnect the client. + throw wxString(wxT("Client send OP_MULTIPACKETANSWER before finishing handshake")); + } + + CMemFile data_in(buffer, size); + CMD4Hash reqfilehash = data_in.ReadHash(); + const CPartFile *reqfile = theApp->downloadqueue->GetFileByID(reqfilehash); + //Make sure we are downloading this file. + if ( !reqfile ) { + throw wxString(wxT(" Wrong File ID: (OP_MULTIPACKETANSWER; reqfile==NULL)")); + } + if ( !m_client->GetRequestFile() ) { + + throw wxString(wxT(" Wrong File ID: OP_MULTIPACKETANSWER; client->reqfile==NULL)")); + } + if (reqfile != m_client->GetRequestFile()) { + throw wxString(wxT(" Wrong File ID: OP_MULTIPACKETANSWER; reqfile!=client->reqfile)")); + } + while (data_in.GetLength()-data_in.GetPosition()) { + // Some of the cases down there can actually send a packet and lose the client + if (!m_client) { + throw wxString(wxT("Client suddenly disconnected")); + } + uint8 opcode_in = data_in.ReadUInt8(); + switch(opcode_in) { + case OP_REQFILENAMEANSWER: { + if (!m_client) { + throw wxString(wxT("Client suddenly disconnected")); + } else { + m_client->ProcessFileInfo(&data_in, reqfile); + } + break; + } + case OP_FILESTATUS: { + if (!m_client) { + throw wxString(wxT("Client suddenly disconnected")); + } else { + m_client->ProcessFileStatus(false, &data_in, reqfile); + } + break; + } + case OP_AICHFILEHASHANS: { + if (!m_client) { + throw wxString(wxT("Client suddenly disconnected")); + } else { + m_client->ProcessAICHFileHash(&data_in, reqfile); + } + break; + } + } + } + + break; + } + + case OP_EMULEINFO: { // 0.43b + theStats::AddDownOverheadOther(size); + + if (!m_client->ProcessMuleInfoPacket(buffer, size)) { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_EMULEINFO from ") + m_client->GetFullIP() ); + + // If it's not a OS Info packet, is an old client + // start secure identification, if + // - we have received eD2K and eMule info (old eMule) + if (m_client->GetInfoPacketsReceived() == IP_BOTH) { + m_client->InfoPacketsReceived(); + } + m_client->SendMuleInfoPacket(true); + } else { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_EMULEINFO is an OS_INFO") ); + } + break; + } + case OP_EMULEINFOANSWER: { // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_EMULEINFOANSWER from ") + m_client->GetFullIP() ); + theStats::AddDownOverheadOther(size); + + m_client->ProcessMuleInfoPacket(buffer, size); + // start secure identification, if + // - we have received eD2K and eMule info (old eMule) + + if (m_client->GetInfoPacketsReceived() == IP_BOTH) { + m_client->InfoPacketsReceived(); + } + + break; + } + + case OP_SECIDENTSTATE:{ // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_SECIDENTSTATE from ") + m_client->GetFullIP() ); + + if (!m_client->CheckHandshakeFinished(OP_EMULEPROT, opcode)) { + // Here comes a extended packet without finishing the hanshake. + // IMHO, we should disconnect the client. + throw wxString(wxT("Client send OP_SECIDENTSTATE before finishing handshake")); + } + m_client->ProcessSecIdentStatePacket(buffer, size); + // ProcessSecIdentStatePacket() might cause the socket to die, so check + if (m_client) { + int SecureIdentState = m_client->GetSecureIdentState(); + if (SecureIdentState == IS_SIGNATURENEEDED) { + m_client->SendSignaturePacket(); + } else if (SecureIdentState == IS_KEYANDSIGNEEDED) { + m_client->SendPublicKeyPacket(); + // SendPublicKeyPacket() might cause the socket to die, so check + if ( m_client ) { + m_client->SendSignaturePacket(); + } + } + } + break; + } + + case OP_PUBLICKEY: { // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_PUBLICKEY from ") + m_client->GetFullIP() ); + + if (m_client->IsBanned() ){ + break; + } + + if (!m_client->CheckHandshakeFinished(OP_EMULEPROT, opcode)) { + // Here comes a extended packet without finishing the hanshake. + // IMHO, we should disconnect the client. + throw wxString(wxT("Client send OP_PUBLICKEY before finishing handshake")); + } + + m_client->ProcessPublicKeyPacket(buffer, size); + break; + } + case OP_SIGNATURE:{ // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_SIGNATURE from ") + m_client->GetFullIP() ); + + if (!m_client->CheckHandshakeFinished(OP_EMULEPROT, opcode)) { + // Here comes a extended packet without finishing the hanshake. + // IMHO, we should disconnect the client. + throw wxString(wxT("Client send OP_COMPRESSEDPART before finishing handshake")); + } + + m_client->ProcessSignaturePacket(buffer, size); + break; + } + case OP_SENDINGPART_I64: + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_SENDINGPART_I64 from ") + m_client->GetFullIP() ); + case OP_COMPRESSEDPART_I64: + if (opcode == OP_COMPRESSEDPART_I64) AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_COMPRESSEDPART_I64 from ") + m_client->GetFullIP() ); + case OP_COMPRESSEDPART: { // 0.47a + if (opcode == OP_COMPRESSEDPART) AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_COMPRESSEDPART from ") + m_client->GetFullIP() ); + + if (!m_client->CheckHandshakeFinished(OP_EMULEPROT, opcode)) { + // Here comes a extended packet without finishing the hanshake. + // IMHO, we should disconnect the client. + throw wxString(wxT("Client send OP_COMPRESSEDPART before finishing handshake")); + } + + if (m_client->GetRequestFile() && !m_client->GetRequestFile()->IsStopped() && (m_client->GetRequestFile()->GetStatus()==PS_READY || m_client->GetRequestFile()->GetStatus()==PS_EMPTY)) { + + m_client->ProcessBlockPacket(buffer, size, (opcode != OP_SENDINGPART_I64), (opcode == OP_COMPRESSEDPART_I64) || (opcode == OP_SENDINGPART_I64)); + + if (m_client && ( + m_client->GetRequestFile()->IsStopped() || + m_client->GetRequestFile()->GetStatus() == PS_PAUSED || + m_client->GetRequestFile()->GetStatus() == PS_ERROR)) { + if (!m_client->GetSentCancelTransfer()) { + CPacket* packet = new CPacket(OP_CANCELTRANSFER, 0, OP_EDONKEYPROT); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_CANCELTRANSFER to ") + m_client->GetFullIP() ); + m_client->SendPacket(packet,true,true); + + if (m_client) { + m_client->SetSentCancelTransfer(1); + } + } + + if ( m_client ) { + m_client->SetDownloadState(m_client->GetRequestFile()->IsStopped() ? DS_NONE : DS_ONQUEUE); + } + } + } else { + if (!m_client->GetSentCancelTransfer()) { + CPacket* packet = new CPacket(OP_CANCELTRANSFER, 0, OP_EDONKEYPROT); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_CANCELTRANSFER to ") + m_client->GetFullIP() ); + m_client->SendPacket(packet,true,true); + + if ( m_client ) { + m_client->SetSentCancelTransfer(1); + } + } + + if ( m_client ) { + m_client->SetDownloadState((m_client->GetRequestFile()==NULL || m_client->GetRequestFile()->IsStopped()) ? DS_NONE : DS_ONQUEUE); + } + } + break; + } + case OP_REQUESTPARTS_I64: { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_REQUESTPARTS_I64 from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadFileRequest(size); + + m_client->ProcessRequestPartsPacket(buffer, size, true); + + break; + } + case OP_QUEUERANKING: { // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_QUEUERANKING from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadOther(size); + + if (!m_client->CheckHandshakeFinished(OP_EMULEPROT, opcode)) { + // Here comes a extended packet without finishing the hanshake. + // IMHO, we should disconnect the client. + throw wxString(wxT("Client send OP_QUEUERANKING before finishing handshake")); + } + + if (size != 12) { + throw wxString(wxT("Invalid size (OP_QUEUERANKING)")); + } + + uint16 newrank = PeekUInt16(buffer); + m_client->SetRemoteQueueFull(false); + m_client->SetRemoteQueueRank(newrank); + break; + } + case OP_REQUESTSOURCES:{ + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_REQUESTSOURCES from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadSourceExchange(size); + + if (!m_client->CheckHandshakeFinished(OP_EMULEPROT, opcode)) { + // Here comes an extended packet without finishing the handshake. + // IMHO, we should disconnect the client. + throw wxString(wxT("Client send OP_REQUESTSOURCES before finishing handshake")); + } + + uint8 byRequestedVersion = 0; + uint16 byRequestedOptions = 0; + CMemFile data_in(buffer, size); + if (opcode == OP_REQUESTSOURCES2){ // SX2 requests contains additional data + byRequestedVersion = data_in.ReadUInt8(); + byRequestedOptions = data_in.ReadUInt16(); + } + + if (byRequestedVersion > 0 || m_client->GetSourceExchange1Version() >= 1) { + if(size != 16) { + throw wxString(wxT("Invalid size (OP_QUEUERANKING)")); + } + //first check shared file list, then download list + const CMD4Hash fileID(buffer); + CKnownFile* file = theApp->sharedfiles->GetFileByID(fileID); + if(!file) { + file = theApp->downloadqueue->GetFileByID(fileID); + } + if(file) { + // There are some clients which do not follow the correct protocol procedure of sending + // the sequence OP_REQUESTFILENAME, OP_SETREQFILEID, OP_REQUESTSOURCES. If those clients + // are doing this, they will not get the optimal set of sources which we could offer if + // they would follow the above noted protocol sequence. They better do it the right way + // or they will get just a random set of sources because we do not know their download + // part status which may get cleared with the call of 'SetUploadFileID'. + m_client->SetUploadFileID(file); + + uint32 dwTimePassed = ::GetTickCount() - m_client->GetLastSrcReqTime() + CONNECTION_LATENCY; + bool bNeverAskedBefore = m_client->GetLastSrcReqTime() == 0; + if( + //if not complete and file is rare, allow once every 40 minutes + ( file->IsPartFile() && + ((CPartFile*)file)->GetSourceCount() <= RARE_FILE && + (bNeverAskedBefore || dwTimePassed > SOURCECLIENTREASKS) + ) || + //OR if file is not rare or if file is complete, allow every 90 minutes + ( (bNeverAskedBefore || dwTimePassed > SOURCECLIENTREASKS * MINCOMMONPENALTY) ) + ) + { + m_client->SetLastSrcReqTime(); + CPacket* tosend = file->CreateSrcInfoPacket(m_client, byRequestedVersion, byRequestedOptions); + if(tosend) { + theStats::AddUpOverheadSourceExchange(tosend->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_ANSWERSOURCES to ") + m_client->GetFullIP() ); + SendPacket(tosend, true, true); + } + } + } + } + break; + } + case OP_ANSWERSOURCES: { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_ANSWERSOURCES from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadSourceExchange(size); + + if (!m_client->CheckHandshakeFinished(OP_EMULEPROT, opcode)) { + // Here comes a extended packet without finishing the hanshake. + // IMHO, we should disconnect the client. + throw wxString(wxT("Client send OP_ANSWERSOURCES before finishing handshake")); + } + + CMemFile data(buffer, size); + CMD4Hash hash = data.ReadHash(); + const CKnownFile* file = theApp->downloadqueue->GetFileByID(hash); + if(file){ + if (file->IsPartFile()){ + //set the client's answer time + m_client->SetLastSrcAnswerTime(); + //and set the file's last answer time + ((CPartFile*)file)->SetLastAnsweredTime(); + + ((CPartFile*)file)->AddClientSources(&data, SF_SOURCE_EXCHANGE, m_client->GetSourceExchange1Version(), false, m_client); + } + } + break; + } + case OP_ANSWERSOURCES2: { + //printf("Received OP_ANSWERSOURCES2\n"); + theStats::AddDownOverheadSourceExchange(size); + + if (!m_client->CheckHandshakeFinished(OP_EMULEPROT, opcode)) { + // Here comes a extended packet without finishing the hanshake. + // IMHO, we should disconnect the client. + throw wxString(wxT("Client send OP_ANSWERSOURCES2 before finishing handshake")); + } + + CMemFile data(buffer, size); + uint8 byVersion = data.ReadUInt8(); + CMD4Hash hash = data.ReadHash(); + const CKnownFile* file = theApp->downloadqueue->GetFileByID(hash); + if (file){ + if (file->IsPartFile()){ + //set the client's answer time + m_client->SetLastSrcAnswerTime(); + //and set the file's last answer time + ((CPartFile*)file)->SetLastAnsweredTime(); + ((CPartFile*)file)->AddClientSources(&data, SF_SOURCE_EXCHANGE, byVersion, true, m_client); + } + } + break; + } + case OP_FILEDESC: { // 0.43b + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_FILEDESC from ") + m_client->GetFullIP() ); + + theStats::AddDownOverheadFileRequest(size); + + if (!m_client->CheckHandshakeFinished(OP_EMULEPROT, opcode)) { + // Here comes a extended packet without finishing the hanshake. + // IMHO, we should disconnect the client. + throw wxString(wxT("Client send OP_FILEDESC before finishing handshake")); + } + + m_client->ProcessMuleCommentPacket(buffer, size); + break; + } + + // Unsupported + case OP_REQUESTPREVIEW: { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_REQUESTPREVIEW from ") + m_client->GetFullIP() ); + break; + } + // Unsupported + case OP_PREVIEWANSWER: { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_PREVIEWANSWER from ") + m_client->GetFullIP() ); + break; + } + + case OP_PUBLICIP_ANSWER: { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_PUBLICIP_ANSWER from ") + m_client->GetFullIP() ); + theStats::AddDownOverheadOther(size); + m_client->ProcessPublicIPAnswer(buffer, size); + break; + } + case OP_PUBLICIP_REQ: { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_PUBLICIP_REQ from ") + m_client->GetFullIP() ); + theStats::AddDownOverheadOther(size); + CPacket* pPacket = new CPacket(OP_PUBLICIP_ANSWER, 4, OP_EMULEPROT); + pPacket->CopyUInt32ToDataBuffer(m_client->GetIP()); + theStats::AddUpOverheadOther(pPacket->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_PUBLICIP_ANSWER to") + m_client->GetFullIP()); + SendPacket(pPacket); + break; + } + case OP_AICHANSWER: { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_AICHANSWER from ") + m_client->GetFullIP() ); + theStats::AddDownOverheadOther(size); + m_client->ProcessAICHAnswer(buffer, size); + break; + } + case OP_AICHREQUEST: { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_AICHREQUEST from ") + m_client->GetFullIP() ); + theStats::AddDownOverheadOther(size); + m_client->ProcessAICHRequest(buffer, size); + break; + } + case OP_AICHFILEHASHANS: { + // those should not be received normally, since we should only get those in MULTIPACKET + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_AICHFILEHASHANS from ") + m_client->GetFullIP() ); + theStats::AddDownOverheadOther(size); + CMemFile data(buffer, size); + m_client->ProcessAICHFileHash(&data, NULL); + break; + } + case OP_AICHFILEHASHREQ: { + // those should not be received normally, since we should only get those in MULTIPACKET + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_AICHFILEHASHREQ from ") + m_client->GetFullIP() ); + CMemFile data(buffer, size); + CMD4Hash hash = data.ReadHash(); + CKnownFile* pPartFile = theApp->sharedfiles->GetFileByID(hash); + if (pPartFile == NULL){ + break; + } + + if (m_client->IsSupportingAICH() && pPartFile->GetAICHHashset()->GetStatus() == AICH_HASHSETCOMPLETE + && pPartFile->GetAICHHashset()->HasValidMasterHash()) { + CMemFile data_out; + data_out.WriteHash(hash); + pPartFile->GetAICHHashset()->GetMasterHash().Write(&data_out); + CPacket* packet = new CPacket(data_out, OP_EMULEPROT, OP_AICHFILEHASHANS); + theStats::AddUpOverheadOther(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_AICHFILEHASHANS to") + m_client->GetFullIP()); + SendPacket(packet); + } + break; + } + case OP_CALLBACK: { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_CALLBACK from ") + m_client->GetFullIP() ); + theStats::AddDownOverheadFileRequest(size); + if(!Kademlia::CKademlia::IsRunning()) { + break; + } + CMemFile data(buffer, size); + CUInt128 check = data.ReadUInt128(); + check.XOR(Kademlia::CUInt128(true)); + if( check.CompareTo(Kademlia::CKademlia::GetPrefs()->GetKadID())) { + break; + } + CUInt128 fileid = data.ReadUInt128(); + byte fileid2[16]; + fileid.ToByteArray(fileid2); + const CMD4Hash fileHash(fileid2); + if (theApp->sharedfiles->GetFileByID(fileHash) == NULL) { + if (theApp->downloadqueue->GetFileByID(fileHash) == NULL) { + break; + } + } + + uint32 ip = data.ReadUInt32(); + uint16 tcp = data.ReadUInt16(); + CUpDownClient* callback; + callback = theApp->clientlist->FindClientByIP(wxUINT32_SWAP_ALWAYS(ip), tcp); + if( callback == NULL ) { + //#warning Do we actually have to check friend status here? + callback = new CUpDownClient(tcp,ip,0,0,NULL,false, false); + theApp->clientlist->AddClient(callback); + } + callback->TryToConnect(true); + break; + } + + case OP_BUDDYPING: { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_BUDDYPING from ") + m_client->GetFullIP() ); + theStats::AddDownOverheadKad(size); + + CUpDownClient* buddy = theApp->clientlist->GetBuddy(); + if( buddy != m_client || m_client->GetKadVersion() == 0 || !m_client->AllowIncomeingBuddyPingPong() ) { + //This ping was not from our buddy or wrong version or packet sent to fast. Ignore + break; + } + + m_client->SetLastBuddyPingPongTime(); + CPacket* replypacket = new CPacket(OP_BUDDYPONG, 0, OP_EMULEPROT); + theStats::AddUpOverheadKad(replypacket->GetPacketSize()); + AddDebugLogLineM(false, logLocalClient,wxT("Local Client: OP_BUDDYPONG to ") + m_client->GetFullIP()); + SendPacket(replypacket); + break; + } + case OP_BUDDYPONG: { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_BUDDYPONG from ") + m_client->GetFullIP() ); + theStats::AddDownOverheadKad(size); + + CUpDownClient* buddy = theApp->clientlist->GetBuddy(); + if( buddy != m_client || m_client->GetKadVersion() == 0 ) { + //This pong was not from our buddy or wrong version. Ignore + break; + } + m_client->SetLastBuddyPingPongTime(); + //All this is for is to reset our socket timeout. + break; + } + case OP_REASKCALLBACKTCP: { + theStats::AddDownOverheadFileRequest(size); + CUpDownClient* buddy = theApp->clientlist->GetBuddy(); + if (buddy != m_client) { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_REASKCALLBACKTCP from ") + m_client->GetFullIP() + wxT(" which is not our buddy!") ); + //This callback was not from our buddy.. Ignore. + break; + } + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: OP_REASKCALLBACKTCP from ") + m_client->GetFullIP() ); + CMemFile data_in(buffer, size); + uint32 destip = data_in.ReadUInt32(); + uint16 destport = data_in.ReadUInt16(); + CMD4Hash hash = data_in.ReadHash(); + CKnownFile* reqfile = theApp->sharedfiles->GetFileByID(hash); + + bool bSenderMultipleIpUnknown = false; + CUpDownClient* sender = theApp->uploadqueue->GetWaitingClientByIP_UDP(destip, destport, true, &bSenderMultipleIpUnknown); + if (!reqfile) { + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_FILENOTFOUND to ") + m_client->GetFullIP() ); + CPacket* response = new CPacket(OP_FILENOTFOUND,0,OP_EMULEPROT); + theStats::AddUpOverheadFileRequest(response->GetPacketSize()); + if (sender) { + theApp->clientudp->SendPacket(response, destip, destport, sender->ShouldReceiveCryptUDPPackets(), sender->GetUserHash().GetHash(), false, 0); + } else { + theApp->clientudp->SendPacket(response, destip, destport, false, NULL, false, 0); + } + break; + } + + if (sender) { + //Make sure we are still thinking about the same file + if (hash == sender->GetUploadFileID()) { + sender->AddAskedCount(); + sender->SetLastUpRequest(); + //I messed up when I first added extended info to UDP + //I should have originally used the entire ProcessExtenedInfo the first time. + //So now I am forced to check UDPVersion to see if we are sending all the extended info. + //For now on, we should not have to change anything here if we change + //anything to the extended info data as this will be taken care of in ProcessExtendedInfo() + //Update extended info. + if (sender->GetUDPVersion() > 3) { + sender->ProcessExtendedInfo(&data_in, reqfile); + } else if (sender->GetUDPVersion() > 2) { + //Update our complete source counts. + uint16 nCompleteCountLast= sender->GetUpCompleteSourcesCount(); + uint16 nCompleteCountNew = data_in.ReadUInt16(); + sender->SetUpCompleteSourcesCount(nCompleteCountNew); + if (nCompleteCountLast != nCompleteCountNew) { + reqfile->UpdatePartsInfo(); + } + } + + CMemFile data_out(128); + if(sender->GetUDPVersion() > 3) { + if (reqfile->IsPartFile()) { + ((CPartFile*)reqfile)->WritePartStatus(&data_out); + } else { + data_out.WriteUInt16(0); + } + } + + data_out.WriteUInt16(theApp->uploadqueue->GetWaitingPosition(sender)); + CPacket* response = new CPacket(data_out, OP_EMULEPROT, OP_REASKACK); + theStats::AddUpOverheadFileRequest(response->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client UDP: OP_REASKACK to ") + m_client->GetFullIP() ); + theApp->clientudp->SendPacket(response, destip, destport, sender->ShouldReceiveCryptUDPPackets(), sender->GetUserHash().GetHash(), false, 0); + } else { + AddDebugLogLineM(false, logListenSocket, wxT("Client UDP socket; OP_REASKCALLBACKTCP; reqfile does not match")); + } + } else { + if (!bSenderMultipleIpUnknown){ + if ((theStats::GetWaitingUserCount() + 50) > thePrefs::GetQueueSize()) { + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_QUEUEFULL to ") + m_client->GetFullIP() ); + CPacket* response = new CPacket(OP_QUEUEFULL,0,OP_EMULEPROT); + theStats::AddUpOverheadFileRequest(response->GetPacketSize()); + theApp->clientudp->SendPacket(response, destip, destport, false, NULL, false, 0); + } + } else { + AddDebugLogLineM(false, logRemoteClient, CFormat(wxT("OP_REASKCALLBACKTCP Packet received - multiple clients with the same IP but different UDP port found. Possible UDP Portmapping problem, enforcing TCP connection. IP: %s, Port: %u")) % Uint32toStringIP(destip) % destport); + } + } + break; + } + default: + theStats::AddDownOverheadOther(size); + AddDebugLogLineM( false, logRemoteClient, wxString::Format(wxT("eMule packet : unknown opcode: %i %x from "),opcode,opcode) + m_client->GetFullIP()); + break; + } + + return true; +} + +bool CClientTCPSocket::ProcessED2Kv2Packet(const byte* buffer, uint32 size, uint8 opcode) +{ + #ifdef __PACKET_RECV_DUMP__ + //printf("Rec: OPCODE %x ED2Kv2\n",opcode); + DumpMem(buffer,size); + #endif + + if (!m_client) { + throw wxString(wxT("Unknown clients sends extended ED2Kv2 protocol packet")); + } + + CMemFile data(buffer, size); + try { + switch(opcode) { + case OP_QUEUERANK: { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: ED2Kv2 OP_QUEUERANK from ") + m_client->GetFullIP() ); + + uint8 numtags = data.ReadUInt8(); + wxASSERT(numtags == 1); + + m_client->SetRemoteQueueRank(data.GetIntTagValue()); + + theStats::AddDownOverheadFileRequest(size); + break; + } + + case OP_REQUESTPARTS: { + AddDebugLogLineM( false, logRemoteClient, wxT("Remote Client: ED2Kv2 OP_REQUESTPARTS from ") + m_client->GetFullIP() ); + + m_client->ProcessRequestPartsPacketv2(data); + + theStats::AddDownOverheadFileRequest(size); + break; + } + + default: + theStats::AddDownOverheadOther(size); + AddDebugLogLineM( false, logRemoteClient, wxString::Format(wxT("ED2Kv2 packet : unknown opcode: %i %x from "), opcode, opcode) + m_client->GetFullIP()); + } + } catch (...) { + AddDebugLogLineM( false, logRemoteClient, wxString::Format(wxT("ED2Kv2 packet is corrupt at pos %i! opcode: %i %x from "),data.GetPosition(), opcode, opcode) + m_client->GetFullIP()); + throw; + } + + return true; +} + +void CClientTCPSocket::OnConnect(int nErrorCode) +{ + if (nErrorCode) { + OnError(nErrorCode); + } else if (!m_client) { + // and now? Disconnect? not? + AddDebugLogLineM( false, logClient, wxT("Couldn't send hello packet (Client deleted!)") ); + } else if (!m_client->SendHelloPacket()) { + // and now? Disconnect? not? + AddDebugLogLineM( false, logClient, wxT("Couldn't send hello packet (Client deleted by SendHelloPacket!)") ); + } else { + ResetTimeOutTimer(); + } +} + + +void CClientTCPSocket::OnSend(int nErrorCode) +{ + ResetTimeOutTimer(); + CEMSocket::OnSend(nErrorCode); +} + + +void CClientTCPSocket::OnReceive(int nErrorCode) +{ + ResetTimeOutTimer(); + // We might have updated ipfilter + wxASSERT(m_remoteip); + + if (theApp->ipfilter->IsFiltered(m_remoteip)) { + if (m_client) { + m_client->Safe_Delete(); + } + Safe_Delete(); + AddDebugLogLineM( false, logIPFilter, wxT("A connected client was dropped by IPFilter on new packet received")); + } else { + CEMSocket::OnReceive(nErrorCode); + } +} + + +void CClientTCPSocket::OnError(int nErrorCode) +{ + //printf("* Called OnError for %p\n",this); + // 0.42e + Kry changes for handling of socket lost events + wxString strError; + + if ((nErrorCode == 0) || (nErrorCode == 7) || (nErrorCode == 0xFEFF)) { + if (m_client) { + if (!m_client->GetUserName().IsEmpty()) { + strError = wxT("Client '") + m_client->GetUserName() + wxT("'"); + } else { + strError = wxT("An unnamed client"); + } + strError += wxT(" (IP:") + m_client->GetFullIP() + wxT(") "); + } else { + strError = wxT("A client "); + } + if (nErrorCode == 0) { + strError += wxT("closed connection."); + } else if (nErrorCode == 0xFEFF) { + strError += wxT(" caused a wxSOCKET_LOST event."); + } else { + strError += wxT("caused a socket blocking error."); + } + } else { + if ( CLogger::IsEnabled( logClient ) && (nErrorCode != 107)) { + // 0 -> No Error / Disconect + // 107 -> Transport endpoint is not connected + if (m_client) { + if (!m_client->GetUserName().IsEmpty()) { + strError = wxT("OnError: Client '") + m_client->GetUserName() + + wxT("' (IP:") + m_client->GetFullIP() + + wxString::Format(wxT(") caused an error: %u. Disconnecting client!"), nErrorCode); + } else { + strError = wxT("OnError: Unknown client (IP:") + + m_client->GetFullIP() + + wxString::Format(wxT(") caused an error: %u. Disconnecting client!"), nErrorCode); + } + } else { + strError = wxString::Format(wxT("OnError: A client caused an error or did something bad (error %u). Disconnecting client !"), + nErrorCode); + } + } else { + strError = wxT("Error 107 (Transport endpoint is not connected)"); + } + } + + Disconnect(strError); +} + + +bool CClientTCPSocket::PacketReceived(CPacket* packet) +{ + // 0.42e + bool bResult = false; + uint32 uRawSize = packet->GetPacketSize(); + + AddDebugLogLineM( false, logRemoteClient, + CFormat(wxT("Packet with protocol %x, opcode %x, size %u received from %s")) + % packet->GetProtocol() + % packet->GetOpCode() + % packet->GetPacketSize() + % ( m_client ? m_client->GetFullIP() : wxT("Unknown Client") ) + ); + + wxString exception; + + try { + bool process = true; + + if ((packet->GetProtocol() == OP_PACKEDPROT) || + (packet->GetProtocol() == OP_ED2KV2PACKEDPROT)) { + + if (!packet->UnPackPacket()) { + AddDebugLogLineM( false, logZLib, wxT("Failed to decompress client TCP packet.")); + bResult = false; + process = false; + } else { + AddDebugLogLineM(false, logRemoteClient, + wxString::Format(wxT("Packet unpacked, new protocol %x, opcode %x, size %u"), + packet->GetProtocol(), + packet->GetOpCode(), + packet->GetPacketSize()) + ); + } + } + + if (process) { + switch (packet->GetProtocol()) { + case OP_EDONKEYPROT: + bResult = ProcessPacket(packet->GetDataBuffer(),uRawSize,packet->GetOpCode()); + break; + case OP_EMULEPROT: + bResult = ProcessExtPacket(packet->GetDataBuffer(), packet->GetPacketSize(), packet->GetOpCode()); + break; + case OP_ED2KV2HEADER: + bResult = ProcessED2Kv2Packet(packet->GetDataBuffer(), packet->GetPacketSize(), packet->GetOpCode()); + break; + case OP_ED2KV2PACKEDPROT: + case OP_PACKEDPROT: + // Packed inside packed? + wxASSERT(0); + break; + default: { + theStats::AddDownOverheadOther(uRawSize); + if (m_client) { + m_client->SetDownloadState(DS_ERROR); + } + Disconnect(wxT("Unknown protocol")); + bResult = false; + } + } + } + } catch (const CEOFException& err) { + exception = wxT("EOF exception: ") + err.what(); + } catch (const CInvalidPacket& err) { + exception = wxT("InvalidPacket exception: ") + err.what(); + } catch (const wxString& error) { + exception = wxT("error: ") + (error.IsEmpty() ? wxString(wxT("Unknown error")) : error); + } + + if (!exception.IsEmpty()) { + AddDebugLogLineM( false, logPacketErrors, + CFormat(wxT("Caught %s\nOn packet with protocol %x, opcode %x, size %u\tClientData: %s\n")) + % exception + % packet->GetProtocol() + % packet->GetOpCode() + % packet->GetPacketSize() + % ( m_client ? m_client->GetClientFullInfo() : wxT("Unknown") ) + ); + + if (m_client) { + m_client->SetDownloadState(DS_ERROR); + } + + AddDebugLogLineM( false, logClient, + CFormat( wxT("Client '%s' (IP: %s) caused an error (%s). Disconnecting client!" ) ) + % ( m_client ? m_client->GetUserName() : wxString(wxT("Unknown")) ) + % ( m_client ? m_client->GetFullIP() : wxString(wxT("Unknown")) ) + % exception + ); + + Disconnect(wxT("Caught exception on CClientTCPSocket::ProcessPacket\n")); + } + + return bResult; +} + + +bool CClientTCPSocket::IsMessageFiltered(const wxString& Message, CUpDownClient* client) { + + bool filtered = false; + // If we're chatting to the guy, we don't want to filter! + if (client->GetChatState() != MS_CHATTING) { + if (thePrefs::MsgOnlyFriends() && !client->IsFriend()) { + filtered = true; + } else if (thePrefs::MsgOnlySecure() && client->GetUserName().IsEmpty() ) { + filtered = true; + } else if (thePrefs::MustFilterMessages()) { + filtered = thePrefs::IsMessageFiltered(Message); + } + } + return filtered; +} + +SocketSentBytes CClientTCPSocket::SendControlData(uint32 maxNumberOfBytesToSend, uint32 overchargeMaxBytesToSend) +{ + SocketSentBytes returnStatus = CEMSocket::SendControlData(maxNumberOfBytesToSend, overchargeMaxBytesToSend); + + if(returnStatus.success && (returnStatus.sentBytesControlPackets > 0 || returnStatus.sentBytesStandardPackets > 0)) { + ResetTimeOutTimer(); + } + + return returnStatus; +} + + +SocketSentBytes CClientTCPSocket::SendFileAndControlData(uint32 maxNumberOfBytesToSend, uint32 overchargeMaxBytesToSend) +{ + SocketSentBytes returnStatus = CEMSocket::SendFileAndControlData(maxNumberOfBytesToSend, overchargeMaxBytesToSend); + + if(returnStatus.success && (returnStatus.sentBytesControlPackets > 0 || returnStatus.sentBytesStandardPackets > 0)) { + ResetTimeOutTimer(); + } + + return returnStatus; +} + + +void CClientTCPSocket::SendPacket(CPacket* packet, bool delpacket, bool controlpacket, uint32 actualPayloadSize) +{ + ResetTimeOutTimer(); + CEMSocket::SendPacket(packet,delpacket,controlpacket, actualPayloadSize); +} +// File_checked_for_headers diff --git a/src/ClientTCPSocket.h b/src/ClientTCPSocket.h new file mode 100644 index 00000000..b2ae0835 --- /dev/null +++ b/src/ClientTCPSocket.h @@ -0,0 +1,95 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// +// Handling incoming connections (up or downloadrequests) +// + +#ifndef CLIENTTCPSOCKET_H +#define CLIENTTCPSOCKET_H + +#include "EMSocket.h" // Needed for CEMSocket + +class CProxyData; + +//------------------------------------------------------------------------------ +// CClientTCPSocket +//------------------------------------------------------------------------------ + +class CUpDownClient; +class CPacket; +class CTimerWnd; + +class CClientTCPSocket : public CEMSocket +{ +public: + CClientTCPSocket(CUpDownClient* in_client = NULL, const CProxyData *ProxyData = NULL); + virtual ~CClientTCPSocket(); + + void Disconnect(const wxString& strReason); + + bool InitNetworkData(); + + bool CheckTimeOut(); + + void Safe_Delete(); + + bool ForDeletion() const { return m_ForDeletion; } + + void OnConnect(int nErrorCode); + void OnSend(int nErrorCode); + void OnReceive(int nErrorCode); + + void OnClose(int nErrorCode); + void OnError(int nErrorCode); + + uint32 GetRemoteIP() const { return m_remoteip; } + + CUpDownClient* GetClient() { return m_client; } + + virtual void SendPacket(CPacket* packet, bool delpacket = true, bool controlpacket = true, uint32 actualPayloadSize = 0); + virtual SocketSentBytes SendControlData(uint32 maxNumberOfBytesToSend, uint32 overchargeMaxBytesToSend); + virtual SocketSentBytes SendFileAndControlData(uint32 maxNumberOfBytesToSend, uint32 overchargeMaxBytesToSend); + +protected: + virtual bool PacketReceived(CPacket* packet); + +private: + CUpDownClient* m_client; + + bool ProcessPacket(const byte* packet, uint32 size, uint8 opcode); + bool ProcessExtPacket(const byte* packet, uint32 size, uint8 opcode); + bool ProcessED2Kv2Packet(const byte* packet, uint32 size, uint8 opcode); + bool IsMessageFiltered(const wxString& Message, CUpDownClient* client); + void ResetTimeOutTimer(); + void SetClient(CUpDownClient* client); + + bool m_ForDeletion; // 0.30c (Creteil), set as bool + uint32 timeout_timer; + uint32 m_remoteip; +}; + +#endif // CLIENTTCPSOCKET_H +// File_checked_for_headers diff --git a/src/ClientUDPSocket.cpp b/src/ClientUDPSocket.cpp new file mode 100644 index 00000000..2f4f02fe --- /dev/null +++ b/src/ClientUDPSocket.cpp @@ -0,0 +1,265 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "ClientUDPSocket.h" // Interface declarations + +#include +#include // Sometimes we reply with TCP packets. +#include +#include +#include // Needed for CFormat + +#include "Preferences.h" // Needed for CPreferences +#include "PartFile.h" // Needed for CPartFile +#include "updownclient.h" // Needed for CUpDownClient +#include "UploadQueue.h" // Needed for CUploadQueue +#include "Packet.h" // Needed for CPacket +#include "SharedFileList.h" // Needed for CSharedFileList +#include "DownloadQueue.h" // Needed for CDownloadQueue +#include "Statistics.h" // Needed for theStats +#include "amule.h" // Needed for theApp +#include "ClientList.h" // Needed for clientlist (buddy support) +#include "ClientTCPSocket.h" // Needed for CClientTCPSocket +#include "MemFile.h" // Needed for CMemFile +#include "Logger.h" +#include "kademlia/kademlia/Kademlia.h" +#include "zlib.h" + +// +// CClientUDPSocket -- Extended eMule UDP socket +// + +CClientUDPSocket::CClientUDPSocket(const amuleIPV4Address& address, const CProxyData* ProxyData) + : CMuleUDPSocket(wxT("Client UDP-Socket"), ID_CLIENTUDPSOCKET_EVENT, address, ProxyData) +{ + if (!thePrefs::IsUDPDisabled()) { + Open(); + } +} + + +void CClientUDPSocket::OnReceive(int errorCode) +{ + CMuleUDPSocket::OnReceive(errorCode); + + // TODO: A better solution is needed. + if (thePrefs::IsUDPDisabled()) { + Close(); + } +} + + +void CClientUDPSocket::OnPacketReceived(const wxIPV4address& addr, byte* buffer, size_t length) +{ + wxCHECK_RET(length >= 2, wxT("Invalid packet.")); + + uint8 protocol = buffer[0]; + uint8 opcode = buffer[1]; + uint32 ip = StringIPtoUint32(addr.IPAddress()); + uint16 port = addr.Service(); + + try { + switch (protocol) { + case OP_EMULEPROT: + ProcessPacket(buffer + 2,length - 2, opcode, ip, port); + break; + + case OP_KADEMLIAHEADER: + theStats::AddDownOverheadKad(length); + Kademlia::CKademlia::ProcessPacket(buffer, length, wxUINT32_SWAP_ALWAYS(ip), port); + break; + + case OP_KADEMLIAPACKEDPROT: { + theStats::AddDownOverheadKad(length); + uint32 nNewSize = length*10+300; // Should be enough... + std::vector unpack(nNewSize); + uLongf unpackedsize = nNewSize-2; + uint16 result = uncompress(&(unpack[2]), &unpackedsize, buffer + 2, length-2); + if (result == Z_OK) { + unpack[0] = OP_KADEMLIAHEADER; + unpack[1] = opcode; + Kademlia::CKademlia::ProcessPacket(&(unpack[0]), unpackedsize + 2, wxUINT32_SWAP_ALWAYS(ip), port); + } else { + AddDebugLogLineM(false, logClientKadUDP, wxT("Failed to uncompress Kademlia packet")); + } + break; + } + default: + AddDebugLogLineM(false, logClientUDP, wxString::Format(wxT("Unknown opcode on received packet: 0x%x"), protocol)); + } + } catch (const wxString& e) { + AddDebugLogLineM(false, logClientUDP, wxT("Error while parsing UDP packet: ") + e); + } catch (const CInvalidPacket& e) { + AddDebugLogLineM(false, logClientUDP, wxT("Invalid UDP packet encountered: ") + e.what()); + } catch (const CEOFException& e) { + AddDebugLogLineM(false, logClientUDP, wxT("Malformed packet encountered while parsing UDP packet: ") + e.what()); + } +} + + +void CClientUDPSocket::ProcessPacket(byte* packet, int16 size, int8 opcode, uint32 host, uint16 port) +{ + switch (opcode) { + case OP_REASKCALLBACKUDP: { + AddDebugLogLineM( false, logClientUDP, wxT("Client UDP socket; OP_REASKCALLBACKUDP") ); + theStats::AddDownOverheadOther(size); + CUpDownClient* buddy = theApp->clientlist->GetBuddy(); + if( buddy ) { + if( size < 17 || buddy->GetSocket() == NULL ) { + break; + } + if (!md4cmp(packet, buddy->GetBuddyID())) { + /* + The packet has an initial 16 bytes key for the buddy. + This is currently unused, so to make the transformation + we discard the first 10 bytes below and then overwrite + the other 6 with ip/port. + */ + CMemFile mem_packet(packet+10,size-10); + // Change the ip and port while leaving the rest untouched + mem_packet.Seek(0,wxFromStart); + mem_packet.WriteUInt32(host); + mem_packet.WriteUInt16(port); + CPacket* response = new CPacket(mem_packet, OP_EMULEPROT, OP_REASKCALLBACKTCP); + AddDebugLogLineM( false, logClientUDP, wxT("Client UDP socket: send OP_REASKCALLBACKTCP") ); + theStats::AddUpOverheadFileRequest(response->GetPacketSize()); + buddy->GetSocket()->SendPacket(response); + } + } + break; + } + case OP_REASKFILEPING: { + AddDebugLogLineM( false, logClientUDP, wxT("Client UDP socket: OP_REASKFILEPING") ); + theStats::AddDownOverheadFileRequest(size); + + CMemFile data_in(packet, size); + CMD4Hash reqfilehash = data_in.ReadHash(); + CKnownFile* reqfile = theApp->sharedfiles->GetFileByID(reqfilehash); + bool bSenderMultipleIpUnknown = false; + CUpDownClient* sender = theApp->uploadqueue->GetWaitingClientByIP_UDP(host, port, true, &bSenderMultipleIpUnknown); + + if (!reqfile) { + CPacket* response = new CPacket(OP_FILENOTFOUND,0,OP_EMULEPROT); + theStats::AddUpOverheadFileRequest(response->GetPacketSize()); + if (sender) { + SendPacket(response, host, port, sender->ShouldReceiveCryptUDPPackets(), sender->GetUserHash().GetHash(), false, 0); + } else { + SendPacket(response, host, port, false, NULL, false, 0); + } + + break; + } + + if (sender){ + sender->CheckForAggressive(); + + //Make sure we are still thinking about the same file + if (reqfilehash == sender->GetUploadFileID()) { + sender->AddAskedCount(); + sender->SetUDPPort(port); + sender->SetLastUpRequest(); + + if (sender->GetUDPVersion() > 3) { + sender->ProcessExtendedInfo(&data_in, reqfile); + } else if (sender->GetUDPVersion() > 2) { + uint16 nCompleteCountLast = sender->GetUpCompleteSourcesCount(); + uint16 nCompleteCountNew = data_in.ReadUInt16(); + sender->SetUpCompleteSourcesCount(nCompleteCountNew); + if (nCompleteCountLast != nCompleteCountNew) { + reqfile->UpdatePartsInfo(); + } + } + + CMemFile data_out(128); + if(sender->GetUDPVersion() > 3) { + if (reqfile->IsPartFile()) { + ((CPartFile*)reqfile)->WritePartStatus(&data_out); + } else { + data_out.WriteUInt16(0); + } + } + + data_out.WriteUInt16(theApp->uploadqueue->GetWaitingPosition(sender)); + CPacket* response = new CPacket(data_out, OP_EMULEPROT, OP_REASKACK); + theStats::AddUpOverheadFileRequest(response->GetPacketSize()); + AddDebugLogLineM( false, logClientUDP, wxT("Client UDP socket: OP_REASKACK to ") + sender->GetFullIP()); + SendPacket(response, host, port, sender->ShouldReceiveCryptUDPPackets(), sender->GetUserHash().GetHash(), false, 0); + } else { + AddDebugLogLineM( false, logClientUDP, wxT("Client UDP socket; ReaskFilePing; reqfile does not match") ); + } + } else { + if (!bSenderMultipleIpUnknown) { + if ((theStats::GetWaitingUserCount() + 50) > thePrefs::GetQueueSize()) { + CPacket* response = new CPacket(OP_QUEUEFULL,0,OP_EMULEPROT); + theStats::AddUpOverheadFileRequest(response->GetPacketSize()); + SendPacket(response,host,port, false, NULL, false, 0); // we cannot answer this one encrypted since we dont know this client + } + } else { + AddDebugLogLineM(false, logClientUDP, CFormat(wxT("UDP Packet received - multiple clients with the same IP but different UDP port found. Possible UDP Portmapping problem, enforcing TCP connection. IP: %s, Port: %u")) % Uint32toStringIP(host) % port); + } + } + break; + } + case OP_QUEUEFULL: { + AddDebugLogLineM( false, logClientUDP, wxT("Client UDP socket: OP_QUEUEFULL") ); + theStats::AddDownOverheadOther(size); + CUpDownClient* sender = theApp->downloadqueue->GetDownloadClientByIP_UDP(host,port); + if (sender) { + sender->SetRemoteQueueFull(true); + sender->UDPReaskACK(0); + } + break; + } + case OP_REASKACK: { + theStats::AddDownOverheadFileRequest(size); + CUpDownClient* sender = theApp->downloadqueue->GetDownloadClientByIP_UDP(host,port); + if (sender) { + CMemFile data_in(packet,size); + if ( sender->GetUDPVersion() > 3 ) { + sender->ProcessFileStatus(true, &data_in, sender->GetRequestFile()); + } + uint16 nRank = data_in.ReadUInt16(); + sender->SetRemoteQueueFull(false); + sender->UDPReaskACK(nRank); + } + break; + } + case OP_FILENOTFOUND: { + AddDebugLogLineM( false, logClientUDP, wxT("Client UDP socket: OP_FILENOTFOUND") ); + theStats::AddDownOverheadFileRequest(size); + CUpDownClient* sender = theApp->downloadqueue->GetDownloadClientByIP_UDP(host,port); + if (sender){ + sender->UDPReaskFNF(); // may delete 'sender'! + sender = NULL; + } + break; + } + + default: + theStats::AddDownOverheadOther(size); + } +} +// File_checked_for_headers diff --git a/src/ClientUDPSocket.h b/src/ClientUDPSocket.h new file mode 100644 index 00000000..7a60d596 --- /dev/null +++ b/src/ClientUDPSocket.h @@ -0,0 +1,45 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef CLIENTUDPSOCKET_H +#define CLIENTUDPSOCKET_H + +#include "MuleUDPSocket.h" + +class CClientUDPSocket : public CMuleUDPSocket +{ +public: + CClientUDPSocket(const amuleIPV4Address &address, const CProxyData *ProxyData = NULL); + +protected: + void OnReceive(int errorCode); + +private: + void OnPacketReceived(const wxIPV4address& addr, byte* buffer, size_t length); + void ProcessPacket(byte* packet, int16 size, int8 opcode, uint32 host, uint16 port); +}; + +#endif // CLIENTUDPSOCKET_H +// File_checked_for_headers diff --git a/src/Color.h b/src/Color.h new file mode 100644 index 00000000..17ac69dd --- /dev/null +++ b/src/Color.h @@ -0,0 +1,113 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2004-2008 Carlo Wood +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef COLOR_H +#define COLOR_H + +#if !defined(__WXPM__) && !defined(__WXMSW__) // Otherwise already defined in wx/defs.h. +#include // Do_not_auto_remove (old gcc) +typedef uint32_t COLORREF; +#else +#include "Types.h" // Do_not_auto_remove (Needed for windows compilation) +typedef unsigned long COLORREF; +#endif + + +inline int G_BLEND(int a, int percentage) +{ + int result = a * percentage / 100; + return (result > 255) ? 255 : result; +} + + +#if !defined(__WXMSW__) +inline COLORREF RGB(int a, int b, int c) +{ + COLORREF result; + result = (c & 0xff) << 16; + result |= (b & 0xff) << 8; + result |= (a & 0xff); + return result; +} + + +inline int GetBValue(COLORREF rgb) +{ + return (rgb >> 16) & 0xff; +} + + +inline int GetGValue(COLORREF rgb) +{ + return (rgb >> 8) & 0xff; +} + + +inline int GetRValue(COLORREF rgb) +{ + return rgb & 0xff; +} + +#endif + + +inline COLORREF DarkenColour(COLORREF rgb, int level) +{ + return RGB(GetRValue(rgb) / level, GetGValue(rgb) / level, GetBValue(rgb) / level); +} + + +#if wxUSE_GUI + +#include // Needed for wxColour + +inline wxColour BLEND( wxColour colour, int percentage ) +{ + int red = G_BLEND( colour.Red(), percentage ); + int green = G_BLEND( colour.Green(), percentage ); + int blue = G_BLEND( colour.Blue(), percentage ); + + return wxColour( red, green, blue ); +} + + +inline wxColour WxColourFromCr(COLORREF cr) +{ + return wxColour(GetRValue(cr),GetGValue(cr),GetBValue(cr)); +} + + +inline COLORREF CrFromWxColour(wxColour col) +{ + return RGB(col.Red(), col.Green(), col.Blue()); +} + +#endif /* wxUSE_GUI */ + +#define SYSCOLOR(x) (wxSystemSettings::GetColour(x)) + + +#endif +// File_checked_for_headers diff --git a/src/ColorFrameCtrl.cpp b/src/ColorFrameCtrl.cpp new file mode 100644 index 00000000..d1b6a9c2 --- /dev/null +++ b/src/ColorFrameCtrl.cpp @@ -0,0 +1,135 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include + +#include "ColorFrameCtrl.h" // Interface declarations + +///////////////////////////////////////////////////////////////////////////// +// CColorFrameCtrl +CColorFrameCtrl::CColorFrameCtrl( wxWindow* parent,int id, int wid,int hei ) + : wxControl(parent,id,wxDefaultPosition,wxSize(wid,hei)), + m_brushBack(wxColour(0,0,0),wxSOLID), + m_brushFrame(wxColour(0,255,255),wxSOLID) +{ + m_crBackColor = RGB( 0, 0, 0) ; // see also SetBackgroundColor + m_crFrameColor = RGB( 0, 255, 255) ; // see also SetFrameColor + SetSizeHints(wid,hei,wid,hei,0,0); + wxRect rc=GetClientRect(); + m_rectClient.left=rc.x; + m_rectClient.top=rc.y; + m_rectClient.right=rc.x + wid; + m_rectClient.bottom=rc.y + hei; + +} // CColorFrameCtrl + +///////////////////////////////////////////////////////////////////////////// +CColorFrameCtrl::~CColorFrameCtrl() +{ +} // ~CColorFrameCtrl + + +BEGIN_EVENT_TABLE(CColorFrameCtrl,wxControl) + EVT_PAINT(CColorFrameCtrl::OnPaint) + EVT_SIZE(CColorFrameCtrl::OnSize) +END_EVENT_TABLE() + +///////////////////////////////////////////////////////////////////////////// +// CColorFrameCtrl message handlers + +///////////////////////////////////////////////////////////////////////////// +void CColorFrameCtrl::SetFrameColor( COLORREF color ) +{ + m_crFrameColor = color; + m_brushFrame.SetColour(wxColour(GetRValue(m_crFrameColor), + GetGValue(m_crFrameColor), + GetBValue(m_crFrameColor))); + + Refresh(FALSE); + +} // SetFrameColor + + +///////////////////////////////////////////////////////////////////////////// +void CColorFrameCtrl::SetBackgroundColor(COLORREF color) +{ + m_crBackColor = color ; + + m_brushBack.SetColour(wxColour(GetRValue(m_crBackColor), + GetGValue(m_crBackColor), + GetBValue(m_crBackColor))); + + // clear out the existing garbage, re-start with a clean plot + Refresh(FALSE); + +} // SetBackgroundColor + + +//////////////////////////////////////////////////////////////////////////// +void CColorFrameCtrl::OnPaint(wxPaintEvent& WXUNUSED(evt)) +{ + wxPaintDC dc(this); + + wxRect rc; + rc.x=m_rectClient.left; + rc.y=m_rectClient.top; + rc.width=m_rectClient.right-m_rectClient.left; + rc.height=m_rectClient.bottom-m_rectClient.top; + + dc.SetPen(*wxTRANSPARENT_PEN); + dc.SetBrush(m_brushBack); + dc.DrawRectangle(rc); + + wxPen kyna(wxColour(0,0,0),1,wxSOLID); + dc.SetPen(kyna); + dc.DrawLine(rc.x+1,rc.y+1,rc.x+rc.width-2,rc.y+1); + dc.DrawLine(rc.x+rc.width-2,rc.y+1,rc.x+rc.width-2,rc.y+rc.height-2); + dc.DrawLine(rc.x+rc.width-2,rc.y+rc.height-2,rc.x+1,rc.y+rc.height-2); + dc.DrawLine(rc.x+1,rc.y+rc.height-2,rc.x+1,rc.y+1); + + dc.SetPen(*wxWHITE_PEN); + dc.DrawLine(rc.x+rc.width-1,rc.y,rc.x+rc.width-1,rc.y+rc.height-1); + dc.DrawLine(rc.x+rc.width-1,rc.y+rc.height-1,rc.x,rc.y+rc.height-1); + dc.SetPen(*wxGREY_PEN); + dc.DrawLine(rc.x+rc.width,rc.y,rc.x,rc.y); + dc.DrawLine(rc.x,rc.y,rc.x,rc.y+rc.height); + +} // OnPaint + +///////////////////////////////////////////////////////////////////////////// +void CColorFrameCtrl::OnSize(wxSizeEvent& WXUNUSED(evt)) +{ + + // NOTE: OnSize automatically gets called during the setup of the control + // Kry - Not on Mac. + + wxRect rc=GetClientRect(); + m_rectClient.left=rc.x; + m_rectClient.top=rc.y; + m_rectClient.right=rc.x + rc.width; + m_rectClient.bottom=rc.y + rc.height; + +} // OnSize +// File_checked_for_headers diff --git a/src/ColorFrameCtrl.h b/src/ColorFrameCtrl.h new file mode 100644 index 00000000..90b58bc0 --- /dev/null +++ b/src/ColorFrameCtrl.h @@ -0,0 +1,66 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef COLORFRAMECTRL_H +#define COLORFRAMECTRL_H + +#include // Needed for wxBrush +#include // Needed for wxControl + +#include "Types.h" // Needed for RECT +#include "Color.h" // Needed for COLORREF + + +///////////////////////////////////////////////////////////////////////////// +// CColorFrameCtrl window + +class CColorFrameCtrl : public wxControl { + +public: + CColorFrameCtrl( wxWindow* parent, int id,int wid,int hei ); + + void SetFrameColor(COLORREF color); + void SetBackgroundColor(COLORREF color); + + COLORREF m_crBackColor; // background color + COLORREF m_crFrameColor; // frame color + + virtual ~CColorFrameCtrl(); + +protected: + + void OnPaint(wxPaintEvent& evt); + void OnSize(wxSizeEvent& evt); + + DECLARE_EVENT_TABLE() + + RECT m_rectClient; + wxBrush m_brushBack,m_brushFrame; +}; + +///////////////////////////////////////////////////////////////////////////// + +#endif // COLORFRAMECTRL_H +// File_checked_for_headers diff --git a/src/CommentDialog.cpp b/src/CommentDialog.cpp new file mode 100644 index 00000000..dda4512c --- /dev/null +++ b/src/CommentDialog.cpp @@ -0,0 +1,83 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "CommentDialog.h" // Interface declarations +#include "KnownFile.h" // Needed for CKnownFile +#include "muuli_wdr.h" // Needed for commentDlg +// CommentDialog dialog + +//IMPLEMENT_DYNAMIC(CCommentDialog, CDialog) +CCommentDialog::CCommentDialog(wxWindow* parent,CKnownFile* file) +: wxDialog(parent,-1,_("File Comments"), +wxDefaultPosition,wxDefaultSize,wxDEFAULT_DIALOG_STYLE|wxSYSTEM_MENU) +{ + m_file = file; + wxSizer* content=commentDlg(this,TRUE); + content->SetSizeHints(this); + content->Show(this,TRUE); + Center(); + ratebox = CastChild( IDC_RATELIST, wxChoice ); + OnInitDialog(); +} + +CCommentDialog::~CCommentDialog() +{ +} + +BEGIN_EVENT_TABLE(CCommentDialog,wxDialog) + EVT_TEXT_ENTER(IDC_CMT_TEXT, CCommentDialog::OnBnClickedApply) + EVT_BUTTON(IDCOK, CCommentDialog::OnBnClickedApply) + EVT_BUTTON(IDC_FC_CLEAR, CCommentDialog::OnBnClickedClear) + EVT_BUTTON(IDCCANCEL, CCommentDialog::OnBnClickedCancel) +END_EVENT_TABLE() + +void CCommentDialog::OnBnClickedApply(wxCommandEvent& WXUNUSED(evt)) +{ + wxString SValue; + SValue = CastChild( IDC_CMT_TEXT, wxTextCtrl )->GetValue(); + m_file->SetFileComment(SValue); + m_file->SetFileRating((int8)ratebox->GetSelection()); + EndModal(0); +} + +void CCommentDialog::OnBnClickedClear(wxCommandEvent& WXUNUSED(evt)) +{ + CastChild(IDC_CMT_TEXT, wxTextCtrl)->SetValue(wxEmptyString); +} + +void CCommentDialog::OnBnClickedCancel(wxCommandEvent& WXUNUSED(evt)) +{ + EndModal(0); +} + +bool CCommentDialog::OnInitDialog() +{ + CastChild(IDC_CMT_TEXT, wxTextCtrl)->SetValue(m_file->GetFileComment()); + CastChild(IDC_CMT_TEXT, wxTextCtrl)->SetMaxLength(MAXFILECOMMENTLEN); + ratebox->SetSelection(m_file->GetFileRating()); + return TRUE; +} +// File_checked_for_headers diff --git a/src/CommentDialog.h b/src/CommentDialog.h new file mode 100644 index 00000000..58bdf10c --- /dev/null +++ b/src/CommentDialog.h @@ -0,0 +1,54 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef COMMENTDIALOG_H +#define COMMENTDIALOG_H + +#include // Needed for wxDialog +#include // Needed for wxChoice + +class CKnownFile; + +// CCommentDialog dialog + +class CCommentDialog : public wxDialog +{ +public: + CCommentDialog(wxWindow* pParent, CKnownFile* file); // standard constructor + virtual ~CCommentDialog(); + virtual bool OnInitDialog(); +protected: + DECLARE_EVENT_TABLE() +public: + void OnBnClickedApply(wxCommandEvent& evt); + void OnBnClickedClear(wxCommandEvent& evt); + void OnBnClickedCancel(wxCommandEvent& evt); +private: + wxChoice* ratebox; + CKnownFile* m_file; +}; + +#endif // COMMENTDIALOG_H +// File_checked_for_headers diff --git a/src/CommentDialogLst.cpp b/src/CommentDialogLst.cpp new file mode 100644 index 00000000..194fb2d7 --- /dev/null +++ b/src/CommentDialogLst.cpp @@ -0,0 +1,141 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "CommentDialogLst.h" // Interface declarations +#include "muuli_wdr.h" // Needed for commentLstDlg +#include "PartFile.h" // Needed for CPartFile +#include // Needed for CFormat +#include "MuleListCtrl.h" // Needed for CMuleListCtrl +#include "Preferences.h" +#include "amule.h" // Needed for theApp + + + +BEGIN_EVENT_TABLE(CCommentDialogLst,wxDialog) + EVT_BUTTON(IDCOK,CCommentDialogLst::OnBnClickedApply) + EVT_BUTTON(IDCREF,CCommentDialogLst::OnBnClickedRefresh) +END_EVENT_TABLE() + + +/* + * Constructor + */ +CCommentDialogLst::CCommentDialogLst(wxWindow*parent, CPartFile* file) +: +wxDialog(parent, -1, wxString(_("File Comments")), + wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER), +m_file(file) +{ + wxSizer* content = commentLstDlg(this, true); + content->Show(this, true); + + m_list = CastChild(IDC_LST, CMuleListCtrl); + m_list->InsertColumn(0, _("Username"), wxLIST_FORMAT_LEFT, 130); + m_list->InsertColumn(1, _("File Name"), wxLIST_FORMAT_LEFT, 130); + m_list->InsertColumn(2, _("Rating"), wxLIST_FORMAT_LEFT, 80); + m_list->InsertColumn(3, _("Comment"), wxLIST_FORMAT_LEFT, 340); + m_list->SetSortFunc(SortProc); + + UpdateList(); +} + + +CCommentDialogLst::~CCommentDialogLst() +{ + ClearList(); +} + + +void CCommentDialogLst::OnBnClickedApply(wxCommandEvent& WXUNUSED(evt)) +{ + EndModal(0); +} + + +void CCommentDialogLst::OnBnClickedRefresh(wxCommandEvent& WXUNUSED(evt)) +{ + UpdateList(); +} + + +void CCommentDialogLst::UpdateList() +{ + int count = 0; + ClearList(); + + const FileRatingList &list = m_file->GetRatingAndComments(); + for (FileRatingList::const_iterator it = list.begin(); it != list.end(); ++it) { + if (!thePrefs::IsCommentFiltered(it->Comment)) { + m_list->InsertItem(count, it->UserName); + m_list->SetItem(count, 1, it->FileName); + m_list->SetItem(count, 2, (it->Rating != -1) ? GetRateString(it->Rating) : wxString(wxT("on"))); + m_list->SetItem(count, 3, it->Comment); + m_list->SetItemPtrData(count, reinterpret_cast(new SFileRating(*it))); + ++count; + } + } + + wxString info; + if (count == 0) { + info = _("No comments"); + } else { + info = wxString::Format(wxPLURAL("%u comment", "%u comments", count), count); + } + + FindWindow(IDC_CMSTATUS)->SetLabel(info); + FindWindow(IDC_CMSTATUS)->GetParent()->Layout(); + + m_file->UpdateFileRatingCommentAvail(); +} + + +void CCommentDialogLst::ClearList() +{ + size_t count = m_list->GetItemCount(); + for (size_t i = 0; i < count; ++i) { + delete (SFileRating*)m_list->GetItemData(i); + } + + m_list->DeleteAllItems(); +} + + +int CCommentDialogLst::SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData) +{ + SFileRating* file1 = (SFileRating*)item1; + SFileRating* file2 = (SFileRating*)item2; + + int mod = (sortData & CMuleListCtrl::SORT_DES) ? -1 : 1; + + switch (sortData & CMuleListCtrl::COLUMN_MASK) { + case 0: return mod * file1->UserName.Cmp(file2->UserName); + case 1: return mod * file1->FileName.Cmp(file2->FileName); + case 2: return mod * (file1->Rating - file2->Rating); + case 3: return mod * file1->Comment.Cmp(file2->Comment); + default: + return 0; + } +} +// File_checked_for_headers diff --git a/src/CommentDialogLst.h b/src/CommentDialogLst.h new file mode 100644 index 00000000..914ab622 --- /dev/null +++ b/src/CommentDialogLst.h @@ -0,0 +1,75 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef COMMENTDIALOGLST_H +#define COMMENTDIALOGLST_H + +#include // Needed for wxDialog // Do_not_auto_remove +#include + +class CMuleListCtrl; +class wxCommandEvent; +class CPartFile; + +/** + * This dialog is used to display file-comments received from other clients. + */ +class CCommentDialogLst : public wxDialog +{ +public: + CCommentDialogLst(wxWindow* pParent, CPartFile* file); + ~CCommentDialogLst(); + + /** + * Sorter function for the CMuleListCtrl used to contain the lists. + */ + static int wxCALLBACK SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData); + +private: + void OnBnClickedApply(wxCommandEvent& evt); + void OnBnClickedRefresh(wxCommandEvent& evt); + + /** + * Updates the contents of the comments/ratings list. + */ + void UpdateList(); + + /** + * Clears the contents of the comments/ratings list. + */ + void ClearList(); + + //! The file to display comments for. + CPartFile* m_file; + + //! The list containing comments/ratings. + CMuleListCtrl* m_list; + + + DECLARE_EVENT_TABLE() +}; + +#endif // COMMENTDIALOGLST_H +// File_checked_for_headers diff --git a/src/Constants.h b/src/Constants.h new file mode 100644 index 00000000..be31d26f --- /dev/null +++ b/src/Constants.h @@ -0,0 +1,88 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2006-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef CONSTANTS_H +#define CONSTANTS_H + +//! This enum lists the views currently supported by the CClientListCtrl class. +enum ViewType +{ + //! The "neutral" state, where nothing is displayed. + vtNone = 0, + + //! Clients which are received files are displayed. + vtUploading = 1, + + //! Clients which are queued for files are displayed. + vtQueued = 2, + + //! All clients are displayed. + vtClients = 3 +}; + + +//! These types specifies the char. of a given item on the CDownloadListCtrl +enum DownloadItemType +{ + //! A CPartFile object + FILE_TYPE, + //! A source which is currently queued for another file. + A4AF_SOURCE, + //! A source which has not yet been contacted. + UNAVAILABLE_SOURCE, + //! A source which is currently queued for this file. + AVAILABLE_SOURCE +}; + + +// lfroen : custom events for core internal messages +// 'cause - there's no wxCommand etc in wxBase +enum Core_Event_ID +{ + HTTP_DOWNLOAD_FINISHED = 1, + + SOURCE_DNS_DONE, + UDP_DNS_DONE, + SERVER_DNS_DONE +}; + + +//! These IDs are used when a download is initiated via the HTTPThread. +enum HTTP_Download_File +{ + //! The download is a ipfilter.dat file (possibly compressed). + HTTP_IPFilter = 1, + //! The download is a server.met file (possibly compressed). + HTTP_ServerMet, + // Auto-updating server.met has a different callback. + HTTP_ServerMetAuto, + //! The download is the version check file. + HTTP_VersionCheck, + //! The download is a notes.dat file (possibly compressed). + HTTP_NodesDat +}; + + +#endif +// File_checked_for_headers diff --git a/src/CryptoPP_Inc.h b/src/CryptoPP_Inc.h new file mode 100644 index 00000000..c619ab67 --- /dev/null +++ b/src/CryptoPP_Inc.h @@ -0,0 +1,49 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef CRYPTOPP_INC_H +#define CRYPTOPP_INC_H + +#ifdef __WEAK_CRYPTO__ + #define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1 +#endif + +#ifdef HAVE_CONFIG_H + #include "config.h" // Needed for CRYPTOPP_INCLUDE_PREFIX +#else + #define CRYPTOPP_INCLUDE_PREFIX cryptopp +#endif + +#define CRYPTO_HEADER(hdr) + +#include CRYPTO_HEADER(config.h) +#include CRYPTO_HEADER(md4.h) +#include CRYPTO_HEADER(rsa.h) +#include CRYPTO_HEADER(base64.h) +#include CRYPTO_HEADER(osrng.h) +#include CRYPTO_HEADER(files.h) +#include CRYPTO_HEADER(sha.h) +#include CRYPTO_HEADER(des.h) + +#endif /* CRYPTOPP_INC_H */ diff --git a/src/DataToText.cpp b/src/DataToText.cpp new file mode 100644 index 00000000..04fed984 --- /dev/null +++ b/src/DataToText.cpp @@ -0,0 +1,137 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "KnownFile.h" // Needed by PriorityToStr +#include "updownclient.h" // Needed by DownloadStateToStr and GetSoftName + +#include + +wxString PriorityToStr( int priority, bool isAuto ) +{ + if ( isAuto ) { + switch ( priority ) { + case PR_LOW: return _("Auto [Lo]"); + case PR_NORMAL: return _("Auto [No]"); + case PR_HIGH: return _("Auto [Hi]"); + } + } else { + switch ( priority ) { + case PR_VERYLOW: return _("Very low"); + case PR_LOW: return _("Low"); + case PR_NORMAL: return _("Normal"); + case PR_HIGH: return _("High"); + case PR_VERYHIGH: return _("Very High"); + case PR_POWERSHARE: return _("Release"); + } + } + + wxASSERT( false ); + + return _("Unknown"); +} + + +wxString DownloadStateToStr( int state, bool queueFull ) +{ + switch ( state ) { + case DS_CONNECTING: return _("Connecting"); + case DS_CONNECTED: return _("Asking"); + case DS_WAITCALLBACK: return _("Connecting via server"); + case DS_ONQUEUE: return ( queueFull ? _("Queue Full") : _("On Queue") ); + case DS_DOWNLOADING: return _("Transferring"); + case DS_REQHASHSET: return _("Receiving hashset"); + case DS_NONEEDEDPARTS: return _("No needed parts"); + case DS_LOWTOLOWIP: return _("Cannot connect LowID to LowID"); + case DS_TOOMANYCONNS: return _("Too many connections"); + case DS_NONE: return _("Unknown"); + case DS_WAITCALLBACKKAD: return _("Connecting via Kad"); + case DS_TOOMANYCONNSKAD: return _("Too many Kad connections"); + case DS_BANNED: return _("Banned"); + case DS_ERROR: return _("Connection Error"); + case DS_REMOTEQUEUEFULL: return _("Remote Queue Full"); + } + + wxASSERT( false ); + + return _("Unknown"); +} + + +const wxString GetSoftName(unsigned int software_ident) +{ + switch (software_ident) { + case SO_OLDEMULE: + case SO_EMULE: + return wxT("eMule"); + case SO_CDONKEY: + return wxT("cDonkey"); + case SO_LXMULE: + return wxT("(l/x)Mule"); + case SO_AMULE: + return wxT("aMule"); + case SO_SHAREAZA: + case SO_NEW_SHAREAZA: + case SO_NEW2_SHAREAZA: + return wxT("Shareaza"); + case SO_EMULEPLUS: + return wxT("eMule+"); + case SO_HYDRANODE: + return wxT("HydraNode"); + case SO_MLDONKEY: + return wxTRANSLATE("Old MLDonkey"); + case SO_NEW_MLDONKEY: + case SO_NEW2_MLDONKEY: + return wxTRANSLATE("New MLDonkey"); + case SO_LPHANT: + return wxT("lphant"); + case SO_EDONKEYHYBRID: + return wxT("eDonkeyHybrid"); + case SO_EDONKEY: + return wxT("eDonkey"); + case SO_UNKNOWN: + return wxTRANSLATE("Unknown"); + case SO_COMPAT_UNK: + return wxTRANSLATE("eMule Compatible"); + default: + return wxEmptyString; + } +} + + +wxString OriginToText(unsigned int source_from) +{ + switch ((ESourceFrom)source_from) { + case SF_LOCAL_SERVER: return wxTRANSLATE("Local Server"); + case SF_REMOTE_SERVER: return wxTRANSLATE("Remote Server"); + case SF_KADEMLIA: return wxTRANSLATE("Kad"); + case SF_SOURCE_EXCHANGE: return wxTRANSLATE("Source Exchange"); + case SF_PASSIVE: return wxTRANSLATE("Passive"); + case SF_LINK: return wxTRANSLATE("Link"); + case SF_SOURCE_SEEDS: return wxTRANSLATE("Source Seeds"); + case SF_NONE: + default: return wxTRANSLATE("Unknown"); + } +} +// File_checked_for_headers diff --git a/src/DataToText.h b/src/DataToText.h new file mode 100644 index 00000000..5283ac19 --- /dev/null +++ b/src/DataToText.h @@ -0,0 +1,51 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef DATATOTEXT_H +#define DATATOTEXT_H + +class wxString; +class CUpDownClient; + +// Returns the textual representation of a priority value +wxString PriorityToStr( int priority, bool isAuto ); + +// Returns the textual representation of download states +wxString DownloadStateToStr( int state, bool queueFull ); + +/** + * @return Human-readable client software name. + */ +const wxString GetSoftName( unsigned int software_ident ); + +/** + * Get "Source From" text, i.e. where we got the source from. + * + * @param source_from A ESourceFrom enum value. + * @return Human-readable text for the ESourceFrom enum values. + */ +wxString OriginToText(unsigned int source_from); + +#endif /* DATATOTEXT_H */ +// File_checked_for_headers diff --git a/src/DeadSourceList.cpp b/src/DeadSourceList.cpp new file mode 100644 index 00000000..890ffafc --- /dev/null +++ b/src/DeadSourceList.cpp @@ -0,0 +1,167 @@ +// +// This file is part of the aMule Project. +// +// Copyright (C) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2004 Merkur ( devs@users.sourceforge.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "DeadSourceList.h" + +#include + +#include "updownclient.h" + +#define CLEANUPTIME MIN2MS(60) + +#define BLOCKTIME (::GetTickCount() + (m_bGlobalList ? MIN2MS(30) : MIN2MS(45))) +#define BLOCKTIMEFW (::GetTickCount() + (m_bGlobalList ? MIN2MS(45) : MIN2MS(60))) + +/////////////////////////////////////////////////////////////////////////////////////// +//// CDeadSource + + +CDeadSourceList::CDeadSource::CDeadSource(uint32 ID, uint16 Port, uint32 ServerIP, uint16 KadPort) +{ + m_ID = ID; + m_Port = Port; + m_KadPort = KadPort; + m_ServerIP = ServerIP; + m_TimeStamp = 0; +} + + +void CDeadSourceList::CDeadSource::SetTimeout( uint32 t ) +{ + m_TimeStamp = t; +} + + +uint32 CDeadSourceList::CDeadSource::GetTimeout() const +{ + return m_TimeStamp; +} + + +bool CDeadSourceList::CDeadSource::operator==(const CDeadSource& other) const +{ + if ( m_ID == other.m_ID ) { + if ( m_Port == other.m_Port || m_KadPort == other.m_KadPort ) { + if ( IsLowID( m_ID ) ) { + return m_ServerIP == other.m_ServerIP; + } else { + return true; + } + } + } + + return false; +} + + +/////////////////////////////////////////////////////////////////////////////////////// +//// CDeadSourceList + +CDeadSourceList::CDeadSourceList(bool isGlobal) +{ + m_dwLastCleanUp = ::GetTickCount(); + m_bGlobalList = isGlobal; +} + + +uint32 CDeadSourceList::GetDeadSourcesCount() const +{ + return m_sources.size(); +} + + +bool CDeadSourceList::IsDeadSource(const CUpDownClient* client) +{ + CDeadSource source( + client->GetUserIDHybrid(), + client->GetUserPort(), + client->GetServerIP(), + client->GetKadPort() + ); + + + DeadSourcePair range = m_sources.equal_range( client->GetUserIDHybrid() ); + for ( ; range.first != range.second; range.first++ ) { + if ( range.first->second == source ) { + // Check if the entry is still valid + if ( range.first->second.GetTimeout() > GetTickCount() ) { + return true; + } + + // The source is no longer dead, so remove it to reduce the size of the list + m_sources.erase( range.first ); + break; + } + } + + return false; +} + + +void CDeadSourceList::AddDeadSource( const CUpDownClient* client ) +{ + CDeadSource source( + client->GetUserIDHybrid(), + client->GetUserPort(), + client->GetServerIP(), + client->GetKadPort() + ); + + // Set the timeout for the new source + source.SetTimeout( client->HasLowID() ? BLOCKTIMEFW : BLOCKTIME ); + + // Check if the source is already listed + DeadSourcePair range = m_sources.equal_range( client->GetUserIDHybrid() ); + for ( ; range.first != range.second; range.first++ ) { + if ( range.first->second == source ) { + range.first->second = source; + return; + } + } + + m_sources.insert( DeadSourceMap::value_type( client->GetUserIDHybrid(), source ) ); + + // Check if we should cleanup the list. This is + // done to avoid a buildup of stale entries. + if ( GetTickCount() - m_dwLastCleanUp > CLEANUPTIME ) { + CleanUp(); + } +} + + +void CDeadSourceList::CleanUp() +{ + m_dwLastCleanUp = ::GetTickCount(); + + DeadSourceIterator it = m_sources.begin(); + for ( ; it != m_sources.end(); ) { + if ( it->second.GetTimeout() < m_dwLastCleanUp ) { + m_sources.erase( it++ ); + } else { + ++it; + } + } +} +// File_checked_for_headers diff --git a/src/DeadSourceList.h b/src/DeadSourceList.h new file mode 100644 index 00000000..5d7953bf --- /dev/null +++ b/src/DeadSourceList.h @@ -0,0 +1,151 @@ +// +// This file is part of the aMule Project. +// +// Copyright (C) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2004 Merkur ( devs@users.sourceforge.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef DEADSOURCELIST_H +#define DEADSOURCELIST_H + + +#include + +#include "Types.h" + + +class CUpDownClient; + + +/** + * This class keeps track of "invalid" sources. + * + * A dead source is a source that has been evaluated as being useles + * which can be due to serveral reasons, such as not responding to + * queries. This list then allows for those sources to be ignored + * for an set ammount of time in order to avoid the overhead of + * trying to connect to them. + * + * This is important, since these sources would be removed and readded + * repeatedly, causing extra overhead with no gain. + */ +class CDeadSourceList +{ +public: + /** + * Constructor. + * + * @param isGlobal Specifies if the list is global or not, used for debugging. + */ + CDeadSourceList(bool isGlobal = false); + + + /** + * Adds a client to the list of dead sources. + */ + void AddDeadSource(const CUpDownClient* client); + + /** + * Returns true if the client object is a dead source. + */ + bool IsDeadSource(const CUpDownClient* client); + + + /** + * Returns the number of sources. + */ + uint32 GetDeadSourcesCount() const; + +private: + /** + * Removes too old entries from the list. + */ + void CleanUp(); + + + /** + * Record of dead source. + */ + class CDeadSource + { + public: + /** + * Constructor. + * + * @param ID The IP/ID of the recorded client. + * @param Port The TCP port of the recorded client. + * @param ServerIP The ip of the connected server. + * @param KadPort The Kad port used by the client. + * + * Notes: + * * ID must be specified. + * * Either KadPort or Port must be specified. + * * For lowid sources, ServerIP must be specified. + * + */ + CDeadSource(uint32 ID, uint16 Port, uint32 ServerIP, uint16 KadPort); + + + /** + * Equality operator. + */ + bool operator==(const CDeadSource& other) const; + + + /** + * Sets the timestamp for the time where this entry will expire. + */ + void SetTimeout( uint32 t ); + + /** + * Returns the timestamp of this entry. + */ + uint32 GetTimeout() const; + + private: + //! The ID/IP of the client. + uint32 m_ID; + //! The TCP port of the client + uint16 m_Port; + //! The Kad port of the client. + uint16 m_KadPort; + //! The IP of the server the client is connected to. + uint32 m_ServerIP; + //! The timestamp of DOOM! + uint32 m_TimeStamp; + }; + + + typedef std::multimap< uint32, CDeadSource > DeadSourceMap; + typedef DeadSourceMap::iterator DeadSourceIterator; + typedef std::pair DeadSourcePair; + //! List of currently dead sources. + DeadSourceMap m_sources; + + + //! The timestamp of when the last cleanup was performed. + uint32 m_dwLastCleanUp; + //! Specifies if the list is global or not. + bool m_bGlobalList; +}; + +#endif +// File_checked_for_headers diff --git a/src/DirectoryTreeCtrl.cpp b/src/DirectoryTreeCtrl.cpp new file mode 100644 index 00000000..48350333 --- /dev/null +++ b/src/DirectoryTreeCtrl.cpp @@ -0,0 +1,358 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Robert Rostek ( tecxx@rrs.at ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "DirectoryTreeCtrl.h" // Interface declarations + +#include +#include +#include + +#include +#include +#include "muuli_wdr.h" // Needed for amuleSpecial + + +BEGIN_EVENT_TABLE(CDirectoryTreeCtrl, wxTreeCtrl) + EVT_TREE_ITEM_RIGHT_CLICK(wxID_ANY, CDirectoryTreeCtrl::OnRButtonDown) + EVT_TREE_ITEM_ACTIVATED(wxID_ANY, CDirectoryTreeCtrl::OnItemActivated) + EVT_TREE_ITEM_EXPANDED(wxID_ANY, CDirectoryTreeCtrl::OnItemExpanding) +END_EVENT_TABLE() + + +class CItemData : public wxTreeItemData +{ + public: + CItemData(const CPath& pathComponent) + : m_data(0) + , m_path(pathComponent) + { + } + + ~CItemData() {} + + void AddCount() { m_data++; } + void SubCount() { m_data--; } + int GetCount() const { return m_data; } + const CPath& GetPathComponent() const { return m_path; } + private: + int m_data; + CPath m_path; +}; + + +CDirectoryTreeCtrl::CDirectoryTreeCtrl(wxWindow* parent, int id, const wxPoint& pos, wxSize siz, int flags) + : wxTreeCtrl(parent,id,pos,siz,flags,wxDefaultValidator,wxT("ShareTree")) +{ + Init(); +} + + +CDirectoryTreeCtrl::~CDirectoryTreeCtrl() +{ +} + +enum { + IMAGE_FOLDER = 0, + IMAGE_FOLDER_SUB_SHARED +}; + + +void CDirectoryTreeCtrl::Init() +{ + // init image(s) + wxImageList* images = new wxImageList(16, 16); + images->Add(wxBitmap(amuleSpecial(1))); + images->Add(wxBitmap(amuleSpecial(2))); + // Gives wxTreeCtrl ownership of the list + AssignImageList(images); + + + // Create an empty root item, which we can + // safely append when creating a full path. + wxTreeItemId root = AddRoot(wxEmptyString, IMAGE_FOLDER, -1, + new CItemData(CPath())); + + +#ifndef __WXMSW__ + AddChildItem(root, CPath(wxT("/"))); +#else + for (char drive = 'C'; drive <= 'Z'; drive++) { + wxString driveStr = wxString::Format(wxT("%c:"), drive); + + if (CPath::DirExists(driveStr)) { + AddChildItem(root, CPath(driveStr)); + } + } +#endif + + HasChanged = false; +} + + +void CDirectoryTreeCtrl::OnItemExpanding(wxTreeEvent& evt) +{ + wxTreeItemId hItem = evt.GetItem(); + + // Force reloading of the path + DeleteChildren(hItem); + AddSubdirectories(hItem, GetFullPath(hItem)); + + SortChildren(hItem); +} + + +void CDirectoryTreeCtrl::OnItemActivated(wxTreeEvent& evt) +{ + CheckChanged(evt.GetItem(), !IsBold(evt.GetItem())); + HasChanged = true; +} + + +void CDirectoryTreeCtrl::OnRButtonDown(wxTreeEvent& evt) +{ + MarkChildren(evt.GetItem(), !IsBold(evt.GetItem())); + HasChanged = true; +} + + +void CDirectoryTreeCtrl::MarkChildren(wxTreeItemId hChild, bool mark) +{ + // Ensure that children are added, otherwise we might only get a "." entry. + if (!IsExpanded(hChild) && ItemHasChildren(hChild)) { + DeleteChildren(hChild); + AddSubdirectories(hChild, GetFullPath(hChild)); + SortChildren(hChild); + } + + wxTreeItemIdValue cookie; + wxTreeItemId hChild2 = GetFirstChild(hChild, cookie); + while (hChild2.IsOk()) { + MarkChildren(hChild2, mark); + + hChild2 = GetNextSibling(hChild2); + } + + CheckChanged(hChild, mark); +} + + +void CDirectoryTreeCtrl::AddChildItem(wxTreeItemId hBranch, const CPath& item) +{ + wxCHECK_RET(hBranch.IsOk(), wxT("Attempted to add children to invalid item")); + + CPath fullPath = GetFullPath(hBranch).JoinPaths(item); + wxTreeItemId treeItem = AppendItem(hBranch, item.GetPrintable(), + IMAGE_FOLDER, -1, + new CItemData(item)); + + if (IsShared(fullPath)) { + SetItemBold(treeItem, true); + UpdateParentItems(treeItem, true); + } + + if (HasSharedSubdirectory(fullPath)) { + SetItemImage(treeItem, IMAGE_FOLDER_SUB_SHARED); + } + + if (HasSubdirectories(fullPath)) { + // Trick. will show + if it has subdirs + AppendItem(treeItem, wxT(".")); + } +} + + +CPath CDirectoryTreeCtrl::GetFullPath(wxTreeItemId hItem) +{ + wxCHECK_MSG(hItem.IsOk(), CPath(), wxT("Invalid item in GetFullPath")); + + CPath result; + for (; hItem.IsOk(); hItem = GetItemParent(hItem)) { + CItemData* data = dynamic_cast(GetItemData(hItem)); + wxCHECK_MSG(data, CPath(), wxT("Missing data-item in GetFullPath")); + + result = data->GetPathComponent().JoinPaths(result); + } + + return result; +} + + +void CDirectoryTreeCtrl::AddSubdirectories(wxTreeItemId hBranch, const CPath& path) +{ + wxCHECK_RET(path.IsOk(), wxT("Invalid path in AddSubdirectories")); + + CDirIterator sharedDir(path); + + CPath dirName = sharedDir.GetFirstFile(CDirIterator::Dir); + while (dirName.IsOk()) { + AddChildItem(hBranch, dirName); + + dirName = sharedDir.GetNextFile(); + } +} + + +bool CDirectoryTreeCtrl::HasSubdirectories(const CPath& folder) +{ + // Prevent error-messages if we try to traverse somewhere we have no access. + wxLogNull logNo; + + return CDirIterator(folder).HasSubDirs(); +} + + +void CDirectoryTreeCtrl::GetSharedDirectories(PathList* list) +{ + wxCHECK_RET(list, wxT("Invalid list in GetSharedDirectories")); + + list->insert(list->end(), m_lstShared.begin(), m_lstShared.end()); +} + + +void CDirectoryTreeCtrl::SetSharedDirectories(PathList* list) +{ + wxCHECK_RET(list, wxT("Invalid list in SetSharedDirectories")); + + m_lstShared.clear(); + m_lstShared.insert(m_lstShared.end(), list->begin(), list->end()); + + // Mark all shared root items (on windows this can be multiple + // drives, on unix there is only the root dir). + wxTreeItemIdValue cookie; + wxTreeItemId hChild = GetFirstChild(GetRootItem(), cookie); + + while (hChild.IsOk()) { + // Does this drive have shared subfolders? + if (HasSharedSubdirectory(GetFullPath(hChild))) { + SetItemImage(hChild, IMAGE_FOLDER_SUB_SHARED); + } + + // Is this drive shared? + if (IsShared(GetFullPath(hChild))) { + SetItemBold(hChild, true); + } + + hChild = GetNextSibling(hChild); + } +} + + +bool CDirectoryTreeCtrl::HasSharedSubdirectory(const CPath& path) +{ + PathList::iterator it = m_lstShared.begin(); + for (; it != m_lstShared.end(); ++it) { + // IsSameDir to avoid the case where 'path' itself is shared. + if (it->StartsWith(path) && (!it->IsSameDir(path))) { + return true; + } + } + + return false; +} + + +void CDirectoryTreeCtrl::CheckChanged(wxTreeItemId hItem, bool bChecked) +{ + if (IsBold(hItem) != bChecked) { + SetItemBold(hItem, bChecked); + + if (bChecked) { + AddShare(GetFullPath(hItem)); + } else { + DelShare(GetFullPath(hItem)); + } + + UpdateParentItems(hItem, bChecked); + } +} + + +bool CDirectoryTreeCtrl::IsShared(const CPath& path) +{ + wxCHECK_MSG(path.IsOk(), false, wxT("Invalid path in IsShared")); + + PathList::iterator it = m_lstShared.begin(); + for (; it != m_lstShared.end(); ++it) { + if (it->IsSameDir(path)) { + return true; + } + } + + return false; +} + + +void CDirectoryTreeCtrl::AddShare(const CPath& path) +{ + wxCHECK_RET(path.IsOk(), wxT("Invalid path in AddShare")); + + if (IsShared(path)) { + return; + } + + m_lstShared.push_back(path); +} + + +void CDirectoryTreeCtrl::DelShare(const CPath& path) +{ + wxCHECK_RET(path.IsOk(), wxT("Invalid path in DelShare")); + + PathList::iterator it = m_lstShared.begin(); + for (; it != m_lstShared.end(); ++it ) { + if (it->IsSameDir(path)) { + m_lstShared.erase(it); + return; + } + } +} + + +void CDirectoryTreeCtrl::UpdateParentItems(wxTreeItemId hChild, bool add) +{ + wxTreeItemId parent = hChild; + while (parent != GetRootItem()) { + parent = GetItemParent(parent); + CItemData* parent_data = dynamic_cast(GetItemData(parent)); + if (add) { + parent_data->AddCount(); + if (parent_data->GetCount()==1) { + SetItemImage(parent, IMAGE_FOLDER_SUB_SHARED); + } + } else { + switch (parent_data->GetCount()) { + case 0: + break; + case 1: + SetItemImage(parent, IMAGE_FOLDER); + default: + parent_data->SubCount(); + break; + } + } + }; +} +// File_checked_for_headers diff --git a/src/DirectoryTreeCtrl.h b/src/DirectoryTreeCtrl.h new file mode 100644 index 00000000..0bf930bd --- /dev/null +++ b/src/DirectoryTreeCtrl.h @@ -0,0 +1,89 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Robert Rostek ( tecxx@rrs.at ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef DIRECTORYTREECTRL_H +#define DIRECTORYTREECTRL_H + +#include +#include + +#include + + +class CDirectoryTreeCtrl : public wxTreeCtrl +{ +public: + typedef std::vector PathList; + + CDirectoryTreeCtrl(wxWindow* parent, int id, const wxPoint& pos, wxSize siz, int flags); + virtual ~CDirectoryTreeCtrl(); + + // get all shared directories + void GetSharedDirectories(PathList* list); + // set shared directories + void SetSharedDirectories(PathList* list); + + // User made any changes to list? + bool HasChanged; + +private: + // initialize control + void Init(); + + // add a new item + void AddChildItem(wxTreeItemId hBranch, const CPath& item); + // add subdirectory items + void AddSubdirectories(wxTreeItemId hBranch, const CPath& path); + // returns true if folder has at least one subdirectory + bool HasSubdirectories(const CPath& path); + // return the full path of an item (like C:\abc\somewhere\inheaven\) + CPath GetFullPath(wxTreeItemId hItem); + // check status of an item has changed + void CheckChanged(wxTreeItemId hItem, bool bChecked); + // returns true if a subdirectory of strDir is shared + bool HasSharedSubdirectory(const CPath& path); + // when sharing a directory, make all parent directories red + void UpdateParentItems(wxTreeItemId hChild, bool add); + + // share list access + bool IsShared(const CPath& path); + void AddShare(const CPath& path); + void DelShare(const CPath& path); + void MarkChildren(wxTreeItemId hChild, bool mark); + + void OnItemExpanding(wxTreeEvent& evt); + void OnRButtonDown(wxTreeEvent& evt); + void OnItemActivated(wxTreeEvent& evt); + + PathList m_lstShared; + + + DECLARE_EVENT_TABLE() +}; + +#undef wxTreeItemId + +#endif // DIRECTORYTREECTRL_H +// File_checked_for_headers diff --git a/src/DownloadClient.cpp b/src/DownloadClient.cpp new file mode 100644 index 00000000..2a034a05 --- /dev/null +++ b/src/DownloadClient.cpp @@ -0,0 +1,1696 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "updownclient.h" // Interface declarations + +#include +#include +#include +#include +#include +#include + +#include +#include // Needed for std:exp + +#include "ClientCredits.h" // Needed for CClientCredits +#include "ClientUDPSocket.h" // Needed for CClientUDPSocket +#include "DownloadQueue.h" // Needed for CDownloadQueue +#include "Preferences.h" // Needed for thePrefs +#include "Packet.h" // Needed for CPacket +#include "MemFile.h" // Needed for CMemFile +#include "ClientTCPSocket.h"// Needed for CClientTCPSocket +#include "ListenSocket.h" // Needed for CListenSocket +#include "amule.h" // Needed for theApp +#include "PartFile.h" // Needed for CPartFile +#include "SharedFileList.h" +#include "Statistics.h" // Needed for theStats +#include "Logger.h" +#include "GuiEvents.h" // Needed for Notify_* + + +#ifdef __MULE_UNUSED_CODE__ +// This function is left as a reminder. +// Changes here _must_ be reflected in CClientList::FindMatchingClient. +bool CUpDownClient::Compare(const CUpDownClient* tocomp, bool bIgnoreUserhash) const +{ + if (!tocomp) { + // should we wxASSERT here? + return false; + } + + //Compare only the user hash.. + if(!bIgnoreUserhash && HasValidHash() && tocomp->HasValidHash()) { + return GetUserHash() == tocomp->GetUserHash(); + } + + if (HasLowID()) { + //User is firewalled.. Must do two checks.. + if (GetIP()!=0 && GetIP() == tocomp->GetIP()) { + //The IP of both match + if (GetUserPort()!=0 && GetUserPort() == tocomp->GetUserPort()) { + //IP-UserPort matches + return true; + } + if (GetKadPort()!=0 && GetKadPort() == tocomp->GetKadPort()) { + //IP-KadPort Matches + return true; + } + } + + if (GetUserIDHybrid()!=0 + && GetUserIDHybrid() == tocomp->GetUserIDHybrid() + && GetServerIP()!=0 + && GetServerIP() == tocomp->GetServerIP() + && GetServerPort()!=0 + && GetServerPort() == tocomp->GetServerPort()) { + //Both have the same lowID, Same serverIP and Port.. + return true; + } + + //Both IP, and Server do not match.. + return false; + } + + //User is not firewalled. + if (GetUserPort()!=0) { + //User has a Port, lets check the rest. + if (GetIP() != 0 && tocomp->GetIP() != 0) { + //Both clients have a verified IP.. + if(GetIP() == tocomp->GetIP() && GetUserPort() == tocomp->GetUserPort()) { + //IP and UserPort match.. + return true; + } + } else { + //One of the two clients do not have a verified IP + if (GetUserIDHybrid() == tocomp->GetUserIDHybrid() && GetUserPort() == tocomp->GetUserPort()) { + //ID and Port Match.. + return true; + } + } + } + + if(GetKadPort()!=0) { + //User has a Kad Port. + if(GetIP() != 0 && tocomp->GetIP() != 0) { + //Both clients have a verified IP. + if(GetIP() == tocomp->GetIP() && GetKadPort() == tocomp->GetKadPort()) { + //IP and KadPort Match.. + return true; + } + } else { + //One of the users do not have a verified IP. + if (GetUserIDHybrid() == tocomp->GetUserIDHybrid() && GetKadPort() == tocomp->GetKadPort()) { + //ID and KadProt Match.. + return true; + } + } + } + + //No Matches.. + return false; +} +#endif + + +bool CUpDownClient::AskForDownload() +{ + // 0.42e + if (theApp->listensocket->TooManySockets()) { + if (!m_socket) { + if (GetDownloadState() != DS_TOOMANYCONNS) { + SetDownloadState(DS_TOOMANYCONNS); + } + return true; + } else if (!m_socket->IsConnected()) { + if (GetDownloadState() != DS_TOOMANYCONNS) { + SetDownloadState(DS_TOOMANYCONNS); + } + return true; + } + } + m_bUDPPending = false; + m_dwLastAskedTime = ::GetTickCount(); + SetDownloadState(DS_CONNECTING); + return TryToConnect(); +} + + +void CUpDownClient::SendStartupLoadReq() +{ + // 0.42e + if (m_socket==NULL || m_reqfile==NULL) { + return; + } + SetDownloadState(DS_ONQUEUE); + CMemFile dataStartupLoadReq(16); + dataStartupLoadReq.WriteHash(m_reqfile->GetFileHash()); + CPacket* packet = new CPacket(dataStartupLoadReq, OP_EDONKEYPROT, OP_STARTUPLOADREQ); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_STARTUPLOADREQ to ") + GetFullIP()); + SendPacket(packet, true, true); +} + + +bool CUpDownClient::IsSourceRequestAllowed() +{ + //#warning REWRITE - Source swapping from eMule. + // 0.42e + uint32 dwTickCount = ::GetTickCount() + CONNECTION_LATENCY; + uint32 nTimePassedClient = dwTickCount - GetLastSrcAnswerTime(); + uint32 nTimePassedFile = dwTickCount - m_reqfile->GetLastAnsweredTime(); + bool bNeverAskedBefore = (GetLastAskedForSources() == 0); + + uint32 uSources = m_reqfile->GetSourceCount(); + return ( + // if client has the correct extended protocol + ExtProtocolAvailable() && (SupportsSourceExchange2() || GetSourceExchange1Version() > 1) && + // AND if we need more sources + thePrefs::GetMaxSourcePerFileSoft() > uSources && + // AND if... + ( + //source is not complete and file is very rare + ( !m_bCompleteSource + && (bNeverAskedBefore || nTimePassedClient > SOURCECLIENTREASKS) + && (uSources <= RARE_FILE/5) + ) || + //source is not complete and file is rare + ( !m_bCompleteSource + && (bNeverAskedBefore || nTimePassedClient > SOURCECLIENTREASKS) + && (uSources <= RARE_FILE || uSources - m_reqfile->GetValidSourcesCount() <= RARE_FILE / 2) + && (nTimePassedFile > SOURCECLIENTREASKF) + ) || + // OR if file is not rare + ( (bNeverAskedBefore || nTimePassedClient > (unsigned)(SOURCECLIENTREASKS * MINCOMMONPENALTY)) + && (nTimePassedFile > (unsigned)(SOURCECLIENTREASKF * MINCOMMONPENALTY)) + ) + ) + ); +} + + +void CUpDownClient::SendFileRequest() +{ + wxCHECK_RET(m_reqfile, wxT("Cannot request file when no reqfile is set")); + + CMemFile dataFileReq(16+16); + dataFileReq.WriteHash(m_reqfile->GetFileHash()); + + if (SupportMultiPacket()) { + wxString sent_opcodes; + + if (SupportExtMultiPacket()) { + dataFileReq.WriteUInt64(m_reqfile->GetFileSize()); + } + + AddDebugLogLineM(false, logClient, wxT("Sending file request to client")); + + dataFileReq.WriteUInt8(OP_REQUESTFILENAME); + sent_opcodes += wxT("|RFNM|"); + // Extended information + if (GetExtendedRequestsVersion() > 0) { + m_reqfile->WritePartStatus(&dataFileReq); + } + if (GetExtendedRequestsVersion() > 1) { + m_reqfile->WriteCompleteSourcesCount(&dataFileReq); + } + if (m_reqfile->GetPartCount() > 1) { + sent_opcodes += wxT("|RFID|"); + dataFileReq.WriteUInt8(OP_SETREQFILEID); + } + if (IsEmuleClient()) { + SetRemoteQueueFull( true ); + SetRemoteQueueRank(0); + } + if (IsSourceRequestAllowed()) { + if (SupportsSourceExchange2()){ + sent_opcodes += wxT("|RSRC2|"); + dataFileReq.WriteUInt8(OP_REQUESTSOURCES2); + dataFileReq.WriteUInt8(SOURCEEXCHANGE2_VERSION); + const uint16 nOptions = 0; // 16 ... Reserved + dataFileReq.WriteUInt16(nOptions); + } else{ + sent_opcodes += wxT("|RSRC|"); + dataFileReq.WriteUInt8(OP_REQUESTSOURCES); + } + m_reqfile->SetLastAnsweredTimeTimeout(); + SetLastAskedForSources(); + } + if (IsSupportingAICH()) { + sent_opcodes += wxT("|AFHR|"); + dataFileReq.WriteUInt8(OP_AICHFILEHASHREQ); + } + CPacket* packet = new CPacket(dataFileReq, OP_EMULEPROT, (SupportExtMultiPacket() ? OP_MULTIPACKET_EXT : OP_MULTIPACKET)); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxString::Format(wxT("Local Client: %s "), (SupportExtMultiPacket() ? wxT("OP_MULTIPACKET_EXT (") : wxT("OP_MULTIPACKET (") )) + sent_opcodes + wxT(") to ") + GetFullIP()); + SendPacket(packet, true); + } else { + //This is extended information + if (GetExtendedRequestsVersion() > 0 ) { + m_reqfile->WritePartStatus(&dataFileReq); + } + if (GetExtendedRequestsVersion() > 1 ) { + m_reqfile->WriteCompleteSourcesCount(&dataFileReq); + } + CPacket* packet = new CPacket(dataFileReq, OP_EDONKEYPROT, OP_REQUESTFILENAME); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_REQUESTFILENAME to ") + GetFullIP() ); + SendPacket(packet, true); + + // 26-Jul-2003: removed requesting the file status for files <= PARTSIZE for better compatibility with ed2k protocol (eDonkeyHybrid). + // if the remote client answers the OP_REQUESTFILENAME with OP_REQFILENAMEANSWER the file is shared by the remote client. if we + // know that the file is shared, we know also that the file is complete and don't need to request the file status. + + // Sending the packet could have deleted the client, check m_reqfile + if (m_reqfile && (m_reqfile->GetPartCount() > 1)) { + CMemFile dataSetReqFileID(16); + dataSetReqFileID.WriteHash(m_reqfile->GetFileHash()); + packet = new CPacket(dataSetReqFileID, OP_EDONKEYPROT, OP_SETREQFILEID); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_SETREQFILEID to ") + GetFullIP()); + SendPacket(packet, true); + } + + if (IsEmuleClient()) { + SetRemoteQueueFull( true ); + SetRemoteQueueRank(0); + } + + // Sending the packet could have deleted the client, check m_reqfile + if (m_reqfile && IsSourceRequestAllowed()) { + m_reqfile->SetLastAnsweredTimeTimeout(); + + CMemFile packetdata; + + if (SupportsSourceExchange2()) { + packetdata.WriteUInt8(SOURCEEXCHANGE2_VERSION); + packetdata.WriteUInt16(0 /* Reserved */); + } + + packetdata.WriteHash(m_reqfile->GetFileHash()); + + packet = new CPacket(packetdata, OP_EMULEPROT, SupportsSourceExchange2() ? OP_REQUESTSOURCES2 : OP_REQUESTSOURCES); + + theStats::AddUpOverheadSourceExchange(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_REQUESTSOURCES to ") + GetFullIP() ); + SendPacket(packet,true,true); + SetLastAskedForSources(); + } + + // Sending the packet could have deleted the client, check m_reqfile + if (m_reqfile && IsSupportingAICH()) { + packet = new CPacket(OP_AICHFILEHASHREQ,16,OP_EMULEPROT); + packet->Copy16ToDataBuffer((const char *)m_reqfile->GetFileHash().GetHash()); + theStats::AddUpOverheadOther(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_AICHFILEHASHREQ to ") + GetFullIP()); + SendPacket(packet,true,true); + } + } +} + + +void CUpDownClient::ProcessFileInfo(const CMemFile* data, const CPartFile* file) +{ + // 0.42e + if (file==NULL) { + throw wxString(wxT("ERROR: Wrong file ID (ProcessFileInfo; file==NULL)")); + } + if (m_reqfile==NULL) { + throw wxString(wxT("ERROR: Wrong file ID (ProcessFileInfo; m_reqfile==NULL)")); + } + if (file != m_reqfile) { + throw wxString(wxT("ERROR: Wrong file ID (ProcessFileInfo; m_reqfile!=file)")); + } + + m_clientFilename = data->ReadString(GetUnicodeSupport()); + + // 26-Jul-2003: removed requesting the file status for files <= PARTSIZE for better compatibility with ed2k protocol (eDonkeyHybrid). + // if the remote client answers the OP_REQUESTFILENAME with OP_REQFILENAMEANSWER the file is shared by the remote client. if we + // know that the file is shared, we know also that the file is complete and don't need to request the file status. + if (m_reqfile->GetPartCount() == 1) { + m_nPartCount = m_reqfile->GetPartCount(); + + m_reqfile->UpdatePartsFrequency( this, false ); // Decrement + m_downPartStatus.clear(); + m_downPartStatus.resize( m_nPartCount, 1 ); + m_reqfile->UpdatePartsFrequency( this, true ); // Increment + + m_bCompleteSource = true; + + UpdateDisplayedInfo(); + // even if the file is <= PARTSIZE, we _may_ need the hashset for that file (if the file size == PARTSIZE) + if (m_reqfile->IsHashSetNeeded()) { + if (m_socket) { + CPacket* packet = new CPacket(OP_HASHSETREQUEST,16, OP_EDONKEYPROT); + packet->Copy16ToDataBuffer((const char *)m_reqfile->GetFileHash().GetHash()); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_HASHSETREQUEST to ") + GetFullIP()); + SendPacket(packet,true,true); + SetDownloadState(DS_REQHASHSET); + m_fHashsetRequesting = 1; + m_reqfile->SetHashSetNeeded(false); + } else { + wxASSERT(0); + } + } else { + SendStartupLoadReq(); + } + m_reqfile->UpdatePartsInfo(); + } +} + +void CUpDownClient::ProcessFileStatus(bool bUdpPacket, const CMemFile* data, const CPartFile* file) +{ + // 0.42e + wxString strReqFileNull(wxT("ERROR: Wrong file ID (ProcessFileStatus; m_reqfile==NULL)")); + + if ( !m_reqfile || file != m_reqfile ){ + if (!m_reqfile) { + throw strReqFileNull; + } + throw wxString(wxT("ERROR: Wrong file ID (ProcessFileStatus; m_reqfile!=file)")); + } + + uint16 nED2KPartCount = data->ReadUInt16(); + + m_reqfile->UpdatePartsFrequency( this, false ); // Decrement + m_downPartStatus.clear(); + + bool bPartsNeeded = false; + int iNeeded = 0; + if (!nED2KPartCount) + { + m_nPartCount = m_reqfile->GetPartCount(); + m_downPartStatus.resize( m_nPartCount, 1); + bPartsNeeded = true; + m_bCompleteSource = true; + } + else + { + // Somehow this happened. + if (!m_reqfile) { + throw strReqFileNull; + } + if (m_reqfile->GetED2KPartCount() != nED2KPartCount) + { + wxString strError; + strError << wxT("ProcessFileStatus - wrong part number recv=") << nED2KPartCount << + wxT(" expected=") << m_reqfile->GetED2KPartCount() << wxT(" ") << + m_reqfile->GetFileHash().Encode(); + m_nPartCount = 0; + throw strError; + } + m_nPartCount = m_reqfile->GetPartCount(); + + m_bCompleteSource = false; + m_downPartStatus.resize( m_nPartCount, 0 ); + uint16 done = 0; + + try { + while (done != m_nPartCount) { + uint8 toread = data->ReadUInt8(); + + for ( uint8 i = 0;i < 8; i++ ) { + m_downPartStatus[done] = ((toread>>i)&1)? 1:0; + + if ( m_downPartStatus[done] ) { + if (!m_reqfile->IsComplete(done*PARTSIZE,((done+1)*PARTSIZE)-1)){ + bPartsNeeded = true; + iNeeded++; + } + } + done++; + if (done == m_nPartCount) { + break; + } + } + } + } catch( ... ) { + // We want the counts to be updated, even if we fail to read everything + m_reqfile->UpdatePartsFrequency( this, true ); // Increment + + throw; + } + } + + m_reqfile->UpdatePartsFrequency( this, true ); // Increment + + UpdateDisplayedInfo(); + + // NOTE: This function is invoked from TCP and UDP socket! + if (!bUdpPacket) { + if (!bPartsNeeded) { + SetDownloadState(DS_NONEEDEDPARTS); + } else if (m_reqfile->IsHashSetNeeded()) { + //If we are using the eMule filerequest packets, this is taken care of in the Multipacket! + if (m_socket) { + CPacket* packet = new CPacket(OP_HASHSETREQUEST,16, OP_EDONKEYPROT); + packet->Copy16ToDataBuffer((const char *)m_reqfile->GetFileHash().GetHash()); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_HASHSETREQUEST to ") + GetFullIP()); + SendPacket(packet, true, true); + SetDownloadState(DS_REQHASHSET); + m_fHashsetRequesting = 1; + m_reqfile->SetHashSetNeeded(false); + } else { + wxASSERT(0); + } + } + else { + SendStartupLoadReq(); + } + } + else { + if (!bPartsNeeded) { + SetDownloadState(DS_NONEEDEDPARTS); + } else { + SetDownloadState(DS_ONQUEUE); + } + } + m_reqfile->UpdatePartsInfo(); +} + +bool CUpDownClient::AddRequestForAnotherFile(CPartFile* file) +{ + if ( m_A4AF_list.find( file ) == m_A4AF_list.end() ) { + // When we access a non-existing entry entry, it will be zeroed by default, + // so we have to set NeededParts. All in one go. + m_A4AF_list[file].NeededParts = true; + file->AddA4AFSource( this ); + return true; + } else { + return false; + } +} + +bool CUpDownClient::DeleteFileRequest(CPartFile* file) +{ + return m_A4AF_list.erase( file ); +} + +void CUpDownClient::DeleteAllFileRequests() +{ + m_A4AF_list.clear(); +} + + +/* eMule 0.30c implementation, i give it a try (Creteil) BEGIN ... */ +void CUpDownClient::SetDownloadState(uint8 byNewState) +{ + if (m_nDownloadState != byNewState) { + if (m_reqfile) { + // Notify the client that this source has changed its state + m_reqfile->ClientStateChanged( m_nDownloadState, byNewState ); + + if (byNewState == DS_DOWNLOADING) { + m_reqfile->AddDownloadingSource(this); + } else if (m_nDownloadState == DS_DOWNLOADING) { + m_reqfile->RemoveDownloadingSource(this); + } + } + if (byNewState == DS_DOWNLOADING) { + theStats::AddDownloadingSource(); + } else if (m_nDownloadState == DS_DOWNLOADING) { + theStats::RemoveDownloadingSource(); + } + + if (m_nDownloadState == DS_DOWNLOADING) { + m_nDownloadState = byNewState; + ClearDownloadBlockRequests(); + + kBpsDown = 0.0; + bytesReceivedCycle = 0; + msReceivedPrev = 0; + if (byNewState == DS_NONE) { + if (m_reqfile) { + m_reqfile->UpdatePartsFrequency( this, false ); // Decrement + } + m_downPartStatus.clear(); + m_nPartCount = 0; + } + if (m_socket && byNewState != DS_ERROR) { + m_socket->DisableDownloadLimit(); + } + } + m_nDownloadState = byNewState; + if(GetDownloadState() == DS_DOWNLOADING) { + if (IsEmuleClient()) { + SetRemoteQueueFull(false); + } + SetRemoteQueueRank(0); // eMule 0.30c set like this ... + } + UpdateDisplayedInfo(true); + } +} +/* eMule 0.30c implementation, i give it a try (Creteil) END ... */ + +void CUpDownClient::ProcessHashSet(const byte* packet, uint32 size) +{ + if ((!m_reqfile) || md4cmp(packet,m_reqfile->GetFileHash().GetHash())) { + throw wxString(wxT("Wrong fileid sent (ProcessHashSet)")); + } + if (!m_fHashsetRequesting) { + throw wxString(wxT("Received unsolicited hashset, ignoring it.")); + } + CMemFile data(packet,size); + if (m_reqfile->LoadHashsetFromFile(&data,true)) { + m_fHashsetRequesting = 0; + } else { + m_reqfile->SetHashSetNeeded(true); + throw wxString(wxT("Corrupted or invalid hashset received")); + } + SendStartupLoadReq(); +} + +void CUpDownClient::SendBlockRequests() +{ + uint32 current_time = ::GetTickCount(); + if (GetVBTTags()) { + + // Ask new blocks only when all completed + if (m_PendingBlocks_list.size()) { + return; + } + + if ((m_dwLastBlockReceived + SEC2MS(5)) > current_time) { + // We received last block in less than 5 secs? Let's request faster. + m_MaxBlockRequests = m_MaxBlockRequests << 1; + if ( m_MaxBlockRequests > 0x20) { + m_MaxBlockRequests = 0x20; + } + } else { + m_MaxBlockRequests = m_MaxBlockRequests >> 1; + if ( m_MaxBlockRequests < STANDARD_BLOCKS_REQUEST) { + m_MaxBlockRequests = STANDARD_BLOCKS_REQUEST; + } + } + } + + m_dwLastBlockReceived = current_time; + + if (!m_reqfile) { + return; + } + + uint8 version = GetVBTTags() ? 2 : 1; + + if (m_DownloadBlocks_list.empty()) { + // Barry - instead of getting 3, just get how many is needed + uint16 count = m_MaxBlockRequests - m_PendingBlocks_list.size(); + std::vector toadd(count); + if (m_reqfile->GetNextRequestedBlock(this,&(toadd[0]),&count)) { + for (int i = 0; i != count; i++) { + m_DownloadBlocks_list.push_back(toadd[i]); + } + } + } + + // Barry - Why are unfinished blocks requested again, not just new ones? + + while (m_PendingBlocks_list.size() < m_MaxBlockRequests && !m_DownloadBlocks_list.empty()) { + Pending_Block_Struct* pblock = new Pending_Block_Struct; + pblock->block = m_DownloadBlocks_list.front(); + pblock->zStream = NULL; + pblock->totalUnzipped = 0; + pblock->fZStreamError = 0; + pblock->fRecovered = 0; + m_PendingBlocks_list.push_back(pblock); + m_DownloadBlocks_list.pop_front(); + } + + + if (m_PendingBlocks_list.empty()) { + + CUpDownClient* slower_client = NULL; + + if (thePrefs::GetDropSlowSources()) { + slower_client = m_reqfile->GetSlowerDownloadingClient(m_lastaverage, this); + } + + if (slower_client == NULL) { + slower_client = this; + } + + if (!slower_client->GetSentCancelTransfer()) { + CPacket* packet = new CPacket(OP_CANCELTRANSFER, 0, OP_EDONKEYPROT); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + if (slower_client != this) { +// printf("Dropped client %p to allow client %p to download\n",slower_client, this); + } + slower_client->ClearDownloadBlockRequests(); + slower_client->SendPacket(packet,true,true); + slower_client->SetSentCancelTransfer(1); + } + + slower_client->SetDownloadState(DS_NONEEDEDPARTS); + + if (slower_client != this) { + // Re-request freed blocks. + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_CANCELTRANSFER (faster source eager to transfer) to ") + slower_client->GetFullIP() ); + wxASSERT(m_DownloadBlocks_list.empty()); + wxASSERT(m_PendingBlocks_list.empty()); + uint16 count = m_MaxBlockRequests; + std::vector toadd(count); + if (m_reqfile->GetNextRequestedBlock(this, &(toadd[0]),&count)) { + for (int i = 0; i != count; i++) { + Pending_Block_Struct* pblock = new Pending_Block_Struct; + pblock->block = toadd[i]; + pblock->zStream = NULL; + pblock->totalUnzipped = 0; + pblock->fZStreamError = 0; + pblock->fRecovered = 0; + m_PendingBlocks_list.push_back(pblock); + } + } else { + // WTF, we just freed blocks. + wxASSERT(0); + return; + } + } else { + // Drop this one. + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_CANCELTRANSFER (no free blocks) to ") + GetFullIP() ); + //#warning Kry - Would be nice to swap A4AF here. + return; + } + } + + CPacket* packet = NULL; + + switch (version) { + case 2: { + // ED2Kv2 packet... + // Most common scenario: hash + blocks to request + every one + // having 2 uint32 tags + + uint8 nBlocks = m_PendingBlocks_list.size(); + if (nBlocks > m_MaxBlockRequests) { + nBlocks = m_MaxBlockRequests; + } + + CMemFile data(16 + 1 + nBlocks*((2+4)*2)); + + data.WriteHash(m_reqfile->GetFileHash()); + + data.WriteUInt8(nBlocks); + + std::list::iterator it = m_PendingBlocks_list.begin(); + while (nBlocks) { + wxASSERT(it != m_PendingBlocks_list.end()); + wxASSERT( (*it)->block->StartOffset <= (*it)->block->EndOffset ); + (*it)->fZStreamError = 0; + (*it)->fRecovered = 0; + CTagVarInt(/*Noname*/0,(*it)->block->StartOffset).WriteTagToFile(&data); + CTagVarInt(/*Noname*/0,(*it)->block->EndOffset).WriteTagToFile(&data); + ++it; + nBlocks--; + } + + packet = new CPacket(data, OP_ED2KV2HEADER, OP_REQUESTPARTS); + AddDebugLogLineM( false, logLocalClient, wxString::Format(wxT("Local Client ED2Kv2: OP_REQUESTPARTS(%i) to "),(m_PendingBlocks_list.size()::iterator it = m_PendingBlocks_list.begin(); + for (uint32 i = 0; i != m_MaxBlockRequests; i++){ + if (it != m_PendingBlocks_list.end()) { + Pending_Block_Struct* pending = *it++; + wxASSERT( pending->block->StartOffset <= pending->block->EndOffset ); + if (pending->block->StartOffset > 0xFFFFFFFF || pending->block->EndOffset > 0xFFFFFFFF){ + bHasLongBlocks = true; + if (!SupportsLargeFiles()){ + // Requesting a large block from a client that doesn't support large files? + wxASSERT( false ); + if (!GetSentCancelTransfer()){ + CPacket* cancel_packet = new CPacket(OP_CANCELTRANSFER, 0, OP_EDONKEYPROT); + theStats::AddUpOverheadFileRequest(cancel_packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_CANCELTRANSFER to ") + GetFullIP() ); + SendPacket(cancel_packet,true,true); + SetSentCancelTransfer(1); + } + SetDownloadState(DS_ERROR); + } + break; + } + } + } + + CMemFile data(16 /*Hash*/ + (m_MaxBlockRequests*(bHasLongBlocks ? 8 : 4) /* uint32/64 start*/) + (3*(bHasLongBlocks ? 8 : 4)/* uint32/64 end*/)); + data.WriteHash(m_reqfile->GetFileHash()); + + it = m_PendingBlocks_list.begin(); + for (uint32 i = 0; i != m_MaxBlockRequests; i++) { + if (it != m_PendingBlocks_list.end()) { + Pending_Block_Struct* pending = *it++; + wxASSERT( pending->block->StartOffset <= pending->block->EndOffset ); + pending->fZStreamError = 0; + pending->fRecovered = 0; + if (bHasLongBlocks) { + data.WriteUInt64(pending->block->StartOffset); + } else { + data.WriteUInt32(pending->block->StartOffset); + } + } else { + if (bHasLongBlocks) { + data.WriteUInt64(0); + } else { + data.WriteUInt32(0); + } + } + } + + it = m_PendingBlocks_list.begin(); + for (uint32 i = 0; i != m_MaxBlockRequests; i++) { + if (it != m_PendingBlocks_list.end()) { + Requested_Block_Struct* block = (*it++)->block; + if (bHasLongBlocks) { + data.WriteUInt64(block->EndOffset+1); + } else { + data.WriteUInt32(block->EndOffset+1); + } + } else { + if (bHasLongBlocks) { + data.WriteUInt64(0); + } else { + data.WriteUInt32(0); + } + } + } + packet = new CPacket(data, (bHasLongBlocks ? OP_EMULEPROT : OP_EDONKEYPROT), (bHasLongBlocks ? (uint8)OP_REQUESTPARTS_I64 : (uint8)OP_REQUESTPARTS)); + AddDebugLogLineM( false, logLocalClient, wxString::Format(wxT("Local Client: %s to "),(bHasLongBlocks ? wxT("OP_REQUESTPARTS_I64") : wxT("OP_REQUESTPARTS"))) + GetFullIP() ); + break; + } + default: + wxASSERT(0); + } + + if (packet) { + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + SendPacket(packet, true, true); + } else { + wxASSERT(0); + } +} + +/* +Barry - Originally this only wrote to disk when a full 180k block +had been received from a client, and only asked for data in +180k blocks. + +This meant that on average 90k was lost for every connection +to a client data source. That is a lot of wasted data. + +To reduce the lost data, packets are now written to a buffer +and flushed to disk regularly regardless of size downloaded. + +This includes compressed packets. + +Data is also requested only where gaps are, not in 180k blocks. +The requests will still not exceed 180k, but may be smaller to +fill a gap. +*/ + +void CUpDownClient::ProcessBlockPacket(const byte* packet, uint32 size, bool packed, bool largeblocks) +{ + // Ignore if no data required + if (!(GetDownloadState() == DS_DOWNLOADING || GetDownloadState() == DS_NONEEDEDPARTS)) { + return; + } + + // This vars are defined here to be able to use them on the catch + int header_size = 16; + uint64 nStartPos = 0; + uint64 nEndPos = 0; + uint32 nBlockSize = 0; + uint32 lenUnzipped = 0; + + // Update stats + m_dwLastBlockReceived = ::GetTickCount(); + + try { + + // Read data from packet + const CMemFile data(packet, size); + + // Check that this data is for the correct file + if ((!m_reqfile) || data.ReadHash() != m_reqfile->GetFileHash()) { + throw wxString(wxT("Wrong fileid sent (ProcessBlockPacket)")); + } + + // Find the start & end positions, and size of this chunk of data + + if (largeblocks) { + nStartPos = data.ReadUInt64(); + header_size += 8; + } else { + nStartPos = data.ReadUInt32(); + header_size += 4; + } + + if (packed) { + nBlockSize = data.ReadUInt32(); + header_size += 4; + nEndPos = nStartPos + (size - header_size); + } else { + if (largeblocks) { + nEndPos = data.ReadUInt64(); + header_size += 8; + } else { + nEndPos = data.ReadUInt32(); + header_size += 4; + } + } + + // Check that packet size matches the declared data size + header size + if ( nEndPos == nStartPos || size != ((nEndPos - nStartPos) + header_size)) { + throw wxString(wxT("Corrupted or invalid DataBlock received (ProcessBlockPacket)")); + } + theStats::AddDownloadFromSoft(GetClientSoft(),size - header_size); + bytesReceivedCycle += size - header_size; + + credits->AddDownloaded(size - header_size, GetIP(), theApp->CryptoAvailable()); + + // Move end back one, should be inclusive + nEndPos--; + + // Loop through to find the reserved block that this is within + std::list::iterator it = m_PendingBlocks_list.begin(); + for (; it != m_PendingBlocks_list.end(); ++it) { + Pending_Block_Struct* cur_block = *it; + + if ((cur_block->block->StartOffset <= nStartPos) && (cur_block->block->EndOffset >= nStartPos)) { + // Found reserved block + + if (cur_block->block->StartOffset == nStartPos) { + // This block just started transfering. Set the start time. + m_last_block_start = ::GetTickCountFullRes(); + } + + if (cur_block->fZStreamError){ + AddDebugLogLineM( false, logZLib, + CFormat(wxT("Ignoring %u bytes of block %u-%u because of erroneous zstream state for file: %s")) + % (size - header_size) % nStartPos % nEndPos % m_reqfile->GetFileName()); + m_reqfile->RemoveBlockFromList(cur_block->block->StartOffset, cur_block->block->EndOffset); + return; + } + + // Remember this start pos, used to draw part downloading in list + m_nLastBlockOffset = nStartPos; + + // Occasionally packets are duplicated, no point writing it twice + // This will be 0 in these cases, or the length written otherwise + uint32 lenWritten = 0; + + // Handle differently depending on whether packed or not + if (!packed) { + // Write to disk (will be buffered in part file class) + lenWritten = m_reqfile->WriteToBuffer( size - header_size, + (byte*)(packet + header_size), + nStartPos, + nEndPos, + cur_block->block ); + } else { + // Packed + wxASSERT( (long int)size > 0 ); + // Create space to store unzipped data, the size is + // only an initial guess, will be resized in unzip() + // if not big enough + lenUnzipped = (size * 2); + // Don't get too big + if (lenUnzipped > (BLOCKSIZE + 300)) { + lenUnzipped = (BLOCKSIZE + 300); + } + byte *unzipped = new byte[lenUnzipped]; + + // Try to unzip the packet + int result = unzip(cur_block, (byte*)(packet + header_size), (size - header_size), &unzipped, &lenUnzipped); + + // no block can be uncompressed to >2GB, 'lenUnzipped' is obviously erroneous. + if (result == Z_OK && ((int)lenUnzipped >= 0)) { + + // Write any unzipped data to disk + if (lenUnzipped > 0) { + wxASSERT( (int)lenUnzipped > 0 ); + + // Use the current start and end positions for the uncompressed data + nStartPos = cur_block->block->StartOffset + cur_block->totalUnzipped - lenUnzipped; + nEndPos = cur_block->block->StartOffset + cur_block->totalUnzipped - 1; + + if (nStartPos > cur_block->block->EndOffset || nEndPos > cur_block->block->EndOffset) { + AddDebugLogLineM( false, logZLib, + CFormat(wxT("Corrupted compressed packet for '%s' received (error 666)")) % m_reqfile->GetFileName()); + m_reqfile->RemoveBlockFromList(cur_block->block->StartOffset, cur_block->block->EndOffset); + } else { + // Write uncompressed data to file + lenWritten = m_reqfile->WriteToBuffer( size - header_size, + unzipped, + nStartPos, + nEndPos, + cur_block->block ); + } + } + } else { + wxString strZipError; + if (cur_block->zStream && cur_block->zStream->msg) { + strZipError = wxT(" - ") + wxString::FromAscii(cur_block->zStream->msg); + } + + AddDebugLogLineM( false, logZLib, + CFormat(wxT("Corrupted compressed packet for '%s' received (error %i): %s")) + % m_reqfile->GetFileName() % result % strZipError); + + m_reqfile->RemoveBlockFromList(cur_block->block->StartOffset, cur_block->block->EndOffset); + + // If we had an zstream error, there is no chance that we could recover from it nor that we + // could use the current zstream (which is in error state) any longer. + if (cur_block->zStream){ + inflateEnd(cur_block->zStream); + delete cur_block->zStream; + cur_block->zStream = NULL; + } + + // Although we can't further use the current zstream, there is no need to disconnect the sending + // client because the next zstream (a series of 10K-blocks which build a 180K-block) could be + // valid again. Just ignore all further blocks for the current zstream. + cur_block->fZStreamError = 1; + cur_block->totalUnzipped = 0; // bluecow's fix + } + delete [] unzipped; + } + // These checks only need to be done if any data was written + if (lenWritten > 0) { + m_nTransferredDown += lenWritten; + + // If finished reserved block + if (nEndPos == cur_block->block->EndOffset) { + + // Save last average speed based on data and time. + // This should do bytes/sec. + uint32 average_time = (::GetTickCountFullRes() - m_last_block_start); + + // Avoid divide by 0. + if (average_time == 0) { + average_time++; + } + + m_lastaverage = ((cur_block->block->EndOffset - cur_block->block->StartOffset) * 1000) / average_time; + + m_reqfile->RemoveBlockFromList(cur_block->block->StartOffset, cur_block->block->EndOffset); + delete cur_block->block; + // Not always allocated + if (cur_block->zStream) { + inflateEnd(cur_block->zStream); + delete cur_block->zStream; + } + delete cur_block; + m_PendingBlocks_list.erase(it); + + // Request next block + SendBlockRequests(); + } + } + // Stop looping and exit method + return; + } + } + } catch (const CEOFException& e) { + wxString error = wxString(wxT("Error reading ")); + if (packed) error += wxString::Format(wxT("packed (LU: %i) "),lenUnzipped); + if (packed) error += wxT("largeblocks "); + error += wxString::Format(wxT("data packet: RS: %i HS: %i SP: %i EP: %i BS: %i -> "),size,header_size,nStartPos,nEndPos,nBlockSize); + AddDebugLogLineM(true, logRemoteClient, error + e.what()); + return; + } +} + +int CUpDownClient::unzip(Pending_Block_Struct *block, byte *zipped, uint32 lenZipped, byte **unzipped, uint32 *lenUnzipped, int iRecursion) +{ + int err = Z_DATA_ERROR; + + // Save some typing + z_stream *zS = block->zStream; + + // Is this the first time this block has been unzipped + if (zS == NULL) { + // Create stream + block->zStream = new z_stream; + zS = block->zStream; + + // Initialise stream values + zS->zalloc = (alloc_func)0; + zS->zfree = (free_func)0; + zS->opaque = (voidpf)0; + + // Set output data streams, do this here to avoid overwriting on recursive calls + zS->next_out = (*unzipped); + zS->avail_out = (*lenUnzipped); + + // Initialise the z_stream + err = inflateInit(zS); + if (err != Z_OK) { + return err; + } + } + + // Use whatever input is provided + zS->next_in = zipped; + zS->avail_in = lenZipped; + + // Only set the output if not being called recursively + if (iRecursion == 0) { + zS->next_out = (*unzipped); + zS->avail_out = (*lenUnzipped); + } + + // Try to unzip the data + err = inflate(zS, Z_SYNC_FLUSH); + + // Is zip finished reading all currently available input and writing + // all generated output + if (err == Z_STREAM_END) { + // Finish up + err = inflateEnd(zS); + if (err != Z_OK) { + return err; + } + + // Got a good result, set the size to the amount unzipped in this call + // (including all recursive calls) + (*lenUnzipped) = (zS->total_out - block->totalUnzipped); + block->totalUnzipped = zS->total_out; + } else if ((err == Z_OK) && (zS->avail_out == 0) && (zS->avail_in != 0)) { + + // Output array was not big enough, + // call recursively until there is enough space + + // What size should we try next + uint32 newLength = (*lenUnzipped) *= 2; + if (newLength == 0) { + newLength = lenZipped * 2; + } + // Copy any data that was successfully unzipped to new array + byte *temp = new byte[newLength]; + wxASSERT( zS->total_out - block->totalUnzipped <= newLength ); + memcpy(temp, (*unzipped), (zS->total_out - block->totalUnzipped)); + delete [] (*unzipped); + (*unzipped) = temp; + (*lenUnzipped) = newLength; + + // Position stream output to correct place in new array + zS->next_out = (*unzipped) + (zS->total_out - block->totalUnzipped); + zS->avail_out = (*lenUnzipped) - (zS->total_out - block->totalUnzipped); + + // Try again + err = unzip(block, zS->next_in, zS->avail_in, unzipped, lenUnzipped, iRecursion + 1); + } else if ((err == Z_OK) && (zS->avail_in == 0)) { + // All available input has been processed, everything ok. + // Set the size to the amount unzipped in this call + // (including all recursive calls) + (*lenUnzipped) = (zS->total_out - block->totalUnzipped); + block->totalUnzipped = zS->total_out; + } else { + // Should not get here unless input data is corrupt + wxString strZipError; + + if ( zS->msg ) { + strZipError = wxString::Format(wxT(" %d '"), err) + wxString::FromAscii(zS->msg) + wxT("'"); + } else if (err != Z_OK) { + strZipError = wxString::Format(wxT(" %d"), err); + } + + AddDebugLogLineM(false, logZLib, + CFormat(wxT("Unexpected zip error %s in file '%s'")) + % strZipError % (m_reqfile ? m_reqfile->GetFileName() : CPath(wxT("?")))); + } + + if (err != Z_OK) { + (*lenUnzipped) = 0; + } + + return err; +} + + +// Emilio: rewrite of eMule code to eliminate use of lists for averaging and fix +// errors in calculation (32-bit rollover and time measurement) This function +// uses a first-order filter with variable time constant (initially very short +// to quickly reach the right value without spiking, then gradually approaching +// the value of 50 seconds which is equivalent to the original averaging period +// used in eMule). The download rate is measured using actual timestamps. The +// filter-based averaging however uses a simplified algorithm that assumes a +// fixed loop time - this does not introduce any measurement error, it simply +// makes the degree of smoothing slightly imprecise (the true TC of the filter +// varies inversely with the true loop time), which is of no importance here. + +float CUpDownClient::CalculateKBpsDown() +{ + // -- all timing values are in seconds -- + const float tcLoop = 0.1f; // _assumed_ Process() loop time = 0.1 sec + const float tcInit = 0.4f; // initial filter time constant + const float tcFinal = 50.0f; // final filter time constant + const float tcReduce = 5.0f; // transition from tcInit to tcFinal + + const float fInit = tcLoop/tcInit; // initial averaging factor + const float fFinal = tcLoop/tcFinal; // final averaging factor + const float fReduce = std::exp(std::log(fFinal/fInit) / (tcReduce/tcLoop)) * 0.99999; + + uint32 msCur = ::GetTickCount(); + + if (msReceivedPrev == 0) { // initialize the averaging filter + fDownAvgFilter = fInit; + // "kBpsDown = bytesReceivedCycle/1024.0 / tcLoop" would be technically correct, + // but the first loop often receives a large chunk of data and then produces a spike + kBpsDown = /* 0.0 * (1.0-fInit) + */ bytesReceivedCycle/1024.0 / tcLoop * fInit; + bytesReceivedCycle = 0; + } else if (msCur != msReceivedPrev) { // (safeguard against divide-by-zero) + if (fDownAvgFilter > fFinal) { // reduce time constant during ramp-up phase + fDownAvgFilter *= fReduce; // this approximates averaging a lengthening list + } + kBpsDown = kBpsDown * (1.0 - fDownAvgFilter) + + (bytesReceivedCycle/1.024)/((float)(msCur-msReceivedPrev)) * fDownAvgFilter; + bytesReceivedCycle = 0; + } + msReceivedPrev = msCur; + + m_cShowDR++; + if (m_cShowDR == 30){ + m_cShowDR = 0; + UpdateDisplayedInfo(); + } + if ((::GetTickCount() - m_dwLastBlockReceived) > DOWNLOADTIMEOUT){ + if (!GetSentCancelTransfer()){ + CPacket* packet = new CPacket(OP_CANCELTRANSFER, 0, OP_EDONKEYPROT); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_CANCELTRANSFER to ") + GetFullIP() ); + SendPacket(packet,true,true); + SetSentCancelTransfer(1); + } + SetDownloadState(DS_ONQUEUE); + } + + return kBpsDown; +} + +uint16 CUpDownClient::GetAvailablePartCount() const +{ + uint16 result = 0; + for (int i = 0;i != m_nPartCount;i++){ + if (IsPartAvailable(i)) + result++; + } + return result; +} + +void CUpDownClient::SetRemoteQueueRank(uint16 nr) +{ + m_nOldRemoteQueueRank = m_nRemoteQueueRank; + m_nRemoteQueueRank = nr; + UpdateDisplayedInfo(); +} + +void CUpDownClient::UDPReaskACK(uint16 nNewQR) +{ + // 0.42e + m_bUDPPending = false; + SetRemoteQueueRank(nNewQR); + m_dwLastAskedTime = ::GetTickCount(); +} + +void CUpDownClient::UDPReaskFNF() +{ + m_bUDPPending = false; + + // avoid premature deletion of 'this' client + if (GetDownloadState() != DS_DOWNLOADING){ + if (m_reqfile) { + m_reqfile->AddDeadSource(this); + } + + theApp->downloadqueue->RemoveSource(this); + if (!m_socket) { + if (Disconnected(wxT("UDPReaskFNF m_socket=NULL"))) { + Safe_Delete(); + } + } + } else { + AddDebugLogLineM( false, logRemoteClient, wxT("UDP ANSWER FNF : ") + GetUserName() + wxT(" - did not remove client because of current download state") ); + } +} + +void CUpDownClient::UDPReaskForDownload() +{ + + wxASSERT(m_reqfile); + + if(!m_reqfile || m_bUDPPending ) { + return; + } + + //#warning We should implement the quality tests for udp reliability + /* + if( m_nTotalUDPPackets > 3 && ((float)(m_nFailedUDPPackets/m_nTotalUDPPackets) > .3)) { + return; + } + */ + + if (thePrefs::GetEffectiveUDPPort() == 0) { + return; + } + + if (m_nUDPPort != 0 && !theApp->IsFirewalled() && !IsConnected()) { + //don't use udp to ask for sources + if(IsSourceRequestAllowed()) { + return; + } + + m_bUDPPending = true; + + CMemFile data(128); + data.WriteHash(m_reqfile->GetFileHash()); + + if (GetUDPVersion() > 3) { + if (m_reqfile->IsPartFile()) { + ((CPartFile*)m_reqfile)->WritePartStatus(&data); + } + else { + data.WriteUInt16(0); + } + } + + if (GetUDPVersion() > 2) { + data.WriteUInt16(m_reqfile->m_nCompleteSourcesCount); + } + + CPacket* response = new CPacket(data, OP_EMULEPROT, OP_REASKFILEPING); + AddDebugLogLineM( false, logClientUDP, wxT("Client UDP socket: send OP_REASKFILEPING") ); + theStats::AddUpOverheadFileRequest(response->GetPacketSize()); + theApp->clientudp->SendPacket(response,GetConnectIP(),GetUDPPort(), ShouldReceiveCryptUDPPackets(), GetUserHash().GetHash(), false, 0); + } else if (HasLowID() && GetBuddyIP() && GetBuddyPort() && HasValidBuddyID()) { + + m_bUDPPending = true; + + CMemFile data(128); + + data.WriteHash(CMD4Hash(GetBuddyID())); + data.WriteHash(m_reqfile->GetFileHash()); + + if (GetUDPVersion() > 3) { + if (m_reqfile->IsPartFile()) { + ((CPartFile*)m_reqfile)->WritePartStatus(&data); + } else { + data.WriteUInt16(0); + } + } + + if (GetUDPVersion() > 2) { + data.WriteUInt16(m_reqfile->m_nCompleteSourcesCount); + } + + CPacket* response = new CPacket(data, OP_EMULEPROT, OP_REASKCALLBACKUDP); + AddDebugLogLineM( false, logClientUDP, wxT("Client UDP socket: send OP_REASKCALLBACKUDP") ); + theStats::AddUpOverheadFileRequest(response->GetPacketSize()); + theApp->clientudp->SendPacket(response, GetBuddyIP(), GetBuddyPort(), false, NULL, true, 0 ); + } +} + + +//! Barry - Sets string to show parts downloading, eg NNNYNNNNYYNYN +wxString CUpDownClient::ShowDownloadingParts() const +{ + // Initialise to all N's + wxString Parts(wxT('N'), m_nPartCount); + + std::list::const_iterator it = m_PendingBlocks_list.begin(); + for (; it != m_PendingBlocks_list.end(); ++it) { + Parts.SetChar(((*it)->block->StartOffset / PARTSIZE), 'Y'); + } + + return Parts; +} + + +void CUpDownClient::UpdateDisplayedInfo(bool force) +{ + uint32 curTick = ::GetTickCount(); + if(force || curTick-m_lastRefreshedDLDisplay > MINWAIT_BEFORE_DLDISPLAY_WINDOWUPDATE) { + // Check if we actually need to notify of changes + bool update = m_reqfile && m_reqfile->ShowSources(); + + // Check A4AF files only if needed + if ( !update ) { + A4AFList::iterator it = m_A4AF_list.begin(); + for ( ; it != m_A4AF_list.end(); ++it ) { + if ( it->first->ShowSources() ) { + update = true; + break; + } + } + } + + // And finnaly trigger an event if there's any reason + if ( update ) { + Notify_DownloadCtrlUpdateItem(this); + } + + m_lastRefreshedDLDisplay = curTick; + } +} + + +// IgnoreNoNeeded = will switch to files of which this source has no needed parts (if no better fiels found) +// ignoreSuspensions = ignore timelimit for A4Af jumping +// bRemoveCompletely = do not readd the file which the source is swapped from to the A4AF lists (needed if deleting or stopping a file) +// toFile = Try to swap to this partfile only + +bool CUpDownClient::SwapToAnotherFile(bool bIgnoreNoNeeded, bool ignoreSuspensions, bool bRemoveCompletely, CPartFile* toFile) +{ + // Fail if m_reqfile is invalid + if ( m_reqfile == NULL ) { + return false; + } + + // It would be stupid to swap away a downloading source + if (GetDownloadState() == DS_DOWNLOADING) { + return false; + } + + // The iterator of the final target + A4AFList::iterator target = m_A4AF_list.end(); + + // Do we want to swap to a specific file? + if ( toFile != NULL ) { + A4AFList::iterator it = m_A4AF_list.find( toFile ); + if ( it != m_A4AF_list.end() ) { + + // We force ignoring of noneeded flag and timestamps + if ( IsValidSwapTarget( it, true, true ) ) { + // Set the target + target = it; + } + } + } else { + // We want highest priority possible, but need to start with + // a value less than any other priority + char priority = -1; + + A4AFList::iterator it = m_A4AF_list.begin(); + for ( ; it != m_A4AF_list.end(); ++it ) { + if ( IsValidSwapTarget( it, bIgnoreNoNeeded, ignoreSuspensions ) ) { + char cur_priority = it->first->GetDownPriority(); + + // We would prefer to get files with needed parts, thus rate them higher. + // However, this really only matters if bIgnoreNoNeeded is true. + if ( it->second.NeededParts ) + cur_priority += 10; + + // Change target if the current file has a higher rate than the previous + if ( cur_priority > priority ) { + priority = cur_priority; + + // Set the new target + target = it; + + // Break on the first High-priority file with needed parts + if ( priority == PR_HIGH + 10 ) { + break; + } + } + } + } + } + + // Try to swap if we found a valid target + if ( target != m_A4AF_list.end() ) { + + // Sainity check, if reqfile doesn't own the source, then something + // is wrong and the swap cannot proceed. + if ( m_reqfile->DelSource( this ) ) { + CPartFile* SwapTo = target->first; + + // remove this client from the A4AF list of our new m_reqfile + if ( SwapTo->RemoveA4AFSource( this ) ) { + Notify_DownloadCtrlRemoveSource(this, SwapTo); + } + + m_reqfile->RemoveDownloadingSource( this ); + + // Do we want to remove it completly? Say if the old file is getting deleted + if ( !bRemoveCompletely ) { + m_reqfile->AddA4AFSource( this ); + + // Set the status of the old file + m_A4AF_list[m_reqfile].NeededParts = (GetDownloadState() != DS_NONEEDEDPARTS); + + // Avoid swapping to this file for a while + m_A4AF_list[m_reqfile].timestamp = ::GetTickCount(); + + Notify_DownloadCtrlAddSource(m_reqfile, this, A4AF_SOURCE); + } else { + Notify_DownloadCtrlRemoveSource( this, m_reqfile ); + } + + SetDownloadState(DS_NONE); + ResetFileStatusInfo(); + + m_nRemoteQueueRank = 0; + m_nOldRemoteQueueRank = 0; + + m_reqfile->UpdatePartsInfo(); + + SetRequestFile( SwapTo ); + + SwapTo->AddSource( this ); + + Notify_DownloadCtrlAddSource(SwapTo, this, UNAVAILABLE_SOURCE); + + // Remove the new reqfile from the list of other files + m_A4AF_list.erase( target ); + + return true; + } + } + + return false; +} + + +bool CUpDownClient::IsValidSwapTarget( A4AFList::iterator it, bool ignorenoneeded, bool ignoresuspended ) +{ + wxASSERT( it != m_A4AF_list.end() && it->first ); + + // Check if this file has been suspended + if ( !ignoresuspended ) { + if ( ::GetTickCount() - it->second.timestamp >= PURGESOURCESWAPSTOP ) { + // The wait-time has been exceeded and the file is now a valid target + it->second.timestamp = 0; + } else { + // The file was still suspended and we are not ignoring suspensions + return false; + } + } + + // Check if the client has needed parts + if ( !ignorenoneeded ) { + if ( !it->second.NeededParts ) { + return false; + } + } + + // Final checks to see if the client is a valid target + CPartFile* cur_file = it->first; + if ( ( cur_file != m_reqfile && !cur_file->IsStopped() ) && + ( cur_file->GetStatus() == PS_READY || cur_file->GetStatus() == PS_EMPTY ) && + ( cur_file->IsPartFile() ) ) + { + return true; + } else { + return false; + } +} + + +void CUpDownClient::SetRequestFile(CPartFile* reqfile) +{ + if ( m_reqfile != reqfile ) { + // Decrement the source-count of the old request-file + if ( m_reqfile ) { + m_reqfile->ClientStateChanged( GetDownloadState(), -1 ); + m_reqfile->UpdatePartsFrequency( this, false ); + } + + m_nPartCount = 0; + m_downPartStatus.clear(); + + m_reqfile = reqfile; + + if ( reqfile ) { + // Increment the source-count of the new request-file + m_reqfile->ClientStateChanged( -1, GetDownloadState() ); + + m_nPartCount = reqfile->GetPartCount(); + } + } +} + +void CUpDownClient::SetReqFileAICHHash(CAICHHash* val){ + if(m_pReqFileAICHHash != NULL && m_pReqFileAICHHash != val) + delete m_pReqFileAICHHash; + m_pReqFileAICHHash = val; +} + +void CUpDownClient::SendAICHRequest(CPartFile* pForFile, uint16 nPart){ + CAICHRequestedData request; + request.m_nPart = nPart; + request.m_pClient = this; + request.m_pPartFile = pForFile; + CAICHHashSet::m_liRequestedData.push_back(request); + m_fAICHRequested = TRUE; + CMemFile data; + data.WriteHash(pForFile->GetFileHash()); + data.WriteUInt16(nPart); + pForFile->GetAICHHashset()->GetMasterHash().Write(&data); + CPacket* packet = new CPacket(data, OP_EMULEPROT, OP_AICHREQUEST); + theStats::AddUpOverheadOther(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_AICHREQUEST to") + GetFullIP()); + SafeSendPacket(packet); +} + +void CUpDownClient::ProcessAICHAnswer(const byte* packet, uint32 size) +{ + if (m_fAICHRequested == FALSE){ + throw wxString(wxT("Received unrequested AICH Packet")); + } + m_fAICHRequested = FALSE; + + CMemFile data(packet, size); + if (size <= 16){ + CAICHHashSet::ClientAICHRequestFailed(this); + return; + } + + CMD4Hash hash = data.ReadHash(); + CPartFile* pPartFile = theApp->downloadqueue->GetFileByID(hash); + CAICHRequestedData request = CAICHHashSet::GetAICHReqDetails(this); + uint16 nPart = data.ReadUInt16(); + if (pPartFile != NULL && request.m_pPartFile == pPartFile && request.m_pClient == this && nPart == request.m_nPart){ + CAICHHash ahMasterHash(&data); + if ( (pPartFile->GetAICHHashset()->GetStatus() == AICH_TRUSTED || pPartFile->GetAICHHashset()->GetStatus() == AICH_VERIFIED) + && ahMasterHash == pPartFile->GetAICHHashset()->GetMasterHash()) + { + if(pPartFile->GetAICHHashset()->ReadRecoveryData(request.m_nPart*PARTSIZE, &data)){ + // finally all checks passed, everythings seem to be fine + AddDebugLogLineM( false, logAICHTransfer, wxT("AICH Packet Answer: Succeeded to read and validate received recoverydata")); + CAICHHashSet::RemoveClientAICHRequest(this); + pPartFile->AICHRecoveryDataAvailable(request.m_nPart); + return; + } else { + AddDebugLogLineM( false, logAICHTransfer, wxT("AICH Packet Answer: Succeeded to read and validate received recoverydata")); + } + } else { + AddDebugLogLineM( false, logAICHTransfer, wxT("AICH Packet Answer: Masterhash differs from packethash or hashset has no trusted Masterhash") ); + } + } else { + AddDebugLogLineM( false, logAICHTransfer, wxT("AICH Packet Answer: requested values differ from values in packet") ); + } + + CAICHHashSet::ClientAICHRequestFailed(this); +} + + +void CUpDownClient::ProcessAICHRequest(const byte* packet, uint32 size) +{ + if (size != 16 + 2 + CAICHHash::GetHashSize()) { + throw wxString(wxT("Received AICH Request Packet with wrong size")); + } + + CMemFile data(packet, size); + + CMD4Hash hash = data.ReadHash(); + uint16 nPart = data.ReadUInt16(); + CAICHHash ahMasterHash(&data); + CKnownFile* pKnownFile = theApp->sharedfiles->GetFileByID(hash); + if (pKnownFile != NULL){ + if (pKnownFile->GetAICHHashset()->GetStatus() == AICH_HASHSETCOMPLETE && pKnownFile->GetAICHHashset()->HasValidMasterHash() + && pKnownFile->GetAICHHashset()->GetMasterHash() == ahMasterHash && pKnownFile->GetPartCount() > nPart + && pKnownFile->GetFileSize() > EMBLOCKSIZE && pKnownFile->GetFileSize() - PARTSIZE*nPart > EMBLOCKSIZE) + { + CMemFile fileResponse; + fileResponse.WriteHash(pKnownFile->GetFileHash()); + fileResponse.WriteUInt16(nPart); + pKnownFile->GetAICHHashset()->GetMasterHash().Write(&fileResponse); + if (pKnownFile->GetAICHHashset()->CreatePartRecoveryData(nPart*PARTSIZE, &fileResponse)){ + AddDebugLogLineM(false, logAICHTransfer, + CFormat(wxT("AICH Packet Request: Sucessfully created and send recoverydata for '%s' to %s")) + % pKnownFile->GetFileName() % GetClientFullInfo()); + + CPacket* packAnswer = new CPacket(fileResponse, OP_EMULEPROT, OP_AICHANSWER); + theStats::AddUpOverheadOther(packAnswer->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_AICHANSWER to") + GetFullIP()); + SafeSendPacket(packAnswer); + return; + } else { + AddDebugLogLineM(false, logAICHTransfer, + CFormat(wxT("AICH Packet Request: Failed to create recoverydata for '%s' to %s")) + % pKnownFile->GetFileName() % GetClientFullInfo()); + } + } else { + AddDebugLogLineM(false, logAICHTransfer, + CFormat(wxT("AICH Packet Request: Failed to create recoverydata - Hashset not ready or requested Hash differs from Masterhash for '%s' to %s")) + % pKnownFile->GetFileName() % GetClientFullInfo()); + } + } else { + AddDebugLogLineM( false, logAICHTransfer, wxT("AICH Packet Request: Failed to find requested shared file - ") + GetClientFullInfo() ); + } + + CPacket* packAnswer = new CPacket(OP_AICHANSWER, 16, OP_EMULEPROT); + packAnswer->Copy16ToDataBuffer(hash.GetHash()); + theStats::AddUpOverheadOther(packAnswer->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_AICHANSWER to") + GetFullIP()); + SafeSendPacket(packAnswer); +} + +void CUpDownClient::ProcessAICHFileHash(CMemFile* data, const CPartFile* file){ + CPartFile* pPartFile; + if (file == NULL){ + pPartFile = theApp->downloadqueue->GetFileByID(data->ReadHash()); + } else { + pPartFile = (CPartFile*)file; + } + CAICHHash ahMasterHash(data); + + if(pPartFile != NULL && pPartFile == GetRequestFile()){ + SetReqFileAICHHash(new CAICHHash(ahMasterHash)); + pPartFile->GetAICHHashset()->UntrustedHashReceived(ahMasterHash, GetConnectIP()); + } else { + AddDebugLogLineM( false, logAICHTransfer, wxT("ProcessAICHFileHash(): PartFile not found or Partfile differs from requested file, ") + GetClientFullInfo() ); + } +} +// File_checked_for_headers diff --git a/src/DownloadListCtrl.cpp b/src/DownloadListCtrl.cpp new file mode 100644 index 00000000..70cfeff4 --- /dev/null +++ b/src/DownloadListCtrl.cpp @@ -0,0 +1,2264 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include +#include + +#include // Needed for CFormat +#include "amule.h" // Needed for theApp +#include "amuleDlg.h" // Needed for CamuleDlg +#include "BarShader.h" // Needed for CBarShader +#include "ClientDetailDialog.h" // Needed for CClientDetailDialog +#include "ChatWnd.h" // Needed for CChatWnd +#include "CommentDialogLst.h" // Needed for CCommentDialogLst +#include "DownloadListCtrl.h" // Interface declarations +#include "DataToText.h" // Needed for PriorityToStr +#include "FileDetailDialog.h" // Needed for CFileDetailDialog +#include "GuiEvents.h" // Needed for CoreNotify_* +#ifdef ENABLE_IP2COUNTRY + #include "IP2Country.h" // Needed for IP2Country +#endif +#include "Logger.h" +#include "muuli_wdr.h" // Needed for ID_DLOADLIST +#include "PartFile.h" // Needed for CPartFile +#include "Preferences.h" +#include "SharedFileList.h" // Needed for CSharedFileList +#include "TerminationProcess.h" // Needed for CTerminationProcess +#include "updownclient.h" // Needed for CUpDownClient + + +class CPartFile; + + +struct CtrlItem_Struct +{ + CtrlItem_Struct() + : dwUpdated(0), + status(NULL), + m_owner(NULL), + m_fileValue(NULL), + m_sourceValue(NULL), + m_type(FILE_TYPE) + { } + + ~CtrlItem_Struct() { + delete status; + } + + DownloadItemType GetType() const { + return m_type; + } + + CPartFile* GetOwner() const { + return m_owner; + } + + CPartFile* GetFile() const { + return m_fileValue; + } + + CUpDownClient* GetSource() const { + return m_sourceValue; + } + + void SetContents(CPartFile* file) { + m_owner = NULL; + m_fileValue = file; + m_sourceValue = NULL; + m_owner = NULL; + m_type = FILE_TYPE; + } + + void SetContents(CPartFile* owner, CUpDownClient* source, DownloadItemType type) { + wxCHECK_RET(type != FILE_TYPE, wxT("Invalid type, not a source")); + + m_owner = owner; + m_fileValue = NULL; + m_sourceValue = source; + m_type = type; + } + + + uint32 dwUpdated; + wxBitmap* status; + +private: + CPartFile* m_owner; + CPartFile* m_fileValue; + CUpDownClient* m_sourceValue; + DownloadItemType m_type; +}; + + + +#define m_ImageList theApp->amuledlg->m_imagelist + + +BEGIN_EVENT_TABLE(CDownloadListCtrl, CMuleListCtrl) + EVT_LIST_ITEM_ACTIVATED(ID_DLOADLIST, CDownloadListCtrl::OnItemActivated) + EVT_LIST_ITEM_RIGHT_CLICK(ID_DLOADLIST, CDownloadListCtrl::OnMouseRightClick) + EVT_LIST_ITEM_MIDDLE_CLICK(ID_DLOADLIST, CDownloadListCtrl::OnMouseMiddleClick) + + EVT_CHAR( CDownloadListCtrl::OnKeyPressed ) + + EVT_MENU( MP_CANCEL, CDownloadListCtrl::OnCancelFile ) + + EVT_MENU( MP_PAUSE, CDownloadListCtrl::OnSetStatus ) + EVT_MENU( MP_STOP, CDownloadListCtrl::OnSetStatus ) + EVT_MENU( MP_RESUME, CDownloadListCtrl::OnSetStatus ) + + EVT_MENU( MP_PRIOLOW, CDownloadListCtrl::OnSetPriority ) + EVT_MENU( MP_PRIONORMAL, CDownloadListCtrl::OnSetPriority ) + EVT_MENU( MP_PRIOHIGH, CDownloadListCtrl::OnSetPriority ) + EVT_MENU( MP_PRIOAUTO, CDownloadListCtrl::OnSetPriority ) + + EVT_MENU( MP_SWAP_A4AF_TO_THIS, CDownloadListCtrl::OnSwapSources ) + EVT_MENU( MP_SWAP_A4AF_TO_THIS_AUTO, CDownloadListCtrl::OnSwapSources ) + EVT_MENU( MP_SWAP_A4AF_TO_ANY_OTHER, CDownloadListCtrl::OnSwapSources ) + + EVT_MENU_RANGE( MP_ASSIGNCAT, MP_ASSIGNCAT + 99, CDownloadListCtrl::OnSetCategory ) + + EVT_MENU( MP_CLEARCOMPLETED, CDownloadListCtrl::OnClearCompleted ) + + EVT_MENU( MP_GETMAGNETLINK, CDownloadListCtrl::OnGetLink ) + EVT_MENU( MP_GETED2KLINK, CDownloadListCtrl::OnGetLink ) + + EVT_MENU( MP_METINFO, CDownloadListCtrl::OnViewFileInfo ) + EVT_MENU( MP_VIEW, CDownloadListCtrl::OnPreviewFile ) + EVT_MENU( MP_VIEWFILECOMMENTS, CDownloadListCtrl::OnViewFileComments ) + + EVT_MENU( MP_WS, CDownloadListCtrl::OnGetFeedback ) + EVT_MENU( MP_RAZORSTATS, CDownloadListCtrl::OnGetRazorStats ) + + EVT_MENU( MP_CHANGE2FILE, CDownloadListCtrl::OnSwapSource ) + EVT_MENU( MP_SHOWLIST, CDownloadListCtrl::OnViewFiles ) + EVT_MENU( MP_ADDFRIEND, CDownloadListCtrl::OnAddFriend ) + EVT_MENU( MP_SENDMESSAGE, CDownloadListCtrl::OnSendMessage ) + EVT_MENU( MP_DETAIL, CDownloadListCtrl::OnViewClientInfo ) +END_EVENT_TABLE() + + + +//! This listtype is used when gathering the selected items. +typedef std::list ItemList; + + + +CDownloadListCtrl::CDownloadListCtrl( + wxWindow *parent, wxWindowID winid, const wxPoint& pos, const wxSize& size, + long style, const wxValidator& validator, const wxString& name ) +: +CMuleListCtrl( parent, winid, pos, size, style | wxLC_OWNERDRAW, validator, name ) +{ + // Setting the sorter function. + SetSortFunc( SortProc ); + + // Set the table-name (for loading and saving preferences). + SetTableName( wxT("Download") ); + + m_menu = NULL; + + wxColour colour = BLEND( SYSCOLOR( wxSYS_COLOUR_HIGHLIGHT ), 125 ); + m_hilightBrush = new wxBrush( colour, wxSOLID ); + + colour = BLEND( SYSCOLOR( wxSYS_COLOUR_BTNSHADOW), 125 ); + m_hilightUnfocusBrush = new wxBrush( colour, wxSOLID ); + + InsertColumn( 0, _("File Name"), wxLIST_FORMAT_LEFT, 260 ); + InsertColumn( 1, _("Size"), wxLIST_FORMAT_LEFT, 60 ); + InsertColumn( 2, _("Transferred"), wxLIST_FORMAT_LEFT, 65 ); + InsertColumn( 3, _("Completed"), wxLIST_FORMAT_LEFT, 65 ); + InsertColumn( 4, _("Speed"), wxLIST_FORMAT_LEFT, 65 ); + InsertColumn( 5, _("Progress"), wxLIST_FORMAT_LEFT, 170 ); + InsertColumn( 6, _("Sources"), wxLIST_FORMAT_LEFT, 50 ); + InsertColumn( 7, _("Priority"), wxLIST_FORMAT_LEFT, 55 ); + InsertColumn( 8, _("Status"), wxLIST_FORMAT_LEFT, 70 ); + InsertColumn( 9, _("Time Remaining"), wxLIST_FORMAT_LEFT, 110 ); + InsertColumn( 10, _("Last Seen Complete"), wxLIST_FORMAT_LEFT, 220 ); + InsertColumn( 11, _("Last Reception"), wxLIST_FORMAT_LEFT, 220 ); + + m_category = 0; + m_completedFiles = 0; + m_filecount = 0; + LoadSettings(); +} + + +CDownloadListCtrl::~CDownloadListCtrl() +{ + while ( !m_ListItems.empty() ) { + delete m_ListItems.begin()->second; + m_ListItems.erase( m_ListItems.begin() ); + } + delete m_hilightBrush; + delete m_hilightUnfocusBrush; +} + + +void CDownloadListCtrl::AddFile( CPartFile* file ) +{ + wxASSERT( file ); + + // Avoid duplicate entries of files + if ( m_ListItems.find( file ) == m_ListItems.end() ) { + CtrlItem_Struct* newitem = new CtrlItem_Struct; + newitem->SetContents(file); + + m_ListItems.insert( ListItemsPair( file, newitem ) ); + + // Check if the new file is visible in the current category + if ( file->CheckShowItemInGivenCat( m_category ) ) { + ShowFile( file, true ); + } + } +} + + +void CDownloadListCtrl::AddSource(CPartFile* owner, CUpDownClient* source, DownloadItemType type) +{ + wxCHECK_RET(owner, wxT("NULL owner in CDownloadListCtrl::AddSource")); + wxCHECK_RET(source, wxT("NULL source in CDownloadListCtrl::AddSource")); + wxCHECK_RET(type != FILE_TYPE, wxT("Invalid type, not a source")); + + // Update the other instances of this source + bool bFound = false; + ListIteratorPair rangeIt = m_ListItems.equal_range(source); + for ( ListItems::iterator it = rangeIt.first; it != rangeIt.second; ++it ) { + CtrlItem_Struct* cur_item = it->second; + + // Check if this source has been already added to this file => to be sure + if ( cur_item->GetOwner() == owner ) { + // Update this instance with its new setting + cur_item->SetContents(owner, source, type); + cur_item->dwUpdated = 0; + bFound = true; + } else if ( type == AVAILABLE_SOURCE ) { + // The state 'Available' is exclusive + cur_item->SetContents(cur_item->GetOwner(), source, A4AF_SOURCE); + cur_item->dwUpdated = 0; + } + } + + if ( bFound ) { + return; + } + + if ( owner->ShowSources() ) { + CtrlItem_Struct* newitem = new CtrlItem_Struct; + newitem->SetContents(owner, source, type); + + m_ListItems.insert( ListItemsPair(source, newitem) ); + + // Find the owner-object + ListItems::iterator it = m_ListItems.find( owner ); + + if ( it != m_ListItems.end() ) { + long item = FindItem( -1, reinterpret_cast(it->second) ); + + if ( item > -1 ) { + item = InsertItem( item + 1, wxEmptyString ); + + SetItemPtrData( item, reinterpret_cast(newitem) ); + + // background.. this should be in a function + wxListItem listitem; + listitem.m_itemId = item; + + listitem.SetBackgroundColour( GetBackgroundColour() ); + + SetItem( listitem ); + } + } + } +} + + +void CDownloadListCtrl::RemoveSource( const CUpDownClient* source, const CPartFile* owner ) +{ + wxASSERT( source ); + + // Retrieve all entries matching the source + ListIteratorPair rangeIt = m_ListItems.equal_range(source); + + for ( ListItems::iterator it = rangeIt.first; it != rangeIt.second; ) { + ListItems::iterator tmp = it++; + + CtrlItem_Struct* item = tmp->second; + if ( owner == NULL || owner == item->GetOwner() ) { + // Remove it from the m_ListItems + m_ListItems.erase( tmp ); + + long index = FindItem( -1, reinterpret_cast(item) ); + + if ( index > -1 ) { + DeleteItem( index ); + } + + delete item; + } + } +} + + +void CDownloadListCtrl::RemoveFile( CPartFile* file ) +{ + wxASSERT( file ); + + // Ensure that any assosiated sources and list-entries are removed + ShowFile( file, false ); + + // Find the assosiated list-item + ListItems::iterator it = m_ListItems.find( file ); + + if ( it != m_ListItems.end() ) { + delete it->second; + + m_ListItems.erase( it ); + } +} + + +void CDownloadListCtrl::UpdateItem(const void* toupdate) +{ + // Retrieve all entries matching the source + ListIteratorPair rangeIt = m_ListItems.equal_range( toupdate ); + + // Visible lines, default to all because not all platforms + // support the GetVisibleLines function + long first = 0, last = GetItemCount(); + +#ifndef __WXMSW__ + // Get visible lines if we need them + if ( rangeIt.first != rangeIt.second ) { + GetVisibleLines( &first, &last ); + } +#endif + + for ( ListItems::iterator it = rangeIt.first; it != rangeIt.second; ++it ) { + CtrlItem_Struct* item = it->second; + + long index = FindItem( -1, reinterpret_cast(item) ); + + // Determine if the file should be shown in the current category + if ( item->GetType() == FILE_TYPE ) { + CPartFile* file = item->GetFile(); + + bool show = file->CheckShowItemInGivenCat( m_category ); + + if ( index > -1 ) { + if ( show ) { + item->dwUpdated = 0; + + // Only update visible lines + if ( index >= first && index <= last) { + RefreshItem( index ); + } + } else { + // Item should no longer be shown in + // the current category + ShowFile( file, false ); + } + } else if ( show ) { + // Item has been hidden but new status means + // that it should it should be shown in the + // current category + ShowFile( file, true ); + } + + if (file->GetStatus() == PS_COMPLETE) { + m_completedFiles = true; + + CastByID(ID_BTNCLRCOMPL, GetParent(), wxButton)->Enable(true); + } + } else { + item->dwUpdated = 0; + + // Only update visible lines + if ( index >= first && index <= last) { + RefreshItem( index ); + } + } + } +} + + +void CDownloadListCtrl::ShowFile( CPartFile* file, bool show ) +{ + wxASSERT( file ); + + ListItems::iterator it = m_ListItems.find( file ); + + if ( it != m_ListItems.end() ) { + CtrlItem_Struct* item = it->second; + + if ( show ) { + // Check if the file is already being displayed + long index = FindItem( -1, reinterpret_cast(item) ); + if ( index == -1 ) { + long newitem = InsertItem( GetItemCount(), wxEmptyString ); + + SetItemPtrData( newitem, reinterpret_cast(item) ); + + wxListItem myitem; + myitem.m_itemId = newitem; + myitem.SetBackgroundColour( GetBackgroundColour() ); + + SetItem(myitem); + + RefreshItem( newitem ); + + ShowFilesCount( 1 ); + } + } else { + // Ensure sources are hidden + ShowSources( file, false ); + + // Try to find the file and remove it + long index = FindItem( -1, reinterpret_cast(item) ); + if ( index > -1 ) { + DeleteItem( index ); + ShowFilesCount( -1 ); + } + } + } +} + + +void CDownloadListCtrl::ShowSources( CPartFile* file, bool show ) +{ + // Check if the current state is the same as the new state + if ( file->ShowSources() == show ) { + return; + } + + Freeze(); + + file->SetShowSources( show ); + + if ( show ) { + const CPartFile::SourceSet& normSources = file->GetSourceList(); + const CPartFile::SourceSet& a4afSources = file->GetA4AFList(); + + // Adding normal sources + CPartFile::SourceSet::const_iterator it; + for ( it = normSources.begin(); it != normSources.end(); ++it ) { + switch ((*it)->GetDownloadState()) { + case DS_DOWNLOADING: + case DS_ONQUEUE: + AddSource( file, *it, AVAILABLE_SOURCE ); + default: + // Any other state + AddSource( file, *it, UNAVAILABLE_SOURCE ); + } + + } + + // Adding A4AF sources + for ( it = a4afSources.begin(); it != a4afSources.end(); ++it ) { + AddSource( file, *it, A4AF_SOURCE ); + } + } else { + for ( int i = GetItemCount() - 1; i >= 0; --i ) { + CtrlItem_Struct* item = (CtrlItem_Struct*)GetItemData(i); + + if ( item->GetType() != FILE_TYPE && item->GetOwner() == file ) { + // Remove from the grand list, this call doesn't remove the source + // from the listctrl, because ShowSources is now false. This also + // deletes the item. + RemoveSource(item->GetSource(), file); + } + } + } + + Thaw(); +} + + +void CDownloadListCtrl::ChangeCategory( int newCategory ) +{ + Freeze(); + + // remove all displayed files with a different cat and show the correct ones + for (ListItems::const_iterator it = m_ListItems.begin(); it != m_ListItems.end(); it++) { + const CtrlItem_Struct *cur_item = it->second; + + if ( cur_item->GetType() == FILE_TYPE ) { + CPartFile* file = cur_item->GetFile(); + + bool curVisibility = file->CheckShowItemInGivenCat( m_category ); + bool newVisibility = file->CheckShowItemInGivenCat( newCategory ); + + // Check if the visibility of the file has changed. However, if the + // current category is the default (0) category, then we can't use + // curVisiblity to see if the visibility has changed but instead + // have to let ShowFile() check if the file is or isn't on the list. + if ( curVisibility != newVisibility || !newCategory ) { + ShowFile( file, newVisibility ); + } + } + } + + Thaw(); + + m_category = newCategory; +} + + +uint8 CDownloadListCtrl::GetCategory() const +{ + return m_category; +} + + +/* + * + */ +const int itFILES = 1; +const int itSOURCES = 2; + +/** + * Helper-function: This function is used to gather selected items. + * + * @param list A pointer to the list to gather items from. + * @param types The desired types OR'd together. + * @return A list containing the selected items of the choosen types. + */ +ItemList GetSelectedItems( CDownloadListCtrl* list, int types ) +{ + ItemList results; + + long index = list->GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + + while ( index > -1 ) { + CtrlItem_Struct* item = (CtrlItem_Struct*)list->GetItemData( index ); + + bool add = false; + add |= ( item->GetType() == FILE_TYPE ) && ( types & itFILES ); + add |= ( item->GetType() != FILE_TYPE ) && ( types & itSOURCES ); + + if ( add ) { + results.push_back( item ); + } + + index = list->GetNextItem( index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + } + + return results; +} + + +void CDownloadListCtrl::OnCancelFile(wxCommandEvent& WXUNUSED(event)) +{ + ItemList files = ::GetSelectedItems(this, itFILES); + if (files.size()) { + wxString question; + if (files.size() == 1) { + question = _("Are you sure that you wish to delete the selected file?"); + } else { + question = _("Are you sure that you wish to delete the selected files?"); + } + if (wxMessageBox( question, _("Cancel"), wxICON_QUESTION | wxYES_NO, this) == wxYES) { + for (ItemList::iterator it = files.begin(); it != files.end(); ++it) { + CPartFile* file = (*it)->GetFile(); + if (file) { + switch (file->GetStatus()) { + case PS_WAITINGFORHASH: + case PS_HASHING: + case PS_COMPLETING: + case PS_COMPLETE: + break; + default: + CoreNotify_PartFile_Delete(file); + } + } + } + } + } +} + + +void CDownloadListCtrl::OnSetPriority( wxCommandEvent& event ) +{ + int priority = 0; + switch ( event.GetId() ) { + case MP_PRIOLOW: priority = PR_LOW; break; + case MP_PRIONORMAL: priority = PR_NORMAL; break; + case MP_PRIOHIGH: priority = PR_HIGH; break; + case MP_PRIOAUTO: priority = PR_AUTO; break; + default: + wxASSERT( false ); + } + + ItemList files = ::GetSelectedItems( this, itFILES ); + + for ( ItemList::iterator it = files.begin(); it != files.end(); ++it ) { + CPartFile* file = (*it)->GetFile(); + + if ( priority == PR_AUTO ) { + CoreNotify_PartFile_PrioAuto( file, true ); + } else { + CoreNotify_PartFile_PrioAuto( file, false ); + + CoreNotify_PartFile_PrioSet( file, priority, true ); + } + } +} + + +void CDownloadListCtrl::OnSwapSources( wxCommandEvent& event ) +{ + ItemList files = ::GetSelectedItems( this, itFILES ); + + for ( ItemList::iterator it = files.begin(); it != files.end(); ++it ) { + CPartFile* file = (*it)->GetFile(); + + switch ( event.GetId() ) { + case MP_SWAP_A4AF_TO_THIS: + CoreNotify_PartFile_Swap_A4AF( file ); + break; + + case MP_SWAP_A4AF_TO_THIS_AUTO: + CoreNotify_PartFile_Swap_A4AF_Auto( file ); + break; + + case MP_SWAP_A4AF_TO_ANY_OTHER: + CoreNotify_PartFile_Swap_A4AF_Others( file ); + break; + } + } +} + + +void CDownloadListCtrl::OnSetCategory( wxCommandEvent& event ) +{ + ItemList files = ::GetSelectedItems( this, itFILES ); + + for ( ItemList::iterator it = files.begin(); it != files.end(); ++it ) { + CPartFile* file = (*it)->GetFile(); + + CoreNotify_PartFile_SetCat( file, event.GetId() - MP_ASSIGNCAT ); + } + + ChangeCategory( m_category ); +} + + +void CDownloadListCtrl::OnSetStatus( wxCommandEvent& event ) +{ + ItemList files = ::GetSelectedItems( this, itFILES ); + + for ( ItemList::iterator it = files.begin(); it != files.end(); ++it ) { + CPartFile* file = (*it)->GetFile(); + + switch ( event.GetId() ) { + case MP_PAUSE: + CoreNotify_PartFile_Pause( file ); + break; + + case MP_RESUME: + CoreNotify_PartFile_Resume( file ); + break; + + case MP_STOP: + ShowSources(file, false); + CoreNotify_PartFile_Stop( file ); + break; + } + } +} + + +void CDownloadListCtrl::OnClearCompleted( wxCommandEvent& WXUNUSED(event) ) +{ + ClearCompleted(); +} + + +void CDownloadListCtrl::OnGetLink(wxCommandEvent& event) +{ + ItemList files = ::GetSelectedItems( this, itFILES ); + + wxString URIs; + + for ( ItemList::iterator it = files.begin(); it != files.end(); ++it ) { + CPartFile* file = (*it)->GetFile(); + + if ( event.GetId() == MP_GETED2KLINK ) { + URIs += theApp->CreateED2kLink( file ) + wxT("\n"); + } else { + URIs += theApp->CreateMagnetLink( file ) + wxT("\n"); + } + } + + if ( !URIs.IsEmpty() ) { + theApp->CopyTextToClipboard( URIs.BeforeLast(wxT('\n')) ); + } +} + + +void CDownloadListCtrl::OnGetFeedback(wxCommandEvent& WXUNUSED(event)) +{ + wxString feed; + ItemList files = ::GetSelectedItems(this, itFILES); + for (ItemList::iterator it = files.begin(); it != files.end(); ++it) { + CPartFile* file = (*it)->GetFile(); + feed += file->GetFeedback(); + } + if (!feed.IsEmpty()) { + theApp->CopyTextToClipboard(feed); + } +} + + +void CDownloadListCtrl::OnGetRazorStats( wxCommandEvent& WXUNUSED(event) ) +{ + ItemList files = ::GetSelectedItems( this, itFILES ); + + if ( files.size() == 1 ) { + CPartFile* file = files.front()->GetFile(); + + theApp->amuledlg->LaunchUrl( + wxT("http://stats.razorback2.com/ed2khistory?ed2k=") + + file->GetFileHash().Encode()); + } +} + + +void CDownloadListCtrl::OnViewFileInfo( wxCommandEvent& WXUNUSED(event) ) +{ + ItemList files = ::GetSelectedItems( this, itFILES ); + + if ( files.size() == 1 ) { + CPartFile* file = files.front()->GetFile(); + + CFileDetailDialog dialog( this, file ); + dialog.ShowModal(); + } +} + + +void CDownloadListCtrl::OnViewFileComments( wxCommandEvent& WXUNUSED(event) ) +{ + ItemList files = ::GetSelectedItems( this, itFILES ); + + if ( files.size() == 1 ) { + CPartFile* file = files.front()->GetFile(); + + CCommentDialogLst dialog( this, file ); + dialog.ShowModal(); + } +} + + +void CDownloadListCtrl::OnPreviewFile( wxCommandEvent& WXUNUSED(event) ) +{ + ItemList files = ::GetSelectedItems( this, itFILES ); + + if ( files.size() == 1 ) { + PreviewFile(files.front()->GetFile()); + } +} + +void CDownloadListCtrl::OnSwapSource( wxCommandEvent& WXUNUSED(event) ) +{ + ItemList sources = ::GetSelectedItems( this, itSOURCES ); + + for ( ItemList::iterator it = sources.begin(); it != sources.end(); ++it ) { + CPartFile* file = (*it)->GetOwner(); + CUpDownClient* source = (*it)->GetSource(); + + source->SwapToAnotherFile( true, false, false, file ); + } +} + + +void CDownloadListCtrl::OnViewFiles( wxCommandEvent& WXUNUSED(event) ) +{ + ItemList sources = ::GetSelectedItems( this, itSOURCES ); + + if ( sources.size() == 1 ) { + CUpDownClient* source = sources.front()->GetSource(); + + source->RequestSharedFileList(); + } +} + + +void CDownloadListCtrl::OnAddFriend( wxCommandEvent& WXUNUSED(event) ) +{ + ItemList sources = ::GetSelectedItems( this, itSOURCES ); + + for ( ItemList::iterator it = sources.begin(); it != sources.end(); ++it ) { + CUpDownClient* client = (*it)->GetSource(); + if (client->IsFriend()) { + theApp->amuledlg->m_chatwnd->RemoveFriend(client->GetUserHash(), client->GetIP(), client->GetUserPort()); + } else { + theApp->amuledlg->m_chatwnd->AddFriend( client ); + } + } +} + + +void CDownloadListCtrl::OnSendMessage( wxCommandEvent& WXUNUSED(event) ) +{ + ItemList sources = ::GetSelectedItems( this, itSOURCES ); + + if ( sources.size() == 1 ) { + CUpDownClient* source = (sources.front())->GetSource(); + + // These values are cached, since calling wxGetTextFromUser will + // start an event-loop, in which the client may be deleted. + wxString userName = source->GetUserName(); + uint64 userID = GUI_ID(source->GetIP(), source->GetUserPort()); + + wxString message = ::wxGetTextFromUser(_("Send message to user"), + _("Message to send:")); + if ( !message.IsEmpty() ) { + theApp->amuledlg->m_chatwnd->SendMessage(message, userName, userID); + } + } +} + + +void CDownloadListCtrl::OnViewClientInfo( wxCommandEvent& WXUNUSED(event) ) +{ + ItemList sources = ::GetSelectedItems( this, itSOURCES ); + + if ( sources.size() == 1 ) { + CUpDownClient* source = (sources.front())->GetSource(); + + CClientDetailDialog dialog( this, source ); + dialog.ShowModal(); + } +} + + +void CDownloadListCtrl::OnItemActivated( wxListEvent& evt ) +{ + CtrlItem_Struct* content = (CtrlItem_Struct*)GetItemData( evt.GetIndex() ); + + if ( content->GetType() == FILE_TYPE ) { + CPartFile* file = content->GetFile(); + + if ((!file->IsPartFile() || file->GetStatus() == PS_COMPLETE) && file->PreviewAvailable()) { + PreviewFile( file ); + } else { + ShowSources( file, !file->ShowSources() ); + } + + } +} + + +void CDownloadListCtrl::OnMouseRightClick(wxListEvent& evt) +{ + long index = CheckSelection(evt); + if (index < 0) { + return; + } + + delete m_menu; + m_menu = NULL; + + CtrlItem_Struct* item = (CtrlItem_Struct*)GetItemData( index ); + if (item->GetType() == FILE_TYPE) { + m_menu = new wxMenu( _("Downloads") ); + + wxMenu* priomenu = new wxMenu(); + priomenu->AppendCheckItem(MP_PRIOLOW, _("Low")); + priomenu->AppendCheckItem(MP_PRIONORMAL, _("Normal")); + priomenu->AppendCheckItem(MP_PRIOHIGH, _("High")); + priomenu->AppendCheckItem(MP_PRIOAUTO, _("Auto")); + + m_menu->Append(MP_MENU_PRIO, _("Priority"), priomenu); + m_menu->Append(MP_CANCEL, _("Cancel")); + m_menu->Append(MP_STOP, _("&Stop")); + m_menu->Append(MP_PAUSE, _("&Pause")); + m_menu->Append(MP_RESUME, _("&Resume")); + m_menu->Append(MP_CLEARCOMPLETED, _("C&lear completed")); + //----------------------------------------------------- + m_menu->AppendSeparator(); + //----------------------------------------------------- + wxMenu* extendedmenu = new wxMenu(); + extendedmenu->Append(MP_SWAP_A4AF_TO_THIS, + _("Swap every A4AF to this file now")); + extendedmenu->AppendCheckItem(MP_SWAP_A4AF_TO_THIS_AUTO, + _("Swap every A4AF to this file (Auto)")); + //----------------------------------------------------- + extendedmenu->AppendSeparator(); + //----------------------------------------------------- + extendedmenu->Append(MP_SWAP_A4AF_TO_ANY_OTHER, + _("Swap every A4AF to any other file now")); + //----------------------------------------------------- + m_menu->Append(MP_MENU_EXTD, + _("Extended Options"), extendedmenu); + //----------------------------------------------------- + m_menu->AppendSeparator(); + //----------------------------------------------------- +/* Commented out till RB2 is back + m_menu->Append( MP_RAZORSTATS, + _("Get Razorback 2's stats for this file")); + //----------------------------------------------------- + m_menu->AppendSeparator(); + //----------------------------------------------------- +*/ + m_menu->Append(MP_VIEW, _("Preview")); + m_menu->Append(MP_METINFO, _("Show file &details")); + m_menu->Append(MP_VIEWFILECOMMENTS, + _("Show all comments")); + //----------------------------------------------------- + m_menu->AppendSeparator(); + //----------------------------------------------------- + m_menu->Append(MP_GETMAGNETLINK, + _("Copy magnet URI to clipboard")); + m_menu->Append(MP_GETED2KLINK, + _("Copy ED2k &link to clipboard")); + m_menu->Append(MP_WS, + _("Copy feedback to clipboard")); + //----------------------------------------------------- + m_menu->AppendSeparator(); + //----------------------------------------------------- + // Add dinamic entries + wxMenu *cats = new wxMenu(_("Category")); + if (theApp->glob_prefs->GetCatCount() > 1) { + for (uint32 i = 0; i < theApp->glob_prefs->GetCatCount(); i++) { + if ( i == 0 ) { + cats->Append( MP_ASSIGNCAT, _("unassign") ); + } else { + cats->Append( MP_ASSIGNCAT + i, + theApp->glob_prefs->GetCategory(i)->title ); + } + } + } + m_menu->Append(MP_MENU_CATS, _("Assign to category"), cats); + m_menu->Enable(MP_MENU_CATS, (theApp->glob_prefs->GetCatCount() > 1) ); + + CPartFile* file = item->GetFile(); + // then set state + const bool canStop = + (file->GetStatus() != PS_ERROR) && + (file->GetStatus() != PS_COMPLETE) && + (file->IsStopped() != true); + const bool canPause = + (file->GetStatus() != PS_PAUSED) && canStop; + const bool fileResumable = + (file->GetStatus() == PS_PAUSED) || + (file->GetStatus() == PS_ERROR) || + (file->GetStatus() == PS_INSUFFICIENT); + + wxMenu* menu = m_menu; + menu->Enable( MP_CANCEL, ( file->GetStatus() != PS_COMPLETE ) ); + menu->Enable( MP_PAUSE, canPause ); + menu->Enable( MP_STOP, canStop ); + menu->Enable( MP_RESUME, fileResumable ); + menu->Enable( MP_CLEARCOMPLETED, m_completedFiles ); + + wxString view; + if (file->IsPartFile() && (file->GetStatus() != PS_COMPLETE)) { + view << CFormat(wxT("%s [%s]")) % _("Preview") + % file->GetPartMetFileName().RemoveExt(); + } else if ( file->GetStatus() == PS_COMPLETE ) { + view << _("&Open the file"); + } + menu->SetLabel(MP_VIEW, view); + menu->Enable(MP_VIEW, file->PreviewAvailable() ); + + menu->Check( MP_SWAP_A4AF_TO_THIS_AUTO, file->IsA4AFAuto() ); + + int priority = file->IsAutoDownPriority() ? + PR_AUTO : file->GetDownPriority(); + + priomenu->Check( MP_PRIOHIGH, priority == PR_HIGH ); + priomenu->Check( MP_PRIONORMAL, priority == PR_NORMAL ); + priomenu->Check( MP_PRIOLOW, priority == PR_LOW ); + priomenu->Check( MP_PRIOAUTO, priority == PR_AUTO ); + + menu->Enable( MP_MENU_EXTD, canPause ); + + PopupMenu(m_menu, evt.GetPoint()); + + } else { + CUpDownClient* client = item->GetSource(); + + m_menu = new wxMenu(wxT("Clients")); + m_menu->Append(MP_DETAIL, _("Show &Details")); + m_menu->Append(MP_ADDFRIEND, client->IsFriend() ? _("Remove from friends") : _("Add to Friends")); + m_menu->Append(MP_SHOWLIST, _("View Files")); + m_menu->Append(MP_SENDMESSAGE, _("Send message")); + m_menu->Append(MP_CHANGE2FILE, _("Swap to this file")); + + // Only enable the Swap option for A4AF sources + m_menu->Enable(MP_CHANGE2FILE, (item->GetType() == A4AF_SOURCE)); + // We need a valid IP if we are to message the client + m_menu->Enable(MP_SENDMESSAGE, client->GetIP()); + + m_menu->Enable(MP_SHOWLIST, !client->HasDisabledSharedFiles()); + + PopupMenu(m_menu, evt.GetPoint()); + + } + + delete m_menu; + m_menu = NULL; + +} + + +void CDownloadListCtrl::OnMouseMiddleClick(wxListEvent& evt) +{ + // Check if clicked item is selected. If not, unselect all and select it. + long index = CheckSelection(evt); + if ( index < 0 ) { + return; + } + + CtrlItem_Struct* item = (CtrlItem_Struct*)GetItemData( index ); + + if ( item->GetType() == FILE_TYPE ) { + CFileDetailDialog(this, item->GetFile()).ShowModal(); + } else { + CClientDetailDialog(this, item->GetSource()).ShowModal(); + } +} + + +void CDownloadListCtrl::OnKeyPressed( wxKeyEvent& event ) +{ + // Check if delete was pressed + switch (event.GetKeyCode()) { + case WXK_NUMPAD_DELETE: + case WXK_DELETE: { + wxCommandEvent evt; + OnCancelFile( evt ); + break; + } + case WXK_F2: { + ItemList files = ::GetSelectedItems( this, itFILES ); + if (files.size() == 1) { + CPartFile* file = files.front()->GetFile(); + + // Currently renaming of completed files causes problem with kad + if (file->IsPartFile()) { + wxString strNewName = ::wxGetTextFromUser( + _("Enter new name for this file:"), + _("File rename"), file->GetFileName().GetPrintable()); + + CPath newName = CPath(strNewName); + if (newName.IsOk() && (newName != file->GetFileName())) { + theApp->sharedfiles->RenameFile(file, newName); + } + } + } + break; + } + default: + event.Skip(); + } +} + + +void CDownloadListCtrl::OnDrawItem( + int item, wxDC* dc, const wxRect& rect, const wxRect& rectHL, bool highlighted) +{ + // Don't do any drawing if there's nobody to see it. + if ( !theApp->amuledlg->IsDialogVisible( CamuleDlg::DT_TRANSFER_WND ) ) { + return; + } + + CtrlItem_Struct* content = (CtrlItem_Struct *)GetItemData(item); + + // Define text-color and background + if ((content->GetType() == FILE_TYPE) && (highlighted)) { + if (GetFocus()) { + dc->SetBackground(*m_hilightBrush); + dc->SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT)); + } else { + dc->SetBackground(*m_hilightUnfocusBrush); + dc->SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT)); + } + } else { + dc->SetBackground(*(wxTheBrushList->FindOrCreateBrush( + wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOX), wxSOLID))); + dc->SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); + } + + + // Define the border of the drawn area + if ( highlighted ) { + wxColour old; + if ( ( content->GetType() == FILE_TYPE ) && !GetFocus() ) { + old = m_hilightUnfocusBrush->GetColour(); + } else { + old = m_hilightBrush->GetColour(); + } + + wxColor newcol( + ((int)old.Red() * 65) / 100, + ((int)old.Green() * 65) / 100, + ((int)old.Blue() * 65) / 100); + + dc->SetPen( wxPen(newcol, 1, wxSOLID) ); + } else { + dc->SetPen(*wxTRANSPARENT_PEN); + } + + + dc->SetBrush( dc->GetBackground() ); + dc->DrawRectangle( rectHL.x, rectHL.y, rectHL.width, rectHL.height ); + + dc->SetPen(*wxTRANSPARENT_PEN); + + if ( content->GetType() == FILE_TYPE && ( !highlighted || !GetFocus() ) ) { + // If we have category, override textforeground with what category tells us. + CPartFile *file = content->GetFile(); + if ( file->GetCategory() ) { + dc->SetTextForeground( + WxColourFromCr(theApp->glob_prefs->GetCatColor(file->GetCategory())) ); + } + } + + // Various constant values we use + const int iTextOffset = ( rect.GetHeight() - dc->GetCharHeight() ) / 2; + const int iOffset = 4; + + // The starting end ending position of the tree + bool tree_show = false; + int tree_start = 0; + int tree_end = 0; + + wxRect cur_rec( iOffset, rect.y, 0, rect.height ); + for (int i = 0; i < GetColumnCount(); i++) { + wxListItem listitem; + GetColumn(i, listitem); + + if (listitem.GetWidth() > 2*iOffset) { + cur_rec.width = listitem.GetWidth() - 2*iOffset; + + // Make a copy of the current rectangle so we can apply specific tweaks + wxRect target_rec = cur_rec; + if ( i == 5 ) { + tree_show = ( listitem.GetWidth() > 0 ); + + tree_start = cur_rec.x - iOffset; + tree_end = cur_rec.x + iOffset; + + // Double the offset to make room for the cirle-marker + target_rec.x += iOffset; + target_rec.width -= iOffset; + } else { + // will ensure that text is about in the middle ;) + target_rec.y += iTextOffset; + } + + // Draw the item + if ( content->GetType() == FILE_TYPE ) { + DrawFileItem(dc, i, target_rec, content); + } else { + DrawSourceItem(dc, i, target_rec, content); + } + } + + // Increment to the next column + cur_rec.x += listitem.GetWidth(); + } + + // Draw tree last so it draws over selected and focus (looks better) + if ( tree_show ) { + // Gather some information + const bool notLast = item + 1 != GetItemCount(); + const bool notFirst = item != 0; + const bool hasNext = notLast && + ((CtrlItem_Struct*)GetItemData(item + 1))->GetType() != FILE_TYPE; + const bool isOpenRoot = content->GetType() == FILE_TYPE && + (content->GetFile())->ShowSources() && + ((content->GetFile())->GetStatus() != PS_COMPLETE); + const bool isChild = content->GetType() != FILE_TYPE; + + // Might as well calculate these now + const int treeCenter = tree_start + 3; + const int middle = cur_rec.y + ( cur_rec.height + 1 ) / 2; + + // Set up a new pen for drawing the tree + dc->SetPen( *(wxThePenList->FindOrCreatePen(dc->GetTextForeground(), 1, wxSOLID)) ); + + if (isChild) { + // Draw the line to the status bar + dc->DrawLine(tree_end, middle, tree_start + 3, middle); + + // Draw the line to the child node + if (hasNext) { + dc->DrawLine(treeCenter, middle, treeCenter, cur_rec.y + cur_rec.height + 1); + } + + // Draw the line back up to parent node + if (notFirst) { + dc->DrawLine(treeCenter, middle, treeCenter, cur_rec.y - 1); + } + } else if ( isOpenRoot ) { + // Draw empty circle + dc->SetBrush(*wxTRANSPARENT_BRUSH); + + dc->DrawCircle( treeCenter, middle, 3 ); + + // Draw the line to the child node if there are any children + if (hasNext) { + dc->DrawLine(treeCenter, middle + 3, treeCenter, cur_rec.y + cur_rec.height + 1); + } + } + + } +} + + +void CDownloadListCtrl::DrawFileItem( wxDC* dc, int nColumn, const wxRect& rect, CtrlItem_Struct* item ) const +{ + wxDCClipper clipper( *dc, rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight() ); + + const CPartFile* file = item->GetFile(); + + // Used to contain the contenst of cells that dont need any fancy drawing, just text. + wxString text; + + switch (nColumn) { + // Filename + case 0: { + // show no. of partfile in filename column + wxString filename; + if (thePrefs::ShowPartFileNumber()) { + if (file->IsPartFile() && !(file->GetStatus() == PS_COMPLETE)) { + filename = CFormat(wxT("[%s] ")) % file->GetPartMetFileName().RemoveAllExt(); + } + } + filename += file->GetFileName().GetPrintable(); + + if (file->HasRating() || file->HasComment()) { + int image = Client_CommentOnly_Smiley; + if (file->HasRating()) { + image = Client_InvalidRating_Smiley + file->UserRating() - 1; + } + + wxASSERT(image >= Client_InvalidRating_Smiley); + wxASSERT(image <= Client_CommentOnly_Smiley); + + int imgWidth = 16; + + // it's already centered by OnDrawItem() ... + m_ImageList.Draw(image, *dc, rect.GetX(), rect.GetY() - 1, + wxIMAGELIST_DRAW_TRANSPARENT); + dc->DrawText(filename, rect.GetX() + imgWidth + 4, rect.GetY()); + } else { + dc->DrawText(filename, rect.GetX(), rect.GetY()); + } + } + break; + + // Filesize + case 1: + text = CastItoXBytes( file->GetFileSize() ); + break; + + // Transferred + case 2: + text = CastItoXBytes( file->GetTransferred() ); + break; + + // Completed + case 3: + text = CastItoXBytes( file->GetCompletedSize() ); + break; + + // Speed + case 4: // speed + if ( file->GetTransferingSrcCount() ) { + text = wxString::Format( wxT("%.1f "), file->GetKBpsDown() ) + + _("kB/s"); + } + break; + + case 5: // progress + { + if (thePrefs::ShowProgBar()) + { + int iWidth = rect.GetWidth() - 2; + int iHeight = rect.GetHeight() - 2; + + // DO NOT DRAW IT ALL THE TIME + uint32 dwTicks = GetTickCount(); + + wxMemoryDC cdcStatus; + + if ( item->dwUpdated < dwTicks || !item->status || iWidth != item->status->GetWidth() ) { + if ( item->status == NULL) { + item->status = new wxBitmap(iWidth, iHeight); + } else if ( item->status->GetWidth() != iWidth ) { + // Only recreate if the size has changed + item->status->Create(iWidth, iHeight); + } + + cdcStatus.SelectObject( *item->status ); + + if ( thePrefs::UseFlatBar() ) { + DrawFileStatusBar( file, &cdcStatus, + wxRect(0, 0, iWidth, iHeight), true); + } else { + DrawFileStatusBar( file, &cdcStatus, + wxRect(1, 1, iWidth - 2, iHeight - 2), false); + + // Draw black border + cdcStatus.SetPen( *wxBLACK_PEN ); + cdcStatus.SetBrush( *wxTRANSPARENT_BRUSH ); + cdcStatus.DrawRectangle( 0, 0, iWidth, iHeight ); + } + + item->dwUpdated = dwTicks + 5000; // Plus five seconds + } else { + cdcStatus.SelectObject( *item->status ); + } + + dc->Blit( rect.GetX(), rect.GetY() + 1, iWidth, iHeight, &cdcStatus, 0, 0); + } + + if (thePrefs::ShowPercent()) { + // Percentage of completing + // We strip anything below the first decimal point, + // to avoid Format doing roundings + float percent = floor( file->GetPercentCompleted() * 10.0f ) / 10.0f; + + wxString buffer = wxString::Format( wxT("%.1f%%"), percent ); + int middlex = (2*rect.GetX() + rect.GetWidth()) >> 1; + int middley = (2*rect.GetY() + rect.GetHeight()) >> 1; + + wxCoord textwidth, textheight; + + dc->GetTextExtent(buffer, &textwidth, &textheight); + wxColour AktColor = dc->GetTextForeground(); + if (thePrefs::ShowProgBar()) { + dc->SetTextForeground(*wxWHITE); + } else { + dc->SetTextForeground(*wxBLACK); + } + dc->DrawText(buffer, middlex - (textwidth >> 1), middley - (textheight >> 1)); + dc->SetTextForeground(AktColor); + } + } + break; + + // Sources + case 6: { + uint16 sc = file->GetSourceCount(); + uint16 ncsc = file->GetNotCurrentSourcesCount(); + if ( ncsc ) { + text = wxString::Format( wxT("%i/%i" ), sc - ncsc, sc ); + } else { + text = wxString::Format( wxT("%i"), sc ); + } + + if ( file->GetSrcA4AFCount() ) { + text += wxString::Format( wxT("+%i"), file->GetSrcA4AFCount() ); + } + + if ( file->GetTransferingSrcCount() ) { + text += wxString::Format( wxT(" (%i)"), file->GetTransferingSrcCount() ); + } + + break; + } + + // Priority + case 7: + text = PriorityToStr( file->GetDownPriority(), file->IsAutoDownPriority() ); + break; + + // File-status + case 8: + text = file->getPartfileStatus(); + break; + + // Remaining + case 9: { + if ((file->GetStatus() != PS_COMPLETING) && file->IsPartFile()) { + uint64 remainSize = file->GetFileSize() - file->GetCompletedSize(); + sint32 remainTime = file->getTimeRemaining(); + + if (remainTime >= 0) { + text = CastSecondsToHM(remainTime); + } else { + text = _("Unknown"); + } + + text += wxT(" (") + CastItoXBytes(remainSize) + wxT(")"); + } + break; + } + + // Last seen completed + case 10: { + if ( file->lastseencomplete ) { + text = wxDateTime( file->lastseencomplete ).Format( _("%y/%m/%d %H:%M:%S") ); + } else { + text = _("Unknown"); + } + break; + } + + // Laste received + case 11: { + const time_t lastReceived = file->GetLastChangeDatetime(); + if (lastReceived) { + text = wxDateTime(lastReceived).Format( _("%y/%m/%d %H:%M:%S") ); + } else { + text = _("Unknown"); + } + } + } // switch + + if ( !text.IsEmpty() ) { + dc->DrawText( text, rect.GetX(), rect.GetY() ); + } +} + + +void CDownloadListCtrl::DrawSourceItem( + wxDC* dc, int nColumn, const wxRect& rect, CtrlItem_Struct* item ) const +{ + wxDCClipper clipper( *dc, rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight() ); + wxString buffer; + + const CUpDownClient* client = item->GetSource(); + + switch (nColumn) { + // Client name + various icons + case 0: { + wxRect cur_rec = rect; + // +3 is added by OnDrawItem()... so take it off + // Kry - eMule says +1, so I'm trusting it + wxPoint point( cur_rec.GetX(), cur_rec.GetY()+1 ); + + if (item->GetType() != A4AF_SOURCE) { + uint8 image = 0; + + switch (client->GetDownloadState()) { + case DS_CONNECTING: + case DS_CONNECTED: + case DS_WAITCALLBACK: + case DS_TOOMANYCONNS: + image = Client_Red_Smiley; + break; + case DS_ONQUEUE: + if (client->IsRemoteQueueFull()) { + image = Client_Grey_Smiley; + } else { + image = Client_Yellow_Smiley; + } + break; + case DS_DOWNLOADING: + case DS_REQHASHSET: + image = Client_Green_Smiley; + break; + case DS_NONEEDEDPARTS: + case DS_LOWTOLOWIP: + image = Client_Grey_Smiley; + break; + default: // DS_NONE i.e. + image = Client_White_Smiley; + } + + m_ImageList.Draw(image, *dc, point.x, point.y, + wxIMAGELIST_DRAW_TRANSPARENT); + } else { + m_ImageList.Draw(Client_Grey_Smiley, *dc, point.x, point.y, + wxIMAGELIST_DRAW_TRANSPARENT); + } + + cur_rec.x += 20; + wxPoint point2( cur_rec.GetX(), cur_rec.GetY() + 1 ); + + uint8 clientImage; + + if ( client->IsFriend() ) { + clientImage = Client_Friend_Smiley; + } else { + switch ( client->GetClientSoft() ) { + case SO_AMULE: + clientImage = Client_aMule_Smiley; + break; + case SO_MLDONKEY: + case SO_NEW_MLDONKEY: + case SO_NEW2_MLDONKEY: + clientImage = Client_mlDonkey_Smiley; + break; + case SO_EDONKEY: + case SO_EDONKEYHYBRID: + clientImage = Client_eDonkeyHybrid_Smiley; + break; + case SO_EMULE: + clientImage = Client_eMule_Smiley; + break; + case SO_LPHANT: + clientImage = Client_lphant_Smiley; + break; + case SO_SHAREAZA: + case SO_NEW_SHAREAZA: + case SO_NEW2_SHAREAZA: + clientImage = Client_Shareaza_Smiley; + break; + case SO_LXMULE: + clientImage = Client_xMule_Smiley; + break; + default: + // cDonkey, Compatible, Unknown + // No icon for those yet. + // Using the eMule one + '?' + clientImage = Client_Unknown; + break; + } + } + + m_ImageList.Draw(clientImage, *dc, point2.x, point.y, + wxIMAGELIST_DRAW_TRANSPARENT); + + if (client->GetScoreRatio() > 1) { + // Has credits, draw the gold star + m_ImageList.Draw(Client_CreditsYellow_Smiley, *dc, point2.x, point.y, + wxIMAGELIST_DRAW_TRANSPARENT ); + } else if ( client->ExtProtocolAvailable() ) { + // Ext protocol -> Draw the '+' + m_ImageList.Draw(Client_ExtendedProtocol_Smiley, *dc, point2.x, point.y, + wxIMAGELIST_DRAW_TRANSPARENT); + } + + if (client->IsIdentified()) { + // the 'v' + m_ImageList.Draw(Client_SecIdent_Smiley, *dc, point2.x, point.y, + wxIMAGELIST_DRAW_TRANSPARENT); + } else if (client->IsBadGuy()) { + // the 'X' + m_ImageList.Draw(Client_BadGuy_Smiley, *dc, point2.x, point.y, + wxIMAGELIST_DRAW_TRANSPARENT); + } + + if (client->HasObfuscatedConnectionBeenEstablished()) { + // the "¿" except it's a key + m_ImageList.Draw(Client_Encryption_Smiley, *dc, point2.x, point.y, + wxIMAGELIST_DRAW_TRANSPARENT); + } + + wxString userName; +#ifdef ENABLE_IP2COUNTRY + // Draw the flag + const CountryData& countrydata = theApp->amuledlg->m_IP2Country->GetCountryData(client->GetFullIP()); + dc->DrawBitmap(countrydata.Flag, + rect.x + 40, rect.y + 5, + wxIMAGELIST_DRAW_TRANSPARENT); + + userName << countrydata.Name; + + userName << wxT(" - "); +#endif // ENABLE_IP2COUNTRY + if (client->GetUserName().IsEmpty()) { + userName << wxT("?"); + } else { + userName << client->GetUserName(); + } + dc->DrawText(userName, rect.GetX() + 60, rect.GetY()); + } + break; + + case 3: // completed + if (item->GetType() != A4AF_SOURCE && client->GetTransferredDown()) { + buffer = CastItoXBytes(client->GetTransferredDown()); + dc->DrawText(buffer, rect.GetX(), rect.GetY()); + } + break; + + case 4: // speed + if (item->GetType() != A4AF_SOURCE && client->GetKBpsDown() > 0.001) { + buffer = wxString::Format(wxT("%.1f "), + client->GetKBpsDown()) + _("kB/s"); + dc->DrawText(buffer, rect.GetX(), rect.GetY()); + } + break; + + case 5: // file info + if ( thePrefs::ShowProgBar() ) { + int iWidth = rect.GetWidth() - 2; + int iHeight = rect.GetHeight() - 2; + + if ( item->GetType() != A4AF_SOURCE ) { + uint32 dwTicks = GetTickCount(); + + wxMemoryDC cdcStatus; + + if ( item->dwUpdated < dwTicks || !item->status || + iWidth != item->status->GetWidth() ) { + + if (item->status == NULL) { + item->status = new wxBitmap(iWidth, iHeight); + } else if ( item->status->GetWidth() != iWidth ) { + // Only recreate if size has changed + item->status->Create(iWidth, iHeight); + } + + cdcStatus.SelectObject(*(item->status)); + + if ( thePrefs::UseFlatBar() ) { + DrawSourceStatusBar( client, &cdcStatus, + wxRect(0, 0, iWidth, iHeight), true); + } else { + DrawSourceStatusBar( client, &cdcStatus, + wxRect(1, 1, iWidth - 2, iHeight - 2), false); + + // Draw black border + cdcStatus.SetPen( *wxBLACK_PEN ); + cdcStatus.SetBrush( *wxTRANSPARENT_BRUSH ); + cdcStatus.DrawRectangle( 0, 0, iWidth, iHeight ); + } + + // Plus ten seconds + item->dwUpdated = dwTicks + 10000; + } else { + cdcStatus.SelectObject(*(item->status)); + } + + dc->Blit(rect.GetX(), rect.GetY() + 1, iWidth, iHeight, &cdcStatus, 0, 0); + } else { + buffer = _("A4AF"); + + int midx = (2*rect.GetX() + rect.GetWidth()) >> 1; + int midy = (2*rect.GetY() + rect.GetHeight()) >> 1; + + wxCoord txtwidth, txtheight; + + dc->GetTextExtent(buffer, &txtwidth, &txtheight); + + dc->SetTextForeground(*wxBLACK); + dc->DrawText(buffer, midx - (txtwidth >> 1), midy - (txtheight >> 1)); + + // Draw black border + dc->SetPen( *wxBLACK_PEN ); + dc->SetBrush( *wxTRANSPARENT_BRUSH ); + dc->DrawRectangle( rect.GetX(), rect.GetY() + 1, iWidth, iHeight ); + } + } + break; + + case 6: { + // Version + dc->DrawText(client->GetClientVerString(), rect.GetX(), rect.GetY()); + break; + } + + case 7: // prio + // We only show priority for sources actually queued for that file + if ( item->GetType() != A4AF_SOURCE && + client->GetDownloadState() == DS_ONQUEUE ) { + if (client->IsRemoteQueueFull()) { + buffer = _("Queue Full"); + dc->DrawText(buffer, rect.GetX(), rect.GetY()); + } else { + if (client->GetRemoteQueueRank()) { + sint16 qrDiff = client->GetRemoteQueueRank() - + client->GetOldRemoteQueueRank(); + if(qrDiff == client->GetRemoteQueueRank() ) { + qrDiff = 0; + } + wxColour savedColour = dc->GetTextForeground(); + if( qrDiff < 0 ) { + dc->SetTextForeground(*wxBLUE); + } + if( qrDiff > 0 ) { + dc->SetTextForeground(*wxRED); + } + //if( qrDiff == 0 ) { + // dc->SetTextForeground(*wxLIGHT_GREY); + //} + buffer = wxString::Format(_("QR: %u (%i)"), + client->GetRemoteQueueRank(), qrDiff); + dc->DrawText(buffer, rect.GetX(), rect.GetY()); + dc->SetTextForeground(savedColour); + } + } + } + break; + + case 8: // status + if (item->GetType() != A4AF_SOURCE) { + buffer = DownloadStateToStr( client->GetDownloadState(), + client->IsRemoteQueueFull() ); + } else { + buffer = _("Asked for another file"); + if ( client->GetRequestFile() && + client->GetRequestFile()->GetFileName().IsOk()) { + buffer += CFormat(wxT(" (%s)")) + % client->GetRequestFile()->GetFileName(); + } + } + dc->DrawText(buffer, rect.GetX(), rect.GetY()); + break; + // Source comes from? + case 9: { + buffer = wxGetTranslation(OriginToText(client->GetSourceFrom())); + dc->DrawText(buffer, rect.GetX(), rect.GetY()); + break; + } + } +} + + +wxString CDownloadListCtrl::GetTTSText(unsigned item) const +{ + CtrlItem_Struct* content = (CtrlItem_Struct*)GetItemData(item); + + if (content->GetType() == FILE_TYPE) { + CPartFile* file = content->GetFile(); + + return file->GetFileName().GetPrintable(); + } + + return wxEmptyString; +} + + +int CDownloadListCtrl::SortProc(wxUIntPtr param1, wxUIntPtr param2, long sortData) +{ + CtrlItem_Struct* item1 = (CtrlItem_Struct*)param1; + CtrlItem_Struct* item2 = (CtrlItem_Struct*)param2; + + int sortMod = (sortData & CMuleListCtrl::SORT_DES) ? -1 : 1; + sortData &= CMuleListCtrl::COLUMN_MASK; + int comp = 0; + + if ( item1->GetType() == FILE_TYPE ) { + if ( item2->GetType() == FILE_TYPE ) { + // Both are files, so we just compare them + comp = Compare( item1->GetFile(), item2->GetFile(), sortData); + } else { + // A file and a source, checking if they belong to each other + if ( item1->GetFile() == item2->GetOwner() ) { + // A file should always be above its sources + // Returning directly to avoid the modifier + return -1; + } else { + // Source belongs to anther file, so we compare the files instead + comp = Compare( item1->GetFile(), item2->GetOwner(), sortData); + } + } + } else { + if ( item2->GetType() == FILE_TYPE ) { + // A source and a file, checking if they belong to each other + if ( item1->GetOwner() == item2->GetFile() ) { + // A source should always be below its file + // Returning directly to avoid the modifier + return 1; + } else { + // Source belongs to anther file, so we compare the files instead + comp = Compare( item1->GetOwner(), item2->GetFile(), sortData); + } + } else { + // Two sources, some different possibilites + if ( item1->GetOwner() == item2->GetOwner() ) { + // Avilable sources first, if we have both an + // available and an unavailable + comp = ( item2->GetType() - item1->GetType() ); + + if (comp) { + // A4AF and non-A4AF. The order is fixed regardless of sort-order. + return comp; + } else { + comp = Compare(item1->GetSource(), item2->GetSource(), sortData); + } + } else { + // Belongs to different files, so we compare the files + comp = Compare( item1->GetOwner(), item2->GetOwner(), sortData); + } + } + } + + // We modify the result so that it matches with ascending or decending + return sortMod * comp; +} + + +int CDownloadListCtrl::Compare( const CPartFile* file1, const CPartFile* file2, long lParamSort) +{ + int result = 0; + + switch (lParamSort) { + // Sort by filename + case 0: + result = CmpAny( + file1->GetFileName(), + file2->GetFileName() ); + break; + + // Sort by size + case 1: + result = CmpAny( + file1->GetFileSize(), + file2->GetFileSize() ); + break; + + // Sort by transferred + case 2: + result = CmpAny( + file1->GetTransferred(), + file2->GetTransferred() ); + break; + + // Sort by completed + case 3: + result = CmpAny( + file1->GetCompletedSize(), + file2->GetCompletedSize() ); + break; + + // Sort by speed + case 4: + result = CmpAny( + file1->GetKBpsDown() * 1024, + file2->GetKBpsDown() * 1024 ); + break; + + // Sort by percentage completed + case 5: + result = CmpAny( + file1->GetPercentCompleted(), + file2->GetPercentCompleted() ); + break; + + // Sort by number of sources + case 6: + result = CmpAny( + file1->GetSourceCount(), + file2->GetSourceCount() ); + break; + + // Sort by priority + case 7: + result = CmpAny( + file1->GetDownPriority(), + file2->GetDownPriority() ); + break; + + // Sort by status + case 8: + result = CmpAny( + file1->getPartfileStatusRang(), + file2->getPartfileStatusRang() ); + break; + + // Sort by remaining time + case 9: + if (file1->getTimeRemaining() == -1) { + if (file2->getTimeRemaining() == -1) { + result = 0; + } else { + result = -1; + } + } else { + if (file2->getTimeRemaining() == -1) { + result = 1; + } else { + result = CmpAny( + file1->getTimeRemaining(), + file2->getTimeRemaining() ); + } + } + break; + + // Sort by last seen complete + case 10: + result = CmpAny( + file1->lastseencomplete, + file2->lastseencomplete ); + break; + + // Sort by last reception + case 11: + result = CmpAny( + file1->GetLastChangeDatetime(), + file2->GetLastChangeDatetime() ); + break; + } + + return result; +} + + +int CDownloadListCtrl::Compare( + const CUpDownClient* client1, const CUpDownClient* client2, long lParamSort) +{ + switch (lParamSort) { + // Sort by name + case 0: + return CmpAny( client1->GetUserName(), client2->GetUserName() ); + + // Sort by status (size field) + case 1: + return CmpAny( client1->GetDownloadState(), client2->GetDownloadState() ); + + // Sort by transferred in the following fields + case 2: + case 3: + return CmpAny( client1->GetTransferredDown(), client2->GetTransferredDown() ); + + // Sort by speed + case 4: + return CmpAny( client1->GetKBpsDown(), client2->GetKBpsDown() ); + + // Sort by parts offered (Progress field) + case 5: + return CmpAny( + client1->GetAvailablePartCount(), + client2->GetAvailablePartCount() ); + + // Sort by client version + case 6: { + if (client1->GetClientSoft() != client2->GetClientSoft()) { + return client1->GetSoftStr().Cmp(client2->GetSoftStr()); + } + + if (client1->GetVersion() != client2->GetVersion()) { + return CmpAny(client1->GetVersion(), client2->GetVersion()); + } + + return client1->GetClientModString().Cmp(client2->GetClientModString()); + } + + // Sort by Queue-Rank + case 7: { + // This will sort by download state: Downloading, OnQueue, Connecting ... + // However, Asked For Another will always be placed last, due to + // sorting in SortProc + if ( client1->GetDownloadState() != client2->GetDownloadState() ) { + return client1->GetDownloadState() - client2->GetDownloadState(); + } + + // Placing items on queue before items on full queues + if ( client1->IsRemoteQueueFull() ) { + if ( client2->IsRemoteQueueFull() ) { + return 0; + } else { + return 1; + } + } else if ( client2->IsRemoteQueueFull() ) { + return -1; + } else { + if ( client1->GetRemoteQueueRank() ) { + if ( client2->GetRemoteQueueRank() ) { + return CmpAny( + client1->GetRemoteQueueRank(), + client2->GetRemoteQueueRank() ); + } else { + return -1; + } + } else { + if ( client2->GetRemoteQueueRank() ) { + return 1; + } else { + return 0; + } + } + } + } + + // Sort by state + case 8: { + if (client1->GetDownloadState() == client2->GetDownloadState()) { + return CmpAny( + client1->IsRemoteQueueFull(), + client2->IsRemoteQueueFull() ); + } else { + return CmpAny( + client1->GetDownloadState(), + client2->GetDownloadState() ); + } + } + + // Source of source ;) + case 9: + return CmpAny(client1->GetSourceFrom(), client2->GetSourceFrom()); + + default: + return 0; + } +} + + +void CDownloadListCtrl::ClearCompleted() +{ + m_completedFiles = false; + CastByID(ID_BTNCLRCOMPL, GetParent(), wxButton)->Enable(false); + + // Search for completed files + for ( ListItems::iterator it = m_ListItems.begin(); it != m_ListItems.end(); ) { + CtrlItem_Struct* item = it->second; ++it; + + if ( item->GetType() == FILE_TYPE ) { + CPartFile* file = item->GetFile(); + + if ( file->IsPartFile() == false ) { + RemoveFile(file); + } + } + } +} + + +void CDownloadListCtrl::ShowFilesCount( int diff ) +{ + m_filecount += diff; + + wxString str = wxString::Format( _("Downloads (%i)"), m_filecount ); + wxStaticText* label = CastByName( wxT("downloadsLabel"), GetParent(), wxStaticText ); + + label->SetLabel( str ); + label->GetParent()->Layout(); +} + + + + +bool CDownloadListCtrl::ShowItemInCurrentCat( + const CPartFile* file, int newsel ) const +{ + return + ((newsel == 0 && !thePrefs::ShowAllNotCats()) || + (newsel == 0 && thePrefs::ShowAllNotCats() && file->GetCategory() == 0)) || + (newsel > 0 && newsel == file->GetCategory()); +} + + + +void CDownloadListCtrl::DrawFileStatusBar( + const CPartFile* file, wxDC* dc, const wxRect& rect, bool bFlat ) const +{ + static CBarShader s_ChunkBar(16); + + COLORREF crHave = ( bFlat ? RGB( 0, 0, 0 ) : RGB( 104, 104, 104 ) ); + COLORREF crPending = ( bFlat ? RGB( 255, 255, 100 ) : RGB( 255, 208, 0 ) ); + COLORREF crProgress = ( bFlat ? RGB( 0, 150, 0 ) : RGB( 0, 224, 0 ) ); + COLORREF crMissing = RGB(255, 0, 0); + + s_ChunkBar.SetHeight(rect.height); + s_ChunkBar.SetWidth(rect.width); + s_ChunkBar.SetFileSize( file->GetFileSize() ); + s_ChunkBar.Fill( crHave ); + s_ChunkBar.Set3dDepth( thePrefs::Get3DDepth() ); + + + if ( file->GetStatus() == PS_COMPLETE || file->GetStatus() == PS_COMPLETING ) { + s_ChunkBar.Fill( crProgress ); + s_ChunkBar.Draw(dc, rect.x, rect.y, bFlat); + return; + } + + + // Part availability ( of missing parts ) + const CPartFile::CGapPtrList& gaplist = file->GetGapList(); + CPartFile::CGapPtrList::const_iterator it = gaplist.begin(); + for (; it != gaplist.end(); ++it) { + Gap_Struct* gap = *it; + + // Start position + uint32 start = ( gap->start / PARTSIZE ); + // End position + uint32 end = ( gap->end / PARTSIZE ) + 1; + + // Avoid going past the filesize. Dunno if this can happen, but the old code did check. + if ( end > file->GetPartCount() ) { + end = file->GetPartCount(); + } + + // Place each gap, one PART at a time + for ( uint64 i = start; i < end; ++i ) { + COLORREF color; + if ( i < file->m_SrcpartFrequency.size() && file->m_SrcpartFrequency[i]) { + int blue = 210 - ( 22 * ( file->m_SrcpartFrequency[i] - 1 ) ); + color = RGB( 0, ( blue < 0 ? 0 : blue ), 255 ); + } else { + color = crMissing; + } + + if ( file->IsStopped() ) { + color = DarkenColour( color, 2 ); + } + + uint64 gap_begin = ( i == start ? gap->start : PARTSIZE * i ); + uint64 gap_end = ( i == end - 1 ? gap->end : PARTSIZE * ( i + 1 ) ); + + s_ChunkBar.FillRange( gap_begin, gap_end, color); + } + } + + + // Pending parts + const CPartFile::CReqBlockPtrList& requestedblocks_list = file->GetRequestedBlockList(); + CPartFile::CReqBlockPtrList::const_iterator it2 = requestedblocks_list.begin(); + for (; it2 != requestedblocks_list.end(); ++it2) { + COLORREF color = ( file->IsStopped() ? DarkenColour( crPending, 2 ) : crPending ); + + s_ChunkBar.FillRange( (*it2)->StartOffset, (*it2)->EndOffset, color ); + } + + + // Draw the progress-bar + s_ChunkBar.Draw( dc, rect.x, rect.y, bFlat ); + + + // Green progressbar width + int width = (int)(( (float)rect.width / (float)file->GetFileSize() ) * + file->GetCompletedSize() ); + + if ( bFlat ) { + dc->SetBrush( wxBrush( crProgress, wxSOLID ) ); + + dc->DrawRectangle( rect.x, rect.y, width, 3 ); + } else { + // Draw the two black lines for 3d-effect + dc->SetPen( wxPen( wxColour( 0, 0, 0 ), 1, wxSOLID ) ); + dc->DrawLine( rect.x, rect.y + 0, rect.x + width, rect.y + 0 ); + dc->DrawLine( rect.x, rect.y + 2, rect.x + width, rect.y + 2 ); + + // Draw the green line + dc->SetPen( wxPen( crProgress, 1, wxSOLID ) ); + dc->DrawLine( rect.x, rect.y + 1, rect.x + width, rect.y + 1 ); + } +} + + +void CDownloadListCtrl::DrawSourceStatusBar( + const CUpDownClient* source, wxDC* dc, const wxRect& rect, bool bFlat) const +{ + static CBarShader s_StatusBar(16); + + uint32 crBoth = ( bFlat ? RGB( 0, 150, 0 ) : RGB( 0, 192, 0 ) ); + uint32 crNeither = ( bFlat ? RGB( 224, 224, 224 ) : RGB( 240, 240, 240 ) ); + uint32 crClientOnly = ( bFlat ? RGB( 0, 0, 0 ) : RGB( 104, 104, 104 ) ); + uint32 crPending = ( bFlat ? RGB( 255, 208, 0 ) : RGB( 255, 208, 0 ) ); + uint32 crNextPending = ( bFlat ? RGB( 255, 255, 100 ) : RGB( 255, 255, 100 ) ); + + CPartFile* reqfile = source->GetRequestFile(); + + s_StatusBar.SetFileSize( reqfile->GetFileSize() ); + s_StatusBar.SetHeight(rect.height); + s_StatusBar.SetWidth(rect.width); + s_StatusBar.Fill(crNeither); + s_StatusBar.Set3dDepth( thePrefs::Get3DDepth() ); + + // Barry - was only showing one part from client, even when reserved bits from 2 parts + wxString gettingParts = source->ShowDownloadingParts(); + + const BitVector& partStatus = source->GetPartStatus(); + + for ( uint64 i = 0; i < partStatus.size(); i++ ) { + if ( partStatus[i]) { + uint64 uEnd; + if (PARTSIZE*(i+1u) > reqfile->GetFileSize()) { + uEnd = reqfile->GetFileSize(); + } else { + uEnd = PARTSIZE*(i+1u); + } + + uint32 color = 0; + if ( reqfile->IsComplete(PARTSIZE*i,PARTSIZE*(i+1)-1)) { + color = crBoth; + } else if ( source->GetDownloadState() == DS_DOWNLOADING && + source->GetLastBlockOffset() < uEnd && + source->GetLastBlockOffset() >= PARTSIZE*i) { + color = crPending; + } else if (gettingParts.GetChar((uint16)i) == 'Y') { + color = crNextPending; + } else { + color = crClientOnly; + } + + if ( source->GetRequestFile()->IsStopped() ) { + color = DarkenColour( color, 2 ); + } + + s_StatusBar.FillRange( PARTSIZE*i, uEnd, color ); + } + } + + s_StatusBar.Draw(dc, rect.x, rect.y, bFlat); +} + +#ifdef __WXMSW__ +# define QUOTE wxT("\"") +#else +# define QUOTE wxT("\'") +#endif + +void CDownloadListCtrl::PreviewFile(CPartFile* file) +{ + wxString command; + // If no player set in preferences, use mplayer. + // And please, do a warning also :P + if (thePrefs::GetVideoPlayer().IsEmpty()) { + wxMessageBox(_( + "Please set your preferred video player on preferences.\n" + "Meanwhile, aMule will attempt to use mplayer and you will get this warning on every preview"), + _("File preview"), wxOK, this); + // Since newer versions for some reason mplayer does not automatically + // select video output device and needs a parameter, go figure... + command = wxT("xterm -T \"aMule Preview\" -iconic -e mplayer ") QUOTE wxT("$file") QUOTE; + } else { + command = thePrefs::GetVideoPlayer(); + } + + // Check if we are (pre)viewing a completed file or not + if (file->GetStatus() != PS_COMPLETE) { + // Remove the .met and see if out video player specifiation uses the magic string + wxString fileWithoutMet = thePrefs::GetTempDir().JoinPaths( + file->GetPartMetFileName().RemoveExt()).GetRaw(); + if (!command.Replace(wxT("$file"), fileWithoutMet)) { + // No magic string, so we just append the filename to the player command + // Need to use quotes in case filename contains spaces + command << wxT(" ") << QUOTE << fileWithoutMet << QUOTE; + } + } else { + // This is a complete file + // FIXME: This is probably not going to work if the filenames are mangled ... + wxString rawFileName = file->GetFullName().GetRaw(); + if (!command.Replace(wxT("$file"), rawFileName)) { + // No magic string, so we just append the filename to the player command + // Need to use quotes in case filename contains spaces + command << wxT(" ") << QUOTE << rawFileName << QUOTE; + } + } + + // We can't use wxShell here, it blocks the app + CTerminationProcess *p = new CTerminationProcess(command); + int ret = wxExecute(command, wxEXEC_ASYNC, p); + bool ok = ret > 0; + if (!ok) { + delete p; + AddLogLineM( true, + CFormat( _("ERROR: Failed to execute external media-player! Command: `%s'") ) % + command ); + } +} +// File_checked_for_headers diff --git a/src/DownloadListCtrl.h b/src/DownloadListCtrl.h new file mode 100644 index 00000000..3ca9f1e5 --- /dev/null +++ b/src/DownloadListCtrl.h @@ -0,0 +1,297 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef DOWNLOADLISTCTRL_H +#define DOWNLOADLISTCTRL_H + +#include // Needed for std::multimap + +#include "Types.h" // Needed for uint8 +#include "Constants.h" // Needed for DownloadItemType +#include "MuleListCtrl.h" // Needed for CMuleListCtrl + + +class CPartFile; +class CUpDownClient; +class wxBitmap; +class wxRect; +class wxDC; + +struct CtrlItem_Struct; + + + +/** + * This class is responsible for representing the download queue. + * + * The CDownlodListCtrl class is responsible for drawing not only files being + * downloaded, but also sources assosiated with these. It is in many ways + * primary widget within the application, since it is here that users can + * inspect and manipulate their current downloads. + * + * Due to the fact that sources are one of the major sources of update-class, + * this class has been designed such that it does not need to recieve these + * unless sources in question are actually being displayed. Upon the initial + * showing of sources (when a file is expanded), a current list of that file's + * sources are requested. If the sources are hidden again, the class will + * discard all knowledge of their existance. + */ +class CDownloadListCtrl : public CMuleListCtrl +{ +public: + /** + * Constructor. + * + * @see CMuleListCtrl::CMuleListCtrl for documentation of parameters. + */ + CDownloadListCtrl( + wxWindow *parent, + wxWindowID winid = -1, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxLC_ICON, + const wxValidator& validator = wxDefaultValidator, + const wxString &name = wxT("downloadlistctrl") ); + + /** + * Destructor. + */ + virtual ~CDownloadListCtrl(); + + + /** + * Adds a file to the list, but it wont show unless it matches the current category. + * + * @param A valid pointer to a new partfile. + * + * Please note that duplicates wont be added. + */ + void AddFile( CPartFile* file ); + + /** + * Adds a source belonging to the specified partfile. + * + * @param owner The owner of this specific source-entry, must be a valid pointer. + * @param source The client object to be added, must be a valid pointer. + * @param available If the source is a current source, or a A4AF source. + * + * Please note that the specified client will only be added to the list if it's + * owner is shown and has ShowSources set to true, otherwise the source will + * simply be ignored. Duplicates wont be added. + */ + void AddSource( CPartFile* owner, CUpDownClient* source, DownloadItemType type ); + + + /** + * Removes a source from the list. + * + * @param source A pointer to the source to be removed. + * @param owner Either a specific file, or NULL to remove the source from all files. + */ + void RemoveSource( const CUpDownClient* source, const CPartFile* owner ); + + /** + * Removes the specified file from the list. + * + * @param file A valid pointer of the file to be removed. + * + * This function also removes any sources assosiated with the file. + */ + void RemoveFile( CPartFile* file ); + + + /** + * Toggles showing of a file's sources on or off. + * + * @param file The file whoose sources should be shown/hidden. + * @param show Whenever or not to show sources. + */ + void ShowSources( CPartFile* file, bool show ); + + /** + * Shows or hides the sources of a specific file. + * + * @param file A valid pointer to the file to be shown/hidden. + * @param show Whenever or not to show the file. + * + * If the file is hidden, then its sources will also be hidden. + */ + void ShowFile( CPartFile* file, bool show ); + + + /** + * Updates the state of the specified item, possibly causing a redrawing. + * + * @param toupdate The source or file to be updated. + * + * Calling this function with a file as the argument will ensure that the + * file is hidden/shown depending on its state and the currently selected + * category. + */ + void UpdateItem(const void* toupdate); + + + /** + * Returns the current category. + */ + uint8 GetCategory() const; + + /** + * Changes the displayed category and updates the list of shown files. + * + * @param newCategory The new category to display. + */ + void ChangeCategory( int newCategory ); + + + /** + * Clears all completed files from the list. + */ + void ClearCompleted(); + +private: + /** + * Updates the displayed number representing the ammount of files currently shown. + */ + void ShowFilesCount( int diff ); + + + /** + * @see CMuleListCtrl::GetTTSText + */ + virtual wxString GetTTSText(unsigned item) const; + + + /** + * Overloaded function needed for custom drawing of items. + */ + virtual void OnDrawItem( int item, wxDC* dc, const wxRect& rect, const wxRect& rectHL, bool highlighted ); + + /** + * Draws a file item. + */ + void DrawFileItem( wxDC* dc, int nColumn, const wxRect& rect, CtrlItem_Struct* item ) const; + + /** + * Draws a source item. + */ + void DrawSourceItem( wxDC* dc, int nColumn, const wxRect& rect, CtrlItem_Struct* item ) const; + + /** + * Draws the status (chunk) bar for a file. + */ + void DrawFileStatusBar( const CPartFile* file, wxDC* dc, const wxRect& rect, bool bFlat ) const; + + /** + * Draws the status (chunk) bar for a source. + */ + void DrawSourceStatusBar( const CUpDownClient* source, wxDC* dc, const wxRect& rect, bool bFlat) const; + + + static int wxCALLBACK SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData); + static int Compare( const CPartFile* file1, const CPartFile* file2, long lParamSort ); + static int Compare( const CUpDownClient* client1, const CUpDownClient* client2, long lParamSort); + + + // Event-handlers for files + void OnCancelFile( wxCommandEvent& event ); + void OnSetPriority( wxCommandEvent& event ); + void OnSwapSources( wxCommandEvent& event ); + void OnSetCategory( wxCommandEvent& event ); + void OnSetStatus( wxCommandEvent& event ); + void OnClearCompleted( wxCommandEvent& event ); + void OnGetLink( wxCommandEvent& event ); + void OnGetFeedback( wxCommandEvent& event ); + void OnGetRazorStats( wxCommandEvent& event ); + void OnViewFileInfo( wxCommandEvent& event ); + void OnViewFileComments( wxCommandEvent& event ); + void OnPreviewFile( wxCommandEvent& event ); + + // Event-handlers for sources + void OnSwapSource( wxCommandEvent& event ); + void OnViewFiles( wxCommandEvent& event ); + void OnAddFriend( wxCommandEvent& event ); + void OnSendMessage( wxCommandEvent& event ); + void OnViewClientInfo( wxCommandEvent& event ); + + // Misc event-handlers + void OnItemActivated( wxListEvent& event ); + void OnMouseRightClick( wxListEvent& event ); + void OnMouseMiddleClick( wxListEvent& event ); + void OnKeyPressed( wxKeyEvent& event ); + + + /** + * Returns true if the given file should be shown in the specified category. + * + * @param file The file to be examined. + * @param newel The new category selection. + * @return True if the file should be shown, false otherwise. + */ + bool ShowItemInCurrentCat( const CPartFile* file, int newsel ) const; + + /** + * Executes the user-selected preview command on the specified file. + * + * @file The file to be previewed. + */ + void PreviewFile(CPartFile* file); + + + //! The type of list used to store items on the listctrl. + typedef std::multimap ListItems; + //! Shortcut to the pair-type used on the list. + typedef ListItems::value_type ListItemsPair; + //! This pair is used when searching for equal-ranges. + typedef std::pair< ListItems::iterator, ListItems::iterator > ListIteratorPair; + + //! This list contains everything shown on the list. Sources are only to + //! be found on this list if they are being displayed, whereas files can + //! always be found on this list, even if they are currently hidden. + ListItems m_ListItems; + + + //! Pointer to the current menu object, used to avoid multiple menus. + wxMenu* m_menu; + //! Pointer to a cached brush object. + wxBrush* m_hilightBrush; + //! Pointer to a cached brush object. + wxBrush* m_hilightUnfocusBrush; + + + //! The currently displayed category + uint8 m_category; + + //! True if there are any completed files being displayed. + bool m_completedFiles; + + //! The number of displayed files + int m_filecount; + + DECLARE_EVENT_TABLE() +}; + +#endif +// File_checked_for_headers diff --git a/src/DownloadQueue.cpp b/src/DownloadQueue.cpp new file mode 100644 index 00000000..518570c9 --- /dev/null +++ b/src/DownloadQueue.cpp @@ -0,0 +1,1536 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "DownloadQueue.h" // Interface declarations + +#include +#include +#include +#include +#include + +#include // Needed for wxTextFile +#include + +#include "Server.h" // Needed for CServer +#include "Packet.h" // Needed for CPacket +#include "MemFile.h" // Needed for CMemFile +#include "ClientList.h" // Needed for CClientList +#include "updownclient.h" // Needed for CUpDownClient +#include "ServerList.h" // Needed for CServerList +#include "ServerConnect.h" // Needed for CServerConnect +#include "ED2KLink.h" // Needed for CED2KFileLink +#include "SearchList.h" // Needed for CSearchFile +#include "SharedFileList.h" // Needed for CSharedFileList +#include "PartFile.h" // Needed for CPartFile +#include "Preferences.h" // Needed for thePrefs +#include "amule.h" // Needed for theApp +#include "AsyncDNS.h" // Needed for CAsyncDNS +#include "Statistics.h" // Needed for theStats +#include "Logger.h" +#include // Needed for CFormat +#include "IPFilter.h" +#include // Needed for CDirIterator +#include "FileLock.h" // Needed for CFileLock +#include "GuiEvents.h" // Needed for Notify_* +#include "UserEvents.h" +#include "MagnetURI.h" // Needed for CMagnetED2KConverter +#include "ScopedPtr.h" // Needed for CScopedPtr + +#include "kademlia/kademlia/Kademlia.h" + +#include // Do_not_auto_remove (mingw-gcc-3.4.5) + + +// Max. file IDs per UDP packet +// ---------------------------- +// 576 - 30 bytes of header (28 for UDP, 2 for "E3 9A" edonkey proto) = 546 bytes +// 546 / 16 = 34 + + +#define MAX_FILES_PER_UDP_PACKET 31 // 2+16*31 = 498 ... is still less than 512 bytes!! +#define MAX_REQUESTS_PER_SERVER 35 + + +CDownloadQueue::CDownloadQueue() +// Needs to be recursive that that is can own an observer assigned to itself + : m_mutex( wxMUTEX_RECURSIVE ) +{ + m_datarate = 0; + m_udpserver = 0; + m_lastsorttime = 0; + m_lastudpsearchtime = 0; + m_lastudpstattime = 0; + m_udcounter = 0; + m_nLastED2KLinkCheck = 0; + m_dwNextTCPSrcReq = 0; + m_cRequestsSentToServer = 0; + m_lastDiskCheck = 0; + SetLastKademliaFileRequest(); +} + + +CDownloadQueue::~CDownloadQueue() +{ + if ( !m_filelist.empty() ) { + for ( unsigned int i = 0; i < m_filelist.size(); i++ ) { + printf("\rSaving PartFile %u of %u", i + 1, (unsigned int)m_filelist.size()); + fflush(stdout); + delete m_filelist[i]; + } + printf("\nAll PartFiles Saved.\n"); + } +} + + +void CDownloadQueue::LoadMetFiles(const CPath& path) +{ + printf("Loading temp files from %s.\n", + (const char *)unicode2char(path.GetPrintable())); + + std::vector files; + + // Locate part-files to be loaded + CDirIterator TempDir(path); + CPath fileName = TempDir.GetFirstFile(CDirIterator::File, wxT("*.part.met")); + while (fileName.IsOk()) { + files.push_back(path.JoinPaths(fileName)); + + fileName = TempDir.GetNextFile(); + } + + // Loading in order makes it easier to figure which + // file is broken in case of crashes, or the like. + std::sort(files.begin(), files.end()); + + // Load part-files + for ( size_t i = 0; i < files.size(); i++ ) { + printf("\rLoading PartFile %u of %u", (unsigned int)(i + 1), (unsigned int)files.size()); + + fileName = files[i].GetFullName(); + + CPartFile* toadd = new CPartFile(); + bool result = toadd->LoadPartFile(path, fileName); + if (!result) { + // Try from backup + result = toadd->LoadPartFile(path, fileName, true); + } + + if (result && !IsFileExisting(toadd->GetFileHash())) { + { + wxMutexLocker lock(m_mutex); + m_filelist.push_back(toadd); + } + + NotifyObservers( EventType( EventType::INSERTED, toadd ) ); + Notify_DownloadCtrlAddFile(toadd); + } else { + delete toadd; + + wxString msg; + if (result) { + msg << CFormat(wxT("WARNING: Duplicate partfile with hash '%s' found, skipping: %s")) + % toadd->GetFileHash().Encode() % fileName; + } else { + // If result is false, then reading of both the primary and the backup .met failed + AddLogLineM(false, + _("Error: Failed to load backup file. Search http://forum.amule.org for .part.met recovery solutions.")); + msg << CFormat(wxT("ERROR: Failed to load PartFile '%s'")) % fileName; + } + + AddDebugLogLineM(true, logPartFile, msg); + + // Newline so that the error stays visible. + printf(": %s\n", (const char*)unicode2char(msg)); + } + } + + printf("\nAll PartFiles Loaded.\n"); + + if ( GetFileCount() == 0 ) { + AddLogLineM(false, _("No part files found")); + } else { + AddLogLineM(false, wxString::Format(wxPLURAL("Found %u part file", "Found %u part files", GetFileCount()), GetFileCount()) ); + + DoSortByPriority(); + CheckDiskspace( path ); + } +} + + +uint16 CDownloadQueue::GetFileCount() const +{ + wxMutexLocker lock( m_mutex ); + + return m_filelist.size(); +} + + +CServer* CDownloadQueue::GetUDPServer() const +{ + wxMutexLocker lock( m_mutex ); + + return m_udpserver; +} + + +void CDownloadQueue::SetUDPServer( CServer* server ) +{ + wxMutexLocker lock( m_mutex ); + + m_udpserver = server; +} + + +void CDownloadQueue::SaveSourceSeeds() +{ + for ( uint16 i = 0; i < GetFileCount(); i++ ) { + GetFileByIndex( i )->SaveSourceSeeds(); + } +} + + +void CDownloadQueue::LoadSourceSeeds() +{ + for ( uint16 i = 0; i < GetFileCount(); i++ ) { + GetFileByIndex( i )->LoadSourceSeeds(); + } +} + +//#warning We must add the sources, review CSearchFile constructor. +void CDownloadQueue::AddSearchToDownload(CSearchFile* toadd, uint8 category) +{ + if ( IsFileExisting(toadd->GetFileHash()) ) { + return; + } + + + CPartFile* newfile = NULL; + try { + newfile = new CPartFile(toadd); + } catch (const CInvalidPacket& e) { + AddDebugLogLineM(true, logDownloadQueue, wxT("Search-result contained invalid tags, could not add")); + } + + if ( newfile && newfile->GetStatus() != PS_ERROR ) { + AddDownload( newfile, thePrefs::AddNewFilesPaused(), category ); + } else { + delete newfile; + } +} + + +struct SFindBestPF +{ + void operator()(CPartFile* file) { + // Check if we should filter out other categories + if ((m_category != -1) && (file->GetCategory() != m_category)) { + return; + } else if (file->GetStatus() != PS_PAUSED) { + return; + } + + if (!m_result || (file->GetDownPriority() > m_result->GetDownPriority())) { + m_result = file; + } + } + + //! The category to look for, or -1 if any category is good + int m_category; + //! If any acceptable files are found, this variable store their pointer + CPartFile* m_result; +}; + + +void CDownloadQueue::StartNextFile(CPartFile* oldfile) +{ + if ( thePrefs::StartNextFile() ) { + SFindBestPF visitor = { -1, NULL }; + + { + wxMutexLocker lock(m_mutex); + + if (thePrefs::StartNextFileSame()) { + // Get a download in the same category + visitor.m_category = oldfile->GetCategory(); + + visitor = std::for_each(m_filelist.begin(), m_filelist.end(), visitor); + } + + if (visitor.m_result == NULL) { + // Get a download, regardless of category + visitor.m_category = -1; + + visitor = std::for_each(m_filelist.begin(), m_filelist.end(), visitor); + } + } + + if (visitor.m_result) { + visitor.m_result->ResumeFile(); + } + } +} + + +void CDownloadQueue::AddDownload(CPartFile* file, bool paused, uint8 category) +{ + wxCHECK_RET(!IsFileExisting(file->GetFileHash()), wxT("Adding duplicate part-file")); + + if ( paused && GetFileCount() ) { + file->StopFile(); + } + + { + wxMutexLocker lock(m_mutex); + m_filelist.push_back( file ); + DoSortByPriority(); + } + + NotifyObservers( EventType( EventType::INSERTED, file ) ); + + file->SetCategory(category); + Notify_DownloadCtrlAddFile( file ); + AddLogLineM(true, CFormat(_("Downloading %s")) % file->GetFileName() ); +} + + +bool CDownloadQueue::IsFileExisting( const CMD4Hash& fileid ) const +{ + if (CKnownFile* file = theApp->sharedfiles->GetFileByID(fileid)) { + if (file->IsPartFile()) { + AddLogLineM(true, CFormat( _("You are already trying to download the file '%s'") ) % file->GetFileName()); + } else { + // Check if the file exists, since otherwise the user is forced to + // manually reload the shares to download a file again. + CPath fullpath = file->GetFilePath().JoinPaths(file->GetFileName()); + if (!fullpath.FileExists()) { + // The file is no longer available, unshare it + theApp->sharedfiles->RemoveFile(file); + + return false; + } + + AddLogLineM(true, CFormat( _("You already have the file '%s'") ) % file->GetFileName()); + } + + return true; + } else if ((file = GetFileByID(fileid))) { + AddLogLineM(true, CFormat( _("You are already trying to download the file %s") ) % file->GetFileName()); + return true; + } + + return false; +} + + +void CDownloadQueue::Process() +{ + // send src requests to local server + ProcessLocalRequests(); + + { + wxMutexLocker lock(m_mutex); + + uint32 downspeed = 0; + if (thePrefs::GetMaxDownload() != UNLIMITED && m_datarate > 1500) { + downspeed = (((uint32)thePrefs::GetMaxDownload())*1024*100)/(m_datarate+1); + if (downspeed < 50) { + downspeed = 50; + } else if (downspeed > 200) { + downspeed = 200; + } + } + + m_datarate = 0; + m_udcounter++; + uint32 cur_datarate = 0; + uint32 cur_udcounter = m_udcounter; + + for ( uint16 i = 0; i < m_filelist.size(); i++ ) { + CPartFile* file = m_filelist[i]; + + CMutexUnlocker unlocker(m_mutex); + + if ( file->GetStatus() == PS_READY || file->GetStatus() == PS_EMPTY ){ + cur_datarate += file->Process( downspeed, cur_udcounter ); + } else { + //This will make sure we don't keep old sources to paused and stoped files.. + file->StopPausedFile(); + } + } + + m_datarate += cur_datarate; + + + if (m_udcounter == 5) { + if (theApp->serverconnect->IsUDPSocketAvailable()) { + if( (::GetTickCount() - m_lastudpstattime) > UDPSERVERSTATTIME) { + m_lastudpstattime = ::GetTickCount(); + + CMutexUnlocker unlocker(m_mutex); + theApp->serverlist->ServerStats(); + } + } + } + + if (m_udcounter == 10) { + m_udcounter = 0; + if (theApp->serverconnect->IsUDPSocketAvailable()) { + if ( (::GetTickCount() - m_lastudpsearchtime) > UDPSERVERREASKTIME) { + SendNextUDPPacket(); + } + } + } + + if ( (::GetTickCount() - m_lastsorttime) > 10000 ) { + + + DoSortByPriority(); + } + // Check if any paused files can be resumed + + CheckDiskspace(thePrefs::GetTempDir()); + } + + + // Check for new links once per second. + if ((::GetTickCount() - m_nLastED2KLinkCheck) >= 1000) { + AddLinksFromFile(); + m_nLastED2KLinkCheck = ::GetTickCount(); + } +} + + +CPartFile* CDownloadQueue::GetFileByID(const CMD4Hash& filehash) const +{ + wxMutexLocker lock( m_mutex ); + + for ( uint16 i = 0; i < m_filelist.size(); ++i ) { + if ( filehash == m_filelist[i]->GetFileHash()) { + return m_filelist[ i ]; + } + } + + return NULL; +} + + +CPartFile* CDownloadQueue::GetFileByIndex(unsigned int index) const +{ + wxMutexLocker lock( m_mutex ); + + if ( index < m_filelist.size() ) { + return m_filelist[ index ]; + } + + wxASSERT( false ); + return NULL; +} + + +bool CDownloadQueue::IsPartFile(const CKnownFile* file) const +{ + wxMutexLocker lock(m_mutex); + + for (uint16 i = 0; i < m_filelist.size(); ++i) { + if (file == m_filelist[i]) { + return true; + } + } + + return false; +} + + +void CDownloadQueue::OnConnectionState(bool bConnected) +{ + wxMutexLocker lock(m_mutex); + + for (uint16 i = 0; i < m_filelist.size(); ++i) { + if ( m_filelist[i]->GetStatus() == PS_READY || + m_filelist[i]->GetStatus() == PS_EMPTY) { + m_filelist[i]->SetActive(bConnected); + } + } +} + + +void CDownloadQueue::CheckAndAddSource(CPartFile* sender, CUpDownClient* source) +{ + // if we block loopbacks at this point it should prevent us from connecting to ourself + if ( source->HasValidHash() ) { + if ( source->GetUserHash() == thePrefs::GetUserHash() ) { + AddDebugLogLineM( false, logDownloadQueue, wxT("Tried to add source with matching hash to your own.") ); + source->Safe_Delete(); + return; + } + } + + if (sender->IsStopped()) { + source->Safe_Delete(); + return; + } + + // Filter sources which are known to be dead/useless + if ( theApp->clientlist->IsDeadSource( source ) || sender->IsDeadSource(source) ) { + source->Safe_Delete(); + return; + } + + // Filter sources which are incompatible with our encryption setting (one requires it, and the other one doesn't supports it) + if ( (source->RequiresCryptLayer() && (!thePrefs::IsClientCryptLayerSupported() || !source->HasValidHash())) || (thePrefs::IsClientCryptLayerRequired() && (!source->SupportsCryptLayer() || !source->HasValidHash()))) { + source->Safe_Delete(); + return; + } + + // Find all clients with the same hash + if ( source->HasValidHash() ) { + CClientList::SourceList found = theApp->clientlist->GetClientsByHash( source->GetUserHash() ); + + CClientList::SourceList::iterator it = found.begin(); + for ( ; it != found.end(); it++ ) { + CKnownFile* file = (*it)->GetRequestFile(); + + // Only check files on the download-queue + if ( file ) { + // Is the found source queued for something else? + if ( file != sender ) { + // Try to add a request for the other file + if ( (*it)->AddRequestForAnotherFile(sender)) { + // Add it to downloadlistctrl + Notify_DownloadCtrlAddSource(sender, *it, A4AF_SOURCE); + } + } + + source->Safe_Delete(); + return; + } + } + } + + + + // Our new source is real new but maybe it is already uploading to us? + // If yes the known client will be attached to the var "source" and the old + // source-client will be deleted. However, if the request file of the known + // source is NULL, then we have to treat it almost like a new source and if + // it isn't NULL and not "sender", then we shouldn't move it, but rather add + // a request for the new file. + ESourceFrom nSourceFrom = source->GetSourceFrom(); + if ( theApp->clientlist->AttachToAlreadyKnown(&source, 0) ) { + // Already queued for another file? + if ( source->GetRequestFile() ) { + // If we're already queued for the right file, then there's nothing to do + if ( sender != source->GetRequestFile() ) { + // Add the new file to the request list + source->AddRequestForAnotherFile( sender ); + } + } else { + // Source was known, but reqfile NULL. + source->SetRequestFile( sender ); + if (source->GetSourceFrom() != nSourceFrom) { + if (source->GetSourceFrom() != SF_NONE) { + theStats::RemoveSourceOrigin(source->GetSourceFrom()); + theStats::RemoveFoundSource(); + } + source->SetSourceFrom(nSourceFrom); + } + sender->AddSource( source ); + if ( source->GetFileRating() || !source->GetFileComment().IsEmpty() ) { + sender->UpdateFileRatingCommentAvail(); + } + + Notify_DownloadCtrlAddSource(sender, source, UNAVAILABLE_SOURCE); + } + } else { + // Unknown client, add it to the clients list + source->SetRequestFile( sender ); + + theApp->clientlist->AddClient(source); + + sender->AddSource( source ); + if ( source->GetFileRating() || !source->GetFileComment().IsEmpty() ) { + sender->UpdateFileRatingCommentAvail(); + } + + Notify_DownloadCtrlAddSource(sender, source, UNAVAILABLE_SOURCE); + } +} + + +void CDownloadQueue::CheckAndAddKnownSource(CPartFile* sender,CUpDownClient* source) +{ + // Kad reviewed + + if (sender->IsStopped()) { + return; + } + + // Filter sources which are known to be dead/useless + if ( sender->IsDeadSource(source) ) { + return; + } + + // "Filter LAN IPs" -- this may be needed here in case we are connected to the internet and are also connected + // to a LAN and some client from within the LAN connected to us. Though this situation may be supported in future + // by adding that client to the source list and filtering that client's LAN IP when sending sources to + // a client within the internet. + // + // "IPfilter" is not needed here, because that "known" client was already IPfiltered when receiving OP_HELLO. + if (!source->HasLowID()) { + uint32 nClientIP = wxUINT32_SWAP_ALWAYS(source->GetUserIDHybrid()); + if (!IsGoodIP(nClientIP, thePrefs::FilterLanIPs())) { // check for 0-IP, localhost and LAN addresses + AddDebugLogLineM(false, logIPFilter, wxT("Ignored already known source with IP=%s") + Uint32toStringIP(nClientIP)); + return; + } + } + + // Filter sources which are incompatible with our encryption setting (one requires it, and the other one doesn't supports it) + if ( (source->RequiresCryptLayer() && (!thePrefs::IsClientCryptLayerSupported() || !source->HasValidHash())) || (thePrefs::IsClientCryptLayerRequired() && (!source->SupportsCryptLayer() || !source->HasValidHash()))) + { + source->Safe_Delete(); + return; + } + + CPartFile* file = source->GetRequestFile(); + + // Check if the file is already queued for something else + if ( file ) { + if ( file != sender ) { + if ( source->AddRequestForAnotherFile( sender ) ) { + Notify_DownloadCtrlAddSource( sender, source, A4AF_SOURCE ); + } + } + } else { + source->SetRequestFile( sender ); + + if ( source->GetFileRating() || !source->GetFileComment().IsEmpty() ) { + sender->UpdateFileRatingCommentAvail(); + } + + source->SetSourceFrom(SF_PASSIVE); + sender->AddSource( source ); + Notify_DownloadCtrlAddSource( sender, source, UNAVAILABLE_SOURCE); + } +} + + +bool CDownloadQueue::RemoveSource(CUpDownClient* toremove, bool WXUNUSED(updatewindow), bool bDoStatsUpdate) +{ + bool removed = false; + toremove->DeleteAllFileRequests(); + + for ( uint16 i = 0; i < GetFileCount(); i++ ) { + CPartFile* cur_file = GetFileByIndex( i ); + + // Remove from source-list + if ( cur_file->DelSource( toremove ) ) { + cur_file->RemoveDownloadingSource(toremove); + removed = true; + if ( bDoStatsUpdate ) { + cur_file->UpdatePartsInfo(); + } + } + + // Remove from A4AF-list + cur_file->RemoveA4AFSource( toremove ); + } + + + if ( !toremove->GetFileComment().IsEmpty() || toremove->GetFileRating()>0) { + toremove->GetRequestFile()->UpdateFileRatingCommentAvail(); + } + + toremove->SetRequestFile( NULL ); + toremove->SetDownloadState(DS_NONE); + + // Remove from downloadlist widget + Notify_DownloadCtrlRemoveSource(toremove, (CPartFile*)NULL); + toremove->ResetFileStatusInfo(); + + return removed; +} + + +void CDownloadQueue::RemoveFile(CPartFile* file) +{ + RemoveLocalServerRequest( file ); + + NotifyObservers( EventType( EventType::REMOVED, file ) ); + + wxMutexLocker lock( m_mutex ); + + EraseValue( m_filelist, file ); +} + + +CUpDownClient* CDownloadQueue::GetDownloadClientByIP_UDP(uint32 dwIP, uint16 nUDPPort) const +{ + wxMutexLocker lock( m_mutex ); + + for ( unsigned int i = 0; i < m_filelist.size(); i++ ) { + const CPartFile::SourceSet& set = m_filelist[i]->GetSourceList(); + + for ( CPartFile::SourceSet::const_iterator it = set.begin(); it != set.end(); it++ ) { + if ( (*it)->GetIP() == dwIP && (*it)->GetUDPPort() == nUDPPort ) { + return *it; + } + } + } + return NULL; +} + + +/** + * Checks if the specified server is the one we are connected to. + */ +bool IsConnectedServer(const CServer* server) +{ + if (server && theApp->serverconnect->GetCurrentServer()) { + wxString srvAddr = theApp->serverconnect->GetCurrentServer()->GetAddress(); + uint16 srvPort = theApp->serverconnect->GetCurrentServer()->GetPort(); + + return server->GetAddress() == srvAddr && server->GetPort() == srvPort; + } + + return false; +} + + +bool CDownloadQueue::SendNextUDPPacket() +{ + if ( m_filelist.empty() || !theApp->serverconnect->IsUDPSocketAvailable() || !theApp->IsConnectedED2K()) { + return false; + } + + // Start monitoring the server and the files list + if ( !m_queueServers.IsActive() ) { + AddObserver( &m_queueFiles ); + + theApp->serverlist->AddObserver( &m_queueServers ); + } + + + bool packetSent = false; + while ( !packetSent ) { + // Get max files ids per packet for current server + int filesAllowed = GetMaxFilesPerUDPServerPacket(); + + if (filesAllowed < 1 || !m_udpserver || IsConnectedServer(m_udpserver)) { + // Select the next server to ask, must not be the connected server + do { + m_udpserver = m_queueServers.GetNext(); + } while (IsConnectedServer(m_udpserver)); + + m_cRequestsSentToServer = 0; + filesAllowed = GetMaxFilesPerUDPServerPacket(); + } + + + // Check if we have asked all servers, in which case we are done + if (m_udpserver == NULL) { + DoStopUDPRequests(); + + return false; + } + + // Memoryfile containing the hash of every file to request + // 28bytes allocation because 16b + 4b + 8b is the worse case scenario. + CMemFile hashlist( 28 ); + + CPartFile* file = m_queueFiles.GetNext(); + + while ( file && filesAllowed ) { + uint8 status = file->GetStatus(); + + if ( ( status == PS_READY || status == PS_EMPTY ) && file->GetSourceCount() < thePrefs::GetMaxSourcePerFileUDP() ) { + if (file->IsLargeFile() && !m_udpserver->SupportsLargeFilesUDP()) { + AddDebugLogLineM(false, logDownloadQueue, wxT("UDP Request for sources on a large file ignored: server doesn't support it")); + } else { + ++m_cRequestsSentToServer; + hashlist.WriteHash( file->GetFileHash() ); + // See the notes on TCP packet + if ( m_udpserver->GetUDPFlags() & SRV_UDPFLG_EXT_GETSOURCES2 ) { + if (file->IsLargeFile()) { + wxASSERT(m_udpserver->SupportsLargeFilesUDP()); + hashlist.WriteUInt32( 0 ); + hashlist.WriteUInt64( file->GetFileSize() ); + } else { + hashlist.WriteUInt32( file->GetFileSize() ); + } + } + --filesAllowed; + } + } + + // Avoid skipping a file if we can't send any more currently + if ( filesAllowed ) { + file = m_queueFiles.GetNext(); + } + } + + // See if we have anything to send + if ( hashlist.GetLength() ) { + packetSent = SendGlobGetSourcesUDPPacket(hashlist); + } + + // Check if we've covered every file + if ( file == NULL ) { + // Reset the list of asked files so that the loop will start over + m_queueFiles.Reset(); + + // Unset the server so that the next server will be used + m_udpserver = NULL; + } + } + + return true; +} + + +void CDownloadQueue::StopUDPRequests() +{ + wxMutexLocker lock( m_mutex ); + + DoStopUDPRequests(); +} + + +void CDownloadQueue::DoStopUDPRequests() +{ + // No need to observe when we wont be using the results + theApp->serverlist->RemoveObserver( &m_queueServers ); + RemoveObserver( &m_queueFiles ); + + m_udpserver = 0; + m_lastudpsearchtime = ::GetTickCount(); +} + + +// Comparison function needed by sort. Returns true if file1 preceeds file2 +bool ComparePartFiles(const CPartFile* file1, const CPartFile* file2) { + if (file1->GetDownPriority() != file2->GetDownPriority()) { + // To place high-priority files before low priority files we have to + // invert this test, since PR_LOW is lower than PR_HIGH, and since + // placing a PR_LOW file before a PR_HIGH file would mean that + // the PR_LOW file gets sources before the PR_HIGH file ... + return (file1->GetDownPriority() > file2->GetDownPriority()); + } else { + int sourcesA = file1->GetSourceCount(); + int sourcesB = file2->GetSourceCount(); + + int notSourcesA = file1->GetNotCurrentSourcesCount(); + int notSourcesB = file2->GetNotCurrentSourcesCount(); + + int cmp = CmpAny( sourcesA - notSourcesA, sourcesB - notSourcesB ); + + if ( cmp == 0 ) { + cmp = CmpAny( notSourcesA, notSourcesB ); + } + + return cmp < 0; + } +} + + +void CDownloadQueue::DoSortByPriority() +{ + m_lastsorttime = ::GetTickCount(); + sort( m_filelist.begin(), m_filelist.end(), ComparePartFiles ); +} + + +void CDownloadQueue::ResetLocalServerRequests() +{ + wxMutexLocker lock( m_mutex ); + + m_dwNextTCPSrcReq = 0; + m_localServerReqQueue.clear(); + + for ( uint16 i = 0; i < m_filelist.size(); i++ ) { + m_filelist[i]->SetLocalSrcRequestQueued(false); + } +} + + +void CDownloadQueue::RemoveLocalServerRequest( CPartFile* file ) +{ + wxMutexLocker lock( m_mutex ); + + EraseValue( m_localServerReqQueue, file ); + + file->SetLocalSrcRequestQueued(false); +} + + +void CDownloadQueue::ProcessLocalRequests() +{ + wxMutexLocker lock( m_mutex ); + + bool bServerSupportsLargeFiles = theApp->serverconnect + && theApp->serverconnect->GetCurrentServer() + && theApp->serverconnect->GetCurrentServer()->SupportsLargeFilesTCP(); + + if ( (!m_localServerReqQueue.empty()) && (m_dwNextTCPSrcReq < ::GetTickCount()) ) { + CMemFile dataTcpFrame(22); + const int iMaxFilesPerTcpFrame = 15; + int iFiles = 0; + while (!m_localServerReqQueue.empty() && iFiles < iMaxFilesPerTcpFrame) { + // find the file with the longest waitingtime + uint32 dwBestWaitTime = 0xFFFFFFFF; + + std::list::iterator posNextRequest = m_localServerReqQueue.end(); + std::list::iterator it = m_localServerReqQueue.begin(); + while( it != m_localServerReqQueue.end() ) { + CPartFile* cur_file = (*it); + if (cur_file->GetStatus() == PS_READY || cur_file->GetStatus() == PS_EMPTY) { + uint8 nPriority = cur_file->GetDownPriority(); + if (nPriority > PR_HIGH) { + wxASSERT(0); + nPriority = PR_HIGH; + } + + if (cur_file->GetLastSearchTime() + (PR_HIGH-nPriority) < dwBestWaitTime ){ + dwBestWaitTime = cur_file->GetLastSearchTime() + (PR_HIGH - nPriority); + posNextRequest = it; + } + + it++; + } else { + it = m_localServerReqQueue.erase(it); + cur_file->SetLocalSrcRequestQueued(false); + AddDebugLogLineM( false, logDownloadQueue, + CFormat(wxT("Local server source request for file '%s' not sent because of status '%s'")) + % cur_file->GetFileName() % cur_file->getPartfileStatus()); + } + } + + if (posNextRequest != m_localServerReqQueue.end()) { + CPartFile* cur_file = (*posNextRequest); + cur_file->SetLocalSrcRequestQueued(false); + cur_file->SetLastSearchTime(::GetTickCount()); + m_localServerReqQueue.erase(posNextRequest); + iFiles++; + + if (!bServerSupportsLargeFiles && cur_file->IsLargeFile()) { + AddDebugLogLineM(false, logDownloadQueue, wxT("TCP Request for sources on a large file ignored: server doesn't support it")); + } else { + AddDebugLogLineM(false, logDownloadQueue, + CFormat(wxT("Creating local sources request packet for '%s'")) % cur_file->GetFileName()); + // create request packet + CMemFile data(16 + (cur_file->IsLargeFile() ? 8 : 4)); + data.WriteHash(cur_file->GetFileHash()); + // Kry - lugdunum extended protocol on 17.3 to handle filesize properly. + // There is no need to check anything, old server ignore the extra 4 bytes. + // As of 17.9, servers accept a 0 32-bits size and then a 64bits size + if (cur_file->IsLargeFile()) { + wxASSERT(bServerSupportsLargeFiles); + data.WriteUInt32(0); + data.WriteUInt64(cur_file->GetFileSize()); + } else { + data.WriteUInt32(cur_file->GetFileSize()); + } + uint8 byOpcode = 0; + if (thePrefs::IsClientCryptLayerSupported() && theApp->serverconnect->GetCurrentServer() != NULL && theApp->serverconnect->GetCurrentServer()->SupportsGetSourcesObfuscation()) { + byOpcode = OP_GETSOURCES_OBFU; + } else { + byOpcode = OP_GETSOURCES; + } + CPacket packet(data, OP_EDONKEYPROT, byOpcode); + dataTcpFrame.Write(packet.GetPacket(), packet.GetRealPacketSize()); + } + } + } + + int iSize = dataTcpFrame.GetLength(); + if (iSize > 0) { + // create one 'packet' which contains all buffered OP_GETSOURCES ED2K packets to be sent with one TCP frame + // server credits: (16+4)*regularfiles + (16+4+8)*largefiles +1 + CPacket* packet = new CPacket(new byte[iSize], dataTcpFrame.GetLength(), true, false); + dataTcpFrame.Seek(0, wxFromStart); + dataTcpFrame.Read(packet->GetPacket(), iSize); + uint32 size = packet->GetPacketSize(); + theApp->serverconnect->SendPacket(packet, true); // Deletes `packet'. + AddDebugLogLineM(false, logDownloadQueue, wxT("Sent local sources request packet.")); + theStats::AddUpOverheadServer(size); + } + + // next TCP frame with up to 15 source requests is allowed to be sent in.. + m_dwNextTCPSrcReq = ::GetTickCount() + SEC2MS(iMaxFilesPerTcpFrame*(16+4)); + } + +} + + +void CDownloadQueue::SendLocalSrcRequest(CPartFile* sender) +{ + wxMutexLocker lock( m_mutex ); + + m_localServerReqQueue.push_back(sender); +} + + +void CDownloadQueue::AddLinksFromFile() +{ + const wxString fullPath = theApp->ConfigDir + wxT("ED2KLinks"); + if (!wxFile::Exists(fullPath)) { + return; + } + + // Attempt to lock the ED2KLinks file. + CFileLock lock((const char*)unicode2char(fullPath)); + + wxTextFile file(fullPath); + if ( file.Open() ) { + for ( unsigned int i = 0; i < file.GetLineCount(); i++ ) { + wxString line = file.GetLine( i ).Strip( wxString::both ); + + if ( !line.IsEmpty() ) { + // Special case! used by a secondary running mule to raise this one. + if ( line == wxT("RAISE_DIALOG") ) { + Notify_ShowGUI(); + continue; + } + + AddLink( line ); + } + } + + file.Close(); + } else { + printf("Failed to open ED2KLinks file.\n"); + } + + // Delete the file. + wxRemoveFile(theApp->ConfigDir + wxT("ED2KLinks")); +} + + +void CDownloadQueue::ResetCatParts(uint8 cat) +{ + for ( uint16 i = 0; i < GetFileCount(); i++ ) { + CPartFile* file = GetFileByIndex( i ); + + if ( file->GetCategory() == cat ) { + // Reset the category + file->SetCategory( 0 ); + } else if ( file->GetCategory() > cat ) { + // Set to the new position of the original category + file->SetCategory( file->GetCategory() - 1 ); + } + } +} + + +void CDownloadQueue::SetCatPrio(uint8 cat, uint8 newprio) +{ + for ( uint16 i = 0; i < GetFileCount(); i++ ) { + CPartFile* file = GetFileByIndex( i ); + + if ( !cat || file->GetCategory() == cat ) { + if ( newprio == PR_AUTO ) { + file->SetAutoDownPriority(true); + } else { + file->SetAutoDownPriority(false); + file->SetDownPriority(newprio); + } + } + } +} + + +void CDownloadQueue::SetCatStatus(uint8 cat, int newstatus) +{ + std::list files; + + { + wxMutexLocker lock(m_mutex); + + for ( uint16 i = 0; i < m_filelist.size(); i++ ) { + if ( m_filelist[i]->CheckShowItemInGivenCat(cat) ) { + files.push_back( m_filelist[i] ); + } + } + } + + std::list::iterator it = files.begin(); + + for ( ; it != files.end(); it++ ) { + switch ( newstatus ) { + case MP_CANCEL: (*it)->Delete(); break; + case MP_PAUSE: (*it)->PauseFile(); break; + case MP_STOP: (*it)->StopFile(); break; + case MP_RESUME: (*it)->ResumeFile(); break; + } + } +} + + +uint16 CDownloadQueue::GetDownloadingFileCount() const +{ + wxMutexLocker lock( m_mutex ); + + uint16 count = 0; + for ( uint16 i = 0; i < m_filelist.size(); i++ ) { + uint8 status = m_filelist[i]->GetStatus(); + if ( status == PS_READY || status == PS_EMPTY ) { + count++; + } + } + + return count; +} + + +uint16 CDownloadQueue::GetPausedFileCount() const +{ + wxMutexLocker lock( m_mutex ); + + uint16 count = 0; + for ( uint16 i = 0; i < m_filelist.size(); i++ ) { + if ( m_filelist[i]->GetStatus() == PS_PAUSED ) { + count++; + } + } + + return count; +} + + +void CDownloadQueue::CheckDiskspace( const CPath& path ) +{ + if ( ::GetTickCount() - m_lastDiskCheck < DISKSPACERECHECKTIME ) { + return; + } + + m_lastDiskCheck = ::GetTickCount(); + + uint64 min = 0; + // Check if the user has set an explicit limit + if ( thePrefs::IsCheckDiskspaceEnabled() ) { + min = thePrefs::GetMinFreeDiskSpace(); + } + + // The very least acceptable diskspace is a single PART + if ( min < PARTSIZE ) { + min = PARTSIZE; + } + + uint64 free = CPath::GetFreeSpaceAt(path); + if (free == static_cast(wxInvalidOffset)) { + return; + } else if (free < min) { + CUserEvents::ProcessEvent( + CUserEvents::OutOfDiskSpace, + wxT("Temporary partition")); + } + + for (unsigned int i = 0; i < m_filelist.size(); ++i) { + CPartFile* file = m_filelist[i]; + + switch ( file->GetStatus() ) { + case PS_ERROR: + case PS_COMPLETING: + case PS_COMPLETE: + continue; + } + + if ( free >= min && file->GetInsufficient() ) { + // We'll try to resume files if there is enough free space + if ( free - file->GetNeededSpace() > min ) { + file->ResumeFile(); + } + } else if ( free < min && !file->IsPaused() ) { + // No space left, stop the files. + file->PauseFile( true ); + } + } +} + + +int CDownloadQueue::GetMaxFilesPerUDPServerPacket() const +{ + if ( m_udpserver ) { + if ( m_udpserver->GetUDPFlags() & SRV_UDPFLG_EXT_GETSOURCES ) { + // get max. file ids per packet + if ( m_cRequestsSentToServer < MAX_REQUESTS_PER_SERVER ) { + return std::min( + MAX_FILES_PER_UDP_PACKET, + MAX_REQUESTS_PER_SERVER - m_cRequestsSentToServer + ); + } + } else if ( m_cRequestsSentToServer < MAX_REQUESTS_PER_SERVER ) { + return 1; + } + } + + return 0; +} + + +bool CDownloadQueue::SendGlobGetSourcesUDPPacket(CMemFile& data) +{ + if (!m_udpserver) { + return false; + } + + CPacket packet(data, OP_EDONKEYPROT, ((m_udpserver->GetUDPFlags() & SRV_UDPFLG_EXT_GETSOURCES2) ? OP_GLOBGETSOURCES2 : OP_GLOBGETSOURCES)); + + theStats::AddUpOverheadServer(packet.GetPacketSize()); + theApp->serverconnect->SendUDPPacket(&packet,m_udpserver,false); + + return true; +} + + +void CDownloadQueue::AddToResolve(const CMD4Hash& fileid, const wxString& pszHostname, uint16 port, const wxString& hash, uint8 cryptoptions) +{ + // double checking + if ( !GetFileByID(fileid) ) { + return; + } + + wxMutexLocker lock( m_mutex ); + + Hostname_Entry entry = { fileid, pszHostname, port, hash, cryptoptions }; + m_toresolve.push_front(entry); + + // Check if there are other DNS lookups on queue + if (m_toresolve.size() == 1) { + // Check if it is a simple dot address + uint32 ip = StringIPtoUint32(pszHostname); + + if (ip) { + OnHostnameResolved(ip); + } else { + CAsyncDNS* dns = new CAsyncDNS(pszHostname, DNS_SOURCE, theApp); + + if ((dns->Create() != wxTHREAD_NO_ERROR) || (dns->Run() != wxTHREAD_NO_ERROR)) { + dns->Delete(); + m_toresolve.pop_front(); + } + } + } +} + + +void CDownloadQueue::OnHostnameResolved(uint32 ip) +{ + wxMutexLocker lock( m_mutex ); + + wxASSERT( m_toresolve.size() ); + + Hostname_Entry resolved = m_toresolve.front(); + m_toresolve.pop_front(); + + if ( ip ) { + CPartFile* file = GetFileByID( resolved.fileid ); + if ( file ) { + CMemFile sources(1+4+2); + sources.WriteUInt8(1); // No. Sources + sources.WriteUInt32(ip); + sources.WriteUInt16(resolved.port); + sources.WriteUInt8(resolved.cryptoptions); + if (resolved.cryptoptions & 0x80) { + wxASSERT(!resolved.hash.IsEmpty()); + CMD4Hash sourcehash; + sourcehash.Decode(resolved.hash); + sources.WriteHash(sourcehash); + } + sources.Seek(0,wxFromStart); + + file->AddSources(sources, 0, 0, SF_LINK, true); + } + } + + while (m_toresolve.size()) { + Hostname_Entry entry = m_toresolve.front(); + + // Check if it is a simple dot address + uint32 tmpIP = StringIPtoUint32(entry.strHostname); + + if (tmpIP) { + OnHostnameResolved(tmpIP); + } else { + CAsyncDNS* dns = new CAsyncDNS(entry.strHostname, DNS_SOURCE, theApp); + + if ((dns->Create() != wxTHREAD_NO_ERROR) || (dns->Run() != wxTHREAD_NO_ERROR)) { + dns->Delete(); + m_toresolve.pop_front(); + } else { + break; + } + } + } +} + + +bool CDownloadQueue::AddLink( const wxString& link, int category ) +{ + wxString uri(link); + + if (link.compare(0, 7, wxT("magnet:")) == 0) { + uri = CMagnetED2KConverter(link); + if (uri.empty()) { + AddLogLineM(true, CFormat(_("Cannot convert magnet link to ed2k: %s")) % link); + return false; + } + } + + if (uri.compare(0, 7, wxT("ed2k://")) == 0) { + return AddED2KLink(uri, category); + } else { + AddLogLineM(true, CFormat(_("Unknown protocol of link: %s")) % link); + return false; + } +} + + +bool CDownloadQueue::AddED2KLink( const wxString& link, int category ) +{ + wxASSERT( !link.IsEmpty() ); + wxString URI = link; + + // Need the links to end with /, otherwise CreateLinkFromUrl crashes us. + if ( URI.Last() != wxT('/') ) { + URI += wxT("/"); + } + + try { + CScopedPtr uri(CED2KLink::CreateLinkFromUrl(URI)); + + return AddED2KLink( uri.get(), category ); + } catch ( const wxString& err ) { + AddLogLineM( true, CFormat( _("Invalid ed2k link! Error: %s")) % err); + } + + return false; +} + + +bool CDownloadQueue::AddED2KLink( const CED2KLink* link, int category ) +{ + switch ( link->GetKind() ) { + case CED2KLink::kFile: + return AddED2KLink( dynamic_cast( link ), category ); + + case CED2KLink::kServer: + return AddED2KLink( dynamic_cast( link ) ); + + case CED2KLink::kServerList: + return AddED2KLink( dynamic_cast( link ) ); + + default: + return false; + } +} + + + +bool CDownloadQueue::AddED2KLink( const CED2KFileLink* link, int category ) +{ + CPartFile* file = NULL; + if (IsFileExisting(link->GetHashKey())) { + // Must be a shared file if we are to add hashes or sources + if ((file = GetFileByID(link->GetHashKey())) == NULL) { + return false; + } + } else { + file = new CPartFile(link); + + if (file->GetStatus() == PS_ERROR) { + delete file; + return false; + } + + AddDownload(file, thePrefs::AddNewFilesPaused(), category); + } + + if (link->HasValidAICHHash()) { + CAICHHashSet* hashset = file->GetAICHHashset(); + + if (!hashset->HasValidMasterHash() || (hashset->GetMasterHash() != link->GetAICHHash())) { + hashset->SetMasterHash(link->GetAICHHash(), AICH_VERIFIED); + hashset->FreeHashSet(); + } + } + + const CED2KFileLink::CED2KLinkSourceList& list = link->m_sources; + CED2KFileLink::CED2KLinkSourceList::const_iterator it = list.begin(); + for (; it != list.end(); ++it) { + AddToResolve(link->GetHashKey(), it->addr, it->port, it->hash, it->cryptoptions); + } + + return true; +} + + +bool CDownloadQueue::AddED2KLink( const CED2KServerLink* link ) +{ + CServer *server = new CServer( link->GetPort(), Uint32toStringIP( link->GetIP() ) ); + + server->SetListName( Uint32toStringIP( link->GetIP() ) ); + + theApp->serverlist->AddServer(server); + + Notify_ServerAdd(server); + + return true; +} + + +bool CDownloadQueue::AddED2KLink( const CED2KServerListLink* link ) +{ + theApp->serverlist->UpdateServerMetFromURL( link->GetAddress() ); + + return true; +} + + +void CDownloadQueue::ObserverAdded( ObserverType* o ) +{ + CObservableQueue::ObserverAdded( o ); + + EventType::ValueList list; + + { + wxMutexLocker lock(m_mutex); + list.reserve( m_filelist.size() ); + list.insert( list.begin(), m_filelist.begin(), m_filelist.end() ); + } + + NotifyObservers( EventType( EventType::INITIAL, &list ), o ); +} + +void CDownloadQueue::KademliaSearchFile(uint32 searchID, const Kademlia::CUInt128* pcontactID, const Kademlia::CUInt128* pbuddyID, uint8 type, uint32 ip, uint16 tcp, uint16 udp, uint32 serverip, uint16 serverport, uint8 byCryptOptions) +{ + + AddDebugLogLineM(false, logKadSearch, wxString::Format(wxT("Search result sources (type %i)"),type)); + + //Safety measure to make sure we are looking for these sources + CPartFile* temp = GetFileByKadFileSearchID(searchID); + if( !temp ) { + AddDebugLogLineM(false, logKadSearch, wxT("This is not the file we're looking for...")); + return; + } + + //Do we need more sources? + if(!(!temp->IsStopped() && thePrefs::GetMaxSourcePerFile() > temp->GetSourceCount())) { + AddDebugLogLineM(false, logKadSearch, wxT("No more sources needed for this file")); + return; + } + + uint32 ED2KID = wxUINT32_SWAP_ALWAYS(ip); + + if (theApp->ipfilter->IsFiltered(ED2KID)) { + AddDebugLogLineM(false, logKadSearch, wxT("Source ip got filtered")); + AddDebugLogLineM(false, logIPFilter, CFormat(wxT("IPfiltered source IP=%s received from Kademlia")) % Uint32toStringIP(ED2KID)); + return; + } + + if( (ip == Kademlia::CKademlia::GetIPAddress() || ED2KID == theApp->GetED2KID()) && tcp == thePrefs::GetPort()) { + AddDebugLogLineM(false, logKadSearch, wxT("Trying to add myself as source, ignore")); + return; + } + + CUpDownClient* ctemp = NULL; + switch( type ) { + case 4: + case 1: { + //NonFirewalled users + if(!tcp) { + AddDebugLogLineM(false, logKadSearch, CFormat(wxT("Ignored source (IP=%s) received from Kademlia, no tcp port received")) % Uint32toStringIP(ip)); + return; + } + if (!IsGoodIP(ED2KID,thePrefs::FilterLanIPs())) { + AddDebugLogLineM(false, logKadSearch, CFormat(wxT("%s got filtered")) % Uint32toStringIP(ED2KID)); + AddDebugLogLineM(false, logIPFilter, CFormat(wxT("Ignored source (IP=%s) received from Kademlia, filtered")) % Uint32toStringIP(ED2KID)); + return; + } + ctemp = new CUpDownClient(tcp,ip,0,0,temp,false, true); + ctemp->SetSourceFrom(SF_KADEMLIA); + ctemp->SetServerIP(serverip); + ctemp->SetServerPort(serverport); + ctemp->SetKadPort(udp); + byte cID[16]; + pcontactID->ToByteArray(cID); + ctemp->SetUserHash(CMD4Hash(cID)); + break; + } + case 2: { + //Don't use this type... Some clients will process it wrong.. + break; + } + case 5: + case 3: { + //This will be a firewaled client connected to Kad only. + //We set the clientID to 1 as a Kad user only has 1 buddy. + ctemp = new CUpDownClient(tcp,1,0,0,temp,false, true); + //The only reason we set the real IP is for when we get a callback + //from this firewalled source, the compare method will match them. + ctemp->SetSourceFrom(SF_KADEMLIA); + ctemp->SetKadPort(udp); + byte cID[16]; + pcontactID->ToByteArray(cID); + ctemp->SetUserHash(CMD4Hash(cID)); + pbuddyID->ToByteArray(cID); + ctemp->SetBuddyID(cID); + ctemp->SetBuddyIP(serverip); + ctemp->SetBuddyPort(serverport); + break; + } + } + + if (ctemp) { + // add encryption settings + ctemp->SetCryptLayerSupport((byCryptOptions & 0x01) != 0); + ctemp->SetCryptLayerRequest((byCryptOptions & 0x02) != 0); + ctemp->SetCryptLayerRequires((byCryptOptions & 0x04) != 0); + + AddDebugLogLineM(false, logKadSearch, CFormat(wxT("Happily adding a source (%s) type %d")) % Uint32_16toStringIP_Port(ip, ctemp->GetUserPort()) % type); + CheckAndAddSource(temp, ctemp); + } +} + +CPartFile* CDownloadQueue::GetFileByKadFileSearchID(uint32 id) const +{ + + wxMutexLocker lock( m_mutex ); + + for ( uint16 i = 0; i < m_filelist.size(); ++i ) { + if ( id == m_filelist[i]->GetKadFileSearchID()) { + return m_filelist[ i ]; + } + } + + return NULL; + +} + +bool CDownloadQueue::DoKademliaFileRequest() +{ + return ((::GetTickCount() - lastkademliafilerequest) > KADEMLIAASKTIME); +} +// File_checked_for_headers diff --git a/src/DownloadQueue.h b/src/DownloadQueue.h new file mode 100644 index 00000000..2e9c1f70 --- /dev/null +++ b/src/DownloadQueue.h @@ -0,0 +1,392 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef DOWNLOADQUEUE_H +#define DOWNLOADQUEUE_H + +#include "MD4Hash.h" // Needed for CMD4Hash +#include "ObservableQueue.h" // Needed for CObservableQueue +#include "GetTickCount.h" // Needed fot GetTickCount + + +#include + + +class CSharedFileList; +class CSearchFile; +class CPartFile; +class CUpDownClient; +class CServer; +class CMemFile; +class CKnownFile; +class CED2KLink; +class CED2KFileLink; +class CED2KServerLink; +class CED2KServerListLink; +class CPath; + +namespace Kademlia { + class CUInt128; +} + +/** + * The download queue houses all active downloads. + * + * + * This class should be thread-safe. + */ +class CDownloadQueue : public CObservableQueue +{ +public: + /** + * Constructor. + */ + CDownloadQueue(); + + /** + * Destructor. + */ + ~CDownloadQueue(); + + /** Loads met-files from the specified directory. */ + void LoadMetFiles(const CPath& path); + + /** + * Main worker function. + */ + void Process(); + + + /** + * Returns a pointer to the file with the specified hash, or NULL. + * + * @param filehash The hash to search for. + * @return The corresponding file or NULL. + */ + CPartFile* GetFileByID(const CMD4Hash& filehash) const; + + /** + * Returns the file at the specified position in the file-list, or NULL if invalid. + * + * @param A valid position in the file-list. + * @return A valid pointer or NULL if the index was invalid. + */ + CPartFile* GetFileByIndex(unsigned int idx) const; + + + /** + * Returns true if the file is currently being shared or downloaded + */ + bool IsFileExisting(const CMD4Hash& fileid) const; + + /** + * Returns true if the specified file is on the download-queue. + */ + bool IsPartFile(const CKnownFile* file) const; + + /** + * Updates the file's download active time + */ + void OnConnectionState(bool bConnected); + + /** + * Starts a new download based on the specified search-result. + * + * @param toadd The search-result to add. + * @param category The category to assign to the new download. + * + * The download will only be started if no identical files are either + * being downloaded or shared currently. + */ + void AddSearchToDownload(CSearchFile* toadd, uint8 category); + + + /** + * Adds an existing partfile to the queue. + * + * @param newfile The file to add. + * @param paused If the file should be stopped when added. + * @param category The category to assign to the file. + */ + void AddDownload(CPartFile* newfile, bool paused, uint8 category); + + + /** + * Removes the specified file from the queue. + * + * @param toremove A pointer to the file object to be removed. + */ + void RemoveFile(CPartFile* toremove); + + + /** + * Saves the source-seeds of every file on the queue. + */ + void SaveSourceSeeds(); + + /** + * Loads the source-seeds of every file on the queue. + */ + void LoadSourceSeeds(); + + + /** + * Adds a potiential new client to the specified file. + * + * @param sender The owner of the new source. + * @param source The client in question, might be deleted! + * + * This function will check the new client against the already existing + * clients. The source will then be queued as is appropriate, or deleted + * if it is duplicate of an existing client. + */ + void CheckAndAddSource(CPartFile* sender, CUpDownClient* source); + + /** + * This function adds already known source to the specified file. + * + * @param sender The owner fo the new source. + * @param source The client in question. + * + * This function acts like CheckAndAddSource, with the exception that no + * checks are made to see if the client is a duplicate. It is assumed that + * it is in fact a valid client. + */ + void CheckAndAddKnownSource(CPartFile* sender, CUpDownClient* source); + + + /** + * Removes the specified client completly. + * + * @param toremove The client to be removed. + * @param updatewindow NOT USED! + * @param bDoStatsUdpate Specifies if the affected files should update their statistics. + * @return True if the sources was found and removed. + * + * This function will remove the specified source from both normal source + * lists, A4AF lists and the downloadqueue-widget. The requestfile of the + * source is also reset. + */ + bool RemoveSource(CUpDownClient* toremove, bool updatewindow = true, bool bDoStatsUpdate = true); + + + /** + * Finds the queued client by IP and UDP-port, by looking at file-sources. + * + * @param dwIP The IP-address of the client. + * @param nUDPPort The UDP-port of the client. + * @return The matching client or NULL if none was found. + */ + CUpDownClient* GetDownloadClientByIP_UDP(uint32 dwIP, uint16 nUDPPort) const; + + + /** + * Queues the specified file for source-requestion from the connected server. + */ + void SendLocalSrcRequest(CPartFile* sender); + + /** + * Removes the specified server from the request-queue. + */ + void RemoveLocalServerRequest(CPartFile* pFile); + + /** + * Resets all queued server-requests. + */ + void ResetLocalServerRequests(); + + + /** + * Starts the next paused file on the queue, going after priority. + * Also checks for categories if enabled on preferences. + */ + void StartNextFile(CPartFile* oldfile); + + + /** + * Resets the category of all files with the specified category. + */ + void ResetCatParts(uint8 cat); + + /** + * Sets the priority of all files with the specified category. + */ + void SetCatPrio(uint8 cat, uint8 newprio); + + /** + * Sets the status of all files with the specified category. + */ + void SetCatStatus(uint8 cat, int newstatus); + + /** + * Returns the current number of queued files. + */ + uint16 GetFileCount() const; + + /** + * Returns the current number of downloading files. + */ + uint16 GetDownloadingFileCount() const; + + /** + * Returns the current number of paused files. + */ + uint16 GetPausedFileCount() const; + + + /** + * This function is called when a DNS lookup is finished. + */ + void OnHostnameResolved(uint32 ip); + + + /** + * Adds an ed2k or magnet link to download queue. + */ + bool AddLink( const wxString& link, int category = 0 ); + + bool AddED2KLink( const wxString& link, int category = 0 ); + bool AddED2KLink( const CED2KLink* link, int category = 0 ); + bool AddED2KLink( const CED2KFileLink* link, int category = 0 ); + bool AddED2KLink( const CED2KServerLink* link ); + bool AddED2KLink( const CED2KServerListLink* link ); + + + /** + * Returns the current server which is beening queried by UDP packets. + */ + CServer* GetUDPServer() const; + + /** + * Set the server to query through UDP packest. + */ + void SetUDPServer( CServer* server ); + + + /** + * Stop the source-requests from non-connected servers. + */ + void StopUDPRequests(); + + /* Kad Stuff */ + + /** + * Add a Kad source to a download + */ + void KademliaSearchFile(uint32 searchID, const Kademlia::CUInt128* pcontactID, const Kademlia::CUInt128* pkadID, uint8 type, uint32 ip, uint16 tcp, uint16 udp, uint32 serverip, uint16 serverport, uint8 byCryptOptions); + + CPartFile* GetFileByKadFileSearchID(uint32 id) const; + + bool DoKademliaFileRequest(); + + void SetLastKademliaFileRequest() {lastkademliafilerequest = ::GetTickCount();} + +private: + /** + * This function initializes new observers with the current contents of the queue. + */ + virtual void ObserverAdded( ObserverType* o ); + + + /** + * Helper-function, sorts the filelist so that high-priority files are first. + */ + void DoSortByPriority(); + + /** Checks that there is enough free spaces for temp-files at that specified path. */ + void CheckDiskspace(const CPath& path); + + /** + * Parses all links in the ED2KLink file and resets it. + */ + void AddLinksFromFile(); + + /** + * Stops performing UDP requests. + */ + void DoStopUDPRequests(); + + + void ProcessLocalRequests(); + + bool SendNextUDPPacket(); + int GetMaxFilesPerUDPServerPacket() const; + bool SendGlobGetSourcesUDPPacket(CMemFile& data); + + void AddToResolve(const CMD4Hash& fileid, const wxString& pszHostname, uint16 port, const wxString& hash, uint8 cryptoptions); + + //! The mutex assosiated with this class, mutable to allow for const functions. + mutable wxMutex m_mutex; + + + uint32 m_datarate; + uint32 m_lastDiskCheck; + uint32 m_lastudpsearchtime; + uint32 m_lastsorttime; + uint32 m_lastudpstattime; + uint32 m_nLastED2KLinkCheck; + uint8 m_cRequestsSentToServer; + uint32 m_dwNextTCPSrcReq; + uint8 m_udcounter; + CServer* m_udpserver; + + + /** + * Structure used to store sources with dynamic hostnames. + */ + struct Hostname_Entry + { + //! The ID of the file the source provides. + CMD4Hash fileid; + //! The dynamic hostname. + wxString strHostname; + //! The user-port of the source. + uint16 port; + //! The hash of the source + wxString hash; + //! The cryptoptions for the source + uint8 cryptoptions; + }; + + std::deque m_toresolve; + + typedef std::deque FileQueue; + FileQueue m_filelist; + + std::list m_localServerReqQueue; + + //! Observer used to keep track of which servers have yet to be asked for sources + CQueueObserver m_queueServers; + + //! Observer used to keep track of which file to send UDP requests for + CQueueObserver m_queueFiles; + + /* Kad Stuff */ + uint32 lastkademliafilerequest; + +}; + +#endif // DOWNLOADQUEUE_H +// File_checked_for_headers diff --git a/src/ECSpecialCoreTags.cpp b/src/ECSpecialCoreTags.cpp new file mode 100644 index 00000000..98e2379e --- /dev/null +++ b/src/ECSpecialCoreTags.cpp @@ -0,0 +1,416 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 Kry ( elkry@sourceforge.net / http://www.amule.org ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include // Needed for CECTag +#include // Needed for special EC tag creator classes + + +// Since there are only constructors defined here, +// removing everything from non-local builds. + +#include "amule.h" +#include "Server.h" // Needed for CServer +#include "PartFile.h" // Needed for CPartFile +#include "ServerConnect.h" // Needed for CServerConnect +#include "updownclient.h" +#include "UploadQueue.h" // Needed for CUploadQueue +#include "SharedFileList.h" +#include "SearchList.h" + +#include "kademlia/kademlia/Kademlia.h" + + +CEC_Server_Tag::CEC_Server_Tag(const CServer *server, EC_DETAIL_LEVEL detail_level) : + CECTag(EC_TAG_SERVER, EC_IPv4_t(server->GetIP(), server->GetPort())) +{ + wxString tmpStr; + uint32 tmpInt; + uint8 tmpShort; + + switch (detail_level) { + case EC_DETAIL_INC_UPDATE: + // should not get here + wxASSERT(0); + break; + case EC_DETAIL_UPDATE: + if ((tmpInt = server->GetPing()) != 0) { + AddTag(CECTag(EC_TAG_SERVER_PING, tmpInt)); + } + if ((tmpShort = (uint8)server->GetFailedCount()) != 0) { + AddTag(CECTag(EC_TAG_SERVER_FAILED, tmpShort)); + } + break; + case EC_DETAIL_WEB: + case EC_DETAIL_FULL: + if ((tmpInt = server->GetPing()) != 0) { + AddTag(CECTag(EC_TAG_SERVER_PING, tmpInt)); + } + if ((tmpShort = (uint8)server->GetPreferences()) != SRV_PR_NORMAL) { + AddTag(CECTag(EC_TAG_SERVER_PRIO, tmpShort)); + } + if ((tmpShort = (uint8)server->GetFailedCount()) != 0) { + AddTag(CECTag(EC_TAG_SERVER_FAILED, tmpShort)); + } + if ((tmpShort = (uint8)server->IsStaticMember()) != 0) { + AddTag(CECTag(EC_TAG_SERVER_STATIC, tmpShort)); + } + if (!(tmpStr = server->GetVersion()).IsEmpty()) { + AddTag(CECTag(EC_TAG_SERVER_VERSION, tmpStr)); + } + if (!(tmpStr = server->GetDescription()).IsEmpty()) { + AddTag(CECTag(EC_TAG_SERVER_DESC, tmpStr)); + } + if ((tmpInt = server->GetUsers()) != 0) { + AddTag(CECTag(EC_TAG_SERVER_USERS, tmpInt)); + } + if ((tmpInt = server->GetMaxUsers()) != 0) { + AddTag(CECTag(EC_TAG_SERVER_USERS_MAX, tmpInt)); + } + if ((tmpInt = server->GetFiles()) != 0) { + AddTag(CECTag(EC_TAG_SERVER_FILES, tmpInt)); + } + case EC_DETAIL_CMD: + if (!(tmpStr = server->GetListName()).IsEmpty()) { + AddTag(CECTag(EC_TAG_SERVER_NAME, tmpStr)); + } + } +} + +CEC_ConnState_Tag::CEC_ConnState_Tag(EC_DETAIL_LEVEL detail_level) : CECTag(EC_TAG_CONNSTATE, + (uint8)( + (theApp->IsConnectedED2K() ? 0x01 : 0x00) + | + (theApp->serverconnect->IsConnecting() ? 0x02 : 0x00) + | + (theApp->IsConnectedKad() ? 0x04 : 0x00) + | + (Kademlia::CKademlia::IsFirewalled() ? 0x08 : 0x00) + | + (Kademlia::CKademlia::IsRunning() ? 0x10 : 0x00) + )) +{ + if (theApp->IsConnectedED2K()) { + if ( theApp->serverconnect->GetCurrentServer() ) { + AddTag(CEC_Server_Tag(theApp->serverconnect->GetCurrentServer(), detail_level)); + } + AddTag(CECTag(EC_TAG_ED2K_ID, theApp->GetED2KID())); + } + + AddTag(CECTag(EC_TAG_CLIENT_ID, theApp->GetID())); +} + +CEC_PartFile_Tag::CEC_PartFile_Tag(CPartFile *file, CValueMap &valuemap) + : CECTag(EC_TAG_PARTFILE, file->GetFileHash()) +{ + valuemap.CreateTag(EC_TAG_PARTFILE_STATUS, file->GetStatus(), this); + + valuemap.CreateTag(EC_TAG_PARTFILE_SOURCE_COUNT, file->GetSourceCount(), this); + valuemap.CreateTag(EC_TAG_PARTFILE_SOURCE_COUNT_NOT_CURRENT, file->GetNotCurrentSourcesCount(), this); + valuemap.CreateTag(EC_TAG_PARTFILE_SOURCE_COUNT_XFER, file->GetTransferingSrcCount(), this); + valuemap.CreateTag(EC_TAG_PARTFILE_SOURCE_COUNT_A4AF, file->GetSrcA4AFCount(), this); + + valuemap.CreateTag(EC_TAG_PARTFILE_SIZE_XFER, file->GetTransferred(), this); + valuemap.CreateTag(EC_TAG_PARTFILE_SIZE_DONE, file->GetCompletedSize(), this); + valuemap.CreateTag(EC_TAG_PARTFILE_SPEED, (uint64)(file->GetKBpsDown()*1024), this); + + valuemap.CreateTag(EC_TAG_PARTFILE_PRIO, + (uint64)(file->IsAutoDownPriority() ? + file->GetDownPriority() + 10 : file->GetDownPriority()), this); + + valuemap.CreateTag(EC_TAG_PARTFILE_CAT, file->GetCategory(), this); + + valuemap.CreateTag(EC_TAG_PARTFILE_LAST_SEEN_COMP, (uint64)file->lastseencomplete, this); + + valuemap.CreateTag(EC_TAG_PARTFILE_NAME, file->GetFileName().GetPrintable(), this); + + long l; + if (file->GetPartMetFileName().RemoveAllExt().GetRaw().ToLong(&l)) { + valuemap.CreateTag(EC_TAG_PARTFILE_PARTMETID, (uint64)l, this); + } + + valuemap.CreateTag(EC_TAG_PARTFILE_SIZE_FULL, file->GetFileSize(), this); + + valuemap.CreateTag(EC_TAG_PARTFILE_ED2K_LINK, + theApp->CreateED2kLink(file, (theApp->IsConnectedED2K() && !theApp->serverconnect->IsLowID())), this); +} + +void CEC_PartFile_Tag::Detail_Tag(CPartFile *file) +{ + // Tag for source names + CECTag sn(EC_TAG_PARTFILE_SOURCE_NAMES, (uint64) 0); + SourcenameItemList sil; + const CPartFile::SourceSet &sources = file->GetSourceList(); + for (CPartFile::SourceSet::const_iterator it = sources.begin(); it != sources.end(); ++it) { + CUpDownClient *cur_src = *it; + if (cur_src->GetRequestFile() != file || cur_src->GetClientFilename().Length() == 0) { + continue; + } + + bool found = false; + for (SourcenameItemList::iterator its = sil.begin() ; its != sil.end(); ++its ) { + if (its->name == cur_src->GetClientFilename()) { + its->count++; + found = true; + break; + } + } + if (!found) { + sil.push_back(SourcenameItem(cur_src->GetClientFilename(), 1)); + } + } + for (SourcenameItemList::const_iterator its = sil.begin() ; its != sil.end(); ++its ) { + // Tag children are evaluated by index, not by name + sn.AddTag(CECTag(EC_TAG_PARTFILE_SOURCE_NAMES, its->name)); + sn.AddTag(CECTag(EC_TAG_PARTFILE_SOURCE_NAMES, (uint64) its->count)); + } + AddTag(sn); +} + +CEC_PartFile_Tag::CEC_PartFile_Tag(CPartFile *file, EC_DETAIL_LEVEL detail_level, bool detail) +: +CECTag(EC_TAG_PARTFILE, file->GetFileHash()) +{ + AddTag(CECTag(EC_TAG_PARTFILE_STATUS, file->GetStatus())); + + AddTag(CECTag(EC_TAG_PARTFILE_SOURCE_COUNT, file->GetSourceCount())); + AddTag(CECTag(EC_TAG_PARTFILE_SOURCE_COUNT_NOT_CURRENT, file->GetNotCurrentSourcesCount())); + AddTag(CECTag(EC_TAG_PARTFILE_SOURCE_COUNT_XFER, file->GetTransferingSrcCount())); + AddTag(CECTag(EC_TAG_PARTFILE_SOURCE_COUNT_A4AF, file->GetSrcA4AFCount())); + + if ( (file->GetTransferingSrcCount() > 0) || (detail_level != EC_DETAIL_UPDATE) ) { + + AddTag(CECTag(EC_TAG_PARTFILE_SIZE_XFER, file->GetTransferred())); + AddTag(CECTag(EC_TAG_PARTFILE_SIZE_DONE, file->GetCompletedSize())); + AddTag(CECTag(EC_TAG_PARTFILE_SPEED, (uint64)(file->GetKBpsDown()*1024))); + } + + AddTag(CECTag(EC_TAG_PARTFILE_PRIO, (uint64)(file->IsAutoDownPriority() ? + file->GetDownPriority() + 10 : file->GetDownPriority()))); + + AddTag(CECTag(EC_TAG_PARTFILE_CAT, file->GetCategory())); + AddTag(CECTag(EC_TAG_PARTFILE_LAST_SEEN_COMP, (uint64)file->lastseencomplete)); + + if (detail) { + Detail_Tag(file); + } + + if (file->m_CommentUpdated) { + // Tag for comments + CECTag sc(EC_TAG_PARTFILE_COMMENTS, (uint64) 0); + + const FileRatingList & list = file->GetRatingAndComments(); + for (FileRatingList::const_iterator it = list.begin(); it != list.end(); ++it) { + // Tag children are evaluated by index, not by name + sc.AddTag(CECTag(EC_TAG_PARTFILE_COMMENTS, it->UserName)); + sc.AddTag(CECTag(EC_TAG_PARTFILE_COMMENTS, it->FileName)); + sc.AddTag(CECTag(EC_TAG_PARTFILE_COMMENTS, (uint64) it->Rating)); + sc.AddTag(CECTag(EC_TAG_PARTFILE_COMMENTS, it->Comment)); + } + AddTag(sc); + } + + if (detail_level == EC_DETAIL_UPDATE) { + return; + } + + AddTag(CECTag(EC_TAG_PARTFILE_NAME,file->GetFileName().GetPrintable())); + + long l; + if (file->GetPartMetFileName().RemoveAllExt().GetRaw().ToLong(&l)) { + AddTag(CECTag(EC_TAG_PARTFILE_PARTMETID, (uint64)l)); + } + + AddTag(CECTag(EC_TAG_PARTFILE_SIZE_FULL, file->GetFileSize())); + + AddTag(CECTag(EC_TAG_PARTFILE_ED2K_LINK, + theApp->CreateED2kLink(file, (theApp->IsConnectedED2K() && !theApp->serverconnect->IsLowID())))); +} + +CEC_SharedFile_Tag::CEC_SharedFile_Tag(const CKnownFile *file, CValueMap &valuemap) : CECTag(EC_TAG_KNOWNFILE, file->GetFileHash()) +{ + valuemap.CreateTag(EC_TAG_KNOWNFILE_REQ_COUNT, file->statistic.GetRequests(), this); + valuemap.CreateTag(EC_TAG_KNOWNFILE_REQ_COUNT_ALL, file->statistic.GetAllTimeRequests(), this); + valuemap.CreateTag(EC_TAG_KNOWNFILE_ACCEPT_COUNT, file->statistic.GetAccepts(), this); + valuemap.CreateTag(EC_TAG_KNOWNFILE_ACCEPT_COUNT_ALL, file->statistic.GetAllTimeAccepts(), this); + valuemap.CreateTag(EC_TAG_KNOWNFILE_XFERRED, file->statistic.GetTransferred(), this); + valuemap.CreateTag(EC_TAG_KNOWNFILE_XFERRED_ALL, file->statistic.GetAllTimeTransferred(), this); + valuemap.CreateTag(EC_TAG_KNOWNFILE_AICH_MASTERHASH, file->GetAICHMasterHash(), this); + + valuemap.CreateTag(EC_TAG_PARTFILE_PRIO, + (uint64)(file->IsAutoUpPriority() ? file->GetUpPriority() + 10 : file->GetUpPriority()), this); + + valuemap.CreateTag(EC_TAG_PARTFILE_NAME, file->GetFileName().GetPrintable(), this); + valuemap.CreateTag(EC_TAG_PARTFILE_SIZE_FULL, file->GetFileSize(), this); + valuemap.CreateTag(EC_TAG_PARTFILE_ED2K_LINK, + theApp->CreateED2kLink(file, (theApp->IsConnectedED2K() && !theApp->serverconnect->IsLowID())), this); +} + +CEC_SharedFile_Tag::CEC_SharedFile_Tag(const CKnownFile *file, EC_DETAIL_LEVEL detail_level) : CECTag(EC_TAG_KNOWNFILE, file->GetFileHash()) +{ + AddTag(CECTag(EC_TAG_KNOWNFILE_REQ_COUNT, file->statistic.GetRequests())); + AddTag(CECTag(EC_TAG_KNOWNFILE_REQ_COUNT_ALL, file->statistic.GetAllTimeRequests())); + + AddTag(CECTag(EC_TAG_KNOWNFILE_ACCEPT_COUNT, file->statistic.GetAccepts())); + AddTag(CECTag(EC_TAG_KNOWNFILE_ACCEPT_COUNT_ALL, file->statistic.GetAllTimeAccepts())); + + AddTag(CECTag(EC_TAG_KNOWNFILE_XFERRED, file->statistic.GetTransferred())); + AddTag(CECTag(EC_TAG_KNOWNFILE_XFERRED_ALL, file->statistic.GetAllTimeTransferred())); + AddTag(CECTag(EC_TAG_KNOWNFILE_AICH_MASTERHASH, file->GetAICHMasterHash())); + + AddTag(CECTag(EC_TAG_PARTFILE_PRIO, + (uint8)(file->IsAutoUpPriority() ? file->GetUpPriority() + 10 : file->GetUpPriority()))); + + if (detail_level == EC_DETAIL_UPDATE) { + return; + } + + AddTag(CECTag(EC_TAG_PARTFILE_NAME,file->GetFileName().GetPrintable())); + + AddTag(CECTag(EC_TAG_PARTFILE_SIZE_FULL, file->GetFileSize())); + + AddTag(CECTag(EC_TAG_PARTFILE_ED2K_LINK, + theApp->CreateED2kLink(file, (theApp->IsConnectedED2K() && !theApp->serverconnect->IsLowID())))); +} + +CEC_UpDownClient_Tag::CEC_UpDownClient_Tag(const CUpDownClient* client, EC_DETAIL_LEVEL detail_level) : + CECTag(EC_TAG_CLIENT, client->GetUserIDHybrid()) +{ + // General + AddTag(CECTag(EC_TAG_CLIENT_NAME, client->GetUserName())); + AddTag(CECTag(EC_TAG_CLIENT_HASH, client->GetUserHash())); + AddTag(CECTag(EC_TAG_CLIENT_SCORE, client->GetScore(false))); + AddTag(CECTag(EC_TAG_CLIENT_SOFTWARE, client->GetClientSoft())); + AddTag(CECTag(EC_TAG_CLIENT_SOFT_VER_STR, client->GetSoftVerStr())); + AddTag(CECTag(EC_TAG_CLIENT_USER_IP, client->GetConnectIP())); + AddTag(CECTag(EC_TAG_CLIENT_USER_PORT, client->GetUserPort())); + AddTag(CECTag(EC_TAG_CLIENT_FROM, (uint64)client->GetSourceFrom())); + AddTag(CECTag(EC_TAG_CLIENT_SERVER_IP, client->GetServerIP())); + AddTag(CECTag(EC_TAG_CLIENT_SERVER_PORT, client->GetServerPort())); + AddTag(CECTag(EC_TAG_CLIENT_SERVER_NAME, client->GetServerName())); + + // Transfers to Client + AddTag(CECTag(EC_TAG_CLIENT_UP_SPEED, client->GetUploadDatarate())); + if (client->GetDownloadState() == DS_DOWNLOADING) { + AddTag(CECTag(EC_TAG_CLIENT_DOWN_SPEED, (uint64)(client->GetKBpsDown()*1024.0))); + } + AddTag(CECTag(EC_TAG_CLIENT_UPLOAD_SESSION, client->GetSessionUp())); + AddTag(CECTag(EC_TAG_PARTFILE_SIZE_XFER, client->GetTransferredDown())); + AddTag(CECTag(EC_TAG_CLIENT_UPLOAD_TOTAL, client->GetUploadedTotal())); + AddTag(CECTag(EC_TAG_CLIENT_DOWNLOAD_TOTAL, client->GetDownloadedTotal())); + + AddTag(CECTag(EC_TAG_CLIENT_STATE, + uint64((uint16)client->GetDownloadState() | (((uint16)client->GetUploadState()) << 8) ))); + AddTag(CECTag(EC_TAG_CLIENT_WAIT_TIME, client->GetWaitTime())); + AddTag(CECTag(EC_TAG_CLIENT_XFER_TIME, client->GetUpStartTimeDelay())); + AddTag(CECTag(EC_TAG_CLIENT_QUEUE_TIME, (uint64)(::GetTickCount() - client->GetWaitStartTime()))); + AddTag(CECTag(EC_TAG_CLIENT_LAST_TIME, (uint64)(::GetTickCount() - client->GetLastUpRequest()))); + AddTag(CECTag(EC_TAG_CLIENT_WAITING_POSITION, theApp->uploadqueue->GetWaitingPosition(client))); + + if (detail_level == EC_DETAIL_UPDATE) { + return; + } + const CKnownFile* file = client->GetUploadFile(); + if (file) { + AddTag(CECTag(EC_TAG_PARTFILE_NAME, file->GetFileName().GetPrintable())); + AddTag(CECTag(EC_TAG_KNOWNFILE, file->GetFileHash())); + } + +} + +CEC_UpDownClient_Tag::CEC_UpDownClient_Tag(const CUpDownClient* client, CValueMap &valuemap) : + CECTag(EC_TAG_CLIENT, client->GetUserIDHybrid()) +{ + // General + valuemap.CreateTag(EC_TAG_CLIENT_NAME, client->GetUserName(), this); + valuemap.CreateTag(EC_TAG_CLIENT_HASH, client->GetUserHash(), this); + valuemap.CreateTag(EC_TAG_CLIENT_SCORE, client->GetScore(false), this); + valuemap.CreateTag(EC_TAG_CLIENT_SOFTWARE, client->GetClientSoft(), this); + valuemap.CreateTag(EC_TAG_CLIENT_SOFT_VER_STR, client->GetSoftVerStr(), this); + valuemap.CreateTag(EC_TAG_CLIENT_USER_IP, client->GetConnectIP(), this); + valuemap.CreateTag(EC_TAG_CLIENT_USER_PORT, client->GetUserPort(), this); + valuemap.CreateTag(EC_TAG_CLIENT_FROM, (uint64)client->GetSourceFrom(), this); + valuemap.CreateTag(EC_TAG_CLIENT_SERVER_IP, client->GetServerIP(), this); + valuemap.CreateTag(EC_TAG_CLIENT_SERVER_PORT, client->GetServerPort(), this); + valuemap.CreateTag(EC_TAG_CLIENT_SERVER_NAME, client->GetServerName(), this); + + // Transfers to Client + valuemap.CreateTag(EC_TAG_CLIENT_UP_SPEED, client->GetUploadDatarate(), this); + valuemap.CreateTag(EC_TAG_CLIENT_DOWN_SPEED, (uint64)(client->GetKBpsDown()*1024.0), this); + valuemap.CreateTag(EC_TAG_CLIENT_UPLOAD_SESSION, client->GetSessionUp(), this); + valuemap.CreateTag(EC_TAG_PARTFILE_SIZE_XFER, client->GetTransferredDown(), this); + valuemap.CreateTag(EC_TAG_CLIENT_UPLOAD_TOTAL, client->GetUploadedTotal(), this); + valuemap.CreateTag(EC_TAG_CLIENT_DOWNLOAD_TOTAL, client->GetDownloadedTotal(), this); + + valuemap.CreateTag(EC_TAG_CLIENT_STATE, + uint64((uint16)client->GetDownloadState() | (((uint16)client->GetUploadState()) << 8) ), this); + valuemap.CreateTag(EC_TAG_CLIENT_WAIT_TIME, client->GetWaitTime(), this); + valuemap.CreateTag(EC_TAG_CLIENT_XFER_TIME, client->GetUpStartTimeDelay(), this); + valuemap.CreateTag(EC_TAG_CLIENT_QUEUE_TIME, (uint64)(::GetTickCount() - client->GetWaitStartTime()), this); + valuemap.CreateTag(EC_TAG_CLIENT_LAST_TIME, (uint64)(::GetTickCount() - client->GetLastUpRequest()), this); + valuemap.CreateTag(EC_TAG_CLIENT_WAITING_POSITION, theApp->uploadqueue->GetWaitingPosition(client), this); + + const CKnownFile* file = client->GetUploadFile(); + if (file) { + valuemap.CreateTag(EC_TAG_PARTFILE_NAME, file->GetFileName().GetPrintable(), this); + valuemap.CreateTag(EC_TAG_KNOWNFILE, file->GetFileHash(), this); + } + +} + +// +// Search reply +// +CEC_SearchFile_Tag::CEC_SearchFile_Tag(CSearchFile *file, EC_DETAIL_LEVEL detail_level) : CECTag(EC_TAG_SEARCHFILE, file->GetFileHash()) +{ + AddTag(CECTag(EC_TAG_PARTFILE_SOURCE_COUNT, file->GetSourceCount())); + AddTag(CECTag(EC_TAG_PARTFILE_SOURCE_COUNT_XFER, file->GetCompleteSourceCount())); + + if (detail_level == EC_DETAIL_UPDATE) { + return; + } + + AddTag(CECTag(EC_TAG_PARTFILE_NAME, file->GetFileName().GetPrintable())); + AddTag(CECTag(EC_TAG_PARTFILE_SIZE_FULL, file->GetFileSize())); + if ( theApp->sharedfiles->GetFileByID(file->GetFileHash()) ) { + AddTag(CECEmptyTag(EC_TAG_KNOWNFILE)); + } +} + +CEC_SearchFile_Tag::CEC_SearchFile_Tag(CSearchFile *file, CValueMap &valuemap) : CECTag(EC_TAG_SEARCHFILE, file->GetFileHash()) +{ + valuemap.CreateTag(EC_TAG_PARTFILE_SOURCE_COUNT, file->GetSourceCount(), this); + + valuemap.CreateTag(EC_TAG_PARTFILE_SOURCE_COUNT_XFER, file->GetCompleteSourceCount(), this); + + valuemap.CreateTag(EC_TAG_PARTFILE_NAME, file->GetFileName().GetPrintable(), this); + + valuemap.CreateTag(EC_TAG_PARTFILE_SIZE_FULL, file->GetFileSize(), this); + + if ( theApp->sharedfiles->GetFileByID(file->GetFileHash()) ) { + AddTag(CECEmptyTag(EC_TAG_KNOWNFILE)); + } +} +// File_checked_for_headers diff --git a/src/ECSpecialMuleTags.cpp b/src/ECSpecialMuleTags.cpp new file mode 100644 index 00000000..21f269e6 --- /dev/null +++ b/src/ECSpecialMuleTags.cpp @@ -0,0 +1,562 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 Kry ( elkry@sourceforge.net / http://www.amule.org ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + + +#include // Needed for CECTag +#include // Needed for special EC tag creator classes + +#include "Preferences.h" +#include "amule.h" + +CEC_Category_Tag::CEC_Category_Tag(uint32 cat_index, EC_DETAIL_LEVEL detail_level) : CECTag(EC_TAG_CATEGORY, cat_index) +{ + Category_Struct *cat = theApp->glob_prefs->GetCategory(cat_index); + switch (detail_level) { + case EC_DETAIL_UPDATE: + case EC_DETAIL_INC_UPDATE: + case EC_DETAIL_WEB: + case EC_DETAIL_FULL: + AddTag(CECTag(EC_TAG_CATEGORY_PATH, cat->path.GetRaw())); + AddTag(CECTag(EC_TAG_CATEGORY_COMMENT, cat->comment)); + AddTag(CECTag(EC_TAG_CATEGORY_COLOR, (uint32)cat->color)); + AddTag(CECTag(EC_TAG_CATEGORY_PRIO, cat->prio)); + case EC_DETAIL_CMD: + AddTag(CECTag(EC_TAG_CATEGORY_TITLE, cat->title)); + } +} + +CEC_Category_Tag::CEC_Category_Tag(uint32 cat_index, wxString name, wxString path, + wxString comment, uint32 color, uint8 prio) : CECTag(EC_TAG_CATEGORY, cat_index) +{ + AddTag(CECTag(EC_TAG_CATEGORY_PATH, path)); + AddTag(CECTag(EC_TAG_CATEGORY_COMMENT, comment)); + AddTag(CECTag(EC_TAG_CATEGORY_COLOR, color)); + AddTag(CECTag(EC_TAG_CATEGORY_PRIO, prio)); + AddTag(CECTag(EC_TAG_CATEGORY_TITLE, name)); +} + +void CEC_Category_Tag::Apply() +{ + theApp->glob_prefs->UpdateCategory(GetInt(), Name(), CPath(Path()), Comment(), Color(), Prio()); +} + +void CEC_Category_Tag::Create() +{ + theApp->glob_prefs->CreateCategory(Name(), CPath(Path()), Comment(), Color(), Prio()); +} + +CEC_Prefs_Packet::CEC_Prefs_Packet(uint32 selection, EC_DETAIL_LEVEL pref_details, EC_DETAIL_LEVEL cat_details) : CECPacket(EC_OP_SET_PREFERENCES, pref_details) +{ + if (selection & EC_PREFS_CATEGORIES) { + if (theApp->glob_prefs->GetCatCount() > 1) { + CECEmptyTag cats(EC_TAG_PREFS_CATEGORIES); + for (unsigned int i = 0; i < theApp->glob_prefs->GetCatCount(); ++i) { + CEC_Category_Tag catTag(i, cat_details); + cats.AddTag(catTag); + } + AddTag(cats); + } + } + + if (selection & EC_PREFS_GENERAL) { + CECEmptyTag user_prefs(EC_TAG_PREFS_GENERAL); + user_prefs.AddTag(CECTag(EC_TAG_USER_NICK, thePrefs::GetUserNick())); + user_prefs.AddTag(CECTag(EC_TAG_USER_HASH, thePrefs::GetUserHash())); + user_prefs.AddTag(CECTag(EC_TAG_USER_HOST, thePrefs::GetYourHostname())); + AddTag(user_prefs); + } + + if (selection & EC_PREFS_CONNECTIONS) { + CECEmptyTag connPrefs(EC_TAG_PREFS_CONNECTIONS); + connPrefs.AddTag(CECTag(EC_TAG_CONN_UL_CAP, thePrefs::GetMaxGraphUploadRate())); + connPrefs.AddTag(CECTag(EC_TAG_CONN_DL_CAP, thePrefs::GetMaxGraphDownloadRate())); + connPrefs.AddTag(CECTag(EC_TAG_CONN_MAX_UL, thePrefs::GetMaxUpload())); + connPrefs.AddTag(CECTag(EC_TAG_CONN_MAX_DL, thePrefs::GetMaxDownload())); + connPrefs.AddTag(CECTag(EC_TAG_CONN_SLOT_ALLOCATION, thePrefs::GetSlotAllocation())); + connPrefs.AddTag(CECTag(EC_TAG_CONN_TCP_PORT, thePrefs::GetPort())); + connPrefs.AddTag(CECTag(EC_TAG_CONN_UDP_PORT, thePrefs::GetUDPPort())); + if (thePrefs::IsUDPDisabled()) { + connPrefs.AddTag(CECEmptyTag(EC_TAG_CONN_UDP_DISABLE)); + } + connPrefs.AddTag(CECTag(EC_TAG_CONN_MAX_FILE_SOURCES, thePrefs::GetMaxSourcePerFile())); + connPrefs.AddTag(CECTag(EC_TAG_CONN_MAX_CONN, thePrefs::GetMaxConnections())); + if (thePrefs::DoAutoConnect()) { + connPrefs.AddTag(CECEmptyTag(EC_TAG_CONN_AUTOCONNECT)); + } + if (thePrefs::Reconnect()) { + connPrefs.AddTag(CECEmptyTag(EC_TAG_CONN_RECONNECT)); + } + if (thePrefs::GetNetworkED2K()) { + connPrefs.AddTag(CECEmptyTag(EC_TAG_NETWORK_ED2K)); + } + if (thePrefs::GetNetworkKademlia()) { + connPrefs.AddTag(CECEmptyTag(EC_TAG_NETWORK_KADEMLIA)); + } + AddTag(connPrefs); + } + + if (selection & EC_PREFS_MESSAGEFILTER) { + CECEmptyTag msg_prefs(EC_TAG_PREFS_MESSAGEFILTER); + if (thePrefs::MustFilterMessages()) { + msg_prefs.AddTag(CECEmptyTag(EC_TAG_MSGFILTER_ENABLED)); + } + if (thePrefs::IsFilterAllMessages()) { + msg_prefs.AddTag(CECEmptyTag(EC_TAG_MSGFILTER_ALL)); + } + if (thePrefs::MsgOnlyFriends()) { + msg_prefs.AddTag(CECEmptyTag(EC_TAG_MSGFILTER_FRIENDS)); + } + if (thePrefs::MsgOnlySecure()) { + msg_prefs.AddTag(CECEmptyTag(EC_TAG_MSGFILTER_SECURE)); + } + if (thePrefs::IsFilterByKeywords()) { + msg_prefs.AddTag(CECEmptyTag(EC_TAG_MSGFILTER_BY_KEYWORD)); + } + msg_prefs.AddTag(CECTag(EC_TAG_MSGFILTER_KEYWORDS, thePrefs::GetMessageFilterString())); + AddTag(msg_prefs); + } + + if (selection & EC_PREFS_REMOTECONTROLS) { + CECEmptyTag rc_prefs(EC_TAG_PREFS_REMOTECTRL); + rc_prefs.AddTag(CECTag(EC_TAG_WEBSERVER_PORT, thePrefs::GetWSPort())); + if (thePrefs::GetWSIsEnabled()) { + rc_prefs.AddTag(CECEmptyTag(EC_TAG_WEBSERVER_AUTORUN)); + } + if (!thePrefs::GetWSPass().IsEmpty()) { + CMD4Hash passhash; + wxCHECK2(passhash.Decode(thePrefs::GetWSPass()), /* Do nothing. */); + rc_prefs.AddTag(CECTag(EC_TAG_PASSWD_HASH, passhash)); + } + if (thePrefs::GetWSIsLowUserEnabled()) { + CECEmptyTag lowUser(EC_TAG_WEBSERVER_GUEST); + if (!thePrefs::GetWSLowPass().IsEmpty()) { + CMD4Hash passhash; + wxCHECK2(passhash.Decode(thePrefs::GetWSLowPass()), /* Do nothing. */); + lowUser.AddTag(CECTag(EC_TAG_PASSWD_HASH, passhash)); + } + rc_prefs.AddTag(lowUser); + } + if (thePrefs::GetWebUseGzip()) { + rc_prefs.AddTag(CECEmptyTag(EC_TAG_WEBSERVER_USEGZIP)); + } + rc_prefs.AddTag(CECTag(EC_TAG_WEBSERVER_REFRESH, thePrefs::GetWebPageRefresh())); + rc_prefs.AddTag(CECTag(EC_TAG_WEBSERVER_TEMPLATE, thePrefs::GetWebTemplate())); + AddTag(rc_prefs); + } + + if (selection & EC_PREFS_ONLINESIG) { + CECEmptyTag online_sig(EC_TAG_PREFS_ONLINESIG); + if (thePrefs::IsOnlineSignatureEnabled()) { + online_sig.AddTag(CECEmptyTag(EC_TAG_ONLINESIG_ENABLED)); + } + AddTag(online_sig); + } + + if (selection & EC_PREFS_SERVERS) { + CECEmptyTag srv_prefs(EC_TAG_PREFS_SERVERS); + if (thePrefs::DeadServer()) { + srv_prefs.AddTag(CECEmptyTag(EC_TAG_SERVERS_REMOVE_DEAD)); + } + srv_prefs.AddTag(CECTag(EC_TAG_SERVERS_DEAD_SERVER_RETRIES, (uint16)thePrefs::GetDeadserverRetries())); + if (thePrefs::AutoServerlist()) { + srv_prefs.AddTag(CECEmptyTag(EC_TAG_SERVERS_AUTO_UPDATE)); + } + // Here should come the URL list... + if (thePrefs::AddServersFromServer()) { + srv_prefs.AddTag(CECEmptyTag(EC_TAG_SERVERS_ADD_FROM_SERVER)); + } + if (thePrefs::AddServersFromClient()) { + srv_prefs.AddTag(CECEmptyTag(EC_TAG_SERVERS_ADD_FROM_CLIENT)); + } + if (thePrefs::Score()) { + srv_prefs.AddTag(CECEmptyTag(EC_TAG_SERVERS_USE_SCORE_SYSTEM)); + } + if (thePrefs::GetSmartIdCheck()) { + srv_prefs.AddTag(CECEmptyTag(EC_TAG_SERVERS_SMART_ID_CHECK)); + } + if (thePrefs::IsSafeServerConnectEnabled()) { + srv_prefs.AddTag(CECEmptyTag(EC_TAG_SERVERS_SAFE_SERVER_CONNECT)); + } + if (thePrefs::AutoConnectStaticOnly()) { + srv_prefs.AddTag(CECEmptyTag(EC_TAG_SERVERS_AUTOCONN_STATIC_ONLY)); + } + if (thePrefs::IsManualHighPrio()) { + srv_prefs.AddTag(CECEmptyTag(EC_TAG_SERVERS_MANUAL_HIGH_PRIO)); + } + srv_prefs.AddTag(CECTag(EC_TAG_SERVERS_UPDATE_URL, thePrefs::GetEd2kServersUrl())); + AddTag(srv_prefs); + } + + if (selection & EC_PREFS_FILES) { + CECEmptyTag filePrefs(EC_TAG_PREFS_FILES); + if (thePrefs::IsICHEnabled()) { + filePrefs.AddTag(CECEmptyTag(EC_TAG_FILES_ICH_ENABLED)); + } + if (thePrefs::IsTrustingEveryHash()) { + filePrefs.AddTag(CECEmptyTag(EC_TAG_FILES_AICH_TRUST)); + } + if (thePrefs::AddNewFilesPaused()) { + filePrefs.AddTag(CECEmptyTag(EC_TAG_FILES_NEW_PAUSED)); + } + if (thePrefs::GetNewAutoDown()) { + filePrefs.AddTag(CECEmptyTag(EC_TAG_FILES_NEW_AUTO_DL_PRIO)); + } + if (thePrefs::GetPreviewPrio()) { + filePrefs.AddTag(CECEmptyTag(EC_TAG_FILES_PREVIEW_PRIO)); + } + if (thePrefs::GetNewAutoUp()) { + filePrefs.AddTag(CECEmptyTag(EC_TAG_FILES_NEW_AUTO_UL_PRIO)); + } + if (thePrefs::TransferFullChunks()) { + filePrefs.AddTag(CECEmptyTag(EC_TAG_FILES_UL_FULL_CHUNKS)); + } + if (thePrefs::StartNextFile()) { + filePrefs.AddTag(CECEmptyTag(EC_TAG_FILES_START_NEXT_PAUSED)); + } + if (thePrefs::StartNextFileSame()) { + filePrefs.AddTag(CECEmptyTag(EC_TAG_FILES_RESUME_SAME_CAT)); + } + if (thePrefs::GetSrcSeedsOn()) { + filePrefs.AddTag(CECEmptyTag(EC_TAG_FILES_SAVE_SOURCES)); + } + if (thePrefs::GetExtractMetaData()) { + filePrefs.AddTag(CECEmptyTag(EC_TAG_FILES_EXTRACT_METADATA)); + } + if (thePrefs::GetAllocFullChunk()) { + filePrefs.AddTag(CECEmptyTag(EC_TAG_FILES_ALLOC_FULL_CHUNKS)); + } + if (thePrefs::GetAllocFullPart()) { + filePrefs.AddTag(CECEmptyTag(EC_TAG_FILES_ALLOC_FULL_SIZE)); + } + if (thePrefs::IsCheckDiskspaceEnabled()) { + filePrefs.AddTag(CECEmptyTag(EC_TAG_FILES_CHECK_FREE_SPACE)); + } + filePrefs.AddTag(CECTag(EC_TAG_FILES_MIN_FREE_SPACE, thePrefs::GetMinFreeDiskSpace())); + AddTag(filePrefs); + } + + if (selection & EC_PREFS_SRCDROP) { + CECEmptyTag srcdrop(EC_TAG_PREFS_SRCDROP); + srcdrop.AddTag(CECTag(EC_TAG_SRCDROP_NONEEDED, (uint8)thePrefs::GetNoNeededSources())); + if (thePrefs::DropFullQueueSources()) { + srcdrop.AddTag(CECEmptyTag(EC_TAG_SRCDROP_DROP_FQS)); + } + if (thePrefs::DropHighQueueRankingSources()) { + srcdrop.AddTag(CECEmptyTag(EC_TAG_SRCDROP_DROP_HQRS)); + } + srcdrop.AddTag(CECTag(EC_TAG_SRCDROP_HQRS_VALUE, (uint16)thePrefs::HighQueueRanking())); + srcdrop.AddTag(CECTag(EC_TAG_SRCDROP_AUTODROP_TIMER, (uint16)thePrefs::GetAutoDropTimer())); + AddTag(srcdrop); + } + + if (selection & EC_PREFS_DIRECTORIES) { + //#warning TODO + } + + if (selection & EC_PREFS_STATISTICS) { + //#warning TODO + } + + if (selection & EC_PREFS_SECURITY) { + CECEmptyTag secPrefs(EC_TAG_PREFS_SECURITY); + secPrefs.AddTag(CECTag(EC_TAG_SECURITY_CAN_SEE_SHARES, thePrefs::CanSeeShares())); + if (thePrefs::IsFilteringClients()) { + secPrefs.AddTag(CECEmptyTag(EC_TAG_IPFILTER_CLIENTS)); + } + if (thePrefs::IsFilteringServers()) { + secPrefs.AddTag(CECEmptyTag(EC_TAG_IPFILTER_SERVERS)); + } + if (thePrefs::IPFilterAutoLoad()) { + secPrefs.AddTag(CECEmptyTag(EC_TAG_IPFILTER_AUTO_UPDATE)); + } + secPrefs.AddTag(CECTag(EC_TAG_IPFILTER_UPDATE_URL, thePrefs::IPFilterURL())); + secPrefs.AddTag(CECTag(EC_TAG_IPFILTER_LEVEL, thePrefs::GetIPFilterLevel())); + if (thePrefs::FilterLanIPs()) { + secPrefs.AddTag(CECEmptyTag(EC_TAG_IPFILTER_FILTER_LAN)); + } + if (thePrefs::IsSecureIdentEnabled()) { + secPrefs.AddTag(CECEmptyTag(EC_TAG_SECURITY_USE_SECIDENT)); + } + + if (thePrefs::IsClientCryptLayerSupported()) { + secPrefs.AddTag(CECEmptyTag(EC_TAG_SECURITY_OBFUSCATION_SUPPORTED)); + } + if (thePrefs::IsClientCryptLayerRequested()) { + secPrefs.AddTag(CECEmptyTag(EC_TAG_SECURITY_OBFUSCATION_REQUESTED)); + } + if (thePrefs::IsClientCryptLayerRequired()) { + secPrefs.AddTag(CECEmptyTag(EC_TAG_SECURITY_OBFUSCATION_REQUIRED)); + } + + AddTag(secPrefs); + } + + if (selection & EC_PREFS_CORETWEAKS) { + CECEmptyTag cwPrefs(EC_TAG_PREFS_CORETWEAKS); + cwPrefs.AddTag(CECTag(EC_TAG_CORETW_MAX_CONN_PER_FIVE, thePrefs::GetMaxConperFive())); + if (thePrefs::GetVerbose()) { + cwPrefs.AddTag(CECEmptyTag(EC_TAG_CORETW_VERBOSE)); + } + cwPrefs.AddTag(CECTag(EC_TAG_CORETW_FILEBUFFER, thePrefs::GetFileBufferSize())); + cwPrefs.AddTag(CECTag(EC_TAG_CORETW_UL_QUEUE, thePrefs::GetQueueSize())); + cwPrefs.AddTag(CECTag(EC_TAG_CORETW_SRV_KEEPALIVE_TIMEOUT, thePrefs::GetServerKeepAliveTimeout())); + AddTag(cwPrefs); + } + + if (selection & EC_PREFS_KADEMLIA) { + CECEmptyTag kadPrefs(EC_TAG_PREFS_KADEMLIA); + kadPrefs.AddTag(CECTag(EC_TAG_KADEMLIA_UPDATE_URL, thePrefs::GetKadNodesUrl())); + AddTag(kadPrefs); + } +} + +/** + * Applies a boolean value from the set_preferences request + * + * @param use_tag If true, an unset variable means "leave unchanged". If false, an unset variable means false. + * @param thisTab The TAG that contains the TAG with a boolean value + * @param applyFunc The function to use for applying the value + * @param tagName The name of the TAG that holds the boolean value + */ +void ApplyBoolean(bool use_tag, const CECTag *thisTab, void (applyFunc)(bool), int tagName) +{ + const CECTag *boolTag = thisTab->GetTagByName(tagName); + if (use_tag) { + if (boolTag != NULL) { + applyFunc(boolTag->GetInt() != 0); + } + } else { + applyFunc(boolTag != NULL); + } +} + +/* + * This will set all preferences except of categories, which are work as following: + * -> On remote gui they are loaded on startup, and then changed on-command + * -> Webserver doesn't supposed to change it. + */ +void CEC_Prefs_Packet::Apply() +{ + const CECTag *thisTab = NULL; + const CECTag *oneTag = NULL; + + if ((thisTab = GetTagByName(EC_TAG_PREFS_GENERAL)) != NULL) { + if ((oneTag = thisTab->GetTagByName(EC_TAG_USER_NICK)) != NULL) { + thePrefs::SetUserNick(oneTag->GetStringData()); + } + if ((oneTag = thisTab->GetTagByName(EC_TAG_USER_HASH)) != NULL) { + thePrefs::SetUserHash(oneTag->GetMD4Data()); + } + if ((oneTag = thisTab->GetTagByName(EC_TAG_USER_HOST)) != NULL) { + thePrefs::SetYourHostname(oneTag->GetStringData()); + } + } + + // + // webserver doesn't transmit all boolean values + // + bool use_tag = (GetDetailLevel() == EC_DETAIL_FULL); + + if ((thisTab = GetTagByName(EC_TAG_PREFS_CONNECTIONS)) != NULL) { + if ((oneTag = thisTab->GetTagByName(EC_TAG_CONN_UL_CAP)) != NULL) { + thePrefs::SetMaxGraphUploadRate(oneTag->GetInt()); + } + if ((oneTag = thisTab->GetTagByName(EC_TAG_CONN_DL_CAP)) != NULL) { + thePrefs::SetMaxGraphDownloadRate(oneTag->GetInt()); + } + if ((oneTag = thisTab->GetTagByName(EC_TAG_CONN_MAX_UL)) != NULL) { + thePrefs::SetMaxUpload(oneTag->GetInt()); + } + if ((oneTag = thisTab->GetTagByName(EC_TAG_CONN_MAX_DL)) != NULL) { + thePrefs::SetMaxDownload(oneTag->GetInt()); + } + if ((oneTag = thisTab->GetTagByName(EC_TAG_CONN_SLOT_ALLOCATION)) != NULL) { + thePrefs::SetSlotAllocation(oneTag->GetInt()); + } + if ((oneTag = thisTab->GetTagByName(EC_TAG_CONN_TCP_PORT)) != NULL) { + thePrefs::SetPort(oneTag->GetInt()); + } + if ((oneTag = thisTab->GetTagByName(EC_TAG_CONN_UDP_PORT)) != NULL) { + thePrefs::SetUDPPort(oneTag->GetInt()); + } + ApplyBoolean(use_tag, thisTab, thePrefs::SetUDPDisable, EC_TAG_CONN_UDP_DISABLE); + if ((oneTag = thisTab->GetTagByName(EC_TAG_CONN_MAX_FILE_SOURCES)) != NULL) { + thePrefs::SetMaxSourcesPerFile(oneTag->GetInt()); + } + if ((oneTag = thisTab->GetTagByName(EC_TAG_CONN_MAX_CONN)) != NULL) { + thePrefs::SetMaxConnections(oneTag->GetInt()); + } + ApplyBoolean(use_tag, thisTab, thePrefs::SetAutoConnect, EC_TAG_CONN_AUTOCONNECT); + ApplyBoolean(use_tag, thisTab, thePrefs::SetReconnect, EC_TAG_CONN_RECONNECT); + ApplyBoolean(use_tag, thisTab, thePrefs::SetNetworkED2K, EC_TAG_NETWORK_ED2K); + ApplyBoolean(use_tag, thisTab, thePrefs::SetNetworkKademlia, EC_TAG_NETWORK_KADEMLIA); + } + + if ((thisTab = GetTagByName(EC_TAG_PREFS_MESSAGEFILTER)) != NULL) { + ApplyBoolean(use_tag, thisTab, thePrefs::SetMustFilterMessages, EC_TAG_MSGFILTER_ENABLED); + ApplyBoolean(use_tag, thisTab, thePrefs::SetFilterAllMessages, EC_TAG_MSGFILTER_ALL); + ApplyBoolean(use_tag, thisTab, thePrefs::SetMsgOnlyFriends, EC_TAG_MSGFILTER_FRIENDS); + ApplyBoolean(use_tag, thisTab, thePrefs::SetMsgOnlySecure, EC_TAG_MSGFILTER_SECURE); + ApplyBoolean(use_tag, thisTab, thePrefs::SetFilterByKeywords, EC_TAG_MSGFILTER_BY_KEYWORD); + if ((oneTag = thisTab->GetTagByName(EC_TAG_MSGFILTER_KEYWORDS)) != NULL) { + thePrefs::SetMessageFilterString(oneTag->GetStringData()); + } + } + + if ((thisTab = GetTagByName(EC_TAG_PREFS_REMOTECTRL)) != NULL) { + ApplyBoolean(use_tag, thisTab, thePrefs::SetWSIsEnabled, EC_TAG_WEBSERVER_AUTORUN); + if ((oneTag = thisTab->GetTagByName(EC_TAG_WEBSERVER_PORT)) != NULL) { + thePrefs::SetWSPort(oneTag->GetInt()); + } + if ((oneTag = thisTab->GetTagByName(EC_TAG_PASSWD_HASH)) != NULL) { + thePrefs::SetWSPass(oneTag->GetMD4Data().Encode()); + } + ApplyBoolean(use_tag, thisTab, thePrefs::SetWSIsLowUserEnabled, EC_TAG_WEBSERVER_GUEST); + if ((oneTag = thisTab->GetTagByName(EC_TAG_WEBSERVER_GUEST)) != NULL) { + if ((oneTag->GetTagByName(EC_TAG_PASSWD_HASH)) != NULL) { + thePrefs::SetWSLowPass(oneTag->GetTagByName(EC_TAG_PASSWD_HASH)->GetMD4Data().Encode()); + } + } + ApplyBoolean(use_tag, thisTab, thePrefs::SetWebUseGzip, EC_TAG_WEBSERVER_USEGZIP); + if ((oneTag = thisTab->GetTagByName(EC_TAG_WEBSERVER_REFRESH)) != NULL) { + thePrefs::SetWebPageRefresh(oneTag->GetInt()); + } + if ((oneTag = thisTab->GetTagByName(EC_TAG_WEBSERVER_TEMPLATE)) != NULL) { + thePrefs::SetWebTemplate(oneTag->GetStringData()); + } + } + + if ((thisTab = GetTagByName(EC_TAG_PREFS_ONLINESIG)) != NULL) { + ApplyBoolean(use_tag, thisTab, thePrefs::SetOnlineSignatureEnabled, EC_TAG_ONLINESIG_ENABLED); + } + + if ((thisTab = GetTagByName(EC_TAG_PREFS_SERVERS)) != NULL) { + ApplyBoolean(use_tag, thisTab, thePrefs::SetDeadServer, EC_TAG_SERVERS_REMOVE_DEAD); + if ((oneTag = thisTab->GetTagByName(EC_TAG_SERVERS_DEAD_SERVER_RETRIES)) != NULL) { + thePrefs::SetDeadserverRetries(oneTag->GetInt()); + } + ApplyBoolean(use_tag, thisTab, thePrefs::SetAutoServerlist, EC_TAG_SERVERS_AUTO_UPDATE); + // Here should come the URL list... + ApplyBoolean(use_tag, thisTab, thePrefs::SetAddServersFromServer, EC_TAG_SERVERS_ADD_FROM_SERVER); + ApplyBoolean(use_tag, thisTab, thePrefs::SetAddServersFromClient, EC_TAG_SERVERS_ADD_FROM_CLIENT); + ApplyBoolean(use_tag, thisTab, thePrefs::SetScoreSystem, EC_TAG_SERVERS_USE_SCORE_SYSTEM); + ApplyBoolean(use_tag, thisTab, thePrefs::SetSmartIdCheck, EC_TAG_SERVERS_SMART_ID_CHECK); + ApplyBoolean(use_tag, thisTab, thePrefs::SetSafeServerConnectEnabled, EC_TAG_SERVERS_SAFE_SERVER_CONNECT); + ApplyBoolean(use_tag, thisTab, thePrefs::SetAutoConnectStaticOnly, EC_TAG_SERVERS_AUTOCONN_STATIC_ONLY); + ApplyBoolean(use_tag, thisTab, thePrefs::SetManualHighPrio, EC_TAG_SERVERS_MANUAL_HIGH_PRIO); + if ((oneTag = thisTab->GetTagByName(EC_TAG_SERVERS_UPDATE_URL)) != NULL) { + thePrefs::SetEd2kServersUrl(oneTag->GetStringData()); + } + } + + if ((thisTab = GetTagByName(EC_TAG_PREFS_FILES)) != NULL) { + ApplyBoolean(use_tag, thisTab, thePrefs::SetICHEnabled, EC_TAG_FILES_ICH_ENABLED); + ApplyBoolean(use_tag, thisTab, thePrefs::SetTrustingEveryHash, EC_TAG_FILES_AICH_TRUST); + ApplyBoolean(use_tag, thisTab, thePrefs::SetAddNewFilesPaused, EC_TAG_FILES_NEW_PAUSED); + ApplyBoolean(use_tag, thisTab, thePrefs::SetNewAutoDown, EC_TAG_FILES_NEW_AUTO_DL_PRIO); + ApplyBoolean(use_tag, thisTab, thePrefs::SetPreviewPrio, EC_TAG_FILES_PREVIEW_PRIO); + ApplyBoolean(use_tag, thisTab, thePrefs::SetNewAutoUp, EC_TAG_FILES_NEW_AUTO_UL_PRIO); + ApplyBoolean(use_tag, thisTab, thePrefs::SetTransferFullChunks, EC_TAG_FILES_UL_FULL_CHUNKS); + ApplyBoolean(use_tag, thisTab, thePrefs::SetStartNextFile, EC_TAG_FILES_START_NEXT_PAUSED); + ApplyBoolean(use_tag, thisTab, thePrefs::SetStartNextFileSame, EC_TAG_FILES_RESUME_SAME_CAT); + ApplyBoolean(use_tag, thisTab, thePrefs::SetSrcSeedsOn, EC_TAG_FILES_SAVE_SOURCES); + ApplyBoolean(use_tag, thisTab, thePrefs::SetExtractMetaData, EC_TAG_FILES_EXTRACT_METADATA); + ApplyBoolean(use_tag, thisTab, thePrefs::SetAllocFullChunk, EC_TAG_FILES_ALLOC_FULL_CHUNKS); + ApplyBoolean(use_tag, thisTab, thePrefs::SetAllocFullPart, EC_TAG_FILES_ALLOC_FULL_SIZE); + ApplyBoolean(use_tag, thisTab, thePrefs::SetCheckDiskspaceEnabled, EC_TAG_FILES_CHECK_FREE_SPACE); + if ((oneTag = thisTab->GetTagByName(EC_TAG_FILES_MIN_FREE_SPACE)) != NULL) { + thePrefs::SetMinFreeDiskSpace(oneTag->GetInt()); + } + } + + if ((thisTab = GetTagByName(EC_TAG_PREFS_SRCDROP)) != NULL) { + if ((oneTag = thisTab->GetTagByName(EC_TAG_SRCDROP_NONEEDED)) != NULL) { + thePrefs::SetNoNeededSources(oneTag->GetInt()); + } + ApplyBoolean(use_tag, thisTab, thePrefs::SetDropFullQueueSources, EC_TAG_SRCDROP_DROP_FQS); + ApplyBoolean(use_tag, thisTab, thePrefs::SetDropHighQueueRankingSources, EC_TAG_SRCDROP_DROP_HQRS); + if ((oneTag = thisTab->GetTagByName(EC_TAG_SRCDROP_HQRS_VALUE)) != NULL) { + thePrefs::SetHighQueueRanking(oneTag->GetInt()); + } + if ((oneTag = thisTab->GetTagByName(EC_TAG_SRCDROP_AUTODROP_TIMER)) != NULL) { + thePrefs::SetAutoDropTimer(oneTag->GetInt()); + } + } + + if ((thisTab = GetTagByName(EC_TAG_PREFS_DIRECTORIES)) != NULL) { + //#warning TODO + } + + if ((thisTab = GetTagByName(EC_TAG_PREFS_STATISTICS)) != NULL) { + //#warning TODO + } + + if ((thisTab = GetTagByName(EC_TAG_PREFS_SECURITY)) != NULL) { + if ((oneTag = thisTab->GetTagByName(EC_TAG_SECURITY_CAN_SEE_SHARES)) != NULL) { + thePrefs::SetCanSeeShares(oneTag->GetInt()); + } + ApplyBoolean(use_tag, thisTab, thePrefs::SetFilteringClients, EC_TAG_IPFILTER_CLIENTS); + ApplyBoolean(use_tag, thisTab, thePrefs::SetFilteringServers, EC_TAG_IPFILTER_SERVERS); + ApplyBoolean(use_tag, thisTab, thePrefs::SetIPFilterAutoLoad, EC_TAG_IPFILTER_AUTO_UPDATE); + if ((oneTag = thisTab->GetTagByName(EC_TAG_IPFILTER_UPDATE_URL)) != NULL) { + thePrefs::SetIPFilterURL(oneTag->GetStringData()); + } + if ((oneTag = thisTab->GetTagByName(EC_TAG_IPFILTER_LEVEL)) != NULL) { + thePrefs::SetIPFilterLevel(oneTag->GetInt()); + } + ApplyBoolean(use_tag, thisTab, thePrefs::SetFilterLanIPs, EC_TAG_IPFILTER_FILTER_LAN); + ApplyBoolean(use_tag, thisTab, thePrefs::SetSecureIdentEnabled, EC_TAG_SECURITY_USE_SECIDENT); + + ApplyBoolean(use_tag, thisTab, thePrefs::SetClientCryptLayerSupported, EC_TAG_SECURITY_OBFUSCATION_SUPPORTED); + ApplyBoolean(use_tag, thisTab, thePrefs::SetClientCryptLayerRequested, EC_TAG_SECURITY_OBFUSCATION_REQUESTED); + ApplyBoolean(use_tag, thisTab, thePrefs::SetClientCryptLayerRequired, EC_TAG_SECURITY_OBFUSCATION_REQUIRED); + } + + if ((thisTab = GetTagByName(EC_TAG_PREFS_CORETWEAKS)) != NULL) { + if ((oneTag = thisTab->GetTagByName(EC_TAG_CORETW_MAX_CONN_PER_FIVE)) != NULL) { + thePrefs::SetMaxConsPerFive(oneTag->GetInt()); + } + ApplyBoolean(use_tag, thisTab, thePrefs::SetVerbose, EC_TAG_CORETW_VERBOSE); + if ((oneTag = thisTab->GetTagByName(EC_TAG_CORETW_FILEBUFFER)) != NULL) { + thePrefs::SetFileBufferSize(oneTag->GetInt()); + } + if ((oneTag = thisTab->GetTagByName(EC_TAG_CORETW_UL_QUEUE)) != NULL) { + thePrefs::SetQueueSize(oneTag->GetInt()); + } + if ((oneTag = thisTab->GetTagByName(EC_TAG_CORETW_SRV_KEEPALIVE_TIMEOUT)) != NULL) { + thePrefs::SetServerKeepAliveTimeout(oneTag->GetInt()); + } + } + + if ((thisTab = GetTagByName(EC_TAG_PREFS_KADEMLIA)) != NULL) { + if ((oneTag = thisTab->GetTagByName(EC_TAG_KADEMLIA_UPDATE_URL)) != NULL) { + thePrefs::SetKadNodesUrl(oneTag->GetStringData()); + } + } + + theApp->glob_prefs->Save(); +} +// File_checked_for_headers diff --git a/src/ED2KLink.cpp b/src/ED2KLink.cpp new file mode 100644 index 00000000..c49c2903 --- /dev/null +++ b/src/ED2KLink.cpp @@ -0,0 +1,311 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include + +#include "ED2KLink.h" // Interface declarations. + +#include +#include // Needed for wxRegEx +#include // Needed for wxStringTokenizer + +#include + +#include "MemFile.h" // Needed for CMemFile +#include "NetworkFunctions.h" // Needed for Uint32toStringIP + + + +CED2KLink::CED2KLink( LinkType type ) + : m_type( type ) +{ +} + + +CED2KLink::~CED2KLink() +{ +} + + +CED2KLink::LinkType CED2KLink::GetKind() const +{ + return m_type; +} + + +CED2KLink* CED2KLink::CreateLinkFromUrl(const wxString& link) +{ + wxRegEx re_type(wxT("ed2k://\\|(file|server|serverlist)\\|.*/"), wxRE_ICASE | wxRE_DEFAULT); + wxCHECK(re_type.IsValid(), NULL); + + if (!re_type.Matches(link)) { + throw wxString(wxT("Not a valid ed2k-URI")); + } + + wxString type = re_type.GetMatch(link, 1).MakeLower(); + wxCHECK(type.Length(), NULL); + + if (type == wxT("file")) { + return new CED2KFileLink(link); + } else if (type == wxT("server")) { + return new CED2KServerLink(link); + } else if (type == wxT("serverlist")) { + return new CED2KServerListLink(link); + } else { + wxCHECK(false, NULL); + } +} + + +///////////////////////////////////////////// +// CED2KServerListLink implementation +///////////////////////////////////////////// +CED2KServerListLink::CED2KServerListLink(const wxString& link) + : CED2KLink( kServerList ) +{ + wxRegEx re(wxT("ed2k://\\|serverlist\\|(.*)\\|/"), wxRE_ICASE | wxRE_DEFAULT); + if (!re.Matches(link)) { + throw wxString(wxT("Not a valid server-list link.")); + } + + m_address = UnescapeHTML(re.GetMatch(link, 1)); +} + + +wxString CED2KServerListLink::GetLink() const +{ + return wxT("ed2k://|serverlist|") + m_address + wxT("|/"); +} + + +const wxString& CED2KServerListLink::GetAddress() const +{ + return m_address; +} + + +///////////////////////////////////////////// +// CED2KServerLink implementation +///////////////////////////////////////////// +CED2KServerLink::CED2KServerLink(const wxString& link) + : CED2KLink( kServer ) +{ + wxRegEx re(wxT("ed2k://\\|server\\|([^\\|]+)\\|([0-9]+)\\|/"), wxRE_ICASE | wxRE_DEFAULT); + if (!re.Matches(link)) { + throw wxString(wxT("Not a valid server link.")); + } + + wxString ip = UnescapeHTML(re.GetMatch(link, 1)); + wxString port = re.GetMatch(link, 2); + + unsigned long ul = StrToULong(port); + if (ul > 0xFFFF || ul == 0) { + throw wxString( wxT("Bad port number") ); + } + + m_port = static_cast(ul); + m_ip = StringIPtoUint32(ip); +} + + +wxString CED2KServerLink::GetLink() const +{ + return wxString(wxT("ed2k://|server|")) << Uint32toStringIP(m_ip) << wxT("|") << m_port << wxT("|/"); +} + + +uint32 CED2KServerLink::GetIP() const +{ + return m_ip; +} + + +uint16 CED2KServerLink::GetPort() const +{ + return m_port; +} + + +///////////////////////////////////////////// +// CED2KFileLink implementation +///////////////////////////////////////////// +CED2KFileLink::CED2KFileLink(const wxString& link) + : CED2KLink( kFile ), + m_hashset(NULL), + m_size(0), + m_bAICHHashValid(false) +{ + // Start tokenizing after the "ed2k:://|file|" part of the link + wxStringTokenizer tokens(link.Mid(13), wxT("|/"), wxTOKEN_RET_EMPTY_ALL); + + // Must at least be ed2k://|file|NAME|SIZE|HASH|/ + if (tokens.CountTokens() < 5) { + throw wxString(wxT("Not a valid file link")); + } + + m_name = UnescapeHTML(tokens.GetNextToken().Strip(wxString::both)); + + // Note that StrToULong returns ULONG_MAX if the value is + // too large to be contained in a unsigned long, which means + // that this check is valid, as odd as it seems + wxString size = tokens.GetNextToken().Strip(wxString::both); + m_size = StrToULongLong(size); + if ((m_size == 0) || (m_size > MAX_FILE_SIZE)) { + throw wxString::Format(wxT("Invalid file size %i"), m_size); + } + + if (!m_hash.Decode(tokens.GetNextToken().Strip(wxString::both))) { + throw wxString(wxT("Invalid hash")); + } + + // Check extra fields (sources, parthashes, masterhashes) + while (tokens.HasMoreTokens()) { + wxString field = tokens.GetNextToken().MakeLower().Strip(wxString::both); + + if (field.StartsWith(wxT("sources,"))) { + wxStringTokenizer srcTokens(field, wxT(",")); + // Skipping the first token ("sources"). + wxString token = srcTokens.GetNextToken(); + while (srcTokens.HasMoreTokens()) { + token = srcTokens.GetNextToken().Strip(wxString::both); + + wxStringTokenizer sourceTokens(token, wxT(":")); + wxString addr = sourceTokens.GetNextToken(); + if (addr.IsEmpty()) { + throw wxString( wxT("Empty address" ) ); + } + + wxString strport = sourceTokens.GetNextToken(); + if (strport.IsEmpty()) { + throw wxString( wxT("Empty port" ) ); + } + + unsigned port = StrToULong(strport); + + // Sanity checking + if ((port == 0) || (port > 0xFFFF)) { + throw wxString( wxT("Invalid Port" ) ); + } + + wxString sourcehash; + uint8 cryptoptions =0; + wxString strcryptoptions = sourceTokens.GetNextToken(); + if (!strcryptoptions.IsEmpty()) { + cryptoptions = (uint8) StrToULong(strcryptoptions); + if ((cryptoptions & 0x80) > 0) { + // Source ready for encryption, hash included. + sourcehash = sourceTokens.GetNextToken(); + if (sourcehash.IsEmpty()) { + throw wxString( wxT("Empty sourcehash conflicts with cryptoptions flag 0x80" ) ); + } + } + } + + SED2KLinkSource entry = { addr, port, sourcehash, cryptoptions }; + + m_sources.push_back(entry); + } + } else if (field.StartsWith(wxT("p="))) { + wxStringTokenizer hashTokens(field.AfterFirst(wxT('=')), wxT(":"), wxTOKEN_RET_EMPTY_ALL); + + m_hashset = new CMemFile(); + m_hashset->WriteHash(m_hash); + m_hashset->WriteUInt16(0); + + while (hashTokens.HasMoreTokens()) { + CMD4Hash hash; + if (!hash.Decode(hashTokens.GetNextToken().Strip(wxString::both))) { + throw wxString(wxT("Invalid hash in part-hashes list")); + } + + m_hashset->WriteHash(hash); + } + + unsigned count = m_hashset->GetLength() / 16u - 1u; + + if (count) { + m_hashset->Seek( 16, wxFromStart); + m_hashset->WriteUInt16( count ); + m_hashset->Seek( 0, wxFromStart); + } else { + delete m_hashset; + m_hashset = NULL; + } + } else if (field.StartsWith(wxT("h="))) { + wxString hash = field.AfterFirst(wxT('=')).MakeUpper(); + + size_t decodedSize = DecodeBase32(hash, CAICHHash::GetHashSize(), m_AICHHash.GetRawHash()); + if ((decodedSize != CAICHHash::GetHashSize()) || m_AICHHash.GetString() != hash) { + throw wxString(wxT("Invalid master-hash")); + } + + m_bAICHHashValid = true; + } + } +} + + +CED2KFileLink::~CED2KFileLink() +{ + delete m_hashset; + m_hashset = NULL; +} + + +wxString CED2KFileLink::GetLink() const +{ + return wxT("ed2k://|file|") + m_name + wxString::Format(wxT("|%u|"), m_size) + m_hash.Encode() + wxT("|/"); +} + + +wxString CED2KFileLink::GetName() const +{ + return m_name; +} + + +uint64 CED2KFileLink::GetSize() const +{ + return m_size; +} + + +const CMD4Hash& CED2KFileLink::GetHashKey() const +{ + return m_hash; +} + + +bool CED2KFileLink::HasValidAICHHash() const +{ + return m_bAICHHashValid; +} + + +const CAICHHash& CED2KFileLink::GetAICHHash() const +{ + return m_AICHHash; +} +// File_checked_for_headers diff --git a/src/ED2KLink.h b/src/ED2KLink.h new file mode 100644 index 00000000..215ccab6 --- /dev/null +++ b/src/ED2KLink.h @@ -0,0 +1,150 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef ED2KLINK_H +#define ED2KLINK_H + + +#include "MD4Hash.h" // Needed for CMD4Hash +#include "SHAHashSet.h" // Needed for CAICHHash + + + +class CMemFile; + + +class CED2KLink +{ +public: + typedef enum { kServerList, kServer , kFile , kInvalid } LinkType; + + static CED2KLink* CreateLinkFromUrl(const wxString& link); + + LinkType GetKind() const; + virtual wxString GetLink() const = 0; + + virtual ~CED2KLink(); + +protected: + CED2KLink( LinkType type ); + +private: + LinkType m_type; +}; + + +class CED2KFileLink : public CED2KLink +{ + friend class CED2KLink; + CED2KFileLink(const wxString& link); + +public: + virtual ~CED2KFileLink(); + + virtual wxString GetLink() const; + + wxString GetName() const; + uint64 GetSize() const; + const CMD4Hash& GetHashKey() const; + + // AICH data + bool HasValidAICHHash() const; + const CAICHHash& GetAICHHash() const; + + CMemFile* m_hashset; + + /** + * Structure used to store sources found in file links. + */ + struct SED2KLinkSource + { + //! Hostname or dot-address. + wxString addr; + //! The source's TCP-port. + uint16 port; + //! Client hash for encryption + wxString hash; + //! Client cryptoptions + uint8 cryptoptions; + }; + + typedef std::deque CED2KLinkSourceList; + CED2KLinkSourceList m_sources; + +private: + CED2KFileLink(); // Not defined + CED2KFileLink(const CED2KFileLink&); // Not defined + CED2KFileLink& operator=(const CED2KFileLink&); // Not defined + + wxString m_name; + uint64 m_size; + CMD4Hash m_hash; + bool m_bAICHHashValid; + CAICHHash m_AICHHash; +}; + + +class CED2KServerLink : public CED2KLink +{ + friend class CED2KLink; + CED2KServerLink(const wxString& link); + +public: + virtual wxString GetLink() const; + + uint32 GetIP() const; + uint16 GetPort() const; + +private: + CED2KServerLink(); // Not defined + CED2KServerLink(const CED2KServerLink&); // Not defined + CED2KServerLink& operator=(const CED2KServerLink&); // Not defined + + uint32 m_ip; + uint16 m_port; +}; + + +class CED2KServerListLink : public CED2KLink +{ + friend class CED2KLink; + CED2KServerListLink(const wxString& link); + +public: + virtual wxString GetLink() const; + + const wxString& GetAddress() const; + +private: + CED2KServerListLink(); // Not defined + CED2KServerListLink(const CED2KFileLink&); // Not defined + CED2KServerListLink& operator=(const CED2KFileLink&); // Not defined + + wxString m_address; +}; + + +#endif +// File_checked_for_headers diff --git a/src/ED2KLinkParser.cpp b/src/ED2KLinkParser.cpp new file mode 100644 index 00000000..632917b1 --- /dev/null +++ b/src/ED2KLinkParser.cpp @@ -0,0 +1,509 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003-2008 Madcat ( madcat@_@users.sf.net / sharedaemon.sf.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +const int versionMajor = 1; +const int versionMinor = 4; +const int versionRevision = 0; + +#include +#include +#include +#include + +#ifdef __APPLE__ + #include +#elif defined(__WIN32__) + #include + #include + #include +#endif + +#include "FileLock.h" +#include "MagnetURI.h" +#include "MuleCollection.h" + +using std::string; + +string GetLinksFilePath(const string& configDir) +{ + if (!configDir.empty()) { +#ifdef __WIN32__ + char buffer[MAX_PATH + 1]; + configDir.copy(buffer, MAX_PATH); + if (PathAppendA(buffer, "ED2KLinks")) { + string strDir; + strDir.assign(buffer); + return strDir; + } +#else + string strDir = configDir; + if (strDir.at(strDir.length() - 1) != '/') { + strDir += '/'; + } + return strDir + "ED2KLinks"; +#endif + } + + +#ifdef __APPLE__ + + std::string strDir; + + FSRef fsRef; + if (FSFindFolder(kUserDomain, kApplicationSupportFolderType, kCreateFolder, &fsRef) == noErr) { + CFURLRef urlRef = CFURLCreateFromFSRef(NULL, &fsRef); + if (urlRef != NULL) { + UInt8 buffer[PATH_MAX + 1]; + if (CFURLGetFileSystemRepresentation(urlRef, true, buffer, sizeof(buffer))) { + strDir.assign((char*) buffer); + } + CFRelease(urlRef) ; + } + } + + return strDir + "/aMule/ED2KLinks"; + +#elif defined(__WIN32__) + + std::string strDir; + LPITEMIDLIST pidl; + char buffer[MAX_PATH + 1]; + + HRESULT hr = SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl); + + if (SUCCEEDED(hr)) { + if (SHGetPathFromIDListA(pidl, buffer)) { + if (PathAppendA(buffer, "aMule\\ED2KLinks")) { + strDir.assign(buffer); + } + } + } + + if (pidl) { + LPMALLOC pMalloc; + SHGetMalloc(&pMalloc); + if (pMalloc) { + pMalloc->Free(pidl); + pMalloc->Release(); + } + } + + return strDir; + +#else + + return string( getenv("HOME") ) + "/.aMule/ED2KLinks"; + +#endif +} + +/** + * Converts a hexadecimal number to a char. + * + * @param hex The hex-number, must be at most 2 digits long. + * @return The resulting char or \0 if conversion failed. + */ +char HexToDec( const string& hex ) +{ + char result = 0; + + for ( size_t i = 0; i < hex.length(); ++i ) { + char cur = toupper( hex.at(i) ); + result *= 16; + + if ( isdigit( cur ) ) { + result += cur - '0'; + } else if ( cur >= 'A' && cur <= 'F' ) { + result += cur - 'A' + 10; + } else { + return '\0'; + } + } + + return result; +} + + +/** + * This function converts all valid HTML escape-codes to their corresponding chars. + * + * @param str The string to unescape. + * @return The unescaped version of the input string. + */ +string Unescape( const string& str ) +{ + string result; + result.reserve( str.length() ); + + for ( size_t i = 0; i < str.length(); ++i ) { + if ( str.at(i) == '%' && ( i + 2 < str.length() ) ) { + char unesc = HexToDec( str.substr( i + 1, 2 ) ); + + if ( unesc ) { + i += 2; + + result += unesc; + } else { + // If conversion failed, then we just add the escape-code + // and continue past it like nothing happened. + result += str.at(i); + } + } else { + result += str.at(i); + } + } + + return result; +} + + +/** + * Returns the string with whitespace stripped from both ends. + */ +string strip( const string& str ) +{ + int first = 0; + int last = str.length() - 1; + + // A simple but no very optimized way to narrow down the + // usable text within the string. + while ( first <= last ) { + if ( isspace( str.at(first) ) ) { + first++; + } else if ( isspace( str.at(last) ) ) { + last--; + } else { + break; + } + }; + + return str.substr( first, 1 + last - first ); +} + + +/** + * Returns true if the string is a valid number. + */ +bool isNumber( const string& str ) +{ + for ( size_t i = 0; i < str.length(); i++ ) { + if ( !isdigit( str.at(i) ) ) { + return false; + } + } + + return str.length(); +} + + +/** + * Returns true if the string is a valid Base16 representation of a MD4 Hash. + */ +bool isMD4Hash( const string& str ) +{ + for ( size_t i = 0; i < str.length(); i++ ) { + const char c = toupper( str.at(i) ); + + if ( !isdigit( c ) && ( c < 'A' || c > 'F' ) ) { + return false; + } + } + + return str.length() == 32; +} + + +/** + * Returns a description of the current version of "ed2k". + */ +string getVersion() +{ + std::ostringstream v; + + v << "aMule ED2k link parser v" + << versionMajor << "." + << versionMinor << "." + << versionRevision; + + return v.str(); +} + + +/** + * Helper-function for printing link-errors. + */ +void badLink( const string& type, const string& err, const string& uri ) +{ + std::cout << "Invalid " << type << "-link, " + err << ":\n" + << "\t" << uri << std::endl; +} + + +/** + * Writes a string to the ED2KLinks file. + * + * If errors are detected, it will terminate the program. + */ +void writeLink( const string& uri, const string& config_dir ) +{ + // Attempt to lock the ED2KLinks file + static CFileLock lock(GetLinksFilePath(config_dir)); + static std::ofstream file; + + if (!file.is_open()) { + string path = GetLinksFilePath(config_dir); + file.open( path.c_str(), std::ofstream::out | std::ofstream::app ); + + if (!file.is_open()) { + std::cout << "ERROR! Failed to open " << path << " for writing!" << std::endl; + exit(1); + } + } + + file << uri << std::endl; + + std::cout << "Link succesfully queued." << std::endl; +} + + +/** + * Writes the the specified URI to the ED2KLinks file if it is a valid file-link. + * + * @param uri The URI to check. + * @return True if the URI was written, false otherwise. + */ +bool checkFileLink( const string& uri ) +{ + if ( uri.substr( 0, 13 ) == "ed2k://|file|" ) { + size_t base_off = 12; + size_t name_off = uri.find( '|', base_off + 1 ); + size_t size_off = uri.find( '|', name_off + 1 ); + size_t hash_off = uri.find( '|', size_off + 1 ); + + bool valid = true; + valid &= ( base_off < name_off ); + valid &= ( name_off < size_off ); + valid &= ( size_off < hash_off ); + valid &= ( hash_off != string::npos ); + + if ( !valid ) { + badLink( "file", "invalid link format", uri ); + return false; + } + + string name = uri.substr( base_off + 1, name_off - base_off - 1 ); + string size = uri.substr( name_off + 1, size_off - name_off - 1 ); + string hash = uri.substr( size_off + 1, hash_off - size_off - 1 ); + + if ( name.empty() ) { + badLink( "file", "no name specified", uri ); + return false; + } + + if ( !isNumber( size ) ) { + badLink( "file", "invalid size", uri ); + return false; + } + + if ( !isMD4Hash( hash ) ) { + badLink( "file", "invalid MD4 hash", uri ); + return false; + } + + return true; + } + + return false; +} + + +/** + * Writes the the specified URI to the ED2KLinks file if it is a valid server-link. + * + * @param uri The URI to check. + * @return True if the URI was written, false otherwise. + */ +bool checkServerLink( const string& uri ) +{ + if ( uri.substr( 0, 15 ) == "ed2k://|server|" ) { + size_t base_off = 14; + size_t host_off = uri.find( '|', base_off + 1 ); + size_t port_off = uri.find( '|', host_off + 1 ); + + bool valid = true; + valid &= ( base_off < host_off ); + valid &= ( host_off < port_off ); + valid &= ( port_off != string::npos ); + + if ( !valid || uri.at( port_off + 1 ) != '/' ) { + badLink( "server", "invalid link format", uri ); + return false; + } + + string host = uri.substr( base_off + 1, host_off - base_off - 1 ); + string port = uri.substr( host_off + 1, port_off - host_off - 1 ); + + if ( host.empty() ) { + badLink( "server", "no hostname specified", uri ); + return false; + } + + if ( !isNumber( port ) ) { + badLink( "server", "invalid port", uri ); + return false; + } + + return true; + } + + return false; +} + + +/** + * Writes the the specified URI to the ED2KLinks file if it is a valid serverlist-link. + * + * @param uri The URI to check. + * @return True if the URI was written, false otherwise. + */ +bool checkServerListLink( const string& uri ) +{ + if ( uri.substr( 0, 19 ) == "ed2k://|serverlist|" ) { + size_t base_off = 19; + size_t path_off = uri.find( '|', base_off + 1 ); + + bool valid = true; + valid &= ( base_off < path_off ); + valid &= ( path_off != string::npos ); + + if ( !valid ) { + badLink( "serverlist", "invalid link format", uri ); + return false; + } + + string path = uri.substr( base_off + 1, path_off - base_off - 1 ); + + if ( path.empty() ) { + badLink( "serverlist", "no hostname specified", uri ); + return false; + } + + return true; + } + + return false; +} + + +int main(int argc, char *argv[]) +{ + bool errors = false; + string config_path; + for ( int i = 1; i < argc; i++ ) { + string arg = strip( Unescape( string( argv[i] ) ) ); + + if ( arg.compare(0, 7, "magnet:" ) == 0 ) { + string ed2k = CMagnetED2KConverter(arg); + if ( ed2k.empty() ) { + std::cerr << "Cannot convert magnet URI to ed2k:\n\t" << arg << std::endl; + errors = true; + continue; + } else { + arg = ed2k; + } + } + + if ( arg.substr( 0, 8 ) == "ed2k://|" ) { + // Ensure the URI is valid + if ( arg.at( arg.length() - 1 ) != '/' ) { + arg += '/'; + } + + string type = arg.substr( 8, arg.find( '|', 9 ) - 8 ); + + if ( (type == "file") && checkFileLink( arg ) ) { + writeLink( arg, config_path ); + } else if ( (type == "server") && checkServerLink( arg ) ) { + writeLink( arg, config_path ); + } else if ( (type == "serverlist") && checkServerListLink( arg ) ) { + writeLink( arg, config_path ); + } else { + std::cout << "Unknown or invalid link-type:\n\t" << arg << std::endl; + errors = true; + } + } else if (arg == "-c" || arg == "--config-dir") { + if (i < argc - 1) { + config_path = argv[++i]; + } else { + std::cerr << "Missing mandatory argument for " << arg << std::endl; + errors = true; + } + } else if (arg.substr(0, 2) == "-c") { + config_path = arg.substr(2); + } else if (arg.substr(0, 13) == "--config-dir=") { + config_path = arg.substr(13); + } else if (arg == "-h" || arg == "--help") { + std::cout << getVersion() + << "\n\n" + << "Usage:\n" + << " --help, -h Prints this help.\n" + << " --config-dir, -c Specifies the aMule configuration directory.\n" + << " --version, -v Displays version info.\n\n" + << " magnet:? Causes the file to be queued for download.\n" + << " ed2k://|file| Causes the file to be queued for download.\n" + << " ed2k://|server| Causes the server to be listed or updated.\n" + << " ed2k://|serverlist| Causes aMule to update the current serverlist.\n\n" + << " --emulecollection, -e Loads all links of an emulecollection\n\n" + << "*** NOTE: Option order is important! ***\n" + << std::endl; + + } else if (arg == "-v" || arg == "--version") { + std::cout << getVersion() << std::endl; + } else if (arg == "-e" || arg == "--emulecollection") { + if (i < argc - 1) { + CMuleCollection my_collection; + if (my_collection.Open( /* emulecollection file */ argv[++i] )) + { + for(size_t e = 0;e < my_collection.GetFileCount();e++) + writeLink( my_collection.GetEd2kLink(e), config_path ); + } else { + std::cerr << "Invalid emulecollection file: " << argv[i] << std::endl; + errors = true; + } + } else { + std::cerr << "Missing mandatory argument for " << arg << std::endl; + errors = true; + } + std::cout << getVersion() << std::endl; + } else { + std::cerr << "Bad parameter value:\n\t" << arg << "\n" << std::endl; + errors = true; + } + } + + return ( errors ? 1 : 0 ); +} + +// File_checked_for_headers diff --git a/src/EMSocket.cpp b/src/EMSocket.cpp new file mode 100644 index 00000000..975914dd --- /dev/null +++ b/src/EMSocket.cpp @@ -0,0 +1,807 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "EMSocket.h" // Interface declarations. + +#include +#include + +#include "Packet.h" // Needed for CPacket +#include "amule.h" +#include "GetTickCount.h" +#include "UploadBandwidthThrottler.h" +#include "Logger.h" +#include "Preferences.h" + + +const uint32 MAX_SIZE = 2000000; + +CEMSocket::CEMSocket(const CProxyData *ProxyData) + : CEncryptedStreamSocket(wxSOCKET_NOWAIT, ProxyData) +{ + // If an interface has been specified, + // then we need to bind to it. + if (!thePrefs::GetAddress().IsEmpty()) { + amuleIPV4Address host; + + // No need to warn here, in case of failure to + // assign the hostname. That is already done + // in amule.cpp when starting ... + if (host.Hostname(thePrefs::GetAddress())) { + SetLocal(host); + } + } + + byConnected = ES_NOTCONNECTED; + m_uTimeOut = CONNECTION_TIMEOUT; // default timeout for ed2k sockets + + // Download (pseudo) rate control + downloadLimit = 0; + downloadLimitEnable = false; + pendingOnReceive = false; + + // Download partial header + pendingHeaderSize = 0; + + // Download partial packet + pendingPacket = NULL; + pendingPacketSize = 0; + + // Upload control + sendbuffer = NULL; + sendblen = 0; + sent = 0; + + m_currentPacket_is_controlpacket = false; + m_currentPackageIsFromPartFile = false; + + m_numberOfSentBytesCompleteFile = 0; + m_numberOfSentBytesPartFile = 0; + m_numberOfSentBytesControlPacket = 0; + + lastCalledSend = ::GetTickCount(); + lastSent = ::GetTickCount()-1000; + + m_bAccelerateUpload = false; + + m_actualPayloadSize = 0; + m_actualPayloadSizeSent = 0; + + m_bBusy = false; + m_hasSent = false; + + lastFinishedStandard = 0; + + DoingDestroy = false; + +} + +CEMSocket::~CEMSocket() +{ + // need to be locked here to know that the other methods + // won't be in the middle of things + { + wxMutexLocker lock(m_sendLocker); + byConnected = ES_DISCONNECTED; + } + + // now that we know no other method will keep adding to the queue + // we can remove ourself from the queue + if (theApp->uploadBandwidthThrottler) { + theApp->uploadBandwidthThrottler->RemoveFromAllQueues(this); + } + + ClearQueues(); + + SetNotify(0); + Notify(FALSE); +} + +void CEMSocket::Destroy() { + if (!DoingDestroy) { + DoingDestroy = true; + wxSocketClient::Destroy(); + } +} + + +void CEMSocket::ClearQueues() +{ + wxMutexLocker lock(m_sendLocker); + + { + CPacketQueue::iterator it = m_control_queue.begin(); + for (; it != m_control_queue.end(); ++it) { + delete *it; + } + m_control_queue.clear(); + } + + { + CStdPacketQueue::iterator it = m_standard_queue.begin(); + for (; it != m_standard_queue.end(); ++it) { + delete it->packet; + } + m_standard_queue.clear(); + } + + // Download (pseudo) rate control + downloadLimit = 0; + downloadLimitEnable = false; + pendingOnReceive = false; + + // Download partial header + pendingHeaderSize = 0; + + // Download partial packet + delete pendingPacket; + pendingPacket = NULL; + pendingPacketSize = 0; + + // Upload control + delete[] sendbuffer; + sendbuffer = NULL; + sendblen = 0; + sent = 0; +} + + +void CEMSocket::OnClose(int WXUNUSED(nErrorCode)) +{ + // need to be locked here to know that the other methods + // won't be in the middle of things + { + wxMutexLocker lock(m_sendLocker); + byConnected = ES_DISCONNECTED; + } + + // now that we know no other method will keep adding to the queue + // we can remove ourself from the queue + theApp->uploadBandwidthThrottler->RemoveFromAllQueues(this); + + ClearQueues(); +} + + +void CEMSocket::OnReceive(int nErrorCode) +{ + // the 2 meg size was taken from another place + static byte GlobalReadBuffer[MAX_SIZE]; + + if(nErrorCode) { + uint32 error = LastError(); + if (error != wxSOCKET_WOULDBLOCK) { + OnError(nErrorCode); + return; + } + } + + // Check current connection state + if (byConnected == ES_DISCONNECTED) { + return; + } else { + byConnected = ES_CONNECTED; // ES_DISCONNECTED, ES_NOTCONNECTED, ES_CONNECTED + } + + // CPU load improvement + if(downloadLimitEnable == true && downloadLimit == 0){ + pendingOnReceive = true; + return; + } + + // Remark: an overflow can not occur here + uint32 readMax = sizeof(GlobalReadBuffer) - pendingHeaderSize; + if((downloadLimitEnable == true) && (readMax > downloadLimit)) { + readMax = downloadLimit; + } + + + // We attempt to read up to 2 megs at a time (minus whatever is in our internal read buffer) + uint32 ret; + + { + wxMutexLocker lock(m_sendLocker); + ret = Read(GlobalReadBuffer + pendingHeaderSize, readMax); + if (Error() || (ret == 0)) { + if (LastError() == wxSOCKET_WOULDBLOCK) { + pendingOnReceive = true; + } + return; + } + } + + + // Bandwidth control + if(downloadLimitEnable == true){ + // Update limit + downloadLimit -= GetRealReceivedBytes(); + } + + // CPU load improvement + // Detect if the socket's buffer is empty (or the size did match...) + pendingOnReceive = (ret == readMax); + + // Copy back the partial header into the global read buffer for processing + if(pendingHeaderSize > 0) { + memcpy(GlobalReadBuffer, pendingHeader, pendingHeaderSize); + ret += pendingHeaderSize; + pendingHeaderSize = 0; + } + + byte* rptr = GlobalReadBuffer; // floating index initialized with begin of buffer + const byte* rend = GlobalReadBuffer + ret; // end of buffer + + // Loop, processing packets until we run out of them + while((rend - rptr >= PACKET_HEADER_SIZE) || + ((pendingPacket != NULL) && (rend - rptr > 0 ))){ + + // Two possibilities here: + // + // 1. There is no pending incoming packet + // 2. There is already a partial pending incoming packet + // + // It's important to remember that emule exchange two kinds of packet + // - The control packet + // - The data packet for the transport of the block + // + // The biggest part of the traffic is done with the data packets. + // The default size of one block is 10240 bytes (or less if compressed), but the + // maximal size for one packet on the network is 1300 bytes. It's the reason + // why most of the Blocks are splitted before to be sent. + // + // Conclusion: When the download limit is disabled, this method can be at least + // called 8 times (10240/1300) by the lower layer before a splitted packet is + // rebuild and transferred to the above layer for processing. + // + // The purpose of this algorithm is to limit the amount of data exchanged between buffers + + if(pendingPacket == NULL){ + pendingPacket = new CPacket(rptr); // Create new packet container. + rptr += 6; // Only the header is initialized so far + + // Bugfix We still need to check for a valid protocol + // Remark: the default eMule v0.26b had removed this test...... + switch (pendingPacket->GetProtocol()){ + case OP_EDONKEYPROT: + case OP_PACKEDPROT: + case OP_EMULEPROT: + case OP_ED2KV2HEADER: + case OP_ED2KV2PACKEDPROT: + break; + default: + delete pendingPacket; + pendingPacket = NULL; + OnError(ERR_WRONGHEADER); + return; + } + + // Security: Check for buffer overflow (2MB) + if(pendingPacket->GetPacketSize() > sizeof(GlobalReadBuffer)) { + delete pendingPacket; + pendingPacket = NULL; + OnError(ERR_TOOBIG); + return; + } + + // Init data buffer + pendingPacket->AllocDataBuffer(); + pendingPacketSize = 0; + } + + // Bytes ready to be copied into packet's internal buffer + wxASSERT(rptr <= rend); + uint32 toCopy = ((pendingPacket->GetPacketSize() - pendingPacketSize) < (uint32)(rend - rptr)) ? + (pendingPacket->GetPacketSize() - pendingPacketSize) : (uint32)(rend - rptr); + + // Copy Bytes from Global buffer to packet's internal buffer + pendingPacket->CopyToDataBuffer(pendingPacketSize, rptr, toCopy); + pendingPacketSize += toCopy; + rptr += toCopy; + + // Check if packet is complet + wxASSERT(pendingPacket->GetPacketSize() >= pendingPacketSize); + if(pendingPacket->GetPacketSize() == pendingPacketSize) { + // Process packet + bool bPacketResult = PacketReceived(pendingPacket); + delete pendingPacket; + pendingPacket = NULL; + pendingPacketSize = 0; + + if (!bPacketResult) { + return; + } + } + } + + // Finally, if there is any data left over, save it for next time + wxASSERT(rptr <= rend); + wxASSERT(rend - rptr < PACKET_HEADER_SIZE); + if(rptr != rend) { + // Keep the partial head + pendingHeaderSize = rend - rptr; + memcpy(pendingHeader, rptr, pendingHeaderSize); + } +} + + +void CEMSocket::SetDownloadLimit(uint32 limit) +{ + downloadLimit = limit; + downloadLimitEnable = true; + + // CPU load improvement + if(limit > 0 && pendingOnReceive == true){ + OnReceive(0); + } +} + + +void CEMSocket::DisableDownloadLimit() +{ + downloadLimitEnable = false; + + // CPU load improvement + if (pendingOnReceive == true){ + OnReceive(0); + } +} + + +/** + * Queues up the packet to be sent. Another thread will actually send the packet. + * + * If the packet is not a control packet, and if the socket decides that its queue is + * full and forceAdd is false, then the socket is allowed to refuse to add the packet + * to its queue. It will then return false and it is up to the calling thread to try + * to call SendPacket for that packet again at a later time. + * + * @param packet address to the packet that should be added to the queue + * + * @param delpacket if true, the responsibility for deleting the packet after it has been sent + * has been transferred to this object. If false, don't delete the packet after it + * has been sent. + * + * @param controlpacket the packet is a controlpacket + * + * @param forceAdd this packet must be added to the queue, even if it is full. If this flag is true + * then the method can not refuse to add the packet, and therefore not return false. + * + * @return true if the packet was added to the queue, false otherwise + */ +void CEMSocket::SendPacket(CPacket* packet, bool delpacket, bool controlpacket, uint32 actualPayloadSize) +{ + //printf("* SendPacket called on socket %p\n", this); + wxMutexLocker lock(m_sendLocker); + + if (byConnected == ES_DISCONNECTED) { + //printf("* Disconnected, drop packet\n"); + if(delpacket) { + delete packet; + } + } else { + if (!delpacket){ + packet = new CPacket(*packet); + } + + if (controlpacket) { + //printf("* Adding a control packet\n"); + m_control_queue.push_back(packet); + + // queue up for controlpacket + theApp->uploadBandwidthThrottler->QueueForSendingControlPacket(this, HasSent()); + } else { + //printf("* Adding a normal packet to the queue\n"); + bool first = !((sendbuffer && !m_currentPacket_is_controlpacket) || !m_standard_queue.empty()); + StandardPacketQueueEntry queueEntry = { actualPayloadSize, packet }; + m_standard_queue.push_back(queueEntry); + + // reset timeout for the first time + if (first) { + lastFinishedStandard = ::GetTickCount(); + m_bAccelerateUpload = true; // Always accelerate first packet in a block + } + } + } +} + + +uint64 CEMSocket::GetSentBytesCompleteFileSinceLastCallAndReset() +{ + wxMutexLocker lock( m_sendLocker ); + + uint64 sentBytes = m_numberOfSentBytesCompleteFile; + m_numberOfSentBytesCompleteFile = 0; + + return sentBytes; +} + + +uint64 CEMSocket::GetSentBytesPartFileSinceLastCallAndReset() +{ + wxMutexLocker lock( m_sendLocker ); + + uint64 sentBytes = m_numberOfSentBytesPartFile; + m_numberOfSentBytesPartFile = 0; + + return sentBytes; +} + +uint64 CEMSocket::GetSentBytesControlPacketSinceLastCallAndReset() +{ + wxMutexLocker lock( m_sendLocker ); + + uint64 sentBytes = m_numberOfSentBytesControlPacket; + m_numberOfSentBytesControlPacket = 0; + + return sentBytes; +} + +uint64 CEMSocket::GetSentPayloadSinceLastCallAndReset() +{ + wxMutexLocker lock( m_sendLocker ); + + uint64 sentBytes = m_actualPayloadSizeSent; + m_actualPayloadSizeSent = 0; + + return sentBytes; +} + + +void CEMSocket::OnSend(int nErrorCode) +{ + if (nErrorCode){ + OnError(nErrorCode); + return; + } + + CEncryptedStreamSocket::OnSend(0); + + wxMutexLocker lock( m_sendLocker ); + m_bBusy = false; + + if (byConnected != ES_DISCONNECTED) { + byConnected = ES_CONNECTED; + + if (m_currentPacket_is_controlpacket) { + // queue up for control packet + theApp->uploadBandwidthThrottler->QueueForSendingControlPacket(this, HasSent()); + } + } +} + + +/** + * Try to put queued up data on the socket. + * + * Control packets have higher priority, and will be sent first, if possible. + * Standard packets can be split up in several package containers. In that case + * all the parts of a split package must be sent in a row, without any control packet + * in between. + * + * @param maxNumberOfBytesToSend This is the maximum number of bytes that is allowed to be put on the socket + * this call. The actual number of sent bytes will be returned from the method. + * + * @param onlyAllowedToSendControlPacket This call we only try to put control packets on the sockets. + * If there's a standard packet "in the way", and we think that this socket + * is no longer an upload slot, then it is ok to send the standard packet to + * get it out of the way. But it is not allowed to pick a new standard packet + * from the queue during this call. Several split packets are counted as one + * standard packet though, so it is ok to finish them all off if necessary. + * + * @return the actual number of bytes that were put on the socket. + */ +SocketSentBytes CEMSocket::Send(uint32 maxNumberOfBytesToSend, uint32 minFragSize, bool onlyAllowedToSendControlPacket) +{ + wxMutexLocker lock(m_sendLocker); + + //printf("* Attempt to send a packet on socket %p\n", this); + + if (byConnected == ES_DISCONNECTED) { + //printf("* Disconnected socket %p\n", this); + SocketSentBytes returnVal = { false, 0, 0 }; + return returnVal; + } else if (m_bBusy && onlyAllowedToSendControlPacket) { + //printf("* Busy socket %p\n", this); + SocketSentBytes returnVal = { true, 0, 0 }; + return returnVal; + } + + bool anErrorHasOccured = false; + uint32 sentStandardPacketBytesThisCall = 0; + uint32 sentControlPacketBytesThisCall = 0; + + if(byConnected == ES_CONNECTED && IsEncryptionLayerReady() && !(m_bBusy && onlyAllowedToSendControlPacket)) { + + //printf("* Internal attemptto send on %p\n", this); + + if(minFragSize < 1) { + minFragSize = 1; + } + + maxNumberOfBytesToSend = GetNextFragSize(maxNumberOfBytesToSend, minFragSize); + + bool bWasLongTimeSinceSend = (::GetTickCount() - lastSent) > 1000; + + lastCalledSend = ::GetTickCount(); + + + while(sentStandardPacketBytesThisCall + sentControlPacketBytesThisCall < maxNumberOfBytesToSend && anErrorHasOccured == false && // don't send more than allowed. Also, there should have been no error in earlier loop + (!m_control_queue.empty() || !m_standard_queue.empty() || sendbuffer != NULL) && // there must exist something to send + (onlyAllowedToSendControlPacket == false || // this means we are allowed to send both types of packets, so proceed + sentStandardPacketBytesThisCall + sentControlPacketBytesThisCall > 0 && (sentStandardPacketBytesThisCall + sentControlPacketBytesThisCall) % minFragSize != 0 || + sendbuffer == NULL && !m_control_queue.empty() || // There's a control packet in queue, and we are not currently sending anything, so we will handle the control packet next + sendbuffer != NULL && m_currentPacket_is_controlpacket == true || // We are in the progress of sending a control packet. We are always allowed to send those + sendbuffer != NULL && m_currentPacket_is_controlpacket == false && bWasLongTimeSinceSend && !m_control_queue.empty() && m_standard_queue.empty() && (sentStandardPacketBytesThisCall + sentControlPacketBytesThisCall) < minFragSize // We have waited to long to clean the current packet (which may be a standard packet that is in the way). Proceed no matter what the value of onlyAllowedToSendControlPacket. + ) + ) { + + // If we are currently not in the progress of sending a packet, we will need to find the next one to send + if(sendbuffer == NULL) { + CPacket* curPacket = NULL; + if(!m_control_queue.empty()) { + // There's a control packet to send + m_currentPacket_is_controlpacket = true; + curPacket = m_control_queue.front(); + m_control_queue.pop_front(); + } else if(!m_standard_queue.empty() /*&& onlyAllowedToSendControlPacket == false*/) { + // There's a standard packet to send + m_currentPacket_is_controlpacket = false; + StandardPacketQueueEntry queueEntry = m_standard_queue.front(); + m_standard_queue.pop_front(); + curPacket = queueEntry.packet; + m_actualPayloadSize = queueEntry.actualPayloadSize; + + // remember this for statistics purposes. + m_currentPackageIsFromPartFile = curPacket->IsFromPF(); + } else { + // Just to be safe. Shouldn't happen? + // if we reach this point, then there's something wrong with the while condition above! + wxASSERT(0); + AddDebugLogLineM(true, logGeneral, wxT("EMSocket: Couldn't get a new packet! There's an error in the first while condition in EMSocket::Send()")); + + SocketSentBytes returnVal = { true, sentStandardPacketBytesThisCall, sentControlPacketBytesThisCall }; + return returnVal; + } + + // We found a packet to send. Get the data to send from the + // package container and dispose of the container. + sendblen = curPacket->GetRealPacketSize(); + sendbuffer = curPacket->DetachPacket(); + sent = 0; + delete curPacket; + + CryptPrepareSendData((byte*)sendbuffer, sendblen); + } + + // At this point we've got a packet to send in sendbuffer. Try to send it. Loop until entire packet + // is sent, or until we reach maximum bytes to send for this call, or until we get an error. + // NOTE! If send would block (returns WOULDBLOCK), we will return from this method INSIDE this loop. + while (sent < sendblen && + sentStandardPacketBytesThisCall + sentControlPacketBytesThisCall < maxNumberOfBytesToSend && + ( + onlyAllowedToSendControlPacket == false || // this means we are allowed to send both types of packets, so proceed + m_currentPacket_is_controlpacket || + bWasLongTimeSinceSend && (sentStandardPacketBytesThisCall + sentControlPacketBytesThisCall) < minFragSize || + (sentStandardPacketBytesThisCall + sentControlPacketBytesThisCall) % minFragSize != 0 + ) && + anErrorHasOccured == false) { + uint32 tosend = sendblen-sent; + if(!onlyAllowedToSendControlPacket || m_currentPacket_is_controlpacket) { + if (maxNumberOfBytesToSend >= sentStandardPacketBytesThisCall + sentControlPacketBytesThisCall && tosend > maxNumberOfBytesToSend-(sentStandardPacketBytesThisCall + sentControlPacketBytesThisCall)) + tosend = maxNumberOfBytesToSend-(sentStandardPacketBytesThisCall + sentControlPacketBytesThisCall); + } else if(bWasLongTimeSinceSend && (sentStandardPacketBytesThisCall + sentControlPacketBytesThisCall) < minFragSize) { + if (minFragSize >= sentStandardPacketBytesThisCall + sentControlPacketBytesThisCall && tosend > minFragSize-(sentStandardPacketBytesThisCall + sentControlPacketBytesThisCall)) + tosend = minFragSize-(sentStandardPacketBytesThisCall + sentControlPacketBytesThisCall); + } else { + uint32 nextFragMaxBytesToSent = GetNextFragSize(sentStandardPacketBytesThisCall + sentControlPacketBytesThisCall, minFragSize); + if (nextFragMaxBytesToSent >= sentStandardPacketBytesThisCall + sentControlPacketBytesThisCall && tosend > nextFragMaxBytesToSent-(sentStandardPacketBytesThisCall + sentControlPacketBytesThisCall)) + tosend = nextFragMaxBytesToSent-(sentStandardPacketBytesThisCall + sentControlPacketBytesThisCall); + } + wxASSERT(tosend != 0 && tosend <= sendblen-sent); + + //DWORD tempStartSendTick = ::GetTickCount(); + + lastSent = ::GetTickCount(); + + uint32 result = CEncryptedStreamSocket::Write(sendbuffer+sent,tosend); + + if (Error()){ + + uint32 error = LastError(); + if (error == wxSOCKET_WOULDBLOCK){ + m_bBusy = true; + + SocketSentBytes returnVal = { true, sentStandardPacketBytesThisCall, sentControlPacketBytesThisCall }; + + return returnVal; // Send() blocked, onsend will be called when ready to send again + } else{ + // Send() gave an error + anErrorHasOccured = true; + } + } else { + // we managed to send some bytes. Perform bookkeeping. + m_bBusy = false; + m_hasSent = true; + + sent += result; + + // Log send bytes in correct class + if(m_currentPacket_is_controlpacket == false) { + sentStandardPacketBytesThisCall += result; + + if(m_currentPackageIsFromPartFile == true) { + m_numberOfSentBytesPartFile += result; + } else { + m_numberOfSentBytesCompleteFile += result; + } + } else { + sentControlPacketBytesThisCall += result; + m_numberOfSentBytesControlPacket += result; + } + } + } + + if (sent == sendblen){ + // we are done sending the current packet. Delete it and set + // sendbuffer to NULL so a new packet can be fetched. + delete[] sendbuffer; + sendbuffer = NULL; + sendblen = 0; + + if(!m_currentPacket_is_controlpacket) { + m_actualPayloadSizeSent += m_actualPayloadSize; + m_actualPayloadSize = 0; + + lastFinishedStandard = ::GetTickCount(); // reset timeout + m_bAccelerateUpload = false; // Safe until told otherwise + } + + sent = 0; + } + } + } + + if(onlyAllowedToSendControlPacket && (!m_control_queue.empty() || sendbuffer != NULL && m_currentPacket_is_controlpacket)) { + // enter control packet send queue + // we might enter control packet queue several times for the same package, + // but that costs very little overhead. Less overhead than trying to make sure + // that we only enter the queue once. + //printf("* Requeueing control packet on %p\n", this); + theApp->uploadBandwidthThrottler->QueueForSendingControlPacket(this, HasSent()); + } + + //printf("* Finishing send debug on %p\n",this); + + SocketSentBytes returnVal = { !anErrorHasOccured, sentStandardPacketBytesThisCall, sentControlPacketBytesThisCall }; + + return returnVal; +} + + +uint32 CEMSocket::GetNextFragSize(uint32 current, uint32 minFragSize) +{ + if(current % minFragSize == 0) { + return current; + } else { + return minFragSize*(current/minFragSize+1); + } +} + + +/** + * Decides the (minimum) amount the socket needs to send to prevent timeout. + * + * @author SlugFiller + */ +uint32 CEMSocket::GetNeededBytes() +{ + uint32 sendgap; + + uint64 timetotal; + uint64 timeleft; + uint64 sizeleft, sizetotal; + + { + wxMutexLocker lock(m_sendLocker); + + if (byConnected == ES_DISCONNECTED) { + return 0; + } + + if (!((sendbuffer && !m_currentPacket_is_controlpacket) || !m_standard_queue.empty())) { + // No standard packet to send. Even if data needs to be sent to prevent timout, there's nothing to send. + return 0; + } + + if (((sendbuffer && !m_currentPacket_is_controlpacket)) && !m_control_queue.empty()) + m_bAccelerateUpload = true; // We might be trying to send a block request, accelerate packet + + sendgap = ::GetTickCount() - lastCalledSend; + + timetotal = m_bAccelerateUpload?45000:90000; + timeleft = ::GetTickCount() - lastFinishedStandard; + if (sendbuffer && !m_currentPacket_is_controlpacket) { + sizeleft = sendblen-sent; + sizetotal = sendblen; + } else { + sizeleft = sizetotal = m_standard_queue.front().packet->GetRealPacketSize(); + } + } + + if (timeleft >= timetotal) + return sizeleft; + timeleft = timetotal-timeleft; + if (timeleft*sizetotal >= timetotal*sizeleft) { + // don't use 'GetTimeOut' here in case the timeout value is high, + if (sendgap > SEC2MS(20)) + return 1; // Don't let the socket itself time out - Might happen when switching from spread(non-focus) slot to trickle slot + return 0; + } + uint64 decval = timeleft*sizetotal/timetotal; + if (!decval) + return sizeleft; + if (decval < sizeleft) + return sizeleft-decval+1; // Round up + else + return 1; +} + + +/** + * Removes all packets from the standard queue that don't have to be sent for the socket to be able to send a control packet. + * + * Before a socket can send a new packet, the current packet has to be finished. If the current packet is part of + * a split packet, then all parts of that split packet must be sent before the socket can send a control packet. + * + * This method keeps in standard queue only those packets that must be sent (rest of split packet), and removes everything + * after it. The method doesn't touch the control packet queue. + */ +void CEMSocket::TruncateQueues() +{ + wxMutexLocker lock(m_sendLocker); + + // Clear the standard queue totally + // Please note! There may still be a standardpacket in the sendbuffer variable! + CStdPacketQueue::iterator it = m_standard_queue.begin(); + for (; it != m_standard_queue.end(); ++it) { + delete it->packet; + } + + m_standard_queue.clear(); +} + + +uint32 CEMSocket::GetTimeOut() const +{ + return m_uTimeOut; +} + + +void CEMSocket::SetTimeOut(uint32 uTimeOut) +{ + m_uTimeOut = uTimeOut; +} +// File_checked_for_headers diff --git a/src/EMSocket.h b/src/EMSocket.h new file mode 100644 index 00000000..9358cc93 --- /dev/null +++ b/src/EMSocket.h @@ -0,0 +1,155 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef EMSOCKET_H +#define EMSOCKET_H + +#include "EncryptedStreamSocket.h" // Needed for CEncryptedStreamSocket + +#include "ThrottledSocket.h" // Needed for ThrottledFileSocket + +class CPacket; + +#define ERR_WRONGHEADER 0x01 +#define ERR_TOOBIG 0x02 + +#define ES_DISCONNECTED 0xFF +#define ES_NOTCONNECTED 0x00 +#define ES_CONNECTED 0x01 + + +const sint32 PACKET_HEADER_SIZE = 6; + + +class CEMSocket : public CEncryptedStreamSocket, public ThrottledFileSocket +{ +public: + CEMSocket(const CProxyData *ProxyData = NULL); + virtual ~CEMSocket(); + + virtual void SendPacket(CPacket* packet, bool delpacket = true, bool controlpacket = true, uint32 actualPayloadSize = 0); + bool HasQueues(); + bool IsConnected() { return byConnected==ES_CONNECTED;}; + uint8 GetConState() {return byConnected;} + void SetDownloadLimit(uint32 limit); + void DisableDownloadLimit(); + + virtual uint32 GetTimeOut() const; + virtual void SetTimeOut(uint32 uTimeOut); + + uint32 GetLastCalledSend() { return lastCalledSend; } + + uint64 GetSentBytesCompleteFileSinceLastCallAndReset(); + uint64 GetSentBytesPartFileSinceLastCallAndReset(); + uint64 GetSentBytesControlPacketSinceLastCallAndReset(); + uint64 GetSentPayloadSinceLastCallAndReset(); + void TruncateQueues(); + + virtual SocketSentBytes SendControlData(uint32 maxNumberOfBytesToSend, uint32 minFragSize) { return Send(maxNumberOfBytesToSend, minFragSize, true); }; + virtual SocketSentBytes SendFileAndControlData(uint32 maxNumberOfBytesToSend, uint32 minFragSize) { return Send(maxNumberOfBytesToSend, minFragSize, false); }; + + uint32 GetNeededBytes(); + + void Destroy(); + bool OnDestroy() { return DoingDestroy; }; + + //protected: + // these functions are public on our code because of the amuleDlg::socketHandler + virtual void OnError(int WXUNUSED(nErrorCode)) { }; + virtual void OnSend(int nErrorCode); + virtual void OnReceive(int nErrorCode); + +protected: + + virtual bool PacketReceived(CPacket* WXUNUSED(packet)) { return false; }; + virtual void OnClose(int nErrorCode); + + uint8 byConnected; + uint32 m_uTimeOut; + +private: + virtual SocketSentBytes Send(uint32 maxNumberOfBytesToSend, uint32 minFragSize, bool onlyAllowedToSendControlPacket); + void ClearQueues(); + + uint32 GetNextFragSize(uint32 current, uint32 minFragSize); + bool HasSent() { return m_hasSent; } + + // Download (pseudo) rate control + uint32 downloadLimit; + bool downloadLimitEnable; + bool pendingOnReceive; + + // Download partial header + // actually, this holds only 'PACKET_HEADER_SIZE-1' bytes. + byte pendingHeader[PACKET_HEADER_SIZE]; + uint32 pendingHeaderSize; + + // Download partial packet + CPacket* pendingPacket; + uint32 pendingPacketSize; + + // Upload control + byte* sendbuffer; + uint32 sendblen; + uint32 sent; + + typedef std::list CPacketQueue; + CPacketQueue m_control_queue; + + struct StandardPacketQueueEntry + { + uint32 actualPayloadSize; + CPacket* packet; + }; + + typedef std::list CStdPacketQueue; + CStdPacketQueue m_standard_queue; + + bool m_currentPacket_is_controlpacket; + + wxMutex m_sendLocker; + + uint64 m_numberOfSentBytesCompleteFile; + uint64 m_numberOfSentBytesPartFile; + uint64 m_numberOfSentBytesControlPacket; + bool m_currentPackageIsFromPartFile; + + bool m_bAccelerateUpload; + uint32 lastCalledSend; + uint32 lastSent; + uint32 lastFinishedStandard; + + uint32 m_actualPayloadSize; + uint32 m_actualPayloadSizeSent; + + bool m_bBusy; + bool m_hasSent; + + bool DoingDestroy; +}; + + +#endif // EMSOCKET_H +// File_checked_for_headers diff --git a/src/EditServerListDlg.cpp b/src/EditServerListDlg.cpp new file mode 100644 index 00000000..109b2005 --- /dev/null +++ b/src/EditServerListDlg.cpp @@ -0,0 +1,86 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Drager +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include // Needed for wxDialog // Do_not_auto_remove +#include // Needed for wxBoxSizer +#include // Needed for wxFile +#include // Needed for wxLogSysError +#include + +#include "EditServerListDlg.h" // Interface declarations + +BEGIN_EVENT_TABLE(EditServerListDlg, wxDialog) + EVT_BUTTON(wxID_OK, EditServerListDlg::OnOK) +END_EVENT_TABLE() + + +EditServerListDlg::EditServerListDlg(wxWindow *parent, + const wxString& caption, + const wxString& message, + const wxString& filename) : wxDialog(parent, -1, caption, + wxDefaultPosition, wxSize(400,200), + wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) +{ + m_file = filename; + + wxBeginBusyCursor(); + + wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL ); + + topsizer->Add( CreateTextSizer( message ), 0, wxALL, 10 ); + + m_textctrl = new wxTextCtrl(this, -1, wxEmptyString, + wxDefaultPosition, + wxDefaultSize, + wxTE_MULTILINE); + topsizer->Add( m_textctrl, 1, wxEXPAND | wxLEFT|wxRIGHT, 15 ); + + topsizer->Add( CreateButtonSizer( wxOK | wxCANCEL ), 0, wxCENTRE | wxALL, 10 ); + + SetAutoLayout( TRUE ); + SetSizer( topsizer ); + + Centre( wxBOTH ); + + if (wxFile::Exists(filename)) + m_textctrl->LoadFile(filename); + + m_textctrl->SetFocus(); + + wxEndBusyCursor(); +} + +EditServerListDlg::~EditServerListDlg() +{ +} + +void EditServerListDlg::OnOK(wxCommandEvent& WXUNUSED(event) ) +{ + if (m_textctrl->SaveFile(m_file)) + EndModal(1); + else + wxLogSysError(wxT("Can't write to file '") + m_file + wxT("'")); +} +// File_checked_for_headers diff --git a/src/EditServerListDlg.h b/src/EditServerListDlg.h new file mode 100644 index 00000000..b4cbfdd4 --- /dev/null +++ b/src/EditServerListDlg.h @@ -0,0 +1,53 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Drager +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef EDITSERVERLISTDLG_H +#define EDITSERVERLISTDLG_H + + +class wxTextCtrl; + +class EditServerListDlg : public wxDialog +{ +public: + EditServerListDlg(wxWindow *parent, + const wxString& caption, + const wxString& message, + const wxString& filename); + + virtual ~EditServerListDlg(); + + void OnOK(wxCommandEvent& event); + +protected: + wxTextCtrl* m_textctrl; + wxString m_file; + +private: + DECLARE_EVENT_TABLE() +}; + +#endif // EDITSERVERLISTDLG_H +// File_checked_for_headers diff --git a/src/EncryptedDatagramSocket.cpp b/src/EncryptedDatagramSocket.cpp new file mode 100644 index 00000000..ee1d86e0 --- /dev/null +++ b/src/EncryptedDatagramSocket.cpp @@ -0,0 +1,423 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +/* Basic Obfusicated Handshake Protocol UDP: + see EncryptedStreamSocket.h + +****************************** ED2K Packets + +-Keycreation Client <-> Clinet: + - Client A (Outgoing connection): + Sendkey: Md5() 23 + - Client B (Incomming connection): + Receivekey: Md5() 23 + - Note: The first 1024 Bytes will be _NOT_ discarded for UDP keys to safe CPU time + + - Handshake + -> The handshake is encrypted - except otherwise noted - by the Keys created above + -> Padding is cucrently not used for UDP meaning that PaddingLen will be 0, using PaddingLens up to 16 Bytes is acceptable however + Client A: + + - Additional Comments: + - For obvious reasons the UDP handshake is actually no handshake. If a different Encryption method (or better a different Key) is to be used this has to be negotiated in a TCP connection + - SemiRandomNotProtocolMarker is a Byte which has a value unequal any Protocol header byte. This is a compromiss, turning in complete randomness (and nice design) but gaining a lower CPU usage + - Kad/Ed2k Marker are only indicators, which possibility could be tried first, and should not be trusted + +****************************** Server Packets + +-Keycreation Client <-> Server: + - Client A (Outgoing connection client -> server): + Sendkey: Md5() 7 + - Client B (Incomming connection): + Receivekey: Md5() 7 + - Note: The first 1024 Bytes will be _NOT_ discarded for UDP keys to safe CPU time + + - Handshake + -> The handshake is encrypted - except otherwise noted - by the Keys created above + -> Padding is cucrently not used for UDP meaning that PaddingLen will be 0, using PaddingLens up to 16 Bytes is acceptable however + Client A: + + - Overhead: 8 Bytes per UDP Packet + + - Security for Basic Obfusication: + - Random looking packets, very limited protection against passive eavesdropping single packets + + - Additional Comments: + - For obvious reasons the UDP handshake is actually no handshake. If a different Encryption method (or better a different Key) is to be used this has to be negotiated in a TCP connection + - SemiRandomNotProtocolMarker is a Byte which has a value unequal any Protocol header byte. This is a compromiss, turning in complete randomness (and nice design) but gaining a lower CPU usage + +****************************** KAD Packets + +-Keycreation Client <-> Client: + - Client A (Outgoing connection): + Sendkey: Md5() 18 + - Client B (Incomming connection): + Receivekey: Md5() 18 + - Note: The first 1024 Bytes will be _NOT_ discarded for UDP keys to safe CPU time + + - Handshake + -> The handshake is encrypted - except otherwise noted - by the Keys created above + -> Padding is cucrently not used for UDP meaning that PaddingLen will be 0, using PaddingLens up to 16 Bytes is acceptable however + Client A: + + - Overhead: 12 Bytes per UDP Packet + + - Additional Comments: + - For obvious reasons the UDP handshake is actually no handshake. If a different Encryption method (or better a different Key) is to be used this has to be negotiated in a TCP connection + - SemiRandomNotProtocolMarker is a Byte which has a value unequal any Protocol header byte. This is a compromiss, turning in complete randomness (and nice design) but gaining a lower CPU usage + - Kad/Ed2k Marker are only indicators, which possibility could be tried first, and should not be trusted +*/ + +#include "EncryptedDatagramSocket.h" +#include "amule.h" +#include "Logger.h" +#include "Preferences.h" +#include "RC4Encrypt.h" +#include "./kademlia/kademlia/Prefs.h" +#include "./kademlia/kademlia/Kademlia.h" +#include "RandomFunctions.h" + +#include +#include + +// random generator +#include "CryptoPP_Inc.h" // Needed for Crypto functions + +#define CRYPT_HEADER_WITHOUTPADDING 8 +#define MAGICVALUE_UDP 91 +#define MAGICVALUE_UDP_SYNC_CLIENT 0x395F2EC1 +#define MAGICVALUE_UDP_SYNC_SERVER 0x13EF24D5 +#define MAGICVALUE_UDP_SERVERCLIENT 0xA5 +#define MAGICVALUE_UDP_CLIENTSERVER 0x6B + +CEncryptedDatagramSocket::CEncryptedDatagramSocket( wxIPaddress &address, wxSocketFlags flags, const CProxyData *proxyData) : CDatagramSocketProxy(address, flags, proxyData) +{ + +} + +CEncryptedDatagramSocket::~CEncryptedDatagramSocket() +{ + +} + +int CEncryptedDatagramSocket::DecryptReceivedClient(uint8* pbyBufIn, int nBufLen, uint8** ppbyBufOut, uint32 dwIP, uint16* nReceiverVerifyKey, uint16* nSenderVerifyKey) { + int nResult = nBufLen; + *ppbyBufOut = pbyBufIn; + + if (nResult <= CRYPT_HEADER_WITHOUTPADDING /*|| !thePrefs.IsClientCryptLayerSupported()*/) + return nResult; + + if (nReceiverVerifyKey == NULL || nSenderVerifyKey == NULL){ + wxASSERT( false ); + return nResult; + } + + switch (pbyBufIn[0]){ + case OP_EMULEPROT: + case OP_KADEMLIAPACKEDPROT: + case OP_KADEMLIAHEADER: + case OP_UDPRESERVEDPROT1: + case OP_UDPRESERVEDPROT2: + case OP_PACKEDPROT: + return nResult; // no encrypted packet (see description on top) + default: + ; + } + + bool bKad = (pbyBufIn[0] & 0x01) == 0; // check the marker bit if this is a kad or ed2k packet, this is only an indicator since old clients have it set random + // might be an encrypted packet, try to decrypt + + CRC4EncryptableBuffer receivebuffer; + uint32 dwValue = 0; + bool bFlipTry = false; + do{ + bKad = bFlipTry ? !bKad : bKad; + MD5Sum md5; + + if (bKad){ + if (Kademlia::CKademlia::GetPrefs()) { + uint8 achKeyData[18]; + memcpy(achKeyData, Kademlia::CKademlia::GetPrefs()->GetKadID().GetData(), 16); + memcpy(achKeyData + 16, pbyBufIn + 1, 2); // random key part sent from remote client + md5.Calculate(achKeyData, sizeof(achKeyData)); + } + } else{ + uint8 achKeyData[23]; + md4cpy(achKeyData, thePrefs::GetUserHash().GetHash()); + achKeyData[20] = MAGICVALUE_UDP; + PokeUInt32(achKeyData + 16, dwIP); + memcpy(achKeyData + 21, pbyBufIn + 1, 2); // random key part sent from remote client + md5.Calculate(achKeyData, sizeof(achKeyData)); + } + + receivebuffer.SetKey(md5, true); + receivebuffer.RC4Crypt(pbyBufIn + 3, (uint8*)&dwValue, sizeof(dwValue)); + ENDIAN_SWAP_I_32(dwValue); + + bFlipTry = !bFlipTry; // next round try the other possibility + } while (dwValue != MAGICVALUE_UDP_SYNC_CLIENT && bFlipTry); // try to decrypt as ed2k as well as kad packet if needed (max 2 rounds) + + if (dwValue == MAGICVALUE_UDP_SYNC_CLIENT){ + // Yup this is an encrypted packet + //DEBUG_ONLY( DebugLog(_T("Received obfuscated UDP packet from clientIP: %s"), ipstr(dwIP)) ); + uint8 byPadLen; + + receivebuffer.RC4Crypt(pbyBufIn + 7, (uint8*)&byPadLen, 1); + nResult -= CRYPT_HEADER_WITHOUTPADDING; + + if (nResult <= byPadLen){ + //DebugLogError(_T("Invalid obfuscated UDP packet from clientIP: %s, Paddingsize (%u) larger than received bytes"), ipstr(dwIP), byPadLen); + return nBufLen; // pass through, let the Receivefunction do the errorhandling on this junk + } + + if (byPadLen > 0) { + receivebuffer.RC4Crypt(NULL, NULL, byPadLen); + } + + nResult -= byPadLen; + + if (bKad){ + if (nResult <= 4){ + //DebugLogError(_T("Obfuscated Kad packet with mismatching size (verify keys missing) received from clientIP: %s"), ipstr(dwIP)); + return nBufLen; // pass through, let the Receivefunction do the errorhandling on this junk; + } + // read the verify keys + *nReceiverVerifyKey = PeekUInt16(pbyBufIn + CRYPT_HEADER_WITHOUTPADDING + byPadLen); + *nSenderVerifyKey = PeekUInt16(pbyBufIn + CRYPT_HEADER_WITHOUTPADDING + byPadLen + 2); + nResult -= 4; + } else { + *nReceiverVerifyKey = 0; + *nSenderVerifyKey = 0; + } + + *ppbyBufOut = pbyBufIn + (nBufLen - nResult); + + receivebuffer.RC4Crypt((uint8*)*ppbyBufOut, (uint8*)*ppbyBufOut, nResult); + //theStats.AddDownDataOverheadCrypt(nBufLen - nResult); + return nResult; // done + } else{ + //DebugLogWarning(_T("Obfuscated packet expected but magicvalue mismatch on UDP packet from clientIP: %s"), ipstr(dwIP)); + return nBufLen; // pass through, let the Receivefunction do the errorhandling on this junk + } +} + +int CEncryptedDatagramSocket::EncryptSendClient(uint8** ppbyBuf, int nBufLen, const uint8* pachClientHashOrKadID, bool bKad, uint16 nReceiverVerifyKey, uint16 nSenderVerifyKey) { + wxASSERT( theApp->GetPublicIP() != 0 || bKad ); + wxASSERT( thePrefs::IsClientCryptLayerSupported() ); + + uint8 byPadLen = 0; // padding disabled for UDP currently + const uint32 nCryptHeaderLen = byPadLen + CRYPT_HEADER_WITHOUTPADDING + (bKad ? 4 : 0); + uint32 nCryptedLen = nBufLen + nCryptHeaderLen; + uint8* pachCryptedBuffer = new uint8[nCryptedLen]; + + uint16 nRandomKeyPart = GetRandomUint16(); + CRC4EncryptableBuffer sendbuffer; + MD5Sum md5; + if (bKad) { + uint8 achKeyData[18]; + md4cpy(achKeyData, pachClientHashOrKadID); + PokeUInt16(achKeyData+16, nRandomKeyPart); + md5.Calculate(achKeyData, sizeof(achKeyData)); + } else { + uint8 achKeyData[23]; + md4cpy(achKeyData, pachClientHashOrKadID); + PokeUInt32(achKeyData+16, theApp->GetPublicIP()); + PokeUInt16(achKeyData+21, nRandomKeyPart); + achKeyData[20] = MAGICVALUE_UDP; + md5.Calculate(achKeyData, sizeof(achKeyData)); + } + + sendbuffer.SetKey(md5, true); + + // create the semi random byte encryption header + uint8 bySemiRandomNotProtocolMarker = 0; + int i; + for (i = 0; i < 128; i++){ + bySemiRandomNotProtocolMarker = GetRandomUint8(); + bySemiRandomNotProtocolMarker = bKad ? (bySemiRandomNotProtocolMarker & 0xFE) : (bySemiRandomNotProtocolMarker | 0x01); // set the ed2k/kad marker bit + + bool bOk = false; + switch (bySemiRandomNotProtocolMarker){ // not allowed values + case OP_EMULEPROT: + case OP_KADEMLIAPACKEDPROT: + case OP_KADEMLIAHEADER: + case OP_UDPRESERVEDPROT1: + case OP_UDPRESERVEDPROT2: + case OP_PACKEDPROT: + break; + default: + bOk = true; + } + + if (bOk) { + break; + } + } + + if (i >= 128){ + // either we have _real_ bad luck or the randomgenerator is a bit messed up + wxASSERT( false ); + bySemiRandomNotProtocolMarker = 0x01; + } + + pachCryptedBuffer[0] = bySemiRandomNotProtocolMarker; + PokeUInt16(pachCryptedBuffer + 1, nRandomKeyPart); + + uint32 dwMagicValue = ENDIAN_SWAP_32(MAGICVALUE_UDP_SYNC_CLIENT); + sendbuffer.RC4Crypt((uint8*)&dwMagicValue, pachCryptedBuffer + 3, 4); + + sendbuffer.RC4Crypt((uint8*)&byPadLen, pachCryptedBuffer + 7, 1); + + for (int j = 0; j < byPadLen; j++){ + uint8 byRand = (uint8)rand(); // they actually dont really need to be random, but it doesn't hurts either + sendbuffer.RC4Crypt((uint8*)&byRand, pachCryptedBuffer + CRYPT_HEADER_WITHOUTPADDING + j, 1); + } + + if (bKad){ + sendbuffer.RC4Crypt((uint8*)&nReceiverVerifyKey, pachCryptedBuffer + CRYPT_HEADER_WITHOUTPADDING + byPadLen, 2); + sendbuffer.RC4Crypt((uint8*)&nSenderVerifyKey, pachCryptedBuffer + CRYPT_HEADER_WITHOUTPADDING + byPadLen + 2, 2); + } + + sendbuffer.RC4Crypt(*ppbyBuf, pachCryptedBuffer + nCryptHeaderLen, nBufLen); + delete[] *ppbyBuf; + *ppbyBuf = pachCryptedBuffer; + + //theStats.AddUpDataOverheadCrypt(nCryptedLen - nBufLen); + return nCryptedLen; +} + +int CEncryptedDatagramSocket::DecryptReceivedServer( + uint8* pbyBufIn, + int nBufLen, uint8 **ppbyBufOut, + uint32 dwBaseKey, + uint32 /*dbgIP*/) +{ + int nResult = nBufLen; + *ppbyBufOut = pbyBufIn; + + if (nResult <= CRYPT_HEADER_WITHOUTPADDING || !thePrefs::IsServerCryptLayerUDPEnabled() || dwBaseKey == 0) { + return nResult; + } + + if(pbyBufIn[0] == OP_EDONKEYPROT) { + return nResult; // no encrypted packet (see description on top) + } + + // might be an encrypted packet, try to decrypt + uint8 achKeyData[7]; + PokeUInt32(achKeyData, dwBaseKey); + achKeyData[4] = MAGICVALUE_UDP_SERVERCLIENT; + memcpy(achKeyData + 5, pbyBufIn + 1, 2); // random key part sent from remote server + + CRC4EncryptableBuffer receivebuffer; + MD5Sum md5(achKeyData, sizeof(achKeyData)); + receivebuffer.SetKey(md5,true); + + uint32 dwValue; + receivebuffer.RC4Crypt(pbyBufIn + 3, (uint8*)&dwValue, sizeof(dwValue)); + ENDIAN_SWAP_I_32(dwValue); + if (dwValue == MAGICVALUE_UDP_SYNC_SERVER){ + // yup this is an encrypted packet + //DEBUG_ONLY( DebugLog(_T("Received obfuscated UDP packet from ServerIP: %s"), ipstr(dbgIP)) ); + uint8 byPadLen; + receivebuffer.RC4Crypt(pbyBufIn + 7, (uint8*)&byPadLen, 1); + byPadLen &= 15; + nResult -= CRYPT_HEADER_WITHOUTPADDING; + + if (nResult <= byPadLen){ + //DebugLogError(_T("Invalid obfuscated UDP packet from ServerIP: %s, Paddingsize (%u) larger than received bytes"), ipstr(dbgIP), byPadLen); + return nBufLen; // pass through, let the Receivefunction do the errorhandling on this junk + } + + if (byPadLen > 0) { + receivebuffer.RC4Crypt(NULL, NULL, byPadLen); + } + + nResult -= byPadLen; + *ppbyBufOut = pbyBufIn + (nBufLen - nResult); + receivebuffer.RC4Crypt((uint8*)*ppbyBufOut, (uint8*)*ppbyBufOut, nResult); + + //theStats.AddDownDataOverheadCrypt(nBufLen - nResult); + return nResult; // done + } else { + //DebugLogWarning(_T("Obfuscated packet expected but magicvalue mismatch on UDP packet from ServerIP: %s"), ipstr(dbgIP)); + return nBufLen; // pass through, let the Receivefunction do the errorhandling on this junk + } +} + +int CEncryptedDatagramSocket::EncryptSendServer(uint8** ppbyBuf, int nBufLen, uint32 dwBaseKey) { + wxASSERT( thePrefs::IsServerCryptLayerUDPEnabled() ); + wxASSERT( dwBaseKey != 0 ); + + uint8 byPadLen = 0; // padding disabled for UDP currently + uint32 nCryptedLen = nBufLen + byPadLen + CRYPT_HEADER_WITHOUTPADDING; + uint8* pachCryptedBuffer = new uint8[nCryptedLen]; + + uint16 nRandomKeyPart = GetRandomUint16(); + + uint8 achKeyData[7]; + PokeUInt32(achKeyData, dwBaseKey); + achKeyData[4] = MAGICVALUE_UDP_CLIENTSERVER; + PokeUInt16(achKeyData + 5, nRandomKeyPart); + MD5Sum md5(achKeyData, sizeof(achKeyData)); + CRC4EncryptableBuffer sendbuffer; + sendbuffer.SetKey(md5); + + // create the semi random byte encryption header + uint8 bySemiRandomNotProtocolMarker = 0; + int i; + + for (i = 0; i < 128; i++){ + bySemiRandomNotProtocolMarker = GetRandomUint8(); + if (bySemiRandomNotProtocolMarker != OP_EDONKEYPROT) { // not allowed values + break; + } + } + + if (i >= 128){ + // either we have _real_ bad luck or the randomgenerator is a bit messed up + wxASSERT( false ); + bySemiRandomNotProtocolMarker = 0x01; + } + + pachCryptedBuffer[0] = bySemiRandomNotProtocolMarker; + PokeUInt16(pachCryptedBuffer + 1, nRandomKeyPart); + + uint32 dwMagicValue = ENDIAN_SWAP_32(MAGICVALUE_UDP_SYNC_SERVER); + sendbuffer.RC4Crypt((uint8*)&dwMagicValue, pachCryptedBuffer + 3, 4); + + sendbuffer.RC4Crypt((uint8*)&byPadLen, pachCryptedBuffer + 7, 1); + + for (int j = 0; j < byPadLen; j++){ + uint8 byRand = (uint8)rand(); // they actually dont really need to be random, but it doesn't hurts either + sendbuffer.RC4Crypt((uint8*)&byRand, pachCryptedBuffer + CRYPT_HEADER_WITHOUTPADDING + j, 1); + } + sendbuffer.RC4Crypt(*ppbyBuf, pachCryptedBuffer + CRYPT_HEADER_WITHOUTPADDING + byPadLen, nBufLen); + delete[] *ppbyBuf; + *ppbyBuf = pachCryptedBuffer; + + //theStats.AddUpDataOverheadCrypt(nCryptedLen - nBufLen); + return nCryptedLen; +} diff --git a/src/EncryptedDatagramSocket.h b/src/EncryptedDatagramSocket.h new file mode 100644 index 00000000..57a2ca4b --- /dev/null +++ b/src/EncryptedDatagramSocket.h @@ -0,0 +1,42 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "Proxy.h" +#include "Types.h" + +class CEncryptedDatagramSocket : public CDatagramSocketProxy +{ +public: + CEncryptedDatagramSocket( wxIPaddress &address, wxSocketFlags flags = wxSOCKET_NONE, const CProxyData *proxyData = NULL); + virtual ~CEncryptedDatagramSocket(); + +// TODO: Make protected once the UDP socket is again its own class. + static int DecryptReceivedClient(uint8* pbyBufIn, int nBufLen, uint8** ppbyBufOut, uint32 dwIP, uint16* nReceiverVerifyKey, uint16* nSenderVerifyKey); + static int EncryptSendClient(uint8** ppbyBuf, int nBufLen, const uint8* pachClientHashOrKadID, bool bKad, uint16 nReceiverVerifyKey, uint16 nSenderVerifyKey); + + static int DecryptReceivedServer(uint8* pbyBufIn, int nBufLen, uint8** ppbyBufOut, uint32 dwBaseKey, uint32 dbgIP); + static int EncryptSendServer(uint8** ppbyBuf, int nBufLen, uint32 dwBaseKey); + +}; diff --git a/src/EncryptedStreamSocket.cpp b/src/EncryptedStreamSocket.cpp new file mode 100644 index 00000000..690fb5f0 --- /dev/null +++ b/src/EncryptedStreamSocket.cpp @@ -0,0 +1,796 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +/* Basic Obfuscated Handshake Protocol Client <-> Client: + -Keycreation: + - Client A (Outgoing connection): + Sendkey: Md5() 21 + Receivekey: Md5() 21 + - Client B (Incomming connection): + Sendkey: Md5() 21 + Receivekey: Md5() 21 + NOTE: First 1024 Bytes are discarded + + - Handshake + -> The handshake is encrypted - except otherwise noted - by the Keys created above + -> Handshake is blocking - do not start sending an answer before the request is completly received (this includes the random bytes) + -> EncryptionMethod = 0 is Obfusication and the only supported right now + Client A: + Client B: + -> The basic handshake is finished here, if an additional/different EncryptionMethod was selected it may continue negotiating details for this one + + - Overhead: 18-48 (~33) Bytes + 2 * IP/TCP Headers per Connection + + - Security for Basic Obfusication: + - Random looking stream, very limited protection against passive eavesdropping single connections + + - Additional Comments: + - RandomKeyPart is needed to make multiple connections between two clients look different (but still random), since otherwise the same key + would be used and RC4 would create the same output. Since the key is a MD5 hash it doesnt weakens the key if that part is known + - Why DH-KeyAgreement isn't used as basic obfusication key: It doesn't offers substantial more protection against passive connection based protocol identification, it has about 200 bytes more overhead, + needs more CPU time, we cannot say if the received data is junk, unencrypted or part of the keyagreement before the handshake is finished without loosing the complete randomness, + it doesn't offers substantial protection against eavesdropping without added authentification + +Basic Obfuscated Handshake Protocol Client <-> Server: + - RC4 Keycreation: + - Client (Outgoing connection): + Sendkey: Md5() 97 + Receivekey: Md5() 97 + - Server (Incomming connection): + Sendkey: Md5() 97 + Receivekey: Md5() 97 + + NOTE: First 1024 Bytes are discarded + + - Handshake + -> The handshake is encrypted - except otherwise noted - by the Keys created above + -> Handshake is blocking - do not start sending an answer before the request is completly received (this includes the random bytes) + -> EncryptionMethod = 0 is Obfusication and the only supported right now + + Client: + Server: + Client: (Answer delayed till first payload to save a frame) + + + -> The basic handshake is finished here, if an additional/different EncryptionMethod was selected it may continue negotiating details for this one + + - Overhead: 206-251 (~229) Bytes + 2 * IP/TCP Headers Headers per Connectionon + + - DH Agreement Specifics: sizeof(a) and sizeof(b) = 128 Bits, g = 2, p = dh768_p (see below), sizeof p, s, etc. = 768 bits +*/ +#include "EncryptedStreamSocket.h" +#include "amule.h" +#include "Logger.h" +#include "Preferences.h" +#include "ServerConnect.h" +#include "RC4Encrypt.h" +#include "MemFile.h" +#include "ClientList.h" +#include "RandomFunctions.h" + +#include + +#include +#include + +#define MAGICVALUE_REQUESTER 34 // modification of the requester-send and server-receive key +#define MAGICVALUE_SERVER 203 // modification of the server-send and requester-send key +#define MAGICVALUE_SYNC 0x835E6FC4 // value to check if we have a working encrypted stream +#define DHAGREEMENT_A_BITS 128 + +#define PRIMESIZE_BYTES 96 +static unsigned char dh768_p[]={ + 0xF2,0xBF,0x52,0xC5,0x5F,0x58,0x7A,0xDD,0x53,0x71,0xA9,0x36, + 0xE8,0x86,0xEB,0x3C,0x62,0x17,0xA3,0x3E,0xC3,0x4C,0xB4,0x0D, + 0xC7,0x3A,0x41,0xA6,0x43,0xAF,0xFC,0xE7,0x21,0xFC,0x28,0x63, + 0x66,0x53,0x5B,0xDB,0xCE,0x25,0x9F,0x22,0x86,0xDA,0x4A,0x91, + 0xB2,0x07,0xCB,0xAA,0x52,0x55,0xD4,0xF6,0x1C,0xCE,0xAE,0xD4, + 0x5A,0xD5,0xE0,0x74,0x7D,0xF7,0x78,0x18,0x28,0x10,0x5F,0x34, + 0x0F,0x76,0x23,0x87,0xF8,0x8B,0x28,0x91,0x42,0xFB,0x42,0x68, + 0x8F,0x05,0x15,0x0F,0x54,0x8B,0x5F,0x43,0x6A,0xF7,0x0D,0xF3, + }; + +// winsock2.h already defines it +#ifdef SOCKET_ERROR +#undef SOCKET_ERROR +#endif +#define SOCKET_ERROR (-1) + +CEncryptedStreamSocket::CEncryptedStreamSocket(wxSocketFlags flags, const CProxyData *proxyData) : CSocketClientProxy(flags, proxyData) +{ + m_StreamCryptState = thePrefs::IsClientCryptLayerSupported() ? ECS_UNKNOWN : ECS_NONE; + m_NegotiatingState = ONS_NONE; + m_nObfusicationBytesReceived = 0; + m_bFullReceive = true; + m_dbgbyEncryptionSupported = 0xFF; + m_dbgbyEncryptionRequested = 0xFF; + m_dbgbyEncryptionMethodSet = 0xFF; + m_nReceiveBytesWanted = 0; + m_EncryptionMethod = ENM_OBFUSCATION; + m_nRandomKeyPart = 0; + m_bServerCrypt = false; +} + +CEncryptedStreamSocket::~CEncryptedStreamSocket() +{ + +} + + +/* External interface */ + +void CEncryptedStreamSocket::SetConnectionEncryption(bool bEnabled, const uint8* pTargetClientHash, bool bServerConnection){ + if (m_StreamCryptState != ECS_UNKNOWN && m_StreamCryptState != ECS_NONE){ + if (!m_StreamCryptState == ECS_NONE || bEnabled) { + wxASSERT( false ); + } + return; + } + + if (bEnabled && pTargetClientHash != NULL && !bServerConnection){ + m_StreamCryptState = ECS_PENDING; + // create obfuscation keys, see on top for key format + + // use the crypt random generator + m_nRandomKeyPart = GetRandomUint32(); + + uint8 achKeyData[21]; + md4cpy(achKeyData, pTargetClientHash); + PokeUInt32(achKeyData + 17, m_nRandomKeyPart); + + achKeyData[16] = MAGICVALUE_REQUESTER; + MD5Sum md5(achKeyData, sizeof(achKeyData)); + m_pfiSendBuffer.SetKey(md5); + + achKeyData[16] = MAGICVALUE_SERVER; + md5.Calculate(achKeyData, sizeof(achKeyData)); + m_pfiReceiveBuffer.SetKey(md5); + + } else if (bServerConnection && bEnabled) { + //printf("->Server crypt\n"); + m_bServerCrypt = true; + m_StreamCryptState = ECS_PENDING_SERVER; + } else { + wxASSERT( !bEnabled ); + m_StreamCryptState = ECS_NONE; + } +} + +/* Internals, common to base class */ + +// unfortunatly sending cannot be made transparent for the derived class, because of WSA_WOULDBLOCK +// together with the fact that each byte must pass the keystream only once +int CEncryptedStreamSocket::Write(const void* lpBuf, wxUint32 nBufLen){ + //printf("Starting write for %s\n", (const char*) unicode2char(DbgGetIPString())); + if (!IsEncryptionLayerReady()) { + wxASSERT(0); + return 0; + } else if (m_bServerCrypt && m_StreamCryptState == ECS_ENCRYPTING && !m_pfiSendBuffer.IsEmpty()){ + wxASSERT( m_NegotiatingState == ONS_BASIC_SERVER_DELAYEDSENDING ); + // handshakedata was delayed to put it into one frame with the first paypload to the server + // do so now with the payload attached + int nRes = SendNegotiatingData(lpBuf, nBufLen, nBufLen); + wxASSERT( nRes != SOCKET_ERROR ); + (void)nRes; + return nBufLen; // report a full send, even if we didn't for some reason - the data is now in our buffer and will be handled later + } else if (m_NegotiatingState == ONS_BASIC_SERVER_DELAYEDSENDING) { + wxASSERT(0); + } + + if (m_StreamCryptState == ECS_UNKNOWN) { + //this happens when the encryption option was not set on a outgoing connection + //or if we try to send before receiving on a incoming connection - both shouldn't happen + m_StreamCryptState = ECS_NONE; + //DebugLogError(_T("CEncryptedStreamSocket: Overwriting State ECS_UNKNOWN with ECS_NONE because of premature Send() (%s)"), DbgGetIPString()); + } + + //printf("Writing %i bytes of data\n", nBufLen); + CSocketClientProxy::Write(lpBuf, nBufLen); + return CSocketClientProxy::LastCount(); +} + +int CEncryptedStreamSocket::Read(void* lpBuf, wxUint32 nBufLen) { + CSocketClientProxy::Read(lpBuf, nBufLen); + m_nObfusicationBytesReceived = CSocketClientProxy::LastCount(); + m_bFullReceive = m_nObfusicationBytesReceived == (uint32)nBufLen; + + //printf("Read %i bytes on %s, socket %p\n", m_nObfusicationBytesReceived, (const char*) unicode2char(DbgGetIPString()), this); + + if (m_nObfusicationBytesReceived == SOCKET_ERROR || m_nObfusicationBytesReceived <= 0){ + return m_nObfusicationBytesReceived; + } + + switch (m_StreamCryptState) { + case ECS_NONE: // disabled, just pass it through + return m_nObfusicationBytesReceived; + case ECS_PENDING: + case ECS_PENDING_SERVER: + //printf("Received %i bytes before sending?\n", m_nObfusicationBytesReceived); + wxASSERT( false ); + //DebugLogError(_T("CEncryptedStreamSocket Received data before sending on outgoing connection")); + m_StreamCryptState = ECS_NONE; + return m_nObfusicationBytesReceived; + case ECS_UNKNOWN: { + //printf("Receiving encrypted data on ECS_UNKNOWN\n"); + uint32 nRead = 1; + bool bNormalHeader = false; + switch (((uint8*)lpBuf)[0]){ + case OP_EDONKEYPROT: + case OP_PACKEDPROT: + case OP_EMULEPROT: + bNormalHeader = true; + break; + } + + if (!bNormalHeader) { + //printf("Not a normal header, negotiating encryption\n"); + StartNegotiation(false); + const uint32 nNegRes = Negotiate((uint8*)lpBuf + nRead, m_nObfusicationBytesReceived - nRead); + if (nNegRes == (-1)) { + return 0; + } + nRead += nNegRes; + if (nRead != (uint32)m_nObfusicationBytesReceived){ + // this means we have more data then the current negotiation step required (or there is a bug) and this should never happen + // (note: even if it just finished the handshake here, there still can be no data left, since the other client didnt received our response yet) + //DebugLogError(_T("CEncryptedStreamSocket: Client %s sent more data then expected while negotiating, disconnecting (1)"), DbgGetIPString()); + //printf("On error: encryption\n"); + OnError(ERR_ENCRYPTION); + } + return 0; + } else { + // doesn't seems to be encrypted + //printf("Encrypted data doesn't seem to be encrypted\n"); + m_StreamCryptState = ECS_NONE; + + // if we require an encrypted connection, cut the connection here. This shouldn't happen that often + // at least with other up-to-date eMule clients because they check for incompability before connecting if possible + if (thePrefs::IsClientCryptLayerRequired()){ + // TODO: Remove me when i have been solved + // Even if the Require option is enabled, we currently have to accept unencrypted connection which are made + // for lowid/firewall checks from servers and other from us selected client. Otherwise, this option would + // always result in a lowid/firewalled status. This is of course not nice, but we can't avoid this walkarround + // untill servers and kad completely support encryption too, which will at least for kad take a bit + // only exception is the .ini option ClientCryptLayerRequiredStrict which will even ignore test connections + // Update: New server now support encrypted callbacks + amuleIPV4Address address; + GetPeer(address); + uint32 ip = StringIPtoUint32(address.IPAddress()); + if (thePrefs::IsClientCryptLayerRequiredStrict() || (!theApp->serverconnect->AwaitingTestFromIP(ip) + && !theApp->clientlist->IsKadFirewallCheckIP(ip)) ) + { + OnError(ERR_ENCRYPTION_NOTALLOWED); + return 0; + } else { + //AddDebugLogLine(DLP_DEFAULT, false, _T("Incoming unencrypted firewallcheck connection permitted despite RequireEncryption setting - %s"), DbgGetIPString() ); + } + + } + + return m_nObfusicationBytesReceived; // buffer was unchanged, we can just pass it through + } + } + case ECS_ENCRYPTING: + //printf("Encryption enabled on data receiving, decrypting and passing along\n"); + // basic obfusication enabled and set, so decrypt and pass along + m_pfiReceiveBuffer.RC4Crypt((uint8*)lpBuf, (uint8*)lpBuf, m_nObfusicationBytesReceived); + //DumpMem(lpBuf, m_nObfusicationBytesReceived, wxT("Directly decrypted data:")); + return m_nObfusicationBytesReceived; + case ECS_NEGOTIATING:{ + //printf("Negotiating on data receive\n"); + const uint32 nRead = Negotiate((uint8*)lpBuf, m_nObfusicationBytesReceived); + if (nRead == (-1)) { + //printf("-> Encryption read error on negotiation\n"); + return 0; + } else if (nRead != (uint32)m_nObfusicationBytesReceived && m_StreamCryptState != ECS_ENCRYPTING) { + //printf("-> Too much data, bailing out of negotiation step\n"); + // this means we have more data then the current negotiation step required (or there is a bug) and this should never happen + //DebugLogError(_T("CEncryptedStreamSocket: Client %s sent more data then expected while negotiating, disconnecting (2)"), DbgGetIPString()); + OnError(ERR_ENCRYPTION); + return 0; + } else if (nRead != (uint32)m_nObfusicationBytesReceived && m_StreamCryptState == ECS_ENCRYPTING){ + //printf("-> Handshake negotiation finished\n"); + // we finished the handshake and if we this was an outgoing connection it is allowed (but strange and unlikely) that the client sent payload + //DebugLogWarning(_T("CEncryptedStreamSocket: Client %s has finished the handshake but also sent payload on a outgoing connection"), DbgGetIPString()); + memmove(lpBuf, (uint8*)lpBuf + nRead, m_nObfusicationBytesReceived - nRead); + return m_nObfusicationBytesReceived - nRead; + } else { + //printf("-> Negotiation went probably ok\n"); + return 0; + } + } + default: + wxASSERT( false ); + return m_nObfusicationBytesReceived; + } +} + +void CEncryptedStreamSocket::OnSend(int) { + + // if the socket just connected and this is outgoing, we might want to start the handshake here + if (m_StreamCryptState == ECS_PENDING || m_StreamCryptState == ECS_PENDING_SERVER){ + //printf("Starting connection negotiation on OnSend for %s\n", (const char*) unicode2char(DbgGetIPString())); + StartNegotiation(true); + return; + } + + // check if we have negotiating data pending + if (!m_pfiSendBuffer.IsEmpty()){ + wxASSERT( m_StreamCryptState >= ECS_NEGOTIATING ); + SendNegotiatingData(NULL, 0); + } +} + +void CEncryptedStreamSocket::CryptPrepareSendData(uint8* pBuffer, uint32 nLen){ + if (!IsEncryptionLayerReady()){ + wxASSERT( false ); // must be a bug + return; + } + if (m_StreamCryptState == ECS_UNKNOWN){ + //this happens when the encryption option was not set on a outgoing connection + //or if we try to send before receiving on a incoming connection - both shouldn't happen + m_StreamCryptState = ECS_NONE; + //DebugLogError(_T("CEncryptedStreamSocket: Overwriting State ECS_UNKNOWN with ECS_NONE because of premature Send() (%s)"), DbgGetIPString()); + } + if (m_StreamCryptState == ECS_ENCRYPTING) { + //printf("Preparing crypt data on %s\n", (const char*) unicode2char(DbgGetIPString())); + //DumpMem(pBuffer, nLen, wxT("Before crypt prepare:\n")); + m_pfiSendBuffer.RC4Crypt(pBuffer, pBuffer, nLen); + //DumpMem(pBuffer, nLen, wxT("After crypt prepare:\n")); + } +} + +/* Internals, just for this class (can be raped) */ + +bool CEncryptedStreamSocket::IsEncryptionLayerReady(){ + return ( (m_StreamCryptState == ECS_NONE || m_StreamCryptState == ECS_ENCRYPTING || m_StreamCryptState == ECS_UNKNOWN ) + && (m_pfiSendBuffer.IsEmpty() || (m_bServerCrypt && m_NegotiatingState == ONS_BASIC_SERVER_DELAYEDSENDING)) ); +} + + +void CEncryptedStreamSocket::StartNegotiation(bool bOutgoing) +{ + //printf("Starting socket negotiation\n"); + if (!bOutgoing){ + //printf("Incoming connection negotiation on %s\n", (const char*) unicode2char(DbgGetIPString())); + m_NegotiatingState = ONS_BASIC_CLIENTA_RANDOMPART; + m_StreamCryptState = ECS_NEGOTIATING; + m_nReceiveBytesWanted = 4; + } else if (m_StreamCryptState == ECS_PENDING) { + //printf("Socket is client.pending on negotiation\n"); + CMemFile fileRequest(29); + const uint8 bySemiRandomNotProtocolMarker = GetSemiRandomNotProtocolMarker(); + fileRequest.WriteUInt8(bySemiRandomNotProtocolMarker); + fileRequest.WriteUInt32(m_nRandomKeyPart); + fileRequest.WriteUInt32(MAGICVALUE_SYNC); + const uint8 bySupportedEncryptionMethod = ENM_OBFUSCATION; // we do not support any further encryption in this version + fileRequest.WriteUInt8(bySupportedEncryptionMethod); + fileRequest.WriteUInt8(bySupportedEncryptionMethod); // so we also prefer this one + uint8 byPadding = (uint8)(GetRandomUint8() % (thePrefs::GetCryptTCPPaddingLength() + 1)); + fileRequest.WriteUInt8(byPadding); + for (int i = 0; i < byPadding; i++) { + fileRequest.WriteUInt8(GetRandomUint8()); + } + + m_NegotiatingState = ONS_BASIC_CLIENTB_MAGICVALUE; + m_StreamCryptState = ECS_NEGOTIATING; + m_nReceiveBytesWanted = 4; + + SendNegotiatingData(fileRequest.GetRawBuffer(), (uint32)fileRequest.GetLength(), 5); + } else if (m_StreamCryptState == ECS_PENDING_SERVER) { + //printf("Socket is server.pending on negotiation\n"); + CMemFile fileRequest(113); + const uint8 bySemiRandomNotProtocolMarker = GetSemiRandomNotProtocolMarker(); + fileRequest.WriteUInt8(bySemiRandomNotProtocolMarker); + + m_cryptDHA.Randomize((CryptoPP::AutoSeededRandomPool&)GetRandomPool(), DHAGREEMENT_A_BITS); // our random a + wxASSERT( m_cryptDHA.MinEncodedSize() <= DHAGREEMENT_A_BITS / 8 ); + CryptoPP::Integer cryptDHPrime((byte*)dh768_p, PRIMESIZE_BYTES); // our fixed prime + // calculate g^a % p + CryptoPP::Integer cryptDHGexpAmodP = a_exp_b_mod_c(CryptoPP::Integer(2), m_cryptDHA, cryptDHPrime); + wxASSERT( m_cryptDHA.MinEncodedSize() <= PRIMESIZE_BYTES ); + // put the result into a buffer + uint8 aBuffer[PRIMESIZE_BYTES]; + cryptDHGexpAmodP.Encode(aBuffer, PRIMESIZE_BYTES); + + fileRequest.Write(aBuffer, PRIMESIZE_BYTES); + uint8 byPadding = (uint8)(GetRandomUint8() % 16); // add random padding + fileRequest.WriteUInt8(byPadding); + + for (int i = 0; i < byPadding; i++) { + fileRequest.WriteUInt8(GetRandomUint8()); + } + + m_NegotiatingState = ONS_BASIC_SERVER_DHANSWER; + m_StreamCryptState = ECS_NEGOTIATING; + m_nReceiveBytesWanted = 96; + + SendNegotiatingData(fileRequest.GetRawBuffer(), (uint32)fileRequest.GetLength(), (uint32)fileRequest.GetLength()); + } else { + wxASSERT( false ); + m_StreamCryptState = ECS_NONE; + return; + } +} + +int CEncryptedStreamSocket::Negotiate(const uint8* pBuffer, uint32 nLen){ + uint32 nRead = 0; + wxASSERT( m_nReceiveBytesWanted > 0 ); + + //DumpMem(pBuffer, nLen, wxT("Negotiate buffer: ")); + + try{ + while (m_NegotiatingState != ONS_COMPLETE && m_nReceiveBytesWanted > 0){ + if (m_nReceiveBytesWanted > 512){ + wxASSERT( false ); + return 0; + } + + const uint32 nToRead = std::min(nLen - nRead, m_nReceiveBytesWanted); + //printf("Reading %i bytes, add from %i position on %i position\n",nToRead, nRead, (int)m_pfiReceiveBuffer.GetPosition()); + //DumpMem(pBuffer + nRead, nToRead, wxT("Recv Buffer: ")); + m_pfiReceiveBuffer.ResetData(); + m_pfiReceiveBuffer.Write(pBuffer + nRead, nToRead); + nRead += nToRead; + m_nReceiveBytesWanted -= nToRead; + if (m_nReceiveBytesWanted > 0) { + return nRead; + } + + if (m_NegotiatingState != ONS_BASIC_CLIENTA_RANDOMPART && m_NegotiatingState != ONS_BASIC_SERVER_DHANSWER) { + // We have the keys, decrypt + //printf("We have the keys, so decrypt away on %s\n", (const char*) unicode2char(DbgGetIPString())); + m_pfiReceiveBuffer.Encrypt(); + } + + m_pfiReceiveBuffer.Seek(0); + + switch (m_NegotiatingState){ + case ONS_NONE: // would be a bug + wxASSERT( false ); + return 0; + case ONS_BASIC_CLIENTA_RANDOMPART: { + //printf("We are on ONS_BASIC_CLIENTA_RANDOMPART, create the keys on %s\n", (const char*) unicode2char(DbgGetIPString())); + // This creates the send/receive keys. + + uint8 achKeyData[21]; + md4cpy(achKeyData, thePrefs::GetUserHash().GetHash()); + m_pfiReceiveBuffer.Read(achKeyData + 17, 4); + + achKeyData[16] = MAGICVALUE_REQUESTER; + + //DumpMem(achKeyData, sizeof(achKeyData), wxT("ach:")); + + MD5Sum md5(achKeyData, sizeof(achKeyData)); + //DumpMem(md5.GetRawHash(), 16, wxT("Md5:")); + m_pfiReceiveBuffer.SetKey(md5); + + achKeyData[16] = MAGICVALUE_SERVER; + md5.Calculate(achKeyData, sizeof(achKeyData)); + m_pfiSendBuffer.SetKey(md5); + + m_NegotiatingState = ONS_BASIC_CLIENTA_MAGICVALUE; + m_nReceiveBytesWanted = 4; + break; + } + + case ONS_BASIC_CLIENTA_MAGICVALUE: { + // Check the magic value to confirm encryption works. + //printf("Creating magic value on negotiate on %s\n", (const char*) unicode2char(DbgGetIPString())); + + uint32 dwValue = m_pfiReceiveBuffer.ReadUInt32(); + + if (dwValue == MAGICVALUE_SYNC){ + // yup, the one or the other way it worked, this is an encrypted stream + //DEBUG_ONLY( DebugLog(_T("Received proper magic value, clientIP: %s"), DbgGetIPString()) ); + // set the receiver key + //printf("Magic value works on %s\n", (const char*) unicode2char(DbgGetIPString())); + m_NegotiatingState = ONS_BASIC_CLIENTA_METHODTAGSPADLEN; + m_nReceiveBytesWanted = 3; + } else { + //printf("Wrong magic value: 0x%x != 0x%x on %s\n",dwValue, MAGICVALUE_SYNC, (const char*)unicode2char(DbgGetIPString())); + //DebugLogError(_T("CEncryptedStreamSocket: Received wrong magic value from clientIP %s on a supposly encrytped stream / Wrong Header"), DbgGetIPString()); + OnError(ERR_ENCRYPTION); + return (-1); + } + break; + } + case ONS_BASIC_CLIENTA_METHODTAGSPADLEN: { + + // Get encryption method and padding. + // Might fall back to padding process, but the bytes will be ignored. + //printf("Getting encryption method on negotiation\n"); + + m_dbgbyEncryptionSupported = m_pfiReceiveBuffer.ReadUInt8(); + m_dbgbyEncryptionRequested = m_pfiReceiveBuffer.ReadUInt8(); + + if (m_dbgbyEncryptionRequested != ENM_OBFUSCATION) { + //printf("Unsupported encryption method!\n"); +// AddDebugLogLine(DLP_LOW, false, _T("CEncryptedStreamSocket: Client %s preffered unsupported encryption method (%i)"), DbgGetIPString(), m_dbgbyEncryptionRequested); + } + + m_nReceiveBytesWanted = m_pfiReceiveBuffer.ReadUInt8(); + + m_NegotiatingState = ONS_BASIC_CLIENTA_PADDING; + + if (m_nReceiveBytesWanted > 0) { + // No padding + break; + } + } + + case ONS_BASIC_CLIENTA_PADDING:{ + //printf("Negotiating on padding, completing\n"); + // ignore the random bytes, send the response, set status complete + CMemFile fileResponse(26); + fileResponse.WriteUInt32(MAGICVALUE_SYNC); + const uint8 bySelectedEncryptionMethod = ENM_OBFUSCATION; // we do not support any further encryption in this version, so no need to look which the other client preferred + fileResponse.WriteUInt8(bySelectedEncryptionMethod); + + amuleIPV4Address address; + GetPeer(address); + const uint8 byPaddingLen = theApp->serverconnect->AwaitingTestFromIP(StringIPtoUint32(address.IPAddress())) ? 16 : (thePrefs::GetCryptTCPPaddingLength() + 1); + uint8 byPadding = (uint8)(GetRandomUint8() % byPaddingLen); + + fileResponse.WriteUInt8(byPadding); + for (int i = 0; i < byPadding; i++) { + fileResponse.WriteUInt8((uint8)rand()); + } + SendNegotiatingData(fileResponse.GetRawBuffer(), (uint32)fileResponse.GetLength()); + m_NegotiatingState = ONS_COMPLETE; + m_StreamCryptState = ECS_ENCRYPTING; + //DEBUG_ONLY( DebugLog(_T("CEncryptedStreamSocket: Finished Obufscation handshake with client %s (incoming)"), DbgGetIPString()) ); + break; + } + + case ONS_BASIC_CLIENTB_MAGICVALUE:{ + //printf("Negotiating on magic value\n"); + if (m_pfiReceiveBuffer.ReadUInt32() != MAGICVALUE_SYNC){ + //DebugLogError(_T("CEncryptedStreamSocket: EncryptedstreamSyncError: Client sent wrong Magic Value as answer, cannot complete handshake (%s)"), DbgGetIPString()); + OnError(ERR_ENCRYPTION); + return (-1); + } + m_NegotiatingState = ONS_BASIC_CLIENTB_METHODTAGSPADLEN; + m_nReceiveBytesWanted = 2; + break; + } + case ONS_BASIC_CLIENTB_METHODTAGSPADLEN:{ + //printf("Negotiating on client B pad length\n"); + m_dbgbyEncryptionMethodSet = m_pfiReceiveBuffer.ReadUInt8(); + if (m_dbgbyEncryptionMethodSet != ENM_OBFUSCATION){ + //DebugLogError( _T("CEncryptedStreamSocket: Client %s set unsupported encryption method (%i), handshake failed"), DbgGetIPString(), m_dbgbyEncryptionMethodSet); + OnError(ERR_ENCRYPTION); + return (-1); + } + m_nReceiveBytesWanted = m_pfiReceiveBuffer.ReadUInt8(); + m_NegotiatingState = ONS_BASIC_CLIENTB_PADDING; + if (m_nReceiveBytesWanted > 0) { + break; + } + } + case ONS_BASIC_CLIENTB_PADDING: + //printf("Negotiating on client B padding, handshake complete\n"); + // ignore the random bytes, the handshake is complete + m_NegotiatingState = ONS_COMPLETE; + m_StreamCryptState = ECS_ENCRYPTING; + //DEBUG_ONLY( DebugLog(_T("CEncryptedStreamSocket: Finished Obufscation handshake with client %s (outgoing)"), DbgGetIPString()) ); + break; + case ONS_BASIC_SERVER_DHANSWER:{ + wxASSERT( !m_cryptDHA.IsZero() ); + uint8 aBuffer[PRIMESIZE_BYTES + 1]; + m_pfiReceiveBuffer.Read(aBuffer, PRIMESIZE_BYTES); + CryptoPP::Integer cryptDHAnswer((byte*)aBuffer, PRIMESIZE_BYTES); + CryptoPP::Integer cryptDHPrime((byte*)dh768_p, PRIMESIZE_BYTES); // our fixed prime + CryptoPP::Integer cryptResult = a_exp_b_mod_c(cryptDHAnswer, m_cryptDHA, cryptDHPrime); + + m_cryptDHA = 0; + //DEBUG_ONLY( ZeroMemory(aBuffer, sizeof(aBuffer)) ); + wxASSERT( cryptResult.MinEncodedSize() <= PRIMESIZE_BYTES ); + + // create the keys + cryptResult.Encode(aBuffer, PRIMESIZE_BYTES); + aBuffer[PRIMESIZE_BYTES] = MAGICVALUE_REQUESTER; + MD5Sum md5(aBuffer, sizeof(aBuffer)); + m_pfiSendBuffer.SetKey(md5); + aBuffer[PRIMESIZE_BYTES] = MAGICVALUE_SERVER; + md5.Calculate(aBuffer, sizeof(aBuffer)); + m_pfiReceiveBuffer.SetKey(md5); + + m_NegotiatingState = ONS_BASIC_SERVER_MAGICVALUE; + m_nReceiveBytesWanted = 4; + break; + } + case ONS_BASIC_SERVER_MAGICVALUE:{ + uint32 dwValue = m_pfiReceiveBuffer.ReadUInt32(); + if (dwValue == MAGICVALUE_SYNC){ + // yup, the one or the other way it worked, this is an encrypted stream + //DebugLog(_T("Received proper magic value after DH-Agreement from Serverconnection IP: %s"), DbgGetIPString()); + // set the receiver key + m_NegotiatingState = ONS_BASIC_SERVER_METHODTAGSPADLEN; + m_nReceiveBytesWanted = 3; + } else { + //DebugLogError(_T("CEncryptedStreamSocket: Received wrong magic value after DH-Agreement from Serverconnection"), DbgGetIPString()); + OnError(ERR_ENCRYPTION); + return (-1); + } + break; + } + case ONS_BASIC_SERVER_METHODTAGSPADLEN: + m_dbgbyEncryptionSupported = m_pfiReceiveBuffer.ReadUInt8(); + m_dbgbyEncryptionRequested = m_pfiReceiveBuffer.ReadUInt8(); + if (m_dbgbyEncryptionRequested != ENM_OBFUSCATION) { + // AddDebugLogLine(DLP_LOW, false, _T("CEncryptedStreamSocket: Server %s preffered unsupported encryption method (%i)"), DbgGetIPString(), m_dbgbyEncryptionRequested); + } + m_nReceiveBytesWanted = m_pfiReceiveBuffer.ReadUInt8(); + m_NegotiatingState = ONS_BASIC_SERVER_PADDING; + if (m_nReceiveBytesWanted > 0) { + break; + } + case ONS_BASIC_SERVER_PADDING:{ + // ignore the random bytes (they are decrypted already), send the response, set status complete + CMemFile fileResponse(26); + fileResponse.WriteUInt32(MAGICVALUE_SYNC); + const uint8 bySelectedEncryptionMethod = ENM_OBFUSCATION; // we do not support any further encryption in this version, so no need to look which the other client preferred + fileResponse.WriteUInt8(bySelectedEncryptionMethod); + + // Server callback connection only allows 16 bytes of padding. + uint8 byPadding = (uint8)(GetRandomUint8() % 16); + fileResponse.WriteUInt8(byPadding); + + for (int i = 0; i < byPadding; i++) { + fileResponse.WriteUInt8((uint8)rand()); + } + + m_NegotiatingState = ONS_BASIC_SERVER_DELAYEDSENDING; + SendNegotiatingData(fileResponse.GetRawBuffer(), (uint32)fileResponse.GetLength(), 0, true); // don't actually send it right now, store it in our sendbuffer + m_StreamCryptState = ECS_ENCRYPTING; + //DEBUG_ONLY( DebugLog(_T("CEncryptedStreamSocket: Finished DH Obufscation handshake with Server %s"), DbgGetIPString()) ); + break; + } + default: + wxASSERT( false ); + } + + } + m_pfiReceiveBuffer.ResetData(); + return nRead; + } catch(...){ + // can only be caused by a bug in negationhandling, not by the datastream + //error->Delete(); + //printf("Bug on negotiation?\n"); + wxASSERT( false ); + OnError(ERR_ENCRYPTION); + m_pfiReceiveBuffer.ResetData(); + return (-1); + } + +} + +int CEncryptedStreamSocket::SendNegotiatingData(const void* lpBuf, uint32 nBufLen, uint32 nStartCryptFromByte, bool bDelaySend){ + wxASSERT( m_StreamCryptState == ECS_NEGOTIATING || m_StreamCryptState == ECS_ENCRYPTING ); + wxASSERT( nStartCryptFromByte <= nBufLen ); + wxASSERT( m_NegotiatingState == ONS_BASIC_SERVER_DELAYEDSENDING || !bDelaySend ); + //printf("Send negotiation data on %s\n", (const char*) unicode2char(DbgGetIPString())); + uint8* pBuffer = NULL; + bool bProcess = false; + if (lpBuf != NULL) { + pBuffer = new uint8[nBufLen]; + if (pBuffer == NULL) { + throw CMuleException(wxT("Memory exception"), wxT("Memory exception on TCP encrypted socket")); + } + + if (nStartCryptFromByte > 0) { + memcpy(pBuffer, lpBuf, nStartCryptFromByte); + } + + if (nBufLen - nStartCryptFromByte > 0) { + //printf("Crypting negotiation data on %s starting on byte %i\n", (const char*) unicode2char(DbgGetIPString()), nStartCryptFromByte); + //DumpMem(lpBuf, nBufLen, wxT("Pre-encryption:")); + m_pfiSendBuffer.RC4Crypt((uint8*)lpBuf + nStartCryptFromByte, pBuffer + nStartCryptFromByte, nBufLen - nStartCryptFromByte); + //DumpMem(pBuffer, nBufLen, wxT("Post-encryption:")); + } + + if (!m_pfiSendBuffer.IsEmpty()) { + // we already have data pending. Attach it and try to send + if (m_NegotiatingState == ONS_BASIC_SERVER_DELAYEDSENDING) { + m_NegotiatingState = ONS_COMPLETE; + } else { + wxASSERT( false ); + } + m_pfiSendBuffer.Append(pBuffer, nBufLen); + delete[] pBuffer; + pBuffer = NULL; + nStartCryptFromByte = 0; + bProcess = true; // we want to try to send it right now + } + } + + if (lpBuf == NULL || bProcess){ + // this call is for processing pending data + if (m_pfiSendBuffer.IsEmpty() || nStartCryptFromByte != 0){ + wxASSERT( false ); + return 0; // or not + } + nBufLen = (uint32)m_pfiSendBuffer.GetLength(); + pBuffer = m_pfiSendBuffer.Detach(); + } + + wxASSERT( m_pfiSendBuffer.IsEmpty() ); + + uint32 result = 0; + if (!bDelaySend) { + //printf("Writing negotiation data on %s: ", (const char*) unicode2char(DbgGetIPString())); + CSocketClientProxy::Write(pBuffer, nBufLen); + result = CSocketClientProxy::LastCount(); + //printf("Wrote %i bytes\n",result); + } + + if (result == (uint32)SOCKET_ERROR || bDelaySend){ + m_pfiSendBuffer.Write(pBuffer, nBufLen); + delete[] pBuffer; + return result; + } else { + if (result < nBufLen){ + // Store the partial data pending + //printf("Partial negotiation pending on %s\n", (const char*) unicode2char(DbgGetIPString())); + m_pfiSendBuffer.Write(pBuffer + result, nBufLen - result); + } + delete[] pBuffer; + return result; + } +} + +wxString CEncryptedStreamSocket::DbgGetIPString(){ + amuleIPV4Address address; + GetPeer(address); + return address.IPAddress(); +} + +uint8 CEncryptedStreamSocket::GetSemiRandomNotProtocolMarker() const{ + uint8 bySemiRandomNotProtocolMarker = 0; + bool bOk = false; + for (int i = 0; i < 128; i++){ + bySemiRandomNotProtocolMarker = GetRandomUint8(); + switch (bySemiRandomNotProtocolMarker) { // not allowed values + case OP_EDONKEYPROT: + case OP_PACKEDPROT: + case OP_EMULEPROT: + break; + default: + bOk = true; + } + + if (bOk) { + break; + } + } + + if (!bOk){ + // either we have _real_ bad luck or the randomgenerator is a bit messed up + wxASSERT( false ); + bySemiRandomNotProtocolMarker = 0x01; + } + return bySemiRandomNotProtocolMarker; +} diff --git a/src/EncryptedStreamSocket.h b/src/EncryptedStreamSocket.h new file mode 100644 index 00000000..f055bf81 --- /dev/null +++ b/src/EncryptedStreamSocket.h @@ -0,0 +1,156 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +/* This class supports obfuscation and encryption for a *Mule tcp connection. + Right now only basic obfusication is supported, but this can be expanded, as their is a + dedicated handshake to negotiate the encryption method used. + + Please note, even if obfuscation uses encryption methods, it does not fulfill cryptographic standards since it + doesn't use secret (and for rc4 important: unique) keys +*/ + +#ifndef __ENCRYPTEDSTREAMSOCKET_H__ +#define __ENCRYPTEDSTREAMSOCKET_H__ + +#include +#include + +// cryptoPP used for DH integer calculations +#include "CryptoPP_Inc.h" // Needed for Crypto functions +#include "Proxy.h" +#include "Types.h" + +#include "RC4Encrypt.h" + +#define ERR_WRONGHEADER 0x01 +#define ERR_TOOBIG 0x02 +#define ERR_ENCRYPTION 0x03 +#define ERR_ENCRYPTION_NOTALLOWED 0x04 + +enum EStreamCryptState { + ECS_NONE = 0, // Disabled or not available + ECS_UNKNOWN, // Incoming connection, will test the first incoming data for encrypted protocol + ECS_PENDING, // Outgoing connection, will start sending encryption protocol + ECS_PENDING_SERVER, // Outgoing serverconnection, will start sending encryption protocol + ECS_NEGOTIATING, // Encryption supported, handshake still uncompleted + ECS_ENCRYPTING // Encryption enabled +}; + +enum ENegotiatingState { + ONS_NONE, + + ONS_BASIC_CLIENTA_RANDOMPART, + ONS_BASIC_CLIENTA_MAGICVALUE, + ONS_BASIC_CLIENTA_METHODTAGSPADLEN, + ONS_BASIC_CLIENTA_PADDING, + + ONS_BASIC_CLIENTB_MAGICVALUE, + ONS_BASIC_CLIENTB_METHODTAGSPADLEN, + ONS_BASIC_CLIENTB_PADDING, + + ONS_BASIC_SERVER_DHANSWER, + ONS_BASIC_SERVER_MAGICVALUE, + ONS_BASIC_SERVER_METHODTAGSPADLEN, + ONS_BASIC_SERVER_PADDING, + ONS_BASIC_SERVER_DELAYEDSENDING, + + ONS_COMPLETE +}; + +enum EEncryptionMethods { + ENM_OBFUSCATION = 0x00 +}; + +class CRC4EncryptableBuffer; + +class CEncryptedStreamSocket : public CSocketClientProxy +{ +public: + CEncryptedStreamSocket( + wxSocketFlags flags = wxSOCKET_NONE, + const CProxyData *proxyData = NULL); + virtual ~CEncryptedStreamSocket(); + + void SetConnectionEncryption( + bool bEnabled, + const uint8 *pTargetClientHash, + bool bServerConnection); + + //! Indicates how many bytes were received including obfusication + //! so that the parent knows if the receive limit was reached + uint32 GetRealReceivedBytes() const + { + return m_nObfusicationBytesReceived; + } + + bool IsObfusicating() const + { + return m_StreamCryptState == ECS_ENCRYPTING && + m_EncryptionMethod == ENM_OBFUSCATION; + } + + bool IsServerCryptEnabledConnection() const { return m_bServerCrypt; } + + uint8 m_dbgbyEncryptionSupported; + uint8 m_dbgbyEncryptionRequested; + uint8 m_dbgbyEncryptionMethodSet; + +protected: + int Write(const void* lpBuf, wxUint32 nBufLen); + int Read(void* lpBuf, wxUint32 nBufLen); + + virtual void OnError(int /*nErrorCode*/) {}; + virtual void OnSend(int nErrorCode); + + wxString DbgGetIPString(); + void CryptPrepareSendData(uint8* pBuffer, uint32 nLen); + bool IsEncryptionLayerReady(); + uint8 GetSemiRandomNotProtocolMarker() const; + + uint32 m_nObfusicationBytesReceived; + EStreamCryptState m_StreamCryptState; + EEncryptionMethods m_EncryptionMethod; + bool m_bFullReceive; + bool m_bServerCrypt; + +private: + int Negotiate(const uint8* pBuffer, uint32 nLen); + void StartNegotiation(bool bOutgoing); + int SendNegotiatingData( + const void *lpBuf, + uint32 nBufLen, + uint32 nStartCryptFromByte = 0, + bool bDelaySend = false); + + ENegotiatingState m_NegotiatingState; + CRC4EncryptableBuffer m_pfiReceiveBuffer; + uint32 m_nReceiveBytesWanted; + CRC4EncryptableBuffer m_pfiSendBuffer; + uint32 m_nRandomKeyPart; + CryptoPP::Integer m_cryptDHA; + +}; + +#endif // __ENCRYPTEDSTREAMSOCKET_H__ diff --git a/src/ExternalConn.cpp b/src/ExternalConn.cpp new file mode 100644 index 00000000..4af0bf5d --- /dev/null +++ b/src/ExternalConn.cpp @@ -0,0 +1,1453 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 Kry ( elkry@sourceforge.net / http://www.amule.org ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifdef HAVE_CONFIG_H + #include "config.h" // Needed for VERSION +#endif + +#include // Needed for CECSocket + +#include // Needed for CFormat + +#include + +#include "ExternalConn.h" // Interface declarations +#include "updownclient.h" // Needed for CUpDownClient +#include "Server.h" // Needed for CServer +#include "ServerList.h" // Needed for CServerList +#include "PartFile.h" // Needed for CPartFile +#include "ServerConnect.h" // Needed for CServerConnect +#include "UploadQueue.h" // Needed for CUploadQueue +#include "amule.h" // Needed for theApp +#include "SearchList.h" // Needed for GetSearchResults +#include "IPFilter.h" // Needed for CIPFilter +#include "ClientList.h" +#include "Preferences.h" // Needed for CPreferences +#include "Logger.h" +#include "GuiEvents.h" // Needed for Notify_* macros +#include "Statistics.h" // Needed for theStats +#include "KnownFileList.h" // Needed for CKnownFileList +#include "kademlia/kademlia/Kademlia.h" + + +//-------------------- CECServerSocket -------------------- + +class CECServerSocket : public CECMuleSocket +{ +public: + CECServerSocket(); + virtual ~CECServerSocket(); + + virtual const CECPacket *OnPacketReceived(const CECPacket *packet); + virtual void OnLost(); + +private: + bool m_authenticated; + CPartFile_Encoder_Map m_part_encoder; + CKnownFile_Encoder_Map m_shared_encoder; + CObjTagMap m_obj_tagmap; +}; + + +CECServerSocket::CECServerSocket() +: +CECMuleSocket(true), +m_authenticated(false), +m_part_encoder(), +m_shared_encoder(), +m_obj_tagmap() +{ + wxASSERT(theApp->ECServerHandler); + theApp->ECServerHandler->AddSocket(this); +} + + +CECServerSocket::~CECServerSocket() +{ + wxASSERT(theApp->ECServerHandler); + theApp->ECServerHandler->RemoveSocket(this); +} + + +const CECPacket *CECServerSocket::OnPacketReceived(const CECPacket *packet) +{ + const CECPacket *reply = NULL; + + if (!m_authenticated) { + reply = ExternalConn::Authenticate(packet); + if (reply->GetOpCode() != EC_OP_AUTH_OK) { + // Access denied! + AddLogLineM(false, _("Unauthorized access attempt. Connection closed.")); + DestroySocket(); + } else { + m_authenticated = true; + } + } else { + reply = ExternalConn::ProcessRequest2( + packet, m_part_encoder, m_shared_encoder, m_obj_tagmap); + } + return reply; +} + + +void CECServerSocket::OnLost() +{ + AddLogLineM(false,_("External connection closed.")); + DestroySocket(); +} + + +//-------------------- ExternalConn -------------------- + +enum +{ // id for sockets + SERVER_ID = 1000 +}; + + +BEGIN_EVENT_TABLE(ExternalConn, wxEvtHandler) + EVT_SOCKET(SERVER_ID, ExternalConn::OnServerEvent) +END_EVENT_TABLE() + + +ExternalConn::ExternalConn(amuleIPV4Address addr, wxString *msg) +{ + wxString msgLocal; + m_ECServer = NULL; + // Are we allowed to accept External Connections? + if ( thePrefs::AcceptExternalConnections() ) { + // We must have a valid password, otherwise we will not allow EC connections + if (thePrefs::ECPassword().IsEmpty()) { + *msg += wxT("External connections disabled due to empty password!\n"); + AddLogLineM(true, _("External connections disabled due to empty password!")); + return; + } + + // Create the socket + m_ECServer = new wxSocketServer(addr, wxSOCKET_REUSEADDR); + m_ECServer->SetEventHandler(*this, SERVER_ID); + m_ECServer->SetNotify(wxSOCKET_CONNECTION_FLAG); + m_ECServer->Notify(true); + + int port = addr.Service(); + wxString ip = addr.IPAddress(); + if (m_ECServer->Ok()) { + msgLocal = wxT("*** TCP socket (ECServer) listening on ") + ip + + wxString::Format(wxT(":%d"), port); + *msg += msgLocal + wxT("\n"); + AddLogLineM(false, msgLocal); + } else { + msgLocal = wxT("Could not listen for external connections at ") + ip + + wxString::Format(wxT(":%d!"), port); + *msg += msgLocal + wxT("\n"); + AddLogLineM(false, msgLocal); + } + } else { + *msg += wxT("External connections disabled in config file\n"); + AddLogLineM(false,_("External connections disabled in config file")); + } +} + + +ExternalConn::~ExternalConn() +{ + KillAllSockets(); + delete m_ECServer; +} + + +void ExternalConn::AddSocket(CECServerSocket *s) +{ + wxASSERT(s); + socket_list.insert(s); +} + + +void ExternalConn::RemoveSocket(CECServerSocket *s) +{ + wxASSERT(s); + socket_list.erase(s); +} + + +void ExternalConn::KillAllSockets() +{ + AddDebugLogLineM(false, logGeneral, + CFormat(wxT("ExternalConn::KillAllSockets(): %d sockets to destroy.")) % + socket_list.size()); + SocketSet::iterator it = socket_list.begin(); + while (it != socket_list.end()) { + CECServerSocket *s = *(it++); + s->Close(); + s->Destroy(); + delete s; + } +} + + +void ExternalConn::OnServerEvent(wxSocketEvent& WXUNUSED(event)) +{ + CECServerSocket *sock = new CECServerSocket; + // Accept new connection if there is one in the pending + // connections queue, else exit. We use Accept(FALSE) for + // non-blocking accept (although if we got here, there + // should ALWAYS be a pending connection). + if ( m_ECServer->AcceptWith(*sock, false) ) { + AddLogLineM(false, _("New external connection accepted")); + } else { + delete sock; + AddLogLineM(false, _("Error: couldn't accept a new external connection")); + } + +} + +// +// Authentication +// +CECPacket *ExternalConn::Authenticate(const CECPacket *request) +{ + CECPacket *response; + + if (request == NULL) { + response = new CECPacket(EC_OP_AUTH_FAIL); + return response; + } + + // Password must be specified if we are to allow remote connections + if ( thePrefs::ECPassword().IsEmpty() ) { + AddLogLineM(true, _("External connection refused due to empty password in preferences!")); + + return new CECPacket(EC_OP_AUTH_FAIL); + } + + + if (request->GetOpCode() == EC_OP_AUTH_REQ) { + const CECTag *clientName = request->GetTagByName(EC_TAG_CLIENT_NAME); + const CECTag *clientVersion = request->GetTagByName(EC_TAG_CLIENT_VERSION); + + AddLogLineM(false, CFormat( _("Connecting client: %s %s") ) + % ( clientName ? clientName->GetStringData() : wxString(_("Unknown")) ) + % ( clientVersion ? clientVersion->GetStringData() : wxString(_("Unknown version")) ) ); + const CECTag *passwd = request->GetTagByName(EC_TAG_PASSWD_HASH); + const CECTag *protocol = request->GetTagByName(EC_TAG_PROTOCOL_VERSION); +#ifdef EC_VERSION_ID + // For SVN versions, both client and server must use SVNDATE, and they must be the same + CMD4Hash vhash; + if (not vhash.Decode(wxT(EC_VERSION_ID))) { + response = new CECPacket(EC_OP_AUTH_FAIL); + response->AddTag(CECTag(EC_TAG_STRING, wxT("Fatal error, version hash is not a valid MD4-hash."))); + } else if (!request->GetTagByName(EC_TAG_VERSION_ID) || request->GetTagByNameSafe(EC_TAG_VERSION_ID)->GetMD4Data() != vhash) { + response = new CECPacket(EC_OP_AUTH_FAIL); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("Incorrect EC version ID, there might be binary incompatibility. Use core and remote from same snapshot."))); +#else + // For release versions, we don't want to allow connections from any arbitrary SVN client. + if (request->GetTagByName(EC_TAG_VERSION_ID)) { + response = new CECPacket(EC_OP_AUTH_FAIL); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("You cannot connect to a release version from an arbitrary SVN version! *sigh* possible crash prevented"))); +#endif + } else if (protocol != NULL) { + uint16 proto_version = protocol->GetInt(); + if (proto_version == EC_CURRENT_PROTOCOL_VERSION) { + CMD4Hash passh; + + if (!passh.Decode(thePrefs::ECPassword())) { + AddLogLineM(false, wxT("EC Auth failed, invalid hash specificed as EC password: ") + thePrefs::ECPassword()); + response = new CECPacket(EC_OP_AUTH_FAIL); + response->AddTag(CECTag(EC_TAG_STRING, wxT("Authentication failed, invalid hash specified as EC password."))); + } else if (passwd && passwd->GetMD4Data() == passh) { + response = new CECPacket(EC_OP_AUTH_OK); + } else { + if (passwd) { + AddLogLineM(false, wxT("EC Auth failed: (") + passwd->GetMD4Data().Encode() + wxT(" != ") + passh.Encode() + wxT(").")); + } else { + AddLogLineM(false, wxT("EC Auth failed. Password tag missing.")); + } + + response = new CECPacket(EC_OP_AUTH_FAIL); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("Authentication failed."))); + } + } else { + response = new CECPacket(EC_OP_AUTH_FAIL); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("Invalid protocol version.") + wxString::Format(wxT("( %i != %i )"),proto_version,EC_CURRENT_PROTOCOL_VERSION))); + } + } else { + response = new CECPacket(EC_OP_AUTH_FAIL); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("Missing protocol version tag."))); + } + } else { + response = new CECPacket(EC_OP_AUTH_FAIL); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("Invalid request, you should first authenticate."))); + } + + response->AddTag(CECTag(EC_TAG_SERVER_VERSION, wxT(VERSION))); + + if (response->GetOpCode() == EC_OP_AUTH_OK) { + AddLogLineM(false, _("Access granted.")); + } else { + AddLogLineM(false, wxGetTranslation(response->GetTagByIndex(0)->GetStringData())); + } + + return response; +} + +CECPacket *Get_EC_Response_StatRequest(const CECPacket *request) +{ + CECPacket *response = new CECPacket(EC_OP_STATS); + + switch (request->GetDetailLevel()) { + case EC_DETAIL_FULL: + response->AddTag(CECTag(EC_TAG_STATS_UP_OVERHEAD, (uint32)theStats::GetUpOverheadRate())); + response->AddTag(CECTag(EC_TAG_STATS_DOWN_OVERHEAD, (uint32)theStats::GetDownOverheadRate())); + response->AddTag(CECTag(EC_TAG_STATS_BANNED_COUNT, /*(uint32)*/theStats::GetBannedCount())); + case EC_DETAIL_WEB: + case EC_DETAIL_CMD: + response->AddTag(CECTag(EC_TAG_STATS_UL_SPEED, (uint32)theStats::GetUploadRate())); + response->AddTag(CECTag(EC_TAG_STATS_DL_SPEED, (uint32)(theStats::GetDownloadRate()))); + response->AddTag(CECTag(EC_TAG_STATS_UL_SPEED_LIMIT, (uint32)(thePrefs::GetMaxUpload()*1024.0))); + response->AddTag(CECTag(EC_TAG_STATS_DL_SPEED_LIMIT, (uint32)(thePrefs::GetMaxDownload()*1024.0))); + response->AddTag(CECTag(EC_TAG_STATS_UL_QUEUE_LEN, /*(uint32)*/theStats::GetWaitingUserCount())); + response->AddTag(CECTag(EC_TAG_STATS_TOTAL_SRC_COUNT, /*(uint32)*/theStats::GetFoundSources())); + // User/Filecounts + { + uint32 totaluser = 0, totalfile = 0; + theApp->serverlist->GetUserFileStatus( totaluser, totalfile ); + response->AddTag(CECTag(EC_TAG_STATS_ED2K_USERS, totaluser)); + response->AddTag(CECTag(EC_TAG_STATS_KAD_USERS, Kademlia::CKademlia::GetKademliaUsers())); + response->AddTag(CECTag(EC_TAG_STATS_ED2K_FILES, totalfile)); + response->AddTag(CECTag(EC_TAG_STATS_KAD_FILES, Kademlia::CKademlia::GetKademliaFiles())); + } + case EC_DETAIL_UPDATE: + case EC_DETAIL_INC_UPDATE: + break; + }; + + return response; +} + +CECPacket *Get_EC_Response_GetSharedFiles(const CECPacket *request, CKnownFile_Encoder_Map &encoders) +{ + wxASSERT(request->GetOpCode() == EC_OP_GET_SHARED_FILES); + + CECPacket *response = new CECPacket(EC_OP_SHARED_FILES); + + EC_DETAIL_LEVEL detail_level = request->GetDetailLevel(); + // + // request can contain list of queried items + CTagSet queryitems(request); + + encoders.UpdateEncoders(theApp->sharedfiles); + + for (uint32 i = 0; i < theApp->sharedfiles->GetFileCount(); ++i) { + CKnownFile *cur_file = (CKnownFile *)theApp->sharedfiles->GetFileByIndex(i); + + if ( !cur_file || (!queryitems.empty() && !queryitems.count(cur_file->GetFileHash())) ) { + continue; + } + + CEC_SharedFile_Tag filetag(cur_file, detail_level); + CKnownFile_Encoder &enc = encoders[cur_file]; + if ( detail_level != EC_DETAIL_UPDATE ) { + enc.ResetEncoder(); + } + enc.Encode(&filetag); + response->AddTag(filetag); + } + return response; +} + +CECPacket *Get_EC_Response_GetSharedFiles(CKnownFile_Encoder_Map &encoders, CObjTagMap &tagmap) +{ + CECPacket *response = new CECPacket(EC_OP_SHARED_FILES); + + encoders.UpdateEncoders(theApp->sharedfiles); + for (uint32 i = 0; i < theApp->sharedfiles->GetFileCount(); ++i) { + CKnownFile *cur_file = (CKnownFile *)theApp->sharedfiles->GetFileByIndex(i); + + // + // Hashes of tags are maintained on "per-object" basis. So, in this mode only + // same kind of objects can go into particular query type. + // Particulary here it means that files from download queue (aka partfiles) + // will not ne shown as shared files. Remote gui can do combine them if wishes + // + if ( !cur_file || cur_file->IsPartFile() ) continue; + + CValueMap &valuemap = tagmap.GetValueMap(cur_file); + CEC_SharedFile_Tag filetag(cur_file, valuemap); + CKnownFile_Encoder &enc = encoders[cur_file]; + enc.Encode(&filetag); + + response->AddTag(filetag); + } + return response; +} + +CECPacket *Get_EC_Response_GetWaitQueue(const CECPacket *request) +{ + wxASSERT(request->GetOpCode() == EC_OP_GET_WAIT_QUEUE); + + CECPacket *response = new CECPacket(EC_OP_WAIT_QUEUE); + + EC_DETAIL_LEVEL detail_level = request->GetDetailLevel(); + + // + // request can contain list of queried items + CTagSet queryitems(request); + + const CClientPtrList& uploading = theApp->uploadqueue->GetWaitingList(); + CClientPtrList::const_iterator it = uploading.begin(); + for (; it != uploading.end(); ++it) { + CUpDownClient* cur_client = *it; + + if ( !cur_client || (!queryitems.empty() && !queryitems.count(cur_client->GetUserIDHybrid())) ) { + continue; + } + CEC_UpDownClient_Tag cli_tag(cur_client, detail_level); + + response->AddTag(cli_tag); + } + + return response; +} + +CECPacket *Get_EC_Response_GetWaitQueue(CObjTagMap &tagmap) +{ + CECPacket *response = new CECPacket(EC_OP_WAIT_QUEUE); + + const CClientPtrList& uploading = theApp->uploadqueue->GetWaitingList(); + CClientPtrList::const_iterator it = uploading.begin(); + for (; it != uploading.end(); ++it) { + CUpDownClient* cur_client = *it; + + CValueMap &valuemap = tagmap.GetValueMap(cur_client); + CEC_UpDownClient_Tag cli_tag(cur_client, valuemap); + + response->AddTag(cli_tag); + } + + return response; +} + +CECPacket *Get_EC_Response_GetUpQueue(const CECPacket *request) +{ + wxASSERT(request->GetOpCode() == EC_OP_GET_ULOAD_QUEUE); + + CECPacket *response = new CECPacket(EC_OP_ULOAD_QUEUE); + + EC_DETAIL_LEVEL detail_level = request->GetDetailLevel(); + + // + // request can contain list of queried items + CTagSet queryitems(request); + + + const CClientPtrList& uploading = theApp->uploadqueue->GetUploadingList(); + CClientPtrList::const_iterator it = uploading.begin(); + for (; it != uploading.end(); ++it) { + CUpDownClient* cur_client = *it; + + if ( !cur_client || (!queryitems.empty() && !queryitems.count(cur_client->GetUserIDHybrid())) ) { + continue; + } + + CEC_UpDownClient_Tag cli_tag(cur_client, detail_level); + response->AddTag(cli_tag); + } + + return response; +} + + +CECPacket *Get_EC_Response_GetUpQueue(CObjTagMap &tagmap) +{ + CECPacket *response = new CECPacket(EC_OP_ULOAD_QUEUE); + + const CClientPtrList& uploading = theApp->uploadqueue->GetUploadingList(); + CClientPtrList::const_iterator it = uploading.begin(); + for (; it != uploading.end(); ++it) { + CUpDownClient* cur_client = *it; + + CValueMap &valuemap = tagmap.GetValueMap(cur_client); + CEC_UpDownClient_Tag cli_tag(cur_client, valuemap); + + response->AddTag(cli_tag); + } + + return response; +} + + +CECPacket *Get_EC_Response_GetDownloadQueue(CPartFile_Encoder_Map &encoders, CObjTagMap &tagmap) +{ + CECPacket *response = new CECPacket(EC_OP_DLOAD_QUEUE); + + encoders.UpdateEncoders(theApp->downloadqueue); + for (unsigned int i = 0; i < theApp->downloadqueue->GetFileCount(); i++) { + CPartFile *cur_file = theApp->downloadqueue->GetFileByIndex(i); + + CValueMap &valuemap = tagmap.GetValueMap(cur_file); + CEC_PartFile_Tag filetag(cur_file, valuemap); + CPartFile_Encoder &enc = encoders[cur_file]; + enc.Encode(&filetag); + + response->AddTag(filetag); + } + return response; +} + +CECPacket *Get_EC_Response_GetDownloadQueue(const CECPacket *request, CPartFile_Encoder_Map &encoders, bool detail = false) +{ + CECPacket *response = new CECPacket(EC_OP_DLOAD_QUEUE); + + EC_DETAIL_LEVEL detail_level = request->GetDetailLevel(); + // + // request can contain list of queried items + CTagSet queryitems(request); + + encoders.UpdateEncoders(theApp->downloadqueue); + + for (unsigned int i = 0; i < theApp->downloadqueue->GetFileCount(); i++) { + CPartFile *cur_file = theApp->downloadqueue->GetFileByIndex(i); + + if ( !queryitems.empty() && !queryitems.count(cur_file->GetFileHash()) ) { + continue; + } + + CEC_PartFile_Tag filetag(cur_file, detail_level, detail); + + CPartFile_Encoder &enc = encoders[cur_file]; + if ( detail_level != EC_DETAIL_UPDATE ) { + enc.ResetEncoder(); + } + enc.Encode(&filetag); + + response->AddTag(filetag); + } + return response; +} + + +CECPacket *Get_EC_Response_PartFile_Cmd(const CECPacket *request) +{ + CECPacket *response = NULL; + + // request can contain multiple files. + for (int i = 0; i < request->GetTagCount(); ++i) { + const CECTag *hashtag = request->GetTagByIndex(i); + + wxASSERT(hashtag->GetTagName() == EC_TAG_PARTFILE); + + CMD4Hash hash = hashtag->GetMD4Data(); + CPartFile *pfile = theApp->downloadqueue->GetFileByID( hash ); + + if ( !pfile ) { + AddLogLineM(false,CFormat(_("Remote PartFile command failed: FileHash not found: %s")) % hash.Encode()); + response = new CECPacket(EC_OP_FAILED); + response->AddTag(CECTag(EC_TAG_STRING, CFormat(wxTRANSLATE("FileHash not found: %s")) % hash.Encode())); + //return response; + break; + } + switch (request->GetOpCode()) { + case EC_OP_PARTFILE_SWAP_A4AF_THIS: + if ((pfile->GetStatus(false) == PS_READY) || + (pfile->GetStatus(false) == PS_EMPTY)) { + CPartFile::SourceSet::const_iterator it = pfile->GetA4AFList().begin(); + while ( it != pfile->GetA4AFList().end() ) { + CUpDownClient *cur_source = *it++; + + cur_source->SwapToAnotherFile(true, false, false, pfile); + } + } + break; + case EC_OP_PARTFILE_SWAP_A4AF_THIS_AUTO: + pfile->SetA4AFAuto(!pfile->IsA4AFAuto()); + break; + case EC_OP_PARTFILE_SWAP_A4AF_OTHERS: + if ((pfile->GetStatus(false) == PS_READY) || + (pfile->GetStatus(false) == PS_EMPTY)) { + CPartFile::SourceSet::const_iterator it = pfile->GetSourceList().begin(); + while ( it != pfile->GetSourceList().end() ) { + CUpDownClient* cur_source = *it++; + + cur_source->SwapToAnotherFile(false, false, false, NULL); + } + } + break; + case EC_OP_PARTFILE_PAUSE: + pfile->PauseFile(); + break; + case EC_OP_PARTFILE_RESUME: + pfile->ResumeFile(); + pfile->SavePartFile(); + break; + case EC_OP_PARTFILE_STOP: + pfile->StopFile(); + break; + case EC_OP_PARTFILE_PRIO_SET: { + uint8 prio = hashtag->GetTagByIndexSafe(0)->GetInt(); + if ( prio == PR_AUTO ) { + pfile->SetAutoDownPriority(1); + } else { + pfile->SetAutoDownPriority(0); + pfile->SetDownPriority(prio); + } + } + break; + case EC_OP_PARTFILE_DELETE: + if ( thePrefs::StartNextFile() && (pfile->GetStatus() != PS_PAUSED) ) { + theApp->downloadqueue->StartNextFile(pfile); + } + pfile->Delete(); + break; + + case EC_OP_PARTFILE_SET_CAT: + pfile->SetCategory(hashtag->GetTagByIndexSafe(0)->GetInt()); + break; + + default: + response = new CECPacket(EC_OP_FAILED); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("OOPS! OpCode processing error!"))); + break; + } + } + if (!response) { + response = new CECPacket(EC_OP_NOOP); + } + return response; +} + +CECPacket *Get_EC_Response_Server_Add(const CECPacket *request) +{ + CECPacket *response = NULL; + + const CECTag *srv_tag = request->GetTagByIndex(0); + + wxString full_addr = srv_tag->GetTagByName(EC_TAG_SERVER_ADDRESS)->GetStringData(); + wxString name = srv_tag->GetTagByName(EC_TAG_SERVER_NAME)->GetStringData(); + + wxString s_ip = full_addr.Left(full_addr.Find(':')); + wxString s_port = full_addr.Mid(full_addr.Find(':') + 1); + + long port = StrToULong(s_port); + CServer* toadd = new CServer(port, s_ip); + toadd->SetListName(name.IsEmpty() ? full_addr : name); + + if ( theApp->AddServer(toadd, true) ) { + response = new CECPacket(EC_OP_NOOP); + } else { + response = new CECPacket(EC_OP_FAILED); + response->AddTag(CECTag(EC_TAG_STRING, _("Server not added"))); + delete toadd; + } + + return response; +} + +CECPacket *Get_EC_Response_Server(const CECPacket *request) +{ + CECPacket *response = NULL; + const CECTag *srv_tag = request->GetTagByIndex(0); + CServer *srv = 0; + if ( srv_tag ) { + srv = theApp->serverlist->GetServerByIPTCP(srv_tag->GetIPv4Data().IP(), srv_tag->GetIPv4Data().m_port); + // server tag passed, but server not found + if ( !srv ) { + response = new CECPacket(EC_OP_FAILED); + response->AddTag(CECTag(EC_TAG_STRING, + CFormat(wxTRANSLATE("server not found: %s")) % srv_tag->GetIPv4Data().StringIP())); + return response; + } + } + switch (request->GetOpCode()) { + case EC_OP_SERVER_DISCONNECT: + theApp->serverconnect->Disconnect(); + response = new CECPacket(EC_OP_NOOP); + break; + case EC_OP_SERVER_REMOVE: + if ( srv ) { + theApp->serverlist->RemoveServer(srv); + response = new CECPacket(EC_OP_NOOP); + } else { + response = new CECPacket(EC_OP_FAILED); + response->AddTag(CECTag(EC_TAG_STRING, + wxTRANSLATE("need to define server to be removed"))); + } + break; + case EC_OP_SERVER_CONNECT: + if (thePrefs::GetNetworkED2K()) { + if ( srv ) { + theApp->serverconnect->ConnectToServer(srv); + response = new CECPacket(EC_OP_NOOP); + } else { + theApp->serverconnect->ConnectToAnyServer(); + response = new CECPacket(EC_OP_NOOP); + } + } else { + response = new CECPacket(EC_OP_FAILED); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("ED2K is disabled in preferences."))); + } + break; + } + if (!response) { + response = new CECPacket(EC_OP_FAILED); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("OOPS! OpCode processing error!"))); + } + return response; +} + +CECPacket *Get_EC_Response_Search_Results(const CECPacket *request) +{ + CECPacket *response = new CECPacket(EC_OP_SEARCH_RESULTS); + + EC_DETAIL_LEVEL detail_level = request->GetDetailLevel(); + // + // request can contain list of queried items + CTagSet queryitems(request); + + const CSearchResultList& list = theApp->searchlist->GetSearchResults(0xffffffff); + CSearchResultList::const_iterator it = list.begin(); + while (it != list.end()) { + CSearchFile* sf = *it++; + if ( !queryitems.empty() && !queryitems.count(sf->GetFileHash()) ) { + continue; + } + response->AddTag(CEC_SearchFile_Tag(sf, detail_level)); + } + return response; +} + +CECPacket *Get_EC_Response_Search_Results(CObjTagMap &tagmap) +{ + CECPacket *response = new CECPacket(EC_OP_SEARCH_RESULTS); + + const CSearchResultList& list = theApp->searchlist->GetSearchResults(0xffffffff); + CSearchResultList::const_iterator it = list.begin(); + while (it != list.end()) { + CSearchFile* sf = *it++; + CValueMap &valuemap = tagmap.GetValueMap(sf); + response->AddTag(CEC_SearchFile_Tag(sf, valuemap)); + } + return response; +} + +CECPacket *Get_EC_Response_Search_Results_Download(const CECPacket *request) +{ + CECPacket *response = new CECPacket(EC_OP_STRINGS); + for (int i = 0;i < request->GetTagCount();i++) { + const CECTag *tag = request->GetTagByIndex(i); + CMD4Hash hash = tag->GetMD4Data(); + uint8 category = tag->GetTagByIndexSafe(0)->GetInt(); + theApp->searchlist->AddFileToDownloadByHash(hash, category); + } + return response; +} + +CECPacket *Get_EC_Response_Search_Stop(const CECPacket *WXUNUSED(request)) +{ + CECPacket *reply = new CECPacket(EC_OP_MISC_DATA); + theApp->searchlist->StopGlobalSearch(); + return reply; +} + +CECPacket *Get_EC_Response_Search(const CECPacket *request) +{ + wxString response; + + CEC_Search_Tag *search_request = (CEC_Search_Tag *)request->GetTagByIndex(0); + theApp->searchlist->RemoveResults(0xffffffff); + + CSearchList::CSearchParams params; + params.searchString = search_request->SearchText(); + params.typeText = search_request->SearchFileType(); + params.extension = search_request->SearchExt(); + params.minSize = search_request->MinSize(); + params.maxSize = search_request->MaxSize(); + params.availability = search_request->Avail(); + + + EC_SEARCH_TYPE search_type = search_request->SearchType(); + SearchType core_search_type = LocalSearch; + switch (search_type) { + case EC_SEARCH_GLOBAL: + core_search_type = GlobalSearch; + case EC_SEARCH_KAD: + if (core_search_type != GlobalSearch) { // Not a global search obviously + core_search_type = KadSearch; + } + case EC_SEARCH_LOCAL: { + uint32 search_id = 0xffffffff; + wxString error = theApp->searchlist->StartNewSearch(&search_id, core_search_type, params); + if (!error.IsEmpty()) { + response = error; + } else { + response = wxTRANSLATE("Search in progress. Refetch results in a moment!"); + } + break; + } + case EC_SEARCH_WEB: + response = wxTRANSLATE("WebSearch from remote interface makes no sense."); + break; + } + + CECPacket *reply = new CECPacket(EC_OP_FAILED); + // error or search in progress + reply->AddTag(CECTag(EC_TAG_STRING, response)); + + return reply; +} + +CECPacket *Get_EC_Response_Set_SharedFile_Prio(const CECPacket *request) +{ + CECPacket *response = new CECPacket(EC_OP_NOOP); + for (int i = 0;i < request->GetTagCount();i++) { + const CECTag *tag = request->GetTagByIndex(i); + CMD4Hash hash = tag->GetMD4Data(); + uint8 prio = tag->GetTagByIndexSafe(0)->GetInt(); + CKnownFile* cur_file = theApp->sharedfiles->GetFileByID(hash); + if ( !cur_file ) { + continue; + } + if (prio == PR_AUTO) { + cur_file->SetAutoUpPriority(1); + cur_file->UpdateAutoUpPriority(); + } else { + cur_file->SetAutoUpPriority(0); + cur_file->SetUpPriority(prio); + } + } + + return response; +} + +CECPacket *Get_EC_Response_Kad_Connect(const CECPacket *request) +{ + CECPacket *response; + if (thePrefs::GetNetworkKademlia()) { + response = new CECPacket(EC_OP_NOOP); + if ( !Kademlia::CKademlia::IsRunning() ) { + Kademlia::CKademlia::Start(); + theApp->ShowConnectionState(); + } + const CECTag *addrtag = request->GetTagByIndex(0); + if ( addrtag ) { + uint32 ip = addrtag->GetIPv4Data().IP(); + uint16 port = addrtag->GetIPv4Data().m_port; + Kademlia::CKademlia::Bootstrap(ip, port); + } + } else { + response = new CECPacket(EC_OP_FAILED); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("Kad is disabled in preferences."))); + } + + return response; +} + +// init with some default size +CPartFile_Encoder::GapBuffer CPartFile_Encoder::m_gap_buffer(128); + +// encoder side +CPartFile_Encoder::CPartFile_Encoder(CPartFile *file) : + m_enc_data(file->GetPartCount(), file->GetGapList().size() * 2) +{ + m_file = file; +} + +// decoder side +CPartFile_Encoder::CPartFile_Encoder(int size): m_enc_data(size, 0) +{ + m_file = 0; +} + +CPartFile_Encoder::~CPartFile_Encoder() +{ +} + +// stl side :) +CPartFile_Encoder::CPartFile_Encoder() +{ + m_file = 0; +} + +CPartFile_Encoder::CPartFile_Encoder(const CPartFile_Encoder &obj) : m_enc_data(obj.m_enc_data) +{ + m_file = obj.m_file; +} + +CPartFile_Encoder &CPartFile_Encoder::operator=(const CPartFile_Encoder &obj) +{ + m_file = obj.m_file; + m_enc_data = obj.m_enc_data; + return *this; +} + +void CPartFile_Encoder::Encode(CECTag *parent) +{ + const CPartFile::CGapPtrList& gaplist = m_file->GetGapList(); + const size_t gap_list_size = gaplist.size(); + + if ( m_gap_buffer.size() < gap_list_size * 2 ) { + m_gap_buffer.clear(); + m_gap_buffer.resize(gap_list_size * 2); + } + + GapBuffer::iterator it = m_gap_buffer.begin(); + + CPartFile::CGapPtrList::const_iterator curr_pos = gaplist.begin(); + for (; curr_pos != gaplist.end(); ++curr_pos) { + Gap_Struct *curr = *curr_pos; + *it++ = ENDIAN_HTONLL(curr->start); + *it++ = ENDIAN_HTONLL(curr->end); + } + + m_enc_data.m_gap_status.Realloc(gap_list_size*2*sizeof(uint64)); + int gap_enc_size = 0; + const unsigned char *gap_enc_data = m_enc_data.m_gap_status.Encode((unsigned char *)&m_gap_buffer[0], gap_enc_size); + + int part_enc_size; + const unsigned char *part_enc_data = m_enc_data.m_part_status.Encode(m_file->m_SrcpartFrequency, part_enc_size); + + + parent->AddTag(CECTag(EC_TAG_PARTFILE_PART_STATUS, part_enc_size, part_enc_data)); + + // + // Put data inside of tag in following order: + // [num_of_gaps] [gap_enc_data] + // + unsigned char *tagdata; + CECTag etag(EC_TAG_PARTFILE_GAP_STATUS, + sizeof(uint32) + gap_enc_size, (void **)&tagdata); + + // real number of gaps - so remote size can realloc + RawPokeUInt32( tagdata, ENDIAN_HTONL( gap_list_size ) ); + tagdata += sizeof(uint32); + memcpy(tagdata, gap_enc_data, gap_enc_size); + + parent->AddTag(etag); + + it = m_gap_buffer.begin(); + + const CPartFile::CReqBlockPtrList& requestedblocks = m_file->GetRequestedBlockList(); + CPartFile::CReqBlockPtrList::const_iterator curr_pos2 = requestedblocks.begin(); + + wxASSERT(m_gap_buffer.size() >= requestedblocks.size() * 2); + for ( ; curr_pos2 != requestedblocks.end(); ++curr_pos2 ) { + Requested_Block_Struct* block = *curr_pos2; + *it++ = ENDIAN_HTONLL(block->StartOffset); + *it++ = ENDIAN_HTONLL(block->EndOffset); + } + parent->AddTag(CECTag(EC_TAG_PARTFILE_REQ_STATUS, + requestedblocks.size() * 2 * sizeof(uint64), (void *)&m_gap_buffer[0])); +} + +// encoder side +CKnownFile_Encoder::CKnownFile_Encoder(CKnownFile *file) : + m_enc_data(file->GetPartCount(), true) +{ + m_file = file; +} + +CKnownFile_Encoder::CKnownFile_Encoder() +{ + m_file = 0; +} + +CKnownFile_Encoder::~CKnownFile_Encoder() +{ +} + +CKnownFile_Encoder::CKnownFile_Encoder(const CKnownFile_Encoder &obj) : m_enc_data(obj.m_enc_data) +{ + m_file = obj.m_file; +} + +CKnownFile_Encoder &CKnownFile_Encoder::operator=(const CKnownFile_Encoder &obj) +{ + m_file = obj.m_file; + m_enc_data = obj.m_enc_data; + return *this; +} + +void CKnownFile_Encoder::Encode(CECTag *parent) +{ + int part_enc_size; + const unsigned char *part_enc_data = m_enc_data.Encode(m_file->m_AvailPartFrequency, part_enc_size); + + parent->AddTag(CECTag(EC_TAG_PARTFILE_PART_STATUS, part_enc_size, part_enc_data)); +} + +CECPacket *GetStatsGraphs(const CECPacket *request) +{ + CECPacket *response = NULL; + + switch (request->GetDetailLevel()) { + case EC_DETAIL_WEB: + case EC_DETAIL_FULL: { + double dTimestamp = 0.0; + if (request->GetTagByName(EC_TAG_STATSGRAPH_LAST) != NULL) { + dTimestamp = request->GetTagByName(EC_TAG_STATSGRAPH_LAST)->GetDoubleData(); + } + uint16 nScale = request->GetTagByNameSafe(EC_TAG_STATSGRAPH_SCALE)->GetInt(); + uint16 nMaxPoints = request->GetTagByNameSafe(EC_TAG_STATSGRAPH_WIDTH)->GetInt(); + uint32 *graphData; + unsigned int numPoints = theApp->m_statistics->GetHistoryForWeb(nMaxPoints, (double)nScale, &dTimestamp, &graphData); + if (numPoints) { + response = new CECPacket(EC_OP_STATSGRAPHS); + response->AddTag(CECTag(EC_TAG_STATSGRAPH_DATA, 4 * numPoints * sizeof(uint32), graphData)); + delete [] graphData; + response->AddTag(CECTag(EC_TAG_STATSGRAPH_LAST, dTimestamp)); + } else { + response = new CECPacket(EC_OP_FAILED); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("No points for graph."))); + } + break; + } + case EC_DETAIL_INC_UPDATE: + case EC_DETAIL_UPDATE: + case EC_DETAIL_CMD: + // No graphs + response = new CECPacket(EC_OP_FAILED); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("Your client is not configured for this detail level."))); + break; + } + if (!response) { + response = new CECPacket(EC_OP_FAILED); + // Unknown reason + } + + return response; +} + +CECPacket *ExternalConn::ProcessRequest2(const CECPacket *request, + CPartFile_Encoder_Map &enc_part_map, CKnownFile_Encoder_Map &enc_shared_map, CObjTagMap &objmap) +{ + + if ( !request ) { + return 0; + } + + CECPacket *response = NULL; + + switch (request->GetOpCode()) { + // + // Misc commands + // + case EC_OP_SHUTDOWN: + if (!theApp->IsOnShutDown()) { + response = new CECPacket(EC_OP_NOOP); + AddLogLineM(true, _("ExternalConn: shutdown requested")); +#ifndef AMULE_DAEMON + { + wxCloseEvent evt; + evt.SetCanVeto(false); + theApp->ShutDown(evt); + } +#else + theApp->ExitMainLoop(); +#endif + } else { + response = new CECPacket(EC_OP_FAILED); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("Already shutting down."))); + } + break; + case EC_OP_ADD_LINK: + for(int i = 0; i < request->GetTagCount();i++) { + const CECTag *tag = request->GetTagByIndex(i); + wxString link = tag->GetStringData(); + int category = tag->GetTagByIndexSafe(0)->GetInt(); + AddLogLineM(true, CFormat(_("ExternalConn: adding link '%s'.")) % link); + if ( theApp->downloadqueue->AddLink(link, category) ) { + response = new CECPacket(EC_OP_NOOP); + } else { + // Error messages are printed by the add function. + response = new CECPacket(EC_OP_FAILED); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("Invalid link or already on list."))); + } + } + break; + // + // Status requests + // + case EC_OP_STAT_REQ: + response = Get_EC_Response_StatRequest(request); + case EC_OP_GET_CONNSTATE: + if (!response) { + response = new CECPacket(EC_OP_MISC_DATA); + } + response->AddTag(CEC_ConnState_Tag(request->GetDetailLevel())); + break; + // + // + // + case EC_OP_GET_SHARED_FILES: + if ( request->GetDetailLevel() == EC_DETAIL_INC_UPDATE ) { + response = Get_EC_Response_GetSharedFiles(enc_shared_map, objmap); + } else { + response = Get_EC_Response_GetSharedFiles(request, enc_shared_map); + } + break; + case EC_OP_GET_DLOAD_QUEUE: + if ( request->GetDetailLevel() == EC_DETAIL_INC_UPDATE ) { + response = Get_EC_Response_GetDownloadQueue(enc_part_map, objmap); + } else { + response = Get_EC_Response_GetDownloadQueue(request, enc_part_map); + } + break; + // transmit source names and comments only if file detail dialog is open + case EC_OP_GET_DLOAD_QUEUE_DETAIL: + if ( request->GetDetailLevel() == EC_DETAIL_INC_UPDATE ) { + response = Get_EC_Response_GetDownloadQueue(enc_part_map, objmap); + } else { + response = Get_EC_Response_GetDownloadQueue(request, enc_part_map, true); + } + break; + case EC_OP_GET_ULOAD_QUEUE: + if ( request->GetDetailLevel() == EC_DETAIL_INC_UPDATE ) { + response = Get_EC_Response_GetUpQueue(objmap); + } else { + response = Get_EC_Response_GetUpQueue(request); + } + break; + case EC_OP_GET_WAIT_QUEUE: + if ( request->GetDetailLevel() == EC_DETAIL_INC_UPDATE ) { + response = Get_EC_Response_GetWaitQueue(objmap); + } else { + response = Get_EC_Response_GetWaitQueue(request); + } + break; + case EC_OP_PARTFILE_REMOVE_NO_NEEDED: + case EC_OP_PARTFILE_REMOVE_FULL_QUEUE: + case EC_OP_PARTFILE_REMOVE_HIGH_QUEUE: + case EC_OP_PARTFILE_CLEANUP_SOURCES: + case EC_OP_PARTFILE_SWAP_A4AF_THIS: + case EC_OP_PARTFILE_SWAP_A4AF_THIS_AUTO: + case EC_OP_PARTFILE_SWAP_A4AF_OTHERS: + case EC_OP_PARTFILE_PAUSE: + case EC_OP_PARTFILE_RESUME: + case EC_OP_PARTFILE_STOP: + case EC_OP_PARTFILE_PRIO_SET: + case EC_OP_PARTFILE_DELETE: + case EC_OP_PARTFILE_SET_CAT: + response = Get_EC_Response_PartFile_Cmd(request); + break; + case EC_OP_SHAREDFILES_RELOAD: + theApp->sharedfiles->Reload(); + response = new CECPacket(EC_OP_NOOP); + break; + case EC_OP_SHARED_SET_PRIO: + response = Get_EC_Response_Set_SharedFile_Prio(request); + break; + case EC_OP_RENAME_FILE: { + CMD4Hash fileHash = request->GetTagByNameSafe(EC_TAG_KNOWNFILE)->GetMD4Data(); + CKnownFile* file = theApp->knownfiles->FindKnownFileByID(fileHash); + wxString newName = request->GetTagByNameSafe(EC_TAG_PARTFILE_NAME)->GetStringData(); + if (!file) { + file = theApp->downloadqueue->GetFileByID(fileHash); + } + if (!file) { + response = new CECPacket(EC_OP_FAILED); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("File not found."))); + break; + } + if (newName.IsEmpty()) { + response = new CECPacket(EC_OP_FAILED); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("Invalid file name."))); + break; + } + + if (theApp->sharedfiles->RenameFile(file, CPath(newName))) { + response = new CECPacket(EC_OP_NOOP); + } else { + response = new CECPacket(EC_OP_FAILED); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("Unable to rename file."))); + } + + break; + } + + + // + // Server commands + // + case EC_OP_SERVER_ADD: + response = Get_EC_Response_Server_Add(request); + break; + case EC_OP_SERVER_DISCONNECT: + case EC_OP_SERVER_CONNECT: + case EC_OP_SERVER_REMOVE: + response = Get_EC_Response_Server(request); + break; + case EC_OP_GET_SERVER_LIST: { + response = new CECPacket(EC_OP_SERVER_LIST); + EC_DETAIL_LEVEL detail_level = request->GetDetailLevel(); + std::vector servers = theApp->serverlist->CopySnapshot(); + for ( + std::vector::const_iterator it = servers.begin(); + it != servers.end(); + ++it + ) { + response->AddTag(CEC_Server_Tag(*it, detail_level)); + } + } + break; + case EC_OP_SERVER_UPDATE_FROM_URL: { + wxString url = request->GetTagByIndexSafe(0)->GetStringData(); + + // Save the new url, and update the UI (if not amuled). + Notify_ServersURLChanged(url); + thePrefs::SetEd2kServersUrl(url); + + theApp->serverlist->UpdateServerMetFromURL(url); + response = new CECPacket(EC_OP_NOOP); + break; + } + // + // IPFilter + // + case EC_OP_IPFILTER_RELOAD: + theApp->ipfilter->Reload(); + response = new CECPacket(EC_OP_NOOP); + break; + // + // Search + // + case EC_OP_SEARCH_START: + response = Get_EC_Response_Search(request); + break; + + case EC_OP_SEARCH_STOP: + response = Get_EC_Response_Search_Stop(request); + break; + + case EC_OP_SEARCH_RESULTS: + if ( request->GetDetailLevel() == EC_DETAIL_INC_UPDATE ) { + response = Get_EC_Response_Search_Results(objmap); + } else { + response = Get_EC_Response_Search_Results(request); + } + break; + + case EC_OP_SEARCH_PROGRESS: + response = new CECPacket(EC_OP_SEARCH_PROGRESS); + response->AddTag(CECTag(EC_TAG_SEARCH_STATUS, + theApp->searchlist->GetSearchProgress())); + break; + + case EC_OP_DOWNLOAD_SEARCH_RESULT: + response = Get_EC_Response_Search_Results_Download(request); + break; + // + // Preferences + // + case EC_OP_GET_PREFERENCES: + response = new CEC_Prefs_Packet(request->GetTagByNameSafe(EC_TAG_SELECT_PREFS)->GetInt(), request->GetDetailLevel()); + break; + case EC_OP_SET_PREFERENCES: + ((CEC_Prefs_Packet *)request)->Apply(); + theApp->glob_prefs->Save(); + if (thePrefs::IsFilteringClients()) { + theApp->clientlist->FilterQueues(); + } + if (thePrefs::IsFilteringServers()) { + theApp->serverlist->FilterServers(); + } + if (!thePrefs::GetNetworkED2K() && theApp->IsConnectedED2K()) { + theApp->DisconnectED2K(); + } + if (!thePrefs::GetNetworkKademlia() && theApp->IsConnectedKad()) { + theApp->StopKad(); + } + response = new CECPacket(EC_OP_NOOP); + break; + + case EC_OP_CREATE_CATEGORY: + if ( request->GetTagCount() == 1 ) { + ((CEC_Category_Tag *)request->GetTagByIndex(0))->Create(); + Notify_CategoryAdded(); + } + response = new CECPacket(EC_OP_NOOP); + break; + case EC_OP_UPDATE_CATEGORY: + if ( request->GetTagCount() == 1 ) { + CEC_Category_Tag *tag = (CEC_Category_Tag *)request->GetTagByIndex(0); + tag->Apply(); + Notify_CategoryUpdate(tag->GetInt()); + } + response = new CECPacket(EC_OP_NOOP); + break; + case EC_OP_DELETE_CATEGORY: + if ( request->GetTagCount() == 1 ) { + uint32 cat = request->GetTagByIndex(0)->GetInt(); + Notify_CategoryDelete(cat); + } + response = new CECPacket(EC_OP_NOOP); + break; + + // + // Logging + // + case EC_OP_ADDLOGLINE: + AddLogLineM( (request->GetTagByName(EC_TAG_LOG_TO_STATUS) != NULL), request->GetTagByNameSafe(EC_TAG_STRING)->GetStringData() ); + response = new CECPacket(EC_OP_NOOP); + break; + case EC_OP_ADDDEBUGLOGLINE: + AddDebugLogLineM( (request->GetTagByName(EC_TAG_LOG_TO_STATUS) != NULL), logGeneral, request->GetTagByNameSafe(EC_TAG_STRING)->GetStringData() ); + response = new CECPacket(EC_OP_NOOP); + break; + case EC_OP_GET_LOG: + response = new CECPacket(EC_OP_LOG); + response->AddTag(CECTag(EC_TAG_STRING, theApp->GetLog(false))); + break; + case EC_OP_GET_DEBUGLOG: + response = new CECPacket(EC_OP_DEBUGLOG); + response->AddTag(CECTag(EC_TAG_STRING, theApp->GetDebugLog(false))); + break; + case EC_OP_RESET_LOG: + theApp->GetLog(true); + response = new CECPacket(EC_OP_NOOP); + break; + case EC_OP_RESET_DEBUGLOG: + theApp->GetDebugLog(true); + response = new CECPacket(EC_OP_NOOP); + break; + case EC_OP_GET_LAST_LOG_ENTRY: + { + wxString tmp = theApp->GetLog(false); + if (tmp.Last() == '\n') { + tmp.RemoveLast(); + } + response = new CECPacket(EC_OP_LOG); + response->AddTag(CECTag(EC_TAG_STRING, tmp.AfterLast('\n'))); + } + break; + case EC_OP_GET_SERVERINFO: + response = new CECPacket(EC_OP_SERVERINFO); + response->AddTag(CECTag(EC_TAG_STRING, theApp->GetServerLog(false))); + break; + case EC_OP_CLEAR_SERVERINFO: + theApp->GetServerLog(true); + response = new CECPacket(EC_OP_NOOP); + break; + // + // Statistics + // + case EC_OP_GET_STATSGRAPHS: + response = GetStatsGraphs(request); + break; + case EC_OP_GET_STATSTREE: { + theApp->m_statistics->UpdateStatsTree(); + response = new CECPacket(EC_OP_STATSTREE); + CECTag* tree = theStats::GetECStatTree(request->GetTagByNameSafe(EC_TAG_STATTREE_CAPPING)->GetInt()); + if (tree) { + response->AddTag(*tree); + delete tree; + } + if (request->GetDetailLevel() == EC_DETAIL_WEB) { + response->AddTag(CECTag(EC_TAG_SERVER_VERSION, wxT(VERSION))); + response->AddTag(CECTag(EC_TAG_USER_NICK, thePrefs::GetUserNick())); + } + break; + } + + // + // Kad + // + case EC_OP_KAD_START: + response = Get_EC_Response_Kad_Connect(request); + break; + case EC_OP_KAD_STOP: + theApp->StopKad(); + response = new CECPacket(EC_OP_NOOP); + break; + case EC_OP_KAD_UPDATE_FROM_URL: { + wxString url = request->GetTagByIndexSafe(0)->GetStringData(); + + // Save the new url, and update the UI (if not amuled). + Notify_NodesURLChanged(url); + thePrefs::SetKadNodesUrl(url); + + theApp->UpdateNotesDat(url); + response = new CECPacket(EC_OP_NOOP); + break; + } + case EC_OP_KAD_BOOTSTRAP_FROM_IP: + theApp->BootstrapKad(request->GetTagByIndexSafe(0)->GetInt(), + request->GetTagByIndexSafe(1)->GetInt()); + response = new CECPacket(EC_OP_NOOP); + break; + + // + // Networks + // + case EC_OP_CONNECT: + if (thePrefs::GetNetworkED2K()) { + response = new CECPacket(EC_OP_STRINGS); + if (theApp->IsConnectedED2K()) { + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("Already connected to ED2K."))); + } else { + theApp->serverconnect->ConnectToAnyServer(); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("Connecting to ED2K..."))); + } + } + if (thePrefs::GetNetworkKademlia()) { + if (!response) { + response = new CECPacket(EC_OP_STRINGS); + } + if (theApp->IsConnectedKad()) { + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("Already connected to Kad."))); + } else { + theApp->StartKad(); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("Connecting to Kad..."))); + } + } + if (!response) { + response = new CECPacket(EC_OP_FAILED); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("All networks are disabled."))); + } + break; + case EC_OP_DISCONNECT: + if (theApp->IsConnected()) { + response = new CECPacket(EC_OP_STRINGS); + if (theApp->IsConnectedED2K()) { + theApp->serverconnect->Disconnect(); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("Disconnected from ED2K."))); + } + if (theApp->IsConnectedKad()) { + theApp->StopKad(); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("Disconnected from Kad."))); + } + } else { + response = new CECPacket(EC_OP_NOOP); + } + break; + + default: + AddLogLineM(false, wxString::Format(_("ExternalConn: invalid opcode received: %#x"), request->GetOpCode())); + wxFAIL; + response = new CECPacket(EC_OP_FAILED); + response->AddTag(CECTag(EC_TAG_STRING, wxTRANSLATE("Invalid opcode (wrong protocol version?)"))); + break; + } + return response; +} +// File_checked_for_headers diff --git a/src/ExternalConn.h b/src/ExternalConn.h new file mode 100644 index 00000000..799ec95c --- /dev/null +++ b/src/ExternalConn.h @@ -0,0 +1,239 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 Kry ( elkry@users.sourceforge.net / http://www.amule.org ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef EXTERNALCONN_H +#define EXTERNALCONN_H + + + +#include + +#include "amuleIPV4Address.h" // for amuleIPV4Address +#include "RLE.h" // for RLE +#include "DownloadQueue.h" + +class wxSocketServer; +class wxSocketEvent; + +// +// T - type of item +// E - type of encoder +// C - type of container in theApp +template +class CFileEncoderMap : public std::map { + public: + void UpdateEncoders(C *container) + { + // check if encoder contains files that no longer in container + // or, we have new files without encoder yet + std::set curr_files, dead_files; + for (unsigned int i = 0; i < container->GetFileCount(); i++) { + // cast for case of 'const' + T *cur_file = (T *)container->GetFileByIndex(i); + curr_files.insert(cur_file); + if ( this->count(cur_file) == 0 ) { + this->operator [](cur_file) = E(cur_file); + } + } + // + // curr_files set is created to minimize lookup time in download queue, + // since GetFileByID have loop inside leading to O(n), in this case + // it will mean O(n^2) + typename std::map::iterator i; + for(i = this->begin(); i != this->end(); i++) { + if ( curr_files.count(i->first) == 0 ) { + dead_files.insert(i->first); + } + } + typename std::set::iterator j; + for(j = dead_files.begin(); j != dead_files.end(); j++) { + this->erase(*j); + } + } +}; + +/*! + * PartStatus strings are quite long - RLE encoding will help. + * + * Instead of sending each time full part-status string, send + * RLE encoded difference from previous one. + * + * However, gap status is different - it's already kind of RLE + * encoding, so futher compression will help a litter (Shannon + * theorem). Instead, calculate diff between list of gaps. + */ +class CPartFile_Encoder { + // + // List of gaps sent to particular client. Since clients + // can request lists in different time, they can get + // different results + PartFileEncoderData m_enc_data; + + // gaps are also RLE encoded, but list have variable size by it's nature. + // so realloc buffer when needed. + // This buffer only needed on core-side, where list is turned into array + // before passing to RLE. Decoder will just use RLE internal buffer + // Buffer can be static, since it is accessed with mutex locked + typedef std::vector GapBuffer; + static GapBuffer m_gap_buffer; + + CPartFile *m_file; + public: + // encoder side + CPartFile_Encoder(CPartFile *file); + + // decoder side + CPartFile_Encoder(int size); + + ~CPartFile_Encoder(); + + // stl side :) + CPartFile_Encoder(); + + CPartFile_Encoder(const CPartFile_Encoder &obj); + + CPartFile_Encoder &operator=(const CPartFile_Encoder &obj); + + // encode - take data from m_file + void Encode(CECTag *parent_tag); + + void ResetEncoder() + { + m_enc_data.ResetEncoder(); + } +}; + +typedef CFileEncoderMap CPartFile_Encoder_Map; + +/* + * Encode 'obtained parts' info to be sent to remote gui + */ +class CKnownFile_Encoder { + RLE_Data m_enc_data; + CKnownFile *m_file; + public: + CKnownFile_Encoder(CKnownFile *file); + ~CKnownFile_Encoder(); + + // stl side :) + CKnownFile_Encoder(); + + CKnownFile_Encoder(const CKnownFile_Encoder &obj); + + CKnownFile_Encoder &operator=(const CKnownFile_Encoder &obj); + // encode - take data from m_file + void Encode(CECTag *parent_tag); + + void ResetEncoder() + { + m_enc_data.ResetEncoder(); + } +}; + +typedef CFileEncoderMap CKnownFile_Encoder_Map; + +template +class CTagSet : public std::set { + void InSet(const CECTag *tag, uint32) + { + this->insert(tag->GetInt()); + } + void InSet(const CECTag *tag, CMD4Hash) + { + this->insert(tag->GetMD4Data()); + } + public: + CTagSet(const CECPacket *request) : std::set() + { + for (int i = 0;i < request->GetTagCount();i++) { + const CECTag *tag = request->GetTagByIndex(i); + if ( tag->GetTagName() == OP ) { + this->InSet(tag, T()); + } + } + } +}; + + +class CObjTagMap { + std::map m_obj_map; + public: + CValueMap &GetValueMap(void *object) + { + return m_obj_map[object]; + } + + size_t size() + { + return m_obj_map.size(); + } + + void RemoveDeleted(std::set& WXUNUSED(current_set)) + {/* + for(std::map::iterator i = m_obj_map.begin(); i != m_obj_map.end(); i++) { + if ( !current_set.count(i->first) ) { + m_obj_map.erase(i->first); + } + } + */ + } +}; + + +class CECServerSocket; + + +class ExternalConn : public wxEvtHandler +{ +private: + typedef std::set SocketSet; + SocketSet socket_list; + +public: + ExternalConn(amuleIPV4Address addr, wxString *msg); + ~ExternalConn(); + + wxSocketServer *m_ECServer; + + static CECPacket *ProcessRequest2( + const CECPacket *request, + CPartFile_Encoder_Map &, + CKnownFile_Encoder_Map &, + CObjTagMap &); + + static CECPacket *Authenticate(const CECPacket *); + + void AddSocket(CECServerSocket *s); + void RemoveSocket(CECServerSocket *s); + void KillAllSockets(); + +private: + // event handlers (these functions should _not_ be virtual) + void OnServerEvent(wxSocketEvent& event); + DECLARE_EVENT_TABLE() +}; + +#endif // EXTERNALCONN_H +// File_checked_for_headers diff --git a/src/ExternalConnector.cpp b/src/ExternalConnector.cpp new file mode 100644 index 00000000..8c27cb36 --- /dev/null +++ b/src/ExternalConnector.cpp @@ -0,0 +1,623 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "ExternalConnector.h" + +#ifdef HAVE_CONFIG_H + #include "config.h" // Needed for VERSION and readline detection +#endif + +#include + +#include // Needed for CFormat + +#include // For wxStringTokenizer + +// For readline +#ifdef HAVE_LIBREADLINE + #if defined(HAVE_READLINE_READLINE_H) + #include // Do_not_auto_remove + #elif defined(HAVE_READLINE_H) + #include // Do_not_auto_remove + #else /* !defined(HAVE_READLINE_H) */ + extern "C" char *readline (const char*); + #endif /* !defined(HAVE_READLINE_H) */ +#else /* !defined(HAVE_READLINE_READLINE_H) */ + /* no readline */ +#endif /* HAVE_LIBREADLINE */ + +// For history +#ifdef HAVE_READLINE_HISTORY + #if defined(HAVE_READLINE_HISTORY_H) + #include // Do_not_auto_remove + #elif defined(HAVE_HISTORY_H) + #include // Do_not_auto_remove + #else /* !defined(HAVE_HISTORY_H) */ + extern "C" void add_history (const char*); + #endif /* defined(HAVE_READLINE_HISTORY_H) */ +#else + /* no history */ +#endif /* HAVE_READLINE_HISTORY */ + + +#include // Needed for CECFileConfig + +#include + +//------------------------------------------------------------------- + +CCommandTree::~CCommandTree() +{ + for (CmdPos_t it = m_subcommands.begin(); it != m_subcommands.end(); ++it) { + delete *it; + } + m_subcommands.clear(); +} + + +CCommandTree* CCommandTree::AddCommand(CCommandTree* command) +{ + command->m_parent = this; + const wxString& cmd = command->m_command; + CmdPos_t it; + for (it = m_subcommands.begin(); it != m_subcommands.end(); ++it) { + if ((*it)->m_command > cmd) { + break; + } + } + m_subcommands.insert(it, command); + return command; +} + + +int CCommandTree::FindCommandId(const wxString& command, wxString& args, wxString& cmdstr) const +{ + wxString cmd = command.BeforeFirst(wxT(' ')).Lower(); + for (CmdPosConst_t it = m_subcommands.begin(); it != m_subcommands.end(); ++it) { + if ((*it)->m_command.Lower() == cmd) { + args = command.AfterFirst(wxT(' ')).Trim(false); + return (*it)->FindCommandId(args, args, cmdstr); + } + } + cmdstr = GetFullCommand().Lower(); + if (m_params == CMD_PARAM_ALWAYS && args.IsEmpty()) { + return CMD_ERR_MUST_HAVE_PARAM; + } else if (m_params == CMD_PARAM_NEVER && !args.IsEmpty()) { + return CMD_ERR_NO_PARAM; + } else { + if ((m_cmd_id >= 0) && (m_cmd_id & CMD_DEPRECATED)) { + m_app.Show(wxT('\n') + m_verbose + wxT('\n')); + return m_cmd_id & ~CMD_DEPRECATED; + } else { + return m_cmd_id; + } + } +} + + +wxString CCommandTree::GetFullCommand() const +{ + wxString cmd = m_command; + + const CCommandTree *parent = m_parent; + while (parent && parent->m_parent) { + cmd = parent->m_command + wxT(" ") + cmd; + parent = parent->m_parent; + } + + return cmd; +} + + +void CCommandTree::PrintHelpFor(const wxString& command) const +{ + wxString cmd = command.BeforeFirst(wxT(' ')).Lower(); + if (!cmd.IsEmpty()) { + for (CmdPosConst_t it = m_subcommands.begin(); it != m_subcommands.end(); ++it) { + if ((*it)->m_command.Lower() == cmd) { + (*it)->PrintHelpFor(command.AfterFirst(wxT(' ')).Trim(false)); + return; + } + } + if (m_parent) { + m_app.Show(CFormat(_("Unknown extension '%s' for the '%s' command.\n")) % command % GetFullCommand()); + } else { + m_app.Show(CFormat(_("Unknown command '%s'.\n")) % command); + } + } else { + wxString fullcmd = GetFullCommand(); + if (!fullcmd.IsEmpty()) { + m_app.Show(fullcmd.Upper() + wxT(": ") + wxGetTranslation(m_short) + wxT("\n")); + if (!m_verbose.IsEmpty()) { + m_app.Show(wxT("\n")); + m_app.Show(wxGetTranslation(m_verbose)); + } + } + if (m_params == CMD_PARAM_NEVER) { + m_app.Show(_("\nThis command cannot have an argument.\n")); + } else if (m_params == CMD_PARAM_ALWAYS) { + m_app.Show(_("\nThis command must have an argument.\n")); + } + if (m_cmd_id == CMD_ERR_INCOMPLETE) { + m_app.Show(_("\nThis command is incomplete, you must use one of the extensions below.\n")); + } + if (!m_subcommands.empty()) { + CmdPosConst_t it; + int maxlen = 0; + if (m_parent) { + m_app.Show(_("\nAvailable extensions:\n")); + } else { + m_app.Show(_("Available commands:\n")); + } + for (it = m_subcommands.begin(); it != m_subcommands.end(); ++it) { + if (!((*it)->m_cmd_id >= 0 && (*it)->m_cmd_id & CMD_DEPRECATED) || m_parent) { + int len = (*it)->m_command.Length(); + if (len > maxlen) { + maxlen = len; + } + } + } + maxlen += 4; + for (it = m_subcommands.begin(); it != m_subcommands.end(); ++it) { + if (!((*it)->m_cmd_id >= 0 && (*it)->m_cmd_id & CMD_DEPRECATED) || m_parent) { + m_app.Show((*it)->m_command + wxString(wxT(' '), maxlen - (*it)->m_command.Length()) + wxGetTranslation((*it)->m_short) + wxT("\n")); + } + } + if (!m_parent) { + m_app.Show(CFormat(_("\nAll commands are case insensitive.\nType '%s ' to get detailed info on .\n")) % wxT("help")); + } + } + } + m_app.Show(wxT("\n")); +} + +//------------------------------------------------------------------- + +CaMuleExternalConnector::CaMuleExternalConnector() + : m_commands(*this) +{ + m_ECClient = NULL; + m_KeepQuiet = false; + m_InputLine = NULL; + m_port = -1; + m_NeedsConfigSave = false; + m_Verbose = false; + m_configFile = NULL; + SetAppName(wxT("aMule")); +} + +CaMuleExternalConnector::~CaMuleExternalConnector() +{ + delete m_configFile; +} + +void CaMuleExternalConnector::OnInitCommandSet() +{ + m_commands.AddCommand(wxT("Quit"), CMD_ID_QUIT, wxTRANSLATE("Exits from the application."), wxEmptyString); + m_commands.AddCommand(wxT("Exit"), CMD_ID_QUIT, wxTRANSLATE("Exits from the application."), wxEmptyString); + m_commands.AddCommand(wxT("Help"), CMD_ID_HELP, wxTRANSLATE("Show help."), + /* TRANSLATORS: + Do not translate the word 'help', it is a command to the program! */ + wxTRANSLATE("To get help on a command, type 'help '.\nTo get the full command list type 'help'.\n")); +} + +void CaMuleExternalConnector::Show(const wxString &s) +{ + if( !m_KeepQuiet ) { + printf("%s", (const char *)unicode2char(s)); +#ifdef __WXMSW__ + fflush(stdout); +#endif + } +} + +void CaMuleExternalConnector::ShowGreet() +{ + wxString text = GetGreetingTitle(); + int len = text.Length(); + Show(wxT('\n') + wxString(wxT('-'), 22 + len) + wxT('\n')); + Show(wxT('|') + wxString(wxT(' '), 10) + text + wxString(wxT(' '), 10) + wxT('|') + wxT('\n')); + Show(wxString(wxT('-'), 22 + len) + wxT('\n')); + // Do not merge the line below, or translators could translate "Help" + Show(CFormat(_("\nUse '%s' for command list\n\n")) % wxT("Help")); +} + +void CaMuleExternalConnector::Process_Answer(const wxString& answer) +{ + wxStringTokenizer tokens(answer, wxT("\n")); + while ( tokens.HasMoreTokens() ) { + Show(wxT(" > ") + tokens.GetNextToken() + wxT("\n")); + } +} + +bool CaMuleExternalConnector::Parse_Command(const wxString& buffer) +{ + wxString cmd; + wxStringTokenizer tokens(buffer); + while (tokens.HasMoreTokens()) { + cmd += tokens.GetNextToken() + wxT(' '); + } + cmd.Trim(false); + cmd.Trim(true); + int cmd_ID = GetIDFromString(cmd); + if ( cmd_ID >= 0 ) { + cmd_ID = ProcessCommand(cmd_ID); + } + wxString error; + switch (cmd_ID) { + case CMD_ID_HELP: + m_commands.PrintHelpFor(GetCmdArgs()); + break; + case CMD_ERR_SYNTAX: + error = _("Syntax error!"); + break; + case CMD_ERR_PROCESS_CMD: + Show(_("Error processing command - should never happen! Report bug, please\n")); + break; + case CMD_ERR_NO_PARAM: + error = _("This command should not have any parameters."); + break; + case CMD_ERR_MUST_HAVE_PARAM: + error = _("This command must have a parameter."); + break; + case CMD_ERR_INVALID_ARG: + error = _("Invalid argument."); + break; + case CMD_ERR_INCOMPLETE: + error = _("This is an incomplete command."); + break; + } + if (!error.IsEmpty()) { + Show(error + wxT('\n')); + wxString helpStr(wxT("help")); + if (!GetLastCmdStr().IsEmpty()) { + helpStr << wxT(' ') << GetLastCmdStr(); + } + Show(CFormat(_("Type '%s' to get more help.\n")) % helpStr); + } + return cmd_ID == CMD_ID_QUIT; +} + +void CaMuleExternalConnector::GetCommand(const wxString &prompt, char* buffer, size_t buffer_size) +{ + if( !m_KeepQuiet ) { +#ifdef HAVE_LIBREADLINE + char *text = readline(unicode2char(prompt + wxT("$ "))); + if (text && *text && + (m_InputLine == 0 || strcmp(text,m_InputLine) != 0)) { + add_history (text); + } + if (m_InputLine) + free(m_InputLine); + m_InputLine = text; +#else + Show(prompt + wxT("$ ")); + fflush(stdin); + fgets(buffer, buffer_size, stdin); + const char *text = buffer; +#endif /* HAVE_LIBREADLINE */ + if ( text ) { + size_t len = strlen(text); + if (len > buffer_size - 2) { + len = buffer_size - 2; + } + strncpy(buffer, text, len); + buffer[len] = '\n'; + buffer[len + 1] = 0; + } else { + strncpy(buffer, "quit", buffer_size); + } + } +} + +void CaMuleExternalConnector::TextShell(const wxString &prompt) +{ + char buffer[256]; + wxString buf; + + bool The_End = false; + do { + GetCommand(prompt, buffer, 256); + buf = char2unicode(buffer); + The_End = Parse_Command(buf); + } while ((!The_End) && (m_ECClient->IsSocketConnected())); +} + +void CaMuleExternalConnector::ConnectAndRun(const wxString &ProgName, const wxString& ProgVersion) +{ + if (m_NeedsConfigSave) { + SaveConfigFile(); + return; + } + + wxString appName = + // Find out Application Name + #ifdef WEBSERVERDIR + wxT("amuleweb") + #else + wxT("amulecmd") + #endif + ; + + #ifdef SVNDATE + Show(CFormat(_("This is %s %s %s\n")) % appName % wxT(VERSION) % wxT(SVNDATE)); + #else + Show(CFormat(_("This is %s %s\n")) % appName % wxT(VERSION)); + #endif + + // HostName, Port and Password + if ( m_password.IsEmpty() ) { + wxString pass_plain; + #ifndef __WXMSW__ + pass_plain = char2unicode(getpass("Enter password for mule connection: ")); + #else + //#warning This way, pass enter is not hidden on windows. Bad thing. + char temp_str[512]; + fflush(stdin); + printf("Enter password for mule connection: \n"); + fflush(stdout); + fgets(temp_str, 512, stdin); + temp_str[strlen(temp_str)-1] = '\0'; + pass_plain = char2unicode(temp_str); + #endif + wxCHECK2(m_password.Decode(MD5Sum(pass_plain).GetHash()), /* Do nothing. */ ); + // MD5 hash for an empty string, according to rfc1321. + if (m_password.Encode() == wxT("D41D8CD98F00B204E9800998ECF8427E")) { + m_password.Clear(); + } + + // Clear plain-text password + pass_plain = wxT("01234567890123456789"); + } + + if (!m_password.IsEmpty()) { + + // Create the socket + Show(_("\nCreating client...\n")); + m_ECClient = new CRemoteConnect(NULL); + + m_ECClient->ConnectToCore(m_host, m_port, wxT("foobar"), m_password.Encode(), + ProgName, ProgVersion); + + m_ECClient->WaitSocketConnect(10); + + if (!m_ECClient->IsSocketConnected()) { + // no connection => close gracefully + Show(_("Connection Failed. Unable to connect to the specified host\n")); + } else { + // Authenticate ourselves + // ConnectToCore() already authenticated for us. + //m_ECClient->ConnectionEstablished(); + Show(m_ECClient->GetServerReply()+wxT("\n")); + if (m_ECClient->IsSocketConnected()) { + ShowGreet(); + Pre_Shell(); + if (m_KeepQuiet) { + while(true) { + #ifndef __WXMSW__ + pause(); + #else + wxSleep(10); + #endif + } + } else { + TextShell(ProgName); + } + Post_Shell(); + Show(CFormat(_("\nOk, exiting %s...\n")) % ProgName); + } + } + m_ECClient->DestroySocket(); + } else { + Show(_("Cannot connect with an empty password.\nYou must specify a password either in config file\nor on command-line, or enter one when asked.\n\nExiting...\n")); + } +} + +void CaMuleExternalConnector::OnInitCmdLine(wxCmdLineParser& parser) +{ + parser.AddSwitch(wxEmptyString, wxT("help"), + _("Show this help text."), + wxCMD_LINE_PARAM_OPTIONAL); + parser.AddOption(wxT("h"), wxT("host"), + _("Host where aMule is running. (default: localhost)"), + wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); + parser.AddOption(wxT("p"), wxT("port"), + _("aMule's port for External Connection. (default: 4712)"), + wxCMD_LINE_VAL_NUMBER, wxCMD_LINE_PARAM_OPTIONAL); + parser.AddOption(wxT("P"), wxT("password"), + _("External Connection password."), + wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); + parser.AddOption(wxT("f"), wxT("config-file"), + _("Read configuration from file."), + wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); + parser.AddSwitch(wxT("q"), wxT("quiet"), + _("Do not print any output to stdout."), + wxCMD_LINE_PARAM_OPTIONAL); + parser.AddSwitch(wxT("v"), wxT("verbose"), + _("Be verbose - show also debug messages."), + wxCMD_LINE_PARAM_OPTIONAL); + parser.AddOption(wxT("l"), wxT("locale"), + _("Sets program locale (language)."), + wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); + parser.AddSwitch(wxT("w"), wxT("write-config"), + _("Write command line options to config file."), + wxCMD_LINE_PARAM_OPTIONAL); + parser.AddOption(wxEmptyString, wxT("create-config-from"), + _("Creates config file based on aMule's config file."), + wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); + parser.AddSwitch(wxEmptyString, wxT("version"), + _("Print program version."), + wxCMD_LINE_PARAM_OPTIONAL); +} + +bool CaMuleExternalConnector::OnCmdLineParsed(wxCmdLineParser& parser) +{ + if (parser.Found(wxT("version"))) { + const char *appName = + // Find out Application Name + #ifdef WEBSERVERDIR + "amuleweb" + #else + "amulecmd" + #endif + ; + printf("%s %s\n", appName, (const char *)unicode2char(GetMuleVersion())); + return false; + } + + if (!parser.Found(wxT("config-file"), &m_configFileName)) { + m_configFileName = GetConfigDir() + wxT("remote.conf"); + } + + wxString aMuleConfigFile; + if (parser.Found(wxT("create-config-from"), &aMuleConfigFile)) { + aMuleConfigFile = FinalizeFilename(aMuleConfigFile); + if (!::wxFileExists(aMuleConfigFile)) { + fprintf(stderr, "%s\n", (const char *)unicode2char(wxT("FATAL ERROR: File does not exist: ") + aMuleConfigFile)); + exit(1); + } + CECFileConfig aMuleConfig(aMuleConfigFile); + LoadAmuleConfig(aMuleConfig); + SaveConfigFile(); + m_configFile->Flush(); + exit(0); + } + + LoadConfigFile(); + + if ( !parser.Found(wxT("host"), &m_host) ) { + if ( m_host.IsEmpty() ) { + m_host = wxT("localhost"); + } + } + + long port; + if (!parser.Found(wxT("port"), &port)) { + if (m_port == -1) { + m_port = 4712; + } + } else { + m_port = port; + } + + wxString pass_plain; + if (parser.Found(wxT("password"), &pass_plain)) { + if (!pass_plain.IsEmpty()) { + m_password.Decode(MD5Sum(pass_plain).GetHash()); + } else { + m_password.Clear(); + } + } + + if (parser.Found(wxT("write-config"))) { + m_NeedsConfigSave = true; + } + + parser.Found(wxT("locale"), &m_language); + + if (parser.Found(wxT("help"))) { + parser.Usage(); + return false; + } + + m_KeepQuiet = parser.Found(wxT("quiet")); + m_Verbose = parser.Found(wxT("verbose")); + + return true; +} + +void CaMuleExternalConnector::LoadAmuleConfig(CECFileConfig& cfg) +{ + m_host = wxT("localhost"); + m_port = cfg.Read(wxT("/ExternalConnect/ECPort"), -1l); + cfg.ReadHash(wxT("/ExternalConnect/ECPassword"), &m_password); + m_language = cfg.Read(wxT("/eMule/Language"), wxEmptyString); +} + + +void CaMuleExternalConnector::LoadConfigFile() +{ + if (!m_configFile) { + m_configFile = new CECFileConfig(m_configFileName); + } + if (m_configFile) { + m_language = m_configFile->Read(wxT("/Locale"), wxEmptyString); + m_host = m_configFile->Read(wxT("/EC/Host"), wxEmptyString); + m_port = m_configFile->Read(wxT("/EC/Port"), -1l); + m_configFile->ReadHash(wxT("/EC/Password"), &m_password); + } +} + +void CaMuleExternalConnector::SaveConfigFile() +{ + if (!wxFileName::DirExists(GetConfigDir())) { + wxFileName::Mkdir(GetConfigDir()); + } + if (!m_configFile) { + m_configFile = new CECFileConfig(m_configFileName); + } + if (m_configFile) { + m_configFile->Write(wxT("/Locale"), m_language); + m_configFile->Write(wxT("/EC/Host"), m_host); + m_configFile->Write(wxT("/EC/Port"), m_port); + m_configFile->WriteHash(wxT("/EC/Password"), m_password); + } +} + +bool CaMuleExternalConnector::OnInit() +{ + bool retval = wxApp::OnInit(); + OnInitCommandSet(); + InitCustomLanguages(); + InitLocale(m_locale, StrLang2wx(m_language)); + return retval; +} + + +#if !wxUSE_GUI && defined(__WXMAC__) + +#include // Do_not_auto_remove +#include // Do_not_auto_remove + +class CaMuleExternalConnectorTraits : public wxConsoleAppTraits +{ +public: + virtual wxStandardPathsBase& GetStandardPaths() + { + return s_stdPaths; + } + +private: + static wxStandardPathsCF s_stdPaths; +}; + +wxStandardPathsCF CaMuleExternalConnectorTraits::s_stdPaths; + +wxAppTraits* CaMuleExternalConnector::CreateTraits() +{ + return new CaMuleExternalConnectorTraits; +} + +#endif +// File_checked_for_headers diff --git a/src/ExternalConnector.h b/src/ExternalConnector.h new file mode 100644 index 00000000..01b2a4a7 --- /dev/null +++ b/src/ExternalConnector.h @@ -0,0 +1,174 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +/* + * This file must be included with wxUSE_GUI defined to zero or one. + * Usually on console applications, this will be taken care of in + * configure time. This is because wx classes will be compiled + * differently in each case. + * + */ + +#ifndef __EXTERNALCONNECTOR_H__ +#define __EXTERNALCONNECTOR_H__ + +#include // For wxApp +#include // For wxCmdLineEntryDesc +#include + +#include + +#define CMD_DEPRECATED 0x1000 +#define CMD_OK 0 +#define CMD_ID_QUIT -1 +#define CMD_ID_HELP -2 +#define CMD_ERR_SYNTAX -3 +#define CMD_ERR_PROCESS_CMD -4 +#define CMD_ERR_NO_PARAM -5 +#define CMD_ERR_MUST_HAVE_PARAM -6 +#define CMD_ERR_INVALID_ARG -7 +#define CMD_ERR_INCOMPLETE -8 + +enum Params { + CMD_PARAM_NEVER, + CMD_PARAM_OPTIONAL, + CMD_PARAM_ALWAYS +}; + +class CCommandTree; + +typedef std::list CmdList_t; +typedef std::list::iterator CmdPos_t; +typedef std::list::const_iterator CmdPosConst_t; + +class CaMuleExternalConnector; + +class CCommandTree { + public: + CCommandTree(CaMuleExternalConnector& app) + : m_command(wxEmptyString), m_cmd_id(CMD_ERR_SYNTAX), m_short(wxEmptyString), m_verbose(wxEmptyString), m_params(CMD_PARAM_OPTIONAL), m_parent(NULL), m_app(app) + {} + + ~CCommandTree(); + + CCommandTree* AddCommand(const wxString& command, int cmd_id, const wxString& shortDesc, const wxString& longDesc, enum Params params = CMD_PARAM_OPTIONAL) + { + return AddCommand(new CCommandTree(m_app, command, cmd_id, shortDesc, longDesc, params)); + } + + int FindCommandId(const wxString& command, wxString& args, wxString& cmdstr) const; + wxString GetFullCommand() const; + void PrintHelpFor(const wxString& command) const; + + private: + CCommandTree(CaMuleExternalConnector& app, const wxString& command, int cmd_id, const wxString& shortDesc, const wxString& longDesc, enum Params params) + : m_command(command), m_cmd_id(cmd_id), m_short(shortDesc), m_verbose(longDesc), m_params(params), m_parent(NULL), m_app(app) + {} + + CCommandTree* AddCommand(CCommandTree* cmdTree); + + wxString m_command; + int m_cmd_id; + wxString m_short; + wxString m_verbose; + enum Params m_params; + const CCommandTree* m_parent; + CaMuleExternalConnector& m_app; + CmdList_t m_subcommands; +}; + + +class CECFileConfig; + +class CaMuleExternalConnector : public wxApp +{ +public: + // + // Constructor & Destructor + // + CaMuleExternalConnector(); + ~CaMuleExternalConnector(); + + // + // Virtual functions + // + virtual void Pre_Shell() {} + virtual void Post_Shell() {} + virtual int ProcessCommand(int) { return -1; } + virtual void TextShell(const wxString &prompt); + virtual void LoadConfigFile(); + virtual void SaveConfigFile(); + virtual void LoadAmuleConfig(CECFileConfig& cfg); + virtual void OnInitCommandSet(); + virtual bool OnInit(); + virtual const wxString GetGreetingTitle() = 0; + + // + // Other functions + // + void Show(const wxString &s); + void DebugShow(const wxString &s) { if (m_Verbose) Show(s); } + const wxString& GetCmdArgs() const { return m_cmdargs; } + const wxString& GetLastCmdStr() const { return m_lastcmdstr; } + int GetIDFromString(const wxString& buffer) { return m_commands.FindCommandId(buffer, m_cmdargs, m_lastcmdstr); } + void Process_Answer(const wxString& answer); + bool Parse_Command(const wxString& buffer); + void GetCommand(const wxString &prompt, char* buffer, size_t buffer_size); + const CECPacket *SendRecvMsg_v2(const CECPacket *request) { return m_ECClient->SendRecvPacket(request); } + void ConnectAndRun(const wxString &ProgName, const wxString& ProgVersion); + void ShowGreet(); + + // + // Command line processing + // + void OnInitCmdLine(wxCmdLineParser& amuleweb_parser); + bool OnCmdLineParsed(wxCmdLineParser& parser); + + CECFileConfig* m_configFile; + wxString m_configFileName; + +protected: + long m_port; + wxString m_host; + CMD4Hash m_password; + bool m_KeepQuiet; + bool m_Verbose; + CCommandTree m_commands; + +#if !wxUSE_GUI && defined(__WXMAC__) + virtual wxAppTraits* CreateTraits(); +#endif + +private: + wxString m_cmdargs; + wxString m_lastcmdstr; + CRemoteConnect* m_ECClient; + char * m_InputLine; + bool m_NeedsConfigSave; + wxString m_language; + wxLocale m_locale; +}; + +#endif // __EXTERNALCONNECTOR_H__ +// File_checked_for_headers diff --git a/src/FileDetailDialog.cpp b/src/FileDetailDialog.cpp new file mode 100644 index 00000000..be33f87d --- /dev/null +++ b/src/FileDetailDialog.cpp @@ -0,0 +1,468 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "muuli_wdr.h" // Needed for ID_CLOSEWNDFD,...,IDC_APPLY +#include "FileDetailDialog.h" // Interface declarations +#include "FileDetailListCtrl.h" // Needed for CFileDetailListCtrl +#include "CommentDialogLst.h" // Needed for CCommentDialogLst +#include "updownclient.h" // Needed for CUpDownClient +#include "PartFile.h" // Needed for CPartFile +#include "Color.h" // Needed for SYSCOLOR +#include "amule.h" // Needed for theApp +#include "SharedFileList.h" // Needed for CSharedFileList +#include "OtherFunctions.h" + +#define ID_MY_TIMER 1652 + +//IMPLEMENT_DYNAMIC(CFileDetailDialog, CDialog) +BEGIN_EVENT_TABLE(CFileDetailDialog,wxDialog) + EVT_BUTTON(ID_CLOSEWNDFD, CFileDetailDialog::OnClosewnd) + EVT_BUTTON(IDC_BUTTONSTRIP, CFileDetailDialog::OnBnClickedButtonStrip) + EVT_BUTTON(IDC_TAKEOVER, CFileDetailDialog::OnBnClickedTakeOver) + EVT_LIST_ITEM_ACTIVATED(IDC_LISTCTRLFILENAMES, CFileDetailDialog::OnListClickedTakeOver) + EVT_BUTTON(IDC_CMTBT, CFileDetailDialog::OnBnClickedShowComment) + EVT_TEXT(IDC_FILENAME, CFileDetailDialog::OnTextFileNameChange) + EVT_BUTTON(IDC_APPLY_AND_CLOSE, CFileDetailDialog::OnBnClickedOk) + EVT_BUTTON(IDC_APPLY, CFileDetailDialog::OnBnClickedApply) + EVT_TIMER(ID_MY_TIMER,CFileDetailDialog::OnTimer) +END_EVENT_TABLE() + +CFileDetailDialog::CFileDetailDialog(wxWindow *parent, CPartFile *file) +: +wxDialog(parent, -1, _("File Details"), wxDefaultPosition, wxDefaultSize, + wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxMAXIMIZE_BOX | wxMINIMIZE_BOX), +m_file(file), +m_filenameChanged(false) +{ + theApp->m_FileDetailDialogActive++; + m_timer.SetOwner(this, ID_MY_TIMER); + m_timer.Start(5000); + wxSizer *content = fileDetails(this, true); + UpdateData(); + content->SetSizeHints(this); + content->Show(this, true); +} + +CFileDetailDialog::~CFileDetailDialog() +{ + theApp->m_FileDetailDialogActive = 0; + m_timer.Stop(); +} + +void CFileDetailDialog::OnTimer(wxTimerEvent& WXUNUSED(evt)) { + UpdateData(); +} + +void CFileDetailDialog::OnClosewnd(wxCommandEvent& WXUNUSED(evt)) +{ + EndModal(0); +} + +void CFileDetailDialog::UpdateData() +{ + wxString bufferS; + CastChild(IDC_FNAME,wxStaticText)->SetLabel(MakeStringEscaped( + TruncateFilename(m_file->GetFileName(),60))); + CastChild(IDC_METFILE,wxStaticText)->SetLabel(MakeStringEscaped( + TruncateFilename(m_file->GetFullName(),60,true))); + + wxString tmp = CastChild(IDC_FILENAME, wxTextCtrl)->GetValue(); + if (tmp.Length() < 3) { + resetValueForFilenameTextEdit(); + } + + CastChild(IDC_FHASH,wxStaticText)->SetLabel(m_file->GetFileHash().Encode()); + bufferS = wxString::Format(wxT("%llu bytes ("), m_file->GetFileSize()) + + CastItoXBytes(m_file->GetFileSize()) + + wxT(")"); + CastChild(IDC_FSIZE,wxControl)->SetLabel(bufferS); + CastChild(IDC_PFSTATUS,wxControl)->SetLabel(m_file->getPartfileStatus()); + bufferS = wxString::Format(wxT("%i (%i)"),m_file->GetPartCount(),m_file->GetHashCount()); + CastChild(IDC_PARTCOUNT,wxControl)->SetLabel(bufferS); + CastChild(IDC_TRANSFERRED,wxControl)->SetLabel(CastItoXBytes(m_file->GetTransferred())); + CastChild(IDC_FD_STATS1,wxControl)->SetLabel(CastItoXBytes(m_file->GetLostDueToCorruption())); + CastChild(IDC_FD_STATS2,wxControl)->SetLabel(CastItoXBytes(m_file->GetGainDueToCompression())); + CastChild(IDC_FD_STATS3,wxControl)->SetLabel(CastItoIShort(m_file->TotalPacketsSavedDueToICH())); + CastChild(IDC_COMPLSIZE,wxControl)->SetLabel(CastItoXBytes(m_file->GetCompletedSize())); + bufferS = wxString::Format(_("%.2f%% done"),m_file->GetPercentCompleted()); + CastChild(IDC_PROCCOMPL,wxControl)->SetLabel(bufferS); + bufferS = wxString::Format(_("%.2f kB/s"),(float)m_file->GetKBpsDown()); + CastChild(IDC_DATARATE,wxControl)->SetLabel(bufferS); + bufferS = wxString::Format(wxT("%i"),m_file->GetSourceCount()); + CastChild(IDC_SOURCECOUNT,wxControl)->SetLabel(bufferS); + bufferS = wxString::Format(wxT("%i"),m_file->GetTransferingSrcCount()); + CastChild(IDC_SOURCECOUNT2,wxControl)->SetLabel(bufferS); + bufferS = wxString::Format(wxT("%i (%.1f%%)"), + m_file->GetAvailablePartCount(), + ((m_file->GetAvailablePartCount() * 100.0f)/ m_file->GetPartCount())); + CastChild(IDC_PARTAVAILABLE,wxControl)->SetLabel(bufferS); + bufferS = CastSecondsToHM(m_file->GetDlActiveTime()); + CastChild(IDC_DLACTIVETIME, wxControl)->SetLabel(bufferS); + + if (m_file->lastseencomplete==0) { + bufferS = wxString(_("Unknown")).MakeLower(); + } else { + wxDateTime last_seen(m_file->lastseencomplete); + bufferS = last_seen.FormatISODate() + wxT(" ") + last_seen.FormatISOTime(); + } + + CastChild(IDC_LASTSEENCOMPL,wxControl)->SetLabel(bufferS); + setEnableForApplyButton(); + // disable "Show all comments" button if there are no comments + CastChild(IDC_CMTBT, wxControl)->Enable(!m_file->GetRatingAndComments().empty()); + FillSourcenameList(); + Layout(); +} + +// CFileDetailDialog message handlers + +#define LVCFMT_LEFT wxLIST_FORMAT_LEFT + + +void CFileDetailDialog::FillSourcenameList() +{ + CFileDetailListCtrl* pmyListCtrl; + int itempos; + pmyListCtrl = CastChild(IDC_LISTCTRLFILENAMES, CFileDetailListCtrl ); + + // reset + for (int i=0;iGetItemCount();i++){ + pmyListCtrl->SetItem(i, 1, wxT("0")); + SourcenameItem *item = reinterpret_cast(pmyListCtrl->GetItemData(i)); + item->count = 0; + } + + // update +#ifdef CLIENT_GUI + const SourcenameItemList &sources = m_file->GetSourcenameItemList(); + for (SourcenameItemList::const_iterator it = sources.begin(); it != sources.end(); ++it) { + const SourcenameItem &cur_src = *it; + itempos = pmyListCtrl->FindItem(-1,cur_src.name); + if (itempos == -1) { + int itemid = pmyListCtrl->InsertItem(0, cur_src.name); + pmyListCtrl->SetItem(0, 1, wxString::Format(wxT("%li"), cur_src.count)); + SourcenameItem *item = new SourcenameItem(cur_src.name, cur_src.count); + pmyListCtrl->SetItemPtrData(0, reinterpret_cast(item)); + // background.. argh -- PA: was in old version - do we still need this? + wxListItem tmpitem; + tmpitem.m_itemId = itemid; + tmpitem.SetBackgroundColour(SYSCOLOR(wxSYS_COLOUR_LISTBOX)); + pmyListCtrl->SetItem(tmpitem); + } else { + SourcenameItem *item = reinterpret_cast(pmyListCtrl->GetItemData(itempos)); + item->count = cur_src.count; + pmyListCtrl->SetItem(itempos, 1, wxString::Format(wxT("%li"), cur_src.count)); + } + } +#else // CLIENT_GUI + const CPartFile::SourceSet& sources = m_file->GetSourceList(); + CPartFile::SourceSet::const_iterator it = sources.begin(); + for ( ; it != sources.end(); ++it ) { + const CUpDownClient &cur_src = **it; + if (cur_src.GetRequestFile() != m_file || + cur_src.GetClientFilename().Length() == 0) { + continue; + } + + itempos = pmyListCtrl->FindItem(-1,cur_src.GetClientFilename()); + if (itempos == -1) { + int itemid = pmyListCtrl->InsertItem(0, cur_src.GetClientFilename()); + pmyListCtrl->SetItem(0, 1, wxT("1")); + SourcenameItem *item = new SourcenameItem(cur_src.GetClientFilename(), 1); + pmyListCtrl->SetItemPtrData(0, reinterpret_cast(item)); + // background.. argh -- PA: was in old version - do we still need this? + wxListItem tmpitem; + tmpitem.m_itemId=itemid; + tmpitem.SetBackgroundColour(SYSCOLOR(wxSYS_COLOUR_LISTBOX)); + pmyListCtrl->SetItem(tmpitem); + } else { + SourcenameItem *item = reinterpret_cast(pmyListCtrl->GetItemData(itempos)); + item->count++; + pmyListCtrl->SetItem(itempos, 1, wxString::Format(wxT("%li"), item->count)); + } + } +#endif // CLIENT_GUI + + pmyListCtrl->SortList(); + + // remove 0'er + for (int i = 0; i < pmyListCtrl->GetItemCount(); ++i) { + SourcenameItem *item = reinterpret_cast(pmyListCtrl->GetItemData(i)); + if (item->count == 0) { + delete item; + pmyListCtrl->DeleteItem(i); + i--; // PA: one step back is enough, no need to go back to 0 + } + } + + Layout(); +} + + +void CFileDetailDialog::OnBnClickedShowComment(wxCommandEvent& WXUNUSED(evt)) +{ + CCommentDialogLst(this,m_file).ShowModal(); +} + + +void CFileDetailDialog::resetValueForFilenameTextEdit() +{ + CastChild(IDC_FILENAME, wxTextCtrl)->SetValue(m_file->GetFileName().GetPrintable()); + m_filenameChanged = false; + setEnableForApplyButton(); +} + + +void CFileDetailDialog::setValueForFilenameTextEdit(const wxString &s) +{ + CastChild(IDC_FILENAME, wxTextCtrl)->SetValue(s); + m_filenameChanged = true; + setEnableForApplyButton(); +} + + +void CFileDetailDialog::setEnableForApplyButton() +{ + CastChild(IDC_APPLY, wxControl)->Enable( + m_file->IsPartFile() && // Currently renaming of completed files causes problem with kad + m_file->GetStatus() != PS_COMPLETE && + m_file->GetStatus() != PS_COMPLETING && + m_filenameChanged); +} + + +void CFileDetailDialog::OnTextFileNameChange(wxCommandEvent& WXUNUSED(evt)) +{ + m_filenameChanged = true; + setEnableForApplyButton(); +} + + +void CFileDetailDialog::OnBnClickedOk(wxCommandEvent& evt) +{ + OnBnClickedApply(evt); + OnClosewnd(evt); +} + + +void CFileDetailDialog::OnBnClickedApply(wxCommandEvent& WXUNUSED(evt)) +{ + CPath fileName = CPath(CastChild(IDC_FILENAME, wxTextCtrl)->GetValue()); + + if (fileName.IsOk() && (fileName != m_file->GetFileName())) { + if (theApp->sharedfiles->RenameFile(m_file, fileName)) { + FindWindow(IDC_FNAME)->SetLabel(MakeStringEscaped(m_file->GetFileName().GetPrintable())); + FindWindow(IDC_METFILE)->SetLabel(m_file->GetFullName().GetPrintable()); + + resetValueForFilenameTextEdit(); + + Layout(); + } + } +} + + +bool IsDigit(const wxChar ch) +{ + switch (ch) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': return true; + } + return false; +} + +bool IsWordSeparator(const wxChar ch) +{ + switch (ch) { + case '.': + case ',': + case '(': + case ')': + case '[': + case ']': + case '{': + case '}': + case '-': + case '"': + case ' ': return true; + } + return false; +} + +void ReplaceWord(wxString& str, const wxString& replaceFrom, const wxString& replaceTo, bool numbers = false) +{ + unsigned int i = 0; + unsigned int l = replaceFrom.Length(); + while (i < str.Length()) { + if (str.Mid(i, l) == replaceFrom) { + if ((i == 0 || IsWordSeparator(str.GetChar(i-1))) && + ((i == str.Length() - l || IsWordSeparator(str.GetChar(i+l))) || + (numbers && IsDigit(str.GetChar(i+l))))) { + str.replace(i, l, replaceTo); + } + i += replaceTo.Length() - 1; + } + i++; + } +} + +void CFileDetailDialog::OnBnClickedButtonStrip(wxCommandEvent& WXUNUSED(evt)) +{ + wxString filename; + filename = CastChild(IDC_FILENAME, wxTextCtrl)->GetValue(); + + int extpos = filename.Find('.', true); + wxString ext; + if (extpos > 0) { + // get the extension - we do not modify it except make it lowercase + ext = filename.Mid(extpos); + ext.MakeLower(); + // get rid of extension and replace . with space + filename.Truncate(extpos); + filename.Replace(wxT("."),wxT(" ")); + } + + // Replace Space-holders with Spaces + filename.Replace(wxT("_"),wxT(" ")); + filename.Replace(wxT("%20"),wxT(" ")); + + // Some additional formatting + filename.Replace(wxT("hYPNOTiC"), wxEmptyString); + filename.MakeLower(); + filename.Replace(wxT("xxx"), wxT("XXX")); +// filename.Replace(wxT("xdmnx"), wxEmptyString); +// filename.Replace(wxT("pmp"), wxEmptyString); +// filename.Replace(wxT("dws"), wxEmptyString); + filename.Replace(wxT("www pornreactor com"), wxEmptyString); + filename.Replace(wxT("sharereactor"), wxEmptyString); + filename.Replace(wxT("found via www filedonkey com"), wxEmptyString); + filename.Replace(wxT("deviance"), wxEmptyString); + filename.Replace(wxT("adunanza"), wxEmptyString); + filename.Replace(wxT("-ftv"), wxEmptyString); + filename.Replace(wxT("flt"), wxEmptyString); + filename.Replace(wxT("[]"), wxEmptyString); + filename.Replace(wxT("()"), wxEmptyString); + + // Change CD, CD#, VCD{,#}, DVD{,#}, ISO, PC to uppercase + ReplaceWord(filename, wxT("cd"), wxT("CD"), true); + ReplaceWord(filename, wxT("vcd"), wxT("VCD"), true); + ReplaceWord(filename, wxT("dvd"), wxT("DVD"), true); + ReplaceWord(filename, wxT("iso"), wxT("ISO"), false); + ReplaceWord(filename, wxT("pc"), wxT("PC"), false); + + // Make leading Caps + // and delete 1+ spaces + if (filename.Length()>1) + { + bool last_char_space = true; + bool last_char_wordseparator = true; + unsigned int i = 0; + + do { + wxChar c = filename.GetChar(i); + if (c == ' ') { + if (last_char_space) { + filename.Remove(i, 1); + i--; + } else { + last_char_space = true; + } + } else if (c == '.') { + if (last_char_space && i > 0) { + i--; + filename.Remove(i, 1); + } + last_char_space = false; + } else { + if (last_char_wordseparator) { + wxString tempStr(c); + tempStr.MakeUpper(); + filename.SetChar(i, tempStr.GetChar(0)); + last_char_space = false; + } + } + last_char_wordseparator = IsWordSeparator(c); + i++; + } while (i < filename.Length()); + + if (last_char_space && i > 0) { + filename.Remove(i-1, 1); + } + } + + // should stay lowercase + ReplaceWord(filename, wxT("By"), wxT("by")); + + // re-add extension + filename += ext; + + setValueForFilenameTextEdit(filename); +} + +void CFileDetailDialog::OnBnClickedTakeOver(wxCommandEvent& WXUNUSED(evt)) +{ + CFileDetailListCtrl* pmyListCtrl; + pmyListCtrl = CastChild( IDC_LISTCTRLFILENAMES, CFileDetailListCtrl ); + if (pmyListCtrl->GetSelectedItemCount() > 0) { + long pos=-1; + for(;;) { + pos=pmyListCtrl->GetNextItem(pos,wxLIST_NEXT_ALL,wxLIST_STATE_SELECTED); + if(pos==-1) { + break; + } + setValueForFilenameTextEdit(pmyListCtrl->GetItemText(pos)); + } + } +} + +void CFileDetailDialog::OnListClickedTakeOver(wxListEvent& WXUNUSED(evt)) +{ + CFileDetailListCtrl* pmyListCtrl; + pmyListCtrl = CastChild( IDC_LISTCTRLFILENAMES, CFileDetailListCtrl ); + if (pmyListCtrl->GetSelectedItemCount() > 0) { + long pos=-1; + for(;;) { + pos=pmyListCtrl->GetNextItem(pos,wxLIST_NEXT_ALL,wxLIST_STATE_SELECTED); + if(pos==-1) { + break; + } + setValueForFilenameTextEdit(pmyListCtrl->GetItemText(pos)); + } + } +} +// File_checked_for_headers diff --git a/src/FileDetailDialog.h b/src/FileDetailDialog.h new file mode 100644 index 00000000..d302bdb7 --- /dev/null +++ b/src/FileDetailDialog.h @@ -0,0 +1,67 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef FILEDETAILDIALOG_H +#define FILEDETAILDIALOG_H + + +class CPartFile; + +// CFileDetailDialog dialog + +class CFileDetailDialog : public wxDialog +{ +public: + CFileDetailDialog(wxWindow *parent, CPartFile *file); + virtual ~CFileDetailDialog(); + +protected: + void OnTimer(wxTimerEvent& evt); + DECLARE_EVENT_TABLE() + +private: + void UpdateData(); + CPartFile* m_file; + wxTimer m_timer; + bool m_filenameChanged; + + void OnClosewnd(wxCommandEvent& evt); + void FillSourcenameList(); + void setEnableForApplyButton(); + void setValueForFilenameTextEdit(const wxString &s); + void resetValueForFilenameTextEdit(); + + void OnBnClickedButtonStrip(wxCommandEvent& evt); + void OnBnClickedShowComment(wxCommandEvent& evt); + void OnBnClickedTakeOver(wxCommandEvent& evt); + void OnListClickedTakeOver(wxListEvent& evt); + void OnTextFileNameChange(wxCommandEvent& evt); + void OnBnClickedOk(wxCommandEvent& evt); + void OnBnClickedApply(wxCommandEvent& evt); + +}; + +#endif // FILEDETAILDIALOG_H +// File_checked_for_headers diff --git a/src/FileDetailListCtrl.cpp b/src/FileDetailListCtrl.cpp new file mode 100644 index 00000000..4584ab2f --- /dev/null +++ b/src/FileDetailListCtrl.cpp @@ -0,0 +1,86 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "muuli_wdr.h" // Needed for ID_CLOSEWNDFD +#include "FileDetailListCtrl.h" // Interface declarations + +#define LVCFMT_LEFT wxLIST_FORMAT_LEFT +#define wxLIST_STATE_DESELECTED 0x0000 + +BEGIN_EVENT_TABLE(CFileDetailListCtrl, CMuleListCtrl) + EVT_LIST_ITEM_SELECTED(IDC_LISTCTRLFILENAMES, CFileDetailListCtrl::OnSelect) // Care for single selection +END_EVENT_TABLE() + + +CFileDetailListCtrl::CFileDetailListCtrl(wxWindow * &parent, int id, const wxPoint & pos, wxSize siz, int flags):CMuleListCtrl(parent, id, pos, siz, flags) +{ + // Set sorter function + SetSortFunc(SortProc); + + // Initial sorting: Sources descending + InsertColumn(0, _("File Name"), LVCFMT_LEFT, 370); + InsertColumn(1, _("Sources"), LVCFMT_LEFT, 70); + + SetSorting(1, CMuleListCtrl::SORT_DES); + + SortList(); +} + +int CFileDetailListCtrl::SortProc(wxUIntPtr param1, wxUIntPtr param2, long sortData) +{ + // Comparison for different sortings + SourcenameItem *item1 = (SourcenameItem*)param1; + SourcenameItem *item2 = (SourcenameItem*)param2; + + int mod = (sortData & CMuleListCtrl::SORT_DES) ? -1 : 1; + + switch (sortData & CMuleListCtrl::COLUMN_MASK) { + case 1: return mod * (item1->count - item2->count); // Sources descending + case 0: return mod * item1->name.CmpNoCase(item2->name); // Name descending + default: return 0; + } +} + + +void CFileDetailListCtrl::OnSelect(wxListEvent& event) +{ + // Damn wxLC_SINGLE_SEL does not work! So we have to care for single selection ourselfs: + long realpos = event.m_itemIndex; + long pos=-1; + for(;;) { + // Loop through all selected items + pos=GetNextItem(pos,wxLIST_NEXT_ALL,wxLIST_STATE_SELECTED); + if(pos==-1) { + // No more selected items left + break; + } else if (pos != realpos) { + // Deselect all items except the one we have just clicked + SetItemState(pos, wxLIST_STATE_DESELECTED, wxLIST_STATE_SELECTED); + } + } + + event.Skip(); +} +// File_checked_for_headers diff --git a/src/FileDetailListCtrl.h b/src/FileDetailListCtrl.h new file mode 100644 index 00000000..b2318917 --- /dev/null +++ b/src/FileDetailListCtrl.h @@ -0,0 +1,49 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef FILEDETAILLISTCTRL_H +#define FILEDETAILLISTCTRL_H + +#include "MuleListCtrl.h" // Needed for CMuleListCtrl + +class CFileDetailListCtrl : public CMuleListCtrl +{ + +public: + CFileDetailListCtrl(wxWindow * &parent, int id, const wxPoint & pos, wxSize siz, int flags); + +private: + struct SourcenameItem { + wxString name; + long count; + }; + + static int wxCALLBACK SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData); + void OnSelect(wxListEvent& event); + + DECLARE_EVENT_TABLE() +}; +#endif // FILEDETAILLISTCTRL_H +// File_checked_for_headers diff --git a/src/FileLock.h b/src/FileLock.h new file mode 100644 index 00000000..abfa469f --- /dev/null +++ b/src/FileLock.h @@ -0,0 +1,124 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2006-2008 Mikkel Schubert ( xaignar@users.sourceforge.net ) +// Copyright (c) 2006-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef FILELOCK_H +#define FILELOCK_H + +#include +#include +#ifndef _MSC_VER +#include // Do_not_auto_remove (Needed for OpenBSD) +#endif +#include // Do_not_auto_remove (g++-4.0.1 except win32) + + +/** + * This class provides an easy way to lock non-critical + * files used by multiple applications. However, since + * the implementation relies on fcntl, it may not work + * on all filesystems (NFS) and thus locking is not + * certain. + * + * Currently, this lock holds an exclusive lock on the + * file in question. It is assumed that the file will + * be read/written by all users. + * + */ +class CFileLock +{ +public: + /** + * Locks the lock-file for the specified file. + * + * The lock-file is a file named file + "_lock", and + * will be created if it does not already exist. This + * file is not removed afterwards. + */ + CFileLock(const std::string& file) +#if defined(__WIN32__) || defined(_MSC_VER) + { + } +#else + : m_fd(-1), + m_ok(false) + { + // File must be open with O_WRONLY to be able to set write-locks. + m_fd = ::open((file + "_lock").c_str(), O_CREAT | O_WRONLY, 0600); + if (m_fd != -1) { + m_ok = SetLock(true); + } + } + + /** Releases the lock, if any is held. */ + ~CFileLock() { + if (m_ok) { + SetLock(false); + } + + if (m_fd != -1) { + close(m_fd); + } + } + +private: + //! Not copyable. + CFileLock(const CFileLock&); + //! Not assignable. + CFileLock& operator=(const CFileLock&); + + /** Locks or unlocks the lock-file, returning true on success. */ + bool SetLock(bool doLock) { + struct flock lock; + lock.l_type = (doLock ? F_WRLCK : F_UNLCK); + + // Lock the entire file + lock.l_whence = SEEK_SET; + lock.l_start = 0; + lock.l_len = 0; + + // Keep trying if interrupted by a signal. + while (true) { + if (fcntl(m_fd, F_SETLKW, &lock) == 0) { + return true; + } else if ((errno != EACCES) and (errno != EAGAIN) and (errno != EINTR)) { + // Not an error we can recover from. + break; + } + } + + return false; + } + + + //! Desribtor of the file being locked. + int m_fd; + + //! Specifies if the file-lock was aquired. + bool m_ok; +#endif +}; + +#endif +// File_checked_for_headers diff --git a/src/Friend.cpp b/src/Friend.cpp new file mode 100644 index 00000000..94fd9d1e --- /dev/null +++ b/src/Friend.cpp @@ -0,0 +1,151 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "Friend.h" // Interface declarations. +#include "PartFile.h" // Needed for CPartFile +#include "updownclient.h" // Needed for CUpDownClient +#include "GuiEvents.h" // Needed for Notify_* + + +CFriend::CFriend() +{ + m_dwLastSeen = 0; + m_dwLastUsedIP = 0; + m_nLastUsedPort = 0; + m_dwLastChatted = 0; + m_LinkedClient = NULL; +} + + +CFriend::CFriend( const CMD4Hash& userhash, uint32 tm_dwLastSeen, uint32 tm_dwLastUsedIP, uint32 tm_nLastUsedPort, uint32 tm_dwLastChatted, const wxString& tm_strName) +{ + m_dwLastSeen = tm_dwLastSeen; + m_dwLastUsedIP = tm_dwLastUsedIP; + m_nLastUsedPort = tm_nLastUsedPort; + m_dwLastChatted = tm_dwLastChatted; + m_UserHash = userhash; + + if (tm_strName.IsEmpty()) { + m_strName = wxT("?"); + } else { + m_strName = tm_strName; + } + + m_LinkedClient = NULL; +} + + +CFriend::CFriend(CUpDownClient* client) +{ + wxASSERT( client ); + + LinkClient(client, false); // On init, no need to unlink. BETTER not to unlink. + + m_dwLastChatted = 0; +} + + +void CFriend::LinkClient(CUpDownClient* client, bool unlink) { + // Link the friend to that client + if (unlink && m_LinkedClient) { // What, is already linked? + if (m_LinkedClient != client){ + bool bFriendSlot = m_LinkedClient->GetFriendSlot(); + // avoid that an unwanted client instance keeps a friend slot + m_LinkedClient->SetFriendSlot(false); + m_LinkedClient->SetFriend(NULL); + m_LinkedClient = client; + // move an assigned friend slot between different client instances which are/were also friends + m_LinkedClient->SetFriendSlot(bFriendSlot); + } + } else { + m_LinkedClient = client; + } + + if ( !client->GetUserName().IsEmpty() ) { + m_strName = client->GetUserName(); + } else { + m_strName = wxT("?"); + } + m_UserHash = client->GetUserHash(); + m_dwLastUsedIP = client->GetIP(); + m_nLastUsedPort = client->GetUserPort(); + m_dwLastSeen = time(NULL); + // This will update the Link status also on GUI. + Notify_ChatRefreshFriend(m_dwLastUsedIP, m_nLastUsedPort, m_strName); +} + + +void CFriend::LoadFromFile(CFileDataIO* file) +{ + wxASSERT( file ); + + m_UserHash = file->ReadHash(); + m_dwLastUsedIP = file->ReadUInt32(); + m_nLastUsedPort = file->ReadUInt16(); + m_dwLastSeen = file->ReadUInt32(); + m_dwLastChatted = file->ReadUInt32(); + + uint32 tagcount = file->ReadUInt32(); + for ( uint32 j = 0; j != tagcount; j++) { + CTag newtag(*file, true); + switch ( newtag.GetNameID() ) { + case FF_NAME: + if (m_strName.IsEmpty()) { + m_strName = newtag.GetStr(); + } + break; + } + } +} + + +void CFriend::WriteToFile(CFileDataIO* file) +{ + wxASSERT( file ); + file->WriteHash(m_UserHash); + file->WriteUInt32(m_dwLastUsedIP); + file->WriteUInt16(m_nLastUsedPort); + file->WriteUInt32(m_dwLastSeen); + file->WriteUInt32(m_dwLastChatted); + + uint32 tagcount = ( m_strName.IsEmpty() ? 0 : 2 ); + file->WriteUInt32(tagcount); + if ( !m_strName.IsEmpty() ) { + CTagString nametag(FF_NAME, m_strName); + nametag.WriteTagToFile(file, utf8strOptBOM); + nametag.WriteTagToFile(file); + } +} + + +bool CFriend::HasFriendSlot() { + if (GetLinkedClient()) { + return GetLinkedClient()->GetFriendSlot(); + } else { + return false; + } +} +// File_checked_for_headers diff --git a/src/Friend.h b/src/Friend.h new file mode 100644 index 00000000..f78bce6e --- /dev/null +++ b/src/Friend.h @@ -0,0 +1,79 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef FRIEND_H +#define FRIEND_H + + +#include "MD4Hash.h" + +class CUpDownClient; +class CFile; +class CFileDataIO; + +#define FF_NAME 0x01 + +class CFriend { +public: + CFriend(); + ~CFriend() {}; + + CFriend(CUpDownClient* client); + CFriend( const CMD4Hash& userhash, uint32 tm_dwLastSeen, uint32 tm_dwLastUsedIP, uint32 tm_nLastUsedPort, uint32 tm_dwLastChatted, const wxString& tm_strName); + + void SetUserHash(const CMD4Hash& userhash) { m_UserHash = userhash;} + bool HasHash() { return !m_UserHash.IsEmpty(); } + const CMD4Hash& GetUserHash() const { return m_UserHash; } + + void SetName(const wxString& name) { m_strName = name; } + + void LinkClient(CUpDownClient* client, bool unlink = true); + CUpDownClient* GetLinkedClient() const { return m_LinkedClient; } + void UnLinkClient() { m_LinkedClient = NULL; } + + bool HasFriendSlot(); + + const wxString& GetName() { return m_strName; } + uint16 GetPort() const { return m_nLastUsedPort; } + uint32 GetIP() const { return m_dwLastUsedIP; } + + void LoadFromFile(CFileDataIO* file); + void WriteToFile(CFileDataIO* file); + +private: + + CUpDownClient* m_LinkedClient; + + CMD4Hash m_UserHash; + uint32 m_dwLastSeen; + uint32 m_dwLastUsedIP; + uint16 m_nLastUsedPort; + uint32 m_dwLastChatted; + wxString m_strName; + +}; + +#endif +// File_checked_for_headers diff --git a/src/FriendList.cpp b/src/FriendList.cpp new file mode 100644 index 00000000..a92b4dd5 --- /dev/null +++ b/src/FriendList.cpp @@ -0,0 +1,232 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "FriendList.h" // Interface + +#include + +#include "amule.h" // Needed for theApp: let it first or fail under win32 +#include "ClientList.h" // Needed for CClientList +#include "updownclient.h" // Needed for CUpDownClient +#include "Friend.h" // Needed for CFriend +#include "CFile.h" +#include "Logger.h" + +CFriendList::CFriendList() +{ + LoadList(); +} + +CFriendList::~CFriendList() +{ + SaveList(); + + while ( m_FriendList.size() ) { + delete m_FriendList.front(); + m_FriendList.pop_front(); + } +} + + +void CFriendList::AddFriend(CFriend* toadd) +{ + m_FriendList.push_back(toadd); + SaveList(); +} + + +void CFriendList::AddFriend(const CMD4Hash& userhash, uint32 lastSeen, uint32 lastUsedIP, uint32 lastUsedPort, uint32 lastChatted, const wxString& name) +{ + CFriend* NewFriend = new CFriend( userhash, lastSeen, lastUsedIP, lastUsedPort, lastChatted, name); + + AddFriend( NewFriend ); +} + + +void CFriendList::AddFriend(CUpDownClient* toadd) +{ + if ( toadd->IsFriend() ) { + return; + } + + CFriend* NewFriend = new CFriend( toadd ); + toadd->SetFriend(NewFriend); + + AddFriend( NewFriend ); +} + + +void CFriendList::RemoveFriend(const CMD4Hash& userhash, uint32 lastUsedIP, uint32 lastUsedPort) +{ + CFriend* toremove = FindFriend(userhash, lastUsedIP, lastUsedPort); + if (toremove) { + if ( toremove->GetLinkedClient() ){ + toremove->GetLinkedClient()->SetFriendSlot(false); + toremove->GetLinkedClient()->SetFriend(NULL); + toremove->UnLinkClient(); + } + + m_FriendList.remove(toremove); + + SaveList(); + + delete toremove; + } +} + +void CFriendList::LoadList() +{ + CPath metfile = CPath(theApp->ConfigDir + wxT("emfriends.met")); + + if (!metfile.FileExists()) { + return; + } + + CFile file; + try { + if ( file.Open(metfile) ) { + if ( file.ReadUInt8() /*header*/ == MET_HEADER ) { + uint32 nRecordsNumber = file.ReadUInt32(); + for (uint32 i = 0; i < nRecordsNumber; i++) { + CFriend* Record = new CFriend(); + Record->LoadFromFile(&file); + m_FriendList.push_back(Record); + } + } + } else { + AddLogLineM(false, _("Failed to open friendlist file 'emfriends.met' for reading!")); + } + } catch (const CInvalidPacket& e) { + AddDebugLogLineM(true, logGeneral, wxT("Invalid entry in friendlist, file may be corrupt: ") + e.what()); + } catch (const CSafeIOException& e) { + AddDebugLogLineM(true, logGeneral, wxT("IO error while reading 'emfriends.met': ") + e.what()); + } + +} + + +void CFriendList::SaveList() +{ + CFile file; + if (file.Create(theApp->ConfigDir + wxT("emfriends.met"), true)) { + try { + file.WriteUInt8(MET_HEADER); + file.WriteUInt32(m_FriendList.size()); + + for (FriendList::iterator it = m_FriendList.begin(); it != m_FriendList.end(); ++it) { + (*it)->WriteToFile(&file); + } + } catch (const CIOFailureException& e) { + AddDebugLogLineM(true, logGeneral, wxT("IO failure while saving 'emfriends.met': ") + e.what()); + } + } else { + AddLogLineM(false, _("Failed to open friendlist file 'emfriends.met' for writing!")); + } +} + + +CFriend* CFriendList::FindFriend(const CMD4Hash& userhash, uint32 dwIP, uint16 nPort) +{ + + for(FriendList::iterator it = m_FriendList.begin(); it != m_FriendList.end(); ++it) { + + CFriend* cur_friend = *it; + // to avoid that unwanted clients become a friend, we have to distinguish between friends with + // a userhash and of friends which are identified by IP+port only. + if ( !userhash.IsEmpty() && cur_friend->HasHash() ) { + // check for a friend which has the same userhash as the specified one + if (cur_friend->GetUserHash() == userhash) { + return cur_friend; + } + } else if (cur_friend->GetIP() == dwIP && cur_friend->GetPort() == nPort) { + return cur_friend; + } + } + + return NULL; +} + + +bool CFriendList::IsAlreadyFriend( uint32 dwLastUsedIP, uint32 nLastUsedPort ) +{ + return FindFriend( CMD4Hash(), dwLastUsedIP, nLastUsedPort ); +} + + +void CFriendList::RemoveAllFriendSlots() +{ + for(FriendList::iterator it = m_FriendList.begin(); it != m_FriendList.end(); ++it) { + CFriend* cur_friend = *it; + if ( cur_friend->GetLinkedClient() ) { + cur_friend->GetLinkedClient()->SetFriendSlot(false); + } + } +} + +void CFriendList::RequestSharedFileList(const CMD4Hash& userhash, uint32 dwIP, uint16 nPort) { + CFriend* cur_friend = FindFriend(userhash, dwIP, nPort); + if (cur_friend) { + CUpDownClient* client = cur_friend->GetLinkedClient(); + if (!client) { + client = new CUpDownClient(cur_friend->GetPort(), cur_friend->GetIP(), 0, 0, 0, true, true); + client->SetUserName(cur_friend->GetName()); + theApp->clientlist->AddClient(client); + } + client->RequestSharedFileList(); + } +} + +void CFriendList::SetFriendSlot(const CMD4Hash& userhash, uint32 dwIP, uint16 nPort, bool new_state) { + CFriend* cur_friend = FindFriend(userhash, dwIP, nPort); + if (cur_friend && cur_friend->GetLinkedClient()) { + RemoveAllFriendSlots(); + cur_friend->GetLinkedClient()->SetFriendSlot(new_state); + } +} + +void CFriendList::StartChatSession(const CMD4Hash& userhash, uint32 dwIP, uint16 nPort) { + CFriend* friend_client = FindFriend(userhash, dwIP, nPort); + if (friend_client) { + CUpDownClient* client = friend_client->GetLinkedClient(); + if (!client) { + client = new CUpDownClient(friend_client->GetPort(), friend_client->GetIP(), 0, 0, 0, true, true); + client->SetIP(friend_client->GetIP()); + client->SetUserName(friend_client->GetName()); + theApp->clientlist->AddClient(client); + friend_client->LinkClient(client); + } + } else { + printf("CRITICAL - no client on StartChatSession\n"); + } + +} + +void CFriendList::UpdateFriendName(const CMD4Hash& userhash, const wxString& name, uint32 dwIP, uint16 nPort) { + CFriend* friend_client = FindFriend(userhash, dwIP, nPort); + friend_client->SetName(name); + SaveList(); +} +// File_checked_for_headers diff --git a/src/FriendList.h b/src/FriendList.h new file mode 100644 index 00000000..e2f5f36a --- /dev/null +++ b/src/FriendList.h @@ -0,0 +1,67 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef FRIENDLIST_H +#define FRIENDLIST_H + + +#include "Types.h" // Needed for uint32 + +class wxString; +class CFriend; +class CUpDownClient; +class CMD4Hash; + +typedef std::list FriendList; + +class CFriendList +{ +public: + CFriendList(); + ~CFriendList(); + + bool IsAlreadyFriend( uint32 dwLastUsedIP, uint32 nLastUsedPort ); + void SaveList(); + void LoadList(); + CFriend* FindFriend( const CMD4Hash& userhash, uint32 dwIP, uint16 nPort); + void AddFriend(CFriend* toadd); + void AddFriend( CUpDownClient* toadd ); + void AddFriend( const CMD4Hash& userhash, uint32 lastSeen, uint32 lastUsedIP, uint32 lastUsedPort, uint32 lastChatted, const wxString& name); + void RemoveFriend( const CMD4Hash& userhash, uint32 lastUsedIP, uint32 lastUsedPort); + void RequestSharedFileList(const CMD4Hash& userhash, uint32 dwIP, uint16 nPort); + void UpdateFriendName(const CMD4Hash& userhash, const wxString& name, uint32 dwIP, uint16 nPort); + + void SetFriendSlot(const CMD4Hash& userhash, uint32 dwIP, uint16 nPort, bool new_state); + void StartChatSession(const CMD4Hash& userhash, uint32 dwIP, uint16 nPort); + void RemoveAllFriendSlots(); + +//private: + +// //#warning THIS MUST BE MADE PRIVATE AFTER EC IS CODED + FriendList m_FriendList; +}; + +#endif +// File_checked_for_headers diff --git a/src/FriendListCtrl.cpp b/src/FriendListCtrl.cpp new file mode 100644 index 00000000..cdc7f644 --- /dev/null +++ b/src/FriendListCtrl.cpp @@ -0,0 +1,387 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "FriendListCtrl.h" // Interface declarations + +#include + +#include "amule.h" // Needed for theApp +#include "amuleDlg.h" // Needed for CamuleDlg +#include "ClientDetailDialog.h" // Needed for CClientDetailDialog +#include "AddFriend.h" // Needed for CAddFriend +#include "ChatWnd.h" // Needed for CChatWnd +#include "updownclient.h" // Needed for CUpDownClient +#include "Friend.h" // Needed for CFriend +#include "muuli_wdr.h" +#include "SafeFile.h" + +//#warning REMOVE WHEN EC IS CODED! +#include "FriendList.h" // Needed for the friends list + +BEGIN_EVENT_TABLE(CFriendListCtrl, CMuleListCtrl) + EVT_RIGHT_DOWN(CFriendListCtrl::OnRightClick) + EVT_LIST_ITEM_ACTIVATED(ID_FRIENDLIST, CFriendListCtrl::OnItemActivated) + + EVT_MENU(MP_MESSAGE, CFriendListCtrl::OnSendMessage) + EVT_MENU(MP_REMOVEFRIEND, CFriendListCtrl::OnRemoveFriend) + EVT_MENU(MP_ADDFRIEND, CFriendListCtrl::OnAddFriend) + EVT_MENU(MP_DETAIL, CFriendListCtrl::OnShowDetails) + EVT_MENU(MP_SHOWLIST, CFriendListCtrl::OnViewFiles) + EVT_MENU(MP_FRIENDSLOT, CFriendListCtrl::OnSetFriendslot) + + EVT_CHAR(CFriendListCtrl::OnKeyPressed) +END_EVENT_TABLE() + + +CDlgFriend::CDlgFriend(const CMD4Hash& hash, const wxString& name, uint32 ip, uint16 port, bool IsLinked, bool HasFriendSlot) +{ + m_hash = hash; + + if (name.IsEmpty()) { + m_name = wxT("?"); + } else { + m_name = name; + } + + m_ip = ip; + m_port = port; + islinked = IsLinked; + hasfriendslot = HasFriendSlot; +} + + +CFriendListCtrl::CFriendListCtrl(wxWindow* parent, int id, const wxPoint& pos, wxSize siz, int flags) +: CMuleListCtrl(parent, id, pos, siz, flags) +{ + InsertColumn(0, _("Username"), wxLIST_FORMAT_LEFT, siz.GetWidth() - 4); + + LoadList(); +} + +CFriendListCtrl::~CFriendListCtrl() +{ + for ( int i = 0; i < GetItemCount(); i++ ) { + delete (CDlgFriend*)GetItemData(i); + } +} + + +void CFriendListCtrl::AddFriend(CDlgFriend* toadd, bool send_to_core) +{ + uint32 itemnr = InsertItem(GetItemCount(), toadd->m_name); + SetItemPtrData(itemnr, reinterpret_cast(toadd)); + + //#warning CORE/GUI + if (send_to_core) { + #ifndef CLIENT_GUI + theApp->friendlist->AddFriend(toadd->m_hash, 0, toadd->m_ip, toadd->m_port, 0,toadd->m_name); + #endif + } +} + + +void CFriendListCtrl::AddFriend(const CMD4Hash& userhash, const wxString& name, uint32 lastUsedIP, uint32 lastUsedPort, bool IsLinked, bool HasFriendSlot, bool send_to_core) +{ + CDlgFriend* NewFriend = new CDlgFriend( userhash, name, lastUsedIP, lastUsedPort, IsLinked, HasFriendSlot); + + AddFriend( NewFriend, send_to_core); +} + + +void CFriendListCtrl::AddFriend(CUpDownClient* toadd) +{ + if ( toadd->IsFriend() ) { + return; + } + + //#warning CORE/GUI + // This links the friend to the client also + #ifndef CLIENT_GUI + theApp->friendlist->AddFriend(toadd); + #endif + + CDlgFriend* NewFriend = new CDlgFriend( toadd->GetUserHash(), toadd->GetUserName(), toadd->GetIP(), toadd->GetUserPort(), true, false); + + AddFriend( NewFriend, false/*already sent to core*/ ); +} + + +void CFriendListCtrl::RemoveFriend(CDlgFriend* toremove) +{ + if (!toremove) { + return; + } + + sint32 itemnr = FindItem(-1, reinterpret_cast(toremove)); + + if ( itemnr == -1 ) + return; + + //#warning CORE/GUI + #ifndef CLIENT_GUI + theApp->friendlist->RemoveFriend(toremove->m_hash, toremove->m_ip, toremove->m_port); + #endif + + DeleteItem(itemnr); +} + + +void CFriendListCtrl::RefreshFriend(CDlgFriend* toupdate) +{ + sint32 itemnr = FindItem(-1, reinterpret_cast(toupdate)); + if (itemnr != -1) { + SetItem(itemnr, 0, toupdate->m_name); + } + //#warning CORE/GUI + #ifndef CLIENT_GUI + theApp->friendlist->UpdateFriendName(toupdate->m_hash, toupdate->m_name, toupdate->m_ip, toupdate->m_port); + #endif +} + + +void CFriendListCtrl::OnItemActivated(wxListEvent& WXUNUSED(event)) +{ + int cursel = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + + CDlgFriend* cur_friend = (CDlgFriend*)GetItemData(cursel); + + /* ignore this one, it is not activated anymore :) */ + if (cur_friend == NULL) { + return; + } + + theApp->amuledlg->m_chatwnd->StartSession(cur_friend); + +} + + +void CFriendListCtrl::LoadList() +{ + //#warning EC: ASK THE LIST TO CORE! + + #ifndef CLIENT_GUI + for(FriendList::iterator it = theApp->friendlist->m_FriendList.begin(); it != theApp->friendlist->m_FriendList.end(); ++it) { + CFriend* core_friend = *it; + AddFriend(core_friend->GetUserHash(), core_friend->GetName(), core_friend->GetIP(), core_friend->GetPort(), core_friend->GetLinkedClient(), core_friend->HasFriendSlot(), false); + } + #endif + +} + +CDlgFriend* CFriendListCtrl::FindFriend(const CMD4Hash& userhash, uint32 dwIP, uint16 nPort) +{ + for ( int i = 0; i < GetItemCount(); i++ ) { + CDlgFriend* cur_friend = (CDlgFriend*)GetItemData(i); + + // to avoid that unwanted clients become a friend, we have to distinguish between friends with + // a userhash and of friends which are identified by IP+port only. + if ( !userhash.IsEmpty() && !cur_friend->m_hash.IsEmpty() ) { + // check for a friend which has the same userhash as the specified one + if (cur_friend->m_hash == userhash) { + return cur_friend; + } + } + else if (cur_friend->m_ip == dwIP && cur_friend->m_port == nPort) { + return cur_friend; + } + } + + return NULL; +} + +bool CFriendListCtrl::IsAlreadyFriend( uint32 dwLastUsedIP, uint32 nLastUsedPort ) +{ + return FindFriend( CMD4Hash(), dwLastUsedIP, nLastUsedPort ); +} + +void CFriendListCtrl::OnRightClick(wxMouseEvent& event) +{ + int cursel = CheckSelection(event); + + CDlgFriend* cur_friend = NULL; + + wxMenu* menu = new wxMenu(_("Friends")); + + if ( cursel != -1 ) { + cur_friend = (CDlgFriend*)GetItemData(cursel); + menu->Append(MP_DETAIL, _("Show &Details")); + menu->Enable(MP_DETAIL, cur_friend->islinked); + } + + menu->Append(MP_ADDFRIEND, _("Add a friend")); + + if (cursel != (-1)) { + menu->Append(MP_REMOVEFRIEND, _("Remove Friend")); + menu->Append(MP_MESSAGE, _("Send &Message")); + menu->Append(MP_SHOWLIST, _("View Files")); + menu->AppendCheckItem(MP_FRIENDSLOT, _("Establish Friend Slot")); + + if (cur_friend->islinked) { + menu->Enable(MP_FRIENDSLOT, true); + menu->Check(MP_FRIENDSLOT, cur_friend->hasfriendslot); + } else { + menu->Enable(MP_FRIENDSLOT, false); + } + } + + PopupMenu(menu, event.GetPosition()); +} + +void CFriendListCtrl::OnSendMessage(wxCommandEvent& WXUNUSED(event)) { + long index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + + while( index != -1 ) { + CDlgFriend* cur_friend = (CDlgFriend*)GetItemData(index); + theApp->amuledlg->m_chatwnd->StartSession(cur_friend); + //#warning CORE/GUI! + #ifndef CLIENT_GUI + theApp->friendlist->StartChatSession(cur_friend->m_hash, cur_friend->m_ip, cur_friend->m_port); + #endif + + index = GetNextItem( index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + } +} + + +void CFriendListCtrl::OnRemoveFriend(wxCommandEvent& WXUNUSED(event)) +{ + wxString question; + if (GetSelectedItemCount() == 1) { + question = _("Are you sure that you wish to delete the selected friend?"); + } else { + question = _("Are you sure that you wish to delete the selected friends?"); + } + + if ( wxMessageBox( question, _("Cancel"), wxICON_QUESTION | wxYES_NO, this) == wxYES ) { + long index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + + while( index != -1 ) { + CDlgFriend* cur_friend = (CDlgFriend*)GetItemData(index); + RemoveFriend(cur_friend); + // -1 because we changed the list and removed that item. + index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + } + } +} + + +void CFriendListCtrl::OnAddFriend(wxCommandEvent& WXUNUSED(event)) +{ + CAddFriend(this).ShowModal(); +} + + +void CFriendListCtrl::OnShowDetails(wxCommandEvent& WXUNUSED(event)) +{ + long index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + + while( index != -1 ) { + CDlgFriend* cur_friend = (CDlgFriend*)GetItemData(index); + if (cur_friend->islinked) { + //#warning EC: We need a reply packet with a full CUpDownClient + #ifndef CLIENT_GUI + CClientDetailDialog + ( + this, + theApp->friendlist->FindFriend + ( + cur_friend->m_hash, + cur_friend->m_ip, + cur_friend->m_port + )->GetLinkedClient() + ).ShowModal(); + #endif + } + index = GetNextItem( index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + } + +} + + +void CFriendListCtrl::OnViewFiles(wxCommandEvent& WXUNUSED(event)) +{ + long index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + + while( index != -1 ) { + //#warning CORE/GUI! + #ifndef CLIENT_GUI + CDlgFriend* cur_friend = (CDlgFriend*)GetItemData(index); + theApp->friendlist->RequestSharedFileList(cur_friend->m_hash, cur_friend->m_ip, cur_friend->m_port); + #endif + index = GetNextItem( index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + } + +} + + +void CFriendListCtrl::OnSetFriendslot(wxCommandEvent& event) +{ + // Clean friendslots + long index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_DONTCARE); + while (index != -1) { + CDlgFriend* friend_item = (CDlgFriend*)GetItemData(index); + friend_item->hasfriendslot = false; + index = GetNextItem( index, wxLIST_NEXT_ALL, wxLIST_STATE_DONTCARE); + } + // Now set the proper one + index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + //#warning CORE/GUI! + #ifndef CLIENT_GUI + CDlgFriend* cur_friend = (CDlgFriend*)GetItemData(index); + cur_friend->hasfriendslot = event.IsChecked(); + theApp->friendlist->SetFriendSlot(cur_friend->m_hash, cur_friend->m_ip, cur_friend->m_port, cur_friend->hasfriendslot); + #endif + index = GetNextItem( index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + if (index != -1) { + wxMessageBox(_("You are not allowed to set more than one friendslot.\n Only one slot was assigned."), _("Multiple selection"), wxICON_ERROR, this); + } +} + + +void CFriendListCtrl::SetLinked(const CMD4Hash& userhash, uint32 dwIP, uint16 nPort, bool new_state) +{ + CDlgFriend* client = FindFriend(CMD4Hash(), dwIP, nPort); + if (client) { + client->m_hash = userhash; + client->islinked = new_state; + } +} + + +void CFriendListCtrl::OnKeyPressed(wxKeyEvent& event) +{ + // Check if delete was pressed + if ((event.GetKeyCode() == WXK_DELETE) || (event.GetKeyCode() == WXK_NUMPAD_DELETE)) { + if (GetItemCount()) { + wxCommandEvent evt; + evt.SetId( MP_REMOVEFRIEND ); + OnRemoveFriend( evt ); + } + } else { + event.Skip(); + } +} +// File_checked_for_headers diff --git a/src/FriendListCtrl.h b/src/FriendListCtrl.h new file mode 100644 index 00000000..ad490181 --- /dev/null +++ b/src/FriendListCtrl.h @@ -0,0 +1,83 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef FRIENDLISTCTRL_H +#define FRIENDLISTCTRL_H + +#include "MuleListCtrl.h" +#include "MD4Hash.h" + +class wxString; +class CUpDownClient; + +class CDlgFriend { +public: + CDlgFriend(const CMD4Hash& hash, const wxString& name, uint32 ip, uint16 port, bool IsLinked, bool HasFriendSlot); + + wxString m_name; + uint32 m_ip; + uint16 m_port; + CMD4Hash m_hash; + bool islinked; + bool hasfriendslot; +}; + +class CFriendListCtrl : public CMuleListCtrl +{ +public: + CFriendListCtrl(wxWindow* parent, int id, const wxPoint& pos, wxSize siz, int flags); + ~CFriendListCtrl(); + + bool IsAlreadyFriend( uint32 dwLastUsedIP, uint32 nLastUsedPort ); + void LoadList(); + CDlgFriend* FindFriend( const CMD4Hash& userhash, uint32 dwIP, uint16 nPort); + void AddFriend(CDlgFriend* toadd, bool send_to_core = true); + void AddFriend( CUpDownClient* toadd ); + void AddFriend( const CMD4Hash& userhash, const wxString& name, uint32 lastUsedIP, uint32 lastUsedPort, bool IsLinked = false, bool HasFriendSlot = false, bool send_to_core = true); + void RemoveFriend(CDlgFriend* todel); + void RemoveFriend(CUpDownClient* todel); + void RefreshFriend(CDlgFriend* toupdate); + void SetLinked(const CMD4Hash& userhash, uint32 dwIP, uint16 nPort, bool new_state); + +protected: + DECLARE_EVENT_TABLE() + + void OnRightClick(wxMouseEvent& event); + +private: + void OnItemActivated(wxListEvent& event); + + // Menu Items + void OnShowDetails(wxCommandEvent& event); + void OnSendMessage(wxCommandEvent& event); + void OnRemoveFriend(wxCommandEvent& event); + void OnSetFriendslot(wxCommandEvent& event); + void OnAddFriend(wxCommandEvent& event); + void OnViewFiles(wxCommandEvent& event); + void OnKeyPressed(wxKeyEvent& event); +}; + +#endif +// File_checked_for_headers diff --git a/src/GetTickCount.cpp b/src/GetTickCount.cpp new file mode 100644 index 00000000..e1b2dd02 --- /dev/null +++ b/src/GetTickCount.cpp @@ -0,0 +1,148 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Alo Sarv +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Timo Kujala +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "GetTickCount.h" // Interface + +#ifdef __WINDOWS__ + +void StartTickTimer(){}; + +void StopTickTimer(){}; + +uint32 GetTickCountFullRes() { + return GetTickCount(); +} + +/** + * Returns the tickcount in 64bits. + */ +uint64 GetTickCount64() +{ + // The base value, can store more than 49 days worth of ms. + static uint64 tick = 0; + // The current tickcount, may have overflown any number of times. + static uint32 lastTick = 0; + + uint32 curTick = GetTickCount(); + + // Check for overflow + if ( curTick < lastTick ) { + // Change the base value to contain the overflown value. + tick += (uint64)1 << 32; + } + + lastTick = curTick; + return tick + lastTick; +} + +#else + +#include // Needed for gettimeofday + +uint32 GetTickCountFullRes(void) { + struct timeval aika; + gettimeofday(&aika,NULL); + unsigned long msecs = aika.tv_sec * 1000; + msecs += (aika.tv_usec / 1000); + return msecs; +} + +#if wxUSE_GUI && wxUSE_TIMER && !defined(AMULE_DAEMON) +/** + * Copyright (c) 2004-2008 Alo Sarv + * wxTimer based implementation. wxGetLocalTimeMillis() is called every 2 + * milliseconds and values stored in local variables. Upon requests for current + * time, values of those variables are returned. This means wxGetLocalTimeMillis + * is being called exactly 50 times per second at any case, no more no less. + */ + #include + + class MyTimer : public wxTimer + { + public: + MyTimer() { tic32 = tic64 = wxGetLocalTimeMillis().GetValue(); Start(20); } + static uint32 GetTickCountNow() { return tic32; } + static uint64 GetTickCountNow64() { return tic64; } + private: + void Notify() { tic32 = tic64 = wxGetLocalTimeMillis().GetValue(); } + + static uint32 tic32; + static uint64 tic64; + }; + + static class MyTimer* mytimer; + + // Initialization of the static MyTimer member variables. + uint32 MyTimer::tic32 = 0; + uint64 MyTimer::tic64 = 0; + + void StartTickTimer() { + wxASSERT(mytimer == NULL); + mytimer = new MyTimer(); + } + + void StopTickTimer() { + wxASSERT(mytimer != NULL); + delete mytimer; + mytimer = NULL; + } + + uint32 GetTickCount(){ + wxASSERT(mytimer != NULL); + return MyTimer::GetTickCountNow(); + } + + uint64 GetTickCount64(){ + wxASSERT(mytimer != NULL); + return MyTimer::GetTickCountNow64(); + } + +#else +/** + * Copyright (c) 2003-2008 Timo Kujala + * gettimeofday() syscall based implementation. Upon request to GetTickCount(), + * gettimeofday syscall is being used to retrieve system time and returned. This + * means EACH GetTickCount() call will produce a new syscall, thus becoming + * increasingly heavy on CPU as the program uptime increases and more things + * need to be done. + */ + void StartTickTimer() {} + + void StopTickTimer() {} + + uint32 GetTickCount() { return GetTickCountFullRes(); } + + // avoids 32bit rollover error for differences above 50days + uint64 GetTickCount64() { + struct timeval aika; + gettimeofday(&aika,NULL); + return aika.tv_sec * 1000 + aika.tv_usec / 1000; + } + +#endif + +#endif +// File_checked_for_headers diff --git a/src/GetTickCount.h b/src/GetTickCount.h new file mode 100644 index 00000000..948b766c --- /dev/null +++ b/src/GetTickCount.h @@ -0,0 +1,55 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Alo Sarv +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Timo Kujala +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef GETTICKCOUNT_H +#define GETTICKCOUNT_H + +#include "Types.h" // Needed for uint32 + +#ifndef __WINDOWS__ + uint32 GetTickCount(); +#else + #ifndef _MSC_VER + #include // Do_not_auto_remove + #endif +#endif + +// Ideally, same than GetTickCount. +// However, on GUI, GetTickCount does only work in +// 20 msecs increment, and some classes need better. + +uint32 GetTickCountFullRes(); + +uint64 GetTickCount64(); + +// Functions used to init the timer on GUI + +void StartTickTimer(); + +void StopTickTimer(); + +#endif // GETTICKCOUNT_H +// File_checked_for_headers diff --git a/src/GuiEvents.cpp b/src/GuiEvents.cpp new file mode 100644 index 00000000..291368f2 --- /dev/null +++ b/src/GuiEvents.cpp @@ -0,0 +1,642 @@ + +#include "GuiEvents.h" +#include "amule.h" +#include "PartFile.h" +#include "DownloadQueue.h" +#include "updownclient.h" +#include "ServerList.h" +#include "Preferences.h" + +#ifndef AMULE_DAEMON +# include "ChatWnd.h" +# include "amuleDlg.h" +# include "ServerWnd.h" +# include "SearchDlg.h" +# include "TransferWnd.h" +# include "SharedFilesWnd.h" +# include "ServerListCtrl.h" +# include "ClientListCtrl.h" +# include "SharedFilesCtrl.h" +# include "DownloadListCtrl.h" +# include "muuli_wdr.h" +#endif + +#ifdef AMULE_DAEMON +# define NOT_ON_DAEMON(x) WXUNUSED(x) +#else +# define NOT_ON_DAEMON(x) x +#endif + + +DEFINE_LOCAL_EVENT_TYPE(MULE_EVT_NOTIFY) + + +namespace MuleNotify +{ + + void HandleNotification(const CMuleNotiferBase& ntf) + { + if (wxThread::IsMain()) { +#if defined(AMULE_DAEMON) || defined(REMOTE_GUI) + ntf.Notify(); +#else + if (theApp->amuledlg) { + ntf.Notify(); + } +#endif + } else { + CMuleGUIEvent evt(ntf.Clone()); + wxPostEvent(wxTheApp, evt); + } + } + + void Search_Add_Download(CSearchFile* file, uint8 category) + { + theApp->downloadqueue->AddSearchToDownload(file, category); + } + + + void ShowUserCount(wxString NOT_ON_DAEMON(str)) + { +#ifndef AMULE_DAEMON + theApp->amuledlg->ShowUserCount(str); +#endif + } + + + void Search_Update_Progress(uint32 NOT_ON_DAEMON(val)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_searchwnd) { + if (val == 0xffff) { + // Global search ended + theApp->amuledlg->m_searchwnd->ResetControls(); + } else { + theApp->amuledlg->m_searchwnd->UpdateProgress(val); + } + } +#endif + } + + + void DownloadCtrlUpdateItem(const void* NOT_ON_DAEMON(item)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_transferwnd && theApp->amuledlg->m_transferwnd->downloadlistctrl) { + theApp->amuledlg->m_transferwnd->downloadlistctrl->UpdateItem(item); + } +#endif + } + + + void NodesURLChanged(wxString NOT_ON_DAEMON(url)) + { +#ifndef AMULE_DAEMON + CastByID(IDC_NODESLISTURL, NULL, wxTextCtrl)->SetValue(url); +#endif + } + + void ServersURLChanged(wxString NOT_ON_DAEMON(url)) + { +#ifndef AMULE_DAEMON + CastByID(IDC_SERVERLISTURL, NULL, wxTextCtrl)->SetValue(url); +#endif + } + + +#ifdef CLIENT_GUI + + void PartFile_Swap_A4AF(CPartFile* file) + { + theApp->downloadqueue->SendFileCommand(file, EC_OP_PARTFILE_SWAP_A4AF_THIS); + } + + void PartFile_Swap_A4AF_Auto(CPartFile* file) + { + theApp->downloadqueue->SendFileCommand(file, EC_OP_PARTFILE_SWAP_A4AF_THIS_AUTO); + } + + void PartFile_Swap_A4AF_Others(CPartFile* file) + { + theApp->downloadqueue->SendFileCommand(file, EC_OP_PARTFILE_SWAP_A4AF_OTHERS); + } + + void PartFile_Pause(CPartFile* file) + { + theApp->downloadqueue->SendFileCommand(file, EC_OP_PARTFILE_PAUSE); + } + + void PartFile_Resume(CPartFile* file) + { + theApp->downloadqueue->SendFileCommand(file, EC_OP_PARTFILE_RESUME); + } + + void PartFile_Stop(CPartFile* file) + { + theApp->downloadqueue->SendFileCommand(file, EC_OP_PARTFILE_STOP); + } + + void PartFile_PrioAuto(CPartFile* file, bool val) + { + theApp->downloadqueue->AutoPrio(file, val); + } + + void PartFile_PrioSet(CPartFile* file, uint8 newDownPriority, bool) + { + theApp->downloadqueue->Prio(file, newDownPriority); + } + + void PartFile_Delete(CPartFile* file) + { + theApp->downloadqueue->SendFileCommand(file, EC_OP_PARTFILE_DELETE); + } + + void PartFile_SetCat(CPartFile* file, uint32 val) + { + theApp->downloadqueue->Category(file, val); + } + + void KnownFile_Up_Prio_Set(CKnownFile* file, uint8 val) + { + theApp->sharedfiles->SetFilePrio(file, val); + } + + void KnownFile_Up_Prio_Auto(CKnownFile* file) + { + theApp->sharedfiles->SetFilePrio(file, PR_AUTO); + } + + void Download_Set_Cat_Prio(uint8, uint8) + { + } + + void Download_Set_Cat_Status(uint8, int) + { + } + +#else + + void SharedFilesShowFile(CKnownFile* NOT_ON_DAEMON(file)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_sharedfileswnd && theApp->amuledlg->m_sharedfileswnd->sharedfilesctrl) { + theApp->amuledlg->m_sharedfileswnd->sharedfilesctrl->ShowFile(file); + } +#endif + } + + void SharedFilesRemoveFile(CKnownFile* NOT_ON_DAEMON(file)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_sharedfileswnd && theApp->amuledlg->m_sharedfileswnd->sharedfilesctrl) { + theApp->amuledlg->m_sharedfileswnd->sharedfilesctrl->RemoveFile(file); + } +#endif + } + + void SharedFilesRemoveAllFiles() + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_sharedfileswnd) { + theApp->amuledlg->m_sharedfileswnd->RemoveAllSharedFiles(); + } +#endif + } + + + void SharedFilesShowFileList() + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_sharedfileswnd && theApp->amuledlg->m_sharedfileswnd->sharedfilesctrl) { + theApp->amuledlg->m_sharedfileswnd->sharedfilesctrl->ShowFileList(); + } +#endif + } + + + void SharedFilesUpdateItem(CKnownFile* NOT_ON_DAEMON(file)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_sharedfileswnd && theApp->amuledlg->m_sharedfileswnd->sharedfilesctrl) { + theApp->amuledlg->m_sharedfileswnd->sharedfilesctrl->UpdateItem(file); + } +#endif + } + + + void DownloadCtrlAddFile(CPartFile* NOT_ON_DAEMON(file)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_transferwnd && theApp->amuledlg->m_transferwnd->downloadlistctrl ) { + theApp->amuledlg->m_transferwnd->downloadlistctrl->AddFile(file); + } +#endif + } + + void DownloadCtrlAddSource(CPartFile* NOT_ON_DAEMON(owner), CUpDownClient* NOT_ON_DAEMON(source), DownloadItemType NOT_ON_DAEMON(type)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_transferwnd && theApp->amuledlg->m_transferwnd->downloadlistctrl) { + if (owner->ShowSources()) { + theApp->amuledlg->m_transferwnd->downloadlistctrl->AddSource(owner, source, type); + } + } +#endif + } + + void DownloadCtrlRemoveFile(CPartFile* NOT_ON_DAEMON(file)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_transferwnd && theApp->amuledlg->m_transferwnd->downloadlistctrl) { + theApp->amuledlg->m_transferwnd->downloadlistctrl->RemoveFile(file); + } +#endif + } + + void DownloadCtrlRemoveSource(const CUpDownClient* NOT_ON_DAEMON(source), const CPartFile* NOT_ON_DAEMON(owner)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_transferwnd && theApp->amuledlg->m_transferwnd->downloadlistctrl) { + if ((owner == NULL) || owner->ShowSources()) { + theApp->amuledlg->m_transferwnd->downloadlistctrl->RemoveSource(source, owner); + } + } +#endif + } + + void DownloadCtrlHideSource(CPartFile* NOT_ON_DAEMON(file)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_transferwnd && theApp->amuledlg->m_transferwnd->downloadlistctrl) { + theApp->amuledlg->m_transferwnd->downloadlistctrl->ShowSources(file, false); + } +#endif + } + + void DownloadCtrlSort() + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_transferwnd && theApp->amuledlg->m_transferwnd->downloadlistctrl) { + theApp->amuledlg->m_transferwnd->downloadlistctrl->SortList(); + } +#endif + } + + + void ClientCtrlAddClient(CUpDownClient* NOT_ON_DAEMON(client), ViewType NOT_ON_DAEMON(type)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_transferwnd && theApp->amuledlg->m_transferwnd->clientlistctrl) { + theApp->amuledlg->m_transferwnd->clientlistctrl->InsertClient(client, type); + } +#endif + } + + void ClientCtrlRefreshClient(CUpDownClient* NOT_ON_DAEMON(client), ViewType NOT_ON_DAEMON(type)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_transferwnd && theApp->amuledlg->m_transferwnd->clientlistctrl) { + theApp->amuledlg->m_transferwnd->clientlistctrl->UpdateClient(client, type); + } +#endif + } + + void ClientCtrlRemoveClient(CUpDownClient* NOT_ON_DAEMON(client), ViewType NOT_ON_DAEMON(type)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_transferwnd && theApp->amuledlg->m_transferwnd->clientlistctrl) { + theApp->amuledlg->m_transferwnd->clientlistctrl->RemoveClient(client, type); + } +#endif + } + + + void ServerAdd(CServer* NOT_ON_DAEMON(server)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_serverwnd && theApp->amuledlg->m_serverwnd->serverlistctrl) { + theApp->amuledlg->m_serverwnd->serverlistctrl->AddServer(server); + } +#endif + } + + void ServerRemove(CServer* NOT_ON_DAEMON(server)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_serverwnd && theApp->amuledlg->m_serverwnd->serverlistctrl) { + theApp->amuledlg->m_serverwnd->serverlistctrl->RemoveServer(server); + } +#endif + } + + void ServerRemoveDead() + { + if (theApp->serverlist) { + theApp->serverlist->RemoveDeadServers(); + } + } + + void ServerRemoveAll() + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_serverwnd && theApp->amuledlg->m_serverwnd->serverlistctrl) { + theApp->amuledlg->m_serverwnd->serverlistctrl->DeleteAllItems(); + } +#endif + } + + void ServerHighlight(CServer* NOT_ON_DAEMON(server), bool NOT_ON_DAEMON(highlight)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_serverwnd && theApp->amuledlg->m_serverwnd->serverlistctrl) { + theApp->amuledlg->m_serverwnd->serverlistctrl->HighlightServer(server, highlight); + } +#endif + } + + void ServerRefresh(CServer* NOT_ON_DAEMON(server)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_serverwnd && theApp->amuledlg->m_serverwnd->serverlistctrl) { + theApp->amuledlg->m_serverwnd->serverlistctrl->RefreshServer(server); + } +#endif + } + + void ServerFreeze() + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_serverwnd && theApp->amuledlg->m_serverwnd->serverlistctrl) { + theApp->amuledlg->m_serverwnd->serverlistctrl->Freeze(); + } +#endif + } + + void ServerThaw() + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_serverwnd && theApp->amuledlg->m_serverwnd->serverlistctrl) { + theApp->amuledlg->m_serverwnd->serverlistctrl->Thaw(); + } +#endif + } + + void ServerUpdateED2KInfo() + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_serverwnd) { + theApp->amuledlg->m_serverwnd->UpdateED2KInfo(); + } +#endif + } + + void ServerUpdateKadKInfo() + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_serverwnd) { + theApp->amuledlg->m_serverwnd->UpdateKadInfo(); + } +#endif + } + + + void SearchCancel() + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_searchwnd) { + theApp->amuledlg->m_searchwnd->ResetControls(); + } +#endif + } + + void SearchLocalEnd() + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_searchwnd) { + theApp->amuledlg->m_searchwnd->LocalSearchEnd(); + } +#endif + } + + void KadSearchEnd(uint32 NOT_ON_DAEMON(id)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_searchwnd) { + theApp->amuledlg->m_searchwnd->KadSearchEnd(id); + } +#endif + } + + void Search_Update_Sources(CSearchFile* NOT_ON_DAEMON(result)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg && theApp->amuledlg->m_searchwnd) { + theApp->amuledlg->m_searchwnd->UpdateResult(result); + } +#endif + } + + void Search_Add_Result(CSearchFile* NOT_ON_DAEMON(result)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg && theApp->amuledlg->m_searchwnd) { + theApp->amuledlg->m_searchwnd->AddResult(result); + } +#endif + } + + + void ChatRefreshFriend(uint32 NOT_ON_DAEMON(lastUsedIP), uint32 NOT_ON_DAEMON(lastUsedPort), wxString NOT_ON_DAEMON(name)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_chatwnd) { + theApp->amuledlg->m_chatwnd->RefreshFriend(CMD4Hash(), name, lastUsedIP, lastUsedPort); + } +#endif + } + + void ChatConnResult(bool NOT_ON_DAEMON(success), uint64 NOT_ON_DAEMON(id), wxString NOT_ON_DAEMON(message)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_chatwnd) { + theApp->amuledlg->m_chatwnd->ConnectionResult(success, message, id); + } +#endif + } + + void ChatProcessMsg(uint64 NOT_ON_DAEMON(sender), wxString NOT_ON_DAEMON(message)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_chatwnd) { + theApp->amuledlg->m_chatwnd->ProcessMessage(sender, message); + } +#endif + } + + + void ShowConnState(long NOT_ON_DAEMON(state)) + { +#ifndef AMULE_DAEMON +#ifdef CLIENT_GUI + theApp->m_ConnState = state; +#endif + + theApp->amuledlg->ShowConnectionState(); +#endif + } + + void ShowQueueCount(uint32 NOT_ON_DAEMON(count)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_transferwnd) { + theApp->amuledlg->m_transferwnd->ShowQueueCount(count); + } +#endif + } + + void ShowUpdateCatTabTitles() + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_transferwnd) { + theApp->amuledlg->m_transferwnd->UpdateCatTabTitles(); + } +#endif + } + + void ShowGUI() + { +#ifndef AMULE_DAEMON + theApp->amuledlg->Show_aMule(true); +#endif + } + + + void CategoryAdded() + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_transferwnd) { + theApp->amuledlg->m_transferwnd-> + AddCategory(theApp->glob_prefs->GetCategory( + theApp->glob_prefs->GetCatCount()-1)); + } +#endif + } + + void CategoryUpdate(uint32 NOT_ON_DAEMON(cat)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_transferwnd) { + theApp->amuledlg->m_transferwnd->UpdateCategory(cat); + theApp->amuledlg->m_transferwnd->downloadlistctrl->Refresh(); + theApp->amuledlg->m_searchwnd->UpdateCatChoice(); + } +#endif + } + + void CategoryDelete(uint32 NOT_ON_DAEMON(cat)) + { +#ifndef AMULE_DAEMON + if (theApp->amuledlg->m_transferwnd) { + theApp->amuledlg->m_transferwnd->RemoveCategory(cat); + } +#endif + } + + + void PartFile_Swap_A4AF(CPartFile* file) + { + if ((file->GetStatus(false) == PS_READY || file->GetStatus(false) == PS_EMPTY)) { + CPartFile::SourceSet::const_iterator it = file->GetA4AFList().begin(); + for ( ; it != file->GetA4AFList().end(); ) { + CUpDownClient *cur_source = *it++; + + cur_source->SwapToAnotherFile(true, false, false, file); + } + } + } + + void PartFile_Swap_A4AF_Auto(CPartFile* file) + { + file->SetA4AFAuto(!file->IsA4AFAuto()); + } + + void PartFile_Swap_A4AF_Others(CPartFile* file) + { + if ((file->GetStatus(false) == PS_READY) || (file->GetStatus(false) == PS_EMPTY)) { + CPartFile::SourceSet::const_iterator it = file->GetSourceList().begin(); + for( ; it != file->GetSourceList().end(); ) { + CUpDownClient* cur_source = *it++; + + cur_source->SwapToAnotherFile(false, false, false, NULL); + } + } + } + + void PartFile_Pause(CPartFile* file) + { + file->PauseFile(); + } + + void PartFile_Resume(CPartFile* file) + { + file->ResumeFile(); + file->SavePartFile(); + } + + void PartFile_Stop(CPartFile* file) + { + file->StopFile(); + } + + void PartFile_PrioAuto(CPartFile* file, bool val) + { + file->SetAutoDownPriority(val); + } + + void PartFile_PrioSet(CPartFile* file, uint8 newDownPriority, bool bSave) + { + file->SetDownPriority(newDownPriority, bSave); + } + + void PartFile_Delete(CPartFile* file) + { + file->Delete(); + } + + void PartFile_SetCat(CPartFile* file, uint32 val) + { + file->SetCategory(val); + } + + + void KnownFile_Up_Prio_Set(CKnownFile* file, uint8 val) + { + file->SetAutoUpPriority(false); + file->SetUpPriority(val); + } + + void KnownFile_Up_Prio_Auto(CKnownFile* file) + { + file->SetAutoUpPriority(true); + file->UpdateAutoUpPriority(); + } + + void KnownFile_Comment_Set(CKnownFile* file, wxString comment) + { + file->SetFileComment(comment); + } + + + void Download_Set_Cat_Prio(uint8 cat, uint8 newprio) + { + theApp->downloadqueue->SetCatPrio(cat, newprio); + } + + void Download_Set_Cat_Status(uint8 cat, int newstatus) + { + theApp->downloadqueue->SetCatStatus(cat, newstatus); + } + +#endif // #ifdef CLIENT_GUI +} +// File_checked_for_headers diff --git a/src/GuiEvents.h b/src/GuiEvents.h new file mode 100644 index 00000000..c996403a --- /dev/null +++ b/src/GuiEvents.h @@ -0,0 +1,506 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2004-2008 Angel Vidal Veiga (kry@users.sourceforge.net) +// Copyright (c) 2004-2008 Froenchenko Leonid (lfroen@users.sourceforge.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef GUIEVENTS_H +#define GUIEVENTS_H + +#include + +#include "Types.h" +#include "Constants.h" + + +class CKnownFile; +class CSearchFile; +class CPartFile; +class CServer; + + +DECLARE_LOCAL_EVENT_TYPE(MULE_EVT_NOTIFY, -1) + + +/** + * This namespaces contains a number of functions and classes + * related to defered function calls, allowing a notification + * call to be delayed till it can be initiated from the main + * thread. + */ +namespace MuleNotify +{ + /** + * Creates a deep copy of the object passed. + * + * Note that this function should be overwritten as + * needed. See the wxString version below. + */ + template + inline ValueType DeepCopy(const ValueType& value) + { + return ValueType(value); + } + + /** Special DeepCopy for wxString, which uses reference counting. */ + inline wxString DeepCopy(const wxString& value) + { + return wxString(value.c_str(), value.Length()); + } + + + //////////////////////////////////////////////////////////// + // Notification handlers + // + // These functions should not be called directly, but + // through the Notify_*, etc. macros. + // + + void SharedFilesShowFile(CKnownFile* file); + void SharedFilesRemoveFile(CKnownFile* file); + void SharedFilesRemoveAllFiles(); + void SharedFilesShowFileList(); + void SharedFilesUpdateItem(CKnownFile* file); + + void DownloadCtrlUpdateItem(const void* item); + void DownloadCtrlAddFile(CPartFile* file); + void DownloadCtrlAddSource(CPartFile* owner, CUpDownClient* source, DownloadItemType type); + void DownloadCtrlRemoveFile(CPartFile* file); + void DownloadCtrlRemoveSource(const CUpDownClient* source, const CPartFile* owner); + void DownloadCtrlHideSource(CPartFile* file); + void DownloadCtrlSort(); + + void ClientCtrlAddClient(CUpDownClient* client, ViewType type); + void ClientCtrlRefreshClient(CUpDownClient* client, ViewType type); + void ClientCtrlRemoveClient(CUpDownClient* client, ViewType type); + + void ServerAdd(CServer* server); + void ServerRemove(CServer* server); + void ServerRemoveDead(); + void ServerRemoveAll(); + void ServerHighlight(CServer* server, bool highlight); + void ServerRefresh(CServer* server); + void ServerFreeze(); + void ServerThaw(); + void ServerUpdateED2KInfo(); + void ServerUpdateKadKInfo(); + + void SearchCancel(); + void SearchLocalEnd(); + void KadSearchEnd(uint32 id); + void Search_Update_Sources(CSearchFile* result); + void Search_Add_Result(CSearchFile* result); + + void ChatRefreshFriend(uint32 lastUsedIP, uint32 lastUsedPort, wxString name); + void ChatConnResult(bool success, uint64 id, wxString message); + void ChatProcessMsg(uint64 sender, wxString message); + + void ShowConnState(long state); + void ShowUserCount(wxString str); + void ShowQueueCount(uint32 count); + void ShowUpdateCatTabTitles(); + void ShowGUI(); + + void CategoryAdded(); + void CategoryUpdate(uint32 cat); + void CategoryDelete(uint32 cat); + + void NodesURLChanged(wxString url); + void ServersURLChanged(wxString url); + + + // + // GUI -> core notification + // + + void PartFile_Swap_A4AF(CPartFile* file); + void PartFile_Swap_A4AF_Auto(CPartFile* file); + void PartFile_Swap_A4AF_Others(CPartFile* file); + void PartFile_Pause(CPartFile* file); + void PartFile_Resume(CPartFile* file); + void PartFile_Stop(CPartFile* file); + void PartFile_PrioAuto(CPartFile* file, bool val); + void PartFile_PrioSet(CPartFile* file, uint8 newDownPriority, bool bSave); + void PartFile_Delete(CPartFile* file); + void PartFile_SetCat(CPartFile* file, uint32 val); + + void KnownFile_Up_Prio_Set(CKnownFile* file, uint8 val); + void KnownFile_Up_Prio_Auto(CKnownFile* file); + void KnownFile_Comment_Set(CKnownFile* file, wxString comment); + + void Search_Add_Download(CSearchFile* result, uint8 category); + void Search_Update_Progress(uint32 value); + + void Download_Set_Cat_Prio(uint8 cat, uint8 newprio); + void Download_Set_Cat_Status(uint8 cat, int newstatus); + + + //////////////////////////////////////////////////////////// + // Notification utilities + + /** + * The base class of the functions. + * + * This class allows the the notification call to be executed + * without knowing the exact specifics of a given functor. + */ + class CMuleNotiferBase + { + public: + /** The constructor does nothing. */ + CMuleNotiferBase() {}; + /** The destructor is virtual since we will be deleting pointers to this type. */ + virtual ~CMuleNotiferBase() {}; + + /** Executes the actual notification call. */ + virtual void Notify() const = 0; + /** Returns a copy of the functor (function + arguments). */ + virtual CMuleNotiferBase* Clone() const = 0; + }; + + + /** Notification functor for functions taking no arguments. */ + class CMuleNotifier0 : public CMuleNotiferBase + { + public: + typedef void (*FuncType)(); + + /** Creates a functor from the given function. */ + CMuleNotifier0(FuncType func) + : m_func(func) {} + + /** @see CMuleNotifierBase::Notify */ + virtual void Notify() const { + m_func(); + } + + /** @see CMuleNotifierBase::Clone */ + virtual CMuleNotiferBase* Clone() const { + return new CMuleNotifier0(m_func); + } + + private: + FuncType m_func; + }; + + + /** Notification functor for functions taking 1 arguments. */ + template + class CMuleNotifier1 : public CMuleNotiferBase + { + public: + typedef void (*FuncType)(ARG); + + /** Creates a functor from the given function and arguments. */ + CMuleNotifier1(FuncType func, ARG arg) + : m_func(func), + m_arg(DeepCopy(arg)) + {} + + /** @see CMuleNotifierBase::Notify */ + virtual void Notify() const { + m_func(m_arg); + } + + /** @see CMuleNotifierBase::Clone */ + virtual CMuleNotiferBase* Clone() const { + return new CMuleNotifier1(m_func, m_arg); + } + + private: + FuncType m_func; + ARG m_arg; + }; + + + /** Notification functor for functions taking 2 arguments. */ + template + class CMuleNotifier2 : public CMuleNotiferBase + { + public: + typedef void (*FuncType)(ARG_1, ARG_2); + + /** Creates a functor from the given function and arguments. */ + CMuleNotifier2(FuncType func, ARG_1 arg1, ARG_2 arg2) + : m_func(func), + m_arg1(DeepCopy(arg1)), + m_arg2(DeepCopy(arg2)) + {} + + /** @see CMuleNotifierBase:: Notify */ + virtual void Notify() const { + m_func(m_arg1, m_arg2); + } + + /** @see CMuleNotifierBase::Clone */ + virtual CMuleNotiferBase* Clone() const { + return new CMuleNotifier2(m_func, m_arg1, m_arg2); + } + + private: + FuncType m_func; + ARG_1 m_arg1; + ARG_2 m_arg2; + }; + + + /** Notification functor for functions taking 3 arguments. */ + template + class CMuleNotifier3 : public CMuleNotiferBase + { + public: + typedef void (*FuncType)(ARG_1, ARG_2, ARG_3); + + /** Creates a functor from the given function and arguments. */ + CMuleNotifier3(FuncType func, ARG_1 arg1, ARG_2 arg2, ARG_3 arg3) + : m_func(func), + m_arg1(DeepCopy(arg1)), + m_arg2(DeepCopy(arg2)), + m_arg3(DeepCopy(arg3)) + {} + + /** @see CMuleNotifierBase:: Notify */ + virtual void Notify() const { + m_func(m_arg1, m_arg2, m_arg3); + } + + /** @see CMuleNotifierBase::Clone */ + virtual CMuleNotiferBase* Clone() const { + return new CMuleNotifier3(m_func, m_arg1, m_arg2, m_arg3); + } + + private: + FuncType m_func; + ARG_1 m_arg1; + ARG_2 m_arg2; + ARG_3 m_arg3; + }; + + + /** + * This event is sent when a worker-thread makes use of a notify-macro. + * + * This insures that all notifications are executed on the main thread, + * thereby improving overall threadsafety. The events are currently + * sent to wxTheApp. + */ + class CMuleGUIEvent : public wxEvent + { + public: + /** Takes ownership a notifier functor. */ + CMuleGUIEvent(CMuleNotiferBase* ntf) + : wxEvent(-1, MULE_EVT_NOTIFY) + , m_functor(ntf) + { + wxASSERT(m_functor); + } + + /** Destructor, frees the functor object. */ + virtual ~CMuleGUIEvent() { + delete m_functor; + } + + /** Executes the notification. */ + void Notify() const { + m_functor->Notify(); + } + + /** @see wxEvent::Clone */ + virtual wxEvent* Clone() const { + return new CMuleGUIEvent(m_functor->Clone()); + } + + private: + /** Not copyable. */ + CMuleGUIEvent(const CMuleGUIEvent&); + /** Not assignable. */ + CMuleGUIEvent& operator=(const CMuleGUIEvent&); + + //! The actual functor object, + CMuleNotiferBase* m_functor; + }; + + + /** + * This function will execute or queue a given notification functor. + * + * If the caller is the main thread, the functor is executed immediatly, + * thus acting like a regular function call. OTOH, if the caller is a + * worker thread, the functor is cloned and sent via an event to + * wxTheApp. + */ + void HandleNotification(const CMuleNotiferBase& ntf); + + /** + * These functions take a function pointer and a set of arguments, + * matching those of the function-pointer. A functor is created + * from these and either executed immediatly, or sent as an event + * in the case of non-main threads calling the functions. + * + * Note that the return-value of the function must be void. + * + * IMPORTANT: Note that the functions passed to DoNotify must not + * take arguments via references, since this causes the functors + * to store references to the arguments, rather than a copy and + * thus ends up with dangling references. + */ + //@{ + inline void DoNotify(void (*func)()) { + HandleNotification(CMuleNotifier0(func)); + } + template + inline void DoNotify(void (*func)(A1A), A1B arg1) { + HandleNotification(CMuleNotifier1(func, arg1)); + } + template + inline void DoNotify(void (*func)(A1A, A2A), A1B arg1, A2B arg2) { + HandleNotification(CMuleNotifier2(func, arg1, arg2)); + } + template + inline void DoNotify(void (*func)(A1A, A2A, A3A), A1B arg1, A2B arg2, A3B arg3) { + HandleNotification(CMuleNotifier3(func, arg1, arg2, arg3)); + } + //@} +} + + +//! Placing CMuleGUIEvent in the global namespace. +using MuleNotify::CMuleGUIEvent; + +//! The event-handler type that takes a CMuleGUIEvent. +typedef void (wxEvtHandler::*MuleNotifyEventFunction)(CMuleGUIEvent&); + +//! Event-handler for completed hashings of new shared files and partfiles. +#define EVT_MULE_NOTIFY(func) \ + DECLARE_EVENT_TABLE_ENTRY(MULE_EVT_NOTIFY, -1, -1, \ + (wxObjectEventFunction) (wxEventFunction) \ + wxStaticCastEvent(MuleNotifyEventFunction, &func), (wxObject*) NULL), + + + + +// SharedFilesCtrl +#define Notify_SharedFilesShowFile(file) MuleNotify::DoNotify(&MuleNotify::SharedFilesShowFile, file) +#define Notify_SharedFilesRemoveFile(file) MuleNotify::DoNotify(&MuleNotify::SharedFilesRemoveFile, file) +#define Notify_SharedFilesRemoveAllItems() MuleNotify::DoNotify(&MuleNotify::SharedFilesRemoveAllFiles) +#define Notify_SharedFilesShowFileList() MuleNotify::DoNotify(&MuleNotify::SharedFilesShowFileList) +#define Notify_SharedFilesSort() MuleNotify::DoNotify(&MuleNotify::SharedFilesSort) +#define Notify_SharedFilesUpdateItem(file) MuleNotify::DoNotify(&MuleNotify::SharedFilesUpdateItem, file) + +// download ctrl +#define Notify_DownloadCtrlUpdateItem(ptr) MuleNotify::DoNotify(&MuleNotify::DownloadCtrlUpdateItem, ptr) +#define Notify_DownloadCtrlAddFile(file) MuleNotify::DoNotify(&MuleNotify::DownloadCtrlAddFile, file) +#define Notify_DownloadCtrlAddSource(p0, p1, val) MuleNotify::DoNotify(&MuleNotify::DownloadCtrlAddSource, p0, p1, val) +#define Notify_DownloadCtrlRemoveFile(file) MuleNotify::DoNotify(&MuleNotify::DownloadCtrlRemoveFile, file) +#define Notify_DownloadCtrlRemoveSource(ptr0, ptr1) MuleNotify::DoNotify(&MuleNotify::DownloadCtrlRemoveSource, ptr0, ptr1) +#define Notify_DownloadCtrlHideSource(ptr) MuleNotify::DoNotify(&MuleNotify::DownloadCtrlHideSource, ptr) +#define Notify_DownloadCtrlSort() MuleNotify::DoNotify(&MuleNotify::DownloadCtrlSort) + +// upload ctrl +#define Notify_UploadCtrlAddClient(ptr) MuleNotify::DoNotify(&MuleNotify::ClientCtrlAddClient, ptr, vtUploading) +#define Notify_UploadCtrlRefreshClient(ptr) MuleNotify::DoNotify(&MuleNotify::ClientCtrlRefreshClient, ptr, vtUploading) +#define Notify_UploadCtrlRemoveClient(ptr) MuleNotify::DoNotify(&MuleNotify::ClientCtrlRemoveClient, ptr, vtUploading) + +// client ctrl +#define Notify_ClientCtrlAddClient(ptr) MuleNotify::DoNotify(&MuleNotify::ClientCtrlAddClient, ptr, vtClients) +#define Notify_ClientCtrlRefreshClient(ptr) MuleNotify::DoNotify(&MuleNotify::ClientCtrlRefreshClient, ptr, vtClients) +#define Notify_ClientCtrlRemoveClient(ptr) MuleNotify::DoNotify(&MuleNotify::ClientCtrlRemoveClient, ptr, vtClients) + +// queue list +#define Notify_QlistAddClient(ptr) MuleNotify::DoNotify(&MuleNotify::ClientCtrlAddClient, ptr, vtQueued) +#define Notify_QlistRefreshClient(ptr) MuleNotify::DoNotify(&MuleNotify::ClientCtrlRefreshClient, ptr, vtQueued) +#define Notify_QlistRemoveClient(ptr) MuleNotify::DoNotify(&MuleNotify::ClientCtrlRemoveClient, ptr, vtQueued) + +// server +#define Notify_ServerAdd(ptr) MuleNotify::DoNotify(&MuleNotify::ServerAdd, ptr) +#define Notify_ServerRemove(ptr) MuleNotify::DoNotify(&MuleNotify::ServerRemove, ptr) +#define Notify_ServerRemoveDead() MuleNotify::DoNotify(&MuleNotify::ServerRemoveDead) +#define Notify_ServerRemoveAll() MuleNotify::DoNotify(&MuleNotify::ServerRemoveAll) +#define Notify_ServerHighlight(ptr, val) MuleNotify::DoNotify(&MuleNotify::ServerHighlight, ptr, val) +#define Notify_ServerRefresh(ptr) MuleNotify::DoNotify(&MuleNotify::ServerRefresh, ptr) +#define Notify_ServerFreeze() MuleNotify::DoNotify(&MuleNotify::ServerFreeze) +#define Notify_ServerThaw() MuleNotify::DoNotify(&MuleNotify::ServerThaw) +#define Notify_ServerUpdateED2KInfo() MuleNotify::DoNotify(&MuleNotify::ServerUpdateED2KInfo) +#define Notify_ServerUpdateKadKInfo() MuleNotify::DoNotify(&MuleNotify::ServerUpdateKadKInfo) + +// search +#define Notify_SearchCancel() MuleNotify::DoNotify(&MuleNotify::SearchCancel) +#define Notify_SearchLocalEnd() MuleNotify::DoNotify(&MuleNotify::SearchLocalEnd) +#define Notify_KadSearchEnd(val) MuleNotify::DoNotify(&MuleNotify::KadSearchEnd, val) +#define Notify_Search_Update_Sources(ptr) MuleNotify::DoNotify(&MuleNotify::Search_Update_Sources, ptr) +#define Notify_Search_Add_Result(s) MuleNotify::DoNotify(&MuleNotify::Search_Add_Result, s) + +// chat +#define Notify_ChatRefreshFriend(val0, val1, s) MuleNotify::DoNotify(&MuleNotify::ChatRefreshFriend, val0, val1, s) +#define Notify_ChatConnResult(val0, val1, s) MuleNotify::DoNotify(&MuleNotify::ChatConnResult, val0, val1, s) +#define Notify_ChatProcessMsg(val0, s) MuleNotify::DoNotify(&MuleNotify::ChatProcessMsg, val0, s) + +// misc +#define Notify_ShowConnState(val) MuleNotify::DoNotify(&MuleNotify::ShowConnState, val) +#define Notify_ShowUserCount(str) MuleNotify::DoNotify(&MuleNotify::ShowUserCount, str) +#define Notify_ShowQueueCount(val) MuleNotify::DoNotify(&MuleNotify::ShowQueueCount, val) +#define Notify_ShowUpdateCatTabTitles() MuleNotify::DoNotify(&MuleNotify::ShowUpdateCatTabTitles) +#define Notify_ShowGUI() MuleNotify::DoNotify(&MuleNotify::ShowGUI) + +// categories +#define Notify_CategoryAdded() MuleNotify::DoNotify(&MuleNotify::CategoryAdded) +#define Notify_CategoryUpdate(cat) MuleNotify::DoNotify(&MuleNotify::CategoryUpdate, cat) +#define Notify_CategoryDelete(cat) MuleNotify::DoNotify(&MuleNotify::CategoryDelete, cat) + +// server.met/nodes.dat default urls +#define Notify_NodesURLChanged(url) MuleNotify::DoNotify(&MuleNotify::NodesURLChanged, url) +#define Notify_ServersURLChanged(url) MuleNotify::DoNotify(&MuleNotify::ServersURLChanged, url) + + +// +// GUI -> core notification +// + +// PartFile +#define CoreNotify_PartFile_Swap_A4AF(ptr) MuleNotify::DoNotify(&MuleNotify::PartFile_Swap_A4AF, ptr) +#define CoreNotify_PartFile_Swap_A4AF_Auto(ptr) MuleNotify::DoNotify(&MuleNotify::PartFile_Swap_A4AF_Auto, ptr) +#define CoreNotify_PartFile_Swap_A4AF_Others(ptr) MuleNotify::DoNotify(&MuleNotify::PartFile_Swap_A4AF_Others, ptr) +#define CoreNotify_PartFile_Pause(ptr) MuleNotify::DoNotify(&MuleNotify::PartFile_Pause, ptr) +#define CoreNotify_PartFile_Resume(ptr) MuleNotify::DoNotify(&MuleNotify::PartFile_Resume, ptr) +#define CoreNotify_PartFile_Stop(ptr) MuleNotify::DoNotify(&MuleNotify::PartFile_Stop, ptr) +#define CoreNotify_PartFile_PrioAuto(ptr, val) MuleNotify::DoNotify(&MuleNotify::PartFile_PrioAuto, ptr, val) +#define CoreNotify_PartFile_PrioSet(p, v0, v1) MuleNotify::DoNotify(&MuleNotify::PartFile_PrioSet, p, v0, v1) +#define CoreNotify_PartFile_Delete(ptr) MuleNotify::DoNotify(&MuleNotify::PartFile_Delete, ptr) +#define CoreNotify_PartFile_SetCat(ptr, val) MuleNotify::DoNotify(&MuleNotify::PartFile_SetCat, ptr, val) + +// KnownFile +#define CoreNotify_KnownFile_Up_Prio_Set(ptr, val) MuleNotify::DoNotify(&MuleNotify::KnownFile_Up_Prio_Set, ptr, val) +#define CoreNotify_KnownFile_Up_Prio_Auto(ptr) MuleNotify::DoNotify(&MuleNotify::KnownFile_Up_Prio_Auto, ptr) +#define CoreNotify_KnownFile_Comment_Set(ptr, val) MuleNotify::DoNotify(&MuleNotify::KnownFile_Comment_Set, ptr, val) + +// Search +#define CoreNotify_Search_Add_Download(ptr, val) MuleNotify::DoNotify(&MuleNotify::Search_Add_Download, ptr, val) +#define CoreNotify_Search_Update_Progress(val) MuleNotify::DoNotify(&MuleNotify::Search_Update_Progress, val) + +// download queue +#define CoreNotify_Download_Set_Cat_Prio(cat, pri) MuleNotify::DoNotify(&MuleNotify::Download_Set_Cat_Prio, cat, pri) +#define CoreNotify_Download_Set_Cat_Status(cat, st) MuleNotify::DoNotify(&MuleNotify::Download_Set_Cat_Status, cat, st) + +#endif // __GUIEVENTS_H__ + +// File_checked_for_headers diff --git a/src/HTTPDownload.cpp b/src/HTTPDownload.cpp new file mode 100644 index 00000000..9117c279 --- /dev/null +++ b/src/HTTPDownload.cpp @@ -0,0 +1,368 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Tiku +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include +#include + + +#include "HTTPDownload.h" // Interface declarations +#include // Needed for unicode2char +#include "OtherFunctions.h" // Needed for CastChild +#include "Logger.h" // Needed for AddLogLine* +#include // Needed for CFormat +#include "InternalEvents.h" // Needed for CMuleInternalEvent +#include "Preferences.h" + + +#ifndef AMULE_DAEMON +#include "inetdownload.h" // Needed for inetDownload +#include "muuli_wdr.h" // Needed for ID_CANCEL: Let it here or will fail on win32 +#include "MuleGifCtrl.h" + +#ifdef __WXMSW__ +typedef wxGauge95 wxGaugeControl; +#else +typedef wxGauge wxGaugeControl; +#endif + + +DECLARE_LOCAL_EVENT_TYPE(wxEVT_HTTP_PROGRESS, wxANY_ID) +DECLARE_LOCAL_EVENT_TYPE(wxEVT_HTTP_SHUTDOWN, wxANY_ID) + + +class CHTTPDownloadDialog : public wxDialog +{ +public: + CHTTPDownloadDialog(CHTTPDownloadThread* thread) + : wxDialog(wxTheApp->GetTopWindow(), -1, _("Downloading..."), + wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxSYSTEM_MENU) + { + downloadDlg(this, true)->Show(this, true); + + m_progressbar = CastChild(ID_HTTPDOWNLOADPROGRESS, wxGaugeControl); + m_progressbar->SetRange(100); + + m_ani = CastChild(ID_ANIMATE, MuleGifCtrl); + m_ani->LoadData((const char*)inetDownload, sizeof(inetDownload)); + m_ani->Start(); + + m_thread = thread; + } + + ~CHTTPDownloadDialog() { + StopThread(); + } + + void UpdateGauge(int total, int current) { + CFormat label(_("( %s / %s )")); + + label % CastItoXBytes(current); + if (total > 0) { + label % CastItoXBytes(total); + } else { + label % _("Unknown"); + } + + CastChild(IDC_DOWNLOADSIZE, wxStaticText)->SetLabel(label.GetString()); + + if (total && (total != m_progressbar->GetRange())) { + m_progressbar->SetRange(total); + } + + if (current && (current <= total)) { + m_progressbar->SetValue(current); + } + + Layout(); + } + +private: + void StopThread() { + if (m_thread) { + m_thread->Stop(); + delete m_thread; + m_thread = NULL; + } + } + + void OnBtnCancel(wxCommandEvent& WXUNUSED(evt)) { + printf("HTTP download cancelled\n"); + Show(false); + StopThread(); + } + + void OnProgress(CMuleInternalEvent& evt) { + UpdateGauge(evt.GetExtraLong(), evt.GetInt()); + } + + void OnShutdown(CMuleInternalEvent& WXUNUSED(evt)) { + Show(false); + Destroy(); + } + + CMuleThread* m_thread; + MuleGifCtrl* m_ani; + wxGaugeControl* m_progressbar; + + DECLARE_EVENT_TABLE() +}; + + +BEGIN_EVENT_TABLE(CHTTPDownloadDialog, wxDialog) + EVT_BUTTON(ID_HTTPCANCEL, CHTTPDownloadDialog::OnBtnCancel) + EVT_MULE_INTERNAL(wxEVT_HTTP_PROGRESS, -1, CHTTPDownloadDialog::OnProgress) + EVT_MULE_INTERNAL(wxEVT_HTTP_SHUTDOWN, -1, CHTTPDownloadDialog::OnShutdown) +END_EVENT_TABLE() + +DEFINE_LOCAL_EVENT_TYPE(wxEVT_HTTP_PROGRESS) +DEFINE_LOCAL_EVENT_TYPE(wxEVT_HTTP_SHUTDOWN) + +#endif + + +CHTTPDownloadThread::CHTTPDownloadThread(const wxChar* url, const wxChar* filename, HTTP_Download_File file_id, bool showDialog) +#ifdef AMULE_DAEMON + : CMuleThread(wxTHREAD_DETACHED), +#else + : CMuleThread(showDialog ? wxTHREAD_JOINABLE : wxTHREAD_DETACHED), +#endif + m_url(url), + m_tempfile(filename), + m_result(-1), + m_file_id(file_id), + m_companion(NULL) +{ + if (showDialog) { +#ifndef AMULE_DAEMON + CHTTPDownloadDialog* dialog = new CHTTPDownloadDialog(this); + dialog->Show(true); + m_companion = dialog; +#endif + } +} + + +CMuleThread::ExitCode CHTTPDownloadThread::Entry() +{ + if (TestDestroy()) { + return NULL; + } + + wxHTTP* url_handler = NULL; + wxInputStream* url_read_stream = NULL; + + printf("HTTP download thread started\n"); + + const CProxyData* proxy_data = thePrefs::GetProxyData(); + bool use_proxy = proxy_data != NULL && proxy_data->m_proxyEnable; + + try { + wxFFileOutputStream outfile(m_tempfile); + + if (!outfile.Ok()) { + throw wxString(CFormat(wxT("Unable to create destination file %s for download!\n")) % m_tempfile); + } + + if ( m_url.IsEmpty() ) { + // Nowhere to download from! + throw wxString(wxT("The URL to download can't be empty\n")); + } + + url_handler = new wxHTTP; + url_handler->SetProxyMode(use_proxy); + + url_read_stream = GetInputStream(&url_handler, m_url, use_proxy); + + if (!url_read_stream) { + throw wxString(CFormat(wxT("The URL %s returned: %i - Error (%i)!")) % m_url % url_handler->GetResponse() % url_handler->GetError()); + } + + int download_size = url_read_stream->GetSize(); + printf("Download size: %i\n",download_size); + + // Here is our read buffer + // Still, I'm sure 4092 is probably a better size. + const unsigned MAX_HTTP_READ = 4092; + + char buffer[MAX_HTTP_READ]; + int current_read = 0; + int total_read = 0; + do { + url_read_stream->Read(buffer, MAX_HTTP_READ); + current_read = url_read_stream->LastRead(); + if (current_read) { + total_read += current_read; + outfile.Write(buffer,current_read); + int current_write = outfile.LastWrite(); + if (current_read != current_write) { + throw wxString(wxT("Critical error while writing downloaded file")); + } else if (m_companion) { +#ifndef AMULE_DAEMON + CMuleInternalEvent evt(wxEVT_HTTP_PROGRESS); + evt.SetInt(total_read); + evt.SetExtraLong(download_size); + wxPostEvent(m_companion, evt); +#endif + } + } + } while (current_read && !TestDestroy()); + + if (current_read == 0) { + // Download was succesful. + m_result = 1; + } + } catch (const wxString& error) { + if (wxFileExists(m_tempfile)) { + wxRemoveFile(m_tempfile); + } + + AddLogLineM(false, error); + } + + delete url_read_stream; + if (url_handler) { + url_handler->Destroy(); + } + + printf("HTTP download thread ended\n"); + + return 0; +} + + +void CHTTPDownloadThread::OnExit() +{ +#ifndef AMULE_DAEMON + if (m_companion) { + CMuleInternalEvent termEvent(wxEVT_HTTP_SHUTDOWN); + wxPostEvent(m_companion, termEvent); + } +#endif + + // Notice the app that the file finished download + CMuleInternalEvent evt(wxEVT_CORE_FINISHED_HTTP_DOWNLOAD); + evt.SetInt((int)m_file_id); + evt.SetExtraLong((long)m_result); + wxPostEvent(wxTheApp, evt); +} + + +//! This function's purpose is to handle redirections in a proper way. +wxInputStream* CHTTPDownloadThread::GetInputStream(wxHTTP** url_handler, const wxString& location, bool proxy) +{ + if (TestDestroy()) { + return NULL; + } + + if (!location.StartsWith(wxT("http://"))) { + // This is not a http url + throw wxString(wxT("Invalid URL for server.met download or http redirection (did you forget 'http://' ?)")); + } + + // Get the host + + // Remove the "http://" + wxString host = location.Right(location.Len() - 7); // strlen("http://") -> 7 + + // I belive this is a bug... + // Sometimes "Location" header looks like this: + // "http://www.whatever.com:8080http://www.whatever.com/downloads/something.zip" + // So let's clean it... + + int bad_url_pos = host.Find(wxT("http://")); + wxString location_url; + if (bad_url_pos != -1) { + // Malformed Location field on header (bug above?) + location_url = host.Mid(bad_url_pos); + host = host.Left(bad_url_pos); + // After the first '/' non-http-related, it's the location part of the URL + location_url = location_url.Right(location_url.Len() - 7).AfterFirst(wxT('/')); + } else { + // Regular Location field + // After the first '/', it's the location part of the URL + location_url = host.AfterFirst(wxT('/')); + // The host is everything till the first "/" + host = host.BeforeFirst(wxT('/')); + } + + // Build the cleaned url now + wxString url = wxT("http://") + host + wxT("/") + location_url; + + int port = 80; + if (host.Find(wxT(':')) != -1) { + // This http url has a port + port = wxAtoi(host.AfterFirst(wxT(':'))); + host = host.BeforeFirst(wxT(':')); + } + + wxIPV4address addr; + addr.Hostname(host); + addr.Service(port); + if (!(*url_handler)->Connect(addr, true)) { + throw wxString(wxT("Unable to connect to http download server")); + } + + wxInputStream* url_read_stream = (*url_handler)->GetInputStream(url); + + printf("Host: %s:%i\n",(const char*)unicode2char(host),port); + printf("URL: %s\n",(const char*)unicode2char(url)); + printf("Response: %i (Error: %i)\n",(*url_handler)->GetResponse(), (*url_handler)->GetError()); + + if (!(*url_handler)->GetResponse()) { + printf("WARNING: Void response on stream creation\n"); + // WTF? Why does this happen? + // This is probably produced by an already existing connection, because + // the input stream is created nevertheless. However, data is not the same. + delete url_read_stream; + throw wxString(wxT("Invalid response from http download server")); + } + + if ((*url_handler)->GetResponse() == 301 // Moved permanently + || (*url_handler)->GetResponse() == 302 // Moved temporarily + // What about 300 (multiple choices)? Do we have to handle it? + ) { + + // We have to remove the current stream. + delete url_read_stream; + + wxString new_location = (*url_handler)->GetHeader(wxT("Location")); + + (*url_handler)->Destroy(); + if (!new_location.IsEmpty()) { + (*url_handler) = new wxHTTP; + (*url_handler)->SetProxyMode(proxy); + url_read_stream = GetInputStream(url_handler, new_location, proxy); + } else { + printf("ERROR: Redirection code received with no URL\n"); + url_handler = NULL; + url_read_stream = NULL; + } + } + + return url_read_stream; +} + +// File_checked_for_headers diff --git a/src/HTTPDownload.h b/src/HTTPDownload.h new file mode 100644 index 00000000..7c29dba4 --- /dev/null +++ b/src/HTTPDownload.h @@ -0,0 +1,57 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Tiku & Hetfield ( hetfield@amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef HTTPDOWNLOAD_H +#define HTTPDOWNLOAD_H + +#include "GuiEvents.h" // Needed for HTTP_Download_File +#include "MuleThread.h" // Needed for CMuleThread + +class wxEvtHandler; +class wxHTTP; +class wxInputStream; + + +class CHTTPDownloadThread : public CMuleThread +{ +public: + /** Note: wxChar* is used to circument the thread-unsafe wxString reference counting. */ + CHTTPDownloadThread(const wxChar* url, const wxChar* filename, HTTP_Download_File file_id, bool showDialog = true); + +private: + ExitCode Entry(); + virtual void OnExit(); + + wxString m_url; + wxString m_tempfile; + int m_result; + HTTP_Download_File m_file_id; + wxEvtHandler* m_companion; + + wxInputStream* GetInputStream(wxHTTP** url_handler, const wxString& location, bool proxy); +}; + +#endif // HTTPDOWNLOAD_H +// File_checked_for_headers diff --git a/src/IP2Country.cpp b/src/IP2Country.cpp new file mode 100644 index 00000000..d9640359 --- /dev/null +++ b/src/IP2Country.cpp @@ -0,0 +1,101 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2006-2008 Marcelo Roberto Jimenez ( phoenix@amule.org ) +// Copyright (c) 2006-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +// +// Country flags are from FAMFAMFAM (http://www.famfamfam.com) +// +// Flag icons - http://www.famfamfam.com +// +// These icons are public domain, and as such are free for any use (attribution appreciated but not required). +// +// Note that these flags are named using the ISO3166-1 alpha-2 country codes where appropriate. +// A list of codes can be found at http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 +// +// If you find these icons useful, please donate via paypal to mjames@gmail.com +// (or click the donate button available at http://www.famfamfam.com/lab/icons/silk) +// +// Contact: mjames@gmail.com +// + +#include "IP2Country.h" + + +#include "Logger.h" // For AddLogLineM() +#include // For CFormat() +#include // For unicode2char() +#include "pixmaps/flags_xpm/CountryFlags.h" + +#include +#include + + +CIP2Country::CIP2Country() +{ + m_geoip = GeoIP_new(GEOIP_STANDARD); + + // Load data from xpm files + for (int i = 0; i < FLAGS_XPM_SIZE; ++i) { + CountryData countrydata; + countrydata.Name = char2unicode(flagXPMCodeVector[i].code); + countrydata.Flag = wxBitmap(flagXPMCodeVector[i].xpm); + + if (countrydata.Flag.IsOk()) { + m_CountryDataMap[countrydata.Name] = countrydata; + } else { + AddLogLineM(true, _("CIP2Country::CIP2Country(): Failed to load country data from ") + countrydata.Name); + continue; + } + } + + AddLogLineM(false, CFormat(wxPLURAL("Loaded %d flag bitmap.", "Loaded %d flag bitmaps.", m_CountryDataMap.size())) % m_CountryDataMap.size()); +} + + +CIP2Country::~CIP2Country() +{ + GeoIP_delete(m_geoip); +} + + +const CountryData& CIP2Country::GetCountryData(const wxString &ip) +{ + const wxString CCode = wxString(char2unicode(GeoIP_country_code_by_addr(m_geoip, unicode2char(ip)))).MakeLower(); + + CountryDataMap::iterator it = m_CountryDataMap.find(CCode); + if (it == m_CountryDataMap.end()) { + // Show the code and ?? flag + it = m_CountryDataMap.find(wxString(wxT("unknown"))); + wxASSERT(it != m_CountryDataMap.end()); + if (CCode.IsEmpty()) { + it->second.Name = wxT("?"); + } else{ + it->second.Name = CCode; + } + } + + return it->second; +} + diff --git a/src/IP2Country.h b/src/IP2Country.h new file mode 100644 index 00000000..ce4b8340 --- /dev/null +++ b/src/IP2Country.h @@ -0,0 +1,75 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2006-2008 Marcelo Roberto Jimenez ( phoenix@amule.org ) +// Copyright (c) 2006-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +// +// Country flags are from FAMFAMFAM (http://www.famfamfam.com) +// +// Flag icons - http://www.famfamfam.com +// +// These icons are public domain, and as such are free for any use (attribution appreciated but not required). +// +// Note that these flags are named using the ISO3166-1 alpha-2 country codes where appropriate. +// A list of codes can be found at http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 +// +// If you find these icons useful, please donate via paypal to mjames@gmail.com +// (or click the donate button available at http://www.famfamfam.com/lab/icons/silk) +// +// Contact: mjames@gmail.com +// + +#ifndef IP2COUNTRY_H +#define IP2COUNTRY_H + + +#include + +#include + +#include +#include + + +typedef struct { + wxString Name; + wxBitmap Flag; +} CountryData; + + +typedef std::map CountryDataMap; + + +class CIP2Country { +public: + CIP2Country(); + ~CIP2Country(); + const CountryData& GetCountryData(const wxString& ip); + +private: + GeoIP *m_geoip; + CountryDataMap m_CountryDataMap; +}; + +#endif // IP2COUNTRY_H diff --git a/src/IPFilter.cpp b/src/IPFilter.cpp new file mode 100644 index 00000000..f680c258 --- /dev/null +++ b/src/IPFilter.cpp @@ -0,0 +1,506 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include // Needed for GetDataDir + +#include "IPFilter.h" // Interface declarations. +#include "Preferences.h" // Needed for thePrefs +#include "amule.h" // Needed for theApp +#include "Statistics.h" // Needed for theStats +#include "HTTPDownload.h" // Needed for CHTTPDownloadThread +#include "Logger.h" // Needed for AddDebugLogLineM +#include // Needed for CFormat +#include // Needed for CSimpleTokenizer +#include // Needed for UnpackArchive +#include // Needed for CTextFile +#include "ThreadScheduler.h" // Needed for CThreadScheduler and CThreadTask +#include "ClientList.h" // Needed for CClientList +#include "ServerList.h" // Needed for CServerList + + +//////////////////////////////////////////////////////////// +// CIPFilterEvent + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EVENT_TYPE(MULE_EVT_IPFILTER_LOADED, -1) +END_DECLARE_EVENT_TYPES() + +DEFINE_EVENT_TYPE(MULE_EVT_IPFILTER_LOADED) + + +class CIPFilterEvent : public wxEvent +{ +public: + CIPFilterEvent(CIPFilter::IPMap& result) + : wxEvent(-1, MULE_EVT_IPFILTER_LOADED) + { + // Avoid needles copying + std::swap(result, m_result); + } + + /** @see wxEvent::Clone */ + virtual wxEvent* Clone() const { + return new CIPFilterEvent(*this); + } + + CIPFilter::IPMap m_result; +}; + + +typedef void (wxEvtHandler::*MuleIPFilterEventFunction)(CIPFilterEvent&); + +//! Event-handler for completed hashings of new shared files and partfiles. +#define EVT_MULE_IPFILTER_LOADED(func) \ + DECLARE_EVENT_TABLE_ENTRY(MULE_EVT_IPFILTER_LOADED, -1, -1, \ + (wxObjectEventFunction) (wxEventFunction) \ + wxStaticCastEvent(MuleIPFilterEventFunction, &func), (wxObject*) NULL), + + +//////////////////////////////////////////////////////////// +// Thread task for loading the ipfilter.dat files. + +/** + * This task loads the two ipfilter.dat files, a task that + * can take quite a while on a slow system with a large dat- + * file. + */ +class CIPFilterTask : public CThreadTask +{ +public: + CIPFilterTask(wxEvtHandler* owner) + : CThreadTask(wxT("Load IPFilter"), wxEmptyString, ETP_Critical), + m_owner(owner) + { + } + + void Entry() { + wxStandardPathsBase &spb(wxStandardPaths::Get()); +#ifdef __WXMSW__ + wxString dataDir(spb.GetPluginsDir()); +#elif defined(__WXMAC__) + wxString dataDir(spb.GetDataDir()); +#else + wxString dataDir(spb.GetDataDir().BeforeLast(wxT('/')) + wxT("/amule")); +#endif + wxString systemwideFile(JoinPaths(dataDir,wxT("ipfilter.dat"))); + + AddLogLineM(false, _("Loading IP-filters 'ipfilter.dat' and 'ipfilter_static.dat'.")); + if ( !LoadFromFile(theApp->ConfigDir + wxT("ipfilter.dat")) && + thePrefs::UseIPFilterSystem() ) { + LoadFromFile(systemwideFile); + } + + + LoadFromFile(theApp->ConfigDir + wxT("ipfilter_static.dat")); + + CIPFilterEvent evt(m_result); + wxPostEvent(m_owner, evt); + } +private: + + + /** + * Helper function. + * + * @param IPstart The start of the IP-range. + * @param IPend The end of the IP-range, must be less than or equal to IPstart. + * @param AccessLevel The AccessLevel of this range. + * @param Description The assosiated description of this range. + * @return true if the range was added, false if it was discarded. + * + * This function inserts the specified range into the IPMap. Invalid + * ranges where the AccessLevel is not within the range 0..255, or + * where IPEnd < IPstart not inserted. + */ + bool AddIPRange(uint32 IPStart, uint32 IPEnd, uint16 AccessLevel, const wxString& Description) + { + if (AccessLevel < 256) { + if (IPStart <= IPEnd) { + CIPFilter::rangeObject item; + item.AccessLevel = AccessLevel; +#ifdef __DEBUG__ + item.Description = Description; +#endif + + m_result.insert(IPStart, IPEnd, item); + + return true; + } + } + + return false; + } + + + /** + * Helper function. + * + * @param str A string representation of an IP-range in the format "-". + * @param ipA The target of the first IP in the range. + * @param ipB The target of the second IP in the range. + * @return True if the parsing succeded, false otherwise (results will be invalid). + * + * The IPs returned by this function are in host order, not network order. + */ + bool m_inet_atoh(const wxString &str, uint32& ipA, uint32& ipB) + { + wxString first = str.BeforeFirst(wxT('-')); + wxString second = str.Mid(first.Len() + 1); + + bool result = StringIPtoUint32(first, ipA) && StringIPtoUint32(second, ipB); + + // StringIPtoUint32 saves the ip in anti-host order, but in order + // to be able to make relational comparisons, we need to convert + // it back to host-order. + ipA = wxUINT32_SWAP_ALWAYS(ipA); + ipB = wxUINT32_SWAP_ALWAYS(ipB); + + return result; + } + + + /** + * Helper-function for processing the PeerGuardian format. + * + * @return True if the line was valid, false otherwise. + * + * This function will correctly parse files that follow the folllowing + * format for specifying IP-ranges (whitespace is optional): + * - , , + */ + bool ProcessPeerGuardianLine(const wxString& sLine) + { + CSimpleTokenizer tkz(sLine, wxT(',')); + + wxString first = tkz.next(); + wxString second = tkz.next(); + wxString third = tkz.remaining().Strip(wxString::both); + + // If there were less than two tokens, fail + if (tkz.tokenCount() != 2) { + return false; + } + + // Convert string IP's to host order IP numbers + uint32 IPStart = 0; + uint32 IPEnd = 0; + + // This will also fail if the line is commented out + if (!m_inet_atoh(first, IPStart, IPEnd)) { + return false; + } + + // Second token is Access Level, default is 0. + unsigned long AccessLevel = 0; + if (!second.Strip(wxString::both).ToULong(&AccessLevel) || AccessLevel >= 255) { + return false; + } + + // Add the filter + return AddIPRange(IPStart, IPEnd, AccessLevel, third); + } + + + /** + * Helper-function for processing the AntiP2P format. + * + * @return True if the line was valid, false otherwise. + * + * This function will correctly parse files that follow the folllowing + * format for specifying IP-ranges (whitespace is optional): + * : - + */ + bool ProcessAntiP2PLine(const wxString& sLine) + { + // remove spaces from the left and right. + const wxString line = sLine.Strip(wxString::leading); + + // Extract description (first) and IP-range (second) form the line + int pos = line.Find(wxT(':'), true); + if (pos == -1) { + return false; + } + + wxString Description = line.Left(pos).Strip(wxString::trailing); + wxString IPRange = line.Right(line.Len() - pos - 1); + + // Convert string IP's to host order IP numbers + uint32 IPStart = 0; + uint32 IPEnd = 0; + + if (!m_inet_atoh(IPRange ,IPStart, IPEnd)) { + return false; + } + + // Add the filter + return AddIPRange(IPStart, IPEnd, 0, Description); + } + + + /** + * Loads a IP-list from the specified file, can be text or zip. + * + * @return True if the file was loaded, false otherwise. + **/ + int LoadFromFile(const wxString& file) + { + const CPath path = CPath(file); + + if (!path.FileExists() /* || TestDestroy() (see CIPFilter::Reload()) */) { + return 0; + } + + const wxChar* ipfilter_files[] = { + wxT("ipfilter.dat"), + wxT("guarding.p2p"), + NULL + }; + + // Try to unpack the file, might be an archive + if (UnpackArchive(path, ipfilter_files).second != EFT_Text) { + AddLogLineM(true, + CFormat(_("Failed to load ipfilter.dat file '%s', unknown format encountered.")) % file); + return 0; + } + + int filtercount = 0; + int discardedCount = 0; + + CTextFile readFile; + if (readFile.Open(path, CTextFile::read)) { + // Function pointer-type of the parse-functions we can use + typedef bool (CIPFilterTask::*ParseFunc)(const wxString&); + + ParseFunc func = NULL; + + while (!readFile.Eof()) { + wxString line = readFile.GetNextLine(); + + /* See CIPFilter::Reload() + if (TestDestroy()) { + return 0; + } else */ if (func && (*this.*func)(line)) { + filtercount++; + } else if (ProcessPeerGuardianLine(line)) { + func = &CIPFilterTask::ProcessPeerGuardianLine; + filtercount++; + } else if (ProcessAntiP2PLine(line)) { + func = &CIPFilterTask::ProcessAntiP2PLine; + filtercount++; + } else { + // Comments and empty lines are ignored + line = line.Strip(wxString::both); + + if (!line.IsEmpty() && !line.StartsWith(wxT("#"))) { + discardedCount++; + AddDebugLogLineM(false, logIPFilter, wxT( + "Invalid line found while reading ipfilter file: ") + line); + } + } + } + } else { + AddLogLineM(true, CFormat(_( + "Failed to load ipfilter.dat file '%s', could not open file.")) % file); + return 0; + } + + AddLogLineM(false, + ( CFormat(wxPLURAL("Loaded %u IP-range from '%s'.", "Loaded %u IP-ranges from '%s'.", filtercount)) % filtercount % file ) + + wxT(" ") + + ( CFormat(wxPLURAL("%u malformed line was discarded.", "%u malformed lines were discarded.", discardedCount)) % discardedCount ) + ); + + return filtercount; + } + +private: + wxEvtHandler* m_owner; + CIPFilter::IPMap m_result; +}; + + +//////////////////////////////////////////////////////////// +// CIPFilter + + +BEGIN_EVENT_TABLE(CIPFilter, wxEvtHandler) + EVT_MULE_IPFILTER_LOADED(CIPFilter::OnIPFilterEvent) +END_EVENT_TABLE() + + + +/** + * This function creates a text-file containing the specified text, + * but only if the file does not already exist. + */ +void CreateDummyFile(const wxString& filename, const wxString& text) +{ + // Create template files + if (!wxFileExists(filename)) { + CTextFile file; + + if (file.Open(filename, CTextFile::write)) { + file.WriteLine(text); + } + } +} + + +CIPFilter::CIPFilter() +{ + // Setup dummy files for the curious user. + const wxString normalDat = theApp->ConfigDir + wxT("ipfilter.dat"); + const wxString normalMsg = wxString() + << wxT("# This file is used by aMule to store ipfilter lists downloaded\n") + << wxT("# through the auto-update functionality. Do not save ipfilter-\n") + << wxT("# ranges here that should not be overwritten by aMule.\n"); + + CreateDummyFile(normalDat, normalMsg); + + const wxString staticDat = theApp->ConfigDir + wxT("ipfilter_static.dat"); + const wxString staticMsg = wxString() + << wxT("# This file is used to store ipfilter-ranges that should\n") + << wxT("# not be overwritten by aMule. If you wish to keep a custom\n") + << wxT("# set of ipfilter-ranges that take precedence over ipfilter-\n") + << wxT("# ranges aquired through the auto-update functionality, then\n") + << wxT("# place them in this file. aMule will not change this file."); + + CreateDummyFile(staticDat, staticMsg); + + Reload(); +} + + +void CIPFilter::Reload() +{ + // We keep the current filter till the new one has been loaded. + //CThreadScheduler::AddTask(new CIPFilterTask(this)); + + // This procedure cannot be run as a task, + // wxArchiveFSHandler::FindFirst() will eventually call wxExecute(), + // and this can only be done from the main task. + // + // This way, We call the Entry() routine manually and comment out the + // calls to TestDestroy(). + CIPFilterTask ipf_task(this); + ipf_task.Entry(); +} + + +uint32 CIPFilter::BanCount() const +{ + wxMutexLocker lock(m_mutex); + + return m_iplist.size(); +} + + +bool CIPFilter::IsFiltered(uint32 IPTest, bool isServer) +{ + if ((thePrefs::IsFilteringClients() && !isServer) || (thePrefs::IsFilteringServers() && isServer)) { + wxMutexLocker lock(m_mutex); + + // The IP needs to be in host order + IPMap::iterator it = m_iplist.find_range(wxUINT32_SWAP_ALWAYS(IPTest)); + + if (it != m_iplist.end()) { + if (it->AccessLevel < thePrefs::GetIPFilterLevel()) { +#ifdef __DEBUG__ + AddDebugLogLineM(false, logIPFilter, wxString(wxT("Filtered IP (AccLvl: ")) << (long)it->AccessLevel << wxT("): ") + << Uint32toStringIP(IPTest) << wxT(" (") << it->Description + wxT(")")); +#endif + + if (isServer) { + theStats::AddFilteredServer(); + } else { + theStats::AddFilteredClient(); + } + return true; + } + } + } + + return false; +} + + +void CIPFilter::Update(const wxString& strURL) +{ + if (!strURL.IsEmpty()) { + wxString filename = theApp->ConfigDir + wxT("ipfilter.download"); + CHTTPDownloadThread *downloader = new CHTTPDownloadThread(strURL, filename, HTTP_IPFilter); + + downloader->Create(); + downloader->Run(); + } +} + + +void CIPFilter::DownloadFinished(uint32 result) +{ + if (result == 1) { + // download succeeded. proceed with ipfilter loading + wxString newDat = theApp->ConfigDir + wxT("ipfilter.download"); + wxString oldDat = theApp->ConfigDir + wxT("ipfilter.dat"); + + if (wxFileExists(oldDat)) { + if (!wxRemoveFile(oldDat)) { + AddDebugLogLineM(true, logIPFilter, + wxT("Failed to remove ipfilter.dat file, aborting update.")); + return; + } + } + + if (!wxRenameFile(newDat, oldDat)) { + AddDebugLogLineM(true, logIPFilter, + wxT("Failed to rename new ipfilter.dat file, aborting update.")); + return; + } + + // Reload both ipfilter files + Reload(); + } else { + AddDebugLogLineM(true, logIPFilter, + wxT("Failed to download the ipfilter from ") + thePrefs::IPFilterURL()); + } +} + + +void CIPFilter::OnIPFilterEvent(CIPFilterEvent& evt) +{ + { + wxMutexLocker lock(m_mutex); + std::swap(m_iplist, evt.m_result); + } + + if (thePrefs::IsFilteringClients()) { + theApp->clientlist->FilterQueues(); + } + if (thePrefs::IsFilteringServers()) { + theApp->serverlist->FilterServers(); + } +} + +// File_checked_for_headers diff --git a/src/IPFilter.h b/src/IPFilter.h new file mode 100644 index 00000000..e5e71d72 --- /dev/null +++ b/src/IPFilter.h @@ -0,0 +1,135 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef IPFILTER_H +#define IPFILTER_H + +#include // Needed for wxEvent + +#include "Types.h" // Needed for uint8, uint16 and uint32 +#include "RangeMap.h" // Needed for CRangeMap + + +class CIPFilterEvent; + + +/** + * This class represents a list of IPs that should not be accepted + * as valid connection destinations nor sources. It provides an + * interface to query whether or not a specific IP is filtered. + * + * Currently this class can handle IPRange files in the Peer-Guardian + * format and the AntiP2P format, read from either text files or text + * files compressed with the zip compression format. + * + * This class is thread-safe. + */ +class CIPFilter : public wxEvtHandler +{ +public: + /** + * Constructor. + */ + CIPFilter(); + + /** + * Checks if a IP is filtered with the current list and AccessLevel. + * + * @param IP2test The IP-Address to test for. + * @param isServer Whether this IP belongs to a server or a client. Needed for statistical purposes only. + * @return True if it is filtered, false otherwise. + * + * Note: IP2Test must be in anti-host order (BE on LE platform, LE on BE platform). + */ + bool IsFiltered( uint32 IP2test, bool isServer = false ); + + + /** + * Returns the number of banned ranges. + */ + uint32 BanCount() const; + + /** + * Reloads the ipfilter files, discarding the current list of ranges. + */ + void Reload(); + + /** + * Starts a download of the ipfilter-list at the specified URL. + * + * @param A valid URL. + * + * Once the file has been downloaded, the ipfilter.dat file + * will be replaced with the new file and Reload will be called. + */ + void Update(const wxString& strURL); + + /** + * This function is called when a download is completed. + */ + void DownloadFinished(uint32 result); + +private: + /** Handles the result of loading the dat-files. */ + void OnIPFilterEvent(CIPFilterEvent&); + + /** + * This structure is used to contain the range-data in the rangemap. + */ + struct rangeObject + { + bool operator==( const rangeObject& other ) const { + return AccessLevel == other.AccessLevel; + } + +// Since descriptions are only used for debugging messages, there +// is no need to keep them in memory when running a non-debug build. +#ifdef __DEBUG__ + //! Contains the user-description of the range. + wxString Description; +#endif + + //! The AccessLevel for this filter. + uint8 AccessLevel; + }; + + + //! The is the type of map used to store the IPs. + typedef CRangeMap IPMap; + + //! The map of IP-ranges + IPMap m_iplist; + + //! Mutex used to ensure thread-safety of this class + mutable wxMutex m_mutex; + + friend class CIPFilterEvent; + friend class CIPFilterTask; + + DECLARE_EVENT_TABLE() +}; + +#endif +// File_checked_for_headers diff --git a/src/InternalEvents.h b/src/InternalEvents.h new file mode 100644 index 00000000..be4705a1 --- /dev/null +++ b/src/InternalEvents.h @@ -0,0 +1,95 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef INTERNALEVENTS_H +#define INTERNALEVENTS_H + + +#include // Needed for wxEvent + + +DECLARE_LOCAL_EVENT_TYPE(wxEVT_CORE_FINISHED_HTTP_DOWNLOAD, wxEVT_USER_FIRST+HTTP_DOWNLOAD_FINISHED) + +DECLARE_LOCAL_EVENT_TYPE(wxEVT_CORE_SOURCE_DNS_DONE, wxEVT_USER_FIRST+SOURCE_DNS_DONE) +DECLARE_LOCAL_EVENT_TYPE(wxEVT_CORE_UDP_DNS_DONE, wxEVT_USER_FIRST+UDP_DNS_DONE) +DECLARE_LOCAL_EVENT_TYPE(wxEVT_CORE_SERVER_DNS_DONE, wxEVT_USER_FIRST+SERVER_DNS_DONE) + + +class CMuleInternalEvent : public wxEvent +{ +public: + CMuleInternalEvent(int event, int id = wxID_ANY) + : wxEvent(id, event), + m_ptr(NULL), + m_value(0), + m_commandInt(0) + { + } + + wxEvent* Clone(void) const { + return new CMuleInternalEvent(*this); + } + + void SetExtraLong(long value) { + m_value = value; + } + + long GetExtraLong() { + return m_value; + } + + void SetInt(int i) { + m_commandInt = i; + } + + long GetInt() const { + return m_commandInt; + } + + void SetClientData(void *ptr) { + m_ptr = ptr; + } + + void *GetClientData() { + return m_ptr; + } + +private: + void* m_ptr; + long m_value; + int m_commandInt; +}; + + +typedef void (wxEvtHandler::*MuleInternalEventFunction)(CMuleInternalEvent&); + +//! Event-handler for completed hashings of new shared files and partfiles. +#define EVT_MULE_INTERNAL(event, id, func) \ + DECLARE_EVENT_TABLE_ENTRY(event, id, -1, \ + (wxObjectEventFunction) (wxEventFunction) \ + wxStaticCastEvent(MuleInternalEventFunction, &func), (wxObject*) NULL), + + +#endif /* INTERNALEVENTS_H */ +// File_checked_for_headers diff --git a/src/KadDlg.cpp b/src/KadDlg.cpp new file mode 100644 index 00000000..41a793a0 --- /dev/null +++ b/src/KadDlg.cpp @@ -0,0 +1,204 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "KadDlg.h" +#include "muuli_wdr.h" +#include "OScopeCtrl.h" +#include "OtherFunctions.h" +#include "HTTPDownload.h" +#include "Logger.h" +#include "amule.h" +#include "Preferences.h" +#include "StatisticsDlg.h" +#include "ColorFrameCtrl.h" + + +#ifndef CLIENT_GUI +#include "kademlia/kademlia/Kademlia.h" +#endif + + +BEGIN_EVENT_TABLE(CKadDlg, wxPanel) + EVT_TEXT(ID_NODE_IP1, CKadDlg::OnFieldsChange) + EVT_TEXT(ID_NODE_IP2, CKadDlg::OnFieldsChange) + EVT_TEXT(ID_NODE_IP3, CKadDlg::OnFieldsChange) + EVT_TEXT(ID_NODE_IP4, CKadDlg::OnFieldsChange) + EVT_TEXT(ID_NODE_PORT, CKadDlg::OnFieldsChange) + + EVT_TEXT_ENTER(IDC_NODESLISTURL ,CKadDlg::OnBnClickedUpdateNodeList) + + EVT_BUTTON(ID_NODECONNECT, CKadDlg::OnBnClickedBootstrapClient) + EVT_BUTTON(ID_KNOWNNODECONNECT, CKadDlg::OnBnClickedBootstrapKnown) + EVT_BUTTON(ID_KADDISCONNECT, CKadDlg::OnBnClickedDisconnectKad) + EVT_BUTTON(ID_UPDATEKADLIST, CKadDlg::OnBnClickedUpdateNodeList) +END_EVENT_TABLE() + + + +CKadDlg::CKadDlg(wxWindow* pParent) + : wxPanel(pParent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, wxT("kadwnd") ) +{ + m_kad_scope = NULL; +} + + +void CKadDlg::Init() +{ + m_kad_scope = CastChild( wxT("kadScope"), COScopeCtrl ); + m_kad_scope->SetRanges(0.0, thePrefs::GetStatsMax()); + m_kad_scope->SetYUnits(wxT("Nodes")); + + SetUpdatePeriod(thePrefs::GetTrafficOMeterInterval()); + SetGraphColors(); +} + + +void CKadDlg::SetUpdatePeriod(int step) +{ + // this gets called after the value in Preferences/Statistics/Update delay has been changed + if (step == 0) { + m_kad_scope->Stop(); + } else { + m_kad_scope->Reset(step); + } +} + + +void CKadDlg::SetGraphColors() +{ + static const char aTrend[] = { 2, 1, 0 }; + static const int aRes[] = { IDC_C0, IDC_C0_3, IDC_C0_2 }; + + m_kad_scope->SetBackgroundColor(CStatisticsDlg::getColors(0)); + m_kad_scope->SetGridColor(CStatisticsDlg::getColors(1)); + + for (size_t i = 0; i < 3; ++i) { + m_kad_scope->SetPlotColor(CStatisticsDlg::getColors(12 + i), aTrend[i]); + + CColorFrameCtrl* ctrl = CastChild(aRes[i], CColorFrameCtrl); + ctrl->SetBackgroundColor(CStatisticsDlg::getColors(12 + i)); + ctrl->SetFrameColor((COLORREF)RGB(0,0,0)); + } +} + + +void CKadDlg::UpdateGraph(bool bStatsVisible, const GraphUpdateInfo& update) +{ + std::vector v(3); + v[0] = const_cast(&update.kadnodes[0]); + v[1] = const_cast(&update.kadnodes[1]); + v[2] = const_cast(&update.kadnodes[2]); + const std::vector &apfKad(v); + unsigned nodeCount = static_cast(update.kadnodes[2]); + + if (!bStatsVisible) { + m_kad_scope->DelayPoints(); + } else { + // Check the current node-count to see if we should increase the graph height + if (m_kad_scope->GetUpperLimit() < update.kadnodes[2]) { + // Grow the limit by 50 sized increments. + m_kad_scope->SetRanges(0.0, ((nodeCount + 49) / 50) * 50); + } + + m_kad_scope->AppendPoints(update.timestamp, apfKad); + } + + wxStaticText* label = CastChild( wxT("nodesListLabel"), wxStaticText ); + wxCHECK_RET(label, wxT("Failed to find kad-nodes label")); + + label->SetLabel(wxString::Format(_("Nodes (%u)"), nodeCount)); + label->GetParent()->Layout(); +} + + +// Enables or disables the node connect button depending on the conents of the text fields +void CKadDlg::OnFieldsChange(wxCommandEvent& WXUNUSED(evt)) +{ + // These are the IDs of the search-fields + int textfields[] = { ID_NODE_IP1, ID_NODE_IP2, ID_NODE_IP3, ID_NODE_IP4, ID_NODE_PORT}; + + bool enable = true; + for ( uint16 i = 0; i < itemsof(textfields); i++ ) { + enable &= !CastChild(textfields[i], wxTextCtrl)->GetValue().IsEmpty(); + } + + // Enable the node connect button if all fields contain text + FindWindowById(ID_NODECONNECT)->Enable( enable ); +} + + +void CKadDlg::OnBnClickedBootstrapClient(wxCommandEvent& WXUNUSED(evt)) +{ + if (FindWindowById(ID_NODECONNECT)->IsEnabled()) { + // Ip is reversed since StringIPtoUint32 returns anti-host and kad expects host order + uint32 ip = StringIPtoUint32( + ((wxTextCtrl*)FindWindowById( ID_NODE_IP4 ))->GetValue() + + wxT(".") + + ((wxTextCtrl*)FindWindowById( ID_NODE_IP3 ))->GetValue() + + wxT(".") + + ((wxTextCtrl*)FindWindowById( ID_NODE_IP2 ))->GetValue() + + wxT(".") + + ((wxTextCtrl*)FindWindowById( ID_NODE_IP1 ))->GetValue() ); + + if (ip == 0) { + wxMessageBox(_("Invalid ip to bootstrap"), _("Warning"), wxOK | wxICON_EXCLAMATION, this); + } else { + unsigned long port; + if (((wxTextCtrl*)FindWindowById( ID_NODE_PORT ))->GetValue().ToULong(&port)) { + theApp->BootstrapKad(ip, port); + } else { + wxMessageBox(_("Invalid port to bootstrap"), _("Warning"), wxOK | wxICON_EXCLAMATION, this); + } + } + } else { + wxMessageBox(_("Please fill all fields required"), _("Message"), wxOK | wxICON_INFORMATION, this); + } +} + + +void CKadDlg::OnBnClickedBootstrapKnown(wxCommandEvent& WXUNUSED(evt)) +{ + theApp->StartKad(); +} + + +void CKadDlg::OnBnClickedDisconnectKad(wxCommandEvent& WXUNUSED(evt)) +{ + theApp->StopKad(); +} + + +void CKadDlg::OnBnClickedUpdateNodeList(wxCommandEvent& WXUNUSED(evt)) +{ + if ( wxMessageBox( wxString(_("Are you sure you want to download a new nodes.dat file?\n")) + + _("Doing so will remove your current nodes and restart Kademlia connection.") + , _("Continue?"), wxICON_EXCLAMATION | wxYES_NO, this) == wxYES ) { + wxString strURL = ((wxTextCtrl*)FindWindowById( IDC_NODESLISTURL ))->GetValue(); + + thePrefs::SetKadNodesUrl(strURL); + theApp->UpdateNotesDat(strURL); + } +} +// File_checked_for_headers diff --git a/src/KadDlg.h b/src/KadDlg.h new file mode 100644 index 00000000..5a18bddc --- /dev/null +++ b/src/KadDlg.h @@ -0,0 +1,63 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef KADDLG_H +#define KADDLG_H + +#include // Needed for wxPanel + +class COScopeCtrl; +class wxListEvent; +class wxCommandEvent; +class wxMouseEvent; +typedef struct UpdateInfo GraphUpdateInfo; + + +class CKadDlg : public wxPanel +{ +public: + CKadDlg(wxWindow* pParent); + ~CKadDlg() {}; + + void Init(); + void SetUpdatePeriod(int step); + void SetGraphColors(); + void UpdateGraph(bool bStatsVisible, const GraphUpdateInfo& update); + +private: + COScopeCtrl* m_kad_scope; + + // Event handlers + void OnBnClickedBootstrapClient(wxCommandEvent& evt); + void OnBnClickedBootstrapKnown(wxCommandEvent& evt); + void OnBnClickedDisconnectKad(wxCommandEvent& evt); + void OnBnClickedUpdateNodeList(wxCommandEvent& evt); + void OnFieldsChange(wxCommandEvent& evt); + + DECLARE_EVENT_TABLE() +}; + +#endif // KADDLG_H +// File_checked_for_headers diff --git a/src/KnownFile.cpp b/src/KnownFile.cpp new file mode 100644 index 00000000..d2b3bdb0 --- /dev/null +++ b/src/KnownFile.cpp @@ -0,0 +1,1358 @@ +// +// This file is part of the aMule Project. +// +// Parts of this file are based on work from pan One (http://home-3.tiscali.nl/~meost/pms/) +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "KnownFile.h" // Do_not_auto_remove + + +#include +#include +#include +#include + + +#include + + +#include "MemFile.h" // Needed for CMemFile +#include "updownclient.h" // Needed for CUpDownClient +#include "Packet.h" // Needed for CPacket +#include "Preferences.h" // Needed for CPreferences +#include "KnownFileList.h" // Needed for CKnownFileList +#include "amule.h" // Needed for theApp +#include "PartFile.h" // Needed for SavePartFile +#include "ClientList.h" // Needed for clientlist (buddy support) +#include "Logger.h" +#include "ScopedPtr.h" // Needed for CScopedArray and CScopedPtr +#include "GuiEvents.h" // Needed for Notify_* +#include "SearchFile.h" // Needed for CSearchFile + +#include "CryptoPP_Inc.h" // Needed for MD4 + +#include + +CFileStatistic::CFileStatistic() : + requested(0), + transferred(0), + accepted(0), + alltimerequested(0), + alltimetransferred(0), + alltimeaccepted(0) +{ +} + +#ifndef CLIENT_GUI + +void CFileStatistic::AddRequest(){ + requested++; + alltimerequested++; + theApp->knownfiles->requested++; + theApp->sharedfiles->UpdateItem(fileParent); +} + +void CFileStatistic::AddAccepted(){ + accepted++; + alltimeaccepted++; + theApp->knownfiles->accepted++; + theApp->sharedfiles->UpdateItem(fileParent); +} + +void CFileStatistic::AddTransferred(uint64 bytes){ + transferred += bytes; + alltimetransferred += bytes; + theApp->knownfiles->transferred += bytes; + theApp->sharedfiles->UpdateItem(fileParent); +} + +#endif // CLIENT_GUI + + +/* Abstract File (base class)*/ + +CAbstractFile::CAbstractFile() +: +m_iRating(0), +m_hasComment(false), +m_iUserRating(0), +m_nFileSize(0) +{ +} + + +CAbstractFile::CAbstractFile(const CAbstractFile& other) +: +m_abyFileHash(other.m_abyFileHash), +m_strComment(other.m_strComment), +m_iRating(other.m_iRating), +m_hasComment(other.m_hasComment), +m_iUserRating(other.m_iUserRating), +m_taglist(other.m_taglist), +m_nFileSize(other.m_nFileSize), +m_fileName(other.m_fileName) +{ +/* // TODO: Currently it's not safe to duplicate the entries, but isn't needed either. + CKadEntryPtrList::const_iterator it = other.m_kadNotes.begin(); + for (; it != other.m_kadNotes.end(); ++it) { + m_kadNotes.push_back(new Kademlia::CEntry(**it)); + } +*/ +} + + +void CAbstractFile::SetFileName(const CPath& fileName) +{ + m_fileName = fileName; +} + +uint32 CAbstractFile::GetIntTagValue(uint8 tagname) const +{ + ArrayOfCTag::const_iterator it = m_taglist.begin(); + for (; it != m_taglist.end(); ++it){ + if (((*it).GetNameID() == tagname) && (*it).IsInt()) { + return (*it).GetInt(); + } + } + return 0; +} + +bool CAbstractFile::GetIntTagValue(uint8 tagname, uint32& ruValue) const +{ + ArrayOfCTag::const_iterator it = m_taglist.begin(); + for (; it != m_taglist.end(); ++it){ + if (((*it).GetNameID() == tagname) && (*it).IsInt()){ + ruValue = (*it).GetInt(); + return true; + } + } + return false; +} + +uint32 CAbstractFile::GetIntTagValue(const wxString& tagname) const +{ + ArrayOfCTag::const_iterator it = m_taglist.begin(); + for (; it != m_taglist.end(); ++it){ + if ((*it).IsInt() && ((*it).GetName() == tagname)) { + return (*it).GetInt(); + } + } + return 0; +} + +const wxString& CAbstractFile::GetStrTagValue(uint8 tagname) const +{ + ArrayOfCTag::const_iterator it = m_taglist.begin(); + for (; it != m_taglist.end(); ++it){ + if ((*it).GetNameID() == tagname && (*it).IsStr()) { + return (*it).GetStr(); + } + } + return EmptyString; +} + +const wxString& CAbstractFile::GetStrTagValue(const wxString& tagname) const +{ + ArrayOfCTag::const_iterator it = m_taglist.begin(); + for (; it != m_taglist.end(); ++it){ + if ((*it).IsStr() && ((*it).GetName() == tagname)) { + return (*it).GetStr(); + } + } + return EmptyString; +} + +const CTag *CAbstractFile::GetTag(uint8 tagname, uint8 tagtype) const +{ + ArrayOfCTag::const_iterator it = m_taglist.begin(); + for (; it != m_taglist.end(); ++it){ + if ((*it).GetNameID() == tagname && (*it).GetType() == tagtype) { + return &(*it); + } + } + return NULL; +} + +const CTag *CAbstractFile::GetTag(const wxString& tagname, uint8 tagtype) const +{ + ArrayOfCTag::const_iterator it = m_taglist.begin(); + for (; it != m_taglist.end(); ++it){ + if ((*it).GetType() == tagtype && (*it).GetName() == tagname) { + return &(*it); + } + } + return NULL; +} + +const CTag *CAbstractFile::GetTag(uint8 tagname) const +{ + ArrayOfCTag::const_iterator it = m_taglist.begin(); + for (; it != m_taglist.end(); ++it){ + if ((*it).GetNameID() == tagname) { + return &(*it); + } + } + return NULL; +} + +const CTag *CAbstractFile::GetTag(const wxString& tagname) const +{ + ArrayOfCTag::const_iterator it = m_taglist.begin(); + for (; it != m_taglist.end(); ++it){ + if ((*it).GetName() == tagname) { + return &(*it); + } + } + return NULL; +} + +void CAbstractFile::AddTagUnique(const CTag &rTag) +{ + ArrayOfCTag::iterator it = m_taglist.begin(); + for (; it != m_taglist.end(); ++it) { + if ( ( ((*it).GetNameID() != 0 && + (*it).GetNameID() == rTag.GetNameID()) || + (!(*it).GetName().IsEmpty() && + !rTag.GetName().IsEmpty() && + (*it).GetName() == rTag.GetName()) ) && + (*it).GetType() == rTag.GetType()){ + m_taglist.erase(it); + m_taglist.insert(it, rTag); + return; + } + } + m_taglist.push_back(rTag); +} + +#ifndef CLIENT_GUI +void CAbstractFile::AddNote(Kademlia::CEntry *pEntry) +{ + CKadEntryPtrList::iterator it = m_kadNotes.begin(); + for (; it != m_kadNotes.end(); ++it) { + Kademlia::CEntry* entry = *it; + if(entry->m_iIP == pEntry->m_iIP || + !entry->m_iSourceID.CompareTo(pEntry->m_iSourceID)) { + delete pEntry; + return; + } + } + m_kadNotes.push_front(pEntry); +} +#else +void CAbstractFile::AddNote(Kademlia::CEntry *) +{ +} +#endif + + +/* Known File */ + +CKnownFile::CKnownFile() +{ + Init(); + + m_bAutoUpPriority = thePrefs::GetNewAutoUp(); + m_iUpPriority = ( m_bAutoUpPriority ) ? PR_HIGH : PR_NORMAL; +} + + +//#warning Experimental: Construct a CKnownFile from a CSearchFile +CKnownFile::CKnownFile(const CSearchFile &searchFile) +: +// This will copy the file hash +CAbstractFile(static_cast(searchFile)) +{ + Init(); + + // Use CKnownFile::SetFileName() + SetFileName(searchFile.GetFileName()); + + // Use CKnownFile::SetFileSize() + SetFileSize(searchFile.GetFileSize()); + + m_bAutoUpPriority = thePrefs::GetNewAutoUp(); + m_iUpPriority = ( m_bAutoUpPriority ) ? PR_HIGH : PR_NORMAL; +} + + +void CKnownFile::Init() +{ + m_nCompleteSourcesTime = time(NULL); + m_nCompleteSourcesCount = 0; + m_nCompleteSourcesCountLo = 0; + m_nCompleteSourcesCountHi = 0; + m_bCommentLoaded = false; + m_iPartCount = 0; + m_iED2KPartCount = 0; + m_iED2KPartHashCount = 0; + m_PublishedED2K = false; + kadFileSearchID = 0; + m_lastPublishTimeKadSrc = 0; + m_lastPublishTimeKadNotes = 0; + m_lastBuddyIP = 0; + m_lastDateChanged = 0; + + statistic.fileParent = this; + +#ifndef CLIENT_GUI + m_pAICHHashSet = new CAICHHashSet(this); +#endif +} + + +#ifdef CLIENT_GUI + +CKnownFile::CKnownFile(CEC_SharedFile_Tag *tag) +{ + Init(); + + SetFileName(CPath(tag->FileName())); + m_abyFileHash = tag->ID(); + SetFileSize(tag->SizeFull()); + m_iPartCount = (GetFileSize() + (PARTSIZE - 1)) / PARTSIZE; + m_AvailPartFrequency.insert(m_AvailPartFrequency.end(), m_iPartCount, 0); + m_iUpPriority = tag->Prio(); + if ( m_iUpPriority >= 10 ) { + m_iUpPriority-= 10; + m_bAutoUpPriority = true; + } else { + m_bAutoUpPriority = false; + } + + m_AICHMasterHash = tag->GetAICHHash(); +} + +CKnownFile::~CKnownFile() +{ +} + +#else // ! CLIENT_GUI + +CKnownFile::~CKnownFile() +{ + SourceSet::iterator it = m_ClientUploadList.begin(); + for ( ; it != m_ClientUploadList.end(); ++it ) { + (*it)->ClearUploadFileID(); + } + + delete m_pAICHHashSet; +} + +void CKnownFile::AddUploadingClient(CUpDownClient* client) +{ + m_ClientUploadList.insert(client); + + UpdateAutoUpPriority(); +} + + +void CKnownFile::RemoveUploadingClient(CUpDownClient* client) +{ + if (m_ClientUploadList.erase(client)) { + UpdateAutoUpPriority(); + } +} + + +void CKnownFile::SetFilePath(const CPath& filePath) +{ + m_filePath = filePath; +} + + +void CKnownFile::SetFileSize(uint64 nFileSize) +{ + CAbstractFile::SetFileSize(nFileSize); + m_pAICHHashSet->SetFileSize(nFileSize); + + // Examples of parthashs, hashsets and filehashs for different filesizes + // according the ed2k protocol + //---------------------------------------------------------------------- + // + //File size: 3 bytes + //File hash: 2D55E87D0E21F49B9AD25F98531F3724 + //Nr. hashs: 0 + // + // + //File size: 1*PARTSIZE + //File hash: A72CA8DF7F07154E217C236C89C17619 + //Nr. hashs: 2 + //Hash[ 0]: 4891ED2E5C9C49F442145A3A5F608299 + //Hash[ 1]: 31D6CFE0D16AE931B73C59D7E0C089C0 *special part hash* + // + // + //File size: 1*PARTSIZE + 1 byte + //File hash: 2F620AE9D462CBB6A59FE8401D2B3D23 + //Nr. hashs: 2 + //Hash[ 0]: 121795F0BEDE02DDC7C5426D0995F53F + //Hash[ 1]: C329E527945B8FE75B3C5E8826755747 + // + // + //File size: 2*PARTSIZE + //File hash: A54C5E562D5E03CA7D77961EB9A745A4 + //Nr. hashs: 3 + //Hash[ 0]: B3F5CE2A06BF403BFB9BFFF68BDDC4D9 + //Hash[ 1]: 509AA30C9EA8FC136B1159DF2F35B8A9 + //Hash[ 2]: 31D6CFE0D16AE931B73C59D7E0C089C0 *special part hash* + // + // + //File size: 3*PARTSIZE + //File hash: 5E249B96F9A46A18FC2489B005BF2667 + //Nr. hashs: 4 + //Hash[ 0]: 5319896A2ECAD43BF17E2E3575278E72 + //Hash[ 1]: D86EF157D5E49C5ED502EDC15BB5F82B + //Hash[ 2]: 10F2D5B1FCB95C0840519C58D708480F + //Hash[ 3]: 31D6CFE0D16AE931B73C59D7E0C089C0 *special part hash* + // + // + //File size: 3*PARTSIZE + 1 byte + //File hash: 797ED552F34380CAFF8C958207E40355 + //Nr. hashs: 4 + //Hash[ 0]: FC7FD02CCD6987DCF1421F4C0AF94FB8 + //Hash[ 1]: 2FE466AF8A7C06DA3365317B75A5ACFE + //Hash[ 2]: 873D3BF52629F7C1527C6E8E473C1C30 + //Hash[ 3]: BCE50BEE7877BB07BB6FDA56BFE142FB + // + + // File size Data parts ED2K parts ED2K part hashs + // --------------------------------------------------------------- + // 1..PARTSIZE-1 1 1 0(!) + // PARTSIZE 1 2(!) 2(!) + // PARTSIZE+1 2 2 2 + // PARTSIZE*2 2 3(!) 3(!) + // PARTSIZE*2+1 3 3 3 + + if (nFileSize == 0){ + //wxASSERT(0); // Kry - Why commented out by lemonfan? it can never be 0 + m_iPartCount = 0; + m_iED2KPartCount = 0; + m_iED2KPartHashCount = 0; + return; + } + + // nr. of data parts + m_iPartCount = (nFileSize + (PARTSIZE - 1)) / PARTSIZE; + + // nr. of parts to be used with OP_FILESTATUS + m_iED2KPartCount = nFileSize / PARTSIZE + 1; + + // nr. of parts to be used with OP_HASHSETANSWER + m_iED2KPartHashCount = nFileSize / PARTSIZE; + if (m_iED2KPartHashCount != 0) { + m_iED2KPartHashCount += 1; + } +} + + +// needed for memfiles. its probably better to switch everything to CFile... +bool CKnownFile::LoadHashsetFromFile(const CFileDataIO* file, bool checkhash) +{ + CMD4Hash checkid = file->ReadHash(); + + uint16 parts = file->ReadUInt16(); + for (uint16 i = 0; i < parts; ++i){ + CMD4Hash cur_hash = file->ReadHash(); + m_hashlist.push_back(cur_hash); + } + + // SLUGFILLER: SafeHash - always check for valid m_hashlist + if (!checkhash){ + m_abyFileHash = checkid; + if (parts <= 1) { // nothing to check + return true; + } + } else { + if ( m_abyFileHash != checkid ) { + return false; // wrong file? + } else { + if (parts != GetED2KPartHashCount()) { + return false; + } + } + } + // SLUGFILLER: SafeHash + + // trust noone ;-) + // lol, useless comment but made me lmao + // wtf you guys are weird. + + if (!m_hashlist.empty()) { + CreateHashFromHashlist(m_hashlist, &checkid); + } + + if ( m_abyFileHash == checkid ) { + return true; + } else { + m_hashlist.clear(); + return false; + } +} + + +bool CKnownFile::LoadTagsFromFile(const CFileDataIO* file) +{ + uint32 tagcount = file->ReadUInt32(); + for (uint32 j = 0; j != tagcount; ++j) { + CTag newtag(*file, true); + switch(newtag.GetNameID()){ + case FT_FILENAME: + if (GetFileName().IsOk()) { + // Unlike eMule, we actually prefer the second + // filename tag, since we use it to specify the + // 'universial' filename (see CPath::ToUniv). + CPath path = CPath::FromUniv(newtag.GetStr()); + + // May be invalid, if from older versions where + // unicoded filenames be saved as empty-strings. + if (path.IsOk()) { + SetFileName(path); + } + } else { + SetFileName(CPath(newtag.GetStr())); + } + break; + + case FT_FILESIZE: + SetFileSize(newtag.GetInt()); + m_AvailPartFrequency.clear(); + m_AvailPartFrequency.insert( + m_AvailPartFrequency.begin(), + GetPartCount(), 0); + break; + + case FT_ATTRANSFERRED: + statistic.alltimetransferred += newtag.GetInt(); + break; + + case FT_ATTRANSFERREDHI: + statistic.alltimetransferred = + (((uint64)newtag.GetInt()) << 32) + + ((uint64)statistic.alltimetransferred); + break; + + case FT_ATREQUESTED: + statistic.alltimerequested = newtag.GetInt(); + break; + + case FT_ATACCEPTED: + statistic.alltimeaccepted = newtag.GetInt(); + break; + + case FT_ULPRIORITY: + m_iUpPriority = newtag.GetInt(); + if( m_iUpPriority == PR_AUTO ){ + m_iUpPriority = PR_HIGH; + m_bAutoUpPriority = true; + } else { + if ( m_iUpPriority != PR_VERYLOW && + m_iUpPriority != PR_LOW && + m_iUpPriority != PR_NORMAL && + m_iUpPriority != PR_HIGH && + m_iUpPriority != PR_VERYHIGH && + m_iUpPriority != PR_POWERSHARE) { + m_iUpPriority = PR_NORMAL; + } + + m_bAutoUpPriority = false; + } + break; + + case FT_PERMISSIONS: + // Ignore it, it's not used anymore. + break; + + case FT_AICH_HASH: { + CAICHHash hash; + bool hashSizeOk = + hash.DecodeBase32(newtag.GetStr()) == CAICHHash::GetHashSize(); + wxASSERT(hashSizeOk); + if (hashSizeOk) { + m_pAICHHashSet->SetMasterHash(hash, AICH_HASHSETCOMPLETE); + } + break; + } + + case FT_KADLASTPUBLISHSRC: + SetLastPublishTimeKadSrc( newtag.GetInt(), 0 ); + + if(GetLastPublishTimeKadSrc() > (uint32)time(NULL)+KADEMLIAREPUBLISHTIMES) { + //There may be a posibility of an older client that saved a random number here.. This will check for that.. + SetLastPublishTimeKadSrc(0, 0); + } + break; + + case FT_KADLASTPUBLISHNOTES: + SetLastPublishTimeKadNotes( newtag.GetInt() ); + break; + + case FT_KADLASTPUBLISHKEY: + // Just purge it + wxASSERT( newtag.IsInt() ); + break; + + default: + // Store them here and write them back on saving. + m_taglist.push_back(newtag); + } + } + + return true; +} + + +bool CKnownFile::LoadDateFromFile(const CFileDataIO* file) +{ + m_lastDateChanged = file->ReadUInt32(); + + return true; +} + + +bool CKnownFile::LoadFromFile(const CFileDataIO* file) +{ + // SLUGFILLER: SafeHash - load first, verify later + bool ret1 = LoadDateFromFile(file); + bool ret2 = LoadHashsetFromFile(file,false); + bool ret3 = LoadTagsFromFile(file); + UpdatePartsInfo(); + // Final hash-count verification, needs to be done after the tags are loaded. + return ret1 && ret2 && ret3 && GetED2KPartHashCount()==GetHashCount(); + // SLUGFILLER: SafeHash +} + + +bool CKnownFile::WriteToFile(CFileDataIO* file) +{ + wxCHECK(!IsPartFile(), false); + + // date + file->WriteUInt32(m_lastDateChanged); + // hashset + file->WriteHash(m_abyFileHash); + + uint16 parts = m_hashlist.size(); + file->WriteUInt16(parts); + + for (int i = 0; i < parts; ++i) + file->WriteHash(m_hashlist[i]); + + //tags + const int iFixedTags = 8; + uint32 tagcount = iFixedTags; + if (HasProperAICHHashSet()) { + tagcount++; + } + // Float meta tags are currently not written. All older eMule versions < 0.28a have + // a bug in the meta tag reading+writing code. To achive maximum backward + // compatibility for met files with older eMule versions we just don't write float + // tags. This is OK, because we (eMule) do not use float tags. The only float tags + // we may have to handle is the '# Sent' tag from the Hybrid, which is pretty + // useless but may be received from us via the servers. + // + // The code for writing the float tags SHOULD BE ENABLED in SOME MONTHS (after most + // people are using the newer eMule versions which do not write broken float tags). + for (size_t j = 0; j < m_taglist.size(); ++j){ + if (m_taglist[j].IsInt() || m_taglist[j].IsStr()) { + ++tagcount; + } + } + + if (m_lastPublishTimeKadSrc) { + ++tagcount; + } + + if (m_lastPublishTimeKadNotes){ + ++tagcount; + } + + // standard tags + + file->WriteUInt32(tagcount); + + // We still save the unicoded filename, for backwards + // compatibility with pre-2.2 and other clients. + CTagString nametag_unicode(FT_FILENAME, GetFileName().GetRaw()); + // We write it with BOM to kep eMule compatibility + nametag_unicode.WriteTagToFile(file,utf8strOptBOM); + + // The non-unicoded filename is written in an 'universial' + // format, which allows us to identify files, even if the + // system locale changes. + CTagString nametag(FT_FILENAME, CPath::ToUniv(GetFileName())); + nametag.WriteTagToFile(file); + + CTagIntSized sizetag(FT_FILESIZE, GetFileSize(), IsLargeFile() ? 64 : 32); + sizetag.WriteTagToFile(file); + + // statistic + uint32 tran; + tran=statistic.alltimetransferred & 0xFFFFFFFF; + CTagInt32 attag1(FT_ATTRANSFERRED, tran); + attag1.WriteTagToFile(file); + + tran=statistic.alltimetransferred>>32; + CTagInt32 attag4(FT_ATTRANSFERREDHI, tran); + attag4.WriteTagToFile(file); + + CTagInt32 attag2(FT_ATREQUESTED, statistic.GetAllTimeRequests()); + attag2.WriteTagToFile(file); + + CTagInt32 attag3(FT_ATACCEPTED, statistic.GetAllTimeAccepts()); + attag3.WriteTagToFile(file); + + // priority N permission + CTagInt32 priotag(FT_ULPRIORITY, IsAutoUpPriority() ? PR_AUTO : m_iUpPriority); + priotag.WriteTagToFile(file); + + //AICH Filehash + if (HasProperAICHHashSet()) { + CTagString aichtag(FT_AICH_HASH, m_pAICHHashSet->GetMasterHash().GetString()); + aichtag.WriteTagToFile(file); + } + + // Kad sources + if (m_lastPublishTimeKadSrc){ + CTagInt32 kadLastPubSrc(FT_KADLASTPUBLISHSRC, m_lastPublishTimeKadSrc); + kadLastPubSrc.WriteTagToFile(file); + } + + // Kad notes + if (m_lastPublishTimeKadNotes){ + CTagInt32 kadLastPubNotes(FT_KADLASTPUBLISHNOTES, m_lastPublishTimeKadNotes); + kadLastPubNotes.WriteTagToFile(file); + } + + //other tags + for (size_t j = 0; j < m_taglist.size(); ++j){ + if (m_taglist[j].IsInt() || m_taglist[j].IsStr()) { + m_taglist[j].WriteTagToFile(file); + } + } + return true; +} + + +void CKnownFile::CreateHashFromHashlist(const ArrayOfCMD4Hash& hashes, CMD4Hash* Output) +{ + wxCHECK_RET(hashes.size(), wxT("No input to hash from in CreateHashFromHashlist")); + + std::vector buffer(hashes.size() * MD4HASH_LENGTH); + std::vector::iterator it = buffer.begin(); + + for (size_t i = 0; i < hashes.size(); ++i) { + it = STLCopy_n(hashes[i].GetHash(), MD4HASH_LENGTH, it); + } + + CreateHashFromInput(&buffer[0], buffer.size(), Output, NULL); +} + + +void CKnownFile::CreateHashFromFile(CFileDataIO* file, uint32 Length, CMD4Hash* Output, CAICHHashTree* pShaHashOut) +{ + wxCHECK_RET(file && Length, wxT("No input to hash from in CreateHashFromFile")); + + std::vector buffer(Length); + file->Read(&buffer[0], Length); + + CreateHashFromInput(&buffer[0], Length, Output, pShaHashOut); +} + + +void CKnownFile::CreateHashFromInput(const byte* input, uint32 Length, CMD4Hash* Output, CAICHHashTree* pShaHashOut ) +{ + wxASSERT_MSG(Output || pShaHashOut, wxT("Nothing to do in CreateHashFromInput")); + wxCHECK_RET(input, wxT("No input to hash from in CreateHashFromInput")); + wxASSERT(Length <= PARTSIZE); // We never hash more than one PARTSIZE + + CMemFile data(input, Length); + + uint32 Required = Length; + byte X[64*128]; + + uint32 posCurrentEMBlock = 0; + uint32 nIACHPos = 0; + CScopedPtr pHashAlg(CAICHHashSet::GetNewHashAlgo()); + + // This is all AICH. + while (Required >= 64) { + uint32 len = Required / 64; + if (len > sizeof(X)/(64 * sizeof(X[0]))) { + len = sizeof(X)/(64 * sizeof(X[0])); + } + + data.Read(&X, len * 64); + + // SHA hash needs 180KB blocks + if (pShaHashOut) { + if (nIACHPos + len*64 >= EMBLOCKSIZE) { + uint32 nToComplete = EMBLOCKSIZE - nIACHPos; + pHashAlg->Add(X, nToComplete); + wxASSERT( nIACHPos + nToComplete == EMBLOCKSIZE ); + pShaHashOut->SetBlockHash(EMBLOCKSIZE, posCurrentEMBlock, pHashAlg.get()); + posCurrentEMBlock += EMBLOCKSIZE; + pHashAlg->Reset(); + pHashAlg->Add(X+nToComplete,(len*64) - nToComplete); + nIACHPos = (len*64) - nToComplete; + } + else{ + pHashAlg->Add(X, len*64); + nIACHPos += len*64; + } + } + + Required -= len*64; + } + // bytes to read + Required = Length % 64; + if (Required != 0){ + data.Read(&X,Required); + + if (pShaHashOut != NULL){ + if (nIACHPos + Required >= EMBLOCKSIZE){ + uint32 nToComplete = EMBLOCKSIZE - nIACHPos; + pHashAlg->Add(X, nToComplete); + wxASSERT( nIACHPos + nToComplete == EMBLOCKSIZE ); + pShaHashOut->SetBlockHash(EMBLOCKSIZE, posCurrentEMBlock, pHashAlg.get()); + posCurrentEMBlock += EMBLOCKSIZE; + pHashAlg->Reset(); + pHashAlg->Add(X+nToComplete, Required - nToComplete); + nIACHPos = Required - nToComplete; + } + else{ + pHashAlg->Add(X, Required); + nIACHPos += Required; + } + } + } + if (pShaHashOut != NULL){ + if(nIACHPos > 0){ + pShaHashOut->SetBlockHash(nIACHPos, posCurrentEMBlock, pHashAlg.get()); + posCurrentEMBlock += nIACHPos; + } + wxASSERT( posCurrentEMBlock == Length ); + wxCHECK2( pShaHashOut->ReCalculateHash(pHashAlg.get(), false), ); + } + + if (Output != NULL){ + #ifdef __WEAK_CRYPTO__ + CryptoPP::Weak::MD4 md4_hasher; + #else + CryptoPP::MD4 md4_hasher; + #endif + md4_hasher.CalculateDigest(Output->GetHash(), input, Length); + } +} + + +const CMD4Hash& CKnownFile::GetPartHash(uint16 part) const { + wxASSERT( part < m_hashlist.size() ); + + return m_hashlist[part]; +} + +CPacket* CKnownFile::CreateSrcInfoPacket(const CUpDownClient* forClient, uint8 byRequestedVersion, uint16 nRequestedOptions) +{ + // Kad reviewed + + if (m_ClientUploadList.empty()) { + return NULL; + } + + if ((((CKnownFile*)forClient->GetRequestFile() != this) + && ((CKnownFile*)forClient->GetUploadFile() != this)) || forClient->GetUploadFileID() != GetFileHash()) { + wxString file1 = _("Unknown"); + if (forClient->GetRequestFile() && forClient->GetRequestFile()->GetFileName().IsOk()) { + file1 = forClient->GetRequestFile()->GetFileName().GetPrintable(); + } else if (forClient->GetUploadFile() && forClient->GetUploadFile()->GetFileName().IsOk()) { + file1 = forClient->GetUploadFile()->GetFileName().GetPrintable(); + } + wxString file2 = _("Unknown"); + if (GetFileName().IsOk()) { + file2 = GetFileName().GetPrintable(); + } + AddDebugLogLineM(false, logKnownFiles, wxT("File missmatch on source packet (K) Sending: ") + file1 + wxT(" From: ") + file2); + return NULL; + } + + const BitVector& rcvstatus = forClient->GetUpPartStatus(); + bool SupportsUploadChunksState = !rcvstatus.empty(); + //wxASSERT(rcvstatus.size() == GetPartCount()); // Obviously! + if (rcvstatus.size() != GetPartCount()) { + // Yuck. Same file but different part count? Seriously fucked up. + AddDebugLogLineM(false, logKnownFiles, wxString::Format(wxT("Impossible situation: different partcounts for the same known file: %i (client) and %i (file)"),rcvstatus.size(),GetPartCount())); + return NULL; + } + + CMemFile data(1024); + + uint8 byUsedVersion; + bool bIsSX2Packet; + if (forClient->SupportsSourceExchange2() && byRequestedVersion > 0){ + // the client uses SourceExchange2 and requested the highest version he knows + // and we send the highest version we know, but of course not higher than his request + byUsedVersion = std::min(byRequestedVersion, (uint8)SOURCEEXCHANGE2_VERSION); + bIsSX2Packet = true; + data.WriteUInt8(byUsedVersion); + + // we don't support any special SX2 options yet, reserved for later use + if (nRequestedOptions != 0) { + AddDebugLogLineM(false, logKnownFiles, CFormat(wxT("Client requested unknown options for SourceExchange2: %u")) % nRequestedOptions); + } + } else { + byUsedVersion = forClient->GetSourceExchange1Version(); + bIsSX2Packet = false; + if (forClient->SupportsSourceExchange2()) { + AddDebugLogLineM(false, logKnownFiles, wxT("Client which announced to support SX2 sent SX1 packet instead")); + } + } + + uint16 nCount = 0; + + data.WriteHash(forClient->GetUploadFileID()); + data.WriteUInt16(nCount); + uint32 cDbgNoSrc = 0; + + SourceSet::iterator it = m_ClientUploadList.begin(); + for ( ; it != m_ClientUploadList.end(); it++ ) { + const CUpDownClient *cur_src = *it; + + if ( cur_src->HasLowID() || + cur_src == forClient || + !( cur_src->GetUploadState() == US_UPLOADING || + cur_src->GetUploadState() == US_ONUPLOADQUEUE)) { + continue; + } + + bool bNeeded = false; + + if ( SupportsUploadChunksState ) { + const BitVector& srcstatus = cur_src->GetUpPartStatus(); + if ( !srcstatus.empty() ) { + //wxASSERT(srcstatus.size() == GetPartCount()); // Obviously! + if (srcstatus.size() != GetPartCount()) { + continue; + } + if ( cur_src->GetUpPartCount() == forClient->GetUpPartCount() ) { + for (int x = 0; x < GetPartCount(); x++ ) { + if ( srcstatus.at(x) && !rcvstatus.at(x) ) { + // We know the receiving client needs + // a chunk from this client. + bNeeded = true; + break; + } + } + } + } else { + cDbgNoSrc++; + // This client doesn't support upload chunk status. + // So just send it and hope for the best. + bNeeded = true; + } + } else { + // remote client does not support upload chunk status, + // search sources which have at least one complete part + // we could even sort the list of sources by available + // chunks to return as much sources as possible which + // have the most available chunks. but this could be + // a noticeable performance problem. + const BitVector& srcstatus = cur_src->GetUpPartStatus(); + if ( !srcstatus.empty() ) { + //wxASSERT(srcstatus.size() == GetPartCount()); + if (srcstatus.size() != GetPartCount()) { + continue; + } + for (int x = 0; x < GetPartCount(); x++ ) { + if ( srcstatus.at(x) ) { + // this client has at least one chunk + bNeeded = true; + break; + } + } + } else { + // This client doesn't support upload chunk status. + // So just send it and hope for the best. + bNeeded = true; + } + } + + if ( bNeeded ) { + nCount++; + uint32 dwID; + if(byUsedVersion >= 3) { + dwID = cur_src->GetUserIDHybrid(); + } else { + dwID = cur_src->GetIP(); + } + data.WriteUInt32(dwID); + data.WriteUInt16(cur_src->GetUserPort()); + data.WriteUInt32(cur_src->GetServerIP()); + data.WriteUInt16(cur_src->GetServerPort()); + + if (byUsedVersion >= 2) { + data.WriteHash(cur_src->GetUserHash()); + } + + if (byUsedVersion >= 4){ + // CryptSettings - SourceExchange V4 + // 5 Reserved (!) + // 1 CryptLayer Required + // 1 CryptLayer Requested + // 1 CryptLayer Supported + const uint8 uSupportsCryptLayer = cur_src->SupportsCryptLayer() ? 1 : 0; + const uint8 uRequestsCryptLayer = cur_src->RequestsCryptLayer() ? 1 : 0; + const uint8 uRequiresCryptLayer = cur_src->RequiresCryptLayer() ? 1 : 0; + const uint8 byCryptOptions = (uRequiresCryptLayer << 2) | (uRequestsCryptLayer << 1) | (uSupportsCryptLayer << 0); + data.WriteUInt8(byCryptOptions); + } + + if (nCount > 500) { + break; + } + } + } + + if (!nCount) { + return 0; + } + + data.Seek(bIsSX2Packet ? 17 : 16, wxFromStart); + data.WriteUInt16(nCount); + + CPacket* result = new CPacket(data, OP_EMULEPROT, bIsSX2Packet ? OP_ANSWERSOURCES2 : OP_ANSWERSOURCES); + + if ( result->GetPacketSize() > 354 ) { + result->PackPacket(); + } + + return result; +} + + +// Updates priority of file if autopriority is activated +void CKnownFile::UpdateAutoUpPriority() +{ + if (IsAutoUpPriority()) { + uint32 queued = GetQueuedCount(); + uint8 priority = PR_NORMAL; + + if (queued > 20) { + priority = PR_LOW; + } else if (queued > 1) { + priority = PR_NORMAL; + } else { + priority = PR_HIGH; + } + + if (GetUpPriority() != priority) { + SetUpPriority(priority, false); + Notify_SharedFilesUpdateItem(this); + } + } +} + +void CKnownFile::SetFileComment(const wxString& strNewComment) +{ + if (m_strComment != strNewComment) { + SetLastPublishTimeKadNotes(0); + wxString strCfgPath = wxT("/") + m_abyFileHash.Encode() + wxT("/"); + + wxConfigBase* cfg = wxConfigBase::Get(); + cfg->Write( strCfgPath + wxT("Comment"), strNewComment); + + m_strComment = strNewComment; + + SourceSet::iterator it = m_ClientUploadList.begin(); + for ( ; it != m_ClientUploadList.end(); it++ ) { + (*it)->SetCommentDirty(); + } + } +} + + +// For File rate +void CKnownFile::SetFileRating(int8 iNewRating) +{ + if (m_iRating != iNewRating) { + SetLastPublishTimeKadNotes(0); + wxString strCfgPath = wxT("/") + m_abyFileHash.Encode() + wxT("/"); + wxConfigBase* cfg = wxConfigBase::Get(); + cfg->Write( strCfgPath + wxT("Rate"), iNewRating); + m_iRating = iNewRating; + + SourceSet::iterator it = m_ClientUploadList.begin(); + for ( ; it != m_ClientUploadList.end(); it++ ) { + (*it)->SetCommentDirty(); + } + } +} + + +void CKnownFile::SetUpPriority(uint8 iNewUpPriority, bool m_bsave){ + m_iUpPriority = iNewUpPriority; + if( IsPartFile() && m_bsave ) { + ((CPartFile*)this)->SavePartFile(); + } +} + +void CKnownFile::SetPublishedED2K(bool val){ + m_PublishedED2K = val; + Notify_SharedFilesUpdateItem(this); +} + +bool CKnownFile::PublishNotes() +{ + if(m_lastPublishTimeKadNotes > (uint32)time(NULL)) { + return false; + } + + if(!GetFileComment().IsEmpty()) { + m_lastPublishTimeKadNotes = (uint32)time(NULL)+KADEMLIAREPUBLISHTIMEN; + return true; + } + + if(GetFileRating() != 0) { + m_lastPublishTimeKadNotes = (uint32)time(NULL)+KADEMLIAREPUBLISHTIMEN; + return true; + } + + return false; +} + +bool CKnownFile::PublishSrc() +{ + uint32 lastBuddyIP = 0; + + if( theApp->IsFirewalled() ) { + CUpDownClient* buddy = theApp->clientlist->GetBuddy(); + if( buddy ) { + lastBuddyIP = theApp->clientlist->GetBuddy()->GetIP(); + if( lastBuddyIP != m_lastBuddyIP ) { + SetLastPublishTimeKadSrc( (uint32)time(NULL)+KADEMLIAREPUBLISHTIMES, lastBuddyIP ); + return true; + } + } else { + return false; + } + } + + if(m_lastPublishTimeKadSrc > (uint32)time(NULL)) { + return false; + } + + SetLastPublishTimeKadSrc((uint32)time(NULL)+KADEMLIAREPUBLISHTIMES,lastBuddyIP); + return true; + +} + +void CKnownFile::UpdatePartsInfo() +{ + // Cache part count + uint16 partcount = GetPartCount(); + bool flag = (time(NULL) - m_nCompleteSourcesTime > 0); + + // Ensure the frequency-list is ready + if ( m_AvailPartFrequency.size() != GetPartCount() ) { + m_AvailPartFrequency.clear(); + m_AvailPartFrequency.insert(m_AvailPartFrequency.begin(), GetPartCount(), 0); + } + + if (flag) { + ArrayOfUInts16 count; + count.reserve(m_ClientUploadList.size()); + + SourceSet::iterator it = m_ClientUploadList.begin(); + for ( ; it != m_ClientUploadList.end(); it++ ) { + if ( !(*it)->GetUpPartStatus().empty() && (*it)->GetUpPartCount() == partcount ) { + count.push_back((*it)->GetUpCompleteSourcesCount()); + } + } + + m_nCompleteSourcesCount = m_nCompleteSourcesCountLo = m_nCompleteSourcesCountHi = 0; + + if( partcount > 0) { + m_nCompleteSourcesCount = m_AvailPartFrequency[0]; + } + for (uint16 i = 1; i < partcount; ++i) { + if( m_nCompleteSourcesCount > m_AvailPartFrequency[i]) { + m_nCompleteSourcesCount = m_AvailPartFrequency[i]; + } + } + count.push_back(m_nCompleteSourcesCount); + + int32 n = count.size(); + if (n > 0) { + std::sort(count.begin(), count.end(), std::less()); + + // calculate range + int i = n >> 1; // (n / 2) + int j = (n * 3) >> 2; // (n * 3) / 4 + int k = (n * 7) >> 3; // (n * 7) / 8 + + // For complete files, trust the people your uploading to more... + + // For low guess and normal guess count + // - If we see more sources then the guessed low and + // normal, use what we see. + // - If we see less sources then the guessed low, + // adjust network accounts for 100%, we account for + // 0% with what we see and make sure we are still + // above the normal. + // For high guess + // Adjust 100% network and 0% what we see. + if (n < 20) { + if ( count[i] < m_nCompleteSourcesCount ) { + m_nCompleteSourcesCountLo = m_nCompleteSourcesCount; + } else { + m_nCompleteSourcesCountLo = count[i]; + } + m_nCompleteSourcesCount= m_nCompleteSourcesCountLo; + m_nCompleteSourcesCountHi = count[j]; + if( m_nCompleteSourcesCountHi < m_nCompleteSourcesCount ) { + m_nCompleteSourcesCountHi = m_nCompleteSourcesCount; + } + } else { + // Many sources.. + // For low guess + // Use what we see. + // For normal guess + // Adjust network accounts for 100%, we account for + // 0% with what we see and make sure we are still above the low. + // For high guess + // Adjust network accounts for 100%, we account for 0% + // with what we see and make sure we are still above the normal. + + m_nCompleteSourcesCountLo = m_nCompleteSourcesCount; + m_nCompleteSourcesCount = count[j]; + if( m_nCompleteSourcesCount < m_nCompleteSourcesCountLo ) { + m_nCompleteSourcesCount = m_nCompleteSourcesCountLo; + } + m_nCompleteSourcesCountHi= count[k]; + if( m_nCompleteSourcesCountHi < m_nCompleteSourcesCount ) { + m_nCompleteSourcesCountHi = m_nCompleteSourcesCount; + } + } + } + m_nCompleteSourcesTime = time(NULL) + (60); + } + + Notify_SharedFilesUpdateItem(this); +} + + +void CKnownFile::UpdateUpPartsFrequency( CUpDownClient* client, bool increment ) +{ + if ( m_AvailPartFrequency.size() != GetPartCount() ) { + m_AvailPartFrequency.clear(); + m_AvailPartFrequency.insert(m_AvailPartFrequency.begin(), GetPartCount(), 0); + if ( !increment ) { + return; + } + } + + const BitVector& freq = client->GetUpPartStatus(); + unsigned int size = freq.size(); + if ( size != m_AvailPartFrequency.size() ) { + return; + } + + if ( increment ) { + for ( unsigned int i = 0; i < size; ++i ) { + if ( freq[i] ) { + m_AvailPartFrequency[i]++; + } + } + } else { + for ( unsigned int i = 0; i < size; ++i ) { + if ( freq[i] ) { + m_AvailPartFrequency[i]--; + } + } + } +} + +void CKnownFile::ClearPriority() { + if ( !m_bAutoUpPriority ) return; + m_iUpPriority = ( m_bAutoUpPriority ) ? PR_HIGH : PR_NORMAL; + UpdateAutoUpPriority(); +} + +void CKnownFile::SetFileName(const CPath& filename) +{ + CAbstractFile::SetFileName(filename); +#ifndef CLIENT_GUI + wordlist.clear(); + Kademlia::CSearchManager::GetWords(GetFileName().GetPrintable(), &wordlist); +#endif +} + +#endif // CLIENT_GUI + +//For File Comment // +void CKnownFile::LoadComment() +{ + #ifndef CLIENT_GUI + wxString strCfgPath = wxT("/") + m_abyFileHash.Encode() + wxT("/"); + + wxConfigBase* cfg = wxConfigBase::Get(); + + m_strComment = cfg->Read( strCfgPath + wxT("Comment"), wxEmptyString); + m_iRating = cfg->Read( strCfgPath + wxT("Rate"), 0l); + m_bCommentLoaded = true; + + #else + m_strComment = wxT("Comments are not allowed on remote gui yet"); + m_bCommentLoaded = true; + m_iRating =0; + #endif + +} + + +wxString CKnownFile::GetAICHMasterHash() const +{ +#ifdef CLIENT_GUI + return m_AICHMasterHash; +#else + if (HasProperAICHHashSet()) { + return m_pAICHHashSet->GetMasterHash().GetString(); + } + + return wxEmptyString; +#endif +} + + +bool CKnownFile::HasProperAICHHashSet() const +{ +#ifdef CLIENT_GUI + return m_AICHMasterHash.Length(); +#else + return m_pAICHHashSet->HasValidMasterHash() && + (m_pAICHHashSet->GetStatus() == AICH_HASHSETCOMPLETE || + m_pAICHHashSet->GetStatus() == AICH_VERIFIED); +#endif +} + +// File_checked_for_headers diff --git a/src/KnownFile.h b/src/KnownFile.h new file mode 100644 index 00000000..51805149 --- /dev/null +++ b/src/KnownFile.h @@ -0,0 +1,356 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#ifndef KNOWNFILE_H +#define KNOWNFILE_H + + +#include "MD4Hash.h" +#include "SHAHashSet.h" + +#include +#include + +#include "kademlia/kademlia/Indexed.h" + + +#ifdef CLIENT_GUI +#include +#endif + + +#define PS_READY 0 +#define PS_EMPTY 1 +#define PS_WAITINGFORHASH 2 +#define PS_HASHING 3 +#define PS_ERROR 4 +#define PS_INSUFFICIENT 5 +#define PS_UNKNOWN 6 +#define PS_PAUSED 7 +#define PS_COMPLETING 8 +#define PS_COMPLETE 9 + + +#define PR_VERYLOW 4 // I Had to change this because + // it didn't save negative number + // correctly.. Had to modify the + // sort function for this change.. +#define PR_LOW 0 //* +#define PR_NORMAL 1 // Don't change this - needed for + // edonkey clients and server! +#define PR_HIGH 2 //* +#define PR_VERYHIGH 3 +#define PR_AUTO 5 +#define PR_POWERSHARE 6 //added for powershare (deltaHF) + + +class CUpDownClient; +class CFileDataIO; +class CPacket; +class CTag; + + +namespace Kademlia +{ + class CEntry; +} + + +typedef vector ArrayOfCMD4Hash; + + +typedef vector ArrayOfCTag; + + +class CFileStatistic +{ + friend class CKnownFile; + friend class CSharedFilesRem; + +public: + CFileStatistic(); + void AddRequest(); + void AddAccepted(); + void AddTransferred(uint64 bytes); + uint16 GetRequests() const {return requested;} + uint16 GetAccepts() const {return accepted;} + uint64 GetTransferred() const {return transferred;} + uint32 GetAllTimeRequests() const {return alltimerequested;} + void SetAllTimeRequests(uint32 new_value) { alltimerequested = new_value; }; + uint32 GetAllTimeAccepts() const {return alltimeaccepted;} + void SetAllTimeAccepts(uint32 new_value) { alltimeaccepted = new_value; }; + uint64 GetAllTimeTransferred() const {return alltimetransferred;} + void SetAllTimeTransferred(uint64 new_value) { alltimetransferred = new_value; }; + CKnownFile* fileParent; + +private: + uint16 requested; + uint64 transferred; + uint16 accepted; + uint32 alltimerequested; + uint64 alltimetransferred; + uint32 alltimeaccepted; +}; + +/* + CPartFile + / + CKnownFile + / +CAbstractFile + \ + CSearchFile +*/ +class CAbstractFile +{ +public: + CAbstractFile(); + explicit CAbstractFile(const CAbstractFile& other); + virtual ~CAbstractFile() {} + + const CPath& GetFileName() const { return m_fileName; } + const CMD4Hash& GetFileHash() const { return m_abyFileHash; } + + uint64 GetFileSize() const { return m_nFileSize;} + bool IsLargeFile() const { return m_nFileSize > (uint64)OLD_MAX_FILE_SIZE; } + + virtual void SetFileSize(uint64 nFileSize) { m_nFileSize = nFileSize; } + virtual void SetFileName(const CPath& filename); + + /* Tags and Notes handling */ + uint32 GetIntTagValue(uint8 tagname) const; + uint32 GetIntTagValue(const wxString& tagname) const; + bool GetIntTagValue(uint8 tagname, uint32& ruValue) const; + void SetIntTagValue(uint8 tagname, uint32 ruValue) const; + const wxString& GetStrTagValue(uint8 tagname) const; + const wxString& GetStrTagValue(const wxString& tagname) const; + const CTag *GetTag(const wxString& tagname) const; + const CTag *GetTag(const wxString& tagname, uint8 tagtype) const; + const CTag *GetTag(uint8 tagname) const; + const CTag *GetTag(uint8 tagname, uint8 tagtype) const; + void AddTagUnique(const CTag &pTag); + const ArrayOfCTag& GetTags() const { return m_taglist; } + void AddNote(Kademlia::CEntry* pEntry); + const CKadEntryPtrList& getNotes() const { return m_kadNotes; } + + /* Comment and rating */ + virtual const wxString& GetFileComment() const { return m_strComment; } + virtual int8 GetFileRating() const { return m_iRating; } + + bool HasComment() const { return m_hasComment; } + bool HasRating() const { return m_iUserRating; } + bool HasBadRating() const { return (m_iUserRating == 1); } + int8 UserRating() const { return m_iUserRating; } + void UpdateFileRatingCommentAvail(); + +protected: + //! CAbstractFile is not assignable. + CAbstractFile& operator=(const CAbstractFile); + + CMD4Hash m_abyFileHash; + wxString m_strComment; + int8 m_iRating; + bool m_hasComment; + int8 m_iUserRating; + ArrayOfCTag m_taglist; + CKadEntryPtrList m_kadNotes; + +private: + uint64 m_nFileSize; + CPath m_fileName; +}; + + +class CSearchFile; + + +class CKnownFile : public CAbstractFile +{ +friend class CHashingTask; +public: + CKnownFile(); + explicit CKnownFile(const CSearchFile &searchFile); + + virtual ~CKnownFile(); + + void SetFilePath(const CPath& filePath); + const CPath& GetFilePath() const { return m_filePath; } + + virtual bool IsPartFile() const {return false;} + virtual bool LoadFromFile(const CFileDataIO* file); //load date, hashset and tags from a .met file + virtual uint8 GetStatus(bool WXUNUSED(ignorepause) = false) const { return PS_COMPLETE; } + bool WriteToFile(CFileDataIO* file); + time_t GetLastChangeDatetime() const { return m_lastDateChanged; } + + virtual void SetFileSize(uint64 nFileSize); + + // local available part hashs + uint16 GetHashCount() const {return m_hashlist.size();} + const CMD4Hash& GetPartHash(uint16 part) const; + + // nr. of part hashs according the file size wrt ED2K protocol + uint32 GetED2KPartHashCount() const { return m_iED2KPartHashCount; } + + // nr. of 9MB parts (file data) + inline uint16 GetPartCount() const { return m_iPartCount; } + + // nr. of 9MB parts according the file size wrt ED2K protocol (OP_FILESTATUS) + inline uint16 GetED2KPartCount() const { return m_iED2KPartCount; } + + // file upload priority + uint8 GetUpPriority() const {return m_iUpPriority;} + void SetUpPriority(uint8 newUpPriority, bool bSave=true); + bool IsAutoUpPriority() const {return m_bAutoUpPriority;} + void SetAutoUpPriority(bool flag) {m_bAutoUpPriority = flag;} + void UpdateAutoUpPriority(); + uint32 GetQueuedCount() const {return m_ClientUploadList.size();} + + bool LoadHashsetFromFile(const CFileDataIO* file, bool checkhash); + void AddUploadingClient(CUpDownClient* client); + void RemoveUploadingClient(CUpDownClient* client); + + // comment + const wxString& GetFileComment() { if (!m_bCommentLoaded) LoadComment(); return m_strComment; } + int8 GetFileRating() { if (!m_bCommentLoaded) LoadComment(); return m_iRating; } + + void SetFileComment(const wxString& strNewComment); + void SetFileRating(int8 iNewRating); + void SetPublishedED2K( bool val ); + bool GetPublishedED2K() const {return m_PublishedED2K;} + + /* Kad stuff */ + uint32 GetKadFileSearchID() const { return kadFileSearchID; } + // KAD TODO: This must be used on KadSearchListCtrl too once imported + void SetKadFileSearchID(uint32 id) { kadFileSearchID = id; } // John - Don't use this unless you know what your are DOING!! (Hopefully I do.. :) + const Kademlia::WordList& GetKadKeywords() const { return wordlist; } + // KAD TODO: If we add the proper column to SharedFilesCtrl, this is the funtion. + uint32 GetLastPublishTimeKadSrc() const { return m_lastPublishTimeKadSrc; } + void SetLastPublishTimeKadSrc(uint32 time, uint32 buddyip) { m_lastPublishTimeKadSrc = time; m_lastBuddyIP = buddyip;} + // Another unused function, useful for the shared files control column + uint32 GetLastPublishBuddy() const { return m_lastBuddyIP; } + void SetLastPublishTimeKadNotes(uint32 time) {m_lastPublishTimeKadNotes = time;} + uint32 GetLastPublishTimeKadNotes() const { return m_lastPublishTimeKadNotes; } + + bool PublishSrc(); + bool PublishNotes(); + + // TODO: This must be implemented if we ever want to have metadata. + uint32 GetMetaDataVer() const { return /*m_uMetaDataVer*/ 0; } + + // file sharing + virtual CPacket* CreateSrcInfoPacket(const CUpDownClient* forClient, uint8 byRequestedVersion, uint16 nRequestedOptions); + + virtual void UpdatePartsInfo(); + + + CFileStatistic statistic; + + time_t m_nCompleteSourcesTime; + uint16 m_nCompleteSourcesCount; + uint16 m_nCompleteSourcesCountLo; + uint16 m_nCompleteSourcesCountHi; + + // Maybe find a common place for this typedef? + typedef std::set SourceSet; + SourceSet m_ClientUploadList; + ArrayOfUInts16 m_AvailPartFrequency; + + /** + * Returns a base-16 encoding of the master hash, or + * an empty string if no such hash exists. + */ + wxString GetAICHMasterHash() const; + /** Returns true if the AICH-Hashset is valid, and verified or complete. */ + bool HasProperAICHHashSet() const; + + /** + * Updates the requency of uploading parts from with the data the client provides. + * + * @param client The clients whoose uploading parts should be considered. + * @param increment If true, the counts are incremented, otherwise they are decremented. + * + * This functions updates the frequency list of file-upparts, using the clients + * upparts-status. This function should be called by clients every time they update their + * upparts-status, or when they are added or removed from the file. + */ + void UpdateUpPartsFrequency( CUpDownClient* client, bool increment ); + + static void CreateHashFromHashlist(const ArrayOfCMD4Hash& hashes, CMD4Hash* Output); + + void ClearPriority(); + + time_t m_lastDateChanged; + + +#ifdef CLIENT_GUI + CKnownFile(CEC_SharedFile_Tag *); + friend class CSharedFilesRem; + +protected: + //! The AICH master-hash, if it is known. + wxString m_AICHMasterHash; +#else + virtual void SetFileName(const CPath& filename); + + // AICH + CAICHHashSet* GetAICHHashset() const { return m_pAICHHashSet; } + void SetAICHHashset(CAICHHashSet* val) { m_pAICHHashSet = val; } + +protected: + CAICHHashSet* m_pAICHHashSet; +#endif + + bool LoadTagsFromFile(const CFileDataIO* file); + bool LoadDateFromFile(const CFileDataIO* file); + void LoadComment();//comment + ArrayOfCMD4Hash m_hashlist; + CPath m_filePath; + + static void CreateHashFromFile(CFileDataIO* file, uint32 Length, CMD4Hash* Output, CAICHHashTree* pShaHashOut); + static void CreateHashFromInput(const byte* input, uint32 Length, CMD4Hash* Output, CAICHHashTree* pShaHashOut); + + bool m_bCommentLoaded; + uint16 m_iPartCount; + uint16 m_iED2KPartCount; + uint16 m_iED2KPartHashCount; + uint8 m_iUpPriority; + bool m_bAutoUpPriority; + bool m_PublishedED2K; + + /* Kad stuff */ + Kademlia::WordList wordlist; + uint32 kadFileSearchID; + uint32 m_lastPublishTimeKadSrc; + uint32 m_lastPublishTimeKadNotes; + uint32 m_lastBuddyIP; + +private: + /** Common initializations for constructors. */ + void Init(); +}; + +#endif // KNOWNFILE_H +// File_checked_for_headers diff --git a/src/KnownFileList.cpp b/src/KnownFileList.cpp new file mode 100644 index 00000000..121082d1 --- /dev/null +++ b/src/KnownFileList.cpp @@ -0,0 +1,300 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "KnownFileList.h" // Interface declarations + +#include + +#include // Do_not_auto_remove (lionel's Mac, 10.3) +#include "PartFile.h" // Needed for CPartFile +#include "amule.h" +#include "Logger.h" +#include + + +// This function is inlined for performance +inline bool CKnownFileList::KnownFileMatches( + CKnownFile *knownFile, + const CPath& filename, + uint32 in_date, + uint64 in_size) const +{ + return + (knownFile->GetLastChangeDatetime() == in_date) && + (knownFile->GetFileSize() == in_size) && + (knownFile->GetFileName() == filename); +} + + +CKnownFileList::CKnownFileList() +{ + accepted = 0; + requested = 0; + transferred = 0; + Init(); +} + + +CKnownFileList::~CKnownFileList() +{ + Clear(); +} + + +bool CKnownFileList::Init() +{ + CFile file; + + CPath fullpath = CPath(theApp->ConfigDir + wxT("known.met")); + if (!fullpath.FileExists()) { + // This is perfectly normal. The file was probably either + // deleted, or this is the first time running aMule. + return false; + } + + if (!file.Open(fullpath)) { + AddLogLineM(true, _("Warning: known.met cannot be opened.")); + return false; + } + + try { + uint8 version = file.ReadUInt8(); + if ((version != MET_HEADER) && (version != MET_HEADER_WITH_LARGEFILES)) { + AddLogLineM(true, _("Warning: Knownfile list corrupted, contains invalid header.")); + return false; + } + + wxMutexLocker sLock(list_mut); + uint32 RecordsNumber = file.ReadUInt32(); + AddDebugLogLineM(false, logKnownFiles, + wxString::Format(wxT("Reading %i known files from file format 0x%2.2x."), + RecordsNumber, version)); + for (uint32 i = 0; i < RecordsNumber; i++) { + std::auto_ptr record(new CKnownFile()); + if (record->LoadFromFile(&file)) { + AddDebugLogLineM(false, logKnownFiles, + CFormat(wxT("Known file read: %s")) % record->GetFileName()); + Append(record.release()); + } else { + AddLogLineM(true, + wxT("Failed to load entry in knownfilelist, file may be corrupt")); + } + } + AddDebugLogLineM(false, logKnownFiles, wxT("Finished reading known files")); + + return true; + } catch (const CInvalidPacket& e) { + AddLogLineM(true, wxT("Invalid entry in knownfilelist, file may be corrupt: ") + e.what()); + } catch (const CSafeIOException& e) { + AddLogLineM(true, CFormat(_("IO error while reading known.met file: %s")) % e.what()); + } + + return false; +} + + +void CKnownFileList::Save() +{ + CFile file(theApp->ConfigDir + wxT("known.met"), CFile::write); + if (!file.IsOpened()) { + return; + } + + wxMutexLocker sLock(list_mut); + + try { + // Kry - This is the version, but we don't know it till + // we know if any largefile is saved. This allows the list + // to be compatible with previous versions. + bool bContainsAnyLargeFiles = false; + file.WriteUInt8(0); + + file.WriteUInt32(m_knownFileMap.size() + m_duplicateFileList.size()); + + // Duplicates handling. Duplicates needs to be saved first, + // since it is the last entry that gets used. + KnownFileList::iterator itDup = m_duplicateFileList.begin(); + for ( ; itDup != m_duplicateFileList.end(); ++itDup ) { + (*itDup)->WriteToFile(&file); + if ((*itDup)->IsLargeFile()) { + bContainsAnyLargeFiles = true; + } + } + + CKnownFileMap::iterator it = m_knownFileMap.begin(); + for (; it != m_knownFileMap.end(); ++it) { + it->second->WriteToFile(&file); + if (it->second->IsLargeFile()) { + bContainsAnyLargeFiles = true; + } + } + + file.Seek(0); + file.WriteUInt8(bContainsAnyLargeFiles ? MET_HEADER_WITH_LARGEFILES : MET_HEADER); + } catch (const CIOFailureException& e) { + AddLogLineM(true, CFormat(_("Error while saving known.met file: %s")) % e.what()); + } +} + + +void CKnownFileList::Clear() +{ + wxMutexLocker sLock(list_mut); + + for (CKnownFileMap::iterator it = m_knownFileMap.begin(); + it != m_knownFileMap.end(); ++it) { + delete it->second; + } + m_knownFileMap.clear(); + + for (KnownFileList::iterator it = m_duplicateFileList.begin(); + it != m_duplicateFileList.end(); ++it) { + delete *it; + } + m_duplicateFileList.clear(); +} + + +CKnownFile* CKnownFileList::FindKnownFile( + const CPath& filename, + time_t in_date, + uint64 in_size) +{ + wxMutexLocker sLock(list_mut); + + for (CKnownFileMap::const_iterator it = m_knownFileMap.begin(); + it != m_knownFileMap.end(); ++it) { + CKnownFile *cur_file = it->second; + if (KnownFileMatches(cur_file, filename, in_date, in_size)) { + return cur_file; + } + } + + return IsOnDuplicates(filename, in_date, in_size); +} + + +CKnownFile *CKnownFileList::IsOnDuplicates( + const CPath& filename, + uint32 in_date, + uint64 in_size) const +{ + for (KnownFileList::const_iterator it = m_duplicateFileList.begin(); + it != m_duplicateFileList.end(); ++it) { + CKnownFile *cur_file = *it; + if (KnownFileMatches(cur_file, filename, in_date, in_size)) { + return cur_file; + } + } + return NULL; +} + + +bool CKnownFileList::IsKnownFile(const CKnownFile *file) +{ + wxCHECK(file, false); + + wxMutexLocker sLock(list_mut); + + // For the map, search with the key + const CMD4Hash &key = file->GetFileHash(); + CKnownFileMap::const_iterator itMap = m_knownFileMap.find(key); + if (itMap != m_knownFileMap.end()) { + return true; + } + // For the list, we have to iterate to search + for (KnownFileList::iterator it = m_duplicateFileList.begin(); + it != m_duplicateFileList.end(); ++it) { + if (*it == file) { + return true; + } + } + return false; +} + + +CKnownFile* CKnownFileList::FindKnownFileByID(const CMD4Hash& hash) +{ + wxMutexLocker sLock(list_mut); + + if (!hash.IsEmpty()) { + if (m_knownFileMap.find(hash) != m_knownFileMap.end()) { + return m_knownFileMap[hash]; + } else { + return NULL; + } + } + return NULL; + +} + + +bool CKnownFileList::SafeAddKFile(CKnownFile* toadd) +{ + wxMutexLocker sLock(list_mut); + return Append(toadd); +} + + +bool CKnownFileList::Append(CKnownFile *Record) +{ + if (Record->GetFileSize() > 0) { + const CMD4Hash& tkey = Record->GetFileHash(); + CKnownFileMap::iterator it = m_knownFileMap.find(tkey); + if (it == m_knownFileMap.end()) { + m_knownFileMap[tkey] = Record; + return true; + } else { + it->second; + time_t in_date = it->second->GetLastChangeDatetime(); + uint64 in_size = it->second->GetFileSize(); + CPath filename = it->second->GetFileName(); + if (KnownFileMatches(Record, filename, in_date, in_size) || + IsOnDuplicates(filename, in_date, in_size)) { + // The file is already on the list, ignore it. + return false; + } else { + // The file is a duplicated hash. Add THE OLD ONE to the duplicates list. + m_duplicateFileList.push_back(m_knownFileMap[tkey]); + // Is this thread-safe? If John is not sure and I'm not sure either... + if (theApp->sharedfiles) { + // Removing the old kad keywords created with the old filename + theApp->sharedfiles->RemoveKeywords(it->second); + } + m_knownFileMap[tkey] = Record; + return true; + } + } + } else { + AddDebugLogLineM(false, logGeneral, + CFormat(wxT("%s is 0-size, not added")) % + Record->GetFileName()); + + return false; + } +} + +// File_checked_for_headers diff --git a/src/KnownFileList.h b/src/KnownFileList.h new file mode 100644 index 00000000..d0fb33b0 --- /dev/null +++ b/src/KnownFileList.h @@ -0,0 +1,78 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef KNOWNFILELIST_H +#define KNOWNFILELIST_H + + +#include "SharedFileList.h" // CKnownFileMap + + +class CKnownFile; +class CPath; + +class CKnownFileList +{ +public: + CKnownFileList(); + ~CKnownFileList(); + bool SafeAddKFile(CKnownFile* toadd); + bool Init(); + void Save(); + void Clear(); + CKnownFile* FindKnownFile( + const CPath& filename, + time_t in_date, + uint64 in_size); + CKnownFile* FindKnownFileByID(const CMD4Hash& hash); + bool IsKnownFile(const CKnownFile* file); + + uint16 requested; + uint32 transferred; + uint16 accepted; + +private: + wxMutex list_mut; + + bool Append(CKnownFile*); + + CKnownFile *IsOnDuplicates( + const CPath& filename, + uint32 in_date, + uint64 in_size) const; + + bool KnownFileMatches( + CKnownFile *knownFile, + const CPath& filename, + uint32 in_date, + uint64 in_size) const; + + typedef std::list KnownFileList; + KnownFileList m_duplicateFileList; + CKnownFileMap m_knownFileMap; +}; + +#endif // KNOWNFILELIST_H +// File_checked_for_headers diff --git a/src/ListenSocket.cpp b/src/ListenSocket.cpp new file mode 100644 index 00000000..b4d5f9f4 --- /dev/null +++ b/src/ListenSocket.cpp @@ -0,0 +1,276 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "ListenSocket.h" // Interface declarations + +#include + +#include "ClientTCPSocket.h" // Needed for CClientRequestSocket +#include "Logger.h" // Needed for AddLogLineM +#include "Statistics.h" // Needed for theStats +#include "Preferences.h" // Needed for CPreferences +#include "amule.h" // Needed for theApp +#include "ServerConnect.h" // Needed for CServerConnect +#include "updownclient.h" // Needed for CUpDownClient + +//----------------------------------------------------------------------------- +// CListenSocket +//----------------------------------------------------------------------------- +// +// This is the socket that listens to incomming connections in aMule's TCP port +// As soon as a connection is detected, it creates a new socket of type +// CClientTCPSocket to handle (accept) the connection. +// + +CListenSocket::CListenSocket(wxIPaddress &addr, const CProxyData *ProxyData) +: +// wxSOCKET_NOWAIT - means non-blocking i/o +// wxSOCKET_REUSEADDR - means we can reuse the socket imediately (wx-2.5.3) +CSocketServerProxy(addr, wxSOCKET_NOWAIT|wxSOCKET_REUSEADDR, ProxyData) +{ + // 0.42e - vars not used by us + bListening = false; + shutdown = false; + m_OpenSocketsInterval = 0; + m_nPeningConnections = 0; + totalconnectionchecks = 0; + averageconnections = 0.0; + // Set the listen socket event handler -- The handler is written in amule.cpp + if (Ok()) { + SetEventHandler(*theApp, ID_LISTENSOCKET_EVENT); + SetNotify(wxSOCKET_CONNECTION_FLAG); + Notify(true); + + printf("ListenSocket: Ok.\n"); + } else { + AddLogLineM( true, _("Error: Could not listen to TCP port.") ); + printf("ListenSocket: Could not listen to TCP port."); + } +} + + +CListenSocket::~CListenSocket() +{ + shutdown = true; + Discard(); + Close(); + +#ifdef __DEBUG__ + // No new sockets should have been opened by now + for (SocketSet::iterator it = socket_list.begin(); it != socket_list.end(); it++) { + wxASSERT((*it)->OnDestroy()); + } +#endif + + KillAllSockets(); +} + + +bool CListenSocket::StartListening() +{ + // 0.42e + bListening = true; + + return true; +} + +void CListenSocket::ReStartListening() +{ + // 0.42e + bListening = true; + if (m_nPeningConnections) { + m_nPeningConnections--; + OnAccept(0); + } +} + +void CListenSocket::StopListening() +{ + // 0.42e + bListening = false; + theStats::AddMaxConnectionLimitReached(); +} + +void CListenSocket::OnAccept(int nErrorCode) +{ + // 0.42e + if (!nErrorCode) { + m_nPeningConnections++; + if (m_nPeningConnections < 1) { + wxASSERT(FALSE); + m_nPeningConnections = 1; + } + if (TooManySockets(true) && !theApp->serverconnect->IsConnecting()) { + StopListening(); + return; + } else if (bListening == false) { + // If the client is still at maxconnections, + // this will allow it to go above it ... + // But if you don't, you will get a lowID on all servers. + ReStartListening(); + } + // Deal with the pending connections, there might be more than one, due to + // the StopListening() call above. + while (m_nPeningConnections) { + m_nPeningConnections--; + // Create a new socket to deal with the connection + CClientTCPSocket* newclient = new CClientTCPSocket(); + // Accept the connection and give it to the newly created socket + if (!AcceptWith(*newclient, false)) { + newclient->Safe_Delete(); + } else { + wxASSERT(theApp->IsRunning()); + if (!newclient->InitNetworkData()) { + // IP or port were not returned correctly + // from the accepted address, or filtered. + newclient->Safe_Delete(); + } + } + } + } +} + +void CListenSocket::AddConnection() +{ + m_OpenSocketsInterval++; +} + +void CListenSocket::Process() +{ + // 042e + Kry changes for Destroy + m_OpenSocketsInterval = 0; + SocketSet::iterator it = socket_list.begin(); + while ( it != socket_list.end() ) { + CClientTCPSocket* cur_socket = *it++; + if (!cur_socket->OnDestroy()) { + if (cur_socket->ForDeletion()) { + cur_socket->Destroy(); + } else { + cur_socket->CheckTimeOut(); + } + } + } + + if ((GetOpenSockets()+5 < thePrefs::GetMaxConnections() || theApp->serverconnect->IsConnecting()) && !bListening) { + ReStartListening(); + } +} + +void CListenSocket::RecalculateStats() +{ + // 0.42e + memset(m_ConnectionStates,0,6); + for (SocketSet::iterator it = socket_list.begin(); it != socket_list.end(); ) { + CClientTCPSocket* cur_socket = *it++; + switch (cur_socket->GetConState()) { + case ES_DISCONNECTED: + m_ConnectionStates[0]++; + break; + case ES_NOTCONNECTED: + m_ConnectionStates[1]++; + break; + case ES_CONNECTED: + m_ConnectionStates[2]++; + break; + } + } +} + +void CListenSocket::AddSocket(CClientTCPSocket* toadd) +{ + wxASSERT(toadd); + socket_list.insert(toadd); + theStats::AddActiveConnection(); +} + +void CListenSocket::RemoveSocket(CClientTCPSocket* todel) +{ + wxASSERT(todel); + socket_list.erase(todel); + theStats::RemoveActiveConnection(); +} + +void CListenSocket::KillAllSockets() +{ + // 0.42e reviewed - they use delete, but our safer is Destroy... + // But I bet it would be better to call Safe_Delete on the socket. + // Update: no... Safe_Delete MARKS for deletion. We need to delete it. + for (SocketSet::iterator it = socket_list.begin(); it != socket_list.end(); ) { + CClientTCPSocket* cur_socket = *it++; + if (cur_socket->GetClient()) { + cur_socket->GetClient()->Safe_Delete(); + } else { + cur_socket->Safe_Delete(); + cur_socket->Destroy(); + } + } +} + +bool CListenSocket::TooManySockets(bool bIgnoreInterval) +{ + if (GetOpenSockets() > thePrefs::GetMaxConnections() || (m_OpenSocketsInterval > (thePrefs::GetMaxConperFive()*GetMaxConperFiveModifier()) && !bIgnoreInterval)) { + return true; + } else { + return false; + } +} + +bool CListenSocket::IsValidSocket(CClientTCPSocket* totest) +{ + // 0.42e + return socket_list.find(totest) != socket_list.end(); +} + + +void CListenSocket::UpdateConnectionsStatus() +{ + // 0.42e xcept for the khaos stats + if( theApp->IsConnected() ) { + totalconnectionchecks++; + float percent; + percent = (float)(totalconnectionchecks-1)/(float)totalconnectionchecks; + if( percent > .99f ) { + percent = .99f; + } + averageconnections = (averageconnections*percent) + (float)GetOpenSockets()*(1.0f-percent); + } +} + + +float CListenSocket::GetMaxConperFiveModifier() +{ + float SpikeSize = GetOpenSockets() - averageconnections; + if ( SpikeSize < 1 ) { + return 1; + } + + float SpikeTolerance = 2.5f*thePrefs::GetMaxConperFive(); + if ( SpikeSize > SpikeTolerance ) { + return 0; + } + + return 1.0f - (SpikeSize/SpikeTolerance); +} +// File_checked_for_headers diff --git a/src/ListenSocket.h b/src/ListenSocket.h new file mode 100644 index 00000000..c29210db --- /dev/null +++ b/src/ListenSocket.h @@ -0,0 +1,83 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// +// Handling incoming connections (up or downloadrequests) +// + +#ifndef LISTENSOCKET_H +#define LISTENSOCKET_H + +#include "Proxy.h" // Needed fot CProxyData, CSocketServerProxy + +#include + +class CClientTCPSocket; + +// CListenSocket command target +class CListenSocket : public CSocketServerProxy +{ +public: + CListenSocket(wxIPaddress &addr, const CProxyData *ProxyData = NULL); + ~CListenSocket(); + bool StartListening(); + void StopListening(); + void OnAccept(int nErrorCode); + void Process(); + void RemoveSocket(CClientTCPSocket* todel); + void AddSocket(CClientTCPSocket* toadd); + uint32 GetOpenSockets() {return socket_list.size();} + void KillAllSockets(); + bool TooManySockets(bool bIgnoreInterval = false); + bool IsValidSocket(CClientTCPSocket* totest); + void AddConnection(); + void RecalculateStats(); + void ReStartListening(); + void UpdateConnectionsStatus(); + + float GetMaxConperFiveModifier(); + uint32 GetTotalConnectionChecks() { return totalconnectionchecks; } + float GetAverageConnections() { return averageconnections; } + + bool OnShutdown() { return shutdown;} + +private: + + typedef std::set SocketSet; + SocketSet socket_list; + + bool bListening; + bool shutdown; + + uint16 m_OpenSocketsInterval; + uint16 m_ConnectionStates[3]; + uint16 m_nPeningConnections; + uint32 totalconnectionchecks; + float averageconnections; +}; + + +#endif // LISTENSOCKET_H +// File_checked_for_headers diff --git a/src/Logger.cpp b/src/Logger.cpp new file mode 100644 index 00000000..da04081b --- /dev/null +++ b/src/Logger.cpp @@ -0,0 +1,272 @@ +// +// This file is part of the aMule Project. +// +// Copyright (C) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "Logger.h" +#include "amule.h" +#include "Preferences.h" + +#include + + +DEFINE_LOCAL_EVENT_TYPE(MULE_EVT_LOGLINE) + + +CDebugCategory::CDebugCategory( DebugType type, const wxString& name ) + : m_name( name ), + m_type( type ) +{ + m_enabled = false; +} + + +bool CDebugCategory::IsEnabled() const +{ + return m_enabled; +} + + +void CDebugCategory::SetEnabled( bool enabled ) +{ + m_enabled = enabled; +} + + +const wxString& CDebugCategory::GetName() const +{ + return m_name; +} + + +DebugType CDebugCategory::GetType() const +{ + return m_type; +} + +CDebugCategory g_debugcats[] = { + CDebugCategory( logGeneral, wxT("General") ), + CDebugCategory( logHasher, wxT("Hasher") ), + CDebugCategory( logClient, wxT("ED2k Client") ), + CDebugCategory( logLocalClient, wxT("Local Client Protocol") ), + CDebugCategory( logRemoteClient, wxT("Remote Client Protocol") ), + CDebugCategory( logPacketErrors, wxT("Packet Parsing Errors") ), + CDebugCategory( logCFile, wxT("CFile") ), + CDebugCategory( logFileIO, wxT("FileIO") ), + CDebugCategory( logZLib, wxT("ZLib") ), + CDebugCategory( logAICHThread, wxT("AICH-Hasher") ), + CDebugCategory( logAICHTransfer, wxT("AICH-Transfer") ), + CDebugCategory( logAICHRecovery, wxT("AICH-Recovery") ), + CDebugCategory( logListenSocket, wxT("ListenSocket") ), + CDebugCategory( logCredits, wxT("Credits") ), + CDebugCategory( logClientUDP, wxT("ClientUDPSocket") ), + CDebugCategory( logDownloadQueue, wxT("DownloadQueue") ), + CDebugCategory( logIPFilter, wxT("IPFilter") ), + CDebugCategory( logKnownFiles, wxT("KnownFileList") ), + CDebugCategory( logPartFile, wxT("PartFiles") ), + CDebugCategory( logSHAHashSet, wxT("SHAHashSet") ), + CDebugCategory( logServer, wxT("Servers") ), + CDebugCategory( logProxy, wxT("Proxy") ), + CDebugCategory( logSearch, wxT("Searching") ), + CDebugCategory( logServerUDP, wxT("ServerUDP") ), + CDebugCategory( logClientKadUDP, wxT("Client Kademlia UDP") ), + CDebugCategory( logKadSearch, wxT("Kademlia Search") ), + CDebugCategory( logKadRouting, wxT("Kademlia Routing") ), + CDebugCategory( logKadIndex, wxT("Kademlia Indexing") ), + CDebugCategory( logKadMain, wxT("Kademlia Main Thread") ), + CDebugCategory( logKadPrefs, wxT("Kademlia Preferences") ), + CDebugCategory( logPfConvert, wxT("PartFileConvert") ), + CDebugCategory( logMuleUDP, wxT("MuleUDPSocket" ) ), + CDebugCategory( logThreads, wxT("ThreadScheduler" ) ), + CDebugCategory( logUPnP, wxT("Universal Plug and Play" ) ), +}; + + +const int categoryCount = sizeof( g_debugcats ) / sizeof( g_debugcats[0] ); + + + +bool CLogger::IsEnabled( DebugType type ) +{ +#ifdef __DEBUG__ + int index = (int)type; + + if ( index >= 0 && index < categoryCount ) { + const CDebugCategory& cat = g_debugcats[ index ]; + wxASSERT( type == cat.GetType() ); + + return ( cat.IsEnabled() && thePrefs::GetVerbose() ); + } + + wxASSERT( false ); +#endif + return false; +} + + +void CLogger::SetEnabled( DebugType type, bool enabled ) +{ + int index = (int)type; + + if ( index >= 0 && index < categoryCount ) { + CDebugCategory& cat = g_debugcats[ index ]; + wxASSERT( type == cat.GetType() ); + + cat.SetEnabled( enabled ); + } else { + wxASSERT( false ); + } +} + + +struct LogEntry +{ + bool critical; + wxString entry; +}; + + +static std::deque s_backLog; +static wxMutex s_mutex; + + +void PushEntry(bool critical, const wxString& str) +{ + wxMutexLocker lock(s_mutex); + + LogEntry* item = new LogEntry; + item->critical = critical; + item->entry = str; + + s_backLog.push_back(item); +} + + +LogEntry* PopEntry() +{ + wxMutexLocker lock(s_mutex); + + if (s_backLog.empty()) { + return NULL; + } + + LogEntry* entry = s_backLog.front(); + s_backLog.pop_front(); + + return entry; +} + + + + +void CLogger::FlushPendingEntries() +{ + wxCHECK_RET(wxThread::IsMain(), wxT("Must be called by main thread.")); + + LogEntry* entry = NULL; + while ((entry = PopEntry())) { + CLoggingEvent event(entry->critical, entry->entry); + +#ifdef CLIENT_GUI + theApp->ProcessEvent(event); +#else + // Try to handle events immediatly when possible (to save to file). + if (theApp->applog) { + theApp->ProcessEvent(event); + } else { + theApp->AddPendingEvent(event); + } +#endif + + delete entry; + } +} + + +void CLogger::AddLogLine( + const wxString &file, + int line, + bool critical, + const wxString &str) +{ + wxString msg; + msg << file.AfterLast(wxFileName::GetPathSeparator()) << wxT("(") << line << wxT("): ") << str; + PushEntry(critical, msg); + + if (wxThread::IsMain()) { + FlushPendingEntries(); + } +} + + +void CLogger::AddLogLine( + const wxString &file, + int line, + bool critical, + DebugType type, + const wxString& str) +{ + int index = (int)type; + + if ( index >= 0 && index < categoryCount ) { + const CDebugCategory& cat = g_debugcats[ index ]; + wxASSERT(type == cat.GetType()); + + AddLogLine(file, line, critical, cat.GetName() + wxT(": ") + str); + } else { + wxASSERT( false ); + } +} + + +const CDebugCategory& CLogger::GetDebugCategory( int index ) +{ + wxASSERT( index >= 0 && index < categoryCount ); + + return g_debugcats[ index ]; +} + + +unsigned int CLogger::GetDebugCategoryCount() +{ + return categoryCount; +} + + +CLoggerTarget::CLoggerTarget() +{ +} + + +void CLoggerTarget::DoLogString(const wxChar* msg, time_t) +{ + wxCHECK_RET(msg, wxT("Log message is NULL in DoLogString!")); + + wxString str(msg); + + // This is much simpler than manually handling all wx log-types. + bool critical = str.StartsWith(_("Error: ")) || str.StartsWith(_("Warning: ")); + + CLogger::AddLogLine(__TFILE__, __LINE__, critical, str); +} + +// File_checked_for_headers diff --git a/src/Logger.h b/src/Logger.h new file mode 100644 index 00000000..57fe9352 --- /dev/null +++ b/src/Logger.h @@ -0,0 +1,320 @@ +// +// This file is part of the aMule Project. +// +// Copyright (C) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef LOGGER_H +#define LOGGER_H + +#include +#include + + +enum DebugType +{ + //! General warnings/errors. + logGeneral = 0, + //! Warnings/Errors for the main hashing thread. + logHasher, + //! Warnings/Errors for client-objects. + logClient, + //! Warnings/Errors for the local client protocol. + logLocalClient, + //! Warnings/Errors for the remote client protocol. + logRemoteClient, + //! Warnings/Errors when parsing packets. + logPacketErrors, + //! Warnings/Errors for the CFile class. + logCFile, + //! Warnings/Errors related to reading/writing files. + logFileIO, + //! Warnings/Errors when using the zLib library. + logZLib, + //! Warnings/Errors for the AICH-syncronization thread. + logAICHThread, + //! Warnings/Errors for transfering AICH hash-sets. + logAICHTransfer, + //! Warnings/Errors when recovering with AICH. + logAICHRecovery, + //! Warnings/Errors for the CListenSocket class. + logListenSocket, + //! Warnings/Errors for Client-Credits. + logCredits, + //! Warnings/Errors for the client UDP socket. + logClientUDP, + //! Warnings/Errors for the download-queue. + logDownloadQueue, + //! Warnings/Errors for the IP-Filter. + logIPFilter, + //! Warnings/Errors for known-files. + logKnownFiles, + //! Warnings/Errors for part-files. + logPartFile, + //! Warnings/Errors for SHA-hashset creation. + logSHAHashSet, + //! Warnings/Errors for servers, server connections. + logServer, + //! Warnings/Errors for proxy. + logProxy, + //! Warnings/Errors related to searching. + logSearch, + //! Warnings/Errors related to the server UDP socket. + logServerUDP, + //! Warning/Errors related to Kademlia UDP comunication on client + logClientKadUDP, + //! Warning/Errors related to Kademlia Search + logKadSearch, + //! Warning/Errors related to Kademlia Routing + logKadRouting, + //! Warning/Errors related to Kademlia Indexing + logKadIndex, + //! Warning/Errors related to Kademlia Main Thread + logKadMain, + //! Warning/Errors related to Kademlia Preferences + logKadPrefs, + //! Warnings/Errors related to partfile importer + logPfConvert, + //! Warnings/Errors related to the basic UDP socket-class. + logMuleUDP, + //! Warnings/Errors related to the thread-scheduler. + logThreads, + //! Warnings/Errors related to the Universal Plug and Play subsistem. + logUPnP + // IMPORTANT NOTE: when you add values to this enum, update the g_debugcats + // array in Logger.cpp! +}; + + + +/** + * Container-class for the debugging categories. + */ +class CDebugCategory +{ +public: + /** + * Constructor. + * + * @param type The actual debug-category type. + * @param name The user-readable name. + */ + CDebugCategory( DebugType type, const wxString& name ); + + + /** + * Returns true if the category is enabled. + */ + bool IsEnabled() const; + + /** + * Enables/Disables the category. + */ + void SetEnabled( bool ); + + + /** + * Returns the user-readable name. + */ + const wxString& GetName() const; + + /** + * Returns the actual type. + */ + DebugType GetType() const; + +private: + //! The user-readable name. + wxString m_name; + //! The actual type. + DebugType m_type; + //! Whenever or not the category is enabled. + bool m_enabled; +}; + + +/** + * Namespace containing functions for logging operations. + */ +namespace CLogger +{ + /** + * Returns true if debug-messages should be generated for a specific category. + */ + bool IsEnabled( DebugType ); + + /** + * Enables or disables debug-messages for a specific category. + */ + void SetEnabled( DebugType type, bool enabled ); + + + /** + * Logs the specified line of text. + * + * @param file + * @param line + * @param critical If true, then the message will be made visible directly to the user. + * @param str The actual line of text. + * + * This function is thread-safe. If it is called by the main thread, the + * event will be sent directly to the application, otherwise it will be + * queued in the event-loop. + */ + void AddLogLine( + const wxString &file, + int line, + bool critical, + const wxString &str); + + /** + * Logs the specified line of text, prefixed with the name of the DebugType. + * + * @param file + * @param line + * @param critical If true, then the message will be made visible directly to the user. + * @param type The debug-category, the name of which will be prepended to the line. + * @param str The actual line of text. + * + * This function is thread-safe. If it is called by the main thread, the + * event will be sent directly to the application, otherwise it will be + * queued in the event-loop. + */ + void AddLogLine( + const wxString &file, + int line, + bool critical, + DebugType type, + const wxString &str); + + + /** + * Ensures that any pending entries are sent to the app. + * + * TODO: Ensure that entries are appended to the + * logfile even when queued to avoid risk of + * data loss. + */ + void FlushPendingEntries(); + + /** + * Returns a category specified by index. + */ + const CDebugCategory& GetDebugCategory( int index ); + + /** + * Returns the number of debug-categories. + */ + unsigned int GetDebugCategoryCount(); +} + + +/** + * This class forwards log-lines from wxWidgets to CLogger. + */ +class CLoggerTarget : public wxLog +{ +public: + CLoggerTarget(); + + /** + * @see wxLog::DoLogString + */ + void DoLogString(const wxChar *msg, time_t); +}; + + +DECLARE_LOCAL_EVENT_TYPE(MULE_EVT_LOGLINE, -1) + + +/** This event is sent when a log-line is queued. */ +class CLoggingEvent : public wxEvent +{ +public: + CLoggingEvent(bool critical, const wxString& msg) + : wxEvent(-1, MULE_EVT_LOGLINE) + , m_critical(critical) + // Deep copy, to avoid thread-unsafe reference counting. */ + , m_msg(msg.c_str(), msg.Length()) + { + } + + const wxString& Message() const { + return m_msg; + } + + bool IsCritical() const { + return m_critical; + } + + wxEvent* Clone() const { + return new CLoggingEvent(m_critical, m_msg); + } + +private: + bool m_critical; + wxString m_msg; +}; + + +typedef void (wxEvtHandler::*MuleLogEventFunction)(CLoggingEvent&); + +//! Event-handler for completed hashings of new shared files and partfiles. +#define EVT_MULE_LOGGING(func) \ + DECLARE_EVENT_TABLE_ENTRY(MULE_EVT_LOGLINE, -1, -1, \ + (wxObjectEventFunction) (wxEventFunction) \ + wxStaticCastEvent(MuleLogEventFunction, &func), (wxObject*) NULL), + + +/** + * These macros should be used when logging. The + * AddLogLineM macro will simply call one of the + * two CLogger::AddLogLine functions depending on + * paramteres, but AddDebugLogLineM will only log + * a message if the message is either critical or + * the specified debug-type is enabled in the + * preferences. + */ +#if defined(MULEUNIT) + #define AddDebugLogLineM(critical, type, string) do {} while (false) + #define AddLogLineM(...) do {} while (false) +#else + #ifdef __DEBUG__ + #define AddDebugLogLineM(critical, type, string) \ + do { \ + if (critical || CLogger::IsEnabled(type)) { \ + CLogger::AddLogLine(__TFILE__, __LINE__, critical, type, string); \ + } \ + } while (false) + #else + #define AddDebugLogLineM(critical, type, string) \ + do { \ + if (critical) { \ + CLogger::AddLogLine(__TFILE__, __LINE__, critical, type, string); \ + } \ + } while (false) + #endif + + #define AddLogLineM(...) CLogger::AddLogLine(__TFILE__, __LINE__, __VA_ARGS__) +#endif + +#endif +// File_checked_for_headers diff --git a/src/MD4Hash.h b/src/MD4Hash.h new file mode 100644 index 00000000..c181b776 --- /dev/null +++ b/src/MD4Hash.h @@ -0,0 +1,291 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef CMD4HASH_H +#define CMD4HASH_H + + +#include "ArchSpecific.h" // Needed for Raw{Peek,Poke}UInt64() + +#include "kademlia/utils/UInt128.h" // Needed for CUInt128 + +#include // Needed for MULE_VALIDATE_PARAMS + +#ifdef USE_WX_EXTENSIONS +#include +#endif + +#include + + +const size_t MD4HASH_LENGTH = 16; + + +/** + * Container-class for the MD4 hashes used in aMule. + * + * This is a safe representation of the MD4 hashes used in aMule. By transparently + * wrapping the char array used to store the hash, we get the advantages of + * assigment, equality and non-equality operators, plus other nifty features. + * + * Please remember that the hashes are arrays with length 16 WITHOUT a zero-terminator! + */ +class CMD4Hash +{ +public: + /** + * Default constructor. + * + * The default constructor creates an empty hash of length 16. + * Each field of the char array has an initial value of zero. + */ + CMD4Hash() { + Clear(); + } + + /** + * Create a CMD4Hash from a CUInt128 + * + * @param hash The 128 bits integer to be used. + * + */ + CMD4Hash(const Kademlia::CUInt128& hash) { + byte transitional_array[MD4HASH_LENGTH]; + hash.ToByteArray(transitional_array); + SetHash(transitional_array); + } + + ~CMD4Hash() { + } + + /** + * Cast a unsigned char array to a CMD4Hash. + * + * @param hash The array to be cast. + * + * Please note that the array must either be a NULL pointer or be at least + * 16 chars long, not including any possible zero-terminator! + */ + explicit CMD4Hash(const unsigned char hash[]) { + SetHash(hash); + } + + /** + * Equality operator. + * + * Returns true if all fields of both hashes are the same. + */ + bool operator == (const CMD4Hash& other_hash) const { + return ( + ( RawPeekUInt64( m_hash ) == RawPeekUInt64( other_hash.m_hash ) ) && + ( RawPeekUInt64( m_hash + 8 ) == RawPeekUInt64( other_hash.m_hash + 8 ) ) + ); + } + + /** + * Non-equality operator + * + * Returns true if there is any difference between the two hashes. + */ + bool operator != (const CMD4Hash& other_hash) const { + return !(*this == other_hash); + } + + /** + * Less than operator. + * + * @return True if the hash is less than other_hash, false otherwise. + * + * The purpose of this function is to enable the usage of CMD4Hashes in + * sorted STL containers like std::map. + */ + bool operator < (const CMD4Hash& other_hash) const { + for ( size_t i = 0; i < MD4HASH_LENGTH; ++i ) { + if ( m_hash[i] < other_hash.m_hash[i] ) { + return true; + } else if ( other_hash.m_hash[i] < m_hash[i] ) { + return false; + } + } + + return false; + } + + + /** + * Returns true if the hash is empty. + * + * @return True if all fields are zero, false otherwise. + * + * This functions checks the contents of the hash and returns true + * only if each field of the array contains the value zero. + * To achive an empty hash, the function Clear() can be used. + */ + bool IsEmpty() const { + return ( + !RawPeekUInt64( m_hash ) && + !RawPeekUInt64( m_hash + 8 ) + ); + } + + /** + * Resets the contents of the hash. + * + * This functions sets the value of each field of the hash to zero. + * IsEmpty() will return true after a call to this function. + */ + void Clear() { + RawPokeUInt64( m_hash, 0 ); + RawPokeUInt64( m_hash + 8, 0 ); + } + + + /** + * Decodes a 32 char long hexadecimal representation of a MD4 hash. + * + * @param hash The hash representation to be converted. Length must be 32. + * @return Return value specifies if the hash was succesfully decoded. + * + * This function converts a hexadecimal representation of a MD4 + * hash and stores it in the m_hash data-member. + */ + + bool Decode(const std::string& hash) { + if (hash.length() != MD4HASH_LENGTH * 2) { + return false; + } + + for ( size_t i = 0; i < MD4HASH_LENGTH * 2; i++ ) { + unsigned char word = toupper(hash[i]); + + if ((word >= '0') && (word <= '9')) { + word -= '0'; + } else if ((word >= 'A') && (word <= 'F')) { + word -= 'A' - 10; + } else { + // Invalid chars + return false; + } + + if (i % 2 == 0) { + m_hash[i/2] = word << 4; + } else { + m_hash[i/2] += word; + } + } + + return true; + } + + #ifdef USE_WX_EXTENSIONS + bool Decode(const wxString& hash) { + return Decode(std::string(unicode2char(hash))); + } + #endif + + /** + * Creates a 32 char long hexadecimal representation of a MD4 hash. + * + * @return Hexadecimal representation of the m_hash data-member. + * + * This function creates a hexadecimal representation of the MD4 + * hash stored in the m_hash data-member and returns it. + */ + std::string EncodeSTL() const { + std::string Base16Buff; + + for ( size_t i = 0; i < MD4HASH_LENGTH*2; i++ ) { + size_t x = ( i % 2 == 0 ) ? ( m_hash[i/2] >> 4 ) : ( m_hash[i/2] & 0xf ); + + if ( x < 10 ) { + Base16Buff += (char)( x + '0' ); + } else { + Base16Buff += (char)( x + ( 'A' - 10 )); + } + } + + return Base16Buff; + } + + #ifdef USE_WX_EXTENSIONS + wxString Encode() const { + return char2unicode(EncodeSTL().c_str()); + } + #endif + + /** + * Explicitly set the hash-array to the contents of a unsigned char array. + * + * @param hash The array to be assigned. + * + * The hash must either be a NULL pointer or be of length 16. + */ + void SetHash(const unsigned char hash[]) { + if ( hash ) { + RawPokeUInt64( m_hash, RawPeekUInt64( hash ) ); + RawPokeUInt64( m_hash + 8, RawPeekUInt64( hash + 8 ) ); + } else { + Clear(); + } + } + + /** + * Explicit access to the hash-array. + * + * @return Pointer to the hash array. + */ + unsigned char* GetHash() { + return m_hash; + } + const unsigned char* GetHash() const { + return m_hash; + } + + /** + * Explic access to values in the hash-array. + * + * @param i An index less than the length of an MD4 hash. + * @return The value (or its reference) at the given index. + */ + unsigned char operator[](size_t i) const { + MULE_VALIDATE_PARAMS(i < MD4HASH_LENGTH, wxT("Invalid index in CMD4Hash::operator[]")); + return m_hash[i]; + } + + unsigned char& operator[](size_t i) { + MULE_VALIDATE_PARAMS(i < MD4HASH_LENGTH, wxT("Invalid index in CMD4Hash::operator[]")); + return m_hash[i]; + } + +private: + //! The raw MD4-hash. + //! + //! The raw representation of the MD4-hash. In most cases, you should + //! try to avoid direct access and instead use the member functions. + unsigned char m_hash[MD4HASH_LENGTH]; +}; + + +#endif +// File_checked_for_headers diff --git a/src/MagnetURI.cpp b/src/MagnetURI.cpp new file mode 100644 index 00000000..e24f5a6a --- /dev/null +++ b/src/MagnetURI.cpp @@ -0,0 +1,139 @@ +// -*- C++ -*- +// This file is part of the aMule Project. +// +// Copyright (c) 2007-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2007-2008 Dévai Tamás ( gonosztopi@amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "MagnetURI.h" + + +#ifdef USE_STD_STRING +# ifdef _T +# undef _T +# endif +# ifdef _C +# undef _C +# endif +# define _T(str) str +# define _C(ch) ch +#else + // wx/chartype.h defines _T +# define _C(ch) wxChar(ch) +#endif + + +CMagnetURI::CMagnetURI(const STRING& uri) +{ + if (uri.compare(0, 7, _T("magnet:")) == 0) { + size_t start = uri.find(_C('?')); + if (start == STRING::npos) start = uri.length(); + while (start < uri.length() - 1) { + size_t end = uri.find(_C('&'), start + 1); + if (end == STRING::npos) end = uri.length(); + size_t pos = uri.find(_C('='), start + 1); + if (pos == STRING::npos) pos = uri.length(); + if (pos < end) { + m_fields.push_back(Field_Type(uri.substr(start + 1, pos - start - 1), uri.substr(pos + 1, end - pos - 1))); + } + start = end; + } + } +} + +STRING CMagnetURI::GetLink() const +{ + STRING retval(_T("magnet:")); + + for (List_Type::const_iterator it = m_fields.begin(); it != m_fields.end(); ++it) { + if (it == m_fields.begin()) { + retval.append(1, _C('?')); + } else { + retval.append(1, _C('&')); + } + retval.append(it->first); + retval.append(1, _C('=')); + retval.append(it->second); + } + return retval; +} + +CMagnetURI::Value_List CMagnetURI::GetField(const STRING& name) const +{ + Value_List retval; + + for (List_Type::const_iterator it = m_fields.begin(); it != m_fields.end(); ++it) { + if (it->first.compare(name) == 0) { + retval.push_back(it->second); + } + } + return retval; +} + + +bool CMagnetED2KConverter::CanConvertToED2K() const +{ + bool has_urn = false; + bool has_xl = false; + + for (List_Type::const_iterator it = m_fields.begin(); it != m_fields.end(); ++it) { + if (it->first.compare(_T("xl")) == 0) { + has_xl = true; + continue; + } + if (it->first.compare(_T("xt")) == 0) { + if (it->second.compare(0, 9, _T("urn:ed2k:")) == 0) { + has_urn = true; + continue; + } + } + if (has_urn && has_xl) break; + } + return has_urn && has_xl; +} + +STRING CMagnetED2KConverter::GetED2KLink() const +{ + if (CanConvertToED2K()) { + STRING dn; + STRING hash; + STRING len(GetField(_T("xl")).front()); + + Value_List dn_val = GetField(_T("dn")); + if (!dn_val.empty()) { + dn = dn_val.front(); + } else { + // This should never happen. Has anyone seen a link without a file name? + // Just in case, assign a reasonable(?) name to that unnamed file. + dn = _T("FileName.ext"); + } + Value_List urn_list = GetField(_T("xt")); + for (Value_List::iterator it = urn_list.begin(); it != urn_list.end(); ++it) { + if (it->compare(0, 9, _T("urn:ed2k:")) == 0) { + hash = it->substr(9); + break; + } + } + return STRING(_T("ed2k://|file|")).append(dn).append(1, _C('|')).append(len).append(1, _C('|')).append(hash).append(_T("|/")); + } else { + return STRING(); + } +} diff --git a/src/MagnetURI.h b/src/MagnetURI.h new file mode 100644 index 00000000..d1aea14d --- /dev/null +++ b/src/MagnetURI.h @@ -0,0 +1,74 @@ +// -*- C++ -*- +// This file is part of the aMule Project. +// +// Copyright (c) 2007-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2007-2008 Dévai Tamás ( gonosztopi@amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef MAGNETURI_H +#define MAGNETURI_H + +#ifdef USE_STD_STRING +# include +# define STRING std::string +#else +# include +# define STRING wxString +#endif + +#include // Needed for std::list +#include // Needed for std::pair + +class CMagnetURI +{ + public: + typedef std::list Value_List; + + CMagnetURI() {} + CMagnetURI(const STRING& uri); + + void AddField(const STRING& name, const STRING& value) { m_fields.push_back(Field_Type(name, value)); } + Value_List GetField(const STRING& name) const; + void Clear() { m_fields.clear(); } + STRING GetLink() const; + operator STRING() const { return GetLink(); } + + protected: + typedef std::pair Field_Type; + typedef std::list List_Type; + + List_Type m_fields; +}; + +class CMagnetED2KConverter : private CMagnetURI +{ + public: + CMagnetED2KConverter(const STRING& uri) + : CMagnetURI(uri) + {} + + bool CanConvertToED2K() const; + STRING GetED2KLink() const; + + operator STRING() const { return GetED2KLink(); } +}; + +#endif /* MAGNETURI_H */ diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 00000000..ae275124 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,538 @@ +if WEB +OPT_WEB = webserver +endif + +SUBDIRS = libs utils pixmaps kademlia skins $(OPT_WEB) + +EXTRA_DIST = \ + aMule.xpm \ + Parser.y \ + Scanner.h.in \ + Scanner.l \ + muuli.wdr + +bin_PROGRAMS = + +if MONOLITHIC +bin_PROGRAMS += amule +endif + +if COMPILE_CMD +bin_PROGRAMS += amulecmd +endif + +if ED2K +bin_PROGRAMS += ed2k +endif + +if AMULE_GUI +bin_PROGRAMS += amulegui +endif + +if AMULE_DAEMON +bin_PROGRAMS += amuled +endif + +# Sources + +noinst_LIBRARIES = + +if MONOLITHIC +noinst_LIBRARIES += libmuleappcore.a +else +if AMULE_DAEMON +noinst_LIBRARIES += libmuleappcore.a +endif +endif + +if MONOLITHIC +noinst_LIBRARIES += libmuleappgui.a +noinst_LIBRARIES += libmuleappcommon.a +else +if AMULE_GUI +noinst_LIBRARIES += libmuleappgui.a +noinst_LIBRARIES += libmuleappcommon.a +else +if AMULE_DAEMON +noinst_LIBRARIES += libmuleappcommon.a +endif +endif +endif + + +# Common to core/gui/monolithic + +libmuleappcommon_a_SOURCES = \ + CFile.cpp \ + DataToText.cpp \ + ED2KLink.cpp \ + MagnetURI.cpp \ + MemFile.cpp \ + NetworkFunctions.cpp \ + Packet.cpp \ + RLE.cpp \ + SafeFile.cpp \ + SHA.cpp \ + Tag.cpp \ + Timer.cpp \ + RandomFunctions.cpp \ + kademlia/utils/UInt128.cpp + +libmuleappcommon_a_CFLAGS = $(WXBASE_CFLAGS) -I$(srcdir)/libs -I$(srcdir)/include +libmuleappcommon_a_CXXFLAGS = $(WXBASE_CXXFLAGS) -I$(srcdir)/libs -I$(srcdir)/include +if ENABLE_UPNP +libmuleappcommon_a_CFLAGS += -DENABLE_UPNP=1 +libmuleappcommon_a_CXXFLAGS += -DENABLE_UPNP=1 +endif + + +# Common to core/monolithic + +libmuleappcore_a_SOURCES = \ + AsyncDNS.cpp \ + DeadSourceList.cpp \ + Scanner.cpp \ + Parser.cpp \ + kademlia/utils/LittleEndian.cpp \ + kademlia/kademlia/SearchManager.cpp \ + kademlia/routing/RoutingBin.cpp \ + StateMachine.cpp \ + ThreadScheduler.cpp + +libmuleappcore_a_CFLAGS = $(WXBASE_CFLAGS) -I$(srcdir)/libs -I$(srcdir)/include +libmuleappcore_a_CXXFLAGS = $(WXBASE_CXXFLAGS) -I$(srcdir)/libs -I$(srcdir)/include +if ENABLE_UPNP +libmuleappcore_a_CFLAGS += -DENABLE_UPNP=1 +libmuleappcore_a_CXXFLAGS += -DENABLE_UPNP=1 +endif + + +# Common to gui/monolithic + +libmuleappgui_a_SOURCES = \ + BarShader.cpp \ + ChatWnd.cpp \ + ColorFrameCtrl.cpp \ + CommentDialog.cpp \ + CommentDialogLst.cpp \ + DirectoryTreeCtrl.cpp \ + EditServerListDlg.cpp \ + extern/wxWidgets/listctrl.cpp \ + FileDetailListCtrl.cpp \ + MuleGifCtrl.cpp \ + MuleListCtrl.cpp \ + MuleNotebook.cpp \ + MuleTextCtrl.cpp \ + MuleCollection.cpp \ + muuli_wdr.cpp + +libmuleappgui_a_CFLAGS = $(WX_CXXFLAGS) -I$(srcdir)/libs -I$(srcdir)/include +libmuleappgui_a_CXXFLAGS = $(WX_CXXFLAGS) -I$(srcdir)/libs -I$(srcdir)/include +if ENABLE_UPNP +libmuleappgui_a_CFLAGS += -DENABLE_UPNP=1 +libmuleappgui_a_CXXFLAGS += -DENABLE_UPNP=1 +endif + +core_sources = \ + RC4Encrypt.cpp \ + amule.cpp \ + BaseClient.cpp \ + ClientList.cpp \ + ClientCreditsList.cpp \ + ClientTCPSocket.cpp \ + ClientUDPSocket.cpp \ + DownloadClient.cpp \ + DownloadQueue.cpp \ + ECSpecialCoreTags.cpp \ + EMSocket.cpp \ + EncryptedStreamSocket.cpp \ + EncryptedDatagramSocket.cpp \ + ExternalConn.cpp \ + Friend.cpp \ + FriendList.cpp \ + HTTPDownload.cpp \ + IPFilter.cpp \ + KnownFileList.cpp \ + ListenSocket.cpp \ + MuleUDPSocket.cpp \ + SearchFile.cpp \ + SearchList.cpp \ + ServerConnect.cpp \ + ServerList.cpp \ + ServerSocket.cpp \ + ServerUDPSocket.cpp \ + SharedFileList.cpp \ + ThreadTasks.cpp \ + UploadBandwidthThrottler.cpp \ + UploadClient.cpp \ + UploadQueue.cpp \ + kademlia/kademlia/Kademlia.cpp \ + kademlia/kademlia/Search.cpp \ + kademlia/kademlia/Indexed.cpp \ + kademlia/net/KademliaUDPListener.cpp \ + kademlia/kademlia/Prefs.cpp \ + kademlia/routing/RoutingZone.cpp \ + kademlia/routing/Contact.cpp + +if ENABLE_UPNP +core_sources += \ + UPnP.cpp \ + UPnPCompatibility.cpp +endif + +gui_sources = \ + amule-gui.cpp \ + amuleDlg.cpp \ + AddFriend.cpp \ + CatDialog.cpp \ + ChatSelector.cpp \ + ClientDetailDialog.cpp \ + FileDetailDialog.cpp \ + KadDlg.cpp \ + OScopeCtrl.cpp \ + PartFileConvert.cpp \ + PrefsUnifiedDlg.cpp \ + SearchDlg.cpp \ + ServerWnd.cpp \ + SharedFilesWnd.cpp \ + StatisticsDlg.cpp \ + SearchListCtrl.cpp \ + DownloadListCtrl.cpp \ + ClientListCtrl.cpp \ + FriendListCtrl.cpp \ + ServerListCtrl.cpp \ + SharedFilesCtrl.cpp \ + MuleTrayIcon.cpp \ + TransferWnd.cpp + +if ENABLE_IP2COUNTRY +gui_sources += \ + IP2Country.cpp +endif + + +remote_common_sources = \ + OtherFunctions.cpp \ + NetworkFunctions.cpp + +common_sources = \ + ClientCredits.cpp \ + ECSpecialMuleTags.cpp \ + KnownFile.cpp \ + GetTickCount.cpp \ + GuiEvents.cpp \ + Logger.cpp \ + PartFile.cpp \ + Preferences.cpp \ + Proxy.cpp \ + Server.cpp \ + Statistics.cpp \ + StatTree.cpp \ + SHAHashSet.cpp \ + TerminationProcess.cpp \ + TerminationProcessAmuleweb.cpp \ + UserEvents.cpp \ + $(remote_common_sources) + +# Libs + +core_libs = -L. -lmuleappcore +gui_libs = -L. -lmuleappgui $(X11LIBS) $(WX_LIBS) +remote_common_libs = -Llibs/common -Llibs/ec/cpp -lmulecommon -lec $(ZLIB_LIBS) $(RESOLV_LIB) $(BFD_LIB) +common_libs = -L. -lmuleappcommon $(remote_common_libs) $(CRYPTOLIBS) + +core_deps = libmuleappcore.a +gui_deps = libmuleappgui.a +remote_common_deps = libs/common/libmulecommon.a libs/ec/cpp/libec.a +common_deps = libmuleappcommon.a $(remote_common_deps) + +# +# Flags +# +core_flags = +if ENABLE_UPNP +core_flags += -DENABLE_UPNP=1 +endif + +gui_flags = $(WX_CXXFLAGS) $(XRCFLAGS) +if ENABLE_IP2COUNTRY +gui_flags += -DENABLE_IP2COUNTRY=1 +endif + +common_flags = -I$(srcdir)/libs -Ilibs -I$(srcdir)/include + +# --------- Apps --------- + +amulegui_SOURCES = \ + amule-remote-gui.cpp \ + $(gui_sources) \ + $(ec_sources) \ + $(common_sources) + +amule_SOURCES = \ + $(core_sources) \ + $(gui_sources) \ + $(ec_sources) \ + $(common_sources) + +amuled_SOURCES = \ + amuled.cpp \ + Timer.cpp \ + $(core_sources) \ + $(ec_sources) \ + $(common_sources) + +amule_DEPENDENCIES = $(common_deps) $(core_deps) $(gui_deps) +amule_CFLAGS = $(core_flags) $(gui_flags) $(common_flags) +amule_CXXFLAGS = $(core_flags) $(gui_flags) $(common_flags) +amule_LDADD = $(common_libs) $(core_libs) $(gui_libs) + +amulegui_DEPENDENCIES = $(common_deps) $(gui_deps) +amulegui_CFLAGS = $(gui_flags) $(common_flags) -DCLIENT_GUI -DEC_REMOTE +amulegui_CXXFLAGS = $(gui_flags) $(common_flags) -DCLIENT_GUI -DEC_REMOTE +amulegui_LDADD = $(gui_libs) $(common_libs) $(WXBASE_LIBS) + +amuled_DEPENDENCIES = $(core_deps) $(common_deps) +amuled_CFLAGS = $(WXBASE_CFLAGS) $(core_flags) $(common_flags) -DAMULE_DAEMON +amuled_CXXFLAGS = $(WXBASE_CXXFLAGS) $(core_flags) $(common_flags) -DAMULE_DAEMON +amuled_LDADD = $(common_libs) $(core_libs) $(WXBASE_LIBS) + +ed2k_SOURCES = \ + ED2KLinkParser.cpp \ + MagnetURI.cpp \ + MuleCollection.cpp + +ed2k_CPPFLAGS = -DUSE_STD_STRING + +# on Win32 +if SYS_WIN32 +ed2k_LDADD = -lshlwapi +endif +# on Mac +if NEED_CORESERVICES +ed2k_LDFLAGS = -framework CoreServices +endif + +amulecmd_SOURCES = \ + TextClient.cpp \ + ExternalConnector.cpp \ + $(remote_common_sources) + +amulecmd_DEPENDENCIES = $(remote_common_deps) +amulecmd_CFLAGS = $(WXBASE_CFLAGS) $(common_flags) -DEC_REMOTE -DECSOCKET_USE_EVENTS=0 +amulecmd_CXXFLAGS = $(WXBASE_CXXFLAGS) $(common_flags) -DEC_REMOTE -DECSOCKET_USE_EVENTS=0 +#amulecmd_LDADD = $(WXBASE_LIBS) $(READLINE_LIBS) $(remote_common_libs) +amulecmd_LDADD = -Llibs/common -Llibs/ec/cpp -lmulecommon -lec \ + $(WXBASE_LIBS) $(READLINE_LIBS) $(ZLIB_LIBS) \ + $(RESOLV_LIB) $(BFD_LIB) + +noinst_HEADERS = \ + AddFriend.h \ + AsyncDNS.h \ + amule-remote-gui.h \ + amuleDlg.h \ + amule.h \ + amuleIPV4Address.h \ + ArchSpecific.h \ + BarShader.h \ + CatDialog.h \ + CFile.h \ + ChatSelector.h \ + ChatWnd.h \ + ClientCredits.h \ + ClientCreditsList.h \ + ClientDetailDialog.h \ + ClientListCtrl.h \ + ClientList.h \ + ClientTCPSocket.h \ + ClientUDPSocket.h \ + ColorFrameCtrl.h \ + Color.h \ + CommentDialog.h \ + CommentDialogLst.h \ + Constants.h \ + CryptoPP_Inc.h \ + DataToText.h \ + DeadSourceList.h \ + DirectoryTreeCtrl.h \ + DownloadListCtrl.h \ + DownloadQueue.h \ + ED2KLink.h \ + EditServerListDlg.h \ + EMSocket.h \ + EncryptedDatagramSocket.h \ + EncryptedStreamSocket.h \ + ExternalConnector.h \ + ExternalConn.h \ + FileDetailDialog.h \ + FileDetailListCtrl.h \ + FileLock.h \ + Friend.h \ + FriendListCtrl.h \ + FriendList.h \ + GetTickCount.h \ + GuiEvents.h \ + HTTPDownload.h \ + inetdownload.h \ + InternalEvents.h \ + IP2Country.h \ + IPFilter.h \ + KadDlg.h \ + KnownFile.h \ + KnownFileList.h \ + ListenSocket.h \ + Logger.h \ + MagnetURI.h \ + MD4Hash.h \ + MemFile.h \ + MuleCollection.h \ + MuleGifCtrl.h \ + MuleListCtrl.h \ + MuleNotebook.h \ + MuleTextCtrl.h \ + MuleThread.h \ + MuleTrayIcon.h \ + MuleUDPSocket.h \ + muuli_wdr.h \ + NetworkFunctions.h \ + OScopeCtrl.h \ + Observable.h \ + ObservableQueue.h \ + OtherFunctions.h \ + OtherStructs.h \ + Packet.h \ + Parser.hpp \ + PartFileConvert.h \ + PartFile.h \ + Preferences.h \ + PrefsUnifiedDlg.h \ + Proxy.h \ + RangeMap.h \ + RC4Encrypt.h \ + RLE.h \ + RandomFunctions.h \ + SafeFile.h \ + Scanner.h \ + ScopedPtr.h \ + SearchDlg.h \ + SearchExpr.h \ + SearchFile.h \ + SearchListCtrl.h \ + SearchList.h \ + ServerConnect.h \ + Server.h \ + ServerListCtrl.h \ + ServerList.h \ + ServerSocket.h \ + ServerUDPSocket.h \ + ServerWnd.h \ + SHA.h \ + SHAHashSet.h \ + SharedFileList.h \ + SharedFilesCtrl.h \ + SharedFilesWnd.h \ + StateMachine.h \ + StatisticsDlg.h \ + Statistics.h \ + StatTree.h \ + Tag.h \ + TerminationProcess.h \ + TerminationProcessAmuleweb.h \ + TextClient.h \ + ThreadScheduler.h \ + ThreadTasks.h \ + ThrottledSocket.h \ + Timer.h \ + TransferWnd.h \ + Types.h \ + updownclient.h \ + UploadBandwidthThrottler.h \ + UploadQueue.h \ + UPnP.h \ + UPnPCompatibility.h \ + UserEvents.h \ + extern/wxWidgets/listctrl.h \ + extern/upnp/ixml.h \ + extern/upnp/upnp.h + +MAINTAINERCLEANFILES = Makefile.in + +$(srcdir)/Parser.cpp: Parser.y + bison --debug -t -d -v -o $@ $(srcdir)/Parser.y + +if GENERATE_FLEX_HEADER +$(srcdir)/Scanner.cpp: Scanner.l Parser.cpp + $(LEX) --header-file=$(srcdir)/Scanner.h -o $@ $(srcdir)/Scanner.l +else +$(srcdir)/Scanner.cpp: Scanner.l Parser.cpp + $(LEX) -o$@ $(srcdir)/Scanner.l; \ + echo "// Empty file generated by a flex version unable to create headers" > $(srcdir)/Scanner.h +endif + +# Resources + +if NEED_RC + +SUFFIXES = .rc + +.rc.$(OBJEXT): + $(RC) $(RCFLAGS) -I$(top_srcdir) -D__WIN95__ -D__WIN32__ -D__GNUWIN32__ -O COFF -i "$<" -o "$@" + +nodist_amuled_SOURCES = amuled-version.rc +nodist_amulecmd_SOURCES = amulecmd-version.rc +nodist_ed2k_SOURCES = ed2k-version.rc +amule_LDADD += amulerc.$(OBJEXT) +amule_DEPENDENCIES += amulerc.$(OBJEXT) +amulegui_LDADD += amuleguirc.$(OBJEXT) +amulegui_DEPENDENCIES += amuleguirc.$(OBJEXT) + +amulerc.$(OBJEXT): $(srcdir)/../amule.rc amule-version.rc + cat $^ | \ + ( \ + abs_builddir=`pwd` ; \ + abs_top_srcdir=`cd $(top_srcdir) ; pwd` ; \ + cd $( "$@" + +amuled-version.rc: $(top_builddir)/version.rc + @sed -e 's/VER_FILEDESCRIPTION_STR/"aMule Daemon"/' \ + -e 's/VER_INTERNALNAME_STR/"amuled"/' \ + -e 's/VER_ORIGINALFILENAME_STR/"amuled$(EXEEXT)"/' "$<" > "$@" + +amulecmd-version.rc: $(top_builddir)/version.rc + @sed -e 's/VER_FILEDESCRIPTION_STR/"aMule Text Client"/' \ + -e 's/VER_INTERNALNAME_STR/"amulecmd"/' \ + -e 's/VER_ORIGINALFILENAME_STR/"amulecmd$(EXEEXT)"/' "$<" > "$@" + +amulegui-version.rc: $(top_builddir)/version.rc + @sed -e 's/VER_FILEDESCRIPTION_STR/"aMule Remote GUI (Experimental)"/' \ + -e 's/VER_INTERNALNAME_STR/"amulegui"/' \ + -e 's/VER_ORIGINALFILENAME_STR/"amulegui$(EXEEXT)"/' "$<" > "$@" + +ed2k-version.rc: $(top_builddir)/version.rc + @sed -e 's/VER_FILEDESCRIPTION_STR/"ED2K Links Handler"/' \ + -e 's/VER_INTERNALNAME_STR/"ed2k"/' \ + -e 's/VER_ORIGINALFILENAME_STR/"ed2k$(EXEEXT)"/' "$<" > "$@" + +CLEANFILES = *-version.rc + +endif + + +EXTRA__DIST__SUBDIRS = include remote-gui.net +include $(top_srcdir)/automake/dist-hook.am diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 00000000..34cf443d --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,4895 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + + +SOURCES = $(libmuleappcommon_a_SOURCES) $(libmuleappcore_a_SOURCES) $(libmuleappgui_a_SOURCES) $(amule_SOURCES) $(amulecmd_SOURCES) $(nodist_amulecmd_SOURCES) $(amuled_SOURCES) $(nodist_amuled_SOURCES) $(amulegui_SOURCES) $(ed2k_SOURCES) $(nodist_ed2k_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ + $(am__EXEEXT_4) $(am__EXEEXT_5) +@MONOLITHIC_TRUE@am__append_1 = amule +@COMPILE_CMD_TRUE@am__append_2 = amulecmd +@ED2K_TRUE@am__append_3 = ed2k +@AMULE_GUI_TRUE@am__append_4 = amulegui +@AMULE_DAEMON_TRUE@am__append_5 = amuled +@MONOLITHIC_TRUE@am__append_6 = libmuleappcore.a libmuleappgui.a \ +@MONOLITHIC_TRUE@ libmuleappcommon.a +@AMULE_DAEMON_TRUE@@MONOLITHIC_FALSE@am__append_7 = libmuleappcore.a +@AMULE_GUI_TRUE@@MONOLITHIC_FALSE@am__append_8 = libmuleappgui.a \ +@AMULE_GUI_TRUE@@MONOLITHIC_FALSE@ libmuleappcommon.a +@AMULE_DAEMON_TRUE@@AMULE_GUI_FALSE@@MONOLITHIC_FALSE@am__append_9 = libmuleappcommon.a +@ENABLE_UPNP_TRUE@am__append_10 = -DENABLE_UPNP=1 +@ENABLE_UPNP_TRUE@am__append_11 = -DENABLE_UPNP=1 +@ENABLE_UPNP_TRUE@am__append_12 = -DENABLE_UPNP=1 +@ENABLE_UPNP_TRUE@am__append_13 = -DENABLE_UPNP=1 +@ENABLE_UPNP_TRUE@am__append_14 = -DENABLE_UPNP=1 +@ENABLE_UPNP_TRUE@am__append_15 = -DENABLE_UPNP=1 +@ENABLE_UPNP_TRUE@am__append_16 = \ +@ENABLE_UPNP_TRUE@ UPnP.cpp \ +@ENABLE_UPNP_TRUE@ UPnPCompatibility.cpp + +@ENABLE_IP2COUNTRY_TRUE@am__append_17 = \ +@ENABLE_IP2COUNTRY_TRUE@ IP2Country.cpp + +@ENABLE_UPNP_TRUE@am__append_18 = -DENABLE_UPNP=1 +@ENABLE_IP2COUNTRY_TRUE@am__append_19 = -DENABLE_IP2COUNTRY=1 +@NEED_RC_TRUE@am__append_20 = amulerc.$(OBJEXT) +@NEED_RC_TRUE@am__append_21 = amulerc.$(OBJEXT) +@NEED_RC_TRUE@am__append_22 = amuleguirc.$(OBJEXT) +@NEED_RC_TRUE@am__append_23 = amuleguirc.$(OBJEXT) +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/automake/dist-hook.am +subdir = src +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +libmuleappcommon_a_AR = $(AR) $(ARFLAGS) +libmuleappcommon_a_LIBADD = +am_libmuleappcommon_a_OBJECTS = libmuleappcommon_a-CFile.$(OBJEXT) \ + libmuleappcommon_a-DataToText.$(OBJEXT) \ + libmuleappcommon_a-ED2KLink.$(OBJEXT) \ + libmuleappcommon_a-MagnetURI.$(OBJEXT) \ + libmuleappcommon_a-MemFile.$(OBJEXT) \ + libmuleappcommon_a-NetworkFunctions.$(OBJEXT) \ + libmuleappcommon_a-Packet.$(OBJEXT) \ + libmuleappcommon_a-RLE.$(OBJEXT) \ + libmuleappcommon_a-SafeFile.$(OBJEXT) \ + libmuleappcommon_a-SHA.$(OBJEXT) \ + libmuleappcommon_a-Tag.$(OBJEXT) \ + libmuleappcommon_a-Timer.$(OBJEXT) \ + libmuleappcommon_a-RandomFunctions.$(OBJEXT) \ + libmuleappcommon_a-UInt128.$(OBJEXT) +libmuleappcommon_a_OBJECTS = $(am_libmuleappcommon_a_OBJECTS) +libmuleappcore_a_AR = $(AR) $(ARFLAGS) +libmuleappcore_a_LIBADD = +am_libmuleappcore_a_OBJECTS = libmuleappcore_a-AsyncDNS.$(OBJEXT) \ + libmuleappcore_a-DeadSourceList.$(OBJEXT) \ + libmuleappcore_a-Scanner.$(OBJEXT) \ + libmuleappcore_a-Parser.$(OBJEXT) \ + libmuleappcore_a-LittleEndian.$(OBJEXT) \ + libmuleappcore_a-SearchManager.$(OBJEXT) \ + libmuleappcore_a-RoutingBin.$(OBJEXT) \ + libmuleappcore_a-StateMachine.$(OBJEXT) \ + libmuleappcore_a-ThreadScheduler.$(OBJEXT) +libmuleappcore_a_OBJECTS = $(am_libmuleappcore_a_OBJECTS) +libmuleappgui_a_AR = $(AR) $(ARFLAGS) +libmuleappgui_a_LIBADD = +am_libmuleappgui_a_OBJECTS = libmuleappgui_a-BarShader.$(OBJEXT) \ + libmuleappgui_a-ChatWnd.$(OBJEXT) \ + libmuleappgui_a-ColorFrameCtrl.$(OBJEXT) \ + libmuleappgui_a-CommentDialog.$(OBJEXT) \ + libmuleappgui_a-CommentDialogLst.$(OBJEXT) \ + libmuleappgui_a-DirectoryTreeCtrl.$(OBJEXT) \ + libmuleappgui_a-EditServerListDlg.$(OBJEXT) \ + libmuleappgui_a-listctrl.$(OBJEXT) \ + libmuleappgui_a-FileDetailListCtrl.$(OBJEXT) \ + libmuleappgui_a-MuleGifCtrl.$(OBJEXT) \ + libmuleappgui_a-MuleListCtrl.$(OBJEXT) \ + libmuleappgui_a-MuleNotebook.$(OBJEXT) \ + libmuleappgui_a-MuleTextCtrl.$(OBJEXT) \ + libmuleappgui_a-MuleCollection.$(OBJEXT) \ + libmuleappgui_a-muuli_wdr.$(OBJEXT) +libmuleappgui_a_OBJECTS = $(am_libmuleappgui_a_OBJECTS) +@MONOLITHIC_TRUE@am__EXEEXT_1 = amule$(EXEEXT) +@COMPILE_CMD_TRUE@am__EXEEXT_2 = amulecmd$(EXEEXT) +@ED2K_TRUE@am__EXEEXT_3 = ed2k$(EXEEXT) +@AMULE_GUI_TRUE@am__EXEEXT_4 = amulegui$(EXEEXT) +@AMULE_DAEMON_TRUE@am__EXEEXT_5 = amuled$(EXEEXT) +am__installdirs = "$(DESTDIR)$(bindir)" +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +PROGRAMS = $(bin_PROGRAMS) +am__amule_SOURCES_DIST = RC4Encrypt.cpp amule.cpp BaseClient.cpp \ + ClientList.cpp ClientCreditsList.cpp ClientTCPSocket.cpp \ + ClientUDPSocket.cpp DownloadClient.cpp DownloadQueue.cpp \ + ECSpecialCoreTags.cpp EMSocket.cpp EncryptedStreamSocket.cpp \ + EncryptedDatagramSocket.cpp ExternalConn.cpp Friend.cpp \ + FriendList.cpp HTTPDownload.cpp IPFilter.cpp KnownFileList.cpp \ + ListenSocket.cpp MuleUDPSocket.cpp SearchFile.cpp \ + SearchList.cpp ServerConnect.cpp ServerList.cpp \ + ServerSocket.cpp ServerUDPSocket.cpp SharedFileList.cpp \ + ThreadTasks.cpp UploadBandwidthThrottler.cpp UploadClient.cpp \ + UploadQueue.cpp kademlia/kademlia/Kademlia.cpp \ + kademlia/kademlia/Search.cpp kademlia/kademlia/Indexed.cpp \ + kademlia/net/KademliaUDPListener.cpp \ + kademlia/kademlia/Prefs.cpp kademlia/routing/RoutingZone.cpp \ + kademlia/routing/Contact.cpp UPnP.cpp UPnPCompatibility.cpp \ + amule-gui.cpp amuleDlg.cpp AddFriend.cpp CatDialog.cpp \ + ChatSelector.cpp ClientDetailDialog.cpp FileDetailDialog.cpp \ + KadDlg.cpp OScopeCtrl.cpp PartFileConvert.cpp \ + PrefsUnifiedDlg.cpp SearchDlg.cpp ServerWnd.cpp \ + SharedFilesWnd.cpp StatisticsDlg.cpp SearchListCtrl.cpp \ + DownloadListCtrl.cpp ClientListCtrl.cpp FriendListCtrl.cpp \ + ServerListCtrl.cpp SharedFilesCtrl.cpp MuleTrayIcon.cpp \ + TransferWnd.cpp IP2Country.cpp ClientCredits.cpp \ + ECSpecialMuleTags.cpp KnownFile.cpp GetTickCount.cpp \ + GuiEvents.cpp Logger.cpp PartFile.cpp Preferences.cpp \ + Proxy.cpp Server.cpp Statistics.cpp StatTree.cpp \ + SHAHashSet.cpp TerminationProcess.cpp \ + TerminationProcessAmuleweb.cpp UserEvents.cpp \ + OtherFunctions.cpp NetworkFunctions.cpp +@ENABLE_UPNP_TRUE@am__objects_1 = amule-UPnP.$(OBJEXT) \ +@ENABLE_UPNP_TRUE@ amule-UPnPCompatibility.$(OBJEXT) +am__objects_2 = amule-RC4Encrypt.$(OBJEXT) amule-amule.$(OBJEXT) \ + amule-BaseClient.$(OBJEXT) amule-ClientList.$(OBJEXT) \ + amule-ClientCreditsList.$(OBJEXT) \ + amule-ClientTCPSocket.$(OBJEXT) \ + amule-ClientUDPSocket.$(OBJEXT) amule-DownloadClient.$(OBJEXT) \ + amule-DownloadQueue.$(OBJEXT) \ + amule-ECSpecialCoreTags.$(OBJEXT) amule-EMSocket.$(OBJEXT) \ + amule-EncryptedStreamSocket.$(OBJEXT) \ + amule-EncryptedDatagramSocket.$(OBJEXT) \ + amule-ExternalConn.$(OBJEXT) amule-Friend.$(OBJEXT) \ + amule-FriendList.$(OBJEXT) amule-HTTPDownload.$(OBJEXT) \ + amule-IPFilter.$(OBJEXT) amule-KnownFileList.$(OBJEXT) \ + amule-ListenSocket.$(OBJEXT) amule-MuleUDPSocket.$(OBJEXT) \ + amule-SearchFile.$(OBJEXT) amule-SearchList.$(OBJEXT) \ + amule-ServerConnect.$(OBJEXT) amule-ServerList.$(OBJEXT) \ + amule-ServerSocket.$(OBJEXT) amule-ServerUDPSocket.$(OBJEXT) \ + amule-SharedFileList.$(OBJEXT) amule-ThreadTasks.$(OBJEXT) \ + amule-UploadBandwidthThrottler.$(OBJEXT) \ + amule-UploadClient.$(OBJEXT) amule-UploadQueue.$(OBJEXT) \ + amule-Kademlia.$(OBJEXT) amule-Search.$(OBJEXT) \ + amule-Indexed.$(OBJEXT) amule-KademliaUDPListener.$(OBJEXT) \ + amule-Prefs.$(OBJEXT) amule-RoutingZone.$(OBJEXT) \ + amule-Contact.$(OBJEXT) $(am__objects_1) +@ENABLE_IP2COUNTRY_TRUE@am__objects_3 = amule-IP2Country.$(OBJEXT) +am__objects_4 = amule-amule-gui.$(OBJEXT) amule-amuleDlg.$(OBJEXT) \ + amule-AddFriend.$(OBJEXT) amule-CatDialog.$(OBJEXT) \ + amule-ChatSelector.$(OBJEXT) \ + amule-ClientDetailDialog.$(OBJEXT) \ + amule-FileDetailDialog.$(OBJEXT) amule-KadDlg.$(OBJEXT) \ + amule-OScopeCtrl.$(OBJEXT) amule-PartFileConvert.$(OBJEXT) \ + amule-PrefsUnifiedDlg.$(OBJEXT) amule-SearchDlg.$(OBJEXT) \ + amule-ServerWnd.$(OBJEXT) amule-SharedFilesWnd.$(OBJEXT) \ + amule-StatisticsDlg.$(OBJEXT) amule-SearchListCtrl.$(OBJEXT) \ + amule-DownloadListCtrl.$(OBJEXT) \ + amule-ClientListCtrl.$(OBJEXT) amule-FriendListCtrl.$(OBJEXT) \ + amule-ServerListCtrl.$(OBJEXT) amule-SharedFilesCtrl.$(OBJEXT) \ + amule-MuleTrayIcon.$(OBJEXT) amule-TransferWnd.$(OBJEXT) \ + $(am__objects_3) +am__objects_5 = amule-OtherFunctions.$(OBJEXT) \ + amule-NetworkFunctions.$(OBJEXT) +am__objects_6 = amule-ClientCredits.$(OBJEXT) \ + amule-ECSpecialMuleTags.$(OBJEXT) amule-KnownFile.$(OBJEXT) \ + amule-GetTickCount.$(OBJEXT) amule-GuiEvents.$(OBJEXT) \ + amule-Logger.$(OBJEXT) amule-PartFile.$(OBJEXT) \ + amule-Preferences.$(OBJEXT) amule-Proxy.$(OBJEXT) \ + amule-Server.$(OBJEXT) amule-Statistics.$(OBJEXT) \ + amule-StatTree.$(OBJEXT) amule-SHAHashSet.$(OBJEXT) \ + amule-TerminationProcess.$(OBJEXT) \ + amule-TerminationProcessAmuleweb.$(OBJEXT) \ + amule-UserEvents.$(OBJEXT) $(am__objects_5) +am_amule_OBJECTS = $(am__objects_2) $(am__objects_4) $(am__objects_6) +amule_OBJECTS = $(am_amule_OBJECTS) +am__DEPENDENCIES_1 = +am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am__DEPENDENCIES_3 = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) +@NEED_RC_TRUE@am__DEPENDENCIES_4 = amulerc.$(OBJEXT) +am__objects_7 = amulecmd-OtherFunctions.$(OBJEXT) \ + amulecmd-NetworkFunctions.$(OBJEXT) +am_amulecmd_OBJECTS = amulecmd-TextClient.$(OBJEXT) \ + amulecmd-ExternalConnector.$(OBJEXT) $(am__objects_7) +@NEED_RC_TRUE@nodist_amulecmd_OBJECTS = amulecmd-version.$(OBJEXT) +amulecmd_OBJECTS = $(am_amulecmd_OBJECTS) $(nodist_amulecmd_OBJECTS) +am__amuled_SOURCES_DIST = amuled.cpp Timer.cpp RC4Encrypt.cpp \ + amule.cpp BaseClient.cpp ClientList.cpp ClientCreditsList.cpp \ + ClientTCPSocket.cpp ClientUDPSocket.cpp DownloadClient.cpp \ + DownloadQueue.cpp ECSpecialCoreTags.cpp EMSocket.cpp \ + EncryptedStreamSocket.cpp EncryptedDatagramSocket.cpp \ + ExternalConn.cpp Friend.cpp FriendList.cpp HTTPDownload.cpp \ + IPFilter.cpp KnownFileList.cpp ListenSocket.cpp \ + MuleUDPSocket.cpp SearchFile.cpp SearchList.cpp \ + ServerConnect.cpp ServerList.cpp ServerSocket.cpp \ + ServerUDPSocket.cpp SharedFileList.cpp ThreadTasks.cpp \ + UploadBandwidthThrottler.cpp UploadClient.cpp UploadQueue.cpp \ + kademlia/kademlia/Kademlia.cpp kademlia/kademlia/Search.cpp \ + kademlia/kademlia/Indexed.cpp \ + kademlia/net/KademliaUDPListener.cpp \ + kademlia/kademlia/Prefs.cpp kademlia/routing/RoutingZone.cpp \ + kademlia/routing/Contact.cpp UPnP.cpp UPnPCompatibility.cpp \ + ClientCredits.cpp ECSpecialMuleTags.cpp KnownFile.cpp \ + GetTickCount.cpp GuiEvents.cpp Logger.cpp PartFile.cpp \ + Preferences.cpp Proxy.cpp Server.cpp Statistics.cpp \ + StatTree.cpp SHAHashSet.cpp TerminationProcess.cpp \ + TerminationProcessAmuleweb.cpp UserEvents.cpp \ + OtherFunctions.cpp NetworkFunctions.cpp +@ENABLE_UPNP_TRUE@am__objects_8 = amuled-UPnP.$(OBJEXT) \ +@ENABLE_UPNP_TRUE@ amuled-UPnPCompatibility.$(OBJEXT) +am__objects_9 = amuled-RC4Encrypt.$(OBJEXT) amuled-amule.$(OBJEXT) \ + amuled-BaseClient.$(OBJEXT) amuled-ClientList.$(OBJEXT) \ + amuled-ClientCreditsList.$(OBJEXT) \ + amuled-ClientTCPSocket.$(OBJEXT) \ + amuled-ClientUDPSocket.$(OBJEXT) \ + amuled-DownloadClient.$(OBJEXT) amuled-DownloadQueue.$(OBJEXT) \ + amuled-ECSpecialCoreTags.$(OBJEXT) amuled-EMSocket.$(OBJEXT) \ + amuled-EncryptedStreamSocket.$(OBJEXT) \ + amuled-EncryptedDatagramSocket.$(OBJEXT) \ + amuled-ExternalConn.$(OBJEXT) amuled-Friend.$(OBJEXT) \ + amuled-FriendList.$(OBJEXT) amuled-HTTPDownload.$(OBJEXT) \ + amuled-IPFilter.$(OBJEXT) amuled-KnownFileList.$(OBJEXT) \ + amuled-ListenSocket.$(OBJEXT) amuled-MuleUDPSocket.$(OBJEXT) \ + amuled-SearchFile.$(OBJEXT) amuled-SearchList.$(OBJEXT) \ + amuled-ServerConnect.$(OBJEXT) amuled-ServerList.$(OBJEXT) \ + amuled-ServerSocket.$(OBJEXT) amuled-ServerUDPSocket.$(OBJEXT) \ + amuled-SharedFileList.$(OBJEXT) amuled-ThreadTasks.$(OBJEXT) \ + amuled-UploadBandwidthThrottler.$(OBJEXT) \ + amuled-UploadClient.$(OBJEXT) amuled-UploadQueue.$(OBJEXT) \ + amuled-Kademlia.$(OBJEXT) amuled-Search.$(OBJEXT) \ + amuled-Indexed.$(OBJEXT) amuled-KademliaUDPListener.$(OBJEXT) \ + amuled-Prefs.$(OBJEXT) amuled-RoutingZone.$(OBJEXT) \ + amuled-Contact.$(OBJEXT) $(am__objects_8) +am__objects_10 = amuled-OtherFunctions.$(OBJEXT) \ + amuled-NetworkFunctions.$(OBJEXT) +am__objects_11 = amuled-ClientCredits.$(OBJEXT) \ + amuled-ECSpecialMuleTags.$(OBJEXT) amuled-KnownFile.$(OBJEXT) \ + amuled-GetTickCount.$(OBJEXT) amuled-GuiEvents.$(OBJEXT) \ + amuled-Logger.$(OBJEXT) amuled-PartFile.$(OBJEXT) \ + amuled-Preferences.$(OBJEXT) amuled-Proxy.$(OBJEXT) \ + amuled-Server.$(OBJEXT) amuled-Statistics.$(OBJEXT) \ + amuled-StatTree.$(OBJEXT) amuled-SHAHashSet.$(OBJEXT) \ + amuled-TerminationProcess.$(OBJEXT) \ + amuled-TerminationProcessAmuleweb.$(OBJEXT) \ + amuled-UserEvents.$(OBJEXT) $(am__objects_10) +am_amuled_OBJECTS = amuled-amuled.$(OBJEXT) amuled-Timer.$(OBJEXT) \ + $(am__objects_9) $(am__objects_11) +@NEED_RC_TRUE@nodist_amuled_OBJECTS = amuled-version.$(OBJEXT) +amuled_OBJECTS = $(am_amuled_OBJECTS) $(nodist_amuled_OBJECTS) +am__amulegui_SOURCES_DIST = amule-remote-gui.cpp amule-gui.cpp \ + amuleDlg.cpp AddFriend.cpp CatDialog.cpp ChatSelector.cpp \ + ClientDetailDialog.cpp FileDetailDialog.cpp KadDlg.cpp \ + OScopeCtrl.cpp PartFileConvert.cpp PrefsUnifiedDlg.cpp \ + SearchDlg.cpp ServerWnd.cpp SharedFilesWnd.cpp \ + StatisticsDlg.cpp SearchListCtrl.cpp DownloadListCtrl.cpp \ + ClientListCtrl.cpp FriendListCtrl.cpp ServerListCtrl.cpp \ + SharedFilesCtrl.cpp MuleTrayIcon.cpp TransferWnd.cpp \ + IP2Country.cpp ClientCredits.cpp ECSpecialMuleTags.cpp \ + KnownFile.cpp GetTickCount.cpp GuiEvents.cpp Logger.cpp \ + PartFile.cpp Preferences.cpp Proxy.cpp Server.cpp \ + Statistics.cpp StatTree.cpp SHAHashSet.cpp \ + TerminationProcess.cpp TerminationProcessAmuleweb.cpp \ + UserEvents.cpp OtherFunctions.cpp NetworkFunctions.cpp +@ENABLE_IP2COUNTRY_TRUE@am__objects_12 = \ +@ENABLE_IP2COUNTRY_TRUE@ amulegui-IP2Country.$(OBJEXT) +am__objects_13 = amulegui-amule-gui.$(OBJEXT) \ + amulegui-amuleDlg.$(OBJEXT) amulegui-AddFriend.$(OBJEXT) \ + amulegui-CatDialog.$(OBJEXT) amulegui-ChatSelector.$(OBJEXT) \ + amulegui-ClientDetailDialog.$(OBJEXT) \ + amulegui-FileDetailDialog.$(OBJEXT) amulegui-KadDlg.$(OBJEXT) \ + amulegui-OScopeCtrl.$(OBJEXT) \ + amulegui-PartFileConvert.$(OBJEXT) \ + amulegui-PrefsUnifiedDlg.$(OBJEXT) \ + amulegui-SearchDlg.$(OBJEXT) amulegui-ServerWnd.$(OBJEXT) \ + amulegui-SharedFilesWnd.$(OBJEXT) \ + amulegui-StatisticsDlg.$(OBJEXT) \ + amulegui-SearchListCtrl.$(OBJEXT) \ + amulegui-DownloadListCtrl.$(OBJEXT) \ + amulegui-ClientListCtrl.$(OBJEXT) \ + amulegui-FriendListCtrl.$(OBJEXT) \ + amulegui-ServerListCtrl.$(OBJEXT) \ + amulegui-SharedFilesCtrl.$(OBJEXT) \ + amulegui-MuleTrayIcon.$(OBJEXT) amulegui-TransferWnd.$(OBJEXT) \ + $(am__objects_12) +am__objects_14 = amulegui-OtherFunctions.$(OBJEXT) \ + amulegui-NetworkFunctions.$(OBJEXT) +am__objects_15 = amulegui-ClientCredits.$(OBJEXT) \ + amulegui-ECSpecialMuleTags.$(OBJEXT) \ + amulegui-KnownFile.$(OBJEXT) amulegui-GetTickCount.$(OBJEXT) \ + amulegui-GuiEvents.$(OBJEXT) amulegui-Logger.$(OBJEXT) \ + amulegui-PartFile.$(OBJEXT) amulegui-Preferences.$(OBJEXT) \ + amulegui-Proxy.$(OBJEXT) amulegui-Server.$(OBJEXT) \ + amulegui-Statistics.$(OBJEXT) amulegui-StatTree.$(OBJEXT) \ + amulegui-SHAHashSet.$(OBJEXT) \ + amulegui-TerminationProcess.$(OBJEXT) \ + amulegui-TerminationProcessAmuleweb.$(OBJEXT) \ + amulegui-UserEvents.$(OBJEXT) $(am__objects_14) +am_amulegui_OBJECTS = amulegui-amule-remote-gui.$(OBJEXT) \ + $(am__objects_13) $(am__objects_15) +amulegui_OBJECTS = $(am_amulegui_OBJECTS) +@NEED_RC_TRUE@am__DEPENDENCIES_5 = amuleguirc.$(OBJEXT) +am_ed2k_OBJECTS = ed2k-ED2KLinkParser.$(OBJEXT) \ + ed2k-MagnetURI.$(OBJEXT) ed2k-MuleCollection.$(OBJEXT) +@NEED_RC_TRUE@nodist_ed2k_OBJECTS = ed2k-version.$(OBJEXT) +ed2k_OBJECTS = $(am_ed2k_OBJECTS) $(nodist_ed2k_OBJECTS) +ed2k_DEPENDENCIES = +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +SOURCES = $(libmuleappcommon_a_SOURCES) $(libmuleappcore_a_SOURCES) \ + $(libmuleappgui_a_SOURCES) $(amule_SOURCES) \ + $(amulecmd_SOURCES) $(nodist_amulecmd_SOURCES) \ + $(amuled_SOURCES) $(nodist_amuled_SOURCES) $(amulegui_SOURCES) \ + $(ed2k_SOURCES) $(nodist_ed2k_SOURCES) +DIST_SOURCES = $(libmuleappcommon_a_SOURCES) \ + $(libmuleappcore_a_SOURCES) $(libmuleappgui_a_SOURCES) \ + $(am__amule_SOURCES_DIST) $(amulecmd_SOURCES) \ + $(am__amuled_SOURCES_DIST) $(am__amulegui_SOURCES_DIST) \ + $(ed2k_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = libs utils pixmaps kademlia skins webserver +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +@WEB_TRUE@OPT_WEB = webserver +SUBDIRS = libs utils pixmaps kademlia skins $(OPT_WEB) +EXTRA_DIST = \ + aMule.xpm \ + Parser.y \ + Scanner.h.in \ + Scanner.l \ + muuli.wdr + + +# Sources +noinst_LIBRARIES = $(am__append_6) $(am__append_7) $(am__append_8) \ + $(am__append_9) + +# Common to core/gui/monolithic +libmuleappcommon_a_SOURCES = \ + CFile.cpp \ + DataToText.cpp \ + ED2KLink.cpp \ + MagnetURI.cpp \ + MemFile.cpp \ + NetworkFunctions.cpp \ + Packet.cpp \ + RLE.cpp \ + SafeFile.cpp \ + SHA.cpp \ + Tag.cpp \ + Timer.cpp \ + RandomFunctions.cpp \ + kademlia/utils/UInt128.cpp + +libmuleappcommon_a_CFLAGS = $(WXBASE_CFLAGS) -I$(srcdir)/libs \ + -I$(srcdir)/include $(am__append_10) +libmuleappcommon_a_CXXFLAGS = $(WXBASE_CXXFLAGS) -I$(srcdir)/libs \ + -I$(srcdir)/include $(am__append_11) + +# Common to core/monolithic +libmuleappcore_a_SOURCES = \ + AsyncDNS.cpp \ + DeadSourceList.cpp \ + Scanner.cpp \ + Parser.cpp \ + kademlia/utils/LittleEndian.cpp \ + kademlia/kademlia/SearchManager.cpp \ + kademlia/routing/RoutingBin.cpp \ + StateMachine.cpp \ + ThreadScheduler.cpp + +libmuleappcore_a_CFLAGS = $(WXBASE_CFLAGS) -I$(srcdir)/libs \ + -I$(srcdir)/include $(am__append_12) +libmuleappcore_a_CXXFLAGS = $(WXBASE_CXXFLAGS) -I$(srcdir)/libs \ + -I$(srcdir)/include $(am__append_13) + +# Common to gui/monolithic +libmuleappgui_a_SOURCES = \ + BarShader.cpp \ + ChatWnd.cpp \ + ColorFrameCtrl.cpp \ + CommentDialog.cpp \ + CommentDialogLst.cpp \ + DirectoryTreeCtrl.cpp \ + EditServerListDlg.cpp \ + extern/wxWidgets/listctrl.cpp \ + FileDetailListCtrl.cpp \ + MuleGifCtrl.cpp \ + MuleListCtrl.cpp \ + MuleNotebook.cpp \ + MuleTextCtrl.cpp \ + MuleCollection.cpp \ + muuli_wdr.cpp + +libmuleappgui_a_CFLAGS = $(WX_CXXFLAGS) -I$(srcdir)/libs \ + -I$(srcdir)/include $(am__append_14) +libmuleappgui_a_CXXFLAGS = $(WX_CXXFLAGS) -I$(srcdir)/libs \ + -I$(srcdir)/include $(am__append_15) +core_sources = RC4Encrypt.cpp amule.cpp BaseClient.cpp ClientList.cpp \ + ClientCreditsList.cpp ClientTCPSocket.cpp ClientUDPSocket.cpp \ + DownloadClient.cpp DownloadQueue.cpp ECSpecialCoreTags.cpp \ + EMSocket.cpp EncryptedStreamSocket.cpp \ + EncryptedDatagramSocket.cpp ExternalConn.cpp Friend.cpp \ + FriendList.cpp HTTPDownload.cpp IPFilter.cpp KnownFileList.cpp \ + ListenSocket.cpp MuleUDPSocket.cpp SearchFile.cpp \ + SearchList.cpp ServerConnect.cpp ServerList.cpp \ + ServerSocket.cpp ServerUDPSocket.cpp SharedFileList.cpp \ + ThreadTasks.cpp UploadBandwidthThrottler.cpp UploadClient.cpp \ + UploadQueue.cpp kademlia/kademlia/Kademlia.cpp \ + kademlia/kademlia/Search.cpp kademlia/kademlia/Indexed.cpp \ + kademlia/net/KademliaUDPListener.cpp \ + kademlia/kademlia/Prefs.cpp kademlia/routing/RoutingZone.cpp \ + kademlia/routing/Contact.cpp $(am__append_16) +gui_sources = amule-gui.cpp amuleDlg.cpp AddFriend.cpp CatDialog.cpp \ + ChatSelector.cpp ClientDetailDialog.cpp FileDetailDialog.cpp \ + KadDlg.cpp OScopeCtrl.cpp PartFileConvert.cpp \ + PrefsUnifiedDlg.cpp SearchDlg.cpp ServerWnd.cpp \ + SharedFilesWnd.cpp StatisticsDlg.cpp SearchListCtrl.cpp \ + DownloadListCtrl.cpp ClientListCtrl.cpp FriendListCtrl.cpp \ + ServerListCtrl.cpp SharedFilesCtrl.cpp MuleTrayIcon.cpp \ + TransferWnd.cpp $(am__append_17) +remote_common_sources = \ + OtherFunctions.cpp \ + NetworkFunctions.cpp + +common_sources = \ + ClientCredits.cpp \ + ECSpecialMuleTags.cpp \ + KnownFile.cpp \ + GetTickCount.cpp \ + GuiEvents.cpp \ + Logger.cpp \ + PartFile.cpp \ + Preferences.cpp \ + Proxy.cpp \ + Server.cpp \ + Statistics.cpp \ + StatTree.cpp \ + SHAHashSet.cpp \ + TerminationProcess.cpp \ + TerminationProcessAmuleweb.cpp \ + UserEvents.cpp \ + $(remote_common_sources) + + +# Libs +core_libs = -L. -lmuleappcore +gui_libs = -L. -lmuleappgui $(X11LIBS) $(WX_LIBS) +remote_common_libs = -Llibs/common -Llibs/ec/cpp -lmulecommon -lec $(ZLIB_LIBS) $(RESOLV_LIB) $(BFD_LIB) +common_libs = -L. -lmuleappcommon $(remote_common_libs) $(CRYPTOLIBS) +core_deps = libmuleappcore.a +gui_deps = libmuleappgui.a +remote_common_deps = libs/common/libmulecommon.a libs/ec/cpp/libec.a +common_deps = libmuleappcommon.a $(remote_common_deps) + +# +# Flags +# +core_flags = $(am__append_18) +gui_flags = $(WX_CXXFLAGS) $(XRCFLAGS) $(am__append_19) +common_flags = -I$(srcdir)/libs -Ilibs -I$(srcdir)/include + +# --------- Apps --------- +amulegui_SOURCES = \ + amule-remote-gui.cpp \ + $(gui_sources) \ + $(ec_sources) \ + $(common_sources) + +amule_SOURCES = \ + $(core_sources) \ + $(gui_sources) \ + $(ec_sources) \ + $(common_sources) + +amuled_SOURCES = \ + amuled.cpp \ + Timer.cpp \ + $(core_sources) \ + $(ec_sources) \ + $(common_sources) + +amule_DEPENDENCIES = $(common_deps) $(core_deps) $(gui_deps) \ + $(am__append_21) +amule_CFLAGS = $(core_flags) $(gui_flags) $(common_flags) +amule_CXXFLAGS = $(core_flags) $(gui_flags) $(common_flags) +amule_LDADD = $(common_libs) $(core_libs) $(gui_libs) $(am__append_20) +amulegui_DEPENDENCIES = $(common_deps) $(gui_deps) $(am__append_23) +amulegui_CFLAGS = $(gui_flags) $(common_flags) -DCLIENT_GUI -DEC_REMOTE +amulegui_CXXFLAGS = $(gui_flags) $(common_flags) -DCLIENT_GUI -DEC_REMOTE +amulegui_LDADD = $(gui_libs) $(common_libs) $(WXBASE_LIBS) \ + $(am__append_22) +amuled_DEPENDENCIES = $(core_deps) $(common_deps) +amuled_CFLAGS = $(WXBASE_CFLAGS) $(core_flags) $(common_flags) -DAMULE_DAEMON +amuled_CXXFLAGS = $(WXBASE_CXXFLAGS) $(core_flags) $(common_flags) -DAMULE_DAEMON +amuled_LDADD = $(common_libs) $(core_libs) $(WXBASE_LIBS) +ed2k_SOURCES = \ + ED2KLinkParser.cpp \ + MagnetURI.cpp \ + MuleCollection.cpp + +ed2k_CPPFLAGS = -DUSE_STD_STRING + +# on Win32 +@SYS_WIN32_TRUE@ed2k_LDADD = -lshlwapi +# on Mac +@NEED_CORESERVICES_TRUE@ed2k_LDFLAGS = -framework CoreServices +amulecmd_SOURCES = \ + TextClient.cpp \ + ExternalConnector.cpp \ + $(remote_common_sources) + +amulecmd_DEPENDENCIES = $(remote_common_deps) +amulecmd_CFLAGS = $(WXBASE_CFLAGS) $(common_flags) -DEC_REMOTE -DECSOCKET_USE_EVENTS=0 +amulecmd_CXXFLAGS = $(WXBASE_CXXFLAGS) $(common_flags) -DEC_REMOTE -DECSOCKET_USE_EVENTS=0 +#amulecmd_LDADD = $(WXBASE_LIBS) $(READLINE_LIBS) $(remote_common_libs) +amulecmd_LDADD = -Llibs/common -Llibs/ec/cpp -lmulecommon -lec \ + $(WXBASE_LIBS) $(READLINE_LIBS) $(ZLIB_LIBS) \ + $(RESOLV_LIB) $(BFD_LIB) + +noinst_HEADERS = \ + AddFriend.h \ + AsyncDNS.h \ + amule-remote-gui.h \ + amuleDlg.h \ + amule.h \ + amuleIPV4Address.h \ + ArchSpecific.h \ + BarShader.h \ + CatDialog.h \ + CFile.h \ + ChatSelector.h \ + ChatWnd.h \ + ClientCredits.h \ + ClientCreditsList.h \ + ClientDetailDialog.h \ + ClientListCtrl.h \ + ClientList.h \ + ClientTCPSocket.h \ + ClientUDPSocket.h \ + ColorFrameCtrl.h \ + Color.h \ + CommentDialog.h \ + CommentDialogLst.h \ + Constants.h \ + CryptoPP_Inc.h \ + DataToText.h \ + DeadSourceList.h \ + DirectoryTreeCtrl.h \ + DownloadListCtrl.h \ + DownloadQueue.h \ + ED2KLink.h \ + EditServerListDlg.h \ + EMSocket.h \ + EncryptedDatagramSocket.h \ + EncryptedStreamSocket.h \ + ExternalConnector.h \ + ExternalConn.h \ + FileDetailDialog.h \ + FileDetailListCtrl.h \ + FileLock.h \ + Friend.h \ + FriendListCtrl.h \ + FriendList.h \ + GetTickCount.h \ + GuiEvents.h \ + HTTPDownload.h \ + inetdownload.h \ + InternalEvents.h \ + IP2Country.h \ + IPFilter.h \ + KadDlg.h \ + KnownFile.h \ + KnownFileList.h \ + ListenSocket.h \ + Logger.h \ + MagnetURI.h \ + MD4Hash.h \ + MemFile.h \ + MuleCollection.h \ + MuleGifCtrl.h \ + MuleListCtrl.h \ + MuleNotebook.h \ + MuleTextCtrl.h \ + MuleThread.h \ + MuleTrayIcon.h \ + MuleUDPSocket.h \ + muuli_wdr.h \ + NetworkFunctions.h \ + OScopeCtrl.h \ + Observable.h \ + ObservableQueue.h \ + OtherFunctions.h \ + OtherStructs.h \ + Packet.h \ + Parser.hpp \ + PartFileConvert.h \ + PartFile.h \ + Preferences.h \ + PrefsUnifiedDlg.h \ + Proxy.h \ + RangeMap.h \ + RC4Encrypt.h \ + RLE.h \ + RandomFunctions.h \ + SafeFile.h \ + Scanner.h \ + ScopedPtr.h \ + SearchDlg.h \ + SearchExpr.h \ + SearchFile.h \ + SearchListCtrl.h \ + SearchList.h \ + ServerConnect.h \ + Server.h \ + ServerListCtrl.h \ + ServerList.h \ + ServerSocket.h \ + ServerUDPSocket.h \ + ServerWnd.h \ + SHA.h \ + SHAHashSet.h \ + SharedFileList.h \ + SharedFilesCtrl.h \ + SharedFilesWnd.h \ + StateMachine.h \ + StatisticsDlg.h \ + Statistics.h \ + StatTree.h \ + Tag.h \ + TerminationProcess.h \ + TerminationProcessAmuleweb.h \ + TextClient.h \ + ThreadScheduler.h \ + ThreadTasks.h \ + ThrottledSocket.h \ + Timer.h \ + TransferWnd.h \ + Types.h \ + updownclient.h \ + UploadBandwidthThrottler.h \ + UploadQueue.h \ + UPnP.h \ + UPnPCompatibility.h \ + UserEvents.h \ + extern/wxWidgets/listctrl.h \ + extern/upnp/ixml.h \ + extern/upnp/upnp.h + +MAINTAINERCLEANFILES = Makefile.in + +# Resources +@NEED_RC_TRUE@SUFFIXES = .rc +@NEED_RC_TRUE@nodist_amuled_SOURCES = amuled-version.rc +@NEED_RC_TRUE@nodist_amulecmd_SOURCES = amulecmd-version.rc +@NEED_RC_TRUE@nodist_ed2k_SOURCES = ed2k-version.rc +@NEED_RC_TRUE@CLEANFILES = *-version.rc +EXTRA__DIST__SUBDIRS = include remote-gui.net +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .rc .$(OBJEXT) .cpp .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/automake/dist-hook.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +libmuleappcommon.a: $(libmuleappcommon_a_OBJECTS) $(libmuleappcommon_a_DEPENDENCIES) + -rm -f libmuleappcommon.a + $(libmuleappcommon_a_AR) libmuleappcommon.a $(libmuleappcommon_a_OBJECTS) $(libmuleappcommon_a_LIBADD) + $(RANLIB) libmuleappcommon.a +libmuleappcore.a: $(libmuleappcore_a_OBJECTS) $(libmuleappcore_a_DEPENDENCIES) + -rm -f libmuleappcore.a + $(libmuleappcore_a_AR) libmuleappcore.a $(libmuleappcore_a_OBJECTS) $(libmuleappcore_a_LIBADD) + $(RANLIB) libmuleappcore.a +libmuleappgui.a: $(libmuleappgui_a_OBJECTS) $(libmuleappgui_a_DEPENDENCIES) + -rm -f libmuleappgui.a + $(libmuleappgui_a_AR) libmuleappgui.a $(libmuleappgui_a_OBJECTS) $(libmuleappgui_a_LIBADD) + $(RANLIB) libmuleappgui.a +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +amule$(EXEEXT): $(amule_OBJECTS) $(amule_DEPENDENCIES) + @rm -f amule$(EXEEXT) + $(CXXLINK) $(amule_LDFLAGS) $(amule_OBJECTS) $(amule_LDADD) $(LIBS) +amulecmd$(EXEEXT): $(amulecmd_OBJECTS) $(amulecmd_DEPENDENCIES) + @rm -f amulecmd$(EXEEXT) + $(CXXLINK) $(amulecmd_LDFLAGS) $(amulecmd_OBJECTS) $(amulecmd_LDADD) $(LIBS) +amuled$(EXEEXT): $(amuled_OBJECTS) $(amuled_DEPENDENCIES) + @rm -f amuled$(EXEEXT) + $(CXXLINK) $(amuled_LDFLAGS) $(amuled_OBJECTS) $(amuled_LDADD) $(LIBS) +amulegui$(EXEEXT): $(amulegui_OBJECTS) $(amulegui_DEPENDENCIES) + @rm -f amulegui$(EXEEXT) + $(CXXLINK) $(amulegui_LDFLAGS) $(amulegui_OBJECTS) $(amulegui_LDADD) $(LIBS) +ed2k$(EXEEXT): $(ed2k_OBJECTS) $(ed2k_DEPENDENCIES) + @rm -f ed2k$(EXEEXT) + $(CXXLINK) $(ed2k_LDFLAGS) $(ed2k_OBJECTS) $(ed2k_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-AddFriend.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-BaseClient.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-CatDialog.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-ChatSelector.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-ClientCredits.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-ClientCreditsList.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-ClientDetailDialog.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-ClientList.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-ClientListCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-ClientTCPSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-ClientUDPSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-Contact.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-DownloadClient.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-DownloadListCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-DownloadQueue.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-ECSpecialCoreTags.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-ECSpecialMuleTags.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-EMSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-EncryptedDatagramSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-EncryptedStreamSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-ExternalConn.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-FileDetailDialog.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-Friend.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-FriendList.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-FriendListCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-GetTickCount.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-GuiEvents.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-HTTPDownload.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-IP2Country.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-IPFilter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-Indexed.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-KadDlg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-Kademlia.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-KademliaUDPListener.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-KnownFile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-KnownFileList.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-ListenSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-Logger.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-MuleTrayIcon.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-MuleUDPSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-NetworkFunctions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-OScopeCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-OtherFunctions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-PartFile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-PartFileConvert.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-Preferences.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-Prefs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-PrefsUnifiedDlg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-Proxy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-RC4Encrypt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-RoutingZone.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-SHAHashSet.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-Search.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-SearchDlg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-SearchFile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-SearchList.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-SearchListCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-Server.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-ServerConnect.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-ServerList.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-ServerListCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-ServerSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-ServerUDPSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-ServerWnd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-SharedFileList.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-SharedFilesCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-SharedFilesWnd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-StatTree.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-Statistics.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-StatisticsDlg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-TerminationProcess.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-TerminationProcessAmuleweb.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-ThreadTasks.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-TransferWnd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-UPnP.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-UPnPCompatibility.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-UploadBandwidthThrottler.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-UploadClient.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-UploadQueue.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-UserEvents.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-amule-gui.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-amule.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amule-amuleDlg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulecmd-ExternalConnector.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulecmd-NetworkFunctions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulecmd-OtherFunctions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulecmd-TextClient.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-BaseClient.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-ClientCredits.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-ClientCreditsList.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-ClientList.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-ClientTCPSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-ClientUDPSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-Contact.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-DownloadClient.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-DownloadQueue.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-ECSpecialCoreTags.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-ECSpecialMuleTags.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-EMSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-EncryptedDatagramSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-EncryptedStreamSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-ExternalConn.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-Friend.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-FriendList.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-GetTickCount.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-GuiEvents.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-HTTPDownload.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-IPFilter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-Indexed.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-Kademlia.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-KademliaUDPListener.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-KnownFile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-KnownFileList.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-ListenSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-Logger.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-MuleUDPSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-NetworkFunctions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-OtherFunctions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-PartFile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-Preferences.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-Prefs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-Proxy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-RC4Encrypt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-RoutingZone.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-SHAHashSet.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-Search.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-SearchFile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-SearchList.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-Server.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-ServerConnect.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-ServerList.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-ServerSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-ServerUDPSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-SharedFileList.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-StatTree.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-Statistics.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-TerminationProcess.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-TerminationProcessAmuleweb.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-ThreadTasks.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-Timer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-UPnP.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-UPnPCompatibility.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-UploadBandwidthThrottler.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-UploadClient.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-UploadQueue.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-UserEvents.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-amule.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuled-amuled.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-AddFriend.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-CatDialog.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-ChatSelector.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-ClientCredits.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-ClientDetailDialog.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-ClientListCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-DownloadListCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-ECSpecialMuleTags.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-FileDetailDialog.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-FriendListCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-GetTickCount.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-GuiEvents.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-IP2Country.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-KadDlg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-KnownFile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-Logger.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-MuleTrayIcon.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-NetworkFunctions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-OScopeCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-OtherFunctions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-PartFile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-PartFileConvert.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-Preferences.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-PrefsUnifiedDlg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-Proxy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-SHAHashSet.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-SearchDlg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-SearchListCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-Server.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-ServerListCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-ServerWnd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-SharedFilesCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-SharedFilesWnd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-StatTree.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-Statistics.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-StatisticsDlg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-TerminationProcess.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-TerminationProcessAmuleweb.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-TransferWnd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-UserEvents.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-amule-gui.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-amule-remote-gui.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amulegui-amuleDlg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ed2k-ED2KLinkParser.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ed2k-MagnetURI.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ed2k-MuleCollection.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcommon_a-CFile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcommon_a-DataToText.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcommon_a-ED2KLink.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcommon_a-MagnetURI.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcommon_a-MemFile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcommon_a-NetworkFunctions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcommon_a-Packet.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcommon_a-RLE.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcommon_a-RandomFunctions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcommon_a-SHA.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcommon_a-SafeFile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcommon_a-Tag.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcommon_a-Timer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcommon_a-UInt128.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcore_a-AsyncDNS.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcore_a-DeadSourceList.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcore_a-LittleEndian.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcore_a-Parser.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcore_a-RoutingBin.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcore_a-Scanner.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcore_a-SearchManager.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcore_a-StateMachine.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappcore_a-ThreadScheduler.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappgui_a-BarShader.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappgui_a-ChatWnd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappgui_a-ColorFrameCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappgui_a-CommentDialog.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappgui_a-CommentDialogLst.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappgui_a-DirectoryTreeCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappgui_a-EditServerListDlg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappgui_a-FileDetailListCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappgui_a-MuleCollection.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappgui_a-MuleGifCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappgui_a-MuleListCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappgui_a-MuleNotebook.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappgui_a-MuleTextCtrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappgui_a-listctrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleappgui_a-muuli_wdr.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +libmuleappcommon_a-CFile.o: CFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-CFile.o -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-CFile.Tpo" -c -o libmuleappcommon_a-CFile.o `test -f 'CFile.cpp' || echo '$(srcdir)/'`CFile.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-CFile.Tpo" "$(DEPDIR)/libmuleappcommon_a-CFile.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-CFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='CFile.cpp' object='libmuleappcommon_a-CFile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-CFile.o `test -f 'CFile.cpp' || echo '$(srcdir)/'`CFile.cpp + +libmuleappcommon_a-CFile.obj: CFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-CFile.obj -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-CFile.Tpo" -c -o libmuleappcommon_a-CFile.obj `if test -f 'CFile.cpp'; then $(CYGPATH_W) 'CFile.cpp'; else $(CYGPATH_W) '$(srcdir)/CFile.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-CFile.Tpo" "$(DEPDIR)/libmuleappcommon_a-CFile.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-CFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='CFile.cpp' object='libmuleappcommon_a-CFile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-CFile.obj `if test -f 'CFile.cpp'; then $(CYGPATH_W) 'CFile.cpp'; else $(CYGPATH_W) '$(srcdir)/CFile.cpp'; fi` + +libmuleappcommon_a-DataToText.o: DataToText.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-DataToText.o -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-DataToText.Tpo" -c -o libmuleappcommon_a-DataToText.o `test -f 'DataToText.cpp' || echo '$(srcdir)/'`DataToText.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-DataToText.Tpo" "$(DEPDIR)/libmuleappcommon_a-DataToText.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-DataToText.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DataToText.cpp' object='libmuleappcommon_a-DataToText.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-DataToText.o `test -f 'DataToText.cpp' || echo '$(srcdir)/'`DataToText.cpp + +libmuleappcommon_a-DataToText.obj: DataToText.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-DataToText.obj -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-DataToText.Tpo" -c -o libmuleappcommon_a-DataToText.obj `if test -f 'DataToText.cpp'; then $(CYGPATH_W) 'DataToText.cpp'; else $(CYGPATH_W) '$(srcdir)/DataToText.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-DataToText.Tpo" "$(DEPDIR)/libmuleappcommon_a-DataToText.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-DataToText.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DataToText.cpp' object='libmuleappcommon_a-DataToText.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-DataToText.obj `if test -f 'DataToText.cpp'; then $(CYGPATH_W) 'DataToText.cpp'; else $(CYGPATH_W) '$(srcdir)/DataToText.cpp'; fi` + +libmuleappcommon_a-ED2KLink.o: ED2KLink.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-ED2KLink.o -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-ED2KLink.Tpo" -c -o libmuleappcommon_a-ED2KLink.o `test -f 'ED2KLink.cpp' || echo '$(srcdir)/'`ED2KLink.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-ED2KLink.Tpo" "$(DEPDIR)/libmuleappcommon_a-ED2KLink.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-ED2KLink.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ED2KLink.cpp' object='libmuleappcommon_a-ED2KLink.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-ED2KLink.o `test -f 'ED2KLink.cpp' || echo '$(srcdir)/'`ED2KLink.cpp + +libmuleappcommon_a-ED2KLink.obj: ED2KLink.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-ED2KLink.obj -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-ED2KLink.Tpo" -c -o libmuleappcommon_a-ED2KLink.obj `if test -f 'ED2KLink.cpp'; then $(CYGPATH_W) 'ED2KLink.cpp'; else $(CYGPATH_W) '$(srcdir)/ED2KLink.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-ED2KLink.Tpo" "$(DEPDIR)/libmuleappcommon_a-ED2KLink.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-ED2KLink.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ED2KLink.cpp' object='libmuleappcommon_a-ED2KLink.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-ED2KLink.obj `if test -f 'ED2KLink.cpp'; then $(CYGPATH_W) 'ED2KLink.cpp'; else $(CYGPATH_W) '$(srcdir)/ED2KLink.cpp'; fi` + +libmuleappcommon_a-MagnetURI.o: MagnetURI.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-MagnetURI.o -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-MagnetURI.Tpo" -c -o libmuleappcommon_a-MagnetURI.o `test -f 'MagnetURI.cpp' || echo '$(srcdir)/'`MagnetURI.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-MagnetURI.Tpo" "$(DEPDIR)/libmuleappcommon_a-MagnetURI.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-MagnetURI.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MagnetURI.cpp' object='libmuleappcommon_a-MagnetURI.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-MagnetURI.o `test -f 'MagnetURI.cpp' || echo '$(srcdir)/'`MagnetURI.cpp + +libmuleappcommon_a-MagnetURI.obj: MagnetURI.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-MagnetURI.obj -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-MagnetURI.Tpo" -c -o libmuleappcommon_a-MagnetURI.obj `if test -f 'MagnetURI.cpp'; then $(CYGPATH_W) 'MagnetURI.cpp'; else $(CYGPATH_W) '$(srcdir)/MagnetURI.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-MagnetURI.Tpo" "$(DEPDIR)/libmuleappcommon_a-MagnetURI.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-MagnetURI.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MagnetURI.cpp' object='libmuleappcommon_a-MagnetURI.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-MagnetURI.obj `if test -f 'MagnetURI.cpp'; then $(CYGPATH_W) 'MagnetURI.cpp'; else $(CYGPATH_W) '$(srcdir)/MagnetURI.cpp'; fi` + +libmuleappcommon_a-MemFile.o: MemFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-MemFile.o -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-MemFile.Tpo" -c -o libmuleappcommon_a-MemFile.o `test -f 'MemFile.cpp' || echo '$(srcdir)/'`MemFile.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-MemFile.Tpo" "$(DEPDIR)/libmuleappcommon_a-MemFile.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-MemFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MemFile.cpp' object='libmuleappcommon_a-MemFile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-MemFile.o `test -f 'MemFile.cpp' || echo '$(srcdir)/'`MemFile.cpp + +libmuleappcommon_a-MemFile.obj: MemFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-MemFile.obj -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-MemFile.Tpo" -c -o libmuleappcommon_a-MemFile.obj `if test -f 'MemFile.cpp'; then $(CYGPATH_W) 'MemFile.cpp'; else $(CYGPATH_W) '$(srcdir)/MemFile.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-MemFile.Tpo" "$(DEPDIR)/libmuleappcommon_a-MemFile.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-MemFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MemFile.cpp' object='libmuleappcommon_a-MemFile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-MemFile.obj `if test -f 'MemFile.cpp'; then $(CYGPATH_W) 'MemFile.cpp'; else $(CYGPATH_W) '$(srcdir)/MemFile.cpp'; fi` + +libmuleappcommon_a-NetworkFunctions.o: NetworkFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-NetworkFunctions.o -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-NetworkFunctions.Tpo" -c -o libmuleappcommon_a-NetworkFunctions.o `test -f 'NetworkFunctions.cpp' || echo '$(srcdir)/'`NetworkFunctions.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-NetworkFunctions.Tpo" "$(DEPDIR)/libmuleappcommon_a-NetworkFunctions.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-NetworkFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='NetworkFunctions.cpp' object='libmuleappcommon_a-NetworkFunctions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-NetworkFunctions.o `test -f 'NetworkFunctions.cpp' || echo '$(srcdir)/'`NetworkFunctions.cpp + +libmuleappcommon_a-NetworkFunctions.obj: NetworkFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-NetworkFunctions.obj -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-NetworkFunctions.Tpo" -c -o libmuleappcommon_a-NetworkFunctions.obj `if test -f 'NetworkFunctions.cpp'; then $(CYGPATH_W) 'NetworkFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/NetworkFunctions.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-NetworkFunctions.Tpo" "$(DEPDIR)/libmuleappcommon_a-NetworkFunctions.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-NetworkFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='NetworkFunctions.cpp' object='libmuleappcommon_a-NetworkFunctions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-NetworkFunctions.obj `if test -f 'NetworkFunctions.cpp'; then $(CYGPATH_W) 'NetworkFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/NetworkFunctions.cpp'; fi` + +libmuleappcommon_a-Packet.o: Packet.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-Packet.o -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-Packet.Tpo" -c -o libmuleappcommon_a-Packet.o `test -f 'Packet.cpp' || echo '$(srcdir)/'`Packet.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-Packet.Tpo" "$(DEPDIR)/libmuleappcommon_a-Packet.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-Packet.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Packet.cpp' object='libmuleappcommon_a-Packet.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-Packet.o `test -f 'Packet.cpp' || echo '$(srcdir)/'`Packet.cpp + +libmuleappcommon_a-Packet.obj: Packet.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-Packet.obj -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-Packet.Tpo" -c -o libmuleappcommon_a-Packet.obj `if test -f 'Packet.cpp'; then $(CYGPATH_W) 'Packet.cpp'; else $(CYGPATH_W) '$(srcdir)/Packet.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-Packet.Tpo" "$(DEPDIR)/libmuleappcommon_a-Packet.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-Packet.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Packet.cpp' object='libmuleappcommon_a-Packet.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-Packet.obj `if test -f 'Packet.cpp'; then $(CYGPATH_W) 'Packet.cpp'; else $(CYGPATH_W) '$(srcdir)/Packet.cpp'; fi` + +libmuleappcommon_a-RLE.o: RLE.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-RLE.o -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-RLE.Tpo" -c -o libmuleappcommon_a-RLE.o `test -f 'RLE.cpp' || echo '$(srcdir)/'`RLE.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-RLE.Tpo" "$(DEPDIR)/libmuleappcommon_a-RLE.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-RLE.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='RLE.cpp' object='libmuleappcommon_a-RLE.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-RLE.o `test -f 'RLE.cpp' || echo '$(srcdir)/'`RLE.cpp + +libmuleappcommon_a-RLE.obj: RLE.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-RLE.obj -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-RLE.Tpo" -c -o libmuleappcommon_a-RLE.obj `if test -f 'RLE.cpp'; then $(CYGPATH_W) 'RLE.cpp'; else $(CYGPATH_W) '$(srcdir)/RLE.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-RLE.Tpo" "$(DEPDIR)/libmuleappcommon_a-RLE.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-RLE.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='RLE.cpp' object='libmuleappcommon_a-RLE.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-RLE.obj `if test -f 'RLE.cpp'; then $(CYGPATH_W) 'RLE.cpp'; else $(CYGPATH_W) '$(srcdir)/RLE.cpp'; fi` + +libmuleappcommon_a-SafeFile.o: SafeFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-SafeFile.o -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-SafeFile.Tpo" -c -o libmuleappcommon_a-SafeFile.o `test -f 'SafeFile.cpp' || echo '$(srcdir)/'`SafeFile.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-SafeFile.Tpo" "$(DEPDIR)/libmuleappcommon_a-SafeFile.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-SafeFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SafeFile.cpp' object='libmuleappcommon_a-SafeFile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-SafeFile.o `test -f 'SafeFile.cpp' || echo '$(srcdir)/'`SafeFile.cpp + +libmuleappcommon_a-SafeFile.obj: SafeFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-SafeFile.obj -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-SafeFile.Tpo" -c -o libmuleappcommon_a-SafeFile.obj `if test -f 'SafeFile.cpp'; then $(CYGPATH_W) 'SafeFile.cpp'; else $(CYGPATH_W) '$(srcdir)/SafeFile.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-SafeFile.Tpo" "$(DEPDIR)/libmuleappcommon_a-SafeFile.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-SafeFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SafeFile.cpp' object='libmuleappcommon_a-SafeFile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-SafeFile.obj `if test -f 'SafeFile.cpp'; then $(CYGPATH_W) 'SafeFile.cpp'; else $(CYGPATH_W) '$(srcdir)/SafeFile.cpp'; fi` + +libmuleappcommon_a-SHA.o: SHA.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-SHA.o -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-SHA.Tpo" -c -o libmuleappcommon_a-SHA.o `test -f 'SHA.cpp' || echo '$(srcdir)/'`SHA.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-SHA.Tpo" "$(DEPDIR)/libmuleappcommon_a-SHA.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-SHA.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SHA.cpp' object='libmuleappcommon_a-SHA.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-SHA.o `test -f 'SHA.cpp' || echo '$(srcdir)/'`SHA.cpp + +libmuleappcommon_a-SHA.obj: SHA.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-SHA.obj -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-SHA.Tpo" -c -o libmuleappcommon_a-SHA.obj `if test -f 'SHA.cpp'; then $(CYGPATH_W) 'SHA.cpp'; else $(CYGPATH_W) '$(srcdir)/SHA.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-SHA.Tpo" "$(DEPDIR)/libmuleappcommon_a-SHA.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-SHA.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SHA.cpp' object='libmuleappcommon_a-SHA.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-SHA.obj `if test -f 'SHA.cpp'; then $(CYGPATH_W) 'SHA.cpp'; else $(CYGPATH_W) '$(srcdir)/SHA.cpp'; fi` + +libmuleappcommon_a-Tag.o: Tag.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-Tag.o -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-Tag.Tpo" -c -o libmuleappcommon_a-Tag.o `test -f 'Tag.cpp' || echo '$(srcdir)/'`Tag.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-Tag.Tpo" "$(DEPDIR)/libmuleappcommon_a-Tag.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-Tag.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Tag.cpp' object='libmuleappcommon_a-Tag.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-Tag.o `test -f 'Tag.cpp' || echo '$(srcdir)/'`Tag.cpp + +libmuleappcommon_a-Tag.obj: Tag.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-Tag.obj -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-Tag.Tpo" -c -o libmuleappcommon_a-Tag.obj `if test -f 'Tag.cpp'; then $(CYGPATH_W) 'Tag.cpp'; else $(CYGPATH_W) '$(srcdir)/Tag.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-Tag.Tpo" "$(DEPDIR)/libmuleappcommon_a-Tag.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-Tag.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Tag.cpp' object='libmuleappcommon_a-Tag.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-Tag.obj `if test -f 'Tag.cpp'; then $(CYGPATH_W) 'Tag.cpp'; else $(CYGPATH_W) '$(srcdir)/Tag.cpp'; fi` + +libmuleappcommon_a-Timer.o: Timer.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-Timer.o -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-Timer.Tpo" -c -o libmuleappcommon_a-Timer.o `test -f 'Timer.cpp' || echo '$(srcdir)/'`Timer.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-Timer.Tpo" "$(DEPDIR)/libmuleappcommon_a-Timer.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-Timer.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Timer.cpp' object='libmuleappcommon_a-Timer.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-Timer.o `test -f 'Timer.cpp' || echo '$(srcdir)/'`Timer.cpp + +libmuleappcommon_a-Timer.obj: Timer.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-Timer.obj -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-Timer.Tpo" -c -o libmuleappcommon_a-Timer.obj `if test -f 'Timer.cpp'; then $(CYGPATH_W) 'Timer.cpp'; else $(CYGPATH_W) '$(srcdir)/Timer.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-Timer.Tpo" "$(DEPDIR)/libmuleappcommon_a-Timer.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-Timer.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Timer.cpp' object='libmuleappcommon_a-Timer.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-Timer.obj `if test -f 'Timer.cpp'; then $(CYGPATH_W) 'Timer.cpp'; else $(CYGPATH_W) '$(srcdir)/Timer.cpp'; fi` + +libmuleappcommon_a-RandomFunctions.o: RandomFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-RandomFunctions.o -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-RandomFunctions.Tpo" -c -o libmuleappcommon_a-RandomFunctions.o `test -f 'RandomFunctions.cpp' || echo '$(srcdir)/'`RandomFunctions.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-RandomFunctions.Tpo" "$(DEPDIR)/libmuleappcommon_a-RandomFunctions.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-RandomFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='RandomFunctions.cpp' object='libmuleappcommon_a-RandomFunctions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-RandomFunctions.o `test -f 'RandomFunctions.cpp' || echo '$(srcdir)/'`RandomFunctions.cpp + +libmuleappcommon_a-RandomFunctions.obj: RandomFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-RandomFunctions.obj -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-RandomFunctions.Tpo" -c -o libmuleappcommon_a-RandomFunctions.obj `if test -f 'RandomFunctions.cpp'; then $(CYGPATH_W) 'RandomFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/RandomFunctions.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-RandomFunctions.Tpo" "$(DEPDIR)/libmuleappcommon_a-RandomFunctions.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-RandomFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='RandomFunctions.cpp' object='libmuleappcommon_a-RandomFunctions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-RandomFunctions.obj `if test -f 'RandomFunctions.cpp'; then $(CYGPATH_W) 'RandomFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/RandomFunctions.cpp'; fi` + +libmuleappcommon_a-UInt128.o: kademlia/utils/UInt128.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-UInt128.o -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-UInt128.Tpo" -c -o libmuleappcommon_a-UInt128.o `test -f 'kademlia/utils/UInt128.cpp' || echo '$(srcdir)/'`kademlia/utils/UInt128.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-UInt128.Tpo" "$(DEPDIR)/libmuleappcommon_a-UInt128.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-UInt128.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/utils/UInt128.cpp' object='libmuleappcommon_a-UInt128.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-UInt128.o `test -f 'kademlia/utils/UInt128.cpp' || echo '$(srcdir)/'`kademlia/utils/UInt128.cpp + +libmuleappcommon_a-UInt128.obj: kademlia/utils/UInt128.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcommon_a-UInt128.obj -MD -MP -MF "$(DEPDIR)/libmuleappcommon_a-UInt128.Tpo" -c -o libmuleappcommon_a-UInt128.obj `if test -f 'kademlia/utils/UInt128.cpp'; then $(CYGPATH_W) 'kademlia/utils/UInt128.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/utils/UInt128.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcommon_a-UInt128.Tpo" "$(DEPDIR)/libmuleappcommon_a-UInt128.Po"; else rm -f "$(DEPDIR)/libmuleappcommon_a-UInt128.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/utils/UInt128.cpp' object='libmuleappcommon_a-UInt128.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcommon_a-UInt128.obj `if test -f 'kademlia/utils/UInt128.cpp'; then $(CYGPATH_W) 'kademlia/utils/UInt128.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/utils/UInt128.cpp'; fi` + +libmuleappcore_a-AsyncDNS.o: AsyncDNS.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcore_a-AsyncDNS.o -MD -MP -MF "$(DEPDIR)/libmuleappcore_a-AsyncDNS.Tpo" -c -o libmuleappcore_a-AsyncDNS.o `test -f 'AsyncDNS.cpp' || echo '$(srcdir)/'`AsyncDNS.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcore_a-AsyncDNS.Tpo" "$(DEPDIR)/libmuleappcore_a-AsyncDNS.Po"; else rm -f "$(DEPDIR)/libmuleappcore_a-AsyncDNS.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='AsyncDNS.cpp' object='libmuleappcore_a-AsyncDNS.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcore_a-AsyncDNS.o `test -f 'AsyncDNS.cpp' || echo '$(srcdir)/'`AsyncDNS.cpp + +libmuleappcore_a-AsyncDNS.obj: AsyncDNS.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcore_a-AsyncDNS.obj -MD -MP -MF "$(DEPDIR)/libmuleappcore_a-AsyncDNS.Tpo" -c -o libmuleappcore_a-AsyncDNS.obj `if test -f 'AsyncDNS.cpp'; then $(CYGPATH_W) 'AsyncDNS.cpp'; else $(CYGPATH_W) '$(srcdir)/AsyncDNS.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcore_a-AsyncDNS.Tpo" "$(DEPDIR)/libmuleappcore_a-AsyncDNS.Po"; else rm -f "$(DEPDIR)/libmuleappcore_a-AsyncDNS.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='AsyncDNS.cpp' object='libmuleappcore_a-AsyncDNS.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcore_a-AsyncDNS.obj `if test -f 'AsyncDNS.cpp'; then $(CYGPATH_W) 'AsyncDNS.cpp'; else $(CYGPATH_W) '$(srcdir)/AsyncDNS.cpp'; fi` + +libmuleappcore_a-DeadSourceList.o: DeadSourceList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcore_a-DeadSourceList.o -MD -MP -MF "$(DEPDIR)/libmuleappcore_a-DeadSourceList.Tpo" -c -o libmuleappcore_a-DeadSourceList.o `test -f 'DeadSourceList.cpp' || echo '$(srcdir)/'`DeadSourceList.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcore_a-DeadSourceList.Tpo" "$(DEPDIR)/libmuleappcore_a-DeadSourceList.Po"; else rm -f "$(DEPDIR)/libmuleappcore_a-DeadSourceList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DeadSourceList.cpp' object='libmuleappcore_a-DeadSourceList.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcore_a-DeadSourceList.o `test -f 'DeadSourceList.cpp' || echo '$(srcdir)/'`DeadSourceList.cpp + +libmuleappcore_a-DeadSourceList.obj: DeadSourceList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcore_a-DeadSourceList.obj -MD -MP -MF "$(DEPDIR)/libmuleappcore_a-DeadSourceList.Tpo" -c -o libmuleappcore_a-DeadSourceList.obj `if test -f 'DeadSourceList.cpp'; then $(CYGPATH_W) 'DeadSourceList.cpp'; else $(CYGPATH_W) '$(srcdir)/DeadSourceList.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcore_a-DeadSourceList.Tpo" "$(DEPDIR)/libmuleappcore_a-DeadSourceList.Po"; else rm -f "$(DEPDIR)/libmuleappcore_a-DeadSourceList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DeadSourceList.cpp' object='libmuleappcore_a-DeadSourceList.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcore_a-DeadSourceList.obj `if test -f 'DeadSourceList.cpp'; then $(CYGPATH_W) 'DeadSourceList.cpp'; else $(CYGPATH_W) '$(srcdir)/DeadSourceList.cpp'; fi` + +libmuleappcore_a-Scanner.o: Scanner.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcore_a-Scanner.o -MD -MP -MF "$(DEPDIR)/libmuleappcore_a-Scanner.Tpo" -c -o libmuleappcore_a-Scanner.o `test -f 'Scanner.cpp' || echo '$(srcdir)/'`Scanner.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcore_a-Scanner.Tpo" "$(DEPDIR)/libmuleappcore_a-Scanner.Po"; else rm -f "$(DEPDIR)/libmuleappcore_a-Scanner.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Scanner.cpp' object='libmuleappcore_a-Scanner.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcore_a-Scanner.o `test -f 'Scanner.cpp' || echo '$(srcdir)/'`Scanner.cpp + +libmuleappcore_a-Scanner.obj: Scanner.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcore_a-Scanner.obj -MD -MP -MF "$(DEPDIR)/libmuleappcore_a-Scanner.Tpo" -c -o libmuleappcore_a-Scanner.obj `if test -f 'Scanner.cpp'; then $(CYGPATH_W) 'Scanner.cpp'; else $(CYGPATH_W) '$(srcdir)/Scanner.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcore_a-Scanner.Tpo" "$(DEPDIR)/libmuleappcore_a-Scanner.Po"; else rm -f "$(DEPDIR)/libmuleappcore_a-Scanner.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Scanner.cpp' object='libmuleappcore_a-Scanner.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcore_a-Scanner.obj `if test -f 'Scanner.cpp'; then $(CYGPATH_W) 'Scanner.cpp'; else $(CYGPATH_W) '$(srcdir)/Scanner.cpp'; fi` + +libmuleappcore_a-Parser.o: Parser.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcore_a-Parser.o -MD -MP -MF "$(DEPDIR)/libmuleappcore_a-Parser.Tpo" -c -o libmuleappcore_a-Parser.o `test -f 'Parser.cpp' || echo '$(srcdir)/'`Parser.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcore_a-Parser.Tpo" "$(DEPDIR)/libmuleappcore_a-Parser.Po"; else rm -f "$(DEPDIR)/libmuleappcore_a-Parser.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Parser.cpp' object='libmuleappcore_a-Parser.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcore_a-Parser.o `test -f 'Parser.cpp' || echo '$(srcdir)/'`Parser.cpp + +libmuleappcore_a-Parser.obj: Parser.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcore_a-Parser.obj -MD -MP -MF "$(DEPDIR)/libmuleappcore_a-Parser.Tpo" -c -o libmuleappcore_a-Parser.obj `if test -f 'Parser.cpp'; then $(CYGPATH_W) 'Parser.cpp'; else $(CYGPATH_W) '$(srcdir)/Parser.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcore_a-Parser.Tpo" "$(DEPDIR)/libmuleappcore_a-Parser.Po"; else rm -f "$(DEPDIR)/libmuleappcore_a-Parser.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Parser.cpp' object='libmuleappcore_a-Parser.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcore_a-Parser.obj `if test -f 'Parser.cpp'; then $(CYGPATH_W) 'Parser.cpp'; else $(CYGPATH_W) '$(srcdir)/Parser.cpp'; fi` + +libmuleappcore_a-LittleEndian.o: kademlia/utils/LittleEndian.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcore_a-LittleEndian.o -MD -MP -MF "$(DEPDIR)/libmuleappcore_a-LittleEndian.Tpo" -c -o libmuleappcore_a-LittleEndian.o `test -f 'kademlia/utils/LittleEndian.cpp' || echo '$(srcdir)/'`kademlia/utils/LittleEndian.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcore_a-LittleEndian.Tpo" "$(DEPDIR)/libmuleappcore_a-LittleEndian.Po"; else rm -f "$(DEPDIR)/libmuleappcore_a-LittleEndian.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/utils/LittleEndian.cpp' object='libmuleappcore_a-LittleEndian.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcore_a-LittleEndian.o `test -f 'kademlia/utils/LittleEndian.cpp' || echo '$(srcdir)/'`kademlia/utils/LittleEndian.cpp + +libmuleappcore_a-LittleEndian.obj: kademlia/utils/LittleEndian.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcore_a-LittleEndian.obj -MD -MP -MF "$(DEPDIR)/libmuleappcore_a-LittleEndian.Tpo" -c -o libmuleappcore_a-LittleEndian.obj `if test -f 'kademlia/utils/LittleEndian.cpp'; then $(CYGPATH_W) 'kademlia/utils/LittleEndian.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/utils/LittleEndian.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcore_a-LittleEndian.Tpo" "$(DEPDIR)/libmuleappcore_a-LittleEndian.Po"; else rm -f "$(DEPDIR)/libmuleappcore_a-LittleEndian.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/utils/LittleEndian.cpp' object='libmuleappcore_a-LittleEndian.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcore_a-LittleEndian.obj `if test -f 'kademlia/utils/LittleEndian.cpp'; then $(CYGPATH_W) 'kademlia/utils/LittleEndian.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/utils/LittleEndian.cpp'; fi` + +libmuleappcore_a-SearchManager.o: kademlia/kademlia/SearchManager.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcore_a-SearchManager.o -MD -MP -MF "$(DEPDIR)/libmuleappcore_a-SearchManager.Tpo" -c -o libmuleappcore_a-SearchManager.o `test -f 'kademlia/kademlia/SearchManager.cpp' || echo '$(srcdir)/'`kademlia/kademlia/SearchManager.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcore_a-SearchManager.Tpo" "$(DEPDIR)/libmuleappcore_a-SearchManager.Po"; else rm -f "$(DEPDIR)/libmuleappcore_a-SearchManager.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/kademlia/SearchManager.cpp' object='libmuleappcore_a-SearchManager.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcore_a-SearchManager.o `test -f 'kademlia/kademlia/SearchManager.cpp' || echo '$(srcdir)/'`kademlia/kademlia/SearchManager.cpp + +libmuleappcore_a-SearchManager.obj: kademlia/kademlia/SearchManager.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcore_a-SearchManager.obj -MD -MP -MF "$(DEPDIR)/libmuleappcore_a-SearchManager.Tpo" -c -o libmuleappcore_a-SearchManager.obj `if test -f 'kademlia/kademlia/SearchManager.cpp'; then $(CYGPATH_W) 'kademlia/kademlia/SearchManager.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/kademlia/SearchManager.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcore_a-SearchManager.Tpo" "$(DEPDIR)/libmuleappcore_a-SearchManager.Po"; else rm -f "$(DEPDIR)/libmuleappcore_a-SearchManager.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/kademlia/SearchManager.cpp' object='libmuleappcore_a-SearchManager.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcore_a-SearchManager.obj `if test -f 'kademlia/kademlia/SearchManager.cpp'; then $(CYGPATH_W) 'kademlia/kademlia/SearchManager.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/kademlia/SearchManager.cpp'; fi` + +libmuleappcore_a-RoutingBin.o: kademlia/routing/RoutingBin.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcore_a-RoutingBin.o -MD -MP -MF "$(DEPDIR)/libmuleappcore_a-RoutingBin.Tpo" -c -o libmuleappcore_a-RoutingBin.o `test -f 'kademlia/routing/RoutingBin.cpp' || echo '$(srcdir)/'`kademlia/routing/RoutingBin.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcore_a-RoutingBin.Tpo" "$(DEPDIR)/libmuleappcore_a-RoutingBin.Po"; else rm -f "$(DEPDIR)/libmuleappcore_a-RoutingBin.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/routing/RoutingBin.cpp' object='libmuleappcore_a-RoutingBin.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcore_a-RoutingBin.o `test -f 'kademlia/routing/RoutingBin.cpp' || echo '$(srcdir)/'`kademlia/routing/RoutingBin.cpp + +libmuleappcore_a-RoutingBin.obj: kademlia/routing/RoutingBin.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcore_a-RoutingBin.obj -MD -MP -MF "$(DEPDIR)/libmuleappcore_a-RoutingBin.Tpo" -c -o libmuleappcore_a-RoutingBin.obj `if test -f 'kademlia/routing/RoutingBin.cpp'; then $(CYGPATH_W) 'kademlia/routing/RoutingBin.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/routing/RoutingBin.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcore_a-RoutingBin.Tpo" "$(DEPDIR)/libmuleappcore_a-RoutingBin.Po"; else rm -f "$(DEPDIR)/libmuleappcore_a-RoutingBin.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/routing/RoutingBin.cpp' object='libmuleappcore_a-RoutingBin.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcore_a-RoutingBin.obj `if test -f 'kademlia/routing/RoutingBin.cpp'; then $(CYGPATH_W) 'kademlia/routing/RoutingBin.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/routing/RoutingBin.cpp'; fi` + +libmuleappcore_a-StateMachine.o: StateMachine.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcore_a-StateMachine.o -MD -MP -MF "$(DEPDIR)/libmuleappcore_a-StateMachine.Tpo" -c -o libmuleappcore_a-StateMachine.o `test -f 'StateMachine.cpp' || echo '$(srcdir)/'`StateMachine.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcore_a-StateMachine.Tpo" "$(DEPDIR)/libmuleappcore_a-StateMachine.Po"; else rm -f "$(DEPDIR)/libmuleappcore_a-StateMachine.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='StateMachine.cpp' object='libmuleappcore_a-StateMachine.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcore_a-StateMachine.o `test -f 'StateMachine.cpp' || echo '$(srcdir)/'`StateMachine.cpp + +libmuleappcore_a-StateMachine.obj: StateMachine.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcore_a-StateMachine.obj -MD -MP -MF "$(DEPDIR)/libmuleappcore_a-StateMachine.Tpo" -c -o libmuleappcore_a-StateMachine.obj `if test -f 'StateMachine.cpp'; then $(CYGPATH_W) 'StateMachine.cpp'; else $(CYGPATH_W) '$(srcdir)/StateMachine.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcore_a-StateMachine.Tpo" "$(DEPDIR)/libmuleappcore_a-StateMachine.Po"; else rm -f "$(DEPDIR)/libmuleappcore_a-StateMachine.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='StateMachine.cpp' object='libmuleappcore_a-StateMachine.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcore_a-StateMachine.obj `if test -f 'StateMachine.cpp'; then $(CYGPATH_W) 'StateMachine.cpp'; else $(CYGPATH_W) '$(srcdir)/StateMachine.cpp'; fi` + +libmuleappcore_a-ThreadScheduler.o: ThreadScheduler.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcore_a-ThreadScheduler.o -MD -MP -MF "$(DEPDIR)/libmuleappcore_a-ThreadScheduler.Tpo" -c -o libmuleappcore_a-ThreadScheduler.o `test -f 'ThreadScheduler.cpp' || echo '$(srcdir)/'`ThreadScheduler.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcore_a-ThreadScheduler.Tpo" "$(DEPDIR)/libmuleappcore_a-ThreadScheduler.Po"; else rm -f "$(DEPDIR)/libmuleappcore_a-ThreadScheduler.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ThreadScheduler.cpp' object='libmuleappcore_a-ThreadScheduler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcore_a-ThreadScheduler.o `test -f 'ThreadScheduler.cpp' || echo '$(srcdir)/'`ThreadScheduler.cpp + +libmuleappcore_a-ThreadScheduler.obj: ThreadScheduler.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappcore_a-ThreadScheduler.obj -MD -MP -MF "$(DEPDIR)/libmuleappcore_a-ThreadScheduler.Tpo" -c -o libmuleappcore_a-ThreadScheduler.obj `if test -f 'ThreadScheduler.cpp'; then $(CYGPATH_W) 'ThreadScheduler.cpp'; else $(CYGPATH_W) '$(srcdir)/ThreadScheduler.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappcore_a-ThreadScheduler.Tpo" "$(DEPDIR)/libmuleappcore_a-ThreadScheduler.Po"; else rm -f "$(DEPDIR)/libmuleappcore_a-ThreadScheduler.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ThreadScheduler.cpp' object='libmuleappcore_a-ThreadScheduler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappcore_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappcore_a-ThreadScheduler.obj `if test -f 'ThreadScheduler.cpp'; then $(CYGPATH_W) 'ThreadScheduler.cpp'; else $(CYGPATH_W) '$(srcdir)/ThreadScheduler.cpp'; fi` + +libmuleappgui_a-BarShader.o: BarShader.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-BarShader.o -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-BarShader.Tpo" -c -o libmuleappgui_a-BarShader.o `test -f 'BarShader.cpp' || echo '$(srcdir)/'`BarShader.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-BarShader.Tpo" "$(DEPDIR)/libmuleappgui_a-BarShader.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-BarShader.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='BarShader.cpp' object='libmuleappgui_a-BarShader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-BarShader.o `test -f 'BarShader.cpp' || echo '$(srcdir)/'`BarShader.cpp + +libmuleappgui_a-BarShader.obj: BarShader.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-BarShader.obj -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-BarShader.Tpo" -c -o libmuleappgui_a-BarShader.obj `if test -f 'BarShader.cpp'; then $(CYGPATH_W) 'BarShader.cpp'; else $(CYGPATH_W) '$(srcdir)/BarShader.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-BarShader.Tpo" "$(DEPDIR)/libmuleappgui_a-BarShader.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-BarShader.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='BarShader.cpp' object='libmuleappgui_a-BarShader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-BarShader.obj `if test -f 'BarShader.cpp'; then $(CYGPATH_W) 'BarShader.cpp'; else $(CYGPATH_W) '$(srcdir)/BarShader.cpp'; fi` + +libmuleappgui_a-ChatWnd.o: ChatWnd.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-ChatWnd.o -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-ChatWnd.Tpo" -c -o libmuleappgui_a-ChatWnd.o `test -f 'ChatWnd.cpp' || echo '$(srcdir)/'`ChatWnd.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-ChatWnd.Tpo" "$(DEPDIR)/libmuleappgui_a-ChatWnd.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-ChatWnd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ChatWnd.cpp' object='libmuleappgui_a-ChatWnd.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-ChatWnd.o `test -f 'ChatWnd.cpp' || echo '$(srcdir)/'`ChatWnd.cpp + +libmuleappgui_a-ChatWnd.obj: ChatWnd.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-ChatWnd.obj -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-ChatWnd.Tpo" -c -o libmuleappgui_a-ChatWnd.obj `if test -f 'ChatWnd.cpp'; then $(CYGPATH_W) 'ChatWnd.cpp'; else $(CYGPATH_W) '$(srcdir)/ChatWnd.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-ChatWnd.Tpo" "$(DEPDIR)/libmuleappgui_a-ChatWnd.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-ChatWnd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ChatWnd.cpp' object='libmuleappgui_a-ChatWnd.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-ChatWnd.obj `if test -f 'ChatWnd.cpp'; then $(CYGPATH_W) 'ChatWnd.cpp'; else $(CYGPATH_W) '$(srcdir)/ChatWnd.cpp'; fi` + +libmuleappgui_a-ColorFrameCtrl.o: ColorFrameCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-ColorFrameCtrl.o -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-ColorFrameCtrl.Tpo" -c -o libmuleappgui_a-ColorFrameCtrl.o `test -f 'ColorFrameCtrl.cpp' || echo '$(srcdir)/'`ColorFrameCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-ColorFrameCtrl.Tpo" "$(DEPDIR)/libmuleappgui_a-ColorFrameCtrl.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-ColorFrameCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ColorFrameCtrl.cpp' object='libmuleappgui_a-ColorFrameCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-ColorFrameCtrl.o `test -f 'ColorFrameCtrl.cpp' || echo '$(srcdir)/'`ColorFrameCtrl.cpp + +libmuleappgui_a-ColorFrameCtrl.obj: ColorFrameCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-ColorFrameCtrl.obj -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-ColorFrameCtrl.Tpo" -c -o libmuleappgui_a-ColorFrameCtrl.obj `if test -f 'ColorFrameCtrl.cpp'; then $(CYGPATH_W) 'ColorFrameCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/ColorFrameCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-ColorFrameCtrl.Tpo" "$(DEPDIR)/libmuleappgui_a-ColorFrameCtrl.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-ColorFrameCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ColorFrameCtrl.cpp' object='libmuleappgui_a-ColorFrameCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-ColorFrameCtrl.obj `if test -f 'ColorFrameCtrl.cpp'; then $(CYGPATH_W) 'ColorFrameCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/ColorFrameCtrl.cpp'; fi` + +libmuleappgui_a-CommentDialog.o: CommentDialog.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-CommentDialog.o -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-CommentDialog.Tpo" -c -o libmuleappgui_a-CommentDialog.o `test -f 'CommentDialog.cpp' || echo '$(srcdir)/'`CommentDialog.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-CommentDialog.Tpo" "$(DEPDIR)/libmuleappgui_a-CommentDialog.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-CommentDialog.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='CommentDialog.cpp' object='libmuleappgui_a-CommentDialog.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-CommentDialog.o `test -f 'CommentDialog.cpp' || echo '$(srcdir)/'`CommentDialog.cpp + +libmuleappgui_a-CommentDialog.obj: CommentDialog.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-CommentDialog.obj -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-CommentDialog.Tpo" -c -o libmuleappgui_a-CommentDialog.obj `if test -f 'CommentDialog.cpp'; then $(CYGPATH_W) 'CommentDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/CommentDialog.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-CommentDialog.Tpo" "$(DEPDIR)/libmuleappgui_a-CommentDialog.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-CommentDialog.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='CommentDialog.cpp' object='libmuleappgui_a-CommentDialog.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-CommentDialog.obj `if test -f 'CommentDialog.cpp'; then $(CYGPATH_W) 'CommentDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/CommentDialog.cpp'; fi` + +libmuleappgui_a-CommentDialogLst.o: CommentDialogLst.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-CommentDialogLst.o -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-CommentDialogLst.Tpo" -c -o libmuleappgui_a-CommentDialogLst.o `test -f 'CommentDialogLst.cpp' || echo '$(srcdir)/'`CommentDialogLst.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-CommentDialogLst.Tpo" "$(DEPDIR)/libmuleappgui_a-CommentDialogLst.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-CommentDialogLst.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='CommentDialogLst.cpp' object='libmuleappgui_a-CommentDialogLst.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-CommentDialogLst.o `test -f 'CommentDialogLst.cpp' || echo '$(srcdir)/'`CommentDialogLst.cpp + +libmuleappgui_a-CommentDialogLst.obj: CommentDialogLst.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-CommentDialogLst.obj -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-CommentDialogLst.Tpo" -c -o libmuleappgui_a-CommentDialogLst.obj `if test -f 'CommentDialogLst.cpp'; then $(CYGPATH_W) 'CommentDialogLst.cpp'; else $(CYGPATH_W) '$(srcdir)/CommentDialogLst.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-CommentDialogLst.Tpo" "$(DEPDIR)/libmuleappgui_a-CommentDialogLst.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-CommentDialogLst.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='CommentDialogLst.cpp' object='libmuleappgui_a-CommentDialogLst.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-CommentDialogLst.obj `if test -f 'CommentDialogLst.cpp'; then $(CYGPATH_W) 'CommentDialogLst.cpp'; else $(CYGPATH_W) '$(srcdir)/CommentDialogLst.cpp'; fi` + +libmuleappgui_a-DirectoryTreeCtrl.o: DirectoryTreeCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-DirectoryTreeCtrl.o -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-DirectoryTreeCtrl.Tpo" -c -o libmuleappgui_a-DirectoryTreeCtrl.o `test -f 'DirectoryTreeCtrl.cpp' || echo '$(srcdir)/'`DirectoryTreeCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-DirectoryTreeCtrl.Tpo" "$(DEPDIR)/libmuleappgui_a-DirectoryTreeCtrl.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-DirectoryTreeCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DirectoryTreeCtrl.cpp' object='libmuleappgui_a-DirectoryTreeCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-DirectoryTreeCtrl.o `test -f 'DirectoryTreeCtrl.cpp' || echo '$(srcdir)/'`DirectoryTreeCtrl.cpp + +libmuleappgui_a-DirectoryTreeCtrl.obj: DirectoryTreeCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-DirectoryTreeCtrl.obj -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-DirectoryTreeCtrl.Tpo" -c -o libmuleappgui_a-DirectoryTreeCtrl.obj `if test -f 'DirectoryTreeCtrl.cpp'; then $(CYGPATH_W) 'DirectoryTreeCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/DirectoryTreeCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-DirectoryTreeCtrl.Tpo" "$(DEPDIR)/libmuleappgui_a-DirectoryTreeCtrl.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-DirectoryTreeCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DirectoryTreeCtrl.cpp' object='libmuleappgui_a-DirectoryTreeCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-DirectoryTreeCtrl.obj `if test -f 'DirectoryTreeCtrl.cpp'; then $(CYGPATH_W) 'DirectoryTreeCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/DirectoryTreeCtrl.cpp'; fi` + +libmuleappgui_a-EditServerListDlg.o: EditServerListDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-EditServerListDlg.o -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-EditServerListDlg.Tpo" -c -o libmuleappgui_a-EditServerListDlg.o `test -f 'EditServerListDlg.cpp' || echo '$(srcdir)/'`EditServerListDlg.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-EditServerListDlg.Tpo" "$(DEPDIR)/libmuleappgui_a-EditServerListDlg.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-EditServerListDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='EditServerListDlg.cpp' object='libmuleappgui_a-EditServerListDlg.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-EditServerListDlg.o `test -f 'EditServerListDlg.cpp' || echo '$(srcdir)/'`EditServerListDlg.cpp + +libmuleappgui_a-EditServerListDlg.obj: EditServerListDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-EditServerListDlg.obj -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-EditServerListDlg.Tpo" -c -o libmuleappgui_a-EditServerListDlg.obj `if test -f 'EditServerListDlg.cpp'; then $(CYGPATH_W) 'EditServerListDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/EditServerListDlg.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-EditServerListDlg.Tpo" "$(DEPDIR)/libmuleappgui_a-EditServerListDlg.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-EditServerListDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='EditServerListDlg.cpp' object='libmuleappgui_a-EditServerListDlg.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-EditServerListDlg.obj `if test -f 'EditServerListDlg.cpp'; then $(CYGPATH_W) 'EditServerListDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/EditServerListDlg.cpp'; fi` + +libmuleappgui_a-listctrl.o: extern/wxWidgets/listctrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-listctrl.o -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-listctrl.Tpo" -c -o libmuleappgui_a-listctrl.o `test -f 'extern/wxWidgets/listctrl.cpp' || echo '$(srcdir)/'`extern/wxWidgets/listctrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-listctrl.Tpo" "$(DEPDIR)/libmuleappgui_a-listctrl.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-listctrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='extern/wxWidgets/listctrl.cpp' object='libmuleappgui_a-listctrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-listctrl.o `test -f 'extern/wxWidgets/listctrl.cpp' || echo '$(srcdir)/'`extern/wxWidgets/listctrl.cpp + +libmuleappgui_a-listctrl.obj: extern/wxWidgets/listctrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-listctrl.obj -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-listctrl.Tpo" -c -o libmuleappgui_a-listctrl.obj `if test -f 'extern/wxWidgets/listctrl.cpp'; then $(CYGPATH_W) 'extern/wxWidgets/listctrl.cpp'; else $(CYGPATH_W) '$(srcdir)/extern/wxWidgets/listctrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-listctrl.Tpo" "$(DEPDIR)/libmuleappgui_a-listctrl.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-listctrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='extern/wxWidgets/listctrl.cpp' object='libmuleappgui_a-listctrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-listctrl.obj `if test -f 'extern/wxWidgets/listctrl.cpp'; then $(CYGPATH_W) 'extern/wxWidgets/listctrl.cpp'; else $(CYGPATH_W) '$(srcdir)/extern/wxWidgets/listctrl.cpp'; fi` + +libmuleappgui_a-FileDetailListCtrl.o: FileDetailListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-FileDetailListCtrl.o -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-FileDetailListCtrl.Tpo" -c -o libmuleappgui_a-FileDetailListCtrl.o `test -f 'FileDetailListCtrl.cpp' || echo '$(srcdir)/'`FileDetailListCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-FileDetailListCtrl.Tpo" "$(DEPDIR)/libmuleappgui_a-FileDetailListCtrl.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-FileDetailListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FileDetailListCtrl.cpp' object='libmuleappgui_a-FileDetailListCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-FileDetailListCtrl.o `test -f 'FileDetailListCtrl.cpp' || echo '$(srcdir)/'`FileDetailListCtrl.cpp + +libmuleappgui_a-FileDetailListCtrl.obj: FileDetailListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-FileDetailListCtrl.obj -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-FileDetailListCtrl.Tpo" -c -o libmuleappgui_a-FileDetailListCtrl.obj `if test -f 'FileDetailListCtrl.cpp'; then $(CYGPATH_W) 'FileDetailListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/FileDetailListCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-FileDetailListCtrl.Tpo" "$(DEPDIR)/libmuleappgui_a-FileDetailListCtrl.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-FileDetailListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FileDetailListCtrl.cpp' object='libmuleappgui_a-FileDetailListCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-FileDetailListCtrl.obj `if test -f 'FileDetailListCtrl.cpp'; then $(CYGPATH_W) 'FileDetailListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/FileDetailListCtrl.cpp'; fi` + +libmuleappgui_a-MuleGifCtrl.o: MuleGifCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-MuleGifCtrl.o -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-MuleGifCtrl.Tpo" -c -o libmuleappgui_a-MuleGifCtrl.o `test -f 'MuleGifCtrl.cpp' || echo '$(srcdir)/'`MuleGifCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-MuleGifCtrl.Tpo" "$(DEPDIR)/libmuleappgui_a-MuleGifCtrl.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-MuleGifCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleGifCtrl.cpp' object='libmuleappgui_a-MuleGifCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-MuleGifCtrl.o `test -f 'MuleGifCtrl.cpp' || echo '$(srcdir)/'`MuleGifCtrl.cpp + +libmuleappgui_a-MuleGifCtrl.obj: MuleGifCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-MuleGifCtrl.obj -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-MuleGifCtrl.Tpo" -c -o libmuleappgui_a-MuleGifCtrl.obj `if test -f 'MuleGifCtrl.cpp'; then $(CYGPATH_W) 'MuleGifCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleGifCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-MuleGifCtrl.Tpo" "$(DEPDIR)/libmuleappgui_a-MuleGifCtrl.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-MuleGifCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleGifCtrl.cpp' object='libmuleappgui_a-MuleGifCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-MuleGifCtrl.obj `if test -f 'MuleGifCtrl.cpp'; then $(CYGPATH_W) 'MuleGifCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleGifCtrl.cpp'; fi` + +libmuleappgui_a-MuleListCtrl.o: MuleListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-MuleListCtrl.o -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-MuleListCtrl.Tpo" -c -o libmuleappgui_a-MuleListCtrl.o `test -f 'MuleListCtrl.cpp' || echo '$(srcdir)/'`MuleListCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-MuleListCtrl.Tpo" "$(DEPDIR)/libmuleappgui_a-MuleListCtrl.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-MuleListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleListCtrl.cpp' object='libmuleappgui_a-MuleListCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-MuleListCtrl.o `test -f 'MuleListCtrl.cpp' || echo '$(srcdir)/'`MuleListCtrl.cpp + +libmuleappgui_a-MuleListCtrl.obj: MuleListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-MuleListCtrl.obj -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-MuleListCtrl.Tpo" -c -o libmuleappgui_a-MuleListCtrl.obj `if test -f 'MuleListCtrl.cpp'; then $(CYGPATH_W) 'MuleListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleListCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-MuleListCtrl.Tpo" "$(DEPDIR)/libmuleappgui_a-MuleListCtrl.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-MuleListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleListCtrl.cpp' object='libmuleappgui_a-MuleListCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-MuleListCtrl.obj `if test -f 'MuleListCtrl.cpp'; then $(CYGPATH_W) 'MuleListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleListCtrl.cpp'; fi` + +libmuleappgui_a-MuleNotebook.o: MuleNotebook.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-MuleNotebook.o -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-MuleNotebook.Tpo" -c -o libmuleappgui_a-MuleNotebook.o `test -f 'MuleNotebook.cpp' || echo '$(srcdir)/'`MuleNotebook.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-MuleNotebook.Tpo" "$(DEPDIR)/libmuleappgui_a-MuleNotebook.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-MuleNotebook.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleNotebook.cpp' object='libmuleappgui_a-MuleNotebook.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-MuleNotebook.o `test -f 'MuleNotebook.cpp' || echo '$(srcdir)/'`MuleNotebook.cpp + +libmuleappgui_a-MuleNotebook.obj: MuleNotebook.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-MuleNotebook.obj -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-MuleNotebook.Tpo" -c -o libmuleappgui_a-MuleNotebook.obj `if test -f 'MuleNotebook.cpp'; then $(CYGPATH_W) 'MuleNotebook.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleNotebook.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-MuleNotebook.Tpo" "$(DEPDIR)/libmuleappgui_a-MuleNotebook.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-MuleNotebook.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleNotebook.cpp' object='libmuleappgui_a-MuleNotebook.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-MuleNotebook.obj `if test -f 'MuleNotebook.cpp'; then $(CYGPATH_W) 'MuleNotebook.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleNotebook.cpp'; fi` + +libmuleappgui_a-MuleTextCtrl.o: MuleTextCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-MuleTextCtrl.o -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-MuleTextCtrl.Tpo" -c -o libmuleappgui_a-MuleTextCtrl.o `test -f 'MuleTextCtrl.cpp' || echo '$(srcdir)/'`MuleTextCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-MuleTextCtrl.Tpo" "$(DEPDIR)/libmuleappgui_a-MuleTextCtrl.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-MuleTextCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleTextCtrl.cpp' object='libmuleappgui_a-MuleTextCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-MuleTextCtrl.o `test -f 'MuleTextCtrl.cpp' || echo '$(srcdir)/'`MuleTextCtrl.cpp + +libmuleappgui_a-MuleTextCtrl.obj: MuleTextCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-MuleTextCtrl.obj -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-MuleTextCtrl.Tpo" -c -o libmuleappgui_a-MuleTextCtrl.obj `if test -f 'MuleTextCtrl.cpp'; then $(CYGPATH_W) 'MuleTextCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleTextCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-MuleTextCtrl.Tpo" "$(DEPDIR)/libmuleappgui_a-MuleTextCtrl.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-MuleTextCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleTextCtrl.cpp' object='libmuleappgui_a-MuleTextCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-MuleTextCtrl.obj `if test -f 'MuleTextCtrl.cpp'; then $(CYGPATH_W) 'MuleTextCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleTextCtrl.cpp'; fi` + +libmuleappgui_a-MuleCollection.o: MuleCollection.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-MuleCollection.o -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-MuleCollection.Tpo" -c -o libmuleappgui_a-MuleCollection.o `test -f 'MuleCollection.cpp' || echo '$(srcdir)/'`MuleCollection.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-MuleCollection.Tpo" "$(DEPDIR)/libmuleappgui_a-MuleCollection.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-MuleCollection.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleCollection.cpp' object='libmuleappgui_a-MuleCollection.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-MuleCollection.o `test -f 'MuleCollection.cpp' || echo '$(srcdir)/'`MuleCollection.cpp + +libmuleappgui_a-MuleCollection.obj: MuleCollection.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-MuleCollection.obj -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-MuleCollection.Tpo" -c -o libmuleappgui_a-MuleCollection.obj `if test -f 'MuleCollection.cpp'; then $(CYGPATH_W) 'MuleCollection.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleCollection.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-MuleCollection.Tpo" "$(DEPDIR)/libmuleappgui_a-MuleCollection.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-MuleCollection.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleCollection.cpp' object='libmuleappgui_a-MuleCollection.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-MuleCollection.obj `if test -f 'MuleCollection.cpp'; then $(CYGPATH_W) 'MuleCollection.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleCollection.cpp'; fi` + +libmuleappgui_a-muuli_wdr.o: muuli_wdr.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-muuli_wdr.o -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-muuli_wdr.Tpo" -c -o libmuleappgui_a-muuli_wdr.o `test -f 'muuli_wdr.cpp' || echo '$(srcdir)/'`muuli_wdr.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-muuli_wdr.Tpo" "$(DEPDIR)/libmuleappgui_a-muuli_wdr.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-muuli_wdr.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='muuli_wdr.cpp' object='libmuleappgui_a-muuli_wdr.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-muuli_wdr.o `test -f 'muuli_wdr.cpp' || echo '$(srcdir)/'`muuli_wdr.cpp + +libmuleappgui_a-muuli_wdr.obj: muuli_wdr.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleappgui_a-muuli_wdr.obj -MD -MP -MF "$(DEPDIR)/libmuleappgui_a-muuli_wdr.Tpo" -c -o libmuleappgui_a-muuli_wdr.obj `if test -f 'muuli_wdr.cpp'; then $(CYGPATH_W) 'muuli_wdr.cpp'; else $(CYGPATH_W) '$(srcdir)/muuli_wdr.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleappgui_a-muuli_wdr.Tpo" "$(DEPDIR)/libmuleappgui_a-muuli_wdr.Po"; else rm -f "$(DEPDIR)/libmuleappgui_a-muuli_wdr.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='muuli_wdr.cpp' object='libmuleappgui_a-muuli_wdr.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleappgui_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleappgui_a-muuli_wdr.obj `if test -f 'muuli_wdr.cpp'; then $(CYGPATH_W) 'muuli_wdr.cpp'; else $(CYGPATH_W) '$(srcdir)/muuli_wdr.cpp'; fi` + +amule-RC4Encrypt.o: RC4Encrypt.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-RC4Encrypt.o -MD -MP -MF "$(DEPDIR)/amule-RC4Encrypt.Tpo" -c -o amule-RC4Encrypt.o `test -f 'RC4Encrypt.cpp' || echo '$(srcdir)/'`RC4Encrypt.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-RC4Encrypt.Tpo" "$(DEPDIR)/amule-RC4Encrypt.Po"; else rm -f "$(DEPDIR)/amule-RC4Encrypt.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='RC4Encrypt.cpp' object='amule-RC4Encrypt.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-RC4Encrypt.o `test -f 'RC4Encrypt.cpp' || echo '$(srcdir)/'`RC4Encrypt.cpp + +amule-RC4Encrypt.obj: RC4Encrypt.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-RC4Encrypt.obj -MD -MP -MF "$(DEPDIR)/amule-RC4Encrypt.Tpo" -c -o amule-RC4Encrypt.obj `if test -f 'RC4Encrypt.cpp'; then $(CYGPATH_W) 'RC4Encrypt.cpp'; else $(CYGPATH_W) '$(srcdir)/RC4Encrypt.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-RC4Encrypt.Tpo" "$(DEPDIR)/amule-RC4Encrypt.Po"; else rm -f "$(DEPDIR)/amule-RC4Encrypt.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='RC4Encrypt.cpp' object='amule-RC4Encrypt.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-RC4Encrypt.obj `if test -f 'RC4Encrypt.cpp'; then $(CYGPATH_W) 'RC4Encrypt.cpp'; else $(CYGPATH_W) '$(srcdir)/RC4Encrypt.cpp'; fi` + +amule-amule.o: amule.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-amule.o -MD -MP -MF "$(DEPDIR)/amule-amule.Tpo" -c -o amule-amule.o `test -f 'amule.cpp' || echo '$(srcdir)/'`amule.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-amule.Tpo" "$(DEPDIR)/amule-amule.Po"; else rm -f "$(DEPDIR)/amule-amule.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='amule.cpp' object='amule-amule.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-amule.o `test -f 'amule.cpp' || echo '$(srcdir)/'`amule.cpp + +amule-amule.obj: amule.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-amule.obj -MD -MP -MF "$(DEPDIR)/amule-amule.Tpo" -c -o amule-amule.obj `if test -f 'amule.cpp'; then $(CYGPATH_W) 'amule.cpp'; else $(CYGPATH_W) '$(srcdir)/amule.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-amule.Tpo" "$(DEPDIR)/amule-amule.Po"; else rm -f "$(DEPDIR)/amule-amule.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='amule.cpp' object='amule-amule.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-amule.obj `if test -f 'amule.cpp'; then $(CYGPATH_W) 'amule.cpp'; else $(CYGPATH_W) '$(srcdir)/amule.cpp'; fi` + +amule-BaseClient.o: BaseClient.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-BaseClient.o -MD -MP -MF "$(DEPDIR)/amule-BaseClient.Tpo" -c -o amule-BaseClient.o `test -f 'BaseClient.cpp' || echo '$(srcdir)/'`BaseClient.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-BaseClient.Tpo" "$(DEPDIR)/amule-BaseClient.Po"; else rm -f "$(DEPDIR)/amule-BaseClient.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='BaseClient.cpp' object='amule-BaseClient.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-BaseClient.o `test -f 'BaseClient.cpp' || echo '$(srcdir)/'`BaseClient.cpp + +amule-BaseClient.obj: BaseClient.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-BaseClient.obj -MD -MP -MF "$(DEPDIR)/amule-BaseClient.Tpo" -c -o amule-BaseClient.obj `if test -f 'BaseClient.cpp'; then $(CYGPATH_W) 'BaseClient.cpp'; else $(CYGPATH_W) '$(srcdir)/BaseClient.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-BaseClient.Tpo" "$(DEPDIR)/amule-BaseClient.Po"; else rm -f "$(DEPDIR)/amule-BaseClient.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='BaseClient.cpp' object='amule-BaseClient.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-BaseClient.obj `if test -f 'BaseClient.cpp'; then $(CYGPATH_W) 'BaseClient.cpp'; else $(CYGPATH_W) '$(srcdir)/BaseClient.cpp'; fi` + +amule-ClientList.o: ClientList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ClientList.o -MD -MP -MF "$(DEPDIR)/amule-ClientList.Tpo" -c -o amule-ClientList.o `test -f 'ClientList.cpp' || echo '$(srcdir)/'`ClientList.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ClientList.Tpo" "$(DEPDIR)/amule-ClientList.Po"; else rm -f "$(DEPDIR)/amule-ClientList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientList.cpp' object='amule-ClientList.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ClientList.o `test -f 'ClientList.cpp' || echo '$(srcdir)/'`ClientList.cpp + +amule-ClientList.obj: ClientList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ClientList.obj -MD -MP -MF "$(DEPDIR)/amule-ClientList.Tpo" -c -o amule-ClientList.obj `if test -f 'ClientList.cpp'; then $(CYGPATH_W) 'ClientList.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientList.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ClientList.Tpo" "$(DEPDIR)/amule-ClientList.Po"; else rm -f "$(DEPDIR)/amule-ClientList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientList.cpp' object='amule-ClientList.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ClientList.obj `if test -f 'ClientList.cpp'; then $(CYGPATH_W) 'ClientList.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientList.cpp'; fi` + +amule-ClientCreditsList.o: ClientCreditsList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ClientCreditsList.o -MD -MP -MF "$(DEPDIR)/amule-ClientCreditsList.Tpo" -c -o amule-ClientCreditsList.o `test -f 'ClientCreditsList.cpp' || echo '$(srcdir)/'`ClientCreditsList.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ClientCreditsList.Tpo" "$(DEPDIR)/amule-ClientCreditsList.Po"; else rm -f "$(DEPDIR)/amule-ClientCreditsList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientCreditsList.cpp' object='amule-ClientCreditsList.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ClientCreditsList.o `test -f 'ClientCreditsList.cpp' || echo '$(srcdir)/'`ClientCreditsList.cpp + +amule-ClientCreditsList.obj: ClientCreditsList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ClientCreditsList.obj -MD -MP -MF "$(DEPDIR)/amule-ClientCreditsList.Tpo" -c -o amule-ClientCreditsList.obj `if test -f 'ClientCreditsList.cpp'; then $(CYGPATH_W) 'ClientCreditsList.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientCreditsList.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ClientCreditsList.Tpo" "$(DEPDIR)/amule-ClientCreditsList.Po"; else rm -f "$(DEPDIR)/amule-ClientCreditsList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientCreditsList.cpp' object='amule-ClientCreditsList.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ClientCreditsList.obj `if test -f 'ClientCreditsList.cpp'; then $(CYGPATH_W) 'ClientCreditsList.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientCreditsList.cpp'; fi` + +amule-ClientTCPSocket.o: ClientTCPSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ClientTCPSocket.o -MD -MP -MF "$(DEPDIR)/amule-ClientTCPSocket.Tpo" -c -o amule-ClientTCPSocket.o `test -f 'ClientTCPSocket.cpp' || echo '$(srcdir)/'`ClientTCPSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ClientTCPSocket.Tpo" "$(DEPDIR)/amule-ClientTCPSocket.Po"; else rm -f "$(DEPDIR)/amule-ClientTCPSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientTCPSocket.cpp' object='amule-ClientTCPSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ClientTCPSocket.o `test -f 'ClientTCPSocket.cpp' || echo '$(srcdir)/'`ClientTCPSocket.cpp + +amule-ClientTCPSocket.obj: ClientTCPSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ClientTCPSocket.obj -MD -MP -MF "$(DEPDIR)/amule-ClientTCPSocket.Tpo" -c -o amule-ClientTCPSocket.obj `if test -f 'ClientTCPSocket.cpp'; then $(CYGPATH_W) 'ClientTCPSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientTCPSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ClientTCPSocket.Tpo" "$(DEPDIR)/amule-ClientTCPSocket.Po"; else rm -f "$(DEPDIR)/amule-ClientTCPSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientTCPSocket.cpp' object='amule-ClientTCPSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ClientTCPSocket.obj `if test -f 'ClientTCPSocket.cpp'; then $(CYGPATH_W) 'ClientTCPSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientTCPSocket.cpp'; fi` + +amule-ClientUDPSocket.o: ClientUDPSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ClientUDPSocket.o -MD -MP -MF "$(DEPDIR)/amule-ClientUDPSocket.Tpo" -c -o amule-ClientUDPSocket.o `test -f 'ClientUDPSocket.cpp' || echo '$(srcdir)/'`ClientUDPSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ClientUDPSocket.Tpo" "$(DEPDIR)/amule-ClientUDPSocket.Po"; else rm -f "$(DEPDIR)/amule-ClientUDPSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientUDPSocket.cpp' object='amule-ClientUDPSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ClientUDPSocket.o `test -f 'ClientUDPSocket.cpp' || echo '$(srcdir)/'`ClientUDPSocket.cpp + +amule-ClientUDPSocket.obj: ClientUDPSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ClientUDPSocket.obj -MD -MP -MF "$(DEPDIR)/amule-ClientUDPSocket.Tpo" -c -o amule-ClientUDPSocket.obj `if test -f 'ClientUDPSocket.cpp'; then $(CYGPATH_W) 'ClientUDPSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientUDPSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ClientUDPSocket.Tpo" "$(DEPDIR)/amule-ClientUDPSocket.Po"; else rm -f "$(DEPDIR)/amule-ClientUDPSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientUDPSocket.cpp' object='amule-ClientUDPSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ClientUDPSocket.obj `if test -f 'ClientUDPSocket.cpp'; then $(CYGPATH_W) 'ClientUDPSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientUDPSocket.cpp'; fi` + +amule-DownloadClient.o: DownloadClient.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-DownloadClient.o -MD -MP -MF "$(DEPDIR)/amule-DownloadClient.Tpo" -c -o amule-DownloadClient.o `test -f 'DownloadClient.cpp' || echo '$(srcdir)/'`DownloadClient.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-DownloadClient.Tpo" "$(DEPDIR)/amule-DownloadClient.Po"; else rm -f "$(DEPDIR)/amule-DownloadClient.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DownloadClient.cpp' object='amule-DownloadClient.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-DownloadClient.o `test -f 'DownloadClient.cpp' || echo '$(srcdir)/'`DownloadClient.cpp + +amule-DownloadClient.obj: DownloadClient.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-DownloadClient.obj -MD -MP -MF "$(DEPDIR)/amule-DownloadClient.Tpo" -c -o amule-DownloadClient.obj `if test -f 'DownloadClient.cpp'; then $(CYGPATH_W) 'DownloadClient.cpp'; else $(CYGPATH_W) '$(srcdir)/DownloadClient.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-DownloadClient.Tpo" "$(DEPDIR)/amule-DownloadClient.Po"; else rm -f "$(DEPDIR)/amule-DownloadClient.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DownloadClient.cpp' object='amule-DownloadClient.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-DownloadClient.obj `if test -f 'DownloadClient.cpp'; then $(CYGPATH_W) 'DownloadClient.cpp'; else $(CYGPATH_W) '$(srcdir)/DownloadClient.cpp'; fi` + +amule-DownloadQueue.o: DownloadQueue.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-DownloadQueue.o -MD -MP -MF "$(DEPDIR)/amule-DownloadQueue.Tpo" -c -o amule-DownloadQueue.o `test -f 'DownloadQueue.cpp' || echo '$(srcdir)/'`DownloadQueue.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-DownloadQueue.Tpo" "$(DEPDIR)/amule-DownloadQueue.Po"; else rm -f "$(DEPDIR)/amule-DownloadQueue.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DownloadQueue.cpp' object='amule-DownloadQueue.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-DownloadQueue.o `test -f 'DownloadQueue.cpp' || echo '$(srcdir)/'`DownloadQueue.cpp + +amule-DownloadQueue.obj: DownloadQueue.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-DownloadQueue.obj -MD -MP -MF "$(DEPDIR)/amule-DownloadQueue.Tpo" -c -o amule-DownloadQueue.obj `if test -f 'DownloadQueue.cpp'; then $(CYGPATH_W) 'DownloadQueue.cpp'; else $(CYGPATH_W) '$(srcdir)/DownloadQueue.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-DownloadQueue.Tpo" "$(DEPDIR)/amule-DownloadQueue.Po"; else rm -f "$(DEPDIR)/amule-DownloadQueue.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DownloadQueue.cpp' object='amule-DownloadQueue.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-DownloadQueue.obj `if test -f 'DownloadQueue.cpp'; then $(CYGPATH_W) 'DownloadQueue.cpp'; else $(CYGPATH_W) '$(srcdir)/DownloadQueue.cpp'; fi` + +amule-ECSpecialCoreTags.o: ECSpecialCoreTags.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ECSpecialCoreTags.o -MD -MP -MF "$(DEPDIR)/amule-ECSpecialCoreTags.Tpo" -c -o amule-ECSpecialCoreTags.o `test -f 'ECSpecialCoreTags.cpp' || echo '$(srcdir)/'`ECSpecialCoreTags.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ECSpecialCoreTags.Tpo" "$(DEPDIR)/amule-ECSpecialCoreTags.Po"; else rm -f "$(DEPDIR)/amule-ECSpecialCoreTags.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECSpecialCoreTags.cpp' object='amule-ECSpecialCoreTags.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ECSpecialCoreTags.o `test -f 'ECSpecialCoreTags.cpp' || echo '$(srcdir)/'`ECSpecialCoreTags.cpp + +amule-ECSpecialCoreTags.obj: ECSpecialCoreTags.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ECSpecialCoreTags.obj -MD -MP -MF "$(DEPDIR)/amule-ECSpecialCoreTags.Tpo" -c -o amule-ECSpecialCoreTags.obj `if test -f 'ECSpecialCoreTags.cpp'; then $(CYGPATH_W) 'ECSpecialCoreTags.cpp'; else $(CYGPATH_W) '$(srcdir)/ECSpecialCoreTags.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ECSpecialCoreTags.Tpo" "$(DEPDIR)/amule-ECSpecialCoreTags.Po"; else rm -f "$(DEPDIR)/amule-ECSpecialCoreTags.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECSpecialCoreTags.cpp' object='amule-ECSpecialCoreTags.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ECSpecialCoreTags.obj `if test -f 'ECSpecialCoreTags.cpp'; then $(CYGPATH_W) 'ECSpecialCoreTags.cpp'; else $(CYGPATH_W) '$(srcdir)/ECSpecialCoreTags.cpp'; fi` + +amule-EMSocket.o: EMSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-EMSocket.o -MD -MP -MF "$(DEPDIR)/amule-EMSocket.Tpo" -c -o amule-EMSocket.o `test -f 'EMSocket.cpp' || echo '$(srcdir)/'`EMSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-EMSocket.Tpo" "$(DEPDIR)/amule-EMSocket.Po"; else rm -f "$(DEPDIR)/amule-EMSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='EMSocket.cpp' object='amule-EMSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-EMSocket.o `test -f 'EMSocket.cpp' || echo '$(srcdir)/'`EMSocket.cpp + +amule-EMSocket.obj: EMSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-EMSocket.obj -MD -MP -MF "$(DEPDIR)/amule-EMSocket.Tpo" -c -o amule-EMSocket.obj `if test -f 'EMSocket.cpp'; then $(CYGPATH_W) 'EMSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/EMSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-EMSocket.Tpo" "$(DEPDIR)/amule-EMSocket.Po"; else rm -f "$(DEPDIR)/amule-EMSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='EMSocket.cpp' object='amule-EMSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-EMSocket.obj `if test -f 'EMSocket.cpp'; then $(CYGPATH_W) 'EMSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/EMSocket.cpp'; fi` + +amule-EncryptedStreamSocket.o: EncryptedStreamSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-EncryptedStreamSocket.o -MD -MP -MF "$(DEPDIR)/amule-EncryptedStreamSocket.Tpo" -c -o amule-EncryptedStreamSocket.o `test -f 'EncryptedStreamSocket.cpp' || echo '$(srcdir)/'`EncryptedStreamSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-EncryptedStreamSocket.Tpo" "$(DEPDIR)/amule-EncryptedStreamSocket.Po"; else rm -f "$(DEPDIR)/amule-EncryptedStreamSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='EncryptedStreamSocket.cpp' object='amule-EncryptedStreamSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-EncryptedStreamSocket.o `test -f 'EncryptedStreamSocket.cpp' || echo '$(srcdir)/'`EncryptedStreamSocket.cpp + +amule-EncryptedStreamSocket.obj: EncryptedStreamSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-EncryptedStreamSocket.obj -MD -MP -MF "$(DEPDIR)/amule-EncryptedStreamSocket.Tpo" -c -o amule-EncryptedStreamSocket.obj `if test -f 'EncryptedStreamSocket.cpp'; then $(CYGPATH_W) 'EncryptedStreamSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/EncryptedStreamSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-EncryptedStreamSocket.Tpo" "$(DEPDIR)/amule-EncryptedStreamSocket.Po"; else rm -f "$(DEPDIR)/amule-EncryptedStreamSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='EncryptedStreamSocket.cpp' object='amule-EncryptedStreamSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-EncryptedStreamSocket.obj `if test -f 'EncryptedStreamSocket.cpp'; then $(CYGPATH_W) 'EncryptedStreamSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/EncryptedStreamSocket.cpp'; fi` + +amule-EncryptedDatagramSocket.o: EncryptedDatagramSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-EncryptedDatagramSocket.o -MD -MP -MF "$(DEPDIR)/amule-EncryptedDatagramSocket.Tpo" -c -o amule-EncryptedDatagramSocket.o `test -f 'EncryptedDatagramSocket.cpp' || echo '$(srcdir)/'`EncryptedDatagramSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-EncryptedDatagramSocket.Tpo" "$(DEPDIR)/amule-EncryptedDatagramSocket.Po"; else rm -f "$(DEPDIR)/amule-EncryptedDatagramSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='EncryptedDatagramSocket.cpp' object='amule-EncryptedDatagramSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-EncryptedDatagramSocket.o `test -f 'EncryptedDatagramSocket.cpp' || echo '$(srcdir)/'`EncryptedDatagramSocket.cpp + +amule-EncryptedDatagramSocket.obj: EncryptedDatagramSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-EncryptedDatagramSocket.obj -MD -MP -MF "$(DEPDIR)/amule-EncryptedDatagramSocket.Tpo" -c -o amule-EncryptedDatagramSocket.obj `if test -f 'EncryptedDatagramSocket.cpp'; then $(CYGPATH_W) 'EncryptedDatagramSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/EncryptedDatagramSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-EncryptedDatagramSocket.Tpo" "$(DEPDIR)/amule-EncryptedDatagramSocket.Po"; else rm -f "$(DEPDIR)/amule-EncryptedDatagramSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='EncryptedDatagramSocket.cpp' object='amule-EncryptedDatagramSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-EncryptedDatagramSocket.obj `if test -f 'EncryptedDatagramSocket.cpp'; then $(CYGPATH_W) 'EncryptedDatagramSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/EncryptedDatagramSocket.cpp'; fi` + +amule-ExternalConn.o: ExternalConn.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ExternalConn.o -MD -MP -MF "$(DEPDIR)/amule-ExternalConn.Tpo" -c -o amule-ExternalConn.o `test -f 'ExternalConn.cpp' || echo '$(srcdir)/'`ExternalConn.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ExternalConn.Tpo" "$(DEPDIR)/amule-ExternalConn.Po"; else rm -f "$(DEPDIR)/amule-ExternalConn.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ExternalConn.cpp' object='amule-ExternalConn.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ExternalConn.o `test -f 'ExternalConn.cpp' || echo '$(srcdir)/'`ExternalConn.cpp + +amule-ExternalConn.obj: ExternalConn.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ExternalConn.obj -MD -MP -MF "$(DEPDIR)/amule-ExternalConn.Tpo" -c -o amule-ExternalConn.obj `if test -f 'ExternalConn.cpp'; then $(CYGPATH_W) 'ExternalConn.cpp'; else $(CYGPATH_W) '$(srcdir)/ExternalConn.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ExternalConn.Tpo" "$(DEPDIR)/amule-ExternalConn.Po"; else rm -f "$(DEPDIR)/amule-ExternalConn.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ExternalConn.cpp' object='amule-ExternalConn.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ExternalConn.obj `if test -f 'ExternalConn.cpp'; then $(CYGPATH_W) 'ExternalConn.cpp'; else $(CYGPATH_W) '$(srcdir)/ExternalConn.cpp'; fi` + +amule-Friend.o: Friend.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Friend.o -MD -MP -MF "$(DEPDIR)/amule-Friend.Tpo" -c -o amule-Friend.o `test -f 'Friend.cpp' || echo '$(srcdir)/'`Friend.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Friend.Tpo" "$(DEPDIR)/amule-Friend.Po"; else rm -f "$(DEPDIR)/amule-Friend.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Friend.cpp' object='amule-Friend.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Friend.o `test -f 'Friend.cpp' || echo '$(srcdir)/'`Friend.cpp + +amule-Friend.obj: Friend.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Friend.obj -MD -MP -MF "$(DEPDIR)/amule-Friend.Tpo" -c -o amule-Friend.obj `if test -f 'Friend.cpp'; then $(CYGPATH_W) 'Friend.cpp'; else $(CYGPATH_W) '$(srcdir)/Friend.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Friend.Tpo" "$(DEPDIR)/amule-Friend.Po"; else rm -f "$(DEPDIR)/amule-Friend.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Friend.cpp' object='amule-Friend.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Friend.obj `if test -f 'Friend.cpp'; then $(CYGPATH_W) 'Friend.cpp'; else $(CYGPATH_W) '$(srcdir)/Friend.cpp'; fi` + +amule-FriendList.o: FriendList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-FriendList.o -MD -MP -MF "$(DEPDIR)/amule-FriendList.Tpo" -c -o amule-FriendList.o `test -f 'FriendList.cpp' || echo '$(srcdir)/'`FriendList.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-FriendList.Tpo" "$(DEPDIR)/amule-FriendList.Po"; else rm -f "$(DEPDIR)/amule-FriendList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FriendList.cpp' object='amule-FriendList.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-FriendList.o `test -f 'FriendList.cpp' || echo '$(srcdir)/'`FriendList.cpp + +amule-FriendList.obj: FriendList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-FriendList.obj -MD -MP -MF "$(DEPDIR)/amule-FriendList.Tpo" -c -o amule-FriendList.obj `if test -f 'FriendList.cpp'; then $(CYGPATH_W) 'FriendList.cpp'; else $(CYGPATH_W) '$(srcdir)/FriendList.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-FriendList.Tpo" "$(DEPDIR)/amule-FriendList.Po"; else rm -f "$(DEPDIR)/amule-FriendList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FriendList.cpp' object='amule-FriendList.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-FriendList.obj `if test -f 'FriendList.cpp'; then $(CYGPATH_W) 'FriendList.cpp'; else $(CYGPATH_W) '$(srcdir)/FriendList.cpp'; fi` + +amule-HTTPDownload.o: HTTPDownload.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-HTTPDownload.o -MD -MP -MF "$(DEPDIR)/amule-HTTPDownload.Tpo" -c -o amule-HTTPDownload.o `test -f 'HTTPDownload.cpp' || echo '$(srcdir)/'`HTTPDownload.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-HTTPDownload.Tpo" "$(DEPDIR)/amule-HTTPDownload.Po"; else rm -f "$(DEPDIR)/amule-HTTPDownload.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='HTTPDownload.cpp' object='amule-HTTPDownload.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-HTTPDownload.o `test -f 'HTTPDownload.cpp' || echo '$(srcdir)/'`HTTPDownload.cpp + +amule-HTTPDownload.obj: HTTPDownload.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-HTTPDownload.obj -MD -MP -MF "$(DEPDIR)/amule-HTTPDownload.Tpo" -c -o amule-HTTPDownload.obj `if test -f 'HTTPDownload.cpp'; then $(CYGPATH_W) 'HTTPDownload.cpp'; else $(CYGPATH_W) '$(srcdir)/HTTPDownload.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-HTTPDownload.Tpo" "$(DEPDIR)/amule-HTTPDownload.Po"; else rm -f "$(DEPDIR)/amule-HTTPDownload.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='HTTPDownload.cpp' object='amule-HTTPDownload.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-HTTPDownload.obj `if test -f 'HTTPDownload.cpp'; then $(CYGPATH_W) 'HTTPDownload.cpp'; else $(CYGPATH_W) '$(srcdir)/HTTPDownload.cpp'; fi` + +amule-IPFilter.o: IPFilter.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-IPFilter.o -MD -MP -MF "$(DEPDIR)/amule-IPFilter.Tpo" -c -o amule-IPFilter.o `test -f 'IPFilter.cpp' || echo '$(srcdir)/'`IPFilter.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-IPFilter.Tpo" "$(DEPDIR)/amule-IPFilter.Po"; else rm -f "$(DEPDIR)/amule-IPFilter.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='IPFilter.cpp' object='amule-IPFilter.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-IPFilter.o `test -f 'IPFilter.cpp' || echo '$(srcdir)/'`IPFilter.cpp + +amule-IPFilter.obj: IPFilter.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-IPFilter.obj -MD -MP -MF "$(DEPDIR)/amule-IPFilter.Tpo" -c -o amule-IPFilter.obj `if test -f 'IPFilter.cpp'; then $(CYGPATH_W) 'IPFilter.cpp'; else $(CYGPATH_W) '$(srcdir)/IPFilter.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-IPFilter.Tpo" "$(DEPDIR)/amule-IPFilter.Po"; else rm -f "$(DEPDIR)/amule-IPFilter.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='IPFilter.cpp' object='amule-IPFilter.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-IPFilter.obj `if test -f 'IPFilter.cpp'; then $(CYGPATH_W) 'IPFilter.cpp'; else $(CYGPATH_W) '$(srcdir)/IPFilter.cpp'; fi` + +amule-KnownFileList.o: KnownFileList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-KnownFileList.o -MD -MP -MF "$(DEPDIR)/amule-KnownFileList.Tpo" -c -o amule-KnownFileList.o `test -f 'KnownFileList.cpp' || echo '$(srcdir)/'`KnownFileList.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-KnownFileList.Tpo" "$(DEPDIR)/amule-KnownFileList.Po"; else rm -f "$(DEPDIR)/amule-KnownFileList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='KnownFileList.cpp' object='amule-KnownFileList.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-KnownFileList.o `test -f 'KnownFileList.cpp' || echo '$(srcdir)/'`KnownFileList.cpp + +amule-KnownFileList.obj: KnownFileList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-KnownFileList.obj -MD -MP -MF "$(DEPDIR)/amule-KnownFileList.Tpo" -c -o amule-KnownFileList.obj `if test -f 'KnownFileList.cpp'; then $(CYGPATH_W) 'KnownFileList.cpp'; else $(CYGPATH_W) '$(srcdir)/KnownFileList.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-KnownFileList.Tpo" "$(DEPDIR)/amule-KnownFileList.Po"; else rm -f "$(DEPDIR)/amule-KnownFileList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='KnownFileList.cpp' object='amule-KnownFileList.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-KnownFileList.obj `if test -f 'KnownFileList.cpp'; then $(CYGPATH_W) 'KnownFileList.cpp'; else $(CYGPATH_W) '$(srcdir)/KnownFileList.cpp'; fi` + +amule-ListenSocket.o: ListenSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ListenSocket.o -MD -MP -MF "$(DEPDIR)/amule-ListenSocket.Tpo" -c -o amule-ListenSocket.o `test -f 'ListenSocket.cpp' || echo '$(srcdir)/'`ListenSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ListenSocket.Tpo" "$(DEPDIR)/amule-ListenSocket.Po"; else rm -f "$(DEPDIR)/amule-ListenSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ListenSocket.cpp' object='amule-ListenSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ListenSocket.o `test -f 'ListenSocket.cpp' || echo '$(srcdir)/'`ListenSocket.cpp + +amule-ListenSocket.obj: ListenSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ListenSocket.obj -MD -MP -MF "$(DEPDIR)/amule-ListenSocket.Tpo" -c -o amule-ListenSocket.obj `if test -f 'ListenSocket.cpp'; then $(CYGPATH_W) 'ListenSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ListenSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ListenSocket.Tpo" "$(DEPDIR)/amule-ListenSocket.Po"; else rm -f "$(DEPDIR)/amule-ListenSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ListenSocket.cpp' object='amule-ListenSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ListenSocket.obj `if test -f 'ListenSocket.cpp'; then $(CYGPATH_W) 'ListenSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ListenSocket.cpp'; fi` + +amule-MuleUDPSocket.o: MuleUDPSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-MuleUDPSocket.o -MD -MP -MF "$(DEPDIR)/amule-MuleUDPSocket.Tpo" -c -o amule-MuleUDPSocket.o `test -f 'MuleUDPSocket.cpp' || echo '$(srcdir)/'`MuleUDPSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-MuleUDPSocket.Tpo" "$(DEPDIR)/amule-MuleUDPSocket.Po"; else rm -f "$(DEPDIR)/amule-MuleUDPSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleUDPSocket.cpp' object='amule-MuleUDPSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-MuleUDPSocket.o `test -f 'MuleUDPSocket.cpp' || echo '$(srcdir)/'`MuleUDPSocket.cpp + +amule-MuleUDPSocket.obj: MuleUDPSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-MuleUDPSocket.obj -MD -MP -MF "$(DEPDIR)/amule-MuleUDPSocket.Tpo" -c -o amule-MuleUDPSocket.obj `if test -f 'MuleUDPSocket.cpp'; then $(CYGPATH_W) 'MuleUDPSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleUDPSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-MuleUDPSocket.Tpo" "$(DEPDIR)/amule-MuleUDPSocket.Po"; else rm -f "$(DEPDIR)/amule-MuleUDPSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleUDPSocket.cpp' object='amule-MuleUDPSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-MuleUDPSocket.obj `if test -f 'MuleUDPSocket.cpp'; then $(CYGPATH_W) 'MuleUDPSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleUDPSocket.cpp'; fi` + +amule-SearchFile.o: SearchFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-SearchFile.o -MD -MP -MF "$(DEPDIR)/amule-SearchFile.Tpo" -c -o amule-SearchFile.o `test -f 'SearchFile.cpp' || echo '$(srcdir)/'`SearchFile.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-SearchFile.Tpo" "$(DEPDIR)/amule-SearchFile.Po"; else rm -f "$(DEPDIR)/amule-SearchFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SearchFile.cpp' object='amule-SearchFile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-SearchFile.o `test -f 'SearchFile.cpp' || echo '$(srcdir)/'`SearchFile.cpp + +amule-SearchFile.obj: SearchFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-SearchFile.obj -MD -MP -MF "$(DEPDIR)/amule-SearchFile.Tpo" -c -o amule-SearchFile.obj `if test -f 'SearchFile.cpp'; then $(CYGPATH_W) 'SearchFile.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchFile.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-SearchFile.Tpo" "$(DEPDIR)/amule-SearchFile.Po"; else rm -f "$(DEPDIR)/amule-SearchFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SearchFile.cpp' object='amule-SearchFile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-SearchFile.obj `if test -f 'SearchFile.cpp'; then $(CYGPATH_W) 'SearchFile.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchFile.cpp'; fi` + +amule-SearchList.o: SearchList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-SearchList.o -MD -MP -MF "$(DEPDIR)/amule-SearchList.Tpo" -c -o amule-SearchList.o `test -f 'SearchList.cpp' || echo '$(srcdir)/'`SearchList.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-SearchList.Tpo" "$(DEPDIR)/amule-SearchList.Po"; else rm -f "$(DEPDIR)/amule-SearchList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SearchList.cpp' object='amule-SearchList.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-SearchList.o `test -f 'SearchList.cpp' || echo '$(srcdir)/'`SearchList.cpp + +amule-SearchList.obj: SearchList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-SearchList.obj -MD -MP -MF "$(DEPDIR)/amule-SearchList.Tpo" -c -o amule-SearchList.obj `if test -f 'SearchList.cpp'; then $(CYGPATH_W) 'SearchList.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchList.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-SearchList.Tpo" "$(DEPDIR)/amule-SearchList.Po"; else rm -f "$(DEPDIR)/amule-SearchList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SearchList.cpp' object='amule-SearchList.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-SearchList.obj `if test -f 'SearchList.cpp'; then $(CYGPATH_W) 'SearchList.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchList.cpp'; fi` + +amule-ServerConnect.o: ServerConnect.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ServerConnect.o -MD -MP -MF "$(DEPDIR)/amule-ServerConnect.Tpo" -c -o amule-ServerConnect.o `test -f 'ServerConnect.cpp' || echo '$(srcdir)/'`ServerConnect.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ServerConnect.Tpo" "$(DEPDIR)/amule-ServerConnect.Po"; else rm -f "$(DEPDIR)/amule-ServerConnect.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerConnect.cpp' object='amule-ServerConnect.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ServerConnect.o `test -f 'ServerConnect.cpp' || echo '$(srcdir)/'`ServerConnect.cpp + +amule-ServerConnect.obj: ServerConnect.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ServerConnect.obj -MD -MP -MF "$(DEPDIR)/amule-ServerConnect.Tpo" -c -o amule-ServerConnect.obj `if test -f 'ServerConnect.cpp'; then $(CYGPATH_W) 'ServerConnect.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerConnect.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ServerConnect.Tpo" "$(DEPDIR)/amule-ServerConnect.Po"; else rm -f "$(DEPDIR)/amule-ServerConnect.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerConnect.cpp' object='amule-ServerConnect.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ServerConnect.obj `if test -f 'ServerConnect.cpp'; then $(CYGPATH_W) 'ServerConnect.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerConnect.cpp'; fi` + +amule-ServerList.o: ServerList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ServerList.o -MD -MP -MF "$(DEPDIR)/amule-ServerList.Tpo" -c -o amule-ServerList.o `test -f 'ServerList.cpp' || echo '$(srcdir)/'`ServerList.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ServerList.Tpo" "$(DEPDIR)/amule-ServerList.Po"; else rm -f "$(DEPDIR)/amule-ServerList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerList.cpp' object='amule-ServerList.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ServerList.o `test -f 'ServerList.cpp' || echo '$(srcdir)/'`ServerList.cpp + +amule-ServerList.obj: ServerList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ServerList.obj -MD -MP -MF "$(DEPDIR)/amule-ServerList.Tpo" -c -o amule-ServerList.obj `if test -f 'ServerList.cpp'; then $(CYGPATH_W) 'ServerList.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerList.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ServerList.Tpo" "$(DEPDIR)/amule-ServerList.Po"; else rm -f "$(DEPDIR)/amule-ServerList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerList.cpp' object='amule-ServerList.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ServerList.obj `if test -f 'ServerList.cpp'; then $(CYGPATH_W) 'ServerList.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerList.cpp'; fi` + +amule-ServerSocket.o: ServerSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ServerSocket.o -MD -MP -MF "$(DEPDIR)/amule-ServerSocket.Tpo" -c -o amule-ServerSocket.o `test -f 'ServerSocket.cpp' || echo '$(srcdir)/'`ServerSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ServerSocket.Tpo" "$(DEPDIR)/amule-ServerSocket.Po"; else rm -f "$(DEPDIR)/amule-ServerSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerSocket.cpp' object='amule-ServerSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ServerSocket.o `test -f 'ServerSocket.cpp' || echo '$(srcdir)/'`ServerSocket.cpp + +amule-ServerSocket.obj: ServerSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ServerSocket.obj -MD -MP -MF "$(DEPDIR)/amule-ServerSocket.Tpo" -c -o amule-ServerSocket.obj `if test -f 'ServerSocket.cpp'; then $(CYGPATH_W) 'ServerSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ServerSocket.Tpo" "$(DEPDIR)/amule-ServerSocket.Po"; else rm -f "$(DEPDIR)/amule-ServerSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerSocket.cpp' object='amule-ServerSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ServerSocket.obj `if test -f 'ServerSocket.cpp'; then $(CYGPATH_W) 'ServerSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerSocket.cpp'; fi` + +amule-ServerUDPSocket.o: ServerUDPSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ServerUDPSocket.o -MD -MP -MF "$(DEPDIR)/amule-ServerUDPSocket.Tpo" -c -o amule-ServerUDPSocket.o `test -f 'ServerUDPSocket.cpp' || echo '$(srcdir)/'`ServerUDPSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ServerUDPSocket.Tpo" "$(DEPDIR)/amule-ServerUDPSocket.Po"; else rm -f "$(DEPDIR)/amule-ServerUDPSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerUDPSocket.cpp' object='amule-ServerUDPSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ServerUDPSocket.o `test -f 'ServerUDPSocket.cpp' || echo '$(srcdir)/'`ServerUDPSocket.cpp + +amule-ServerUDPSocket.obj: ServerUDPSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ServerUDPSocket.obj -MD -MP -MF "$(DEPDIR)/amule-ServerUDPSocket.Tpo" -c -o amule-ServerUDPSocket.obj `if test -f 'ServerUDPSocket.cpp'; then $(CYGPATH_W) 'ServerUDPSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerUDPSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ServerUDPSocket.Tpo" "$(DEPDIR)/amule-ServerUDPSocket.Po"; else rm -f "$(DEPDIR)/amule-ServerUDPSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerUDPSocket.cpp' object='amule-ServerUDPSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ServerUDPSocket.obj `if test -f 'ServerUDPSocket.cpp'; then $(CYGPATH_W) 'ServerUDPSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerUDPSocket.cpp'; fi` + +amule-SharedFileList.o: SharedFileList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-SharedFileList.o -MD -MP -MF "$(DEPDIR)/amule-SharedFileList.Tpo" -c -o amule-SharedFileList.o `test -f 'SharedFileList.cpp' || echo '$(srcdir)/'`SharedFileList.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-SharedFileList.Tpo" "$(DEPDIR)/amule-SharedFileList.Po"; else rm -f "$(DEPDIR)/amule-SharedFileList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SharedFileList.cpp' object='amule-SharedFileList.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-SharedFileList.o `test -f 'SharedFileList.cpp' || echo '$(srcdir)/'`SharedFileList.cpp + +amule-SharedFileList.obj: SharedFileList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-SharedFileList.obj -MD -MP -MF "$(DEPDIR)/amule-SharedFileList.Tpo" -c -o amule-SharedFileList.obj `if test -f 'SharedFileList.cpp'; then $(CYGPATH_W) 'SharedFileList.cpp'; else $(CYGPATH_W) '$(srcdir)/SharedFileList.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-SharedFileList.Tpo" "$(DEPDIR)/amule-SharedFileList.Po"; else rm -f "$(DEPDIR)/amule-SharedFileList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SharedFileList.cpp' object='amule-SharedFileList.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-SharedFileList.obj `if test -f 'SharedFileList.cpp'; then $(CYGPATH_W) 'SharedFileList.cpp'; else $(CYGPATH_W) '$(srcdir)/SharedFileList.cpp'; fi` + +amule-ThreadTasks.o: ThreadTasks.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ThreadTasks.o -MD -MP -MF "$(DEPDIR)/amule-ThreadTasks.Tpo" -c -o amule-ThreadTasks.o `test -f 'ThreadTasks.cpp' || echo '$(srcdir)/'`ThreadTasks.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ThreadTasks.Tpo" "$(DEPDIR)/amule-ThreadTasks.Po"; else rm -f "$(DEPDIR)/amule-ThreadTasks.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ThreadTasks.cpp' object='amule-ThreadTasks.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ThreadTasks.o `test -f 'ThreadTasks.cpp' || echo '$(srcdir)/'`ThreadTasks.cpp + +amule-ThreadTasks.obj: ThreadTasks.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ThreadTasks.obj -MD -MP -MF "$(DEPDIR)/amule-ThreadTasks.Tpo" -c -o amule-ThreadTasks.obj `if test -f 'ThreadTasks.cpp'; then $(CYGPATH_W) 'ThreadTasks.cpp'; else $(CYGPATH_W) '$(srcdir)/ThreadTasks.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ThreadTasks.Tpo" "$(DEPDIR)/amule-ThreadTasks.Po"; else rm -f "$(DEPDIR)/amule-ThreadTasks.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ThreadTasks.cpp' object='amule-ThreadTasks.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ThreadTasks.obj `if test -f 'ThreadTasks.cpp'; then $(CYGPATH_W) 'ThreadTasks.cpp'; else $(CYGPATH_W) '$(srcdir)/ThreadTasks.cpp'; fi` + +amule-UploadBandwidthThrottler.o: UploadBandwidthThrottler.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-UploadBandwidthThrottler.o -MD -MP -MF "$(DEPDIR)/amule-UploadBandwidthThrottler.Tpo" -c -o amule-UploadBandwidthThrottler.o `test -f 'UploadBandwidthThrottler.cpp' || echo '$(srcdir)/'`UploadBandwidthThrottler.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-UploadBandwidthThrottler.Tpo" "$(DEPDIR)/amule-UploadBandwidthThrottler.Po"; else rm -f "$(DEPDIR)/amule-UploadBandwidthThrottler.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UploadBandwidthThrottler.cpp' object='amule-UploadBandwidthThrottler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-UploadBandwidthThrottler.o `test -f 'UploadBandwidthThrottler.cpp' || echo '$(srcdir)/'`UploadBandwidthThrottler.cpp + +amule-UploadBandwidthThrottler.obj: UploadBandwidthThrottler.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-UploadBandwidthThrottler.obj -MD -MP -MF "$(DEPDIR)/amule-UploadBandwidthThrottler.Tpo" -c -o amule-UploadBandwidthThrottler.obj `if test -f 'UploadBandwidthThrottler.cpp'; then $(CYGPATH_W) 'UploadBandwidthThrottler.cpp'; else $(CYGPATH_W) '$(srcdir)/UploadBandwidthThrottler.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-UploadBandwidthThrottler.Tpo" "$(DEPDIR)/amule-UploadBandwidthThrottler.Po"; else rm -f "$(DEPDIR)/amule-UploadBandwidthThrottler.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UploadBandwidthThrottler.cpp' object='amule-UploadBandwidthThrottler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-UploadBandwidthThrottler.obj `if test -f 'UploadBandwidthThrottler.cpp'; then $(CYGPATH_W) 'UploadBandwidthThrottler.cpp'; else $(CYGPATH_W) '$(srcdir)/UploadBandwidthThrottler.cpp'; fi` + +amule-UploadClient.o: UploadClient.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-UploadClient.o -MD -MP -MF "$(DEPDIR)/amule-UploadClient.Tpo" -c -o amule-UploadClient.o `test -f 'UploadClient.cpp' || echo '$(srcdir)/'`UploadClient.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-UploadClient.Tpo" "$(DEPDIR)/amule-UploadClient.Po"; else rm -f "$(DEPDIR)/amule-UploadClient.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UploadClient.cpp' object='amule-UploadClient.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-UploadClient.o `test -f 'UploadClient.cpp' || echo '$(srcdir)/'`UploadClient.cpp + +amule-UploadClient.obj: UploadClient.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-UploadClient.obj -MD -MP -MF "$(DEPDIR)/amule-UploadClient.Tpo" -c -o amule-UploadClient.obj `if test -f 'UploadClient.cpp'; then $(CYGPATH_W) 'UploadClient.cpp'; else $(CYGPATH_W) '$(srcdir)/UploadClient.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-UploadClient.Tpo" "$(DEPDIR)/amule-UploadClient.Po"; else rm -f "$(DEPDIR)/amule-UploadClient.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UploadClient.cpp' object='amule-UploadClient.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-UploadClient.obj `if test -f 'UploadClient.cpp'; then $(CYGPATH_W) 'UploadClient.cpp'; else $(CYGPATH_W) '$(srcdir)/UploadClient.cpp'; fi` + +amule-UploadQueue.o: UploadQueue.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-UploadQueue.o -MD -MP -MF "$(DEPDIR)/amule-UploadQueue.Tpo" -c -o amule-UploadQueue.o `test -f 'UploadQueue.cpp' || echo '$(srcdir)/'`UploadQueue.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-UploadQueue.Tpo" "$(DEPDIR)/amule-UploadQueue.Po"; else rm -f "$(DEPDIR)/amule-UploadQueue.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UploadQueue.cpp' object='amule-UploadQueue.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-UploadQueue.o `test -f 'UploadQueue.cpp' || echo '$(srcdir)/'`UploadQueue.cpp + +amule-UploadQueue.obj: UploadQueue.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-UploadQueue.obj -MD -MP -MF "$(DEPDIR)/amule-UploadQueue.Tpo" -c -o amule-UploadQueue.obj `if test -f 'UploadQueue.cpp'; then $(CYGPATH_W) 'UploadQueue.cpp'; else $(CYGPATH_W) '$(srcdir)/UploadQueue.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-UploadQueue.Tpo" "$(DEPDIR)/amule-UploadQueue.Po"; else rm -f "$(DEPDIR)/amule-UploadQueue.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UploadQueue.cpp' object='amule-UploadQueue.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-UploadQueue.obj `if test -f 'UploadQueue.cpp'; then $(CYGPATH_W) 'UploadQueue.cpp'; else $(CYGPATH_W) '$(srcdir)/UploadQueue.cpp'; fi` + +amule-Kademlia.o: kademlia/kademlia/Kademlia.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Kademlia.o -MD -MP -MF "$(DEPDIR)/amule-Kademlia.Tpo" -c -o amule-Kademlia.o `test -f 'kademlia/kademlia/Kademlia.cpp' || echo '$(srcdir)/'`kademlia/kademlia/Kademlia.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Kademlia.Tpo" "$(DEPDIR)/amule-Kademlia.Po"; else rm -f "$(DEPDIR)/amule-Kademlia.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/kademlia/Kademlia.cpp' object='amule-Kademlia.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Kademlia.o `test -f 'kademlia/kademlia/Kademlia.cpp' || echo '$(srcdir)/'`kademlia/kademlia/Kademlia.cpp + +amule-Kademlia.obj: kademlia/kademlia/Kademlia.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Kademlia.obj -MD -MP -MF "$(DEPDIR)/amule-Kademlia.Tpo" -c -o amule-Kademlia.obj `if test -f 'kademlia/kademlia/Kademlia.cpp'; then $(CYGPATH_W) 'kademlia/kademlia/Kademlia.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/kademlia/Kademlia.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Kademlia.Tpo" "$(DEPDIR)/amule-Kademlia.Po"; else rm -f "$(DEPDIR)/amule-Kademlia.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/kademlia/Kademlia.cpp' object='amule-Kademlia.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Kademlia.obj `if test -f 'kademlia/kademlia/Kademlia.cpp'; then $(CYGPATH_W) 'kademlia/kademlia/Kademlia.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/kademlia/Kademlia.cpp'; fi` + +amule-Search.o: kademlia/kademlia/Search.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Search.o -MD -MP -MF "$(DEPDIR)/amule-Search.Tpo" -c -o amule-Search.o `test -f 'kademlia/kademlia/Search.cpp' || echo '$(srcdir)/'`kademlia/kademlia/Search.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Search.Tpo" "$(DEPDIR)/amule-Search.Po"; else rm -f "$(DEPDIR)/amule-Search.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/kademlia/Search.cpp' object='amule-Search.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Search.o `test -f 'kademlia/kademlia/Search.cpp' || echo '$(srcdir)/'`kademlia/kademlia/Search.cpp + +amule-Search.obj: kademlia/kademlia/Search.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Search.obj -MD -MP -MF "$(DEPDIR)/amule-Search.Tpo" -c -o amule-Search.obj `if test -f 'kademlia/kademlia/Search.cpp'; then $(CYGPATH_W) 'kademlia/kademlia/Search.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/kademlia/Search.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Search.Tpo" "$(DEPDIR)/amule-Search.Po"; else rm -f "$(DEPDIR)/amule-Search.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/kademlia/Search.cpp' object='amule-Search.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Search.obj `if test -f 'kademlia/kademlia/Search.cpp'; then $(CYGPATH_W) 'kademlia/kademlia/Search.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/kademlia/Search.cpp'; fi` + +amule-Indexed.o: kademlia/kademlia/Indexed.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Indexed.o -MD -MP -MF "$(DEPDIR)/amule-Indexed.Tpo" -c -o amule-Indexed.o `test -f 'kademlia/kademlia/Indexed.cpp' || echo '$(srcdir)/'`kademlia/kademlia/Indexed.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Indexed.Tpo" "$(DEPDIR)/amule-Indexed.Po"; else rm -f "$(DEPDIR)/amule-Indexed.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/kademlia/Indexed.cpp' object='amule-Indexed.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Indexed.o `test -f 'kademlia/kademlia/Indexed.cpp' || echo '$(srcdir)/'`kademlia/kademlia/Indexed.cpp + +amule-Indexed.obj: kademlia/kademlia/Indexed.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Indexed.obj -MD -MP -MF "$(DEPDIR)/amule-Indexed.Tpo" -c -o amule-Indexed.obj `if test -f 'kademlia/kademlia/Indexed.cpp'; then $(CYGPATH_W) 'kademlia/kademlia/Indexed.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/kademlia/Indexed.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Indexed.Tpo" "$(DEPDIR)/amule-Indexed.Po"; else rm -f "$(DEPDIR)/amule-Indexed.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/kademlia/Indexed.cpp' object='amule-Indexed.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Indexed.obj `if test -f 'kademlia/kademlia/Indexed.cpp'; then $(CYGPATH_W) 'kademlia/kademlia/Indexed.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/kademlia/Indexed.cpp'; fi` + +amule-KademliaUDPListener.o: kademlia/net/KademliaUDPListener.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-KademliaUDPListener.o -MD -MP -MF "$(DEPDIR)/amule-KademliaUDPListener.Tpo" -c -o amule-KademliaUDPListener.o `test -f 'kademlia/net/KademliaUDPListener.cpp' || echo '$(srcdir)/'`kademlia/net/KademliaUDPListener.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-KademliaUDPListener.Tpo" "$(DEPDIR)/amule-KademliaUDPListener.Po"; else rm -f "$(DEPDIR)/amule-KademliaUDPListener.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/net/KademliaUDPListener.cpp' object='amule-KademliaUDPListener.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-KademliaUDPListener.o `test -f 'kademlia/net/KademliaUDPListener.cpp' || echo '$(srcdir)/'`kademlia/net/KademliaUDPListener.cpp + +amule-KademliaUDPListener.obj: kademlia/net/KademliaUDPListener.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-KademliaUDPListener.obj -MD -MP -MF "$(DEPDIR)/amule-KademliaUDPListener.Tpo" -c -o amule-KademliaUDPListener.obj `if test -f 'kademlia/net/KademliaUDPListener.cpp'; then $(CYGPATH_W) 'kademlia/net/KademliaUDPListener.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/net/KademliaUDPListener.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-KademliaUDPListener.Tpo" "$(DEPDIR)/amule-KademliaUDPListener.Po"; else rm -f "$(DEPDIR)/amule-KademliaUDPListener.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/net/KademliaUDPListener.cpp' object='amule-KademliaUDPListener.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-KademliaUDPListener.obj `if test -f 'kademlia/net/KademliaUDPListener.cpp'; then $(CYGPATH_W) 'kademlia/net/KademliaUDPListener.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/net/KademliaUDPListener.cpp'; fi` + +amule-Prefs.o: kademlia/kademlia/Prefs.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Prefs.o -MD -MP -MF "$(DEPDIR)/amule-Prefs.Tpo" -c -o amule-Prefs.o `test -f 'kademlia/kademlia/Prefs.cpp' || echo '$(srcdir)/'`kademlia/kademlia/Prefs.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Prefs.Tpo" "$(DEPDIR)/amule-Prefs.Po"; else rm -f "$(DEPDIR)/amule-Prefs.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/kademlia/Prefs.cpp' object='amule-Prefs.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Prefs.o `test -f 'kademlia/kademlia/Prefs.cpp' || echo '$(srcdir)/'`kademlia/kademlia/Prefs.cpp + +amule-Prefs.obj: kademlia/kademlia/Prefs.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Prefs.obj -MD -MP -MF "$(DEPDIR)/amule-Prefs.Tpo" -c -o amule-Prefs.obj `if test -f 'kademlia/kademlia/Prefs.cpp'; then $(CYGPATH_W) 'kademlia/kademlia/Prefs.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/kademlia/Prefs.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Prefs.Tpo" "$(DEPDIR)/amule-Prefs.Po"; else rm -f "$(DEPDIR)/amule-Prefs.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/kademlia/Prefs.cpp' object='amule-Prefs.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Prefs.obj `if test -f 'kademlia/kademlia/Prefs.cpp'; then $(CYGPATH_W) 'kademlia/kademlia/Prefs.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/kademlia/Prefs.cpp'; fi` + +amule-RoutingZone.o: kademlia/routing/RoutingZone.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-RoutingZone.o -MD -MP -MF "$(DEPDIR)/amule-RoutingZone.Tpo" -c -o amule-RoutingZone.o `test -f 'kademlia/routing/RoutingZone.cpp' || echo '$(srcdir)/'`kademlia/routing/RoutingZone.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-RoutingZone.Tpo" "$(DEPDIR)/amule-RoutingZone.Po"; else rm -f "$(DEPDIR)/amule-RoutingZone.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/routing/RoutingZone.cpp' object='amule-RoutingZone.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-RoutingZone.o `test -f 'kademlia/routing/RoutingZone.cpp' || echo '$(srcdir)/'`kademlia/routing/RoutingZone.cpp + +amule-RoutingZone.obj: kademlia/routing/RoutingZone.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-RoutingZone.obj -MD -MP -MF "$(DEPDIR)/amule-RoutingZone.Tpo" -c -o amule-RoutingZone.obj `if test -f 'kademlia/routing/RoutingZone.cpp'; then $(CYGPATH_W) 'kademlia/routing/RoutingZone.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/routing/RoutingZone.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-RoutingZone.Tpo" "$(DEPDIR)/amule-RoutingZone.Po"; else rm -f "$(DEPDIR)/amule-RoutingZone.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/routing/RoutingZone.cpp' object='amule-RoutingZone.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-RoutingZone.obj `if test -f 'kademlia/routing/RoutingZone.cpp'; then $(CYGPATH_W) 'kademlia/routing/RoutingZone.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/routing/RoutingZone.cpp'; fi` + +amule-Contact.o: kademlia/routing/Contact.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Contact.o -MD -MP -MF "$(DEPDIR)/amule-Contact.Tpo" -c -o amule-Contact.o `test -f 'kademlia/routing/Contact.cpp' || echo '$(srcdir)/'`kademlia/routing/Contact.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Contact.Tpo" "$(DEPDIR)/amule-Contact.Po"; else rm -f "$(DEPDIR)/amule-Contact.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/routing/Contact.cpp' object='amule-Contact.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Contact.o `test -f 'kademlia/routing/Contact.cpp' || echo '$(srcdir)/'`kademlia/routing/Contact.cpp + +amule-Contact.obj: kademlia/routing/Contact.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Contact.obj -MD -MP -MF "$(DEPDIR)/amule-Contact.Tpo" -c -o amule-Contact.obj `if test -f 'kademlia/routing/Contact.cpp'; then $(CYGPATH_W) 'kademlia/routing/Contact.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/routing/Contact.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Contact.Tpo" "$(DEPDIR)/amule-Contact.Po"; else rm -f "$(DEPDIR)/amule-Contact.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/routing/Contact.cpp' object='amule-Contact.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Contact.obj `if test -f 'kademlia/routing/Contact.cpp'; then $(CYGPATH_W) 'kademlia/routing/Contact.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/routing/Contact.cpp'; fi` + +amule-UPnP.o: UPnP.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-UPnP.o -MD -MP -MF "$(DEPDIR)/amule-UPnP.Tpo" -c -o amule-UPnP.o `test -f 'UPnP.cpp' || echo '$(srcdir)/'`UPnP.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-UPnP.Tpo" "$(DEPDIR)/amule-UPnP.Po"; else rm -f "$(DEPDIR)/amule-UPnP.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UPnP.cpp' object='amule-UPnP.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-UPnP.o `test -f 'UPnP.cpp' || echo '$(srcdir)/'`UPnP.cpp + +amule-UPnP.obj: UPnP.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-UPnP.obj -MD -MP -MF "$(DEPDIR)/amule-UPnP.Tpo" -c -o amule-UPnP.obj `if test -f 'UPnP.cpp'; then $(CYGPATH_W) 'UPnP.cpp'; else $(CYGPATH_W) '$(srcdir)/UPnP.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-UPnP.Tpo" "$(DEPDIR)/amule-UPnP.Po"; else rm -f "$(DEPDIR)/amule-UPnP.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UPnP.cpp' object='amule-UPnP.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-UPnP.obj `if test -f 'UPnP.cpp'; then $(CYGPATH_W) 'UPnP.cpp'; else $(CYGPATH_W) '$(srcdir)/UPnP.cpp'; fi` + +amule-UPnPCompatibility.o: UPnPCompatibility.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-UPnPCompatibility.o -MD -MP -MF "$(DEPDIR)/amule-UPnPCompatibility.Tpo" -c -o amule-UPnPCompatibility.o `test -f 'UPnPCompatibility.cpp' || echo '$(srcdir)/'`UPnPCompatibility.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-UPnPCompatibility.Tpo" "$(DEPDIR)/amule-UPnPCompatibility.Po"; else rm -f "$(DEPDIR)/amule-UPnPCompatibility.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UPnPCompatibility.cpp' object='amule-UPnPCompatibility.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-UPnPCompatibility.o `test -f 'UPnPCompatibility.cpp' || echo '$(srcdir)/'`UPnPCompatibility.cpp + +amule-UPnPCompatibility.obj: UPnPCompatibility.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-UPnPCompatibility.obj -MD -MP -MF "$(DEPDIR)/amule-UPnPCompatibility.Tpo" -c -o amule-UPnPCompatibility.obj `if test -f 'UPnPCompatibility.cpp'; then $(CYGPATH_W) 'UPnPCompatibility.cpp'; else $(CYGPATH_W) '$(srcdir)/UPnPCompatibility.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-UPnPCompatibility.Tpo" "$(DEPDIR)/amule-UPnPCompatibility.Po"; else rm -f "$(DEPDIR)/amule-UPnPCompatibility.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UPnPCompatibility.cpp' object='amule-UPnPCompatibility.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-UPnPCompatibility.obj `if test -f 'UPnPCompatibility.cpp'; then $(CYGPATH_W) 'UPnPCompatibility.cpp'; else $(CYGPATH_W) '$(srcdir)/UPnPCompatibility.cpp'; fi` + +amule-amule-gui.o: amule-gui.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-amule-gui.o -MD -MP -MF "$(DEPDIR)/amule-amule-gui.Tpo" -c -o amule-amule-gui.o `test -f 'amule-gui.cpp' || echo '$(srcdir)/'`amule-gui.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-amule-gui.Tpo" "$(DEPDIR)/amule-amule-gui.Po"; else rm -f "$(DEPDIR)/amule-amule-gui.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='amule-gui.cpp' object='amule-amule-gui.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-amule-gui.o `test -f 'amule-gui.cpp' || echo '$(srcdir)/'`amule-gui.cpp + +amule-amule-gui.obj: amule-gui.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-amule-gui.obj -MD -MP -MF "$(DEPDIR)/amule-amule-gui.Tpo" -c -o amule-amule-gui.obj `if test -f 'amule-gui.cpp'; then $(CYGPATH_W) 'amule-gui.cpp'; else $(CYGPATH_W) '$(srcdir)/amule-gui.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-amule-gui.Tpo" "$(DEPDIR)/amule-amule-gui.Po"; else rm -f "$(DEPDIR)/amule-amule-gui.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='amule-gui.cpp' object='amule-amule-gui.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-amule-gui.obj `if test -f 'amule-gui.cpp'; then $(CYGPATH_W) 'amule-gui.cpp'; else $(CYGPATH_W) '$(srcdir)/amule-gui.cpp'; fi` + +amule-amuleDlg.o: amuleDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-amuleDlg.o -MD -MP -MF "$(DEPDIR)/amule-amuleDlg.Tpo" -c -o amule-amuleDlg.o `test -f 'amuleDlg.cpp' || echo '$(srcdir)/'`amuleDlg.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-amuleDlg.Tpo" "$(DEPDIR)/amule-amuleDlg.Po"; else rm -f "$(DEPDIR)/amule-amuleDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='amuleDlg.cpp' object='amule-amuleDlg.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-amuleDlg.o `test -f 'amuleDlg.cpp' || echo '$(srcdir)/'`amuleDlg.cpp + +amule-amuleDlg.obj: amuleDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-amuleDlg.obj -MD -MP -MF "$(DEPDIR)/amule-amuleDlg.Tpo" -c -o amule-amuleDlg.obj `if test -f 'amuleDlg.cpp'; then $(CYGPATH_W) 'amuleDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/amuleDlg.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-amuleDlg.Tpo" "$(DEPDIR)/amule-amuleDlg.Po"; else rm -f "$(DEPDIR)/amule-amuleDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='amuleDlg.cpp' object='amule-amuleDlg.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-amuleDlg.obj `if test -f 'amuleDlg.cpp'; then $(CYGPATH_W) 'amuleDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/amuleDlg.cpp'; fi` + +amule-AddFriend.o: AddFriend.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-AddFriend.o -MD -MP -MF "$(DEPDIR)/amule-AddFriend.Tpo" -c -o amule-AddFriend.o `test -f 'AddFriend.cpp' || echo '$(srcdir)/'`AddFriend.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-AddFriend.Tpo" "$(DEPDIR)/amule-AddFriend.Po"; else rm -f "$(DEPDIR)/amule-AddFriend.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='AddFriend.cpp' object='amule-AddFriend.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-AddFriend.o `test -f 'AddFriend.cpp' || echo '$(srcdir)/'`AddFriend.cpp + +amule-AddFriend.obj: AddFriend.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-AddFriend.obj -MD -MP -MF "$(DEPDIR)/amule-AddFriend.Tpo" -c -o amule-AddFriend.obj `if test -f 'AddFriend.cpp'; then $(CYGPATH_W) 'AddFriend.cpp'; else $(CYGPATH_W) '$(srcdir)/AddFriend.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-AddFriend.Tpo" "$(DEPDIR)/amule-AddFriend.Po"; else rm -f "$(DEPDIR)/amule-AddFriend.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='AddFriend.cpp' object='amule-AddFriend.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-AddFriend.obj `if test -f 'AddFriend.cpp'; then $(CYGPATH_W) 'AddFriend.cpp'; else $(CYGPATH_W) '$(srcdir)/AddFriend.cpp'; fi` + +amule-CatDialog.o: CatDialog.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-CatDialog.o -MD -MP -MF "$(DEPDIR)/amule-CatDialog.Tpo" -c -o amule-CatDialog.o `test -f 'CatDialog.cpp' || echo '$(srcdir)/'`CatDialog.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-CatDialog.Tpo" "$(DEPDIR)/amule-CatDialog.Po"; else rm -f "$(DEPDIR)/amule-CatDialog.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='CatDialog.cpp' object='amule-CatDialog.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-CatDialog.o `test -f 'CatDialog.cpp' || echo '$(srcdir)/'`CatDialog.cpp + +amule-CatDialog.obj: CatDialog.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-CatDialog.obj -MD -MP -MF "$(DEPDIR)/amule-CatDialog.Tpo" -c -o amule-CatDialog.obj `if test -f 'CatDialog.cpp'; then $(CYGPATH_W) 'CatDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/CatDialog.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-CatDialog.Tpo" "$(DEPDIR)/amule-CatDialog.Po"; else rm -f "$(DEPDIR)/amule-CatDialog.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='CatDialog.cpp' object='amule-CatDialog.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-CatDialog.obj `if test -f 'CatDialog.cpp'; then $(CYGPATH_W) 'CatDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/CatDialog.cpp'; fi` + +amule-ChatSelector.o: ChatSelector.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ChatSelector.o -MD -MP -MF "$(DEPDIR)/amule-ChatSelector.Tpo" -c -o amule-ChatSelector.o `test -f 'ChatSelector.cpp' || echo '$(srcdir)/'`ChatSelector.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ChatSelector.Tpo" "$(DEPDIR)/amule-ChatSelector.Po"; else rm -f "$(DEPDIR)/amule-ChatSelector.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ChatSelector.cpp' object='amule-ChatSelector.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ChatSelector.o `test -f 'ChatSelector.cpp' || echo '$(srcdir)/'`ChatSelector.cpp + +amule-ChatSelector.obj: ChatSelector.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ChatSelector.obj -MD -MP -MF "$(DEPDIR)/amule-ChatSelector.Tpo" -c -o amule-ChatSelector.obj `if test -f 'ChatSelector.cpp'; then $(CYGPATH_W) 'ChatSelector.cpp'; else $(CYGPATH_W) '$(srcdir)/ChatSelector.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ChatSelector.Tpo" "$(DEPDIR)/amule-ChatSelector.Po"; else rm -f "$(DEPDIR)/amule-ChatSelector.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ChatSelector.cpp' object='amule-ChatSelector.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ChatSelector.obj `if test -f 'ChatSelector.cpp'; then $(CYGPATH_W) 'ChatSelector.cpp'; else $(CYGPATH_W) '$(srcdir)/ChatSelector.cpp'; fi` + +amule-ClientDetailDialog.o: ClientDetailDialog.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ClientDetailDialog.o -MD -MP -MF "$(DEPDIR)/amule-ClientDetailDialog.Tpo" -c -o amule-ClientDetailDialog.o `test -f 'ClientDetailDialog.cpp' || echo '$(srcdir)/'`ClientDetailDialog.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ClientDetailDialog.Tpo" "$(DEPDIR)/amule-ClientDetailDialog.Po"; else rm -f "$(DEPDIR)/amule-ClientDetailDialog.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientDetailDialog.cpp' object='amule-ClientDetailDialog.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ClientDetailDialog.o `test -f 'ClientDetailDialog.cpp' || echo '$(srcdir)/'`ClientDetailDialog.cpp + +amule-ClientDetailDialog.obj: ClientDetailDialog.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ClientDetailDialog.obj -MD -MP -MF "$(DEPDIR)/amule-ClientDetailDialog.Tpo" -c -o amule-ClientDetailDialog.obj `if test -f 'ClientDetailDialog.cpp'; then $(CYGPATH_W) 'ClientDetailDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientDetailDialog.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ClientDetailDialog.Tpo" "$(DEPDIR)/amule-ClientDetailDialog.Po"; else rm -f "$(DEPDIR)/amule-ClientDetailDialog.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientDetailDialog.cpp' object='amule-ClientDetailDialog.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ClientDetailDialog.obj `if test -f 'ClientDetailDialog.cpp'; then $(CYGPATH_W) 'ClientDetailDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientDetailDialog.cpp'; fi` + +amule-FileDetailDialog.o: FileDetailDialog.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-FileDetailDialog.o -MD -MP -MF "$(DEPDIR)/amule-FileDetailDialog.Tpo" -c -o amule-FileDetailDialog.o `test -f 'FileDetailDialog.cpp' || echo '$(srcdir)/'`FileDetailDialog.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-FileDetailDialog.Tpo" "$(DEPDIR)/amule-FileDetailDialog.Po"; else rm -f "$(DEPDIR)/amule-FileDetailDialog.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FileDetailDialog.cpp' object='amule-FileDetailDialog.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-FileDetailDialog.o `test -f 'FileDetailDialog.cpp' || echo '$(srcdir)/'`FileDetailDialog.cpp + +amule-FileDetailDialog.obj: FileDetailDialog.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-FileDetailDialog.obj -MD -MP -MF "$(DEPDIR)/amule-FileDetailDialog.Tpo" -c -o amule-FileDetailDialog.obj `if test -f 'FileDetailDialog.cpp'; then $(CYGPATH_W) 'FileDetailDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/FileDetailDialog.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-FileDetailDialog.Tpo" "$(DEPDIR)/amule-FileDetailDialog.Po"; else rm -f "$(DEPDIR)/amule-FileDetailDialog.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FileDetailDialog.cpp' object='amule-FileDetailDialog.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-FileDetailDialog.obj `if test -f 'FileDetailDialog.cpp'; then $(CYGPATH_W) 'FileDetailDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/FileDetailDialog.cpp'; fi` + +amule-KadDlg.o: KadDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-KadDlg.o -MD -MP -MF "$(DEPDIR)/amule-KadDlg.Tpo" -c -o amule-KadDlg.o `test -f 'KadDlg.cpp' || echo '$(srcdir)/'`KadDlg.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-KadDlg.Tpo" "$(DEPDIR)/amule-KadDlg.Po"; else rm -f "$(DEPDIR)/amule-KadDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='KadDlg.cpp' object='amule-KadDlg.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-KadDlg.o `test -f 'KadDlg.cpp' || echo '$(srcdir)/'`KadDlg.cpp + +amule-KadDlg.obj: KadDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-KadDlg.obj -MD -MP -MF "$(DEPDIR)/amule-KadDlg.Tpo" -c -o amule-KadDlg.obj `if test -f 'KadDlg.cpp'; then $(CYGPATH_W) 'KadDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/KadDlg.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-KadDlg.Tpo" "$(DEPDIR)/amule-KadDlg.Po"; else rm -f "$(DEPDIR)/amule-KadDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='KadDlg.cpp' object='amule-KadDlg.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-KadDlg.obj `if test -f 'KadDlg.cpp'; then $(CYGPATH_W) 'KadDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/KadDlg.cpp'; fi` + +amule-OScopeCtrl.o: OScopeCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-OScopeCtrl.o -MD -MP -MF "$(DEPDIR)/amule-OScopeCtrl.Tpo" -c -o amule-OScopeCtrl.o `test -f 'OScopeCtrl.cpp' || echo '$(srcdir)/'`OScopeCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-OScopeCtrl.Tpo" "$(DEPDIR)/amule-OScopeCtrl.Po"; else rm -f "$(DEPDIR)/amule-OScopeCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='OScopeCtrl.cpp' object='amule-OScopeCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-OScopeCtrl.o `test -f 'OScopeCtrl.cpp' || echo '$(srcdir)/'`OScopeCtrl.cpp + +amule-OScopeCtrl.obj: OScopeCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-OScopeCtrl.obj -MD -MP -MF "$(DEPDIR)/amule-OScopeCtrl.Tpo" -c -o amule-OScopeCtrl.obj `if test -f 'OScopeCtrl.cpp'; then $(CYGPATH_W) 'OScopeCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/OScopeCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-OScopeCtrl.Tpo" "$(DEPDIR)/amule-OScopeCtrl.Po"; else rm -f "$(DEPDIR)/amule-OScopeCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='OScopeCtrl.cpp' object='amule-OScopeCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-OScopeCtrl.obj `if test -f 'OScopeCtrl.cpp'; then $(CYGPATH_W) 'OScopeCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/OScopeCtrl.cpp'; fi` + +amule-PartFileConvert.o: PartFileConvert.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-PartFileConvert.o -MD -MP -MF "$(DEPDIR)/amule-PartFileConvert.Tpo" -c -o amule-PartFileConvert.o `test -f 'PartFileConvert.cpp' || echo '$(srcdir)/'`PartFileConvert.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-PartFileConvert.Tpo" "$(DEPDIR)/amule-PartFileConvert.Po"; else rm -f "$(DEPDIR)/amule-PartFileConvert.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PartFileConvert.cpp' object='amule-PartFileConvert.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-PartFileConvert.o `test -f 'PartFileConvert.cpp' || echo '$(srcdir)/'`PartFileConvert.cpp + +amule-PartFileConvert.obj: PartFileConvert.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-PartFileConvert.obj -MD -MP -MF "$(DEPDIR)/amule-PartFileConvert.Tpo" -c -o amule-PartFileConvert.obj `if test -f 'PartFileConvert.cpp'; then $(CYGPATH_W) 'PartFileConvert.cpp'; else $(CYGPATH_W) '$(srcdir)/PartFileConvert.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-PartFileConvert.Tpo" "$(DEPDIR)/amule-PartFileConvert.Po"; else rm -f "$(DEPDIR)/amule-PartFileConvert.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PartFileConvert.cpp' object='amule-PartFileConvert.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-PartFileConvert.obj `if test -f 'PartFileConvert.cpp'; then $(CYGPATH_W) 'PartFileConvert.cpp'; else $(CYGPATH_W) '$(srcdir)/PartFileConvert.cpp'; fi` + +amule-PrefsUnifiedDlg.o: PrefsUnifiedDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-PrefsUnifiedDlg.o -MD -MP -MF "$(DEPDIR)/amule-PrefsUnifiedDlg.Tpo" -c -o amule-PrefsUnifiedDlg.o `test -f 'PrefsUnifiedDlg.cpp' || echo '$(srcdir)/'`PrefsUnifiedDlg.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-PrefsUnifiedDlg.Tpo" "$(DEPDIR)/amule-PrefsUnifiedDlg.Po"; else rm -f "$(DEPDIR)/amule-PrefsUnifiedDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PrefsUnifiedDlg.cpp' object='amule-PrefsUnifiedDlg.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-PrefsUnifiedDlg.o `test -f 'PrefsUnifiedDlg.cpp' || echo '$(srcdir)/'`PrefsUnifiedDlg.cpp + +amule-PrefsUnifiedDlg.obj: PrefsUnifiedDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-PrefsUnifiedDlg.obj -MD -MP -MF "$(DEPDIR)/amule-PrefsUnifiedDlg.Tpo" -c -o amule-PrefsUnifiedDlg.obj `if test -f 'PrefsUnifiedDlg.cpp'; then $(CYGPATH_W) 'PrefsUnifiedDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/PrefsUnifiedDlg.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-PrefsUnifiedDlg.Tpo" "$(DEPDIR)/amule-PrefsUnifiedDlg.Po"; else rm -f "$(DEPDIR)/amule-PrefsUnifiedDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PrefsUnifiedDlg.cpp' object='amule-PrefsUnifiedDlg.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-PrefsUnifiedDlg.obj `if test -f 'PrefsUnifiedDlg.cpp'; then $(CYGPATH_W) 'PrefsUnifiedDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/PrefsUnifiedDlg.cpp'; fi` + +amule-SearchDlg.o: SearchDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-SearchDlg.o -MD -MP -MF "$(DEPDIR)/amule-SearchDlg.Tpo" -c -o amule-SearchDlg.o `test -f 'SearchDlg.cpp' || echo '$(srcdir)/'`SearchDlg.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-SearchDlg.Tpo" "$(DEPDIR)/amule-SearchDlg.Po"; else rm -f "$(DEPDIR)/amule-SearchDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SearchDlg.cpp' object='amule-SearchDlg.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-SearchDlg.o `test -f 'SearchDlg.cpp' || echo '$(srcdir)/'`SearchDlg.cpp + +amule-SearchDlg.obj: SearchDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-SearchDlg.obj -MD -MP -MF "$(DEPDIR)/amule-SearchDlg.Tpo" -c -o amule-SearchDlg.obj `if test -f 'SearchDlg.cpp'; then $(CYGPATH_W) 'SearchDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchDlg.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-SearchDlg.Tpo" "$(DEPDIR)/amule-SearchDlg.Po"; else rm -f "$(DEPDIR)/amule-SearchDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SearchDlg.cpp' object='amule-SearchDlg.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-SearchDlg.obj `if test -f 'SearchDlg.cpp'; then $(CYGPATH_W) 'SearchDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchDlg.cpp'; fi` + +amule-ServerWnd.o: ServerWnd.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ServerWnd.o -MD -MP -MF "$(DEPDIR)/amule-ServerWnd.Tpo" -c -o amule-ServerWnd.o `test -f 'ServerWnd.cpp' || echo '$(srcdir)/'`ServerWnd.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ServerWnd.Tpo" "$(DEPDIR)/amule-ServerWnd.Po"; else rm -f "$(DEPDIR)/amule-ServerWnd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerWnd.cpp' object='amule-ServerWnd.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ServerWnd.o `test -f 'ServerWnd.cpp' || echo '$(srcdir)/'`ServerWnd.cpp + +amule-ServerWnd.obj: ServerWnd.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ServerWnd.obj -MD -MP -MF "$(DEPDIR)/amule-ServerWnd.Tpo" -c -o amule-ServerWnd.obj `if test -f 'ServerWnd.cpp'; then $(CYGPATH_W) 'ServerWnd.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerWnd.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ServerWnd.Tpo" "$(DEPDIR)/amule-ServerWnd.Po"; else rm -f "$(DEPDIR)/amule-ServerWnd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerWnd.cpp' object='amule-ServerWnd.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ServerWnd.obj `if test -f 'ServerWnd.cpp'; then $(CYGPATH_W) 'ServerWnd.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerWnd.cpp'; fi` + +amule-SharedFilesWnd.o: SharedFilesWnd.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-SharedFilesWnd.o -MD -MP -MF "$(DEPDIR)/amule-SharedFilesWnd.Tpo" -c -o amule-SharedFilesWnd.o `test -f 'SharedFilesWnd.cpp' || echo '$(srcdir)/'`SharedFilesWnd.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-SharedFilesWnd.Tpo" "$(DEPDIR)/amule-SharedFilesWnd.Po"; else rm -f "$(DEPDIR)/amule-SharedFilesWnd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SharedFilesWnd.cpp' object='amule-SharedFilesWnd.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-SharedFilesWnd.o `test -f 'SharedFilesWnd.cpp' || echo '$(srcdir)/'`SharedFilesWnd.cpp + +amule-SharedFilesWnd.obj: SharedFilesWnd.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-SharedFilesWnd.obj -MD -MP -MF "$(DEPDIR)/amule-SharedFilesWnd.Tpo" -c -o amule-SharedFilesWnd.obj `if test -f 'SharedFilesWnd.cpp'; then $(CYGPATH_W) 'SharedFilesWnd.cpp'; else $(CYGPATH_W) '$(srcdir)/SharedFilesWnd.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-SharedFilesWnd.Tpo" "$(DEPDIR)/amule-SharedFilesWnd.Po"; else rm -f "$(DEPDIR)/amule-SharedFilesWnd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SharedFilesWnd.cpp' object='amule-SharedFilesWnd.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-SharedFilesWnd.obj `if test -f 'SharedFilesWnd.cpp'; then $(CYGPATH_W) 'SharedFilesWnd.cpp'; else $(CYGPATH_W) '$(srcdir)/SharedFilesWnd.cpp'; fi` + +amule-StatisticsDlg.o: StatisticsDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-StatisticsDlg.o -MD -MP -MF "$(DEPDIR)/amule-StatisticsDlg.Tpo" -c -o amule-StatisticsDlg.o `test -f 'StatisticsDlg.cpp' || echo '$(srcdir)/'`StatisticsDlg.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-StatisticsDlg.Tpo" "$(DEPDIR)/amule-StatisticsDlg.Po"; else rm -f "$(DEPDIR)/amule-StatisticsDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='StatisticsDlg.cpp' object='amule-StatisticsDlg.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-StatisticsDlg.o `test -f 'StatisticsDlg.cpp' || echo '$(srcdir)/'`StatisticsDlg.cpp + +amule-StatisticsDlg.obj: StatisticsDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-StatisticsDlg.obj -MD -MP -MF "$(DEPDIR)/amule-StatisticsDlg.Tpo" -c -o amule-StatisticsDlg.obj `if test -f 'StatisticsDlg.cpp'; then $(CYGPATH_W) 'StatisticsDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/StatisticsDlg.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-StatisticsDlg.Tpo" "$(DEPDIR)/amule-StatisticsDlg.Po"; else rm -f "$(DEPDIR)/amule-StatisticsDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='StatisticsDlg.cpp' object='amule-StatisticsDlg.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-StatisticsDlg.obj `if test -f 'StatisticsDlg.cpp'; then $(CYGPATH_W) 'StatisticsDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/StatisticsDlg.cpp'; fi` + +amule-SearchListCtrl.o: SearchListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-SearchListCtrl.o -MD -MP -MF "$(DEPDIR)/amule-SearchListCtrl.Tpo" -c -o amule-SearchListCtrl.o `test -f 'SearchListCtrl.cpp' || echo '$(srcdir)/'`SearchListCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-SearchListCtrl.Tpo" "$(DEPDIR)/amule-SearchListCtrl.Po"; else rm -f "$(DEPDIR)/amule-SearchListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SearchListCtrl.cpp' object='amule-SearchListCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-SearchListCtrl.o `test -f 'SearchListCtrl.cpp' || echo '$(srcdir)/'`SearchListCtrl.cpp + +amule-SearchListCtrl.obj: SearchListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-SearchListCtrl.obj -MD -MP -MF "$(DEPDIR)/amule-SearchListCtrl.Tpo" -c -o amule-SearchListCtrl.obj `if test -f 'SearchListCtrl.cpp'; then $(CYGPATH_W) 'SearchListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchListCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-SearchListCtrl.Tpo" "$(DEPDIR)/amule-SearchListCtrl.Po"; else rm -f "$(DEPDIR)/amule-SearchListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SearchListCtrl.cpp' object='amule-SearchListCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-SearchListCtrl.obj `if test -f 'SearchListCtrl.cpp'; then $(CYGPATH_W) 'SearchListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchListCtrl.cpp'; fi` + +amule-DownloadListCtrl.o: DownloadListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-DownloadListCtrl.o -MD -MP -MF "$(DEPDIR)/amule-DownloadListCtrl.Tpo" -c -o amule-DownloadListCtrl.o `test -f 'DownloadListCtrl.cpp' || echo '$(srcdir)/'`DownloadListCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-DownloadListCtrl.Tpo" "$(DEPDIR)/amule-DownloadListCtrl.Po"; else rm -f "$(DEPDIR)/amule-DownloadListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DownloadListCtrl.cpp' object='amule-DownloadListCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-DownloadListCtrl.o `test -f 'DownloadListCtrl.cpp' || echo '$(srcdir)/'`DownloadListCtrl.cpp + +amule-DownloadListCtrl.obj: DownloadListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-DownloadListCtrl.obj -MD -MP -MF "$(DEPDIR)/amule-DownloadListCtrl.Tpo" -c -o amule-DownloadListCtrl.obj `if test -f 'DownloadListCtrl.cpp'; then $(CYGPATH_W) 'DownloadListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/DownloadListCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-DownloadListCtrl.Tpo" "$(DEPDIR)/amule-DownloadListCtrl.Po"; else rm -f "$(DEPDIR)/amule-DownloadListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DownloadListCtrl.cpp' object='amule-DownloadListCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-DownloadListCtrl.obj `if test -f 'DownloadListCtrl.cpp'; then $(CYGPATH_W) 'DownloadListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/DownloadListCtrl.cpp'; fi` + +amule-ClientListCtrl.o: ClientListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ClientListCtrl.o -MD -MP -MF "$(DEPDIR)/amule-ClientListCtrl.Tpo" -c -o amule-ClientListCtrl.o `test -f 'ClientListCtrl.cpp' || echo '$(srcdir)/'`ClientListCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ClientListCtrl.Tpo" "$(DEPDIR)/amule-ClientListCtrl.Po"; else rm -f "$(DEPDIR)/amule-ClientListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientListCtrl.cpp' object='amule-ClientListCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ClientListCtrl.o `test -f 'ClientListCtrl.cpp' || echo '$(srcdir)/'`ClientListCtrl.cpp + +amule-ClientListCtrl.obj: ClientListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ClientListCtrl.obj -MD -MP -MF "$(DEPDIR)/amule-ClientListCtrl.Tpo" -c -o amule-ClientListCtrl.obj `if test -f 'ClientListCtrl.cpp'; then $(CYGPATH_W) 'ClientListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientListCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ClientListCtrl.Tpo" "$(DEPDIR)/amule-ClientListCtrl.Po"; else rm -f "$(DEPDIR)/amule-ClientListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientListCtrl.cpp' object='amule-ClientListCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ClientListCtrl.obj `if test -f 'ClientListCtrl.cpp'; then $(CYGPATH_W) 'ClientListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientListCtrl.cpp'; fi` + +amule-FriendListCtrl.o: FriendListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-FriendListCtrl.o -MD -MP -MF "$(DEPDIR)/amule-FriendListCtrl.Tpo" -c -o amule-FriendListCtrl.o `test -f 'FriendListCtrl.cpp' || echo '$(srcdir)/'`FriendListCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-FriendListCtrl.Tpo" "$(DEPDIR)/amule-FriendListCtrl.Po"; else rm -f "$(DEPDIR)/amule-FriendListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FriendListCtrl.cpp' object='amule-FriendListCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-FriendListCtrl.o `test -f 'FriendListCtrl.cpp' || echo '$(srcdir)/'`FriendListCtrl.cpp + +amule-FriendListCtrl.obj: FriendListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-FriendListCtrl.obj -MD -MP -MF "$(DEPDIR)/amule-FriendListCtrl.Tpo" -c -o amule-FriendListCtrl.obj `if test -f 'FriendListCtrl.cpp'; then $(CYGPATH_W) 'FriendListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/FriendListCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-FriendListCtrl.Tpo" "$(DEPDIR)/amule-FriendListCtrl.Po"; else rm -f "$(DEPDIR)/amule-FriendListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FriendListCtrl.cpp' object='amule-FriendListCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-FriendListCtrl.obj `if test -f 'FriendListCtrl.cpp'; then $(CYGPATH_W) 'FriendListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/FriendListCtrl.cpp'; fi` + +amule-ServerListCtrl.o: ServerListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ServerListCtrl.o -MD -MP -MF "$(DEPDIR)/amule-ServerListCtrl.Tpo" -c -o amule-ServerListCtrl.o `test -f 'ServerListCtrl.cpp' || echo '$(srcdir)/'`ServerListCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ServerListCtrl.Tpo" "$(DEPDIR)/amule-ServerListCtrl.Po"; else rm -f "$(DEPDIR)/amule-ServerListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerListCtrl.cpp' object='amule-ServerListCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ServerListCtrl.o `test -f 'ServerListCtrl.cpp' || echo '$(srcdir)/'`ServerListCtrl.cpp + +amule-ServerListCtrl.obj: ServerListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ServerListCtrl.obj -MD -MP -MF "$(DEPDIR)/amule-ServerListCtrl.Tpo" -c -o amule-ServerListCtrl.obj `if test -f 'ServerListCtrl.cpp'; then $(CYGPATH_W) 'ServerListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerListCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ServerListCtrl.Tpo" "$(DEPDIR)/amule-ServerListCtrl.Po"; else rm -f "$(DEPDIR)/amule-ServerListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerListCtrl.cpp' object='amule-ServerListCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ServerListCtrl.obj `if test -f 'ServerListCtrl.cpp'; then $(CYGPATH_W) 'ServerListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerListCtrl.cpp'; fi` + +amule-SharedFilesCtrl.o: SharedFilesCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-SharedFilesCtrl.o -MD -MP -MF "$(DEPDIR)/amule-SharedFilesCtrl.Tpo" -c -o amule-SharedFilesCtrl.o `test -f 'SharedFilesCtrl.cpp' || echo '$(srcdir)/'`SharedFilesCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-SharedFilesCtrl.Tpo" "$(DEPDIR)/amule-SharedFilesCtrl.Po"; else rm -f "$(DEPDIR)/amule-SharedFilesCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SharedFilesCtrl.cpp' object='amule-SharedFilesCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-SharedFilesCtrl.o `test -f 'SharedFilesCtrl.cpp' || echo '$(srcdir)/'`SharedFilesCtrl.cpp + +amule-SharedFilesCtrl.obj: SharedFilesCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-SharedFilesCtrl.obj -MD -MP -MF "$(DEPDIR)/amule-SharedFilesCtrl.Tpo" -c -o amule-SharedFilesCtrl.obj `if test -f 'SharedFilesCtrl.cpp'; then $(CYGPATH_W) 'SharedFilesCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/SharedFilesCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-SharedFilesCtrl.Tpo" "$(DEPDIR)/amule-SharedFilesCtrl.Po"; else rm -f "$(DEPDIR)/amule-SharedFilesCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SharedFilesCtrl.cpp' object='amule-SharedFilesCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-SharedFilesCtrl.obj `if test -f 'SharedFilesCtrl.cpp'; then $(CYGPATH_W) 'SharedFilesCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/SharedFilesCtrl.cpp'; fi` + +amule-MuleTrayIcon.o: MuleTrayIcon.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-MuleTrayIcon.o -MD -MP -MF "$(DEPDIR)/amule-MuleTrayIcon.Tpo" -c -o amule-MuleTrayIcon.o `test -f 'MuleTrayIcon.cpp' || echo '$(srcdir)/'`MuleTrayIcon.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-MuleTrayIcon.Tpo" "$(DEPDIR)/amule-MuleTrayIcon.Po"; else rm -f "$(DEPDIR)/amule-MuleTrayIcon.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleTrayIcon.cpp' object='amule-MuleTrayIcon.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-MuleTrayIcon.o `test -f 'MuleTrayIcon.cpp' || echo '$(srcdir)/'`MuleTrayIcon.cpp + +amule-MuleTrayIcon.obj: MuleTrayIcon.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-MuleTrayIcon.obj -MD -MP -MF "$(DEPDIR)/amule-MuleTrayIcon.Tpo" -c -o amule-MuleTrayIcon.obj `if test -f 'MuleTrayIcon.cpp'; then $(CYGPATH_W) 'MuleTrayIcon.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleTrayIcon.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-MuleTrayIcon.Tpo" "$(DEPDIR)/amule-MuleTrayIcon.Po"; else rm -f "$(DEPDIR)/amule-MuleTrayIcon.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleTrayIcon.cpp' object='amule-MuleTrayIcon.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-MuleTrayIcon.obj `if test -f 'MuleTrayIcon.cpp'; then $(CYGPATH_W) 'MuleTrayIcon.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleTrayIcon.cpp'; fi` + +amule-TransferWnd.o: TransferWnd.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-TransferWnd.o -MD -MP -MF "$(DEPDIR)/amule-TransferWnd.Tpo" -c -o amule-TransferWnd.o `test -f 'TransferWnd.cpp' || echo '$(srcdir)/'`TransferWnd.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-TransferWnd.Tpo" "$(DEPDIR)/amule-TransferWnd.Po"; else rm -f "$(DEPDIR)/amule-TransferWnd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TransferWnd.cpp' object='amule-TransferWnd.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-TransferWnd.o `test -f 'TransferWnd.cpp' || echo '$(srcdir)/'`TransferWnd.cpp + +amule-TransferWnd.obj: TransferWnd.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-TransferWnd.obj -MD -MP -MF "$(DEPDIR)/amule-TransferWnd.Tpo" -c -o amule-TransferWnd.obj `if test -f 'TransferWnd.cpp'; then $(CYGPATH_W) 'TransferWnd.cpp'; else $(CYGPATH_W) '$(srcdir)/TransferWnd.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-TransferWnd.Tpo" "$(DEPDIR)/amule-TransferWnd.Po"; else rm -f "$(DEPDIR)/amule-TransferWnd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TransferWnd.cpp' object='amule-TransferWnd.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-TransferWnd.obj `if test -f 'TransferWnd.cpp'; then $(CYGPATH_W) 'TransferWnd.cpp'; else $(CYGPATH_W) '$(srcdir)/TransferWnd.cpp'; fi` + +amule-IP2Country.o: IP2Country.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-IP2Country.o -MD -MP -MF "$(DEPDIR)/amule-IP2Country.Tpo" -c -o amule-IP2Country.o `test -f 'IP2Country.cpp' || echo '$(srcdir)/'`IP2Country.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-IP2Country.Tpo" "$(DEPDIR)/amule-IP2Country.Po"; else rm -f "$(DEPDIR)/amule-IP2Country.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='IP2Country.cpp' object='amule-IP2Country.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-IP2Country.o `test -f 'IP2Country.cpp' || echo '$(srcdir)/'`IP2Country.cpp + +amule-IP2Country.obj: IP2Country.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-IP2Country.obj -MD -MP -MF "$(DEPDIR)/amule-IP2Country.Tpo" -c -o amule-IP2Country.obj `if test -f 'IP2Country.cpp'; then $(CYGPATH_W) 'IP2Country.cpp'; else $(CYGPATH_W) '$(srcdir)/IP2Country.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-IP2Country.Tpo" "$(DEPDIR)/amule-IP2Country.Po"; else rm -f "$(DEPDIR)/amule-IP2Country.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='IP2Country.cpp' object='amule-IP2Country.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-IP2Country.obj `if test -f 'IP2Country.cpp'; then $(CYGPATH_W) 'IP2Country.cpp'; else $(CYGPATH_W) '$(srcdir)/IP2Country.cpp'; fi` + +amule-ClientCredits.o: ClientCredits.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ClientCredits.o -MD -MP -MF "$(DEPDIR)/amule-ClientCredits.Tpo" -c -o amule-ClientCredits.o `test -f 'ClientCredits.cpp' || echo '$(srcdir)/'`ClientCredits.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ClientCredits.Tpo" "$(DEPDIR)/amule-ClientCredits.Po"; else rm -f "$(DEPDIR)/amule-ClientCredits.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientCredits.cpp' object='amule-ClientCredits.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ClientCredits.o `test -f 'ClientCredits.cpp' || echo '$(srcdir)/'`ClientCredits.cpp + +amule-ClientCredits.obj: ClientCredits.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ClientCredits.obj -MD -MP -MF "$(DEPDIR)/amule-ClientCredits.Tpo" -c -o amule-ClientCredits.obj `if test -f 'ClientCredits.cpp'; then $(CYGPATH_W) 'ClientCredits.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientCredits.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ClientCredits.Tpo" "$(DEPDIR)/amule-ClientCredits.Po"; else rm -f "$(DEPDIR)/amule-ClientCredits.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientCredits.cpp' object='amule-ClientCredits.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ClientCredits.obj `if test -f 'ClientCredits.cpp'; then $(CYGPATH_W) 'ClientCredits.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientCredits.cpp'; fi` + +amule-ECSpecialMuleTags.o: ECSpecialMuleTags.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ECSpecialMuleTags.o -MD -MP -MF "$(DEPDIR)/amule-ECSpecialMuleTags.Tpo" -c -o amule-ECSpecialMuleTags.o `test -f 'ECSpecialMuleTags.cpp' || echo '$(srcdir)/'`ECSpecialMuleTags.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ECSpecialMuleTags.Tpo" "$(DEPDIR)/amule-ECSpecialMuleTags.Po"; else rm -f "$(DEPDIR)/amule-ECSpecialMuleTags.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECSpecialMuleTags.cpp' object='amule-ECSpecialMuleTags.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ECSpecialMuleTags.o `test -f 'ECSpecialMuleTags.cpp' || echo '$(srcdir)/'`ECSpecialMuleTags.cpp + +amule-ECSpecialMuleTags.obj: ECSpecialMuleTags.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-ECSpecialMuleTags.obj -MD -MP -MF "$(DEPDIR)/amule-ECSpecialMuleTags.Tpo" -c -o amule-ECSpecialMuleTags.obj `if test -f 'ECSpecialMuleTags.cpp'; then $(CYGPATH_W) 'ECSpecialMuleTags.cpp'; else $(CYGPATH_W) '$(srcdir)/ECSpecialMuleTags.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-ECSpecialMuleTags.Tpo" "$(DEPDIR)/amule-ECSpecialMuleTags.Po"; else rm -f "$(DEPDIR)/amule-ECSpecialMuleTags.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECSpecialMuleTags.cpp' object='amule-ECSpecialMuleTags.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-ECSpecialMuleTags.obj `if test -f 'ECSpecialMuleTags.cpp'; then $(CYGPATH_W) 'ECSpecialMuleTags.cpp'; else $(CYGPATH_W) '$(srcdir)/ECSpecialMuleTags.cpp'; fi` + +amule-KnownFile.o: KnownFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-KnownFile.o -MD -MP -MF "$(DEPDIR)/amule-KnownFile.Tpo" -c -o amule-KnownFile.o `test -f 'KnownFile.cpp' || echo '$(srcdir)/'`KnownFile.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-KnownFile.Tpo" "$(DEPDIR)/amule-KnownFile.Po"; else rm -f "$(DEPDIR)/amule-KnownFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='KnownFile.cpp' object='amule-KnownFile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-KnownFile.o `test -f 'KnownFile.cpp' || echo '$(srcdir)/'`KnownFile.cpp + +amule-KnownFile.obj: KnownFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-KnownFile.obj -MD -MP -MF "$(DEPDIR)/amule-KnownFile.Tpo" -c -o amule-KnownFile.obj `if test -f 'KnownFile.cpp'; then $(CYGPATH_W) 'KnownFile.cpp'; else $(CYGPATH_W) '$(srcdir)/KnownFile.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-KnownFile.Tpo" "$(DEPDIR)/amule-KnownFile.Po"; else rm -f "$(DEPDIR)/amule-KnownFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='KnownFile.cpp' object='amule-KnownFile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-KnownFile.obj `if test -f 'KnownFile.cpp'; then $(CYGPATH_W) 'KnownFile.cpp'; else $(CYGPATH_W) '$(srcdir)/KnownFile.cpp'; fi` + +amule-GetTickCount.o: GetTickCount.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-GetTickCount.o -MD -MP -MF "$(DEPDIR)/amule-GetTickCount.Tpo" -c -o amule-GetTickCount.o `test -f 'GetTickCount.cpp' || echo '$(srcdir)/'`GetTickCount.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-GetTickCount.Tpo" "$(DEPDIR)/amule-GetTickCount.Po"; else rm -f "$(DEPDIR)/amule-GetTickCount.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='GetTickCount.cpp' object='amule-GetTickCount.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-GetTickCount.o `test -f 'GetTickCount.cpp' || echo '$(srcdir)/'`GetTickCount.cpp + +amule-GetTickCount.obj: GetTickCount.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-GetTickCount.obj -MD -MP -MF "$(DEPDIR)/amule-GetTickCount.Tpo" -c -o amule-GetTickCount.obj `if test -f 'GetTickCount.cpp'; then $(CYGPATH_W) 'GetTickCount.cpp'; else $(CYGPATH_W) '$(srcdir)/GetTickCount.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-GetTickCount.Tpo" "$(DEPDIR)/amule-GetTickCount.Po"; else rm -f "$(DEPDIR)/amule-GetTickCount.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='GetTickCount.cpp' object='amule-GetTickCount.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-GetTickCount.obj `if test -f 'GetTickCount.cpp'; then $(CYGPATH_W) 'GetTickCount.cpp'; else $(CYGPATH_W) '$(srcdir)/GetTickCount.cpp'; fi` + +amule-GuiEvents.o: GuiEvents.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-GuiEvents.o -MD -MP -MF "$(DEPDIR)/amule-GuiEvents.Tpo" -c -o amule-GuiEvents.o `test -f 'GuiEvents.cpp' || echo '$(srcdir)/'`GuiEvents.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-GuiEvents.Tpo" "$(DEPDIR)/amule-GuiEvents.Po"; else rm -f "$(DEPDIR)/amule-GuiEvents.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='GuiEvents.cpp' object='amule-GuiEvents.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-GuiEvents.o `test -f 'GuiEvents.cpp' || echo '$(srcdir)/'`GuiEvents.cpp + +amule-GuiEvents.obj: GuiEvents.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-GuiEvents.obj -MD -MP -MF "$(DEPDIR)/amule-GuiEvents.Tpo" -c -o amule-GuiEvents.obj `if test -f 'GuiEvents.cpp'; then $(CYGPATH_W) 'GuiEvents.cpp'; else $(CYGPATH_W) '$(srcdir)/GuiEvents.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-GuiEvents.Tpo" "$(DEPDIR)/amule-GuiEvents.Po"; else rm -f "$(DEPDIR)/amule-GuiEvents.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='GuiEvents.cpp' object='amule-GuiEvents.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-GuiEvents.obj `if test -f 'GuiEvents.cpp'; then $(CYGPATH_W) 'GuiEvents.cpp'; else $(CYGPATH_W) '$(srcdir)/GuiEvents.cpp'; fi` + +amule-Logger.o: Logger.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Logger.o -MD -MP -MF "$(DEPDIR)/amule-Logger.Tpo" -c -o amule-Logger.o `test -f 'Logger.cpp' || echo '$(srcdir)/'`Logger.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Logger.Tpo" "$(DEPDIR)/amule-Logger.Po"; else rm -f "$(DEPDIR)/amule-Logger.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Logger.cpp' object='amule-Logger.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Logger.o `test -f 'Logger.cpp' || echo '$(srcdir)/'`Logger.cpp + +amule-Logger.obj: Logger.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Logger.obj -MD -MP -MF "$(DEPDIR)/amule-Logger.Tpo" -c -o amule-Logger.obj `if test -f 'Logger.cpp'; then $(CYGPATH_W) 'Logger.cpp'; else $(CYGPATH_W) '$(srcdir)/Logger.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Logger.Tpo" "$(DEPDIR)/amule-Logger.Po"; else rm -f "$(DEPDIR)/amule-Logger.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Logger.cpp' object='amule-Logger.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Logger.obj `if test -f 'Logger.cpp'; then $(CYGPATH_W) 'Logger.cpp'; else $(CYGPATH_W) '$(srcdir)/Logger.cpp'; fi` + +amule-PartFile.o: PartFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-PartFile.o -MD -MP -MF "$(DEPDIR)/amule-PartFile.Tpo" -c -o amule-PartFile.o `test -f 'PartFile.cpp' || echo '$(srcdir)/'`PartFile.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-PartFile.Tpo" "$(DEPDIR)/amule-PartFile.Po"; else rm -f "$(DEPDIR)/amule-PartFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PartFile.cpp' object='amule-PartFile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-PartFile.o `test -f 'PartFile.cpp' || echo '$(srcdir)/'`PartFile.cpp + +amule-PartFile.obj: PartFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-PartFile.obj -MD -MP -MF "$(DEPDIR)/amule-PartFile.Tpo" -c -o amule-PartFile.obj `if test -f 'PartFile.cpp'; then $(CYGPATH_W) 'PartFile.cpp'; else $(CYGPATH_W) '$(srcdir)/PartFile.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-PartFile.Tpo" "$(DEPDIR)/amule-PartFile.Po"; else rm -f "$(DEPDIR)/amule-PartFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PartFile.cpp' object='amule-PartFile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-PartFile.obj `if test -f 'PartFile.cpp'; then $(CYGPATH_W) 'PartFile.cpp'; else $(CYGPATH_W) '$(srcdir)/PartFile.cpp'; fi` + +amule-Preferences.o: Preferences.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Preferences.o -MD -MP -MF "$(DEPDIR)/amule-Preferences.Tpo" -c -o amule-Preferences.o `test -f 'Preferences.cpp' || echo '$(srcdir)/'`Preferences.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Preferences.Tpo" "$(DEPDIR)/amule-Preferences.Po"; else rm -f "$(DEPDIR)/amule-Preferences.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Preferences.cpp' object='amule-Preferences.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Preferences.o `test -f 'Preferences.cpp' || echo '$(srcdir)/'`Preferences.cpp + +amule-Preferences.obj: Preferences.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Preferences.obj -MD -MP -MF "$(DEPDIR)/amule-Preferences.Tpo" -c -o amule-Preferences.obj `if test -f 'Preferences.cpp'; then $(CYGPATH_W) 'Preferences.cpp'; else $(CYGPATH_W) '$(srcdir)/Preferences.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Preferences.Tpo" "$(DEPDIR)/amule-Preferences.Po"; else rm -f "$(DEPDIR)/amule-Preferences.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Preferences.cpp' object='amule-Preferences.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Preferences.obj `if test -f 'Preferences.cpp'; then $(CYGPATH_W) 'Preferences.cpp'; else $(CYGPATH_W) '$(srcdir)/Preferences.cpp'; fi` + +amule-Proxy.o: Proxy.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Proxy.o -MD -MP -MF "$(DEPDIR)/amule-Proxy.Tpo" -c -o amule-Proxy.o `test -f 'Proxy.cpp' || echo '$(srcdir)/'`Proxy.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Proxy.Tpo" "$(DEPDIR)/amule-Proxy.Po"; else rm -f "$(DEPDIR)/amule-Proxy.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Proxy.cpp' object='amule-Proxy.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Proxy.o `test -f 'Proxy.cpp' || echo '$(srcdir)/'`Proxy.cpp + +amule-Proxy.obj: Proxy.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Proxy.obj -MD -MP -MF "$(DEPDIR)/amule-Proxy.Tpo" -c -o amule-Proxy.obj `if test -f 'Proxy.cpp'; then $(CYGPATH_W) 'Proxy.cpp'; else $(CYGPATH_W) '$(srcdir)/Proxy.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Proxy.Tpo" "$(DEPDIR)/amule-Proxy.Po"; else rm -f "$(DEPDIR)/amule-Proxy.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Proxy.cpp' object='amule-Proxy.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Proxy.obj `if test -f 'Proxy.cpp'; then $(CYGPATH_W) 'Proxy.cpp'; else $(CYGPATH_W) '$(srcdir)/Proxy.cpp'; fi` + +amule-Server.o: Server.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Server.o -MD -MP -MF "$(DEPDIR)/amule-Server.Tpo" -c -o amule-Server.o `test -f 'Server.cpp' || echo '$(srcdir)/'`Server.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Server.Tpo" "$(DEPDIR)/amule-Server.Po"; else rm -f "$(DEPDIR)/amule-Server.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Server.cpp' object='amule-Server.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Server.o `test -f 'Server.cpp' || echo '$(srcdir)/'`Server.cpp + +amule-Server.obj: Server.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Server.obj -MD -MP -MF "$(DEPDIR)/amule-Server.Tpo" -c -o amule-Server.obj `if test -f 'Server.cpp'; then $(CYGPATH_W) 'Server.cpp'; else $(CYGPATH_W) '$(srcdir)/Server.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Server.Tpo" "$(DEPDIR)/amule-Server.Po"; else rm -f "$(DEPDIR)/amule-Server.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Server.cpp' object='amule-Server.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Server.obj `if test -f 'Server.cpp'; then $(CYGPATH_W) 'Server.cpp'; else $(CYGPATH_W) '$(srcdir)/Server.cpp'; fi` + +amule-Statistics.o: Statistics.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Statistics.o -MD -MP -MF "$(DEPDIR)/amule-Statistics.Tpo" -c -o amule-Statistics.o `test -f 'Statistics.cpp' || echo '$(srcdir)/'`Statistics.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Statistics.Tpo" "$(DEPDIR)/amule-Statistics.Po"; else rm -f "$(DEPDIR)/amule-Statistics.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Statistics.cpp' object='amule-Statistics.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Statistics.o `test -f 'Statistics.cpp' || echo '$(srcdir)/'`Statistics.cpp + +amule-Statistics.obj: Statistics.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-Statistics.obj -MD -MP -MF "$(DEPDIR)/amule-Statistics.Tpo" -c -o amule-Statistics.obj `if test -f 'Statistics.cpp'; then $(CYGPATH_W) 'Statistics.cpp'; else $(CYGPATH_W) '$(srcdir)/Statistics.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-Statistics.Tpo" "$(DEPDIR)/amule-Statistics.Po"; else rm -f "$(DEPDIR)/amule-Statistics.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Statistics.cpp' object='amule-Statistics.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-Statistics.obj `if test -f 'Statistics.cpp'; then $(CYGPATH_W) 'Statistics.cpp'; else $(CYGPATH_W) '$(srcdir)/Statistics.cpp'; fi` + +amule-StatTree.o: StatTree.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-StatTree.o -MD -MP -MF "$(DEPDIR)/amule-StatTree.Tpo" -c -o amule-StatTree.o `test -f 'StatTree.cpp' || echo '$(srcdir)/'`StatTree.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-StatTree.Tpo" "$(DEPDIR)/amule-StatTree.Po"; else rm -f "$(DEPDIR)/amule-StatTree.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='StatTree.cpp' object='amule-StatTree.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-StatTree.o `test -f 'StatTree.cpp' || echo '$(srcdir)/'`StatTree.cpp + +amule-StatTree.obj: StatTree.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-StatTree.obj -MD -MP -MF "$(DEPDIR)/amule-StatTree.Tpo" -c -o amule-StatTree.obj `if test -f 'StatTree.cpp'; then $(CYGPATH_W) 'StatTree.cpp'; else $(CYGPATH_W) '$(srcdir)/StatTree.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-StatTree.Tpo" "$(DEPDIR)/amule-StatTree.Po"; else rm -f "$(DEPDIR)/amule-StatTree.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='StatTree.cpp' object='amule-StatTree.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-StatTree.obj `if test -f 'StatTree.cpp'; then $(CYGPATH_W) 'StatTree.cpp'; else $(CYGPATH_W) '$(srcdir)/StatTree.cpp'; fi` + +amule-SHAHashSet.o: SHAHashSet.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-SHAHashSet.o -MD -MP -MF "$(DEPDIR)/amule-SHAHashSet.Tpo" -c -o amule-SHAHashSet.o `test -f 'SHAHashSet.cpp' || echo '$(srcdir)/'`SHAHashSet.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-SHAHashSet.Tpo" "$(DEPDIR)/amule-SHAHashSet.Po"; else rm -f "$(DEPDIR)/amule-SHAHashSet.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SHAHashSet.cpp' object='amule-SHAHashSet.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-SHAHashSet.o `test -f 'SHAHashSet.cpp' || echo '$(srcdir)/'`SHAHashSet.cpp + +amule-SHAHashSet.obj: SHAHashSet.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-SHAHashSet.obj -MD -MP -MF "$(DEPDIR)/amule-SHAHashSet.Tpo" -c -o amule-SHAHashSet.obj `if test -f 'SHAHashSet.cpp'; then $(CYGPATH_W) 'SHAHashSet.cpp'; else $(CYGPATH_W) '$(srcdir)/SHAHashSet.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-SHAHashSet.Tpo" "$(DEPDIR)/amule-SHAHashSet.Po"; else rm -f "$(DEPDIR)/amule-SHAHashSet.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SHAHashSet.cpp' object='amule-SHAHashSet.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-SHAHashSet.obj `if test -f 'SHAHashSet.cpp'; then $(CYGPATH_W) 'SHAHashSet.cpp'; else $(CYGPATH_W) '$(srcdir)/SHAHashSet.cpp'; fi` + +amule-TerminationProcess.o: TerminationProcess.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-TerminationProcess.o -MD -MP -MF "$(DEPDIR)/amule-TerminationProcess.Tpo" -c -o amule-TerminationProcess.o `test -f 'TerminationProcess.cpp' || echo '$(srcdir)/'`TerminationProcess.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-TerminationProcess.Tpo" "$(DEPDIR)/amule-TerminationProcess.Po"; else rm -f "$(DEPDIR)/amule-TerminationProcess.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TerminationProcess.cpp' object='amule-TerminationProcess.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-TerminationProcess.o `test -f 'TerminationProcess.cpp' || echo '$(srcdir)/'`TerminationProcess.cpp + +amule-TerminationProcess.obj: TerminationProcess.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-TerminationProcess.obj -MD -MP -MF "$(DEPDIR)/amule-TerminationProcess.Tpo" -c -o amule-TerminationProcess.obj `if test -f 'TerminationProcess.cpp'; then $(CYGPATH_W) 'TerminationProcess.cpp'; else $(CYGPATH_W) '$(srcdir)/TerminationProcess.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-TerminationProcess.Tpo" "$(DEPDIR)/amule-TerminationProcess.Po"; else rm -f "$(DEPDIR)/amule-TerminationProcess.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TerminationProcess.cpp' object='amule-TerminationProcess.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-TerminationProcess.obj `if test -f 'TerminationProcess.cpp'; then $(CYGPATH_W) 'TerminationProcess.cpp'; else $(CYGPATH_W) '$(srcdir)/TerminationProcess.cpp'; fi` + +amule-TerminationProcessAmuleweb.o: TerminationProcessAmuleweb.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-TerminationProcessAmuleweb.o -MD -MP -MF "$(DEPDIR)/amule-TerminationProcessAmuleweb.Tpo" -c -o amule-TerminationProcessAmuleweb.o `test -f 'TerminationProcessAmuleweb.cpp' || echo '$(srcdir)/'`TerminationProcessAmuleweb.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-TerminationProcessAmuleweb.Tpo" "$(DEPDIR)/amule-TerminationProcessAmuleweb.Po"; else rm -f "$(DEPDIR)/amule-TerminationProcessAmuleweb.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TerminationProcessAmuleweb.cpp' object='amule-TerminationProcessAmuleweb.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-TerminationProcessAmuleweb.o `test -f 'TerminationProcessAmuleweb.cpp' || echo '$(srcdir)/'`TerminationProcessAmuleweb.cpp + +amule-TerminationProcessAmuleweb.obj: TerminationProcessAmuleweb.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-TerminationProcessAmuleweb.obj -MD -MP -MF "$(DEPDIR)/amule-TerminationProcessAmuleweb.Tpo" -c -o amule-TerminationProcessAmuleweb.obj `if test -f 'TerminationProcessAmuleweb.cpp'; then $(CYGPATH_W) 'TerminationProcessAmuleweb.cpp'; else $(CYGPATH_W) '$(srcdir)/TerminationProcessAmuleweb.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-TerminationProcessAmuleweb.Tpo" "$(DEPDIR)/amule-TerminationProcessAmuleweb.Po"; else rm -f "$(DEPDIR)/amule-TerminationProcessAmuleweb.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TerminationProcessAmuleweb.cpp' object='amule-TerminationProcessAmuleweb.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-TerminationProcessAmuleweb.obj `if test -f 'TerminationProcessAmuleweb.cpp'; then $(CYGPATH_W) 'TerminationProcessAmuleweb.cpp'; else $(CYGPATH_W) '$(srcdir)/TerminationProcessAmuleweb.cpp'; fi` + +amule-UserEvents.o: UserEvents.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-UserEvents.o -MD -MP -MF "$(DEPDIR)/amule-UserEvents.Tpo" -c -o amule-UserEvents.o `test -f 'UserEvents.cpp' || echo '$(srcdir)/'`UserEvents.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-UserEvents.Tpo" "$(DEPDIR)/amule-UserEvents.Po"; else rm -f "$(DEPDIR)/amule-UserEvents.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UserEvents.cpp' object='amule-UserEvents.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-UserEvents.o `test -f 'UserEvents.cpp' || echo '$(srcdir)/'`UserEvents.cpp + +amule-UserEvents.obj: UserEvents.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-UserEvents.obj -MD -MP -MF "$(DEPDIR)/amule-UserEvents.Tpo" -c -o amule-UserEvents.obj `if test -f 'UserEvents.cpp'; then $(CYGPATH_W) 'UserEvents.cpp'; else $(CYGPATH_W) '$(srcdir)/UserEvents.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-UserEvents.Tpo" "$(DEPDIR)/amule-UserEvents.Po"; else rm -f "$(DEPDIR)/amule-UserEvents.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UserEvents.cpp' object='amule-UserEvents.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-UserEvents.obj `if test -f 'UserEvents.cpp'; then $(CYGPATH_W) 'UserEvents.cpp'; else $(CYGPATH_W) '$(srcdir)/UserEvents.cpp'; fi` + +amule-OtherFunctions.o: OtherFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-OtherFunctions.o -MD -MP -MF "$(DEPDIR)/amule-OtherFunctions.Tpo" -c -o amule-OtherFunctions.o `test -f 'OtherFunctions.cpp' || echo '$(srcdir)/'`OtherFunctions.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-OtherFunctions.Tpo" "$(DEPDIR)/amule-OtherFunctions.Po"; else rm -f "$(DEPDIR)/amule-OtherFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='OtherFunctions.cpp' object='amule-OtherFunctions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-OtherFunctions.o `test -f 'OtherFunctions.cpp' || echo '$(srcdir)/'`OtherFunctions.cpp + +amule-OtherFunctions.obj: OtherFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-OtherFunctions.obj -MD -MP -MF "$(DEPDIR)/amule-OtherFunctions.Tpo" -c -o amule-OtherFunctions.obj `if test -f 'OtherFunctions.cpp'; then $(CYGPATH_W) 'OtherFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/OtherFunctions.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-OtherFunctions.Tpo" "$(DEPDIR)/amule-OtherFunctions.Po"; else rm -f "$(DEPDIR)/amule-OtherFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='OtherFunctions.cpp' object='amule-OtherFunctions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-OtherFunctions.obj `if test -f 'OtherFunctions.cpp'; then $(CYGPATH_W) 'OtherFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/OtherFunctions.cpp'; fi` + +amule-NetworkFunctions.o: NetworkFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-NetworkFunctions.o -MD -MP -MF "$(DEPDIR)/amule-NetworkFunctions.Tpo" -c -o amule-NetworkFunctions.o `test -f 'NetworkFunctions.cpp' || echo '$(srcdir)/'`NetworkFunctions.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-NetworkFunctions.Tpo" "$(DEPDIR)/amule-NetworkFunctions.Po"; else rm -f "$(DEPDIR)/amule-NetworkFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='NetworkFunctions.cpp' object='amule-NetworkFunctions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-NetworkFunctions.o `test -f 'NetworkFunctions.cpp' || echo '$(srcdir)/'`NetworkFunctions.cpp + +amule-NetworkFunctions.obj: NetworkFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -MT amule-NetworkFunctions.obj -MD -MP -MF "$(DEPDIR)/amule-NetworkFunctions.Tpo" -c -o amule-NetworkFunctions.obj `if test -f 'NetworkFunctions.cpp'; then $(CYGPATH_W) 'NetworkFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/NetworkFunctions.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amule-NetworkFunctions.Tpo" "$(DEPDIR)/amule-NetworkFunctions.Po"; else rm -f "$(DEPDIR)/amule-NetworkFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='NetworkFunctions.cpp' object='amule-NetworkFunctions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amule_CXXFLAGS) $(CXXFLAGS) -c -o amule-NetworkFunctions.obj `if test -f 'NetworkFunctions.cpp'; then $(CYGPATH_W) 'NetworkFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/NetworkFunctions.cpp'; fi` + +amulecmd-TextClient.o: TextClient.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulecmd_CXXFLAGS) $(CXXFLAGS) -MT amulecmd-TextClient.o -MD -MP -MF "$(DEPDIR)/amulecmd-TextClient.Tpo" -c -o amulecmd-TextClient.o `test -f 'TextClient.cpp' || echo '$(srcdir)/'`TextClient.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulecmd-TextClient.Tpo" "$(DEPDIR)/amulecmd-TextClient.Po"; else rm -f "$(DEPDIR)/amulecmd-TextClient.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TextClient.cpp' object='amulecmd-TextClient.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulecmd_CXXFLAGS) $(CXXFLAGS) -c -o amulecmd-TextClient.o `test -f 'TextClient.cpp' || echo '$(srcdir)/'`TextClient.cpp + +amulecmd-TextClient.obj: TextClient.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulecmd_CXXFLAGS) $(CXXFLAGS) -MT amulecmd-TextClient.obj -MD -MP -MF "$(DEPDIR)/amulecmd-TextClient.Tpo" -c -o amulecmd-TextClient.obj `if test -f 'TextClient.cpp'; then $(CYGPATH_W) 'TextClient.cpp'; else $(CYGPATH_W) '$(srcdir)/TextClient.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulecmd-TextClient.Tpo" "$(DEPDIR)/amulecmd-TextClient.Po"; else rm -f "$(DEPDIR)/amulecmd-TextClient.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TextClient.cpp' object='amulecmd-TextClient.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulecmd_CXXFLAGS) $(CXXFLAGS) -c -o amulecmd-TextClient.obj `if test -f 'TextClient.cpp'; then $(CYGPATH_W) 'TextClient.cpp'; else $(CYGPATH_W) '$(srcdir)/TextClient.cpp'; fi` + +amulecmd-ExternalConnector.o: ExternalConnector.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulecmd_CXXFLAGS) $(CXXFLAGS) -MT amulecmd-ExternalConnector.o -MD -MP -MF "$(DEPDIR)/amulecmd-ExternalConnector.Tpo" -c -o amulecmd-ExternalConnector.o `test -f 'ExternalConnector.cpp' || echo '$(srcdir)/'`ExternalConnector.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulecmd-ExternalConnector.Tpo" "$(DEPDIR)/amulecmd-ExternalConnector.Po"; else rm -f "$(DEPDIR)/amulecmd-ExternalConnector.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ExternalConnector.cpp' object='amulecmd-ExternalConnector.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulecmd_CXXFLAGS) $(CXXFLAGS) -c -o amulecmd-ExternalConnector.o `test -f 'ExternalConnector.cpp' || echo '$(srcdir)/'`ExternalConnector.cpp + +amulecmd-ExternalConnector.obj: ExternalConnector.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulecmd_CXXFLAGS) $(CXXFLAGS) -MT amulecmd-ExternalConnector.obj -MD -MP -MF "$(DEPDIR)/amulecmd-ExternalConnector.Tpo" -c -o amulecmd-ExternalConnector.obj `if test -f 'ExternalConnector.cpp'; then $(CYGPATH_W) 'ExternalConnector.cpp'; else $(CYGPATH_W) '$(srcdir)/ExternalConnector.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulecmd-ExternalConnector.Tpo" "$(DEPDIR)/amulecmd-ExternalConnector.Po"; else rm -f "$(DEPDIR)/amulecmd-ExternalConnector.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ExternalConnector.cpp' object='amulecmd-ExternalConnector.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulecmd_CXXFLAGS) $(CXXFLAGS) -c -o amulecmd-ExternalConnector.obj `if test -f 'ExternalConnector.cpp'; then $(CYGPATH_W) 'ExternalConnector.cpp'; else $(CYGPATH_W) '$(srcdir)/ExternalConnector.cpp'; fi` + +amulecmd-OtherFunctions.o: OtherFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulecmd_CXXFLAGS) $(CXXFLAGS) -MT amulecmd-OtherFunctions.o -MD -MP -MF "$(DEPDIR)/amulecmd-OtherFunctions.Tpo" -c -o amulecmd-OtherFunctions.o `test -f 'OtherFunctions.cpp' || echo '$(srcdir)/'`OtherFunctions.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulecmd-OtherFunctions.Tpo" "$(DEPDIR)/amulecmd-OtherFunctions.Po"; else rm -f "$(DEPDIR)/amulecmd-OtherFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='OtherFunctions.cpp' object='amulecmd-OtherFunctions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulecmd_CXXFLAGS) $(CXXFLAGS) -c -o amulecmd-OtherFunctions.o `test -f 'OtherFunctions.cpp' || echo '$(srcdir)/'`OtherFunctions.cpp + +amulecmd-OtherFunctions.obj: OtherFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulecmd_CXXFLAGS) $(CXXFLAGS) -MT amulecmd-OtherFunctions.obj -MD -MP -MF "$(DEPDIR)/amulecmd-OtherFunctions.Tpo" -c -o amulecmd-OtherFunctions.obj `if test -f 'OtherFunctions.cpp'; then $(CYGPATH_W) 'OtherFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/OtherFunctions.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulecmd-OtherFunctions.Tpo" "$(DEPDIR)/amulecmd-OtherFunctions.Po"; else rm -f "$(DEPDIR)/amulecmd-OtherFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='OtherFunctions.cpp' object='amulecmd-OtherFunctions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulecmd_CXXFLAGS) $(CXXFLAGS) -c -o amulecmd-OtherFunctions.obj `if test -f 'OtherFunctions.cpp'; then $(CYGPATH_W) 'OtherFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/OtherFunctions.cpp'; fi` + +amulecmd-NetworkFunctions.o: NetworkFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulecmd_CXXFLAGS) $(CXXFLAGS) -MT amulecmd-NetworkFunctions.o -MD -MP -MF "$(DEPDIR)/amulecmd-NetworkFunctions.Tpo" -c -o amulecmd-NetworkFunctions.o `test -f 'NetworkFunctions.cpp' || echo '$(srcdir)/'`NetworkFunctions.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulecmd-NetworkFunctions.Tpo" "$(DEPDIR)/amulecmd-NetworkFunctions.Po"; else rm -f "$(DEPDIR)/amulecmd-NetworkFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='NetworkFunctions.cpp' object='amulecmd-NetworkFunctions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulecmd_CXXFLAGS) $(CXXFLAGS) -c -o amulecmd-NetworkFunctions.o `test -f 'NetworkFunctions.cpp' || echo '$(srcdir)/'`NetworkFunctions.cpp + +amulecmd-NetworkFunctions.obj: NetworkFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulecmd_CXXFLAGS) $(CXXFLAGS) -MT amulecmd-NetworkFunctions.obj -MD -MP -MF "$(DEPDIR)/amulecmd-NetworkFunctions.Tpo" -c -o amulecmd-NetworkFunctions.obj `if test -f 'NetworkFunctions.cpp'; then $(CYGPATH_W) 'NetworkFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/NetworkFunctions.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulecmd-NetworkFunctions.Tpo" "$(DEPDIR)/amulecmd-NetworkFunctions.Po"; else rm -f "$(DEPDIR)/amulecmd-NetworkFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='NetworkFunctions.cpp' object='amulecmd-NetworkFunctions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulecmd_CXXFLAGS) $(CXXFLAGS) -c -o amulecmd-NetworkFunctions.obj `if test -f 'NetworkFunctions.cpp'; then $(CYGPATH_W) 'NetworkFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/NetworkFunctions.cpp'; fi` + +amuled-amuled.o: amuled.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-amuled.o -MD -MP -MF "$(DEPDIR)/amuled-amuled.Tpo" -c -o amuled-amuled.o `test -f 'amuled.cpp' || echo '$(srcdir)/'`amuled.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-amuled.Tpo" "$(DEPDIR)/amuled-amuled.Po"; else rm -f "$(DEPDIR)/amuled-amuled.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='amuled.cpp' object='amuled-amuled.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-amuled.o `test -f 'amuled.cpp' || echo '$(srcdir)/'`amuled.cpp + +amuled-amuled.obj: amuled.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-amuled.obj -MD -MP -MF "$(DEPDIR)/amuled-amuled.Tpo" -c -o amuled-amuled.obj `if test -f 'amuled.cpp'; then $(CYGPATH_W) 'amuled.cpp'; else $(CYGPATH_W) '$(srcdir)/amuled.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-amuled.Tpo" "$(DEPDIR)/amuled-amuled.Po"; else rm -f "$(DEPDIR)/amuled-amuled.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='amuled.cpp' object='amuled-amuled.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-amuled.obj `if test -f 'amuled.cpp'; then $(CYGPATH_W) 'amuled.cpp'; else $(CYGPATH_W) '$(srcdir)/amuled.cpp'; fi` + +amuled-Timer.o: Timer.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Timer.o -MD -MP -MF "$(DEPDIR)/amuled-Timer.Tpo" -c -o amuled-Timer.o `test -f 'Timer.cpp' || echo '$(srcdir)/'`Timer.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Timer.Tpo" "$(DEPDIR)/amuled-Timer.Po"; else rm -f "$(DEPDIR)/amuled-Timer.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Timer.cpp' object='amuled-Timer.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Timer.o `test -f 'Timer.cpp' || echo '$(srcdir)/'`Timer.cpp + +amuled-Timer.obj: Timer.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Timer.obj -MD -MP -MF "$(DEPDIR)/amuled-Timer.Tpo" -c -o amuled-Timer.obj `if test -f 'Timer.cpp'; then $(CYGPATH_W) 'Timer.cpp'; else $(CYGPATH_W) '$(srcdir)/Timer.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Timer.Tpo" "$(DEPDIR)/amuled-Timer.Po"; else rm -f "$(DEPDIR)/amuled-Timer.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Timer.cpp' object='amuled-Timer.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Timer.obj `if test -f 'Timer.cpp'; then $(CYGPATH_W) 'Timer.cpp'; else $(CYGPATH_W) '$(srcdir)/Timer.cpp'; fi` + +amuled-RC4Encrypt.o: RC4Encrypt.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-RC4Encrypt.o -MD -MP -MF "$(DEPDIR)/amuled-RC4Encrypt.Tpo" -c -o amuled-RC4Encrypt.o `test -f 'RC4Encrypt.cpp' || echo '$(srcdir)/'`RC4Encrypt.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-RC4Encrypt.Tpo" "$(DEPDIR)/amuled-RC4Encrypt.Po"; else rm -f "$(DEPDIR)/amuled-RC4Encrypt.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='RC4Encrypt.cpp' object='amuled-RC4Encrypt.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-RC4Encrypt.o `test -f 'RC4Encrypt.cpp' || echo '$(srcdir)/'`RC4Encrypt.cpp + +amuled-RC4Encrypt.obj: RC4Encrypt.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-RC4Encrypt.obj -MD -MP -MF "$(DEPDIR)/amuled-RC4Encrypt.Tpo" -c -o amuled-RC4Encrypt.obj `if test -f 'RC4Encrypt.cpp'; then $(CYGPATH_W) 'RC4Encrypt.cpp'; else $(CYGPATH_W) '$(srcdir)/RC4Encrypt.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-RC4Encrypt.Tpo" "$(DEPDIR)/amuled-RC4Encrypt.Po"; else rm -f "$(DEPDIR)/amuled-RC4Encrypt.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='RC4Encrypt.cpp' object='amuled-RC4Encrypt.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-RC4Encrypt.obj `if test -f 'RC4Encrypt.cpp'; then $(CYGPATH_W) 'RC4Encrypt.cpp'; else $(CYGPATH_W) '$(srcdir)/RC4Encrypt.cpp'; fi` + +amuled-amule.o: amule.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-amule.o -MD -MP -MF "$(DEPDIR)/amuled-amule.Tpo" -c -o amuled-amule.o `test -f 'amule.cpp' || echo '$(srcdir)/'`amule.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-amule.Tpo" "$(DEPDIR)/amuled-amule.Po"; else rm -f "$(DEPDIR)/amuled-amule.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='amule.cpp' object='amuled-amule.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-amule.o `test -f 'amule.cpp' || echo '$(srcdir)/'`amule.cpp + +amuled-amule.obj: amule.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-amule.obj -MD -MP -MF "$(DEPDIR)/amuled-amule.Tpo" -c -o amuled-amule.obj `if test -f 'amule.cpp'; then $(CYGPATH_W) 'amule.cpp'; else $(CYGPATH_W) '$(srcdir)/amule.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-amule.Tpo" "$(DEPDIR)/amuled-amule.Po"; else rm -f "$(DEPDIR)/amuled-amule.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='amule.cpp' object='amuled-amule.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-amule.obj `if test -f 'amule.cpp'; then $(CYGPATH_W) 'amule.cpp'; else $(CYGPATH_W) '$(srcdir)/amule.cpp'; fi` + +amuled-BaseClient.o: BaseClient.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-BaseClient.o -MD -MP -MF "$(DEPDIR)/amuled-BaseClient.Tpo" -c -o amuled-BaseClient.o `test -f 'BaseClient.cpp' || echo '$(srcdir)/'`BaseClient.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-BaseClient.Tpo" "$(DEPDIR)/amuled-BaseClient.Po"; else rm -f "$(DEPDIR)/amuled-BaseClient.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='BaseClient.cpp' object='amuled-BaseClient.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-BaseClient.o `test -f 'BaseClient.cpp' || echo '$(srcdir)/'`BaseClient.cpp + +amuled-BaseClient.obj: BaseClient.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-BaseClient.obj -MD -MP -MF "$(DEPDIR)/amuled-BaseClient.Tpo" -c -o amuled-BaseClient.obj `if test -f 'BaseClient.cpp'; then $(CYGPATH_W) 'BaseClient.cpp'; else $(CYGPATH_W) '$(srcdir)/BaseClient.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-BaseClient.Tpo" "$(DEPDIR)/amuled-BaseClient.Po"; else rm -f "$(DEPDIR)/amuled-BaseClient.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='BaseClient.cpp' object='amuled-BaseClient.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-BaseClient.obj `if test -f 'BaseClient.cpp'; then $(CYGPATH_W) 'BaseClient.cpp'; else $(CYGPATH_W) '$(srcdir)/BaseClient.cpp'; fi` + +amuled-ClientList.o: ClientList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ClientList.o -MD -MP -MF "$(DEPDIR)/amuled-ClientList.Tpo" -c -o amuled-ClientList.o `test -f 'ClientList.cpp' || echo '$(srcdir)/'`ClientList.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ClientList.Tpo" "$(DEPDIR)/amuled-ClientList.Po"; else rm -f "$(DEPDIR)/amuled-ClientList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientList.cpp' object='amuled-ClientList.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ClientList.o `test -f 'ClientList.cpp' || echo '$(srcdir)/'`ClientList.cpp + +amuled-ClientList.obj: ClientList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ClientList.obj -MD -MP -MF "$(DEPDIR)/amuled-ClientList.Tpo" -c -o amuled-ClientList.obj `if test -f 'ClientList.cpp'; then $(CYGPATH_W) 'ClientList.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientList.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ClientList.Tpo" "$(DEPDIR)/amuled-ClientList.Po"; else rm -f "$(DEPDIR)/amuled-ClientList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientList.cpp' object='amuled-ClientList.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ClientList.obj `if test -f 'ClientList.cpp'; then $(CYGPATH_W) 'ClientList.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientList.cpp'; fi` + +amuled-ClientCreditsList.o: ClientCreditsList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ClientCreditsList.o -MD -MP -MF "$(DEPDIR)/amuled-ClientCreditsList.Tpo" -c -o amuled-ClientCreditsList.o `test -f 'ClientCreditsList.cpp' || echo '$(srcdir)/'`ClientCreditsList.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ClientCreditsList.Tpo" "$(DEPDIR)/amuled-ClientCreditsList.Po"; else rm -f "$(DEPDIR)/amuled-ClientCreditsList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientCreditsList.cpp' object='amuled-ClientCreditsList.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ClientCreditsList.o `test -f 'ClientCreditsList.cpp' || echo '$(srcdir)/'`ClientCreditsList.cpp + +amuled-ClientCreditsList.obj: ClientCreditsList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ClientCreditsList.obj -MD -MP -MF "$(DEPDIR)/amuled-ClientCreditsList.Tpo" -c -o amuled-ClientCreditsList.obj `if test -f 'ClientCreditsList.cpp'; then $(CYGPATH_W) 'ClientCreditsList.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientCreditsList.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ClientCreditsList.Tpo" "$(DEPDIR)/amuled-ClientCreditsList.Po"; else rm -f "$(DEPDIR)/amuled-ClientCreditsList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientCreditsList.cpp' object='amuled-ClientCreditsList.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ClientCreditsList.obj `if test -f 'ClientCreditsList.cpp'; then $(CYGPATH_W) 'ClientCreditsList.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientCreditsList.cpp'; fi` + +amuled-ClientTCPSocket.o: ClientTCPSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ClientTCPSocket.o -MD -MP -MF "$(DEPDIR)/amuled-ClientTCPSocket.Tpo" -c -o amuled-ClientTCPSocket.o `test -f 'ClientTCPSocket.cpp' || echo '$(srcdir)/'`ClientTCPSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ClientTCPSocket.Tpo" "$(DEPDIR)/amuled-ClientTCPSocket.Po"; else rm -f "$(DEPDIR)/amuled-ClientTCPSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientTCPSocket.cpp' object='amuled-ClientTCPSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ClientTCPSocket.o `test -f 'ClientTCPSocket.cpp' || echo '$(srcdir)/'`ClientTCPSocket.cpp + +amuled-ClientTCPSocket.obj: ClientTCPSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ClientTCPSocket.obj -MD -MP -MF "$(DEPDIR)/amuled-ClientTCPSocket.Tpo" -c -o amuled-ClientTCPSocket.obj `if test -f 'ClientTCPSocket.cpp'; then $(CYGPATH_W) 'ClientTCPSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientTCPSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ClientTCPSocket.Tpo" "$(DEPDIR)/amuled-ClientTCPSocket.Po"; else rm -f "$(DEPDIR)/amuled-ClientTCPSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientTCPSocket.cpp' object='amuled-ClientTCPSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ClientTCPSocket.obj `if test -f 'ClientTCPSocket.cpp'; then $(CYGPATH_W) 'ClientTCPSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientTCPSocket.cpp'; fi` + +amuled-ClientUDPSocket.o: ClientUDPSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ClientUDPSocket.o -MD -MP -MF "$(DEPDIR)/amuled-ClientUDPSocket.Tpo" -c -o amuled-ClientUDPSocket.o `test -f 'ClientUDPSocket.cpp' || echo '$(srcdir)/'`ClientUDPSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ClientUDPSocket.Tpo" "$(DEPDIR)/amuled-ClientUDPSocket.Po"; else rm -f "$(DEPDIR)/amuled-ClientUDPSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientUDPSocket.cpp' object='amuled-ClientUDPSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ClientUDPSocket.o `test -f 'ClientUDPSocket.cpp' || echo '$(srcdir)/'`ClientUDPSocket.cpp + +amuled-ClientUDPSocket.obj: ClientUDPSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ClientUDPSocket.obj -MD -MP -MF "$(DEPDIR)/amuled-ClientUDPSocket.Tpo" -c -o amuled-ClientUDPSocket.obj `if test -f 'ClientUDPSocket.cpp'; then $(CYGPATH_W) 'ClientUDPSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientUDPSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ClientUDPSocket.Tpo" "$(DEPDIR)/amuled-ClientUDPSocket.Po"; else rm -f "$(DEPDIR)/amuled-ClientUDPSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientUDPSocket.cpp' object='amuled-ClientUDPSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ClientUDPSocket.obj `if test -f 'ClientUDPSocket.cpp'; then $(CYGPATH_W) 'ClientUDPSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientUDPSocket.cpp'; fi` + +amuled-DownloadClient.o: DownloadClient.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-DownloadClient.o -MD -MP -MF "$(DEPDIR)/amuled-DownloadClient.Tpo" -c -o amuled-DownloadClient.o `test -f 'DownloadClient.cpp' || echo '$(srcdir)/'`DownloadClient.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-DownloadClient.Tpo" "$(DEPDIR)/amuled-DownloadClient.Po"; else rm -f "$(DEPDIR)/amuled-DownloadClient.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DownloadClient.cpp' object='amuled-DownloadClient.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-DownloadClient.o `test -f 'DownloadClient.cpp' || echo '$(srcdir)/'`DownloadClient.cpp + +amuled-DownloadClient.obj: DownloadClient.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-DownloadClient.obj -MD -MP -MF "$(DEPDIR)/amuled-DownloadClient.Tpo" -c -o amuled-DownloadClient.obj `if test -f 'DownloadClient.cpp'; then $(CYGPATH_W) 'DownloadClient.cpp'; else $(CYGPATH_W) '$(srcdir)/DownloadClient.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-DownloadClient.Tpo" "$(DEPDIR)/amuled-DownloadClient.Po"; else rm -f "$(DEPDIR)/amuled-DownloadClient.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DownloadClient.cpp' object='amuled-DownloadClient.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-DownloadClient.obj `if test -f 'DownloadClient.cpp'; then $(CYGPATH_W) 'DownloadClient.cpp'; else $(CYGPATH_W) '$(srcdir)/DownloadClient.cpp'; fi` + +amuled-DownloadQueue.o: DownloadQueue.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-DownloadQueue.o -MD -MP -MF "$(DEPDIR)/amuled-DownloadQueue.Tpo" -c -o amuled-DownloadQueue.o `test -f 'DownloadQueue.cpp' || echo '$(srcdir)/'`DownloadQueue.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-DownloadQueue.Tpo" "$(DEPDIR)/amuled-DownloadQueue.Po"; else rm -f "$(DEPDIR)/amuled-DownloadQueue.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DownloadQueue.cpp' object='amuled-DownloadQueue.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-DownloadQueue.o `test -f 'DownloadQueue.cpp' || echo '$(srcdir)/'`DownloadQueue.cpp + +amuled-DownloadQueue.obj: DownloadQueue.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-DownloadQueue.obj -MD -MP -MF "$(DEPDIR)/amuled-DownloadQueue.Tpo" -c -o amuled-DownloadQueue.obj `if test -f 'DownloadQueue.cpp'; then $(CYGPATH_W) 'DownloadQueue.cpp'; else $(CYGPATH_W) '$(srcdir)/DownloadQueue.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-DownloadQueue.Tpo" "$(DEPDIR)/amuled-DownloadQueue.Po"; else rm -f "$(DEPDIR)/amuled-DownloadQueue.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DownloadQueue.cpp' object='amuled-DownloadQueue.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-DownloadQueue.obj `if test -f 'DownloadQueue.cpp'; then $(CYGPATH_W) 'DownloadQueue.cpp'; else $(CYGPATH_W) '$(srcdir)/DownloadQueue.cpp'; fi` + +amuled-ECSpecialCoreTags.o: ECSpecialCoreTags.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ECSpecialCoreTags.o -MD -MP -MF "$(DEPDIR)/amuled-ECSpecialCoreTags.Tpo" -c -o amuled-ECSpecialCoreTags.o `test -f 'ECSpecialCoreTags.cpp' || echo '$(srcdir)/'`ECSpecialCoreTags.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ECSpecialCoreTags.Tpo" "$(DEPDIR)/amuled-ECSpecialCoreTags.Po"; else rm -f "$(DEPDIR)/amuled-ECSpecialCoreTags.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECSpecialCoreTags.cpp' object='amuled-ECSpecialCoreTags.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ECSpecialCoreTags.o `test -f 'ECSpecialCoreTags.cpp' || echo '$(srcdir)/'`ECSpecialCoreTags.cpp + +amuled-ECSpecialCoreTags.obj: ECSpecialCoreTags.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ECSpecialCoreTags.obj -MD -MP -MF "$(DEPDIR)/amuled-ECSpecialCoreTags.Tpo" -c -o amuled-ECSpecialCoreTags.obj `if test -f 'ECSpecialCoreTags.cpp'; then $(CYGPATH_W) 'ECSpecialCoreTags.cpp'; else $(CYGPATH_W) '$(srcdir)/ECSpecialCoreTags.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ECSpecialCoreTags.Tpo" "$(DEPDIR)/amuled-ECSpecialCoreTags.Po"; else rm -f "$(DEPDIR)/amuled-ECSpecialCoreTags.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECSpecialCoreTags.cpp' object='amuled-ECSpecialCoreTags.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ECSpecialCoreTags.obj `if test -f 'ECSpecialCoreTags.cpp'; then $(CYGPATH_W) 'ECSpecialCoreTags.cpp'; else $(CYGPATH_W) '$(srcdir)/ECSpecialCoreTags.cpp'; fi` + +amuled-EMSocket.o: EMSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-EMSocket.o -MD -MP -MF "$(DEPDIR)/amuled-EMSocket.Tpo" -c -o amuled-EMSocket.o `test -f 'EMSocket.cpp' || echo '$(srcdir)/'`EMSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-EMSocket.Tpo" "$(DEPDIR)/amuled-EMSocket.Po"; else rm -f "$(DEPDIR)/amuled-EMSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='EMSocket.cpp' object='amuled-EMSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-EMSocket.o `test -f 'EMSocket.cpp' || echo '$(srcdir)/'`EMSocket.cpp + +amuled-EMSocket.obj: EMSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-EMSocket.obj -MD -MP -MF "$(DEPDIR)/amuled-EMSocket.Tpo" -c -o amuled-EMSocket.obj `if test -f 'EMSocket.cpp'; then $(CYGPATH_W) 'EMSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/EMSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-EMSocket.Tpo" "$(DEPDIR)/amuled-EMSocket.Po"; else rm -f "$(DEPDIR)/amuled-EMSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='EMSocket.cpp' object='amuled-EMSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-EMSocket.obj `if test -f 'EMSocket.cpp'; then $(CYGPATH_W) 'EMSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/EMSocket.cpp'; fi` + +amuled-EncryptedStreamSocket.o: EncryptedStreamSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-EncryptedStreamSocket.o -MD -MP -MF "$(DEPDIR)/amuled-EncryptedStreamSocket.Tpo" -c -o amuled-EncryptedStreamSocket.o `test -f 'EncryptedStreamSocket.cpp' || echo '$(srcdir)/'`EncryptedStreamSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-EncryptedStreamSocket.Tpo" "$(DEPDIR)/amuled-EncryptedStreamSocket.Po"; else rm -f "$(DEPDIR)/amuled-EncryptedStreamSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='EncryptedStreamSocket.cpp' object='amuled-EncryptedStreamSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-EncryptedStreamSocket.o `test -f 'EncryptedStreamSocket.cpp' || echo '$(srcdir)/'`EncryptedStreamSocket.cpp + +amuled-EncryptedStreamSocket.obj: EncryptedStreamSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-EncryptedStreamSocket.obj -MD -MP -MF "$(DEPDIR)/amuled-EncryptedStreamSocket.Tpo" -c -o amuled-EncryptedStreamSocket.obj `if test -f 'EncryptedStreamSocket.cpp'; then $(CYGPATH_W) 'EncryptedStreamSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/EncryptedStreamSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-EncryptedStreamSocket.Tpo" "$(DEPDIR)/amuled-EncryptedStreamSocket.Po"; else rm -f "$(DEPDIR)/amuled-EncryptedStreamSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='EncryptedStreamSocket.cpp' object='amuled-EncryptedStreamSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-EncryptedStreamSocket.obj `if test -f 'EncryptedStreamSocket.cpp'; then $(CYGPATH_W) 'EncryptedStreamSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/EncryptedStreamSocket.cpp'; fi` + +amuled-EncryptedDatagramSocket.o: EncryptedDatagramSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-EncryptedDatagramSocket.o -MD -MP -MF "$(DEPDIR)/amuled-EncryptedDatagramSocket.Tpo" -c -o amuled-EncryptedDatagramSocket.o `test -f 'EncryptedDatagramSocket.cpp' || echo '$(srcdir)/'`EncryptedDatagramSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-EncryptedDatagramSocket.Tpo" "$(DEPDIR)/amuled-EncryptedDatagramSocket.Po"; else rm -f "$(DEPDIR)/amuled-EncryptedDatagramSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='EncryptedDatagramSocket.cpp' object='amuled-EncryptedDatagramSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-EncryptedDatagramSocket.o `test -f 'EncryptedDatagramSocket.cpp' || echo '$(srcdir)/'`EncryptedDatagramSocket.cpp + +amuled-EncryptedDatagramSocket.obj: EncryptedDatagramSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-EncryptedDatagramSocket.obj -MD -MP -MF "$(DEPDIR)/amuled-EncryptedDatagramSocket.Tpo" -c -o amuled-EncryptedDatagramSocket.obj `if test -f 'EncryptedDatagramSocket.cpp'; then $(CYGPATH_W) 'EncryptedDatagramSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/EncryptedDatagramSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-EncryptedDatagramSocket.Tpo" "$(DEPDIR)/amuled-EncryptedDatagramSocket.Po"; else rm -f "$(DEPDIR)/amuled-EncryptedDatagramSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='EncryptedDatagramSocket.cpp' object='amuled-EncryptedDatagramSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-EncryptedDatagramSocket.obj `if test -f 'EncryptedDatagramSocket.cpp'; then $(CYGPATH_W) 'EncryptedDatagramSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/EncryptedDatagramSocket.cpp'; fi` + +amuled-ExternalConn.o: ExternalConn.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ExternalConn.o -MD -MP -MF "$(DEPDIR)/amuled-ExternalConn.Tpo" -c -o amuled-ExternalConn.o `test -f 'ExternalConn.cpp' || echo '$(srcdir)/'`ExternalConn.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ExternalConn.Tpo" "$(DEPDIR)/amuled-ExternalConn.Po"; else rm -f "$(DEPDIR)/amuled-ExternalConn.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ExternalConn.cpp' object='amuled-ExternalConn.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ExternalConn.o `test -f 'ExternalConn.cpp' || echo '$(srcdir)/'`ExternalConn.cpp + +amuled-ExternalConn.obj: ExternalConn.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ExternalConn.obj -MD -MP -MF "$(DEPDIR)/amuled-ExternalConn.Tpo" -c -o amuled-ExternalConn.obj `if test -f 'ExternalConn.cpp'; then $(CYGPATH_W) 'ExternalConn.cpp'; else $(CYGPATH_W) '$(srcdir)/ExternalConn.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ExternalConn.Tpo" "$(DEPDIR)/amuled-ExternalConn.Po"; else rm -f "$(DEPDIR)/amuled-ExternalConn.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ExternalConn.cpp' object='amuled-ExternalConn.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ExternalConn.obj `if test -f 'ExternalConn.cpp'; then $(CYGPATH_W) 'ExternalConn.cpp'; else $(CYGPATH_W) '$(srcdir)/ExternalConn.cpp'; fi` + +amuled-Friend.o: Friend.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Friend.o -MD -MP -MF "$(DEPDIR)/amuled-Friend.Tpo" -c -o amuled-Friend.o `test -f 'Friend.cpp' || echo '$(srcdir)/'`Friend.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Friend.Tpo" "$(DEPDIR)/amuled-Friend.Po"; else rm -f "$(DEPDIR)/amuled-Friend.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Friend.cpp' object='amuled-Friend.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Friend.o `test -f 'Friend.cpp' || echo '$(srcdir)/'`Friend.cpp + +amuled-Friend.obj: Friend.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Friend.obj -MD -MP -MF "$(DEPDIR)/amuled-Friend.Tpo" -c -o amuled-Friend.obj `if test -f 'Friend.cpp'; then $(CYGPATH_W) 'Friend.cpp'; else $(CYGPATH_W) '$(srcdir)/Friend.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Friend.Tpo" "$(DEPDIR)/amuled-Friend.Po"; else rm -f "$(DEPDIR)/amuled-Friend.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Friend.cpp' object='amuled-Friend.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Friend.obj `if test -f 'Friend.cpp'; then $(CYGPATH_W) 'Friend.cpp'; else $(CYGPATH_W) '$(srcdir)/Friend.cpp'; fi` + +amuled-FriendList.o: FriendList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-FriendList.o -MD -MP -MF "$(DEPDIR)/amuled-FriendList.Tpo" -c -o amuled-FriendList.o `test -f 'FriendList.cpp' || echo '$(srcdir)/'`FriendList.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-FriendList.Tpo" "$(DEPDIR)/amuled-FriendList.Po"; else rm -f "$(DEPDIR)/amuled-FriendList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FriendList.cpp' object='amuled-FriendList.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-FriendList.o `test -f 'FriendList.cpp' || echo '$(srcdir)/'`FriendList.cpp + +amuled-FriendList.obj: FriendList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-FriendList.obj -MD -MP -MF "$(DEPDIR)/amuled-FriendList.Tpo" -c -o amuled-FriendList.obj `if test -f 'FriendList.cpp'; then $(CYGPATH_W) 'FriendList.cpp'; else $(CYGPATH_W) '$(srcdir)/FriendList.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-FriendList.Tpo" "$(DEPDIR)/amuled-FriendList.Po"; else rm -f "$(DEPDIR)/amuled-FriendList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FriendList.cpp' object='amuled-FriendList.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-FriendList.obj `if test -f 'FriendList.cpp'; then $(CYGPATH_W) 'FriendList.cpp'; else $(CYGPATH_W) '$(srcdir)/FriendList.cpp'; fi` + +amuled-HTTPDownload.o: HTTPDownload.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-HTTPDownload.o -MD -MP -MF "$(DEPDIR)/amuled-HTTPDownload.Tpo" -c -o amuled-HTTPDownload.o `test -f 'HTTPDownload.cpp' || echo '$(srcdir)/'`HTTPDownload.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-HTTPDownload.Tpo" "$(DEPDIR)/amuled-HTTPDownload.Po"; else rm -f "$(DEPDIR)/amuled-HTTPDownload.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='HTTPDownload.cpp' object='amuled-HTTPDownload.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-HTTPDownload.o `test -f 'HTTPDownload.cpp' || echo '$(srcdir)/'`HTTPDownload.cpp + +amuled-HTTPDownload.obj: HTTPDownload.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-HTTPDownload.obj -MD -MP -MF "$(DEPDIR)/amuled-HTTPDownload.Tpo" -c -o amuled-HTTPDownload.obj `if test -f 'HTTPDownload.cpp'; then $(CYGPATH_W) 'HTTPDownload.cpp'; else $(CYGPATH_W) '$(srcdir)/HTTPDownload.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-HTTPDownload.Tpo" "$(DEPDIR)/amuled-HTTPDownload.Po"; else rm -f "$(DEPDIR)/amuled-HTTPDownload.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='HTTPDownload.cpp' object='amuled-HTTPDownload.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-HTTPDownload.obj `if test -f 'HTTPDownload.cpp'; then $(CYGPATH_W) 'HTTPDownload.cpp'; else $(CYGPATH_W) '$(srcdir)/HTTPDownload.cpp'; fi` + +amuled-IPFilter.o: IPFilter.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-IPFilter.o -MD -MP -MF "$(DEPDIR)/amuled-IPFilter.Tpo" -c -o amuled-IPFilter.o `test -f 'IPFilter.cpp' || echo '$(srcdir)/'`IPFilter.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-IPFilter.Tpo" "$(DEPDIR)/amuled-IPFilter.Po"; else rm -f "$(DEPDIR)/amuled-IPFilter.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='IPFilter.cpp' object='amuled-IPFilter.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-IPFilter.o `test -f 'IPFilter.cpp' || echo '$(srcdir)/'`IPFilter.cpp + +amuled-IPFilter.obj: IPFilter.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-IPFilter.obj -MD -MP -MF "$(DEPDIR)/amuled-IPFilter.Tpo" -c -o amuled-IPFilter.obj `if test -f 'IPFilter.cpp'; then $(CYGPATH_W) 'IPFilter.cpp'; else $(CYGPATH_W) '$(srcdir)/IPFilter.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-IPFilter.Tpo" "$(DEPDIR)/amuled-IPFilter.Po"; else rm -f "$(DEPDIR)/amuled-IPFilter.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='IPFilter.cpp' object='amuled-IPFilter.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-IPFilter.obj `if test -f 'IPFilter.cpp'; then $(CYGPATH_W) 'IPFilter.cpp'; else $(CYGPATH_W) '$(srcdir)/IPFilter.cpp'; fi` + +amuled-KnownFileList.o: KnownFileList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-KnownFileList.o -MD -MP -MF "$(DEPDIR)/amuled-KnownFileList.Tpo" -c -o amuled-KnownFileList.o `test -f 'KnownFileList.cpp' || echo '$(srcdir)/'`KnownFileList.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-KnownFileList.Tpo" "$(DEPDIR)/amuled-KnownFileList.Po"; else rm -f "$(DEPDIR)/amuled-KnownFileList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='KnownFileList.cpp' object='amuled-KnownFileList.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-KnownFileList.o `test -f 'KnownFileList.cpp' || echo '$(srcdir)/'`KnownFileList.cpp + +amuled-KnownFileList.obj: KnownFileList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-KnownFileList.obj -MD -MP -MF "$(DEPDIR)/amuled-KnownFileList.Tpo" -c -o amuled-KnownFileList.obj `if test -f 'KnownFileList.cpp'; then $(CYGPATH_W) 'KnownFileList.cpp'; else $(CYGPATH_W) '$(srcdir)/KnownFileList.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-KnownFileList.Tpo" "$(DEPDIR)/amuled-KnownFileList.Po"; else rm -f "$(DEPDIR)/amuled-KnownFileList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='KnownFileList.cpp' object='amuled-KnownFileList.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-KnownFileList.obj `if test -f 'KnownFileList.cpp'; then $(CYGPATH_W) 'KnownFileList.cpp'; else $(CYGPATH_W) '$(srcdir)/KnownFileList.cpp'; fi` + +amuled-ListenSocket.o: ListenSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ListenSocket.o -MD -MP -MF "$(DEPDIR)/amuled-ListenSocket.Tpo" -c -o amuled-ListenSocket.o `test -f 'ListenSocket.cpp' || echo '$(srcdir)/'`ListenSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ListenSocket.Tpo" "$(DEPDIR)/amuled-ListenSocket.Po"; else rm -f "$(DEPDIR)/amuled-ListenSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ListenSocket.cpp' object='amuled-ListenSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ListenSocket.o `test -f 'ListenSocket.cpp' || echo '$(srcdir)/'`ListenSocket.cpp + +amuled-ListenSocket.obj: ListenSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ListenSocket.obj -MD -MP -MF "$(DEPDIR)/amuled-ListenSocket.Tpo" -c -o amuled-ListenSocket.obj `if test -f 'ListenSocket.cpp'; then $(CYGPATH_W) 'ListenSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ListenSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ListenSocket.Tpo" "$(DEPDIR)/amuled-ListenSocket.Po"; else rm -f "$(DEPDIR)/amuled-ListenSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ListenSocket.cpp' object='amuled-ListenSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ListenSocket.obj `if test -f 'ListenSocket.cpp'; then $(CYGPATH_W) 'ListenSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ListenSocket.cpp'; fi` + +amuled-MuleUDPSocket.o: MuleUDPSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-MuleUDPSocket.o -MD -MP -MF "$(DEPDIR)/amuled-MuleUDPSocket.Tpo" -c -o amuled-MuleUDPSocket.o `test -f 'MuleUDPSocket.cpp' || echo '$(srcdir)/'`MuleUDPSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-MuleUDPSocket.Tpo" "$(DEPDIR)/amuled-MuleUDPSocket.Po"; else rm -f "$(DEPDIR)/amuled-MuleUDPSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleUDPSocket.cpp' object='amuled-MuleUDPSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-MuleUDPSocket.o `test -f 'MuleUDPSocket.cpp' || echo '$(srcdir)/'`MuleUDPSocket.cpp + +amuled-MuleUDPSocket.obj: MuleUDPSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-MuleUDPSocket.obj -MD -MP -MF "$(DEPDIR)/amuled-MuleUDPSocket.Tpo" -c -o amuled-MuleUDPSocket.obj `if test -f 'MuleUDPSocket.cpp'; then $(CYGPATH_W) 'MuleUDPSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleUDPSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-MuleUDPSocket.Tpo" "$(DEPDIR)/amuled-MuleUDPSocket.Po"; else rm -f "$(DEPDIR)/amuled-MuleUDPSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleUDPSocket.cpp' object='amuled-MuleUDPSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-MuleUDPSocket.obj `if test -f 'MuleUDPSocket.cpp'; then $(CYGPATH_W) 'MuleUDPSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleUDPSocket.cpp'; fi` + +amuled-SearchFile.o: SearchFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-SearchFile.o -MD -MP -MF "$(DEPDIR)/amuled-SearchFile.Tpo" -c -o amuled-SearchFile.o `test -f 'SearchFile.cpp' || echo '$(srcdir)/'`SearchFile.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-SearchFile.Tpo" "$(DEPDIR)/amuled-SearchFile.Po"; else rm -f "$(DEPDIR)/amuled-SearchFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SearchFile.cpp' object='amuled-SearchFile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-SearchFile.o `test -f 'SearchFile.cpp' || echo '$(srcdir)/'`SearchFile.cpp + +amuled-SearchFile.obj: SearchFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-SearchFile.obj -MD -MP -MF "$(DEPDIR)/amuled-SearchFile.Tpo" -c -o amuled-SearchFile.obj `if test -f 'SearchFile.cpp'; then $(CYGPATH_W) 'SearchFile.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchFile.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-SearchFile.Tpo" "$(DEPDIR)/amuled-SearchFile.Po"; else rm -f "$(DEPDIR)/amuled-SearchFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SearchFile.cpp' object='amuled-SearchFile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-SearchFile.obj `if test -f 'SearchFile.cpp'; then $(CYGPATH_W) 'SearchFile.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchFile.cpp'; fi` + +amuled-SearchList.o: SearchList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-SearchList.o -MD -MP -MF "$(DEPDIR)/amuled-SearchList.Tpo" -c -o amuled-SearchList.o `test -f 'SearchList.cpp' || echo '$(srcdir)/'`SearchList.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-SearchList.Tpo" "$(DEPDIR)/amuled-SearchList.Po"; else rm -f "$(DEPDIR)/amuled-SearchList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SearchList.cpp' object='amuled-SearchList.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-SearchList.o `test -f 'SearchList.cpp' || echo '$(srcdir)/'`SearchList.cpp + +amuled-SearchList.obj: SearchList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-SearchList.obj -MD -MP -MF "$(DEPDIR)/amuled-SearchList.Tpo" -c -o amuled-SearchList.obj `if test -f 'SearchList.cpp'; then $(CYGPATH_W) 'SearchList.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchList.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-SearchList.Tpo" "$(DEPDIR)/amuled-SearchList.Po"; else rm -f "$(DEPDIR)/amuled-SearchList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SearchList.cpp' object='amuled-SearchList.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-SearchList.obj `if test -f 'SearchList.cpp'; then $(CYGPATH_W) 'SearchList.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchList.cpp'; fi` + +amuled-ServerConnect.o: ServerConnect.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ServerConnect.o -MD -MP -MF "$(DEPDIR)/amuled-ServerConnect.Tpo" -c -o amuled-ServerConnect.o `test -f 'ServerConnect.cpp' || echo '$(srcdir)/'`ServerConnect.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ServerConnect.Tpo" "$(DEPDIR)/amuled-ServerConnect.Po"; else rm -f "$(DEPDIR)/amuled-ServerConnect.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerConnect.cpp' object='amuled-ServerConnect.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ServerConnect.o `test -f 'ServerConnect.cpp' || echo '$(srcdir)/'`ServerConnect.cpp + +amuled-ServerConnect.obj: ServerConnect.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ServerConnect.obj -MD -MP -MF "$(DEPDIR)/amuled-ServerConnect.Tpo" -c -o amuled-ServerConnect.obj `if test -f 'ServerConnect.cpp'; then $(CYGPATH_W) 'ServerConnect.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerConnect.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ServerConnect.Tpo" "$(DEPDIR)/amuled-ServerConnect.Po"; else rm -f "$(DEPDIR)/amuled-ServerConnect.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerConnect.cpp' object='amuled-ServerConnect.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ServerConnect.obj `if test -f 'ServerConnect.cpp'; then $(CYGPATH_W) 'ServerConnect.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerConnect.cpp'; fi` + +amuled-ServerList.o: ServerList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ServerList.o -MD -MP -MF "$(DEPDIR)/amuled-ServerList.Tpo" -c -o amuled-ServerList.o `test -f 'ServerList.cpp' || echo '$(srcdir)/'`ServerList.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ServerList.Tpo" "$(DEPDIR)/amuled-ServerList.Po"; else rm -f "$(DEPDIR)/amuled-ServerList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerList.cpp' object='amuled-ServerList.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ServerList.o `test -f 'ServerList.cpp' || echo '$(srcdir)/'`ServerList.cpp + +amuled-ServerList.obj: ServerList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ServerList.obj -MD -MP -MF "$(DEPDIR)/amuled-ServerList.Tpo" -c -o amuled-ServerList.obj `if test -f 'ServerList.cpp'; then $(CYGPATH_W) 'ServerList.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerList.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ServerList.Tpo" "$(DEPDIR)/amuled-ServerList.Po"; else rm -f "$(DEPDIR)/amuled-ServerList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerList.cpp' object='amuled-ServerList.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ServerList.obj `if test -f 'ServerList.cpp'; then $(CYGPATH_W) 'ServerList.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerList.cpp'; fi` + +amuled-ServerSocket.o: ServerSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ServerSocket.o -MD -MP -MF "$(DEPDIR)/amuled-ServerSocket.Tpo" -c -o amuled-ServerSocket.o `test -f 'ServerSocket.cpp' || echo '$(srcdir)/'`ServerSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ServerSocket.Tpo" "$(DEPDIR)/amuled-ServerSocket.Po"; else rm -f "$(DEPDIR)/amuled-ServerSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerSocket.cpp' object='amuled-ServerSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ServerSocket.o `test -f 'ServerSocket.cpp' || echo '$(srcdir)/'`ServerSocket.cpp + +amuled-ServerSocket.obj: ServerSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ServerSocket.obj -MD -MP -MF "$(DEPDIR)/amuled-ServerSocket.Tpo" -c -o amuled-ServerSocket.obj `if test -f 'ServerSocket.cpp'; then $(CYGPATH_W) 'ServerSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ServerSocket.Tpo" "$(DEPDIR)/amuled-ServerSocket.Po"; else rm -f "$(DEPDIR)/amuled-ServerSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerSocket.cpp' object='amuled-ServerSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ServerSocket.obj `if test -f 'ServerSocket.cpp'; then $(CYGPATH_W) 'ServerSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerSocket.cpp'; fi` + +amuled-ServerUDPSocket.o: ServerUDPSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ServerUDPSocket.o -MD -MP -MF "$(DEPDIR)/amuled-ServerUDPSocket.Tpo" -c -o amuled-ServerUDPSocket.o `test -f 'ServerUDPSocket.cpp' || echo '$(srcdir)/'`ServerUDPSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ServerUDPSocket.Tpo" "$(DEPDIR)/amuled-ServerUDPSocket.Po"; else rm -f "$(DEPDIR)/amuled-ServerUDPSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerUDPSocket.cpp' object='amuled-ServerUDPSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ServerUDPSocket.o `test -f 'ServerUDPSocket.cpp' || echo '$(srcdir)/'`ServerUDPSocket.cpp + +amuled-ServerUDPSocket.obj: ServerUDPSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ServerUDPSocket.obj -MD -MP -MF "$(DEPDIR)/amuled-ServerUDPSocket.Tpo" -c -o amuled-ServerUDPSocket.obj `if test -f 'ServerUDPSocket.cpp'; then $(CYGPATH_W) 'ServerUDPSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerUDPSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ServerUDPSocket.Tpo" "$(DEPDIR)/amuled-ServerUDPSocket.Po"; else rm -f "$(DEPDIR)/amuled-ServerUDPSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerUDPSocket.cpp' object='amuled-ServerUDPSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ServerUDPSocket.obj `if test -f 'ServerUDPSocket.cpp'; then $(CYGPATH_W) 'ServerUDPSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerUDPSocket.cpp'; fi` + +amuled-SharedFileList.o: SharedFileList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-SharedFileList.o -MD -MP -MF "$(DEPDIR)/amuled-SharedFileList.Tpo" -c -o amuled-SharedFileList.o `test -f 'SharedFileList.cpp' || echo '$(srcdir)/'`SharedFileList.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-SharedFileList.Tpo" "$(DEPDIR)/amuled-SharedFileList.Po"; else rm -f "$(DEPDIR)/amuled-SharedFileList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SharedFileList.cpp' object='amuled-SharedFileList.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-SharedFileList.o `test -f 'SharedFileList.cpp' || echo '$(srcdir)/'`SharedFileList.cpp + +amuled-SharedFileList.obj: SharedFileList.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-SharedFileList.obj -MD -MP -MF "$(DEPDIR)/amuled-SharedFileList.Tpo" -c -o amuled-SharedFileList.obj `if test -f 'SharedFileList.cpp'; then $(CYGPATH_W) 'SharedFileList.cpp'; else $(CYGPATH_W) '$(srcdir)/SharedFileList.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-SharedFileList.Tpo" "$(DEPDIR)/amuled-SharedFileList.Po"; else rm -f "$(DEPDIR)/amuled-SharedFileList.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SharedFileList.cpp' object='amuled-SharedFileList.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-SharedFileList.obj `if test -f 'SharedFileList.cpp'; then $(CYGPATH_W) 'SharedFileList.cpp'; else $(CYGPATH_W) '$(srcdir)/SharedFileList.cpp'; fi` + +amuled-ThreadTasks.o: ThreadTasks.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ThreadTasks.o -MD -MP -MF "$(DEPDIR)/amuled-ThreadTasks.Tpo" -c -o amuled-ThreadTasks.o `test -f 'ThreadTasks.cpp' || echo '$(srcdir)/'`ThreadTasks.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ThreadTasks.Tpo" "$(DEPDIR)/amuled-ThreadTasks.Po"; else rm -f "$(DEPDIR)/amuled-ThreadTasks.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ThreadTasks.cpp' object='amuled-ThreadTasks.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ThreadTasks.o `test -f 'ThreadTasks.cpp' || echo '$(srcdir)/'`ThreadTasks.cpp + +amuled-ThreadTasks.obj: ThreadTasks.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ThreadTasks.obj -MD -MP -MF "$(DEPDIR)/amuled-ThreadTasks.Tpo" -c -o amuled-ThreadTasks.obj `if test -f 'ThreadTasks.cpp'; then $(CYGPATH_W) 'ThreadTasks.cpp'; else $(CYGPATH_W) '$(srcdir)/ThreadTasks.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ThreadTasks.Tpo" "$(DEPDIR)/amuled-ThreadTasks.Po"; else rm -f "$(DEPDIR)/amuled-ThreadTasks.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ThreadTasks.cpp' object='amuled-ThreadTasks.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ThreadTasks.obj `if test -f 'ThreadTasks.cpp'; then $(CYGPATH_W) 'ThreadTasks.cpp'; else $(CYGPATH_W) '$(srcdir)/ThreadTasks.cpp'; fi` + +amuled-UploadBandwidthThrottler.o: UploadBandwidthThrottler.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-UploadBandwidthThrottler.o -MD -MP -MF "$(DEPDIR)/amuled-UploadBandwidthThrottler.Tpo" -c -o amuled-UploadBandwidthThrottler.o `test -f 'UploadBandwidthThrottler.cpp' || echo '$(srcdir)/'`UploadBandwidthThrottler.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-UploadBandwidthThrottler.Tpo" "$(DEPDIR)/amuled-UploadBandwidthThrottler.Po"; else rm -f "$(DEPDIR)/amuled-UploadBandwidthThrottler.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UploadBandwidthThrottler.cpp' object='amuled-UploadBandwidthThrottler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-UploadBandwidthThrottler.o `test -f 'UploadBandwidthThrottler.cpp' || echo '$(srcdir)/'`UploadBandwidthThrottler.cpp + +amuled-UploadBandwidthThrottler.obj: UploadBandwidthThrottler.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-UploadBandwidthThrottler.obj -MD -MP -MF "$(DEPDIR)/amuled-UploadBandwidthThrottler.Tpo" -c -o amuled-UploadBandwidthThrottler.obj `if test -f 'UploadBandwidthThrottler.cpp'; then $(CYGPATH_W) 'UploadBandwidthThrottler.cpp'; else $(CYGPATH_W) '$(srcdir)/UploadBandwidthThrottler.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-UploadBandwidthThrottler.Tpo" "$(DEPDIR)/amuled-UploadBandwidthThrottler.Po"; else rm -f "$(DEPDIR)/amuled-UploadBandwidthThrottler.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UploadBandwidthThrottler.cpp' object='amuled-UploadBandwidthThrottler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-UploadBandwidthThrottler.obj `if test -f 'UploadBandwidthThrottler.cpp'; then $(CYGPATH_W) 'UploadBandwidthThrottler.cpp'; else $(CYGPATH_W) '$(srcdir)/UploadBandwidthThrottler.cpp'; fi` + +amuled-UploadClient.o: UploadClient.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-UploadClient.o -MD -MP -MF "$(DEPDIR)/amuled-UploadClient.Tpo" -c -o amuled-UploadClient.o `test -f 'UploadClient.cpp' || echo '$(srcdir)/'`UploadClient.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-UploadClient.Tpo" "$(DEPDIR)/amuled-UploadClient.Po"; else rm -f "$(DEPDIR)/amuled-UploadClient.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UploadClient.cpp' object='amuled-UploadClient.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-UploadClient.o `test -f 'UploadClient.cpp' || echo '$(srcdir)/'`UploadClient.cpp + +amuled-UploadClient.obj: UploadClient.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-UploadClient.obj -MD -MP -MF "$(DEPDIR)/amuled-UploadClient.Tpo" -c -o amuled-UploadClient.obj `if test -f 'UploadClient.cpp'; then $(CYGPATH_W) 'UploadClient.cpp'; else $(CYGPATH_W) '$(srcdir)/UploadClient.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-UploadClient.Tpo" "$(DEPDIR)/amuled-UploadClient.Po"; else rm -f "$(DEPDIR)/amuled-UploadClient.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UploadClient.cpp' object='amuled-UploadClient.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-UploadClient.obj `if test -f 'UploadClient.cpp'; then $(CYGPATH_W) 'UploadClient.cpp'; else $(CYGPATH_W) '$(srcdir)/UploadClient.cpp'; fi` + +amuled-UploadQueue.o: UploadQueue.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-UploadQueue.o -MD -MP -MF "$(DEPDIR)/amuled-UploadQueue.Tpo" -c -o amuled-UploadQueue.o `test -f 'UploadQueue.cpp' || echo '$(srcdir)/'`UploadQueue.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-UploadQueue.Tpo" "$(DEPDIR)/amuled-UploadQueue.Po"; else rm -f "$(DEPDIR)/amuled-UploadQueue.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UploadQueue.cpp' object='amuled-UploadQueue.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-UploadQueue.o `test -f 'UploadQueue.cpp' || echo '$(srcdir)/'`UploadQueue.cpp + +amuled-UploadQueue.obj: UploadQueue.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-UploadQueue.obj -MD -MP -MF "$(DEPDIR)/amuled-UploadQueue.Tpo" -c -o amuled-UploadQueue.obj `if test -f 'UploadQueue.cpp'; then $(CYGPATH_W) 'UploadQueue.cpp'; else $(CYGPATH_W) '$(srcdir)/UploadQueue.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-UploadQueue.Tpo" "$(DEPDIR)/amuled-UploadQueue.Po"; else rm -f "$(DEPDIR)/amuled-UploadQueue.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UploadQueue.cpp' object='amuled-UploadQueue.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-UploadQueue.obj `if test -f 'UploadQueue.cpp'; then $(CYGPATH_W) 'UploadQueue.cpp'; else $(CYGPATH_W) '$(srcdir)/UploadQueue.cpp'; fi` + +amuled-Kademlia.o: kademlia/kademlia/Kademlia.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Kademlia.o -MD -MP -MF "$(DEPDIR)/amuled-Kademlia.Tpo" -c -o amuled-Kademlia.o `test -f 'kademlia/kademlia/Kademlia.cpp' || echo '$(srcdir)/'`kademlia/kademlia/Kademlia.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Kademlia.Tpo" "$(DEPDIR)/amuled-Kademlia.Po"; else rm -f "$(DEPDIR)/amuled-Kademlia.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/kademlia/Kademlia.cpp' object='amuled-Kademlia.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Kademlia.o `test -f 'kademlia/kademlia/Kademlia.cpp' || echo '$(srcdir)/'`kademlia/kademlia/Kademlia.cpp + +amuled-Kademlia.obj: kademlia/kademlia/Kademlia.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Kademlia.obj -MD -MP -MF "$(DEPDIR)/amuled-Kademlia.Tpo" -c -o amuled-Kademlia.obj `if test -f 'kademlia/kademlia/Kademlia.cpp'; then $(CYGPATH_W) 'kademlia/kademlia/Kademlia.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/kademlia/Kademlia.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Kademlia.Tpo" "$(DEPDIR)/amuled-Kademlia.Po"; else rm -f "$(DEPDIR)/amuled-Kademlia.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/kademlia/Kademlia.cpp' object='amuled-Kademlia.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Kademlia.obj `if test -f 'kademlia/kademlia/Kademlia.cpp'; then $(CYGPATH_W) 'kademlia/kademlia/Kademlia.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/kademlia/Kademlia.cpp'; fi` + +amuled-Search.o: kademlia/kademlia/Search.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Search.o -MD -MP -MF "$(DEPDIR)/amuled-Search.Tpo" -c -o amuled-Search.o `test -f 'kademlia/kademlia/Search.cpp' || echo '$(srcdir)/'`kademlia/kademlia/Search.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Search.Tpo" "$(DEPDIR)/amuled-Search.Po"; else rm -f "$(DEPDIR)/amuled-Search.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/kademlia/Search.cpp' object='amuled-Search.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Search.o `test -f 'kademlia/kademlia/Search.cpp' || echo '$(srcdir)/'`kademlia/kademlia/Search.cpp + +amuled-Search.obj: kademlia/kademlia/Search.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Search.obj -MD -MP -MF "$(DEPDIR)/amuled-Search.Tpo" -c -o amuled-Search.obj `if test -f 'kademlia/kademlia/Search.cpp'; then $(CYGPATH_W) 'kademlia/kademlia/Search.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/kademlia/Search.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Search.Tpo" "$(DEPDIR)/amuled-Search.Po"; else rm -f "$(DEPDIR)/amuled-Search.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/kademlia/Search.cpp' object='amuled-Search.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Search.obj `if test -f 'kademlia/kademlia/Search.cpp'; then $(CYGPATH_W) 'kademlia/kademlia/Search.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/kademlia/Search.cpp'; fi` + +amuled-Indexed.o: kademlia/kademlia/Indexed.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Indexed.o -MD -MP -MF "$(DEPDIR)/amuled-Indexed.Tpo" -c -o amuled-Indexed.o `test -f 'kademlia/kademlia/Indexed.cpp' || echo '$(srcdir)/'`kademlia/kademlia/Indexed.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Indexed.Tpo" "$(DEPDIR)/amuled-Indexed.Po"; else rm -f "$(DEPDIR)/amuled-Indexed.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/kademlia/Indexed.cpp' object='amuled-Indexed.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Indexed.o `test -f 'kademlia/kademlia/Indexed.cpp' || echo '$(srcdir)/'`kademlia/kademlia/Indexed.cpp + +amuled-Indexed.obj: kademlia/kademlia/Indexed.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Indexed.obj -MD -MP -MF "$(DEPDIR)/amuled-Indexed.Tpo" -c -o amuled-Indexed.obj `if test -f 'kademlia/kademlia/Indexed.cpp'; then $(CYGPATH_W) 'kademlia/kademlia/Indexed.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/kademlia/Indexed.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Indexed.Tpo" "$(DEPDIR)/amuled-Indexed.Po"; else rm -f "$(DEPDIR)/amuled-Indexed.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/kademlia/Indexed.cpp' object='amuled-Indexed.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Indexed.obj `if test -f 'kademlia/kademlia/Indexed.cpp'; then $(CYGPATH_W) 'kademlia/kademlia/Indexed.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/kademlia/Indexed.cpp'; fi` + +amuled-KademliaUDPListener.o: kademlia/net/KademliaUDPListener.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-KademliaUDPListener.o -MD -MP -MF "$(DEPDIR)/amuled-KademliaUDPListener.Tpo" -c -o amuled-KademliaUDPListener.o `test -f 'kademlia/net/KademliaUDPListener.cpp' || echo '$(srcdir)/'`kademlia/net/KademliaUDPListener.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-KademliaUDPListener.Tpo" "$(DEPDIR)/amuled-KademliaUDPListener.Po"; else rm -f "$(DEPDIR)/amuled-KademliaUDPListener.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/net/KademliaUDPListener.cpp' object='amuled-KademliaUDPListener.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-KademliaUDPListener.o `test -f 'kademlia/net/KademliaUDPListener.cpp' || echo '$(srcdir)/'`kademlia/net/KademliaUDPListener.cpp + +amuled-KademliaUDPListener.obj: kademlia/net/KademliaUDPListener.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-KademliaUDPListener.obj -MD -MP -MF "$(DEPDIR)/amuled-KademliaUDPListener.Tpo" -c -o amuled-KademliaUDPListener.obj `if test -f 'kademlia/net/KademliaUDPListener.cpp'; then $(CYGPATH_W) 'kademlia/net/KademliaUDPListener.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/net/KademliaUDPListener.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-KademliaUDPListener.Tpo" "$(DEPDIR)/amuled-KademliaUDPListener.Po"; else rm -f "$(DEPDIR)/amuled-KademliaUDPListener.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/net/KademliaUDPListener.cpp' object='amuled-KademliaUDPListener.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-KademliaUDPListener.obj `if test -f 'kademlia/net/KademliaUDPListener.cpp'; then $(CYGPATH_W) 'kademlia/net/KademliaUDPListener.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/net/KademliaUDPListener.cpp'; fi` + +amuled-Prefs.o: kademlia/kademlia/Prefs.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Prefs.o -MD -MP -MF "$(DEPDIR)/amuled-Prefs.Tpo" -c -o amuled-Prefs.o `test -f 'kademlia/kademlia/Prefs.cpp' || echo '$(srcdir)/'`kademlia/kademlia/Prefs.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Prefs.Tpo" "$(DEPDIR)/amuled-Prefs.Po"; else rm -f "$(DEPDIR)/amuled-Prefs.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/kademlia/Prefs.cpp' object='amuled-Prefs.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Prefs.o `test -f 'kademlia/kademlia/Prefs.cpp' || echo '$(srcdir)/'`kademlia/kademlia/Prefs.cpp + +amuled-Prefs.obj: kademlia/kademlia/Prefs.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Prefs.obj -MD -MP -MF "$(DEPDIR)/amuled-Prefs.Tpo" -c -o amuled-Prefs.obj `if test -f 'kademlia/kademlia/Prefs.cpp'; then $(CYGPATH_W) 'kademlia/kademlia/Prefs.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/kademlia/Prefs.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Prefs.Tpo" "$(DEPDIR)/amuled-Prefs.Po"; else rm -f "$(DEPDIR)/amuled-Prefs.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/kademlia/Prefs.cpp' object='amuled-Prefs.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Prefs.obj `if test -f 'kademlia/kademlia/Prefs.cpp'; then $(CYGPATH_W) 'kademlia/kademlia/Prefs.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/kademlia/Prefs.cpp'; fi` + +amuled-RoutingZone.o: kademlia/routing/RoutingZone.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-RoutingZone.o -MD -MP -MF "$(DEPDIR)/amuled-RoutingZone.Tpo" -c -o amuled-RoutingZone.o `test -f 'kademlia/routing/RoutingZone.cpp' || echo '$(srcdir)/'`kademlia/routing/RoutingZone.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-RoutingZone.Tpo" "$(DEPDIR)/amuled-RoutingZone.Po"; else rm -f "$(DEPDIR)/amuled-RoutingZone.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/routing/RoutingZone.cpp' object='amuled-RoutingZone.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-RoutingZone.o `test -f 'kademlia/routing/RoutingZone.cpp' || echo '$(srcdir)/'`kademlia/routing/RoutingZone.cpp + +amuled-RoutingZone.obj: kademlia/routing/RoutingZone.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-RoutingZone.obj -MD -MP -MF "$(DEPDIR)/amuled-RoutingZone.Tpo" -c -o amuled-RoutingZone.obj `if test -f 'kademlia/routing/RoutingZone.cpp'; then $(CYGPATH_W) 'kademlia/routing/RoutingZone.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/routing/RoutingZone.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-RoutingZone.Tpo" "$(DEPDIR)/amuled-RoutingZone.Po"; else rm -f "$(DEPDIR)/amuled-RoutingZone.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/routing/RoutingZone.cpp' object='amuled-RoutingZone.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-RoutingZone.obj `if test -f 'kademlia/routing/RoutingZone.cpp'; then $(CYGPATH_W) 'kademlia/routing/RoutingZone.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/routing/RoutingZone.cpp'; fi` + +amuled-Contact.o: kademlia/routing/Contact.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Contact.o -MD -MP -MF "$(DEPDIR)/amuled-Contact.Tpo" -c -o amuled-Contact.o `test -f 'kademlia/routing/Contact.cpp' || echo '$(srcdir)/'`kademlia/routing/Contact.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Contact.Tpo" "$(DEPDIR)/amuled-Contact.Po"; else rm -f "$(DEPDIR)/amuled-Contact.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/routing/Contact.cpp' object='amuled-Contact.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Contact.o `test -f 'kademlia/routing/Contact.cpp' || echo '$(srcdir)/'`kademlia/routing/Contact.cpp + +amuled-Contact.obj: kademlia/routing/Contact.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Contact.obj -MD -MP -MF "$(DEPDIR)/amuled-Contact.Tpo" -c -o amuled-Contact.obj `if test -f 'kademlia/routing/Contact.cpp'; then $(CYGPATH_W) 'kademlia/routing/Contact.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/routing/Contact.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Contact.Tpo" "$(DEPDIR)/amuled-Contact.Po"; else rm -f "$(DEPDIR)/amuled-Contact.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='kademlia/routing/Contact.cpp' object='amuled-Contact.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Contact.obj `if test -f 'kademlia/routing/Contact.cpp'; then $(CYGPATH_W) 'kademlia/routing/Contact.cpp'; else $(CYGPATH_W) '$(srcdir)/kademlia/routing/Contact.cpp'; fi` + +amuled-UPnP.o: UPnP.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-UPnP.o -MD -MP -MF "$(DEPDIR)/amuled-UPnP.Tpo" -c -o amuled-UPnP.o `test -f 'UPnP.cpp' || echo '$(srcdir)/'`UPnP.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-UPnP.Tpo" "$(DEPDIR)/amuled-UPnP.Po"; else rm -f "$(DEPDIR)/amuled-UPnP.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UPnP.cpp' object='amuled-UPnP.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-UPnP.o `test -f 'UPnP.cpp' || echo '$(srcdir)/'`UPnP.cpp + +amuled-UPnP.obj: UPnP.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-UPnP.obj -MD -MP -MF "$(DEPDIR)/amuled-UPnP.Tpo" -c -o amuled-UPnP.obj `if test -f 'UPnP.cpp'; then $(CYGPATH_W) 'UPnP.cpp'; else $(CYGPATH_W) '$(srcdir)/UPnP.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-UPnP.Tpo" "$(DEPDIR)/amuled-UPnP.Po"; else rm -f "$(DEPDIR)/amuled-UPnP.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UPnP.cpp' object='amuled-UPnP.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-UPnP.obj `if test -f 'UPnP.cpp'; then $(CYGPATH_W) 'UPnP.cpp'; else $(CYGPATH_W) '$(srcdir)/UPnP.cpp'; fi` + +amuled-UPnPCompatibility.o: UPnPCompatibility.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-UPnPCompatibility.o -MD -MP -MF "$(DEPDIR)/amuled-UPnPCompatibility.Tpo" -c -o amuled-UPnPCompatibility.o `test -f 'UPnPCompatibility.cpp' || echo '$(srcdir)/'`UPnPCompatibility.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-UPnPCompatibility.Tpo" "$(DEPDIR)/amuled-UPnPCompatibility.Po"; else rm -f "$(DEPDIR)/amuled-UPnPCompatibility.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UPnPCompatibility.cpp' object='amuled-UPnPCompatibility.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-UPnPCompatibility.o `test -f 'UPnPCompatibility.cpp' || echo '$(srcdir)/'`UPnPCompatibility.cpp + +amuled-UPnPCompatibility.obj: UPnPCompatibility.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-UPnPCompatibility.obj -MD -MP -MF "$(DEPDIR)/amuled-UPnPCompatibility.Tpo" -c -o amuled-UPnPCompatibility.obj `if test -f 'UPnPCompatibility.cpp'; then $(CYGPATH_W) 'UPnPCompatibility.cpp'; else $(CYGPATH_W) '$(srcdir)/UPnPCompatibility.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-UPnPCompatibility.Tpo" "$(DEPDIR)/amuled-UPnPCompatibility.Po"; else rm -f "$(DEPDIR)/amuled-UPnPCompatibility.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UPnPCompatibility.cpp' object='amuled-UPnPCompatibility.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-UPnPCompatibility.obj `if test -f 'UPnPCompatibility.cpp'; then $(CYGPATH_W) 'UPnPCompatibility.cpp'; else $(CYGPATH_W) '$(srcdir)/UPnPCompatibility.cpp'; fi` + +amuled-ClientCredits.o: ClientCredits.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ClientCredits.o -MD -MP -MF "$(DEPDIR)/amuled-ClientCredits.Tpo" -c -o amuled-ClientCredits.o `test -f 'ClientCredits.cpp' || echo '$(srcdir)/'`ClientCredits.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ClientCredits.Tpo" "$(DEPDIR)/amuled-ClientCredits.Po"; else rm -f "$(DEPDIR)/amuled-ClientCredits.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientCredits.cpp' object='amuled-ClientCredits.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ClientCredits.o `test -f 'ClientCredits.cpp' || echo '$(srcdir)/'`ClientCredits.cpp + +amuled-ClientCredits.obj: ClientCredits.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ClientCredits.obj -MD -MP -MF "$(DEPDIR)/amuled-ClientCredits.Tpo" -c -o amuled-ClientCredits.obj `if test -f 'ClientCredits.cpp'; then $(CYGPATH_W) 'ClientCredits.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientCredits.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ClientCredits.Tpo" "$(DEPDIR)/amuled-ClientCredits.Po"; else rm -f "$(DEPDIR)/amuled-ClientCredits.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientCredits.cpp' object='amuled-ClientCredits.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ClientCredits.obj `if test -f 'ClientCredits.cpp'; then $(CYGPATH_W) 'ClientCredits.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientCredits.cpp'; fi` + +amuled-ECSpecialMuleTags.o: ECSpecialMuleTags.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ECSpecialMuleTags.o -MD -MP -MF "$(DEPDIR)/amuled-ECSpecialMuleTags.Tpo" -c -o amuled-ECSpecialMuleTags.o `test -f 'ECSpecialMuleTags.cpp' || echo '$(srcdir)/'`ECSpecialMuleTags.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ECSpecialMuleTags.Tpo" "$(DEPDIR)/amuled-ECSpecialMuleTags.Po"; else rm -f "$(DEPDIR)/amuled-ECSpecialMuleTags.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECSpecialMuleTags.cpp' object='amuled-ECSpecialMuleTags.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ECSpecialMuleTags.o `test -f 'ECSpecialMuleTags.cpp' || echo '$(srcdir)/'`ECSpecialMuleTags.cpp + +amuled-ECSpecialMuleTags.obj: ECSpecialMuleTags.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-ECSpecialMuleTags.obj -MD -MP -MF "$(DEPDIR)/amuled-ECSpecialMuleTags.Tpo" -c -o amuled-ECSpecialMuleTags.obj `if test -f 'ECSpecialMuleTags.cpp'; then $(CYGPATH_W) 'ECSpecialMuleTags.cpp'; else $(CYGPATH_W) '$(srcdir)/ECSpecialMuleTags.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-ECSpecialMuleTags.Tpo" "$(DEPDIR)/amuled-ECSpecialMuleTags.Po"; else rm -f "$(DEPDIR)/amuled-ECSpecialMuleTags.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECSpecialMuleTags.cpp' object='amuled-ECSpecialMuleTags.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-ECSpecialMuleTags.obj `if test -f 'ECSpecialMuleTags.cpp'; then $(CYGPATH_W) 'ECSpecialMuleTags.cpp'; else $(CYGPATH_W) '$(srcdir)/ECSpecialMuleTags.cpp'; fi` + +amuled-KnownFile.o: KnownFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-KnownFile.o -MD -MP -MF "$(DEPDIR)/amuled-KnownFile.Tpo" -c -o amuled-KnownFile.o `test -f 'KnownFile.cpp' || echo '$(srcdir)/'`KnownFile.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-KnownFile.Tpo" "$(DEPDIR)/amuled-KnownFile.Po"; else rm -f "$(DEPDIR)/amuled-KnownFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='KnownFile.cpp' object='amuled-KnownFile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-KnownFile.o `test -f 'KnownFile.cpp' || echo '$(srcdir)/'`KnownFile.cpp + +amuled-KnownFile.obj: KnownFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-KnownFile.obj -MD -MP -MF "$(DEPDIR)/amuled-KnownFile.Tpo" -c -o amuled-KnownFile.obj `if test -f 'KnownFile.cpp'; then $(CYGPATH_W) 'KnownFile.cpp'; else $(CYGPATH_W) '$(srcdir)/KnownFile.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-KnownFile.Tpo" "$(DEPDIR)/amuled-KnownFile.Po"; else rm -f "$(DEPDIR)/amuled-KnownFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='KnownFile.cpp' object='amuled-KnownFile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-KnownFile.obj `if test -f 'KnownFile.cpp'; then $(CYGPATH_W) 'KnownFile.cpp'; else $(CYGPATH_W) '$(srcdir)/KnownFile.cpp'; fi` + +amuled-GetTickCount.o: GetTickCount.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-GetTickCount.o -MD -MP -MF "$(DEPDIR)/amuled-GetTickCount.Tpo" -c -o amuled-GetTickCount.o `test -f 'GetTickCount.cpp' || echo '$(srcdir)/'`GetTickCount.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-GetTickCount.Tpo" "$(DEPDIR)/amuled-GetTickCount.Po"; else rm -f "$(DEPDIR)/amuled-GetTickCount.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='GetTickCount.cpp' object='amuled-GetTickCount.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-GetTickCount.o `test -f 'GetTickCount.cpp' || echo '$(srcdir)/'`GetTickCount.cpp + +amuled-GetTickCount.obj: GetTickCount.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-GetTickCount.obj -MD -MP -MF "$(DEPDIR)/amuled-GetTickCount.Tpo" -c -o amuled-GetTickCount.obj `if test -f 'GetTickCount.cpp'; then $(CYGPATH_W) 'GetTickCount.cpp'; else $(CYGPATH_W) '$(srcdir)/GetTickCount.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-GetTickCount.Tpo" "$(DEPDIR)/amuled-GetTickCount.Po"; else rm -f "$(DEPDIR)/amuled-GetTickCount.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='GetTickCount.cpp' object='amuled-GetTickCount.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-GetTickCount.obj `if test -f 'GetTickCount.cpp'; then $(CYGPATH_W) 'GetTickCount.cpp'; else $(CYGPATH_W) '$(srcdir)/GetTickCount.cpp'; fi` + +amuled-GuiEvents.o: GuiEvents.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-GuiEvents.o -MD -MP -MF "$(DEPDIR)/amuled-GuiEvents.Tpo" -c -o amuled-GuiEvents.o `test -f 'GuiEvents.cpp' || echo '$(srcdir)/'`GuiEvents.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-GuiEvents.Tpo" "$(DEPDIR)/amuled-GuiEvents.Po"; else rm -f "$(DEPDIR)/amuled-GuiEvents.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='GuiEvents.cpp' object='amuled-GuiEvents.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-GuiEvents.o `test -f 'GuiEvents.cpp' || echo '$(srcdir)/'`GuiEvents.cpp + +amuled-GuiEvents.obj: GuiEvents.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-GuiEvents.obj -MD -MP -MF "$(DEPDIR)/amuled-GuiEvents.Tpo" -c -o amuled-GuiEvents.obj `if test -f 'GuiEvents.cpp'; then $(CYGPATH_W) 'GuiEvents.cpp'; else $(CYGPATH_W) '$(srcdir)/GuiEvents.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-GuiEvents.Tpo" "$(DEPDIR)/amuled-GuiEvents.Po"; else rm -f "$(DEPDIR)/amuled-GuiEvents.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='GuiEvents.cpp' object='amuled-GuiEvents.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-GuiEvents.obj `if test -f 'GuiEvents.cpp'; then $(CYGPATH_W) 'GuiEvents.cpp'; else $(CYGPATH_W) '$(srcdir)/GuiEvents.cpp'; fi` + +amuled-Logger.o: Logger.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Logger.o -MD -MP -MF "$(DEPDIR)/amuled-Logger.Tpo" -c -o amuled-Logger.o `test -f 'Logger.cpp' || echo '$(srcdir)/'`Logger.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Logger.Tpo" "$(DEPDIR)/amuled-Logger.Po"; else rm -f "$(DEPDIR)/amuled-Logger.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Logger.cpp' object='amuled-Logger.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Logger.o `test -f 'Logger.cpp' || echo '$(srcdir)/'`Logger.cpp + +amuled-Logger.obj: Logger.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Logger.obj -MD -MP -MF "$(DEPDIR)/amuled-Logger.Tpo" -c -o amuled-Logger.obj `if test -f 'Logger.cpp'; then $(CYGPATH_W) 'Logger.cpp'; else $(CYGPATH_W) '$(srcdir)/Logger.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Logger.Tpo" "$(DEPDIR)/amuled-Logger.Po"; else rm -f "$(DEPDIR)/amuled-Logger.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Logger.cpp' object='amuled-Logger.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Logger.obj `if test -f 'Logger.cpp'; then $(CYGPATH_W) 'Logger.cpp'; else $(CYGPATH_W) '$(srcdir)/Logger.cpp'; fi` + +amuled-PartFile.o: PartFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-PartFile.o -MD -MP -MF "$(DEPDIR)/amuled-PartFile.Tpo" -c -o amuled-PartFile.o `test -f 'PartFile.cpp' || echo '$(srcdir)/'`PartFile.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-PartFile.Tpo" "$(DEPDIR)/amuled-PartFile.Po"; else rm -f "$(DEPDIR)/amuled-PartFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PartFile.cpp' object='amuled-PartFile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-PartFile.o `test -f 'PartFile.cpp' || echo '$(srcdir)/'`PartFile.cpp + +amuled-PartFile.obj: PartFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-PartFile.obj -MD -MP -MF "$(DEPDIR)/amuled-PartFile.Tpo" -c -o amuled-PartFile.obj `if test -f 'PartFile.cpp'; then $(CYGPATH_W) 'PartFile.cpp'; else $(CYGPATH_W) '$(srcdir)/PartFile.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-PartFile.Tpo" "$(DEPDIR)/amuled-PartFile.Po"; else rm -f "$(DEPDIR)/amuled-PartFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PartFile.cpp' object='amuled-PartFile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-PartFile.obj `if test -f 'PartFile.cpp'; then $(CYGPATH_W) 'PartFile.cpp'; else $(CYGPATH_W) '$(srcdir)/PartFile.cpp'; fi` + +amuled-Preferences.o: Preferences.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Preferences.o -MD -MP -MF "$(DEPDIR)/amuled-Preferences.Tpo" -c -o amuled-Preferences.o `test -f 'Preferences.cpp' || echo '$(srcdir)/'`Preferences.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Preferences.Tpo" "$(DEPDIR)/amuled-Preferences.Po"; else rm -f "$(DEPDIR)/amuled-Preferences.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Preferences.cpp' object='amuled-Preferences.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Preferences.o `test -f 'Preferences.cpp' || echo '$(srcdir)/'`Preferences.cpp + +amuled-Preferences.obj: Preferences.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Preferences.obj -MD -MP -MF "$(DEPDIR)/amuled-Preferences.Tpo" -c -o amuled-Preferences.obj `if test -f 'Preferences.cpp'; then $(CYGPATH_W) 'Preferences.cpp'; else $(CYGPATH_W) '$(srcdir)/Preferences.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Preferences.Tpo" "$(DEPDIR)/amuled-Preferences.Po"; else rm -f "$(DEPDIR)/amuled-Preferences.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Preferences.cpp' object='amuled-Preferences.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Preferences.obj `if test -f 'Preferences.cpp'; then $(CYGPATH_W) 'Preferences.cpp'; else $(CYGPATH_W) '$(srcdir)/Preferences.cpp'; fi` + +amuled-Proxy.o: Proxy.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Proxy.o -MD -MP -MF "$(DEPDIR)/amuled-Proxy.Tpo" -c -o amuled-Proxy.o `test -f 'Proxy.cpp' || echo '$(srcdir)/'`Proxy.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Proxy.Tpo" "$(DEPDIR)/amuled-Proxy.Po"; else rm -f "$(DEPDIR)/amuled-Proxy.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Proxy.cpp' object='amuled-Proxy.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Proxy.o `test -f 'Proxy.cpp' || echo '$(srcdir)/'`Proxy.cpp + +amuled-Proxy.obj: Proxy.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Proxy.obj -MD -MP -MF "$(DEPDIR)/amuled-Proxy.Tpo" -c -o amuled-Proxy.obj `if test -f 'Proxy.cpp'; then $(CYGPATH_W) 'Proxy.cpp'; else $(CYGPATH_W) '$(srcdir)/Proxy.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Proxy.Tpo" "$(DEPDIR)/amuled-Proxy.Po"; else rm -f "$(DEPDIR)/amuled-Proxy.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Proxy.cpp' object='amuled-Proxy.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Proxy.obj `if test -f 'Proxy.cpp'; then $(CYGPATH_W) 'Proxy.cpp'; else $(CYGPATH_W) '$(srcdir)/Proxy.cpp'; fi` + +amuled-Server.o: Server.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Server.o -MD -MP -MF "$(DEPDIR)/amuled-Server.Tpo" -c -o amuled-Server.o `test -f 'Server.cpp' || echo '$(srcdir)/'`Server.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Server.Tpo" "$(DEPDIR)/amuled-Server.Po"; else rm -f "$(DEPDIR)/amuled-Server.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Server.cpp' object='amuled-Server.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Server.o `test -f 'Server.cpp' || echo '$(srcdir)/'`Server.cpp + +amuled-Server.obj: Server.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Server.obj -MD -MP -MF "$(DEPDIR)/amuled-Server.Tpo" -c -o amuled-Server.obj `if test -f 'Server.cpp'; then $(CYGPATH_W) 'Server.cpp'; else $(CYGPATH_W) '$(srcdir)/Server.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Server.Tpo" "$(DEPDIR)/amuled-Server.Po"; else rm -f "$(DEPDIR)/amuled-Server.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Server.cpp' object='amuled-Server.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Server.obj `if test -f 'Server.cpp'; then $(CYGPATH_W) 'Server.cpp'; else $(CYGPATH_W) '$(srcdir)/Server.cpp'; fi` + +amuled-Statistics.o: Statistics.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Statistics.o -MD -MP -MF "$(DEPDIR)/amuled-Statistics.Tpo" -c -o amuled-Statistics.o `test -f 'Statistics.cpp' || echo '$(srcdir)/'`Statistics.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Statistics.Tpo" "$(DEPDIR)/amuled-Statistics.Po"; else rm -f "$(DEPDIR)/amuled-Statistics.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Statistics.cpp' object='amuled-Statistics.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Statistics.o `test -f 'Statistics.cpp' || echo '$(srcdir)/'`Statistics.cpp + +amuled-Statistics.obj: Statistics.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-Statistics.obj -MD -MP -MF "$(DEPDIR)/amuled-Statistics.Tpo" -c -o amuled-Statistics.obj `if test -f 'Statistics.cpp'; then $(CYGPATH_W) 'Statistics.cpp'; else $(CYGPATH_W) '$(srcdir)/Statistics.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-Statistics.Tpo" "$(DEPDIR)/amuled-Statistics.Po"; else rm -f "$(DEPDIR)/amuled-Statistics.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Statistics.cpp' object='amuled-Statistics.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-Statistics.obj `if test -f 'Statistics.cpp'; then $(CYGPATH_W) 'Statistics.cpp'; else $(CYGPATH_W) '$(srcdir)/Statistics.cpp'; fi` + +amuled-StatTree.o: StatTree.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-StatTree.o -MD -MP -MF "$(DEPDIR)/amuled-StatTree.Tpo" -c -o amuled-StatTree.o `test -f 'StatTree.cpp' || echo '$(srcdir)/'`StatTree.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-StatTree.Tpo" "$(DEPDIR)/amuled-StatTree.Po"; else rm -f "$(DEPDIR)/amuled-StatTree.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='StatTree.cpp' object='amuled-StatTree.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-StatTree.o `test -f 'StatTree.cpp' || echo '$(srcdir)/'`StatTree.cpp + +amuled-StatTree.obj: StatTree.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-StatTree.obj -MD -MP -MF "$(DEPDIR)/amuled-StatTree.Tpo" -c -o amuled-StatTree.obj `if test -f 'StatTree.cpp'; then $(CYGPATH_W) 'StatTree.cpp'; else $(CYGPATH_W) '$(srcdir)/StatTree.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-StatTree.Tpo" "$(DEPDIR)/amuled-StatTree.Po"; else rm -f "$(DEPDIR)/amuled-StatTree.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='StatTree.cpp' object='amuled-StatTree.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-StatTree.obj `if test -f 'StatTree.cpp'; then $(CYGPATH_W) 'StatTree.cpp'; else $(CYGPATH_W) '$(srcdir)/StatTree.cpp'; fi` + +amuled-SHAHashSet.o: SHAHashSet.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-SHAHashSet.o -MD -MP -MF "$(DEPDIR)/amuled-SHAHashSet.Tpo" -c -o amuled-SHAHashSet.o `test -f 'SHAHashSet.cpp' || echo '$(srcdir)/'`SHAHashSet.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-SHAHashSet.Tpo" "$(DEPDIR)/amuled-SHAHashSet.Po"; else rm -f "$(DEPDIR)/amuled-SHAHashSet.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SHAHashSet.cpp' object='amuled-SHAHashSet.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-SHAHashSet.o `test -f 'SHAHashSet.cpp' || echo '$(srcdir)/'`SHAHashSet.cpp + +amuled-SHAHashSet.obj: SHAHashSet.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-SHAHashSet.obj -MD -MP -MF "$(DEPDIR)/amuled-SHAHashSet.Tpo" -c -o amuled-SHAHashSet.obj `if test -f 'SHAHashSet.cpp'; then $(CYGPATH_W) 'SHAHashSet.cpp'; else $(CYGPATH_W) '$(srcdir)/SHAHashSet.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-SHAHashSet.Tpo" "$(DEPDIR)/amuled-SHAHashSet.Po"; else rm -f "$(DEPDIR)/amuled-SHAHashSet.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SHAHashSet.cpp' object='amuled-SHAHashSet.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-SHAHashSet.obj `if test -f 'SHAHashSet.cpp'; then $(CYGPATH_W) 'SHAHashSet.cpp'; else $(CYGPATH_W) '$(srcdir)/SHAHashSet.cpp'; fi` + +amuled-TerminationProcess.o: TerminationProcess.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-TerminationProcess.o -MD -MP -MF "$(DEPDIR)/amuled-TerminationProcess.Tpo" -c -o amuled-TerminationProcess.o `test -f 'TerminationProcess.cpp' || echo '$(srcdir)/'`TerminationProcess.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-TerminationProcess.Tpo" "$(DEPDIR)/amuled-TerminationProcess.Po"; else rm -f "$(DEPDIR)/amuled-TerminationProcess.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TerminationProcess.cpp' object='amuled-TerminationProcess.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-TerminationProcess.o `test -f 'TerminationProcess.cpp' || echo '$(srcdir)/'`TerminationProcess.cpp + +amuled-TerminationProcess.obj: TerminationProcess.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-TerminationProcess.obj -MD -MP -MF "$(DEPDIR)/amuled-TerminationProcess.Tpo" -c -o amuled-TerminationProcess.obj `if test -f 'TerminationProcess.cpp'; then $(CYGPATH_W) 'TerminationProcess.cpp'; else $(CYGPATH_W) '$(srcdir)/TerminationProcess.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-TerminationProcess.Tpo" "$(DEPDIR)/amuled-TerminationProcess.Po"; else rm -f "$(DEPDIR)/amuled-TerminationProcess.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TerminationProcess.cpp' object='amuled-TerminationProcess.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-TerminationProcess.obj `if test -f 'TerminationProcess.cpp'; then $(CYGPATH_W) 'TerminationProcess.cpp'; else $(CYGPATH_W) '$(srcdir)/TerminationProcess.cpp'; fi` + +amuled-TerminationProcessAmuleweb.o: TerminationProcessAmuleweb.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-TerminationProcessAmuleweb.o -MD -MP -MF "$(DEPDIR)/amuled-TerminationProcessAmuleweb.Tpo" -c -o amuled-TerminationProcessAmuleweb.o `test -f 'TerminationProcessAmuleweb.cpp' || echo '$(srcdir)/'`TerminationProcessAmuleweb.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-TerminationProcessAmuleweb.Tpo" "$(DEPDIR)/amuled-TerminationProcessAmuleweb.Po"; else rm -f "$(DEPDIR)/amuled-TerminationProcessAmuleweb.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TerminationProcessAmuleweb.cpp' object='amuled-TerminationProcessAmuleweb.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-TerminationProcessAmuleweb.o `test -f 'TerminationProcessAmuleweb.cpp' || echo '$(srcdir)/'`TerminationProcessAmuleweb.cpp + +amuled-TerminationProcessAmuleweb.obj: TerminationProcessAmuleweb.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-TerminationProcessAmuleweb.obj -MD -MP -MF "$(DEPDIR)/amuled-TerminationProcessAmuleweb.Tpo" -c -o amuled-TerminationProcessAmuleweb.obj `if test -f 'TerminationProcessAmuleweb.cpp'; then $(CYGPATH_W) 'TerminationProcessAmuleweb.cpp'; else $(CYGPATH_W) '$(srcdir)/TerminationProcessAmuleweb.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-TerminationProcessAmuleweb.Tpo" "$(DEPDIR)/amuled-TerminationProcessAmuleweb.Po"; else rm -f "$(DEPDIR)/amuled-TerminationProcessAmuleweb.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TerminationProcessAmuleweb.cpp' object='amuled-TerminationProcessAmuleweb.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-TerminationProcessAmuleweb.obj `if test -f 'TerminationProcessAmuleweb.cpp'; then $(CYGPATH_W) 'TerminationProcessAmuleweb.cpp'; else $(CYGPATH_W) '$(srcdir)/TerminationProcessAmuleweb.cpp'; fi` + +amuled-UserEvents.o: UserEvents.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-UserEvents.o -MD -MP -MF "$(DEPDIR)/amuled-UserEvents.Tpo" -c -o amuled-UserEvents.o `test -f 'UserEvents.cpp' || echo '$(srcdir)/'`UserEvents.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-UserEvents.Tpo" "$(DEPDIR)/amuled-UserEvents.Po"; else rm -f "$(DEPDIR)/amuled-UserEvents.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UserEvents.cpp' object='amuled-UserEvents.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-UserEvents.o `test -f 'UserEvents.cpp' || echo '$(srcdir)/'`UserEvents.cpp + +amuled-UserEvents.obj: UserEvents.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-UserEvents.obj -MD -MP -MF "$(DEPDIR)/amuled-UserEvents.Tpo" -c -o amuled-UserEvents.obj `if test -f 'UserEvents.cpp'; then $(CYGPATH_W) 'UserEvents.cpp'; else $(CYGPATH_W) '$(srcdir)/UserEvents.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-UserEvents.Tpo" "$(DEPDIR)/amuled-UserEvents.Po"; else rm -f "$(DEPDIR)/amuled-UserEvents.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UserEvents.cpp' object='amuled-UserEvents.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-UserEvents.obj `if test -f 'UserEvents.cpp'; then $(CYGPATH_W) 'UserEvents.cpp'; else $(CYGPATH_W) '$(srcdir)/UserEvents.cpp'; fi` + +amuled-OtherFunctions.o: OtherFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-OtherFunctions.o -MD -MP -MF "$(DEPDIR)/amuled-OtherFunctions.Tpo" -c -o amuled-OtherFunctions.o `test -f 'OtherFunctions.cpp' || echo '$(srcdir)/'`OtherFunctions.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-OtherFunctions.Tpo" "$(DEPDIR)/amuled-OtherFunctions.Po"; else rm -f "$(DEPDIR)/amuled-OtherFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='OtherFunctions.cpp' object='amuled-OtherFunctions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-OtherFunctions.o `test -f 'OtherFunctions.cpp' || echo '$(srcdir)/'`OtherFunctions.cpp + +amuled-OtherFunctions.obj: OtherFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-OtherFunctions.obj -MD -MP -MF "$(DEPDIR)/amuled-OtherFunctions.Tpo" -c -o amuled-OtherFunctions.obj `if test -f 'OtherFunctions.cpp'; then $(CYGPATH_W) 'OtherFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/OtherFunctions.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-OtherFunctions.Tpo" "$(DEPDIR)/amuled-OtherFunctions.Po"; else rm -f "$(DEPDIR)/amuled-OtherFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='OtherFunctions.cpp' object='amuled-OtherFunctions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-OtherFunctions.obj `if test -f 'OtherFunctions.cpp'; then $(CYGPATH_W) 'OtherFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/OtherFunctions.cpp'; fi` + +amuled-NetworkFunctions.o: NetworkFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-NetworkFunctions.o -MD -MP -MF "$(DEPDIR)/amuled-NetworkFunctions.Tpo" -c -o amuled-NetworkFunctions.o `test -f 'NetworkFunctions.cpp' || echo '$(srcdir)/'`NetworkFunctions.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-NetworkFunctions.Tpo" "$(DEPDIR)/amuled-NetworkFunctions.Po"; else rm -f "$(DEPDIR)/amuled-NetworkFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='NetworkFunctions.cpp' object='amuled-NetworkFunctions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-NetworkFunctions.o `test -f 'NetworkFunctions.cpp' || echo '$(srcdir)/'`NetworkFunctions.cpp + +amuled-NetworkFunctions.obj: NetworkFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -MT amuled-NetworkFunctions.obj -MD -MP -MF "$(DEPDIR)/amuled-NetworkFunctions.Tpo" -c -o amuled-NetworkFunctions.obj `if test -f 'NetworkFunctions.cpp'; then $(CYGPATH_W) 'NetworkFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/NetworkFunctions.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuled-NetworkFunctions.Tpo" "$(DEPDIR)/amuled-NetworkFunctions.Po"; else rm -f "$(DEPDIR)/amuled-NetworkFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='NetworkFunctions.cpp' object='amuled-NetworkFunctions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuled_CXXFLAGS) $(CXXFLAGS) -c -o amuled-NetworkFunctions.obj `if test -f 'NetworkFunctions.cpp'; then $(CYGPATH_W) 'NetworkFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/NetworkFunctions.cpp'; fi` + +amulegui-amule-remote-gui.o: amule-remote-gui.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-amule-remote-gui.o -MD -MP -MF "$(DEPDIR)/amulegui-amule-remote-gui.Tpo" -c -o amulegui-amule-remote-gui.o `test -f 'amule-remote-gui.cpp' || echo '$(srcdir)/'`amule-remote-gui.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-amule-remote-gui.Tpo" "$(DEPDIR)/amulegui-amule-remote-gui.Po"; else rm -f "$(DEPDIR)/amulegui-amule-remote-gui.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='amule-remote-gui.cpp' object='amulegui-amule-remote-gui.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-amule-remote-gui.o `test -f 'amule-remote-gui.cpp' || echo '$(srcdir)/'`amule-remote-gui.cpp + +amulegui-amule-remote-gui.obj: amule-remote-gui.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-amule-remote-gui.obj -MD -MP -MF "$(DEPDIR)/amulegui-amule-remote-gui.Tpo" -c -o amulegui-amule-remote-gui.obj `if test -f 'amule-remote-gui.cpp'; then $(CYGPATH_W) 'amule-remote-gui.cpp'; else $(CYGPATH_W) '$(srcdir)/amule-remote-gui.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-amule-remote-gui.Tpo" "$(DEPDIR)/amulegui-amule-remote-gui.Po"; else rm -f "$(DEPDIR)/amulegui-amule-remote-gui.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='amule-remote-gui.cpp' object='amulegui-amule-remote-gui.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-amule-remote-gui.obj `if test -f 'amule-remote-gui.cpp'; then $(CYGPATH_W) 'amule-remote-gui.cpp'; else $(CYGPATH_W) '$(srcdir)/amule-remote-gui.cpp'; fi` + +amulegui-amule-gui.o: amule-gui.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-amule-gui.o -MD -MP -MF "$(DEPDIR)/amulegui-amule-gui.Tpo" -c -o amulegui-amule-gui.o `test -f 'amule-gui.cpp' || echo '$(srcdir)/'`amule-gui.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-amule-gui.Tpo" "$(DEPDIR)/amulegui-amule-gui.Po"; else rm -f "$(DEPDIR)/amulegui-amule-gui.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='amule-gui.cpp' object='amulegui-amule-gui.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-amule-gui.o `test -f 'amule-gui.cpp' || echo '$(srcdir)/'`amule-gui.cpp + +amulegui-amule-gui.obj: amule-gui.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-amule-gui.obj -MD -MP -MF "$(DEPDIR)/amulegui-amule-gui.Tpo" -c -o amulegui-amule-gui.obj `if test -f 'amule-gui.cpp'; then $(CYGPATH_W) 'amule-gui.cpp'; else $(CYGPATH_W) '$(srcdir)/amule-gui.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-amule-gui.Tpo" "$(DEPDIR)/amulegui-amule-gui.Po"; else rm -f "$(DEPDIR)/amulegui-amule-gui.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='amule-gui.cpp' object='amulegui-amule-gui.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-amule-gui.obj `if test -f 'amule-gui.cpp'; then $(CYGPATH_W) 'amule-gui.cpp'; else $(CYGPATH_W) '$(srcdir)/amule-gui.cpp'; fi` + +amulegui-amuleDlg.o: amuleDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-amuleDlg.o -MD -MP -MF "$(DEPDIR)/amulegui-amuleDlg.Tpo" -c -o amulegui-amuleDlg.o `test -f 'amuleDlg.cpp' || echo '$(srcdir)/'`amuleDlg.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-amuleDlg.Tpo" "$(DEPDIR)/amulegui-amuleDlg.Po"; else rm -f "$(DEPDIR)/amulegui-amuleDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='amuleDlg.cpp' object='amulegui-amuleDlg.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-amuleDlg.o `test -f 'amuleDlg.cpp' || echo '$(srcdir)/'`amuleDlg.cpp + +amulegui-amuleDlg.obj: amuleDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-amuleDlg.obj -MD -MP -MF "$(DEPDIR)/amulegui-amuleDlg.Tpo" -c -o amulegui-amuleDlg.obj `if test -f 'amuleDlg.cpp'; then $(CYGPATH_W) 'amuleDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/amuleDlg.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-amuleDlg.Tpo" "$(DEPDIR)/amulegui-amuleDlg.Po"; else rm -f "$(DEPDIR)/amulegui-amuleDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='amuleDlg.cpp' object='amulegui-amuleDlg.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-amuleDlg.obj `if test -f 'amuleDlg.cpp'; then $(CYGPATH_W) 'amuleDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/amuleDlg.cpp'; fi` + +amulegui-AddFriend.o: AddFriend.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-AddFriend.o -MD -MP -MF "$(DEPDIR)/amulegui-AddFriend.Tpo" -c -o amulegui-AddFriend.o `test -f 'AddFriend.cpp' || echo '$(srcdir)/'`AddFriend.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-AddFriend.Tpo" "$(DEPDIR)/amulegui-AddFriend.Po"; else rm -f "$(DEPDIR)/amulegui-AddFriend.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='AddFriend.cpp' object='amulegui-AddFriend.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-AddFriend.o `test -f 'AddFriend.cpp' || echo '$(srcdir)/'`AddFriend.cpp + +amulegui-AddFriend.obj: AddFriend.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-AddFriend.obj -MD -MP -MF "$(DEPDIR)/amulegui-AddFriend.Tpo" -c -o amulegui-AddFriend.obj `if test -f 'AddFriend.cpp'; then $(CYGPATH_W) 'AddFriend.cpp'; else $(CYGPATH_W) '$(srcdir)/AddFriend.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-AddFriend.Tpo" "$(DEPDIR)/amulegui-AddFriend.Po"; else rm -f "$(DEPDIR)/amulegui-AddFriend.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='AddFriend.cpp' object='amulegui-AddFriend.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-AddFriend.obj `if test -f 'AddFriend.cpp'; then $(CYGPATH_W) 'AddFriend.cpp'; else $(CYGPATH_W) '$(srcdir)/AddFriend.cpp'; fi` + +amulegui-CatDialog.o: CatDialog.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-CatDialog.o -MD -MP -MF "$(DEPDIR)/amulegui-CatDialog.Tpo" -c -o amulegui-CatDialog.o `test -f 'CatDialog.cpp' || echo '$(srcdir)/'`CatDialog.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-CatDialog.Tpo" "$(DEPDIR)/amulegui-CatDialog.Po"; else rm -f "$(DEPDIR)/amulegui-CatDialog.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='CatDialog.cpp' object='amulegui-CatDialog.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-CatDialog.o `test -f 'CatDialog.cpp' || echo '$(srcdir)/'`CatDialog.cpp + +amulegui-CatDialog.obj: CatDialog.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-CatDialog.obj -MD -MP -MF "$(DEPDIR)/amulegui-CatDialog.Tpo" -c -o amulegui-CatDialog.obj `if test -f 'CatDialog.cpp'; then $(CYGPATH_W) 'CatDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/CatDialog.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-CatDialog.Tpo" "$(DEPDIR)/amulegui-CatDialog.Po"; else rm -f "$(DEPDIR)/amulegui-CatDialog.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='CatDialog.cpp' object='amulegui-CatDialog.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-CatDialog.obj `if test -f 'CatDialog.cpp'; then $(CYGPATH_W) 'CatDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/CatDialog.cpp'; fi` + +amulegui-ChatSelector.o: ChatSelector.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-ChatSelector.o -MD -MP -MF "$(DEPDIR)/amulegui-ChatSelector.Tpo" -c -o amulegui-ChatSelector.o `test -f 'ChatSelector.cpp' || echo '$(srcdir)/'`ChatSelector.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-ChatSelector.Tpo" "$(DEPDIR)/amulegui-ChatSelector.Po"; else rm -f "$(DEPDIR)/amulegui-ChatSelector.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ChatSelector.cpp' object='amulegui-ChatSelector.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-ChatSelector.o `test -f 'ChatSelector.cpp' || echo '$(srcdir)/'`ChatSelector.cpp + +amulegui-ChatSelector.obj: ChatSelector.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-ChatSelector.obj -MD -MP -MF "$(DEPDIR)/amulegui-ChatSelector.Tpo" -c -o amulegui-ChatSelector.obj `if test -f 'ChatSelector.cpp'; then $(CYGPATH_W) 'ChatSelector.cpp'; else $(CYGPATH_W) '$(srcdir)/ChatSelector.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-ChatSelector.Tpo" "$(DEPDIR)/amulegui-ChatSelector.Po"; else rm -f "$(DEPDIR)/amulegui-ChatSelector.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ChatSelector.cpp' object='amulegui-ChatSelector.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-ChatSelector.obj `if test -f 'ChatSelector.cpp'; then $(CYGPATH_W) 'ChatSelector.cpp'; else $(CYGPATH_W) '$(srcdir)/ChatSelector.cpp'; fi` + +amulegui-ClientDetailDialog.o: ClientDetailDialog.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-ClientDetailDialog.o -MD -MP -MF "$(DEPDIR)/amulegui-ClientDetailDialog.Tpo" -c -o amulegui-ClientDetailDialog.o `test -f 'ClientDetailDialog.cpp' || echo '$(srcdir)/'`ClientDetailDialog.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-ClientDetailDialog.Tpo" "$(DEPDIR)/amulegui-ClientDetailDialog.Po"; else rm -f "$(DEPDIR)/amulegui-ClientDetailDialog.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientDetailDialog.cpp' object='amulegui-ClientDetailDialog.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-ClientDetailDialog.o `test -f 'ClientDetailDialog.cpp' || echo '$(srcdir)/'`ClientDetailDialog.cpp + +amulegui-ClientDetailDialog.obj: ClientDetailDialog.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-ClientDetailDialog.obj -MD -MP -MF "$(DEPDIR)/amulegui-ClientDetailDialog.Tpo" -c -o amulegui-ClientDetailDialog.obj `if test -f 'ClientDetailDialog.cpp'; then $(CYGPATH_W) 'ClientDetailDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientDetailDialog.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-ClientDetailDialog.Tpo" "$(DEPDIR)/amulegui-ClientDetailDialog.Po"; else rm -f "$(DEPDIR)/amulegui-ClientDetailDialog.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientDetailDialog.cpp' object='amulegui-ClientDetailDialog.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-ClientDetailDialog.obj `if test -f 'ClientDetailDialog.cpp'; then $(CYGPATH_W) 'ClientDetailDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientDetailDialog.cpp'; fi` + +amulegui-FileDetailDialog.o: FileDetailDialog.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-FileDetailDialog.o -MD -MP -MF "$(DEPDIR)/amulegui-FileDetailDialog.Tpo" -c -o amulegui-FileDetailDialog.o `test -f 'FileDetailDialog.cpp' || echo '$(srcdir)/'`FileDetailDialog.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-FileDetailDialog.Tpo" "$(DEPDIR)/amulegui-FileDetailDialog.Po"; else rm -f "$(DEPDIR)/amulegui-FileDetailDialog.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FileDetailDialog.cpp' object='amulegui-FileDetailDialog.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-FileDetailDialog.o `test -f 'FileDetailDialog.cpp' || echo '$(srcdir)/'`FileDetailDialog.cpp + +amulegui-FileDetailDialog.obj: FileDetailDialog.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-FileDetailDialog.obj -MD -MP -MF "$(DEPDIR)/amulegui-FileDetailDialog.Tpo" -c -o amulegui-FileDetailDialog.obj `if test -f 'FileDetailDialog.cpp'; then $(CYGPATH_W) 'FileDetailDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/FileDetailDialog.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-FileDetailDialog.Tpo" "$(DEPDIR)/amulegui-FileDetailDialog.Po"; else rm -f "$(DEPDIR)/amulegui-FileDetailDialog.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FileDetailDialog.cpp' object='amulegui-FileDetailDialog.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-FileDetailDialog.obj `if test -f 'FileDetailDialog.cpp'; then $(CYGPATH_W) 'FileDetailDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/FileDetailDialog.cpp'; fi` + +amulegui-KadDlg.o: KadDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-KadDlg.o -MD -MP -MF "$(DEPDIR)/amulegui-KadDlg.Tpo" -c -o amulegui-KadDlg.o `test -f 'KadDlg.cpp' || echo '$(srcdir)/'`KadDlg.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-KadDlg.Tpo" "$(DEPDIR)/amulegui-KadDlg.Po"; else rm -f "$(DEPDIR)/amulegui-KadDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='KadDlg.cpp' object='amulegui-KadDlg.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-KadDlg.o `test -f 'KadDlg.cpp' || echo '$(srcdir)/'`KadDlg.cpp + +amulegui-KadDlg.obj: KadDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-KadDlg.obj -MD -MP -MF "$(DEPDIR)/amulegui-KadDlg.Tpo" -c -o amulegui-KadDlg.obj `if test -f 'KadDlg.cpp'; then $(CYGPATH_W) 'KadDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/KadDlg.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-KadDlg.Tpo" "$(DEPDIR)/amulegui-KadDlg.Po"; else rm -f "$(DEPDIR)/amulegui-KadDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='KadDlg.cpp' object='amulegui-KadDlg.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-KadDlg.obj `if test -f 'KadDlg.cpp'; then $(CYGPATH_W) 'KadDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/KadDlg.cpp'; fi` + +amulegui-OScopeCtrl.o: OScopeCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-OScopeCtrl.o -MD -MP -MF "$(DEPDIR)/amulegui-OScopeCtrl.Tpo" -c -o amulegui-OScopeCtrl.o `test -f 'OScopeCtrl.cpp' || echo '$(srcdir)/'`OScopeCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-OScopeCtrl.Tpo" "$(DEPDIR)/amulegui-OScopeCtrl.Po"; else rm -f "$(DEPDIR)/amulegui-OScopeCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='OScopeCtrl.cpp' object='amulegui-OScopeCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-OScopeCtrl.o `test -f 'OScopeCtrl.cpp' || echo '$(srcdir)/'`OScopeCtrl.cpp + +amulegui-OScopeCtrl.obj: OScopeCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-OScopeCtrl.obj -MD -MP -MF "$(DEPDIR)/amulegui-OScopeCtrl.Tpo" -c -o amulegui-OScopeCtrl.obj `if test -f 'OScopeCtrl.cpp'; then $(CYGPATH_W) 'OScopeCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/OScopeCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-OScopeCtrl.Tpo" "$(DEPDIR)/amulegui-OScopeCtrl.Po"; else rm -f "$(DEPDIR)/amulegui-OScopeCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='OScopeCtrl.cpp' object='amulegui-OScopeCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-OScopeCtrl.obj `if test -f 'OScopeCtrl.cpp'; then $(CYGPATH_W) 'OScopeCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/OScopeCtrl.cpp'; fi` + +amulegui-PartFileConvert.o: PartFileConvert.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-PartFileConvert.o -MD -MP -MF "$(DEPDIR)/amulegui-PartFileConvert.Tpo" -c -o amulegui-PartFileConvert.o `test -f 'PartFileConvert.cpp' || echo '$(srcdir)/'`PartFileConvert.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-PartFileConvert.Tpo" "$(DEPDIR)/amulegui-PartFileConvert.Po"; else rm -f "$(DEPDIR)/amulegui-PartFileConvert.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PartFileConvert.cpp' object='amulegui-PartFileConvert.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-PartFileConvert.o `test -f 'PartFileConvert.cpp' || echo '$(srcdir)/'`PartFileConvert.cpp + +amulegui-PartFileConvert.obj: PartFileConvert.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-PartFileConvert.obj -MD -MP -MF "$(DEPDIR)/amulegui-PartFileConvert.Tpo" -c -o amulegui-PartFileConvert.obj `if test -f 'PartFileConvert.cpp'; then $(CYGPATH_W) 'PartFileConvert.cpp'; else $(CYGPATH_W) '$(srcdir)/PartFileConvert.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-PartFileConvert.Tpo" "$(DEPDIR)/amulegui-PartFileConvert.Po"; else rm -f "$(DEPDIR)/amulegui-PartFileConvert.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PartFileConvert.cpp' object='amulegui-PartFileConvert.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-PartFileConvert.obj `if test -f 'PartFileConvert.cpp'; then $(CYGPATH_W) 'PartFileConvert.cpp'; else $(CYGPATH_W) '$(srcdir)/PartFileConvert.cpp'; fi` + +amulegui-PrefsUnifiedDlg.o: PrefsUnifiedDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-PrefsUnifiedDlg.o -MD -MP -MF "$(DEPDIR)/amulegui-PrefsUnifiedDlg.Tpo" -c -o amulegui-PrefsUnifiedDlg.o `test -f 'PrefsUnifiedDlg.cpp' || echo '$(srcdir)/'`PrefsUnifiedDlg.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-PrefsUnifiedDlg.Tpo" "$(DEPDIR)/amulegui-PrefsUnifiedDlg.Po"; else rm -f "$(DEPDIR)/amulegui-PrefsUnifiedDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PrefsUnifiedDlg.cpp' object='amulegui-PrefsUnifiedDlg.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-PrefsUnifiedDlg.o `test -f 'PrefsUnifiedDlg.cpp' || echo '$(srcdir)/'`PrefsUnifiedDlg.cpp + +amulegui-PrefsUnifiedDlg.obj: PrefsUnifiedDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-PrefsUnifiedDlg.obj -MD -MP -MF "$(DEPDIR)/amulegui-PrefsUnifiedDlg.Tpo" -c -o amulegui-PrefsUnifiedDlg.obj `if test -f 'PrefsUnifiedDlg.cpp'; then $(CYGPATH_W) 'PrefsUnifiedDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/PrefsUnifiedDlg.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-PrefsUnifiedDlg.Tpo" "$(DEPDIR)/amulegui-PrefsUnifiedDlg.Po"; else rm -f "$(DEPDIR)/amulegui-PrefsUnifiedDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PrefsUnifiedDlg.cpp' object='amulegui-PrefsUnifiedDlg.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-PrefsUnifiedDlg.obj `if test -f 'PrefsUnifiedDlg.cpp'; then $(CYGPATH_W) 'PrefsUnifiedDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/PrefsUnifiedDlg.cpp'; fi` + +amulegui-SearchDlg.o: SearchDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-SearchDlg.o -MD -MP -MF "$(DEPDIR)/amulegui-SearchDlg.Tpo" -c -o amulegui-SearchDlg.o `test -f 'SearchDlg.cpp' || echo '$(srcdir)/'`SearchDlg.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-SearchDlg.Tpo" "$(DEPDIR)/amulegui-SearchDlg.Po"; else rm -f "$(DEPDIR)/amulegui-SearchDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SearchDlg.cpp' object='amulegui-SearchDlg.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-SearchDlg.o `test -f 'SearchDlg.cpp' || echo '$(srcdir)/'`SearchDlg.cpp + +amulegui-SearchDlg.obj: SearchDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-SearchDlg.obj -MD -MP -MF "$(DEPDIR)/amulegui-SearchDlg.Tpo" -c -o amulegui-SearchDlg.obj `if test -f 'SearchDlg.cpp'; then $(CYGPATH_W) 'SearchDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchDlg.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-SearchDlg.Tpo" "$(DEPDIR)/amulegui-SearchDlg.Po"; else rm -f "$(DEPDIR)/amulegui-SearchDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SearchDlg.cpp' object='amulegui-SearchDlg.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-SearchDlg.obj `if test -f 'SearchDlg.cpp'; then $(CYGPATH_W) 'SearchDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchDlg.cpp'; fi` + +amulegui-ServerWnd.o: ServerWnd.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-ServerWnd.o -MD -MP -MF "$(DEPDIR)/amulegui-ServerWnd.Tpo" -c -o amulegui-ServerWnd.o `test -f 'ServerWnd.cpp' || echo '$(srcdir)/'`ServerWnd.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-ServerWnd.Tpo" "$(DEPDIR)/amulegui-ServerWnd.Po"; else rm -f "$(DEPDIR)/amulegui-ServerWnd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerWnd.cpp' object='amulegui-ServerWnd.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-ServerWnd.o `test -f 'ServerWnd.cpp' || echo '$(srcdir)/'`ServerWnd.cpp + +amulegui-ServerWnd.obj: ServerWnd.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-ServerWnd.obj -MD -MP -MF "$(DEPDIR)/amulegui-ServerWnd.Tpo" -c -o amulegui-ServerWnd.obj `if test -f 'ServerWnd.cpp'; then $(CYGPATH_W) 'ServerWnd.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerWnd.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-ServerWnd.Tpo" "$(DEPDIR)/amulegui-ServerWnd.Po"; else rm -f "$(DEPDIR)/amulegui-ServerWnd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerWnd.cpp' object='amulegui-ServerWnd.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-ServerWnd.obj `if test -f 'ServerWnd.cpp'; then $(CYGPATH_W) 'ServerWnd.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerWnd.cpp'; fi` + +amulegui-SharedFilesWnd.o: SharedFilesWnd.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-SharedFilesWnd.o -MD -MP -MF "$(DEPDIR)/amulegui-SharedFilesWnd.Tpo" -c -o amulegui-SharedFilesWnd.o `test -f 'SharedFilesWnd.cpp' || echo '$(srcdir)/'`SharedFilesWnd.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-SharedFilesWnd.Tpo" "$(DEPDIR)/amulegui-SharedFilesWnd.Po"; else rm -f "$(DEPDIR)/amulegui-SharedFilesWnd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SharedFilesWnd.cpp' object='amulegui-SharedFilesWnd.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-SharedFilesWnd.o `test -f 'SharedFilesWnd.cpp' || echo '$(srcdir)/'`SharedFilesWnd.cpp + +amulegui-SharedFilesWnd.obj: SharedFilesWnd.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-SharedFilesWnd.obj -MD -MP -MF "$(DEPDIR)/amulegui-SharedFilesWnd.Tpo" -c -o amulegui-SharedFilesWnd.obj `if test -f 'SharedFilesWnd.cpp'; then $(CYGPATH_W) 'SharedFilesWnd.cpp'; else $(CYGPATH_W) '$(srcdir)/SharedFilesWnd.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-SharedFilesWnd.Tpo" "$(DEPDIR)/amulegui-SharedFilesWnd.Po"; else rm -f "$(DEPDIR)/amulegui-SharedFilesWnd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SharedFilesWnd.cpp' object='amulegui-SharedFilesWnd.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-SharedFilesWnd.obj `if test -f 'SharedFilesWnd.cpp'; then $(CYGPATH_W) 'SharedFilesWnd.cpp'; else $(CYGPATH_W) '$(srcdir)/SharedFilesWnd.cpp'; fi` + +amulegui-StatisticsDlg.o: StatisticsDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-StatisticsDlg.o -MD -MP -MF "$(DEPDIR)/amulegui-StatisticsDlg.Tpo" -c -o amulegui-StatisticsDlg.o `test -f 'StatisticsDlg.cpp' || echo '$(srcdir)/'`StatisticsDlg.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-StatisticsDlg.Tpo" "$(DEPDIR)/amulegui-StatisticsDlg.Po"; else rm -f "$(DEPDIR)/amulegui-StatisticsDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='StatisticsDlg.cpp' object='amulegui-StatisticsDlg.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-StatisticsDlg.o `test -f 'StatisticsDlg.cpp' || echo '$(srcdir)/'`StatisticsDlg.cpp + +amulegui-StatisticsDlg.obj: StatisticsDlg.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-StatisticsDlg.obj -MD -MP -MF "$(DEPDIR)/amulegui-StatisticsDlg.Tpo" -c -o amulegui-StatisticsDlg.obj `if test -f 'StatisticsDlg.cpp'; then $(CYGPATH_W) 'StatisticsDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/StatisticsDlg.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-StatisticsDlg.Tpo" "$(DEPDIR)/amulegui-StatisticsDlg.Po"; else rm -f "$(DEPDIR)/amulegui-StatisticsDlg.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='StatisticsDlg.cpp' object='amulegui-StatisticsDlg.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-StatisticsDlg.obj `if test -f 'StatisticsDlg.cpp'; then $(CYGPATH_W) 'StatisticsDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/StatisticsDlg.cpp'; fi` + +amulegui-SearchListCtrl.o: SearchListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-SearchListCtrl.o -MD -MP -MF "$(DEPDIR)/amulegui-SearchListCtrl.Tpo" -c -o amulegui-SearchListCtrl.o `test -f 'SearchListCtrl.cpp' || echo '$(srcdir)/'`SearchListCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-SearchListCtrl.Tpo" "$(DEPDIR)/amulegui-SearchListCtrl.Po"; else rm -f "$(DEPDIR)/amulegui-SearchListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SearchListCtrl.cpp' object='amulegui-SearchListCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-SearchListCtrl.o `test -f 'SearchListCtrl.cpp' || echo '$(srcdir)/'`SearchListCtrl.cpp + +amulegui-SearchListCtrl.obj: SearchListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-SearchListCtrl.obj -MD -MP -MF "$(DEPDIR)/amulegui-SearchListCtrl.Tpo" -c -o amulegui-SearchListCtrl.obj `if test -f 'SearchListCtrl.cpp'; then $(CYGPATH_W) 'SearchListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchListCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-SearchListCtrl.Tpo" "$(DEPDIR)/amulegui-SearchListCtrl.Po"; else rm -f "$(DEPDIR)/amulegui-SearchListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SearchListCtrl.cpp' object='amulegui-SearchListCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-SearchListCtrl.obj `if test -f 'SearchListCtrl.cpp'; then $(CYGPATH_W) 'SearchListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/SearchListCtrl.cpp'; fi` + +amulegui-DownloadListCtrl.o: DownloadListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-DownloadListCtrl.o -MD -MP -MF "$(DEPDIR)/amulegui-DownloadListCtrl.Tpo" -c -o amulegui-DownloadListCtrl.o `test -f 'DownloadListCtrl.cpp' || echo '$(srcdir)/'`DownloadListCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-DownloadListCtrl.Tpo" "$(DEPDIR)/amulegui-DownloadListCtrl.Po"; else rm -f "$(DEPDIR)/amulegui-DownloadListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DownloadListCtrl.cpp' object='amulegui-DownloadListCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-DownloadListCtrl.o `test -f 'DownloadListCtrl.cpp' || echo '$(srcdir)/'`DownloadListCtrl.cpp + +amulegui-DownloadListCtrl.obj: DownloadListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-DownloadListCtrl.obj -MD -MP -MF "$(DEPDIR)/amulegui-DownloadListCtrl.Tpo" -c -o amulegui-DownloadListCtrl.obj `if test -f 'DownloadListCtrl.cpp'; then $(CYGPATH_W) 'DownloadListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/DownloadListCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-DownloadListCtrl.Tpo" "$(DEPDIR)/amulegui-DownloadListCtrl.Po"; else rm -f "$(DEPDIR)/amulegui-DownloadListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DownloadListCtrl.cpp' object='amulegui-DownloadListCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-DownloadListCtrl.obj `if test -f 'DownloadListCtrl.cpp'; then $(CYGPATH_W) 'DownloadListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/DownloadListCtrl.cpp'; fi` + +amulegui-ClientListCtrl.o: ClientListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-ClientListCtrl.o -MD -MP -MF "$(DEPDIR)/amulegui-ClientListCtrl.Tpo" -c -o amulegui-ClientListCtrl.o `test -f 'ClientListCtrl.cpp' || echo '$(srcdir)/'`ClientListCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-ClientListCtrl.Tpo" "$(DEPDIR)/amulegui-ClientListCtrl.Po"; else rm -f "$(DEPDIR)/amulegui-ClientListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientListCtrl.cpp' object='amulegui-ClientListCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-ClientListCtrl.o `test -f 'ClientListCtrl.cpp' || echo '$(srcdir)/'`ClientListCtrl.cpp + +amulegui-ClientListCtrl.obj: ClientListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-ClientListCtrl.obj -MD -MP -MF "$(DEPDIR)/amulegui-ClientListCtrl.Tpo" -c -o amulegui-ClientListCtrl.obj `if test -f 'ClientListCtrl.cpp'; then $(CYGPATH_W) 'ClientListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientListCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-ClientListCtrl.Tpo" "$(DEPDIR)/amulegui-ClientListCtrl.Po"; else rm -f "$(DEPDIR)/amulegui-ClientListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientListCtrl.cpp' object='amulegui-ClientListCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-ClientListCtrl.obj `if test -f 'ClientListCtrl.cpp'; then $(CYGPATH_W) 'ClientListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientListCtrl.cpp'; fi` + +amulegui-FriendListCtrl.o: FriendListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-FriendListCtrl.o -MD -MP -MF "$(DEPDIR)/amulegui-FriendListCtrl.Tpo" -c -o amulegui-FriendListCtrl.o `test -f 'FriendListCtrl.cpp' || echo '$(srcdir)/'`FriendListCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-FriendListCtrl.Tpo" "$(DEPDIR)/amulegui-FriendListCtrl.Po"; else rm -f "$(DEPDIR)/amulegui-FriendListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FriendListCtrl.cpp' object='amulegui-FriendListCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-FriendListCtrl.o `test -f 'FriendListCtrl.cpp' || echo '$(srcdir)/'`FriendListCtrl.cpp + +amulegui-FriendListCtrl.obj: FriendListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-FriendListCtrl.obj -MD -MP -MF "$(DEPDIR)/amulegui-FriendListCtrl.Tpo" -c -o amulegui-FriendListCtrl.obj `if test -f 'FriendListCtrl.cpp'; then $(CYGPATH_W) 'FriendListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/FriendListCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-FriendListCtrl.Tpo" "$(DEPDIR)/amulegui-FriendListCtrl.Po"; else rm -f "$(DEPDIR)/amulegui-FriendListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FriendListCtrl.cpp' object='amulegui-FriendListCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-FriendListCtrl.obj `if test -f 'FriendListCtrl.cpp'; then $(CYGPATH_W) 'FriendListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/FriendListCtrl.cpp'; fi` + +amulegui-ServerListCtrl.o: ServerListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-ServerListCtrl.o -MD -MP -MF "$(DEPDIR)/amulegui-ServerListCtrl.Tpo" -c -o amulegui-ServerListCtrl.o `test -f 'ServerListCtrl.cpp' || echo '$(srcdir)/'`ServerListCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-ServerListCtrl.Tpo" "$(DEPDIR)/amulegui-ServerListCtrl.Po"; else rm -f "$(DEPDIR)/amulegui-ServerListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerListCtrl.cpp' object='amulegui-ServerListCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-ServerListCtrl.o `test -f 'ServerListCtrl.cpp' || echo '$(srcdir)/'`ServerListCtrl.cpp + +amulegui-ServerListCtrl.obj: ServerListCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-ServerListCtrl.obj -MD -MP -MF "$(DEPDIR)/amulegui-ServerListCtrl.Tpo" -c -o amulegui-ServerListCtrl.obj `if test -f 'ServerListCtrl.cpp'; then $(CYGPATH_W) 'ServerListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerListCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-ServerListCtrl.Tpo" "$(DEPDIR)/amulegui-ServerListCtrl.Po"; else rm -f "$(DEPDIR)/amulegui-ServerListCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ServerListCtrl.cpp' object='amulegui-ServerListCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-ServerListCtrl.obj `if test -f 'ServerListCtrl.cpp'; then $(CYGPATH_W) 'ServerListCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/ServerListCtrl.cpp'; fi` + +amulegui-SharedFilesCtrl.o: SharedFilesCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-SharedFilesCtrl.o -MD -MP -MF "$(DEPDIR)/amulegui-SharedFilesCtrl.Tpo" -c -o amulegui-SharedFilesCtrl.o `test -f 'SharedFilesCtrl.cpp' || echo '$(srcdir)/'`SharedFilesCtrl.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-SharedFilesCtrl.Tpo" "$(DEPDIR)/amulegui-SharedFilesCtrl.Po"; else rm -f "$(DEPDIR)/amulegui-SharedFilesCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SharedFilesCtrl.cpp' object='amulegui-SharedFilesCtrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-SharedFilesCtrl.o `test -f 'SharedFilesCtrl.cpp' || echo '$(srcdir)/'`SharedFilesCtrl.cpp + +amulegui-SharedFilesCtrl.obj: SharedFilesCtrl.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-SharedFilesCtrl.obj -MD -MP -MF "$(DEPDIR)/amulegui-SharedFilesCtrl.Tpo" -c -o amulegui-SharedFilesCtrl.obj `if test -f 'SharedFilesCtrl.cpp'; then $(CYGPATH_W) 'SharedFilesCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/SharedFilesCtrl.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-SharedFilesCtrl.Tpo" "$(DEPDIR)/amulegui-SharedFilesCtrl.Po"; else rm -f "$(DEPDIR)/amulegui-SharedFilesCtrl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SharedFilesCtrl.cpp' object='amulegui-SharedFilesCtrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-SharedFilesCtrl.obj `if test -f 'SharedFilesCtrl.cpp'; then $(CYGPATH_W) 'SharedFilesCtrl.cpp'; else $(CYGPATH_W) '$(srcdir)/SharedFilesCtrl.cpp'; fi` + +amulegui-MuleTrayIcon.o: MuleTrayIcon.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-MuleTrayIcon.o -MD -MP -MF "$(DEPDIR)/amulegui-MuleTrayIcon.Tpo" -c -o amulegui-MuleTrayIcon.o `test -f 'MuleTrayIcon.cpp' || echo '$(srcdir)/'`MuleTrayIcon.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-MuleTrayIcon.Tpo" "$(DEPDIR)/amulegui-MuleTrayIcon.Po"; else rm -f "$(DEPDIR)/amulegui-MuleTrayIcon.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleTrayIcon.cpp' object='amulegui-MuleTrayIcon.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-MuleTrayIcon.o `test -f 'MuleTrayIcon.cpp' || echo '$(srcdir)/'`MuleTrayIcon.cpp + +amulegui-MuleTrayIcon.obj: MuleTrayIcon.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-MuleTrayIcon.obj -MD -MP -MF "$(DEPDIR)/amulegui-MuleTrayIcon.Tpo" -c -o amulegui-MuleTrayIcon.obj `if test -f 'MuleTrayIcon.cpp'; then $(CYGPATH_W) 'MuleTrayIcon.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleTrayIcon.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-MuleTrayIcon.Tpo" "$(DEPDIR)/amulegui-MuleTrayIcon.Po"; else rm -f "$(DEPDIR)/amulegui-MuleTrayIcon.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleTrayIcon.cpp' object='amulegui-MuleTrayIcon.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-MuleTrayIcon.obj `if test -f 'MuleTrayIcon.cpp'; then $(CYGPATH_W) 'MuleTrayIcon.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleTrayIcon.cpp'; fi` + +amulegui-TransferWnd.o: TransferWnd.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-TransferWnd.o -MD -MP -MF "$(DEPDIR)/amulegui-TransferWnd.Tpo" -c -o amulegui-TransferWnd.o `test -f 'TransferWnd.cpp' || echo '$(srcdir)/'`TransferWnd.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-TransferWnd.Tpo" "$(DEPDIR)/amulegui-TransferWnd.Po"; else rm -f "$(DEPDIR)/amulegui-TransferWnd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TransferWnd.cpp' object='amulegui-TransferWnd.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-TransferWnd.o `test -f 'TransferWnd.cpp' || echo '$(srcdir)/'`TransferWnd.cpp + +amulegui-TransferWnd.obj: TransferWnd.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-TransferWnd.obj -MD -MP -MF "$(DEPDIR)/amulegui-TransferWnd.Tpo" -c -o amulegui-TransferWnd.obj `if test -f 'TransferWnd.cpp'; then $(CYGPATH_W) 'TransferWnd.cpp'; else $(CYGPATH_W) '$(srcdir)/TransferWnd.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-TransferWnd.Tpo" "$(DEPDIR)/amulegui-TransferWnd.Po"; else rm -f "$(DEPDIR)/amulegui-TransferWnd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TransferWnd.cpp' object='amulegui-TransferWnd.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-TransferWnd.obj `if test -f 'TransferWnd.cpp'; then $(CYGPATH_W) 'TransferWnd.cpp'; else $(CYGPATH_W) '$(srcdir)/TransferWnd.cpp'; fi` + +amulegui-IP2Country.o: IP2Country.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-IP2Country.o -MD -MP -MF "$(DEPDIR)/amulegui-IP2Country.Tpo" -c -o amulegui-IP2Country.o `test -f 'IP2Country.cpp' || echo '$(srcdir)/'`IP2Country.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-IP2Country.Tpo" "$(DEPDIR)/amulegui-IP2Country.Po"; else rm -f "$(DEPDIR)/amulegui-IP2Country.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='IP2Country.cpp' object='amulegui-IP2Country.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-IP2Country.o `test -f 'IP2Country.cpp' || echo '$(srcdir)/'`IP2Country.cpp + +amulegui-IP2Country.obj: IP2Country.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-IP2Country.obj -MD -MP -MF "$(DEPDIR)/amulegui-IP2Country.Tpo" -c -o amulegui-IP2Country.obj `if test -f 'IP2Country.cpp'; then $(CYGPATH_W) 'IP2Country.cpp'; else $(CYGPATH_W) '$(srcdir)/IP2Country.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-IP2Country.Tpo" "$(DEPDIR)/amulegui-IP2Country.Po"; else rm -f "$(DEPDIR)/amulegui-IP2Country.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='IP2Country.cpp' object='amulegui-IP2Country.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-IP2Country.obj `if test -f 'IP2Country.cpp'; then $(CYGPATH_W) 'IP2Country.cpp'; else $(CYGPATH_W) '$(srcdir)/IP2Country.cpp'; fi` + +amulegui-ClientCredits.o: ClientCredits.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-ClientCredits.o -MD -MP -MF "$(DEPDIR)/amulegui-ClientCredits.Tpo" -c -o amulegui-ClientCredits.o `test -f 'ClientCredits.cpp' || echo '$(srcdir)/'`ClientCredits.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-ClientCredits.Tpo" "$(DEPDIR)/amulegui-ClientCredits.Po"; else rm -f "$(DEPDIR)/amulegui-ClientCredits.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientCredits.cpp' object='amulegui-ClientCredits.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-ClientCredits.o `test -f 'ClientCredits.cpp' || echo '$(srcdir)/'`ClientCredits.cpp + +amulegui-ClientCredits.obj: ClientCredits.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-ClientCredits.obj -MD -MP -MF "$(DEPDIR)/amulegui-ClientCredits.Tpo" -c -o amulegui-ClientCredits.obj `if test -f 'ClientCredits.cpp'; then $(CYGPATH_W) 'ClientCredits.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientCredits.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-ClientCredits.Tpo" "$(DEPDIR)/amulegui-ClientCredits.Po"; else rm -f "$(DEPDIR)/amulegui-ClientCredits.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClientCredits.cpp' object='amulegui-ClientCredits.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-ClientCredits.obj `if test -f 'ClientCredits.cpp'; then $(CYGPATH_W) 'ClientCredits.cpp'; else $(CYGPATH_W) '$(srcdir)/ClientCredits.cpp'; fi` + +amulegui-ECSpecialMuleTags.o: ECSpecialMuleTags.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-ECSpecialMuleTags.o -MD -MP -MF "$(DEPDIR)/amulegui-ECSpecialMuleTags.Tpo" -c -o amulegui-ECSpecialMuleTags.o `test -f 'ECSpecialMuleTags.cpp' || echo '$(srcdir)/'`ECSpecialMuleTags.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-ECSpecialMuleTags.Tpo" "$(DEPDIR)/amulegui-ECSpecialMuleTags.Po"; else rm -f "$(DEPDIR)/amulegui-ECSpecialMuleTags.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECSpecialMuleTags.cpp' object='amulegui-ECSpecialMuleTags.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-ECSpecialMuleTags.o `test -f 'ECSpecialMuleTags.cpp' || echo '$(srcdir)/'`ECSpecialMuleTags.cpp + +amulegui-ECSpecialMuleTags.obj: ECSpecialMuleTags.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-ECSpecialMuleTags.obj -MD -MP -MF "$(DEPDIR)/amulegui-ECSpecialMuleTags.Tpo" -c -o amulegui-ECSpecialMuleTags.obj `if test -f 'ECSpecialMuleTags.cpp'; then $(CYGPATH_W) 'ECSpecialMuleTags.cpp'; else $(CYGPATH_W) '$(srcdir)/ECSpecialMuleTags.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-ECSpecialMuleTags.Tpo" "$(DEPDIR)/amulegui-ECSpecialMuleTags.Po"; else rm -f "$(DEPDIR)/amulegui-ECSpecialMuleTags.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECSpecialMuleTags.cpp' object='amulegui-ECSpecialMuleTags.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-ECSpecialMuleTags.obj `if test -f 'ECSpecialMuleTags.cpp'; then $(CYGPATH_W) 'ECSpecialMuleTags.cpp'; else $(CYGPATH_W) '$(srcdir)/ECSpecialMuleTags.cpp'; fi` + +amulegui-KnownFile.o: KnownFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-KnownFile.o -MD -MP -MF "$(DEPDIR)/amulegui-KnownFile.Tpo" -c -o amulegui-KnownFile.o `test -f 'KnownFile.cpp' || echo '$(srcdir)/'`KnownFile.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-KnownFile.Tpo" "$(DEPDIR)/amulegui-KnownFile.Po"; else rm -f "$(DEPDIR)/amulegui-KnownFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='KnownFile.cpp' object='amulegui-KnownFile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-KnownFile.o `test -f 'KnownFile.cpp' || echo '$(srcdir)/'`KnownFile.cpp + +amulegui-KnownFile.obj: KnownFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-KnownFile.obj -MD -MP -MF "$(DEPDIR)/amulegui-KnownFile.Tpo" -c -o amulegui-KnownFile.obj `if test -f 'KnownFile.cpp'; then $(CYGPATH_W) 'KnownFile.cpp'; else $(CYGPATH_W) '$(srcdir)/KnownFile.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-KnownFile.Tpo" "$(DEPDIR)/amulegui-KnownFile.Po"; else rm -f "$(DEPDIR)/amulegui-KnownFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='KnownFile.cpp' object='amulegui-KnownFile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-KnownFile.obj `if test -f 'KnownFile.cpp'; then $(CYGPATH_W) 'KnownFile.cpp'; else $(CYGPATH_W) '$(srcdir)/KnownFile.cpp'; fi` + +amulegui-GetTickCount.o: GetTickCount.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-GetTickCount.o -MD -MP -MF "$(DEPDIR)/amulegui-GetTickCount.Tpo" -c -o amulegui-GetTickCount.o `test -f 'GetTickCount.cpp' || echo '$(srcdir)/'`GetTickCount.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-GetTickCount.Tpo" "$(DEPDIR)/amulegui-GetTickCount.Po"; else rm -f "$(DEPDIR)/amulegui-GetTickCount.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='GetTickCount.cpp' object='amulegui-GetTickCount.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-GetTickCount.o `test -f 'GetTickCount.cpp' || echo '$(srcdir)/'`GetTickCount.cpp + +amulegui-GetTickCount.obj: GetTickCount.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-GetTickCount.obj -MD -MP -MF "$(DEPDIR)/amulegui-GetTickCount.Tpo" -c -o amulegui-GetTickCount.obj `if test -f 'GetTickCount.cpp'; then $(CYGPATH_W) 'GetTickCount.cpp'; else $(CYGPATH_W) '$(srcdir)/GetTickCount.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-GetTickCount.Tpo" "$(DEPDIR)/amulegui-GetTickCount.Po"; else rm -f "$(DEPDIR)/amulegui-GetTickCount.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='GetTickCount.cpp' object='amulegui-GetTickCount.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-GetTickCount.obj `if test -f 'GetTickCount.cpp'; then $(CYGPATH_W) 'GetTickCount.cpp'; else $(CYGPATH_W) '$(srcdir)/GetTickCount.cpp'; fi` + +amulegui-GuiEvents.o: GuiEvents.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-GuiEvents.o -MD -MP -MF "$(DEPDIR)/amulegui-GuiEvents.Tpo" -c -o amulegui-GuiEvents.o `test -f 'GuiEvents.cpp' || echo '$(srcdir)/'`GuiEvents.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-GuiEvents.Tpo" "$(DEPDIR)/amulegui-GuiEvents.Po"; else rm -f "$(DEPDIR)/amulegui-GuiEvents.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='GuiEvents.cpp' object='amulegui-GuiEvents.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-GuiEvents.o `test -f 'GuiEvents.cpp' || echo '$(srcdir)/'`GuiEvents.cpp + +amulegui-GuiEvents.obj: GuiEvents.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-GuiEvents.obj -MD -MP -MF "$(DEPDIR)/amulegui-GuiEvents.Tpo" -c -o amulegui-GuiEvents.obj `if test -f 'GuiEvents.cpp'; then $(CYGPATH_W) 'GuiEvents.cpp'; else $(CYGPATH_W) '$(srcdir)/GuiEvents.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-GuiEvents.Tpo" "$(DEPDIR)/amulegui-GuiEvents.Po"; else rm -f "$(DEPDIR)/amulegui-GuiEvents.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='GuiEvents.cpp' object='amulegui-GuiEvents.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-GuiEvents.obj `if test -f 'GuiEvents.cpp'; then $(CYGPATH_W) 'GuiEvents.cpp'; else $(CYGPATH_W) '$(srcdir)/GuiEvents.cpp'; fi` + +amulegui-Logger.o: Logger.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-Logger.o -MD -MP -MF "$(DEPDIR)/amulegui-Logger.Tpo" -c -o amulegui-Logger.o `test -f 'Logger.cpp' || echo '$(srcdir)/'`Logger.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-Logger.Tpo" "$(DEPDIR)/amulegui-Logger.Po"; else rm -f "$(DEPDIR)/amulegui-Logger.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Logger.cpp' object='amulegui-Logger.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-Logger.o `test -f 'Logger.cpp' || echo '$(srcdir)/'`Logger.cpp + +amulegui-Logger.obj: Logger.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-Logger.obj -MD -MP -MF "$(DEPDIR)/amulegui-Logger.Tpo" -c -o amulegui-Logger.obj `if test -f 'Logger.cpp'; then $(CYGPATH_W) 'Logger.cpp'; else $(CYGPATH_W) '$(srcdir)/Logger.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-Logger.Tpo" "$(DEPDIR)/amulegui-Logger.Po"; else rm -f "$(DEPDIR)/amulegui-Logger.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Logger.cpp' object='amulegui-Logger.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-Logger.obj `if test -f 'Logger.cpp'; then $(CYGPATH_W) 'Logger.cpp'; else $(CYGPATH_W) '$(srcdir)/Logger.cpp'; fi` + +amulegui-PartFile.o: PartFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-PartFile.o -MD -MP -MF "$(DEPDIR)/amulegui-PartFile.Tpo" -c -o amulegui-PartFile.o `test -f 'PartFile.cpp' || echo '$(srcdir)/'`PartFile.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-PartFile.Tpo" "$(DEPDIR)/amulegui-PartFile.Po"; else rm -f "$(DEPDIR)/amulegui-PartFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PartFile.cpp' object='amulegui-PartFile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-PartFile.o `test -f 'PartFile.cpp' || echo '$(srcdir)/'`PartFile.cpp + +amulegui-PartFile.obj: PartFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-PartFile.obj -MD -MP -MF "$(DEPDIR)/amulegui-PartFile.Tpo" -c -o amulegui-PartFile.obj `if test -f 'PartFile.cpp'; then $(CYGPATH_W) 'PartFile.cpp'; else $(CYGPATH_W) '$(srcdir)/PartFile.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-PartFile.Tpo" "$(DEPDIR)/amulegui-PartFile.Po"; else rm -f "$(DEPDIR)/amulegui-PartFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PartFile.cpp' object='amulegui-PartFile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-PartFile.obj `if test -f 'PartFile.cpp'; then $(CYGPATH_W) 'PartFile.cpp'; else $(CYGPATH_W) '$(srcdir)/PartFile.cpp'; fi` + +amulegui-Preferences.o: Preferences.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-Preferences.o -MD -MP -MF "$(DEPDIR)/amulegui-Preferences.Tpo" -c -o amulegui-Preferences.o `test -f 'Preferences.cpp' || echo '$(srcdir)/'`Preferences.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-Preferences.Tpo" "$(DEPDIR)/amulegui-Preferences.Po"; else rm -f "$(DEPDIR)/amulegui-Preferences.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Preferences.cpp' object='amulegui-Preferences.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-Preferences.o `test -f 'Preferences.cpp' || echo '$(srcdir)/'`Preferences.cpp + +amulegui-Preferences.obj: Preferences.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-Preferences.obj -MD -MP -MF "$(DEPDIR)/amulegui-Preferences.Tpo" -c -o amulegui-Preferences.obj `if test -f 'Preferences.cpp'; then $(CYGPATH_W) 'Preferences.cpp'; else $(CYGPATH_W) '$(srcdir)/Preferences.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-Preferences.Tpo" "$(DEPDIR)/amulegui-Preferences.Po"; else rm -f "$(DEPDIR)/amulegui-Preferences.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Preferences.cpp' object='amulegui-Preferences.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-Preferences.obj `if test -f 'Preferences.cpp'; then $(CYGPATH_W) 'Preferences.cpp'; else $(CYGPATH_W) '$(srcdir)/Preferences.cpp'; fi` + +amulegui-Proxy.o: Proxy.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-Proxy.o -MD -MP -MF "$(DEPDIR)/amulegui-Proxy.Tpo" -c -o amulegui-Proxy.o `test -f 'Proxy.cpp' || echo '$(srcdir)/'`Proxy.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-Proxy.Tpo" "$(DEPDIR)/amulegui-Proxy.Po"; else rm -f "$(DEPDIR)/amulegui-Proxy.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Proxy.cpp' object='amulegui-Proxy.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-Proxy.o `test -f 'Proxy.cpp' || echo '$(srcdir)/'`Proxy.cpp + +amulegui-Proxy.obj: Proxy.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-Proxy.obj -MD -MP -MF "$(DEPDIR)/amulegui-Proxy.Tpo" -c -o amulegui-Proxy.obj `if test -f 'Proxy.cpp'; then $(CYGPATH_W) 'Proxy.cpp'; else $(CYGPATH_W) '$(srcdir)/Proxy.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-Proxy.Tpo" "$(DEPDIR)/amulegui-Proxy.Po"; else rm -f "$(DEPDIR)/amulegui-Proxy.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Proxy.cpp' object='amulegui-Proxy.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-Proxy.obj `if test -f 'Proxy.cpp'; then $(CYGPATH_W) 'Proxy.cpp'; else $(CYGPATH_W) '$(srcdir)/Proxy.cpp'; fi` + +amulegui-Server.o: Server.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-Server.o -MD -MP -MF "$(DEPDIR)/amulegui-Server.Tpo" -c -o amulegui-Server.o `test -f 'Server.cpp' || echo '$(srcdir)/'`Server.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-Server.Tpo" "$(DEPDIR)/amulegui-Server.Po"; else rm -f "$(DEPDIR)/amulegui-Server.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Server.cpp' object='amulegui-Server.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-Server.o `test -f 'Server.cpp' || echo '$(srcdir)/'`Server.cpp + +amulegui-Server.obj: Server.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-Server.obj -MD -MP -MF "$(DEPDIR)/amulegui-Server.Tpo" -c -o amulegui-Server.obj `if test -f 'Server.cpp'; then $(CYGPATH_W) 'Server.cpp'; else $(CYGPATH_W) '$(srcdir)/Server.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-Server.Tpo" "$(DEPDIR)/amulegui-Server.Po"; else rm -f "$(DEPDIR)/amulegui-Server.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Server.cpp' object='amulegui-Server.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-Server.obj `if test -f 'Server.cpp'; then $(CYGPATH_W) 'Server.cpp'; else $(CYGPATH_W) '$(srcdir)/Server.cpp'; fi` + +amulegui-Statistics.o: Statistics.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-Statistics.o -MD -MP -MF "$(DEPDIR)/amulegui-Statistics.Tpo" -c -o amulegui-Statistics.o `test -f 'Statistics.cpp' || echo '$(srcdir)/'`Statistics.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-Statistics.Tpo" "$(DEPDIR)/amulegui-Statistics.Po"; else rm -f "$(DEPDIR)/amulegui-Statistics.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Statistics.cpp' object='amulegui-Statistics.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-Statistics.o `test -f 'Statistics.cpp' || echo '$(srcdir)/'`Statistics.cpp + +amulegui-Statistics.obj: Statistics.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-Statistics.obj -MD -MP -MF "$(DEPDIR)/amulegui-Statistics.Tpo" -c -o amulegui-Statistics.obj `if test -f 'Statistics.cpp'; then $(CYGPATH_W) 'Statistics.cpp'; else $(CYGPATH_W) '$(srcdir)/Statistics.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-Statistics.Tpo" "$(DEPDIR)/amulegui-Statistics.Po"; else rm -f "$(DEPDIR)/amulegui-Statistics.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Statistics.cpp' object='amulegui-Statistics.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-Statistics.obj `if test -f 'Statistics.cpp'; then $(CYGPATH_W) 'Statistics.cpp'; else $(CYGPATH_W) '$(srcdir)/Statistics.cpp'; fi` + +amulegui-StatTree.o: StatTree.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-StatTree.o -MD -MP -MF "$(DEPDIR)/amulegui-StatTree.Tpo" -c -o amulegui-StatTree.o `test -f 'StatTree.cpp' || echo '$(srcdir)/'`StatTree.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-StatTree.Tpo" "$(DEPDIR)/amulegui-StatTree.Po"; else rm -f "$(DEPDIR)/amulegui-StatTree.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='StatTree.cpp' object='amulegui-StatTree.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-StatTree.o `test -f 'StatTree.cpp' || echo '$(srcdir)/'`StatTree.cpp + +amulegui-StatTree.obj: StatTree.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-StatTree.obj -MD -MP -MF "$(DEPDIR)/amulegui-StatTree.Tpo" -c -o amulegui-StatTree.obj `if test -f 'StatTree.cpp'; then $(CYGPATH_W) 'StatTree.cpp'; else $(CYGPATH_W) '$(srcdir)/StatTree.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-StatTree.Tpo" "$(DEPDIR)/amulegui-StatTree.Po"; else rm -f "$(DEPDIR)/amulegui-StatTree.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='StatTree.cpp' object='amulegui-StatTree.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-StatTree.obj `if test -f 'StatTree.cpp'; then $(CYGPATH_W) 'StatTree.cpp'; else $(CYGPATH_W) '$(srcdir)/StatTree.cpp'; fi` + +amulegui-SHAHashSet.o: SHAHashSet.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-SHAHashSet.o -MD -MP -MF "$(DEPDIR)/amulegui-SHAHashSet.Tpo" -c -o amulegui-SHAHashSet.o `test -f 'SHAHashSet.cpp' || echo '$(srcdir)/'`SHAHashSet.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-SHAHashSet.Tpo" "$(DEPDIR)/amulegui-SHAHashSet.Po"; else rm -f "$(DEPDIR)/amulegui-SHAHashSet.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SHAHashSet.cpp' object='amulegui-SHAHashSet.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-SHAHashSet.o `test -f 'SHAHashSet.cpp' || echo '$(srcdir)/'`SHAHashSet.cpp + +amulegui-SHAHashSet.obj: SHAHashSet.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-SHAHashSet.obj -MD -MP -MF "$(DEPDIR)/amulegui-SHAHashSet.Tpo" -c -o amulegui-SHAHashSet.obj `if test -f 'SHAHashSet.cpp'; then $(CYGPATH_W) 'SHAHashSet.cpp'; else $(CYGPATH_W) '$(srcdir)/SHAHashSet.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-SHAHashSet.Tpo" "$(DEPDIR)/amulegui-SHAHashSet.Po"; else rm -f "$(DEPDIR)/amulegui-SHAHashSet.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SHAHashSet.cpp' object='amulegui-SHAHashSet.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-SHAHashSet.obj `if test -f 'SHAHashSet.cpp'; then $(CYGPATH_W) 'SHAHashSet.cpp'; else $(CYGPATH_W) '$(srcdir)/SHAHashSet.cpp'; fi` + +amulegui-TerminationProcess.o: TerminationProcess.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-TerminationProcess.o -MD -MP -MF "$(DEPDIR)/amulegui-TerminationProcess.Tpo" -c -o amulegui-TerminationProcess.o `test -f 'TerminationProcess.cpp' || echo '$(srcdir)/'`TerminationProcess.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-TerminationProcess.Tpo" "$(DEPDIR)/amulegui-TerminationProcess.Po"; else rm -f "$(DEPDIR)/amulegui-TerminationProcess.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TerminationProcess.cpp' object='amulegui-TerminationProcess.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-TerminationProcess.o `test -f 'TerminationProcess.cpp' || echo '$(srcdir)/'`TerminationProcess.cpp + +amulegui-TerminationProcess.obj: TerminationProcess.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-TerminationProcess.obj -MD -MP -MF "$(DEPDIR)/amulegui-TerminationProcess.Tpo" -c -o amulegui-TerminationProcess.obj `if test -f 'TerminationProcess.cpp'; then $(CYGPATH_W) 'TerminationProcess.cpp'; else $(CYGPATH_W) '$(srcdir)/TerminationProcess.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-TerminationProcess.Tpo" "$(DEPDIR)/amulegui-TerminationProcess.Po"; else rm -f "$(DEPDIR)/amulegui-TerminationProcess.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TerminationProcess.cpp' object='amulegui-TerminationProcess.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-TerminationProcess.obj `if test -f 'TerminationProcess.cpp'; then $(CYGPATH_W) 'TerminationProcess.cpp'; else $(CYGPATH_W) '$(srcdir)/TerminationProcess.cpp'; fi` + +amulegui-TerminationProcessAmuleweb.o: TerminationProcessAmuleweb.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-TerminationProcessAmuleweb.o -MD -MP -MF "$(DEPDIR)/amulegui-TerminationProcessAmuleweb.Tpo" -c -o amulegui-TerminationProcessAmuleweb.o `test -f 'TerminationProcessAmuleweb.cpp' || echo '$(srcdir)/'`TerminationProcessAmuleweb.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-TerminationProcessAmuleweb.Tpo" "$(DEPDIR)/amulegui-TerminationProcessAmuleweb.Po"; else rm -f "$(DEPDIR)/amulegui-TerminationProcessAmuleweb.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TerminationProcessAmuleweb.cpp' object='amulegui-TerminationProcessAmuleweb.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-TerminationProcessAmuleweb.o `test -f 'TerminationProcessAmuleweb.cpp' || echo '$(srcdir)/'`TerminationProcessAmuleweb.cpp + +amulegui-TerminationProcessAmuleweb.obj: TerminationProcessAmuleweb.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-TerminationProcessAmuleweb.obj -MD -MP -MF "$(DEPDIR)/amulegui-TerminationProcessAmuleweb.Tpo" -c -o amulegui-TerminationProcessAmuleweb.obj `if test -f 'TerminationProcessAmuleweb.cpp'; then $(CYGPATH_W) 'TerminationProcessAmuleweb.cpp'; else $(CYGPATH_W) '$(srcdir)/TerminationProcessAmuleweb.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-TerminationProcessAmuleweb.Tpo" "$(DEPDIR)/amulegui-TerminationProcessAmuleweb.Po"; else rm -f "$(DEPDIR)/amulegui-TerminationProcessAmuleweb.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TerminationProcessAmuleweb.cpp' object='amulegui-TerminationProcessAmuleweb.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-TerminationProcessAmuleweb.obj `if test -f 'TerminationProcessAmuleweb.cpp'; then $(CYGPATH_W) 'TerminationProcessAmuleweb.cpp'; else $(CYGPATH_W) '$(srcdir)/TerminationProcessAmuleweb.cpp'; fi` + +amulegui-UserEvents.o: UserEvents.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-UserEvents.o -MD -MP -MF "$(DEPDIR)/amulegui-UserEvents.Tpo" -c -o amulegui-UserEvents.o `test -f 'UserEvents.cpp' || echo '$(srcdir)/'`UserEvents.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-UserEvents.Tpo" "$(DEPDIR)/amulegui-UserEvents.Po"; else rm -f "$(DEPDIR)/amulegui-UserEvents.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UserEvents.cpp' object='amulegui-UserEvents.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-UserEvents.o `test -f 'UserEvents.cpp' || echo '$(srcdir)/'`UserEvents.cpp + +amulegui-UserEvents.obj: UserEvents.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-UserEvents.obj -MD -MP -MF "$(DEPDIR)/amulegui-UserEvents.Tpo" -c -o amulegui-UserEvents.obj `if test -f 'UserEvents.cpp'; then $(CYGPATH_W) 'UserEvents.cpp'; else $(CYGPATH_W) '$(srcdir)/UserEvents.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-UserEvents.Tpo" "$(DEPDIR)/amulegui-UserEvents.Po"; else rm -f "$(DEPDIR)/amulegui-UserEvents.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UserEvents.cpp' object='amulegui-UserEvents.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-UserEvents.obj `if test -f 'UserEvents.cpp'; then $(CYGPATH_W) 'UserEvents.cpp'; else $(CYGPATH_W) '$(srcdir)/UserEvents.cpp'; fi` + +amulegui-OtherFunctions.o: OtherFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-OtherFunctions.o -MD -MP -MF "$(DEPDIR)/amulegui-OtherFunctions.Tpo" -c -o amulegui-OtherFunctions.o `test -f 'OtherFunctions.cpp' || echo '$(srcdir)/'`OtherFunctions.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-OtherFunctions.Tpo" "$(DEPDIR)/amulegui-OtherFunctions.Po"; else rm -f "$(DEPDIR)/amulegui-OtherFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='OtherFunctions.cpp' object='amulegui-OtherFunctions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-OtherFunctions.o `test -f 'OtherFunctions.cpp' || echo '$(srcdir)/'`OtherFunctions.cpp + +amulegui-OtherFunctions.obj: OtherFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-OtherFunctions.obj -MD -MP -MF "$(DEPDIR)/amulegui-OtherFunctions.Tpo" -c -o amulegui-OtherFunctions.obj `if test -f 'OtherFunctions.cpp'; then $(CYGPATH_W) 'OtherFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/OtherFunctions.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-OtherFunctions.Tpo" "$(DEPDIR)/amulegui-OtherFunctions.Po"; else rm -f "$(DEPDIR)/amulegui-OtherFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='OtherFunctions.cpp' object='amulegui-OtherFunctions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-OtherFunctions.obj `if test -f 'OtherFunctions.cpp'; then $(CYGPATH_W) 'OtherFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/OtherFunctions.cpp'; fi` + +amulegui-NetworkFunctions.o: NetworkFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-NetworkFunctions.o -MD -MP -MF "$(DEPDIR)/amulegui-NetworkFunctions.Tpo" -c -o amulegui-NetworkFunctions.o `test -f 'NetworkFunctions.cpp' || echo '$(srcdir)/'`NetworkFunctions.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-NetworkFunctions.Tpo" "$(DEPDIR)/amulegui-NetworkFunctions.Po"; else rm -f "$(DEPDIR)/amulegui-NetworkFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='NetworkFunctions.cpp' object='amulegui-NetworkFunctions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-NetworkFunctions.o `test -f 'NetworkFunctions.cpp' || echo '$(srcdir)/'`NetworkFunctions.cpp + +amulegui-NetworkFunctions.obj: NetworkFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -MT amulegui-NetworkFunctions.obj -MD -MP -MF "$(DEPDIR)/amulegui-NetworkFunctions.Tpo" -c -o amulegui-NetworkFunctions.obj `if test -f 'NetworkFunctions.cpp'; then $(CYGPATH_W) 'NetworkFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/NetworkFunctions.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amulegui-NetworkFunctions.Tpo" "$(DEPDIR)/amulegui-NetworkFunctions.Po"; else rm -f "$(DEPDIR)/amulegui-NetworkFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='NetworkFunctions.cpp' object='amulegui-NetworkFunctions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amulegui_CXXFLAGS) $(CXXFLAGS) -c -o amulegui-NetworkFunctions.obj `if test -f 'NetworkFunctions.cpp'; then $(CYGPATH_W) 'NetworkFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/NetworkFunctions.cpp'; fi` + +ed2k-ED2KLinkParser.o: ED2KLinkParser.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ed2k_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ed2k-ED2KLinkParser.o -MD -MP -MF "$(DEPDIR)/ed2k-ED2KLinkParser.Tpo" -c -o ed2k-ED2KLinkParser.o `test -f 'ED2KLinkParser.cpp' || echo '$(srcdir)/'`ED2KLinkParser.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/ed2k-ED2KLinkParser.Tpo" "$(DEPDIR)/ed2k-ED2KLinkParser.Po"; else rm -f "$(DEPDIR)/ed2k-ED2KLinkParser.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ED2KLinkParser.cpp' object='ed2k-ED2KLinkParser.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ed2k_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ed2k-ED2KLinkParser.o `test -f 'ED2KLinkParser.cpp' || echo '$(srcdir)/'`ED2KLinkParser.cpp + +ed2k-ED2KLinkParser.obj: ED2KLinkParser.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ed2k_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ed2k-ED2KLinkParser.obj -MD -MP -MF "$(DEPDIR)/ed2k-ED2KLinkParser.Tpo" -c -o ed2k-ED2KLinkParser.obj `if test -f 'ED2KLinkParser.cpp'; then $(CYGPATH_W) 'ED2KLinkParser.cpp'; else $(CYGPATH_W) '$(srcdir)/ED2KLinkParser.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/ed2k-ED2KLinkParser.Tpo" "$(DEPDIR)/ed2k-ED2KLinkParser.Po"; else rm -f "$(DEPDIR)/ed2k-ED2KLinkParser.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ED2KLinkParser.cpp' object='ed2k-ED2KLinkParser.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ed2k_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ed2k-ED2KLinkParser.obj `if test -f 'ED2KLinkParser.cpp'; then $(CYGPATH_W) 'ED2KLinkParser.cpp'; else $(CYGPATH_W) '$(srcdir)/ED2KLinkParser.cpp'; fi` + +ed2k-MagnetURI.o: MagnetURI.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ed2k_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ed2k-MagnetURI.o -MD -MP -MF "$(DEPDIR)/ed2k-MagnetURI.Tpo" -c -o ed2k-MagnetURI.o `test -f 'MagnetURI.cpp' || echo '$(srcdir)/'`MagnetURI.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/ed2k-MagnetURI.Tpo" "$(DEPDIR)/ed2k-MagnetURI.Po"; else rm -f "$(DEPDIR)/ed2k-MagnetURI.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MagnetURI.cpp' object='ed2k-MagnetURI.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ed2k_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ed2k-MagnetURI.o `test -f 'MagnetURI.cpp' || echo '$(srcdir)/'`MagnetURI.cpp + +ed2k-MagnetURI.obj: MagnetURI.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ed2k_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ed2k-MagnetURI.obj -MD -MP -MF "$(DEPDIR)/ed2k-MagnetURI.Tpo" -c -o ed2k-MagnetURI.obj `if test -f 'MagnetURI.cpp'; then $(CYGPATH_W) 'MagnetURI.cpp'; else $(CYGPATH_W) '$(srcdir)/MagnetURI.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/ed2k-MagnetURI.Tpo" "$(DEPDIR)/ed2k-MagnetURI.Po"; else rm -f "$(DEPDIR)/ed2k-MagnetURI.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MagnetURI.cpp' object='ed2k-MagnetURI.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ed2k_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ed2k-MagnetURI.obj `if test -f 'MagnetURI.cpp'; then $(CYGPATH_W) 'MagnetURI.cpp'; else $(CYGPATH_W) '$(srcdir)/MagnetURI.cpp'; fi` + +ed2k-MuleCollection.o: MuleCollection.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ed2k_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ed2k-MuleCollection.o -MD -MP -MF "$(DEPDIR)/ed2k-MuleCollection.Tpo" -c -o ed2k-MuleCollection.o `test -f 'MuleCollection.cpp' || echo '$(srcdir)/'`MuleCollection.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/ed2k-MuleCollection.Tpo" "$(DEPDIR)/ed2k-MuleCollection.Po"; else rm -f "$(DEPDIR)/ed2k-MuleCollection.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleCollection.cpp' object='ed2k-MuleCollection.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ed2k_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ed2k-MuleCollection.o `test -f 'MuleCollection.cpp' || echo '$(srcdir)/'`MuleCollection.cpp + +ed2k-MuleCollection.obj: MuleCollection.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ed2k_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ed2k-MuleCollection.obj -MD -MP -MF "$(DEPDIR)/ed2k-MuleCollection.Tpo" -c -o ed2k-MuleCollection.obj `if test -f 'MuleCollection.cpp'; then $(CYGPATH_W) 'MuleCollection.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleCollection.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/ed2k-MuleCollection.Tpo" "$(DEPDIR)/ed2k-MuleCollection.Po"; else rm -f "$(DEPDIR)/ed2k-MuleCollection.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleCollection.cpp' object='ed2k-MuleCollection.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ed2k_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ed2k-MuleCollection.obj `if test -f 'MuleCollection.cpp'; then $(CYGPATH_W) 'MuleCollection.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleCollection.cpp'; fi` +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(mkdir_p) $(distdir)/../automake $(distdir)/extern/upnp $(distdir)/extern/wxWidgets + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: check-recursive +all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(HEADERS) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-generic clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: install-binPROGRAMS + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-binPROGRAMS clean-generic clean-noinstLIBRARIES \ + clean-recursive ctags ctags-recursive dist-hook distclean \ + distclean-compile distclean-generic distclean-recursive \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-binPROGRAMS install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic maintainer-clean-recursive \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-binPROGRAMS uninstall-info-am + + +$(srcdir)/Parser.cpp: Parser.y + bison --debug -t -d -v -o $@ $(srcdir)/Parser.y + +@GENERATE_FLEX_HEADER_TRUE@$(srcdir)/Scanner.cpp: Scanner.l Parser.cpp +@GENERATE_FLEX_HEADER_TRUE@ $(LEX) --header-file=$(srcdir)/Scanner.h -o $@ $(srcdir)/Scanner.l +@GENERATE_FLEX_HEADER_FALSE@$(srcdir)/Scanner.cpp: Scanner.l Parser.cpp +@GENERATE_FLEX_HEADER_FALSE@ $(LEX) -o$@ $(srcdir)/Scanner.l; \ +@GENERATE_FLEX_HEADER_FALSE@ echo "// Empty file generated by a flex version unable to create headers" > $(srcdir)/Scanner.h + +@NEED_RC_TRUE@.rc.$(OBJEXT): +@NEED_RC_TRUE@ $(RC) $(RCFLAGS) -I$(top_srcdir) -D__WIN95__ -D__WIN32__ -D__GNUWIN32__ -O COFF -i "$<" -o "$@" + +@NEED_RC_TRUE@amulerc.$(OBJEXT): $(srcdir)/../amule.rc amule-version.rc +@NEED_RC_TRUE@ cat $^ | \ +@NEED_RC_TRUE@ ( \ +@NEED_RC_TRUE@ abs_builddir=`pwd` ; \ +@NEED_RC_TRUE@ abs_top_srcdir=`cd $(top_srcdir) ; pwd` ; \ +@NEED_RC_TRUE@ cd $( "$@" + +@NEED_RC_TRUE@amuled-version.rc: $(top_builddir)/version.rc +@NEED_RC_TRUE@ @sed -e 's/VER_FILEDESCRIPTION_STR/"aMule Daemon"/' \ +@NEED_RC_TRUE@ -e 's/VER_INTERNALNAME_STR/"amuled"/' \ +@NEED_RC_TRUE@ -e 's/VER_ORIGINALFILENAME_STR/"amuled$(EXEEXT)"/' "$<" > "$@" + +@NEED_RC_TRUE@amulecmd-version.rc: $(top_builddir)/version.rc +@NEED_RC_TRUE@ @sed -e 's/VER_FILEDESCRIPTION_STR/"aMule Text Client"/' \ +@NEED_RC_TRUE@ -e 's/VER_INTERNALNAME_STR/"amulecmd"/' \ +@NEED_RC_TRUE@ -e 's/VER_ORIGINALFILENAME_STR/"amulecmd$(EXEEXT)"/' "$<" > "$@" + +@NEED_RC_TRUE@amulegui-version.rc: $(top_builddir)/version.rc +@NEED_RC_TRUE@ @sed -e 's/VER_FILEDESCRIPTION_STR/"aMule Remote GUI (Experimental)"/' \ +@NEED_RC_TRUE@ -e 's/VER_INTERNALNAME_STR/"amulegui"/' \ +@NEED_RC_TRUE@ -e 's/VER_ORIGINALFILENAME_STR/"amulegui$(EXEEXT)"/' "$<" > "$@" + +@NEED_RC_TRUE@ed2k-version.rc: $(top_builddir)/version.rc +@NEED_RC_TRUE@ @sed -e 's/VER_FILEDESCRIPTION_STR/"ED2K Links Handler"/' \ +@NEED_RC_TRUE@ -e 's/VER_INTERNALNAME_STR/"ed2k"/' \ +@NEED_RC_TRUE@ -e 's/VER_ORIGINALFILENAME_STR/"ed2k$(EXEEXT)"/' "$<" > "$@" +dist-hook: + for d in $(EXTRA__DIST__SUBDIRS) ; do \ + mkdir $(distdir)/$$d ; \ + for f in `find $(srcdir)/$$d -name '.svn' -prune -o -printf "%P\n"` ; do \ + if test -d $(srcdir)/$$d/$$f ; then \ + mkdir $(distdir)/$$d/$$f ; \ + else \ + cp -p $(srcdir)/$$d/$$f $(distdir)/$$d/$$f ; \ + fi ; \ + done ; \ + done +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/MemFile.cpp b/src/MemFile.cpp new file mode 100644 index 00000000..5135632f --- /dev/null +++ b/src/MemFile.cpp @@ -0,0 +1,185 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "MemFile.h" // Interface declarations + + +CMemFile::CMemFile(unsigned int growthRate) +{ + m_buffer = NULL; + m_BufferSize = 0; + m_fileSize = 0; + m_growthRate = growthRate; + m_position = 0; + m_delete = true; + m_readonly = false; +} + + +CMemFile::CMemFile(byte* buffer, size_t bufferSize) +{ + MULE_VALIDATE_PARAMS(buffer, wxT("CMemFile: Attempted to attach invalid buffer.")); + + m_buffer = buffer; + m_BufferSize = bufferSize; + m_fileSize = bufferSize; + m_growthRate = 0; + m_position = 0; + m_delete = false; + m_readonly = false; +} + +CMemFile::CMemFile(const byte* buffer, size_t bufferSize) +{ + MULE_VALIDATE_PARAMS(buffer, wxT("CMemFile: Attempted to attach invalid buffer.")); + + m_buffer = const_cast(buffer); + m_BufferSize = bufferSize; + m_fileSize = bufferSize; + m_growthRate = 0; + m_position = 0; + m_delete = false; + m_readonly = true; +} + +CMemFile::~CMemFile() +{ + if (m_delete) { + free(m_buffer); + } +} + + +uint64 CMemFile::GetPosition() const +{ + return m_position; +} + + +void CMemFile::SetLength(size_t newLen) +{ + MULE_VALIDATE_STATE(!m_readonly, wxT("CMemFile: Attempted to change lenght on a read-only buffer.")); + + if (newLen > m_BufferSize) { + enlargeBuffer(newLen); + } + + if (newLen < m_position) { + m_position = newLen; + } + + m_fileSize = newLen; +} + + +uint64 CMemFile::GetLength() const +{ + return m_fileSize; +} + + +void CMemFile::enlargeBuffer(size_t size) +{ + MULE_VALIDATE_PARAMS(size >= m_BufferSize, wxT("CMemFile: Attempted to shrink buffer.")); + MULE_VALIDATE_STATE(m_delete, wxT("CMemFile: Attempted to grow an attached buffer.")); + MULE_VALIDATE_STATE(!m_readonly, wxT("CMemFile: Attempted to grow a read-only buffer.")); + + size_t newsize = m_BufferSize; + + if (m_growthRate) { + newsize = ((size + m_growthRate - 1) / m_growthRate) * m_growthRate; + } else { + // No growth-rate specified. Change to exactly the size specified. + newsize = size; + } + + m_buffer = (byte*)realloc(m_buffer, newsize); + m_BufferSize = newsize; + + MULE_VALIDATE_STATE(m_buffer, wxT("CMemFile: Failed to (re)allocate buffer")); +} + + +sint64 CMemFile::doRead(void* buffer, size_t count) const +{ + MULE_VALIDATE_PARAMS(buffer, wxT("CMemFile: Attempting to read to invalid buffer")); + + // Handle reads past EOF + if (m_position > m_fileSize) { + return 0; + } else if (m_position + count > m_fileSize) { + count = m_fileSize - m_position; + } + + if (count) { + memcpy(buffer, m_buffer + m_position, count); + m_position += count; + } + + return count; +} + + +sint64 CMemFile::doWrite(const void* buffer, size_t count) +{ + MULE_VALIDATE_PARAMS(buffer, wxT("CMemFile: Attempting to write to invalid buffer")); + MULE_VALIDATE_STATE(!m_readonly, wxT("CMemFile: Attempted to write to a read-only buffer.")); + + // Needs more space? + if (m_position + count > m_BufferSize) { + enlargeBuffer(m_position + count); + } + + MULE_VALIDATE_STATE(m_position + count <= m_BufferSize, wxT("CMemFile: Buffer not resized to needed size.")); + + memcpy(m_buffer + m_position, buffer, count); + m_position += count; + + if (m_position > m_fileSize) { + m_fileSize = m_position; + } + + return count; +} + + +sint64 CMemFile::doSeek(sint64 offset) const +{ + MULE_VALIDATE_PARAMS(offset >= 0, wxT("CMemFile: Invalid seek, position, must be positive.")); + + return m_position = offset; +} + + +void CMemFile::ResetData() +{ + wxCHECK_RET(!m_readonly, wxT("Trying to reset read-only buffer")); + + memset(m_buffer, 0, m_BufferSize); + m_fileSize = 0; + m_position = 0; +} + +// File_checked_for_headers diff --git a/src/MemFile.h b/src/MemFile.h new file mode 100644 index 00000000..71308bb8 --- /dev/null +++ b/src/MemFile.h @@ -0,0 +1,174 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef MEMFILE_H +#define MEMFILE_H + +#include "SafeFile.h" // Needed for CFileDataIO + + +/** + * CMemFile handles virtual files stored in memory. + * + * This class allows for manipulation of binary data in memory such + * as data sent over networks. Using this class rather than writing + * the stream onto a struct confers the following advantages: + * - Contents may be read dynamically in case of various versions + * of the same packet. + * - Endian correction is handled transparently. When reading and + * writing values, CMemFile converts to and from little-endian, + * so that no explicit endian convertions are nescesarry. + * - Strings of dynamic length can be read. + * + * Most of these advantages also hold for writing packets. + * + * @see CFileDataIO + */ +class CMemFile : public CFileDataIO +{ +public: + /** + * Creates a dynamic file object. + * + * @param growthRate The growth-rate of the buffer. + * + * The growth-rate specified by how much the buffer-size will + * be increased when the memfile runs out of space. Normally + * this means that the amount of re-allocations is cut down + * at the expence of slightly higher mem-usage. + * + * If the size of the entire file to be written is known + * in advance, one can avoid needless re-allocations by + * specifying the exact length as the growth-rate. + * + * If the growth-rate is set to zero, the memfile will allocate + * exactly the needed amount of memory and no more when resizing. + */ + CMemFile(unsigned int growthRate = 1024); + + /** + * Creates a mem-file attached to an already existing buffer. + * + * @param buffer A pre-existing buffer. + * @param bufferSize The size of the buffer. + * + * A buffer attached to a memfile is assumed to already contain + * data and therefore the file-size is set to match the size of + * of the buffer. + * + * Note that while it is valid to resize the buffer to a length + * between zero and 'bufferSize', it is not valid to resize it + * to a length greater than the length specified in the + * constructor. This also holds for writes that would increase + * the length. + * + * The buffer is _not_ freed by CMemFile upon destruction. + * + * If the buffer is a const byte*, the memfile is read-only. + */ + CMemFile(byte* buffer, size_t bufferSize); + CMemFile(const byte* buffer, size_t bufferSize); + + /** Destructor. */ + virtual ~CMemFile(); + + + /** @see CFileDataIO::GetPosition */ + virtual uint64 GetPosition() const; + + /** @see CFileDataIO::GetLength */ + virtual uint64 GetLength() const; + + + /** + * Changes the length of the file, possibly resizing the buffer. + * + * @param newLen The new length of the file. + * + * If the current position is greater than the new length, it + * will be set to the end of the file. + * + * Note that changing the lenght of a file with an attached buffer + * to a value greater than the actual buffer size is an illegal + * operation. + */ + virtual void SetLength(size_t newLen); + + /** + * Resets the memfile to the start. + */ + virtual void Reset() const { doSeek(0); } + + /** + * Returns the bytes available to read before EOF + */ + virtual sint64 GetAvailable() const { return GetLength() - GetPosition(); } + + /** + * Resets the memfile to the starting values. + */ + virtual void ResetData(); + + // Sometimes it's useful to get the buffer and do stuff with it. + byte* GetRawBuffer() const { return m_buffer; } + +protected: + /** @see CFileDataIO::doRead */ + virtual sint64 doRead(void* buffer, size_t count) const; + + /** @see CFileDataIO::doWrite */ + virtual sint64 doWrite(const void* buffer, size_t count); + + /** @see CFileDataIO::doSeek */ + virtual sint64 doSeek(sint64 offset) const; + +private: + //! A CMemFile is neither copyable nor assignable. + //@{ + CMemFile(const CMemFile&); + CMemFile& operator=(const CMemFile&); + //@} + + /** Enlarges the buffer to at least 'size' length. */ + void enlargeBuffer(size_t size); + + //! The growth-rate for the buffer. + unsigned int m_growthRate; + //! The current position in the file. + mutable size_t m_position; + //! The actual size of the buffer. + size_t m_BufferSize; + //! The size of the virtual file, may be less than the buffer-size. + size_t m_fileSize; + //! If true, the buffer will be freed upon termination. + bool m_delete; + //! read-only mark. + bool m_readonly; + //! The actual buffer. + byte* m_buffer; +}; + +#endif // MEMFILE_H +// File_checked_for_headers diff --git a/src/MuleCollection.cpp b/src/MuleCollection.cpp new file mode 100644 index 00000000..f5d0c226 --- /dev/null +++ b/src/MuleCollection.cpp @@ -0,0 +1,446 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2007-2008 Johannes Krampf +// +// Other code by: +// +// Angel Vidal Veiga aka Kry +// * changed class names +// +// Marcelo Malheiros +// * fixed error with FT_FILEHASH +// * added inital 5 tag/file support +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "MuleCollection.h" + + +#include +#include +#include +#include +#include + + +CollectionFile::CollectionFile( + const std::string &fileName, + uint64_t fileSize, + const std::string &fileHash) +: +m_fileName(fileName), +m_fileSize(fileSize), +m_fileHash(fileHash) +{ +} + + +CMuleCollection::CMuleCollection() +: +vCollection(0) +{ +} + + +CMuleCollection::~CMuleCollection() +{ +} + + +bool CMuleCollection::Open(const std::string &File) +{ + return OpenBinary(File) || OpenText(File); +} + + +std::string CMuleCollection::GetEd2kLink(size_t index) const +{ + if (index >= GetFileCount()) { + return "Invalid Index!"; + } + + std::stringstream retvalue; + // ed2k://|file|fileName|fileSize|fileHash|/ + retvalue + << "ed2k://|file|" << GetFileName(index) + << "|" << GetFileSize(index) + << "|" << GetFileHash(index) + << "|/"; + + return retvalue.str(); +} + + +std::string CMuleCollection::GetFileName(size_t index) const +{ + if (index >= GetFileCount()) { + return "Invalid Index!"; + } + + std::string retvalue = vCollection[index].m_fileName; + if (retvalue.empty()) { + return "Empty String!"; + } + + return retvalue; +} + + +uint64_t CMuleCollection::GetFileSize(size_t index) const +{ + if (index >= GetFileCount()) { + return 0; + } + + return vCollection[index].m_fileSize; +} + + +std::string CMuleCollection::GetFileHash(size_t index) const +{ + if (index >= GetFileCount()) { + return "Invalid Index!"; + } + std::string retvalue = vCollection[index].m_fileHash; + if (retvalue.empty()) { + return "Empty String!"; + } + + return retvalue; +} + +template +intType CMuleCollection::ReadInt(std::ifstream& infile) +{ + intType integer = 0; + infile.read(reinterpret_cast(&integer),sizeof(intType)); + return integer; +} + +std::string CMuleCollection::ReadString(std::ifstream& infile, int TagType = 0x02) +{ + if (TagType >= 0x11 && TagType <= 0x20) { + std::vector buffer(TagType - 0x10); + infile.read(&buffer[0], TagType - 0x10); + return buffer.empty() ? + std::string() : + std::string (buffer.begin(), buffer.end()); + } + if (TagType == 0x02) { + uint16_t TagStringSize = ReadInt(infile); + std::vector buffer (TagStringSize); + infile.read(&buffer[0], TagStringSize); + return buffer.empty() ? + std::string() : + std::string (buffer.begin(), buffer.end()); + } + return std::string(); +} + +bool CMuleCollection::OpenBinary(const std::string &File) +{ + std::ifstream infile; + + infile.open(File.c_str(), std::ifstream::in|std::ifstream::binary); + if(!infile.is_open()) { + return false; + } + + uint32_t cVersion = ReadInt(infile); + + if (!infile.good() || + ( cVersion != 0x01 && cVersion != 0x02)) { + infile.close(); + return false; + } + + uint32_t hTagCount = ReadInt(infile); + if (!infile.good() || + hTagCount > 3) { + infile.close(); + return false; + } + + for (size_t hTi = 0; hTi < hTagCount;hTi++) { + int hTagType = infile.get(); + + // hTagFormat == 1 -> FT-value is given + uint16_t hTagFormat = ReadInt(infile); + if (hTagFormat != 0x0001) { + infile.close(); + return false; + } + + int hTag = infile.get(); + if (!infile.good()) { + infile.close(); + return false; + } + switch (hTag) { + // FT_FILENAME + case 0x01: { + std::string fileName = ReadString(infile, hTagType); + break; + } + // FT_COLLECTIONAUTHOR + case 0x31: { + std::string CollectionAuthor = ReadString(infile, hTagType); + break; + } + // FT_COLLECTIONAUTHORKEY + case 0x32: { + uint32_t hTagBlobSize = ReadInt(infile); + if (!infile.good()) { + infile.close(); + return false; + } + std::vector CollectionAuthorKey(hTagBlobSize); + infile.read(&CollectionAuthorKey[0], hTagBlobSize); + break; + } + // UNDEFINED TAG + default: + if (!infile.good()) { + infile.close(); + return false; + } + break; + } + } + + uint32_t cFileCount = ReadInt(infile); + + /* + softlimit is set to 1024 to avoid problems with big uint32_t values + I don't believe anyone would want to use an emulecollection file + to store more than 1024 files, but just raise below value in case + you know someone who does. + */ + + if(!infile.good() || + cFileCount > 1024) { + infile.close(); + return false; + } + + for (size_t cFi = 0; cFi < cFileCount; ++cFi) { + uint32_t fTagCount = ReadInt(infile); + + if (!infile.good() || + fTagCount > 5) { + infile.close(); + return false; + } + + std::string fileHash = std::string(32, '0'); + uint64_t fileSize; + std::string fileName; + std::string FileComment; + for(size_t fTi = 0; fTi < fTagCount; ++fTi) { + int fTagType = infile.get(); + if (!infile.good()) { + infile.close(); + return false; + } + + int fTag = infile.get(); + if (!infile.good()) { + infile.close(); + return false; + } + + switch (fTag) { + // FT_FILEHASH + case 0x28: { + std::vector bFileHash(16); + infile.read(&bFileHash[0], 16); + std::string hex = "0123456789abcdef"; + for (int pos = 0; pos < 16; pos++) { + fileHash[pos*2] = hex[((bFileHash[pos] >> 4) & 0xF)]; + fileHash[(pos*2) + 1] = hex[(bFileHash[pos]) & 0x0F]; + } + break; + } + // FT_FILESIZE + case 0x02: { + switch(fTagType) { + case 0x83: { + fileSize = ReadInt(infile); + break; + } + case 0x88: { + fileSize = ReadInt(infile); + break; + } + case 0x89: { + fileSize = infile.get(); + break; + } + case 0x8b: { + fileSize = ReadInt(infile); + break; + } + default: // Invalid file structure + infile.close(); + return false; + break; + } + break; + } + // FT_FILENAME + case 0x01: { + fileName = ReadString(infile, fTagType^0x80); + break; + } + // FT_FILECOMMENT + case 0xF6: { + FileComment = ReadString(infile, fTagType^0x80); + break; + } + // FT_FILERATING + case 0xF7: { + if (fTagType == 0x89) { // TAGTYPE_UINT8 + // uint8_t FileRating = + infile.get(); + + } else { + infile.close(); + return false; + } + break; + } + // UNDEFINED TAG + default: + infile.close(); + return false; + break; + } + if( !infile.good() ) { + infile.close(); + return false; + } + } + AddFile(fileName, fileSize, fileHash); + } + infile.close(); + + return true; +} + + +bool CMuleCollection::OpenText(const std::string &File) +{ + int numLinks = 0; + std::string line; + std::ifstream infile; + + infile.open(File.c_str(), std::ifstream::in); + if (!infile.is_open()) { + return false; + } + + while (getline(infile, line)) { + if(AddLink(line)) { + numLinks++; + } + } + infile.close(); + + if(numLinks == 0) { + return false; + } + + return true; +} + + +bool CMuleCollection::AddLink(const std::string &Link) +{ + // 12345678901234 56 7 + 32 + 89 = 19+32=51 + // ed2k://|file|fileName|fileSize|fileHash|/ + if (Link.size() < 51 || + Link.substr(0,13) != "ed2k://|file|" || + Link.substr(Link.size()-2) != "|/") { + return false; + } + + size_t iName = Link.find("|",13); + if (iName == std::string::npos) { + return false; + } + std::string fileName = Link.substr(13,iName-13); + + size_t iSize = Link.find("|",iName+1); + if (iSize == std::string::npos) { + return false; + } + std::stringstream sFileSize; + sFileSize << Link.substr(iName+1,iSize-iName-1); + uint64_t fileSize; + if ((sFileSize >> std::dec >> fileSize).fail()) { + return false; + } + + size_t iHash = Link.find("|",iSize+1); + if (iHash == std::string::npos) { + return false; + } + std::string fileHash = Link.substr(iSize+1,32); + + return AddFile(fileName, fileSize, fileHash); +} + + +bool CMuleCollection::AddFile( + const std::string &fileName, + uint64_t fileSize, + const std::string &fileHash) +{ + if (fileName == "" || + fileSize == 0 || + fileSize > 0xffffffffLL || + !IsValidHash(fileHash)) { + return false; + } + + vCollection.push_back( + CollectionFile(fileName, fileSize, fileHash)); + return true; +} + + +bool CMuleCollection::IsValidHash(const std::string &fileHash) +{ + if (fileHash.size() != 32 || fileHash == "") { + return false; + } + + // fileHash needs to be a valid MD4Hash + std::string hex = "0123456789abcdefABCDEF"; + for(size_t i = 0; i < fileHash.size(); ++i) { + if (hex.find(fileHash[i]) == std::string::npos) { + return false; + } + } + return true; +} + diff --git a/src/MuleCollection.h b/src/MuleCollection.h new file mode 100644 index 00000000..f3ec56d1 --- /dev/null +++ b/src/MuleCollection.h @@ -0,0 +1,85 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2007-2008 Johannes Krampf +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#ifndef __MULECOLLECTION_H__ +#define __MULECOLLECTION_H__ + +#include +#include + +#ifndef __MINGW32__ +#include "Types.h" +#endif + +struct CollectionFile +{ + std::string m_fileName; + uint64_t m_fileSize; + std::string m_fileHash; + + CollectionFile( + const std::string &fileName = "", + uint64_t fileSize = 0, + const std::string &fileHash = ""); +}; + + +class CMuleCollection +{ +private: + std::vector vCollection; + +public: + CMuleCollection(); + ~CMuleCollection(); + + bool Open(const std::string &File); + size_t GetFileCount() const { return vCollection.size(); } + + std::string GetEd2kLink(size_t index) const; + std::string GetFileName(size_t index) const; + uint64_t GetFileSize(size_t index) const; + std::string GetFileHash(size_t index) const; + +private: + bool OpenBinary(const std::string &File); + bool OpenText(const std::string &File); + + bool AddLink(const std::string &Link); + bool AddFile( + const std::string &fileName, + uint64_t fileSize, + const std::string &fileHash); + + static bool IsValidHash(const std::string &fileHash); + + template + intType ReadInt(std::ifstream& infile); + + std::string ReadString(std::ifstream& infile, int TagType); +}; + +#endif // __MULECOLLECTION_H__ + diff --git a/src/MuleGifCtrl.cpp b/src/MuleGifCtrl.cpp new file mode 100644 index 00000000..81d39c52 --- /dev/null +++ b/src/MuleGifCtrl.cpp @@ -0,0 +1,173 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include +#include +#include + + +#include "MuleGifCtrl.h" +#include "Types.h" + + +BEGIN_EVENT_TABLE(MuleGifCtrl, wxControl) + EVT_TIMER(GIFTIMERID, MuleGifCtrl::OnTimer) + EVT_PAINT(MuleGifCtrl::OnPaint) + EVT_ERASE_BACKGROUND(MuleGifCtrl::OnErase) +END_EVENT_TABLE() + +class MuleGIFDecoder : public wxGIFDecoder +{ +public: + MuleGIFDecoder() + { + m_nframe = 0; + } + + ~MuleGIFDecoder() { } + + void GoFirstFrame() { m_nframe = 0; } + void GoNextFrame() { m_nframe < GetFrameCount() - 1 ? m_nframe++ : m_nframe = 0; } + void GoLastFrame() { m_nframe = GetFrameCount() - 1; } + + void ConvertToImage(wxImage* image) { wxGIFDecoder::ConvertToImage(m_nframe, image); } + + long GetDelay() { return wxGIFDecoder::GetDelay(m_nframe); } + +private: + uint32_t m_nframe; +}; + +MuleGifCtrl::MuleGifCtrl( + wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) +: +wxControl(parent, id, pos, size, style, validator, name), +m_decoder(NULL), +m_timer(this, GIFTIMERID) +{ +} + + +MuleGifCtrl::~MuleGifCtrl() +{ + m_timer.Stop(); + if (m_decoder) { + delete m_decoder; + m_decoder = NULL; + } +} + + +bool MuleGifCtrl::LoadData(const char* data, int size) +{ + if (m_decoder) { + m_timer.Stop(); + delete m_decoder; + m_decoder = NULL; + } + + wxMemoryInputStream stream(data, size); + m_decoder = new MuleGIFDecoder(); + if ( m_decoder->LoadGIF(stream) != wxGIF_OK ) { + delete m_decoder; + m_decoder = NULL; + return false; + } + + m_decoder->GoFirstFrame(); + wxImage frame; + m_decoder->ConvertToImage( &frame ); + m_frame = wxBitmap(frame); + + return true; +} + + +void MuleGifCtrl::Start() +{ + if (m_decoder && m_decoder->IsAnimation()) { + m_timer.Stop(); + m_decoder->GoLastFrame(); + + wxTimerEvent evt; + OnTimer(evt); + } +} + + +void MuleGifCtrl::Stop() +{ + m_timer.Stop(); +} + + +wxSize MuleGifCtrl::GetBestSize() +{ + return m_decoder->GetAnimationSize(); +} + + +void MuleGifCtrl::OnTimer(wxTimerEvent& WXUNUSED(event)) +{ + if (m_decoder) { + if (m_decoder->IsAnimation()) { + m_decoder->GoNextFrame(); + } + + wxImage frame; + m_decoder->ConvertToImage(&frame); + m_frame = wxBitmap(frame); + + Refresh(); + + if (m_decoder->IsAnimation()) { + m_timer.Start(m_decoder->GetDelay(), true); + } + } +} + + +void MuleGifCtrl::OnPaint(wxPaintEvent& WXUNUSED(event)) +{ + wxBufferedPaintDC dc(this); + + wxSize clientsize = GetClientSize(); + wxSize gifsize = m_decoder->GetAnimationSize(); + int x = (clientsize.GetWidth()-gifsize.GetWidth())/2; + int y = (clientsize.GetHeight()-gifsize.GetHeight())/2; + + dc.SetBackground(wxBrush(GetBackgroundColour(), wxSOLID)); + dc.Clear(); + dc.DrawBitmap(m_frame, x, y, true); +} + + +// File_checked_for_headers diff --git a/src/MuleGifCtrl.h b/src/MuleGifCtrl.h new file mode 100644 index 00000000..f316f46f --- /dev/null +++ b/src/MuleGifCtrl.h @@ -0,0 +1,142 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#ifndef MULEGIFCTRL_H +#define MULEGIFCTRL_H + + +#include +#include + + +const int GIFTIMERID = 271283; + + +class MuleGIFDecoder; +class wxBitmap; + + +/** + * MuleGifCtrl is a simple widget for displaying a gif animation. + * It is based on the animation classes by Julian Smart and + * Guillermo Rodriguez Garcia, but is specialized for the reduced + * requirements of the aMule project. It provides flicker-free + * redrawing using wxBufferedPaintDC. + * + * To reduce complexity, several things have been hardcoded, though + * they can easily be changed: + * - The animation will continue to loop until Stop() is called. + * - The gif image is assumed to be transparent. + * - Start will start the animation from the first frame and wont + * continue a stopped animation. + */ +class MuleGifCtrl : public wxControl +{ +private: + //! A pointer to the current gif-animation. + MuleGIFDecoder *m_decoder; + //! Timer used for the delay between each frame. + wxTimer m_timer; + //! Current frame. + wxBitmap m_frame; + +public: + /** + * Contructor. See wxWindow class documentation for more information. + */ + MuleGifCtrl( + wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxControlNameStr); + + /** + * Destructor + */ + virtual ~MuleGifCtrl(); + + /** + * This loads the gif image from a char-array with a specific size. + * + * @param data The array containing the image. + * @param size The size of the array. + * @return Returns true if the data was loaded, false otherwise. + * + * This sets the current animation and displays the first frame. If another + * animation was loaded, it will be unloaded and the animation stopped. + * + * To convert a image to a format readable by this function, you can + * use the utility hexdump. Look at inetdownload.h for how to format + * the output. + */ + bool LoadData(const char* data, int size); + + /** + * This function starts playing the animation provided that a animation is + * set and it's not a static image. + */ + void Start(); + + /** + * Stops the animation. + */ + void Stop(); + + /** + * Returns the prefered size of the widget. + * + * @return Prefered size, which is the size of the animation. + */ + virtual wxSize GetBestSize(); + +private: + /** + * Timer function that selects the next frame in an animation. + */ + void OnTimer( wxTimerEvent& event ); + + /** + * Function for drawing the animation. + * + * This functions draws the current frame, which is changed in OnTimer(), + * using a wxBufferedPaintDC. By doing so and also catching the + * ERASE_BACKGROUND events we avoid flickering on redraws. + */ + void OnPaint( wxPaintEvent& event ); + + /** + * This function is used to avoid flicker when redrawing. + */ + void OnErase( wxEraseEvent& WXUNUSED(event) ) {} + + //! Enables the event functions OnErase(), OnTimer() and OnPaint(). + DECLARE_EVENT_TABLE() +}; + +#endif + +// File_checked_for_headers diff --git a/src/MuleListCtrl.cpp b/src/MuleListCtrl.cpp new file mode 100644 index 00000000..a4783270 --- /dev/null +++ b/src/MuleListCtrl.cpp @@ -0,0 +1,641 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include // Needed for wxMenu +#include // Needed for wxConfig +#include // Needed for wxStringTokenizer +#include // Needed for wxImageList + +#include // Needed for MULE_VALIDATE_ +#include // Needed for StrToLong + +#include + +#include "MuleListCtrl.h" // Interface declarations +#include "GetTickCount.h" // Needed for GetTickCount() +#include "OtherFunctions.h" + + +// For arrow-pixmaps +#include "pixmaps/sort_dn.xpm" +#include "pixmaps/sort_up.xpm" +#include "pixmaps/sort_dnx2.xpm" +#include "pixmaps/sort_upx2.xpm" + + +// Global constants +#ifdef __WXGTK__ + const int COL_SIZE_MIN = 10; +#elif defined(__WXMSW__) || defined(__WXMAC__) || defined(__WXCOCOA__) + const int COL_SIZE_MIN = 0; +#else + #error Need to define COL_SIZE_MIN for your OS +#endif + + +BEGIN_EVENT_TABLE(CMuleListCtrl, MuleExtern::wxGenericListCtrl) + EVT_LIST_COL_CLICK( -1, CMuleListCtrl::OnColumnLClick) + EVT_LIST_COL_RIGHT_CLICK( -1, CMuleListCtrl::OnColumnRClick) + EVT_LIST_ITEM_SELECTED(-1, CMuleListCtrl::OnItemSelected) + EVT_LIST_DELETE_ITEM(-1, CMuleListCtrl::OnItemDeleted) + EVT_LIST_DELETE_ALL_ITEMS(-1, CMuleListCtrl::OnAllItemsDeleted) + EVT_CHAR( CMuleListCtrl::OnChar) + EVT_MENU_RANGE(MP_LISTCOL_1, MP_LISTCOL_15, CMuleListCtrl::OnMenuSelected) + EVT_MOUSEWHEEL(CMuleListCtrl::OnMouseWheel) +END_EVENT_TABLE() + + +//! Shared list of arrow-pixmaps +static wxImageList imgList(16, 16, true, 0); + + +CMuleListCtrl::CMuleListCtrl(wxWindow *parent, wxWindowID winid, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name) + : MuleExtern::wxGenericListCtrl(parent, winid, pos, size, style, validator, name) +{ + m_sort_func = NULL; + m_tts_time = 0; + m_tts_item = -1; + + if (imgList.GetImageCount() == 0) { + imgList.Add(wxBitmap(sort_dn_xpm)); + imgList.Add(wxBitmap(sort_up_xpm)); + imgList.Add(wxBitmap(sort_dnx2_xpm)); + imgList.Add(wxBitmap(sort_upx2_xpm)); + } + + // Default sort-order is to sort by the first column (asc). + m_sort_orders.push_back(CColPair(0, 0)); + + SetImageList(&imgList, wxIMAGE_LIST_SMALL); +} + + +CMuleListCtrl::~CMuleListCtrl() +{ + if (!m_name.IsEmpty()) { + SaveSettings(); + } +} + + +void CMuleListCtrl::SaveSettings() +{ + wxCHECK_RET(!m_name.IsEmpty(), wxT("Cannot save settings for unnamed list")); + + wxConfigBase* cfg = wxConfigBase::Get(); + + // Save sorting, column and order + wxString sortOrder; + for (CSortingList::iterator it = m_sort_orders.begin(); it != m_sort_orders.end(); ++it) { + sortOrder += wxString::Format(wxT("%u %u, "), it->first, it->second); + } + + cfg->Write(wxT("/eMule/TableOrdering") + m_name, sortOrder); + + // Save column widths. ATM this is also used to signify hidden columns. + wxString buffer; + for ( int i = 0; i < GetColumnCount(); ++i ) { + if ( i ) buffer << wxT(","); + + buffer << GetColumnWidth(i); + } + + cfg->Write( wxT("/eMule/TableWidths") +m_name, buffer ); +} + + +void CMuleListCtrl::LoadSettings() +{ + wxCHECK_RET(!m_name.IsEmpty(), wxT("Cannot load settings for unnamed list")); + + wxConfigBase* cfg = wxConfigBase::Get(); + + // Load sort order (including sort-column) + m_sort_orders.clear(); + wxString setting = cfg->Read(wxT("/eMule/TableOrdering") + m_name, wxEmptyString); + + // Prevent sorting from occuring when calling SetSorting + MuleListCtrlCompare sortFunc = m_sort_func; + m_sort_func = NULL; + + wxStringTokenizer tokens(setting, wxT(",")); + while (tokens.HasMoreTokens()) { + wxString token = tokens.GetNextToken(); + + unsigned long column = 0, order = 0; + + if (token.BeforeFirst(wxT(' ')).Strip(wxString::both).ToULong(&column)) { + if (token.AfterFirst(wxT(' ')).Strip(wxString::both).ToULong(&order)) { + // Sanity checking, to avoid asserting if column count changes. + if (column < (unsigned)GetColumnCount()) { + // Sanity checking, to avoid asserting if data-format changes. + if ((order & ~SORTING_MASK) == 0) { + // SetSorting will take care of duplicate entries + SetSorting(column, order); + } + } + } + } + } + + // Must have at least one sort-order specified + if (m_sort_orders.empty()) { + m_sort_orders.push_back(CColPair(0, 0)); + } + + // Re-enable sorting and resort the contents (if any). + m_sort_func = sortFunc; + SortList(); + + // Set the column widths + wxString buffer; + if (cfg->Read( wxT("/eMule/TableWidths") + m_name, &buffer, wxEmptyString)) { + int counter = 0; + + wxStringTokenizer tokenizer( buffer, wxT(",") ); + while (tokenizer.HasMoreTokens() && (counter < GetColumnCount())) { + SetColumnWidth(counter++, StrToLong( tokenizer.GetNextToken())); + } + } +} + + +long CMuleListCtrl::GetInsertPos(wxUIntPtr data) +{ + // Find the best place to position the item through a binary search + int Min = 0; + int Max = GetItemCount(); + + // Only do this if there are any items and a sorter function + if (Max && m_sort_func) { + // This search will narrow down the best place to position the new + // item. The result will be the item after that position, which is + // the format expected by the insertion function. + do { + int cur_pos = ( Max - Min ) / 2 + Min; + int cmp = CompareItems(data, GetItemData(cur_pos)); + + // Value is lesser than the one at the current pos + if ( cmp < 0 ) { + Max = cur_pos; + } else { + Min = cur_pos + 1; + } + } while ((Min != Max)); + } + + return Max; +} + + + +int CMuleListCtrl::CompareItems(wxUIntPtr item1, wxUIntPtr item2) +{ + CSortingList::const_iterator it = m_sort_orders.begin(); + for (; it != m_sort_orders.end(); ++it) { + int result = m_sort_func(item1, item2, it->first | it->second); + if (result != 0) { + return result; + } + } + + // Ensure that different items are never considered equal. + return CmpAny(item1, item2); +} + + +MuleListCtrlCompare g_sort_func = NULL; +CMuleListCtrl* g_sort_list = NULL; + + +int CMuleListCtrl::SortProc(wxUIntPtr item1, wxUIntPtr item2, long) +{ + const CSortingList& orders = g_sort_list->m_sort_orders; + + CSortingList::const_iterator it = orders.begin(); + for (; it != orders.end(); ++it) { + int result = g_sort_func(item1, item2, it->first | it->second); + if (result != 0) { + return result; + } + } + + // Ensure that different items are never considered equal. + return CmpAny(item1, item2); +} + + +void CMuleListCtrl::SortList() +{ + wxCHECK_RET(g_sort_func == NULL, wxT("Sort-function already set")); + wxCHECK_RET(g_sort_list == NULL, wxT("Sort-list already set")); + + if (m_sort_func && GetColumnCount()) { + // Positions are likely to be invalid after sorting. + ResetTTS(); + + g_sort_func = m_sort_func; + g_sort_list = this; + + SortItems(SortProc, 0); + + g_sort_func = NULL; + g_sort_list = NULL; + } +} + + +CMuleListCtrl::ItemDataList CMuleListCtrl::GetSelectedItems() const +{ + // Create the initial vector with as many items as are selected + ItemDataList list( GetSelectedItemCount() ); + + // Current item being located + unsigned int current = 0; + + long pos = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + while ( pos != -1 ) { + wxASSERT( current < list.size() ); + + list[ current++ ] = GetItemData( pos ); + + pos = GetNextItem( pos, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + } + + return list; +} + + +void CMuleListCtrl::OnColumnRClick(wxListEvent& evt) +{ + wxMenu menu; + wxListItem item; + + for ( int i = 0; i < GetColumnCount() && i < 15; ++i) { + GetColumn(i, item); + + menu.AppendCheckItem(i + MP_LISTCOL_1, item.GetText() ); + menu.Check( i + MP_LISTCOL_1, GetColumnWidth(i) > COL_SIZE_MIN ); + } + + PopupMenu(&menu, evt.GetPoint()); +} + + +void CMuleListCtrl::OnMenuSelected( wxCommandEvent& evt ) +{ + int col = evt.GetId() - MP_LISTCOL_1; + + if (GetColumnWidth(col) > COL_SIZE_MIN) { + SetColumnWidth(col, 0); + } else { + SetColumnWidth(col, wxLIST_AUTOSIZE); + } +} + + +void CMuleListCtrl::OnColumnLClick(wxListEvent& evt) +{ + // Stop if no sorter-function has been defined + if (!m_sort_func) { + return; + } else if (evt.GetColumn() == -1) { + // This happens if a user clicks past the last column header. + return; + } + + // Get the currently focused item + long pos = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_FOCUSED ); + wxUIntPtr item = 0; + if (pos != -1) { + item = GetItemData(pos); + } + + + unsigned sort_order = 0; + if (m_sort_orders.front().first == (unsigned)evt.GetColumn()) { + // Same column as before, flip the sort-order + sort_order = m_sort_orders.front().second; + + if (sort_order & SORT_DES) { + if (AltSortAllowed(evt.GetColumn())) { + sort_order = (~sort_order) & SORT_ALT; + } else { + sort_order = 0; + } + } else { + sort_order = SORT_DES | (sort_order & SORT_ALT); + } + + m_sort_orders.pop_front(); + } else { + // Check if the column has already been set + CSortingList::iterator it = m_sort_orders.begin(); + for (; it != m_sort_orders.end(); ++it) { + if ((unsigned)evt.GetColumn() == it->first) { + sort_order = it->second; + break; + } + } + } + + SetSorting(evt.GetColumn(), sort_order); + + + // Set focus on item if any was focused + if (item != 0) { + long it_pos = FindItem(-1, item); + if (it_pos != -1) { + SetItemState(it_pos,wxLIST_STATE_FOCUSED, wxLIST_STATE_FOCUSED | wxLIST_STATE_SELECTED); + } + } +} + + +void CMuleListCtrl::ClearSelection() +{ + if (GetSelectedItemCount()) { + long index = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + while (index != -1) { + SetItemState(index, 0, wxLIST_STATE_SELECTED); + index = GetNextItem(index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + } + } +} + + +void CMuleListCtrl::SetTableName(const wxString& name) +{ + m_name = name; +} + + +unsigned CMuleListCtrl::GetSortColumn() const +{ + return m_sort_orders.front().first; +} + + +unsigned CMuleListCtrl::GetSortOrder() const +{ + return m_sort_orders.front().second; +} + + +void CMuleListCtrl::SetSortFunc(MuleListCtrlCompare func) +{ + m_sort_func = func; +} + + +bool CMuleListCtrl::AltSortAllowed(unsigned WXUNUSED(column)) const +{ + return false; +} + + +void CMuleListCtrl::SetSorting(unsigned column, unsigned order) +{ + MULE_VALIDATE_PARAMS(column < (unsigned)GetColumnCount(), wxT("Invalid column to sort by.")); + MULE_VALIDATE_PARAMS(!(order & ~SORTING_MASK), wxT("Sorting order contains invalid data.")); + + if (!m_sort_orders.empty()) { + SetColumnImage(m_sort_orders.front().first, -1); + + CSortingList::iterator it = m_sort_orders.begin(); + for (; it != m_sort_orders.end(); ++it) { + if (it->first == column) { + m_sort_orders.erase(it); + break; + } + } + } + + m_sort_orders.push_front(CColPair(column, order)); + + if (order & SORT_DES) { + SetColumnImage(column, (order & SORT_ALT) ? 2 : 0); + } else { + SetColumnImage(column, (order & SORT_ALT) ? 3 : 1); + } + + SortList(); +} + + +bool CMuleListCtrl::IsItemSorted(long item) +{ + wxCHECK_MSG(m_sort_func, true, wxT("No sort function specified!")); + wxCHECK_MSG((item >= 0) && (item < GetItemCount()), true, wxT("Invalid item")); + + bool sorted = true; + wxUIntPtr data = GetItemData(item); + + // Check that the item before the current item is smaller (or equal) + if (item > 0) { + sorted &= (CompareItems(GetItemData(item - 1), data) <= 0); + } + + // Check that the item after the current item is greater (or equal) + if (sorted && (item < GetItemCount() - 1)) { + sorted &= (CompareItems(GetItemData(item + 1), data) >= 0); + } + + return sorted; +} + + +void CMuleListCtrl::OnMouseWheel(wxMouseEvent &event) +{ + // This enables scrolling with the mouse wheel + event.Skip(); +} + + +void CMuleListCtrl::SetColumnImage(unsigned col, int image) +{ + wxListItem item; + item.SetMask(wxLIST_MASK_IMAGE); + item.SetImage(image); + SetColumn(col, item); +} + + +long CMuleListCtrl::CheckSelection(wxMouseEvent& event) +{ + int flags = 0; + wxListEvent evt; + evt.m_itemIndex = HitTest(event.GetPosition(), flags); + + return CheckSelection(evt); +} + + +long CMuleListCtrl::CheckSelection(wxListEvent& event) +{ + long item = event.GetIndex(); + + // Check if clicked item is selected. If not, unselect all and select it. + if ((item != -1) && !GetItemState(item, wxLIST_STATE_SELECTED)) { + ClearSelection(); + + SetItemState(item, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED); + } + + return item; +} + + +wxString CMuleListCtrl::GetTTSText(unsigned item) const +{ + MULE_VALIDATE_PARAMS(item < (unsigned)GetItemCount(), wxT("Invalid row.")); + MULE_VALIDATE_STATE((GetWindowStyle() & wxLC_OWNERDRAW) == 0, + wxT("GetTTSText must be overwritten for owner-drawn lists.")); + + return GetItemText(item); +} + + +void CMuleListCtrl::OnChar(wxKeyEvent& evt) +{ + wxChar key = evt.GetKeyCode(); + if (key == 0) { + // We prefer GetKeyCode() to GetUnicodeKey(), in order to work + // around a bug in the GetUnicodeKey(), that causes values to + // be returned untranslated. This means for instance, that if + // shift and '1' is pressed, the result is '1' rather than '!' + // (as it should be on my keyboard). This has been reported: + // http://sourceforge.net/tracker/index.php?func=detail&aid=1864810&group_id=9863&atid=109863 + key = evt.GetUnicodeKey(); + } else if (key >= WXK_START) { + // wxKeycodes are ignored, as they signify events such as the 'home' + // button. Unicoded chars are not checke as there is an overlap valid + // chars and the wx keycodes. + evt.Skip(); + return; + } + + // We wish to avoid handling shortcuts, with the exception of 'select-all'. + if (evt.AltDown() || evt.ControlDown() || evt.MetaDown()) { + if (evt.CmdDown() && (evt.GetKeyCode() == 0x01)) { + // Ctrl+a (Command+a on Mac) was pressed, select all items + for (int i = 0; i < GetItemCount(); ++i) { + SetItemState(i, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED); + } + } + + evt.Skip(); + return; + } else if (m_tts_time + 1500u < GetTickCount()) { + m_tts_text.Clear(); + } + + m_tts_time = GetTickCount(); + m_tts_text.Append(wxTolower(key)); + + // May happen if the subclass does not forward deletion events. + if (m_tts_item >= GetItemCount()) { + wxASSERT(0); + m_tts_item = -1; + } + + unsigned next = (m_tts_item == -1) ? 0 : m_tts_item; + for (unsigned i = 0, count = GetItemCount(); i < count; ++i) { + wxString text = GetTTSText((next + i) % count).MakeLower(); + + if (text.StartsWith(m_tts_text)) { + ClearSelection(); + + m_tts_item = (next + i) % count; + SetItemState(m_tts_item, wxLIST_STATE_FOCUSED | wxLIST_STATE_SELECTED, + wxLIST_STATE_FOCUSED | wxLIST_STATE_SELECTED); + EnsureVisible(m_tts_item); + + return; + } + } + + if (m_tts_item != -1) { + // Crop the string so that it matches the old item (avoid typos). + wxString text = GetTTSText(m_tts_item).MakeLower(); + + // If the last key didn't result in a hit, then we skip the event. + if (!text.StartsWith(m_tts_text)) { + if ((m_tts_text.Length() == 2) && (m_tts_text[0] == m_tts_text[1])) { + // Special case, single-char, repeated. This allows toggeling + // between items starting with a specific letter. + m_tts_text.Clear(); + // Increment, so the next will be selected (or wrap around). + m_tts_item++; + OnChar(evt); + } else { + m_tts_text.RemoveLast(); + evt.Skip(true); + } + } + } else { + evt.Skip(true); + } +} + + +void CMuleListCtrl::OnItemSelected(wxListEvent& evt) +{ + // We reset the current TTS session if the user manually changes the selection + if (m_tts_item != evt.GetIndex()) { + ResetTTS(); + + // The item is changed so that the next TTS starts from the selected item. + m_tts_item = evt.GetIndex(); + } + + evt.Skip(); +} + + +void CMuleListCtrl::OnItemDeleted(wxListEvent& evt) +{ + if (evt.GetIndex() <= m_tts_item) { + m_tts_item--; + } + + evt.Skip(); +} + + +void CMuleListCtrl::OnAllItemsDeleted(wxListEvent& evt) +{ + ResetTTS(); + + evt.Skip(); +} + + +void CMuleListCtrl::ResetTTS() +{ + m_tts_item = -1; + m_tts_time = 0; +} +// File_checked_for_headers diff --git a/src/MuleListCtrl.h b/src/MuleListCtrl.h new file mode 100644 index 00000000..31fad8ec --- /dev/null +++ b/src/MuleListCtrl.h @@ -0,0 +1,339 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef MULELISTCTRL_H +#define MULELISTCTRL_H + +#ifdef WIN32 +#include +#endif + +#include // Do_not_auto_remove (Mac, Win32, and just good practice) +#include "extern/wxWidgets/listctrl.h" + +#include +#include + + +/** + * Enhanced wxListCtrl provided custom-drawing among other things. + * + * This class provides these features which the original wxListCtrl lacks: + * - Automatic sort arrows upon clicks on the column headers + * - Custom drawing of items. + * - Hiding of columns through auto-generated popup-menu. + * - Helper function for inserting items pre-sorted. + * - Loading and saving of column properties. + * - Selection of items by typing an initial part of the text (TTS). + */ +class CMuleListCtrl : public MuleExtern::wxGenericListCtrl +{ +public: + /** + * The various ways in which a column can be sorted. + * + * If SORT_DES is not set, sorting is taken to be + * ascending. If SORT_ALT is not set, sorting is + * taken to be normal. + */ + enum MLOrder + { + //! If set, sorting is to be in descending order. + SORT_DES = 0x1000, + + //! If sorting should use alternate method. + //! Is specified in with or without DEC. + SORT_ALT = 0x2000 + }; + + //! Mask which covers the column part of the sort-data. + static const unsigned COLUMN_MASK = 0xfff; + + //! Mask which covers the sorting part of the sort-data. + static const unsigned SORTING_MASK = 0x3000; + + /** + * Constructor. + * + * @see wxGenericListCtrl::wxGenericListCtrl for documentation of parameters. + */ + CMuleListCtrl( + wxWindow *parent, + wxWindowID winid = -1, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxLC_ICON, + const wxValidator& validator = wxDefaultValidator, + const wxString &name = wxT("mulelistctrl") ); + + /** + * Destructor. + * + * If a name for the table has been specified with SetTableName, then + * column settings will be saved automatically. + */ + virtual ~CMuleListCtrl(); + + + /** + * Saves column settings. + * + * Currently saves the width of all columns, hidden columns, the column + * to sort by and in which direction to sort. + */ + virtual void SaveSettings(); + + /** + * Loads column settings. + * + * Currently loads the width of all columns, hidden columns, the column + * to sort by and in which direction to sort. This function also ensures + * that the items are sorted after the settings have been read. + */ + virtual void LoadSettings(); + + + /** + * This function tries to locate the best place to insert an item. + * + * @param The userdata of the new item. + * + * This function does a binary type search to locate the best place to + * insert the new item with the specified userdata. It then returns the + * item after this position. To do this, the sorter-function must be set + * though the SetSortFunc function, otherwise it will just return the + * position after the last item. + */ + long GetInsertPos( wxUIntPtr data ); + + + /** + * Sorts the list. + * + * Before you can use this function, you will need to specify a sorter + * function using SetSortFunc. wxListCtrl needs such a function to + * perform the sort. + */ + virtual void SortList(); + + + //! The type of the list of item specific data + typedef std::vector ItemDataList; + + /** + * Returns a list the user-data of all selected items. + * + * @return A list of data assosiated with the selected items. + * + * This function will return the user-data for each selected item in a + * vector, which can then be manipulated with regards to changes made + * in the current order of the listctrl items. + */ + ItemDataList GetSelectedItems() const; + + + /** + * Sets the sorter function. + * + * @param func + * + * See the documentation on wxListCtrl::SortItems for more information + * about the expected function type. + */ + void SetSortFunc(MuleListCtrlCompare func); + + + /** + * Deselects all selected items, but does not change focus. + */ + void ClearSelection(); + +protected: + + /** + * Must be overwritten to enable alternate sorting. + * + * @param The column being sorted. + * + * Subclasses of CMuleListCtrl can allow alternative sorting + * of columns. This is done by overriding this function and + * returning true for the columns where alternative sorting + * is desired. + */ + virtual bool AltSortAllowed(unsigned column) const; + + /** + * Returns the string used when selecting rows via Type-To-Select. + * + * @param item The index of the item being examined. + * + * By default, this function simply returns the text in the first + * column for the given item. However, when owner-drawing is + * enabled, this function _must_ be overriden. + */ + virtual wxString GetTTSText(unsigned item) const; + + + /** + * Sets the internally used table-name. + * + * @param name The new name or an empty string to disable. + * + * You need to call this function with a unique name before you can + * make use of the LoadSettings/SaveSettings functions. CMuleListCtrl + * uses the name specified in this command to create unique keynames. + */ + void SetTableName(const wxString& name); + + /** + * Returns the column which is currently used to sort the list. + */ + unsigned GetSortColumn() const; + + /** + * Returns the current sorting order, a combination of the DES and ALT flags. + */ + unsigned GetSortOrder() const; + + /** + * Set the sort column + * + * @param column The column with which the list should be sorted. + * @param order The order in which to sort the column. + * + * Note that attempting to sort a column in an unsupported order + * is an illegal operation. + */ + void SetSorting(unsigned column, unsigned order); + + /** + * Returns true if the item is sorted compared to its neighbohrs. + */ + bool IsItemSorted(long item); + + + + /** + * Check and fix selection state. + * + * @param event The event which triggered the selection. + * @return The index of the item selected or -1 if none. + * + * This function checks if the clicked item is selected. + * If not, then the item is selected and all other items + * are deselected. + */ + //@{ + long CheckSelection(wxListEvent& event); + long CheckSelection(wxMouseEvent& event); + //@} + + + /** + * Event handler for right-clicks on the column headers. + */ + void OnColumnRClick(wxListEvent& evt); + /** + * Event handler for left-clicks on the column headers. + */ + void OnColumnLClick(wxListEvent& evt); + /** + * Event handler for the hide/show menu items. + */ + void OnMenuSelected(wxCommandEvent& evt); + /** + * Event handler for the mouse wheel. + */ + void OnMouseWheel(wxMouseEvent &event); + /** + * Event handler for key-presses, needed by TTS. + */ + void OnChar(wxKeyEvent& evt); + /** + * Event handler for item selection/deletion, needed by TTS. + */ + void OnItemSelected(wxListEvent& evt); + void OnItemDeleted(wxListEvent& evt); + void OnAllItemsDeleted(wxListEvent& evt); + + +private: + /** + * Resets the current TTS session. + */ + void ResetTTS(); + + /** + * Sets the image of a specific column. + * + * @param col The column to change. + * @param order The sorting order to represent. Zero unsets the image. + */ + void SetColumnImage(unsigned col, int image); + + + //! The name of the table. Used to load/save settings. + wxString m_name; + //! The sorter function needed by wxListCtrl. + MuleListCtrlCompare m_sort_func; + + //! Contains the current search string. + wxString m_tts_text; + //! Timestamp for the last TTS event. + unsigned m_tts_time; + //! The index of the last item selected via TTS. + int m_tts_item; + + + /** + * Wrapper around the user-provided sorter function. + * + * This function ensures that items are sorted in the order + * specified by clicking on column-headers, and also enforces + * that different entries are never considered equal. This is + * required for lists that make use of child-items, since + * otherwise, parents may not end up properly located in + * relation to child-items. + */ + static int wxCALLBACK SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData); + + /** Compares two items in the list, using the current sort sequence. */ + int CompareItems(wxUIntPtr item1, wxUIntPtr item2); + + + //! This pair contains a column number and its sorting order. + typedef std::pair CColPair; + typedef std::list CSortingList; + + //! This list contains in order the columns sequence to sort by. + CSortingList m_sort_orders; + + + DECLARE_EVENT_TABLE() +}; + + +#endif // MULELISTCTRL_H +// File_checked_for_headers diff --git a/src/MuleNotebook.cpp b/src/MuleNotebook.cpp new file mode 100644 index 00000000..a6729f7b --- /dev/null +++ b/src/MuleNotebook.cpp @@ -0,0 +1,240 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal Veiga (kry@users.sourceforge.net) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include +#include + +#include "MuleNotebook.h" // Interface declarations + +#include + +DEFINE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_MULENOTEBOOK_PAGE_CLOSING) +DEFINE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_MULENOTEBOOK_ALL_PAGES_CLOSED) + +BEGIN_EVENT_TABLE(CMuleNotebook, wxNotebook) + EVT_RIGHT_DOWN(CMuleNotebook::OnRMButton) + + EVT_MENU(MP_CLOSE_TAB, CMuleNotebook::OnPopupClose) + EVT_MENU(MP_CLOSE_ALL_TABS, CMuleNotebook::OnPopupCloseAll) + EVT_MENU(MP_CLOSE_OTHER_TABS, CMuleNotebook::OnPopupCloseOthers) + + // Madcat - tab closing engine + EVT_LEFT_DOWN(CMuleNotebook::MouseClick) + EVT_LEFT_DCLICK(CMuleNotebook::MouseClick) + EVT_MOTION(CMuleNotebook::MouseMotion) +END_EVENT_TABLE() + +CMuleNotebook::CMuleNotebook( wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) + : wxNotebook(parent, id, pos, size, style, name) +{ + m_popup_enable = true; + m_popup_widget = NULL; +} + + +CMuleNotebook::~CMuleNotebook() +{ + // Ensure that all notifications gets sent + DeleteAllPages(); +} + + +bool CMuleNotebook::DeletePage(int nPage) +{ + wxCHECK_MSG((nPage >= 0) && (nPage < (int)GetPageCount()), false, + wxT("Trying to delete invalid page-index in CMuleNotebook::DeletePage")); + + // Send out close event + wxNotebookEvent evt( wxEVT_COMMAND_MULENOTEBOOK_PAGE_CLOSING, GetId(), nPage ); + evt.SetEventObject(this); + ProcessEvent( evt ); + + // and finally remove the actual page + bool result = wxNotebook::DeletePage( nPage ); + + // Ensure a valid selection + if ( GetPageCount() && (int)GetSelection() >= (int)GetPageCount() ) { + SetSelection( GetPageCount() - 1 ); + } + + // Send an event when no pages are left open + if ( !GetPageCount() ) { + wxNotebookEvent event( wxEVT_COMMAND_MULENOTEBOOK_ALL_PAGES_CLOSED, GetId() ); + event.SetEventObject(this); + ProcessEvent( event ); + } + + return result; +} + + +bool CMuleNotebook::DeleteAllPages() +{ + Freeze(); + + bool result = true; + while ( GetPageCount() ) { + result &= DeletePage( 0 ); + } + + Thaw(); + + return result; +} + + +void CMuleNotebook::EnablePopup( bool enable ) +{ + m_popup_enable = enable; +} + + +void CMuleNotebook::SetPopupHandler( wxWindow* widget ) +{ + m_popup_widget = widget; +} + + +//#warning wxMac does not support selection by right-clicking on tabs! +void CMuleNotebook::OnRMButton(wxMouseEvent& event) +{ + // Cases where we shouldn't be showing a popup-menu. + if ( !GetPageCount() || !m_popup_enable ) { + event.Skip(); + return; + } + + +// For some reason, gtk1 does a rather poor job when using the HitTest + wxPoint eventPoint = event.GetPosition(); + + int tab = HitTest(eventPoint); + if (tab != wxNOT_FOUND) { + SetSelection(tab); + } else { + event.Skip(); + return; + } + + // Should we send the event to a specific widget? + if ( m_popup_widget ) { + wxMouseEvent evt = event; + + // Map the coordinates onto the parent + wxPoint point = evt.GetPosition(); + point = ClientToScreen( point ); + point = m_popup_widget->ScreenToClient( point ); + + evt.m_x = point.x; + evt.m_y = point.y; + + m_popup_widget->AddPendingEvent( evt ); + } else { + wxMenu menu(_("Close")); + menu.Append(MP_CLOSE_TAB, wxString(_("Close tab"))); + menu.Append(MP_CLOSE_ALL_TABS, wxString(_("Close all tabs"))); + menu.Append(MP_CLOSE_OTHER_TABS, wxString(_("Close other tabs"))); + + PopupMenu( &menu, event.GetPosition() ); + } +} + + +void CMuleNotebook::OnPopupClose(wxCommandEvent& WXUNUSED(evt)) +{ + DeletePage( GetSelection() ); +} + + +void CMuleNotebook::OnPopupCloseAll(wxCommandEvent& WXUNUSED(evt)) +{ + DeleteAllPages(); +} + + +void CMuleNotebook::OnPopupCloseOthers(wxCommandEvent& WXUNUSED(evt)) +{ + wxNotebookPage* current = GetPage( GetSelection() ); + + for ( int i = GetPageCount() - 1; i >= 0; i-- ) { + if ( current != GetPage( i ) ) + DeletePage( i ); + } +} + + +void CMuleNotebook::MouseClick(wxMouseEvent &event) +{ + + if (GetImageList() == NULL) { + // This Mulenotebook has no images on tabs, so nothing to do. + event.Skip(); + return; + } + + long xpos, ypos; + event.GetPosition(&xpos, &ypos); + + long flags = 0; + int tab = HitTest(wxPoint(xpos,ypos),&flags); + + if ((tab != -1) && (flags == wxNB_HITTEST_ONICON)) { + // User did click on a 'x' + DeletePage(tab); + } else { + // Is not a 'x'. Send this event up. + event.Skip(); + } + +} + +void CMuleNotebook::MouseMotion(wxMouseEvent &event) +{ + + if (GetImageList() == NULL) { + // This Mulenotebook has no images on tabs, so nothing to do. + event.Skip(); + return; + } + + long flags = 0; + int tab = HitTest(wxPoint(event.m_x,event.m_y),&flags); + + // Clear the highlight for all tabs. + for (int i=0;i<(int)GetPageCount();++i) { + SetPageImage(i, 0); + } + + if ((tab != -1) && (flags == wxNB_HITTEST_ONICON)) { + // Mouse is over a 'x' + SetPageImage(tab, 1); + } else { + // Is not a 'x'. Send this event up. + event.Skip(); + } + +} + +// File_checked_for_headers diff --git a/src/MuleNotebook.h b/src/MuleNotebook.h new file mode 100644 index 00000000..b4e47035 --- /dev/null +++ b/src/MuleNotebook.h @@ -0,0 +1,144 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal Veiga ( kry@users.sourceforge.net ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef MULENOTEBOOK_H +#define MULENOTEBOOK_H + +#include + + +DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_MULENOTEBOOK_PAGE_CLOSING, -1) +DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_MULENOTEBOOK_ALL_PAGES_CLOSED, -1) + +#define EVT_MULENOTEBOOK_PAGE_CLOSING(id, fn) \ + DECLARE_EVENT_TABLE_ENTRY( \ + wxEVT_COMMAND_MULENOTEBOOK_PAGE_CLOSING, \ + id, \ + -1, \ + (wxObjectEventFunction)(wxEventFunction)(wxNotebookEventFunction) &fn, \ + NULL \ + ), +#define EVT_MULENOTEBOOK_ALL_PAGES_CLOSED(id, fn) \ + DECLARE_EVENT_TABLE_ENTRY( \ + wxEVT_COMMAND_MULENOTEBOOK_ALL_PAGES_CLOSED, \ + id, \ + -1, \ + (wxObjectEventFunction)(wxEventFunction)(wxNotebookEventFunction) &fn, \ + NULL \ + ), + + +class wxWindow; + + +/** + * This is an NoteBook control which adds additional features above what is + * provided by the wxNoteBook widget. Currently it includes: + * - Use of images on the tabs for closing the pages. + * - A popup-menu for closing one or more pages. + * - Events triggered when pages are closed. + */ +class CMuleNotebook : public wxNotebook +{ +public: + /** + * Constructor. + * + * @see wxNotebook::wxNotebook + */ + CMuleNotebook( wxWindow *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, const wxString& name = wxT("notebook") ); + + /** + * Destructor. + */ + virtual ~CMuleNotebook(); + + /** + * Deletes the page and triggers an event. + * + * @param nPage The page to be removed. + */ + virtual bool DeletePage(int nPage); + + /** + * Deletes and triggers and event for every page. + */ + virtual bool DeleteAllPages(); + + + /** + * Enables or disables the displaying of a popup-menu. + * + * @param enabled The new setting. + */ + void EnablePopup( bool enable ); + + /** + * Sets an external widget to handle the popup-event. + * + * @param widget The widget which would recieve the event or NULL to disable. + * + * Setting the handler to a non-NULL pointer means that upon right-clicks, a + * right click event will be sent to that widget, so that it can create a + * popup-menu. The coordinates will be fixed to fit onto the specified widget, + * so no mapping is needed. + */ + void SetPopupHandler( wxWindow* widget ); + +protected: + void MouseClick(wxMouseEvent &event); // Mouse clicks event handler + void MouseMotion(wxMouseEvent &event); // Mouse moving around + + /** + * Event-handler for right-clicks that takes care of displaying the popup-menu. + */ + void OnRMButton(wxMouseEvent& event); + + /** + * Event-handler fo the Close item on the popup-menu. + */ + void OnPopupClose(wxCommandEvent& evt); + + /** + * Event-handler fo the CloseAll item on the popup-menu. + */ + void OnPopupCloseAll(wxCommandEvent& evt); + + /** + * Event-handler fo the CloseOthers item on the popup-menu. + */ + void OnPopupCloseOthers(wxCommandEvent& evt); + + //! Keeps track of the popup-menu being enabled or not. + bool m_popup_enable; + + //! The pointer to the widget which would recieve right-click events or NULL. + wxWindow* m_popup_widget; + + DECLARE_EVENT_TABLE() +}; + +#endif +// File_checked_for_headers diff --git a/src/MuleTextCtrl.cpp b/src/MuleTextCtrl.cpp new file mode 100644 index 00000000..1aab85c4 --- /dev/null +++ b/src/MuleTextCtrl.cpp @@ -0,0 +1,151 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "MuleTextCtrl.h" +#include +#include +#include +#include + +/** + * These are the IDs used to identify the different menu-items. + * + * Please note that I make use of predefined wxIDs for the first two, but not + * for Paste. This is because wxMenu poses some restrictions on what can be + * done with items using those IDs, and by default, Paste is enabled even if + * there's nothing to paste! + */ +enum CMTC_Events +{ + //! Cut text, uses provided ID + CMTCE_Cut = wxID_CUT, + //! Copy text, uses privided ID + CMTCE_Copy = wxID_COPY, + //! Paste text, uses custom ID + CMTCE_Paste = wxID_HIGHEST + 666, // Random satanic ID + //! Clear text, uses custom ID + CMTCE_Clear, + //! Select All text, uses custom ID + CMTCE_SelAll +}; + + +BEGIN_EVENT_TABLE(CMuleTextCtrl, wxTextCtrl) +#ifndef __WXGTK__ + EVT_RIGHT_DOWN (CMuleTextCtrl::OnRightDown) + + EVT_MENU (CMTCE_Paste, CMuleTextCtrl::OnPaste) + EVT_MENU (CMTCE_Clear, CMuleTextCtrl::OnClear) + EVT_MENU (CMTCE_SelAll, CMuleTextCtrl::OnSelAll) +#endif +END_EVENT_TABLE() + + +CMuleTextCtrl::CMuleTextCtrl(wxWindow* parent, wxWindowID id, const wxString& value, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name) + : wxTextCtrl( parent, id, value, pos, size, style, validator, name) +{ +} + + +void CMuleTextCtrl::OnRightDown( wxMouseEvent& evt ) +{ + // If this control doesn't have focus, then set it + if ( FindFocus() != this ) + SetFocus(); + + wxMenu popup_menu; + + popup_menu.Append( CMTCE_Cut, _("Cut") ); + popup_menu.Append( CMTCE_Copy, _("Copy") ); + popup_menu.Append( CMTCE_Paste, _("Paste") ); + popup_menu.Append( CMTCE_Clear, _("Clear") ); + + popup_menu.AppendSeparator(); + + popup_menu.Append( CMTCE_SelAll, _("Select All") ); + + + // wxMenu will automatically enable/disable the Cut and Copy items, + // however, were are a little more pricky about the Paste item than they + // are, so we enable/disable it on our own, depending on whenever or not + // there's actually something to paste + bool canpaste = false; + if ( CanPaste() ) { + if ( wxTheClipboard->Open() ) { + if ( wxTheClipboard->IsSupported( wxDF_TEXT ) ) { + wxTextDataObject data; + wxTheClipboard->GetData( data ); + + canpaste = data.GetTextLength(); + } + wxTheClipboard->Close(); + } + } + + + popup_menu.Enable( CMTCE_Paste, canpaste ); + popup_menu.Enable( CMTCE_Clear, IsEditable() && !GetValue().IsEmpty() ); + + PopupMenu( &popup_menu, evt.GetX(), evt.GetY() ); +} + + +void CMuleTextCtrl::OnPaste( wxCommandEvent& WXUNUSED(evt) ) +{ + Paste(); +} + + +void CMuleTextCtrl::OnSelAll( wxCommandEvent& WXUNUSED(evt) ) +{ + // Move the pointer to the front + SetInsertionPoint( 0 ); + + // Selects everything + SetSelection( -1, -1 ); +} + + +void CMuleTextCtrl::OnClear( wxCommandEvent& WXUNUSED(evt) ) +{ + Clear(); +} + + +#ifdef __WXMAC__ +//#warning Remove this when wxMAC has been fixed. +// https://sourceforge.net/tracker/?func=detail&atid=109863&aid=1189859&group_id=9863 +void CMuleTextCtrl::Clear() +{ + if (IsMultiLine()) { + wxFont font = GetFont(); + wxTextCtrl::Clear(); + SetFont(font); + } else { + wxTextCtrl::Clear(); + } +} +#endif + +// File_checked_for_headers diff --git a/src/MuleTextCtrl.h b/src/MuleTextCtrl.h new file mode 100644 index 00000000..4c847347 --- /dev/null +++ b/src/MuleTextCtrl.h @@ -0,0 +1,103 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef MULETEXTCTRL_H +#define MULETEXTCTRL_H + +#include + + +class wxCommandEvent; +class wxMouseEvent; + + +/** + * This class is a slightly improved wxTextCtrl that supports the traditional + * popup-menu usually provided by text-ctrls. It provides the following options: + * - Cut + * - Copy + * - Paste + * - Clear + * - Select All + * + * Other than that, it acts exactly like an ordinary wxTextCtrl. + */ +class CMuleTextCtrl : public wxTextCtrl +{ +public: + /** + * Constructor is identical to the wxTextCtrl one. + */ + CMuleTextCtrl(wxWindow* parent, wxWindowID id, const wxString& value = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxTextCtrlNameStr); + + /** + * Destructor, which currently does nothing. + */ + virtual ~CMuleTextCtrl() {}; + +#ifdef __WXMAC__ + /** + * Hack to fix fonts getting reset when Clear() is called. + */ + virtual void Clear(); +#endif + +protected: + /** + * This function takes care of creating the popup-menu. + * + * Please note that by using the RIGHT_DOWN event, I'm disabling the second + * type of selection that the wxTextCtrl supports. However, I frankly only + * noticed that second selection type while implementing this, so I doubth + * that anyone will be missing it ... + */ + void OnRightDown( wxMouseEvent& evt ); + + /** + * This function takes care of pasting text. + * + * Pleaes note that it is only needed because wxMenu disallows enabling and + * disabling of items that use the predefined wxID_PASTE id. This is the + * only one of the already provided commands we need to override, since the + * others already work just fine. + */ + void OnPaste( wxCommandEvent& evt ); + + /** + * This functions takes care of selecting all text. + */ + void OnSelAll( wxCommandEvent& evt ); + + /** + * This functions takes care of clearing the text. + */ + void OnClear( wxCommandEvent& evt ); + + + DECLARE_EVENT_TABLE() +}; + +#endif + +// File_checked_for_headers diff --git a/src/MuleThread.h b/src/MuleThread.h new file mode 100644 index 00000000..af39da53 --- /dev/null +++ b/src/MuleThread.h @@ -0,0 +1,88 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef MULETHREAD_H +#define MULETHREAD_H + +#include + + +class CMuleThread : public wxThread +{ +public: + //! @see wxThread::wxThread + CMuleThread(wxThreadKind kind = wxTHREAD_DETACHED); + + /** + * Stops the thread. + * + * For detached threads, this function is equivalent + * to Delete, but is also useable for joinable threads, + * where Delete should not be used, due to crashes + * experienced in that case. In the case of joinable + * threads, Wait is called rather than Delete. + * + * @see wxThread::Delete + */ + void Stop(); + + //! Returns true if Delete or Stop has been called. + virtual bool TestDestroy(); +private: + //! Is set if Stop is called. + bool m_stop; +}; + + + +//////////////////////////////////////////////////////////// +// Implementations + +inline CMuleThread::CMuleThread(wxThreadKind kind) + : wxThread(kind) + , m_stop(false) +{ +} + + +inline void CMuleThread::Stop() +{ + m_stop = true; + if (IsDetached()) { + Delete(); + } else { + Wait(); + } +} + + +inline bool CMuleThread::TestDestroy() +{ + // m_stop is checked last, because some functionality is + // dependant upon wxThread::TestDestroy() being called, + // for instance Pause(). + return wxThread::TestDestroy() || m_stop; +} + +#endif diff --git a/src/MuleTrayIcon.cpp b/src/MuleTrayIcon.cpp new file mode 100644 index 00000000..65727737 --- /dev/null +++ b/src/MuleTrayIcon.cpp @@ -0,0 +1,572 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2003-2008 Patrizio Bassi (Hetfield) ( hetfield@amule.org ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include + +#include "MuleTrayIcon.h" + +#include +#include + +#include "pixmaps/mule_TrayIcon_big.ico.xpm" +#include "pixmaps/mule_Tr_yellow_big.ico.xpm" +#include "pixmaps/mule_Tr_grey_big.ico.xpm" + +#include + +#include "amule.h" // Needed for theApp +#include "amuleDlg.h" // Needed for IsShown +#include "Preferences.h" // Needed for thePrefs +#include "ServerConnect.h" // Needed for CServerConnect +#include "Server.h" // Needed for CServer +#include "StatisticsDlg.h" // Needed for CStatisticsDlg::getColors() +#include "Statistics.h" // Needed for theStats +#include // Needed for CFormat + + +// Pop-up menu clickable entries +enum { + TRAY_MENU_INFO = 0, + TRAY_MENU_CLIENTINFO=0, + TRAY_MENU_CLIENTINFO_ITEM = 13007, + TRAY_MENU_DISCONNECT, + TRAY_MENU_CONNECT, + TRAY_MENU_HIDE, + TRAY_MENU_SHOW, + TRAY_MENU_EXIT, + UPLOAD_ITEM1=12340, + UPLOAD_ITEM2=12341, + UPLOAD_ITEM3=12342, + UPLOAD_ITEM4=12343, + UPLOAD_ITEM5=12344, + UPLOAD_ITEM6=12345, + DOWNLOAD_ITEM1=54320, + DOWNLOAD_ITEM2=54321, + DOWNLOAD_ITEM3=54322, + DOWNLOAD_ITEM4=54323, + DOWNLOAD_ITEM5=54324, + DOWNLOAD_ITEM6=54325 +}; + +/****************************************************/ +/******************* Event Table ********************/ +/****************************************************/ + +BEGIN_EVENT_TABLE(CMuleTrayIcon, wxTaskBarIcon) + EVT_TASKBAR_LEFT_DOWN(CMuleTrayIcon::SwitchShow) + EVT_MENU( TRAY_MENU_EXIT, CMuleTrayIcon::Close) + EVT_MENU( TRAY_MENU_CONNECT, CMuleTrayIcon::ServerConnection) + EVT_MENU( TRAY_MENU_DISCONNECT, CMuleTrayIcon::ServerConnection) + EVT_MENU( TRAY_MENU_HIDE, CMuleTrayIcon::ShowHide) + EVT_MENU( TRAY_MENU_SHOW, CMuleTrayIcon::ShowHide) + EVT_MENU( UPLOAD_ITEM1, CMuleTrayIcon::SetUploadSpeed) + EVT_MENU( UPLOAD_ITEM2, CMuleTrayIcon::SetUploadSpeed) + EVT_MENU( UPLOAD_ITEM3, CMuleTrayIcon::SetUploadSpeed) + EVT_MENU( UPLOAD_ITEM4, CMuleTrayIcon::SetUploadSpeed) + EVT_MENU( UPLOAD_ITEM5, CMuleTrayIcon::SetUploadSpeed) + EVT_MENU( UPLOAD_ITEM6, CMuleTrayIcon::SetUploadSpeed) + EVT_MENU( DOWNLOAD_ITEM1, CMuleTrayIcon::SetDownloadSpeed) + EVT_MENU( DOWNLOAD_ITEM2, CMuleTrayIcon::SetDownloadSpeed) + EVT_MENU( DOWNLOAD_ITEM3, CMuleTrayIcon::SetDownloadSpeed) + EVT_MENU( DOWNLOAD_ITEM4, CMuleTrayIcon::SetDownloadSpeed) + EVT_MENU( DOWNLOAD_ITEM5, CMuleTrayIcon::SetDownloadSpeed) + EVT_MENU( DOWNLOAD_ITEM6, CMuleTrayIcon::SetDownloadSpeed) +END_EVENT_TABLE() + +/****************************************************/ +/************ Constructor / Destructor **************/ +/****************************************************/ + +long GetSpeedFromString(wxString label){ + long temp; + label.Replace(wxT("kB/s"),wxT(""),TRUE); + label.Trim(FALSE); + label.Trim(TRUE); + label.ToLong(&temp); + return temp; +} + +void CMuleTrayIcon::SetUploadSpeed(wxCommandEvent& event){ + + wxObject* obj=event.GetEventObject(); + if (obj!=NULL) { + wxMenu *menu = dynamic_cast(obj); + if (menu) { + wxMenuItem* item=menu->FindItem(event.GetId()); + if (item!=NULL) { + long temp; + if (item->GetLabel()==(_("Unlimited"))) { + temp=UNLIMITED; + } + else { + temp=GetSpeedFromString(item->GetLabel()); + } + thePrefs::SetMaxUpload(temp); + } + } + } +} + +void CMuleTrayIcon::SetDownloadSpeed(wxCommandEvent& event){ + + wxObject* obj=event.GetEventObject(); + if (obj!=NULL) { + wxMenu *menu = dynamic_cast(obj); + if (menu) { + wxMenuItem* item=menu->FindItem(event.GetId()); + if (item!=NULL) { + long temp; + if (item->GetLabel()==(_("Unlimited"))) { + temp=UNLIMITED; + } + else { + temp=GetSpeedFromString(item->GetLabel()); + } + thePrefs::SetMaxDownload(temp); + } + } + } +} + + +void CMuleTrayIcon::ServerConnection(wxCommandEvent& WXUNUSED(event)) +{ + wxCommandEvent evt; + theApp->amuledlg->OnBnConnect(evt); +} + + +void CMuleTrayIcon::ShowHide(wxCommandEvent& WXUNUSED(event)) +{ + if (theApp->amuledlg->IsShown()) { + theApp->amuledlg->Hide_aMule(); + } else { + theApp->amuledlg->Show_aMule(); + } +} + + +void CMuleTrayIcon::Close(wxCommandEvent& WXUNUSED(event)) +{ + theApp->amuledlg->Close(); +} + + +CMuleTrayIcon::CMuleTrayIcon() +{ + Old_Icon = -1; + Old_SpeedSize = 0xFFFF; // must be > any possible one. + // Create the background icons (speed improvement) + HighId_Icon_size = wxIcon(mule_TrayIcon_big_ico_xpm).GetHeight(); + LowId_Icon_size = wxIcon(mule_Tr_yellow_big_ico_xpm).GetHeight(); + Disconnected_Icon_size = wxIcon(mule_Tr_grey_big_ico_xpm).GetHeight(); +} + +CMuleTrayIcon::~CMuleTrayIcon() +{ +#ifdef __WXGTK__ + // FIXME: EVIL HACK: We need to ensure that the superclass doesn't + // try to destroy a dangling pointer. See also CMuleTrayIcon::UpdateTray + // for comments on this issue. + if (m_iconWnd) { + if (wxTopLevelWindows.IndexOf((wxWindow*)m_iconWnd) == wxNOT_FOUND) { + m_iconWnd = NULL; + } + } +#endif +} + +/****************************************************/ +/***************** Public Functions *****************/ +/****************************************************/ + +void CMuleTrayIcon::SetTrayIcon(int Icon, uint32 percent) +{ + int Bar_ySize = 0; + + switch (Icon) { + case TRAY_ICON_HIGHID: + // Most likely case, test first + Bar_ySize = HighId_Icon_size; + break; + case TRAY_ICON_LOWID: + Bar_ySize = LowId_Icon_size; + break; + case TRAY_ICON_DISCONNECTED: + Bar_ySize = Disconnected_Icon_size; + break; + default: + wxASSERT(0); + } + + // Lookup this values for speed improvement: don't draw if not needed + int NewSize = (Bar_ySize * percent) / 100; + + if ((Old_Icon != Icon) || (Old_SpeedSize != NewSize)) { + + if ((Old_SpeedSize > NewSize) || (Old_Icon != Icon)) { + // We have to rebuild the icon, because bar is lower now. + switch (Icon) { + case TRAY_ICON_HIGHID: + // Most likely case, test first + CurrentIcon = wxIcon(mule_TrayIcon_big_ico_xpm); + break; + case TRAY_ICON_LOWID: + CurrentIcon = wxIcon(mule_Tr_yellow_big_ico_xpm); + break; + case TRAY_ICON_DISCONNECTED: + CurrentIcon = wxIcon(mule_Tr_grey_big_ico_xpm); + break; + default: + wxASSERT(0); + } + } + + Old_Icon = Icon; + Old_SpeedSize = NewSize; + + // Do whatever to the icon before drawing it (percent) + + wxBitmap TempBMP; + TempBMP.CopyFromIcon(CurrentIcon); + + TempBMP.SetMask(NULL); + + IconWithSpeed.SelectObject(TempBMP); + + + // Speed bar is: centered, taking 80% of the icon heigh, and + // right-justified taking a 10% of the icon width. + + // X + int Bar_xSize = 4; + int Bar_xPos = CurrentIcon.GetWidth() - 5; + + wxColour col= WxColourFromCr( CStatisticsDlg::getColors(11) ); + wxBrush brush(col); + IconWithSpeed.SetBrush(brush); + IconWithSpeed.SetPen(*wxTRANSPARENT_PEN); + + IconWithSpeed.DrawRectangle(Bar_xPos + 1, Bar_ySize - NewSize, Bar_xSize -2 , NewSize); + + // Unselect the icon. + IconWithSpeed.SelectObject(wxNullBitmap); + + // Do transparency + + // Set a new mask with transparency set to red. + wxMask* new_mask = new wxMask(TempBMP, wxColour(0xFF, 0x00, 0x00)); + + TempBMP.SetMask(new_mask); + CurrentIcon.CopyFromBitmap(TempBMP); + + UpdateTray(); + } +} + +void CMuleTrayIcon::SetTrayToolTip(const wxString& Tip) +{ + CurrentTip = Tip; + UpdateTray(); +} + +/****************************************************/ +/**************** Private Functions *****************/ +/****************************************************/ + +void CMuleTrayIcon::UpdateTray() +{ +#ifdef __WXGTK__ + // FIXME: EVIL HACK: As of wxGTK-2.8.7, closing of the trayicon + // window (caused for instance by a crashing kicker) is not + // handled, with the result that the pointer to the trayicon + // window becomes a dangling pointer. Since we have access to + // the pointer, and it's created as a top-level window, it's + // relatively easy to force the recreation of a valid window. + // Ugly as hell though .... + // + // This has been repported as bug #1872724: + // http://sourceforge.net/tracker/index.php?func=detail&aid=1872724&group_id=9863&atid=109863 + if (m_iconWnd) { + if (wxTopLevelWindows.IndexOf((wxWindow*)m_iconWnd) == wxNOT_FOUND) { + printf("Traybar-icon lost, trying to recreate ...\n"); + m_iconWnd = NULL; + } + } +#endif + + // Icon update and Tip update + if (IsOk()) { + SetIcon(CurrentIcon, CurrentTip); + } +} + + +wxMenu* CMuleTrayIcon::CreatePopupMenu() +{ + // Creates dinamically the menu to show the user. + wxMenu *traymenu = new wxMenu(); + traymenu->SetTitle(_("aMule Tray Menu")); + + // Build the Top string name + wxString label = MOD_VERSION_LONG; + traymenu->Append(TRAY_MENU_INFO, label); + traymenu->AppendSeparator(); + label = wxString(_("Speed Limits:")) + wxT(" "); + + // Check for upload limits + unsigned int max_upload = thePrefs::GetMaxUpload(); + if ( max_upload == UNLIMITED ) { + label += _("UL: None"); + } + else { + label += wxString::Format(_("UL: %u"), max_upload); + } + label += wxT(", "); + + // Check for download limits + unsigned int max_download = thePrefs::GetMaxDownload(); + if ( max_download == UNLIMITED ) { + label += _("DL: None"); + } + else { + label += wxString::Format(_("DL: %u"), max_download); + } + + traymenu->Append(TRAY_MENU_INFO, label); + label = wxString::Format(_("Download Speed: %.1f"), theStats::GetDownloadRate() / 1024.0); + traymenu->Append(TRAY_MENU_INFO, label); + label = wxString::Format(_("Upload Speed: %.1f"), theStats::GetUploadRate() / 1024.0); + traymenu->Append(TRAY_MENU_INFO, label); + traymenu->AppendSeparator(); + + // Client Info + wxMenu* ClientInfoMenu = new wxMenu(); + ClientInfoMenu->SetTitle(_("Client Information")); + + // User nick-name + { + wxString temp = CFormat(_("Nickname: %s")) % ( thePrefs::GetUserNick().IsEmpty() ? wxString(_("No Nickname Selected!")) : thePrefs::GetUserNick() ); + + ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); + } + + // Client ID + { + wxString temp = _("ClientID: "); + + if (theApp->IsConnectedED2K()) { + unsigned long id = theApp->GetED2KID(); + temp += wxString::Format(wxT("%lu"), id); + } else { + temp += _("Not Connected"); + } + ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); + } + + // Current Server and Server IP + { + wxString temp_name = _("ServerName: "); + wxString temp_ip = _("ServerIP: "); + + if ( theApp->serverconnect->GetCurrentServer() ) { + temp_name += theApp->serverconnect->GetCurrentServer()->GetListName(); + temp_ip += theApp->serverconnect->GetCurrentServer()->GetFullIP(); + } else { + temp_name += _("Not Connected"); + temp_ip += _("Not Connected"); + } + ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp_name); + ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp_ip); + } + + // IP Address + { + wxString temp = CFormat(_("IP: %s")) % ( (theApp->GetPublicIP()) ? Uint32toStringIP(theApp->GetPublicIP()) : wxString(_("Unknown")) ); + + ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); + } + + // TCP PORT + { + wxString temp; + if (thePrefs::GetPort()) { + temp = CFormat(_("TCP Port: %d")) % thePrefs::GetPort(); + } else { + temp=_("TCP Port: Not Ready"); + } + ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); + } + + // UDP PORT + { + wxString temp; + if (thePrefs::GetEffectiveUDPPort()) { + temp = CFormat(_("UDP Port: %d")) % thePrefs::GetEffectiveUDPPort(); + } else { + temp=_("UDP Port: Not Ready"); + } + ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); + } + + // Online Signature + { + wxString temp; + if (thePrefs::IsOnlineSignatureEnabled()) { + temp=_("Online Signature: Enabled"); + } + else { + temp=_("Online Signature: Disabled"); + } + ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); + } + + // Uptime + { + wxString temp = CFormat(_("Uptime: %s")) % CastSecondsToHM(theStats::GetUptimeSeconds()); + ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); + } + + // Number of shared files + { + wxString temp = CFormat(_("Shared Files: %d")) % theStats::GetSharedFileCount(); + ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); + } + + // Number of queued clients + { + wxString temp = CFormat(_("Queued Clients: %d")) % theStats::GetWaitingUserCount(); + ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); + } + + // Total Downloaded + { + wxString temp = CastItoXBytes( theStats::GetSessionReceivedBytes() + thePrefs::GetTotalDownloaded() ); + temp = CFormat(_("Total DL: %s")) % temp; + ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); + } + + // Total Uploaded + { + wxString temp = CastItoXBytes( theStats::GetSessionSentBytes() + thePrefs::GetTotalUploaded() ); + temp = CFormat(_("Total UL: %s")) % temp; + ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); + } + + traymenu->Append(TRAY_MENU_CLIENTINFO,ClientInfoMenu->GetTitle(),ClientInfoMenu); + + // Separator + traymenu->AppendSeparator(); + + // Upload Speed sub-menu + wxMenu* UploadSpeedMenu = new wxMenu(); + UploadSpeedMenu->SetTitle(_("Upload Limit")); + + // Download Speed sub-menu + wxMenu* DownloadSpeedMenu = new wxMenu(); + DownloadSpeedMenu->SetTitle(_("Download Limit")); + + // Upload Speed sub-menu + { + UploadSpeedMenu->Append(UPLOAD_ITEM1, _("Unlimited")); + + uint32 max_ul_speed = thePrefs::GetMaxGraphUploadRate(); + + if ( max_ul_speed == UNLIMITED ) { + max_ul_speed = 100; + } + else if ( max_ul_speed < 10 ) { + max_ul_speed = 10; + } + + for ( int i = 0; i < 5; i++ ) { + unsigned int tempspeed = (unsigned int)((double)max_ul_speed / 5) * (5 - i); + wxString temp = wxString::Format(wxT("%u kB/s"), tempspeed); + UploadSpeedMenu->Append((int)UPLOAD_ITEM1+i+1,temp); + } + } + traymenu->Append(0,UploadSpeedMenu->GetTitle(),UploadSpeedMenu); + + // Download Speed sub-menu + { + DownloadSpeedMenu->Append(DOWNLOAD_ITEM1, _("Unlimited")); + + uint32 max_dl_speed = thePrefs::GetMaxGraphDownloadRate(); + + if ( max_dl_speed == UNLIMITED ) { + max_dl_speed = 100; + } + else if ( max_dl_speed < 10 ) { + max_dl_speed = 10; + } + + for ( int i = 0; i < 5; i++ ) { + unsigned int tempspeed = (unsigned int)((double)max_dl_speed / 5) * (5 - i); + wxString temp = wxString::Format(wxT("%d kB/s"), tempspeed); + DownloadSpeedMenu->Append((int)DOWNLOAD_ITEM1+i+1,temp); + } + } + + traymenu->Append(0,DownloadSpeedMenu->GetTitle(),DownloadSpeedMenu); + // Separator + traymenu->AppendSeparator(); + + if (theApp->IsConnected()) { + //Disconnection Speed item + traymenu->Append(TRAY_MENU_DISCONNECT, _("Disconnect")); + } else { + //Connect item + traymenu->Append(TRAY_MENU_CONNECT, _("Connect")); + } + + // Separator + traymenu->AppendSeparator(); + + if (theApp->amuledlg->IsShown()) { + //hide item + traymenu->Append(TRAY_MENU_HIDE, _("Hide aMule")); + } else { + //show item + traymenu->Append(TRAY_MENU_SHOW, _("Show aMule")); + } + + // Separator + traymenu->AppendSeparator(); + + // Exit item + traymenu->Append(TRAY_MENU_EXIT, _("Exit")); + + return traymenu; +} + +void CMuleTrayIcon::SwitchShow(wxTaskBarIconEvent&) { + if ( theApp->amuledlg->IsShown() ) { + theApp->amuledlg->Hide_aMule(); + } else { + theApp->amuledlg->Show_aMule(); + } +} +// File_checked_for_headers diff --git a/src/MuleTrayIcon.h b/src/MuleTrayIcon.h new file mode 100644 index 00000000..b7de54c9 --- /dev/null +++ b/src/MuleTrayIcon.h @@ -0,0 +1,117 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef MULETRAYICON_H +#define MULETRAYICON_H + +#ifndef AMULE_DAEMON + + +enum TaskbarNotifier +{ + TBN_NULL = 0, + TBN_CHAT, + TBN_DLOAD, + TBN_LOG, + TBN_IMPORTANTEVENT, + TBN_NEWVERSION +}; + +#include +#include +#include + +#include "Types.h" // Needed for uint32 + +class wxString; +class wxMenu; + +enum { + TRAY_ICON_DISCONNECTED, + TRAY_ICON_LOWID, + TRAY_ICON_HIGHID +}; + + +/** + * The mule tray icon class is responsible for drawing the mule systray icon + * and reacting to the user input on it. + */ +class CMuleTrayIcon : public wxTaskBarIcon +{ +public: + /** + * Contructor. + */ + CMuleTrayIcon(); + + /** + * Destructor. + */ + ~CMuleTrayIcon(); + + /** + * Set the Tray icon. + * @param Icon The wxIcon object with the new tray icon + */ + void SetTrayIcon(int Icon, uint32 percent); + + /** + * Set the Tray tooltip + * @param Tip The wxString object with the new tray tooltip + */ + void SetTrayToolTip(const wxString& Tip); + +private: + + virtual wxMenu* CreatePopupMenu(); + + void UpdateTray(); + + void SwitchShow(wxTaskBarIconEvent&); + void SetUploadSpeed(wxCommandEvent&); + void SetDownloadSpeed(wxCommandEvent&); + void ServerConnection(wxCommandEvent&); + void ShowHide(wxCommandEvent&); + void Close(wxCommandEvent&); + + int Old_Icon; + int Old_SpeedSize; + + int Disconnected_Icon_size; + int LowId_Icon_size; + int HighId_Icon_size; + + wxIcon CurrentIcon; + wxMemoryDC IconWithSpeed; + wxString CurrentTip; + + DECLARE_EVENT_TABLE() +}; + +#endif // DAEMON + +#endif //MULETRAYICON_H +// File_checked_for_headers diff --git a/src/MuleUDPSocket.cpp b/src/MuleUDPSocket.cpp new file mode 100644 index 00000000..1f7d5c05 --- /dev/null +++ b/src/MuleUDPSocket.cpp @@ -0,0 +1,334 @@ +// +// This file is part of the aMule Project. +// +// Copyright (C) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include +#include + +#include "MuleUDPSocket.h" // Interface declarations + +#include + +#include "Logger.h" // Needed for AddDebugLogLineM +#include "amule.h" // Needed for theApp +#include "GetTickCount.h" // Needed for GetTickCount() +#include "Packet.h" // Needed for CPacket +#include // Needed for unicode2char +#include "Proxy.h" // Needed for CDatagramSocketProxy +#include "Logger.h" // Needed for AddDebugLogLineM +#include "UploadBandwidthThrottler.h" +#include "EncryptedDatagramSocket.h" +#include "OtherFunctions.h" + +CMuleUDPSocket::CMuleUDPSocket(const wxString& name, int id, const amuleIPV4Address& address, const CProxyData* ProxyData) +: +m_busy(false), +m_name(name), +m_id(id), +m_addr(address), +m_proxy(ProxyData), +m_socket(NULL) +{ +} + + +CMuleUDPSocket::~CMuleUDPSocket() +{ + theApp->uploadBandwidthThrottler->RemoveFromAllQueues(this); + + wxMutexLocker lock(m_mutex); + DestroySocket(); +} + + +void CMuleUDPSocket::CreateSocket() +{ + wxCHECK_RET(!m_socket, wxT("Socket already opened.")); + + m_socket = new CEncryptedDatagramSocket(m_addr, wxSOCKET_NOWAIT, m_proxy); + m_socket->SetClientData(this); + m_socket->SetEventHandler(*theApp, m_id); + m_socket->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_OUTPUT_FLAG | wxSOCKET_LOST_FLAG); + m_socket->Notify(true); + + if (!m_socket->Ok()) { + AddDebugLogLineM(true, logMuleUDP, wxT("Failed to create valid ") + m_name); + DestroySocket(); + } else { + AddLogLineM(false, wxString(wxT("Created ")) << m_name << wxT(" at port ") << m_addr.Service()); + } +} + + +void CMuleUDPSocket::DestroySocket() +{ + if (m_socket) { + AddDebugLogLineM(false, logMuleUDP, wxT("Shutting down ") + m_name); + m_socket->SetNotify(0); + m_socket->Notify(false); + m_socket->Close(); + m_socket->Destroy(); + m_socket = NULL; + } +} + + +void CMuleUDPSocket::Open() +{ + wxMutexLocker lock(m_mutex); + + CreateSocket(); +} + + +void CMuleUDPSocket::Close() +{ + wxMutexLocker lock(m_mutex); + + DestroySocket(); +} + + +void CMuleUDPSocket::OnSend(int errorCode) +{ + if (errorCode) { + return; + } + + { + wxMutexLocker lock(m_mutex); + m_busy = false; + if (m_queue.empty()) { + return; + } + } + + theApp->uploadBandwidthThrottler->QueueForSendingControlPacket(this); +} + + +const unsigned UDP_BUFFER_SIZE = 16384; + + +void CMuleUDPSocket::OnReceive(int errorCode) +{ + AddDebugLogLineM(false, logMuleUDP, wxString::Format( + wxT("Got UDP callback for read: Error %i Socket state %i"), + errorCode, Ok() ? 1 : 0)); + + char buffer[UDP_BUFFER_SIZE]; + wxIPV4address addr; + unsigned length = 0; + bool error = false; + int lastError = 0; + + { + wxMutexLocker lock(m_mutex); + + if (errorCode || (m_socket == NULL) || !m_socket->Ok()) { + DestroySocket(); + CreateSocket(); + + return; + } + + + length = m_socket->RecvFrom(addr, buffer, UDP_BUFFER_SIZE).LastCount(); + error = m_socket->Error(); + lastError = m_socket->LastError(); + } + + if (error) { + OnReceiveError(lastError, addr); + } else if (length < 2) { + // 2 bytes (protocol and opcode) is the smallets possible packet. + AddDebugLogLineM(false, logMuleUDP, m_name + wxT(": Invalid Packet received")); + } else if (!StringIPtoUint32(addr.IPAddress())) { + // wxASSERT(0); + printf("Unknown ip receiving on UDP packet! Ignoring: '%s'\n", + (const char*)unicode2char(addr.IPAddress())); + } else if (!addr.Service()) { + // wxASSERT(0); + printf("Unknown port receiving an UDP packet! Ignoring\n"); + } else { + AddDebugLogLineM(false, logMuleUDP, (m_name + wxT(": Packet received (")) + << addr.IPAddress() << wxT(":") << addr.Service() << wxT("): ") + << length << wxT("b")); + OnPacketReceived(addr, (byte*)buffer, length); + } +} + + +void CMuleUDPSocket::OnReceiveError(int errorCode, const wxIPV4address& WXUNUSED(addr)) +{ + AddDebugLogLineM(false, logMuleUDP, (m_name + wxT(": Error while reading: ")) << errorCode); +} + + +void CMuleUDPSocket::OnDisconnected(int WXUNUSED(errorCode)) +{ + /* Due to bugs in wxWidgets, UDP sockets will sometimes + * be closed. This is caused by the fact that wx treats + * zero-length datagrams as EOF, which is only the case + * when dealing with streaming sockets. + * + * This has been reported as patch #1885472: + * http://sourceforge.net/tracker/index.php?func=detail&aid=1885472&group_id=9863&atid=309863 + */ + AddDebugLogLineM(true, logMuleUDP, m_name + wxT("Socket died, recreating.")); + DestroySocket(); + CreateSocket(); +} + + +void CMuleUDPSocket::SendPacket(CPacket* packet, uint32 IP, uint16 port, bool bEncrypt, const uint8* pachTargetClientHashORKadID, bool bKad, uint16 nReceiverVerifyKey) +{ + wxCHECK_RET(packet, wxT("Invalid packet.")); + /*wxCHECK_RET(port, wxT("Invalid port.")); + wxCHECK_RET(IP, wxT("Invalid IP.")); + */ + + if (!port || !IP) { + return; + } + + if (!Ok()) { + AddDebugLogLineM(false, logMuleUDP, (m_name + wxT(": Packet discarded (socket not Ok): ")) + << Uint32toStringIP(IP) << wxT(":") << port << wxT(" ") << packet->GetPacketSize() + << wxT("b")); + delete packet; + + return; + } + + AddDebugLogLineM(false, logMuleUDP, (m_name + wxT(": Packet queued: ")) + << Uint32toStringIP(IP) << wxT(":") << port << wxT(" ") + << packet->GetPacketSize() << wxT("b")); + + UDPPack newpending; + newpending.IP = IP; + newpending.port = port; + newpending.packet = packet; + newpending.time = GetTickCount(); + newpending.bEncrypt = bEncrypt && pachTargetClientHashORKadID != NULL; + newpending.bKad = bKad; + newpending.nReceiverVerifyKey = nReceiverVerifyKey; + if (newpending.bEncrypt) { + md4cpy(newpending.pachTargetClientHashORKadID, pachTargetClientHashORKadID); + } else { + md4clr(newpending.pachTargetClientHashORKadID); + } + + { + wxMutexLocker lock(m_mutex); + m_queue.push_back(newpending); + } + + theApp->uploadBandwidthThrottler->QueueForSendingControlPacket(this); +} + + +bool CMuleUDPSocket::Ok() +{ + wxMutexLocker lock(m_mutex); + + return m_socket && m_socket->Ok(); +} + + +SocketSentBytes CMuleUDPSocket::SendControlData(uint32 maxNumberOfBytesToSend, uint32 WXUNUSED(minFragSize)) +{ + wxMutexLocker lock(m_mutex); + uint32 sentBytes = 0; + while (!m_queue.empty() && !m_busy && (sentBytes < maxNumberOfBytesToSend)) { + UDPPack item = m_queue.front(); + CPacket* packet = item.packet; + if (GetTickCount() - item.time < UDPMAXQUEUETIME) { + std::vector sendbuffer(packet->GetPacketSize() + 2); + STLCopy_n(packet->GetUDPHeader(), 2, sendbuffer.begin()); + STLCopy_n(packet->GetDataBuffer(), packet->GetPacketSize(), sendbuffer.begin() + 2); + + if (SendTo(&(sendbuffer[0]), packet->GetPacketSize() + 2, item.IP, item.port)) { + sentBytes += packet->GetPacketSize() + 2; + m_queue.pop_front(); + delete packet; + } else { + // TODO: Needs better error handling, see SentTo + break; + } + } else { + m_queue.pop_front(); + delete packet; + } + } + if (!m_busy && !m_queue.empty()) { + theApp->uploadBandwidthThrottler->QueueForSendingControlPacket(this); + } + SocketSentBytes returnVal = { true, 0, sentBytes }; + + return returnVal; +} + + +bool CMuleUDPSocket::SendTo(char* buffer, uint32 length, uint32 ip, uint16 port) +{ + // Just pretend that we sent the packet in order to avoid infinete loops. + if (!(m_socket && m_socket->Ok())) { + return true; + } + + amuleIPV4Address addr; + addr.Hostname(ip); + addr.Service(port); + + // We better clear this flag here, status might have been changed + // between the U.B.T. adition and the real sending happening later + m_busy = false; + bool sent = false; + m_socket->SendTo(addr, buffer, length); + if (m_socket->Error()) { + wxSocketError error = m_socket->LastError(); + + if (error == wxSOCKET_WOULDBLOCK) { + // Socket is busy and can't send this data right now, + // so we just return not sent and set the wouldblock + // flag so it gets resent when socket is ready. + m_busy = true; + } else { + // An error which we can't handle happended, so we drop + // the packet rather than risk entering an infinite loop. + printf("WARNING! %s discarded packet due to errors (%i) while sending.\n", + (const char*)unicode2char(m_name), error); + sent = true; + } + } else { + AddDebugLogLineM(false, logMuleUDP, (m_name + wxT(": Packet sent to ")) + << ip << wxT(":") << port << wxT(": ") + << length << wxT("b")); + sent = true; + } + + return sent; +} + +// File_checked_for_headers diff --git a/src/MuleUDPSocket.h b/src/MuleUDPSocket.h new file mode 100644 index 00000000..3a9a9c0e --- /dev/null +++ b/src/MuleUDPSocket.h @@ -0,0 +1,202 @@ +// +// This file is part of the aMule Project. +// +// Copyright (C) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef MULEUDPSOCKET_H +#define MULEUDPSOCKET_H + + +#include "Types.h" // Needed for uint16 and uint32 +#include "ThrottledSocket.h" // Needed for ThrottledControlSocket +#include "amuleIPV4Address.h" // Needed for amuleIPV4Address + +class CEncryptedDatagramSocket; +class CProxyData; +class CPacket; + +/*** + * This class provides a UBT governed UDP-socket. + * + * The CMuleUDPSocket are created with the NOWAIT option and + * handle both INPUT and OUTPUT events. + * + * The following additional features are provided compared to CDatagramSocketProxy: + * - Goverened by the UBT. + * - Automatic sending/receiving of packets. + * - Fallover recovery for when a socket becomes invalid (error 4). + * + * @see ThrottledControlSocket + * @see CEncryptedDatagramSocket + */ +class CMuleUDPSocket : public ThrottledControlSocket +{ + +public: + /** + * Opens a UDP socket at the specified address. + * + * @param name Name used when logging events. + * @param id The ID used for events. + * @param address The address where the socket will listen. + * @param ProxyData ProxyData assosiated with the socket. + */ + CMuleUDPSocket(const wxString& name, int id, const amuleIPV4Address& address, const CProxyData* ProxyData = NULL); + + /** + * Destructor, safely closes the socket if opened. + */ + virtual ~CMuleUDPSocket(); + + + /** + * Opens the socket. + * + * The socket is bound to the address specified in + * the constructor. + */ + void Open(); + + /** + * Closes the socket. + * + * The socket can be reopened by calling Open. Closing a + * already closed socket is an illegal operation. + */ + void Close(); + + + /** This function is called by aMule when the socket may send. */ + virtual void OnSend(int errorCode); + /** This function is called by aMule when there are data to be received. */ + virtual void OnReceive(int errorCode); + /** This function is called by aMule when there is an error while receiving. */ + virtual void OnReceiveError(int errorCode, const wxIPV4address& addr); + /** This function is called when the socket is lost (see comments in func.) */ + virtual void OnDisconnected(int errorCode); + + /** + * Queues a packet for sending. + * + * @param packet The packet to send. + * @param IP The target IP address. + * @param port The target port. + * @param bEncrypt If the packet must be encrypted + * @param port The target port. + * @param pachTargetClientHashORKadID The client hash or Kad ID + * @param bKad + * @param nReceiverVerifyKey + * + * Note that CMuleUDPSocket takes ownership of the packet. + */ + void SendPacket(CPacket* packet, uint32 IP, uint16 port, bool bEncrypt, const uint8* pachTargetClientHashORKadID, bool bKad, uint16 nReceiverVerifyKey); + + + /** + * Returns true if the socket is Ok, false otherwise. + * + * @see wxSocketBase::Ok + */ + bool Ok(); + +protected: + /** + * This function is called when a packet has been received. + * + * @param addr The address from where data was received. + * @param buffer The data that has been received. + * @param length The length of the data buffer. + */ + virtual void OnPacketReceived(const wxIPV4address& addr, byte* buffer, size_t length) = 0; + + + /** See ThrottledControlSocket::SendControlData */ + SocketSentBytes SendControlData(uint32 maxNumberOfBytesToSend, uint32 minFragSize); + +private: + /** + * Sends a packet to the specified address. + * + * @param The data to be sent. + * @param length the length of the data buffer. + * @param ip The target ip address. + * @param port The target port. + */ + bool SendTo(char* buffer, uint32 length, uint32 ip, uint16 port); + + + /** + * Creates a new socket. + * + * Calling this function when a socket already exists + * is an illegal operation. + */ + void CreateSocket(); + + /** + * Destroys the current socket, if any. + */ + void DestroySocket(); + + + //! Specifies if the last write attempt would cause the socket to block. + bool m_busy; + //! The name of the socket, used for debugging messages. + wxString m_name; + //! The socket-ID, used for event-handling. + int m_id; + //! The address at which the socket is currently bound. + amuleIPV4Address m_addr; + //! Proxy settings used by the socket ... + const CProxyData* m_proxy; + //! Mutex needed due to the use of the UBT. + wxMutex m_mutex; + //! The currently opened socket, if any. + CEncryptedDatagramSocket* m_socket; + + //! Storage struct used for queueing packets. + struct UDPPack + { + //! The packet, which at this point is owned by CMuleUDPSocket. + CPacket* packet; + //! The timestamp of when the packet was queued. + uint32 time; + //! Target IP address. + uint32 IP; + //! Target port. + uint16 port; + //! If the packet is encrypted. + bool bEncrypt; + //! Is it a kad packet? + bool bKad; + // The verification key for RC4 encryption. + uint16 nReceiverVerifyKey; + // Client hash or kad ID. + uint8 pachTargetClientHashORKadID[16]; + } ; + + //! The queue of packets waiting to be sent. + std::list m_queue; +}; + +#endif // CLIENTUDPSOCKET_H +// File_checked_for_headers diff --git a/src/NetworkFunctions.cpp b/src/NetworkFunctions.cpp new file mode 100644 index 00000000..a179de8f --- /dev/null +++ b/src/NetworkFunctions.cpp @@ -0,0 +1,173 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal Veiga - Kry (kry@amule.org) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "NetworkFunctions.h" // Interface declaration + +bool StringIPtoUint32(const wxString &strIP, uint32& Ip) +{ + // The current position in the current field, used to detect malformed fields (x.y..z). + unsigned digit = 0; + + // The current field, used to ensure only IPs that looks like a.b.c.d are supported + unsigned field = 0; + + // The value of the current field + unsigned value = 0; + + // Stores the work-value of the IP, reference is not changed unless the str was valid + uint32 tmp_ip = 0; + + wxString str = strIP.Strip( wxString::both ); + for (size_t i = 0; i < str.Length(); i++) { + wxChar c = str.GetChar( i ); + + if ( c >= wxT('0') && c <= wxT('9') && (value >> 8) == 0) { + value = ( value * 10 ) + ( c - wxT('0') ); + ++digit; + } else if ( c == wxT('.') ) { + if ( digit && (value >> 8) == 0) { + tmp_ip = tmp_ip | value << ( field * 8 ); + + // Rest the current field values + value = digit = 0; + ++field; + } else { + return false; + } + } else { + return false; + } + } + + // Only set the referenced value if it was a valid IP + if ( field == 3 && digit && (value >> 8) == 0) { + Ip = tmp_ip | value << 24; + return true; + } + + return false; +} + + +uint32 StringHosttoUint32(const wxString &Host) +{ + if (Host.IsEmpty()) { + return 0; + } + // Why using native things when we have a wrapper for it :) + wxIPV4address solver; + solver.Hostname(Host); + uint32 result = StringIPtoUint32(solver.IPAddress()); + if (result != (uint32)-1) { + return result; + } else { + // This actually happens on wrong hostname + return 0; + } +} + +/** + * Used to store the ranges. + */ +struct IPRange +{ + const wxChar *addr; + unsigned int mask; + bool isLAN; +}; + + +const IPRange ranges[] = { +// Here is reserved blocks from RFC 3330 at http://www.rfc-editor.org/rfc/rfc3330.txt +// +//Address Block Present Use Reference +//---------------------------------------------------------------------------------- +{ wxT("0.0.0.0"), 8, false }, // "This" Network [RFC1700, page 4] +{ wxT("10.0.0.0"), 8, true }, // Private-Use Networks [RFC1918] +// Acording to RFC3330, 24.* and 14.* must be parsed as normal ips. +//{ wxT("14.0.0.0"), 8, false }, // Public-Data Networks [RFC1700, page 181] +//{ wxT("24.0.0.0"), 8, false }, // Cable Television Networks -- +{ wxT("39.0.0.0"), 8, false }, // Reserved but subject + // to allocation [RFC1797] +{ wxT("127.0.0.0"), 8, false }, // Loopback [RFC1700, page 5] +{ wxT("128.0.0.0"), 16, false }, // Reserved but subject + // to allocation -- +{ wxT("169.254.0.0"), 16, false }, // Link Local -- +{ wxT("172.16.0.0"), 12, true }, // Private-Use Networks [RFC1918] +{ wxT("191.255.0.0"), 16, false }, // Reserved but subject + // to allocation -- +{ wxT("192.0.0.0"), 24, false }, // Reserved but subject + // to allocation -- +{ wxT("192.0.2.0"), 24, false }, // Test-Net +{ wxT("192.88.99.0"), 24, false }, // 6to4 Relay Anycast [RFC3068] +{ wxT("192.168.0.0"), 16, true }, // Private-Use Networks [RFC1918] +{ wxT("198.18.0.0"), 15, false }, // Network Interconnect + // Device Benchmark Testing [RFC2544] +{ wxT("223.255.255.0"), 24, false }, // Reserved but subject + // to allocation -- +{ wxT("224.0.0.0"), 4, false }, // Multicast [RFC3171] +{ wxT("240.0.0.0"), 4, false } // Reserved for Future Use [RFC1700, page 4] +}; + + +struct filter_st { + uint32 addr; // Address and mask in anti-host order. + uint32 mask; +}; + +const int number_of_ranges = sizeof(ranges) / sizeof(IPRange); +static filter_st filters[number_of_ranges]; + + +// This function is used to initialize the IP filter +bool SetupFilter() +{ + for (int i = 0; i < number_of_ranges; ++i) { + filters[i].addr = StringIPtoUint32( ranges[i].addr ); + filters[i].mask = ~wxUINT32_SWAP_ALWAYS((1 << (32 - ranges[i].mask)) - 1); + } + return true; +} + + +// This is a little trick to ensure that the filter-list is initialized before +// it gets used, while not risking threading problems. +static bool filterSetup = SetupFilter(); + + +bool IsGoodIP(uint32 IP, bool filterLAN) +{ + for (int i = 0; i < number_of_ranges; ++i) { + if (((IP ^ filters[i].addr) & filters[i].mask) == 0) { + if ( filterLAN || !ranges[i].isLAN ) { + return false; + } + } + } + + return true; +} +// File_checked_for_headers diff --git a/src/NetworkFunctions.h b/src/NetworkFunctions.h new file mode 100644 index 00000000..2a897695 --- /dev/null +++ b/src/NetworkFunctions.h @@ -0,0 +1,116 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal Veiga - Kry (kry@amule.org) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef NETWORK_FUNCTIONS_H +#define NETWORK_FUNCTIONS_H + +#include "Types.h" // Needed for uint16 and uint32 +#include + +// Network ip/host handling functions +// These functions takes IPs in anti-host order and IPs in anti-host order + +inline wxString Uint32toStringIP(uint32 ip) +{ + return wxString::Format(wxT("%u.%u.%u.%u"),(uint8)ip,(uint8)(ip>>8),(uint8)(ip>>16),(uint8)(ip>>24)); +} + +inline wxString Uint32_16toStringIP_Port(uint32 ip, uint16 port) +{ + return wxString::Format(wxT("%u.%u.%u.%u:%u"),(uint8)ip,(uint8)(ip>>8),(uint8)(ip>>16),(uint8)(ip>>24),port); +} + + +/** + * Parses a String-IP and saves the IP in the referenced variable. + * + * @param strIP A string-ip in the format "a.b.c.d". + * @param Ip The value to save the result in. + * @return True if the string was parsed, false otherwise. + * + * When parsing the IP address, whitespace before or after the + * ip-address is ignored and the resulting IP is saved in + * anti-host order. + * + * The reason for the existance of this function is the fact that + * the standard inet_aton function treats numbers with 0 prefixed + * as octals, which is desirable. + * + * Note: The reference value will not be changed unless the string + * contains a valid IP adress. + */ +bool StringIPtoUint32(const wxString &strIP, uint32& Ip); + + +/** + * Parses a String-IP and returns the IP or 0 if it was invalid. + * + * @param strIP A string-ip in the format "a.b.c.d". + * @return The resulting IP-address or zero if invalid (or 0.0.0.0). + * + * The IP will be saved in anti-host order. + */ +inline uint32 StringIPtoUint32(const wxString &strIP) +{ + uint32 ip = 0; + StringIPtoUint32( strIP, ip ); + + return ip; +} +/** + * Parses a String-IHost and returns the IP or 0 if it was invalid. + * + * @param Host A string with the Host to convert. + * @return The resulting IP-address or zero if invalid (or 0.0.0.0). + * + * The IP will be saved in anti-host order. + */ +uint32 StringHosttoUint32(const wxString &Host); + +/** + * Checks for invalid IP-values. + * + * @param IP the IP-address to check. + * @param filterLAN Specifies if LAN IP-ranges should be filtered. + * @return True if it was valid, false otherwise. + * + * Note: IP must be in anti-host order (BE on LE platform, LE on BE platform). + */ +bool IsGoodIP( uint32 IP, bool filterLAN ); + +inline bool IsGoodIPPort(uint32 nIP, uint16 nPort) +{ + return IsGoodIP(nIP, true) && nPort!=0; +} + +#define HIGHEST_LOWID_ED2K_KAD 16777216 + +inline bool IsLowID(uint32 id) { + return (id < HIGHEST_LOWID_ED2K_KAD); +} + +#endif // NETWORK_FUNCTIONS_H +// File_checked_for_headers diff --git a/src/OScopeCtrl.cpp b/src/OScopeCtrl.cpp new file mode 100644 index 00000000..c3c5c4af --- /dev/null +++ b/src/OScopeCtrl.cpp @@ -0,0 +1,625 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include +#include +#include + +#include + +#include "amule.h" // Needed for theApp +#include "amuleDlg.h" // Needed for CamuleDlg +#include "Logger.h" // Needed for AddLogLineM +#include "OScopeCtrl.h" // Interface declarations +#include "OtherFunctions.h" // Needed for CastSecondsToHM + +BEGIN_EVENT_TABLE(COScopeCtrl,wxControl) + EVT_PAINT(COScopeCtrl::OnPaint) + EVT_SIZE(COScopeCtrl::OnSize) + EVT_TIMER(TIMER_OSCOPE,COScopeCtrl::OnTimer) +END_EVENT_TABLE() + + +COScopeCtrl::COScopeCtrl(int cntTrends, int nDecimals, StatsGraphType type, wxWindow*parent) + : wxControl(parent,-1, wxDefaultPosition, wxDefaultSize), timerRedraw(this, TIMER_OSCOPE) +{ +COLORREF crPreset [ 16 ] = { + RGB( 0xFF, 0x00, 0x00 ), RGB( 0xFF, 0xC0, 0xC0 ), + RGB( 0xFF, 0xFF, 0x00 ), RGB( 0xFF, 0xA0, 0x00 ), + RGB( 0xA0, 0x60, 0x00 ), RGB( 0x00, 0xFF, 0x00 ), + RGB( 0x00, 0xA0, 0x00 ), RGB( 0x00, 0x00, 0xFF ), + RGB( 0x00, 0xA0, 0xFF ), RGB( 0x00, 0xFF, 0xFF ), + RGB( 0x00, 0xA0, 0xA0 ), RGB( 0xC0, 0xC0, 0xFF ), + RGB( 0xFF, 0x00, 0xFF ), RGB( 0xA0, 0x00, 0xA0 ), + RGB( 0xFF, 0xFF, 0xFF ), RGB( 0x80, 0x80, 0x80 ) +}; + // since plotting is based on a LineTo for each new point + // we need a starting point (i.e. a "previous" point) + // use 0.0 as the default first point. + // these are public member variables, and can be changed outside + // (after construction). + // G.Hayduk: NTrends is the number of trends that will be drawn on + // the plot. First 15 plots have predefined colors, but others will + // be drawn with white, unless you call SetPlotColor + nTrends = cntTrends; + pdsTrends = new PlotData_t[nTrends]; + + dcPlot=NULL; + dcGrid=NULL; + bmapPlot=NULL; + bmapGrid=NULL; + memDC = NULL; + memBitmap = NULL; + + PlotData_t* ppds = pdsTrends; + for(unsigned i=0; icrPlot = (i<15 ? crPreset[i] : RGB(255, 255, 255)); + ppds->penPlot=*(wxThePenList->FindOrCreatePen(wxColour(GetRValue(ppds->crPlot),GetGValue(ppds->crPlot),GetBValue(ppds->crPlot)),1,wxSOLID)); + ppds->fPrev = ppds->fLowerLimit = ppds->fUpperLimit = 0.0; + } + + oldwidth=oldheight=0; + bRecreateGraph = bRecreateGrid = bStopped = false; + nDelayedPoints = 0; + sLastTimestamp = 0.0; + sLastPeriod = 1.0; + nShiftPixels = 1; + nYDecimals = nDecimals; + crBackground = RGB( 0, 0, 0) ; // see also SetBackgroundColor + crGrid = RGB( 0, 255, 255) ; // see also SetGridColor + brushBack=*(wxTheBrushList->FindOrCreateBrush(wxColour(GetRValue(crBackground),GetGValue(crBackground),GetBValue(crBackground)),wxSOLID)); + + strXUnits = wxT("X"); // can also be set with SetXUnits + strYUnits = wxT("Y"); // can also be set with SetYUnits + + bmapOldGrid = NULL ; + bmapOldPlot = NULL ; + + nXGrids = 6; + nYGrids = 5; + + graph_type = type; + + timerRedraw.SetOwner(this); + + // Ensure that various size-constraints are calculated (via OnSize). + SetClientSize(GetClientSize()); +} // COScopeCtrl + + + +COScopeCtrl::~COScopeCtrl() +{ + // just to be picky restore the bitmaps for the two memory dc's + // (these dc's are being destroyed so there shouldn't be any leaks) + if (bmapOldGrid != NULL) + dcGrid->SelectObject(wxNullBitmap); + if (bmapOldPlot != NULL) + dcPlot->SelectObject(wxNullBitmap); + delete [] pdsTrends; + + if (memDC) { + memDC->SelectObject(wxNullBitmap); + } + + delete memDC; + delete dcGrid; + delete dcPlot; + if(bmapPlot) delete bmapPlot; + if(bmapGrid) delete bmapGrid; + if (memBitmap) delete memBitmap; +} // ~COScopeCtrl + + +void COScopeCtrl::SetRange(float fLower, float fUpper, unsigned iTrend) +{ + PlotData_t* ppds = pdsTrends+iTrend; + if ((ppds->fLowerLimit == fLower) && (ppds->fUpperLimit == fUpper)) + return; + ppds->fLowerLimit = fLower; + ppds->fUpperLimit = fUpper; + ppds->fVertScale = (float)nPlotHeight / (fUpper-fLower); + ppds->yPrev = GetPlotY(ppds->fPrev, ppds); + if (iTrend==0) + InvalidateCtrl(); + else + InvalidateGraph(); +} // SetRange + + +void COScopeCtrl::SetRanges(float fLower, float fUpper) +{ + for(unsigned iTrend=0; iTrendcrPlot == cr) + return; + ppds->crPlot = cr; + ppds->penPlot=*(wxThePenList->FindOrCreatePen(wxColour(GetRValue(ppds->crPlot),GetGValue(ppds->crPlot),GetBValue(ppds->crPlot)),1,wxSOLID)); + InvalidateGraph(); +} // SetPlotColor + + +void COScopeCtrl::SetBackgroundColor(COLORREF cr) +{ + if (crBackground == cr) + return; + crBackground = cr; + brushBack=*(wxTheBrushList->FindOrCreateBrush(wxColour(GetRValue(crBackground),GetGValue(crBackground),GetBValue(crBackground)),wxSOLID)); + InvalidateCtrl() ; +} // SetBackgroundColor + + +void COScopeCtrl::RecreateGrid() +{ + + if (!dcGrid) { + return; + } + + // There is a lot of drawing going on here - particularly in terms of + // drawing the grid. Don't panic, this is all being drawn (only once) + // to a bitmap. The result is then BitBlt'd to the control whenever needed. + bRecreateGrid = false; + if(nClientWidth==0 || nClientHeight==0) + return; + unsigned j, GridPos; + int nCharacters ; + wxPen solidPen=*(wxThePenList->FindOrCreatePen(wxColour(GetRValue(crGrid),GetGValue(crGrid),GetBValue(crGrid)),1,wxSOLID)); + wxString strTemp; + + // fill the grid background + dcGrid->SetBrush(brushBack); + dcGrid->SetPen(*wxTRANSPARENT_PEN); + dcGrid->DrawRectangle(rectClient.left,rectClient.top,rectClient.right-rectClient.left, + rectClient.bottom-rectClient.top); + // draw the plot rectangle: determine how wide the y axis scaling values are, + // add the units digit, decimal point, one decimal place, and an extra space + nCharacters = std::abs((int)std::log10(std::fabs(pdsTrends[0].fUpperLimit))) ; + nCharacters = std::max(nCharacters, std::abs((int)std::log10(std::fabs(pdsTrends[0].fLowerLimit)))) + 4; + + // adjust the plot rectangle dimensions + // assume 6 pixels per character (this may need to be adjusted) + rectPlot.left = rectClient.left + 6*7+4; + nPlotWidth = rectPlot.right-rectPlot.left; + // draw the plot rectangle + dcGrid->SetPen(solidPen); + dcGrid->DrawLine(rectPlot.left-1,rectPlot.top,rectPlot.right+1,rectPlot.top); + dcGrid->DrawLine(rectPlot.right+1,rectPlot.top,rectPlot.right+1,rectPlot.bottom+1); + dcGrid->DrawLine(rectPlot.right+1,rectPlot.bottom+1,rectPlot.left-1,rectPlot.bottom+1); + dcGrid->DrawLine(rectPlot.left-1,rectPlot.bottom+1,rectPlot.left-1,rectPlot.top); + dcGrid->SetPen(wxNullPen); + + // draw the dotted lines, + // G.Hayduk: added configurable number of grids + wxColour col(GetRValue(crGrid),GetGValue(crGrid),GetBValue(crGrid)); + wxPen grPen(col,1,wxSOLID); + dcGrid->SetPen(grPen); + + for(j=1; j<(nYGrids+1); ++j){ + GridPos = (rectPlot.bottom-rectPlot.top)*j/( nYGrids + 1 ) + rectPlot.top ; + for (unsigned int i = rectPlot.left; i < rectPlot.right; i += 4) + dcGrid->DrawPoint(i,GridPos); + } + + // create some fonts (horizontal and vertical) + wxFont* axisFont = new wxFont(10,wxSWISS,wxNORMAL,wxNORMAL,FALSE); + dcGrid->SetFont(*axisFont);//,this); + + // y max + dcGrid->SetTextForeground(wxColour(GetRValue(crGrid),GetGValue(crGrid),GetBValue(crGrid))); + if( strYMax.IsEmpty() ) { + strTemp = wxString::Format(wxT("%.*f"), nYDecimals, pdsTrends[ 0 ].fUpperLimit); + } else { + strTemp = strYMax; + } + wxCoord sizX,sizY; + dcGrid->GetTextExtent(strTemp,&sizX,&sizY); + dcGrid->DrawText(strTemp,rectPlot.left-4-sizX,rectPlot.top-7); + // y min + if( strYMin.IsEmpty() ) { + strTemp = wxString::Format(wxT("%.*f"), nYDecimals, pdsTrends[ 0 ].fLowerLimit) ; + } else { + strTemp = strYMin; + } + dcGrid->GetTextExtent(strTemp,&sizX,&sizY); + dcGrid->DrawText(strTemp,rectPlot.left-4-sizX, rectPlot.bottom); + + // x units + strTemp = CastSecondsToHM((nPlotWidth/nShiftPixels) * (int)floor(sLastPeriod+0.5)); + // floor(x + 0.5) is a way of doing round(x) that works with gcc < 3 ... + if (bStopped) { + strXUnits = CFormat( _("Disabled [%s]") ) % strTemp; + } else { + strXUnits = strTemp; + } + + dcGrid->GetTextExtent(strXUnits,&sizX,&sizY); + dcGrid->DrawText(strXUnits,(rectPlot.left+rectPlot.right)/2-sizX/2,rectPlot.bottom+4); + + // y units + if (!strYUnits.IsEmpty()) { + dcGrid->GetTextExtent(strYUnits,&sizX,&sizY); + dcGrid->DrawText(strYUnits, rectPlot.left-4-sizX, (rectPlot.top+rectPlot.bottom)/2-sizY/2); + } +// if(!strYUnits.IsEmpty()) +// dcGrid->DrawRotatedText(strYUnits,(rectClient.left+rectPlot.left+4)/2/*+(sizY*2)*/, +// ((rectPlot.bottom+rectPlot.top)/2)+sizX/2,90.0); + // no more drawing to this bitmap is needed until the setting are changed + + delete axisFont; + + if (bRecreateGraph) + RecreateGraph(false); + // finally, force the plot area to redraw + wxRect rect; + rect.x=rectClient.left; + rect.y=rectClient.top; + rect.width=rectClient.right-rectClient.left; + rect.height=rectClient.bottom-rectClient.top; + Refresh(FALSE,&rect); +} // RecreateGrid + + +void COScopeCtrl::AppendPoints(double sTimestamp, const std::vector &apf) +{ + sLastTimestamp = sTimestamp; + ShiftGraph(1); + DrawPoints(apf, 1); + Refresh(FALSE); +} // AppendPoints + + + +void COScopeCtrl::OnPaint(wxPaintEvent& WXUNUSED(evt)) +{ // no real plotting work is performed here unless we are coming out of a hidden state; + // normally, just putting the existing bitmaps on the client to avoid flicker, + // establish a memory dc and then BitBlt it to the client + if (bRecreateGrid || bRecreateGraph) { + timerRedraw.Stop(); + if (bRecreateGrid) + RecreateGrid(); // this will also recreate the graph if that flag is set + else if (bRecreateGraph) + RecreateGraph(true); + } + + if (nDelayedPoints>0) { // we've just come out of hiding, so catch up + int n = std::min(nPlotWidth, nDelayedPoints); + nDelayedPoints = 0; // (this is more efficient than plotting in the + PlotHistory(n, true, false); // background because the bitmap is shifted only + } // once for all delayed points together) + + wxPaintDC dc(this); + DoBlit(); + dc.Blit(0,0,nClientWidth,nClientHeight, memDC,0,0); + +} // OnPaint + +void COScopeCtrl::DoBlit() +{ + if (!memDC) { + wxASSERT(!memBitmap); + memBitmap = new wxBitmap(nClientWidth,nClientHeight); + memDC = new wxMemoryDC; + memDC->SelectObject(*memBitmap); + } else { + wxASSERT(memBitmap); + if ((memBitmap->GetHeight() != nClientHeight) + || (memBitmap->GetWidth() != nClientWidth)) { + // New bitmap. + memDC->SelectObject(wxNullBitmap); + delete memBitmap; + memBitmap = new wxBitmap(nClientWidth,nClientHeight); + memDC->SelectObject(*memBitmap); + } + } + + wxASSERT(memDC); + + // We have assured that we have a valid and resized if needed + // wxDc and bitmap. Proceed to blit. + + memDC->Blit(0,0,nClientWidth,nClientHeight,dcGrid,0,0); + // now add the plot on top as a "pattern" via SRCPAINT. + // works well with dark background and a light plot + memDC->Blit(0,0,nClientWidth,nClientHeight,dcPlot,0,0 +#ifndef __WXMAC__ + ,wxOR +#endif + ); + + // Ready. + +} + + +void COScopeCtrl::OnSize(wxSizeEvent& evt) +{ + // This gets called repeatedly as the user resizes the app; + // we use the timer mechanism through InvalidateCtrl to avoid unnecessary redrawing + // NOTE: OnSize automatically gets called during the setup of the control + if(oldwidth==evt.GetSize().GetWidth() && oldheight==evt.GetSize().GetHeight()) + return; + oldwidth=evt.GetSize().GetWidth(); + oldheight=evt.GetSize().GetHeight(); + wxRect myrect=GetClientRect(); + rectClient.left=myrect.x; + rectClient.top=myrect.y; + rectClient.right=myrect.x+myrect.width; + rectClient.bottom=myrect.y+myrect.height; + if(myrect.width<1 || myrect.height<1) + return; + + // set some member variables to avoid multiple function calls + nClientHeight = myrect.height; + nClientWidth = myrect.width; + // the "left" coordinate and "width" will be modified in + // InvalidateCtrl to be based on the y axis scaling + rectPlot.left = 20 ; + rectPlot.top = 10 ; + rectPlot.right = std::max(rectPlot.left+1, rectClient.right-10); + rectPlot.bottom = std::max(rectPlot.top+1, rectClient.bottom-25); + nPlotHeight = rectPlot.bottom-rectPlot.top; + nPlotWidth = rectPlot.right-rectPlot.left; + PlotData_t* ppds = pdsTrends; + for(unsigned iTrend=0; iTrendfVertScale = (float)nPlotHeight / (ppds->fUpperLimit-ppds->fLowerLimit); + ppds->yPrev = GetPlotY(ppds->fPrev, ppds); + } + + // destroy grid dc and bitmap (InvalidateCtrl recreates them in new size) + if(dcGrid) { + dcGrid->SelectObject(wxNullBitmap); + delete dcGrid; + } + dcGrid=new wxMemoryDC; + if(bmapGrid) + delete bmapGrid; + bmapGrid = new wxBitmap(nClientWidth,nClientHeight); + dcGrid->SelectObject(*bmapGrid); + + if(dcPlot) { + dcPlot->SelectObject(wxNullBitmap); + delete dcPlot; + } + dcPlot=new wxMemoryDC; + if(bmapPlot) + delete bmapPlot; + bmapPlot = new wxBitmap(nClientWidth, nClientHeight); + dcPlot->SelectObject(*bmapPlot); + + InvalidateCtrl(); +} // OnSize + + +void COScopeCtrl::ShiftGraph(unsigned cntPoints) +{ + if (dcPlot == NULL) + return; + unsigned cntPixelOffset = cntPoints*nShiftPixels; + if (cntPixelOffset >= (unsigned)nPlotWidth) + cntPixelOffset = nPlotWidth; + else + dcPlot->Blit(rectPlot.left,rectPlot.top+1, nPlotWidth, nPlotHeight, dcPlot, + rectPlot.left+cntPixelOffset, rectPlot.top+1); // scroll graph to the left + // clear a rectangle over the right side of plot prior to adding the new points + dcPlot->SetPen(*wxTRANSPARENT_PEN); + dcPlot->SetBrush(brushBack); // fill with background color + dcPlot->DrawRectangle(rectPlot.right-cntPixelOffset+1, rectPlot.top, + cntPixelOffset, rectPlot.bottom-rectPlot.top+1); +} // ShiftGraph + + + +unsigned COScopeCtrl::GetPlotY(float fPlot, PlotData_t* ppds) +{ + if (fPlot <= ppds->fLowerLimit) + return rectPlot.bottom; + else if (fPlot >= ppds->fUpperLimit) + return rectPlot.top+1; + else + return rectPlot.bottom - (unsigned)((fPlot - ppds->fLowerLimit) * ppds->fVertScale); +} // GetPlotY + + + +void COScopeCtrl::DrawPoints(const std::vector &apf, unsigned cntPoints) +{ // this appends a new set of data points to a graph; all of the plotting is + // directed to the memory based bitmap associated with dcPlot + // the will subsequently be BitBlt'd to the client in OnPaint + if (dcPlot == NULL) { + printf("COScopeCtrl::DrawPoints - dcPlot==NULL unexpected\n"); + return; + } + // draw the next line segement + unsigned x, y, yPrev; + unsigned cntPixelOffset = std::min((unsigned)(nPlotWidth-1), (cntPoints-1)*nShiftPixels); + PlotData_t* ppds = pdsTrends; + + for (unsigned iTrend=0; iTrendyPrev; + dcPlot->SetPen(ppds->penPlot); + for (x=rectPlot.right-cntPixelOffset; x<=rectPlot.right; x+=nShiftPixels) { + y = GetPlotY(*pf--, ppds); + dcPlot->DrawLine(x-nShiftPixels, yPrev, x, y); + yPrev = y; + } + ppds->fPrev = *(pf+1); + ppds->yPrev = yPrev; + } +} // DrawPoints + + +#ifndef CLIENT_GUI +void COScopeCtrl::PlotHistory(unsigned cntPoints, bool bShiftGraph, bool bRefresh) +{ + wxASSERT(graph_type != GRAPH_INVALID); + + if (graph_type != GRAPH_INVALID) { + unsigned i; + unsigned cntFilled; + std::vector apf(nTrends); + try { + for (i = 0; i < nTrends; ++i) { + apf[i] = new float[cntPoints]; + } + double sFinal = (bStopped ? sLastTimestamp : -1.0); + cntFilled = theApp->m_statistics->GetHistory(cntPoints, sLastPeriod, sFinal, apf, graph_type); + if (cntFilled >1 || (bShiftGraph && cntFilled!=0)) { + if (bShiftGraph) { // delayed points - we have an fPrev + ShiftGraph(cntFilled); + } else { // fresh graph, we need to preset fPrev, yPrev + PlotData_t* ppds = pdsTrends; + for(i=0; iyPrev = GetPlotY(ppds->fPrev = *(apf[i] + cntFilled - 1), ppds); + cntFilled--; + } + DrawPoints(apf, cntFilled); + if (bRefresh) + Refresh(FALSE); + } + for (i = 0; i < nTrends; ++i) { + delete [] apf[i]; + } + } catch(std::bad_alloc) { + // Failed memory allocation + AddLogLineM(true, wxString( + wxT("Error: COScopeCtrl::PlotHistory: Insuficient memory, cntPoints == ")) << + cntPoints << wxT(".")); + for (i = 0; i < nTrends; ++i) { + delete [] apf[i]; + } + } + } else { + // No history (yet) for Kad. + } +} // PlotHistory +#else +//#warning CORE/GUI -- EC needed +void COScopeCtrl::PlotHistory(unsigned, bool, bool) +{ +} +#endif + + +void COScopeCtrl::RecreateGraph(bool bRefresh) +{ + bRecreateGraph = false; + nDelayedPoints = 0; + dcPlot->SetBrush(brushBack); + dcPlot->SetPen(*wxTRANSPARENT_PEN); + dcPlot->DrawRectangle(rectClient.left, rectClient.top, rectClient.right-rectClient.left, + rectClient.bottom-rectClient.top); + PlotHistory(nPlotWidth, false, bRefresh); +} // RecreateGraph + + +void COScopeCtrl::Reset(double sNewPeriod) +{ + bool bStoppedPrev = bStopped; + bStopped = false; + if (sLastPeriod != sNewPeriod || bStoppedPrev) { + sLastPeriod = sNewPeriod; + InvalidateCtrl(); + } +} // Reset + + +void COScopeCtrl::Stop() +{ + bStopped = true; + bRecreateGraph = false; + RecreateGrid(); +} // Stop + + +void COScopeCtrl::InvalidateCtrl(bool bInvalidateGraph, bool bInvalidateGrid) +{ + timerRedraw.Stop(); + timerRedraw.SetOwner(this,TIMER_OSCOPE); + if (bInvalidateGraph) + bRecreateGraph = true; + if (bInvalidateGrid) + bRecreateGrid = true; + timerRedraw.Start(100); +} // InvalidateCtrl + + +void COScopeCtrl::OnTimer(wxTimerEvent& WXUNUSED(evt)) +/* The timer is used to consolidate redrawing of the graphs: when the user resizes + the application, we get multiple calls to OnSize. If he changes several parameters + in the Preferences, we get several individual SetXYZ calls. If we were to try to + recreate the graphs for each such event, performance would be sluggish, but with + the timer, each event (if they come in quick succession) simply restarts the timer + until there is a little pause and OnTimer actually gets called and does its work. +*/ +{ + if( !theApp->amuledlg || !theApp->amuledlg->SafeState()) { + return; + } + timerRedraw.Stop(); + if (bRecreateGrid) { + RecreateGrid(); // this will also recreate the graph if that flag is set + } else if (bRecreateGraph) { + RecreateGraph(true); + } + +} // OnTimer +// File_checked_for_headers diff --git a/src/OScopeCtrl.h b/src/OScopeCtrl.h new file mode 100644 index 00000000..d508638b --- /dev/null +++ b/src/OScopeCtrl.h @@ -0,0 +1,145 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef OSCOPECTRL_H +#define OSCOPECTRL_H + +#ifndef NULL +#define NULL 0 +#endif + +#include // Needed for wxControl +#include // Needed for wxTimer +#include + +#include "Color.h" // Needed for COLORREF and RGB +#include "Statistics.h" // Needed for StatsGraphType + +class wxMemoryDC; + +///////////////////////////////////////////////////////////////////////////// +// COScopeCtrl window + +#define TIMER_OSCOPE 7641 + +class COScopeCtrl : public wxControl +{ + friend class CStatisticsDlg; + +public: + COScopeCtrl(int NTrends, int nDecimals, StatsGraphType type, wxWindow* parent=NULL); + ~COScopeCtrl(); + + void SetRange(float dLower, float dUpper, unsigned iTrend = 0); + void SetRanges(float dLower, float dUpper); + void SetXUnits(const wxString& string, + const wxString& XMin = wxEmptyString, const wxString& XMax = wxEmptyString); + void SetYUnits(const wxString& string, + const wxString& YMin = wxEmptyString, const wxString& YMax = wxEmptyString); + void SetBackgroundColor(COLORREF color); + void SetGridColor(COLORREF color); + void SetPlotColor(COLORREF color, unsigned iTrend = 0); + COLORREF GetPlotColor(unsigned iTrend = 0) {return pdsTrends[iTrend].crPlot;} + float GetUpperLimit() { return pdsTrends[0].fUpperLimit; } + void Reset(double sNewPeriod); + void Stop(); + void RecreateGraph(bool bRefresh=true); + void RecreateGrid(); + void AppendPoints(double sTimestamp, const std::vector &apf); + void DelayPoints() { nDelayedPoints++; } + unsigned GetPlotHeightPixels() { return nPlotHeight; } + unsigned GetPlotWidthPoints() { return nPlotWidth/nShiftPixels; } + wxBitmap* GetBitmapPlot() { return bmapPlot; } + wxBitmap* GetBitmapGrid() { return bmapGrid; } + + StatsGraphType graph_type; + +public: + unsigned nTrends; + unsigned nXGrids; + unsigned nYGrids; + unsigned nShiftPixels; // amount to shift with each new point + unsigned nYDecimals; + + wxString strXUnits, strXMin, strXMax; + wxString strYUnits, strYMin, strYMax; + COLORREF crBackground; + COLORREF crGrid; + + typedef struct PlotDataStruct { + COLORREF crPlot; // data plot color + wxPen penPlot; + unsigned yPrev; + float fPrev; + float fLowerLimit; // lower bounds + float fUpperLimit; // upper bounds + float fVertScale; + } PlotData_t ; + + +protected: + DECLARE_EVENT_TABLE() + PlotData_t *pdsTrends; + + int nClientHeight; + int nClientWidth; + int nPlotHeight; + int nPlotWidth; + + RECT rectClient; + RECT rectPlot; + wxBrush brushBack; + + wxMemoryDC* dcGrid; + wxMemoryDC* dcPlot; + wxMemoryDC* memDC; + wxBitmap* memBitmap; + wxBitmap* bmapOldGrid; + wxBitmap* bmapOldPlot; + wxBitmap* bmapGrid; + wxBitmap* bmapPlot; + void InvalidateGraph() { InvalidateCtrl(true, false); } + void InvalidateGrid() { InvalidateCtrl(false, true); } + +private: + int oldwidth, oldheight; + bool bRecreateGrid, bRecreateGraph, bStopped; + int nDelayedPoints; + double sLastTimestamp; + double sLastPeriod; + wxTimer timerRedraw; + void OnTimer(wxTimerEvent& evt); + void OnPaint(wxPaintEvent& evt); + void OnSize(wxSizeEvent& evt); + void ShiftGraph(unsigned cntPoints); + void PlotHistory(unsigned cntPoints, bool bShiftGraph, bool bRefresh); + void DrawPoints(const std::vector &apf, unsigned cntPoints); + unsigned GetPlotY(float fPlot, PlotData_t* ppds); + void InvalidateCtrl(bool bInvalidateGraph = true, bool bInvalidateGrid = true); + void DoBlit(); +}; + +#endif // OSCOPECTRL_H +// File_checked_for_headers diff --git a/src/Observable.h b/src/Observable.h new file mode 100644 index 00000000..e6858db6 --- /dev/null +++ b/src/Observable.h @@ -0,0 +1,307 @@ +// +// This file is part of the aMule Project. +// +// Copyright (C) 2005-2008 Mikkel Schubert ( xaignar@users.sourceforge.net ) +// Copyright (C) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef OBSERVABLE_H +#define OBSERVABLE_H + + +#include + +#include "OtherFunctions.h" // Needed for CMutexUnlocker + + +template class CObservable; + + +/** + * This class implements the observable part of an Observer/Observable pattern. + * + * The EventType paramter is used to specify a protocol for the event-type used + * by a particular Observer/Observable set and allows for any level of + * information passing to be used, depending on the context. + * + * In order to simplify matters for subclasses, both the Observer and the + * Observable class keep track of which objects are observing what, so that + * instances can safely be created and destroyed without having to manually + * keep the observers and observables in sync. + */ +template +class CObserver +{ + friend class CObservable; +public: + typedef CObservable ObservableType; + + /** + * Destructor. + * + * All observables which has this object registered are notified + * as to avoid dangling pointers. This will not result in actual + * events. + */ + virtual ~CObserver(); + + +protected: + /** + * This function is called when an observed subject publishes an event. + * + * @param o The publisher of the event. + * @param e The actual event. + */ + virtual void ReceiveNotification( const ObservableType* o, const EventType& e ) = 0; + + +private: + //! Mutex used to make access to the list of observed objects thread safe. + wxMutex m_mutex; + + typedef std::set ObservableSetType; + //! List of objects being observed. + ObservableSetType m_list; +}; + + + +/** + * This class implements the Observable part of the Observer/Observable pattern. + */ +template +class CObservable +{ + friend class CObserver; + +public: + //! The observer-type accepted by this class + typedef CObserver ObserverType; + + + /** + * Destructor. + */ + virtual ~CObservable(); + + + /** + * This function subscribes an observer to events from this observable. + * + * @param o The observer that wishes to observe this object. + * @return True if it succesfully subscribed, false otherwise. + * + * If the subscription was succesful, ObserverAdded() will be called + * on "o", allowing the subclass to initialize the the observer's state. + */ + bool AddObserver( ObserverType* o ); + + /** + * This function removes an observer from the list of subscribers. + * + * @param o The observer to unsubscribe from this observable. + * @return True if the observer was removed, false otherwise. + * + * ObserverRemoved() will be called for the observer "o", allowing + * the subclass to take steps to avoid outdated data being kept. + */ + bool RemoveObserver( ObserverType* o ); + +protected: + /** + * This function notifies all or an specific observer of an event. + * + * @param e The event to be published. + * @param o A specific subscribing observer or NULL for all subscribers. + * + * The purpose of the second parameter is to allow notifications of + * specific observers when the ObserverAdded() or ObserverRemoved() + * functions are called and it should not be used outside of these + * functions. + */ + void NotifyObservers( const EventType& e, ObserverType* o = NULL ); + + + /** + * This function removes all observers from this object. + * + * ObserverRemoved is called on each observer. + */ + void RemoveAllObservers(); + + + /** + * This function is called when an observer has been added to the observable. + */ + virtual void ObserverAdded( ObserverType* ) {}; + + + /** + * This function is called when observers are removed from the observable. + * + * Exceptions to this are: + * - When the Observable is being destroyed. + * - When the Observer is being destroyed. + */ + virtual void ObserverRemoved( ObserverType* ) {}; + + +private: + //! Mutex used to ensure thread-safety of the basic operations. + wxMutex m_mutex; + + typedef std::set ObserverSetType; + typedef typename ObserverSetType::iterator myIteratorType; + + //! Set of all observers subscribing to this observable. + ObserverSetType m_list; +}; + + + + +/////////////////////////////////////////////////////////////////////////////// + + + + +template +CObserver::~CObserver() +{ + wxMutexLocker lock( m_mutex ); + + while ( !m_list.empty() ) { + ObservableType* o = *m_list.begin(); + + { + wxMutexLocker oLock(o->m_mutex); + o->m_list.erase( this ); + } + + m_list.erase( m_list.begin() ); + } +} + + +template +CObservable::~CObservable() +{ + wxMutexLocker lock( m_mutex ); + + while ( !m_list.empty() ) { + ObserverType* o = *m_list.begin(); + + { + wxMutexLocker oLock(o->m_mutex); + o->m_list.erase( this ); + } + + m_list.erase( m_list.begin() ); + } +} + + +template +bool CObservable::AddObserver( CObserver* o ) +{ + wxASSERT( o ); + + { + wxMutexLocker lock(m_mutex); + if ( !m_list.insert( o ).second ) { + return false; + } + } + + { + wxMutexLocker oLock(o->m_mutex); + o->m_list.insert( this ); + } + + ObserverAdded( o ); + + return true; +} + + +template +bool CObservable::RemoveObserver( CObserver* o ) +{ + wxASSERT( o ); + + { + wxMutexLocker lock(m_mutex); + if ( !m_list.erase( o ) ) { + return false; + } + } + + { + wxMutexLocker oLock(o->m_mutex); + o->m_list.erase( this ); + } + + ObserverRemoved( o ); + + return true; +} + + +template +void CObservable::NotifyObservers( const EventType& e, ObserverType* o ) +{ + wxMutexLocker lock(m_mutex); + + if ( o ) { + o->ReceiveNotification( this, e ); + } else { + myIteratorType it = m_list.begin(); + for ( ; it != m_list.end(); ) { + CMutexUnlocker unlocker(m_mutex); + (*it++)->ReceiveNotification( this, e ); + } + } +} + + +template +void CObservable::RemoveAllObservers() +{ + wxMutexLocker lock(m_mutex); + + while ( !m_list.empty() ) { + ObserverType* o = *m_list.begin(); + m_list.erase( m_list.begin() ); + CMutexUnlocker unlocker(m_mutex); + + { + wxMutexLocker oLock(o->m_mutex); + o->m_list.erase( this ); + } + + ObserverRemoved( o ); + } +} + + +#endif +// File_checked_for_headers diff --git a/src/ObservableQueue.h b/src/ObservableQueue.h new file mode 100644 index 00000000..e4e9739d --- /dev/null +++ b/src/ObservableQueue.h @@ -0,0 +1,435 @@ +// +// This file is part of the aMule Project. +// +// Copyright (C) 2005-2008 Mikkel Schubert ( xaignar@users.sourceforge.net ) +// Copyright (C) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef OBSERVABLEQUEUE_H +#define OBSERVABLEQUEUE_H + +#include "Observable.h" + + + +template +class CQueueObserver; + + +/** + * This class defines the protocol used by the CObservableQueue class. + * + * This specific protocol can be used by a class to make changes to its + * contents visible, assuming that said contents does not rely on being + * in a specific order, as insertions commands do not specify positions. + * + * The class CQueueObserver implements a queue that will always be kept + * in sync with the class observed, so that it is possible to handle all + * elements in a container object over a longer period of time, which + * would normally result in problems with changes accomulating in the list. + */ +template +class CQueueEvent +{ +public: + //! The type of list used by this protocol to store values. + typedef std::vector ValueList; + + //! The events used by this observable type. + //! Note: If more than one instance of a value has been added, removed or + //! updated, then the resulting events should reflect this fact by + //! including the same of instances as has been changed. + enum Type { + //! Signals a QueueObserver that it has been added to a queue. + STARTING, + //! Signals a QueueObserver that it has been removed from a queue. + STOPPING, + //! Signals that one or more values have been added. + INSERTED, + //! Signals that one or more values have been removed. + REMOVED, + //! Signals that the following values have been updated. + CHANGED, + //! Signals that all values have been removed. + CLEARED, + //! Contains the contents of the queue at subscription time. + INITIAL + }; + + + /** + * Constructor for misc events. + */ + CQueueEvent( Type event ); + + + /** + * Constructor for events regarding multiple values. + * + * Note: CQueueEvent does not take ownership of the specified list. + */ + CQueueEvent( Type event, const ValueList* list ); + + + /** + * Constructor for events regarding a single value + */ + CQueueEvent( Type event, const ValueType& value ); + + + /** + * Returns the event-type. + */ + Type GetEvent() const { + return m_type; + } + + /** + * Returns the number of available values passed with the event. + */ + size_t GetCount() const; + + /** + * Returns a copy of the ith value. + */ + ValueType GetValue( size_t i ) const; + + +private: + //! Pointer to a list of values. May be NULL. + const ValueList* m_list; + //! Pointer to a single value. May be NULL. + const ValueType* m_value; + //! The actual event-type. + Type m_type; +}; + + + +/** + * This class forms the superclass for observable queues or lists. + * + * The protocol defined above is used (CQueueEvent). + * + * By subclassing this class, a container object can ensure that classes + * observing it are able to keep in sync with the changes made to the + * contents, with a few limits. + * + * For one thing, the value is assumed to be both key and value, so + * multimaps cannot be used with this class, since it will only pass + * the key. Nor can lists that rely on a specific order be used, since + * neither insertion nor deletion operations specify a specific + * object or position, instead just a "add/remove one of these" rule. + * + * The main purpose of this class is to allow another class to follow + * a list or queue, regardles of changes in actual order of the items + * and regardles of changes to the contents. + */ +template +class CObservableQueue : public CObservable< CQueueEvent > +{ +public: + /** + * Destructor. + * + * Sends STOPPING to all observers. + */ + virtual ~CObservableQueue(); + +protected: + typedef CQueueEvent< ValueType > EventType; + typedef CObserver< EventType > ObserverType; + typedef typename EventType::ValueList ValueList; + + + /** + * Sends a STARTING event to new observers. + */ + virtual void ObserverAdded( ObserverType* ); + + /** + * Sends a STOPPING event to removed observers. + */ + virtual void ObserverRemoved( ObserverType* ); +}; + + + +/** + * This class is an automatically synchronized queue connected with an ObservableQueue. + * + * Note that this observer can only be assigned to ONE observable at a time! + * + * This class implements a queue (out-order not specified) that allows an + * ObservableQueue object to be object to be used as a queue without making + * by another object in a safe manner. Changes to the contents of the original + * queue are propagated to this queue, such that it will never contain values + * not found in the original queue and such that it will add new values added + * to the original queue. + * + * This allows the contents to be accessed safely, when for instance it is + * needed to iterate over the contents over a period of time, where one + * cannot be certain of the current state of the actual contents of the + * original lists. + * + * This class supersedes such broken solutions such as remembering the last + * used position in the original list, since no changes made to the original + * list will result in items being skipped or treated twice*. + * + * * With the exception of the same item being removed and then re-added, in + * which case the CQueueObserver class will consider it a new item. + */ +template +class CQueueObserver : public CObserver< CQueueEvent > +{ +public: + typedef CQueueEvent EventType; + typedef typename CObserver< EventType >::ObservableType ObservableType; + typedef typename EventType::ValueList ValueList; + + + /** + * Constructor. + */ + CQueueObserver(); + + + /** + * Overloaded notification function. + */ + void ReceiveNotification( const ObservableType*, const EventType& e ); + + + /** + * Returns the next element from the queue. + * + * Note: Objects will not be returned in the same order as + * they were found in the original observable. Also, note + * that calling GetNext() on an empty queue should only be + * done if the default contructed value does not match a + * valid object and can be used to check for End of Queue. + */ + ValueType GetNext(); + + /** + * Returns the number of remaining elements in the queue. + */ + size_t GetRemaining() const; + + /** + * Returns true if the observer is currently assigned to an observable-queue. + */ + bool IsActive() const; + + /** + * Clears the queue and readds itself to the current object being observed. + */ + void Reset(); + +private: + //! Lock used to ensure the threadsafety of the class + mutable wxMutex m_mutex; + + typedef std::multiset Queue; + typedef typename Queue::iterator QueueIterator; + //! The remaining items. + Queue m_queue; + + //! Used to check that we are only subscribed to one queue at a time + const ObservableType* m_owner; +}; + + + + +/////////////////////////////////////////////////// + + + + +template +CQueueEvent::CQueueEvent( Type event ) + : m_list( NULL ), + m_value( NULL ), + m_type( event ) +{ + +} + + +template +CQueueEvent::CQueueEvent( Type event, const ValueList* list ) + : m_list( list ), + m_value( NULL ), + m_type( event ) +{ + wxASSERT( list ); +} + + +template +CQueueEvent::CQueueEvent( Type event, const ValueType& value ) + : m_list( NULL ), + m_value( &value ), + m_type( event ) +{ +} + + +template +size_t CQueueEvent::GetCount() const { + if ( m_list ) { + return m_list->size(); + } else if ( m_value ) { + return 1; + } else { + return 0; + } +} + + +template +ValueType CQueueEvent::GetValue( size_t i ) const { + if ( m_list ) { + return (*m_list).at( i ); + } else if ( m_value && i == 0 ) { + return *m_value; + } else { + wxASSERT( false ); + return ValueType(); + } +} + + + + +template +CObservableQueue::~CObservableQueue() +{ + this->RemoveAllObservers(); +} + + +template +void CObservableQueue::ObserverAdded( ObserverType* o ) +{ + NotifyObservers( EventType( EventType::STARTING ), o ); +} + + +template +void CObservableQueue::ObserverRemoved( ObserverType* o ) +{ + NotifyObservers( EventType( EventType::STOPPING ), o ); +} + + + + +template +CQueueObserver::CQueueObserver() +{ + m_owner = NULL; +} + + +template +void CQueueObserver::ReceiveNotification( const ObservableType* o, const EventType& e ) +{ + wxMutexLocker lock( m_mutex ); + + if ( e.GetEvent() == EventType::INSERTED || e.GetEvent() == EventType::INITIAL ) { + for ( size_t i = 0; i < e.GetCount(); i++ ) { + m_queue.insert( e.GetValue( i ) ); + } + } else if ( e.GetEvent() == EventType::REMOVED ) { + for ( size_t i = 0; i < e.GetCount(); i++ ) { + QueueIterator it = m_queue.find( e.GetValue( i ) ); + + if ( it != m_queue.end() ) { + m_queue.erase( it ); + } + } + } else if ( e.GetEvent() == EventType::CLEARED ) { + m_queue.clear(); + } else if ( e.GetEvent() == EventType::STOPPING ) { + m_queue.clear(); + m_owner = NULL; + } else if ( e.GetEvent() == EventType::STARTING ) { + wxASSERT(m_owner == NULL); + m_owner = o; + } else { + wxASSERT( false ); + } +} + + +template +ValueType CQueueObserver::GetNext() +{ + wxMutexLocker lock( m_mutex ); + + if ( m_queue.size() ) { + ValueType v = *m_queue.begin(); + m_queue.erase( m_queue.begin() ); + + return v; + } + + return ValueType(); +} + + +template +size_t CQueueObserver::GetRemaining() const +{ + wxMutexLocker lock( m_mutex ); + + return m_queue.size(); +} + + +template +bool CQueueObserver::IsActive() const +{ + return m_owner; +} + + +template +void CQueueObserver::Reset() +{ + ObservableType* owner; + + { + wxMutexLocker lock(m_mutex); + m_queue.clear(); + owner = const_cast( m_owner ); + } + + owner->RemoveObserver( this ); + owner->AddObserver( this ); +} + + + +#endif +// File_checked_for_headers diff --git a/src/OtherFunctions.cpp b/src/OtherFunctions.cpp new file mode 100644 index 00000000..0f5953eb --- /dev/null +++ b/src/OtherFunctions.cpp @@ -0,0 +1,1241 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// The backtrace functions contain modified code from libYaMa, (c) Venkatesha Murthy G. +// You can check libYaMa at http://personal.pavanashree.org/libyama/ + +#include + +#include +#include // Needed for wxFileName +#include // Needed for wxLogNull + +#ifdef __WXMSW__ + #include // Do_not_auto_remove +#endif + +#ifdef HAVE_CONFIG_H +#include "config.h" // Needed for a number of defines +#endif + +#include // Do_not_auto_remove +#include +#include +#include +#include +#include "MD4Hash.h" +#include "Logger.h" + +#include "OtherFunctions.h" // Interface declarations + +#include + +#ifdef __WXBASE__ + #include +#else + #include +#endif + +#if !defined(AMULE_DAEMON) && (!defined(EC_REMOTE) || defined(CLIENT_GUI)) +#include "amule.h" // Needed for theApp +#endif + + +wxString GetMuleVersion() +{ + wxString ver(wxT(VERSION)); + + ver += wxT(" using "); + + + // Figure out the wx build-type + #ifdef __WXGTK__ + #ifdef __WXGTK20__ + ver += wxT("wxGTK2"); + #else + ver += wxT("wxGTK1"); + #endif + #elif defined(__WXMAC__) + ver += wxT("wxMac"); + #elif defined(__WXMSW__) + ver += wxT("wxMSW"); + #elif defined(__WXCOCOA__) + ver += wxT("wxCocoa"); + #endif + + ver += wxString::Format(wxT(" v%d.%d.%d"), wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER ); + +#if defined(__WXDEBUG__) + ver += wxT(" (Debugging)"); +#endif + +#ifdef SVNDATE + ver += wxString::Format( wxT(" (Snapshot: %s)"), wxT(SVNDATE)); +#endif + + return ver; +} + + +wxString GetFullMuleVersion() +{ +#ifdef AMULE_DAEMON + wxString app = wxT("aMuled"); +#elif defined(CLIENT_GUI) + wxString app = wxT("Remote aMule-GUI"); +#else + wxString app = wxT("aMule"); +#endif + + return app + wxT(" ") + GetMuleVersion(); +} + + +// Formats a filesize in bytes to make it suitable for displaying +wxString CastItoXBytes( uint64 count ) +{ + + if (count < 1024) + return wxString::Format( wxT("%.0f "), (float)(uint32)count) + wxPLURAL("byte", "bytes", count) ; + else if (count < 1048576) + return wxString::Format( wxT("%.0f "), (float)(uint32)count/1024) + _("kB") ; + else if (count < 1073741824) + return wxString::Format( wxT("%.2f "), (float)(uint32)count/1048576) + _("MB") ; + else if (count < 1099511627776LL) + return wxString::Format( wxT("%.2f "), (float)((uint32)(count/1024))/1048576) + _("GB") ; + else + return wxString::Format( wxT("%.3f "), (float)count/1099511627776LL) + _("TB") ; + + return _("Error"); +} + + +wxString CastItoIShort(uint64 count) +{ + + if (count < 1000) + return wxString::Format(wxT("%u"), (uint32)count); + else if (count < 1000000) + return wxString::Format(wxT("%.0f"),(float)(uint32)count/1000) + _("k") ; + else if (count < 1000000000) + return wxString::Format(wxT("%.2f"),(float)(uint32)count/1000000) + _("M") ; + else if (count < 1000000000000LL) + return wxString::Format(wxT("%.2f"),(float)((uint32)(count/1000))/1000000) + _("G") ; + else if (count < 1000000000000000LL) + return wxString::Format(wxT("%.2f"),(float)count/1000000000000LL) + _("T"); + + return _("Error"); +} + + +wxString CastItoSpeed(uint32 bytes) +{ + if (bytes < 1024) + return wxString::Format(wxT("%u "), bytes) + wxPLURAL("byte/sec", "bytes/sec", bytes); + else if (bytes < 1048576) + return wxString::Format(wxT("%.2f "), bytes / 1024.0) + _("kB/s"); + else + return wxString::Format(wxT("%.2f "), bytes / 1048576.0) + _("MB/s"); +} + + +// Make a time value in seconds suitable for displaying +wxString CastSecondsToHM(uint64 count, uint16 msecs) +{ + if (count < 60) { + if (!msecs) { + return wxString::Format( + wxT("%02") wxLongLongFmtSpec wxT("u "), + count) + _("secs"); + } else { + return wxString::Format( + wxT("%.3f"), + (count + ((float)msecs/1000))) + _("secs"); + } + } else if (count < 3600) { + return wxString::Format( + wxT("%") + wxLongLongFmtSpec wxT("u:%02") + wxLongLongFmtSpec wxT("u "), + count/60, + (count % 60)) + _("mins"); + } else if (count < 86400) { + return wxString::Format( + wxT("%") + wxLongLongFmtSpec wxT("u:%02") + wxLongLongFmtSpec wxT("u "), + count/3600, + (count % 3600)/60) + _("hours"); + } else { + return wxString::Format( + wxT("%") + wxLongLongFmtSpec wxT("u %s %02") + wxLongLongFmtSpec wxT("u:%02") + wxLongLongFmtSpec wxT("u "), + count/86400, + _("Days"), + (count % 86400)/3600, + (count % 3600)/60) + _("hours"); + } + + return _("Error"); +} + + +// Examines a filename and determines the filetype +FileType GetFiletype(const CPath& filename) +{ + // FIXME: WTF do we have two such functions in the first place? + switch (GetED2KFileTypeID(filename)) { + case ED2KFT_AUDIO: return ftAudio; + case ED2KFT_VIDEO: return ftVideo; + case ED2KFT_IMAGE: return ftPicture; + case ED2KFT_PROGRAM: return ftProgram; + case ED2KFT_DOCUMENT: return ftText; + case ED2KFT_ARCHIVE: return ftArchive; + case ED2KFT_CDIMAGE: return ftCDImage; + default: return ftAny; + } +} + + +// Returns the (translated) description assosiated with a FileType +wxString GetFiletypeDesc(FileType type, bool translated) +{ + switch ( type ) { + case ftVideo: + if (translated) { + return _("Videos"); + } else { + return wxT("Videos"); + } + break; + case ftAudio: + if (translated) { + return _("Audio"); + } else { + return wxT("Audio"); + } + break; + case ftArchive: + if (translated) { + return _("Archives"); + } else { + return wxT("Archives"); + } + break; + case ftCDImage: + if (translated) { + return _("CD-Images"); + } else { + return wxT("CD-Images"); + } + break; + case ftPicture: + if (translated) { + return _("Pictures"); + } else { + return wxT("Pictures"); + } + break; + case ftText: + if (translated) { + return _("Texts"); + } else { + return wxT("Texts"); + } + break; + case ftProgram: + if (translated) { + return _("Programs"); + } else { + return wxT("Programs"); + } + break; + default: + if (translated) { + return _("Any"); + } else { + return wxT("Any"); + } + break; + } +} + +// Returns the Typename, examining the extention of the given filename + +wxString GetFiletypeByName(const CPath& filename, bool translated) +{ + return GetFiletypeDesc(GetFiletype(filename), translated); +} + + +// Get the max number of connections that the OS supports, or -1 for default +int GetMaxConnections() +{ + int maxconn = -1; +#ifdef __WXMSW__ + // Try to get the max connection value in the registry + wxRegKey key( wxT("HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Services\\VxD\\MSTCP\\MaxConnections") ); + wxString value; + if ( key.Exists() ) { + value = key.QueryDefaultValue(); + } + if ( !value.IsEmpty() && value.IsNumber() ) { + long mc; + value.ToLong(&mc); + maxconn = (int)mc; + } else { + switch (wxGetOsVersion()) { + case wxOS_WINDOWS_9X: + // This includes all Win9x versions + maxconn = 50; + break; + case wxOS_WINDOWS_NT: + // This includes NT based windows + maxconn = 500; + break; + default: + // Anything else. Let aMule decide... + break; + } + } +#else + // Any other OS can just use the default number of connections +#endif + return maxconn; +} + + +// Return the text assosiated with a rating of a file +wxString GetRateString(uint16 rate) +{ + switch ( rate ) { + case 0: return _("Not rated"); + case 1: return _("Invalid / Corrupt / Fake"); + case 2: return _("Poor"); + case 3: return _("Fair"); + case 4: return _("Good"); + case 5: return _("Excellent"); + default: return _("Not rated"); + } +} + + +/** + * Return the size in bytes of the given size-type + * + * @param type The type (as an int) where: 0 = Byte, 1 = KB, 2 = MB, 3 = GB + * + * @return The amount of Bytes the provided size-type represents + * + * Values over GB aren't handled since the amount of Bytes 1TB represents + * is over the uint32 capacity + */ +uint32 GetTypeSize(uint8 type) +{ + enum {Bytes, KB, MB, GB}; + int size; + + switch(type) { + case Bytes: size = 1; break; + case KB: size = 1024; break; + case MB: size = 1048576; break; + case GB: size = 1073741824; break; + default: size = -1; break; + } + return size; +} + + +// Base16 chars for encode an decode functions +static wxChar base16Chars[17] = wxT("0123456789ABCDEF"); +static wxChar base32Chars[33] = wxT("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"); +#define BASE16_LOOKUP_MAX 23 +static wxChar base16Lookup[BASE16_LOOKUP_MAX][2] = { + { wxT('0'), 0x0 }, + { wxT('1'), 0x1 }, + { wxT('2'), 0x2 }, + { wxT('3'), 0x3 }, + { wxT('4'), 0x4 }, + { wxT('5'), 0x5 }, + { wxT('6'), 0x6 }, + { wxT('7'), 0x7 }, + { wxT('8'), 0x8 }, + { wxT('9'), 0x9 }, + { wxT(':'), 0x9 }, + { wxT(';'), 0x9 }, + { wxT('<'), 0x9 }, + { wxT('='), 0x9 }, + { wxT('>'), 0x9 }, + { wxT('?'), 0x9 }, + { wxT('@'), 0x9 }, + { wxT('A'), 0xA }, + { wxT('B'), 0xB }, + { wxT('C'), 0xC }, + { wxT('D'), 0xD }, + { wxT('E'), 0xE }, + { wxT('F'), 0xF } +}; + + +// Returns a BASE16 encoded byte array +// +// [In] +// buffer: Pointer to byte array +// bufLen: Lenght of buffer array +// +// [Return] +// wxString object with BASE16 encoded byte array +wxString EncodeBase16(const unsigned char* buffer, unsigned int bufLen) +{ + wxString Base16Buff; + + for(unsigned int i = 0; i < bufLen; ++i) { + Base16Buff += base16Chars[buffer[i] >> 4]; + Base16Buff += base16Chars[buffer[i] & 0xf]; + } + + return Base16Buff; +} + + +// Decodes a BASE16 string into a byte array +// +// [In] +// base16Buffer: String containing BASE16 +// base16BufLen: Lenght BASE16 coded string's length +// +// [Out] +// buffer: byte array containing decoded string +unsigned int DecodeBase16(const wxString &base16Buffer, unsigned int base16BufLen, byte *buffer) +{ + if (base16BufLen & 1) { + return 0; + } + unsigned int ret = base16BufLen >> 1; + memset( buffer, 0, ret); + for(unsigned int i = 0; i < base16BufLen; ++i) { + int lookup = toupper(base16Buffer[i]) - wxT('0'); + // Check to make sure that the given word falls inside a valid range + byte word = (lookup < 0 || lookup >= BASE16_LOOKUP_MAX) ? + 0xFF : base16Lookup[lookup][1]; + unsigned idx = i >> 1; + buffer[idx] = (i & 1) ? // odd or even? + (buffer[idx] | word) : (word << 4); + } + + return ret; +} + + +// Returns a BASE32 encoded byte array +// +// [In] +// buffer: Pointer to byte array +// bufLen: Lenght of buffer array +// +// [Return] +// wxString object with BASE32 encoded byte array +wxString EncodeBase32(const unsigned char* buffer, unsigned int bufLen) +{ + wxString Base32Buff; + unsigned int i, index; + unsigned char word; + + for(i = 0, index = 0; i < bufLen;) { + // Is the current word going to span a byte boundary? + if (index > 3) { + word = (buffer[i] & (0xFF >> index)); + index = (index + 5) % 8; + word <<= index; + if (i < bufLen - 1) { + word |= buffer[i + 1] >> (8 - index); + } + ++i; + } else { + word = (buffer[i] >> (8 - (index + 5))) & 0x1F; + index = (index + 5) % 8; + if (index == 0) { + ++i; + } + } + Base32Buff += (char) base32Chars[word]; + } + + return Base32Buff; +} + + +// Decodes a BASE32 string into a byte array +// +// [In] +// base32Buffer: String containing BASE32 +// base32BufLen: Lenght BASE32 coded string's length +// +// [Out] +// buffer: byte array containing decoded string +// [Return] +// nDecodeLen: +unsigned int DecodeBase32(const wxString &base32Buffer, unsigned int base32BufLen, unsigned char *buffer) +{ + size_t nInputLen = base32Buffer.Length(); + uint32 nDecodeLen = (nInputLen * 5) / 8; + if ((nInputLen * 5) % 8 > 0) { + ++nDecodeLen; + } + if (base32BufLen == 0) { + return nDecodeLen; + } + if (nDecodeLen > base32BufLen) { + return 0; + } + + uint32 nBits = 0; + int nCount = 0; + for (size_t i = 0; i < nInputLen; ++i) + { + if (base32Buffer[i] >= wxT('A') && base32Buffer[i] <= wxT('Z')) { + nBits |= ( base32Buffer[i] - wxT('A') ); + } + else if (base32Buffer[i] >= wxT('a') && base32Buffer[i] <= wxT('z')) { + nBits |= ( base32Buffer[i] - wxT('a') ); + } + else if (base32Buffer[i] >= wxT('2') && base32Buffer[i] <= wxT('7')) { + nBits |= ( base32Buffer[i] - wxT('2') + 26 ); + } else { + return 0; + } + nCount += 5; + if (nCount >= 8) + { + *buffer++ = (byte)( nBits >> (nCount - 8) ); + nCount -= 8; + } + nBits <<= 5; + } + + return nDecodeLen; +} + + +/* + * base64.c + * + * Base64 encoding/decoding command line filter + * + * Copyright (c) 2002 Matthias Gaertner 29.06.2002 + * Adapted by (C) 2005-2008 Phoenix to use wxWidgets. + * + */ +static const wxString to_b64( + /* 0000000000111111111122222222223333333333444444444455555555556666 */ + /* 0123456789012345678901234567890123456789012345678901234567890123 */ + wxT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")); + + +/* Option variables */ +static bool g_fUseCRLF = false; +static unsigned int g_nCharsPerLine = 72; +static wxString strHeaderLine; + + +wxString EncodeBase64(const char *pbBufferIn, unsigned int bufLen) +{ + wxString pbBufferOut; + wxString strHeader; + + if( !strHeaderLine.IsEmpty() ) { + strHeader = wxT("-----BEGIN ") + strHeaderLine + wxT("-----"); + if( g_fUseCRLF ) { + strHeader += wxT("\r"); + } + strHeader += wxT("\n"); + } + + unsigned long nDiv = ((unsigned long)bufLen) / 3; + unsigned long nRem = ((unsigned long)bufLen) % 3; + unsigned int NewLineSize = g_fUseCRLF ? 2 : 1; + + // Allocate enough space in the output buffer to speed up things + pbBufferOut.Alloc( + strHeader.Len() * 2 + // header/footer + (bufLen * 4) / 3 + 1 + // Number of codes + nDiv * NewLineSize + // Number of new lines + (nRem ? 1 : 0) * NewLineSize ); // Last line + pbBufferOut = strHeader; + + unsigned long nChars = 0; + const unsigned char *pIn = (unsigned char*)pbBufferIn; + while( nDiv > 0 ) { + pbBufferOut += to_b64[ (pIn[0] >> 2) & 0x3f]; + pbBufferOut += to_b64[((pIn[0] << 4) & 0x30) | ((pIn[1] >> 4) & 0xf)]; + pbBufferOut += to_b64[((pIn[1] << 2) & 0x3c) | ((pIn[2] >> 6) & 0x3)]; + pbBufferOut += to_b64[ pIn[2] & 0x3f]; + pIn += 3; + nDiv--; + nChars += 4; + if( nChars >= g_nCharsPerLine && g_nCharsPerLine != 0 ) { + nChars = 0; + if( g_fUseCRLF ) { + pbBufferOut += wxT("\r"); + } + pbBufferOut += wxT("\n"); + } + } + switch( nRem ) { + case 2: + pbBufferOut += to_b64[ (pIn[0] >> 2) & 0x3f]; + pbBufferOut += to_b64[((pIn[0] << 4) & 0x30) | ((pIn[1] >> 4) & 0xf)]; + pbBufferOut += to_b64[ (pIn[1] << 2) & 0x3c]; + pbBufferOut += wxT("="); + nChars += 4; + if( nChars >= g_nCharsPerLine && g_nCharsPerLine != 0 ) { + nChars = 0; + if( g_fUseCRLF ) { + pbBufferOut += wxT("\r"); + } + pbBufferOut += wxT("\n"); + } + break; + case 1: + pbBufferOut += to_b64[ (pIn[0] >> 2) & 0x3f]; + pbBufferOut += to_b64[ (pIn[0] << 4) & 0x30]; + pbBufferOut += wxT("="); + pbBufferOut += wxT("="); + nChars += 4; + if( nChars >= g_nCharsPerLine && g_nCharsPerLine != 0 ) { + nChars = 0; + if( g_fUseCRLF ) { + pbBufferOut += wxT("\r"); + } + pbBufferOut += wxT("\n"); + } + break; + } + + if( nRem > 0 ) { + if( nChars > 0 ) { + if( g_fUseCRLF ) { + pbBufferOut += wxT("\r"); + } + pbBufferOut += wxT("\n"); + } + } + + if( !strHeaderLine.IsEmpty() ) { + pbBufferOut = wxT("-----END ") + strHeaderLine + wxT("-----"); + if( g_fUseCRLF ) { + pbBufferOut += wxT("\r"); + } + pbBufferOut += wxT("\n"); + } + + return pbBufferOut; +} + + +unsigned int DecodeBase64(const wxString &base64Buffer, unsigned int base64BufLen, unsigned char *buffer) +{ + int z = 0; // 0 Normal, 1 skip MIME separator (---) to end of line + unsigned int nData = 0; + unsigned int i = 0; + + if (base64BufLen == 0) { + *buffer = 0; + nData = 1; + } + + for(unsigned int j = 0; j < base64BufLen; ++j) { + wxChar c = base64Buffer[j]; + wxChar bits = wxT('z'); + if( z > 0 ) { + if(c == wxT('\n')) { + z = 0; + } + } + else if(c >= wxT('A') && c <= wxT('Z')) { + bits = c - wxT('A'); + } + else if(c >= wxT('a') && c <= wxT('z')) { + bits = c - wxT('a') + (wxChar)26; + } + else if(c >= wxT('0') && c <= wxT('9')) { + bits = c - wxT('0') + (wxChar)52; + } + else if(c == wxT('+')) { + bits = (wxChar)62; + } + else if(c == wxT('/')) { + bits = (wxChar)63; + } + else if(c == wxT('-')) { + z = 1; + } + else if(c == wxT('=')) { + break; + } else { + bits = wxT('y'); + } + + // Skips anything that was not recognized + // as a base64 valid char ('y' or 'z') + if (bits < (wxChar)64) { + switch (nData++) { + case 0: + buffer[i+0] = (bits << 2) & 0xfc; + break; + case 1: + buffer[i+0] |= (bits >> 4) & 0x03; + buffer[i+1] = (bits << 4) & 0xf0; + break; + case 2: + buffer[i+1] |= (bits >> 2) & 0x0f; + buffer[i+2] = (bits << 6) & 0xc0; + break; + case 3: + buffer[i+2] |= bits & 0x3f; + break; + } + if (nData == 4) { + nData = 0; + i += 3; + } + } + } + if (nData == 1) { + // Syntax error or buffer was empty + *buffer = 0; + nData = 0; + i = 0; + } else { + buffer[i+nData] = 0; + } + + return i + nData; +} + + +// Returns the text assosiated with a category type +wxString GetCatTitle(int catid) +{ + switch (catid) { + case 0: return _("all"); + case 1: return _("all others"); + case 2: return _("Incomplete"); + case 3: return _("Completed"); + case 4: return _("Waiting"); + case 5: return _("Downloading"); + case 6: return _("Erroneous"); + case 7: return _("Paused"); + case 8: return _("Stopped"); + case 9: return _("Video"); + case 10: return _("Audio"); + case 11: return _("Archive"); + case 12: return _("CD-Images"); + case 13: return _("Pictures"); + case 14: return _("Text"); + case 15: return _("Active"); + default: return wxT("?"); + } +} + + +typedef std::map SED2KFileTypeMap; +typedef SED2KFileTypeMap::value_type SED2KFileTypeMapElement; +static SED2KFileTypeMap ED2KFileTypesMap; + + +class CED2KFileTypes{ +public: + CED2KFileTypes() + { + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".669"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".aac"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".aif"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".aiff"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".amf"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".ams"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".ape"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".au"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".dbm"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".dmf"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".dsm"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".far"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".flac"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".it"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mdl"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".med"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mid"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".midi"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mod"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mol"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mp1"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mp2"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mp3"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mp4"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mpa"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mpc"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mpp"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mtm"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".nst"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".ogg"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".okt"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".psm"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".ptm"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".ra"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".rmi"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".s3m"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".stm"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".ult"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".umx"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".wav"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".wma"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".wow"), ED2KFT_AUDIO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".xm"), ED2KFT_AUDIO)); + + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".asf"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".avi"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".divx"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".m1v"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".m2v"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mkv"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mov"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mp1v"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mp2v"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mpe"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mpeg"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mpg"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mps"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mpv"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mpv1"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mpv2"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".ogm"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".qt"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".ram"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".rm"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".rv"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".rv9"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".ts"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".vivo"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".vob"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".wmv"), ED2KFT_VIDEO)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".xvid"), ED2KFT_VIDEO)); + + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".bmp"), ED2KFT_IMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".dcx"), ED2KFT_IMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".emf"), ED2KFT_IMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".gif"), ED2KFT_IMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".ico"), ED2KFT_IMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".jpeg"), ED2KFT_IMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".jpg"), ED2KFT_IMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".pct"), ED2KFT_IMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".pcx"), ED2KFT_IMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".pic"), ED2KFT_IMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".pict"), ED2KFT_IMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".png"), ED2KFT_IMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".psd"), ED2KFT_IMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".psp"), ED2KFT_IMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".tga"), ED2KFT_IMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".tif"), ED2KFT_IMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".tiff"), ED2KFT_IMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".wmf"), ED2KFT_IMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".xif"), ED2KFT_IMAGE)); + + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".7z"), ED2KFT_ARCHIVE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".ace"), ED2KFT_ARCHIVE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".arj"), ED2KFT_ARCHIVE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".bz2"), ED2KFT_ARCHIVE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".cab"), ED2KFT_ARCHIVE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".gz"), ED2KFT_ARCHIVE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".hqx"), ED2KFT_ARCHIVE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".lha"), ED2KFT_ARCHIVE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".msi"), ED2KFT_ARCHIVE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".rar"), ED2KFT_ARCHIVE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".sea"), ED2KFT_ARCHIVE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".sit"), ED2KFT_ARCHIVE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".tar"), ED2KFT_ARCHIVE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".tgz"), ED2KFT_ARCHIVE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".uc2"), ED2KFT_ARCHIVE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".zip"), ED2KFT_ARCHIVE)); + + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".bat"), ED2KFT_PROGRAM)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".cmd"), ED2KFT_PROGRAM)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".com"), ED2KFT_PROGRAM)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".exe"), ED2KFT_PROGRAM)); + + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".bin"), ED2KFT_CDIMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".bwa"), ED2KFT_CDIMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".bwi"), ED2KFT_CDIMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".bws"), ED2KFT_CDIMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".bwt"), ED2KFT_CDIMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".ccd"), ED2KFT_CDIMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".cue"), ED2KFT_CDIMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".dmg"), ED2KFT_CDIMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".dmz"), ED2KFT_CDIMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".img"), ED2KFT_CDIMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".iso"), ED2KFT_CDIMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mdf"), ED2KFT_CDIMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".mds"), ED2KFT_CDIMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".nrg"), ED2KFT_CDIMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".sub"), ED2KFT_CDIMAGE)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".toast"), ED2KFT_CDIMAGE)); + + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".chm"), ED2KFT_DOCUMENT)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".css"), ED2KFT_DOCUMENT)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".diz"), ED2KFT_DOCUMENT)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".doc"), ED2KFT_DOCUMENT)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".dot"), ED2KFT_DOCUMENT)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".hlp"), ED2KFT_DOCUMENT)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".htm"), ED2KFT_DOCUMENT)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".html"), ED2KFT_DOCUMENT)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".nfo"), ED2KFT_DOCUMENT)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".pdf"), ED2KFT_DOCUMENT)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".pps"), ED2KFT_DOCUMENT)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".ppt"), ED2KFT_DOCUMENT)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".ps"), ED2KFT_DOCUMENT)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".rtf"), ED2KFT_DOCUMENT)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".wri"), ED2KFT_DOCUMENT)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".txt"), ED2KFT_DOCUMENT)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".xls"), ED2KFT_DOCUMENT)); + ED2KFileTypesMap.insert(SED2KFileTypeMapElement(wxT(".xlt"), ED2KFT_DOCUMENT)); + } +}; + + +// get the list initialized *before* any code is accessing it +CED2KFileTypes theED2KFileTypes; + +EED2KFileType GetED2KFileTypeID(const CPath& fileName) +{ + const wxString ext = fileName.GetExt().Lower(); + if (ext.IsEmpty()) { + return ED2KFT_ANY; + } + + SED2KFileTypeMap::iterator it = ED2KFileTypesMap.find(wxT(".") + ext); + if (it != ED2KFileTypesMap.end()) { + return it->second.GetType(); + } else { + return ED2KFT_ANY; + } +} + + +// Retuns the ed2k file type term which is to be used in server searches +wxString GetED2KFileTypeSearchTerm(EED2KFileType iFileID) +{ + if (iFileID == ED2KFT_AUDIO) return ED2KFTSTR_AUDIO; + if (iFileID == ED2KFT_VIDEO) return ED2KFTSTR_VIDEO; + if (iFileID == ED2KFT_IMAGE) return ED2KFTSTR_IMAGE; + if (iFileID == ED2KFT_DOCUMENT) return ED2KFTSTR_DOCUMENT; + if (iFileID == ED2KFT_PROGRAM) return ED2KFTSTR_PROGRAM; + // NOTE: Archives and CD-Images are published with file type "Pro" + if (iFileID == ED2KFT_ARCHIVE) return ED2KFTSTR_PROGRAM; + if (iFileID == ED2KFT_CDIMAGE) return ED2KFTSTR_PROGRAM; + + return wxEmptyString; +} + + +// Returns a file type which is used eMule internally only, examining the extention of the given filename +wxString GetFileTypeByName(const CPath& fileName) +{ + EED2KFileType iFileType = GetED2KFileTypeID(fileName); + switch (iFileType) { + case ED2KFT_AUDIO: return ED2KFTSTR_AUDIO; + case ED2KFT_VIDEO: return ED2KFTSTR_VIDEO; + case ED2KFT_IMAGE: return ED2KFTSTR_IMAGE; + case ED2KFT_DOCUMENT: return ED2KFTSTR_DOCUMENT; + case ED2KFT_PROGRAM: return ED2KFTSTR_PROGRAM; + case ED2KFT_ARCHIVE: return ED2KFTSTR_ARCHIVE; + case ED2KFT_CDIMAGE: return ED2KFTSTR_CDIMAGE; + default: return wxEmptyString; + } +} + + +// Retuns the ed2k file type integer ID which is to be used for publishing+searching +EED2KFileType GetED2KFileTypeSearchID(EED2KFileType iFileID) +{ + switch (iFileID) { + case ED2KFT_AUDIO: return ED2KFT_AUDIO; + case ED2KFT_VIDEO: return ED2KFT_VIDEO; + case ED2KFT_IMAGE: return ED2KFT_IMAGE; + case ED2KFT_DOCUMENT: return ED2KFT_DOCUMENT; + case ED2KFT_PROGRAM: return ED2KFT_PROGRAM; + // NOTE: Archives and CD-Images are published+searched with file type "Pro" + // NOTE: If this gets changed, the function 'GetED2KFileTypeSearchTerm' also needs to get updated! + case ED2KFT_ARCHIVE: return ED2KFT_PROGRAM; + case ED2KFT_CDIMAGE: return ED2KFT_PROGRAM; + default: return ED2KFT_ANY; + } +} + + +/** + * Dumps a buffer to a wxString + */ +wxString DumpMemToStr(const void *buff, int n, const wxString& msg, bool ok) +{ + const unsigned char *p = (const unsigned char *)buff; + int lines = (n + 15)/ 16; + + wxString result; + // Allocate aproximetly what is needed + result.Alloc( ( lines + 1 ) * 80 ); + if ( !msg.IsEmpty() ) { + result += msg + wxT(" - ok=") + ( ok ? wxT("true, ") : wxT("false, ") ); + } + + result += wxString::Format( wxT("%d bytes\n"), n ); + for ( int i = 0; i < lines; ++i) { + // Show address + result += wxString::Format( wxT("%08x "), i * 16 ); + + // Show two columns of hex-values + for ( int j = 0; j < 2; ++j) { + for ( int k = 0; k < 8; ++k) { + int pos = 16 * i + 8 * j + k; + + if ( pos < n ) { + result += wxString::Format( wxT("%02x "), p[pos] ); + } else { + result += wxT(" "); + } + } + result += wxT(" "); + } + result += wxT("|"); + // Show a column of ascii-values + for ( int k = 0; k < 16; ++k) { + int pos = 16 * i + k; + + if ( pos < n ) { + if ( isspace( p[pos] ) ) { + result += wxT(" "); + } else if ( !isgraph( p[pos] ) ) { + result += wxT("."); + } else { + result += (wxChar)p[pos]; + } + } else { + result += wxT(" "); + } + } + result += wxT("|\n"); + } + result.Shrink(); + + return result; +} + + +/** + * Dumps a buffer to stdout + */ +void DumpMem(const void *buff, int n, const wxString& msg, bool ok) +{ + printf("%s\n", (const char*)unicode2char(DumpMemToStr( buff, n, msg, ok )) ); +} + + +// +// Dump mem in dword format +void DumpMem_DW(const uint32 *ptr, int count) +{ + for(int i = 0; i < count; i++) { + printf("%08x ", ptr[i]); + if ( (i % 4) == 3) printf("\n"); + } + printf("\n"); +} + + +void MilliSleep(uint32 msecs) +{ + #ifdef __WXBASE__ + #ifdef __WXMSW__ + if (msecs) { + wxSleep(msecs); + } + #else + struct timespec waittime; + waittime.tv_sec = 0; + waittime.tv_nsec = msecs * 1000 /*micro*/* 1000 /*nano*/; + struct timespec remtime; + while ((nanosleep(&waittime,&remtime)==-1) && (errno == EINTR)) { + memcpy(&waittime,&remtime,sizeof(struct timespec)); + } + #endif + #else + wxMilliSleep(msecs); + #endif +} + + +wxString GetConfigDir() +{ + // Cache the path. + static wxString configPath; + + if (configPath.IsEmpty()) { +#ifndef EC_REMOTE + // "Portable aMule" - Use aMule from an external USB drive + // Check for ./config/amule.conf and use this configuration if found + const wxString configDir = JoinPaths(wxFileName::GetCwd(), wxT("config")); + const wxString configFile = JoinPaths(configDir, wxT("amule.conf")); + + if (CPath::DirExists(configDir) && CPath::FileExists(configFile)) { + AddLogLineM(true, CFormat(wxT("Using configDir: %s")) % configDir); + + configPath = configDir; + } else { + configPath = wxStandardPaths::Get().GetUserDataDir(); + } +#else + configPath = wxStandardPaths::Get().GetUserDataDir(); +#endif + + configPath += wxFileName::GetPathSeparator(); + } + + return configPath; +} + + +void InitCustomLanguages() +{ + wxLanguageInfo CustomLanguage; + CustomLanguage.Language = wxLANGUAGE_ITALIAN_NAPOLITAN; + CustomLanguage.CanonicalName = wxT("it_NA"); + CustomLanguage.Description = wxT("sNeo's Custom Napolitan Language"); + wxLocale::AddLanguage(CustomLanguage); +} + + +void InitLocale(wxLocale& locale, int language) +{ + int language_flags = 0; + if (language != wxLANGUAGE_CUSTOM && language != wxLANGUAGE_ITALIAN_NAPOLITAN) { + language_flags = wxLOCALE_LOAD_DEFAULT | wxLOCALE_CONV_ENCODING; + } + + locale.Init(language,language_flags); + + if (language != wxLANGUAGE_CUSTOM) { + +#if defined(__WXMAC__) + wxStandardPathsBase &spb(wxStandardPaths::Get()); + locale.AddCatalogLookupPathPrefix(JoinPaths(spb.GetDataDir(), wxT("locale"))); +#endif + locale.AddCatalog(wxT(PACKAGE)); + + } else { + locale.AddCatalogLookupPathPrefix(GetConfigDir()); + locale.AddCatalog(wxT("custom")); + } +} + + +int StrLang2wx(const wxString& language) +{ + // get rid of possible encoding and modifier + wxString lang(language.BeforeFirst('.').BeforeFirst('@')); + + if (!lang.IsEmpty()) { + const wxLanguageInfo *lng = wxLocale::FindLanguageInfo(lang); + if (lng) { + return lng->Language; + } else { + return wxLANGUAGE_DEFAULT; + } + } else { + return wxLANGUAGE_DEFAULT; + } +} + + +wxString wxLang2Str(const int lang) +{ + if (lang != wxLANGUAGE_DEFAULT) { + const wxLanguageInfo *lng = wxLocale::GetLanguageInfo(lang); + if (lng) { + return lng->CanonicalName; + } else { + return wxEmptyString; + } + } else { + return wxEmptyString; + } +} + +wxString GetPassword() { +wxString pass_plain; +CMD4Hash password; + #ifndef __WXMSW__ + pass_plain = char2unicode(getpass("Enter password for mule connection: ")); + #else + //#warning This way, pass enter is not hidden on windows. Bad thing. + char temp_str[512]; + fflush(stdin); + printf("Enter password for mule connection: \n"); + fflush(stdout); + fgets(temp_str, 512, stdin); + temp_str[strlen(temp_str)-1] = '\0'; + pass_plain = char2unicode(temp_str); + #endif + wxCHECK2(password.Decode(MD5Sum(pass_plain).GetHash()), /* Do nothing. */ ); + // MD5 hash for an empty string, according to rfc1321. + if (password.Encode() == wxT("D41D8CD98F00B204E9800998ECF8427E")) { + printf("No empty password allowed.\n"); + return GetPassword(); + } + + +return password.Encode(); +} + +#if !defined(AMULE_DAEMON) && (!defined(EC_REMOTE) || defined(CLIENT_GUI)) + +bool IsLocaleAvailable(int id) +{ + // This supresses error-messages about invalid locales. + wxLogNull logTarget; + wxLocale locale_to_check; + + if (id == wxLANGUAGE_DEFAULT || id == theApp->m_locale.GetLanguage()) + return true; + + InitLocale(locale_to_check, id); + if (locale_to_check.IsOk()) { + return locale_to_check.IsLoaded(wxT(PACKAGE)); + } else { + return false; + } +} + +#endif /* !AMULE_DEAMON && (!EC_REMOTE || CLIENT_GUI) */ +// File_checked_for_headers diff --git a/src/OtherFunctions.h b/src/OtherFunctions.h new file mode 100644 index 00000000..b30365ae --- /dev/null +++ b/src/OtherFunctions.h @@ -0,0 +1,453 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef OTHERFUNCTIONS_H +#define OTHERFUNCTIONS_H + +#include // Needed for wxLANGUAGE_ constants + +#include "Types.h" // Needed for uint16, uint32 and uint64 + +#include // Needed for std::for_each // Do_not_auto_remove (mingw-gcc-3.4.5) + + +class CPath; + + +/** + * Helper function. + * + * @param ArgA The base value. + * @param ArgB The value to compare ArgA against. + * @return See below. + * + * Use this function to safely compare two arguments of a type that supports + * the "<" operator. It works like strcmp and returns a negative value if ArgA + * is less than ArgB, zero if ArgA is equal to ArgB and a positive value if + * ArgA is greater than ArgB. + */ +template +int CmpAny(const TYPE& ArgA, const TYPE& ArgB) +{ + if ( ArgA < ArgB ) { + return -1; + } else if ( ArgB < ArgA ) { + return 1; + } else { + return 0; + } +} + +//! Overloaded version of CmpAny for use with wxStrings. +inline int CmpAny(const wxString& ArgA, const wxString& ArgB) +{ + return ArgA.CmpNoCase( ArgB ); +} + +//! Overloaded version of CmpAny for use with C-Strings (Unicoded). +inline int CmpAny(const wxChar* ArgA, const wxChar* ArgB) +{ + return wxString( ArgA ).CmpNoCase( ArgB ); +} + + +/** + * Removes the first instance of a value from a STL-like list: list, vector or deque. + * + * @param list The list to manipulate. + * @param item The value to search for and remove. + * @return The number of instances removed. + */ +template +unsigned int EraseFirstValue( LIST& list, const ITEM& item ) +{ + typename LIST::iterator it = list.begin(); + + for (; it != list.end(); ++it) { + if (*it == item) { + list.erase(it); + + return true; + } + } + + return false; +} + + +/** + * Removes all instances of a value from a STL-like list: list, vector or deque. + * + * @param list The list to manipulate. + * @param item The value to search for and remove. + * @return The number of instances removed. + */ +template +unsigned int EraseValue( LIST& list, const ITEM& item ) +{ + typename LIST::iterator it = list.begin(); + unsigned int count = 0; + + for ( ; it != list.end(); ) { + if ( *it == item ) { + it = list.erase( it ); + count++; + } else { + ++it; + } + } + + return count; +} + + +//! Used by DeleteContents +struct SDoDelete +{ + // Used for lists, vectors, deques, etc. + template + void operator()(TYPE* ptr) { + delete ptr; + } + + // Used for maps, hashmaps, rangemaps, etc. + template + void operator()(const std::pair& pair) { + delete pair.second; + } +}; + + +/** Frees the contents of a list or map like stl container, clearing it afterwards. */ +template +void DeleteContents(STL_CONTAINER& container) +{ + // Ensure that the actual container wont contain dangling pointers during + // this operation, to ensure that the destructors cant access them. + STL_CONTAINER copy; + + std::swap(copy, container); + std::for_each(copy.begin(), copy.end(), SDoDelete()); +} + + +/** + * Copies elements from the range [first, first + n) to the range [result, result + n). + */ +template +OutputIterator STLCopy_n(InputIterator first, size_t n, OutputIterator result) +{ + return std::copy(first, first + n, result); +} + + +/** + * Returns a description of the version of aMule being used. + * + * @return A detailed description of the aMule version, including wx information. + * + * Use this rather than just using the VERSION or CURRENT_VERSION_LONG + * constants, when displaying information to the user. The purpose is to + * help with debugging. + */ +wxString GetMuleVersion(); + +/** + * This functions is like the GetMuleVersion function above, with the exception + * that it also includes the name of the application. This can be one of the + * following: + * + * - aMule + * - aMuled + * - Remote aMule-GUI + */ +wxString GetFullMuleVersion(); + + +/** + * Helperfunction for accessing a child of the calling widget. + * + * @param IdOrName The ID or the Name of the widget to find. + * @param type The widget-type to cast the found widget to. + * + * Use this function as a replacement for the following constructs: + * - wxStaticCast( FindWindow( ), ) + * - (*)FindWindow( ) + * + * It has the advantage of validating the cast in debug builds and being much + * shorter than than manually typing wxStaticCast + FindWindow. This mean that + * we will be alerted in case of widget changing type, instead of getting just + * getting bad mojo due to casting a pointer to the wrong type. + */ +#define CastChild( IdOrName, type ) dynamic_cast( FindWindow( IdOrName ) ) + + +/** + * Helperfunction for accessing the child of a any widget by ID. + * + * @param ID The ID of the widget to find. + * @param parent The parent of the widget to find, or NULL to search from the top. + * @param type The type to cast the widget to. + * + * @see CastChild() + */ +#define CastByID( ID, parent, type ) dynamic_cast( wxWindow::FindWindowById( (ID), (parent) ) ) + + +/** + * Helperfunction for accessing the child of a any widget by Name. + * + * @param Name The Name of the widget to find. + * @param parent The parent of the widget to find, or NULL to search from the top. + * @param type The type to cast the widget to. + * + * @see CastChild() + */ +#define CastByName( Name, parent, type ) dynamic_cast( wxWindow::FindWindowByName( (Name), (parent) ) ) + + +// From Gnucleus project [found by Tarod] +// Base16/Base32/Base64 Encode/Decode functions +wxString EncodeBase16(const unsigned char* buffer, unsigned int bufLen); +unsigned int DecodeBase16(const wxString &base16Buffer, unsigned int base16BufLen, unsigned char *buffer); +wxString EncodeBase32(const unsigned char* buffer, unsigned int bufLen); +unsigned int DecodeBase32(const wxString &base32Buffer, unsigned int base32BufLen, unsigned char *buffer); +wxString EncodeBase64(const char* buffer, unsigned int bufLen); +unsigned int DecodeBase64(const wxString &base64Buffer, unsigned int base64BufLen, unsigned char *buffer); + +// Converts the number of bytes to human readable form. +wxString CastItoXBytes(uint64 count); +// Converts the number to human readable form, abbreviating when nessecary. +wxString CastItoIShort(uint64 number); +// Converts a number of bytes to a human readable speed value. +wxString CastItoSpeed(uint32 bytes); +// Converts an amount of seconds to human readable time. +wxString CastSecondsToHM(uint64 seconds, uint16 msecs = 0); +// Returns the amount of Bytes the provided size-type represents +uint32 GetTypeSize(uint8 type); +// Returns the string associated with a file-rating value. +wxString GetRateString(uint16 rate); + + +// The following functions are used to identify and/or name the type of a file +enum FileType { ftAny, ftVideo, ftAudio, ftArchive, ftCDImage, ftPicture, ftText, ftProgram }; +// Examins a filename and returns the enumerated value assosiated with it, or ftAny if unknown extension +FileType GetFiletype(const CPath& filename); +// Returns the description of a filetype: Movies, Audio, Pictures and so on... +wxString GetFiletypeDesc(FileType type, bool translated = true); +// Shorthand for GetFiletypeDesc(GetFiletype(filename)) +wxString GetFiletypeByName(const CPath& filename, bool translated = true); + + +// Returns the max number of connections the current OS can handle. +// Currently anything but windows will return the default value (-1); +int GetMaxConnections(); +// Returns the name assosiated with a category value. +wxString GetCatTitle(int catid); + +/* Other */ + + +//! Returns the number of items in an array. +#define itemsof(x) (sizeof(x)/sizeof(x[0])) + + +/////////////////////////////////////////////////////////////////////////////// +// ED2K File Type +// + +enum EED2KFileType +{ + ED2KFT_ANY, + ED2KFT_AUDIO, + ED2KFT_VIDEO, + ED2KFT_IMAGE, + ED2KFT_PROGRAM, + ED2KFT_DOCUMENT, + ED2KFT_ARCHIVE, + ED2KFT_CDIMAGE +}; + +class EED2KFileTypeClass +{ +public: + EED2KFileTypeClass() + { + s_t = ED2KFT_ANY; + } + EED2KFileTypeClass(EED2KFileType t) + { + s_t = t; + } + EED2KFileType GetType() const + { + return s_t; + } + +private: + EED2KFileType s_t; +}; + +EED2KFileType GetED2KFileTypeID(const CPath& fileName); +wxString GetED2KFileTypeSearchTerm(EED2KFileType iFileID); +wxString GetFileTypeByName(const CPath& fileName); +EED2KFileType GetED2KFileTypeSearchID(EED2KFileType iFileID); +/////////////////////////////////////////////////////////////////////////////// + +// md4cmp -- replacement for memcmp(hash1,hash2,16) +// Like 'memcmp' this function returns 0, if hash1==hash2, and !0, if hash1!=hash2. +// NOTE: Do *NOT* use that function for determining if hash1hash2. +inline int md4cmp(const void* hash1, const void* hash2) +{ + return memcmp(hash1, hash2, 16); +} + + +// md4clr -- replacement for memset(hash,0,16) +inline void md4clr(void* hash) +{ + memset(hash, 0, 16); +} + + +// md4cpy -- replacement for memcpy(dst,src,16) +inline void md4cpy(void* dst, const void* src) +{ + memcpy(dst, src, 16); +} + + +// DumpMem ... Dumps mem ;) +wxString DumpMemToStr(const void *buff, int n, const wxString& msg = wxEmptyString, bool ok = true); +void DumpMem(const void *buff, int n, const wxString& msg = wxEmptyString, bool ok = true); +void DumpMem_DW(const uint32 *ptr, int count); + +// Returns special source ID for GUI. +// It's actually IP<<16+Port +#define GUI_ID(x,y) (uint64)((((uint64)x)<<16) + (uint64)y) +// And so... +#define PORT_FROM_GUI_ID(x) (x & 0xFFFF) +#define IP_FROM_GUI_ID(x) (x >> 16) + + +void MilliSleep(uint32 msecs); + + +inline const long int make_full_ed2k_version(int a, int b, int c) { + return ((a << 17) | (b << 10) | (c << 7)); +} + + +wxString GetConfigDir(); + +#define wxLANGUAGE_CUSTOM wxLANGUAGE_USER_DEFINED+1 +#define wxLANGUAGE_ITALIAN_NAPOLITAN wxLANGUAGE_USER_DEFINED+2 + +/** + * Adds aMule's custom languages to db. + */ +void InitCustomLanguages(); + +/** + * Initializes locale + */ +void InitLocale(wxLocale& locale, int language); + +/** + * Returns true when the locale could be set, false otherwise. + * + * Currently it doesn't check if the catalog for the locale + * is installed, but I hope that's next. + */ +bool IsLocaleAvailable(int id); + +/** + * Converts a string locale definition to a wxLANGUAGE id. + */ +int StrLang2wx(const wxString& language); + +/** + * Converts a wxLANGUAGE id to a string locale name. + */ +wxString wxLang2Str(const int lang); + +/** + * Generate MD5Hash of prompt input + */ +wxString GetPassword(); + + +#if wxUSE_THREADS + +#include + +/** + * Automatically unlocks a mutex on construction and locks it on destruction. + * + * This class is the complement of wxMutexLocker. It is intended to be used + * when a mutex, which is locked for a period of time, needs to be + * temporarily unlocked for a bit. For example: + * + * wxMutexLocker lock(mutex); + * + * // ... do stuff that requires that the mutex is locked ... + * + * { + * CMutexUnlocker unlocker(mutex); + * // ... do stuff that requires that the mutex is unlocked ... + * } + * + * // ... do more stuff that requires that the mutex is locked ... + * + */ +class CMutexUnlocker +{ +public: + // unlock the mutex in the ctor + CMutexUnlocker(wxMutex& mutex) + : m_isOk(false), m_mutex(mutex) + { m_isOk = ( m_mutex.Unlock() == wxMUTEX_NO_ERROR ); } + + // returns true if mutex was successfully unlocked in ctor + bool IsOk() const + { return m_isOk; } + + // lock the mutex in dtor + ~CMutexUnlocker() + { if ( IsOk() ) m_mutex.Lock(); } + +private: + // no assignment operator nor copy ctor + CMutexUnlocker(const CMutexUnlocker&); + CMutexUnlocker& operator=(const CMutexUnlocker&); + + bool m_isOk; + wxMutex& m_mutex; +}; +#endif /* wxUSE_THREADS */ + + +#endif // OTHERFUNCTIONS_H +// File_checked_for_headers diff --git a/src/OtherStructs.h b/src/OtherStructs.h new file mode 100644 index 00000000..54e4b1ad --- /dev/null +++ b/src/OtherStructs.h @@ -0,0 +1,148 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef OTHERSTRUCTS_H +#define OTHERSTRUCTS_H + + +// Defined in +struct z_stream_s; + + +// SERVER TO CLIENT +#ifdef _MSC_VER +#pragma pack(1) +#endif +struct Header_Struct{ + int8 eDonkeyID; + int32 packetlength; + int8 command; +} +#ifdef _MSC_VER +; +#pragma pack() +#else +__attribute__((__packed__)); +#endif + +#ifdef _MSC_VER +#pragma pack(1) +#endif +struct UDP_Header_Struct { + int8 eDonkeyID; + int8 command; +} +#ifdef _MSC_VER +; +#pragma pack() +#else +__attribute__((__packed__)); +#endif + +#ifdef _MSC_VER +; +#pragma pack(1) +#endif +struct Requested_Block_Struct{ + uint64 StartOffset; + uint64 EndOffset; + uint32 packedsize; + unsigned char FileID[16]; + uint32 transferred; // Barry - This counts bytes completed +} +#ifdef _MSC_VER +; +#pragma pack() +#else +__attribute__((__packed__)); +#endif + +struct Requested_File_Struct{ + unsigned char fileid[16]; + uint32 lastasked; + uint8 badrequests; +} +#ifdef _MSC_VER +; +#pragma pack() +#else +__attribute__((__packed__)); +#endif + +struct Pending_Block_Struct{ + Requested_Block_Struct* block; + struct z_stream_s* zStream; // Barry - Used to unzip packets + uint32 totalUnzipped; // Barry - This holds the total unzipped bytes for all packets so far + uint32 fZStreamError : 1, + fRecovered : 1; +}; + +struct Gap_Struct{ + uint64 start; + uint64 end; +}; + +#ifdef _MSC_VER +#pragma pack(1) +#endif +struct ServerMet_Struct { + uint32 ip; + uint16 port; + uint32 tagcount; +} +#ifdef _MSC_VER +; +#pragma pack() +#else +__attribute__((__packed__)); +#endif + +struct TransferredData { + uint32 datalen; + uint32 timestamp; +}; + + +//Kry import of 0.30d +// Maella -Enhanced Chunk Selection- (based on jicxicmic) +#ifdef _MSC_VER +#pragma pack(1) +#endif +struct Chunk { + uint16 part; // Index of the chunk + union { + uint16 frequency; // Availability of the chunk + uint16 rank; // Download priority factor (highest = 0, lowest = 0xffff) + }; +} +#ifdef _MSC_VER +; +#pragma pack() +#else +__attribute__((__packed__)); +#endif + +#endif // OTHERSTRUCTS_H +// File_checked_for_headers diff --git a/src/Packet.cpp b/src/Packet.cpp new file mode 100644 index 00000000..45982fdb --- /dev/null +++ b/src/Packet.cpp @@ -0,0 +1,311 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include // Needed for uLongf + +#include "Packet.h" // Interface declarations + +#include + +#include "MemFile.h" // Needed for CMemFile +#include "OtherStructs.h" // Needed for Header_Struct +#include "ArchSpecific.h" // Needed for ENDIAN_* + +// Copy constructor +CPacket::CPacket(CPacket &p) +{ + size = p.size; + opcode = p.opcode; + prot = p.prot; + m_bSplitted = p.m_bSplitted; + m_bLastSplitted = p.m_bLastSplitted; + m_bPacked = p.m_bPacked; + m_bFromPF = p.m_bFromPF; + memcpy(head, p.head, sizeof head); + tempbuffer = NULL; + if (p.completebuffer) { + completebuffer = new byte[size + 10];; + pBuffer = completebuffer + sizeof(Header_Struct); + } else { + completebuffer = NULL; + if (p.pBuffer) { + pBuffer = new byte[size]; + } else { + pBuffer = NULL; + } + } + if (pBuffer) + memcpy( pBuffer, p.pBuffer, size ); +} + +CPacket::CPacket(uint8 protocol) +{ + size = 0; + opcode = 0; + prot = protocol; + m_bSplitted = false; + m_bLastSplitted = false; + m_bPacked = false; + m_bFromPF = false; + memset(head, 0, sizeof head); + tempbuffer = NULL; + completebuffer = NULL; + pBuffer = NULL; +} + +// only used for receiving packets +CPacket::CPacket(byte* rawHeader) +{ + memset(head, 0, sizeof head); + Header_Struct* header = (Header_Struct*)rawHeader; + size = ENDIAN_SWAP_32(header->packetlength) - 1; + opcode = header->command; + prot = header->eDonkeyID; + m_bSplitted = false; + m_bLastSplitted = false; + m_bPacked = false; + m_bFromPF = false; + tempbuffer = NULL; + completebuffer = NULL; + pBuffer = NULL; +} + +CPacket::CPacket(const CMemFile& datafile, uint8 protocol, uint8 ucOpcode) +{ + size = datafile.GetLength(); + opcode = ucOpcode; + prot = protocol; + m_bSplitted = false; + m_bLastSplitted = false; + m_bPacked = false; + m_bFromPF = false; + memset(head, 0, sizeof head); + tempbuffer = NULL; + completebuffer = new byte[size + sizeof(Header_Struct)/*Why this 4?*/]; + pBuffer = completebuffer + sizeof(Header_Struct); + + // Write contents of MemFile to buffer (while keeping original position in file) + off_t position = datafile.GetPosition(); + datafile.Seek(0, wxFromStart); + datafile.Read(pBuffer, size); + datafile.Seek(position, wxFromStart); +} + +CPacket::CPacket(int8 in_opcode, uint32 in_size, uint8 protocol, bool bFromPF) +{ + size = in_size; + opcode = in_opcode; + prot = protocol; + m_bSplitted = false; + m_bLastSplitted = false; + m_bPacked = false; + m_bFromPF = bFromPF; + memset(head, 0, sizeof head); + tempbuffer = NULL; + if (in_size) { + completebuffer = new byte[in_size + sizeof(Header_Struct) + 4 /*Why this 4?*/]; + pBuffer = completebuffer + sizeof(Header_Struct); + memset(completebuffer, 0, in_size + sizeof(Header_Struct) + 4 /*Why this 4?*/); + } else { + completebuffer = NULL; + pBuffer = NULL; + } +} + +// only used for splitted packets! +CPacket::CPacket(byte* pPacketPart, uint32 nSize, bool bLast, bool bFromPF) +{ + size = nSize - sizeof(Header_Struct); + opcode = 0; + prot = 0; + m_bSplitted = true; + m_bLastSplitted = bLast; + m_bPacked = false; + m_bFromPF = bFromPF; + memset(head, 0, sizeof head); + tempbuffer = NULL; + completebuffer = pPacketPart; + pBuffer = NULL; +} + +CPacket::~CPacket() +{ + // Never deletes pBuffer when completebuffer is not NULL + if (completebuffer) { + delete [] completebuffer; + } else if (pBuffer) { + // On the other hand, if completebuffer is NULL and pBuffer is not NULL + delete [] pBuffer; + } + + if (tempbuffer) { + delete [] tempbuffer; + } +} + +void CPacket::AllocDataBuffer(void) +{ + wxASSERT(completebuffer == NULL); + pBuffer = new byte[size + 1]; +} + +void CPacket::CopyToDataBuffer(unsigned int offset, const byte* data, unsigned int n) +{ + wxASSERT(offset + n <= size + 1); + memcpy(pBuffer + offset, data, n); +} + +byte* CPacket::GetPacket() { + if (completebuffer) { + if (!m_bSplitted) { + memcpy(completebuffer, GetHeader(), sizeof(Header_Struct)); + } + return completebuffer; + } else { + if (tempbuffer){ + delete [] tempbuffer; + tempbuffer = NULL; + } + tempbuffer = new byte[size + sizeof(Header_Struct) + 4 /* why this 4?*/]; + memcpy(tempbuffer , GetHeader(), sizeof(Header_Struct)); + memcpy(tempbuffer + sizeof(Header_Struct), pBuffer , size); + return tempbuffer; + } +} + +byte* CPacket::DetachPacket() { + if (completebuffer) { + if (!m_bSplitted) { + memcpy(completebuffer, GetHeader(), sizeof(Header_Struct)); + } + byte* result = completebuffer; + completebuffer = pBuffer = NULL; + return result; + } else{ + if (tempbuffer){ + delete[] tempbuffer; + tempbuffer = NULL; + } + tempbuffer = new byte[size+sizeof(Header_Struct)+4 /* Why this 4?*/]; + memcpy(tempbuffer,GetHeader(),sizeof(Header_Struct)); + memcpy(tempbuffer+sizeof(Header_Struct),pBuffer,size); + byte* result = tempbuffer; + tempbuffer = 0; + return result; + } +} + +byte* CPacket::GetHeader() { + wxASSERT( !m_bSplitted ); + + Header_Struct* header = (Header_Struct*) head; + header->command = opcode; + header->eDonkeyID = prot; + header->packetlength = ENDIAN_SWAP_32(size + 1); + + return head; +} + +byte* CPacket::GetUDPHeader() { + wxASSERT( !m_bSplitted ); + + memset(head, 0, 6); + UDP_Header_Struct* header = (UDP_Header_Struct*) head; + header->eDonkeyID = prot; + header->command = opcode; + + return head; +} + + +void CPacket::PackPacket() +{ + wxASSERT(!m_bSplitted); + + uLongf newsize = size + 300; + byte* output = new byte[newsize]; + + uint16 result = compress2(output, &newsize, pBuffer, size, Z_BEST_COMPRESSION); + + if (result != Z_OK || size <= newsize) { + delete[] output; + return; + } + + if (prot == OP_KADEMLIAHEADER) { + prot = OP_KADEMLIAPACKEDPROT; + } else { + prot = OP_PACKEDPROT; + } + + memcpy(pBuffer, output, newsize); + delete[] output; + m_bPacked = true; + + size = newsize; +} + + +bool CPacket::UnPackPacket(uint32 uMaxDecompressedSize) { + wxASSERT( prot == OP_PACKEDPROT ); + + uint32 nNewSize = size * 10 + 300; + + if (nNewSize > uMaxDecompressedSize){ + nNewSize = uMaxDecompressedSize; + } + + byte* unpack = new byte[nNewSize]; + uLongf unpackedsize = nNewSize; + uint16 result = uncompress(unpack, &unpackedsize, pBuffer, size); + + if (result == Z_OK) { + wxASSERT( completebuffer == NULL ); + wxASSERT( pBuffer != NULL ); + + size = unpackedsize; + delete[] pBuffer; + pBuffer = unpack; + prot = OP_EMULEPROT; + return true; + } + + delete[] unpack; + return false; +} + + +void CPacket::Copy16ToDataBuffer(const void* data) +{ + md4cpy(pBuffer, data); +} + + +void CPacket::CopyUInt32ToDataBuffer(uint32 data, unsigned int offset) +{ + wxCHECK_RET(offset <= size - sizeof(uint32), wxT("Bad offset in CopyUInt32ToDataBuffer.")); + PokeUInt32( pBuffer + offset, data ); +} +// File_checked_for_headers diff --git a/src/Packet.h b/src/Packet.h new file mode 100644 index 00000000..db0d7fd5 --- /dev/null +++ b/src/Packet.h @@ -0,0 +1,91 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef PACKET_H +#define PACKET_H + +#include "Types.h" // Needed for int8, int32, uint8 and uint32 + +class CMemFile; +class wxString; + +// CLIENT TO SERVER + +// PACKET CLASS +// TODO some parts could need some work to make it more efficient + +class CPacket { +public: + CPacket(CPacket &p); + CPacket(uint8 protocol); + CPacket(byte* header); // only used for receiving packets + CPacket(const CMemFile& datafile, uint8 protocol, uint8 ucOpcode); + CPacket(int8 in_opcode, uint32 in_size, uint8 protocol, bool bFromPF = true); + CPacket(byte* pPacketPart, uint32 nSize, bool bLast, bool bFromPF = true); // only used for splitted packets! + + ~CPacket(); + + void AllocDataBuffer(); + byte* GetHeader(); + byte* GetUDPHeader(); + byte* GetPacket(); + byte* DetachPacket(); + uint32 GetRealPacketSize() const { return size + 6; } + bool IsSplitted() { return m_bSplitted; } + bool IsLastSplitted() { return m_bLastSplitted; } + void PackPacket(); + bool UnPackPacket(uint32 uMaxDecompressedSize = 50000); + // -khaos--+++> Returns either -1, 0 or 1. -1 is unset, 0 is from complete file, 1 is from part file + bool IsFromPF() { return m_bFromPF; } + + uint8 GetOpCode() const { return opcode; } + void SetOpCode(uint8 oc) { opcode = oc; } + uint32 GetPacketSize() const { return size; } + uint8 GetProtocol() const { return prot; } + void SetProtocol(uint8 p) { prot = p; } + const byte* GetDataBuffer(void) const { return pBuffer; } + void Copy16ToDataBuffer(const void* data); + void CopyToDataBuffer(unsigned int offset, const byte* data, unsigned int n); + void CopyUInt32ToDataBuffer(uint32 data, unsigned int offset = 0); + +private: + //! CPacket is not assignable. + CPacket& operator=(const CPacket&); + + uint32 size; + uint8 opcode; + uint8 prot; + bool m_bSplitted; + bool m_bLastSplitted; + bool m_bPacked; + bool m_bFromPF; + byte head[6]; + byte* tempbuffer; + byte* completebuffer; + byte* pBuffer; +}; + +#endif // PACKET_H +// File_checked_for_headers diff --git a/src/Parser.cpp b/src/Parser.cpp new file mode 100644 index 00000000..34f1fd26 --- /dev/null +++ b/src/Parser.cpp @@ -0,0 +1,1743 @@ +/* A Bison parser, made by GNU Bison 2.3. */ + +/* Skeleton implementation for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "2.3" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + TOK_STRING = 258, + TOK_AND = 259, + TOK_OR = 260, + TOK_NOT = 261, + TOK_ED2K_LINK = 262 + }; +#endif +/* Tokens. */ +#define TOK_STRING 258 +#define TOK_AND 259 +#define TOK_OR 260 +#define TOK_NOT 261 +#define TOK_ED2K_LINK 262 +/* Copy the first part of user declarations. */ +#line 1 "./Parser.y" + +class wxString; + +#include "Scanner.h.in" +#include "Scanner.h" +#include "OtherFunctions.h" +#include "SearchExpr.h" + +#include "libs/common/StringFunctions.h" + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +extern wxArrayString _astrParserErrors; + +void ParsedSearchExpression(const CSearchExpr* pexpr); +int yyerror(const char* errstr); +int yyerror(wxString errstr); + + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 1 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +#line 23 "./Parser.y" +{ + wxString* pstr; + CSearchExpr* pexpr; +} +/* Line 187 of yacc.c. */ +#line 137 "Parser.cpp" + YYSTYPE; +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +/* Line 216 of yacc.c. */ +#line 150 "Parser.cpp" + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#elif (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +typedef signed char yytype_int8; +#else +typedef short int yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(e) ((void) (e)) +#else +# define YYUSE(e) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(n) (n) +#else +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static int +YYID (int i) +#else +static int +YYID (i) + int i; +#endif +{ + return i; +} +#endif + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined _STDLIB_H \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 15 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 52 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 10 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 4 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 18 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 28 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 262 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 8, 9, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint8 yyprhs[] = +{ + 0, 0, 3, 5, 7, 10, 12, 16, 20, 24, + 28, 32, 36, 39, 43, 46, 49, 52, 54 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int8 yyrhs[] = +{ + 11, 0, -1, 12, -1, 7, -1, 12, 1, -1, + 13, -1, 12, 4, 12, -1, 12, 5, 12, -1, + 12, 6, 12, -1, 8, 12, 9, -1, 12, 5, + 1, -1, 12, 6, 1, -1, 8, 1, -1, 8, + 12, 1, -1, 4, 1, -1, 5, 1, -1, 6, + 1, -1, 3, -1, 13, 3, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint8 yyrline[] = +{ + 0, 42, 42, 48, 57, 66, 67, 77, 87, 97, + 102, 108, 114, 119, 125, 130, 135, 142, 147 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "TOK_STRING", "TOK_AND", "TOK_OR", + "TOK_NOT", "TOK_ED2K_LINK", "'('", "')'", "$accept", "action", + "searchexpr", "and_strings", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const yytype_uint16 yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 40, 41 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint8 yyr1[] = +{ + 0, 10, 11, 11, 11, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 13, 13 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 1, 1, 2, 1, 3, 3, 3, 3, + 3, 3, 2, 3, 2, 2, 2, 1, 2 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const yytype_uint8 yydefact[] = +{ + 0, 17, 0, 0, 0, 3, 0, 0, 0, 5, + 14, 15, 16, 12, 0, 1, 4, 0, 0, 0, + 18, 13, 9, 6, 10, 7, 11, 8 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int8 yydefgoto[] = +{ + -1, 7, 8, 9 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -7 +static const yytype_int8 yypact[] = +{ + 38, -7, 1, 2, 6, -7, 13, 15, 34, 29, + -7, -7, -7, -7, 0, -7, -7, 44, 19, 25, + -7, -7, -7, 30, -7, 4, -7, -7 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int8 yypgoto[] = +{ + -7, -7, -6, -7 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -3 +static const yytype_int8 yytable[] = +{ + 14, 21, 10, 11, 17, 18, 19, 12, 17, 22, + 19, 23, 25, 27, 13, 15, 1, 2, 3, 4, + 24, 6, 1, 2, 3, 4, 26, 6, 1, 2, + 3, 4, 20, 6, -2, 16, 19, 0, 17, 18, + 19, 1, 2, 3, 4, 5, 6, 1, 2, 3, + 4, 0, 6 +}; + +static const yytype_int8 yycheck[] = +{ + 6, 1, 1, 1, 4, 5, 6, 1, 4, 9, + 6, 17, 18, 19, 1, 0, 3, 4, 5, 6, + 1, 8, 3, 4, 5, 6, 1, 8, 3, 4, + 5, 6, 3, 8, 0, 1, 6, -1, 4, 5, + 6, 3, 4, 5, 6, 7, 8, 3, 4, 5, + 6, -1, 8 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint8 yystos[] = +{ + 0, 3, 4, 5, 6, 7, 8, 11, 12, 13, + 1, 1, 1, 1, 12, 0, 1, 4, 5, 6, + 3, 1, 9, 12, 1, 12, 1, 12 +}; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK (1); \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (YYLEX_PARAM) +#else +# define YYLEX yylex () +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (YYID (0)) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (!yyvaluep) + return; +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); +# endif + switch (yytype) + { + default: + break; + } +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) +#else +static void +yy_stack_print (bottom, top) + yytype_int16 *bottom; + yytype_int16 *top; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_reduce_print (YYSTYPE *yyvsp, int yyrule) +#else +static void +yy_reduce_print (yyvsp, yyrule) + YYSTYPE *yyvsp; + int yyrule; +#endif +{ + int yynrhs = yyr2[yyrule]; + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + fprintf (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + ); + fprintf (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, Rule); \ +} while (YYID (0)) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static YYSIZE_T +yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) + const char *yystr; +#endif +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static char * +yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +#endif +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into YYRESULT an error message about the unexpected token + YYCHAR while in state YYSTATE. Return the number of bytes copied, + including the terminating null byte. If YYRESULT is null, do not + copy anything; just return the number of bytes that would be + copied. As a special case, return 0 if an ordinary "syntax error" + message will do. Return YYSIZE_MAXIMUM if overflow occurs during + size calculation. */ +static YYSIZE_T +yysyntax_error (char *yyresult, int yystate, int yychar) +{ + int yyn = yypact[yystate]; + + if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) + return 0; + else + { + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; + +# if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +# endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + + if (yysize_overflow) + return YYSIZE_MAXIMUM; + + if (yyresult) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yyresult; + int yyi = 0; + while ((*yyp = *yyf) != '\0') + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + } + return yysize; + } +} +#endif /* YYERROR_VERBOSE */ + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + YYUSE (yyvaluep); + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int yyparse (void *YYPARSE_PARAM); +#else +int yyparse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + +/* The look-ahead symbol. */ +int yychar; + +/* The semantic value of the look-ahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ + + int yystate; + int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Look-ahead token as an internal (translated) token number. */ + int yytoken = 0; +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss = yyssa; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp; + + + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + look-ahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to look-ahead token. */ + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a look-ahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the look-ahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + yystate = yyn; + *++yyvsp = yylval; + + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: +#line 43 "./Parser.y" + { + ParsedSearchExpression((yyvsp[(1) - (1)].pexpr)); + delete (yyvsp[(1) - (1)].pexpr); + return 0; + ;} + break; + + case 3: +#line 49 "./Parser.y" + { + CSearchExpr* pexpr = new CSearchExpr(*(yyvsp[(1) - (1)].pstr)); + ParsedSearchExpression(pexpr); + delete pexpr; + delete (yyvsp[(1) - (1)].pstr); + return 0; + ;} + break; + + case 4: +#line 58 "./Parser.y" + { + yyerror(wxT("Undefined search expression error")); + delete (yyvsp[(1) - (2)].pexpr); + return 1; + ;} + break; + + case 6: +#line 68 "./Parser.y" + { + CSearchExpr* pexpr = new CSearchExpr; + pexpr->Add(SEARCHOP_AND); + pexpr->Add((yyvsp[(1) - (3)].pexpr)); + pexpr->Add((yyvsp[(3) - (3)].pexpr)); + (yyval.pexpr) = pexpr; + delete (yyvsp[(1) - (3)].pexpr); + delete (yyvsp[(3) - (3)].pexpr); + ;} + break; + + case 7: +#line 78 "./Parser.y" + { + CSearchExpr* pexpr = new CSearchExpr; + pexpr->Add(SEARCHOP_OR); + pexpr->Add((yyvsp[(1) - (3)].pexpr)); + pexpr->Add((yyvsp[(3) - (3)].pexpr)); + (yyval.pexpr) = pexpr; + delete (yyvsp[(1) - (3)].pexpr); + delete (yyvsp[(3) - (3)].pexpr); + ;} + break; + + case 8: +#line 88 "./Parser.y" + { + CSearchExpr* pexpr = new CSearchExpr; + pexpr->Add(SEARCHOP_NOT); + pexpr->Add((yyvsp[(1) - (3)].pexpr)); + pexpr->Add((yyvsp[(3) - (3)].pexpr)); + (yyval.pexpr) = pexpr; + delete (yyvsp[(1) - (3)].pexpr); + delete (yyvsp[(3) - (3)].pexpr); + ;} + break; + + case 9: +#line 98 "./Parser.y" + { + (yyval.pexpr) = (yyvsp[(2) - (3)].pexpr); + ;} + break; + + case 10: +#line 103 "./Parser.y" + { + yyerror(wxT("Missing right operand for OR on search expression")); + delete (yyvsp[(1) - (3)].pexpr); + return 1; + ;} + break; + + case 11: +#line 109 "./Parser.y" + { + yyerror(wxT("Missing operand for NOT on search expression")); + delete (yyvsp[(1) - (3)].pexpr); + return 1; + ;} + break; + + case 12: +#line 115 "./Parser.y" + { + yyerror(wxT("Missing left parenthesis on search expression")); + return 1; + ;} + break; + + case 13: +#line 120 "./Parser.y" + { + yyerror(wxT("Missing closing parenthesis on search expression")); + delete (yyvsp[(2) - (3)].pexpr); + return 1; + ;} + break; + + case 14: +#line 126 "./Parser.y" + { + yyerror(wxT("Missing left operand for AND on search expression")); + return 1; + ;} + break; + + case 15: +#line 131 "./Parser.y" + { + yyerror(wxT("Missing left operand for OR on search expression")); + return 1; + ;} + break; + + case 16: +#line 136 "./Parser.y" + { + yyerror(wxT("Missing left operand for NOT on search expression (?)")); + return 1; + ;} + break; + + case 17: +#line 143 "./Parser.y" + { + (yyval.pexpr) = new CSearchExpr(*(yyvsp[(1) - (1)].pstr)); + delete (yyvsp[(1) - (1)].pstr); + ;} + break; + + case 18: +#line 148 "./Parser.y" + { + /*$1->Concatenate($2); + delete $2;*/ + CSearchExpr* pexpr = new CSearchExpr; + pexpr->Add(SEARCHOP_AND); + pexpr->Add((yyvsp[(1) - (2)].pexpr)); + pexpr->Add(*(yyvsp[(2) - (2)].pstr)); + (yyval.pexpr) = pexpr; + delete (yyvsp[(1) - (2)].pexpr); + delete (yyvsp[(2) - (2)].pstr); + ;} + break; + + +/* Line 1267 of yacc.c. */ +#line 1513 "Parser.cpp" + default: break; + } + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (YY_("syntax error")); +#else + { + YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); + if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) + { + YYSIZE_T yyalloc = 2 * yysize; + if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) + yyalloc = YYSTACK_ALLOC_MAXIMUM; + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yyalloc); + if (yymsg) + yymsg_alloc = yyalloc; + else + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + } + } + + if (0 < yysize && yysize <= yymsg_alloc) + { + (void) yysyntax_error (yymsg, yystate, yychar); + yyerror (yymsg); + } + else + { + yyerror (YY_("syntax error")); + if (yysize != 0) + goto yyexhaustedlab; + } + } +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse look-ahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse look-ahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + yystos[yystate], yyvsp); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + *++yyvsp = yylval; + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEOF && yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + /* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + /* Make sure YYID is used. */ + return YYID (yyresult); +} + + +#line 161 "./Parser.y" + + +int yyerror(const char* errstr) +{ + // Errors created by yacc generated code + //yyerror ("syntax error: cannot back up"); + //yyerror ("syntax error; also virtual memory exhausted"); + //yyerror ("syntax error"); + //yyerror ("parser stack overflow"); + + _astrParserErrors.Add(char2unicode(errstr)); + return EXIT_FAILURE; +} + +int yyerror(wxString errstr) +{ + _astrParserErrors.Add(errstr); + return EXIT_FAILURE; +} + diff --git a/src/Parser.hpp b/src/Parser.hpp new file mode 100644 index 00000000..a3c86e45 --- /dev/null +++ b/src/Parser.hpp @@ -0,0 +1,75 @@ +/* A Bison parser, made by GNU Bison 2.3. */ + +/* Skeleton interface for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + TOK_STRING = 258, + TOK_AND = 259, + TOK_OR = 260, + TOK_NOT = 261, + TOK_ED2K_LINK = 262 + }; +#endif +/* Tokens. */ +#define TOK_STRING 258 +#define TOK_AND 259 +#define TOK_OR 260 +#define TOK_NOT 261 +#define TOK_ED2K_LINK 262 + + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +#line 23 "./Parser.y" +{ + wxString* pstr; + CSearchExpr* pexpr; +} +/* Line 1489 of yacc.c. */ +#line 68 "Parser.hpp" + YYSTYPE; +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + +extern YYSTYPE yylval; + diff --git a/src/Parser.y b/src/Parser.y new file mode 100644 index 00000000..443af7ad --- /dev/null +++ b/src/Parser.y @@ -0,0 +1,178 @@ +%{ +#include "SearchExpr.h" +#include "Scanner.h.in" +#include "Scanner.h" +#include "OtherFunctions.h" + +#include "libs/common/StringFunctions.h" + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +extern wxArrayString _astrParserErrors; + +void ParsedSearchExpression(const CSearchExpr* pexpr); +int yyerror(const char* errstr); +int yyerror(wxString errstr); + +%} + +%union { + wxString* pstr; + CSearchExpr* pexpr; +} + +%token TOK_STRING +%token TOK_AND TOK_OR TOK_NOT +%token TOK_ED2K_LINK + +%type searchexpr and_strings +%type TOK_STRING TOK_ED2K_LINK + +%left TOK_OR +%left TOK_AND +%left TOK_NOT + +%% +/*-------------------------------------------------------------------*/ + +action : searchexpr + { + ParsedSearchExpression($1); + delete $1; + return 0; + } + | TOK_ED2K_LINK + { + CSearchExpr* pexpr = new CSearchExpr(*$1); + ParsedSearchExpression(pexpr); + delete pexpr; + delete $1; + return 0; + } + /* --------- Error Handling --------- */ + | searchexpr error + { + yyerror(wxT("Undefined search expression error")); + delete $1; + return 1; + } + ; + + +searchexpr : and_strings + | searchexpr TOK_AND searchexpr + { + CSearchExpr* pexpr = new CSearchExpr; + pexpr->Add(SEARCHOP_AND); + pexpr->Add($1); + pexpr->Add($3); + $$ = pexpr; + delete $1; + delete $3; + } + | searchexpr TOK_OR searchexpr + { + CSearchExpr* pexpr = new CSearchExpr; + pexpr->Add(SEARCHOP_OR); + pexpr->Add($1); + pexpr->Add($3); + $$ = pexpr; + delete $1; + delete $3; + } + | searchexpr TOK_NOT searchexpr + { + CSearchExpr* pexpr = new CSearchExpr; + pexpr->Add(SEARCHOP_NOT); + pexpr->Add($1); + pexpr->Add($3); + $$ = pexpr; + delete $1; + delete $3; + } + | '(' searchexpr ')' + { + $$ = $2; + } + /* --------- Error Handling --------- */ + | searchexpr TOK_OR error + { + yyerror(wxT("Missing right operand for OR on search expression")); + delete $1; + return 1; + } + | searchexpr TOK_NOT error + { + yyerror(wxT("Missing operand for NOT on search expression")); + delete $1; + return 1; + } + | '(' error + { + yyerror(wxT("Missing left parenthesis on search expression")); + return 1; + } + | '(' searchexpr error + { + yyerror(wxT("Missing closing parenthesis on search expression")); + delete $2; + return 1; + } + | TOK_AND error + { + yyerror(wxT("Missing left operand for AND on search expression")); + return 1; + } + | TOK_OR error + { + yyerror(wxT("Missing left operand for OR on search expression")); + return 1; + } + | TOK_NOT error + { + yyerror(wxT("Missing left operand for NOT on search expression (?)")); + return 1; + } + ; + +and_strings : TOK_STRING + { + $$ = new CSearchExpr(*$1); + delete $1; + } + | and_strings TOK_STRING + { + /*$1->Concatenate($2); + delete $2;*/ + CSearchExpr* pexpr = new CSearchExpr; + pexpr->Add(SEARCHOP_AND); + pexpr->Add($1); + pexpr->Add(*$2); + $$ = pexpr; + delete $1; + delete $2; + } + ; + +%% + +int yyerror(const char* errstr) +{ + // Errors created by yacc generated code + //yyerror ("syntax error: cannot back up"); + //yyerror ("syntax error; also virtual memory exhausted"); + //yyerror ("syntax error"); + //yyerror ("parser stack overflow"); + + _astrParserErrors.Add(char2unicode(errstr)); + return EXIT_FAILURE; +} + +int yyerror(wxString errstr) +{ + _astrParserErrors.Add(errstr); + return EXIT_FAILURE; +} diff --git a/src/PartFile.cpp b/src/PartFile.cpp new file mode 100644 index 00000000..d0df46d2 --- /dev/null +++ b/src/PartFile.cpp @@ -0,0 +1,4136 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include + +#include "PartFile.h" // Interface declarations. + +#ifdef HAVE_CONFIG_H + #include "config.h" // Needed for VERSION +#endif + +#include +#include +#include +#include +#include +#include + +#include +#include // Needed for wxStringTokenizer + +#include "KnownFileList.h" // Needed for CKnownFileList +#include "UploadQueue.h" // Needed for CFileHash +#include "IPFilter.h" // Needed for CIPFilter +#include "Server.h" // Needed for CServer +#include "ServerConnect.h" // Needed for CServerConnect +#include "updownclient.h" // Needed for CUpDownClient +#include "MemFile.h" // Needed for CMemFile +#include "Preferences.h" // Needed for CPreferences +#include "DownloadQueue.h" // Needed for CDownloadQueue +#include "amule.h" // Needed for theApp +#include "ED2KLink.h" // Needed for CED2KLink +#include "Packet.h" // Needed for CTag +#include "SearchList.h" // Needed for CSearchFile +#include "ClientList.h" // Needed for clientlist +#include "Statistics.h" // Needed for theStats +#include "Logger.h" +#include // Needed for CFormat +#include // Needed for GetLastModificationTime +#include "ThreadTasks.h" // Needed for CHashingTask/CCompletionTask +#include "GuiEvents.h" // Needed for Notify_* +#include "DataToText.h" // Needed for OriginToText() + +#include "kademlia/kademlia/Kademlia.h" +#include "kademlia/kademlia/Search.h" + + +SFileRating::SFileRating(const wxString &u, const wxString &f, sint16 r, const wxString &c) +: +UserName(u), +FileName(f), +Rating(r), +Comment(c) +{ +} + + +SFileRating::SFileRating(const SFileRating &fr) +: +UserName(fr.UserName), +FileName(fr.FileName), +Rating(fr.Rating), +Comment(fr.Comment) +{ +} + + +SFileRating::SFileRating(const CUpDownClient &client) +: +UserName(client.GetUserName()), +FileName(client.GetClientFilename()), +Rating(client.GetFileRating()), +Comment(client.GetFileComment()) +{ +} + + +SFileRating::~SFileRating() +{ +} + + +typedef std::list ChunkList; + + +#ifndef CLIENT_GUI + +CPartFile::CPartFile() +{ + Init(); +} + +CPartFile::CPartFile(CSearchFile* searchresult) +{ + Init(); + + m_abyFileHash = searchresult->GetFileHash(); + SetFileName(searchresult->GetFileName()); + SetFileSize(searchresult->GetFileSize()); + + for (unsigned int i = 0; i < searchresult->m_taglist.size(); ++i){ + const CTag& pTag = searchresult->m_taglist[i]; + + bool bTagAdded = false; + if (pTag.GetNameID() == 0 && !pTag.GetName().IsEmpty() && (pTag.IsStr() || pTag.IsInt())) { + static const struct { + wxString pszName; + uint8 nType; + } _aMetaTags[] = + { + { wxT(FT_ED2K_MEDIA_ARTIST), 2 }, + { wxT(FT_ED2K_MEDIA_ALBUM), 2 }, + { wxT(FT_ED2K_MEDIA_TITLE), 2 }, + { wxT(FT_ED2K_MEDIA_LENGTH), 2 }, + { wxT(FT_ED2K_MEDIA_BITRATE), 3 }, + { wxT(FT_ED2K_MEDIA_CODEC), 2 } + }; + + for (unsigned int t = 0; t < itemsof(_aMetaTags); ++t) { + if ( pTag.GetType() == _aMetaTags[t].nType && + (pTag.GetName() == _aMetaTags[t].pszName)) { + // skip string tags with empty string values + if (pTag.IsStr() && pTag.GetStr().IsEmpty()) { + break; + } + + // skip "length" tags with "0: 0" values + if (pTag.GetName() == wxT(FT_ED2K_MEDIA_LENGTH)) { + if (pTag.GetStr().IsSameAs(wxT("0: 0")) || + pTag.GetStr().IsSameAs(wxT("0:0"))) { + break; + } + } + + // skip "bitrate" tags with '0' values + if ((pTag.GetName() == wxT(FT_ED2K_MEDIA_BITRATE)) && !pTag.GetInt()) { + break; + } + + AddDebugLogLineM( false, logPartFile, + wxT("CPartFile::CPartFile(CSearchFile*): added tag ") + + pTag.GetFullInfo() ); + m_taglist.push_back(pTag); + bTagAdded = true; + break; + } + } + } else if (pTag.GetNameID() != 0 && pTag.GetName().IsEmpty() && (pTag.IsStr() || pTag.IsInt())) { + static const struct { + uint8 nID; + uint8 nType; + } _aMetaTags[] = + { + { FT_FILETYPE, 2 }, + { FT_FILEFORMAT, 2 } + }; + for (unsigned int t = 0; t < itemsof(_aMetaTags); ++t) { + if (pTag.GetType() == _aMetaTags[t].nType && pTag.GetNameID() == _aMetaTags[t].nID) { + // skip string tags with empty string values + if (pTag.IsStr() && pTag.GetStr().IsEmpty()) { + break; + } + + AddDebugLogLineM( false, logPartFile, + wxT("CPartFile::CPartFile(CSearchFile*): added tag ") + + pTag.GetFullInfo() ); + m_taglist.push_back(pTag); + bTagAdded = true; + break; + } + } + } + + if (!bTagAdded) { + AddDebugLogLineM( false, logPartFile, + wxT("CPartFile::CPartFile(CSearchFile*): ignored tag ") + + pTag.GetFullInfo() ); + } + } + + CreatePartFile(); +} + + +CPartFile::CPartFile(const CED2KFileLink* fileLink) +{ + Init(); + + SetFileName(CPath(fileLink->GetName())); + SetFileSize(fileLink->GetSize()); + m_abyFileHash = fileLink->GetHashKey(); + + CreatePartFile(); + + if (fileLink->m_hashset) { + if (!LoadHashsetFromFile(fileLink->m_hashset, true)) { + AddDebugLogLineM(true, logPartFile, wxT("eD2K link contained invalid hashset: ") + fileLink->GetLink()); + } + } +} + + +CPartFile::~CPartFile() +{ + + // Barry - Ensure all buffered data is written + + // Kry - WTF? + // eMule had same problem with lseek error ... and override with a simple + // check for INVALID_HANDLE_VALUE (that, btw, does not exist on linux) + // So we just guess is < 0 on error and > 2 if ok (0 stdin, 1 stdout, 2 stderr) + // But, where does this wrong handle comes from? + + if (m_hpartfile.IsOpened() && (m_hpartfile.fd() > 2)) { + FlushBuffer(true); + } + + if (m_hpartfile.IsOpened() && (m_hpartfile.fd() > 2)) { + m_hpartfile.Close(); + // Update met file (with current directory entry) + SavePartFile(); + } + + DeleteContents(m_gaplist); + + std::list::iterator it = m_BufferedData_list.begin(); + for (; it != m_BufferedData_list.end(); ++it) { + PartFileBufferedData* item = *it; + + delete[] item->data; + delete item; + } + + wxASSERT(m_SrcList.empty()); + wxASSERT(m_A4AFsrclist.empty()); +} + +void CPartFile::CreatePartFile() +{ + // use lowest free partfilenumber for free file (InterCeptor) + int i = 0; + do { + ++i; + m_partmetfilename = CPath(wxString::Format(wxT("%03i.part.met"), i)); + m_fullname = thePrefs::GetTempDir().JoinPaths(m_partmetfilename); + } while (m_fullname.FileExists()); + + wxString strPartName = m_partmetfilename.RemoveExt().GetRaw(); + m_taglist.push_back(CTagString(FT_PARTFILENAME, strPartName )); + + Gap_Struct* gap = new Gap_Struct; + gap->start = 0; + gap->end = GetFileSize() - 1; + + m_gaplist.push_back(gap); + + CPath partPath = m_fullname.RemoveExt(); + if (m_hpartfile.Create(partPath, true)) { + m_hpartfile.Close(); + + if(!m_hpartfile.Open(partPath, CFile::read_write)) { + AddLogLineM(false,_("ERROR: Failed to open partfile)")); + SetPartFileStatus(PS_ERROR); + } + } else { + AddLogLineM(false,_("ERROR: Failed to create partfile)")); + SetPartFileStatus(PS_ERROR); + } + + SetFilePath(thePrefs::GetTempDir()); + + if (thePrefs::GetAllocFullPart()) { + //#warning Code for full file alloc - should be done on thread. + } + + + m_hashsetneeded = GetED2KPartHashCount(); + + SavePartFile(true); + SetActive(theApp->IsConnected()); +} + + +uint8 CPartFile::LoadPartFile(const CPath& in_directory, const CPath& filename, bool from_backup, bool getsizeonly) +{ + bool isnewstyle = false; + uint8 version,partmettype=PMT_UNKNOWN; + + std::map gap_map; // Slugfiller + transferred = 0; + + m_partmetfilename = filename; + m_filePath = in_directory; + m_fullname = m_filePath.JoinPaths(m_partmetfilename); + + // readfile data form part.met file + CPath curMetFilename = m_fullname; + if (from_backup) { + curMetFilename = curMetFilename.AppendExt(PARTMET_BAK_EXT); + AddLogLineM(false, CFormat( _("Trying to load backup of met-file from %s") ) + % curMetFilename ); + } + + try { + CFile metFile(curMetFilename, CFile::read); + if (!metFile.IsOpened()) { + AddLogLineM(false, CFormat( _("Error: Failed to open part.met file: %s ==> %s") ) + % curMetFilename + % GetFileName() ); + + return false; + } else if (metFile.GetLength() == 0) { + AddLogLineM(false, CFormat( _("Error: part.met file is 0 size: %s ==> %s") ) + % m_partmetfilename + % GetFileName() ); + + return false; + } + + version = metFile.ReadUInt8(); + if (version != PARTFILE_VERSION && version != PARTFILE_SPLITTEDVERSION && version != PARTFILE_VERSION_LARGEFILE){ + metFile.Close(); + //if (version == 83) return ImportShareazaTempFile(...) + AddLogLineM(false, CFormat( _("Error: Invalid part.met fileversion: %s ==> %s") ) + % m_partmetfilename + % GetFileName() ); + return false; + } + + isnewstyle = (version == PARTFILE_SPLITTEDVERSION); + partmettype = isnewstyle ? PMT_SPLITTED : PMT_DEFAULTOLD; + + if (!isnewstyle) { + uint8 test[4]; + metFile.Seek(24, wxFromStart); + metFile.Read(test,4); + + metFile.Seek(1, wxFromStart); + if (test[0]==0 && test[1]==0 && test[2]==2 && test[3]==1) { + isnewstyle=true; // edonkeys so called "old part style" + partmettype=PMT_NEWOLD; + } + } + + if (isnewstyle) { + uint32 temp = metFile.ReadUInt32(); + + if (temp==0) { // 0.48 partmets - different again + LoadHashsetFromFile(&metFile, false); + } else { + metFile.Seek(2, wxFromStart); + LoadDateFromFile(&metFile); + m_abyFileHash = metFile.ReadHash(); + } + + } else { + LoadDateFromFile(&metFile); + LoadHashsetFromFile(&metFile, false); + } + + uint32 tagcount = metFile.ReadUInt32(); + + for (uint32 j = 0; j < tagcount; ++j) { + CTag newtag(metFile,true); + if ( !getsizeonly || + (getsizeonly && + (newtag.GetNameID() == FT_FILESIZE || + newtag.GetNameID() == FT_FILENAME))) { + switch(newtag.GetNameID()) { + case FT_FILENAME: { + if (!GetFileName().IsOk()) { + // If it's not empty, we already loaded the unicoded one + SetFileName(CPath(newtag.GetStr())); + } + break; + } + case FT_LASTSEENCOMPLETE: { + lastseencomplete = newtag.GetInt(); + break; + } + case FT_FILESIZE: { + SetFileSize(newtag.GetInt()); + break; + } + case FT_TRANSFERRED: { + transferred = newtag.GetInt(); + break; + } + case FT_FILETYPE:{ + //#warning needs setfiletype string + //SetFileType(newtag.GetStr()); + break; + } + case FT_CATEGORY: { + m_category = newtag.GetInt(); + if (m_category > theApp->glob_prefs->GetCatCount() - 1 ) { + m_category = 0; + } + break; + } + case FT_OLDDLPRIORITY: + case FT_DLPRIORITY: { + if (!isnewstyle){ + m_iDownPriority = newtag.GetInt(); + if( m_iDownPriority == PR_AUTO ){ + m_iDownPriority = PR_HIGH; + SetAutoDownPriority(true); + } + else{ + if ( m_iDownPriority != PR_LOW && + m_iDownPriority != PR_NORMAL && + m_iDownPriority != PR_HIGH) + m_iDownPriority = PR_NORMAL; + SetAutoDownPriority(false); + } + } + break; + } + case FT_STATUS: { + m_paused = newtag.GetInt(); + m_stopped = m_paused; + break; + } + case FT_OLDULPRIORITY: + case FT_ULPRIORITY: { + if (!isnewstyle){ + SetUpPriority(newtag.GetInt(), false); + if( GetUpPriority() == PR_AUTO ){ + SetUpPriority(PR_HIGH, false); + SetAutoUpPriority(true); + } else { + SetAutoUpPriority(false); + } + } + break; + } + case FT_KADLASTPUBLISHSRC:{ + SetLastPublishTimeKadSrc(newtag.GetInt(), 0); + if(GetLastPublishTimeKadSrc() > (uint32)time(NULL)+KADEMLIAREPUBLISHTIMES) { + //There may be a posibility of an older client that saved a random number here.. This will check for that.. + SetLastPublishTimeKadSrc(0,0); + } + break; + } + case FT_KADLASTPUBLISHNOTES:{ + SetLastPublishTimeKadNotes(newtag.GetInt()); + break; + } + // old tags: as long as they are not needed, take the chance to purge them + case FT_PERMISSIONS: + case FT_KADLASTPUBLISHKEY: + break; + case FT_DL_ACTIVE_TIME: + if (newtag.IsInt()) { + m_nDlActiveTime = newtag.GetInt(); + } + break; + case FT_CORRUPTEDPARTS: { + wxASSERT(m_corrupted_list.empty()); + wxString strCorruptedParts(newtag.GetStr()); + wxStringTokenizer tokenizer(strCorruptedParts, wxT(",")); + while ( tokenizer.HasMoreTokens() ) { + wxString token = tokenizer.GetNextToken(); + unsigned long uPart; + if (token.ToULong(&uPart)) { + if (uPart < GetPartCount() && !IsCorruptedPart(uPart)) { + m_corrupted_list.push_back(uPart); + } + } + } + break; + } + case FT_AICH_HASH:{ + CAICHHash hash; + bool hashSizeOk = + hash.DecodeBase32(newtag.GetStr()) == CAICHHash::GetHashSize(); + wxASSERT(hashSizeOk); + if (hashSizeOk) { + m_pAICHHashSet->SetMasterHash(hash, AICH_VERIFIED); + } + break; + } + case FT_ATTRANSFERRED:{ + statistic.SetAllTimeTransferred(statistic.GetAllTimeTransferred() + (uint64)newtag.GetInt()); + break; + } + case FT_ATTRANSFERREDHI:{ + statistic.SetAllTimeTransferred(statistic.GetAllTimeTransferred() + (((uint64)newtag.GetInt()) << 32)); + break; + } + case FT_ATREQUESTED:{ + statistic.SetAllTimeRequests(newtag.GetInt()); + break; + } + case FT_ATACCEPTED:{ + statistic.SetAllTimeAccepts(newtag.GetInt()); + break; + } + default: { + // Start Changes by Slugfiller for better exception handling + + wxCharBuffer tag_ansi_name = newtag.GetName().ToAscii(); + char gap_mark = tag_ansi_name ? tag_ansi_name[0u] : 0; + if ( newtag.IsInt() && (newtag.GetName().Length() > 1) && + ((gap_mark == FT_GAPSTART) || + (gap_mark == FT_GAPEND))) { + Gap_Struct *gap = NULL; + unsigned long int gapkey; + if (newtag.GetName().Mid(1).ToULong(&gapkey)) { + if ( gap_map.find( gapkey ) == gap_map.end() ) { + gap = new Gap_Struct; + gap_map[gapkey] = gap; + gap->start = (uint64)-1; + gap->end = (uint64)-1; + } else { + gap = gap_map[ gapkey ]; + } + if (gap_mark == FT_GAPSTART) { + gap->start = newtag.GetInt(); + } + if (gap_mark == FT_GAPEND) { + gap->end = newtag.GetInt()-1; + } + } else { + printf("Wrong gap map key while reading met file!\n"); + wxASSERT(0); + } + // End Changes by Slugfiller for better exception handling + } else { + m_taglist.push_back(newtag); + } + } + } + } else { + // Nothing. Else, nothing. + } + } + + // load the hashsets from the hybridstylepartmet + if (isnewstyle && !getsizeonly && (metFile.GetPosition()::iterator it = gap_map.begin(); + for ( ; it != gap_map.end(); ++it ) { + Gap_Struct* gap = it->second; + // SLUGFILLER: SafeHash - revised code, and extra safety + if ( (gap->start != (uint64)-1) && + (gap->end != (uint64)-1) && + gap->start <= gap->end && + gap->start < GetFileSize()) { + if (gap->end >= GetFileSize()) { + gap->end = GetFileSize()-1; // Clipping + } + AddGap(gap->start, gap->end); // All tags accounted for, use safe adding + } + delete gap; + // SLUGFILLER: SafeHash + } + + //check if this is a backup + if ( m_fullname.GetExt().MakeLower() == wxT("backup" )) { + m_fullname = m_fullname.RemoveExt(); + } + + // open permanent handle + CPath partFilePath = m_fullname.RemoveExt(); + if ( !m_hpartfile.Open(partFilePath, CFile::read_write)) { + AddLogLineM(false, CFormat( _("Failed to open %s (%s)") ) + % m_fullname + % GetFileName() ); + return false; + } + + SetPartFileStatus(PS_EMPTY); + + try { + // SLUGFILLER: SafeHash - final safety, make sure any missing part of the file is gap + if (m_hpartfile.GetLength() < GetFileSize()) + AddGap(m_hpartfile.GetLength(), GetFileSize()-1); + // Goes both ways - Partfile should never be too large + if (m_hpartfile.GetLength() > GetFileSize()) { + AddDebugLogLineM( true, logPartFile, CFormat( wxT("Partfile \"%s\" is too large! Truncating %llu bytes.") ) % GetFileName() % (m_hpartfile.GetLength() - GetFileSize())); + m_hpartfile.SetLength(GetFileSize()); + } + // SLUGFILLER: SafeHash + } catch (const CIOFailureException& e) { + AddDebugLogLineM( true, logPartFile, CFormat( wxT("Error while accessing partfile \"%s\": %s") ) % GetFileName() % e.what()); + SetPartFileStatus(PS_ERROR); + } + + + // check hashcount, file status etc + if (GetHashCount() != GetED2KPartHashCount()){ + m_hashsetneeded = true; + return true; + } else { + m_hashsetneeded = false; + for (size_t i = 0; i < m_hashlist.size(); ++i) { + if (IsComplete(i*PARTSIZE,((i+1)*PARTSIZE)-1)) { + SetPartFileStatus(PS_READY); + } + } + } + + if (m_gaplist.empty()) { // is this file complete already? + CompleteFile(false); + return true; + } + + if (!isnewstyle) { // not for importing + const time_t file_date = CPath::GetModificationTime(partFilePath); + if (m_lastDateChanged != file_date) { + // It's pointless to rehash an empty file, since the case + // where a user has zero'd a file is handled above ... + if (m_hpartfile.GetLength()) { + AddLogLineM(false, CFormat( _("Warning: %s might be corrupted (%i)") ) + % partFilePath + % (m_lastDateChanged - file_date) ); + // rehash + SetPartFileStatus(PS_WAITINGFORHASH); + + CPath partFileName = m_partmetfilename.RemoveExt(); + CThreadScheduler::AddTask(new CHashingTask(m_filePath, partFileName, this)); + } + } + } + + UpdateCompletedInfos(); + if (completedsize > transferred) { + m_iGainDueToCompression = completedsize - transferred; + } else if (completedsize != transferred) { + m_iLostDueToCorruption = transferred - completedsize; + } + + return true; +} + + +bool CPartFile::SavePartFile(bool Initial) +{ + switch (status) { + case PS_WAITINGFORHASH: + case PS_HASHING: + case PS_COMPLETE: + return false; + } + + /* Don't write anything to disk if less than 100 KB of free space is left. */ + sint64 free = CPath::GetFreeSpaceAt(GetFilePath()); + if ((free != wxInvalidOffset) && (free < (100 * 1024))) { + return false; + } + + CFile file; + try { + if (!m_fullname.RemoveExt().FileExists()) { + throw wxString(wxT(".part file not found")); + } + + uint32 lsc = lastseencomplete; + + if (!Initial) { + CPath::BackupFile(m_fullname, wxT(".backup")); + CPath::RemoveFile(m_fullname); + } + + file.Open(m_fullname, CFile::write); + if (!file.IsOpened()) { + throw wxString(wxT("Failed to open part.met file")); + } + + // version + file.WriteUInt8(IsLargeFile() ? PARTFILE_VERSION_LARGEFILE : PARTFILE_VERSION); + + file.WriteUInt32(CPath::GetModificationTime(m_fullname.RemoveExt())); + // hash + file.WriteHash(m_abyFileHash); + uint16 parts = m_hashlist.size(); + file.WriteUInt16(parts); + for (int x = 0; x < parts; ++x) { + file.WriteHash(m_hashlist[x]); + } + // tags + #define FIXED_TAGS 15 + uint32 tagcount = m_taglist.size() + FIXED_TAGS + (m_gaplist.size()*2); + if (!m_corrupted_list.empty()) { + ++tagcount; + } + + if (m_pAICHHashSet->HasValidMasterHash() && (m_pAICHHashSet->GetStatus() == AICH_VERIFIED)){ + ++tagcount; + } + + if (GetLastPublishTimeKadSrc()){ + ++tagcount; + } + + if (GetLastPublishTimeKadNotes()){ + ++tagcount; + } + + if (GetDlActiveTime()){ + ++tagcount; + } + + file.WriteUInt32(tagcount); + + //#warning Kry - Where are lost by coruption and gained by compression? + + // 0 (unicoded part file name) + // We write it with BOM to keep eMule compatibility. Note that the 'printable' filename is saved, + // as presently the filename does not represent an actual file. + CTagString( FT_FILENAME, GetFileName().GetPrintable()).WriteTagToFile( &file, utf8strOptBOM ); + CTagString( FT_FILENAME, GetFileName().GetPrintable()).WriteTagToFile( &file ); // 1 + + CTagIntSized( FT_FILESIZE, GetFileSize(), IsLargeFile() ? 64 : 32).WriteTagToFile( &file );// 2 + CTagIntSized( FT_TRANSFERRED, transferred, IsLargeFile() ? 64 : 32).WriteTagToFile( &file ); // 3 + CTagInt32( FT_STATUS, (m_paused?1:0)).WriteTagToFile( &file ); // 4 + + if ( IsAutoDownPriority() ) { + CTagInt32( FT_DLPRIORITY, (uint8)PR_AUTO ).WriteTagToFile( &file ); // 5 + CTagInt32( FT_OLDDLPRIORITY, (uint8)PR_AUTO ).WriteTagToFile( &file ); // 6 + } else { + CTagInt32( FT_DLPRIORITY, m_iDownPriority ).WriteTagToFile( &file ); // 5 + CTagInt32( FT_OLDDLPRIORITY, m_iDownPriority ).WriteTagToFile( &file ); // 6 + } + + CTagInt32( FT_LASTSEENCOMPLETE, lsc ).WriteTagToFile( &file ); // 7 + + if ( IsAutoUpPriority() ) { + CTagInt32( FT_ULPRIORITY, (uint8)PR_AUTO ).WriteTagToFile( &file ); // 8 + CTagInt32( FT_OLDULPRIORITY, (uint8)PR_AUTO ).WriteTagToFile( &file ); // 9 + } else { + CTagInt32( FT_ULPRIORITY, GetUpPriority() ).WriteTagToFile( &file ); // 8 + CTagInt32( FT_OLDULPRIORITY, GetUpPriority() ).WriteTagToFile( &file ); // 9 + } + + CTagInt32(FT_CATEGORY, m_category).WriteTagToFile( &file ); // 10 + CTagInt32(FT_ATTRANSFERRED, statistic.GetAllTimeTransferred() & 0xFFFFFFFF).WriteTagToFile( &file );// 11 + CTagInt32(FT_ATTRANSFERREDHI, statistic.GetAllTimeTransferred() >>32).WriteTagToFile( &file );// 12 + CTagInt32(FT_ATREQUESTED, statistic.GetAllTimeRequests()).WriteTagToFile( &file ); // 13 + CTagInt32(FT_ATACCEPTED, statistic.GetAllTimeAccepts()).WriteTagToFile( &file ); // 14 + + // currupt part infos + if (!m_corrupted_list.empty()) { + wxString strCorruptedParts; + std::list::iterator it = m_corrupted_list.begin(); + for (; it != m_corrupted_list.end(); ++it) { + uint16 uCorruptedPart = *it; + if (!strCorruptedParts.IsEmpty()) { + strCorruptedParts += wxT(","); + } + strCorruptedParts += wxString::Format(wxT("%u"), (unsigned)uCorruptedPart); + } + wxASSERT( !strCorruptedParts.IsEmpty() ); + + CTagString( FT_CORRUPTEDPARTS, strCorruptedParts ).WriteTagToFile( &file); // 11? + } + + //AICH Filehash + if (m_pAICHHashSet->HasValidMasterHash() && (m_pAICHHashSet->GetStatus() == AICH_VERIFIED)){ + CTagString aichtag(FT_AICH_HASH, m_pAICHHashSet->GetMasterHash().GetString() ); + aichtag.WriteTagToFile(&file); // 12? + } + + if (GetLastPublishTimeKadSrc()){ + CTagInt32(FT_KADLASTPUBLISHSRC, GetLastPublishTimeKadSrc()).WriteTagToFile(&file); // 15? + } + + if (GetLastPublishTimeKadNotes()){ + CTagInt32(FT_KADLASTPUBLISHNOTES, GetLastPublishTimeKadNotes()).WriteTagToFile(&file); // 16? + } + + if (GetDlActiveTime()){ + CTagInt32(FT_DL_ACTIVE_TIME, GetDlActiveTime()).WriteTagToFile(&file); // 17 + } + + for (uint32 j = 0; j < (uint32)m_taglist.size();++j) { + m_taglist[j].WriteTagToFile(&file); + } + + // gaps + unsigned i_pos = 0; + std::list::iterator it = m_gaplist.begin(); + for (; it != m_gaplist.end(); ++it) { + wxString tagName = wxString::Format(wxT(" %u"), i_pos); + + // gap start = first missing byte but gap ends = first non-missing byte + // in edonkey but I think its easier to user the real limits + tagName[0] = FT_GAPSTART; + CTagIntSized(tagName, (*it)->start , IsLargeFile() ? 64 : 32).WriteTagToFile( &file ); + + tagName[0] = FT_GAPEND; + CTagIntSized(tagName, ((*it)->end + 1), IsLargeFile() ? 64 : 32).WriteTagToFile( &file ); + + ++i_pos; + } + } catch (const wxString& error) { + AddLogLineM(false, CFormat( _("ERROR while saving partfile: %s (%s ==> %s)") ) + % error + % m_partmetfilename + % GetFileName() ); + + wxString err = CFormat( _("ERROR while saving partfile: %s (%s ==> %s)") ) + % error + % m_partmetfilename + % GetFileName(); + + printf("%s\n", (const char*)unicode2char(err)); + + return false; + } catch (const CIOFailureException& e) { + AddDebugLogLineM(true, logPartFile, wxT("IO failure while saving partfile: ") + e.what()); + printf("IO failure while saving partfile: %s\n", (const char*)unicode2char(e.what())); + + return false; + } + + file.Close(); + + if (!Initial) { + CPath::RemoveFile(m_fullname.AppendExt(wxT(".backup"))); + } + + sint64 metLength = m_fullname.GetFileSize(); + if (metLength == wxInvalidOffset) { + theApp->ShowAlert( CFormat( _("Could not retrieve length of '%s' - using %s file.") ) + % m_fullname + % PARTMET_BAK_EXT, + _("Message"), wxOK); + + CPath::CloneFile(m_fullname.AppendExt(PARTMET_BAK_EXT), m_fullname, true); + } else if (metLength == 0) { + // Don't backup if it's 0 size but raise a warning!!! + theApp->ShowAlert( CFormat( _("'%s' is 0 size somehow - using %s file.") ) + % m_fullname + % PARTMET_BAK_EXT, + _("Message"), wxOK); + + CPath::CloneFile(m_fullname.AppendExt(PARTMET_BAK_EXT), m_fullname, true); + } else { + // no error, just backup + CPath::BackupFile(m_fullname, PARTMET_BAK_EXT); + } + + return true; +} + + +void CPartFile::SaveSourceSeeds() +{ + #define MAX_SAVED_SOURCES 10 + + // Kry - Sources seeds + // Based on a Feature request, this saves the last MAX_SAVED_SOURCES + // sources of the file, giving a 'seed' for the next run. + // We save the last sources because: + // 1 - They could be the hardest to get + // 2 - They will more probably be available + // However, if we have downloading sources, they have preference because + // we probably have more credits on them. + // Anyway, source exchange will get us the rest of the sources + // This feature is currently used only on rare files (< 20 sources) + // + + if (GetSourceCount()>20) { + return; + } + + CClientPtrList source_seeds; + int n_sources = 0; + + CClientPtrList::iterator it = m_downloadingSourcesList.begin(); + for( ; it != m_downloadingSourcesList.end() && n_sources < MAX_SAVED_SOURCES; ++it) { + CUpDownClient *cur_src = *it; + if (!cur_src->HasLowID()) { + source_seeds.push_back(cur_src); + ++n_sources; + } + } + + if (n_sources < MAX_SAVED_SOURCES) { + // Not enough downloading sources to fill the list, going to sources list + if (GetSourceCount() > 0) { + SourceSet::reverse_iterator rit = m_SrcList.rbegin(); + for ( ; ((rit != m_SrcList.rend()) && (n_sourcesHasLowID()) { + source_seeds.push_back(cur_src); + ++n_sources; + } + } + } + } + + // Write the file + if (!n_sources) { + return; + } + + const CPath seedsPath = m_fullname.AppendExt(wxT(".seeds")); + + CFile file; + file.Create(seedsPath, true); + if (!file.IsOpened()) { + AddLogLineM(false, CFormat( _("Failed to save part.met.seeds file for %s") ) + % m_fullname); + return; + } + + try { + file.WriteUInt8(0); // v3, to avoid v2 clients choking on it. + file.WriteUInt8(source_seeds.size()); + + CClientPtrList::iterator it2 = source_seeds.begin(); + for (; it2 != source_seeds.end(); ++it2) { + CUpDownClient* cur_src = *it2; + file.WriteUInt32(cur_src->GetUserIDHybrid()); + file.WriteUInt16(cur_src->GetUserPort()); + file.WriteHash(cur_src->GetUserHash()); + // CryptSettings - See SourceExchange V4 + const uint8 uSupportsCryptLayer = cur_src->SupportsCryptLayer() ? 1 : 0; + const uint8 uRequestsCryptLayer = cur_src->RequestsCryptLayer() ? 1 : 0; + const uint8 uRequiresCryptLayer = cur_src->RequiresCryptLayer() ? 1 : 0; + const uint8 byCryptOptions = (uRequiresCryptLayer << 2) | (uRequestsCryptLayer << 1) | (uSupportsCryptLayer << 0); + file.WriteUInt8(byCryptOptions); + } + + /* v2: Added to keep track of too old seeds */ + file.WriteUInt32(wxDateTime::Now().GetTicks()); + + AddLogLineM(false, CFormat( wxPLURAL("Saved %i source seed for partfile: %s (%s)", "Saved %i source seeds for partfile: %s (%s)", n_sources) ) + % n_sources + % m_fullname + % GetFileName()); + } catch (const CIOFailureException& e) { + AddDebugLogLineM(true, logPartFile, CFormat( wxT("Error saving partfile's seeds file (%s - %s): %s") ) + % m_partmetfilename + % GetFileName() + % e.what() ); + + n_sources = 0; + file.Close(); + CPath::RemoveFile(seedsPath); + } +} + +void CPartFile::LoadSourceSeeds() +{ + CMemFile sources_data; + + bool valid_sources = false; + + const CPath seedsPath = m_fullname.AppendExt(wxT(".seeds")); + if (!seedsPath.FileExists()) { + return; + } + + CFile file(seedsPath, CFile::read); + if (!file.IsOpened()) { + AddLogLineM(false, CFormat( _("Partfile %s (%s) has no seeds file") ) + % m_partmetfilename + % GetFileName() ); + return; + } + + + try { + if (file.GetLength() <= 1) { + AddLogLineM(false, CFormat( _("Partfile %s (%s) has a void seeds file") ) + % m_partmetfilename + % GetFileName() ); + return; + } + + uint8 src_count = file.ReadUInt8(); + + bool bUseSX2Format = (src_count == 0); + + if (bUseSX2Format) { + // v3 sources seeds + src_count = file.ReadUInt8(); + } + + sources_data.WriteUInt16(src_count); + + for (int i = 0; i< src_count; ++i) { + uint32 dwID = file.ReadUInt32(); + uint16 nPort = file.ReadUInt16(); + + sources_data.WriteUInt32(bUseSX2Format ? dwID : wxUINT32_SWAP_ALWAYS(dwID)); + sources_data.WriteUInt16(nPort); + sources_data.WriteUInt32(0); + sources_data.WriteUInt16(0); + + if (bUseSX2Format) { + sources_data.WriteHash(file.ReadHash()); + sources_data.WriteUInt8(file.ReadUInt8()); + } + + } + + if (!file.Eof()) { + + // v2: Added to keep track of too old seeds + time_t time = (time_t)file.ReadUInt32(); + + // Time frame is 2 hours. More than enough to compile + // your new aMule version!. + if ((time + MIN2S(120)) >= wxDateTime::Now().GetTicks()) { + valid_sources = true; + } + + } else { + // v1 has no time data. We can safely use + // the sources, next time will be saved. + valid_sources = true; + } + + if (valid_sources) { + sources_data.Seek(0); + AddClientSources(&sources_data, SF_SOURCE_SEEDS, bUseSX2Format ? 4 : 1, bUseSX2Format); + } + + } catch (const CSafeIOException& e) { + AddLogLineM(false, CFormat( _("Error reading partfile's seeds file (%s - %s): %s") ) + % m_partmetfilename + % GetFileName() + % e.what() ); + } + + file.Close(); +} + +void CPartFile::PartFileHashFinished(CKnownFile* result) +{ + m_lastDateChanged = result->m_lastDateChanged; + bool errorfound = false; + if (GetED2KPartHashCount() == 0){ + if (IsComplete(0, GetFileSize()-1)){ + if (result->GetFileHash() != GetFileHash()){ + AddLogLineM(false, + CFormat(wxPLURAL( + "Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |%s|", + "Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash |%s|", + 0) + ) + % 1 + % 0 + % GetFileName() + % result->GetFileHash().Encode() + % GetFileHash().Encode() ); + AddGap(0, GetFileSize()-1); + errorfound = true; + } + } + } + else{ + for (size_t i = 0; i < m_hashlist.size(); ++i){ + // Kry - trel_ar's completed parts check on rehashing. + // Very nice feature, if a file is completed but .part.met don't believe it, + // update it. + + if (!( i < result->GetHashCount() && (result->GetPartHash(i) == GetPartHash(i)))){ + if (IsComplete(i*PARTSIZE,((i+1)*PARTSIZE)-1)) { + CMD4Hash wronghash; + if ( i < result->GetHashCount() ) + wronghash = result->GetPartHash(i); + + AddLogLineM(false, + CFormat(wxPLURAL( + "Found corrupted part (%d) in %d part file %s - FileResultHash |%s| FileHash |%s|", + "Found corrupted part (%d) in %d parts file %s - FileResultHash |%s| FileHash |%s|", + GetED2KPartHashCount()) + ) + % ( i + 1 ) + % GetED2KPartHashCount() + % GetFileName() + % wronghash.Encode() + % GetPartHash(i).Encode() ); + + AddGap(i*PARTSIZE, + ((uint64)(((i+1)*PARTSIZE)-1) >= GetFileSize()) ? + GetFileSize()-1 : ((i+1)*PARTSIZE)-1); + errorfound = true; + } + } else { + if (!IsComplete(i*PARTSIZE,((i+1)*PARTSIZE)-1)){ + AddLogLineM(false, CFormat( _("Found completed part (%i) in %s") ) + % ( i + 1 ) + % GetFileName() ); + + FillGap(i*PARTSIZE, + ((uint64)(((i+1)*PARTSIZE)-1) >= GetFileSize()) ? + GetFileSize()-1 : ((i+1)*PARTSIZE)-1); + RemoveBlockFromList(i*PARTSIZE, + ((uint64)(((i+1)*PARTSIZE)-1) >= GetFileSize()) ? + GetFileSize()-1 : ((i+1)*PARTSIZE)-1); + } + } + } + } + + if ( !errorfound && + result->GetAICHHashset()->GetStatus() == AICH_HASHSETCOMPLETE && + status == PS_COMPLETING) { + delete m_pAICHHashSet; + m_pAICHHashSet = result->GetAICHHashset(); + result->SetAICHHashset(NULL); + m_pAICHHashSet->SetOwner(this); + } + else if (status == PS_COMPLETING) { + AddDebugLogLineM(false, logPartFile, + CFormat(wxT("Failed to store new AICH Hashset for completed file: %s")) + % GetFileName()); + } + + + delete result; + if (!errorfound){ + if (status == PS_COMPLETING){ + CompleteFile(true); + return; + } + else { + AddLogLineM(false, CFormat( _("Finished rehashing %s") ) % GetFileName()); + } + } + else{ + SetStatus(PS_READY); + SavePartFile(); + return; + } + SetStatus(PS_READY); + SavePartFile(); + theApp->sharedfiles->SafeAddKFile(this); +} + +void CPartFile::AddGap(uint64 start, uint64 end) +{ + std::list::iterator it = m_gaplist.begin(); + while (it != m_gaplist.end()) { + std::list::iterator it2 = it++; + Gap_Struct* cur_gap = *it2; + + if (cur_gap->start >= start && cur_gap->end <= end) { + // this gap is inside the new gap - delete + m_gaplist.erase(it2); + delete cur_gap; + continue; + } else if (cur_gap->start >= start && cur_gap->start <= end) { + // a part of this gap is in the new gap - extend limit and delete + end = cur_gap->end; + m_gaplist.erase(it2); + delete cur_gap; + continue; + } else if (cur_gap->end <= end && cur_gap->end >= start) { + // a part of this gap is in the new gap - extend limit and delete + start = cur_gap->start; + m_gaplist.erase(it2); + delete cur_gap; + continue; + } else if (start >= cur_gap->start && end <= cur_gap->end){ + // new gap is already inside this gap - return + return; + } + } + + Gap_Struct* new_gap = new Gap_Struct; + new_gap->start = start; + new_gap->end = end; + m_gaplist.push_back(new_gap); + UpdateDisplayedInfo(); +} + +bool CPartFile::IsAlreadyRequested(uint64 start, uint64 end) +{ + std::list::iterator it = m_requestedblocks_list.begin(); + for (; it != m_requestedblocks_list.end(); ++it) { + Requested_Block_Struct* cur_block = *it; + + if ((start <= cur_block->EndOffset) && (end >= cur_block->StartOffset)) { + return true; + } + } + return false; +} + +bool CPartFile::GetNextEmptyBlockInPart(uint16 partNumber, Requested_Block_Struct *result) +{ + Gap_Struct *firstGap; + Gap_Struct *currentGap; + uint64 end; + uint64 blockLimit; + + // Find start of this part + uint64 partStart = (PARTSIZE * partNumber); + uint64 start = partStart; + + // What is the end limit of this block, i.e. can't go outside part (or filesize) + uint64 partEnd = (PARTSIZE * (partNumber + 1)) - 1; + if (partEnd >= GetFileSize()) { + partEnd = GetFileSize() - 1; + } + // Loop until find a suitable gap and return true, or no more gaps and return false + while (true) { + firstGap = NULL; + + // Find the first gap from the start position + std::list::iterator it = m_gaplist.begin(); + for (; it != m_gaplist.end(); ++it) { + currentGap = *it; + + // Want gaps that overlap start<->partEnd + if ((currentGap->start <= partEnd) && (currentGap->end >= start)) { + // Is this the first gap? + if ((firstGap == NULL) || (currentGap->start < firstGap->start)) { + firstGap = currentGap; + } + } + } + + // If no gaps after start, exit + if (firstGap == NULL) { + return false; + } + // Update start position if gap starts after current pos + if (start < firstGap->start) { + start = firstGap->start; + } + // If this is not within part, exit + if (start > partEnd) { + return false; + } + // Find end, keeping within the max block size and the part limit + end = firstGap->end; + blockLimit = partStart + (BLOCKSIZE * (((start - partStart) / BLOCKSIZE) + 1)) - 1; + if (end > blockLimit) { + end = blockLimit; + } + if (end > partEnd) { + end = partEnd; + } + // If this gap has not already been requested, we have found a valid entry + if (!IsAlreadyRequested(start, end)) { + // Was this block to be returned + if (result != NULL) { + result->StartOffset = start; + result->EndOffset = end; + md4cpy(result->FileID, GetFileHash().GetHash()); + result->transferred = 0; + } + return true; + } else { + // Reposition to end of that gap + start = end + 1; + } + // If tried all gaps then break out of the loop + if (end == partEnd) { + break; + } + } + // No suitable gap found + return false; +} + + +void CPartFile::FillGap(uint64 start, uint64 end) +{ + std::list::iterator it = m_gaplist.begin(); + while (it != m_gaplist.end()) { + std::list::iterator it2 = it++; + Gap_Struct* cur_gap = *it2; + + if (cur_gap->start >= start && cur_gap->end <= end) { + // our part fills this gap completly + m_gaplist.erase(it2); + delete cur_gap; + continue; + } else if (cur_gap->start >= start && cur_gap->start <= end) { + // a part of this gap is in the part - set limit + cur_gap->start = end+1; + } else if (cur_gap->end <= end && cur_gap->end >= start) { + // a part of this gap is in the part - set limit + cur_gap->end = start-1; + } else if (start >= cur_gap->start && end <= cur_gap->end) { + uint64 buffer = cur_gap->end; + cur_gap->end = start-1; + cur_gap = new Gap_Struct; + cur_gap->start = end+1; + cur_gap->end = buffer; + m_gaplist.insert(++it2, cur_gap); + break; + } + } + UpdateCompletedInfos(); + UpdateDisplayedInfo(); +} + + +void CPartFile::UpdateCompletedInfos() +{ + uint64 allgaps = 0; + + std::list::iterator it = m_gaplist.begin(); + for (; it != m_gaplist.end(); ) { + std::list::iterator it2 = it++; + Gap_Struct* cur_gap = *it2; + + if ((cur_gap->end > GetFileSize()) || (cur_gap->start >= GetFileSize())) { + m_gaplist.erase(it2); + } else { + allgaps += cur_gap->end - cur_gap->start + 1; + } + } + + if ((!m_gaplist.empty()) || (!m_requestedblocks_list.empty())) { + percentcompleted = (1.0f-(double)allgaps/GetFileSize()) * 100; + completedsize = GetFileSize() - allgaps; + } else { + percentcompleted = 100; + completedsize = GetFileSize(); + } +} + + +void CPartFile::WritePartStatus(CMemFile* file) +{ + uint16 parts = GetED2KPartCount(); + file->WriteUInt16(parts); + uint16 done = 0; + while (done != parts){ + uint8 towrite = 0; + for (uint32 i = 0;i != 8;++i) { + if (IsComplete(done*PARTSIZE,((done+1)*PARTSIZE)-1)) { + towrite |= (1<WriteUInt8(towrite); + } +} + +void CPartFile::WriteCompleteSourcesCount(CMemFile* file) +{ + file->WriteUInt16(m_nCompleteSourcesCount); +} + +uint32 CPartFile::Process(uint32 reducedownload/*in percent*/,uint8 m_icounter) +{ + uint16 old_trans; + uint32 dwCurTick = ::GetTickCount(); + + // If buffer size exceeds limit, or if not written within time limit, flush data + if ( (m_nTotalBufferData > thePrefs::GetFileBufferSize()) || + (dwCurTick > (m_nLastBufferFlushTime + BUFFER_TIME_LIMIT))) { + // Avoid flushing while copying preview file + if (!m_bPreviewing) { + FlushBuffer(); + } + } + + + // check if we want new sources from server --> MOVED for 16.40 version + old_trans=transferingsrc; + transferingsrc = 0; + kBpsDown = 0.0; + + if (m_icounter < 10) { + // Update only downloading sources. + CClientPtrList::iterator it = m_downloadingSourcesList.begin(); + for( ; it != m_downloadingSourcesList.end(); ) { + CUpDownClient *cur_src = *it++; + if(cur_src->GetDownloadState() == DS_DOWNLOADING) { + ++transferingsrc; + kBpsDown += cur_src->SetDownloadLimit(reducedownload); + } + } + } else { + // Update all sources (including downloading sources) + for ( SourceSet::iterator it = m_SrcList.begin(); it != m_SrcList.end(); ) { + CUpDownClient* cur_src = *it++; + switch (cur_src->GetDownloadState()) { + case DS_DOWNLOADING: { + ++transferingsrc; + kBpsDown += cur_src->SetDownloadLimit(reducedownload); + break; + } + case DS_BANNED: { + break; + } + case DS_ERROR: { + break; + } + case DS_LOWTOLOWIP: { + if ( cur_src->HasLowID() && !theApp->DoCallback( cur_src ) ) { + // If we are almost maxed on sources, + // slowly remove these client to see + // if we can find a better source. + if( ((dwCurTick - lastpurgetime) > 30000) && + (GetSourceCount() >= (thePrefs::GetMaxSourcePerFile()*.8))) { + RemoveSource( cur_src ); + lastpurgetime = dwCurTick; + break; + } + } else { + cur_src->SetDownloadState(DS_ONQUEUE); + } + + break; + } + case DS_NONEEDEDPARTS: { + // we try to purge noneeded source, even without reaching the limit + if((dwCurTick - lastpurgetime) > 40000) { + if(!cur_src->SwapToAnotherFile(false , false, false , NULL)) { + //however we only delete them if reaching the limit + if (GetSourceCount() >= (thePrefs::GetMaxSourcePerFile()*.8 )) { + RemoveSource(cur_src); + lastpurgetime = dwCurTick; + break; //Johnny-B - nothing more to do here (good eye!) + } + } else { + lastpurgetime = dwCurTick; + break; + } + } + // doubled reasktime for no needed parts - save connections and traffic + if ( !((!cur_src->GetLastAskedTime()) || + (dwCurTick - cur_src->GetLastAskedTime()) > FILEREASKTIME*2)) { + break; + } + // Recheck this client to see if still NNP.. + // Set to DS_NONE so that we force a TCP reask next time.. + cur_src->SetDownloadState(DS_NONE); + + break; + } + case DS_ONQUEUE: { + if( cur_src->IsRemoteQueueFull()) { + if( ((dwCurTick - lastpurgetime) > 60000) && + (GetSourceCount() >= (thePrefs::GetMaxSourcePerFile()*.8 )) ) { + RemoveSource( cur_src ); + lastpurgetime = dwCurTick; + break; //Johnny-B - nothing more to do here (good eye!) + } + } + + // Give up to 1 min for UDP to respond.. + // If we are within on min on TCP, do not try.. + if ( theApp->IsConnected() && + ( (!cur_src->GetLastAskedTime()) || + (dwCurTick - cur_src->GetLastAskedTime()) > FILEREASKTIME-20000)) { + cur_src->UDPReaskForDownload(); + } + + // No break here, since the next case takes care of asking for downloads. + } + case DS_CONNECTING: + case DS_TOOMANYCONNS: + case DS_NONE: + case DS_WAITCALLBACK: + case DS_WAITCALLBACKKAD: { + if ( theApp->IsConnected() && + ( (!cur_src->GetLastAskedTime()) || + (dwCurTick - cur_src->GetLastAskedTime()) > FILEREASKTIME)) { + if (!cur_src->AskForDownload()) { + // I left this break here just as a reminder + // just in case re rearange things.. + break; + } + } + break; + } + } + } + + /* eMule 0.30c implementation, i give it a try (Creteil) BEGIN ... */ + if (IsA4AFAuto() && ((!m_LastNoNeededCheck) || (dwCurTick - m_LastNoNeededCheck > 900000))) { + m_LastNoNeededCheck = dwCurTick; + for ( SourceSet::iterator it = m_A4AFsrclist.begin(); it != m_A4AFsrclist.end(); ) { + CUpDownClient *cur_source = *it++; + uint8 download_state=cur_source->GetDownloadState(); + if( download_state != DS_DOWNLOADING + && cur_source->GetRequestFile() + && ((!cur_source->GetRequestFile()->IsA4AFAuto()) || download_state == DS_NONEEDEDPARTS)) + { + cur_source->SwapToAnotherFile(false, false, false, this); + } + } + } + /* eMule 0.30c implementation, i give it a try (Creteil) END ... */ + + // swap No needed partfiles if possible + + if (((old_trans==0) && (transferingsrc>0)) || ((old_trans>0) && (transferingsrc==0))) { + SetPartFileStatus(status); + } + + // Kad source search + if( GetMaxSourcePerFileUDP() > GetSourceCount()){ + //Once we can handle lowID users in Kad, we remove the second IsConnected + if (theApp->downloadqueue->DoKademliaFileRequest() && (Kademlia::CKademlia::GetTotalFile() < KADEMLIATOTALFILE) && (dwCurTick > m_LastSearchTimeKad) && Kademlia::CKademlia::IsConnected() && theApp->IsConnected() && !IsStopped()){ + //Kademlia + theApp->downloadqueue->SetLastKademliaFileRequest(); + + if (GetKadFileSearchID()) { + /* This will never happen anyway. We're talking a + 1h timespan and searches are at max 45secs */ + Kademlia::CSearchManager::StopSearch(GetKadFileSearchID(), false); + } + + Kademlia::CUInt128 kadFileID(GetFileHash().GetHash()); + Kademlia::CSearch* pSearch = Kademlia::CSearchManager::PrepareLookup(Kademlia::CSearch::FILE, true, kadFileID); + AddDebugLogLineM(false, logKadSearch, CFormat(wxT("Preparing a Kad Search for '%s'")) % GetFileName()); + if (pSearch) { + AddDebugLogLineM(false, logKadSearch, CFormat(wxT("Kad lookup started for '%s'")) % GetFileName()); + if(m_TotalSearchesKad < 7) { + m_TotalSearchesKad++; + } + m_LastSearchTimeKad = dwCurTick + (KADEMLIAREASKTIME*m_TotalSearchesKad); + SetKadFileSearchID(pSearch->GetSearchID()); + } + } + } else { + if(GetKadFileSearchID()) { + Kademlia::CSearchManager::StopSearch(GetKadFileSearchID(), true); + } + } + + // check if we want new sources from server + if ( !m_localSrcReqQueued && + ( (!m_lastsearchtime) || + (dwCurTick - m_lastsearchtime) > SERVERREASKTIME) && + theApp->IsConnectedED2K() && + thePrefs::GetMaxSourcePerFileSoft() > GetSourceCount() && + !m_stopped ) { + m_localSrcReqQueued = true; + theApp->downloadqueue->SendLocalSrcRequest(this); + } + + // calculate datarate, set limit etc. + } + + ++m_count; + + // Kry - does the 3 / 30 difference produce too much flickering or CPU? + if (m_count >= 30) { + m_count = 0; + UpdateAutoDownPriority(); + UpdateDisplayedInfo(); + if(m_bPercentUpdated == false) { + UpdateCompletedInfos(); + } + m_bPercentUpdated = false; + if (thePrefs::ShowCatTabInfos()) { + Notify_ShowUpdateCatTabTitles(); + } + } + + return (uint32)(kBpsDown*1024.0); +} + +bool CPartFile::CanAddSource(uint32 userid, uint16 port, uint32 serverip, uint16 serverport, uint8* pdebug_lowiddropped, bool ed2kID) +{ + + //The incoming ID could have the userid in the Hybrid format.. + uint32 hybridID = 0; + if( ed2kID ) { + if (IsLowID(userid)) { + hybridID = userid; + } else { + hybridID = wxUINT32_SWAP_ALWAYS(userid); + } + } else { + hybridID = userid; + if (!IsLowID(userid)) { + userid = wxUINT32_SWAP_ALWAYS(userid); + } + } + + // MOD Note: Do not change this part - Merkur + if (theApp->IsConnectedED2K()) { + if(::IsLowID(theApp->GetED2KID())) { + if(theApp->GetED2KID() == userid && theApp->serverconnect->GetCurrentServer()->GetIP() == serverip && theApp->serverconnect->GetCurrentServer()->GetPort() == serverport ) { + return false; + } + if(theApp->GetPublicIP() == userid) { + return false; + } + } else { + if(theApp->GetED2KID() == userid && thePrefs::GetPort() == port) { + return false; + } + } + } + + if (Kademlia::CKademlia::IsConnected()) { + if(!Kademlia::CKademlia::IsFirewalled()) { + if(Kademlia::CKademlia::GetIPAddress() == hybridID && thePrefs::GetPort() == port) { + return false; + } + } + } + + //This allows *.*.*.0 clients to not be removed if Ed2kID == false + if ( IsLowID(hybridID) && theApp->IsFirewalled()) { + if (pdebug_lowiddropped) { + (*pdebug_lowiddropped)++; + } + return false; + } + // MOD Note - end + return true; +} + +void CPartFile::AddSources(CMemFile& sources,uint32 serverip, uint16 serverport, unsigned /*origin*/, bool bWithObfuscationAndHash) +{ + uint8 count = sources.ReadUInt8(); + uint8 debug_lowiddropped = 0; + uint8 debug_possiblesources = 0; + CMD4Hash achUserHash; + + if (m_stopped) { + // since we may received multiple search source UDP results we have to "consume" all data of that packet + AddDebugLogLineM(false, logPartFile, wxT("Trying to add sources for a stopped file")); + sources.Seek(count*(4+2), wxFromCurrent); + return; + } + + for (int i = 0;i != count;++i) { + uint32 userid = sources.ReadUInt32(); + uint16 port = sources.ReadUInt16(); + + uint8 byCryptOptions = 0; + if (bWithObfuscationAndHash){ + byCryptOptions = sources.ReadUInt8(); + if ((byCryptOptions & 0x80) > 0) { + achUserHash = sources.ReadHash(); + } + + if ((thePrefs::IsClientCryptLayerRequested() && (byCryptOptions & 0x01/*supported*/) > 0 && (byCryptOptions & 0x80) == 0) + || (thePrefs::IsClientCryptLayerSupported() && (byCryptOptions & 0x02/*requested*/) > 0 && (byCryptOptions & 0x80) == 0)) { + AddDebugLogLineM(false, logPartFile, wxString::Format(wxT("Server didn't provide UserHash for source %u, even if it was expected to (or local obfuscationsettings changed during serverconnect"), userid)); + } else if (!thePrefs::IsClientCryptLayerRequested() && (byCryptOptions & 0x02/*requested*/) == 0 && (byCryptOptions & 0x80) != 0) { + AddDebugLogLineM(false, logPartFile, wxString::Format(wxT("Server provided UserHash for source %u, even if it wasn't expected to (or local obfuscationsettings changed during serverconnect"), userid)); + } + } + + + // "Filter LAN IPs" and "IPfilter" the received sources IP addresses + if (!IsLowID(userid)) { + // check for 0-IP, localhost and optionally for LAN addresses + if ( !IsGoodIP(userid, thePrefs::FilterLanIPs()) ) { + continue; + } + if (theApp->ipfilter->IsFiltered(userid)) { + continue; + } + } + + if (!CanAddSource(userid, port, serverip, serverport, &debug_lowiddropped)) { + continue; + } + + if(thePrefs::GetMaxSourcePerFile() > GetSourceCount()) { + ++debug_possiblesources; + CUpDownClient* newsource = new CUpDownClient(port,userid,serverip,serverport,this, true, true); + + newsource->SetCryptLayerSupport((byCryptOptions & 0x01) != 0); + newsource->SetCryptLayerRequest((byCryptOptions & 0x02) != 0); + newsource->SetCryptLayerRequires((byCryptOptions & 0x04) != 0); + if ((byCryptOptions & 0x80) != 0) { + newsource->SetUserHash(achUserHash); + } + + theApp->downloadqueue->CheckAndAddSource(this,newsource); + } else { + AddDebugLogLineM(false, logPartFile, wxT("Consuming a packet because of max sources reached")); + // Since we may receive multiple search source UDP results we have to "consume" all data of that packet + // This '+1' is added because 'i' counts from 0. + sources.Seek((count-(i+1))*(4+2), wxFromCurrent); + if (GetKadFileSearchID()) { + Kademlia::CSearchManager::StopSearch(GetKadFileSearchID(), false); + } + break; + } + } +} + +void CPartFile::UpdatePartsInfo() +{ + if( !IsPartFile() ) { + CKnownFile::UpdatePartsInfo(); + return; + } + + // Cache part count + uint16 partcount = GetPartCount(); + bool flag = (time(NULL) - m_nCompleteSourcesTime > 0); + + // Ensure the frequency-list is ready + if ( m_SrcpartFrequency.size() != GetPartCount() ) { + m_SrcpartFrequency.clear(); + m_SrcpartFrequency.insert(m_SrcpartFrequency.begin(), GetPartCount(), 0); + } + + // Find number of available parts + uint16 availablecounter = 0; + for ( uint16 i = 0; i < partcount; ++i ) { + if ( m_SrcpartFrequency[i] ) + ++availablecounter; + } + + if ( ( availablecounter == partcount ) && ( m_availablePartsCount < partcount ) ) { + lastseencomplete = time(NULL); + } + + m_availablePartsCount = availablecounter; + + if ( flag ) { + ArrayOfUInts16 count; + + count.reserve(GetSourceCount()); + + for ( SourceSet::iterator it = m_SrcList.begin(); it != m_SrcList.end(); ++it ) { + if ( !(*it)->GetUpPartStatus().empty() && (*it)->GetUpPartCount() == partcount ) { + count.push_back((*it)->GetUpCompleteSourcesCount()); + } + } + + m_nCompleteSourcesCount = m_nCompleteSourcesCountLo = m_nCompleteSourcesCountHi = 0; + + for (uint16 i = 0; i < partcount; ++i) { + if( !i ) { + m_nCompleteSourcesCount = m_SrcpartFrequency[i]; + } + else if( m_nCompleteSourcesCount > m_SrcpartFrequency[i]) { + m_nCompleteSourcesCount = m_SrcpartFrequency[i]; + } + } + count.push_back(m_nCompleteSourcesCount); + + int32 n = count.size(); + if (n > 0) { + std::sort(count.begin(), count.end(), std::less()); + + // calculate range + int32 i= n >> 1; // (n / 2) + int32 j= (n * 3) >> 2; // (n * 3) / 4 + int32 k= (n * 7) >> 3; // (n * 7) / 8 + + //When still a part file, adjust your guesses by 20% to what you see.. + + + if (n < 5) { + //Not many sources, so just use what you see.. + // welcome to 'plain stupid code' + // m_nCompleteSourcesCount; + m_nCompleteSourcesCountLo= m_nCompleteSourcesCount; + m_nCompleteSourcesCountHi= m_nCompleteSourcesCount; + } else if (n < 20) { + // For low guess and normal guess count + // If we see more sources then the guessed low and normal, use what we see. + // If we see less sources then the guessed low, adjust network accounts for 80%, + // we account for 20% with what we see and make sure we are still above the normal. + // For high guess + // Adjust 80% network and 20% what we see. + if ( count[i] < m_nCompleteSourcesCount ) { + m_nCompleteSourcesCountLo = m_nCompleteSourcesCount; + } else { + m_nCompleteSourcesCountLo = + (uint16)((float)(count[i]*.8) + + (float)(m_nCompleteSourcesCount*.2)); + } + m_nCompleteSourcesCount = m_nCompleteSourcesCountLo; + m_nCompleteSourcesCountHi = + (uint16)((float)(count[j]*.8) + + (float)(m_nCompleteSourcesCount*.2)); + if( m_nCompleteSourcesCountHi < m_nCompleteSourcesCount ) { + m_nCompleteSourcesCountHi = m_nCompleteSourcesCount; + } + } else { + // Many sources + // ------------ + // For low guess + // Use what we see. + // For normal guess + // Adjust network accounts for 80%, we account for 20% with what + // we see and make sure we are still above the low. + // For high guess + // Adjust network accounts for 80%, we account for 20% with what + // we see and make sure we are still above the normal. + + m_nCompleteSourcesCountLo= m_nCompleteSourcesCount; + m_nCompleteSourcesCount= (uint16)((float)(count[j]*.8)+(float)(m_nCompleteSourcesCount*.2)); + if( m_nCompleteSourcesCount < m_nCompleteSourcesCountLo ) { + m_nCompleteSourcesCount = m_nCompleteSourcesCountLo; + } + m_nCompleteSourcesCountHi= (uint16)((float)(count[k]*.8)+(float)(m_nCompleteSourcesCount*.2)); + if( m_nCompleteSourcesCountHi < m_nCompleteSourcesCount ) { + m_nCompleteSourcesCountHi = m_nCompleteSourcesCount; + } + } + } + m_nCompleteSourcesTime = time(NULL) + (60); + } + UpdateDisplayedInfo(); +} + +// Kry - Updated to 0.42e + bugfix +// [Maella -Enhanced Chunk Selection- (based on jicxicmic)] +bool CPartFile::GetNextRequestedBlock(CUpDownClient* sender, Requested_Block_Struct** newblocks, uint16* count) +{ + + // The purpose of this function is to return a list of blocks (~180KB) to + // download. To avoid a prematurely stop of the downloading, all blocks that + // are requested from the same source must be located within the same + // chunk (=> part ~9MB). + // + // The selection of the chunk to download is one of the CRITICAL parts of the + // edonkey network. The selection algorithm must insure the best spreading + // of files. + // + // The selection is based on 4 criteria: + // 1. Frequency of the chunk (availability), very rare chunks must be downloaded + // as quickly as possible to become a new available source. + // 2. Parts used for preview (first + last chunk), preview or check a + // file (e.g. movie, mp3) + // 3. Request state (downloading in process), try to ask each source for another + // chunk. Spread the requests between all sources. + // 4. Completion (shortest-to-complete), partially retrieved chunks should be + // completed before starting to download other one. + // + // The frequency criterion defines three zones: very rare (<10%), rare (<50%) + // and common (>30%). Inside each zone, the criteria have a specific weight, used + // to calculate the priority of chunks. The chunk(s) with the highest + // priority (highest=0, lowest=0xffff) is/are selected first. + // + // very rare (preview) rare common + // 0% <---- +0 pt ----> 10% <----- +10000 pt -----> 50% <---- +20000 pt ----> 100% + // 1. <------- frequency: +25*frequency pt -----------> + // 2. <- preview: +1 pt --><-------------- preview: set to 10000 pt -------------> + // 3. <------ request: download in progress +20000 pt ------> + // 4a. <- completion: 0% +100, 25% +75 .. 100% +0 pt --><-- !req => completion ---> + // 4b. <--- req => !completion --> + // + // Unrolled, the priority scale is: + // + // 0..xxxx unrequested and requested very rare chunks + // 10000..1xxxx unrequested rare chunks + unrequested preview chunks + // 20000..2xxxx unrequested common chunks (priority to the most complete) + // 30000..3xxxx requested rare chunks + requested preview chunks + // 40000..4xxxx requested common chunks (priority to the least complete) + // + // This algorithm usually selects first the rarest chunk(s). However, partially + // complete chunk(s) that is/are close to completion may overtake the priority + // (priority inversion). + // For the common chuncks, the algorithm tries to spread the dowload between + // the sources + // + + // Check input parameters + if(count == NULL) { + return false; + } + if ( sender->GetPartStatus().empty() ) { + return false; + } + // Define and create the list of the chunks to download + const uint16 partCount = GetPartCount(); + ChunkList chunksList; + + // Main loop + uint16 newBlockCount = 0; + while(newBlockCount != *count) { + // Create a request block stucture if a chunk has been previously selected + if(sender->GetLastPartAsked() != 0xffff) { + Requested_Block_Struct* pBlock = new Requested_Block_Struct; + if(GetNextEmptyBlockInPart(sender->GetLastPartAsked(), pBlock) == true) { + // Keep a track of all pending requested blocks + m_requestedblocks_list.push_back(pBlock); + // Update list of blocks to return + newblocks[newBlockCount++] = pBlock; + // Skip end of loop (=> CPU load) + continue; + } else { + // All blocks for this chunk have been already requested + delete pBlock; + // => Try to select another chunk + sender->SetLastPartAsked(0xffff); + } + } + + // Check if a new chunk must be selected (e.g. download starting, previous chunk complete) + if(sender->GetLastPartAsked() == 0xffff) { + // Quantify all chunks (create list of chunks to download) + // This is done only one time and only if it is necessary (=> CPU load) + if(chunksList.empty()) { + // Indentify the locally missing part(s) that this source has + for(uint16 i=0; i < partCount; ++i) { + if(sender->IsPartAvailable(i) == true && GetNextEmptyBlockInPart(i, NULL) == true) { + // Create a new entry for this chunk and add it to the list + Chunk newEntry; + newEntry.part = i; + newEntry.frequency = m_SrcpartFrequency[i]; + chunksList.push_back(newEntry); + } + } + + // Check if any bloks(s) could be downloaded + if(chunksList.empty()) { + break; // Exit main loop while() + } + + // Define the bounds of the three zones (very rare, rare) + // more depending on available sources + uint8 modif=10; + if (GetSourceCount()>800) { + modif=2; + } else if (GetSourceCount()>200) { + modif=5; + } + uint16 limit= modif*GetSourceCount()/ 100; + if (limit==0) { + limit=1; + } + const uint16 veryRareBound = limit; + const uint16 rareBound = 2*limit; + + // Cache Preview state (Criterion 2) + FileType type = GetFiletype(GetFileName()); + const bool isPreviewEnable = + thePrefs::GetPreviewPrio() && + (type == ftArchive || type == ftVideo); + + // Collect and calculate criteria for all chunks + for (ChunkList::iterator it = chunksList.begin(); it != chunksList.end(); ++it) { + Chunk& cur_chunk = *it; + + // Offsets of chunk + const uint64 uStart = cur_chunk.part * PARTSIZE; + const uint64 uEnd = + ((GetFileSize() - 1) < (uStart + PARTSIZE - 1)) ? + (GetFileSize() - 1) : (uStart + PARTSIZE - 1); + // Criterion 2. Parts used for preview + // Remark: - We need to download the first part and the last part(s). + // - When the last part is very small, it's necessary to + // download the two last parts. + bool critPreview = false; + if(isPreviewEnable == true) { + if(cur_chunk.part == 0) { + critPreview = true; // First chunk + } else if(cur_chunk.part == partCount-1) { + critPreview = true; // Last chunk + } else if(cur_chunk.part == partCount-2) { + // Last chunk - 1 (only if last chunk is too small) + const uint32 sizeOfLastChunk = GetFileSize() - uEnd; + if(sizeOfLastChunk < PARTSIZE/3) { + critPreview = true; // Last chunk - 1 + } + } + } + + // Criterion 3. Request state (downloading in process from other source(s)) + // => CPU load + const bool critRequested = + cur_chunk.frequency > veryRareBound && + IsAlreadyRequested(uStart, uEnd); + + // Criterion 4. Completion + uint64 partSize = PARTSIZE; + + std::list::iterator it2 = m_gaplist.begin(); + for (; it2 != m_gaplist.end(); ++it2) { + const Gap_Struct* cur_gap = *it2; + // Check if Gap is into the limit + if(cur_gap->start < uStart) { + if(cur_gap->end > uStart && cur_gap->end < uEnd) { + partSize -= cur_gap->end - uStart + 1; + } else if(cur_gap->end >= uEnd) { + partSize = 0; + break; // exit loop for() + } + } else if(cur_gap->start <= uEnd) { + if(cur_gap->end < uEnd) { + partSize -= cur_gap->end - cur_gap->start + 1; + } else { + partSize -= uEnd - cur_gap->start + 1; + } + } + } + const uint16 critCompletion = (uint16)(partSize/(PARTSIZE/100)); // in [%] + + // Calculate priority with all criteria + if(cur_chunk.frequency <= veryRareBound) { + // 0..xxxx unrequested + requested very rare chunks + cur_chunk.rank = (25 * cur_chunk.frequency) + // Criterion 1 + ((critPreview == true) ? 0 : 1) + // Criterion 2 + (100 - critCompletion); // Criterion 4 + } else if(critPreview == true) { + // 10000..10100 unrequested preview chunks + // 30000..30100 requested preview chunks + cur_chunk.rank = ((critRequested == false) ? 10000 : 30000) + // Criterion 3 + (100 - critCompletion); // Criterion 4 + } else if(cur_chunk.frequency <= rareBound) { + // 10101..1xxxx unrequested rare chunks + // 30101..3xxxx requested rare chunks + cur_chunk.rank = (25 * cur_chunk.frequency) + // Criterion 1 + ((critRequested == false) ? 10101 : 30101) + // Criterion 3 + (100 - critCompletion); // Criterion 4 + } else { + // common chunk + if(critRequested == false) { // Criterion 3 + // 20000..2xxxx unrequested common chunks + cur_chunk.rank = 20000 + // Criterion 3 + (100 - critCompletion); // Criterion 4 + } else { + // 40000..4xxxx requested common chunks + // Remark: The weight of the completion criterion is inversed + // to spead the requests over the completing chunks. + // Without this, the chunk closest to completion will + // received every new sources. + cur_chunk.rank = 40000 + // Criterion 3 + (critCompletion); // Criterion 4 + } + } + } + } + + // Select the next chunk to download + if(!chunksList.empty()) { + // Find and count the chunck(s) with the highest priority + uint16 chunkCount = 0; // Number of found chunks with same priority + uint16 rank = 0xffff; // Highest priority found + + // Collect and calculate criteria for all chunks + for (ChunkList::iterator it = chunksList.begin(); it != chunksList.end(); ++it) { + const Chunk& cur_chunk = *it; + if(cur_chunk.rank < rank) { + chunkCount = 1; + rank = cur_chunk.rank; + } else if(cur_chunk.rank == rank) { + ++chunkCount; + } + } + + // Use a random access to avoid that everybody tries to download the + // same chunks at the same time (=> spread the selected chunk among clients) + uint16 randomness = 1 + (int) (((float)(chunkCount-1))*rand()/(RAND_MAX+1.0)); + + for (ChunkList::iterator it = chunksList.begin(); it != chunksList.end(); ++it) { + const Chunk& cur_chunk = *it; + if(cur_chunk.rank == rank) { + randomness--; + if(randomness == 0) { + // Selection process is over + sender->SetLastPartAsked(cur_chunk.part); + // Remark: this list might be reused up to *count times + chunksList.erase(it); + break; // exit loop for() + } + } + } + } else { + // There is no remaining chunk to download + break; // Exit main loop while() + } + } + } + // Return the number of the blocks + *count = newBlockCount; + // Return + return (newBlockCount > 0); +} +// Maella end +// Kry EOI + + +void CPartFile::RemoveBlockFromList(uint64 start,uint64 end) +{ + std::list::iterator it = m_requestedblocks_list.begin(); + while (it != m_requestedblocks_list.end()) { + std::list::iterator it2 = it++; + + if ((*it2)->StartOffset <= start && (*it2)->EndOffset >= end) { + m_requestedblocks_list.erase(it2); + } + } +} + + +void CPartFile::RemoveAllRequestedBlocks(void) +{ + m_requestedblocks_list.clear(); +} + + +void CPartFile::CompleteFile(bool bIsHashingDone) +{ + if (GetKadFileSearchID()) { + Kademlia::CSearchManager::StopSearch(GetKadFileSearchID(), false); + } + + theApp->downloadqueue->RemoveLocalServerRequest(this); + + AddDebugLogLineM( false, logPartFile, wxString( wxT("CPartFile::CompleteFile: Hash ") ) + ( bIsHashingDone ? wxT("done") : wxT("not done") ) ); + + if (!bIsHashingDone) { + SetPartFileStatus(PS_COMPLETING); + kBpsDown = 0.0; + + CPath partFile = m_partmetfilename.RemoveExt(); + CThreadScheduler::AddTask(new CHashingTask(GetFilePath(), partFile, this)); + return; + } else { + StopFile(); + m_is_A4AF_auto=false; + SetPartFileStatus(PS_COMPLETING); + // guess I was wrong about not need to spaw a thread ... + // It is if the temp and incoming dirs are on different + // partitions/drives and the file is large...[oz] + // + + PerformFileComplete(); + + + } + if (thePrefs::ShowCatTabInfos()) { + Notify_ShowUpdateCatTabTitles(); + } + UpdateDisplayedInfo(true); +} + + +void CPartFile::CompleteFileEnded(bool errorOccured, const CPath& newname) +{ + if (errorOccured) { + m_paused = true; + SetPartFileStatus(PS_ERROR); + AddLogLineM(true, CFormat( _("Unexpected file error while completing %s. File paused") )% GetFileName() ); + } else { + m_fullname = newname; + + SetFilePath(m_fullname.GetPath()); + SetFileName(m_fullname.GetFullName()); + + SetPartFileStatus(PS_COMPLETE); + m_paused = false; + ClearPriority(); + + // TODO: What the f*** if it is already known? + theApp->knownfiles->SafeAddKFile(this); + + // remove the file from the suspended uploads list + theApp->uploadqueue->ResumeUpload(GetFileHash()); + theApp->downloadqueue->RemoveFile(this); + theApp->sharedfiles->SafeAddKFile(this); + UpdateDisplayedInfo(true); + + // republish that file to the ed2k-server to update the 'FT_COMPLETE_SOURCES' counter on the server. + theApp->sharedfiles->RepublishFile(this); + + // Ensure that completed shows the correct value + completedsize = GetFileSize(); + + AddLogLineM(true, CFormat( _("Finished downloading: %s") ) % GetFileName() ); + } + + theApp->downloadqueue->StartNextFile(this); +} + + +void CPartFile::PerformFileComplete() +{ + // add this file to the suspended uploads list + theApp->uploadqueue->SuspendUpload(GetFileHash()); + FlushBuffer(); + + // close permanent handle + if (m_hpartfile.IsOpened()) { + m_hpartfile.Close(); + } + + // Schedule task for completion of the file + CThreadScheduler::AddTask(new CCompletionTask(this)); +} + + +void CPartFile::RemoveAllSources(bool bTryToSwap) +{ + for( SourceSet::iterator it = m_SrcList.begin(); it != m_SrcList.end();) { + CUpDownClient* cur_src = *it++; + if (bTryToSwap) { + if (!cur_src->SwapToAnotherFile(true, true, true, NULL)) { + RemoveSource(cur_src,true,false); + // If it was not swapped, it's not on any file anymore, and should die + } + } else { + RemoveSource(cur_src,true,false); + } + } + + UpdatePartsInfo(); + + /* eMule 0.30c implementation, i give it a try (Creteil) BEGIN ... */ + // remove all links A4AF in sources to this file + if(!m_A4AFsrclist.empty()) { + for( SourceSet::iterator it = m_A4AFsrclist.begin(); it != m_A4AFsrclist.end(); ) { + CUpDownClient* cur_src = *it++; + if ( cur_src->DeleteFileRequest( this ) ) { + Notify_DownloadCtrlRemoveSource(cur_src, this); + } + } + m_A4AFsrclist.clear(); + } + /* eMule 0.30c implementation, i give it a try (Creteil) END ... */ + UpdateFileRatingCommentAvail(); +} + + +void CPartFile::Delete() +{ + AddLogLineM(false, CFormat(_("Deleting file: %s")) % GetFileName()); + // Barry - Need to tell any connected clients to stop sending the file + StopFile(true); + AddDebugLogLineM(false, logPartFile, wxT("\tStopped")); + + theApp->sharedfiles->RemoveFile(this); + AddDebugLogLineM(false, logPartFile, wxT("\tRemoved from shared")); + theApp->downloadqueue->RemoveFile(this); + AddDebugLogLineM(false, logPartFile, wxT("\tRemoved from download queue")); + Notify_DownloadCtrlRemoveFile(this); + AddDebugLogLineM(false, logPartFile, wxT("\tRemoved transferwnd")); + + // Kry - WTF? + // eMule had same problem with lseek error ... and override with a simple + // check for INVALID_HANDLE_VALUE (that, btw, does not exist on linux) + // So we just guess is < 0 on error and > 2 if ok (0 stdin, 1 stdout, 2 stderr) + if (m_hpartfile.fd() > 2) { // 0 stdin, 1 stdout, 2 stderr + m_hpartfile.Close(); + } + + AddDebugLogLineM(false, logPartFile, wxT("\tClosed")); + + if (!CPath::RemoveFile(m_fullname)) { + AddDebugLogLineM(true, logPartFile, CFormat(wxT("\tFailed to delete '%s'")) % m_fullname); + } else { + AddDebugLogLineM(false, logPartFile, wxT("\tRemoved .part.met")); + } + + CPath partFile = m_fullname.RemoveExt(); + if (!CPath::RemoveFile(partFile)) { + AddDebugLogLineM(true, logPartFile, CFormat(wxT("Failed to delete '%s'")) % partFile); + } else { + AddDebugLogLineM(false, logPartFile, wxT("\tRemoved .part")); + } + + CPath BAKName = m_fullname.AppendExt(PARTMET_BAK_EXT); + if (!CPath::RemoveFile(BAKName)) { + AddDebugLogLineM(true, logPartFile, CFormat(wxT("Failed to delete '%s'")) % BAKName); + } else { + AddDebugLogLineM(false, logPartFile, wxT("\tRemoved .BAK")); + } + + CPath SEEDSName = m_fullname.AppendExt(wxT(".seeds")); + if (SEEDSName.FileExists()) { + if (CPath::RemoveFile(SEEDSName)) { + AddDebugLogLineM(false, logPartFile, wxT("\tRemoved .seeds")); + } else { + AddDebugLogLineM(true, logPartFile, CFormat(wxT("Failed to delete '%s'")) % SEEDSName); + } + } + + AddDebugLogLineM(false, logPartFile, wxT("Done")); + + delete this; +} + + +bool CPartFile::HashSinglePart(uint16 partnumber) +{ + if ((GetHashCount() <= partnumber) && (GetPartCount() > 1)) { + AddLogLineM(true, + CFormat( _("Warning: Unable to hash downloaded part - hashset incomplete for '%s'") ) + % GetFileName() ); + m_hashsetneeded = true; + return true; + } else if ((GetHashCount() <= partnumber) && GetPartCount() != 1) { + AddLogLineM(true, CFormat( _("Error: Unable to hash downloaded part - hashset incomplete (%s). This should never happen")) % GetFileName() ); + m_hashsetneeded = true; + return true; + } else { + CMD4Hash hashresult; + uint64 length = PARTSIZE; + const uint64 offset = length * partnumber; + try { + m_hpartfile.Seek(offset, wxFromStart); + if (offset + PARTSIZE > m_hpartfile.GetLength()) { + length = m_hpartfile.GetLength() - offset; + wxASSERT( length <= PARTSIZE ); + } + CreateHashFromFile(&m_hpartfile, length, &hashresult, NULL); + } catch (const CIOFailureException& e) { + AddLogLineM(true, CFormat( wxT("EOF while hashing downloaded part %u with length %u (max %u) of partfile '%s' with length %u: %s")) + % partnumber % length % (offset+length) % GetFileName() % GetFileSize() % e.what()); + SetPartFileStatus(PS_ERROR); + return false; + } catch (const CEOFException& e) { + AddLogLineM(true, CFormat( wxT("EOF while hashing downloaded part %u with length %u (max %u) of partfile '%s' with length %u: %s")) + % partnumber % length % (offset+length) % GetFileName() % GetFileSize() % e.what()); + return false; + } + + if (GetPartCount() > 1) { + if (hashresult != GetPartHash(partnumber)) { + AddDebugLogLineM(false, logPartFile, CFormat( wxT("%s: Expected part-hash: %s")) % GetFileName() % GetPartHash(partnumber).Encode() ); + AddDebugLogLineM(false, logPartFile, CFormat( wxT("%s: Actual part-hash: %s")) % GetFileName() % hashresult.Encode() ); + return false; + } else { + return true; + } + } else { + if (hashresult != m_abyFileHash) { + return false; + } else { + return true; + } + } + } + +} + +bool CPartFile::IsCorruptedPart(uint16 partnumber) +{ + return std::find(m_corrupted_list.begin(), m_corrupted_list.end(), partnumber) + != m_corrupted_list.end(); +} + + +void CPartFile::SetDownPriority(uint8 np, bool bSave, bool bRefresh ) +{ + if ( m_iDownPriority != np ) { + m_iDownPriority = np; + if ( bRefresh ) + UpdateDisplayedInfo(true); + if ( bSave ) + SavePartFile(); + } +} + + +void CPartFile::StopFile(bool bCancel) +{ + // Kry - Need to set it here to get into SetPartFileStatus(status) correctly + m_stopped = true; + + // Barry - Need to tell any connected clients to stop sending the file + PauseFile(); + + m_LastSearchTimeKad = 0; + m_TotalSearchesKad = 0; + + RemoveAllSources(true); + kBpsDown = 0.0; + transferingsrc = 0; + memset(m_anStates,0,sizeof(m_anStates)); + + if (!bCancel) { + FlushBuffer(true); + } + + UpdateDisplayedInfo(true); +} + + +void CPartFile::StopPausedFile() +{ + if (!IsStopped()) { + // Once an hour, remove any sources for files which are no longer active downloads + switch (GetStatus()) { + case PS_PAUSED: + case PS_INSUFFICIENT: + case PS_ERROR: + if (time(NULL) - m_iLastPausePurge > (60*60)) { + m_iLastPausePurge = time(NULL); + StopFile(); + } + } + } +} + + +void CPartFile::PauseFile(bool bInsufficient) +{ + SetActive(false); + + if ( status == PS_COMPLETE || status == PS_COMPLETING ) { + return; + } + + if (GetKadFileSearchID()) { + Kademlia::CSearchManager::StopSearch(GetKadFileSearchID(), true); + // If we were in the middle of searching, reset timer so they can resume searching. + m_LastSearchTimeKad = 0; + } + + m_iLastPausePurge = time(NULL); + + theApp->downloadqueue->RemoveLocalServerRequest(this); + + CPacket packet( OP_CANCELTRANSFER, 0, OP_EDONKEYPROT ); + for( SourceSet::iterator it = m_SrcList.begin(); it != m_SrcList.end(); ) { + CUpDownClient* cur_src = *it++; + if (cur_src->GetDownloadState() == DS_DOWNLOADING) { + if (!cur_src->GetSentCancelTransfer()) { + theStats::AddUpOverheadOther( packet.GetPacketSize() ); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_CANCELTRANSFER to ") + cur_src->GetFullIP() ); + cur_src->SendPacket( &packet, false, true ); + cur_src->SetSentCancelTransfer( true ); + } + cur_src->SetDownloadState(DS_ONQUEUE); + } + } + + + m_insufficient = bInsufficient; + m_paused = true; + + + kBpsDown = 0.0; + transferingsrc = 0; + m_anStates[DS_DOWNLOADING] = 0; + + SetStatus(status); +} + + +void CPartFile::ResumeFile() +{ + if ( status == PS_COMPLETE || status == PS_COMPLETING ) { + return; + } + + if ( m_insufficient && !CheckFreeDiskSpace() ) { + // Still not enough free discspace + return; + } + + m_paused = false; + m_stopped = false; + m_insufficient = false; + + m_lastsearchtime = 0; + SetStatus(status); + SetActive(theApp->IsConnected()); + + if (m_gaplist.empty() && (GetStatus() == PS_ERROR)) { + // The file has already been hashed at this point + CompleteFile(true); + } + + UpdateDisplayedInfo(true); +} + + +bool CPartFile::CheckFreeDiskSpace( uint32 neededSpace ) +{ + uint64 free = CPath::GetFreeSpaceAt(GetFilePath()); + if (free == static_cast(wxInvalidOffset)) { + // If GetFreeSpaceAt() fails, then the path probably does not exist. + return false; + } + + // The very least acceptable diskspace is a single PART + if ( free < PARTSIZE ) { + // Always fail in this case, since we risk losing data if we try to + // write on a full partition. + return false; + } + + // All other checks are only made if the user has enabled them + if ( thePrefs::IsCheckDiskspaceEnabled() ) { + neededSpace += thePrefs::GetMinFreeDiskSpace(); + + // Due to the the existance of sparse files, we cannot assume that + // writes within the file doesn't cause new blocks to be allocated. + // Therefore, we have to simply stop writing the moment the limit has + // been exceeded. + return free >= neededSpace; + } + + return true; +} + + +void CPartFile::SetLastAnsweredTime() +{ + m_ClientSrcAnswered = ::GetTickCount(); +} + +void CPartFile::SetLastAnsweredTimeTimeout() +{ + m_ClientSrcAnswered = 2 * CONNECTION_LATENCY + ::GetTickCount() - SOURCECLIENTREASKS; +} + +CPacket *CPartFile::CreateSrcInfoPacket(const CUpDownClient* forClient, uint8 byRequestedVersion, uint16 nRequestedOptions) +{ + + if ( m_SrcList.empty() ) { + return NULL; + } + + if(!IsPartFile()) { + return CKnownFile::CreateSrcInfoPacket(forClient, byRequestedVersion, nRequestedOptions); + } + + if (((forClient->GetRequestFile() != this) + && (forClient->GetUploadFile() != this)) || forClient->GetUploadFileID() != GetFileHash()) { + wxString file1 = _("Unknown"); + if (forClient->GetRequestFile() && forClient->GetRequestFile()->GetFileName().IsOk()) { + file1 = forClient->GetRequestFile()->GetFileName().GetPrintable(); + } else if (forClient->GetUploadFile() && forClient->GetUploadFile()->GetFileName().IsOk()) { + file1 = forClient->GetUploadFile()->GetFileName().GetPrintable(); + } + wxString file2 = _("Unknown"); + if (GetFileName().IsOk()) { + file2 = GetFileName().GetPrintable(); + } + AddDebugLogLineM(false, logPartFile, wxT("File mismatch on source packet (P) Sending: ") + file1 + wxT(" From: ") + file2); + return NULL; + } + + if ( !(GetStatus() == PS_READY || GetStatus() == PS_EMPTY)) { + return NULL; + } + + const BitVector& reqstatus = forClient->GetPartStatus(); + bool KnowNeededParts = !reqstatus.empty(); + //wxASSERT(rcvstatus.size() == GetPartCount()); // Obviously! + if (reqstatus.size() != GetPartCount()) { + // Yuck. Same file but different part count? Seriously fucked up. + AddDebugLogLineM(false, logPartFile, wxString::Format(wxT("Impossible situation: different partcounts for the same part file: %i (client) and %i (file)"),reqstatus.size(),GetPartCount())); + return NULL; + } + + CMemFile data(1024); + + uint8 byUsedVersion; + bool bIsSX2Packet; + if (forClient->SupportsSourceExchange2() && byRequestedVersion > 0){ + // the client uses SourceExchange2 and requested the highest version he knows + // and we send the highest version we know, but of course not higher than his request + byUsedVersion = std::min(byRequestedVersion, (uint8)SOURCEEXCHANGE2_VERSION); + bIsSX2Packet = true; + data.WriteUInt8(byUsedVersion); + + // we don't support any special SX2 options yet, reserved for later use + if (nRequestedOptions != 0) { + AddDebugLogLineM(false, logKnownFiles, CFormat(wxT("Client requested unknown options for SourceExchange2: %u")) % nRequestedOptions); + } + } else { + byUsedVersion = forClient->GetSourceExchange1Version(); + bIsSX2Packet = false; + if (forClient->SupportsSourceExchange2()) { + AddDebugLogLineM(false, logKnownFiles, wxT("Client which announced to support SX2 sent SX1 packet instead")); + } + } + + uint16 nCount = 0; + + data.WriteHash(m_abyFileHash); + data.WriteUInt16(nCount); + bool bNeeded; + for (SourceSet::iterator it = m_SrcList.begin(); it != m_SrcList.end(); ++it ) { + bNeeded = false; + CUpDownClient* cur_src = *it; + + int state = cur_src->GetDownloadState(); + int valid = ( state == DS_DOWNLOADING ) || ( state == DS_ONQUEUE && !cur_src->IsRemoteQueueFull() ); + + if ( cur_src->HasLowID() || !valid ) { + continue; + } + + // only send source which have needed parts for this client if possible + const BitVector& srcstatus = cur_src->GetPartStatus(); + if ( !srcstatus.empty() ) { + //wxASSERT(srcstatus.size() == GetPartCount()); // Obviously! + if (srcstatus.size() != GetPartCount()) { + continue; + } + if ( KnowNeededParts ) { + // only send sources which have needed parts for this client + for (int x = 0; x < GetPartCount(); ++x) { + if (srcstatus[x] && !reqstatus[x]) { + bNeeded = true; + break; + } + } + } else { + // if we don't know the need parts for this client, + // return any source currently a client sends it's + // file status only after it has at least one complete part + if (srcstatus.size() != GetPartCount()) { + continue; + } + for (int x = 0; x < GetPartCount(); ++x){ + if (srcstatus[x]) { + bNeeded = true; + break; + } + } + } + } + if(bNeeded) { + ++nCount; + uint32 dwID; + if(forClient->GetSourceExchange1Version() > 2) { + dwID = cur_src->GetUserIDHybrid(); + } else { + dwID = wxUINT32_SWAP_ALWAYS(cur_src->GetUserIDHybrid()); + } + data.WriteUInt32(dwID); + data.WriteUInt16(cur_src->GetUserPort()); + data.WriteUInt32(cur_src->GetServerIP()); + data.WriteUInt16(cur_src->GetServerPort()); + + if (byUsedVersion >= 2) { + data.WriteHash(cur_src->GetUserHash()); + } + + if (byUsedVersion >= 4){ + // CryptSettings - SourceExchange V4 + // 5 Reserved (!) + // 1 CryptLayer Required + // 1 CryptLayer Requested + // 1 CryptLayer Supported + const uint8 uSupportsCryptLayer = cur_src->SupportsCryptLayer() ? 1 : 0; + const uint8 uRequestsCryptLayer = cur_src->RequestsCryptLayer() ? 1 : 0; + const uint8 uRequiresCryptLayer = cur_src->RequiresCryptLayer() ? 1 : 0; + const uint8 byCryptOptions = (uRequiresCryptLayer << 2) | (uRequestsCryptLayer << 1) | (uSupportsCryptLayer << 0); + data.WriteUInt8(byCryptOptions); + } + + if (nCount > 500) { + break; + } + } + } + if (!nCount) { + return 0; + } + data.Seek(bIsSX2Packet ? 17 : 16, wxFromStart); + data.WriteUInt16(nCount); + + CPacket* result = new CPacket(data, OP_EMULEPROT, bIsSX2Packet ? OP_ANSWERSOURCES2 : OP_ANSWERSOURCES); + + // 16+2+501*(4+2+4+2+16) = 14046 bytes max. + if (result->GetPacketSize() > 354) { + result->PackPacket(); + } + + return result; +} + +void CPartFile::AddClientSources(CMemFile* sources, unsigned nSourceFrom, uint8 uClientSXVersion, bool bSourceExchange2, const CUpDownClient* /*pClient*/) +{ + // Kad reviewed + + if (m_stopped) { + return; + } + + uint32 nCount = 0; + uint8 uPacketSXVersion = 0; + if (!bSourceExchange2) { + nCount = sources->ReadUInt16(); + + // Check if the data size matches the 'nCount' for v1 or v2 and eventually correct the source + // exchange version while reading the packet data. Otherwise we could experience a higher + // chance in dealing with wrong source data, userhashs and finally duplicate sources. + uint32 uDataSize = sources->GetLength() - sources->GetPosition(); + + if ((uint32)(nCount*(4+2+4+2)) == uDataSize) { //Checks if version 1 packet is correct size + if(uClientSXVersion != 1) { + return; + } + uPacketSXVersion = 1; + } else if ((uint32)(nCount*(4+2+4+2+16)) == uDataSize) { // Checks if version 2&3 packet is correct size + if (uClientSXVersion == 2) { + uPacketSXVersion = 2; + } else if (uClientSXVersion > 2) { + uPacketSXVersion = 3; + } else { + return; + } + } else if (nCount*(4+2+4+2+16+1) == uDataSize) { + if (uClientSXVersion != 4 ) { + return; + } + uPacketSXVersion = 4; + } else { + // If v5 inserts additional data (like v2), the above code will correctly filter those packets. + // If v5 appends additional data after ()[count], we are in trouble with the + // above code. Though a client which does not understand v5+ should never receive such a packet. + AddDebugLogLineM(false, logClient, CFormat(wxT("Received invalid source exchange packet (v%u) of data size %u for %s")) % uClientSXVersion % uDataSize % GetFileName()); + return; + } + } else { + // for SX2: + // We only check if the version is known by us and do a quick sanitize check on known version + // other then SX1, the packet will be ignored if any error appears, sicne it can't be a "misunderstanding" anymore + if (uClientSXVersion > SOURCEEXCHANGE2_VERSION || uClientSXVersion == 0 ){ + AddDebugLogLineM(false, logPartFile, CFormat(wxT("Invalid source exchange type version: %i")) % uClientSXVersion); + return; + } + + // all known versions use the first 2 bytes as count and unknown version are already filtered above + nCount = sources->ReadUInt16(); + uint32 uDataSize = (uint32)(sources->GetLength() - sources->GetPosition()); + bool bError = false; + switch (uClientSXVersion){ + case 1: + bError = nCount*(4+2+4+2) != uDataSize; + break; + case 2: + case 3: + bError = nCount*(4+2+4+2+16) != uDataSize; + break; + case 4: + bError = nCount*(4+2+4+2+16+1) != uDataSize; + break; + default: + wxASSERT( 0 ); + } + + if (bError){ + wxASSERT( 0 ); + AddDebugLogLineM(false, logPartFile, wxT("Invalid source exchange data size.")); + return; + } + uPacketSXVersion = uClientSXVersion; + } + + for (uint16 i = 0;i != nCount;++i) { + + uint32 dwID = sources->ReadUInt32(); + uint16 nPort = sources->ReadUInt16(); + uint32 dwServerIP = sources->ReadUInt32(); + uint16 nServerPort = sources->ReadUInt16(); + + CMD4Hash userHash; + if (uPacketSXVersion > 1) { + userHash = sources->ReadHash(); + } + + uint8 byCryptOptions = 0; + if (uPacketSXVersion >= 4) { + byCryptOptions = sources->ReadUInt8(); + } + + //Clients send ID's the the Hyrbid format so highID clients with *.*.*.0 won't be falsely switched to a lowID.. + uint32 dwIDED2K; + if (uPacketSXVersion >= 3) { + dwIDED2K = wxUINT32_SWAP_ALWAYS(dwID); + } else { + dwIDED2K = dwID; + } + + // check the HighID(IP) - "Filter LAN IPs" and "IPfilter" the received sources IP addresses + if (!IsLowID(dwID)) { + if (!IsGoodIP(dwIDED2K, thePrefs::FilterLanIPs())) { + // check for 0-IP, localhost and optionally for LAN addresses + AddDebugLogLineM(false, logIPFilter, CFormat(wxT("Ignored source (IP=%s) received via %s - bad IP")) % Uint32toStringIP(dwIDED2K) % OriginToText(nSourceFrom)); + continue; + } + if (theApp->ipfilter->IsFiltered(dwIDED2K)) { + AddDebugLogLineM(false, logIPFilter, CFormat(wxT("Ignored source (IP=%s) received via %s - IPFilter")) % Uint32toStringIP(dwIDED2K) % OriginToText(nSourceFrom)); + continue; + } + if (theApp->clientlist->IsBannedClient(dwIDED2K)){ + continue; + } + } + + // additionally check for LowID and own IP + if (!CanAddSource(dwID, nPort, dwServerIP, nServerPort, NULL, false)) { + AddDebugLogLineM(false, logIPFilter, CFormat(wxT("Ignored source (IP=%s) received via source exchange")) % Uint32toStringIP(dwIDED2K)); + continue; + } + + if(thePrefs::GetMaxSourcePerFile() > GetSourceCount()) { + CUpDownClient* newsource = new CUpDownClient(nPort,dwID,dwServerIP,nServerPort,this, (uPacketSXVersion < 3), true); + if (uPacketSXVersion > 1) { + newsource->SetUserHash(userHash); + } + + if (uPacketSXVersion >= 4) { + newsource->SetCryptLayerSupport((byCryptOptions & 0x01) != 0); + newsource->SetCryptLayerRequest((byCryptOptions & 0x02) != 0); + newsource->SetCryptLayerRequires((byCryptOptions & 0x04) != 0); + } + + newsource->SetSourceFrom((ESourceFrom)nSourceFrom); + theApp->downloadqueue->CheckAndAddSource(this,newsource); + + } else { + break; + } + } +} + +void CPartFile::UpdateAutoDownPriority() +{ + if (!IsAutoDownPriority()) { + return; + } + if (GetSourceCount() <= RARE_FILE) { + if ( GetDownPriority() != PR_HIGH ) + SetDownPriority(PR_HIGH, false, false); + } else if (GetSourceCount() < 100) { + if ( GetDownPriority() != PR_NORMAL ) + SetDownPriority(PR_NORMAL, false, false); + } else { + if ( GetDownPriority() != PR_LOW ) + SetDownPriority(PR_LOW, false, false); + } +} + +// making this function return a higher when more sources have the extended +// protocol will force you to ask a larger variety of people for sources + +int CPartFile::GetCommonFilePenalty() +{ + //TODO: implement, but never return less than MINCOMMONPENALTY! + return MINCOMMONPENALTY; +} + +/* Barry - Replaces BlockReceived() + + Originally this only wrote to disk when a full 180k block + had been received from a client, and only asked for data in + 180k blocks. + + This meant that on average 90k was lost for every connection + to a client data source. That is a lot of wasted data. + + To reduce the lost data, packets are now written to a buffer + and flushed to disk regularly regardless of size downloaded. + This includes compressed packets. + + Data is also requested only where gaps are, not in 180k blocks. + The requests will still not exceed 180k, but may be smaller to + fill a gap. +*/ + +// Kry - transize is 32bits, no packet can be more than that (this is +// compressed size). Even 32bits is too much imho.As for the return size, +// look at the lenData below. +uint32 CPartFile::WriteToBuffer(uint32 transize, byte* data, uint64 start, uint64 end, Requested_Block_Struct *block) +{ + // Increment transferred bytes counter for this file + transferred += transize; + + // This is needed a few times + // Kry - should not need a uint64 here - no block is larger than + // 2GB even after uncompressed. + uint32 lenData = (uint32) (end - start + 1); + + if(lenData > transize) { + m_iGainDueToCompression += lenData-transize; + } + + // Occasionally packets are duplicated, no point writing it twice + if (IsComplete(start, end)) { + AddDebugLogLineM(false, logPartFile, + CFormat(wxT("File '%s' has already been written from %u to %u")) + % GetFileName() % start % end); + return 0; + } + + // Create copy of data as new buffer + byte *buffer = new byte[lenData]; + memcpy(buffer, data, lenData); + + // Create a new buffered queue entry + PartFileBufferedData *item = new PartFileBufferedData; + item->data = buffer; + item->start = start; + item->end = end; + item->block = block; + + // Add to the queue in the correct position (most likely the end) + bool added = false; + + std::list::iterator it = m_BufferedData_list.begin(); + for (; it != m_BufferedData_list.end(); ++it) { + PartFileBufferedData* queueItem = *it; + + if (item->end <= queueItem->end) { + if (it != m_BufferedData_list.begin()) { + added = true; + + m_BufferedData_list.insert(--it, item); + } + + break; + } + } + + if (!added) { + m_BufferedData_list.push_front(item); + } + + // Increment buffer size marker + m_nTotalBufferData += lenData; + + // Mark this small section of the file as filled + FillGap(item->start, item->end); + + // Update the flushed mark on the requested block + // The loop here is unfortunate but necessary to detect deleted blocks. + + std::list::iterator it2 = m_requestedblocks_list.begin(); + for (; it2 != m_requestedblocks_list.end(); ++it2) { + if (*it2 == item->block) { + item->block->transferred += lenData; + } + } + + if (m_gaplist.empty()) { + FlushBuffer(true); + } + + // Return the length of data written to the buffer + return lenData; +} + +void CPartFile::FlushBuffer(bool /*forcewait*/, bool bForceICH, bool bNoAICH) +{ + m_nLastBufferFlushTime = GetTickCount(); + + if (m_BufferedData_list.empty()) { + return; + } + + + uint32 partCount = GetPartCount(); + std::vector changedPart(partCount); + + // Remember which parts need to be checked at the end of the flush + for ( uint32 i = 0; i < partCount; ++i ) { + changedPart[ i ] = false; + } + + + // Ensure file is big enough to write data to (the last item will be the furthest from the start) + uint32 newData = 0; + + std::list::iterator it = m_BufferedData_list.begin(); + for (; it != m_BufferedData_list.end(); ++it) { + PartFileBufferedData* item = *it; + wxASSERT((item->end - item->start) < 0xFFFFFFFF); + newData += (uint32) (item->end - item->start + 1); + } + + if ( !CheckFreeDiskSpace( newData ) ) { + // Not enough free space to write the last item, bail + AddLogLineM(true, CFormat( _("WARNING: Not enough free disk-space! Pausing file: %s") ) % GetFileName()); + + PauseFile( true ); + return; + } + + // Loop through queue + while ( !m_BufferedData_list.empty() ) { + // Get top item and remove it from the queue + PartFileBufferedData* item = m_BufferedData_list.front(); + m_BufferedData_list.pop_front(); + + // This is needed a few times + wxASSERT((item->end - item->start) < 0xFFFFFFFF); + uint32 lenData = (uint32)(item->end - item->start + 1); + + // SLUGFILLER: SafeHash - could be more than one part + for (uint32 curpart = (item->start/PARTSIZE); curpart <= (item->end/PARTSIZE); ++curpart) { + wxASSERT(curpart < partCount); + changedPart[curpart] = true; + } + // SLUGFILLER: SafeHash + + // Go to the correct position in file and write block of data + try { + m_hpartfile.Seek(item->start); + m_hpartfile.Write(item->data, lenData); + } catch (const CIOFailureException& e) { + AddDebugLogLineM(true, logPartFile, wxT("Error while saving part-file: ") + e.what()); + SetPartFileStatus(PS_ERROR); + } + + // Decrease buffer size + m_nTotalBufferData -= lenData; + + // Release memory used by this item + delete [] item->data; + delete item; + } + + + // Update last-changed date + m_lastDateChanged = wxDateTime::GetTimeNow(); + + try { + // Partfile should never be too large + if (m_hpartfile.GetLength() > GetFileSize()) { + // it's "last chance" correction. the real bugfix has to be applied 'somewhere' else + m_hpartfile.SetLength(GetFileSize()); + } + } catch (const CIOFailureException& e) { + AddDebugLogLineM(true, logPartFile, + CFormat(wxT("Error while truncating part-file (%s): %s")) + % m_fullname.RemoveExt() % e.what()); + SetPartFileStatus(PS_ERROR); + } + + + + // Check each part of the file + uint32 partRange = 0; + try { + uint64 curLength = m_hpartfile.GetLength(); + + partRange = (uint32)((curLength % PARTSIZE > 0) ? ((curLength % PARTSIZE) - 1) : (PARTSIZE - 1)); + } catch (const CIOFailureException& e) { + AddDebugLogLineM(true, logPartFile, + CFormat(wxT("Error while accessing part-file (%s): %s")) + % m_fullname.RemoveExt() % e.what()); + SetPartFileStatus(PS_ERROR); + } + + wxASSERT(partRange); + for (int partNumber = partCount-1; partRange && partNumber >= 0; partNumber--) { + if (changedPart[partNumber] == false) { + // Any parts other than last must be full size + partRange = PARTSIZE - 1; + continue; + } + + // Is this 9MB part complete + if (IsComplete(PARTSIZE * partNumber, (PARTSIZE * (partNumber + 1)) - 1)) { + // Is part corrupt + if (!HashSinglePart(partNumber)) { + AddLogLineM(true, CFormat( + _("Downloaded part %i is corrupt in file: %s") ) % partNumber % GetFileName() ); + AddGap(PARTSIZE*partNumber, (PARTSIZE*partNumber + partRange)); + // add part to corrupted list, if not already there + if (!IsCorruptedPart(partNumber)) { + m_corrupted_list.push_back(partNumber); + } + // request AICH recovery data + if (!bNoAICH) { + RequestAICHRecovery((uint16)partNumber); + } + // Reduce transferred amount by corrupt amount + m_iLostDueToCorruption += (partRange + 1); + } else { + if (!m_hashsetneeded) { + AddDebugLogLineM(false, logPartFile, CFormat( + wxT("Finished part %u of '%s'")) % partNumber % GetFileName()); + } + + // if this part was successfully completed (although ICH is active), remove from corrupted list + EraseFirstValue(m_corrupted_list, partNumber); + + if (status == PS_EMPTY) { + if (theApp->IsRunning()) { // may be called during shutdown! + if (GetHashCount() == GetED2KPartHashCount() && !m_hashsetneeded) { + // Successfully completed part, make it available for sharing + SetStatus(PS_READY); + theApp->sharedfiles->SafeAddKFile(this); + } + } + } + } + } else if ( IsCorruptedPart(partNumber) && (thePrefs::IsICHEnabled() || bForceICH)) { + // Try to recover with minimal loss + if (HashSinglePart(partNumber)) { + ++m_iTotalPacketsSavedDueToICH; + + uint64 uMissingInPart = GetTotalGapSizeInPart(partNumber); + FillGap(PARTSIZE*partNumber,(PARTSIZE*partNumber+partRange)); + RemoveBlockFromList(PARTSIZE*partNumber,(PARTSIZE*partNumber + partRange)); + + // remove from corrupted list + EraseFirstValue(m_corrupted_list, partNumber); + + AddLogLineM(true, CFormat( _("ICH: Recovered corrupted part %i for %s -> Saved bytes: %s") ) + % partNumber + % GetFileName() + % CastItoXBytes(uMissingInPart)); + + if (GetHashCount() == GetED2KPartHashCount() && !m_hashsetneeded) { + if (status == PS_EMPTY) { + // Successfully recovered part, make it available for sharing + SetStatus(PS_READY); + if (theApp->IsRunning()) // may be called during shutdown! + theApp->sharedfiles->SafeAddKFile(this); + } + } + } + } + // Any parts other than last must be full size + partRange = PARTSIZE - 1; + } + + // Update met file + SavePartFile(); + + if (theApp->IsRunning()) { // may be called during shutdown! + // Is this file finished ? + if (m_gaplist.empty()) { + CompleteFile(false); + } + } +} + + +void CPartFile::UpdateFileRatingCommentAvail() +{ + bool prevComment = m_hasComment; + int prevRating = m_iUserRating; + + m_hasComment = false; + m_iUserRating = 0; + int ratingCount = 0; + + SourceSet::iterator it = m_SrcList.begin(); + for (; it != m_SrcList.end(); ++it) { + CUpDownClient* cur_src = *it; + + if (!cur_src->GetFileComment().IsEmpty()) { + m_hasComment = true; + } + + uint8 rating = cur_src->GetFileRating(); + if (rating) { + wxASSERT(rating <= 5); + + ratingCount++; + m_iUserRating += rating; + } + } + + if (ratingCount) { + m_iUserRating /= ratingCount; + wxASSERT(m_iUserRating > 0 && m_iUserRating <= 5); + } + + if ((prevComment != m_hasComment) || (prevRating != m_iUserRating)) { + UpdateDisplayedInfo(); + } +} + + +void CPartFile::SetCategory(uint8 cat) +{ + wxASSERT( cat < theApp->glob_prefs->GetCatCount() ); + + m_category = cat; + SavePartFile(); +} + +bool CPartFile::RemoveSource(CUpDownClient* toremove, bool updatewindow, bool bDoStatsUpdate) +{ + wxASSERT( toremove ); + + bool result = theApp->downloadqueue->RemoveSource( toremove, updatewindow, bDoStatsUpdate ); + + // Check if the client should be deleted, but not if the client is already dying + if ( !toremove->GetSocket() && !toremove->HasBeenDeleted() ) { + if ( toremove->Disconnected(wxT("RemoveSource - purged")) ) { + toremove->Safe_Delete(); + } + } + + return result; +} + +void CPartFile::AddDownloadingSource(CUpDownClient* client) +{ + CClientPtrList::iterator it = + std::find(m_downloadingSourcesList.begin(), m_downloadingSourcesList.end(), client); + if (it == m_downloadingSourcesList.end()) { + m_downloadingSourcesList.push_back(client); + } +} + + +void CPartFile::RemoveDownloadingSource(CUpDownClient* client) +{ + CClientPtrList::iterator it = + std::find(m_downloadingSourcesList.begin(), m_downloadingSourcesList.end(), client); + if (it != m_downloadingSourcesList.end()) { + m_downloadingSourcesList.erase(it); + } +} + + +void CPartFile::SetPartFileStatus(uint8 newstatus) +{ + status=newstatus; + + if (thePrefs::GetAllcatType()) { + Notify_DownloadCtrlUpdateItem(this); + } + + Notify_DownloadCtrlSort(); +} + + +uint64 CPartFile::GetNeededSpace() +{ + try { + uint64 length = m_hpartfile.GetLength(); + + if (length > GetFileSize()) { + return 0; // Shouldn't happen, but just in case + } + + return GetFileSize() - length; + } catch (const CIOFailureException& e) { + AddDebugLogLineM(true, logPartFile, + CFormat(wxT("Error while retrieving file-length (%s): %s")) + % m_fullname.RemoveExt() % e.what()); + SetPartFileStatus(PS_ERROR); + return 0; + } +} + +void CPartFile::SetStatus(uint8 in) +{ + wxASSERT( in != PS_PAUSED && in != PS_INSUFFICIENT ); + + status = in; + + if (theApp->IsRunning()) { + UpdateDisplayedInfo( true ); + + if ( thePrefs::ShowCatTabInfos() ) { + Notify_ShowUpdateCatTabTitles(); + } + } +} + + +uint64 CPartFile::GetTotalGapSizeInRange(uint64 uRangeStart, uint64 uRangeEnd) const +{ + uint64 uTotalGapSize = 0; + + if (uRangeEnd >= GetFileSize()) { + uRangeEnd = GetFileSize() - 1; + } + + std::list::const_iterator it = m_gaplist.begin(); + for (; it != m_gaplist.end(); ++it) { + const Gap_Struct* pGap = *it; + + if (pGap->start < uRangeStart && pGap->end > uRangeEnd) { + uTotalGapSize += uRangeEnd - uRangeStart + 1; + break; + } + + if (pGap->start >= uRangeStart && pGap->start <= uRangeEnd) { + uint64 uEnd = (pGap->end > uRangeEnd) ? uRangeEnd : pGap->end; + uTotalGapSize += uEnd - pGap->start + 1; + } else if (pGap->end >= uRangeStart && pGap->end <= uRangeEnd) { + uTotalGapSize += pGap->end - uRangeStart + 1; + } + } + + wxASSERT( uTotalGapSize <= uRangeEnd - uRangeStart + 1 ); + + return uTotalGapSize; +} + +uint64 CPartFile::GetTotalGapSizeInPart(uint32 uPart) const +{ + uint64 uRangeStart = uPart * PARTSIZE; + uint64 uRangeEnd = uRangeStart + PARTSIZE - 1; + if (uRangeEnd >= GetFileSize()) { + uRangeEnd = GetFileSize(); + } + return GetTotalGapSizeInRange(uRangeStart, uRangeEnd); +} + + +void CPartFile::RequestAICHRecovery(uint16 nPart) +{ + + if ( !m_pAICHHashSet->HasValidMasterHash() || + (m_pAICHHashSet->GetStatus() != AICH_TRUSTED && m_pAICHHashSet->GetStatus() != AICH_VERIFIED)){ + AddDebugLogLineM( false, logAICHRecovery, wxT("Unable to request AICH Recoverydata because we have no trusted Masterhash") ); + return; + } + if (GetFileSize() <= EMBLOCKSIZE || GetFileSize() - PARTSIZE*nPart <= EMBLOCKSIZE) + return; + if (CAICHHashSet::IsClientRequestPending(this, nPart)){ + AddDebugLogLineM( false, logAICHRecovery, wxT("RequestAICHRecovery: Already a request for this part pending")); + return; + } + + // first check if we have already the recoverydata, no need to rerequest it then + if (m_pAICHHashSet->IsPartDataAvailable(nPart*PARTSIZE)){ + AddDebugLogLineM( false, logAICHRecovery, wxT("Found PartRecoveryData in memory")); + AICHRecoveryDataAvailable(nPart); + return; + } + + wxASSERT( nPart < GetPartCount() ); + // find some random client which support AICH to ask for the blocks + // first lets see how many we have at all, we prefer high id very much + uint32 cAICHClients = 0; + uint32 cAICHLowIDClients = 0; + for ( SourceSet::iterator it = m_SrcList.begin(); it != m_SrcList.end(); ++it) { + CUpDownClient* pCurClient = *(it); + if ( pCurClient->IsSupportingAICH() && + pCurClient->GetReqFileAICHHash() != NULL && + !pCurClient->IsAICHReqPending() + && (*pCurClient->GetReqFileAICHHash()) == m_pAICHHashSet->GetMasterHash()) + { + if (pCurClient->HasLowID()) { + ++cAICHLowIDClients; + } else { + ++cAICHClients; + } + } + } + if ((cAICHClients | cAICHLowIDClients) == 0){ + AddDebugLogLineM( false, logAICHRecovery, wxT("Unable to request AICH Recoverydata because found no client who supports it and has the same hash as the trusted one")); + return; + } + uint32 nSeclectedClient; + if (cAICHClients > 0) { + nSeclectedClient = (rand() % cAICHClients) + 1; + } else { + nSeclectedClient = (rand() % cAICHLowIDClients) + 1; + } + CUpDownClient* pClient = NULL; + for ( SourceSet::iterator it = m_SrcList.begin(); it != m_SrcList.end(); ++it) { + CUpDownClient* pCurClient = *(it); + if (pCurClient->IsSupportingAICH() && pCurClient->GetReqFileAICHHash() != NULL && !pCurClient->IsAICHReqPending() + && (*pCurClient->GetReqFileAICHHash()) == m_pAICHHashSet->GetMasterHash()) + { + if (cAICHClients > 0){ + if (!pCurClient->HasLowID()) + nSeclectedClient--; + } + else{ + wxASSERT( pCurClient->HasLowID()); + nSeclectedClient--; + } + if (nSeclectedClient == 0){ + pClient = pCurClient; + break; + } + } + } + if (pClient == NULL){ + wxASSERT( false ); + return; + } + + AddDebugLogLineM( false, logAICHRecovery, CFormat( wxT("Requesting AICH Hash (%s) form client %s") ) % ( cAICHClients ? wxT("HighId") : wxT("LowID") ) % pClient->GetClientFullInfo() ); + pClient->SendAICHRequest(this, nPart); + +} + + +void CPartFile::AICHRecoveryDataAvailable(uint16 nPart) +{ + if (GetPartCount() < nPart){ + wxASSERT( false ); + return; + } + + FlushBuffer(true, true, true); + + uint64 length = PARTSIZE; + + try { + if ((unsigned)(PARTSIZE * (nPart + 1)) > m_hpartfile.GetLength()){ + length = (m_hpartfile.GetLength() - (PARTSIZE * nPart)); + wxASSERT( length <= PARTSIZE ); + } + } catch (const CIOFailureException& e) { + AddDebugLogLineM(true, logPartFile, + CFormat(wxT("Error while retrieving file-length (%s): %s")) + % m_fullname.RemoveExt() % e.what()); + SetPartFileStatus(PS_ERROR); + return; + } + + // if the part was already ok, it would now be complete + if (IsComplete(nPart*PARTSIZE, ((nPart*PARTSIZE)+length)-1)){ + AddDebugLogLineM( false, logAICHRecovery, + wxString::Format( wxT("Processing AICH Recovery data: The part (%u) is already complete, canceling"), nPart ) ); + return; + } + + + + CAICHHashTree* pVerifiedHash = m_pAICHHashSet->m_pHashTree.FindHash(nPart*PARTSIZE, length); + if (pVerifiedHash == NULL || !pVerifiedHash->GetHashValid()){ + AddDebugLogLineM( true, logAICHRecovery, wxT("Processing AICH Recovery data: Unable to get verified hash from hashset (should never happen)") ); + wxASSERT( false ); + return; + } + CAICHHashTree htOurHash(pVerifiedHash->GetNDataSize(), pVerifiedHash->GetIsLeftBranch(), pVerifiedHash->GetNBaseSize()); + try { + m_hpartfile.Seek(PARTSIZE * nPart,wxFromStart); + CreateHashFromFile(&m_hpartfile,length, NULL, &htOurHash); + } catch (const CIOFailureException& e) { + AddDebugLogLineM(true, logAICHRecovery, + CFormat(wxT("IO failure while hashing part-file '%s': %s")) + % m_hpartfile.GetFilePath() % e.what()); + SetPartFileStatus(PS_ERROR); + return; + } + + if (!htOurHash.GetHashValid()){ + AddDebugLogLineM( false, logAICHRecovery, wxT("Processing AICH Recovery data: Failed to retrieve AICH Hashset of corrupt part") ); + wxASSERT( false ); + return; + } + + // now compare the hash we just did, to the verified hash and readd all blocks which are ok + uint32 nRecovered = 0; + for (uint32 pos = 0; pos < length; pos += EMBLOCKSIZE){ + const uint32 nBlockSize = min(EMBLOCKSIZE, length - pos); + CAICHHashTree* pVerifiedBlock = pVerifiedHash->FindHash(pos, nBlockSize); + CAICHHashTree* pOurBlock = htOurHash.FindHash(pos, nBlockSize); + if ( pVerifiedBlock == NULL || pOurBlock == NULL || !pVerifiedBlock->GetHashValid() || !pOurBlock->GetHashValid()){ + wxASSERT( false ); + continue; + } + if (pOurBlock->GetHash() == pVerifiedBlock->GetHash()){ + FillGap(PARTSIZE*nPart+pos, PARTSIZE*nPart + pos + (nBlockSize-1)); + RemoveBlockFromList(PARTSIZE*nPart, PARTSIZE*nPart + (nBlockSize-1)); + nRecovered += nBlockSize; + } + } + + // ok now some sanity checks + if (IsComplete(nPart*PARTSIZE, ((nPart*PARTSIZE)+length)-1)){ + // this is a bad, but it could probably happen under some rare circumstances + // make sure that MD4 agrres to this fact too + if (!HashSinglePart(nPart)){ + AddDebugLogLineM( false, logAICHRecovery, + wxString::Format(wxT("Processing AICH Recovery data: The part (%u) got completed while recovering - but MD4 says it corrupt! Setting hashset to error state, deleting part"), nPart)); + // now we are fu... unhappy + m_pAICHHashSet->SetStatus(AICH_ERROR); + AddGap(PARTSIZE*nPart, ((nPart*PARTSIZE)+length)-1); + wxASSERT( false ); + return; + } + else{ + AddDebugLogLineM( false, logAICHRecovery, wxString::Format( + wxT("Processing AICH Recovery data: The part (%u) got completed while recovering and MD4 agrees"), nPart) ); + // alrighty not so bad + EraseFirstValue(m_corrupted_list, nPart); + if (status == PS_EMPTY && theApp->IsRunning()){ + if (GetHashCount() == GetED2KPartHashCount() && !m_hashsetneeded){ + // Successfully recovered part, make it available for sharing + SetStatus(PS_READY); + theApp->sharedfiles->SafeAddKFile(this); + } + } + + if (theApp->IsRunning()){ + // Is this file finished? + if (m_gaplist.empty()) { + CompleteFile(false); + } + } + } + } // end sanity check + // Update met file + SavePartFile(); + + // make sure the user appreciates our great recovering work :P + AddDebugLogLineM( true, logAICHRecovery, CFormat( + wxT("AICH successfully recovered %s of %s from part %u for %s") ) + % CastItoXBytes(nRecovered) + % CastItoXBytes(length) + % nPart + % GetFileName() ); +} + + +void CPartFile::ClientStateChanged( int oldState, int newState ) +{ + if ( oldState == newState ) + return; + + // If the state is -1, then it's an entirely new item + if ( oldState != -1 ) { + // Was the old state a valid state? + if ( oldState == DS_ONQUEUE || oldState == DS_DOWNLOADING ) { + m_validSources--; + } else { + if ( oldState == DS_CONNECTED /* || oldState == DS_REMOTEQUEUEFULL */ ) { + m_validSources--; + } + + m_notCurrentSources--; + } + } + + // If the state is -1, then the source is being removed + if ( newState != -1 ) { + // Was the old state a valid state? + if ( newState == DS_ONQUEUE || newState == DS_DOWNLOADING ) { + ++m_validSources; + } else { + if ( newState == DS_CONNECTED /* || newState == DS_REMOTEQUEUEFULL */ ) { + ++m_validSources; + } + + ++m_notCurrentSources; + } + } +} + + +bool CPartFile::AddSource( CUpDownClient* client ) +{ + if (m_SrcList.insert( client ).second) { + theStats::AddFoundSource(); + theStats::AddSourceOrigin(client->GetSourceFrom()); + return true; + } else { + return false; + } +} + + +bool CPartFile::DelSource( CUpDownClient* client ) +{ + if (m_SrcList.erase( client )) { + theStats::RemoveSourceOrigin(client->GetSourceFrom()); + theStats::RemoveFoundSource(); + return true; + } else { + return false; + } +} + + +void CPartFile::UpdatePartsFrequency( CUpDownClient* client, bool increment ) +{ + const BitVector& freq = client->GetPartStatus(); + + if ( m_SrcpartFrequency.size() != GetPartCount() ) { + m_SrcpartFrequency.clear(); + m_SrcpartFrequency.insert(m_SrcpartFrequency.begin(), GetPartCount(), 0); + + if ( !increment ) { + return; + } + } + + unsigned int size = freq.size(); + if ( size != m_SrcpartFrequency.size() ) { + return; + } + + if ( increment ) { + for ( unsigned int i = 0; i < size; i++ ) { + if ( freq[i] ) { + m_SrcpartFrequency[i]++; + } + } + } else { + for ( unsigned int i = 0; i < size; i++ ) { + if ( freq[i] ) { + m_SrcpartFrequency[i]--; + } + } + } +} + +const FileRatingList &CPartFile::GetRatingAndComments() +{ + m_FileRatingList.clear(); + // This can be pre-processed, but is it worth the CPU? + CPartFile::SourceSet::iterator it = m_SrcList.begin(); + for ( ; it != m_SrcList.end(); ++it ) { + CUpDownClient *cur_src = *it; + if (cur_src->GetFileComment().Length()>0 || cur_src->GetFileRating()>0) { + // AddDebugLogLineM(false, logPartFile, wxString(wxT("found a comment for ")) << GetFileName()); + m_FileRatingList.push_back(SFileRating(*cur_src)); + } + } + + return m_FileRatingList; +} + +#else // CLIENT_GUI + +CPartFile::CPartFile(CEC_PartFile_Tag *tag) +{ + Init(); + + SetFileName(CPath(tag->FileName())); + m_abyFileHash = tag->ID(); + SetFileSize(tag->SizeFull()); + m_partmetfilename = CPath(tag->PartMetName()); + transferred = tag->SizeXfer(); + percentcompleted = (100.0*completedsize) / GetFileSize(); + completedsize = tag->SizeDone(); + + m_category = tag->FileCat(); + + m_iPartCount = ((uint64)GetFileSize() + (PARTSIZE - 1)) / PARTSIZE; + m_SrcpartFrequency.insert(m_SrcpartFrequency.end(), m_iPartCount, 0); + m_iDownPriority = tag->Prio(); + if ( m_iDownPriority >= 10 ) { + m_iDownPriority-= 10; + m_bAutoDownPriority = true; + } else { + m_bAutoDownPriority = false; + } + // FIXME: ! + m_category = 0; + + m_source_count = 0; + m_a4af_source_count = 0; +} + +/* + * Remote gui specific code + */ +CPartFile::~CPartFile() +{ +} + +const FileRatingList &CPartFile::GetRatingAndComments() +{ + return m_FileRatingList; +} +#endif // !CLIENT_GUI + + +void CPartFile::UpdateDisplayedInfo(bool force) +{ + uint32 curTick = ::GetTickCount(); + m_CommentUpdated = true; + + // Wait 1.5s between each redraw + if(force || curTick-m_lastRefreshedDLDisplay > MINWAIT_BEFORE_DLDISPLAY_WINDOWUPDATE ) { + Notify_DownloadCtrlUpdateItem(this); + m_lastRefreshedDLDisplay = curTick; + } + +} + + +void CPartFile::Init() +{ + m_showSources = false; + m_lastsearchtime = 0; + lastpurgetime = ::GetTickCount(); + m_paused = false; + m_stopped = false; + m_insufficient = false; + + status = PS_EMPTY; + + transferred = 0; + m_iLastPausePurge = time(NULL); + + if(thePrefs::GetNewAutoDown()) { + m_iDownPriority = PR_HIGH; + m_bAutoDownPriority = true; + } else { + m_iDownPriority = PR_NORMAL; + m_bAutoDownPriority = false; + } + + memset(m_anStates,0,sizeof(m_anStates)); + + transferingsrc = 0; // new + + kBpsDown = 0.0; + + m_CommentUpdated = false; + m_hashsetneeded = true; + m_count = 0; + percentcompleted = 0; + completedsize=0; + m_bPreviewing = false; + lastseencomplete = 0; + m_availablePartsCount=0; + m_ClientSrcAnswered = 0; + m_LastNoNeededCheck = 0; + m_iRating = 0; + m_nTotalBufferData = 0; + m_nLastBufferFlushTime = 0; + m_bPercentUpdated = false; + m_bRecoveringArchive = false; + m_iGainDueToCompression = 0; + m_iLostDueToCorruption = 0; + m_iTotalPacketsSavedDueToICH = 0; + m_category = 0; + m_lastRefreshedDLDisplay = 0; + m_nDlActiveTime = 0; + m_tActivated = 0; + m_is_A4AF_auto = false; + m_localSrcReqQueued = false; + m_nCompleteSourcesTime = time(NULL); + m_nCompleteSourcesCount = 0; + m_nCompleteSourcesCountLo = 0; + m_nCompleteSourcesCountHi = 0; + + m_validSources = 0; + m_notCurrentSources = 0; + + // Kad + m_LastSearchTimeKad = 0; + m_TotalSearchesKad = 0; + +} + +wxString CPartFile::getPartfileStatus() const +{ + + wxString mybuffer; + + if ((status == PS_HASHING) || (status == PS_WAITINGFORHASH)) { + mybuffer=_("Hashing"); + } else { + switch (GetStatus()) { + case PS_COMPLETING: + mybuffer=_("Completing"); + break; + case PS_COMPLETE: + mybuffer=_("Complete"); + break; + case PS_PAUSED: + mybuffer=_("Paused"); + break; + case PS_ERROR: + mybuffer=_("Erroneous"); + break; + case PS_INSUFFICIENT: + mybuffer = _("Insufficient Diskspace"); + break; + default: + if (GetTransferingSrcCount()>0) { + mybuffer=_("Downloading"); + } else { + mybuffer=_("Waiting"); + } + break; + } + if (m_stopped && (GetStatus()!=PS_COMPLETE)) { + mybuffer=_("Stopped"); + } + } + + return mybuffer; +} + +int CPartFile::getPartfileStatusRang() const +{ + + int tempstatus=0; + if (GetTransferingSrcCount()==0) tempstatus=1; + switch (GetStatus()) { + case PS_HASHING: + case PS_WAITINGFORHASH: + tempstatus=3; + break; + case PS_COMPLETING: + tempstatus=4; + break; + case PS_COMPLETE: + tempstatus=5; + break; + case PS_PAUSED: + tempstatus=2; + break; + case PS_ERROR: + tempstatus=6; + break; + } + return tempstatus; +} + + +wxString CPartFile::GetFeedback() +{ + wxString retval + = CFormat(wxT("Feedback from: %s (%s)\n")) % thePrefs::GetUserNick() % GetFullMuleVersion() + + CFormat(wxT("File name: %s\n")) % GetFileName() + + CFormat(wxT("File size: %s\n")) % CastItoXBytes(GetFileSize()); + + if (GetStatus() == PS_COMPLETE) { + retval += wxT("Downloaded: Complete\n"); + } else { + retval += CFormat(wxT("Downloaded: %s (%.2f%%)\n")) % CastItoXBytes(GetCompletedSize()) % GetPercentCompleted() + + CFormat(wxT("Transferred: %s (%s)\n")) % CastItoXBytes(statistic.GetTransferred()) % CastItoXBytes(statistic.GetAllTimeTransferred()) + + CFormat(wxT("Requested: %u (%u)\n")) % statistic.GetRequests() % statistic.GetAllTimeRequests() + + CFormat(wxT("Accepted: %d (%d)\n")) % statistic.GetAccepts() % statistic.GetAllTimeAccepts() + + CFormat(wxT("Sources: %u\n")) % GetSourceCount(); + } + + return retval + wxString::Format(wxT("Complete Sources: %u\n"), m_nCompleteSourcesCount); +} + + +sint32 CPartFile::getTimeRemaining() const +{ + if (GetKBpsDown() < 0.001) + return -1; + else + return((GetFileSize()-GetCompletedSize()) / ((int)(GetKBpsDown()*1024.0))); +} + +bool CPartFile::PreviewAvailable() +{ + FileType type = GetFiletype(GetFileName()); + + return (((type == ftVideo) || (type == ftAudio)) && IsComplete(0, 256*1024)); +} + +bool CPartFile::CheckShowItemInGivenCat(int inCategory) +{ + // easy normal cases + bool IsInCat; + bool IsNotFiltered = true; + + IsInCat = ((inCategory==0) || (inCategory>0 && inCategory==GetCategory())); + + switch (thePrefs::GetAllcatType()) { + case 1: + IsNotFiltered = GetCategory() == 0 || inCategory > 0; + break; + case 2: + IsNotFiltered = IsPartFile(); + break; + case 3: + IsNotFiltered = !IsPartFile(); + break; + case 4: + IsNotFiltered = + (GetStatus() == PS_READY || GetStatus() == PS_EMPTY) && + GetTransferingSrcCount() == 0; + break; + case 5: + IsNotFiltered = + (GetStatus() == PS_READY || GetStatus()==PS_EMPTY) && + GetTransferingSrcCount() > 0; + break; + case 6: + IsNotFiltered = GetStatus() == PS_ERROR; + break; + case 7: + IsNotFiltered = GetStatus() == PS_PAUSED && !IsStopped(); + break; + case 8: + IsNotFiltered = IsStopped(); + break; + case 9: + IsNotFiltered = GetFiletype(GetFileName()) == ftVideo; + break; + case 10: + IsNotFiltered = GetFiletype(GetFileName()) == ftAudio; + break; + case 11: + IsNotFiltered = GetFiletype(GetFileName()) == ftArchive; + break; + case 12: + IsNotFiltered = GetFiletype(GetFileName()) == ftCDImage; + break; + case 13: + IsNotFiltered = GetFiletype(GetFileName()) == ftPicture; + break; + case 14: + IsNotFiltered = GetFiletype(GetFileName()) == ftText; + break; + case 15: + IsNotFiltered = !IsStopped() && GetStatus() != PS_PAUSED; + break; + } + + return IsNotFiltered && IsInCat; +} + +bool CPartFile::IsComplete(uint64 start, uint64 end) +{ + if (end >= GetFileSize()) { + end = GetFileSize()-1; + } + + std::list::iterator it = m_gaplist.begin(); + for (; it != m_gaplist.end(); ++it) { + Gap_Struct* cur_gap = *it; + if ((cur_gap->start >= start && cur_gap->end <= end)||(cur_gap->start >= start + && cur_gap->start <= end)||(cur_gap->end <= end && cur_gap->end >= start) + ||(start >= cur_gap->start && end <= cur_gap->end)) { + return false; + } + } + return true; +} + + +void CPartFile::SetActive(bool bActive) +{ + time_t tNow = time(NULL); + if (bActive) { + if (theApp->IsConnected()) { + if (m_tActivated == 0) { + m_tActivated = tNow; + } + } + } else { + if (m_tActivated != 0) { + m_nDlActiveTime += tNow - m_tActivated; + m_tActivated = 0; + } + } +} + + +uint32 CPartFile::GetDlActiveTime() const +{ + uint32 nDlActiveTime = m_nDlActiveTime; + if (m_tActivated != 0) { + nDlActiveTime += time(NULL) - m_tActivated; + } + return nDlActiveTime; +} + + +#ifndef CLIENT_GUI + +uint8 CPartFile::GetStatus(bool ignorepause) const +{ + if ( (!m_paused && !m_insufficient) || + status == PS_ERROR || + status == PS_COMPLETING || + status == PS_COMPLETE || + ignorepause) { + return status; + } else if ( m_insufficient ) { + return PS_INSUFFICIENT; + } else { + return PS_PAUSED; + } +} + +void CPartFile::AddDeadSource(const CUpDownClient* client) +{ + m_deadSources.AddDeadSource( client ); +} + + +bool CPartFile::IsDeadSource(const CUpDownClient* client) +{ + return m_deadSources.IsDeadSource( client ); +} + +void CPartFile::SetFileName(const CPath& fileName) +{ + CKnownFile* pFile = theApp->sharedfiles->GetFileByID(GetFileHash()); + + bool is_shared = (pFile && pFile == this); + + if (is_shared) { + // The file is shared, we must clear the search keywords so we don't + // publish the old name anymore. + theApp->sharedfiles->RemoveKeywords(this); + } + + CKnownFile::SetFileName(fileName); + + if (is_shared) { + // And of course, we must advertise the new name if the file is shared. + theApp->sharedfiles->AddKeywords(this); + } + + UpdateDisplayedInfo(true); +} + + +uint16 CPartFile::GetMaxSources() const +{ + // This is just like this, while we don't import the private max sources per file + return thePrefs::GetMaxSourcePerFile(); +} + + +uint16 CPartFile::GetMaxSourcePerFileSoft() const +{ + unsigned int temp = ((unsigned int)GetMaxSources() * 9L) / 10; + if (temp > MAX_SOURCES_FILE_SOFT) { + return MAX_SOURCES_FILE_SOFT; + } + return temp; +} + +uint16 CPartFile::GetMaxSourcePerFileUDP() const +{ + unsigned int temp = ((unsigned int)GetMaxSources() * 3L) / 4; + if (temp > MAX_SOURCES_FILE_UDP) { + return MAX_SOURCES_FILE_UDP; + } + return temp; +} + +#define DROP_FACTOR 2 + +CUpDownClient* CPartFile::GetSlowerDownloadingClient(uint32 speed, CUpDownClient* caller) { +// printf("Start slower source calculation\n"); + for( SourceSet::iterator it = m_SrcList.begin(); it != m_SrcList.end(); ) { + CUpDownClient* cur_src = *it++; + if ((cur_src->GetDownloadState() == DS_DOWNLOADING) && (cur_src != caller)) { + uint32 factored_bytes_per_second = static_cast( + (cur_src->GetKBpsDown() * 1024) * DROP_FACTOR); + if ( factored_bytes_per_second< speed) { +// printf("Selecting source %p to drop: %d < %d\n", cur_src, factored_bytes_per_second, speed); +// printf("End slower source calculation\n"); + return cur_src; + } else { +// printf("Not selecting source %p to drop: %d > %d\n", cur_src, factored_bytes_per_second, speed); + } + } + } +// printf("End slower source calculation\n"); + return NULL; +} + +#endif +// File_checked_for_headers diff --git a/src/PartFile.h b/src/PartFile.h new file mode 100644 index 00000000..45f81085 --- /dev/null +++ b/src/PartFile.h @@ -0,0 +1,441 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef PARTFILE_H +#define PARTFILE_H + + +#include "KnownFile.h" // Needed for CKnownFile +#include "CFile.h" // Needed for CFile + +#include "OtherStructs.h" // Needed for Gap_Struct +#include "DeadSourceList.h" // Needed for CDeadSourceList + + + +class CSearchFile; +class CUpDownClient; +class CMemFile; +class CFileDataIO; +class CED2KFileLink; + +//#define BUFFER_SIZE_LIMIT 500000 // Max bytes before forcing a flush +#define BUFFER_TIME_LIMIT 60000 // Max milliseconds before forcing a flush + +#define STATES_COUNT 13 + +// Ok, eMule and aMule are building incompatible backup files because +// of the different name. aMule was using ".BAK" and eMule ".bak". +// This should fix it. +#define PARTMET_BAK_EXT wxT(".bak") + +enum EPartFileFormat { + PMT_UNKNOWN = 0, + PMT_DEFAULTOLD, + PMT_SPLITTED, + PMT_NEWOLD, + PMT_SHAREAZA, + PMT_BADFORMAT +}; + +struct PartFileBufferedData +{ + byte *data; // Barry - This is the data to be written + uint64 start; // Barry - This is the start offset of the data + uint64 end; // Barry - This is the end offset of the data + Requested_Block_Struct *block; // Barry - This is the requested block that this data relates to +}; + + +class SFileRating +{ +public: + wxString UserName; + wxString FileName; + sint16 Rating; + wxString Comment; +public: + SFileRating(const wxString &u, const wxString &f, sint16 r, const wxString &c); + SFileRating(const SFileRating &fr); + SFileRating(const CUpDownClient &client); + ~SFileRating(); +}; + +typedef std::list FileRatingList; + +class SourcenameItem +{ +public: + wxString name; + long count; +public: + SourcenameItem(const wxString &n, long c) + : + name(n), count(c) {} +}; + +typedef std::list SourcenameItemList; + +class CPartFile : public CKnownFile { +public: + typedef std::list CGapPtrList; + typedef std::list CReqBlockPtrList; + + + CPartFile(); +#ifdef CLIENT_GUI + CPartFile(CEC_PartFile_Tag *tag); +#else + virtual void SetFileName(const CPath& filename); +#endif + CPartFile(CSearchFile* searchresult); //used when downloading a new file + CPartFile(const CED2KFileLink* fileLink); + virtual ~CPartFile(); + + bool CreateFromFile(wxString WXUNUSED(directory), wxString WXUNUSED(filename), void* WXUNUSED(pvProgressParam)) {return false;}// not supported in this class + void SetPartFileStatus(uint8 newstatus); + virtual bool LoadFromFile(const CFileDataIO* WXUNUSED(file)) { return false; } + bool WriteToFile(CFileDataIO* WXUNUSED(file)) { return false; } + bool IsPartFile() const { return !(status == PS_COMPLETE); } + uint32 Process(uint32 reducedownload, uint8 m_icounter); + uint8 LoadPartFile(const CPath& in_directory, const CPath& filename, bool from_backup = false, bool getsizeonly = false); + bool SavePartFile(bool Initial = false); + void PartFileHashFinished(CKnownFile* result); + bool HashSinglePart(uint16 partnumber); // true = ok , false = corrupted + + bool CheckShowItemInGivenCat(int inCategory); + + bool IsComplete(uint64 start, uint64 end); + + void UpdateCompletedInfos(); + + bool GetNextRequestedBlock(CUpDownClient* sender,Requested_Block_Struct** newblocks,uint16* count); + void WritePartStatus(CMemFile* file); + void WriteCompleteSourcesCount(CMemFile* file); + static bool CanAddSource(uint32 userid, uint16 port, uint32 serverip, uint16 serverport, uint8* pdebug_lowiddropped = NULL, bool ed2kID = true); + void AddSources(CMemFile& sources, uint32 serverip, uint16 serverport, unsigned origin, bool bWithObfuscationAndHash); +#ifdef CLIENT_GUI + uint8 GetStatus() const { return status; } + uint8 GetStatus(bool /*ignorepause = false*/) const { return status; } +#else + uint8 GetStatus(bool ignorepause = false) const; +#endif + virtual void UpdatePartsInfo(); + const CPath& GetPartMetFileName() const { return m_partmetfilename; } + uint64 GetTransferred() const { return transferred; } + const CPath& GetFullName() const { return m_fullname; } + float GetKBpsDown() const { return kBpsDown; } + double GetPercentCompleted() const { return percentcompleted; } + +#ifndef CLIENT_GUI + uint16 GetSourceCount() const { return m_SrcList.size(); } + uint16 GetSrcA4AFCount() const { return m_A4AFsrclist.size(); } +#else + uint16 m_source_count, m_a4af_source_count; + uint16 GetSourceCount() const { return m_source_count; } + uint16 GetSrcA4AFCount() const { return m_a4af_source_count; } +#endif + uint16 GetTransferingSrcCount() const { return transferingsrc; } + uint16 GetNotCurrentSourcesCount() const { return m_notCurrentSources; }; + void SetNotCurrentSourcesCount(uint16 new_count) { m_notCurrentSources = new_count; }; + uint16 GetValidSourcesCount() const { return m_validSources; }; + + uint64 GetNeededSpace(); + + wxString GetFeedback(); + + wxString getPartfileStatus() const; //<<--9/21/02 + sint32 getTimeRemaining() const; //<<--9/21/02 + time_t lastseencomplete; + int getPartfileStatusRang() const; + + // Barry - Added as replacement for BlockReceived to buffer data before writing to disk + uint32 WriteToBuffer(uint32 transize, byte *data, uint64 start, uint64 end, Requested_Block_Struct *block); + void FlushBuffer(bool forcewait=false, bool bForceICH = false, bool bNoAICH = false); + + // Barry - Is archive recovery in progress + volatile bool m_bRecoveringArchive; + + // Barry - Added to prevent list containing deleted blocks on shutdown + void RemoveAllRequestedBlocks(void); + + void RemoveBlockFromList(uint64 start,uint64 end); + void RemoveAllSources(bool bTryToSwap); + void Delete(); + void StopFile(bool bCancel = false); + void PauseFile(bool bInsufficient = false); + void ResumeFile(); + + virtual CPacket* CreateSrcInfoPacket(const CUpDownClient* forClient, uint8 byRequestedVersion, uint16 nRequestedOptions); + void AddClientSources(CMemFile* sources, unsigned nSourceFrom, uint8 uClientSXVersion, bool bSourceExchange2, const CUpDownClient* pClient = NULL); + + bool PreviewAvailable(); + uint8 GetAvailablePartCount() const { return m_availablePartsCount; } + uint32 GetLastAnsweredTime() const { return m_ClientSrcAnswered; } + void SetLastAnsweredTime(); + void SetLastAnsweredTimeTimeout(); + uint64 GetLostDueToCorruption() const { return m_iLostDueToCorruption; } + uint64 GetGainDueToCompression() const { return m_iGainDueToCompression; } + uint32 TotalPacketsSavedDueToICH()const{ return m_iTotalPacketsSavedDueToICH; } + bool IsStopped() const { return this ? m_stopped : true; } + bool IsPaused() const { return m_paused; } + void UpdateFileRatingCommentAvail(); + bool m_CommentUpdated; + + int GetCommonFilePenalty(); + void UpdateDisplayedInfo(bool force = false); + + uint8 GetCategory() const { return m_category; } + void SetCategory(uint8 cat); + + CFile m_hpartfile; //permanent opened handle to avoid write conflicts + volatile bool m_bPreviewing; + void SetDownPriority(uint8 newDownPriority, bool bSave = true, bool bRefresh = true); + bool IsAutoDownPriority() const { return m_bAutoDownPriority; } + void SetAutoDownPriority(bool flag) { m_bAutoDownPriority = flag; } + void UpdateAutoDownPriority(); + uint8 GetDownPriority() const { return m_iDownPriority; } + void SetActive(bool bActive); + uint32 GetDlActiveTime() const; + bool GetInsufficient() const { return m_insufficient; } + + void CompleteFileEnded(bool errorOccured, const CPath& newname); + + bool RemoveSource(CUpDownClient* toremove, bool updatewindow = true, bool bDoStatsUpdate = true); + + void RequestAICHRecovery(uint16 nPart); + void AICHRecoveryDataAvailable(uint16 nPart); + + /** + * This function is used to update source-counts. + * + * @param oldState The old state of the client, or -1 to ignore. + * @param newState The new state of the client, or -1 to ignore. + * + * Call this function for a client belonging to this file, which has changed + * its state. The value -1 can be used to make the function ignore one of + * the two states. + * + * AddSource and DelSource takes care of calling this function when a source is + * removed, so there's no need to call this function when calling either of those. + */ + void ClientStateChanged( int oldState, int newState ); + + bool AddSource( CUpDownClient* client ); + bool DelSource( CUpDownClient* client ); + + /** + * Updates the requency of avilable parts from with the data the client provides. + * + * @param client The clients whoose available parts should be considered. + * @param increment If true, the counts are incremented, otherwise they are decremented. + * + * This functions updates the frequency list of file-parts, using the clients + * parts-status. This function should be called by clients every time they update their + * parts-status, or when they are added or removed from the file. + */ + void UpdatePartsFrequency( CUpDownClient* client, bool increment ); + + ArrayOfUInts16 m_SrcpartFrequency; + + void SetShowSources( bool val ) { m_showSources = val; } + bool ShowSources() const { return m_showSources; } + + typedef std::set SourceSet; + + const SourceSet& GetSourceList() const { return m_SrcList; } + const SourceSet& GetA4AFList() const { return m_A4AFsrclist; } + + const CGapPtrList GetGapList() const { return m_gaplist; } + const CReqBlockPtrList GetRequestedBlockList() const { return m_requestedblocks_list; } + + + /** + * Adds a source to the list of dead sources. + * + * @param client The source to be recorded as dead for this file. + */ + void AddDeadSource(const CUpDownClient* client); + + /** + * Checks if a source is recorded as being dead for this file. + * + * @param client The client to evaluate. + * @return True if dead, false otherwise. + * + * Sources that are dead are not to be considered valid + * sources and should not be added to the partfile. + */ + bool IsDeadSource(const CUpDownClient* client); + + /* Kad Stuff */ + uint16 GetMaxSources() const; + uint16 GetMaxSourcePerFileSoft() const; + uint16 GetMaxSourcePerFileUDP() const; + + const FileRatingList &GetRatingAndComments(); + +private: + //! A local list of sources that are invalid for this file. +#ifndef CLIENT_GUI + CDeadSourceList m_deadSources; +#endif + + uint16 m_notCurrentSources; + + bool m_showSources; + + uint32 m_validSources; + + void AddGap(uint64 start, uint64 end); + void FillGap(uint64 start, uint64 end); + bool GetNextEmptyBlockInPart(uint16 partnumber,Requested_Block_Struct* result); + bool IsAlreadyRequested(uint64 start, uint64 end); + void CompleteFile(bool hashingdone); + void CreatePartFile(); + void Init(); + + bool CheckFreeDiskSpace( uint32 neededSpace = 0 ); + + bool IsCorruptedPart(uint16 partnumber); + + uint64 GetTotalGapSizeInPart(uint32 uPart) const; + + uint64 GetTotalGapSizeInRange(uint64 uRangeStart, uint64 uRangeEnd) const; + + uint32 m_iLastPausePurge; + uint16 m_count; + uint16 m_anStates[STATES_COUNT]; + uint16 transferingsrc; + uint64 completedsize; + uint64 transferred; + + uint64 m_iLostDueToCorruption; + uint64 m_iGainDueToCompression; + uint32 m_iTotalPacketsSavedDueToICH; + float kBpsDown; + CPath m_fullname; + CPath m_partmetfilename; + bool m_paused; + bool m_stopped; + bool m_insufficient; + uint8 m_iDownPriority; + bool m_bAutoDownPriority; + uint8 status; + uint32 lastpurgetime; + uint32 m_LastNoNeededCheck; + CGapPtrList m_gaplist; + CReqBlockPtrList m_requestedblocks_list; + double percentcompleted; + std::list m_corrupted_list; + uint8 m_availablePartsCount; + uint32 m_ClientSrcAnswered; + bool m_bPercentUpdated; + + void PerformFileComplete(); + + uint32 m_lastRefreshedDLDisplay; + + // Barry - Buffered data to be written + std::list m_BufferedData_list; + + uint32 m_nTotalBufferData; + uint32 m_nLastBufferFlushTime; + + uint8 m_category; + uint32 m_nDlActiveTime; + time_t m_tActivated; + bool m_is_A4AF_auto; + + SourceSet m_SrcList; + SourceSet m_A4AFsrclist; + bool m_hashsetneeded; + uint32 m_lastsearchtime; + bool m_localSrcReqQueued; + + FileRatingList m_FileRatingList; +#ifdef CLIENT_GUI + SourcenameItemList m_SourcenameItem_list; +public: + const SourcenameItemList &GetSourcenameItemList() { return m_SourcenameItem_list; } + void ClearSourcenameItemList() { m_SourcenameItem_list.clear(); } + void AddSourcenameItemList(const wxString &name, long count) { m_SourcenameItem_list.push_back(SourcenameItem(name, count)); } +#endif +public: + const FileRatingList &GetFileRatingList() { return m_FileRatingList; } + void ClearFileRatingList() { m_FileRatingList.clear(); } + void AddFileRatingList(const wxString & u, const wxString & f, sint16 r, const wxString & c) { + m_FileRatingList.push_back(SFileRating(u, f, r, c)); } + + bool IsHashSetNeeded() const { return m_hashsetneeded; } + void SetHashSetNeeded(bool value) { m_hashsetneeded = value; } + + uint64 GetCompletedSize() const { return completedsize; } + void SetCompletedSize(uint64 size) { completedsize = size; } + + bool IsLocalSrcRequestQueued() const { return m_localSrcReqQueued; } + void SetLocalSrcRequestQueued(bool value) { m_localSrcReqQueued = value; } + + void AddA4AFSource(CUpDownClient* src) { m_A4AFsrclist.insert(src); } + bool RemoveA4AFSource(CUpDownClient* src) { return m_A4AFsrclist.erase(src); } + + uint32 GetLastSearchTime() const { return m_lastsearchtime; } + void SetLastSearchTime(uint32 time) { m_lastsearchtime = time; } + + +// void CleanUpSources( bool noNeeded, bool fullQueue = false, bool highQueue = false ); + + void AddDownloadingSource(CUpDownClient* client); + + void RemoveDownloadingSource(CUpDownClient* client); + void SetStatus(uint8 in); + void StopPausedFile(); + + // [sivka / Tarod] Imported from eMule 0.30c (Creteil) ... + void SetA4AFAuto(bool in) { m_is_A4AF_auto = in; } + bool IsA4AFAuto() const { return m_is_A4AF_auto; } + + // Kry -Sources seeds + void SaveSourceSeeds(); + void LoadSourceSeeds(); + + // Dropping slow sources + + CUpDownClient* GetSlowerDownloadingClient(uint32 speed, CUpDownClient* caller) ; + +private: + /* downloading sources list */ + CClientPtrList m_downloadingSourcesList; + + /* Kad Stuff */ + uint32 m_LastSearchTimeKad; + uint8 m_TotalSearchesKad; + +friend class CDownQueueRem; +friend class CPartFileConvert; +}; + +#endif // PARTFILE_H +// File_checked_for_headers diff --git a/src/PartFileConvert.cpp b/src/PartFileConvert.cpp new file mode 100644 index 00000000..f33738bb --- /dev/null +++ b/src/PartFileConvert.cpp @@ -0,0 +1,800 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include + +#include "PartFileConvert.h" + +#ifdef CLIENT_GUI + +// This allows us to compile muuli_wdr + +CConvertListCtrl::CConvertListCtrl( + wxWindow* WXUNUSED(parent), + wxWindowID WXUNUSED(winid), + const wxPoint& WXUNUSED(pos), + const wxSize& WXUNUSED(size), + long WXUNUSED(style), + const wxValidator& WXUNUSED(validator), + const wxString& WXUNUSED(name)) + {} + +#else + +// Normal compilation + +#include "amule.h" +#include "DownloadQueue.h" +#include +#include "Logger.h" +#include "PartFile.h" +#include "Preferences.h" +#include "SharedFileList.h" +#include + +#include +#include "muuli_wdr.h" + + +enum convstatus{ + CONV_OK = 0, + CONV_QUEUE, + CONV_INPROGRESS, + CONV_OUTOFDISKSPACE, + CONV_PARTMETNOTFOUND, + CONV_IOERROR, + CONV_FAILED, + CONV_BADFORMAT, + CONV_ALREADYEXISTS +}; + +struct ConvertJob { + CPath folder; + CPath filename; + wxString filehash; + int format; + int state; + uint32 size; + uint32 spaceneeded; + uint8 partmettype; + bool removeSource; + ConvertJob() { size=0; spaceneeded=0; partmettype=PMT_UNKNOWN; removeSource = true; } + //~ConvertJob() {} +}; + +wxThread* CPartFileConvert::s_convertPfThread = NULL; +std::list CPartFileConvert::s_jobs; +ConvertJob* CPartFileConvert::s_pfconverting = NULL; +wxMutex CPartFileConvert::s_mutex; + +CPartFileConvertDlg* CPartFileConvert::s_convertgui = NULL; + +int CPartFileConvert::ScanFolderToAdd(const CPath& folder, bool deletesource) +{ + int count = 0; + CDirIterator finder(folder); + + CPath file = finder.GetFirstFile(CDirIterator::File, wxT("*.part.met")); + while (!file.IsOk()) { + ConvertToeMule(folder.JoinPaths(file), deletesource); + file = finder.GetNextFile(); + count++; + } + /* Shareaza + file = finder.GetFirstFile(CDirIterator::File, wxT("*.sd")); + while (!file.IsEmpty()) { + ConvertToeMule(file, deletesource); + file = finder.GetNextFile(); + count++; + } + */ + + file = finder.GetFirstFile(CDirIterator::Dir, wxT("*.*")); + while (!file.IsOk()) { + ScanFolderToAdd(folder.JoinPaths(file), deletesource); + + file = finder.GetNextFile(); + } + + return count; +} + +void CPartFileConvert::ConvertToeMule(const CPath& file, bool deletesource) +{ + if (!file.FileExists()) { + return; + } + + ConvertJob* newjob = new ConvertJob(); + newjob->folder = file; + newjob->removeSource = deletesource; + newjob->state = CONV_QUEUE; + + wxMutexLocker lock(s_mutex); + + s_jobs.push_back(newjob); + + if (s_convertgui) { + s_convertgui->AddJob(newjob); + } + + StartThread(); +} + +void CPartFileConvert::StartThread() +{ + if (!s_convertPfThread) { + s_convertPfThread = new CPartFileConvert(); + + switch ( s_convertPfThread->Create() ) { + case wxTHREAD_NO_ERROR: + AddDebugLogLineM( false, logPfConvert, wxT("A new thread has been created.") ); + break; + case wxTHREAD_RUNNING: + AddDebugLogLineM( true, logPfConvert, wxT("Error, attempt to create a already running thread!") ); + break; + case wxTHREAD_NO_RESOURCE: + AddDebugLogLineM( true, logPfConvert, wxT("Error, attempt to create a thread without resources!") ); + break; + default: + AddDebugLogLineM( true, logPfConvert, wxT("Error, unknown error attempting to create a thread!") ); + } + + // The thread shouldn't hog the CPU, as it will already be hogging the HD + s_convertPfThread->SetPriority(WXTHREAD_MIN_PRIORITY); + + s_convertPfThread->Run(); + } +} + +void CPartFileConvert::StopThread() +{ + if (s_convertPfThread) { + s_convertPfThread->Delete(); + } else { + return; + } + + printf("Waiting for partfile convert thread to die...\n"); + while (s_convertPfThread) { + wxSleep(1); + } +} + +wxThread::ExitCode CPartFileConvert::Entry() +{ + int imported = 0; + + for (;;) + { + // search next queued job and start it + { + wxMutexLocker lock(s_mutex); + s_pfconverting = NULL; + for (std::list::iterator it = s_jobs.begin(); it != s_jobs.end(); ++it) { + s_pfconverting = *it; + if (s_pfconverting->state == CONV_QUEUE) { + break; + } else { + s_pfconverting = NULL; + } + } + } + + if (s_pfconverting) { + { + wxMutexLocker lock(s_mutex); + s_pfconverting->state = CONV_INPROGRESS; + } + + UpdateGUI(s_pfconverting); + + int convertResult = performConvertToeMule(s_pfconverting->folder); + { + wxMutexLocker lock(s_mutex); + s_pfconverting->state = convertResult; + } + + if (s_pfconverting->state == CONV_OK) { + ++imported; + } + + if (TestDestroy()) { + wxMutexLocker lock(s_mutex); + for (std::list::iterator it = s_jobs.begin(); it != s_jobs.end(); ++it) { + delete *it; + } + s_jobs.clear(); + break; + } + + + UpdateGUI(s_pfconverting); + + AddLogLineM(true, CFormat(_("Importing %s: %s")) % s_pfconverting->folder % GetReturncodeText(s_pfconverting->state)); + } else { + break; // nothing more to do now + } + } + + // clean up + UpdateGUI(NULL); + + if (imported) { + theApp->sharedfiles->PublishNextTurn(); + } + + AddDebugLogLineM(false, logPfConvert, wxT("No more jobs on queue, exiting from thread.")); + + s_convertPfThread = NULL; + + return NULL; +} + +int CPartFileConvert::performConvertToeMule(const CPath& fileName) +{ + wxString filepartindex, buffer; + unsigned fileindex; + + CPath folder = fileName.GetPath(); + CPath partfile = fileName.GetFullName(); + CPath newfilename; + + CDirIterator finder(folder); + + UpdateGUI(0, _("Reading temp folder"), true); + + filepartindex = partfile.RemoveAllExt().GetRaw(); + + UpdateGUI(4, _("Retrieving basic information from download info file")); + + CPartFile* file = new CPartFile(); + s_pfconverting->partmettype = file->LoadPartFile(folder, partfile, false, true); + + switch (s_pfconverting->partmettype) { + case PMT_UNKNOWN: + case PMT_BADFORMAT: + delete file; + return CONV_BADFORMAT; + } + + CPath oldfile = folder.JoinPaths(partfile.RemoveExt()); + + { + wxMutexLocker lock(s_mutex); + s_pfconverting->size = file->GetFileSize(); + s_pfconverting->filename = file->GetFileName(); + s_pfconverting->filehash = file->GetFileHash().Encode(); + } + + UpdateGUI(s_pfconverting); + + if (theApp->downloadqueue->GetFileByID(file->GetFileHash())) { + delete file; + return CONV_ALREADYEXISTS; + } + + if (s_pfconverting->partmettype == PMT_SPLITTED) { + char *ba = new char [PARTSIZE]; + + try { + CFile inputfile; + + // just count + unsigned maxindex = 0; + unsigned partfilecount = 0; + CPath filePath = finder.GetFirstFile(CDirIterator::File, filepartindex + wxT(".*.part")); + while (!filePath.IsOk()) { + long l; + ++partfilecount; + filePath.GetFullName().RemoveExt().GetExt().ToLong(&l); + fileindex = (unsigned)l; + filePath = finder.GetNextFile(); + // GonoszTopi - why the hell does eMule need this?? + //if (fileindex == 0) continue; + if (fileindex > maxindex) maxindex = fileindex; + } + float stepperpart; + { + wxMutexLocker lock(s_mutex); + if (partfilecount > 0) { + stepperpart = (80.0f / partfilecount); + if (maxindex * PARTSIZE <= s_pfconverting->size) { + s_pfconverting->spaceneeded = maxindex * PARTSIZE; + } else { + s_pfconverting->spaceneeded = ((s_pfconverting->size / PARTSIZE) * PARTSIZE) + (s_pfconverting->size % PARTSIZE); + } + } else { + stepperpart = 80.0f; + s_pfconverting->spaceneeded = 0; + } + } + + UpdateGUI(s_pfconverting); + + sint64 freespace = CPath::GetFreeSpaceAt(thePrefs::GetTempDir()); + if (freespace != wxInvalidOffset) { + if (static_cast(freespace) < maxindex * PARTSIZE) { + delete file; + delete [] ba; + return CONV_OUTOFDISKSPACE; + } + } + + // create new partmetfile, and remember the new name + file->CreatePartFile(); + newfilename = file->GetFullName(); + + UpdateGUI(8, _("Creating destination file")); + + file->m_hpartfile.SetLength( s_pfconverting->spaceneeded ); + + unsigned curindex = 0; + CPath filename = finder.GetFirstFile(CDirIterator::File, filepartindex + wxT(".*.part")); + while (filename.IsOk()) { + // stats + ++curindex; + buffer = wxString::Format(_("Loading data from old download file (%u of %u)"), curindex, partfilecount); + + UpdateGUI(10 + (curindex * stepperpart), buffer); + + long l; + filename.GetFullName().RemoveExt().GetExt().ToLong(&l); + fileindex = (unsigned)l; + if (fileindex == 0) { + filename = finder.GetNextFile(); + continue; + } + + uint32 chunkstart = (fileindex - 1) * PARTSIZE; + + // open, read data of the part-part-file into buffer, close file + inputfile.Open(filename, CFile::read); + uint64 toReadWrite = std::min(PARTSIZE, inputfile.GetLength()); + inputfile.Read(ba, toReadWrite); + inputfile.Close(); + + buffer = wxString::Format(_("Saving data block into new single download file (%u of %u)"), curindex, partfilecount); + + UpdateGUI(10 + (curindex * stepperpart), buffer); + + // write the buffered data + file->m_hpartfile.Seek(chunkstart, wxFromStart); + file->m_hpartfile.Write(ba, toReadWrite); + + filename = finder.GetNextFile(); + } + delete[] ba; + } catch (const CSafeIOException& e) { + AddDebugLogLineM(true, logPfConvert, wxT("IO error while converting partfiles: ") + e.what()); + + delete[] ba; + file->Delete(); + return CONV_IOERROR; + } + + file->m_hpartfile.Close(); + } + // import an external common format partdownload + else //if (pfconverting->partmettype==PMT_DEFAULTOLD || pfconverting->partmettype==PMT_NEWOLD || Shareaza ) + { + if (!s_pfconverting->removeSource) { + wxMutexLocker lock(s_mutex); + s_pfconverting->spaceneeded = oldfile.GetFileSize(); + } + + UpdateGUI(s_pfconverting); + + sint64 freespace = CPath::GetFreeSpaceAt(thePrefs::GetTempDir()); + if (freespace == wxInvalidOffset) { + delete file; + return CONV_IOERROR; + } else if (!s_pfconverting->removeSource && (freespace < s_pfconverting->spaceneeded)) { + delete file; + return CONV_OUTOFDISKSPACE; + } + + file->CreatePartFile(); + newfilename = file->GetFullName().RemoveExt(); + + file->m_hpartfile.Close(); + + bool ret = false; + + UpdateGUI(92, _("Copy")); + + CPath::RemoveFile(newfilename); + if (!oldfile.FileExists()) { + // data file does not exist. well, then create a 0 byte big one + CFile datafile; + ret = datafile.Create(newfilename); + } else if (s_pfconverting->removeSource) { + ret = CPath::RenameFile(oldfile, newfilename); + } else { + ret = CPath::CloneFile(oldfile, newfilename, false); + } + if (!ret) { + file->Delete(); + //delete file; + return CONV_FAILED; + } + + } + + UpdateGUI(94, _("Retrieving source downloadfile information")); + + CPath::RemoveFile(newfilename); + if (s_pfconverting->removeSource) { + CPath::RenameFile(folder.JoinPaths(partfile), newfilename); + } else { + CPath::CloneFile(folder.JoinPaths(partfile), newfilename, false); + } + + file->m_hashlist.clear(); + + DeleteContents(file->m_gaplist); + + if (!file->LoadPartFile(thePrefs::GetTempDir(), file->GetPartMetFileName(), false)) { + //delete file; + file->Delete(); + return CONV_BADFORMAT; + } + + if (s_pfconverting->partmettype == PMT_NEWOLD || s_pfconverting->partmettype == PMT_SPLITTED ) { + file->SetCompletedSize(file->transferred); + file->m_iGainDueToCompression = 0; + file->m_iLostDueToCorruption = 0; + } + + UpdateGUI(100, _("Adding download and saving new partfile")); + + theApp->downloadqueue->AddDownload(file, thePrefs::AddNewFilesPaused(), 0); + file->SavePartFile(); + + if (file->GetStatus(true) == PS_READY) { + theApp->sharedfiles->SafeAddKFile(file); // part files are always shared files + } + + if (s_pfconverting->removeSource) { + CPath oldFile = finder.GetFirstFile(CDirIterator::File, filepartindex + wxT(".*")); + while (oldFile.IsOk()) { + CPath::RemoveFile(folder.JoinPaths(oldFile)); + oldFile = finder.GetNextFile(); + } + + if (s_pfconverting->partmettype == PMT_SPLITTED) { + CPath::RemoveDir(folder); + } + } + + return CONV_OK; +} + +void CPartFileConvert::UpdateGUI(float percent, wxString text, bool fullinfo) +{ + if (!IsMain()) { + wxMutexGuiEnter(); + } + + if (s_convertgui) { + s_convertgui->m_pb_current->SetValue((int)percent); + wxString buffer = wxString::Format(wxT("%.2f %%"), percent); + wxStaticText* percentlabel = dynamic_cast(s_convertgui->FindWindow(IDC_CONV_PROZENT)); + percentlabel->SetLabel(buffer); + + if (!text.IsEmpty()) { + dynamic_cast(s_convertgui->FindWindow(IDC_CONV_PB_LABEL))->SetLabel(text); + } + + percentlabel->GetParent()->Layout(); + + if (fullinfo) { + dynamic_cast(IDC_CURJOB)->GetStaticBox()->SetLabel(s_pfconverting->folder.GetPrintable()); + } + } + + if (!IsMain()) { + wxMutexGuiLeave(); + } +} + +void CPartFileConvert::UpdateGUI(ConvertJob* job) +{ + if (!IsMain()) { + wxMutexGuiEnter(); + } + if (s_convertgui) { + s_convertgui->UpdateJobInfo(job); + } + if (!IsMain()) { + wxMutexGuiLeave(); + } +} + +void CPartFileConvert::ShowGUI(wxWindow* parent) +{ + if (s_convertgui) { + s_convertgui->Show(true); + s_convertgui->Raise(); + } else { + s_convertgui = new CPartFileConvertDlg(parent); + s_convertgui->Show(true); + + wxMutexLocker lock(s_mutex); + if (s_pfconverting) { + UpdateGUI(s_pfconverting); + UpdateGUI(50, _("Fetching status..."), true); + } + + // fill joblist + for (std::list::iterator it = s_jobs.begin(); it != s_jobs.end(); ++it) { + s_convertgui->AddJob(*it); + UpdateGUI(*it); + } + } +} + +void CPartFileConvert::CloseGUI() +{ + if (s_convertgui) { + s_convertgui->Show(false); + s_convertgui->Destroy(); + s_convertgui = NULL; + } +} + +void CPartFileConvert::RemoveAllJobs() +{ + wxMutexLocker lock(s_mutex); + for (std::list::iterator it = s_jobs.begin(); it != s_jobs.end(); ++it) { + if (s_convertgui) { + s_convertgui->RemoveJob(*it); + } + delete *it; + } + s_jobs.clear(); +} + +void CPartFileConvert::RemoveJob(ConvertJob* job) +{ + wxMutexLocker lock(s_mutex); + for (std::list::iterator it = s_jobs.begin(); it != s_jobs.end(); ++it) { + if (*it == job) { + if (s_convertgui) { + s_convertgui->RemoveJob(job); + } + s_jobs.erase(it); + delete *it; + } + } +} + +void CPartFileConvert::RemoveAllSuccJobs() +{ + wxMutexLocker lock(s_mutex); + for (std::list::iterator it = s_jobs.begin(); it != s_jobs.end(); ++it) { + if ((*it)->state == CONV_OK) { + if (s_convertgui) { + s_convertgui->RemoveJob(*it); + } + s_jobs.erase(it); + delete *it; + } + } +} + +wxString CPartFileConvert::GetReturncodeText(int ret) +{ + switch (ret) { + case CONV_OK : return _("Completed"); + case CONV_INPROGRESS : return _("In progress"); + case CONV_OUTOFDISKSPACE : return _("Error: Out of diskspace"); + case CONV_PARTMETNOTFOUND : return _("Error: Partmet not found"); + case CONV_IOERROR : return _("Error: IO error!"); + case CONV_FAILED : return _("Error: Failed!"); + case CONV_QUEUE : return _("Queued"); + case CONV_ALREADYEXISTS : return _("Already downloading"); + case CONV_BADFORMAT : return _("Unknown or bad tempfile format."); + default: return wxT("?"); + } +} + + +CConvertListCtrl::CConvertListCtrl(wxWindow* parent, wxWindowID winid, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name) + : wxListCtrl(parent, winid, pos, size, style, validator, name) +{ + InsertColumn(0, _("File name"), wxLIST_FORMAT_LEFT, 200); + InsertColumn(1, _("State"), wxLIST_FORMAT_LEFT, 100); + InsertColumn(2, _("Size"), wxLIST_FORMAT_LEFT, 100); + InsertColumn(3, _("Filehash"), wxLIST_FORMAT_LEFT, 100); +} + +#ifndef __WXMSW__ +/* XPM */ +static char * convert_xpm[] = { +"16 16 9 1", +" c None", +". c #B20000", +"+ c #FF0000", +"@ c #FF7F7F", +"# c #008000", +"$ c #33B200", +"% c #10E500", +"& c #59FE4C", +"* c #FFB2B2", +" . ", +" .+. ", +" .+@+. ", +" .+@+. ", +". .+@+.#######", +".. .+@+. #$%%&#", +".+.+@+. #$%%#", +".@+@+. #$%$%#", +".@@+. #$%$#$#", +".*@@+. #$%$# ##", +".......#$%$# #", +" #$%$# ", +" #$%$# ", +" #$%$# ", +" #$# ", +" # "}; +#endif /* ! __WXMSW__ */ + +// Modeless Dialog Implementation +// CPartFileConvertDlg dialog + +BEGIN_EVENT_TABLE(CPartFileConvertDlg, wxDialog) + EVT_BUTTON(IDC_ADDITEM, CPartFileConvertDlg::OnAddFolder) + EVT_BUTTON(IDC_RETRY, CPartFileConvertDlg::RetrySel) + EVT_BUTTON(IDC_CONVREMOVE, CPartFileConvertDlg::RemoveSel) + EVT_BUTTON(wxID_CANCEL, CPartFileConvertDlg::OnCloseButton) + EVT_CLOSE(CPartFileConvertDlg::OnClose) +END_EVENT_TABLE() + +CPartFileConvertDlg::CPartFileConvertDlg(wxWindow* parent) + : wxDialog(parent, -1, _("Import partfiles"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER) +{ + convertDlg(this, true, true); + + m_joblist = CastChild(IDC_JOBLIST, CConvertListCtrl); + m_pb_current = CastChild(IDC_CONV_PB_CURRENT, wxGauge); + + SetIcon(wxICON(convert)); + + // for some reason, if I try to get the mutex from the dialog + // it will end up in a deadlock(?) and I have to kill aMule + CastChild(IDC_RETRY, wxButton)->Enable(false); + CastChild(IDC_CONVREMOVE, wxButton)->Enable(false); +} + +// CPartFileConvertDlg message handlers + +void CPartFileConvertDlg::OnAddFolder(wxCommandEvent& WXUNUSED(event)) +{ + wxString folder = ::wxDirSelector( + _("Please choose a folder to search for temporary downloads! (subfolders will be included)"), + wxStandardPaths::Get().GetDocumentsDir(), wxDD_DEFAULT_STYLE, + wxDefaultPosition, this); + if (!folder.IsEmpty()) { + int reply = wxMessageBox(_("Do you want the source files of succesfully imported downloads be deleted?"), + _("Remove sources?"), + wxYES_NO | wxCANCEL | wxICON_QUESTION, this); + if (reply != wxCANCEL) { + CPartFileConvert::ScanFolderToAdd(CPath(folder), (reply == wxYES)); + } + } +} + +void CPartFileConvertDlg::OnClose(wxCloseEvent& WXUNUSED(event)) +{ + CPartFileConvert::CloseGUI(); +} + +void CPartFileConvertDlg::OnCloseButton(wxCommandEvent& WXUNUSED(event)) +{ + CPartFileConvert::CloseGUI(); +} + +void CPartFileConvertDlg::UpdateJobInfo(ConvertJob* job) +{ + if (!job) { + dynamic_cast(IDC_CURJOB)->GetStaticBox()->SetLabel(_("Waiting...")); + CastChild(IDC_CONV_PROZENT, wxStaticText)->SetLabel(wxEmptyString); + m_pb_current->SetValue(0); + CastChild(IDC_CONV_PB_LABEL, wxStaticText)->SetLabel(wxEmptyString); + return; + } + + wxString buffer; + + // search jobitem in listctrl + long itemnr = m_joblist->FindItem(-1, reinterpret_cast(job)); + if (itemnr != -1) { + m_joblist->SetItem(itemnr, 0, job->filename.IsOk() ? job->folder.GetPrintable() : job->filename.GetPrintable() ); + m_joblist->SetItem(itemnr, 1, CPartFileConvert::GetReturncodeText(job->state) ); + if (job->size > 0) { + buffer = CFormat(_("%s (Disk: %s)")) % CastItoXBytes(job->size) % CastItoXBytes(job->spaceneeded); + m_joblist->SetItem(itemnr, 2, buffer ); + } else { + m_joblist->SetItem(itemnr, 2, wxEmptyString); + } + m_joblist->SetItem(itemnr, 3, job->filehash); + + } else { +// AddJob(job); why??? + } +} + +void CPartFileConvertDlg::RemoveJob(ConvertJob* job) +{ + long itemnr = m_joblist->FindItem(-1, reinterpret_cast(job)); + if (itemnr != -1) { + m_joblist->DeleteItem(itemnr); + } +} + +void CPartFileConvertDlg::AddJob(ConvertJob* job) +{ + long ix = m_joblist->InsertItem(m_joblist->GetItemCount(), job->folder.GetPrintable()); + if (ix != -1) { + m_joblist->SetItemData(ix, reinterpret_cast(job)); + m_joblist->SetItem(ix, 1, CPartFileConvert::GetReturncodeText(job->state)); + } +} + +void CPartFileConvertDlg::RemoveSel(wxCommandEvent& WXUNUSED(event)) +{ + if (m_joblist->GetSelectedItemCount() == 0) return; + + long itemnr = m_joblist->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + while (itemnr != -1) { + ConvertJob* job = (ConvertJob*)m_joblist->GetItemData(itemnr); + if (job->state != CONV_INPROGRESS) { + // this will remove the job from both gui and list + CPartFileConvert::RemoveJob(job); + } + itemnr = m_joblist->GetNextItem(itemnr, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + } +} + +void CPartFileConvertDlg::RetrySel(wxCommandEvent& WXUNUSED(event)) +{ + if (m_joblist->GetSelectedItemCount() == 0) return; + + long itemnr = m_joblist->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + while (itemnr != -1) { + ConvertJob* job = (ConvertJob*)m_joblist->GetItemData(itemnr); + wxMutexLocker lock(CPartFileConvert::s_mutex); + if (job->state != CONV_OK && job->state != CONV_INPROGRESS) { + job->state = CONV_QUEUE; + UpdateJobInfo(job); + } + } + wxMutexLocker lock(CPartFileConvert::s_mutex); + CPartFileConvert::StartThread(); +} + +#endif +// File_checked_for_headers diff --git a/src/PartFileConvert.h b/src/PartFileConvert.h new file mode 100644 index 00000000..f79ac328 --- /dev/null +++ b/src/PartFileConvert.h @@ -0,0 +1,113 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef PARTFILECONVERT_H +#define PARTFILECONVERT_H + +#include +#include +#include + + +#include "Types.h" + +struct ConvertJob; +class CPartFileConvertDlg; +class CPath; + + +class CPartFileConvert : private wxThread +{ +public: + static int ScanFolderToAdd(const CPath& folder, bool deletesource = false); + static void ConvertToeMule(const CPath& file, bool deletesource = false); + static void StartThread(); + static void StopThread(); + + static void ShowGUI(wxWindow *parent); + static void UpdateGUI(float percent, wxString text, bool fullinfo = false); // current file information + static void UpdateGUI(ConvertJob* job); // listcontrol update + static void CloseGUI(); + + static void RemoveAllJobs(); + static void RemoveAllSuccJobs(); + static void RemoveJob(ConvertJob* job); + static wxString GetReturncodeText(int ret); + + static wxMutex s_mutex; + +private: + CPartFileConvert() : wxThread(wxTHREAD_DETACHED) {} + + static int performConvertToeMule(const CPath& file); + virtual ExitCode Entry(); + + static wxThread* s_convertPfThread; + static std::list s_jobs; + static ConvertJob* s_pfconverting; + + static CPartFileConvertDlg* s_convertgui; + +}; + +class CConvertListCtrl : public wxListCtrl +{ +public: + CConvertListCtrl( + wxWindow* parent, + wxWindowID winid = -1, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxLC_ICON, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxT("convertlistctrl")) + ; +}; + +class CPartFileConvertDlg : public wxDialog +{ + friend class CPartFileConvert; +public: + CPartFileConvertDlg(wxWindow *parent); + + void AddJob(ConvertJob* job); + void RemoveJob(ConvertJob* job); + void UpdateJobInfo(ConvertJob* job); + +protected: + wxGauge* m_pb_current; + CConvertListCtrl* m_joblist; + + void OnAddFolder(wxCommandEvent& event); + void OnClose(wxCloseEvent& event); + void OnCloseButton(wxCommandEvent& event); + void RetrySel(wxCommandEvent& event); + void RemoveSel(wxCommandEvent& event); + + DECLARE_EVENT_TABLE() +}; + +#endif /* PARTFILECONVERT_H */ +// File_checked_for_headers diff --git a/src/Preferences.cpp b/src/Preferences.cpp new file mode 100644 index 00000000..8cae99bd --- /dev/null +++ b/src/Preferences.cpp @@ -0,0 +1,1741 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include +#include "Preferences.h" + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "amule.h" +#ifdef HAVE_CONFIG_H + #include "config.h" // Needed for PACKAGE_STRING +#endif + +#include "CFile.h" +#include +#include "Logger.h" +#include // Needed for CFormat +#include // Needed for CTextFile +#include + +#include "UserEvents.h" + +#ifndef AMULE_DAEMON +#include +#include "muuli_wdr.h" +#include "StatisticsDlg.h" +#endif + +#include "RandomFunctions.h" +#include "OtherFunctions.h" + +#define DEFAULT_TCP_PORT 4662 + +// Static variables +COLORREF CPreferences::s_colors[cntStatColors]; +COLORREF CPreferences::s_colors_ref[cntStatColors]; + +CPreferences::CFGMap CPreferences::s_CfgList; +CPreferences::CFGList CPreferences::s_MiscList; + + +/* Proxy */ +CProxyData CPreferences::s_ProxyData; + +/* The rest, organize it! */ +wxString CPreferences::s_nick; +uint16 CPreferences::s_maxupload; +uint16 CPreferences::s_maxdownload; +uint16 CPreferences::s_slotallocation; +wxString CPreferences::s_Addr; +uint16 CPreferences::s_port; +uint16 CPreferences::s_udpport; +bool CPreferences::s_UDPDisable; +uint16 CPreferences::s_maxconnections; +bool CPreferences::s_reconnect; +bool CPreferences::s_autoconnect; +bool CPreferences::s_autoconnectstaticonly; +bool CPreferences::s_UPnPEnabled; +bool CPreferences::s_UPnPECEnabled; +bool CPreferences::s_UPnPWebServerEnabled; +uint16 CPreferences::s_UPnPTCPPort; +bool CPreferences::s_autoserverlist; +bool CPreferences::s_deadserver; +CPath CPreferences::s_incomingdir; +CPath CPreferences::s_tempdir; +bool CPreferences::s_ICH; +uint8 CPreferences::s_depth3D; +bool CPreferences::s_scorsystem; +bool CPreferences::s_mintotray; +bool CPreferences::s_trayiconenabled; +bool CPreferences::s_addnewfilespaused; +bool CPreferences::s_addserversfromserver; +bool CPreferences::s_addserversfromclient; +uint16 CPreferences::s_maxsourceperfile; +uint16 CPreferences::s_trafficOMeterInterval; +uint16 CPreferences::s_statsInterval; +uint32 CPreferences::s_maxGraphDownloadRate; +uint32 CPreferences::s_maxGraphUploadRate; +bool CPreferences::s_confirmExit; +bool CPreferences::s_filterLanIP; +bool CPreferences::s_paranoidfilter; +bool CPreferences::s_IPFilterSys; +bool CPreferences::s_onlineSig; +uint16 CPreferences::s_OSUpdate; +uint64 CPreferences::s_totalDownloadedBytes; +uint64 CPreferences::s_totalUploadedBytes; +wxString CPreferences::s_languageID; +uint8 CPreferences::s_iSeeShares; +uint8 CPreferences::s_iToolDelayTime; +uint8 CPreferences::s_splitterbarPosition; +uint16 CPreferences::s_deadserverretries; +uint32 CPreferences::s_dwServerKeepAliveTimeoutMins; +uint8 CPreferences::s_statsMax; +uint8 CPreferences::s_statsAverageMinutes; +bool CPreferences::s_bpreviewprio; +bool CPreferences::s_smartidcheck; +uint8 CPreferences::s_smartidstate; +bool CPreferences::s_safeServerConnect; +bool CPreferences::s_startMinimized; +uint16 CPreferences::s_MaxConperFive; +bool CPreferences::s_checkDiskspace; +uint32 CPreferences::s_uMinFreeDiskSpace; +wxString CPreferences::s_yourHostname; +bool CPreferences::s_bVerbose; +bool CPreferences::s_bmanualhighprio; +bool CPreferences::s_btransferfullchunks; +bool CPreferences::s_bstartnextfile; +bool CPreferences::s_bstartnextfilesame; +bool CPreferences::s_bshowoverhead; +bool CPreferences::s_bDAP; +bool CPreferences::s_bUAP; +bool CPreferences::s_bDisableKnownClientList; +bool CPreferences::s_bDisableQueueList; +bool CPreferences::s_ShowRatesOnTitle; +wxString CPreferences::s_VideoPlayer; +bool CPreferences::s_moviePreviewBackup; +bool CPreferences::s_indicateratings; +bool CPreferences::s_showAllNotCats; +bool CPreferences::s_msgonlyfriends; +bool CPreferences::s_msgsecure; +uint8 CPreferences::s_filterlevel; +uint8 CPreferences::s_iFileBufferSize; +uint8 CPreferences::s_iQueueSize; +uint16 CPreferences::s_maxmsgsessions; +wxString CPreferences::s_datetimeformat; +wxString CPreferences::s_sWebPassword; +wxString CPreferences::s_sWebLowPassword; +uint16 CPreferences::s_nWebPort; +uint16 CPreferences::s_nWebUPnPTCPPort; +bool CPreferences::s_bWebEnabled; +bool CPreferences::s_bWebUseGzip; +uint32 CPreferences::s_nWebPageRefresh; +bool CPreferences::s_bWebLowEnabled; +wxString CPreferences::s_WebTemplate; +bool CPreferences::s_showCatTabInfos; +uint32 CPreferences::s_allcatType; +uint8 CPreferences::s_NoNeededSources; +bool CPreferences::s_DropFullQueueSources; +bool CPreferences::s_DropHighQueueRankingSources; +uint32 CPreferences::s_HighQueueRanking; +uint32 CPreferences::s_AutoDropTimer; +bool CPreferences::s_AcceptExternalConnections; +wxString CPreferences::s_ECAddr; +uint32 CPreferences::s_ECPort; +wxString CPreferences::s_ECPassword; +bool CPreferences::s_IPFilterClients; +bool CPreferences::s_IPFilterServers; +bool CPreferences::s_UseSrcSeeds; +bool CPreferences::s_ProgBar; +bool CPreferences::s_Percent; +bool CPreferences::s_SecIdent; +bool CPreferences::s_ExtractMetaData; +bool CPreferences::s_AllocFullPart; +bool CPreferences::s_AllocFullChunk; +uint16 CPreferences::s_Browser; +wxString CPreferences::s_CustomBrowser; +bool CPreferences::s_BrowserTab; +CPath CPreferences::s_OSDirectory; +wxString CPreferences::s_Skin; +bool CPreferences::s_UseSkinFiles; +bool CPreferences::s_FastED2KLinksHandler; +bool CPreferences::s_ToolbarOrientation; +bool CPreferences::s_ShowPartFileNumber; +bool CPreferences::s_AICHTrustEveryHash; +wxString CPreferences::s_CommentFilterString; +bool CPreferences::s_IPFilterAutoLoad; +wxString CPreferences::s_IPFilterURL; +CMD4Hash CPreferences::s_userhash; +bool CPreferences::s_MustFilterMessages; +wxString CPreferences::s_MessageFilterString; +bool CPreferences::s_FilterAllMessages; +bool CPreferences::s_FilterComments; +bool CPreferences::s_FilterSomeMessages; +bool CPreferences::s_ShareHiddenFiles; +bool CPreferences::s_AutoSortDownload; +bool CPreferences::s_NewVersionCheck; +bool CPreferences::s_ConnectToKad; +bool CPreferences::s_ConnectToED2K; +unsigned CPreferences::s_maxClientVersions; +bool CPreferences::s_DropSlowSources; +bool CPreferences::s_IsClientCryptLayerSupported; +bool CPreferences::s_bCryptLayerRequested; +bool CPreferences::s_IsClientCryptLayerRequired; +uint32 CPreferences::s_dwKadUDPKey; +uint8 CPreferences::s_byCryptTCPPaddingLength; + +wxString CPreferences::s_Ed2kURL; +wxString CPreferences::s_KadURL; + + +/** + * Template Cfg class for connecting with widgets. + * + * This template provides the base functionionality needed to syncronize a + * variable with a widget. However, please note that wxGenericValidator only + * supports a few types (int, wxString, bool and wxArrayInt), so this template + * can't always be used directly. + * + * Cfg_Str and Cfg_Bool are able to use this template directly, whereas Cfg_Int + * makes use of serveral workaround to enable it to be used with integers other + * than int. + */ +template +class Cfg_Tmpl : public Cfg_Base +{ +public: + /** + * Constructor. + * + * @param keyname + * @param value + * @param defaultVal + */ + Cfg_Tmpl( const wxString& keyname, TYPE& value, const TYPE& defaultVal ) + : Cfg_Base( keyname ), + m_value( value ), + m_default( defaultVal ), + m_widget( NULL ) + {} + +#ifndef AMULE_DAEMON + /** + * Connects the Cfg to a widget. + * + * @param id The ID of the widget to be connected. + * @param parent The parent of the widget. Use this to speed up searches. + * + * This function works by setting the wxValidator of the class. This however + * poses some restrictions on which variable types can be used for this + * template, as noted above. It also poses some limits on the widget types, + * refer to the wx documentation for those. + */ + virtual bool ConnectToWidget( int id, wxWindow* parent = NULL ) + { + if ( id ) { + m_widget = wxWindow::FindWindowById( id, parent ); + + if ( m_widget ) { + wxGenericValidator validator( &m_value ); + + m_widget->SetValidator( validator ); + + return true; + } + } else { + m_widget = NULL; + } + + return false; + } + + + /** Updates the assosiated variable, returning true on success. */ + virtual bool TransferFromWindow() + { + if ( m_widget ) { + wxValidator* validator = m_widget->GetValidator(); + + if ( validator ) { + TYPE temp = m_value; + + if ( validator->TransferFromWindow() ) { + SetChanged( temp != m_value ); + + return true; + } + } + } + + return false; + } + + /** Updates the assosiated widget, returning true on success. */ + virtual bool TransferToWindow() + { + if ( m_widget ) { + wxValidator* validator = m_widget->GetValidator(); + + if ( validator ) + return validator->TransferToWindow(); + } + + return false; + } + +#endif + + /** Sets the default value. */ + void SetDefault(const TYPE& defaultVal) + { + m_default = defaultVal; + } + +protected: + //! Reference to the associated variable + TYPE& m_value; + + //! Default variable value + TYPE m_default; + + //! Pointer to the widget assigned to the Cfg instance + wxWindow* m_widget; +}; + + +/** Cfg class for wxStrings. */ +class Cfg_Str : public Cfg_Tmpl +{ +public: + /** Constructor. */ + Cfg_Str( const wxString& keyname, wxString& value, const wxString& defaultVal = wxEmptyString ) + : Cfg_Tmpl( keyname, value, defaultVal ) + {} + + /** Loads the string, using the specified default value. */ + virtual void LoadFromFile(wxConfigBase* cfg) + { + cfg->Read( GetKey(), &m_value, m_default ); + } + + + /** Saves the string to the specified wxConfig object. */ + virtual void SaveToFile(wxConfigBase* cfg) + { + cfg->Write( GetKey(), m_value ); + } +}; + + +/** + * Cfg-class for encrypting strings, for example for passwords. + */ +class Cfg_Str_Encrypted : public Cfg_Str +{ +public: + Cfg_Str_Encrypted( const wxString& keyname, wxString& value, const wxString& defaultVal = wxEmptyString ) + : Cfg_Str( keyname, value, defaultVal ) + {} + +#ifndef AMULE_DAEMON + virtual bool TransferFromWindow() + { + // Shakraw: when storing value, store it encrypted here (only if changed in prefs) + if ( Cfg_Str::TransferFromWindow() ) { + + // Only recalucate the hash for new, non-empty passwords + if ( HasChanged() && !m_value.IsEmpty() ) { + m_value = MD5Sum( m_value ).GetHash(); + } + + return true; + } + + + return false; + } +#endif +}; + + +/** Cfg class for CPath. */ +class Cfg_Path : public Cfg_Str +{ +public: + /** Constructor. */ + Cfg_Path(const wxString& keyname, CPath& value, const wxString& defaultVal = wxEmptyString ) + : Cfg_Str(keyname, m_temp_path, defaultVal) + , m_real_path(value) + {} + + /** @see Cfg_Str::LoadFromFile. */ + virtual void LoadFromFile(wxConfigBase* cfg) + { + Cfg_Str::LoadFromFile(cfg); + + m_real_path = CPath::FromUniv(m_temp_path); + } + + + /** @see Cfg_Str::SaveToFile. */ + virtual void SaveToFile(wxConfigBase* cfg) + { + m_temp_path = CPath::ToUniv(m_real_path); + + Cfg_Str::SaveToFile(cfg); + } + + + /** @see Cfg_Tmpl::TransferToWindow. */ + virtual bool TransferToWindow() + { + m_temp_path = m_real_path.GetRaw(); + + return Cfg_Str::TransferToWindow(); + } + + /** @see Cfg_Tmpl::TransferFromWindow. */ + virtual bool TransferFromWindow() + { + if (Cfg_Str::TransferFromWindow()) { + m_real_path = CPath(m_temp_path); + return true; + } + + return false; + } + +private: + wxString m_temp_path; + CPath& m_real_path; +}; + + +/** + * Cfg class that takes care of integer types. + * + * This template is needed since wxValidator only supports normals ints, and + * wxConfig for the matter only supports longs, thus some worksarounds are + * needed. + * + * There are two work-arounds: + * 1) wxValidator only supports int*, so we need a immediate variable to act + * as a storage. Thus we use Cfg_Tmpl as base class. Thus this class + * contains a integer which we use to pass the value back and forth + * between the widgets. + * + * 2) wxConfig uses longs to save and read values, thus we need an immediate + * stage when loading and saving the value. + */ +template +class Cfg_Int : public Cfg_Tmpl +{ +public: + Cfg_Int( const wxString& keyname, TYPE& value, int defaultVal = 0 ) + : Cfg_Tmpl( keyname, m_temp_value, defaultVal ), + m_real_value( value ), + m_temp_value( value ) + {} + + + virtual void LoadFromFile(wxConfigBase* cfg) + { + long tmp = 0; + cfg->Read( GetKey(), &tmp, m_default ); + + // Set the temp value + m_temp_value = (int)tmp; + // Set the actual value + m_real_value = (TYPE)tmp; + } + + virtual void SaveToFile(wxConfigBase* cfg) + { + cfg->Write( GetKey(), (long)m_real_value ); + } + + +#ifndef AMULE_DAEMON + virtual bool TransferFromWindow() + { + if ( Cfg_Tmpl::TransferFromWindow() ) { + m_real_value = (TYPE)m_temp_value; + + return true; + } + + return false; + } + + virtual bool TransferToWindow() + { + m_temp_value = (int)m_real_value; + + if ( Cfg_Tmpl::TransferToWindow() ) { + + // In order to let us update labels on slider-changes, we trigger a event + wxSlider *slider = dynamic_cast(m_widget); + if (slider) { + int id = m_widget->GetId(); + int pos = slider->GetValue(); + wxScrollEvent evt( wxEVT_SCROLL_THUMBRELEASE, id, pos ); + m_widget->ProcessEvent( evt ); + } + + return true; + } + + return false; + } +#endif + +protected: + + TYPE& m_real_value; + int m_temp_value; +}; + + +/** + * Helper function for creating new Cfg_Ints. + * + * @param keyname The cfg-key under which the item should be saved. + * @param value The variable to syncronize. The type of this variable defines the type used to create the Cfg_Int. + * @param defaultVal The default value if the key isn't found when loading the value. + * @return A pointer to the new Cfg_Int object. The caller is responsible for deleting it. + * + * This template-function returns a Cfg_Int of the appropriate type for the + * variable used as argument and should be used to avoid having to specify + * the integer type when adding a new Cfg_Int, since that's just increases + * the maintainence burden. + */ +template +Cfg_Base* MkCfg_Int( const wxString& keyname, TYPE& value, int defaultVal ) +{ + return new Cfg_Int( keyname, value, defaultVal ); +} + + +/** + * Cfg-class for bools. + */ +class Cfg_Bool : public Cfg_Tmpl +{ +public: + Cfg_Bool( const wxString& keyname, bool& value, bool defaultVal ) + : Cfg_Tmpl( keyname, value, defaultVal ) + {} + + + virtual void LoadFromFile(wxConfigBase* cfg) + { + cfg->Read( GetKey(), &m_value, m_default ); + } + + virtual void SaveToFile(wxConfigBase* cfg) + { + cfg->Write( GetKey(), m_value ); + } +}; + + +/** + * Cfg-class for uint64s, with no assisiated widgets. + */ +class Cfg_Counter : public Cfg_Base +{ +public: + Cfg_Counter( const wxString& keyname, uint64& value ) + : Cfg_Base( keyname ), + m_value( value ) + {} + + virtual void LoadFromFile(wxConfigBase* cfg) + { + wxString buffer; + + cfg->Read( GetKey(), &buffer, wxT("0") ); + + uint64 tmp = 0; + for (unsigned int i = 0; i < buffer.Length(); ++i) { + if ((buffer[i] >= wxChar('0')) &&(buffer[i] <= wxChar('9'))) { + tmp = tmp * 10 + (buffer[i] - wxChar('0')); + } else { + tmp = 0; + break; + } + } + m_value = tmp; + } + + virtual void SaveToFile(wxConfigBase* cfg) + { + wxString str = CFormat( wxT("%llu") ) % m_value; + + cfg->Write( GetKey(), str ); + } + + +protected: + uint64& m_value; +}; + + +#ifndef AMULE_DAEMON + +typedef struct { + int id; + bool available; + wxString name; +} LangInfo; + + +/** + * The languages aMule has translation for. + * + * Add new languages here, as this list overrides the one defined in muuli.wdr + */ +static LangInfo aMuleLanguages[] = { + { wxLANGUAGE_DEFAULT, true, wxTRANSLATE("System default") }, + { wxLANGUAGE_ARABIC, true, wxTRANSLATE("Arabic") }, + { wxLANGUAGE_BASQUE, true, wxTRANSLATE("Basque") }, + { wxLANGUAGE_BULGARIAN, true, wxTRANSLATE("Bulgarian") }, + { wxLANGUAGE_CATALAN, true, wxTRANSLATE("Catalan") }, + { wxLANGUAGE_CHINESE_SIMPLIFIED, true, wxTRANSLATE("Chinese (Simplified)") }, + { wxLANGUAGE_CHINESE_TRADITIONAL, true, wxTRANSLATE("Chinese (Traditional)") }, + { wxLANGUAGE_CROATIAN, true, wxTRANSLATE("Croatian") }, + { wxLANGUAGE_CZECH, true, wxTRANSLATE("Czech") }, + { wxLANGUAGE_DANISH, true, wxTRANSLATE("Danish") }, + { wxLANGUAGE_DUTCH, true, wxTRANSLATE("Dutch") }, + { wxLANGUAGE_ENGLISH_UK, true, wxTRANSLATE("English (U.K.)") }, +// Unmaintained language file: en_US.po +// { wxLANGUAGE_ENGLISH_US, true, wxTRANSLATE("English (U.S.)") }, + { wxLANGUAGE_ESTONIAN, true, wxTRANSLATE("Estonian") }, + { wxLANGUAGE_FINNISH, true, wxTRANSLATE("Finnish") }, + { wxLANGUAGE_FRENCH, true, wxTRANSLATE("French") }, + { wxLANGUAGE_GALICIAN, true, wxTRANSLATE("Galician") }, + { wxLANGUAGE_GERMAN, true, wxTRANSLATE("German") }, + { wxLANGUAGE_GREEK, true, wxTRANSLATE("Greek") }, + { wxLANGUAGE_HUNGARIAN, true, wxTRANSLATE("Hungarian") }, + { wxLANGUAGE_ITALIAN, true, wxTRANSLATE("Italian") }, + { wxLANGUAGE_ITALIAN_SWISS, true, wxTRANSLATE("Italian (Swiss)") }, + { wxLANGUAGE_JAPANESE, true, wxTRANSLATE("Japanese") }, + { wxLANGUAGE_KOREAN, true, wxTRANSLATE("Korean") }, + { wxLANGUAGE_LITHUANIAN, true, wxTRANSLATE("Lithuanian") }, + { wxLANGUAGE_NORWEGIAN_NYNORSK, true, wxTRANSLATE("Norwegian (Nynorsk)") }, // nn_NO would be the full id + { wxLANGUAGE_POLISH, true, wxTRANSLATE("Polish") }, + { wxLANGUAGE_PORTUGUESE, true, wxTRANSLATE("Portuguese") }, + { wxLANGUAGE_PORTUGUESE_BRAZILIAN, true, wxTRANSLATE("Portuguese (Brazilian)") }, + { wxLANGUAGE_RUSSIAN, true, wxTRANSLATE("Russian") }, + { wxLANGUAGE_SLOVENIAN, true, wxTRANSLATE("Slovenian") }, + { wxLANGUAGE_SPANISH, true, wxTRANSLATE("Spanish") }, + { wxLANGUAGE_SWEDISH, true, wxTRANSLATE("Swedish") }, +// Unmaintained language file: es_MX.po +// { wxLANGUAGE_SPANISH_MEXICAN, true, wxTRANSLATE("Spanish (Mexican)") }, + { wxLANGUAGE_TURKISH, true, wxTRANSLATE("Turkish") }, +// Yet no real support for "custom" +// { wxLANGUAGE_CUSTOM, true, wxTRANSLATE("Custom") }, +}; + + +bool TranslatedSort( const LangInfo& a, const LangInfo& b ) { + return wxStricmp( wxGetTranslation( a.name ), wxGetTranslation( b.name) ) < 0; +} + +typedef Cfg_Int Cfg_PureInt; + +class Cfg_Lang : public Cfg_PureInt +{ +public: + Cfg_Lang() + : Cfg_PureInt( wxEmptyString, m_selection, 0 ) + { + } + + virtual void LoadFromFile(wxConfigBase* WXUNUSED(cfg)) {} + virtual void SaveToFile(wxConfigBase* WXUNUSED(cfg)) {} + + + virtual bool TransferFromWindow() + { + if ( Cfg_PureInt::TransferFromWindow() ) { + // find wx ID of selected language + int i = 0; + while (m_selection > 0) { + i++; + if (aMuleLanguages[i].available) { + m_selection--; + } + } + int id = aMuleLanguages[i].id; + + // save language selection + thePrefs::SetLanguageID(wxLang2Str(id)); + + return true; + } + + return false; + } + + + virtual bool TransferToWindow() + { + // Sort the list after the current locale + std::sort( aMuleLanguages + 1, // Dont include DEFAULT + aMuleLanguages + itemsof(aMuleLanguages), + TranslatedSort ); + + wxChoice *langSelector = dynamic_cast(m_widget); + // clear existing list + langSelector->Clear(); + + m_selection = 0; + int wxId = StrLang2wx(thePrefs::GetLanguageID()); + + // Add all other languages in alphabetical order + // and find the index of the selected language. + for ( unsigned int i = 0, j = 0; i < itemsof(aMuleLanguages); i++) { + if ((aMuleLanguages[i].available = IsLocaleAvailable(aMuleLanguages[i].id)) == true) { + langSelector->Append( wxGetTranslation(aMuleLanguages[i].name) ); + if ( aMuleLanguages[i].id == wxId ) { + m_selection = j; + } + j++; + } + } + + // Restore original locale + { + wxLocale tmpLocale; + InitLocale(tmpLocale, theApp->m_locale.GetLanguage()); + } + + return Cfg_PureInt::TransferToWindow(); + } + + +protected: + int m_selection; +}; + +#endif /* ! AMULE_DAEMON */ + +class Cfg_Skin : public Cfg_Str +{ +public: +// Cfg_Tmpl( const wxString& keyname, TYPE& value, const TYPE& defaultVal ) +// : Cfg_Base( keyname ), +// m_value( value ), +// m_default( defaultVal ), +// m_widget( NULL ) +// {} +// Cfg_Str( const wxString& keyname, wxString& value, const wxString& defaultVal = wxEmptyString ) +// : Cfg_Tmpl( keyname, value, defaultVal ) +// {} + Cfg_Skin( const wxString& keyname, wxString& value, const wxString& defaultVal = wxEmptyString ) + : Cfg_Str( keyname, value, defaultVal ) + { + } + +#ifndef AMULE_DAEMON + virtual bool TransferFromWindow() + { + if ( Cfg_Str::TransferFromWindow() ) { + return true; + } + + return false; + } + + + virtual bool TransferToWindow() + { + + wxChoice *skinSelector = dynamic_cast(m_widget); + skinSelector->Clear(); + + wxString folder; + bool skins = false; + int flags = wxDIR_DIRS; + wxString filespec = wxEmptyString; +//#warning there has to be a better way... + if ( GetKey() == wxT("/SkinGUIOptions/Skin") ) { + folder = wxT("skins"); + skins = true; + flags = wxDIR_FILES; + filespec = wxT("*.zip"); + } else { + folder = wxT("webserver"); + } + wxString dirName(JoinPaths(GetConfigDir(), folder)); + wxString Filename; + wxDir d; + + if (wxDir::Exists(dirName) && + d.Open(dirName) && + d.GetFirst(& Filename, filespec, flags) + ) + { + do + { + if (skins == true) { + Filename = wxT("User:") + Filename; + } + skinSelector->Append(Filename); + } + while (d.GetNext(&Filename)); + } + + wxStandardPathsBase &spb(wxStandardPaths::Get()); +#ifdef __WXMSW__ + wxString dataDir(spb.GetPluginsDir()); +#elif defined(__WXMAC__) + wxString dataDir(spb.GetDataDir()); +#else + wxString dataDir(spb.GetDataDir().BeforeLast(wxT('/')) + wxT("/amule")); +#endif + wxString systemDir(JoinPaths(dataDir,folder)); + + if (wxDir::Exists(systemDir) && + d.Open(systemDir) && + d.GetFirst(& Filename, filespec, flags) + ) + { + do + { + if (skins == true) { + Filename = wxT("System:") + Filename; + } + // avoid duplicates for webserver templates + if (skinSelector->FindString(Filename) == wxNOT_FOUND) { + skinSelector->Append(Filename); + } + } + while (d.GetNext(&Filename)); + } + + if ( skinSelector->GetCount() == 0 ) { + skinSelector->Append(wxT("no options available")); + } + + int id = skinSelector->FindString(m_value); + if ( id == wxNOT_FOUND ) { + id = 0; + } + skinSelector->SetSelection(id); + + return Cfg_Str::TransferToWindow(); + } +#endif /* ! AMULE_DAEMON */ + +}; + + +/// new implementation +CPreferences::CPreferences() +{ + srand( wxGetLocalTimeMillis().GetLo() ); // we need random numbers sometimes + + // load preferences.dat or set standart values + wxString fullpath(theApp->ConfigDir + wxT("preferences.dat")); + CFile preffile; + if (wxFileExists(fullpath)) { + if (preffile.Open(fullpath, CFile::read)) { + try { + preffile.ReadUInt8(); // Version. Value is not used. + s_userhash = preffile.ReadHash(); + } catch (const CSafeIOException& e) { + AddDebugLogLineM(true, logGeneral, + wxT("Error while reading userhash: ") + e.what()); + } + } + } + + if (s_userhash.IsEmpty()) { + for (int i = 0; i < 8; i++) { + RawPokeUInt16(s_userhash.GetHash() + (i * 2), rand()); + } + + Save(); + } + + // Mark hash as an eMule-type hash + // See also CUpDownClient::GetHashType + s_userhash[5] = 14; + s_userhash[14] = 111; + +#ifndef CLIENT_GUI + LoadPreferences(); + ReloadSharedFolders(); + + // serverlist adresses + CTextFile slistfile; + if (slistfile.Open(theApp->ConfigDir + wxT("addresses.dat"), CTextFile::read)) { + adresses_list = slistfile.ReadLines(); + } +#endif +} + +// +// Gets called at init time +// +void CPreferences::BuildItemList( const wxString& appdir ) +{ +#ifndef AMULE_DAEMON + #define NewCfgItem(ID, COMMAND) s_CfgList[ID] = COMMAND +#else + int current_id = 0; + #define NewCfgItem(ID, COMMAND) s_CfgList[++current_id] = COMMAND +#endif /* AMULE_DAEMON */ + + /** + * User settings + **/ + NewCfgItem(IDC_NICK, (new Cfg_Str( wxT("/eMule/Nick"), s_nick, wxT("http://www.aMule.org") ))); +#ifndef AMULE_DAEMON + NewCfgItem(IDC_LANGUAGE, (new Cfg_Lang())); +#endif + + /** + * Misc + **/ + #ifdef __WXMAC__ + int browser = 8; // this is a "magic number" and will break if + // more browser choices are added in the interface, + // but there isn't a symbolic name defined + wxString customBrowser = wxT("/usr/bin/open"); + #else + int browser = 0; + wxString customBrowser; // left empty + #endif + + NewCfgItem(IDC_BROWSER, (MkCfg_Int( wxT("/FakeCheck/Browser"), s_Browser, browser ))); + NewCfgItem(IDC_BROWSERTABS, (new Cfg_Bool( wxT("/FakeCheck/BrowserTab"), s_BrowserTab, true ))); + NewCfgItem(IDC_BROWSERSELF, (new Cfg_Str( wxT("/FakeCheck/CustomBrowser"), s_CustomBrowser, customBrowser ))); + NewCfgItem(IDC_QUEUESIZE, (MkCfg_Int( wxT("/eMule/QueueSizePref"), s_iQueueSize, 50 ))); + + +#ifdef __DEBUG__ + /** + * Debugging + **/ + NewCfgItem(ID_VERBOSEDEBUG, (new Cfg_Bool( wxT("/eMule/VerboseDebug"), s_bVerbose, false ))); +#endif + + /** + * Connection settings + **/ + NewCfgItem(IDC_MAXUP, (MkCfg_Int( wxT("/eMule/MaxUpload"), s_maxupload, 0 ))); + NewCfgItem(IDC_MAXDOWN, (MkCfg_Int( wxT("/eMule/MaxDownload"), s_maxdownload, 0 ))); + NewCfgItem(IDC_SLOTALLOC, (MkCfg_Int( wxT("/eMule/SlotAllocation"), s_slotallocation, 2 ))); + NewCfgItem(IDC_PORT, (MkCfg_Int( wxT("/eMule/Port"), s_port, DEFAULT_TCP_PORT ))); + NewCfgItem(IDC_UDPPORT, (MkCfg_Int( wxT("/eMule/UDPPort"), s_udpport, 4672 ))); + NewCfgItem(IDC_UDPDISABLE, (new Cfg_Bool( wxT("/eMule/UDPDisable"), s_UDPDisable, false ))); + NewCfgItem(IDC_ADDRESS, (new Cfg_Str( wxT("/eMule/Address"), s_Addr, wxEmptyString))); + NewCfgItem(IDC_AUTOCONNECT, (new Cfg_Bool( wxT("/eMule/Autoconnect"), s_autoconnect, true ))); + NewCfgItem(IDC_MAXSOURCEPERFILE, (MkCfg_Int( wxT("/eMule/MaxSourcesPerFile"), s_maxsourceperfile, 300 ))); + NewCfgItem(IDC_MAXCON, (MkCfg_Int( wxT("/eMule/MaxConnections"), s_maxconnections, GetRecommendedMaxConnections() ))); + NewCfgItem(IDC_MAXCON5SEC, (MkCfg_Int( wxT("/eMule/MaxConnectionsPerFiveSeconds"), s_MaxConperFive, 20 ))); + + /** + * Proxy + **/ + NewCfgItem(ID_PROXY_ENABLE_PROXY, (new Cfg_Bool( wxT("/Proxy/ProxyEnableProxy"), s_ProxyData.m_proxyEnable, false ))); + NewCfgItem(ID_PROXY_TYPE, (MkCfg_Int( wxT("/Proxy/ProxyType"), s_ProxyData.m_proxyType, 0 ))); + NewCfgItem(ID_PROXY_NAME, (new Cfg_Str( wxT("/Proxy/ProxyName"), s_ProxyData.m_proxyHostName, wxEmptyString ))); + NewCfgItem(ID_PROXY_PORT, (MkCfg_Int( wxT("/Proxy/ProxyPort"), s_ProxyData.m_proxyPort, 1080 ))); + NewCfgItem(ID_PROXY_ENABLE_PASSWORD, (new Cfg_Bool( wxT("/Proxy/ProxyEnablePassword"), s_ProxyData.m_enablePassword, false ))); + NewCfgItem(ID_PROXY_USER, (new Cfg_Str( wxT("/Proxy/ProxyUser"), s_ProxyData.m_userName, wxEmptyString ))); + NewCfgItem(ID_PROXY_PASSWORD, (new Cfg_Str( wxT("/Proxy/ProxyPassword"), s_ProxyData.m_password, wxEmptyString ))); +// These were copied from eMule config file, maybe someone with windows can complete this? +// NewCfgItem(ID_PROXY_AUTO_SERVER_CONNECT_WITHOUT_PROXY, (new Cfg_Bool( wxT("/Proxy/Proxy????"), s_Proxy????, false ))); + + /** + * Servers + **/ + NewCfgItem(IDC_REMOVEDEAD, (new Cfg_Bool( wxT("/eMule/RemoveDeadServer"), s_deadserver, 1 ))); + NewCfgItem(IDC_SERVERRETRIES, (MkCfg_Int( wxT("/eMule/DeadServerRetry"), s_deadserverretries, 2 ))); + NewCfgItem(IDC_SERVERKEEPALIVE, (MkCfg_Int( wxT("/eMule/ServerKeepAliveTimeout"), s_dwServerKeepAliveTimeoutMins, 0 ))); + NewCfgItem(IDC_RECONN, (new Cfg_Bool( wxT("/eMule/Reconnect"), s_reconnect, true ))); + NewCfgItem(IDC_SCORE, (new Cfg_Bool( wxT("/eMule/Scoresystem"), s_scorsystem, true ))); + NewCfgItem(IDC_AUTOSERVER, (new Cfg_Bool( wxT("/eMule/Serverlist"), s_autoserverlist, false ))); + NewCfgItem(IDC_UPDATESERVERCONNECT, (new Cfg_Bool( wxT("/eMule/AddServersFromServer"), s_addserversfromserver, true))); + NewCfgItem(IDC_UPDATESERVERCLIENT, (new Cfg_Bool( wxT("/eMule/AddServersFromClient"), s_addserversfromclient, true ))); + NewCfgItem(IDC_SAFESERVERCONNECT, (new Cfg_Bool( wxT("/eMule/SafeServerConnect"), s_safeServerConnect, false ))); + NewCfgItem(IDC_AUTOCONNECTSTATICONLY, (new Cfg_Bool( wxT("/eMule/AutoConnectStaticOnly"), s_autoconnectstaticonly, false ))); + NewCfgItem(IDC_UPNP_ENABLED, (new Cfg_Bool( wxT("/eMule/UPnPEnabled"), s_UPnPEnabled, false ))); + NewCfgItem(IDC_UPNPTCPPORT, (MkCfg_Int( wxT("/eMule/UPnPTCPPort"), s_UPnPTCPPort, 50000 ))); + NewCfgItem(IDC_SMARTIDCHECK, (new Cfg_Bool( wxT("/eMule/SmartIdCheck"), s_smartidcheck, true ))); + // Enabled networks + NewCfgItem( IDC_NETWORKKAD, (new Cfg_Bool( wxT("/eMule/ConnectToKad"), s_ConnectToKad, true )) ); + NewCfgItem( IDC_NETWORKED2K, ( new Cfg_Bool( wxT("/eMule/ConnectToED2K"), s_ConnectToED2K, true ) )); + + + /** + * Files + **/ + NewCfgItem(IDC_TEMPFILES, (new Cfg_Path( wxT("/eMule/TempDir"), s_tempdir, appdir + wxT("Temp") ))); + + #if defined(__WXMAC__) || defined(__WINDOWS__) + wxString incpath = wxStandardPaths::Get().GetDocumentsDir(); + if (incpath.IsEmpty()) { + // There is a built-in possibility for this call to fail, though I can't imagine a reason for that. + incpath = appdir + wxT("Incoming"); + } else { + incpath = JoinPaths(incpath, wxT("aMule Downloads")); + } + #else + wxString incpath = appdir + wxT("Incoming"); + #endif + NewCfgItem(IDC_INCFILES, (new Cfg_Path( wxT("/eMule/IncomingDir"), s_incomingdir, incpath ))); + + NewCfgItem(IDC_ICH, (new Cfg_Bool( wxT("/eMule/ICH"), s_ICH, true ))); + NewCfgItem(IDC_AICHTRUST, (new Cfg_Bool( wxT("/eMule/AICHTrust"), s_AICHTrustEveryHash, false ))); + NewCfgItem(IDC_CHECKDISKSPACE, (new Cfg_Bool( wxT("/eMule/CheckDiskspace"), s_checkDiskspace, true ))); + NewCfgItem(IDC_MINDISKSPACE, (MkCfg_Int( wxT("/eMule/MinFreeDiskSpace"), s_uMinFreeDiskSpace, 1 ))); + NewCfgItem(IDC_ADDNEWFILESPAUSED, (new Cfg_Bool( wxT("/eMule/AddNewFilesPaused"), s_addnewfilespaused, false ))); + NewCfgItem(IDC_PREVIEWPRIO, (new Cfg_Bool( wxT("/eMule/PreviewPrio"), s_bpreviewprio, false ))); + NewCfgItem(IDC_MANUALSERVERHIGHPRIO, (new Cfg_Bool( wxT("/eMule/ManualHighPrio"), s_bmanualhighprio, false ))); + NewCfgItem(IDC_FULLCHUNKTRANS, (new Cfg_Bool( wxT("/eMule/FullChunkTransfers"), s_btransferfullchunks, true ))); + NewCfgItem(IDC_STARTNEXTFILE, (new Cfg_Bool( wxT("/eMule/StartNextFile"), s_bstartnextfile, false ))); + NewCfgItem(IDC_STARTNEXTFILE_SAME, (new Cfg_Bool( wxT("/eMule/StartNextFileSameCat"), s_bstartnextfilesame, false ))); + NewCfgItem(IDC_FILEBUFFERSIZE, (MkCfg_Int( wxT("/eMule/FileBufferSizePref"), s_iFileBufferSize, 16 ))); + NewCfgItem(IDC_DAP, (new Cfg_Bool( wxT("/eMule/DAPPref"), s_bDAP, true ))); + NewCfgItem(IDC_UAP, (new Cfg_Bool( wxT("/eMule/UAPPref"), s_bUAP, true ))); + + /** + * Web Server + */ + NewCfgItem(IDC_OSDIR, (new Cfg_Path( wxT("/eMule/OSDirectory"), s_OSDirectory, appdir ))); + NewCfgItem(IDC_ONLINESIG, (new Cfg_Bool( wxT("/eMule/OnlineSignature"), s_onlineSig, false ))); + NewCfgItem(IDC_OSUPDATE, (MkCfg_Int( wxT("/eMule/OnlineSignatureUpdate"), s_OSUpdate, 5 ))); + NewCfgItem(IDC_ENABLE_WEB, (new Cfg_Bool( wxT("/WebServer/Enabled"), s_bWebEnabled, false ))); + NewCfgItem(IDC_WEB_PASSWD, (new Cfg_Str_Encrypted( wxT("/WebServer/Password"), s_sWebPassword ))); + NewCfgItem(IDC_WEB_PASSWD_LOW, (new Cfg_Str_Encrypted( wxT("/WebServer/PasswordLow"), s_sWebLowPassword ))); + NewCfgItem(IDC_WEB_PORT, (MkCfg_Int( wxT("/WebServer/Port"), s_nWebPort, 4711 ))); + NewCfgItem(IDC_WEBUPNPTCPPORT, (MkCfg_Int( wxT("/WebServer/WebUPnPTCPPort"), s_nWebUPnPTCPPort, 50001 ))); + NewCfgItem(IDC_UPNP_WEBSERVER_ENABLED, + (new Cfg_Bool( wxT("/WebServer/UPnPWebServerEnabled"), s_UPnPWebServerEnabled, false ))); + NewCfgItem(IDC_WEB_GZIP, (new Cfg_Bool( wxT("/WebServer/UseGzip"), s_bWebUseGzip, true ))); + NewCfgItem(IDC_ENABLE_WEB_LOW, (new Cfg_Bool( wxT("/WebServer/UseLowRightsUser"), s_bWebLowEnabled, false ))); + NewCfgItem(IDC_WEB_REFRESH_TIMEOUT, (MkCfg_Int( wxT("/WebServer/PageRefreshTime"), s_nWebPageRefresh, 120 ))); + NewCfgItem(IDC_WEBTEMPLATE, (new Cfg_Skin( wxT("/WebServer/Template"), s_WebTemplate, wxEmptyString ))); + + /** + * External Connections + */ + NewCfgItem(IDC_EXT_CONN_ACCEPT, (new Cfg_Bool( wxT("/ExternalConnect/AcceptExternalConnections"), s_AcceptExternalConnections, false ))); + NewCfgItem(IDC_EXT_CONN_IP, (new Cfg_Str( wxT("/ExternalConnect/ECAddress"), s_ECAddr, wxEmptyString ))); + NewCfgItem(IDC_EXT_CONN_TCP_PORT, (MkCfg_Int( wxT("/ExternalConnect/ECPort"), s_ECPort, 4712 ))); + NewCfgItem(IDC_EXT_CONN_PASSWD, (new Cfg_Str_Encrypted( wxT("/ExternalConnect/ECPassword"), s_ECPassword, wxEmptyString ))); + NewCfgItem(IDC_UPNP_EC_ENABLED, (new Cfg_Bool( wxT("/ExternalConnect/UPnPECEnabled"), s_UPnPECEnabled, false ))); + + /** + * GUI behavior + **/ + NewCfgItem(IDC_ENABLETRAYICON, (new Cfg_Bool( wxT("/eMule/EnableTrayIcon"), s_trayiconenabled, false ))); + NewCfgItem(IDC_MINTRAY, (new Cfg_Bool( wxT("/eMule/MinToTray"), s_mintotray, false ))); + NewCfgItem(IDC_EXIT, (new Cfg_Bool( wxT("/eMule/ConfirmExit"), s_confirmExit, false ))); + NewCfgItem(IDC_STARTMIN, (new Cfg_Bool( wxT("/eMule/StartupMinimized"), s_startMinimized, false ))); + + /** + * GUI appearence + **/ + NewCfgItem(IDC_3DDEPTH, (MkCfg_Int( wxT("/eMule/3DDepth"), s_depth3D, 10 ))); + NewCfgItem(IDC_TOOLTIPDELAY, (MkCfg_Int( wxT("/eMule/ToolTipDelay"), s_iToolDelayTime, 1 ))); + NewCfgItem(IDC_SHOWOVERHEAD, (new Cfg_Bool( wxT("/eMule/ShowOverhead"), s_bshowoverhead, false ))); + NewCfgItem(IDC_EXTCATINFO, (new Cfg_Bool( wxT("/eMule/ShowInfoOnCatTabs"), s_showCatTabInfos, false ))); + NewCfgItem(IDC_FED2KLH, (new Cfg_Bool( wxT("/Razor_Preferences/FastED2KLinksHandler"), s_FastED2KLinksHandler, true ))); + NewCfgItem(IDC_PROGBAR, (new Cfg_Bool( wxT("/ExternalConnect/ShowProgressBar"), s_ProgBar, true ))); + NewCfgItem(IDC_PERCENT, (new Cfg_Bool( wxT("/ExternalConnect/ShowPercent"), s_Percent, false ))); + NewCfgItem(IDC_USESKINFILES, (new Cfg_Bool( wxT("/SkinGUIOptions/UseSkinFiles"), s_UseSkinFiles, false ))); + NewCfgItem(IDC_SKIN, (new Cfg_Skin( wxT("/SkinGUIOptions/Skin"), s_Skin, wxEmptyString ))); + NewCfgItem(IDC_SHOWRATEONTITLE, (new Cfg_Bool( wxT("/eMule/ShowRatesOnTitle"), s_ShowRatesOnTitle, false ))); + NewCfgItem(IDC_VERTTOOLBAR, (new Cfg_Bool( wxT("/eMule/VerticalToolbar"), s_ToolbarOrientation, false ))); + NewCfgItem(IDC_SHOWPARTFILENUMBER,(new Cfg_Bool( wxT("/eMule/ShowPartFileNumber"), s_ShowPartFileNumber, false ))); + + /** + * External Apps + */ + NewCfgItem(IDC_VIDEOPLAYER, (new Cfg_Str( wxT("/eMule/VideoPlayer"), s_VideoPlayer, wxEmptyString ))); + NewCfgItem(IDC_VIDEOBACKUP, (new Cfg_Bool( wxT("/eMule/VideoPreviewBackupped"), s_moviePreviewBackup, true ))); + + /** + * Statistics + **/ + NewCfgItem(IDC_SLIDER, (MkCfg_Int( wxT("/eMule/StatGraphsInterval"), s_trafficOMeterInterval, 3 ))); + NewCfgItem(IDC_SLIDER2, (MkCfg_Int( wxT("/eMule/statsInterval"), s_statsInterval, 30 ))); + NewCfgItem(IDC_DOWNLOAD_CAP, (MkCfg_Int( wxT("/eMule/DownloadCapacity"), s_maxGraphDownloadRate, 3 ))); + NewCfgItem(IDC_UPLOAD_CAP, (MkCfg_Int( wxT("/eMule/UploadCapacity"), s_maxGraphUploadRate, 3 ))); + NewCfgItem(IDC_SLIDER3, (MkCfg_Int( wxT("/eMule/StatsAverageMinutes"), s_statsAverageMinutes, 5 ))); + NewCfgItem(IDC_SLIDER4, (MkCfg_Int( wxT("/eMule/VariousStatisticsMaxValue"), s_statsMax, 100 ))); + NewCfgItem(IDC_CLIENTVERSIONS, (MkCfg_Int( wxT("/Statistics/MaxClientVersions"), s_maxClientVersions, 0 ))); + + /** + * Security + **/ + NewCfgItem(IDC_SEESHARES, (MkCfg_Int( wxT("/eMule/SeeShare"), s_iSeeShares, 2 ))); + NewCfgItem(IDC_SECIDENT, (new Cfg_Bool( wxT("/ExternalConnect/UseSecIdent"), s_SecIdent, true ))); + NewCfgItem(IDC_IPFCLIENTS, (new Cfg_Bool( wxT("/ExternalConnect/IpFilterClients"), s_IPFilterClients, true ))); + NewCfgItem(IDC_IPFSERVERS, (new Cfg_Bool( wxT("/ExternalConnect/IpFilterServers"), s_IPFilterServers, true ))); + NewCfgItem(IDC_FILTERLAN, (new Cfg_Bool( wxT("/eMule/FilterLanIPs"), s_filterLanIP, true ))); + NewCfgItem(IDC_PARANOID, (new Cfg_Bool( wxT("/eMule/ParanoidFiltering"), s_paranoidfilter, true ))); + NewCfgItem(IDC_AUTOIPFILTER, (new Cfg_Bool( wxT("/eMule/IPFilterAutoLoad"), s_IPFilterAutoLoad, true ))); + NewCfgItem(IDC_IPFILTERURL, (new Cfg_Str( wxT("/eMule/IPFilterURL"), s_IPFilterURL, wxEmptyString ))); + NewCfgItem(ID_IPFILTERLEVEL, (MkCfg_Int( wxT("/eMule/FilterLevel"), s_filterlevel, 127 ))); + NewCfgItem(IDC_IPFILTERSYS, (new Cfg_Bool( wxT("/eMule/IPFilterSystem"), s_IPFilterSys, false ))); + + /** + * Message Filter + **/ + NewCfgItem(IDC_MSGFILTER, (new Cfg_Bool( wxT("/eMule/FilterMessages"), s_MustFilterMessages, false ))); + NewCfgItem(IDC_MSGFILTER_ALL, (new Cfg_Bool( wxT("/eMule/FilterAllMessages"), s_FilterAllMessages, false ))); + NewCfgItem(IDC_MSGFILTER_NONFRIENDS, (new Cfg_Bool( wxT("/eMule/MessagesFromFriendsOnly"), s_msgonlyfriends, false ))); + NewCfgItem(IDC_MSGFILTER_NONSECURE, (new Cfg_Bool( wxT("/eMule/MessageFromValidSourcesOnly"), s_msgsecure, true ))); + NewCfgItem(IDC_MSGFILTER_WORD, (new Cfg_Bool( wxT("/eMule/FilterWordMessages"), s_FilterSomeMessages, false ))); + NewCfgItem(IDC_MSGWORD, (new Cfg_Str( wxT("/eMule/MessageFilter"), s_MessageFilterString, wxEmptyString ))); + + NewCfgItem(IDC_FILTERCOMMENTS, (new Cfg_Bool( wxT("/eMule/FilterComments"), s_FilterComments, false ))); + NewCfgItem(IDC_COMMENTWORD, (new Cfg_Str( wxT("/eMule/CommentFilter"), s_CommentFilterString, wxEmptyString ))); + + /** + * Hidden files sharing + **/ + NewCfgItem(IDC_SHAREHIDDENFILES, (new Cfg_Bool( wxT("/eMule/ShareHiddenFiles"), s_ShareHiddenFiles, false ))); + + /** + * Auto-Sorting of downloads + **/ + NewCfgItem(IDC_AUTOSORT, (new Cfg_Bool( wxT("/eMule/AutoSortDownloads"), s_AutoSortDownload, false ))); + + /** + * Version check + **/ + NewCfgItem(IDC_NEWVERSION, (new Cfg_Bool( wxT("/eMule/NewVersionCheck"), s_NewVersionCheck, false ))); + + /** + * Obfuscation + **/ + + NewCfgItem( IDC_SUPPORT_PO, ( new Cfg_Bool( wxT("/Obfuscation/IsClientCryptLayerSupported"), s_IsClientCryptLayerSupported, true ))); + NewCfgItem( IDC_ENABLE_PO_OUTGOING, ( new Cfg_Bool( wxT("/Obfuscation/IsCryptLayerRequested"), s_bCryptLayerRequested, true ))); + NewCfgItem( IDC_ENFORCE_PO_INCOMING, ( new Cfg_Bool( wxT("/Obfuscation/IsClientCryptLayerRequired"), s_IsClientCryptLayerRequired, false ))); + // There is no need for GUI items for this two. + s_MiscList.push_back( MkCfg_Int( wxT("/Obfuscation/CryptoPaddingLenght"), s_byCryptTCPPaddingLength, 254 ) ); + s_MiscList.push_back( MkCfg_Int( wxT("/Obfuscation/CryptoKadUDPKey"), s_dwKadUDPKey, GetRandomUint32() ) ); + + /** + * The following doesn't have an associated widget or section + **/ + s_MiscList.push_back( new Cfg_Str( wxT("/eMule/Language"), s_languageID ) ); + s_MiscList.push_back( new Cfg_Counter( wxT("/Statistics/TotalDownloadedBytes"), s_totalDownloadedBytes ) ); + s_MiscList.push_back( new Cfg_Counter( wxT("/Statistics/TotalUploadedBytes"), s_totalUploadedBytes ) ); + s_MiscList.push_back( MkCfg_Int( wxT("/eMule/SplitterbarPosition"), s_splitterbarPosition, 75 ) ); + s_MiscList.push_back( new Cfg_Str( wxT("/eMule/YourHostname"), s_yourHostname, wxEmptyString ) ); + s_MiscList.push_back( new Cfg_Str( wxT("/eMule/DateTimeFormat"), s_datetimeformat, wxT("%A, %x, %X") ) ); + + s_MiscList.push_back( new Cfg_Bool( wxT("/eMule/IndicateRatings"), s_indicateratings, true ) ); + s_MiscList.push_back( MkCfg_Int( wxT("/eMule/AllcatType"), s_allcatType, 0 ) ); + s_MiscList.push_back( new Cfg_Bool( wxT("/eMule/ShowAllNotCats"), s_showAllNotCats, false ) ); + s_MiscList.push_back( new Cfg_Bool( wxT("/eMule/DisableKnownClientList"), s_bDisableKnownClientList, false ) ); + s_MiscList.push_back( new Cfg_Bool( wxT("/eMule/DisableQueueList"), s_bDisableQueueList, false ) ); + s_MiscList.push_back( MkCfg_Int( wxT("/eMule/MaxMessageSessions"), s_maxmsgsessions, 50 ) ); + + s_MiscList.push_back( MkCfg_Int( wxT("/eMule/SmartIdState"), s_smartidstate, 0 ) ); + + s_MiscList.push_back( new Cfg_Bool( wxT("/eMule/DropSlowSources"), s_DropSlowSources, false ) ); + + s_MiscList.push_back( new Cfg_Str( wxT("/eMule/KadNodesUrl"), s_KadURL, wxT("http://emule-inside.net/nodes.dat") ) ); + s_MiscList.push_back( new Cfg_Str( wxT("/eMule/Ed2kServersUrl"), s_Ed2kURL, wxT("http://gruk.org/server.met.gz") ) ); + +#ifndef AMULE_DAEMON + // Colors have been moved from global prefs to CStatisticsDlg + for ( int i = 0; i < cntStatColors; i++ ) { + wxString str = wxString::Format(wxT("/eMule/StatColor%i"),i); + + s_MiscList.push_back( MkCfg_Int( str, CStatisticsDlg::acrStat[i], CStatisticsDlg::acrStat[i] ) ); + } +#endif + + // User events + for (unsigned int i = 0; i < CUserEvents::GetCount(); ++i) { + // We can't use NewCfgItem here, because we need to find these items + // later, which would be impossible in amuled with NewCfgItem. + // The IDs we assign here are high enough to not cause any collision + // even on the daemon. + s_CfgList[USEREVENTS_FIRST_ID + i * USEREVENTS_IDS_PER_EVENT + 1] = new Cfg_Bool(wxT("/UserEvents/") + CUserEvents::GetKey(i) + wxT("/CoreEnabled"), CUserEvents::GetCoreEnableVar(i), false); + s_CfgList[USEREVENTS_FIRST_ID + i * USEREVENTS_IDS_PER_EVENT + 2] = new Cfg_Str(wxT("/UserEvents/") + CUserEvents::GetKey(i) + wxT("/CoreCommand"), CUserEvents::GetCoreCommandVar(i), wxEmptyString); + s_CfgList[USEREVENTS_FIRST_ID + i * USEREVENTS_IDS_PER_EVENT + 3] = new Cfg_Bool(wxT("/UserEvents/") + CUserEvents::GetKey(i) + wxT("/GUIEnabled"), CUserEvents::GetGUIEnableVar(i), false); + s_CfgList[USEREVENTS_FIRST_ID + i * USEREVENTS_IDS_PER_EVENT + 4] = new Cfg_Str(wxT("/UserEvents/") + CUserEvents::GetKey(i) + wxT("/GUICommand"), CUserEvents::GetGUICommandVar(i), wxEmptyString); + } +} + + +void CPreferences::EraseItemList() +{ + while ( s_CfgList.begin() != s_CfgList.end() ) { + delete s_CfgList.begin()->second; + s_CfgList.erase( s_CfgList.begin() ); + } + + CFGList::iterator it = s_MiscList.begin(); + for ( ; it != s_MiscList.end(); ) { + delete *it; + it = s_MiscList.erase( it ); + } +} + + +void CPreferences::LoadAllItems(wxConfigBase* cfg) +{ +#ifndef CLIENT_GUI + // Preserve values from old config. The global config object may not be set yet + // when BuildItemList() is called, so we need to provide defaults later - here. + bool ExecOnCompletion; + wxString ExecOnCompletionCommand; + cfg->Read(wxT("/eMule/ExecOnCompletion"), &ExecOnCompletion, false); + cfg->Read(wxT("/eMule/ExecOnCompletionCommand"), &ExecOnCompletionCommand, wxEmptyString); + // Assign to core command, that's the most likely it was. + static_cast(s_CfgList[USEREVENTS_FIRST_ID + CUserEvents::DownloadCompleted * USEREVENTS_IDS_PER_EVENT + 1])->SetDefault(ExecOnCompletion); + static_cast(s_CfgList[USEREVENTS_FIRST_ID + CUserEvents::DownloadCompleted * USEREVENTS_IDS_PER_EVENT + 2])->SetDefault(ExecOnCompletionCommand); +#endif + CFGMap::iterator it_a = s_CfgList.begin(); + for ( ; it_a != s_CfgList.end(); ++it_a ) { + it_a->second->LoadFromFile( cfg ); + } + + CFGList::iterator it_b = s_MiscList.begin(); + for ( ; it_b != s_MiscList.end(); ++it_b ) { + (*it_b)->LoadFromFile( cfg ); + } + +// Load debug-categories +#ifdef __DEBUG__ + int count = CLogger::GetDebugCategoryCount(); + + for ( int i = 0; i < count; i++ ) { + const CDebugCategory& cat = CLogger::GetDebugCategory( i ); + + bool enabled = false; + cfg->Read( wxT("/Debug/Cat_") + cat.GetName(), &enabled ); + + CLogger::SetEnabled( cat.GetType(), enabled ); + } +#endif + + // Now do some post-processing / sanity checking on the values we just loaded + CheckUlDlRatio(); + SetPort(s_port); + if (s_byCryptTCPPaddingLength > 254) { + s_byCryptTCPPaddingLength = GetRandomUint8() % 254; + } +} + + +void CPreferences::SaveAllItems(wxConfigBase* cfg) +{ + // Save the Cfg values + CFGMap::iterator it_a = s_CfgList.begin(); + for ( ; it_a != s_CfgList.end(); ++it_a ) + it_a->second->SaveToFile( cfg ); + + CFGList::iterator it_b = s_MiscList.begin(); + for ( ; it_b != s_MiscList.end(); ++it_b ) + (*it_b)->SaveToFile( cfg ); + + +// Save debug-categories +#ifdef __DEBUG__ + int count = CLogger::GetDebugCategoryCount(); + + for ( int i = 0; i < count; i++ ) { + const CDebugCategory& cat = CLogger::GetDebugCategory( i ); + + cfg->Write( wxT("/Debug/Cat_") + cat.GetName(), cat.IsEnabled() ); + } +#endif +} + +void CPreferences::SetMaxUpload(uint16 in) +{ + if ( s_maxupload != in ) { + s_maxupload = in; + + // Ensure that the ratio is upheld + CheckUlDlRatio(); + } +} + + +void CPreferences::SetMaxDownload(uint16 in) +{ + if ( s_maxdownload != in ) { + s_maxdownload = in; + + // Ensure that the ratio is upheld + CheckUlDlRatio(); + } +} + + +void CPreferences::UnsetAutoServerStart() +{ + s_autoserverlist = false; +} + + +// Here we slightly limit the users' ability to be a bad citizen: for very low upload rates +// we force a low download rate, so as to discourage this type of leeching. +// We're Open Source, and whoever wants it can do his own mod to get around this, but the +// packaged product will try to enforce good behavior. +// +// Kry note: of course, any leecher mod will be banned asap. +void CPreferences::CheckUlDlRatio() +{ + // Backwards compatibility + if ( s_maxupload == 0xFFFF ) + s_maxupload = UNLIMITED; + + // Backwards compatibility + if ( s_maxdownload == 0xFFFF ) + s_maxdownload = UNLIMITED; + + if ( s_maxupload == UNLIMITED ) + return; + + // Enforce the limits + if ( s_maxupload < 4 ) { + if ( ( s_maxupload * 3 < s_maxdownload ) || ( s_maxdownload == 0 ) ) + s_maxdownload = s_maxupload * 3 ; + } else if ( s_maxupload < 10 ) { + if ( ( s_maxupload * 4 < s_maxdownload ) || ( s_maxdownload == 0 ) ) + s_maxdownload = s_maxupload * 4; + } +} + + +void CPreferences::Save() +{ + wxString fullpath(theApp->ConfigDir + wxT("preferences.dat")); + + CFile preffile; + if (!wxFileExists(fullpath)) { + preffile.Create(fullpath); + } + + if (preffile.Open(fullpath, CFile::read_write)) { + try { + preffile.WriteUInt8(PREFFILE_VERSION); + preffile.WriteHash(s_userhash); + } catch (const CIOFailureException& e) { + AddDebugLogLineM(true, logGeneral, wxT("IO failure while saving user-hash: ") + e.what()); + } + } + + SavePreferences(); + + #ifndef CLIENT_GUI + CTextFile sdirfile; + if (sdirfile.Open(theApp->ConfigDir + wxT("shareddir.dat"), CTextFile::write)) { + for (size_t i = 0; i < shareddir_list.size(); ++i) { + sdirfile.WriteLine(CPath::ToUniv(shareddir_list[i]), wxConvUTF8); + } + + } + #endif +} + + +CPreferences::~CPreferences() +{ + while ( !m_CatList.empty() ) { + delete m_CatList.front(); + m_CatList.erase( m_CatList.begin() ); + } + + m_CatList.clear(); +} + + +int32 CPreferences::GetRecommendedMaxConnections() +{ + int iRealMax = ::GetMaxConnections(); + if(iRealMax == -1 || iRealMax > 520) { + return 500; + } + if(iRealMax < 20) { + return iRealMax; + } + if(iRealMax <= 256) { + return iRealMax - 10; + } + return iRealMax - 20; +} + + +void CPreferences::SavePreferences() +{ + wxConfigBase* cfg = wxConfigBase::Get(); + + cfg->Write( wxT("/eMule/AppVersion"), wxT(VERSION) ); + + // Save the options + SaveAllItems( cfg ); + + // Ensure that the changes are saved to disk. + cfg->Flush(); +} + + +void CPreferences::SaveCats() +{ + if ( GetCatCount() ) { + wxConfigBase* cfg = wxConfigBase::Get(); + + // Save the main cat. + cfg->Write( wxT("/eMule/AllcatType"), (int)s_allcatType); + + // The first category is the default one and should not be counted + + cfg->Write( wxT("/General/Count"), (long)(m_CatList.size() - 1) ); + + for ( size_t i = 1; i < m_CatList.size(); i++ ) { + cfg->SetPath( wxString::Format(wxT("/Cat#%i"), i) ); + + cfg->Write( wxT("Title"), m_CatList[i]->title ); + cfg->Write( wxT("Incoming"), CPath::ToUniv(m_CatList[i]->path) ); + cfg->Write( wxT("Comment"), m_CatList[i]->comment ); + cfg->Write( wxT("Color"), wxString::Format(wxT("%u"), m_CatList[i]->color) ); + cfg->Write( wxT("Priority"), m_CatList[i]->prio ); + } + + cfg->Flush(); + } +} + + +void CPreferences::LoadPreferences() +{ + LoadCats(); +} + + +void CPreferences::LoadCats() +{ + // default cat ... Meow! =(^.^)= + Category_Struct* defaultcat = new Category_Struct; + defaultcat->prio = 0; + defaultcat->color = 0; + + AddCat( defaultcat ); + + wxConfigBase* cfg = wxConfigBase::Get(); + + long max = cfg->Read( wxT("/General/Count"), 0l ); + + for ( int i = 1; i <= max ; i++ ) { + cfg->SetPath( wxString::Format(wxT("/Cat#%i"), i) ); + + Category_Struct* newcat = new Category_Struct; + + newcat->title = cfg->Read( wxT("Title"), wxEmptyString ); + newcat->path = CPath::FromUniv(cfg->Read(wxT("Incoming"), wxEmptyString)); + + // Some sainity checking + if ( newcat->title.IsEmpty() || !newcat->path.IsOk() ) { + printf("Invalid category found, skipping\n"); + + delete newcat; + continue; + } + + newcat->comment = cfg->Read( wxT("Comment"), wxEmptyString ); + newcat->prio = cfg->Read( wxT("Priority"), 0l ); + newcat->color = StrToULong(cfg->Read(wxT("Color"), wxT("0"))); + + AddCat(newcat); + + if (!newcat->path.DirExists()) { + CPath::MakeDir(newcat->path); + } + } +} + + +uint16 CPreferences::GetDefaultMaxConperFive() +{ + return MAXCONPER5SEC; +} + + +uint32 CPreferences::AddCat(Category_Struct* cat) +{ + m_CatList.push_back( cat ); + + return m_CatList.size() - 1; +} + + +void CPreferences::RemoveCat(size_t index) +{ + if ( index < m_CatList.size() ) { + CatList::iterator it = m_CatList.begin() + index; + + delete *it; + + m_CatList.erase( it ); + } +} + + +uint32 CPreferences::GetCatCount() +{ + return m_CatList.size(); +} + + +Category_Struct* CPreferences::GetCategory(size_t index) +{ + wxASSERT( index < m_CatList.size() ); + + return m_CatList[index]; +} + + +const CPath& CPreferences::GetCatPath(uint8 index) +{ + wxASSERT( index < m_CatList.size() ); + + return m_CatList[index]->path; +} + + +uint32 CPreferences::GetCatColor(size_t index) +{ + wxASSERT( index < m_CatList.size() ); + + return m_CatList[index]->color; +} + +Category_Struct *CPreferences::CreateCategory( + const wxString& name, + const CPath& path, + const wxString& comment, + uint32 color, + uint8 prio) +{ + Category_Struct *category = new Category_Struct(); + category->path = path; + category->title = name; + category->comment = comment; + category->color = color; + category->prio = prio; + + AddCat(category); + + SaveCats(); + + return category; +} + +void CPreferences::UpdateCategory( + uint8 cat, + const wxString& name, + const CPath& path, + const wxString& comment, + uint32 color, + uint8 prio) +{ + Category_Struct *category = m_CatList[cat]; + + category->path = path; + category->title = name; + category->comment = comment; + category->color = color; + category->prio = prio; + + SaveCats(); +} + +// Jacobo221 - Several issues on the browsers: +// netscape is named Netscape on some systems +// MozillaFirebird is named mozilla-firebird and also firebird on some systems +// Niether Galeon tabs nor epiphany tabs have been tested +// Konqueror alternatives is (Open on current window, fails if no konq already open): +// dcop `dcop konqueror-* | head -n1` konqueror-mainwindow#1 openURL '%s' +// IMPORTANT: if you add cases to the switches and change the number which +// corresponds to s_CustomBrowser, you must change the default +// set for the Mac in BuildItemList, above. +wxString CPreferences::GetBrowser() +{ + wxString cmd; +#ifndef __WXMSW__ + if( s_BrowserTab ) + switch ( s_Browser ) { + case 0: cmd = wxT("kfmclient exec '%s'"); break; + case 1: cmd = wxT("sh -c \"if ! mozilla -remote 'openURL(%s, new-tab)'; then mozilla '%s'; fi\""); break; + case 2: cmd = wxT("sh -c \"if ! firefox -remote 'openURL(%s, new-tab)'; then firefox '%s'; fi\""); break; + case 3: cmd = wxT("sh -c \"if ! MozillaFirebird -remote 'openURL(%s, new-tab)'; then MozillaFirebird '%s'; fi\""); break; + case 4: cmd = wxT("opera --newpage '%s'"); break; + case 5: cmd = wxT("sh -c \"if ! netscape -remote 'openURLs(%s,new-tab)'; then netscape '%s'; fi\""); break; + case 6: cmd = wxT("galeon -n '%s'"); break; + case 7: cmd = wxT("epiphany -n '%s'"); break; + case 8: cmd = s_CustomBrowser; break; + default: + AddLogLineM( true, _("Unable to determine selected browser!") ); + } + else + switch ( s_Browser ) { + case 0: cmd = wxT("konqueror '%s'"); break; + case 1: cmd = wxT("sh -c 'mozilla %s'"); break; + case 2: cmd = wxT("firefox '%s'"); break; + case 3: cmd = wxT("MozillaFirebird '%s'"); break; + case 4: cmd = wxT("opera '%s'"); break; + case 5: cmd = wxT("netscape '%s'"); break; + case 6: cmd = wxT("galeon '%s'"); break; + case 7: cmd = wxT("epiphany '%s'"); break; + case 8: cmd = s_CustomBrowser; break; + default: + AddLogLineM( true, _("Unable to determine selected browser!") ); + } +#else + switch ( s_Browser ) { + case 0: cmd = wxT(""); break; + case 1: cmd = s_CustomBrowser; break; + default: + AddLogLineM( true, _("Unable to determine selected browser!") ); + } +#endif /* !__WXMSW__ / __WXMSW__ */ + return cmd; +} + + +#include "ClientList.h" +#include "ServerList.h" +void CPreferences::SetIPFilterLevel(uint8 level) +{ + if (level != s_filterlevel) { + // We only need to recheck if the new level is more restrictive + bool filter = level > s_filterlevel; + + // Set the new access-level + s_filterlevel = level; + + if ( filter ) { + theApp->clientlist->FilterQueues(); + theApp->serverlist->FilterServers(); + } + } +} + + +void CPreferences::SetPort(uint16 val) +{ + // Warning: Check for +3, because server UDP is TCP+3 + + if (val +3 > 65535) { + AddLogLineM(true, _("TCP port can't be higher than 65532 due to server UDP socket being TCP+3")); + AddLogLineM(false, wxString::Format(_("Default port will be used (%d)"),DEFAULT_TCP_PORT)); + s_port = DEFAULT_TCP_PORT; + } else { + s_port = val; + } +} + + +void CPreferences::ReloadSharedFolders() +{ +#ifndef CLIENT_GUI + shareddir_list.clear(); + + CTextFile file; + if (file.Open(theApp->ConfigDir + wxT("shareddir.dat"), CTextFile::read)) { + wxArrayString lines = file.ReadLines(txtReadDefault, wxConvUTF8); + + for (size_t i = 0; i < lines.size(); ++i) { + CPath path = CPath::FromUniv(lines[i]); + + if (path.DirExists()) { + shareddir_list.push_back(path); + } else { + printf("Dropping non-existing shared directory: %s\n", + (const char*)unicode2char(path.GetRaw())); + } + } + } +#endif +} + + +bool CPreferences::IsMessageFiltered(const wxString& message) +{ + if (s_FilterAllMessages) { + return true; + } else { + if (s_FilterSomeMessages) { + if (s_MessageFilterString.IsSameAs(wxT("*"))){ + // Filter anything + return true; + } else { + wxStringTokenizer tokenizer( s_MessageFilterString, wxT(",") ); + while (tokenizer.HasMoreTokens()) { + if ( message.Lower().Trim(false).Trim(true).Contains( + tokenizer.GetNextToken().Lower().Trim(false).Trim(true))) { + return true; + } + } + return false; + } + } else { + return false; + } + } +} + + +bool CPreferences::IsCommentFiltered(const wxString& comment) +{ + if (s_FilterComments) { + wxStringTokenizer tokenizer( s_CommentFilterString, wxT(",") ); + while (tokenizer.HasMoreTokens()) { + if ( comment.Lower().Trim(false).Trim(true).Contains( + tokenizer.GetNextToken().Lower().Trim(false).Trim(true))) { + return true; + } + } + } + return false; +} + +// File_checked_for_headers diff --git a/src/Preferences.h b/src/Preferences.h new file mode 100644 index 00000000..65b9e82a --- /dev/null +++ b/src/Preferences.h @@ -0,0 +1,778 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef PREFERENCES_H +#define PREFERENCES_H + +#include "MD4Hash.h" // Needed for CMD4Hash +#include "Color.h" // Needed for COLORREF + +#include // Needed for wxArrayString +#include // Needed for CPath + +#include + +#include "Proxy.h" + +class CPreferences; +class wxConfigBase; +class wxWindow; + + +enum EViewSharedFilesAccess{ + vsfaEverybody = 0, + vsfaFriends = 1, + vsfaNobody = 2 +}; + +struct Category_Struct +{ + CPath path; + wxString title; + wxString comment; + uint32 color; + uint8 prio; +}; + + +/** + * Base-class for automatically loading and saving of preferences. + * + * The purpose of this class is to perform two tasks: + * 1) To load and save a variable using wxConfig + * 2) If nescecarry, to syncronize it with a widget + * + * This pure-virtual class servers as the base of all the Cfg types + * defined below, and exposes the entire interface. + * + * Please note that for reasons of simplicity these classes dont provide + * direct access to the variables they maintain, as there is no real need + * for this. + * + * To create a sub-class you need only provide the Load/Save functionality, + * as it is given that not all variables have a widget assosiated. + */ +class Cfg_Base +{ +public: + /** + * Constructor. + * + * @param keyname This is the keyname under which the variable is to be saved. + */ + Cfg_Base( const wxString& keyname ) + : m_key( keyname ), + m_changed( false ) + {} + + /** + * Destructor. + */ + virtual ~Cfg_Base() {} + + /** + * This function loads the assosiated variable from the provided config object. + */ + virtual void LoadFromFile(wxConfigBase* cfg) = 0; + /** + * This function saves the assosiated variable to the provided config object. + */ + virtual void SaveToFile(wxConfigBase* cfg) = 0; + + /** + * Syncs the variable with the contents of the widget. + * + * @return True of success, false otherwise. + */ + virtual bool TransferFromWindow() { return false; } + /** + * Syncs the widget with the contents of the variable. + * + * @return True of success, false otherwise. + */ + virtual bool TransferToWindow() { return false; } + + /** + * Connects a widget with the specified ID to the Cfg object. + * + * @param id The ID of the widget. + * @param parent A pointer to the widgets parent, to speed up searches. + * @return True on success, false otherwise. + * + * This function only makes sense for Cfg-classes that have the capability + * to interact with a widget, see Cfg_Tmpl::ConnectToWidget(). + */ + virtual bool ConnectToWidget( int WXUNUSED(id), wxWindow* WXUNUSED(parent) = NULL ) { return false; } + + /** + * Gets the key assosiated with Cfg object. + * + * @return The config-key of this object. + */ + virtual const wxString& GetKey() { return m_key; } + + + /** + * Specifies if the variable has changed since the TransferFromWindow() call. + * + * @return True if the variable has changed, false otherwise. + */ + virtual bool HasChanged() { return m_changed; } + + +protected: + /** + * Sets the changed status. + * + * @param changed The new status. + */ + virtual void SetChanged( bool changed ) + { + m_changed = changed; + }; + +private: + + //! The Config-key under which to save the variable + wxString m_key; + + //! The changed-status of the variable + bool m_changed; +}; + + + +const int cntStatColors = 15; + + +//! This typedef is a shortcut similar to the theApp shortcut, but uses :: instead of . +//! It only allows access to static preference functions, however this is to be desired anyway. +typedef CPreferences thePrefs; + + +class CPreferences +{ +public: + friend class PrefsUnifiedDlg; + + CPreferences(); + ~CPreferences(); + + void Save(); + void SaveCats(); + void ReloadSharedFolders(); + + static bool Score() { return s_scorsystem; } + static void SetScoreSystem(bool val) { s_scorsystem = val; } + static bool Reconnect() { return s_reconnect; } + static void SetReconnect(bool val) { s_reconnect = val; } + static bool DeadServer() { return s_deadserver; } + static void SetDeadServer(bool val) { s_deadserver = val; } + static const wxString& GetUserNick() { return s_nick; } + static void SetUserNick(const wxString& nick) { s_nick = nick; } + + static const wxString& GetAddress() { return s_Addr; } + static uint16 GetPort() { return s_port; } + static void SetPort(uint16 val); + static uint16 GetUDPPort() { return s_udpport; } + static uint16 GetEffectiveUDPPort() { return s_UDPDisable ? 0 : s_udpport; } + static void SetUDPPort(uint16 val) { s_udpport = val; } + static bool IsUDPDisabled() { return s_UDPDisable; } + static void SetUDPDisable(bool val) { s_UDPDisable = val; } + static const CPath& GetIncomingDir() { return s_incomingdir; } + static void SetIncomingDir(const CPath& dir){ s_incomingdir = dir; } + static const CPath& GetTempDir() { return s_tempdir; } + static void SetTempDir(const CPath& dir) { s_tempdir = dir; } + static const CMD4Hash& GetUserHash() { return s_userhash; } + static void SetUserHash(const CMD4Hash& h) { s_userhash = h; } + static uint16 GetMaxUpload() { return s_maxupload; } + static uint16 GetSlotAllocation() { return s_slotallocation; } + static bool IsICHEnabled() { return s_ICH; } + static void SetICHEnabled(bool val) { s_ICH = val; } + static bool IsTrustingEveryHash() { return s_AICHTrustEveryHash; } + static void SetTrustingEveryHash(bool val) { s_AICHTrustEveryHash = val; } + static bool AutoServerlist() { return s_autoserverlist; } + static void SetAutoServerlist(bool val) { s_autoserverlist = val; } + static bool DoMinToTray() { return s_mintotray; } + static void SetMinToTray(bool val) { s_mintotray = val; } + static bool UseTrayIcon() { return s_trayiconenabled; } + static void SetUseTrayIcon(bool val) { s_trayiconenabled = val; } + static bool DoAutoConnect() { return s_autoconnect; } + static void SetAutoConnect(bool inautoconnect) + {s_autoconnect = inautoconnect; } + static bool AddServersFromServer() { return s_addserversfromserver; } + static void SetAddServersFromServer(bool val) { s_addserversfromserver = val; } + static bool AddServersFromClient() { return s_addserversfromclient; } + static void SetAddServersFromClient(bool val) { s_addserversfromclient = val; } + static uint16 GetTrafficOMeterInterval() { return s_trafficOMeterInterval; } + static void SetTrafficOMeterInterval(uint16 in) + { s_trafficOMeterInterval = in; } + static uint16 GetStatsInterval() { return s_statsInterval;} + static void SetStatsInterval(uint16 in) { s_statsInterval = in; } + static void Add2TotalDownloaded(uint64 in) { s_totalDownloadedBytes += in; } + static void Add2TotalUploaded(uint64 in) { s_totalUploadedBytes += in; } + static uint64 GetTotalDownloaded() { return s_totalDownloadedBytes; } + static uint64 GetTotalUploaded() { return s_totalUploadedBytes; } + static bool IsConfirmExitEnabled() { return s_confirmExit; } + static bool FilterLanIPs() { return s_filterLanIP; } + static void SetFilterLanIPs(bool val) { s_filterLanIP = val; } + static bool ParanoidFilter() { return s_paranoidfilter; } + static void SetParanoidFilter(bool val) { s_paranoidfilter = val; } + static bool IsOnlineSignatureEnabled() { return s_onlineSig; } + static void SetOnlineSignatureEnabled(bool val) { s_onlineSig = val; } + static uint32 GetMaxGraphUploadRate() { return s_maxGraphUploadRate; } + static uint32 GetMaxGraphDownloadRate() { return s_maxGraphDownloadRate; } + static void SetMaxGraphUploadRate(uint32 in){ s_maxGraphUploadRate=in; } + static void SetMaxGraphDownloadRate(uint32 in) + { s_maxGraphDownloadRate = in; } + + static uint16 GetMaxDownload() { return s_maxdownload; } + static uint16 GetMaxConnections() { return s_maxconnections; } + static uint16 GetMaxSourcePerFile() { return s_maxsourceperfile; } + static uint16 GetMaxSourcePerFileSoft() { + uint16 temp = (uint16)(s_maxsourceperfile*0.9); + if( temp > 1000 ) return 1000; + return temp; } + static uint16 GetMaxSourcePerFileUDP() { + uint16 temp = (uint16)(s_maxsourceperfile*0.75); + if( temp > 100 ) return 100; + return temp; } + static uint16 GetDeadserverRetries() { return s_deadserverretries; } + static void SetDeadserverRetries(uint16 val) { s_deadserverretries = val; } + static uint32 GetServerKeepAliveTimeout() { return s_dwServerKeepAliveTimeoutMins*60000; } + static void SetServerKeepAliveTimeout(uint32 val) { s_dwServerKeepAliveTimeoutMins = val/60000; } + + static const wxString& GetLanguageID() { return s_languageID; } + static void SetLanguageID(const wxString& new_id) { s_languageID = new_id; } + static uint8 CanSeeShares() { return s_iSeeShares; } + static void SetCanSeeShares(uint8 val) { s_iSeeShares = val; } + + static uint8 GetStatsMax() { return s_statsMax; } + static bool UseFlatBar() { return (s_depth3D==0); } + static uint8 GetStatsAverageMinutes() { return s_statsAverageMinutes; } + static void SetStatsAverageMinutes(uint8 in){ s_statsAverageMinutes = in; } + + static bool GetStartMinimized() { return s_startMinimized; } + static void SetStartMinimized(bool instartMinimized) + { s_startMinimized = instartMinimized;} + static bool GetSmartIdCheck() { return s_smartidcheck; } + static void SetSmartIdCheck( bool in_smartidcheck ) + { s_smartidcheck = in_smartidcheck; } + static uint8 GetSmartIdState() { return s_smartidstate; } + static void SetSmartIdState( uint8 in_smartidstate ) + { s_smartidstate = in_smartidstate; } + static bool GetVerbose() { return s_bVerbose; } + static void SetVerbose(bool val) { s_bVerbose = val; } + static bool GetPreviewPrio() { return s_bpreviewprio; } + static void SetPreviewPrio(bool in) { s_bpreviewprio = in; } + static bool TransferFullChunks() { return s_btransferfullchunks; } + static void SetTransferFullChunks( bool m_bintransferfullchunks ) + {s_btransferfullchunks = m_bintransferfullchunks; } + static bool StartNextFile() { return s_bstartnextfile; } + static bool StartNextFileSame() { return s_bstartnextfilesame; } + static void SetStartNextFile(bool val) { s_bstartnextfile = val; } + static void SetStartNextFileSame(bool val) { s_bstartnextfilesame = val; } + static bool ShowOverhead() { return s_bshowoverhead; } + static void SetNewAutoUp(bool m_bInUAP) { s_bUAP = m_bInUAP; } + static bool GetNewAutoUp() { return s_bUAP; } + static void SetNewAutoDown(bool m_bInDAP) { s_bDAP = m_bInDAP; } + static bool GetNewAutoDown() { return s_bDAP; } + + static const wxString& GetVideoPlayer() { return s_VideoPlayer; } + + static uint32 GetFileBufferSize() { return s_iFileBufferSize*15000; } + static void SetFileBufferSize(uint32 val) { s_iFileBufferSize = val/15000; } + static uint32 GetQueueSize() { return s_iQueueSize*100; } + static void SetQueueSize(uint32 val) { s_iQueueSize = val/100; } + + static uint8 Get3DDepth() { return s_depth3D;} + static bool AddNewFilesPaused() { return s_addnewfilespaused; } + static void SetAddNewFilesPaused(bool val) { s_addnewfilespaused = val; } + + static void SetMaxConsPerFive(int in) { s_MaxConperFive=in; } + + static uint16 GetMaxConperFive() { return s_MaxConperFive; } + static uint16 GetDefaultMaxConperFive(); + + static bool IsSafeServerConnectEnabled() { return s_safeServerConnect; } + static void SetSafeServerConnectEnabled(bool val) { s_safeServerConnect = val; } + static bool IsMoviePreviewBackup() { return s_moviePreviewBackup; } + + static bool IsCheckDiskspaceEnabled() { return s_checkDiskspace; } + static void SetCheckDiskspaceEnabled(bool val) { s_checkDiskspace = val; } + static uint32 GetMinFreeDiskSpace() { return s_uMinFreeDiskSpace; } + static void SetMinFreeDiskSpace(uint32 val) { s_uMinFreeDiskSpace = val; } + + static const wxString& GetYourHostname() { return s_yourHostname; } + static void SetYourHostname(const wxString& s) { s_yourHostname = s; } + + static void SetMaxUpload(uint16 in); + static void SetMaxDownload(uint16 in); + static void SetSlotAllocation(uint16 in) { s_slotallocation = in; }; + + typedef std::vector PathList; + PathList shareddir_list; + + wxArrayString adresses_list; + + static bool AutoConnectStaticOnly() { return s_autoconnectstaticonly; } + static void SetAutoConnectStaticOnly(bool val) { s_autoconnectstaticonly = val; } + static bool GetUPnPEnabled() { return s_UPnPEnabled; } + static void SetUPnPEnabled(bool val) { s_UPnPEnabled = val; } + static bool GetUPnPECEnabled() { return s_UPnPECEnabled; } + static void SetUPnPECEnabled(bool val) { s_UPnPECEnabled = val; } + static bool GetUPnPWebServerEnabled() { return s_UPnPWebServerEnabled; } + static void SetUPnPWebServerEnabled(bool val){ s_UPnPWebServerEnabled = val; } + static uint16 GetUPnPTCPPort() { return s_UPnPTCPPort; } + static void SetUPnPTCPPort(uint16 val) { s_UPnPTCPPort = val; } + static bool IsManualHighPrio() { return s_bmanualhighprio; } + static void SetManualHighPrio(bool val) { s_bmanualhighprio = val; } + void LoadCats(); + static const wxString& GetDateTimeFormat() { return s_datetimeformat; } + // Download Categories + uint32 AddCat(Category_Struct* cat); + void RemoveCat(size_t index); + uint32 GetCatCount(); + Category_Struct* GetCategory(size_t index); + const CPath& GetCatPath(uint8 index); + uint32 GetCatColor(size_t index); + Category_Struct *CreateCategory(const wxString& name, const CPath& path, + const wxString& comment, uint32 color, uint8 prio); + void UpdateCategory(uint8 cat, const wxString& name, const CPath& path, + const wxString& comment, uint32 color, uint8 prio); + + static uint32 GetAllcatType() { return s_allcatType; } + static void SetAllcatType(uint32 in) { s_allcatType = in; } + static bool ShowAllNotCats() { return s_showAllNotCats; } + + // WebServer + static uint16 GetWSPort() { return s_nWebPort; } + static void SetWSPort(uint16 uPort) { s_nWebPort=uPort; } + static uint16 GetWebUPnPTCPPort() { return s_nWebUPnPTCPPort; } + static void SetWebUPnPTCPPort(uint16 val) { s_nWebUPnPTCPPort = val; } + static const wxString& GetWSPass() { return s_sWebPassword; } + static void SetWSPass(const wxString& pass) { s_sWebPassword = pass; } + static bool GetWSIsEnabled() { return s_bWebEnabled; } + static void SetWSIsEnabled(bool bEnable) { s_bWebEnabled=bEnable; } + static bool GetWebUseGzip() { return s_bWebUseGzip; } + static void SetWebUseGzip(bool bUse) { s_bWebUseGzip=bUse; } + static uint32 GetWebPageRefresh() { return s_nWebPageRefresh; } + static void SetWebPageRefresh(uint32 nRefresh) { s_nWebPageRefresh=nRefresh; } + static bool GetWSIsLowUserEnabled() { return s_bWebLowEnabled; } + static void SetWSIsLowUserEnabled(bool in) { s_bWebLowEnabled=in; } + static const wxString& GetWSLowPass() { return s_sWebLowPassword; } + static void SetWSLowPass(const wxString& pass) { s_sWebLowPassword = pass; } + static const wxString& GetWebTemplate() { return s_WebTemplate; } + static void SetWebTemplate(const wxString& val) { s_WebTemplate = val; } + + static void SetMaxSourcesPerFile(uint16 in) { s_maxsourceperfile=in;} + static void SetMaxConnections(uint16 in) { s_maxconnections =in;} + + static bool ShowCatTabInfos() { return s_showCatTabInfos; } + static void ShowCatTabInfos(bool in) { s_showCatTabInfos=in; } + + // Sources Dropping Tweaks + static bool DropNoNeededSources() { return s_NoNeededSources > 0; } + static bool SwapNoNeededSources() { return s_NoNeededSources == 2; } + static uint8 GetNoNeededSources() { return s_NoNeededSources; } + static void SetNoNeededSources(uint8 val) { s_NoNeededSources = val; } + static bool DropFullQueueSources() { return s_DropFullQueueSources; } + static void SetDropFullQueueSources(bool val) { s_DropFullQueueSources = val; } + static bool DropHighQueueRankingSources() { return s_DropHighQueueRankingSources; } + static void SetDropHighQueueRankingSources(bool val) { s_DropHighQueueRankingSources = val; } + static uint32 HighQueueRanking() { return s_HighQueueRanking; } + static void SetHighQueueRanking(uint32 val) { s_HighQueueRanking = val; } + static uint32 GetAutoDropTimer() { return s_AutoDropTimer; } + static void SetAutoDropTimer(uint32 val) { s_AutoDropTimer = val; } + + // External Connections + static bool AcceptExternalConnections() { return s_AcceptExternalConnections; } + static void EnableExternalConnections( bool val ) { s_AcceptExternalConnections = val; } + static const wxString& GetECAddress() { return s_ECAddr; } + static uint32 ECPort() { return s_ECPort; } + static void SetECPort(uint32 val) { s_ECPort = val; } + static const wxString& ECPassword() { return s_ECPassword; } + static void SetECPass(const wxString& pass) { s_ECPassword = pass; } + // Fast ED2K Links Handler Toggling + static bool GetFED2KLH() { return s_FastED2KLinksHandler; } + + // Ip filter + static bool IsFilteringClients() { return s_IPFilterClients; } + static void SetFilteringClients(bool val) { s_IPFilterClients = val; } + static bool IsFilteringServers() { return s_IPFilterServers; } + static void SetFilteringServers(bool val) { s_IPFilterServers = val; } + static uint8 GetIPFilterLevel() { return s_filterlevel;} + static void SetIPFilterLevel(uint8 level); + static bool IPFilterAutoLoad() { return s_IPFilterAutoLoad; } + static void SetIPFilterAutoLoad(bool val) { s_IPFilterAutoLoad = val; } + static const wxString& IPFilterURL() { return s_IPFilterURL; } + static void SetIPFilterURL(const wxString& url) { s_IPFilterURL = url; } + static bool UseIPFilterSystem() { return s_IPFilterSys; } + static void SetIPFilterSystem(bool val) { s_IPFilterSys = val; } + + // Source seeds On/Off + static bool GetSrcSeedsOn() { return s_UseSrcSeeds; } + static void SetSrcSeedsOn(bool val) { s_UseSrcSeeds = val; } + + static bool IsSecureIdentEnabled() { return s_SecIdent; } + static void SetSecureIdentEnabled(bool val) { s_SecIdent = val; } + + static bool GetExtractMetaData() { return s_ExtractMetaData; } + static void SetExtractMetaData(bool val) { s_ExtractMetaData = val; } + + static bool ShowProgBar() { return s_ProgBar; } + static bool ShowPercent() { return s_Percent; } + + static bool GetAllocFullPart() { return s_AllocFullPart; }; + static void SetAllocFullPart(bool val) { s_AllocFullPart = val; } + static bool GetAllocFullChunk() { return s_AllocFullChunk; }; + static void SetAllocFullChunk(bool val) { s_AllocFullChunk = val; } + + static wxString GetBrowser(); + + static const wxString& GetSkin() { return s_Skin; } + + static bool UseSkins() { return s_UseSkinFiles; } + + static bool VerticalToolbar() { return s_ToolbarOrientation; } + + static bool ShowPartFileNumber() { return s_ShowPartFileNumber; } + + static const CPath& GetOSDir() { return s_OSDirectory; } + static uint16 GetOSUpdate() { return s_OSUpdate; } + + static uint8 GetToolTipDelay() { return s_iToolDelayTime; } + + static void UnsetAutoServerStart(); + static void CheckUlDlRatio(); + + static void BuildItemList( const wxString& appdir ); + static void EraseItemList(); + + static void LoadAllItems(wxConfigBase* cfg); + static void SaveAllItems(wxConfigBase* cfg); + + static bool GetShowRatesOnTitle() { return s_ShowRatesOnTitle; } + + // Message Filters + + static bool MustFilterMessages() { return s_MustFilterMessages; } + static void SetMustFilterMessages(bool val) { s_MustFilterMessages = val; } + static bool IsFilterAllMessages() { return s_FilterAllMessages; } + static void SetFilterAllMessages(bool val) { s_FilterAllMessages = val; } + static bool MsgOnlyFriends() { return s_msgonlyfriends;} + static void SetMsgOnlyFriends(bool val) { s_msgonlyfriends = val; } + static bool MsgOnlySecure() { return s_msgsecure;} + static void SetMsgOnlySecure(bool val) { s_msgsecure = val; } + static bool IsFilterByKeywords() { return s_FilterSomeMessages; } + static void SetFilterByKeywords(bool val) { s_FilterSomeMessages = val; } + static const wxString& GetMessageFilterString() { return s_MessageFilterString; } + static void SetMessageFilterString(const wxString& val) { s_MessageFilterString = val; } + static bool IsMessageFiltered(const wxString& message); + + static bool FilterComments() { return s_FilterComments; } + static void SetFilterComments(bool val) { s_FilterComments = val; } + static const wxString& GetCommentFilterString() { return s_CommentFilterString; } + static void SetCommentFilterString(const wxString& val) { s_CommentFilterString = val; } + static bool IsCommentFiltered(const wxString& comment); + + // Can't have it return a reference, will need a pointer later. + static const CProxyData *GetProxyData() { return &s_ProxyData; } + + // Hidden files + + static bool ShareHiddenFiles() { return s_ShareHiddenFiles; } + + static bool AutoSortDownload() { return s_AutoSortDownload; } + + // Version check + + static bool CheckNewVersion() { return s_NewVersionCheck; } + + // Networks + static bool GetNetworkKademlia() { return s_ConnectToKad; } + static void SetNetworkKademlia(bool val) { s_ConnectToKad = val; } + static bool GetNetworkED2K() { return s_ConnectToED2K; } + static void SetNetworkED2K(bool val) { s_ConnectToED2K = val; } + + // Statistics + static unsigned GetMaxClientVersions() { return s_maxClientVersions; } + + // Dropping slow sources + static bool GetDropSlowSources() { return s_DropSlowSources; } + + // server.met and nodes.dat urls + static const wxString& GetKadNodesUrl() { return s_KadURL; } + static void SetKadNodesUrl(const wxString& url) { s_KadURL = url; } + + static const wxString& GetEd2kServersUrl() { return s_Ed2kURL; } + static void SetEd2kServersUrl(const wxString& url) { s_Ed2kURL = url; } + + // Crypt + static bool IsClientCryptLayerSupported() {return s_IsClientCryptLayerSupported;} + static bool IsClientCryptLayerRequested() {return IsClientCryptLayerSupported() && s_bCryptLayerRequested;} + static bool IsClientCryptLayerRequired() {return IsClientCryptLayerRequested() && s_IsClientCryptLayerRequired;} + static bool IsClientCryptLayerRequiredStrict() {return false;} // not even incoming test connections will be answered + static bool IsServerCryptLayerUDPEnabled() {return IsClientCryptLayerSupported();} + static bool IsServerCryptLayerTCPRequested() {return IsClientCryptLayerRequested();} + static bool IsServerCryptLayerTCPRequired() {return IsClientCryptLayerRequired();} + static uint32 GetKadUDPKey() {return s_dwKadUDPKey;} + static uint8 GetCryptTCPPaddingLength() {return s_byCryptTCPPaddingLength;} + + static void SetClientCryptLayerSupported(bool v) {s_IsClientCryptLayerSupported = v;} + static void SetClientCryptLayerRequested(bool v) {s_bCryptLayerRequested = v; } + static void SetClientCryptLayerRequired(bool v) {s_IsClientCryptLayerRequired = v;} + +protected: + static int32 GetRecommendedMaxConnections(); + + //! Temporary storage for statistic-colors. + static COLORREF s_colors[cntStatColors]; + //! Reference for checking if the colors has changed. + static COLORREF s_colors_ref[cntStatColors]; + + typedef std::vector CFGList; + typedef std::map CFGMap; + typedef std::vector CatList; + + + static CFGMap s_CfgList; + static CFGList s_MiscList; + CatList m_CatList; + +private: + void LoadPreferences(); + void SavePreferences(); + +protected: +////////////// USER + static wxString s_nick; + + static CMD4Hash s_userhash; + +////////////// CONNECTION + static uint16 s_maxupload; + static uint16 s_maxdownload; + static uint16 s_slotallocation; + static wxString s_Addr; + static uint16 s_port; + static uint16 s_udpport; + static bool s_UDPDisable; + static uint16 s_maxconnections; + static bool s_reconnect; + static bool s_autoconnect; + static bool s_autoconnectstaticonly; + static bool s_UPnPEnabled; + static bool s_UPnPECEnabled; + static bool s_UPnPWebServerEnabled; + static uint16 s_UPnPTCPPort; + +////////////// PROXY + static CProxyData s_ProxyData; + +////////////// SERVERS + static bool s_autoserverlist; + static bool s_deadserver; + +////////////// FILES + static CPath s_incomingdir; + static CPath s_tempdir; + static bool s_ICH; + static bool s_AICHTrustEveryHash; + +////////////// GUI + static uint8 s_depth3D; + + static bool s_scorsystem; + static bool s_mintotray; + static bool s_trayiconenabled; + static bool s_addnewfilespaused; + static bool s_addserversfromserver; + static bool s_addserversfromclient; + static uint16 s_maxsourceperfile; + static uint16 s_trafficOMeterInterval; + static uint16 s_statsInterval; + static uint32 s_maxGraphDownloadRate; + static uint32 s_maxGraphUploadRate; + static bool s_confirmExit; + + + static bool s_filterLanIP; + static bool s_paranoidfilter; + static bool s_onlineSig; + + static uint64 s_totalDownloadedBytes; + static uint64 s_totalUploadedBytes; + static wxString s_languageID; + static uint8 s_iSeeShares; // 0=everybody 1=friends only 2=noone + static uint8 s_iToolDelayTime; // tooltip delay time in seconds + static uint8 s_splitterbarPosition; + static uint16 s_deadserverretries; + static uint32 s_dwServerKeepAliveTimeoutMins; + + static uint8 s_statsMax; + static uint8 s_statsAverageMinutes; + + static bool s_bpreviewprio; + static bool s_smartidcheck; + static uint8 s_smartidstate; + static bool s_safeServerConnect; + static bool s_startMinimized; + static uint16 s_MaxConperFive; + static bool s_checkDiskspace; + static uint32 s_uMinFreeDiskSpace; + static wxString s_yourHostname; + static bool s_bVerbose; + static bool s_bmanualhighprio; + static bool s_btransferfullchunks; + static bool s_bstartnextfile; + static bool s_bstartnextfilesame; + static bool s_bshowoverhead; + static bool s_bDAP; + static bool s_bUAP; + static bool s_bDisableKnownClientList; + static bool s_bDisableQueueList; + + static bool s_ShowRatesOnTitle; + + static wxString s_VideoPlayer; + static bool s_moviePreviewBackup; + static bool s_indicateratings; + static bool s_showAllNotCats; + + static bool s_msgonlyfriends; + static bool s_msgsecure; + + static uint8 s_iFileBufferSize; + static uint8 s_iQueueSize; + + static uint16 s_maxmsgsessions; + static wxString s_datetimeformat; + + static bool s_ToolbarOrientation; + static bool s_ShowPartFileNumber; + + // Web Server [kuchin] + static wxString s_sWebPassword; + static wxString s_sWebLowPassword; + static uint16 s_nWebPort; + static uint16 s_nWebUPnPTCPPort; + static bool s_bWebEnabled; + static bool s_bWebUseGzip; + static uint32 s_nWebPageRefresh; + static bool s_bWebLowEnabled; + static wxString s_WebTemplate; + + static bool s_showCatTabInfos; + static uint32 s_allcatType; + + // Madcat - Sources Dropping Tweaks + static uint8 s_NoNeededSources; // 0: Keep, 1: Drop, 2:Swap + static bool s_DropFullQueueSources; + static bool s_DropHighQueueRankingSources; + static uint32 s_HighQueueRanking; + static uint32 s_AutoDropTimer; + + // Kry - external connections + static bool s_AcceptExternalConnections; + static wxString s_ECAddr; + static uint32 s_ECPort; + static wxString s_ECPassword; + + // Kry - IPFilter + static bool s_IPFilterClients; + static bool s_IPFilterServers; + static uint8 s_filterlevel; + static bool s_IPFilterAutoLoad; + static wxString s_IPFilterURL; + static bool s_IPFilterSys; + + // Kry - Source seeds on/off + static bool s_UseSrcSeeds; + + static bool s_ProgBar; + static bool s_Percent; + + static bool s_SecIdent; + + static bool s_ExtractMetaData; + + static bool s_AllocFullPart; + static bool s_AllocFullChunk; + + static uint16 s_Browser; + static wxString s_CustomBrowser; + static bool s_BrowserTab; // Jacobo221 - Open in tabs if possible + + static CPath s_OSDirectory; + static uint16 s_OSUpdate; + + static wxString s_Skin; + static bool s_UseSkinFiles; + + static bool s_FastED2KLinksHandler; // Madcat - Toggle Fast ED2K Links Handler + + // Message Filtering + static bool s_MustFilterMessages; + static wxString s_MessageFilterString; + static bool s_FilterAllMessages; + static bool s_FilterSomeMessages; + + static bool s_FilterComments; + static wxString s_CommentFilterString; + + + // Hidden files sharing + static bool s_ShareHiddenFiles; + + static bool s_AutoSortDownload; + + // Version check + static bool s_NewVersionCheck; + + // Kad + static bool s_ConnectToKad; + static bool s_ConnectToED2K; + + // Statistics + static unsigned s_maxClientVersions; // 0 = unlimited + + // Drop slow sources if needed + static bool s_DropSlowSources; + + static wxString s_Ed2kURL; + static wxString s_KadURL; + + // Crypt + static bool s_IsClientCryptLayerSupported; + static bool s_IsClientCryptLayerRequired; + static bool s_bCryptLayerRequested; + static uint32 s_dwKadUDPKey; + static uint8 s_byCryptTCPPaddingLength; +}; + + +#endif // PREFERENCES_H +// File_checked_for_headers diff --git a/src/PrefsUnifiedDlg.cpp b/src/PrefsUnifiedDlg.cpp new file mode 100644 index 00000000..1becd006 --- /dev/null +++ b/src/PrefsUnifiedDlg.cpp @@ -0,0 +1,1136 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Original author: Emilio Sandoz +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "PrefsUnifiedDlg.h" + +#include + +#include +#include + +#include "amule.h" // Needed for theApp +#include "amuleDlg.h" +#include "Color.h" +#include "EditServerListDlg.h" +#include "SharedFileList.h" // Needed for CSharedFileList +#include "StatisticsDlg.h" // Needed for graph parameters, colors +#include "IPFilter.h" // Needed for CIPFilter +#include "SearchList.h" +#include "ClientList.h" +#include "DirectoryTreeCtrl.h" // Needed for CDirectoryTreeCtrl +#include "Preferences.h" +#include "muuli_wdr.h" +#include "Logger.h" +#include // Needed for CFormat +#include "TransferWnd.h" // Needed for CTransferWnd::UpdateCatTabTitles() +#include "KadDlg.h" // Needed for CKadDlg +#include "OScopeCtrl.h" // Needed for OScopeCtrl +#include "ServerList.h" +#include "UserEvents.h" + +BEGIN_EVENT_TABLE(PrefsUnifiedDlg,wxDialog) + // Events +#define USEREVENTS_EVENT(ID, NAME, VARS) \ + EVT_CHECKBOX(USEREVENTS_FIRST_ID + CUserEvents::ID * USEREVENTS_IDS_PER_EVENT + 1, PrefsUnifiedDlg::OnCheckBoxChange) \ + EVT_CHECKBOX(USEREVENTS_FIRST_ID + CUserEvents::ID * USEREVENTS_IDS_PER_EVENT + 3, PrefsUnifiedDlg::OnCheckBoxChange) + USEREVENTS_EVENTLIST() +#undef USEREVENTS_EVENT + + // Proxy + EVT_CHECKBOX(ID_PROXY_ENABLE_PROXY, PrefsUnifiedDlg::OnCheckBoxChange) + EVT_CHECKBOX(ID_PROXY_ENABLE_PASSWORD, PrefsUnifiedDlg::OnCheckBoxChange) +// EVT_CHECKBOX(ID_PROXY_AUTO_SERVER_CONNECT_WITHOUT_PROXY, PrefsUnifiedDlg::OnCheckBoxChange) + + // Connection + EVT_SPINCTRL(IDC_PORT, PrefsUnifiedDlg::OnTCPClientPortChange) + + // The rest. Organize it! + EVT_CHECKBOX(IDC_UDPDISABLE, PrefsUnifiedDlg::OnCheckBoxChange) + EVT_CHECKBOX(IDC_CHECKDISKSPACE, PrefsUnifiedDlg::OnCheckBoxChange) + EVT_CHECKBOX(IDC_USESKINFILES, PrefsUnifiedDlg::OnCheckBoxChange) + EVT_CHECKBOX(IDC_ONLINESIG, PrefsUnifiedDlg::OnCheckBoxChange) + EVT_CHECKBOX(IDC_REMOVEDEAD, PrefsUnifiedDlg::OnCheckBoxChange) + EVT_CHECKBOX(IDC_AUTOSERVER, PrefsUnifiedDlg::OnCheckBoxChange) + EVT_CHECKBOX(IDC_AUTOIPFILTER, PrefsUnifiedDlg::OnCheckBoxChange) + EVT_CHECKBOX(IDC_MSGFILTER, PrefsUnifiedDlg::OnCheckBoxChange) + EVT_CHECKBOX(IDC_MSGFILTER_ALL, PrefsUnifiedDlg::OnCheckBoxChange) + EVT_CHECKBOX(IDC_MSGFILTER_WORD, PrefsUnifiedDlg::OnCheckBoxChange) + EVT_CHECKBOX(IDC_FILTERCOMMENTS, PrefsUnifiedDlg::OnCheckBoxChange) + EVT_CHECKBOX(IDC_STARTNEXTFILE, PrefsUnifiedDlg::OnCheckBoxChange) + EVT_CHECKBOX(IDC_ENABLETRAYICON, PrefsUnifiedDlg::OnCheckBoxChange) + EVT_CHECKBOX(IDC_VERTTOOLBAR, PrefsUnifiedDlg::OnCheckBoxChange) + EVT_CHECKBOX(IDC_SUPPORT_PO, PrefsUnifiedDlg::OnCheckBoxChange) + EVT_CHECKBOX(IDC_ENABLE_PO_OUTGOING, PrefsUnifiedDlg::OnCheckBoxChange) + EVT_CHECKBOX(IDC_ENFORCE_PO_INCOMING, PrefsUnifiedDlg::OnCheckBoxChange) + + EVT_BUTTON(ID_PREFS_OK_TOP, PrefsUnifiedDlg::OnOk) + EVT_BUTTON(ID_OK, PrefsUnifiedDlg::OnOk) + + EVT_BUTTON(ID_PREFS_CANCEL_TOP, PrefsUnifiedDlg::OnCancel) + + // Browse buttons +// EVT_BUTTON(IDC_SELSKIN, PrefsUnifiedDlg::OnButtonDir) + EVT_BUTTON(IDC_BTN_BROWSE_WAV, PrefsUnifiedDlg::OnButtonBrowseWav) + EVT_BUTTON(IDC_BROWSEV, PrefsUnifiedDlg::OnButtonBrowseApplication) + EVT_BUTTON(IDC_SELTEMPDIR, PrefsUnifiedDlg::OnButtonDir) + EVT_BUTTON(IDC_SELINCDIR, PrefsUnifiedDlg::OnButtonDir) + EVT_BUTTON(IDC_SELOSDIR, PrefsUnifiedDlg::OnButtonDir) + EVT_BUTTON(IDC_SELBROWSER, PrefsUnifiedDlg::OnButtonBrowseApplication) + + EVT_SPINCTRL(IDC_TOOLTIPDELAY, PrefsUnifiedDlg::OnToolTipDelayChange) + + EVT_BUTTON(IDC_EDITADR, PrefsUnifiedDlg::OnButtonEditAddr) + EVT_BUTTON(IDC_IPFRELOAD, PrefsUnifiedDlg::OnButtonIPFilterReload) + EVT_BUTTON(IDC_COLOR_BUTTON, PrefsUnifiedDlg::OnButtonColorChange) + EVT_BUTTON(IDC_IPFILTERUPDATE, PrefsUnifiedDlg::OnButtonIPFilterUpdate) + EVT_CHOICE(IDC_COLORSELECTOR, PrefsUnifiedDlg::OnColorCategorySelected) + EVT_CHOICE(IDC_BROWSER, PrefsUnifiedDlg::OnBrowserChange) + EVT_LIST_ITEM_SELECTED(ID_PREFSLISTCTRL,PrefsUnifiedDlg::OnPrefsPageChange) + + EVT_INIT_DIALOG(PrefsUnifiedDlg::OnInitDialog) + + EVT_COMMAND_SCROLL(IDC_SLIDER, PrefsUnifiedDlg::OnScrollBarChange) + EVT_COMMAND_SCROLL(IDC_SLIDER3, PrefsUnifiedDlg::OnScrollBarChange) + EVT_COMMAND_SCROLL(IDC_SLIDER4, PrefsUnifiedDlg::OnScrollBarChange) + EVT_COMMAND_SCROLL(IDC_SLIDER2, PrefsUnifiedDlg::OnScrollBarChange) + EVT_COMMAND_SCROLL(IDC_FILEBUFFERSIZE, PrefsUnifiedDlg::OnScrollBarChange) + EVT_COMMAND_SCROLL(IDC_QUEUESIZE, PrefsUnifiedDlg::OnScrollBarChange) + EVT_COMMAND_SCROLL(IDC_SERVERKEEPALIVE, PrefsUnifiedDlg::OnScrollBarChange) + + EVT_SPINCTRL(IDC_MAXUP, PrefsUnifiedDlg::OnRateLimitChanged) + + EVT_LIST_ITEM_SELECTED(IDC_EVENTLIST, PrefsUnifiedDlg::OnUserEventSelected) + + EVT_CLOSE(PrefsUnifiedDlg::OnClose) + +END_EVENT_TABLE() + + +/** + * Creates an command-event for the given checkbox. + * + * This can be used enforce logical constraints by passing by + * sending a check-box event for each checkbox, when transfering + * to the UI. However, it should also be used for checkboxes that + * have no side-effects other than enabling/disabling other + * widgets in the preferences dialogs. + */ +void SendCheckBoxEvent(wxWindow* parent, int id) +{ + wxCheckBox* widget = CastByID(id, parent, wxCheckBox); + wxCHECK_RET(widget, wxT("Invalid widget in CreateEvent")); + + wxCommandEvent evt(wxEVT_COMMAND_CHECKBOX_CLICKED, id); + evt.SetInt(widget->IsChecked() ? 1 : 0); + + parent->ProcessEvent(evt); +} + + + +/** + * This struct provides a general way to represent config-tabs. + */ +struct PrefsPage +{ + //! The title of the page, used on the listctrl. + wxString m_title; + //! Function pointer to the wxDesigner function creating the dialog. + wxSizer* (*m_function)(wxWindow*, bool, bool ); + //! The index of the image used on the list. + int m_imageidx; + //! The actual widget. To be set later. + wxPanel* m_widget; +}; + + +PrefsPage pages[] = +{ + { wxTRANSLATE("General"), PreferencesGeneralTab, 13, NULL }, + { wxTRANSLATE("Connection"), PreferencesConnectionTab, 14, NULL }, + { wxTRANSLATE("Proxy"), PreferencesProxyTab, 24, NULL }, + { wxTRANSLATE("Message Filter"), PreferencesMessagesTab, 23, NULL }, + { wxTRANSLATE("Remote Controls"), PreferencesRemoteControlsTab, 11, NULL }, + { wxTRANSLATE("Online Signature"), PreferencesOnlineSigTab, 21, NULL }, + { wxTRANSLATE("Server"), PreferencesServerTab, 15, NULL }, + { wxTRANSLATE("Files"), PreferencesFilesTab, 16, NULL }, + { wxTRANSLATE("Directories"), PreferencesDirectoriesTab, 17, NULL }, + { wxTRANSLATE("Statistics"), PreferencesStatisticsTab, 10, NULL }, + { wxTRANSLATE("Security"), PreferencesSecurityTab, 22, NULL }, + //Notications are disabled since they havent been implemented + //{ wxTRANSLATE("Notifications"), PreferencesNotifyTab, 18, NULL }, + { wxTRANSLATE("Gui Tweaks"), PreferencesGuiTweaksTab, 19, NULL }, + { wxTRANSLATE("Core Tweaks"), PreferencesaMuleTweaksTab, 12, NULL }, + { wxTRANSLATE("Events"), PreferencesEventsTab, 5, NULL } +#ifdef __DEBUG__ + ,{ wxTRANSLATE("Debugging"), PreferencesDebug, 25, NULL } +#endif +}; + + +PrefsUnifiedDlg::PrefsUnifiedDlg(wxWindow *parent) +: +wxDialog(parent, -1, _("Preferences"), + wxDefaultPosition, wxDefaultSize, + wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER) +{ + preferencesDlgTop(this, false); + + wxListCtrl *PrefsIcons = CastChild(ID_PREFSLISTCTRL, wxListCtrl); + wxImageList *icon_list = new wxImageList(16, 16); + PrefsIcons->AssignImageList(icon_list, wxIMAGE_LIST_SMALL); + + // Add the single column used + PrefsIcons->InsertColumn( + 0, wxEmptyString, wxLIST_FORMAT_LEFT, + PrefsIcons->GetSize().GetWidth()-5); + + // Temp variables for finding the smallest height and width needed + int width = 0; + int height = 0; + + // Add each page to the page-list + for (unsigned int i = 0; i < itemsof(pages); ++i) { + // Add the icon and label assosiated with the page + icon_list->Add(amuleSpecial(pages[i].m_imageidx)); + PrefsIcons->InsertItem(i, wxGetTranslation(pages[i].m_title), i); + } + + // Set list-width so that there arn't any scrollers + PrefsIcons->SetColumnWidth(0, wxLIST_AUTOSIZE); + PrefsIcons->SetMinSize(wxSize(PrefsIcons->GetColumnWidth(0) + 10, -1)); + PrefsIcons->SetMaxSize(wxSize(PrefsIcons->GetColumnWidth(0) + 10, -1)); + + // Now add the pages and calculate the minimum size + for (unsigned int i = 0; i < itemsof(pages); ++i) { + // Create a container widget and the contents of the page + pages[i].m_widget = new wxPanel(this, -1); + pages[i].m_function(pages[i].m_widget, true, true); + + // Add it to the sizer + prefs_sizer->Add(pages[i].m_widget, 0, wxGROW|wxEXPAND); + + if (pages[i].m_function == PreferencesGeneralTab) { + // This must be done now or pages won't Fit(); + #ifdef __WXMSW__ + CastChild(IDC_BROWSERTABS, wxCheckBox)->Enable(false); + wxChoice *browserCheck = CastChild(IDC_BROWSER, wxChoice); + browserCheck->Clear(); + browserCheck->Append(_("System default")); + browserCheck->Append(_("User Defined")); + #endif /* __WXMSW__ */ + } else if (pages[i].m_function == PreferencesEventsTab) { + +#define USEREVENTS_REPLACE_VAR(VAR, DESC, CODE) + wxString(wxT("\n %") VAR wxT(" - ")) + wxGetTranslation(DESC) +#define USEREVENTS_EVENT(ID, NAME, VARS) case CUserEvents::ID: CreateEventPanels(idx, wxEmptyString VARS, pages[i].m_widget); break; + + wxListCtrl *list = CastChild(IDC_EVENTLIST, wxListCtrl); + list->InsertColumn(0, wxEmptyString); + for (unsigned int idx = 0; idx < CUserEvents::GetCount(); ++idx) { + long lidx = list->InsertItem(idx, + wxGetTranslation(CUserEvents::GetDisplayName( + static_cast(idx)))); + if (lidx != -1) { + list->SetItemData(lidx, + USEREVENTS_FIRST_ID + idx * USEREVENTS_IDS_PER_EVENT); + switch (idx) { + USEREVENTS_EVENTLIST() + } + } + } + list->SetColumnWidth(0, wxLIST_AUTOSIZE); + } + + // Align and resize the page + Fit(); + Layout(); + + // Find the greatest sizes + wxSize size = prefs_sizer->GetSize(); + if (size.GetWidth() > width) { + width = size.GetWidth(); + } + + if (size.GetHeight() > height) { + height = size.GetHeight(); + } + + // Hide it for now + prefs_sizer->Detach(pages[i].m_widget); + pages[i].m_widget->Show(false); + } + + // Default to the General tab + m_CurrentPanel = pages[0].m_widget; + prefs_sizer->Add(pages[0].m_widget, 0, wxGROW|wxEXPAND); + m_CurrentPanel->Show( true ); + + // Select the first item + PrefsIcons->SetItemState(0, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED); + + // We now have the needed minimum height and width + prefs_sizer->SetMinSize(width, height); + + // Store some often used pointers + m_ShareSelector = CastChild(IDC_SHARESELECTOR, CDirectoryTreeCtrl); + m_buttonColor = CastChild(IDC_COLOR_BUTTON, wxButton); + m_choiceColor = CastChild(IDC_COLORSELECTOR, wxChoice); + + // Connect the Cfgs with their widgets + thePrefs::CFGMap::iterator it = thePrefs::s_CfgList.begin(); + for ( ; it != thePrefs::s_CfgList.end(); ++it ) { + // Checking for failures + if ( !it->second->ConnectToWidget(it->first, this) ) { + printf("Failed to connect Cfg to widget with the ID %d and key %s\n", + it->first, (const char *)unicode2char(it->second->GetKey())); + } + } + Fit(); + + // It must not be resized to something smaller than what it currently is + wxSize size = GetClientSize(); + SetSizeHints(size.GetWidth(), size.GetHeight()); + + #ifdef __WXMSW__ + FindWindow(IDC_VERTTOOLBAR)->Enable(false); + #endif +} + + +Cfg_Base* PrefsUnifiedDlg::GetCfg(int id) +{ + thePrefs::CFGMap::iterator it = thePrefs::s_CfgList.find( id ); + + if ( it != thePrefs::s_CfgList.end() ) { + return it->second; + } + + return NULL; +} + + +bool PrefsUnifiedDlg::TransferToWindow() +{ + // Connect the Cfgs with their widgets + thePrefs::CFGMap::iterator it = thePrefs::s_CfgList.begin(); + for ( ; it != thePrefs::s_CfgList.end(); ++it ) { + // Checking for failures + if ( !it->second->TransferToWindow() ) { + printf("Failed to transfer data from Cfg to Widget with the ID %d and key %s\n", + it->first, (const char *)unicode2char(it->second->GetKey())); + } + } + + m_ShareSelector->SetSharedDirectories(&theApp->glob_prefs->shareddir_list); + + for ( int i = 0; i < cntStatColors; i++ ) { + thePrefs::s_colors[i] = CStatisticsDlg::acrStat[i]; + thePrefs::s_colors_ref[i] = CStatisticsDlg::acrStat[i]; + } + + // Connection tab + wxSpinEvent e; + OnTCPClientPortChange(e); + + // Proxy tab initialization + if (!CastChild(ID_PROXY_ENABLE_PROXY, wxCheckBox)->IsChecked()) { + FindWindow(ID_PROXY_TYPE)->Enable(false); + FindWindow(ID_PROXY_NAME)->Enable(false); + FindWindow(ID_PROXY_PORT)->Enable(false); + } + if (!CastChild(ID_PROXY_ENABLE_PASSWORD, wxCheckBox)->IsChecked()) { + FindWindow(ID_PROXY_USER)->Enable(false); + FindWindow(ID_PROXY_PASSWORD)->Enable(false); + } + // This option from the proxy tab is currently unused + FindWindow(ID_PROXY_AUTO_SERVER_CONNECT_WITHOUT_PROXY)->Enable(false); + + // Enable/Disable some controls + bool customBrowser = + CastChild(IDC_BROWSER, wxChoice)->GetSelection() == + (int)CastChild(IDC_BROWSER, wxChoice)->GetCount() - 1; + FindWindow( IDC_BROWSERSELF )->Enable( customBrowser ); + FindWindow( IDC_SELBROWSER )->Enable( customBrowser ); + #ifndef __WXMSW__ + FindWindow( IDC_BROWSERTABS )->Enable( !customBrowser ); + #endif + FindWindow( IDC_MINDISKSPACE )->Enable( thePrefs::IsCheckDiskspaceEnabled() ); + FindWindow( IDC_SKIN )->Enable( thePrefs::UseSkins() ); + FindWindow( IDC_OSDIR )->Enable( thePrefs::IsOnlineSignatureEnabled() ); + FindWindow( IDC_OSUPDATE )->Enable( thePrefs::IsOnlineSignatureEnabled() ); + FindWindow( IDC_UDPPORT )->Enable( !thePrefs::s_UDPDisable ); + FindWindow( IDC_SERVERRETRIES )->Enable( thePrefs::DeadServer() ); + FindWindow( IDC_STARTNEXTFILE_SAME )->Enable(thePrefs::StartNextFile()); + +#ifdef __WXMAC__ + FindWindow(IDC_ENABLETRAYICON)->Enable(false); + FindWindow(IDC_MINTRAY)->Enable(false); +#else + FindWindow(IDC_MINTRAY)->Enable(thePrefs::UseTrayIcon()); +#endif + + if (!CastChild(IDC_MSGFILTER, wxCheckBox)->IsChecked()) { + FindWindow(IDC_MSGFILTER_ALL)->Enable(false); + FindWindow(IDC_MSGFILTER_NONSECURE)->Enable(false); + FindWindow(IDC_MSGFILTER_NONFRIENDS)->Enable(false); + FindWindow(IDC_MSGFILTER_WORD)->Enable(false); + FindWindow(IDC_MSGWORD)->Enable(false); + } else if (CastChild(IDC_MSGFILTER_ALL, wxCheckBox)->IsChecked()) { + FindWindow(IDC_MSGFILTER_NONSECURE)->Enable(false); + FindWindow(IDC_MSGFILTER_NONFRIENDS)->Enable(false); + FindWindow(IDC_MSGFILTER_WORD)->Enable(false); + FindWindow(IDC_MSGWORD)->Enable(false); + } + + FindWindow(IDC_MSGWORD)->Enable(CastChild(IDC_MSGFILTER_WORD, wxCheckBox)->IsChecked()); + FindWindow(IDC_COMMENTWORD)->Enable(CastChild(IDC_FILTERCOMMENTS, wxCheckBox)->IsChecked()); + + // Protocol obfuscation + ::SendCheckBoxEvent(this, IDC_SUPPORT_PO); + ::SendCheckBoxEvent(this, IDC_ENABLE_PO_OUTGOING); + ::SendCheckBoxEvent(this, IDC_ENFORCE_PO_INCOMING); + + // Set debugging toggles +#ifdef __DEBUG__ + int count = CLogger::GetDebugCategoryCount(); + wxCheckListBox* list = CastChild( ID_DEBUGCATS, wxCheckListBox ); + + for ( int i = 0; i < count; i++ ) { + const CDebugCategory& cat = CLogger::GetDebugCategory( i ); + + list->Append( cat.GetName() ); + list->Check( i, cat.IsEnabled() ); + } +#endif + + return true; +} + + +bool PrefsUnifiedDlg::TransferFromWindow() +{ + // Connect the Cfgs with their widgets + thePrefs::CFGMap::iterator it = thePrefs::s_CfgList.begin(); + for ( ; it != thePrefs::s_CfgList.end(); ++it ) { + // Checking for failures + if ( !it->second->TransferFromWindow() ) { + printf("Failed to transfer data from Widget to Cfg with the ID %d and key %s\n", + it->first, (const char *)unicode2char(it->second->GetKey())); + } + } + + theApp->glob_prefs->shareddir_list.clear(); + m_ShareSelector->GetSharedDirectories(&theApp->glob_prefs->shareddir_list); + + for ( int i = 0; i < cntStatColors; i++ ) { + if ( thePrefs::s_colors[i] != thePrefs::s_colors_ref[i] ) { + CStatisticsDlg::acrStat[i] = thePrefs::s_colors[i]; + theApp->amuledlg->m_statisticswnd->ApplyStatsColor(i); + } + + theApp->amuledlg->m_kademliawnd->SetGraphColors(); + } + + // Get debugging toggles +#ifdef __DEBUG__ + int count = CLogger::GetDebugCategoryCount(); + wxCheckListBox* list = CastChild( ID_DEBUGCATS, wxCheckListBox ); + + for ( int i = 0; i < count; i++ ) { + const CDebugCategory& cat = CLogger::GetDebugCategory( i ); + + CLogger::SetEnabled( cat.GetType(), list->IsChecked( i ) ); + } +#endif + + #ifdef CLIENT_GUI + // Send preferences to core. + theApp->glob_prefs->SendToRemote(); + #endif + + return true; +} + + +bool PrefsUnifiedDlg::CfgChanged(int ID) +{ + Cfg_Base* cfg = GetCfg(ID); + + if ( cfg ) { + return cfg->HasChanged(); + } + + return false; +} + + +void PrefsUnifiedDlg::OnOk(wxCommandEvent& WXUNUSED(event)) +{ + TransferFromWindow(); + + bool restart_needed = false; + wxString restart_needed_msg = _("aMule must be restarted to enable these changes:\n\n"); + + // do sanity checking, special processing, and user notifications here + thePrefs::CheckUlDlRatio(); + + if (CfgChanged(IDC_PORT)) { + restart_needed = true; + restart_needed_msg += _("- TCP port changed.\n"); + } + + if (CfgChanged(IDC_UDPPORT)) { + restart_needed = true; + restart_needed_msg += _("- UDP port changed.\n"); + } + + // Force port checking + thePrefs::SetPort(thePrefs::GetPort()); + + if ((CPath::GetFileSize(theApp->ConfigDir + wxT("addresses.dat")) == 0) && + CastChild(IDC_AUTOSERVER, wxCheckBox)->IsChecked() ) { + thePrefs::UnsetAutoServerStart(); + wxMessageBox(wxString::wxString( _("Your Auto-update servers list is in blank.\n'Auto-update serverlist at startup' will be disabled.")), + _("Message"), wxOK | wxICON_INFORMATION, this); + } + + if (thePrefs::AcceptExternalConnections() && thePrefs::ECPassword().IsEmpty()) { + thePrefs::EnableExternalConnections( false ); + + wxMessageBox( _("You have enabled external connections but have not specified a password.\nExternal connections cannot be enabled unless a valid password is specified.")); + } + + // save the preferences on ok + theApp->glob_prefs->Save(); + + if (CfgChanged(IDC_FED2KLH) && theApp->amuledlg->GetActiveDialog() != CamuleDlg::DT_SEARCH_WND) { + theApp->amuledlg->ShowED2KLinksHandler( thePrefs::GetFED2KLH() ); + } + + if (CfgChanged(IDC_LANGUAGE)) { + restart_needed = true; + restart_needed_msg += _("- Language changed.\n"); + } + + if (CfgChanged(IDC_TEMPFILES)) { + restart_needed = true; + restart_needed_msg += _("- Temp folder changed.\n"); + } + + if (CfgChanged(IDC_INCFILES) || CfgChanged(IDC_TEMPFILES) || m_ShareSelector->HasChanged ) { + theApp->sharedfiles->Reload(); + } + + if (CfgChanged(IDC_OSDIR) || CfgChanged(IDC_ONLINESIG)) { + wxTextCtrl* widget = CastChild( IDC_OSDIR, wxTextCtrl ); + + // Build the filenames for the two OS files + theApp->SetOSFiles( widget->GetValue() ); + } + + if (CfgChanged(IDC_IPFCLIENTS) || CfgChanged(IDC_IPFSERVERS) || CfgChanged(ID_IPFILTERLEVEL)) { + if (thePrefs::IsFilteringClients()) { + theApp->clientlist->FilterQueues(); + } + if (thePrefs::IsFilteringServers()) { + theApp->serverlist->FilterServers(); + } + } + + if (thePrefs::GetShowRatesOnTitle()) { + // This avoids a 5 seconds delay to show the title + theApp->amuledlg->SetTitle(theApp->m_FrameTitle + wxT(" -- ") + _("Up: 0.0 | Down: 0.0")); + } else { + // This resets the title + theApp->amuledlg->SetTitle(theApp->m_FrameTitle); + } + + if (CfgChanged(IDC_EXTCATINFO)) { + theApp->amuledlg->m_transferwnd->UpdateCatTabTitles(); + } + + // Changes related to the statistics-dlg + if (CfgChanged(IDC_SLIDER)) { + theApp->amuledlg->m_statisticswnd->SetUpdatePeriod(thePrefs::GetTrafficOMeterInterval()); + theApp->amuledlg->m_kademliawnd->SetUpdatePeriod(thePrefs::GetTrafficOMeterInterval()); + } + + if ( CfgChanged(IDC_SLIDER3) ) { + theApp->amuledlg->m_statisticswnd->ResetAveragingTime(); + } + + if (CfgChanged(IDC_DOWNLOAD_CAP)) { + theApp->amuledlg->m_statisticswnd->SetARange( true, thePrefs::GetMaxGraphDownloadRate() ); + } + + if (CfgChanged(IDC_UPLOAD_CAP)) { + theApp->amuledlg->m_statisticswnd->SetARange( false, thePrefs::GetMaxGraphUploadRate() ); + } + + if (CfgChanged(IDC_SKIN) || CfgChanged(IDC_USESKINFILES)) { + theApp->amuledlg->Create_Toolbar(thePrefs::VerticalToolbar()); + } + + if (!thePrefs::GetNetworkED2K() && theApp->IsConnectedED2K()) { + theApp->DisconnectED2K(); + } + + if (!thePrefs::GetNetworkKademlia() && theApp->IsConnectedKad()) { + theApp->StopKad(); + } + + if (!thePrefs::GetNetworkED2K() && !thePrefs::GetNetworkKademlia()) { + wxMessageBox(wxString::wxString( + _("Both ED2K and Kad network are disabled.\nYou won't be able to connect until you enable at least one of them."))); + } + + if (thePrefs::GetNetworkKademlia() && thePrefs::IsUDPDisabled()) { + wxMessageBox(_("Kad will not start if your UDP port is disabled.\nEnable UDP port or disable Kad."), + _("Message"), wxOK | wxICON_INFORMATION, this); + } + + if (restart_needed) { + wxMessageBox(restart_needed_msg + _("\nYou MUST restart aMule now.\nIf you do not restart now, don't complain if anything bad happens.\n"), _("WARNING"),wxICON_EXCLAMATION,this); + } + + Show(false); +} + + +void PrefsUnifiedDlg::OnClose(wxCloseEvent& event) +{ + Show(false); + + // Try to keep the window alive when possible + if (event.CanVeto()) { + event.Veto(); + } else { + if (theApp->amuledlg) { + theApp->amuledlg->m_prefsDialog = NULL; + } + + // Un-Connect the Cfgs + thePrefs::CFGMap::iterator it = thePrefs::s_CfgList.begin(); + for (; it != thePrefs::s_CfgList.end(); ++it) { + // Checking for failures + it->second->ConnectToWidget( 0 ); + } + + Destroy(); + } +} + + +void PrefsUnifiedDlg::OnCancel(wxCommandEvent& WXUNUSED(event)) +{ + Show(false); +} + + +void PrefsUnifiedDlg::OnCheckBoxChange(wxCommandEvent& event) +{ + bool value = event.IsChecked(); + int id = event.GetId(); + + // Check if this checkbox is one of the User Events checkboxes + if (id >= USEREVENTS_FIRST_ID && + id < USEREVENTS_FIRST_ID + + (int)CUserEvents::GetCount() * USEREVENTS_IDS_PER_EVENT) { + // The corresponding text control always has + // an ID one greater than the checkbox + FindWindow(id + 1)->Enable(value); + return; + } + + switch ( id ) { + case IDC_UDPDISABLE: + // UDP is disable rather than enable, so we flip the value + FindWindow( IDC_UDPPORT )->Enable(!value); + break; + + case IDC_CHECKDISKSPACE: + FindWindow( IDC_MINDISKSPACE )->Enable(value); + break; + + case IDC_USESKINFILES: + FindWindow( IDC_SKIN )->Enable(value);; + break; + + case IDC_ONLINESIG: + FindWindow( IDC_OSDIR )->Enable(value);; + FindWindow(IDC_OSUPDATE)->Enable(value); + break; + + case IDC_REMOVEDEAD: + FindWindow( IDC_SERVERRETRIES )->Enable(value);; + break; + + case IDC_AUTOSERVER: + if ((CPath::GetFileSize(theApp->ConfigDir + wxT("addresses.dat")) == 0) && + CastChild(event.GetId(), wxCheckBox)->IsChecked() ) { + wxMessageBox(wxString::wxString( _("Your Auto-update servers list is in blank.\nPlease fill in at least one URL to point to a valid server.met file.\nClick on the button \"List\" by this checkbox to enter an URL.")), + _("Message"), wxOK | wxICON_INFORMATION); + CastChild(event.GetId(), wxCheckBox)->SetValue(false); + } + break; + + case IDC_MSGFILTER: + // Toogle All filter options + FindWindow(IDC_MSGFILTER_ALL)->Enable(value); + FindWindow(IDC_MSGFILTER_NONSECURE)->Enable(value); + FindWindow(IDC_MSGFILTER_NONFRIENDS)->Enable(value); + FindWindow(IDC_MSGFILTER_WORD)->Enable(value); + if (value) { + FindWindow(IDC_MSGWORD)->Enable( + CastChild(IDC_MSGFILTER_WORD, wxCheckBox)->IsChecked()); + } else { + FindWindow(IDC_MSGWORD)->Enable(false); + } + break; + + case IDC_MSGFILTER_ALL: + // Toogle filtering by data. + FindWindow(IDC_MSGFILTER_NONSECURE)->Enable(!value); + FindWindow(IDC_MSGFILTER_NONFRIENDS)->Enable(!value); + FindWindow(IDC_MSGFILTER_WORD)->Enable(!value); + if (!value) { + FindWindow(IDC_MSGWORD)->Enable( + CastChild(IDC_MSGFILTER_WORD, wxCheckBox)->IsChecked()); + } else { + FindWindow(IDC_MSGWORD)->Enable(false); + } + break; + + case IDC_MSGFILTER_WORD: + // Toogle filter word list. + FindWindow(IDC_MSGWORD)->Enable(value); + break; + + case IDC_FILTERCOMMENTS: + FindWindow(IDC_COMMENTWORD)->Enable(value); + break; + + case ID_PROXY_ENABLE_PROXY: + FindWindow(ID_PROXY_TYPE)->Enable(value); + FindWindow(ID_PROXY_NAME)->Enable(value); + FindWindow(ID_PROXY_PORT)->Enable(value); + break; + + case ID_PROXY_ENABLE_PASSWORD: + FindWindow(ID_PROXY_USER)->Enable(value); + FindWindow(ID_PROXY_PASSWORD)->Enable(value); + break; + + case IDC_STARTNEXTFILE: + FindWindow(IDC_STARTNEXTFILE_SAME)->Enable(value); + break; + + case IDC_ENABLETRAYICON: + FindWindow(IDC_MINTRAY)->Enable(value); + if (value) { + theApp->amuledlg->CreateSystray(); + } else { + theApp->amuledlg->RemoveSystray(); + } + thePrefs::SetUseTrayIcon(value); + break; + + case ID_PROXY_AUTO_SERVER_CONNECT_WITHOUT_PROXY: + break; + case IDC_VERTTOOLBAR: + theApp->amuledlg->Create_Toolbar(value); + // Update the first tool (conn button) + theApp->amuledlg->ShowConnectionState(); + break; + + case IDC_ENFORCE_PO_INCOMING: + FindWindow(IDC_ENABLE_PO_OUTGOING)->Enable(!value); + break; + + case IDC_ENABLE_PO_OUTGOING: + FindWindow(IDC_SUPPORT_PO)->Enable(!value); + FindWindow(IDC_ENFORCE_PO_INCOMING)->Enable(value); + break; + + case IDC_SUPPORT_PO: + FindWindow(IDC_ENABLE_PO_OUTGOING)->Enable(value); + break; + + default: + break; + } +} + + +void PrefsUnifiedDlg::OnButtonColorChange(wxCommandEvent& WXUNUSED(event)) +{ + int index = m_choiceColor->GetSelection(); + wxColour col = WxColourFromCr( thePrefs::s_colors[index] ); + col = wxGetColourFromUser( this, col ); + if ( col.Ok() ) { + m_buttonColor->SetBackgroundColour( col ); + thePrefs::s_colors[index] = CrFromWxColour(col); + } +} + + +void PrefsUnifiedDlg::OnColorCategorySelected(wxCommandEvent& WXUNUSED(evt)) +{ + m_buttonColor->SetBackgroundColour( + WxColourFromCr( thePrefs::s_colors[ m_choiceColor->GetSelection() ] ) ); +} + + +void PrefsUnifiedDlg::OnBrowserChange( wxCommandEvent& evt ) +{ + wxTextCtrl* textctrl = CastChild( IDC_BROWSERSELF, wxTextCtrl ); + wxButton* btn = CastChild( IDC_SELBROWSER, wxButton ); + bool enable = + evt.GetSelection() == + (int)CastChild( IDC_BROWSER, wxChoice )->GetCount() - 1; + + if (textctrl) { + textctrl->Enable( enable ); + } + if (btn) { + btn->Enable( enable ); + } +#ifndef __WXMSW__ + FindWindow( IDC_BROWSERTABS )->Enable( !enable ); +#endif +} + + +void PrefsUnifiedDlg::OnButtonDir(wxCommandEvent& event) +{ + wxString type; + + int id = 0; + switch ( event.GetId() ) { + case IDC_SELTEMPDIR: + id = IDC_TEMPFILES; + type = _("Temporary files"); + break; + + case IDC_SELINCDIR: + id = IDC_INCFILES; + type = _("Incoming files"); + break; + + case IDC_SELOSDIR: + id = IDC_OSDIR; + type = _("Online Signatures"); + break; + +// case IDC_SELSKIN: +// id = IDC_SKIN; +// type = _("Skins directory"); +// break; + + default: + wxASSERT(false); + return; + } + + type = CFormat(_("Choose a folder for %s")) % type; + wxTextCtrl* widget = CastChild( id, wxTextCtrl ); + wxString dir = widget->GetValue(); + wxString str = wxDirSelector( + type, dir, + wxDD_DEFAULT_STYLE, + wxDefaultPosition, this); + if (!str.IsEmpty()) { + widget->SetValue(str); + } +} + + +void PrefsUnifiedDlg::OnButtonBrowseWav(wxCommandEvent& WXUNUSED(evt)) +{ + wxString str = wxFileSelector( + _("Browse wav"), wxEmptyString, wxEmptyString, + wxT("*.wav"), _("File wav (*.wav)|*.wav||"), 0, this ); + + if ( !str.IsEmpty() ) { + wxTextCtrl* widget = CastChild( IDC_EDIT_TBN_WAVFILE, wxTextCtrl ); + + widget->SetValue( str ); + } +} + + +void PrefsUnifiedDlg::OnButtonBrowseApplication(wxCommandEvent& event) +{ + wxString title; + int id = 0; + switch ( event.GetId() ) { + case IDC_BROWSEV: + id = IDC_VIDEOPLAYER; + title = _("Browse for videoplayer"); + break; + case IDC_SELBROWSER: + id = IDC_BROWSERSELF; + title = _("Select browser"); + break; + default: + wxASSERT( false ); + return; + } + wxString wildcard = CFormat(_("Executable%s")) +#ifdef __WINDOWS__ + % wxT(" (*.exe)|*.exe"); +#else + % wxT("|*"); +#endif + + wxString str = wxFileSelector( title, wxEmptyString, wxEmptyString, + wxEmptyString, wildcard, 0, this ); + + if ( !str.IsEmpty() ) { + wxTextCtrl* widget = CastChild( id, wxTextCtrl ); + widget->SetValue( str ); + } +} + + +void PrefsUnifiedDlg::OnButtonEditAddr(wxCommandEvent& WXUNUSED(evt)) +{ + wxString fullpath( theApp->ConfigDir + wxT("addresses.dat") ); + + EditServerListDlg* test = new EditServerListDlg(this, _("Edit Serverlist"), + _("Add here URL's to download server.met files.\nOnly one url on each line."), + fullpath ); + + test->ShowModal(); + delete test; +} + + +void PrefsUnifiedDlg::OnButtonIPFilterReload(wxCommandEvent& WXUNUSED(event)) +{ + theApp->ipfilter->Reload(); +} + + +void PrefsUnifiedDlg::OnButtonIPFilterUpdate(wxCommandEvent& WXUNUSED(event)) +{ + theApp->ipfilter->Update( CastChild( IDC_IPFILTERURL, wxTextCtrl )->GetValue() ); +} + + +void PrefsUnifiedDlg::OnPrefsPageChange(wxListEvent& event) +{ + prefs_sizer->Detach( m_CurrentPanel ); + m_CurrentPanel->Show( false ); + + m_CurrentPanel = pages[ event.GetIndex() ].m_widget; + + prefs_sizer->Add( m_CurrentPanel, 0, wxGROW|wxEXPAND ); + m_CurrentPanel->Show( true ); + + Layout(); + + event.Skip(); +} + + +void PrefsUnifiedDlg::OnToolTipDelayChange(wxSpinEvent& event) +{ + wxToolTip::SetDelay( event.GetPosition() * 1000 ); +} + + +void PrefsUnifiedDlg::OnInitDialog( wxInitDialogEvent& WXUNUSED(evt) ) +{ +// This function exists solely to avoid automatic transfer-to-widget calls +} + + +void PrefsUnifiedDlg::OnScrollBarChange( wxScrollEvent& event ) +{ + int id = 0; + wxString label; + + switch ( event.GetId() ) { + case IDC_SLIDER: + id = IDC_SLIDERINFO; + label = wxString::Format( wxPLURAL("Update delay: %d second", "Update delay: %d seconds", event.GetPosition()), event.GetPosition() ); + theApp->amuledlg->m_statisticswnd->SetUpdatePeriod(event.GetPosition()); + theApp->amuledlg->m_kademliawnd->SetUpdatePeriod(event.GetPosition()); + break; + + case IDC_SLIDER3: + id = IDC_SLIDERINFO3; + label = wxString::Format( wxPLURAL("Time for average graph: %d minute", "Time for average graph: %d minutes", event.GetPosition()), event.GetPosition() ); + theApp->m_statistics->SetAverageMinutes(event.GetPosition()); + break; + + case IDC_SLIDER4: + id = IDC_SLIDERINFO4; + label = wxString::Format( _("Connections Graph Scale: %d"), event.GetPosition() ); + theApp->amuledlg->m_statisticswnd->GetConnScope()->SetRanges(0,event.GetPosition()); + break; + + case IDC_SLIDER2: + id = IDC_SLIDERINFO2; + label = wxString::Format( wxPLURAL("Update delay : %d second", "Update delay : %d seconds", event.GetPosition()), event.GetPosition() ); + break; + + case IDC_FILEBUFFERSIZE: + id = IDC_FILEBUFFERSIZE_STATIC; + // Yes, it seems odd to add the singular form here, but other languages might need to know the number to select the appropriate translation + label = wxString::Format( wxPLURAL("File Buffer Size: %d byte", "File Buffer Size: %d bytes", event.GetPosition() * 15000), event.GetPosition() * 15000 ); + break; + + case IDC_QUEUESIZE: + id = IDC_QUEUESIZE_STATIC; + // Yes, it seems odd to add the singular form here, but other languages might need to know the number to select the appropriate translation + label = wxString::Format( wxPLURAL("Upload Queue Size: %d client", "Upload Queue Size: %d clients", event.GetPosition() * 100), event.GetPosition() * 100 ); + break; + + case IDC_SERVERKEEPALIVE: + id = IDC_SERVERKEEPALIVE_LABEL; + + if ( event.GetPosition() ) { + label = wxString::Format( wxPLURAL("Server connection refresh interval: %d minute", "Server connection refresh interval: %d minutes", event.GetPosition()), event.GetPosition() ); + } else { + label = wxString::Format( _("Server connection refresh interval: Disabled") ); + } + break; + + default: + return; + } + + wxStaticText* widget = CastChild( id, wxStaticText ); + + if (widget) { + widget->SetLabel( label ); + widget->GetParent()->Layout(); + } +} + + +void PrefsUnifiedDlg::OnRateLimitChanged( wxSpinEvent& event ) +{ + // Here we do immediate sainity checking of the up/down ratio, + // so that the user can see if his choice is illegal + + // We only do checks if the rate is limited + if ( event.GetPosition() != (int)UNLIMITED ) { + wxSpinCtrl* dlrate = CastChild( IDC_MAXDOWN, wxSpinCtrl ); + + if ( event.GetPosition() < 4 ) { + if ( ( event.GetPosition() * 3 < dlrate->GetValue() ) || + ( dlrate->GetValue() == (int)UNLIMITED ) ) { + dlrate->SetValue( event.GetPosition() * 3 ); + } + } else if ( event.GetPosition() < 10 ) { + if ( ( event.GetPosition() * 4 < dlrate->GetValue() ) || + ( dlrate->GetValue() == (int)UNLIMITED ) ) { + dlrate->SetValue( event.GetPosition() * 4 ); + } + } + } +} + + +void PrefsUnifiedDlg::OnTCPClientPortChange(wxSpinEvent& WXUNUSED(event)) +{ + int port = CastChild(IDC_PORT, wxSpinCtrl)->GetValue(); + wxString txt; + txt << wxT("UDP port for extended server requests (TCP+3):") << port + 3; + CastChild(ID_TEXT_CLIENT_UDP_PORT, wxStaticText)->SetLabel(txt); +} + +void PrefsUnifiedDlg::OnUserEventSelected(wxListEvent& event) +{ + for (unsigned int i = 0; i < CUserEvents::GetCount(); ++i) { + CastChild(USEREVENTS_FIRST_ID + i * USEREVENTS_IDS_PER_EVENT, wxPanel)->Hide(); + } + + CastChild(event.GetData(), wxPanel)->Show(); + + Layout(); + + event.Skip(); +} + +void PrefsUnifiedDlg::CreateEventPanels(const int idx, const wxString& vars, wxWindow* parent) +{ + wxPanel *item0 = new wxPanel(parent, USEREVENTS_FIRST_ID + idx * USEREVENTS_IDS_PER_EVENT); + + wxBoxSizer *item1 = new wxBoxSizer(wxVERTICAL); + wxStaticBox *item8 = new wxStaticBox( item0, -1, CFormat(_("Execute command on `%s' event")) % wxGetTranslation(CUserEvents::GetDisplayName(static_cast(idx))) ); + wxStaticBoxSizer *item7 = new wxStaticBoxSizer( item8, wxVERTICAL ); + + wxCheckBox *item9 = new wxCheckBox( item0, USEREVENTS_FIRST_ID + idx * USEREVENTS_IDS_PER_EVENT + 1, _("Enable command execution on core"), wxDefaultPosition, wxDefaultSize, 0 ); + item7->Add( item9, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + wxFlexGridSizer *item10 = new wxFlexGridSizer( 3, 0, 0 ); + item10->AddGrowableCol( 2 ); + + item10->Add( 20, 20, 0, wxALIGN_CENTER|wxALL, 0 ); + + wxStaticText *item11 = new wxStaticText( item0, -1, _("Core command:"), wxDefaultPosition, wxDefaultSize, 0 ); + item10->Add( item11, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxTextCtrl *item12 = new wxTextCtrl( item0, USEREVENTS_FIRST_ID + idx * USEREVENTS_IDS_PER_EVENT + 2, wxT(""), wxDefaultPosition, wxDefaultSize, 0 ); + item12->Enable(CUserEvents::IsCoreCommandEnabled(static_cast(idx))); + item10->Add( item12, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item7->Add( item10, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 0 ); + + wxCheckBox *item14 = new wxCheckBox( item0, USEREVENTS_FIRST_ID + idx * USEREVENTS_IDS_PER_EVENT + 3, _("Enable command execution on GUI"), wxDefaultPosition, wxDefaultSize, 0 ); + item7->Add( item14, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + wxFlexGridSizer *item15 = new wxFlexGridSizer( 3, 0, 0 ); + item15->AddGrowableCol( 2 ); + + item15->Add( 20, 20, 0, wxALIGN_CENTER|wxALL, 0 ); + + wxStaticText *item16 = new wxStaticText( item0, -1, _("GUI command:"), wxDefaultPosition, wxDefaultSize, 0 ); + item15->Add( item16, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxTextCtrl *item17 = new wxTextCtrl( item0, USEREVENTS_FIRST_ID + idx * USEREVENTS_IDS_PER_EVENT + 4, wxT(""), wxDefaultPosition, wxDefaultSize, 0 ); + item17->Enable(CUserEvents::IsGUICommandEnabled(static_cast(idx))); + item15->Add( item17, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item7->Add( item15, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 0 ); + + wxStaticText *item13 = new wxStaticText( item0, -1, _("The following variables will be replaced:") + vars, wxDefaultPosition, wxDefaultSize, 0 ); + item7->Add( item13, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item1->Add( item7, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item0->SetSizer(item1); + item1->SetSizeHints(item0); + + IDC_PREFS_EVENTS_PAGE->Add(item0, 0, wxGROW | wxEXPAND); + + item0->Hide(); +} +// File_checked_for_headers diff --git a/src/PrefsUnifiedDlg.h b/src/PrefsUnifiedDlg.h new file mode 100644 index 00000000..8059b9ae --- /dev/null +++ b/src/PrefsUnifiedDlg.h @@ -0,0 +1,128 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Original author: Emilio Sandoz +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef __PrefsUnifiedDlg_H__ +#define __PrefsUnifiedDlg_H__ + +#include // Needed for wxDialog + + +class Cfg_Base; +class CDirectoryTreeCtrl; + +class wxWindow; +class wxChoice; +class wxButton; +class wxPanel; + +class wxCommandEvent; +class wxListEvent; +class wxSpinEvent; +class wxScrollEvent; +class wxInitDialogEvent; + + +/** + * This class represents a dialog used to display preferences. + */ +class PrefsUnifiedDlg : public wxDialog +{ +public: + /** + * Constructor. + * + * @param parent The parent window. + * + * This constructor is a much more simple version of the wxDialog one, + * which only needs to know the parent of the dialog. Please note that + * it is private so that we can ensure that only one dialog has been + * created at one time. + */ + PrefsUnifiedDlg(wxWindow* parent); + + /** + * Updates the widgets with the values of the preference-variables. + */ + bool TransferFromWindow(); + /** + * Updates the prefernce-variables with the values of the widgets. + */ + bool TransferToWindow(); + + +protected: + /** + * Helper functions which checks if a Cfg has has changed. + */ + bool CfgChanged(int id); + + /** + * Helper functions which returns the Cfg assosiated with the specified id. + */ + Cfg_Base* GetCfg(int id); + + + //! Pointer to the shared-files list + CDirectoryTreeCtrl* m_ShareSelector; + + //! Pointer to the color-selector + wxChoice* m_choiceColor; + + //! Pointer to the color-selection button + wxButton* m_buttonColor; + + //! Pointer to the currently shown preference-page + wxPanel* m_CurrentPanel; + + + void OnOk(wxCommandEvent &event); + void OnCancel(wxCommandEvent &event); + void OnClose(wxCloseEvent &event); + + void OnButtonBrowseWav(wxCommandEvent &event); + void OnButtonBrowseApplication(wxCommandEvent &event); + void OnButtonDir(wxCommandEvent& event); + void OnButtonEditAddr(wxCommandEvent& event); + void OnButtonColorChange(wxCommandEvent &event); + void OnButtonIPFilterReload(wxCommandEvent &event); + void OnButtonIPFilterUpdate(wxCommandEvent &event); + void OnColorCategorySelected(wxCommandEvent &event); + void OnCheckBoxChange(wxCommandEvent &event); + void OnBrowserChange(wxCommandEvent &event); + void OnPrefsPageChange(wxListEvent& event); + void OnToolTipDelayChange(wxSpinEvent& event); + void OnScrollBarChange( wxScrollEvent& event ); + void OnRateLimitChanged( wxSpinEvent& event ); + void OnTCPClientPortChange(wxSpinEvent& event); + void OnUserEventSelected(wxListEvent& event); + void CreateEventPanels(const int idx, const wxString& vars, wxWindow* parent); + + void OnInitDialog( wxInitDialogEvent& evt ); + + DECLARE_EVENT_TABLE() +}; + +#endif +// File_checked_for_headers diff --git a/src/Proxy.cpp b/src/Proxy.cpp new file mode 100644 index 00000000..7adaa892 --- /dev/null +++ b/src/Proxy.cpp @@ -0,0 +1,1477 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2004-2008 Marcelo Jimenez ( phoenix@amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "Proxy.h" /* for Interface */ + +#include + +#include "ArchSpecific.h" /* for ENDIAN_HTONS() */ +#include "Logger.h" /* for AddDebugLogLineM */ +#include "OtherFunctions.h" /* for EncodeBase64() */ +#include /* for unicode2char */ + +//------------------------------------------------------------------------------ +// CProxyData +//------------------------------------------------------------------------------ + +CProxyData::CProxyData() +{ + Clear(); +} + +CProxyData::CProxyData( + bool proxyEnable, + CProxyType proxyType, + const wxString &proxyHostName, + unsigned short proxyPort, + bool enablePassword, + const wxString &userName, + const wxString &password) +: +m_proxyEnable(proxyEnable), +m_proxyType(proxyType), +m_proxyHostName(proxyHostName), +m_proxyPort(proxyPort), +/* + * The flag m_enablePassword is currently not used. The first + * authentication method tryed is No-Authentication, the second + * is username/password. If there is no username/password in + * CProxyData, a NULL username/password is sent. That will probably + * lead to a failure, but at least we tryed. Maybe this behaviour + * could be altered later. + */ +m_enablePassword(enablePassword), +m_userName(userName), +m_password(password) +{ +} + +void CProxyData::Clear() +{ + m_proxyEnable = false; + m_proxyType = PROXY_NONE; + m_proxyHostName.Clear(); + m_proxyPort = 0; + m_enablePassword = false; + m_userName.Clear(); + m_password.Clear(); +} + +#ifndef CLIENT_GUI + +#include // Do_not_auto_remove (NetBSD, older gccs) + +//------------------------------------------------------------------------------ +// ProxyEventHandler +//------------------------------------------------------------------------------ + +CProxyEventHandler::CProxyEventHandler() +{ +} + +BEGIN_EVENT_TABLE(CProxyEventHandler, wxEvtHandler) + EVT_SOCKET(ID_PROXY_SOCKET_EVENT, CProxyEventHandler::ProxySocketHandler) +END_EVENT_TABLE() + +// +// THE one and only Event Handler +// +static CProxyEventHandler g_proxyEventHandler; + +void CProxyEventHandler::ProxySocketHandler(wxSocketEvent& event) +{ + CProxySocket *sock = dynamic_cast(event.GetSocket()); + if (sock) { + sock->m_proxyStateMachine->Schedule(event.GetSocketEvent()); + } else { + // we're doomed :) + } + sock->m_proxyStateMachine->Clock(); +} + +//------------------------------------------------------------------------------ +// CProxyStateMachine +//------------------------------------------------------------------------------ + +CProxyStateMachine::CProxyStateMachine( + wxString name, + const unsigned int max_states, + const CProxyData &proxyData, + CProxyCommand proxyCommand) +: +CStateMachine(NewName(name, proxyCommand), max_states, PROXY_STATE_START), +m_proxyData(proxyData), +m_proxyCommand(proxyCommand), +m_isLost(false), +m_isConnected(false), +m_canReceive(false), +m_canSend(false), +m_ok(true), +m_lastRead(0), +m_lastWritten(0), +// Will be initialized at Start() +m_peerAddress(NULL), +m_proxyClientSocket(NULL), +m_proxyBoundAddress(NULL), +// Temporary variables +m_lastReply(0), +m_packetLenght(0) +{ +} + +CProxyStateMachine::~CProxyStateMachine() +{ + delete m_peerAddress; +} + +wxString &CProxyStateMachine::NewName(wxString &s, CProxyCommand proxyCommand) +{ + switch (proxyCommand) { + case PROXY_CMD_CONNECT: + s += wxT("-CONNECT"); + break; + + case PROXY_CMD_BIND: + s += wxT("-BIND"); + break; + + case PROXY_CMD_UDP_ASSOCIATE: + s += wxT("-UDP"); + break; + } + + return s; +} + +bool CProxyStateMachine::Start(const wxIPaddress &peerAddress, wxSocketClient *proxyClientSocket) +{ + m_proxyClientSocket = proxyClientSocket; + try { + const wxIPV4address &peer = dynamic_cast(peerAddress); + m_peerAddress = new amuleIPV4Address(peer); + } catch (const std::bad_cast& e) { + // Should process other types of wxIPAddres before quitting + AddDebugLogLineM(false, logProxy, wxT("(1)bad_cast exception!")); + wxASSERT(false); + return false; + } + + // To run the state machine, return and just let the events start to happen. + return true; +} + +t_sm_state CProxyStateMachine::HandleEvent(t_sm_event event) +{ + // Default is stay in current state + t_sm_state ret = GetState(); + switch(event) + { + case wxSOCKET_CONNECTION: + AddDebugLogLineM(false, logProxy, wxT("Connection event")); + m_isConnected = true; + break; + + case wxSOCKET_INPUT: + AddDebugLogLineM(false, logProxy, wxT("Input event")); + m_canReceive = true; + break; + + case wxSOCKET_OUTPUT: + AddDebugLogLineM(false, logProxy, wxT("Output event")); + m_canSend = true; + break; + + case wxSOCKET_LOST: + AddDebugLogLineM(false, logProxy, wxT("Lost connection event")); + m_isLost = true; + m_ok = false; + break; + + default: + AddDebugLogLineM(false, logProxy, wxT("Unknown event")); + break; + } + + // Aborting conditions: + // - wxSOCKET_LOST event + // - More than 10 times on the same state + if ( m_isLost || + GetClocksInCurrentState() > 10) { + ret = PROXY_STATE_END; + } + + return ret; +} + +void CProxyStateMachine::AddDummyEvent() +{ + wxSocketEvent e(ID_PROXY_SOCKET_EVENT); + // Make sure this is an unknown event :) + e.m_event = (wxSocketNotify)( + wxSOCKET_INPUT + wxSOCKET_OUTPUT + + wxSOCKET_CONNECTION + wxSOCKET_LOST); + e.SetEventObject(m_proxyClientSocket); + g_proxyEventHandler.AddPendingEvent(e); +} + +/* + * Notice! These includes are here as long as it is impossible to retrieve + * the event handler from the socket. They should be removed. For now, + * please leave it here. + */ + +void CProxyStateMachine::ReactivateSocket() +{ + /* If proxy is beeing used, then the TCP socket handlers + * (CServerSocketHandler and CClientTCPSocketHandler) will not + * receive a wxSOCKET_CONNECTION event, because the connection has + * already started with the proxy. So we must add a wxSOCKET_CONNECTION + * event to make things go undetected. A wxSOCKET_OUTPUT event is also + * necessary to start sending data to the server. */ + CProxySocket *s = dynamic_cast(m_proxyClientSocket); + // If that is not true, we are in serious trouble... + wxASSERT(s); + if (CDatagramSocketProxy *udp = s->GetUDPSocket()) { + // The original socket was an UDP socket + if(m_ok) { + // From now on, the UDP socket can be used, + // remove the protection. + udp->SetUDPSocketOk(); + } + // No need to call RestoreState(), that socket will no longer + // be used after proxy negotiation. + } else { + // The original socket was a TCP socket + s->RestoreEventHandler(); + wxSocketEvent e(s->GetEventHandlerId()); + e.m_event = wxSOCKET_CONNECTION; + e.SetEventObject(s); + wxEvtHandler *h(s->GetEventHandler()); + h->AddPendingEvent(e); + e.m_event = wxSOCKET_OUTPUT; + h->AddPendingEvent(e); + if (!m_ok) { + e.m_event = wxSOCKET_LOST; + h->AddPendingEvent(e); + } + s->RestoreState(); + } +} + +wxSocketBase &CProxyStateMachine::ProxyWrite(wxSocketBase &socket, const void *buffer, wxUint32 nbytes) +{ + wxSocketBase &ret = socket.Write(buffer, nbytes); + m_lastWritten = m_proxyClientSocket->LastCount(); + /* Set the status of this operation */ + m_lastError = wxSOCKET_NOERROR; + m_ok = !m_proxyClientSocket->Error(); + if (!m_ok) { + m_lastError = m_proxyClientSocket->LastError(); + m_ok = m_lastError == wxSOCKET_WOULDBLOCK; + if (m_ok) { + m_canSend = false; + } + } + + return ret; +} + +wxSocketBase &CProxyStateMachine::ProxyRead(wxSocketBase &socket, void *buffer) +{ + /* Always try to read the full buffer. That explicitly demands that + * the socket has the flag wxSOCKET_NONE. */ + wxSocketBase &ret = socket.Read(buffer, PROXY_BUFFER_SIZE); + m_lastRead = m_proxyClientSocket->LastCount(); + /* Set the status of this operation */ + m_lastError = wxSOCKET_NOERROR; + m_ok = !m_proxyClientSocket->Error(); + if (!m_ok) { + m_lastError = m_proxyClientSocket->LastError(); + m_ok = m_lastError == wxSOCKET_WOULDBLOCK; + if (m_ok) { + m_canReceive = false; + } + } + + return ret; +} + +//------------------------------------------------------------------------------ +// CSocks5StateMachine +//------------------------------------------------------------------------------ + +/** + * The state machine constructor must initialize the array of pointer to member + * functions. Don't waste you time trying to statically initialize this, pointer + * to member functions require an object to operate on, so this array must be + * initialized at run time. + */ +CSocks5StateMachine::CSocks5StateMachine( + const CProxyData &proxyData, + CProxyCommand proxyCommand) +: +CProxyStateMachine( + wxString(wxT("Socks5")), SOCKS5_MAX_STATES, proxyData, proxyCommand) +{ + m_process_state[ 0] = &CSocks5StateMachine::process_start; + m_state_name[ 0] = wxT("process_start"); + m_process_state[ 1] = &CSocks5StateMachine::process_end; + m_state_name[ 1] = wxT("process_end"); + m_process_state[ 2] = &CSocks5StateMachine::process_send_query_authentication_method; + m_state_name[ 2] = wxT("process_send_query_authentication_method"); + m_process_state[ 3] = &CSocks5StateMachine::process_receive_authentication_method; + m_state_name[ 3] = wxT("process_receive_authentication_method"); + m_process_state[ 4] = &CSocks5StateMachine::process_process_authentication_method; + m_state_name[ 4] = wxT("process_process_authentication_method"); + m_process_state[ 5] = &CSocks5StateMachine::process_send_authentication_gssapi; + m_state_name[ 5] = wxT("process_send_authentication_gssapi"); + m_process_state[ 6] = &CSocks5StateMachine::process_receive_authentication_gssapi; + m_state_name[ 6] = wxT("process_receive_authentication_gssapi"); + m_process_state[ 7] = &CSocks5StateMachine::process_process_authentication_gssapi; + m_state_name[ 7] = wxT("process_process_authentication_gssapi"); + m_process_state[ 8] = &CSocks5StateMachine::process_send_authentication_username_password; + m_state_name[ 8] = wxT("process_send_authentication_username_password"); + m_process_state[ 9] = &CSocks5StateMachine::process_receive_authentication_username_password; + m_state_name[ 9] = wxT("process_receive_authentication_username_password"); + m_process_state[10] = &CSocks5StateMachine::process_process_authentication_username_password; + m_state_name[10] = wxT("process_process_authentication_username_password"); + m_process_state[11] = &CSocks5StateMachine::process_send_command_request; + m_state_name[11] = wxT("process_send_command_request"); + m_process_state[12] = &CSocks5StateMachine::process_receive_command_reply; + m_state_name[12] = wxT("process_receive_command_reply"); + m_process_state[13] = &CSocks5StateMachine::process_process_command_reply; + m_state_name[13] = wxT("process_process_command_reply"); +} + +void CSocks5StateMachine::process_state(t_sm_state state, bool entry) +{ + /* Ok, the syntax is terrible, but this is correct. This is a + * pointer to a member function. No C equivalent for that. */ + (this->*m_process_state[state])(entry); +#ifdef __DEBUG__ + int n = 0; + + switch (state) { + case SOCKS5_STATE_START: + case SOCKS5_STATE_END: + case SOCKS5_STATE_RECEIVE_AUTHENTICATION_METHOD: + case SOCKS5_STATE_RECEIVE_AUTHENTICATION_GSSAPI: + case SOCKS5_STATE_RECEIVE_AUTHENTICATION_USERNAME_PASSWORD: + case SOCKS5_STATE_RECEIVE_COMMAND_REPLY: + default: + n = 0; + break; + + case SOCKS5_STATE_SEND_QUERY_AUTHENTICATION_METHOD: + case SOCKS5_STATE_SEND_AUTHENTICATION_GSSAPI: + case SOCKS5_STATE_SEND_AUTHENTICATION_USERNAME_PASSWORD: + case SOCKS5_STATE_SEND_COMMAND_REQUEST: + n = m_packetLenght; + break; + + case SOCKS5_STATE_PROCESS_AUTHENTICATION_METHOD: + case SOCKS5_STATE_PROCESS_AUTHENTICATION_GSSAPI: + case SOCKS5_STATE_PROCESS_AUTHENTICATION_USERNAME_PASSWORD: + case SOCKS5_STATE_PROCESS_COMMAND_REPLY: + n = m_lastRead; + break; + } + + if (entry) { + DumpMem(m_buffer, n, m_state_name[state], m_ok); + } else { + AddDebugLogLineM(false, logProxy, + wxString(wxT("wait state -- ")) << m_state_name[state]); + } +#endif // __DEBUG__ +} + +/** + * Code this such that the next state is only entered when it is able to + * perform the operation (read or write). State processing will assume + * that it can read or write upon entry of the state. This is done using + * CanSend() and CanReceive(). On daemon, these functions always return + * true, because sockets are blocking. + */ +t_sm_state CSocks5StateMachine::next_state(t_sm_event event) +{ + // Default is stay in current state + t_sm_state ret = HandleEvent(event); + switch (GetState()) { + case SOCKS5_STATE_START: + if (m_isConnected && !m_isLost && CanSend()) { + ret = SOCKS5_STATE_SEND_QUERY_AUTHENTICATION_METHOD; + } + break; + + case SOCKS5_STATE_SEND_QUERY_AUTHENTICATION_METHOD: + if (CanReceive()) { + ret = SOCKS5_STATE_RECEIVE_AUTHENTICATION_METHOD; + } + break; + + case SOCKS5_STATE_RECEIVE_AUTHENTICATION_METHOD: + ret = SOCKS5_STATE_PROCESS_AUTHENTICATION_METHOD; + break; + + case SOCKS5_STATE_PROCESS_AUTHENTICATION_METHOD: + if (m_ok) { + if (CanSend()) { + switch (m_lastReply) { + case SOCKS5_AUTH_METHOD_NO_AUTH_REQUIRED: + ret = SOCKS5_STATE_SEND_COMMAND_REQUEST; + break; + + case SOCKS5_AUTH_METHOD_GSSAPI: + ret = SOCKS5_STATE_SEND_AUTHENTICATION_GSSAPI; + break; + + case SOCKS5_AUTH_METHOD_USERNAME_PASSWORD: + ret = SOCKS5_STATE_SEND_AUTHENTICATION_USERNAME_PASSWORD; + break; + + case SOCKS5_AUTH_METHOD_NO_ACCEPTABLE_METHODS: + default: + ret = SOCKS5_STATE_END; + break; + } + } else { + AddDebugLogLineM(false, logProxy, wxT("Cant send")); + } + } else { + ret = SOCKS5_STATE_END; + } + break; + + case SOCKS5_STATE_SEND_AUTHENTICATION_GSSAPI: + if (m_ok) { + if (CanReceive()) { + ret = SOCKS5_STATE_RECEIVE_AUTHENTICATION_GSSAPI; + } + } else { + ret = SOCKS5_STATE_END; + } + break; + + case SOCKS5_STATE_SEND_AUTHENTICATION_USERNAME_PASSWORD: + if (m_ok) { + if (CanReceive()) { + ret = SOCKS5_STATE_RECEIVE_AUTHENTICATION_USERNAME_PASSWORD; + } + } else { + ret = SOCKS5_STATE_END; + } + break; + + case SOCKS5_STATE_RECEIVE_AUTHENTICATION_GSSAPI: + ret = SOCKS5_STATE_PROCESS_AUTHENTICATION_GSSAPI; + break; + + case SOCKS5_STATE_RECEIVE_AUTHENTICATION_USERNAME_PASSWORD: + ret = SOCKS5_STATE_PROCESS_AUTHENTICATION_USERNAME_PASSWORD; + break; + + case SOCKS5_STATE_PROCESS_AUTHENTICATION_GSSAPI: + case SOCKS5_STATE_PROCESS_AUTHENTICATION_USERNAME_PASSWORD: + if (m_ok) { + if (CanSend()) { + ret = SOCKS5_STATE_SEND_COMMAND_REQUEST; + } + } else { + ret = SOCKS5_STATE_END; + } + break; + + case SOCKS5_STATE_SEND_COMMAND_REQUEST: + if (m_ok) { + if (CanReceive()) { + ret = SOCKS5_STATE_RECEIVE_COMMAND_REPLY; + } + } else { + ret = SOCKS5_STATE_END; + } + break; + + case SOCKS5_STATE_RECEIVE_COMMAND_REPLY: + ret = SOCKS5_STATE_PROCESS_COMMAND_REPLY; + break; + + case SOCKS5_STATE_PROCESS_COMMAND_REPLY: + ret = SOCKS5_STATE_END; + break; + + case SOCKS5_STATE_END: + default: + break; + } + + return ret; +} + +/** + * So, this is how you do it: the state machine is clocked by the events + * that happen inside the event handler. You can add a dummy event whenever + * you see that the system will not generate an event. But don't add dummy + * events before reads, reads should only be performed after input events. + * + * Maybe it makes sense to add a dummy event before a read if there is no + * state change (wait state). + * + * The event system will generate at least 2 events, one wxSOCKET_CONNECTION, + * one wxSOCKET_OUTPUT, so we will have 2 clocks in our state machine. Plus, each + * time there is unread data in the receive buffer of the socket, a wxSOCKET_INPUT + * event will be generated. If you feel you will need more clocks than these, use + * AddDummyEvent(), but I suggest you review your state machine design first. + */ +void CSocks5StateMachine::process_start(bool entry) +{ + if (entry) { + } else { + } +} + +void CSocks5StateMachine::process_end(bool) +{ + ReactivateSocket(); +} + +void CSocks5StateMachine::process_send_query_authentication_method(bool entry) +{ + if (entry) { + // Prepare the authentication method negotiation packet + m_buffer[0] = SOCKS5_VERSION; + m_buffer[1] = 2; // Number of supported methods + //m_buffer[1] = 3; // Number of supported methods + m_buffer[2] = SOCKS5_AUTH_METHOD_NO_AUTH_REQUIRED; + m_buffer[3] = SOCKS5_AUTH_METHOD_USERNAME_PASSWORD; + m_buffer[4] = SOCKS5_AUTH_METHOD_GSSAPI; + m_packetLenght = 4; + //m_packetLenght = 5; + + // Send the authentication method negotiation packet + ProxyWrite(*m_proxyClientSocket, m_buffer, m_packetLenght); + } +} + +void CSocks5StateMachine::process_receive_authentication_method(bool entry) +{ + if (entry) { + // Receive the method selection message + m_packetLenght = 2; + ProxyRead(*m_proxyClientSocket, m_buffer); + } + /* This is added because there will be no more input events. If the + * world was a nice place, we could think about joining the + * process_receive and the process_process states here, but some day + * we might have to deal with the fact that the i/o operation has been + * incomplete, and that we must finish our job the next time we enter + * this state. */ + AddDummyEvent(); +} + +void CSocks5StateMachine::process_process_authentication_method(bool entry) +{ + if (entry) { + m_lastReply = m_buffer[1]; + m_ok = m_ok && m_buffer[0] == SOCKS5_VERSION; + } + /* Ok, this one is here because wxSOCKET_OUTPUT events only happen + * once when you connect the socket, and after that, only after a + * wxSOCKET_WOULDBLOCK error happens. */ + AddDummyEvent(); +} + +void CSocks5StateMachine::process_send_authentication_gssapi(bool) +{ + // TODO or not TODO? That is the question... + m_ok = false; +} + +void CSocks5StateMachine::process_receive_authentication_gssapi(bool) +{ + AddDummyEvent(); +} + +void CSocks5StateMachine::process_process_authentication_gssapi(bool) +{ + AddDummyEvent(); +} + +void CSocks5StateMachine::process_send_authentication_username_password(bool entry) +{ + if (entry) { + unsigned char lenUser = m_proxyData.m_userName.Len(); + unsigned char lenPassword = m_proxyData.m_password.Len(); + m_packetLenght = 1 + 1 + lenUser + 1 + lenPassword; + unsigned int offsetUser = 2; + unsigned int offsetPassword = offsetUser + lenUser + 1; + + // Prepare username/password buffer + m_buffer[0] = SOCKS5_AUTH_VERSION_USERNAME_PASSWORD; + m_buffer[offsetUser-1] = lenUser; + memcpy(m_buffer+offsetUser, unicode2char(m_proxyData.m_userName), + lenUser); + m_buffer[offsetPassword-1] = lenPassword; + memcpy(m_buffer+offsetPassword, unicode2char(m_proxyData.m_password), + lenPassword); + + // Send the username/password packet + ProxyWrite(*m_proxyClientSocket, m_buffer, m_packetLenght); + } +} + +void CSocks5StateMachine::process_receive_authentication_username_password(bool entry) +{ + if (entry) { + // Receive the server's authentication response + m_packetLenght = 2; + ProxyRead(*m_proxyClientSocket, m_buffer); + } + AddDummyEvent(); +} + +void CSocks5StateMachine::process_process_authentication_username_password(bool entry) +{ + if (entry) { + // Process the server's reply + m_lastReply = m_buffer[1]; + m_ok = m_ok && + m_buffer[0] == SOCKS5_AUTH_VERSION_USERNAME_PASSWORD && + m_buffer[1] == SOCKS5_REPLY_SUCCEED; + } + AddDummyEvent(); +} + +void CSocks5StateMachine::process_send_command_request(bool entry) +{ + if (entry) { + // Prepare the request command buffer + m_buffer[0] = SOCKS5_VERSION; + switch (m_proxyCommand) { + case PROXY_CMD_CONNECT: + m_buffer[1] = SOCKS5_CMD_CONNECT; + break; + + case PROXY_CMD_BIND: + m_buffer[1] = SOCKS5_CMD_BIND; + break; + + case PROXY_CMD_UDP_ASSOCIATE: + m_buffer[1] = SOCKS5_CMD_UDP_ASSOCIATE; + break; + } + m_buffer[2] = SOCKS5_RSV; + m_buffer[3] = SOCKS5_ATYP_IPV4_ADDRESS; + PokeUInt32( m_buffer+4, StringIPtoUint32(m_peerAddress->IPAddress()) ); + RawPokeUInt16( m_buffer+8, ENDIAN_HTONS( m_peerAddress->Service() ) ); + + // Send the command packet + m_packetLenght = 10; + ProxyWrite(*m_proxyClientSocket, m_buffer, m_packetLenght); + } +} + +void CSocks5StateMachine::process_receive_command_reply(bool entry) +{ + if (entry) { + // The minimum number of bytes to read is 10 in the case of + // ATYP == SOCKS5_ATYP_IPV4_ADDRESS + m_packetLenght = 10; + ProxyRead(*m_proxyClientSocket, m_buffer); + } + AddDummyEvent(); +} + +void CSocks5StateMachine::process_process_command_reply(bool entry) +{ + if (entry) { + m_lastReply = m_buffer[1]; + unsigned char addressType = m_buffer[3]; + // Process the server's reply + m_ok = m_ok && + m_buffer[0] == SOCKS5_VERSION && + m_buffer[1] == SOCKS5_REPLY_SUCCEED; + if (m_ok) { + // Read BND.ADDR + unsigned int portOffset = 0; + switch(addressType) { + case SOCKS5_ATYP_IPV4_ADDRESS: + { + const unsigned int addrOffset = 4; + portOffset = 8; + m_proxyBoundAddressIPV4.Hostname( PeekUInt32( m_buffer+addrOffset) ); + m_proxyBoundAddress = &m_proxyBoundAddressIPV4; + break; + } + case SOCKS5_ATYP_DOMAINNAME: + { + // Read the domain name + const unsigned int addrOffset = 5; + portOffset = 10 + m_buffer[4]; + char c = m_buffer[portOffset]; + m_buffer[portOffset] = 0; + m_proxyBoundAddressIPV4.Hostname( + char2unicode(m_buffer+addrOffset)); + m_proxyBoundAddress = &m_proxyBoundAddressIPV4; + m_buffer[portOffset] = c; + break; + } + case SOCKS5_ATYP_IPV6_ADDRESS: + { + portOffset = 20; + // TODO + // IPV6 not yet implemented in wx + //m_proxyBoundAddress.Hostname(Uint128toStringIP( + // *((uint128 *)(m_buffer+addrOffset)) )); + //m_proxyBoundAddress = &m_proxyBoundAddressIPV6; + m_ok = false; + break; + } + } + // Set the packet length at last + m_packetLenght = portOffset + 2; + // Read BND.PORT + m_proxyBoundAddress->Service( ENDIAN_NTOHS( RawPeekUInt16( m_buffer+portOffset) ) ); + } + } + AddDummyEvent(); +} + +//------------------------------------------------------------------------------ +// CSocks4StateMachine +//------------------------------------------------------------------------------ + +CSocks4StateMachine::CSocks4StateMachine( + const CProxyData &proxyData, + CProxyCommand proxyCommand) +: +CProxyStateMachine( + wxString(wxT("Socks4")), SOCKS4_MAX_STATES, proxyData, proxyCommand) +{ + m_process_state[0] = &CSocks4StateMachine::process_start; + m_state_name[0] = wxT("process_start"); + m_process_state[1] = &CSocks4StateMachine::process_end; + m_state_name[1] = wxT("process_end"); + m_process_state[2] = &CSocks4StateMachine::process_send_command_request; + m_state_name[2] = wxT("process_send_command_request"); + m_process_state[3] = &CSocks4StateMachine::process_receive_command_reply; + m_state_name[3] = wxT("process_receive_command_reply"); + m_process_state[4] = &CSocks4StateMachine::process_process_command_reply; + m_state_name[4] = wxT("process_process_command_reply"); +} + +void CSocks4StateMachine::process_state(t_sm_state state, bool entry) +{ + (this->*m_process_state[state])(entry); +#ifdef __DEBUG__ + int n = 0; + + switch (state) { + case SOCKS4_STATE_START: + case SOCKS4_STATE_END: + case SOCKS4_STATE_RECEIVE_COMMAND_REPLY: + default: + n = 0; + break; + + case SOCKS4_STATE_SEND_COMMAND_REQUEST: + n = m_packetLenght; + break; + + case SOCKS4_STATE_PROCESS_COMMAND_REPLY: + n = m_lastRead; + break; + } + + if (entry) { + DumpMem(m_buffer, n, m_state_name[state], m_ok); + } else { + AddDebugLogLineM(false, logProxy, + wxString(wxT("wait state -- ")) << m_state_name[state]); + } +#endif // __DEBUG__ +} + +t_sm_state CSocks4StateMachine::next_state(t_sm_event event) +{ + // Default is stay in current state + t_sm_state ret = HandleEvent(event); + switch (GetState()) { + case SOCKS4_STATE_START: + if (m_isConnected && !m_isLost && CanSend()) { + ret = SOCKS4_STATE_SEND_COMMAND_REQUEST; + } + break; + + case SOCKS4_STATE_SEND_COMMAND_REQUEST: + if (m_ok) { + if (CanReceive()) { + ret = SOCKS4_STATE_RECEIVE_COMMAND_REPLY; + } + } else { + ret = SOCKS4_STATE_END; + } + break; + + case SOCKS4_STATE_RECEIVE_COMMAND_REPLY: + ret = SOCKS4_STATE_PROCESS_COMMAND_REPLY; + break; + + case SOCKS4_STATE_PROCESS_COMMAND_REPLY: + ret = SOCKS4_STATE_END; + break; + + case SOCKS4_STATE_END: + default: + break; + } + + return ret; +} + +void CSocks4StateMachine::process_start(bool entry) +{ + if (entry) { + } else { + } +} + +void CSocks4StateMachine::process_end(bool) +{ + ReactivateSocket(); +} + +void CSocks4StateMachine::process_send_command_request(bool entry) +{ + if (entry) { + // Prepare the request command buffer + m_buffer[0] = SOCKS4_VERSION; + switch (m_proxyCommand) { + case PROXY_CMD_CONNECT: + m_buffer[1] = SOCKS4_CMD_CONNECT; + break; + + case PROXY_CMD_BIND: + m_buffer[1] = SOCKS4_CMD_BIND; + break; + + case PROXY_CMD_UDP_ASSOCIATE: + m_ok = false; + return; + break; + } + RawPokeUInt16(m_buffer+2, ENDIAN_HTONS(m_peerAddress->Service())); + // Special processing for SOCKS4a + switch (m_proxyData.m_proxyType) { + case PROXY_SOCKS4a: + PokeUInt32(m_buffer+4, StringIPtoUint32(wxT("0.0.0.1"))); + break; + case PROXY_SOCKS4: + default: + PokeUInt32(m_buffer+4, StringIPtoUint32(m_peerAddress->IPAddress())); + break; + } + // Common processing for SOCKS4/SOCKS4a + unsigned int offsetUser = 8; + unsigned char lenUser = m_proxyData.m_userName.Len(); + memcpy(m_buffer + offsetUser, + unicode2char(m_proxyData.m_userName), lenUser); + m_buffer[offsetUser + lenUser] = 0; + // Special processing for SOCKS4a + switch (m_proxyData.m_proxyType) { + case PROXY_SOCKS4a: { + unsigned int offsetDomain = offsetUser + lenUser + 1; + unsigned char lenDomain = m_peerAddress->Hostname().Len(); + memcpy(m_buffer + offsetDomain, + unicode2char(m_peerAddress->Hostname()), lenDomain); + m_buffer[offsetDomain + lenDomain] = 0; + m_packetLenght = 1 + 1 + 2 + 4 + lenUser + 1 + lenDomain + 1; + break; + } + case PROXY_SOCKS4: + default: + m_packetLenght = 1 + 1 + 2 + 4 + lenUser + 1; + break; + } + // Send the command packet + ProxyWrite(*m_proxyClientSocket, m_buffer, m_packetLenght); + } +} + +void CSocks4StateMachine::process_receive_command_reply(bool entry) +{ + if (entry) { + // Receive the server's reply + m_packetLenght = 8; + ProxyRead(*m_proxyClientSocket, m_buffer); + } + AddDummyEvent(); +} + +void CSocks4StateMachine::process_process_command_reply(bool entry) +{ + if (entry) { + m_lastReply = m_buffer[1]; + + // Process the server's reply + m_ok = m_ok && + m_buffer[0] == SOCKS4_REPLY_CODE && + m_buffer[1] == SOCKS4_REPLY_GRANTED; + if (m_ok) { + // Read BND.PORT + const unsigned int portOffset = 2; + m_ok = m_proxyBoundAddressIPV4.Service(ENDIAN_NTOHS( + RawPeekUInt16( m_buffer+portOffset) ) ); + // Read BND.ADDR + const unsigned int addrOffset = 4; + m_ok = m_ok && + m_proxyBoundAddressIPV4.Hostname( PeekUInt32( m_buffer+addrOffset ) ); + m_proxyBoundAddress = &m_proxyBoundAddressIPV4; + } + } + AddDummyEvent(); +} + +//------------------------------------------------------------------------------ +// CHttpStateMachine +//------------------------------------------------------------------------------ + +CHttpStateMachine::CHttpStateMachine( + const CProxyData &proxyData, + CProxyCommand proxyCommand) +: +CProxyStateMachine( + wxString(wxT("Http")), HTTP_MAX_STATES, proxyData, proxyCommand) +{ + m_process_state[0] = &CHttpStateMachine::process_start; + m_state_name[0] = wxT("process_start"); + m_process_state[1] = &CHttpStateMachine::process_end; + m_state_name[1] = wxT("process_end"); + m_process_state[2] = &CHttpStateMachine::process_send_command_request; + m_state_name[2] = wxT("process_send_command_request"); + m_process_state[3] = &CHttpStateMachine::process_receive_command_reply; + m_state_name[3] = wxT("process_receive_command_reply"); + m_process_state[4] = &CHttpStateMachine::process_process_command_reply; + m_state_name[4] = wxT("process_process_command_reply"); +} + +void CHttpStateMachine::process_state(t_sm_state state, bool entry) +{ + (this->*m_process_state[state])(entry); +#ifdef __DEBUG__ + int n = 0; + + switch (state) { + case HTTP_STATE_START: + case HTTP_STATE_END: + case HTTP_STATE_RECEIVE_COMMAND_REPLY: + default: + n = 0; + break; + + case HTTP_STATE_SEND_COMMAND_REQUEST: + n = m_packetLenght; + break; + + case HTTP_STATE_PROCESS_COMMAND_REPLY: + n = m_lastRead; + break; + } + + if (entry) { + DumpMem(m_buffer, n, m_state_name[state], m_ok); + } else { + AddDebugLogLineM(false, logProxy, + wxString(wxT("wait state -- ")) << m_state_name[state]); + } +#endif // __DEBUG__ +} + +t_sm_state CHttpStateMachine::next_state(t_sm_event event) +{ + // Default is stay in current state + t_sm_state ret = HandleEvent(event); + switch (GetState()) { + case HTTP_STATE_START: + if (m_isConnected && !m_isLost && CanSend()) { + ret = HTTP_STATE_SEND_COMMAND_REQUEST; + } + break; + + case HTTP_STATE_SEND_COMMAND_REQUEST: + if (m_ok) { + if (CanReceive()) { + ret = HTTP_STATE_RECEIVE_COMMAND_REPLY; + } + } else { + ret = HTTP_STATE_END; + } + break; + + case HTTP_STATE_RECEIVE_COMMAND_REPLY: + ret = HTTP_STATE_PROCESS_COMMAND_REPLY; + break; + + case HTTP_STATE_PROCESS_COMMAND_REPLY: + ret = HTTP_STATE_END; + break; + + case HTTP_STATE_END: + default: + break; + } + + return ret; +} + +void CHttpStateMachine::process_start(bool entry) +{ + if (entry) { + } else { + } +} + +void CHttpStateMachine::process_end(bool) +{ + ReactivateSocket(); +} + +void CHttpStateMachine::process_send_command_request(bool entry) +{ + if (entry) { + // Prepare the request command buffer + wxString ip = m_peerAddress->IPAddress(); + uint16 port = m_peerAddress->Service(); + wxString userPass; + wxString userPassEncoded; + if (m_proxyData.m_enablePassword) { + userPass = m_proxyData.m_userName + wxT(":") + m_proxyData.m_password; + userPassEncoded = + EncodeBase64(unicode2char(userPass), PROXY_BUFFER_SIZE); + } + wxString msg; + + switch (m_proxyCommand) { + case PROXY_CMD_CONNECT: + msg << + wxT("CONNECT ") << ip << wxT(":") << port << wxT(" HTTP/1.1\r\n") << + wxT("Host: ") << ip << wxT(":") << port << wxT("\r\n"); + if (m_proxyData.m_enablePassword) { + msg << + wxT("Authorization: Basic ") << userPassEncoded << wxT("\r\n") << + wxT("Proxy-Authorization: Basic ") << userPassEncoded << wxT("\r\n"); + } else { + msg << wxT("\r\n"); + } + break; + + case PROXY_CMD_BIND: + m_ok = false; + break; + + case PROXY_CMD_UDP_ASSOCIATE: + m_ok = false; + return; + break; + } + // Send the command packet + m_packetLenght = msg.Len(); + memcpy(m_buffer, unicode2char(msg), m_packetLenght+1); + ProxyWrite(*m_proxyClientSocket, m_buffer, m_packetLenght); + } +} + +void CHttpStateMachine::process_receive_command_reply(bool entry) +{ + if (entry) { + // Receive the server's reply -- Use a large number, but don't + // Expect to get it all. HTTP protocol does not have a fixed length. + m_packetLenght = PROXY_BUFFER_SIZE; + ProxyRead(*m_proxyClientSocket, m_buffer); + } + AddDummyEvent(); +} + +/* + * HTTP Proxy server response should be something like: + * "HTTP/1.1 200 Connection established\r\n\r\n" + * but that may vary. The important thing is the "200" + * code, that means success. + */ +static const char HTTP_AUTH_RESPONSE[] = "HTTP/"; +static const int HTTP_AUTH_RESPONSE_LENGHT = strlen(HTTP_AUTH_RESPONSE); +void CHttpStateMachine::process_process_command_reply(bool entry) +{ + if (entry) { + // The position of the first space in the buffer + int i = 8; + while (m_buffer[i] == ' ') { + i++; + } + // Process the server's reply + m_ok = !memcmp(m_buffer + 0, HTTP_AUTH_RESPONSE, HTTP_AUTH_RESPONSE_LENGHT) && + !memcmp(m_buffer + i, "200", 3); + } + AddDummyEvent(); +} + +//------------------------------------------------------------------------------ +// CProxySocket +//------------------------------------------------------------------------------ + +CProxySocket::CProxySocket( + wxSocketFlags flags, + const CProxyData *proxyData, + CProxyCommand proxyCommand, + CDatagramSocketProxy *udpSocket) +: +wxSocketClient(flags), +m_proxyStateMachine(NULL), +m_udpSocket(udpSocket), +m_socketEventHandler(NULL), +m_socketEventHandlerId(0), +m_savedSocketEventHandler(NULL), +m_savedSocketEventHandlerId(0) +{ + SetProxyData(proxyData); + if (m_useProxy) { + switch (m_proxyData.m_proxyType) { + case PROXY_NONE: + break; + + case PROXY_SOCKS5: + m_proxyStateMachine = + new CSocks5StateMachine(*proxyData, proxyCommand); + break; + + case PROXY_SOCKS4: + case PROXY_SOCKS4a: + m_proxyStateMachine = + new CSocks4StateMachine(*proxyData, proxyCommand); + break; + + case PROXY_HTTP: + m_proxyStateMachine = + new CHttpStateMachine(*proxyData, proxyCommand); + break; + + default: + break; + } + } +} + +CProxySocket::~CProxySocket() +{ + delete m_proxyStateMachine; +} + +void CProxySocket::SetProxyData(const CProxyData *proxyData) +{ + m_useProxy = proxyData != NULL && proxyData->m_proxyEnable; + if (proxyData) { + m_proxyData = *proxyData; + m_proxyAddress.Hostname(m_proxyData.m_proxyHostName); + m_proxyAddress.Service(m_proxyData.m_proxyPort); + } else { + m_proxyData.Clear(); + } +} + +bool CProxySocket::Start(const wxIPaddress &peerAddress) +{ + SaveState(); + // Important note! SaveState()/RestoreState() DO NOT save/restore + // the event handler. The method SaveEventHandler() has been created + // for that. + SaveEventHandler(); + SetEventHandler(g_proxyEventHandler, ID_PROXY_SOCKET_EVENT); + SetNotify( + wxSOCKET_CONNECTION_FLAG | + wxSOCKET_INPUT_FLAG | + wxSOCKET_OUTPUT_FLAG | + wxSOCKET_LOST_FLAG); + Notify(true); + Connect(m_proxyAddress, false); + SetFlags(wxSOCKET_NONE); + bool ok = m_proxyStateMachine->Start(peerAddress, this); + + return ok; +} + +bool CProxySocket::ProxyIsCapableOf(CProxyCommand proxyCommand) const +{ + bool ret = false; + + switch (m_proxyData.m_proxyType) { + case PROXY_NONE: + ret = false; + break; + + case PROXY_SOCKS5: + ret = proxyCommand == PROXY_CMD_CONNECT || + proxyCommand == PROXY_CMD_BIND || + proxyCommand == PROXY_CMD_UDP_ASSOCIATE; + break; + + case PROXY_SOCKS4: + case PROXY_SOCKS4a: + ret = proxyCommand == PROXY_CMD_CONNECT || + proxyCommand == PROXY_CMD_BIND; + break; + + case PROXY_HTTP: + ret = proxyCommand == PROXY_CMD_CONNECT; + break; + } + + return ret; +} + +//------------------------------------------------------------------------------ +// CSocketClientProxy +//------------------------------------------------------------------------------ + +CSocketClientProxy::CSocketClientProxy( + wxSocketFlags flags, + const CProxyData *proxyData) +: +CProxySocket(flags, proxyData, PROXY_CMD_CONNECT) +{ +} + +bool CSocketClientProxy::Connect(wxIPaddress &address, bool wait) +{ + wxMutexLocker lock(m_socketLocker); + bool ok; + + if (GetUseProxy() && ProxyIsCapableOf(PROXY_CMD_CONNECT)) { + ok = Start(address); + } else { + ok = wxSocketClient::Connect(address, wait); + } + + return ok; +} + +CSocketClientProxy& CSocketClientProxy::Read(void *buffer, wxUint32 nbytes) +{ + wxMutexLocker lock(m_socketLocker); + CProxySocket::Read(buffer, nbytes); + + return *this; + +} + +CSocketClientProxy& CSocketClientProxy::Write(const void *buffer, wxUint32 nbytes) +{ + wxMutexLocker lock(m_socketLocker); + CProxySocket::Write(buffer, nbytes); + + return *this; +} + +//------------------------------------------------------------------------------ +// CSocketServerProxy +//------------------------------------------------------------------------------ + +CSocketServerProxy::CSocketServerProxy( + wxIPaddress &address, + wxSocketFlags flags, + const CProxyData *) +: +wxSocketServer(address, flags) +{ + /* Maybe some day when socks6 is out... :) */ +} + +CSocketServerProxy& CSocketServerProxy::Read(void *buffer, wxUint32 nbytes) +{ + wxMutexLocker lock(m_socketLocker); + wxSocketServer::Read(buffer, nbytes); + + return *this; +} + +CSocketServerProxy& CSocketServerProxy::Write(const void *buffer, wxUint32 nbytes) +{ + wxMutexLocker lock(m_socketLocker); + wxSocketServer::Write(buffer, nbytes); + + return *this; +} + +//------------------------------------------------------------------------------ +// CDatagramSocketProxy +//------------------------------------------------------------------------------ + +CDatagramSocketProxy::CDatagramSocketProxy( + wxIPaddress &address, wxSocketFlags flags, const CProxyData *proxyData) +: +wxDatagramSocket(address, flags), +m_proxyTCPSocket(wxSOCKET_NOWAIT, proxyData, PROXY_CMD_UDP_ASSOCIATE, this) +{ + m_udpSocketOk = false; + if ( m_proxyTCPSocket.GetUseProxy() && + m_proxyTCPSocket.ProxyIsCapableOf(PROXY_CMD_UDP_ASSOCIATE)) { + m_proxyTCPSocket.Start(address); + } else { + } + m_lastUDPOperation = UDP_OPERATION_NONE; +} + +CDatagramSocketProxy::~CDatagramSocketProxy() +{ + // From RFC-1928: + // "A UDP association terminates when the TCP connection that the + // UDP ASSOCIATE request arrived terminates." +} + +wxDatagramSocket &CDatagramSocketProxy::RecvFrom( + wxSockAddress &addr, void* buf, wxUint32 nBytes ) +{ + wxMutexLocker lock(m_socketLocker); + m_lastUDPOperation = UDP_OPERATION_RECV_FROM; + if (m_proxyTCPSocket.GetUseProxy()) { + if (m_udpSocketOk) { + char *bufUDP = NULL; + if (nBytes + PROXY_UDP_MAXIMUM_OVERHEAD > PROXY_BUFFER_SIZE) { + bufUDP = new char[nBytes + PROXY_UDP_MAXIMUM_OVERHEAD]; + } else { + bufUDP = m_proxyTCPSocket.GetBuffer(); + } + wxDatagramSocket::RecvFrom( + m_proxyTCPSocket.GetProxyBoundAddress(), + bufUDP, nBytes + PROXY_UDP_MAXIMUM_OVERHEAD); + unsigned int offset; + switch (m_proxyTCPSocket.GetBuffer()[3]) { + case SOCKS5_ATYP_IPV4_ADDRESS: { + offset = PROXY_UDP_OVERHEAD_IPV4; + try { + amuleIPV4Address &a = dynamic_cast(addr); + a.Hostname( PeekUInt32( m_proxyTCPSocket.GetBuffer()+4 ) ); + a.Service( ENDIAN_NTOHS( RawPeekUInt16( m_proxyTCPSocket.GetBuffer()+8) ) ); + } catch (const std::bad_cast& e) { + AddDebugLogLineM(false, logProxy, + wxT("(2)bad_cast exception!")); + wxASSERT(false); + } + } + break; + + case SOCKS5_ATYP_DOMAINNAME: + offset = PROXY_UDP_OVERHEAD_DOMAIN_NAME; + break; + + case SOCKS5_ATYP_IPV6_ADDRESS: + offset = PROXY_UDP_OVERHEAD_IPV6; + break; + + default: + /* Error! */ + offset = 0; + break; + } + memcpy(buf, bufUDP + offset, nBytes); + // Uncomment here to see the buffer contents on console + // DumpMem(bufUDP, wxDatagramSocket::LastCount(), wxT("RecvFrom"), 3); + + /* Only delete buffer if it was dynamically created */ + if (bufUDP != m_proxyTCPSocket.GetBuffer()) { + /* We should use a fixed buffer to avoid + * new/delete it all the time. + * I need an upper bound */ + delete bufUDP; + } + /* There is still one problem pending, fragmentation. + * Either we support it or we have to drop fragmented + * messages. I vote for drop :) + */ + } + } else { + wxDatagramSocket::RecvFrom(addr, buf, nBytes); + } + + return *this; +} + +wxDatagramSocket &CDatagramSocketProxy::SendTo( + wxIPaddress &addr, const void* buf, wxUint32 nBytes ) +{ + wxMutexLocker lock(m_socketLocker); + m_lastUDPOperation = UDP_OPERATION_SEND_TO; + m_lastUDPOverhead = PROXY_UDP_OVERHEAD_IPV4; + if (m_proxyTCPSocket.GetUseProxy()) { + if (m_udpSocketOk) { + m_proxyTCPSocket.GetBuffer()[0] = SOCKS5_RSV; // Reserved + m_proxyTCPSocket.GetBuffer()[1] = SOCKS5_RSV; // Reserved + m_proxyTCPSocket.GetBuffer()[2] = 0; // FRAG + m_proxyTCPSocket.GetBuffer()[3] = SOCKS5_ATYP_IPV4_ADDRESS; + PokeUInt32( m_proxyTCPSocket.GetBuffer()+4, StringIPtoUint32(addr.IPAddress())); + RawPokeUInt16( m_proxyTCPSocket.GetBuffer()+8, ENDIAN_HTONS( addr.Service() ) ); + memcpy(m_proxyTCPSocket.GetBuffer() + PROXY_UDP_OVERHEAD_IPV4, buf, nBytes); + nBytes += PROXY_UDP_OVERHEAD_IPV4; + wxDatagramSocket::SendTo( + m_proxyTCPSocket.GetProxyBoundAddress(), + m_proxyTCPSocket.GetBuffer(), nBytes); + // Uncomment here to see the buffer contents on console + // DumpMem(m_proxyTCPSocket.GetBuffer(), nBytes, wxT("SendTo"), 3); + } + } else { + wxDatagramSocket::SendTo(addr, buf, nBytes); + } + + return *this; +} + +wxUint32 CDatagramSocketProxy::LastCount(void) const +{ + wxUint32 ret; + + if (m_proxyTCPSocket.GetUseProxy()) { + switch (m_lastUDPOperation) { + case UDP_OPERATION_RECV_FROM: + case UDP_OPERATION_SEND_TO: + ret = Ok() ? wxDatagramSocket::LastCount() - m_lastUDPOverhead : 0; + break; + + case UDP_OPERATION_NONE: + default: + ret = 0; + break; + + } + } else { + ret = wxDatagramSocket::LastCount(); + } + + return ret; +} + +#endif // CLIENT_GUI + +/******************************************************************************/ +// File_checked_for_headers diff --git a/src/Proxy.h b/src/Proxy.h new file mode 100644 index 00000000..38b279bb --- /dev/null +++ b/src/Proxy.h @@ -0,0 +1,586 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2004-2008 Marcelo Jimenez ( phoenix@amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef __PROXY_H__ +#define __PROXY_H__ + +#include + +#include "amuleIPV4Address.h" // For amuleIPV4address +#include "StateMachine.h" // For CStateMachine + +/******************************************************************************/ + +/* + * SOCKS4 protocol implementation according to: + * - "SOCKS: A protocol for TCP proxy across firewalls": + * amule-root/docs/socks4.protocol + */ +const unsigned char SOCKS4_VERSION = 0x04; + +const unsigned char SOCKS4_CMD_CONNECT = 0x01; +const unsigned char SOCKS4_CMD_BIND = 0x02; + +const unsigned char SOCKS4_REPLY_CODE = 0; +const unsigned char SOCKS4_REPLY_GRANTED = 90; +const unsigned char SOCKS4_REPLY_FAILED = 91; +const unsigned char SOCKS4_REPLY_FAILED_NO_IDENTD = 92; +const unsigned char SOCKS4_REPLY_FAILED_DIFFERENT_USERIDS = 93; + +/* + * SOCKS5 protocol implementation according to: + * - RFC-1928: SOCKS Protocol Version 5 + * - RFC-1929: username/password Authentication for SOCKS V5 + * + * Also, for the future :) : + * - RFC-1961: GSS-API Authentication Method for SOCKS Version 5 + * - RFC-1508: Generic Security Service Application Program Interface + * - RFC-1509: Genecic Security Service API: C-bindings + * + */ + +const unsigned char SOCKS5_VERSION = 0x05; + +const unsigned char SOCKS5_AUTH_METHOD_NO_AUTH_REQUIRED = 0x00; +const unsigned char SOCKS5_AUTH_METHOD_GSSAPI = 0x01; +const unsigned char SOCKS5_AUTH_METHOD_USERNAME_PASSWORD = 0x02; +const unsigned char SOCKS5_AUTH_METHOD_NO_ACCEPTABLE_METHODS = 0xFF; + +const unsigned char SOCKS5_AUTH_VERSION_USERNAME_PASSWORD = 0x01; + +const unsigned char SOCKS5_CMD_CONNECT = 0x01; +const unsigned char SOCKS5_CMD_BIND = 0x02; +const unsigned char SOCKS5_CMD_UDP_ASSOCIATE = 0x03; + +const unsigned char SOCKS5_RSV = 0x00; + +const unsigned char SOCKS5_ATYP_IPV4_ADDRESS = 0x01; +const unsigned char SOCKS5_ATYP_DOMAINNAME = 0x03; +const unsigned char SOCKS5_ATYP_IPV6_ADDRESS = 0x04; + +const unsigned char SOCKS5_REPLY_SUCCEED = 0x00; +const unsigned char SOCKS5_REPLY_GENERAL_SERVER_FAILURE = 0x01; +const unsigned char SOCKS5_REPLY_CONNECTION_NOT_ALLOWED = 0x02; +const unsigned char SOCKS5_REPLY_NETWORK_UNREACHABLE = 0x03; +const unsigned char SOCKS5_REPLY_HOST_UNREACHABLE = 0x04; +const unsigned char SOCKS5_REPLY_CONNECTION_REFUSED = 0x05; +const unsigned char SOCKS5_REPLY_TTL_EXPIRED = 0x06; +const unsigned char SOCKS5_REPLY_COMMAND_NOT_SUPPORTED = 0x07; +const unsigned char SOCKS5_REPLY_ATYP_NOT_SUPPORTED = 0x08; + +//------------------------------------------------------------------------------ +// CProxyType +//------------------------------------------------------------------------------ + +/* + * These constants must match the integer values saved in the configuration file, + * DO NOT CHANGE THIS ORDER!!! + */ +enum CProxyType { + PROXY_NONE = -1, + PROXY_SOCKS5, + PROXY_SOCKS4, + PROXY_HTTP, + PROXY_SOCKS4a +}; + + +//------------------------------------------------------------------------------ +// CProxyData +//------------------------------------------------------------------------------ +/** + * The ProxyData class will hold information about the proxy server to be used. + */ +class CProxyData +{ +public: + /** + * Default constructor. + */ + CProxyData(); + /** + * Constructor. + * + * @param proxyEnable Whether proxy is enabled or not. + * @param proxyType The type of the proxy server. + * @param proxyHostName The proxy host name or IP address. + * @param proxyPort The proxy port number. + * @param enablePassword Whether authentication should be performed. + * @param userName The user name to authenticate to the server. + * @param password The password to authenticate to the server. + */ + CProxyData( + bool proxyEnable, + CProxyType proxyType, + const wxString &proxyHostName, + unsigned short proxyPort, + bool enablePassword, + const wxString &userName, + const wxString &password + ); + /** + * Clears the object contents. + */ + void Clear(); + +public: + //! Whether proxy is enabled or not. + bool m_proxyEnable; + //! The type of the proxy server. + CProxyType m_proxyType; + //! The proxy host name or IP address. + wxString m_proxyHostName; + //! The proxy port number. + unsigned short m_proxyPort; + //! Whether authentication should be performed. + bool m_enablePassword; + //! The user name to authenticate to the server. + wxString m_userName; + //! The password to authenticate to the server. + wxString m_password; +}; + +//------------------------------------------------------------------------------ +// CProxyEventHandler +//------------------------------------------------------------------------------ +/** + * Event handler object used during proxy negotiation. + */ +class CProxyEventHandler : public wxEvtHandler { +public: + /** + * Constructor. + */ + CProxyEventHandler(); + +private: + /** + * Event handler function. + */ + void ProxySocketHandler(wxSocketEvent &event); + DECLARE_EVENT_TABLE() +}; + +//------------------------------------------------------------------------------ +// CProxyStateMachine +//------------------------------------------------------------------------------ +/* This size is just to be a little bit greater than the UDP buffer used in aMule. + * Proxy protocol needs much less than this. 1024 would be ok. Other options are + * - Default ethernet MTU - Eth-II - IP - UDP: 1,514 - 14 - 20 - 8 = 1472 bytes; + * - Default token ring MTU 4,202 - overheads = ??. + * It would be really more efficient if the final object was less than + * a page (4096 bytes) in size. + */ +//const unsigned int PROXY_BUFFER_SIZE = 1024; +const unsigned int PROXY_BUFFER_SIZE = 5*1024; + +enum CProxyCommand { + PROXY_CMD_CONNECT, + PROXY_CMD_BIND, + PROXY_CMD_UDP_ASSOCIATE +}; + +enum CProxyState { + PROXY_STATE_START = 0, + PROXY_STATE_END = 1 +}; + +/** + * The ProxyStateMachine class is the ancestor of all proxy classes. + * + * CProxyStateMachine will do all the common work that a proxy class must do + * and provide the necessary variables. + */ +class CProxyStateMachine : public CStateMachine +{ +public: + /** + * Constructor. + * + * @param name The name of the state machine. For debug messages only. + * @param max_states The maximum number of states that this machine will have. + * @param proxyData The necessary proxy information. + * @param cmd The type of proxy command to run. + */ + CProxyStateMachine( + wxString name, + const unsigned int max_states, + const CProxyData &proxyData, + CProxyCommand cmd); + /** + * Destructor. + */ + virtual ~CProxyStateMachine(); + /** + * Adds a small string to the state machine name, containing the proxy command. + * + * @param s The original state machine name. + * @param cmd The proxy command. + */ + static wxString &NewName(wxString &s, CProxyCommand cmd); + + /* Interface */ + bool Start(const wxIPaddress &peerAddress, wxSocketClient *proxyClientSocket); + t_sm_state HandleEvent(t_sm_event event); + void AddDummyEvent(); + void ReactivateSocket(); + char *GetBuffer() { return m_buffer; } + wxIPaddress &GetProxyBoundAddress(void) const { return *m_proxyBoundAddress; } + unsigned char GetLastReply(void) const { return m_lastReply; } + bool IsEndState() const { return GetState() == PROXY_STATE_END; } + +protected: + wxSocketBase &ProxyWrite(wxSocketBase &socket, const void *buffer, wxUint32 nbytes); + wxSocketBase &ProxyRead(wxSocketBase &socket, void *buffer); +#ifndef AMULE_DAEMON + bool CanReceive() const { return m_canReceive; }; + bool CanSend() const { return m_canSend; }; +#else + bool CanReceive() const { return true; }; + bool CanSend() const { return true; }; +#endif + // + // Initialized at constructor + // + const CProxyData &m_proxyData; + CProxyCommand m_proxyCommand; + // + // Member variables + // + char m_buffer[PROXY_BUFFER_SIZE]; + bool m_isLost; + bool m_isConnected; + bool m_canReceive; + bool m_canSend; + bool m_ok; + unsigned int m_lastRead; + unsigned int m_lastWritten; + wxSocketError m_lastError; + // + // Will be initialized at Start() + // + wxIPaddress *m_peerAddress; + wxSocketClient *m_proxyClientSocket; + wxIPaddress *m_proxyBoundAddress; + amuleIPV4Address m_proxyBoundAddressIPV4; + //wxIPV6address m_proxyBoundAddressIPV6; + // + // Temporary variables + // + unsigned char m_lastReply; + unsigned int m_packetLenght; +}; + +//------------------------------------------------------------------------------ +// CSocks5StateMachine +//------------------------------------------------------------------------------ +class CSocks5StateMachine; +typedef void (CSocks5StateMachine::*Socks5StateProcessor)(bool entry); +class CSocks5StateMachine : public CProxyStateMachine +{ +private: + static const unsigned int SOCKS5_MAX_STATES = 14; + + enum Socks5State { + SOCKS5_STATE_START = PROXY_STATE_START, + SOCKS5_STATE_END = PROXY_STATE_END, + SOCKS5_STATE_SEND_QUERY_AUTHENTICATION_METHOD, + SOCKS5_STATE_RECEIVE_AUTHENTICATION_METHOD, + SOCKS5_STATE_PROCESS_AUTHENTICATION_METHOD, + SOCKS5_STATE_SEND_AUTHENTICATION_GSSAPI, + SOCKS5_STATE_RECEIVE_AUTHENTICATION_GSSAPI, + SOCKS5_STATE_PROCESS_AUTHENTICATION_GSSAPI, + SOCKS5_STATE_SEND_AUTHENTICATION_USERNAME_PASSWORD, + SOCKS5_STATE_RECEIVE_AUTHENTICATION_USERNAME_PASSWORD, + SOCKS5_STATE_PROCESS_AUTHENTICATION_USERNAME_PASSWORD, + SOCKS5_STATE_SEND_COMMAND_REQUEST, + SOCKS5_STATE_RECEIVE_COMMAND_REPLY, + SOCKS5_STATE_PROCESS_COMMAND_REPLY + }; + +public: + /* Constructor */ + CSocks5StateMachine( + const CProxyData &proxyData, + CProxyCommand proxyCommand); + void process_state(t_sm_state state, bool entry); + t_sm_state next_state(t_sm_event event); + +private: + /* State Processors */ + void process_start(bool entry); + void process_send_query_authentication_method(bool entry); + void process_receive_authentication_method(bool entry); + void process_process_authentication_method(bool entry); + void process_send_authentication_gssapi(bool entry); + void process_receive_authentication_gssapi(bool entry); + void process_process_authentication_gssapi(bool entry); + void process_send_authentication_username_password(bool entry); + void process_receive_authentication_username_password(bool entry); + void process_process_authentication_username_password(bool entry); + void process_send_command_request(bool entry); + void process_receive_command_reply(bool entry); + void process_process_command_reply(bool entry); + void process_end(bool entry); + /* Private Vars */ + Socks5StateProcessor m_process_state[SOCKS5_MAX_STATES]; + wxString m_state_name[SOCKS5_MAX_STATES]; +}; + +//------------------------------------------------------------------------------ +// CSocks4StateMachine +//------------------------------------------------------------------------------ +class CSocks4StateMachine; +typedef void (CSocks4StateMachine::*Socks4StateProcessor)(bool entry); +class CSocks4StateMachine : public CProxyStateMachine +{ +private: + static const unsigned int SOCKS4_MAX_STATES = 5; + + enum Socks4State { + SOCKS4_STATE_START = PROXY_STATE_START, + SOCKS4_STATE_END = PROXY_STATE_END, + SOCKS4_STATE_SEND_COMMAND_REQUEST, + SOCKS4_STATE_RECEIVE_COMMAND_REPLY, + SOCKS4_STATE_PROCESS_COMMAND_REPLY + }; + +public: + /* Constructor */ + CSocks4StateMachine( + const CProxyData &proxyData, + CProxyCommand proxyCommand); + void process_state(t_sm_state state, bool entry); + t_sm_state next_state(t_sm_event event); + +private: + /* State Processors */ + void process_start(bool entry); + void process_send_command_request(bool entry); + void process_receive_command_reply(bool entry); + void process_process_command_reply(bool entry); + void process_end(bool entry); + /* Private Vars */ + Socks4StateProcessor m_process_state[SOCKS4_MAX_STATES]; + wxString m_state_name[SOCKS4_MAX_STATES]; +}; + +//------------------------------------------------------------------------------ +// CHttpStateMachine +//------------------------------------------------------------------------------ +class CHttpStateMachine; +typedef void (CHttpStateMachine::*HttpStateProcessor)(bool entry); +class CHttpStateMachine : public CProxyStateMachine +{ +private: + static const unsigned int HTTP_MAX_STATES = 5; + + enum HttpState { + HTTP_STATE_START = PROXY_STATE_START, + HTTP_STATE_END = PROXY_STATE_END, + HTTP_STATE_SEND_COMMAND_REQUEST, + HTTP_STATE_RECEIVE_COMMAND_REPLY, + HTTP_STATE_PROCESS_COMMAND_REPLY + }; + +public: + /* Constructor */ + CHttpStateMachine( + const CProxyData &proxyData, + CProxyCommand proxyCommand); + void process_state(t_sm_state state, bool entry); + t_sm_state next_state(t_sm_event event); + +private: + /* State Processors */ + void process_start(bool entry); + void process_send_command_request(bool entry); + void process_receive_command_reply(bool entry); + void process_process_command_reply(bool entry); + void process_end(bool entry); + /* Private Vars */ + HttpStateProcessor m_process_state[HTTP_MAX_STATES]; + wxString m_state_name[HTTP_MAX_STATES]; +}; + +//------------------------------------------------------------------------------ +// CProxySocket +//------------------------------------------------------------------------------ + +class CDatagramSocketProxy; + +class CProxySocket : public wxSocketClient +{ +friend class CProxyEventHandler; +public: + /* Constructor */ + CProxySocket( + wxSocketFlags flags = wxSOCKET_NONE, + const CProxyData *proxyData = NULL, + CProxyCommand proxyCommand = PROXY_CMD_CONNECT, + CDatagramSocketProxy *udpSocket = NULL); + + /* Destructor */ + ~CProxySocket(); + + /* I know, this is not very good, because SetEventHandler is not + * virtual in wxSocketBase, but I need to GetEventHandler in Proxy.cpp, + * so... + */ + void SetEventHandler(wxEvtHandler &handler, int id = wxID_ANY) + { + m_socketEventHandler = &handler; + m_socketEventHandlerId = id; + wxSocketClient::SetEventHandler(handler, id); + } + wxEvtHandler *GetEventHandler(void) const { return m_socketEventHandler; } + int GetEventHandlerId(void) const { return m_socketEventHandlerId; } + void SaveEventHandler(void) + { + m_savedSocketEventHandler = m_socketEventHandler; + m_savedSocketEventHandlerId = m_socketEventHandlerId; + } + void RestoreEventHandler(void) + { + m_socketEventHandler = m_savedSocketEventHandler; + m_socketEventHandlerId = m_savedSocketEventHandlerId; + SetEventHandler(*m_socketEventHandler, m_socketEventHandlerId); + } + + /* Interface */ + void SetProxyData(const CProxyData *proxyData); + bool GetUseProxy() const { return m_useProxy; } + char *GetBuffer() { return m_proxyStateMachine->GetBuffer(); } + wxIPaddress &GetProxyBoundAddress(void) const + { return m_proxyStateMachine->GetProxyBoundAddress(); } + bool Start(const wxIPaddress &peerAddress); + bool ProxyIsCapableOf(CProxyCommand proxyCommand) const; + bool ProxyNegotiationIsOver() const { return m_proxyStateMachine->IsEndState(); } + CDatagramSocketProxy *GetUDPSocket() const { return m_udpSocket; } + +private: + bool m_useProxy; + CProxyData m_proxyData; + amuleIPV4Address m_proxyAddress; + CProxyStateMachine *m_proxyStateMachine; + CDatagramSocketProxy *m_udpSocket; + wxEvtHandler *m_socketEventHandler; + int m_socketEventHandlerId; + wxEvtHandler *m_savedSocketEventHandler; + int m_savedSocketEventHandlerId; +}; + +//------------------------------------------------------------------------------ +// CSocketClientProxy +//------------------------------------------------------------------------------ + +class CSocketClientProxy : public CProxySocket +{ +public: + /* Constructor */ + CSocketClientProxy( + wxSocketFlags flags = wxSOCKET_NONE, + const CProxyData *proxyData = NULL); + + /* Interface */ + bool Connect(wxIPaddress &address, bool wait); + CSocketClientProxy& Read(void *buffer, wxUint32 nbytes); + CSocketClientProxy& Write(const void *buffer, wxUint32 nbytes); + +private: + wxMutex m_socketLocker; +}; + +//------------------------------------------------------------------------------ +// CSocketServerProxy +//------------------------------------------------------------------------------ + +class CSocketServerProxy : public wxSocketServer +{ +public: + /* Constructor */ + CSocketServerProxy( + wxIPaddress &address, + wxSocketFlags flags = wxSOCKET_NONE, + const CProxyData *proxyData = NULL); + + /* Interface */ + CSocketServerProxy& Read(void *buffer, wxUint32 nbytes); + CSocketServerProxy& Write(const void *buffer, wxUint32 nbytes); + +private: + wxMutex m_socketLocker; +}; + +//------------------------------------------------------------------------------ +// CDatagramSocketProxy +//------------------------------------------------------------------------------ + +enum UDPOperation { + UDP_OPERATION_NONE, + UDP_OPERATION_RECV_FROM, + UDP_OPERATION_SEND_TO +}; + +const unsigned int PROXY_UDP_OVERHEAD_IPV4 = 10; +const unsigned int PROXY_UDP_OVERHEAD_DOMAIN_NAME = 262; +const unsigned int PROXY_UDP_OVERHEAD_IPV6 = 20; +const unsigned int PROXY_UDP_MAXIMUM_OVERHEAD = PROXY_UDP_OVERHEAD_DOMAIN_NAME; + +class CDatagramSocketProxy : public wxDatagramSocket +{ +public: + /* Constructor */ + CDatagramSocketProxy( + wxIPaddress &address, + wxSocketFlags flags = wxSOCKET_NONE, + const CProxyData *proxyData = NULL); + + /* Destructor */ + ~CDatagramSocketProxy(); + + /* Interface */ + void SetUDPSocketOk() { m_udpSocketOk = true; } + + /* wxDatagramSocket Interface */ + virtual wxDatagramSocket& RecvFrom( + wxSockAddress& addr, void* buf, wxUint32 nBytes ); + virtual wxDatagramSocket& SendTo( + wxIPaddress& addr, const void* buf, wxUint32 nBytes ); + virtual wxUint32 LastCount(void) const; + +private: + bool m_udpSocketOk; + CProxySocket m_proxyTCPSocket; + enum UDPOperation m_lastUDPOperation; + unsigned int m_lastUDPOverhead; + wxMutex m_socketLocker; +}; + +/******************************************************************************/ + +#endif /* __PROXY_H__ */ + +// File_checked_for_headers diff --git a/src/RC4Encrypt.cpp b/src/RC4Encrypt.cpp new file mode 100644 index 00000000..cf897ba5 --- /dev/null +++ b/src/RC4Encrypt.cpp @@ -0,0 +1,153 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "RC4Encrypt.h" +#include + +#include + +CRC4EncryptableBuffer::CRC4EncryptableBuffer() : m_encrypted(false), m_hasKey(false), m_key() +{ +} + + +CRC4EncryptableBuffer::~CRC4EncryptableBuffer() +{ +} + +void CRC4EncryptableBuffer::Append(const uint8* buffer, int n) +{ + wxASSERT(!m_encrypted); + if (!m_encrypted) { + CMemFile::Append(buffer, n); + } else { + throw std::runtime_error( + "(CRC4EncryptableBuffer::Append): " + "Tryed to append data to an encrypted buffer."); + } +} + + +void CRC4EncryptableBuffer::Encrypt() +{ + wxASSERT(!m_encrypted); + // This is not optimal. At all. + int n = GetLength(); + std::vector orig_buffer(n); + memcpy(&(orig_buffer[0]), GetRawBuffer(), n); + RC4Crypt(&(orig_buffer[0]), GetRawBuffer(), n); + //DumpMem(orig_buffer, n, wxT("Orig buffer: ")); + //DumpMem(GetRawBuffer() ,n, wxT("Encrypted buffer: ")); + m_encrypted = true; +} + +void CRC4EncryptableBuffer::RC4Crypt( const uint8 *pachIn, uint8 *pachOut, uint32 nLen) +{ + wxASSERT( m_hasKey && nLen > 0 ); + + if (m_hasKey) { + uint8 byX = m_key.byX;; + uint8 byY = m_key.byY; + uint8* pabyState = &m_key.abyState[0];; + uint8 byXorIndex; + + for (uint32 i = 0; i < nLen; ++i) { + byX = (byX + 1) % 256; + byY = (pabyState[byX] + byY) % 256; + std::swap(pabyState[byX], pabyState[byY]); + byXorIndex = (pabyState[byX] + pabyState[byY]) % 256; + + if (pachIn != NULL) { + pachOut[i] = pachIn[i] ^ pabyState[byXorIndex]; + } + } + + m_key.byX = byX; + m_key.byY = byY; + } else { + throw std::runtime_error( + "(CRC4EncryptableBuffer::RC4Crypt): " + "Encrypt() has been called without a previous call" + "to SetKey()."); + } +} + +uint8 *CRC4EncryptableBuffer::Detach() +{ + int n = GetLength(); + uint8 *ret = new uint8[n]; + memcpy(ret, GetRawBuffer(), n); + ResetData(); + m_encrypted = false; + return ret; +} + + +void CRC4EncryptableBuffer::SetKey(const MD5Sum& keyhash, bool bSkipDiscard) +{ + wxASSERT(!m_hasKey); + if (!m_hasKey) { + m_hasKey = true; + RC4CreateKey( keyhash.GetRawHash(), 16, bSkipDiscard); + } else { + throw std::runtime_error( "(CRC4EncryptableBuffer::SetKey): SetKey() has been called twice."); + } +} + + +void CRC4EncryptableBuffer::RC4CreateKey(const uint8* pachKeyData, uint32 nLen, bool bSkipDiscard) +{ + uint8 index1; + uint8 index2; + uint8* pabyState; + + pabyState= &m_key.abyState[0]; + for (int i = 0; i < 256; ++i) { + pabyState[i] = (uint8)i; + } + + m_key.byX = 0; + m_key.byY = 0; + index1 = 0; + index2 = 0; + + for (int i = 0; i < 256; ++i) { + index2 = (pachKeyData[index1] + pabyState[i] + index2) % 256; + std::swap(pabyState[i], pabyState[index2]); + index1 = (uint8)((index1 + 1) % nLen); + } + + if (!bSkipDiscard) { + RC4Crypt(NULL, NULL, 1024); + } +} + +void CRC4EncryptableBuffer::ResetData() +{ + m_encrypted = false; + // Should we clear the keys? + CMemFile::ResetData(); +} diff --git a/src/RC4Encrypt.h b/src/RC4Encrypt.h new file mode 100644 index 00000000..b3f8c7f7 --- /dev/null +++ b/src/RC4Encrypt.h @@ -0,0 +1,91 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef __RC4ENCRYPT_H__ +#define __RC4ENCRYPT_H__ + + +#include + + +#include "Types.h" +#include +#include "MemFile.h" + +// Helper class + +class MD5Sum; + +class RC4_Key_Struct +{ +public: + uint8 abyState[256]; + uint8 byX; + uint8 byY; + +public: + RC4_Key_Struct() {} + ~RC4_Key_Struct() {} +}; + + +class CRC4EncryptableBuffer : public CMemFile +{ +public: + // Create, empty + CRC4EncryptableBuffer(); + + // Clear memory + ~CRC4EncryptableBuffer(); + + // Appends to the end, checking encrypted state. + void Append(const uint8* buffer, int n); + + // Sets the encryption key + void SetKey(const MD5Sum& keyhash, bool bSkipDiscard = false); + + // RC4 encrypts the internal buffer. Marks it as encrypted, any other further call + // to add data, as Append(), must assert if the inner data is encrypted. + // Make sure to check SetKey has been called! + void Encrypt(); + + // RC4 encrypts an external buffer with the current key. + void RC4Crypt(const uint8 *pachIn, uint8 *pachOut, uint32 nLen); + + // Returns a uint8* buffer with a copy of the internal data, and clears the internal one. + uint8* Detach(); + + // Also clears the encryption flag + void ResetData(); + +private: + bool m_encrypted; + bool m_hasKey; + RC4_Key_Struct m_key; + + void RC4CreateKey(const uint8* pachKeyData, uint32 nLen, bool bSkipDiscard); +}; + +#endif // __RC4ENCRYPT_H__ diff --git a/src/RLE.cpp b/src/RLE.cpp new file mode 100644 index 00000000..53bd3e27 --- /dev/null +++ b/src/RLE.cpp @@ -0,0 +1,200 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "RLE.h" +#include "ArchSpecific.h" + + +/* + * RLE encoder implementation. This is RLE implementation for very specific + * purpose: encode DIFFERENCE between subsequent states of status bar. + * + * This difference is calculated by xor-ing with previous data + * + * We can't use implementation with "control char" since this encoder + * will process binary data - not ascii (or unicode) strings + */ +RLE_Data::RLE_Data(int len, bool use_diff) +{ + m_len = len; + m_use_diff = use_diff; + + m_buff = new unsigned char[m_len]; + memset(m_buff, 0, m_len); + // + // in worst case 2-byte sequence encoded as 3. So, data can grow at 1/3 + m_enc_buff = new unsigned char[m_len*4/3 + 1]; +} + +RLE_Data::RLE_Data() +{ + m_buff = 0; + m_enc_buff = 0; + m_len = 0; + m_use_diff = 0; +} + +RLE_Data::RLE_Data(const RLE_Data &obj) +{ + m_len = obj.m_len; + m_use_diff = obj.m_use_diff; + + m_buff = new unsigned char[m_len]; + memcpy(m_buff, obj.m_buff, m_len); + + m_enc_buff = new unsigned char[m_len*4/3 + 1]; +} + +RLE_Data &RLE_Data::operator=(const RLE_Data &obj) +{ + m_len = obj.m_len; + + m_use_diff = obj.m_use_diff; + + m_buff = new unsigned char[m_len]; + memcpy(m_buff, obj.m_buff, m_len); + + m_enc_buff = new unsigned char[m_len*4/3 + 1]; + + return *this; +} + +RLE_Data::~RLE_Data() +{ + if ( m_buff ) { + delete [] m_buff; + } + if ( m_enc_buff ) { + delete [] m_enc_buff; + } +} + +void RLE_Data::Realloc(int size) +{ + if ( size == m_len ) { + return; + } + + unsigned char *buff = new unsigned char[size]; + if ( size > m_len ) { + memset(buff + m_len, 0, size - m_len); + memcpy(buff, m_buff, m_len); + } else { + memcpy(buff, m_buff, size); + } + delete [] m_buff; + m_buff = buff; + + buff = new unsigned char[size*4/3 + 1]; + if ( size > m_len ) { + memset(buff + m_len*4/3 + 1, 0, (size - m_len)*4/3); + memcpy(buff, m_enc_buff, m_len*4/3 + 1); + } else { + memcpy(buff, m_enc_buff, size*4/3 + 1); + } + delete [] m_enc_buff; + m_enc_buff = buff; + + m_len = size; +} + +const unsigned char *RLE_Data::Decode(const unsigned char *buff, int len) +{ + // + // Open RLE + // + + int i = 0, j = 0; + while ( j != m_len ) { + + if ( i < (len -1) ) { + if (buff[i+1] == buff[i]) { + // this is sequence + memset(m_enc_buff + j, buff[i], buff[i + 2]); + j += buff[i + 2]; + i += 3; + } else { + // this is single byte + m_enc_buff[j++] = buff[i++]; + } + } else { + // only 1 byte left in encoded data - it can't be sequence + m_enc_buff[j++] = buff[i++]; + // if there's no more data, but buffer end is not reached, + // it must be error in some point + if ( j != m_len ) { + printf("RLE_Data: decoding error. %d bytes decoded to %d instead of %d\n", len, j, m_len); + } + break; + } + } + // + // Recreate data from diff + // + if ( m_use_diff ) { + for (int k = 0; k < m_len; k++) { + m_buff[k] ^= m_enc_buff[k]; + } + } + + return m_buff; +} + +void PartFileEncoderData::Decode(unsigned char *gapdata, int gaplen, unsigned char *partdata, int partlen) +{ + m_part_status.Decode(partdata, partlen); + + // in a first dword - real size + uint32 gapsize = ENDIAN_NTOHL( RawPeekUInt32( gapdata ) ); + gapdata += sizeof(uint32); + m_gap_status.Realloc(gapsize*2*sizeof(uint64)); + + m_gap_status.Decode(gapdata, gaplen - sizeof(uint32)); +} + +unsigned char RLE_Data_BV::m_buff[256]; + +RLE_Data_BV::RLE_Data_BV(int len) : m_last_buff(len) +{ +} + +int RLE_Data_BV::Encode(std::vector &data) +{ + unsigned char *curr = m_buff; + std::vector::const_iterator i = data.begin(); + std::vector::const_iterator j = m_last_buff.begin(); + while( i != data.end() ) { + unsigned char count = 0; + while ( (i != data.end()) && ( (*i ^ *j) == false) ) { + count++; + i++; + j++; + } + *curr++ = count; + } + m_last_buff = data; + return 0; +} + +// File_checked_for_headers diff --git a/src/RLE.h b/src/RLE.h new file mode 100644 index 00000000..0ba03c6d --- /dev/null +++ b/src/RLE.h @@ -0,0 +1,210 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef RLE_H +#define RLE_H + + +#include "Types.h" + +/*! + * General purpose RLE implementation. Just encode or create + * differential data with previous + */ +class RLE_Data +{ +public: + RLE_Data(int len, bool use_diff); + + // those constructors are for stl containers + RLE_Data(); + RLE_Data(const RLE_Data &); + RLE_Data &operator=(const RLE_Data &); + + ~RLE_Data(); + + const unsigned char *Encode(unsigned char *data, int &outlen) + { + return EncodeT(data, m_len, outlen); + } + + const unsigned char *Encode(ArrayOfUInts16 &data, int &outlen) + { + return EncodeT(data, data.size(), outlen); + } + + const unsigned char *Decode(const unsigned char *data, int len); + + void ResetEncoder() + { + memset(m_buff, 0, m_len); + } + + // change size of internal buffers + void Realloc(int size); + + // decoder will need access to data + const unsigned char *Buffer() { return m_buff; } + int Size() { return m_len; } + +private: + unsigned char *m_buff, *m_enc_buff; + bool m_use_diff; + int m_len, m_enc_len; + + // data is bounded by srclen. everything above considered == 0 + template const unsigned char *EncodeT(T &buff, int srclen, int &outlen) + { + // + // calculate difference from prev + // + if ( m_use_diff ) { + for (int i = 0; i < m_len; i++) { + m_buff[i] ^= (i < srclen ) ? ((unsigned char)buff[i]) : 0; + } + } else { + // + // can't use memcpy - in case of generic class T this + // will rely on "operator []" implementation + for(int i = 0; i < m_len;i++) { + m_buff[i] = (i < srclen ) ? ((unsigned char)buff[i]) : 0; + } + } + + // + // now RLE + // + int i = 0, j = 0; + while ( i != m_len ) { + unsigned char curr_val = m_buff[i]; + int seq_start = i; + while ( (i != m_len) && (curr_val == m_buff[i]) && ((i - seq_start) < 0xff)) { + i++; + } + if (i - seq_start > 1) { + // if there's 2 or more equal vals - put it twice in stream + m_enc_buff[j++] = curr_val; + m_enc_buff[j++] = curr_val; + m_enc_buff[j++] = i - seq_start; + } else { + // single value - put it as is + m_enc_buff[j++] = curr_val; + } + } + + outlen = j; + + // + // If using differential encoder, remember current data for + // later use + if ( m_use_diff ) { + // + // can't use memcpy - in case of generic class T this + // will rely on "operator []" implementation + for(int k = 0; k < m_len;k++) { + m_buff[k] = (k < srclen ) ? ((unsigned char)buff[k]) : 0; + } + } + + return m_enc_buff; + } +}; + + +/* + * Another implementation of RLE, optimized for bit-vector. In this RLE flavor we + * have only 2 values, so we don't need to transmit the value itself. Since most + * of the time, bitmap will contail all zeros with few 1's, only zeros will be encoded. + * Meaning that '0000110010000' is encoded as '4024' + */ +class RLE_Data_BV +{ +public: + RLE_Data_BV(int len); + RLE_Data_BV(); + RLE_Data_BV(const RLE_Data_BV &); + + ~RLE_Data_BV(); + + RLE_Data_BV &operator=(const RLE_Data_BV &); + + int Encode(std::vector &data); + void Decode(unsigned char *data, int datalen, std::vector &outbuff); + + const unsigned char *Buffer() { return m_buff; } +private: + // maximum file size in amule is 4G since it uses uint32 as filesize. So, it + // can be up to 4Gb/PARTSIZE=442 parts. Worst case is 1/0 interleaving, + // producing 221 byte RLE encoded output. + static unsigned char m_buff[256]; + + std::vector m_last_buff; + + void Realloc(int size); +}; + + +/*! + * Data difference is different for each EC client + */ +class PartFileEncoderData { +public: + RLE_Data m_part_status; + RLE_Data m_gap_status; + + // + // Encoder may reset history if full info requested + void ResetEncoder() + { + m_part_status.ResetEncoder(); + m_gap_status.ResetEncoder(); + } + + // + // decoder side - can be used everywhere + void Decode(unsigned char *gapdata, int gaplen, unsigned char *partdata, int partlen); + + PartFileEncoderData() { } + PartFileEncoderData(int part_count, int gap_count) : + m_part_status(part_count, true), m_gap_status(gap_count*sizeof(uint64), true) + { + } + + // for stl + PartFileEncoderData(const PartFileEncoderData &obj) : + m_part_status(obj.m_part_status), m_gap_status(obj.m_gap_status) + { + } + + PartFileEncoderData &operator=(const PartFileEncoderData &obj) + { + m_part_status = obj.m_part_status; + m_gap_status = obj.m_gap_status; + return *this; + } +}; + +#endif + +// File_checked_for_headers diff --git a/src/RandomFunctions.cpp b/src/RandomFunctions.cpp new file mode 100644 index 00000000..7351599e --- /dev/null +++ b/src/RandomFunctions.cpp @@ -0,0 +1,49 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// The backtrace functions contain modified code from libYaMa, (c) Venkatesha Murthy G. +// You can check libYaMa at http://personal.pavanashree.org/libyama/ + +#include "RandomFunctions.h" // Interface declarations + +static CryptoPP::AutoSeededRandomPool cryptRandomGen; + +const CryptoPP::AutoSeededRandomPool& GetRandomPool() { return cryptRandomGen; } + +uint8 GetRandomUint8() +{ + return cryptRandomGen.GenerateByte(); +} + +uint16 GetRandomUint16() +{ + return (uint16)cryptRandomGen.GenerateWord32(0x0000, 0xFFFF); +} + +uint32 GetRandomUint32() +{ + return cryptRandomGen.GenerateWord32(); +} + +// File_checked_for_headers diff --git a/src/RandomFunctions.h b/src/RandomFunctions.h new file mode 100644 index 00000000..3ea56848 --- /dev/null +++ b/src/RandomFunctions.h @@ -0,0 +1,42 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef RANDOMFUNCTIONS_H +#define RANDOMFUNCTIONS_H + +#include "Types.h" // Needed for uint16, uint32 and uint64 +#include "CryptoPP_Inc.h" // Needed for Crypto functions + +/* + * Random numbers generation + */ + +const CryptoPP::AutoSeededRandomPool& GetRandomPool(); + +uint8 GetRandomUint8(); +uint16 GetRandomUint16(); +uint32 GetRandomUint32(); + +#endif // RANDOMFUNCTIONS_H +// File_checked_for_headers diff --git a/src/RangeMap.h b/src/RangeMap.h new file mode 100644 index 00000000..16cb6f9d --- /dev/null +++ b/src/RangeMap.h @@ -0,0 +1,591 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Mikkel Schubert ( xaignar@users.sourceforge.net ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef RANGEMAP_H +#define RANGEMAP_H + +#include + +#include + + + +/** + * Default helper structure for normal CRangeMap instantations. + * + * Specializations should must have the following properties. + * - The four value typedefs (see comments for details). + * - A template-defined member variable named 'first'. + * - A comparison operator that doesn't consider the 'first' field. + * + * The typedefs are used to specify the return values of iterators. + */ +template +struct CRangeMapHelper +{ + //! Typedef specifying the type to use when a non-const pointer is expected. + typedef VALUE* ValuePtr; + //! Typedef specifying the type to use when a non-const referenecs is expected. + typedef VALUE& ValueRef; + //! Typedef specifying the type to use when a const referenecs is expected. + typedef const VALUE& ConstValueRef; + //! Typedef specifying the type to use when a const pointer is expected. + typedef const VALUE* ConstValuePtr; + + //! Used internally by CRangeMap to specify the end of a range. + KEYTYPE first; + //! Contains the value of a given range. + VALUE second; + + //! Compares the user-values of this range with another. + bool operator==(const CRangeMapHelper& o) const { + return second == o.second; + } +}; + + +/** + * Helper structure for CRangeSet (CRangeMap with void as value). + */ +template +struct CRangeMapHelper +{ + typedef void ValuePtr; + typedef void ValueRef; + typedef void ConstValueRef; + typedef void ConstValuePtr; + + KEYTYPE first; + + bool operator==(const CRangeMapHelper&) const { + return true; + } +}; + + +/** + * This class represents a map of non-overlapping ranges. + * + * Each range has a user-specified value associated. The map supports quick + * lookup of which range covers a particular key-value, and will merge or + * split existing ranges when new ranges are added. + * + * The decision on whenever to split/resize a range or to merge the two ranges + * involved is based on equality of the user-specified value, using the + * equality operator. Thus if two ranges with the same user-value are placed + * adjacent to each other or partially overlapping each other, then they will + * be merged into a single range. If the user-values of the two ranges are + * different, then the old range will be either resized or split, based on the + * position of the new range. + * + * In cases where ranges are split into two parts, copies will be made of the + * user-specified value, such that each new part contains the same user-value. + * + * It is currently not possible to manipulate existing ranges by hand, other + * than by erasing and then re-inserting them. + * + * A specialization of this class exists (typedef'd as CRangeSet), which does + * not assosiate a value with each range. + * + * NOTE: KEYTYPE is assumed to be an unsigned integer type! + */ +template +class CRangeMap +{ + typedef CRangeMapHelper HELPER; +private: + //! The map uses the start-key as key and the User-value and end-key pair as value + typedef std::map RangeMap; + //! Shortcut for the pair used by the RangeMap. + typedef std::pair RangePair; + + //! Typedefs used to distinguish between our custom iterator and the real ones. + typedef typename RangeMap::iterator RangeIterator; + typedef typename RangeMap::const_iterator ConstRangeIterator; + + //! The raw map of range values. + RangeMap m_ranges; + + /** + * This class provides a wrapper around the raw iterators used by CRangeMap. + * + * It will act as a normal iterator and also give access the the range values. + * When used as a per normal, it will return the value specified by the user + * for that range. + * + * Special member-functions are keyStart() and keyEnd(). + */ + template + class iterator_base { + friend class CRangeMap; + public: + iterator_base( const RealIterator& it ) + : m_it( it ) + { + } + + //! Equality operator + bool operator==( const iterator_base& other ) const { + return m_it == other.m_it; + } + + //! Non-equality operator + bool operator!=( const iterator_base& other ) const { + return m_it != other.m_it; + } + + + //! Returns the starting point of the range + KEYTYPE keyStart() const { + return m_it->first; + } + + //! Returns the end-point of the range + KEYTYPE keyEnd() const { + return m_it->second.first; + } + + + //! Prefix increment. + iterator_base& operator++() { + ++m_it; + + return *this; + } + + //! Postfix increment. + iterator_base operator++(int) { + return iterator_base( m_it++ ); + } + + + //! Prefix decrement. + iterator_base& operator--() { + --m_it; + + return *this; + } + + //! Postfix decrement. + iterator_base operator--(int) { + return iterator_base( m_it-- ); + } + + + //! Deference operator, returning the user-specified value. + ReturnTypeRef operator*() const { + return m_it->second.second; + } + + //! Member access operator, returning the user-specified value. + ReturnTypePtr operator->() const { + return &m_it->second.second; + } + + protected: + //! The raw iterator + RealIterator m_it; + }; + + typedef typename HELPER::ValueRef ValueRef; + typedef typename HELPER::ValuePtr ValuePtr; + typedef typename HELPER::ConstValueRef ConstValueRef; + typedef typename HELPER::ConstValuePtr ConstValuePtr; + +public: + typedef iterator_base iterator; + typedef iterator_base const_iterator; + + //! The type used to specify size, ie size(). + typedef typename RangeMap::size_type size_type; + + //! The type of user-data saved with each range. + typedef VALUE value_type; + + /** + * Default constructor. + */ + CRangeMap() { + } + + /** + * Copy-constructor. + */ + CRangeMap(const CRangeMap& other) + : m_ranges( other.m_ranges ) + { + } + + /** + * Assignment operator. + */ + CRangeMap& operator=(const CRangeMap& other) { + m_ranges = other.m_ranges; + + return *this; + } + + /** + * Swaps the contents of the two rangemaps. + */ + void swap(CRangeMap& other) { + std::swap(m_ranges, other.m_ranges); + } + + + /** + * Equality operator for two ranges. + * + * @returns True if both ranges contain the same ranges and values. + */ + bool operator==( const CRangeMap& other ) const { + // Check if we are comparing with ourselves + if ( this == &other ) { + return true; + } + + // Check size, must be the same + if ( size() != other.size() ) { + return false; + } + + return (m_ranges == other.m_ranges); + } + + + /** + * Returns an iterator pointing to the first range. + */ + iterator begin() { + return m_ranges.begin(); + } + + /** + * Returns an iterator pointing past the last range. + */ + iterator end() { + return m_ranges.end(); + } + + /** + * Returns a const iterator pointing to the first range. + */ + const_iterator begin() const { + return m_ranges.begin(); + } + + /** + * Returns a const iterator pointing past the last range. + */ + const_iterator end() const { + return m_ranges.end(); + } + + + /** + * Erases the specified range and returns the range next to it. + * + * @param pos The iterator of the range to be erased. + * @return The iterator of the range after the erased range. + * + * Attempting to erase the end() iterator is an invalid operation. + */ + iterator erase(iterator pos) { + MULE_VALIDATE_PARAMS(pos != end(), wxT("Cannot erase 'end'")); + + RangeIterator temp = pos.m_it++; + + m_ranges.erase(temp); + + return pos; + } + + + /** + * Returns the number of ranges in the map. + */ + size_type size() const { + return m_ranges.size(); + } + + /** + * Returns true if the map is empty. + */ + bool empty() const { + return m_ranges.empty(); + } + + + /** + * Removes all ranges from the map. + */ + void clear() { + m_ranges.clear(); + } + + + /** + * Returns the range covering the specified key-value. + * + * @param key A value that may or may not be covered by a range. + * @return end() or the iterator of the range covering key. + * + * A range is considered to cover a value if the value is greather than or + * equal to the start-key and less than or equal to the end-key. + */ + // Find the range which contains key (it->first <= key <= it->second->first) + iterator find_range( KEYTYPE key ) { + if ( !m_ranges.empty() ) { + // Find first range whose start comes after key + // Thus: key < it->first, but (--it)->first <= key + RangeIterator it = m_ranges.upper_bound( key ); + + // Our target range must come before the one we found; does it exist? + if ( it != m_ranges.begin() ) { + // Go back to the last range which starts at or before key + it--; + + // Check if this range covers the key + if ( key <= it->second.first ) { + return it; + } + } + } + + return end(); + } + + + void erase_range(KEYTYPE startPos, KEYTYPE endPos) { + // Create default initialized entry, which ensures that all fields are initialized. + HELPER entry = HELPER(); + // Need to set the 'end' field. + entry.first = endPos; + + // Insert without merging, which forces the creation of an entry that + // only covers the specified range, which will crop existing ranges. + erase(do_insert(startPos, entry, false)); + } + + + /** + * Inserts a new range into the map, potentially erasing/changing old ranges. + * + * @param startPos The start position of the range, also considered part of the range. + * @param endPos The end position of the range, also considered part of the range. + * @param object The user-data to be assosiated with the range. + * @return An iterator pointing to the resulting range, covering at least the specified range. + * + * This function inserts the specified range into the map, while overwriting + * or resizing existing ranges if there is any conflict. Ranges might also + * be merged, if the object of each evaluates to being equal, in which case + * the old range will be removed and the new extended to include the old + * range. This also includes ranges placed directly after or in front of each + * other, which will also be merged if their type is the same. + * + * This has the result that the iterator returned can point to a range quite + * different from what was originally specified. If this is not desired, then + * the VALUE type should simply be made to return false on all equality tests. + * Otherwise, the only promise that is made is that the resulting range has + * the same user-data (based on the equality operator) as the what was specified. + * + * Note that the start position must be smaller than or equal to the end-position. + */ + //@{ + iterator insert(KEYTYPE startPos, KEYTYPE endPos) { + HELPER entry = {endPos}; + return do_insert(startPos, entry); + } + template + iterator insert(KEYTYPE startPos, KEYTYPE endPos, const TYPE& value) { + HELPER entry = {endPos, value}; + return do_insert(startPos, entry); + } + //@} + +protected: + /** + * Inserts the specified range. + * + * @param start The starting position of the range. + * @param entry A helper-struct, containing the end position and possibly user-data. + * @param merge Specifies if ranges should be merged when possible. + * @return An iterator pointing to the range covering at least the specified range. + */ + iterator do_insert(KEYTYPE start, HELPER entry, bool merge = true) { + MULE_VALIDATE_PARAMS(start <= entry.first, wxT("Not a valid range.")); + + RangeIterator it = get_insert_it(start); + while ( it != m_ranges.end() ) { + // Begins before the current span + if ( start <= it->first ) { + // Never touches the current span, it follows that start < it->first + // (it->first) is used to avoid checking against (uintXX)-1 by accident + if ( entry.first < it->first - 1 && it->first ) { + break; + } + + // Stops just before the current span, it follows that start < it->first + // (it->first) is used to avoid checking against (uintXX)-1 by accident + else if ( entry.first == it->first - 1 && it->first ) { + // If same type: Merge + if (merge && (entry == it->second)) { + entry.first = it->second.first; + m_ranges.erase( it++ ); + } + + break; + } + + // Covers part of the span + else if ( entry.first < it->second.first ) { + // Same type, merge + if (merge && (entry == it->second)) { + entry.first = it->second.first; + m_ranges.erase( it++ ); + } else { + // Resize the partially covered span and get the next one + it = ++resize( entry.first + 1, it->second.first, it ); + } + + break; + } else { + // It covers the entire span + m_ranges.erase( it++ ); + } + } + + // Starts inside the current span or after the current span + else { + // Starts inside the current span + if ( start <= it->second.first ) { + // Ends inside the current span + if ( entry.first < it->second.first ) { + // Adding a span with same type inside a existing span is fruitless + if (merge && (entry == it->second)) { + return it; + } + + // Insert the new span + m_ranges.insert(it, RangePair(entry.first + 1, it->second)); + + // Resize the current span to fit before the new span + it->second.first = start - 1; + + break; + } else { + // Ends past the current span, resize or merge + if (merge && (entry == it->second)) { + start = it->first; + m_ranges.erase( it++ ); + } else { + // Resize the partially covered span and get the next one + it = ++resize( it->first, start - 1, it ); + } + } + } else { + // Start past the current span + if ( start == it->second.first + 1 ) { + // Touches the current span + if (merge && (entry == it->second)) { + start = it->first; + m_ranges.erase( it++ ); + } else { + ++it; + } + } else { + // Starts after the current span, nothing to do + ++it; + } + } + } + } + + return m_ranges.insert(it, RangePair(start, entry)); + } + + + /** + * Finds the optimal location to start looking for insertion points. + * + * This is the first range whose start comes after the new start. We check + * the last element first, since sequential insertions are commen. + */ + RangeIterator get_insert_it(KEYTYPE start) + { + if ( m_ranges.empty() ) { + return m_ranges.end(); + } + + // The start-key of the last element must be smaller than our start-key + // Otherwise there is the possibility that we can merge with the one before that + RangeIterator it = --m_ranges.end(); + if ( start <= it->first ) { + // If the two starts are equal, then we only need to go back another + // step to see if the range prior to this one is mergeable + if ( start != it->first ) { + it = m_ranges.lower_bound( start ); + } + + if ( it != m_ranges.begin() ) { + // Go back to the last range which starts at or before key + --it; + } + } + + return it; + } + + + //! Helper function that resizes an existing range to the specified size. + RangeIterator resize( KEYTYPE startPos, KEYTYPE endPos, RangeIterator it ) { + HELPER item = it->second; + item.first = endPos; + + m_ranges.erase( it++ ); + + return m_ranges.insert(it, RangePair(startPos, item)); + } +}; + + +//! CRangeSet is simply a partial specialization of CRangeMap +typedef CRangeMap CRangeSet; + + +namespace std +{ + /** @see CRangeMap::swap */ + template + void swap(CRangeMap& a, CRangeMap& b) + { + a.swap(b); + } +} + + + +#endif +// File_checked_for_headers diff --git a/src/SHA.cpp b/src/SHA.cpp new file mode 100644 index 00000000..b1c4f7c1 --- /dev/null +++ b/src/SHA.cpp @@ -0,0 +1,246 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// +// Kry - Modified version of the original SHA.cpp to work on linux and +// use wxWidgets. Original license follows. +// + +/* + --------------------------------------------------------------------------- + Copyright (c) 2002, Dr Brian Gladman , Worcester, UK. + All rights reserved. + + LICENSE TERMS + + The free distribution and use of this software in both source and binary + form is allowed (with or without changes) provided that: + + 1. distributions of this source code include the above copyright + notice, this list of conditions and the following disclaimer; + + 2. distributions in binary form include the above copyright + notice, this list of conditions and the following disclaimer + in the documentation and/or other associated materials; + + 3. the copyright holder's name is not used to endorse products + built using this software without specific written permission. + + ALTERNATIVELY, provided that this notice is retained in full, this product + may be distributed under the terms of the GNU General Public License (GPL), + in which case the provisions of the GPL apply INSTEAD OF those given above. + + DISCLAIMER + + This software is provided 'as is' with no explicit or implied warranties + in respect of its properties, including, but not limited to, correctness + and/or fitness for purpose. + --------------------------------------------------------------------------- + Issue Date: 30/11/2002 + + This is a byte oriented version of SHA1 that operates on arrays of bytes + stored in memory. It runs at 22 cycles per byte on a Pentium P4 processor +*/ + +#include "SHA.h" + + +CSHA::CSHA() +{ + Reset(); +} + +/* + To obtain the highest speed on processors with 32-bit words, this code + needs to determine the order in which bytes are packed into such words. + The following block of code is an attempt to capture the most obvious + ways in which various environemnts specify their endian definitions. + It may well fail, in which case the definitions will need to be set by + editing at the points marked **** EDIT HERE IF NECESSARY **** below. +*/ +#define SHA_LITTLE_ENDIAN 1234 /* byte 0 is least significant (i386) */ +#define SHA_BIG_ENDIAN 4321 /* byte 0 is most significant (mc68k) */ + +#define rotl32(x,n) (((x) << n) | ((x) >> (32 - n))) + +#if (wxBYTE_ORDER == wxBIG_ENDIAN) +#define swap_b32(x) (x) +#elif defined(bswap_32) +#define swap_b32(x) bswap_32(x) +#else +#define swap_b32(x) ((rotl32((x), 8) & 0x00ff00ff) | (rotl32((x), 24) & 0xff00ff00)) +#endif + +#define SHA1_MASK (SHA1_BLOCK_SIZE - 1) + +/* reverse byte order in 32-bit words */ + +#define ch(x,y,z) (((x) & (y)) ^ (~(x) & (z))) +#define parity(x,y,z) ((x) ^ (y) ^ (z)) +#define maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) + +/* A normal version as set out in the FIPS. This version uses */ +/* partial loop unrolling and is optimised for the Pentium 4 */ + +#define rnd(f,k) t = a; a = rotl32(a,5) + f(b,c,d) + e + k + w[i]; e = d; d = c; c = rotl32(b, 30); b = t + +void CSHA::Compile() +{ + uint32 w[80], i, a, b, c, d, e, t; + + /* note that words are compiled from the buffer into 32-bit */ + /* words in big-endian order so an order reversal is needed */ + /* here on little endian machines */ + for(i = 0; i < SHA1_BLOCK_SIZE / 4; ++i) + w[i] = swap_b32(m_nBuffer[i]); + + for(i = SHA1_BLOCK_SIZE / 4; i < 80; ++i) + w[i] = rotl32(w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16], 1); + + a = m_nHash[0]; + b = m_nHash[1]; + c = m_nHash[2]; + d = m_nHash[3]; + e = m_nHash[4]; + + for(i = 0; i < 20; ++i) + { + rnd(ch, 0x5a827999); + } + + for(i = 20; i < 40; ++i) + { + rnd(parity, 0x6ed9eba1); + } + + for(i = 40; i < 60; ++i) + { + rnd(maj, 0x8f1bbcdc); + } + + for(i = 60; i < 80; ++i) + { + rnd(parity, 0xca62c1d6); + } + + m_nHash[0] += a; + m_nHash[1] += b; + m_nHash[2] += c; + m_nHash[3] += d; + m_nHash[4] += e; +} + +void CSHA::Reset() +{ + m_nCount[0] = m_nCount[1] = 0; + m_nHash[0] = 0x67452301; + m_nHash[1] = 0xefcdab89; + m_nHash[2] = 0x98badcfe; + m_nHash[3] = 0x10325476; + m_nHash[4] = 0xc3d2e1f0; +} + +void CSHA::GetHash(CAICHHash& Hash) +{ + /* extract the hash value as bytes in case the hash buffer is */ + /* misaligned for 32-bit words*/ + + wxASSERT( Hash.GetHashSize() == 20 ); + for(int i = 0; i < SHA1_DIGEST_SIZE; ++i) + Hash.GetRawHash()[i] = (unsigned char)(m_nHash[i >> 2] >> 8 * (~i & 3)); +} + +/* SHA1 hash data in an array of bytes into hash buffer and call the */ +/* hash_compile function as required. */ + +void CSHA::Add(const void* pData, uint32 nLength) +{ + const unsigned char* data = (const unsigned char*)pData; + + uint32 pos = (uint32)(m_nCount[0] & SHA1_MASK), + space = SHA1_BLOCK_SIZE - pos; + const unsigned char *sp = data; + + if((m_nCount[0] += nLength) < nLength) + ++(m_nCount[1]); + + while(nLength >= space) /* tranfer whole blocks while possible */ + { + memcpy(((unsigned char*)m_nBuffer) + pos, sp, space); + sp += space; nLength -= space; space = SHA1_BLOCK_SIZE; pos = 0; + Compile(); + } + + memcpy(((unsigned char*)m_nBuffer) + pos, sp, nLength); +} + +/* SHA1 final padding and digest calculation */ + +#if (wxBYTE_ORDER == wxLITTLE_ENDIAN) +static uint32 mask[4] = + { 0x00000000, 0x000000ff, 0x0000ffff, 0x00ffffff }; +static uint32 bits[4] = + { 0x00000080, 0x00008000, 0x00800000, 0x80000000 }; +#else +static uint32 mask[4] = + { 0x00000000, 0xff000000, 0xffff0000, 0xffffff00 }; +static uint32 bits[4] = + { 0x80000000, 0x00800000, 0x00008000, 0x00000080 }; +#endif + +void CSHA::Finish(CAICHHash& Hash) +{ + uint32 i = (uint32)(m_nCount[0] & SHA1_MASK); + + /* mask out the rest of any partial 32-bit word and then set */ + /* the next byte to 0x80. On big-endian machines any bytes in */ + /* the buffer will be at the top end of 32 bit words, on little */ + /* endian machines they will be at the bottom. Hence the AND */ + /* and OR masks above are reversed for little endian systems */ + /* Note that we can always add the first padding byte at this */ + /* because the buffer always contains at least one empty slot */ + m_nBuffer[i >> 2] = (m_nBuffer[i >> 2] & mask[i & 3]) | bits[i & 3]; + + /* we need 9 or more empty positions, one for the padding byte */ + /* (above) and eight for the length count. If there is not */ + /* enough space pad and empty the buffer */ + if(i > SHA1_BLOCK_SIZE - 9) + { + if(i < 60) m_nBuffer[15] = 0; + Compile(); + i = 0; + } + else /* compute a word index for the empty buffer positions */ + i = (i >> 2) + 1; + + while(i < 14) /* and zero pad all but last two positions */ + m_nBuffer[i++] = 0; + + /* assemble the eight byte counter in in big-endian format */ + m_nBuffer[14] = swap_b32((m_nCount[1] << 3) | (m_nCount[0] >> 29)); + m_nBuffer[15] = swap_b32(m_nCount[0] << 3); + + Compile(); + GetHash(Hash); +} +// File_checked_for_headers diff --git a/src/SHA.h b/src/SHA.h new file mode 100644 index 00000000..cc4d3946 --- /dev/null +++ b/src/SHA.h @@ -0,0 +1,94 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// +// Kry - Modified version of the original SHA.cpp to work on linux and +// use wxWidgets. Original license follows. +// + +/* + --------------------------------------------------------------------------- + Copyright (c) 2002, Dr Brian Gladman , Worcester, UK. + All rights reserved. + + LICENSE TERMS + + The free distribution and use of this software in both source and binary + form is allowed (with or without changes) provided that: + + 1. distributions of this source code include the above copyright + notice, this list of conditions and the following disclaimer; + + 2. distributions in binary form include the above copyright + notice, this list of conditions and the following disclaimer + in the documentation and/or other associated materials; + + 3. the copyright holder's name is not used to endorse products + built using this software without specific written permission. + + ALTERNATIVELY, provided that this notice is retained in full, this product + may be distributed under the terms of the GNU General Public License (GPL), + in which case the provisions of the GPL apply INSTEAD OF those given above. + + DISCLAIMER + + This software is provided 'as is' with no explicit or implied warranties + in respect of its properties, including, but not limited to, correctness + and/or fitness for purpose. + --------------------------------------------------------------------------- + Issue Date: 30/11/2002 + + This is a byte oriented version of SHA1 that operates on arrays of bytes + stored in memory. It runs at 22 cycles per byte on a Pentium P4 processor +*/ + +#ifndef __SHA_H__ +#define __SHA_H__ + +#include "SHAHashSet.h" + +class CSHA : public CAICHHashAlgo +{ +// Construction +public: + CSHA(); + virtual ~CSHA() {}; +// Operations +public: + virtual void Reset(); + virtual void Add(const void* pData, uint32 nLength); + virtual void Finish(CAICHHash& Hash); + virtual void GetHash(CAICHHash& Hash); +protected: + void Compile(); +private: + uint32 m_nCount[2]; + uint32 m_nHash[5]; + uint32 m_nBuffer[16]; +}; + +#define SHA1_BLOCK_SIZE 64 +#define SHA1_DIGEST_SIZE 20 + +#endif // __SHA_H__ +// File_checked_for_headers diff --git a/src/SHAHashSet.cpp b/src/SHAHashSet.cpp new file mode 100644 index 00000000..308f459a --- /dev/null +++ b/src/SHAHashSet.cpp @@ -0,0 +1,1056 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include + +#include "SHAHashSet.h" +#include "amule.h" +#include "MemFile.h" +#include "Preferences.h" +#include "SHA.h" +#include "updownclient.h" +#include "DownloadQueue.h" +#include "PartFile.h" +#include "Logger.h" +#include + + + +// for this version the limits are set very high, they might be lowered later +// to make a hash trustworthy, at least 10 unique Ips (255.255.128.0) must have sent it +// and if we have received more than one hash for the file, one hash has to be sent by more than 95% of all unique IPs +#define MINUNIQUEIPS_TOTRUST 10 // how many unique IPs have to send us a hash to make it trustworthy +#define MINPERCENTAGE_TOTRUST 92 // how many percentage of clients have to send the same hash to make it trustworthy + +CAICHRequestedDataList CAICHHashSet::m_liRequestedData; + +///////////////////////////////////////////////////////////////////////////////////////// +///CAICHHash +wxString CAICHHash::GetString() const +{ + return EncodeBase32(m_abyBuffer, HASHSIZE); +} + + +void CAICHHash::Read(CFileDataIO* file) +{ + file->Read(m_abyBuffer,HASHSIZE); +} + + +void CAICHHash::Write(CFileDataIO* file) const +{ + file->Write(m_abyBuffer,HASHSIZE); +} + +unsigned int CAICHHash::DecodeBase32(const wxString &base32) +{ + return ::DecodeBase32(base32, HASHSIZE, m_abyBuffer); +} + + +///////////////////////////////////////////////////////////////////////////////////////// +///CAICHHashTree + +CAICHHashTree::CAICHHashTree(uint64 nDataSize, bool bLeftBranch, uint64 nBaseSize) +{ + m_nDataSize = nDataSize; + m_nBaseSize = nBaseSize; + m_bIsLeftBranch = bLeftBranch; + m_pLeftTree = NULL; + m_pRightTree = NULL; + m_bHashValid = false; +} + + +CAICHHashTree::~CAICHHashTree() +{ + delete m_pLeftTree; + delete m_pRightTree; +} + + +// recursive +CAICHHashTree* CAICHHashTree::FindHash(uint64 nStartPos, uint64 nSize, uint8* nLevel) +{ + (*nLevel)++; + + wxCHECK(*nLevel <= 22, NULL); + wxCHECK(nStartPos + nSize <= m_nDataSize, NULL); + wxCHECK(nSize <= m_nDataSize, NULL); + + if (nStartPos == 0 && nSize == m_nDataSize) { + // this is the searched hash + return this; + } else if (m_nDataSize <= m_nBaseSize) { // sanity + // this is already the last level, cant go deeper + wxASSERT( false ); + return NULL; + } else { + uint64 nBlocks = m_nDataSize / m_nBaseSize + ((m_nDataSize % m_nBaseSize != 0 )? 1:0); + uint64 nLeft = (((m_bIsLeftBranch) ? nBlocks+1:nBlocks) / 2)* m_nBaseSize; + uint64 nRight = m_nDataSize - nLeft; + if (nStartPos < nLeft) { + if (nStartPos + nSize > nLeft) { // sanity + wxASSERT ( false ); + return NULL; + } + + if (m_pLeftTree == NULL) { + m_pLeftTree = new CAICHHashTree(nLeft, true, (nLeft <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE); + } else { + wxASSERT( m_pLeftTree->m_nDataSize == nLeft ); + } + + return m_pLeftTree->FindHash(nStartPos, nSize, nLevel); + } else { + nStartPos -= nLeft; + if (nStartPos + nSize > nRight) { // sanity + wxASSERT ( false ); + return NULL; + } + + if (m_pRightTree == NULL) { + m_pRightTree = new CAICHHashTree(nRight, false, (nRight <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE); + } else { + wxASSERT( m_pRightTree->m_nDataSize == nRight ); + } + + return m_pRightTree->FindHash(nStartPos, nSize, nLevel); + } + } +} + + +// recursive +// calculates missing hash fromt he existing ones +// overwrites existing hashs +// fails if no hash is found for any branch +bool CAICHHashTree::ReCalculateHash(CAICHHashAlgo* hashalg, bool bDontReplace) +{ + wxASSERT ( !( (m_pLeftTree != NULL) ^ (m_pRightTree != NULL)) ); + if (m_pLeftTree && m_pRightTree) { + if ( !m_pLeftTree->ReCalculateHash(hashalg, bDontReplace) || !m_pRightTree->ReCalculateHash(hashalg, bDontReplace) ) { + return false; + } + if (bDontReplace && m_bHashValid) { + return true; + } + if (m_pRightTree->m_bHashValid && m_pLeftTree->m_bHashValid) { + hashalg->Reset(); + hashalg->Add(m_pLeftTree->m_Hash.GetRawHash(), HASHSIZE); + hashalg->Add(m_pRightTree->m_Hash.GetRawHash(), HASHSIZE); + hashalg->Finish(m_Hash); + m_bHashValid = true; + return true; + } else { + return m_bHashValid; + } + } else { + return true; + } +} + +bool CAICHHashTree::VerifyHashTree(CAICHHashAlgo* hashalg, bool bDeleteBadTrees) +{ + if (!m_bHashValid) { + wxASSERT ( false ); + if (bDeleteBadTrees) { + if (m_pLeftTree) { + delete m_pLeftTree; + m_pLeftTree = NULL; + } + if (m_pRightTree) { + delete m_pRightTree; + m_pRightTree = NULL; + } + } + AddDebugLogLineM( false, logSHAHashSet, wxT("VerifyHashTree - No masterhash available")); + return false; + } + + // calculated missing hashs without overwriting anything + if (m_pLeftTree && !m_pLeftTree->m_bHashValid) { + m_pLeftTree->ReCalculateHash(hashalg, true); + } + if (m_pRightTree && !m_pRightTree->m_bHashValid) { + m_pRightTree->ReCalculateHash(hashalg, true); + } + + if ((m_pRightTree && m_pRightTree->m_bHashValid) ^ (m_pLeftTree && m_pLeftTree->m_bHashValid)) { + // one branch can never be verified + if (bDeleteBadTrees) { + if (m_pLeftTree) { + delete m_pLeftTree; + m_pLeftTree = NULL; + } + if (m_pRightTree) { + delete m_pRightTree; + m_pRightTree = NULL; + } + } + AddDebugLogLineM( false, logSHAHashSet, wxT("VerifyHashSet failed - Hashtree incomplete")); + return false; + } + if ((m_pRightTree && m_pRightTree->m_bHashValid) && (m_pLeftTree && m_pLeftTree->m_bHashValid)) { + // check verify the hashs of both child nodes against my hash + + CAICHHash CmpHash; + hashalg->Reset(); + hashalg->Add(m_pLeftTree->m_Hash.GetRawHash(), HASHSIZE); + hashalg->Add(m_pRightTree->m_Hash.GetRawHash(), HASHSIZE); + hashalg->Finish(CmpHash); + + if (m_Hash != CmpHash) { + if (bDeleteBadTrees) { + if (m_pLeftTree) { + delete m_pLeftTree; + m_pLeftTree = NULL; + } + if (m_pRightTree) { + delete m_pRightTree; + m_pRightTree = NULL; + } + } + return false; + } + return m_pLeftTree->VerifyHashTree(hashalg, bDeleteBadTrees) && m_pRightTree->VerifyHashTree(hashalg, bDeleteBadTrees); + } else { + // last hash in branch - nothing below to verify + return true; + } +} + + +void CAICHHashTree::SetBlockHash(uint64 nSize, uint64 nStartPos, CAICHHashAlgo* pHashAlg) +{ + wxASSERT ( nSize <= EMBLOCKSIZE ); + CAICHHashTree* pToInsert = FindHash(nStartPos, nSize); + if (pToInsert == NULL) { // sanity + wxASSERT ( false ); + AddDebugLogLineM( false, logSHAHashSet, wxT("Critical Error: Failed to Insert SHA-HashBlock, FindHash() failed!")); + return; + } + + //sanity + if (pToInsert->m_nBaseSize != EMBLOCKSIZE || pToInsert->m_nDataSize != nSize) { + wxASSERT ( false ); + AddDebugLogLineM( false, logSHAHashSet, wxT("Critical Error: Logical error on values in SetBlockHashFromData")); + return; + } + + pHashAlg->Finish(pToInsert->m_Hash); + pToInsert->m_bHashValid = true; +} + + +bool CAICHHashTree::CreatePartRecoveryData(uint64 nStartPos, uint64 nSize, CFileDataIO* fileDataOut, uint32 wHashIdent, bool b32BitIdent) +{ + wxCHECK(nStartPos + nSize <= m_nDataSize, false); + wxCHECK(nSize <= m_nDataSize, false); + + if (nStartPos == 0 && nSize == m_nDataSize) { + // this is the searched part, now write all blocks of this part + // hashident for this level will be adjsuted by WriteLowestLevelHash + return WriteLowestLevelHashs(fileDataOut, wHashIdent, false, b32BitIdent); + } else if (m_nDataSize <= m_nBaseSize) { // sanity + // this is already the last level, cant go deeper + wxASSERT( false ); + return false; + } else { + wHashIdent <<= 1; + wHashIdent |= (m_bIsLeftBranch) ? 1: 0; + + uint64 nBlocks = m_nDataSize / m_nBaseSize + ((m_nDataSize % m_nBaseSize != 0 )? 1:0); + uint64 nLeft = ( ((m_bIsLeftBranch) ? nBlocks+1:nBlocks) / 2)* m_nBaseSize; + uint64 nRight = m_nDataSize - nLeft; + if (m_pLeftTree == NULL || m_pRightTree == NULL) { + wxASSERT( false ); + return false; + } + if (nStartPos < nLeft) { + if (nStartPos + nSize > nLeft || !m_pRightTree->m_bHashValid) { // sanity + wxASSERT ( false ); + return false; + } + m_pRightTree->WriteHash(fileDataOut, wHashIdent, b32BitIdent); + return m_pLeftTree->CreatePartRecoveryData(nStartPos, nSize, fileDataOut, wHashIdent, b32BitIdent); + } else { + nStartPos -= nLeft; + if (nStartPos + nSize > nRight || !m_pLeftTree->m_bHashValid) { // sanity + wxASSERT ( false ); + return false; + } + m_pLeftTree->WriteHash(fileDataOut, wHashIdent, b32BitIdent); + return m_pRightTree->CreatePartRecoveryData(nStartPos, nSize, fileDataOut, wHashIdent, b32BitIdent); + + } + } +} + + +void CAICHHashTree::WriteHash(CFileDataIO* fileDataOut, uint32 wHashIdent, bool b32BitIdent) const +{ + wxASSERT( m_bHashValid ); + wHashIdent <<= 1; + wHashIdent |= (m_bIsLeftBranch) ? 1: 0; + + if (!b32BitIdent) { + wxASSERT( wHashIdent <= 0xFFFF ); + fileDataOut->WriteUInt16((uint16)wHashIdent); + } else { + fileDataOut->WriteUInt32(wHashIdent); + } + + m_Hash.Write(fileDataOut); +} + + +// write lowest level hashs into file, ordered from left to right optional without identifier +bool CAICHHashTree::WriteLowestLevelHashs(CFileDataIO* fileDataOut, uint32 wHashIdent, bool bNoIdent, bool b32BitIdent) const +{ + wHashIdent <<= 1; + wHashIdent |= (m_bIsLeftBranch) ? 1: 0; + if (m_pLeftTree == NULL && m_pRightTree == NULL) { + if (m_nDataSize <= m_nBaseSize && m_bHashValid ) { + if (!bNoIdent && !b32BitIdent) { + wxASSERT( wHashIdent <= 0xFFFF ); + fileDataOut->WriteUInt16((uint16)wHashIdent); + } else if (!bNoIdent && b32BitIdent) { + fileDataOut->WriteUInt32(wHashIdent); + } + + m_Hash.Write(fileDataOut); + return true; + } else { + wxASSERT( false ); + return false; + } + } else if (m_pLeftTree == NULL || m_pRightTree == NULL) { + wxASSERT( false ); + return false; + } else { + return m_pLeftTree->WriteLowestLevelHashs(fileDataOut, wHashIdent, bNoIdent, b32BitIdent) + && m_pRightTree->WriteLowestLevelHashs(fileDataOut, wHashIdent, bNoIdent, b32BitIdent); + } +} + +// recover all low level hashs from given data. hashs are assumed to be ordered in left to right - no identifier used +bool CAICHHashTree::LoadLowestLevelHashs(CFileDataIO* fileInput) +{ + if (m_nDataSize <= m_nBaseSize) { // sanity + // lowest level, read hash + m_Hash.Read(fileInput); + m_bHashValid = true; + return true; + } else { + uint64 nBlocks = m_nDataSize / m_nBaseSize + ((m_nDataSize % m_nBaseSize != 0 )? 1:0); + uint64 nLeft = ( ((m_bIsLeftBranch) ? nBlocks+1:nBlocks) / 2)* m_nBaseSize; + uint64 nRight = m_nDataSize - nLeft; + if (m_pLeftTree == NULL) { + m_pLeftTree = new CAICHHashTree(nLeft, true, (nLeft <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE); + } else { + wxASSERT( m_pLeftTree->m_nDataSize == nLeft ); + } + if (m_pRightTree == NULL) { + m_pRightTree = new CAICHHashTree(nRight, false, (nRight <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE); + } else { + wxASSERT( m_pRightTree->m_nDataSize == nRight ); + } + return m_pLeftTree->LoadLowestLevelHashs(fileInput) + && m_pRightTree->LoadLowestLevelHashs(fileInput); + } +} + + +// write the hash, specified by wHashIdent, with Data from fileInput. +bool CAICHHashTree::SetHash(CFileDataIO* fileInput, uint32 wHashIdent, sint8 nLevel, bool bAllowOverwrite) +{ + if (nLevel == (-1)) { + // first call, check how many level we need to go + uint8 i = 0; + for (; i != 32 && (wHashIdent & 0x80000000) == 0; ++i) { + wHashIdent <<= 1; + } + if (i > 31) { + AddDebugLogLineM( false, logSHAHashSet, wxT("CAICHHashTree::SetHash - found invalid HashIdent (0)")); + return false; + } else { + nLevel = 31 - i; + } + } + if (nLevel == 0) { + // this is the searched hash + if (m_bHashValid && !bAllowOverwrite) { + // not allowed to overwrite this hash, however move the filepointer by reading a hash + CAICHHash(file); + return true; + } + m_Hash.Read(fileInput); + m_bHashValid = true; + return true; + } else if (m_nDataSize <= m_nBaseSize) { // sanity + // this is already the last level, cant go deeper + wxASSERT( false ); + return false; + } else { + // adjust ident to point the path to the next node + wHashIdent <<= 1; + nLevel--; + uint64 nBlocks = m_nDataSize / m_nBaseSize + ((m_nDataSize % m_nBaseSize != 0 )? 1:0); + uint64 nLeft = ( ((m_bIsLeftBranch) ? nBlocks+1:nBlocks) / 2)* m_nBaseSize; + uint64 nRight = m_nDataSize - nLeft; + if ((wHashIdent & 0x80000000) > 0) { + if (m_pLeftTree == NULL) { + m_pLeftTree = new CAICHHashTree(nLeft, true, (nLeft <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE); + } else { + wxASSERT( m_pLeftTree->m_nDataSize == nLeft ); + } + return m_pLeftTree->SetHash(fileInput, wHashIdent, nLevel); + } else { + if (m_pRightTree == NULL) { + m_pRightTree = new CAICHHashTree(nRight, false, (nRight <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE); + } else { + wxASSERT( m_pRightTree->m_nDataSize == nRight ); + } + return m_pRightTree->SetHash(fileInput, wHashIdent, nLevel); + } + } +} + + +///////////////////////////////////////////////////////////////////////////////////////// +///CAICHUntrustedHash +bool CAICHUntrustedHash::AddSigningIP(uint32 dwIP) +{ + dwIP &= 0x00F0FFFF; // we use only the 20 most significant bytes for unique IPs + return m_adwIpsSigning.insert(dwIP).second; +} + + + +///////////////////////////////////////////////////////////////////////////////////////// +///CAICHHashSet +CAICHHashSet::CAICHHashSet(CKnownFile* pOwner) + : m_pHashTree(0, true, PARTSIZE) +{ + m_eStatus = AICH_EMPTY; + m_pOwner = pOwner; +} + +CAICHHashSet::~CAICHHashSet(void) +{ + FreeHashSet(); +} + +bool CAICHHashSet::CreatePartRecoveryData(uint64 nPartStartPos, CFileDataIO* fileDataOut, bool bDbgDontLoad) +{ + wxASSERT( m_pOwner ); + if (m_pOwner->IsPartFile() || m_eStatus != AICH_HASHSETCOMPLETE) { + wxASSERT( false ); + return false; + } + if (m_pHashTree.m_nDataSize <= EMBLOCKSIZE) { + wxASSERT( false ); + return false; + } + if (!bDbgDontLoad) { + if (!LoadHashSet()) { + AddDebugLogLineM(false, logSHAHashSet, + CFormat(wxT("Created RecoveryData error: failed to load hashset. File: %s")) % m_pOwner->GetFileName()); + SetStatus(AICH_ERROR); + return false; + } + } + bool bResult; + uint8 nLevel = 0; + uint32 nPartSize = min(PARTSIZE, m_pOwner->GetFileSize()-nPartStartPos); + m_pHashTree.FindHash(nPartStartPos, nPartSize,&nLevel); + uint16 nHashsToWrite = (nLevel-1) + nPartSize/EMBLOCKSIZE + ((nPartSize % EMBLOCKSIZE != 0 )? 1:0); + const bool bUse32BitIdentifier = m_pOwner->IsLargeFile(); + + if (bUse32BitIdentifier) { + fileDataOut->WriteUInt16(0); // no 16bit hashs to write + } + + fileDataOut->WriteUInt16(nHashsToWrite); + uint64 nCheckFilePos = fileDataOut->GetPosition(); + if (m_pHashTree.CreatePartRecoveryData(nPartStartPos, nPartSize, fileDataOut, 0, bUse32BitIdentifier)) { + if (nHashsToWrite*(HASHSIZE+(bUse32BitIdentifier? 4u:2u)) != fileDataOut->GetPosition() - nCheckFilePos) { + wxASSERT( false ); + AddDebugLogLineM( false, logSHAHashSet, + CFormat(wxT("Created RecoveryData has wrong length. File: %s")) % m_pOwner->GetFileName() ); + bResult = false; + SetStatus(AICH_ERROR); + } else { + bResult = true; + } + } else { + AddDebugLogLineM(false, logSHAHashSet, + CFormat(wxT("Failed to create RecoveryData for '%s'")) % m_pOwner->GetFileName()); + bResult = false; + SetStatus(AICH_ERROR); + } + if (!bUse32BitIdentifier) { + fileDataOut->WriteUInt16(0); // no 32bit hashs to write + } + + if (!bDbgDontLoad) { + FreeHashSet(); + } + return bResult; +} + +bool CAICHHashSet::ReadRecoveryData(uint64 nPartStartPos, CMemFile* fileDataIn) +{ + if (/*eMule TODO !m_pOwner->IsPartFile() ||*/ !(m_eStatus == AICH_VERIFIED || m_eStatus == AICH_TRUSTED) ) { + wxASSERT( false ); + return false; + } + + /* V2 AICH Hash Packet: + 16bit-hashs-to-read + ()[count1] AICH hashs + 32bit-hashs-to-read + ()[count2] AICH hashs + */ + + // at this time we check the recoverydata for the correct ammounts of hashs only + // all hash are then taken into the tree, depending on there hashidentifier (except the masterhash) + + uint8 nLevel = 0; + uint32 nPartSize = min(PARTSIZE, m_pOwner->GetFileSize()-nPartStartPos); + m_pHashTree.FindHash(nPartStartPos, nPartSize,&nLevel); + uint16 nHashsToRead = (nLevel-1) + nPartSize/EMBLOCKSIZE + ((nPartSize % EMBLOCKSIZE != 0 )? 1:0); + + // read hashs with 16 bit identifier + uint16 nHashsAvailable = fileDataIn->ReadUInt16(); + if (fileDataIn->GetLength()-fileDataIn->GetPosition() < nHashsToRead*(HASHSIZE+2u) || (nHashsToRead != nHashsAvailable && nHashsAvailable != 0)) { + // this check is redunant, CSafememfile would catch such an error too + AddDebugLogLineM( false, logSHAHashSet, + CFormat(wxT("Failed to read RecoveryData for '%s' - Received datasize/amounts of hashs was invalid")) + % m_pOwner->GetFileName()); + return false; + } + for (uint32 i = 0; i != nHashsAvailable; i++) { + uint16 wHashIdent = fileDataIn->ReadUInt16(); + if (wHashIdent == 1 /*never allow masterhash to be overwritten*/ + || !m_pHashTree.SetHash(fileDataIn, wHashIdent,(-1), false)) + { + AddDebugLogLineM( false, logSHAHashSet, + CFormat(wxT("Failed to read RecoveryData for '%s' - Error when trying to read hash into tree")) + % m_pOwner->GetFileName()); + VerifyHashTree(true); // remove invalid hashs which we have already written + return false; + } + } + + + // read hashs with 32bit identifier + if (nHashsAvailable == 0 && fileDataIn->GetLength() - fileDataIn->GetPosition() >= 2) { + nHashsAvailable = fileDataIn->ReadUInt16(); + if (fileDataIn->GetLength()-fileDataIn->GetPosition() < nHashsToRead*(HASHSIZE+4u) || (nHashsToRead != nHashsAvailable && nHashsAvailable != 0)) { + // this check is redunant, CSafememfile would catch such an error too +// TODO: theApp->QueueDebugLogLine(/*DLP_VERYHIGH,*/ false, _T("Failed to read RecoveryData for %s - Received datasize/amounts of hashs was invalid (2)"), m_pOwner->GetFileName() ); + return false; + } + +// TODO: DEBUG_ONLY( theApp->QueueDebugLogLine(/*DLP_VERYHIGH,*/ false, _T("read RecoveryData for %s - Received packet with %u 32bit hash identifiers)"), m_pOwner->GetFileName(), nHashsAvailable ) ); + for (uint32 i = 0; i != nHashsToRead; i++) { + uint32 wHashIdent = fileDataIn->ReadUInt32(); + if (wHashIdent == 1 /*never allow masterhash to be overwritten*/ + || wHashIdent > 0x400000 + || !m_pHashTree.SetHash(fileDataIn, wHashIdent,(-1), false)) + { +// TODO: theApp->QueueDebugLogLine(/*DLP_VERYHIGH,*/ false, _T("Failed to read RecoveryData for %s - Error when trying to read hash into tree (2)"), m_pOwner->GetFileName() ); + VerifyHashTree(true); // remove invalid hashs which we have already written + return false; + } + } + } + + if (nHashsAvailable == 0) { +// TODO: theApp->QueueDebugLogLine(/*DLP_VERYHIGH,*/ false, _T("Failed to read RecoveryData for %s - Packet didn't contained any hashs"), m_pOwner->GetFileName() ); + return false; + } + + + if (VerifyHashTree(true)) { + // some final check if all hashs we wanted are there + for (uint32 nPartPos = 0; nPartPos < nPartSize; nPartPos += EMBLOCKSIZE) { + CAICHHashTree* phtToCheck = m_pHashTree.FindHash(nPartStartPos+nPartPos, min(EMBLOCKSIZE, nPartSize-nPartPos)); + if (phtToCheck == NULL || !phtToCheck->m_bHashValid) { + AddDebugLogLineM( false, logSHAHashSet, + CFormat(wxT("Failed to read RecoveryData for '%s' - Error while verifying presence of all lowest level hashs")) + % m_pOwner->GetFileName()); + return false; + } + } + // all done + return true; + } else { + AddDebugLogLineM(false, logSHAHashSet, + CFormat(wxT("Failed to read RecoveryData for '%s' - Verifying received hashtree failed")) + % m_pOwner->GetFileName()); + return false; + } +} + +// this function is only allowed to be called right after successfully calculating the hashset (!) +// will delete the hashset, after saving to free the memory +bool CAICHHashSet::SaveHashSet() +{ + if (m_eStatus != AICH_HASHSETCOMPLETE) { + wxASSERT( false ); + return false; + } + if ( !m_pHashTree.m_bHashValid || m_pHashTree.m_nDataSize != m_pOwner->GetFileSize()) { + wxASSERT( false ); + return false; + } + + + try { + const wxString fullpath = theApp->ConfigDir + KNOWN2_MET_FILENAME; + const bool exists = wxFile::Exists(fullpath); + + CFile file(fullpath, exists ? CFile::read_write : CFile::write); + if (!file.IsOpened()) { + AddDebugLogLineM( true, logSHAHashSet, wxT("Failed to save HashSet: opening met file failed!")); + return false; + } + + uint64 nExistingSize = file.GetLength(); + if (nExistingSize) { + uint8 header = file.ReadUInt8(); + if (header != KNOWN2_MET_VERSION) { + AddDebugLogLineM( true, logSHAHashSet, wxT("Saving failed: Current file is not a met-file!")); + return false; + } + + AddDebugLogLineM( false, logSHAHashSet, wxString::Format(wxT("Met file is version 0x%2.2x."),header)); + } else { + file.WriteUInt8(KNOWN2_MET_VERSION); + // Update the recorded size, in order for the sanity check below to work. + nExistingSize += 1; + } + + // first we check if the hashset we want to write is already stored + CAICHHash CurrentHash; + while (file.GetPosition() < nExistingSize) { + CurrentHash.Read(&file); + if (m_pHashTree.m_Hash == CurrentHash) { + // this hashset if already available, no need to save it again + return true; + } + uint32 nHashCount = file.ReadUInt32(); + if (file.GetPosition() + nHashCount*HASHSIZE > nExistingSize) { + AddDebugLogLineM( true, logSHAHashSet, wxT("Saving failed: File contains fewer entries than specified!")); + return false; + } + // skip the rest of this hashset + file.Seek(nHashCount*HASHSIZE, wxFromCurrent); + } + + // write hashset + m_pHashTree.m_Hash.Write(&file); + uint32 nHashCount = (PARTSIZE/EMBLOCKSIZE + ((PARTSIZE % EMBLOCKSIZE != 0)? 1 : 0)) * (m_pHashTree.m_nDataSize/PARTSIZE); + if (m_pHashTree.m_nDataSize % PARTSIZE != 0) { + nHashCount += (m_pHashTree.m_nDataSize % PARTSIZE)/EMBLOCKSIZE + (((m_pHashTree.m_nDataSize % PARTSIZE) % EMBLOCKSIZE != 0)? 1 : 0); + } + file.WriteUInt32(nHashCount); + if (!m_pHashTree.WriteLowestLevelHashs(&file, 0, true, true)) { + // thats bad... really + file.SetLength(nExistingSize); + AddDebugLogLineM( true, logSHAHashSet, wxT("Failed to save HashSet: WriteLowestLevelHashs() failed!")); + return false; + } + if (file.GetLength() != nExistingSize + (nHashCount+1)*HASHSIZE + 4) { + // thats even worse + file.SetLength(nExistingSize); + AddDebugLogLineM( true, logSHAHashSet, wxT("Failed to save HashSet: Calculated and real size of hashset differ!")); + return false; + } + AddDebugLogLineM( false, logSHAHashSet, wxString::Format(wxT("Sucessfully saved eMuleAC Hashset, %u Hashs + 1 Masterhash written"), nHashCount)); + } catch (const CSafeIOException& e) { + AddDebugLogLineM(true, logSHAHashSet, wxT("IO error while saving AICH HashSet: ") + e.what()); + return false; + } + + FreeHashSet(); + return true; +} + + +bool CAICHHashSet::LoadHashSet() +{ + if (m_eStatus != AICH_HASHSETCOMPLETE) { + wxASSERT( false ); + return false; + } + if ( !m_pHashTree.m_bHashValid || m_pHashTree.m_nDataSize != m_pOwner->GetFileSize() || m_pHashTree.m_nDataSize == 0) { + wxASSERT( false ); + return false; + } + wxString fullpath = theApp->ConfigDir + KNOWN2_MET_FILENAME; + CFile file(fullpath, CFile::read); + if (!file.IsOpened()) { + if (wxFileExists(fullpath)) { + wxString strError(wxT("Failed to load ") KNOWN2_MET_FILENAME wxT(" file")); + AddDebugLogLineM( true, logSHAHashSet, strError); + } + return false; + } + + try { + uint8 header = file.ReadUInt8(); + if (header != KNOWN2_MET_VERSION) { + AddDebugLogLineM( true, logSHAHashSet, wxT("Loading failed: Current file is not a met-file!")); + return false; + } + + CAICHHash CurrentHash; + uint64 nExistingSize = file.GetLength(); + uint32 nHashCount; + while (file.GetPosition() < nExistingSize) { + CurrentHash.Read(&file); + if (m_pHashTree.m_Hash == CurrentHash) { + // found Hashset + uint32 nExpectedCount = (PARTSIZE/EMBLOCKSIZE + ((PARTSIZE % EMBLOCKSIZE != 0)? 1 : 0)) * (m_pHashTree.m_nDataSize/PARTSIZE); + if (m_pHashTree.m_nDataSize % PARTSIZE != 0) { + nExpectedCount += (m_pHashTree.m_nDataSize % PARTSIZE)/EMBLOCKSIZE + (((m_pHashTree.m_nDataSize % PARTSIZE) % EMBLOCKSIZE != 0)? 1 : 0); + } + nHashCount = file.ReadUInt32(); + if (nHashCount != nExpectedCount) { + AddDebugLogLineM( true, logSHAHashSet, wxT("Failed to load HashSet: Available Hashs and expected hashcount differ!")); + return false; + } + if (!m_pHashTree.LoadLowestLevelHashs(&file)) { + AddDebugLogLineM( true, logSHAHashSet, wxT("Failed to load HashSet: LoadLowestLevelHashs failed!")); + return false; + } + if (!ReCalculateHash(false)) { + AddDebugLogLineM( true, logSHAHashSet, wxT("Failed to load HashSet: Calculating loaded hashs failed!")); + return false; + } + if (CurrentHash != m_pHashTree.m_Hash) { + AddDebugLogLineM( true, logSHAHashSet, wxT("Failed to load HashSet: Calculated Masterhash differs from given Masterhash - hashset corrupt!")); + return false; + } + return true; + } + nHashCount = file.ReadUInt32(); + if (file.GetPosition() + nHashCount*HASHSIZE > nExistingSize) { + AddDebugLogLineM( true, logSHAHashSet, wxT("Saving failed: File contains fewer entries than specified!")); + return false; + } + // skip the rest of this hashset + file.Seek(nHashCount*HASHSIZE, wxFromCurrent); + } + AddDebugLogLineM( true, logSHAHashSet, wxT("Failed to load HashSet: HashSet not found!")); + } catch (const CSafeIOException& e) { + AddDebugLogLineM(true, logSHAHashSet, wxT("IO error while loading AICH HashSet: ") + e.what()); + } + + return false; +} + +// delete the hashset except the masterhash (we dont keep aich hashsets in memory to save ressources) +void CAICHHashSet::FreeHashSet() +{ + if (m_pHashTree.m_pLeftTree) { + delete m_pHashTree.m_pLeftTree; + m_pHashTree.m_pLeftTree = NULL; + } + if (m_pHashTree.m_pRightTree) { + delete m_pHashTree.m_pRightTree; + m_pHashTree.m_pRightTree = NULL; + } +} + +void CAICHHashSet::SetMasterHash(const CAICHHash& Hash, EAICHStatus eNewStatus) +{ + m_pHashTree.m_Hash = Hash; + m_pHashTree.m_bHashValid = true; + SetStatus(eNewStatus); +} + +CAICHHashAlgo* CAICHHashSet::GetNewHashAlgo() +{ + return new CSHA(); +} + +bool CAICHHashSet::ReCalculateHash(bool bDontReplace) +{ + CAICHHashAlgo* hashalg = GetNewHashAlgo(); + bool bResult = m_pHashTree.ReCalculateHash(hashalg, bDontReplace); + delete hashalg; + return bResult; +} + +bool CAICHHashSet::VerifyHashTree(bool bDeleteBadTrees) +{ + CAICHHashAlgo* hashalg = GetNewHashAlgo(); + bool bResult = m_pHashTree.VerifyHashTree(hashalg, bDeleteBadTrees); + delete hashalg; + return bResult; +} + + +void CAICHHashSet::SetFileSize(uint64 nSize) +{ + m_pHashTree.m_nDataSize = nSize; + m_pHashTree.m_nBaseSize = (nSize <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE; +} + + +void CAICHHashSet::UntrustedHashReceived(const CAICHHash& Hash, uint32 dwFromIP) +{ + switch(GetStatus()) { + case AICH_EMPTY: + case AICH_UNTRUSTED: + case AICH_TRUSTED: + break; + default: + return; + } + bool bFound = false; + bool bAdded = false; + for (uint32 i = 0; i < m_aUntrustedHashs.size(); ++i) { + if (m_aUntrustedHashs[i].m_Hash == Hash) { + bAdded = m_aUntrustedHashs[i].AddSigningIP(dwFromIP); + bFound = true; + break; + } + } + if (!bFound) { + bAdded = true; + CAICHUntrustedHash uhToAdd; + uhToAdd.m_Hash = Hash; + uhToAdd.AddSigningIP(dwFromIP); + m_aUntrustedHashs.push_back(uhToAdd); + } + + uint32 nSigningIPsTotal = 0; // unique clients who send us a hash + int nMostTrustedPos = (-1); // the hash which most clients send us + uint32 nMostTrustedIPs = 0; + for (uint32 i = 0; i < (uint32)m_aUntrustedHashs.size(); ++i) { + nSigningIPsTotal += m_aUntrustedHashs[i].m_adwIpsSigning.size(); + if ((uint32)m_aUntrustedHashs[i].m_adwIpsSigning.size() > nMostTrustedIPs) { + nMostTrustedIPs = m_aUntrustedHashs[i].m_adwIpsSigning.size(); + nMostTrustedPos = i; + } + } + if (nMostTrustedPos == (-1) || nSigningIPsTotal == 0) { + wxASSERT( false ); + return; + } + // the check if we trust any hash + if ( thePrefs::IsTrustingEveryHash() || + (nMostTrustedIPs >= MINUNIQUEIPS_TOTRUST && (100 * nMostTrustedIPs)/nSigningIPsTotal >= MINPERCENTAGE_TOTRUST)) { + //trusted + AddDebugLogLineM(false, logSHAHashSet, + CFormat(wxT("IACH Hash received (%sadded), We have now %u hash(es) from %u unique IP(s). ") + wxT("We trust the Hash %s from %u client(s) (%u%%). File: %s")) + % (bAdded ? wxT("") : wxT("not ")) + % m_aUntrustedHashs.size() + % nSigningIPsTotal + % m_aUntrustedHashs[nMostTrustedPos].m_Hash.GetString() + % nMostTrustedIPs + % ((100 * nMostTrustedIPs) / nSigningIPsTotal) + % m_pOwner->GetFileName()); + + SetStatus(AICH_TRUSTED); + if (!HasValidMasterHash() || GetMasterHash() != m_aUntrustedHashs[nMostTrustedPos].m_Hash) { + SetMasterHash(m_aUntrustedHashs[nMostTrustedPos].m_Hash, AICH_TRUSTED); + FreeHashSet(); + } + } else { + // untrusted + AddDebugLogLineM(false, logSHAHashSet, + CFormat(wxT("IACH Hash received (%sadded), We have now %u hash(es) from %u unique IP(s). ") + wxT("Best Hash %s from %u clients (%u%%) - but we dont trust it yet. File: %s")) + % (bAdded ? wxT(""): wxT("not ")) + % m_aUntrustedHashs.size() + % nSigningIPsTotal + % m_aUntrustedHashs[nMostTrustedPos].m_Hash.GetString() + % nMostTrustedIPs + % ((100 * nMostTrustedIPs) / nSigningIPsTotal) + % m_pOwner->GetFileName()); + + SetStatus(AICH_UNTRUSTED); + if (!HasValidMasterHash() || GetMasterHash() != m_aUntrustedHashs[nMostTrustedPos].m_Hash) { + SetMasterHash(m_aUntrustedHashs[nMostTrustedPos].m_Hash, AICH_UNTRUSTED); + FreeHashSet(); + } + } +} + +#ifndef CLIENT_GUI + +void CAICHHashSet::ClientAICHRequestFailed(CUpDownClient* pClient) +{ + pClient->SetReqFileAICHHash(NULL); + CAICHRequestedData data = GetAICHReqDetails(pClient); + RemoveClientAICHRequest(pClient); + if (data.m_pClient != pClient) { + return; + } + if( theApp->downloadqueue->IsPartFile(data.m_pPartFile)) { + AddDebugLogLineM(false, logSHAHashSet, + CFormat(wxT("IACH Request failed, Trying to ask another client (File: '%s', Part: %u, Client '%s'")) + % data.m_pPartFile->GetFileName() % data.m_nPart % pClient->GetClientFullInfo()); + data.m_pPartFile->RequestAICHRecovery(data.m_nPart); + } +} + +#endif + +void CAICHHashSet::RemoveClientAICHRequest(const CUpDownClient* pClient) +{ + for (CAICHRequestedDataList::iterator it = m_liRequestedData.begin();it != m_liRequestedData.end(); ++it) { + if (it->m_pClient == pClient) { + m_liRequestedData.erase(it); + return; + } + } + wxASSERT( false ); +} + +bool CAICHHashSet::IsClientRequestPending(const CPartFile* pForFile, uint16 nPart) +{ + for (CAICHRequestedDataList::iterator it = m_liRequestedData.begin();it != m_liRequestedData.end(); ++it) { + if (it->m_pPartFile == pForFile && it->m_nPart == nPart) { + return true; + } + } + return false; +} + +CAICHRequestedData CAICHHashSet::GetAICHReqDetails(const CUpDownClient* pClient) +{ + for (CAICHRequestedDataList::iterator it = m_liRequestedData.begin();it != m_liRequestedData.end(); ++it) { + if (it->m_pClient == pClient) { + return *(it); + } + } + wxASSERT( false ); + CAICHRequestedData empty; + return empty; +} + +bool CAICHHashSet::IsPartDataAvailable(uint64 nPartStartPos) +{ + if (!(m_eStatus == AICH_VERIFIED || m_eStatus == AICH_TRUSTED || m_eStatus == AICH_HASHSETCOMPLETE) ) { + wxASSERT( false ); + return false; + } + uint64 nPartSize = min(PARTSIZE, m_pOwner->GetFileSize()-nPartStartPos); + for (uint64 nPartPos = 0; nPartPos < nPartSize; nPartPos += EMBLOCKSIZE) { + CAICHHashTree* phtToCheck = m_pHashTree.FindHash(nPartStartPos+nPartPos, min(EMBLOCKSIZE, nPartSize-nPartPos)); + if (phtToCheck == NULL || !phtToCheck->m_bHashValid) { + return false; + } + } + return true; +} + +// VC++ defines Assert as ASSERT. VC++ also defines VERIFY MACRO, which is the equivalent of ASSERT but also works in Released builds. + +#define VERIFY(x) wxASSERT(x) + +void CAICHHashSet::DbgTest() +{ +#ifdef _DEBUG + //define TESTSIZE 4294567295 + uint8 maxLevel = 0; + uint32 cHash = 1; + uint8 curLevel = 0; + //uint32 cParts = 0; + maxLevel = 0; +/* CAICHHashTree* pTest = new CAICHHashTree(TESTSIZE, true, 9728000); + for (uint64 i = 0; i+9728000 < TESTSIZE; i += 9728000) { + CAICHHashTree* pTest2 = new CAICHHashTree(9728000, true, EMBLOCKSIZE); + pTest->ReplaceHashTree(i, 9728000, &pTest2); + cParts++; + } + CAICHHashTree* pTest2 = new CAICHHashTree(TESTSIZE-i, true, EMBLOCKSIZE); + pTest->ReplaceHashTree(i, (TESTSIZE-i), &pTest2); + cParts++; +*/ +#define TESTSIZE m_pHashTree.m_nDataSize + if (m_pHashTree.m_nDataSize <= EMBLOCKSIZE) { + return; + } + CAICHHashSet TestHashSet(m_pOwner); + TestHashSet.SetFileSize(m_pOwner->GetFileSize()); + TestHashSet.SetMasterHash(GetMasterHash(), AICH_VERIFIED); + CMemFile file; + uint64 i; + for (i = 0; i+9728000 < TESTSIZE; i += 9728000) { + VERIFY( CreatePartRecoveryData(i, &file) ); + + /*uint32 nRandomCorruption = (rand() * rand()) % (file.GetLength()-4); + file.Seek(nRandomCorruption, CFile::begin); + file.Write(&nRandomCorruption, 4);*/ + + file.Seek(0,wxFromStart); + VERIFY( TestHashSet.ReadRecoveryData(i, &file) ); + file.Seek(0,wxFromStart); + TestHashSet.FreeHashSet(); + uint32 j; + for (j = 0; j+EMBLOCKSIZE < 9728000; j += EMBLOCKSIZE) { + VERIFY( m_pHashTree.FindHash(i+j, EMBLOCKSIZE, &curLevel) ); + //TRACE(wxT("%u - %s\r\n"), cHash, m_pHashTree.FindHash(i+j, EMBLOCKSIZE, &curLevel)->m_Hash.GetString()); + maxLevel = max(curLevel, maxLevel); + curLevel = 0; + cHash++; + } + VERIFY( m_pHashTree.FindHash(i+j, 9728000-j, &curLevel) ); + //TRACE(wxT("%u - %s\r\n"), cHash, m_pHashTree.FindHash(i+j, 9728000-j, &curLevel)->m_Hash.GetString()); + maxLevel = max(curLevel, maxLevel); + curLevel = 0; + cHash++; + + } + VERIFY( CreatePartRecoveryData(i, &file) ); + file.Seek(0,wxFromStart); + VERIFY( TestHashSet.ReadRecoveryData(i, &file) ); + file.Seek(0,wxFromStart); + TestHashSet.FreeHashSet(); + for (uint64 j = 0; j+EMBLOCKSIZE < TESTSIZE-i; j += EMBLOCKSIZE) { + VERIFY( m_pHashTree.FindHash(i+j, EMBLOCKSIZE, &curLevel) ); + //TRACE(wxT("%u - %s\r\n"), cHash,m_pHashTree.FindHash(i+j, EMBLOCKSIZE, &curLevel)->m_Hash.GetString()); + maxLevel = max(curLevel, maxLevel); + curLevel = 0; + cHash++; + } + //VERIFY( m_pHashTree.FindHash(i+j, (TESTSIZE-i)-j, &curLevel) ); + //TRACE(wxT("%u - %s\r\n"), cHash,m_pHashTree.FindHash(i+j, (TESTSIZE-i)-j, &curLevel)->m_Hash.GetString()); + maxLevel = max(curLevel, maxLevel); +#endif +} +// File_checked_for_headers diff --git a/src/SHAHashSet.h b/src/SHAHashSet.h new file mode 100644 index 00000000..22ffcbdb --- /dev/null +++ b/src/SHAHashSet.h @@ -0,0 +1,278 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +/* + SHA hashset basically exists of 1 Tree for all Parts (9.28MB) + n Trees + for all blocks (180KB) while n is the number of Parts. + This means it is NOT a complete hashtree, since the 9.28MB is a given level, in order + to be able to create a hashset format similar to the MD4 one. + + If the number of elements for the next level are odd (for example 21 blocks to spread into 2 hashs) + the majority of elements will go into the left branch if the parent node was a left branch + and into the right branch if the parent node was a right branch. The first node is always + taken as a left branch. + +Example tree: + FileSize: 19506000 Bytes = 18,6 MB + + X(18,6 MB) MasterHash + / \ + X(18,55) \ + / \ \ + X(9,28) X(9,28) X(0,05MB) PartHashs + / \ / \ \ +X(4,75) X(4,57) X(4,57) X(4,57) X(4,75) +[...............] +X(180KB) X(180KB) [...] X(140KB) | X(180KB) X(180KB) [...] BlockHashs + v + Border between first and second Part (9.28MB) + +HashsIdentifier: +When sending hashes, they are sent with a 16bit identifier which specifies its position in the +tree (so StartPosition + HashDataSize would lead to the same hash) +The identifier basically describes the way from the top of the tree to the hash. a set bit (1) +means follow the left branch, a 0 means follow the right. The highest bit which is set is seen as the start- +position (since the first node is always seen as left). + +Example + + x 0000000000000001 + / \ + x \ 0000000000000011 + / \ \ +x _X_ x 0000000000000110 + + +Version 2 of AICH also supports 32bit identifiers to support large files, check CAICHHashSet::CreatePartRecoveryData +*/ + +#ifndef __SHAHAHSET_H__ +#define __SHAHAHSET_H__ + +#include +#include + +#include "Types.h" + +#define HASHSIZE 20 +#define KNOWN2_MET_FILENAME wxT("known2_64.met") +#define OLD_KNOWN2_MET_FILENAME wxT("known2.met") +#define KNOWN2_MET_VERSION 0x02 + +enum EAICHStatus { + AICH_ERROR = 0, + AICH_EMPTY, + AICH_UNTRUSTED, + AICH_TRUSTED, + AICH_VERIFIED, + AICH_HASHSETCOMPLETE +}; + +class CFileDataIO; +class CKnownFile; +class CMemFile; +class CPartFile; +class CUpDownClient; + + +///////////////////////////////////////////////////////////////////////////////////////// +///CAICHHash +class CAICHHash +{ +private: + byte m_abyBuffer[HASHSIZE]; + +public: + CAICHHash() { memset(m_abyBuffer, 0, HASHSIZE); } + CAICHHash(CFileDataIO* file) { Read(file); } + CAICHHash(byte* data) { Read(data); } + CAICHHash(const CAICHHash& k1) { *this = k1; } + ~CAICHHash() {} + CAICHHash& operator=(const CAICHHash& k1) + { + memcpy(m_abyBuffer, k1.m_abyBuffer, HASHSIZE); + return *this; + } + friend bool operator==(const CAICHHash& k1,const CAICHHash& k2) + { + return memcmp(k1.m_abyBuffer, k2.m_abyBuffer, HASHSIZE) == 0; + } + friend bool operator!=(const CAICHHash& k1,const CAICHHash& k2) { return !(k1 == k2); } + void Read(CFileDataIO* file); + void Write(CFileDataIO* file) const; + void Read(byte* data) { memcpy(m_abyBuffer, data, HASHSIZE); } + wxString GetString() const; + byte* GetRawHash() { return m_abyBuffer; } + static uint32 GetHashSize() { return HASHSIZE;} + unsigned int DecodeBase32(const wxString &base32); +}; + +///////////////////////////////////////////////////////////////////////////////////////// +///CAICHHashAlgo +class CAICHHashAlgo +{ +public: + virtual ~CAICHHashAlgo() {}; + virtual void Reset() = 0; + virtual void Add(const void* pData, uint32 nLength) = 0; + virtual void Finish(CAICHHash& Hash) = 0; + virtual void GetHash(CAICHHash& Hash) = 0; +}; + +///////////////////////////////////////////////////////////////////////////////////////// +///CAICHHashTree +class CAICHHashTree +{ + friend class CAICHHashSet; +private: + CAICHHash m_Hash; + uint64 m_nDataSize; // size of data which is covered by this hash + uint64 m_nBaseSize; // blocksize on which the lowest hash is based on + bool m_bIsLeftBranch; // left or right branch of the tree + bool m_bHashValid; // the hash is valid and not empty + CAICHHashTree* m_pLeftTree; + CAICHHashTree* m_pRightTree; + +public: + CAICHHashTree(uint64 nDataSize, bool bLeftBranch, uint64 nBaseSize); + ~CAICHHashTree(); + + const CAICHHash &GetHash() const { return m_Hash; } + uint64 GetNDataSize() const { return m_nDataSize; } + uint64 GetNBaseSize() const { return m_nBaseSize; } + bool GetIsLeftBranch() const { return m_bIsLeftBranch; } + bool GetHashValid() const { return m_bHashValid; } + + void SetBlockHash(uint64 nSize, uint64 nStartPos, CAICHHashAlgo* pHashAlg); + bool ReCalculateHash(CAICHHashAlgo* hashalg, bool bDontReplace ); + bool VerifyHashTree(CAICHHashAlgo* hashalg, bool bDeleteBadTrees); + CAICHHashTree* FindHash(uint64 nStartPos, uint64 nSize) + { + uint8 buffer = 0; + return FindHash(nStartPos, nSize, &buffer); + } + +protected: + CAICHHashTree* FindHash(uint64 nStartPos, uint64 nSize, uint8* nLevel); + bool CreatePartRecoveryData(uint64 nStartPos, uint64 nSize, + CFileDataIO* fileDataOut, uint32 wHashIdent, bool b32BitIdent); + void WriteHash(CFileDataIO* fileDataOut, uint32 wHashIdent, bool b32BitIdent) const; + bool WriteLowestLevelHashs(CFileDataIO* fileDataOut, + uint32 wHashIdent, bool bNoIdent, bool b32BitIdent) const; + bool LoadLowestLevelHashs(CFileDataIO* fileInput); + bool SetHash(CFileDataIO* fileInput, uint32 wHashIdent, sint8 nLevel = (-1), bool bAllowOverwrite = true); +}; + +///////////////////////////////////////////////////////////////////////////////////////// +///CAICHUntrustedHashs +class CAICHUntrustedHash { +public: + CAICHUntrustedHash& operator=(const CAICHUntrustedHash& k1) + { + m_adwIpsSigning = k1.m_adwIpsSigning; + m_Hash = k1.m_Hash ; + return *this; + } + bool AddSigningIP(uint32 dwIP); + + CAICHHash m_Hash; + std::set m_adwIpsSigning; +}; + +///////////////////////////////////////////////////////////////////////////////////////// +///CAICHUntrustedHashs +class CAICHRequestedData { +public: + CAICHRequestedData() + { + m_nPart = 0; + m_pPartFile = NULL; + m_pClient= NULL; + } + CAICHRequestedData& operator=(const CAICHRequestedData& k1) + { + m_nPart = k1.m_nPart; + m_pPartFile = k1.m_pPartFile; + m_pClient = k1.m_pClient; + return *this; + } + uint16 m_nPart; + CPartFile* m_pPartFile; + CUpDownClient* m_pClient; +}; + + +using namespace std; + +typedef std::list CAICHRequestedDataList; + +///////////////////////////////////////////////////////////////////////////////////////// +///CAICHHashSet +class CAICHHashSet +{ +private: + CKnownFile* m_pOwner; + EAICHStatus m_eStatus; + deque m_aUntrustedHashs; + +public: + static CAICHRequestedDataList m_liRequestedData; + CAICHHashTree m_pHashTree; + + CAICHHashSet(CKnownFile* pOwner); + ~CAICHHashSet(void); + bool CreatePartRecoveryData(uint64 nPartStartPos, CFileDataIO* fileDataOut, bool bDbgDontLoad = false); + bool ReadRecoveryData(uint64 nPartStartPos, CMemFile* fileDataIn); + bool ReCalculateHash(bool bDontReplace = false); + bool VerifyHashTree(bool bDeleteBadTrees); + void UntrustedHashReceived(const CAICHHash& Hash, uint32 dwFromIP); + bool IsPartDataAvailable(uint64 nPartStartPos); + void SetStatus(EAICHStatus bNewValue) { m_eStatus = bNewValue; } + EAICHStatus GetStatus() const { return m_eStatus; } + + void FreeHashSet(); + void SetFileSize(uint64 nSize); + + CAICHHash& GetMasterHash() { return m_pHashTree.m_Hash; } + void SetMasterHash(const CAICHHash& Hash, EAICHStatus eNewStatus); + bool HasValidMasterHash() { return m_pHashTree.m_bHashValid; } + + bool SaveHashSet(); + bool LoadHashSet(); // only call directly when debugging + + static CAICHHashAlgo* GetNewHashAlgo(); + static void ClientAICHRequestFailed(CUpDownClient* pClient); + static void RemoveClientAICHRequest(const CUpDownClient* pClient); + static bool IsClientRequestPending(const CPartFile* pForFile, uint16 nPart); + static CAICHRequestedData GetAICHReqDetails(const CUpDownClient* pClient); + void DbgTest(); + + void SetOwner(CKnownFile* owner) { m_pOwner = owner; } +}; + +#endif //__SHAHAHSET_H__ + +// File_checked_for_headers diff --git a/src/SafeFile.cpp b/src/SafeFile.cpp new file mode 100644 index 00000000..83b02047 --- /dev/null +++ b/src/SafeFile.cpp @@ -0,0 +1,590 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "SafeFile.h" // Interface declarations. +#include "MD4Hash.h" // Needed for CMD4Hash +#include "kademlia/utils/UInt128.h" // Needed for CUInt128 +#include "ScopedPtr.h" // Needed for CScopedPtr and CScopedArray + + + +#define CHECK_BOM(size, x) ((size >= 3) && (x[0] == (char)0xEF) && (x[1] == (char)0xBB) && (x[2] == (char)0xBF)) + +const char BOMHeader[3] = {0xEF, 0xBB, 0xBF}; + + +CSafeIOException::CSafeIOException(const wxString& type, const wxString& desc) + : CMuleException(wxT("SafeIO::") + type, desc) {} + + +CEOFException::CEOFException(const wxString& desc) + : CSafeIOException(wxT("EOF"), desc) {} + + +CIOFailureException::CIOFailureException(const wxString& desc) + : CSafeIOException(wxT("IOFailure"), desc) {} + +CIOFailureException::CIOFailureException(const wxString& type, const wxString& desc) + : CSafeIOException(wxT("IOFailure::") + type, desc) {} + + +/////////////////////////////////////////////////////////////////////////////// +// CFileDataIO + + +CFileDataIO::~CFileDataIO() +{ +} + + +bool CFileDataIO::Eof() const +{ + return GetPosition() >= GetLength(); +} + + +void CFileDataIO::Read(void *buffer, size_t count) const +{ + MULE_VALIDATE_PARAMS(buffer, wxT("Attempting to write to NULL buffer.")); + + // Check that we read everything we wanted. + if (doRead(buffer, count) == (signed)count) { + return; + } + + // To reduce potential system calls, we only do EOF checks when reads fail. + if (Eof()) { + throw CEOFException(wxT("Attempt to read past end of file.")); + } else { + throw CIOFailureException(wxT("Read error, failed to read from file.")); + } +} + + +void CFileDataIO::Write(const void* buffer, size_t count) +{ + MULE_VALIDATE_PARAMS(buffer, wxT("Attempting to read from NULL buffer.")); + + if (doWrite(buffer, count) != (signed)count) { + throw CIOFailureException(wxT("Write error, failed to write to file.")); + } +} + + +uint64 CFileDataIO::Seek(sint64 offset, wxSeekMode from) const +{ + sint64 newpos = 0; + switch (from) { + case wxFromStart: + newpos = offset; + break; + + case wxFromCurrent: + newpos = GetPosition() + offset; + break; + + case wxFromEnd: + newpos = GetLength() + offset; + break; + + default: + MULE_VALIDATE_PARAMS(false, wxT("Invalid seek-mode specified.")); + } + + MULE_VALIDATE_PARAMS(newpos >= 0, wxT("Position after seeking would be less than zero!")); + + sint64 result = doSeek(newpos); + MULE_VALIDATE_STATE(result >= 0, wxT("Seeking resulted in invalid offset.")); + MULE_VALIDATE_STATE(result == newpos, wxT("Target position and actual position disagree.")); + + return result; +} + + +uint8 CFileDataIO::ReadUInt8() const +{ + uint8 value = 0; + Read(&value, sizeof(uint8)); + + return value; +} + + +uint16 CFileDataIO::ReadUInt16() const +{ + uint16 value = 0; + Read(&value, sizeof(uint16)); + + return ENDIAN_SWAP_16(value); +} + + +uint32 CFileDataIO::ReadUInt32() const +{ + uint32 value = 0; + Read(&value, sizeof(uint32)); + + return ENDIAN_SWAP_32(value); +} + + +uint64 CFileDataIO::ReadUInt64() const +{ + uint64 value = 0; + Read(&value, sizeof(uint64)); + + return ENDIAN_SWAP_64(value); +} + + +CUInt128 CFileDataIO::ReadUInt128() const +{ + CUInt128 value; + uint32* data = (uint32*)value.GetDataPtr(); + for (int i = 0; i < (128/32); i++) { + // Four 32bits chunks + data[i] = ReadUInt32(); + } + + return value; +} + + +CMD4Hash CFileDataIO::ReadHash() const +{ + CMD4Hash value; + Read(value.GetHash(), MD4HASH_LENGTH); + + return value; +} + + +float CFileDataIO::ReadFloat() const +{ + float retVal; + Read(&retVal, sizeof(float)); + return retVal; +} + + +unsigned char* CFileDataIO::ReadBsob(uint8* puSize) +{ + MULE_VALIDATE_PARAMS(puSize, wxT("NULL pointer argument in ReadBsob")); + + *puSize = ReadUInt8(); + + CScopedArray bsob(new unsigned char[*puSize]); + Read(bsob.get(), *puSize); + + return bsob.release(); +} + + +wxString CFileDataIO::ReadString(bool bOptUTF8, uint8 SizeLen, bool SafeRead) const +{ + uint32 readLen; + switch (SizeLen) { + case sizeof(uint16): readLen = ReadUInt16(); break; + case sizeof(uint32): readLen = ReadUInt32(); break; + + default: + MULE_VALIDATE_PARAMS(false, wxT("Invalid SizeLen value in ReadString")); + } + + if (SafeRead) { + readLen = std::min(readLen, GetLength() - GetPosition()); + } + + return ReadOnlyString(bOptUTF8, readLen); +} + + +wxString CFileDataIO::ReadOnlyString(bool bOptUTF8, uint16 raw_len) const +{ + // We only need to set the the NULL terminator, since we know that + // reads will either succeed or throw an exception, in which case + // we wont be returning anything + std::vector val_array(raw_len + 1); + val_array[raw_len] = 0; + + char* val = &(val_array[0]); + + Read(val, raw_len); + wxString str; + + if (CHECK_BOM(raw_len, val)) { + // This is a UTF8 string with a BOM header, skip header. + str = UTF82unicode(val + 3); + } else if (bOptUTF8) { + str = UTF82unicode(val); + if (str.IsEmpty()) { + // Fallback to Latin-1 + str = wxString(val, wxConvISO8859_1, raw_len); + } + } else { + // Raw strings are written as Latin-1 (see CFileDataIO::WriteStringCore) + str = wxString(val, wxConvISO8859_1, raw_len); + } + + return str; +} + + +void CFileDataIO::WriteUInt8(uint8 value) +{ + Write(&value, sizeof(uint8)); +} + + +void CFileDataIO::WriteUInt16(uint16 value) +{ + ENDIAN_SWAP_I_16(value); + + Write(&value, sizeof(uint16)); +} + + +void CFileDataIO::WriteUInt32(uint32 value) +{ + ENDIAN_SWAP_I_32(value); + + Write(&value, sizeof(uint32)); +} + + +void CFileDataIO::WriteUInt64(uint64 value) +{ + ENDIAN_SWAP_I_64(value); + + Write(&value, sizeof(uint64)); +} + + +void CFileDataIO::WriteUInt128(const Kademlia::CUInt128& value) +{ + for (int i = 0; i < (128/32); i++) { + // Four 32bits chunks + WriteUInt32(value.Get32BitChunk(i)); + } +} + + +void CFileDataIO::WriteHash(const CMD4Hash& value) +{ + Write(value.GetHash(), MD4HASH_LENGTH); +} + + +void CFileDataIO::WriteFloat(float value) +{ + Write(&value, sizeof(float)); +} + + +void CFileDataIO::WriteBsob(const unsigned char* value, uint8 size) +{ + WriteUInt8(size); + Write(value, size); +} + + +void CFileDataIO::WriteString(const wxString& str, EUtf8Str eEncode, uint8 SizeLen) +{ + switch (eEncode) { + case utf8strRaw: + case utf8strOptBOM: { + Unicode2CharBuf s(unicode2UTF8(str)); + if (s) { + WriteStringCore(s, eEncode, SizeLen); + break; + } + } + default: { + // Non UTF-8 strings are saved as Latin-1 + wxCharBuffer s1 = wxConvISO8859_1.cWC2MB(str); + WriteStringCore(s1, utf8strNone, SizeLen); + } + } +} + + +void CFileDataIO::WriteStringCore(const char *s, EUtf8Str eEncode, uint8 SizeLen) +{ + uint32 sLength = s ? strlen(s) : 0; + uint32 real_length = 0; + if (eEncode == utf8strOptBOM) { + real_length = sLength + 3; // For BOM header. + } else { + real_length = sLength; + } + + switch (SizeLen) { + case 0: + // Don't write size. + break; + + case sizeof(uint16): + // We must not allow too long strings to be written, + // as this would allow for a buggy clients to "poison" + // us, by sending ISO8859-1 strings that expand to a + // greater than 16b length when converted as UTF-8. + if (real_length > 0xFFFF) { + wxFAIL_MSG(wxT("String is too long to be saved")); + + real_length = std::min(real_length, 0xFFFF); + if (eEncode == utf8strOptBOM) { + sLength = real_length - 3; + } else { + sLength = real_length; + } + } + + WriteUInt16(real_length); + break; + + case sizeof(uint32): + WriteUInt32(real_length); + break; + + default: + MULE_VALIDATE_PARAMS(false, wxT("Invalid length for string-length field.")); + } + + // The BOM header must be written even if the string is empty. + if (eEncode == utf8strOptBOM) { + Write(BOMHeader, 3); + } + + // Only attempt to write non-NULL strings. + if (sLength) { + // No NULL terminator is written since we explicitly specify the length + Write(s, sLength); + } +} + + +CTag *CFileDataIO::ReadTag(bool bOptACP) +{ + CTag *retVal = NULL; + wxString name; + byte type = 0; + try { + type = ReadUInt8(); + name = ReadString(false); + + switch (type) + { + // NOTE: This tag data type is accepted and stored only to give us the possibility to upgrade + // the net in some months. + // + // And still.. it doesnt't work this way without breaking backward compatibility. To properly + // do this without messing up the network the following would have to be done: + // - those tag types have to be ignored by any client, otherwise those tags would also be sent (and + // that's really the problem) + // + // - ignoring means, each client has to read and right throw away those tags, so those tags get + // get never stored in any tag list which might be sent by that client to some other client. + // + // - all calling functions have to be changed to deal with the 'nr. of tags' attribute (which was + // already parsed) correctly.. just ignoring those tags here is not enough, any taglists have to + // be built with the knowledge that the 'nr. of tags' attribute may get decreased during the tag + // reading.. + // + // If those new tags would just be stored and sent to remote clients, any malicious or just bugged + // client could let send a lot of nodes "corrupted" packets... + // + case TAGTYPE_HASH16: + { + retVal = new CTagHash(name, ReadHash()); + break; + } + + case TAGTYPE_STRING: + retVal = new CTagString(name, ReadString(bOptACP)); + break; + + case TAGTYPE_UINT64: + retVal = new CTagInt64(name, ReadUInt64()); + break; + + case TAGTYPE_UINT32: + retVal = new CTagInt32(name, ReadUInt32()); + break; + + case TAGTYPE_UINT16: + retVal = new CTagInt16(name, ReadUInt16()); + break; + + case TAGTYPE_UINT8: + retVal = new CTagInt8(name, ReadUInt8()); + break; + + case TAGTYPE_FLOAT32: + retVal = new CTagFloat(name, ReadFloat()); + break; + + // NOTE: This tag data type is accepted and stored only to give us the possibility to upgrade + // the net in some months. + // + // And still.. it doesnt't work this way without breaking backward compatibility + case TAGTYPE_BSOB: + { + uint8 size = 0; + CScopedArray value(ReadBsob(&size)); + + retVal = new CTagBsob(name, value.get(), size); + break; + } + + default: + throw wxString(wxT("Invalid Kad tag type on packet")); + } + } catch (...) { + printf("Invalid Kad tag; type=0x%02x name=%s\n", + type, (const char *)unicode2char(name)); + delete retVal; + throw; + } + + return retVal; +} + + +void CFileDataIO::ReadTagPtrList(TagPtrList* taglist, bool bOptACP) +{ + MULE_VALIDATE_PARAMS(taglist, wxT("NULL pointer argument in ReadTagPtrList")); + + uint32 count = ReadUInt8(); + for (uint32 i = 0; i < count; i++) + { + CTag* tag = ReadTag(bOptACP); + taglist->push_back(tag); + } +} + + +void CFileDataIO::WriteTag(const CTag& tag) +{ + try + { + WriteUInt8(tag.GetType()); + + if (!tag.GetName().IsEmpty()) { + WriteString(tag.GetName(),utf8strNone); + } else { + WriteUInt16(1); + WriteUInt8(tag.GetNameID()); + } + + switch (tag.GetType()) + { + case TAGTYPE_HASH16: + // Do NOT use this to transfer any tags for at least half a year!! + WriteHash(CMD4Hash(tag.GetHash())); + break; + case TAGTYPE_STRING: + WriteString(tag.GetStr(), utf8strRaw); // Always UTF8 + break; + case TAGTYPE_UINT64: + WriteUInt64(tag.GetInt()); + break; + case TAGTYPE_UINT32: + WriteUInt32(tag.GetInt()); + break; + case TAGTYPE_FLOAT32: + WriteFloat(tag.GetFloat()); + break; + case TAGTYPE_BSOB: + // Used for uint128 on Kad now + WriteBsob(tag.GetBsob(), tag.GetBsobSize()); + break; + case TAGTYPE_UINT16: + WriteUInt16(tag.GetInt()); + break; + case TAGTYPE_UINT8: + WriteUInt8(tag.GetInt()); + break; + case TAGTYPE_BLOB: + // NOTE: This will break backward compatibility with met files for eMule versions prior to 0.44a + // and any aMule prior to SVN 26/02/2005 + WriteUInt32(tag.GetBlobSize()); + Write(tag.GetBlob(), tag.GetBlobSize()); + break; + default: + //TODO: Support more tag types + // With the if above, this should NEVER happen. + printf("%s; Unknown tag: type=0x%02X\n", __FUNCTION__, tag.GetType()); + wxASSERT(0); + break; + } + } catch (...) { + //AddDebugLogLine(false, wxT("Exception in CDataIO:WriteTag")); + printf("Exception in CDataIO:WriteTag"); + throw; + } +} + + +void CFileDataIO::WriteTagPtrList(const TagPtrList& tagList) +{ + uint32 count = tagList.size(); + wxASSERT( count <= 0xFF ); + + WriteUInt8(count); + TagPtrList::const_iterator it; + for (it = tagList.begin(); it != tagList.end(); it++) { + WriteTag(**it); + } +} + +uint64 CFileDataIO::GetIntTagValue() const { + + uint8 type = ReadUInt8(); + + ReadString(false); + + switch (type) { + + case TAGTYPE_UINT64: + return ReadUInt64(); + break; + + case TAGTYPE_UINT32: + return ReadUInt32(); + break; + + case TAGTYPE_UINT16: + return ReadUInt16(); + break; + + case TAGTYPE_UINT8: + return ReadUInt8(); + break; + + default: + throw wxString(wxT("Wrong tag type reading int tag")); + } +} +// File_checked_for_headers diff --git a/src/SafeFile.h b/src/SafeFile.h new file mode 100644 index 00000000..5a258db3 --- /dev/null +++ b/src/SafeFile.h @@ -0,0 +1,302 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef SAFEFILE_H +#define SAFEFILE_H + + +#include // Needed for wxFileName +#include // Needef for CMuleException +#include "Tag.h" + +namespace Kademlia { + class CUInt128; +} +using Kademlia::CUInt128; +class CMD4Hash; + + +/** + * This class provides a interface for safe file IO. + * + * Basic IO operations will either succeed or throw an exception, + * so that failure cannot be ignored. There are currently 3 types + * of failures: Read past EOF, errors while reading, and errors + * while writing. + * + * Beyond basic IO, the interface provides functions for reading + * and writing a number of simple data-types. These are all written + * and read as little-endian in order to allow for communication + * across platforms. + * + * Note that when empty areas are created, for instance by seeking + * past the end, then writing, the value of bytes where no data was + * explicitly written is not specified. + */ +class CFileDataIO +{ +public: + /** + * The Destructor does nothing, but is needed to allow + * for safe deletion objects via CFileDataIO pointers. + */ + virtual ~CFileDataIO(); + + + /** + * Must return the current position in the file. + */ + virtual uint64 GetPosition() const = 0; + + /** + * Must return the length of the file-object in bytes. + */ + virtual uint64 GetLength() const = 0; + + /** + * Returns true when the file-position is past or at the end of the file. + */ + virtual bool Eof() const; + + + /** + * Changes the file position. + * + * Note that seeking to an negative position is an illegal operation. + * + * @see wxFile::Seek + */ + virtual uint64 Seek(sint64 offset, wxSeekMode from = wxFromStart) const; + + + /** + * Reads 'count' bytes into 'buffer'. + * + * @param buffer The target buffer. + * @param count The number of bytes to read. + * + * Note that Read will read the specified number of + * bytes unless this would read past the end of the + * file. In that case, a CEOFException is thrown and + * the position and target buffer is left unchanged. + * + * However, it is also possible that the read will + * fail due to IO errors (bad hardware, ect), in which + * case an CIOFailureException will be thrown. + */ + virtual void Read(void* buffer, size_t count) const; + + /** + * Write 'count' bytes from 'buffer' into the file. + * + * @param buffer The source-data buffer. + * @param count The number of bytes to write. + * + * Note that Write will throw a CIOFailureException + * if it fails to write the specified number of bytes, + * which can be caused by hardware failures, lack of + * free space, etc. + */ + virtual void Write(const void* buffer, size_t count); + + + /** + * Reads the given type from the file, stored as little-endian. + * + * @see CSafeFileIO::Read + */ + //@{ + virtual uint8 ReadUInt8() const; + virtual uint16 ReadUInt16() const; + virtual uint32 ReadUInt32() const; + virtual uint64 ReadUInt64() const; + virtual CUInt128 ReadUInt128() const; + virtual CMD4Hash ReadHash() const; + virtual float ReadFloat() const; + virtual unsigned char* ReadBsob(uint8* size); + //@} + + /** + * Reads a string from the file. + * + * @param bOptUTF8 Specifies if the string is UTF8 encoded. + * @param lenBytes The number of bytes used to store the string length. + * @param SafeRead Avoids throwing CEOFException, see below. + * @return The resulting text-string. + * + * Note that when SafeRead is set to true, CSafeFileIO will crop the length + * read from the lenght-field (see lenBytes), so that at most GetLength() - + * GetPosition() bytes are read. + * + * @see CSafeFileIO::Read + */ + virtual wxString ReadString(bool bOptUTF8, uint8 lenBytes = 2, bool SafeRead = false) const; + + /** + * Reads a string from the file, where the length is specified directly. + * + * @param bOptUTF8 Specifies if the string is UTF8 encoded. + * @param length The length of the string. + * @return The resulting text-string. + * + * This function is typically used when the text-fields length is not stored + * as an integer-field in front of the text-field. + */ + virtual wxString ReadOnlyString(bool bOptUTF8, uint16 length) const; + + + /** + * Writes a value of the given type to the file, storing it as little-endian. + * + * @see CSafeFileIO::Write + */ + //@{ + virtual void WriteUInt8(uint8 value); + virtual void WriteUInt16(uint16 value); + virtual void WriteUInt32(uint32 value); + virtual void WriteUInt64(uint64 value); + virtual void WriteUInt128(const CUInt128& value); + virtual void WriteHash(const CMD4Hash& value); + virtual void WriteFloat(float value); + virtual void WriteBsob( const unsigned char* val, uint8 size); + //@} + + /** + * Writes a text-string to the file. + * + * @param str The string to be written. + * @param encoding The text-ecoding, see EUtf8Str. + * @param lenBytes The number of bytes used to store the string length. + * + * Valid values for the 'lenBytes' parameters is 0 bytes (no length field), + * 2 bytes and 4 bytes. + * + * @see CSafeFileIO::Write + */ + virtual void WriteString(const wxString& str, EUtf8Str encoding = utf8strNone, uint8 lenBytes = 2); + +/* Warning: Special Kad functions, needs documentation */ + + CTag* ReadTag(bool bOptACP = false); + void ReadTagPtrList(TagPtrList* taglist, bool bOptACP = false); + + void WriteTag(const CTag& tag); + void WriteTagPtrList(const TagPtrList& tagList); + +/* Special ED2Kv2 function */ + uint64 GetIntTagValue() const; + +/* Some functions I added for simplicity */ + // Very obvious + bool IsEmpty() { return (GetLength() == 0); } + + // Appends to the end + void Append(const uint8* buffer, int n) { Seek(0, wxFromEnd); Write(buffer, n); } + +protected: + /** + * The actual read / write function, as implemented by subclasses. + * + * @param buffer The buffer to read data into / write data from. + * @param count The number of bytes to read / written. + * @return The number of bytes read / written or -1 in case of errors. + * + * Note that the return value must be the actual number of bytes + * read or written, with the exception that in case of errors, -1 + * may be returned. This is because the return value is used to + * detect if the operation succeded. + * + * This function should not throw Either of the CSafeIOExceptions, + * this is done by the CSafeFileIO::Read and the CSafeFileIO::Write + * functions. + */ + //@{ + virtual sint64 doRead(void* buffer, size_t count) const = 0; + virtual sint64 doWrite(const void* buffer, size_t count) = 0; + //@} + + /** + * The actual seek function, as implemented by subclasses. + * + * @param offset The absolute offset to seek to. + * @return The resulting offset. + * + * This function should not throw of the CSafeIOExceptions, + * this is handled by the CSafeFileIO::Seek. At the moment, + * seeks that fail are considered a fatal error. + */ + virtual sint64 doSeek(sint64 offset) const = 0; + +private: + /** + * Helper-function that does the actual writing of the string. + * + * @param str The string to be written. + * @param encoding The encoding of the string. + * @param lenBytes The number of bytes used to store the string length. + * + */ + void WriteStringCore(const char* str, EUtf8Str encoding, uint8 lenBytes); +}; + + +/** + * The base class of IO exceptions used by + * the CSafeFileIO interface and implementations + * of the interface. + */ +struct CSafeIOException : public CMuleException +{ + CSafeIOException(const wxString& type, const wxString& desc); +}; + + +/** + * This exception is thrown when attempts are + * made at reading past the end of the file. + * + * This typically happens when a invalid packet + * is received that is shorter than expected and + * is not fatal. + */ +struct CEOFException : public CSafeIOException { + CEOFException(const wxString& desc); +}; + + +/** + * This exception reflects a failure in performing + * basic IO operations read and write. It will be + * thrown in case a read or a write fails to read + * or write the specified number of bytes. + */ +struct CIOFailureException : public CSafeIOException { + CIOFailureException(const wxString& type, const wxString& desc); + CIOFailureException(const wxString& desc); +}; + + +#endif // SAFEFILE_H +// File_checked_for_headers diff --git a/src/Scanner.cpp b/src/Scanner.cpp new file mode 100644 index 00000000..39430a4d --- /dev/null +++ b/src/Scanner.cpp @@ -0,0 +1,2019 @@ +#line 2 "Scanner.cpp" + +#line 4 "Scanner.cpp" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 33 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart(yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +extern int yyleng; + +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef unsigned int yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart (FILE *input_file ); +void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); +void yy_delete_buffer (YY_BUFFER_STATE b ); +void yy_flush_buffer (YY_BUFFER_STATE b ); +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); +void yypop_buffer_state (void ); + +static void yyensure_buffer_stack (void ); +static void yy_load_buffer_state (void ); +static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); + +void *yyalloc (yy_size_t ); +void *yyrealloc (void *,yy_size_t ); +void yyfree (void * ); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +#define yywrap(n) 1 +#define YY_SKIP_YYWRAP + +typedef unsigned char YY_CHAR; + +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; + +typedef int yy_state_type; + +extern int yylineno; + +int yylineno = 1; + +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + yyleng = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 9 +#define YY_END_OF_BUFFER 10 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[57] = + { 0, + 6, 6, 10, 6, 6, 1, 7, 8, 6, 6, + 6, 6, 6, 6, 6, 2, 6, 3, 4, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 5, 0 + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 4, 1, 1, 1, 1, 1, 5, + 5, 1, 1, 1, 1, 1, 1, 6, 6, 7, + 6, 6, 6, 6, 6, 6, 6, 8, 1, 1, + 1, 1, 1, 1, 9, 6, 6, 10, 6, 6, + 1, 1, 1, 1, 1, 1, 1, 11, 12, 1, + 1, 13, 1, 14, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 6, 6, 6, 15, + + 16, 6, 1, 1, 1, 1, 17, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst flex_int32_t yy_meta[18] = + { 0, + 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1 + } ; + +static yyconst flex_int16_t yy_base[58] = + { 0, + 0, 0, 45, 0, 0, 370, 370, 370, 31, 25, + 23, 20, 0, 24, 17, 0, 19, 0, 0, 8, + 16, 15, 12, 23, 34, 45, 56, 67, 78, 89, + 100, 111, 122, 133, 144, 155, 166, 177, 188, 199, + 210, 221, 232, 243, 254, 265, 276, 287, 298, 309, + 320, 331, 342, 353, 0, 370, 19 + } ; + +static yyconst flex_int16_t yy_def[58] = + { 0, + 56, 1, 56, 57, 57, 56, 56, 56, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 0, 56 + } ; + +static yyconst flex_int16_t yy_nxt[388] = + { 0, + 4, 5, 6, 7, 8, 4, 4, 4, 9, 4, + 10, 11, 4, 4, 4, 12, 4, 24, 24, 13, + 24, 24, 23, 22, 21, 20, 24, 24, 25, 25, + 19, 25, 25, 18, 17, 16, 15, 25, 25, 26, + 26, 14, 26, 26, 56, 56, 56, 56, 26, 26, + 27, 27, 56, 27, 27, 56, 56, 56, 56, 27, + 27, 28, 28, 56, 28, 28, 56, 56, 56, 56, + 28, 28, 29, 29, 56, 29, 29, 56, 56, 56, + 56, 29, 29, 30, 30, 56, 30, 30, 56, 56, + 56, 56, 30, 30, 31, 31, 56, 31, 31, 56, + + 56, 56, 56, 31, 31, 32, 32, 56, 32, 32, + 56, 56, 56, 56, 32, 32, 33, 33, 56, 33, + 33, 56, 56, 56, 56, 33, 33, 34, 34, 56, + 34, 34, 56, 56, 56, 56, 34, 34, 35, 35, + 56, 35, 35, 56, 56, 56, 56, 35, 35, 36, + 36, 56, 36, 36, 56, 56, 56, 56, 36, 36, + 37, 37, 56, 37, 37, 56, 56, 56, 56, 37, + 37, 38, 38, 56, 38, 38, 56, 56, 56, 56, + 38, 38, 39, 39, 56, 39, 39, 56, 56, 56, + 56, 39, 39, 40, 40, 56, 40, 40, 56, 56, + + 56, 56, 40, 40, 41, 41, 56, 41, 41, 56, + 56, 56, 56, 41, 41, 42, 42, 56, 42, 42, + 56, 56, 56, 56, 42, 42, 43, 43, 56, 43, + 43, 56, 56, 56, 56, 43, 43, 44, 44, 56, + 44, 44, 56, 56, 56, 56, 44, 44, 45, 45, + 56, 45, 45, 56, 56, 56, 56, 45, 45, 46, + 46, 56, 46, 46, 56, 56, 56, 56, 46, 46, + 47, 47, 56, 47, 47, 56, 56, 56, 56, 47, + 47, 48, 48, 56, 48, 48, 56, 56, 56, 56, + 48, 48, 49, 49, 56, 49, 49, 56, 56, 56, + + 56, 49, 49, 50, 50, 56, 50, 50, 56, 56, + 56, 56, 50, 50, 51, 51, 56, 51, 51, 56, + 56, 56, 56, 51, 51, 52, 52, 56, 52, 52, + 56, 56, 56, 56, 52, 52, 53, 53, 56, 53, + 53, 56, 56, 56, 56, 53, 53, 54, 54, 56, + 54, 54, 56, 56, 56, 56, 54, 54, 55, 55, + 56, 55, 55, 56, 56, 56, 56, 55, 55, 3, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56 + } ; + +static yyconst flex_int16_t yy_chk[388] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 23, 23, 57, + 23, 23, 22, 21, 20, 17, 23, 23, 24, 24, + 15, 24, 24, 14, 12, 11, 10, 24, 24, 25, + 25, 9, 25, 25, 3, 0, 0, 0, 25, 25, + 26, 26, 0, 26, 26, 0, 0, 0, 0, 26, + 26, 27, 27, 0, 27, 27, 0, 0, 0, 0, + 27, 27, 28, 28, 0, 28, 28, 0, 0, 0, + 0, 28, 28, 29, 29, 0, 29, 29, 0, 0, + 0, 0, 29, 29, 30, 30, 0, 30, 30, 0, + + 0, 0, 0, 30, 30, 31, 31, 0, 31, 31, + 0, 0, 0, 0, 31, 31, 32, 32, 0, 32, + 32, 0, 0, 0, 0, 32, 32, 33, 33, 0, + 33, 33, 0, 0, 0, 0, 33, 33, 34, 34, + 0, 34, 34, 0, 0, 0, 0, 34, 34, 35, + 35, 0, 35, 35, 0, 0, 0, 0, 35, 35, + 36, 36, 0, 36, 36, 0, 0, 0, 0, 36, + 36, 37, 37, 0, 37, 37, 0, 0, 0, 0, + 37, 37, 38, 38, 0, 38, 38, 0, 0, 0, + 0, 38, 38, 39, 39, 0, 39, 39, 0, 0, + + 0, 0, 39, 39, 40, 40, 0, 40, 40, 0, + 0, 0, 0, 40, 40, 41, 41, 0, 41, 41, + 0, 0, 0, 0, 41, 41, 42, 42, 0, 42, + 42, 0, 0, 0, 0, 42, 42, 43, 43, 0, + 43, 43, 0, 0, 0, 0, 43, 43, 44, 44, + 0, 44, 44, 0, 0, 0, 0, 44, 44, 45, + 45, 0, 45, 45, 0, 0, 0, 0, 45, 45, + 46, 46, 0, 46, 46, 0, 0, 0, 0, 46, + 46, 47, 47, 0, 47, 47, 0, 0, 0, 0, + 47, 47, 48, 48, 0, 48, 48, 0, 0, 0, + + 0, 48, 48, 49, 49, 0, 49, 49, 0, 0, + 0, 0, 49, 49, 50, 50, 0, 50, 50, 0, + 0, 0, 0, 50, 50, 51, 51, 0, 51, 51, + 0, 0, 0, 0, 51, 51, 52, 52, 0, 52, + 52, 0, 0, 0, 0, 52, 52, 53, 53, 0, + 53, 53, 0, 0, 0, 0, 53, 53, 54, 54, + 0, 54, 54, 0, 0, 0, 0, 54, 54, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +extern int yy_flex_debug; +int yy_flex_debug = 0; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "./Scanner.l" +#line 2 "./Scanner.l" +#include +#include "SearchExpr.h" +#include "Parser.hpp" +#include "ED2KLink.h" +#include + +#include "libs/common/StringFunctions.h" + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +#define YY_NEVER_INTERACTIVE 1 + +extern int yyerror(const char* errstr); +extern int yyerror(wxString errstr); + +#define YY_INPUT ReadLexBuff +#define YY_FATAL_ERROR FatalLexError + +static void ReadLexBuff(char* pcBuff, int& riResult, size_t uMaxSize); +static void FatalLexError(yyconst char msg[]); + +static char* _pszLexBuff; +static char* _pszLexStr; + +#line 584 "Scanner.cpp" + +#define INITIAL 0 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#ifndef _MSC_VER +#include +#endif +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +static int yy_init_globals (void ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap (void ); +#else +extern int yywrap (void ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ); + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + size_t n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex (void); + +#define YY_DECL int yylex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 36 "./Scanner.l" + + +#line 740 "Scanner.cpp" + + if ( !(yy_init) ) + { + (yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } + + yy_load_buffer_state( ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of yytext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 57 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 370 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = (yy_hold_char); + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 38 "./Scanner.l" +{ /* Skip blanks. */ } + YY_BREAK +case 2: +YY_RULE_SETUP +#line 39 "./Scanner.l" +{ return TOK_OR; } + YY_BREAK +case 3: +YY_RULE_SETUP +#line 40 "./Scanner.l" +{ return TOK_AND; } + YY_BREAK +case 4: +YY_RULE_SETUP +#line 41 "./Scanner.l" +{ return TOK_NOT; } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 43 "./Scanner.l" +{ + yylval.pstr = new wxString(UTF82unicode(yytext)); + return TOK_ED2K_LINK; + } + YY_BREAK +case 6: +/* rule 6 can match eol */ +YY_RULE_SETUP +#line 48 "./Scanner.l" +{ + yylval.pstr = new wxString(UTF82unicode(yytext)); + return TOK_STRING; + } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 53 "./Scanner.l" +{ + int l = 128; + char* psz = (char*)malloc(l); + int i = 0; + int c; + while ((c = yyinput()) != '\"') + { + if (c == EOF || c == '\n'){ + unput(c); + yyerror(wxT("Search expression error: unterminated string")); + break; + } + if (c == '\\'){ /*Escape sequence*/ + switch (c = yyinput()) + { + case '\n': + continue; + case 't': /*Tab*/ + c = '\t'; + break; + case 'n': /*Linefeed*/ + c = '\n'; + break; + case 'f': /*Formfeed*/ + c = '\f'; + break; + case 'r': /*Carriage return*/ + c = '\r'; + break; + case '\\': /*Backslash*/ + c = '\\'; + break; + case '"': /*Double quotation mark*/ + c = '\"'; + break; + case '\'': /*Single quotation mark*/ + c = '\''; + break; + case '?': /*Question mark*/ + c = '\?'; + break; + case 'v': /*Vertical Tab*/ + c = '\v'; + break; + case 'a': /*Alert*/ + c = '\a'; + break; + case 'b': /*Backspace*/ + c = '\b'; + break; + case 'x': /*Hexadecimal number*/ + { + int n, octv; + for (n = 1, octv = 0; n <= 3; n++) { + if ((c = yyinput()) >= '0' && c <= '9') + c -= '0'; + else if (c >= 'a' && c <= 'f') + c = (c - 'a') + 10; + else if (c >= 'A' && c <= 'F') + c = (c - 'A') + 10; + else + break; + octv = octv * 16 + c; + } + unput(c); + if (n == 1) + c = 'x'; + else + c = octv; + } + break; + } + } else { + if ((unsigned char)c >= 0x80/* && IsDBCSLeadByte(yytext[0]) */){ + psz[i++] = (unsigned char)c; + if (i >= l){ + psz = (char*)realloc(psz, l += 128); + if (psz == NULL){ + yyerror("Less memory for string"); + break; + } + } + c = yyinput(); + } + } + + psz[i++] = (unsigned char)c; + if (i >= l){ + psz = (char*)realloc(psz, l += 128); + if (psz == NULL){ + yyerror("Less memory for string"); + break; + } + } + } + psz[i] = '\0'; + yylval.pstr = new wxString(UTF82unicode(psz)); + free(psz); + return TOK_STRING; + } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 154 "./Scanner.l" +{ return yytext[0]; } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 156 "./Scanner.l" +ECHO; + YY_BREAK +#line 974 "Scanner.cpp" +case YY_STATE_EOF(INITIAL): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( yywrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of yylex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = (yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + + int yy_c_buf_p_offset = + (int) ((yy_c_buf_p) - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart(yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = (yy_start); + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 57 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + register int yy_is_jam; + register char *yy_cp = (yy_c_buf_p); + + register YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 57 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 56); + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp ) +{ + register char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up yytext */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = (yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart(yyin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap( ) ) + return EOF; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve yytext */ + (yy_hold_char) = *++(yy_c_buf_p); + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void yyrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } + + yy_init_buffer(YY_CURRENT_BUFFER,input_file ); + yy_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + yy_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void yy_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * + */ + void yy_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yyfree((void *) b->yy_ch_buf ); + + yyfree((void *) b ); +} + +#ifndef __cplusplus +extern int isatty (int ); +#endif /* __cplusplus */ + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + yy_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void yy_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + yy_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + yyensure_buffer_stack(); + + /* This block is copied from yy_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void yypop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void yyensure_buffer_stack (void) +{ + int num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param str a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * yy_scan_bytes() instead. + */ +YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) +{ + + return yy_scan_bytes(yystr,strlen(yystr) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = _yybytes_len + 2; + buf = (char *) yyalloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = (yy_hold_char); \ + (yy_c_buf_p) = yytext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int yyget_lineno (void) +{ + + return yylineno; +} + +/** Get the input stream. + * + */ +FILE *yyget_in (void) +{ + return yyin; +} + +/** Get the output stream. + * + */ +FILE *yyget_out (void) +{ + return yyout; +} + +/** Get the length of the current token. + * + */ +int yyget_leng (void) +{ + return yyleng; +} + +/** Get the current token. + * + */ + +char *yyget_text (void) +{ + return yytext; +} + +/** Set the current line number. + * @param line_number + * + */ +void yyset_lineno (int line_number ) +{ + + yylineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see yy_switch_to_buffer + */ +void yyset_in (FILE * in_str ) +{ + yyin = in_str ; +} + +void yyset_out (FILE * out_str ) +{ + yyout = out_str ; +} + +int yyget_debug (void) +{ + return yy_flex_debug; +} + +void yyset_debug (int bdebug ) +{ + yy_flex_debug = bdebug ; +} + +static int yy_init_globals (void) +{ + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from yylex_destroy(), so don't allocate here. + */ + + (yy_buffer_stack) = 0; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = (char *) 0; + (yy_init) = 0; + (yy_start) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = (FILE *) 0; + yyout = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * yylex_init() + */ + return 0; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + yypop_buffer_state(); + } + + /* Destroy the stack itself. */ + yyfree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * yylex() is called, initialization will occur. */ + yy_init_globals( ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *yyalloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *yyrealloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void yyfree (void * ptr ) +{ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 156 "./Scanner.l" + + + +static void ReadLexBuff(char* pcBuff, int& riResult, size_t uMaxSize) +{ + wxASSERT( _pszLexBuff != NULL ); + + if (_pszLexBuff == NULL) { + YY_FATAL_ERROR("Input in flex scanner failed"); + } + + wxASSERT( sizeof(YY_CHAR) == sizeof(char) ); + size_t uCharsInBuff = strlen(_pszLexBuff); + size_t uCharsRead = min(uMaxSize, uCharsInBuff); + riResult = uCharsRead; + memcpy(pcBuff, _pszLexBuff, uCharsRead); + _pszLexBuff += uCharsRead; +} + +static void FatalLexError(yyconst char msg[]) +{ +#ifdef _CONSOLE + printf("Fatal error in flex scanner: %s\n", msg); +#else + printf("Fatal error in flex scanner: %s\n", msg); +#endif +} + +void LexInit(const wxString& pszInput) +{ + _pszLexStr = strdup(unicode2UTF8(pszInput)); + _pszLexBuff = _pszLexStr; +} + +void LexFree() +{ + yylex_destroy(); + + yyleng = 0; + yytext = NULL; + yyin = NULL; + yyout = NULL; + yy_hold_char = '\0'; + yy_n_chars = 0; + yy_c_buf_p = NULL; + yy_start = 0; + yy_did_buffer_switch_on_eof = 0; + yy_last_accepting_state = 0; + yy_last_accepting_cpos = NULL; + +#if YY_STACK_USED + yy_start_stack_ptr = 0; + yy_start_stack_depth = 0; + yy_start_stack = NULL; +#endif + + free(_pszLexStr); +} + diff --git a/src/Scanner.h b/src/Scanner.h new file mode 100644 index 00000000..95d9dc75 --- /dev/null +++ b/src/Scanner.h @@ -0,0 +1 @@ +// Empty file generated by a flex version unable to create headers diff --git a/src/Scanner.h.in b/src/Scanner.h.in new file mode 100644 index 00000000..6c8bb2f9 --- /dev/null +++ b/src/Scanner.h.in @@ -0,0 +1,4 @@ +int yylex(); +int yylex_destroy(); +void LexInit(const wxString& pszInput); +void LexFree(); diff --git a/src/Scanner.l b/src/Scanner.l new file mode 100644 index 00000000..f78f1740 --- /dev/null +++ b/src/Scanner.l @@ -0,0 +1,212 @@ +%{ +#include +#include "SearchExpr.h" +#include "Parser.hpp" +#include "ED2KLink.h" +#include + +#include "libs/common/StringFunctions.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +#define YY_NEVER_INTERACTIVE 1 + +extern int yyerror(const char* errstr); +extern int yyerror(wxString errstr); + +#define YY_INPUT ReadLexBuff +#define YY_FATAL_ERROR FatalLexError + +static void ReadLexBuff(char* pcBuff, int& riResult, size_t uMaxSize); +static void FatalLexError(yyconst char msg[]); + +static char* _pszLexBuff; +static char* _pszLexStr; + +%} + +%option noyywrap + +keywordchar [^ \"()] + +%% + +[ ] { /* Skip blanks. */ } +"OR" { return TOK_OR; } +"AND" { return TOK_AND; } +"NOT" { return TOK_NOT; } + +"ed2k::"[a-fA-F0-9]{32} { + yylval.pstr = new wxString(UTF82unicode(yytext)); + return TOK_ED2K_LINK; + } + +{keywordchar}* { + yylval.pstr = new wxString(UTF82unicode(yytext)); + return TOK_STRING; + } + +"\"" { + int l = 128; + char* psz = (char*)malloc(l); + int i = 0; + int c; + while ((c = yyinput()) != '\"') + { + if (c == EOF || c == '\n'){ + unput(c); + yyerror(wxT("Search expression error: unterminated string")); + break; + } + if (c == '\\'){ /*Escape sequence*/ + switch (c = yyinput()) + { + case '\n': + continue; + case 't': /*Tab*/ + c = '\t'; + break; + case 'n': /*Linefeed*/ + c = '\n'; + break; + case 'f': /*Formfeed*/ + c = '\f'; + break; + case 'r': /*Carriage return*/ + c = '\r'; + break; + case '\\': /*Backslash*/ + c = '\\'; + break; + case '"': /*Double quotation mark*/ + c = '\"'; + break; + case '\'': /*Single quotation mark*/ + c = '\''; + break; + case '?': /*Question mark*/ + c = '\?'; + break; + case 'v': /*Vertical Tab*/ + c = '\v'; + break; + case 'a': /*Alert*/ + c = '\a'; + break; + case 'b': /*Backspace*/ + c = '\b'; + break; + case 'x': /*Hexadecimal number*/ + { + int n, octv; + for (n = 1, octv = 0; n <= 3; n++) { + if ((c = yyinput()) >= '0' && c <= '9') + c -= '0'; + else if (c >= 'a' && c <= 'f') + c = (c - 'a') + 10; + else if (c >= 'A' && c <= 'F') + c = (c - 'A') + 10; + else + break; + octv = octv * 16 + c; + } + unput(c); + if (n == 1) + c = 'x'; + else + c = octv; + } + break; + } + } else { + if ((unsigned char)c >= 0x80/* && IsDBCSLeadByte(yytext[0]) */){ + psz[i++] = (unsigned char)c; + if (i >= l){ + psz = (char*)realloc(psz, l += 128); + if (psz == NULL){ + yyerror("Less memory for string"); + break; + } + } + c = yyinput(); + } + } + + psz[i++] = (unsigned char)c; + if (i >= l){ + psz = (char*)realloc(psz, l += 128); + if (psz == NULL){ + yyerror("Less memory for string"); + break; + } + } + } + psz[i] = '\0'; + yylval.pstr = new wxString(UTF82unicode(psz)); + free(psz); + return TOK_STRING; + } + +. { return yytext[0]; } + +%% + +static void ReadLexBuff(char* pcBuff, int& riResult, size_t uMaxSize) +{ + wxASSERT( _pszLexBuff != NULL ); + + if (_pszLexBuff == NULL) { + YY_FATAL_ERROR("Input in flex scanner failed"); + } + + wxASSERT( sizeof(YY_CHAR) == sizeof(char) ); + size_t uCharsInBuff = strlen(_pszLexBuff); + size_t uCharsRead = min(uMaxSize, uCharsInBuff); + riResult = uCharsRead; + memcpy(pcBuff, _pszLexBuff, uCharsRead); + _pszLexBuff += uCharsRead; +} + +static void FatalLexError(yyconst char msg[]) +{ +#ifdef _CONSOLE + printf("Fatal error in flex scanner: %s\n", msg); +#else + printf("Fatal error in flex scanner: %s\n", msg); +#endif +} + +void LexInit(const wxString& pszInput) +{ + _pszLexStr = strdup(unicode2UTF8(pszInput)); + _pszLexBuff = _pszLexStr; +} + +void LexFree() +{ + yylex_destroy(); + + yyleng = 0; + yytext = NULL; + yyin = NULL; + yyout = NULL; + yy_hold_char = '\0'; + yy_n_chars = 0; + yy_c_buf_p = NULL; + yy_start = 0; + yy_did_buffer_switch_on_eof = 0; + yy_last_accepting_state = 0; + yy_last_accepting_cpos = NULL; + +#if YY_STACK_USED + yy_start_stack_ptr = 0; + yy_start_stack_depth = 0; + yy_start_stack = NULL; +#endif + + free(_pszLexStr); +} diff --git a/src/ScopedPtr.h b/src/ScopedPtr.h new file mode 100644 index 00000000..d0a02ad5 --- /dev/null +++ b/src/ScopedPtr.h @@ -0,0 +1,220 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2006-2008 Mikkel Schubert ( xaignar@users.sourceforge.net ) +// Copyright (c) 2006-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef SCOPEDPTR_H +#define SCOPEDPTR_H + + +/** + * CScopedPtr is a simple smart pointer. + * + * This class is a replacement for std::auto_ptr, with simpler + * copying schematics, in that it doesn't allow copying or + * assignment, compared to auto_ptr, which allows only one + * instance to own a pointer (swapping at assignment). + */ +template +class CScopedPtr +{ +public: + /** Constructor. Note that CScopedPtr takes ownership of the pointer. */ + CScopedPtr(TYPE* ptr); + + /** Frees the pointer owned by the instance. */ + ~CScopedPtr(); + + + //@{ + /** Deference operators. */ + TYPE& operator*() const; + TYPE* operator->() const; + //@} + + + /** Returns the actual pointer value. */ + TYPE* get() const; + + /** Sets the actual pointer to a different value. The old pointer is freed. */ + void reset(TYPE* ptr = 0); + + /** Returns the actual pointer. The scoped-ptr will thereafter contain NULL. */ + TYPE* release(); + +private: + //@{ + //! A scoped pointer is neither copyable, nor assignable. + CScopedPtr(const CScopedPtr&); + CScopedPtr& operator=(const CScopedPtr&); + //@} + + TYPE* m_ptr; +}; + + +/** + * Similar to CScopedPtr, except that an array is expected. + * + * @see CScopedPtr + */ +template +class CScopedArray +{ +public: + /** Constructor. Note that CScopedArray takes ownership of the array. */ + CScopedArray(TYPE* ptr); + + /** Frees the array owned by this instance. */ + ~CScopedArray(); + + + /** Accessor. */ + TYPE& operator[](unsigned i) const; + + + /** @see CScopedPtr::get */ + TYPE* get() const; + + /** @see CScopedPtr::reset */ + void reset(TYPE* ptr = 0); + + /** @see CScopedPtr::release */ + TYPE* release(); + +private: + //@{ + //! A scoped array is neither copyable, nor assignable. + CScopedArray(const CScopedArray&); + CScopedArray& operator=(const CScopedArray&); + //@} + + TYPE* m_ptr; +}; + + + + +//////////////////////////////////////////////////////////// +// Implementations + +template +CScopedPtr::CScopedPtr(TYPE* ptr) + : m_ptr(ptr) +{ +} + + +template +CScopedPtr::~CScopedPtr() +{ + delete m_ptr; +} + + +template +TYPE& CScopedPtr::operator*() const +{ + return *m_ptr; +} + + +template +TYPE* CScopedPtr::operator->() const +{ + return m_ptr; +} + + +template +TYPE* CScopedPtr::get() const +{ + return m_ptr; +} + + +template +void CScopedPtr::reset(TYPE* ptr) +{ + delete m_ptr; + m_ptr = ptr; +} + + +template +TYPE* CScopedPtr::release() +{ + TYPE* ptr = m_ptr; + m_ptr = 0; + return ptr; +} + + + +template +CScopedArray::CScopedArray(TYPE* ptr) + : m_ptr(ptr) +{ +} + + +template +CScopedArray::~CScopedArray() +{ + delete[] m_ptr; +} + + +template +TYPE& CScopedArray::operator[](unsigned i) const +{ + return m_ptr[i]; +} + + +template +TYPE* CScopedArray::get() const +{ + return m_ptr; +} + + +template +void CScopedArray::reset(TYPE* ptr) +{ + delete[] m_ptr; + m_ptr = ptr; +} + + +template +TYPE* CScopedArray::release() +{ + TYPE* ptr = m_ptr; + m_ptr = 0; + return ptr; +} + + +#endif // SCOPEDPTR_H +// File_checked_for_headers diff --git a/src/SearchDlg.cpp b/src/SearchDlg.cpp new file mode 100644 index 00000000..ac964dfc --- /dev/null +++ b/src/SearchDlg.cpp @@ -0,0 +1,611 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include + +#include // Do_not_auto_remove (win32) + +#include + +#include "SearchDlg.h" // Interface declarations. +#include "SearchListCtrl.h" // Needed for CSearchListCtrl +#include "muuli_wdr.h" // Needed for IDC_STARTS +#include "amuleDlg.h" // Needed for CamuleDlg +#include "MuleNotebook.h" +#include "GetTickCount.h" +#include "Preferences.h" +#include "amule.h" // Needed for theApp +#include "SearchList.h" // Needed for CSearchList +#include +#include "Logger.h" + +#define ID_SEARCHLISTCTRL wxID_HIGHEST+667 + +// just to keep compiler happy +static wxCommandEvent nullEvent; + + +BEGIN_EVENT_TABLE(CSearchDlg, wxPanel) + EVT_BUTTON( IDC_STARTS, CSearchDlg::OnBnClickedStart) + EVT_TEXT_ENTER( IDC_SEARCHNAME, CSearchDlg::OnBnClickedStart) + + EVT_BUTTON(IDC_CANCELS, CSearchDlg::OnBnClickedStop) + + EVT_LIST_ITEM_SELECTED(ID_SEARCHLISTCTRL, CSearchDlg::OnListItemSelected) + + EVT_BUTTON(IDC_SDOWNLOAD, CSearchDlg::OnBnClickedDownload) + EVT_BUTTON(IDC_SEARCH_RESET, CSearchDlg::OnBnClickedReset) + EVT_BUTTON(IDC_CLEAR_RESULTS, CSearchDlg::OnBnClickedClear) + + EVT_CHECKBOX(IDC_EXTENDEDSEARCHCHECK,CSearchDlg::OnExtendedSearchChange) + EVT_CHECKBOX(IDC_FILTERCHECK,CSearchDlg::OnFilterCheckChange) + + EVT_MULENOTEBOOK_PAGE_CLOSING(ID_NOTEBOOK, CSearchDlg::OnSearchClosing) + EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK, CSearchDlg::OnSearchPageChanged) + + // Event handlers for the parameter fields getting changed + EVT_CUSTOM( wxEVT_COMMAND_TEXT_UPDATED, IDC_SEARCHNAME, CSearchDlg::OnFieldChanged) + EVT_CUSTOM( wxEVT_COMMAND_TEXT_UPDATED, IDC_EDITSEARCHEXTENSION, CSearchDlg::OnFieldChanged) + EVT_CUSTOM( wxEVT_COMMAND_SPINCTRL_UPDATED, wxID_ANY, CSearchDlg::OnFieldChanged) + EVT_CUSTOM( wxEVT_COMMAND_CHOICE_SELECTED, wxID_ANY, CSearchDlg::OnFieldChanged) + + // Event handlers for the filter fields getting changed. + EVT_TEXT_ENTER(ID_FILTER_TEXT, CSearchDlg::OnFilteringChange) + EVT_CHECKBOX(ID_FILTER_INVERT, CSearchDlg::OnFilteringChange) + EVT_CHECKBOX(ID_FILTER_KNOWN, CSearchDlg::OnFilteringChange) + EVT_BUTTON(ID_FILTER, CSearchDlg::OnFilteringChange) +END_EVENT_TABLE() + + + +CSearchDlg::CSearchDlg(wxWindow* pParent) +: wxPanel(pParent, -1) +{ + m_last_search_time = 0; + + wxSizer* content = searchDlg(this, true); + content->Show(this, true); + + m_progressbar = CastChild( ID_SEARCHPROGRESS, wxGauge ); + m_progressbar->SetRange(100); + + m_notebook = CastChild( ID_NOTEBOOK, CMuleNotebook ); + +#if defined(__WXMAC__) + //#warning TODO: restore the image list if/when wxMac supports locating the image +#else + // Initialise the image list + wxImageList* m_ImageList = new wxImageList(16,16); + m_ImageList->Add(amuleSpecial(3)); + m_ImageList->Add(amuleSpecial(4)); + m_notebook->AssignImageList(m_ImageList); +#endif + + // Sanity sanity + wxASSERT(CastChild( ID_SEARCHTYPE, wxChoice )->GetString(0) == _("Local")); + wxASSERT(CastChild( ID_SEARCHTYPE, wxChoice )->GetString(2) == _("Kad")); + + if (thePrefs::GetNetworkED2K()){ + CastChild( ID_SEARCHTYPE, wxChoice )->SetSelection(0); + } else { + CastChild( ID_SEARCHTYPE, wxChoice )->SetSelection(2); + } + + CastChild( IDC_TypeSearch, wxChoice )->SetSelection(0); + CastChild( IDC_SEARCHMINSIZE, wxChoice )->SetSelection(2); + CastChild( IDC_SEARCHMAXSIZE, wxChoice )->SetSelection(2); + + // Not there initially. + s_searchsizer->Show(s_extendedsizer, false); + s_searchsizer->Show(s_filtersizer, false); + + Layout(); +} + + +CSearchDlg::~CSearchDlg() +{ +} + + +CSearchListCtrl* CSearchDlg::GetSearchList( wxUIntPtr id ) +{ + int nPages = m_notebook->GetPageCount(); + for ( int i = 0; i < nPages; i++ ) { + CSearchListCtrl* page = dynamic_cast(m_notebook->GetPage(i)); + + if (page->GetSearchId() == id) { + return page; + } + } + + return NULL; +} + + +void CSearchDlg::AddResult(CSearchFile* toadd) +{ + CSearchListCtrl* outputwnd = GetSearchList( toadd->GetSearchID() ); + + if ( outputwnd ) { + outputwnd->AddResult( toadd ); + + // Update the result count + UpdateHitCount( outputwnd ); + } +} + + +void CSearchDlg::UpdateResult(CSearchFile* toupdate) +{ + CSearchListCtrl* outputwnd = GetSearchList( toupdate->GetSearchID() ); + + if ( outputwnd ) { + outputwnd->UpdateResult( toupdate ); + + // Update the result count + UpdateHitCount( outputwnd ); + } +} + + +void CSearchDlg::OnListItemSelected(wxListEvent& event) +{ + FindWindow(IDC_SDOWNLOAD)->Enable(true); + + event.Skip(); +} + + +void CSearchDlg::OnExtendedSearchChange(wxCommandEvent& event) +{ + s_searchsizer->Show(s_extendedsizer, event.IsChecked()); + + Layout(); +} + + +void CSearchDlg::OnFilterCheckChange(wxCommandEvent& event) +{ + s_searchsizer->Show(s_filtersizer, event.IsChecked()); + Layout(); + + int nPages = m_notebook->GetPageCount(); + for ( int i = 0; i < nPages; i++ ) { + CSearchListCtrl* page = dynamic_cast(m_notebook->GetPage(i)); + + page->EnableFiltering(event.IsChecked()); + + UpdateHitCount(page); + } +} + + +void CSearchDlg::OnSearchClosing(wxNotebookEvent& evt) +{ + // Abort global search if it was last tab that was closed. + if ( evt.GetSelection() == ((int)m_notebook->GetPageCount() - 1 ) ) { + OnBnClickedStop(nullEvent); + } + + CSearchListCtrl *ctrl = dynamic_cast(m_notebook->GetPage(evt.GetSelection())); + wxASSERT(ctrl); + // Zero to avoid results added while destructing. + ctrl->ShowResults(0); + theApp->searchlist->RemoveResults(ctrl->GetSearchId()); + + // Do cleanups if this was the last tab + if ( m_notebook->GetPageCount() == 1 ) { + FindWindow(IDC_SDOWNLOAD)->Enable(FALSE); + FindWindow(IDC_CLEAR_RESULTS)->Enable(FALSE); + } +} + + +void CSearchDlg::OnSearchPageChanged(wxNotebookEvent& WXUNUSED(evt)) +{ + int selection = m_notebook->GetSelection(); + + // Workaround for a bug in wxWidgets, where deletions of pages + // can result in an invalid selection. This has been reported as + // http://sourceforge.net/tracker/index.php?func=detail&aid=1865141&group_id=9863&atid=109863 + if (selection >= (int)m_notebook->GetPageCount()) { + selection = m_notebook->GetPageCount() - 1; + } + + // Only enable the Download button for pages where files have been selected + if ( selection != -1 ) { + CSearchListCtrl *ctrl = dynamic_cast(m_notebook->GetPage(selection)); + + bool enable = ctrl->GetSelectedItemCount(); + FindWindow(IDC_SDOWNLOAD)->Enable( enable ); + + // set IDC_SEARCHNAME control to search text of currently selected tab + wxString SearchText = m_notebook->GetPageText(selection).BeforeLast(wxT(' ')); + wxString rest; + if (SearchText.StartsWith(wxT("!"), &rest)) { + SearchText = rest; + } + + // This check is needed because some wxWidgets (tested with + // 2.8.7) will return an empty string during the page-changed + // event resulting from the first page to being inserted. This + // has been reported as patch #1895161: + // http://sourceforge.net/tracker/index.php?func=detail&aid=1895161&group_id=9863&atid=309863 + if (SearchText.Length()) { + CastChild(IDC_SEARCHNAME, wxTextCtrl)->SetValue(SearchText); + + } + + // Select everything. + CastChild(IDC_SEARCHNAME, wxTextCtrl)->SetSelection(-1, -1); + } + +} + + +void CSearchDlg::OnBnClickedStart(wxCommandEvent& WXUNUSED(evt)) +{ + wxString searchString = CastChild( IDC_SEARCHNAME, wxTextCtrl )->GetValue(); + searchString.Trim(true); + searchString.Trim(false); + + if ( searchString.IsEmpty() ) { + return; + } + + wxChoice* choice = CastChild( ID_SEARCHTYPE, wxChoice ); + + // Web seaches + switch ( choice->GetSelection() ) { + // Local Search + case 0: + // Global Search + case 1: + // Kad Search + case 2: + // We musn't search more often than once every 2 secs + if ((GetTickCount() - m_last_search_time) > 2000) { + m_last_search_time = GetTickCount(); + + OnBnClickedStop(nullEvent); + + StartNewSearch(); + } + + break; + + // Web Search (FileHash.com) + case 3: + theApp->amuledlg->LaunchUrl(theApp->amuledlg->GenWebSearchUrl(searchString, CamuleDlg::WS_FILEHASH)); + break; + + // Error + default: + wxASSERT(0); + } +} + + +void CSearchDlg::OnFieldChanged( wxEvent& WXUNUSED(evt) ) +{ + bool enable = false; + + // These are the IDs of the search-fields + int textfields[] = { IDC_SEARCHNAME, IDC_EDITSEARCHEXTENSION }; + + for ( uint16 i = 0; i < itemsof(textfields); i++ ) { + enable |= !CastChild( textfields[i], wxTextCtrl )->GetValue().IsEmpty(); + } + + // Check if either of the dropdowns have been changed + enable |= (CastChild(IDC_SEARCHMINSIZE, wxChoice)->GetSelection() != 2); + enable |= (CastChild(IDC_SEARCHMAXSIZE, wxChoice)->GetSelection() != 2); + enable |= (CastChild(IDC_TypeSearch, wxChoice)->GetSelection() > 0); + enable |= (CastChild(ID_AUTOCATASSIGN, wxChoice)->GetSelection() > 0); + + // These are the IDs of the search-fields + int spinfields[] = { IDC_SPINSEARCHMIN, IDC_SPINSEARCHMAX, IDC_SPINSEARCHAVAIBILITY }; + for ( uint16 i = 0; i < itemsof(spinfields); i++ ) { + enable |= (CastChild( spinfields[i], wxSpinCtrl )->GetValue() > 0); + } + + // Enable the "Reset" button if any fields contain text + FindWindow(IDC_SEARCH_RESET)->Enable( enable ); + + // Enable the Server Search button if the Name field contains text + enable = !CastChild( IDC_SEARCHNAME, wxTextCtrl )->GetValue().IsEmpty(); + FindWindow(IDC_STARTS)->Enable( enable ); +} + + +void CSearchDlg::OnFilteringChange(wxCommandEvent& WXUNUSED(evt)) +{ + wxString filter = CastChild(ID_FILTER_TEXT, wxTextCtrl)->GetValue(); + bool invert = CastChild(ID_FILTER_INVERT, wxCheckBox)->GetValue(); + bool known = CastChild(ID_FILTER_KNOWN, wxCheckBox)->GetValue(); + + // Check that the expression compiles before we try to assign it + // Otherwise we will get an error-dialog for each result-list. + if (wxRegEx(filter, wxRE_DEFAULT | wxRE_ICASE).IsValid()) { + int nPages = m_notebook->GetPageCount(); + for ( int i = 0; i < nPages; i++ ) { + CSearchListCtrl* page = dynamic_cast(m_notebook->GetPage(i)); + + page->SetFilter(filter, invert, known); + + UpdateHitCount(page); + } + } +} + + +bool CSearchDlg::CheckTabNameExists(const wxString& searchString) +{ + int nPages = m_notebook->GetPageCount(); + for ( int i = 0; i < nPages; i++ ) { + // The BeforeLast(' ') is to strip the hit-count from the name + if ( m_notebook->GetPageText(i).BeforeLast(wxT(' ')) == searchString ) { + return true; + } + } + + return false; +} + + +void CSearchDlg::CreateNewTab(const wxString& searchString, wxUIntPtr nSearchID) +{ + CSearchListCtrl* list = new CSearchListCtrl( (wxWindow*)m_notebook, ID_SEARCHLISTCTRL, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxNO_BORDER); + m_notebook->AddPage(list, searchString, true, 0); + + // Ensure that new results are filtered + bool enable = CastChild(IDC_FILTERCHECK, wxCheckBox)->GetValue(); + wxString filter = CastChild(ID_FILTER_TEXT, wxTextCtrl)->GetValue(); + bool invert = CastChild(ID_FILTER_INVERT, wxCheckBox)->GetValue(); + bool known = CastChild(ID_FILTER_KNOWN, wxCheckBox)->GetValue(); + + list->SetFilter(filter, invert, known); + list->EnableFiltering(enable); + list->ShowResults(nSearchID); + + Layout(); + FindWindow(IDC_CLEAR_RESULTS)->Enable(true); +} + + +void CSearchDlg::OnBnClickedStop(wxCommandEvent& WXUNUSED(evt)) +{ + theApp->searchlist->StopGlobalSearch(); + ResetControls(); +} + + +void CSearchDlg::ResetControls() +{ + m_progressbar->SetValue(0); + + FindWindow(IDC_CANCELS)->Disable(); + FindWindow(IDC_STARTS)->Enable(!CastChild( IDC_SEARCHNAME, wxTextCtrl )->GetValue().IsEmpty()); +} + + +void CSearchDlg::LocalSearchEnd() +{ + ResetControls(); +} + +void CSearchDlg::KadSearchEnd(uint32 id) +{ + int nPages = m_notebook->GetPageCount(); + for (int i = 0; i < nPages; ++i) { + CSearchListCtrl* page = + dynamic_cast(m_notebook->GetPage(i)); + if (page->GetSearchId() == id) { + wxString rest; + if (m_notebook->GetPageText(i).StartsWith(wxT("!"),&rest)) { + m_notebook->SetPageText(i,rest); + } + } + } +} + +void CSearchDlg::OnBnClickedDownload(wxCommandEvent& WXUNUSED(evt)) +{ + int sel = m_notebook->GetSelection(); + if (sel != -1) { + CSearchListCtrl* list = dynamic_cast(m_notebook->GetPage(sel)); + + // Download with items added to category specified in the drop-down menu + list->DownloadSelected(); + } +} + + +void CSearchDlg::OnBnClickedClear(wxCommandEvent& WXUNUSED(ev)) +{ + OnBnClickedStop(nullEvent); + + m_notebook->DeleteAllPages(); + + FindWindow(IDC_CLEAR_RESULTS)->Enable(FALSE); + FindWindow(IDC_SDOWNLOAD)->Enable(FALSE); +} + + +void CSearchDlg::StartNewSearch() +{ + static uint32 m_nSearchID = 0; + m_nSearchID++; + + FindWindow(IDC_STARTS)->Disable(); + FindWindow(IDC_SDOWNLOAD)->Disable(); + FindWindow(IDC_CANCELS)->Enable(); + + CSearchList::CSearchParams params; + + params.searchString = CastChild( IDC_SEARCHNAME, wxTextCtrl )->GetValue(); + params.searchString.Trim(true); + params.searchString.Trim(false); + + if (params.searchString.IsEmpty()) { + return; + } + + if (CastChild(IDC_EXTENDEDSEARCHCHECK, wxCheckBox)->GetValue()) { + params.extension = CastChild( IDC_EDITSEARCHEXTENSION, wxTextCtrl )->GetValue(); + + uint32 sizemin = GetTypeSize( (uint8) CastChild( IDC_SEARCHMINSIZE, wxChoice )->GetSelection() ); + uint32 sizemax = GetTypeSize( (uint8) CastChild( IDC_SEARCHMAXSIZE, wxChoice )->GetSelection() ); + + // Parameter Minimum Size + params.minSize = CastChild( IDC_SPINSEARCHMIN, wxSpinCtrl )->GetValue() * sizemin; + + // Parameter Maximum Size + params.maxSize = CastChild( IDC_SPINSEARCHMAX, wxSpinCtrl )->GetValue() * sizemax; + + if ((params.maxSize < params.minSize) && (params.maxSize)) { + wxMessageDialog dlg(this, + _("Min size must be smaller than max size. Max size ignored."), + _("Search warning"), wxOK|wxCENTRE|wxICON_INFORMATION); + dlg.ShowModal(); + + params.maxSize = 0; + } + + // Parameter Availability + params.availability = CastChild( IDC_SPINSEARCHAVAIBILITY, wxSpinCtrl )->GetValue(); + + switch ( CastChild( IDC_TypeSearch, wxChoice )->GetSelection() ) { + case 0: params.typeText = wxEmptyString; break; + case 1: params.typeText = ED2KFTSTR_ARCHIVE; break; + case 2: params.typeText = ED2KFTSTR_AUDIO; break; + case 3: params.typeText = ED2KFTSTR_CDIMAGE; break; + case 4: params.typeText = ED2KFTSTR_IMAGE; break; + case 5: params.typeText = ED2KFTSTR_PROGRAM; break; + case 6: params.typeText = ED2KFTSTR_DOCUMENT; break; + case 7: params.typeText = ED2KFTSTR_VIDEO; break; + default: + AddDebugLogLineM( true, logGeneral, + CFormat( wxT("Warning! Unknown search-category (%s) selected!") ) + % params.typeText + ); + break; + } + } + + SearchType search_type = KadSearch; + switch (CastChild( ID_SEARCHTYPE, wxChoice )->GetSelection()) { + case 0: // Local Search + search_type = LocalSearch; + break; + case 1: // Global Search + search_type = GlobalSearch; + break; + case 2: // Kad search + search_type = KadSearch; + break; + default: + // Should never happen + wxASSERT(0); + break; + } + uint32 real_id = m_nSearchID; + wxString error = theApp->searchlist->StartNewSearch(&real_id, search_type, params); + if (!error.IsEmpty()) { + // Search failed / Remote in progress + wxMessageBox(error, _("Search warning"), + wxOK | wxCENTRE | wxICON_INFORMATION, this); + FindWindow(IDC_STARTS)->Enable(); + FindWindow(IDC_SDOWNLOAD)->Disable(); + FindWindow(IDC_CANCELS)->Disable(); + } else { + CreateNewTab( + ((search_type == KadSearch) ? wxT("!") : wxEmptyString) + + params.searchString + wxT(" (0)"), + real_id); + } +} + + +void CSearchDlg::UpdateHitCount(CSearchListCtrl* page) +{ + for ( uint32 i = 0; i < (uint32)m_notebook->GetPageCount(); ++i ) { + if ( m_notebook->GetPage(i) == page ) { + wxString searchtxt = m_notebook->GetPageText(i).BeforeLast(wxT(' ')); + + if ( !searchtxt.IsEmpty() ) { + size_t shown = page->GetItemCount(); + size_t hidden = page->GetHiddenItemCount(); + + if (hidden) { + searchtxt += wxString::Format(wxT(" (%u/%u)"), shown, shown + hidden); + } else { + searchtxt += wxString::Format(wxT(" (%u)"), shown); + } + + m_notebook->SetPageText(i, searchtxt); + } + + break; + } + } +} + + +void CSearchDlg::OnBnClickedReset(wxCommandEvent& WXUNUSED(evt)) +{ + CastChild( IDC_SEARCHNAME, wxTextCtrl )->Clear(); + CastChild( IDC_EDITSEARCHEXTENSION, wxTextCtrl )->Clear(); + CastChild( IDC_SPINSEARCHMIN, wxSpinCtrl )->SetValue(0); + CastChild( IDC_SEARCHMINSIZE, wxChoice )->SetSelection(2); + CastChild( IDC_SPINSEARCHMAX, wxSpinCtrl )->SetValue(0); + CastChild( IDC_SEARCHMAXSIZE, wxChoice )->SetSelection(2); + CastChild( IDC_SPINSEARCHAVAIBILITY, wxSpinCtrl )->SetValue(0); + CastChild( IDC_TypeSearch, wxChoice )->SetSelection(0); + CastChild( ID_AUTOCATASSIGN, wxChoice )->SetSelection(0); + + FindWindow(IDC_SEARCH_RESET)->Enable(FALSE); +} + + +void CSearchDlg::UpdateCatChoice() +{ + wxChoice* c_cat = CastChild( ID_AUTOCATASSIGN, wxChoice ); + c_cat->Clear(); + + c_cat->Append(_("Main")); + + for ( unsigned i = 1; i < theApp->glob_prefs->GetCatCount(); i++ ) { + c_cat->Append( theApp->glob_prefs->GetCategory( i )->title ); + } + + c_cat->SetSelection( 0 ); +} + +void CSearchDlg::UpdateProgress(uint32 new_value) { + m_progressbar->SetValue(new_value); +} +// File_checked_for_headers diff --git a/src/SearchDlg.h b/src/SearchDlg.h new file mode 100644 index 00000000..87236e9b --- /dev/null +++ b/src/SearchDlg.h @@ -0,0 +1,171 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef SEARCHDLG_H +#define SEARCHDLG_H + +#include // Needed for wxPanel + +#include "Types.h" // Needed for uint16 and uint32 + + +class CMuleNotebook; +class CSearchListCtrl; +class CMuleNotebookEvent; +class wxListEvent; +class wxNotebookEvent; +class wxSpinEvent; +class wxGauge; +class CSearchFile; + + +/** + * This class represents the Search Dialog, which takes care of + * enabling the user to search and to display results in a readable + * manner. + */ +class CSearchDlg : public wxPanel +{ +public: + /** + * Constructor. + * + * @param pParent The parent widget passed to the wxPanel constructor. + */ + CSearchDlg(wxWindow* pParent); + + /** + * Destructor. + */ + ~CSearchDlg(); + + + /** + * Adds the provided result to the right result-list. + * + * Please note that there is no duplicates checking, so the files should + * indeed be a new result. + */ + void AddResult(CSearchFile* toadd); + + /** + * Updates a changed result. + * + * @param A pointer to the updated CSearchFile. + * + * This function will update the source-count and color of the result, and + * if needed, it will also move the result so that the current sorting + * is maintained. + */ + void UpdateResult(CSearchFile* toupdate); + + /** + * Checks if a result-page with the specified heading exists. + * + * @param searchString The heading to look for. + */ + bool CheckTabNameExists(const wxString& searchString); + + /** + * Creates a new tab and displays the specified results. + * + * @param searchString This will be the heading of the new page. + * @param nSearchID The results with this searchId will be displayed. + */ + void CreateNewTab(const wxString& searchString, wxUIntPtr nSearchID); + + + /** + * Call this function to signify that the local search is over. + */ + void LocalSearchEnd(); + + + /** + * Call this function to signify that the kad search is over. + */ + void KadSearchEnd(uint32 id); + + + /** + * This function updates the category list according to existing categories. + */ + void UpdateCatChoice(); + + + /** + * This function displays the the hit-count in the heading for the specified page. + * + * @param page The page to have its heading updated. + */ + void UpdateHitCount(CSearchListCtrl* page); + + /** + * Helper function which resets the controls. + */ + void ResetControls(); + + // Event handler and helper function + void OnBnClickedDownload(wxCommandEvent& ev); + + CSearchListCtrl* GetSearchList( wxUIntPtr id ); + + void UpdateProgress(uint32 new_value); + + void StartNewSearch(); + +private: + // Event handlers + void OnFieldChanged(wxEvent& evt); + + void OnListItemSelected(wxListEvent& ev); + void OnBnClickedReset(wxCommandEvent& ev); + void OnBnClickedClear(wxCommandEvent& ev); + void OnExtendedSearchChange(wxCommandEvent& ev); + void OnFilterCheckChange(wxCommandEvent& ev); + void OnFilteringChange(wxCommandEvent& ev); + + void OnSearchClosing(wxNotebookEvent& evt); + + void OnBnClickedStart(wxCommandEvent& evt); + void OnBnClickedStop(wxCommandEvent& evt); + + + /** + * Event-handler for page-chages which takes care of enabling/disabling the download button. + */ + void OnSearchPageChanged(wxNotebookEvent& evt); + + uint32 m_last_search_time; + + wxGauge* m_progressbar; + + CMuleNotebook* m_notebook; + + DECLARE_EVENT_TABLE() +}; + +#endif +// File_checked_for_headers diff --git a/src/SearchExpr.h b/src/SearchExpr.h new file mode 100644 index 00000000..0213c8cf --- /dev/null +++ b/src/SearchExpr.h @@ -0,0 +1,88 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef SEARCHEXPR_H +#define SEARCHEXPR_H + +#include + +enum ESearchOperators +{ + SEARCHOP_AND, + SEARCHOP_OR, + SEARCHOP_NOT +}; + +#define SEARCHOPTOK_AND wxT("\255AND") +#define SEARCHOPTOK_OR wxT("\255OR") +#define SEARCHOPTOK_NOT wxT("\255NOT") + +class CSearchExpr +{ +public: + CSearchExpr(){} + CSearchExpr(const wxString& pszString) + { + Add(pszString); + } + + void Add(ESearchOperators eOperator) + { + if (eOperator == SEARCHOP_AND) { + m_aExpr.Add(SEARCHOPTOK_AND); + } + if (eOperator == SEARCHOP_OR) { + m_aExpr.Add(SEARCHOPTOK_OR); + } + if (eOperator == SEARCHOP_NOT) { + m_aExpr.Add(SEARCHOPTOK_NOT); + } + } + + void Add(const wxString& pszString) + { + m_aExpr.Add(pszString); + } + + void Add(const CSearchExpr* pexpr) + { + //m_aExpr.Append(pexpr->m_aExpr); + for (unsigned int i=0; i < pexpr->m_aExpr.Count(); ++i) { + m_aExpr.Add(pexpr->m_aExpr[i]); + } + } + + void Concatenate(const wxString& pstrString) + { + wxASSERT( m_aExpr.Count() == 1 ); + m_aExpr[0] += ' '; + m_aExpr[0] += pstrString; + } + + wxArrayString m_aExpr; +}; + +#endif +// File_checked_for_headers diff --git a/src/SearchFile.cpp b/src/SearchFile.cpp new file mode 100644 index 00000000..187b489f --- /dev/null +++ b/src/SearchFile.cpp @@ -0,0 +1,187 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "SearchFile.h" // Interface declarations. + +#include + +#include "MemFile.h" // Needed for CMemFile +#include "Preferences.h" // Needed for thePrefs +#include "GuiEvents.h" + +CSearchFile::CSearchFile(const CMemFile& data, bool optUTF8, wxUIntPtr searchID, uint32 WXUNUSED(serverIP), uint16 WXUNUSED(serverPort), const wxString& directory, bool kademlia) + : m_parent(NULL), + m_showChildren(false), + m_searchID(searchID), + m_sourceCount(0), + m_completeSourceCount(0), + m_kademlia(kademlia), + m_directory(directory) +{ + m_abyFileHash = data.ReadHash(); + m_clientID = data.ReadUInt32(); + m_clientPort = data.ReadUInt16(); + + if ((!m_clientID) || (!m_clientPort)) { + m_clientID = m_clientPort = 0; + } else if (!IsGoodIP(m_clientID, thePrefs::FilterLanIPs())) { + m_clientID = m_clientPort = 0; + } + + + uint32 tagcount = data.ReadUInt32(); + for (unsigned int i = 0; i < tagcount; ++i) { + CTag tag(data, optUTF8); + switch (tag.GetNameID()) { + case FT_FILENAME: + SetFileName(CPath(tag.GetStr())); + break; + case FT_FILESIZE: + SetFileSize(tag.GetInt()); + break; + case FT_FILESIZE_HI: + SetFileSize( (((uint64)tag.GetInt()) << 32) + GetFileSize()); + break; + case FT_FILERATING: + m_iUserRating = (tag.GetInt() & 0xF) / 3; + break; + case FT_SOURCES: + m_sourceCount = tag.GetInt(); + break; + case FT_COMPLETE_SOURCES: + m_completeSourceCount = tag.GetInt(); + break; + default: + AddTagUnique(tag); + } + } + + if (!GetFileName().IsOk()) { + throw CInvalidPacket(wxT("No filename in search result")); + } +} + + +CSearchFile::CSearchFile(const CSearchFile& other) + : CAbstractFile(other), + m_parent(other.m_parent), + m_showChildren(other.m_showChildren), + m_searchID(other.m_searchID), + m_sourceCount(other.m_sourceCount), + m_completeSourceCount(other.m_completeSourceCount), + m_kademlia(other.m_kademlia), + m_clientID(other.m_clientID), + m_clientPort(other.m_clientPort), + m_directory(other.m_directory) +{ + for (size_t i = 0; i < other.m_children.size(); ++i) { + m_children.push_back(new CSearchFile(*other.m_children.at(i))); + } +} + + +CSearchFile::~CSearchFile() +{ + for (size_t i = 0; i < m_children.size(); ++i) { + delete m_children.at(i); + } +} + + +void CSearchFile::AddSources(uint32 count, uint32 count_complete) +{ + if (m_kademlia) { + m_sourceCount = std::max(m_sourceCount, count); + m_completeSourceCount = std::max(m_completeSourceCount, count_complete); + } else { + m_sourceCount += count; + m_completeSourceCount += count_complete; + } +} + + +void CSearchFile::AddChild(CSearchFile* file) +{ + wxCHECK_RET(file, wxT("Not a valid child!")); + wxCHECK_RET(!file->GetParent(), wxT("Search-result can only be child of one other result")); + wxCHECK_RET(!file->HasChildren(), wxT("Result already has children, cannot become child.")); + wxCHECK_RET(!GetParent(), wxT("A child cannot have children of its own")); + wxCHECK_RET(GetFileHash() == file->GetFileHash(), wxT("Mismatching child/parent hashes")); + wxCHECK_RET(GetFileSize() == file->GetFileSize(), wxT("Mismatching child/parent sizes")); + + file->m_parent = this; + + // TODO: Doesn't handle results with same name but diff. rating. + for (size_t i = 0; i < m_children.size(); ++i) { + CSearchFile* other = m_children.at(i); + + if (other->GetFileName() == file->GetFileName()) { + other->AddSources(file->GetSourceCount(), file->GetCompleteSourceCount()); + UpdateParent(); + Notify_Search_Update_Sources(other); + delete file; + return; + } + } + + // New unique child. + m_children.push_back(file); + UpdateParent(); + + if (ShowChildren()) { + Notify_Search_Add_Result(file); + } +} + + +void CSearchFile::UpdateParent() +{ + wxCHECK_RET(!m_parent, wxT("UpdateParent called on child item")); + + size_t ratingCount = 0, ratingTotal = 0; + size_t max = 0, index = 0; + for (size_t i = 0; i < m_children.size(); ++i) { + const CSearchFile* child = m_children.at(index); + + // Locate the most common name + if (child->GetSourceCount() > max) { + max = child->GetSourceCount(); + index = i; + } + + // Create sum of ratings so that the parent contains the avg. + if (child->HasRating()) { + ratingCount += 1; + ratingTotal += child->UserRating(); + } + } + + if (ratingCount) { + m_iUserRating = (ratingTotal / ratingCount); + } + + SetFileName(m_children.at(index)->GetFileName()); +} +// File_checked_for_headers diff --git a/src/SearchFile.h b/src/SearchFile.h new file mode 100644 index 00000000..1a11b52e --- /dev/null +++ b/src/SearchFile.h @@ -0,0 +1,264 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef SEARCHFILE_H +#define SEARCHFILE_H + +#include "KnownFile.h" // Needed for CAbstractFile + + +class CMemFile; +class CMD4Hash; +class CSearchFile; + + +typedef std::vector CSearchResultList; + + +/** + * Represents a search-result returned from a server or client. + * + * A file may have either a parent or any number of children. + * When a child is added to a result, the parent becomes a generic + * representation of all its children, which will include a copy + * of the original result. The parent object will contain the sum + * of sources (total/complete) and will have the most common + * filename. Children are owned by their parents, and can be + * displayed on CSearchListCtrl. + * + * Basic file parameters (hash, name, size, rating) can be read + * via the CAbstractFile functions. Tags pertaining to meta-data + * are stored in the taglist inherited from CAbstractFile. + * + * TODO: Server IP/Port are currently not used. + * TODO: Client ID/Port are currently not used. + * TODO: Directories are currently not used. + */ +class CSearchFile : public CAbstractFile +{ +public: + /** Constructor used to create results on the remote GUI. */ + CSearchFile(class CEC_SearchFile_Tag* tag); + /** Copy constructor, also copies children. */ + CSearchFile(const CSearchFile& other); + + /** + * Normal constructor, reads a result from a packet. + * + * @param data Source of results-packet. + * @param optUTF8 Specifies if text-strings are to be read as UTF8. + * @param searchID searchID The + * @param serverIP The IP of the server that sent this result. + * @param serverPort The port of the server that sent this result. + * @param directory If from a clients shared files, the directory this file is in. + * @param kademlia Specifies if this was from a kad-search. + */ + CSearchFile( + const CMemFile& data, + bool optUTF8, + wxUIntPtr searchID, + uint32 serverIP = 0, + uint16 serverPort = 0, + const wxString& directory = wxEmptyString, + bool kademlia = false); + + + /** Frees all children owned by this file. */ + virtual ~CSearchFile(); + + + /** + * Adds the given sources to the file. + * + * @param count Total source count. + * @param count_complete Number of sources that have the complete file. + * + * Note that for Kademlia results, only the largest value is used. + */ + void AddSources(uint32 count, uint32 count_complete); + + /** Returns the total number of sources. */ + uint32 GetSourceCount() const; + /** Returns the number of sources that have the entire file. */ + uint32 GetCompleteSourceCount() const; + /** Returns the ID of the search, used to select the right list when displaying. */ + wxUIntPtr GetSearchID() const; + /** Returns true if the result is from a Kademlia search. */ + bool IsKademlia() const; + + + /** Returns the parent of this file. */ + CSearchFile *GetParent() const; + /** Returns the list of children belonging to this file. */ + const CSearchResultList &GetChildren() const; + /** Returns true if this item has children. */ + bool HasChildren() const; + /** Returns true if children should be displayed. */ + bool ShowChildren() const; + /** Enable/Disable displaying of children (set in CSearchListCtrl). */ + void SetShowChildren(bool show); + + /** + * Adds the given file as a child of this file. + * + * Note that a file can either be a parent _or_ + * a child, but not both. Also note that it is + * only legal to add children whoose filesize and + * filehash matches the parent's. AddChild takes + * ownership of the file. + */ + void AddChild(CSearchFile* file); + + + //@{ + //! TODO: Currently not used. + uint32 GetClientID() const; + void SetClientID(uint32 clientID); + uint16 GetClientPort() const; + void SetClientPort(uint16 port); + //@} + +private: + //! CSearchFile is not assignable. + CSearchFile& operator=(const CSearchFile& other); + + /** + * Updates a parent file so that it shows various common traits. + * + * Currently, the most common filename is selected, and an average + * of fileratings is set, based on files that have a rating only. + */ + void UpdateParent(); + + //! The parent of this result. + CSearchFile* m_parent; + //! Any children this result may have. + CSearchResultList m_children; + //! If true, children will be shown on the GUI. + bool m_showChildren; + //! The unique ID of this search owning this result. + wxUIntPtr m_searchID; + //! The total number of sources for this file. + uint32 m_sourceCount; + //! The number of sources that have the complete file. + uint32 m_completeSourceCount; + //! Specifies if the result is from a kademlia search. + bool m_kademlia; + + //@{ + //! TODO: Currently not used. + uint32 m_clientID; + uint16 m_clientPort; + wxString m_directory; + //@} + + friend class CPartFile; + friend class CSearchListRem; +}; + + +//////////////////////////////////////////////////////////// +// Implementations + + +inline uint32 CSearchFile::GetSourceCount() const +{ + return m_sourceCount; +} + + +inline uint32 CSearchFile::GetCompleteSourceCount() const +{ + return m_completeSourceCount; +} + + +inline wxUIntPtr CSearchFile::GetSearchID() const +{ + return m_searchID; +} + + +inline bool CSearchFile::IsKademlia() const +{ + return m_kademlia; +} + + +inline CSearchFile* CSearchFile::GetParent() const +{ + return m_parent; +} + + +inline bool CSearchFile::ShowChildren() const +{ + return m_showChildren; +} + + +inline void CSearchFile::SetShowChildren(bool show) +{ + m_showChildren = show; +} + + +inline const CSearchResultList& CSearchFile::GetChildren() const +{ + return m_children; +} + + +inline bool CSearchFile::HasChildren() const +{ + return !m_children.empty(); +} + + +inline uint32 CSearchFile::GetClientID() const +{ + return m_clientID; +} + + +inline void CSearchFile::SetClientID(uint32 clientID) +{ + m_clientID = clientID; +} + + +inline uint16 CSearchFile::GetClientPort() const +{ + return m_clientPort; +} + + +inline void CSearchFile::SetClientPort(uint16 port) +{ + m_clientPort = port; +} + +#endif // SEARCHLIST_H +// File_checked_for_headers diff --git a/src/SearchList.cpp b/src/SearchList.cpp new file mode 100644 index 00000000..3d7a415b --- /dev/null +++ b/src/SearchList.cpp @@ -0,0 +1,1037 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "SearchList.h" // Interface declarations. + +#include +#include +#include + +#include "updownclient.h" // Needed for CUpDownClient +#include "MemFile.h" // Needed for CMemFile +#include "amule.h" // Needed for theApp +#include "ServerConnect.h" // Needed for theApp->serverconnect +#include "Server.h" // Needed for CServer +#include "ServerList.h" // Needed for theApp->serverlist +#include "Statistics.h" // Needed for theStats +#include "ObservableQueue.h"// Needed for CQueueObserver +#include +#include "Logger.h" // Needed for AddLogLineM/... +#include "Packet.h" // Needed for CPacket +#include "GuiEvents.h" // Needed for Notify_* + + +#ifndef AMULE_DAEMON +#include "amuleDlg.h" // Needed for CamuleDlg +#include "SearchDlg.h" // Needed for CSearchDlg +#endif + +#include "kademlia/kademlia/Kademlia.h" +#include "kademlia/kademlia/Search.h" + +#include "SearchExpr.h" +#include "Scanner.h.in" + + +extern int yyparse(); +extern int yyerror(const char* errstr); +extern int yyerror(wxString errstr); + +static wxString s_strCurKadKeyword; + +static CSearchExpr _SearchExpr; + +wxArrayString _astrParserErrors; + + +// Helper function for lexer. +void ParsedSearchExpression(const CSearchExpr* pexpr) +{ + int iOpAnd = 0; + int iOpOr = 0; + int iOpNot = 0; + + for (unsigned int i = 0; i < pexpr->m_aExpr.Count(); i++) { + wxString str(pexpr->m_aExpr[i]); + if (str == SEARCHOPTOK_AND) { + iOpAnd++; + } else if (str == SEARCHOPTOK_OR) { + iOpOr++; + } else if (str == SEARCHOPTOK_NOT) { + iOpNot++; + } + } + + // this limit (+ the additional operators which will be added later) has to match the limit in 'CreateSearchExpressionTree' + // +1 Type (Audio, Video) + // +1 MinSize + // +1 MaxSize + // +1 Avail + // +1 Extension + // +1 Complete sources + // +1 Codec + // +1 Bitrate + // +1 Length + // +1 Title + // +1 Album + // +1 Artist + // --------------- + // 12 + if (iOpAnd + iOpOr + iOpNot > 10) { + yyerror(wxT("Search expression is too complex")); + } + + _SearchExpr.m_aExpr.Empty(); + + // optimize search expression, if no OR nor NOT specified + if (iOpAnd > 0 && iOpOr == 0 && iOpNot == 0) { + wxString strAndTerms; + for (unsigned int i = 0; i < pexpr->m_aExpr.Count(); i++) { + if (pexpr->m_aExpr[i] != SEARCHOPTOK_AND) { + // Minor optimization: Because we added the Kad keyword to the boolean search expression, + // we remove it here (and only here) again because we know that the entire search expression + // does only contain (implicit) ANDed strings. + if (pexpr->m_aExpr[i] != s_strCurKadKeyword) { + if (!strAndTerms.IsEmpty()) { + strAndTerms += ' '; + } + strAndTerms += pexpr->m_aExpr[i]; + } + } + } + wxASSERT( _SearchExpr.m_aExpr.Count() == 0); + _SearchExpr.m_aExpr.Add(strAndTerms); + } else { + if (pexpr->m_aExpr.GetCount() != 1 || pexpr->m_aExpr[0] != s_strCurKadKeyword) + _SearchExpr.Add(pexpr); + } +} + + +//! Helper class for packet creation +class CSearchExprTarget +{ +public: + CSearchExprTarget(CMemFile* pData, EUtf8Str eStrEncode) + { + m_data = pData; + m_eStrEncode = eStrEncode; + } + + void WriteBooleanAND() + { + m_data->WriteUInt8(0); // boolean operator parameter type + m_data->WriteUInt8(0x00); // "AND" + } + + void WriteBooleanOR() + { + m_data->WriteUInt8(0); // boolean operator parameter type + m_data->WriteUInt8(0x01); // "OR" + } + + void WriteBooleanNOT() + { + m_data->WriteUInt8(0); // boolean operator parameter type + m_data->WriteUInt8(0x02); // "NOT" + } + + void WriteMetaDataSearchParam(const wxString& rstrValue) + { + m_data->WriteUInt8(1); // string parameter type + m_data->WriteString(rstrValue, m_eStrEncode); // string value + } + + void WriteMetaDataSearchParam(uint8 uMetaTagID, const wxString& rstrValue) + { + m_data->WriteUInt8(2); // string parameter type + m_data->WriteString(rstrValue, m_eStrEncode); // string value + m_data->WriteUInt16(sizeof(uint8)); // meta tag ID length + m_data->WriteUInt8(uMetaTagID); // meta tag ID name + } + + void WriteMetaDataSearchParamASCII(uint8 uMetaTagID, const wxString& rstrValue) + { + m_data->WriteUInt8(2); // string parameter type + m_data->WriteString(rstrValue, utf8strNone); // string value + m_data->WriteUInt16(sizeof(uint8)); // meta tag ID length + m_data->WriteUInt8(uMetaTagID); // meta tag ID name + } + + void WriteMetaDataSearchParam(const wxString& pszMetaTagID, const wxString& rstrValue) + { + m_data->WriteUInt8(2); // string parameter type + m_data->WriteString(rstrValue, m_eStrEncode); // string value + m_data->WriteString(pszMetaTagID); // meta tag ID + } + + void WriteMetaDataSearchParam(uint8 uMetaTagID, uint8 uOperator, uint32 uValue, bool WXUNUSED(bEd2k)) + { + m_data->WriteUInt8(3); // numeric parameter type + m_data->WriteUInt32(uValue); // numeric value + m_data->WriteUInt8(uOperator); // comparison operator + m_data->WriteUInt16(sizeof(uint8)); // meta tag ID length + m_data->WriteUInt8(uMetaTagID); // meta tag ID name + } + + void WriteMetaDataSearchParam(const wxString& pszMetaTagID, uint8 uOperator, uint32 uValue, bool WXUNUSED(bEd2k)) + { + m_data->WriteUInt8(3); // numeric parameter type + m_data->WriteUInt32(uValue); // numeric value + m_data->WriteUInt8(uOperator); // comparison operator + m_data->WriteString(pszMetaTagID); // meta tag ID + } + + void WriteOldMinMetaDataSearchParam(uint8 uMetaTagID, uint32 uValue, bool bEd2k) + { + uint8 uOperator; + if (bEd2k){ + uOperator = ED2K_SEARCH_OP_GREATER; + uValue -= 1; + } else { + uOperator = KAD_SEARCH_OP_GREATER_EQUAL; + } + WriteMetaDataSearchParam(uMetaTagID, uOperator, uValue, bEd2k); + } + + void WriteOldMinMetaDataSearchParam(const wxString& pszMetaTagID, uint32 uValue, bool bEd2k) + { + uint8 uOperator; + if (bEd2k){ + uOperator = ED2K_SEARCH_OP_GREATER; + uValue -= 1; + } else { + uOperator = KAD_SEARCH_OP_GREATER_EQUAL; + } + WriteMetaDataSearchParam(pszMetaTagID, uOperator, uValue, bEd2k); + } + + void WriteOldMaxMetaDataSearchParam(const wxString& pszMetaTagID, uint32 uValue, bool bEd2k) + { + uint8 uOperator; + if (bEd2k){ + uOperator = ED2K_SEARCH_OP_LESS; + uValue += 1; + } else { + uOperator = KAD_SEARCH_OP_LESS_EQUAL; + } + WriteMetaDataSearchParam(pszMetaTagID, uOperator, uValue, bEd2k); + } + + void WriteOldMaxMetaDataSearchParam(uint8 uMetaTagID, uint32 uValue, bool bEd2k) + { + uint8 uOperator; + if (bEd2k){ + uOperator = ED2K_SEARCH_OP_LESS; + uValue += 1; + } else { + uOperator = KAD_SEARCH_OP_LESS_EQUAL; + } + WriteMetaDataSearchParam(uMetaTagID, uOperator, uValue, bEd2k); + } + +protected: + CMemFile* m_data; + EUtf8Str m_eStrEncode; +}; + + + + +/////////////////////////////////////////////////////////// +// CSearchList + +BEGIN_EVENT_TABLE(CSearchList, wxEvtHandler) + EVT_MULE_TIMER(wxID_ANY, CSearchList::OnGlobalSearchTimer) +END_EVENT_TABLE() + + +CSearchList::CSearchList() + : m_searchTimer(this, 0 /* Timer-id doesn't matter. */ ), + m_searchType(LocalSearch), + m_searchInProgress(false), + m_currentSearch(-1), + m_searchPacket(NULL) +{ +} + + +CSearchList::~CSearchList() +{ + StopGlobalSearch(); + + while (!m_results.empty()) { + RemoveResults(m_results.begin()->first); + } +} + + +void CSearchList::RemoveResults(long searchID) +{ + // A non-existant search id will just be ignored + Kademlia::CSearchManager::StopSearch(searchID, true); + + ResultMap::iterator it = m_results.find(searchID); + if ( it != m_results.end() ) { + CSearchResultList& list = it->second; + + for (size_t i = 0; i < list.size(); ++i) { + delete list.at(i); + } + + m_results.erase( it ); + } +} + + +wxString CSearchList::StartNewSearch(uint32* searchID, SearchType type, const CSearchParams& params) +{ + // Check that we can actually perform the specified desired search. + if ((type == KadSearch) && !Kademlia::CKademlia::IsRunning()) { + return _("Kad search can't be done if Kad is not running"); + } else if ((type != KadSearch) && !theApp->IsConnectedED2K()) { + return _("ED2K search can't be done if ED2K is not connected"); + } + + if (params.typeText != ED2KFTSTR_PROGRAM) { + if (params.typeText.CmpNoCase(wxT("Any"))) { + m_resultType = params.typeText; + } else { + m_resultType.Clear(); + } + } else { + // No check is to be made on returned results if the + // type is 'Programs', since this returns multiple types. + m_resultType.Clear(); + } + + // This MemFile is automatically free'd, except for kad searches. + CMemFilePtr data = CreateSearchData(params, type); + + if (data.get() == NULL) { + wxASSERT(_astrParserErrors.Count()); + wxString error; + + for (unsigned int i = 0; i < _astrParserErrors.Count(); ++i) { + error += _astrParserErrors[i] + wxT("\n"); + } + + return error; + } + + m_searchType = type; + if (type == KadSearch) { + try { + if (*searchID == 0xffffffff) { + Kademlia::CSearchManager::StopSearch(0xffffffff, false); + } + + // Kad search takes ownership of data and searchstring will get tokenized there + // The tab must be created with the Kad search ID, so seardhID is updated. + Kademlia::CSearch* search = Kademlia::CSearchManager::PrepareFindKeywords( + params.searchString, data.release(), *searchID); + + *searchID = search->GetSearchID(); + } catch (const wxString& what) { + AddLogLineM(true, what); + return _("Unexpected error while attempting Kad search: ") + what; + } + } else { + // This is an ed2k search, local or global + m_currentSearch = *(searchID); + m_searchInProgress = true; + + CPacket* searchPacket = new CPacket(*data.get(), OP_EDONKEYPROT, OP_SEARCHREQUEST); + + theStats::AddUpOverheadServer(searchPacket->GetPacketSize()); + theApp->serverconnect->SendPacket(searchPacket, (type == LocalSearch)); + + if (type == GlobalSearch) { + m_searchPacket = searchPacket; + + // The OPCode must be changed since global searches are UDP requests + m_searchPacket->SetOpCode(OP_GLOBSEARCHREQ); + } + } + + return wxEmptyString; +} + + +void CSearchList::LocalSearchEnd() +{ + if (m_searchType == GlobalSearch) { + wxCHECK_RET(m_searchPacket, wxT("Global search, but no packet")); + + // Ensure that every global search starts over. + theApp->serverlist->RemoveObserver(&m_serverQueue); + m_searchTimer.Start(750); + } else { + m_searchInProgress = false; + Notify_SearchLocalEnd(); + } +} + + +uint32 CSearchList::GetSearchProgress() const +{ + if (m_searchInProgress == false) { + // No search, no progress ;) + return 0; + } + + switch (m_searchType) { + case LocalSearch: + return 0xffff; + + case GlobalSearch: + return 100 - (m_serverQueue.GetRemaining() * 100) + / theApp->serverlist->GetServerCount(); + + case KadSearch: + // We cannot meassure the progress of Kad searches. + return 0; + + default: + wxCHECK(false, 0); + } +} + + +void CSearchList::OnGlobalSearchTimer(CTimerEvent& WXUNUSED(evt)) +{ + // Ensure that the server-queue contains the current servers. + if (m_searchPacket == NULL) { + // This was a pending event, handled after 'Stop' was pressed. + return; + } else if (!m_serverQueue.IsActive()) { + theApp->serverlist->AddObserver(&m_serverQueue); + } + + // UDP requests must not be sent to this server. + const CServer* localServer = theApp->serverconnect->GetCurrentServer(); + if (localServer) { + uint32 localIP = localServer->GetIP(); + uint16 localPort = localServer->GetPort(); + while (m_serverQueue.GetRemaining()) { + CServer* server = m_serverQueue.GetNext(); + + // Compare against the currently connected server. + if ((server->GetPort() == localPort) && (server->GetIP() == localIP)) { + // We've already requested from the local server. + continue; + } else { + theStats::AddUpOverheadServer(m_searchPacket->GetPacketSize()); + theApp->serverconnect->SendUDPPacket(m_searchPacket, server, false); + CoreNotify_Search_Update_Progress(GetSearchProgress()); + return; + } + } + } + // No more servers left to ask. + StopGlobalSearch(); +} + + +void CSearchList::ProcessSharedFileList(const byte* in_packet, uint32 size, + CUpDownClient* sender, bool *moreResultsAvailable, const wxString& directory) +{ + wxCHECK_RET(sender, wxT("No sender in search-results from client.")); + + long searchID = reinterpret_cast(sender); + +#ifndef AMULE_DAEMON + if (!theApp->amuledlg->m_searchwnd->CheckTabNameExists(sender->GetUserName())) { + theApp->amuledlg->m_searchwnd->CreateNewTab(sender->GetUserName() + wxT(" (0)"), searchID); + } +#endif + + const CMemFile packet(in_packet, size); + uint32 results = packet.ReadUInt32(); + bool unicoded = sender->GetUnicodeSupport(); + for (unsigned int i = 0; i != results; ++i){ + CSearchFile* toadd = new CSearchFile(packet, unicoded, searchID, 0, 0, directory); + if (sender){ + toadd->SetClientID(sender->GetUserIDHybrid()); + toadd->SetClientPort(sender->GetUserPort()); + } + + AddToList(toadd, true); + } + + if (moreResultsAvailable) + *moreResultsAvailable = false; + + int iAddData = (int)(packet.GetLength() - packet.GetPosition()); + if (iAddData == 1) { + uint8 ucMore = packet.ReadUInt8(); + if (ucMore == 0x00 || ucMore == 0x01){ + if (moreResultsAvailable) { + *moreResultsAvailable = (bool)ucMore; + } + } + } +} + + +void CSearchList::ProcessSearchAnswer(const byte* in_packet, uint32 size, bool optUTF8, uint32 WXUNUSED(serverIP), uint16 WXUNUSED(serverPort)) +{ + CMemFile packet(in_packet,size); + + uint32 results = packet.ReadUInt32(); + for (unsigned int i = 0; i != results; ++i) { + AddToList(new CSearchFile(packet, optUTF8, m_currentSearch)); + } +} + + +void CSearchList::ProcessUDPSearchAnswer(const CMemFile& packet, bool optUTF8, uint32 serverIP, uint16 serverPort) +{ + AddToList(new CSearchFile(packet, optUTF8, m_currentSearch, serverIP, serverPort)); +} + + +bool CSearchList::AddToList(CSearchFile* toadd, bool clientResponse) +{ + const uint64 fileSize = toadd->GetFileSize(); + // If filesize is 0, or file is too large for the network, drop it + if ((fileSize == 0) || (fileSize > MAX_FILE_SIZE)) { + AddDebugLogLineM(false, logSearch, + CFormat(wxT("Dropped result with filesize %u: %s")) + % fileSize + % toadd->GetFileName()); + + delete toadd; + return false; + } + + // If the result was not the type the user wanted, drop it. + if ((clientResponse == false) && !m_resultType.IsEmpty()) { + if (GetFileTypeByName(toadd->GetFileName()) != m_resultType) { + AddDebugLogLineM( false, logSearch, + CFormat( wxT("Dropped result type %s != %s, file %s") ) + % GetFileTypeByName(toadd->GetFileName()) + % m_resultType + % toadd->GetFileName()); + + delete toadd; + return false; + } + } + + + // Get, or implictly create, the map of results for this search + CSearchResultList& results = m_results[toadd->GetSearchID()]; + + for (size_t i = 0; i < results.size(); ++i) { + CSearchFile* item = results.at(i); + + if ((toadd->GetFileHash() == item->GetFileHash()) + && (toadd->GetFileSize() == item->GetFileSize())) { + + AddDebugLogLineM(false, logSearch, + CFormat(wxT("Received duplicate results for '%s' : %s")) + % item->GetFileName() % item->GetFileHash().Encode()); + + // If no children exists, then we add the current item. The + // "parent" item will show the most common filename and the + // sum of sources for all variants. + if (item->GetChildren().empty()) { + if (toadd->GetFileName() == item->GetFileName()) { + AddDebugLogLineM( false, logSearch, + CFormat(wxT("Merged results for '%s'")) + % item->GetFileName()); + + // Merge duplicate items rather than creating a child item + item->AddSources(toadd->GetSourceCount(), toadd->GetCompleteSourceCount()); + Notify_Search_Update_Sources(item); + delete toadd; + return true; + } else { + AddDebugLogLineM(false, logSearch, + CFormat(wxT("Created initial child for result '%s'")) + % item->GetFileName()); + + // The first child will always be the first result we received. + item->AddChild(new CSearchFile(*item)); + } + } + + AddDebugLogLineM( false, logSearch, + CFormat(wxT("Adding child '%s' to result '%s'")) + % toadd->GetFileName() % item->GetFileName()); + + // Parent item includes sum of all sources for this file + item->AddSources(toadd->GetSourceCount(), toadd->GetCompleteSourceCount()); + // Add the child, possibly updating the parents filename. + item->AddChild(toadd); + + Notify_Search_Update_Sources(item); + + return true; + } + } + + AddDebugLogLineM(false, logSearch, + CFormat(wxT("Added new result '%s' : %s")) + % toadd->GetFileName() % toadd->GetFileHash().Encode()); + + // New unique result, simply add and display. + results.push_back(toadd); + Notify_Search_Add_Result(toadd); + + return true; +} + + +const CSearchResultList& CSearchList::GetSearchResults(long searchID) const +{ + ResultMap::const_iterator it = m_results.find(searchID); + if (it != m_results.end()) { + return it->second; + } + + // TODO: Should we assert in this case? + static CSearchResultList list; + return list; +} + + +void CSearchList::AddFileToDownloadByHash(const CMD4Hash& hash, uint8 cat) +{ + ResultMap::iterator it = m_results.begin(); + for ( ; it != m_results.end(); ++it ) { + CSearchResultList& list = it->second; + + for ( unsigned int i = 0; i < list.size(); ++i ) { + if ( list[i]->GetFileHash() == hash ) { + CoreNotify_Search_Add_Download( list[i], cat ); + + return; + } + } + } +} + + +void CSearchList::StopGlobalSearch() +{ + m_searchTimer.Stop(); + + m_currentSearch = -1; + delete m_searchPacket; + m_searchPacket = NULL; + m_searchInProgress = false; + + CoreNotify_Search_Update_Progress(0xffff); +} + + +CSearchList::CMemFilePtr CSearchList::CreateSearchData(const CSearchParams& params, SearchType type) +{ + const bool kad = (type == KadSearch); + + // Count the number of used parameters + unsigned int parametercount = 0; + if ( !params.typeText.IsEmpty() ) ++parametercount; + if ( params.minSize > 0 ) ++parametercount; + if ( params.maxSize > 0 ) ++parametercount; + if ( params.availability > 0 ) ++parametercount; + if ( !params.extension.IsEmpty() ) ++parametercount; + + wxString typeText = params.typeText; + if (typeText == ED2KFTSTR_ARCHIVE){ + // eDonkeyHybrid 0.48 uses type "Pro" for archives files + // www.filedonkey.com uses type "Pro" for archives files + typeText = ED2KFTSTR_PROGRAM; + } else if (typeText == ED2KFTSTR_CDIMAGE){ + // eDonkeyHybrid 0.48 uses *no* type for iso/nrg/cue/img files + // www.filedonkey.com uses type "Pro" for CD-image files + typeText = ED2KFTSTR_PROGRAM; + } + + // Must write parametercount - 1 parameter headers + CMemFilePtr data(new CMemFile(100)); + + if (type == KadSearch) { + // We need to make some room for the keyword hash + data->WriteUInt128(CUInt128()); + // and the search type (0/1 if there is ed2k data or not) + // There will obviously be... at least the search string. + data->WriteUInt8(0); + } + + _astrParserErrors.Empty(); + _SearchExpr.m_aExpr.Empty(); + + LexInit(params.searchString); + int iParseResult = yyparse(); + LexFree(); + +#ifdef __DEBUG__ + printf("Search parsing result for \"%s\": %i\n", + (const char*)unicode2UTF8(params.searchString),iParseResult); +#endif + if (_astrParserErrors.Count() > 0) { + for (unsigned int i=0; i < _astrParserErrors.Count(); ++i) { + printf("Error %u: %s\n",i,(const char*)unicode2UTF8(_astrParserErrors[i])); + } + + return CMemFilePtr(NULL); + } + + if (iParseResult != 0) { + _astrParserErrors.Add(wxString::Format(wxT("Undefined error %i on search expression"),iParseResult)); + + return CMemFilePtr(NULL); + } + + #ifdef __DEBUG__ + printf("Search expression: "); + for (unsigned int i = 0; i < _SearchExpr.m_aExpr.Count(); i++){ + printf("%s ",(const char*)unicode2char(_SearchExpr.m_aExpr[i])); + } + printf("\nExpression count: %i\n",(int)_SearchExpr.m_aExpr.GetCount()); + #endif + + parametercount += _SearchExpr.m_aExpr.GetCount(); + + #ifdef __DEBUG__ + printf("Parameters: %i\n",parametercount); + #endif + + /* Leave the unicode comment there, please... */ + CSearchExprTarget target(data.get(), true /*I assume everyone is unicoded */ ? utf8strRaw : utf8strNone); + + unsigned int iParameterCount = 0; + if (_SearchExpr.m_aExpr.GetCount() <= 1) { + // lugdunummaster requested that searchs without OR or NOT operators, + // and hence with no more expressions than the string itself, be sent + // using a series of ANDed terms, intersecting the ANDs on the terms + // (but prepending them) instead of putting the boolean tree at the start + // like other searches. This type of search is supposed to take less load + // on servers. Go figure. + // + // input: "a" AND min=1 AND max=2 + // instead of: AND AND "a" min=1 max=2 + // we use: AND "a" AND min=1 max=2 + + if (_SearchExpr.m_aExpr.GetCount() > 0) { + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + target.WriteMetaDataSearchParam(_SearchExpr.m_aExpr[0]); + } + + if (!typeText.IsEmpty()) { + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + // Type is always ascii string + target.WriteMetaDataSearchParamASCII(FT_FILETYPE, typeText); + } + + if (params.minSize > 0) { + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + target.WriteOldMinMetaDataSearchParam(FT_FILESIZE, params.minSize, !kad); + } + + if (params.maxSize > 0){ + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + target.WriteOldMaxMetaDataSearchParam(FT_FILESIZE, params.maxSize, !kad); + } + + if (params.availability > 0){ + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + target.WriteOldMinMetaDataSearchParam(FT_SOURCES, params.availability, !kad); + } + + if (!params.extension.IsEmpty()){ + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + target.WriteMetaDataSearchParam(FT_FILEFORMAT, params.extension); + } + + //#warning TODO - I keep this here, ready if we ever allow such searches... + #if 0 + if (complete > 0){ + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + target.WriteOldMinMetaDataSearchParam(FT_COMPLETE_SOURCES, complete, !kad); + } + + if (minBitrate > 0){ + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + target.WriteOldMinMetaDataSearchParam(kad ? TAG_MEDIA_BITRATE : FT_ED2K_MEDIA_BITRATE, minBitrate, !kad); + } + + if (minLength > 0){ + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + target.WriteOldMinMetaDataSearchParam(kad ? TAG_MEDIA_LENGTH : FT_ED2K_MEDIA_LENGTH, minLength, !kad); + } + + if (!codec.IsEmpty()){ + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + target.WriteMetaDataSearchParam(kad ? TAG_MEDIA_CODEC : FT_ED2K_MEDIA_CODEC, codec); + } + + if (!title.IsEmpty()){ + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + target.WriteMetaDataSearchParam(kad ? TAG_MEDIA_TITLE : FT_ED2K_MEDIA_TITLE, title); + } + + if (!album.IsEmpty()){ + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + target.WriteMetaDataSearchParam(kad ? TAG_MEDIA_ALBUM : FT_ED2K_MEDIA_ALBUM, album); + } + + if (!artist.IsEmpty()){ + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + target.WriteMetaDataSearchParam(kad ? TAG_MEDIA_ARTIST : FT_ED2K_MEDIA_ARTIST, artist); + } + #endif // 0 + + // If this assert fails... we're seriously fucked up + + wxASSERT( iParameterCount == parametercount ); + + } else { + if (!params.extension.IsEmpty()) { + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + } + + if (params.availability > 0) { + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + } + + if (params.maxSize > 0){ + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + } + + if (params.minSize > 0) { + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + } + + if (!typeText.IsEmpty()){ + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + } + + //#warning TODO - same as above... + #if 0 + if (complete > 0){ + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + } + + if (minBitrate > 0){ + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + } + + if (minLength > 0) { + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + } + + if (!codec.IsEmpty()){ + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + } + + if (!title.IsEmpty()){ + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + } + + if (!album.IsEmpty()) { + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + } + + if (!artist.IsEmpty()) { + if (++iParameterCount < parametercount) { + target.WriteBooleanAND(); + } + } + #endif // 0 + + // As above, if this fails, we're seriously fucked up. + wxASSERT( iParameterCount + _SearchExpr.m_aExpr.GetCount() == parametercount ); + + for (unsigned int j = 0; j < _SearchExpr.m_aExpr.GetCount(); ++j) { + if (_SearchExpr.m_aExpr[j] == SEARCHOPTOK_AND) { + target.WriteBooleanAND(); + } else if (_SearchExpr.m_aExpr[j] == SEARCHOPTOK_OR) { + target.WriteBooleanOR(); + } else if (_SearchExpr.m_aExpr[j] == SEARCHOPTOK_NOT) { + target.WriteBooleanNOT(); + } else { + target.WriteMetaDataSearchParam(_SearchExpr.m_aExpr[j]); + } + } + + if (!params.typeText.IsEmpty()) { + // Type is always ASCII string + target.WriteMetaDataSearchParamASCII(FT_FILETYPE, params.typeText); + } + + if (params.minSize > 0) { + target.WriteOldMinMetaDataSearchParam(FT_FILESIZE, params.minSize, !kad); + } + + if (params.maxSize > 0) { + target.WriteOldMaxMetaDataSearchParam(FT_FILESIZE, params.maxSize, !kad); + } + + if (params.availability > 0) { + target.WriteOldMinMetaDataSearchParam(FT_SOURCES, params.availability, !kad); + } + + if (!params.extension.IsEmpty()) { + target.WriteMetaDataSearchParam(FT_FILEFORMAT, params.extension); + } + + //#warning TODO - third and last warning of the same series. + #if 0 + if (complete > 0) { + target.WriteOldMinMetaDataSearchParam(FT_COMPLETE_SOURCES, pParams->uComplete, !kad); + } + + if (minBitrate > 0) { + target.WriteOldMinMetaDataSearchParam(kad ? TAG_MEDIA_BITRATE : FT_ED2K_MEDIA_BITRATE, minBitrate, !kad); + } + + if (minLength > 0) { + target.WriteOldMinMetaDataSearchParam(kad ? TAG_MEDIA_LENGTH : FT_ED2K_MEDIA_LENGTH, minLength, bEd2k); + } + + if (!codec.IsEmpty()) { + target.WriteMetaDataSearchParam(kad ? TAG_MEDIA_CODEC : FT_ED2K_MEDIA_CODEC, codec); + } + + if (!title.IsEmpty()) { + target.WriteMetaDataSearchParam(kad ? TAG_MEDIA_TITLE : FT_ED2K_MEDIA_TITLE, title); + } + + if (!album.IsEmpty()) { + target.WriteMetaDataSearchParam(kad ? TAG_MEDIA_ALBUM : FT_ED2K_MEDIA_ALBUM, album); + } + + if (!artist.IsEmpty()) { + target.WriteMetaDataSearchParam(kad ? TAG_MEDIA_ARTIST : FT_ED2K_MEDIA_ARTIST, artist); + } + + #endif // 0 + } + + // Packet ready to go. + return data; +} + + +void CSearchList::KademliaSearchKeyword(uint32 searchID, const Kademlia::CUInt128* fileID, + const wxString& name, uint64 size, const wxString& type, const TagPtrList& taglist) +{ + EUtf8Str eStrEncode = utf8strRaw; + + CMemFile temp(250); + byte fileid[16]; + fileID->ToByteArray(fileid); + temp.WriteHash(CMD4Hash(fileid)); + + temp.WriteUInt32(0); // client IP + temp.WriteUInt16(0); // client port + + // write tag list + unsigned int uFilePosTagCount = temp.GetPosition(); + uint32 tagcount = 0; + temp.WriteUInt32(tagcount); // dummy tag count, will be filled later + + // standard tags + CTagString tagName(FT_FILENAME, name); + tagName.WriteTagToFile(&temp, eStrEncode); + tagcount++; + + CTagInt64 tagSize(FT_FILESIZE, size); + tagSize.WriteTagToFile(&temp, eStrEncode); + tagcount++; + + if (!type.IsEmpty()) { + CTagString tagType(FT_FILETYPE, type); + tagType.WriteTagToFile(&temp, eStrEncode); + tagcount++; + } + + // Misc tags (bitrate, etc) + for (TagPtrList::const_iterator it = taglist.begin(); it != taglist.end(); ++it) { + (*it)->WriteTagToFile(&temp,eStrEncode); + tagcount++; + } + + temp.Seek(uFilePosTagCount, wxFromStart); + temp.WriteUInt32(tagcount); + + temp.Seek(0, wxFromStart); + + AddToList(new CSearchFile(temp, (eStrEncode == utf8strRaw), searchID, 0, 0, wxEmptyString, true)); +} + +// File_checked_for_headers diff --git a/src/SearchList.h b/src/SearchList.h new file mode 100644 index 00000000..967052de --- /dev/null +++ b/src/SearchList.h @@ -0,0 +1,224 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef SEARCHLIST_H +#define SEARCHLIST_H + +#include "Timer.h" // Needed for CTimer +#include "ObservableQueue.h" // Needed for CQueueObserver +#include "SearchFile.h" // Needed for CSearchFile +#include // Do_not_auto_remove (lionel's Mac, 10.3) + + +class CMemFile; +class CMD4Hash; +class CPacket; +class CServer; +class CSearchFile; + +namespace Kademlia { + class CUInt128; +} + + +enum SearchType { + LocalSearch, + GlobalSearch, + KadSearch +}; + + +typedef std::vector CSearchResultList; + + +class CSearchList : public wxEvtHandler +{ +public: + //! Structure used to pass search-parameters. + struct CSearchParams + { + /** Prevents accidential use of uninitialized variables. */ + CSearchParams() { minSize = maxSize = availability = 0; } + + //! The actual string to search for. + wxString searchString; + //! The type of files to search for (may be empty), one of ED2KFTSTR_* + wxString typeText; + //! The filename extension. May be empty. + wxString extension; + //! The smallest filesize in bytes to accept, zero for any. + uint32 minSize; + //! The largest filesize in bytes to accept, zero for any. + uint32 maxSize; + //! The minumum available (source-count), zero for any. + uint32 availability; + }; + + /** Constructor. */ + CSearchList(); + + /** Frees any remaining search-results. */ + ~CSearchList(); + + /** + * Starts a new search. + * + * @param searchID The ID of the search, which may be modified. + * @param type The type of search, see SearchType. + * @param params The search parameters, see CSearchParams. + * @return An empty string on success, otherwise an error-message. + */ + wxString StartNewSearch(uint32* searchID, SearchType type, const CSearchParams& params); + + /** Stops the current search, if any is in progress. */ + void StopGlobalSearch(); + + /** Returns the completion percentage of the current search. */ + uint32 GetSearchProgress() const; + + /** This function is called once the local (ed2k) search has ended. */ + void LocalSearchEnd(); + + + /** + * Returns the list of results for the specified search. + * + * If the search is not valid, an empty list is returned. + */ + const CSearchResultList& GetSearchResults(long searchID) const; + + /** Removes all results for the specified search. */ + void RemoveResults(long searchID); + + + /** Finds the search-result (by hash) and downloads it in the given category. */ + void AddFileToDownloadByHash(const CMD4Hash& hash, uint8 category = 0); + + + /** + * Processes a list of shared files from a client. + * + * @param packet The raw packet received from the client. + * @param size the length of the packet. + * @param sender The sender of the packet. + * @param moreResultsAvailable Set to a value specifying if more results are available. + * @param directory The directory containing the shared files. + */ + void ProcessSharedFileList(const byte* packet, uint32 size, CUpDownClient* sender, bool* moreResultsAvailable, const wxString& directory); + + /** + * Processes a search-result sent via TCP from the local server. All results are added. + * + * @param packet The packet containing one or more search-results. + * @param size the length of the packet. + * @param optUTF8 Specifies if the server supports UTF8. + * @param serverIP The IP of the server sending the results. + * @param serverPort The Port of the server sending the results. + */ + void ProcessSearchAnswer(const byte* packet, uint32 size, bool optUTF8, uint32 serverIP, uint16 serverPort); + + /** + * Processes a search-result sent via UDP. Only one result is read from the packet. + * + * @param packet The packet containing one or more search-results. + * @param optUTF8 Specifies if the server supports UTF8. + * @param serverIP The IP of the server sending the results. + * @param serverPort The Port of the server sending the results. + */ + void ProcessUDPSearchAnswer(const CMemFile& packet, bool optUTF8, uint32 serverIP, uint16 serverPort); + + + /** + * Adds a result in the form of a kad search-keyword to the specified result-list. + * + * @param searchID The search to which this result belongs. + * @param pfileID The hash of the result-file. + * @param name The filename of the result. + * @param size The filesize of the result. + * @param type The filetype of the result (TODO: Not used?) + * @param taglist List of additional tags assosiated with the search-result. + */ + void KademliaSearchKeyword(uint32 searchID, const Kademlia::CUInt128* pfileID, const wxString& name, uint64 size, const wxString& type, const TagPtrList& taglist); + + +private: + /** Event-handler for global searches. */ + void OnGlobalSearchTimer(CTimerEvent& evt); + + /** + * Adds the specified file to the current search's results. + * + * @param toadd The result to add. + * @param clientResponse Is the result sent by a client (shared-files list). + * @return True if the results were added, false otherwise. + * + * Note that this function takes ownership of the CSearchFile object, + * regardless of whenever or not it was actually added to the results list. + */ + bool AddToList(CSearchFile* toadd, bool clientResponse = false); + + //! This auto-pointer is used to safely prevent leaks. + typedef std::auto_ptr CMemFilePtr; + + /** Create a basic search-packet for the given search-type. */ + CMemFilePtr CreateSearchData(const CSearchParams& params, SearchType type); + + + //! Timer used for global search intervals. + CTimer m_searchTimer; + + //! The current search-type, regarding the last/current search. + SearchType m_searchType; + + //! Specifies if a search is being performed. + bool m_searchInProgress; + + //! The ID of the current search. + long m_currentSearch; + + //! The current packet used for searches. + CPacket* m_searchPacket; + + //! Queue of servers to ask when doing global searches. + //! TODO: Replace with 'cookie' system. + CQueueObserver m_serverQueue; + + //! Shorthand for the map of results (key is a SearchID). + typedef std::map ResultMap; + + //! Map of all search-results added. + ResultMap m_results; + + //! Contains the results type desired in the current search. + //! If not empty, results of different types are filtered. + wxString m_resultType; + + + DECLARE_EVENT_TABLE() +}; + + +#endif // SEARCHLIST_H +// File_checked_for_headers diff --git a/src/SearchListCtrl.cpp b/src/SearchListCtrl.cpp new file mode 100644 index 00000000..1a095c55 --- /dev/null +++ b/src/SearchListCtrl.cpp @@ -0,0 +1,926 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "SearchListCtrl.h" // Interface declarations + +#include + +#include "amule.h" // Needed for theApp +#include "DownloadQueue.h" // Needed for CDownloadQueue +#include "KnownFileList.h" // Needed for CKnownFileList +#include "PartFile.h" // Needed for CPartFile and CKnownFile +#include "SearchList.h" // Needed for CSearchFile +#include "SearchDlg.h" // Needed for CSearchDlg +#include "amuleDlg.h" // Needed for CamuleDlg +#include "muuli_wdr.h" // Needed for clientImages +#include "Preferences.h" // Needed for thePrefs +#include "GuiEvents.h" // Needed for CoreNotify_Search_Add_Download + + +BEGIN_EVENT_TABLE(CSearchListCtrl, CMuleListCtrl) + EVT_LIST_ITEM_RIGHT_CLICK(-1, CSearchListCtrl::OnRightClick) + EVT_LIST_COL_CLICK( -1, CSearchListCtrl::OnColumnLClick) + EVT_LIST_COL_END_DRAG( -1, CSearchListCtrl::OnColumnResize) + + EVT_MENU( MP_GETED2KLINK, CSearchListCtrl::OnPopupGetUrl) + EVT_MENU( MP_RAZORSTATS, CSearchListCtrl::OnRazorStatsCheck) + EVT_MENU( MP_SEARCHRELATED, CSearchListCtrl::OnRelatedSearch) + EVT_MENU( MP_MARK_AS_KNOWN, CSearchListCtrl::OnMarkAsKnown) + EVT_MENU( MP_RESUME, CSearchListCtrl::OnPopupDownload) + EVT_MENU_RANGE( MP_ASSIGNCAT, MP_ASSIGNCAT + 99, CSearchListCtrl::OnPopupDownload ) + + EVT_LIST_ITEM_ACTIVATED( -1, CSearchListCtrl::OnItemActivated) +END_EVENT_TABLE() + + +std::list CSearchListCtrl::s_lists; + + +enum SearchListColumns { + ID_SEARCH_COL_NAME = 0, + ID_SEARCH_COL_SIZE, + ID_SEARCH_COL_SOURCES, + ID_SEARCH_COL_TYPE, + ID_SEARCH_COL_FILEID +}; + + +CSearchListCtrl::CSearchListCtrl( + wxWindow *parent, + wxWindowID winid, + const wxPoint &pos, + const wxSize &size, + long style, + const wxValidator &validator, + const wxString &name) +: +CMuleListCtrl(parent, winid, pos, size, style | wxLC_OWNERDRAW, validator, name), +m_filterKnown(false), +m_invert(false), +m_filterEnabled(false) +{ + // Setting the sorter function. + SetSortFunc( SortProc ); + + InsertColumn( ID_SEARCH_COL_NAME, _("File Name"), wxLIST_FORMAT_LEFT, 500); + InsertColumn( ID_SEARCH_COL_SIZE, _("Size"), wxLIST_FORMAT_LEFT, 100); + InsertColumn( ID_SEARCH_COL_SOURCES, _("Sources"), wxLIST_FORMAT_LEFT, 50); + InsertColumn( ID_SEARCH_COL_TYPE, _("Type"), wxLIST_FORMAT_LEFT, 65); + InsertColumn( ID_SEARCH_COL_FILEID, _("FileID"), wxLIST_FORMAT_LEFT, 280); + + m_nResultsID = 0; + + // Only load settings for first list, otherwise sync with current lists + if ( s_lists.empty() ) { + // Set the name to enable loading of settings + SetTableName( wxT("Search") ); + + LoadSettings(); + + // Unset the name to avoid the settings getting saved every time a list is closed + SetTableName( wxEmptyString ); + } else { + // Sync this list with one of the others + SyncLists( s_lists.front(), this ); + } + + // Add the list so that it will be synced with the other lists + s_lists.push_back( this ); +} + + +CSearchListCtrl::~CSearchListCtrl() +{ + std::list::iterator it = std::find( s_lists.begin(), s_lists.end(), this ); + + if ( it != s_lists.end() ) + s_lists.erase( it ); + + // We only save the settings if the last list was closed + if ( s_lists.empty() ) { + // In order to get the settings saved, we need to set the name + SetTableName( wxT("Search") ); + } +} + + +void CSearchListCtrl::AddResult(CSearchFile* toshow) +{ + wxCHECK_RET(toshow->GetSearchID() == m_nResultsID, wxT("Wrong search-id for result-list")); + + const wxUIntPtr toshowdata = reinterpret_cast(toshow); + + // Check if the result should be shown + if (FindItem(-1, toshowdata) != -1) { + return; + } else if (toshow->GetParent() && !toshow->GetParent()->ShowChildren()) { + return; + } else if (!IsFiltered(toshow)) { + if (toshow->HasChildren() && toshow->ShowChildren()) { + // Only filter the parent if none of the children are shown. + bool foundChild = false; + const CSearchResultList& children = toshow->GetChildren(); + for (size_t i = 0; i < children.size(); ++i) { + if (IsFiltered(children.at(i))) { + foundChild = true; + break; + } + } + + if (!foundChild) { + // No children left, and the parent is filtered. + m_filteredOut.push_back(toshow); + return; + } + } else { + m_filteredOut.push_back(toshow); + return; + } + } + + // Insert the item before the item found by the search + uint32 newid = InsertItem(GetInsertPos(toshowdata), toshow->GetFileName().GetPrintable()); + + // Sanity checks to ensure that results/children are properly positioned. +#ifdef __WXDEBUG__ + { + CSearchFile* parent = toshow->GetParent(); + + if (newid > 0) { + CSearchFile* before = (CSearchFile*)GetItemData(newid - 1); + wxASSERT(before); + if (parent) { + wxASSERT((before->GetParent() == parent) || (before == parent)); + } else { + wxASSERT(before->GetParent() != toshow); + } + } + + if ((int)newid < GetItemCount() - 1) { + CSearchFile* after = (CSearchFile*)GetItemData(newid + 1); + wxASSERT(after); + if (parent) { + wxASSERT((after->GetParent() == parent) || (!after->GetParent())); + } else { + wxASSERT((after->GetParent() == toshow) || (!after->GetParent())); + } + } + } +#endif + + SetItemPtrData(newid, toshowdata); + + // Filesize + SetItem(newid, ID_SEARCH_COL_SIZE, CastItoXBytes( toshow->GetFileSize() ) ); + + // Source count + wxString temp = wxString::Format( wxT("%d (%d)"), toshow->GetSourceCount(), toshow->GetCompleteSourceCount() ); + SetItem( newid, ID_SEARCH_COL_SOURCES, temp ); + + // File-type + SetItem( newid, ID_SEARCH_COL_TYPE, GetFiletypeByName( toshow->GetFileName() ) ); + + // File-hash + SetItem(newid, ID_SEARCH_COL_FILEID, toshow->GetFileHash().Encode() ); + + // Set the color of the item + UpdateItemColor( newid ); +} + + +void CSearchListCtrl::RemoveResult(CSearchFile* toremove) +{ + ShowChildren(toremove, false); + + long index = FindItem(-1, reinterpret_cast(toremove)); + if (index != -1) { + DeleteItem(index); + } else { + ResultList::iterator it = std::find(m_filteredOut.begin(), m_filteredOut.end(), toremove); + if ( it != m_filteredOut.end()) { + m_filteredOut.erase(it); + } + } +} + + +void CSearchListCtrl::UpdateResult(CSearchFile* toupdate) +{ + long index = FindItem(-1, reinterpret_cast(toupdate)); + if (index != -1) { + // Update the filename, which may be changed in case of multiple variants. + SetItem(index, ID_SEARCH_COL_NAME, toupdate->GetFileName().GetPrintable()); + + wxString temp = wxString::Format( wxT("%d (%d)"), toupdate->GetSourceCount(), toupdate->GetCompleteSourceCount()); + SetItem(index, ID_SEARCH_COL_SOURCES, temp); + + UpdateItemColor(index); + + // Deletions of items causes rather large ammount of flicker, so to + // avoid this, we resort the list to ensure correct ordering. + if (!IsItemSorted(index)) { + SortList(); + } + } +} + + +void CSearchListCtrl::UpdateItemColor( long index ) +{ + wxListItem item; + item.SetId( index ); + item.SetColumn( ID_SEARCH_COL_SIZE ); + item.SetMask( wxLIST_MASK_STATE|wxLIST_MASK_TEXT|wxLIST_MASK_IMAGE|wxLIST_MASK_DATA|wxLIST_MASK_WIDTH|wxLIST_MASK_FORMAT ); + + if ( GetItem(item) ) { + wxColour newcol = SYSCOLOR(wxSYS_COLOUR_WINDOWTEXT); + + CSearchFile* file = (CSearchFile*)GetItemData(index); + CKnownFile* sameFile = theApp->downloadqueue->GetFileByID(file->GetFileHash()); + if ( !sameFile ) { + sameFile = theApp->knownfiles->FindKnownFileByID(file->GetFileHash()); + } + + int red = newcol.Red(); + int green = newcol.Green(); + int blue = newcol.Blue(); + + if ( sameFile ) { + if ( sameFile->IsPartFile() ) { + // File is already being downloaded. Mark as red. + red = 255; + } else if ( sameFile->GetStatus() == PS_COMPLETE ) { + // File has already been downloaded. Mark as green. + green = 200; + } else { + // File has been cancelled or removed. Mark as grey. + red = 128; + green = 128; + blue = 128; + } + } else { + // File is new, colour after number of files + blue += file->GetSourceCount() * 5; + if ( blue > 255 ) { + blue = 255; + } + } + + // don't forget to set the item data back... + wxListItem newitem; + newitem.SetId( index ); + newitem.SetTextColour( wxColour( red, green, blue ) ); + SetItem( newitem ); + } +} + + +// Update the colors of all assosiated items, which means parents and/or siblings. +void CSearchListCtrl::UpdateAllRelativesColor( + CSearchFile *file, + long index) +{ + if ((file->ShowChildren() && file->HasChildren()) || + file->GetParent()) { + CSearchFile *parent = file->GetParent() ? + file->GetParent() : file; + const CSearchResultList &list = parent->GetChildren(); + for (size_t j = 0; j < list.size(); ++j) { + UpdateItemColor(FindItem(-1, reinterpret_cast(list.at(j)))); + } + UpdateItemColor(FindItem(-1, reinterpret_cast(parent))); + } else { + UpdateItemColor(index); + } +} + + +void CSearchListCtrl::ShowResults( long ResultsID ) +{ + DeleteAllItems(); + m_nResultsID = ResultsID; + if (ResultsID) { + const CSearchResultList& list = theApp->searchlist->GetSearchResults(ResultsID); + for (unsigned int i = 0; i < list.size(); ++i) { + AddResult( list[i] ); + } + } +} + + +wxUIntPtr CSearchListCtrl::GetSearchId() +{ + return m_nResultsID; +} + + +void CSearchListCtrl::SetFilter(const wxString& regExp, bool invert, bool filterKnown) +{ + if (regExp.IsEmpty()) { + // Show everything + m_filterText = wxT(".*"); + } else { + m_filterText = regExp; + } + + m_filter.Compile(m_filterText, wxRE_DEFAULT | wxRE_ICASE); + m_filterKnown = filterKnown; + m_invert = invert; + + if (m_filterEnabled) { + // Swap the list of filtered results so we can freely add new items to the list + ResultList curFiltered; + std::swap(curFiltered, m_filteredOut); + + // Filter items already on the list + for (int i = 0; i < GetItemCount();) { + CSearchFile* file = (CSearchFile*)GetItemData(i); + + if (IsFiltered(file)) { + ++i; + } else { + m_filteredOut.push_back(file); + DeleteItem(i); + } + } + + // Check the previously filtered items. + ResultList::iterator it = curFiltered.begin(); + for (; it != curFiltered.end(); ++it) { + if (IsFiltered(*it)) { + AddResult(*it); + } else { + m_filteredOut.push_back(*it); + } + } + } +} + + +void CSearchListCtrl::EnableFiltering(bool enabled) +{ + if (enabled != m_filterEnabled) { + m_filterEnabled = enabled; + + if (enabled) { + SetFilter(m_filterText, m_invert, m_filterKnown); + } else { + ResultList::iterator it = m_filteredOut.begin(); + for (; it != m_filteredOut.end(); ++it) { + AddResult(*it); + } + + m_filteredOut.clear(); + } + } +} + + +size_t CSearchListCtrl::GetHiddenItemCount() const +{ + return m_filteredOut.size(); +} + + +bool CSearchListCtrl::IsFiltered(const CSearchFile* file) +{ + // By default, everything is displayed + bool result = true; + + if (m_filterEnabled && m_filter.IsValid()) { + result = m_filter.Matches(file->GetFileName().GetPrintable()); + result = ((result && !m_invert) || (!result && m_invert)); + + if (result && m_filterKnown) { + result = !theApp->downloadqueue->GetFileByID(file->GetFileHash()); + + if (result) { + result = !theApp->knownfiles->FindKnownFileByID(file->GetFileHash()); + } + } + } + + return result; +} + + +int CSearchListCtrl::SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData) +{ + CSearchFile* file1 = (CSearchFile*)item1; + CSearchFile* file2 = (CSearchFile*)item2; + + // Modifies the result, 1 for ascending, -1 for decending + int modifier = (sortData & CMuleListCtrl::SORT_DES) ? -1 : 1; + bool alternate = (sortData & CMuleListCtrl::SORT_ALT); + + // Decide if which should files we should sort by. + wxUIntPtr parent1 = reinterpret_cast(file1->GetParent()); + wxUIntPtr parent2 = reinterpret_cast(file2->GetParent()); + wxUIntPtr filePtr1 = reinterpret_cast(file1); + wxUIntPtr filePtr2 = reinterpret_cast(file2); + if (parent1 && parent2) { + if (parent1 != parent2) { + return SortProc(parent1, parent2, sortData); + } + } else if (parent1) { + if (parent1 == filePtr2) { + return 1; + } else { + return SortProc(parent1, filePtr2, sortData); + } + } else if (parent2) { + if (parent2 == filePtr1) { + return -1; + } else { + return SortProc(filePtr1, parent2, sortData); + } + } + + int result = 0; + switch (sortData & CMuleListCtrl::COLUMN_MASK) { + // Sort by filename + case ID_SEARCH_COL_NAME: + result = CmpAny(file1->GetFileName(), file2->GetFileName()); + break; + + // Sort file-size + case ID_SEARCH_COL_SIZE: + result = CmpAny( file1->GetFileSize(), file2->GetFileSize() ); + break; + + // Sort by sources + case ID_SEARCH_COL_SOURCES: { + int cmp = CmpAny( file1->GetSourceCount(), file2->GetSourceCount() ); + int cmp2 = CmpAny( file1->GetCompleteSourceCount(), file2->GetCompleteSourceCount() ); + + if ( alternate ) { + // Swap criterias + int temp = cmp2; + cmp2 = cmp; + cmp = temp; + } + + if ( cmp == 0 ) { + cmp = cmp2; + } + + result = cmp; + break; + } + + // Sort by file-types + case ID_SEARCH_COL_TYPE: { + result = GetFiletypeByName(file1->GetFileName()).Cmp(GetFiletypeByName(file2->GetFileName())); + if (result == 0) { + // Same file-type, sort by extension + result = CmpAny(file1->GetFileName().GetExt(), file2->GetFileName().GetExt()); + } + + break; + } + + // Sort by file-hash + case ID_SEARCH_COL_FILEID: + result = CmpAny(file2->GetFileHash(), file1->GetFileHash()); + } + + return modifier * result; +} + + +void CSearchListCtrl::SyncLists( CSearchListCtrl* src, CSearchListCtrl* dst ) +{ + wxCHECK_RET(src && dst, wxT("NULL argument in SyncLists")); + + // Column widths + for ( int i = 0; i < src->GetColumnCount(); i++ ) { + // We do this check since just setting the width causes a redraw + if ( dst->GetColumnWidth( i ) != src->GetColumnWidth( i ) ) { + dst->SetColumnWidth( i, src->GetColumnWidth( i ) ); + } + } + + // Sync sorting + unsigned column = src->GetSortColumn(); + unsigned order = src->GetSortOrder(); + if (column != dst->GetSortColumn() || order != dst->GetSortOrder()) { + dst->SetSorting(column, order); + } +} + + +void CSearchListCtrl::SyncOtherLists( CSearchListCtrl* src ) +{ + std::list::iterator it; + + for ( it = s_lists.begin(); it != s_lists.end(); ++it ) { + if ( (*it) != src ) { + SyncLists( src, *it ); + } + } +} + + +void CSearchListCtrl::OnRightClick(wxListEvent& event) +{ + CheckSelection(event); + + if (GetSelectedItemCount()) { + // Create the popup-menu + wxMenu menu(_("File")); + menu.Append(MP_RESUME, _("Download")); + + wxMenu* cats = new wxMenu(_("Category")); + cats->Append(MP_ASSIGNCAT, _("Main")); + for (unsigned i = 1; i < theApp->glob_prefs->GetCatCount(); i++) { + cats->Append(MP_ASSIGNCAT + i, + theApp->glob_prefs->GetCategory(i)->title); + } + + menu.Append(MP_MENU_CATS, _("Download in category"), cats); + menu.AppendSeparator(); +/* Commented out while it's gone + menu.Append(MP_RAZORSTATS, _("Get Razorback 2's stats for this file")); + menu.AppendSeparator(); +*/ + menu.Append(MP_SEARCHRELATED, _("Search related files (ED2k, local server)")); + menu.AppendSeparator(); + +//#warning Uncomment this here to test the MP_MARK_AS_KNOWN feature. Beware! You are on your own here, this might break "known.met" +#if 0 + menu.Append(MP_MARK_AS_KNOWN, _("Mark as known file")); + menu.AppendSeparator(); +#endif + + menu.Append(MP_GETED2KLINK, _("Copy ED2k link to clipboard")); + + // These should only be enabled for single-selections + bool enable = GetSelectedItemCount(); + menu.Enable(MP_GETED2KLINK, enable); + menu.Enable(MP_MENU_CATS, (theApp->glob_prefs->GetCatCount() > 1)); + + PopupMenu(&menu, event.GetPoint()); + } else { + event.Skip(); + } +} + + +void CSearchListCtrl::OnColumnLClick( wxListEvent& event ) +{ + // Let the real event handler do its work first + CMuleListCtrl::OnColumnLClick( event ); + + SyncOtherLists( this ); +} + + +void CSearchListCtrl::OnColumnResize( wxListEvent& WXUNUSED(event) ) +{ + SyncOtherLists( this ); +} + + +void CSearchListCtrl::OnPopupGetUrl( wxCommandEvent& WXUNUSED(event) ) +{ + wxString URIs; + + long index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + + while( index != -1 ) { + CSearchFile* file = (CSearchFile*)GetItemData( index ); + + URIs += theApp->CreateED2kLink( file ) + wxT("\n"); + + index = GetNextItem( index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + } + + if ( !URIs.IsEmpty() ) { + theApp->CopyTextToClipboard( URIs.RemoveLast() ); + } +} + + +void CSearchListCtrl::OnRazorStatsCheck( wxCommandEvent& WXUNUSED(event) ) +{ + int item = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + if ( item == -1 ) { + return; + } + + CSearchFile* file = (CSearchFile*)GetItemData( item ); + theApp->amuledlg->LaunchUrl(wxT("http://stats.razorback2.com/ed2khistory?ed2k=") + file->GetFileHash().Encode()); +} + + +void CSearchListCtrl::OnRelatedSearch( wxCommandEvent& WXUNUSED(event) ) +{ + int item = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + if ( item == -1 ) { + return; + } + + CSearchFile* file = (CSearchFile*)GetItemData( item ); + theApp->searchlist->StopGlobalSearch(); + theApp->amuledlg->m_searchwnd->ResetControls(); + CastByID( IDC_SEARCHNAME, theApp->amuledlg->m_searchwnd, wxTextCtrl )-> + SetValue(wxT("related::") + file->GetFileHash().Encode()); + theApp->amuledlg->m_searchwnd->StartNewSearch(); +} + + +void CSearchListCtrl::OnMarkAsKnown( wxCommandEvent& WXUNUSED(event) ) +{ + int index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + if (index == -1) { + return; + } + +#ifndef CLIENT_GUI + CSearchFile *searchFile = (CSearchFile *)GetItemData(index); + CKnownFile *knownFile(new CKnownFile(*searchFile)); + theApp->knownfiles->SafeAddKFile(knownFile); + UpdateAllRelativesColor(searchFile, index); +#endif +} + + +void CSearchListCtrl::OnPopupDownload(wxCommandEvent& event) +{ + if (event.GetId() == MP_RESUME) { + // Via the "Download" menu-item, use category specified in drop-down menu + DownloadSelected(); + } else { + // Via an "Download in category" item + DownloadSelected(event.GetId() - MP_ASSIGNCAT); + } +} + + +void CSearchListCtrl::OnItemActivated(wxListEvent& event) +{ + CSearchFile* file = ((CSearchFile*)GetItemData(event.GetIndex())); + if (file->HasChildren()) { + ShowChildren(file, !file->ShowChildren()); + } else { + DownloadSelected(); + } +} + + +bool CSearchListCtrl::AltSortAllowed(unsigned column) const +{ + switch ( column ) { + case ID_SEARCH_COL_SOURCES: + return true; + + default: + return false; + } +} + + +void CSearchListCtrl::DownloadSelected(int category) +{ + FindWindowById(IDC_SDOWNLOAD)->Enable(FALSE); + + // Either the "Download" menu-item, the download-button, double-click or enter + if (category == -1) { + // Defaults to main category + category = 0; + + if (CastByID(IDC_EXTENDEDSEARCHCHECK, NULL, wxCheckBox)->GetValue()) { + category = CastByID(ID_AUTOCATASSIGN, NULL, wxChoice)->GetSelection(); + } + } + + long index = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + while (index > -1) { + CSearchFile* file = (CSearchFile*)GetItemData(index); + CoreNotify_Search_Add_Download(file, category); + UpdateAllRelativesColor(file, index); + index = GetNextItem(index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + } +} + + +const wxBrush& GetBrush(wxSystemColour index) +{ + return *wxTheBrushList->FindOrCreateBrush(SYSCOLOR(index)); +} + + +void CSearchListCtrl::OnDrawItem( + int item, wxDC* dc, const wxRect& rect, const wxRect& rectHL, bool highlighted) +{ + CSearchFile* file = (CSearchFile*)GetItemData(item); + + // Define text-color and background + if (highlighted) { + if (GetFocus()) { + dc->SetBackground(GetBrush(wxSYS_COLOUR_HIGHLIGHT)); + dc->SetTextForeground(SYSCOLOR(wxSYS_COLOUR_HIGHLIGHTTEXT)); + } else { + dc->SetBackground(GetBrush(wxSYS_COLOUR_BTNSHADOW)); + dc->SetTextForeground(SYSCOLOR(wxSYS_COLOUR_HIGHLIGHTTEXT)); + } + } else { + dc->SetBackground(GetBrush(wxSYS_COLOUR_LISTBOX)); + dc->SetTextForeground(SYSCOLOR(wxSYS_COLOUR_WINDOWTEXT)); + } + + // Define the border of the drawn area + if ( highlighted ) { + dc->SetPen(wxPen(BLEND(dc->GetBackground().GetColour(), 65))); + } else { + dc->SetPen(*wxTRANSPARENT_PEN); + dc->SetTextForeground(GetItemTextColour(item)); + } + + // Clear the background, not done automatically since the drawing is buffered. + dc->SetBrush( dc->GetBackground() ); + dc->DrawRectangle( rectHL.x, rectHL.y, rectHL.width, rectHL.height ); + + // Various constant values we use + const int iTextOffset = ( rect.GetHeight() - dc->GetCharHeight() ) / 2; + const int iOffset = 4; + const int treeOffset = 11; + const int treeCenter = 6; + bool tree_show = false; + + wxRect cur_rec(iOffset, rect.y, 0, rect.height ); + for (int i = 0; i < GetColumnCount(); i++) { + wxListItem listitem; + GetColumn(i, listitem); + + if ( listitem.GetWidth() > 0 ) { + cur_rec.width = listitem.GetWidth() - 2*iOffset; + + // Make a copy of the current rectangle so we can apply specific tweaks + wxRect target_rec = cur_rec; + + // will ensure that text is about in the middle ;) + target_rec.y += iTextOffset; + + if (i == 0) { + if (file->HasChildren() || file->GetParent()) { + tree_show = (listitem.GetWidth() > 0); + target_rec.x += treeOffset; + target_rec.width -= treeOffset; + + // Children are indented a bit + if (file->GetParent()) { + target_rec.x += 4; + target_rec.width -= 4; + } + } + + // Check if the rating icon should be drawn + if (file->HasRating()) { + int image = Client_InvalidRating_Smiley + file->UserRating() - 1; + + int imgWidth = 16; + + theApp->amuledlg->m_imagelist.Draw(image, *dc, target_rec.GetX(), + target_rec.GetY() - 1, wxIMAGELIST_DRAW_TRANSPARENT); + + // Move the text past the icon. + target_rec.x += imgWidth + 4; + target_rec.width -= imgWidth + 4; + } + } + + wxListItem cellitem; + cellitem.SetColumn(i); + cellitem.SetId(item); + + // Force clipper (clip 2 px more than the rectangle from the right side) + wxDCClipper clipper(*dc, target_rec.x, target_rec.y, target_rec.width - 2, target_rec.height); + + if (GetItem(cellitem)) { + dc->DrawText(cellitem.GetText(), target_rec.GetX(), target_rec.GetY()); + } else { + dc->DrawText(wxT("GetItem failed!"), target_rec.GetX(), target_rec.GetY()); + } + + // Increment to the next column + cur_rec.x += listitem.GetWidth(); + } + } + + // Draw tree last so it draws over selected and focus (looks better) + if ( tree_show ) { + // Gather some information + const bool notLast = (item + 1 < GetItemCount()); + const bool notFirst = (item != 0); + const bool hasNext = notLast && ((CSearchFile*)GetItemData(item + 1))->GetParent(); + const int middle = cur_rec.y + ( cur_rec.height + 1 ) / 2; + + // Set up a new pen for drawing the tree + dc->SetPen( *(wxThePenList->FindOrCreatePen(dc->GetTextForeground(), 1, wxSOLID)) ); + + if (file->GetParent()) { + // Draw the line to the filename + dc->DrawLine(treeCenter, middle, treeOffset + 4, middle); + + // Draw the line to the child node + if (hasNext) { + dc->DrawLine(treeCenter, middle, treeCenter, cur_rec.y + cur_rec.height + 1); + } + + // Draw the line back up to parent node + if (notFirst) { + dc->DrawLine(treeCenter, middle, treeCenter, cur_rec.y - 1); + } + } else if (file->HasChildren()) { + if (file->ShowChildren()) { + // Draw empty circle + dc->SetBrush(*wxTRANSPARENT_BRUSH); + } else { + dc->SetBrush(GetItemTextColour(item)); + } + + dc->DrawCircle( treeCenter, middle, 3 ); + + // Draw the line to the child node if there are any children + if (hasNext && file->ShowChildren()) { + dc->DrawLine(treeCenter, middle + 3, treeCenter, cur_rec.y + cur_rec.height + 1); + } + } + } + + // Sanity checks to ensure that results/children are properly positioned. +#ifdef __WXDEBUG__ + { + CSearchFile* parent = file->GetParent(); + + if (item > 0) { + CSearchFile* before = (CSearchFile*)GetItemData(item - 1); + wxASSERT(before); + if (parent) { + wxASSERT((before->GetParent() == parent) || (before == parent)); + } else { + wxASSERT(before->GetParent() != file); + } + } + + if (item < GetItemCount() - 1) { + CSearchFile* after = (CSearchFile*)GetItemData(item + 1); + wxASSERT(after); + if (parent) { + wxASSERT((after->GetParent() == parent) || (!after->GetParent())); + } else { + wxASSERT((after->GetParent() == file) || (!after->GetParent())); + } + } + } +#endif +} + + +void CSearchListCtrl::ShowChildren(CSearchFile* file, bool show) +{ + Freeze(); + + file->SetShowChildren(show); + + const CSearchResultList& results = file->GetChildren(); + for (size_t i = 0; i < results.size(); ++i) { + if (show) { + AddResult(results[i]); + } else { + RemoveResult(results[i]); + } + } + + Thaw(); +} + + +wxString CSearchListCtrl::GetTTSText(unsigned item) const +{ + return GetItemText(item); +} +// File_checked_for_headers diff --git a/src/SearchListCtrl.h b/src/SearchListCtrl.h new file mode 100644 index 00000000..082fb7fa --- /dev/null +++ b/src/SearchListCtrl.h @@ -0,0 +1,291 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef SEARCHLISTCTRL_H +#define SEARCHLISTCTRL_H + + +#include "wx/colour.h" // Needed for wxColour +#include // Needed for wxRegExp + +#include "MuleListCtrl.h" // Needed for CMuleListCtrl + + +class CSearchList; +class CSearchFile; + + +/** + * This class is used to display search results. + * + * Results on added to the list will be colored according to + * the number of sources and other parameters (see UpdateColor). + * + * To display results, first use the ShowResults function, which will display + * all current results with the specified id and afterwards you can use the + * AddResult function to add new results or the UpdateResult function to update + * already present results. Please note that it is not possible to add results + * with the AddResult function before calling ShowResults. + */ +class CSearchListCtrl : public CMuleListCtrl +{ +public: + /** + * Constructor. + * + * @see CMuleListCtrl::CMuleListCtrl for documentation of parameters. + */ + CSearchListCtrl( + wxWindow *parent, + wxWindowID winid = -1, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxLC_ICON, + const wxValidator& validator = wxDefaultValidator, + const wxString &name = wxT("mulelistctrl") ); + + /** + * Destructor. + */ + virtual ~CSearchListCtrl(); + + /** + * Adds ths specified file to the list. + * + * @param The new result to be shown. + * + * Please note that no duplicates checking is done, so the pointer should + * point to a new file in order to avoid problems. Also note that the result + * will be inserted sorted according to current sort-type, so there is no + * need to resort the list after adding new items. + */ + void AddResult(CSearchFile* toshow); + + /** + * Removes the specified file from the list. + */ + void RemoveResult(CSearchFile* toshow); + + /** + * Updates the specified source. + * + * @param The search result to be updated. + */ + void UpdateResult(CSearchFile* toupdate); + + /** + * Clears the list and inserts all results with the specified Id instead. + * + * @param nResult The ID of the results or Zero to simply reset the list. + */ + void ShowResults( long ResultsId ); + + /** + * Updates the colors of item at the specified index. + * + * @param index The zero-based index of the item. + * + * This function returns the color of the item based on the following: + * - Downloading files are marked in red. + * - Known (shared/completed) files are marked in green. + * - New files are marked in blue depending on the number of sources. + */ + void UpdateItemColor(long index); + + /** + * Updates the colors of all assosiated items, which means parents and/or siblings. + */ + void UpdateAllRelativesColor(CSearchFile *file, long index); + + /** + * Returns the current Search Id. + * + * @return The Search Id of the displayed results (set through ShowResults()). + */ + wxUIntPtr GetSearchId(); + + /** + * Sets the filter which decides which results should be shown. + * + * @param regExp A regular expression targeting the filenames. + * @param invert If true, invert the results of the filter-test. + * @param filterKnown Should files that are queued or known be filtered out. + * + * An invalid regExp will result in all results being displayed. + */ + void SetFilter(const wxString& regExp, bool invert, bool filterKnown); + + /** + * Toggels the use of filtering on and off. + */ + void EnableFiltering(bool enabled); + + /** + * Returns the number of items hidden due to filtering. + */ + size_t GetHiddenItemCount() const; + + /** + * Attempts to download all selected items, updating color-scheme as needed. + * + * @param category The target category, or -1 to use the drop-down selection. + */ + void DownloadSelected(int category = -1); + +protected: + typedef std::list ResultList; + + //! List used to store results that are hidden due to matching the filter. + ResultList m_filteredOut; + + //! The current filter reg-exp. + wxRegEx m_filter; + + //! The text from which the filter is compiled. + wxString m_filterText; + + //! Controls if shared/queued results should be shown. + bool m_filterKnown; + + //! Controls if the result of filter-hits should be inverted + bool m_invert; + + //! Specifies if filtering should be used + bool m_filterEnabled; + + /** + * Returns true if the filename is filtered. + */ + bool IsFiltered(const CSearchFile* file); + + /** + * Sorter function used by wxListCtrl::SortItems function. + * + * @see CMuleListCtrl::SetSortFunc + * @see wxListCtrl::SortItems + */ + static int wxCALLBACK SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData); + + /** @see CMuleListCtrl::AltSortAllowed */ + virtual bool AltSortAllowed(unsigned column) const; + + /** @see CMuleListCtrl::GetTTSText */ + virtual wxString GetTTSText(unsigned item) const; + + /** + * Helper function which syncs two lists. + * + * @param src The source list. + * @param dst The list to be synced with the source list. + * + * This function syncronises the following settings of two lists: + * - Sort column + * - Sort direction + * - Column widths + * + * If either sort column or direction is changed, then the dst list will + * be resorted. This function is used to ensure that all results list act + * as one, while still allowing individual selection. + */ + static void SyncLists( CSearchListCtrl* src, CSearchListCtrl* dst ); + + /** + * Helper function which syncs all other lists against the specified one. + * + * @param src The list which all other lists should be synced against. + * + * This function just calls SyncLists() on all lists in s_lists, using + * the src argument as the src argument of the SyncLists function. + */ + static void SyncOtherLists( CSearchListCtrl* src ); + + //! This list contains pointers to all current instances of CSearchListCtrl. + static std::list s_lists; + + //! The ID of the search-results which the list is displaying or zero if unset. + wxUIntPtr m_nResultsID; + + //! Custom drawing, needed to display children of search-results. + void OnDrawItem(int item, wxDC* dc, const wxRect& rect, const wxRect& rectHL, bool highlighted); + + /** + * Removes or adds child-entries for the given file. + */ + void ShowChildren(CSearchFile* file, bool show); + + /** + * Event handler for right mouse clicks. + */ + void OnRightClick( wxListEvent& event ); + + /** + * Event handler for double-clicks or enter. + */ + void OnItemActivated( wxListEvent& event ); + + /** + * Event handler for left-clicks on the column headers. + * + * This eventhandler takes care of sync'ing all the other lists with this one. + */ + void OnColumnLClick( wxListEvent& event ); + + /** + * Event handler for resizing of the columns. + * + * This eventhandler takes care of sync'ing all the other lists with this one. + */ + void OnColumnResize( wxListEvent& event ); + + /** + * Event handler for get-url menu items. + */ + void OnPopupGetUrl( wxCommandEvent& event ); + + /** + * Event handler for Razorback 2 stats menu items. + */ + void OnRazorStatsCheck( wxCommandEvent& event ); + + /** + * Event handler for related search. + */ + void OnRelatedSearch( wxCommandEvent& event ); + + /** + * Event handler for "mark as known". + */ + void OnMarkAsKnown( wxCommandEvent& event ); + + /** + * Event handler for download-file(s) menu item. + */ + void OnPopupDownload( wxCommandEvent& event ); + + DECLARE_EVENT_TABLE() +}; + +#endif // SEARCHLISTCTRL_H +// File_checked_for_headers diff --git a/src/Server.cpp b/src/Server.cpp new file mode 100644 index 00000000..c69218e1 --- /dev/null +++ b/src/Server.cpp @@ -0,0 +1,342 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "Server.h" // Interface declarations. + +#include + +#include "NetworkFunctions.h" // Needed for StringIPtoUint32 +#include "OtherStructs.h" // Needed for ServerMet_Struct +#include "amule.h" + +CServer::CServer(ServerMet_Struct* in_data) +{ + port = in_data->port; + ip = in_data->ip; + + Init(); +} + +CServer::CServer(uint16 in_port, const wxString i_addr) +{ + + port = in_port; + ip = StringIPtoUint32(i_addr); + + Init(); + + // GonoszTopi - Init() would clear dynip ! + // Check that the ip isn't in fact 0.0.0.0 + if (!ip && !StringIPtoUint32( i_addr, ip ) ) { + // If ip == 0, the address is a hostname + dynip = i_addr; + } +} + +#ifdef CLIENT_GUI +CServer::CServer(CEC_Server_Tag *tag) +{ + ip = tag->GetIPv4Data().IP(); + + port = tag->GetIPv4Data().m_port; + + Init(); + + listname = tag->ServerName(); + description = tag->ServerDesc(); + maxusers = tag->GetMaxUsers(); + + files = tag->GetFiles(); + users = tag->GetUsers(); + + preferences = tag->GetPrio(); // SRV_PR_NORMAL = 0, so it's ok + staticservermember = tag->GetStatic(); + + ping = tag->GetPing(); + failedcount = tag->GetFailed(); +} +#endif + +// copy constructor +CServer::CServer(CServer* pOld) +{ + wxASSERT(pOld != NULL); + + TagPtrList::iterator it = pOld->m_taglist.begin(); + for ( ; it != pOld->m_taglist.end(); ++it ) { + m_taglist.push_back((*it)->CloneTag()); + } + port = pOld->port; + ip = pOld->ip; + realport = pOld->realport; + staticservermember=pOld->IsStaticMember(); + tagcount = pOld->tagcount; + ipfull = pOld->ipfull; + files = pOld->files; + users = pOld->users; + preferences = pOld->preferences; + ping = pOld->ping; + failedcount = pOld->failedcount; + lastpinged = pOld->lastpinged; + lastpingedtime = pOld->lastpingedtime; + m_dwRealLastPingedTime = pOld->m_dwRealLastPingedTime; + description = pOld->description; + listname = pOld->listname; + dynip = pOld->dynip; + maxusers = pOld->maxusers; + m_strVersion = pOld->m_strVersion; + m_uTCPFlags = pOld->m_uTCPFlags; + m_uUDPFlags = pOld->m_uUDPFlags; + challenge = pOld->challenge; + softfiles = pOld->softfiles; + hardfiles = pOld->hardfiles; + m_uDescReqChallenge = pOld->m_uDescReqChallenge; + m_uLowIDUsers = pOld->m_uLowIDUsers; + lastdescpingedcout = pOld->lastdescpingedcout; + m_auxPorts = pOld->m_auxPorts; + m_dwServerKeyUDP = pOld->m_dwServerKeyUDP; + m_bCryptPingReplyPending = pOld->m_bCryptPingReplyPending; + m_dwIPServerKeyUDP = pOld->m_dwIPServerKeyUDP; + m_nObfuscationPortTCP = pOld->m_nObfuscationPortTCP; + m_nObfuscationPortUDP = pOld->m_nObfuscationPortUDP; +} + +CServer::~CServer() +{ + TagPtrList::iterator it = m_taglist.begin(); + for ( ; it != m_taglist.end(); ++it ) { + delete *it; + } + + m_taglist.clear(); +} + +void CServer::Init() { + + ipfull = Uint32toStringIP(ip); + + realport = 0; + tagcount = 0; + files = 0; + users = 0; + preferences = 0; + ping = 0; + description.Clear(); + listname.Clear(); + dynip.Clear(); + failedcount = 0; + lastpinged = 0; + lastpingedtime = 0; + m_dwRealLastPingedTime = 0; + staticservermember=0; + maxusers=0; + m_uTCPFlags = 0; + m_uUDPFlags = 0; + challenge = 0; + softfiles = 0; + hardfiles = 0; + m_strVersion = _("Unknown"); + m_uLowIDUsers = 0; + m_uDescReqChallenge = 0; + lastdescpingedcout = 0; + m_auxPorts.Clear(); + m_lastdnssolve = 0; + m_dnsfailure = false; + + m_dwServerKeyUDP = 0; + m_bCryptPingReplyPending = false; + m_dwIPServerKeyUDP = 0; + m_nObfuscationPortTCP = 0; + m_nObfuscationPortUDP = 0; + +} + + +bool CServer::AddTagFromFile(CFileDataIO* servermet) +{ + if (servermet == NULL) { + return false; + } + + CTag tag(*servermet, true); + + switch(tag.GetNameID()){ + case ST_SERVERNAME: + if (listname.IsEmpty()) { + listname = tag.GetStr(); + } + break; + + case ST_DESCRIPTION: + if (description.IsEmpty()) { + description = tag.GetStr(); + } + break; + + case ST_PREFERENCE: + preferences = tag.GetInt(); + break; + + case ST_PING: + ping = tag.GetInt(); + break; + + case ST_DYNIP: + if (dynip.IsEmpty()) { + dynip = tag.GetStr(); + } + break; + + case ST_FAIL: + failedcount = tag.GetInt(); + break; + + case ST_LASTPING: + lastpinged = tag.GetInt(); + break; + + case ST_MAXUSERS: + maxusers = tag.GetInt(); + break; + + case ST_SOFTFILES: + softfiles = tag.GetInt(); + break; + + case ST_HARDFILES: + hardfiles = tag.GetInt(); + break; + + case ST_VERSION: + if (tag.IsStr()) { + // m_strVersion defaults to _("Unknown"), so check for that as well + if ((m_strVersion.IsEmpty()) || (m_strVersion == _("Unknown"))) { + m_strVersion = tag.GetStr(); + } + } else if (tag.IsInt()) { + m_strVersion = wxString::Format(wxT("%u.%u"), tag.GetInt() >> 16, tag.GetInt() & 0xFFFF); + } else { + wxASSERT(0); + } + break; + + case ST_UDPFLAGS: + m_uUDPFlags = tag.GetInt(); + break; + + case ST_AUXPORTSLIST: + m_auxPorts = tag.GetStr(); + + // Some server.mets contain empty ST_AUXPORTSLIST tags + if (!m_auxPorts.IsEmpty()) { + realport = port; + port = StrToULong(m_auxPorts.BeforeFirst(',')); + } + break; + + case ST_LOWIDUSERS: + m_uLowIDUsers = tag.GetInt(); + break; + + case ST_UDPKEY: + m_dwServerKeyUDP = tag.GetInt(); + break; + + case ST_UDPKEYIP: + m_dwIPServerKeyUDP = tag.GetInt(); + break; + + case ST_TCPPORTOBFUSCATION: + m_nObfuscationPortTCP = (uint16)tag.GetInt(); + break; + + case ST_UDPPORTOBFUSCATION: + m_nObfuscationPortUDP = (uint16)tag.GetInt(); + break; + + default: + if (!tag.GetName().IsEmpty()) { + if (tag.GetName() == wxT("files")) { + files = tag.GetInt(); + } else if (tag.GetName() == wxT("users")) { + users = tag.GetInt(); + } + } else { + wxASSERT(0); + } + } + + return true; +} + + +void CServer::SetListName(const wxString& newname) +{ + listname = newname; +} + +void CServer::SetDescription(const wxString& newname) +{ + description = newname; +} + +void CServer::SetID(uint32 newip) +{ + wxASSERT(newip); + ip = newip; + ipfull = Uint32toStringIP(ip); +} + +void CServer::SetDynIP(const wxString& newdynip) +{ + dynip = newdynip; +} + + +void CServer::SetLastDescPingedCount(bool bReset) +{ + if (bReset) { + lastdescpingedcout = 0; + } else { + lastdescpingedcout++; + } +} + +uint32 CServer::GetServerKeyUDP(bool bForce) const +{ + if (m_dwIPServerKeyUDP != 0 && m_dwIPServerKeyUDP == theApp->GetPublicIP() || bForce) { + return m_dwServerKeyUDP; + } else { + return 0; + } +} + +void CServer::SetServerKeyUDP(uint32 dwServerKeyUDP) +{ + wxASSERT( theApp->GetPublicIP() != 0 || dwServerKeyUDP == 0 ); + m_dwServerKeyUDP = dwServerKeyUDP; + m_dwIPServerKeyUDP = theApp->GetPublicIP(); +} +// File_checked_for_headers diff --git a/src/Server.h b/src/Server.h new file mode 100644 index 00000000..1d77677d --- /dev/null +++ b/src/Server.h @@ -0,0 +1,208 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef SERVER_H +#define SERVER_H + +#include "Tag.h" + +#include +#include + +#ifdef CLIENT_GUI +#include +#endif + +class ServerMet_Struct; +class CFileDataIO; + +// Server priority +#define SRV_PR_LOW 2 +#define SRV_PR_NORMAL 0 +#define SRV_PR_HIGH 1 +// Server priority max and min values +#define SRV_PR_MAX 2 +#define SRV_PR_MID 1 +#define SRV_PR_MIN 0 + +class CServer +{ +public: + CServer(ServerMet_Struct* in_data); + CServer(uint16 in_port, const wxString i_addr); + CServer(CServer* pOld); + +#ifdef CLIENT_GUI + CServer(CEC_Server_Tag *); +#endif + + ~CServer(); + void AddTag(CTag* in_tag) {m_taglist.push_back(in_tag);} + const wxString &GetListName() const {return listname;} + const wxString &GetFullIP() const {return ipfull;} + + const wxString &GetAddress() const { + if (!dynip.IsEmpty()) { + return dynip; + } else { + return ipfull; + } + } + + // the official port + uint16 GetPort() const {return realport ? realport : port;} + // the connection port + uint16 GetConnPort() const {return port;} + void SetPort(uint32 val) {realport = val;} + bool AddTagFromFile(CFileDataIO* servermet); + void SetListName(const wxString& newname); + void SetDescription(const wxString& newdescription); + uint32 GetIP() const {return ip;} + uint32 GetFiles() const {return files;} + uint32 GetUsers() const {return users;} + const wxString &GetDescription() const {return description;} + uint32 GetPing() const {return ping;} + uint32 GetPreferences() const {return preferences;} + uint32 GetMaxUsers() const {return maxusers;} + void SetMaxUsers(uint32 in_maxusers) {maxusers = in_maxusers;} + void SetUserCount(uint32 in_users) {users = in_users;} + void SetFileCount(uint32 in_files) {files = in_files;} + void ResetFailedCount() {failedcount = 0;} + void AddFailedCount() {failedcount++;} + uint32 GetFailedCount() const {return failedcount;} + void SetID(uint32 newip); + const wxString &GetDynIP() const {return dynip;} + bool HasDynIP() const {return dynip.Length();} + void SetDynIP(const wxString& newdynip); + + uint32 GetLastPingedTime() const {return lastpingedtime;} + void SetLastPingedTime(uint32 in_lastpingedtime) {lastpingedtime = in_lastpingedtime;} + + uint32 GetRealLastPingedTime() const {return m_dwRealLastPingedTime;} // last pinged time without any random modificator + void SetRealLastPingedTime(uint32 in_lastpingedtime) {m_dwRealLastPingedTime = in_lastpingedtime;} + + uint32 GetLastPinged() const {return lastpinged;} + void SetLastPinged(uint32 in_lastpinged) {lastpinged = in_lastpinged;} + + void SetPing(uint32 in_ping) {ping = in_ping;} + void SetPreference(uint32 in_preferences) {preferences = in_preferences;} + void SetIsStaticMember(bool in) {staticservermember=in;} + bool IsStaticMember() const {return staticservermember;} + uint32 GetChallenge() const {return challenge;} + void SetChallenge(uint32 in_challenge) {challenge = in_challenge;} + uint32 GetSoftFiles() const {return softfiles;} + void SetSoftFiles(uint32 in_softfiles) {softfiles = in_softfiles;} + uint32 GetHardFiles() const {return hardfiles;} + void SetHardFiles(uint32 in_hardfiles) {hardfiles = in_hardfiles;} + const wxString &GetVersion() const {return m_strVersion;} + void SetVersion(const wxString &pszVersion) {m_strVersion = pszVersion;} + void SetTCPFlags(uint32 uFlags) {m_uTCPFlags = uFlags;} + uint32 GetTCPFlags() const {return m_uTCPFlags;} + void SetUDPFlags(uint32 uFlags) {m_uUDPFlags = uFlags;} + uint32 GetUDPFlags() const {return m_uUDPFlags;} + uint32 GetLowIDUsers() const {return m_uLowIDUsers;} + void SetLowIDUsers(uint32 uLowIDUsers) {m_uLowIDUsers = uLowIDUsers;} + uint32 GetDescReqChallenge() const {return m_uDescReqChallenge;} + void SetDescReqChallenge(uint32 uDescReqChallenge) {m_uDescReqChallenge = uDescReqChallenge;} + uint8 GetLastDescPingedCount() const {return lastdescpingedcout;} + void SetLastDescPingedCount(bool reset); + + uint16 GetObfuscationPortTCP() const {return m_nObfuscationPortTCP;} + void SetObfuscationPortTCP(uint16 nPort) {m_nObfuscationPortTCP = nPort;} + + uint16 GetObfuscationPortUDP() const {return m_nObfuscationPortUDP;} + void SetObfuscationPortUDP(uint16 nPort) {m_nObfuscationPortUDP = nPort;} + + uint32 GetServerKeyUDP(bool bForce = false) const; + void SetServerKeyUDP(uint32 dwServerKeyUDP); + + bool GetCryptPingReplyPending() const {return m_bCryptPingReplyPending;} + void SetCryptPingReplyPending(bool bVal) {m_bCryptPingReplyPending = bVal;} + + uint32 GetServerKeyUDPIP() const {return m_dwIPServerKeyUDP;} + + bool GetUnicodeSupport() const {return GetTCPFlags() & SRV_TCPFLG_UNICODE;} + bool GetRelatedSearchSupport() const {return GetTCPFlags() & SRV_TCPFLG_RELATEDSEARCH;} + bool SupportsLargeFilesTCP() const {return GetTCPFlags() & SRV_TCPFLG_LARGEFILES;} + bool SupportsLargeFilesUDP() const {return GetUDPFlags() & SRV_UDPFLG_LARGEFILES;} + bool SupportsObfuscationUDP() const {return (GetUDPFlags() & SRV_UDPFLG_UDPOBFUSCATION)!=0;} + bool SupportsObfuscationTCP() const {return GetObfuscationPortTCP() != 0 && ((GetUDPFlags() & SRV_UDPFLG_TCPOBFUSCATION)!=0 || (GetTCPFlags() & SRV_TCPFLG_TCPOBFUSCATION)!=0);} + bool SupportsGetSourcesObfuscation() const {return (GetTCPFlags() & SRV_TCPFLG_TCPOBFUSCATION)!=0;} // mapped to TCPFLAG_TCPOBFU + + const wxString& GetAuxPortsList() const {return m_auxPorts;} + void SetAuxPortsList(const wxString& val) {m_auxPorts = val;} + + uint64 GetLastDNSSolve() const { return m_lastdnssolve; } + void SetLastDNSSolve(uint64 value) { m_lastdnssolve = value; } + + bool GetDNSError() const { return m_dnsfailure; } + void SetDNSError(bool value) { m_dnsfailure = value; } + +private: + uint32 challenge; + uint32 lastpinged; //This is to get the ping delay. + uint32 lastpingedtime; //This is to decided when we retry the ping. + uint32 files; + uint32 users; + uint32 maxusers; + uint32 softfiles; + uint32 hardfiles; + uint32 preferences; + uint32 ping; + wxString description; + wxString listname; + wxString dynip; + uint32 tagcount; + wxString ipfull; + uint32 ip; + uint16 port; + uint16 realport; + uint32 failedcount; + uint32 m_uDescReqChallenge; + uint8 lastdescpingedcout; + TagPtrList m_taglist; + uint8 staticservermember; + wxString m_strVersion; + uint32 m_uTCPFlags; + uint32 m_uUDPFlags; + uint32 m_uLowIDUsers; + wxString m_auxPorts; + + uint64 m_lastdnssolve; + bool m_dnsfailure; + + bool m_bCryptPingReplyPending; + uint32 m_dwServerKeyUDP; + uint32 m_dwIPServerKeyUDP; + uint16 m_nObfuscationPortTCP; + uint16 m_nObfuscationPortUDP; + + uint32 m_dwRealLastPingedTime; + + void Init(); +}; + +#endif // SERVER_H +// File_checked_for_headers diff --git a/src/ServerConnect.cpp b/src/ServerConnect.cpp new file mode 100644 index 00000000..462a8895 --- /dev/null +++ b/src/ServerConnect.cpp @@ -0,0 +1,644 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "ServerConnect.h" // Interface declarations. + +#include +#include // Sometimes we reply with TCP packets. +#include +#include +#include + +#include "SearchList.h" // Needed for CSearchList +#include "ServerUDPSocket.h" // Needed for CServerUDPSocket +#include "SharedFileList.h" // Needed for CSharedFileList +#include "Packet.h" // Needed for CTag +#include "MemFile.h" // Needed for CMemFile +#include "ServerSocket.h" // Needed for CServerSocket +#include "ListenSocket.h" // Needed for CListenSocket +#include "Server.h" // Needed for CServer +#include "amule.h" // Needed for theApp +#include "ServerList.h" // Needed for CServerList +#include "Preferences.h" // Needed for CPreferences +#include "Statistics.h" // Needed for theStats +#include "Logger.h" +#include "GuiEvents.h" // Needed for Notify_* +#include + + +//#define DEBUG_CLIENT_PROTOCOL + + +void CServerConnect::TryAnotherConnectionrequest() +{ + if ( connectionattemps.size() < (( thePrefs::IsSafeServerConnectEnabled()) ? 1 : 2) ) { + + CServer* next_server = used_list->GetNextServer(m_bTryObfuscated); + + if ( thePrefs::AutoConnectStaticOnly() ) { + while (next_server && !next_server->IsStaticMember()) { + next_server = used_list->GetNextServer(m_bTryObfuscated); + } + } + + if (!next_server) { + if ( connectionattemps.empty() ) { + if (m_bTryObfuscated && !thePrefs::IsClientCryptLayerRequired()){ + AddLogLineM(true, _("Failed to connect to all obfuscated servers listed. Making another pass without obfuscation.")); + // try all servers on the non-obfuscated port next + m_bTryObfuscated = false; + ConnectToAnyServer( false, true); + } else { + AddLogLineM(true, _("Failed to connect to all servers listed. Making another pass.")); + ConnectToAnyServer( false ); + } + } + return; + } + + ConnectToServer(next_server, true, !m_bTryObfuscated); + } +} + +void CServerConnect::ConnectToAnyServer(bool prioSort, bool bNoCrypt) +{ + if (!thePrefs::GetNetworkED2K()){ + AddLogLineM(true,_("ED2K network disabled on preferences, not connecting.")); + return; + } + + StopConnectionTry(); + Disconnect(); + connecting = true; + singleconnecting = false; + m_bTryObfuscated = thePrefs::IsServerCryptLayerTCPRequested() && !bNoCrypt; + + // Barry - Only auto-connect to static server option + if (thePrefs::AutoConnectStaticOnly()) { + bool anystatic = false; + CServer *next_server; + used_list->ResetServerPos(); + while ((next_server = used_list->GetNextServer(false)) != NULL) { + if (next_server->IsStaticMember()) { + anystatic = true; + break; + } + } + if (!anystatic) { + connecting = false; + AddLogLineM(true,_("No valid servers to connect in serverlist found")); + return; + } + } + + if ( thePrefs::Score() && prioSort ) { + used_list->Sort(); + } + + used_list->ResetServerPos(); + + if (used_list->GetServerCount()==0 ) { + connecting = false; + AddLogLineM(true,_("No valid servers to connect in serverlist found")); + return; + } + + theApp->listensocket->Process(); + + TryAnotherConnectionrequest(); +} + + +void CServerConnect::ConnectToServer(CServer* server, bool multiconnect, bool bNoCrypt) +{ + if (!thePrefs::GetNetworkED2K()){ + AddLogLineM(true,_("ED2K network disabled on preferences, not connecting.")); + return; + } + + if (!multiconnect) { + StopConnectionTry(); + Disconnect(); + } + connecting = true; + singleconnecting = !multiconnect; + + CServerSocket* newsocket = new CServerSocket(this, thePrefs::GetProxyData()); + m_lstOpenSockets.push_back(newsocket); + newsocket->ConnectToServer(server, bNoCrypt); + + connectionattemps[GetTickCount()] = newsocket; +} + + +void CServerConnect::StopConnectionTry() +{ + connectionattemps.clear(); + connecting = false; + singleconnecting = false; + + if (m_idRetryTimer.IsRunning()) + { + m_idRetryTimer.Stop(); + } + + // close all currenty opened sockets except the one which is connected to our current server + for(SocketsList::iterator it = m_lstOpenSockets.begin(); it != m_lstOpenSockets.end(); ) { + CServerSocket *pSck = *it++; + if (pSck == connectedsocket) // don't destroy socket which is connected to server + continue; + if (pSck->m_bIsDeleting == false) // don't destroy socket if it is going to destroy itself later on + DestroySocket(pSck); + } +} + +#define CAPABLE_ZLIB 0x01 +#define CAPABLE_IP_IN_LOGIN_FRAME 0x02 +#define CAPABLE_AUXPORT 0x04 +#define CAPABLE_NEWTAGS 0x08 +#define CAPABLE_UNICODE 0x10 +#define CAPABLE_LARGEFILES 0x100 +#define SRVCAP_SUPPORTCRYPT 0x0200 +#define SRVCAP_REQUESTCRYPT 0x0400 +#define SRVCAP_REQUIRECRYPT 0x0800 + +void CServerConnect::ConnectionEstablished(CServerSocket* sender) +{ + if (connecting == false) + { + // we are already connected to another server + DestroySocket(sender); + return; + } + + if (sender->GetConnectionState() == CS_WAITFORLOGIN) { + AddLogLineM(false, CFormat( _("Connected to %s (%s:%i)") ) + % sender->cur_server->GetListName() + % sender->cur_server->GetFullIP() + % sender->cur_server->GetPort() ); + + //send loginpacket + CServer* update = theApp->serverlist->GetServerByAddress( sender->cur_server->GetAddress(), sender->cur_server->GetPort() ); + if (update){ + update->ResetFailedCount(); + Notify_ServerRefresh( update ); + } + + CMemFile data(256); + data.WriteHash(thePrefs::GetUserHash()); + // Why pass an ID, if we are loggin in? + data.WriteUInt32(GetClientID()); + data.WriteUInt16(thePrefs::GetPort()); + data.WriteUInt32(4); // tagcount + + // Kry - Server doesn't support VBT tags afaik. + // Not to mention we don't know its flags yet + + CTagString tagname(CT_NAME,thePrefs::GetUserNick()); + tagname.WriteTagToFile(&data); + + CTagInt32 tagversion(CT_VERSION,EDONKEYVERSION); + tagversion.WriteTagToFile(&data); + + uint32 dwCryptFlags = 0; + + if (thePrefs::IsClientCryptLayerSupported()) { + dwCryptFlags |= SRVCAP_SUPPORTCRYPT; + } + + if (thePrefs::IsClientCryptLayerRequested()) { + dwCryptFlags |= SRVCAP_REQUESTCRYPT; + } + + if (thePrefs::IsClientCryptLayerRequired()) { + dwCryptFlags |= SRVCAP_REQUIRECRYPT; + } + + // FLAGS for server connection + CTagInt32 tagflags(CT_SERVER_FLAGS, CAPABLE_ZLIB + | CAPABLE_AUXPORT + | CAPABLE_NEWTAGS + | CAPABLE_UNICODE + | CAPABLE_LARGEFILES + | dwCryptFlags + ); + + tagflags.WriteTagToFile(&data); + + // eMule Version (14-Mar-2004: requested by lugdunummaster (need for LowID clients which have no chance + // to send an Hello packet to the server during the callback test)) + CTagInt32 tagMuleVersion(CT_EMULE_VERSION, + (SO_AMULE << 24) | + make_full_ed2k_version(VERSION_MJR, VERSION_MIN, VERSION_UPDATE) + ); + tagMuleVersion.WriteTagToFile(&data); + + CPacket* packet = new CPacket(data, OP_EDONKEYPROT, OP_LOGINREQUEST); + #ifdef DEBUG_CLIENT_PROTOCOL + AddLogLineM(true,wxT("Client: OP_LOGINREQUEST")); + AddLogLineM(true,wxString(wxT(" Hash : ")) << thePrefs::GetUserHash().Encode()); + AddLogLineM(true,wxString(wxT(" ClientID : ")) << GetClientID()); + AddLogLineM(true,wxString(wxT(" Port : ")) << thePrefs::GetPort()); + AddLogLineM(true,wxString(wxT(" User Nick: ")) << thePrefs::GetUserNick()); + AddLogLineM(true,wxString(wxT(" Edonkey : ")) << EDONKEYVERSION); + #endif + theStats::AddUpOverheadServer(packet->GetPacketSize()); + SendPacket(packet, true, sender); + } else if (sender->GetConnectionState() == CS_CONNECTED){ + theStats::AddReconnect(); + theStats::GetServerConnectTimer()->ResetTimer(); + connected = true; + AddLogLineM(true, CFormat( _("Connection established on: %s") ) % sender->cur_server->GetListName()); + connectedsocket = sender; + + StopConnectionTry(); + + CServer* update = theApp->serverlist->GetServerByAddress(connectedsocket->cur_server->GetAddress(),sender->cur_server->GetPort()); + if ( update ) { + Notify_ServerHighlight(update, true); + } + + theApp->sharedfiles->ClearED2KPublishInfo(); + + Notify_ServerRemoveDead(); + + // tecxx 1609 2002 - serverlist update + if (thePrefs::AddServersFromServer()) { + CPacket* packet = new CPacket(OP_GETSERVERLIST, 0, OP_EDONKEYPROT); + theStats::AddUpOverheadServer(packet->GetPacketSize()); + SendPacket(packet, true); + #ifdef DEBUG_CLIENT_PROTOCOL + AddLogLineM(true,wxT("Client: OP_GETSERVERLIST")); + #endif + } + } + + theApp->ShowConnectionState(); +} + + +bool CServerConnect::SendPacket(CPacket* packet,bool delpacket, CServerSocket* to) +{ + if (!to) { + if (connected) { + connectedsocket->SendPacket(packet, delpacket, true); + return true; + } else { + if ( delpacket ) { + delete packet; + } + + return false; + } + } else { + to->SendPacket(packet, delpacket, true); + return true; + } +} + + +bool CServerConnect::SendUDPPacket(CPacket* packet, CServer* host, bool delpacket, bool rawpacket, uint16 port_offset) +{ + if (connected) { + serverudpsocket->SendPacket(packet, host, delpacket, rawpacket, port_offset); + } else if (delpacket) { + delete packet; + } + + return true; +} + + +void CServerConnect::ConnectionFailed(CServerSocket* sender) +{ + if (connecting == false && sender != connectedsocket) + { + // just return, cleanup is done by the socket itself + return; + } + //messages + CServer* pServer = theApp->serverlist->GetServerByAddress(sender->cur_server->GetAddress(), sender->cur_server->GetPort()); + switch (sender->GetConnectionState()){ + case CS_FATALERROR: + AddLogLineM(true, _("Fatal Error while trying to connect. Internet connection might be down")); + break; + case CS_DISCONNECTED: + theApp->sharedfiles->ClearED2KPublishInfo(); + AddLogLineM(false,CFormat( _("Lost connection to %s (%s:%i)") ) + % sender->cur_server->GetListName() + % sender->cur_server->GetFullIP() + % sender->cur_server->GetPort() ); + + if (pServer){ + Notify_ServerHighlight(pServer, false); + } + break; + case CS_SERVERDEAD: + AddLogLineM(false, CFormat( _("%s (%s:%i) appears to be dead.") ) + % sender->cur_server->GetListName() + % sender->cur_server->GetFullIP() + % sender->cur_server->GetPort() ); + + if (pServer) { + pServer->AddFailedCount(); + Notify_ServerRefresh( pServer ); + } + break; + case CS_ERROR: + break; + case CS_SERVERFULL: + AddLogLineM(false, CFormat( _("%s (%s:%i) appears to be full.") ) + % sender->cur_server->GetListName() + % sender->cur_server->GetFullIP() + % sender->cur_server->GetPort() ); + + break; + case CS_NOTCONNECTED:; + break; + } + + // IMPORTANT: mark this socket not to be deleted in StopConnectionTry(), + // because it will delete itself after this function! + sender->m_bIsDeleting = true; + + switch (sender->GetConnectionState()) { + case CS_FATALERROR:{ + bool autoretry= !singleconnecting; + StopConnectionTry(); + if ((thePrefs::Reconnect()) && (autoretry) && (!m_idRetryTimer.IsRunning())){ + AddLogLineM(false, wxString::Format(wxPLURAL("Automatic connection to server will retry in %d second", "Automatic connection to server will retry in %d seconds", CS_RETRYCONNECTTIME), CS_RETRYCONNECTTIME)); + m_idRetryTimer.Start(1000*CS_RETRYCONNECTTIME); + } + break; + } + case CS_DISCONNECTED:{ + theApp->sharedfiles->ClearED2KPublishInfo(); + connected = false; + Notify_ServerHighlight(sender->cur_server,false); + if (connectedsocket) { + connectedsocket->Close(); + } + connectedsocket = NULL; + theApp->searchlist->StopGlobalSearch(); + Notify_SearchCancel(); + theStats::GetServerConnectTimer()->StopTimer(); + if (thePrefs::Reconnect() && !connecting){ + ConnectToAnyServer(); + } + + AddLogLineM( true, _("Connection lost") ); + break; + } + case CS_ERROR: + case CS_NOTCONNECTED:{ + if (!connecting) + break; + AddLogLineM(false, CFormat( _("Connecting to %s (%s:%i) failed.") ) + % sender->info + % sender->cur_server->GetFullIP() + % sender->cur_server->GetPort() ); + } + case CS_SERVERDEAD: + case CS_SERVERFULL:{ + if (!connecting) { + break; + } + if (singleconnecting) { + if (pServer && sender->IsServerCryptEnabledConnection() && !thePrefs::IsClientCryptLayerRequired()){ + // try reconnecting without obfuscation + ConnectToServer(pServer, false, true); + break; + } + + StopConnectionTry(); + break; + } + + ServerSocketMap::iterator it = connectionattemps.begin(); + while ( it != connectionattemps.end() ){ + if ( it->second == sender ) { + connectionattemps.erase( it ); + break; + } + ++it; + } + TryAnotherConnectionrequest(); + } + } + theApp->ShowConnectionState(); +} + +void CServerConnect::CheckForTimeout() +{ + uint32 dwCurTick = GetTickCount(); + + ServerSocketMap::iterator it = connectionattemps.begin(); + while ( it != connectionattemps.end() ){ + if ( !it->second ) { + AddLogLineM(false, _("Error: Socket invalid at timeoutcheck")); + connectionattemps.erase( it ); + return; + } + + if ( dwCurTick - it->first > CONSERVTIMEOUT) { + uint32 key = it->first; + CServerSocket* value = it->second; + ++it; + if (!value->IsSolving()) { + AddLogLineM(false, CFormat( _("Connection attempt to %s (%s:%i) timed out.") ) + % value->info + % value->cur_server->GetFullIP() + % value->cur_server->GetPort() ); + + connectionattemps.erase( key ); + + TryAnotherConnectionrequest(); + DestroySocket( value ); + } + } else { + ++it; + } + } +} + + +bool CServerConnect::Disconnect() +{ + if (connected && connectedsocket) { + theApp->sharedfiles->ClearED2KPublishInfo(); + + connected = false; + + CServer* update = theApp->serverlist->GetServerByAddress( + connectedsocket->cur_server->GetAddress(), + connectedsocket->cur_server->GetPort()); + Notify_ServerHighlight(update, false); + theApp->SetPublicIP(0); + DestroySocket(connectedsocket); + connectedsocket = NULL; + theApp->ShowConnectionState(); + theStats::GetServerConnectTimer()->StopTimer(); + return true; + } else { + return false; + } +} + + +CServerConnect::CServerConnect(CServerList* in_serverlist, amuleIPV4Address &address) +: m_idRetryTimer(theApp,ID_SERVER_RETRY_TIMER_EVENT) +{ + connectedsocket = NULL; + used_list = in_serverlist; + max_simcons = (thePrefs::IsSafeServerConnectEnabled()) ? 1 : 2; + connecting = false; + connected = false; + clientid = 0; + singleconnecting = false; + + // initalize socket for udp packets + serverudpsocket = new CServerUDPSocket(address, thePrefs::GetProxyData()); +} + + +CServerConnect::~CServerConnect() +{ + m_idRetryTimer.Stop(); + // stop all connections + StopConnectionTry(); + // close connected socket, if any + DestroySocket(connectedsocket); + connectedsocket = NULL; + // close udp socket + delete serverudpsocket; +} + + +CServer* CServerConnect::GetCurrentServer() +{ + if (IsConnected() && connectedsocket) { + return connectedsocket->cur_server; + } + return NULL; +} + + +void CServerConnect::SetClientID(uint32 newid) +{ + clientid = newid; + + if (!::IsLowID(newid)) { + theApp->SetPublicIP(newid); + } +} + + +void CServerConnect::DestroySocket(CServerSocket* pSck) +{ + if (pSck == NULL) { + return; + } + m_lstOpenSockets.remove(pSck); + pSck->Destroy(); +} + + +bool CServerConnect::IsLocalServer(uint32 dwIP, uint16 nPort) +{ + if (IsConnected()){ + if (connectedsocket->cur_server->GetIP() == dwIP && connectedsocket->cur_server->GetPort() == nPort) + return true; + } + return false; +} + + +void CServerConnect::KeepConnectionAlive() +{ + uint32 dwServerKeepAliveTimeout = thePrefs::GetServerKeepAliveTimeout(); + if (dwServerKeepAliveTimeout && connected && connectedsocket && + connectedsocket->connectionstate == CS_CONNECTED && + GetTickCount() - connectedsocket->GetLastTransmission() >= dwServerKeepAliveTimeout) { + // "Ping" the server if the TCP connection was not used for the specified interval with + // an empty publish files packet -> recommended by lugdunummaster himself! + + CMemFile files(4); + files.WriteUInt32(0); //nFiles + + CPacket* packet = new CPacket(files, OP_EDONKEYPROT, OP_OFFERFILES); + #ifdef DEBUG_CLIENT_PROTOCOL + AddLogLineM(true,wxT("Client: OP_OFFERFILES")); + #endif + // compress packet + // - this kind of data is highly compressable (N * (1 MD4 and at least 3 string meta data tags and 1 integer meta data tag)) + // - the min. amount of data needed for one published file is ~100 bytes + // - this function is called once when connecting to a server and when a file becomes shareable - so, it's called rarely. + // - if the compressed size is still >= the original size, we send the uncompressed packet + // therefor we always try to compress the packet + theStats::AddUpOverheadServer(packet->GetPacketSize()); + connectedsocket->SendPacket(packet,true); + + AddDebugLogLineM(false, logServer, wxT("Refreshing server connection")); + } +} + +// true if the IP is one of a server which we currently try to connect to +bool CServerConnect::AwaitingTestFromIP(uint32 dwIP) +{ + ServerSocketMap::iterator it = connectionattemps.begin(); + + while (it != connectionattemps.end()) { + const CServerSocket* serversocket = it->second; + if (serversocket && (serversocket->GetConnectionState() == CS_WAITFORLOGIN) && + (serversocket->GetServerIP() == dwIP)) { + return true; + } + ++it; + } + + return false; +} + + +bool CServerConnect::IsConnectedObfuscated() const +{ + return connectedsocket != NULL && connectedsocket->IsObfusicating(); +} + + +void CServerConnect::OnServerHostnameResolved(void* socket, uint32 ip) +{ + // The socket object might have been deleted while we waited for the hostname + // to be resolved, so we check if it's still among the open sockets. + SocketsList::iterator it = std::find(m_lstOpenSockets.begin(), m_lstOpenSockets.end(), socket); + if (it != m_lstOpenSockets.end()) { + (*it)->OnHostnameResolved(ip); + } else { + printf("Received late result of DNS lookup, discarding.\n"); + } +} + + +// File_checked_for_headers diff --git a/src/ServerConnect.h b/src/ServerConnect.h new file mode 100644 index 00000000..b1d45b9f --- /dev/null +++ b/src/ServerConnect.h @@ -0,0 +1,126 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// +// Client to Server communication +// + +#ifndef SERVERCONNECT_H +#define SERVERCONNECT_H + + +#include "amuleIPV4Address.h" // Needed for amuleIPV4Address +#include "Timer.h" // Needed for CTimer + +#include // Needed for std::map + +class CServerList; +class CServerSocket; +class CServer; +class CPacket; +class CServerUDPSocket; + +#define CS_FATALERROR -5 +#define CS_DISCONNECTED -4 +#define CS_SERVERDEAD -3 +#define CS_ERROR -2 +#define CS_SERVERFULL -1 +#define CS_NOTCONNECTED 0 +#define CS_CONNECTING 1 +#define CS_CONNECTED 2 +#define CS_WAITFORLOGIN 3 +#define CS_RETRYCONNECTTIME 30 // seconds + +typedef std::map ServerSocketMap; + +class CServerConnect { +public: + CServerConnect(CServerList* in_serverlist, amuleIPV4Address &address); + ~CServerConnect(); + + void ConnectionFailed(CServerSocket* sender); + void ConnectionEstablished(CServerSocket* sender); + + void ConnectToAnyServer(bool prioSort = true, bool bNoCrypt = false); + void ConnectToServer(CServer* toconnect, bool multiconnect = false, bool bNoCrypt = false); + void StopConnectionTry(); + void CheckForTimeout(); + + // safe socket closure and destruction + void DestroySocket(CServerSocket* pSck); + bool SendPacket(CPacket* packet,bool delpacket = true, CServerSocket* to = 0); + + // Creteil Begin + bool IsUDPSocketAvailable() const { return serverudpsocket != NULL; } + // Creteil End + + bool SendUDPPacket(CPacket* packet,CServer* host, bool delpacket, bool rawpacket = false, uint16 port_offset = 4); + bool Disconnect(); + bool IsConnecting() { return connecting; } + bool IsConnected() { return connected; } + uint32 GetClientID() { return clientid; } + CServer*GetCurrentServer(); + uint32 clientid; + uint8 pendingConnects; + bool IsLowID() { return ::IsLowID(clientid); } + void SetClientID(uint32 newid); + bool IsLocalServer(uint32 dwIP, uint16 nPort); + void TryAnotherConnectionrequest(); + bool IsSingleConnect() { return singleconnecting; } + void KeepConnectionAlive(); + + bool AwaitingTestFromIP(uint32 ip); + bool IsConnectedObfuscated() const; + + /** + * Called when a socket has been DNS resolved. + * + * @param socket The socket object requesting DNS resolution. + * @param ip The found IP, or zero on error. + * + * Note that 'socket' may or may not refer to an valid object, + * and should be checked before being used. + */ + void OnServerHostnameResolved(void* socket, uint32 ip); +private: + bool connecting; + bool singleconnecting; + bool connected; + int8 max_simcons; + bool m_bTryObfuscated; + CServerSocket* connectedsocket; + CServerList* used_list; + CServerUDPSocket* serverudpsocket; + + // list of currently opened sockets + typedef std::list SocketsList; + SocketsList m_lstOpenSockets; + CTimer m_idRetryTimer; + + ServerSocketMap connectionattemps; +}; + +#endif // SERVERCONNECT_H +// File_checked_for_headers diff --git a/src/ServerList.cpp b/src/ServerList.cpp new file mode 100644 index 00000000..4cd923ca --- /dev/null +++ b/src/ServerList.cpp @@ -0,0 +1,977 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include + +#include "ServerList.h" // Interface declarations. + +#include +#include +#include +#include + +#include +#include +#include // Needed for wxURL +#include + +#include "DownloadQueue.h" // Needed for CDownloadQueue +#include "ServerConnect.h" // Needed for CServerConnect +#include "Server.h" // Needed for CServer and SRV_PR_* +#include "OtherStructs.h" // Needed for ServerMet_Struct +#include "CFile.h" // Needed for CFile +#include "HTTPDownload.h" // Needed for HTTPThread +#include "Preferences.h" // Needed for thePrefs +#include "amule.h" // Needed for theApp +#include "Statistics.h" // Needed for theStats +#include "Packet.h" // Neeed for CPacket +#include "Logger.h" +#include +#include "IPFilter.h" +#include // Needed for UnpackArchive + +CServerList::CServerList() +{ + m_serverpos = m_servers.end(); + m_statserverpos = m_servers.end(); + m_nLastED2KServerLinkCheck = ::GetTickCount(); +} + + +bool CServerList::Init() +{ + // Load Metfile + bool bRes = LoadServerMet(CPath(theApp->ConfigDir + wxT("server.met"))); + + // insert static servers from textfile + LoadStaticServers(theApp->ConfigDir + wxT("staticservers.dat")); + + // Send the auto-update of server.met via HTTPThread requests + current_url_index = 0; + if ( thePrefs::AutoServerlist()) { + AutoUpdate(); + } + + return bRes; +} + + +bool CServerList::LoadServerMet(const CPath& path) +{ + AddLogLineM(false, CFormat(_("Loading server.met file: %s")) % path); + + bool merge = !m_servers.empty(); + + if (!path.FileExists()) { + AddLogLineM(false, _("Server.met file not found!")); + return false; + } + + // Try to unpack the file, might be an archive + const wxChar* mets[] = { wxT("server.met"), NULL }; + // Try to unpack the file, might be an archive + if (UnpackArchive(path, mets).second != EFT_Met) { + AddLogLineM(true, CFormat(_("Failed to load server.met file '%s', unknown format encountered.")) % path); + return false; + } + + CFile servermet(path, CFile::read); + if ( !servermet.IsOpened() ){ + AddLogLineM( false, _("Failed to open server.met!") ); + return false; + } + + + try { + Notify_ServerFreeze(); + + byte version = servermet.ReadUInt8(); + + if (version != 0xE0 && version != MET_HEADER) { + AddLogLineM(true, wxString::Format(_("Server.met file corrupt, found invalid versiontag: 0x%x, size %i"), version, sizeof(version))); + Notify_ServerThaw(); + return false; + } + + uint32 fservercount = servermet.ReadUInt32(); + + ServerMet_Struct sbuffer; + uint32 iAddCount = 0; + + for ( uint32 j = 0; j < fservercount; ++j ) { + sbuffer.ip = servermet.ReadUInt32(); + sbuffer.port = servermet.ReadUInt16(); + sbuffer.tagcount = servermet.ReadUInt32(); + + CServer* newserver = new CServer(&sbuffer); + + // Load tags + for ( uint32 i = 0; i < sbuffer.tagcount; ++i ) { + newserver->AddTagFromFile(&servermet); + } + + // Server priorities are not in sorted order + // High = 1, Low = 2, Normal = 0, so we have to check + // in a less logical fashion. + int priority = newserver->GetPreferences(); + if (priority < SRV_PR_MIN || priority > SRV_PR_MAX) { + newserver->SetPreference(SRV_PR_NORMAL); + } + + // set listname for server + if ( newserver->GetListName().IsEmpty() ) { + newserver->SetListName(wxT("Server ") +newserver->GetAddress()); + } + + + if ( !theApp->AddServer(newserver) ) { + CServer* update = GetServerByAddress(newserver->GetAddress(), newserver->GetPort()); + if(update) { + update->SetListName( newserver->GetListName()); + if(!newserver->GetDescription().IsEmpty()) { + update->SetDescription( newserver->GetDescription()); + } + Notify_ServerRefresh(update); + } + delete newserver; + } else { + ++iAddCount; + } + + } + + Notify_ServerThaw(); + + if (!merge) { + AddLogLineM(true, wxString::Format(wxPLURAL("%i server in server.met found", "%i servers in server.met found", fservercount), fservercount)); + } else { + AddLogLineM(true, wxString::Format(wxPLURAL("%d server added", "%d servers added", iAddCount), iAddCount)); + } + } catch (const CInvalidPacket& err) { + AddLogLineM(true, wxT("Error: the file server.met is corrupted: ") + err.what()); + Notify_ServerThaw(); + return false; + } catch (const CSafeIOException& err) { + AddLogLineM(true, wxT("IO error while reading 'server.met': ") + err.what()); + Notify_ServerThaw(); + return false; + } + + return true; +} + + +bool CServerList::AddServer(CServer* in_server, bool fromUser) +{ + if ( !in_server->GetPort() ) { + if ( fromUser ) { + AddLogLineM( true, + CFormat( _("Server not added: [%s:%d] does not specify a valid port.") ) + % in_server->GetAddress() + % in_server->GetPort() + ); + } + + return false; + } else if ( + !in_server->HasDynIP() && + ( + !IsGoodIP( in_server->GetIP(), thePrefs::FilterLanIPs() ) || + theApp->ipfilter->IsFiltered( in_server->GetIP(), true ) + ) + ) { + if ( fromUser ) { + AddLogLineM( true, + CFormat( _("Server not added: The IP of [%s:%d] is filtered or invalid.") ) + % in_server->GetAddress() + % in_server->GetPort() + ); + } + + return false; + } + + CServer* test_server = GetServerByAddress(in_server->GetAddress(), in_server->GetPort()); + // Avoid duplicate (dynIP) servers: If the server which is to be added, is a dynIP-server + // but we don't know yet it's DN, we need to search for an already available server with + // that IP. + if (test_server == NULL && in_server->GetIP() != 0) { + test_server = GetServerByIPTCP(in_server->GetIP(), in_server->GetPort()); + } + + if (test_server) { + if ( fromUser ) { + AddLogLineM( true, + CFormat( _("Server not added: Server with matching IP:Port [%s:%d] found in list.") ) + % in_server->GetAddress() + % in_server->GetPort() + ); + } + + test_server->ResetFailedCount(); + Notify_ServerRefresh( test_server ); + + return false; + } + + theStats::AddServer(); + + m_servers.push_back(in_server); + NotifyObservers( EventType( EventType::INSERTED, in_server ) ); + + if ( fromUser ) { + AddLogLineM( true, + CFormat( _("Server added: Server at [%s:%d] using the name '%s'.") ) + % in_server->GetAddress() + % in_server->GetPort() + % in_server->GetListName() + ); + } + + + return true; +} + + +void CServerList::ServerStats() +{ + uint32 tNow = ::GetTickCount(); + + if (theApp->IsConnectedED2K() && m_servers.size() > 0) { + CServer* ping_server = GetNextStatServer(); + CServer* test = ping_server; + if (!ping_server) { + return; + } + + while (ping_server->GetLastPingedTime() && (tNow - ping_server->GetLastPingedTime()) < UDPSERVSTATREASKTIME) { + ping_server = GetNextStatServer(); + if (ping_server == test) { + return; + } + } + + if (ping_server->GetFailedCount() >= thePrefs::GetDeadserverRetries() && thePrefs::DeadServer() && !ping_server->IsStaticMember()) { + RemoveServer(ping_server); + return; + } + + srand((unsigned)time(NULL)); + ping_server->SetRealLastPingedTime(tNow); // this is not used to calcualte the next ping, but only to ensure a minimum delay for premature pings + if (!ping_server->GetCryptPingReplyPending() && (!ping_server->GetLastPingedTime() || (tNow - ping_server->GetLastPingedTime()) >= UDPSERVSTATREASKTIME) && theApp->GetPublicIP() && thePrefs::IsServerCryptLayerUDPEnabled()) { + // We try a obfsucation ping first and wait 20 seconds for an answer + // if it doesn't get responsed, we don't count it as error but continue with a normal ping + ping_server->SetCryptPingReplyPending(true); + uint32 nPacketLen = 4 + (uint8)(rand() % 16); // max padding 16 bytes + byte* pRawPacket = new byte[nPacketLen]; + uint32 dwChallenge = (rand() << 17) | (rand() << 2) | (rand() & 0x03); + if (dwChallenge == 0) { + dwChallenge++; + } + + memcpy(pRawPacket, &dwChallenge, sizeof(uint32)); + for (uint32 i = 4; i < nPacketLen; i++) { // fillng up the remaining bytes with random data + pRawPacket[i] = (uint8)rand(); + } + + ping_server->SetChallenge(dwChallenge); + ping_server->SetLastPinged(tNow); + ping_server->SetLastPingedTime((tNow - (uint32)UDPSERVSTATREASKTIME) + 20); // give it 20 seconds to respond + + AddDebugLogLineM(false, logServerUDP, CFormat(wxT(">> Sending OP__GlobServStatReq (obfuscated) to server %s:%u")) % ping_server->GetAddress() % ping_server->GetPort()); + + CPacket* packet = new CPacket(pRawPacket[1], nPacketLen - 2, pRawPacket[0]); + packet->CopyToDataBuffer(0, pRawPacket + 2, nPacketLen - 2); + + theStats::AddUpOverheadServer(packet->GetPacketSize()); + theApp->serverconnect->SendUDPPacket(packet, ping_server, true, true /*raw packet*/, 12 /* Port offset is 12 for obfuscated encryption*/); + } else if (ping_server->GetCryptPingReplyPending() || theApp->GetPublicIP() == 0 || !thePrefs::IsServerCryptLayerUDPEnabled()){ + // our obfsucation ping request was not answered, so probably the server doesn'T supports obfuscation + // continue with a normal request + if (ping_server->GetCryptPingReplyPending() && thePrefs::IsServerCryptLayerUDPEnabled()) { + AddDebugLogLineM(false, logServerUDP, wxT("CryptPing failed for server ") + ping_server->GetListName()); + } else if (thePrefs::IsServerCryptLayerUDPEnabled()) { + AddDebugLogLineM(false, logServerUDP, wxT("CryptPing skipped because our public IP is unknown for server ") + ping_server->GetListName()); + } + + ping_server->SetCryptPingReplyPending(false); + + CPacket* packet = new CPacket(OP_GLOBSERVSTATREQ, 4, OP_EDONKEYPROT); + uint32 challenge = 0x55AA0000 + (uint16)rand(); + ping_server->SetChallenge(challenge); + packet->CopyUInt32ToDataBuffer(challenge); + ping_server->SetLastPinged(tNow); + ping_server->SetLastPingedTime(tNow - (rand() % HR2S(1))); + ping_server->AddFailedCount(); + Notify_ServerRefresh(ping_server); + theStats::AddUpOverheadServer(packet->GetPacketSize()); + theApp->serverconnect->SendUDPPacket(packet, ping_server, true); + } else { + wxASSERT( false ); + } + } +} + + +void CServerList::RemoveServer(CServer* in_server) +{ + if (in_server == theApp->serverconnect->GetCurrentServer()) { + theApp->ShowAlert(_("You are connected to the server you are trying to delete. please disconnect first."), _("Info"), wxOK); + } else { + CInternalList::iterator it = std::find(m_servers.begin(), m_servers.end(), in_server); + if ( it != m_servers.end() ) { + if (theApp->downloadqueue->GetUDPServer() == in_server) { + theApp->downloadqueue->SetUDPServer( 0 ); + } + + NotifyObservers( EventType( EventType::REMOVED, in_server ) ); + + if (m_serverpos == it) { + ++m_serverpos; + } + if (m_statserverpos == it) { + ++m_statserverpos; + } + m_servers.erase(it); + theStats::DeleteServer(); + + Notify_ServerRemove(in_server); + delete in_server; + } + } +} + + +void CServerList::RemoveAllServers() +{ + NotifyObservers( EventType( EventType::CLEARED ) ); + + theStats::DeleteAllServers(); + // no connection, safely remove all servers + while ( !m_servers.empty() ) { + delete m_servers.back(); + m_servers.pop_back(); + } + m_serverpos = m_servers.end(); + m_statserverpos = m_servers.end(); +} + + +void CServerList::GetStatus(uint32 &failed, uint32 &user, uint32 &file, uint32 &tuser, uint32 &tfile,float &occ) +{ + failed = 0; + user = 0; + file = 0; + tuser=0; + tfile = 0; + occ=0; + uint32 maxusers=0; + uint32 tuserk = 0; + + for (CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it) { + const CServer* const curr = *it; + if( curr->GetFailedCount() ) { + ++failed; + } else { + user += curr->GetUsers(); + file += curr->GetFiles(); + } + tuser += curr->GetUsers(); + tfile += curr->GetFiles(); + + if (curr->GetMaxUsers()) { + tuserk += curr->GetUsers(); // total users on servers with known maximum + maxusers+=curr->GetMaxUsers(); + } + } + if (maxusers>0) { + occ=(float)(tuserk*100)/maxusers; + } +} + + +void CServerList::GetUserFileStatus(uint32 &user, uint32 &file) +{ + user = 0; + file = 0; + for (CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it) { + const CServer* const curr = *it; + if( !curr->GetFailedCount() ) { + user += curr->GetUsers(); + file += curr->GetFiles(); + } + } +} + + +CServerList::~CServerList() +{ + SaveServerMet(); + while ( !m_servers.empty() ) { + delete m_servers.back(); + m_servers.pop_back(); + } +} + + +void CServerList::LoadStaticServers( const wxString& filename ) +{ + if ( !CPath::FileExists( filename ) ) { + return; + } + + wxFileInputStream stream( filename ); + wxTextInputStream f(stream); + + while ( !stream.Eof() ) { + wxString line = f.ReadLine(); + + // Skip comments + if ( line.GetChar(0) == '#' || line.GetChar(0) == '/') { + continue; + } + + wxStringTokenizer tokens( line, wxT(",") ); + + if ( tokens.CountTokens() != 3 ) { + continue; + } + + + // format is host:port,priority,Name + wxString addy = tokens.GetNextToken().Strip( wxString::both ); + wxString prio = tokens.GetNextToken().Strip( wxString::both ); + wxString name = tokens.GetNextToken().Strip( wxString::both ); + + wxString host = addy.BeforeFirst( wxT(':') ); + wxString port = addy.AfterFirst( wxT(':') ); + + + int priority = StrToLong( prio ); + if (priority < SRV_PR_MIN || priority > SRV_PR_MAX) { + priority = SRV_PR_NORMAL; + } + + + // We need a valid name for the list + if ( name.IsEmpty() ) { + name = addy; + } + + + // create server object and add it to the list + CServer* server = new CServer( StrToLong( port ), host ); + + server->SetListName( name ); + server->SetIsStaticMember( true ); + server->SetPreference( priority ); + + + // Try to add the server to the list + if ( !theApp->AddServer( server ) ) { + delete server; + CServer* existing = GetServerByAddress( host, StrToULong( port ) ); + if ( existing) { + existing->SetListName( name ); + existing->SetIsStaticMember( true ); + existing->SetPreference( priority ); + + Notify_ServerRefresh( existing ); + } + } + } +} + + +struct ServerPriorityComparator { + // Return true iff lhs should strictly appear earlier in the list than rhs. + // In this case, we want higher priority servers to appear earlier. + bool operator()(const CServer* lhs, const CServer* rhs) { + wxASSERT + ( + rhs->GetPreferences() == SRV_PR_LOW || + rhs->GetPreferences() == SRV_PR_NORMAL || + rhs->GetPreferences() == SRV_PR_HIGH + ); + switch (lhs->GetPreferences()) { + case SRV_PR_LOW: + return false; + case SRV_PR_NORMAL: + return rhs->GetPreferences() == SRV_PR_LOW; + case SRV_PR_HIGH: + return rhs->GetPreferences() != SRV_PR_HIGH; + default: + wxASSERT(0); + return false; + } + } +}; + +void CServerList::Sort() +{ + m_servers.sort(ServerPriorityComparator()); + // Once the list has been sorted, it doesn't really make sense to continue + // traversing the new order from the old position. Plus, there's a bug in + // version of libstdc++ before gcc4 such that iterators that were equal to + // end() were left dangling. + m_serverpos = m_servers.begin(); + m_statserverpos = m_servers.begin(); +} + + +CServer* CServerList::GetNextServer(bool bOnlyObfuscated) +{ + while (bOnlyObfuscated && (m_serverpos != m_servers.end()) && !((*m_serverpos)->SupportsObfuscationTCP() || (*m_serverpos)->SupportsObfuscationUDP())) { + wxASSERT(*m_serverpos != NULL); + ++m_serverpos; + } + + if (m_serverpos == m_servers.end()) { + return 0; + } else { + if (*m_serverpos) { + return *m_serverpos++; + } else { + return 0; + } + } +} + + +CServer* CServerList::GetNextStatServer() +{ + if (m_statserverpos == m_servers.end()) { + m_statserverpos = m_servers.begin(); + } + + if (m_statserverpos == m_servers.end()) { + return 0; + } else { + wxASSERT(*m_statserverpos != NULL); + return *m_statserverpos++; + } +} + + +CServer* CServerList::GetServerByAddress(const wxString& address, uint16 port) const +{ + for (CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it) { + CServer* const s = *it; + if (port == s->GetPort() && s->GetAddress() == address) { + return s; + } + } + return NULL; +} + + +CServer* CServerList::GetServerByIP(uint32 nIP) const +{ + for (CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it){ + CServer* const s = *it; + if (s->GetIP() == nIP) + return s; + } + return NULL; +} + + +CServer* CServerList::GetServerByIPTCP(uint32 nIP, uint16 nPort) const +{ + for (CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it){ + CServer* const s = *it; + if (s->GetIP() == nIP && s->GetPort() == nPort) + return s; + } + return NULL; +} + +CServer* CServerList::GetServerByIPUDP(uint32 nIP, uint16 nUDPPort, bool bObfuscationPorts) const +{ + for (CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it){ + CServer* const s =*it; + if (s->GetIP() == nIP && (s->GetPort() == nUDPPort-4 || + (bObfuscationPorts && (s->GetObfuscationPortUDP() == nUDPPort) || (s->GetPort() == nUDPPort - 12)))) + return s; + } + return NULL; +} + +bool CServerList::SaveServerMet() +{ + CPath newservermet = CPath(theApp->ConfigDir + wxT("server.met.new")); + + CFile servermet( newservermet, CFile::write ); + if (!servermet.IsOpened()) { + AddLogLineM(false,_("Failed to save server.met!")); + return false; + } + + + try { + servermet.WriteUInt8(0xE0); + servermet.WriteUInt32( m_servers.size() ); + + for ( CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it) { + const CServer* const server = *it; + + uint16 tagcount = 12; + if (!server->GetListName().IsEmpty()) { + ++tagcount; + } + if (!server->GetDynIP().IsEmpty()) { + ++tagcount; + } + if (!server->GetDescription().IsEmpty()) { + ++tagcount; + } + if (server->GetConnPort() != server->GetPort()) { + ++tagcount; + } + + // For unicoded name, description, and dynip + if ( !server->GetListName().IsEmpty() ) { + ++tagcount; + } + if ( !server->GetDynIP().IsEmpty() ) { + ++tagcount; + } + if ( !server->GetDescription().IsEmpty() ) { + ++tagcount; + } + if (!server->GetVersion().IsEmpty()) { + ++tagcount; + } + + if (server->GetServerKeyUDP(true)) { + ++tagcount; + } + + if (server->GetServerKeyUDPIP()) { + ++tagcount; + } + + if (server->GetObfuscationPortTCP()) { + ++tagcount; + } + + if (server->GetObfuscationPortUDP()) { + ++tagcount; + } + + servermet.WriteUInt32(server->GetIP()); + servermet.WriteUInt16(server->GetPort()); + servermet.WriteUInt32(tagcount); + + if ( !server->GetListName().IsEmpty() ) { + // This is BOM to keep eMule compatibility + CTagString( ST_SERVERNAME, server->GetListName()).WriteTagToFile( &servermet, utf8strOptBOM); + CTagString( ST_SERVERNAME, server->GetListName()).WriteTagToFile( &servermet ); + } + + if ( !server->GetDynIP().IsEmpty() ) { + // This is BOM to keep eMule compatibility + CTagString( ST_DYNIP, server->GetDynIP()).WriteTagToFile( &servermet, utf8strOptBOM ); + CTagString( ST_DYNIP, server->GetDynIP()).WriteTagToFile( &servermet ); + } + + if ( !server->GetDescription().IsEmpty() ) { + // This is BOM to keep eMule compatibility + CTagString( ST_DESCRIPTION, server->GetDescription()).WriteTagToFile( &servermet, utf8strOptBOM ); + CTagString( ST_DESCRIPTION, server->GetDescription()).WriteTagToFile( &servermet ); + } + + if ( server->GetConnPort() != server->GetPort() ) { + CTagString( ST_AUXPORTSLIST, server->GetAuxPortsList() ).WriteTagToFile( &servermet ); + } + + CTagInt32( ST_FAIL, server->GetFailedCount() ).WriteTagToFile( &servermet ); + CTagInt32( ST_PREFERENCE, server->GetPreferences() ).WriteTagToFile( &servermet ); + CTagInt32( wxT("users"), server->GetUsers() ).WriteTagToFile( &servermet ); + CTagInt32( wxT("files"), server->GetFiles() ).WriteTagToFile( &servermet ); + CTagInt32( ST_PING, server->GetPing() ).WriteTagToFile( &servermet ); + CTagInt32( ST_LASTPING, server->GetLastPingedTime()).WriteTagToFile( &servermet ); + CTagInt32( ST_MAXUSERS, server->GetMaxUsers() ).WriteTagToFile( &servermet ); + CTagInt32( ST_SOFTFILES, server->GetSoftFiles() ).WriteTagToFile( &servermet ); + CTagInt32( ST_HARDFILES, server->GetHardFiles() ).WriteTagToFile( &servermet ); + if (!server->GetVersion().IsEmpty()){ + CTagString( ST_VERSION, server->GetVersion() ).WriteTagToFile( &servermet, utf8strOptBOM ); + CTagString( ST_VERSION, server->GetVersion() ).WriteTagToFile( &servermet ); + } + CTagInt32( ST_UDPFLAGS, server->GetUDPFlags() ).WriteTagToFile( &servermet ); + CTagInt32( ST_LOWIDUSERS, server->GetLowIDUsers() ).WriteTagToFile( &servermet ); + + if (server->GetServerKeyUDP(true)) { + CTagInt32(ST_UDPKEY, server->GetServerKeyUDP(true)).WriteTagToFile( &servermet );; + } + + if (server->GetServerKeyUDPIP()) { + CTagInt32(ST_UDPKEYIP, server->GetServerKeyUDPIP()).WriteTagToFile( &servermet );;; + } + + if (server->GetObfuscationPortTCP()) { + CTagInt16(ST_TCPPORTOBFUSCATION, server->GetObfuscationPortTCP()).WriteTagToFile( &servermet );;; + } + + if (server->GetObfuscationPortUDP()) { + CTagInt16(ST_UDPPORTOBFUSCATION, server->GetObfuscationPortUDP()).WriteTagToFile( &servermet );;; + } + + } + } catch (const CIOFailureException& e) { + AddLogLineM(true, wxT("IO failure while writing 'server.met': ") + e.what()); + return false; + } + + servermet.Close(); + const CPath curservermet = CPath(theApp->ConfigDir + wxT("server.met")); + const CPath oldservermet = CPath(theApp->ConfigDir + wxT("server_met.old")); + + if (oldservermet.FileExists()) { + CPath::RemoveFile(oldservermet); + } + + if (curservermet.FileExists()) { + CPath::RenameFile(curservermet, oldservermet); + } + + CPath::RenameFile(newservermet, curservermet); + + return true; +} + + +void CServerList::RemoveDeadServers() +{ + if ( thePrefs::DeadServer() ) { + for ( CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ) { + CServer* server = *it++; + if ( server->GetFailedCount() > thePrefs::GetDeadserverRetries() && !server->IsStaticMember()) { + RemoveServer(server); + } + } + } +} + +void CServerList::UpdateServerMetFromURL(const wxString& strURL) +{ + if (strURL.Find(wxT("://")) == -1) { + AddLogLineM(true, _("Invalid URL")); + return; + } + URLUpdate = strURL; + wxString strTempFilename(theApp->ConfigDir + wxT("server.met.download")); + CHTTPDownloadThread *downloader = new CHTTPDownloadThread(strURL,strTempFilename, HTTP_ServerMet); + downloader->Create(); + downloader->Run(); +} + + +void CServerList::DownloadFinished(uint32 result) +{ + if(result == 1) { + const CPath tempFilename = CPath(theApp->ConfigDir + wxT("server.met.download")); + + // curl succeeded. proceed with server.met loading + LoadServerMet(tempFilename); + SaveServerMet(); + + // So, file is loaded and merged, and also saved + CPath::RemoveFile(tempFilename); + AddLogLineM(true, CFormat( + _("Finished to download the server list from %s")) % URLUpdate); + } else { + AddLogLineM(true, CFormat( _("Failed to download the server list from %s") ) % URLUpdate); + } +} + + +void CServerList::AutoUpdate() +{ + + uint8 url_count = theApp->glob_prefs->adresses_list.GetCount(); + + if (!url_count) { + AddLogLineM(true, _("No serverlist address entry in 'addresses.dat' found. Please paste a valid serverlist address into this file in order to auto-update your serverlist")); + return; + } + // Do current URL. Callback function will take care of the others. + while ( current_url_index < url_count ) { + wxString URI = theApp->glob_prefs->adresses_list[current_url_index]; + // We use wxURL to validate the URI + if ( wxURL( URI ).GetError() == wxURL_NOERR ) { + // Ok, got a valid URI + URLAutoUpdate = URI; + wxString strTempFilename = + theApp->ConfigDir + wxT("server_auto.met"); + AddLogLineM(true, CFormat( + _("Start downloading server list from %s")) % URI); + CHTTPDownloadThread *downloader = new CHTTPDownloadThread( + URI, strTempFilename, HTTP_ServerMetAuto); + downloader->Create(); + downloader->Run(); + + return; + } else { + AddLogLineM(true, CFormat( + _("Warning, invalid URL specified for auto-updating of servers: %s") ) % URI); + } + current_url_index++; + } + AddLogLineM(true, _("No valid server.met auto-download url on addresses.dat")); +} + + +void CServerList::AutoDownloadFinished(uint32 result) +{ + + if (result == 1) { + CPath tempFilename = CPath(theApp->ConfigDir + wxT("server_auto.met")); + + // curl succeeded. proceed with server.met loading + LoadServerMet(tempFilename); + SaveServerMet(); + + // So, file is loaded and merged, and also saved + CPath::RemoveFile(tempFilename); + } else { + AddLogLineM(true, CFormat(_("Failed to download the server list from %s") ) % URLUpdate); + } + + ++current_url_index; + + + if (current_url_index < theApp->glob_prefs->adresses_list.GetCount()) { + // Next! + AutoUpdate(); + } + +} + + +void CServerList::ObserverAdded( ObserverType* o ) +{ + CObservableQueue::ObserverAdded( o ); + + EventType::ValueList ilist; + ilist.reserve( m_servers.size() ); + ilist.assign( m_servers.begin(), m_servers.end() ); + + NotifyObservers( EventType( EventType::INITIAL, &ilist ), o ); +} + + +uint32 CServerList::GetAvgFile() const +{ + //Since there is no real way to know how many files are in the kad network, + //I figure to try to use the ED2K network stats to find how many files the + //average user shares.. + uint32 totaluser = 0; + uint32 totalfile = 0; + for (CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it){ + const CServer* const curr = *it; + //If this server has reported Users/Files and doesn't limit it's files too much + //use this in the calculation.. + if( curr->GetUsers() && curr->GetFiles() && curr->GetSoftFiles() > 1000 ) { + totaluser += curr->GetUsers(); + totalfile += curr->GetFiles(); + } + } + //If the user count is a little low, don't send back a average.. + //I added 50 to the count as many servers do not allow a large amount of files to be shared.. + //Therefore the estimate here will be lower then the actual. + //I would love to add a way for the client to send some statistics back so we could see the real + //values here.. + if ( totaluser > 500000 ) { + return (totalfile/totaluser)+50; + } else { + return 0; + } +} + + +std::vector CServerList::CopySnapshot() const +{ + std::vector result; + result.reserve(m_servers.size()); + result.assign(m_servers.begin(), m_servers.end()); + return result; +} + + +void CServerList::FilterServers() +{ + CInternalList::iterator it = m_servers.begin(); + while (it != m_servers.end()) { + CServer* server = *it++; + + if (server->HasDynIP()) { + continue; + } + + if (theApp->ipfilter->IsFiltered(server->GetIP(), true)) { + if (server == theApp->serverconnect->GetCurrentServer()) { + AddLogLineM(true, _("Local server is filtered by the IPFilters, reconnecting to a different server!")); + theApp->serverconnect->Disconnect(); + RemoveServer(server); + theApp->serverconnect->ConnectToAnyServer(); + } else { + RemoveServer(server); + } + } + } +} + +void CServerList::CheckForExpiredUDPKeys() { + + if (!thePrefs::IsServerCryptLayerUDPEnabled()) { + return; + } + + uint32 cKeysTotal = 0; + uint32 cKeysExpired = 0; + uint32 cPingDelayed = 0; + const uint32 dwIP = theApp->GetPublicIP(); + const uint32 tNow = ::GetTickCount(); + wxASSERT( dwIP != 0 ); + + for (CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it) { + CServer* pServer = *it; + if (pServer->SupportsObfuscationUDP() && pServer->GetServerKeyUDP(true) != 0 && pServer->GetServerKeyUDPIP() != dwIP){ + cKeysTotal++; + cKeysExpired++; + if (tNow - pServer->GetRealLastPingedTime() < UDPSERVSTATMINREASKTIME){ + cPingDelayed++; + // next ping: Now + (MinimumDelay - already elapsed time) + pServer->SetLastPingedTime((tNow - (uint32)UDPSERVSTATREASKTIME) + (UDPSERVSTATMINREASKTIME - (tNow - pServer->GetRealLastPingedTime()))); + } else { + pServer->SetLastPingedTime(0); + } + } else if (pServer->SupportsObfuscationUDP() && pServer->GetServerKeyUDP(false) != 0) { + cKeysTotal++; + } + } +} +// File_checked_for_headers diff --git a/src/ServerList.h b/src/ServerList.h new file mode 100644 index 00000000..45390b6a --- /dev/null +++ b/src/ServerList.h @@ -0,0 +1,90 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef SERVERLIST_H +#define SERVERLIST_H + +#include "ObservableQueue.h" + +class CServer; +class CPacket; + +class CServerList : public CObservableQueue +{ + friend class CServerListCtrl; + +public: + CServerList(); + ~CServerList(); + bool Init(); + bool AddServer(CServer* in_server, bool fromUser = false); + void RemoveServer(CServer* in_server); + void RemoveAllServers(); + void RemoveDeadServers(); + bool LoadServerMet(const CPath& path); + bool SaveServerMet(); + void ServerStats(); + void ResetServerPos() {m_serverpos = m_servers.begin();} + CServer* GetNextServer(bool bOnlyObfuscated = false); + uint32 GetServerCount() {return m_servers.size();} + CServer* GetServerByAddress(const wxString& address, uint16 port) const; + CServer* GetServerByIP(uint32 nIP) const; + CServer* GetServerByIPTCP(uint32 nIP, uint16 nPort) const; + CServer* GetServerByIPUDP(uint32 nIP, uint16 nUDPPort, bool bObfuscationPorts = true) const; + void GetStatus(uint32 &failed, uint32 &user, uint32 &file, uint32 &tuser, uint32 &tfile, float &occ); + void GetUserFileStatus( uint32 &user, uint32 &file); + void Sort(); + void UpdateServerMetFromURL(const wxString& strURL); + void DownloadFinished(uint32 result); + void AutoDownloadFinished(uint32 result); + uint32 GetAvgFile() const; + + std::vector CopySnapshot() const; + + /** Refilters all servers though the IPFilter. */ + void FilterServers(); + + void CheckForExpiredUDPKeys(); + +private: + virtual void ObserverAdded( ObserverType* ); + void AutoUpdate(); + CServer* GetNextStatServer(); + + void LoadStaticServers( const wxString& filename ); + uint8 current_url_index; + + typedef std::list CInternalList; + CInternalList m_servers; + CInternalList::const_iterator m_serverpos; + CInternalList::const_iterator m_statserverpos; + + uint32 m_nLastED2KServerLinkCheck;// emanuelw(20030924) added + wxString URLUpdate; + wxString URLAutoUpdate; +}; + +#endif // SERVERLIST_H +// File_checked_for_headers diff --git a/src/ServerListCtrl.cpp b/src/ServerListCtrl.cpp new file mode 100644 index 00000000..a913fcc8 --- /dev/null +++ b/src/ServerListCtrl.cpp @@ -0,0 +1,667 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "ServerListCtrl.h" // Interface declarations + +#include + +#include +#include +#include +#include + +#include "amule.h" // Needed for theApp +#include "DownloadQueue.h" // Needed for CDownloadQueue +#ifdef ENABLE_IP2COUNTRY + #include "IP2Country.h" // Needed for IP2Country + #include "amuleDlg.h" // Needed for IP2Country +#endif +#include "ServerList.h" // Needed for CServerList +#include "ServerConnect.h" // Needed for CServerConnect +#include "Server.h" // Needed for CServer and SRV_PR_* +#include "Logger.h" +#include // Needed for CFormat +#include // Needed for CTextFile + + +#define SYSCOLOR(x) (wxSystemSettings::GetColour(x)) + + +BEGIN_EVENT_TABLE(CServerListCtrl,CMuleListCtrl) + EVT_LIST_ITEM_RIGHT_CLICK( -1, CServerListCtrl::OnItemRightClicked) + EVT_LIST_ITEM_ACTIVATED( -1, CServerListCtrl::OnItemActivated ) + + EVT_MENU( MP_PRIOLOW, CServerListCtrl::OnPriorityChange ) + EVT_MENU( MP_PRIONORMAL, CServerListCtrl::OnPriorityChange ) + EVT_MENU( MP_PRIOHIGH, CServerListCtrl::OnPriorityChange ) + + EVT_MENU( MP_ADDTOSTATIC, CServerListCtrl::OnStaticChange ) + EVT_MENU( MP_REMOVEFROMSTATIC, CServerListCtrl::OnStaticChange ) + + EVT_MENU( MP_CONNECTTO, CServerListCtrl::OnConnectToServer ) + + EVT_MENU( MP_REMOVE, CServerListCtrl::OnRemoveServers ) + EVT_MENU( MP_REMOVEALL, CServerListCtrl::OnRemoveServers ) + + EVT_MENU( MP_GETED2KLINK, CServerListCtrl::OnGetED2kURL ) + + EVT_CHAR( CServerListCtrl::OnKeyPressed ) +END_EVENT_TABLE() + + + +CServerListCtrl::CServerListCtrl( wxWindow *parent, wxWindowID winid, const wxPoint& pos, const wxSize& size, + long style, const wxValidator& validator, const wxString& name ) + : CMuleListCtrl( parent, winid, pos, size, style, validator, name ) +{ + // Setting the sorter function. + SetSortFunc( SortProc ); + + // Set the table-name (for loading and saving preferences). + SetTableName( wxT("Server") ); + + m_connected = 0; + + InsertColumn( COLUMN_SERVER_NAME, _("Server Name"), wxLIST_FORMAT_LEFT, 150); + InsertColumn( COLUMN_SERVER_ADDR, _("Address"), wxLIST_FORMAT_LEFT, 140); + InsertColumn( COLUMN_SERVER_PORT, _("Port"), wxLIST_FORMAT_LEFT, 25); + InsertColumn( COLUMN_SERVER_DESC, _("Description"), wxLIST_FORMAT_LEFT, 150); + InsertColumn( COLUMN_SERVER_PING, _("Ping"), wxLIST_FORMAT_LEFT, 25); + InsertColumn( COLUMN_SERVER_USERS, _("Users"), wxLIST_FORMAT_LEFT, 40); + InsertColumn( COLUMN_SERVER_FILES, _("Files"), wxLIST_FORMAT_LEFT, 45); + InsertColumn( COLUMN_SERVER_PRIO, _("Priority"), wxLIST_FORMAT_LEFT, 60); + InsertColumn( COLUMN_SERVER_FAILS, _("Failed"), wxLIST_FORMAT_LEFT, 40); + InsertColumn( COLUMN_SERVER_STATIC, _("Static"), wxLIST_FORMAT_LEFT, 40); + InsertColumn( COLUMN_SERVER_VERSION, _("Version"), wxLIST_FORMAT_LEFT, 80); + #ifdef __DEBUG__ + InsertColumn( COLUMN_SERVER_TCPFLAGS, wxT("TCP Flags"), wxLIST_FORMAT_LEFT, 80); + InsertColumn( COLUMN_SERVER_UDPFLAGS, wxT("UDP Flags"), wxLIST_FORMAT_LEFT, 80); + #endif + + + LoadSettings(); +} + + +CServerListCtrl::~CServerListCtrl() +{ + +} + + +void CServerListCtrl::AddServer( CServer* toadd ) +{ + // RefreshServer will add the server. + // This also means that we have simple duplicity checking. ;) + RefreshServer( toadd ); + + ShowServerCount(); +} + + +void CServerListCtrl::RemoveServer(CServer* server) +{ + long result = FindItem(-1, reinterpret_cast(server)); + if ( result != -1 ) { + DeleteItem(result); + ShowServerCount(); + } +} + + +void CServerListCtrl::RemoveAllServers(int state) +{ + int pos = GetNextItem( -1, wxLIST_NEXT_ALL, state); + bool connected = theApp->IsConnectedED2K() || + theApp->serverconnect->IsConnecting(); + + while ( pos != -1 ) { + CServer* server = (CServer*)GetItemData(pos); + + if (reinterpret_cast(server) == m_connected && connected) { + wxMessageBox(_("You are connected to a server you are trying to delete. Please disconnect first. The server was NOT deleted."), _("Info"), wxOK, this); + ++pos; + } else if (server->IsStaticMember()) { + const wxString name = (!server->GetListName() ? wxString(_("(Unknown name)")) : server->GetListName()); + + if (wxMessageBox(CFormat(_("Are you sure you want to delete the static server %s")) % name, _("Cancel"), wxICON_QUESTION | wxYES_NO, this) == wxYES) { + SetStaticServer(server, false); + DeleteItem( pos ); + theApp->serverlist->RemoveServer( server ); + } else { + ++pos; + } + } else { + DeleteItem( pos ); + theApp->serverlist->RemoveServer( server ); + } + + pos = GetNextItem(pos - 1, wxLIST_NEXT_ALL, state); + } + + ShowServerCount(); +} + + +void CServerListCtrl::RefreshServer( CServer* server ) +{ + // Cant really refresh a NULL server + if (!server) { + return; + } + + wxUIntPtr ptr = reinterpret_cast(server); + long itemnr = FindItem( -1, ptr ); + if ( itemnr == -1 ) { + // We are not at the sure that the server isn't in the list, so we can re-add + itemnr = InsertItem( GetInsertPos( ptr ), server->GetListName() ); + SetItemPtrData( itemnr, ptr ); + + wxListItem item; + item.SetId( itemnr ); + item.SetBackgroundColour(SYSCOLOR(wxSYS_COLOUR_LISTBOX)); + SetItem( item ); + } + + wxString serverName; +#ifdef ENABLE_IP2COUNTRY + // Get the country name + const CountryData& countrydata = theApp->amuledlg->m_IP2Country->GetCountryData(server->GetFullIP()); + serverName << countrydata.Name; + serverName << wxT(" - "); +#endif // ENABLE_IP2COUNTRY + serverName << server->GetListName(); + SetItem(itemnr, COLUMN_SERVER_NAME, serverName); + SetItem(itemnr, COLUMN_SERVER_ADDR, server->GetAddress()); + if (server->GetAuxPortsList().IsEmpty()) { + SetItem( itemnr, COLUMN_SERVER_PORT, + wxString::Format(wxT("%u"), server->GetPort())); + } else { + SetItem( itemnr, COLUMN_SERVER_PORT, + wxString::Format(wxT("%u ("), + server->GetPort()) + server->GetAuxPortsList() + wxT(")") ); + } + SetItem( itemnr, COLUMN_SERVER_DESC, server->GetDescription() ); + + if ( server->GetPing() ) { + SetItem( itemnr, COLUMN_SERVER_PING, + CastSecondsToHM(server->GetPing()/1000, server->GetPing() % 1000 ) ); + } else { + SetItem( itemnr, COLUMN_SERVER_PING, wxEmptyString ); + } + + if ( server->GetUsers() ) { + SetItem( itemnr, COLUMN_SERVER_USERS, + wxString::Format( wxT("%u"), server->GetUsers() ) ); + } else { + SetItem( itemnr, COLUMN_SERVER_USERS, wxEmptyString ); + } + + if ( server->GetFiles() ) { + SetItem( itemnr, COLUMN_SERVER_FILES, + wxString::Format( wxT("%u"), server->GetFiles() ) ); + } else { + SetItem( itemnr, COLUMN_SERVER_FILES, wxEmptyString ); + } + + switch ( server->GetPreferences() ) { + case SRV_PR_LOW: SetItem(itemnr, COLUMN_SERVER_PRIO, _("Low")); break; + case SRV_PR_NORMAL: SetItem(itemnr, COLUMN_SERVER_PRIO, _("Normal")); break; + case SRV_PR_HIGH: SetItem(itemnr, COLUMN_SERVER_PRIO, _("High") ); break; + default: SetItem(itemnr, COLUMN_SERVER_PRIO, wxT("---")); // this should never happen + } + + SetItem( itemnr, COLUMN_SERVER_FAILS, wxString::Format( wxT("%u"),server->GetFailedCount() ) ); + SetItem( itemnr, COLUMN_SERVER_STATIC, ( server->IsStaticMember() ? _("Yes") : _("No") ) ); + SetItem( itemnr, COLUMN_SERVER_VERSION, server->GetVersion() ); + + #ifdef __DEBUG__ + wxString flags; + /* TCP */ + if (server->GetTCPFlags() & SRV_TCPFLG_COMPRESSION) { + flags += wxT("c"); + } + if (server->GetTCPFlags() & SRV_TCPFLG_NEWTAGS) { + flags += wxT("n"); + } + if (server->GetTCPFlags() & SRV_TCPFLG_UNICODE) { + flags += wxT("u"); + } + if (server->GetTCPFlags() & SRV_TCPFLG_RELATEDSEARCH) { + flags += wxT("r"); + } + if (server->GetTCPFlags() & SRV_TCPFLG_TYPETAGINTEGER) { + flags += wxT("t"); + } + if (server->GetTCPFlags() & SRV_TCPFLG_LARGEFILES) { + flags += wxT("l"); + } + if (server->GetTCPFlags() & SRV_TCPFLG_TCPOBFUSCATION) { + flags += wxT("o"); + } + + SetItem( itemnr, COLUMN_SERVER_TCPFLAGS, flags ); + + /* UDP */ + flags = wxEmptyString; + if (server->GetUDPFlags() & SRV_UDPFLG_EXT_GETSOURCES) { + flags += wxT("g"); + } + if (server->GetUDPFlags() & SRV_UDPFLG_EXT_GETFILES) { + flags += wxT("f"); + } + if (server->GetUDPFlags() & SRV_UDPFLG_NEWTAGS) { + flags += wxT("n"); + } + if (server->GetUDPFlags() & SRV_UDPFLG_UNICODE) { + flags += wxT("u"); + } + if (server->GetUDPFlags() & SRV_UDPFLG_EXT_GETSOURCES2) { + flags += wxT("G"); + } + if (server->GetUDPFlags() & SRV_UDPFLG_LARGEFILES) { + flags += wxT("l"); + } + if (server->GetUDPFlags() & SRV_UDPFLG_UDPOBFUSCATION) { + flags += wxT("o"); + } + if (server->GetUDPFlags() & SRV_UDPFLG_TCPOBFUSCATION) { + flags += wxT("O"); + } + SetItem( itemnr, COLUMN_SERVER_UDPFLAGS, flags ); + + #endif + + // Deletions of items causes rather large ammount of flicker, so to + // avoid this, we resort the list to ensure correct ordering. + if (!IsItemSorted(itemnr)) { + SortList(); + } +} + + +void CServerListCtrl::HighlightServer( const CServer* server, bool highlight ) +{ + // Unset the old highlighted server if we are going to set a new one + if ( m_connected && highlight ) { + // A recursive call to do the real work. + HighlightServer( (CServer*)m_connected, false ); + + m_connected = 0; + } + + long itemnr = FindItem( -1, reinterpret_cast(server) ); + if ( itemnr > -1 ) { + wxListItem item; + item.SetId( itemnr ); + + if ( GetItem( item ) ) { + wxFont font = GetFont(); + + if ( highlight ) { + font.SetWeight( wxBOLD ); + + m_connected = reinterpret_cast(server); + } + + item.SetFont( font ); + + SetItem( item ); + } + } +} + +//#warning Kry TODO: Dude, this gotta be moved to core +bool CServerListCtrl::SetStaticServer( CServer* server, bool isStatic ) +{ + server->SetIsStaticMember( isStatic ); + RefreshServer( server ); + + wxString filename = theApp->ConfigDir + wxT("staticservers.dat"); + + CTextFile file; + if (!file.Open(filename, CTextFile::write)) { + AddLogLineM( false, CFormat( _("Failed to open '%s'") ) % filename ); + return false; + } + + for (int i = 0; i < GetItemCount(); ++i) { + server = reinterpret_cast(GetItemData(i)); + + if (server->IsStaticMember()) { + file.WriteLine(CFormat(wxT("%s:%u,%u,%s")) + % server->GetAddress() % server->GetPort() + % server->GetPreferences() % server->GetListName()); + } + } + + return true; +} + + +void CServerListCtrl::ShowServerCount() +{ + wxStaticText* label = CastByName( wxT("serverListLabel"), GetParent(), wxStaticText ); + + if ( label ) { + label->SetLabel( wxString::Format( _("Servers (%i)"), GetItemCount() ) ); + label->GetParent()->Layout(); + } +} + + +void CServerListCtrl::OnItemActivated( wxListEvent& event ) +{ + // Unselect all items but the activated one + long item = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + while ( item > -1 ) { + SetItemState( item, 0, wxLIST_STATE_SELECTED); + + item = GetNextItem( item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + } + + SetItemState( event.GetIndex(), wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED ); + + wxCommandEvent nulEvt; + OnConnectToServer( nulEvt ); +} + + +void CServerListCtrl::OnItemRightClicked(wxListEvent& event) +{ + // Check if clicked item is selected. If not, unselect all and select it. + long index = CheckSelection(event); + + bool enable_reconnect = false; + bool enable_static_on = false; + bool enable_static_off = false; + + // Gather information on the selected items + while ( index > -1 ) { + CServer* server = (CServer*)GetItemData( index ); + + // The current server is selected, so we might display the reconnect option + if ( reinterpret_cast(server) == m_connected ) + enable_reconnect = true; + + // We want to know which options should be enabled, either one or both + enable_static_on |= !server->IsStaticMember(); + enable_static_off |= server->IsStaticMember(); + + index = GetNextItem( index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + } + + + wxMenu* serverMenu = new wxMenu(_("Server")); + wxMenu* serverPrioMenu = new wxMenu(); + serverPrioMenu->Append( MP_PRIOLOW, _("Low") ); + serverPrioMenu->Append( MP_PRIONORMAL, _("Normal") ); + serverPrioMenu->Append( MP_PRIOHIGH, _("High") ); + serverMenu->Append( MP_CONNECTTO, _("Connect to server") ); + serverMenu->Append( 12345, _("Priority"), serverPrioMenu ); + + serverMenu->AppendSeparator(); + + if (GetSelectedItemCount() == 1) { + serverMenu->Append( MP_ADDTOSTATIC, _("Mark server as static") ); + serverMenu->Append( MP_REMOVEFROMSTATIC, _("Mark server as non-static") ); + } else { + serverMenu->Append( MP_ADDTOSTATIC, _("Mark servers as static") ); + serverMenu->Append( MP_REMOVEFROMSTATIC, _("Mark servers as non-static") ); + } + + serverMenu->AppendSeparator(); + + if (GetSelectedItemCount() == 1) { + serverMenu->Append( MP_REMOVE, _("Remove server") ); + } else { + serverMenu->Append( MP_REMOVE, _("Remove servers") ); + } + serverMenu->Append( MP_REMOVEALL, _("Remove all servers") ); + + serverMenu->AppendSeparator(); + + if (GetSelectedItemCount() == 1) { + serverMenu->Append( MP_GETED2KLINK, _("Copy ED2k link to clipboard") ); + } else { + serverMenu->Append( MP_GETED2KLINK, _("Copy ED2k links to clipboard") ); + } + + serverMenu->Enable( MP_REMOVEFROMSTATIC, enable_static_off ); + serverMenu->Enable( MP_ADDTOSTATIC, enable_static_on ); + + if ( GetSelectedItemCount() == 1 ) { + if ( enable_reconnect ) + serverMenu->SetLabel( MP_CONNECTTO, _("Reconnect to server") ); + } else { + serverMenu->Enable( MP_CONNECTTO, false ); + } + + + PopupMenu( serverMenu, event.GetPoint() ); +} + + +void CServerListCtrl::OnPriorityChange( wxCommandEvent& event ) +{ + int priority = 0; + + switch ( event.GetId() ) { + case MP_PRIOLOW: priority = SRV_PR_LOW; break; + case MP_PRIONORMAL: priority = SRV_PR_NORMAL; break; + case MP_PRIOHIGH: priority = SRV_PR_HIGH; break; + + default: + return; + } + + + ItemDataList items = GetSelectedItems(); + + for ( unsigned int i = 0; i < items.size(); ++i ) { + CServer* server = (CServer*)items[ i ]; + + server->SetPreference( priority ); + RefreshServer( server ); + } +} + + +void CServerListCtrl::OnStaticChange( wxCommandEvent& event ) +{ + bool isStatic = ( event.GetId() == MP_ADDTOSTATIC ); + + ItemDataList items = GetSelectedItems(); + + for ( unsigned int i = 0; i < items.size(); ++i ) { + CServer* server = (CServer*)items[ i ]; + + // Only update items that have the wrong setting + if ( server->IsStaticMember() != isStatic ) { + if ( !SetStaticServer( server, isStatic ) ) { + wxASSERT( false ); + + return; + } + + server->SetIsStaticMember( isStatic ); + RefreshServer( server ); + } + } +} + + +void CServerListCtrl::OnConnectToServer( wxCommandEvent& WXUNUSED(event) ) +{ + int item = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + + if ( item > -1 ) { + if ( theApp->IsConnectedED2K() ) { + theApp->serverconnect->Disconnect(); + } + + theApp->serverconnect->ConnectToServer( (CServer*)GetItemData( item ) ); + } +} + + +void CServerListCtrl::OnGetED2kURL( wxCommandEvent& WXUNUSED(event) ) +{ + int pos = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + + wxString URL; + + while ( pos != -1 ) { + CServer* server = (CServer*)GetItemData(pos); + + URL += wxT("ed2k://|server|") + server->GetFullIP() + wxString::Format(wxT("|%d|"), server->GetPort()) + wxT("/\n"); + + pos = GetNextItem( pos, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + } + + URL.RemoveLast(); + + theApp->CopyTextToClipboard( URL ); +} + + +void CServerListCtrl::OnRemoveServers( wxCommandEvent& event ) +{ + if ( event.GetId() == MP_REMOVEALL ) { + if ( GetItemCount() ) { + wxString question = _("Are you sure that you wish to delete all servers?"); + + if ( wxMessageBox( question, _("Cancel"), wxICON_QUESTION | wxYES_NO, this) == wxYES ) { + if ( theApp->serverconnect->IsConnecting() ) { + theApp->downloadqueue->StopUDPRequests(); + theApp->serverconnect->StopConnectionTry(); + theApp->serverconnect->Disconnect(); + } + + RemoveAllServers(wxLIST_STATE_DONTCARE); + } + } + } else if ( event.GetId() == MP_REMOVE ) { + if ( GetSelectedItemCount() ) { + wxString question; + if (GetSelectedItemCount() == 1) { + question = _("Are you sure that you wish to delete the selected server?"); + } else { + question = _("Are you sure that you wish to delete the selected servers?"); + } + + if ( wxMessageBox( question, _("Cancel"), wxICON_QUESTION | wxYES_NO, this) == wxYES ) { + RemoveAllServers(wxLIST_STATE_SELECTED); + } + } + } +} + + +void CServerListCtrl::OnKeyPressed( wxKeyEvent& event ) +{ + // Check if delete was pressed + if ((event.GetKeyCode() == WXK_DELETE) || (event.GetKeyCode() == WXK_NUMPAD_DELETE)) { + wxCommandEvent evt; + evt.SetId( MP_REMOVE ); + OnRemoveServers( evt ); + } else { + event.Skip(); + } +} + + +int CServerListCtrl::SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData) +{ + CServer* server1 = (CServer*)item1; + CServer* server2 = (CServer*)item2; + + int mode = (sortData & CMuleListCtrl::SORT_DES) ? -1 : 1; + + switch (sortData & CMuleListCtrl::COLUMN_MASK) { + // Sort by server-name + case COLUMN_SERVER_NAME: + return mode * server1->GetListName().CmpNoCase(server2->GetListName()); + + // Sort by address + case COLUMN_SERVER_ADDR: + { + if ( server1->HasDynIP() && server2->HasDynIP()) { + return mode * server1->GetDynIP().CmpNoCase( server2->GetDynIP() ); + } else if (server1->HasDynIP()) { + return mode * -1; + } else if (server2->HasDynIP()) { + return mode * 1; + } else { + uint32 a = wxUINT32_SWAP_ALWAYS(server1->GetIP()); + uint32 b = wxUINT32_SWAP_ALWAYS(server2->GetIP()); + return mode * CmpAny(a, b); + } + } + // Sort by port + case COLUMN_SERVER_PORT: return mode * CmpAny( server1->GetPort(), server2->GetPort() ); + // Sort by description + case COLUMN_SERVER_DESC: return mode * server1->GetDescription().CmpNoCase( server2->GetDescription() ); + // Sort by Ping + // The -1 ensures that a value of zero (no ping known) is sorted last. + case COLUMN_SERVER_PING: return mode * CmpAny( server1->GetPing() - 1, server2->GetPing() -1 ); + // Sort by user-count + case COLUMN_SERVER_USERS: return mode * CmpAny( server1->GetUsers(), server2->GetUsers() ); + // Sort by file-count + case COLUMN_SERVER_FILES: return mode * CmpAny( server1->GetFiles(), server2->GetFiles() ); + // Sort by priority + case COLUMN_SERVER_PRIO: + { + uint32 srv_pr1 = server1->GetPreferences(); + uint32 srv_pr2 = server2->GetPreferences(); + switch ( srv_pr1 ) { + case SRV_PR_HIGH: srv_pr1 = SRV_PR_MAX; break; + case SRV_PR_NORMAL: srv_pr1 = SRV_PR_MID; break; + case SRV_PR_LOW: srv_pr1 = SRV_PR_MIN; break; + default: return 0; + } + switch ( srv_pr2 ) { + case SRV_PR_HIGH: srv_pr2 = SRV_PR_MAX; break; + case SRV_PR_NORMAL: srv_pr2 = SRV_PR_MID; break; + case SRV_PR_LOW: srv_pr2 = SRV_PR_MIN; break; + default: return 0; + } + return mode * CmpAny( srv_pr1, srv_pr2 ); + } + // Sort by failure-count + case COLUMN_SERVER_FAILS: return mode * CmpAny( server1->GetFailedCount(), server2->GetFailedCount() ); + // Sort by static servers + case COLUMN_SERVER_STATIC: + { + return mode * CmpAny( server2->IsStaticMember(), server1->IsStaticMember() ); + } + // Sort by version + case COLUMN_SERVER_VERSION: return mode * FuzzyStrCmp(server1->GetVersion(), server2->GetVersion()); + + default: + return 0; + } +} +// File_checked_for_headers diff --git a/src/ServerListCtrl.h b/src/ServerListCtrl.h new file mode 100644 index 00000000..25e7a799 --- /dev/null +++ b/src/ServerListCtrl.h @@ -0,0 +1,204 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef SERVERLISTCTRL_H +#define SERVERLISTCTRL_H + +#include "MuleListCtrl.h" // Needed for CMuleListCtrl + +#define COLUMN_SERVER_NAME 0 +#define COLUMN_SERVER_ADDR 1 +#define COLUMN_SERVER_PORT 2 +#define COLUMN_SERVER_DESC 3 +#define COLUMN_SERVER_PING 4 +#define COLUMN_SERVER_USERS 5 +#define COLUMN_SERVER_FILES 6 +#define COLUMN_SERVER_PRIO 7 +#define COLUMN_SERVER_FAILS 8 +#define COLUMN_SERVER_STATIC 9 +#define COLUMN_SERVER_VERSION 10 +#define COLUMN_SERVER_TCPFLAGS 11 +#define COLUMN_SERVER_UDPFLAGS 12 + +class CServer; +class CServerList; +class wxListEvent; +class wxCommandEvent; + + +/** + * The CServerListCtrl is used to display the list of servers which the user + * can connect to and which we request sources from. It is a permanently sorted + * list in that it always ensure that the items are sorted in the correct order. + */ +class CServerListCtrl : public CMuleListCtrl +{ +public: + /** + * Constructor. + * + * @see CMuleListCtrl::CMuleListCtrl + */ + CServerListCtrl( + wxWindow *parent, + wxWindowID winid = -1, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxLC_ICON, + const wxValidator& validator = wxDefaultValidator, + const wxString &name = wxT("mulelistctrl") ); + + /** + * Destructor. + */ + virtual ~CServerListCtrl(); + + + /** + * Adds a server to the list. + * + * @param A pointer to the new server. + * + * Internally this function calls RefreshServer and ShowServerCount, with + * the result that it is legal to add servers already in the list, though + * not recommended. + */ + void AddServer( CServer* toadd ); + + /** + * Removes a server from the displayed list. + */ + void RemoveServer(CServer* server); + + /** + * Removes all servers with the specified state. + * + * @param state All items with this state will be removed, default being all. + */ + void RemoveAllServers(int state = wxLIST_STATE_DONTCARE); + + + /** + * Updates the displayed information on a server. + * + * @param server The server to be updated. + * + * This function will not only update the displayed information, it will also + * reposition the item should it be nescecarry to enforce the current sorting. + * Also note that this function does not require that the server actually is + * on the list already, since AddServer makes use of it, but this should + * generally be avoided, since it will result in the server-count getting + * skewed until the next AddServer call. + */ + void RefreshServer( CServer* server ); + + /** + * Sets the highlighting of the specified server. + * + * @param server The server to have its highlighting set. + * @param highlight The new highlighting state. + * + * Please note that only _one_ item is allowed to be highlighted at any + * one time, so calling this function while another item is already + * highlighted will result in the old item not being highlighted any more. + */ + void HighlightServer( const CServer* server, bool highlight ); + + /** + * Marks the specified server as static or not. + * + * @param The server to be marked or unmarked as static. + * @param The new static state. + * + * Other than setting the static setting of the specified server, it + * also adds or removes the server from the static-list file. + */ + bool SetStaticServer( CServer* server, bool isStatic ); + + + /** + * This function updates the server-count in the server-wnd. + */ + void ShowServerCount(); + +private: + + /** + * Event-handler for handling item activation (connect). + */ + void OnItemActivated( wxListEvent& event ); + + /** + * Event-handler for displaying the popup-menu. + */ + void OnItemRightClicked( wxListEvent& event ); + + /** + * Event-handler for priority changes. + */ + void OnPriorityChange( wxCommandEvent& event ); + + /** + * Event-handler for static changes. + */ + void OnStaticChange( wxCommandEvent& event ); + + /** + * Event-handler for server connections. + */ + void OnConnectToServer( wxCommandEvent& event ); + + /** + * Event-handler for copying server-urls to the clipboard. + */ + void OnGetED2kURL( wxCommandEvent& event ); + + /** + * Event-handler for server removal. + */ + void OnRemoveServers( wxCommandEvent& event ); + + /** + * Event-handler for deleting servers when the delete-key is pressed. + */ + void OnKeyPressed( wxKeyEvent& event ); + + /** + * Sorter function. + * + * @see wxListCtrl::SortItems + */ + static int wxCALLBACK SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData); + + + //! Used to keep track of the last high-lighted item. + wxUIntPtr m_connected; + + + DECLARE_EVENT_TABLE() +}; + +#endif +// File_checked_for_headers diff --git a/src/ServerSocket.cpp b/src/ServerSocket.cpp new file mode 100644 index 00000000..546f68ee --- /dev/null +++ b/src/ServerSocket.cpp @@ -0,0 +1,774 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "ServerSocket.h" // Interface declarations + +#include +#include +#include + +#include + +#include "Packet.h" // Needed for CPacket +#include "updownclient.h" // Needed for CUpDownClient +#include "ClientList.h" // Needed for CClientList +#include "MemFile.h" // Needed for CMemFile +#include "PartFile.h" // Needed for CPartFile +#include "SearchList.h" // Needed for CSearchList +#include "Preferences.h" // Needed for CPreferences +#include "DownloadQueue.h" // Needed for CDownloadQueue +#include "ServerList.h" // Needed for CServerList +#include "Server.h" // Needed for CServer +#include "amule.h" // Needed for theApp +#include "Statistics.h" // Needed for theStats +#include "AsyncDNS.h" // Needed for CAsyncDNS +#include "Logger.h" +#include +#include "IPFilter.h" +#include "GuiEvents.h" // Needed for Notify_* + + + +//------------------------------------------------------------------------------ +// CServerSocketHandler +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ +// CServerSocketHandler +//------------------------------------------------------------------------------ + + +class CServerSocketHandler: public wxEvtHandler +{ +public: + CServerSocketHandler() {}; + +public: +private: + void ServerSocketHandler(wxSocketEvent& event); + DECLARE_EVENT_TABLE() +}; + + +BEGIN_EVENT_TABLE(CServerSocketHandler, wxEvtHandler) + EVT_SOCKET(ID_SERVERSOCKET_EVENT, CServerSocketHandler::ServerSocketHandler) +END_EVENT_TABLE() + +void CServerSocketHandler::ServerSocketHandler(wxSocketEvent& event) +{ + CServerSocket *socket = dynamic_cast(event.GetSocket()); + wxASSERT(socket); + if (!socket) { + return; + } + + if (socket->OnDestroy()) { + return; + } + + switch(event.GetSocketEvent()) { + case wxSOCKET_CONNECTION: + socket->OnConnect(wxSOCKET_NOERROR); + break; + case wxSOCKET_LOST: + socket->OnError(socket->LastError()); + break; + case wxSOCKET_INPUT: + socket->OnReceive(wxSOCKET_NOERROR); + break; + case wxSOCKET_OUTPUT: + socket->OnSend(wxSOCKET_NOERROR); + break; + default: + wxASSERT(0); + break; + } + + +} + +// +// There can be only one. :) +// +static CServerSocketHandler g_serverSocketHandler; + + +//------------------------------------------------------------------------------ +// CServerSocket +//------------------------------------------------------------------------------ + +CServerSocket::CServerSocket(CServerConnect* in_serverconnect, const CProxyData *ProxyData) +: +CEMSocket(ProxyData) +{ + serverconnect = in_serverconnect; + connectionstate = 0; + cur_server = 0; + info.Clear(); + m_bIsDeleting = false; + + SetEventHandler(g_serverSocketHandler, ID_SERVERSOCKET_EVENT); + + SetNotify( + wxSOCKET_CONNECTION_FLAG | + wxSOCKET_INPUT_FLAG | + wxSOCKET_OUTPUT_FLAG | + wxSOCKET_LOST_FLAG); + Notify(true); + + m_dwLastTransmission = 0; + m_IsSolving = false; + m_bNoCrypt = false; +} + +CServerSocket::~CServerSocket() +{ + // remove event handler... + SetNotify(0); + Notify(FALSE); + + if (cur_server) { + delete cur_server; + } + cur_server = NULL; +} + + +void CServerSocket::OnConnect(wxSocketError nErrorCode) +{ + switch (nErrorCode) { + case wxSOCKET_NOERROR: + if (cur_server->HasDynIP()) { + amuleIPV4Address tmpaddr; + GetPeer(tmpaddr); + uint32 server_ip = StringIPtoUint32(tmpaddr.IPAddress()); + cur_server->SetID(server_ip); + // GetServerByAddress may return NULL, so we must test! + // This was the reason why amule would crash when trying to + // connect in wxWidgets 2.5.2 + CServer *pServer = theApp->serverlist->GetServerByAddress( + cur_server->GetAddress(), cur_server->GetPort()); + if (pServer) { + pServer->SetID(server_ip); + } else { + AddLogLineM(false,_("theApp->serverlist->GetServerByAddress() returned NULL")); + return; + } + } + SetConnectionState(CS_WAITFORLOGIN); + break; + + case wxSOCKET_INVADDR: + case wxSOCKET_NOHOST: + case wxSOCKET_INVPORT: + case wxSOCKET_TIMEDOUT: + m_bIsDeleting = true; + SetConnectionState(CS_SERVERDEAD); + serverconnect->DestroySocket(this); + return; + + case wxSOCKET_IOERR: + case wxSOCKET_MEMERR: + case wxSOCKET_INVOP: + default: + m_bIsDeleting = true; + SetConnectionState(CS_FATALERROR); + serverconnect->DestroySocket(this); + return; + + } + +} + +void CServerSocket::OnReceive(wxSocketError nErrorCode) +{ + if (connectionstate != CS_CONNECTED && !serverconnect->IsConnecting()) { + serverconnect->DestroySocket(this); + return; + } + CEMSocket::OnReceive((int)nErrorCode); + m_dwLastTransmission = GetTickCount(); +} + +bool CServerSocket::ProcessPacket(const byte* packet, uint32 size, int8 opcode) +{ + try { + AddDebugLogLineM( false, logServer, wxT("Processing Server Packet: ") ); + + switch(opcode) { + case OP_SERVERMESSAGE: { + /* Kry import of lugdunum 16.40 new features */ + AddDebugLogLineM( false, logServer, wxT("Server: OP_SERVERMESSAGE") ); + + theStats::AddDownOverheadServer(size); + char* buffer = new char[size-1]; + memcpy(buffer,&packet[2],size-2); + buffer[size-2] = 0; + + wxString strMessages(char2unicode(buffer)); + + delete[] buffer; + + // 16.40 servers do not send separate OP_SERVERMESSAGE packets for each line; + // instead of this they are sending all text lines with one OP_SERVERMESSAGE packet. + + wxStringTokenizer token(strMessages,wxT("\r\n"),wxTOKEN_DEFAULT ); + + while (token.HasMoreTokens()) { + wxString message = token.GetNextToken(); + + bool bOutputMessage = true; + if (message.StartsWith(wxT("server version"))) { + wxString strVer = message.Mid(15,64); // truncate string to avoid misuse by servers in showing ads + strVer.Trim(); + CServer* eserver = theApp->serverlist->GetServerByAddress(cur_server->GetAddress(),cur_server->GetPort()); + if (eserver) { + eserver->SetVersion(strVer); + Notify_ServerRefresh(eserver); + } + } else if (message.StartsWith(wxT("ERROR"))) { + CServer* pServer = theApp->serverlist->GetServerByAddress(cur_server->GetAddress(),cur_server->GetPort()); + wxString servername; + if (pServer) { + servername = pServer->GetListName(); + } else { + servername = _("Server"); + } + AddLogLineM(false, CFormat( _("Error: %s (%s) - %s") ) + % servername + % Uint32_16toStringIP_Port(cur_server->GetIP(), cur_server->GetPort()) + % message.Mid(5,message.Len()).Trim(wxT(" :"))); + bOutputMessage = false; + + } else if (message.StartsWith(wxT("WARNING"))) { + + CServer* pServer = theApp->serverlist->GetServerByAddress(cur_server->GetAddress(),cur_server->GetPort()); + wxString servername; + if (pServer) { + servername = pServer->GetListName(); + } else { + servername = _("Server"); + } + AddLogLineM(false, CFormat( _("Warning: %s (%s) - %s") ) + % servername + % Uint32_16toStringIP_Port(cur_server->GetIP(), cur_server->GetPort()) + % message.Mid(5,message.Len()).Trim(wxT(" :"))); + + bOutputMessage = false; + } + + if (message.Find(wxT("[emDynIP: ")) != (-1) && message.Find(wxT("]")) != (-1) && message.Find(wxT("[emDynIP: ")) < message.Find(wxT("]"))){ + wxString dynip = message.Mid(message.Find(wxT("[emDynIP: "))+10,message.Find(wxT("]")) - (message.Find(wxT("[emDynIP: "))+10)); + dynip.Trim(wxT(" ")); + if ( dynip.Length() && dynip.Length() < 51){ + CServer* eserver = theApp->serverlist->GetServerByAddress(cur_server->GetAddress(),cur_server->GetPort()); + if (eserver){ + eserver->SetDynIP(dynip); + cur_server->SetDynIP(dynip); + Notify_ServerRefresh(eserver); + } + } + } + + if (bOutputMessage) { + theApp->AddServerMessageLine(message); + } + } + break; + } + case OP_IDCHANGE: { + AddDebugLogLineM(false,logServer,wxT("Server: OP_IDCHANGE")); + + theStats::AddDownOverheadServer(size); + + if (size < 4 /* uint32 (ID)*/) { + throw wxString(wxT("Corrupt or invalid loginanswer from server received")); + } + + CMemFile data(packet, size); + + uint32 new_id = data.ReadUInt32(); + + // save TCP flags in 'cur_server' + wxASSERT(cur_server); + uint32 ConnPort = 0; + CServer* pServer = NULL; + if (cur_server) { + uint32 rport = cur_server->GetConnPort(); + pServer = theApp->serverlist->GetServerByAddress(cur_server->GetAddress(), rport); + if (size >= 4+4 /* uint32 (ID) + uint32 (TCP flags)*/) { + cur_server->SetTCPFlags(data.ReadUInt32()); + if (size >= 4+4+4 /* uint32 (ID) + uint32 (TCP flags) + uint32 (aux port) */) { + // aux port login : we should use the 'standard' port of this server to advertize to other clients + ConnPort = data.ReadUInt32(); + cur_server->SetPort(ConnPort); + if (cur_server->GetAuxPortsList().IsEmpty()) { + cur_server->SetAuxPortsList(wxString::Format(wxT("%u"), rport)); +// } else { +// cur_server->SetAuxPortsList(wxString::Format(wxT("%u"), rport) + wxT(",") + cur_server->GetAuxPortsList()); + } + } + } else { + cur_server->SetTCPFlags(0); + } + // copy TCP flags into the server in the server list + if (pServer) { + pServer->SetTCPFlags(cur_server->GetTCPFlags()); + if (ConnPort) { + pServer->SetPort(ConnPort); + if (pServer->GetAuxPortsList().IsEmpty()) { + pServer->SetAuxPortsList(wxString::Format(wxT("%u"), pServer->GetConnPort())); +// } else { +// pServer->SetAuxPortsList(wxString::Format(wxT("%u"), pServer->GetConnPort()) + wxT(",") + pServer->GetAuxPortsList()); + } + Notify_ServerRefresh(pServer); + Notify_ServerUpdateED2KInfo(); + } + } + } + + uint32 dwServerReportedIP = 0; + uint32 dwObfuscationTCPPort = 0; + if (size >= 4 + 4 + 4 + 4 + 4 /* All of the above + reported ip + obfuscation port */) { + dwServerReportedIP = data.ReadUInt32(); + if (::IsLowID(dwServerReportedIP)){ + wxASSERT( false ); + dwServerReportedIP = 0; + } + wxASSERT( dwServerReportedIP == new_id || ::IsLowID(new_id) ); + dwObfuscationTCPPort = data.ReadUInt32(); + if (cur_server != NULL && dwObfuscationTCPPort != 0) { + cur_server->SetObfuscationPortTCP((uint16)dwObfuscationTCPPort); + } + + if (pServer != NULL && dwObfuscationTCPPort != 0) { + pServer->SetObfuscationPortTCP((uint16)dwObfuscationTCPPort); + } + } + + if (new_id == 0) { + uint8 state = thePrefs::GetSmartIdState(); + if ( state > 0 ) { + state++; + if(state > 3) { + thePrefs::SetSmartIdState(0); + } else { + thePrefs::SetSmartIdState(state); + } + } + break; + } + if(thePrefs::GetSmartIdCheck()) { + if (!IsLowID(new_id)) { + thePrefs::SetSmartIdState(1); + } else { + uint8 state = thePrefs::GetSmartIdState(); + if ( state > 0 ) { + state++; + if(state > 3) { + thePrefs::SetSmartIdState(0); + } else { + thePrefs::SetSmartIdState(state); + } + break; + } + } + } + + // we need to know our client when sending our shared files (done indirectly on SetConnectionState) + + serverconnect->SetClientID(new_id); + + if (::IsLowID(new_id) && dwServerReportedIP != 0) { + theApp->SetPublicIP(dwServerReportedIP); + } + + if (connectionstate != CS_CONNECTED) { + AddDebugLogLineM(true,logServer,wxT("Connected")); + + SetConnectionState(CS_CONNECTED); + theApp->OnlineSig(); // Added By Bouc7 + } + + theApp->ShowConnectionState(); + + AddLogLineM(false, wxString::Format(_("New clientid is %u"),new_id)); + if (::IsLowID(new_id)) { + AddLogLineM(true, _("WARNING: You have received Low-ID!")); + AddLogLineM(false, _("\tMost likely this is because you're behind a firewall or router.")); + AddLogLineM(false, _("\tFor more information, please refer to http://wiki.amule.org")); + } + + theApp->downloadqueue->ResetLocalServerRequests(); + break; + } + case OP_SEARCHRESULT: { + AddDebugLogLineM(false,logServer,wxT("Server: OP_SEARCHRESULT")); + + theStats::AddDownOverheadServer(size); + CServer* cur_srv = (serverconnect) ? + serverconnect->GetCurrentServer() : NULL; + theApp->searchlist->ProcessSearchAnswer( + packet, + size, + true /*(cur_srv && cur_srv->GetUnicodeSupport())*/, + cur_srv ? cur_srv->GetIP() : 0, + cur_srv ? cur_srv->GetPort() : 0); + theApp->searchlist->LocalSearchEnd(); + break; + } + case OP_FOUNDSOURCES_OBFU: + case OP_FOUNDSOURCES: { + AddDebugLogLineM(false,logServer,wxString::Format(wxT("ServerMsg - OP_FoundSources; sources = %u"), (uint32)(byte)packet[16])); + theStats::AddDownOverheadServer(size); + CMemFile sources(packet,size); + CMD4Hash fileid = sources.ReadHash(); + if (CPartFile* file = theApp->downloadqueue->GetFileByID(fileid)) { + file->AddSources(sources, cur_server->GetIP(), cur_server->GetPort(), SF_LOCAL_SERVER, (opcode == OP_FOUNDSOURCES_OBFU)); + } else { + AddDebugLogLineM(true, logServer, wxT("Sources received for unknown file: ") + fileid.Encode()); + } + break; + } + case OP_SERVERSTATUS: { + AddDebugLogLineM(false,logServer,wxT("Server: OP_SERVERSTATUS")); + // FIXME some statuspackets have a different size -> why? structur? + if (size < 8) { + throw wxString(wxT("Invalid server status packet")); + break; + } + CServer* update = theApp->serverlist->GetServerByAddress(cur_server->GetAddress(), cur_server->GetPort()); + if (update) { + CMemFile data(packet, size); + update->SetUserCount(data.ReadUInt32()); + update->SetFileCount(data.ReadUInt32()); + Notify_ServerRefresh( update ); + theApp->ShowUserCount(); + } + break; + } + // Cleaned. + case OP_SERVERIDENT: { + AddDebugLogLineM(false,logServer,wxT("Server: OP_SERVERIDENT")); + + theStats::AddDownOverheadServer(size); + if (size<38) { + AddLogLineM(false, _("Unknown server info received! - too short")); + // throw wxString(wxT("Unknown server info received!")); + break; + } + CServer* update = theApp->serverlist->GetServerByAddress(cur_server->GetAddress(),cur_server->GetPort()); + if (update) { + CMemFile data(packet,size); + CMD4Hash hash = data.ReadHash(); + if (RawPeekUInt32(hash.GetHash()) == 0x2A2A2A2A){ // No endian problem here + const wxString& rstrVersion = update->GetVersion(); + if (!rstrVersion.IsEmpty()) { + update->SetVersion(wxT("eFarm ") + rstrVersion); + } else { + update->SetVersion(wxT("eFarm")); + } + } + // Unused + /*uint32 nServerIP = */data.ReadUInt32(); + /*uint16 nServerPort = */data.ReadUInt16(); + + uint32 nTags = data.ReadUInt32(); + for (uint32 i = 0; i < nTags; i++){ + CTag tag(data, update->GetUnicodeSupport()); + if (tag.GetNameID() == ST_SERVERNAME){ + update->SetListName(tag.GetStr()); + } else if (tag.GetNameID() == ST_DESCRIPTION){ + update->SetDescription(tag.GetStr()); + } // No more known tags from server + } + + theApp->ShowConnectionState(); + Notify_ServerRefresh(update); + } + break; + } + // tecxx 1609 2002 - add server's serverlist to own serverlist + case OP_SERVERLIST: { + AddDebugLogLineM(false,logServer,wxT("Server: OP_SERVERLIST")); + + CMemFile* servers = new CMemFile(packet,size); + uint8 count = servers->ReadUInt8(); + if (((int32)(count*6 + 1) > size)) { + count = 0; + } + int addcount = 0; + while(count) { + uint32 ip = servers->ReadUInt32(); + uint16 port = servers->ReadUInt16(); + CServer* srv = new CServer( + port , // Port + Uint32toStringIP(ip)); // Ip + srv->SetListName(srv->GetFullIP()); + if (!theApp->AddServer(srv)) { + delete srv; + } else { + addcount++; + } + count--; + } + delete servers; + if (addcount) { + AddLogLineM(false, wxString::Format(wxPLURAL("Received %d new server", "Received %d new servers", addcount), addcount)); + } + theApp->serverlist->SaveServerMet(); + AddLogLineM(false, _("Saving of server-list completed.")); + break; + } + case OP_CALLBACKREQUESTED: { + AddDebugLogLineM(false,logServer,wxT("Server: OP_CALLBACKREQUESTED")); + + theStats::AddDownOverheadServer(size); + if (size == 6) { + CMemFile data(packet,size); + uint32 dwIP = data.ReadUInt32(); + uint16 nPort = data.ReadUInt16(); + + uint8 byCryptOptions = 0; + CMD4Hash achUserHash; + if (size >= 23){ + byCryptOptions = data.ReadUInt8();; + achUserHash = data.ReadHash(); + } + + CUpDownClient* client = theApp->clientlist->FindClientByIP(dwIP,nPort); + if (size >= 23 && client->HasValidHash()){ + if (client->GetUserHash() != achUserHash){ + AddDebugLogLineM(false, logServer, wxT("Reported Userhash from OP_CALLBACKREQUESTED differs with our stored hash")); + // disable crypt support since we dont know which hash is true + client->SetCryptLayerRequest(false); + client->SetCryptLayerSupport(false); + client->SetCryptLayerRequires(false); + } else { + client->SetCryptLayerSupport((byCryptOptions & 0x01) != 0); + client->SetCryptLayerRequest((byCryptOptions & 0x02) != 0); + client->SetCryptLayerRequires((byCryptOptions & 0x04) != 0); + } + } else if (size >= 23) { + client->SetUserHash(achUserHash); + client->SetCryptLayerSupport((byCryptOptions & 0x01) != 0); + client->SetCryptLayerRequest((byCryptOptions & 0x02) != 0); + client->SetCryptLayerRequires((byCryptOptions & 0x04) != 0); + } + + if (client) { + client->TryToConnect(); + } else { + client = new CUpDownClient(nPort,dwIP,0,0,0, true, true); + theApp->clientlist->AddClient(client); + client->TryToConnect(); + } + } + break; + } + case OP_CALLBACK_FAIL: { + AddDebugLogLineM(false,logServer,wxT("Server: OP_CALLBACK_FAIL")); + break; + } + case OP_REJECT: { + AddDebugLogLineM(false,logServer,wxT("Server: OP_REJECT")); + AddLogLineM(false, _("Server rejected last command")); + break; + } + default: + AddDebugLogLineM( false, logPacketErrors, + wxString::Format( wxT("Unknown server packet with OPcode %x"), opcode ) + ); + } + return true; + } catch (const CInvalidPacket& e) { + AddLogLineM(false,CFormat( _("Bogus packet received from server: %s") ) % e.what()); + } catch (const CEOFException& e) { + AddLogLineM(false,CFormat( _("Bogus packet received from server: %s") ) % e.what()); + } catch (const wxString& error) { + AddLogLineM(false,CFormat( _("Unhandled error while processing packet from server: %s") ) % error); + } + + // Don't disconnect because of wrong sources. + if (opcode==OP_SEARCHRESULT || opcode==OP_FOUNDSOURCES) { + return true; + } + + SetConnectionState(CS_DISCONNECTED); + return false; +} + +void CServerSocket::ConnectToServer(CServer* server, bool bNoCrypt) +{ + AddDebugLogLineM(true,logServer,wxT("Trying to connect")); + + if (cur_server){ + wxASSERT(0); + delete cur_server; + cur_server = NULL; + } + + cur_server = new CServer(server); + + m_bNoCrypt = bNoCrypt; + + SetConnectionState(CS_CONNECTING); + + info = cur_server->GetListName(); + + // This must be used if we want to reverse-check the addr of the server + if (cur_server->HasDynIP() || !cur_server->GetIP()) { + m_IsSolving = true; + // Send it to solving thread. + CAsyncDNS* dns = new CAsyncDNS(server->GetAddress(), DNS_SERVER_CONNECT, theApp, this); + + if ( dns->Create() == wxTHREAD_NO_ERROR ) { + if ( dns->Run() != wxTHREAD_NO_ERROR ) { + dns->Delete(); + AddLogLineM(false, CFormat( _("Cannot create DNS solving thread for connecting to %s") ) % cur_server->GetAddress()); + } + } else { + dns->Delete(); + AddLogLineM(false, CFormat( _("Cannot create DNS solving thread for connecting to %s") ) % cur_server->GetAddress()); + } + } else { + // Nothing to solve, we already have the IP + OnHostnameResolved(cur_server->GetIP()); + } + +} + +void CServerSocket::OnError(wxSocketError nErrorCode) +{ + AddDebugLogLineM(false, logServer, wxT("Error in serversocket: ") + cur_server->GetListName() + wxT("(") + cur_server->GetFullIP() + wxString::Format(wxT(":%i): %u"),cur_server->GetPort(), (int)nErrorCode)); + SetConnectionState(CS_DISCONNECTED); +} + + +bool CServerSocket::PacketReceived(CPacket* packet) +{ + AddDebugLogLineM(false, logServer, wxString::Format(wxT("Server: Packet Received: Prot %x, Opcode %x, Length %u"), packet->GetProtocol(), packet->GetOpCode(), packet->GetPacketSize())); + + if (packet->GetProtocol() == OP_PACKEDPROT) { + if (!packet->UnPackPacket(250000)){ + AddDebugLogLineM(false, logZLib, wxString::Format(wxT("Failed to decompress server TCP packet: protocol=0x%02x opcode=0x%02x size=%u"), packet ? packet->GetProtocol() : 0, packet ? packet->GetOpCode() : 0, packet ? packet->GetPacketSize() : 0)); + theStats::AddDownOverheadServer(packet->GetPacketSize()); + return true; + } + + packet->SetProtocol(OP_EDONKEYPROT); + } + + if (packet->GetProtocol() == OP_EDONKEYPROT) { + ProcessPacket(packet->GetDataBuffer(), packet->GetPacketSize(), packet->GetOpCode()); + } else { + AddDebugLogLineM(false, logServer, wxString::Format(wxT("Received server TCP packet with unknown protocol: protocol=0x%02x opcode=0x%02x size=%u"), packet ? packet->GetProtocol() : 0, packet ? packet->GetOpCode() : 0, packet ? packet->GetPacketSize() : 0)); + theStats::AddDownOverheadServer(packet->GetPacketSize()); + } + + return true; +} + + +void CServerSocket::OnClose(wxSocketError WXUNUSED(nErrorCode)) +{ + CEMSocket::OnClose(0); + + switch (connectionstate) { + case CS_WAITFORLOGIN: SetConnectionState(CS_SERVERFULL); break; + case CS_CONNECTED: SetConnectionState(CS_DISCONNECTED); break; + default: SetConnectionState(CS_NOTCONNECTED); + } + + serverconnect->DestroySocket(this); +} + +void CServerSocket::SetConnectionState(sint8 newstate) +{ + connectionstate = newstate; + if (newstate < CS_CONNECTING) { + serverconnect->ConnectionFailed(this); + } else if (newstate == CS_CONNECTED || newstate == CS_WAITFORLOGIN) { + if (serverconnect) { + serverconnect->ConnectionEstablished(this); + } + } +} + + +void CServerSocket::SendPacket(CPacket* packet, bool delpacket, bool controlpacket, uint32 actualPayloadSize) +{ + m_dwLastTransmission = GetTickCount(); + CEMSocket::SendPacket(packet, delpacket, controlpacket, actualPayloadSize); +} + + +void CServerSocket::OnHostnameResolved(uint32 ip) { + + m_IsSolving = false; + if (ip) { + if (theApp->ipfilter->IsFiltered(ip, true)) { + AddLogLineM(true, CFormat( _("Server IP %s (%s) is filtered. Not connecting.") ) + % Uint32toStringIP(ip) % cur_server->GetAddress() ); + OnConnect(wxSOCKET_INVADDR); + } else { + amuleIPV4Address addr; + addr.Hostname(ip); + uint16 nPort = 0; + wxString useObfuscation; + if ( !m_bNoCrypt && thePrefs::IsServerCryptLayerTCPRequested() && cur_server->GetObfuscationPortTCP() != 0 && cur_server->SupportsObfuscationTCP()){ + nPort = cur_server->GetObfuscationPortTCP(); + useObfuscation = _("using protocol obfuscation."); + SetConnectionEncryption(true, NULL, true); + } else { + nPort = cur_server->GetConnPort(); + SetConnectionEncryption(false, NULL, true); + } + + addr.Service(nPort); + + AddLogLineM(false, CFormat( _("Connecting to %s (%s - %s:%i) %s") ) + % cur_server->GetListName() + % cur_server->GetAddress() + % cur_server->GetFullIP() + % nPort + % useObfuscation + ); + + AddDebugLogLineM(false, logServer, wxT("Server ") + cur_server->GetAddress() + wxT("(") + Uint32toStringIP(ip) + wxT(")") + wxString::Format(wxT(" Port %i"), cur_server->GetConnPort())); + Connect(addr, false); + } + } else { + AddLogLineM(true, CFormat( _("Could not solve dns for server %s: Unable to connect!") ) + % cur_server->GetAddress() ); + OnConnect(wxSOCKET_NOHOST); + } + +} +uint32 CServerSocket::GetServerIP() const +{ + return cur_server ? cur_server->GetIP() : 0; +} +// File_checked_for_headers diff --git a/src/ServerSocket.h b/src/ServerSocket.h new file mode 100644 index 00000000..1a787297 --- /dev/null +++ b/src/ServerSocket.h @@ -0,0 +1,86 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// +// Client to Server communication +// + +#ifndef SERVERSOCKET_H +#define SERVERSOCKET_H + +#include "EMSocket.h" // Needed for CEMSocket +#include "ServerConnect.h" + +//------------------------------------------------------------------------------ +// CServerSocket +//------------------------------------------------------------------------------ + +class CServer; + +class CServerSocket : public CEMSocket +{ + friend class CServerConnect; +public: + + CServerSocket(CServerConnect* in_serverconnect, const CProxyData *ProxyData = NULL); + virtual ~CServerSocket(); + + void ConnectToServer(CServer* server, bool bNoCrypt = false); + sint8 GetConnectionState() const { return connectionstate; } + uint32 GetLastTransmission() const { return m_dwLastTransmission; } + wxString info; + + void OnClose(wxSocketError nErrorCode); + void OnConnect(wxSocketError nErrorCode); + void OnReceive(wxSocketError nErrorCode); + void OnError(wxSocketError nErrorCode); + bool PacketReceived(CPacket* packet); + void SendPacket(CPacket* packet, bool delpacket = true, bool controlpacket = true, uint32 actualPayloadSize = 0); + bool IsSolving() const { return m_IsSolving;}; + void OnHostnameResolved(uint32 ip); + CServer *GetServerConnected() const { return serverconnect->GetCurrentServer(); } + + uint32 GetServerIP() const; + +private: + bool ProcessPacket(const byte* packet, uint32 size, int8 opcode); + void SetConnectionState(sint8 newstate); + CServerConnect* serverconnect; + sint8 connectionstate; + CServer* cur_server; + bool m_bNoCrypt; + bool headercomplete; + int32 sizetoget; + int32 sizereceived; + char* rbuffer; + bool m_bIsDeleting; // true: socket is already in deletion phase, don't destroy it in ::StopConnectionTry + uint32 m_dwLastTransmission; + + bool m_IsSolving; + +}; + +#endif // SERVERSOCKET_H +// File_checked_for_headers diff --git a/src/ServerUDPSocket.cpp b/src/ServerUDPSocket.cpp new file mode 100644 index 00000000..eb943ac3 --- /dev/null +++ b/src/ServerUDPSocket.cpp @@ -0,0 +1,498 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "ServerUDPSocket.h" // Interface declarations. + +#include +#include +#include + +#include "Packet.h" // Needed for CPacket +#include "PartFile.h" // Needed for CPartFile +#include "SearchList.h" // Needed for CSearchList +#include "MemFile.h" // Needed for CMemFile +#include "DownloadQueue.h" // Needed for CDownloadQueue +#include "ServerList.h" // Needed for CServerList +#include "Server.h" // Needed for CServer +#include "amule.h" // Needed for theApp +#include "AsyncDNS.h" // Needed for CAsyncDNS +#include "Statistics.h" // Needed for theStats +#include "Logger.h" +#include +#include "updownclient.h" // Needed for SF_REMOTE_SERVER +#include "GuiEvents.h" // Needed for Notify_* +#include "Preferences.h" +#include "EncryptedDatagramSocket.h" +#include "RandomFunctions.h" +#include "ServerConnect.h" + +// +// (TCP+3) UDP socket +// + +CServerUDPSocket::CServerUDPSocket(amuleIPV4Address &address, const CProxyData *ProxyData) + : CMuleUDPSocket(wxT("Server UDP-Socket"), ID_SERVERUDPSOCKET_EVENT, address, ProxyData) +{ + Open(); +} + + +void CServerUDPSocket::OnPacketReceived(const wxIPV4address& addr, byte* buffer, size_t length) +{ + wxCHECK_RET(length >= 2, wxT("Invalid packet.")); + + size_t nPayLoadLen = length; + byte* pBuffer = buffer; + uint32 serverip = StringIPtoUint32(addr.IPAddress()); + CServer* pServer = theApp->serverlist->GetServerByIPUDP(serverip, addr.Service(), true); + if (pServer && thePrefs::IsServerCryptLayerUDPEnabled() && + ((pServer->GetServerKeyUDP() != 0 && pServer->SupportsObfuscationUDP()) || (pServer->GetCryptPingReplyPending() && pServer->GetChallenge() != 0))) + { + // eMule TODO + uint32 dwKey = 0; + if (pServer->GetCryptPingReplyPending() && pServer->GetChallenge() != 0 /* && pServer->GetPort() == ntohs(sockAddr.sin_port) - 12 */) { + dwKey = pServer->GetChallenge(); + } else { + dwKey = pServer->GetServerKeyUDP(); + } + + wxASSERT( dwKey != 0 ); + nPayLoadLen = CEncryptedDatagramSocket::DecryptReceivedServer(buffer, length, &pBuffer, dwKey, serverip); + if (nPayLoadLen == length) { + AddDebugLogLineM( false, logServerUDP,CFormat(wxT("Expected encrypted packet, but received unencrytped from server %s, UDPKey %u, Challenge: %u")) % pServer->GetListName() % pServer->GetServerKeyUDP() % pServer->GetChallenge()); + } else { + AddDebugLogLineM( false, logServerUDP,CFormat(wxT("Received encrypted packet from server %s, UDPKey %u, Challenge: %u")) % pServer->GetListName() % pServer->GetServerKeyUDP() % pServer->GetChallenge()); + } + } + + uint8 protocol = pBuffer[0]; + uint8 opcode = pBuffer[1]; + + if (protocol == OP_EDONKEYPROT) { + CMemFile data(pBuffer + 2, nPayLoadLen - 2); + ProcessPacket(data, opcode, addr.IPAddress(), addr.Service()); + } else { + AddDebugLogLineM( false, logServerUDP, + wxString::Format( wxT("Received invalid packet, protocol (0x%x) and opcode (0x%x)"), protocol, opcode )); + + theStats::AddDownOverheadOther(length); + } +} + + +void CServerUDPSocket::ProcessPacket(CMemFile& packet, uint8 opcode, const wxString& host, uint16 port) +{ + CServer* update = theApp->serverlist->GetServerByIPUDP(StringIPtoUint32(host), port, true); + unsigned size = packet.GetLength(); + + theStats::AddDownOverheadOther(size); + AddDebugLogLineM( false, logServerUDP, + CFormat( wxT("Received UDP server packet from %s:%u, opcode (0x%x)")) % host % port % opcode ); + + try { + // Imported: OP_GLOBSEARCHRES, OP_GLOBFOUNDSOURCES & OP_GLOBSERVSTATRES + // This makes Server UDP Flags to be set correctly so we use less bandwith on asking servers for sources + // Also we process Search results and Found sources correctly now on 16.40 behaviour. + switch(opcode){ + case OP_GLOBSEARCHRES: { + + // process all search result packets + + do{ + theApp->searchlist->ProcessUDPSearchAnswer(packet, true, StringIPtoUint32(host), port - 4); + + if (packet.GetPosition() + 2 < size) { + // An additional packet? + uint8 protocol = packet.ReadUInt8(); + uint8 new_opcode = packet.ReadUInt8(); + + if (protocol != OP_EDONKEYPROT || new_opcode != OP_GLOBSEARCHRES) { + AddDebugLogLineM( true, logServerUDP, + wxT("Server search reply got additional bogus bytes.") ); + break; + } else { + AddDebugLogLineM( true, logServerUDP, + wxT("Got server search reply with additional packet.") ); + } + } + + } while (packet.GetPosition()+2 < size); + + break; + } + case OP_GLOBFOUNDSOURCES:{ + // process all source packets + do { + CMD4Hash fileid = packet.ReadHash(); + if (CPartFile* file = theApp->downloadqueue->GetFileByID(fileid)) { + file->AddSources(packet, StringIPtoUint32(host), port-4, SF_REMOTE_SERVER, false); + } else { + AddDebugLogLineM( true, logServerUDP, wxT("Sources received for unknown file") ); + // skip sources for that file + uint8 count = packet.ReadUInt8(); + packet.Seek(count*(4+2), wxFromCurrent); + } + + if (packet.GetPosition()+2 < size) { + // An additional packet? + uint8 protocol = packet.ReadUInt8(); + uint8 new_opcode = packet.ReadUInt8(); + + if (protocol != OP_EDONKEYPROT || new_opcode != OP_GLOBFOUNDSOURCES) { + AddDebugLogLineM( true, logServerUDP, + wxT("Server sources reply got additional bogus bytes.") ); + break; + } + } + } while ((packet.GetPosition() + 2) < size); + break; + } + + case OP_GLOBSERVSTATRES:{ + // Reviewed with 0.47c + if (!update) { + throw wxString(wxT("Unknown server on a OP_GLOBSERVSTATRES packet (") + host + wxString::Format(wxT(":%d)"), port-4)); + } + if( size < 12) { + throw(wxString(wxString::Format(wxT("Invalid OP_GLOBSERVSTATRES packet (size=%u)"),size))); + } + uint32 challenge = packet.ReadUInt32(); + if (challenge != update->GetChallenge()) { + throw(wxString(wxString::Format(wxT("Invalid challenge on OP_GLOBSERVSTATRES packet (0x%x != 0x%x)"),challenge,update->GetChallenge()))); + } + + update->SetChallenge(0); + update->SetCryptPingReplyPending(false); + uint32 tNow = ::GetTickCount(); + update->SetLastPingedTime(tNow - (rand() % HR2S(1))); // if we used Obfuscated ping, we still need to reset the time properly + + uint32 cur_user = packet.ReadUInt32(); + uint32 cur_files = packet.ReadUInt32(); + uint32 cur_maxusers = 0; + uint32 cur_softfiles = 0; + uint32 cur_hardfiles = 0; + uint32 uUDPFlags = 0; + uint32 uLowIDUsers = 0; + uint32 dwServerUDPKey = 0; + uint16 nTCPObfuscationPort = 0; + uint16 nUDPObfuscationPort = 0; + if( size >= 16 ){ + cur_maxusers = packet.ReadUInt32(); + if( size >= 24 ){ + cur_softfiles = packet.ReadUInt32(); + cur_hardfiles = packet.ReadUInt32(); + if( size >= 28 ){ + uUDPFlags = packet.ReadUInt32(); + if( size >= 32 ){ + uLowIDUsers = packet.ReadUInt32(); + if (size >= 40) { + nUDPObfuscationPort = packet.ReadUInt16(); + nTCPObfuscationPort = packet.ReadUInt16(); + dwServerUDPKey = packet.ReadUInt32(); + } + } + } + } + } + + update->SetPing( ::GetTickCount() - update->GetLastPinged() ); + update->SetUserCount( cur_user ); + update->SetFileCount( cur_files ); + update->SetMaxUsers( cur_maxusers ); + update->SetSoftFiles( cur_softfiles ); + update->SetHardFiles( cur_hardfiles ); + update->SetUDPFlags( uUDPFlags ); + update->SetLowIDUsers( uLowIDUsers ); + update->SetServerKeyUDP(dwServerUDPKey); + update->SetObfuscationPortTCP(nTCPObfuscationPort); + update->SetObfuscationPortUDP(nUDPObfuscationPort); + + Notify_ServerRefresh( update ); + + update->SetLastDescPingedCount(false); + if (update->GetLastDescPingedCount() < 2) { + // eserver 16.45+ supports a new OP_SERVER_DESC_RES answer, if the OP_SERVER_DESC_REQ contains a uint32 + // challenge, the server returns additional info with OP_SERVER_DESC_RES. To properly distinguish the + // old and new OP_SERVER_DESC_RES answer, the challenge has to be selected carefully. The first 2 bytes + // of the challenge (in network byte order) MUST NOT be a valid string-len-int16! + CPacket* sendpacket = new CPacket(OP_SERVER_DESC_REQ, 4, OP_EDONKEYPROT); + uint32 uDescReqChallenge = ((uint32)GetRandomUint16() << 16) + INV_SERV_DESC_LEN; // 0xF0FF = an 'invalid' string length. + update->SetDescReqChallenge(uDescReqChallenge); + sendpacket->CopyUInt32ToDataBuffer(uDescReqChallenge); + //theStats.AddUpDataOverheadServer(packet->size); + AddDebugLogLineM(false, logServerUDP, CFormat(wxT(">>> Sending OP__ServDescReq to server %s:%u, challenge %08x\n")) % update->GetAddress() % update->GetPort() % uDescReqChallenge); + theApp->serverconnect->SendUDPPacket(sendpacket, update, true); + } else { + update->SetLastDescPingedCount(true); + } + + theApp->ShowUserCount(); + break; + } + case OP_SERVER_DESC_RES:{ + // Reviewed with 0.47c + if (!update) { + throw(wxString(wxT("Received OP_SERVER_DESC_RES from an unknown server"))); + } + + // old packet: + // new packet: + // + // NOTE: To properly distinguish between the two packets which are both useing the same opcode... + // the first two bytes of (in network byte order) have to be an invalid at least. + + uint16 Len = packet.ReadUInt16(); + + packet.Seek(-2, wxFromCurrent); // Step back + + if (size >= 8 && Len == INV_SERV_DESC_LEN) { + + if (update->GetDescReqChallenge() != 0 && packet.ReadUInt32() == update->GetDescReqChallenge()) { + + update->SetDescReqChallenge(0); + + uint32 uTags = packet.ReadUInt32(); + for (uint32 i = 0; i < uTags; ++i) { + CTag tag(packet, update->GetUnicodeSupport()); + switch (tag.GetNameID()) { + case ST_SERVERNAME: + update->SetListName(tag.GetStr()); + break; + case ST_DESCRIPTION: + update->SetDescription(tag.GetStr()); + break; + case ST_DYNIP: + update->SetDynIP(tag.GetStr()); + break; + case ST_VERSION: + if (tag.IsStr()) { + update->SetVersion(tag.GetStr()); + } else if (tag.IsInt()) { + wxString strVersion = wxString::Format(wxT("%u.%u"), tag.GetInt() >> 16, tag.GetInt() & 0xFFFF); + update->SetVersion(strVersion); + } + break; + case ST_AUXPORTSLIST: + update->SetAuxPortsList(tag.GetStr()); + break; + default: + // Unknown tag + ; + } + } + } else { + // A server sent us a new server description packet (including a challenge) although we did not + // ask for it. This may happen, if there are multiple servers running on the same machine with + // multiple IPs. If such a server is asked for a description, the server will answer 2 times, + // but with the same IP. + // ignore this packet + + } + } else { + update->SetDescription(packet.ReadString(update->GetUnicodeSupport())); + update->SetListName(packet.ReadString(update->GetUnicodeSupport())); + } + break; + } + default: + AddDebugLogLineM( true, logServerUDP, + wxString::Format( wxT("Unknown Server UDP opcode %x"), opcode ) ); + } + } catch (const wxString& error) { + AddDebugLogLineM(false, logServerUDP, wxT("Error while processing incoming UDP Packet: ") + error); + } catch (const CInvalidPacket& error) { + AddDebugLogLineM(false, logServerUDP, wxT("Invalid UDP packet encountered: ") + error.what()); + } catch (const CEOFException& e) { + AddDebugLogLineM(false, logServerUDP, wxT("IO error while processing incoming UDP Packet: ") + e.what()); + } + + if (update) { + update->ResetFailedCount(); + Notify_ServerRefresh( update ); + } + +} + +void CServerUDPSocket::OnReceiveError(int errorCode, const wxIPV4address& addr) +{ + CMuleUDPSocket::OnReceiveError(errorCode, addr); + + // If we are not currently pinging this server, increase the failure counter + CServer* pServer = theApp->serverlist->GetServerByIPUDP(StringIPtoUint32(addr.IPAddress()), addr.Service(), true); + if (pServer && !pServer->GetCryptPingReplyPending() && GetTickCount() - pServer->GetLastPinged() >= SEC2MS(30)) { + pServer->AddFailedCount(); + Notify_ServerRefresh(pServer); + } + +} + +void CServerUDPSocket::SendPacket(CPacket* packet, CServer* host, bool delPacket, bool rawpacket, uint16 port_offset) +{ + ServerUDPPacket item = { NULL, 0, 0, wxEmptyString }; + + if (host->HasDynIP()) { + item.addr = host->GetDynIP(); + } else { + item.ip = host->GetIP(); + } + + // 4 (default) for standard sending, 12 for obfuscated ping, that's all for now. + // Might be changed if encrypted bellow, so don't move it. + item.port = host->GetPort() + port_offset; + + // We might need to encrypt the packet for this server. + if (!rawpacket && thePrefs::IsServerCryptLayerUDPEnabled() && host->GetServerKeyUDP() != 0 && host->SupportsObfuscationUDP()) { + uint16 uRawPacketSize = packet->GetPacketSize() + 2; + byte* pRawPacket = new byte[uRawPacketSize]; + memcpy(pRawPacket, packet->GetUDPHeader(), 2); + memcpy(pRawPacket + 2, packet->GetDataBuffer(), packet->GetPacketSize()); + + uRawPacketSize = CEncryptedDatagramSocket::EncryptSendServer(&pRawPacket, uRawPacketSize, host->GetServerKeyUDP()); + AddDebugLogLineM(false, logServerUDP, CFormat(wxT("Sending encrypted packet to server %s, UDPKey %u, port %u, original OPCode 0x%02x")) % host->GetListName() % host->GetServerKeyUDP() % host->GetObfuscationPortUDP() % packet->GetOpCode()); + item.port = host->GetObfuscationPortUDP(); + + CMemFile encryptedpacket(pRawPacket + 2, uRawPacketSize - 2); + item.packet = new CPacket(encryptedpacket, pRawPacket[0], pRawPacket[1]); + + if (delPacket) { + delete packet; + } + + } else { + AddDebugLogLineM(false, logServerUDP, CFormat(wxT("Sending regular packet to server %s, port %u (raw = %s), OPCode 0x%02x")) % host->GetListName() % host->GetObfuscationPortUDP() % (rawpacket ? wxT("True") : wxT("False")) % packet->GetOpCode()); + if (delPacket) { + item.packet = packet; + } else { + item.packet = new CPacket(*packet); + } + } + + + m_queue.push_back(item); + + // If there is more than one item in the queue, + // then we are already waiting for a dns query. + if (m_queue.size() == 1) { + SendQueue(); + } +} + + +void CServerUDPSocket::SendQueue() +{ + while (m_queue.size()) { + ServerUDPPacket item = m_queue.front(); + CPacket* packet = item.packet; + + // Do we need to do a DNS lookup before sending? + wxASSERT(item.ip || !item.addr.IsEmpty()); + if (!item.addr.IsEmpty()) { + // This not an ip but a hostname. Resolve it. + CServer* update = theApp->serverlist->GetServerByAddress(item.addr, item.port); + if (update) { + if (update->GetLastDNSSolve() + DNS_SOLVE_TIME < ::GetTickCount64()) { + // Its time for a new check. + CAsyncDNS* dns = new CAsyncDNS(item.addr, DNS_UDP, theApp, this); + if ((dns->Create() != wxTHREAD_NO_ERROR) || (dns->Run() != wxTHREAD_NO_ERROR)) { + // Not much we can do here, just drop the packet. + m_queue.pop_front(); + continue; + } + update->SetDNSError(false); + update->SetLastDNSSolve(::GetTickCount64()); + // Wait for the DNS query to be resolved + return; + } else { + // It has been checked recently, don't re-check yet. + if (update->GetDNSError()) { + // Drop the packet, dns failed last time + AddDebugLogLineM(false, logServerUDP, wxT("Trying to send an UDP packet to a server host that failed DNS: ")+item.addr); + m_queue.pop_front(); + continue; + } else { + // It has been solved or is solving. + if (update->GetIP()) { + // It has been solved and ok + AddDebugLogLineM(false, logServerUDP, wxT("Sending a UDP packet to a resolved DNS server host: ")+item.addr); + // Update the item IP + item.ip = update->GetIP(); + // It'll fallback to the sending. + } else { + AddDebugLogLineM(false, logServerUDP, wxT("Trying to send an UDP packet to a server host that is checking DNS: ")+item.addr); + // Let the packet queued, and wait for resolution + // Meanwhile, send other packets. + m_queue.pop_front(); + m_queue.push_back(item); + return; + } + } + } + } else { + AddDebugLogLineM(false, logServerUDP, wxT("Trying to send an UDP packet to a server host that is not on serverlist")); + // Not much we can do here, just drop the packet. + m_queue.pop_front(); + continue; + } + } + + CServer* update = theApp->serverlist->GetServerByIPUDP(item.ip, item.port, true); + if (update) { + AddDebugLogLineM(false, logServerUDP, wxT("Sending an UDP packet to a server: ")+update->GetAddress()); + // Don't encrypt, as this is already either encrypted or refused to encrypt. + CMuleUDPSocket::SendPacket(packet, item.ip, item.port, false, NULL, false, 0); + } else { + AddDebugLogLineM(false, logServerUDP, wxT("Sending an UDP packet to a server no in serverlist: ")+Uint32_16toStringIP_Port(item.ip,item.port)); + } + + m_queue.pop_front(); + } +} + + +void CServerUDPSocket::OnHostnameResolved(uint32 ip) +{ + wxCHECK_RET(m_queue.size(), wxT("DNS query returned, but no packets are queued.")); + + ServerUDPPacket item = m_queue.front(); + wxCHECK_RET(!item.ip && !item.addr.IsEmpty(), wxT("DNS resolution not expected.")); + + /* An asynchronous database routine completed. */ + CServer* update = theApp->serverlist->GetServerByAddress(item.addr, item.port); + if (ip == 0) { + update->SetDNSError(true); + m_queue.pop_front(); + } else { + if (update) { + update->SetID(ip); + } + + item.addr.Clear(); + item.ip = ip; + } + + SendQueue(); +} +// File_checked_for_headers diff --git a/src/ServerUDPSocket.h b/src/ServerUDPSocket.h new file mode 100644 index 00000000..095d303c --- /dev/null +++ b/src/ServerUDPSocket.h @@ -0,0 +1,63 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef SERVERUDPSOCKET_H +#define SERVERUDPSOCKET_H + +#include "MuleUDPSocket.h" + + +class CPacket; +class CServer; +class CMemFile; + + +class CServerUDPSocket : public CMuleUDPSocket +{ +public: + CServerUDPSocket(amuleIPV4Address& addr, const CProxyData* ProxyData = NULL); + + void SendPacket(CPacket* packet, CServer* host, bool delPacket, bool rawpacket, uint16 port_offset); + void OnHostnameResolved(uint32 ip); + virtual void OnReceiveError(int errorCode, const wxIPV4address& addr); + +private: + void OnPacketReceived(const wxIPV4address& addr, byte* buffer, size_t length); + void ProcessPacket(CMemFile& packet, uint8 opcode, const wxString& host, uint16 port); + void SendQueue(); + + struct ServerUDPPacket { + CPacket* packet; + uint32 ip; + uint16 port; + wxString addr; + }; + + typedef std::list PacketList; + PacketList m_queue; +}; + +#endif // SERVERUDPSOCKET_H +// File_checked_for_headers diff --git a/src/ServerWnd.cpp b/src/ServerWnd.cpp new file mode 100644 index 00000000..10ee5691 --- /dev/null +++ b/src/ServerWnd.cpp @@ -0,0 +1,276 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "muuli_wdr.h" // Needed for ID_ADDTOLIST +#include "ServerWnd.h" // Interface declarations. +#include "Server.h" // Needed for CServer +#include "ServerList.h" // Needed for CServerList +#include "ServerListCtrl.h" // Needed for CServerListCtrl +#include "Preferences.h" // Needed for CPreferences +#include "ServerConnect.h" +#include "amuleDlg.h" // Needed for CamuleDlg +#include "amule.h" // Needed for theApp +#include "Logger.h" + +#include "kademlia/kademlia/Kademlia.h" +#include "ClientList.h" +#include "updownclient.h" + +BEGIN_EVENT_TABLE(CServerWnd,wxPanel) + EVT_BUTTON(ID_ADDTOLIST,CServerWnd::OnBnClickedAddserver) + EVT_BUTTON(IDC_ED2KDISCONNECT,CServerWnd::OnBnClickedED2KDisconnect) + EVT_BUTTON(ID_UPDATELIST,CServerWnd::OnBnClickedUpdateservermetfromurl) + EVT_TEXT_ENTER(IDC_SERVERLISTURL,CServerWnd::OnBnClickedUpdateservermetfromurl) + EVT_BUTTON(ID_BTN_RESET, CServerWnd::OnBnClickedResetLog) + EVT_BUTTON(ID_BTN_RESET_SERVER, CServerWnd::OnBnClickedResetServerLog) + EVT_SPLITTER_SASH_POS_CHANGED(ID_SRV_SPLITTER,CServerWnd::OnSashPositionChanged) +END_EVENT_TABLE() + + +CServerWnd::CServerWnd(wxWindow* pParent /*=NULL*/, int splitter_pos) +: wxPanel(pParent, -1) +{ + wxSizer* sizer = serverListDlg(this,TRUE); + + // init serverlist + // no use now. too early. + + serverlistctrl = CastChild( ID_SERVERLIST, CServerListCtrl ); + + CastChild( ID_SRV_SPLITTER, wxSplitterWindow )->SetSashPosition(splitter_pos, true); + CastChild( ID_SRV_SPLITTER, wxSplitterWindow )->SetSashGravity(0.5f); + CastChild( IDC_NODESLISTURL, wxTextCtrl )->SetValue(thePrefs::GetKadNodesUrl()); + CastChild( IDC_SERVERLISTURL, wxTextCtrl )->SetValue(thePrefs::GetEd2kServersUrl()); + + // Insert two columns, currently without a header + wxListCtrl* ED2KInfoList = CastChild( ID_ED2KINFO, wxListCtrl ); + wxASSERT(ED2KInfoList); + ED2KInfoList->InsertColumn(0, wxEmptyString); + ED2KInfoList->InsertColumn(1, wxEmptyString); + + wxListCtrl* KadInfoList = CastChild( ID_KADINFO, wxListCtrl ); + wxASSERT(KadInfoList); + KadInfoList->InsertColumn(0, wxEmptyString); + KadInfoList->InsertColumn(1, wxEmptyString); + + sizer->Show(this,TRUE); +} + + +CServerWnd::~CServerWnd() +{ + thePrefs::SetEd2kServersUrl(CastChild( IDC_SERVERLISTURL, wxTextCtrl )->GetValue()); + thePrefs::SetKadNodesUrl(CastChild( IDC_NODESLISTURL, wxTextCtrl )->GetValue()); +} + + +void CServerWnd::UpdateServerMetFromURL(const wxString& strURL) +{ + thePrefs::SetEd2kServersUrl(strURL); + theApp->serverlist->UpdateServerMetFromURL(strURL); +} + + +void CServerWnd::OnBnClickedAddserver(wxCommandEvent& WXUNUSED(evt)) +{ + wxString servername = CastChild( IDC_SERVERNAME, wxTextCtrl )->GetValue(); + wxString serveraddr = CastChild( IDC_IPADDRESS, wxTextCtrl )->GetValue(); + long port = StrToULong( CastChild( IDC_SPORT, wxTextCtrl )->GetValue() ); + + if ( serveraddr.IsEmpty() ) { + AddLogLineM( true, _("Server not added: No IP or hostname specified.")); + return; + } + + if ( port <= 0 || port > 65535 ) { + AddLogLineM( true, _("Server not added: Invalid server-port specified.")); + return; + } + + CServer* toadd = new CServer( port, serveraddr ); + toadd->SetListName( servername.IsEmpty() ? serveraddr : servername ); + + if ( theApp->AddServer( toadd, true ) ) { + CastChild( IDC_SERVERNAME, wxTextCtrl )->Clear(); + CastChild( IDC_IPADDRESS, wxTextCtrl )->Clear(); + CastChild( IDC_SPORT, wxTextCtrl )->Clear(); + } else { + CServer* update = theApp->serverlist->GetServerByAddress(toadd->GetAddress(), toadd->GetPort()); + // See note on CServerList::AddServer + if (update == NULL && toadd->GetIP() != 0) { + update = theApp->serverlist->GetServerByIPTCP(toadd->GetIP(), toadd->GetPort()); + } + + if ( update ) { + update->SetListName(toadd->GetListName()); + serverlistctrl->RefreshServer(update); + } + delete toadd; + } + + theApp->serverlist->SaveServerMet(); +} + + +void CServerWnd::OnBnClickedUpdateservermetfromurl(wxCommandEvent& WXUNUSED(evt)) +{ + wxString strURL = CastChild( IDC_SERVERLISTURL, wxTextCtrl )->GetValue(); + UpdateServerMetFromURL(strURL); +} + + +void CServerWnd::OnBnClickedResetLog(wxCommandEvent& WXUNUSED(evt)) +{ + theApp->GetLog(true); // Reset it. +} + + +void CServerWnd::OnBnClickedResetServerLog(wxCommandEvent& WXUNUSED(evt)) +{ + theApp->GetServerLog(true); // Reset it +} + + +void CServerWnd::UpdateED2KInfo() +{ + wxListCtrl* ED2KInfoList = CastChild( ID_ED2KINFO, wxListCtrl ); + + ED2KInfoList->DeleteAllItems(); + ED2KInfoList->InsertItem(0, _("ED2K Status:")); + + if (theApp->IsConnectedED2K()) { + ED2KInfoList->SetItem(0, 1, _("Connected")); + + // Connection data + + ED2KInfoList->InsertItem(1, _("IP:Port")); + ED2KInfoList->SetItem(1, 1, theApp->serverconnect->IsLowID() ? + wxString(_("LowID")) : Uint32_16toStringIP_Port( theApp->GetED2KID(), thePrefs::GetPort())); + + ED2KInfoList->InsertItem(2, _("ID")); + // No need to test the server connect, it's already true + ED2KInfoList->SetItem(2, 1, wxString::Format(wxT("%u"), theApp->GetED2KID())); + + ED2KInfoList->InsertItem(3, wxEmptyString); + + if (theApp->serverconnect->IsLowID()) { + ED2KInfoList->SetItem(1, 1, _("Server")); // LowID, unknown ip + ED2KInfoList->SetItem(3, 1, _("LowID")); + } else { + ED2KInfoList->SetItem(1, 1, Uint32_16toStringIP_Port(theApp->GetED2KID(), thePrefs::GetPort())); + ED2KInfoList->SetItem(3, 1, _("HighID")); + } + + } else { + // No data + ED2KInfoList->SetItem(0, 1, _("Not Connected")); + } + + // Fit the width of the columns + ED2KInfoList->SetColumnWidth(0, -1); + ED2KInfoList->SetColumnWidth(1, -1); +} + +void CServerWnd::UpdateKadInfo() +{ + wxListCtrl* KadInfoList = CastChild( ID_KADINFO, wxListCtrl ); + + int next_row = 0; + + KadInfoList->DeleteAllItems(); + + KadInfoList->InsertItem(next_row, _("Kademlia Status:")); + + if (theApp->IsKadRunning()) { + KadInfoList->SetItem(next_row, 1, _("Running")); + + ++next_row; + + // Connection data + + KadInfoList->InsertItem(next_row, _("Status:")); + KadInfoList->SetItem(next_row, 1, theApp->IsConnectedKad() ? _("Connected"): _("Disconnected")); + ++next_row; + if (theApp->IsConnectedKad()) { + KadInfoList->InsertItem(next_row, _("Connection State:")); + KadInfoList->SetItem(next_row, 1, theApp->IsFirewalledKad() ? _("Firewalled") : _("OK")); + ++next_row; + #ifndef CLIENT_GUI + if (theApp->IsFirewalledKad()) { + KadInfoList->InsertItem(next_row, _("Firewalled state: ")); + KadInfoList->SetItem(next_row, 1, theApp->clientlist->GetBuddy() ? _("Connected to buddy") : _("No buddy")); + ++next_row; + #ifdef __DEBUG__ + if (theApp->clientlist->GetBuddy()) { + KadInfoList->InsertItem(next_row, wxT("Buddy address: ")); + KadInfoList->SetItem(next_row, 1, Uint32_16toStringIP_Port(theApp->clientlist->GetBuddy()->GetIP(), theApp->clientlist->GetBuddy()->GetUDPPort())); + ++next_row; + } + #endif + } + uint32 KademliaUsers = Kademlia::CKademlia::GetKademliaUsers(); + uint32 KademliaFiles = Kademlia::CKademlia::GetKademliaFiles(); + #else + uint32 KademliaUsers = theStats::GetKadUsers(); + uint32 KademliaFiles = theStats::GetKadFiles(); + //#warning TODO: Buddy state on remote GUI + /* Maybe Averages too, but that would be redundant + they are already on the status bar */ + #endif + KadInfoList->InsertItem(next_row, _("Average Users:")); + KadInfoList->SetItem(next_row, 1, CastItoIShort(KademliaUsers)); + ++next_row; + KadInfoList->InsertItem(next_row, _("Average Files:")); + KadInfoList->SetItem(next_row, 1, CastItoIShort(KademliaFiles)); + + } + + } else { + // No data + KadInfoList->SetItem(next_row, 1, _("Not running")); + } + + // Fit the width of the columns + KadInfoList->SetColumnWidth(0, -1); + KadInfoList->SetColumnWidth(1, -1); +} + +void CServerWnd::OnSashPositionChanged(wxSplitterEvent& WXUNUSED(evt)) +{ + if (theApp->amuledlg) { + theApp->amuledlg->m_srv_split_pos = CastChild( wxT("SrvSplitterWnd"), wxSplitterWindow )->GetSashPosition(); + } +} + +void CServerWnd::OnBnClickedED2KDisconnect(wxCommandEvent& WXUNUSED(evt)) +{ + if (theApp->serverconnect->IsConnecting()) { + theApp->serverconnect->StopConnectionTry(); + } else { + theApp->serverconnect->Disconnect(); + } +} +// File_checked_for_headers diff --git a/src/ServerWnd.h b/src/ServerWnd.h new file mode 100644 index 00000000..9586c727 --- /dev/null +++ b/src/ServerWnd.h @@ -0,0 +1,58 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef SERVERWND_H +#define SERVERWND_H + +#include // Needed for wxSplitter + + +class CServerListCtrl; + +class CServerWnd : public wxPanel +{ +public: + CServerWnd(wxWindow* pParent, int splitter_pos); // standard constructor + virtual ~CServerWnd(); + + void UpdateServerMetFromURL(const wxString& strURL); + void UpdateED2KInfo(); + void UpdateKadInfo(); + + CServerListCtrl* serverlistctrl; + +private: + void OnSashPositionChanged(wxSplitterEvent& evt); + void OnBnClickedAddserver(wxCommandEvent& evt); + void OnBnClickedED2KDisconnect(wxCommandEvent& evt); + void OnBnClickedUpdateservermetfromurl(wxCommandEvent& evt); + void OnBnClickedResetLog(wxCommandEvent& evt); + void OnBnClickedResetServerLog(wxCommandEvent& evt); + + DECLARE_EVENT_TABLE() +}; + +#endif // SERVERWND_H +// File_checked_for_headers diff --git a/src/SharedFileList.cpp b/src/SharedFileList.cpp new file mode 100644 index 00000000..bfe48c06 --- /dev/null +++ b/src/SharedFileList.cpp @@ -0,0 +1,1091 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "SharedFileList.h" // Interface declarations // Do_not_auto_remove + +#include +#include +#include +#include + +#include + +#include "Packet.h" // Needed for CPacket +#include "MemFile.h" // Needed for CMemFile +#include "ServerConnect.h" // Needed for CServerConnect +#include "KnownFileList.h" // Needed for CKnownFileList +#include "ThreadTasks.h" // Needed for CThreadScheduler and CHasherTask +#include "Preferences.h" // Needed for thePrefs +#include "DownloadQueue.h" // Needed for CDownloadQueue +#include "amule.h" // Needed for theApp +#include "PartFile.h" // Needed for PartFile +#include "Server.h" // Needed for CServer +#include "updownclient.h" +#include "Statistics.h" // Needed for theStats +#include "Logger.h" +#include +#include +#include "GuiEvents.h" // Needed for Notify_* +#include "SHAHashSet.h" // Needed for CAICHHash + + +#include "kademlia/kademlia/Kademlia.h" +#include "kademlia/kademlia/Search.h" +#include "ClientList.h" + +typedef std::deque KnownFileArray; + +/////////////////////////////////////////////////////////////////////////////// +// CPublishKeyword + +class CPublishKeyword +{ +public: + CPublishKeyword(const wxString& rstrKeyword) + { + m_strKeyword = rstrKeyword; + // min. keyword char is allowed to be < 3 in some cases (see also 'CSearchManager::getWords') + //ASSERT( rstrKeyword.GetLength() >= 3 ); + wxASSERT( !rstrKeyword.IsEmpty() ); + KadGetKeywordHash(rstrKeyword, &m_nKadID); + SetNextPublishTime(0); + SetPublishedCount(0); + } + + const Kademlia::CUInt128& GetKadID() const { return m_nKadID; } + const wxString& GetKeyword() const { return m_strKeyword; } + int GetRefCount() const { return m_aFiles.size(); } + const KnownFileArray& GetReferences() const { return m_aFiles; } + + uint32 GetNextPublishTime() const { return m_tNextPublishTime; } + void SetNextPublishTime(uint32 tNextPublishTime) { m_tNextPublishTime = tNextPublishTime; } + + uint32 GetPublishedCount() const { return m_uPublishedCount; } + void SetPublishedCount(uint32 uPublishedCount) { m_uPublishedCount = uPublishedCount; } + void IncPublishedCount() { m_uPublishedCount++; } + + bool AddRef(CKnownFile* pFile) { + if (std::find(m_aFiles.begin(), m_aFiles.end(), pFile) != m_aFiles.end()) { + wxASSERT(0); + return false; + } + m_aFiles.push_back(pFile); + return true; + } + + int RemoveRef(CKnownFile* pFile) { + KnownFileArray::iterator it = std::find(m_aFiles.begin(), m_aFiles.end(), pFile); + if (it != m_aFiles.end()) { + m_aFiles.erase(it); + } + return m_aFiles.size(); + } + + void RemoveAllReferences() { + m_aFiles.clear(); + } + + void RotateReferences(unsigned iRotateSize) { + wxCHECK_RET(m_aFiles.size(), wxT("RotateReferences: Rotating empty array")); + + unsigned shift = (iRotateSize % m_aFiles.size()); + std::rotate(m_aFiles.begin(), m_aFiles.begin() + shift, m_aFiles.end()); + } + +protected: + wxString m_strKeyword; + Kademlia::CUInt128 m_nKadID; + uint32 m_tNextPublishTime; + uint32 m_uPublishedCount; + KnownFileArray m_aFiles; +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CPublishKeywordList + +class CPublishKeywordList +{ +public: + CPublishKeywordList(); + ~CPublishKeywordList(); + + void AddKeywords(CKnownFile* pFile); + void RemoveKeywords(CKnownFile* pFile); + void RemoveAllKeywords(); + + void RemoveAllKeywordReferences(); + void PurgeUnreferencedKeywords(); + + int GetCount() const { return m_lstKeywords.size(); } + + CPublishKeyword* GetNextKeyword(); + void ResetNextKeyword(); + + uint32 GetNextPublishTime() const { return m_tNextPublishKeywordTime; } + void SetNextPublishTime(uint32 tNextPublishKeywordTime) { m_tNextPublishKeywordTime = tNextPublishKeywordTime; } + +protected: + // can't use a CMap - too many disadvantages in processing the 'list' + //CTypedPtrMap m_lstKeywords; + typedef std::list CKeyWordList; + CKeyWordList m_lstKeywords; + CKeyWordList::iterator m_posNextKeyword; + uint32 m_tNextPublishKeywordTime; + + CPublishKeyword* FindKeyword(const wxString& rstrKeyword, CKeyWordList::iterator* ppos = NULL); +}; + +CPublishKeywordList::CPublishKeywordList() +{ + ResetNextKeyword(); + SetNextPublishTime(0); +} + +CPublishKeywordList::~CPublishKeywordList() +{ + RemoveAllKeywords(); +} + +CPublishKeyword* CPublishKeywordList::GetNextKeyword() +{ + if (m_posNextKeyword == m_lstKeywords.end()) { + m_posNextKeyword = m_lstKeywords.begin(); + if (m_posNextKeyword == m_lstKeywords.end()) { + return NULL; + } + } + return *m_posNextKeyword++; +} + +void CPublishKeywordList::ResetNextKeyword() +{ + m_posNextKeyword = m_lstKeywords.begin(); +} + +CPublishKeyword* CPublishKeywordList::FindKeyword(const wxString& rstrKeyword, CKeyWordList::iterator* ppos) +{ + CKeyWordList::iterator it = m_lstKeywords.begin(); + for (; it != m_lstKeywords.end(); ++it) { + CPublishKeyword* pPubKw = *it; + if (pPubKw->GetKeyword() == rstrKeyword) { + if (ppos) { + (*ppos) = it; + } + + return pPubKw; + } + } + + return NULL; +} + +void CPublishKeywordList::AddKeywords(CKnownFile* pFile) +{ + const Kademlia::WordList& wordlist = pFile->GetKadKeywords(); + + Kademlia::WordList::const_iterator it; + for (it = wordlist.begin(); it != wordlist.end(); ++it) { + const wxString& strKeyword = *it; + CPublishKeyword* pPubKw = FindKeyword(strKeyword); + if (pPubKw == NULL) { + pPubKw = new CPublishKeyword(strKeyword); + m_lstKeywords.push_back(pPubKw); + SetNextPublishTime(0); + } + pPubKw->AddRef(pFile); + } +} + +void CPublishKeywordList::RemoveKeywords(CKnownFile* pFile) +{ + const Kademlia::WordList& wordlist = pFile->GetKadKeywords(); + Kademlia::WordList::const_iterator it; + for (it = wordlist.begin(); it != wordlist.end(); ++it) { + const wxString& strKeyword = *it; + CKeyWordList::iterator pos; + CPublishKeyword* pPubKw = FindKeyword(strKeyword, &pos); + if (pPubKw != NULL) { + if (pPubKw->RemoveRef(pFile) == 0) { + if (pos == m_posNextKeyword) { + ++m_posNextKeyword; + } + m_lstKeywords.erase(pos); + delete pPubKw; + SetNextPublishTime(0); + } + } + } +} + + +void CPublishKeywordList::RemoveAllKeywords() +{ + DeleteContents(m_lstKeywords); + ResetNextKeyword(); + SetNextPublishTime(0); +} + + +void CPublishKeywordList::RemoveAllKeywordReferences() +{ + CKeyWordList::iterator it = m_lstKeywords.begin(); + for (; it != m_lstKeywords.end(); ++it) { + (*it)->RemoveAllReferences(); + } +} + + +void CPublishKeywordList::PurgeUnreferencedKeywords() +{ + CKeyWordList::iterator it = m_lstKeywords.begin(); + while (it != m_lstKeywords.end()) { + CPublishKeyword* pPubKw = *it; + if (pPubKw->GetRefCount() == 0) { + if (it == m_posNextKeyword) { + ++m_posNextKeyword; + } + m_lstKeywords.erase(it++); + delete pPubKw; + SetNextPublishTime(0); + } else { + ++it; + } + } +} + + +CSharedFileList::CSharedFileList(CKnownFileList* in_filelist){ + filelist = in_filelist; + reloading = false; + m_lastPublishED2K = 0; + m_lastPublishED2KFlag = true; + /* Kad Stuff */ + m_keywords = new CPublishKeywordList; + m_currFileSrc = 0; + m_currFileNotes = 0; + m_lastPublishKadSrc = 0; + m_lastPublishKadNotes = 0; + m_currFileKey = 0; +} + + +CSharedFileList::~CSharedFileList() +{ + delete m_keywords; +} + + +void CSharedFileList::FindSharedFiles() +{ + /* Abort loading if we are shutting down. */ + if(theApp->IsOnShutDown()) { + return; + } + + // Clear statistics. + theStats::ClearSharedFilesInfo(); + + // Reload shareddir.dat + theApp->glob_prefs->ReloadSharedFolders(); + + { + wxMutexLocker lock(list_mut); + m_Files_map.clear(); + } + + // All part files are automatically shared. + for ( uint32 i = 0; i < theApp->downloadqueue->GetFileCount(); ++i ) { + CPartFile* file = theApp->downloadqueue->GetFileByIndex( i ); + + if ( file->GetStatus(true) == PS_READY ) { + printf("Adding file %s to shares\n", + (const char *)unicode2char(file->GetFullName().GetPrintable())); + AddFile(file); + } + } + + // Create a list of all shared paths and weed out duplicates. + std::list sharedPaths; + + // Global incoming dir and all category incoming directories are automatically shared. + sharedPaths.push_back(thePrefs::GetIncomingDir()); + for (unsigned int i = 1;i < theApp->glob_prefs->GetCatCount(); ++i) { + sharedPaths.push_back(theApp->glob_prefs->GetCatPath(i)); + } + + const thePrefs::PathList& shared = theApp->glob_prefs->shareddir_list; + sharedPaths.insert(sharedPaths.end(), shared.begin(), shared.end()); + + sharedPaths.sort(); + sharedPaths.unique(); + + unsigned addedFiles = 0; + std::list::iterator it = sharedPaths.begin(); + for (; it != sharedPaths.end(); ++it) { + addedFiles += AddFilesFromDirectory(*it); + } + + if (addedFiles == 0) { + AddLogLineM(false, wxString::Format(wxPLURAL("Found %i known shared file", "Found %i known shared files", GetCount()), GetCount())); + + // Make sure the AICH-hashes are up to date. + CThreadScheduler::AddTask(new CAICHSyncTask()); + } else { + // New files, AICH thread will be run at the end of the hashing thread. + AddLogLineM(false, wxString::Format(wxPLURAL("Found %i known shared file, %i unknown", "Found %i known shared files, %i unknown", GetCount()), GetCount(), addedFiles)); + } +} + + +// Checks if the dir a is the same as b. If they are, then logs the message and returns true. +bool CheckDirectory(const wxString& a, const CPath& b) +{ + if (CPath(a).IsSameDir(b)) { + AddLogLineM(true, CFormat( _("ERROR! Attempted to share %s") ) % a); + + return true; + } + + return false; +} + + +unsigned CSharedFileList::AddFilesFromDirectory(const CPath& directory) +{ + // Do not allow these folders to be shared: + // - The .aMule folder + // - The Temp folder + // - The users home-dir + if (CheckDirectory(wxGetHomeDir(), directory)) { + return 0; + } else if (CheckDirectory(theApp->ConfigDir, directory)) { + return 0; + } else if (CheckDirectory(thePrefs::GetTempDir().GetRaw(), directory)) { + return 0; + } + + if (!directory.DirExists()) { + printf("Shared directory not found, skipping: %s\n", + (const char *)unicode2char(directory.GetPrintable())); + + return 0; + } + + CDirIterator::FileType searchFor = CDirIterator::FileNoHidden; + if (thePrefs::ShareHiddenFiles()) { + searchFor = CDirIterator::File; + } + + unsigned knownFiles = 0; + unsigned addedFiles = 0; + + CDirIterator SharedDir(directory); + + CPath fname = SharedDir.GetFirstFile(searchFor); + while (fname.IsOk()) { + CPath fullPath = directory.JoinPaths(fname); + + if (!fullPath.FileExists()) { + AddDebugLogLineM(false, logKnownFiles, + CFormat(wxT("Shared file does not exist (possibly a broken link): %s")) % fullPath); + + fname = SharedDir.GetNextFile(); + continue; + } + + AddDebugLogLineM(false, logKnownFiles, + CFormat(wxT("Found shared file: %s")) % fullPath); + + time_t fdate = CPath::GetModificationTime(fullPath); + sint64 fsize = fullPath.GetFileSize(); + + // This will also catch files with too strict permissions. + if ((fdate == (time_t)-1) || (fsize == wxInvalidOffset)) { + AddDebugLogLineM(false, logKnownFiles, + CFormat(wxT("Failed to retrive modification time or size for '%s', skipping.")) % fullPath); + + fname = SharedDir.GetNextFile(); + continue; + } + + + CKnownFile* toadd = filelist->FindKnownFile(fname, fdate, fsize); + if (toadd) { + knownFiles++; + if (AddFile(toadd)) { + AddDebugLogLineM(false, logKnownFiles, + CFormat(wxT("Added known file '%s' to shares")) + % fname); + + toadd->SetFilePath(directory); + } else { + AddDebugLogLineM(false, logKnownFiles, + CFormat(wxT("File already shared, skipping: %s")) + % fname); + } + } else { + //not in knownfilelist - start adding thread to hash file + AddDebugLogLineM(false, logKnownFiles, + CFormat(wxT("Hashing new unknown shared file '%s'")) % fname); + + if (CThreadScheduler::AddTask(new CHashingTask(directory, fname))) { + addedFiles++; + } + } + + fname = SharedDir.GetNextFile(); + } + + if ((addedFiles == 0) && (knownFiles == 0)) { + printf("No shareable files found in directory: %s\n", + (const char *)unicode2char(directory.GetPrintable())); + } + + return addedFiles; +} + + +bool CSharedFileList::AddFile(CKnownFile* pFile) +{ + wxASSERT(pFile->GetHashCount() == pFile->GetED2KPartHashCount()); + + wxMutexLocker lock(list_mut); + + CKnownFileMap::value_type entry(pFile->GetFileHash(), pFile); + if (m_Files_map.insert(entry).second) { + /* Keywords to publish on Kad */ + m_keywords->AddKeywords(pFile); + theStats::AddSharedFile(pFile->GetFileSize()); + return true; + } + return false; +} + + +void CSharedFileList::SafeAddKFile(CKnownFile* toadd, bool bOnlyAdd) +{ + // TODO: Check if the file is already known - only with another date + + if (AddFile(toadd)) { + Notify_SharedFilesShowFile(toadd); + } + + if (!bOnlyAdd && theApp->IsConnectedED2K()) { + // Publishing of files is not anymore handled here. + // Instead, the timer does it by itself. + m_lastPublishED2KFlag = true; + } +} + + +// removes first occurrence of 'toremove' in 'list' +void CSharedFileList::RemoveFile(CKnownFile* toremove){ + Notify_SharedFilesRemoveFile(toremove); + wxMutexLocker lock(list_mut); + if (m_Files_map.erase(toremove->GetFileHash()) > 0) { + theStats::RemoveSharedFile(toremove->GetFileSize()); + } + /* This file keywords must not be published to kad anymore */ + m_keywords->RemoveKeywords(toremove); +} + + +void CSharedFileList::Reload() +{ + // Madcat - Disable reloading if reloading already in progress. + // Kry - Fixed to let non-english language users use the 'Reload' button :P + // deltaHF - removed the old ugly button and changed the code to use the new small one + // Kry - bah, let's use a var. + if (!reloading) { + reloading = true; + Notify_SharedFilesRemoveAllItems(); + + /* All Kad keywords must be removed */ + m_keywords->RemoveAllKeywordReferences(); + + FindSharedFiles(); + + /* And now the unreferenced keywords must be removed also */ + m_keywords->PurgeUnreferencedKeywords(); + + Notify_SharedFilesShowFileList(); + + reloading = false; + } +} + + +const CKnownFile *CSharedFileList::GetFileByIndex(unsigned int index) const +{ + wxMutexLocker lock(list_mut); + if ( index >= m_Files_map.size() ) { + return NULL; + } + CKnownFileMap::const_iterator pos = m_Files_map.begin(); + std::advance(pos, index); + return pos->second; +} + + +CKnownFile* CSharedFileList::GetFileByID(const CMD4Hash& filehash) +{ + wxMutexLocker lock(list_mut); + CKnownFileMap::iterator it = m_Files_map.find(filehash); + + if ( it != m_Files_map.end() ) { + return it->second; + } else { + return NULL; + } +} + +short CSharedFileList::GetFilePriorityByID(const CMD4Hash& filehash) +{ + CKnownFile* tocheck = GetFileByID(filehash); + if (tocheck) + return tocheck->GetUpPriority(); + else + return -10; // file doesn't exist +} + + +void CSharedFileList::CopyFileList(std::vector& out_list) +{ + wxMutexLocker lock(list_mut); + + out_list.reserve(m_Files_map.size()); + for ( + CKnownFileMap::iterator it = m_Files_map.begin(); + it != m_Files_map.end(); + ++it + ) { + out_list.push_back(it->second); + } +} + + + +void CSharedFileList::UpdateItem(CKnownFile* toupdate) +{ + Notify_SharedFilesUpdateItem(toupdate); +} + + +void CSharedFileList::GetSharedFilesByDirectory(const wxString& directory, + CKnownFilePtrList& list) +{ + wxMutexLocker lock(list_mut); + + const CPath dir = CPath(directory); + for (CKnownFileMap::iterator pos = m_Files_map.begin(); + pos != m_Files_map.end(); ++pos ) { + CKnownFile *cur_file = pos->second; + + if (dir.IsSameDir(cur_file->GetFilePath())) { + continue; + } + + list.push_back(cur_file); + } +} + +/* ---------------- Network ----------------- */ + +void CSharedFileList::ClearED2KPublishInfo(){ + CKnownFile* cur_file; + m_lastPublishED2KFlag = true; + wxMutexLocker lock(list_mut); + for (CKnownFileMap::iterator pos = m_Files_map.begin(); pos != m_Files_map.end(); ++pos ) { + cur_file = pos->second; + cur_file->SetPublishedED2K(false); + } +} + +void CSharedFileList::ClearKadSourcePublishInfo() +{ + wxMutexLocker lock(list_mut); + CKnownFile* cur_file; + for (CKnownFileMap::iterator pos = m_Files_map.begin(); pos != m_Files_map.end(); ++pos ) { + cur_file = pos->second; + cur_file->SetLastPublishTimeKadSrc(0,0); + } +} + +void CSharedFileList::RepublishFile(CKnownFile* pFile) +{ + CServer* server = theApp->serverconnect->GetCurrentServer(); + if (server && (server->GetTCPFlags() & SRV_TCPFLG_COMPRESSION)) { + m_lastPublishED2KFlag = true; + pFile->SetPublishedED2K(false); // FIXME: this creates a wrong 'No' for the ed2k shared info in the listview until the file is shared again. + } +} + +uint8 GetRealPrio(uint8 in) +{ + switch(in) { + case 4 : return 0; + case 0 : return 1; + case 1 : return 2; + case 2 : return 3; + case 3 : return 4; + } + return 0; +} + +bool SortFunc( const CKnownFile* fileA, const CKnownFile* fileB ) +{ + return GetRealPrio(fileA->GetUpPriority()) < GetRealPrio(fileB->GetUpPriority()); +} + +void CSharedFileList::SendListToServer(){ + std::vector SortedList; + + { + wxMutexLocker lock(list_mut); + + if (m_Files_map.empty() || !theApp->IsConnectedED2K() ) { + return; + } + + // Getting a sorted list of the non-published files. + SortedList.reserve( m_Files_map.size() ); + + CKnownFileMap::iterator it = m_Files_map.begin(); + for ( ; it != m_Files_map.end(); ++it ) { + if (!it->second->GetPublishedED2K()) { + SortedList.push_back( it->second ); + } + } + } + + std::sort( SortedList.begin(), SortedList.end(), SortFunc ); + + // Limits for the server. + + CServer* server = theApp->serverconnect->GetCurrentServer(); + + uint32 limit = server ? server->GetSoftFiles() : 0; + if( limit == 0 || limit > 200 ) { + limit = 200; + } + + if( (uint32)SortedList.size() < limit ) { + limit = SortedList.size(); + if (limit == 0) { + m_lastPublishED2KFlag = false; + return; + } + } + + CMemFile files; + + // Files sent. + files.WriteUInt32(limit); + + uint16 count = 0; + // Add to packet + std::vector::iterator sorted_it = SortedList.begin(); + for ( ; (sorted_it != SortedList.end()) && (count < limit); ++sorted_it ) { + CKnownFile* file = *sorted_it; + if (!file->IsLargeFile() || (server && server->SupportsLargeFilesTCP())) { + CreateOfferedFilePacket(file, &files, server, NULL); + } + file->SetPublishedED2K(true); + ++count; + } + + wxASSERT(count == limit); + + CPacket* packet = new CPacket(files, OP_EDONKEYPROT, OP_OFFERFILES); + // compress packet + // - this kind of data is highly compressable (N * (1 MD4 and at least 3 string meta data tags and 1 integer meta data tag)) + // - the min. amount of data needed for one published file is ~100 bytes + // - this function is called once when connecting to a server and when a file becomes shareable - so, it's called rarely. + // - if the compressed size is still >= the original size, we send the uncompressed packet + // therefor we always try to compress the packet + if (server->GetTCPFlags() & SRV_TCPFLG_COMPRESSION){ + packet->PackPacket(); + } + + theStats::AddUpOverheadServer(packet->GetPacketSize()); + theApp->serverconnect->SendPacket(packet,true); +} + + +void CSharedFileList::CreateOfferedFilePacket( + CKnownFile *cur_file, + CMemFile *files, + CServer *pServer, + CUpDownClient *pClient) { + + // This function is used for offering files to the local server and for sending + // shared files to some other client. In each case we send our IP+Port only, if + // we have a HighID. + + wxASSERT(!(pClient && pServer)); + + cur_file->SetPublishedED2K(true); + files->WriteHash(cur_file->GetFileHash()); + + uint32 nClientID = 0; + uint16 nClientPort = 0; + + if (pServer) { + if (pServer->GetTCPFlags() & SRV_TCPFLG_COMPRESSION) { + #define FILE_COMPLETE_ID 0xfbfbfbfb + #define FILE_COMPLETE_PORT 0xfbfb + #define FILE_INCOMPLETE_ID 0xfcfcfcfc + #define FILE_INCOMPLETE_PORT 0xfcfc + // complete file: ip 251.251.251 (0xfbfbfbfb) port 0xfbfb + // incomplete file: op 252.252.252 (0xfcfcfcfc) port 0xfcfc + if (cur_file->GetStatus() == PS_COMPLETE) { + nClientID = FILE_COMPLETE_ID; + nClientPort = FILE_COMPLETE_PORT; + } else { + nClientID = FILE_INCOMPLETE_ID; + nClientPort = FILE_INCOMPLETE_PORT; + } + } else { + if (theApp->IsConnectedED2K() && !::IsLowID(theApp->GetED2KID())){ + nClientID = theApp->GetID(); + nClientPort = thePrefs::GetPort(); + } + } + } else { + // Do not merge this with the above case - this one + // also checks Kad status. + if (theApp->IsConnected() && !theApp->IsFirewalled()) { + nClientID = theApp->GetID(); + nClientPort = thePrefs::GetPort(); + } + } + + files->WriteUInt32(nClientID); + files->WriteUInt16(nClientPort); + + TagPtrList tags; + + // The printable filename is used because it's destined for another user. + tags.push_back(new CTagString(FT_FILENAME, cur_file->GetFileName().GetPrintable())); + + if (pClient && pClient->GetVBTTags()) { + tags.push_back(new CTagVarInt(FT_FILESIZE, cur_file->GetFileSize())); + } else { + if (!cur_file->IsLargeFile()){ + tags.push_back(new CTagInt32(FT_FILESIZE, cur_file->GetFileSize())); + } else { + // Large file + // we send 2*32 bit tags to servers, but a real 64 bit tag to other clients. + if (pServer) { + if (!pServer->SupportsLargeFilesTCP()){ + wxASSERT( false ); + tags.push_back(new CTagInt32(FT_FILESIZE, 0)); + }else { + tags.push_back(new CTagInt32(FT_FILESIZE, (uint32)cur_file->GetFileSize())); + tags.push_back(new CTagInt32(FT_FILESIZE_HI, (uint32)(cur_file->GetFileSize() >> 32))); + } + } else { + if (!pClient->SupportsLargeFiles()) { + wxASSERT( false ); + tags.push_back(new CTagInt32(FT_FILESIZE, 0)); + } else { + tags.push_back(new CTagInt64(FT_FILESIZE, cur_file->GetFileSize())); + } + } + } + } + + if (cur_file->GetFileRating()) { + tags.push_back(new CTagVarInt(FT_FILERATING, cur_file->GetFileRating(), (pClient && pClient->GetVBTTags()) ? 0 : 32)); + } + + // NOTE: Archives and CD-Images are published+searched with file type "Pro" + bool bAddedFileType = false; + if (pServer && (pServer->GetTCPFlags() & SRV_TCPFLG_TYPETAGINTEGER)) { + // Send integer file type tags to newer servers + EED2KFileType eFileType = GetED2KFileTypeSearchID(GetED2KFileTypeID(cur_file->GetFileName())); + if (eFileType >= ED2KFT_AUDIO && eFileType <= ED2KFT_CDIMAGE) { + tags.push_back(new CTagInt32(FT_FILETYPE, eFileType)); + bAddedFileType = true; + } + } + if (!bAddedFileType) { + // Send string file type tags to: + // - newer servers, in case there is no integer type available for the file type (e.g. emulecollection) + // - older servers + // - all clients + wxString strED2KFileType(GetED2KFileTypeSearchTerm(GetED2KFileTypeID(cur_file->GetFileName()))); + if (!strED2KFileType.IsEmpty()) { + tags.push_back(new CTagString(FT_FILETYPE, strED2KFileType)); + } + } + + // There, we could add MetaData info, if we ever get to have that. + + EUtf8Str eStrEncode; + + bool unicode_support = + // eservers that support UNICODE. + (pServer && (pServer->GetUnicodeSupport())) + || + // clients that support unicode + (pClient && pClient->GetUnicodeSupport()); + eStrEncode = unicode_support ? utf8strRaw : utf8strNone; + + files->WriteUInt32(tags.size()); + + // Sadly, eMule doesn't use a MISCOPTIONS flag on hello packet for this, so we + // have to identify the support for new tags by version. + bool new_ed2k = + // eMule client > 0.42f + (pClient && pClient->IsEmuleClient() && pClient->GetVersion() >= MAKE_CLIENT_VERSION(0,42,7)) + || + // aMule >= 2.0.0rc8. Sadly, there's no way to check the rcN number, so I checked + // the rc8 changelog. On rc8 OSInfo was introduced, so... + (pClient && pClient->GetClientSoft() == SO_AMULE && !pClient->GetClientOSInfo().IsEmpty()) + || + // eservers use a flag for this, at least. + (pServer && (pServer->GetTCPFlags() & SRV_TCPFLG_NEWTAGS)); + + for (TagPtrList::iterator it = tags.begin(); it != tags.end(); ++it ) { + CTag* pTag = *it; + if (new_ed2k) { + pTag->WriteNewEd2kTag(files, eStrEncode); + } else { + pTag->WriteTagToFile(files, eStrEncode); + } + delete pTag; + } +} + + +void CSharedFileList::Process() +{ + Publish(); + if( !m_lastPublishED2KFlag || ( ::GetTickCount() - m_lastPublishED2K < ED2KREPUBLISHTIME ) ) { + return; + } + SendListToServer(); + m_lastPublishED2K = ::GetTickCount(); +} + +void CSharedFileList::Publish() +{ + // Variables to save cpu. + unsigned int tNow = time(NULL); + bool IsFirewalled = theApp->IsFirewalled(); + + if( Kademlia::CKademlia::IsConnected() && ( !IsFirewalled || ( IsFirewalled && theApp->clientlist->GetBuddyStatus() == Connected)) && GetCount() && Kademlia::CKademlia::GetPublish()) { + //We are connected to Kad. We are either open or have a buddy. And Kad is ready to start publishing. + + if( Kademlia::CKademlia::GetTotalStoreKey() < KADEMLIATOTALSTOREKEY) { + + //We are not at the max simultaneous keyword publishes + if (tNow >= m_keywords->GetNextPublishTime()) { + + //Enough time has passed since last keyword publish + + //Get the next keyword which has to be (re)-published + CPublishKeyword* pPubKw = m_keywords->GetNextKeyword(); + if (pPubKw) { + + //We have the next keyword to check if it can be published + + //Debug check to make sure things are going well. + wxASSERT( pPubKw->GetRefCount() != 0 ); + + if (tNow >= pPubKw->GetNextPublishTime()) { + //This keyword can be published. + Kademlia::CSearch* pSearch = Kademlia::CSearchManager::PrepareLookup(Kademlia::CSearch::STOREKEYWORD, false, pPubKw->GetKadID()); + if (pSearch) { + //pSearch was created. Which means no search was already being done with this HashID. + //This also means that it was checked to see if network load wasn't a factor. + + //This sets the filename into the search object so we can show it in the gui. + pSearch->SetFileName(pPubKw->GetKeyword()); + + //Add all file IDs which relate to the current keyword to be published + const KnownFileArray& aFiles = pPubKw->GetReferences(); + uint32 count = 0; + for (unsigned int f = 0; f < aFiles.size(); ++f) { + + //Only publish complete files as someone else should have the full file to publish these keywords. + //As a side effect, this may help reduce people finding incomplete files in the network. + if( !aFiles[f]->IsPartFile() ) { + count++; + pSearch->AddFileID(Kademlia::CUInt128(aFiles[f]->GetFileHash().GetHash())); + if( count > 150 ) { + //We only publish up to 150 files per keyword publish then rotate the list. + pPubKw->RotateReferences(f); + break; + } + } + } + + if( count ) { + //Start our keyword publish + pPubKw->SetNextPublishTime(tNow+(KADEMLIAREPUBLISHTIMEK)); + pPubKw->IncPublishedCount(); + Kademlia::CSearchManager::StartSearch(pSearch); + } else { + //There were no valid files to publish with this keyword. + delete pSearch; + } + } + } + } + m_keywords->SetNextPublishTime(KADEMLIAPUBLISHTIME+tNow); + } + } + + if( Kademlia::CKademlia::GetTotalStoreSrc() < KADEMLIATOTALSTORESRC) { + if(tNow >= m_lastPublishKadSrc) { + if(m_currFileSrc > GetCount()) { + m_currFileSrc = 0; + } + CKnownFile* pCurKnownFile = const_cast(GetFileByIndex(m_currFileSrc)); + if(pCurKnownFile) { + if(pCurKnownFile->PublishSrc()) { + Kademlia::CUInt128 kadFileID; + kadFileID.SetValueBE(pCurKnownFile->GetFileHash().GetHash()); + if(Kademlia::CSearchManager::PrepareLookup(Kademlia::CSearch::STOREFILE, true, kadFileID )==NULL) { + pCurKnownFile->SetLastPublishTimeKadSrc(0,0); + } + } + } + m_currFileSrc++; + + // even if we did not publish a source, reset the timer so that this list is processed + // only every KADEMLIAPUBLISHTIME seconds. + m_lastPublishKadSrc = KADEMLIAPUBLISHTIME+tNow; + } + } + + if( Kademlia::CKademlia::GetTotalStoreNotes() < KADEMLIATOTALSTORENOTES) { + if(tNow >= m_lastPublishKadNotes) { + if(m_currFileNotes > GetCount()) { + m_currFileNotes = 0; + } + CKnownFile* pCurKnownFile = const_cast(GetFileByIndex(m_currFileNotes)); + if(pCurKnownFile) { + if(pCurKnownFile->PublishNotes()) { + Kademlia::CUInt128 kadFileID; + kadFileID.SetValueBE(pCurKnownFile->GetFileHash().GetHash()); + if(Kademlia::CSearchManager::PrepareLookup(Kademlia::CSearch::STORENOTES, true, kadFileID )==NULL) + pCurKnownFile->SetLastPublishTimeKadNotes(0); + } + } + m_currFileNotes++; + + // even if we did not publish a source, reset the timer so that this list is processed + // only every KADEMLIAPUBLISHTIME seconds. + m_lastPublishKadNotes = KADEMLIAPUBLISHTIME+tNow; + } + } + } +} + + +void CSharedFileList::AddKeywords(CKnownFile* pFile) +{ + m_keywords->AddKeywords(pFile); +} + + +void CSharedFileList::RemoveKeywords(CKnownFile* pFile) +{ + m_keywords->RemoveKeywords(pFile); +} + + +bool CSharedFileList::RenameFile(CKnownFile* file, const CPath& newName) +{ + if (file->IsPartFile()) { + CPartFile* pfile = dynamic_cast(file); + + if (file->GetStatus() != PS_COMPLETING) { + pfile->SetFileName(newName); + pfile->SavePartFile(); + + Notify_SharedFilesUpdateItem(file); + Notify_DownloadCtrlUpdateItem(file); + + return true; + } + } else { +//#warning Renaming of completed files causes problems on kad. Enable when reviewed. +#if 0 + wxString oldPath = JoinPaths(file->GetFilePath(), file->GetFileName()); + wxString newPath = JoinPaths(file->GetFilePath(), newName); + + if (UTF8_MoveFile(oldPath, newPath)) { + RemoveKeywords(file); + file->SetFileName(newName); + AddKeywords(file); + theApp->knownfiles->Save(); + UpdateItem(file); + RepublishFile(file); + + Notify_DownloadCtrlUpdateItem(file); + Notify_SharedFilesUpdateItem(file); + + return true; + } +#endif + } + + return false; +} + + +void CSharedFileList::CheckAICHHashes(const std::list& hashes) +{ + wxMutexLocker locker(list_mut); + + // Now we check that all files which are in the sharedfilelist have a + // corresponding hash in our list. Those how don't are queued for hashing. + CKnownFileMap::iterator it = m_Files_map.begin(); + for (; it != m_Files_map.end(); ++it) { + const CKnownFile* file = it->second; + + if (file->IsPartFile() == false) { + CAICHHashSet* hashset = file->GetAICHHashset(); + + if (hashset->GetStatus() == AICH_HASHSETCOMPLETE) { + if (std::find(hashes.begin(), hashes.end(), hashset->GetMasterHash()) != hashes.end()) { + continue; + } + } + + hashset->SetStatus(AICH_ERROR); + + CThreadScheduler::AddTask(new CHashingTask(file)); + } + } + +} + +// File_checked_for_headers diff --git a/src/SharedFileList.h b/src/SharedFileList.h new file mode 100644 index 00000000..8f98db1f --- /dev/null +++ b/src/SharedFileList.h @@ -0,0 +1,110 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef SHAREDFILELIST_H +#define SHAREDFILELIST_H + +#include +#include // Needed for wxMutex + +#include "Types.h" // Needed for uint16 and uint64 + +struct UnknownFile_Struct; + +class CKnownFileList; +class CKnownFile; +class CMemFile; +class CMD4Hash; +class CServer; +class CUpDownClient; +class CPublishKeywordList; +class CPath; +class CAICHHash; + + +typedef std::map CKnownFileMap; + +class CSharedFileList { +public: + CSharedFileList(CKnownFileList* in_filelist); + ~CSharedFileList(); + void Reload(); + void SafeAddKFile(CKnownFile* toadd, bool bOnlyAdd = false); + void RemoveFile(CKnownFile* toremove); + CKnownFile* GetFileByID(const CMD4Hash& filehash); + short GetFilePriorityByID(const CMD4Hash& filehash); + const CKnownFile* GetFileByIndex(unsigned int index) const; + void CreateOfferedFilePacket(CKnownFile* cur_file, CMemFile* files, CServer* pServer, CUpDownClient* pClient); + uint32 GetCount() { wxMutexLocker lock(list_mut); return m_Files_map.size(); } + uint32 GetFileCount() { wxMutexLocker lock(list_mut); return m_Files_map.size(); } + void CopyFileList(std::vector& out_list); + void UpdateItem(CKnownFile* toupdate); + unsigned AddFilesFromDirectory(const CPath& directory); + void GetSharedFilesByDirectory(const wxString& directory, CKnownFilePtrList& list); + void ClearED2KPublishInfo(); + void RepublishFile(CKnownFile* pFile); + void Process(); + void PublishNextTurn() { m_lastPublishED2KFlag = true; } + bool RenameFile(CKnownFile* pFile, const CPath& newName); + + /* Kad Stuff */ + void Publish(); + void AddKeywords(CKnownFile* pFile); + void RemoveKeywords(CKnownFile* pFile); + // This is actually unused, but keep it here - will be needed later. + void ClearKadSourcePublishInfo(); + + /** + * Checks for files which missing or wrong AICH hashes. + * Those that are found are scheduled for ACIH hashing. + */ + void CheckAICHHashes(const std::list& hashes); + +private: + bool AddFile(CKnownFile* pFile); + void FindSharedFiles(); + bool reloading; + + void SendListToServer(); + uint32 m_lastPublishED2K; + bool m_lastPublishED2KFlag; + + CKnownFileList* filelist; + + CKnownFileMap m_Files_map; + mutable wxMutex list_mut; + + + /* Kad Stuff */ + CPublishKeywordList* m_keywords; + unsigned int m_currFileSrc; + unsigned int m_currFileNotes; + unsigned int m_currFileKey; + uint32 m_lastPublishKadSrc; + uint32 m_lastPublishKadNotes; +}; + +#endif // SHAREDFILELIST_H +// File_checked_for_headers diff --git a/src/SharedFilesCtrl.cpp b/src/SharedFilesCtrl.cpp new file mode 100644 index 00000000..c6181add --- /dev/null +++ b/src/SharedFilesCtrl.cpp @@ -0,0 +1,731 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "SharedFilesCtrl.h" // Interface declarations + +#include + +#include "muuli_wdr.h" // Needed for ID_SHFILELIST +#include "SharedFilesWnd.h" // Needed for CSharedFilesWnd +#include "amuleDlg.h" // Needed for CamuleDlg +#include "CommentDialog.h" // Needed for CCommentDialog +#include "PartFile.h" // Needed for CPartFile +#include "SharedFileList.h" // Needed for CKnownFileMap +#include "amule.h" // Needed for theApp +#include "ServerConnect.h" // Needed for CServerConnect +#include "Preferences.h" // Needed for thePrefs +#include "BarShader.h" // Needed for CBarShader +#include "DataToText.h" // Needed for PriorityToStr +#include "GuiEvents.h" // Needed for CoreNotify_* +#include "MuleCollection.h" // Needed for CMuleCollection +#include "DownloadQueue.h" // Needed for CDownloadQueue +#include "TransferWnd.h" // Needed for CTransferWnd + + +BEGIN_EVENT_TABLE(CSharedFilesCtrl,CMuleListCtrl) + EVT_LIST_ITEM_RIGHT_CLICK(-1, CSharedFilesCtrl::OnRightClick) + + EVT_MENU( MP_PRIOVERYLOW, CSharedFilesCtrl::OnSetPriority ) + EVT_MENU( MP_PRIOLOW, CSharedFilesCtrl::OnSetPriority ) + EVT_MENU( MP_PRIONORMAL, CSharedFilesCtrl::OnSetPriority ) + EVT_MENU( MP_PRIOHIGH, CSharedFilesCtrl::OnSetPriority ) + EVT_MENU( MP_PRIOVERYHIGH, CSharedFilesCtrl::OnSetPriority ) + EVT_MENU( MP_POWERSHARE, CSharedFilesCtrl::OnSetPriority ) + EVT_MENU( MP_PRIOAUTO, CSharedFilesCtrl::OnSetPriorityAuto ) + + EVT_MENU( MP_CMT, CSharedFilesCtrl::OnEditComment ) + EVT_MENU( MP_RAZORSTATS, CSharedFilesCtrl::OnGetRazorStats ) + EVT_MENU( MP_ADDCOLLECTION, CSharedFilesCtrl::OnAddCollection ) + EVT_MENU( MP_GETMAGNETLINK, CSharedFilesCtrl::OnCreateURI ) + EVT_MENU( MP_GETED2KLINK, CSharedFilesCtrl::OnCreateURI ) + EVT_MENU( MP_GETSOURCEED2KLINK, CSharedFilesCtrl::OnCreateURI ) + EVT_MENU( MP_GETCRYPTSOURCEDED2KLINK, CSharedFilesCtrl::OnCreateURI ) + EVT_MENU( MP_GETHOSTNAMESOURCEED2KLINK, CSharedFilesCtrl::OnCreateURI ) + EVT_MENU( MP_GETHOSTNAMECRYPTSOURCEED2KLINK, CSharedFilesCtrl::OnCreateURI ) + EVT_MENU( MP_GETAICHED2KLINK, CSharedFilesCtrl::OnCreateURI ) + EVT_MENU( MP_RENAME, CSharedFilesCtrl::OnRename ) + EVT_MENU( MP_WS, CSharedFilesCtrl::OnGetFeedback ) + + + EVT_CHAR( CSharedFilesCtrl::OnKeyPressed ) +END_EVENT_TABLE() + +enum SharedFilesListColumns { + ID_SHARED_COL_NAME = 0, + ID_SHARED_COL_SIZE, + ID_SHARED_COL_TYPE, + ID_SHARED_COL_PRIO, + ID_SHARED_COL_ID, + ID_SHARED_COL_REQ, + ID_SHARED_COL_AREQ, + ID_SHARED_COL_TRA, + ID_SHARED_COL_RTIO, + ID_SHARED_COL_PART, + ID_SHARED_COL_CMPL, + ID_SHARED_COL_PATH +}; + + +CSharedFilesCtrl::CSharedFilesCtrl(wxWindow* parent, int id, const wxPoint& pos, wxSize size, int flags) + : CMuleListCtrl(parent, id, pos, size, flags | wxLC_OWNERDRAW ) +{ + // Setting the sorter function. + SetSortFunc( SortProc ); + + // Set the table-name (for loading and saving preferences). + SetTableName( wxT("Shared") ); + + m_menu=NULL; + + InsertColumn(ID_SHARED_COL_NAME, _("File Name"), wxLIST_FORMAT_LEFT, 250); + InsertColumn(ID_SHARED_COL_SIZE, _("Size"), wxLIST_FORMAT_LEFT, 100); + InsertColumn(ID_SHARED_COL_TYPE, _("Type"), wxLIST_FORMAT_LEFT, 50); + InsertColumn(ID_SHARED_COL_PRIO, _("Priority"), wxLIST_FORMAT_LEFT, 70); + InsertColumn(ID_SHARED_COL_ID, _("FileID"), wxLIST_FORMAT_LEFT, 220); + InsertColumn(ID_SHARED_COL_REQ, _("Requests"), wxLIST_FORMAT_LEFT, 100); + InsertColumn(ID_SHARED_COL_AREQ, _("Accepted Requests"), wxLIST_FORMAT_LEFT, 100); + InsertColumn(ID_SHARED_COL_TRA, _("Transferred Data"), wxLIST_FORMAT_LEFT, 120); + InsertColumn(ID_SHARED_COL_RTIO, _("Share Ratio"), wxLIST_FORMAT_LEFT, 100); + InsertColumn(ID_SHARED_COL_PART, _("Obtained Parts"), wxLIST_FORMAT_LEFT, 120); + InsertColumn(ID_SHARED_COL_CMPL, _("Complete Sources"), wxLIST_FORMAT_LEFT, 120); + InsertColumn(ID_SHARED_COL_PATH, _("Directory Path"), wxLIST_FORMAT_LEFT, 220); + + LoadSettings(); +} + + +CSharedFilesCtrl::~CSharedFilesCtrl() +{ + +} + + +void CSharedFilesCtrl::OnRightClick(wxListEvent& event) +{ + long item_hit = CheckSelection(event); + + if ( (m_menu == NULL) && (item_hit != -1)) { + m_menu = new wxMenu(_("Shared Files")); + wxMenu* prioMenu = new wxMenu(); + prioMenu->Append(MP_PRIOVERYLOW, _("Very low")); + prioMenu->Append(MP_PRIOLOW, _("Low")); + prioMenu->Append(MP_PRIONORMAL, _("Normal")); + prioMenu->Append(MP_PRIOHIGH, _("High")); + prioMenu->Append(MP_PRIOVERYHIGH, _("Very High")); + prioMenu->Append(MP_POWERSHARE, _("Release")); + prioMenu->Append(MP_PRIOAUTO, _("Auto")); + + m_menu->Append(0,_("Priority"),prioMenu); + m_menu->AppendSeparator(); + + CKnownFile* file = (CKnownFile*)GetItemData(item_hit); + if (file->GetFileComment().IsEmpty() && !file->GetFileRating()) { + m_menu->Append(MP_CMT, _("Add Comment/Rating")); + } else { + m_menu->Append(MP_CMT, _("Edit Comment/Rating")); + } + + m_menu->AppendSeparator(); + m_menu->Append(MP_RENAME, _("Rename")); + m_menu->AppendSeparator(); +/* Commented out while it's gone + m_menu->Append( MP_RAZORSTATS, _("Get Razorback 2's stats for this file")); + m_menu->AppendSeparator(); +*/ + if (file->GetFileName().GetExt() == wxT("emulecollection")) { + m_menu->Append( MP_ADDCOLLECTION, _("Add files in collection to transfer list")); + m_menu->AppendSeparator(); + } + m_menu->Append(MP_GETMAGNETLINK,_("Copy magnet &URI to clipboard")); + m_menu->Append(MP_GETED2KLINK,_("Copy ED2k &link to clipboard")); + m_menu->Append(MP_GETSOURCEED2KLINK,_("Copy ED2k link to clipboard (&Source)")); + m_menu->Append(MP_GETCRYPTSOURCEDED2KLINK,_("Copy ED2k link to clipboard (Source) (&With Crypt options)")); + m_menu->Append(MP_GETHOSTNAMESOURCEED2KLINK,_("Copy ED2k link to clipboard (&Hostname)")); + m_menu->Append(MP_GETHOSTNAMECRYPTSOURCEED2KLINK,_("Copy ED2k link to clipboard (Hostname) (With &Crypt options)")); + m_menu->Append(MP_GETAICHED2KLINK,_("Copy ED2k link to clipboard (&AICH info)")); + m_menu->Append(MP_WS,_("Copy feedback to clipboard")); + + m_menu->Enable(MP_GETAICHED2KLINK, file->HasProperAICHHashSet()); + m_menu->Enable(MP_GETHOSTNAMESOURCEED2KLINK, !thePrefs::GetYourHostname().IsEmpty()); + m_menu->Enable(MP_GETHOSTNAMECRYPTSOURCEED2KLINK, !thePrefs::GetYourHostname().IsEmpty()); + m_menu->Enable(MP_RENAME, file->IsPartFile()); + m_menu->Enable(MP_WS, file->IsPartFile()); + + PopupMenu( m_menu, event.GetPoint() ); + + delete m_menu; + + m_menu = NULL; + } +} + + +void CSharedFilesCtrl::OnGetFeedback(wxCommandEvent& WXUNUSED(event)) +{ + wxString feed; + long index = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + while (index != -1) { + CKnownFile* file = (CKnownFile*)GetItemData(index); + + if (file->IsPartFile()) { + feed += dynamic_cast(file)->GetFeedback(); + } + + index = GetNextItem(index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + } + if (!feed.IsEmpty()) { + theApp->CopyTextToClipboard(feed); + } +} + + +#ifndef CLIENT_GUI +void CSharedFilesCtrl::ShowFileList() +{ + Freeze(); + DeleteAllItems(); + + std::vector files; + theApp->sharedfiles->CopyFileList(files); + for (unsigned i = 0; i < files.size(); ++i) { + DoShowFile(files[i], true); + } + + SortList(); + ShowFilesCount(); + + Thaw(); +} +#endif + + +void CSharedFilesCtrl::RemoveFile(CKnownFile *toRemove) +{ + long index = FindItem( -1, reinterpret_cast(toRemove) ); + + if ( index != -1 ) { + DeleteItem( index ); + + ShowFilesCount(); + } +} + + +void CSharedFilesCtrl::ShowFile(CKnownFile* file) +{ + DoShowFile(file, false); +} + + +void CSharedFilesCtrl::DoShowFile(CKnownFile* file, bool batch) +{ + wxUIntPtr ptr = reinterpret_cast(file); + if ((!batch) && (FindItem(-1, ptr) > -1)) { + return; + } + + const long insertPos = (batch ? GetItemCount() : GetInsertPos(ptr)); + + long newitem = InsertItem(insertPos, wxEmptyString); + SetItemPtrData( newitem, ptr ); + + if (!batch) { + ShowFilesCount(); + } +} + +void CSharedFilesCtrl::OnSetPriority( wxCommandEvent& event ) +{ + int priority = 0; + + switch ( event.GetId() ) { + case MP_PRIOVERYLOW: priority = PR_VERYLOW; break; + case MP_PRIOLOW: priority = PR_LOW; break; + case MP_PRIONORMAL: priority = PR_NORMAL; break; + case MP_PRIOHIGH: priority = PR_HIGH; break; + case MP_PRIOVERYHIGH: priority = PR_VERYHIGH; break; + case MP_POWERSHARE: priority = PR_POWERSHARE; break; + } + + long index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + + while( index != -1 ) { + CKnownFile* file = (CKnownFile*)GetItemData( index ); + CoreNotify_KnownFile_Up_Prio_Set( file, priority ); + + RefreshItem( index ); + + index = GetNextItem( index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + } +} + + +void CSharedFilesCtrl::OnSetPriorityAuto( wxCommandEvent& WXUNUSED(event) ) +{ + long index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + + while( index != -1 ) { + CKnownFile* file = (CKnownFile*)GetItemData( index ); + CoreNotify_KnownFile_Up_Prio_Auto(file); + + RefreshItem( index ); + + index = GetNextItem( index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + } +} + + +void CSharedFilesCtrl::OnCreateURI( wxCommandEvent& event ) +{ + wxString URIs; + + if ( event.GetId() == MP_GETSOURCEED2KLINK || event.GetId() == MP_GETCRYPTSOURCEDED2KLINK) { + if ( !theApp->IsConnectedED2K() || theApp->serverconnect->IsLowID() ) { + wxMessageBox(_("You need a HighID to create a valid sourcelink"), _("Warning"), wxOK | wxICON_ERROR, this); + + return; + } + } + + long index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + + while( index != -1 ) { + CKnownFile* file = (CKnownFile*)GetItemData( index ); + + switch ( event.GetId() ) { + case MP_GETMAGNETLINK: URIs += theApp->CreateMagnetLink( file ) + wxT("\n"); break; + case MP_GETED2KLINK: URIs += theApp->CreateED2kLink( file ) + wxT("\n"); break; + case MP_GETSOURCEED2KLINK: URIs += theApp->CreateED2kLink( file , true) + wxT("\n"); break; + case MP_GETCRYPTSOURCEDED2KLINK: URIs += theApp->CreateED2kLink( file , true, false, true) + wxT("\n"); break; + case MP_GETHOSTNAMESOURCEED2KLINK: URIs += theApp->CreateED2kLink( file , true, true) + wxT("\n"); break; + case MP_GETHOSTNAMECRYPTSOURCEED2KLINK: URIs += theApp->CreateED2kLink( file, true, true, true ) + wxT("\n"); break; + case MP_GETAICHED2KLINK: URIs += theApp->CreateED2kAICHLink( file ) + wxT("\n"); break; + } + + index = GetNextItem( index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + } + + if ( !URIs.IsEmpty() ) { + theApp->CopyTextToClipboard( URIs.RemoveLast() ); + } +} + + +void CSharedFilesCtrl::OnEditComment( wxCommandEvent& WXUNUSED(event) ) +{ + long index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + + if ( index != -1 ) { + CKnownFile* file = (CKnownFile*)GetItemData( index ); + + CCommentDialog dialog( this, file ); + + dialog.ShowModal(); + } +} + + +int CSharedFilesCtrl::SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData) +{ + CKnownFile* file1 = (CKnownFile*)item1; + CKnownFile* file2 = (CKnownFile*)item2; + + int mod = (sortData & CMuleListCtrl::SORT_DES) ? -1 : 1; + bool altSorting = (sortData & CMuleListCtrl::SORT_ALT); + + switch (sortData & CMuleListCtrl::COLUMN_MASK) { + // Sort by filename. + case ID_SHARED_COL_NAME: + return mod * CmpAny(file1->GetFileName(), file2->GetFileName()); + + // Sort by filesize. + case ID_SHARED_COL_SIZE: + return mod * CmpAny( file1->GetFileSize(), file2->GetFileSize() ); + + // Sort by filetype. + case ID_SHARED_COL_TYPE: + return mod * GetFiletypeByName(file1->GetFileName()).CmpNoCase(GetFiletypeByName( file2->GetFileName()) ); + + // Sort by priority. + case ID_SHARED_COL_PRIO: { + int8 prioA = file1->GetUpPriority(); + int8 prioB = file2->GetUpPriority(); + + // Work-around for PR_VERYLOW which has value 4. See KnownFile.h for that stupidity ... + return mod * CmpAny( ( prioB != PR_VERYLOW ? prioB : -1 ), ( prioA != PR_VERYLOW ? prioA : -1 ) ); + } + + // Sort by fileID. + case ID_SHARED_COL_ID: + return mod * file1->GetFileHash().Encode().Cmp( file2->GetFileHash().Encode() ); + + // Sort by Requests this session. + case ID_SHARED_COL_REQ: + if (altSorting) { + return mod * CmpAny( file1->statistic.GetAllTimeRequests(), file2->statistic.GetAllTimeRequests() ); + } else { + return mod * CmpAny( file1->statistic.GetRequests(), file2->statistic.GetRequests() ); + } + + // Sort by accepted requests. Ascending. + case ID_SHARED_COL_AREQ: + if (altSorting) { + return mod * CmpAny( file1->statistic.GetAllTimeAccepts(), file2->statistic.GetAllTimeAccepts() ); + } else { + return mod * CmpAny( file1->statistic.GetAccepts(), file2->statistic.GetAccepts() ); + } + + // Sort by transferred. Ascending. + case ID_SHARED_COL_TRA: + if (altSorting) { + return mod * CmpAny( file1->statistic.GetAllTimeTransferred(), file2->statistic.GetAllTimeTransferred() ); + } else { + return mod * CmpAny( file1->statistic.GetTransferred(), file2->statistic.GetTransferred() ); + } + + // Sort by Share Ratio. Ascending. + case ID_SHARED_COL_RTIO: + return mod * CmpAny( (double)file1->statistic.GetAllTimeTransferred() / file1->GetFileSize(), + (double)file2->statistic.GetAllTimeTransferred() / file2->GetFileSize() ); + + // Complete sources asc + case ID_SHARED_COL_CMPL: + return mod * CmpAny( file1->m_nCompleteSourcesCount, file2->m_nCompleteSourcesCount ); + + // Folders ascending + case ID_SHARED_COL_PATH: { + if ( file1->IsPartFile() && file2->IsPartFile() ) + return mod * 0; + if ( file1->IsPartFile() ) + return mod * -1; + if ( file2->IsPartFile() ) + return mod * 1; + + return mod * CmpAny(file1->GetFilePath(), file2->GetFilePath()); + } + + default: + return 0; + } +} + + +void CSharedFilesCtrl::UpdateItem(CKnownFile* toupdate) +{ + long result = FindItem( -1, reinterpret_cast(toupdate) ); + + if ( result > -1 ) { + RefreshItem(result); + + if ( GetItemState( result, wxLIST_STATE_SELECTED ) ) { + theApp->amuledlg->m_sharedfileswnd->SelectionUpdated(); + } + } +} + + +void CSharedFilesCtrl::ShowFilesCount() +{ + wxString str = wxString::Format(_("Shared Files (%i)"), GetItemCount()); + wxStaticText* label = CastByName( wxT("sharedFilesLabel"), GetParent(), wxStaticText ); + + label->SetLabel( str ); + label->GetParent()->Layout(); +} + + +void CSharedFilesCtrl::OnDrawItem( int item, wxDC* dc, const wxRect& rect, const wxRect& rectHL, bool highlighted ) +{ + CKnownFile *file = (CKnownFile*)GetItemData(item); + wxASSERT( file ); + + if ( highlighted ) { + wxColour newcol; + wxBrush hilBrush; + + if (GetFocus()) { + newcol = SYSCOLOR(wxSYS_COLOUR_HIGHLIGHT); + newcol = wxColour(G_BLEND(newcol.Red(),125), + G_BLEND(newcol.Green(),125), + G_BLEND(newcol.Blue(),125)); + hilBrush = wxBrush(newcol, wxSOLID); + dc->SetBackground(hilBrush); + } else { + newcol = SYSCOLOR(wxSYS_COLOUR_BTNSHADOW); + newcol = wxColour(G_BLEND(newcol.Red(),125), + G_BLEND(newcol.Green(),125), + G_BLEND(newcol.Blue(),125)); + hilBrush = wxBrush(newcol, wxSOLID); + dc->SetBackground(hilBrush); + } + + dc->SetTextForeground( SYSCOLOR(wxSYS_COLOUR_HIGHLIGHTTEXT)); + + newcol = wxColour( G_BLEND(newcol.Red(), 65), + G_BLEND(newcol.Green(), 65), + G_BLEND(newcol.Blue(), 65) ); + dc->SetPen(wxPen(newcol,1,wxSOLID)); + } else { + dc->SetBackground( wxBrush(SYSCOLOR(wxSYS_COLOUR_LISTBOX), wxSOLID) ); + dc->SetTextForeground(SYSCOLOR(wxSYS_COLOUR_WINDOWTEXT)); + dc->SetPen(*wxTRANSPARENT_PEN); + } + + dc->SetBrush(dc->GetBackground()); + dc->DrawRectangle(rectHL); + dc->SetPen(*wxTRANSPARENT_PEN); + + // Offset based on the height of the fonts + const int textVOffset = ( rect.GetHeight() - dc->GetCharHeight() ) / 2; + // Empty space to each side of a column + const int SPARE_PIXELS_HORZ = 4; + + // The leftmost position of the current column + int columnLeft = 0; + + for ( int i = 0; i < GetColumnCount(); ++i ) { + const int columnWidth = GetColumnWidth(i); + + if (columnWidth > 2*SPARE_PIXELS_HORZ) { + wxRect columnRect( + columnLeft + SPARE_PIXELS_HORZ, rect.y, + columnWidth - 2 * SPARE_PIXELS_HORZ, rect.height); + + wxDCClipper clipper(*dc, columnRect); + + wxString textBuffer; + switch ( i ) { + case ID_SHARED_COL_NAME: + textBuffer = file->GetFileName().GetPrintable(); + + if (file->GetFileRating() || file->GetFileComment().Length()) { + int image = Client_CommentOnly_Smiley; + if (file->GetFileRating()) { + image = Client_InvalidRating_Smiley + file->GetFileRating() - 1; + } + + wxASSERT(image >= Client_InvalidRating_Smiley); + wxASSERT(image <= Client_CommentOnly_Smiley); + + int imgWidth = 16; + + theApp->amuledlg->m_imagelist.Draw(image, *dc, columnRect.x, + columnRect.y + 1, wxIMAGELIST_DRAW_TRANSPARENT); + + // Move the text to the right + columnRect.x += (imgWidth + 4); + } + + break; + + case ID_SHARED_COL_SIZE: + textBuffer = CastItoXBytes(file->GetFileSize()); + break; + + case ID_SHARED_COL_TYPE: + textBuffer = GetFiletypeByName(file->GetFileName()); + break; + + case ID_SHARED_COL_PRIO: + textBuffer = PriorityToStr(file->GetUpPriority(), file->IsAutoUpPriority()); + break; + + case ID_SHARED_COL_ID: + textBuffer = file->GetFileHash().Encode(); + break; + + case ID_SHARED_COL_REQ: + textBuffer = wxString::Format(wxT("%u (%u)"), + file->statistic.GetRequests(), + file->statistic.GetAllTimeRequests()); + break; + + case ID_SHARED_COL_AREQ: + textBuffer = wxString::Format(wxT("%u (%u)"), + file->statistic.GetAccepts(), + file->statistic.GetAllTimeAccepts()); + break; + + case ID_SHARED_COL_TRA: + textBuffer = CastItoXBytes(file->statistic.GetTransferred()) + + wxT(" (") + CastItoXBytes(file->statistic.GetAllTimeTransferred()) + wxT(")"); + break; + + case ID_SHARED_COL_RTIO: + textBuffer = wxString::Format(wxT("%.2f"), + (double)file->statistic.GetAllTimeTransferred() / file->GetFileSize() ); + break; + + case ID_SHARED_COL_PART: + if ( file->GetPartCount() ) { + wxRect barRect(columnRect.x, columnRect. y + 1, + columnRect.width, columnRect.height - 2); + + DrawAvailabilityBar(file, dc, barRect); + } + break; + + case ID_SHARED_COL_CMPL: + if ( file->m_nCompleteSourcesCountLo == 0 ) { + if ( file->m_nCompleteSourcesCountHi ) { + textBuffer = wxString::Format(wxT("< %u"), file->m_nCompleteSourcesCountHi ); + } else { + textBuffer = wxT("0"); + } + } else if (file->m_nCompleteSourcesCountLo == file->m_nCompleteSourcesCountHi) { + textBuffer = wxString::Format(wxT("%u"), file->m_nCompleteSourcesCountLo); + } else { + textBuffer = wxString::Format(wxT("%u - %u"), + file->m_nCompleteSourcesCountLo, + file->m_nCompleteSourcesCountHi); + } + + break; + + case ID_SHARED_COL_PATH: + if ( file->IsPartFile() ) { + textBuffer = _("[PartFile]"); + } else { + textBuffer = file->GetFilePath().GetPrintable(); + } + } + + if (!textBuffer.IsEmpty()) { + dc->DrawText(textBuffer, columnRect.x, columnRect.y + textVOffset); + } + } + + // Move to the next column + columnLeft += columnWidth; + } +} + + +wxString CSharedFilesCtrl::GetTTSText(unsigned item) const +{ + return reinterpret_cast(GetItemData(item))->GetFileName().GetPrintable(); +} + + +bool CSharedFilesCtrl::AltSortAllowed(unsigned column) const +{ + switch ( column ) { + case ID_SHARED_COL_REQ: + case ID_SHARED_COL_AREQ: + case ID_SHARED_COL_TRA: + return true; + + default: + return false; + } +} + + +void CSharedFilesCtrl::DrawAvailabilityBar(CKnownFile* file, wxDC* dc, const wxRect& rect ) const +{ + // Reference to the availability list + const ArrayOfUInts16& list = file->IsPartFile() ? + ((CPartFile*)file)->m_SrcpartFrequency : + file->m_AvailPartFrequency; + static CBarShader s_ChunkBar; + s_ChunkBar.SetFileSize( file->GetFileSize() ); + s_ChunkBar.SetHeight( rect.GetHeight() ); + s_ChunkBar.SetWidth( rect.GetWidth() ); + s_ChunkBar.Set3dDepth( CPreferences::Get3DDepth() ); + s_ChunkBar.Fill( RGB(255, 0, 0) ); + for ( unsigned int i = 0; i < list.size(); ++i ) { + if ( list[i] ) { + COLORREF color = RGB(0, (210-(22*( list[i] - 1 ) ) < 0) ? 0 : 210-(22*( list[i] - 1 ) ), 255); + uint64 start = PARTSIZE * static_cast(i); + uint64 end = PARTSIZE * static_cast(i + 1); + s_ChunkBar.FillRange(start, end, color); + } + } + s_ChunkBar.Draw(dc, rect.GetLeft(), rect.GetTop(), CPreferences::UseFlatBar() ); +} + +void CSharedFilesCtrl::OnGetRazorStats( wxCommandEvent& WXUNUSED(event) ) +{ + int item = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + if ( item != -1 ) { + CKnownFile* file = (CKnownFile*)GetItemData( item ); + + theApp->amuledlg->LaunchUrl(wxT("http://stats.razorback2.com/ed2khistory?ed2k=") + file->GetFileHash().Encode()); + } +} + + +void CSharedFilesCtrl::OnRename( wxCommandEvent& WXUNUSED(event) ) +{ + int item = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + if ( item != -1 ) { + CKnownFile* file = (CKnownFile*)GetItemData(item); + + // Currently renaming of completed files causes problem with kad + if (file->IsPartFile()) { + wxString strNewName = ::wxGetTextFromUser( + _("Enter new name for this file:"), + _("File rename"), file->GetFileName().GetPrintable()); + + CPath newName = CPath(strNewName); + if (newName.IsOk() && (newName != file->GetFileName())) { + theApp->sharedfiles->RenameFile(file, newName); + } + } + } +} + + +void CSharedFilesCtrl::OnKeyPressed( wxKeyEvent& event ) +{ + if (event.GetKeyCode() == WXK_F2) { + wxCommandEvent evt; + OnRename(evt); + + return; + } + event.Skip(); +} + + +void CSharedFilesCtrl::OnAddCollection( wxCommandEvent& WXUNUSED(evt) ) +{ + int item = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + if (item != -1) { + CKnownFile *file = (CKnownFile*)GetItemData(item); + wxString CollectionFile = file->GetFilePath().JoinPaths(file->GetFileName()).GetRaw(); + CMuleCollection my_collection; + if (my_collection.Open( (std::string)CollectionFile.mb_str() )) { +//#warning This is probably not working on Unicode + for (size_t e = 0; e < my_collection.GetFileCount(); ++e) { + theApp->downloadqueue->AddLink( + wxString(my_collection.GetEd2kLink(e).c_str(), wxConvUTF8)); + } + + } + } +} + +// File_checked_for_headers diff --git a/src/SharedFilesCtrl.h b/src/SharedFilesCtrl.h new file mode 100644 index 00000000..a48ec96e --- /dev/null +++ b/src/SharedFilesCtrl.h @@ -0,0 +1,198 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef SHAREDFILESCTRL_H +#define SHAREDFILESCTRL_H + +#include "MuleListCtrl.h" // Needed for CMuleListCtrl + + +class CSharedFileList; +class CKnownFile; +class wxMenu; + + +/** + * This class represents the widget used to list shared files. + */ +class CSharedFilesCtrl : public CMuleListCtrl +{ +public: + /** + * Constructor. + * + * @see CMuleListCtrl::CMuleListCtrl + */ + CSharedFilesCtrl(wxWindow* parent, int id, const wxPoint& pos, wxSize size, int flags); + + /** + * Destructor. + */ + ~CSharedFilesCtrl(); + + +#ifndef CLIENT_GUI + /** Reloads the list of shared files. */ + void ShowFileList(); +#endif + + /** + * Adds the specified file to the list, updating filecount and more. + * + * @param file The new file to be shown. + * + * Note that the item is inserted in sorted order. + */ + void ShowFile(CKnownFile* file); + + /** + * Removes a file from the list. + * + * @param toremove The file to be removed. + */ + void RemoveFile(CKnownFile* toremove); + + /** + * Updates a file on the list. + * + * @param toupdate The file to be updated. + */ + void UpdateItem(CKnownFile* toupdate); + + /** + * Updates the number of shared files displayed above the list. + */ + void ShowFilesCount(); + +private: + /** + * Adds the specified file to the list. + * + * If 'batch' is true, the item will be inserted last, + * and the files-count will not be updated, nor is + * the list checked for dupes. + */ + void DoShowFile(CKnownFile* file, bool batch); + + /** + * Draws the graph of file-part availability. + * + * @param file The file to make a graph over. + * @param dc The wcDC to draw on. + * @param rect The drawing area. + * + * This function draws a barspan showing the availability of the parts of + * a file, for both Part-files and Known-files. Availability for Part-files + * is determined using the currently known sources, while availability for + * Known-files is determined using the sources requesting that file. + */ + void DrawAvailabilityBar( CKnownFile* file, wxDC* dc, const wxRect& rect ) const; + + /** + * Overloaded function needed to do custom drawing of the items. + */ + virtual void OnDrawItem(int item, wxDC* dc, const wxRect& rect, const wxRect& rectHL, bool highlighted); + + + /** + * @see CMuleListCtrl::GetTTSText + */ + virtual wxString GetTTSText(unsigned item) const; + + + /** + * Sorter-function. + * + * @see wxListCtrl::SortItems + */ + static int wxCALLBACK SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData); + + /** + * Function that specifies which columns have alternate sorting. + * + * @see CMuleListCtrl::AltSortAllowed + */ + virtual bool AltSortAllowed(unsigned column) const; + + + /** + * Event-handler for right-clicks on the list-items. + */ + void OnRightClick(wxListEvent& event); + + /** + * Event-handler for right-clicks on the list-items. + */ + void OnGetFeedback(wxCommandEvent& event); + + /** + * Event-handler for the Set Priority menu items. + */ + void OnSetPriority( wxCommandEvent& event ); + + /** + * Event-handler for the Auto-Priority menu item. + */ + void OnSetPriorityAuto( wxCommandEvent& event ); + + /** + * Event-handler for the Create ED2K/Magnet URI items. + */ + void OnCreateURI( wxCommandEvent& event ); + + /** + * Event handler for get-razorback stats menu item + */ + void OnGetRazorStats( wxCommandEvent& evt ); + + /** + * Event-handler for the Edit Comment menu item. + */ + void OnEditComment( wxCommandEvent& event ); + + /** + * Event-handler for the Rename menu item. + */ + void OnRename( wxCommandEvent& event ); + + /** + * Checks for renaming via F2. + */ + void OnKeyPressed( wxKeyEvent& event ); + + /** + * Adds links in a collection to transfers + */ + void OnAddCollection( wxCommandEvent& WXUNUSED(evt) ); + + //! Pointer used to ensure that the menu isn't displayed twice. + wxMenu* m_menu; + + + DECLARE_EVENT_TABLE() +}; + +#endif +// File_checked_for_headers diff --git a/src/SharedFilesWnd.cpp b/src/SharedFilesWnd.cpp new file mode 100644 index 00000000..462bd677 --- /dev/null +++ b/src/SharedFilesWnd.cpp @@ -0,0 +1,158 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include // Do_not_auto_remove (win32) + +#include "SharedFilesWnd.h" // Interface declarations +#include "SharedFilesCtrl.h" +#include "muuli_wdr.h" // Needed for ID_SHFILELIST +#include "KnownFileList.h" // Needed for CKnownFileList +#include "KnownFile.h" // Needed for CKnownFile +#include "amule.h" // Needed for theApp + + + +BEGIN_EVENT_TABLE(CSharedFilesWnd, wxPanel) + EVT_LIST_ITEM_SELECTED( ID_SHFILELIST, CSharedFilesWnd::OnItemActivated ) + EVT_BUTTON( ID_BTNRELSHARED, CSharedFilesWnd::OnBtnReloadShared ) +END_EVENT_TABLE() + + + +CSharedFilesWnd::CSharedFilesWnd( wxWindow* pParent ) + : wxPanel(pParent, -1) +{ + wxSizer* content = sharedfilesDlg(this, true); + content->Show(this, true); + + m_bar_requests = CastChild( wxT("popbar"), wxGauge ); + m_bar_accepted = CastChild( wxT("popbarAccept"), wxGauge ); + m_bar_transfer = CastChild( wxT("popbarTrans"), wxGauge ); + sharedfilesctrl = CastChild( wxT("sharedFilesCt"), CSharedFilesCtrl ); + wxASSERT(sharedfilesctrl); +} + + +CSharedFilesWnd::~CSharedFilesWnd() +{ +} + + +void CSharedFilesWnd::SelectionUpdated() +{ + uint64 lTransferred = theApp->knownfiles->transferred; + uint32 lAccepted = theApp->knownfiles->accepted; + uint32 lRequested = theApp->knownfiles->requested; + m_bar_requests->SetRange( lRequested ); + m_bar_accepted->SetRange( lAccepted ); + m_bar_transfer->SetRange( lTransferred / 1024 ); + + if ( !sharedfilesctrl->GetSelectedItemCount() ) { + // Requests + m_bar_requests->SetValue( 0 ); + CastChild(IDC_SREQUESTED, wxStaticText)->SetLabel( wxT("-") ); + CastChild(IDC_SREQUESTED2, wxStaticText)->SetLabel( wxT("-") ); + + // Accepted requets + m_bar_accepted->SetValue( 0 ); + CastChild(IDC_SACCEPTED, wxStaticText)->SetLabel( wxT("-") ); + CastChild(IDC_SACCEPTED2, wxStaticText)->SetLabel( wxT("-") ); + + // Transferred + m_bar_transfer->SetValue( 0 ); + CastChild(IDC_STRANSFERRED, wxStaticText)->SetLabel( wxT("-") ); + CastChild(IDC_STRANSFERRED2, wxStaticText)->SetLabel( wxT("-") ); + } else { + // Create a total statistic for the selected item(s) + uint32 session_requests = 0; + uint32 session_accepted = 0; + uint64 session_transferred = 0; + uint32 all_requests = 0; + uint32 all_accepted = 0; + uint64 all_transferred = 0; + + long index = sharedfilesctrl->GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + while ( index > -1 ) { + if ( sharedfilesctrl->GetItemState( index, wxLIST_STATE_SELECTED ) ) { + CKnownFile* file = (CKnownFile*)sharedfilesctrl->GetItemData( index ); + + session_requests += file->statistic.GetRequests(); + session_accepted += file->statistic.GetAccepts(); + session_transferred += file->statistic.GetTransferred(); + + all_requests += file->statistic.GetAllTimeRequests(); + all_accepted += file->statistic.GetAllTimeAccepts(); + all_transferred += file->statistic.GetAllTimeTransferred(); + } + index = sharedfilesctrl->GetNextItem( index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + }; + + // Requests + session_requests = session_requests > lRequested ? lRequested : session_requests; + m_bar_requests->SetValue( session_requests ); + CastChild(IDC_SREQUESTED, wxStaticText)->SetLabel( wxString::Format(wxT("%u"), session_requests ) ); + CastChild(IDC_SREQUESTED2, wxStaticText)->SetLabel( wxString::Format(wxT("%u"), all_requests ) ); + + // Accepted requets + session_accepted = session_accepted > lAccepted ? lAccepted : session_accepted; + m_bar_accepted->SetValue( session_accepted ); + CastChild(IDC_SACCEPTED, wxStaticText)->SetLabel( wxString::Format(wxT("%u"), session_accepted ) ); + CastChild(IDC_SACCEPTED2, wxStaticText)->SetLabel( wxString::Format(wxT("%u"), all_accepted ) ); + + // Transferred + session_transferred = session_transferred > lTransferred ? lTransferred : session_transferred; + m_bar_transfer->SetValue( session_transferred / 1024 ); + CastChild(IDC_STRANSFERRED, wxStaticText)->SetLabel( CastItoXBytes( session_transferred ) ); + CastChild(IDC_STRANSFERRED2, wxStaticText)->SetLabel( CastItoXBytes( all_transferred ) ); + } + Layout(); +} + + +void CSharedFilesWnd::OnBtnReloadShared( wxCommandEvent& WXUNUSED(evt) ) +{ + theApp->sharedfiles->Reload(); +#ifndef CLIENT_GUI + // remote gui will update display when data is back + SelectionUpdated(); +#endif +} + + +void CSharedFilesWnd::OnItemActivated(wxListEvent& evt) +{ + SelectionUpdated(); + + evt.Skip(); +} + + +void CSharedFilesWnd::RemoveAllSharedFiles() { + sharedfilesctrl->DeleteAllItems(); + sharedfilesctrl->ShowFilesCount(); + SelectionUpdated(); +} +// File_checked_for_headers diff --git a/src/SharedFilesWnd.h b/src/SharedFilesWnd.h new file mode 100644 index 00000000..870a046b --- /dev/null +++ b/src/SharedFilesWnd.h @@ -0,0 +1,96 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef SHAREDFILESWND_H +#define SHAREDFILESWND_H + +#include // Needed for wxPanel + + +class CKnownFile; +class CSharedFilesCtrl; +class wxListEvent; +class wxGauge; + + +/** + * This class represents the window containing the list of shared files. + */ +class CSharedFilesWnd : public wxPanel +{ +public: + /** + * Constructor. + */ + CSharedFilesWnd(wxWindow* pParent = NULL); + + /** + * Destructor. + */ + ~CSharedFilesWnd(); + + + /** + * This function updates the statistics of the selected items. + * + * Call this function when an item has been selected, or when a + * selected item changes. It + */ + void SelectionUpdated(); + + + /** + * Deletes all files and updates widget + */ + void RemoveAllSharedFiles(); + + //! Pointer to the widget containing the list of shared files. + CSharedFilesCtrl* sharedfilesctrl; + +private: + /** + * Event-handler for reloading the list of shared files. + */ + void OnBtnReloadShared(wxCommandEvent &evt); + + /** + * Event-handler for showing details about a shared file. + */ + void OnItemActivated(wxListEvent& evt); + + + //! Pointer to the gauge used for showing requests ratio. + wxGauge* m_bar_requests; + //! Pointer to the gauge used for showing accepted-requests ratio. + wxGauge* m_bar_accepted; + //! Pointer to the gauge used for showing the transferred ratio. + wxGauge* m_bar_transfer; + + + DECLARE_EVENT_TABLE() +}; + +#endif +// File_checked_for_headers diff --git a/src/StatTree.cpp b/src/StatTree.cpp new file mode 100644 index 00000000..86aab16c --- /dev/null +++ b/src/StatTree.cpp @@ -0,0 +1,642 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (C) 2005-2008 Dévai Tamás ( gonosztopi@amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "StatTree.h" + +#include +#include "OtherFunctions.h" + +#ifndef EC_REMOTE + +#ifndef AMULE_DAEMON +#include // Needed for CFormat + +#define a_brackets_b(a,b) (a + wxT(" (") + b + wxT(")")) + +#endif /* !AMULE_DAEMON */ + +#endif /* !EC_REMOTE */ + +#include // Needed for CECTag + +#ifdef EC_REMOTE + #include // Needed for CEC_StatTree_Node_Tag +#endif + + +#ifndef EC_REMOTE +uint32_t NewStatTreeItemId() +{ + static uint32_t lastid = 0; + + return ++lastid; +} +#endif + +/* CStatTreeItemBase */ + +#ifdef EC_REMOTE +CStatTreeItemBase::CStatTreeItemBase(const CECTag *tag) + : m_label(((CEC_StatTree_Node_Tag*)tag)->GetDisplayString()) + , m_uniqueid(tag->GetTagByNameSafe(EC_TAG_STATTREE_NODEID)->GetInt()) +{ + wxASSERT(tag->GetTagName() == EC_TAG_STATTREE_NODE); + + for (int i = 0; i < tag->GetTagCount(); ++i) { + const CECTag *tmp = tag->GetTagByIndex(i); + if (tmp->GetTagName() == EC_TAG_STATTREE_NODE) { + m_children.push_back(new CStatTreeItemBase(tmp)); + } + } +} +#endif /* EC_REMOTE */ + +CStatTreeItemBase::~CStatTreeItemBase() +{ + for (std::list::iterator it = m_children.begin(); + it != m_children.end(); ++it) { + delete *it; + } + m_children.clear(); +} + +#ifndef EC_REMOTE +CStatTreeItemBase* CStatTreeItemBase::AddChild( + CStatTreeItemBase* child, + uint32_t id, + bool skipOneLevel) +{ + wxMutexLocker lock(m_lock); + + if (skipOneLevel) { + child->m_parent = m_parent; + } else { + child->m_parent = this; + } + child->m_id = id; + + if (m_flags & stSortChildren) { + std::list::iterator it = m_children.begin(); + while (it != m_children.end() && id < (*it)->m_id) { + ++it; + } + m_children.insert(it, child); + } else { + m_children.push_back(child); + } + return child; +} +#endif /* !EC_REMOTE */ + +bool CStatTreeItemBase::HasVisibleChildren() +{ + wxMutexLocker lock(m_lock); + + for (std::list::const_iterator it = m_children.begin(); + it != m_children.end(); ++it) { + if ((*it)->IsVisible()) { + return true; + } + } + return false; +} + +#ifndef EC_REMOTE +bool CStatTreeItemBase::HasChildWithId(uint32_t id) +{ + wxMutexLocker lock(m_lock); + + for (std::list::const_iterator it = m_children.begin(); + it != m_children.end(); ++it) { + if ((*it)->m_id == id) { + return true; + } + } + return false; +} + +CStatTreeItemBase* CStatTreeItemBase::GetChildById(uint32_t id) +{ + wxMutexLocker lock(m_lock); + + for (std::list::const_iterator it = m_children.begin(); + it != m_children.end(); ++it) { + if ((*it)->m_id == id) { + return *it; + } + } + return NULL; +} +#endif /* !EC_REMOTE */ + +// Note: these functions do not lock the list, because it is already locked at the time they're called +#ifndef EC_REMOTE +StatTreeItemIterator CStatTreeItemBase::GetFirstVisibleChild(uint32_t max_children) +{ + StatTreeItemIterator it = m_children.begin(); + m_visible_counter = --max_children; + while (it != m_children.end() && !(*it)->IsVisible()) ++it; + return it; +} + +void CStatTreeItemBase::GetNextVisibleChild(StatTreeItemIterator& it) +{ + if (m_flags & stCapChildren) { + if (m_visible_counter == 0) { + it = m_children.end(); + return; + } else { + --m_visible_counter; + } + } + if (it != m_children.end()) ++it; + while (it != m_children.end() && !(*it)->IsVisible()) ++it; +} +#endif + +// +// Anything below is only for core. +// +#ifndef EC_REMOTE + +bool CStatTreeItemBase::ValueSort(CStatTreeItemBase* a, CStatTreeItemBase* b) +{ + if (a->m_id < 0x00000100 || a->m_id > 0x7fffffff || b->m_id < 0x00000100 || b->m_id > 0x7fffffff) { + return a->m_id > b->m_id; + } else { + return ((CStatTreeItemCounter*)a)->GetValue() > ((CStatTreeItemCounter*)b)->GetValue(); + } +} + +#ifndef AMULE_DAEMON +wxString CStatTreeItemBase::GetDisplayString() const +{ + return wxGetTranslation(m_label); +} +#endif + +CECTag *CStatTreeItemBase::CreateECTag(uint32_t max_children) +{ + if (IsVisible()) { + wxMutexLocker lock(m_lock); + CECTag *tag = new CECTag(EC_TAG_STATTREE_NODE, m_label); + tag->AddTag(CECTag(EC_TAG_STATTREE_NODEID, m_uniqueid)); + AddECValues(tag); + m_visible_counter = max_children - 1; + for (std::list::const_iterator it = m_children.begin(); + it != m_children.end(); ++it) { + CECTag *tmp = (*it)->CreateECTag(max_children); + if (tmp) { + tag->AddTag(*tmp); + delete tmp; + if (m_flags & stCapChildren) { + if (m_visible_counter == 0) { + break; + } else { + --m_visible_counter; + } + } + } + } + return tag; + } else { + return NULL; + } +} + + +/* CStatTreeItemSimple */ + +#ifndef AMULE_DAEMON +wxString CStatTreeItemSimple::GetDisplayString() const +{ + switch (m_valuetype) { + case vtInteger: + switch (m_displaymode) { + case dmTime: return CFormat(wxGetTranslation(m_label)) % CastSecondsToHM(m_intvalue); + case dmBytes: return CFormat(wxGetTranslation(m_label)) % CastItoXBytes(m_intvalue); + default: return CFormat(wxGetTranslation(m_label)) % m_intvalue; + } + case vtFloat: return wxString::Format(wxGetTranslation(m_label), m_floatvalue); + case vtString: return CFormat(wxGetTranslation(m_label)) % m_stringvalue; + default: return wxGetTranslation(m_label); + } +} +#endif + +bool CStatTreeItemSimple::IsVisible() const +{ + if (m_flags & stHideIfZero) { + switch (m_valuetype) { + case vtInteger: return m_intvalue != 0; + case vtFloat: return m_floatvalue != 0.0; + case vtString: return !m_stringvalue.IsEmpty(); + default: return false; + } + } + return true; +} + +void CStatTreeItemSimple::AddECValues(CECTag *tag) const +{ + switch (m_valuetype) { + case vtInteger: { + if (m_displaymode == dmTime) { + CECTag value(EC_TAG_STAT_NODE_VALUE, (uint32)m_intvalue); + value.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_TIME)); + tag->AddTag(value); + } else { + CECTag value(EC_TAG_STAT_NODE_VALUE, (uint64)m_intvalue); + if (m_displaymode == dmBytes) { + value.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_BYTES)); + } + tag->AddTag(value); + } + break; + } + case vtFloat: { + CECTag value(EC_TAG_STAT_NODE_VALUE, m_floatvalue); + value.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_DOUBLE)); + tag->AddTag(value); + break; + } + case vtString: { + CECTag value(EC_TAG_STAT_NODE_VALUE, m_stringvalue); + value.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_STRING)); + tag->AddTag(value); + break; + } + default: + break; + } +} + + +/* CStatTreeItemCounterTmpl */ + +#ifndef AMULE_DAEMON +template +wxString CStatTreeItemCounterTmpl<_Tp>::GetDisplayString() const +{ + wxString my_label = wxGetTranslation(m_label); + // This is needed for client names, for example + if (my_label == m_label) { + if (m_label.Right(4) == wxT(": %s")) { + my_label = wxGetTranslation( + m_label.Mid(0, m_label.Length() - 4)) + + wxString(wxT(": %s")); + } + } + CFormat label(my_label); + if (m_displaymode == dmBytes) { + return label % CastItoXBytes(m_value); + } else { + wxString result = CFormat(wxT("%u")) % m_value; + if ((m_flags & stShowPercent) && m_parent) { + result.append(wxString::Format(wxT(" (%.2f%%)"), + ((double)m_value / ((CStatTreeItemCounterTmpl<_Tp>*)m_parent)->m_value) * 100.0)); + } + return label % result; + } +} +#endif + +template +void CStatTreeItemCounterTmpl<_Tp>::AddECValues(CECTag *tag) const +{ + CECTag value(EC_TAG_STAT_NODE_VALUE, (uint64)m_value); + if (m_displaymode == dmBytes) { + value.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_BYTES)); + } else { + value.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_ISTRING)); + if ((m_flags & stShowPercent) && m_parent) { + CECTag tmp(EC_TAG_STAT_NODE_VALUE, + ((double)m_value / ((CStatTreeItemCounterTmpl<_Tp>*)m_parent)->m_value) * 100.0); + tmp.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_DOUBLE)); + value.AddTag(tmp); + } + } + tag->AddTag(value); +} + +/* CStatTreeItemUlDlCounter */ + +#ifndef AMULE_DAEMON +wxString CStatTreeItemUlDlCounter::GetDisplayString() const +{ + return CFormat(wxGetTranslation(m_label)) % + a_brackets_b(CastItoXBytes(m_value), CastItoXBytes(m_value + m_totalfunc())); +} +#endif + +void CStatTreeItemUlDlCounter::AddECValues(CECTag *tag) const +{ + CECTag value(EC_TAG_STAT_NODE_VALUE, m_value); + value.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_BYTES)); + CECTag tmp(EC_TAG_STAT_NODE_VALUE, m_value + m_totalfunc()); + tmp.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_BYTES)); + value.AddTag(tmp); + tag->AddTag(value); +} + + +/* CStatTreeItemCounterMax */ + +#ifndef AMULE_DAEMON +wxString CStatTreeItemCounterMax::GetDisplayString() const +{ + return wxString::Format(wxGetTranslation(m_label), m_value); +} +#endif + +void CStatTreeItemCounterMax::AddECValues(CECTag *tag) const +{ + tag->AddTag(CECTag(EC_TAG_STAT_NODE_VALUE, (uint64)m_value)); +} + + +/* CStatTreeItemPackets */ + +#ifndef AMULE_DAEMON +wxString CStatTreeItemPackets::GetDisplayString() const +{ + return CFormat(wxGetTranslation(m_label)) % + a_brackets_b(CastItoXBytes(m_bytes), CastItoIShort(m_packets)); +} +#endif + +void CStatTreeItemPackets::AddECValues(CECTag *tag) const +{ + CECTag value(EC_TAG_STAT_NODE_VALUE, m_bytes); + value.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_BYTES)); + CECTag tmp(EC_TAG_STAT_NODE_VALUE, (uint64)m_packets); + tmp.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_ISHORT)); + value.AddTag(tmp); + tag->AddTag(value); +} + + +/* CStatTreeItemPacketTotals */ + +#ifndef AMULE_DAEMON +wxString CStatTreeItemPacketTotals::GetDisplayString() const +{ + uint32_t tmp_packets = m_packets; + uint64_t tmp_bytes = m_bytes; + for (std::vector::const_iterator it = m_counters.begin(); + it != m_counters.end(); ++it) { + tmp_packets += (*it)->m_packets; + tmp_bytes += (*it)->m_bytes; + } + + return CFormat(wxGetTranslation(m_label)) % + a_brackets_b(CastItoXBytes(tmp_bytes), CastItoIShort(tmp_packets)); +} +#endif + +void CStatTreeItemPacketTotals::AddECValues(CECTag *tag) const +{ + uint32_t tmp_packets = m_packets; + uint64_t tmp_bytes = m_bytes; + for (std::vector::const_iterator it = m_counters.begin(); + it != m_counters.end(); ++it) { + tmp_packets += (*it)->m_packets; + tmp_bytes += (*it)->m_bytes; + } + + CECTag value(EC_TAG_STAT_NODE_VALUE, tmp_bytes); + value.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_BYTES)); + CECTag tmp(EC_TAG_STAT_NODE_VALUE, (uint64)tmp_packets); + tmp.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_ISHORT)); + value.AddTag(tmp); + tag->AddTag(value); +} + + +/* CStatTreeItemTimer */ + +#ifndef AMULE_DAEMON +wxString CStatTreeItemTimer::GetDisplayString() const +{ + return CFormat(wxGetTranslation(m_label)) % + CastSecondsToHM(m_value ? GetTimerSeconds() : 0); +} +#endif + +void CStatTreeItemTimer::AddECValues(CECTag *tag) const +{ + CECTag value(EC_TAG_STAT_NODE_VALUE, + m_value ? (uint32)GetTimerSeconds() : (uint32)0); + value.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_TIME)); + tag->AddTag(value); +} + + +/* CStatTreeItemAverage */ + +#ifndef AMULE_DAEMON +wxString CStatTreeItemAverage::GetDisplayString() const +{ + if ((*m_divisor) != 0) { + switch (m_displaymode) { + case dmBytes: + return CFormat(wxGetTranslation(m_label)) % + CastItoXBytes((*m_dividend)/(*m_divisor)); + case dmTime: + return CFormat(wxGetTranslation(m_label)) % + CastSecondsToHM((*m_dividend)/(*m_divisor)); + default: + return CFormat(wxGetTranslation(m_label)) % + (CFormat(wxT("%u")) % ((uint64)(*m_dividend)/(*m_divisor))).GetString(); + } + } else { + return CFormat(wxGetTranslation(m_label)) % wxT("-"); + } +} +#endif + +void CStatTreeItemAverage::AddECValues(CECTag *tag) const +{ + if ((*m_divisor) != 0) { + uint64 data = (*m_dividend)/(*m_divisor); + if (m_displaymode == dmTime) { + CECTag value(EC_TAG_STAT_NODE_VALUE, (uint32)data); + value.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_TIME)); + tag->AddTag(value); + } else { + CECTag value(EC_TAG_STAT_NODE_VALUE, data); + if (m_displaymode == dmBytes) { + value.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_BYTES)); + } + tag->AddTag(value); + } + } else { + CECTag value(EC_TAG_STAT_NODE_VALUE, wxString(wxT("-"))); + value.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_STRING)); + tag->AddTag(value); + } +} + + +/* CStatTreeItemAverageSpeed */ + +#ifndef AMULE_DAEMON +wxString CStatTreeItemAverageSpeed::GetDisplayString() const +{ + uint64 time = m_timer->GetTimerSeconds(); + if (time) { + return CFormat(wxGetTranslation(m_label)) % CastItoSpeed((*m_counter)/time); + } else { + return CFormat(wxGetTranslation(m_label)) % CastItoSpeed(0); + } +} +#endif + +void CStatTreeItemAverageSpeed::AddECValues(CECTag *tag) const +{ + uint64 time = m_timer->GetTimerSeconds(); + if (time) { + CECTag value(EC_TAG_STAT_NODE_VALUE, (uint32)((*m_counter)/time)); + value.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_SPEED)); + tag->AddTag(value); + } else { + CECTag value(EC_TAG_STAT_NODE_VALUE, (uint32)0); + value.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_SPEED)); + tag->AddTag(value); + } +} + + +/* CStatTreeItemRatio */ + +#ifndef AMULE_DAEMON +wxString CStatTreeItemRatio::GetDisplayString() const +{ + if (m_counter1->GetValue() && m_counter2->GetValue()) { + if ((*m_counter2) < (*m_counter1)) { + return CFormat(wxGetTranslation(m_label)) % + wxString::Format(wxT("%.2f : 1"), + (float)(*m_counter1)/(*m_counter2)); + } else { + return CFormat(wxGetTranslation(m_label)) % + wxString::Format(wxT("1 : %.2f"), + (float)(*m_counter2)/(*m_counter1)); + } + } else { + return CFormat(wxGetTranslation(m_label)) % _("Not available"); + } +} +#endif + +void CStatTreeItemRatio::AddECValues(CECTag *tag) const +{ + wxString result; + if (m_counter1->GetValue() && m_counter2->GetValue()) { + if ((*m_counter2) < (*m_counter1)) { + result = wxString::Format(wxT("%.2f : 1"), (float)(*m_counter1)/(*m_counter2)); + } else { + result = wxString::Format(wxT("1 : %.2f"), (float)(*m_counter2)/(*m_counter1)); + } + } else { + result = wxTRANSLATE("Not available"); + } + + CECTag value(EC_TAG_STAT_NODE_VALUE, result); + value.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_STRING)); + tag->AddTag(value); +} + + +/* CStatTreeItemReconnects */ + +#ifndef AMULE_DAEMON +wxString CStatTreeItemReconnects::GetDisplayString() const +{ + return CFormat(wxGetTranslation(m_label)) % (m_value ? m_value - 1 : 0); +} +#endif + +void CStatTreeItemReconnects::AddECValues(CECTag *tag) const +{ + tag->AddTag(CECTag(EC_TAG_STAT_NODE_VALUE, + m_value ? (uint64)(m_value - 1) : (uint64)0)); +} + +/* CStatTreeItemMaxConnLimitReached */ + +#ifndef AMULE_DAEMON +wxString CStatTreeItemMaxConnLimitReached::GetDisplayString() const +{ + if (m_count) { + return CFormat(wxGetTranslation(m_label)) % + (wxString::Format(wxT("%i : "), m_count) + + m_time.FormatISODate() + + wxT(" ") + + m_time.FormatISOTime()); + } else { + return CFormat(wxGetTranslation(m_label)) % _("Never"); + } +} +#endif + +void CStatTreeItemMaxConnLimitReached::AddECValues(CECTag *tag) const +{ + wxString result; + if (m_count) { + result = wxString::Format(wxT("%i : "), m_count) + + m_time.FormatISODate() + + wxT(" ") + + m_time.FormatISOTime(); + } else { + result = wxTRANSLATE("Never"); + } + CECTag value(EC_TAG_STAT_NODE_VALUE, result); + value.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_STRING)); + tag->AddTag(value); +} + +/* CStatTreeItemTotalClients */ + +#ifndef AMULE_DAEMON +wxString CStatTreeItemTotalClients::GetDisplayString() const +{ + return CFormat(wxGetTranslation(m_label)) % + (m_known->GetValue() + m_unknown->GetValue()) % + m_known->GetValue(); +} +#endif + +void CStatTreeItemTotalClients::AddECValues(CECTag *tag) const +{ + CECTag value1(EC_TAG_STAT_NODE_VALUE, + (uint64)(m_known->GetValue() + m_unknown->GetValue())); + tag->AddTag(value1); + CECTag value2(EC_TAG_STAT_NODE_VALUE, + (uint64)m_known->GetValue()); + tag->AddTag(value2); +} + +#endif /* !EC_REMOTE */ +// File_checked_for_headers diff --git a/src/StatTree.h b/src/StatTree.h new file mode 100644 index 00000000..cc6d3cbf --- /dev/null +++ b/src/StatTree.h @@ -0,0 +1,1191 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (C) 2005-2008 Dévai Tamás ( gonosztopi@amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef STATTREE_H +#define STATTREE_H + +/** + * @file StatTree.h + * + * Interface to stat tree nodes. + * + * This file defines various classes representing + * statistics tree nodes. + */ + + +#ifndef EC_REMOTE // i.e. not CLIENT_GUI +# define VIRTUAL virtual +#else +# define VIRTUAL +#endif + + +#include // Needed for std::list +#include // Needed for wxString +#include // Needed for wxMutex + +#ifndef EC_REMOTE + +#include // Needed for wxDateTime +#include "GetTickCount.h" // Needed for GetTickCount64() + + +/** + * Stat tree flags + */ +enum EStatTreeFlags +{ + stNone = 0, ///< Nothing. Really. + stSortChildren = 1, ///< Childrens are sorted descending by their ID. + stShowPercent = 2, /*!< Shows percentage compared to parent. + * Counters only, whose parent is also counter! (khmm...) + */ + stHideIfZero = 4, ///< Hides item (and children) if value is zero. + stSortByValue = 8, /*!< Together with stSortChildren, sorts children by their value. + * WARNING! This assumes that value-sorted children are + * counters! + * Sort-by-value works only on children with ID between 0x00000100-0x7fffffff. + * @note CStatTreeItemBase::ReSortChildren() must be called to get sort order right. + */ + stCapChildren = 16 ///< Caps children list. + /*!< Shows only top n children, where n is set by CStatisticsDlg::FillTree() to thePrefs::GetMaxClientVersions(). + * The list itself is not changed, only visibility is ignored on items + * outside the top n visible. + * + * On an EC request, visibility range can be set with the EC_TAG_STATTREE_CAPPING tag. + */ +}; + +enum EValueType +{ + vtUnknown, + vtString, + vtInteger, + vtFloat +}; + +/** + * Display modes for Simple and Counter items + */ +enum EDisplayMode +{ + dmDefault, ///< Default display mode. + dmTime, ///< Treat integer value as time in seconds. + dmBytes ///< Treat integer value as bytes count. +}; + +#endif /* !EC_REMOTE */ + + +class CStatTreeItemBase; +typedef std::list::iterator StatTreeItemIterator; + + +class CECTag; + +uint32_t NewStatTreeItemId(); + + +/** + * Base tree item class + */ +class CStatTreeItemBase +{ +public: + +#ifndef EC_REMOTE + /** + * Creates an item with a constant label. + * + * @param label Visible text for the item. + * @param flags Flags to use. + */ + CStatTreeItemBase(const wxString &label, unsigned flags = stNone) + : m_label(label), m_parent(NULL), m_flags(flags), m_id(0), + m_uniqueid(NewStatTreeItemId()) + {} +#else + /** + * Creates an item with a constant label. + * + * @param label Visible text for the item. + */ + CStatTreeItemBase(const wxString &label, uint32_t uniqueid) + : m_label(label), m_uniqueid(uniqueid) + {} + + /** + * Creates an item (and the whole subtree) from an EC tag. + * + * @param tag EC tag containing a stat subtree. + */ + CStatTreeItemBase(const CECTag *tag); +#endif + + /** + * Deletes all children. + */ + VIRTUAL ~CStatTreeItemBase(); + +#ifndef EC_REMOTE + /** + * Adds a new child node. + * + * @param child child to add. + * @param id an optional ID for the new item. + * @param skipOneLevel activates a trick to let the code work for aMule OSInfo and Version trees. + * + * @return the newly added item. + */ + CStatTreeItemBase *AddChild( + CStatTreeItemBase* child, + uint32_t id = 0, + bool skipOneLevel = false); +#endif + + /** + * Check for children. + * + * @return true if this node has children, false otherwise. + */ + bool HasChildren() { wxMutexLocker lock(m_lock); return !m_children.empty(); } + + /** + * Check for visible children. + * + * @return true if this node has children and at least one of them is visible. + */ + bool HasVisibleChildren(); + +#ifndef EC_REMOTE + + /** + * Check for a given child. + * + * @return true if this node has a child with the given ID. + */ + bool HasChildWithId(uint32_t id); + + /** + * Access a specific child. + * + * @return the child with the given ID, or NULL if not found. + */ + CStatTreeItemBase *GetChildById(uint32_t id); + + /** + * Get the first visible child. + * + * @param max_children The maximum number of children to show, when the stCapChildren flag is set. Otherwise it has no effect. (0 = unlimited) + * + * @return An iterator, that should be passed to GetNextVisibleChild() and IsAtEndOfList(). + */ + StatTreeItemIterator GetFirstVisibleChild(uint32_t max_children); + + /** + * Get the next visible child. + */ + void GetNextVisibleChild(StatTreeItemIterator& it); + +#else /* EC_REMOTE */ + + /** + * Get the first visible child. + * + * @return An iterator, that should be passed to GetNextVisibleChild() and IsAtEndOfList(). + * + * @note On a remote list every item is visible. + */ + StatTreeItemIterator GetFirstVisibleChild() { return m_children.begin(); } + + /** + * Get the next visible child. + * + * @note On a remote list every item is visible. + */ + void GetNextVisibleChild(StatTreeItemIterator& it) { ++it; } + +#endif /* !EC_REMOTE / EC_REMOTE */ + + /** + * Check if we are past the end of child list. + */ + bool IsAtEndOfList(StatTreeItemIterator& it) { return it == m_children.end(); } + +#ifndef EC_REMOTE + /** + * Resorts children for the stSortByValue flag. + */ + void ReSortChildren() { wxMutexLocker lock(m_lock); m_children.sort(ValueSort); } +#endif + +#ifndef AMULE_DAEMON +#ifndef EC_REMOTE + /** + * Returns a string that will be displayed on the GUI tree. + */ + virtual wxString GetDisplayString() const; +#else + /** + * Returns the associated text (GUI item label). + */ + const wxString& GetDisplayString() const { return m_label; } +#endif /* !EC_REMOTE / EC_REMOTE */ + + /** + * Returns the mutex used to lock the child list of this node. + * + * This function is used by CStatisticsDlg to be able to lock the + * core tree while updating the GUI tree. + */ + wxMutex& GetLock() { return m_lock; } + + /** + * Returns the unique ID of this node. + */ + uint32_t GetUniqueId() const { return m_uniqueid; } +#endif /* !AMULE_DAEMON */ + + /** + * Check whether this node is visible. + */ + VIRTUAL bool IsVisible() const { return true; } + +#ifndef EC_REMOTE + /** + * Create an EC tag from this node (and children). + * + * @param max_children The maximum number of children to show, when the stCapChildren flag is set. Otherwise it has no effect. (0 = unlimited) + * + * @return A EC tag containing this node and all its children. + */ + virtual CECTag *CreateECTag(uint32_t max_children); +#endif + +protected: + +#ifndef EC_REMOTE + /** + * Add values to the EC tag being generated. + * + * Should have a real implementation in children which have some value. + * The given parameter is the tag to which values should be added. + */ + virtual void AddECValues(CECTag*) const {} +#endif + + //! Unformatted and untranslated label of the node. Note: On remote gui it is already formatted and translated. + const wxString m_label; +#ifndef EC_REMOTE + + //! Parent of this node. + CStatTreeItemBase *m_parent; + + //! Flags for the node. + unsigned m_flags; +#endif + +private: + +#ifndef EC_REMOTE + //! Function used when sorting children by value. + static bool ValueSort(CStatTreeItemBase* a, CStatTreeItemBase* b); + + //! ID of this node. + uint32_t m_id; + + //! Counter to keep track of displayed visible items + // (needed for the stCapChildren flag) + uint32_t m_visible_counter; +#endif + + //! Unique ID of this node. + uint32_t m_uniqueid; + + //! Children of this node. + std::list m_children; + + //! Lock to protect list from simultanous access. + wxMutex m_lock; +}; + + +// +// Anything below is only for core. +// +#ifndef EC_REMOTE + +/** + * Simple tree item. + * + * This tree item has one value and nothing speciality. :) + * The value might be an arbitrary integer or floating point type, + * or a wxString string. + * + * The item is able to display value in different formats, see SetDisplayMode(). + * + * @note that you have to specify the right format code on 'label', i.e.: + * %s for string and integers with displayMode dmTime or dmBytes, + * %u or similar for integers, and + * %f or similar for floating point types. + * + * @note You have to call SetValue() after creation for non-integer values, otherwise + * you'll get undesired results. + */ +class CStatTreeItemSimple : public CStatTreeItemBase +{ +public: + + /** + * Constructor. + * + * @see CStatTreeItemBase::CStatTreeItemBase + */ + CStatTreeItemSimple( + const wxString &label, + unsigned flags = stNone, + enum EDisplayMode displaymode = dmDefault) + : + CStatTreeItemBase(label, flags), + m_valuetype(vtUnknown), + m_displaymode(displaymode) + { + SetValue((uint64_t)0); + } + + /** + * Sets the desired display mode of value. + */ + void SetDisplayMode(enum EDisplayMode mode) + { + m_displaymode = mode; + } + + /** + * Sets an integer type value. + * + * @param value the value to be set. + */ + void SetValue(uint64_t value) + { + m_valuetype = vtInteger; + m_intvalue = value; + } + + /** + * Sets a floating point type value. + * + * @param value the value to be set. + */ + void SetValue(double value) + { + m_valuetype = vtFloat; + m_floatvalue = value; + } + + /** + * Sets a string type value. + * + * @param value the value to be set. + */ + void SetValue(const wxString& value) + { + m_valuetype = vtString; + m_stringvalue = value; + } + +#ifndef AMULE_DAEMON + /** + * @see CStatTreeItemBase::GetDisplayString() + */ + virtual wxString GetDisplayString() const; +#endif + + /** + * @see CStatTreeItemBase::IsVisible() + */ + virtual bool IsVisible() const; + +protected: + /** + * Add values to EC tag being generated. + * + * @param tag The tag to which values should be added. + * + * @see CStatTreeItemBase::AddECValues + */ + virtual void AddECValues(CECTag *tag) const; + + //! Type of the value. + enum EValueType m_valuetype; + //! Display mode of the value. + enum EDisplayMode m_displaymode; + //! Union to save space. + union + { + uint64_t m_intvalue; ///< Integer value. + double m_floatvalue; ///< Floating point value. + }; + wxString m_stringvalue; ///< String value. +}; + + +/** + * Counter-type tree item template. + * + * Able to show percentage compared to parent, hide itself + * when value is zero, and nice functions for changing the value. + * stShowPercent and stHideIfZero flags take effect only on + * this node. + */ +template +class CStatTreeItemCounterTmpl : public CStatTreeItemBase +{ +public: + /** + * Constructor. + * + * @see CStatTreeItemBase::CStatTreeItemBase + */ + CStatTreeItemCounterTmpl( + const wxString &label, + unsigned flags = stNone) + : + CStatTreeItemBase(label, flags), + m_value(0), + m_displaymode(dmDefault) {} + + /** + * Retrieve counter value. + */ + _Tp GetValue() const { return m_value; } + + /** + * Retrieve counter value. + */ + operator _Tp() const { return m_value; } + + /** + * Set counter to given value. + */ + void SetValue(_Tp value) { m_value = value; } + + /** + * Set counter to given value. + */ + void operator=(_Tp value) { m_value = value; } + + /** + * Increase value by 1. + */ + void operator++() { ++m_value; } + + /** + * Decrease value by 1. + */ + void operator--() { --m_value; } + + /** + * Increase value by given amount. + */ + void operator+=(_Tp value) { m_value += value; } + + /** + * Decrease value by given amount. + */ + void operator-=(_Tp value) { m_value -= value; } + + /** + * Sets the desired display mode of value. + */ + void SetDisplayMode(enum EDisplayMode mode) { m_displaymode = mode; } + +#ifndef AMULE_DAEMON + /** + * @see CStatTreeItemBase::GetDisplayString() + */ + virtual wxString GetDisplayString() const; +#endif + + /** + * @see CStatTreeItemBase::IsVisible() + */ + virtual bool IsVisible() const + { + return (m_flags & stHideIfZero) ? (m_value != 0) : true; + } + +protected: + /** + * Add values to EC tag being generated. + * + * @param tag The tag to which values should be added. + * + * @see CStatTreeItemBase::AddECValues + */ + virtual void AddECValues(CECTag *tag) const; + + //! Actual value of the counter. + _Tp m_value; + + //! Display mode of the value. + enum EDisplayMode m_displaymode; +}; + +// Evil hack to find the type to be used in CStatTreeItemNativeCounter +template struct get_native_type { typedef uint32_t type; }; +template struct get_native_type<_Tp, _Tp> { typedef uint64_t type; }; + +typedef CStatTreeItemCounterTmpl CStatTreeItemCounter; +typedef CStatTreeItemCounterTmpl::type> CStatTreeItemNativeCounter; + + +/** + * A counter, which does not display its value :P + */ +class CStatTreeItemHiddenCounter : public CStatTreeItemCounter +{ +public: + /** + * Constructor. + * + * @see CStatTreeItemCounter::CStatTreeItemCounter + */ + CStatTreeItemHiddenCounter( + const wxString &label, + unsigned flags = stNone) + : + CStatTreeItemCounter(label, flags) {} + +#ifndef AMULE_DAEMON + /** + * @see CStatTreeItemBase::GetDisplayString() + */ + virtual wxString GetDisplayString() const + { + return CStatTreeItemBase::GetDisplayString(); + } +#endif + + /** + * @see CStatTreeItemBase::IsVisible() + */ + virtual bool IsVisible() const { return true; } + +protected: + //! Do nothing here. + virtual void AddECValues(CECTag*) const {} +}; + + +/** + * Item for the session/total upload/download counter + */ +class CStatTreeItemUlDlCounter : public CStatTreeItemCounter +{ +public: + /** + * @param label format text for item. + * @param totalfunc function that will return the totals. + */ + CStatTreeItemUlDlCounter( + const wxString &label, + uint64_t (*totalfunc)(), + unsigned flags = stNone) + : + CStatTreeItemCounter(label, flags), + m_totalfunc(totalfunc) {} + +#ifndef AMULE_DAEMON + /** + * @see CStatTreeBase::GetDisplayString() + */ + virtual wxString GetDisplayString() const; +#endif + +protected: + /** + * Add values to EC tag being generated. + * + * @param tag The tag to which values should be added. + * + * @see CStatTreeItemBase::AddECValues + */ + virtual void AddECValues(CECTag *tag) const; + + //! A function whose return value is the total (without current) value. + uint64_t (*m_totalfunc)(); +}; + + +/** + * Counter-like tree item which remembers its max value. + * + * Used for active connections counter, to be able to get peak connections. + */ +class CStatTreeItemCounterMax : public CStatTreeItemBase +{ +public: + /** + * @see CStatTreeItemBase::CStatTreeItemBase + */ + CStatTreeItemCounterMax(const wxString &label) + : + CStatTreeItemBase(label), + m_value(0), + m_max_value(0) + {} + + /** + * Increase value + */ + void operator++() + { + if (++m_value > m_max_value) { + m_max_value = m_value; + } + } + + /** + * Decrease value + */ + void operator--() { --m_value; } + + /** + * Retrieve actual value + */ + uint32_t GetValue() { return m_value; } + + /** + * Retrieve max value + */ + uint32_t GetMaxValue() { return m_max_value; } + +#ifndef AMULE_DAEMON + /** + * @see CStatTreeItemBase::GetDisplayString() + */ + virtual wxString GetDisplayString() const; +#endif + +protected: + /** + * Add values to EC tag being generated. + * + * @param tag The tag to which values should be added. + * + * @see CStatTreeItemBase::AddECValues + */ + virtual void AddECValues(CECTag *tag) const; + + //! Actual value of the counter. + uint32_t m_value; + + //! Maximal value the counter has ever reached. + uint32_t m_max_value; +}; + + +/** + * Tree item for counting packets + */ +class CStatTreeItemPackets : public CStatTreeItemBase +{ + friend class CStatTreeItemPacketTotals; + +public: + /** + * @see CStatTreeItemBase::CStatTreeItemBase + */ + CStatTreeItemPackets(const wxString &label) + : + CStatTreeItemBase(label, stNone), + m_packets(0), + m_bytes(0) {} + + /** + * Add a packet of size 'size'. + */ + void operator+=(long size) + { + ++m_packets; + m_bytes += size; + } + +#ifndef AMULE_DAEMON + /** + * @see CStatTreeItemBase::GetDisplayString() + */ + virtual wxString GetDisplayString() const; +#endif + +protected: + /** + * Add values to EC tag being generated. + * + * @param tag The tag to which values should be added. + * + * @see CStatTreeItemBase::AddECValues + */ + virtual void AddECValues(CECTag *tag) const; + + //! Total number of packets. + uint32_t m_packets; + + //! Total bytes in the packets. + uint64_t m_bytes; +}; + + +/** + * Tree item for counting totals on packet counters. + * + * This item sums up a number of packet counters, plus adds its own values. + */ +class CStatTreeItemPacketTotals : public CStatTreeItemPackets +{ +public: + /** + * @see CStatTreeItemPackets::CStatTreeItemPackets + */ + CStatTreeItemPacketTotals(const wxString &label) + : + CStatTreeItemPackets(label) {} + + /** + * Adds a packet counter, whose values should be counted in the totals. + */ + void AddPacketCounter(CStatTreeItemPackets* counter) + { + m_counters.push_back(counter); + } + +#ifndef AMULE_DAEMON + /** + * @see CStatTreeItemPackets::GetDisplayString() + */ + virtual wxString GetDisplayString() const; +#endif + +protected: + /** + * Add values to EC tag being generated. + * + * @param tag The tag to which values should be added. + * + * @see CStatTreeItemBase::AddECValues + */ + virtual void AddECValues(CECTag *tag) const; + + //! List of packet counters to sum. + std::vector m_counters; +}; + + +/** + * Tree item for timer type nodes. + */ +class CStatTreeItemTimer : public CStatTreeItemBase +{ +public: + + /** + * @see CStatTreeItemBase::CStatTreeItemBase + */ + CStatTreeItemTimer( + const wxString &label, + unsigned flags = stNone) + : + CStatTreeItemBase(label, flags), + m_value(0) {} + + /** + * Sets timer start time (and thus starts timer). + */ + void SetStartTime(uint64_t value) { m_value = value; } + + /** + * Starts the timer if it's not running. + */ + void StartTimer() { if (!m_value) m_value = GetTickCount64(); } + + /** + * Stops the timer. + */ + void StopTimer() { m_value = 0; } + + /** + * Check whether the timer is running. + */ + bool IsRunning() const { return m_value != 0; } + + /** + * Reset timer unconditionally. + */ + void ResetTimer() { m_value = GetTickCount64(); } + + /** + * Get timer value. + */ + uint64_t GetTimerValue() const + { + return m_value ? GetTickCount64() - m_value : 0; + } + + /** + * Get timer value (in ticks). + */ + operator uint64_t() const + { + return m_value ? GetTickCount64() - m_value : 0; + } + + /** + * Get elapsed time in seconds. + */ + uint64_t GetTimerSeconds() const + { + return m_value ? (GetTickCount64() - m_value) / 1000 : 0; + } + + /** + * Get start time of the timer. + */ + uint64_t GetTimerStart() const { return m_value; } + +#ifndef AMULE_DAEMON + /** + * @see CStatTreeItemBase::GetDisplayString() + */ + virtual wxString GetDisplayString() const; +#endif + + /** + * @see CStatTreeItemBase::IsVisible() + */ + virtual bool IsVisible() const + { + return (m_flags & stHideIfZero) ? m_value != 0 : true; + } + +protected: + /** + * Add values to EC tag being generated. + * + * @param tag The tag to which values should be added. + * + * @see CStatTreeItemBase::AddECValues + */ + virtual void AddECValues(CECTag *tag) const; + + //! Tick count value when timer was started. + uint64_t m_value; +}; + + +/** + * Tree item for shared files average size. + * + * Average is counted as dividend / divisor, if divisor is non-zero. + */ +class CStatTreeItemAverage : public CStatTreeItemBase +{ +public: + /** + * @see CStatTreeItemBase::CStatTreeItemBase + * + * @param dividend What to divide. + * @param divisor Divide by what. + */ + CStatTreeItemAverage( + const wxString &label, + const CStatTreeItemCounter *dividend, + const CStatTreeItemCounter *divisor, + enum EDisplayMode displaymode) + : + CStatTreeItemBase(label, stNone), + m_dividend(dividend), + m_divisor(divisor), + m_displaymode(displaymode) {} + +#ifndef AMULE_DAEMON + /** + * @see CStatTreeItemBase::GetDisplayString() + */ + virtual wxString GetDisplayString() const; +#endif + + /** + * @see CStatTreeItemBase::IsVisible() + */ + virtual bool IsVisible() const { return (*m_divisor) != 0; } + +protected: + /** + * Add values to EC tag being generated. + * + * @param tag The tag to which values should be added. + * + * @see CStatTreeItemBase::AddECValues + */ + virtual void AddECValues(CECTag *tag) const; + + //! What to divide. + const CStatTreeItemCounter *m_dividend; + + //! Divide by what. + const CStatTreeItemCounter *m_divisor; + + //! Display mode. + enum EDisplayMode m_displaymode; +}; + + +/** + * Tree item for average up/down speed. + */ +class CStatTreeItemAverageSpeed : public CStatTreeItemBase +{ +public: + + /** + * @see CStatTreeItemBase::CStatTreeItemBase + * + * @param counter Session up/down counter. + * @param timer Session uptime timer. + */ + CStatTreeItemAverageSpeed( + const wxString &label, + const CStatTreeItemUlDlCounter *counter, + const CStatTreeItemTimer *timer) + : + CStatTreeItemBase(label, stNone), + m_counter(counter), + m_timer(timer) {} + +#ifndef AMULE_DAEMON + /** + * @see CStatTreeItemBase::GetDisplayString() + */ + virtual wxString GetDisplayString() const; +#endif + +protected: + /** + * Add values to EC tag being generated. + * + * @param tag The tag to which values should be added. + * + * @see CStatTreeItemBase::AddECValues + */ + virtual void AddECValues(CECTag *tag) const; + + //! Session sent/received bytes counter. + const CStatTreeItemUlDlCounter *m_counter; + + //! Session uptime. + const CStatTreeItemTimer *m_timer; +}; + + +/** + * Tree item for displaying ratio between two counters. + * + * Ratio is counted as counter1:counter2. + */ +class CStatTreeItemRatio : public CStatTreeItemBase +{ +public: + /** + * @see CStatTreeItemBase::CStatTreeItemBase + * + * @param cnt1 First counter to use. + * @param cnt2 Second counter to use. + */ + CStatTreeItemRatio( + const wxString &label, + const CStatTreeItemCounter *cnt1, + const CStatTreeItemCounter* cnt2) + : + CStatTreeItemBase(label, stNone), + m_counter1(cnt1), + m_counter2(cnt2) {} + +#ifndef AMULE_DAEMON + /** + * @see CStatTreeItemBase::GetDisplayString() + */ + virtual wxString GetDisplayString() const; +#endif + +protected: + /** + * Add values to EC tag being generated. + * + * @param tag The tag to which values should be added. + * + * @see CStatTreeItemBase::AddECValues + */ + virtual void AddECValues(CECTag *tag) const; + + //! First counter. + const CStatTreeItemCounter *m_counter1; + + //! Second counter. + const CStatTreeItemCounter *m_counter2; +}; + + +/** + * Special counter for reconnects. + */ +class CStatTreeItemReconnects : public CStatTreeItemNativeCounter { +public: + /** + * @see CStatTreeItemBase::CStatTreeItemBase + */ + CStatTreeItemReconnects(const wxString &label) + : + CStatTreeItemNativeCounter(label, stNone) {} + +#ifndef AMULE_DAEMON + /** + * @see CStatTreeItemBase::GetDisplayString() + */ + virtual wxString GetDisplayString() const; +#endif + +protected: + /** + * Add values to EC tag being generated. + * + * @param tag The tag to which values should be added. + * + * @see CStatTreeItemBase::AddECValues + */ + virtual void AddECValues(CECTag *tag) const; +}; + +/** + * Special item for Max Connection Limit Reached + */ +class CStatTreeItemMaxConnLimitReached : public CStatTreeItemBase +{ +public: + /** + * @see CStatTreeItemBase::CStatTreeItemBase + */ + CStatTreeItemMaxConnLimitReached(const wxString &label) + : + CStatTreeItemBase(label), + m_count(0) {} + + /** + * Increase counter and save time. + */ + void operator++() + { + ++m_count; + m_time.SetToCurrent(); + } + +#ifndef AMULE_DAEMON + /** + * Returns a string to be displayed on GUI. + * + * For m_count == 0 it will display "Never", + * for other values it will display the counter value and the + * date & time of the event. + */ + virtual wxString GetDisplayString() const; +#endif + +protected: + /** + * Add values to EC tag being generated. + * + * @param tag The tag to which values should be added. + * + * @see CStatTreeItemBase::AddECValues + */ + virtual void AddECValues(CECTag *tag) const; + + //! Number of times max conn limit reached. + uint32_t m_count; + + //! Last time when max conn limit reached. + wxDateTime m_time; +}; + +/** + * Special item for total client count + */ +class CStatTreeItemTotalClients : public CStatTreeItemBase +{ +public: + /** + * @see CStatTreeItemBase::CStatTreeItemBase + * + * @param known Counter that counts known clients. + * @param unknown Counter that counts unknown clients. + */ + CStatTreeItemTotalClients( + const wxString &label, + const CStatTreeItemCounter *known, + const CStatTreeItemCounter *unknown) + : + CStatTreeItemBase(label), + m_known(known), + m_unknown(unknown) {} + +#ifndef AMULE_DAEMON + /** + * @see CStatTreeItemBase::GetDisplayString() + */ + virtual wxString GetDisplayString() const; +#endif + +protected: + /** + * Add values to EC tag being generated. + * + * @param tag The tag to which values should be added. + * + * @see CStatTreeItemBase::AddECValues + */ + virtual void AddECValues(CECTag *tag) const; + + //! Counter counting known clients. + const CStatTreeItemCounter *m_known; + + //! Counter counting unknown clients. + const CStatTreeItemCounter *m_unknown; +}; + +#endif /* !EC_REMOTE */ + +#endif /* STATTREE_H */ +// File_checked_for_headers diff --git a/src/StateMachine.cpp b/src/StateMachine.cpp new file mode 100644 index 00000000..d177e522 --- /dev/null +++ b/src/StateMachine.cpp @@ -0,0 +1,107 @@ +// +// This file is part of the aMule Project. +// +// Copyright (C) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2004-2008 Marcelo Jimenez (phoenix@amule.org) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "StateMachine.h" + +#include + +CStateMachine::CStateMachine( + const wxString &name, + const unsigned int maxStates, + const t_sm_state initialState ) +: +m_stateMutex(wxMUTEX_RECURSIVE), +m_queueMutex(wxMUTEX_RECURSIVE), +m_name(name), +m_maxStates(maxStates), +m_initialState(initialState) +{ + m_state = initialState; + m_clockCounter = 0; + m_clocksInCurrentState = 0; +} + +CStateMachine::~CStateMachine() +{ +} + +void CStateMachine::Clock() +{ + t_sm_state old_state; + t_sm_event event; + bool state_entry; + + old_state = m_state; + + /* Process state change acording to event */ + if (!m_queue.empty()) { + event = m_queue.front(); + m_queue.pop(); + } else { + event = 0; + } + + /* State changes can only happen here */ + wxMutexLocker lock(m_stateMutex); + m_state = next_state( event ); + +//#if 0 + /* Debug */ + ++m_clockCounter; + state_entry = ( m_state != old_state ) || ( m_clockCounter == 1 ); + if( state_entry ) + { + m_clocksInCurrentState = 0; + printf( "%s(%04d): %d -> %d\n", + (const char *)unicode2char(m_name), + m_clockCounter, old_state, m_state); + } + ++m_clocksInCurrentState; +//#endif + + /* Process new state entry */ + if( m_state < m_maxStates ) + { + /* It should be ok to call Clock() recursively inside this + * procedure because state change has already happened. Also + * the m_state mutex is recursive. */ + process_state(m_state, state_entry); + } +} + +/* In multithreaded implementations, this must be locked */ +void CStateMachine::Schedule(t_sm_event event) +{ + wxMutexLocker lock(m_queueMutex); + m_queue.push(event); +} + +void CStateMachine::flush_queue() +{ + while (!m_queue.empty()) { + m_queue.pop(); + } +} +// File_checked_for_headers diff --git a/src/StateMachine.h b/src/StateMachine.h new file mode 100644 index 00000000..99fcf3e5 --- /dev/null +++ b/src/StateMachine.h @@ -0,0 +1,72 @@ +// +// This file is part of the aMule Project. +// +// Copyright (C) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2004-2008 Marcelo Jimenez (phoenix@amule.org) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// +// Generic state machine implementation +// + +#ifndef STATE_MACHINE_H +#define STATE_MACHINE_H + +#include + +#include /* For wxMutex, wxMutexLocker */ +#include /* For wxString */ + +typedef unsigned int t_sm_state; + +typedef unsigned int t_sm_event; + +class CStateMachine +{ +public: + CStateMachine( + const wxString &name, + const unsigned int maxStates, + const t_sm_state initialState ); + virtual ~CStateMachine() = 0; + void Clock(); + void Schedule(t_sm_event event); + t_sm_state GetState() const { return m_state; } + unsigned int GetClocksInCurrentState() const { return m_clocksInCurrentState; } + virtual t_sm_state next_state(t_sm_event event) = 0; + virtual void process_state(t_sm_state state, bool entry) = 0; + +private: + void flush_queue(); + + t_sm_state m_state; + wxMutex m_stateMutex; + std::queue m_queue; + wxMutex m_queueMutex; + const wxString m_name; + const unsigned int m_maxStates; + const unsigned int m_initialState; + unsigned int m_clockCounter; + unsigned int m_clocksInCurrentState; +}; + +#endif // STATE_MACHINE_H +// File_checked_for_headers diff --git a/src/Statistics.cpp b/src/Statistics.cpp new file mode 100644 index 00000000..f3543eda --- /dev/null +++ b/src/Statistics.cpp @@ -0,0 +1,985 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// Copyright (C) 2005-2008 Dévai Tamás ( gonosztopi@amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "Statistics.h" // Interface declarations + +#include + +#include // Needed for CECTag + +#ifndef EC_REMOTE + #ifndef AMULE_DAEMON + #include // Needed for CFormat + #endif + #include "DataToText.h" // Needed for GetSoftName() + #include "Preferences.h" // Needed for thePrefs + #include "amule.h" // Needed for theApp + #include "ListenSocket.h" // (tree, GetAverageConnections) + #include "ServerList.h" // Needed for CServerList (tree) + #include // Needed for std::floor + #include "updownclient.h" // Needed for CUpDownClient +#else + #include "Preferences.h" + #include // Needed for CRemoteConnect +#endif + +#include + +#ifdef __BSD__ + // glibc -> bsd libc + #define round rint +#else + #define round(x) floor(x+0.5) +#endif /* __BSD__ */ + + +#ifndef EC_REMOTE + +/*----- CPreciseRateCounter -----*/ + +void CPreciseRateCounter::CalculateRate(uint64_t now) +{ + wxMutexLocker lock(m_mutex); + + m_total += m_tmp_sum; + m_byte_history.push_back(m_tmp_sum); + m_tick_history.push_back(now); + m_tmp_sum = 0; + + uint64_t timespan = now - m_tick_history.front(); + + // Checking maximal timespan, but make sure not to remove + // the extra node in m_tick_history. + while (timespan > m_timespan && m_byte_history.size() > 0) { + m_total -= m_byte_history.front(); + m_byte_history.pop_front(); + m_tick_history.pop_front(); + timespan = now - m_tick_history.front(); + } + + // Count rate/average + if (m_count_average) { + if (m_byte_history.size() > 0) { + m_rate = m_total / (double)m_byte_history.size(); + } + } else { + if (timespan > 0) { + m_rate = m_total / (timespan / 1000.0); + } + } + + if (m_rate > m_max_rate) { + m_max_rate = m_rate; + } +} + + +/*----- CStatTreeItemRateCounter -----*/ + +#ifndef AMULE_DAEMON +wxString CStatTreeItemRateCounter::GetDisplayString() const +{ + return CFormat(wxGetTranslation(m_label)) % CastItoSpeed(m_show_maxrate ? (uint32)m_max_rate : (uint32)m_rate); +} +#endif + +void CStatTreeItemRateCounter::AddECValues(CECTag* tag) const +{ + CECTag value(EC_TAG_STAT_NODE_VALUE, m_show_maxrate ? (uint32)m_max_rate : (uint32)m_rate); + value.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_SPEED)); + tag->AddTag(value); +} + + +/*----- CStatTreeItemPeakConnections -----*/ + +#ifndef AMULE_DAEMON +wxString CStatTreeItemPeakConnections::GetDisplayString() const +{ + return wxString::Format(wxGetTranslation(m_label), theStats::GetPeakConnections()); +} +#endif + +void CStatTreeItemPeakConnections::AddECValues(CECTag* tag) const +{ + tag->AddTag(CECTag(EC_TAG_STAT_NODE_VALUE, (uint64)theStats::GetPeakConnections())); +} + + +/*----- CStatistics -----*/ + +// Static variables + +// Rate counters +CPreciseRateCounter* CStatistics::s_upOverheadRate; +CPreciseRateCounter* CStatistics::s_downOverheadRate; +CStatTreeItemRateCounter* CStatistics::s_uploadrate; +CStatTreeItemRateCounter* CStatistics::s_downloadrate; + +#else /* EC_REMOTE */ + +uint64 CStatistics::s_start_time; +uint64 CStatistics::s_statData[sdTotalItems]; + +#endif /* !EC_REMOTE / EC_REMOTE */ + +// Tree root +CStatTreeItemBase* CStatistics::s_statTree; + +#ifndef EC_REMOTE +// Uptime +CStatTreeItemTimer* CStatistics::s_uptime; + +// Upload +CStatTreeItemUlDlCounter* CStatistics::s_sessionUpload; +CStatTreeItemPacketTotals* CStatistics::s_totalUpOverhead; +CStatTreeItemPackets* CStatistics::s_fileReqUpOverhead; +CStatTreeItemPackets* CStatistics::s_sourceXchgUpOverhead; +CStatTreeItemPackets* CStatistics::s_serverUpOverhead; +CStatTreeItemPackets* CStatistics::s_kadUpOverhead; +CStatTreeItemNativeCounter* CStatistics::s_activeUploads; +CStatTreeItemNativeCounter* CStatistics::s_waitingUploads; +CStatTreeItemCounter* CStatistics::s_totalSuccUploads; +CStatTreeItemCounter* CStatistics::s_totalFailedUploads; +CStatTreeItemCounter* CStatistics::s_totalUploadTime; + +// Download +CStatTreeItemUlDlCounter* CStatistics::s_sessionDownload; +CStatTreeItemPacketTotals* CStatistics::s_totalDownOverhead; +CStatTreeItemPackets* CStatistics::s_fileReqDownOverhead; +CStatTreeItemPackets* CStatistics::s_sourceXchgDownOverhead; +CStatTreeItemPackets* CStatistics::s_serverDownOverhead; +CStatTreeItemPackets* CStatistics::s_kadDownOverhead; +CStatTreeItemNativeCounter* CStatistics::s_foundSources; +CStatTreeItemNativeCounter* CStatistics::s_activeDownloads; + +// Connection +CStatTreeItemReconnects* CStatistics::s_reconnects; +CStatTreeItemTimer* CStatistics::s_sinceFirstTransfer; +CStatTreeItemTimer* CStatistics::s_sinceConnected; +CStatTreeItemCounterMax* CStatistics::s_activeConnections; +CStatTreeItemMaxConnLimitReached* CStatistics::s_limitReached; +CStatTreeItemSimple* CStatistics::s_avgConnections; + +// Clients +CStatTreeItemHiddenCounter* CStatistics::s_clients; +CStatTreeItemCounter* CStatistics::s_unknown; +//CStatTreeItem CStatistics::s_lowID; +//CStatTreeItem CStatistics::s_secIdentOnOff; +#ifdef __DEBUG__ +CStatTreeItemNativeCounter* CStatistics::s_hasSocket; +#endif +CStatTreeItemNativeCounter* CStatistics::s_filtered; +CStatTreeItemNativeCounter* CStatistics::s_banned; + +// Servers +CStatTreeItemSimple* CStatistics::s_workingServers; +CStatTreeItemSimple* CStatistics::s_failedServers; +CStatTreeItemNativeCounter* CStatistics::s_totalServers; +CStatTreeItemNativeCounter* CStatistics::s_deletedServers; +CStatTreeItemNativeCounter* CStatistics::s_filteredServers; +CStatTreeItemSimple* CStatistics::s_usersOnWorking; +CStatTreeItemSimple* CStatistics::s_filesOnWorking; +CStatTreeItemSimple* CStatistics::s_totalUsers; +CStatTreeItemSimple* CStatistics::s_totalFiles; +CStatTreeItemSimple* CStatistics::s_serverOccupation; + +// Shared files +CStatTreeItemCounter* CStatistics::s_numberOfShared; +CStatTreeItemCounter* CStatistics::s_sizeOfShare; + +// Kad +uint64 CStatistics::s_kadNodesTotal; +uint16 CStatistics::s_kadNodesCur; + + +CStatistics::CStatistics() + : m_graphRunningAvgDown(thePrefs::GetStatsAverageMinutes() * 60 * 1000, true), + m_graphRunningAvgUp(thePrefs::GetStatsAverageMinutes() * 60 * 1000, true), + m_graphRunningAvgKad(thePrefs::GetStatsAverageMinutes() * 60 * 1000, true) +{ + uint64 start_time = GetTickCount64(); + + // Init graphs + + average_minutes = thePrefs::GetStatsAverageMinutes(); + + HR hr = {0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0}; + hrInit = hr; + nHistRanges = 7; // =ceil(log(max_update_delay)/log(2)) + nPointsPerRange = GetPointsPerRange(); + bitsHistClockMask = (1 << (nHistRanges-1)) - 1; + aposRecycle = new listPOS[nHistRanges]; + listPOS *ppos = aposRecycle+nHistRanges-1; + for (int i=nHistRanges; i>0; --i) { // permanently allocated history list + listHR.push_back(hr); + *ppos-- = --listHR.end(); + for (int j=nPointsPerRange; j>1; --j) + listHR.push_back(hr); + } + + // Init rate counters outside the tree + + s_upOverheadRate = new CPreciseRateCounter(5000); + s_downOverheadRate = new CPreciseRateCounter(5000); + + // Init Tree + + InitStatsTree(); + s_uptime->SetStartTime(start_time); +} + + +CStatistics::~CStatistics() +{ + // clearing listHR frees the memory occupied by the nodes + listHR.clear(); + delete [] aposRecycle; + + delete s_statTree; + + // delete items not in the tree + delete s_totalUploadTime; + + // delete rate counters outside the tree + delete s_upOverheadRate; + delete s_downOverheadRate; +} + + +void CStatistics::CalculateRates() +{ + uint64_t now = GetTickCount64(); + s_downOverheadRate->CalculateRate(now); + s_upOverheadRate->CalculateRate(now); + s_downloadrate->CalculateRate(now); + s_uploadrate->CalculateRate(now); +} + + +/* ------------------------------- GRAPHS ---------------------------- */ + +/* +History List + + The basic idea here is that we want to keep as much history as we can without paying +a high price in terms of memory space. Because we keep the history for display purposes, +we can take advantage of the fact that when the period shown in the graphs is long +then each pixel represents a long period. So as the most recent history we keep one +window full of points at a resolution of 1 second, the next window full at 2 seconds, +the next at 4 seconds and so on, up to the maximum desired. This way there is always +at least one sample point per pixel for any update delay set by the user, and the +memory required grows with the *log* of the total time period covered. + The history is kept in a doubly-linked list, with the most recent snapshot at the tail. +The number of nodes in the list is fixed, and there are no calls to RemoveHead() and +AddTail() which would add overhead and contribute to memory fragmentation. Instead, +every second when a new point gets recorded, one of the existing nodes is recycled; +it is disjoined from its present place, put at the tail of the list, and then gets +filled with new data. [Emilio Sandoz] + This unfortunately does not work with stl classes, as none of them supports moving +a node to another place, so we have to erase and re-add nodes. +*/ + +void CStatistics::RecordHistory() +{ // First we query and compute some values, then we store them in the history list + + // A few comments about the use of double and float in computations: + // Even on a hi-res screen our graphs will have 10 bits of resolution at most, + // so the 24 bits resolution of a float on 32 bit Intel processors is more than + // enough for all displayed values. Rate computations however, and especially + // running average computations, use differences (delta bytes/ delta time), and + // for long uptimes the difference between two timestamps can lose too much + // accuracy because the large mantissa causes less significant bits to be dropped + // (same for the difference between two cumulative byte counts). [We don't store + // these values as integers because they will be used in floating point calculations, + // and we want to perform the conversion only once). Therefore timestamps and + // Kbyte counts are stored in the history as doubles, while computed values use + // float (to save space and execution time). + +/* + Store values; first determine the node to be recycled (using the bits in iClock) + + oldest records ----------------- listHR ------------------ youngest records + + O-[Range 2^n sec]-O- ... -O-[Range 4 sec]-O-[Range 2 sec]-O-[Range 1 sec]-O + | | | | > every 2 secs -^ + | | ... | >--------------- every 4 secs -^ + | | >------------------------ recycle every 8 secs -^ + | | ... + | >-the node at this position is recycled every 2^n secs -^ + >-------------------(ditto for the oldest node at the head of the list) --^ + ^ ^ + aposRecycle[nHistRanges-1] ... aposRecycle[0] Tail +*/ + listPOS *ppos; + static int iClock; + int iClockPrev = iClock++; + int bits = (iClockPrev^iClock) & iClock; // identify the highest changed bit + if (bits <= bitsHistClockMask) { + ppos = aposRecycle; + while ((bits /= 2) != 0) // count to the highest bit that was just toggled to 1 + ++ppos; + // recycle one node and jump over the next to move it to the next higher range + listHR.push_back(**ppos); + *ppos = ++listHR.erase(*ppos); + } else { + ppos = aposRecycle+nHistRanges-1; + // recycle the node at the head; there is no higher range to move nodes into + listHR.push_back(**ppos); + *ppos = listHR.erase(*ppos); + } + + // now save the latest data point in this node + listPOS phr = --listHR.end(); + phr->kBytesSent = GetSessionSentBytes() / 1024.0; + phr->kBytesReceived = GetSessionReceivedBytes() / 1024.0; + phr->kBpsUpCur = GetUploadRate() / 1024.0; + phr->kBpsDownCur = GetDownloadRate() / 1024.0; + phr->cntUploads = GetActiveUploadsCount(); + phr->cntConnections = GetActiveConnections(); + phr->cntDownloads = GetDownloadingSources(); + phr->sTimestamp = GetUptimeMillis() / 1000.0; + + s_kadNodesTotal += s_kadNodesCur; + phr->kadNodesTotal = s_kadNodesTotal; + phr->kadNodesCur = s_kadNodesCur; +} + + +unsigned CStatistics::GetHistory( // Assemble arrays of sample points for a graph + unsigned cntPoints, // number of sample points to assemble + double sStep, // time difference between sample points + double sFinal, // latest allowed timestamp + const std::vector &ppf,// an array of pointers to arrays of floats for the result + StatsGraphType which_graph) // the graph which will receive the points +{ + if (sStep==0.0 || cntPoints==0) { + return(0); + } + + float *pf1 = ppf[0]; + float *pf2 = ppf[1]; + float *pf3 = ppf[2]; + unsigned cntFilled = 0; + listRPOS pos = listHR.rbegin(); + + // start of list should be an integer multiple of the sampling period for samples + // to be consistent when the graphs are resized horizontally + double sTarget; + if (sFinal >= 0.0) { + sTarget = sFinal; + } else { + sTarget = sStep==1.0 ? + pos->sTimestamp : + std::floor(pos->sTimestamp/sStep) * sStep; + } + + HR **ahr = NULL, **pphr = NULL; + bool bRateGraph = (which_graph != GRAPH_CONN); // rate graph or connections graph? + if (bRateGraph) { + ahr = new HR* [cntPoints]; + pphr = ahr; + } + + while (pos != listHR.rend()) { + if (pos->sTimestamp > sTarget) { + ++pos; + continue; + } + if (bRateGraph) { // assemble an array of pointers for ComputeAverages + *pphr++ = &(*pos); + } else { // or build the arrays if possible + *pf1++ = (float)pos->cntUploads; + *pf2++ = (float)pos->cntConnections; + *pf3++ = (float)pos->cntDownloads; + } + if (++cntFilled == cntPoints) { // enough points + break; + } + if (pos->sTimestamp == 0.0) { // reached beginning of uptime + break; + } + if ((sTarget -= sStep) <= 0.0) { // don't overshoot the beginning + if (bRateGraph) { + *pphr++ = &hrInit; + } else { + *pf1++ = *pf2++ = *pf3++ = 0.0; + } + ++cntFilled; + break; + } + } + + if (bRateGraph) { + if (cntFilled > 0) { + ComputeAverages(pphr, pos, cntFilled, sStep, ppf, which_graph); + } + delete[] ahr; + } + + return cntFilled; +} + + +unsigned CStatistics::GetHistoryForWeb( // Assemble arrays of sample points for the webserver + unsigned cntPoints, // maximum number of sample points to assemble + double sStep, // time difference between sample points + double *sStart, // earliest allowed timestamp + uint32 **graphData) // a pointer to a pointer that will point to the graph data array +{ + if (*sStart < 0.0) { + *sStart = 0.0; + } + if (sStep==0.0 || cntPoints==0) + return(0); + unsigned cntFilled = 0; + listRPOS pos = listHR.rbegin(); + double LastTimeStamp = pos->sTimestamp; + double sTarget = LastTimeStamp; + + HR **pphr = new HR *[cntPoints]; + + while (pos != listHR.rend()) { + if (pos->sTimestamp > sTarget) { + ++pos; // find next history record + continue; + } + pphr[cntFilled] = &(*pos); + if (++cntFilled == cntPoints) // enough points + break; + if (pos->sTimestamp <= *sStart) // reached beginning of requested time + break; + if ((sTarget -= sStep) <= 0.0) { // don't overshoot the beginning + pphr[cntFilled++] = NULL; + break; + } + } + + if (cntFilled) { + *graphData = new uint32 [4 * cntFilled]; + if (*graphData) { + for (unsigned int i = 0; i < cntFilled; i++) { + HR *phr = pphr[cntFilled - i - 1]; + if (phr) { + (*graphData)[4 * i ] = ENDIAN_HTONL((uint32)(phr->kBpsDownCur * 1024.0)); + (*graphData)[4 * i + 1] = ENDIAN_HTONL((uint32)(phr->kBpsUpCur * 1024.0)); + (*graphData)[4 * i + 2] = ENDIAN_HTONL((uint32)phr->cntConnections); + (*graphData)[4 * i + 3] = ENDIAN_HTONL((uint32)phr->kadNodesCur); + } else { + (*graphData)[4 * i] = (*graphData)[4 * i + 1] = 0; + (*graphData)[4 * i + 2] = (*graphData)[4 * i + 3] = 0; + } + } + } + } else { + *graphData = NULL; + } + + delete [] pphr; + + *sStart = LastTimeStamp; + + return cntFilled; +} + + +void CStatistics::ComputeAverages( + HR **pphr, // pointer to (end of) array of assembled history records + listRPOS pos, // position in history list from which to backtrack + unsigned cntFilled, // number of points in the sample data + double sStep, // time difference between two samples + const std::vector &ppf,// an array of pointers to arrays of floats with sample data + StatsGraphType which_graph) // the graph which will receive the points +{ + double sTarget, kValueRun; + uint64 avgTime = average_minutes * 60; + unsigned nBtPoints = (unsigned)(avgTime / sStep); + + CPreciseRateCounter* runningAvg = NULL; + switch (which_graph) { + case GRAPH_DOWN: runningAvg = &m_graphRunningAvgDown; break; + case GRAPH_UP: runningAvg = &m_graphRunningAvgUp; break; + case GRAPH_KAD: runningAvg = &m_graphRunningAvgKad; break; + default: + wxCHECK_RET(false, wxT("ComputeAverages called with unsupported graph type.")); + } + + runningAvg->m_timespan = avgTime * 1000; + runningAvg->m_tick_history.clear(); + runningAvg->m_byte_history.clear(); + runningAvg->m_total = 0; + runningAvg->m_tmp_sum = 0; + + if (pos == listHR.rend()) { + sTarget = 0.0; + } else { + sTarget = std::max(0.0, pos->sTimestamp - sStep); + } + + while (nBtPoints--) { + while (pos != listHR.rend() && pos->sTimestamp > sTarget) ++pos; // find next history record + if (pos != listHR.rend()) { + runningAvg->m_tick_history.push_front((uint64)(pos->sTimestamp * 1000.0)); + + uint32 value = 0; + switch (which_graph) { + case GRAPH_DOWN: + value = (uint32)(pos->kBpsDownCur * 1024.0); + break; + case GRAPH_UP: + value = (uint32)(pos->kBpsUpCur * 1024.0); + break; + case GRAPH_KAD: + value = (uint32)(pos->kadNodesCur * 1024.0); + break; + default: + wxCHECK_RET(false, wxT("ComputeAverages called with unsupported graph type.")); + } + + runningAvg->m_byte_history.push_front(value); + runningAvg->m_total += value; + } else { + break; + } + if ((sTarget -= sStep) < 0.0) { + break; + } + }; + + // now compute averages in returned arrays, starting with the earliest values + float *pf1 = ppf[0] + cntFilled - 1; // holds session avg + float *pf2 = ppf[1] + cntFilled - 1; // holds running avg + float *pf3 = ppf[2] + cntFilled - 1; // holds current rate + + for (int cnt=cntFilled; cnt>0; cnt--, pf1--, pf2--, pf3--) { + HR *phr = *(--pphr); + if (which_graph == GRAPH_DOWN) { + kValueRun = phr->kBytesReceived; + *pf3 = phr->kBpsDownCur; + } else if (which_graph == GRAPH_UP) { + kValueRun = phr->kBytesSent; + *pf3 = phr->kBpsUpCur; + } else { + kValueRun = phr->kadNodesTotal; + *pf3 = phr->kadNodesCur; + } + + *pf1 = kValueRun / phr->sTimestamp; + (*runningAvg) += (uint32)(*pf3 * 1024.0); + runningAvg->CalculateRate((uint64)(phr->sTimestamp * 1000.0)); + *pf2 = (float)(runningAvg->GetRate() / 1024.0); + } +} + + +GraphUpdateInfo CStatistics::GetPointsForUpdate() +{ + GraphUpdateInfo update; + listPOS phr = --listHR.end(); + update.timestamp = (double) phr->sTimestamp; + + m_graphRunningAvgDown += (uint32)(phr->kBpsDownCur * 1024.0); + m_graphRunningAvgUp += (uint32)(phr->kBpsUpCur * 1024.0); + // Note: kadNodesCur is multiplied by 1024 since the value is done + // in other places, so we simply follow suit here to avoid trouble. + m_graphRunningAvgKad += (uint32)(phr->kadNodesCur * 1024.0); + m_graphRunningAvgDown.CalculateRate((uint64)(phr->sTimestamp * 1000.0)); + m_graphRunningAvgUp.CalculateRate((uint64)(phr->sTimestamp * 1000.0)); + m_graphRunningAvgKad.CalculateRate((uint64)(phr->sTimestamp * 1000.0)); + + update.downloads[0] = phr->kBytesReceived / phr->sTimestamp; + update.downloads[1] = m_graphRunningAvgDown.GetRate() / 1024.0; + update.downloads[2] = phr->kBpsDownCur; + + update.uploads[0] = phr->kBytesSent / phr->sTimestamp; + update.uploads[1] = m_graphRunningAvgUp.GetRate() / 1024.0; + update.uploads[2] = phr->kBpsUpCur; + + update.connections[0] = (float)phr->cntUploads; + update.connections[1] = (float)phr->cntConnections; + update.connections[2] = (float)phr->cntDownloads; + + update.kadnodes[0] = phr->kadNodesTotal / phr->sTimestamp; + update.kadnodes[1] = m_graphRunningAvgKad.GetRate() / 1024.0; + update.kadnodes[2] = phr->kadNodesCur; + + return update; +} + + +/* ------------------------------- TREE ---------------------------- */ + +void CStatistics::InitStatsTree() +{ + s_statTree = new CStatTreeItemBase(wxTRANSLATE("Statistics")); + + CStatTreeItemBase* tmpRoot1; + CStatTreeItemBase* tmpRoot2; + + s_uptime = (CStatTreeItemTimer*)s_statTree->AddChild(new CStatTreeItemTimer(wxTRANSLATE("Uptime: %s"))); + + tmpRoot1 = s_statTree->AddChild(new CStatTreeItemBase(wxTRANSLATE("Transfer"), stSortChildren)); + + tmpRoot2 = tmpRoot1->AddChild(new CStatTreeItemBase(wxTRANSLATE("Uploads")), 2); + s_sessionUpload = (CStatTreeItemUlDlCounter*)tmpRoot2->AddChild(new CStatTreeItemUlDlCounter(wxTRANSLATE("Uploaded Data (Session (Total)): %s"), thePrefs::GetTotalUploaded, stSortChildren | stSortByValue)); + // Children will be added on-the-fly + s_totalUpOverhead = (CStatTreeItemPacketTotals*)tmpRoot2->AddChild(new CStatTreeItemPacketTotals(wxTRANSLATE("Total Overhead (Packets): %s"))); + s_fileReqUpOverhead = (CStatTreeItemPackets*)tmpRoot2->AddChild(new CStatTreeItemPackets(wxTRANSLATE("File Request Overhead (Packets): %s"))); + s_totalUpOverhead->AddPacketCounter(s_fileReqUpOverhead); + s_sourceXchgUpOverhead = (CStatTreeItemPackets*)tmpRoot2->AddChild(new CStatTreeItemPackets(wxTRANSLATE("Source Exchange Overhead (Packets): %s"))); + s_totalUpOverhead->AddPacketCounter(s_sourceXchgUpOverhead); + s_serverUpOverhead = (CStatTreeItemPackets*)tmpRoot2->AddChild(new CStatTreeItemPackets(wxTRANSLATE("Server Overhead (Packets): %s"))); + s_totalUpOverhead->AddPacketCounter(s_serverUpOverhead); + s_kadUpOverhead = (CStatTreeItemPackets*)tmpRoot2->AddChild(new CStatTreeItemPackets(wxTRANSLATE("Kad Overhead (Packets): %s"))); + s_totalUpOverhead->AddPacketCounter(s_kadUpOverhead); + s_activeUploads = (CStatTreeItemNativeCounter*)tmpRoot2->AddChild(new CStatTreeItemNativeCounter(wxTRANSLATE("Active Uploads: %s"))); + s_waitingUploads = (CStatTreeItemNativeCounter*)tmpRoot2->AddChild(new CStatTreeItemNativeCounter(wxTRANSLATE("Waiting Uploads: %s"))); + s_totalSuccUploads = (CStatTreeItemCounter*)tmpRoot2->AddChild(new CStatTreeItemCounter(wxTRANSLATE("Total successful upload sessions: %s"))); + s_totalFailedUploads = (CStatTreeItemCounter*)tmpRoot2->AddChild(new CStatTreeItemCounter(wxTRANSLATE("Total failed upload sessions: %s"))); + s_totalUploadTime = new CStatTreeItemCounter(wxEmptyString); + tmpRoot2->AddChild(new CStatTreeItemAverage(wxTRANSLATE("Average upload time: %s"), s_totalUploadTime, s_totalSuccUploads, dmTime)); + + tmpRoot2 = tmpRoot1->AddChild(new CStatTreeItemBase(wxTRANSLATE("Downloads")), 1); + s_sessionDownload = (CStatTreeItemUlDlCounter*)tmpRoot2->AddChild(new CStatTreeItemUlDlCounter(wxTRANSLATE("Downloaded Data (Session (Total)): %s"), thePrefs::GetTotalDownloaded, stSortChildren | stSortByValue)); + // Children will be added on-the-fly + s_totalDownOverhead = (CStatTreeItemPacketTotals*)tmpRoot2->AddChild(new CStatTreeItemPacketTotals(wxTRANSLATE("Total Overhead (Packets): %s"))); + s_fileReqDownOverhead = (CStatTreeItemPackets*)tmpRoot2->AddChild(new CStatTreeItemPackets(wxTRANSLATE("File Request Overhead (Packets): %s"))); + s_totalDownOverhead->AddPacketCounter(s_fileReqDownOverhead); + s_sourceXchgDownOverhead = (CStatTreeItemPackets*)tmpRoot2->AddChild(new CStatTreeItemPackets(wxTRANSLATE("Source Exchange Overhead (Packets): %s"))); + s_totalDownOverhead->AddPacketCounter(s_sourceXchgDownOverhead); + s_serverDownOverhead = (CStatTreeItemPackets*)tmpRoot2->AddChild(new CStatTreeItemPackets(wxTRANSLATE("Server Overhead (Packets): %s"))); + s_totalDownOverhead->AddPacketCounter(s_serverDownOverhead); + s_kadDownOverhead = (CStatTreeItemPackets*)tmpRoot2->AddChild(new CStatTreeItemPackets(wxTRANSLATE("Kad Overhead (Packets): %s"))); + s_totalDownOverhead->AddPacketCounter(s_kadDownOverhead); + s_foundSources = (CStatTreeItemNativeCounter*)tmpRoot2->AddChild(new CStatTreeItemNativeCounter(wxTRANSLATE("Found Sources: %s"), stSortChildren | stSortByValue)); + s_activeDownloads = (CStatTreeItemNativeCounter*)tmpRoot2->AddChild(new CStatTreeItemNativeCounter(wxTRANSLATE("Active Downloads (chunks): %s"))); + + tmpRoot1->AddChild(new CStatTreeItemRatio(wxTRANSLATE("Session UL:DL Ratio (Total): %s"), s_sessionUpload, s_sessionDownload), 3); + + tmpRoot1 = s_statTree->AddChild(new CStatTreeItemBase(wxTRANSLATE("Connection"))); + tmpRoot1->AddChild(new CStatTreeItemAverageSpeed(wxTRANSLATE("Average Downloadrate (Session): %s"), s_sessionDownload, s_uptime)); + tmpRoot1->AddChild(new CStatTreeItemAverageSpeed(wxTRANSLATE("Average Uploadrate (Session): %s"), s_sessionUpload, s_uptime)); + s_downloadrate = (CStatTreeItemRateCounter*)tmpRoot1->AddChild(new CStatTreeItemRateCounter(wxTRANSLATE("Max Downloadrate (Session): %s"), true, 30000)); + s_uploadrate = (CStatTreeItemRateCounter*)tmpRoot1->AddChild(new CStatTreeItemRateCounter(wxTRANSLATE("Max Uploadrate (Session): %s"), true, 30000)); + s_reconnects = (CStatTreeItemReconnects*)tmpRoot1->AddChild(new CStatTreeItemReconnects(wxTRANSLATE("Reconnects: %i"))); + s_sinceFirstTransfer = (CStatTreeItemTimer*)tmpRoot1->AddChild(new CStatTreeItemTimer(wxTRANSLATE("Time Since First Transfer: %s"), stHideIfZero)); + s_sinceConnected = (CStatTreeItemTimer*)tmpRoot1->AddChild(new CStatTreeItemTimer(wxTRANSLATE("Connected To Server Since: %s"))); + s_activeConnections = (CStatTreeItemCounterMax*)tmpRoot1->AddChild(new CStatTreeItemCounterMax(wxTRANSLATE("Active Connections (estimate): %i"))); + s_limitReached = (CStatTreeItemMaxConnLimitReached*)tmpRoot1->AddChild(new CStatTreeItemMaxConnLimitReached(wxTRANSLATE("Max Connection Limit Reached: %s"))); + s_avgConnections = (CStatTreeItemSimple*)tmpRoot1->AddChild(new CStatTreeItemSimple(wxTRANSLATE("Average Connections (estimate): %g"))); + s_avgConnections->SetValue(0.0); + tmpRoot1->AddChild(new CStatTreeItemPeakConnections(wxTRANSLATE("Peak Connections (estimate): %i"))); + + s_clients = (CStatTreeItemHiddenCounter*)s_statTree->AddChild(new CStatTreeItemHiddenCounter(wxTRANSLATE("Clients"), stSortChildren | stSortByValue)); + s_unknown = (CStatTreeItemCounter*)s_clients->AddChild(new CStatTreeItemCounter(wxTRANSLATE("Unknown") wxT(": %s")), 6); + //s_lowID = (CStatTreeItem*)s_clients->AddChild(new CStatTreeItem(wxTRANSLATE("LowID: %u (%.2f%% Total %.2f%% Known)")), 5); + //s_secIdentOnOff = (CStatTreeItem*)s_clients->AddChild(new CStatTreeItem(wxTRANSLATE("SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)")), 4); +#ifdef __DEBUG__ + s_hasSocket = (CStatTreeItemNativeCounter*)s_clients->AddChild(new CStatTreeItemNativeCounter(wxT("HasSocket: %s")), 3); +#endif + s_filtered = (CStatTreeItemNativeCounter*)s_clients->AddChild(new CStatTreeItemNativeCounter(wxTRANSLATE("Filtered") wxT(": %s")), 2); + s_banned = (CStatTreeItemNativeCounter*)s_clients->AddChild(new CStatTreeItemNativeCounter(wxTRANSLATE("Banned") wxT(": %s")), 1); + s_clients->AddChild(new CStatTreeItemTotalClients(wxTRANSLATE("Total: %i Known: %i"), s_clients, s_unknown), 0x80000000); + + // TODO: Use counters? + tmpRoot1 = s_statTree->AddChild(new CStatTreeItemBase(wxTRANSLATE("Servers"))); + s_workingServers = (CStatTreeItemSimple*)tmpRoot1->AddChild(new CStatTreeItemSimple(wxTRANSLATE("Working Servers: %i"))); + s_failedServers = (CStatTreeItemSimple*)tmpRoot1->AddChild(new CStatTreeItemSimple(wxTRANSLATE("Failed Servers: %i"))); + s_totalServers = (CStatTreeItemNativeCounter*)tmpRoot1->AddChild(new CStatTreeItemNativeCounter(wxTRANSLATE("Total: %s"))); + s_deletedServers = (CStatTreeItemNativeCounter*)tmpRoot1->AddChild(new CStatTreeItemNativeCounter(wxTRANSLATE("Deleted Servers: %s"))); + s_filteredServers = (CStatTreeItemNativeCounter*)tmpRoot1->AddChild(new CStatTreeItemNativeCounter(wxTRANSLATE("Filtered Servers: %s"))); + s_usersOnWorking = (CStatTreeItemSimple*)tmpRoot1->AddChild(new CStatTreeItemSimple(wxTRANSLATE("Users on Working Servers: %llu"))); + s_filesOnWorking = (CStatTreeItemSimple*)tmpRoot1->AddChild(new CStatTreeItemSimple(wxTRANSLATE("Files on Working Servers: %llu"))); + s_totalUsers = (CStatTreeItemSimple*)tmpRoot1->AddChild(new CStatTreeItemSimple(wxTRANSLATE("Total Users: %llu"))); + s_totalFiles = (CStatTreeItemSimple*)tmpRoot1->AddChild(new CStatTreeItemSimple(wxTRANSLATE("Total Files: %llu"))); + s_serverOccupation = (CStatTreeItemSimple*)tmpRoot1->AddChild(new CStatTreeItemSimple(wxTRANSLATE("Server Occupation: %.2f%%"))); + s_serverOccupation->SetValue(0.0); + + tmpRoot1 = s_statTree->AddChild(new CStatTreeItemBase(wxTRANSLATE("Shared Files"))); + s_numberOfShared = (CStatTreeItemCounter*)tmpRoot1->AddChild(new CStatTreeItemCounter(wxTRANSLATE("Number of Shared Files: %s"))); + s_sizeOfShare = (CStatTreeItemCounter*)tmpRoot1->AddChild(new CStatTreeItemCounter(wxTRANSLATE("Total size of Shared Files: %s"))); + s_sizeOfShare->SetDisplayMode(dmBytes); + tmpRoot1->AddChild(new CStatTreeItemAverage(wxTRANSLATE("Average filesize: %s"), s_sizeOfShare, s_numberOfShared, dmBytes)); +} + + +void CStatistics::UpdateStatsTree() +{ + // get sort orders right + s_sessionUpload->ReSortChildren(); + s_sessionDownload->ReSortChildren(); + s_clients->ReSortChildren(); + s_foundSources->ReSortChildren(); + // TODO: sort OS_Info subtrees. + + s_avgConnections->SetValue(theApp->listensocket->GetAverageConnections()); + +#if 0 + (*cli13) = wxString::Format(_("LowID: %u (%.2f%% Total %.2f%% Known)"),#lowid , (#total>0)?((double)100*#lowid/#total):0, (double)100*#knownLowID/#known); + (*cli14) = wxString::Format(_("SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)"), #secOn , ((#eMule+#aMule)>0)?((double)100*#secOn / (#eMule+#aMule)):0, #secOff, ((#eMule+#aMule)>0)?((double)100*#secOff /(#eMule+#aMule) ):0); +#endif + + // get serverstats + // TODO: make these realtime, too + uint32 servfail; + uint32 servuser; + uint32 servfile; + uint32 servtuser; + uint32 servtfile; + float servocc; + theApp->serverlist->GetStatus(servfail, servuser, servfile, servtuser, servtfile, servocc); + s_workingServers->SetValue((uint64)((*s_totalServers)-servfail)); + s_failedServers->SetValue((uint64)servfail); + s_usersOnWorking->SetValue((uint64)servuser); + s_filesOnWorking->SetValue((uint64)servfile); + s_totalUsers->SetValue((uint64)servtuser); + s_totalFiles->SetValue((uint64)servtfile); + s_serverOccupation->SetValue(servocc); +} + + +void CStatistics::AddSourceOrigin(unsigned origin) +{ + CStatTreeItemNativeCounter* counter = (CStatTreeItemNativeCounter*)s_foundSources->GetChildById(0x0100 + origin); + if (counter) { + ++(*counter); + } else { + counter = new CStatTreeItemNativeCounter(OriginToText(origin) + wxT(": %s"), stHideIfZero | stShowPercent); + ++(*counter); + s_foundSources->AddChild(counter, 0x0100 + origin); + } +} + +void CStatistics::RemoveSourceOrigin(unsigned origin) +{ + CStatTreeItemNativeCounter* counter = (CStatTreeItemNativeCounter*)s_foundSources->GetChildById(0x0100 + origin); + wxASSERT(counter); + --(*counter); +} + +uint32 GetSoftID(uint8 SoftType) +{ + // prevent appearing multiple tree entries with the same name + // this should be kept in sync with GetSoftName(). + switch (SoftType) { + case SO_OLDEMULE: + return 0x0100 + SO_EMULE; + case SO_NEW_SHAREAZA: + case SO_NEW2_SHAREAZA: + return 0x0100 + SO_SHAREAZA; + case SO_NEW2_MLDONKEY: + return 0x0100 + SO_NEW_MLDONKEY; + default: + return 0x0100 + SoftType; + } +} + +void CStatistics::AddDownloadFromSoft(uint8 SoftType, uint32 bytes) +{ + AddReceivedBytes(bytes); + + uint32 id = GetSoftID(SoftType); + + if (s_sessionDownload->HasChildWithId(id)) { + (*((CStatTreeItemCounter*)s_sessionDownload->GetChildById(id))) += bytes; + } else { + CStatTreeItemCounter* tmp = new CStatTreeItemCounter(GetSoftName(SoftType) + wxT(": %s")); + tmp->SetDisplayMode(dmBytes); + (*tmp) += bytes; + s_sessionDownload->AddChild(tmp, id); + } +} + +void CStatistics::AddUploadToSoft(uint8 SoftType, uint32 bytes) +{ + uint32 id = GetSoftID(SoftType); + + if (s_sessionUpload->HasChildWithId(id)) { + (*((CStatTreeItemCounter*)s_sessionUpload->GetChildById(id))) += bytes; + } else { + CStatTreeItemCounter* tmp = new CStatTreeItemCounter(GetSoftName(SoftType) + wxT(": %s")); + tmp->SetDisplayMode(dmBytes); + (*tmp) += bytes; + s_sessionUpload->AddChild(tmp, id); + } +} + +inline bool SupportsOSInfo(unsigned clientSoft) +{ + return (clientSoft == SO_AMULE) || (clientSoft == SO_HYDRANODE) || (clientSoft == SO_NEW2_MLDONKEY); +} + +// Do some random black magic to strings to get a relatively unique number for them. +uint32 GetIdFromString(const wxString& str) +{ + uint32 id = 0; + for (unsigned i = 0; i < str.Length(); ++i) { + unsigned old_id = id; + id += (uint32)str.GetChar(i); + id <<= 2; + id ^= old_id; + id -= old_id; + } + return ((id >> 1) + id | 0x00000100) & 0x7fffffff; +} + +void CStatistics::AddKnownClient(CUpDownClient *pClient) +{ + ++(*s_clients); + + uint32 clientSoft = pClient->GetClientSoft(); + uint32 id = GetSoftID(clientSoft); + + CStatTreeItemCounter *client; + + if (s_clients->HasChildWithId(id)) { + client = (CStatTreeItemCounter*)s_clients->GetChildById(id); + ++(*client); + } else { + uint32 flags = stSortChildren | stShowPercent | stHideIfZero; + if (!SupportsOSInfo(clientSoft)) { + flags |= stCapChildren; + } + client = new CStatTreeItemCounter(GetSoftName(clientSoft) + wxT(": %s"), flags); + ++(*client); + s_clients->AddChild(client, id); + if (SupportsOSInfo(clientSoft)) { + client->AddChild(new CStatTreeItemBase(wxTRANSLATE("Version"), stSortChildren | stCapChildren), 2); + client->AddChild(new CStatTreeItemBase(wxTRANSLATE("Operating System"), stSortChildren | stSortByValue), 1); + } + } + + CStatTreeItemBase *versionRoot = SupportsOSInfo(clientSoft) ? client->GetChildById(2) : client; + uint32 clientVersion = pClient->GetVersion(); + + if (versionRoot->HasChildWithId(clientVersion)) { + CStatTreeItemCounter *version = (CStatTreeItemCounter*)versionRoot->GetChildById(clientVersion); + ++(*version); + } else { + const wxString& versionStr = pClient->GetVersionString(); + CStatTreeItemCounter *version = new CStatTreeItemCounter((versionStr.IsEmpty() ? wxString(wxTRANSLATE("Unknown")) : versionStr) + wxT(": %s"), stShowPercent | stHideIfZero); + ++(*version); + versionRoot->AddChild(version, clientVersion, SupportsOSInfo(clientSoft)); + } + + if (SupportsOSInfo(clientSoft)) { + const wxString& OSInfo = pClient->GetClientOSInfo(); + uint32 OS_ID = OSInfo.IsEmpty() ? 0 : GetIdFromString(OSInfo); + CStatTreeItemBase* OSRoot = client->GetChildById(1); + CStatTreeItemCounter* OSNode = (CStatTreeItemCounter*)OSRoot->GetChildById(OS_ID); + if (OSNode) { + ++(*OSNode); + } else { + OSNode = new CStatTreeItemCounter((OS_ID ? OSInfo : wxString(wxTRANSLATE("Not Received"))) + wxT(": %s"), stShowPercent | stHideIfZero); + ++(*OSNode); + OSRoot->AddChild(OSNode, OS_ID, true); + } + } +} + +void CStatistics::RemoveKnownClient(uint32 clientSoft, uint32 clientVersion, const wxString& OSInfo) +{ + --(*s_clients); + + uint32 id = GetSoftID(clientSoft); + + CStatTreeItemCounter *client = (CStatTreeItemCounter*)s_clients->GetChildById(id); + wxASSERT(client); + --(*client); + + CStatTreeItemBase *versionRoot = SupportsOSInfo(clientSoft) ? client->GetChildById(2) : client; + + CStatTreeItemCounter *version = (CStatTreeItemCounter*)versionRoot->GetChildById(clientVersion); + wxASSERT(version); + --(*version); + + if (SupportsOSInfo(clientSoft)) { + uint32 OS_ID = OSInfo.IsEmpty() ? 0 : GetIdFromString(OSInfo); + CStatTreeItemCounter* OSNode = (CStatTreeItemCounter*)client->GetChildById(1)->GetChildById(OS_ID); + wxASSERT(OSNode); + --(*OSNode); + } +} + +#else /* EC_REMOTE (CLIENT_GUI) */ + +CStatistics::CStatistics(CRemoteConnect &conn) +: +m_conn(conn) +{ + s_start_time = GetTickCount64(); + + // Init Tree + s_statTree = new CStatTreeItemBase(_("Statistics"), 0); + + // Clear stat data container + for (int i = 0; i < sdTotalItems; ++i) { + s_statData[i] = 0; + } +} + + +CStatistics::~CStatistics() +{ + delete s_statTree; +} + + +void CStatistics::UpdateStats(const CECPacket* stats) +{ + s_statData[sdUpload] = stats->GetTagByNameSafe(EC_TAG_STATS_UL_SPEED)->GetInt(); + s_statData[sdUpOverhead] = stats->GetTagByNameSafe(EC_TAG_STATS_UP_OVERHEAD)->GetInt(); + s_statData[sdDownload] = stats->GetTagByNameSafe(EC_TAG_STATS_DL_SPEED)->GetInt(); + s_statData[sdDownOverhead] = stats->GetTagByNameSafe(EC_TAG_STATS_DOWN_OVERHEAD)->GetInt(); + s_statData[sdWaitingClients] = stats->GetTagByNameSafe(EC_TAG_STATS_UL_QUEUE_LEN)->GetInt(); + s_statData[sdBannedClients] = stats->GetTagByNameSafe(EC_TAG_STATS_BANNED_COUNT)->GetInt(); + s_statData[sdED2KUsers] = stats->GetTagByNameSafe(EC_TAG_STATS_ED2K_USERS)->GetInt(); + s_statData[sdKadUsers] = stats->GetTagByNameSafe(EC_TAG_STATS_KAD_USERS)->GetInt(); + s_statData[sdED2KFiles] = stats->GetTagByNameSafe(EC_TAG_STATS_ED2K_FILES)->GetInt(); + s_statData[sdKadFiles] = stats->GetTagByNameSafe(EC_TAG_STATS_KAD_FILES)->GetInt(); +} + + +void CStatistics::UpdateStatsTree() +{ + CECPacket request(EC_OP_GET_STATSTREE); + if (thePrefs::GetMaxClientVersions() != 0) { + request.AddTag(CECTag(EC_TAG_STATTREE_CAPPING, (uint8)thePrefs::GetMaxClientVersions())); + } + const CECPacket* reply = m_conn.SendRecvPacket(&request); + if (reply) { + const CECTag* treeRoot = reply->GetTagByName(EC_TAG_STATTREE_NODE); + if (treeRoot) { + delete s_statTree; + s_statTree = new CStatTreeItemBase(treeRoot); + } + } + delete reply; +} + +#endif /* !EC_REMOTE */ + +// File_checked_for_headers diff --git a/src/Statistics.h b/src/Statistics.h new file mode 100644 index 00000000..1f30a2b4 --- /dev/null +++ b/src/Statistics.h @@ -0,0 +1,543 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// Copyright (C) 2005-2008 Dévai Tamás ( gonosztopi@amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef STATISTICS_H +#define STATISTICS_H + +#include "GetTickCount.h" // Needed for GetTickCount64() +#include "StatTree.h" // Needed for CStatTreeItem* classes + + +#include // Needed for std::deque + +enum StatsGraphType { + GRAPH_INVALID = 0, + GRAPH_DOWN, + GRAPH_UP, + GRAPH_CONN, + GRAPH_KAD +}; + +typedef struct UpdateInfo { + double timestamp; + float downloads[3]; + float uploads[3]; + float connections[3]; + float kadnodes[3]; +} GraphUpdateInfo; + +typedef struct HistoryRecord { + double kBytesSent; + double kBytesReceived; + float kBpsUpCur; + float kBpsDownCur; + double sTimestamp; + uint16 cntDownloads; + uint16 cntUploads; + uint16 cntConnections; + uint16 kadNodesCur; + uint64 kadNodesTotal; +} HR; + + +#ifndef EC_REMOTE + +/** + * Counts precise rate/average on added bytes/values. + * + * @note This class is MT-safe. + */ +class CPreciseRateCounter { + friend class CStatistics; // for playing dirty tricks to compute running average :P + public: + + /** + * Constructor + * + * @param timespan Desired timespan for rate calculations. + * @param count_average Counts average instead of rate. + */ + CPreciseRateCounter(uint32_t timespan, bool count_average = false) + : m_timespan(timespan), m_total(0), m_rate(0.0), m_max_rate(0.0), m_tmp_sum(0), m_count_average(count_average) + { + if (!count_average) { + uint64_t cur_time = GetTickCount64(); + uint64_t target_time = cur_time - timespan; + while (cur_time > target_time) { + m_tick_history.push_front(cur_time); + m_byte_history.push_front(0); + cur_time -= 100; // default update period + } + m_tick_history.push_front(cur_time); + } + } + + /** + * Calculate current rate. + * + * This function should be called reasonably often, to + * keep rates up-to-date, and prevent history growing + * to the skies. + */ + void CalculateRate(uint64_t now); + + /** + * Get current rate. + * + * @return Current rate in bytes/second. + */ + double GetRate() { wxMutexLocker lock(m_mutex); return m_rate; }; + + /** + * Gets ever seen maximal rate. + * + * @return The maximal rate which occured. + */ + double GetMaxRate() { wxMutexLocker lock(m_mutex); return m_max_rate; } + + /** + * Sets desired timespan for rate calculations. + * + * If new timespan is greater than the old was, then the change + * takes effect with time. The exact time needed for the change + * to take effect is new minus old value of the timespan. + * + * If the new timespan is lower than the old, the change takes + * effect immediately at the next call to CalculateRate(). + */ + void SetTimespan(uint32_t timespan) { wxMutexLocker lock(m_mutex); m_timespan = timespan; } + + /** + * Add bytes to be tracked for rate-counting. + */ + void operator+=(uint32_t bytes) { wxMutexLocker lock(m_mutex); m_tmp_sum += bytes; } + + protected: + + std::deque m_byte_history; + std::deque m_tick_history; + uint32_t m_timespan; + uint32_t m_total; + double m_rate; + double m_max_rate; + uint32_t m_tmp_sum; + wxMutex m_mutex; + bool m_count_average; +}; + + +class CECTag; + +/** + * Stat tree item for rates/averages. + */ +class CStatTreeItemRateCounter : public CStatTreeItemBase, public CPreciseRateCounter { + public: + + /** + * @see CStatTreeItemBase::CStatTreeItemBase, CPreciseRateCounter::CPreciseRateCounter + * + * @param show_maxrate If true, shows max rate instead of current rate. + */ + CStatTreeItemRateCounter(const wxString& label, bool show_maxrate, uint32_t timespan, bool count_average = false) + : CStatTreeItemBase(label, stNone), CPreciseRateCounter(timespan, count_average), m_show_maxrate(show_maxrate) + {} + +#ifndef AMULE_DAEMON + /** + * @see CStatTreeItemBase::GetDisplayString() + */ + virtual wxString GetDisplayString() const; +#endif + + protected: + /** + * Add values to EC tag being generated. + * + * @param tag The tag to which values should be added. + * + * @see CStatTreeItemBase::AddECValues + */ + virtual void AddECValues(CECTag* tag) const; + + //! Whether to show max rate instead of actual rate. + bool m_show_maxrate; +}; + + +/** + * Stat tree item for Peak Connections. + */ +class CStatTreeItemPeakConnections : public CStatTreeItemBase { + public: + + /** + * @see CStatTreeItemBase::CStatTreeItemBase + */ + CStatTreeItemPeakConnections(const wxString& label) + : CStatTreeItemBase(label) + {} + +#ifndef AMULE_DAEMON + /** + * @see CStatTreeItemBase::GetDisplayString() + */ + virtual wxString GetDisplayString() const; +#endif + + protected: + /** + * Add values to EC tag being generated. + * + * @param tag The tag to which values should be added. + * + * @see CStatTreeItemBase::AddECValues + */ + virtual void AddECValues(CECTag* tag) const; +}; + + +class CUpDownClient; + +class CStatistics { + friend class CStatisticsDlg; // to access CStatistics::GetTreeRoot() + public: + CStatistics(); + ~CStatistics(); + + /* Statistics graph functions */ + + void RecordHistory(); + unsigned GetHistoryForWeb(unsigned cntPoints, double sStep, double *sStart, uint32 **graphData); + unsigned GetHistory(unsigned cntPoints, double sStep, double sFinal, const std::vector &ppf, StatsGraphType which_graph); + GraphUpdateInfo GetPointsForUpdate(); + + /* Statistics tree functions */ + + void UpdateStatsTree(); + + /* Access to the tree */ + + // uptime + static uint64 GetUptimeMillis() { return s_uptime->GetTimerValue(); } + static uint64 GetUptimeSeconds() { return s_uptime->GetTimerSeconds(); } + static uint64 GetStartTime() { return s_uptime->GetTimerStart(); } + + // Upload + static uint64 GetSessionSentBytes() { return (*s_sessionUpload); } + static void AddUpOverheadFileRequest(uint32 size) { (*s_fileReqUpOverhead) += size; (*s_upOverheadRate) += size; } + static void AddUpOverheadSourceExchange(uint32 size){ (*s_sourceXchgUpOverhead) += size; (*s_upOverheadRate) += size; } + static void AddUpOverheadServer(uint32 size) { (*s_serverUpOverhead) += size; (*s_upOverheadRate) += size; } + static void AddUpOverheadKad(uint32 size) { (*s_kadUpOverhead) += size; (*s_upOverheadRate) += size; } + static void AddUpOverheadOther(uint32 size) { (*s_totalUpOverhead) += size; (*s_upOverheadRate) += size; } + static double GetUpOverheadRate() { return s_upOverheadRate->GetRate(); } + static void AddSuccessfulUpload() { ++(*s_totalSuccUploads); } + static void AddFailedUpload() { ++(*s_totalFailedUploads); } + static void AddUploadTime(uint32 time) { (*s_totalUploadTime) += time; } + static void AddUploadingClient() { ++(*s_activeUploads); } + static void RemoveUploadingClient() { --(*s_activeUploads); } + static uint32 GetActiveUploadsCount() { return (*s_activeUploads); } + static void AddWaitingClient() { ++(*s_waitingUploads); } + static void RemoveWaitingClient() { --(*s_waitingUploads); } + static uint32 GetWaitingUserCount() { return (*s_waitingUploads); } + static double GetUploadRate() { return s_uploadrate->GetRate(); } + + // Download + static uint64 GetSessionReceivedBytes() { return (*s_sessionDownload); } + static void AddDownOverheadFileRequest(uint32 size) { (*s_fileReqDownOverhead) += size; (*s_downOverheadRate) += size; } + static void AddDownOverheadSourceExchange(uint32 size){ (*s_sourceXchgDownOverhead) += size; (*s_downOverheadRate) += size; } + static void AddDownOverheadServer(uint32 size) { (*s_serverDownOverhead) += size; (*s_downOverheadRate) += size; } + static void AddDownOverheadKad(uint32 size) { (*s_kadDownOverhead) += size; (*s_downOverheadRate) += size; } + static void AddDownOverheadOther(uint32 size) { (*s_totalDownOverhead) += size; (*s_downOverheadRate) += size; } + static double GetDownOverheadRate() { return s_downOverheadRate->GetRate(); } + static void AddFoundSource() { ++(*s_foundSources); } + static void RemoveFoundSource() { --(*s_foundSources); } + static uint32 GetFoundSources() { return (*s_foundSources); } + static void AddSourceOrigin(unsigned origin); + static void RemoveSourceOrigin(unsigned origin); + static void AddDownloadingSource() { ++(*s_activeDownloads); } + static void RemoveDownloadingSource() { --(*s_activeDownloads); } + static uint32 GetDownloadingSources() { return (*s_activeDownloads); } + static double GetDownloadRate() { return s_downloadrate->GetRate(); } + + // Connection + static CStatTreeItemTimer* GetServerConnectTimer() { return s_sinceConnected; } + static void AddReconnect() { ++(*s_reconnects); } + static void AddActiveConnection() { ++(*s_activeConnections); } + static void RemoveActiveConnection() { --(*s_activeConnections); } + static uint32 GetActiveConnections() { return s_activeConnections->GetValue(); } + static uint32 GetPeakConnections() { return s_activeConnections->GetMaxValue(); } + static void AddMaxConnectionLimitReached() { ++(*s_limitReached); } + + // Clients + static void AddFilteredClient() { ++(*s_filtered); } + static void AddUnknownClient() { ++(*s_unknown); } + static void RemoveUnknownClient() { --(*s_unknown); } + static void AddKnownClient(CUpDownClient *pClient); + static void RemoveKnownClient(uint32 clientSoft, uint32 clientVersion, const wxString& OSInfo); +#ifdef __DEBUG__ + static void SocketAssignedToClient() { ++(*s_hasSocket); } + static void SocketUnassignedFromClient() { --(*s_hasSocket); } +#endif + static uint32 GetBannedCount() { return (*s_banned); } + static void AddBannedClient() { ++(*s_banned); } + static void RemoveBannedClient() { --(*s_banned); } + + // Servers + static void AddServer() { ++(*s_totalServers); } + static void DeleteServer() { ++(*s_deletedServers); --(*s_totalServers); } + static void DeleteAllServers() { (*s_deletedServers) += (*s_totalServers); (*s_totalServers) = 0; } + static void AddFilteredServer() { ++(*s_filteredServers); } + + // Shared files + static void ClearSharedFilesInfo() { (*s_numberOfShared) = 0; (*s_sizeOfShare) = 0; } + static void AddSharedFile(uint64 size) { ++(*s_numberOfShared); (*s_sizeOfShare) += size; } + static void RemoveSharedFile(uint64 size) { --(*s_numberOfShared); (*s_sizeOfShare) -= size; } + static uint32 GetSharedFileCount() { return (*s_numberOfShared); } + + // Kad nodes + static void AddKadNode() { ++s_kadNodesCur; } + static void RemoveKadNode() { --s_kadNodesCur; } + + + // Other + static void CalculateRates(); + + static void AddReceivedBytes(uint32 bytes) + { + if (!s_sinceFirstTransfer->IsRunning()) { + s_sinceFirstTransfer->StartTimer(); + } + + (*s_sessionDownload) += bytes; + (*s_downloadrate) += bytes; + } + + static void AddSentBytes(uint32 bytes) + { + if (!s_sinceFirstTransfer->IsRunning()) { + s_sinceFirstTransfer->StartTimer(); + } + + (*s_sessionUpload) += bytes; + (*s_uploadrate) += bytes; + } + + static void AddDownloadFromSoft(uint8 SoftType, uint32 bytes); + static void AddUploadToSoft(uint8 SoftType, uint32 bytes); + + // EC + static CECTag* GetECStatTree(uint8 tree_capping_value) { return s_statTree->CreateECTag(tree_capping_value); } + + void SetAverageMinutes(uint8 minutes) { average_minutes = minutes; } + + private: + std::list
listHR; + typedef std::list
::iterator listPOS; + typedef std::list
::reverse_iterator listRPOS; + + /* Graph-related functions */ + + void ComputeAverages(HR **pphr, listRPOS pos, unsigned cntFilled, + double sStep, const std::vector &ppf, StatsGraphType which_graph); + + int GetPointsPerRange() + { + return (1280/2) - 80; // This used to be a calc. based on GUI width + } + + /* Graphs-related vars */ + + CPreciseRateCounter m_graphRunningAvgDown; + CPreciseRateCounter m_graphRunningAvgUp; + CPreciseRateCounter m_graphRunningAvgKad; + + + uint8 average_minutes; + int nHistRanges; + int bitsHistClockMask; + int nPointsPerRange; + listPOS* aposRecycle; + + HR hrInit; + + /* Rate/Average counters */ + static CPreciseRateCounter* s_upOverheadRate; + static CPreciseRateCounter* s_downOverheadRate; + static CStatTreeItemRateCounter* s_uploadrate; + static CStatTreeItemRateCounter* s_downloadrate; + + /* Tree-related functions */ + + static void InitStatsTree(); + + static CStatTreeItemBase* GetTreeRoot() { return s_statTree; } + + /* Tree-related vars */ + + // the tree + static CStatTreeItemBase* s_statTree; + + // Uptime + static CStatTreeItemTimer* s_uptime; + + // Upload + static CStatTreeItemUlDlCounter* s_sessionUpload; + static CStatTreeItemPacketTotals* s_totalUpOverhead; + static CStatTreeItemPackets* s_fileReqUpOverhead; + static CStatTreeItemPackets* s_sourceXchgUpOverhead; + static CStatTreeItemPackets* s_serverUpOverhead; + static CStatTreeItemPackets* s_kadUpOverhead; + static CStatTreeItemNativeCounter* s_activeUploads; + static CStatTreeItemNativeCounter* s_waitingUploads; + static CStatTreeItemCounter* s_totalSuccUploads; + static CStatTreeItemCounter* s_totalFailedUploads; + static CStatTreeItemCounter* s_totalUploadTime; + + // Download + static CStatTreeItemUlDlCounter* s_sessionDownload; + static CStatTreeItemPacketTotals* s_totalDownOverhead; + static CStatTreeItemPackets* s_fileReqDownOverhead; + static CStatTreeItemPackets* s_sourceXchgDownOverhead; + static CStatTreeItemPackets* s_serverDownOverhead; + static CStatTreeItemPackets* s_kadDownOverhead; + static CStatTreeItemNativeCounter* s_foundSources; + static CStatTreeItemNativeCounter* s_activeDownloads; + + // Connection + static CStatTreeItemReconnects* s_reconnects; + static CStatTreeItemTimer* s_sinceFirstTransfer; + static CStatTreeItemTimer* s_sinceConnected; + static CStatTreeItemCounterMax* s_activeConnections; + static CStatTreeItemMaxConnLimitReached* s_limitReached; + static CStatTreeItemSimple* s_avgConnections; + + // Clients + static CStatTreeItemHiddenCounter* s_clients; + static CStatTreeItemCounter* s_unknown; + //static CStatTreeItem s_lowID; + //static CStatTreeItem s_secIdentOnOff; +#ifdef __DEBUG__ + static CStatTreeItemNativeCounter* s_hasSocket; +#endif + static CStatTreeItemNativeCounter* s_filtered; + static CStatTreeItemNativeCounter* s_banned; + + // Servers + static CStatTreeItemSimple* s_workingServers; + static CStatTreeItemSimple* s_failedServers; + static CStatTreeItemNativeCounter* s_totalServers; + static CStatTreeItemNativeCounter* s_deletedServers; + static CStatTreeItemNativeCounter* s_filteredServers; + static CStatTreeItemSimple* s_usersOnWorking; + static CStatTreeItemSimple* s_filesOnWorking; + static CStatTreeItemSimple* s_totalUsers; + static CStatTreeItemSimple* s_totalFiles; + static CStatTreeItemSimple* s_serverOccupation; + + // Shared files + static CStatTreeItemCounter* s_numberOfShared; + static CStatTreeItemCounter* s_sizeOfShare; + + // Kad nodes + static uint64 s_kadNodesTotal; + static uint16 s_kadNodesCur; +}; + +#else /* EC_REMOTE == CLIENT_GUI */ + +class CECPacket; +class CRemoteConnect; + +enum StatDataIndex { + sdUpload, + sdUpOverhead, + sdDownload, + sdDownOverhead, + sdWaitingClients, + sdBannedClients, + sdED2KUsers, + sdKadUsers, + sdED2KFiles, + sdKadFiles, + + sdTotalItems +}; + +class CStatistics { + friend class CStatisticsDlg; // to access CStatistics::GetTreeRoot() + +private: + CRemoteConnect &m_conn; + static CStatTreeItemBase* s_statTree; + static uint64 s_start_time; + static uint64 s_statData[sdTotalItems]; + uint8 average_minutes; + + public: + CStatistics(CRemoteConnect &conn); + ~CStatistics(); + + static uint64 GetUptimeMillis() { return GetTickCount64() - s_start_time; } + static uint64 GetUptimeSeconds() { return (GetTickCount64() - s_start_time) / 1000; } + + static uint64 GetSessionSentBytes() { return 0; } // TODO + static double GetUploadRate() { return (double)s_statData[sdUpload]; } + static double GetUpOverheadRate() { return (double)s_statData[sdUpOverhead]; } + + static uint64 GetSessionReceivedBytes() { return 0; } // TODO + static double GetDownloadRate() { return (double)s_statData[sdDownload]; } + static double GetDownOverheadRate() { return (double)s_statData[sdDownOverhead]; } + + static uint32 GetWaitingUserCount() { return s_statData[sdWaitingClients]; } + static uint32 GetBannedCount() { return s_statData[sdBannedClients]; } + + static uint32 GetSharedFileCount() { return 0; } // TODO + + static uint32 GetED2KUsers() { return s_statData[sdED2KUsers]; } + static uint32 GetKadUsers() { return s_statData[sdKadUsers]; } + static uint32 GetED2KFiles() { return s_statData[sdED2KFiles]; } + static uint32 GetKadFiles() { return s_statData[sdKadFiles]; } + + static void UpdateStats(const CECPacket* stats); + + void UpdateStatsTree(); + void SetAverageMinutes(uint8 minutes) { average_minutes = minutes; } + + private: + static CStatTreeItemBase* GetTreeRoot() { return s_statTree; } +}; + +#endif /* !EC_REMOTE / EC_REMOTE */ + + +/** + * Shortcut for CStatistics + */ +typedef CStatistics theStats; + +#endif // STATISTICS_H +// File_checked_for_headers diff --git a/src/StatisticsDlg.cpp b/src/StatisticsDlg.cpp new file mode 100644 index 00000000..24cc8ba5 --- /dev/null +++ b/src/StatisticsDlg.cpp @@ -0,0 +1,362 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include // Needed for std::ceil + +#include "ColorFrameCtrl.h" // Needed for CColorFrameCtrl +#include "OtherFunctions.h" // Needed for CastChild() +#include "OScopeCtrl.h" // Needed for COScopeCtrl +#include "Preferences.h" // Needed for thePrefs +#include "muuli_wdr.h" // Needed for statsDlg() +#include "StatisticsDlg.h" // Interface declarations + + +class CTreeItemData : public wxTreeItemData +{ + public: + explicit CTreeItemData(uint32_t uniqueid) + : m_uniqueid(uniqueid) + {} + + uint32_t GetUniqueId() const throw() { return m_uniqueid; } + void SetUniqueId(uint32_t val) throw() { m_uniqueid = val; } + + private: + uint32_t m_uniqueid; +}; + + +// CStatisticsDlg panel + +COLORREF CStatisticsDlg::getColors(unsigned num) +{ + wxCHECK(num < 15, RGB(0, 0, 0)); + + return acrStat[num]; +} + +CStatisticsDlg::CStatisticsDlg(wxWindow* pParent, CStatistics* stats) +: wxPanel(pParent, -1) +{ + wxSizer* content=statsDlg(this,TRUE); + content->Show(this,TRUE); + + pscopeDL = CastChild( wxT("dloadScope"), COScopeCtrl ); + pscopeDL->graph_type = GRAPH_DOWN; + pscopeUL = CastChild( wxT("uloadScope"), COScopeCtrl ); + pscopeUL->graph_type = GRAPH_UP; + pscopeConn = CastChild( wxT("otherScope"), COScopeCtrl ); + pscopeConn->graph_type = GRAPH_CONN; + stattree = CastChild( wxT("statTree"), wxTreeCtrl ); + + m_stats = stats; +} + + + +CStatisticsDlg::~CStatisticsDlg() +{ + +} + +void CStatisticsDlg::Init() +{ + InitGraphs(); + InitTree(); +} + + +void CStatisticsDlg::InitGraphs() +{ + // called after preferences get initialised + for (int index=0; index<=10; ++index) { + ApplyStatsColor(index); + } + + pscopeDL->SetRanges(0.0, (float)(thePrefs::GetMaxGraphDownloadRate()+4)); + pscopeDL->SetYUnits(_("kB/s")); + pscopeUL->SetRanges(0.0, (float)(thePrefs::GetMaxGraphUploadRate()+4)); + pscopeUL->SetYUnits(_("kB/s")); + pscopeConn->SetRanges(0.0, (float)(thePrefs::GetStatsMax())); + pscopeConn->SetYUnits(wxEmptyString); + + SetUpdatePeriod(thePrefs::GetTrafficOMeterInterval()); +} + + +// this array is now used to store the current color settings and to define the defaults +COLORREF CStatisticsDlg::acrStat[cntStatColors] = + { + RGB(0,0,64), RGB(192,192,255), RGB(128, 255, 128), RGB(0, 210, 0), + RGB(0, 128, 0), RGB(255, 128, 128), RGB(200, 0, 0), RGB(140, 0, 0), + RGB(150, 150, 255), RGB(192, 0, 192), RGB(255, 255, 128), RGB(0, 0, 0), + RGB(128, 255, 128), RGB(0, 210, 0), RGB(0, 128, 0) + }; + + + +void CStatisticsDlg::ApplyStatsColor(int index) +{ + static char aTrend[] = { 0,0, 2, 1, 0, 2, 1, 0, 1, 2, 0 }; + static int aRes[] = { 0,0, IDC_C0,IDC_C0_3,IDC_C0_2, IDC_C1,IDC_C1_3,IDC_C1_2, IDC_S0,IDC_S3,IDC_S1 }; + static COScopeCtrl** apscope[] = { NULL, NULL, &pscopeDL,&pscopeDL,&pscopeDL, &pscopeUL,&pscopeUL,&pscopeUL, &pscopeConn,&pscopeConn,&pscopeConn }; + + COLORREF cr = acrStat[index]; + + int iRes = aRes[index]; + int iTrend = aTrend[index]; + COScopeCtrl** ppscope = apscope[index]; + CColorFrameCtrl* ctrl; + switch (index) { + case 0: pscopeDL->SetBackgroundColor(cr); + pscopeUL->SetBackgroundColor(cr); + pscopeConn->SetBackgroundColor(cr); + break; + case 1: pscopeDL->SetGridColor(cr); + pscopeUL->SetGridColor(cr); + pscopeConn->SetGridColor(cr); + break; + case 2: case 3: case 4: + case 5: case 6: case 7: + case 8: case 9: case 10: + (*ppscope)->SetPlotColor(cr, iTrend); + if ((ctrl= CastChild(iRes, CColorFrameCtrl)) == NULL) { + printf("CStatisticsDlg::ApplyStatsColor: control missing (%d)\n",iRes); + exit(1); + } + ctrl->SetBackgroundColor(cr); + ctrl->SetFrameColor((COLORREF)RGB(0,0,0)); + break; + default: + break; // ignore unknown index, like SysTray speedbar color + } +} + +void CStatisticsDlg::UpdateStatGraphs(bool bStatsVisible, const uint32 peakconnections, const GraphUpdateInfo& update) +{ + + std::vector v1(3); + v1[0] = const_cast(&update.downloads[0]); + v1[1] = const_cast(&update.downloads[1]); + v1[2] = const_cast(&update.downloads[2]); + const std::vector &apfDown(v1); + std::vector v2(3); + v2[0] = const_cast(&update.uploads[0]); + v2[1] = const_cast(&update.uploads[1]); + v2[2] = const_cast(&update.uploads[2]); + const std::vector &apfUp(v2); + std::vector v3(3); + v3[0] = const_cast(&update.connections[0]); + v3[1] = const_cast(&update.connections[1]); + v3[2] = const_cast(&update.connections[2]); + const std::vector &apfConn(v3); + + if (!bStatsVisible) { + pscopeDL->DelayPoints(); + pscopeUL->DelayPoints(); + pscopeConn->DelayPoints(); + } + + static unsigned nScalePrev=1; + unsigned nScale = (unsigned)std::ceil((float)peakconnections / pscopeConn->GetUpperLimit()); + if (nScale != nScalePrev) { + nScalePrev = nScale; + wxStaticText* label = CastChild( ID_ACTIVEC, wxStaticText ); + + label->SetLabel(wxString::Format(_("Active connections (1:%u)"), nScale)); + label->GetParent()->Layout(); + + pscopeConn->SetRange(0.0, (float)nScale*pscopeConn->GetUpperLimit(), 1); + } + if (!bStatsVisible) + return; + + pscopeDL->AppendPoints(update.timestamp, apfDown); + pscopeUL->AppendPoints(update.timestamp, apfUp); + pscopeConn->AppendPoints(update.timestamp, apfConn); +} + + +void CStatisticsDlg::SetUpdatePeriod(int step) +{ + // this gets called after the value in Preferences/Statistics/Update delay has been changed + if (step == 0) { + pscopeDL->Stop(); + pscopeUL->Stop(); + pscopeConn->Stop(); + } else { + pscopeDL->Reset(step); + pscopeUL->Reset(step); + pscopeConn->Reset(step); + } +} + + +void CStatisticsDlg::ResetAveragingTime() +{ + // this gets called after the value in Preferences/Statistics/time for running avg has been changed + pscopeDL->InvalidateGraph(); + pscopeUL->InvalidateGraph(); +} + + +void CStatisticsDlg::SetARange(bool SetDownload,int maxValue) +{ + if ( SetDownload ) { + pscopeDL->SetRanges( 0, maxValue + 4 ); + } else { + pscopeUL->SetRanges( 0, maxValue + 4 ); + } +} + + +void CStatisticsDlg::InitTree() +{ + wxTreeItemId root=stattree->AddRoot(theStats::GetTreeRoot()->GetDisplayString()); + + ShowStatistics(true); + +#ifndef CLIENT_GUI + // Expand root + stattree->Expand(root); + + // Expand main items + wxTreeItemIdValue cookie; + wxTreeItemId expand_it = stattree->GetFirstChild(root,cookie); + + while(expand_it.IsOk()) { + stattree->Expand(expand_it); + // Next on this level + expand_it = stattree->GetNextSibling(expand_it); + } +#endif +} + +void CStatisticsDlg::GetExpandedNodes(NodeIdSet& nodeset, const wxTreeItemId& root) +{ + wxTreeItemIdValue cookie; + wxTreeItemId temp_it = stattree->GetFirstChild(root,cookie); + + while (temp_it.IsOk()) { + if (stattree->IsExpanded(temp_it)) { + nodeset.insert(dynamic_cast(stattree->GetItemData(temp_it))->GetUniqueId()); + } + if (stattree->ItemHasChildren(temp_it)) { + GetExpandedNodes(nodeset, temp_it); + } + temp_it = stattree->GetNextSibling(temp_it); + } +} + +void CStatisticsDlg::ShowStatistics(bool init) +{ + NodeIdSet ExpandedNodes; + + // If it's not the first initialization of the tree, i.e. application startup + if (!init) { + GetExpandedNodes(ExpandedNodes, stattree->GetRootItem()); + // Update sorting / get tree via EC + m_stats->UpdateStatsTree(); + } + + CStatTreeItemBase* treeRoot = theStats::GetTreeRoot(); + wxTreeItemId root = stattree->GetRootItem(); + FillTree(treeRoot, root, ExpandedNodes); +#ifdef CLIENT_GUI + if (!init) { + static bool firstUpdate = true; + if (firstUpdate) { + // Expand root + root = stattree->GetRootItem(); + stattree->Expand(root); + + // Expand main items + wxTreeItemIdValue cookie; + wxTreeItemId expand_it = stattree->GetFirstChild(root,cookie); + + while(expand_it.IsOk()) { + stattree->Expand(expand_it); + // Next on this level + expand_it = stattree->GetNextSibling(expand_it); + } + firstUpdate = false; + } + } +#endif +} + + +void CStatisticsDlg::FillTree(CStatTreeItemBase* statssubtree, wxTreeItemId& StatsGUITree, const NodeIdSet& expandednodes) +{ + wxMutexLocker lock(statssubtree->GetLock()); + +#ifndef CLIENT_GUI + StatTreeItemIterator temp_it = statssubtree->GetFirstVisibleChild(thePrefs::GetMaxClientVersions()); +#else + StatTreeItemIterator temp_it = statssubtree->GetFirstVisibleChild(); +#endif + + wxTreeItemIdValue cookie; + wxTreeItemId temp_GUI_it = stattree->GetFirstChild(StatsGUITree,cookie); + + while (!statssubtree->IsAtEndOfList(temp_it)) { + wxTreeItemId temp_item; + if (temp_GUI_it.IsOk()) { + // There's already a child there, update it. + stattree->SetItemText(temp_GUI_it, (*temp_it)->GetDisplayString()); + temp_item = temp_GUI_it; + uint32_t uid = (*temp_it)->GetUniqueId(); + dynamic_cast(stattree->GetItemData(temp_GUI_it))->SetUniqueId(uid); + if (expandednodes.find(uid) != expandednodes.end()) { + stattree->Expand(temp_GUI_it); + } else { + stattree->Collapse(temp_GUI_it); + } + temp_GUI_it = stattree->GetNextSibling(temp_GUI_it); + } else { + // No more child on GUI, add them. + temp_item = stattree->AppendItem(StatsGUITree,(*temp_it)->GetDisplayString()); + stattree->SetItemData(temp_item, new CTreeItemData((*temp_it)->GetUniqueId())); + } + // Has childs? + if ((*temp_it)->HasVisibleChildren()) { + FillTree((*temp_it), temp_item, expandednodes); + } else { + stattree->DeleteChildren(temp_item); + } + statssubtree->GetNextVisibleChild(temp_it); + } + + // What if GUI has more items than tree? + // Delete the extra items. + while (temp_GUI_it.IsOk()) { + wxTreeItemId backup_node = stattree->GetNextSibling(temp_GUI_it); + stattree->DeleteChildren(temp_GUI_it); + stattree->Delete(temp_GUI_it); + temp_GUI_it = backup_node; + } +} +// File_checked_for_headers diff --git a/src/StatisticsDlg.h b/src/StatisticsDlg.h new file mode 100644 index 00000000..283de68a --- /dev/null +++ b/src/StatisticsDlg.h @@ -0,0 +1,78 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef STATISTICSDLG_H +#define STATISTICSDLG_H + +#include // Needed for wxPanel + +#include // Needed for std::set + +typedef std::set NodeIdSet; + + +class COScopeCtrl; +class CStatistics; +class CStatTreeItemBase; +class wxTreeCtrl; +class wxTreeItemId; +//struct UpdateInfo; +typedef struct UpdateInfo GraphUpdateInfo; + +// CStatisticsDlg panel + +class CStatisticsDlg : public wxPanel +{ + friend class PrefsUnifiedDlg; + friend class CPreferences; + +public: + CStatisticsDlg(wxWindow* pParent, CStatistics* stats); + ~CStatisticsDlg(); + + void UpdateStatGraphs(bool bStatsVisible, const uint32 peakconnections, const GraphUpdateInfo& update); + void SetUpdatePeriod(int step); + void ResetAveragingTime(); + void ShowStatistics(bool init = false); + void SetARange(bool SetDownload, int maxValue); + void FillTree(CStatTreeItemBase* statssubtree, wxTreeItemId& StatsGUITree, const NodeIdSet& expandednodes); + void GetExpandedNodes(NodeIdSet& nodeset, const wxTreeItemId& root); + void Init(); + void InitTree(); + void InitGraphs(); + void ApplyStatsColor(int index); + static COLORREF getColors(unsigned num); + COScopeCtrl* GetDLScope() { return pscopeDL; }; + COScopeCtrl* GetConnScope() { return pscopeConn; }; + +protected: + static COLORREF acrStat[15]; + COScopeCtrl* pscopeDL,*pscopeUL,*pscopeConn; + wxTreeCtrl* stattree; + CStatistics* m_stats; +}; + +#endif // STATISTICSDLG_H +// File_checked_for_headers diff --git a/src/Tag.cpp b/src/Tag.cpp new file mode 100644 index 00000000..61021de3 --- /dev/null +++ b/src/Tag.cpp @@ -0,0 +1,462 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "Tag.h" // Interface declarations + + +#include "SafeFile.h" // Needed for CFileDataIO +#include "MD4Hash.h" // Needed for CMD4Hash + +/////////////////////////////////////////////////////////////////////////////// +// CTag + +CTag::CTag(const wxString& Name) +{ + m_uType = 0; + m_uName = 0; + m_Name = Name; + m_uVal = 0; + m_nSize = 0; +} + +CTag::CTag(uint8 uName) +{ + m_uType = 0; + m_uName = uName; + m_uVal = 0; + m_nSize = 0; +} + +CTag::CTag(const CTag& rTag) +{ + m_uType = rTag.m_uType; + m_uName = rTag.m_uName; + m_Name = rTag.m_Name; + m_nSize = 0; + if (rTag.IsStr()) { + m_pstrVal = new wxString(rTag.GetStr()); + } else if (rTag.IsInt()) { + m_uVal = rTag.GetInt(); + } else if (rTag.IsFloat()) { + m_fVal = rTag.GetFloat(); + } else if (rTag.IsHash()) { + m_hashVal = new CMD4Hash(rTag.GetHash()); + } else if (rTag.IsBlob()) { + m_nSize = rTag.GetBlobSize(); + m_pData = new unsigned char[rTag.GetBlobSize()]; + memcpy(m_pData, rTag.GetBlob(), rTag.GetBlobSize()); + } else { + wxASSERT(0); + m_uVal = 0; + } +} + + +CTag::CTag(const CFileDataIO& data, bool bOptUTF8) +{ + // Zero variables to allow for safe deletion + m_uType = m_uName = m_nSize = m_uVal = 0; + m_pData = NULL; + + try { + m_uType = data.ReadUInt8(); + if (m_uType & 0x80) { + m_uType &= 0x7F; + m_uName = data.ReadUInt8(); + } else { + uint16 length = data.ReadUInt16(); + if (length == 1) { + m_uName = data.ReadUInt8(); + } else { + m_uName = 0; + m_Name = data.ReadOnlyString(utf8strNone,length); + } + } + + // NOTE: It's very important that we read the *entire* packet data, + // even if we do not use each tag. Otherwise we will get in trouble + // when the packets are returned in a list - like the search results + // from a server. If we cannot do this, then we throw an exception. + switch (m_uType) { + case TAGTYPE_STRING: + m_pstrVal = new wxString(data.ReadString(bOptUTF8)); + break; + + case TAGTYPE_UINT32: + m_uVal = data.ReadUInt32(); + break; + + case TAGTYPE_UINT64: + m_uVal = data.ReadUInt64(); + break; + + case TAGTYPE_UINT16: + m_uVal = data.ReadUInt16(); + m_uType = TAGTYPE_UINT32; + break; + + case TAGTYPE_UINT8: + m_uVal = data.ReadUInt8(); + m_uType = TAGTYPE_UINT32; + break; + + case TAGTYPE_FLOAT32: + //#warning Endianess problem? + data.Read(&m_fVal, 4); + break; + + case TAGTYPE_HASH16: + m_hashVal = new CMD4Hash(data.ReadHash()); + break; + + case TAGTYPE_BOOL: + printf("***NOTE: %s; Reading BOOL tag\n", __FUNCTION__); + data.ReadUInt8(); + break; + + case TAGTYPE_BOOLARRAY: { + printf("***NOTE: %s; Reading BOOL Array tag\n", __FUNCTION__); + uint16 len = data.ReadUInt16(); + + // 07-Apr-2004: eMule versions prior to 0.42e.29 used the formula "(len+7)/8"! + //#warning This seems to be off by one! 8 / 8 + 1 == 2, etc. + data.Seek((len / 8) + 1, wxFromCurrent); + break; + } + + case TAGTYPE_BLOB: + // 07-Apr-2004: eMule versions prior to 0.42e.29 handled the "len" as int16! + m_nSize = data.ReadUInt32(); + + // Since the length is 32b, this check is needed to avoid + // huge allocations in case of bad tags. + if (m_nSize > data.GetLength() - data.GetPosition()) { + throw CInvalidPacket(wxT("Malformed tag")); + } + + m_pData = new unsigned char[m_nSize]; + data.Read(m_pData, m_nSize); + break; + + default: + if (m_uType >= TAGTYPE_STR1 && m_uType <= TAGTYPE_STR16) { + uint8 length = m_uType - TAGTYPE_STR1 + 1; + m_pstrVal = new wxString(data.ReadOnlyString(bOptUTF8, length)); + m_uType = TAGTYPE_STRING; + } else { + // Since we cannot determine the length of this tag, we + // simply have to abort reading the file. + throw CInvalidPacket(wxString::Format(wxT("Unknown tag type encounted %x, cannot proceed!"),m_uType)); + } + } + } catch (...) { + if (m_uType == TAGTYPE_BLOB) { + delete[] m_pData; + } + + throw; + } +} + + +CTag::~CTag() +{ + if (IsStr()) { + delete m_pstrVal; + } else if (IsHash()) { + delete m_hashVal; + } else if (IsBlob() || IsBsob()) { + delete[] m_pData; + } +} + + +CTag &CTag::operator=(const CTag &rhs) +{ + if (&rhs != this) { + m_uType = rhs.m_uType; + m_uName = rhs.m_uName; + m_Name = rhs.m_Name; + m_nSize = 0; + if (rhs.IsStr()) { + wxString *p = new wxString(rhs.GetStr()); + delete m_pstrVal; + m_pstrVal = p; + } else if (rhs.IsInt()) { + m_uVal = rhs.GetInt(); + } else if (rhs.IsFloat()) { + m_fVal = rhs.GetFloat(); + } else if (rhs.IsHash()) { + CMD4Hash *p = new CMD4Hash(rhs.GetHash()); + delete m_hashVal; + m_hashVal = p; + } else if (rhs.IsBlob()) { + m_nSize = rhs.GetBlobSize(); + unsigned char *p = new unsigned char[rhs.GetBlobSize()]; + delete [] m_pData; + m_pData = p; + memcpy(m_pData, rhs.GetBlob(), rhs.GetBlobSize()); + } else { + wxASSERT(0); + m_uVal = 0; + } + } + return *this; +} + + +#define CHECK_TAG_TYPE(check, expected) \ + if (!(check)) { \ + throw CInvalidPacket(wxT(#expected) wxT(" tag expected, but found ") + GetFullInfo()); \ + } + +uint64 CTag::GetInt() const +{ + CHECK_TAG_TYPE(IsInt(), Integer); + + return m_uVal; +} + + +const wxString& CTag::GetStr() const +{ + CHECK_TAG_TYPE(IsStr(), String); + + return *m_pstrVal; +} + + +float CTag::GetFloat() const +{ + CHECK_TAG_TYPE(IsFloat(), Float); + + return m_fVal; +} + + +const CMD4Hash& CTag::GetHash() const +{ + CHECK_TAG_TYPE(IsHash(), Hash); + + return *m_hashVal; +} + + +uint32 CTag::GetBlobSize() const +{ + CHECK_TAG_TYPE(IsBlob(), Blob); + + return m_nSize; +} + + +const byte* CTag::GetBlob() const +{ + CHECK_TAG_TYPE(IsBlob(), Blob); + + return m_pData; +} + + +uint32 CTag::GetBsobSize() const +{ + CHECK_TAG_TYPE(IsBsob(), Bsob); + + return m_nSize; +} + + +const byte* CTag::GetBsob() const +{ + CHECK_TAG_TYPE(IsBsob(), Bsob); + + return m_pData; +} + +bool CTag::WriteNewEd2kTag(CFileDataIO* data, EUtf8Str eStrEncode) const +{ + + // Write tag type + uint8 uType; + + if (IsInt()) { + if (m_uVal <= 0xFF) { + uType = TAGTYPE_UINT8; + } else if (m_uVal <= 0xFFFF) { + uType = TAGTYPE_UINT16; + } else if (m_uVal <= 0xFFFFFFFF) { + uType = TAGTYPE_UINT32; + } else { + uType = TAGTYPE_UINT64; + } + } else if (IsStr()) { + uint16 uStrValLen = GetRawSize(*m_pstrVal, eStrEncode); + if (uStrValLen >= 1 && uStrValLen <= 16) { + uType = TAGTYPE_STR1 + uStrValLen - 1; + } else { + uType = TAGTYPE_STRING; + } + } else { + uType = m_uType; + } + + // Write tag name + if (!m_Name.IsEmpty()) { + data->WriteUInt8(uType); + data->WriteString(m_Name,utf8strNone); + } else { + wxASSERT( m_uName != 0 ); + data->WriteUInt8(uType | 0x80); + data->WriteUInt8(m_uName); + } + + // Write tag data + switch (uType) { + case TAGTYPE_STRING: + data->WriteString(*m_pstrVal,eStrEncode); + break; + case TAGTYPE_UINT64: + data->WriteUInt64(m_uVal); + break; + case TAGTYPE_UINT32: + data->WriteUInt32(m_uVal); + break; + case TAGTYPE_UINT16: + data->WriteUInt16(m_uVal); + break; + case TAGTYPE_UINT8: + data->WriteUInt8(m_uVal); + break; + case TAGTYPE_FLOAT32: + //#warning Endianess problem? + data->Write(&m_fVal, 4); + break; + case TAGTYPE_HASH16: + data->WriteHash(*m_hashVal); + break; + case TAGTYPE_BLOB: + data->WriteUInt32(m_nSize); + data->Write(m_pData, m_nSize); + break; + default: + // See comment on the default: of CTag::CTag(const CFileDataIO& data, bool bOptUTF8) + if (uType >= TAGTYPE_STR1 && uType <= TAGTYPE_STR16) { + // Sending '0' as len size makes it not write the len on the IO file. + // This is because this tag types send the len as their type. + data->WriteString(*m_pstrVal,eStrEncode,0); + } else { + printf("%s; Unknown tag: type=0x%02X\n", __FUNCTION__, uType); + wxASSERT(0); + return false; + } + break; + } + + return true; +} + +bool CTag::WriteTagToFile(CFileDataIO* file, EUtf8Str WXUNUSED(eStrEncode), bool restrictive) const +{ + + // Don't write tags of unknown types, we wouldn't be able to read them in again + // and the met file would be corrupted + if (!restrictive || (IsStr() || IsInt() || IsFloat() || IsBlob())) { + + // If this fails, it'll throw. + file->WriteTag(*this); + return true; + + } else { + printf("%s; Ignored tag with unknown type=0x%02X\n", __FUNCTION__, m_uType); + return false; + } +} + + +wxString CTag::GetFullInfo() const +{ + wxString strTag; + if (!m_Name.IsEmpty()) { + // Special case: Kad tags, and some ED2k tags ... + if (m_Name.Length() == 1) { + strTag = wxString::Format(wxT("0x%02X"), m_Name[0]); + } else { + strTag = wxT('\"'); + strTag += m_Name; + strTag += wxT('\"'); + } + } else { + strTag = wxString::Format(wxT("0x%02X"), m_uName); + } + strTag += wxT("="); + if (m_uType == TAGTYPE_STRING) { + strTag += wxT("\""); + strTag += *m_pstrVal; + strTag += wxT("\""); + } else if (m_uType >= TAGTYPE_STR1 && m_uType <= TAGTYPE_STR16) { + strTag += wxString::Format(wxT("(Str%u)\""), m_uType - TAGTYPE_STR1 + 1) + + *m_pstrVal + wxT("\""); + } else if (m_uType == TAGTYPE_UINT64) { + strTag += wxString::Format(wxT("(Int64)%") wxLongLongFmtSpec wxT("u"), m_uVal); + } else if (m_uType == TAGTYPE_UINT32) { + strTag += wxString::Format(wxT("(Int32)%u"), (unsigned)m_uVal); + } else if (m_uType == TAGTYPE_UINT16) { + strTag += wxString::Format(wxT("(Int16)%u"), (unsigned)m_uVal); + } else if (m_uType == TAGTYPE_UINT8) { + strTag += wxString::Format(wxT("(Int8)%u"), (unsigned)m_uVal); + } else if (m_uType == TAGTYPE_FLOAT32) { + strTag += wxString::Format(wxT("(Float32)%f"), m_fVal); + } else if (m_uType == TAGTYPE_BLOB) { + strTag += wxString::Format(wxT("(Blob)%u"), m_nSize); + } else if (m_uType == TAGTYPE_BSOB) { + strTag += wxString::Format(wxT("(Bsob)%u"), m_nSize); + } else { + strTag += wxString::Format(wxT("Type=%u"), m_uType); + } + return strTag; +} + +CTagHash::CTagHash(const wxString& name, const CMD4Hash& value) + : CTag(name) { + m_hashVal = new CMD4Hash(value); + m_uType = TAGTYPE_HASH16; + } + +CTagHash::CTagHash(uint8 name, const CMD4Hash& value) + : CTag(name) { + m_hashVal = new CMD4Hash(value); + m_uType = TAGTYPE_HASH16; + } + +void deleteTagPtrListEntries(TagPtrList* taglist) +{ + TagPtrList::const_iterator it; + for (it = taglist->begin(); it != taglist->end(); it++) { + delete *it; + } + taglist->clear(); +} +// File_checked_for_headers diff --git a/src/Tag.h b/src/Tag.h new file mode 100644 index 00000000..8d691dee --- /dev/null +++ b/src/Tag.h @@ -0,0 +1,297 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef TAG_H +#define TAG_H + + +#include // Needed for EUtf8Str + +#include + +#include "OtherFunctions.h" + +class CMD4Hash; +class CFileDataIO; + +/////////////////////////////////////////////////////////////////////////////// +// CTag + +class CTag +{ +public: + CTag(const CTag& rTag); + CTag(const CFileDataIO& data, bool bOptUTF8); + virtual ~CTag(); + CTag& operator=(const CTag&); + + uint8 GetType() const { return m_uType; } + uint8 GetNameID() const { return m_uName; } + const wxString& GetName() const { return m_Name; } + + bool IsStr() const { return m_uType == TAGTYPE_STRING; } + bool IsInt() const { return + (m_uType == TAGTYPE_UINT64) || + (m_uType == TAGTYPE_UINT32) || + (m_uType == TAGTYPE_UINT16) || + (m_uType == TAGTYPE_UINT8); } + bool IsFloat() const { return m_uType == TAGTYPE_FLOAT32; } + bool IsHash() const { return m_uType == TAGTYPE_HASH16; } + bool IsBlob() const { return m_uType == TAGTYPE_BLOB; } + bool IsBsob() const { return m_uType == TAGTYPE_BSOB; } + + uint64 GetInt() const; + + const wxString& GetStr() const; + + float GetFloat() const; + + const CMD4Hash& GetHash() const; + + const byte* GetBlob() const; + uint32 GetBlobSize() const; + + const byte* GetBsob() const; + uint32 GetBsobSize() const; + + CTag* CloneTag() { return new CTag(*this); } + + bool WriteTagToFile(CFileDataIO* file, + EUtf8Str eStrEncode = utf8strNone, + bool restrictive = true) const; // old eD2K tags + bool WriteNewEd2kTag(CFileDataIO* file, + EUtf8Str eStrEncode = utf8strNone) const; // new eD2K tags + + wxString GetFullInfo() const; + +protected: + CTag(const wxString& Name); + CTag(uint8 uName); + + uint8 m_uType; + union { + CMD4Hash* m_hashVal; + wxString* m_pstrVal; + uint64 m_uVal; + float m_fVal; + unsigned char* m_pData; + }; + + uint32 m_nSize; + +private: + uint8 m_uName; + wxString m_Name; + +}; + +typedef std::list TagPtrList; + +class CTagIntSized : public CTag +{ +public: + CTagIntSized(const wxString& name, uint64 value, uint8 bitsize) + : CTag(name) { + Init(value, bitsize); + } + + CTagIntSized(uint8 name, uint64 value, uint8 bitsize) + : CTag(name) { + Init(value, bitsize); + } + +protected: + CTagIntSized(const wxString& name) : CTag(name) {} + CTagIntSized(uint8 name) : CTag(name) {} + + void Init(uint64 value, uint8 bitsize) { + switch (bitsize) { + case 64: + wxASSERT(value <= ULONGLONG(0xFFFFFFFFFFFFFFFF)); + m_uVal = value; + m_uType = TAGTYPE_UINT64; + break; + case 32: + wxASSERT(value <= 0xFFFFFFFF); + m_uVal = value; + m_uType = TAGTYPE_UINT32; + break; + case 16: + wxASSERT(value <= 0xFFFF); + m_uVal = value; + m_uType = TAGTYPE_UINT16; + break; + case 8: + wxASSERT(value <= 0xFF); + m_uVal = value; + m_uType = TAGTYPE_UINT8; + break; + default: + throw wxString(wxT("Invalid bitsize on int tag")); + } + } +}; + +class CTagVarInt : public CTagIntSized +{ +public: + CTagVarInt(const wxString& name, uint64 value, uint8 forced_bits = 0) + : CTagIntSized(name) { + SizedInit(value, forced_bits); + } + CTagVarInt(uint8 name, uint64 value, uint8 forced_bits = 0) + : CTagIntSized(name) { + SizedInit(value, forced_bits); + } +private: + void SizedInit(uint64 value, uint8 forced_bits) { + if (forced_bits) { + // The bitsize was forced. + Init(value,forced_bits); + } else { + m_uVal = value; + if (value <= 0xFF) { + m_uType = TAGTYPE_UINT8; + } else if (value <= 0xFFFF) { + m_uType = TAGTYPE_UINT16; + } else if (value <= 0xFFFFFFFF) { + m_uType = TAGTYPE_UINT32; + } else { + m_uType = TAGTYPE_UINT64; + } + } + } +}; + +class CTagInt64 : public CTagIntSized +{ +public: + CTagInt64(const wxString& name, uint64 value) + : CTagIntSized(name, value, 64) { } + + CTagInt64(uint8 name, uint64 value) + : CTagIntSized(name, value, 64) { } +}; + +class CTagInt32 : public CTagIntSized +{ +public: + CTagInt32(const wxString& name, uint64 value) + : CTagIntSized(name, value, 32) { } + + CTagInt32(uint8 name, uint64 value) + : CTagIntSized(name, value, 32) { } +}; + +class CTagInt16 : public CTagIntSized +{ +public: + CTagInt16(const wxString& name, uint64 value) + : CTagIntSized(name, value, 16) { } + + CTagInt16(uint8 name, uint64 value) + : CTagIntSized(name, value, 16) { } +}; + +class CTagInt8 : public CTagIntSized +{ +public: + CTagInt8(const wxString& name, uint64 value) + : CTagIntSized(name, value, 8) { } + + CTagInt8(uint8 name, uint64 value) + : CTagIntSized(name, value, 8) { } +}; + +class CTagFloat : public CTag +{ +public: + CTagFloat(const wxString& name, float value) + : CTag(name) { + m_fVal = value; + m_uType = TAGTYPE_FLOAT32; + } + + CTagFloat(uint8 name, float value) + : CTag(name) { + m_fVal = value; + m_uType = TAGTYPE_FLOAT32; + } +}; + +class CTagString : public CTag +{ +public: + CTagString(const wxString& name, const wxString& value) + : CTag(name) { + m_pstrVal = new wxString(value); + m_uType = TAGTYPE_STRING; + } + + CTagString(uint8 name, const wxString& value) + : CTag(name) { + m_pstrVal = new wxString(value); + m_uType = TAGTYPE_STRING; + } +}; + +class CTagHash : public CTag +{ +public: + // Implementation on .cpp to allow forward declaration of CMD4Hash + CTagHash(const wxString& name, const CMD4Hash& value); + CTagHash(uint8 name, const CMD4Hash& value); +}; + +class CTagBsob : public CTag +{ +public: + CTagBsob(const wxString& name, const byte* value, uint8 nSize) + : CTag(name) + { + m_uType = TAGTYPE_BSOB; + m_pData = new byte[nSize]; + memcpy(m_pData, value, nSize); + m_nSize = nSize; + } +}; + +class CTagBlob : public CTag +{ +public: + CTagBlob(const wxString& name, const byte* value, uint8 nSize) + : CTag(name) + { + m_uType = TAGTYPE_BLOB; + m_pData = new byte[nSize]; + memcpy(m_pData, value, nSize); + m_nSize = nSize; + } +}; + +void deleteTagPtrListEntries(TagPtrList* taglist); + +#endif // TAG_H +// File_checked_for_headers diff --git a/src/TerminationProcess.cpp b/src/TerminationProcess.cpp new file mode 100644 index 00000000..749c249d --- /dev/null +++ b/src/TerminationProcess.cpp @@ -0,0 +1,52 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2006-2008 Marcelo Roberto Jimenez ( phoenix@amule.org ) +// Copyright (c) 2006-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "TerminationProcess.h" + + +#include // Needed for _() + + +#include // Needed for CFormat +#include "Logger.h" // Needed for AddLogLineM + + +CTerminationProcess::CTerminationProcess(const wxString &cmd) +: +wxProcess(), +m_cmd(cmd) +{ +} + + +void CTerminationProcess::OnTerminate(int pid, int status) +{ + AddLogLineM(false, + CFormat(_("Command `%s' with pid `%d' has finished with status code `%d'.")) % + m_cmd % pid % status); + delete this; +} + diff --git a/src/TerminationProcess.h b/src/TerminationProcess.h new file mode 100644 index 00000000..0bdab195 --- /dev/null +++ b/src/TerminationProcess.h @@ -0,0 +1,48 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2006-2008 Marcelo Roberto Jimenez ( phoenix@amule.org ) +// Copyright (c) 2006-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#ifndef TERMINATIONPROCESS +#define TERMINATIONPROCESS + + +#include + + +// This is the handler for process termination events. +// Used on some calls to wxExecute(). +class CTerminationProcess : public wxProcess +{ +public: + CTerminationProcess(const wxString &cmd); + virtual void OnTerminate(int pid, int status); + +private: + wxString m_cmd; +}; + + +#endif // TERMINATIONPROCESS + diff --git a/src/TerminationProcessAmuleweb.cpp b/src/TerminationProcessAmuleweb.cpp new file mode 100644 index 00000000..ec69e39d --- /dev/null +++ b/src/TerminationProcessAmuleweb.cpp @@ -0,0 +1,46 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2008-2008 Marcelo Roberto Jimenez ( phoenix@amule.org ) +// Copyright (c) 2008-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "TerminationProcessAmuleweb.h" + + +CTerminationProcessAmuleweb::CTerminationProcessAmuleweb(const wxString &cmd, long *webserver_pid) +: +CTerminationProcess(cmd), +m_webserver_pid(webserver_pid) +{ +} + + +void CTerminationProcessAmuleweb::OnTerminate(int pid, int status) +{ + // Tell the application that the webserver is no longer running + *m_webserver_pid = 0; + + // Normal termination processing here + CTerminationProcess::OnTerminate(pid, status); +} + diff --git a/src/TerminationProcessAmuleweb.h b/src/TerminationProcessAmuleweb.h new file mode 100644 index 00000000..8954d509 --- /dev/null +++ b/src/TerminationProcessAmuleweb.h @@ -0,0 +1,48 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2008-2008 Marcelo Roberto Jimenez ( phoenix@amule.org ) +// Copyright (c) 2008-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#ifndef TERMINATIONPROCESSAMULEWEB +#define TERMINATIONPROCESSAMULEWEB + + +#include "TerminationProcess.h" // for CTerminationProcess + + +// This is the handler for process termination events. +// Used on some calls to wxExecute(). +class CTerminationProcessAmuleweb : public CTerminationProcess +{ +private: + long *m_webserver_pid; + +public: + CTerminationProcessAmuleweb(const wxString &cmd, long *webserver_pid); + virtual void OnTerminate(int pid, int status); +}; + + +#endif // TERMINATIONPROCESSAMULEWEB + diff --git a/src/TextClient.cpp b/src/TextClient.cpp new file mode 100644 index 00000000..aa9d7df3 --- /dev/null +++ b/src/TextClient.cpp @@ -0,0 +1,990 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 Angel Vidal (Kry) ( kry@amule.org / http://www.amule.org ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#ifdef HAVE_CONFIG_H + #include "config.h" // Needed for VERSION +#endif + +#ifndef __WXMSW__ + #include // Do_not_auto_remove +#endif + +#include "TextClient.h" + +//------------------------------------------------------------------- + + +//------------------------------------------------------------------- + +#include + +#include + +#include // Needed for CFormat +#include "OtherFunctions.h" +#include "KnownFile.h" // Needed for Priority Levels +#include "DataToText.cpp" // Needed for PriorityToStr + +#define APP_INIT_SIZE_X 640 +#define APP_INIT_SIZE_Y 480 + +#define theApp (*((CamulecmdApp*)wxTheApp)) + +//------------------------------------------------------------------- + +enum { + CMD_ID_STATUS, + CMD_ID_RESUME, + CMD_ID_PAUSE, + CMD_ID_PRIORITY_LOW, + CMD_ID_PRIORITY_NORMAL, + CMD_ID_PRIORITY_HIGH, + CMD_ID_PRIORITY_AUTO, + CMD_ID_CANCEL, + CMD_ID_CONNECT, + CMD_ID_CONNECT_ED2K, + CMD_ID_CONNECT_KAD, + CMD_ID_DISCONNECT, + CMD_ID_DISCONNECT_ED2K, + CMD_ID_DISCONNECT_KAD, + CMD_ID_RELOAD_SHARED, + CMD_ID_RELOAD_IPFILTER, + CMD_ID_SET_IPFILTER_ON, + CMD_ID_SET_IPFILTER_OFF, + CMD_ID_SET_IPFILTER_CLIENTS_ON, + CMD_ID_SET_IPFILTER_CLIENTS_OFF, + CMD_ID_SET_IPFILTER_SERVERS_ON, + CMD_ID_SET_IPFILTER_SERVERS_OFF, + CMD_ID_SET_IPFILTER_LEVEL, + CMD_ID_GET_IPFILTER, + CMD_ID_GET_IPFILTER_STATE, + CMD_ID_GET_IPFILTER_STATE_CLIENTS, + CMD_ID_GET_IPFILTER_STATE_SERVERS, + CMD_ID_GET_IPFILTER_LEVEL, + CMD_ID_SHOW_UL, + CMD_ID_SHOW_DL, + CMD_ID_SHOW_LOG, + CMD_ID_SHOW_SERVERS, + CMD_ID_SHOW_SHARED, + CMD_ID_RESET_LOG, + CMD_ID_SHUTDOWN, + CMD_ID_ADDLINK, + CMD_ID_SET_BWLIMIT_UP, + CMD_ID_SET_BWLIMIT_DOWN, + CMD_ID_GET_BWLIMITS, + CMD_ID_STATTREE, + CMD_ID_SEARCH, + CMD_ID_SEARCH_GLOBAL, + CMD_ID_SEARCH_LOCAL, + CMD_ID_SEARCH_KAD, + CMD_ID_SEARCH_RESULTS, + CMD_ID_SEARCH_PROGRESS, + CMD_ID_DOWNLOAD, + // IDs for deprecated commands + CMD_ID_SET_IPFILTER + +}; + +// method to create a SearchFile +SearchFile::SearchFile(CEC_SearchFile_Tag *tag) +{ + nHash = tag->FileHash(); + sHash = nHash.Encode(); + sFileName = tag->FileName(); + lFileSize = tag->SizeFull(); + lSourceCount = tag->SourceCount(); + bPresent = tag->AlreadyHave(); +} + +//------------------------------------------------------------------- +IMPLEMENT_APP (CamulecmdApp) +//------------------------------------------------------------------- + +void CamulecmdApp::OnInitCmdLine(wxCmdLineParser& parser) +{ + CaMuleExternalConnector::OnInitCmdLine(parser); + parser.AddOption(wxT("c"), wxT("command"), + _("Execute and exit."), + wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); +} + +bool CamulecmdApp::OnCmdLineParsed(wxCmdLineParser& parser) +{ + m_HasCmdOnCmdLine = parser.Found(wxT("command"), &m_CmdString); + return CaMuleExternalConnector::OnCmdLineParsed(parser); +} + +void CamulecmdApp::TextShell(const wxString& prompt) +{ + if (m_HasCmdOnCmdLine) + Parse_Command(m_CmdString); + else + CaMuleExternalConnector::TextShell(prompt); +} + +int CamulecmdApp::ProcessCommand(int CmdId) +{ + wxString args = GetCmdArgs(); + CECPacket *request = 0; + std::list request_list; + int tmp_int = 0; + EC_SEARCH_TYPE search_type = EC_SEARCH_KAD; + + // Implementation of the deprecated command 'SetIPFilter'. + if (CmdId == CMD_ID_SET_IPFILTER) { + if ( ! args.IsEmpty() ) { + if (args.IsSameAs(wxT("ON"), false)) { + CmdId = CMD_ID_SET_IPFILTER_ON; + } else if (args.IsSameAs(wxT("OFF"), false)) { + CmdId = CMD_ID_SET_IPFILTER_OFF; + } else { + return CMD_ERR_INVALID_ARG; + } + } else { + CmdId = CMD_ID_GET_IPFILTER_STATE; + } + } + + switch (CmdId) { + case CMD_ID_STATUS: + request_list.push_back(new CECPacket(EC_OP_STAT_REQ, EC_DETAIL_CMD)); + break; + + case CMD_ID_SHUTDOWN: + request_list.push_back(new CECPacket(EC_OP_SHUTDOWN)); + break; + + case CMD_ID_CONNECT: + if ( !args.IsEmpty() ) { + unsigned int ip[4]; + unsigned int port; + // Not much we can do against this unicode2char. + int result = sscanf(unicode2char(args), "%d.%d.%d.%d:%d", &ip[0], &ip[1], &ip[2], &ip[3], &port); + if (result != 5) { + // Try to resolve DNS -- good for dynamic IP servers + wxString serverName(args.BeforeFirst(wxT(':'))); + long lPort; + bool ok = args.AfterFirst(wxT(':')).ToLong(&lPort); + port = (unsigned int)lPort; + wxIPV4address a; + a.Hostname(serverName); + a.Service(port); + result = sscanf(unicode2char(a.IPAddress()), "%d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3]); + if (serverName.IsEmpty() || !ok || (result != 4)) { + Show(_("Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n")); + return 0; + } + } + EC_IPv4_t addr; + addr.m_ip[0] = ip[0]; + addr.m_ip[1] = ip[1]; + addr.m_ip[2] = ip[2]; + addr.m_ip[3] = ip[3]; + addr.m_port = port; + request = new CECPacket(EC_OP_SERVER_CONNECT); + request->AddTag(CECTag(EC_TAG_SERVER, addr)); + request_list.push_back(request); + } else { + request_list.push_back(new CECPacket(EC_OP_CONNECT)); + } + break; + + case CMD_ID_CONNECT_ED2K: + request_list.push_back(new CECPacket(EC_OP_SERVER_CONNECT)); + break; + + case CMD_ID_CONNECT_KAD: + request_list.push_back(new CECPacket(EC_OP_KAD_START)); + break; + + case CMD_ID_DISCONNECT: + request_list.push_back(new CECPacket(EC_OP_DISCONNECT)); + break; + + case CMD_ID_DISCONNECT_ED2K: + request_list.push_back(new CECPacket(EC_OP_SERVER_DISCONNECT)); + break; + + case CMD_ID_DISCONNECT_KAD: + request_list.push_back(new CECPacket(EC_OP_KAD_STOP)); + break; + + case CMD_ID_RELOAD_SHARED: + request_list.push_back(new CECPacket(EC_OP_SHAREDFILES_RELOAD)); + break; + + case CMD_ID_RELOAD_IPFILTER: + request_list.push_back(new CECPacket(EC_OP_IPFILTER_RELOAD)); + break; + + case CMD_ID_SET_IPFILTER_ON: + case CMD_ID_SET_IPFILTER_CLIENTS_ON: + case CMD_ID_SET_IPFILTER_SERVERS_ON: + tmp_int = 1; + case CMD_ID_SET_IPFILTER_OFF: + case CMD_ID_SET_IPFILTER_CLIENTS_OFF: + case CMD_ID_SET_IPFILTER_SERVERS_OFF: + { + if (CmdId == CMD_ID_SET_IPFILTER_CLIENTS_ON | CmdId == CMD_ID_SET_IPFILTER_CLIENTS_OFF) { + CmdId = CMD_ID_GET_IPFILTER_STATE_CLIENTS; + } else if (CmdId == CMD_ID_SET_IPFILTER_SERVERS_ON || CmdId == CMD_ID_SET_IPFILTER_SERVERS_OFF) { + CmdId = CMD_ID_GET_IPFILTER_STATE_SERVERS; + } else { + CmdId = CMD_ID_GET_IPFILTER_STATE; + } + + request = new CECPacket(EC_OP_SET_PREFERENCES); + CECEmptyTag prefs(EC_TAG_PREFS_SECURITY); + if (CmdId != CMD_ID_GET_IPFILTER_STATE_SERVERS) { + prefs.AddTag(CECTag(EC_TAG_IPFILTER_CLIENTS, (uint8)tmp_int)); + } + if (CmdId != CMD_ID_GET_IPFILTER_STATE_CLIENTS) { + prefs.AddTag(CECTag(EC_TAG_IPFILTER_SERVERS, (uint8)tmp_int)); + } + request->AddTag(prefs); + request_list.push_back(request); + } + case CMD_ID_GET_IPFILTER: + case CMD_ID_GET_IPFILTER_STATE: + case CMD_ID_GET_IPFILTER_STATE_CLIENTS: + case CMD_ID_GET_IPFILTER_STATE_SERVERS: + request = new CECPacket(EC_OP_GET_PREFERENCES); + request->AddTag(CECTag(EC_TAG_SELECT_PREFS, (uint32)EC_PREFS_SECURITY)); + request_list.push_back(request); + break; + + case CMD_ID_SET_IPFILTER_LEVEL: + if (!args.IsEmpty()) // This 'if' must stay as long as we support the deprecated 'IPLevel' command. + { + unsigned long int level = 0; + if (args.ToULong(&level) == true && level < 256) { + request = new CECPacket(EC_OP_SET_PREFERENCES); + CECEmptyTag prefs(EC_TAG_PREFS_SECURITY); + prefs.AddTag(CECTag(EC_TAG_IPFILTER_LEVEL, (uint8)level)); + request->AddTag(prefs); + request_list.push_back(request); + } else { + return CMD_ERR_INVALID_ARG; + } + } + CmdId = CMD_ID_GET_IPFILTER_LEVEL; + case CMD_ID_GET_IPFILTER_LEVEL: + request = new CECPacket(EC_OP_GET_PREFERENCES); + request->AddTag(CECTag(EC_TAG_SELECT_PREFS, (uint32)EC_PREFS_SECURITY)); + request_list.push_back(request); + break; + + case CMD_ID_PAUSE: + case CMD_ID_CANCEL: + case CMD_ID_RESUME: + { + if ( args.IsEmpty() ) { + Show(_("This command requires an argument. Valid arguments: 'all', filename, or a number.\n")); + return 0; + } else { + wxStringTokenizer argsTokenizer(args); + wxString token; + CMD4Hash hash; + + // Grab the entire dl queue right away + CECPacket request_all(EC_OP_GET_DLOAD_QUEUE, EC_DETAIL_CMD); + const CECPacket *reply_all = SendRecvMsg_v2(&request_all); + + if (reply_all) { + switch(CmdId) { + case CMD_ID_PAUSE: + request = new CECPacket(EC_OP_PARTFILE_PAUSE); break; + case CMD_ID_CANCEL: + request = new CECPacket(EC_OP_PARTFILE_DELETE); break; + case CMD_ID_RESUME: + request = new CECPacket(EC_OP_PARTFILE_RESUME); break; + default: wxASSERT(0); + } + + // We loop through all the arguments + while(argsTokenizer.HasMoreTokens()) { + token=argsTokenizer.GetNextToken(); + + // If the user requested all, then we select all files and exit the loop + // since there is little point to add anything more to "everything" + if( token == wxT("all") ) { + for(int i = 0;i < reply_all->GetTagCount();i++) { + const CECTag *tag = reply_all->GetTagByIndex(i); + if (tag) { + request->AddTag(CECTag(EC_TAG_PARTFILE, tag->GetMD4Data())); + } + break; + } + } else if ( hash.Decode(token.Trim(false).Trim(true)) ) { + if ( !hash.IsEmpty() ) { + Show(_("Processing by hash: "+token+wxT("\n"))); + request->AddTag(CECTag(EC_TAG_PARTFILE, hash)); + } + } else { + // Go through the dl queue and look at each filename + for(int i = 0; i < reply_all->GetTagCount(); i++) { + CEC_PartFile_Tag *tag = (CEC_PartFile_Tag *)reply_all->GetTagByIndex(i); + if (tag) { + wxString partmetname = tag->PartMetName(); + + // We check for filename, XXX.pat.met, XXX.part, XXX + if( tag->FileName() == token || + partmetname == token || + partmetname.Truncate(partmetname.Len()-4) == token || + partmetname.Truncate(partmetname.Len()-5) == token) { + Show(_("Processing by filename: "+token+wxT("\n"))); + request->AddTag(CECTag(EC_TAG_PARTFILE, tag->GetMD4Data())); + } + } + } + } // End of filename check else + } // End of argument token loop + + request_list.push_back(request); + + delete reply_all; + + } // End of dl queue processing + + } // end of command processing + break; + } + + case CMD_ID_PRIORITY_LOW: + case CMD_ID_PRIORITY_NORMAL: + case CMD_ID_PRIORITY_HIGH: + case CMD_ID_PRIORITY_AUTO: + if ( args.IsEmpty() ) { + Show(_("This command requires an argument. Valid arguments: a file hash.\n")); + return 0; + } else { + CMD4Hash hash; + if (hash.Decode(args.Trim(false).Trim(true))) { + if (!hash.IsEmpty()) { + request = new CECPacket(EC_OP_PARTFILE_PRIO_SET); + CECTag hashtag(EC_TAG_PARTFILE, hash); + switch(CmdId) { + case CMD_ID_PRIORITY_LOW: + hashtag.AddTag(CECTag(EC_TAG_PARTFILE_PRIO, (uint8)PR_LOW)); + break; + case CMD_ID_PRIORITY_NORMAL: + hashtag.AddTag(CECTag(EC_TAG_PARTFILE_PRIO, (uint8)PR_NORMAL)); + break; + case CMD_ID_PRIORITY_HIGH: + hashtag.AddTag(CECTag(EC_TAG_PARTFILE_PRIO, (uint8)PR_HIGH)); + break; + case CMD_ID_PRIORITY_AUTO: + hashtag.AddTag(CECTag(EC_TAG_PARTFILE_PRIO, (uint8)PR_AUTO)); + break; + default: wxASSERT(0); + } + request->AddTag(hashtag); + request_list.push_back(request); + } else { + Show(_("Not a valid number\n")); + return 0; + } + } else { + Show(_("Not a valid hash (length should be exactly 32 chars)\n")); + return 0; + } + } + break; + + case CMD_ID_SHOW_UL: + request_list.push_back(new CECPacket(EC_OP_GET_ULOAD_QUEUE)); + break; + + case CMD_ID_SHOW_DL: + request_list.push_back(new CECPacket(EC_OP_GET_DLOAD_QUEUE)); + break; + + case CMD_ID_SHOW_LOG: + request_list.push_back(new CECPacket(EC_OP_GET_LOG)); + break; + + case CMD_ID_SHOW_SERVERS: + request_list.push_back(new CECPacket(EC_OP_GET_SERVER_LIST, EC_DETAIL_CMD)); + break; + + case CMD_ID_RESET_LOG: + request_list.push_back(new CECPacket(EC_OP_RESET_LOG)); + break; + + case CMD_ID_ADDLINK: + if (args.compare(0, 7, wxT("ed2k://")) == 0) { + //aMule doesn't like AICH links without |/| in front of h= + if (args.Find(wxT("|h=")) > -1 && args.Find(wxT("|/|h=")) == -1) { + args.Replace(wxT("|h="),wxT("|/|h=")); + } + } + request = new CECPacket(EC_OP_ADD_LINK); + request->AddTag(CECTag(EC_TAG_STRING, args)); + request_list.push_back(request); + break; + + case CMD_ID_SET_BWLIMIT_UP: + tmp_int = EC_TAG_CONN_MAX_UL - EC_TAG_CONN_MAX_DL; + case CMD_ID_SET_BWLIMIT_DOWN: + tmp_int += EC_TAG_CONN_MAX_DL; + { + unsigned long int limit; + if (args.ToULong(&limit)) { + request = new CECPacket(EC_OP_SET_PREFERENCES); + CECEmptyTag prefs(EC_TAG_PREFS_CONNECTIONS); + prefs.AddTag(CECTag(tmp_int, (uint16)limit)); + request->AddTag(prefs); + request_list.push_back(request); + } else { + return CMD_ERR_INVALID_ARG; + } + } + case CMD_ID_GET_BWLIMITS: + request = new CECPacket(EC_OP_GET_PREFERENCES); + request->AddTag(CECTag(EC_TAG_SELECT_PREFS, (uint32)EC_PREFS_CONNECTIONS)); + request_list.push_back(request); + break; + + case CMD_ID_STATTREE: + request = new CECPacket(EC_OP_GET_STATSTREE); + if (!args.IsEmpty()) { + unsigned long int max_versions; + if (args.ToULong(&max_versions)) { + if (max_versions < 256) { + request->AddTag(CECTag(EC_TAG_STATTREE_CAPPING, (uint8)max_versions)); + } else { + delete request; + return CMD_ERR_INVALID_ARG; + } + } else { + delete request; + return CMD_ERR_INVALID_ARG; + } + } + request_list.push_back(request); + break; + case CMD_ID_SEARCH_GLOBAL: + search_type = EC_SEARCH_GLOBAL; + case CMD_ID_SEARCH_LOCAL: + if (search_type != EC_SEARCH_GLOBAL){ + search_type = EC_SEARCH_LOCAL; + } + case CMD_ID_SEARCH_KAD: + if (search_type != EC_SEARCH_GLOBAL && search_type != EC_SEARCH_LOCAL){ + search_type = EC_SEARCH_KAD; + } + if (!args.IsEmpty()) + { + wxString search = args; + wxString type = wxT(""); + wxString extention = wxT(""); + uint32 avail = 0; + uint32 min_size = 0; + uint32 max_size = 0; + + request = new CECPacket(EC_OP_SEARCH_START); + request->AddTag(CEC_Search_Tag (search, search_type, type, extention, avail, min_size, max_size)); + request_list.push_back(request); + } + break; + case CMD_ID_SEARCH: + printf("No search type defined.\nType 'help search' to get more help.\n"); + break; + + + case CMD_ID_SEARCH_RESULTS: + request_list.push_back(new CECPacket(EC_OP_SEARCH_RESULTS, EC_DETAIL_FULL)); + break; + + case CMD_ID_SEARCH_PROGRESS: + request_list.push_back(new CECPacket(EC_OP_SEARCH_PROGRESS)); + break; + + case CMD_ID_DOWNLOAD: + if (!args.IsEmpty()) + { + unsigned long int id = 0; + if (args.ToULong(&id) == true && id < m_Results_map.size()) { + + SearchFile* file = m_Results_map[id]; + printf("Download File: %lu %s\n", id, (const char*)unicode2char(file->sFileName)); + request = new CECPacket(EC_OP_DOWNLOAD_SEARCH_RESULT); + // get with id the hash and category=0 + uint32 category = 0; + CECTag hashtag(EC_TAG_PARTFILE, file->nHash); + hashtag.AddTag(CECTag(EC_TAG_PARTFILE_CAT, category)); + request->AddTag(hashtag); + request_list.push_back(request); + } else { + return CMD_ERR_INVALID_ARG; + } + } + break; + + default: + return CMD_ERR_PROCESS_CMD; + } + + m_last_cmd_id = CmdId; + + if ( ! request_list.empty() ) { + std::list::iterator it = request_list.begin(); + while ( it != request_list.end() ) { + CECPacket *curr = *it++; + const CECPacket *reply = SendRecvMsg_v2(curr); + delete curr; + if ( reply ) { + Process_Answer_v2(reply); + delete reply; + } + } + request_list.resize(0); + } + + if (CmdId == CMD_ID_SHUTDOWN) + return CMD_ID_QUIT; + else + return CMD_OK; +} + + /* + * Method to show the results in the console + */ +void CamulecmdApp::ShowResults(CResultMap results_map) +{ + unsigned int name_max = 80; + unsigned int mb_max = 5; + unsigned int nr_max = 5; + unsigned long int id = 0; + wxString output, name, sources, mb , kb; + + printf("Nr. Filename: Size(MB): Sources: \n"); + printf("-----------------------------------------------------------------------------------------------------------\n"); + + for( std::map::iterator iter = results_map.begin(); iter != results_map.end(); iter++ ) { + id = (*iter).first; + SearchFile* file = (*iter).second; + + output.Printf(wxT("%i. "), id); + output = output.SubString(0, nr_max).Append(file->sFileName).Append(' ', name_max); + mb.Printf(wxT(" %d"), file->lFileSize/1024/1024); + kb.Printf(wxT(".%d"), file->lFileSize/1024%1024); + output = output.SubString(0, nr_max + name_max + mb_max - mb.Length() ).Append(mb).Append(kb); + printf("%s %ld\n",(const char*)unicode2char(output), file->lSourceCount ); + } +} + + +// Formats a statistics (sub)tree to text +wxString StatTree2Text(CEC_StatTree_Node_Tag *tree, int depth) +{ + if (!tree) { + return wxEmptyString; + } + wxString result = wxString(wxChar(' '), depth) + tree->GetDisplayString() + wxT("\n"); + for (int i = 0; i < tree->GetTagCount(); ++i) { + CEC_StatTree_Node_Tag *tmp = (CEC_StatTree_Node_Tag*)tree->GetTagByIndex(i); + if (tmp->GetTagName() == EC_TAG_STATTREE_NODE) { + result += StatTree2Text(tmp, depth + 1); + } + } + return result; +} + +/* + * Format EC packet into text form for output to console + */ +void CamulecmdApp::Process_Answer_v2(const CECPacket *response) +{ + wxString s; + wxString msgFailedUnknown(_("Request failed with an unknown error.")); + wxASSERT(response); + switch (response->GetOpCode()) { + case EC_OP_NOOP: + s << _("Operation was successful."); + break; + case EC_OP_FAILED: + if (response->GetTagCount()) { + const CECTag *tag = response->GetTagByIndex(0); + if (tag) { + s << CFormat(_("Request failed with the following error: %s")) % wxGetTranslation(tag->GetStringData()); + } else { + s << msgFailedUnknown; + } + } else { + s << msgFailedUnknown; + } + break; + case EC_OP_SET_PREFERENCES: + { + const CECTag *tab = response->GetTagByNameSafe(EC_TAG_PREFS_SECURITY); + const CECTag *ipfilterLevel = tab->GetTagByName(EC_TAG_IPFILTER_LEVEL); + if (ipfilterLevel) { + if (m_last_cmd_id == CMD_ID_GET_IPFILTER || + m_last_cmd_id == CMD_ID_GET_IPFILTER_STATE || + m_last_cmd_id == CMD_ID_GET_IPFILTER_STATE_CLIENTS) { + s << wxString::Format(_("IP filtering for clients is %s.\n"), + (tab->GetTagByName(EC_TAG_IPFILTER_CLIENTS) == NULL) ? _("OFF") : _("ON")); + } + if (m_last_cmd_id == CMD_ID_GET_IPFILTER || + m_last_cmd_id == CMD_ID_GET_IPFILTER_STATE || + m_last_cmd_id == CMD_ID_GET_IPFILTER_STATE_SERVERS) { + s << wxString::Format(_("IP filtering for servers is %s.\n"), + (tab->GetTagByName(EC_TAG_IPFILTER_SERVERS) == NULL) ? _("OFF") : _("ON")); + } + if (m_last_cmd_id == CMD_ID_GET_IPFILTER || + m_last_cmd_id == CMD_ID_GET_IPFILTER_LEVEL) { + s << wxString::Format(_("Current IPFilter Level is %d.\n"), + ipfilterLevel->GetInt()); + } + } + tab = response->GetTagByNameSafe(EC_TAG_PREFS_CONNECTIONS); + const CECTag *connMaxUL = tab->GetTagByName(EC_TAG_CONN_MAX_UL); + const CECTag *connMaxDL = tab->GetTagByName(EC_TAG_CONN_MAX_DL); + if (connMaxUL && connMaxDL) { + s << wxString::Format(_("Bandwidth Limits: Up: %u kB/s, Down: %u kB/s.\n"), + (uint16)connMaxUL->GetInt(), + (uint16)connMaxDL->GetInt()); + } + } + break; + case EC_OP_STRINGS: + for (int i = 0; i < response->GetTagCount(); ++i) { + const CECTag *tag = response->GetTagByIndex(i); + if (tag) { + s << tag->GetStringData() << wxT("\n"); + } else { + } + } + break; + case EC_OP_STATS: { + CEC_ConnState_Tag *connState = (CEC_ConnState_Tag*)response->GetTagByName(EC_TAG_CONNSTATE); + if (connState) { + s << _("ED2K") << wxT(": "); + if (connState->IsConnectedED2K()) { + CECTag *server = connState->GetTagByName(EC_TAG_SERVER); + CECTag *serverName = server ? server->GetTagByName(EC_TAG_SERVER_NAME) : NULL; + if (server && serverName) { + s << CFormat(_("Connected to %s %s %s")) % + serverName->GetStringData() % + server->GetIPv4Data().StringIP() % + (connState->HasLowID() ? _("with LowID") : _("with HighID")); + } + } else if (connState->IsConnectingED2K()) { + s << _("Now connecting"); + } else { + s << _("Not connected"); + } + s << wxT('\n') << _("Kad") << wxT(": "); + if (connState->IsKadRunning()) { + if (connState->IsConnectedKademlia()) { + s << _("Connected") << wxT(" ("); + if (connState->IsKadFirewalled()) { + s << _("firewalled"); + } else { + s << _("ok"); + } + s << wxT(')'); + } else { + s << _("Not connected"); + } + } else { + s << _("Not running"); + } + s << wxT('\n'); + } + const CECTag *tmpTag; + if ((tmpTag = response->GetTagByName(EC_TAG_STATS_DL_SPEED)) != 0) { + s << CFormat(_("\nDownload:\t%s")) % CastItoSpeed(tmpTag->GetInt()); + } + if ((tmpTag = response->GetTagByName(EC_TAG_STATS_UL_SPEED)) != 0) { + s << CFormat(_("\nUpload:\t%s")) % CastItoSpeed(tmpTag->GetInt()); + } + if ((tmpTag = response->GetTagByName(EC_TAG_STATS_UL_QUEUE_LEN)) != 0) { + s << wxString::Format(_("\nClients in queue:\t%d\n"), tmpTag->GetInt()); + } + if ((tmpTag = response->GetTagByName(EC_TAG_STATS_TOTAL_SRC_COUNT)) != 0) { + s << wxString::Format(_("\nTotal sources:\t%d\n"), tmpTag->GetInt()); + } + break; + } + case EC_OP_DLOAD_QUEUE: + for(int i = 0; i < response->GetTagCount(); ++i) { + CEC_PartFile_Tag *tag = + (CEC_PartFile_Tag *)response->GetTagByIndex(i); + if (tag) { + uint64 filesize, donesize; + filesize = tag->SizeFull(); + donesize = tag->SizeDone(); + s << tag->FileHashString() << wxT(" ") << + tag->FileName() << + wxString::Format(wxT("\n\t [%.1f%%] %4i/%4i "), + ((float)donesize) / ((float)filesize)*100.0, + (int)tag->SourceCount() - (int)tag->SourceNotCurrCount(), + (int)tag->SourceCount()) << + ((int)tag->SourceCountA4AF() ? wxString::Format(wxT("+%2.2i "),(int)tag->SourceCountA4AF()) : wxString(wxT(" "))) << + ((int)tag->SourceXferCount() ? wxString::Format(wxT("(%2.2i) - "),(int)tag->SourceXferCount()) : wxString(wxT(" - "))) << + tag->GetFileStatusString(); + s << wxT(" - ") << tag->PartMetName(); + if (tag->Prio() < 10) { + s << wxT(" - ") << PriorityToStr((int)tag->Prio(), 0); + } else { + s << wxT(" - ") << PriorityToStr((tag->Prio() - 10), 1); + } + if ( tag->SourceXferCount() > 0) { + s << wxT(" - ") + CastItoSpeed(tag->Speed()); + } + s << wxT("\n"); + } + } + break; + case EC_OP_ULOAD_QUEUE: + for(int i = 0; i < response->GetTagCount(); ++i) { + const CECTag *tag = response->GetTagByIndex(i); + const CECTag *clientName = tag ? tag->GetTagByName(EC_TAG_CLIENT_NAME) : NULL; + const CECTag *partfileName = tag ? tag->GetTagByName(EC_TAG_PARTFILE_NAME) : NULL; + const CECTag *partfileSizeXfer = tag ? tag->GetTagByName(EC_TAG_PARTFILE_SIZE_XFER) : NULL; + const CECTag *partfileSpeed = tag ? tag->GetTagByName(EC_TAG_CLIENT_UP_SPEED) : NULL; + if (tag && clientName && partfileName && partfileSizeXfer && partfileSpeed) { + s << wxT("\n") << + wxString::Format(wxT("%10u "), tag->GetInt()) << + clientName->GetStringData() << wxT(" ") << + partfileName->GetStringData() << wxT(" ") << + CastItoXBytes(partfileSizeXfer->GetInt()) << wxT(" ") << + CastItoSpeed(partfileSpeed->GetInt()); + } + } + break; + case EC_OP_LOG: + for (int i = 0; i < response->GetTagCount(); ++i) { + const CECTag *tag = response->GetTagByIndex(i); + if (tag) { + s << tag->GetStringData() << wxT("\n"); + } else { + } + } + break; + case EC_OP_SERVER_LIST: + for(int i = 0; i < response->GetTagCount(); i ++) { + const CECTag *tag = response->GetTagByIndex(i); + const CECTag *serverName = tag ? tag->GetTagByName(EC_TAG_SERVER_NAME) : NULL; + if (tag && serverName) { + wxString ip = tag->GetIPv4Data().StringIP(); + ip.Append(' ', 24 - ip.Length()); + s << ip << serverName->GetStringData() << wxT("\n"); + } + } + break; + case EC_OP_STATSTREE: + s << StatTree2Text((CEC_StatTree_Node_Tag*)response->GetTagByName(EC_TAG_STATTREE_NODE), 0); + break; + + case EC_OP_SEARCH_RESULTS: + m_Results_map.clear(); + s << wxString::Format(_("Number of search results: %i\n"),response->GetTagCount()); + for (int i = 0;i < response->GetTagCount();i++) { + CEC_SearchFile_Tag *tag = (CEC_SearchFile_Tag *)response->GetTagByIndex(i); + //printf("Tag FileName: %s \n",(const char*)unicode2char(tag->FileName())); + //if (tag != NULL) + m_Results_map[i] = new SearchFile(tag); + //const CECTag *tag = response->GetTagByIndex(i); + + } + ShowResults(m_Results_map); + break; + + case EC_OP_SEARCH_PROGRESS: + s << _("TODO - show progress of a search"); + // gives compilation error!! + // const CECTag *tab = response->GetTagByNameSafe(EC_TAG_SEARCH_STATUS); + //s << wxString::Format(_("Search progress: %u %% \n"),(const char*)unicode2char(tab->GetStringData())); + break; + default: + s << wxString::Format(_("Received an unknown reply from the server, OpCode = %#x."), response->GetOpCode()); + } + Process_Answer(s); +} + +void CamulecmdApp::OnInitCommandSet() +{ + CCommandTree *tmp; + CCommandTree *tmp2; + CCommandTree *tmp3; + + CaMuleExternalConnector::OnInitCommandSet(); + + m_commands.AddCommand(wxT("Status"), CMD_ID_STATUS, wxTRANSLATE("Show short status information."), + wxTRANSLATE("Show connection status, current up/download speeds, etc.\n"), CMD_PARAM_NEVER); + + m_commands.AddCommand(wxT("Statistics"), CMD_ID_STATTREE, wxTRANSLATE("Show full statistics tree."), + wxTRANSLATE("Optionally, a number in the range 0-255 can be passed as an argument to this\n" + "command, which tells how many entries of the client version subtrees should be\n" + "shown. Passing 0 or omitting it means 'unlimited'.\n" + "\n" + "Example: 'statistics 5' will show only the top 5 versions for each client type.\n")); + + m_commands.AddCommand(wxT("Shutdown"), CMD_ID_SHUTDOWN, wxTRANSLATE("Shutdown aMule."), + wxTRANSLATE("Shutdown the remote running core (amule/amuled).\n" + "This will also shut down the text client, since it is unusable without a\n" + "running core.\n"), CMD_PARAM_NEVER); + + tmp = m_commands.AddCommand(wxT("Reload"), CMD_ERR_INCOMPLETE, wxTRANSLATE("Reloads the given object."), wxEmptyString, CMD_PARAM_NEVER); + tmp->AddCommand(wxT("Shared"), CMD_ID_RELOAD_SHARED, wxTRANSLATE("Reloads shared files list."), wxEmptyString, CMD_PARAM_NEVER); + tmp->AddCommand(wxT("IPFilter"), CMD_ID_RELOAD_IPFILTER, wxTRANSLATE("Reloads IP Filter table from file."), wxEmptyString, CMD_PARAM_NEVER); + + tmp = m_commands.AddCommand(wxT("Connect"), CMD_ID_CONNECT, wxTRANSLATE("Connect to the network."), + wxTRANSLATE("This will connect to all networks that are enabled in Preferences.\n" + "You may also optionally specify a server address in IP:Port form, to connect to\n" + "that server only. The IP must be a dotted decimal IPv4 address,\n" + "or a resolvable DNS name."), CMD_PARAM_OPTIONAL); + tmp->AddCommand(wxT("ED2K"), CMD_ID_CONNECT_ED2K, wxTRANSLATE("Connect to ED2K only."), wxEmptyString, CMD_PARAM_NEVER); + tmp->AddCommand(wxT("Kad"), CMD_ID_CONNECT_KAD, wxTRANSLATE("Connect to Kad only."), wxEmptyString, CMD_PARAM_NEVER); + + tmp = m_commands.AddCommand(wxT("Disconnect"), CMD_ID_DISCONNECT, wxTRANSLATE("Disconnect from the network."), + wxTRANSLATE("This will disconnect from all networks that are currently connected.\n"), CMD_PARAM_NEVER); + tmp->AddCommand(wxT("ED2K"), CMD_ID_DISCONNECT_ED2K, wxTRANSLATE("Disconnect from ED2K only."), wxEmptyString, CMD_PARAM_NEVER); + tmp->AddCommand(wxT("Kad"), CMD_ID_DISCONNECT_KAD, wxTRANSLATE("Disconnect from Kad only."), wxEmptyString, CMD_PARAM_NEVER); + + m_commands.AddCommand(wxT("Add"), CMD_ID_ADDLINK, wxTRANSLATE("Adds an ed2k or magnet link to core."), + wxTRANSLATE("The ed2k link to be added can be:\n" + "*) a file link (ed2k://|file|...), it will be added to the download queue,\n" + "*) a server link (ed2k://|server|...), it will be added to the server list,\n" + "*) or a serverlist link, in which case all servers in the list will be added to the\n" + " server list.\n" + "\n" + "The magnet link must contain the ed2k hash and file length.\n"), CMD_PARAM_ALWAYS); + + tmp = m_commands.AddCommand(wxT("Set"), CMD_ERR_INCOMPLETE, wxTRANSLATE("Set a preference value."), + wxEmptyString, CMD_PARAM_NEVER); + + tmp2 = tmp->AddCommand(wxT("IPFilter"), CMD_ERR_INCOMPLETE, wxTRANSLATE("Set IPFilter preferences."), wxEmptyString, CMD_PARAM_NEVER); + tmp2->AddCommand(wxT("On"), CMD_ID_SET_IPFILTER_ON, wxTRANSLATE("Turn IP filtering on for both clients and servers."), wxEmptyString, CMD_PARAM_NEVER); + tmp2->AddCommand(wxT("Off"), CMD_ID_SET_IPFILTER_OFF, wxTRANSLATE("Turn IP filtering off for both clients and servers."), wxEmptyString, CMD_PARAM_NEVER); + tmp3 = tmp2->AddCommand(wxT("Clients"), CMD_ERR_INCOMPLETE, wxTRANSLATE("Enable/Disable IP filtering for clients."), wxEmptyString, CMD_PARAM_NEVER); + tmp3->AddCommand(wxT("On"), CMD_ID_SET_IPFILTER_CLIENTS_ON, wxTRANSLATE("Turn IP filtering on for clients."), wxEmptyString, CMD_PARAM_NEVER); + tmp3->AddCommand(wxT("Off"), CMD_ID_SET_IPFILTER_CLIENTS_OFF, wxTRANSLATE("Turn IP filtering off for clients."), wxEmptyString, CMD_PARAM_NEVER); + tmp3 = tmp2->AddCommand(wxT("Servers"), CMD_ERR_INCOMPLETE, wxTRANSLATE("Enable/Disable IP filtering for servers."), wxEmptyString, CMD_PARAM_NEVER); + tmp3->AddCommand(wxT("On"), CMD_ID_SET_IPFILTER_SERVERS_ON, wxTRANSLATE("Turn IP filtering on for servers."), wxEmptyString, CMD_PARAM_NEVER); + tmp3->AddCommand(wxT("Off"), CMD_ID_SET_IPFILTER_SERVERS_OFF, wxTRANSLATE("Turn IP filtering off for servers."), wxEmptyString, CMD_PARAM_NEVER); + tmp2->AddCommand(wxT("Level"), CMD_ID_SET_IPFILTER_LEVEL, wxTRANSLATE("Select IP filtering level."), + wxTRANSLATE("Valid filtering levels are in the range 0-255, and it's default (initial)\n" + "value is 127.\n"), CMD_PARAM_ALWAYS); + + tmp2 = tmp->AddCommand(wxT("BwLimit"), CMD_ERR_INCOMPLETE, wxTRANSLATE("Set bandwidth limits."), + wxTRANSLATE("The value given to these commands has to be in kilobytes/sec.\n"), CMD_PARAM_NEVER); + tmp2->AddCommand(wxT("Up"), CMD_ID_SET_BWLIMIT_UP, wxTRANSLATE("Set upload bandwidth limit."), + wxT("The given value must be in kilobytes/sec.\n"), CMD_PARAM_ALWAYS); + tmp2->AddCommand(wxT("Down"), CMD_ID_SET_BWLIMIT_DOWN, wxTRANSLATE("Set download bandwidth limit."), + wxT("The given value must be in kilobytes/sec.\n"), CMD_PARAM_ALWAYS); + + tmp = m_commands.AddCommand(wxT("Get"), CMD_ERR_INCOMPLETE, wxTRANSLATE("Get and display a preference value."), + wxEmptyString, CMD_PARAM_NEVER); + + tmp2 = tmp->AddCommand(wxT("IPFilter"), CMD_ID_GET_IPFILTER, wxTRANSLATE("Get IPFilter preferences."), wxEmptyString, CMD_PARAM_NEVER); + tmp3 = tmp2->AddCommand(wxT("State"), CMD_ID_GET_IPFILTER_STATE, wxTRANSLATE("Get IPFilter state for both clients and servers."), wxEmptyString, CMD_PARAM_NEVER); + tmp3->AddCommand(wxT("Clients"), CMD_ID_GET_IPFILTER_STATE_CLIENTS, wxTRANSLATE("Get IPFilter state for clients only."), wxEmptyString, CMD_PARAM_NEVER); + tmp3->AddCommand(wxT("Servers"), CMD_ID_GET_IPFILTER_STATE_SERVERS, wxTRANSLATE("Get IPFilter state for servers only."), wxEmptyString, CMD_PARAM_NEVER); + tmp2->AddCommand(wxT("Level"), CMD_ID_GET_IPFILTER_LEVEL, wxTRANSLATE("Get IPFilter level."), wxEmptyString, CMD_PARAM_NEVER); + + tmp->AddCommand(wxT("BwLimits"), CMD_ID_GET_BWLIMITS, wxTRANSLATE("Get bandwidth limits."), wxEmptyString, CMD_PARAM_NEVER); + + tmp = m_commands.AddCommand(wxT("Search"), CMD_ID_SEARCH, wxTRANSLATE("Makes a search."), + wxTRANSLATE("A search type has to be specified by giving the type:\n" + " GLOBAL\n" + " LOCAL\n" + " KAD\n" + "Example: 'search kad file' will execute a kad search for \"file\".\n"), CMD_PARAM_ALWAYS); + tmp->AddCommand(wxT("global"), CMD_ID_SEARCH_GLOBAL, wxTRANSLATE("Executes a global search."), wxEmptyString, CMD_PARAM_ALWAYS); + tmp->AddCommand(wxT("local"), CMD_ID_SEARCH_LOCAL, wxTRANSLATE("Executes a local search"), wxEmptyString, CMD_PARAM_ALWAYS); + tmp->AddCommand(wxT("kad"), CMD_ID_SEARCH_KAD, wxTRANSLATE("Executes a kad search"), wxEmptyString, CMD_PARAM_ALWAYS); + + m_commands.AddCommand(wxT("Results"), CMD_ID_SEARCH_RESULTS, wxTRANSLATE("Shows the results of the last search."), + wxTRANSLATE("Returns the results of the previous search.\n"), CMD_PARAM_NEVER); + + m_commands.AddCommand(wxT("Progress"), CMD_ID_SEARCH_PROGRESS, wxTRANSLATE("Shows the progress of a search."), + wxTRANSLATE("Shows the progress of a search.\n"), CMD_PARAM_NEVER); + + m_commands.AddCommand(wxT("Download"), CMD_ID_DOWNLOAD, wxTRANSLATE("Start downloading a file"), + wxTRANSLATE("The number of a file from the last search has to be given.\n" + "Example: 'download 12' will start to download the file with the number 12 of the previous search.\n"), CMD_PARAM_ALWAYS); + + + // + // TODO: These commands below need implementation and/or rewrite! + // + + m_commands.AddCommand(wxT("Pause"), CMD_ID_PAUSE, wxTRANSLATE("Pause download."), + wxEmptyString, CMD_PARAM_ALWAYS); + + m_commands.AddCommand(wxT("Resume"), CMD_ID_RESUME, wxTRANSLATE("Resume download."), + wxEmptyString, CMD_PARAM_ALWAYS); + + m_commands.AddCommand(wxT("Cancel"), CMD_ID_CANCEL, wxTRANSLATE("Cancel download."), + wxEmptyString, CMD_PARAM_ALWAYS); + + tmp = m_commands.AddCommand(wxT("Priority"), CMD_ERR_INCOMPLETE, wxTRANSLATE("Set download priority."), + wxTRANSLATE("Set priority of a download to Low, Normal, High or Auto.\n"), CMD_PARAM_ALWAYS); + tmp->AddCommand(wxT("Low"), CMD_ID_PRIORITY_LOW, wxTRANSLATE("Set priority to low."), wxEmptyString, CMD_PARAM_ALWAYS); + tmp->AddCommand(wxT("Normal"), CMD_ID_PRIORITY_NORMAL, wxTRANSLATE("Set priority to normal."), wxEmptyString, CMD_PARAM_ALWAYS); + tmp->AddCommand(wxT("High"), CMD_ID_PRIORITY_HIGH, wxTRANSLATE("Set priority to high."), wxEmptyString, CMD_PARAM_ALWAYS); + tmp->AddCommand(wxT("Auto"), CMD_ID_PRIORITY_AUTO, wxTRANSLATE("Set priority to auto."), wxEmptyString, CMD_PARAM_ALWAYS); + + tmp = m_commands.AddCommand(wxT("Show"), CMD_ERR_INCOMPLETE, wxTRANSLATE("Show queues/lists."), + wxTRANSLATE("Shows upload/download queue, server list or shared files list.\n"), CMD_PARAM_NEVER); + tmp->AddCommand(wxT("UL"), CMD_ID_SHOW_UL, wxTRANSLATE("Show upload queue."), wxEmptyString, CMD_PARAM_NEVER); + tmp->AddCommand(wxT("DL"), CMD_ID_SHOW_DL, wxTRANSLATE("Show download queue."), wxEmptyString, CMD_PARAM_NEVER); + tmp->AddCommand(wxT("Log"), CMD_ID_SHOW_LOG, wxTRANSLATE("Show log."), wxEmptyString, CMD_PARAM_NEVER); + tmp->AddCommand(wxT("Servers"), CMD_ID_SHOW_SERVERS, wxTRANSLATE("Show servers list."), wxEmptyString, CMD_PARAM_NEVER); +// tmp->AddCommand(wxT("Shared"), CMD_ID_SHOW_SHARED, wxTRANSLATE("Show shared files list."), wxEmptyString, CMD_PARAM_NEVER); + + m_commands.AddCommand(wxT("Reset"), CMD_ID_RESET_LOG, wxTRANSLATE("Reset log."), wxEmptyString, CMD_PARAM_NEVER); + + // + // Deprecated commands, kept for backwards compatibility only. + // + +#define DEPRECATED(OLDCMD, ID, NEWCMD, PARAM) \ + m_commands.AddCommand(wxT(OLDCMD), CMD_ID_##ID | CMD_DEPRECATED, CFormat(wxTRANSLATE("Deprecated command, now '%s'.")) % wxT(NEWCMD), \ + CFormat(wxTRANSLATE("This is a deprecated command, and may be removed in the future.\n" \ + "Use '%s' instead.\n")) % wxT(NEWCMD), CMD_PARAM_##PARAM) + + DEPRECATED("Stats", STATUS, "Status", NEVER); + DEPRECATED("SetIPFilter", SET_IPFILTER, "Set IPFilter", OPTIONAL); + DEPRECATED("GetIPLevel", GET_IPFILTER_LEVEL, "Get IPFilter Level", NEVER); + DEPRECATED("SetIPLevel", SET_IPFILTER_LEVEL, "Set IPFilter Level", ALWAYS); + DEPRECATED("IPLevel", SET_IPFILTER_LEVEL, "Get/Set IPFilter Level", OPTIONAL); + DEPRECATED("Servers", SHOW_SERVERS, "Show Servers", NEVER); + DEPRECATED("GetBWLimits", GET_BWLIMITS, "Get BwLimits", NEVER); + DEPRECATED("SetUpBWLimit", SET_BWLIMIT_UP, "Set BwLimit Up", ALWAYS); + DEPRECATED("SetDownBWLimit", SET_BWLIMIT_DOWN, "Set BwLimit Down", ALWAYS); +} + +int CamulecmdApp::OnRun() +{ + ConnectAndRun(wxT("aMulecmd"), wxT(VERSION)); + return 0; +} +// File_checked_for_headers diff --git a/src/TextClient.h b/src/TextClient.h new file mode 100644 index 00000000..1d56bbf6 --- /dev/null +++ b/src/TextClient.h @@ -0,0 +1,80 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003-2008 Angel Vidal (Kry) ( kry@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef TEXTCLIENT_H +#define TEXTCLIENT_H + +#include "ExternalConnector.h" + +#include + + + +class CEC_SearchFile_Tag; + +class SearchFile { + public: + wxString sFileName; + unsigned long lFileSize; + CMD4Hash nHash; + wxString sHash; + long lSourceCount; + bool bPresent; + + SearchFile(CEC_SearchFile_Tag *); + + void ProcessUpdate(CEC_SearchFile_Tag *); + static class SearchInfo *GetContainerInstance(); + CMD4Hash ID() { return nHash; } +}; + +typedef std::map CResultMap; + +wxString ECv2_Response2String(CECPacket *response); + +class CamulecmdApp : public CaMuleExternalConnector +{ +public: + const wxString GetGreetingTitle() { return _("aMule text client"); } + int ProcessCommand(int ID); + void Process_Answer_v2(const CECPacket *reply); + void OnInitCommandSet(); + +private: + // other command line switches + void OnInitCmdLine(wxCmdLineParser& amuleweb_parser); + bool OnCmdLineParsed(wxCmdLineParser& parser); + void TextShell(const wxString& prompt); + void ShowResults(CResultMap results_map); + bool m_HasCmdOnCmdLine; + wxString m_CmdString; + virtual int OnRun(); + + int m_last_cmd_id; + CResultMap m_Results_map; +}; + +#endif // TEXTCLIENT_H +// File_checked_for_headers diff --git a/src/ThreadScheduler.cpp b/src/ThreadScheduler.cpp new file mode 100644 index 00000000..5034f4ee --- /dev/null +++ b/src/ThreadScheduler.cpp @@ -0,0 +1,389 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2006-2008 Mikkel Schubert ( xaignar@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "ThreadScheduler.h" // Interface declarations +#include "Logger.h" // Needed for Add(Debug)LogLineM +#include // Needed for CFormat +#include "ScopedPtr.h" // Needed for CScopedPtr + +#include // Needed for std::sort // Do_not_auto_remove (mingw-gcc-3.4.5) + +//! Global lock the scheduler and its thread. +static wxMutex s_lock; +//! Pointer to the global scheduler instance (automatically instantiated). +static CThreadScheduler* s_scheduler = NULL; +//! Specifies if the scheduler is running. +static bool s_running = false; +//! Specifies if the gobal scheduler has been terminated. +static bool s_terminated = false; + +/** + * This class is used in a custom implementation of wxThreadHelper. + * + * The reason for not using wxThreadHelper are as follows: + * - wxThreadHelper makes use of wxThread:Kill, which is warned against + * serveral times in the docs, and even calls it in its destructor. + * - Managing the thread-object is difficult, since the only way to + * destroy it is to create a new thread. + */ +class CTaskThread : public CMuleThread +{ +public: + CTaskThread(CThreadScheduler* owner) + : CMuleThread(wxTHREAD_JOINABLE), + m_owner(owner) + { + } + + //! For simplicity's sake, all code is placed in CThreadScheduler::Entry + void* Entry() { + return m_owner->Entry(); + } + +private: + //! The scheduler owning this thread. + CThreadScheduler* m_owner; +}; + + +void CThreadScheduler::Start() +{ + wxMutexLocker lock(s_lock); + + s_running = true; + s_terminated = false; + + // Ensures that a thread is started if tasks are already waiting. + if (s_scheduler) { + AddDebugLogLineM(false, logThreads, wxT("Starting scheduler")); + s_scheduler->CreateSchedulerThread(); + } +} + + +void CThreadScheduler::Terminate() +{ + AddDebugLogLineM(false, logThreads, wxT("Terminating scheduler")); + CThreadScheduler* ptr = NULL; + + { + wxMutexLocker lock(s_lock); + + // Safely unlink the scheduler, as to avoid race-conditions. + ptr = s_scheduler; + s_running = false; + s_terminated = true; + s_scheduler = NULL; + } + + delete ptr; + AddDebugLogLineM(false, logThreads, wxT("Scheduler terminated")); +} + + +bool CThreadScheduler::AddTask(CThreadTask* task, bool overwrite) +{ + wxMutexLocker lock(s_lock); + + // When terminated (on shutdown), all tasks are ignored. + if (s_terminated) { + AddDebugLogLineM(false, logThreads, wxT("Task discared: ") + task->GetDesc()); + delete task; + return false; + } else if (s_scheduler == NULL) { + s_scheduler = new CThreadScheduler(); + AddDebugLogLineM(false, logThreads, wxT("Scheduler created.")); + } + + return s_scheduler->DoAddTask(task, overwrite); +} + + +/** Returns string representation of error code. */ +wxString GetErrMsg(wxThreadError err) +{ + switch (err) { + case wxTHREAD_NO_ERROR: return wxT("wxTHREAD_NO_ERROR"); + case wxTHREAD_NO_RESOURCE: return wxT("wxTHREAD_NO_RESOURCE"); + case wxTHREAD_RUNNING: return wxT("wxTHREAD_RUNNING"); + case wxTHREAD_NOT_RUNNING: return wxT("wxTHREAD_NOT_RUNNING"); + case wxTHREAD_KILLED: return wxT("wxTHREAD_KILLED"); + case wxTHREAD_MISC_ERROR: return wxT("wxTHREAD_MISC_ERROR"); + default: + return wxT("Unknown error"); + } +} + + +void CThreadScheduler::CreateSchedulerThread() +{ + if ((m_thread && m_thread->IsAlive()) || m_tasks.empty()) { + return; + } + + // A thread can only be run once, so the old one must be safely disposed of + if (m_thread) { + AddDebugLogLineM(false, logThreads, wxT("CreateSchedulerThread: Disposing of old thread.")); + m_thread->Stop(); + delete m_thread; + } + + m_thread = new CTaskThread(this); + + wxThreadError err = m_thread->Create(); + if (err == wxTHREAD_NO_ERROR) { + // Try to avoid reducing the latency of the main thread + m_thread->SetPriority(WXTHREAD_MIN_PRIORITY); + + err = m_thread->Run(); + if (err == wxTHREAD_NO_ERROR) { + AddDebugLogLineM(false, logThreads, wxT("Scheduler thread started")); + return; + } else { + AddDebugLogLineM(true, logThreads, wxT("Error while starting scheduler thread: ") + GetErrMsg(err)); + } + } else { + AddDebugLogLineM(true, logThreads, wxT("Error while creating scheduler thread: ") + GetErrMsg(err)); + } + + // Creation or running failed. + m_thread->Stop(); + delete m_thread; + m_thread = NULL; +} + + +/** This is the sorter functor for the task-queue. */ +struct CTaskSorter +{ + bool operator()(const CThreadScheduler::CEntryPair& a, const CThreadScheduler::CEntryPair& b) { + if (a.first->GetPriority() != b.first->GetPriority()) { + return a.first->GetPriority() > b.first->GetPriority(); + } + + // Compare tasks numbers. + return a.second < b.second; + } +}; + + + +CThreadScheduler::CThreadScheduler() + : m_tasksDirty(false), + m_thread(NULL), + m_currentTask(NULL) +{ + +} + + +CThreadScheduler::~CThreadScheduler() +{ + if (m_thread) { + m_thread->Stop(); + delete m_thread; + } +} + + +size_t CThreadScheduler::GetTaskCount() const +{ + wxMutexLocker lock(s_lock); + + return m_tasks.size(); +} + + +bool CThreadScheduler::DoAddTask(CThreadTask* task, bool overwrite) +{ + // GetTick is too lowres, so we just use a counter to ensure that + // the sorted order will match the order in which the tasks were added. + static unsigned taskAge = 0; + + // Get the map for this task type, implicitly creating it as needed. + CDescMap& map = m_taskDescs[task->GetType()]; + + CDescMap::value_type entry(task->GetDesc(), task); + if (map.insert(entry).second) { + AddDebugLogLineM(false, logThreads, wxT("Task scheduled: ") + task->GetType() + wxT(" - ") + task->GetDesc()); + m_tasks.push_back(CEntryPair(task, taskAge++)); + m_tasksDirty = true; + } else if (overwrite) { + AddDebugLogLineM(false, logThreads, wxT("Task overwritten: ") + task->GetType() + wxT(" - ") + task->GetDesc()); + + CThreadTask* existingTask = map[task->GetDesc()]; + if (m_currentTask == existingTask) { + // The duplicate is already being executed, abort it. + m_currentTask->m_abort = true; + } else { + // Task not yet started, simply remove and delete. + wxCHECK2(map.erase(existingTask->GetDesc()), /* Do nothing. */); + delete existingTask; + } + + m_tasks.push_back(CEntryPair(task, taskAge++)); + map[task->GetDesc()] = task; + m_tasksDirty = true; + } else { + AddDebugLogLineM(false, logThreads, wxT("Duplicate task, discarding: ") + task->GetType() + wxT(" - ") + task->GetDesc()); + delete task; + return false; + } + + if (s_running) { + CreateSchedulerThread(); + } + + return true; +} + + +void* CThreadScheduler::Entry() +{ + AddDebugLogLineM(false, logThreads, wxT("Entering scheduling loop")); + + while (!m_thread->TestDestroy()) { + CScopedPtr task(NULL); + + { + wxMutexLocker lock(s_lock); + + // Resort tasks by priority/age if list has been modified. + if (m_tasksDirty) { + AddDebugLogLineM(false, logThreads, wxT("Resorting tasks")); + std::sort(m_tasks.begin(), m_tasks.end(), CTaskSorter()); + m_tasksDirty = false; + } else if (m_tasks.empty()) { + AddDebugLogLineM(false, logThreads, wxT("No more tasks, stopping")); + break; + } + + // Select the next task + task.reset(m_tasks.front().first); + m_tasks.pop_front(); + m_currentTask = task.get(); + } + + AddDebugLogLineM(false, logThreads, wxT("Current task: ") + task->GetType() + wxT(" - ") + task->GetDesc()); + // Execute the task + task->m_owner = m_thread; + task->Entry(); + task->OnExit(); + + // Check if this was the last task of this type + bool isLastTask = false; + + { + wxMutexLocker lock(s_lock); + + // If the task has been aborted, the entry now refers to + // a different task, so dont remove it. That also means + // that it cant be the last task of this type. + if (!task->m_abort) { + AddLogLineM(false, logThreads, + CFormat(wxT("Completed task '%s%s', %u tasks remaining.")) + % task->GetType() + % (task->GetDesc().IsEmpty() ? wxString() : (wxT(" - ") + task->GetDesc())) + % m_tasks.size() ); + + CDescMap& map = m_taskDescs[task->GetType()]; + if (!map.erase(task->GetDesc())) { + wxASSERT(0); + } else if (map.empty()) { + m_taskDescs.erase(task->GetType()); + isLastTask = true; + } + } + + m_currentTask = NULL; + } + + if (isLastTask) { + // Allow the task to signal that all sub-tasks have been completed + AddDebugLogLineM(false, logThreads, wxT("Last task, calling OnLastTask")); + task->OnLastTask(); + } + } + + AddDebugLogLineM(false, logThreads, wxT("Leaving scheduling loop")); + + return 0; +} + + + +CThreadTask::CThreadTask(const wxString& type, const wxString& desc, ETaskPriority priority) + : m_type(type), + m_desc(desc), + m_priority(priority), + m_owner(NULL), + m_abort(false) +{ +} + + +CThreadTask::~CThreadTask() +{ +} + + +void CThreadTask::OnLastTask() +{ + // Does nothing by default. +} + + +void CThreadTask::OnExit() +{ + // Does nothing by default. +} + + +bool CThreadTask::TestDestroy() const +{ + wxCHECK(m_owner, m_abort); + + return m_abort || m_owner->TestDestroy(); +} + + +const wxString& CThreadTask::GetType() const +{ + return m_type; +} + + +const wxString& CThreadTask::GetDesc() const +{ + return m_desc; +} + + +ETaskPriority CThreadTask::GetPriority() const +{ + return m_priority; +} + + +// File_checked_for_headers diff --git a/src/ThreadScheduler.h b/src/ThreadScheduler.h new file mode 100644 index 00000000..4fef3489 --- /dev/null +++ b/src/ThreadScheduler.h @@ -0,0 +1,198 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2006-2008 Mikkel Schubert ( xaignar@amule.org / http://www.amule.org ) +// Copyright (c) 2006-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#ifndef THREADSCHEDULER_H +#define THREADSCHEDULER_H + +#include +#include + +#include "Types.h" +#include "MuleThread.h" + + +class CThreadTask; + + +//! The priority values of tasks. +enum ETaskPriority +{ + ETP_Low = 0, + ETP_Normal, + ETP_High, + //! For tasks such as finding shared files and ipfilter.dat loading only. + ETP_Critical +}; + + +/** + * This class mananges scheduling of background tasks. + * + * Currently it is assumed that all tasks are IO intensive, + * so that only a single task is allowed to proceed at any + * one time. All threads are run in lowest priority mode. + * + * Tasks are sorted by priority (see ETaskPriority) and age. + * + * Note that the scheduler starts in suspended mode, in + * which tasks are queued but not executed. Call Start() + * to begin execution of the tasks. + */ +class CThreadScheduler +{ +public: + /** Starts execution of queued tasks. */ + static void Start(); + + /** + * Terminates task execution and frees the scheduler object. + * + * Tasks added after this are discarded. + */ + static void Terminate(); + + + /** + * Adds a new task to the queue, returning true if the task was queued. + * + * Before the task is queued, it is checked against the + * existing tasks based on type and description. If an + * matching task already exists, this task-object is + * discarded. The task is also discarded if the scheduler + * has been terminated. If 'overwrite' is true, any + * existing duplicate task is dropped, and if already + * running, terminated. + * + * Note: This function takes ownership of the task. + * + * @see Start + * @see Terminate + */ + static bool AddTask(CThreadTask* task, bool overwrite = false); + +private: + CThreadScheduler(); + ~CThreadScheduler(); + + /** Returns the number of tasks on the queue. */ + size_t GetTaskCount() const; + + /** Tries to add the given task to the queue, returning true on success. */ + bool DoAddTask(CThreadTask* task, bool overwrite); + + /** Creates the actual scheduler thread if none exist. */ + void CreateSchedulerThread(); + + /** Entry function called via internal thread-object. */ + void* Entry(); + + //! Contains a task and its age. + typedef std::pair CEntryPair; + + //! List of currently scheduled tasks. + std::deque m_tasks; + + //! Specifies if tasks should be resorted by priority. + bool m_tasksDirty; + + typedef std::map CDescMap; + typedef std::map CTypeMap; + //! Map of current task by type -> desc. Used to avoid duplicate tasks. + CTypeMap m_taskDescs; + + //! The actual worker thread. + CMuleThread* m_thread; + //! The currently running task, if any. + CThreadTask* m_currentTask; + + friend class CTaskThread; + friend struct CTaskSorter; +}; + + +/** + * Base-class of all threaded tasks. + * + * This class acts as a pseudo-thread, and is transparently + * executed on a worker thread by the CThreadScheduler + * class. + * + * Note that the task type should be an unique description + * of the task type, as it is used to detect completion of + * all tasks of a given type and in duplicate detection + * with the description. The description should be unique + * for the given task, such that duplicates can be discovered. + */ +class CThreadTask +{ +public: + /** + * @param type Should be a name constant among tasks of the type (hashing, completion, etc). + * @param desc Should be an unique description for this task, for detecting duplicates. + * @param priority Decides how soon the task will be carried out. + */ + CThreadTask(const wxString& type, const wxString& desc, ETaskPriority priority = ETP_Normal); + + /** Needed since CThreadScheduler only works with CThreadTask pointers. */ + virtual ~CThreadTask(); + + /** Returns the task type, used for debugging and duplicate detection. */ + const wxString& GetType() const; + + /** Returns the task description, used for debugging and duplicate detection. */ + const wxString& GetDesc() const; + + /** Returns the priority of the task. Used when selecting the next task. */ + ETaskPriority GetPriority() const; + +protected: + //! @see wxThread::Entry + virtual void Entry() = 0; + + /** Called when the last task of a specific type has been completed. */ + virtual void OnLastTask(); + + /** @see wxThread::OnExit */ + virtual void OnExit(); + + /** @see wxThread::TestDestroy */ + bool TestDestroy() const; + +private: + wxString m_type; + wxString m_desc; + ETaskPriority m_priority; + + //! The owner (scheduler), used when calling TestDestroy. + CMuleThread* m_owner; + //! Specifies if the specifc task should be aborted. + bool m_abort; + + friend class CThreadScheduler; +}; + +#endif +// File_checked_for_headers diff --git a/src/ThreadTasks.cpp b/src/ThreadTasks.cpp new file mode 100644 index 00000000..3aefad78 --- /dev/null +++ b/src/ThreadTasks.cpp @@ -0,0 +1,559 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2006-2008 Mikkel Schubert ( xaignar@amule.org / http:://www.amule.org ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include // Needed for wxTheApp + +#include "ThreadTasks.h" // Interface declarations +#include "PartFile.h" // Needed for CPartFile +#include "Logger.h" // Needed for Add(Debug)LogLineM +#include // Needed for CFormat +#include // Needed for CheckFileExists +#include "amule.h" // Needed for theApp +#include "KnownFileList.h" // Needed for theApp->knownfiles +#include "Preferences.h" // Needed for thePrefs +#include "ScopedPtr.h" // Needed for CScopedPtr and CScopedArray + + + +//! This hash represents the value for an empty MD4 hashing +const byte g_emptyMD4Hash[16] = { + 0x31, 0xD6, 0xCF, 0xE0, 0xD1, 0x6A, 0xE9, 0x31, + 0xB7, 0x3C, 0x59, 0xD7, 0xE0, 0xC0, 0x89, 0xC0 }; + + +//////////////////////////////////////////////////////////// +// CHashingTask + +CHashingTask::CHashingTask(const CPath& path, const CPath& filename, const CPartFile* part) + // GetPrintable is used to improve the readability of the log. + : CThreadTask(wxT("Hashing"), path.JoinPaths(filename).GetPrintable(), (part ? ETP_High : ETP_Normal)), + m_path(path), + m_filename(filename), + m_toHash((EHashes)(EH_MD4 | EH_AICH)), + m_owner(part) +{ + // We can only create the AICH hashset if the file is a knownfile or + // if the partfile is complete, since the MD4 hashset is checked first, + // so that the AICH hashset only gets assigned if the MD4 hashset + // matches what we expected. Due to the rareity of post-completion + // corruptions, this gives us a nice speedup in most cases. + if (part && !part->GetGapList().empty()) { + m_toHash = EH_MD4; + } +} + + +CHashingTask::CHashingTask(const CKnownFile* toAICHHash) + // GetPrintable is used to improve the readability of the log. + : CThreadTask(wxT("AICH Hashing"), toAICHHash->GetFilePath().JoinPaths(toAICHHash->GetFileName()).GetPrintable(), ETP_Low), + m_path(toAICHHash->GetFilePath()), + m_filename(toAICHHash->GetFileName()), + m_toHash(EH_AICH), + m_owner(toAICHHash) +{ +} + + +void CHashingTask::Entry() +{ + CFile file; + + CPath fullPath = m_path.JoinPaths(m_filename); + if (!file.Open(fullPath, CFile::read)) { + AddDebugLogLineM(true, logHasher, + CFormat(wxT("Warning, failed to open file, skipping: %s")) % fullPath); + return; + } + + uint64 fileLength = 0; + try { + fileLength = file.GetLength(); + } catch (const CIOFailureException&) { + AddDebugLogLineM(true, logHasher, + CFormat(wxT("Warning, failed to retrieve file-length, skipping: %s")) % fullPath); + return; + } + + if (fileLength > MAX_FILE_SIZE) { + AddDebugLogLineM(true, logHasher, + CFormat(wxT("Warning, file is larger than supported size, skipping: %s")) % fullPath); + return; + } else if (fileLength == 0) { + if (m_owner) { + // It makes no sense to try to hash empty partfiles ... + wxASSERT(0); + } else { + // Zero-size partfiles should be hashed, but not zero-sized shared-files. + AddDebugLogLineM( true, logHasher, + CFormat(wxT("Warning, 0-size file, skipping: %s")) % fullPath); + } + + return; + } + + // For thread-safety, results are passed via a temporary file object. + CScopedPtr knownfile(new CKnownFile()); + knownfile->m_filePath = m_path; + knownfile->SetFileName(m_filename); + knownfile->SetFileSize(fileLength); + knownfile->m_lastDateChanged = CPath::GetModificationTime(fullPath); + knownfile->m_AvailPartFrequency.insert( + knownfile->m_AvailPartFrequency.begin(), + knownfile->GetPartCount(), 0); + + if ((m_toHash & EH_MD4) && (m_toHash & EH_AICH)) { + knownfile->GetAICHHashset()->FreeHashSet(); + AddLogLineM( false, logHasher, CFormat( + _("Starting to create MD4 and AICH hash for file: %s")) % + m_filename ); + } else if ((m_toHash & EH_MD4)) { + AddLogLineM( false, logHasher, CFormat( + _("Starting to create MD4 hash for file: %s")) % m_filename ); + } else if ((m_toHash & EH_AICH)) { + knownfile->GetAICHHashset()->FreeHashSet(); + AddLogLineM( false, logHasher, CFormat( + _("Starting to create AICH hash for file: %s")) % m_filename ); + } else { + wxCHECK_RET(0, (CFormat(wxT("No hashes requested for file, skipping: %s")) + % m_filename).GetString()); + } + + + // This loops creates the part-hashes, loop-de-loop. + try { + while (!file.Eof() && !TestDestroy()) { + if (CreateNextPartHash(&file, knownfile.get(), m_toHash) == false) { + AddDebugLogLineM(true, logHasher, + CFormat(wxT("Error while hashing file, skipping: %s")) + % m_filename); + + return; + } + } + } catch (const CSafeIOException& e) { + AddDebugLogLineM(true, logHasher, wxT("IO exception while hashing file: ") + e.what()); + return; + } + + if ((m_toHash & EH_MD4) && !TestDestroy()) { + // If the file is < PARTSIZE, then the filehash is that one hash, + // otherwise, the filehash is the hash of the parthashes + if ( knownfile->m_hashlist.size() == 1 ) { + knownfile->m_abyFileHash = knownfile->m_hashlist[0]; + knownfile->m_hashlist.clear(); + } else if ( knownfile->m_hashlist.size() ) { + CMD4Hash hash; + knownfile->CreateHashFromHashlist(knownfile->m_hashlist, &hash); + knownfile->m_abyFileHash = hash; + } else { + // This should not happen! + wxASSERT(0); + } + } + + // Did we create a AICH hashset? + if ((m_toHash & EH_AICH) && !TestDestroy()) { + CAICHHashSet* AICHHashSet = knownfile->GetAICHHashset(); + + AICHHashSet->ReCalculateHash(false); + if (AICHHashSet->VerifyHashTree(true) ) { + AICHHashSet->SetStatus(AICH_HASHSETCOMPLETE); + if (!AICHHashSet->SaveHashSet()) { + AddDebugLogLineM( true, logHasher, + CFormat(wxT("Warning, failed to save AICH hashset for file: %s")) + % m_filename ); + } + } + } + + if ((m_toHash == EH_AICH) && !TestDestroy()) { + CHashingEvent evt(MULE_EVT_AICH_HASHING, knownfile.release(), m_owner); + + wxPostEvent(wxTheApp, evt); + } else if (!TestDestroy()) { + CHashingEvent evt(MULE_EVT_HASHING, knownfile.release(), m_owner); + + wxPostEvent(wxTheApp, evt); + } +} + + +bool CHashingTask::CreateNextPartHash(CFile* file, CKnownFile* owner, EHashes toHash) +{ + wxCHECK_MSG(!file->Eof(), false, wxT("Unexpected EOF in CreateNextPartHash")); + + // We'll read at most PARTSIZE bytes per cycle + const uint64 partLength = std::min(PARTSIZE, file->GetLength() - file->GetPosition()); + + CMD4Hash hash; + CMD4Hash* md4Hash = ((toHash & EH_MD4) ? &hash : NULL); + CAICHHashTree* aichHash = NULL; + + // Setup for AICH hashing + if (toHash & EH_AICH) { + aichHash = owner->GetAICHHashset()->m_pHashTree.FindHash(file->GetPosition(), partLength); + } + + owner->CreateHashFromFile(file, partLength, md4Hash, aichHash); + + if (toHash & EH_MD4) { + // Store the md4 hash + owner->m_hashlist.push_back(hash); + + // This is because of the ed2k implementation for parts. A 2 * PARTSIZE + // file i.e. will have 3 parts (see CKnownFile::SetFileSize for comments). + // So we have to create the hash for the 0-size data, which will be the default + // md4 hash for null data: 31D6CFE0D16AE931B73C59D7E0C089C0 + if ((partLength == PARTSIZE) && file->Eof()) { + owner->m_hashlist.push_back(CMD4Hash(g_emptyMD4Hash)); + } + } + + return true; +} + + +void CHashingTask::OnLastTask() +{ + if (GetType() == wxT("Hashing")) { + // To prevent rehashing in case of crashes, we + // explicity save the list of hashed files here. + theApp->knownfiles->Save(); + + // Make sure the AICH-hashes are up to date. + CThreadScheduler::AddTask(new CAICHSyncTask()); + } +} + + +//////////////////////////////////////////////////////////// +// CAICHSyncTask + +CAICHSyncTask::CAICHSyncTask() + : CThreadTask(wxT("AICH Syncronizing"), wxEmptyString, ETP_Low) +{ +} + + +void CAICHSyncTask::Entry() +{ + ConvertToKnown2ToKnown264(); + + AddDebugLogLineM( false, logAICHThread, wxT("Syncronization thread started.") ); + + // We collect all masterhashs which we find in the known2.met and store them in a list + std::list hashlist; + const CPath fullpath = CPath(theApp->ConfigDir + KNOWN2_MET_FILENAME); + + CFile file; + if (!file.Open(fullpath, (fullpath.FileExists() ? CFile::read_write : CFile::write))) { + AddDebugLogLineM( true, logAICHThread, wxT("Error, failed to open 'known2_64.met' file!") ); + return; + } + + uint32 nLastVerifiedPos = 0; + try { + if (file.Eof()) { + file.WriteUInt8(KNOWN2_MET_VERSION); + } else { + if (file.ReadUInt8() != KNOWN2_MET_VERSION) { + throw CEOFException(wxT("Invalid met-file header found, removing file.")); + } + + uint64 nExistingSize = file.GetLength(); + while (file.GetPosition() < nExistingSize) { + // Read the next hash + hashlist.push_back(CAICHHash(&file)); + + uint32 nHashCount = file.ReadUInt32(); + if (file.GetPosition() + nHashCount * CAICHHash::GetHashSize() > nExistingSize){ + throw CEOFException(wxT("Hashlist ends past end of file.")); + } + + // skip the rest of this hashset + nLastVerifiedPos = file.Seek(nHashCount * HASHSIZE, wxFromCurrent); + } + } + } catch (const CEOFException&) { + AddDebugLogLineM(true, logAICHThread, wxT("Hashlist corrupted, truncating file.")); + file.SetLength(nLastVerifiedPos); + } catch (const CIOFailureException& e) { + AddDebugLogLineM(true, logAICHThread, wxT("IO failure while reading hashlist (Aborting): ") + e.what()); + + return; + } + + AddDebugLogLineM( false, logAICHThread, wxT("Masterhashes of known files have been loaded.") ); + + // Now we check that all files which are in the sharedfilelist have a + // corresponding hash in our list. Those how don't are queued for hashing. + theApp->sharedfiles->CheckAICHHashes(hashlist); +} + + +bool CAICHSyncTask::ConvertToKnown2ToKnown264() +{ + // converting known2.met to known2_64.met to support large files + // changing hashcount from uint16 to uint32 + + const CPath oldfullpath = CPath(theApp->ConfigDir + OLD_KNOWN2_MET_FILENAME); + const CPath newfullpath = CPath(theApp->ConfigDir + KNOWN2_MET_FILENAME); + + if (newfullpath.FileExists() || !oldfullpath.FileExists()) { + // In this case, there is nothing that we need to do. + return false; + } + + CFile oldfile; + CFile newfile; + + if (!oldfile.Open(oldfullpath, CFile::read)) { + AddDebugLogLineM(true, logAICHThread, wxT("Failed to open 'known2.met' file.")); + + // else -> known2.met also doesn't exists, so nothing to convert + return false; + } + + + if (!newfile.Open(newfullpath, CFile::write_excl)) { + AddDebugLogLineM(true, logAICHThread, wxT("Failed to create 'known2_64.met' file.")); + + return false; + } + + AddLogLineM(false, CFormat(_("Converting old AICH hashsets in '%s' to 64b in '%s'.")) + % OLD_KNOWN2_MET_FILENAME % KNOWN2_MET_FILENAME); + + try { + newfile.WriteUInt8(KNOWN2_MET_VERSION); + + while (newfile.GetPosition() < oldfile.GetLength()) { + CAICHHash aichHash(&oldfile); + uint32 nHashCount = oldfile.ReadUInt16(); + + CScopedArray buffer(new byte[nHashCount * CAICHHash::GetHashSize()]); + + oldfile.Read(buffer.get(), nHashCount * CAICHHash::GetHashSize()); + newfile.Write(aichHash.GetRawHash(), CAICHHash::GetHashSize()); + newfile.WriteUInt32(nHashCount); + newfile.Write(buffer.get(), nHashCount * CAICHHash::GetHashSize()); + } + newfile.Flush(); + } catch (const CEOFException& e) { + AddDebugLogLineM(true, logAICHThread, wxT("Error reading old 'known2.met' file.") + e.what()); + return false; + } catch (const CIOFailureException& e) { + AddDebugLogLineM(true, logAICHThread, wxT("IO error while converting 'known2.met' file: ") + e.what()); + return false; + } + + // FIXME LARGE FILES (uncomment) + //DeleteFile(oldfullpath); + + return true; +} + + + +//////////////////////////////////////////////////////////// +// CCompletionTask + + +CCompletionTask::CCompletionTask(const CPartFile* file) + // GetPrintable is used to improve the readability of the log. + : CThreadTask(wxT("Completing"), file->GetFullName().GetPrintable(), ETP_High), + m_filename(file->GetFileName()), + m_metPath(file->GetFullName()), + m_category(file->GetCategory()), + m_owner(file), + m_error(false) +{ + wxASSERT(m_filename.IsOk()); + wxASSERT(m_metPath.IsOk()); + wxASSERT(m_owner); +} + + +void CCompletionTask::Entry() +{ + CPath targetPath; + + { +#ifndef AMULE_DAEMON + // Prevent the preference values from changing underneeth us. + wxMutexGuiLocker guiLock; +#else + //#warning Thread-safety needed +#endif + + targetPath = theApp->glob_prefs->GetCategory(m_category)->path; + if (!targetPath.DirExists()) { + targetPath = thePrefs::GetIncomingDir(); + } + } + + // Check if the target directory is on a Fat32 FS, since that needs extra cleanups. + bool isFat32 = (CheckFileSystem(targetPath) == FS_IsFAT32); + CPath dstName = m_filename.Cleanup(true, isFat32); + + // Avoid empty filenames ... + if (!dstName.IsOk()) { + dstName = CPath(wxT("Unknown")); + } + + if (m_filename != dstName) { + AddLogLineM(true, logPartFile, CFormat(_("WARNING: The filename '%s' is invalid and has been renamed to '%s'.")) + % m_filename % dstName); + } + + // Avoid saving to an already existing filename + CPath newName = targetPath.JoinPaths(dstName); + for (unsigned count = 0; newName.FileExists(); ++count) { + wxString postfix = wxString::Format(wxT("(%u)"), count); + + newName = targetPath.JoinPaths(dstName.AddPostfix(postfix)); + } + + if (newName != targetPath.JoinPaths(dstName)) { + AddLogLineM(true, logPartFile, CFormat(_("WARNING: The file '%s' already exists, new file renamed to '%s'.")) + % dstName % newName.GetFullName()); + } + + // Move will handle dirs on the same partition, otherwise copy is needed. + CPath partfilename = m_metPath.RemoveExt(); + if (!CPath::RenameFile(partfilename, newName)) { + if (!CPath::CloneFile(partfilename, newName, true)) { + m_error = true; + return; + } + + if (!CPath::RemoveFile(partfilename)) { + AddLogLineM(true, logPartFile, CFormat(_("WARNING: Could not remove original '%s' after creating backup")) + % partfilename); + } + } + + // Removes the various other data-files + const wxChar* otherMetExt[] = { wxT(""), PARTMET_BAK_EXT, wxT(".seeds"), NULL }; + for (size_t i = 0; otherMetExt[i]; ++i) { + CPath toRemove = m_metPath.AppendExt(otherMetExt[i]); + + if (toRemove.FileExists()) { + if (!CPath::RemoveFile(toRemove)) { + AddLogLineM(true, logPartFile, CFormat(_("WARNING: Failed to delete %s")) % toRemove); + } + } + } + + m_newName = newName; +} + + +void CCompletionTask::OnExit() +{ + // Notify the app that the completion has finished for this file. + CCompletionEvent evt(m_error, m_owner, m_newName); + + wxPostEvent(wxTheApp, evt); +} + + + + +//////////////////////////////////////////////////////////// +// CHashingEvent + +DEFINE_LOCAL_EVENT_TYPE(MULE_EVT_HASHING) +DEFINE_LOCAL_EVENT_TYPE(MULE_EVT_AICH_HASHING) + +CHashingEvent::CHashingEvent(wxEventType type, CKnownFile* result, const CKnownFile* owner) + : wxEvent(-1, type), + m_owner(owner), + m_result(result) +{ +} + + +wxEvent* CHashingEvent::Clone() const +{ + return new CHashingEvent(GetEventType(), m_result, m_owner); +} + + +const CKnownFile* CHashingEvent::GetOwner() const +{ + return m_owner; +} + + +CKnownFile* CHashingEvent::GetResult() const +{ + return m_result; +} + + + + +//////////////////////////////////////////////////////////// +// CCompletionEvent + +DEFINE_LOCAL_EVENT_TYPE(MULE_EVT_FILE_COMPLETED) + + +CCompletionEvent::CCompletionEvent(bool errorOccured, const CPartFile* owner, const CPath& fullPath) + : wxEvent(-1, MULE_EVT_FILE_COMPLETED), + m_fullPath(fullPath), + m_owner(owner), + m_error(errorOccured) +{ +} + + +wxEvent* CCompletionEvent::Clone() const +{ + return new CCompletionEvent(m_error, m_owner, m_fullPath); +} + + +bool CCompletionEvent::ErrorOccured() const +{ + return m_error; +} + + +const CPartFile* CCompletionEvent::GetOwner() const +{ + return m_owner; +} + + +const CPath& CCompletionEvent::GetFullPath() const +{ + return m_fullPath; +} + +// File_checked_for_headers diff --git a/src/ThreadTasks.h b/src/ThreadTasks.h new file mode 100644 index 00000000..71e988ff --- /dev/null +++ b/src/ThreadTasks.h @@ -0,0 +1,262 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2006-2008 Mikkel Schubert ( xaignar@amule.org / http:://www.amule.org ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef TASKS_H +#define TASKS_H + +#include "ThreadScheduler.h" +#include + +class CKnownFile; +class CPartFile; +class CFile; + + +/** + * This task performs MD4 and/or AICH hashings of a file, + * depending on the type. For new shared files (using the + * first constructor, with part == NULL), both MD4 and + * AICH hashes are created. For incomplete partfiles + * (rehashed due to changed timestamps), only MD4 hashing + * is done. For complete partfiles, both MD4 and AICH + * hashing is done. + * + * For existing shared files (using the second constructor), + * only an AICH hash is created. + * + * @see CHashingEvent + * @see CAICHSyncTask + */ +class CHashingTask : public CThreadTask +{ +public: + /** + * Schedules a partfile or new shared file for hashing. + * + * @param path The full path, without filename. + * @param filename The actual filename. + * @param part Used to identify the owner in the event-handler (PartFiles only). + * + * CHashingEvents sent by this type of tasks have the id MULE_EVT_HASHING. + * @see EVT_MULE_HASHING + */ + CHashingTask(const CPath& path, const CPath& filename, const CPartFile* part = NULL); + + /** + * Schedules a KnownFile to have a AICH hashset created, used by CAICHSyncTask. + * + * CHashingEvents sent by this type of tasks have the id MULE_EVT_AICH_HASHING. + * @see EVT_MULE_AICH_HASHING + **/ + CHashingTask(const CKnownFile* toAICHHash); + +protected: + //! Specifies which hashes should be calculated when the task is executed. + enum EHashes { + EH_AICH = 1, + EH_MD4 = 2 + }; + + //! @see CThreadTask::OnLastTask + virtual void OnLastTask(); + + //! @see CThreadTask::Entry + virtual void Entry(); + + /** + * Helper function for hashing the next PARTSIZE chunk of a file. + * + * @param file The file to read from. + * @param owner The known- (or part) file representing that file. + * @bool createAICH Specifies if AICH hash-sets should be created as well. + * @return Returns false on read-errors, true otherwise. + * + * This function will create a MD4 hash and, if specified, a AICH hashset for + * the next part of the file. This function makes the assumption that it wont + * be called for closed or EOF files. + */ + bool CreateNextPartHash(CFile* file, CKnownFile* owner, EHashes toHash); + + + //! The path to the file to be hashed (shared or part), without filename. + CPath m_path; + //! The filename of the file to be hashed (filename only). + CPath m_filename; + //! Specifies which hash-types should be calculated + EHashes m_toHash; + //! If a partfile or an AICH hashing, this pointer stores it for callbacks. + const CKnownFile* m_owner; +}; + + +/** + * This task synchronizes the AICH hashlist. + * + * Shared files that are lacking a AICH-hash are scheduled for hashing. + */ +class CAICHSyncTask : public CThreadTask +{ +public: + CAICHSyncTask(); + +protected: + /** See CThreadTask::Entry */ + virtual void Entry(); + + /** Converts old known2.met files to known2_64.met files. */ + bool ConvertToKnown2ToKnown264(); +}; + + +/** + * This task performs the final tasks on a complete download. + * + * This includes finding a usable destination filename, removing + * old data files and moving the part-file (potentially to a + * different partition). + **/ +class CCompletionTask : public CThreadTask +{ +public: + /** + * Creates a thread which will complete the given download. + */ + CCompletionTask(const CPartFile* file); + +protected: + /** See CThreadTask::Entry */ + virtual void Entry(); + + /** See CThreadTask::OnExit */ + virtual void OnExit(); + + //! The target filename. + CPath m_filename; + //! The full path to the .met-file + CPath m_metPath; + //! The category of the download. + uint8 m_category; + //! Owner of the file, used when sending completion-event. + const CPartFile* m_owner; + //! Specifies if an error occured during completion. + bool m_error; + //! The resulting full path. File may be be renamed. + CPath m_newName; +}; + + + +/** + * This event is used to signal the completion of a hashing event. + * + * @see CHashingTask + */ +class CHashingEvent : public wxEvent +{ +public: + /** + * @param type MULE_EVT_HASHING or MULE_EVT_AICH_HASHING. + * @param result + */ + CHashingEvent(wxEventType type, CKnownFile* result, const CKnownFile* owner = NULL); + + /** @see wxEvent::Clone */ + virtual wxEvent* Clone() const; + + /** Returns the owner (may be NULL) of the hashing result. */ + const CKnownFile* GetOwner() const; + /** Returns a CKnownfile used to store the results of the hashing. */ + CKnownFile* GetResult() const; + +private: + //! The file owner. + const CKnownFile* m_owner; + //! The hashing results. + CKnownFile* m_result; +}; + + +/** + * This event is sent when a part-file has been completed. + */ +class CCompletionEvent : public wxEvent +{ +public: + /** Constructor, see getter funtion for description of parameters. */ + CCompletionEvent(bool errorOccured, const CPartFile* owner, const CPath& fullPath); + + /** @see wxEvent::Clone */ + virtual wxEvent* Clone() const; + + /** Returns true if completion failed. */ + bool ErrorOccured() const; + + /** Returns the owner of the file that was being completed. */ + const CPartFile* GetOwner() const; + + /** Returns the full path to the completed file (empty on failure). */ + const CPath& GetFullPath() const; +private: + //! The full path to the completed file. + CPath m_fullPath; + + //! The owner of the completed .part file. + const CPartFile* m_owner; + + //! Specifies if completion failed. + bool m_error; +}; + + +DECLARE_LOCAL_EVENT_TYPE(MULE_EVT_HASHING, -1) +DECLARE_LOCAL_EVENT_TYPE(MULE_EVT_AICH_HASHING, -1) +DECLARE_LOCAL_EVENT_TYPE(MULE_EVT_FILE_COMPLETED, -1) + + +typedef void (wxEvtHandler::*MuleHashingEventFunction)(CHashingEvent&); +typedef void (wxEvtHandler::*MuleCompletionEventFunction)(CCompletionEvent&); + +//! Event-handler for completed hashings of new shared files and partfiles. +#define EVT_MULE_HASHING(func) \ + DECLARE_EVENT_TABLE_ENTRY(MULE_EVT_HASHING, -1, -1, \ + (wxObjectEventFunction) (wxEventFunction) \ + wxStaticCastEvent(MuleHashingEventFunction, &func), (wxObject*) NULL), + +//! Event-handler for completed hashings of files that were missing a AICH hash. +#define EVT_MULE_AICH_HASHING(func) \ + DECLARE_EVENT_TABLE_ENTRY(MULE_EVT_AICH_HASHING, -1, -1, \ + (wxObjectEventFunction) (wxEventFunction) \ + wxStaticCastEvent(MuleHashingEventFunction, &func), (wxObject*) NULL), + +//! Event-handler for completion of part-files. +#define EVT_MULE_FILE_COMPLETED(func) \ + DECLARE_EVENT_TABLE_ENTRY(MULE_EVT_FILE_COMPLETED, -1, -1, \ + (wxObjectEventFunction) (wxEventFunction) \ + wxStaticCastEvent(MuleCompletionEventFunction, &func), (wxObject*) NULL), + + +#endif // TASKS_H +// File_checked_for_headers diff --git a/src/ThrottledSocket.h b/src/ThrottledSocket.h new file mode 100644 index 00000000..88ed7c40 --- /dev/null +++ b/src/ThrottledSocket.h @@ -0,0 +1,55 @@ +// +// This file is part of the aMule Project. +// +// Copyright (C) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef THROTTLEDSOCKET_H +#define THROTTLEDSOCKET_H + + +struct SocketSentBytes +{ + bool success; + uint32 sentBytesStandardPackets; + uint32 sentBytesControlPackets; +}; + + +class ThrottledControlSocket +{ +public: + virtual ~ThrottledControlSocket() {} + virtual SocketSentBytes SendControlData(uint32 maxNumberOfBytesToSend, uint32 minFragSize) = 0; +}; + + +class ThrottledFileSocket : public ThrottledControlSocket +{ +public: + virtual SocketSentBytes SendFileAndControlData(uint32 maxNumberOfBytesToSend, uint32 minFragSize) = 0; + virtual uint32 GetLastCalledSend() = 0; + virtual uint32 GetNeededBytes() = 0; +}; + +#endif +// File_checked_for_headers diff --git a/src/Timer.cpp b/src/Timer.cpp new file mode 100644 index 00000000..bc117821 --- /dev/null +++ b/src/Timer.cpp @@ -0,0 +1,161 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "Timer.h" // Interface declaration +#include "GetTickCount.h" // Needed for GetTickCountFullRes +#include "MuleThread.h" // Needed for CMuleThread + + +//////////////////////// Timer Thread //////////////////// + +class CTimerThread : public CMuleThread +{ +public: + CTimerThread() + : CMuleThread(wxTHREAD_JOINABLE) + { + } + + void* Entry() { + CTimerEvent evt(m_id); + + uint64 lastEvent = GetTickCountFullRes(); + do { + uint64 now = GetTickCountFullRes(); + uint64 sinceLast = now - lastEvent; + if (sinceLast > 100 * m_period) { + // We're way too far behind. Probably what really happened is + // the system time was adjusted backwards a bit, or (less + // likely) the time wrapped past the limit of a uint64. So, + // the calculation of sinceLast has produced an absurd value. + sinceLast = 100 * m_period; + lastEvent = now - sinceLast; + } + + unsigned long timeout = ((m_period < sinceLast) ? 0 : (m_period - sinceLast)); + + // In normal operation, we will never actually acquire the + // semaphore; we will always timeout. This is used to + // implement a Sleep operation which the owning CTimer can + // interrupt by posting to the semaphore. So, it follows + // that if we do acquire the semaphore it means the owner + // wants us to exit. + if (m_sleepSemaphore.WaitTimeout(timeout) == wxSEMA_TIMEOUT) { + // Increment for one event only, so no events can be lost. + lastEvent += m_period; + + wxPostEvent(m_owner, evt); + } else { + break; + } + } while (!m_oneShot); + + return NULL; + } + + unsigned long m_period; + bool m_oneShot; + wxEvtHandler* m_owner; + int m_id; + wxSemaphore m_sleepSemaphore; +}; + + +////////////////////// CTimer //////////////////////// + +CTimer::~CTimer() +{ + Stop(); +} + + +CTimer::CTimer(wxEvtHandler* owner, int id) +{ + wxASSERT(owner); + m_owner = owner; + m_id = id; + m_thread = NULL; +} + + +bool CTimer::IsRunning() const +{ + return (m_thread && m_thread->IsRunning()); +} + + +bool CTimer::Start(int millisecs, bool oneShot) +{ + wxCHECK_MSG(m_id != -1, false, wxT("Invalid target-ID for timer-events.")); + + // Since this class generally matches wxTimer, calling + // start on a running timer stops and then restarts it. + Stop(); + + m_thread = new CTimerThread(); + m_thread->m_period = millisecs; + m_thread->m_oneShot = oneShot; + m_thread->m_owner = m_owner; + m_thread->m_id = m_id; + + if (m_thread->Create() == wxTHREAD_NO_ERROR) { + if (m_thread->Run() == wxTHREAD_NO_ERROR) { + return true; + } + } + + // Something went wrong ... + m_thread->Stop(); + delete m_thread; + m_thread = NULL; + + return false; +} + + +void CTimer::Stop() +{ + if (m_thread) { + m_thread->m_sleepSemaphore.Post(); + m_thread->Stop(); + delete m_thread; + m_thread = NULL; + } +} + + +DEFINE_LOCAL_EVENT_TYPE(MULE_EVT_TIMER) + +CTimerEvent::CTimerEvent(int id) + : wxEvent(id, MULE_EVT_TIMER) +{ +} + + +wxEvent* CTimerEvent::Clone() const +{ + return new CTimerEvent(GetId()); +} + +// File_checked_for_headers diff --git a/src/Timer.h b/src/Timer.h new file mode 100644 index 00000000..aba08221 --- /dev/null +++ b/src/Timer.h @@ -0,0 +1,93 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef TIMER_H +#define TIMER_H + +class wxEvtHandler; +class CTimerThread; + +#include + + +/** + * Replacement for wxTimer as it doesn't work on non-X builds + */ +class CTimer +{ +public: + CTimer(wxEvtHandler *owner, int timerid = -1); + ~CTimer(); + + /** + * Starts the timer. + * + * @param millisecs The frequency of events. + * @param oneShot Specifies if only one event should be produced. + */ + bool Start(int millisecs, bool oneShot = false); + + /** + * Returns true if the timer is running. + */ + bool IsRunning() const; + + /** + * Stops the timer. + * + * Note that this does not delete the actual thread + * immediatly, but no new events will be queued after + * calling this function. + */ + void Stop(); + +private: + CTimerThread* m_thread; + wxEvtHandler* m_owner; + int m_id; +}; + + + +class CTimerEvent : public wxEvent +{ +public: + CTimerEvent(int id = 0); + + virtual wxEvent* Clone() const; +}; + + +DECLARE_LOCAL_EVENT_TYPE(MULE_EVT_TIMER, -1) + + +typedef void (wxEvtHandler::*MuleTimerEventFunction)(CTimerEvent&); + +#define EVT_MULE_TIMER(id, func) \ + DECLARE_EVENT_TABLE_ENTRY(MULE_EVT_TIMER, id, -1, \ + (wxObjectEventFunction) (wxEventFunction) \ + wxStaticCastEvent(MuleTimerEventFunction, &func), (wxObject*) NULL), + +#endif /* TIMER_H */ +// File_checked_for_headers diff --git a/src/TransferWnd.cpp b/src/TransferWnd.cpp new file mode 100644 index 00000000..4d2127ff --- /dev/null +++ b/src/TransferWnd.cpp @@ -0,0 +1,532 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "TransferWnd.h" // Interface declarations + +#include + +#include + + +// This include must be before amuleDlg.h +#ifdef __WXMSW__ + #include // Needed for windows compilation +#endif + + +#include "amuleDlg.h" // Needed for CamuleDlg +#include "PartFile.h" // Needed for PR_LOW +#include "DownloadQueue.h" // Needed for CDownloadQueue +#include "CatDialog.h" // Needed for CCatDialog +#include "DownloadListCtrl.h" // Needed for CDownloadListCtrl +#include "ClientListCtrl.h" // Needed for CClientListCtrl +#include "amule.h" // Needed for theApp +#include "muuli_wdr.h" // Needed for ID_CATEGORIES +#include "SearchDlg.h" // Needed for CSearchDlg->UpdateCatChoice() +#include "MuleNotebook.h" +#include "Preferences.h" +#include "Statistics.h" // Needed for theStats +#include "SharedFileList.h" // Needed for CSharedFileList +#include "GuiEvents.h" // Needed for CoreNotify_* + + +BEGIN_EVENT_TABLE(CTransferWnd, wxPanel) + EVT_RIGHT_DOWN(CTransferWnd::OnNMRclickDLtab) + EVT_NOTEBOOK_PAGE_CHANGED(ID_CATEGORIES, CTransferWnd::OnCategoryChanged) + + EVT_SPLITTER_SASH_POS_CHANGING(ID_SPLATTER, CTransferWnd::OnSashPositionChanging) + + EVT_BUTTON(ID_BTNCLRCOMPL, CTransferWnd::OnBtnClearDownloads) + EVT_BUTTON(ID_BTNSWITCHUP, CTransferWnd::SwitchUploadList) + EVT_BUTTON(ID_CLIENTTOGGLE, CTransferWnd::OnToggleClientList) + + EVT_MENU_RANGE(MP_CAT_SET0, MP_CAT_SET0 + 15, CTransferWnd::OnSetDefaultCat) + EVT_MENU(MP_CAT_ADD, CTransferWnd::OnAddCategory) + EVT_MENU(MP_CAT_EDIT, CTransferWnd::OnEditCategory) + EVT_MENU(MP_CAT_REMOVE, CTransferWnd::OnDelCategory) + EVT_MENU(MP_PRIOLOW, CTransferWnd::OnSetCatPriority) + EVT_MENU(MP_PRIONORMAL, CTransferWnd::OnSetCatPriority) + EVT_MENU(MP_PRIOHIGH, CTransferWnd::OnSetCatPriority) + EVT_MENU(MP_PRIOAUTO, CTransferWnd::OnSetCatPriority) + EVT_MENU(MP_PAUSE, CTransferWnd::OnSetCatStatus) + EVT_MENU(MP_STOP, CTransferWnd::OnSetCatStatus) + EVT_MENU(MP_CANCEL, CTransferWnd::OnSetCatStatus) + EVT_MENU(MP_RESUME, CTransferWnd::OnSetCatStatus) +END_EVENT_TABLE() + + + +CTransferWnd::CTransferWnd( wxWindow* pParent ) + : wxPanel( pParent, -1 ) +{ + wxSizer* content = transferDlg(this, true); + content->Show(this, true); + + downloadlistctrl = CastChild( wxT("downloadList"), CDownloadListCtrl ); + clientlistctrl = CastChild( ID_CLIENTLIST, CClientListCtrl ); + m_dlTab = CastChild( ID_CATEGORIES, CMuleNotebook ); + + CMuleNotebook* nb = CastChild( ID_CATEGORIES, CMuleNotebook ); + // We want to use our own popup + nb->SetPopupHandler( this ); + + // Set default category + theApp->glob_prefs->GetCategory(0)->title = GetCatTitle(thePrefs::GetAllcatType()); + theApp->glob_prefs->GetCategory(0)->path = thePrefs::GetIncomingDir(); + + // Show default + userdefined categories + for ( uint32 i = 0; i < theApp->glob_prefs->GetCatCount(); i++ ) { + m_dlTab->AddPage( new wxPanel(m_dlTab), theApp->glob_prefs->GetCategory(i)->title ); + } + + m_menu = NULL; + m_splitter = 0; + + + wxConfigBase *config = wxConfigBase::Get(); + + // Check if the clientlist is hidden + bool show = true; + config->Read( wxT("/GUI/TransferWnd/ShowClientList"), &show, true ); + + if ( !show ) { + // Disable the client-list + wxCommandEvent event; + OnToggleClientList( event ); + } + + // Load the last used splitter position + m_splitter = config->Read( wxT("/GUI/TransferWnd/Splitter"), 463l ); +} + + +CTransferWnd::~CTransferWnd() +{ + wxConfigBase *config = wxConfigBase::Get(); + + if ( clientlistctrl->GetListView() == vtNone ) { + // Save the splitter position + config->Write( wxT("/GUI/TransferWnd/Splitter"), m_splitter ); + + // Save the visible status of the list + config->Write( wxT("/GUI/TransferWnd/ShowClientList"), false ); + } else { + wxSplitterWindow* splitter = CastChild( wxT("splitterWnd"), wxSplitterWindow ); + + // Save the splitter position + config->Write( wxT("/GUI/TransferWnd/Splitter"), splitter->GetSashPosition() ); + + // Save the visible status of the list + config->Write( wxT("/GUI/TransferWnd/ShowClientList"), true ); + } +} + + +void CTransferWnd::AddCategory( Category_Struct* category ) +{ + // Add the initial page + m_dlTab->AddPage( new wxPanel(m_dlTab), category->title ); + + // Update the title + UpdateCategory( m_dlTab->GetPageCount() - 1 ); + + theApp->amuledlg->m_searchwnd->UpdateCatChoice(); +} + +void CTransferWnd::UpdateCategory( int index, bool titleChanged ) +{ + wxString label = theApp->glob_prefs->GetCategory( index )->title; + + if ( thePrefs::ShowCatTabInfos() ) { + uint16 files = 0; + uint16 download = 0; + + for ( unsigned int i = 0; i < theApp->downloadqueue->GetFileCount(); ++i ) { + CPartFile *cur_file = theApp->downloadqueue->GetFileByIndex(i); + + if ( cur_file && cur_file->CheckShowItemInGivenCat(index) ) { + files++; + + if ( cur_file->GetTransferingSrcCount() ) { + download++; + } + } + } + + label += wxString::Format(wxT(" (%u/%u)"), download, files ); + } + + m_dlTab->SetPageText( index, label ); + + + if ( titleChanged ) { + theApp->amuledlg->m_searchwnd->UpdateCatChoice(); + } + +} + + +void CTransferWnd::OnSetCatStatus( wxCommandEvent& event ) +{ + if ( event.GetId() == MP_CANCEL ) { + if ( wxMessageBox(_("Are you sure you wish to cancel and delete all files in this category?"),_("Confirmation Required"), wxYES_NO|wxCENTRE|wxICON_EXCLAMATION, this) == wxNO) { + return; + } + } + + CoreNotify_Download_Set_Cat_Status( m_dlTab->GetSelection(), event.GetId() ); +} + + +void CTransferWnd::OnSetCatPriority( wxCommandEvent& event ) +{ + int priority = 0; + + switch ( event.GetId() ) { + case MP_PRIOLOW: priority = PR_LOW; break; + case MP_PRIONORMAL: priority = PR_NORMAL; break; + case MP_PRIOHIGH: priority = PR_HIGH; break; + case MP_PRIOAUTO: priority = PR_AUTO; break; + default: + return; + } + + CoreNotify_Download_Set_Cat_Prio( m_dlTab->GetSelection(), priority ); +} + + +void CTransferWnd::OnAddCategory(wxCommandEvent& WXUNUSED(event)) +{ + CCatDialog dialog( this, + // Allow browse? +#ifdef CLIENT_GUI + false +#else + true +#endif + ); + if (dialog.ShowModal() == wxOK) { + // Add the files on this folder. + Category_Struct* newcat = + theApp->glob_prefs->GetCategory( + theApp->glob_prefs->GetCatCount()-1); + theApp->sharedfiles->AddFilesFromDirectory(newcat->path); + theApp->sharedfiles->Reload(); + } +} + + +void CTransferWnd::OnDelCategory(wxCommandEvent& WXUNUSED(event)) +{ + RemoveCategory(m_dlTab->GetSelection()); +} + + +void CTransferWnd::RemoveCategory(int index) +{ + if ( index > 0 ) { + theApp->downloadqueue->ResetCatParts(index); + theApp->glob_prefs->RemoveCat(index); + RemoveCategoryPage(index); + if ( theApp->glob_prefs->GetCatCount() == 1 ) { + thePrefs::SetAllcatType(0); + } + theApp->glob_prefs->SaveCats(); + theApp->amuledlg->m_searchwnd->UpdateCatChoice(); + } +} + + +void CTransferWnd::RemoveCategoryPage(int index) +{ + m_dlTab->RemovePage(index); + m_dlTab->SetSelection(0); + downloadlistctrl->ChangeCategory(0); +} + + +void CTransferWnd::OnEditCategory( wxCommandEvent& WXUNUSED(event) ) +{ + Category_Struct* cat = theApp->glob_prefs->GetCategory(m_dlTab->GetSelection()); + CPath oldpath = cat->path; + CCatDialog dialog( this, + // Allow browse? +#ifdef CLIENT_GUI + false +#else + true +#endif + , m_dlTab->GetSelection()); + + if (dialog.ShowModal() == wxOK) { + if (!oldpath.IsSameDir(cat->path)) { + theApp->sharedfiles->AddFilesFromDirectory(cat->path); + theApp->sharedfiles->Reload(); + } + } +} + + +void CTransferWnd::OnSetDefaultCat( wxCommandEvent& event ) +{ + thePrefs::SetAllcatType( event.GetId() - MP_CAT_SET0 ); + theApp->glob_prefs->GetCategory(0)->title = GetCatTitle( thePrefs::GetAllcatType() ); + + UpdateCategory( 0 ); + + downloadlistctrl->ChangeCategory( 0 ); + + theApp->glob_prefs->SaveCats(); + + downloadlistctrl->SortList(); +} + + +void CTransferWnd::ShowQueueCount(uint32 number) +{ + wxString str = wxString::Format( wxT("%u (%u %s)"), number, theStats::GetBannedCount(), _("Banned") ); + wxStaticText* label = CastChild( ID_CLIENTCOUNT, wxStaticText ); + + label->SetLabel( str ); + label->GetParent()->Layout(); +} + + +void CTransferWnd::OnCategoryChanged(wxNotebookEvent& evt) +{ + downloadlistctrl->ChangeCategory(evt.GetSelection()); + downloadlistctrl->SortList(); +} + + +void CTransferWnd::OnNMRclickDLtab(wxMouseEvent& evt) +{ + // Only handle events from the category-notebook + if ( evt.GetEventObject() != (wxObject*)m_dlTab ) + return; + + if ( m_dlTab->GetSelection() == -1 ) { + return; + } + + // Avoid opening another menu when it's already open + if ( m_menu == NULL ) { + m_menu = new wxMenu( _("Category") ); + + if ( m_dlTab->GetSelection() == 0 ) { + wxMenu* catmenu = new wxMenu(); + + catmenu->Append( MP_CAT_SET0, _("All") ); + catmenu->Append( MP_CAT_SET0 + 1, _("All others") ); + + catmenu->AppendSeparator(); + + catmenu->Append( MP_CAT_SET0 + 2, _("Incomplete") ); + catmenu->Append( MP_CAT_SET0 + 3, _("Completed") ); + catmenu->Append( MP_CAT_SET0 + 4, _("Waiting") ); + catmenu->Append( MP_CAT_SET0 + 5, _("Downloading") ); + catmenu->Append( MP_CAT_SET0 + 6, _("Erroneous") ); + catmenu->Append( MP_CAT_SET0 + 7, _("Paused") ); + catmenu->Append( MP_CAT_SET0 + 8, _("Stopped") ); + catmenu->Append( MP_CAT_SET0 + 15, _("Active") ); + + catmenu->AppendSeparator(); + + catmenu->Append( MP_CAT_SET0 + 9, _("Video") ); + catmenu->Append( MP_CAT_SET0 + 10, _("Audio") ); + catmenu->Append( MP_CAT_SET0 + 11, _("Archive") ); + catmenu->Append( MP_CAT_SET0 + 12, _("CD-Images") ); + catmenu->Append( MP_CAT_SET0 + 13, _("Pictures") ); + catmenu->Append( MP_CAT_SET0 + 14, _("Text") ); + + m_menu->Append(0, _("Select view filter"), catmenu); + } + + m_menu->Append( MP_CAT_ADD, _("Add category") ); + + if ( m_dlTab->GetSelection() ) { + m_menu->Append(MP_CAT_EDIT,_("Edit category")); + m_menu->Append(MP_CAT_REMOVE, _("Remove category")); + } + + m_menu->AppendSeparator(); + + m_menu->Append( MP_CANCEL, _("Cancel")); + m_menu->Append( MP_STOP, _("&Stop")); + m_menu->Append( MP_PAUSE, _("&Pause")); + m_menu->Append( MP_RESUME, _("&Resume")); + + PopupMenu(m_menu, evt.GetPosition()); + + delete m_menu; + m_menu = NULL; + } +} + + +void CTransferWnd::OnBtnClearDownloads( wxCommandEvent& WXUNUSED(evt) ) +{ + downloadlistctrl->Freeze(); + downloadlistctrl->ClearCompleted(); + downloadlistctrl->Thaw(); +} + + +void CTransferWnd::UpdateCatTabTitles() +{ + for ( uint8 i = 0; i < m_dlTab->GetPageCount(); i++ ) { + UpdateCategory( i, false ); + } +} + + +void CTransferWnd::Prepare() +{ + int header_height = s_clientlistHeader->GetSize().GetHeight(); + wxSplitterWindow* splitter = CastChild( wxT("splitterWnd"), wxSplitterWindow ); + + if ( clientlistctrl->GetListView() == vtNone ) { + int height = splitter->GetWindow1()->GetSize().GetHeight(); + height += splitter->GetWindow2()->GetSize().GetHeight(); + + splitter->SetSashPosition( height - header_height ); + } else if ( m_splitter ) { + // Some sainity checking + if ( m_splitter < 90 ) { + m_splitter = 90; + } else { + int height = splitter->GetWindow1()->GetSize().GetHeight(); + height += splitter->GetWindow2()->GetSize().GetHeight(); + + if ( height - header_height * 2 < m_splitter ) { + m_splitter = height - header_height * 2; + } + } + + splitter->SetSashPosition( m_splitter ); + + m_splitter = 0; + } +} + + +void CTransferWnd::SwitchUploadList(wxCommandEvent& WXUNUSED(evt)) +{ + clientlistctrl->ToggleView(); + wxStaticText* label = CastChild( wxT("uploadTitle"), wxStaticText ); + + switch ( clientlistctrl->GetListView() ) { + case vtNone: + return; + + case vtUploading: + label->SetLabel( _("Uploads") ); + break; + + case vtQueued: + label->SetLabel( _("On Queue") ); + break; + + case vtClients: + label->SetLabel( _("Clients") ); + break; + } + + label->GetParent()->Layout(); +} + + +void CTransferWnd::OnToggleClientList(wxCommandEvent& WXUNUSED(evt)) +{ + wxSplitterWindow* splitter = CastChild( wxT("splitterWnd"), wxSplitterWindow ); + wxBitmapButton* button = CastChild( ID_CLIENTTOGGLE, wxBitmapButton ); + + // Keeps track of what was last selected. + static ViewType lastView = vtNone; + + + if ( clientlistctrl->GetListView() == vtNone ) { + splitter->SetSashPosition( m_splitter ); + + clientlistctrl->SetListView( lastView ); + + button->SetBitmapLabel( amuleDlgImages( 10 ) ); + button->SetBitmapFocus( amuleDlgImages( 10 ) ); + button->SetBitmapSelected( amuleDlgImages( 10 ) ); + + m_splitter = 0; + } else { + lastView = clientlistctrl->GetListView(); + clientlistctrl->SetListView( vtNone ); + + int pos = splitter->GetSashPosition(); + + // Add the height of the listctrl to the top-window + int height = clientlistctrl->GetSize().GetHeight(); + height += splitter->GetWindow1()->GetSize().GetHeight(); + + splitter->SetSashPosition( height ); + + m_splitter = pos; + + button->SetBitmapLabel( amuleDlgImages( 11 ) ); + button->SetBitmapFocus( amuleDlgImages( 11 ) ); + button->SetBitmapSelected( amuleDlgImages( 11 ) ); + } + + FindWindow(ID_BTNSWITCHUP)->Enable( clientlistctrl->GetListView() != vtNone ); +} + + +void CTransferWnd::OnSashPositionChanging(wxSplitterEvent& evt) +{ + int header_height = s_clientlistHeader->GetSize().GetHeight(); + + if ( evt.GetSashPosition() < 90 ) { + evt.SetSashPosition( 90 ); + } else { + wxSplitterWindow* splitter = wxStaticCast( evt.GetEventObject(), wxSplitterWindow); + + int height = splitter->GetWindow1()->GetSize().GetHeight(); + height += splitter->GetWindow2()->GetSize().GetHeight(); + + if ( clientlistctrl->GetListView() == vtNone ) { + if ( height - evt.GetSashPosition() < header_height * 2 ) { + evt.Veto(); + } else { + wxCommandEvent event; + OnToggleClientList( event ); + } + } else { + if ( height - evt.GetSashPosition() < header_height * 2 ) { + evt.SetSashPosition( height - header_height ); + + wxCommandEvent event; + OnToggleClientList( event ); + } + } + } +} +// File_checked_for_headers diff --git a/src/TransferWnd.h b/src/TransferWnd.h new file mode 100644 index 00000000..a8661395 --- /dev/null +++ b/src/TransferWnd.h @@ -0,0 +1,205 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef TRANSFERWND_H +#define TRANSFERWND_H + +#include // Needed for wxPanel +#include "Types.h" // Needed for uint32 + + +class Category_Struct; +class CClientListCtrl; +class CDownloadListCtrl; +class CMuleNotebook; +class wxListCtrl; +class wxSplitterEvent; +class wxNotebookEvent; +class wxCommandEvent; +class wxMouseEvent; +class wxEvent; +class wxMenu; + + + +/** + * This class takes care of managing the lists and other controls contained + * in the transfer-window. It's primary function is to manage the user-defined + * categories. + */ +class CTransferWnd : public wxPanel +{ +public: + /** + * Constructor. + */ + CTransferWnd(wxWindow* pParent = NULL); + + /** + * Destructor. + */ + ~CTransferWnd(); + + + /** + * Adds the specified category to the end of the list. + * + * @param category A pointer to the new category. + * + * This function should be called after a category has been + * added to the lists of categories. The new category is assumed + * to be the last, and thus will be appended to the end of the tabs + * on the category-notebook. + */ + void AddCategory( Category_Struct* category ); + + /** + * Updates the title of the specified category. + * + * @param index The index of the category on the notebook. + * @param titleChanged Set to true if the actual title has changed. + * + * The second paramerter will make the UpdateCategory function signal + * to the searchdlg page that the lists of categories has been changed, + * and force it to refresh its list of categories. + * + * This however should only be done when the title has actually changed, + * since it will cause the user-selection to be reset. + */ + void UpdateCategory( int index, bool titleChanged = false ); + + /** + * Remove category + */ + void RemoveCategory(int index); + void RemoveCategoryPage(int index); + + /** + * This functions updates the displayed client-numbers* + * + * @param number The number of clients on the upload queue. + * + * This function updates both the number of clients on the queue, + * as well as the number of banned clients. + */ + void ShowQueueCount(uint32 number); + + /** + * This function switches between showing the upload-queue and the list of + * client who are currently recieving files. + */ + void SwitchUploadList(wxCommandEvent& evt); + + /** + * Helper-function which updates the displayed titles of all existing categories. + */ + void UpdateCatTabTitles(); + + + /** + * Call this function before displaying the dialog. + * + * This functions does a few tasks to ensure that the dialog is looking the right way. + */ + void Prepare(); + + //! Pointer to the download-queue. + CDownloadListCtrl* downloadlistctrl; + //! Pointer to the list of clients. + CClientListCtrl* clientlistctrl; + + //! Contains the current (or last if the clientlist is hidden) position of the splitter. + int m_splitter; + +private: + /** + * Event-handler for the set status by category menu-item. + */ + void OnSetCatStatus( wxCommandEvent& event ); + + /** + * Event-handler for the set priority by category menu-item. + */ + void OnSetCatPriority( wxCommandEvent& event ); + + /** + * Event-handler for the "Add Category" menu-item. + */ + void OnAddCategory( wxCommandEvent& event ); + + /** + * Event-handler for the "Delete Category" menu-item. + */ + void OnDelCategory( wxCommandEvent& event ); + + /** + * Event-handler for the "Edit Category" menu-item. + */ + void OnEditCategory( wxCommandEvent& event ); + + /** + * Event-handler for manipulating the default category. + */ + void OnSetDefaultCat( wxCommandEvent& event ); + + /** + * Event-handler for the "Clear Completed" button. + */ + void OnBtnClearDownloads(wxCommandEvent &evt); + + /** + * Event-handler for changing categories. + */ + void OnCategoryChanged(wxNotebookEvent& evt); + + /** + * Event-handler for displaying the category-popup menu. + */ + void OnNMRclickDLtab(wxMouseEvent& evt); + + /** + * Event-handler for the list-toggle button. + */ + void OnToggleClientList( wxCommandEvent& event ); + + /** + * Event-handler for automatic show/hide of the clientlistctrl. + */ + void OnSashPositionChanging(wxSplitterEvent& evt); + + + //! Variable used to ensure that the category menu doesn't get displayed twice. + wxMenu* m_menu; + + //! Pointer to the category tabs. + CMuleNotebook* m_dlTab; + + + DECLARE_EVENT_TABLE() +}; + +#endif + +// File_checked_for_headers diff --git a/src/Types.h b/src/Types.h new file mode 100644 index 00000000..ced1c837 --- /dev/null +++ b/src/Types.h @@ -0,0 +1,171 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef TYPES_H +#define TYPES_H + +#ifndef USE_STD_STRING +#include // Needed for wxString and wxEmptyString +#endif + +#include // Needed for std::list +#include // Needed for std::vector + +#ifndef _MSC_VER + #ifndef __STDC_FORMAT_MACROS + #define __STDC_FORMAT_MACROS + #endif + #include + #define LONGLONG(x) x##ll + #define ULONGLONG(x) x##llu +#else + typedef unsigned __int8 byte; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + typedef unsigned __int64 uint64_t; + typedef signed __int8 int8_t; + typedef signed __int16 int16_t; + typedef signed __int32 int32_t; + typedef signed __int64 int64_t; + #define LONGLONG(x) x##i64 + #define ULONGLONG(x) x##ui64 +#endif + +// These are _MSC_VER defines used in eMule. They should +// not be used in aMule, instead, use this table to +// find the type to use in order to get the desired +// effect. +////////////////////////////////////////////////// +// Name // Type To Use In Amule // +////////////////////////////////////////////////// +// BOOL // bool // +// WORD // uint16 // +// INT // int32 // +// UINT // uint32 // +// UINT_PTR // uint32* // +// PUINT // uint32* // +// DWORD // uint32 // +// LONG // long // +// ULONG // unsigned long // +// LONGLONG // long long // +// ULONGLONG // unsigned long long // +// LPBYTE // char* // +// VOID // void // +// PVOID // void* // +// LPVOID // void* // +// LPCVOID // const void* // +// CHAR // char // +// LPSTR // char* // +// LPCSTR // const char* // +// TCHAR // char // +// LPTSTR // char* // +// LPCTSTR // const char* // +// WCHAR // wchar_t // +// LPWSTR // wchar_t* // +// LPCWSTR // const wchar_t* // +// WPARAM // uint16 // +// LPARAM // uint32 // +// POINT // wxPoint // +////////////////////////////////////////////////// + +/* + * Backwards compatibility with emule. + * Note that the int* types are indeed unsigned. + */ +typedef uint8_t int8; +typedef uint8_t uint8; +typedef uint16_t int16; +typedef uint16_t uint16; +typedef uint32_t int32; +typedef uint32_t uint32; +typedef uint64_t int64; +typedef uint64_t uint64; +typedef int8_t sint8; +typedef int16_t sint16; +typedef int32_t sint32; +typedef int64_t sint64; +typedef uint8_t byte; + + +class CKnownFile; +class CUpDownClient; + +//! Various common list-types. +//@{ +#ifndef USE_STD_STRING +typedef std::list CStringList; +#endif +typedef std::list CKnownFilePtrList; +typedef std::list CClientPtrList; +//@} + +typedef std::vector ArrayOfUInts16; + +/* This is the Evil Void String For Returning On Const References From Hell */ +// IT MEANS I WANT TO USE IT EVERYWHERE. DO NOT MOVE IT. +// THE FACT SOMETHING IS USED IN JUST ONE PLACE DOESN'T MEAN IT HAS +// TO BE MOVED TO THAT PLACE. I MIGHT NEED IT ELSEWHERE LATER. +// + +#ifndef USE_STD_STRING +static const wxString EmptyString = wxEmptyString; +#endif + +#ifndef __cplusplus + typedef int bool; +#endif + + +#ifdef __WXMSW__ +#ifdef _MSC_VER + #define NOMINMAX + #include // Needed for RECT // Do_not_auto_remove +#endif + #include // Needed for RECT // Do_not_auto_remove + #include // Do_not_auto_remove + #include // Do_not_auto_remove + // Windows compilers don't have these constants + #ifndef W_OK + enum + { + F_OK = 0, // test for existence + X_OK = 1, // execute permission + W_OK = 2, // write + R_OK = 4 // read + }; + #endif // W_OK +#else + typedef struct sRECT { + uint32 left; + uint32 top; + uint32 right; + uint32 bottom; + } RECT; +#endif /* __WXMSW__ */ + + +#endif /* TYPES_H */ +// File_checked_for_headers diff --git a/src/UPnP.cpp b/src/UPnP.cpp new file mode 100644 index 00000000..f7287919 --- /dev/null +++ b/src/UPnP.cpp @@ -0,0 +1,1760 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2006-2008 Marcelo Roberto Jimenez ( phoenix@amule.org ) +// Copyright (c) 2006-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#define UPNP_C + +#include "UPnP.h" + + +#include // For dlopen(), dlsym(), dlclose() +#include // For transform() + + +#ifdef __GNUC__ + #if __GNUC__ >= 4 + #define REINTERPRET_CAST(x) reinterpret_cast + #endif +#endif +#ifndef REINTERPRET_CAST + // Let's hope that function pointers are equal in size to data pointers + #define REINTERPRET_CAST(x) (x) +#endif + + +/** + * Case insensitive std::string comparison + */ +bool stdStringIsEqualCI(const std::string &s1, const std::string &s2) +{ + std::string ns1(s1); + std::string ns2(s2); + transform(ns1.begin(), ns1.end(), ns1.begin(), tolower); + transform(ns2.begin(), ns2.end(), ns2.begin(), tolower); + return ns1 == ns2; +} + + +CUPnPPortMapping::CUPnPPortMapping( + int port, + const std::string &protocol, + bool enabled, + const std::string &description) +: +m_port(), +m_protocol(protocol), +m_enabled(enabled ? "1" : "0"), +m_description(description), +m_key() +{ + std::ostringstream oss; + oss << port; + m_port = oss.str(); + m_key = m_protocol + m_port; +} + + +CDynamicLibHandle::CDynamicLibHandle(const char *libname) +: +m_libname(libname), +m_LibraryHandle(dlopen(libname, RTLD_LAZY)) +{ + std::ostringstream msg; + if (!m_LibraryHandle) { + msg << "error(CDynamicLibHandle): Unable to dlopen " << + m_libname << ". Check PATH and LD_LIBRARY_PATH."; + AddLogLineM(true, logUPnP, msg); +// throw CUPnPException(msg); + } else { + msg << "Successfully opened " << m_libname << "."; + AddLogLineM(false, logUPnP, msg); + } +} + + +CDynamicLibHandle::~CDynamicLibHandle() +{ + if (m_LibraryHandle) { + std::ostringstream msg; + int err_code = dlclose(m_LibraryHandle); + if (err_code) { + msg << "error(CDynamicLibHandle): Error closing " << + m_libname << ": " << dlerror() << + "."; + fprintf(stderr, "%s\n", msg.str().c_str()); + AddLogLineM(true, logUPnP, msg); + } else { + msg << "Successfully closed " << m_libname << "."; + AddLogLineM(false, logUPnP, msg); + } + } +} + + +const std::string &CUPnPLib::UPNP_ROOT_DEVICE = + "upnp:rootdevice"; + +const std::string &CUPnPLib::UPNP_DEVICE_IGW = + "urn:schemas-upnp-org:device:InternetGatewayDevice:1"; +const std::string &CUPnPLib::UPNP_DEVICE_WAN = + "urn:schemas-upnp-org:device:WANDevice:1"; +const std::string &CUPnPLib::UPNP_DEVICE_WAN_CONNECTION = + "urn:schemas-upnp-org:device:WANConnectionDevice:1"; +const std::string &CUPnPLib::UPNP_DEVICE_LAN = + "urn:schemas-upnp-org:device:LANDevice:1"; + +const std::string &CUPnPLib::UPNP_SERVICE_LAYER3_FORWARDING = + "urn:schemas-upnp-org:service:Layer3Forwarding:1"; +const std::string &CUPnPLib::UPNP_SERVICE_WAN_COMMON_INTERFACE_CONFIG = + "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1"; +const std::string &CUPnPLib::UPNP_SERVICE_WAN_IP_CONNECTION = + "urn:schemas-upnp-org:service:WANIPConnection:1"; +const std::string &CUPnPLib::UPNP_SERVICE_WAN_PPP_CONNECTION = + "urn:schemas-upnp-org:service:WANPPPConnection:1"; + + +const char *CUPnPLib::s_LibIXMLSymbols[] = +{ +/* 0*/ "ixmlNode_getFirstChild", +/* 1*/ "ixmlNode_getNextSibling", +/* 2*/ "ixmlNode_getNodeName", +/* 3*/ "ixmlNode_getNodeValue", +/* 4*/ "ixmlNode_getAttributes", +/* 5*/ "ixmlDocument_free", +/* 6*/ "ixmlNamedNodeMap_getNamedItem", +/* 7*/ "ixmlNamedNodeMap_free", +}; + + +const char *CUPnPLib::s_LibUPnPSymbols[] = +{ +/* 0*/ "UpnpInit", +/* 1*/ "UpnpFinish", +/* 2*/ "UpnpGetServerPort", +/* 3*/ "UpnpGetServerIpAddress", +/* 4*/ "UpnpRegisterClient", +/* 5*/ "UpnpUnRegisterClient", +/* 6*/ "UpnpSearchAsync", +/* 7*/ "UpnpGetServiceVarStatus", +/* 8*/ "UpnpSendAction", +/* 9*/ "UpnpSendActionAsync", +/*10*/ "UpnpSubscribe", +/*11*/ "UpnpUnSubscribe", +/*12*/ "UpnpDownloadXmlDoc", +/*13*/ "UpnpResolveURL", +/*14*/ "UpnpMakeAction", +/*15*/ "UpnpAddToAction", +/*16*/ "UpnpGetErrorMessage", +}; + + +#ifdef __DARWIN__ + #include + #include + + // Dynamic libraries have different names in different systems + const char *libIXMLName = "libixml.2.dylib"; + const char *libUPnP2Name = "libupnp.2.dylib"; + const char *libUPNP3Name = "libupnp.3.dylib"; +#else // Linux and other compatible systems + const char *libIXMLName = "libixml.so.2"; + const char *libUPnP2Name = "libupnp.so.2"; + const char *libUPNP3Name = "libupnp.so.3"; +#endif + + +const std::string CUPnPLib::addLibraryPath(const char *name) +{ +#ifdef __DARWIN__ + CFBundleRef bundle = CFBundleGetMainBundle(); + CFURLRef frameworkURL = CFBundleCopyPrivateFrameworksURL(bundle); + CFStringRef libName = CFStringCreateWithCString(NULL, name, kCFStringEncodingUTF8); + CFURLRef libURL = CFURLCreateCopyAppendingPathComponent( + NULL, frameworkURL, libName, false); + char result[MAXPATHLEN]; + CFURLGetFileSystemRepresentation( + libURL, true, (UInt8 *)result, (CFIndex)MAXPATHLEN); + CFRelease(libName); + CFRelease(libURL); + CFRelease(frameworkURL); + + return static_cast(result); +#else // Linux and other compatible systems + return static_cast(name); +#endif +} + + +CUPnPLib::CUPnPLib(CUPnPControlPoint &ctrlPoint) +: +m_ctrlPoint(ctrlPoint), +m_LibIXMLHandle(addLibraryPath(libIXMLName).c_str()), +m_LibUPnPHandle2(addLibraryPath(libUPnP2Name).c_str()), +m_LibUPnPHandle3(addLibraryPath(libUPNP3Name).c_str()), +m_LibUPnPHandle(NULL) +{ + // There are two versions of libUPnP in the market, + // check for the one that we have in the system. + if (m_LibUPnPHandle3.Get()) { + m_LibUPnPHandle = &m_LibUPnPHandle3; + } else if (m_LibUPnPHandle2.Get()) { + m_LibUPnPHandle = &m_LibUPnPHandle2; + } else { + std::ostringstream msg; + msg << "error(CDynamicLibHandle): Unable to dlopen " + "one or more UPnP component libraries. " + "Check PATH and LD_LIBRARY_PATH."; + AddLogLineM(true, logUPnP, msg); + throw CUPnPException(msg); + } + + // IXML + m_ixmlNode_getFirstChild = + REINTERPRET_CAST(IXML_Node *(*)(IXML_Node *)) + (dlsym(m_LibIXMLHandle.Get(), s_LibIXMLSymbols[0])); + m_ixmlNode_getNextSibling = + REINTERPRET_CAST(IXML_Node *(*)(IXML_Node *)) + (dlsym(m_LibIXMLHandle.Get(), s_LibIXMLSymbols[1])); + m_ixmlNode_getNodeName = + REINTERPRET_CAST(const DOMString (*)(IXML_Node *)) + (dlsym(m_LibIXMLHandle.Get(), s_LibIXMLSymbols[2])); + m_ixmlNode_getNodeValue = + REINTERPRET_CAST(const DOMString (*)(IXML_Node *)) + (dlsym(m_LibIXMLHandle.Get(), s_LibIXMLSymbols[3])); + m_ixmlNode_getAttributes = + REINTERPRET_CAST(IXML_NamedNodeMap *(*)(IXML_Node *)) + (dlsym(m_LibIXMLHandle.Get(), s_LibIXMLSymbols[4])); + m_ixmlDocument_free = + REINTERPRET_CAST(void (*)(IXML_Document *)) + (dlsym(m_LibIXMLHandle.Get(), s_LibIXMLSymbols[5])); + m_ixmlNamedNodeMap_getNamedItem = + REINTERPRET_CAST(IXML_Node *(*)(IXML_NamedNodeMap *, const DOMString)) + (dlsym(m_LibIXMLHandle.Get(), s_LibIXMLSymbols[6])); + m_ixmlNamedNodeMap_free = + REINTERPRET_CAST(void (*)(IXML_NamedNodeMap *)) + (dlsym(m_LibIXMLHandle.Get(), s_LibIXMLSymbols[7])); + + // UPnP + m_UpnpInit = + REINTERPRET_CAST(int (*)(const char *, int)) + (dlsym(m_LibUPnPHandle->Get(), s_LibUPnPSymbols[0])); + m_UpnpFinish = + REINTERPRET_CAST(void (*)()) + (dlsym(m_LibUPnPHandle->Get(), s_LibUPnPSymbols[1])); + m_UpnpGetServerPort = + REINTERPRET_CAST(unsigned short (*)()) + (dlsym(m_LibUPnPHandle->Get(), s_LibUPnPSymbols[2])); + m_UpnpGetServerIpAddress = + REINTERPRET_CAST(char * (*)()) + (dlsym(m_LibUPnPHandle->Get(), s_LibUPnPSymbols[3])); + m_UpnpRegisterClient = + REINTERPRET_CAST(int (*)(Upnp_FunPtr, const void *, UpnpClient_Handle *)) + (dlsym(m_LibUPnPHandle->Get(), s_LibUPnPSymbols[4])); + m_UpnpUnRegisterClient = + REINTERPRET_CAST(int (*)(UpnpClient_Handle)) + (dlsym(m_LibUPnPHandle->Get(), s_LibUPnPSymbols[5])); + m_UpnpSearchAsync = + REINTERPRET_CAST(int (*)(UpnpClient_Handle, int, const char *, const void *)) + (dlsym(m_LibUPnPHandle->Get(), s_LibUPnPSymbols[6])); + m_UpnpGetServiceVarStatus = + REINTERPRET_CAST(int (*)(UpnpClient_Handle, const char *, const char *, DOMString *)) + (dlsym(m_LibUPnPHandle->Get(), s_LibUPnPSymbols[7])); + m_UpnpSendAction = + REINTERPRET_CAST(int (*)(UpnpClient_Handle, const char *, const char *, const char *, + IXML_Document *, IXML_Document **)) + (dlsym(m_LibUPnPHandle->Get(), s_LibUPnPSymbols[8])); + m_UpnpSendActionAsync = + REINTERPRET_CAST(int (*)(UpnpClient_Handle, const char *, const char *, const char *, + IXML_Document *, Upnp_FunPtr, const void *)) + (dlsym(m_LibUPnPHandle->Get(), s_LibUPnPSymbols[9])); + m_UpnpSubscribe = + REINTERPRET_CAST(int (*)(UpnpClient_Handle, const char *, int *, Upnp_SID)) + (dlsym(m_LibUPnPHandle->Get(), s_LibUPnPSymbols[10])); + m_UpnpUnSubscribe = + REINTERPRET_CAST(int (*)(UpnpClient_Handle, Upnp_SID)) + (dlsym(m_LibUPnPHandle->Get(), s_LibUPnPSymbols[11])); + m_UpnpDownloadXmlDoc = + REINTERPRET_CAST(int (*)(const char *, IXML_Document **)) + (dlsym(m_LibUPnPHandle->Get(), s_LibUPnPSymbols[12])); + m_UpnpResolveURL = + REINTERPRET_CAST(int (*)(const char *, const char *, char *)) + (dlsym(m_LibUPnPHandle->Get(), s_LibUPnPSymbols[13])); + m_UpnpMakeAction = + REINTERPRET_CAST(IXML_Document *(*)(const char *, const char *, int, const char *, ...)) + (dlsym(m_LibUPnPHandle->Get(), s_LibUPnPSymbols[14])); + m_UpnpAddToAction = + REINTERPRET_CAST(int (*)(IXML_Document **, const char *, const char *, const char *, const char *)) + (dlsym(m_LibUPnPHandle->Get(), s_LibUPnPSymbols[15])); + m_UpnpGetErrorMessage = + REINTERPRET_CAST(const char *(*)(int)) + (dlsym(m_LibUPnPHandle->Get(), s_LibUPnPSymbols[16])); +} + + +std::string CUPnPLib::GetUPnPErrorMessage(int code) const +{ + return m_UpnpGetErrorMessage(code); +} + + +std::string CUPnPLib::processUPnPErrorMessage( + const std::string &messsage, + int errorCode, + const DOMString errorString, + IXML_Document *doc) const +{ + std::ostringstream msg; + if (errorString == NULL || *errorString == 0) { + errorString = "Not available"; + } + if (errorCode > 0) { + msg << "Error: " << + messsage << + ": Error code :'"; + if (doc) { + CUPnPError e(*this, doc); + msg << e.getErrorCode() << + "', Error description :'" << + e.getErrorDescription() << + "'."; + } else { + msg << errorCode << + "', Error description :'" << + errorString << + "'."; + } + AddLogLineM(false, logUPnP, msg); + } else { + msg << "Error: " << + messsage << + ": UPnP SDK error: " << + GetUPnPErrorMessage(errorCode) << + " (" << errorCode << ")."; + AddLogLineM(false, logUPnP, msg); + } + + return msg.str(); +} + + +void CUPnPLib::ProcessActionResponse( + IXML_Document *RespDoc, + const std::string &actionName) const +{ + std::ostringstream msg; + msg << "Response: "; + IXML_Element *root = Element_GetRootElement(RespDoc); + IXML_Element *child = Element_GetFirstChild(root); + if (child) { + while (child) { + const DOMString childTag = Element_GetTag(child); + std::string childValue = Element_GetTextValue(child); + msg << "\n " << + childTag << "='" << + childValue << "'"; + child = Element_GetNextSibling(child); + } + } else { + msg << "\n Empty response for action '" << + actionName << "'."; + } + AddDebugLogLineM(false, logUPnP, msg); +} + + +/** + * This function returns the root node of a given document. + */ +IXML_Element *CUPnPLib::Element_GetRootElement( + IXML_Document *doc) const +{ + IXML_Element *root = REINTERPRET_CAST(IXML_Element *)( + m_ixmlNode_getFirstChild( + REINTERPRET_CAST(IXML_Node *)(doc))); + + return root; +} + + +/** + * This function returns the first child of a given element. + */ +IXML_Element *CUPnPLib::Element_GetFirstChild( + IXML_Element *parent) const +{ + IXML_Node *node = REINTERPRET_CAST(IXML_Node *)(parent); + IXML_Node *child = m_ixmlNode_getFirstChild(node); + + return REINTERPRET_CAST(IXML_Element *)(child); +} + + +/** + * This function returns the next sibling of a given child. + */ +IXML_Element *CUPnPLib::Element_GetNextSibling( + IXML_Element *child) const +{ + IXML_Node *node = REINTERPRET_CAST(IXML_Node *)(child); + IXML_Node *sibling = m_ixmlNode_getNextSibling(node); + + return REINTERPRET_CAST(IXML_Element *)(sibling); +} + + +/** + * This function returns the element tag (name) + */ +const DOMString CUPnPLib::Element_GetTag( + IXML_Element *element) const +{ + IXML_Node *node = REINTERPRET_CAST(IXML_Node *)(element); + const DOMString tag = m_ixmlNode_getNodeName(node); + + return tag; +} + + +/** + * This function returns the TEXT node value of the current node. + */ +const std::string CUPnPLib::Element_GetTextValue( + IXML_Element *element) const +{ + if (!element) { + return stdEmptyString; + } + IXML_Node *text = m_ixmlNode_getFirstChild( + REINTERPRET_CAST(IXML_Node *)(element)); + const DOMString s = m_ixmlNode_getNodeValue(text); + std::string ret; + if (s) { + ret = s; + } + + return ret; +} + + +/** + * This function returns the TEXT node value of the first child matching tag. + */ +const std::string CUPnPLib::Element_GetChildValueByTag( + IXML_Element *element, + const DOMString tag) const +{ + IXML_Element *child = + Element_GetFirstChildByTag(element, tag); + + return Element_GetTextValue(child); +} + + +/** + * Returns the first child element that matches the requested tag or + * NULL if not found. + */ +IXML_Element *CUPnPLib::Element_GetFirstChildByTag( + IXML_Element *element, + const DOMString tag) const +{ + if (!element || !tag) { + return NULL; + } + + IXML_Node *node = REINTERPRET_CAST(IXML_Node *)(element); + IXML_Node *child = m_ixmlNode_getFirstChild(node); + const DOMString childTag = m_ixmlNode_getNodeName(child); + while(child && childTag && strcmp(tag, childTag)) { + child = m_ixmlNode_getNextSibling(child); + childTag = m_ixmlNode_getNodeName(child); + } + + return REINTERPRET_CAST(IXML_Element *)(child); +} + + +/** + * Returns the next sibling element that matches the requested tag. Should be + * used with the return value of Element_GetFirstChildByTag(). + */ +IXML_Element *CUPnPLib::Element_GetNextSiblingByTag( + IXML_Element *element, const DOMString tag) const +{ + if (!element || !tag) { + return NULL; + } + + IXML_Node *child = REINTERPRET_CAST(IXML_Node *)(element); + const DOMString childTag = NULL; + do { + child = m_ixmlNode_getNextSibling(child); + childTag = m_ixmlNode_getNodeName(child); + } while(child && childTag && strcmp(tag, childTag)); + + return REINTERPRET_CAST(IXML_Element *)(child); +} + + +const std::string CUPnPLib::Element_GetAttributeByTag( + IXML_Element *element, const DOMString tag) const +{ + IXML_NamedNodeMap *NamedNodeMap = m_ixmlNode_getAttributes( + REINTERPRET_CAST(IXML_Node *)(element)); + IXML_Node *attribute = m_ixmlNamedNodeMap_getNamedItem(NamedNodeMap, tag); + const DOMString s = m_ixmlNode_getNodeValue(attribute); + std::string ret; + if (s) { + ret = s; + } + m_ixmlNamedNodeMap_free(NamedNodeMap); + + return ret; +} + + +CUPnPError::CUPnPError( + const CUPnPLib &upnpLib, + IXML_Document *errorDoc) +: +m_root (upnpLib.Element_GetRootElement(errorDoc)), +m_ErrorCode (upnpLib.Element_GetChildValueByTag(m_root, "errorCode")), +m_ErrorDescription(upnpLib.Element_GetChildValueByTag(m_root, "errorDescription")) +{ +} + + +CUPnPArgument::CUPnPArgument( + const CUPnPControlPoint &upnpControlPoint, + CUPnPLib &upnpLib, + IXML_Element *argument, + const std::string &WXUNUSED(SCPDURL)) +: +m_UPnPControlPoint(upnpControlPoint), +m_name (upnpLib.Element_GetChildValueByTag(argument, "name")), +m_direction (upnpLib.Element_GetChildValueByTag(argument, "direction")), +m_retval (upnpLib.Element_GetFirstChildByTag(argument, "retval")), +m_relatedStateVariable(upnpLib.Element_GetChildValueByTag(argument, "relatedStateVariable")) +{ + std::ostringstream msg; + msg << "\n Argument:" << + "\n name: " << m_name << + "\n direction: " << m_direction << + "\n retval: " << m_retval << + "\n relatedStateVariable: " << m_relatedStateVariable; + AddDebugLogLineM(false, logUPnP, msg); +} + + +CUPnPAction::CUPnPAction( + const CUPnPControlPoint &upnpControlPoint, + CUPnPLib &upnpLib, + IXML_Element *action, + const std::string &SCPDURL) +: +m_UPnPControlPoint(upnpControlPoint), +m_ArgumentList(upnpControlPoint, upnpLib, action, SCPDURL), +m_name(upnpLib.Element_GetChildValueByTag(action, "name")) +{ + std::ostringstream msg; + msg << "\n Action:" << + "\n name: " << m_name; + AddDebugLogLineM(false, logUPnP, msg); +} + + +CUPnPAllowedValue::CUPnPAllowedValue( + const CUPnPControlPoint &upnpControlPoint, + CUPnPLib &upnpLib, + IXML_Element *allowedValue, + const std::string &WXUNUSED(SCPDURL)) +: +m_UPnPControlPoint(upnpControlPoint), +m_allowedValue(upnpLib.Element_GetTextValue(allowedValue)) +{ + std::ostringstream msg; + msg << "\n AllowedValue:" << + "\n allowedValue: " << m_allowedValue; + AddDebugLogLineM(false, logUPnP, msg); +} + + +CUPnPStateVariable::CUPnPStateVariable( + const CUPnPControlPoint &upnpControlPoint, + CUPnPLib &upnpLib, + IXML_Element *stateVariable, + const std::string &SCPDURL) +: +m_UPnPControlPoint(upnpControlPoint), +m_AllowedValueList(upnpControlPoint, upnpLib, stateVariable, SCPDURL), +m_name (upnpLib.Element_GetChildValueByTag(stateVariable, "name")), +m_dataType (upnpLib.Element_GetChildValueByTag(stateVariable, "dataType")), +m_defaultValue(upnpLib.Element_GetChildValueByTag(stateVariable, "defaultValue")), +m_sendEvents (upnpLib.Element_GetAttributeByTag (stateVariable, "sendEvents")) +{ + std::ostringstream msg; + msg << "\n StateVariable:" << + "\n name: " << m_name << + "\n dataType: " << m_dataType << + "\n defaultValue: " << m_defaultValue << + "\n sendEvents: " << m_sendEvents; + AddDebugLogLineM(false, logUPnP, msg); +} + + +CUPnPSCPD::CUPnPSCPD( + const CUPnPControlPoint &upnpControlPoint, + CUPnPLib &upnpLib, + IXML_Element *scpd, + const std::string &SCPDURL) +: +m_UPnPControlPoint(upnpControlPoint), +m_ActionList(upnpControlPoint, upnpLib, scpd, SCPDURL), +m_ServiceStateTable(upnpControlPoint, upnpLib, scpd, SCPDURL), +m_SCPDURL(SCPDURL) +{ +} + + +CUPnPArgumentValue::CUPnPArgumentValue() +: +m_argument(), +m_value() +{ +} + + +CUPnPArgumentValue::CUPnPArgumentValue( + const std::string &argument, const std::string &value) +: +m_argument(argument), +m_value(value) +{ +} + + +CUPnPService::CUPnPService( + const CUPnPControlPoint &upnpControlPoint, + CUPnPLib &upnpLib, + IXML_Element *service, + const std::string &URLBase) +: +m_UPnPControlPoint(upnpControlPoint), +m_upnpLib(upnpLib), +m_serviceType(upnpLib.Element_GetChildValueByTag(service, "serviceType")), +m_serviceId (upnpLib.Element_GetChildValueByTag(service, "serviceId")), +m_SCPDURL (upnpLib.Element_GetChildValueByTag(service, "SCPDURL")), +m_controlURL (upnpLib.Element_GetChildValueByTag(service, "controlURL")), +m_eventSubURL(upnpLib.Element_GetChildValueByTag(service, "eventSubURL")), +m_timeout(1801), +m_SCPD(NULL) +{ + std::ostringstream msg; + int errcode; + + std::vector vscpdURL(URLBase.length() + m_SCPDURL.length() + 1); + char *scpdURL = &vscpdURL[0]; + errcode = upnpLib.m_UpnpResolveURL( + URLBase.c_str(), + m_SCPDURL.c_str(), + scpdURL); + if( errcode != UPNP_E_SUCCESS ) { + msg << "Error generating scpdURL from " << + "|" << URLBase << "|" << + m_SCPDURL << "|."; + AddDebugLogLineM(false, logUPnP, msg); + } else { + m_absSCPDURL = scpdURL; + } + + std::vector vcontrolURL( + URLBase.length() + m_controlURL.length() + 1); + char *controlURL = &vcontrolURL[0]; + errcode = upnpLib.m_UpnpResolveURL( + URLBase.c_str(), + m_controlURL.c_str(), + controlURL); + if( errcode != UPNP_E_SUCCESS ) { + msg << "Error generating controlURL from " << + "|" << URLBase << "|" << + m_controlURL << "|."; + AddDebugLogLineM(false, logUPnP, msg); + } else { + m_absControlURL = controlURL; + } + + std::vector veventURL( + URLBase.length() + m_eventSubURL.length() + 1); + char *eventURL = &veventURL[0]; + errcode = upnpLib.m_UpnpResolveURL( + URLBase.c_str(), + m_eventSubURL.c_str(), + eventURL); + if( errcode != UPNP_E_SUCCESS ) { + msg << "Error generating eventURL from " << + "|" << URLBase << "|" << + m_eventSubURL << "|."; + AddDebugLogLineM(false, logUPnP, msg); + } else { + m_absEventSubURL = eventURL; + } + + msg << "\n Service:" << + "\n serviceType: " << m_serviceType << + "\n serviceId: " << m_serviceId << + "\n SCPDURL: " << m_SCPDURL << + "\n absSCPDURL: " << m_absSCPDURL << + "\n controlURL: " << m_controlURL << + "\n absControlURL: " << m_absControlURL << + "\n eventSubURL: " << m_eventSubURL << + "\n absEventSubURL: " << m_absEventSubURL; + AddDebugLogLineM(false, logUPnP, msg); + + if ( m_serviceType == upnpLib.UPNP_SERVICE_WAN_IP_CONNECTION || + m_serviceType == upnpLib.UPNP_SERVICE_WAN_PPP_CONNECTION) { +//#warning Delete this code on release. + //if (!upnpLib.m_ctrlPoint.WanServiceDetected()) { + // This condition can be used to suspend the parse + // of the XML tree. +//#warning Delete this code when m_WanService is no longer used. + upnpLib.m_ctrlPoint.SetWanService(this); + // Log it + msg.str(""); + msg << "WAN Service Detected: '" << + m_serviceType << "'."; + AddDebugLogLineM(true, logUPnP, msg); + // Subscribe + upnpLib.m_ctrlPoint.Subscribe(*this); +//#warning Delete this code on release. +#if 0 + } else { + msg.str(""); + msg << "WAN service detected again: '" << + m_serviceType << + "'. Will only use the first instance."; + AddDebugLogLineM(true, logUPnP, msg); + } +#endif + } else { + msg.str(""); + msg << "Uninteresting service detected: '" << + m_serviceType << "'. Ignoring."; + AddDebugLogLineM(true, logUPnP, msg); + } +} + + +CUPnPService::~CUPnPService() +{ +} + + +bool CUPnPService::Execute( + const std::string &ActionName, + const std::vector &ArgValue) const +{ + std::ostringstream msg; + std::ostringstream msgAction("Sending action "); + // Check for correct action name + ActionList::const_iterator itAction = + m_SCPD->GetActionList().find(ActionName); + if (itAction == m_SCPD->GetActionList().end()) { + msg << "Invalid action name '" << ActionName << + "' for service '" << GetServiceType() << "'."; + AddDebugLogLineM(false, logUPnP, msg); + return false; + } + msgAction << ActionName << "("; + bool firstTime = true; + // Check for correct Argument/Value pairs + const CUPnPAction &action = *(itAction->second); + for (unsigned int i = 0; i < ArgValue.size(); ++i) { + ArgumentList::const_iterator itArg = + action.GetArgumentList().find(ArgValue[i].GetArgument()); + if (itArg == action.GetArgumentList().end()) { + msg << "Invalid argument name '" << ArgValue[i].GetArgument() << + "' for action '" << action.GetName() << + "' for service '" << GetServiceType() << "'."; + AddDebugLogLineM(false, logUPnP, msg); + return false; + } + const CUPnPArgument &argument = *(itArg->second); + if (tolower(argument.GetDirection()[0]) != 'i' || + tolower(argument.GetDirection()[1]) != 'n') { + msg << "Invalid direction for argument '" << + ArgValue[i].GetArgument() << + "' for action '" << action.GetName() << + "' for service '" << GetServiceType() << "'."; + AddDebugLogLineM(false, logUPnP, msg); + return false; + } + const std::string relatedStateVariableName = + argument.GetRelatedStateVariable(); + if (!relatedStateVariableName.empty()) { + ServiceStateTable::const_iterator itSVT = + m_SCPD->GetServiceStateTable(). + find(relatedStateVariableName); + if (itSVT == m_SCPD->GetServiceStateTable().end()) { + msg << "Inconsistent Service State Table, did not find '" << + relatedStateVariableName << + "' for argument '" << argument.GetName() << + "' for action '" << action.GetName() << + "' for service '" << GetServiceType() << "'."; + AddDebugLogLineM(false, logUPnP, msg); + return false; + } + const CUPnPStateVariable &stateVariable = *(itSVT->second); + if ( !stateVariable.GetAllowedValueList().empty() && + stateVariable.GetAllowedValueList().find(ArgValue[i].GetValue()) == + stateVariable.GetAllowedValueList().end()) { + msg << "Value not allowed '" << ArgValue[i].GetValue() << + "' for state variable '" << relatedStateVariableName << + "' for argument '" << argument.GetName() << + "' for action '" << action.GetName() << + "' for service '" << GetServiceType() << "'."; + AddDebugLogLineM(false, logUPnP, msg); + return false; + } + } + if (firstTime) { + firstTime = false; + } else { + msgAction << ", "; + } + msgAction << + ArgValue[i].GetArgument() << + "='" << + ArgValue[i].GetValue() << + "'"; + } + msgAction << ")"; + AddDebugLogLineM(false, logUPnP, msgAction); + // Everything is ok, make the action + IXML_Document *ActionDoc = NULL; + if (ArgValue.size()) { + for (unsigned int i = 0; i < ArgValue.size(); ++i) { + int ret = m_upnpLib.m_UpnpAddToAction( + &ActionDoc, + action.GetName().c_str(), + GetServiceType().c_str(), + ArgValue[i].GetArgument().c_str(), + ArgValue[i].GetValue().c_str()); + if (ret != UPNP_E_SUCCESS) { + m_upnpLib.processUPnPErrorMessage( + "m_UpnpAddToAction", ret, NULL, NULL); + return false; + } + } + } else { + ActionDoc = m_upnpLib.m_UpnpMakeAction( + action.GetName().c_str(), + GetServiceType().c_str(), + 0, NULL); + if (!ActionDoc) { + msg << "Error: m_UpnpMakeAction returned NULL."; + AddLogLineM(false, logUPnP, msg); + return false; + } + } +#if 0 + // Send the action asynchronously + m_upnpLib.m_UpnpSendActionAsync( + m_UPnPControlPoint.GetUPnPClientHandle(), + GetAbsControlURL().c_str(), + GetServiceType().c_str(), + NULL, ActionDoc, + static_cast(&CUPnPControlPoint::Callback), + NULL); + return true; +#endif + + // Send the action synchronously + IXML_Document *RespDoc = NULL; + int ret = m_upnpLib.m_UpnpSendAction( + m_UPnPControlPoint.GetUPnPClientHandle(), + GetAbsControlURL().c_str(), + GetServiceType().c_str(), + NULL, ActionDoc, &RespDoc); + if (ret != UPNP_E_SUCCESS) { + m_upnpLib.processUPnPErrorMessage( + "m_UpnpSendAction", ret, NULL, RespDoc); + m_upnpLib.m_ixmlDocument_free(ActionDoc); + m_upnpLib.m_ixmlDocument_free(RespDoc); + return false; + } + m_upnpLib.m_ixmlDocument_free(ActionDoc); + + // Check the response document + m_upnpLib.ProcessActionResponse( + RespDoc, action.GetName()); + + // Free the response document + m_upnpLib.m_ixmlDocument_free(RespDoc); + + return true; +} + + +const std::string CUPnPService::GetStateVariable( + const std::string &stateVariableName) const +{ + std::ostringstream msg; + DOMString StVarVal; + int ret = m_upnpLib.m_UpnpGetServiceVarStatus( + m_UPnPControlPoint.GetUPnPClientHandle(), + GetAbsControlURL().c_str(), + stateVariableName.c_str(), + &StVarVal); + if (ret != UPNP_E_SUCCESS) { + msg << "GetStateVariable(\"" << + stateVariableName << + "\"): in a call to m_UpnpGetServiceVarStatus"; + m_upnpLib.processUPnPErrorMessage( + msg.str(), ret, StVarVal, NULL); + return stdEmptyString; + } + msg << "GetStateVariable: " << + stateVariableName << + "='" << + StVarVal << + "'."; + AddDebugLogLineM(false, logUPnP, msg); + return stdEmptyString; +} + + +CUPnPDevice::CUPnPDevice( + const CUPnPControlPoint &upnpControlPoint, + CUPnPLib &upnpLib, + IXML_Element *device, + const std::string &URLBase) +: +m_UPnPControlPoint(upnpControlPoint), +m_DeviceList(upnpControlPoint, upnpLib, device, URLBase), +m_ServiceList(upnpControlPoint, upnpLib, device, URLBase), +m_deviceType (upnpLib.Element_GetChildValueByTag(device, "deviceType")), +m_friendlyName (upnpLib.Element_GetChildValueByTag(device, "friendlyName")), +m_manufacturer (upnpLib.Element_GetChildValueByTag(device, "manufacturer")), +m_manufacturerURL (upnpLib.Element_GetChildValueByTag(device, "manufacturerURL")), +m_modelDescription (upnpLib.Element_GetChildValueByTag(device, "modelDescription")), +m_modelName (upnpLib.Element_GetChildValueByTag(device, "modelName")), +m_modelNumber (upnpLib.Element_GetChildValueByTag(device, "modelNumber")), +m_modelURL (upnpLib.Element_GetChildValueByTag(device, "modelURL")), +m_serialNumber (upnpLib.Element_GetChildValueByTag(device, "serialNumber")), +m_UDN (upnpLib.Element_GetChildValueByTag(device, "UDN")), +m_UPC (upnpLib.Element_GetChildValueByTag(device, "UPC")), +m_presentationURL (upnpLib.Element_GetChildValueByTag(device, "presentationURL")) +{ + std::ostringstream msg; + int presURLlen = strlen(URLBase.c_str()) + + strlen(m_presentationURL.c_str()) + 2; + std::vector vpresURL(presURLlen); + char* presURL = &vpresURL[0]; + int errcode = upnpLib.m_UpnpResolveURL( + URLBase.c_str(), + m_presentationURL.c_str(), + presURL); + if (errcode != UPNP_E_SUCCESS) { + msg << "Error generating presentationURL from " << + "|" << URLBase << "|" << + m_presentationURL << "|."; + AddDebugLogLineM(false, logUPnP, msg); + } else { + m_presentationURL = presURL; + } + + msg.str(""); + msg << "\n Device: " << + "\n friendlyName: " << m_friendlyName << + "\n deviceType: " << m_deviceType << + "\n manufacturer: " << m_manufacturer << + "\n manufacturerURL: " << m_manufacturerURL << + "\n modelDescription: " << m_modelDescription << + "\n modelName: " << m_modelName << + "\n modelNumber: " << m_modelNumber << + "\n modelURL: " << m_modelURL << + "\n serialNumber: " << m_serialNumber << + "\n UDN: " << m_UDN << + "\n UPC: " << m_UPC << + "\n presentationURL: " << m_presentationURL; + AddDebugLogLineM(false, logUPnP, msg); +} + + +CUPnPRootDevice::CUPnPRootDevice( + const CUPnPControlPoint &upnpControlPoint, + CUPnPLib &upnpLib, + IXML_Element *rootDevice, + const std::string &OriginalURLBase, + const std::string &FixedURLBase, + const char *location, + int expires) +: +CUPnPDevice(upnpControlPoint, upnpLib, rootDevice, FixedURLBase), +m_UPnPControlPoint(upnpControlPoint), +m_URLBase(OriginalURLBase), +m_location(location), +m_expires(expires) +{ + std::ostringstream msg; + msg << + "\n Root Device: " << + "\n URLBase: " << m_URLBase << + "\n Fixed URLBase: " << FixedURLBase << + "\n location: " << m_location << + "\n expires: " << m_expires; + AddDebugLogLineM(false, logUPnP, msg); +} + + +CUPnPControlPoint *CUPnPControlPoint::s_CtrlPoint = NULL; + + +CUPnPControlPoint::CUPnPControlPoint(unsigned short udpPort) +: +m_upnpLib(*this), +m_UPnPClientHandle(), +m_RootDeviceMap(), +m_ServiceMap(), +m_ActivePortMappingsMap(), +m_RootDeviceListMutex(), +m_IGWDeviceDetected(false), +m_WanService(NULL) +{ + // Pointer to self + s_CtrlPoint = this; + // Null string at first + std::ostringstream msg; + + // Start UPnP + int ret; + char *ipAddress = NULL; + unsigned short port = 0; + ret = m_upnpLib.m_UpnpInit(ipAddress, udpPort); + if (ret != UPNP_E_SUCCESS) { + msg << "error(UpnpInit): Error code "; + goto error; + } + port = m_upnpLib.m_UpnpGetServerPort(); + ipAddress = m_upnpLib.m_UpnpGetServerIpAddress(); + msg << "bound to " << ipAddress << ":" << + port << "."; + AddLogLineM(false, logUPnP, msg); + msg.str(""); + ret = m_upnpLib.m_UpnpRegisterClient( + static_cast(&CUPnPControlPoint::Callback), + &m_UPnPClientHandle, + &m_UPnPClientHandle); + if (ret != UPNP_E_SUCCESS) { + msg << "error(UpnpRegisterClient): Error registering callback: "; + goto error; + } + + // We could ask for just the right device here. If the root device + // contains the device we want, it will respond with the full XML doc, + // including the root device and every sub-device it has. + // + // But lets find out what we have in our network by calling UPNP_ROOT_DEVICE. + // + // We should not search twice, because this will produce two + // UPNP_DISCOVERY_SEARCH_TIMEOUT events, and we might end with problems + // on the mutex. + ret = m_upnpLib.m_UpnpSearchAsync(m_UPnPClientHandle, 3, m_upnpLib.UPNP_ROOT_DEVICE.c_str(), NULL); + //ret = m_upnpLib.m_UpnpSearchAsync(m_UPnPClientHandle, 3, m_upnpLib.UPNP_DEVICE_IGW.c_str(), this); + //ret = m_upnpLib.m_UpnpSearchAsync(m_UPnPClientHandle, 3, m_upnpLib.UPNP_DEVICE_LAN.c_str(), this); + //ret = m_upnpLib.m_UpnpSearchAsync(m_UPnPClientHandle, 3, m_upnpLib.UPNP_DEVICE_WAN_CONNECTION.c_str(), this); + if (ret != UPNP_E_SUCCESS) { + msg << "error(UpnpSearchAsync): Error sending search request: "; + goto error; + } + + // Wait for the UPnP initialization to complete. + { + // Lock the search timeout mutex + m_WaitForSearchTimeoutMutex.Lock(); + + // Lock it again, so that we block. Unlocking will only happen + // when the UPNP_DISCOVERY_SEARCH_TIMEOUT event occurs at the + // callback. + CUPnPMutexLocker lock(m_WaitForSearchTimeoutMutex); + } + return; + + // Error processing +error: + m_upnpLib.m_UpnpFinish(); + msg << ret << ": " << m_upnpLib.GetUPnPErrorMessage(ret) << "."; + throw CUPnPException(msg); +} + + +CUPnPControlPoint::~CUPnPControlPoint() +{ + for( RootDeviceMap::iterator it = m_RootDeviceMap.begin(); + it != m_RootDeviceMap.end(); + ++it) { + delete it->second; + } + // Remove all first + // RemoveAll(); + m_upnpLib.m_UpnpUnRegisterClient(m_UPnPClientHandle); + m_upnpLib.m_UpnpFinish(); +} + + +bool CUPnPControlPoint::AddPortMappings( + std::vector &upnpPortMapping) +{ + std::ostringstream msg; + if (!WanServiceDetected()) { + msg << "UPnP Error: " + "CUPnPControlPoint::AddPortMapping: " + "Wan Service not detected."; + AddLogLineM(true, logUPnP, msg); + return false; + } + + int n = upnpPortMapping.size(); + bool ok = false; + + // Check the number of port mappings before + std::istringstream PortMappingNumberOfEntries( + m_WanService->GetStateVariable( + "PortMappingNumberOfEntries")); + unsigned long oldNumberOfEntries; + PortMappingNumberOfEntries >> oldNumberOfEntries; + + // Add the enabled port mappings + for (int i = 0; i < n; ++i) { + if (upnpPortMapping[i].getEnabled() == "1") { + // Add the mapping to the control point + // active mappings list + m_ActivePortMappingsMap[upnpPortMapping[i].getKey()] = + upnpPortMapping[i]; + + // Add the port mapping + PrivateAddPortMapping(upnpPortMapping[i]); + } + } + + // Test some variables, this is deprecated, might not work + // with some routers + m_WanService->GetStateVariable("ConnectionType"); + m_WanService->GetStateVariable("PossibleConnectionTypes"); + m_WanService->GetStateVariable("ConnectionStatus"); + m_WanService->GetStateVariable("Uptime"); + m_WanService->GetStateVariable("LastConnectionError"); + m_WanService->GetStateVariable("RSIPAvailable"); + m_WanService->GetStateVariable("NATEnabled"); + m_WanService->GetStateVariable("ExternalIPAddress"); + m_WanService->GetStateVariable("PortMappingNumberOfEntries"); + m_WanService->GetStateVariable("PortMappingLeaseDuration"); + + // Just for testing + std::vector argval; + argval.resize(0); + m_WanService->Execute("GetStatusInfo", argval); + +#if 0 + // These do not work. Their value must be requested for a + // specific port mapping. + m_WanService->GetStateVariable("PortMappingEnabled"); + m_WanService->GetStateVariable("RemoteHost"); + m_WanService->GetStateVariable("ExternalPort"); + m_WanService->GetStateVariable("InternalPort"); + m_WanService->GetStateVariable("PortMappingProtocol"); + m_WanService->GetStateVariable("InternalClient"); + m_WanService->GetStateVariable("PortMappingDescription"); +#endif + + // Debug only + msg.str(""); + msg << "CUPnPControlPoint::DeletePortMappings: " + "m_ActivePortMappingsMap.size() == " << + m_ActivePortMappingsMap.size(); + AddDebugLogLineM(false, logUPnP, msg); + + // Not very good, must find a better test + PortMappingNumberOfEntries.str( + m_WanService->GetStateVariable( + "PortMappingNumberOfEntries")); + unsigned long newNumberOfEntries; + PortMappingNumberOfEntries >> newNumberOfEntries; + ok = newNumberOfEntries - oldNumberOfEntries == 4; + + return ok; +} + + +void CUPnPControlPoint::RefreshPortMappings() +{ + for ( PortMappingMap::iterator it = m_ActivePortMappingsMap.begin(); + it != m_ActivePortMappingsMap.end(); + ++it) { + PrivateAddPortMapping(it->second); + } + + // For testing + m_WanService->GetStateVariable("PortMappingNumberOfEntries"); +} + + +bool CUPnPControlPoint::PrivateAddPortMapping( + CUPnPPortMapping &upnpPortMapping) +{ + // Get an IP address. The UPnP server one must do. + std::string ipAddress(m_upnpLib.m_UpnpGetServerIpAddress()); + + // Start building the action + std::string actionName("AddPortMapping"); + std::vector argval(8); + + // Action parameters + argval[0].SetArgument("NewRemoteHost"); + argval[0].SetValue(""); + argval[1].SetArgument("NewExternalPort"); + argval[1].SetValue(upnpPortMapping.getPort()); + argval[2].SetArgument("NewProtocol"); + argval[2].SetValue(upnpPortMapping.getProtocol()); + argval[3].SetArgument("NewInternalPort"); + argval[3].SetValue(upnpPortMapping.getPort()); + argval[4].SetArgument("NewInternalClient"); + argval[4].SetValue(ipAddress); + argval[5].SetArgument("NewEnabled"); + argval[5].SetValue("1"); + argval[6].SetArgument("NewPortMappingDescription"); + argval[6].SetValue(upnpPortMapping.getDescription()); + argval[7].SetArgument("NewLeaseDuration"); + argval[7].SetValue("0"); + + // Execute + bool ret = true; + for (ServiceMap::iterator it = m_ServiceMap.begin(); + it != m_ServiceMap.end(); ++it) { + ret &= it->second->Execute(actionName, argval); + } + + return ret; +} + + +bool CUPnPControlPoint::DeletePortMappings( + std::vector &upnpPortMapping) +{ + std::ostringstream msg; + if (!WanServiceDetected()) { + msg << "UPnP Error: " + "CUPnPControlPoint::DeletePortMapping: " + "Wan Service not detected."; + AddLogLineM(true, logUPnP, msg); + return false; + } + + int n = upnpPortMapping.size(); + bool ok = false; + + // Check the number of port mappings before + std::istringstream PortMappingNumberOfEntries( + m_WanService->GetStateVariable( + "PortMappingNumberOfEntries")); + unsigned long oldNumberOfEntries; + PortMappingNumberOfEntries >> oldNumberOfEntries; + + // Delete the enabled port mappings + for (int i = 0; i < n; ++i) { + if (upnpPortMapping[i].getEnabled() == "1") { + // Delete the mapping from the control point + // active mappings list + PortMappingMap::iterator it = + m_ActivePortMappingsMap.find( + upnpPortMapping[i].getKey()); + if (it != m_ActivePortMappingsMap.end()) { + m_ActivePortMappingsMap.erase(it); + } else { + msg << "UPnP Error: " + "CUPnPControlPoint::DeletePortMapping: " + "Mapping was not found in the active " + "mapping map."; + AddLogLineM(true, logUPnP, msg); + } + + // Delete the port mapping + PrivateDeletePortMapping(upnpPortMapping[i]); + } + } + + // Debug only + msg.str(""); + msg << "CUPnPControlPoint::DeletePortMappings: " + "m_ActivePortMappingsMap.size() == " << + m_ActivePortMappingsMap.size(); + AddDebugLogLineM(false, logUPnP, msg); + + // Not very good, must find a better test + PortMappingNumberOfEntries.str( + m_WanService->GetStateVariable( + "PortMappingNumberOfEntries")); + unsigned long newNumberOfEntries; + PortMappingNumberOfEntries >> newNumberOfEntries; + ok = oldNumberOfEntries - newNumberOfEntries == 4; + + return ok; +} + + +bool CUPnPControlPoint::PrivateDeletePortMapping( + CUPnPPortMapping &upnpPortMapping) +{ + // Start building the action + std::string actionName("DeletePortMapping"); + std::vector argval(3); + + // Action parameters + argval[0].SetArgument("NewRemoteHost"); + argval[0].SetValue(""); + argval[1].SetArgument("NewExternalPort"); + argval[1].SetValue(upnpPortMapping.getPort()); + argval[2].SetArgument("NewProtocol"); + argval[2].SetValue(upnpPortMapping.getProtocol()); + + // Execute + bool ret = true; + for (ServiceMap::iterator it = m_ServiceMap.begin(); + it != m_ServiceMap.end(); ++it) { + ret &= it->second->Execute(actionName, argval); + } + + return ret; +} + + +// This function is static +int CUPnPControlPoint::Callback(Upnp_EventType EventType, void *Event, void * /*Cookie*/) +{ + std::ostringstream msg; + std::ostringstream msg2; + // Somehow, this is unreliable. UPNP_DISCOVERY_ADVERTISEMENT_ALIVE events + // happen with a wrong cookie and... boom! + // CUPnPControlPoint *upnpCP = static_cast(Cookie); + CUPnPControlPoint *upnpCP = CUPnPControlPoint::s_CtrlPoint; + + //fprintf(stderr, "Callback: %d, Cookie: %p\n", EventType, Cookie); + switch (EventType) { + case UPNP_DISCOVERY_ADVERTISEMENT_ALIVE: + //fprintf(stderr, "Callback: UPNP_DISCOVERY_ADVERTISEMENT_ALIVE\n"); + msg << "error(UPNP_DISCOVERY_ADVERTISEMENT_ALIVE): "; + msg2<< "UPNP_DISCOVERY_ADVERTISEMENT_ALIVE: "; + goto upnpDiscovery; + case UPNP_DISCOVERY_SEARCH_RESULT: { + //fprintf(stderr, "Callback: UPNP_DISCOVERY_SEARCH_RESULT\n"); + msg << "error(UPNP_DISCOVERY_SEARCH_RESULT): "; + msg2<< "UPNP_DISCOVERY_SEARCH_RESULT: "; + // UPnP Discovery +upnpDiscovery: + struct Upnp_Discovery *d_event = (struct Upnp_Discovery *)Event; + IXML_Document *doc = NULL; + int ret; + if (d_event->ErrCode != UPNP_E_SUCCESS) { + msg << upnpCP->m_upnpLib.GetUPnPErrorMessage(d_event->ErrCode) << "."; + AddDebugLogLineM(true, logUPnP, msg); + } + // Get the XML tree device description in doc + ret = upnpCP->m_upnpLib.m_UpnpDownloadXmlDoc(d_event->Location, &doc); + if (ret != UPNP_E_SUCCESS) { + msg << "Error retrieving device description from " << + d_event->Location << ": " << + upnpCP->m_upnpLib.GetUPnPErrorMessage(ret) << "."; + AddDebugLogLineM(true, logUPnP, msg); + } else { + msg2 << "Retrieving device description from " << + d_event->Location << "."; + AddDebugLogLineM(false, logUPnP, msg2); + } + if (doc) { + // Get the root node + IXML_Element *root = + upnpCP->m_upnpLib.Element_GetRootElement(doc); + // Extract the URLBase + const std::string urlBase = upnpCP->m_upnpLib. + Element_GetChildValueByTag(root, "URLBase"); + // Get the root device + IXML_Element *rootDevice = upnpCP->m_upnpLib. + Element_GetFirstChildByTag(root, "device"); + // Extract the deviceType + std::string devType(upnpCP->m_upnpLib. + Element_GetChildValueByTag(rootDevice, "deviceType")); + // Only add device if it is an InternetGatewayDevice + if (stdStringIsEqualCI(devType, upnpCP->m_upnpLib.UPNP_DEVICE_IGW)) { + // This condition can be used to auto-detect + // the UPnP device we are interested in. + // Obs.: Don't block the entry here on this + // condition! There may be more than one device, + // and the first that enters may not be the one + // we are interested in! + upnpCP->SetIGWDeviceDetected(true); + // Log it if not UPNP_DISCOVERY_ADVERTISEMENT_ALIVE, + // we don't want to spam our logs. + if (EventType != UPNP_DISCOVERY_ADVERTISEMENT_ALIVE) { + msg.str("Internet Gateway Device Detected."); + AddLogLineM(true, logUPnP, msg); + } + // Add the root device to our list + upnpCP->AddRootDevice(rootDevice, urlBase, + d_event->Location, d_event->Expires); + } + // Free the XML doc tree + upnpCP->m_upnpLib.m_ixmlDocument_free(doc); + } + break; + } + case UPNP_DISCOVERY_SEARCH_TIMEOUT: { + //fprintf(stderr, "Callback: UPNP_DISCOVERY_SEARCH_TIMEOUT\n"); + // Search timeout + msg << "UPNP_DISCOVERY_SEARCH_TIMEOUT."; + AddDebugLogLineM(false, logUPnP, msg); + + // Unlock the search timeout mutex + upnpCP->m_WaitForSearchTimeoutMutex.Unlock(); + + break; + } + case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE: { + //fprintf(stderr, "Callback: UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE\n"); + // UPnP Device Removed + struct Upnp_Discovery *dab_event = (struct Upnp_Discovery *)Event; + if (dab_event->ErrCode != UPNP_E_SUCCESS) { + msg << "error(UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE): " << + upnpCP->m_upnpLib.GetUPnPErrorMessage(dab_event->ErrCode) << + "."; + AddDebugLogLineM(true, logUPnP, msg); + } + std::string devType = dab_event->DeviceType; + // Check for an InternetGatewayDevice and removes it from the list + transform(devType.begin(), devType.end(), devType.begin(), tolower); + if (stdStringIsEqualCI(devType, upnpCP->m_upnpLib.UPNP_DEVICE_IGW)) { + upnpCP->RemoveRootDevice(dab_event->DeviceId); + } + break; + } + case UPNP_EVENT_RECEIVED: { + //fprintf(stderr, "Callback: UPNP_EVENT_RECEIVED\n"); + // Event reveived + struct Upnp_Event *e_event = (struct Upnp_Event *)Event; + const std::string Sid = e_event->Sid; + // Parses the event + upnpCP->OnEventReceived(Sid, e_event->EventKey, e_event->ChangedVariables); + break; + } + case UPNP_EVENT_SUBSCRIBE_COMPLETE: + //fprintf(stderr, "Callback: UPNP_EVENT_SUBSCRIBE_COMPLETE\n"); + msg << "error(UPNP_EVENT_SUBSCRIBE_COMPLETE): "; + goto upnpEventRenewalComplete; + case UPNP_EVENT_UNSUBSCRIBE_COMPLETE: + //fprintf(stderr, "Callback: UPNP_EVENT_UNSUBSCRIBE_COMPLETE\n"); + msg << "error(UPNP_EVENT_UNSUBSCRIBE_COMPLETE): "; + goto upnpEventRenewalComplete; + case UPNP_EVENT_RENEWAL_COMPLETE: { + //fprintf(stderr, "Callback: UPNP_EVENT_RENEWAL_COMPLETE\n"); + msg << "error(UPNP_EVENT_RENEWAL_COMPLETE): "; +upnpEventRenewalComplete: + struct Upnp_Event_Subscribe *es_event = + (struct Upnp_Event_Subscribe *)Event; + if (es_event->ErrCode != UPNP_E_SUCCESS) { + msg << "Error in Event Subscribe Callback"; + upnpCP->m_upnpLib.processUPnPErrorMessage( + msg.str(), es_event->ErrCode, NULL, NULL); + } else { +#if 0 + TvCtrlPointHandleSubscribeUpdate( + es_event->PublisherUrl, + es_event->Sid, + es_event->TimeOut ); +#endif + } + + break; + } + + case UPNP_EVENT_AUTORENEWAL_FAILED: + //fprintf(stderr, "Callback: UPNP_EVENT_AUTORENEWAL_FAILED\n"); + msg << "error(UPNP_EVENT_AUTORENEWAL_FAILED): "; + msg2 << "UPNP_EVENT_AUTORENEWAL_FAILED: "; + goto upnpEventSubscriptionExpired; + case UPNP_EVENT_SUBSCRIPTION_EXPIRED: { + //fprintf(stderr, "Callback: UPNP_EVENT_SUBSCRIPTION_EXPIRED\n"); + msg << "error(UPNP_EVENT_SUBSCRIPTION_EXPIRED): "; + msg2 << "UPNP_EVENT_SUBSCRIPTION_EXPIRED: "; +upnpEventSubscriptionExpired: + struct Upnp_Event_Subscribe *es_event = + (struct Upnp_Event_Subscribe *)Event; + Upnp_SID newSID; + int TimeOut = 1801; + int ret = upnpCP->m_upnpLib.m_UpnpSubscribe( + upnpCP->m_UPnPClientHandle, + es_event->PublisherUrl, + &TimeOut, + newSID); + if (ret != UPNP_E_SUCCESS) { + msg << "Error Subscribing to EventURL"; + upnpCP->m_upnpLib.processUPnPErrorMessage( + msg.str(), es_event->ErrCode, NULL, NULL); + } else { + ServiceMap::iterator it = + upnpCP->m_ServiceMap.find(es_event->PublisherUrl); + if (it != upnpCP->m_ServiceMap.end()) { + CUPnPService &service = *(it->second); + service.SetTimeout(TimeOut); + service.SetSID(newSID); + msg2 << "Re-subscribed to EventURL '" << + es_event->PublisherUrl << + "' with SID == '" << + newSID << "'."; + AddDebugLogLineM(true, logUPnP, msg2); + // In principle, we should test to see if the + // service is the same. But here we only have one + // service, so... + upnpCP->RefreshPortMappings(); + } else { + msg << "Error: did not find service " << + newSID << " in the service map."; + AddDebugLogLineM(true, logUPnP, msg); + } + } + break; + } + case UPNP_CONTROL_ACTION_COMPLETE: { + //fprintf(stderr, "Callback: UPNP_CONTROL_ACTION_COMPLETE\n"); + // This is here if we choose to do this asynchronously + struct Upnp_Action_Complete *a_event = + (struct Upnp_Action_Complete *)Event; + if (a_event->ErrCode != UPNP_E_SUCCESS) { + upnpCP->m_upnpLib.processUPnPErrorMessage( + "m_UpnpSendActionAsync", + a_event->ErrCode, NULL, + a_event->ActionResult); + } else { + // Check the response document + upnpCP->m_upnpLib.ProcessActionResponse( + a_event->ActionResult, + ""); + } + /* No need for any processing here, just print out results. + * Service state table updates are handled by events. + */ + break; + } + case UPNP_CONTROL_GET_VAR_COMPLETE: { + //fprintf(stderr, "Callback: UPNP_CONTROL_GET_VAR_COMPLETE\n"); + msg << "error(UPNP_CONTROL_GET_VAR_COMPLETE): "; + struct Upnp_State_Var_Complete *sv_event = + (struct Upnp_State_Var_Complete *)Event; + if (sv_event->ErrCode != UPNP_E_SUCCESS) { + msg << "m_UpnpGetServiceVarStatusAsync"; + upnpCP->m_upnpLib.processUPnPErrorMessage( + msg.str(), sv_event->ErrCode, NULL, NULL); + } else { +#if 0 + // Warning: The use of UpnpGetServiceVarStatus and + // UpnpGetServiceVarStatusAsync is deprecated by the + // UPnP forum. + TvCtrlPointHandleGetVar( + sv_event->CtrlUrl, + sv_event->StateVarName, + sv_event->CurrentVal ); +#endif + } + break; + } + // ignore these cases, since this is not a device + case UPNP_CONTROL_GET_VAR_REQUEST: + //fprintf(stderr, "Callback: UPNP_CONTROL_GET_VAR_REQUEST\n"); + msg << "error(UPNP_CONTROL_GET_VAR_REQUEST): "; + goto eventSubscriptionRequest; + case UPNP_CONTROL_ACTION_REQUEST: + //fprintf(stderr, "Callback: UPNP_CONTROL_ACTION_REQUEST\n"); + msg << "error(UPNP_CONTROL_ACTION_REQUEST): "; + goto eventSubscriptionRequest; + case UPNP_EVENT_SUBSCRIPTION_REQUEST: + //fprintf(stderr, "Callback: UPNP_EVENT_SUBSCRIPTION_REQUEST\n"); + msg << "error(UPNP_EVENT_SUBSCRIPTION_REQUEST): "; +eventSubscriptionRequest: + msg << "This is not a UPnP Device, this is a UPnP Control Point, event ignored."; + AddDebugLogLineM(true, logUPnP, msg); + break; + default: + // Humm, this is not good, we forgot to handle something... + fprintf(stderr, + "Callback: default... Unknown event:'%d', not good.\n", + EventType); + msg << "error(UPnP::Callback): Event not handled:'" << + EventType << "'."; + fprintf(stderr, "%s\n", msg.str().c_str()); + AddDebugLogLineM(true, logUPnP, msg); + // Better not throw in the callback. Who would catch it? + //throw CUPnPException(msg); + break; + } + + return 0; +} + + +void CUPnPControlPoint::OnEventReceived( + const std::string &Sid, + int EventKey, + IXML_Document *ChangedVariablesDoc) +{ + std::ostringstream msg; + msg << "UPNP_EVENT_RECEIVED:" << + "\n SID: " << Sid << + "\n Key: " << EventKey << + "\n Property list:"; + IXML_Element *root = + m_upnpLib.Element_GetRootElement(ChangedVariablesDoc); + IXML_Element *child = + m_upnpLib.Element_GetFirstChild(root); + if (child) { + while (child) { + IXML_Element *child2 = + m_upnpLib.Element_GetFirstChild(child); + const DOMString childTag = + m_upnpLib.Element_GetTag(child2); + std::string childValue = + m_upnpLib.Element_GetTextValue(child2); + msg << "\n " << + childTag << "='" << + childValue << "'"; + child = m_upnpLib.Element_GetNextSibling(child); + } + } else { + msg << "\n Empty property list."; + } + AddDebugLogLineM(true, logUPnP, msg); + // Freeing that doc segfaults. Probably should not be freed. + //m_upnpLib.m_ixmlDocument_free(ChangedVariablesDoc); +} + + +void CUPnPControlPoint::AddRootDevice( + IXML_Element *rootDevice, const std::string &urlBase, + const char *location, int expires) +{ + // Lock the Root Device List + CUPnPMutexLocker lock(m_RootDeviceListMutex); + + // Root node's URLBase + std::string OriginalURLBase(urlBase); + std::string FixedURLBase(OriginalURLBase.empty() ? + location : + OriginalURLBase); + + // Get the UDN (Unique Device Name) + std::string UDN( + m_upnpLib.Element_GetChildValueByTag(rootDevice, "UDN")); + RootDeviceMap::iterator it = m_RootDeviceMap.find(UDN); + bool alreadyAdded = it != m_RootDeviceMap.end(); + if (alreadyAdded) { + // Just set the expires field + it->second->SetExpires(expires); + } else { + // Add a new root device to the root device list + CUPnPRootDevice *upnpRootDevice = new CUPnPRootDevice( + *this, m_upnpLib, rootDevice, + OriginalURLBase, FixedURLBase, + location, expires); + m_RootDeviceMap[upnpRootDevice->GetUDN()] = upnpRootDevice; + } +} + + +void CUPnPControlPoint::RemoveRootDevice(const char *udn) +{ + // Lock the Root Device List + CUPnPMutexLocker lock(m_RootDeviceListMutex); + + // Remove + std::string UDN(udn); + RootDeviceMap::iterator it = m_RootDeviceMap.find(UDN); + if (it != m_RootDeviceMap.end()) { + delete it->second; + m_RootDeviceMap.erase(UDN); + } +} + + +void CUPnPControlPoint::Subscribe(CUPnPService &service) +{ + std::ostringstream msg; + int errcode = m_upnpLib.m_UpnpSubscribe(m_UPnPClientHandle, + service.GetAbsEventSubURL().c_str(), + service.GetTimeoutAddr(), + service.GetSID()); + if (errcode == UPNP_E_SUCCESS) { + m_ServiceMap[service.GetAbsEventSubURL()] = &service; + msg << "Successfully subscribed to service " << + service.GetServiceType() << ", absEventSubURL: " << + service.GetAbsEventSubURL() << "."; + AddLogLineM(true, logUPnP, msg); + + IXML_Document *scpdDoc = NULL; + errcode = m_upnpLib.m_UpnpDownloadXmlDoc( + service.GetAbsSCPDURL().c_str(), &scpdDoc); + if (errcode == UPNP_E_SUCCESS) { + // Get the root node + IXML_Element *scpdRoot = + m_upnpLib.Element_GetRootElement(scpdDoc); + CUPnPSCPD *scpd = new CUPnPSCPD(*this, m_upnpLib, + scpdRoot, service.GetAbsSCPDURL()); + service.SetSCPD(scpd); + } else { + msg.str(""); + msg << "Error getting SCPD Document from " << + service.GetAbsSCPDURL() << "."; + AddLogLineM(true, logUPnP, msg); + } + } else { + msg << "Error subscribing to service " << + service.GetServiceType() << ", absEventSubURL: " << + service.GetAbsEventSubURL() << ", error: " << + m_upnpLib.GetUPnPErrorMessage(errcode) << "."; + goto error; + } + + return; + + // Error processing +error: + AddLogLineM(true, logUPnP, msg); +} + + +void CUPnPControlPoint::Unsubscribe(CUPnPService &service) +{ + ServiceMap::iterator it = m_ServiceMap.find(service.GetAbsEventSubURL()); + m_ServiceMap.erase(it); + m_upnpLib.m_UpnpUnSubscribe(m_UPnPClientHandle, service.GetSID()); +} + + +// File_checked_for_headers diff --git a/src/UPnP.h b/src/UPnP.h new file mode 100644 index 00000000..cab35990 --- /dev/null +++ b/src/UPnP.h @@ -0,0 +1,696 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2006-2008 Marcelo Roberto Jimenez ( phoenix@amule.org ) +// Copyright (c) 2006-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +// This define must not conflict with the one in the standard header +#ifndef AMULE_UPNP_H +#define AMULE_UPNP_H + + +#include +#include +#include + + +#include "UPnPCompatibility.h" + + +#ifdef UPNP_C + std::string stdEmptyString; +#else // UPNP_C + extern std::string stdEmptyString; +#endif // UPNP_C + + +/** + * Case insensitive std::string comparison + */ +bool stdStringIsEqualCI( + const std::string &s1, + const std::string &s2); + + +class CUPnPPortMapping +{ +private: + std::string m_port; + std::string m_protocol; + std::string m_enabled; + std::string m_description; + std::string m_key; + +public: + CUPnPPortMapping( + int port = 0, + const std::string &protocol = stdEmptyString, + bool enabled = false, + const std::string &description = stdEmptyString); + ~CUPnPPortMapping() {} + + const std::string &getPort() const + { return m_port; } + const std::string &getProtocol() const + { return m_protocol; } + const std::string &getEnabled() const + { return m_enabled; } + const std::string &getDescription() const + { return m_description; } + const std::string &getKey() const + { return m_key; } +}; + + +class CDynamicLibHandle +{ +private: + std::string m_libname; + void *const m_LibraryHandle; + CDynamicLibHandle(const CDynamicLibHandle &); + CDynamicLibHandle &operator=(const CDynamicLibHandle &); + +public: + CDynamicLibHandle(const char *libname); + ~CDynamicLibHandle(); + void *Get() const { return m_LibraryHandle; } +}; + + +class CUPnPControlPoint; + + +class CUPnPLib +{ +public: + static const std::string &UPNP_ROOT_DEVICE; + static const std::string &UPNP_DEVICE_IGW; + static const std::string &UPNP_DEVICE_WAN; + static const std::string &UPNP_DEVICE_WAN_CONNECTION; + static const std::string &UPNP_DEVICE_LAN; + static const std::string &UPNP_SERVICE_LAYER3_FORWARDING; + static const std::string &UPNP_SERVICE_WAN_COMMON_INTERFACE_CONFIG; + static const std::string &UPNP_SERVICE_WAN_IP_CONNECTION; + static const std::string &UPNP_SERVICE_WAN_PPP_CONNECTION; + CUPnPControlPoint &m_ctrlPoint; + +private: + // dlopen stuff + static const int NUM_LIB_IXML_SYMBOLS = 8; + static const char *s_LibIXMLSymbols[NUM_LIB_IXML_SYMBOLS]; + static const int NUM_LIB_UPNP_SYMBOLS = 17; + static const char *s_LibUPnPSymbols[NUM_LIB_UPNP_SYMBOLS]; + CDynamicLibHandle m_LibIXMLHandle; + CDynamicLibHandle m_LibUPnPHandle2; + CDynamicLibHandle m_LibUPnPHandle3; + CDynamicLibHandle *m_LibUPnPHandle; + const std::string addLibraryPath(const char *name); + +public: + CUPnPLib(CUPnPControlPoint &ctrlPoint); + ~CUPnPLib() {} + + // Convenience function so we don't have to write explicit calls + // to char2unicode every time + std::string GetUPnPErrorMessage(int code) const; + + // Convenience function to avoid repetitive processing of error + // messages + std::string processUPnPErrorMessage( + const std::string &messsage, + int code, + const DOMString errorString, + IXML_Document *doc) const; + + // Processing response to actions + void ProcessActionResponse( + IXML_Document *RespDoc, + const std::string &actionName) const; + + // IXML_Element + IXML_Element *Element_GetRootElement( + IXML_Document *doc) const; + IXML_Element *Element_GetFirstChild( + IXML_Element *parent) const; + IXML_Element *Element_GetNextSibling( + IXML_Element *child) const; + const DOMString Element_GetTag( + IXML_Element *element) const; + const std::string Element_GetTextValue( + IXML_Element *element) const; + const std::string Element_GetChildValueByTag( + IXML_Element *element, + const DOMString tag) const; + IXML_Element *Element_GetFirstChildByTag( + IXML_Element *element, + const DOMString tag) const; + IXML_Element *Element_GetNextSiblingByTag( + IXML_Element *element, + const DOMString tag) const; + const std::string Element_GetAttributeByTag( + IXML_Element *element, + const DOMString tag) const; + + // ixml api + IXML_Node *(*m_ixmlNode_getFirstChild)(IXML_Node *nodeptr); + IXML_Node *(*m_ixmlNode_getNextSibling)(IXML_Node *nodeptr); + const DOMString (*m_ixmlNode_getNodeName)(IXML_Node *nodeptr); + const DOMString (*m_ixmlNode_getNodeValue)(IXML_Node *nodeptr); + IXML_NamedNodeMap *(*m_ixmlNode_getAttributes)(IXML_Node *nodeptr); + void (*m_ixmlDocument_free)(IXML_Document *doc); + IXML_Node *(*m_ixmlNamedNodeMap_getNamedItem)( + IXML_NamedNodeMap *nnMap, const DOMString name); + void (*m_ixmlNamedNodeMap_free)(IXML_NamedNodeMap *nnMap); + + // upnp api + // 1 - Initialization and Registration + int (*m_UpnpInit)(const char *IPAddress, int Port); + void (*m_UpnpFinish)(); + unsigned short (*m_UpnpGetServerPort)(); + char *(*m_UpnpGetServerIpAddress)(); + int (*m_UpnpRegisterClient)(Upnp_FunPtr Callback, + const void *Cookie, UpnpClient_Handle *Hnd); + int (*m_UpnpUnRegisterClient)(UpnpClient_Handle Hnd); + // 2 - Discovery + int (*m_UpnpSearchAsync)(UpnpClient_Handle Hnd, int Mx, + const char *Target, const void *Cookie); + // 3 - Control + int (*m_UpnpGetServiceVarStatus)(UpnpClient_Handle Hnd, const char *ActionURL, + const char *VarName, DOMString *StVarVal); + int (*m_UpnpSendAction)(UpnpClient_Handle Hnd, const char *ActionURL, + const char *ServiceType, const char *DevUDN, IXML_Document *Action, + IXML_Document **RespNode); + int (*m_UpnpSendActionAsync)(UpnpClient_Handle Hnd, const char *ActionURL, + const char *ServiceType, const char *DevUDN, IXML_Document *Action, + Upnp_FunPtr Callback, const void *Cookie); + // 4 - Eventing + int (*m_UpnpSubscribe)(UpnpClient_Handle Hnd, + const char *PublisherUrl, int *TimeOut, Upnp_SID SubsId); + int (*m_UpnpUnSubscribe)(UpnpClient_Handle Hnd, Upnp_SID SubsId); + // 5 - HTTP + int (*m_UpnpDownloadXmlDoc)(const char *url, IXML_Document **xmlDoc); + // 6 - Optional Tools API + int (*m_UpnpResolveURL)(const char *BaseURL, + const char *RelURL, char *AbsURL); + IXML_Document *(*m_UpnpMakeAction)( + const char *ActionName, const char *ServType, int NumArg, + const char *Arg, ...); + int (*m_UpnpAddToAction)( + IXML_Document **ActionDoc, const char *ActionName, + const char *ServType, const char *ArgName, const char *ArgVal); + const char *(*m_UpnpGetErrorMessage)(int ErrorCode); +}; + + +class CUPnPControlPoint; + +/* + * Even though we can retrieve the upnpLib handler from the upnpControlPoint, + * we must pass it separetly at this point, because the class CUPnPControlPoint + * must be declared after. + * + * CUPnPLib can only be removed from the constructor once we agree to link to + * UPnPLib explicitly, making this dlopen() stuff unnecessary. + */ +template +class CXML_List : public std::map +{ +public: + CXML_List( + const CUPnPControlPoint &upnpControlPoint, + CUPnPLib &upnpLib, + IXML_Element *parent, + const std::string &url); + ~CXML_List(); +}; + + +template +CXML_List::CXML_List( + const CUPnPControlPoint &upnpControlPoint, + CUPnPLib &upnpLib, + IXML_Element *parent, + const std::string &url) +{ + IXML_Element *elementList = + upnpLib.Element_GetFirstChildByTag(parent, XML_LIST_NAME); + unsigned int i = 0; + for ( IXML_Element *element = upnpLib.Element_GetFirstChildByTag(elementList, XML_ELEMENT_NAME); + element; + element = upnpLib.Element_GetNextSiblingByTag(element, XML_ELEMENT_NAME)) { + // Add a new element to the element list + T *upnpElement = new T(upnpControlPoint, upnpLib, element, url); + (*this)[upnpElement->GetKey()] = upnpElement; + ++i; + } + std::ostringstream msg; + msg << "\n " << XML_LIST_NAME << ": " << + i << " " << XML_ELEMENT_NAME << "s."; + AddDebugLogLineM(false, logUPnP, msg); +} + + +template +CXML_List::~CXML_List() +{ + typename CXML_List::iterator it; + for(it = this->begin(); it != this->end(); ++it) { + delete (*it).second; + } +} + +#ifdef UPNP_C + char s_argument[] = "argument"; + char s_argumentList[] = "argumentList"; + char s_action[] = "action"; + char s_actionList[] = "actionList"; + char s_allowedValue[] = "allowedValue"; + char s_allowedValueList[] = "allowedValueList"; + char s_stateVariable[] = "stateVariable"; + char s_serviceStateTable[] = "serviceStateTable"; + char s_service[] = "service"; + char s_serviceList[] = "serviceList"; + char s_device[] = "device"; + char s_deviceList[] = "deviceList"; +#else // UPNP_C + extern char s_argument[]; + extern char s_argumentList[]; + extern char s_action[]; + extern char s_actionList[]; + extern char s_allowedValue[]; + extern char s_allowedValueList[]; + extern char s_stateVariable[]; + extern char s_serviceStateTable[]; + extern char s_service[]; + extern char s_serviceList[]; + extern char s_device[]; + extern char s_deviceList[]; +#endif // UPNP_C + + +class CUPnPArgument; +typedef CXML_List ArgumentList; +class CUPnPAction; +typedef CXML_List ActionList; +class CUPnPStateVariable; +typedef CXML_List ServiceStateTable; +class CUPnPAllowedValue; +typedef CXML_List AllowedValueList; +class CUPnPService; +typedef CXML_List ServiceList; +class CUPnPDevice; +typedef CXML_List DeviceList; + + +class CUPnPError +{ +private: + IXML_Element *m_root; + const std::string m_ErrorCode; + const std::string m_ErrorDescription; +public: + CUPnPError( + const CUPnPLib &upnpLib, + IXML_Document *errorDoc); + ~CUPnPError() {} + const std::string &getErrorCode() const + { return m_ErrorCode; } + const std::string &getErrorDescription() const + { return m_ErrorDescription; } +}; + + +class CUPnPArgument +{ +private: + const CUPnPControlPoint &m_UPnPControlPoint; + const std::string m_name; + const std::string m_direction; + bool m_retval; + const std::string m_relatedStateVariable; + +public: + CUPnPArgument( + const CUPnPControlPoint &upnpControlPoint, + CUPnPLib &upnpLib, + IXML_Element *argument, + const std::string &SCPDURL); + ~CUPnPArgument() {} + const std::string &GetName() const + { return m_name; } + const std::string &GetDirection() const + { return m_direction; } + bool GetRetVal() const + { return m_retval; } + const std::string &GetRelatedStateVariable() const + { return m_relatedStateVariable; } + const std::string &GetKey() const + { return m_name; } +}; + + + +class CUPnPAction +{ +private: + const CUPnPControlPoint &m_UPnPControlPoint; + ArgumentList m_ArgumentList; + const std::string m_name; + +public: + CUPnPAction( + const CUPnPControlPoint &upnpControlPoint, + CUPnPLib &upnpLib, + IXML_Element *action, + const std::string &SCPDURL); + ~CUPnPAction() {} + const std::string &GetName() const + { return m_name; } + const std::string &GetKey() const + { return m_name; } + const ArgumentList &GetArgumentList() const + { return m_ArgumentList; } +}; + + +class CUPnPAllowedValue +{ +private: + const CUPnPControlPoint &m_UPnPControlPoint; + const std::string m_allowedValue; + +public: + CUPnPAllowedValue( + const CUPnPControlPoint &upnpControlPoint, + CUPnPLib &upnpLib, + IXML_Element *allowedValue, + const std::string &SCPDURL); + ~CUPnPAllowedValue() {} + const std::string &GetAllowedValue() const + { return m_allowedValue; } + const std::string &GetKey() const + { return m_allowedValue; } +}; + + +class CUPnPStateVariable +{ +private: + const CUPnPControlPoint &m_UPnPControlPoint; + AllowedValueList m_AllowedValueList; + const std::string m_name; + const std::string m_dataType; + const std::string m_defaultValue; + const std::string m_sendEvents; + +public: + CUPnPStateVariable( + const CUPnPControlPoint &upnpControlPoint, + CUPnPLib &upnpLib, + IXML_Element *stateVariable, + const std::string &URLBase); + ~CUPnPStateVariable() {} + const std::string &GetNname() const + { return m_name; } + const std::string &GetDataType() const + { return m_dataType; } + const std::string &GetDefaultValue() const + { return m_defaultValue; } + const std::string &GetKey() const + { return m_name; } + const AllowedValueList &GetAllowedValueList() const + { return m_AllowedValueList; } +}; + + +class CUPnPSCPD +{ +private: + const CUPnPControlPoint &m_UPnPControlPoint; + ActionList m_ActionList; + ServiceStateTable m_ServiceStateTable; + const std::string m_SCPDURL; + +public: + CUPnPSCPD( + const CUPnPControlPoint &upnpControlPoint, + CUPnPLib &upnpLib, + IXML_Element *scpd, + const std::string &SCPDURL); + ~CUPnPSCPD() {} + const ActionList &GetActionList() const + { return m_ActionList; } + const ServiceStateTable &GetServiceStateTable() const + { return m_ServiceStateTable; } +}; + + +class CUPnPArgumentValue +{ +private: + std::string m_argument; + std::string m_value; + +public: + CUPnPArgumentValue(); + CUPnPArgumentValue(const std::string &argument, const std::string &value); + ~CUPnPArgumentValue() {} + + const std::string &GetArgument() const { return m_argument; } + const std::string &GetValue() const { return m_value; } + const std::string &SetArgument(const std::string& argument) { return m_argument = argument; } + const std::string &SetValue(const std::string &value) { return m_value = value; } +}; + + +class CUPnPService +{ +private: + const CUPnPControlPoint &m_UPnPControlPoint; + CUPnPLib &m_upnpLib; + const std::string m_serviceType; + const std::string m_serviceId; + const std::string m_SCPDURL; + const std::string m_controlURL; + const std::string m_eventSubURL; + std::string m_absSCPDURL; + std::string m_absControlURL; + std::string m_absEventSubURL; + int m_timeout; + Upnp_SID m_SID; + std::auto_ptr m_SCPD; + +public: + CUPnPService( + const CUPnPControlPoint &upnpControlPoint, + CUPnPLib &upnpLib, + IXML_Element *service, + const std::string &URLBase); + ~CUPnPService(); + + const std::string &GetServiceType() const + { return m_serviceType; } + const std::string &GetServiceId() const + { return m_serviceId; } + const std::string &GetSCPDURL() const + { return m_SCPDURL; } + const std::string &GetAbsSCPDURL() const + { return m_absSCPDURL; } + const std::string &GetControlURL() const + { return m_controlURL; } + const std::string &GetEventSubURL() const + { return m_eventSubURL; } + const std::string &GetAbsControlURL() const + { return m_absControlURL; } + const std::string &GetAbsEventSubURL() const + { return m_absEventSubURL; } + int GetTimeout() const + { return m_timeout; } + void SetTimeout(int t) + { m_timeout = t; } + int *GetTimeoutAddr() + { return &m_timeout; } + char *GetSID() + { return m_SID; } + void SetSID(const char *s) + { memcpy(m_SID, s, sizeof(Upnp_SID)); } + const std::string &GetKey() const + { return m_serviceId; } + bool IsSubscribed() const + { return m_SCPD.get() != NULL; } + void SetSCPD(CUPnPSCPD *SCPD) + { m_SCPD.reset(SCPD); } + + bool Execute( + const std::string &ActionName, + const std::vector &ArgValue) const; + const std::string GetStateVariable( + const std::string &stateVariableName) const; +}; + + +class CUPnPDevice +{ +private: + const CUPnPControlPoint &m_UPnPControlPoint; + + // Please, lock these lists before use + DeviceList m_DeviceList; + ServiceList m_ServiceList; + + const std::string m_deviceType; + const std::string m_friendlyName; + const std::string m_manufacturer; + const std::string m_manufacturerURL; + const std::string m_modelDescription; + const std::string m_modelName; + const std::string m_modelNumber; + const std::string m_modelURL; + const std::string m_serialNumber; + const std::string m_UDN; + const std::string m_UPC; + std::string m_presentationURL; + +public: + CUPnPDevice( + const CUPnPControlPoint &upnpControlPoint, + CUPnPLib &upnpLib, + IXML_Element *device, + const std::string &URLBase); + ~CUPnPDevice() {} + + const std::string &GetUDN() const + { return m_UDN; } + const std::string &GetDeviceType() const + { return m_deviceType; } + const std::string &GetFriendlyName() const + { return m_friendlyName; } + const std::string &GetPresentationURL() const + { return m_presentationURL; } + const std::string &GetKey() const + { return m_UDN; } +}; + + +class CUPnPRootDevice : public CUPnPDevice +{ +private: + const CUPnPControlPoint &m_UPnPControlPoint; + const std::string m_URLBase; + const std::string m_location; + int m_expires; + +public: + CUPnPRootDevice( + const CUPnPControlPoint &upnpControlPoint, + CUPnPLib &upnpLib, + IXML_Element *rootDevice, + const std::string &OriginalURLBase, + const std::string &FixedURLBase, + const char *location, + int expires); + ~CUPnPRootDevice() {} + + const std::string &GetURLBase() const + { return m_URLBase; } + const std::string &GetLocation() const + { return m_location; } + int GetExpires() const + { return m_expires; } + void SetExpires(int expires) + { m_expires = expires; } +}; + + +typedef std::map RootDeviceMap; +typedef std::map ServiceMap; +typedef std::map PortMappingMap; + + +class CUPnPControlPoint +{ +private: + static CUPnPControlPoint *s_CtrlPoint; + // upnp stuff + CUPnPLib m_upnpLib; + UpnpClient_Handle m_UPnPClientHandle; + RootDeviceMap m_RootDeviceMap; + ServiceMap m_ServiceMap; + PortMappingMap m_ActivePortMappingsMap; + CUPnPMutex m_RootDeviceListMutex; + bool m_IGWDeviceDetected; +//#warning This variable is for testing purposes only and should disappear on release. + CUPnPService *m_WanService; + CUPnPMutex m_WaitForSearchTimeoutMutex; + +public: + CUPnPControlPoint(unsigned short udpPort); + ~CUPnPControlPoint(); + void Subscribe(CUPnPService &service); + void Unsubscribe(CUPnPService &service); + bool AddPortMappings( + std::vector &upnpPortMapping); + bool DeletePortMappings( + std::vector &upnpPortMapping); + + UpnpClient_Handle GetUPnPClientHandle() const + { return m_UPnPClientHandle; } + + bool GetIGWDeviceDetected() const + { return m_IGWDeviceDetected; } + void SetIGWDeviceDetected(bool b) + { m_IGWDeviceDetected = b; } + bool WanServiceDetected() const + { return !m_ServiceMap.empty(); } + void SetWanService(CUPnPService *service) + { m_WanService = service; } + + // Callback function + static int Callback( + Upnp_EventType EventType, + void* Event, + void* Cookie); + +private: + void OnEventReceived( + const std::string &Sid, + int EventKey, + IXML_Document *ChangedVariables); + void AddRootDevice( + IXML_Element *rootDevice, + const std::string &urlBase, + const char *location, + int expires); + void RemoveRootDevice( + const char *udn); + void RefreshPortMappings(); + bool PrivateAddPortMapping( + CUPnPPortMapping &upnpPortMapping); + bool PrivateDeletePortMapping( + CUPnPPortMapping &upnpPortMapping); +}; + + +#endif /* AMULE_UPNP_H */ + +// File_checked_for_headers diff --git a/src/UPnPCompatibility.cpp b/src/UPnPCompatibility.cpp new file mode 100644 index 00000000..55d1b8f5 --- /dev/null +++ b/src/UPnPCompatibility.cpp @@ -0,0 +1,49 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2006-2008 Marcelo Roberto Jimenez ( phoenix@amule.org ) +// Copyright (c) 2006-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "UPnPCompatibility.h" + + +void CLogger::AddLogLine( + const wxString &file, + int line, + bool critical, + const std::ostringstream &msg) +{ + AddLogLine(file, line, critical, char2unicode(msg.str().c_str())); +} + + +void CLogger::AddLogLine( + const wxString &file, + int line, + bool critical, + DebugType type, + const std::ostringstream &msg) +{ + AddLogLine(file, line, critical, type, char2unicode(msg.str().c_str())); +} + diff --git a/src/UPnPCompatibility.h b/src/UPnPCompatibility.h new file mode 100644 index 00000000..01df0a2d --- /dev/null +++ b/src/UPnPCompatibility.h @@ -0,0 +1,77 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2006-2008 Marcelo Roberto Jimenez ( phoenix@amule.org ) +// Copyright (c) 2006-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#ifndef UPNPCOMPATIBILITY_H +#define UPNPCOMPATIBILITY_H + +#include "extern/upnp/upnp.h" + + +#include + + +#include // for CMuleException:: +#include // for char2unicode() + + +#include "Logger.h" // for Add(Debug)LogLineM() + + +namespace CLogger +{ + void AddLogLine( + const wxString &file, + int line, + bool critical, + const std::ostringstream &msg); + void AddLogLine( + const wxString &file, + int line, + bool critical, + DebugType type, + const std::ostringstream &msg); +} + + +class CUPnPException : public CMuleException +{ +public: + CUPnPException(const std::ostringstream& msg) + : + CMuleException( + wxT("CUPnPException"), + wxString(char2unicode(msg.str().c_str()))) {} +}; + + +// There is no need to create mutex/mutex locker classes using ithread.h +// because wx already has them. +#define CUPnPMutex wxMutex +#define CUPnPMutexLocker wxMutexLocker + + +#endif // UPNPCOMPATIBILITY_H + diff --git a/src/UploadBandwidthThrottler.cpp b/src/UploadBandwidthThrottler.cpp new file mode 100644 index 00000000..3b5606c5 --- /dev/null +++ b/src/UploadBandwidthThrottler.cpp @@ -0,0 +1,501 @@ +// +// This file is part of the aMule Project. +// +// Copyright (C) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "UploadBandwidthThrottler.h" + +#include +#include +#include + +#include +#include // Do_not_auto_remove (NetBSD) +#include "OtherFunctions.h" +#include "ThrottledSocket.h" +#include "Logger.h" +#include "Preferences.h" +#include "amule.h" +#include "Statistics.h" + +#ifndef _MSC_VER + +#ifdef _UI64_MAX +#undef _UI64_MAX +#endif + +#ifdef _I64_MAX +#undef _I64_MAX +#endif + +const uint32 _UI32_MAX = std::numeric_limits::max(); +const sint32 _I32_MAX = std::numeric_limits::max(); +const uint64 _UI64_MAX = std::numeric_limits::max(); +const sint64 _I64_MAX = std::numeric_limits::max(); + +#endif + +///////////////////////////////////// + + +/** + * The constructor starts the thread. + */ +UploadBandwidthThrottler::UploadBandwidthThrottler() + : wxThread( wxTHREAD_JOINABLE ) +{ + m_SentBytesSinceLastCall = 0; + m_SentBytesSinceLastCallOverhead = 0; + + m_doRun = true; + + Create(); + Run(); +} + + +/** + * The destructor stops the thread. If the thread has already stoppped, destructor does nothing. + */ +UploadBandwidthThrottler::~UploadBandwidthThrottler() +{ + EndThread(); +} + + +/** + * Find out how many bytes that has been put on the sockets since the last call to this + * method. Includes overhead of control packets. + * + * @return the number of bytes that has been put on the sockets since the last call + */ +uint64 UploadBandwidthThrottler::GetNumberOfSentBytesSinceLastCallAndReset() +{ + wxMutexLocker lock( m_sendLocker ); + + uint64 numberOfSentBytesSinceLastCall = m_SentBytesSinceLastCall; + m_SentBytesSinceLastCall = 0; + + return numberOfSentBytesSinceLastCall; +} + +/** + * Find out how many bytes that has been put on the sockets since the last call to this + * method. Excludes overhead of control packets. + * + * @return the number of bytes that has been put on the sockets since the last call + */ +uint64 UploadBandwidthThrottler::GetNumberOfSentBytesOverheadSinceLastCallAndReset() +{ + wxMutexLocker lock( m_sendLocker ); + + uint64 numberOfSentBytesSinceLastCall = m_SentBytesSinceLastCallOverhead; + m_SentBytesSinceLastCallOverhead = 0; + + return numberOfSentBytesSinceLastCall; +} + + +/** + * Add a socket to the list of sockets that have upload slots. The main thread will + * continously call send on these sockets, to give them chance to work off their queues. + * The sockets are called in the order they exist in the list, so the top socket (index 0) + * will be given a chance first to use bandwidth, and then the next socket (index 1) etc. + * + * It is possible to add a socket several times to the list without removing it inbetween, + * but that should be avoided. + * + * @param index insert the socket at this place in the list. An index that is higher than the + * current number of sockets in the list will mean that the socket should be inserted + * last in the list. + * + * @param socket the address to the socket that should be added to the list. If the address is NULL, + * this method will do nothing. + */ +void UploadBandwidthThrottler::AddToStandardList(uint32 index, ThrottledFileSocket* socket) +{ + if ( socket ) { + wxMutexLocker lock( m_sendLocker ); + + RemoveFromStandardListNoLock(socket); + if (index > (uint32)m_StandardOrder_list.size()) { + index = m_StandardOrder_list.size(); + } + + m_StandardOrder_list.insert(m_StandardOrder_list.begin() + index, socket); + } +} + + +/** + * Remove a socket from the list of sockets that have upload slots. + * + * If the socket has mistakenly been added several times to the list, this method + * will return all of the entries for the socket. + * + * @param socket the address of the socket that should be removed from the list. If this socket + * does not exist in the list, this method will do nothing. + */ +bool UploadBandwidthThrottler::RemoveFromStandardList(ThrottledFileSocket* socket) +{ + wxMutexLocker lock( m_sendLocker ); + + return RemoveFromStandardListNoLock(socket); +} + + +/** + * Remove a socket from the list of sockets that have upload slots. NOT THREADSAFE! + * This is an internal method that doesn't take the necessary lock before it removes + * the socket. This method should only be called when the current thread already owns + * the m_sendLocker lock! + * + * @param socket address of the socket that should be removed from the list. If this socket + * does not exist in the list, this method will do nothing. + */ +bool UploadBandwidthThrottler::RemoveFromStandardListNoLock(ThrottledFileSocket* socket) +{ + return EraseFirstValue( m_StandardOrder_list, socket ); +} + + +/** +* Notifies the send thread that it should try to call controlpacket send +* for the supplied socket. It is allowed to call this method several times +* for the same socket, without having controlpacket send called for the socket +* first. The doublette entries are never filtered, since it is incurs less cpu +* overhead to simply call Send() in the socket for each double. Send() will +* already have done its work when the second Send() is called, and will just +* return with little cpu overhead. +* +* @param socket address to the socket that requests to have controlpacket send +* to be called on it +*/ +void UploadBandwidthThrottler::QueueForSendingControlPacket(ThrottledControlSocket* socket, bool hasSent) +{ + // Get critical section + wxMutexLocker lock( m_tempQueueLocker ); + + if ( m_doRun ) { + if( hasSent ) { + m_TempControlQueueFirst_list.push_back(socket); + } else { + m_TempControlQueue_list.push_back(socket); + } + } +} + + + +/** + * Remove the socket from all lists and queues. This will make it safe to + * erase/delete the socket. It will also cause the main thread to stop calling + * send() for the socket. + * + * @param socket address to the socket that should be removed + */ +void UploadBandwidthThrottler::DoRemoveFromAllQueues(ThrottledControlSocket* socket) +{ + if ( m_doRun ) { + // Remove this socket from control packet queue + EraseValue( m_ControlQueue_list, socket ); + EraseValue( m_ControlQueueFirst_list, socket ); + + wxMutexLocker lock( m_tempQueueLocker ); + EraseValue( m_TempControlQueue_list, socket ); + EraseValue( m_TempControlQueueFirst_list, socket ); + } +} + + +void UploadBandwidthThrottler::RemoveFromAllQueues(ThrottledControlSocket* socket) +{ + wxMutexLocker lock( m_sendLocker ); + + DoRemoveFromAllQueues( socket ); +} + + +void UploadBandwidthThrottler::RemoveFromAllQueues(ThrottledFileSocket* socket) +{ + wxMutexLocker lock( m_sendLocker ); + + if (m_doRun) { + DoRemoveFromAllQueues(socket); + + // And remove it from upload slots + RemoveFromStandardListNoLock(socket); + } +} + + +/** + * Make the thread exit. This method will not return until the thread has stopped + * looping. This guarantees that the thread will not access the CEMSockets after this + * call has exited. + */ +void UploadBandwidthThrottler::EndThread() +{ + { + wxMutexLocker lock(m_sendLocker); + + // signal the thread to stop looping and exit. + m_doRun = false; + } + + Wait(); +} + + +/** + * The thread method that handles calling send for the individual sockets. + * + * Control packets will always be tried to be sent first. If there is any bandwidth leftover + * after that, send() for the upload slot sockets will be called in priority order until we have run + * out of available bandwidth for this loop. Upload slots will not be allowed to go without having sent + * called for more than a defined amount of time (i.e. two seconds). + * + * @return always returns 0. + */ +void* UploadBandwidthThrottler::Entry() +{ + const uint32 TIME_BETWEEN_UPLOAD_LOOPS = 1; + + uint32 lastLoopTick = ::GetTickCountFullRes(); + sint64 realBytesToSpend = 0; + uint32 allowedDataRate = 0; + uint32 rememberedSlotCounter = 0; + uint32 extraSleepTime = TIME_BETWEEN_UPLOAD_LOOPS; + + while (m_doRun) { + uint32 timeSinceLastLoop = ::GetTickCountFullRes() - lastLoopTick; + + // Get current speed from UploadSpeedSense + if (thePrefs::GetMaxUpload() == UNLIMITED) { + // Try to increase the upload rate + if (theApp->uploadqueue) { + allowedDataRate = (uint32)theStats::GetUploadRate() + 5 * 1024; + } else { + // App not created yet or already destroyed. + allowedDataRate = (uint32)(-1); + } + } else { + allowedDataRate = thePrefs::GetMaxUpload() * 1024; + } + + uint32 minFragSize = 1300; + uint32 doubleSendSize = minFragSize*2; // send two packages at a time so they can share an ACK + if (allowedDataRate < 6*1024) { + minFragSize = 536; + doubleSendSize = minFragSize; // don't send two packages at a time at very low speeds to give them a smoother load + } + + + uint32 sleepTime; + if(allowedDataRate == 0 || allowedDataRate == _UI32_MAX || realBytesToSpend >= 1000) { + // we could send at once, but sleep a while to not suck up all cpu + sleepTime = extraSleepTime; + } else { + // sleep for just as long as we need to get back to having one byte to send + sleepTime = std::max((uint32)ceil((double)(-realBytesToSpend + 1000)/allowedDataRate), extraSleepTime); + } + + if(timeSinceLastLoop < sleepTime) { + Sleep(sleepTime-timeSinceLastLoop); + } + + const uint32 thisLoopTick = ::GetTickCountFullRes(); + timeSinceLastLoop = thisLoopTick - lastLoopTick; + + // Calculate how many bytes we can spend + sint64 bytesToSpend = 0; + + if(allowedDataRate != 0 && allowedDataRate != _UI32_MAX) { + // prevent overflow + if(timeSinceLastLoop == 0) { + // no time has passed, so don't add any bytes. Shouldn't happen. + bytesToSpend = 0; //realBytesToSpend/1000; + } else if(_I64_MAX/timeSinceLastLoop > allowedDataRate && _I64_MAX-allowedDataRate*timeSinceLastLoop > realBytesToSpend) { + if(timeSinceLastLoop > sleepTime + 2000) { + AddDebugLogLineM(false, logGeneral, wxString::Format(wxT("UploadBandwidthThrottler: Time since last loop too long. time: %ims wanted: %ims Max: %ims"), timeSinceLastLoop, sleepTime, sleepTime + 2000)); + + timeSinceLastLoop = sleepTime + 2000; + lastLoopTick = thisLoopTick - timeSinceLastLoop; + } + + realBytesToSpend += allowedDataRate*timeSinceLastLoop; + + bytesToSpend = realBytesToSpend/1000; + } else { + realBytesToSpend = _I64_MAX; + bytesToSpend = _I32_MAX; + } + } else { + realBytesToSpend = 0; //_I64_MAX; + bytesToSpend = _I32_MAX; + } + + lastLoopTick = thisLoopTick; + + if(bytesToSpend >= 1) { + uint64 spentBytes = 0; + uint64 spentOverhead = 0; + + wxMutexLocker sendLock(m_sendLocker); + + { + wxMutexLocker queueLock(m_tempQueueLocker); + + // are there any sockets in m_TempControlQueue_list? Move them to normal m_ControlQueue_list; + m_ControlQueueFirst_list.insert( m_ControlQueueFirst_list.end(), + m_TempControlQueueFirst_list.begin(), + m_TempControlQueueFirst_list.end() ); + + m_ControlQueue_list.insert( m_ControlQueue_list.end(), + m_TempControlQueue_list.begin(), + m_TempControlQueue_list.end() ); + + m_TempControlQueue_list.clear(); + m_TempControlQueueFirst_list.clear(); + } + + // Send any queued up control packets first + while(bytesToSpend > 0 && spentBytes < (uint64)bytesToSpend && (!m_ControlQueueFirst_list.empty() || !m_ControlQueue_list.empty())) { + ThrottledControlSocket* socket = NULL; + + if(!m_ControlQueueFirst_list.empty()) { + socket = m_ControlQueueFirst_list.front(); + m_ControlQueueFirst_list.pop_front(); + } else if(!m_ControlQueue_list.empty()) { + socket = m_ControlQueue_list.front(); + m_ControlQueue_list.pop_front(); + } + + if(socket != NULL) { + SocketSentBytes socketSentBytes = socket->SendControlData(bytesToSpend-spentBytes, minFragSize); + uint32 lastSpentBytes = socketSentBytes.sentBytesControlPackets + socketSentBytes.sentBytesStandardPackets; + spentBytes += lastSpentBytes; + spentOverhead += socketSentBytes.sentBytesControlPackets; + } + } + + // Check if any sockets haven't gotten data for a long time. Then trickle them a package. + for ( uint32 slotCounter = 0; slotCounter < m_StandardOrder_list.size(); slotCounter++) { + ThrottledFileSocket* socket = m_StandardOrder_list[ slotCounter ]; + + if(socket != NULL) { + if(thisLoopTick-socket->GetLastCalledSend() > SEC2MS(1)) { + // trickle + uint32 neededBytes = socket->GetNeededBytes(); + + if(neededBytes > 0) { + SocketSentBytes socketSentBytes = socket->SendFileAndControlData(neededBytes, minFragSize); + uint32 lastSpentBytes = socketSentBytes.sentBytesControlPackets + socketSentBytes.sentBytesStandardPackets; + spentBytes += lastSpentBytes; + spentOverhead += socketSentBytes.sentBytesControlPackets; + } + } + } else { + AddDebugLogLineM(false, logGeneral, wxString::Format( wxT("There was a NULL socket in the UploadBandwidthThrottler Standard list (trickle)! Prevented usage. Index: %i Size: %i"), slotCounter, m_StandardOrder_list.size()) ); + } + } + + // Equal bandwidth for all slots + uint32 maxSlot = m_StandardOrder_list.size(); + if(maxSlot > 0 && allowedDataRate/maxSlot < UPLOAD_CLIENT_DATARATE) { + maxSlot = allowedDataRate/UPLOAD_CLIENT_DATARATE; + } + + for(uint32 maxCounter = 0; maxCounter < std::min(maxSlot, (uint32)m_StandardOrder_list.size()) && bytesToSpend > 0 && spentBytes < (uint64)bytesToSpend; maxCounter++) { + if(rememberedSlotCounter >= m_StandardOrder_list.size() || + rememberedSlotCounter >= maxSlot) { + rememberedSlotCounter = 0; + } + + ThrottledFileSocket* socket = m_StandardOrder_list[ rememberedSlotCounter ]; + + if(socket != NULL) { + SocketSentBytes socketSentBytes = socket->SendFileAndControlData(std::min(doubleSendSize, (uint32)(bytesToSpend-spentBytes)), doubleSendSize); + uint32 lastSpentBytes = socketSentBytes.sentBytesControlPackets + socketSentBytes.sentBytesStandardPackets; + + spentBytes += lastSpentBytes; + spentOverhead += socketSentBytes.sentBytesControlPackets; + } else { + AddDebugLogLineM(false, logGeneral, wxString::Format( wxT("There was a NULL socket in the UploadBandwidthThrottler Standard list (equal-for-all)! Prevented usage. Index: %i Size: %i"), rememberedSlotCounter, m_StandardOrder_list.size())); + } + + rememberedSlotCounter++; + } + + // Any bandwidth that hasn't been used yet are used first to last. + for(uint32 slotCounter = 0; slotCounter < m_StandardOrder_list.size() && bytesToSpend > 0 && spentBytes < (uint64)bytesToSpend; slotCounter++) { + ThrottledFileSocket* socket = m_StandardOrder_list[ slotCounter ]; + + if(socket != NULL) { + uint32 bytesToSpendTemp = bytesToSpend-spentBytes; + SocketSentBytes socketSentBytes = socket->SendFileAndControlData(bytesToSpendTemp, doubleSendSize); + uint32 lastSpentBytes = socketSentBytes.sentBytesControlPackets + socketSentBytes.sentBytesStandardPackets; + spentBytes += lastSpentBytes; + spentOverhead += socketSentBytes.sentBytesControlPackets; + } else { + AddDebugLogLineM( false, logGeneral, wxString::Format( wxT("There was a NULL socket in the UploadBandwidthThrottler Standard list (fully activated)! Prevented usage. Index: %i Size: %i"), slotCounter, m_StandardOrder_list.size())); + } + } + realBytesToSpend -= spentBytes*1000; + + if(realBytesToSpend < -(((sint64)m_StandardOrder_list.size()+1)*minFragSize)*1000) { + sint64 newRealBytesToSpend = -(((sint64)m_StandardOrder_list.size()+1)*minFragSize)*1000; + + realBytesToSpend = newRealBytesToSpend; + } else { + uint64 bandwidthSavedTolerance = m_StandardOrder_list.size()*512*1000; + if(realBytesToSpend > 0 && (uint64)realBytesToSpend > 999+bandwidthSavedTolerance) { + sint64 newRealBytesToSpend = 999+bandwidthSavedTolerance; + realBytesToSpend = newRealBytesToSpend; + } + } + + m_SentBytesSinceLastCall += spentBytes; + m_SentBytesSinceLastCallOverhead += spentOverhead; + + if ((spentBytes == 0) && (spentOverhead == 0)) { + extraSleepTime = std::min(extraSleepTime * 5, 1000); // 1s at most + } else { + extraSleepTime = TIME_BETWEEN_UPLOAD_LOOPS; + } + } + } + + { + wxMutexLocker queueLock(m_tempQueueLocker); + m_TempControlQueue_list.clear(); + m_TempControlQueueFirst_list.clear(); + } + + wxMutexLocker sendLock(m_sendLocker); + m_ControlQueue_list.clear(); + m_StandardOrder_list.clear(); + + return 0; +} +// File_checked_for_headers diff --git a/src/UploadBandwidthThrottler.h b/src/UploadBandwidthThrottler.h new file mode 100644 index 00000000..92030a19 --- /dev/null +++ b/src/UploadBandwidthThrottler.h @@ -0,0 +1,90 @@ +// +// This file is part of the aMule Project. +// +// Copyright (C) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef UPLOADBANDWIDTHTHROTTLER_H +#define UPLOADBANDWIDTHTHROTTLER_H + + +#include + +#include + +#include "Types.h" + +class ThrottledControlSocket; +class ThrottledFileSocket; + +class UploadBandwidthThrottler : public wxThread +{ +public: + UploadBandwidthThrottler(); + ~UploadBandwidthThrottler(); + + uint64 GetNumberOfSentBytesSinceLastCallAndReset(); + uint64 GetNumberOfSentBytesOverheadSinceLastCallAndReset(); + + void AddToStandardList(uint32 index, ThrottledFileSocket* socket); + bool RemoveFromStandardList(ThrottledFileSocket* socket); + + void QueueForSendingControlPacket(ThrottledControlSocket* socket, bool hasSent = false); + void RemoveFromAllQueues(ThrottledControlSocket* socket); + void RemoveFromAllQueues(ThrottledFileSocket* socket); + + void EndThread(); +private: + void DoRemoveFromAllQueues(ThrottledControlSocket* socket); + bool RemoveFromStandardListNoLock(ThrottledFileSocket* socket); + + void* Entry(); + + bool m_doRun; + + + wxMutex m_sendLocker; + wxMutex m_tempQueueLocker; + + typedef std::deque SocketQueue; + + // a queue for all the sockets that want to have Send() called on them. + SocketQueue m_ControlQueue_list; + // a queue for all the sockets that want to have Send() called on them. + SocketQueue m_ControlQueueFirst_list; + // sockets that wants to enter m_ControlQueue_list + SocketQueue m_TempControlQueue_list; + // sockets that wants to enter m_ControlQueue_list and has been able to send before + SocketQueue m_TempControlQueueFirst_list; + + + typedef std::deque FileSocketQueue; + // sockets that have upload slots. Ordered so the most prioritized socket is first + FileSocketQueue m_StandardOrder_list; + + uint64 m_SentBytesSinceLastCall; + uint64 m_SentBytesSinceLastCallOverhead; +}; + + +#endif +// File_checked_for_headers diff --git a/src/UploadClient.cpp b/src/UploadClient.cpp new file mode 100644 index 00000000..b9068fbd --- /dev/null +++ b/src/UploadClient.cpp @@ -0,0 +1,952 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "updownclient.h" // Interface + +#include +#include + +#include + +#include "ClientCredits.h" // Needed for CClientCredits +#include "Packet.h" // Needed for CPacket +#include "MemFile.h" // Needed for CMemFile +#include "UploadQueue.h" // Needed for CUploadQueue +#include "DownloadQueue.h" // Needed for CDownloadQueue +#include "PartFile.h" // Needed for PR_POWERSHARE +#include "ClientTCPSocket.h" // Needed for CClientTCPSocket +#include "SharedFileList.h" // Needed for CSharedFileList +#include "amule.h" // Needed for theApp +#include "ClientList.h" +#include "Statistics.h" // Needed for theStats +#include "Logger.h" +#include +#include "ScopedPtr.h" // Needed for CScopedArray +#include "GuiEvents.h" // Needed for Notify_* + + +// members of CUpDownClient +// which are mainly used for uploading functions + +void CUpDownClient::SetUploadState(uint8 eNewState) +{ + if (eNewState != m_nUploadState) { + if (m_nUploadState == US_UPLOADING) { + // Reset upload data rate computation + m_nUpDatarate = 0; + m_nSumForAvgUpDataRate = 0; + m_AvarageUDR_list.clear(); + } + if (eNewState == US_UPLOADING) { + m_fSentOutOfPartReqs = 0; + } + + // don't add any final cleanups for US_NONE here + m_nUploadState = eNewState; + UpdateDisplayedInfo(true); + } +} + +#ifndef CLIENT_GUI +uint32 CUpDownClient::GetScore(bool sysvalue, bool isdownloading, bool onlybasevalue) const +{ + //TODO: complete this (friends, uploadspeed, amuleuser etc etc) + if (m_Username.IsEmpty()) { + return 0; + } + + if (credits == 0) { + return 0; + } + + const CKnownFile* pFile = GetUploadFile(); + if ( !pFile ) { + return 0; + } + + // bad clients (see note in function) + if (IsBadGuy()) { + return 0; + } + + // friend slot + if (IsFriend() && GetFriendSlot() && !HasLowID()) { + return 0x0FFFFFFF; + } + + if (IsBanned()) + return 0; + + if (sysvalue && HasLowID() && !IsConnected()){ + return 0; + } + + // TODO coded by tecxx & herbert, one yet unsolved problem here: + // sometimes a client asks for 2 files and there is no way to decide, which file the + // client finally gets. so it could happen that he is queued first because of a + // high prio file, but then asks for something completely different. + int filepriority = 10; // standard + if(pFile != NULL){ + switch(pFile->GetUpPriority()) { + case PR_POWERSHARE: //added for powershare (deltaHF) + filepriority = 2500; + break; //end + case PR_VERYHIGH: + filepriority = 18; + break; + case PR_HIGH: + filepriority = 9; + break; + case PR_LOW: + filepriority = 6; + break; + case PR_VERYLOW: + filepriority = 2; + break; + case PR_NORMAL: + default: + filepriority = 7; + break; + } + } + // calculate score, based on waitingtime and other factors + float fBaseValue; + if (onlybasevalue) { + fBaseValue = 100; + } else if (!isdownloading) { + fBaseValue = (float)(::GetTickCount()-GetWaitStartTime())/1000; + } else { + // we dont want one client to download forever + // the first 15 min downloadtime counts as 15 min waitingtime and you get + // a 15 min bonus while you are in the first 15 min :) + // (to avoid 20 sec downloads) after this the score won't raise anymore + fBaseValue = (float)(m_dwUploadTime-GetWaitStartTime()); + wxASSERT( m_dwUploadTime > GetWaitStartTime()); // Obviously + fBaseValue += (float)(::GetTickCount() - m_dwUploadTime > 900000)? 900000:1800000; + fBaseValue /= 1000; + } + + float modif = GetScoreRatio(); + fBaseValue *= modif; + + if (!onlybasevalue) { + fBaseValue *= (float(filepriority)/10.0f); + } + if( (IsEmuleClient() || GetClientSoft() < 10) && m_byEmuleVersion <= 0x19) { + fBaseValue *= 0.5f; + } + return (uint32)fBaseValue; +} +#endif + +// Checks if it is next requested block from another chunk of the actual file or from another file +// +// [Returns] +// true : Next requested block is from another different chunk or file than last downloaded block +// false: Next requested block is from same chunk that last downloaded block +bool CUpDownClient::IsDifferentPartBlock() const // [Tarod 12/22/2002] +{ + bool different_part = false; + + // Check if we have good lists and proceed to check for different chunks + if ((!m_BlockRequests_queue.empty()) && !m_DoneBlocks_list.empty()) + { + Requested_Block_Struct* last_done_block = NULL; + Requested_Block_Struct* next_requested_block = NULL; + uint64 last_done_part = 0xffffffff; + uint64 next_requested_part = 0xffffffff; + + + // Get last block and next pending + last_done_block = m_DoneBlocks_list.front(); + next_requested_block = m_BlockRequests_queue.front(); + + // Calculate corresponding parts to blocks + last_done_part = last_done_block->StartOffset / PARTSIZE; + next_requested_part = next_requested_block->StartOffset / PARTSIZE; + + // Test is we are asking same file and same part + if ( last_done_part != next_requested_part) { + different_part = true; + AddDebugLogLineM(false, logClient, wxT("Session ended due to new chunk.")); + } + + if (md4cmp(last_done_block->FileID, next_requested_block->FileID) != 0) { + different_part = true; + AddDebugLogLineM(false, logClient, wxT("Session ended due to different file.")); + } + } + + return different_part; +} + + +void CUpDownClient::CreateNextBlockPackage() +{ + // See if we can do an early return. There may be no new blocks to load from disk and add to buffer, or buffer may be large enough allready. + if(m_BlockRequests_queue.empty() || // There are no new blocks requested + m_addedPayloadQueueSession > GetQueueSessionPayloadUp() && m_addedPayloadQueueSession-GetQueueSessionPayloadUp() > 50*1024) { // the buffered data is large enough allready + return; + } + + CFile file; + CPath fullname; + try { + // Buffer new data if current buffer is less than 100 KBytes + while ((!m_BlockRequests_queue.empty()) && + (m_addedPayloadQueueSession <= GetQueueSessionPayloadUp() || m_addedPayloadQueueSession-GetQueueSessionPayloadUp() < 100*1024)) { + + Requested_Block_Struct* currentblock = m_BlockRequests_queue.front(); + CKnownFile* srcfile = theApp->sharedfiles->GetFileByID(CMD4Hash(currentblock->FileID)); + + if (!srcfile) { + throw wxString(wxT("requested file not found")); + } + + if (srcfile->IsPartFile() && ((CPartFile*)srcfile)->GetStatus() != PS_COMPLETE) { + //#warning This seems a good idea from eMule. We must import this. + #if 0 + // Do not access a part file, if it is currently moved into the incoming directory. + // Because the moving of part file into the incoming directory may take a noticable + // amount of time, we can not wait for 'm_FileCompleteMutex' and block the main thread. + if (!((CPartFile*)srcfile)->m_FileCompleteMutex.Lock(0)){ // just do a quick test of the mutex's state and return if it's locked. + return; + } + lockFile.m_pObject = &((CPartFile*)srcfile)->m_FileCompleteMutex; + // If it's a part file which we are uploading the file remains locked until we've read the + // current block. This way the file completion thread can not (try to) "move" the file into + // the incoming directory. + #endif + + // Get the full path to the '.part' file + fullname = dynamic_cast(srcfile)->GetFullName().RemoveExt(); + } else { + fullname = srcfile->GetFilePath().JoinPaths(srcfile->GetFileName()); + } + + uint64 togo; + if (currentblock->StartOffset > currentblock->EndOffset){ + togo = currentblock->EndOffset + (srcfile->GetFileSize() - currentblock->StartOffset); + } else { + togo = currentblock->EndOffset - currentblock->StartOffset; + + if (srcfile->IsPartFile() && !((CPartFile*)srcfile)->IsComplete(currentblock->StartOffset,currentblock->EndOffset-1)) { + throw wxString(wxT("Asked for incomplete block ")); + } + } + + if (togo > EMBLOCKSIZE * 3) { + throw wxString(wxT("Client requested too large of a block.")); + } + + CScopedArray filedata(NULL); + if (!srcfile->IsPartFile()){ + if ( !file.Open(fullname, CFile::read) ) { + // The file was most likely moved/deleted. However it is likely that the + // same is true for other files, so we recheck all shared files. + AddLogLineM( false, CFormat( _("Failed to open file (%s), removing from list of shared files.") ) % srcfile->GetFileName() ); + theApp->sharedfiles->RemoveFile(srcfile); + + throw wxString(wxT("Failed to open requested file: Removing from list of shared files!")); + } + + file.Seek(currentblock->StartOffset, wxFromStart); + + filedata.reset(new byte[togo + 500]); + file.Read(filedata.get(), togo); + file.Close(); + } else { + CPartFile* partfile = (CPartFile*)srcfile; + partfile->m_hpartfile.Seek(currentblock->StartOffset); + + filedata.reset(new byte[togo + 500]); + partfile->m_hpartfile.Read(filedata.get(), togo); + // Partfile should NOT be closed!!! + } + + //#warning Part of the above import. + #if 0 + if (lockFile.m_pObject){ + lockFile.m_pObject->Unlock(); // Unlock the (part) file as soon as we are done with accessing it. + lockFile.m_pObject = NULL; + } + #endif + + SetUploadFileID(srcfile); + + // check extention to decide whether to compress or not + if (m_byDataCompVer == 1 && GetFiletype(srcfile->GetFileName()) != ftArchive) { + CreatePackedPackets(filedata.get(), togo,currentblock); + } else { + CreateStandartPackets(filedata.get(), togo,currentblock); + } + + // file statistic + srcfile->statistic.AddTransferred(togo); + + m_addedPayloadQueueSession += togo; + + Requested_Block_Struct* block = m_BlockRequests_queue.front(); + + m_BlockRequests_queue.pop_front(); + m_DoneBlocks_list.push_front(block); + } + + return; + } catch (const wxString& error) { + AddDebugLogLineM(false, logClient, wxT("Client '") + GetUserName() + wxT("' caused error while creating packet (") + error + wxT(") - disconnecting client")); + } catch (const CIOFailureException& error) { + AddDebugLogLineM(true, logClient, wxT("IO failure while reading requested file: ") + error.what()); + } catch (const CEOFException& error) { + AddDebugLogLineM(true, logClient, GetClientFullInfo() + wxT(" requested file-data at an invalid position - disconnecting")); + } + + // Error occured. + theApp->uploadqueue->RemoveFromUploadQueue(this); +} + + +void CUpDownClient::CreateStandartPackets(const byte* buffer, uint32 togo, Requested_Block_Struct* currentblock) +{ + uint32 nPacketSize; + + CMemFile memfile(buffer, togo); + if (togo > 10240) { + nPacketSize = togo/(uint32)(togo/10240); + } else { + nPacketSize = togo; + } + + while (togo){ + if (togo < nPacketSize*2) { + nPacketSize = togo; + } + + wxASSERT(nPacketSize); + togo -= nPacketSize; + + uint64 endpos = (currentblock->EndOffset - togo); + uint64 startpos = endpos - nPacketSize; + + bool bLargeBlocks = (startpos > 0xFFFFFFFF) || (endpos > 0xFFFFFFFF); + + CMemFile data(nPacketSize + 16 + 2 * (bLargeBlocks ? 8 :4)); + data.WriteHash(GetUploadFileID()); + if (bLargeBlocks) { + data.WriteUInt64(startpos); + data.WriteUInt64(endpos); + } else { + data.WriteUInt32(startpos); + data.WriteUInt32(endpos); + } + char *tempbuf = new char[nPacketSize]; + memfile.Read(tempbuf, nPacketSize); + data.Write(tempbuf, nPacketSize); + delete [] tempbuf; + CPacket* packet = new CPacket(data, (bLargeBlocks ? OP_EMULEPROT : OP_EDONKEYPROT), (bLargeBlocks ? (uint8)OP_SENDINGPART_I64 : (uint8)OP_SENDINGPART)); + theStats::AddUpOverheadFileRequest(16 + 2 * (bLargeBlocks ? 8 :4)); + theStats::AddUploadToSoft(GetClientSoft(), nPacketSize); + AddDebugLogLineM( false, logLocalClient, wxString::Format(wxT("Local Client: %s to "),(bLargeBlocks ? wxT("OP_SENDINGPART_I64") : wxT("OP_SENDINGPART"))) + GetFullIP() ); + m_socket->SendPacket(packet,true,false, nPacketSize); + } +} + + +void CUpDownClient::CreatePackedPackets(const byte* buffer, uint32 togo, Requested_Block_Struct* currentblock) +{ + byte* output = new byte[togo+300]; + uLongf newsize = togo+300; + uint16 result = compress2(output, &newsize, buffer, togo,9); + if (result != Z_OK || togo <= newsize){ + delete[] output; + CreateStandartPackets(buffer, togo, currentblock); + return; + } + + CMemFile memfile(output,newsize); + + uint32 totalPayloadSize = 0; + uint32 oldSize = togo; + togo = newsize; + uint32 nPacketSize; + if (togo > 10240) { + nPacketSize = togo/(uint32)(togo/10240); + } else { + nPacketSize = togo; + } + + while (togo) { + if (togo < nPacketSize*2) { + nPacketSize = togo; + } + togo -= nPacketSize; + + bool isLargeBlock = (currentblock->StartOffset > 0xFFFFFFFF) || (currentblock->EndOffset > 0xFFFFFFFF); + + CMemFile data(nPacketSize + 16 + (isLargeBlock ? 12 : 8)); + data.WriteHash(GetUploadFileID()); + if (isLargeBlock) { + data.WriteUInt64(currentblock->StartOffset); + } else { + data.WriteUInt32(currentblock->StartOffset); + } + data.WriteUInt32(newsize); + char *tempbuf = new char[nPacketSize]; + memfile.Read(tempbuf, nPacketSize); + data.Write(tempbuf,nPacketSize); + delete [] tempbuf; + CPacket* packet = new CPacket(data, OP_EMULEPROT, (isLargeBlock ? OP_COMPRESSEDPART_I64 : OP_COMPRESSEDPART)); + + // approximate payload size + uint32 payloadSize = nPacketSize*oldSize/newsize; + + if (togo == 0 && totalPayloadSize+payloadSize < oldSize) { + payloadSize = oldSize-totalPayloadSize; + } + + totalPayloadSize += payloadSize; + + // put packet directly on socket + theStats::AddUpOverheadFileRequest(24); + theStats::AddUploadToSoft(GetClientSoft(), nPacketSize); + AddDebugLogLineM( false, logLocalClient, wxString::Format(wxT("Local Client: %s to "), (isLargeBlock ? wxT("OP_COMPRESSEDPART_I64") : wxT("OP_COMPRESSEDPART"))) + GetFullIP() ); + m_socket->SendPacket(packet,true,false, payloadSize); + } + delete[] output; +} + + +void CUpDownClient::ProcessExtendedInfo(const CMemFile *data, CKnownFile *tempreqfile) +{ + m_uploadingfile->UpdateUpPartsFrequency( this, false ); // Decrement + m_upPartStatus.clear(); + m_nUpCompleteSourcesCount= 0; + + if( GetExtendedRequestsVersion() == 0 ) { + // Something is coded wrong on this client if he's sending something it doesn't advertise. + return; + } + + if (data->GetLength() == 16) { + // Wrong again. Advertised >0 but send a 0-type packet. + // But this time we'll disconnect it. + throw CInvalidPacket(wxT("Wrong size on extended info packet")); + } + + uint16 nED2KUpPartCount = data->ReadUInt16(); + if (!nED2KUpPartCount) { + m_upPartStatus.resize( tempreqfile->GetPartCount(), 0 ); + } else { + if (tempreqfile->GetED2KPartCount() != nED2KUpPartCount) { + // We already checked if we are talking about the same file.. So if we get here, something really strange happened! + m_upPartStatus.clear(); + return; + } + + m_upPartStatus.resize( tempreqfile->GetPartCount(), 0 ); + + try { + uint16 done = 0; + while (done != m_upPartStatus.size()) { + uint8 toread = data->ReadUInt8(); + for (sint32 i = 0;i != 8;i++){ + m_upPartStatus[done] = (toread>>i)&1; + // We may want to use this for another feature.. + // if (m_upPartStatus[done] && !tempreqfile->IsComplete(done*PARTSIZE,((done+1)*PARTSIZE)-1)) + // bPartsNeeded = true; + done++; + if (done == m_upPartStatus.size()) { + break; + } + } + } + } catch (...) { + // We want the increment the frequency even if we didn't read everything + m_uploadingfile->UpdateUpPartsFrequency( this, true ); // Increment + + throw; + } + + if (GetExtendedRequestsVersion() > 1) { + uint16 nCompleteCountLast = GetUpCompleteSourcesCount(); + uint16 nCompleteCountNew = data->ReadUInt16(); + SetUpCompleteSourcesCount(nCompleteCountNew); + if (nCompleteCountLast != nCompleteCountNew) { + tempreqfile->UpdatePartsInfo(); + } + } + } + + m_uploadingfile->UpdateUpPartsFrequency( this, true ); // Increment + + Notify_QlistRefreshClient(this); +} + + +void CUpDownClient::SetUploadFileID(CKnownFile* newreqfile) +{ + if (m_uploadingfile == newreqfile) { + return; + } else if (m_uploadingfile) { + m_uploadingfile->RemoveUploadingClient(this); + m_uploadingfile->UpdateUpPartsFrequency(this, false); // Decrement + } + + if (newreqfile) { + // This is a new file! update info + newreqfile->AddUploadingClient(this); + + if (m_requpfileid != newreqfile->GetFileHash()) { + m_requpfileid = newreqfile->GetFileHash(); + m_upPartStatus.clear(); + m_upPartStatus.resize( newreqfile->GetPartCount(), 0 ); + } else { + // this is the same file we already had assigned. Only update data. + newreqfile->UpdateUpPartsFrequency(this, true); // Increment + } + + m_uploadingfile = newreqfile; + } else { + m_upPartStatus.clear(); + m_nUpCompleteSourcesCount = 0; + // This clears m_uploadingfile and m_requpfileid + ClearUploadFileID(); + } +} + + +void CUpDownClient::AddReqBlock(Requested_Block_Struct* reqblock) +{ + if (GetUploadState() != US_UPLOADING) { + AddDebugLogLineM(false, logRemoteClient, wxT("UploadClient: Client tried to add requested block when not in upload slot! Prevented requested blocks from being added.")); + delete reqblock; + return; + } + + { + std::list::iterator it = m_DoneBlocks_list.begin(); + for (; it != m_DoneBlocks_list.end(); ++it) { + if (reqblock->StartOffset == (*it)->StartOffset && reqblock->EndOffset == (*it)->EndOffset) { + delete reqblock; + return; + } + } + } + + { + std::list::iterator it = m_BlockRequests_queue.begin(); + for (; it != m_BlockRequests_queue.end(); ++it) { + if (reqblock->StartOffset == (*it)->StartOffset && reqblock->EndOffset == (*it)->EndOffset) { + delete reqblock; + return; + } + } + } + + m_BlockRequests_queue.push_back(reqblock); +} + + +uint32 CUpDownClient::GetWaitStartTime() const +{ + uint32 dwResult = 0; + + if ( credits ) { + dwResult = credits->GetSecureWaitStartTime(GetIP()); + + if (dwResult > m_dwUploadTime && IsDownloading()) { + // This happens only if two clients with invalid securehash are in the queue - if at all + dwResult = m_dwUploadTime - 1; + } + } + + return dwResult; +} + + +void CUpDownClient::SetWaitStartTime() +{ + if ( credits ) { + credits->SetSecWaitStartTime(GetIP()); + } +} + + +void CUpDownClient::ClearWaitStartTime() +{ + if ( credits ) { + credits->ClearWaitStartTime(); + } +} + + +uint32 CUpDownClient::SendBlockData() +{ + uint32 curTick = ::GetTickCount(); + uint64 sentBytesCompleteFile = 0; + uint64 sentBytesPartFile = 0; + uint64 sentBytesPayload = 0; + + if (m_socket) { + CEMSocket* s = m_socket; +// uint32 uUpStatsPort = GetUserPort(); + + // Extended statistics information based on which client software and which port we sent this data to... + // This also updates the grand total for sent bytes, etc. And where this data came from. + sentBytesCompleteFile = s->GetSentBytesCompleteFileSinceLastCallAndReset(); + sentBytesPartFile = s->GetSentBytesPartFileSinceLastCallAndReset(); +// thePrefs.Add2SessionTransferData(GetClientSoft(), uUpStatsPort, false, true, sentBytesCompleteFile, (IsFriend() && GetFriendSlot())); +// thePrefs.Add2SessionTransferData(GetClientSoft(), uUpStatsPort, true, true, sentBytesPartFile, (IsFriend() && GetFriendSlot())); + + m_nTransferredUp += sentBytesCompleteFile + sentBytesPartFile; + credits->AddUploaded(sentBytesCompleteFile + sentBytesPartFile, GetIP(), theApp->CryptoAvailable()); + + sentBytesPayload = s->GetSentPayloadSinceLastCallAndReset(); + m_nCurQueueSessionPayloadUp += sentBytesPayload; + + if (theApp->uploadqueue->CheckForTimeOver(this)) { + theApp->uploadqueue->RemoveFromUploadQueue(this, true); + SendOutOfPartReqsAndAddToWaitingQueue(); + } else { + // read blocks from file and put on socket + CreateNextBlockPackage(); + } + } + + if(sentBytesCompleteFile + sentBytesPartFile > 0 || + m_AvarageUDR_list.empty() || (curTick - m_AvarageUDR_list.back().timestamp) > 1*1000) { + // Store how much data we've transferred this round, + // to be able to calculate average speed later + // keep sum of all values in list up to date + TransferredData newitem = {sentBytesCompleteFile + sentBytesPartFile, curTick}; + m_AvarageUDR_list.push_back(newitem); + m_nSumForAvgUpDataRate += sentBytesCompleteFile + sentBytesPartFile; + } + + // remove to old values in list + while ((!m_AvarageUDR_list.empty()) && (curTick - m_AvarageUDR_list.front().timestamp) > 10*1000) { + // keep sum of all values in list up to date + m_nSumForAvgUpDataRate -= m_AvarageUDR_list.front().datalen; + m_AvarageUDR_list.pop_front(); + } + + // Calculate average speed for this slot + if ((!m_AvarageUDR_list.empty()) && (curTick - m_AvarageUDR_list.front().timestamp) > 0 && GetUpStartTimeDelay() > 2*1000) { + m_nUpDatarate = ((uint64)m_nSumForAvgUpDataRate*1000) / (curTick-m_AvarageUDR_list.front().timestamp); + } else { + // not enough values to calculate trustworthy speed. Use -1 to tell this + m_nUpDatarate = 0; //-1; + } + + // Check if it's time to update the display. + m_cSendblock++; + if (m_cSendblock == 30){ + m_cSendblock = 0; + Notify_UploadCtrlRefreshClient(this); + } + + return sentBytesCompleteFile + sentBytesPartFile; +} + + +void CUpDownClient::SendOutOfPartReqsAndAddToWaitingQueue() +{ + // Kry - this is actually taken from eMule, but makes a lot of sense ;) + + //OP_OUTOFPARTREQS will tell the downloading client to go back to OnQueue.. + //The main reason for this is that if we put the client back on queue and it goes + //back to the upload before the socket times out... We get a situation where the + //downloader thinks it already sent the requested blocks and the uploader thinks + //the downloader didn't send any request blocks. Then the connection times out.. + //I did some tests with eDonkey also and it seems to work well with them also.. + + // Send this inmediately, don't queue. + CPacket* pPacket = new CPacket(OP_OUTOFPARTREQS, 0, OP_EDONKEYPROT); + theStats::AddUpOverheadFileRequest(pPacket->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_OUTOFPARTREQS to ") + GetFullIP() ); + SendPacket(pPacket, true, true); + + theApp->uploadqueue->AddClientToQueue(this); +} + + +/** + * See description for CEMSocket::TruncateQueues(). + */ +void CUpDownClient::FlushSendBlocks() +{ + // Call this when you stop upload, or the socket might be not able to send + if (m_socket) { //socket may be NULL... + m_socket->TruncateQueues(); + } +} + + +void CUpDownClient::SendHashsetPacket(const CMD4Hash& forfileid) +{ + CKnownFile* file = theApp->sharedfiles->GetFileByID( forfileid ); + bool from_dq = false; + if ( !file ) { + from_dq = true; + if ((file = theApp->downloadqueue->GetFileByID(forfileid)) == NULL) { + AddLogLineM(false, CFormat( _("Hashset requested for unknown file: %s") ) % forfileid.Encode() ); + + return; + } + } + + if ( !file->GetHashCount() ) { + if (from_dq) { + AddDebugLogLineM(false, logRemoteClient, wxT("Requested hashset could not be found")); + return; + } else { + file = theApp->downloadqueue->GetFileByID(forfileid); + if (!(file && file->GetHashCount())) { + AddDebugLogLineM(false, logRemoteClient, wxT("Requested hashset could not be found")); + return; + } + } + } + + CMemFile data(1024); + data.WriteHash(file->GetFileHash()); + uint16 parts = file->GetHashCount(); + data.WriteUInt16(parts); + for (int i = 0; i != parts; i++) { + data.WriteHash(file->GetPartHash(i)); + } + CPacket* packet = new CPacket(data, OP_EDONKEYPROT, OP_HASHSETANSWER); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_HASHSETANSWER to ") + GetFullIP()); + SendPacket(packet,true,true); +} + + +void CUpDownClient::ClearUploadBlockRequests() +{ + FlushSendBlocks(); + DeleteContents(m_BlockRequests_queue); + DeleteContents(m_DoneBlocks_list); +} + + +void CUpDownClient::SendRankingInfo(){ + if (!ExtProtocolAvailable()) { + return; + } + + uint16 nRank = theApp->uploadqueue->GetWaitingPosition(this); + if (!nRank) { + return; + } + + CMemFile data; + data.WriteUInt16(nRank); + // Kry: what are these zero bytes for. are they really correct? + // Kry - Well, eMule does like that. I guess they're ok. + data.WriteUInt32(0); data.WriteUInt32(0); data.WriteUInt16(0); + CPacket* packet = new CPacket(data, OP_EMULEPROT, OP_QUEUERANKING); + theStats::AddUpOverheadOther(packet->GetPacketSize()); + AddDebugLogLineM(false, logLocalClient, wxT("Local Client: OP_QUEUERANKING to ") + GetFullIP()); + SendPacket(packet,true,true); +} + + +void CUpDownClient::SendCommentInfo(CKnownFile* file) +{ + if (!m_bCommentDirty || file == NULL || !ExtProtocolAvailable() || m_byAcceptCommentVer < 1) { + return; + } + m_bCommentDirty = false; + + // Truncate to max len. + wxString desc = file->GetFileComment().Left(MAXFILECOMMENTLEN); + uint8 rating = file->GetFileRating(); + + if ( file->GetFileRating() == 0 && desc.IsEmpty() ) { + return; + } + + CMemFile data(256); + data.WriteUInt8(rating); + data.WriteString(desc, GetUnicodeSupport(), 4 /* size it's uint32 */); + + CPacket* packet = new CPacket(data, OP_EMULEPROT, OP_FILEDESC); + theStats::AddUpOverheadOther(packet->GetPacketSize()); + AddDebugLogLineM(false, logLocalClient, wxT("Local Client: OP_FILEDESC to ") + GetFullIP()); + SendPacket(packet,true); +} + +void CUpDownClient::UnBan(){ + m_Aggressiveness = 0; + + theApp->clientlist->AddTrackClient(this); + theApp->clientlist->RemoveBannedClient( GetIP() ); + SetUploadState(US_NONE); + ClearWaitStartTime(); + + Notify_ShowQueueCount(theStats::GetWaitingUserCount()); +} + +void CUpDownClient::Ban(){ + theApp->clientlist->AddTrackClient(this); + theApp->clientlist->AddBannedClient( GetIP() ); + + AddDebugLogLineM( false, logClient, wxT("Client '") + GetUserName() + wxT("' seems to be an aggressive client and is banned from the uploadqueue")); + + SetUploadState(US_BANNED); + + Notify_ShowQueueCount(theStats::GetWaitingUserCount()); + Notify_QlistRefreshClient(this); +} + +bool CUpDownClient::IsBanned() const +{ + return ( (theApp->clientlist->IsBannedClient(GetIP()) ) && m_nDownloadState != DS_DOWNLOADING); +} + +void CUpDownClient::CheckForAggressive() +{ + uint32 cur_time = ::GetTickCount(); + + // First call, initalize + if ( !m_LastFileRequest ) { + m_LastFileRequest = cur_time; + return; + } + + // Is this an aggressive request? + if ( ( cur_time - m_LastFileRequest ) < MIN_REQUESTTIME ) { + m_Aggressiveness += 3; + + // Is the client EVIL? + if ( m_Aggressiveness >= 10 && (!IsBanned() && m_nDownloadState != DS_DOWNLOADING )) { + AddDebugLogLineM( false, logClient, CFormat( wxT("Aggressive client banned (score: %d): %s -- %s -- %s") ) + % m_Aggressiveness + % m_Username + % m_strModVersion + % m_fullClientVerString ); + Ban(); + } + } else { + // Polite request, reward client + if ( m_Aggressiveness ) + m_Aggressiveness--; + } + + m_LastFileRequest = cur_time; +} + + +void CUpDownClient::SetUploadFileID(const CMD4Hash& new_id) +{ + // Update the uploading file found + CKnownFile* uploadingfile = theApp->sharedfiles->GetFileByID(new_id); + if ( !uploadingfile ) { + // Can this really happen? + uploadingfile = theApp->downloadqueue->GetFileByID(new_id); + } + SetUploadFileID(uploadingfile); // This will update queue count on old and new file. +} + +void CUpDownClient::ProcessRequestPartsPacket(const byte* pachPacket, uint32 nSize, bool largeblocks) { + + CMemFile data(pachPacket, nSize); + + CMD4Hash reqfilehash = data.ReadHash(); + + uint64 auStartOffsets[3]; + uint64 auEndOffsets[3]; + + if (largeblocks) { + auStartOffsets[0] = data.ReadUInt64(); + auStartOffsets[1] = data.ReadUInt64(); + auStartOffsets[2] = data.ReadUInt64(); + + auEndOffsets[0] = data.ReadUInt64(); + auEndOffsets[1] = data.ReadUInt64(); + auEndOffsets[2] = data.ReadUInt64(); + } else { + auStartOffsets[0] = data.ReadUInt32(); + auStartOffsets[1] = data.ReadUInt32(); + auStartOffsets[2] = data.ReadUInt32(); + + auEndOffsets[0] = data.ReadUInt32(); + auEndOffsets[1] = data.ReadUInt32(); + auEndOffsets[2] = data.ReadUInt32(); + } + + for (unsigned int i = 0; i < itemsof(auStartOffsets); i++) { + AddDebugLogLineM(false, logClient, + wxString::Format(wxT("Client requests %u"), i) + + wxT(" ") + wxString::Format(wxT("File block %u-%u (%d bytes):"), auStartOffsets[i], auEndOffsets[i], auEndOffsets[i] - auStartOffsets[i]) + + wxT(" ") + GetFullIP()); + if (auEndOffsets[i] > auStartOffsets[i]) { + Requested_Block_Struct* reqblock = new Requested_Block_Struct; + reqblock->StartOffset = auStartOffsets[i]; + reqblock->EndOffset = auEndOffsets[i]; + md4cpy(reqblock->FileID, reqfilehash.GetHash()); + reqblock->transferred = 0; + AddReqBlock(reqblock); + } else { + if (auEndOffsets[i] != 0 || auStartOffsets[i] != 0) { + AddDebugLogLineM(false, logClient, wxT("Client request is invalid!")); + } + } + } +} + +void CUpDownClient::ProcessRequestPartsPacketv2(const CMemFile& data) { + + CMD4Hash reqfilehash = data.ReadHash(); + + uint8 numblocks = data.ReadUInt8(); + + for (int i = 0; i < numblocks; i++) { + Requested_Block_Struct* reqblock = new Requested_Block_Struct; + try { + reqblock->StartOffset = data.GetIntTagValue(); + // We have to do +1, because the block matching uses that. + reqblock->EndOffset = data.GetIntTagValue() + 1; + if ((reqblock->StartOffset || reqblock->EndOffset) && (reqblock->StartOffset > reqblock->EndOffset)) { + AddDebugLogLineM(false, logClient, wxString::Format(wxT("Client request is invalid! %i / %i"),reqblock->StartOffset, reqblock->EndOffset)); + throw wxString(wxT("Client request is invalid!")); + } + + AddDebugLogLineM(false, logClient, + wxString::Format(wxT("Client requests %u"), i) + + wxT(" ") + wxString::Format(wxT("File block %u-%u (%d bytes):"),reqblock->StartOffset, reqblock->EndOffset, reqblock->EndOffset - reqblock->StartOffset) + += wxT(" ") + GetFullIP()); + + md4cpy(reqblock->FileID, reqfilehash.GetHash()); + reqblock->transferred = 0; + AddReqBlock(reqblock); + } catch (...) { + delete reqblock; + throw; + } + } +} +// File_checked_for_headers diff --git a/src/UploadQueue.cpp b/src/UploadQueue.cpp new file mode 100644 index 00000000..3a1c5e88 --- /dev/null +++ b/src/UploadQueue.cpp @@ -0,0 +1,575 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "UploadQueue.h" // Interface declarations + +#include +#include +#include +#include + +#include + +#include "Types.h" // Do_not_auto_remove (win32) + +#ifdef __WXMSW__ + #include // Do_not_auto_remove +#else + #include // Do_not_auto_remove + #include // Do_not_auto_remove + #include // Do_not_auto_remove +#endif + +#include "ServerConnect.h" // Needed for CServerConnect +#include "KnownFile.h" // Needed for CKnownFile +#include "Packet.h" // Needed for CPacket +#include "ClientTCPSocket.h" // Needed for CClientTCPSocket +#include "SharedFileList.h" // Needed for CSharedFileList +#include "updownclient.h" // Needed for CUpDownClient +#include "amule.h" // Needed for theApp +#include "Preferences.h" +#include "ClientList.h" +#include "Statistics.h" // Needed for theStats +#include "Logger.h" +#include +#include "UploadBandwidthThrottler.h" +#include "GuiEvents.h" // Needed for Notify_* + + +//TODO rewrite the whole networkcode, use overlapped sockets + +CUploadQueue::CUploadQueue() +{ + m_nLastStartUpload = 0; + + lastupslotHighID = true; +} + + +void CUploadQueue::AddUpNextClient(CUpDownClient* directadd) +{ + CClientPtrList::iterator toadd = m_waitinglist.end(); + CClientPtrList::iterator toaddlow = m_waitinglist.end(); + + sint64 bestscore = -1; + sint64 bestlowscore = -1; + + CUpDownClient* newclient; + // select next client or use given client + if (!directadd) { + // Track if we purged any clients from the queue, as to only send one notify in total + bool purged = false; + + CClientPtrList::iterator it = m_waitinglist.begin(); + for (; it != m_waitinglist.end(); ) { + CClientPtrList::iterator tmp_it = it++; + CUpDownClient* cur_client = *tmp_it; + + // clear dead clients + if ( (::GetTickCount() - cur_client->GetLastUpRequest() > MAX_PURGEQUEUETIME) || !theApp->sharedfiles->GetFileByID(cur_client->GetUploadFileID()) ) { + purged = true; + cur_client->ClearWaitStartTime(); + RemoveFromWaitingQueue(tmp_it); + if (!cur_client->GetSocket()) { + if(cur_client->Disconnected(wxT("AddUpNextClient - purged"))) { + cur_client->Safe_Delete(); + cur_client = NULL; + } + } + continue; + } + + suspendlist::iterator it2 = std::find( suspended_uploads_list.begin(), + suspended_uploads_list.end(), + cur_client->GetUploadFileID() ); + if (cur_client->IsBanned() || it2 != suspended_uploads_list.end() ) { // Banned client or suspended upload ? + continue; + } + // finished clearing + + sint64 cur_score = cur_client->GetScore(true); + if (cur_score > bestscore) { + bestscore = cur_score; + toadd = tmp_it; + } else { + cur_score = cur_client->GetScore(false); + if ((cur_score > bestlowscore) && !cur_client->m_bAddNextConnect){ + bestlowscore = cur_score; + toaddlow = tmp_it; + } + } + } + + // Update the count on GUI if any clients were purged + if (purged) { + Notify_ShowQueueCount(m_waitinglist.size()); + } + + if (bestlowscore > bestscore){ + newclient = *toaddlow; + newclient->m_bAddNextConnect = true; + } + + if (toadd == m_waitinglist.end()) { + return; + } + + newclient = *toadd; + lastupslotHighID = true; // VQB LowID alternate + RemoveFromWaitingQueue(toadd); + Notify_ShowQueueCount(m_waitinglist.size()); + } else { + //prevent another potential access of a suspended upload + + suspendlist::iterator it = std::find( suspended_uploads_list.begin(), + suspended_uploads_list.end(), + directadd->GetUploadFileID() ); + if ( it != suspended_uploads_list.end() ) { + return; + } else { + newclient = directadd; + } + } + + if (IsDownloading(newclient)) { + return; + } + // tell the client that we are now ready to upload + if (!newclient->IsConnected()) { + newclient->SetUploadState(US_CONNECTING); + if (!newclient->TryToConnect(true)) { + return; + } + } else { + CPacket* packet = new CPacket(OP_ACCEPTUPLOADREQ, 0, OP_EDONKEYPROT); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_ACCEPTUPLOADREQ to ") + newclient->GetFullIP() ); + newclient->SendPacket(packet,true); + newclient->SetUploadState(US_UPLOADING); + } + newclient->SetUpStartTime(); + newclient->ResetSessionUp(); + + theApp->uploadBandwidthThrottler->AddToStandardList(m_uploadinglist.size(), newclient->GetSocket()); + m_uploadinglist.push_back(newclient); + theStats::AddUploadingClient(); + + // Statistic + CKnownFile* reqfile = (CKnownFile*) newclient->GetUploadFile(); + if (reqfile) { + reqfile->statistic.AddAccepted(); + } + Notify_UploadCtrlAddClient(newclient); + +} + +void CUploadQueue::Process() +{ + if (AcceptNewClient() && !m_waitinglist.empty()) { + m_nLastStartUpload = ::GetTickCount(); + AddUpNextClient(); + } + + // The loop that feeds the upload slots with data. + CClientPtrList::iterator it = m_uploadinglist.begin(); + while (it != m_uploadinglist.end()) { + // Get the client. Note! Also updates pos as a side effect. + CUpDownClient* cur_client = *it++; + + // It seems chatting or friend slots can get stuck at times in upload.. This needs looked into.. + if (!cur_client->GetSocket()) { + RemoveFromUploadQueue(cur_client, true); + if(cur_client->Disconnected(_T("CUploadQueue::Process"))){ + cur_client->Safe_Delete(); + } + } else { + cur_client->SendBlockData(); + } + } + + // Save used bandwidth for speed calculations + uint64 sentBytes = theApp->uploadBandwidthThrottler->GetNumberOfSentBytesSinceLastCallAndReset(); + (void)theApp->uploadBandwidthThrottler->GetNumberOfSentBytesOverheadSinceLastCallAndReset(); + + // Update statistics + if (sentBytes) { + theStats::AddSentBytes(sentBytes); + } +} + + +bool CUploadQueue::AcceptNewClient() +{ + // check if we can allow a new client to start downloading from us + if (::GetTickCount() - m_nLastStartUpload < 1000 || m_uploadinglist.size() >= MAX_UP_CLIENTS_ALLOWED) { + return false; + } + + float kBpsUpPerClient = (float)thePrefs::GetSlotAllocation(); + float kBpsUp = theStats::GetUploadRate() / 1024.0f; + if (thePrefs::GetMaxUpload() == UNLIMITED) { + if (m_uploadinglist.size() < ((uint32)((kBpsUp)/kBpsUpPerClient)+2)) { + return true; + } + } else { + uint16 nMaxSlots = 0; + if (thePrefs::GetMaxUpload() >= 10) { + nMaxSlots = (uint16)floor((float)thePrefs::GetMaxUpload() / kBpsUpPerClient + 0.5); + // floor(x + 0.5) is a way of doing round(x) that works with gcc < 3 ... + if (nMaxSlots < MIN_UP_CLIENTS_ALLOWED) { + nMaxSlots=MIN_UP_CLIENTS_ALLOWED; + } + } else { + nMaxSlots = MIN_UP_CLIENTS_ALLOWED; + } + + if (m_uploadinglist.size() < nMaxSlots) { + return true; + } + } + return false; +} + + +CUploadQueue::~CUploadQueue() +{ + wxASSERT(m_waitinglist.empty()); + wxASSERT(m_uploadinglist.empty()); +} + + +bool CUploadQueue::IsOnUploadQueue(const CUpDownClient* client) const +{ + return std::find(m_waitinglist.begin(), m_waitinglist.end(), client) + != m_waitinglist.end(); +} + + +bool CUploadQueue::IsDownloading(CUpDownClient* client) const +{ + return std::find(m_uploadinglist.begin(), m_uploadinglist.end(), client) + != m_uploadinglist.end(); +} + + +CUpDownClient* CUploadQueue::GetWaitingClientByIP_UDP(uint32 dwIP, uint16 nUDPPort, bool bIgnorePortOnUniqueIP, bool* pbMultipleIPs) +{ + CUpDownClient* pMatchingIPClient = NULL; + + int cMatches = 0; + + CClientPtrList::iterator it = m_waitinglist.begin(); + for (; it != m_waitinglist.end(); ++it) { + CUpDownClient* cur_client = *it; + + if ((dwIP == cur_client->GetIP()) && (nUDPPort == cur_client->GetUDPPort())) { + return cur_client; + } else if ((dwIP == cur_client->GetIP()) && bIgnorePortOnUniqueIP) { + pMatchingIPClient = cur_client; + cMatches++; + } + } + + if (pbMultipleIPs) { + *pbMultipleIPs = cMatches > 1; + } + + if (pMatchingIPClient && cMatches == 1) { + return pMatchingIPClient; + } else { + return NULL; + } +} + + +void CUploadQueue::AddClientToQueue(CUpDownClient* client) +{ + if (theApp->serverconnect->IsConnected() && theApp->serverconnect->IsLowID() && !theApp->serverconnect->IsLocalServer(client->GetServerIP(),client->GetServerPort()) && client->GetDownloadState() == DS_NONE && !client->IsFriend() && theStats::GetWaitingUserCount() > 50) { + // Well, all that issues finish in the same: don't allow to add to the queue + return; + } + + if ( client->IsBanned() ) { + return; + } + + client->AddAskedCount(); + client->SetLastUpRequest(); + + // Find all clients with the same user-hash + CClientList::SourceList found = theApp->clientlist->GetClientsByHash( client->GetUserHash() ); + + CClientList::SourceList::iterator it = found.begin(); + while (it != found.end()) { + CUpDownClient* cur_client = *it++; + + if ( IsOnUploadQueue( cur_client ) ) { + if ( cur_client == client ) { + if ( client->m_bAddNextConnect && ( ( m_uploadinglist.size() < thePrefs::GetMaxUpload() ) || ( thePrefs::GetMaxUpload() == UNLIMITED ) ) ) { + if (lastupslotHighID) { + client->m_bAddNextConnect = false; + RemoveFromWaitingQueue(client, true); + AddUpNextClient(client); + lastupslotHighID = false; // LowID alternate + return; + } + } + + client->SendRankingInfo(); + Notify_QlistRefreshClient(client); + return; + + } else { + // Hash-clash, remove unidentified clients (possibly both) + + if ( !cur_client->IsIdentified() ) { + // Cur_client isn't identifed, remove it + theApp->clientlist->AddTrackClient( cur_client ); + + RemoveFromWaitingQueue( cur_client ); + if ( !cur_client->GetSocket() ) { + if (cur_client->Disconnected( wxT("AddClientToQueue - same userhash") ) ) { + cur_client->Safe_Delete(); + } + } + } + + if ( !client->IsIdentified() ) { + // New client isn't identified, remove it + theApp->clientlist->AddTrackClient( client ); + + if ( !client->GetSocket() ) { + if ( client->Disconnected( wxT("AddClientToQueue - same userhash") ) ) { + client->Safe_Delete(); + } + } + + return; + } + } + } + } + + // Count the number of clients with the same IP-address + found = theApp->clientlist->GetClientsByIP( client->GetIP() ); + + int ipCount = 0; + for ( it = found.begin(); it != found.end(); it++ ) { + if ( ( *it == client ) || IsOnUploadQueue( *it ) ) { + ipCount++; + } + } + + // We do not accept more than 3 clients from the same IP + if ( ipCount > 3 ) { + return; + } else if ( theApp->clientlist->GetClientsFromIP(client->GetIP()) >= 3 ) { + return; + } + + // statistic values + CKnownFile* reqfile = (CKnownFile*) client->GetUploadFile(); + if (reqfile) { + reqfile->statistic.AddRequest(); + } + + // TODO find better ways to cap the list + if (m_waitinglist.size() >= (thePrefs::GetQueueSize())) { + return; + } + + if (client->IsDownloading()) { + // he's already downloading and wants probably only another file + CPacket* packet = new CPacket(OP_ACCEPTUPLOADREQ, 0, OP_EDONKEYPROT); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_ACCEPTUPLOADREQ to ") + client->GetFullIP() ); + client->SendPacket(packet,true); + return; + } + + if (m_waitinglist.empty() && AcceptNewClient()) { + AddUpNextClient(client); + m_nLastStartUpload = ::GetTickCount(); + } else { + m_waitinglist.push_back(client); + theStats::AddWaitingClient(); + client->ClearWaitStartTime(); + client->ClearAskedCount(); + client->SetUploadState(US_ONUPLOADQUEUE); + client->SendRankingInfo(); + Notify_QlistAddClient(client); + Notify_ShowQueueCount(m_waitinglist.size()); + } +} + + +bool CUploadQueue::RemoveFromUploadQueue(CUpDownClient* client, bool updatewindow) +{ + // Keep track of this client + theApp->clientlist->AddTrackClient(client); + + CClientPtrList::iterator it = std::find(m_uploadinglist.begin(), + m_uploadinglist.end(), client); + + if (it != m_uploadinglist.end()) { + if (updatewindow) { + Notify_UploadCtrlRemoveClient(client); + } + m_uploadinglist.erase(it); + theStats::RemoveUploadingClient(); + if( client->GetTransferredUp() ) { + theStats::AddSuccessfulUpload(); + theStats::AddUploadTime(client->GetUpStartTimeDelay() / 1000); + } else { + theStats::AddFailedUpload(); + } + client->SetUploadState(US_NONE); + client->ClearUploadBlockRequests(); + return true; + } + + return false; +} + + +bool CUploadQueue::CheckForTimeOver(CUpDownClient* client) +{ + if (thePrefs::TransferFullChunks()) { + if( client->GetUpStartTimeDelay() > 3600000 ) { // Try to keep the clients from downloading forever. + return true; + } + // For some reason, some clients can continue to download after a chunk size. + // Are they redownloading the same chunk over and over???? + if( client->GetSessionUp() > 10485760 ) { + return true; + } + } else { + CClientPtrList::iterator it = m_waitinglist.begin(); + for (; it != m_waitinglist.end(); ++it ) { + if (client->GetScore(true,true) < (*it)->GetScore(true,false)) { + return true; + } + } + } + + return false; +} + + +uint16 CUploadQueue::GetWaitingPosition(const CUpDownClient *client) const +{ + if ( !IsOnUploadQueue(client) ) { + return 0; + } + + uint16 rank = 1; + const uint32 myscore = client->GetScore(false); + CClientPtrList::const_iterator it = m_waitinglist.begin(); + for (; it != m_waitinglist.end(); ++it) { + if ((*it)->GetScore(false) > myscore) { + rank++; + } + } + + return rank; +} + + +/* + * This function removes a file indicated by filehash from suspended_uploads_list. + */ +void CUploadQueue::ResumeUpload( const CMD4Hash& filehash ) +{ + //Find the position of the filehash in the list and remove it. + suspendlist::iterator it = std::find( suspended_uploads_list.begin(), + suspended_uploads_list.end(), + filehash ); + if ( it != suspended_uploads_list.end() ) + suspended_uploads_list.erase( it ); + + AddLogLineM( false, CFormat( _("Resuming uploads of file: %s" ) ) + % filehash.Encode() ); +} + +/* + * This function adds a file indicated by filehash to suspended_uploads_list + */ +void CUploadQueue::SuspendUpload( const CMD4Hash& filehash ) +{ + AddLogLineM( false, CFormat( _("Suspending upload of file: %s" ) ) + % filehash.Encode() ); + + //Append the filehash to the list. + suspended_uploads_list.push_back(filehash); + wxString base16hash = filehash.Encode(); + + CClientPtrList::iterator it = m_uploadinglist.begin(); + while (it != m_uploadinglist.end()) { + CUpDownClient *potential = *it++; + //check if the client is uploading the file we need to suspend + if(potential->GetUploadFileID() == filehash) { + //remove the unlucky client from the upload queue and add to the waiting queue + RemoveFromUploadQueue(potential, true); + + m_waitinglist.push_back(potential); + theStats::AddWaitingClient(); + potential->SetUploadState(US_ONUPLOADQUEUE); + potential->SendRankingInfo(); + Notify_QlistRefreshClient(potential); + Notify_ShowQueueCount(m_waitinglist.size()); + } + } +} + +bool CUploadQueue::RemoveFromWaitingQueue(CUpDownClient* client, bool updatewindow) +{ + CClientPtrList::iterator it = std::find(m_waitinglist.begin(), + m_waitinglist.end(), client); + + if (it != m_waitinglist.end()) { + RemoveFromWaitingQueue(it); + if (updatewindow) { + Notify_ShowQueueCount(m_waitinglist.size()); + } + return true; + } else { + return false; + } +} + + +void CUploadQueue::RemoveFromWaitingQueue(CClientPtrList::iterator pos) +{ + CUpDownClient* todelete = *pos; + m_waitinglist.erase(pos); + theStats::RemoveWaitingClient(); + if( todelete->IsBanned() ) { + todelete->UnBan(); + } + Notify_QlistRemoveClient(todelete); + todelete->SetUploadState(US_NONE); +} + +// File_checked_for_headers diff --git a/src/UploadQueue.h b/src/UploadQueue.h new file mode 100644 index 00000000..ff014dcf --- /dev/null +++ b/src/UploadQueue.h @@ -0,0 +1,72 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef UPLOADQUEUE_H +#define UPLOADQUEUE_H + +#include "MD4Hash.h" // Needed for CMD4Hash + + +class CUpDownClient; + +class CUploadQueue +{ +public: + CUploadQueue(); + ~CUploadQueue(); + void Process(); + void AddClientToQueue(CUpDownClient* client); + bool RemoveFromUploadQueue(CUpDownClient* client,bool updatewindow = true); + bool RemoveFromWaitingQueue(CUpDownClient* client,bool updatewindow = true); + bool IsOnUploadQueue(const CUpDownClient* client) const; + bool IsDownloading(CUpDownClient* client) const; + bool CheckForTimeOver(CUpDownClient* client); + + const CClientPtrList& GetWaitingList() const { return m_waitinglist; } + const CClientPtrList& GetUploadingList() const { return m_uploadinglist; } + + CUpDownClient* GetWaitingClientByIP(uint32 dwIP); + CUpDownClient* GetWaitingClientByIP_UDP(uint32 dwIP, uint16 nUDPPort, bool bIgnorePortOnUniqueIP, bool* pbMultipleIPs = NULL); + + uint16 GetWaitingPosition(const CUpDownClient *client) const; + void SuspendUpload(const CMD4Hash &); + void ResumeUpload(const CMD4Hash &); + +private: + void RemoveFromWaitingQueue(CClientPtrList::iterator pos); + bool AcceptNewClient(); + void AddUpNextClient(CUpDownClient* directadd = 0); + + CClientPtrList m_waitinglist; + CClientPtrList m_uploadinglist; + + typedef std::list suspendlist; + suspendlist suspended_uploads_list; //list for suspended uploads + uint32 m_nLastStartUpload; + bool lastupslotHighID; // VQB lowID alternation +}; + +#endif // UPLOADQUEUE_H +// File_checked_for_headers diff --git a/src/UserEvents.cpp b/src/UserEvents.cpp new file mode 100644 index 00000000..f01b433a --- /dev/null +++ b/src/UserEvents.cpp @@ -0,0 +1,153 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2006-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "UserEvents.h" + + +#include +#include "Logger.h" +#include "Preferences.h" +#include "PartFile.h" +#include "TerminationProcess.h" // Needed for CTerminationProcess + + +#include + + +#define USEREVENTS_EVENT(ID, NAME, VARS) { wxT(#ID), NAME, false, wxEmptyString, false, wxEmptyString }, +static struct { + const wxString key; + const wxString name; + bool core_enabled; + wxString core_command; + bool gui_enabled; + wxString gui_command; +} s_EventList[] = { + USEREVENTS_EVENTLIST() +}; +#undef USEREVENTS_EVENT + + +#ifdef __WXDEBUG__ +inline bool CheckIndex(const unsigned int idx) +{ + return (idx < sizeof(s_EventList) / sizeof(s_EventList[0])); +} +#endif + +unsigned int CUserEvents::GetCount() +{ + return sizeof(s_EventList) / sizeof(s_EventList[0]); +} + +const wxString& CUserEvents::GetDisplayName(enum EventType event) +{ + wxASSERT(CheckIndex(event)); + return s_EventList[event].name; +} + +bool CUserEvents::IsCoreCommandEnabled(enum EventType event) +{ + wxASSERT(CheckIndex(event)); + return s_EventList[event].core_enabled; +} + +bool CUserEvents::IsGUICommandEnabled(enum EventType event) +{ + wxASSERT(CheckIndex(event)); + return s_EventList[event].gui_enabled; +} + +const wxString& CUserEvents::GetKey(const unsigned int event) +{ + wxASSERT(CheckIndex(event)); + return s_EventList[event].key; +} + +bool& CUserEvents::GetCoreEnableVar(const unsigned int event) +{ + wxASSERT(CheckIndex(event)); + return s_EventList[event].core_enabled; +} + +wxString& CUserEvents::GetCoreCommandVar(const unsigned int event) +{ + wxASSERT(CheckIndex(event)); + return s_EventList[event].core_command; +} + +bool& CUserEvents::GetGUIEnableVar(const unsigned int event) +{ + wxASSERT(CheckIndex(event)); + return s_EventList[event].gui_enabled; +} + +wxString& CUserEvents::GetGUICommandVar(const unsigned int event) +{ + wxASSERT(CheckIndex(event)); + return s_EventList[event].gui_command; +} + +#define USEREVENTS_EVENT(ID, NAME, VARS) case CUserEvents::ID: { VARS break; } +#define USEREVENTS_REPLACE_VAR(VAR, DESC, CODE) command.Replace(wxT("%") VAR, CODE); +static void ExecuteCommand( + enum CUserEvents::EventType event, + const void* object, + const wxString& cmd) +{ + // This variable is needed by the USEREVENTS_EVENTLIST macro. + wxString command = cmd; + switch (event) { + USEREVENTS_EVENTLIST() + } + if (!command.empty()) { + CTerminationProcess *p = new CTerminationProcess(cmd); + if (!wxExecute(command, wxEXEC_ASYNC, p)) { + // If wxExecute fails, we need to delete the CTerminationProcess + // otherwise it will leak. + delete p; + AddLogLineM(true, + CFormat(_("Failed to execute command `%s' on `%s' event.")) % + command % s_EventList[event].name); + } + } +} + +void CUserEvents::ProcessEvent(enum EventType event, const void* object) +{ + wxASSERT(CheckIndex(event)); + wxASSERT(object != NULL); + +#ifndef CLIENT_GUI + if (s_EventList[event].core_enabled) { + ExecuteCommand(event, object, s_EventList[event].core_command); + } +#endif +#ifndef AMULE_DAEMON + if (s_EventList[event].gui_enabled) { + ExecuteCommand(event, object, s_EventList[event].gui_command); + } +#endif +} diff --git a/src/UserEvents.h b/src/UserEvents.h new file mode 100644 index 00000000..ff1a614b --- /dev/null +++ b/src/UserEvents.h @@ -0,0 +1,171 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2006-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef USEREVENTS_H +#define USEREVENTS_H + +#include // Needed for wxTRANSLATE + + +#ifdef _MSC_VER + #define ATTR(x) +#else + #define ATTR(x) __attribute__((x)) +#endif + +/* Each event will use 5 IDs: + - the panel that shows the prefs for this event + - the 'Core command enabled' checkbox + - the 'Core command' textctrl + - the 'GUI command enabled' checkbox + - the 'GUI command' textctrl +*/ +#define USEREVENTS_IDS_PER_EVENT 5 + +const int USEREVENTS_FIRST_ID = 11500; /* Some safe GUI ID to start from */ + +/** + * Macro listing all the events. + * + * This huge macro is expanded 5 times in the sources, each time producing + * different code. If we decide to get rid of the macro either because of coding style + * decision, or someone finds a compiler that doesn't support this big macro, we + * have to maintain these five places in sync. They are: + * - one in PrefsUnifiedDlg.cpp (EVENT_LIST, PrefsUnifiedDlg::PrefsUnifiedDlg()) + * - one in this header (CUserEvents::EventType) + * - two in UserEvents.cpp (static struct EventList[]; CUserEvent::ProcessEvent()) + */ +#define USEREVENTS_EVENTLIST() \ + USEREVENTS_EVENT(DownloadCompleted, wxTRANSLATE("Download completed"), \ + USEREVENTS_REPLACE_VAR( \ + wxT("FILE"), \ + wxTRANSLATE("The full path to the file."), \ + ((CPartFile*)object)->GetFullName().GetRaw() ) \ + USEREVENTS_REPLACE_VAR( \ + wxT("NAME"), \ + wxTRANSLATE("The name of the file without path component."), \ + ((CPartFile*)object)->GetFileName().GetRaw() ) \ + USEREVENTS_REPLACE_VAR( \ + wxT("HASH"), \ + wxTRANSLATE("The ed2k hash of the file."), \ + ((CPartFile*)object)->GetFileHash().Encode() ) \ + USEREVENTS_REPLACE_VAR( \ + wxT("SIZE"), \ + wxTRANSLATE("The size of the file in bytes."), \ + (wxString)(CFormat(wxT("%llu")) % ((CPartFile*)object)->GetFileSize()) ) \ + USEREVENTS_REPLACE_VAR( \ + wxT("DLACTIVETIME"), \ + wxTRANSLATE("Cumulative download activity time."), \ + CastSecondsToHM(((CPartFile*)object)->GetDlActiveTime()) ) \ + ) \ + USEREVENTS_EVENT( \ + NewChatSession, \ + wxTRANSLATE("New chat session started"), \ + USEREVENTS_REPLACE_VAR( \ + wxT("SENDER"), \ + wxTRANSLATE("Message sender."), \ + *((wxString*)object) ) \ + ) \ + USEREVENTS_EVENT( \ + OutOfDiskSpace, \ + wxTRANSLATE("Out of space"), \ + USEREVENTS_REPLACE_VAR( \ + wxT("PARTITION"), \ + wxTRANSLATE("Disk partition."), \ + *((wxString*)object) ) \ + ) \ + USEREVENTS_EVENT( \ + ErrorOnCompletion, \ + wxTRANSLATE("Error on completion"), \ + USEREVENTS_REPLACE_VAR( \ + wxT("FILE"), \ + wxTRANSLATE("The full path to the file."), \ + ((CPartFile*)object)->GetFullName().GetRaw() ) \ + ) + + +#define USEREVENTS_EVENT(ID, NAME, VARS) ID, + +/** + * Class to handle userspace events. + * + * These events that we publish to the user and let him + * specify a command to be run when one of these events occur. + */ +class CUserEvents { + friend class CPreferences; + public: + //! Event list + enum EventType { + USEREVENTS_EVENTLIST() + }; + + /** + * Process a user event. + * + * Notes on the 'object' argument: this should be a pointer to + * an object instance, from which all of the replacement texts + * can be generated. + * + * Unfortunately this approach does not provide any type-safety, + * a list of string pairs (key, replacement) would be the best. + * However, this would need either expanding the macro at all of + * the places where CUserEvents::ProcessEvent is called from, or + * creating lists of parameters for each event, etc = more lists + * to keep in sync manually. + */ + static void ProcessEvent(enum EventType event, const void* object); + + /** + * Returns the number of defined user events. + */ + static unsigned int GetCount() ATTR(__const__); + + /** + * Returs the human-readable name of the event. + */ + static const wxString& GetDisplayName(enum EventType event) ATTR(__pure__); + + /** + * Checks whether the core command is enabled. + */ + static bool IsCoreCommandEnabled(enum EventType event) ATTR(__pure__); + + /** + * Checks whether the GUI command is enabled. + */ + static bool IsGUICommandEnabled(enum EventType event) ATTR(__pure__); + + private: + // functions for CPreferences + static const wxString& GetKey(const unsigned int event) ATTR(__pure__); + static bool& GetCoreEnableVar(const unsigned int event) ATTR(__pure__); + static wxString& GetCoreCommandVar(const unsigned int event) ATTR(__pure__); + static bool& GetGUIEnableVar(const unsigned int event) ATTR(__pure__); + static wxString& GetGUICommandVar(const unsigned int event) ATTR(__pure__); +}; + +#undef USEREVENTS_EVENT + +#endif /* USEREVENTS_H */ diff --git a/src/aMule.xpm b/src/aMule.xpm new file mode 100644 index 00000000..fefe9fcd --- /dev/null +++ b/src/aMule.xpm @@ -0,0 +1,634 @@ +/* XPM */ +static const char * aMule_xpm[] = { +"32 42 589 2", +" c None", +". c #EFEFEF", +"+ c #FFFFFF", +"@ c #DF7F34", +"# c #994C15", +"$ c #C3742E", +"% c #8A5E2E", +"& c #C47B48", +"* c #A36E35", +"= c #E9E7E6", +"- c #A85E27", +"; c #F1AE75", +"> c #975F32", +", c #FBFFFF", +"' c #81491C", +") c #C0793C", +"! c #B9763F", +"~ c #A37B52", +"{ c #6D401C", +"] c #95653A", +"^ c #C7BBB9", +"/ c #9D531D", +"( c #EDAD75", +"_ c #9D531C", +": c #D2D2D0", +"< c #814629", +"[ c #5F391A", +"} c #86561A", +"| c #E1E9F0", +"1 c #834A1C", +"2 c #B46D2F", +"3 c #E4A071", +"4 c #8E4E16", +"5 c #E9F2FA", +"6 c #B7B4AE", +"7 c #6B341A", +"8 c #633F21", +"9 c #944F1F", +"0 c #B69C8D", +"a c #DDE5ED", +"b c #904F17", +"c c #D89962", +"d c #C08851", +"e c #834608", +"f c #FEFFFF", +"g c #6F3316", +"h c #5D3B26", +"i c #7B4E27", +"j c #885124", +"k c #885A1D", +"l c #FCFFFF", +"m c #C7C6CF", +"n c #9C500E", +"o c #EDB67B", +"p c #B77642", +"q c #834B1F", +"r c #D1D8DC", +"s c #674128", +"t c #63412C", +"u c #874C26", +"v c #B17A54", +"w c #91571C", +"x c #CDCFD1", +"y c #B4B2A4", +"z c #9D510F", +"A c #ECB67C", +"B c #BF6B2D", +"C c #8A5F37", +"D c #41271E", +"E c #49261B", +"F c #62402B", +"G c #825821", +"H c #E8BE9E", +"I c #855A2F", +"J c #B5BABE", +"K c #BDC0B7", +"L c #B4BFBC", +"M c #A0541E", +"N c #EAAB74", +"O c #B36120", +"P c #BECBCA", +"Q c #3D2319", +"R c #3E2721", +"S c #694224", +"T c #A36227", +"U c #FFF1D9", +"V c #ADB7B3", +"W c #3C2615", +"X c #6F6668", +"Y c #7A450F", +"Z c #E9A76D", +"` c #9C4E15", +" . c #B7B5BD", +".. c #DADBDB", +"+. c #272119", +"@. c #252420", +"#. c #744823", +"$. c #3C1D18", +"%. c #72431E", +"&. c #8A5429", +"*. c #9D602A", +"=. c #E2B794", +"-. c #FFF0E2", +";. c #7C440D", +">. c #A5AEB7", +",. c #C7C8C9", +"'. c #B8AEAF", +"). c #020504", +"!. c #4C2921", +"~. c #865D27", +"{. c #A06430", +"]. c #A56B39", +"^. c #B67135", +"/. c #B16B2F", +"(. c #A76C2F", +"_. c #94601F", +":. c #A0A095", +"<. c #D0D3D7", +"[. c #B7B8B9", +"}. c #9AA2A8", +"|. c #6F4321", +"1. c #9F6431", +"2. c #BC7C48", +"3. c #BF7C43", +"4. c #BC7A42", +"5. c #C6813A", +"6. c #B97134", +"7. c #BD7132", +"8. c #AF6922", +"9. c #96837A", +"0. c #9B5C1C", +"a. c #B76F3B", +"b. c #C68044", +"c. c #D08349", +"d. c #CE8D49", +"e. c #E28F45", +"f. c #CB7C3C", +"g. c #B1ACA6", +"h. c #C18345", +"i. c #F8AD6B", +"j. c #E19D56", +"k. c #DF9157", +"l. c #F3A557", +"m. c #FFE3B9", +"n. c #ADA5A7", +"o. c #EA9447", +"p. c #D69156", +"q. c #BBBEC0", +"r. c #A0A1A1", +"s. c #D8DCE0", +"t. c #EC904D", +"u. c #0C0C09", +"v. c #C8AB8D", +"w. c #969799", +"x. c #FFF6EB", +"y. c #000000", +"z. c #7D5129", +"A. c #AE6F3F", +"B. c #D7BBA0", +"C. c #A2A4A6", +"D. c #E0C9A7", +"E. c #EEF0F2", +"F. c #CFD3D7", +"G. c #D9D2D5", +"H. c #D5D8D9", +"I. c #E0E0DF", +"J. c #D1D2D3", +"K. c #EDEEEF", +"L. c #9A9B9C", +"M. c #7F7B76", +"N. c #FBFCF2", +"O. c #E9EAEC", +"P. c #AFAFAF", +"Q. c #F6F6F6", +"R. c #F4F4FF", +"S. c #F5F5FF", +"T. c #F6F7F6", +"U. c #DEDFDF", +"V. c #2D2822", +"W. c #A7A8A8", +"X. c #B3B3B4", +"Y. c #A4A4A5", +"Z. c #A4A4A4", +"`. c #A1A2A2", +" + c #A0A0A0", +".+ c #A9A9A9", +"++ c #9B9B9A", +"@+ c #A7A7A6", +"#+ c #9C9C9C", +"$+ c #B7ADAD", +"%+ c #252727", +"&+ c #EDE3E3", +"*+ c #F3E8E8", +"=+ c #342F2A", +"-+ c #A3A3A4", +";+ c #B4B5B5", +">+ c #AFA4A4", +",+ c #A5A5A5", +"'+ c #A4A5A5", +")+ c #BAAFAF", +"!+ c #322D28", +"~+ c #D3D4D4", +"{+ c #ECEDED", +"]+ c #868787", +"^+ c #6F6A65", +"/+ c #EBEBE1", +"(+ c #575859", +"_+ c #3A2F25", +":+ c #B1B1B1", +"<+ c #A6A6A6", +"[+ c #A8A9A9", +"}+ c #ACADAE", +"|+ c #848586", +"1+ c #C3C4C4", +"2+ c #D2D2D3", +"3+ c #827C77", +"4+ c #8D8E8E", +"5+ c #E0E0E1", +"6+ c #D5D6CA", +"7+ c #515252", +"8+ c #B0A4A5", +"9+ c #AAAB9E", +"0+ c #9B9B9B", +"a+ c #A89C9C", +"b+ c #9E9E9E", +"c+ c #57574C", +"d+ c #BDBDB3", +"e+ c #B7B7B7", +"f+ c #C9CACA", +"g+ c #747475", +"h+ c #8C888E", +"i+ c #CFD3D6", +"j+ c #BFC0C0", +"k+ c #363637", +"l+ c #959696", +"m+ c #949494", +"n+ c #949595", +"o+ c #979797", +"p+ c #939494", +"q+ c #ACAEAF", +"r+ c #B2B7BB", +"s+ c #5D656D", +"t+ c #677270", +"u+ c #838587", +"v+ c #909599", +"w+ c #A8A9AA", +"x+ c #CFCFCF", +"y+ c #736C67", +"z+ c #B5ACB0", +"A+ c #B8C3BF", +"B+ c #FAA152", +"C+ c #F09145", +"D+ c #C56C1C", +"E+ c #C1CBD3", +"F+ c #AAACAE", +"G+ c #B2B2B2", +"H+ c #ABABAB", +"I+ c #8C8C8C", +"J+ c #8D8D8D", +"K+ c #898A8A", +"L+ c #B5ACAE", +"M+ c #A5ACB2", +"N+ c #BD9B83", +"O+ c #BB6624", +"P+ c #DC8830", +"Q+ c #E79042", +"R+ c #A49795", +"S+ c #8F9396", +"T+ c #A9A99E", +"U+ c #ABACAC", +"V+ c #AAAEB1", +"W+ c #9C571B", +"X+ c #E8964D", +"Y+ c #D98F4C", +"Z+ c #C9752A", +"`+ c #C2926F", +" @ c #A2AAB3", +".@ c #AFB3B7", +"+@ c #B3A9AB", +"@@ c #7E7E7E", +"#@ c #838484", +"$@ c #838485", +"%@ c #80887B", +"&@ c #7B8989", +"*@ c #8BA0A2", +"=@ c #7E4B19", +"-@ c #925923", +";@ c #BD702B", +">@ c #DA8442", +",@ c #E79953", +"'@ c #BD702D", +")@ c #ADB4BA", +"!@ c #B2B3B3", +"~@ c #E3E3E3", +"{@ c #636464", +"]@ c #CCCFD2", +"^@ c #BFC1C1", +"/@ c #D18A41", +"(@ c #D98E4B", +"_@ c #C58441", +":@ c #AA6326", +"<@ c #8C571F", +"[@ c #B29981", +"}@ c #B4BDC6", +"|@ c #7D858D", +"1@ c #838991", +"2@ c #837D85", +"3@ c #807B83", +"4@ c #90999D", +"5@ c #CA2425", +"6@ c #C32425", +"7@ c #FB9E97", +"8@ c #9C5B27", +"9@ c #CC7C34", +"0@ c #D98E4C", +"a@ c #DC9951", +"b@ c #A76734", +"c@ c #D1CACF", +"d@ c #D4D5D5", +"e@ c #807A75", +"f@ c #B0B1B2", +"g@ c #A6ADB3", +"h@ c #C0733C", +"i@ c #E99A48", +"j@ c #D0844D", +"k@ c #C2732E", +"l@ c #8F5F2E", +"m@ c #85501B", +"n@ c #A6642D", +"o@ c #9A6420", +"p@ c #794D17", +"q@ c #845A22", +"r@ c #8B5820", +"s@ c #B57F3D", +"t@ c #E52A4C", +"u@ c #EC7179", +"v@ c #F2B0BF", +"w@ c #9B652C", +"x@ c #D07D31", +"y@ c #E29149", +"z@ c #DA8F4D", +"A@ c #8E98A1", +"B@ c #9DA0A2", +"C@ c #BFBFBF", +"D@ c #55504B", +"E@ c #7E7F80", +"F@ c #797774", +"G@ c #67727C", +"H@ c #EA9C4D", +"I@ c #E69145", +"J@ c #C77D31", +"K@ c #704727", +"L@ c #9D6230", +"M@ c #AE7546", +"N@ c #C27D44", +"O@ c #CD8843", +"P@ c #D6924D", +"Q@ c #DD8F56", +"R@ c #E49554", +"S@ c #DF254C", +"T@ c #E95762", +"U@ c #F08387", +"V@ c #AB753A", +"W@ c #525254", +"X@ c #E79746", +"Y@ c #656A6D", +"Z@ c #686C6F", +"`@ c #7B7671", +" # c #635A5A", +".# c #66615C", +"+# c #584E4F", +"@# c #494846", +"## c #3F4243", +"$# c #E2EEF7", +"%# c #3A4855", +"&# c #8E5923", +"*# c #9B612F", +"=# c #C17D43", +"-# c #CA854B", +";# c #E19552", +"># c #DF9E5A", +",# c #DEA25A", +"'# c #DE9E4F", +")# c #DE224B", +"!# c #E53556", +"~# c #C6833D", +"{# c #38424A", +"]# c #FDF6F9", +"^# c #4D4E4E", +"/# c #3B3B3B", +"(# c #45403A", +"_# c #4F4545", +":# c #443A3A", +"<# c #3D373B", +"[# c #38353C", +"}# c #383842", +"|# c #3C3A43", +"1# c #39363E", +"2# c #3B383E", +"3# c #353640", +"4# c #905A2F", +"5# c #A56B3A", +"6# c #BF7C42", +"7# c #C8844A", +"8# c #D78B53", +"9# c #DF9E5B", +"0# c #EAA76A", +"a# c #DDA770", +"b# c #DEA15A", +"c# c #E09D52", +"d# c #C58A49", +"e# c #C48141", +"f# c #7B5933", +"g# c #DEDCE5", +"h# c #D8E1E9", +"i# c #D1DBE4", +"j# c #D5E0EA", +"k# c #DBE3EA", +"l# c #EEE6EA", +"m# c #F4F4F4", +"n# c #FFFFFE", +"o# c #635E5A", +"p# c #A8ABAD", +"q# c #A3AEB7", +"r# c #E89033", +"s# c #C37130", +"t# c #B2712E", +"u# c #94682F", +"v# c #8C4D24", +"w# c #713C25", +"x# c #996730", +"y# c #C8844B", +"z# c #DE9E5B", +"A# c #DDA76F", +"B# c #DE9D59", +"C# c #E29652", +"D# c #C7834A", +"E# c #C27D42", +"F# c #9B6235", +"G# c #834D22", +"H# c #A05E1B", +"I# c #BB7024", +"J# c #DA852E", +"K# c #DD8435", +"L# c #848E97", +"M# c #888B8E", +"N# c #A2A3A3", +"O# c #9C9494", +"P# c #42423D", +"Q# c #B4B5B6", +"R# c #A8ABAE", +"S# c #7B4012", +"T# c #E3853C", +"U# c #BE722F", +"V# c #A46B31", +"W# c #946432", +"X# c #835B33", +"Y# c #784D2B", +"Z# c #8C5A27", +"`# c #A6602F", +" $ c #C07D37", +".$ c #C68540", +"+$ c #D88D49", +"@$ c #E09451", +"#$ c #DE9D5A", +"$$ c #EB9D67", +"%$ c #DF945B", +"&$ c #D88C53", +"*$ c #C8854B", +"=$ c #C37E44", +"-$ c #90612F", +";$ c #865631", +">$ c #A36A30", +",$ c #CB7A34", +"'$ c #D88D4C", +")$ c #E99953", +"!$ c #9E5A21", +"~$ c #A9AEB3", +"{$ c #B2B2B3", +"]$ c #4A4242", +"^$ c #554F4A", +"/$ c #D7DAD1", +"($ c #B7C4C4", +"_$ c #CC853C", +":$ c #BE722E", +"<$ c #AE6A31", +"[$ c #926331", +"}$ c #8D5A27", +"|$ c #764D2B", +"1$ c #9D6431", +"2$ c #BA7B48", +"3$ c #C98742", +"4$ c #D0844B", +"5$ c #D88C49", +"6$ c #E19653", +"7$ c #E19652", +"8$ c #D78C47", +"9$ c #D08F4A", +"0$ c #BE7B42", +"a$ c #BC763A", +"b$ c #7C5625", +"c$ c #915C27", +"d$ c #B76C33", +"e$ c #D18737", +"f$ c #D88D4B", +"g$ c #DD9851", +"h$ c #9C632B", +"i$ c #C8CDD2", +"j$ c #535354", +"k$ c #5A5252", +"l$ c #B5B6B7", +"m$ c #9FA0A1", +"n$ c #99959C", +"o$ c #C47736", +"p$ c #D17D32", +"q$ c #AC6930", +"r$ c #9C6231", +"s$ c #8D5A32", +"t$ c #8A4E27", +"u$ c #753F28", +"v$ c #965426", +"w$ c #B2723B", +"x$ c #C27E47", +"y$ c #C68541", +"z$ c #CB864B", +"A$ c #D38A4D", +"B$ c #CA8244", +"C$ c #C37A39", +"D$ c #7F5831", +"E$ c #7F5827", +"F$ c #9B6232", +"G$ c #C0732F", +"H$ c #C48543", +"I$ c #E68D49", +"J$ c #D58C41", +"K$ c #ADB8C1", +"L$ c #BFC2C5", +"M$ c #C9C9C9", +"N$ c #6B6B63", +"O$ c #737373", +"P$ c #8E8E8E", +"Q$ c #858585", +"R$ c #787C80", +"S$ c #757C80", +"T$ c #E38633", +"U$ c #B77736", +"V$ c #B4702D", +"W$ c #986B30", +"X$ c #704932", +"Y$ c #2F343A", +"Z$ c #312F2A", +"`$ c #2D2B29", +" % c #534032", +".% c #BC7940", +"+% c #D98D3F", +"@% c #D88C4B", +"#% c #C4834B", +"$% c #725335", +"%% c #242B36", +"&% c #574333", +"*% c #7F512D", +"=% c #9A6033", +"-% c #B57330", +";% c #CE772B", +">% c #EB994F", +",% c #EAA054", +"'% c #997868", +")% c #898387", +"!% c #8A8A8A", +"~% c #959596", +"{% c #6B6B6B", +"]% c #636363", +"^% c #5D5D5D", +"/% c #666767", +"(% c #554E47", +"_% c #201F21", +":% c #242932", +"<% c #E2E9F2", +"[% c #A8B1AE", +"}% c #252933", +"|% c #222934", +"1% c #AA7948", +"2% c #5E656C", +"3% c #6C6F70", +"4% c #757777", +"5% c #787879", +"6% c #DEDED6", +"7% c #847B7B", +"8% c #2D2724", +" . ", +" + @ ", +" + # $ ", +" % & * ", +" = - ; > ", +" + , + ' ) ! ~ ", +" { ] + ^ / ( _ : ", +" < [ } | + 1 2 3 4 5 ", +" 6 7 8 9 0 + a b c d e f ", +" + g h i j k l m n o p q + ", +" r s t u v w + x y z A B C ", +" D E F G H I J K L M N O P ", +" + Q R S T U V W X Y Z ` ... ", +" + +.@.#.$.%.&.*.=.-.;.>.,. ", +" '.).!.~.{.].^./.(._.:.<. ", +" [.}.|.1.2.3.4.5.6.7.8. ", +" 9.0.a.b.c.d.e.+ + f. ", +" g.h. i.j.k.l. m.+ ", +" n. o.p.+ q. ", +" r. s.+ t.+ u. v. ", +" w.x. y.+ z.A. B. ", +" C.D. + E.F.G.H.I.J.K.L. ", +" M.N.O.P.P.Q.R.S.T.U.V.+ W. ", +" X.Y.Z.`. +.+++@+#+$+%+&+*+ ", +" + + =+-+;+>+Z.Z.,+'+)+!+~+{+]+ ", +" ^+/+(+_+[.'+:+<+<+[+}+|+1+2+3+ ", +" 4+5+6+7+8+9+0+0+a+b+c+d+e+f+g+ ", +" h+i+e+j+k+l+m+m+n+o+p+X.q+r+s+t+u+v+w+x+ ", +" y+z+A+B+C+D+E+F+G+H+I+I+I+J+g+K+L+M+N+O+P+Q+R+S+T+ ", +" U+V+W+X+Y+Z+`+ @.@+@@@#@#@$@%@&@*@=@-@;@>@,@'@)@!@~@ ", +" {@]@^@/@(@_@:@<@[@}@|@1@2@3@4@5@6@7@8@9@0@a@b@c@d@ ", +" e@f@g@h@i@j@k@l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@A@B@C@ ", +" D@E@F@G@H@I@J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@Y@Z@`@4+ ", +" #.#+#@###$#%#&#*#=#-#d.;#>#,#'#)#!#~#{# ]#^#/#(# ", +" _#:#<#[#}#|#1#2#3#4#5#6#7#8#9#0#a#b#c#d#e#f#g#h#i#j#k#l#m#n# ", +"o#!@p#q#r#s#t#u#v#w#x#5#3.y#8#z#0#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O#", +"P#Q#R#S#T#U#V#W#X#Y#Z#`# $.$+$@$#$$$%$&$*$=$-$;$>$,$'$)$!$~${$]$", +"P#^$/$($_$:$<$[$}$Y#|$1$2$3$4$5$6$7$8$9$0$a$b$c$d$e$f$g$h$i$j$P#", +"k$l$m$n$o$p$q$r$s$t$u$v$w$x$=#y$y#z$A$B$C$D$E$F$G$H$I$J$K$L$M$N$", +"O$P$Q$R$S$T$U$V$W$X$Y$Z$`$ %.%+%@%#%$%%%&%*%=%-%;%>%,%'%)%!%~%{%", +" ]%^%/%(%_%:%<% [%}%|%1%2%3%4%5%6%", +" #+,+ 7%8%8% "}; diff --git a/src/amule-gui.cpp b/src/amule-gui.cpp new file mode 100644 index 00000000..71bb2074 --- /dev/null +++ b/src/amule-gui.cpp @@ -0,0 +1,344 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "amule.h" // Interface declarations. + +#include +#include + +#include // Needed for wxClipBoard +#include // Needed for wxStringTokenizer + +#include "SharedFilesWnd.h" // Needed for CSharedFilesWnd +#include "Timer.h" // Needed for CTimer +#include "PartFile.h" // Needed for CPartFile +#include "updownclient.h" // Needed for CUpDownClient + +#include "muuli_wdr.h" // Needed for IDs +#include "amuleDlg.h" // Needed for CamuleDlg +#include "PartFileConvert.h" +#include "ThreadTasks.h" +#include "Logger.h" // Needed for EVT_MULE_LOGGING +#include "GuiEvents.h" // Needed for EVT_MULE_NOTIFY + +#ifdef __WXMAC__ + #include // Do_not_auto_remove + #include // For LSRegisterURL // Do_not_auto_remove +#endif + +#ifndef CLIENT_GUI +#include "InternalEvents.h" // Needed for wxEVT_* + +BEGIN_EVENT_TABLE(CamuleGuiApp, wxApp) + + // Socket handlers + // Listen Socket + EVT_SOCKET(ID_LISTENSOCKET_EVENT, CamuleGuiApp::ListenSocketHandler) + + // UDP Socket (servers) + EVT_SOCKET(ID_SERVERUDPSOCKET_EVENT, CamuleGuiApp::UDPSocketHandler) + // UDP Socket (clients) + EVT_SOCKET(ID_CLIENTUDPSOCKET_EVENT, CamuleGuiApp::UDPSocketHandler) + + // Socket timers (TCP + UDP) + EVT_MULE_TIMER(ID_SERVER_RETRY_TIMER_EVENT, CamuleGuiApp::OnTCPTimer) + + // Core timer + EVT_MULE_TIMER(ID_CORE_TIMER_EVENT, CamuleGuiApp::OnCoreTimer) + + EVT_MULE_NOTIFY(CamuleGuiApp::OnNotifyEvent) + EVT_MULE_LOGGING(CamuleGuiApp::OnLoggingEvent) + + // Async dns handling + EVT_MULE_INTERNAL(wxEVT_CORE_UDP_DNS_DONE, -1, CamuleGuiApp::OnUDPDnsDone) + + EVT_MULE_INTERNAL(wxEVT_CORE_SOURCE_DNS_DONE, -1, CamuleGuiApp::OnSourceDnsDone) + + EVT_MULE_INTERNAL(wxEVT_CORE_SERVER_DNS_DONE, -1, CamuleGuiApp::OnServerDnsDone) + + // Hash ended notifier + EVT_MULE_HASHING(CamuleGuiApp::OnFinishedHashing) + EVT_MULE_AICH_HASHING(CamuleGuiApp::OnFinishedAICHHashing) + + // File completion ended notifier + EVT_MULE_FILE_COMPLETED(CamuleGuiApp::OnFinishedCompletion) + + // HTTPDownload finished + EVT_MULE_INTERNAL(wxEVT_CORE_FINISHED_HTTP_DOWNLOAD, -1, CamuleGuiApp::OnFinishedHTTPDownload) +END_EVENT_TABLE() + + +IMPLEMENT_APP(CamuleGuiApp) + +#endif // CLIENT_GUI + +CamuleGuiBase::CamuleGuiBase() +{ + amuledlg = NULL; + m_FileDetailDialogActive = 0; +} + + +CamuleGuiBase::~CamuleGuiBase() +{ + #ifndef CLIENT_GUI + CPartFileConvert::StopThread(); + #endif +} + + +void CamuleGuiBase::ShowAlert(wxString msg, wxString title, int flags) +{ + wxMessageBox(msg, title, flags); +} + + +int CamuleGuiBase::InitGui(bool geometry_enabled, wxString &geom_string) +{ + // Standard size is 800x600 at position (0,0) + int geometry_x = 0; + int geometry_y = 0; + unsigned int geometry_width = 800; + unsigned int geometry_height = 600; + + if ( geometry_enabled ) { + // I plan on moving this to a separate function, as it just clutters up OnInit() + /* + This implementation might work with mac, provided that the + SetSize() function works as expected. + */ + + // Remove possible prefix + if ( geom_string.GetChar(0) == '=' ) { + geom_string.Remove( 0, 1 ); + } + + // Stupid ToLong functions forces me to use longs =( + long width = geometry_width; + long height = geometry_height; + + // Get the avilable display area + wxRect display = wxGetClientDisplayRect(); + + // We want to place aMule inside the client area by default + long x = display.x; + long y = display.y; + + // Tokenize the string + wxStringTokenizer tokens(geom_string, wxT("xX+-")); + + // First part: Program width + if ( tokens.GetNextToken().ToLong( &width ) ) { + wxString prefix = geom_string[ tokens.GetPosition() - 1 ]; + if ( prefix == wxT("x") || prefix == wxT("X") ) { + // Second part: Program height + if ( tokens.GetNextToken().ToLong( &height ) ) { + prefix = geom_string[ tokens.GetPosition() - 1 ]; + if ( prefix == wxT("+") || prefix == wxT("-") ) { + // Third part: X-Offset + if ( tokens.GetNextToken().ToLong( &x ) ) { + if ( prefix == wxT("-") ) + x = display.GetRight() - ( width + x ); + prefix = geom_string[ tokens.GetPosition() - 1 ]; + if ( prefix == wxT("+") || prefix == wxT("-") ) { + // Fourth part: Y-Offset + if ( tokens.GetNextToken().ToLong( &y ) ) { + if ( prefix == wxT("-") ) + y = display.GetBottom() - ( height + y ); + } + } + } + } + // We need at least height and width to override default geometry + geometry_enabled = true; + geometry_x = x; + geometry_y = y; + geometry_width = width; + geometry_height = height; + } + } + } + } + + // Should default/last-used position be overridden? +#ifdef SVNDATE + #ifdef CLIENT_GUI + m_FrameTitle = wxString::Format(wxT("aMule remote control %s %s"), wxT( VERSION ), wxT( SVNDATE )); + #else + m_FrameTitle = wxString::Format(wxT("aMule %s %s"), wxT( VERSION ), wxT( SVNDATE )); + #endif +#else + #ifdef CLIENT_GUI + m_FrameTitle = wxString::Format(wxT("aMule remote control %s"), wxT( VERSION )); + #else + m_FrameTitle = wxString::Format(wxT("aMule %s"), wxT( VERSION )); + #endif +#endif + if ( geometry_enabled ) { + amuledlg = new CamuleDlg(NULL, m_FrameTitle, + wxPoint(geometry_x,geometry_y), + wxSize( geometry_width, geometry_height - 58 )); + } else { + amuledlg = new CamuleDlg(NULL, m_FrameTitle); + } + + return 0; +} + + +// Sets the contents of the clipboard. Prior content erased. +bool CamuleGuiBase::CopyTextToClipboard(wxString strText) +{ + bool ClipBoardOpen = wxTheClipboard->Open(); + if (ClipBoardOpen) { + wxTheClipboard->UsePrimarySelection(false); + wxTheClipboard->SetData(new wxTextDataObject(strText)); + wxTheClipboard->Close(); + } + + return ClipBoardOpen; +} + + +#ifndef CLIENT_GUI + +int CamuleGuiApp::InitGui(bool geometry_enable, wxString &geometry_string) +{ + CamuleGuiBase::InitGui(geometry_enable, geometry_string); + SetTopWindow(amuledlg); + return 0; +} + + +void CamuleGuiApp::ShowAlert(wxString msg, wxString title, int flags) +{ + CamuleGuiBase::ShowAlert(msg, title, flags); +} + + +int CamuleGuiApp::OnExit() +{ + delete core_timer; + + return CamuleApp::OnExit(); +} + + +void CamuleGuiApp::ShutDown(wxCloseEvent &WXUNUSED(evt)) +{ + amuledlg->DlgShutDown(); + amuledlg->Destroy(); + CamuleApp::ShutDown(); +} + + +bool CamuleGuiApp::OnInit() +{ + amuledlg = NULL; + + if ( !CamuleApp::OnInit() ) { + return false; + } + + // Create the Core timer + core_timer = new CTimer(this,ID_CORE_TIMER_EVENT); + if (!core_timer) { + printf("Fatal Error: Failed to create Core Timer"); + OnExit(); + } + + // Start the Core and Gui timers + + // Note: wxTimer can be off by more than 10% !!! + // In addition to the systematic error introduced by wxTimer, we are losing + // timer cycles due to high CPU load. I've observed about 0.5% random loss of cycles under + // low load, and more than 6% lost cycles with heavy download traffic and/or other tasks + // in the system, such as a video player or a VMware virtual machine. + // The upload queue process loop has now been rewritten to compensate for timer errors. + // When adding functionality, assume that the timer is only approximately correct; + // for measurements, always use the system clock [::GetTickCount()]. + core_timer->Start(100); + amuledlg->StartGuiTimer(); + +#ifdef __WXMAC__ + // This tells the OS to notice the ed2kHelperScript.app inside aMule.app. + // ed2kHelperScript.app describes itself (Info.plist) as handling ed2k URLs. + // So, from then on the OS will know to pass ed2k URLs to the helper app. + CFURLRef ed2kHelperUrl = CFBundleCopyAuxiliaryExecutableURL( + CFBundleGetMainBundle(), CFSTR("ed2kHelperScript.app")); + if (ed2kHelperUrl) { + LSRegisterURL(ed2kHelperUrl, true); + CFRelease(ed2kHelperUrl); + } +#endif + + return true; +} + + +wxString CamuleGuiApp::GetLog(bool reset) +{ + if ( reset ) { + amuledlg->ResetLog(ID_LOGVIEW); + } + return CamuleApp::GetLog(reset); +} + + +wxString CamuleGuiApp::GetServerLog(bool reset) +{ + if ( reset ) { + amuledlg->ResetLog(ID_SERVERINFO); + } + return CamuleApp::GetServerLog(reset); +} + + +void CamuleGuiApp::AddServerMessageLine(wxString &msg) +{ + amuledlg->AddServerMessageLine(msg); + CamuleApp::AddServerMessageLine(msg); +} + + +void CamuleGuiApp::OnLoggingEvent(CLoggingEvent& evt) +{ + if (amuledlg) { + while ( !m_logLines.empty() ) { + QueuedLogLine entry = m_logLines.front(); + amuledlg->AddLogLine( entry.show, entry.line ); + m_logLines.pop_front(); + } + + amuledlg->AddLogLine(evt.IsCritical(), evt.Message()); + } else { + QueuedLogLine entry = { evt.Message(), evt.IsCritical() }; + m_logLines.push_back( entry ); + } + + CamuleApp::AddLogLine( evt.Message() ); +} + +#endif /* CLIENT_GUI */ +// File_checked_for_headers diff --git a/src/amule-remote-gui.cpp b/src/amule-remote-gui.cpp new file mode 100644 index 00000000..74d046d3 --- /dev/null +++ b/src/amule-remote-gui.cpp @@ -0,0 +1,1888 @@ +// +// This file is part of the aMule Project. +// +// Copyright (C) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#define AMULE_REMOTE_GUI_CPP + + +#include // Needed for auto_ptr +using std::auto_ptr; + + +#include +#include // Needed for wxCmdLineParser +#include // Do_not_auto_remove (win32) +#include // Needed for wxFileConfig + + +#include +#include +#include + + +#include + + +#include "amule.h" // Interface declarations. +#include "amuleDlg.h" // Needed for CamuleDlg +#include "ClientCredits.h" +#include "ClientListCtrl.h" +#include "DataToText.h" // Needed for GetSoftName() +#include "DownloadListCtrl.h" // Needed for CDownloadListCtrl +#include "GuiEvents.h" +#ifdef ENABLE_IP2COUNTRY + #include "IP2Country.h" // Needed for IP2Country +#endif +#include "Logger.h" +#include "muuli_wdr.h" // Needed for IDs +#include "PartFile.h" // Needed for CPartFile +#include "SearchDlg.h" // Needed for CSearchDlg +#include "Server.h" // Needed for GetListName +#include "ServerWnd.h" // Needed for CServerWnd +#include "SharedFilesCtrl.h" // Needed for CSharedFilesCtrl +#include "SharedFilesWnd.h" // Needed for CSharedFilesWnd +#include "TransferWnd.h" // Needed for CTransferWnd +#include "updownclient.h" +#include "ServerListCtrl.h" // Needed for CServerListCtrl +#include "MagnetURI.h" // Needed for CMagnetURI + + +CEConnectDlg::CEConnectDlg() +: +wxDialog(theApp->amuledlg, -1, _("Connect to remote amule"), wxDefaultPosition) +{ + CoreConnect(this, true); + + wxString pref_host, pref_port; + wxConfig::Get()->Read(wxT("/EC/Host"), &pref_host, wxT("localhost")); + wxConfig::Get()->Read(wxT("/EC/Port"), &pref_port, wxT("4712")); + wxConfig::Get()->Read(wxT("/EC/Password"), &pwd_hash); + + CastChild(ID_REMOTE_HOST, wxTextCtrl)->SetValue(pref_host); + CastChild(ID_REMOTE_PORT, wxTextCtrl)->SetValue(pref_port); + CastChild(ID_EC_PASSWD, wxTextCtrl)->SetValue(pwd_hash); + + CentreOnParent(); +} + + +wxString CEConnectDlg::PassHash() +{ + return pwd_hash; +} + + +BEGIN_EVENT_TABLE(CEConnectDlg, wxDialog) + EVT_BUTTON(wxID_OK, CEConnectDlg::OnOK) +END_EVENT_TABLE() + + +void CEConnectDlg::OnOK(wxCommandEvent& evt) +{ + wxString s_port = CastChild(ID_REMOTE_PORT, wxTextCtrl)->GetValue(); + port = StrToLong(s_port); + + host = CastChild(ID_REMOTE_HOST, wxTextCtrl)->GetValue(); + passwd = CastChild(ID_EC_PASSWD, wxTextCtrl)->GetValue(); + + if (passwd != pwd_hash) { + pwd_hash = MD5Sum(passwd).GetHash(); + } + m_save_user_pass = CastChild(ID_EC_SAVE, wxCheckBox)->IsChecked(); + evt.Skip(); +} + + +DEFINE_LOCAL_EVENT_TYPE(wxEVT_EC_INIT_DONE) + + +BEGIN_EVENT_TABLE(CamuleRemoteGuiApp, wxApp) + // Core timer + EVT_TIMER(ID_CORE_TIMER_EVENT, CamuleRemoteGuiApp::OnPollTimer) + + EVT_CUSTOM(wxEVT_EC_CONNECTION, -1, CamuleRemoteGuiApp::OnECConnection) + EVT_CUSTOM(wxEVT_EC_INIT_DONE, -1, CamuleRemoteGuiApp::OnECInitDone) + + EVT_MULE_NOTIFY(CamuleRemoteGuiApp::OnNotifyEvent) + EVT_MULE_LOGGING(CamuleRemoteGuiApp::OnLoggingEvent) +END_EVENT_TABLE() + + +IMPLEMENT_APP(CamuleRemoteGuiApp) + + +int CamuleRemoteGuiApp::OnExit() +{ + StopTickTimer(); + + return wxApp::OnExit(); +} + + +void CamuleRemoteGuiApp::OnPollTimer(wxTimerEvent&) +{ + static int request_step = 0; + + if (m_connect->RequestFifoFull()) { + return; + } + + switch (request_step) { + case 0: + serverconnect->ReQuery(); + serverlist->UpdateUserFileStatus(serverconnect->GetCurrentServer()); + request_step++; + break; + case 1: { + CECPacket stats_req(EC_OP_STAT_REQ); + m_connect->SendRequest(&m_stats_updater, &stats_req); + amuledlg->ShowTransferRate(); + request_step++; + break; + } + case 2: + if (amuledlg->m_sharedfileswnd->IsShown()) { + sharedfiles->DoRequery(EC_OP_GET_SHARED_FILES, EC_TAG_KNOWNFILE); + } else if (amuledlg->m_serverwnd->IsShown()) { + //serverlist->FullReload(EC_OP_GET_SERVER_LIST); + } else if (amuledlg->m_transferwnd->IsShown()) { + static bool firstcall = true; + downloadqueue->DoRequery( + theApp->m_FileDetailDialogActive || firstcall ? + EC_OP_GET_DLOAD_QUEUE_DETAIL : EC_OP_GET_DLOAD_QUEUE, + EC_TAG_PARTFILE); + firstcall = false; + switch(amuledlg->m_transferwnd->clientlistctrl->GetListView()) { + case vtUploading: + uploadqueue->ReQueryUp(); + break; + case vtQueued: + uploadqueue->ReQueryWait(); + break; + case vtClients: + break; + case vtNone: + break; + } + amuledlg->m_transferwnd->ShowQueueCount(theStats::GetWaitingUserCount()); + } else if (amuledlg->m_searchwnd->IsShown()) { + if (searchlist->m_curr_search != -1) { + searchlist->DoRequery(EC_OP_SEARCH_RESULTS, EC_TAG_SEARCHFILE); + } + } + // Back to the roots + request_step = 0; + break; + default: + printf("WTF?\n"); + request_step = 0; + } +} + + +void CamuleRemoteGuiApp::ShutDown(wxCloseEvent &WXUNUSED(evt)) +{ + // Stop the Core Timer + delete poll_timer; + poll_timer = NULL; + + // Destroy the EC socket + m_connect->Destroy(); + m_connect = NULL; + + // + if (amuledlg) { + amuledlg->DlgShutDown(); + amuledlg->Destroy(); + amuledlg = NULL; + } +} + + +bool CamuleRemoteGuiApp::OnInit() +{ + StartTickTimer(); + amuledlg = NULL; + if ( !wxApp::OnInit() ) { + return false; + } + + // Get theApp + theApp = &wxGetApp(); + + // Handle uncaught exceptions + InstallMuleExceptionHandler(); + + // Create the polling timer + poll_timer = new wxTimer(this,ID_CORE_TIMER_EVENT); + if (!poll_timer) { + printf("Fatal Error: Failed to create Poll Timer"); + OnExit(); + } + + m_connect = new CRemoteConnect(this); + SetAppName(wxT("aMule")); + + // Load Preferences + // This creates the CFG file we shall use + ConfigDir = GetConfigDir(); + if (!wxDirExists(ConfigDir)) { + wxMkdir(ConfigDir); + } + + wxConfig::Set(new wxFileConfig(wxEmptyString, wxEmptyString, + ConfigDir + wxT("remote.conf"))); + + glob_prefs = new CPreferencesRem(m_connect); + + InitCustomLanguages(); + InitLocale(m_locale, StrLang2wx(thePrefs::GetLanguageID())); + + bool result = ShowConnectionDialog(); + + printf("Going to event loop...\n"); + + return result; +} + + +bool CamuleRemoteGuiApp::CryptoAvailable() const +{ + return clientcredits && clientcredits->CryptoAvailable(); +} + + +bool CamuleRemoteGuiApp::ShowConnectionDialog() { + + dialog = new CEConnectDlg; + + if (dialog->ShowModal() != wxID_OK) { + dialog->Destroy(); + + return false; + } + printf("Connecting...\n"); + if (!m_connect->ConnectToCore(dialog->Host(), dialog->Port(), + dialog->Login(), dialog->PassHash(), + wxT("amule-remote"), wxT("0x0001"))) { + wxMessageBox(_("Connection failed "),_("Error"),wxOK); + + return false; + } + + return true; +} + + +void CamuleRemoteGuiApp::OnECConnection(wxEvent& event) { + wxECSocketEvent& evt = *((wxECSocketEvent*)&event); + printf("Remote GUI EC event handler\n"); + AddLogLineM(true,evt.GetServerReply()); + if (evt.GetResult() == true) { + // Connected - go to next init step + glob_prefs->LoadRemote(); + } else { + printf("Going down\n"); + ExitMainLoop(); + } +} + + +void CamuleRemoteGuiApp::OnECInitDone(wxEvent& ) +{ + Startup(); +} + + +void CamuleRemoteGuiApp::OnLoggingEvent(CLoggingEvent& evt) +{ + printf("LOG: %s\n", unicode2char(evt.Message()).data()); +} + + +void CamuleRemoteGuiApp::OnNotifyEvent(CMuleGUIEvent& evt) +{ + evt.Notify(); +} + + +void CamuleRemoteGuiApp::Startup() { + + if (dialog->SaveUserPass()) { + wxConfig::Get()->Write(wxT("/EC/Host"), dialog->Host()); + wxConfig::Get()->Write(wxT("/EC/Port"), dialog->Port()); + wxConfig::Get()->Write(wxT("/EC/Password"), dialog->PassHash()); + } + dialog->Destroy(); + + m_ConnState = 0; + m_clientID = 0; + + serverconnect = new CServerConnectRem(m_connect); + m_statistics = new CStatistics(*m_connect); + + clientlist = new CClientListRem(m_connect); + searchlist = new CSearchListRem(m_connect); + serverlist = new CServerListRem(m_connect); + + sharedfiles = new CSharedFilesRem(m_connect); + knownfiles = new CKnownFilesRem(sharedfiles); + + clientcredits = new CClientCreditsRem(); + + // bugfix - do this before creating the uploadqueue + downloadqueue = new CDownQueueRem(m_connect); + uploadqueue = new CUpQueueRem(m_connect); + ipfilter = new CIPFilterRem(m_connect); + + // Parse cmdline arguments. + wxCmdLineParser cmdline(wxApp::argc, wxApp::argv); + cmdline.AddSwitch(wxT("v"), wxT("version"), + wxT("Displays the current version number.")); + cmdline.AddSwitch(wxT("h"), wxT("help"), + wxT("Displays this information.")); + cmdline.AddOption(wxT("geometry"), wxEmptyString, wxT( + "Sets the geometry of the app.\n" + "\t\t\t uses the same format as standard X11 apps:\n" + "\t\t\t[=][{xX}][{+-}{+-}]")); + cmdline.Parse(); + + bool geometry_enabled = false; + wxString geom_string; + if (cmdline.Found(wxT("geometry"), &geom_string)) { + geometry_enabled = true; + } + + // Create main dialog + InitGui(0, geom_string); + + // Forward wxLog events to CLogger + wxLog::SetActiveTarget(new CLoggerTarget); + serverlist->FullReload(EC_OP_GET_SERVER_LIST); + sharedfiles->DoRequery(EC_OP_GET_SHARED_FILES, EC_TAG_KNOWNFILE); + + // Start the Poll Timer + poll_timer->Start(1000); + amuledlg->StartGuiTimer(); +} + + +void CamuleRemoteGuiApp::ShowAlert(wxString msg, wxString title, int flags) +{ + CamuleGuiBase::ShowAlert(msg, title, flags); +} + + +int CamuleRemoteGuiApp::InitGui(bool geometry_enabled, wxString &geom_string) +{ + CamuleGuiBase::InitGui(geometry_enabled, geom_string); + SetTopWindow(amuledlg); + return 0; +} + + +bool CamuleRemoteGuiApp::CopyTextToClipboard(wxString strText) +{ + return CamuleGuiBase::CopyTextToClipboard(strText); +} + + +uint32 CamuleRemoteGuiApp::GetPublicIP() +{ + return 0; +} + + +wxString CamuleRemoteGuiApp::GetLog(bool) +{ + return wxEmptyString; +} + + +wxString CamuleRemoteGuiApp::GetServerLog(bool) +{ + return wxEmptyString; +} + + +wxString CamuleRemoteGuiApp::CreateMagnetLink(const CAbstractFile* f) +{ + // TODO: Remove duplicate code (also in amule.cpp) ... + CMagnetURI uri; + + uri.AddField(wxT("dn"), f->GetFileName().Cleanup(false).GetPrintable()); + uri.AddField(wxT("xt"), wxString(wxT("urn:ed2k:")) + f->GetFileHash().Encode().Lower()); + uri.AddField(wxT("xl"), wxString::Format(wxT("%") wxLongLongFmtSpec wxT("u"), f->GetFileSize())); + + return uri.GetLink(); +} + +wxString CamuleRemoteGuiApp::CreateED2kLink(const CAbstractFile* f, bool add_source, bool use_hostname, bool addcryptoptions) +{ + // TODO: Avoid duplicate code (also in amule.cpp) ... + wxASSERT(!(!add_source && (use_hostname || addcryptoptions))); + // Construct URL like this: ed2k://|file||||/ + wxString strURL = CFormat(wxT("ed2k://|file|%s|%i|%s|/")) + % f->GetFileName().Cleanup(false) + % f->GetFileSize() % f->GetFileHash().Encode(); + + if (add_source && IsConnected() && !IsFirewalled()) { + // Create the first part of the URL + strURL << wxT("|sources,"); + + if (use_hostname) { + strURL << thePrefs::GetYourHostname(); + } else { + uint32 clientID = GetID(); + strURL << (uint8) clientID << wxT(".") << + (uint8)(clientID >> 8) << wxT(".") << + (uint8)(clientID >> 16) << wxT(".") << + (uint8)(clientID >> 24); + } + + strURL << wxT(":") << + thePrefs::GetPort(); + + if (addcryptoptions) { + const uint8 uSupportsCryptLayer = thePrefs::IsClientCryptLayerSupported() ? 1 : 0; + const uint8 uRequestsCryptLayer = thePrefs::IsClientCryptLayerRequested() ? 1 : 0; + const uint8 uRequiresCryptLayer = thePrefs::IsClientCryptLayerRequired() ? 1 : 0; + const uint8 byCryptOptions = (uRequiresCryptLayer << 2) | (uRequestsCryptLayer << 1) | (uSupportsCryptLayer << 0) | (uSupportsCryptLayer ? 0x80 : 0x00); + + strURL << wxT(":") << byCryptOptions; + + if (byCryptOptions & 0x80) { + strURL << wxT(":") << thePrefs::GetUserHash().Encode(); + } + + } + strURL << wxT("|/"); + } else if (add_source) { + AddLogLineM(true, _("WARNING: You can't add yourself as a source for a ed2k link while being lowid.")); + } + + // Result is "ed2k://|file||||/|sources,[(|):[:cryptoptions[:hash]]]|/" + return strURL; +} + + +wxString CamuleRemoteGuiApp::CreateED2kAICHLink(const CKnownFile* f) +{ + // TODO: Avoid duplicate code (also in amule.cpp) ... + // Create the first part of the URL + wxString strURL = CreateED2kLink(f); + // Append the AICH info + if (f->HasProperAICHHashSet()) { + strURL << wxT("|h=") << f->GetAICHMasterHash() << wxT("|/"); + } + + // Result is "ed2k://|file||||/|h=|/" + return strURL; +} + + +bool CamuleRemoteGuiApp::AddServer(CServer *, bool) +{ + // #warning TODO: Add remote command + return true; +} + + +bool CamuleRemoteGuiApp::IsFirewalled() const +{ + if (IsConnectedED2K() && !serverconnect->IsLowID()) { + return false; + } + + return IsFirewalledKad(); +} + + +bool CamuleRemoteGuiApp::IsConnectedED2K() const { + return serverconnect && serverconnect->IsConnected(); +} + + +void CamuleRemoteGuiApp::StartKad() { + m_connect->StartKad(); +} + + +void CamuleRemoteGuiApp::StopKad() { + m_connect->StopKad(); +} + + +void CamuleRemoteGuiApp::BootstrapKad(uint32 ip, uint16 port) +{ + CECPacket req(EC_OP_KAD_BOOTSTRAP_FROM_IP); + req.AddTag(CECTag(EC_TAG_BOOTSTRAP_IP, ip)); + req.AddTag(CECTag(EC_TAG_BOOTSTRAP_PORT, port)); + + m_connect->SendPacket(&req); +} + + +void CamuleRemoteGuiApp::UpdateNotesDat(const wxString& url) +{ + CECPacket req(EC_OP_KAD_UPDATE_FROM_URL); + req.AddTag(CECTag(EC_TAG_KADEMLIA_UPDATE_URL, url)); + + m_connect->SendPacket(&req); +} + + +void CamuleRemoteGuiApp::DisconnectED2K() { + if (IsConnectedED2K()) { + m_connect->DisconnectED2K(); + } +} + + +uint32 CamuleRemoteGuiApp::GetED2KID() const +{ + return serverconnect ? serverconnect->GetClientID() : 0; +} + + +uint32 CamuleRemoteGuiApp::GetID() const +{ + return m_clientID; +} + + +void CamuleRemoteGuiApp::ShowUserCount() { + wxString buffer = + CFormat(_("Users: E: %s K: %s | Files E: %s K: %s")) % CastItoIShort(theStats::GetED2KUsers()) % + CastItoIShort(theStats::GetKadUsers()) % CastItoIShort(theStats::GetED2KFiles()) % CastItoIShort(theStats::GetKadFiles()); + + Notify_ShowUserCount(buffer); +} + + +/* + * Preferences: holds both local and remote settings. + * + * First, everything is loaded from local config file. Later, settings + * that are relevant on remote side only are loaded thru EC + */ +CPreferencesRem::CPreferencesRem(CRemoteConnect *conn) +{ + m_conn = conn; + + CPreferences::BuildItemList(theApp->ConfigDir); + CPreferences::LoadAllItems(wxConfigBase::Get()); + + // + // Settings queried from remote side + // + m_exchange_send_selected_prefs = + EC_PREFS_GENERAL | + EC_PREFS_CONNECTIONS | + EC_PREFS_MESSAGEFILTER | + EC_PREFS_ONLINESIG | + EC_PREFS_SERVERS | + EC_PREFS_FILES | + EC_PREFS_SRCDROP | + EC_PREFS_SECURITY | + EC_PREFS_CORETWEAKS | + EC_PREFS_REMOTECONTROLS | + EC_PREFS_KADEMLIA; + m_exchange_recv_selected_prefs = + m_exchange_send_selected_prefs | + EC_PREFS_CATEGORIES; +} + + +void CPreferencesRem::HandlePacket(const CECPacket *packet) +{ + ((CEC_Prefs_Packet *)packet)->Apply(); + + if ( packet->GetTagByName(EC_TAG_PREFS_CATEGORIES) != 0 ) { + for (int i = 0; i < packet->GetTagByName(EC_TAG_PREFS_CATEGORIES)->GetTagCount(); i++) { + const CECTag *cat_tag = packet->GetTagByName(EC_TAG_PREFS_CATEGORIES)->GetTagByIndex(i); + Category_Struct *cat = new Category_Struct; + cat->title = cat_tag->GetTagByName(EC_TAG_CATEGORY_TITLE)->GetStringData(); + cat->path = CPath(cat_tag->GetTagByName(EC_TAG_CATEGORY_PATH)->GetStringData()); + cat->comment = cat_tag->GetTagByName(EC_TAG_CATEGORY_COMMENT)->GetStringData(); + cat->color = cat_tag->GetTagByName(EC_TAG_CATEGORY_COLOR)->GetInt(); + cat->prio = cat_tag->GetTagByName(EC_TAG_CATEGORY_PRIO)->GetInt(); + theApp->glob_prefs->AddCat(cat); + } + } else { + Category_Struct *cat = new Category_Struct; + cat->title = _("All"); + cat->color = 0; + cat->prio = PR_NORMAL; + theApp->glob_prefs->AddCat(cat); + } + wxECInitDoneEvent event; + theApp->AddPendingEvent(event); + +} + + +bool CPreferencesRem::LoadRemote() +{ + // + // override local settings with remote + CECPacket req(EC_OP_GET_PREFERENCES, EC_DETAIL_UPDATE); + + // bring categories too + req.AddTag(CECTag(EC_TAG_SELECT_PREFS, m_exchange_recv_selected_prefs)); + + m_conn->SendRequest(this, &req); + + return true; +} + + +void CPreferencesRem::SendToRemote() +{ + CEC_Prefs_Packet pref_packet(m_exchange_send_selected_prefs, EC_DETAIL_UPDATE, EC_DETAIL_FULL); + m_conn->SendPacket(&pref_packet); +} + + +Category_Struct *CPreferencesRem::CreateCategory( + const wxString& name, + const CPath& path, + const wxString& comment, + uint32 color, + uint8 prio) +{ + CECPacket req(EC_OP_CREATE_CATEGORY); + CEC_Category_Tag tag(0xffffffff, name, path.GetRaw(), comment, color, prio); + req.AddTag(tag); + m_conn->SendPacket(&req); + + Category_Struct *category = new Category_Struct(); + category->path = path; + category->title = name; + category->comment = comment; + category->color = color; + category->prio = prio; + + AddCat(category); + + return category; +} + + +void CPreferencesRem::UpdateCategory( + uint8 cat, + const wxString& name, + const CPath& path, + const wxString& comment, + uint32 color, + uint8 prio) +{ + CECPacket req(EC_OP_UPDATE_CATEGORY); + CEC_Category_Tag tag(cat, name, path.GetRaw(), comment, color, prio); + req.AddTag(tag); + m_conn->SendPacket(&req); + + Category_Struct *category = m_CatList[cat]; + category->path = path; + category->title = name; + category->comment = comment; + category->color = color; + category->prio = prio; +} + + +void CPreferencesRem::RemoveCat(uint8 cat) +{ + CECPacket req(EC_OP_DELETE_CATEGORY); + CEC_Category_Tag tag(cat, EC_DETAIL_CMD); + req.AddTag(tag); + m_conn->SendPacket(&req); + CPreferences::RemoveCat(cat); +} + + +// +// Container implementation +// +CServerConnectRem::CServerConnectRem(CRemoteConnect *conn) +{ + m_CurrServer = 0; + m_Conn = conn; +} + + +void CServerConnectRem::ConnectToAnyServer() +{ + CECPacket req(EC_OP_SERVER_CONNECT); + m_Conn->SendPacket(&req); +} + + +void CServerConnectRem::StopConnectionTry() +{ + // lfroen: isn't Disconnect the same ? +} + + +void CServerConnectRem::Disconnect() +{ + CECPacket req(EC_OP_SERVER_DISCONNECT); + m_Conn->SendPacket(&req); +} + + +void CServerConnectRem::ConnectToServer(CServer *server) +{ + m_Conn->ConnectED2K(server->GetIP(), server->GetPort()); +} + + +bool CServerConnectRem::ReQuery() +{ + CECPacket stat_req(EC_OP_STAT_REQ); + m_Conn->SendRequest(this, &stat_req); + + return true; +} + + +void CServerConnectRem::HandlePacket(const CECPacket *packet) +{ + CEC_ConnState_Tag *tag = + (CEC_ConnState_Tag *)packet->GetTagByName(EC_TAG_CONNSTATE); + if (!tag) { + return; + } + + theApp->m_ConnState = 0; + CServer *server; + m_ID = tag->GetEd2kId(); + theApp->m_clientID = tag->GetClientId(); + + if (tag->IsConnectedED2K()) { + CECTag *srvtag = tag->GetTagByName(EC_TAG_SERVER); + if (!srvtag) { + return; + } + server = theApp->serverlist->GetByID(srvtag->GetIPv4Data().IP()); + if (m_CurrServer && (server != m_CurrServer)) { + theApp->amuledlg->m_serverwnd->serverlistctrl-> + HighlightServer(m_CurrServer, false); + } + theApp->amuledlg->m_serverwnd->serverlistctrl-> + HighlightServer(server, true); + m_CurrServer = server; + theApp->m_ConnState |= CONNECTED_ED2K; + } else { + if ( m_CurrServer ) { + theApp->amuledlg->m_serverwnd->serverlistctrl-> + HighlightServer(m_CurrServer, false); + m_CurrServer = 0; + } + } + + if (tag->IsConnectedKademlia()) { + if (tag->IsKadFirewalled()) { + theApp->m_ConnState |= CONNECTED_KAD_FIREWALLED; + } else { + theApp->m_ConnState |= CONNECTED_KAD_OK; + } + } else { + if (tag->IsKadRunning()) { + theApp->m_ConnState |= CONNECTED_KAD_NOT; + } + } + + theApp->amuledlg->ShowConnectionState(); +} + + +/* + * Server list: host list of ed2k servers. + */ +CServerListRem::CServerListRem(CRemoteConnect *conn) +: +CRemoteContainer(conn) +{ +} + + +void CServerListRem::HandlePacket(const CECPacket *packet) +{ + CRemoteContainer::HandlePacket(packet); + ReloadControl(); +} + + +void CServerListRem::UpdateServerMetFromURL(wxString url) +{ + CECPacket req(EC_OP_SERVER_UPDATE_FROM_URL); + req.AddTag(CECTag(EC_TAG_SERVERS_UPDATE_URL, url)); + + m_conn->SendPacket(&req); +} + + +void CServerListRem::SaveServerMet() +{ + // lfroen: stub, nothing to do +} + + +void CServerListRem::FilterServers() +{ + // FIXME: add code + //wxASSERT(0); +} + + +void CServerListRem::RemoveServer(CServer* server) +{ + m_conn->RemoveServer(server->GetIP(),server->GetPort()); +} + + +void CServerListRem::UpdateUserFileStatus(CServer *server) +{ + if (server) { + m_TotalUser = server->GetUsers(); + m_TotalFile = server->GetFiles(); + + wxString buffer = + CFormat(_("Total Users: %s | Total Files: %s")) % CastItoIShort(m_TotalUser) % CastItoIShort(m_TotalFile); + + Notify_ShowUserCount(buffer); + } +} + + +CServer *CServerListRem::GetServerByAddress(const wxString& WXUNUSED(address), uint16 WXUNUSED(port)) const +{ + // It's ok to return 0 for context where this code is used in remote gui + return 0; +} + +CServer *CServerListRem::GetServerByIPTCP(uint32 WXUNUSED(nIP), uint16 WXUNUSED(nPort)) const +{ + // It's ok to return 0 for context where this code is used in remote gui + return 0; +} + +CServer *CServerListRem::CreateItem(CEC_Server_Tag *tag) +{ + return new CServer(tag); +} + + +void CServerListRem::DeleteItem(CServer *in_srv) +{ + auto_ptr srv(in_srv); + theApp->amuledlg->m_serverwnd->serverlistctrl->RemoveServer(srv.get()); +} + + +uint32 CServerListRem::GetItemID(CServer *server) +{ + return server->GetIP(); +} + + +void CServerListRem::ProcessItemUpdate(CEC_Server_Tag *, CServer *) +{ + // server list is always realoaded from scratch + wxASSERT(0); +} + + +void CServerListRem::ReloadControl() +{ + for(uint32 i = 0;i < GetCount(); i++) { + CServer *srv = GetByIndex(i); + theApp->amuledlg->m_serverwnd->serverlistctrl->RefreshServer(srv); + } +} + + +CIPFilterRem::CIPFilterRem(CRemoteConnect* conn) +{ + m_conn = conn; +} + + +void CIPFilterRem::Reload() +{ + CECPacket req(EC_OP_IPFILTER_RELOAD); + m_conn->SendPacket(&req); +} + + +void CIPFilterRem::Update(wxString WXUNUSED(url)) +{ + // FIXME: add command + //wxASSERT(0); +} + + +/* + * Shared files list + */ +CSharedFilesRem::CSharedFilesRem(CRemoteConnect *conn) : CRemoteContainer(conn, true) +{ + m_rename_file = NULL; +} + + +void CSharedFilesRem::Reload(bool, bool) +{ + CECPacket req(EC_OP_SHAREDFILES_RELOAD); + + m_conn->SendPacket(&req); +} + + +void CSharedFilesRem::AddFilesFromDirectory(const CPath& path) +{ + CECPacket req(EC_OP_SHAREDFILES_ADD_DIRECTORY); + + req.AddTag(CECTag(EC_TAG_PREFS_DIRECTORIES, path.GetRaw())); + + m_conn->SendPacket(&req); +} + + +bool CSharedFilesRem::RenameFile(CKnownFile* file, const CPath& newName) +{ + // We use the printable name, as the filename originated from user input, + // and the filesystem name might not be valid on the remote host. + const wxString strNewName = newName.GetPrintable(); + + CECPacket request(EC_OP_RENAME_FILE); + request.AddTag(CECTag(EC_TAG_KNOWNFILE, file->GetFileHash())); + request.AddTag(CECTag(EC_TAG_PARTFILE_NAME, strNewName)); + + m_conn->SendRequest(this, &request); + m_rename_file = file; + m_new_name = strNewName; + + return true; +} + + +void CSharedFilesRem::HandlePacket(const CECPacket *packet) +{ + if (m_rename_file && (packet->GetOpCode() == EC_OP_NOOP)) { + m_rename_file->SetFileName(CPath(m_new_name)); + m_rename_file = NULL; + } else if (packet->GetOpCode() != EC_OP_FAILED) { + CRemoteContainer::HandlePacket(packet); + } +} + + +CKnownFile *CSharedFilesRem::CreateItem(CEC_SharedFile_Tag *tag) +{ + CKnownFile *file = new CKnownFile(tag); + + m_enc_map[file->GetFileHash()] = RLE_Data(file->GetPartCount(), true); + + ProcessItemUpdate(tag, file); + + theApp->amuledlg->m_sharedfileswnd->sharedfilesctrl->ShowFile(file); + + return file; +} + + +void CSharedFilesRem::DeleteItem(CKnownFile *in_file) +{ + auto_ptr file(in_file); + + m_enc_map.erase(file->GetFileHash()); + + theApp->amuledlg->m_sharedfileswnd->sharedfilesctrl->RemoveFile(file.get()); +} + + +CMD4Hash CSharedFilesRem::GetItemID(CKnownFile *file) +{ + return file->GetFileHash(); +} + + +void CSharedFilesRem::ProcessItemUpdate(CEC_SharedFile_Tag *tag, CKnownFile *file) +{ + CECTag *parttag = tag->GetTagByName(EC_TAG_PARTFILE_PART_STATUS); + const unsigned char *data = + m_enc_map[file->GetFileHash()].Decode( + (unsigned char *)parttag->GetTagData(), + parttag->GetTagDataLen()); + for(int i = 0; i < file->GetPartCount(); ++i) { + file->m_AvailPartFrequency[i] = data[i]; + } + if (m_inc_tags) { + tag->SetRequests(file->statistic.requested); + tag->SetAllRequests(file->statistic.alltimerequested); + tag->SetAccepts(file->statistic.accepted); + tag->SetAllAccepts(file->statistic.alltimeaccepted); + tag->SetXferred(file->statistic.transferred ); + tag->SetAllXferred(file->statistic.alltimetransferred); + tag->SetPrio(file->m_iUpPriority); + } else { + file->statistic.requested = tag->GetRequests(); + file->statistic.alltimerequested = tag->GetAllRequests(); + file->statistic.accepted = tag->GetAccepts(); + file->statistic.alltimeaccepted = tag->GetAllAccepts(); + file->statistic.transferred = tag->GetXferred(); + file->statistic.alltimetransferred = tag->GetAllXferred(); + file->m_iUpPriority = tag->Prio(); + } + if (file->m_iUpPriority >= 10) { + file->m_iUpPriority -= 10; + file->m_bAutoUpPriority = true; + } else { + file->m_bAutoUpPriority = false; + } + + theApp->knownfiles->requested += file->statistic.requested; + theApp->knownfiles->transferred += file->statistic.transferred; + theApp->knownfiles->accepted += file->statistic.transferred; + + theApp->amuledlg->m_sharedfileswnd->sharedfilesctrl->UpdateItem(file); +} + +bool CSharedFilesRem::Phase1Done(const CECPacket *) +{ + theApp->knownfiles->requested = 0; + theApp->knownfiles->transferred = 0; + theApp->knownfiles->accepted = 0; + + return true; +} + +void CSharedFilesRem::SetFilePrio(CKnownFile *file, uint8 prio) +{ + CECPacket req(EC_OP_SHARED_SET_PRIO); + + CECTag hashtag(EC_TAG_PARTFILE, file->GetFileHash()); + hashtag.AddTag(CECTag(EC_TAG_PARTFILE_PRIO, prio)); + + req.AddTag(hashtag); + + m_conn->SendPacket(&req); +} + +/* + * List of uploading and waiting clients. + */ +CUpDownClientListRem::CUpDownClientListRem(CRemoteConnect *conn, int viewtype) +: +CRemoteContainer(conn) +{ + m_viewtype = viewtype; +} + + +CUpDownClient::CUpDownClient(CEC_UpDownClient_Tag *tag) +{ + m_bRemoteQueueFull = false; + m_nUserIDHybrid = tag->ID(); + m_Username = tag->ClientName(); + m_score = tag->Score(); + m_clientSoft = tag->ClientSoftware(); + m_clientVersionString = GetSoftName(m_clientSoft); + m_clientSoftString = m_clientVersionString; + + // The functions to retrieve m_clientVerString information are + // currently in BaseClient.cpp, which is not linked in remote-gui app. + // So, in the meantime, we use a tag sent from core. + m_clientVerString = tag->SoftVerStr(); + m_strModVersion = wxEmptyString; + wxString clientModString; + if (!clientModString.IsEmpty()) { + m_clientVerString += wxT(" - ") + clientModString; + } + m_fullClientVerString = m_clientSoftString + wxT(" ") + m_clientVerString; + + // User hash + m_UserHash = tag->UserID(); + + // User IP:Port + m_nConnectIP = m_dwUserIP = tag->UserIP(); + m_nUserPort = tag->UserPort(); + m_FullUserIP = Uint32toStringIP(m_nConnectIP); + + // Server IP:Port + m_dwServerIP = tag->ServerIP(); + m_nServerPort = tag->ServerPort(); + m_ServerName = tag->ServerName(); + + m_waitingPosition = tag->WaitingPosition(); + + m_Friend = 0; + if (tag->HaveFile()) { + CMD4Hash filehash = tag->FileID(); + m_uploadingfile = theApp->sharedfiles->GetByID(filehash); + if (!m_uploadingfile) { + m_uploadingfile = theApp->downloadqueue->GetByID(filehash); + } + } else { + m_uploadingfile = NULL; + } + + m_nCurSessionUp = 0; + + credits = new CClientCredits(new CreditStruct()); +} + +uint16 CUpQueueRem::GetWaitingPosition(const CUpDownClient *client) const +{ + return client->GetWaitingPosition(); +} + +/* Warning: do common base */ + + +bool CUpDownClient::IsIdentified() const +{ + return (credits && credits->GetCurrentIdentState(GetIP()) == IS_IDENTIFIED); +} + + +bool CUpDownClient::IsBadGuy() const +{ + return (credits && credits->GetCurrentIdentState(GetIP()) == IS_IDBADGUY); +} + + +bool CUpDownClient::SUIFailed() const +{ + return (credits && credits->GetCurrentIdentState(GetIP()) == IS_IDFAILED); +} + + +bool CUpDownClient::SUINeeded() const +{ + return (credits && credits->GetCurrentIdentState(GetIP()) == IS_IDNEEDED); +} + + +bool CUpDownClient::SUINotSupported() const +{ + return (credits && credits->GetCurrentIdentState(GetIP()) == IS_NOTAVAILABLE); +} + + +uint64 CUpDownClient::GetDownloadedTotal() const +{ + return credits ? credits->GetDownloadedTotal() : 0; +} + + +uint64 CUpDownClient::GetUploadedTotal() const +{ + return credits ? credits->GetUploadedTotal() : 0; +} + + +double CUpDownClient::GetScoreRatio() const +{ + return credits ? credits->GetScoreRatio(GetIP(), theApp->CryptoAvailable()) : 0; +} + +/* End Warning */ + + +CUpDownClient::~CUpDownClient() +{ + if (credits) { + delete credits; + } +} + + +CUpDownClient *CUpDownClientListRem::CreateItem(CEC_UpDownClient_Tag *tag) +{ + CUpDownClient *client = new CUpDownClient(tag); + ProcessItemUpdate(tag, client); + + theApp->amuledlg->m_transferwnd->clientlistctrl->InsertClient(client, (ViewType)m_viewtype); + + return client; +} + + +void CUpDownClientListRem::DeleteItem(CUpDownClient *client) +{ + theApp->amuledlg->m_transferwnd->clientlistctrl-> + RemoveClient(client, (ViewType)m_viewtype); + delete client; +} + + +uint32 CUpDownClientListRem::GetItemID(CUpDownClient *client) +{ + return client->GetUserIDHybrid(); +} + + +void CUpDownClientListRem::ProcessItemUpdate( + CEC_UpDownClient_Tag *tag, + CUpDownClient *client) +{ + uint16 state = tag->ClientState(); + + client->m_nDownloadState = state & 0xff; + client->m_nUploadState = (state >> 8) & 0xff; + + client->m_nUpDatarate = tag->SpeedUp(); + if ( client->m_nDownloadState == DS_DOWNLOADING ) { + client->kBpsDown = tag->SpeedDown() / 1024.0; + } else { + client->kBpsDown = 0; + } + + client->m_WaitTime = tag->WaitTime(); + client->m_UpStartTimeDelay = tag->XferTime(); + client->m_dwLastUpRequest = tag->LastReqTime(); + client->m_WaitStartTime = tag->QueueTime(); + + CreditStruct *credit_struct = + (CreditStruct *)client->credits->GetDataStruct(); + credit_struct->uploaded = tag->XferUp(); + client->m_nTransferredUp = tag->XferUpSession(); + + credit_struct->downloaded = tag->XferDown(); +} + + +CUpQueueRem::CUpQueueRem(CRemoteConnect *conn) +: +m_up_list(conn, vtUploading), m_wait_list(conn, vtQueued) +{ +} + + +/* + * Download queue container: hold PartFiles with progress status + * + */ + + +CDownQueueRem::CDownQueueRem(CRemoteConnect *conn) +: +CRemoteContainer(conn, true) +{ +} + + +bool CDownQueueRem::AddLink(const wxString &link, int) +{ + CECPacket req(EC_OP_ADD_LINK); + req.AddTag(CECTag(EC_TAG_STRING, link)); + + m_conn->SendPacket(&req); + return true; +} + + +void CDownQueueRem::StopUDPRequests() +{ + // have no idea what is it about +} + + +void CDownQueueRem::ResetCatParts(int) +{ + // called when category being deleted. Command will be performed on remote side +} + + +bool CDownQueueRem::IsPartFile(const CKnownFile *) const +{ + // hope i understand it right + return true; +} + + +void CDownQueueRem::OnConnectionState(bool) +{ +} + + +CPartFile *CDownQueueRem::CreateItem(CEC_PartFile_Tag *tag) +{ + CPartFile *file = new CPartFile(tag); + m_enc_map[file->GetFileHash()] = PartFileEncoderData(file->GetPartCount(), 10); + ProcessItemUpdate(tag, file); + + theApp->amuledlg->m_transferwnd->downloadlistctrl->AddFile(file); + return file; +} + + +void CDownQueueRem::DeleteItem(CPartFile *in_file) +{ + auto_ptr file(in_file); + + theApp->amuledlg->m_transferwnd->downloadlistctrl->RemoveFile(file.get()); + + m_enc_map.erase(file->GetFileHash()); +} + + +CMD4Hash CDownQueueRem::GetItemID(CPartFile *file) +{ + return file->GetFileHash(); +} + + +void CDownQueueRem::ProcessItemUpdate(CEC_PartFile_Tag *tag, CPartFile *file) +{ + // + // update status + // + if (m_inc_tags) { + uint32 tmpval = (uint32)(file->kBpsDown * 1024); + tag->SetSpeed(tmpval); + file->kBpsDown = tmpval / 1024.0; + + tag->SetSizeXfer(file->transferred); + tag->SetSizeDone(file->completedsize); + tag->SetSourceXferCount(file->transferingsrc); + tag->SetSourceNotCurrCount(file->m_notCurrentSources); + tag->SetSourceCount(file->m_source_count); + tag->SetSourceCountA4AF(file->m_a4af_source_count); + tag->SetFileStatus(file->status); + + tag->SetLastSeenComplete(file->lastseencomplete); + + tag->SetFileCat(file->m_category); + + tag->SetPrio(file->m_iDownPriority); + } else { + file->kBpsDown = tag->Speed() / 1024.0; + + if ( file->kBpsDown > 0 ) { + file->transferred = tag->SizeXfer(); + file->SetCompletedSize(tag->SizeDone()); + } + + file->transferingsrc = tag->SourceXferCount(); + file->m_notCurrentSources = tag->SourceNotCurrCount(); + file->m_source_count = tag->SourceCount(); + file->m_a4af_source_count = tag->SourceCountA4AF(); + file->status = tag->FileStatus(); + + file->lastseencomplete = tag->LastSeenComplete(); + + file->m_category = tag->FileCat(); + + file->m_iDownPriority = tag->Prio(); + if ( file->m_iDownPriority >= 10 ) { + file->m_iDownPriority-= 10; + file->m_bAutoDownPriority = true; + } else { + file->m_bAutoDownPriority = false; + } + } + file->percentcompleted = (100.0*file->GetCompletedSize()) / file->GetFileSize(); + if ( file->m_iDownPriority >= 10 ) { + file->m_iDownPriority -= 10; + file->m_bAutoUpPriority = true; + } else { + file->m_bAutoUpPriority = false; + } + + // + // Copy part/gap status + // + CECTag *gaptag = tag->GetTagByName(EC_TAG_PARTFILE_GAP_STATUS); + CECTag *parttag = tag->GetTagByName(EC_TAG_PARTFILE_PART_STATUS); + CECTag *reqtag = tag->GetTagByName(EC_TAG_PARTFILE_REQ_STATUS); + if (gaptag && parttag && reqtag) { + wxASSERT(m_enc_map.count(file->GetFileHash())); + + PartFileEncoderData &encoder = m_enc_map[file->GetFileHash()]; + encoder.Decode( + (unsigned char *)gaptag->GetTagData(), gaptag->GetTagDataLen(), + (unsigned char *)parttag->GetTagData(), parttag->GetTagDataLen()); + + const Gap_Struct *reqparts = (const Gap_Struct *)reqtag->GetTagData(); + unsigned reqcount = reqtag->GetTagDataLen() / sizeof(Gap_Struct); + + // adjust size of gaplist to reqcount + unsigned gap_size = encoder.m_gap_status.Size() / (2 * sizeof(uint64)); + while ( file->m_gaplist.size() > gap_size ) { + file->m_gaplist.pop_front(); + } + while ( file->m_gaplist.size() != gap_size ) { + file->m_gaplist.push_front(new Gap_Struct); + } + const uint64 *gap_info = (const uint64 *)encoder.m_gap_status.Buffer(); + + + std::list::iterator it = file->m_gaplist.begin(); + for (unsigned j = 0; j < gap_size;j++) { + Gap_Struct* gap = *it++; + gap->start = ENDIAN_NTOHLL(gap_info[2*j]); + gap->end = ENDIAN_NTOHLL(gap_info[2*j+1]); + } + + // adjust size of requested block list + while ( file->m_requestedblocks_list.size() > reqcount ) { + file->m_requestedblocks_list.pop_front(); + } + while ( file->m_requestedblocks_list.size() != reqcount ) { + file->m_requestedblocks_list.push_front(new Requested_Block_Struct); + } + + std::list::iterator it2 = file->m_requestedblocks_list.begin(); + for (unsigned i = 0; i < reqcount; ++i) { + Requested_Block_Struct* block = *it2++; + block->StartOffset = ENDIAN_NTOHLL(reqparts[i].start); + block->EndOffset = ENDIAN_NTOHLL(reqparts[i].end); + } + // copy parts frequency + const unsigned char *part_info = encoder.m_part_status.Buffer(); + for(int i = 0; i < file->GetPartCount(); ++i) { + file->m_SrcpartFrequency[i] = part_info[i]; + } + } else { + printf("ERROR: %p %p %p\n", (void*)gaptag, (void*)parttag, (void*)reqtag); + } + + // Get source names + CECTag *srcnametag = tag->GetTagByName(EC_TAG_PARTFILE_SOURCE_NAMES); + if (srcnametag) { + file->ClearSourcenameItemList(); + int max = srcnametag->GetTagCount(); + for (int i = 0; i < max - 1; ) { + wxString name = srcnametag->GetTagByIndex(i++)->GetStringData(); + long count = srcnametag->GetTagByIndex(i++)->GetInt(); + file->AddSourcenameItemList(name, count); + } + } + + // Get comments + CECTag *commenttag = tag->GetTagByName(EC_TAG_PARTFILE_COMMENTS); + if (commenttag) { + file->ClearFileRatingList(); + int max = commenttag->GetTagCount(); + for (int i = 0; i < max - 3; ) { + wxString u = commenttag->GetTagByIndex(i++)->GetStringData(); + wxString f = commenttag->GetTagByIndex(i++)->GetStringData(); + int r = commenttag->GetTagByIndex(i++)->GetInt(); + wxString c = commenttag->GetTagByIndex(i++)->GetStringData(); + file->AddFileRatingList(u, f, r, c); + } + file->UpdateFileRatingCommentAvail(); + } + + theApp->amuledlg->m_transferwnd->downloadlistctrl->UpdateItem(file); +} + + +bool CDownQueueRem::Phase1Done(const CECPacket *) +{ + return true; +} + + +void CDownQueueRem::SendFileCommand(CPartFile *file, ec_tagname_t cmd) +{ + CECPacket req(cmd); + req.AddTag(CECTag(EC_TAG_PARTFILE, file->GetFileHash())); + + m_conn->SendPacket(&req); +} + + +void CDownQueueRem::Prio(CPartFile *file, uint8 prio) +{ + CECPacket req(EC_OP_PARTFILE_PRIO_SET); + + CECTag hashtag(EC_TAG_PARTFILE, file->GetFileHash()); + hashtag.AddTag(CECTag(EC_TAG_PARTFILE_PRIO, prio)); + req.AddTag(hashtag); + + m_conn->SendPacket(&req); +} + + +void CDownQueueRem::AutoPrio(CPartFile *file, bool flag) +{ + CECPacket req(EC_OP_PARTFILE_PRIO_SET); + + CECTag hashtag(EC_TAG_PARTFILE, file->GetFileHash()); + + hashtag.AddTag(CECTag(EC_TAG_PARTFILE_PRIO, + (uint8)(flag ? PR_AUTO : file->GetDownPriority()))); + req.AddTag(hashtag); + + m_conn->SendPacket(&req); +} + + +void CDownQueueRem::Category(CPartFile *file, uint8 cat) +{ + CECPacket req(EC_OP_PARTFILE_SET_CAT); + file->m_category = cat; + + CECTag hashtag(EC_TAG_PARTFILE, file->GetFileHash()); + hashtag.AddTag(CECTag(EC_TAG_PARTFILE_CAT, cat)); + req.AddTag(hashtag); + + m_conn->SendPacket(&req); +} + + +void CDownQueueRem::AddSearchToDownload(CSearchFile* file, uint8 category) +{ + CECPacket req(EC_OP_DOWNLOAD_SEARCH_RESULT); + CECTag hashtag(EC_TAG_PARTFILE, file->GetFileHash()); + hashtag.AddTag(CECTag(EC_TAG_PARTFILE_CAT, category)); + req.AddTag(hashtag); + + m_conn->SendPacket(&req); +} + + +CClientListRem::CClientListRem(CRemoteConnect *conn) +{ + m_conn = conn; +} + + +void CClientListRem::FilterQueues() +{ + // FIXME: add code + //wxASSERT(0); +} + + +CSearchListRem::CSearchListRem(CRemoteConnect *conn) : CRemoteContainer(conn) +{ + m_curr_search = -1; +} + + +wxString CSearchListRem::StartNewSearch( + uint32* nSearchID, SearchType search_type, + const CSearchList::CSearchParams& params) +{ + CECPacket search_req(EC_OP_SEARCH_START); + EC_SEARCH_TYPE ec_search_type = EC_SEARCH_LOCAL; + switch(search_type) { + case LocalSearch: ec_search_type = EC_SEARCH_LOCAL; break; + case GlobalSearch: ec_search_type = EC_SEARCH_GLOBAL; break; + case KadSearch: ec_search_type = EC_SEARCH_KAD; break; + } + search_req.AddTag( + CEC_Search_Tag(params.searchString, ec_search_type, + params.typeText, params.extension, params.availability, + params.minSize, params.maxSize)); + + m_conn->SendPacket(&search_req); + m_curr_search = *(nSearchID); // No kad remote search yet. + + Flush(); + + return wxEmptyString; // EC reply will have the error mesg is needed. +} + + +void CSearchListRem::StopGlobalSearch() +{ + if (m_curr_search != -1) { + CECPacket search_req(EC_OP_SEARCH_STOP); + m_conn->SendPacket(&search_req); + } +} + + +void CSearchListRem::HandlePacket(const CECPacket *packet) +{ + if ( packet->GetOpCode() == EC_OP_SEARCH_PROGRESS ) { + CoreNotify_Search_Update_Progress(packet->GetTagByIndex(0)->GetInt()); + } else { + CRemoteContainer::HandlePacket(packet); + } +} + + +CSearchFile::CSearchFile(CEC_SearchFile_Tag *tag) +: +m_parent(NULL), +m_showChildren(false), +m_sourceCount(0), +m_completeSourceCount(0), +m_kademlia(false), +m_clientID(0), +m_clientPort(0) +{ + SetFileName(CPath(tag->FileName())); + m_abyFileHash = tag->ID(); + SetFileSize(tag->SizeFull()); + + m_searchID = theApp->searchlist->m_curr_search; + +} + + +// dtor is virtual - must be implemented +CSearchFile::~CSearchFile() +{ +} + + +CSearchFile *CSearchListRem::CreateItem(CEC_SearchFile_Tag *tag) +{ + CSearchFile *file = new CSearchFile(tag); + ProcessItemUpdate(tag, file); + + theApp->amuledlg->m_searchwnd->AddResult(file); + + return file; +} + + +void CSearchListRem::DeleteItem(CSearchFile *file) +{ + delete file; +} + + +CMD4Hash CSearchListRem::GetItemID(CSearchFile *file) +{ + return file->GetFileHash(); +} + + +void CSearchListRem::ProcessItemUpdate(CEC_SearchFile_Tag *tag, CSearchFile *file) +{ + file->m_sourceCount = tag->SourceCount(); + file->m_completeSourceCount = tag->CompleteSourceCount(); +} + + +bool CSearchListRem::Phase1Done(const CECPacket *WXUNUSED(reply)) +{ + CECPacket progress_req(EC_OP_SEARCH_PROGRESS); + m_conn->SendRequest(this, &progress_req); + + return true; +} + + +void CSearchListRem::RemoveResults(long nSearchID) +{ + ResultMap::iterator it = m_results.find(nSearchID); + if (it != m_results.end()) { + CSearchResultList& list = it->second; + for (unsigned int i = 0; i < list.size(); ++i) { + delete list[i]; + } + m_results.erase(it); + } +} + + +const CSearchResultList& CSearchListRem::GetSearchResults(long nSearchID) +{ + ResultMap::const_iterator it = m_results.find(nSearchID); + if (it != m_results.end()) { + return it->second; + } + + // TODO: Should we assert in this case? + static CSearchResultList list; + return list; +} + + +void CStatsUpdaterRem::HandlePacket(const CECPacket *packet) +{ + theStats::UpdateStats(packet); + theApp->ShowUserCount(); // maybe there should be a check if a usercount changed ? +} + + +bool CUpDownClient::IsBanned() const +{ + // FIXME: add code + return false; +} + + +// +// Those functions have different implementation in remote gui +// +void CUpDownClient::Ban() +{ + // FIXME: add code + wxASSERT(0); +} + + +void CUpDownClient::UnBan() +{ + // FIXME: add code + wxASSERT(0); +} + + +void CUpDownClient::RequestSharedFileList() +{ + // FIXME: add code + wxASSERT(0); +} + + +void CKnownFile::SetFileComment(const wxString &) +{ + // FIXME: add code + wxASSERT(0); +} + + +void CKnownFile::SetFileRating(unsigned char) +{ + // FIXME: add code + wxASSERT(0); +} + + +// I don't think it will be implemented - too match data transfer. But who knows ? +wxString CUpDownClient::ShowDownloadingParts() const +{ + return wxEmptyString; +} + + +bool CUpDownClient::SwapToAnotherFile( + bool WXUNUSED(bIgnoreNoNeeded), + bool WXUNUSED(ignoreSuspensions), + bool WXUNUSED(bRemoveCompletely), + CPartFile* WXUNUSED(toFile)) +{ + // FIXME: add code + wxASSERT(0); + return false; +} + + +// +// Those functions are virtual. So even they don't get called they must +// be defined so linker will be happy +// +CPacket* CKnownFile::CreateSrcInfoPacket(const CUpDownClient *, uint8 /*byRequestedVersion*/, uint16 /*nRequestedOptions*/) +{ + wxASSERT(0); + return 0; +} + + +bool CKnownFile::LoadFromFile(const class CFileDataIO*) +{ + wxASSERT(0); + return false; +} + + +void CKnownFile::UpdatePartsInfo() +{ + wxASSERT(0); +} + + +void CKnownFile::SetFileSize(uint64 nFileSize) +{ + CAbstractFile::SetFileSize(nFileSize); +} + + +CPacket* CPartFile::CreateSrcInfoPacket(CUpDownClient const *, uint8 /*byRequestedVersion*/, uint16 /*nRequestedOptions*/) +{ + wxASSERT(0); + return 0; +} + + +void CPartFile::UpdatePartsInfo() +{ + wxASSERT(0); +} + + +void CPartFile::UpdateFileRatingCommentAvail() +{ + bool prevComment = m_hasComment; + int prevRating = m_iUserRating; + + m_hasComment = false; + m_iUserRating = 0; + int ratingCount = 0; + + FileRatingList::iterator it = m_FileRatingList.begin(); + for (; it != m_FileRatingList.end(); ++it) { + SFileRating& cur_rat = *it; + + if (!cur_rat.Comment.IsEmpty()) { + m_hasComment = true; + } + + uint8 rating = cur_rat.Rating; + if (rating) { + wxASSERT(rating <= 5); + + ratingCount++; + m_iUserRating += rating; + } + } + + if (ratingCount) { + m_iUserRating /= ratingCount; + wxASSERT(m_iUserRating > 0 && m_iUserRating <= 5); + } + + if ((prevComment != m_hasComment) || (prevRating != m_iUserRating)) { + UpdateDisplayedInfo(); + } +} + +bool CPartFile::SavePartFile(bool) +{ + wxASSERT(0); + return false; +} + + +// +// since gui is not linked with amule.cpp - define events here +// +DEFINE_LOCAL_EVENT_TYPE(wxEVT_CORE_FINISHED_HTTP_DOWNLOAD) +DEFINE_LOCAL_EVENT_TYPE(wxEVT_CORE_SOURCE_DNS_DONE) +DEFINE_LOCAL_EVENT_TYPE(wxEVT_CORE_UDP_DNS_DONE) +DEFINE_LOCAL_EVENT_TYPE(wxEVT_CORE_SERVER_DNS_DONE) +// File_checked_for_headers diff --git a/src/amule-remote-gui.h b/src/amule-remote-gui.h new file mode 100644 index 00000000..89215e90 --- /dev/null +++ b/src/amule-remote-gui.h @@ -0,0 +1,779 @@ +// +// This file is part of the aMule Project. +// +// Copyright (C) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef AMULE_REMOTE_GUI_H +#define AMULE_REMOTE_GUI_H + + +#include // Needed for CRemoteConnect + + +#include "Statistics.h" +#include "Preferences.h" +#include "Statistics.h" +#include "RLE.h" +#include "SearchList.h" // Needed for CSearchFile + + +class CED2KFileLink; +class CServer; +class CKnownFile; +class CSearchFile; +class CPartFile; +class CUpDownClient; +class CStatistics; +class CPath; + +class wxEvtHandler; +class wxTimer; +class wxTimerEvent; + +#include + +class CEConnectDlg : public wxDialog { + wxString host; + int port; + + wxString pwd_hash; + wxString login, passwd; + bool m_save_user_pass; + + void OnOK(wxCommandEvent& event); + + DECLARE_EVENT_TABLE() +public: + CEConnectDlg(); + + wxString Host() { return host; } + int Port() { return port; } + + wxString Login() { return login; } + wxString PassHash(); + bool SaveUserPass() { return m_save_user_pass; } +}; + +DECLARE_LOCAL_EVENT_TYPE(wxEVT_EC_INIT_DONE, wxEVT_USER_FIRST + 1001) + +class wxECInitDoneEvent : public wxEvent { +public: + wxECInitDoneEvent() : wxEvent(-1, wxEVT_EC_INIT_DONE) + { + } + + wxEvent *Clone(void) const + { + return new wxECInitDoneEvent(*this); + } +}; + +class CPreferencesRem : public CPreferences, public CECPacketHandlerBase { + CRemoteConnect *m_conn; + uint32 m_exchange_send_selected_prefs; + uint32 m_exchange_recv_selected_prefs; + + virtual void HandlePacket(const CECPacket *packet); +public: + CPreferencesRem(CRemoteConnect *); + + Category_Struct *CreateCategory(const wxString& name, const CPath& path, + const wxString& comment, uint32 color, uint8 prio); + void UpdateCategory(uint8 cat, const wxString& name, const CPath& path, + const wxString& comment, uint32 color, uint8 prio); + + void RemoveCat(uint8 cat); + + bool LoadRemote(); + void SendToRemote(); +}; + +// +// T - type if item in container +// I - type of id of item +// G - type of tag used to create/update items +// +template +class CRemoteContainer : public CECPacketHandlerBase { +protected: + enum { + IDLE, // no request in the air + STATUS_REQ_SENT, // sent request for item status + FULL_REQ_SENT // sent request for full info + } m_state; + + CRemoteConnect *m_conn; + + std::list m_items; + std::map m_items_hash; + + // for GetByIndex + std::vector m_idx_items; + + // .size() is O(N) operation in stl + int m_item_count; + + // use incremental tags algorithm + bool m_inc_tags; + + // command that will be used in full request + int m_full_req_cmd, m_full_req_tag; + + virtual void HandlePacket(const CECPacket *packet) + { + switch(this->m_state) { + case IDLE: wxASSERT(0); // not expecting anything + case STATUS_REQ_SENT: + // if derived class choose not to proceed, return - but with good status + this->m_state = IDLE; + if ( this->Phase1Done(packet) ) { + CECPacket req_full(this->m_full_req_cmd); + + ProcessUpdate(packet, &req_full, m_full_req_tag); + + if ( !this->m_inc_tags ) { + // Phase 3: request full info about files we don't have yet + if ( req_full.GetTagCount() ) { + m_conn->SendRequest(this, &req_full); + this->m_state = FULL_REQ_SENT; + } + } + } + break; + case FULL_REQ_SENT: + ProcessFull(packet); + m_state = IDLE; + break; + } + } +public: + CRemoteContainer(CRemoteConnect *conn, bool /*inc_tags*/ = false) + { + m_state = IDLE; + + m_conn = conn; + m_item_count = 0; + + // FIXME: + // The CRemoteContainer has two ways of transfer: with "inc_tags" or without. + // I found that with inc_tags the update of transferred/completed is broken, + // therefore I disabled them. + // Either the inc-tag-mode should be fixed (but I can't to that without some + // more insight how it's supposed to be working), or removed alltogether. + //m_inc_tags = inc_tags; + m_inc_tags = false; + } + + virtual ~CRemoteContainer() + { + } + + uint32 GetCount() + { + return m_item_count; + } + + void AddItem(T *item) + { + m_items.push_back(item); + m_items_hash[GetItemID(item)] = item; + m_idx_items.resize(m_item_count+1); + m_idx_items[m_item_count] = item; + m_item_count++; + } + + T *GetByID(I id) + { + // avoid creating nodes + return m_items_hash.count(id) ? m_items_hash[id] : NULL; + } + + T *GetByIndex(int index) + { + return ( (index >= 0) && (index < m_item_count) ) ? m_idx_items[index] : NULL; + } + + void Flush() + { + m_items.erase(this->m_items.begin(), this->m_items.end()); + m_items_hash.erase(this->m_items_hash.begin(), this->m_items_hash.end()); + m_item_count = 0; + } + + // + // Flush & reload + // + /* + bool FullReload(int cmd) + { + CECPacket req(cmd); + std::auto_ptr reply(this->m_conn->SendRecvPacket(&req)); + if ( !reply.get() ) { + return false; + } + for(typename std::list::iterator j = this->m_items.begin(); j != this->m_items.end(); j++) { + this->DeleteItem(*j); + } + + Flush(); + + ProcessFull(reply.get()); + + return true; + } + */ + void FullReload(int cmd) + { + if ( this->m_state != IDLE ) { + return; + } + + for(typename std::list::iterator j = this->m_items.begin(); j != this->m_items.end(); j++) { + this->DeleteItem(*j); + } + + Flush(); + + CECPacket req(cmd); + this->m_conn->SendRequest(this, &req); + this->m_state = FULL_REQ_SENT; + this->m_full_req_cmd = cmd; + } + + // + // Following are like basicly same code as in webserver. Eventually it must + // be same class + // + void DoRequery(int cmd, int tag) + { + if ( this->m_state != IDLE ) { + return; + } + CECPacket req_sts(cmd, m_inc_tags ? EC_DETAIL_INC_UPDATE : EC_DETAIL_UPDATE); + this->m_conn->SendRequest(this, &req_sts); + this->m_state = STATUS_REQ_SENT; + this->m_full_req_cmd = cmd; + this->m_full_req_tag = tag; + } + /* + bool DoRequery(int cmd, int tag) + { + CECPacket req_sts(cmd, m_inc_tags ? EC_DETAIL_INC_UPDATE : EC_DETAIL_UPDATE); + + // + // Phase 1: request status + std::auto_ptr reply(this->m_conn->SendRecvPacket(&req_sts)); + if ( !reply.get() ) { + return false; + } + + if ( !this->Phase1Done(reply.get()) ) { + // if derived class choose not to proceed, return - but with good status + return true; + } + // + // Phase 2: update status, mark new files for subsequent query + CECPacket req_full(cmd); + + ProcessUpdate(reply.get(), &req_full, tag); + + reply.reset(); + + if ( !m_inc_tags ) { + // Phase 3: request full info about files we don't have yet + if ( req_full.GetTagCount() ) { + reply.reset(this->m_conn->SendRecvPacket(&req_full)); + if ( !reply.get() ) { + return false; + } + ProcessFull(reply.get()); + } + } + return true; + } + */ + + void ProcessFull(const CECPacket *reply) + { + for (int i = 0;i < reply->GetTagCount();i++) { + G *tag = (G *)reply->GetTagByIndex(i); + // initialize item data from EC tag + T *item = this->CreateItem(tag); + AddItem(item); + } + } + + void ProcessUpdate(const CECPacket *reply, CECPacket *full_req, int req_type) + { + std::set core_files; + for (int i = 0;i < reply->GetTagCount();i++) { + G *tag = (G *)reply->GetTagByIndex(i); + if ( tag->GetTagName() != req_type ) { + continue; + } + + core_files.insert(tag->ID()); + if ( m_items_hash.count(tag->ID()) ) { + T *item = m_items_hash[tag->ID()]; + ProcessItemUpdate(tag, item); + } else { + if ( m_inc_tags ) { + T *item = this->CreateItem(tag); + AddItem(item); + } else { + full_req->AddTag(CECTag(req_type, tag->ID())); + } + } + } + std::list del_ids; + for(typename std::list::iterator j = this->m_items.begin(); j != this->m_items.end(); j++) { + I item_id = GetItemID(*j); + if ( core_files.count(item_id) == 0 ) { + del_ids.push_back(item_id); + } + } + for(typename std::list::iterator j = del_ids.begin(); j != del_ids.end(); j++) { + for(int idx = 0;idx < m_item_count;idx++) { + if ( this->GetItemID(m_idx_items[idx]) == *j ) { + m_idx_items[idx] = m_idx_items[m_item_count-1]; + break; + } + } + m_item_count--; + m_items_hash.erase(*j); + for(typename std::list::iterator k = this->m_items.begin(); k != this->m_items.end(); k++) { + if ( *j == GetItemID(*k) ) { + // item may contain data that need to be freed externally, before + // dtor is called and memory freed + this->DeleteItem(*k); + + this->m_items.erase(k); + + break; + } + } + } + } + + virtual T *CreateItem(G *) + { + return 0; + } + virtual void DeleteItem(T *) + { + } + virtual I GetItemID(T *) + { + return I(); + } + virtual void ProcessItemUpdate(G *, T *) + { + } + + virtual bool Phase1Done(const CECPacket *) + { + return true; + } +}; + +class CServerConnectRem : public CECPacketHandlerBase { + CRemoteConnect *m_Conn; + uint32 m_ID; + + CServer *m_CurrServer; + + virtual void HandlePacket(const CECPacket *packet); + +public: + CServerConnectRem(CRemoteConnect *); + bool ReQuery(); + + bool IsConnected() { return (m_ID != 0) && (m_ID != 0xffffffff); } + bool IsConnecting() { return m_ID == 0xffffffff; } + bool IsLowID() { return m_ID < 16777216; } + uint32 GetClientID() { return m_ID; } + CServer *GetCurrentServer() { return m_CurrServer; } + + // + // Actions + // + void ConnectToServer(CServer* server); + void ConnectToAnyServer(); + void StopConnectionTry(); + void Disconnect(); +}; + +class CServerListRem : public CRemoteContainer { + uint32 m_TotalUser, m_TotalFile; + + virtual void HandlePacket(const CECPacket *packet); +public: + CServerListRem(CRemoteConnect *); + void GetUserFileStatus(uint32 &total_user, uint32 &total_file) + { + total_user = m_TotalUser; + total_file = m_TotalFile; + } + + void UpdateUserFileStatus(CServer *server); + + CServer* GetServerByAddress(const wxString& address, uint16 port) const; + CServer* GetServerByIPTCP(uint32 nIP, uint16 nPort) const; + + void ReloadControl(); + + // + // Actions + // + void RemoveServer(CServer* server); + void UpdateServerMetFromURL(wxString url); + void SaveServerMet(); + void FilterServers(); + + // + // template + // + CServer *CreateItem(CEC_Server_Tag *); + void DeleteItem(CServer *); + uint32 GetItemID(CServer *); + void ProcessItemUpdate(CEC_Server_Tag *, CServer *); +}; + +class CUpDownClientListRem : public CRemoteContainer { + int m_viewtype; +public: + CUpDownClientListRem(CRemoteConnect *, int viewtype); + + const CClientPtrList& GetList() const { return m_items; }; + + // + // template + // + CUpDownClient *CreateItem(CEC_UpDownClient_Tag *); + void DeleteItem(CUpDownClient *); + uint32 GetItemID(CUpDownClient *); + void ProcessItemUpdate(CEC_UpDownClient_Tag *, CUpDownClient *); +}; + +class CUpQueueRem { + CUpDownClientListRem m_up_list, m_wait_list; +public: + CUpQueueRem(CRemoteConnect *); + + void ReQueryUp() { m_up_list.DoRequery(EC_OP_GET_ULOAD_QUEUE, EC_TAG_CLIENT); } + void ReQueryWait() { m_wait_list.DoRequery(EC_OP_GET_WAIT_QUEUE, EC_TAG_CLIENT); } + + const CClientPtrList& GetWaitingList() const { return m_wait_list.GetList(); } + const CClientPtrList& GetUploadingList() const { return m_up_list.GetList(); } + uint16 GetWaitingPosition(const CUpDownClient *client) const; +}; + +class CDownQueueRem : public CRemoteContainer { + std::map m_enc_map; +public: + CDownQueueRem(CRemoteConnect *); + + uint32 GetFileCount() { return GetCount(); } + CPartFile* GetFileByID(const CMD4Hash& id) { return GetByID(id); } + CPartFile* GetFileByIndex(unsigned int idx) { return GetByIndex(idx); } + + bool IsPartFile(const CKnownFile* totest) const; + void OnConnectionState(bool bConnected); + + // + // User actions + // + void Prio(CPartFile *file, uint8 prio); + void AutoPrio(CPartFile *file, bool flag); + void Category(CPartFile *file, uint8 cat); + + void SendFileCommand(CPartFile *file, ec_tagname_t cmd); + // + // Actions + // + void StopUDPRequests(); + void AddFileLinkToDownload(CED2KFileLink*, uint8); + bool AddLink(const wxString &link, int category = 0); + void UnsetCompletedFilesExist(); + void ResetCatParts(int cat); + void AddSearchToDownload(CSearchFile* toadd, uint8 category); + + // + // template + // + CPartFile *CreateItem(CEC_PartFile_Tag *); + void DeleteItem(CPartFile *); + CMD4Hash GetItemID(CPartFile *); + void ProcessItemUpdate(CEC_PartFile_Tag *, CPartFile *); + bool Phase1Done(const CECPacket *); +}; + +class CSharedFilesRem : public CRemoteContainer { + std::map m_enc_map; + + virtual void HandlePacket(const CECPacket *); + + // + // For file renaming operation + // + CKnownFile* m_rename_file; + wxString m_new_name; +public: + CSharedFilesRem(CRemoteConnect *); + + CKnownFile *GetFileByID(CMD4Hash id) { return GetByID(id); } + + void SetFilePrio(CKnownFile *file, uint8 prio); + + // + // Actions + // + void AddFilesFromDirectory(const CPath&); + void Reload(bool sendtoserver = true, bool firstload = false); + bool RenameFile(CKnownFile* file, const CPath& newName); + + // + // template + // + CKnownFile *CreateItem(CEC_SharedFile_Tag *); + void DeleteItem(CKnownFile *); + CMD4Hash GetItemID(CKnownFile *); + void ProcessItemUpdate(CEC_SharedFile_Tag *, CKnownFile *); + bool Phase1Done(const CECPacket *); +}; + +class CKnownFilesRem { + CSharedFilesRem *m_shared_files; +public: + CKnownFilesRem(CSharedFilesRem *shared) + { + m_shared_files = shared; + + requested = 0; + transferred = 0; + accepted = 0; + } + + CKnownFile *FindKnownFileByID(const CMD4Hash& id) + { + return m_shared_files->GetByID(id); + } + + uint16 requested; + uint32 transferred; + uint16 accepted; +}; + +class CClientCreditsRem { + bool m_crypt_avail; +public: + bool CryptoAvailable() { return m_crypt_avail; } +}; + +class CClientListRem { + CRemoteConnect *m_conn; + + // + // map of user_ID -> client + std::multimap m_client_list; +public: + CClientListRem(CRemoteConnect *); + + const std::multimap& GetClientList() { return m_client_list; } + + // + // Actions + // + void AddClient(CUpDownClient *); + void FilterQueues(); +}; + +class CIPFilterRem { + CRemoteConnect *m_conn; +public: + CIPFilterRem(CRemoteConnect *conn); + + // + // Actions + // + void Reload(); + void Update(wxString strURL = wxEmptyString); +}; + +class CSearchListRem : public CRemoteContainer { + virtual void HandlePacket(const CECPacket *); +public: + CSearchListRem(CRemoteConnect *); + + int m_curr_search; + typedef std::map ResultMap; + ResultMap m_results; + + const CSearchResultList& GetSearchResults(long nSearchID); + void RemoveResults(long nSearchID); + const CSearchResultList& GetSearchResults(long nSearchID) const; + // + // Actions + // + + wxString StartNewSearch(uint32* nSearchID, SearchType search_type, + const CSearchList::CSearchParams& params); + + void StopGlobalSearch(); + + // + // template + // + CSearchFile *CreateItem(CEC_SearchFile_Tag *); + void DeleteItem(CSearchFile *); + CMD4Hash GetItemID(CSearchFile *); + void ProcessItemUpdate(CEC_SearchFile_Tag *, CSearchFile *); + bool Phase1Done(const CECPacket *); +}; + +class CStatsUpdaterRem : public CECPacketHandlerBase { + virtual void HandlePacket(const CECPacket *); +public: + CStatsUpdaterRem() {} +}; + +class CListenSocketRem { + uint32 m_peak_connections; +public: + uint32 GetPeakConnections() { return m_peak_connections; } +}; + +class CamuleRemoteGuiApp : public wxApp, public CamuleGuiBase { + wxTimer* poll_timer; + + virtual int InitGui(bool geometry_enable, wxString &geometry_string); + + bool OnInit(); + + int OnExit(); + + void OnPollTimer(wxTimerEvent& evt); + + void OnECConnection(wxEvent& event); + void OnECInitDone(wxEvent& event); + void OnLoggingEvent(CLoggingEvent& evt); + void OnNotifyEvent(CMuleGUIEvent& evt); + + CStatsUpdaterRem m_stats_updater; +public: + + void Startup(); + + bool ShowConnectionDialog(); + + class CRemoteConnect *m_connect; + + CEConnectDlg *dialog; + + bool CopyTextToClipboard(wxString strText); + + virtual void ShowAlert(wxString msg, wxString title, int flags); + + void ShutDown(wxCloseEvent &evt); + + CPreferencesRem *glob_prefs; + wxString ConfigDir; + + // + // Provide access to core data thru EC + CServerConnectRem *serverconnect; + CServerListRem *serverlist; + CUpQueueRem *uploadqueue; + CDownQueueRem *downloadqueue; + CSharedFilesRem *sharedfiles; + CKnownFilesRem *knownfiles; + CClientCreditsRem *clientcredits; + CClientListRem *clientlist; + CIPFilterRem *ipfilter; + CSearchListRem *searchlist; + CListenSocketRem *listensocket; + + CStatistics *m_statistics; + + bool AddServer(CServer *srv, bool fromUser = false); + + uint32 GetPublicIP(); + wxString CreateMagnetLink(const CAbstractFile *f); + wxString CreateED2kLink(const CAbstractFile* f, bool add_source = false, bool use_hostname = false, bool addcryptoptions = false); + wxString CreateED2kAICHLink(const CKnownFile* f); + + wxString GetLog(bool reset = false); + wxString GetServerLog(bool reset = false); + + void AddServerMessageLine(wxString &msg); + + void SetOSFiles(wxString ) { /* onlinesig is created on remote side */ } + + bool IsConnected() const { return IsConnectedED2K() || IsConnectedKad(); } + bool IsFirewalled() const; + bool IsConnectedED2K() const; + bool IsConnectedKad() const + { + return ((m_ConnState & CONNECTED_KAD_OK) + || (m_ConnState & CONNECTED_KAD_FIREWALLED)); + } + bool IsFirewalledKad() const { return (m_ConnState & CONNECTED_KAD_FIREWALLED); } + + bool IsKadRunning() const { return ((m_ConnState & CONNECTED_KAD_OK) + || (m_ConnState & CONNECTED_KAD_FIREWALLED) + || (m_ConnState & CONNECTED_KAD_NOT)); } + + void StartKad(); + void StopKad(); + + /** Bootstraps kad from the specified IP (must be in hostorder). */ + void BootstrapKad(uint32 ip, uint16 port); + /** Updates the nodes.dat file from the specified url. */ + void UpdateNotesDat(const wxString& str); + + void DisconnectED2K(); + + bool CryptoAvailable() const; + + uint32 GetED2KID() const; + uint32 GetID() const; + void ShowUserCount(); + + uint8 m_ConnState; + uint32 m_clientID; + + wxLocale m_locale; + + DECLARE_EVENT_TABLE() +}; + +DECLARE_APP(CamuleRemoteGuiApp) +#ifdef AMULE_REMOTE_GUI_CPP + CamuleRemoteGuiApp *theApp; +#else + extern CamuleRemoteGuiApp *theApp; +#endif + + +#endif /* AMULE_REMOTE_GUI_H */ + +// File_checked_for_headers diff --git a/src/amule.cpp b/src/amule.cpp new file mode 100644 index 00000000..23764083 --- /dev/null +++ b/src/amule.cpp @@ -0,0 +1,2214 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#define AMULE_CPP + + +#include "amule.h" // Interface declarations. + +#include +#include +#include + +#ifdef HAVE_CONFIG_H + #include "config.h" // Needed for HAVE_GETRLIMIT, HAVE_SETRLIMIT, + // HAVE_SYS_RESOURCE_H, HAVE_SYS_STATVFS_H and VERSION +#endif + +#include + +#include // Needed for wxCmdLineParser +#include // Do_not_auto_remove (win32) +#include +#include +#include +#include + + +#include // Needed for CFormat +#include "kademlia/kademlia/Kademlia.h" +#include "kademlia/kademlia/Prefs.h" +#include "ClientCreditsList.h" // Needed for CClientCreditsList +#include "ClientList.h" // Needed for CClientList +#include "ClientUDPSocket.h" // Needed for CClientUDPSocket & CMuleUDPSocket +#include "ExternalConn.h" // Needed for ExternalConn & MuleConnection +#include // Needed for CDirIterator +#include "FriendList.h" // Needed for CFriendList +#include "HTTPDownload.h" // Needed for CHTTPDownloadThread +#include "InternalEvents.h" // Needed for CMuleInternalEvent +#include "IPFilter.h" // Needed for CIPFilter +#include "KnownFileList.h" // Needed for CKnownFileList +#include "ListenSocket.h" // Needed for CListenSocket +#include "Logger.h" // Needed for CLogger // Do_not_auto_remove +#include "MagnetURI.h" // Needed for CMagnetURI +#include "OtherFunctions.h" +#include "PartFile.h" // Needed for CPartFile +#include "Preferences.h" // Needed for CPreferences +#include "SearchList.h" // Needed for CSearchList +#include "Server.h" // Needed for GetListName +#include "ServerList.h" // Needed for CServerList +#include "ServerConnect.h" // Needed for CServerConnect +#include "ServerUDPSocket.h" // Needed for CServerUDPSocket +#include "Statistics.h" // Needed for CStatistics +#include "TerminationProcessAmuleweb.h" // Needed for CTerminationProcessAmuleweb +#include "ThreadTasks.h" +#include "updownclient.h" // Needed for CUpDownClient +#include "UploadQueue.h" // Needed for CUploadQueue +#include "UploadBandwidthThrottler.h" +#include "UserEvents.h" + +#ifdef ENABLE_UPNP +#include "UPnP.h" // Needed for UPnP +#endif + +#ifdef __WXMAC__ +#include // Do_not_auto_remove +#endif + +#ifndef AMULE_DAEMON + #ifdef __WXMAC__ + #include // Do_not_auto_remove + #include // Do_not_auto_remove + #endif + #include + + #include "amuleDlg.h" +#endif + + +#ifdef HAVE_SYS_RESOURCE_H + #include +#endif + +#ifdef HAVE_SYS_STATVFS_H + #include // Do_not_auto_remove +#endif + + +#ifdef __GLIBC__ +# define RLIMIT_RESOURCE __rlimit_resource +#else +# define RLIMIT_RESOURCE int +#endif + +static void UnlimitResource(RLIMIT_RESOURCE resType) +{ +#if defined(HAVE_GETRLIMIT) && defined(HAVE_SETRLIMIT) + struct rlimit rl; + getrlimit(resType, &rl); + rl.rlim_cur = rl.rlim_max; + setrlimit(resType, &rl); +#endif +} + + +static void SetResourceLimits() +{ +#ifdef HAVE_SYS_RESOURCE_H + UnlimitResource(RLIMIT_DATA); + UnlimitResource(RLIMIT_FSIZE); + UnlimitResource(RLIMIT_NOFILE); +#ifdef RLIMIT_RSS + UnlimitResource(RLIMIT_RSS); +#endif +#endif +} + +// We store the received signal in order to avoid race-conditions +// in the signal handler. +bool g_shutdownSignal = false; + +void OnShutdownSignal( int /* sig */ ) +{ + signal(SIGINT, SIG_DFL); + signal(SIGTERM, SIG_DFL); + + g_shutdownSignal = true; + +#ifdef AMULE_DAEMON + theApp->ExitMainLoop(); +#endif +} + + +CamuleApp::CamuleApp() +{ + // Madcat - Initialize timer as the VERY FIRST thing to avoid any issues later. + // Kry - I love to init the vars on init, even before timer. + StartTickTimer(); + + // Initialization + m_app_state = APP_STATE_STARTING; + + theApp = &wxGetApp(); + + clientlist = NULL; + searchlist = NULL; + knownfiles = NULL; + serverlist = NULL; + serverconnect = NULL; + sharedfiles = NULL; + listensocket = NULL; + clientudp = NULL; + clientcredits = NULL; + friendlist = NULL; + downloadqueue = NULL; + uploadqueue = NULL; + ipfilter = NULL; + ECServerHandler = NULL; + m_singleInstance= NULL; + glob_prefs = NULL; + m_statistics = NULL; + uploadBandwidthThrottler = NULL; +#ifdef ENABLE_UPNP + m_upnp = NULL; + m_upnpMappings.resize(4); +#endif + core_timer = NULL; + applog = NULL; + + m_localip = 0; + m_dwPublicIP = 0; + webserver_pid = 0; + + enable_stdout_log = false; + enable_daemon_fork = false; + + strFullMuleVersion = NULL; + strOSDescription = NULL; + + // Apprently needed for *BSD + SetResourceLimits(); +} + +CamuleApp::~CamuleApp() +{ + // Closing the log-file as the very last thing, since + // wxWidgets log-events are saved in it as well. + delete applog; + applog = NULL; +} + +int CamuleApp::OnExit() +{ + if (m_app_state!=APP_STATE_STARTING) { + printf("Now, exiting main app...\n"); + } + + // From wxWidgets docs, wxConfigBase: + // ... + // Note that you must delete this object (usually in wxApp::OnExit) + // in order to avoid memory leaks, wxWidgets won't do it automatically. + // + // As it happens, you may even further simplify the procedure described + // above: you may forget about calling Set(). When Get() is called and + // there is no current object, it will create one using Create() function. + // To disable this behaviour DontCreateOnDemand() is provided. + delete wxConfigBase::Set((wxConfigBase *)NULL); + + // Save credits + clientcredits->SaveList(); + + // Kill amuleweb if running + if (webserver_pid) { + printf("Killing amuleweb instance with pid `%ld' ... ", webserver_pid); + wxKillError rc; + wxKill(webserver_pid, wxSIGTERM, &rc); + printf("Killed!\n"); + } + + if (m_app_state!=APP_STATE_STARTING) { + printf("aMule OnExit: Terminating core.\n"); + } + + delete serverlist; + serverlist = NULL; + + delete searchlist; + searchlist = NULL; + + delete clientcredits; + clientcredits = NULL; + + delete friendlist; + friendlist = NULL; + + // Destroying CDownloadQueue calls destructor for CPartFile + // calling CSharedFileList::SafeAddKFile occasionally. + delete sharedfiles; + sharedfiles = NULL; + + delete serverconnect; + serverconnect = NULL; + + delete listensocket; + listensocket = NULL; + + delete clientudp; + clientudp = NULL; + + delete knownfiles; + knownfiles = NULL; + + delete clientlist; + clientlist = NULL; + + delete uploadqueue; + uploadqueue = NULL; + + delete downloadqueue; + downloadqueue = NULL; + + delete ipfilter; + ipfilter = NULL; + +#ifdef ENABLE_UPNP + delete m_upnp; + m_upnp = NULL; +#endif + + delete ECServerHandler; + ECServerHandler = NULL; + + delete m_statistics; + m_statistics = NULL; + + delete glob_prefs; + glob_prefs = NULL; + CPreferences::EraseItemList(); + +#if defined(__WXMAC__) && defined(AMULE_DAEMON) + //#warning TODO: fix wxSingleInstanceChecker for amuled on Mac (wx link problems) +#else + delete m_singleInstance; +#endif + m_singleInstance = NULL; + + delete uploadBandwidthThrottler; + uploadBandwidthThrottler = NULL; + + if (m_app_state!=APP_STATE_STARTING) { + printf("aMule shutdown completed.\n"); + } + +#if wxUSE_MEMORY_TRACING + printf("Memory debug results for aMule exit:\n"); + // Log mem debug mesages to wxLogStderr + wxLog* oldLog = wxLog::SetActiveTarget(new wxLogStderr); + /* + printf("**************Classes**************\n"); + wxDebugContext::PrintClasses(); + */ + //printf("***************Dump***************\n"); + //wxDebugContext::Dump(); + printf("***************Stats**************\n"); + wxDebugContext::PrintStatistics(true); + + // Set back to wxLogGui + delete wxLog::SetActiveTarget(oldLog); +#endif + + StopTickTimer(); + + // Return 0 for succesful program termination + return AMULE_APP_BASE::OnExit(); +} + + +int CamuleApp::InitGui(bool, wxString &) +{ + return 0; +} + + +/** + * Checks permissions on a aMule directory, creating if needed. + * + * @param desc A description of the directory in question, used for error messages. + * @param directory The directory in question. + * @param fallback If the dir specified with 'directory' could not be created, try this instead. + * @return The bool is false on error. The wxString contains the used path. + */ +std::pair CheckMuleDirectory(const wxString& desc, const CPath& directory, const wxString& alternative) +{ + wxString msg; + + if (directory.IsDir(CPath::readwritable)) { + return std::pair(true, directory); + } else if (directory.DirExists()) { + msg = CFormat(wxT("Permissions on the %s directory too strict!\n") + wxT("aMule cannot proceed. To fix this, you must set read/write/exec\n") + wxT("permissions for the folder '%s'")) + % desc % directory; + } else if (CPath::MakeDir(directory)) { + return std::pair(true, directory); + } else { + msg << CFormat(wxT("Could not create the %s directory at '%s'.")) + % desc % directory; + } + + // Attempt to use fallback directory. + const CPath fallback = CPath(alternative); + if (fallback.IsOk() && (directory != fallback)) { + msg << wxT("\nAttempting to use default directory at location \n'") + << alternative << wxT("'."); + theApp->ShowAlert(msg, wxT("Error accessing directory."), wxICON_ERROR | wxOK); + + return CheckMuleDirectory(desc, fallback, wxEmptyString); + } + + theApp->ShowAlert(msg, wxT("Fatal error."), wxICON_ERROR | wxOK); + return std::pair(false, wxEmptyString); +} + + +// +// Application initialization +// +bool CamuleApp::OnInit() +{ +#if wxUSE_MEMORY_TRACING + printf("Checkpoint set on app init for memory debug\n"); + wxDebugContext::SetCheckpoint(); +#endif + + // Forward wxLog events to CLogger + wxLog::SetActiveTarget(new CLoggerTarget); + + m_localip = StringHosttoUint32(::wxGetFullHostName()); + +#ifndef __WXMSW__ + // get rid of sigpipe + signal(SIGPIPE, SIG_IGN); + // Handle sigint and sigterm + signal(SIGINT, OnShutdownSignal); + signal(SIGTERM, OnShutdownSignal); +#endif + +#ifdef __WXMAC__ + // For listctrl's to behave on Mac + wxSystemOptions::SetOption(wxT("mac.listctrl.always_use_generic"), 1); +#endif + + // This can't be on constructor or wx2.4.2 doesn't set it. + SetVendorName(wxT("TikuWarez")); + SetAppName(wxT("aMule")); + + wxString FullMuleVersion = GetFullMuleVersion(); + wxString OSDescription = wxGetOsDescription(); + strFullMuleVersion = strdup((const char *)unicode2char(FullMuleVersion)); + strOSDescription = strdup((const char *)unicode2char(OSDescription)); + OSType = OSDescription.BeforeFirst( wxT(' ') ); + if ( OSType.IsEmpty() ) { + OSType = wxT("Unknown"); + } + + // Handle uncaught exceptions + InstallMuleExceptionHandler(); + + // Parse cmdline arguments. + wxCmdLineParser cmdline(AMULE_APP_BASE::argc, AMULE_APP_BASE::argv); + + // Handle these arguments. + cmdline.AddSwitch(wxT("v"), wxT("version"), wxT("Displays the current version number.")); + cmdline.AddSwitch(wxT("h"), wxT("help"), wxT("Displays this information.")); + cmdline.AddSwitch(wxT("i"), wxT("enable-stdin"), wxT("Does not disable stdin.")); +#ifdef AMULE_DAEMON + cmdline.AddSwitch(wxT("f"), wxT("full-daemon"), wxT("Fork to background.")); + cmdline.AddOption(wxT("c"), wxT("config-dir"), wxT("read config from instead of home")); + cmdline.AddSwitch(wxT("e"), wxT("ec-config"), wxT("Configure EC (External Connections).")); +#else + cmdline.AddOption(wxT("geometry"), wxEmptyString, + wxT("Sets the geometry of the app.\n") + wxT("\t\t\t uses the same format as standard X11 apps:\n") + wxT("\t\t\t[=][{xX}][{+-}{+-}]")); +#endif + cmdline.AddSwitch(wxT("d"), wxT("disable-fatal"), wxT("Does not handle fatal exception.")); + cmdline.AddSwitch(wxT("o"), wxT("log-stdout"), wxT("Print log messages to stdout.")); + cmdline.AddSwitch(wxT("r"), wxT("reset-config"), wxT("Resets config to default values.")); + + // Show help on --help or invalid commands + if ( cmdline.Parse() ) { + return false; + } else if ( cmdline.Found(wxT("help")) ) { + cmdline.Usage(); + return false; + } + + bool ec_config = false; + +#ifdef AMULE_DAEMON + ec_config = cmdline.Found(wxT("ec-config")); + if ( cmdline.Found(wxT("config-dir"), &ConfigDir) ) { + if (ConfigDir.Last() != wxFileName::GetPathSeparator()) { + ConfigDir += wxFileName::GetPathSeparator(); + } + } else { + ConfigDir = GetConfigDir(); + } +#else + ConfigDir = GetConfigDir(); +#endif + + if ( !cmdline.Found(wxT("disable-fatal")) ) { +#ifndef __WXMSW__ + // catch fatal exceptions + wxHandleFatalExceptions(true); +#endif + } + + bool reset_config = cmdline.Found(wxT("reset-config")); + + enable_stdout_log = cmdline.Found(wxT("log-stdout")); +#ifdef AMULE_DAEMON + enable_daemon_fork = cmdline.Found(wxT("full-daemon")); +#else + enable_daemon_fork = false; +#endif + + if ( enable_stdout_log ) { + if ( enable_daemon_fork ) { + printf("Daemon will fork to background - log to stdout disabled\n"); + enable_stdout_log = false; + } else { + printf("Logging to stdout enabled\n"); + } + } + + if ( cmdline.Found(wxT("version")) ) { + printf("%s (OS: %s)\n", + (const char*)unicode2char(GetFullMuleVersion()), + (const char*)unicode2char(OSType)); + + return false; + } + + // Default geometry of the GUI. Can be changed with a cmdline argument... + bool geometry_enabled = false; + wxString geom_string; +#ifndef AMULE_DAEMON + if ( cmdline.Found(wxT("geometry"), &geom_string) ) { + geometry_enabled = true; + } +#endif + + + printf("Initialising aMule\n"); + + // Ensure that "~/.aMule/" is accessible. + if (!CheckMuleDirectory(wxT("configuration"), CPath(ConfigDir), wxEmptyString).first) { + return false; + } + + if (reset_config) { + // Make a backup first. + wxRemoveFile(ConfigDir + wxT("amule.conf.backup")); + wxRenameFile(ConfigDir + wxT("amule.conf"), ConfigDir + wxT("amule.conf.backup")); + printf("Your settings have ben resetted to default values.\nOld config file has been saved as amule.conf.backup\n"); + } + +#if defined(__WXMAC__) && defined(AMULE_DAEMON) + //#warning TODO: fix wxSingleInstanceChecker for amuled on Mac (wx link problems) + printf("WARNING: The check for other instances is currently disabled in amuled.\n" + "Please make sure that no other instance of aMule is running or your files might be corrupted.\n"); +#else + printf("Checking if there is an instance already running...\n"); + + m_singleInstance = new wxSingleInstanceChecker(wxT("muleLock"), ConfigDir); + if (m_singleInstance->IsAnotherRunning()) { + printf("There is an instance of aMule already running\n"); + + // This is very tricky. The most secure way to communicate is via ED2K links file + wxTextFile ed2kFile(ConfigDir + wxT("ED2KLinks")); + if (!ed2kFile.Exists()) { + ed2kFile.Create(); + } + + if (ed2kFile.Open()) { + ed2kFile.AddLine(wxT("RAISE_DIALOG")); + ed2kFile.Write(); + + printf("Raising current running instance.\n"); + } else { + printf("Failed to open 'ED2KFile', cannot signal running instance.\n"); + } + + return false; + } else { + printf("No other instances are running.\n"); + } +#endif + + // Close standard-input + if ( !cmdline.Found(wxT("enable-stdin")) ) { + // The full daemon will close all std file-descriptors by itself, + // so closing it here would lead to the closing on the first open + // file, which is the logfile opened below + if (!enable_daemon_fork) { + close(0); + } + } + + // This creates the CFG file we shall use + wxConfigBase* cfg = new wxFileConfig( wxEmptyString, wxEmptyString, ConfigDir + wxT("amule.conf") ); + + // Set the config object as the global cfg file + wxConfig::Set( cfg ); + + // Make a backup of the log file + CPath logfileName = CPath(ConfigDir + wxT("logfile")); + if (logfileName.FileExists()) { + CPath::BackupFile(logfileName, wxT(".bak")); + } + + // Open the log file + applog = new wxFFileOutputStream(logfileName.GetRaw()); + if (!applog->Ok()) { + // use std err as last resolt to indicate problem + fputs("ERROR: unable to open log file\n", stderr); + delete applog; + applog = NULL; + // failure to open log is serious problem + return false; + } + + // Load Preferences + CPreferences::BuildItemList(ConfigDir); + CPreferences::LoadAllItems( wxConfigBase::Get() ); + + glob_prefs = new CPreferences(); + + std::pair checkResult; + checkResult = CheckMuleDirectory(wxT("temp"), thePrefs::GetTempDir(), ConfigDir + wxT("Temp")); + if (checkResult.first) { + thePrefs::SetTempDir(checkResult.second); + } else { + return false; + } + + checkResult = CheckMuleDirectory(wxT("incoming"), thePrefs::GetIncomingDir(), ConfigDir + wxT("Incoming")); + if (checkResult.first) { + thePrefs::SetIncomingDir(checkResult.second); + } else { + return false; + } + + // Some sanity check + if (!thePrefs::UseTrayIcon()) { + thePrefs::SetMinToTray(false); + } + + // Build the filenames for the two OS files + SetOSFiles(thePrefs::GetOSDir().GetRaw()); + + // Load localization settings + Localize_mule(); + + // Configure EC for amuled when invoked with ec-config + if (ec_config) { + printf("\nEC configuration\n"); + thePrefs::SetECPass(GetPassword()); + thePrefs::EnableExternalConnections(true); + printf("Password set and external connections enabled.\n"); + } + + // Display notification on new version or first run + wxTextFile vfile( ConfigDir + wxT("lastversion") ); + wxString newMule(wxT( VERSION )); + + // Test if there's any new version + if (thePrefs::CheckNewVersion()) { + // We use the thread base because I don't want a dialog to pop up. + CHTTPDownloadThread* version_check = + new CHTTPDownloadThread(wxT("http://amule.sourceforge.net/lastversion"), + theApp->ConfigDir + wxT("last_version_check"), HTTP_VersionCheck, false); + version_check->Create(); + version_check->Run(); + } + + if ( !wxFileExists( vfile.GetName() ) ) { + vfile.Create(); + } + +#ifndef __WXMSW__ + if (getuid() == 0) { + wxString msg = + wxT("Warning! You are running aMule as root.\n") + wxT("Doing so is not recommended for security reasons,\n") + wxT("and you are advised to run aMule as an normal\n") + wxT("user instead."); + + ShowAlert(msg, _("Warning"), wxCENTRE | wxOK | wxICON_ERROR); + + fprintf(stderr, "\n--------------------------------------------------\n"); + fprintf(stderr, "%s", (const char*)unicode2UTF8(msg)); + fprintf(stderr, "\n--------------------------------------------------\n\n"); + } +#endif + + if ( vfile.Open() ) { + // Check if this version has been run before + bool found = false; + for ( size_t i = 0; i < vfile.GetLineCount(); i++ ) { + // Check if this version has been run before + if ( vfile.GetLine(i) == newMule ) { + found = true; + break; + } + } + + // We havent run this version before? + if ( !found ) { + // Insert new at top to provide faster searches + vfile.InsertLine( newMule, 0 ); + + Trigger_New_version( newMule ); + } + + // Keep at most 10 entires + while ( vfile.GetLineCount() > 10 ) + vfile.RemoveLine( vfile.GetLineCount() - 1 ); + + vfile.Write(); + vfile.Close(); + } + + // Check if we have the old style locale config + wxString langId = thePrefs::GetLanguageID(); + if (!langId.IsEmpty() && (langId.GetChar(0) >= '0' && langId.GetChar(0) <= '9')) { + wxString info(_("Your locale has been changed to System Default due to a configuration change. Sorry.")); + thePrefs::SetLanguageID(wxLang2Str(wxLANGUAGE_DEFAULT)); + ShowAlert(info, _("Info"), wxCENTRE | wxOK | wxICON_ERROR); + } + + m_statistics = new CStatistics(); + + clientlist = new CClientList(); + friendlist = new CFriendList(); + searchlist = new CSearchList(); + knownfiles = new CKnownFileList(); + serverlist = new CServerList(); + + sharedfiles = new CSharedFileList(knownfiles); + clientcredits = new CClientCreditsList(); + + // bugfix - do this before creating the uploadqueue + downloadqueue = new CDownloadQueue(); + uploadqueue = new CUploadQueue(); + ipfilter = new CIPFilter(); + + // Creates all needed listening sockets + wxString msg; + if (!ReinitializeNetwork(&msg)) { + printf("\n%s\n", (const char *)unicode2char(msg)); + } + + // Create main dialog, or fork to background (daemon). + InitGui(geometry_enabled, geom_string); + + // Has to be created after the call to InitGui, as fork + // (when using posix threads) only replicates the mainthread, + // and the UBT constructor creates a thread. + uploadBandwidthThrottler = new UploadBandwidthThrottler(); + + // These must be initialized after the gui is loaded. + serverlist->Init(); + downloadqueue->LoadMetFiles(thePrefs::GetTempDir()); + sharedfiles->Reload(); + + if (thePrefs::IPFilterAutoLoad()) { + ipfilter->Update(thePrefs::IPFilterURL()); + } + + + // Ensure that the up/down ratio is used + CPreferences::CheckUlDlRatio(); + + // The user can start pressing buttons like mad if he feels like it. + m_app_state = APP_STATE_RUNNING; + + // Kry - Load the sources seeds on app init + if (thePrefs::GetSrcSeedsOn()) { + downloadqueue->LoadSourceSeeds(); + } + + if (!serverlist->GetServerCount() && thePrefs::GetNetworkED2K()) { + // There are no servers and ED2K active -> ask for download. + // As we cannot ask in amuled, we just update there + // Kry TODO: Store server.met URL on preferences and use it here and in GUI. +#ifndef AMULE_DAEMON + if (wxYES == wxMessageBox( + wxString( + _("You don't have any server in the server list.\nDo you want aMule to download a new list now?")), + wxString(_("Server list download")), + wxYES_NO, + static_cast(theApp->amuledlg))) +#endif + { + // workaround amuled crash +#ifndef AMULE_DAEMON + serverlist->UpdateServerMetFromURL( + wxT("http://gruk.org/server.met.gz")); +#endif + } + } + + + // Autoconnect if that option is enabled + if (thePrefs::DoAutoConnect() && (thePrefs::GetNetworkED2K() || thePrefs::GetNetworkKademlia())) { + AddLogLineM(true, _("Connecting")); + if (thePrefs::GetNetworkED2K()) { + theApp->serverconnect->ConnectToAnyServer(); + } + + StartKad(); + + } + + // No webserver on Win at all (yet) +#ifndef __WXMSW__ + // Run webserver? + if (thePrefs::GetWSIsEnabled()) { + wxString aMuleConfigFile = ConfigDir + wxT("amule.conf"); + wxString amulewebPath = wxT("amuleweb"); + +#if defined(__WXMAC__) && !defined(AMULE_DAEMON) + // For the Mac GUI application, look for amuleweb in the bundle + CFURLRef amulewebUrl = CFBundleCopyAuxiliaryExecutableURL( + CFBundleGetMainBundle(), CFSTR("amuleweb")); + + if (amulewebUrl) { + CFURLRef absoluteUrl = CFURLCopyAbsoluteURL(amulewebUrl); + CFRelease(amulewebUrl); + + if (absoluteUrl) { + CFStringRef amulewebCfstr = CFURLCopyFileSystemPath(absoluteUrl, kCFURLPOSIXPathStyle); + CFRelease(absoluteUrl); + amulewebPath = wxMacCFStringHolder(amulewebCfstr).AsString(wxLocale::GetSystemEncoding()); + } + } +#endif + + wxString cmd = + wxT("'") + + amulewebPath + + wxT("' '--amule-config-file=") + + aMuleConfigFile + + wxT("'"); + CTerminationProcessAmuleweb *p = new CTerminationProcessAmuleweb(cmd, &webserver_pid); + webserver_pid = wxExecute(cmd, wxEXEC_ASYNC, p); + bool webserver_ok = webserver_pid > 0; + if (webserver_ok) { + AddLogLineM(true, CFormat(_("webserver running on pid %d")) % webserver_pid); + } else { + delete p; + ShowAlert(_( + "You requested to run webserver from startup, " + "but the amuleweb binary cannot be run. " + "Please install the package containing aMule webserver, " + "or compile aMule using --enable-webserver and run make install"), + _("Error"), wxOK | wxICON_ERROR); + } + } +#endif /* ! __WXMSW__ */ + + // Start performing background tasks + CThreadScheduler::Start(); + + return true; +} + +bool CamuleApp::ReinitializeNetwork(wxString* msg) +{ + bool ok = true; + static bool firstTime = true; + + if (!firstTime) { + // TODO: Destroy previously created sockets + } + firstTime = false; + + // Some sanity checks first + if (thePrefs::ECPort() == thePrefs::GetPort()) { + // Select a random usable port in the range 1025 ... 2^16 - 1 + uint16 port = thePrefs::ECPort(); + while ( port < 1024 || port == thePrefs::GetPort() ) { + port = (uint16)rand(); + } + thePrefs::SetECPort( port ); + + wxString err = + wxT("Network configuration failed! You cannot use the same port\n") + wxT("for the main TCP port and the External Connections port.\n") + wxT("The EC port has been changed to avoid conflict, see the\n") + wxT("preferences for the new value.\n"); + *msg << err; + + AddLogLineM( false, wxEmptyString ); + AddLogLineM( true, err ); + AddLogLineM( false, wxEmptyString ); + + ok = false; + } + + if (thePrefs::GetUDPPort() == thePrefs::GetPort() + 3) { + // Select a random usable value in the range 1025 ... 2^16 - 1 + uint16 port = thePrefs::GetUDPPort(); + while ( port < 1024 || port == thePrefs::GetPort() + 3 ) { + port = (uint16)rand(); + } + thePrefs::SetUDPPort( port ); + + wxString err = + wxT("Network configuration failed! You set your UDP port to\n") + wxT("the value of the main TCP port plus 3.\n") + wxT("This port has been reserved for the Server-UDP port. The\n") + wxT("port value has been changed to avoid conflict, see the\n") + wxT("preferences for the new value\n"); + *msg << err; + + AddLogLineM( false, wxEmptyString ); + AddLogLineM( true, err ); + AddLogLineM( false, wxEmptyString ); + + ok = false; + } + + // Create the address where we are going to listen + // TODO: read this from configuration file + amuleIPV4Address myaddr[4]; + + // Create the External Connections Socket. + // Default is 4712. + // Get ready to handle connections from apps like amulecmd + if (thePrefs::GetECAddress().IsEmpty() || !myaddr[0].Hostname(thePrefs::GetECAddress())) { + myaddr[0].AnyAddress(); + } + myaddr[0].Service(thePrefs::ECPort()); + ECServerHandler = new ExternalConn(myaddr[0], msg); + + // Create the UDP socket TCP+3. + // Used for source asking on servers. + if (thePrefs::GetAddress().IsEmpty()) { + myaddr[1].AnyAddress(); + } else if (!myaddr[1].Hostname(thePrefs::GetAddress())) { + myaddr[1].AnyAddress(); + AddLogLineM(true, CFormat(_("Could not bind ports to the specified address: %s")) + % thePrefs::GetAddress()); + } + + wxString ip = myaddr[1].IPAddress(); + myaddr[1].Service(thePrefs::GetPort()+3); + serverconnect = new CServerConnect(serverlist, myaddr[1]); + *msg << CFormat( wxT("*** Server UDP socket (TCP+3) at %s:%u\n") ) + % ip % ((unsigned int)thePrefs::GetPort() + 3u); + + // Create the ListenSocket (aMule TCP socket). + // Used for Client Port / Connections from other clients, + // Client to Client Source Exchange. + // Default is 4662. + myaddr[2] = myaddr[1]; + myaddr[2].Service(thePrefs::GetPort()); + listensocket = new CListenSocket(myaddr[2]); + *msg << CFormat( wxT("*** TCP socket (TCP) listening on %s:%u\n") ) + % ip % (unsigned int)(thePrefs::GetPort()); + // This command just sets a flag to control maximum number of connections. + // Notify(true) has already been called to the ListenSocket, so events may + // be already comming in. + if (listensocket->Ok()) { + listensocket->StartListening(); + } else { + // If we wern't able to start listening, we need to warn the user + wxString err; + err = CFormat(_("Port %u is not available. You will be LOWID\n")) % + (unsigned int)(thePrefs::GetPort()); + *msg << err; + AddLogLineM(true, err); + err.Clear(); + err = CFormat( + _("Port %u is not available!\n\nThis means that you will be LOWID.\n\nCheck your network to make sure the port is open for output and input.")) % + (unsigned int)(thePrefs::GetPort()); + ShowAlert(err, _("Error"), wxOK | wxICON_ERROR); + } + + // Create the UDP socket. + // Used for extended eMule protocol, Queue Rating, File Reask Ping. + // Also used for Kademlia. + // Default is port 4672. + myaddr[3] = myaddr[1]; + myaddr[3].Service(thePrefs::GetUDPPort()); + clientudp = new CClientUDPSocket(myaddr[3], thePrefs::GetProxyData()); + if (!thePrefs::IsUDPDisabled()) { + *msg << CFormat( wxT("*** Client UDP socket (extended eMule) at %s:%u") ) + % ip % thePrefs::GetUDPPort(); + } else { + *msg << wxT("*** Client UDP socket (extended eMule) disabled on preferences"); + } + +#ifdef ENABLE_UPNP + if (thePrefs::GetUPnPEnabled()) { + try { + m_upnpMappings[0] = CUPnPPortMapping( + myaddr[0].Service(), + "TCP", + thePrefs::GetUPnPECEnabled(), + "aMule TCP External Connections Socket"); + m_upnpMappings[1] = CUPnPPortMapping( + myaddr[1].Service(), + "UDP", + thePrefs::GetUPnPEnabled(), + "aMule UDP socket (TCP+3)"); + m_upnpMappings[2] = CUPnPPortMapping( + myaddr[2].Service(), + "TCP", + thePrefs::GetUPnPEnabled(), + "aMule TCP Listen Socket"); + m_upnpMappings[3] = CUPnPPortMapping( + myaddr[3].Service(), + "UDP", + thePrefs::GetUPnPEnabled(), + "aMule UDP Extended eMule Socket"); + m_upnp = new CUPnPControlPoint(thePrefs::GetUPnPTCPPort()); + m_upnp->AddPortMappings(m_upnpMappings); + } catch(CUPnPException &e) { + wxString error_msg; + error_msg << e.what(); + AddLogLineM(true, error_msg); + fprintf(stderr, "%s\n", (const char *)unicode2char(error_msg)); + } + } +#endif + + return ok; +} + +// Returns a magnet ed2k URI +wxString CamuleApp::CreateMagnetLink(const CAbstractFile *f) +{ + CMagnetURI uri; + + uri.AddField(wxT("dn"), f->GetFileName().Cleanup(false).GetPrintable()); + uri.AddField(wxT("xt"), wxString(wxT("urn:ed2k:")) + f->GetFileHash().Encode().Lower()); + uri.AddField(wxT("xl"), wxString::Format(wxT("%") wxLongLongFmtSpec wxT("u"), f->GetFileSize())); + + return uri.GetLink(); +} + +// Returns a ed2k file URL +wxString CamuleApp::CreateED2kLink(const CAbstractFile *f, bool add_source, bool use_hostname, bool addcryptoptions) +{ + wxASSERT(!(!add_source && (use_hostname || addcryptoptions))); + // Construct URL like this: ed2k://|file||||/ + wxString strURL = CFormat(wxT("ed2k://|file|%s|%i|%s|/")) + % f->GetFileName().Cleanup(false) + % f->GetFileSize() % f->GetFileHash().Encode(); + + if (add_source && IsConnected() && !IsFirewalled()) { + // Create the first part of the URL + strURL << wxT("|sources,"); + if (use_hostname) { + strURL << thePrefs::GetYourHostname(); + } else { + uint32 clientID = GetID(); + strURL << (uint8) clientID << wxT(".") << + (uint8)(clientID >> 8) << wxT(".") << + (uint8)(clientID >> 16) << wxT(".") << + (uint8)(clientID >> 24); + } + + strURL << wxT(":") << + thePrefs::GetPort(); + + if (addcryptoptions) { + const uint8 uSupportsCryptLayer = thePrefs::IsClientCryptLayerSupported() ? 1 : 0; + const uint8 uRequestsCryptLayer = thePrefs::IsClientCryptLayerRequested() ? 1 : 0; + const uint8 uRequiresCryptLayer = thePrefs::IsClientCryptLayerRequired() ? 1 : 0; + const uint8 byCryptOptions = (uRequiresCryptLayer << 2) | (uRequestsCryptLayer << 1) | (uSupportsCryptLayer << 0) | (uSupportsCryptLayer ? 0x80 : 0x00); + + strURL << wxT(":") << byCryptOptions; + + if (byCryptOptions & 0x80) { + strURL << wxT(":") << thePrefs::GetUserHash().Encode(); + } + } + strURL << wxT("|/"); + } else if (add_source) { + AddLogLineM(true, _("WARNING: You can't add yourself as a source for a ed2k link while being lowid.")); + } + + // Result is "ed2k://|file||||/|sources,[(|):[:cryptoptions[:hash]]]|/" + return strURL; +} + +// Returns a ed2k link with AICH info if available +wxString CamuleApp::CreateED2kAICHLink(const CKnownFile* f) +{ + // Create the first part of the URL + wxString strURL = CreateED2kLink(f); + // Append the AICH info + if (f->HasProperAICHHashSet()) { + strURL << wxT("|h=") << f->GetAICHMasterHash() << wxT("|/"); + } + + // Result is "ed2k://|file||||/|h=|/" + return strURL; +} + +/* Original implementation by Bouc7 of the eMule Project. + aMule Signature idea was designed by BigBob and implemented + by Un-Thesis, with design inputs and suggestions from bothie. +*/ +void CamuleApp::OnlineSig(bool zero /* reset stats (used on shutdown) */) +{ + // Do not do anything if online signature is disabled in Preferences + if (!thePrefs::IsOnlineSignatureEnabled() || m_emulesig_path.IsEmpty()) { + // We do not need to check m_amulesig_path because if m_emulesig_path is empty, + // that means m_amulesig_path is empty too. + return; + } + + // Remove old signature files + if ( wxFileExists( m_emulesig_path ) ) { wxRemoveFile( m_emulesig_path ); } + if ( wxFileExists( m_amulesig_path ) ) { wxRemoveFile( m_amulesig_path ); } + + + wxTextFile amulesig_out; + wxTextFile emulesig_out; + + // Open both files if needed + if ( !emulesig_out.Create( m_emulesig_path) ) { + AddLogLineM(true, _("Failed to create OnlineSig File")); + // Will never try again. + m_amulesig_path.Clear(); + m_emulesig_path.Clear(); + return; + } + + if ( !amulesig_out.Create(m_amulesig_path) ) { + AddLogLineM(true, _("Failed to create aMule OnlineSig File")); + // Will never try again. + m_amulesig_path.Clear(); + m_emulesig_path.Clear(); + return; + } + + wxString emulesig_string; + wxString temp; + + if (zero) { + emulesig_string = wxT("0\xA0.0|0.0|0"); + amulesig_out.AddLine(wxT("0\n0\n0\n0\n0\n0\n0.0\n0.0\n0\n0")); + } else { + if (IsConnectedED2K()) { + + temp = wxString::Format(wxT("%d"),serverconnect->GetCurrentServer()->GetPort()); + + // We are online + emulesig_string = + // Connected + wxT("1|") + //Server name + + serverconnect->GetCurrentServer()->GetListName() + + wxT("|") + // IP and port of the server + + serverconnect->GetCurrentServer()->GetFullIP() + + wxT("|") + + temp; + + + // Now for amule sig + + // Connected. State 1, full info + amulesig_out.AddLine(wxT("1")); + // Server Name + amulesig_out.AddLine(serverconnect->GetCurrentServer()->GetListName()); + // Server IP + amulesig_out.AddLine(serverconnect->GetCurrentServer()->GetFullIP()); + // Server Port + amulesig_out.AddLine(temp); + + if (serverconnect->IsLowID()) { + amulesig_out.AddLine(wxT("L")); + } else { + amulesig_out.AddLine(wxT("H")); + } + + } else if (serverconnect->IsConnecting()) { + emulesig_string = wxT("0"); + + // Connecting. State 2, No info. + amulesig_out.AddLine(wxT("2\n0\n0\n0\n0")); + } else { + // Not connected to a server + emulesig_string = wxT("0"); + + // Not connected, state 0, no info + amulesig_out.AddLine(wxT("0\n0\n0\n0\n0")); + } + if (IsConnectedKad()) { + if(Kademlia::CKademlia::IsFirewalled()) { + // Connected. Firewalled. State 1. + amulesig_out.AddLine(wxT("1")); + } else { + // Connected. State 2. + amulesig_out.AddLine(wxT("2")); + } + } else { + // Not connected.State 0. + amulesig_out.AddLine(wxT("0")); + } + emulesig_string += wxT("\xA"); + + // Datarate for downloads + temp = wxString::Format(wxT("%.1f"), theStats::GetDownloadRate() / 1024.0); + + emulesig_string += temp + wxT("|"); + amulesig_out.AddLine(temp); + + // Datarate for uploads + temp = wxString::Format(wxT("%.1f"), theStats::GetUploadRate() / 1024.0); + + emulesig_string += temp + wxT("|"); + amulesig_out.AddLine(temp); + + // Number of users waiting for upload + temp = wxString::Format(wxT("%d"), theStats::GetWaitingUserCount()); + + emulesig_string += temp; + amulesig_out.AddLine(temp); + + // Number of shared files (not on eMule) + amulesig_out.AddLine(wxString::Format(wxT("%d"), theStats::GetSharedFileCount())); + } + + // eMule signature finished here. Write the line to the wxTextFile. + emulesig_out.AddLine(emulesig_string); + + // Now for aMule signature extras + + // Nick on the network + amulesig_out.AddLine(thePrefs::GetUserNick()); + + // Total received in bytes + amulesig_out.AddLine( CFormat( wxT("%llu") ) % (theStats::GetSessionReceivedBytes() + thePrefs::GetTotalDownloaded()) ); + + // Total sent in bytes + amulesig_out.AddLine( CFormat( wxT("%llu") ) % (theStats::GetSessionSentBytes() + thePrefs::GetTotalUploaded()) ); + + // amule version +#ifdef SVNDATE + amulesig_out.AddLine(wxT(VERSION " " SVNDATE)); +#else + amulesig_out.AddLine(wxT(VERSION)); +#endif + + if (zero) { + amulesig_out.AddLine(wxT("0")); + amulesig_out.AddLine(wxT("0")); + amulesig_out.AddLine(wxT("0")); + } else { + // Total received bytes in session + amulesig_out.AddLine( CFormat( wxT("%llu") ) % + theStats::GetSessionReceivedBytes() ); + + // Total sent bytes in session + amulesig_out.AddLine( CFormat( wxT("%llu") ) % + theStats::GetSessionSentBytes() ); + + // Uptime + amulesig_out.AddLine(CFormat(wxT("%llu")) % theStats::GetUptimeSeconds()); + } + + // Flush the files + emulesig_out.Write(); + amulesig_out.Write(); +} //End Added By Bouc7 + + +// Gracefully handle fatal exceptions and print backtrace if possible +void CamuleApp::OnFatalException() +{ + /* Print the backtrace */ + fprintf(stderr, "\n--------------------------------------------------------------------------------\n"); + fprintf(stderr, "A fatal error has occurred and aMule has crashed.\n"); + fprintf(stderr, "Please assist us in fixing this problem by posting the backtrace below in our\n"); + fprintf(stderr, "'aMule Crashes' forum and include as much information as possible regarding the\n"); + fprintf(stderr, "circumstances of this crash. The forum is located here:\n"); + fprintf(stderr, " http://forum.amule.org/index.php?board=67.0\n"); + fprintf(stderr, "If possible, please try to generate a real backtrace of this crash:\n"); + fprintf(stderr, " http://www.amule.org/wiki/index.php/Backtraces\n\n"); + fprintf(stderr, "----------------------------=| BACKTRACE FOLLOWS: |=----------------------------\n"); + fprintf(stderr, "Current version is: %s\n", strFullMuleVersion); + fprintf(stderr, "Running on: %s\n\n", strOSDescription); + + print_backtrace(1); // 1 == skip this function. + + fprintf(stderr, "\n--------------------------------------------------------------------------------\n"); +} + + +// Sets the localization of aMule +void CamuleApp::Localize_mule() +{ + InitCustomLanguages(); + InitLocale(m_locale, StrLang2wx(thePrefs::GetLanguageID())); + if (!m_locale.IsOk()) { + AddLogLineM(false,_("The selected locale seems not to be installed on your box. (Note: I'll try to set it anyway)")); + } +} + + +// Displays information related to important changes in aMule. +// Is called when the user runs a new version of aMule +void CamuleApp::Trigger_New_version(wxString new_version) +{ + wxString info = wxT(" --- ") + CFormat(_("This is the first time you run aMule %s")) % new_version + wxT(" ---\n\n"); + if (new_version == wxT("SVN")) { + info += _("This version is a testing version, updated daily, and\n"); + info += _("we give no warranty it won't break anything, burn your house,\n"); + info += _("or kill your dog. But it *should* be safe to use anyway.\n"); + } else if (new_version == wxT("2.2.0")) { + thePrefs::SetAddServersFromServer(false); + thePrefs::SetAddServersFromClient(false); + info += _("The following options have been changed in this release for security reasons:\n"); + info += _("\n* Enabled Protocol Obfuscation support for incoming and outgoing connections.\n"); + info += _("\n* Disabled updating the server list from other server and clients.\n"); + info += _("\nFor more information on the reason for this changes, seach\nthe aMule wiki at http://wiki.amule.org for \"fake servers\" info.\nIt's important that you clear any fake server from your server list for aMule to work properly."); + } + + // General info + info += wxT("\n"); + info += _("More information, support and new releases can found at our homepage,\n"); + info += _("at www.aMule.org, or in our IRC channel #aMule at irc.freenode.net.\n"); + info += wxT("\n"); + info += _("Feel free to report any bugs to http://forum.amule.org"); + + ShowAlert(info, _("Info"), wxCENTRE | wxOK | wxICON_ERROR); +} + + +void CamuleApp::SetOSFiles(const wxString new_path) +{ + if ( thePrefs::IsOnlineSignatureEnabled() ) { + if ( ::wxDirExists(new_path) ) { + m_emulesig_path = JoinPaths(new_path, wxT("onlinesig.dat")); + m_amulesig_path = JoinPaths(new_path, wxT("amulesig.dat")); + } else { + ShowAlert(_("The folder for Online Signature files you specified is INVALID!\n OnlineSignature will be DISABLED until you fix it on preferences."), _("Error"), wxOK | wxICON_ERROR); + m_emulesig_path.Clear(); + m_amulesig_path.Clear(); + } + } else { + m_emulesig_path.Clear(); + m_amulesig_path.Clear(); + } +} + + +#ifdef __WXDEBUG__ +#ifndef wxUSE_STACKWALKER +#define wxUSE_STACKWALKER 0 +#endif +void CamuleApp::OnAssertFailure(const wxChar* file, int line, + const wxChar* func, const wxChar* cond, const wxChar* msg) +{ + if (!wxUSE_STACKWALKER || !wxThread::IsMain() || !IsRunning()) { + wxString errmsg = CFormat( wxT("%s:%s:%d: Assertion '%s' failed. %s") ) + % file % func % line % cond % ( msg ? msg : wxT("") ); + + fprintf(stderr, "Assertion failed: %s\n", (const char*)unicode2char(errmsg)); + + // Skip the function-calls directly related to the assert call. + fprintf(stderr, "\nBacktrace follows:\n"); + print_backtrace(3); + fprintf(stderr, "\n"); + } + + if (wxThread::IsMain() && IsRunning()) { + AMULE_APP_BASE::OnAssertFailure(file, line, func, cond, msg); + } else { + // Abort, allows gdb to catch the assertion + raise( SIGABRT ); + } +} +#endif + + +void CamuleApp::OnUDPDnsDone(CMuleInternalEvent& evt) +{ + CServerUDPSocket* socket =(CServerUDPSocket*)evt.GetClientData(); + socket->OnHostnameResolved(evt.GetExtraLong()); +} + + +void CamuleApp::OnSourceDnsDone(CMuleInternalEvent& evt) +{ + downloadqueue->OnHostnameResolved(evt.GetExtraLong()); +} + + +void CamuleApp::OnServerDnsDone(CMuleInternalEvent& evt) +{ + printf("Server hostname notified\n"); + serverconnect->OnServerHostnameResolved(evt.GetClientData(), evt.GetExtraLong()); +} + + +void CamuleApp::OnTCPTimer(CTimerEvent& WXUNUSED(evt)) +{ + if(!IsRunning()) { + return; + } + serverconnect->StopConnectionTry(); + if (IsConnectedED2K() ) { + return; + } + serverconnect->ConnectToAnyServer(); +} + + +void CamuleApp::OnCoreTimer(CTimerEvent& WXUNUSED(evt)) +{ + // Former TimerProc section + static uint64 msPrev1, msPrev5, msPrevSave, msPrevHist, msPrevOS, msPrevKnownMet; + uint64 msCur = theStats::GetUptimeMillis(); + + if (!IsRunning()) { + return; + } + +#ifndef AMULE_DAEMON + // Check if we should terminate the app + if ( g_shutdownSignal ) { + wxWindow* top = GetTopWindow(); + + if ( top ) { + top->Close(true); + } else { + // No top-window, have to force termination. + wxExit(); + } + } +#endif + + CLogger::FlushPendingEntries(); + + uploadqueue->Process(); + downloadqueue->Process(); + //theApp->clientcredits->Process(); + theStats::CalculateRates(); + + if (msCur-msPrevHist > 1000) { + // unlike the other loop counters in this function this one will sometimes + // produce two calls in quick succession (if there was a gap of more than one + // second between calls to TimerProc) - this is intentional! This way the + // history list keeps an average of one node per second and gets thinned out + // correctly as time progresses. + msPrevHist += 1000; + + m_statistics->RecordHistory(); + + } + + + if (msCur-msPrev1 > 1000) { // approximately every second + msPrev1 = msCur; + clientcredits->Process(); + clientlist->Process(); + + // Publish files to server if needed. + sharedfiles->Process(); + + if( Kademlia::CKademlia::IsRunning() ) { + Kademlia::CKademlia::Process(); + if(Kademlia::CKademlia::GetPrefs()->HasLostConnection()) { + StopKad(); + clientudp->Close(); + clientudp->Open(); + if (thePrefs::Reconnect()) { + StartKad(); + } + } + } + + if( serverconnect->IsConnecting() && !serverconnect->IsSingleConnect() ) { + serverconnect->TryAnotherConnectionrequest(); + } + if (serverconnect->IsConnecting()) { + serverconnect->CheckForTimeout(); + } + listensocket->UpdateConnectionsStatus(); + + } + + + if (msCur-msPrev5 > 5000) { // every 5 seconds + msPrev5 = msCur; + listensocket->Process(); + } + + if (msCur-msPrevSave >= 60000) { + msPrevSave = msCur; + wxString buffer; + + // Save total upload/download to preferences + wxConfigBase* cfg = wxConfigBase::Get(); + buffer = CFormat(wxT("%llu")) % (theStats::GetSessionReceivedBytes() + thePrefs::GetTotalDownloaded()); + cfg->Write(wxT("/Statistics/TotalDownloadedBytes"), buffer); + + buffer = CFormat(wxT("%llu")) % (theStats::GetSessionSentBytes() + thePrefs::GetTotalUploaded()); + cfg->Write(wxT("/Statistics/TotalUploadedBytes"), buffer); + + // Write changes to file + cfg->Flush(); + + } + + // Special + if (msCur - msPrevOS >= thePrefs::GetOSUpdate() * 1000ull) { + OnlineSig(); // Added By Bouc7 + msPrevOS = msCur; + } + + if (msCur - msPrevKnownMet >= 30*60*1000/*There must be a prefs option for this*/) { + // Save Shared Files data + knownfiles->Save(); + msPrevKnownMet = msCur; + } + + + // Recomended by lugdunummaster himself - from emule 0.30c + serverconnect->KeepConnectionAlive(); + +} + + +void CamuleApp::OnFinishedHashing(CHashingEvent& evt) +{ + wxCHECK_RET(evt.GetResult(), wxT("No result of hashing")); + + CKnownFile* owner = const_cast(evt.GetOwner()); + CKnownFile* result = evt.GetResult(); + + if (owner) { + // Check if the partfile still exists, as it might have + // been deleted in the mean time. + if (downloadqueue->IsPartFile(owner)) { + // This cast must not be done before the IsPartFile + // call, as dynamic_cast will barf on dangling pointers. + dynamic_cast(owner)->PartFileHashFinished(result); + } + } else { + static int filecount; + static uint64 bytecount; + + if (knownfiles->SafeAddKFile(result)) { + AddDebugLogLineM(false, logKnownFiles, + CFormat(wxT("Safe adding file to sharedlist: %s")) % result->GetFileName()); + sharedfiles->SafeAddKFile(result); + + filecount++; + bytecount += result->GetFileSize(); + // If we have added 30 files or files with a total size of ~300mb + if ( ( filecount == 30 ) || ( bytecount >= 314572800 ) ) { + AddDebugLogLineM(false, logKnownFiles, wxT("Failsafe for crash on file hashing creation")); + if ( m_app_state != APP_STATE_SHUTTINGDOWN ) { + knownfiles->Save(); + filecount = 0; + bytecount = 0; + } + } + } else { + AddDebugLogLineM(false, logKnownFiles, + CFormat(wxT("File not added to sharedlist: %s")) % result->GetFileName()); + delete result; + } + } +} + + +void CamuleApp::OnFinishedAICHHashing(CHashingEvent& evt) +{ + wxCHECK_RET(evt.GetResult(), wxT("No result of AICH-hashing")); + + CKnownFile* owner = const_cast(evt.GetOwner()); + std::auto_ptr result(evt.GetResult()); + + // Check that the owner is still valid + if (knownfiles->IsKnownFile(owner)) { + if (result->GetAICHHashset()->GetStatus() == AICH_HASHSETCOMPLETE) { + CAICHHashSet* oldSet = owner->GetAICHHashset(); + CAICHHashSet* newSet = result->GetAICHHashset(); + + owner->SetAICHHashset(newSet); + newSet->SetOwner(owner); + + result->SetAICHHashset(oldSet); + oldSet->SetOwner(result.get()); + } + } +} + + +void CamuleApp::OnFinishedCompletion(CCompletionEvent& evt) +{ + CPartFile* completed = const_cast(evt.GetOwner()); + wxCHECK_RET(completed, wxT("Completion event sent for unspecified file")); + wxASSERT_MSG(downloadqueue->IsPartFile(completed), wxT("CCompletionEvent for unknown partfile.")); + + completed->CompleteFileEnded(evt.ErrorOccured(), evt.GetFullPath()); + if (evt.ErrorOccured()) { + CUserEvents::ProcessEvent(CUserEvents::ErrorOnCompletion, completed); + } + + // Check if we should execute an script/app/whatever. + CUserEvents::ProcessEvent(CUserEvents::DownloadCompleted, completed); +} + + +void CamuleApp::OnNotifyEvent(CMuleGUIEvent& evt) +{ +#if defined(AMULE_DAEMON) + evt.Notify(); +#else + if (theApp->amuledlg) { + evt.Notify(); + } +#endif +} + + +void CamuleApp::ShutDown() +{ + // Log + AddDebugLogLineM(false, logGeneral, wxT("CamuleApp::ShutDown() has started.")); + + // Signal the hashing thread to terminate + m_app_state = APP_STATE_SHUTTINGDOWN; + + StopKad(); + + // Kry - Save the sources seeds on app exit + if (thePrefs::GetSrcSeedsOn()) { + downloadqueue->SaveSourceSeeds(); + } + + OnlineSig(true); // Added By Bouc7 + + // Close sockets to avoid new clients coming in + if (listensocket) { + listensocket->Close(); + listensocket->KillAllSockets(); + } + + if (serverconnect) { + serverconnect->Disconnect(); + } + + ECServerHandler->KillAllSockets(); + +#ifdef ENABLE_UPNP + if (thePrefs::GetUPnPEnabled()) { + if (m_upnp) { + m_upnp->DeletePortMappings(m_upnpMappings); + } + } +#endif + + // saving data & stuff + if (knownfiles) { + knownfiles->Save(); + } + + thePrefs::Add2TotalDownloaded(theStats::GetSessionReceivedBytes()); + thePrefs::Add2TotalUploaded(theStats::GetSessionSentBytes()); + + if (glob_prefs) { + glob_prefs->Save(); + } + + if (clientlist) { + clientlist->DeleteAll(); + } + + CThreadScheduler::Terminate(); + + theApp->uploadBandwidthThrottler->EndThread(); + + // Log + AddDebugLogLineM(false, logGeneral, wxT("CamuleApp::ShutDown() has ended.")); +} + + +bool CamuleApp::AddServer(CServer *srv, bool fromUser) +{ + if ( serverlist->AddServer(srv, fromUser) ) { + Notify_ServerAdd(srv); + return true; + } + return false; +} + + +void CamuleApp::AddLogLine(const wxString &msg) +{ + // At most one trailing new-line, which we add + wxString message = msg; + while ( !message.IsEmpty() && message.Last() == wxT('\n') ) { + message.RemoveLast(); + } + + wxString full_line = wxDateTime::Now().FormatISODate() + wxT(" ") + + wxDateTime::Now().FormatISOTime() + wxT(": ") + message + wxT("\n"); + + wxStringInputStream stream(full_line); + + if (applog) { // This check is needed, because if we assert before the logger is created, it will crash. + (*applog) << stream; + applog->Sync(); + } + + if (enable_stdout_log) { + printf("%s", (const char*)unicode2char(full_line)); + } +} + + +uint32 CamuleApp::GetPublicIP(bool ignorelocal) const +{ + if (m_dwPublicIP == 0) { + if (Kademlia::CKademlia::IsConnected() && Kademlia::CKademlia::GetIPAddress() ) { + return wxUINT32_SWAP_ALWAYS(Kademlia::CKademlia::GetIPAddress()); + } else { + return ignorelocal ? 0 : m_localip; + } + } + + return m_dwPublicIP; +} + + +void CamuleApp::SetPublicIP(const uint32 dwIP) +{ + wxASSERT((dwIP == 0) || !IsLowID(dwIP)); + + if (dwIP != 0 && dwIP != m_dwPublicIP && serverlist != NULL) { + m_dwPublicIP = dwIP; + serverlist->CheckForExpiredUDPKeys(); + } else { + m_dwPublicIP = dwIP; + } +} + + +wxString CamuleApp::GetLog(bool reset) +{ + ConfigDir = GetConfigDir(); + wxFile logfile; + logfile.Open(ConfigDir + wxT("logfile")); + if ( !logfile.IsOpened() ) { + return wxTRANSLATE("ERROR: can't open logfile"); + } + int len = logfile.Length(); + if ( len == 0 ) { + return wxTRANSLATE("WARNING: logfile is empty. Something is wrong."); + } + char *tmp_buffer = new char[len + sizeof(wxChar)]; + logfile.Read(tmp_buffer, len); + memset(tmp_buffer + len, 0, sizeof(wxChar)); + + // try to guess file format + wxString str; + if (tmp_buffer[0] && tmp_buffer[1]) { + str = wxString(UTF82unicode(tmp_buffer)); + } else { + str = wxString((wxWCharBuffer&)tmp_buffer); + } + + delete [] tmp_buffer; + if ( reset ) { + delete applog; + applog = new wxFFileOutputStream(ConfigDir + wxT("logfile")); + if ( applog->Ok() ) { + AddLogLine(_("Log has been reset")); + } else { + delete applog; + applog = 0; + } + } + return str; +} + + +wxString CamuleApp::GetServerLog(bool reset) +{ + wxString ret = server_msg; + if ( reset ) { + server_msg.Clear(); + } + return ret; +} + +wxString CamuleApp::GetDebugLog(bool reset) +{ + return GetLog(reset); +} + + +void CamuleApp::AddServerMessageLine(wxString &msg) +{ + server_msg += msg + wxT("\n"); + AddLogLine(CFormat(_("ServerMessage: %s")) % msg); +} + + + +void CamuleApp::OnFinishedHTTPDownload(CMuleInternalEvent& event) +{ + switch (event.GetInt()) { + case HTTP_IPFilter: + ipfilter->DownloadFinished(event.GetExtraLong()); + break; + case HTTP_ServerMet: + serverlist->DownloadFinished(event.GetExtraLong()); + break; + case HTTP_ServerMetAuto: + serverlist->AutoDownloadFinished(event.GetExtraLong()); + break; + case HTTP_VersionCheck: + CheckNewVersion(event.GetExtraLong()); + break; + case HTTP_NodesDat: + if (event.GetExtraLong() != -1) { + + wxString file = ConfigDir + wxT("nodes.dat"); + if (wxFileExists(file)) { + wxRemoveFile(file); + } + + if ( Kademlia::CKademlia::IsRunning() ) { + Kademlia::CKademlia::Stop(); + } + + wxRenameFile(file + wxT(".download"),file); + + Kademlia::CKademlia::Start(); + theApp->ShowConnectionState(); + + } else { + AddLogLineM(true, _("Failed to download the nodes list.")); + } + break; + } +} + +void CamuleApp::CheckNewVersion(uint32 result) +{ + if (result == 1) { + wxString filename = ConfigDir + wxT("last_version_check"); + wxTextFile file; + + if (!file.Open(filename)) { + AddLogLineM(true, _("Failed to open the downloaded version check file") ); + return; + } else if (!file.GetLineCount()) { + AddLogLineM(true, _("Corrupted version check file")); + } else { + wxString versionLine = file.GetFirstLine(); + wxStringTokenizer tkz(versionLine, wxT(".")); + + AddDebugLogLineM(false, logGeneral, wxString(wxT("Running: ")) + wxT(VERSION) + wxT(", Version check: ") + versionLine); + + long fields[] = {0, 0, 0}; + for (int i = 0; i < 3; ++i) { + if (!tkz.HasMoreTokens()) { + AddLogLineM(true, _("Corrupted version check file")); + return; + } else { + wxString token = tkz.GetNextToken(); + + if (!token.ToLong(&fields[i])) { + AddLogLineM(true, _("Corrupted version check file")); + return; + } + } + } + + long curVer = make_full_ed2k_version(VERSION_MJR, VERSION_MIN, VERSION_UPDATE); + long newVer = make_full_ed2k_version(fields[0], fields[1], fields[2]); + + if (curVer < newVer) { + AddLogLineM(true, _("You are using an outdated version of aMule!")); + AddLogLineM(false, wxString::Format(_("Your aMule version is %i.%i.%i and the latest version is %li.%li.%li"), VERSION_MJR, VERSION_MIN, VERSION_UPDATE, fields[0], fields[1], fields[2])); + AddLogLineM(false, _("The latest version can always be found at http://www.amule.org")); + #ifdef AMULE_DAEMON + printf("%s\n", (const char*)unicode2UTF8(wxString::Format( + _("WARNING: Your aMuled version is outdated: %i.%i.%i < %li.%li.%li"), + VERSION_MJR, VERSION_MIN, VERSION_UPDATE, fields[0], fields[1], fields[2]))); + #endif + } else { + AddLogLineM(false, _("Your copy of aMule is up to date.")); + } + } + + file.Close(); + wxRemoveFile(filename); + } else { + AddLogLineM(true, _("Failed to download the version check file") ); + } + +} + + +bool CamuleApp::IsConnected() +{ + return (IsConnectedED2K() || IsConnectedKad()); +} + + +bool CamuleApp::IsConnectedED2K() +{ + return serverconnect && serverconnect->IsConnected(); +} + + +bool CamuleApp::IsConnectedKad() +{ + return Kademlia::CKademlia::IsConnected(); +} + + +bool CamuleApp::IsFirewalled() +{ + if (theApp->IsConnectedED2K() && !theApp->serverconnect->IsLowID()) { + return false; // we have an eD2K HighID -> not firewalled + } + + return IsFirewalledKad(); // If kad says ok, it's ok. +} + +bool CamuleApp::IsFirewalledKad() +{ + if (Kademlia::CKademlia::IsConnected() && !Kademlia::CKademlia::IsFirewalled()) { + return false; // we have an Kad HighID -> not firewalled + } + + return true; // firewalled +} + +bool CamuleApp::IsKadRunning() +{ + return Kademlia::CKademlia::IsRunning(); +} + +bool CamuleApp::DoCallback( CUpDownClient *client ) +{ + if(Kademlia::CKademlia::IsConnected()) { + if(IsConnectedED2K()) { + if(serverconnect->IsLowID()) { + if(Kademlia::CKademlia::IsFirewalled()) { + //Both Connected - Both Firewalled + return false; + } else { + if(client->GetServerIP() == theApp->serverconnect->GetCurrentServer()->GetIP() && + client->GetServerPort() == theApp->serverconnect->GetCurrentServer()->GetPort()) { + // Both Connected - Server lowID, Kad Open - Client on same server + // We prevent a callback to the server as this breaks the protocol + // and will get you banned. + return false; + } else { + // Both Connected - Server lowID, Kad Open - Client on remote server + return true; + } + } + } else { + //Both Connected - Server HighID, Kad don't care + return true; + } + } else { + if(Kademlia::CKademlia::IsFirewalled()) { + //Only Kad Connected - Kad Firewalled + return false; + } else { + //Only Kad Conected - Kad Open + return true; + } + } + } else { + if( IsConnectedED2K() ) { + if( serverconnect->IsLowID() ) { + //Only Server Connected - Server LowID + return false; + } else { + //Only Server Connected - Server HighID + return true; + } + } else { + //We are not connected at all! + return false; + } + } +} + +void CamuleApp::ShowUserCount() { + uint32 totaluser = 0, totalfile = 0; + + theApp->serverlist->GetUserFileStatus( totaluser, totalfile ); + + wxString buffer = + CFormat(_("Users: E: %s K: %s | Files E: %s K: %s")) % CastItoIShort(totaluser) % + CastItoIShort(Kademlia::CKademlia::GetKademliaUsers()) % CastItoIShort(totalfile) % CastItoIShort(Kademlia::CKademlia::GetKademliaFiles()); + + Notify_ShowUserCount(buffer); +} + + +void CamuleApp::ListenSocketHandler(wxSocketEvent& event) +{ + wxCHECK_RET(listensocket, wxT("Connection-event for NULL'd listen-socket")); + wxCHECK_RET(event.GetSocketEvent() == wxSOCKET_CONNECTION, + wxT("Invalid event received for listen-socket")); + + if (m_app_state == APP_STATE_RUNNING) { + listensocket->OnAccept(0); + } else if (m_app_state == APP_STATE_STARTING) { + // When starting up, connection may be made before we are able + // to handle them. However, if these are ignored, no futher + // connection-events will be triggered, so we have to accept it. + wxSocketBase* socket = listensocket->Accept(false); + + wxCHECK_RET(socket, wxT("NULL returned by Accept() during startup")); + + socket->Destroy(); + } +} + + +void CamuleApp::ShowConnectionState() +{ + static uint8 old_state = (1<<7); // This flag doesn't exist + + uint8 state = 0; + + if (theApp->serverconnect->IsConnected()) { + state |= CONNECTED_ED2K; + } + + if (Kademlia::CKademlia::IsRunning()) { + if (Kademlia::CKademlia::IsConnected()) { + if (!Kademlia::CKademlia::IsFirewalled()) { + state |= CONNECTED_KAD_OK; + } else { + state |= CONNECTED_KAD_FIREWALLED; + } + } else { + state |= CONNECTED_KAD_NOT; + } + } + + Notify_ShowConnState(state); + + if (old_state != state) { + // Get the changed value + int changed_flags = old_state ^ state; + + if (changed_flags & CONNECTED_ED2K) { + // ED2K status changed + wxString connected_server; + CServer* ed2k_server = theApp->serverconnect->GetCurrentServer(); + if (ed2k_server) { + connected_server = ed2k_server->GetListName(); + } + if (state & CONNECTED_ED2K) { + // We connected to some server + const wxString id = theApp->serverconnect->IsLowID() ? _("with LowID") : _("with HighID"); + + AddLogLine(CFormat(_("Connected to %s %s")) % connected_server % id); + } else { + if ( theApp->serverconnect->IsConnecting() ) { + AddLogLine(CFormat(_("Connecting to %s")) % connected_server); + } else { + AddLogLine(_("Disconnected from ED2K")); + } + } + } + + if (changed_flags & CONNECTED_KAD_NOT) { + if (state & CONNECTED_KAD_NOT) { + AddLogLine(_("Kad started.")); + } else { + AddLogLine(_("Kad stopped.")); + } + } + + if (changed_flags & (CONNECTED_KAD_OK | CONNECTED_KAD_FIREWALLED)) { + if (state & (CONNECTED_KAD_OK | CONNECTED_KAD_FIREWALLED)) { + if (state & CONNECTED_KAD_OK) { + AddLogLine(_("Connected to Kad (ok)")); + } else { + AddLogLine(_("Connected to Kad (firewalled)")); + } + } else { + AddLogLine(_("Disconnected from Kad")); + } + } + + old_state = state; + + theApp->downloadqueue->OnConnectionState(IsConnected()); + } + + ShowUserCount(); + Notify_ShowConnState(state); +} + + +void CamuleApp::UDPSocketHandler(wxSocketEvent& event) +{ + CMuleUDPSocket* socket = (CMuleUDPSocket*)(event.GetClientData()); + wxCHECK_RET(socket, wxT("No socket owner specified.")); + + if (IsOnShutDown() || thePrefs::IsUDPDisabled()) return; + + if (!IsRunning()) { + if (event.GetSocketEvent() == wxSOCKET_INPUT) { + // Back to the queue! + theApp->AddPendingEvent(event); + return; + } + } + + switch (event.GetSocketEvent()) { + case wxSOCKET_INPUT: + socket->OnReceive(0); + break; + + case wxSOCKET_OUTPUT: + socket->OnSend(0); + break; + + case wxSOCKET_LOST: + socket->OnDisconnected(0); + break; + + default: + wxASSERT(0); + break; + } +} + + +void CamuleApp::OnUnhandledException() +{ + // Call the generic exception-handler. + fprintf(stderr, "\taMule Version: %s\n", (const char*)unicode2char(GetFullMuleVersion())); + ::OnUnhandledException(); +} + +void CamuleApp::StartKad() +{ + if (!Kademlia::CKademlia::IsRunning() && thePrefs::GetNetworkKademlia()) { + // Kad makes no sense without the Client-UDP socket. + if (!thePrefs::IsUDPDisabled()) { + Kademlia::CKademlia::Start(); + } else { + AddLogLineM(true,_("Kad network cannot be used if UDP port is disabled on preferences, not starting.")); + } + } else if (!thePrefs::GetNetworkKademlia()) { + AddLogLineM(true,_("Kad network disabled on preferences, not connecting.")); + } +} + +void CamuleApp::StopKad() +{ + // Stop Kad if it's running + if (Kademlia::CKademlia::IsRunning()) { + Kademlia::CKademlia::Stop(); + } +} + + +void CamuleApp::BootstrapKad(uint32 ip, uint16 port) +{ + if (!Kademlia::CKademlia::IsRunning()) { + Kademlia::CKademlia::Start(); + theApp->ShowConnectionState(); + } + + Kademlia::CKademlia::Bootstrap(ip, port); +} + + +void CamuleApp::UpdateNotesDat(const wxString& url) +{ + wxString strTempFilename(theApp->ConfigDir + wxT("nodes.dat.download")); + + CHTTPDownloadThread *downloader = new CHTTPDownloadThread(url, strTempFilename, HTTP_NodesDat); + downloader->Create(); + downloader->Run(); +} + + +void CamuleApp::DisconnectED2K() +{ + // Stop Kad if it's running + if (IsConnectedED2K()) { + serverconnect->Disconnect(); + } +} + +bool CamuleApp::CryptoAvailable() const +{ + return clientcredits && clientcredits->CryptoAvailable(); +} + +uint32 CamuleApp::GetED2KID() const { + return serverconnect ? serverconnect->GetClientID() : 0; +} + +uint32 CamuleApp::GetID() const { + uint32 ID; + + if( Kademlia::CKademlia::IsConnected() && !Kademlia::CKademlia::IsFirewalled() ) { + // We trust Kad above ED2K + ID = ENDIAN_NTOHL(Kademlia::CKademlia::GetIPAddress()); + } else if( theApp->serverconnect->IsConnected() ) { + ID = theApp->serverconnect->GetClientID(); + } else if ( Kademlia::CKademlia::IsConnected() && Kademlia::CKademlia::IsFirewalled() ) { + // A firewalled Kad client get's a "1" + ID = 1; + } else { + ID = 0; + } + + return ID; +} + +DEFINE_LOCAL_EVENT_TYPE(wxEVT_CORE_FINISHED_HTTP_DOWNLOAD) +DEFINE_LOCAL_EVENT_TYPE(wxEVT_CORE_SOURCE_DNS_DONE) +DEFINE_LOCAL_EVENT_TYPE(wxEVT_CORE_UDP_DNS_DONE) +DEFINE_LOCAL_EVENT_TYPE(wxEVT_CORE_SERVER_DNS_DONE) +// File_checked_for_headers diff --git a/src/amule.h b/src/amule.h new file mode 100644 index 00000000..2c0c703b --- /dev/null +++ b/src/amule.h @@ -0,0 +1,484 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#ifndef AMULE_H +#define AMULE_H + + +#include // Needed for wxApp +#include // Needed for wxLocale + + +#include "Types.h" // Needed for int32, uint16 and uint64 +#ifndef __WXMSW__ + #include + #include + #include +#endif // __WXMSW__ + + +class CAbstractFile; +class CKnownFile; +class ExternalConn; +class CamuleDlg; +class CPreferences; +class CDownloadQueue; +class CUploadQueue; +class CServerConnect; +class CSharedFileList; +class CServer; +class CFriend; +class CMD4Hash; +class CServerList; +class CListenSocket; +class CClientList; +class CKnownFileList; +class CSearchList; +class CClientCreditsList; +class CFriendList; +class CClientUDPSocket; +class CIPFilter; +class UploadBandwidthThrottler; +#ifdef ENABLE_UPNP +class CUPnPControlPoint; +class CUPnPPortMapping; +#endif +class CStatistics; +class wxSocketEvent; +class wxCommandEvent; +class wxFFileOutputStream; +class CUpDownClient; +class CTimer; +class CTimerEvent; +class wxSingleInstanceChecker; +class CHashingEvent; +class CMuleInternalEvent; +class CCompletionEvent; +class wxExecuteData; +class CLoggingEvent; + + +namespace MuleNotify { + class CMuleGUIEvent; +} + + +using MuleNotify::CMuleGUIEvent; + + +#ifdef AMULE_DAEMON +#define AMULE_APP_BASE wxAppConsole +#else +#define AMULE_APP_BASE wxApp +#endif + +#define CONNECTED_ED2K (1<<0) +#define CONNECTED_KAD_NOT (1<<1) +#define CONNECTED_KAD_OK (1<<2) +#define CONNECTED_KAD_FIREWALLED (1<<3) + + +class CamuleApp : public AMULE_APP_BASE +{ +private: + enum APPState { + APP_STATE_RUNNING = 0, + APP_STATE_SHUTTINGDOWN, + APP_STATE_STARTING + }; + +public: + CamuleApp(); + virtual ~CamuleApp(); + + virtual bool OnInit(); + int OnExit(); + void OnFatalException(); + bool ReinitializeNetwork(wxString *msg); + + // derived classes may override those + virtual int InitGui(bool geometry_enable, wxString &geometry_string); + + // Socket handlers + void ListenSocketHandler(wxSocketEvent& event); + void ServerSocketHandler(wxSocketEvent& event); + void UDPSocketHandler(wxSocketEvent& event); + + virtual void ShowAlert(wxString msg, wxString title, int flags) = 0; + + // Barry - To find out if app is running or shutting/shut down + const bool IsRunning() const { return (m_app_state == APP_STATE_RUNNING); } + const bool IsOnShutDown() const { return (m_app_state == APP_STATE_SHUTTINGDOWN); } + + // Check ED2K and Kademlia state + bool IsFirewalled(); + // Check Kad state + bool IsFirewalledKad(); + // Check if we should callback this client + bool DoCallback( CUpDownClient *client ); + + // Connection to ED2K + bool IsConnectedED2K(); + // Connection to Kad + bool IsConnectedKad(); + // Are we connected to at least one network? + bool IsConnected(); + + // What about Kad? Is it running? + bool IsKadRunning(); + + // URL functions + wxString CreateMagnetLink(const CAbstractFile *f); + wxString CreateED2kLink(const CAbstractFile* f, bool add_source = false, bool use_hostname = false, bool addcryptoptions = false); + wxString CreateED2kAICHLink(const CKnownFile* f); + + // Misc functions + void OnlineSig(bool zero = false); + void Localize_mule(); + void Trigger_New_version(wxString newMule); + + // shakraw - new EC code using wxSocketBase + ExternalConn* ECServerHandler; + + // return current (valid) public IP or 0 if unknown + // If ignorelocal is true, don't use m_localip + uint32 GetPublicIP(bool ignorelocal = false) const; + void SetPublicIP(const uint32 dwIP); + + uint32 GetED2KID() const; + uint32 GetID() const; + + // Other parts of the interface and such + CPreferences* glob_prefs; + CDownloadQueue* downloadqueue; + CUploadQueue* uploadqueue; + CServerConnect* serverconnect; + CSharedFileList* sharedfiles; + CServerList* serverlist; + CListenSocket* listensocket; + CClientList* clientlist; + CKnownFileList* knownfiles; + CSearchList* searchlist; + CClientCreditsList* clientcredits; + CFriendList* friendlist; + CClientUDPSocket* clientudp; + CStatistics* m_statistics; + CIPFilter* ipfilter; + UploadBandwidthThrottler* uploadBandwidthThrottler; +#ifdef ENABLE_UPNP + CUPnPControlPoint* m_upnp; + std::vector m_upnpMappings; +#endif + wxLocale m_locale; + + void ShutDown(); + + wxString GetLog(bool reset = false); + wxString GetServerLog(bool reset = false); + wxString GetDebugLog(bool reset = false); + + bool AddServer(CServer *srv, bool fromUser = false); + void AddServerMessageLine(wxString &msg); +#ifdef __DEBUG__ + void AddSocketDeleteDebug(uint32 socket_pointer, uint32 creation_time); +#endif + void SetOSFiles(const wxString new_path); + + wxString ConfigDir; + + void AddLogLine(const wxString &msg); + + const wxString& GetOSType() const { return OSType; } + + void ShowUserCount(); + + void ShowConnectionState(); + + void StartKad(); + void StopKad(); + + /** Bootstraps kad from the specified IP (must be in hostorder). */ + void BootstrapKad(uint32 ip, uint16 port); + /** Updates the nodes.dat file from the specified url. */ + void UpdateNotesDat(const wxString& str); + + + void DisconnectED2K(); + + bool CryptoAvailable() const; + + //! TODO: Move to CLogger + wxFFileOutputStream* applog; +protected: + // Used to detect a previous running instance of aMule + wxSingleInstanceChecker* m_singleInstance; + +#ifdef __WXDEBUG__ + /** + * Handles asserts in a thread-safe manner. + */ + virtual void OnAssertFailure(const wxChar* file, int line, + const wxChar* func, const wxChar* cond, const wxChar* msg); +#endif + + /** + * This class is used to contain log messages that are to be displayed + * on the GUI, when it is currently impossible to do so. This is in order + * to allows us to queue messages till after the dialog has been created. + */ + struct QueuedLogLine + { + //! The text line to be displayed + wxString line; + //! True if the line should be shown on the status bar, false otherwise. + bool show; + }; + + void OnUDPDnsDone(CMuleInternalEvent& evt); + void OnSourceDnsDone(CMuleInternalEvent& evt); + void OnServerDnsDone(CMuleInternalEvent& evt); + + void OnTCPTimer(CTimerEvent& evt); + void OnCoreTimer(CTimerEvent& evt); + + void OnFinishedHashing(CHashingEvent& evt); + void OnFinishedAICHHashing(CHashingEvent& evt); + void OnFinishedCompletion(CCompletionEvent& evt); + void OnFinishedHTTPDownload(CMuleInternalEvent& evt); + void OnHashingShutdown(CMuleInternalEvent&); + void OnNotifyEvent(CMuleGUIEvent& evt); + + void SetTimeOnTransfer(); + + std::list m_logLines; + + APPState m_app_state; + + wxString m_emulesig_path; + wxString m_amulesig_path; + + char *strFullMuleVersion; + char *strOSDescription; + wxString OSType; + + uint32 m_dwPublicIP; + + long webserver_pid; + + bool enable_stdout_log; + bool enable_daemon_fork; + wxString server_msg; + + CTimer* core_timer; + +private: + virtual void OnUnhandledException(); + + void CheckNewVersion(uint32 result); + + uint32 m_localip; +}; + + +#ifndef AMULE_DAEMON + + +class CamuleGuiBase { +public: + CamuleGuiBase(); + virtual ~CamuleGuiBase(); + + wxString m_FrameTitle; + CamuleDlg* amuledlg; + int m_FileDetailDialogActive; + + bool CopyTextToClipboard( wxString strText ); + + virtual int InitGui(bool geometry_enable, wxString &geometry_string); + virtual void ShowAlert(wxString msg, wxString title, int flags); +}; + + +#ifndef CLIENT_GUI + + +class CamuleGuiApp : public CamuleApp, public CamuleGuiBase +{ + + virtual int InitGui(bool geometry_enable, wxString &geometry_string); + + int OnExit(); + bool OnInit(); + +public: + + virtual void ShowAlert(wxString msg, wxString title, int flags); + + void ShutDown(wxCloseEvent &evt); + void OnLoggingEvent(CLoggingEvent& evt); + + wxString GetLog(bool reset = false); + wxString GetServerLog(bool reset = false); + void AddServerMessageLine(wxString &msg); + DECLARE_EVENT_TABLE() +}; + + +DECLARE_APP(CamuleGuiApp) +#ifdef AMULE_CPP + CamuleGuiApp *theApp; +#else + extern CamuleGuiApp *theApp; +#endif + + +#else /* !CLIENT_GUI */ + + +#include "amule-remote-gui.h" + + +#endif // CLIENT_GUI + + +#define CALL_APP_DATA_LOCK + + +#else /* ! AMULE_DAEMON */ + + +#include +#include + + +class CSocketSet; + + +class CAmuledGSocketFuncTable : public GSocketGUIFunctionsTable +{ +private: + CSocketSet *m_in_set, *m_out_set; + + wxMutex m_lock; +public: + CAmuledGSocketFuncTable(); + + void AddSocket(GSocket *socket, GSocketEvent event); + void RemoveSocket(GSocket *socket, GSocketEvent event); + void RunSelect(); + + virtual bool OnInit(); + virtual void OnExit(); + virtual bool CanUseEventLoop(); + virtual bool Init_Socket(GSocket *socket); + virtual void Destroy_Socket(GSocket *socket); + virtual void Install_Callback(GSocket *socket, GSocketEvent event); + virtual void Uninstall_Callback(GSocket *socket, GSocketEvent event); + virtual void Enable_Events(GSocket *socket); + virtual void Disable_Events(GSocket *socket); +}; + + +typedef std::map EndProcessDataMap; + + +class CDaemonAppTraits : public wxConsoleAppTraits +{ +private: + CAmuledGSocketFuncTable *m_table; + wxMutex m_lock; + std::list m_sched_delete; +#ifndef __WXMSW__ + struct sigaction m_oldSignalChildAction; + struct sigaction m_newSignalChildAction; +#endif + +public: + CDaemonAppTraits(CAmuledGSocketFuncTable *table); + virtual GSocketGUIFunctionsTable* GetSocketGUIFunctionsTable(); + virtual void ScheduleForDestroy(wxObject *object); + virtual void RemoveFromPendingDelete(wxObject *object); + + void DeletePending(); + +#ifndef __WXMSW__ + virtual int WaitForChild(wxExecuteData& execData); +#endif +#ifdef __WXMAC__ + virtual wxStandardPathsBase& GetStandardPaths(); +#endif +}; + + +#ifndef __WXMSW__ + void OnSignalChildHandler(int signal, siginfo_t *siginfo, void *ucontext); + pid_t AmuleWaitPid(pid_t pid, int *status, int options, wxString *msg); +#endif // __WXMSW__ + + +class CamuleDaemonApp : public CamuleApp +{ +private: + bool m_Exit; + CAmuledGSocketFuncTable *m_table; +#ifndef __WXMSW__ + struct sigaction m_oldSignalChildAction; + struct sigaction m_newSignalChildAction; +#endif // __WXMSW__ + + bool OnInit(); + int OnRun(); + int OnExit(); + + virtual int InitGui(bool geometry_enable, wxString &geometry_string); + +public: + CamuleDaemonApp(); + + void ExitMainLoop() { m_Exit = true; } + + bool CopyTextToClipboard(wxString strText); + + virtual void ShowAlert(wxString msg, wxString title, int flags); + + void OnLoggingEvent(CLoggingEvent& evt); + + DECLARE_EVENT_TABLE() + + wxAppTraits *CreateTraits(); +}; + +DECLARE_APP(CamuleDaemonApp) +#ifdef AMULE_CPP + CamuleDaemonApp *theApp; +#else + extern CamuleDaemonApp *theApp; +#endif + +#endif /* ! AMULE_DAEMON */ + +#endif // AMULE_H +// File_checked_for_headers diff --git a/src/amuleDlg.cpp b/src/amuleDlg.cpp new file mode 100644 index 00000000..f5c9279a --- /dev/null +++ b/src/amuleDlg.cpp @@ -0,0 +1,1384 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include + +#include +#include // Do_not_auto_remove (MacOS 10.3, wx 2.7) +#include // Do_not_auto_remove (MacOS 10.3, wx 2.7) +#include +#include // Do_not_auto_remove (win32) +#include +#include +#include // Do_not_auto_remove (win32) +#include +#include +#include +#include // Needed for wxWindowUpdateLocker + +#include + +#ifdef HAVE_CONFIG_H +#include "config.h" // Needed for SVNDATE, PACKAGE, VERSION +#else +#include +#endif // HAVE_CONFIG_H + +#include "amuleDlg.h" // Interface declarations. + +#include // Needed for CFormat +#include "amule.h" // Needed for theApp +#include "ChatWnd.h" // Needed for CChatWnd +#include "ClientListCtrl.h" // Needed for CClientListCtrl +#include "DownloadListCtrl.h" // Needed for CDownloadListCtrl +#include "DownloadQueue.h" // Needed for CDownloadQueue +#include "KadDlg.h" // Needed for CKadDlg +#include "Logger.h" +#include "MuleTrayIcon.h" +#include "muuli_wdr.h" // Needed for ID_BUTTON* +#include "Preferences.h" // Needed for CPreferences +#include "PrefsUnifiedDlg.h" +#include "SearchDlg.h" // Needed for CSearchDlg +#include "Server.h" // Needed for CServer +#include "ServerConnect.h" // Needed for CServerConnect +#include "ServerWnd.h" // Needed for CServerWnd +#include "SharedFilesWnd.h" // Needed for CSharedFilesWnd +#include "Statistics.h" // Needed for theStats +#include "StatisticsDlg.h" // Needed for CStatisticsDlg +#include "TerminationProcess.h" // Needed for CTerminationProcess +#include "TransferWnd.h" // Needed for CTransferWnd +#ifndef CLIENT_GUI +#include "PartFileConvert.h" +#endif + +#ifndef __WXMSW__ +#include "aMule.xpm" +#endif + +#include "kademlia/kademlia/Kademlia.h" + +#ifdef ENABLE_IP2COUNTRY + #include "IP2Country.h" // Needed for IP2Country +#endif + +BEGIN_EVENT_TABLE(CamuleDlg, wxFrame) + + EVT_TOOL(ID_BUTTONNETWORKS, CamuleDlg::OnToolBarButton) + EVT_TOOL(ID_BUTTONSEARCH, CamuleDlg::OnToolBarButton) + EVT_TOOL(ID_BUTTONTRANSFER, CamuleDlg::OnToolBarButton) + EVT_TOOL(ID_BUTTONSHARED, CamuleDlg::OnToolBarButton) + EVT_TOOL(ID_BUTTONMESSAGES, CamuleDlg::OnToolBarButton) + EVT_TOOL(ID_BUTTONSTATISTICS, CamuleDlg::OnToolBarButton) + EVT_TOOL(ID_ABOUT, CamuleDlg::OnAboutButton) + + EVT_TOOL(ID_BUTTONNEWPREFERENCES, CamuleDlg::OnPrefButton) +#ifndef CLIENT_GUI + EVT_TOOL(ID_BUTTONIMPORT, CamuleDlg::OnImportButton) +#endif + + EVT_TOOL(ID_BUTTONCONNECT, CamuleDlg::OnBnConnect) + + EVT_CLOSE(CamuleDlg::OnClose) + EVT_ICONIZE(CamuleDlg::OnMinimize) + + EVT_BUTTON(ID_BUTTON_FAST, CamuleDlg::OnBnClickedFast) + EVT_BUTTON(IDC_SHOWSTATUSTEXT, CamuleDlg::OnBnStatusText) + + EVT_TIMER(ID_GUI_TIMER_EVENT, CamuleDlg::OnGUITimer) + + EVT_SIZE(CamuleDlg::OnMainGUISizeChange) + + EVT_KEY_UP(CamuleDlg::OnKeyPressed) + + EVT_MENU(wxID_EXIT, CamuleDlg::OnExit) + +END_EVENT_TABLE() + +#ifndef wxCLOSE_BOX + #define wxCLOSE_BOX 0 +#endif + +CamuleDlg::CamuleDlg( + wxWindow* pParent, + const wxString &title, + wxPoint where, + wxSize dlg_size) +: +wxFrame( + pParent, -1, title, where, dlg_size, + wxCAPTION|wxRESIZE_BORDER|wxSYSTEM_MENU|wxDIALOG_NO_PARENT| + wxRESIZE_BORDER|wxMINIMIZE_BOX|wxMAXIMIZE_BOX|wxCLOSE_BOX, + wxT("aMule")), +m_activewnd(NULL), +m_transferwnd(NULL), +m_serverwnd(NULL), +m_sharedfileswnd(NULL), +m_searchwnd(NULL), +m_chatwnd(NULL), +m_statisticswnd(NULL), +m_kademliawnd(NULL), +m_prefsDialog(NULL), +m_srv_split_pos(0), +m_imagelist(16,16), +m_tblist(32,32), +m_prefsVisible(false), +m_wndToolbar(NULL), +m_wndTaskbarNotifier(NULL), +m_nActiveDialog(DT_NETWORKS_WND), +m_is_safe_state(false), +m_BlinkMessages(false), +m_CurrentBlinkBitmap(24), +m_last_iconizing(0), +m_skinFileName(), +m_clientSkinNames(CLIENT_SKIN_SIZE) +{ + // Initialize skin names + m_clientSkinNames[Client_Green_Smiley] = wxT("Transfer"); + m_clientSkinNames[Client_Red_Smiley] = wxT("Connecting"); + m_clientSkinNames[Client_Yellow_Smiley] = wxT("OnQueue"); + m_clientSkinNames[Client_Grey_Smiley] = wxT("A4AFNoNeededPartsQueueFull"); + m_clientSkinNames[Client_White_Smiley] = wxT("StatusUnknown"); + m_clientSkinNames[Client_ExtendedProtocol_Smiley] = wxT("ExtendedProtocol"); + m_clientSkinNames[Client_SecIdent_Smiley] = wxT("SecIdent"); + m_clientSkinNames[Client_BadGuy_Smiley] = wxT("BadGuy"); + m_clientSkinNames[Client_CreditsGrey_Smiley] = wxT("CreditsGrey"); + m_clientSkinNames[Client_CreditsYellow_Smiley] = wxT("CreditsYellow"); + m_clientSkinNames[Client_Upload_Smiley] = wxT("Upload"); + m_clientSkinNames[Client_Friend_Smiley] = wxT("Friend"); + m_clientSkinNames[Client_eMule_Smiley] = wxT("eMule"); + m_clientSkinNames[Client_mlDonkey_Smiley] = wxT("mlDonkey"); + m_clientSkinNames[Client_eDonkeyHybrid_Smiley] = wxT("eDonkeyHybrid"); + m_clientSkinNames[Client_aMule_Smiley] = wxT("aMule"); + m_clientSkinNames[Client_lphant_Smiley] = wxT("lphant"); + m_clientSkinNames[Client_Shareaza_Smiley] = wxT("Shareaza"); + m_clientSkinNames[Client_xMule_Smiley] = wxT("xMule"); + m_clientSkinNames[Client_Unknown] = wxT("Unknown"); + m_clientSkinNames[Client_InvalidRating_Smiley] = wxT("InvalidRatingOnFile"); + m_clientSkinNames[Client_PoorRating_Smiley] = wxT("PoorRatingOnFile"); + m_clientSkinNames[Client_GoodRating_Smiley] = wxT("GoodRatingOnFile"); + m_clientSkinNames[Client_FairRating_Smiley] = wxT("FairRatingOnFile"); + m_clientSkinNames[Client_ExcellentRating_Smiley] = wxT("ExcellentRatingOnFile"); + m_clientSkinNames[Client_CommentOnly_Smiley] = wxT("CommentOnly"); + m_clientSkinNames[Client_Encryption_Smiley] = wxT("Encrypted"); + + // wxWidgets send idle events to ALL WINDOWS by default... *SIGH* + wxIdleEvent::SetMode(wxIDLE_PROCESS_SPECIFIED); + wxUpdateUIEvent::SetMode(wxUPDATE_UI_PROCESS_SPECIFIED); + wxInitAllImageHandlers(); + Apply_Clients_Skin(); + + bool override_where = where != wxDefaultPosition; + bool override_size = + dlg_size.x != DEFAULT_SIZE_X || + dlg_size.y != DEFAULT_SIZE_Y; + if (!LoadGUIPrefs(override_where, override_size)) { + // Prefs not loaded for some reason, exit + AddLogLineM( true, wxT("Error! Unable to load Preferences") ); + return; + } + + SetIcon(wxICON(aMule)); + + srand(time(NULL)); + + // Create new sizer and stuff a wxPanel in there. + wxFlexGridSizer *s_main = new wxFlexGridSizer(1); + s_main->AddGrowableCol(0); + s_main->AddGrowableRow(0); + + wxPanel* p_cnt = new wxPanel(this, -1, wxDefaultPosition, wxDefaultSize); + s_main->Add(p_cnt, 0, wxGROW|wxEXPAND, 0); + muleDlg(p_cnt, false, true); + SetSizer(s_main, true); + + m_serverwnd = new CServerWnd(p_cnt, m_srv_split_pos); + AddLogLineM(false, wxEmptyString); + AddLogLineM(false, wxT(" - ") + + CFormat(_("This is aMule %s based on eMule.")) % GetMuleVersion()); + AddLogLineM(false, wxT(" ") + + CFormat(_("Running on %s")) % wxGetOsDescription()); + AddLogLineM(false, wxT(" - ") + + wxString(_("Visit http://www.amule.org to check if a new version is available."))); + AddLogLineM(false, wxEmptyString); + +#ifdef ENABLE_IP2COUNTRY + m_IP2Country = new CIP2Country(); +#endif + m_searchwnd = new CSearchDlg(p_cnt); + m_transferwnd = new CTransferWnd(p_cnt); + m_sharedfileswnd = new CSharedFilesWnd(p_cnt); + m_statisticswnd = new CStatisticsDlg(p_cnt, theApp->m_statistics); + m_chatwnd = new CChatWnd(p_cnt); + m_kademliawnd = CastChild(wxT("kadWnd"), CKadDlg); + + m_serverwnd->Show(false); + m_searchwnd->Show(false); + m_transferwnd->Show(false); + m_sharedfileswnd->Show(false); + m_statisticswnd->Show(false); + m_chatwnd->Show(false); + + // Create the GUI timer + gui_timer=new wxTimer(this,ID_GUI_TIMER_EVENT); + if (!gui_timer) { + AddLogLine(false, _("Fatal Error: Failed to create Timer")); + exit(1); + } + + // Set Serverlist as active window + Create_Toolbar(thePrefs::VerticalToolbar()); + SetActiveDialog(DT_NETWORKS_WND, m_serverwnd); + m_wndToolbar->ToggleTool(ID_BUTTONNETWORKS, true ); + + m_is_safe_state = true; + + // Init statistics stuff, better do it asap + m_statisticswnd->Init(); + m_kademliawnd->Init(); + m_searchwnd->UpdateCatChoice(); + if (thePrefs::UseTrayIcon()) { + CreateSystray(); + } + + Show(true); + // Must we start minimized? + if (thePrefs::GetStartMinimized()) { + if (thePrefs::UseTrayIcon() && thePrefs::DoMinToTray()) { + Hide_aMule(); + } else { + Iconize(true); + } + } + + // Set shortcut keys + wxAcceleratorEntry entries[] = { + wxAcceleratorEntry(wxACCEL_CTRL, wxT('Q'), wxID_EXIT) + }; + + SetAcceleratorTable(wxAcceleratorTable(itemsof(entries), entries)); + ShowED2KLinksHandler( thePrefs::GetFED2KLH() ); +} + + +// Madcat - Sets Fast ED2K Links Handler on/off. +void CamuleDlg::ShowED2KLinksHandler( bool show ) +{ + // Errorchecking in case the pointer becomes invalid ... + if (s_fed2klh == NULL) { + wxLogWarning(wxT("Unable to find Fast ED2K Links handler sizer! Hiding FED2KLH aborted.")); + return; + } + + s_dlgcnt->Show( s_fed2klh, show ); + s_dlgcnt->Layout(); +} + +// Toogles ed2k link handler. +void CamuleDlg::ToogleED2KLinksHandler() +{ + // Errorchecking in case the pointer becomes invalid ... + if (s_fed2klh == NULL) { + wxLogWarning(wxT("Unable to find Fast ED2K Links handler sizer! Toogling FED2KLH aborted.")); + return; + } + ShowED2KLinksHandler(!s_dlgcnt->IsShown(s_fed2klh)); +} + +void CamuleDlg::SetActiveDialog(DialogType type, wxWindow* dlg) +{ + m_nActiveDialog = type; + + if ( type == DT_TRANSFER_WND ) { + if (thePrefs::ShowCatTabInfos()) { + m_transferwnd->UpdateCatTabTitles(); + } + } + + if ( m_activewnd ) { + m_activewnd->Show(false); + contentSizer->Detach(m_activewnd); + } + + contentSizer->Add(dlg, 1, wxALIGN_LEFT|wxEXPAND); + dlg->Show(true); + m_activewnd=dlg; + s_dlgcnt->Layout(); + + // Since we might be suspending redrawing while hiding the dialog + // we have to refresh it once it is visible again + dlg->Refresh( true ); + dlg->SetFocus(); +} + + +void CamuleDlg::UpdateTrayIcon(int percent) +{ + // set trayicon-icon + if(!theApp->IsConnected()) { + m_wndTaskbarNotifier->SetTrayIcon(TRAY_ICON_DISCONNECTED, percent); + } else { + if(theApp->IsConnectedED2K() && theApp->serverconnect->IsLowID()) { + m_wndTaskbarNotifier->SetTrayIcon(TRAY_ICON_LOWID, percent); + } else { + m_wndTaskbarNotifier->SetTrayIcon(TRAY_ICON_HIGHID, percent); + } + } +} + + +void CamuleDlg::CreateSystray() +{ + wxCHECK_RET(m_wndTaskbarNotifier == NULL, + wxT("Systray already created")); + + m_wndTaskbarNotifier = new CMuleTrayIcon(); + // This will effectively show the Tray Icon. + UpdateTrayIcon(0); +} + + +void CamuleDlg::RemoveSystray() +{ + delete m_wndTaskbarNotifier; + m_wndTaskbarNotifier = NULL; +} + + +void CamuleDlg::OnToolBarButton(wxCommandEvent& ev) +{ + static int lastbutton = ID_BUTTONNETWORKS; + + // Kry - just if the GUI is ready for it + if ( m_is_safe_state ) { + + // Rehide the handler if needed + if ( lastbutton == ID_BUTTONSEARCH && !thePrefs::GetFED2KLH() ) { + if (ev.GetId() != ID_BUTTONSEARCH) { + ShowED2KLinksHandler( false ); + } else { + // Toogle ED2K handler. + ToogleED2KLinksHandler(); + } + } + + if ( lastbutton != ev.GetId() ) { + switch ( ev.GetId() ) { + case ID_BUTTONNETWORKS: + SetActiveDialog(DT_NETWORKS_WND, m_serverwnd); + // Set serverlist splitter position + CastChild( wxT("SrvSplitterWnd"), wxSplitterWindow )->SetSashPosition(m_srv_split_pos, true); + break; + + case ID_BUTTONSEARCH: + // The search dialog should always display the handler + if ( !thePrefs::GetFED2KLH() ) + ShowED2KLinksHandler( true ); + + SetActiveDialog(DT_SEARCH_WND, m_searchwnd); + break; + + case ID_BUTTONTRANSFER: + SetActiveDialog(DT_TRANSFER_WND, m_transferwnd); + // Prepare the dialog, sets the splitter-position + m_transferwnd->Prepare(); + break; + + case ID_BUTTONSHARED: + SetActiveDialog(DT_SHARED_WND, m_sharedfileswnd); + break; + + case ID_BUTTONMESSAGES: + m_BlinkMessages = false; + SetActiveDialog(DT_CHAT_WND, m_chatwnd); + break; + + case ID_BUTTONSTATISTICS: + SetActiveDialog(DT_STATS_WND, m_statisticswnd); + break; + + // This shouldn't happen, but just in case + default: + AddLogLineM( true, wxT("Unknown button triggered CamuleApp::OnToolBarButton().") ); + break; + } + } + + m_wndToolbar->ToggleTool(lastbutton, lastbutton == ev.GetId() ); + lastbutton = ev.GetId(); + } +} + + +void CamuleDlg::OnAboutButton(wxCommandEvent& WXUNUSED(ev)) +{ + wxString msg = wxT(" "); +#ifdef CLIENT_GUI + msg << _("aMule remote control ") << wxT(VERSION); +#else + msg << wxT("aMule ") << wxT(VERSION); +#endif + msg << wxT(" "); +#ifdef SVNDATE + msg << _("Snapshot:") << wxT("\n ") << wxT(SVNDATE); +#endif + msg << wxT("\n\n") << _(" 'All-Platform' p2p client based on eMule \n\n") << + _(" Website: http://www.amule.org \n") << + _(" Forum: http://forum.amule.org \n") << + _(" FAQ: http://wiki.amule.org \n\n") << + _(" Contact: admin@amule.org (administrative issues) \n") << + _(" Copyright (C) 2003-2008 aMule Team \n\n") << + _(" Part of aMule is based on \n") << + _("Kademlia: Peer-to-peer routing based on the XOR metric.\n") << + _(" Copyright (C) 2002 Petar Maymounkov\n") << + _(" http://kademlia.scs.cs.nyu.edu\n"); + + if (m_is_safe_state) { + wxMessageBox(msg, _("Message"), wxOK | wxICON_INFORMATION, this); + } +} + + +void CamuleDlg::OnPrefButton(wxCommandEvent& WXUNUSED(ev)) +{ + if (m_is_safe_state) { + if (m_prefsDialog == NULL) { + m_prefsDialog = new PrefsUnifiedDlg(this); + } + + m_prefsDialog->TransferToWindow(); + m_prefsDialog->Show(true); + m_prefsDialog->Raise(); + } +} + + +#ifndef CLIENT_GUI +void CamuleDlg::OnImportButton(wxCommandEvent& WXUNUSED(ev)) +{ + if ( m_is_safe_state ) { + CPartFileConvert::ShowGUI(NULL); + } +} +#endif + +CamuleDlg::~CamuleDlg() +{ + printf("Shutting down aMule...\n"); + + SaveGUIPrefs(); + + theApp->amuledlg = NULL; + + printf("aMule dialog destroyed\n"); +} + + +void CamuleDlg::OnBnConnect(wxCommandEvent& WXUNUSED(evt)) +{ + + bool disconnect = (theApp->IsConnectedED2K() || theApp->serverconnect->IsConnecting()) + #ifndef CLIENT_GUI + || (Kademlia::CKademlia::IsRunning()) + #endif + ; + if (thePrefs::GetNetworkED2K()) { + if (disconnect) { + //disconnect if currently connected + if (theApp->serverconnect->IsConnecting()) { + theApp->serverconnect->StopConnectionTry(); + } else { + theApp->serverconnect->Disconnect(); + } + } else { + //connect if not currently connected + AddLogLine(true, _("Connecting")); + theApp->serverconnect->ConnectToAnyServer(); + } + } else { + wxASSERT(!theApp->IsConnectedED2K()); + } + + // Connect Kad also + if (thePrefs::GetNetworkKademlia()) { + if( disconnect ) { + theApp->StopKad(); + } else { + theApp->StartKad(); + } + } else { + #ifndef CLIENT_GUI + wxASSERT(!Kademlia::CKademlia::IsRunning()); + #endif + } + + ShowConnectionState(); +} + + +void CamuleDlg::OnBnStatusText(wxCommandEvent& WXUNUSED(evt)) +{ + wxString line = CastChild(wxT("infoLabel"), wxStaticText)->GetLabel(); + + if (!line.IsEmpty()) { + wxMessageBox(line, wxString(_("Status text")), wxOK|wxICON_INFORMATION, this); + } +} + + +void CamuleDlg::ResetLog(int id) +{ + wxTextCtrl* ct = CastByID(id, m_serverwnd, wxTextCtrl); + wxCHECK_RET(ct, wxT("Resetting unknown log")); + + ct->Clear(); + + if (id == ID_LOGVIEW) { + // Also clear the log line + wxStaticText* text = CastChild(wxT("infoLabel"), wxStaticText); + text->SetLabel(wxEmptyString); + text->GetParent()->Layout(); + } +} + + +void CamuleDlg::AddLogLine(bool addtostatusbar, const wxString& line) +{ + // Remove newspace at end, it causes problems with the layout... + wxString bufferline = line.Strip(wxString::trailing); + + // Create the timestamp + wxString stamp = wxDateTime::Now().FormatISODate() + wxT(" ") + wxDateTime::Now().FormatISOTime() + wxT(": "); + + // Add the message to the log-view + wxTextCtrl* ct = CastByID( ID_LOGVIEW, m_serverwnd, wxTextCtrl ); + if ( ct ) { + if ( bufferline.IsEmpty() ) { + // If it's empty we just write a blank line with no timestamp. + ct->AppendText( wxT("\n") ); + } else { + // Bold critical log-lines + wxTextAttr style = ct->GetDefaultStyle(); + wxFont font = style.GetFont(); + font.SetWeight(addtostatusbar ? wxFONTWEIGHT_BOLD : wxFONTWEIGHT_NORMAL); + style.SetFont(font); + ct->SetDefaultStyle(style); + + // Split multi-line messages into individual lines + wxStringTokenizer tokens( bufferline, wxT("\n") ); + while ( tokens.HasMoreTokens() ) { + ct->AppendText( stamp + tokens.GetNextToken() + wxT("\n") ); + } + } + + ct->ShowPosition( ct->GetLastPosition() - 1 ); + } + + + // Set the status-bar if the event warrents it + if ( addtostatusbar ) { + // Escape "&"s, which would otherwise not show up + bufferline.Replace( wxT("&"), wxT("&&") ); + wxStaticText* text = CastChild( wxT("infoLabel"), wxStaticText ); + // Only show the first line if multiple lines + text->SetLabel( bufferline.BeforeFirst( wxT('\n') ) ); + text->GetParent()->Layout(); + } + +} + + +void CamuleDlg::AddServerMessageLine(wxString& message) +{ + wxTextCtrl* cv= CastByID( ID_SERVERINFO, m_serverwnd, wxTextCtrl ); + if(cv) { + if (message.Length() > 500) { + cv->AppendText(message.Left(500) + wxT("\n")); + } else { + cv->AppendText(message + wxT("\n")); + } + cv->ShowPosition(cv->GetLastPosition()-1); + } +} + + +void CamuleDlg::ShowConnectionState() +{ + static wxImageList status_arrows(16,16,true,0); + if (!status_arrows.GetImageCount()) { + // Generate the image list (This is only done once) + for (int t = 0; t < 7; ++t) { + status_arrows.Add(connImages(t)); + } + } + + m_serverwnd->UpdateED2KInfo(); + m_serverwnd->UpdateKadInfo(); + + + //////////////////////////////////////////////////////////// + // Determine the status of the networks + // + enum ED2KState { ED2KOff = 0, ED2KLowID = 1, ED2KConnecting = 2, ED2KHighID = 3 }; + enum EKadState { EKadOff = 4, EKadFW = 5, EKadConnecting = 5, EKadOK = 6 }; + + ED2KState ed2kState = ED2KOff; + EKadState kadState = EKadOff; + + //////////////////////////////////////////////////////////// + // Update the label on the status-bar and determine + // the states of the two networks. + // + wxString msgED2K; + if (theApp->IsConnectedED2K()) { + CServer* server = theApp->serverconnect->GetCurrentServer(); + if (server) { + msgED2K = CFormat(wxT("ED2K: %s")) % server->GetListName(); + } + + if (theApp->serverconnect->IsLowID()) { + ed2kState = ED2KLowID; + } else { + ed2kState = ED2KHighID; + } + } else if (theApp->serverconnect->IsConnecting()) { + msgED2K = _("ED2K: Connecting"); + + ed2kState = ED2KConnecting; + } else if (thePrefs::GetNetworkED2K()) { + msgED2K = _("ED2K: Disconnected"); + } + + wxString msgKad; + if (theApp->IsConnectedKad()) { + if (theApp->IsFirewalledKad()) { + msgKad = _("Kad: Firewalled"); + + kadState = EKadFW; + } else { + msgKad = _("Kad: Connected"); + + kadState = EKadOK; + } + } else if (theApp->IsKadRunning()) { + msgKad = _("Kad: Connecting"); + + kadState = EKadConnecting; + } else if (thePrefs::GetNetworkKademlia()) { + msgKad = _("Kad: Off"); + } + + wxStaticText* connLabel = CastChild( wxT("connLabel"), wxStaticText ); + wxCHECK_RET(connLabel, wxT("'connLabel' widget not found")); + + wxString labelMsg; + if (msgED2K.Length() && msgKad.Length()) { + labelMsg = msgED2K + wxT(" | ") + msgKad; + } else { + labelMsg = msgED2K + msgKad; + } + + connLabel->SetLabel(labelMsg); + connLabel->GetParent()->Layout(); + + + //////////////////////////////////////////////////////////// + // Update the connect/disconnect/cancel button. + // + const bool isConnected = theApp->IsConnected(); + const bool isConnecting = theApp->serverconnect->IsConnecting() || + (theApp->IsKadRunning() && + !theApp->IsConnectedKad()); + + m_wndToolbar->Freeze(); + wxToolBarToolBase* toolbarTool = m_wndToolbar->RemoveTool(ID_BUTTONCONNECT); + if (isConnecting) { + toolbarTool->SetLabel(_("Cancel")); + toolbarTool->SetShortHelp(_("Stop the current connection attempts")); + toolbarTool->SetNormalBitmap(m_tblist.GetBitmap(2)); + } else if (isConnected) { + toolbarTool->SetLabel(_("Disconnect")); + toolbarTool->SetShortHelp(_("Disconnect from the currently connected networks")); + toolbarTool->SetNormalBitmap(m_tblist.GetBitmap(1)); + } else { + toolbarTool->SetLabel(_("Connect")); + toolbarTool->SetShortHelp(_("Connect to the currently enabled networks")); + toolbarTool->SetNormalBitmap(m_tblist.GetBitmap(0)); + } + m_wndToolbar->InsertTool(0, toolbarTool); + m_wndToolbar->Realize(); + m_wndToolbar->Thaw(); + + + //////////////////////////////////////////////////////////// + // Update the globe-icon in the lower-right corner. + // + wxStaticBitmap* connBitmap = CastChild( wxT("connImage"), wxStaticBitmap ); + wxCHECK_RET(connBitmap, wxT("'connImage' widget not found")); + + wxBitmap statusIcon = connBitmap->GetBitmap(); + wxMemoryDC bitmapDC(statusIcon); + + status_arrows.Draw(kadState, bitmapDC, 0, 0, wxIMAGELIST_DRAW_TRANSPARENT); + status_arrows.Draw(ed2kState, bitmapDC, 0, 0, wxIMAGELIST_DRAW_TRANSPARENT); + + connBitmap->SetBitmap(statusIcon); +} + + +void CamuleDlg::ShowUserCount(const wxString& info) +{ + wxStaticText* label = CastChild( wxT("userLabel"), wxStaticText ); + + // Update Kad tab + m_serverwnd->UpdateKadInfo(); + + label->SetLabel(info); + label->GetParent()->Layout(); +} + + +void CamuleDlg::ShowTransferRate() +{ + float kBpsUp = theStats::GetUploadRate() / 1024.0; + float kBpsDown = theStats::GetDownloadRate() / 1024.0; + wxString buffer; + if( thePrefs::ShowOverhead() ) + { + buffer = wxString::Format(_("Up: %.1f(%.1f) | Down: %.1f(%.1f)"), kBpsUp, theStats::GetUpOverheadRate() / 1024.0, kBpsDown, theStats::GetDownOverheadRate() / 1024.0); + } else { + buffer = wxString::Format(_("Up: %.1f | Down: %.1f"), kBpsUp, kBpsDown); + } + buffer.Truncate(50); // Max size 50 + + wxStaticText* label = CastChild( wxT("speedLabel"), wxStaticText ); + label->SetLabel(buffer); + label->GetParent()->Layout(); + + // Show upload/download speed in title + if (thePrefs::GetShowRatesOnTitle()) { + wxString UpDownSpeed = wxString::Format(wxT(" -- Up: %.1f | Down: %.1f"), kBpsUp, kBpsDown); + SetTitle(theApp->m_FrameTitle + UpDownSpeed); + } + + wxASSERT((bool)m_wndTaskbarNotifier == thePrefs::UseTrayIcon()); + if (m_wndTaskbarNotifier) { + // set trayicon-icon + int percentDown = (int)ceil((kBpsDown*100) / thePrefs::GetMaxGraphDownloadRate()); + UpdateTrayIcon( ( percentDown > 100 ) ? 100 : percentDown); + + wxString buffer2; + if ( theApp->IsConnected() ) { + buffer2 = CFormat(_("aMule (%s | Connected)")) % buffer; + } else { + buffer2 = CFormat(_("aMule (%s | Disconnected)")) % buffer; + } + m_wndTaskbarNotifier->SetTrayToolTip(buffer2); + } + + wxStaticBitmap* bmp = CastChild( wxT("transferImg"), wxStaticBitmap ); + bmp->SetBitmap(dlStatusImages((kBpsUp>0.01 ? 2 : 0) + (kBpsDown>0.01 ? 1 : 0))); +} + +void CamuleDlg::DlgShutDown() +{ + // Are we already shutting down or still on init? + if ( m_is_safe_state == false ) { + return; + } + + // we are going DOWN + m_is_safe_state = false; + + // Stop the GUI Timer + delete gui_timer; + m_transferwnd->downloadlistctrl->DeleteAllItems(); + + // We want to delete the systray too! + RemoveSystray(); +} + +void CamuleDlg::OnClose(wxCloseEvent& evt) +{ + // This will be here till the core close is != app close + if (evt.CanVeto() && thePrefs::IsConfirmExitEnabled() ) { + if (wxNO == wxMessageBox(wxString(_("Do you really want to exit aMule?")), + wxString(_("Exit confirmation")), wxYES_NO, this)) { + evt.Veto(); + return; + } + } + + theApp->ShutDown(evt); +} + + +void CamuleDlg::OnBnClickedFast(wxCommandEvent& WXUNUSED(evt)) +{ + wxTextCtrl* ctl = CastChild( wxT("FastEd2kLinks"), wxTextCtrl ); + + for ( int i = 0; i < ctl->GetNumberOfLines(); i++ ) { + wxString strlink = ctl->GetLineText(i); + strlink.Trim(true); + strlink.Trim(false); + if ( !strlink.IsEmpty() ) { + theApp->downloadqueue->AddLink( strlink, m_transferwnd->downloadlistctrl->GetCategory() ); + } + } + + ctl->SetValue(wxEmptyString); +} + + +// Formerly known as LoadRazorPrefs() +bool CamuleDlg::LoadGUIPrefs(bool override_pos, bool override_size) +{ + // Create a config base for loading razor preferences + wxConfigBase *config = wxConfigBase::Get(); + // If config haven't been created exit without loading + if (config == NULL) { + return false; + } + + // The section where to save in in file + wxString section = wxT("/Razor_Preferences/"); + + // Get window size and position + int x1 = config->Read(section + wxT("MAIN_X_POS"), -1l); + int y1 = config->Read(section + wxT("MAIN_Y_POS"), -1l); + int x2 = config->Read(section + wxT("MAIN_X_SIZE"), 0l); + int y2 = config->Read(section + wxT("MAIN_Y_SIZE"), 0l); + + // Kry - Random usable pos for m_srv_split_pos + m_srv_split_pos = config->Read(section + wxT("SRV_SPLITTER_POS"), 463l); + if (!override_size) { + if (x2 > 0 && y2 > 0) { + SetSize(x2, y2); + } else { +#ifndef __WXGTK__ + // Probably first run. Only works for gtk2 + Maximize(); +#endif + } + } + + if (!override_pos) { + // If x1 and y1 != 0 Redefine location + if(x1 != -1 && y1 != -1) { + Move(x1, y1); + } + } + + return true; +} + + +bool CamuleDlg::SaveGUIPrefs() +{ + /* Razor 1a - Modif by MikaelB + Save client size and position */ + + // Create a config base for saving razor preferences + wxConfigBase *config = wxConfigBase::Get(); + // If config haven't been created exit without saving + if (config == NULL) { + return false; + } + // The section where to save in in file + wxString section = wxT("/Razor_Preferences/"); + + // Main window location and size + int x1, y1, x2, y2; + GetPosition(&x1, &y1); + GetSize(&x2, &y2); + + // Saving window size and position + config->Write(section+wxT("MAIN_X_POS"), (long) x1); + config->Write(section+wxT("MAIN_Y_POS"), (long) y1); + config->Write(section+wxT("MAIN_X_SIZE"), (long) x2); + config->Write(section+wxT("MAIN_Y_SIZE"), (long) y2); + + // Saving sash position of splitter in server window + config->Write(section+wxT("SRV_SPLITTER_POS"), (long) m_srv_split_pos); + + config->Flush(true); + + /* End modif */ + + return true; +} + + +void CamuleDlg::Hide_aMule(bool iconize) +{ + if (IsShown() && ((m_last_iconizing + 2000) < GetTickCount())) { // 1 secs for sanity + m_last_iconizing = GetTickCount(); + + if (m_prefsDialog && m_prefsDialog->IsShown()) { + m_prefsVisible = true; + m_prefsDialog->Iconize(true);; + m_prefsDialog->Show(false); + } else { + m_prefsVisible = false; + } + + if (iconize) { + Iconize(true); + } + + Show(false); + } + +} + + +void CamuleDlg::Show_aMule(bool uniconize) +{ + if (!IsShown() && ((m_last_iconizing + 1000) < GetTickCount())) { // 1 secs for sanity + m_last_iconizing = GetTickCount(); + + if (m_prefsDialog && m_prefsVisible) { + m_prefsDialog->Show(true); + m_prefsDialog->Raise(); + } + + if (uniconize) { + Show(true); + Raise(); + } + } +} + + +void CamuleDlg::OnMinimize(wxIconizeEvent& evt) +{ + if (m_wndTaskbarNotifier && thePrefs::DoMinToTray()) { + if (evt.Iconized()) { + Hide_aMule(false); + } else { + if (SafeState()) { + Show_aMule(true); + } else { + Show_aMule(false); + } + } + } +} + + +void CamuleDlg::OnGUITimer(wxTimerEvent& WXUNUSED(evt)) +{ + // Former TimerProc section + + static uint32 msPrev1, msPrev5, msPrevStats; + + uint32 msCur = theStats::GetUptimeMillis(); + + // can this actually happen under wxwin ? + if (!SafeState()) { + return; + } + + bool bStatsVisible = (!IsIconized() && StatisticsWindowActive()); + +#ifndef CLIENT_GUI + static uint32 msPrevGraph; + int msGraphUpdate = thePrefs::GetTrafficOMeterInterval() * 1000; + if ((msGraphUpdate > 0) && ((msCur / msGraphUpdate) > (msPrevGraph / msGraphUpdate))) { + // trying to get the graph shifts evenly spaced after a change in the update period + msPrevGraph = msCur; + + GraphUpdateInfo update = theApp->m_statistics->GetPointsForUpdate(); + + m_statisticswnd->UpdateStatGraphs(bStatsVisible, theStats::GetPeakConnections(), update); + m_kademliawnd->UpdateGraph(!IsIconized() && (m_activewnd == m_serverwnd), update); + } +#else + //#warning TODO: CORE/GUI -- EC needed +#endif + + int sStatsUpdate = thePrefs::GetStatsInterval(); + if ((sStatsUpdate > 0) && ((int)(msCur - msPrevStats) > sStatsUpdate*1000)) { + if (bStatsVisible) { + msPrevStats = msCur; + m_statisticswnd->ShowStatistics(); + } + } + + if (msCur-msPrev5 > 5000) { // every 5 seconds + msPrev5 = msCur; + ShowTransferRate(); + if (thePrefs::ShowCatTabInfos() && theApp->amuledlg->m_activewnd == theApp->amuledlg->m_transferwnd) { + m_transferwnd->UpdateCatTabTitles(); + } + if (thePrefs::AutoSortDownload()) { + m_transferwnd->downloadlistctrl->SortList(); + } + } + + if (msCur-msPrev1 > 1000) { // every second + msPrev1 = msCur; + if (m_CurrentBlinkBitmap == 12) { + m_CurrentBlinkBitmap = 7; + SetMessagesTool(); + } else { + if (m_BlinkMessages) { + m_CurrentBlinkBitmap = 12; + SetMessagesTool(); + } + } + + } +} + + +void CamuleDlg::SetMessagesTool() +{ + int pos = m_wndToolbar->GetToolPos(ID_BUTTONMESSAGES); + wxASSERT(pos == 6); // so we don't miss a change on wx2.4 + + wxWindowUpdateLocker freezer(m_wndToolbar); + wxToolBarToolBase* item = m_wndToolbar->RemoveTool(ID_BUTTONMESSAGES); + item->SetNormalBitmap(m_tblist.GetBitmap(m_CurrentBlinkBitmap)); + + m_wndToolbar->InsertTool(pos, item); + m_wndToolbar->Realize(); +} + + +/* + Try to launch the specified url: + - Windows: Default or custom browser will be used. + - Mac: Currently not implemented + - Anything else: Try a number of hardcoded browsers. Should be made configurable... +*/ +void CamuleDlg::LaunchUrl( const wxString& url ) +{ + wxString cmd; + + cmd = thePrefs::GetBrowser(); + if ( !cmd.IsEmpty() ) { + wxString tmp = url; + // Pipes cause problems, so escape them + tmp.Replace( wxT("|"), wxT("%7C") ); + + if (!cmd.Replace(wxT("%s"), tmp)) { + // No %s found, just append the url + cmd += wxT(" ") + tmp; + } + + CTerminationProcess *p = new CTerminationProcess(cmd); + if (wxExecute(cmd, wxEXEC_ASYNC, p)) { + printf( "Launch Command: %s\n", (const char *)unicode2char(cmd)); + return; + } else { + delete p; + } +#ifdef __WXMSW__ + } else { + wxFileType* ft = + wxTheMimeTypesManager->GetFileTypeFromExtension(wxT("html")); + if (!ft) { + wxLogError(wxT("Impossible to determine the file type for extension html. Please edit your MIME types.")); + return; + } + + bool ok = ft->GetOpenCommand( + &cmd, wxFileType::MessageParameters(url, wxT(""))); + delete ft; + + if (!ok) { + wxMessageBox( + _("Could not determine the command for running the browser."), + wxT("Browsing problem"), wxOK|wxICON_EXCLAMATION, this); + return; + } + + wxPuts(wxT("Launch Command: ") + cmd); + CTerminationProcess *p = new CTerminationProcess(cmd); + if (wxExecute(cmd, wxEXEC_ASYNC, p)) { + return; + } else { + delete p; + } +#endif // __WXMSW__ + } + // Unable to execute browser. But this error message doesn't make sense, + // cosidering that you _can't_ set the browser executable path... =/ + wxLogError(wxT("Unable to launch browser. Please set correct browser executable path in Preferences.")); +} + + +wxString CamuleDlg::GenWebSearchUrl(const wxString &filename, WebSearch wsProvider ) +{ + wxString URL; + switch (wsProvider) { + case WS_FILEHASH: + URL = wxT("http://www.filehash.com/search.html?pattern=FILENAME&submit=Find"); + break; + default: + wxASSERT(0); + } + URL.Replace(wxT("FILENAME"), filename); + + return URL; +} + + +bool CamuleDlg::Check_and_Init_Skin() +{ + bool ret = true; + wxString skinFileName(thePrefs::GetSkin()); + + wxString userDir(JoinPaths(GetConfigDir(), wxT("skins")) + wxFileName::GetPathSeparator()); + + wxStandardPathsBase &spb(wxStandardPaths::Get()); +#ifdef __WXMSW__ + wxString dataDir(spb.GetPluginsDir()); +#elif defined(__WXMAC__) + wxString dataDir(spb.GetDataDir()); +#else + wxString dataDir(spb.GetDataDir().BeforeLast(wxT('/')) + wxT("/amule")); +#endif + wxString systemDir(JoinPaths(dataDir,wxT("skins")) + wxFileName::GetPathSeparator()); + + + skinFileName.Replace(wxT("User:"), userDir ); + skinFileName.Replace(wxT("System:"), systemDir ); + + m_skinFileName.Assign(skinFileName); + if (!m_skinFileName.FileExists()) { + AddLogLineM(true, CFormat( + _("Skin directory '%s' does not exist")) % + skinFileName ); + ret = false; + } else if (!m_skinFileName.IsFileReadable()) { + AddLogLineM(true, CFormat( + _("Warning: Unable to open skin file '%s' for read")) % + skinFileName); + ret = false; + } + + wxFFileInputStream in(m_skinFileName.GetFullPath()); + wxZipInputStream zip(in); + + while ((entry = zip.GetNextEntry()) != NULL) { + wxZipEntry*& current = cat[entry->GetInternalName()]; + delete current; + current = entry; + } + + return ret; +} + + +void CamuleDlg::Add_Skin_Icon( + const wxString &iconName, + const wxBitmap &stdIcon, + bool useSkins) +{ + wxImage new_image; + if (useSkins) { + wxFFileInputStream in(m_skinFileName.GetFullPath()); + wxZipInputStream zip(in); + + it = cat.find(wxZipEntry::GetInternalName(iconName + wxT(".png"))); + if ( it != cat.end() ) { + zip.OpenEntry(*it->second); + if ( !new_image.LoadFile(zip,wxBITMAP_TYPE_PNG) ) { + AddLogLineM(false, + wxT("Warning: Error loading icon for ") + + iconName); + useSkins = false; + } + }else { + AddLogLineM(false, + wxT("Warning: Can't load icon for ") + + iconName); + useSkins = false; + } + + } + + wxBitmap bmp(useSkins ? new_image : stdIcon); + if (iconName.StartsWith(wxT("Client_"))) { + m_imagelist.Add(bmp); + } else if (iconName.StartsWith(wxT("Toolbar_"))) { + m_tblist.Add(bmp); + } +} + + +void CamuleDlg::Apply_Clients_Skin() +{ + bool useSkins = thePrefs::UseSkins() && Check_and_Init_Skin(); + + // Clear the client image list + m_imagelist.RemoveAll(); + + // Add the images to the image list + for (int i = 0; i < CLIENT_SKIN_SIZE; ++i) { + Add_Skin_Icon(wxT("Client_") + m_clientSkinNames[i], + clientImages(i), useSkins); + } +} + + +void CamuleDlg::Apply_Toolbar_Skin(wxToolBar *wndToolbar) +{ + bool useSkins = thePrefs::UseSkins() && Check_and_Init_Skin(); + + // Clear the toolbar image list + m_tblist.RemoveAll(); + + // Add the images to the image list + Add_Skin_Icon(wxT("Toolbar_Connect"), connButImg(0), useSkins); + Add_Skin_Icon(wxT("Toolbar_Disconnect"), connButImg(1), useSkins); + Add_Skin_Icon(wxT("Toolbar_Connecting"), connButImg(2), useSkins); + Add_Skin_Icon(wxT("Toolbar_Network"), amuleDlgImages(20), useSkins); + Add_Skin_Icon(wxT("Toolbar_Transfers"), amuleDlgImages(21), useSkins); + Add_Skin_Icon(wxT("Toolbar_Search"), amuleDlgImages(22), useSkins); + Add_Skin_Icon(wxT("Toolbar_Shared"), amuleDlgImages(23), useSkins); + Add_Skin_Icon(wxT("Toolbar_Messages"), amuleDlgImages(24), useSkins); + Add_Skin_Icon(wxT("Toolbar_Stats"), amuleDlgImages(25), useSkins); + Add_Skin_Icon(wxT("Toolbar_Prefs"), amuleDlgImages(26), useSkins); + Add_Skin_Icon(wxT("Toolbar_Import"), amuleDlgImages(32), useSkins); + Add_Skin_Icon(wxT("Toolbar_About"), amuleDlgImages(29), useSkins); + Add_Skin_Icon(wxT("Toolbar_Blink"), amuleDlgImages(33), useSkins); + + // Build aMule toolbar + wndToolbar->SetMargins(0, 0); + + // Placeholder. Gets updated by ShowConnectionState + wndToolbar->AddTool(ID_BUTTONCONNECT, wxT("..."), m_tblist.GetBitmap(0)); + + wndToolbar->AddSeparator(); + wndToolbar->AddTool(ID_BUTTONNETWORKS, + _("Networks"), m_tblist.GetBitmap(3), + wxNullBitmap, wxITEM_CHECK, + _("Networks Window")); + wndToolbar->ToggleTool(ID_BUTTONNETWORKS, true); + wndToolbar->AddTool(ID_BUTTONSEARCH, + _("Searches"), m_tblist.GetBitmap(5), + wxNullBitmap, wxITEM_CHECK, + _("Searches Window")); + wndToolbar->AddTool(ID_BUTTONTRANSFER, + _("Transfers"), m_tblist.GetBitmap(4), + wxNullBitmap, wxITEM_CHECK, + _("Files Transfers Window")); + wndToolbar->AddTool(ID_BUTTONSHARED, + _("Shared Files"), m_tblist.GetBitmap(6), + wxNullBitmap, wxITEM_CHECK, + _("Shared Files Window")); + wndToolbar->AddTool(ID_BUTTONMESSAGES, + _("Messages"), m_tblist.GetBitmap(7), + wxNullBitmap, wxITEM_CHECK, + _("Messages Window")); + wndToolbar->AddTool(ID_BUTTONSTATISTICS, + _("Statistics"), m_tblist.GetBitmap(8), + wxNullBitmap, wxITEM_CHECK, + _("Statistics Graph Window")); + wndToolbar->AddSeparator(); + wndToolbar->AddTool(ID_BUTTONNEWPREFERENCES, + _("Preferences"), m_tblist.GetBitmap(9), + wxNullBitmap, wxITEM_NORMAL, + _("Preferences Settings Window")); + wndToolbar->AddTool(ID_BUTTONIMPORT, + _("Import"), m_tblist.GetBitmap(10), + wxNullBitmap, wxITEM_NORMAL, + _("The partfile importer tool")); + wndToolbar->AddTool(ID_ABOUT, + _("About"), m_tblist.GetBitmap(11), + wxNullBitmap, wxITEM_NORMAL, + _("About/Help")); + + // Needed for non-GTK platforms, where the + // items don't get added immediatly. + wndToolbar->Realize(); + + // Updates the "Connect" button, and so on. + ShowConnectionState(); +} + + +void CamuleDlg::Create_Toolbar(bool orientation) +{ + Freeze(); + // Create ToolBar from the one designed by wxDesigner (BigBob) + wxToolBar *current = GetToolBar(); + if (current) { + current->Destroy(); + SetToolBar(NULL); // Remove old one if present + } + m_wndToolbar = CreateToolBar( + (orientation ? wxTB_VERTICAL : wxTB_HORIZONTAL) | + wxNO_BORDER | wxTB_TEXT | wxTB_3DBUTTONS | + wxTB_FLAT | wxCLIP_CHILDREN | wxTB_NODIVIDER); + m_wndToolbar->SetToolBitmapSize(wxSize(32, 32)); + Apply_Toolbar_Skin(m_wndToolbar); +#ifdef CLIENT_GUI + m_wndToolbar->DeleteTool(ID_BUTTONIMPORT); +#endif + Thaw(); +} + + +void CamuleDlg::OnMainGUISizeChange(wxSizeEvent& evt) +{ + wxFrame::OnSize(evt); + if (m_transferwnd && m_transferwnd->clientlistctrl) { + // Transfer window's splitter set again if it's hidden. + if (m_transferwnd->clientlistctrl->GetListView() == vtNone) { + int height = m_transferwnd->clientlistctrl->GetSize().GetHeight(); + wxSplitterWindow* splitter = + CastChild(wxT("splitterWnd"), wxSplitterWindow); + height += splitter->GetWindow1()->GetSize().GetHeight(); + splitter->SetSashPosition( height ); + } + } + +} + + +void CamuleDlg::OnKeyPressed(wxKeyEvent& event) +{ + if (event.GetKeyCode() == WXK_F1) { + // Ctrl/Alt/Shift must not be pressed, to avoid + // conflicts with other (global) shortcuts. + if (!event.HasModifiers() && !event.ShiftDown()) { + LaunchUrl(wxT("http://wiki.amule.org")); + return; + } + } + + event.Skip(); +} + + +void CamuleDlg::OnExit(wxCommandEvent& WXUNUSED(evt)) +{ + Close(); +} + +// File_checked_for_headers diff --git a/src/amuleDlg.h b/src/amuleDlg.h new file mode 100644 index 00000000..e95b5a25 --- /dev/null +++ b/src/amuleDlg.h @@ -0,0 +1,256 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef AMULEDLG_H +#define AMULEDLG_H + + +#include +#include +#include // Needed for wxFrame +#include +#include +#include +#include + +#include "Types.h" // Needed for uint32 + + +class wxTimerEvent; +class wxTextCtrl; + +class CIP2Country; +class CTransferWnd; +class CServerWnd; +class CSharedFilesWnd; +class CSearchDlg; +class CChatWnd; +class CStatisticsDlg; +class CKadDlg; +class PrefsUnifiedDlg; + + +class CMuleTrayIcon; + + +#define MP_RESTORE 4001 +#define MP_CONNECT 4002 +#define MP_DISCONNECT 4003 +#define MP_EXIT 4004 + + +#define DEFAULT_SIZE_X 800 +#define DEFAULT_SIZE_Y 600 + + +enum ClientSkinEnum { + Client_Green_Smiley = 0, + Client_Red_Smiley, + Client_Yellow_Smiley, + Client_Grey_Smiley, + Client_White_Smiley, + Client_ExtendedProtocol_Smiley, + Client_SecIdent_Smiley, + Client_BadGuy_Smiley, + Client_CreditsGrey_Smiley, + Client_CreditsYellow_Smiley, + Client_Upload_Smiley, + Client_Friend_Smiley, + Client_eMule_Smiley, + Client_mlDonkey_Smiley, + Client_eDonkeyHybrid_Smiley, + Client_aMule_Smiley, + Client_lphant_Smiley, + Client_Shareaza_Smiley, + Client_xMule_Smiley, + Client_Unknown, + Client_InvalidRating_Smiley, + Client_PoorRating_Smiley, + Client_FairRating_Smiley, + Client_GoodRating_Smiley, + Client_ExcellentRating_Smiley, + Client_CommentOnly_Smiley, + Client_Encryption_Smiley, + // Add items here. + CLIENT_SKIN_SIZE +}; + + +// CamuleDlg Dialogfeld +class CamuleDlg : public wxFrame +{ +public: + CamuleDlg( + wxWindow *pParent = NULL, + const wxString &title = wxEmptyString, + wxPoint where = wxDefaultPosition, + wxSize dlg_size = wxSize(DEFAULT_SIZE_X,DEFAULT_SIZE_Y)); + ~CamuleDlg(); + + void AddLogLine(bool addtostatusbar, const wxString& line); + void AddServerMessageLine(wxString& message); + void ResetLog(int id); + + void ShowUserCount(const wxString& info = wxEmptyString); + void ShowConnectionState(); + void ShowTransferRate(); + + bool StatisticsWindowActive() + { return (m_activewnd == (wxWindow*)m_statisticswnd); } + + /* Returns the active dialog. Needed to check what to redraw. */ + enum DialogType { + DT_TRANSFER_WND, + DT_NETWORKS_WND, + DT_SEARCH_WND, + DT_SHARED_WND, + DT_CHAT_WND, + DT_STATS_WND, + DT_KAD_WND // this one is still unused + }; + DialogType GetActiveDialog() + { return m_nActiveDialog; } + void SetActiveDialog(DialogType type, wxWindow* dlg); + + /** + * Helper function for deciding if a certian dlg is visible. + * + * @return True if the dialog is visible to the user, false otherwise. + */ + bool IsDialogVisible( DialogType dlg ) + { + return m_nActiveDialog == dlg && m_is_safe_state /* && !IsIconized() */; + } + + void ShowED2KLinksHandler( bool show ); + + void DlgShutDown(); + void OnClose(wxCloseEvent& evt); + void OnBnConnect(wxCommandEvent& evt); + + void Hide_aMule(bool iconize = true); + void Show_aMule(bool uniconize = true); + + bool SafeState() { return m_is_safe_state; } + + void LaunchUrl(const wxString &url); + + //! These are the currently known web-search providers + enum WebSearch { + WS_FILEHASH + }; + // websearch function + wxString GenWebSearchUrl( const wxString &filename, WebSearch provider ); + + void CreateSystray(); + void RemoveSystray(); + + void StartGuiTimer() { gui_timer->Start(100); } + void StopGuiTimer() { gui_timer->Stop(); } + + /** + * This function ensures that _all_ list widgets are properly sorted. + */ + void InitSort(); + + void SetMessageBlink(bool state) { m_BlinkMessages = state; } + void Create_Toolbar(bool orientation); + +#ifdef ENABLE_IP2COUNTRY + CIP2Country* m_IP2Country; +#endif + wxWindow* m_activewnd; + CTransferWnd* m_transferwnd; + CServerWnd* m_serverwnd; + CSharedFilesWnd* m_sharedfileswnd; + CSearchDlg* m_searchwnd; + CChatWnd* m_chatwnd; + CStatisticsDlg* m_statisticswnd; + CKadDlg* m_kademliawnd; + //! Pointer to the current preference dialog, if any. + PrefsUnifiedDlg* m_prefsDialog; + + int m_srv_split_pos; + + wxImageList m_imagelist; + wxImageList m_tblist; + +protected: + void OnToolBarButton(wxCommandEvent& ev); + void OnAboutButton(wxCommandEvent& ev); + void OnPrefButton(wxCommandEvent& ev); +#ifndef CLIENT_GUI + void OnImportButton(wxCommandEvent& ev); +#endif + void OnMinimize(wxIconizeEvent& evt); + void OnBnClickedFast(wxCommandEvent& evt); + void OnBnStatusText(wxCommandEvent& evt); + void OnGUITimer(wxTimerEvent& evt); + void OnMainGUISizeChange(wxSizeEvent& evt); + void OnExit(wxCommandEvent& evt); + +private: + //! Specifies if the prefs-dialog was shown before minimizing. + bool m_prefsVisible; + wxToolBar *m_wndToolbar; + wxTimer *gui_timer; + CMuleTrayIcon *m_wndTaskbarNotifier; + DialogType m_nActiveDialog; + bool m_is_safe_state; + bool m_BlinkMessages; + int m_CurrentBlinkBitmap; + uint32 m_last_iconizing; + wxFileName m_skinFileName; + std::vector m_clientSkinNames; + + WX_DECLARE_STRING_HASH_MAP(wxZipEntry*, ZipCatalog); + ZipCatalog::iterator it; + wxZipEntry *entry; + ZipCatalog cat; + + bool LoadGUIPrefs( + bool override_pos, + bool override_size); + bool SaveGUIPrefs(); + + void UpdateTrayIcon(int percent); + + void Apply_Clients_Skin(); + void Apply_Toolbar_Skin(wxToolBar *wndToolbar); + bool Check_and_Init_Skin(); + void Add_Skin_Icon( + const wxString &iconName, + const wxBitmap &stdIcon, + bool useSkins); + void ToogleED2KLinksHandler(); + void SetMessagesTool(); + void OnKeyPressed(wxKeyEvent& evt); + + DECLARE_EVENT_TABLE() +}; + +#endif + +// File_checked_for_headers diff --git a/src/amuleIPV4Address.h b/src/amuleIPV4Address.h new file mode 100644 index 00000000..24faa5eb --- /dev/null +++ b/src/amuleIPV4Address.h @@ -0,0 +1,66 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Carlo Wood ( carlo@alinoe.com ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef AMULEIPV4ADDRESS_H +#define AMULEIPV4ADDRESS_H + +#include // Needed by wx/sckaddr.h + +#include "NetworkFunctions.h" // Needed for StringIPtoUint32 + + +// This is fscking hard to maintain. wxWidgets 2.5.2 has changed internal +// ipaddress structs. +// prevent fscking dns queries +class amuleIPV4Address : public wxIPV4address +{ +public: + amuleIPV4Address() {} + amuleIPV4Address(const wxIPV4address &a) : wxIPV4address(a) {} + + virtual bool Hostname(const wxString& name) { + // Some people are sometimes fools. + if (name.IsEmpty()) { +// wxASSERT(0); + return false; + } + + return Hostname(StringIPtoUint32(name)); + } + + virtual bool Hostname(uint32 ip) { + // Some people are sometimes fools. + if (!ip) { +// wxASSERT(0); + return false; + } + + // We have to take care that wxIPV4address's internals changed on 2.5.2 + return GAddress_INET_SetHostAddress(m_address,wxUINT32_SWAP_ALWAYS(ip))==GSOCK_NOERROR; + } +}; + +#endif // AMULEIPV4ADDRESS_H +// File_checked_for_headers diff --git a/src/amuled.cpp b/src/amuled.cpp new file mode 100644 index 00000000..ec275ded --- /dev/null +++ b/src/amuled.cpp @@ -0,0 +1,698 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "amule.h" // Interface declarations. + +#include + +#ifdef HAVE_CONFIG_H + #include "config.h" // Needed for HAVE_SYS_RESOURCE_H +#endif + +#include + +#include "Preferences.h" // Needed for CPreferences +#include "PartFile.h" // Needed for CPartFile +#include "Logger.h" +#include +#include "InternalEvents.h" // Needed for wxEVT_* +#include "ThreadTasks.h" +#include "GuiEvents.h" // Needed for EVT_MULE_NOTIFY +#include "Timer.h" // Needed for EVT_MULE_TIMER + +#include "ClientUDPSocket.h" // Do_not_auto_remove (forward declaration not enough) +#include "ListenSocket.h" // Do_not_auto_remove (forward declaration not enough) + + +#include +#ifdef HAVE_SYS_RESOURCE_H +#include // Do_not_auto_remove +#endif + +#ifndef __WXMSW__ + #ifdef HAVE_SYS_WAIT_H + #include // Do_not_auto_remove + #endif + + #include +#endif + +BEGIN_EVENT_TABLE(CamuleDaemonApp, wxAppConsole) + // + // Socket handlers + // + + // Listen Socket + EVT_SOCKET(ID_LISTENSOCKET_EVENT, CamuleDaemonApp::ListenSocketHandler) + + // UDP Socket (servers) + EVT_SOCKET(ID_SERVERUDPSOCKET_EVENT, CamuleDaemonApp::UDPSocketHandler) + // UDP Socket (clients) + EVT_SOCKET(ID_CLIENTUDPSOCKET_EVENT, CamuleDaemonApp::UDPSocketHandler) + + // Socket timer (TCP) + EVT_MULE_TIMER(ID_SERVER_RETRY_TIMER_EVENT, CamuleDaemonApp::OnTCPTimer) + + // Core timer + EVT_MULE_TIMER(ID_CORE_TIMER_EVENT, CamuleDaemonApp::OnCoreTimer) + + EVT_MULE_NOTIFY(CamuleDaemonApp::OnNotifyEvent) + EVT_MULE_LOGGING(CamuleDaemonApp::OnLoggingEvent) + + // Async dns handling + EVT_MULE_INTERNAL(wxEVT_CORE_UDP_DNS_DONE, -1, CamuleDaemonApp::OnUDPDnsDone) + + EVT_MULE_INTERNAL(wxEVT_CORE_SOURCE_DNS_DONE, -1, CamuleDaemonApp::OnSourceDnsDone) + + EVT_MULE_INTERNAL(wxEVT_CORE_SERVER_DNS_DONE, -1, CamuleDaemonApp::OnServerDnsDone) + + // Hash ended notifier + EVT_MULE_HASHING(CamuleDaemonApp::OnFinishedHashing) + EVT_MULE_AICH_HASHING(CamuleDaemonApp::OnFinishedAICHHashing) + + // File completion ended notifier + EVT_MULE_FILE_COMPLETED(CamuleDaemonApp::OnFinishedCompletion) + + // HTTPDownload finished + EVT_MULE_INTERNAL(wxEVT_CORE_FINISHED_HTTP_DOWNLOAD, -1, CamuleDaemonApp::OnFinishedHTTPDownload) +END_EVENT_TABLE() + +IMPLEMENT_APP(CamuleDaemonApp) + +/* + * Socket handling in wxBase + * + */ +class CSocketSet { + int m_count; + int m_fds[FD_SETSIZE], m_fd_idx[FD_SETSIZE]; + GSocket *m_gsocks[FD_SETSIZE]; + + fd_set m_set; + public: + CSocketSet(); + void AddSocket(GSocket *); + void RemoveSocket(GSocket *); + void FillSet(int &max_fd); + + void Detected(void (GSocket::*func)()); + + fd_set *Set() { return &m_set; } +}; + +CSocketSet::CSocketSet() +{ + m_count = 0; + for(int i = 0; i < FD_SETSIZE; i++) { + m_fds[i] = 0; + m_fd_idx[i] = 0xffff; + m_gsocks[i] = 0; + } +} + +void CSocketSet::AddSocket(GSocket *socket) +{ + wxASSERT(socket); + + int fd = socket->m_fd; + + if ( fd == -1 ) { + return; + } + + wxASSERT( (fd > 2) && (fd < FD_SETSIZE) ); + + if ( m_gsocks[fd] ) { + return; + } + m_fds[m_count] = fd; + m_fd_idx[fd] = m_count; + m_gsocks[fd] = socket; + m_count++; +} + +void CSocketSet::RemoveSocket(GSocket *socket) +{ + wxASSERT(socket); + + int fd = socket->m_fd; + + if ( fd == -1 ) { + return; + } + + wxASSERT( (fd > 2) && (fd < FD_SETSIZE) ); + + int i = m_fd_idx[fd]; + if ( i == 0xffff ) { + return; + } + wxASSERT(m_fds[i] == fd); + m_fds[i] = m_fds[m_count-1]; + m_gsocks[fd] = 0; + m_fds[m_count-1] = 0; + m_fd_idx[fd] = 0xffff; + m_fd_idx[m_fds[i]] = i; + m_count--; +} + +void CSocketSet::FillSet(int &max_fd) +{ + FD_ZERO(&m_set); + + for(int i = 0; i < m_count; i++) { + FD_SET(m_fds[i], &m_set); + if ( m_fds[i] > max_fd ) { + max_fd = m_fds[i]; + } + } +} + +void CSocketSet::Detected(void (GSocket::*func)()) +{ + for (int i = 0; i < m_count; i++) { + int fd = m_fds[i]; + if ( FD_ISSET(fd, &m_set) ) { + GSocket *socket = m_gsocks[fd]; + (*socket.*func)(); + } + } +} + +CAmuledGSocketFuncTable::CAmuledGSocketFuncTable() : m_lock(wxMUTEX_RECURSIVE) +{ + m_in_set = new CSocketSet; + m_out_set = new CSocketSet; + + m_lock.Unlock(); +} + +void CAmuledGSocketFuncTable::AddSocket(GSocket *socket, GSocketEvent event) +{ + wxMutexLocker lock(m_lock); + + if ( event == GSOCK_INPUT ) { + m_in_set->AddSocket(socket); + } else { + m_out_set->AddSocket(socket); + } +} + +void CAmuledGSocketFuncTable::RemoveSocket(GSocket *socket, GSocketEvent event) +{ + wxMutexLocker lock(m_lock); + + if ( event == GSOCK_INPUT ) { + m_in_set->RemoveSocket(socket); + } else { + m_out_set->RemoveSocket(socket); + } +} + +void CAmuledGSocketFuncTable::RunSelect() +{ + wxMutexLocker lock(m_lock); + + int max_fd = -1; + m_in_set->FillSet(max_fd); + m_out_set->FillSet(max_fd); + + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 10000; // 10ms + + int result = select(max_fd + 1, m_in_set->Set(), m_out_set->Set(), 0, &tv); + if ( result > 0 ) { + m_in_set->Detected(&GSocket::Detected_Read); + m_out_set->Detected(&GSocket::Detected_Write); + } + +} + +GSocketGUIFunctionsTable *CDaemonAppTraits::GetSocketGUIFunctionsTable() +{ + return m_table; +} + +bool CAmuledGSocketFuncTable::OnInit() +{ + return true; +} + +void CAmuledGSocketFuncTable::OnExit() +{ +} + +bool CAmuledGSocketFuncTable::CanUseEventLoop() +{ + /* + * FIXME: (lfroen) Not sure whether it's right. + * I will review it later. + */ + return false; +} + +bool CAmuledGSocketFuncTable::Init_Socket(GSocket *) +{ + return true; +} + +void CAmuledGSocketFuncTable::Destroy_Socket(GSocket *) +{ +} + +void CAmuledGSocketFuncTable::Install_Callback(GSocket *sock, GSocketEvent e) +{ + AddSocket(sock, e); +} + +void CAmuledGSocketFuncTable::Uninstall_Callback(GSocket *sock, GSocketEvent e) +{ + RemoveSocket(sock, e); +} + +void CAmuledGSocketFuncTable::Enable_Events(GSocket *socket) +{ + Install_Callback(socket, GSOCK_INPUT); + Install_Callback(socket, GSOCK_OUTPUT); +} + +void CAmuledGSocketFuncTable::Disable_Events(GSocket *socket) +{ + Uninstall_Callback(socket, GSOCK_INPUT); + Uninstall_Callback(socket, GSOCK_OUTPUT); +} + + +CDaemonAppTraits::CDaemonAppTraits(CAmuledGSocketFuncTable *table) +: +wxConsoleAppTraits(), +m_table(table), +m_lock(wxMUTEX_RECURSIVE), +m_sched_delete(), +m_oldSignalChildAction(), +m_newSignalChildAction() +{ + m_lock.Unlock(); +} + + +void CDaemonAppTraits::ScheduleForDestroy(wxObject *object) +{ + wxMutexLocker lock(m_lock); + + //delete object; + m_sched_delete.push_back(object); +} + +void CDaemonAppTraits::RemoveFromPendingDelete(wxObject *object) +{ + wxMutexLocker lock(m_lock); + + for(std::list::iterator i = m_sched_delete.begin(); + i != m_sched_delete.end(); i++) { + if ( *i == object ) { + m_sched_delete.erase(i); + return; + } + } +} + +void CDaemonAppTraits::DeletePending() +{ + wxMutexLocker lock(m_lock); + + while ( !m_sched_delete.empty() ) { + std::list::iterator i = m_sched_delete.begin(); + wxObject *object = *i; + delete object; + } + //m_sched_delete.erase(m_sched_delete.begin(), m_sched_delete.end()); +} + + +#ifdef __WXMAC__ +#include // Do_not_auto_remove (guess) +static wxStandardPathsCF gs_stdPaths; +wxStandardPathsBase& CDaemonAppTraits::GetStandardPaths() +{ + return gs_stdPaths; +} +#endif + + +CamuleDaemonApp::CamuleDaemonApp() +: +m_Exit(false), +m_table(new CAmuledGSocketFuncTable()) +{ + wxPendingEventsLocker = new wxCriticalSection; +} + + +wxAppTraits *CamuleDaemonApp::CreateTraits() +{ + return new CDaemonAppTraits(m_table); +} + + +#ifndef __WXMSW__ + + +static EndProcessDataMap endProcDataMap; + + +int CDaemonAppTraits::WaitForChild(wxExecuteData &execData) +{ + int status = 0; + pid_t result = 0; + // Build the log message + wxString msg; + msg << wxT("WaitForChild() has been called for child process with pid `") << + execData.pid << + wxT("'. "); + + if (execData.flags & wxEXEC_SYNC) { + result = AmuleWaitPid(execData.pid, &status, 0, &msg); + if (result == -1 || (!WIFEXITED(status) && !WIFSIGNALED(status))) { + msg << wxT(" Waiting for subprocess termination failed."); + AddDebugLogLineM(false, logGeneral, msg); + } + } else { + /** wxEXEC_ASYNC */ + // Give the process a chance to start or forked child to exit + // 1 second is enough time to fail on "path not found" + wxSleep(1); + result = AmuleWaitPid(execData.pid, &status, WNOHANG, &msg); + if (result == 0) { + // Add a WxEndProcessData entry to the map, so that we can + // support process termination + wxEndProcessData *endProcData = new wxEndProcessData(); + endProcData->pid = execData.pid; + endProcData->process = execData.process; + endProcData->tag = 0; + endProcDataMap[execData.pid] = endProcData; + + status = execData.pid; + } else { + // if result != 0, then either waitpid() failed (result == -1) + // and there is nothing we can do, or the child has changed + // status, which means it is probably dead. + status = 0; + } + } + + // Log our passage here + AddDebugLogLineM(false, logGeneral, msg); + + return status; +} + + +void OnSignalChildHandler(int /*signal*/, siginfo_t *siginfo, void * /*ucontext*/) +{ + // Build the log message + wxString msg; + msg << wxT("OnSignalChildHandler() has been called for child process with pid `") << + siginfo->si_pid << + wxT("'. "); + // Make sure we leave no zombies by calling waitpid() + int status = 0; + pid_t result = AmuleWaitPid(siginfo->si_pid, &status, WNOHANG, &msg); + if (result != 1 && result != 0 && (WIFEXITED(status) || WIFSIGNALED(status))) { + // Fetch the wxEndProcessData structure corresponding to this pid + EndProcessDataMap::iterator it = endProcDataMap.find(siginfo->si_pid); + if (it != endProcDataMap.end()) { + wxEndProcessData *endProcData = it->second; + // Remove this entry from the process map + endProcDataMap.erase(siginfo->si_pid); + // Save the exit code for the wxProcess object to read later + endProcData->exitcode = result != -1 && WIFEXITED(status) ? + WEXITSTATUS(status) : -1; + // Make things work as in wxGUI + wxHandleProcessTermination(endProcData); + + // wxHandleProcessTermination() will "delete endProcData;" + // So we do not delete it again, ok? Do not uncomment this line. + //delete endProcData; + } else { + msg << wxT(" Error: the child process pid is not on the pid map."); + } + } + + // Log our passage here + AddDebugLogLineM(false, logGeneral, msg); +} + + +pid_t AmuleWaitPid(pid_t pid, int *status, int options, wxString *msg) +{ + // strerror_r() buffer + const int ERROR_BUFFER_LEN = 256; + char errorBuffer[ERROR_BUFFER_LEN]; + + *status = 0; + pid_t result = waitpid(pid, status, options); + if (result == -1) { + strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); + *msg << wxT("Error: waitpid() call failed: ") << + char2unicode(errorBuffer) << + wxT("."); + } else if (result == 0) { + if (options & WNOHANG) { + *msg << wxT("The child is alive."); + } else { + *msg << wxT("Error: waitpid() call returned 0 but " + "WNOHANG was not specified in options."); + } + } else { + if (WIFEXITED(*status)) { + *msg << wxT("Child has terminated with status code `") << + WEXITSTATUS(*status) << + wxT("'."); + } else if (WIFSIGNALED(*status)) { + *msg << wxT("Child was killed by signal `") << + WTERMSIG(*status) << + wxT("'."); + if (WCOREDUMP(*status)) { + *msg << wxT(" A core file has been dumped."); + } + } else if (WIFSTOPPED(*status)) { + *msg << wxT("Child has been stopped by signal `") << + WSTOPSIG(*status) << + wxT("'."); +#ifdef WIFCONTINUED /* Only found in recent kernels. */ + } else if (WIFCONTINUED(*status)) { + *msg << wxT("Child has received `SIGCONT' and has continued execution."); +#endif + } else { + *msg << wxT("The program was not able to determine why the child has signaled."); + } + } + + return result; +} + + +#endif // __WXMSW__ + + +int CamuleDaemonApp::OnRun() +{ + if (!thePrefs::AcceptExternalConnections()) { + wxString warning = _("ERROR: aMule daemon cannot be used when external connections are disabled. " + "To enable External Connections, use either a normal aMule, start amuled with the option --ec-config or set the key" + "\"AcceptExternalConnections\" to 1 in the file ~/.aMule/amule.conf"); + + AddLogLineM(true, warning); + printf("\n%s\n\n", (const char*)unicode2char(warning)); + + return 0; + } else if (thePrefs::ECPassword().IsEmpty()) { + wxString warning = wxT("ERROR: A valid password is required to use " + "external connections, and aMule daemon cannot be used without " + "external connections. To run aMule deamon, you must set the " + "\"ECPassword\" field in the file ~/.aMule/amule.conf with an " + "appropriate value. Execute amuled with the flag --ec-config to set the password. More information can be found at " + "http://wiki.amule.org"); + + AddLogLineM(true, warning); + printf("\n%s\n\n", (const char*)unicode2char(warning)); + + return 0; + } + +#ifndef __WXMSW__ + // strerror_r() buffer + const int ERROR_BUFFER_LEN = 256; + char errorBuffer[ERROR_BUFFER_LEN]; + wxString msg; + + // Process the return code of dead children so that we do not create + // zombies. wxBase does not implement wxProcess callbacks, so no one + // actualy calls wxHandleProcessTermination() in console applications. + // We do our best here. + int ret = 0; + ret = sigaction(SIGCHLD, NULL, &m_oldSignalChildAction); + m_newSignalChildAction = m_oldSignalChildAction; + m_newSignalChildAction.sa_sigaction = OnSignalChildHandler; + m_newSignalChildAction.sa_flags |= SA_SIGINFO; + m_newSignalChildAction.sa_flags &= ~SA_RESETHAND; + ret = sigaction(SIGCHLD, &m_newSignalChildAction, NULL); + if (ret == -1) { + strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); + msg << wxT("CamuleDaemonApp::OnRun(): " + "Installation of SIGCHLD callback with sigaction() failed: ") << + char2unicode(errorBuffer) << + wxT("."); + AddLogLineM(true, msg); + } else { + msg << wxT("CamuleDaemonApp::OnRun(): Installation of SIGCHLD " + "callback with sigaction() succeeded."); + AddDebugLogLineM(false, logGeneral, msg); + } +#endif // __WXMSW__ + + while ( !m_Exit ) { + m_table->RunSelect(); + ProcessPendingEvents(); + ((CDaemonAppTraits *)GetTraits())->DeletePending(); + } + + // ShutDown is beeing called twice. Once here and again in OnExit(). + ShutDown(); + +#ifndef __WXMSW__ + msg.Empty(); + ret = sigaction(SIGCHLD, &m_oldSignalChildAction, NULL); + if (ret == -1) { + strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); + msg << wxT("CamuleDaemonApp::OnRun(): second sigaction() failed: ") << + char2unicode(errorBuffer) << + wxT("."); + AddLogLineM(true, msg); + } else { + msg << wxT("CamuleDaemonApp::OnRun(): Uninstallation of SIGCHLD " + "callback with sigaction() succeeded."); + AddDebugLogLineM(false, logGeneral, msg); + } +#endif // __WXMSW__ + + return 0; +} + +bool CamuleDaemonApp::OnInit() +{ + printf("amuled: OnInit - starting timer\n"); + if ( !CamuleApp::OnInit() ) { + return false; + } + core_timer = new CTimer(this,ID_CORE_TIMER_EVENT); + core_timer->Start(300); + glob_prefs->GetCategory(0)->title = GetCatTitle(thePrefs::GetAllcatType()); + glob_prefs->GetCategory(0)->path = thePrefs::GetIncomingDir(); + + return true; +} + +int CamuleDaemonApp::InitGui(bool ,wxString &) +{ +#ifndef __WXMSW__ + if ( !enable_daemon_fork ) { + return 0; + } + printf("amuled: forking to background - see you\n"); + // + // fork to background and detouch from controlling tty + // while redirecting stdout to /dev/null + // + for(int i_fd = 0;i_fd < 3; i_fd++) { + close(i_fd); + } + int fd = open("/dev/null",O_RDWR); + dup(fd); + dup(fd); + int pid = fork(); + + wxASSERT(pid != -1); + + if ( pid ) { + exit(0); + } else { + setsid(); + } + +#endif + return 0; +} + + +int CamuleDaemonApp::OnExit() +{ + /* + * Stop all socket threads before entering + * shutdown sequence. + */ + delete listensocket; + listensocket = 0; + if (clientudp) { + delete clientudp; + clientudp = NULL; + } + + ShutDown(); + + // lfroen: delete socket threads + if (ECServerHandler) { + ECServerHandler = 0; + } + + delete core_timer; + + return CamuleApp::OnExit(); +} + + +void CamuleDaemonApp::ShowAlert(wxString msg, wxString title, int flags) +{ + if ( flags | wxICON_ERROR ) { + title = CFormat(_("ERROR: %s")) % title; + } + + // Ensure that alerts are always visible on the console (when possible). + if ((not enable_stdout_log) and (not enable_daemon_fork)) { + printf("%s\n", unicode2UTF8(title + wxT(" ") + msg).data()); + } + + AddLogLineM(true, title + wxT(" ") + msg); +} + + +void CamuleDaemonApp::OnLoggingEvent(CLoggingEvent& evt) +{ + CamuleApp::AddLogLine(evt.Message()); +} + +// File_checked_for_headers diff --git a/src/extern/upnp/ixml.h b/src/extern/upnp/ixml.h new file mode 100644 index 00000000..22b3e393 --- /dev/null +++ b/src/extern/upnp/ixml.h @@ -0,0 +1,135 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2000-2003 Intel Corporation +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither name of Intel Corporation nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +// Modified by Angel Vidal Veiga (kry@amule.org) for the aMule project. +// Really crippled version of the original header. Keep just what we need. + +#ifndef _IXML_H_ +#define _IXML_H_ + +typedef int BOOL; + +#define DOMString char * + +#ifndef IN +#define IN +#endif + +/**@name DOM Interfaces + * The Document Object Model consists of a set of objects and interfaces + * for accessing and manipulating documents. IXML does not implement all + * the interfaces documented in the DOM2-Core recommendation but defines + * a subset of the most useful interfaces. A description of the supported + * interfaces and methods is presented in this section. + * + * For a complete discussion on the object model, the object hierarchy, + * etc., refer to section 1.1 of the DOM2-Core recommendation. + */ + +//@{ + + +/*================================================================ +* +* DOM node type +* +* +*=================================================================*/ +typedef enum +{ + eINVALID_NODE = 0, + eELEMENT_NODE = 1, + eATTRIBUTE_NODE = 2, + eTEXT_NODE = 3, + eCDATA_SECTION_NODE = 4, + eENTITY_REFERENCE_NODE = 5, + eENTITY_NODE = 6, + ePROCESSING_INSTRUCTION_NODE = 7, + eCOMMENT_NODE = 8, + eDOCUMENT_NODE = 9, + eDOCUMENT_TYPE_NODE = 10, + eDOCUMENT_FRAGMENT_NODE = 11, + eNOTATION_NODE = 12 + +} IXML_NODE_TYPE; + +/*================================================================ +* +* DOM data structures +* +* +*=================================================================*/ + +typedef struct _IXML_Document *Docptr; + +typedef struct _IXML_Node *Nodeptr; + +typedef struct _IXML_Node +{ + DOMString nodeName; + DOMString nodeValue; + IXML_NODE_TYPE nodeType; + DOMString namespaceURI; + DOMString prefix; + DOMString localName; + BOOL readOnly; + + Nodeptr parentNode; + Nodeptr firstChild; + Nodeptr prevSibling; + Nodeptr nextSibling; + Nodeptr firstAttr; + Docptr ownerDocument; + +} IXML_Node; + +typedef struct _IXML_Document +{ + IXML_Node n; +} IXML_Document; + +typedef struct _IXML_Element +{ + IXML_Node n; + DOMString tagName; + +} IXML_Element; + +typedef struct _IXML_NamedNodeMap +{ + IXML_Node *nodeItem; + struct _IXML_NamedNodeMap *next; +} IXML_NamedNodeMap; + +//@} + +#endif // _IXML_H_ +// File_checked_for_headers diff --git a/src/extern/upnp/upnp.h b/src/extern/upnp/upnp.h new file mode 100644 index 00000000..22da560a --- /dev/null +++ b/src/extern/upnp/upnp.h @@ -0,0 +1,351 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2000-2003 Intel Corporation +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither name of Intel Corporation nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +// Modified by Angel Vidal Veiga (kry@amule.org) for the aMule project. +// Really crippled version of the original header. Keep just what we need. + +#ifndef UPNP_H +#define UPNP_H + +#include "ixml.h" + +#ifndef __WIN32__ +#include +#else +#include +#endif + +#define LINE_SIZE 180 +#define NAME_SIZE 256 + +/// @name Constants, Structures, and Types +//@{ + +/** @name UPNP_E_SUCCESS [0] + * {\tt UPNP_E_SUCCESS} signifies that the operation completed successfully. + * For asynchronous functions, this only means that the packet generated by + * the operation was successfully transmitted on the network. The result of + * the entire operation comes as part of the callback for that operation. + */ +//@{ +#define UPNP_E_SUCCESS 0 +//@} + +/** Returned when a control point application registers with {\bf + * UpnpRegisterClient}. Client handles can only be used with + * functions that operate with a client handle. */ + +typedef int UpnpClient_Handle; + +/** @name UPnP_EventType + @memo The reason code for an event callback. + @doc The {\bf Event} parameter will be different depending on the + reason for the callback. The descriptions for each event + type describe the contents of the {\bf Event} parameter. + */ + +enum Upnp_EventType_e { + + // + // Control callbacks + // + + /** Received by a device when a control point issues a control + * request. The {\bf Event} parameter contains a pointer to a {\bf + * Upnp_Action_Request} structure containing the action. The application + * stores the results of the action in this structure. */ + + UPNP_CONTROL_ACTION_REQUEST, + + /** A {\bf UpnpSendActionAsync} call completed. The {\bf Event} + * parameter contains a pointer to a {\bf Upnp_Action_Complete} structure + * with the results of the action. */ + + UPNP_CONTROL_ACTION_COMPLETE, + + /** Received by a device when a query for a single service variable + * arrives. The {\bf Event} parameter contains a pointer to a {\bf + * Upnp_State_Var_Request} structure containing the name of the variable + * and value. */ + + UPNP_CONTROL_GET_VAR_REQUEST, + + /** A {\bf UpnpGetServiceVarStatus} call completed. The {\bf Event} + * parameter contains a pointer to a {\bf Upnp_State_Var_Complete} structure + * containing the value for the variable. */ + + UPNP_CONTROL_GET_VAR_COMPLETE, + + // + // Discovery callbacks + // + + /** Received by a control point when a new device or service is available. + * The {\bf Event} parameter contains a pointer to a {\bf + * Upnp_Discovery} structure with the information about the device + * or service. */ + + UPNP_DISCOVERY_ADVERTISEMENT_ALIVE, + + /** Received by a control point when a device or service shuts down. The {\bf + * Event} parameter contains a pointer to a {\bf Upnp_Discovery} + * structure containing the information about the device or + * service. */ + + UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE, + + /** Received by a control point when a matching device or service responds. + * The {\bf Event} parameter contains a pointer to a {\bf + * Upnp_Discovery} structure containing the information about + * the reply to the search request. */ + + UPNP_DISCOVERY_SEARCH_RESULT, + + /** Received by a control point when the search timeout expires. The + * SDK generates no more callbacks for this search after this + * event. The {\bf Event} parameter is {\tt NULL}. */ + + UPNP_DISCOVERY_SEARCH_TIMEOUT, + + // + // Eventing callbacks + // + + /** Received by a device when a subscription arrives. + * The {\bf Event} parameter contains a pointer to a {\bf + * Upnp_Subscription_Request} structure. At this point, the + * subscription has already been accepted. {\bf UpnpAcceptSubscription} + * needs to be called to confirm the subscription and transmit the + * initial state table. This can be done during this callback. The SDK + * generates no events for a subscription unless the device + * application calls {\bf UpnpAcceptSubscription}. + */ + + UPNP_EVENT_SUBSCRIPTION_REQUEST, + + /** Received by a control point when an event arrives. The {\bf + * Event} parameter contains a {\bf Upnp_Event} structure + * with the information about the event. */ + + UPNP_EVENT_RECEIVED, + + /** A {\bf UpnpRenewSubscriptionAsync} call completed. The status of + * the renewal is in the {\bf Event} parameter as a {\bf + * Upnp_Event_Subscription} structure. */ + + UPNP_EVENT_RENEWAL_COMPLETE, + + /** A {\bf UpnpSubscribeAsync} call completed. The status of the + * subscription is in the {\bf Event} parameter as a {\bf + * Upnp_Event_Subscription} structure. */ + + UPNP_EVENT_SUBSCRIBE_COMPLETE, + + /** A {\bf UpnpUnSubscribeAsync} call completed. The status of the + * subscription is in the {\bf Event} parameter as a {\bf + * Upnp_Event_Subscribe} structure. */ + + UPNP_EVENT_UNSUBSCRIBE_COMPLETE, + + /** The auto-renewal of a client subscription failed. + * The {\bf Event} parameter is a {\bf Upnp_Event_Subscribe} structure + * with the error code set appropriately. The subscription is no longer + * valid. */ + + UPNP_EVENT_AUTORENEWAL_FAILED, + + /** A client subscription has expired. This will only occur + * if auto-renewal of subscriptions is disabled. + * The {\bf Event} parameter is a {\bf Upnp_Event_Subscribe} + * structure. The subscription is no longer valid. */ + + UPNP_EVENT_SUBSCRIPTION_EXPIRED + +}; + +typedef enum Upnp_EventType_e Upnp_EventType; + +/** The {\bf Upnp_SID} holds the subscription identifier for a subscription + between a client and a device. The SID is a string representation of + a globally unique id (GUID) and should not be modified. + */ + +typedef char Upnp_SID[44]; + +/** All callback functions share the same prototype, documented below. + * Note that any memory passed to the callback function + * is valid only during the callback and should be copied if it + * needs to persist. This callback function needs to be thread + * safe. The context of the callback is always on a valid thread + * context and standard synchronization methods can be used. Note, + * however, because of this the callback cannot call SDK functions + * unless explicitly noted. + * + * \begin{verbatim} + int CallbackFxn( Upnp_EventType EventType, void* Event, void* Cookie ); + \end{verbatim} + * + * where {\bf EventType} is the event that triggered the callback, + * {\bf Event} is a structure that denotes event-specific information for that + * event, and {\bf Cookie} is the user data passed when the callback was + * registered. + * + * See {\bf Upnp_EventType} for more information on the callback values and + * the associated {\bf Event} parameter. + * + * The return value of the callback is currently ignored. It may be used + * in the future to communicate results back to the SDK. + */ + +typedef int (*Upnp_FunPtr) ( + IN Upnp_EventType EventType, + IN void *Event, + IN void *Cookie + ); + +// +// This typedef is required by Doc++ to parse the last entry of the +// Upnp_Discovery structure correctly. +// + +struct Upnp_Discovery +{ + /** The result code of the {\bf UpnpSearchAsync} call. */ + int ErrCode; + + /** The expiration time of the advertisement. */ + int Expires; + + /** The unique device identifier. */ + char DeviceId[LINE_SIZE]; + + /** The device type. */ + char DeviceType[LINE_SIZE]; + + /** The service type. */ + char ServiceType[LINE_SIZE]; + + /** The service version. */ + char ServiceVer[LINE_SIZE]; + + /** The URL to the UPnP description document for the device. */ + char Location[LINE_SIZE]; + + /** The operating system the device is running. */ + char Os[LINE_SIZE]; + + /** Date when the response was generated. */ + char Date[LINE_SIZE]; + + /** Confirmation that the MAN header was understood by the device. */ + char Ext[LINE_SIZE]; + + /** The host address of the device responding to the search. */ + struct sockaddr_in DestAddr; +}; + +struct Upnp_Action_Complete +{ + /** The result of the operation. */ + int ErrCode; + + /** The control URL for service. */ + char CtrlUrl[NAME_SIZE]; + + /** The DOM document describing the action. */ + IXML_Document *ActionRequest; + + /** The DOM document describing the result of the action. */ + IXML_Document *ActionResult; +}; + +/** Represents the reply for the current value of a state variable in an + asynchronous call. */ + +struct Upnp_State_Var_Complete +{ + /** The result of the operation. */ + int ErrCode; + + /** The control URL for the service. */ + char CtrlUrl[NAME_SIZE]; + + /** The name of the variable. */ + char StateVarName[NAME_SIZE]; + + /** The current value of the variable or error string in case of error. */ + DOMString CurrentVal; +}; + +/** Returned along with a {\bf UPNP_EVENT_RECEIVED} callback. */ + +struct Upnp_Event +{ + /** The subscription ID for this subscription. */ + Upnp_SID Sid; + + /** The event sequence number. */ + int EventKey; + + /** The DOM tree representing the changes generating the event. */ + IXML_Document *ChangedVariables; + +}; + +/** Returned along with a {\bf UPNP_EVENT_SUBSCRIBE_COMPLETE} or {\bf + * UPNP_EVENT_UNSUBSCRIBE_COMPLETE} callback. */ + +struct Upnp_Event_Subscribe { + + /** The SID for this subscription. For subscriptions, this only + * contains a valid SID if the {\bf Upnp_EventSubscribe.result} field + * contains a {\tt UPNP_E_SUCCESS} result code. For unsubscriptions, + * this contains the SID from which the subscription is being + * unsubscribed. */ + + Upnp_SID Sid; + + /** The result of the operation. */ + int ErrCode; + + /** The event URL being subscribed to or removed from. */ + char PublisherUrl[NAME_SIZE]; + + /** The actual subscription time (for subscriptions only). */ + int TimeOut; + +}; + +//@} // Constants, Structures, and Types + +#endif + +// File_checked_for_headers diff --git a/src/extern/wxWidgets/listctrl.cpp b/src/extern/wxWidgets/listctrl.cpp new file mode 100644 index 00000000..a33d132c --- /dev/null +++ b/src/extern/wxWidgets/listctrl.cpp @@ -0,0 +1,5977 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/listctrl.cpp +// Purpose: generic implementation of wxListCtrl +// Author: Robert Roebling +// Vadim Zeitlin (virtual list control support) +// Id: $Id: listctrl.cpp 8201 2008-03-01 22:39:21Z xaignar $ +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// TODO +// +// 1. we need to implement searching/sorting for virtual controls somehow +// 2. when changing selection the lines are refreshed twice + + +// For compilers that support precompilation, includes "wx.h". +#include + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_LISTCTRL + +#include "listctrl.h" + +#ifndef WX_PRECOMP + #include + #include + #include + #include + #include + #include + #include +#endif + +#include +#include +#include +#include + +#ifdef __WXMAC__ + #include +#endif + + +// NOTE: If using the wxListBox visual attributes works everywhere then this can +// be removed, as well as the #else case below. +#define _USE_VISATTR 0 + +namespace MuleExtern { + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// // the height of the header window (FIXME: should depend on its font!) +// static const int HEADER_HEIGHT = 23; + +static const int SCROLL_UNIT_X = 15; + +// the spacing between the lines (in report mode) +static const int LINE_SPACING = 0; + +// extra margins around the text label +#ifdef __WXGTK__ +static const int EXTRA_WIDTH = 6; +#else +static const int EXTRA_WIDTH = 4; +#endif +static const int EXTRA_HEIGHT = 4; + +// margin between the window and the items +static const int EXTRA_BORDER_X = 2; +static const int EXTRA_BORDER_Y = 2; + +// offset for the header window +static const int HEADER_OFFSET_X = 0; +static const int HEADER_OFFSET_Y = 0; + +// margin between rows of icons in [small] icon view +static const int MARGIN_BETWEEN_ROWS = 6; + +// when autosizing the columns, add some slack +static const int AUTOSIZE_COL_MARGIN = 10; + +// default width for the header columns +static const int WIDTH_COL_DEFAULT = 80; + +// the space between the image and the text in the report mode +static const int IMAGE_MARGIN_IN_REPORT_MODE = 5; + +// the space between the image and the text in the report mode in header +static const int HEADER_IMAGE_MARGIN_IN_REPORT_MODE = 2; + +// ============================================================================ +// private classes +// ============================================================================ + +//----------------------------------------------------------------------------- +// wxColWidthInfo (internal) +//----------------------------------------------------------------------------- + +struct wxColWidthInfo +{ + int nMaxWidth; + bool bNeedsUpdate; // only set to true when an item whose + // width == nMaxWidth is removed + + wxColWidthInfo(int w = 0, bool needsUpdate = false) + { + nMaxWidth = w; + bNeedsUpdate = needsUpdate; + } +}; + +WX_DEFINE_ARRAY_PTR(wxColWidthInfo *, ColWidthArray); + +//----------------------------------------------------------------------------- +// wxListItemData (internal) +//----------------------------------------------------------------------------- + +class wxListItemData +{ +public: + wxListItemData(wxListMainWindow *owner); + ~wxListItemData(); + + void SetItem( const wxListItem &info ); + void SetImage( int image ) { m_image = image; } + void SetData( wxUIntPtr data ) { m_data = data; } + void SetPosition( int x, int y ); + void SetSize( int width, int height ); + + bool HasText() const { return !m_text.empty(); } + const wxString& GetText() const { return m_text; } + void SetText(const wxString& text) { m_text = text; } + + // we can't use empty string for measuring the string width/height, so + // always return something + wxString GetTextForMeasuring() const + { + wxString s = GetText(); + if ( s.empty() ) + s = _T('H'); + + return s; + } + + bool IsHit( int x, int y ) const; + + int GetX() const; + int GetY() const; + int GetWidth() const; + int GetHeight() const; + + int GetImage() const { return m_image; } + bool HasImage() const { return GetImage() != -1; } + + void GetItem( wxListItem &info ) const; + + void SetAttr(wxListItemAttr *attr) { m_attr = attr; } + wxListItemAttr *GetAttr() const { return m_attr; } + +public: + // the item image or -1 + int m_image; + + // user data associated with the item + wxUIntPtr m_data; + + // the item coordinates are not used in report mode; instead this pointer is + // NULL and the owner window is used to retrieve the item position and size + wxRect *m_rect; + + // the list ctrl we are in + wxListMainWindow *m_owner; + + // custom attributes or NULL + wxListItemAttr *m_attr; + +protected: + // common part of all ctors + void Init(); + + wxString m_text; +}; + +//----------------------------------------------------------------------------- +// wxListHeaderData (internal) +//----------------------------------------------------------------------------- + +class wxListHeaderData : public wxObject +{ +public: + wxListHeaderData(); + wxListHeaderData( const wxListItem &info ); + void SetItem( const wxListItem &item ); + void SetPosition( int x, int y ); + void SetWidth( int w ); + void SetState( int state ); + void SetFormat( int format ); + void SetHeight( int h ); + bool HasImage() const; + + bool HasText() const { return !m_text.empty(); } + const wxString& GetText() const { return m_text; } + void SetText(const wxString& text) { m_text = text; } + + void GetItem( wxListItem &item ); + + bool IsHit( int x, int y ) const; + int GetImage() const; + int GetWidth() const; + int GetFormat() const; + int GetState() const; + +protected: + long m_mask; + int m_image; + wxString m_text; + int m_format; + int m_width; + int m_xpos, + m_ypos; + int m_height; + int m_state; + +private: + void Init(); +}; + +//----------------------------------------------------------------------------- +// wxListLineData (internal) +//----------------------------------------------------------------------------- + +WX_DECLARE_EXPORTED_LIST(wxListItemData, wxListItemDataList); +#include +WX_DEFINE_LIST(wxListItemDataList) + +class wxListLineData +{ +public: + // the list of subitems: only may have more than one item in report mode + wxListItemDataList m_items; + + // this is not used in report view + struct GeometryInfo + { + // total item rect + wxRect m_rectAll; + + // label only + wxRect m_rectLabel; + + // icon only + wxRect m_rectIcon; + + // the part to be highlighted + wxRect m_rectHighlight; + + // extend all our rects to be centered inside the one of given width + void ExtendWidth(wxCoord w) + { + wxASSERT_MSG( m_rectAll.width <= w, + _T("width can only be increased") ); + + m_rectAll.width = w; + m_rectLabel.x = m_rectAll.x + (w - m_rectLabel.width) / 2; + m_rectIcon.x = m_rectAll.x + (w - m_rectIcon.width) / 2; + m_rectHighlight.x = m_rectAll.x + (w - m_rectHighlight.width) / 2; + } + } + *m_gi; + + // is this item selected? [NB: not used in virtual mode] + bool m_highlighted; + + // back pointer to the list ctrl + wxListMainWindow *m_owner; + +public: + wxListLineData(wxListMainWindow *owner); + + ~wxListLineData() + { + WX_CLEAR_LIST(wxListItemDataList, m_items); + delete m_gi; + } + + // are we in report mode? + inline bool InReportView() const; + + // are we in virtual report mode? + inline bool IsVirtual() const; + + // these 2 methods shouldn't be called for report view controls, in that + // case we determine our position/size ourselves + + // calculate the size of the line + void CalculateSize( wxDC *dc, int spacing ); + + // remember the position this line appears at + void SetPosition( int x, int y, int spacing ); + + // wxListCtrl API + + void SetImage( int image ) { SetImage(0, image); } + int GetImage() const { return GetImage(0); } + void SetImage( int index, int image ); + int GetImage( int index ) const; + + bool HasImage() const { return GetImage() != -1; } + bool HasText() const { return !GetText(0).empty(); } + + void SetItem( int index, const wxListItem &info ); + void GetItem( int index, wxListItem &info ); + + wxString GetText(int index) const; + void SetText( int index, const wxString& s ); + + wxListItemAttr *GetAttr() const; + void SetAttr(wxListItemAttr *attr); + + // return true if the highlighting really changed + bool Highlight( bool on ); + + void ReverseHighlight(); + + bool IsHighlighted() const + { + wxASSERT_MSG( !IsVirtual(), _T("unexpected call to IsHighlighted") ); + + return m_highlighted; + } + + // draw the line on the given DC in icon/list mode + void Draw( wxDC *dc ); + + // the same in report mode + void DrawInReportMode( wxDC *dc, + const wxRect& rect, + const wxRect& rectHL, + bool highlighted ); + +private: + // set the line to contain num items (only can be > 1 in report mode) + void InitItems( int num ); + + // get the mode (i.e. style) of the list control + inline int GetMode() const; + + // prepare the DC for drawing with these item's attributes, return true if + // we need to draw the items background to highlight it, false otherwise + bool SetAttributes(wxDC *dc, + const wxListItemAttr *attr, + bool highlight); + + // draw the text on the DC with the correct justification; also add an + // ellipsis if the text is too large to fit in the current width + void DrawTextFormatted(wxDC *dc, + const wxString &text, + int col, + int x, + int yMid, // this is middle, not top, of the text + int width); +}; + +WX_DECLARE_EXPORTED_OBJARRAY(wxListLineData, wxListLineDataArray); +#include +WX_DEFINE_OBJARRAY(wxListLineDataArray) + +//----------------------------------------------------------------------------- +// wxListHeaderWindow (internal) +//----------------------------------------------------------------------------- + +class wxListHeaderWindow : public wxWindow +{ +protected: + wxListMainWindow *m_owner; + const wxCursor *m_currentCursor; + wxCursor *m_resizeCursor; + bool m_isDragging; + + // column being resized or -1 + int m_column; + + // divider line position in logical (unscrolled) coords + int m_currentX; + + // minimal position beyond which the divider line + // can't be dragged in logical coords + int m_minX; + +public: + wxListHeaderWindow(); + + wxListHeaderWindow( wxWindow *win, + wxWindowID id, + wxListMainWindow *owner, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = 0, + const wxString &name = wxT("wxlistctrlcolumntitles") ); + + virtual ~wxListHeaderWindow(); + + void DrawCurrent(); + void AdjustDC( wxDC& dc ); + + void OnPaint( wxPaintEvent &event ); + void OnMouse( wxMouseEvent &event ); + void OnSetFocus( wxFocusEvent &event ); + + // needs refresh + bool m_dirty; + +private: + // common part of all ctors + void Init(); + + // generate and process the list event of the given type, return true if + // it wasn't vetoed, i.e. if we should proceed + bool SendListEvent(wxEventType type, const wxPoint& pos); + + DECLARE_EVENT_TABLE() +}; + +//----------------------------------------------------------------------------- +// wxListRenameTimer (internal) +//----------------------------------------------------------------------------- + +class wxListRenameTimer: public wxTimer +{ +private: + wxListMainWindow *m_owner; + +public: + wxListRenameTimer( wxListMainWindow *owner ); + void Notify(); +}; + +//----------------------------------------------------------------------------- +// wxListTextCtrlWrapper: wraps a wxTextCtrl to make it work for inline editing +//----------------------------------------------------------------------------- + +class wxListTextCtrlWrapper : public wxEvtHandler +{ +public: + // NB: text must be a valid object but not Create()d yet + wxListTextCtrlWrapper(wxListMainWindow *owner, + wxTextCtrl *text, + size_t itemEdit); + + wxTextCtrl *GetText() const { return m_text; } + + void AcceptChangesAndFinish(); + +protected: + void OnChar( wxKeyEvent &event ); + void OnKeyUp( wxKeyEvent &event ); + void OnKillFocus( wxFocusEvent &event ); + + bool AcceptChanges(); + void Finish(); + +private: + wxListMainWindow *m_owner; + wxTextCtrl *m_text; + wxString m_startValue; + size_t m_itemEdited; + bool m_finished; + bool m_aboutToFinish; + + DECLARE_EVENT_TABLE() +}; + +//----------------------------------------------------------------------------- +// wxListMainWindow (internal) +//----------------------------------------------------------------------------- + +WX_DECLARE_EXPORTED_LIST(wxListHeaderData, wxListHeaderDataList); +#include +WX_DEFINE_LIST(wxListHeaderDataList) + +class wxListMainWindow : public wxScrolledWindow +{ +public: + wxListMainWindow(); + wxListMainWindow( wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString &name = _T("listctrlmainwindow") ); + + virtual ~wxListMainWindow(); + + bool HasFlag(int flag) const { return m_parent->HasFlag(flag); } + + // return true if this is a virtual list control + bool IsVirtual() const { return HasFlag(wxLC_VIRTUAL); } + + // return true if the control is in report mode + bool InReportView() const { return HasFlag(wxLC_REPORT); } + + // return true if we are in single selection mode, false if multi sel + bool IsSingleSel() const { return HasFlag(wxLC_SINGLE_SEL); } + + // do we have a header window? + bool HasHeader() const + { return InReportView() && !HasFlag(wxLC_NO_HEADER); } + + void HighlightAll( bool on ); + + // all these functions only do something if the line is currently visible + + // change the line "selected" state, return true if it really changed + bool HighlightLine( size_t line, bool highlight = true); + + // as HighlightLine() but do it for the range of lines: this is incredibly + // more efficient for virtual list controls! + // + // NB: unlike HighlightLine() this one does refresh the lines on screen + void HighlightLines( size_t lineFrom, size_t lineTo, bool on = true ); + + // toggle the line state and refresh it + void ReverseHighlight( size_t line ) + { HighlightLine(line, !IsHighlighted(line)); RefreshLine(line); } + + // return true if the line is highlighted + bool IsHighlighted(size_t line) const; + + // refresh one or several lines at once + void RefreshLine( size_t line ); + void RefreshLines( size_t lineFrom, size_t lineTo ); + + // refresh all selected items + void RefreshSelected(); + + // refresh all lines below the given one: the difference with + // RefreshLines() is that the index here might not be a valid one (happens + // when the last line is deleted) + void RefreshAfter( size_t lineFrom ); + + // the methods which are forwarded to wxListLineData itself in list/icon + // modes but are here because the lines don't store their positions in the + // report mode + + // get the bound rect for the entire line + wxRect GetLineRect(size_t line) const; + + // get the bound rect of the label + wxRect GetLineLabelRect(size_t line) const; + + // get the bound rect of the items icon (only may be called if we do have + // an icon!) + wxRect GetLineIconRect(size_t line) const; + + // get the rect to be highlighted when the item has focus + wxRect GetLineHighlightRect(size_t line) const; + + // get the size of the total line rect + wxSize GetLineSize(size_t line) const + { return GetLineRect(line).GetSize(); } + + // return the hit code for the corresponding position (in this line) + long HitTestLine(size_t line, int x, int y) const; + + // bring the selected item into view, scrolling to it if necessary + void MoveToItem(size_t item); + + // bring the current item into view + void MoveToFocus() { MoveToItem(m_current); } + + // start editing the label of the given item + wxTextCtrl *EditLabel(long item, + wxClassInfo* textControlClass = CLASSINFO(wxTextCtrl)); + wxTextCtrl *GetEditControl() const + { + return m_textctrlWrapper ? m_textctrlWrapper->GetText() : NULL; + } + + void FinishEditing(wxTextCtrl *text) + { + delete text; + m_textctrlWrapper = NULL; + SetFocusIgnoringChildren(); + } + + // suspend/resume redrawing the control + void Freeze(); + void Thaw(); + + void OnRenameTimer(); + bool OnRenameAccept(size_t itemEdit, const wxString& value); + void OnRenameCancelled(size_t itemEdit); + + void OnMouse( wxMouseEvent &event ); + + // called to switch the selection from the current item to newCurrent, + void OnArrowChar( size_t newCurrent, const wxKeyEvent& event ); + + void OnChar( wxKeyEvent &event ); + void OnKeyDown( wxKeyEvent &event ); + void OnKeyUp( wxKeyEvent &event ); + void OnSetFocus( wxFocusEvent &event ); + void OnKillFocus( wxFocusEvent &event ); + void OnScroll( wxScrollWinEvent& event ); + + void OnPaint( wxPaintEvent &event ); + void OnErase( wxEraseEvent& event ) { + // This is needed to avoid garbage on empty lists. + if ( IsEmpty() ) { + event.Skip(); + } + } + + void DrawImage( int index, wxDC *dc, int x, int y ); + void GetImageSize( int index, int &width, int &height ) const; + int GetTextLength( const wxString &s ) const; + + void SetImageList( wxImageList *imageList, int which ); + void SetItemSpacing( int spacing, bool isSmall = false ); + int GetItemSpacing( bool isSmall = false ); + + void SetColumn( int col, wxListItem &item ); + void SetColumnWidth( int col, int width ); + void GetColumn( int col, wxListItem &item ) const; + int GetColumnWidth( int col ) const; + int GetColumnCount() const { return m_columns.GetCount(); } + + // returns the sum of the heights of all columns + int GetHeaderWidth() const; + + int GetCountPerPage() const; + + void SetItem( wxListItem &item ); + void GetItem( wxListItem &item ) const; + void SetItemState( long item, long state, long stateMask ); + void SetItemStateAll( long state, long stateMask ); + int GetItemState( long item, long stateMask ) const; + void GetItemRect( long index, wxRect &rect ) const; + wxRect GetViewRect() const; + bool GetItemPosition( long item, wxPoint& pos ) const; + int GetSelectedItemCount() const; + + wxString GetItemText(long item) const + { + wxListItem info; + info.m_mask = wxLIST_MASK_TEXT; + info.m_itemId = item; + GetItem( info ); + return info.m_text; + } + + void SetItemText(long item, const wxString& value) + { + wxListItem info; + info.m_mask = wxLIST_MASK_TEXT; + info.m_itemId = item; + info.m_text = value; + SetItem( info ); + } + + // set the scrollbars and update the positions of the items + void RecalculatePositions(bool noRefresh = false); + + // refresh the window and the header + void RefreshAll(); + + long GetNextItem( long item, int geometry, int state ) const; + void DeleteItem( long index ); + void DeleteAllItems(); + void DeleteColumn( int col ); + void DeleteEverything(); + void EnsureVisible( long index ); + long FindItem( long start, const wxString& str, bool partial = false ); + long FindItem( long start, wxUIntPtr data); + long FindItem( const wxPoint& pt ); + long HitTest( int x, int y, int &flags ) const; + void InsertItem( wxListItem &item ); + void InsertColumn( long col, wxListItem &item ); + int GetItemWidthWithImage(wxListItem * item); + void SortItems( MuleListCtrlCompare fn, long data ); + + size_t GetItemCount() const; + bool IsEmpty() const { return GetItemCount() == 0; } + void SetItemCount(long count); + + // change the current (== focused) item, send a notification event + void ChangeCurrent(size_t current); + void ResetCurrent() { ChangeCurrent((size_t)-1); } + bool HasCurrent() const { return m_current != (size_t)-1; } + + // send out a wxListEvent + void SendNotify( size_t line, + wxEventType command, + const wxPoint& point = wxDefaultPosition ); + + // override base class virtual to reset m_lineHeight when the font changes + virtual bool SetFont(const wxFont& font) + { + if ( !wxScrolledWindow::SetFont(font) ) + return false; + + m_lineHeight = 0; + + return true; + } + + // these are for wxListLineData usage only + + // get the backpointer to the list ctrl + wxGenericListCtrl *GetListCtrl() const + { + return wxStaticCast(GetParent(), wxGenericListCtrl); + } + + // get the height of all lines (assuming they all do have the same height) + wxCoord GetLineHeight() const; + + // get the y position of the given line (only for report view) + wxCoord GetLineY(size_t line) const; + + // get the brush to use for the item highlighting + wxBrush *GetHighlightBrush() const + { + return m_hasFocus ? m_highlightBrush : m_highlightUnfocusedBrush; + } + + bool HasFocus() const + { + return m_hasFocus; + } + +//protected: + // the array of all line objects for a non virtual list control (for the + // virtual list control we only ever use m_lines[0]) + wxListLineDataArray m_lines; + + // the list of column objects + wxListHeaderDataList m_columns; + + // currently focused item or -1 + size_t m_current; + + // the number of lines per page + int m_linesPerPage; + + // this flag is set when something which should result in the window + // redrawing happens (i.e. an item was added or deleted, or its appearance + // changed) and OnPaint() doesn't redraw the window while it is set which + // allows to minimize the number of repaintings when a lot of items are + // being added. The real repainting occurs only after the next OnIdle() + // call + bool m_dirty; + + wxColour *m_highlightColour; + wxImageList *m_small_image_list; + wxImageList *m_normal_image_list; + int m_small_spacing; + int m_normal_spacing; + bool m_hasFocus; + + bool m_lastOnSame; + wxTimer *m_renameTimer; + bool m_isCreated; + int m_dragCount; + wxPoint m_dragStart; + ColWidthArray m_aColWidths; + + // for double click logic + size_t m_lineLastClicked, + m_lineBeforeLastClicked, + m_lineSelectSingleOnUp; + +protected: + wxWindow *GetMainWindowOfCompositeControl() { return GetParent(); } + + // the total count of items in a virtual list control + size_t m_countVirt; + + // the object maintaining the items selection state, only used in virtual + // controls + wxSelectionStore m_selStore; + + // common part of all ctors + void Init(); + + // get the line data for the given index + wxListLineData *GetLine(size_t n) const + { + wxASSERT_MSG( n != (size_t)-1, _T("invalid line index") ); + + if ( IsVirtual() ) + { + wxConstCast(this, wxListMainWindow)->CacheLineData(n); + n = 0; + } + + return &m_lines[n]; + } + + // get a dummy line which can be used for geometry calculations and such: + // you must use GetLine() if you want to really draw the line + wxListLineData *GetDummyLine() const; + + // cache the line data of the n-th line in m_lines[0] + void CacheLineData(size_t line); + + // get the range of visible lines + void GetVisibleLinesRange(size_t *from, size_t *to); + + // force us to recalculate the range of visible lines + void ResetVisibleLinesRange() { m_lineFrom = (size_t)-1; } + + // get the colour to be used for drawing the rules + wxColour GetRuleColour() const + { + return wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT); + } + +private: + // initialize the current item if needed + void UpdateCurrent(); + + // delete all items but don't refresh: called from dtor + void DoDeleteAllItems(); + + // the height of one line using the current font + wxCoord m_lineHeight; + + // the total header width or 0 if not calculated yet + wxCoord m_headerWidth; + + // the first and last lines being shown on screen right now (inclusive), + // both may be -1 if they must be calculated so never access them directly: + // use GetVisibleLinesRange() above instead + size_t m_lineFrom, + m_lineTo; + + // the brushes to use for item highlighting when we do/don't have focus + wxBrush *m_highlightBrush, + *m_highlightUnfocusedBrush; + + // if this is > 0, the control is frozen and doesn't redraw itself + size_t m_freezeCount; + + // wrapper around the text control currently used for in place editing or + // NULL if no item is being edited + wxListTextCtrlWrapper *m_textctrlWrapper; + + + DECLARE_EVENT_TABLE() + + friend class wxGenericListCtrl; +}; + + +wxListItemData::~wxListItemData() +{ + // in the virtual list control the attributes are managed by the main + // program, so don't delete them + if ( !m_owner->IsVirtual() ) + delete m_attr; + + delete m_rect; +} + +void wxListItemData::Init() +{ + m_image = -1; + m_data = 0; + + m_attr = NULL; +} + +wxListItemData::wxListItemData(wxListMainWindow *owner) +{ + Init(); + + m_owner = owner; + + if ( owner->InReportView() ) + m_rect = NULL; + else + m_rect = new wxRect; +} + +void wxListItemData::SetItem( const wxListItem &info ) +{ + if ( info.m_mask & wxLIST_MASK_TEXT ) + SetText(info.m_text); + if ( info.m_mask & wxLIST_MASK_IMAGE ) + m_image = info.m_image; + if ( info.m_mask & wxLIST_MASK_DATA ) + m_data = info.m_data; + + if ( info.HasAttributes() ) + { + if ( m_attr ) + m_attr->AssignFrom(*info.GetAttributes()); + else + m_attr = new wxListItemAttr(*info.GetAttributes()); + } + + if ( m_rect ) + { + m_rect->x = + m_rect->y = + m_rect->height = 0; + m_rect->width = info.m_width; + } +} + +void wxListItemData::SetPosition( int x, int y ) +{ + wxCHECK_RET( m_rect, _T("unexpected SetPosition() call") ); + + m_rect->x = x; + m_rect->y = y; +} + +void wxListItemData::SetSize( int width, int height ) +{ + wxCHECK_RET( m_rect, _T("unexpected SetSize() call") ); + + if ( width != -1 ) + m_rect->width = width; + if ( height != -1 ) + m_rect->height = height; +} + +bool wxListItemData::IsHit( int x, int y ) const +{ + wxCHECK_MSG( m_rect, false, _T("can't be called in this mode") ); + + return wxRect(GetX(), GetY(), GetWidth(), GetHeight()).Contains(x, y); +} + +int wxListItemData::GetX() const +{ + wxCHECK_MSG( m_rect, 0, _T("can't be called in this mode") ); + + return m_rect->x; +} + +int wxListItemData::GetY() const +{ + wxCHECK_MSG( m_rect, 0, _T("can't be called in this mode") ); + + return m_rect->y; +} + +int wxListItemData::GetWidth() const +{ + wxCHECK_MSG( m_rect, 0, _T("can't be called in this mode") ); + + return m_rect->width; +} + +int wxListItemData::GetHeight() const +{ + wxCHECK_MSG( m_rect, 0, _T("can't be called in this mode") ); + + return m_rect->height; +} + +void wxListItemData::GetItem( wxListItem &info ) const +{ + long mask = info.m_mask; + if ( !mask ) + // by default, get everything for backwards compatibility + mask = -1; + + if ( mask & wxLIST_MASK_TEXT ) + info.m_text = m_text; + if ( mask & wxLIST_MASK_IMAGE ) + info.m_image = m_image; + if ( mask & wxLIST_MASK_DATA ) + info.m_data = m_data; + + if ( m_attr ) + { + if ( m_attr->HasTextColour() ) + info.SetTextColour(m_attr->GetTextColour()); + if ( m_attr->HasBackgroundColour() ) + info.SetBackgroundColour(m_attr->GetBackgroundColour()); + if ( m_attr->HasFont() ) + info.SetFont(m_attr->GetFont()); + } +} + +//----------------------------------------------------------------------------- +// wxListHeaderData +//----------------------------------------------------------------------------- + +void wxListHeaderData::Init() +{ + m_mask = 0; + m_image = -1; + m_format = 0; + m_width = 0; + m_xpos = 0; + m_ypos = 0; + m_height = 0; + m_state = 0; +} + +wxListHeaderData::wxListHeaderData() +{ + Init(); +} + +wxListHeaderData::wxListHeaderData( const wxListItem &item ) +{ + Init(); + + SetItem( item ); +} + +void wxListHeaderData::SetItem( const wxListItem &item ) +{ + m_mask = item.m_mask; + + if ( m_mask & wxLIST_MASK_TEXT ) + m_text = item.m_text; + + if ( m_mask & wxLIST_MASK_IMAGE ) + m_image = item.m_image; + + if ( m_mask & wxLIST_MASK_FORMAT ) + m_format = item.m_format; + + if ( m_mask & wxLIST_MASK_WIDTH ) + SetWidth(item.m_width); + + if ( m_mask & wxLIST_MASK_STATE ) + SetState(item.m_state); +} + +void wxListHeaderData::SetPosition( int x, int y ) +{ + m_xpos = x; + m_ypos = y; +} + +void wxListHeaderData::SetHeight( int h ) +{ + m_height = h; +} + +void wxListHeaderData::SetWidth( int w ) +{ + m_width = w < 0 ? WIDTH_COL_DEFAULT : w; +} + +void wxListHeaderData::SetState( int flag ) +{ + m_state = flag; +} + +void wxListHeaderData::SetFormat( int format ) +{ + m_format = format; +} + +bool wxListHeaderData::HasImage() const +{ + return m_image != -1; +} + +bool wxListHeaderData::IsHit( int x, int y ) const +{ + return ((x >= m_xpos) && (x <= m_xpos+m_width) && (y >= m_ypos) && (y <= m_ypos+m_height)); +} + +void wxListHeaderData::GetItem( wxListItem& item ) +{ + item.m_mask = m_mask; + item.m_text = m_text; + item.m_image = m_image; + item.m_format = m_format; + item.m_width = m_width; + item.m_state = m_state; +} + +int wxListHeaderData::GetImage() const +{ + return m_image; +} + +int wxListHeaderData::GetWidth() const +{ + return m_width; +} + +int wxListHeaderData::GetFormat() const +{ + return m_format; +} + +int wxListHeaderData::GetState() const +{ + return m_state; +} + +//----------------------------------------------------------------------------- +// wxListLineData +//----------------------------------------------------------------------------- + +inline int wxListLineData::GetMode() const +{ + return m_owner->GetListCtrl()->GetWindowStyleFlag() & wxLC_MASK_TYPE; +} + +inline bool wxListLineData::InReportView() const +{ + return m_owner->HasFlag(wxLC_REPORT); +} + +inline bool wxListLineData::IsVirtual() const +{ + return m_owner->IsVirtual(); +} + +wxListLineData::wxListLineData( wxListMainWindow *owner ) +{ + m_owner = owner; + + if ( InReportView() ) + m_gi = NULL; + else // !report + m_gi = new GeometryInfo; + + m_highlighted = false; + + InitItems( GetMode() == wxLC_REPORT ? m_owner->GetColumnCount() : 1 ); +} + +void wxListLineData::CalculateSize( wxDC *dc, int spacing ) +{ + wxListItemDataList::compatibility_iterator node = m_items.GetFirst(); + wxCHECK_RET( node, _T("no subitems at all??") ); + + wxListItemData *item = node->GetData(); + + wxString s; + wxCoord lw, lh; + + switch ( GetMode() ) + { + case wxLC_ICON: + case wxLC_SMALL_ICON: + m_gi->m_rectAll.width = spacing; + + s = item->GetText(); + + if ( s.empty() ) + { + lh = + m_gi->m_rectLabel.width = + m_gi->m_rectLabel.height = 0; + } + else // has label + { + dc->GetTextExtent( s, &lw, &lh ); + lw += EXTRA_WIDTH; + lh += EXTRA_HEIGHT; + + m_gi->m_rectAll.height = spacing + lh; + if (lw > spacing) + m_gi->m_rectAll.width = lw; + + m_gi->m_rectLabel.width = lw; + m_gi->m_rectLabel.height = lh; + } + + if (item->HasImage()) + { + int w, h; + m_owner->GetImageSize( item->GetImage(), w, h ); + m_gi->m_rectIcon.width = w + 8; + m_gi->m_rectIcon.height = h + 8; + + if ( m_gi->m_rectIcon.width > m_gi->m_rectAll.width ) + m_gi->m_rectAll.width = m_gi->m_rectIcon.width; + if ( m_gi->m_rectIcon.height + lh > m_gi->m_rectAll.height - 4 ) + m_gi->m_rectAll.height = m_gi->m_rectIcon.height + lh + 4; + } + + if ( item->HasText() ) + { + m_gi->m_rectHighlight.width = m_gi->m_rectLabel.width; + m_gi->m_rectHighlight.height = m_gi->m_rectLabel.height; + } + else // no text, highlight the icon + { + m_gi->m_rectHighlight.width = m_gi->m_rectIcon.width; + m_gi->m_rectHighlight.height = m_gi->m_rectIcon.height; + } + break; + + case wxLC_LIST: + s = item->GetTextForMeasuring(); + + dc->GetTextExtent( s, &lw, &lh ); + lw += EXTRA_WIDTH; + lh += EXTRA_HEIGHT; + + m_gi->m_rectLabel.width = lw; + m_gi->m_rectLabel.height = lh; + + m_gi->m_rectAll.width = lw; + m_gi->m_rectAll.height = lh; + + if (item->HasImage()) + { + int w, h; + m_owner->GetImageSize( item->GetImage(), w, h ); + m_gi->m_rectIcon.width = w; + m_gi->m_rectIcon.height = h; + + m_gi->m_rectAll.width += 4 + w; + if (h > m_gi->m_rectAll.height) + m_gi->m_rectAll.height = h; + } + + m_gi->m_rectHighlight.width = m_gi->m_rectAll.width; + m_gi->m_rectHighlight.height = m_gi->m_rectAll.height; + break; + + case wxLC_REPORT: + wxFAIL_MSG( _T("unexpected call to SetSize") ); + break; + + default: + wxFAIL_MSG( _T("unknown mode") ); + break; + } +} + +void wxListLineData::SetPosition( int x, int y, int spacing ) +{ + wxListItemDataList::compatibility_iterator node = m_items.GetFirst(); + wxCHECK_RET( node, _T("no subitems at all??") ); + + wxListItemData *item = node->GetData(); + + switch ( GetMode() ) + { + case wxLC_ICON: + case wxLC_SMALL_ICON: + m_gi->m_rectAll.x = x; + m_gi->m_rectAll.y = y; + + if ( item->HasImage() ) + { + m_gi->m_rectIcon.x = m_gi->m_rectAll.x + 4 + + (m_gi->m_rectAll.width - m_gi->m_rectIcon.width) / 2; + m_gi->m_rectIcon.y = m_gi->m_rectAll.y + 4; + } + + if ( item->HasText() ) + { + if (m_gi->m_rectAll.width > spacing) + m_gi->m_rectLabel.x = m_gi->m_rectAll.x + (EXTRA_WIDTH/2); + else + m_gi->m_rectLabel.x = m_gi->m_rectAll.x + (EXTRA_WIDTH/2) + (spacing / 2) - (m_gi->m_rectLabel.width / 2); + m_gi->m_rectLabel.y = m_gi->m_rectAll.y + m_gi->m_rectAll.height + 2 - m_gi->m_rectLabel.height; + m_gi->m_rectHighlight.x = m_gi->m_rectLabel.x - 2; + m_gi->m_rectHighlight.y = m_gi->m_rectLabel.y - 2; + } + else // no text, highlight the icon + { + m_gi->m_rectHighlight.x = m_gi->m_rectIcon.x - 4; + m_gi->m_rectHighlight.y = m_gi->m_rectIcon.y - 4; + } + break; + + case wxLC_LIST: + m_gi->m_rectAll.x = x; + m_gi->m_rectAll.y = y; + + m_gi->m_rectHighlight.x = m_gi->m_rectAll.x; + m_gi->m_rectHighlight.y = m_gi->m_rectAll.y; + m_gi->m_rectLabel.y = m_gi->m_rectAll.y + 2; + + if (item->HasImage()) + { + m_gi->m_rectIcon.x = m_gi->m_rectAll.x + 2; + m_gi->m_rectIcon.y = m_gi->m_rectAll.y + 2; + m_gi->m_rectLabel.x = m_gi->m_rectAll.x + 4 + (EXTRA_WIDTH/2) + m_gi->m_rectIcon.width; + } + else + { + m_gi->m_rectLabel.x = m_gi->m_rectAll.x + (EXTRA_WIDTH/2); + } + break; + + case wxLC_REPORT: + wxFAIL_MSG( _T("unexpected call to SetPosition") ); + break; + + default: + wxFAIL_MSG( _T("unknown mode") ); + break; + } +} + +void wxListLineData::InitItems( int num ) +{ + for (int i = 0; i < num; i++) + m_items.Append( new wxListItemData(m_owner) ); +} + +void wxListLineData::SetItem( int index, const wxListItem &info ) +{ + wxListItemDataList::compatibility_iterator node = m_items.Item( index ); + wxCHECK_RET( node, _T("invalid column index in SetItem") ); + + wxListItemData *item = node->GetData(); + item->SetItem( info ); +} + +void wxListLineData::GetItem( int index, wxListItem &info ) +{ + wxListItemDataList::compatibility_iterator node = m_items.Item( index ); + if (node) + { + wxListItemData *item = node->GetData(); + item->GetItem( info ); + } +} + +wxString wxListLineData::GetText(int index) const +{ + wxString s; + + wxListItemDataList::compatibility_iterator node = m_items.Item( index ); + if (node) + { + wxListItemData *item = node->GetData(); + s = item->GetText(); + } + + return s; +} + +void wxListLineData::SetText( int index, const wxString& s ) +{ + wxListItemDataList::compatibility_iterator node = m_items.Item( index ); + if (node) + { + wxListItemData *item = node->GetData(); + item->SetText( s ); + } +} + +void wxListLineData::SetImage( int index, int image ) +{ + wxListItemDataList::compatibility_iterator node = m_items.Item( index ); + wxCHECK_RET( node, _T("invalid column index in SetImage()") ); + + wxListItemData *item = node->GetData(); + item->SetImage(image); +} + +int wxListLineData::GetImage( int index ) const +{ + wxListItemDataList::compatibility_iterator node = m_items.Item( index ); + wxCHECK_MSG( node, -1, _T("invalid column index in GetImage()") ); + + wxListItemData *item = node->GetData(); + return item->GetImage(); +} + +wxListItemAttr *wxListLineData::GetAttr() const +{ + wxListItemDataList::compatibility_iterator node = m_items.GetFirst(); + wxCHECK_MSG( node, NULL, _T("invalid column index in GetAttr()") ); + + wxListItemData *item = node->GetData(); + return item->GetAttr(); +} + +void wxListLineData::SetAttr(wxListItemAttr *attr) +{ + wxListItemDataList::compatibility_iterator node = m_items.GetFirst(); + wxCHECK_RET( node, _T("invalid column index in SetAttr()") ); + + wxListItemData *item = node->GetData(); + item->SetAttr(attr); +} + +bool wxListLineData::SetAttributes(wxDC *dc, + const wxListItemAttr *attr, + bool highlighted) +{ + wxWindow *listctrl = m_owner->GetParent(); + + // fg colour + + // don't use foreground colour for drawing highlighted items - this might + // make them completely invisible (and there is no way to do bit + // arithmetics on wxColour, unfortunately) + wxColour colText; + if ( highlighted ) +#ifdef __WXMAC__ + { + if (m_owner->HasFocus() +#ifdef __WXMAC__ + && IsControlActive( (ControlRef)m_owner->GetHandle() ) +#endif + ) + colText = *wxWHITE; + else + colText = *wxBLACK; + } +#else + colText = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT); +#endif + else if ( attr && attr->HasTextColour() ) + colText = attr->GetTextColour(); + else + colText = listctrl->GetForegroundColour(); + + dc->SetTextForeground(colText); + + // font + wxFont font; + if ( attr && attr->HasFont() ) + font = attr->GetFont(); + else + font = listctrl->GetFont(); + + dc->SetFont(font); + + // bg colour + bool hasBgCol = attr && attr->HasBackgroundColour(); + if ( highlighted || hasBgCol ) + { + if ( highlighted ) + dc->SetBrush( *m_owner->GetHighlightBrush() ); + else + dc->SetBrush(wxBrush(attr->GetBackgroundColour(), wxSOLID)); + + dc->SetPen( *wxTRANSPARENT_PEN ); + + return true; + } + + return false; +} + +void wxListLineData::Draw( wxDC *dc ) +{ + wxListItemDataList::compatibility_iterator node = m_items.GetFirst(); + wxCHECK_RET( node, _T("no subitems at all??") ); + + bool highlighted = IsHighlighted(); + + wxListItemAttr *attr = GetAttr(); + + if ( SetAttributes(dc, attr, highlighted) ) +#if ( !defined(__WXGTK20__) && !defined(__WXMAC__) ) + { + dc->DrawRectangle( m_gi->m_rectHighlight ); + } +#else + { + if (highlighted) + { + int flags = wxCONTROL_SELECTED; + if (m_owner->HasFocus() +#ifdef __WXMAC__ + && IsControlActive( (ControlRef)m_owner->GetHandle() ) +#endif + ) + flags |= wxCONTROL_FOCUSED; + wxRendererNative::Get().DrawItemSelectionRect( m_owner, *dc, m_gi->m_rectHighlight, flags ); + + } + else + { + dc->DrawRectangle( m_gi->m_rectHighlight ); + } + } +#endif + + // just for debugging to better see where the items are +#if 0 + dc->SetPen(*wxRED_PEN); + dc->SetBrush(*wxTRANSPARENT_BRUSH); + dc->DrawRectangle( m_gi->m_rectAll ); + dc->SetPen(*wxGREEN_PEN); + dc->DrawRectangle( m_gi->m_rectIcon ); +#endif + + wxListItemData *item = node->GetData(); + if (item->HasImage()) + { + // centre the image inside our rectangle, this looks nicer when items + // ae aligned in a row + const wxRect& rectIcon = m_gi->m_rectIcon; + + m_owner->DrawImage(item->GetImage(), dc, rectIcon.x, rectIcon.y); + } + + if (item->HasText()) + { + const wxRect& rectLabel = m_gi->m_rectLabel; + + wxDCClipper clipper(*dc, rectLabel); + dc->DrawText(item->GetText(), rectLabel.x, rectLabel.y); + } +} + +void wxListLineData::DrawInReportMode( wxDC *dc, + const wxRect& rect, + const wxRect& rectHL, + bool highlighted ) +{ + // TODO: later we should support setting different attributes for + // different columns - to do it, just add "col" argument to + // GetAttr() and move these lines into the loop below + wxListItemAttr *attr = GetAttr(); + if ( SetAttributes(dc, attr, highlighted) ) +#if ( !defined(__WXGTK20__) && !defined(__WXMAC__) ) + { + dc->DrawRectangle( rectHL ); + } +#else + { + if (highlighted) + { + int flags = wxCONTROL_SELECTED; + if (m_owner->HasFocus() +#ifdef __WXMAC__ + && IsControlActive( (ControlRef)m_owner->GetHandle() ) +#endif + ) + flags |= wxCONTROL_FOCUSED; + wxRendererNative::Get().DrawItemSelectionRect( m_owner, *dc, rectHL, flags ); + } + else + { + dc->DrawRectangle( rectHL ); + } + } +#endif + + wxCoord x = rect.x + HEADER_OFFSET_X, + yMid = rect.y + rect.height/2; +#ifdef __WXGTK__ + // This probably needs to be done + // on all platforms as the icons + // otherwise nearly touch the border + x += 2; +#endif + + size_t col = 0; + for ( wxListItemDataList::compatibility_iterator node = m_items.GetFirst(); + node; + node = node->GetNext(), col++ ) + { + wxListItemData *item = node->GetData(); + + int width = m_owner->GetColumnWidth(col); + int xOld = x; + x += width; + + // Fix for a bug in wxWidgets. + // This has been reported as patch 1898914: + // http://sourceforge.net/tracker/index.php?func=detail&aid=1898914&group_id=9863&atid=309863 + // + // Prevents the drawing of images into the + // next collumn, in case of small widths. + wxDCClipper clipper(*dc, xOld, rect.y, width - 8, rect.height); + + if ( item->HasImage() ) + { + int ix, iy; + m_owner->GetImageSize( item->GetImage(), ix, iy ); + m_owner->DrawImage( item->GetImage(), dc, xOld, yMid - iy/2 ); + + ix += IMAGE_MARGIN_IN_REPORT_MODE; + + xOld += ix; + width -= ix; + } + + if ( item->HasText() ) + DrawTextFormatted(dc, item->GetText(), col, xOld, yMid, width - 8); + } +} + +void wxListLineData::DrawTextFormatted(wxDC *dc, + const wxString& textOrig, + int col, + int x, + int yMid, + int width) +{ + // we don't support displaying multiple lines currently (and neither does + // wxMSW FWIW) so just merge all the lines + wxString text(textOrig); + text.Replace(_T("\n"), _T(" ")); + + wxCoord w, h; + dc->GetTextExtent(text, &w, &h); + + const wxCoord y = yMid - (h + 1)/2; + + wxDCClipper clipper(*dc, x, y, width, h); + + // determine if the string can fit inside the current width + if (w <= width) + { + // it can, draw it using the items alignment + wxListItem item; + m_owner->GetColumn(col, item); + switch ( item.GetAlign() ) + { + case wxLIST_FORMAT_LEFT: + // nothing to do + break; + + case wxLIST_FORMAT_RIGHT: + x += width - w; + break; + + case wxLIST_FORMAT_CENTER: + x += (width - w) / 2; + break; + + default: + wxFAIL_MSG( _T("unknown list item format") ); + break; + } + + dc->DrawText(text, x, y); + } + else // otherwise, truncate and add an ellipsis if possible + { + // determine the base width + wxString ellipsis(wxT("...")); + wxCoord base_w; + dc->GetTextExtent(ellipsis, &base_w, &h); + + // continue until we have enough space or only one character left + wxCoord w_c, h_c; + size_t len = text.length(); + wxString drawntext = text.Left(len); + while (len > 1) + { + dc->GetTextExtent(drawntext.Last(), &w_c, &h_c); + drawntext.RemoveLast(); + len--; + w -= w_c; + if (w + base_w <= width) + break; + } + + // if still not enough space, remove ellipsis characters + while (ellipsis.length() > 0 && w + base_w > width) + { + ellipsis = ellipsis.Left(ellipsis.length() - 1); + dc->GetTextExtent(ellipsis, &base_w, &h); + } + + // now draw the text + dc->DrawText(drawntext, x, y); + dc->DrawText(ellipsis, x + w, y); + } +} + +bool wxListLineData::Highlight( bool on ) +{ + wxCHECK_MSG( !IsVirtual(), false, _T("unexpected call to Highlight") ); + + if ( on == m_highlighted ) + return false; + + m_highlighted = on; + + return true; +} + +void wxListLineData::ReverseHighlight( void ) +{ + Highlight(!IsHighlighted()); +} + +//----------------------------------------------------------------------------- +// wxListHeaderWindow +//----------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxListHeaderWindow,wxWindow) + EVT_PAINT (wxListHeaderWindow::OnPaint) + EVT_MOUSE_EVENTS (wxListHeaderWindow::OnMouse) + EVT_SET_FOCUS (wxListHeaderWindow::OnSetFocus) +END_EVENT_TABLE() + +void wxListHeaderWindow::Init() +{ + m_currentCursor = (wxCursor *) NULL; + m_isDragging = false; + m_dirty = false; +} + +wxListHeaderWindow::wxListHeaderWindow() +{ + Init(); + + m_owner = (wxListMainWindow *) NULL; + m_resizeCursor = (wxCursor *) NULL; +} + +wxListHeaderWindow::wxListHeaderWindow( wxWindow *win, + wxWindowID id, + wxListMainWindow *owner, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString &name ) + : wxWindow( win, id, pos, size, style, name ) +{ + Init(); + + m_owner = owner; + m_resizeCursor = new wxCursor( wxCURSOR_SIZEWE ); + +#if _USE_VISATTR + wxVisualAttributes attr = wxPanel::GetClassDefaultAttributes(); + SetOwnForegroundColour( attr.colFg ); + SetOwnBackgroundColour( attr.colBg ); + if (!m_hasFont) + SetOwnFont( attr.font ); +#else + SetOwnForegroundColour( wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); + SetOwnBackgroundColour( wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)); + if (!m_hasFont) + SetOwnFont( wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT )); +#endif +} + +wxListHeaderWindow::~wxListHeaderWindow() +{ + delete m_resizeCursor; +} + +#ifdef __WXUNIVERSAL__ +#include +#include +#endif + +// shift the DC origin to match the position of the main window horz +// scrollbar: this allows us to always use logical coords +void wxListHeaderWindow::AdjustDC(wxDC& dc) +{ + int xpix; + m_owner->GetScrollPixelsPerUnit( &xpix, NULL ); + + int view_start; + m_owner->GetViewStart( &view_start, NULL ); + + + int org_x = 0; + int org_y = 0; + dc.GetDeviceOrigin( &org_x, &org_y ); + + // account for the horz scrollbar offset +#ifdef __WXGTK__ + if (GetLayoutDirection() == wxLayout_RightToLeft) + { + // Maybe we just have to check for m_signX + // in the DC, but I leave the #ifdef __WXGTK__ + // for now + dc.SetDeviceOrigin( org_x + (view_start * xpix), org_y ); + } + else +#endif + dc.SetDeviceOrigin( org_x - (view_start * xpix), org_y ); +} + +void wxListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) +{ + wxPaintDC dc( this ); + + PrepareDC( dc ); + AdjustDC( dc ); + + dc.SetFont( GetFont() ); + + // width and height of the entire header window + int w, h; + GetClientSize( &w, &h ); + m_owner->CalcUnscrolledPosition(w, 0, &w, NULL); + + dc.SetBackgroundMode(wxTRANSPARENT); + dc.SetTextForeground(GetForegroundColour()); + + int x = HEADER_OFFSET_X; + int numColumns = m_owner->GetColumnCount(); + wxListItem item; + for ( int i = 0; i < numColumns && x < w; i++ ) + { + m_owner->GetColumn( i, item ); + int wCol = item.m_width; + + int cw = wCol; + int ch = h; + + int flags = 0; + if (!m_parent->IsEnabled()) + flags |= wxCONTROL_DISABLED; + +// NB: The code below is not really Mac-specific, but since we are close +// to 2.8 release and I don't have time to test on other platforms, I +// defined this only for wxMac. If this behavior is desired on +// other platforms, please go ahead and revise or remove the #ifdef. +#ifdef __WXMAC__ + if ( !m_owner->IsVirtual() && (item.m_mask & wxLIST_MASK_STATE) && + (item.m_state & wxLIST_STATE_SELECTED) ) + flags |= wxCONTROL_SELECTED; +#endif + + wxRendererNative::Get().DrawHeaderButton + ( + this, + dc, + wxRect(x, HEADER_OFFSET_Y, cw, ch), + flags + ); + + // see if we have enough space for the column label + + // for this we need the width of the text + wxCoord wLabel; + wxCoord hLabel; + dc.GetTextExtent(item.GetText(), &wLabel, &hLabel); + wLabel += 2 * EXTRA_WIDTH; + + // and the width of the icon, if any + int ix = 0, iy = 0; // init them just to suppress the compiler warnings + const int image = item.m_image; + wxImageList *imageList; + if ( image != -1 ) + { + imageList = m_owner->m_small_image_list; + if ( imageList ) + { + imageList->GetSize(image, ix, iy); + wLabel += ix + HEADER_IMAGE_MARGIN_IN_REPORT_MODE; + } + } + else + { + imageList = NULL; + } + + // ignore alignment if there is not enough space anyhow + int xAligned; + switch ( wLabel < cw ? item.GetAlign() : wxLIST_FORMAT_LEFT ) + { + default: + wxFAIL_MSG( _T("unknown list item format") ); + // fall through + + case wxLIST_FORMAT_LEFT: + xAligned = x; + break; + + case wxLIST_FORMAT_RIGHT: + xAligned = x + cw - wLabel; + break; + + case wxLIST_FORMAT_CENTER: + xAligned = x + (cw - wLabel) / 2; + break; + } + + // draw the text and image clipping them so that they + // don't overwrite the column boundary + wxDCClipper clipper(dc, x, HEADER_OFFSET_Y, cw, h ); + + // if we have an image, draw it on the right of the label + if ( imageList ) + { + imageList->Draw + ( + image, + dc, + xAligned + wLabel - ix - HEADER_IMAGE_MARGIN_IN_REPORT_MODE, + HEADER_OFFSET_Y + (h - 4 - iy)/2, + wxIMAGELIST_DRAW_TRANSPARENT + ); + } + + dc.DrawText( item.GetText(), + xAligned + EXTRA_WIDTH, h / 2 - hLabel / 2 ); //HEADER_OFFSET_Y + EXTRA_HEIGHT ); + + x += wCol; + } +} + +void wxListHeaderWindow::DrawCurrent() +{ +#if 1 + m_owner->SetColumnWidth( m_column, m_currentX - m_minX ); +#else + int x1 = m_currentX; + int y1 = 0; + m_owner->ClientToScreen( &x1, &y1 ); + + int x2 = m_currentX; + int y2 = 0; + m_owner->GetClientSize( NULL, &y2 ); + m_owner->ClientToScreen( &x2, &y2 ); + + wxScreenDC dc; + dc.SetLogicalFunction( wxINVERT ); + dc.SetPen( wxPen( *wxBLACK, 2, wxSOLID ) ); + dc.SetBrush( *wxTRANSPARENT_BRUSH ); + + AdjustDC(dc); + + dc.DrawLine( x1, y1, x2, y2 ); + + dc.SetLogicalFunction( wxCOPY ); + + dc.SetPen( wxNullPen ); + dc.SetBrush( wxNullBrush ); +#endif +} + +void wxListHeaderWindow::OnMouse( wxMouseEvent &event ) +{ + // we want to work with logical coords + int x; + m_owner->CalcUnscrolledPosition(event.GetX(), 0, &x, NULL); + int y = event.GetY(); + + if (m_isDragging) + { + SendListEvent(wxEVT_COMMAND_LIST_COL_DRAGGING, event.GetPosition()); + + // we don't draw the line beyond our window, but we allow dragging it + // there + int w = 0; + GetClientSize( &w, NULL ); + m_owner->CalcUnscrolledPosition(w, 0, &w, NULL); + w -= 6; + + // erase the line if it was drawn + if ( m_currentX < w ) + DrawCurrent(); + + if (event.ButtonUp()) + { + ReleaseMouse(); + m_isDragging = false; + m_dirty = true; + m_owner->SetColumnWidth( m_column, m_currentX - m_minX ); + SendListEvent(wxEVT_COMMAND_LIST_COL_END_DRAG, event.GetPosition()); + } + else + { + if (x > m_minX + 7) + m_currentX = x; + else + m_currentX = m_minX + 7; + + // draw in the new location + if ( m_currentX < w ) + DrawCurrent(); + } + } + else // not dragging + { + m_minX = 0; + bool hit_border = false; + + // end of the current column + int xpos = 0; + + // find the column where this event occurred + int col, + countCol = m_owner->GetColumnCount(); + for (col = 0; col < countCol; col++) + { + xpos += m_owner->GetColumnWidth( col ); + m_column = col; + + if ( (abs(x-xpos) < 3) && (y < 22) ) + { + // near the column border + hit_border = true; + break; + } + + if ( x < xpos ) + { + // inside the column + break; + } + + m_minX = xpos; + } + + if ( col == countCol ) + m_column = -1; + + if (event.LeftDown() || event.RightUp()) + { + if (hit_border && event.LeftDown()) + { + if ( SendListEvent(wxEVT_COMMAND_LIST_COL_BEGIN_DRAG, + event.GetPosition()) ) + { + m_isDragging = true; + m_currentX = x; + CaptureMouse(); + DrawCurrent(); + } + //else: column resizing was vetoed by the user code + } + else // click on a column + { + // record the selected state of the columns + if (event.LeftDown()) + { + for (int i=0; i < m_owner->GetColumnCount(); i++) + { + wxListItem colItem; + m_owner->GetColumn(i, colItem); + long state = colItem.GetState(); + if (i == m_column) + colItem.SetState(state | wxLIST_STATE_SELECTED); + else + colItem.SetState(state & ~wxLIST_STATE_SELECTED); + m_owner->SetColumn(i, colItem); + } + } + + SendListEvent( event.LeftDown() + ? wxEVT_COMMAND_LIST_COL_CLICK + : wxEVT_COMMAND_LIST_COL_RIGHT_CLICK, + event.GetPosition()); + } + } + else if (event.Moving()) + { + bool setCursor; + if (hit_border) + { + setCursor = m_currentCursor == wxSTANDARD_CURSOR; + m_currentCursor = m_resizeCursor; + } + else + { + setCursor = m_currentCursor != wxSTANDARD_CURSOR; + m_currentCursor = wxSTANDARD_CURSOR; + } + + if ( setCursor ) + SetCursor(*m_currentCursor); + } + } +} + +void wxListHeaderWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) ) +{ + m_owner->SetFocus(); + m_owner->Update(); +} + +bool wxListHeaderWindow::SendListEvent(wxEventType type, const wxPoint& pos) +{ + wxWindow *parent = GetParent(); + wxListEvent le( type, parent->GetId() ); + le.SetEventObject( parent ); + le.m_pointDrag = pos; + + // the position should be relative to the parent window, not + // this one for compatibility with MSW and common sense: the + // user code doesn't know anything at all about this header + // window, so why should it get positions relative to it? + le.m_pointDrag.y -= GetSize().y; + + le.m_col = m_column; + return !parent->GetEventHandler()->ProcessEvent( le ) || le.IsAllowed(); +} + +//----------------------------------------------------------------------------- +// wxListRenameTimer (internal) +//----------------------------------------------------------------------------- + +wxListRenameTimer::wxListRenameTimer( wxListMainWindow *owner ) +{ + m_owner = owner; +} + +void wxListRenameTimer::Notify() +{ + m_owner->OnRenameTimer(); +} + +//----------------------------------------------------------------------------- +// wxListTextCtrlWrapper (internal) +//----------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxListTextCtrlWrapper, wxEvtHandler) + EVT_CHAR (wxListTextCtrlWrapper::OnChar) + EVT_KEY_UP (wxListTextCtrlWrapper::OnKeyUp) + EVT_KILL_FOCUS (wxListTextCtrlWrapper::OnKillFocus) +END_EVENT_TABLE() + +wxListTextCtrlWrapper::wxListTextCtrlWrapper(wxListMainWindow *owner, + wxTextCtrl *text, + size_t itemEdit) + : m_startValue(owner->GetItemText(itemEdit)), + m_itemEdited(itemEdit) +{ + m_owner = owner; + m_text = text; + m_finished = false; + m_aboutToFinish = false; + + wxRect rectLabel = owner->GetLineLabelRect(itemEdit); + + m_owner->CalcScrolledPosition(rectLabel.x, rectLabel.y, + &rectLabel.x, &rectLabel.y); + + m_text->Create(owner, wxID_ANY, m_startValue, + wxPoint(rectLabel.x-4,rectLabel.y-4), + wxSize(rectLabel.width+11,rectLabel.height+8)); + m_text->SetFocus(); + + m_text->PushEventHandler(this); +} + +void wxListTextCtrlWrapper::Finish() +{ + if ( !m_finished ) + { + m_finished = true; + + m_text->RemoveEventHandler(this); + m_owner->FinishEditing(m_text); + + wxPendingDelete.Append( this ); + } +} + +bool wxListTextCtrlWrapper::AcceptChanges() +{ + const wxString value = m_text->GetValue(); + + // notice that we should always call OnRenameAccept() to generate the "end + // label editing" event, even if the user hasn't really changed anything + if ( !m_owner->OnRenameAccept(m_itemEdited, value) ) + { + // vetoed by the user + return false; + } + + // accepted, do rename the item (unless nothing changed) + if ( value != m_startValue ) + m_owner->SetItemText(m_itemEdited, value); + + return true; +} + +void wxListTextCtrlWrapper::AcceptChangesAndFinish() +{ + m_aboutToFinish = true; + + // Notify the owner about the changes + AcceptChanges(); + + // Even if vetoed, close the control (consistent with MSW) + Finish(); +} + +void wxListTextCtrlWrapper::OnChar( wxKeyEvent &event ) +{ + switch ( event.m_keyCode ) + { + case WXK_RETURN: + AcceptChangesAndFinish(); + break; + + case WXK_ESCAPE: + m_owner->OnRenameCancelled( m_itemEdited ); + Finish(); + break; + + default: + event.Skip(); + } +} + +void wxListTextCtrlWrapper::OnKeyUp( wxKeyEvent &event ) +{ + if (m_finished) + { + event.Skip(); + return; + } + + // auto-grow the textctrl: + wxSize parentSize = m_owner->GetSize(); + wxPoint myPos = m_text->GetPosition(); + wxSize mySize = m_text->GetSize(); + int sx, sy; + m_text->GetTextExtent(m_text->GetValue() + _T("MM"), &sx, &sy); + if (myPos.x + sx > parentSize.x) + sx = parentSize.x - myPos.x; + if (mySize.x > sx) + sx = mySize.x; + m_text->SetSize(sx, wxDefaultCoord); + + event.Skip(); +} + +void wxListTextCtrlWrapper::OnKillFocus( wxFocusEvent &event ) +{ + if ( !m_finished && !m_aboutToFinish ) + { + if ( !AcceptChanges() ) + m_owner->OnRenameCancelled( m_itemEdited ); + + Finish(); + } + + // We must let the native text control handle focus + event.Skip(); +} + +//----------------------------------------------------------------------------- +// wxListMainWindow +//----------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxListMainWindow,wxScrolledWindow) + EVT_PAINT (wxListMainWindow::OnPaint) + EVT_ERASE_BACKGROUND (wxListMainWindow::OnErase) + EVT_MOUSE_EVENTS (wxListMainWindow::OnMouse) + EVT_CHAR (wxListMainWindow::OnChar) + EVT_KEY_DOWN (wxListMainWindow::OnKeyDown) + EVT_KEY_UP (wxListMainWindow::OnKeyUp) + EVT_SET_FOCUS (wxListMainWindow::OnSetFocus) + EVT_KILL_FOCUS (wxListMainWindow::OnKillFocus) + EVT_SCROLLWIN (wxListMainWindow::OnScroll) +END_EVENT_TABLE() + +void wxListMainWindow::Init() +{ + m_dirty = true; + m_countVirt = 0; + m_lineFrom = + m_lineTo = (size_t)-1; + m_linesPerPage = 0; + + m_headerWidth = + m_lineHeight = 0; + + m_small_image_list = (wxImageList *) NULL; + m_normal_image_list = (wxImageList *) NULL; + + m_small_spacing = 30; + m_normal_spacing = 40; + + m_hasFocus = false; + m_dragCount = 0; + m_isCreated = false; + + m_lastOnSame = false; + m_renameTimer = new wxListRenameTimer( this ); + m_textctrlWrapper = NULL; + + m_current = + m_lineLastClicked = + m_lineSelectSingleOnUp = + m_lineBeforeLastClicked = (size_t)-1; + + m_freezeCount = 0; +} + +wxListMainWindow::wxListMainWindow() +{ + Init(); + + m_highlightBrush = + m_highlightUnfocusedBrush = (wxBrush *) NULL; +} + +wxListMainWindow::wxListMainWindow( wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString &name ) + : wxScrolledWindow( parent, id, pos, size, + style | wxHSCROLL | wxVSCROLL, name ) +{ + Init(); + + m_highlightBrush = new wxBrush + ( + wxSystemSettings::GetColour + ( + wxSYS_COLOUR_HIGHLIGHT + ), + wxSOLID + ); + + m_highlightUnfocusedBrush = new wxBrush + ( + wxSystemSettings::GetColour + ( + wxSYS_COLOUR_BTNSHADOW + ), + wxSOLID + ); + + SetScrollbars( 0, 0, 0, 0, 0, 0 ); + + wxVisualAttributes attr = wxGenericListCtrl::GetClassDefaultAttributes(); + SetOwnForegroundColour( attr.colFg ); + SetOwnBackgroundColour( attr.colBg ); + if (!m_hasFont) + SetOwnFont( attr.font ); +} + +wxListMainWindow::~wxListMainWindow() +{ + DoDeleteAllItems(); + WX_CLEAR_LIST(wxListHeaderDataList, m_columns); + WX_CLEAR_ARRAY(m_aColWidths); + + delete m_highlightBrush; + delete m_highlightUnfocusedBrush; + delete m_renameTimer; +} + +void wxListMainWindow::CacheLineData(size_t line) +{ + wxGenericListCtrl *listctrl = GetListCtrl(); + + wxListLineData *ld = GetDummyLine(); + + size_t countCol = GetColumnCount(); + for ( size_t col = 0; col < countCol; col++ ) + { + ld->SetText(col, listctrl->OnGetItemText(line, col)); + ld->SetImage(col, listctrl->OnGetItemColumnImage(line, col)); + } + + ld->SetAttr(listctrl->OnGetItemAttr(line)); +} + +wxListLineData *wxListMainWindow::GetDummyLine() const +{ + wxASSERT_MSG( !IsEmpty(), _T("invalid line index") ); + wxASSERT_MSG( IsVirtual(), _T("GetDummyLine() shouldn't be called") ); + + wxListMainWindow *self = wxConstCast(this, wxListMainWindow); + + // we need to recreate the dummy line if the number of columns in the + // control changed as it would have the incorrect number of fields + // otherwise + if ( !m_lines.IsEmpty() && + m_lines[0].m_items.GetCount() != (size_t)GetColumnCount() ) + { + self->m_lines.Clear(); + } + + if ( m_lines.IsEmpty() ) + { + wxListLineData *line = new wxListLineData(self); + self->m_lines.Add(line); + + // don't waste extra memory -- there never going to be anything + // else/more in this array + self->m_lines.Shrink(); + } + + return &m_lines[0]; +} + +// ---------------------------------------------------------------------------- +// line geometry (report mode only) +// ---------------------------------------------------------------------------- + +wxCoord wxListMainWindow::GetLineHeight() const +{ + // we cache the line height as calling GetTextExtent() is slow + if ( !m_lineHeight ) + { + wxListMainWindow *self = wxConstCast(this, wxListMainWindow); + + wxClientDC dc( self ); + dc.SetFont( GetFont() ); + + wxCoord y; + dc.GetTextExtent(_T("H"), NULL, &y); + + if ( m_small_image_list && m_small_image_list->GetImageCount() ) + { + int iw = 0, ih = 0; + m_small_image_list->GetSize(0, iw, ih); + y = wxMax(y, ih); + } + + y += EXTRA_HEIGHT; + self->m_lineHeight = y + LINE_SPACING; + } + + return m_lineHeight; +} + +wxCoord wxListMainWindow::GetLineY(size_t line) const +{ + wxASSERT_MSG( InReportView(), _T("only works in report mode") ); + + return LINE_SPACING + line * GetLineHeight(); +} + +wxRect wxListMainWindow::GetLineRect(size_t line) const +{ + if ( !InReportView() ) + return GetLine(line)->m_gi->m_rectAll; + + wxRect rect; + rect.x = HEADER_OFFSET_X; + rect.y = GetLineY(line); + rect.width = GetHeaderWidth(); + rect.height = GetLineHeight(); + + return rect; +} + +wxRect wxListMainWindow::GetLineLabelRect(size_t line) const +{ + if ( !InReportView() ) + return GetLine(line)->m_gi->m_rectLabel; + + int image_x = 0; + wxListLineData *data = GetLine(line); + wxListItemDataList::compatibility_iterator node = data->m_items.GetFirst(); + if (node) + { + wxListItemData *item = node->GetData(); + if ( item->HasImage() ) + { + int ix, iy; + GetImageSize( item->GetImage(), ix, iy ); + image_x = 3 + ix + IMAGE_MARGIN_IN_REPORT_MODE; + } + } + + wxRect rect; + rect.x = image_x + HEADER_OFFSET_X; + rect.y = GetLineY(line); + rect.width = GetColumnWidth(0) - image_x; + rect.height = GetLineHeight(); + + return rect; +} + +wxRect wxListMainWindow::GetLineIconRect(size_t line) const +{ + if ( !InReportView() ) + return GetLine(line)->m_gi->m_rectIcon; + + wxListLineData *ld = GetLine(line); + wxASSERT_MSG( ld->HasImage(), _T("should have an image") ); + + wxRect rect; + rect.x = HEADER_OFFSET_X; + rect.y = GetLineY(line); + GetImageSize(ld->GetImage(), rect.width, rect.height); + + return rect; +} + +wxRect wxListMainWindow::GetLineHighlightRect(size_t line) const +{ + return InReportView() ? GetLineRect(line) + : GetLine(line)->m_gi->m_rectHighlight; +} + +long wxListMainWindow::HitTestLine(size_t line, int x, int y) const +{ + wxASSERT_MSG( line < GetItemCount(), _T("invalid line in HitTestLine") ); + + wxListLineData *ld = GetLine(line); + + if ( ld->HasImage() && GetLineIconRect(line).Contains(x, y) ) + return wxLIST_HITTEST_ONITEMICON; + + // VS: Testing for "ld->HasText() || InReportView()" instead of + // "ld->HasText()" is needed to make empty lines in report view + // possible + if ( ld->HasText() || InReportView() ) + { + wxRect rect = InReportView() ? GetLineRect(line) + : GetLineLabelRect(line); + + if ( rect.Contains(x, y) ) + return wxLIST_HITTEST_ONITEMLABEL; + } + + return 0; +} + +// ---------------------------------------------------------------------------- +// highlight (selection) handling +// ---------------------------------------------------------------------------- + +bool wxListMainWindow::IsHighlighted(size_t line) const +{ + if ( IsVirtual() ) + { + return m_selStore.IsSelected(line); + } + else // !virtual + { + wxListLineData *ld = GetLine(line); + wxCHECK_MSG( ld, false, _T("invalid index in IsHighlighted") ); + + return ld->IsHighlighted(); + } +} + +void wxListMainWindow::HighlightLines( size_t lineFrom, + size_t lineTo, + bool highlight ) +{ + if ( IsVirtual() ) + { + wxArrayInt linesChanged; + if ( !m_selStore.SelectRange(lineFrom, lineTo, highlight, + &linesChanged) ) + { + // meny items changed state, refresh everything + RefreshLines(lineFrom, lineTo); + } + else // only a few items changed state, refresh only them + { + size_t count = linesChanged.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + RefreshLine(linesChanged[n]); + } + } + } + else // iterate over all items in non report view + { + for ( size_t line = lineFrom; line <= lineTo; line++ ) + { + if ( HighlightLine(line, highlight) ) + RefreshLine(line); + } + } +} + +bool wxListMainWindow::HighlightLine( size_t line, bool highlight ) +{ + bool changed; + + if ( IsVirtual() ) + { + changed = m_selStore.SelectItem(line, highlight); + } + else // !virtual + { + wxListLineData *ld = GetLine(line); + wxCHECK_MSG( ld, false, _T("invalid index in HighlightLine") ); + + changed = ld->Highlight(highlight); + } + + if ( changed ) + { + SendNotify( line, highlight ? wxEVT_COMMAND_LIST_ITEM_SELECTED + : wxEVT_COMMAND_LIST_ITEM_DESELECTED ); + } + + return changed; +} + +void wxListMainWindow::RefreshLine( size_t line ) +{ + if ( InReportView() ) + { + size_t visibleFrom, visibleTo; + GetVisibleLinesRange(&visibleFrom, &visibleTo); + + if ( line < visibleFrom || line > visibleTo ) + return; + } + + wxRect rect = GetLineRect(line); + + CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); + RefreshRect( rect ); +} + +void wxListMainWindow::RefreshLines( size_t lineFrom, size_t lineTo ) +{ + // we suppose that they are ordered by caller + wxASSERT_MSG( lineFrom <= lineTo, _T("indices in disorder") ); + + wxASSERT_MSG( lineTo < GetItemCount(), _T("invalid line range") ); + + if ( InReportView() ) + { + size_t visibleFrom, visibleTo; + GetVisibleLinesRange(&visibleFrom, &visibleTo); + + if ( lineFrom < visibleFrom ) + lineFrom = visibleFrom; + if ( lineTo > visibleTo ) + lineTo = visibleTo; + + wxRect rect; + rect.x = 0; + rect.y = GetLineY(lineFrom); + rect.width = GetClientSize().x; + rect.height = GetLineY(lineTo) - rect.y + GetLineHeight(); + + CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); + RefreshRect( rect ); + } + else // !report + { + // TODO: this should be optimized... + for ( size_t line = lineFrom; line <= lineTo; line++ ) + { + RefreshLine(line); + } + } +} + +void wxListMainWindow::RefreshAfter( size_t lineFrom ) +{ + if ( InReportView() ) + { + size_t visibleFrom, visibleTo; + GetVisibleLinesRange(&visibleFrom, &visibleTo); + + if ( lineFrom < visibleFrom ) + lineFrom = visibleFrom; + else if ( lineFrom > visibleTo ) + return; + + wxRect rect; + rect.x = 0; + rect.y = GetLineY(lineFrom); + CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); + + wxSize size = GetClientSize(); + rect.width = size.x; + + // refresh till the bottom of the window + rect.height = size.y - rect.y; + + RefreshRect( rect ); + } + else // !report + { + // TODO: how to do it more efficiently? + m_dirty = true; + } +} + +void wxListMainWindow::RefreshSelected() +{ + if ( IsEmpty() ) + return; + + size_t from, to; + if ( InReportView() ) + { + GetVisibleLinesRange(&from, &to); + } + else // !virtual + { + from = 0; + to = GetItemCount() - 1; + } + + if ( HasCurrent() && m_current >= from && m_current <= to ) + RefreshLine(m_current); + + for ( size_t line = from; line <= to; line++ ) + { + // NB: the test works as expected even if m_current == -1 + if ( line != m_current && IsHighlighted(line) ) + RefreshLine(line); + } +} + +void wxListMainWindow::Freeze() +{ + m_freezeCount++; +} + +void wxListMainWindow::Thaw() +{ + wxCHECK_RET( m_freezeCount > 0, _T("thawing unfrozen list control?") ); + + if ( --m_freezeCount == 0 ) + Refresh(); +} + +void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) +{ + // wxBufferedPaintDC falls over in the case of dimensions that + // are zero, as cann happen when a splitter is moved so that + // the entire window is hidden (e.g. on the transfers window). + // + // This has been reported as patch #1899643: + // http://sourceforge.net/tracker/index.php?func=detail&aid=1899643&group_id=9863&atid=309863 + wxSize size = GetClientSize(); + if ((size.x <= 0) || (size.y <= 0)) { + wxPaintDC dc(this); + return; + } + + // Note: a wxPaintDC must be constructed even if no drawing is + // done (a Windows requirement). + wxBufferedPaintDC dc( this ); + + // Ensure an uniform background color, as to avoid differences between + // the automatically cleared parts and the rest of the canvas. + dc.SetBackground(*(wxTheBrushList->FindOrCreateBrush( + wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOX), wxSOLID))); + + if ( m_freezeCount ) + return; + + if ( m_dirty ) + // delay the repainting until we calculate all the items positions + return; + + PrepareDC( dc ); + + // We need to clear the DC manually, since we intercept BG-erase events. + dc.Clear(); + + // IsEmpty is checked now, after clearing, to avoid garbage on empty lists. + if ( IsEmpty() ) { + return; + } + + int dev_x, dev_y; + CalcScrolledPosition( 0, 0, &dev_x, &dev_y ); + + dc.SetFont( GetFont() ); + + if ( InReportView() ) + { + int lineHeight = GetLineHeight(); + + size_t visibleFrom, visibleTo; + GetVisibleLinesRange(&visibleFrom, &visibleTo); + + wxRect rectLine; + int xOrig = dc.LogicalToDeviceX( 0 ); + int yOrig = dc.LogicalToDeviceY( 0 ); + + // tell the caller cache to cache the data + if ( IsVirtual() ) + { + wxListEvent evCache(wxEVT_COMMAND_LIST_CACHE_HINT, + GetParent()->GetId()); + evCache.SetEventObject( GetParent() ); + evCache.m_oldItemIndex = visibleFrom; + evCache.m_itemIndex = visibleTo; + GetParent()->GetEventHandler()->ProcessEvent( evCache ); + } + + for ( size_t line = visibleFrom; line <= visibleTo; line++ ) + { + rectLine = GetLineRect(line); + + + if ( !IsExposed(rectLine.x + xOrig, rectLine.y + yOrig, + rectLine.width, rectLine.height) ) + { + // don't redraw unaffected lines to avoid flicker + continue; + } + + if (HasFlag(wxLC_OWNERDRAW)) { + ((wxGenericListCtrl*)m_parent)->OnDrawItem(line, &dc, rectLine, GetLineHighlightRect(line), IsHighlighted(line)); + } else { + GetLine(line)->DrawInReportMode( &dc, + rectLine, + GetLineHighlightRect(line), + IsHighlighted(line) ); + } + } + + if ( HasFlag(wxLC_HRULES) ) + { + wxPen pen(GetRuleColour(), 1, wxSOLID); + wxSize clientSize = GetClientSize(); + + size_t i = visibleFrom; + if (i == 0) i = 1; // Don't draw the first one + for ( ; i <= visibleTo; i++ ) + { + dc.SetPen(pen); + dc.SetBrush( *wxTRANSPARENT_BRUSH ); + dc.DrawLine(0 - dev_x, i * lineHeight, + clientSize.x - dev_x, i * lineHeight); + } + + // Draw last horizontal rule + if ( visibleTo == GetItemCount() - 1 ) + { + dc.SetPen( pen ); + dc.SetBrush( *wxTRANSPARENT_BRUSH ); + dc.DrawLine(0 - dev_x, (m_lineTo + 1) * lineHeight, + clientSize.x - dev_x , (m_lineTo + 1) * lineHeight ); + } + } + + // Draw vertical rules if required + if ( HasFlag(wxLC_VRULES) && !IsEmpty() ) + { + wxPen pen(GetRuleColour(), 1, wxSOLID); + wxRect firstItemRect, lastItemRect; + + GetItemRect(visibleFrom, firstItemRect); + GetItemRect(visibleTo, lastItemRect); + int x = firstItemRect.GetX(); + dc.SetPen(pen); + dc.SetBrush(* wxTRANSPARENT_BRUSH); + + for (int col = 0; col < GetColumnCount(); col++) + { + int colWidth = GetColumnWidth(col); + x += colWidth; + int x_pos = x - dev_x; + if (col < GetColumnCount()-1) x_pos -= 2; + dc.DrawLine(x_pos, firstItemRect.GetY() - 1 - dev_y, + x_pos, lastItemRect.GetBottom() + 1 - dev_y); + } + } + } + else // !report + { + size_t count = GetItemCount(); + for ( size_t i = 0; i < count; i++ ) + { + GetLine(i)->Draw( &dc ); + } + } + +#ifndef __WXMAC__ + // Don't draw rect outline under Mac at all. + if ( HasCurrent() ) + { + if ( m_hasFocus ) + { + wxRect rect( GetLineHighlightRect( m_current ) ); +#ifndef __WXGTK20__ + dc.SetPen( *wxBLACK_PEN ); + dc.SetBrush( *wxTRANSPARENT_BRUSH ); + dc.DrawRectangle( rect ); +#else + wxRendererNative::Get().DrawItemSelectionRect( this, dc, rect, wxCONTROL_CURRENT|wxCONTROL_FOCUSED ); + +#endif + } + } +#endif +} + +void wxListMainWindow::HighlightAll( bool on ) +{ + if ( IsSingleSel() ) + { + wxASSERT_MSG( !on, _T("can't do this in a single selection control") ); + + // we just have one item to turn off + if ( HasCurrent() && IsHighlighted(m_current) ) + { + HighlightLine(m_current, false); + RefreshLine(m_current); + } + } + else // multi selection + { + if ( !IsEmpty() ) + HighlightLines(0, GetItemCount() - 1, on); + } +} + +void wxListMainWindow::SendNotify( size_t line, + wxEventType command, + const wxPoint& point ) +{ + wxListEvent le( command, GetParent()->GetId() ); + le.SetEventObject( GetParent() ); + + le.m_itemIndex = line; + + // set only for events which have position + if ( point != wxDefaultPosition ) + le.m_pointDrag = point; + + // don't try to get the line info for virtual list controls: the main + // program has it anyhow and if we did it would result in accessing all + // the lines, even those which are not visible now and this is precisely + // what we're trying to avoid + if ( !IsVirtual() ) + { + if ( line != (size_t)-1 ) + { + GetLine(line)->GetItem( 0, le.m_item ); + } + //else: this happens for wxEVT_COMMAND_LIST_ITEM_FOCUSED event + } + //else: there may be no more such item + + GetParent()->GetEventHandler()->ProcessEvent( le ); +} + +void wxListMainWindow::ChangeCurrent(size_t current) +{ + m_current = current; + + // as the current item changed, we shouldn't start editing it when the + // "slow click" timer expires as the click happened on another item + if ( m_renameTimer->IsRunning() ) + m_renameTimer->Stop(); + + SendNotify(current, wxEVT_COMMAND_LIST_ITEM_FOCUSED); +} + +wxTextCtrl *wxListMainWindow::EditLabel(long item, wxClassInfo* textControlClass) +{ + wxCHECK_MSG( (item >= 0) && ((size_t)item < GetItemCount()), NULL, + wxT("wrong index in wxGenericListCtrl::EditLabel()") ); + + wxASSERT_MSG( textControlClass->IsKindOf(CLASSINFO(wxTextCtrl)), + wxT("EditLabel() needs a text control") ); + + size_t itemEdit = (size_t)item; + + wxListEvent le( wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT, GetParent()->GetId() ); + le.SetEventObject( GetParent() ); + le.m_itemIndex = item; + wxListLineData *data = GetLine(itemEdit); + wxCHECK_MSG( data, NULL, _T("invalid index in EditLabel()") ); + data->GetItem( 0, le.m_item ); + + if ( GetParent()->GetEventHandler()->ProcessEvent( le ) && !le.IsAllowed() ) + { + // vetoed by user code + return NULL; + } + + // We have to call this here because the label in question might just have + // been added and no screen update taken place. + if ( m_dirty ) + { + wxSafeYield(); + + // Pending events dispatched by wxSafeYield might have changed the item + // count + if ( (size_t)item >= GetItemCount() ) + return NULL; + } + + wxTextCtrl * const text = (wxTextCtrl *)textControlClass->CreateObject(); + m_textctrlWrapper = new wxListTextCtrlWrapper(this, text, item); + return m_textctrlWrapper->GetText(); +} + +void wxListMainWindow::OnRenameTimer() +{ + wxCHECK_RET( HasCurrent(), wxT("unexpected rename timer") ); + + EditLabel( m_current ); +} + +bool wxListMainWindow::OnRenameAccept(size_t itemEdit, const wxString& value) +{ + wxListEvent le( wxEVT_COMMAND_LIST_END_LABEL_EDIT, GetParent()->GetId() ); + le.SetEventObject( GetParent() ); + le.m_itemIndex = itemEdit; + + wxListLineData *data = GetLine(itemEdit); + + wxCHECK_MSG( data, false, _T("invalid index in OnRenameAccept()") ); + + data->GetItem( 0, le.m_item ); + le.m_item.m_text = value; + return !GetParent()->GetEventHandler()->ProcessEvent( le ) || + le.IsAllowed(); +} + +void wxListMainWindow::OnRenameCancelled(size_t itemEdit) +{ + // let owner know that the edit was cancelled + wxListEvent le( wxEVT_COMMAND_LIST_END_LABEL_EDIT, GetParent()->GetId() ); + + le.SetEditCanceled(true); + + le.SetEventObject( GetParent() ); + le.m_itemIndex = itemEdit; + + wxListLineData *data = GetLine(itemEdit); + wxCHECK_RET( data, _T("invalid index in OnRenameCancelled()") ); + + data->GetItem( 0, le.m_item ); + GetEventHandler()->ProcessEvent( le ); +} + +void wxListMainWindow::OnMouse( wxMouseEvent &event ) +{ + +#ifdef __WXMAC__ + // On wxMac we can't depend on the EVT_KILL_FOCUS event to properly + // shutdown the edit control when the mouse is clicked elsewhere on the + // listctrl because the order of events is different (or something like + // that), so explicitly end the edit if it is active. + if ( event.LeftDown() && m_textctrlWrapper ) + m_textctrlWrapper->AcceptChangesAndFinish(); +#endif // __WXMAC__ + + if ( event.LeftDown() ) + SetFocusIgnoringChildren(); + + event.SetEventObject( GetParent() ); + if ( GetParent()->GetEventHandler()->ProcessEvent( event) ) + return; + + if (event.GetEventType() == wxEVT_MOUSEWHEEL) + { + // let the base handle mouse wheel events. + event.Skip(); + return; + } + + if ( !HasCurrent() || IsEmpty() ) + { + if (event.RightDown()) + { + SendNotify( (size_t)-1, wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK, event.GetPosition() ); + // Allow generation of context menu event + event.Skip(); + } + return; + } + + if (m_dirty) + return; + + if ( !(event.Dragging() || event.ButtonDown() || event.LeftUp() || + event.ButtonDClick()) ) + return; + + int x = event.GetX(); + int y = event.GetY(); + CalcUnscrolledPosition( x, y, &x, &y ); + + // where did we hit it (if we did)? + long hitResult = 0; + + size_t count = GetItemCount(), + current; + + if ( InReportView() ) + { + current = y / GetLineHeight(); + if ( current < count ) + hitResult = HitTestLine(current, x, y); + } + else // !report + { + // TODO: optimize it too! this is less simple than for report view but + // enumerating all items is still not a way to do it!! + for ( current = 0; current < count; current++ ) + { + hitResult = HitTestLine(current, x, y); + if ( hitResult ) + break; + } + } + + if (event.Dragging()) + { + if (m_dragCount == 0) + { + // we have to report the raw, physical coords as we want to be + // able to call HitTest(event.m_pointDrag) from the user code to + // get the item being dragged + m_dragStart = event.GetPosition(); + } + + m_dragCount++; + + if (m_dragCount != 3) + return; + + int command = event.RightIsDown() ? wxEVT_COMMAND_LIST_BEGIN_RDRAG + : wxEVT_COMMAND_LIST_BEGIN_DRAG; + + wxListEvent le( command, GetParent()->GetId() ); + le.SetEventObject( GetParent() ); + le.m_itemIndex = m_lineLastClicked; + le.m_pointDrag = m_dragStart; + GetParent()->GetEventHandler()->ProcessEvent( le ); + + return; + } + else + { + m_dragCount = 0; + } + + if ( !hitResult ) + { + // outside of any item + if (event.RightDown()) + { + SendNotify( (size_t) -1, wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK, event.GetPosition() ); + + wxContextMenuEvent evtCtx( + wxEVT_CONTEXT_MENU, + GetParent()->GetId(), + ClientToScreen(event.GetPosition())); + evtCtx.SetEventObject(GetParent()); + GetParent()->GetEventHandler()->ProcessEvent(evtCtx); + } + else + { + // reset the selection and bail out + HighlightAll(false); + } + + return; + } + + bool forceClick = false; + if (event.ButtonDClick()) + { + if ( m_renameTimer->IsRunning() ) + m_renameTimer->Stop(); + + m_lastOnSame = false; + + if ( current == m_lineLastClicked ) + { + SendNotify( current, wxEVT_COMMAND_LIST_ITEM_ACTIVATED ); + + return; + } + else + { + // The first click was on another item, so don't interpret this as + // a double click, but as a simple click instead + forceClick = true; + } + } + + if (event.LeftUp()) + { + if (m_lineSelectSingleOnUp != (size_t)-1) + { + // select single line + HighlightAll( false ); + ReverseHighlight(m_lineSelectSingleOnUp); + } + + if (m_lastOnSame) + { + if ((current == m_current) && + (hitResult == wxLIST_HITTEST_ONITEMLABEL) && + HasFlag(wxLC_EDIT_LABELS) ) + { + if (InReportView()) + { + wxRect label = GetLineLabelRect( current ); + if (label.Contains( x, y )) + m_renameTimer->Start( 250, true ); + + } + else + m_renameTimer->Start( 250, true ); + } + } + + m_lastOnSame = false; + m_lineSelectSingleOnUp = (size_t)-1; + } + else + { + // This is necessary, because after a DnD operation in + // from and to ourself, the up event is swallowed by the + // DnD code. So on next non-up event (which means here and + // now) m_lineSelectSingleOnUp should be reset. + m_lineSelectSingleOnUp = (size_t)-1; + } + if (event.RightDown()) + { + m_lineBeforeLastClicked = m_lineLastClicked; + m_lineLastClicked = current; + + // If the item is already selected, do not update the selection. + // Multi-selections should not be cleared if a selected item is clicked. + if (!IsHighlighted(current)) + { + HighlightAll(false); + ChangeCurrent(current); + ReverseHighlight(m_current); + } + + SendNotify( current, wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK, event.GetPosition() ); + + wxContextMenuEvent evtCtx( + wxEVT_CONTEXT_MENU, + GetParent()->GetId(), + ClientToScreen(event.GetPosition())); + evtCtx.SetEventObject(GetParent()); + GetParent()->GetEventHandler()->ProcessEvent(evtCtx); + } + else if (event.MiddleDown()) + { + SendNotify( current, wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK ); + } + else if ( event.LeftDown() || forceClick ) + { + m_lineBeforeLastClicked = m_lineLastClicked; + m_lineLastClicked = current; + + size_t oldCurrent = m_current; + bool oldWasSelected = IsHighlighted(m_current); + + bool cmdModifierDown = event.CmdDown(); + if ( IsSingleSel() || !(cmdModifierDown || event.ShiftDown()) ) + { + if ( IsSingleSel() || !IsHighlighted(current) ) + { + HighlightAll( false ); + + ChangeCurrent(current); + + ReverseHighlight(m_current); + } + else // multi sel & current is highlighted & no mod keys + { + m_lineSelectSingleOnUp = current; + ChangeCurrent(current); // change focus + } + } + else // multi sel & either ctrl or shift is down + { + if (cmdModifierDown) + { + ChangeCurrent(current); + + ReverseHighlight(m_current); + } + else if (event.ShiftDown()) + { + ChangeCurrent(current); + + size_t lineFrom = oldCurrent, + lineTo = current; + + if ( lineTo < lineFrom ) + { + lineTo = lineFrom; + lineFrom = m_current; + } + + HighlightLines(lineFrom, lineTo); + } + else // !ctrl, !shift + { + // test in the enclosing if should make it impossible + wxFAIL_MSG( _T("how did we get here?") ); + } + } + + if (m_current != oldCurrent) + RefreshLine( oldCurrent ); + + // forceClick is only set if the previous click was on another item + m_lastOnSame = !forceClick && (m_current == oldCurrent) && oldWasSelected; + } +} + +void wxListMainWindow::MoveToItem(size_t item) +{ + if ( item == (size_t)-1 ) + return; + + wxRect rect = GetLineRect(item); + + int client_w, client_h; + GetClientSize( &client_w, &client_h ); + + const int hLine = GetLineHeight(); + + int view_x = SCROLL_UNIT_X * GetScrollPos( wxHORIZONTAL ); + int view_y = hLine * GetScrollPos( wxVERTICAL ); + + if ( InReportView() ) + { + // the next we need the range of lines shown it might be different, + // so recalculate it + ResetVisibleLinesRange(); + + if (rect.y < view_y) + Scroll( -1, rect.y / hLine ); + if (rect.y + rect.height + 5 > view_y + client_h) + Scroll( -1, (rect.y + rect.height - client_h + hLine) / hLine ); + +#ifdef __WXMAC__ + // At least on Mac the visible lines value will get reset inside of + // Scroll *before* it actually scrolls the window because of the + // Update() that happens there, so it will still have the wrong value. + // So let's reset it again and wait for it to be recalculated in the + // next paint event. I would expect this problem to show up in wxGTK + // too but couldn't duplicate it there. Perhaps the order of events + // is different... --Robin + ResetVisibleLinesRange(); +#endif + } + else // !report + { + if (rect.x-view_x < 5) + Scroll( (rect.x - 5) / SCROLL_UNIT_X, -1 ); + if (rect.x + rect.width - 5 > view_x + client_w) + Scroll( (rect.x + rect.width - client_w + SCROLL_UNIT_X) / SCROLL_UNIT_X, -1 ); + } +} + +// ---------------------------------------------------------------------------- +// keyboard handling +// ---------------------------------------------------------------------------- + +void wxListMainWindow::OnArrowChar(size_t newCurrent, const wxKeyEvent& event) +{ + wxCHECK_RET( newCurrent < (size_t)GetItemCount(), + _T("invalid item index in OnArrowChar()") ); + + size_t oldCurrent = m_current; + + // in single selection we just ignore Shift as we can't select several + // items anyhow + if ( event.ShiftDown() && !IsSingleSel() ) + { + ChangeCurrent(newCurrent); + + // refresh the old focus to remove it + RefreshLine( oldCurrent ); + + // select all the items between the old and the new one + if ( oldCurrent > newCurrent ) + { + newCurrent = oldCurrent; + oldCurrent = m_current; + } + + HighlightLines(oldCurrent, newCurrent); + } + else // !shift + { + // all previously selected items are unselected unless ctrl is held + // in a multiselection control + if ( !event.ControlDown() || IsSingleSel() ) + HighlightAll(false); + + ChangeCurrent(newCurrent); + + // refresh the old focus to remove it + RefreshLine( oldCurrent ); + + // in single selection mode we must always have a selected item + if ( !event.ControlDown() || IsSingleSel() ) + HighlightLine( m_current, true ); + } + + RefreshLine( m_current ); + + MoveToFocus(); +} + +void wxListMainWindow::OnKeyDown( wxKeyEvent &event ) +{ + wxWindow *parent = GetParent(); + + // propagate the key event upwards + wxKeyEvent ke( wxEVT_KEY_DOWN ); +#if 0 + ke.m_shiftDown = event.m_shiftDown; + ke.m_controlDown = event.m_controlDown; + ke.m_altDown = event.m_altDown; + ke.m_metaDown = event.m_metaDown; + ke.m_keyCode = event.m_keyCode; + ke.m_x = event.m_x; + ke.m_y = event.m_y; +#else + // This is a fix for a bug in wxWidgets, where m_uniChar isn't + // set in the new event object, thus breaking GetUnicodeKey() + // http://sourceforge.net/tracker/index.php?func=detail&aid=1863312&group_id=9863&atid=109863 + ke = event; +#endif + ke.SetEventObject( parent ); + if (parent->GetEventHandler()->ProcessEvent( ke )) return; + + event.Skip(); +} + +void wxListMainWindow::OnKeyUp( wxKeyEvent &event ) +{ + wxWindow *parent = GetParent(); + + // propagate the key event upwards + wxKeyEvent ke( wxEVT_KEY_UP ); +#if 0 + ke.m_shiftDown = event.m_shiftDown; + ke.m_controlDown = event.m_controlDown; + ke.m_altDown = event.m_altDown; + ke.m_metaDown = event.m_metaDown; + ke.m_keyCode = event.m_keyCode; + ke.m_x = event.m_x; + ke.m_y = event.m_y; +#else + // This is a fix for a bug in wxWidgets, where m_uniChar isn't + // set in the new event object, thus breaking GetUnicodeKey() + // http://sourceforge.net/tracker/index.php?func=detail&aid=1863312&group_id=9863&atid=109863 + ke = event; +#endif + ke.SetEventObject( parent ); + if (parent->GetEventHandler()->ProcessEvent( ke )) return; + + event.Skip(); +} + +void wxListMainWindow::OnChar( wxKeyEvent &event ) +{ + wxWindow *parent = GetParent(); + + // send a list_key event up + if ( HasCurrent() ) + { + wxListEvent le( wxEVT_COMMAND_LIST_KEY_DOWN, GetParent()->GetId() ); + le.m_itemIndex = m_current; + GetLine(m_current)->GetItem( 0, le.m_item ); + le.m_code = event.GetKeyCode(); + le.SetEventObject( parent ); + parent->GetEventHandler()->ProcessEvent( le ); + } + + // propagate the char event upwards + wxKeyEvent ke( wxEVT_CHAR ); +#if 0 + ke.m_shiftDown = event.m_shiftDown; + ke.m_controlDown = event.m_controlDown; + ke.m_altDown = event.m_altDown; + ke.m_metaDown = event.m_metaDown; + ke.m_keyCode = event.m_keyCode; + ke.m_x = event.m_x; + ke.m_y = event.m_y; +#else + // This is a fix for a bug in wxWidgets, where m_uniChar isn't + // set in the new event object, thus breaking GetUnicodeKey() + // http://sourceforge.net/tracker/index.php?func=detail&aid=1863312&group_id=9863&atid=109863 + ke = event; +#endif + ke.SetEventObject( parent ); + if (parent->GetEventHandler()->ProcessEvent( ke )) return; + + if (event.GetKeyCode() == WXK_TAB) + { + wxNavigationKeyEvent nevent; + nevent.SetWindowChange( event.ControlDown() ); + nevent.SetDirection( !event.ShiftDown() ); + nevent.SetEventObject( GetParent()->GetParent() ); + nevent.SetCurrentFocus( m_parent ); + if (GetParent()->GetParent()->GetEventHandler()->ProcessEvent( nevent )) + return; + } + + // no item -> nothing to do + if (!HasCurrent()) + { + event.Skip(); + return; + } + + // don't use m_linesPerPage directly as it might not be computed yet + const int pageSize = GetCountPerPage(); + wxCHECK_RET( pageSize, _T("should have non zero page size") ); + + if (GetLayoutDirection() == wxLayout_RightToLeft) + { + if (event.GetKeyCode() == WXK_RIGHT) + event.m_keyCode = WXK_LEFT; + else if (event.GetKeyCode() == WXK_LEFT) + event.m_keyCode = WXK_RIGHT; + } + + switch ( event.GetKeyCode() ) + { + case WXK_UP: + if ( m_current > 0 ) + OnArrowChar( m_current - 1, event ); + break; + + case WXK_DOWN: + if ( m_current < (size_t)GetItemCount() - 1 ) + OnArrowChar( m_current + 1, event ); + break; + + case WXK_END: + if (!IsEmpty()) + OnArrowChar( GetItemCount() - 1, event ); + break; + + case WXK_HOME: + if (!IsEmpty()) + OnArrowChar( 0, event ); + break; + + case WXK_PAGEUP: + { + int steps = InReportView() ? pageSize - 1 + : m_current % pageSize; + + int index = m_current - steps; + if (index < 0) + index = 0; + + OnArrowChar( index, event ); + } + break; + + case WXK_PAGEDOWN: + { + int steps = InReportView() + ? pageSize - 1 + : pageSize - (m_current % pageSize) - 1; + + size_t index = m_current + steps; + size_t count = GetItemCount(); + if ( index >= count ) + index = count - 1; + + OnArrowChar( index, event ); + } + break; + + case WXK_LEFT: + if ( !InReportView() ) + { + int index = m_current - pageSize; + if (index < 0) + index = 0; + + OnArrowChar( index, event ); + } + break; + + case WXK_RIGHT: + if ( !InReportView() ) + { + size_t index = m_current + pageSize; + + size_t count = GetItemCount(); + if ( index >= count ) + index = count - 1; + + OnArrowChar( index, event ); + } + break; + + case WXK_SPACE: + if ( IsSingleSel() ) + { + if ( event.ControlDown() ) + { + ReverseHighlight(m_current); + } + else // normal space press + { + SendNotify( m_current, wxEVT_COMMAND_LIST_ITEM_ACTIVATED ); + } + } + else // multiple selection + { + ReverseHighlight(m_current); + } + break; + + case WXK_RETURN: + case WXK_EXECUTE: + SendNotify( m_current, wxEVT_COMMAND_LIST_ITEM_ACTIVATED ); + break; + + default: + event.Skip(); + } +} + +// ---------------------------------------------------------------------------- +// focus handling +// ---------------------------------------------------------------------------- + +void wxListMainWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) ) +{ + if ( GetParent() ) + { + wxFocusEvent event( wxEVT_SET_FOCUS, GetParent()->GetId() ); + event.SetEventObject( GetParent() ); + if ( GetParent()->GetEventHandler()->ProcessEvent( event) ) + return; + } + + // wxGTK sends us EVT_SET_FOCUS events even if we had never got + // EVT_KILL_FOCUS before which means that we finish by redrawing the items + // which are already drawn correctly resulting in horrible flicker - avoid + // it + if ( !m_hasFocus ) + { + m_hasFocus = true; + + RefreshSelected(); + } +} + +void wxListMainWindow::OnKillFocus( wxFocusEvent &WXUNUSED(event) ) +{ + if ( GetParent() ) + { + wxFocusEvent event( wxEVT_KILL_FOCUS, GetParent()->GetId() ); + event.SetEventObject( GetParent() ); + if ( GetParent()->GetEventHandler()->ProcessEvent( event) ) + return; + } + + m_hasFocus = false; + RefreshSelected(); +} + +void wxListMainWindow::DrawImage( int index, wxDC *dc, int x, int y ) +{ + if ( HasFlag(wxLC_ICON) && (m_normal_image_list)) + { + m_normal_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT ); + } + else if ( HasFlag(wxLC_SMALL_ICON) && (m_small_image_list)) + { + m_small_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT ); + } + else if ( HasFlag(wxLC_LIST) && (m_small_image_list)) + { + m_small_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT ); + } + else if ( InReportView() && (m_small_image_list)) + { + m_small_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT ); + } +} + +void wxListMainWindow::GetImageSize( int index, int &width, int &height ) const +{ + if ( HasFlag(wxLC_ICON) && m_normal_image_list ) + { + m_normal_image_list->GetSize( index, width, height ); + } + else if ( HasFlag(wxLC_SMALL_ICON) && m_small_image_list ) + { + m_small_image_list->GetSize( index, width, height ); + } + else if ( HasFlag(wxLC_LIST) && m_small_image_list ) + { + m_small_image_list->GetSize( index, width, height ); + } + else if ( InReportView() && m_small_image_list ) + { + m_small_image_list->GetSize( index, width, height ); + } + else + { + width = + height = 0; + } +} + +int wxListMainWindow::GetTextLength( const wxString &s ) const +{ + wxClientDC dc( wxConstCast(this, wxListMainWindow) ); + dc.SetFont( GetFont() ); + + wxCoord lw; + dc.GetTextExtent( s, &lw, NULL ); + + return lw + AUTOSIZE_COL_MARGIN; +} + +void wxListMainWindow::SetImageList( wxImageList *imageList, int which ) +{ + m_dirty = true; + + // calc the spacing from the icon size + int width = 0, height = 0; + + if ((imageList) && (imageList->GetImageCount()) ) + imageList->GetSize(0, width, height); + + if (which == wxIMAGE_LIST_NORMAL) + { + m_normal_image_list = imageList; + m_normal_spacing = width + 8; + } + + if (which == wxIMAGE_LIST_SMALL) + { + m_small_image_list = imageList; + m_small_spacing = width + 14; + m_lineHeight = 0; // ensure that the line height will be recalc'd + } +} + +void wxListMainWindow::SetItemSpacing( int spacing, bool isSmall ) +{ + m_dirty = true; + if (isSmall) + m_small_spacing = spacing; + else + m_normal_spacing = spacing; +} + +int wxListMainWindow::GetItemSpacing( bool isSmall ) +{ + return isSmall ? m_small_spacing : m_normal_spacing; +} + +// ---------------------------------------------------------------------------- +// columns +// ---------------------------------------------------------------------------- + +void wxListMainWindow::SetColumn( int col, wxListItem &item ) +{ + wxListHeaderDataList::compatibility_iterator node = m_columns.Item( col ); + + wxCHECK_RET( node, _T("invalid column index in SetColumn") ); + + if ( item.m_width == wxLIST_AUTOSIZE_USEHEADER ) + item.m_width = GetTextLength( item.m_text ); + + wxListHeaderData *column = node->GetData(); + column->SetItem( item ); + + wxListHeaderWindow *headerWin = GetListCtrl()->m_headerWin; + if ( headerWin ) + headerWin->m_dirty = true; + + m_dirty = true; + + // invalidate it as it has to be recalculated + m_headerWidth = 0; +} + +void wxListMainWindow::SetColumnWidth( int col, int width ) +{ + wxCHECK_RET( col >= 0 && col < GetColumnCount(), + _T("invalid column index") ); + + wxCHECK_RET( InReportView(), + _T("SetColumnWidth() can only be called in report mode.") ); + + m_dirty = true; + wxListHeaderWindow *headerWin = GetListCtrl()->m_headerWin; + if ( headerWin ) + headerWin->m_dirty = true; + + wxListHeaderDataList::compatibility_iterator node = m_columns.Item( col ); + wxCHECK_RET( node, _T("no column?") ); + + wxListHeaderData *column = node->GetData(); + + size_t count = GetItemCount(); + + if (width == wxLIST_AUTOSIZE_USEHEADER) + { + width = GetTextLength(column->GetText()); + width += 2*EXTRA_WIDTH; + + // check for column header's image availability + const int image = column->GetImage(); + if ( image != -1 ) + { + if ( m_small_image_list ) + { + int ix = 0, iy = 0; + m_small_image_list->GetSize(image, ix, iy); + width += ix + HEADER_IMAGE_MARGIN_IN_REPORT_MODE; + } + } + } + else if ( width == wxLIST_AUTOSIZE ) + { + if ( IsVirtual() ) + { + // TODO: determine the max width somehow... + width = WIDTH_COL_DEFAULT; + } + else // !virtual + { + wxClientDC dc(this); + dc.SetFont( GetFont() ); + + int max = AUTOSIZE_COL_MARGIN; + + // if the cached column width isn't valid then recalculate it + if (m_aColWidths.Item(col)->bNeedsUpdate) + { + for (size_t i = 0; i < count; i++) + { + wxListLineData *line = GetLine( i ); + wxListItemDataList::compatibility_iterator n = line->m_items.Item( col ); + + wxCHECK_RET( n, _T("no subitem?") ); + + wxListItemData *itemData = n->GetData(); + wxListItem item; + + itemData->GetItem(item); + int itemWidth = GetItemWidthWithImage(&item); + if (itemWidth > max) + max = itemWidth; + } + + m_aColWidths.Item(col)->bNeedsUpdate = false; + m_aColWidths.Item(col)->nMaxWidth = max; + } + + max = m_aColWidths.Item(col)->nMaxWidth; + width = max + AUTOSIZE_COL_MARGIN; + } + } + + column->SetWidth( width ); + + // invalidate it as it has to be recalculated + m_headerWidth = 0; +} + +int wxListMainWindow::GetHeaderWidth() const +{ + if ( !m_headerWidth ) + { + wxListMainWindow *self = wxConstCast(this, wxListMainWindow); + + size_t count = GetColumnCount(); + for ( size_t col = 0; col < count; col++ ) + { + self->m_headerWidth += GetColumnWidth(col); + } + } + + return m_headerWidth; +} + +void wxListMainWindow::GetColumn( int col, wxListItem &item ) const +{ + wxListHeaderDataList::compatibility_iterator node = m_columns.Item( col ); + wxCHECK_RET( node, _T("invalid column index in GetColumn") ); + + wxListHeaderData *column = node->GetData(); + column->GetItem( item ); +} + +int wxListMainWindow::GetColumnWidth( int col ) const +{ + wxListHeaderDataList::compatibility_iterator node = m_columns.Item( col ); + wxCHECK_MSG( node, 0, _T("invalid column index") ); + + wxListHeaderData *column = node->GetData(); + return column->GetWidth(); +} + +// ---------------------------------------------------------------------------- +// item state +// ---------------------------------------------------------------------------- + +void wxListMainWindow::SetItem( wxListItem &item ) +{ + long id = item.m_itemId; + wxCHECK_RET( id >= 0 && (size_t)id < GetItemCount(), + _T("invalid item index in SetItem") ); + + if ( !IsVirtual() ) + { + wxListLineData *line = GetLine((size_t)id); + line->SetItem( item.m_col, item ); + + // Set item state if user wants + if ( item.m_mask & wxLIST_MASK_STATE ) + SetItemState( item.m_itemId, item.m_state, item.m_state ); + + if (InReportView()) + { + // update the Max Width Cache if needed + int width = GetItemWidthWithImage(&item); + + if (width > m_aColWidths.Item(item.m_col)->nMaxWidth) + m_aColWidths.Item(item.m_col)->nMaxWidth = width; + } + } + + // update the item on screen + wxRect rectItem; + GetItemRect(id, rectItem); + RefreshRect(rectItem); +} + +void wxListMainWindow::SetItemStateAll(long state, long stateMask) +{ + if ( IsEmpty() ) + return; + + // first deal with selection + if ( stateMask & wxLIST_STATE_SELECTED ) + { + // set/clear select state + if ( IsVirtual() ) + { + // optimized version for virtual listctrl. + m_selStore.SelectRange(0, GetItemCount() - 1, state == wxLIST_STATE_SELECTED); + Refresh(); + } + else if ( state & wxLIST_STATE_SELECTED ) + { + const long count = GetItemCount(); + for( long i = 0; i < count; i++ ) + { + SetItemState( i, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED ); + } + + } + else + { + // clear for non virtual (somewhat optimized by using GetNextItem()) + long i = -1; + while ( (i = GetNextItem(i, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED)) != -1 ) + { + SetItemState( i, 0, wxLIST_STATE_SELECTED ); + } + } + } + + if ( HasCurrent() && (state == 0) && (stateMask & wxLIST_STATE_FOCUSED) ) + { + // unfocus all: only one item can be focussed, so clearing focus for + // all items is simply clearing focus of the focussed item. + SetItemState(m_current, state, stateMask); + } + //(setting focus to all items makes no sense, so it is not handled here.) +} + +void wxListMainWindow::SetItemState( long litem, long state, long stateMask ) +{ + if ( litem == -1 ) + { + SetItemStateAll(state, stateMask); + return; + } + + wxCHECK_RET( litem >= 0 && (size_t)litem < GetItemCount(), + _T("invalid list ctrl item index in SetItem") ); + + size_t oldCurrent = m_current; + size_t item = (size_t)litem; // safe because of the check above + + // do we need to change the focus? + if ( stateMask & wxLIST_STATE_FOCUSED ) + { + if ( state & wxLIST_STATE_FOCUSED ) + { + // don't do anything if this item is already focused + if ( item != m_current ) + { + ChangeCurrent(item); + + if ( oldCurrent != (size_t)-1 ) + { + if ( IsSingleSel() ) + { + HighlightLine(oldCurrent, false); + } + + RefreshLine(oldCurrent); + } + + RefreshLine( m_current ); + } + } + else // unfocus + { + // don't do anything if this item is not focused + if ( item == m_current ) + { + ResetCurrent(); + + if ( IsSingleSel() ) + { + // we must unselect the old current item as well or we + // might end up with more than one selected item in a + // single selection control + HighlightLine(oldCurrent, false); + } + + RefreshLine( oldCurrent ); + } + } + } + + // do we need to change the selection state? + if ( stateMask & wxLIST_STATE_SELECTED ) + { + bool on = (state & wxLIST_STATE_SELECTED) != 0; + + if ( IsSingleSel() ) + { + if ( on ) + { + // selecting the item also makes it the focused one in the + // single sel mode + if ( m_current != item ) + { + ChangeCurrent(item); + + if ( oldCurrent != (size_t)-1 ) + { + HighlightLine( oldCurrent, false ); + RefreshLine( oldCurrent ); + } + } + } + else // off + { + // only the current item may be selected anyhow + if ( item != m_current ) + return; + } + } + + if ( HighlightLine(item, on) ) + { + RefreshLine(item); + } + } +} + +int wxListMainWindow::GetItemState( long item, long stateMask ) const +{ + wxCHECK_MSG( item >= 0 && (size_t)item < GetItemCount(), 0, + _T("invalid list ctrl item index in GetItemState()") ); + + int ret = wxLIST_STATE_DONTCARE; + + if ( stateMask & wxLIST_STATE_FOCUSED ) + { + if ( (size_t)item == m_current ) + ret |= wxLIST_STATE_FOCUSED; + } + + if ( stateMask & wxLIST_STATE_SELECTED ) + { + if ( IsHighlighted(item) ) + ret |= wxLIST_STATE_SELECTED; + } + + return ret; +} + +void wxListMainWindow::GetItem( wxListItem &item ) const +{ + wxCHECK_RET( item.m_itemId >= 0 && (size_t)item.m_itemId < GetItemCount(), + _T("invalid item index in GetItem") ); + + wxListLineData *line = GetLine((size_t)item.m_itemId); + line->GetItem( item.m_col, item ); + + // Get item state if user wants it + if ( item.m_mask & wxLIST_MASK_STATE ) + item.m_state = GetItemState( item.m_itemId, wxLIST_STATE_SELECTED | + wxLIST_STATE_FOCUSED ); +} + +// ---------------------------------------------------------------------------- +// item count +// ---------------------------------------------------------------------------- + +size_t wxListMainWindow::GetItemCount() const +{ + return IsVirtual() ? m_countVirt : m_lines.GetCount(); +} + +void wxListMainWindow::SetItemCount(long count) +{ + m_selStore.SetItemCount(count); + m_countVirt = count; + + ResetVisibleLinesRange(); + + // scrollbars must be reset + m_dirty = true; +} + +int wxListMainWindow::GetSelectedItemCount() const +{ + // deal with the quick case first + if ( IsSingleSel() ) + return HasCurrent() ? IsHighlighted(m_current) : false; + + // virtual controls remmebers all its selections itself + if ( IsVirtual() ) + return m_selStore.GetSelectedCount(); + + // TODO: we probably should maintain the number of items selected even for + // non virtual controls as enumerating all lines is really slow... + size_t countSel = 0; + size_t count = GetItemCount(); + for ( size_t line = 0; line < count; line++ ) + { + if ( GetLine(line)->IsHighlighted() ) + countSel++; + } + + return countSel; +} + +// ---------------------------------------------------------------------------- +// item position/size +// ---------------------------------------------------------------------------- + +wxRect wxListMainWindow::GetViewRect() const +{ + wxASSERT_MSG( !HasFlag(wxLC_REPORT | wxLC_LIST), + _T("wxListCtrl::GetViewRect() only works in icon mode") ); + + // we need to find the longest/tallest label + wxCoord xMax = 0, yMax = 0; + const int count = GetItemCount(); + if ( count ) + { + for ( int i = 0; i < count; i++ ) + { + wxRect r; + GetItemRect(i, r); + + wxCoord x = r.GetRight(), + y = r.GetBottom(); + + if ( x > xMax ) + xMax = x; + if ( y > yMax ) + yMax = y; + } + } + + // some fudge needed to make it look prettier + xMax += 2 * EXTRA_BORDER_X; + yMax += 2 * EXTRA_BORDER_Y; + + // account for the scrollbars if necessary + const wxSize sizeAll = GetClientSize(); + if ( xMax > sizeAll.x ) + yMax += wxSystemSettings::GetMetric(wxSYS_HSCROLL_Y); + if ( yMax > sizeAll.y ) + xMax += wxSystemSettings::GetMetric(wxSYS_VSCROLL_X); + + return wxRect(0, 0, xMax, yMax); +} + +void wxListMainWindow::GetItemRect( long index, wxRect &rect ) const +{ + wxCHECK_RET( index >= 0 && (size_t)index < GetItemCount(), + _T("invalid index in GetItemRect") ); + + // ensure that we're laid out, otherwise we could return nonsense + if ( m_dirty ) + { + wxConstCast(this, wxListMainWindow)-> + RecalculatePositions(true /* no refresh */); + } + + rect = GetLineRect((size_t)index); + + CalcScrolledPosition(rect.x, rect.y, &rect.x, &rect.y); +} + +bool wxListMainWindow::GetItemPosition(long item, wxPoint& pos) const +{ + wxRect rect; + GetItemRect(item, rect); + + pos.x = rect.x; + pos.y = rect.y; + + return true; +} + +// ---------------------------------------------------------------------------- +// geometry calculation +// ---------------------------------------------------------------------------- + +void wxListMainWindow::RecalculatePositions(bool noRefresh) +{ + const int lineHeight = GetLineHeight(); + + wxClientDC dc( this ); + dc.SetFont( GetFont() ); + + const size_t count = GetItemCount(); + + int iconSpacing; + if ( HasFlag(wxLC_ICON) ) + iconSpacing = m_normal_spacing; + else if ( HasFlag(wxLC_SMALL_ICON) ) + iconSpacing = m_small_spacing; + else + iconSpacing = 0; + + // Note that we do not call GetClientSize() here but + // GetSize() and subtract the border size for sunken + // borders manually. This is technically incorrect, + // but we need to know the client area's size WITHOUT + // scrollbars here. Since we don't know if there are + // any scrollbars, we use GetSize() instead. Another + // solution would be to call SetScrollbars() here to + // remove the scrollbars and call GetClientSize() then, + // but this might result in flicker and - worse - will + // reset the scrollbars to 0 which is not good at all + // if you resize a dialog/window, but don't want to + // reset the window scrolling. RR. + // Furthermore, we actually do NOT subtract the border + // width as 2 pixels is just the extra space which we + // need around the actual content in the window. Other- + // wise the text would e.g. touch the upper border. RR. + int clientWidth, + clientHeight; + GetSize( &clientWidth, &clientHeight ); + + if ( InReportView() ) + { + // all lines have the same height and we scroll one line per step + int entireHeight = count * lineHeight + LINE_SPACING; + + m_linesPerPage = clientHeight / lineHeight; + + ResetVisibleLinesRange(); + + SetScrollbars( SCROLL_UNIT_X, lineHeight, + GetHeaderWidth() / SCROLL_UNIT_X, + (entireHeight + lineHeight - 1) / lineHeight, + GetScrollPos(wxHORIZONTAL), + GetScrollPos(wxVERTICAL), + true ); + } + else // !report + { + // we have 3 different layout strategies: either layout all items + // horizontally/vertically (wxLC_ALIGN_XXX styles explicitly given) or + // to arrange them in top to bottom, left to right (don't ask me why + // not the other way round...) order + if ( HasFlag(wxLC_ALIGN_LEFT | wxLC_ALIGN_TOP) ) + { + int x = EXTRA_BORDER_X; + int y = EXTRA_BORDER_Y; + + wxCoord widthMax = 0; + + size_t i; + for ( i = 0; i < count; i++ ) + { + wxListLineData *line = GetLine(i); + line->CalculateSize( &dc, iconSpacing ); + line->SetPosition( x, y, iconSpacing ); + + wxSize sizeLine = GetLineSize(i); + + if ( HasFlag(wxLC_ALIGN_TOP) ) + { + if ( sizeLine.x > widthMax ) + widthMax = sizeLine.x; + + y += sizeLine.y; + } + else // wxLC_ALIGN_LEFT + { + x += sizeLine.x + MARGIN_BETWEEN_ROWS; + } + } + + if ( HasFlag(wxLC_ALIGN_TOP) ) + { + // traverse the items again and tweak their sizes so that they are + // all the same in a row + for ( i = 0; i < count; i++ ) + { + wxListLineData *line = GetLine(i); + line->m_gi->ExtendWidth(widthMax); + } + } + + SetScrollbars + ( + SCROLL_UNIT_X, + lineHeight, + (x + SCROLL_UNIT_X) / SCROLL_UNIT_X, + (y + lineHeight) / lineHeight, + GetScrollPos( wxHORIZONTAL ), + GetScrollPos( wxVERTICAL ), + true + ); + } + else // "flowed" arrangement, the most complicated case + { + // at first we try without any scrollbars, if the items don't fit into + // the window, we recalculate after subtracting the space taken by the + // scrollbar + + int entireWidth = 0; + + for (int tries = 0; tries < 2; tries++) + { + entireWidth = 2 * EXTRA_BORDER_X; + + if (tries == 1) + { + // Now we have decided that the items do not fit into the + // client area, so we need a scrollbar + entireWidth += SCROLL_UNIT_X; + } + + int x = EXTRA_BORDER_X; + int y = EXTRA_BORDER_Y; + int maxWidthInThisRow = 0; + + m_linesPerPage = 0; + int currentlyVisibleLines = 0; + + for (size_t i = 0; i < count; i++) + { + currentlyVisibleLines++; + wxListLineData *line = GetLine( i ); + line->CalculateSize( &dc, iconSpacing ); + line->SetPosition( x, y, iconSpacing ); + + wxSize sizeLine = GetLineSize( i ); + + if ( maxWidthInThisRow < sizeLine.x ) + maxWidthInThisRow = sizeLine.x; + + y += sizeLine.y; + if (currentlyVisibleLines > m_linesPerPage) + m_linesPerPage = currentlyVisibleLines; + + if ( y + sizeLine.y >= clientHeight ) + { + currentlyVisibleLines = 0; + y = EXTRA_BORDER_Y; + maxWidthInThisRow += MARGIN_BETWEEN_ROWS; + x += maxWidthInThisRow; + entireWidth += maxWidthInThisRow; + maxWidthInThisRow = 0; + } + + // We have reached the last item. + if ( i == count - 1 ) + entireWidth += maxWidthInThisRow; + + if ( (tries == 0) && + (entireWidth + SCROLL_UNIT_X > clientWidth) ) + { + clientHeight -= wxSystemSettings:: + GetMetric(wxSYS_HSCROLL_Y); + m_linesPerPage = 0; + break; + } + + if ( i == count - 1 ) + tries = 1; // Everything fits, no second try required. + } + } + + SetScrollbars + ( + SCROLL_UNIT_X, + lineHeight, + (entireWidth + SCROLL_UNIT_X) / SCROLL_UNIT_X, + 0, + GetScrollPos( wxHORIZONTAL ), + 0, + true + ); + } + } + + if ( !noRefresh ) + { + // FIXME: why should we call it from here? + UpdateCurrent(); + + RefreshAll(); + } +} + +void wxListMainWindow::RefreshAll() +{ + m_dirty = false; + Refresh(); + + wxListHeaderWindow *headerWin = GetListCtrl()->m_headerWin; + if ( headerWin && headerWin->m_dirty ) + { + headerWin->m_dirty = false; + headerWin->Refresh(); + } +} + +void wxListMainWindow::UpdateCurrent() +{ + if ( !HasCurrent() && !IsEmpty() ) + ChangeCurrent(0); +} + +long wxListMainWindow::GetNextItem( long item, + int WXUNUSED(geometry), + int state ) const +{ + long ret = item, + max = GetItemCount(); + wxCHECK_MSG( (ret == -1) || (ret < max), -1, + _T("invalid listctrl index in GetNextItem()") ); + + // notice that we start with the next item (or the first one if item == -1) + // and this is intentional to allow writing a simple loop to iterate over + // all selected items + ret++; + if ( ret == max ) + // this is not an error because the index was OK initially, + // just no such item + return -1; + + if ( !state ) + // any will do + return (size_t)ret; + + size_t count = GetItemCount(); + for ( size_t line = (size_t)ret; line < count; line++ ) + { + if ( (state & wxLIST_STATE_FOCUSED) && (line == m_current) ) + return line; + + if ( (state & wxLIST_STATE_SELECTED) && IsHighlighted(line) ) + return line; + } + + return -1; +} + +// ---------------------------------------------------------------------------- +// deleting stuff +// ---------------------------------------------------------------------------- + +void wxListMainWindow::DeleteItem( long lindex ) +{ + size_t count = GetItemCount(); + + wxCHECK_RET( (lindex >= 0) && ((size_t)lindex < count), + _T("invalid item index in DeleteItem") ); + + size_t index = (size_t)lindex; + + // we don't need to adjust the index for the previous items + if ( HasCurrent() && m_current >= index ) + { + // if the current item is being deleted, we want the next one to + // become selected - unless there is no next one - so don't adjust + // m_current in this case + if ( m_current != index || m_current == count - 1 ) + m_current--; + } + + if ( InReportView() ) + { + // mark the Column Max Width cache as dirty if the items in the line + // we're deleting contain the Max Column Width + wxListLineData * const line = GetLine(index); + wxListItemDataList::compatibility_iterator n; + wxListItemData *itemData; + wxListItem item; + int itemWidth; + + for (size_t i = 0; i < m_columns.GetCount(); i++) + { + n = line->m_items.Item( i ); + itemData = n->GetData(); + itemData->GetItem(item); + + itemWidth = GetItemWidthWithImage(&item); + + if (itemWidth >= m_aColWidths.Item(i)->nMaxWidth) + m_aColWidths.Item(i)->bNeedsUpdate = true; + } + + ResetVisibleLinesRange(); + } + + SendNotify( index, wxEVT_COMMAND_LIST_DELETE_ITEM, wxDefaultPosition ); + + if ( IsVirtual() ) + { + m_countVirt--; + m_selStore.OnItemDelete(index); + } + else + { + m_lines.RemoveAt( index ); + } + + // we need to refresh the (vert) scrollbar as the number of items changed + m_dirty = true; + + RefreshAfter(index); +} + +void wxListMainWindow::DeleteColumn( int col ) +{ + wxListHeaderDataList::compatibility_iterator node = m_columns.Item( col ); + + wxCHECK_RET( node, wxT("invalid column index in DeleteColumn()") ); + + m_dirty = true; + delete node->GetData(); + m_columns.Erase( node ); + + if ( !IsVirtual() ) + { + // update all the items + for ( size_t i = 0; i < m_lines.GetCount(); i++ ) + { + wxListLineData * const line = GetLine(i); + wxListItemDataList::compatibility_iterator n = line->m_items.Item( col ); + delete n->GetData(); + line->m_items.Erase(n); + } + } + + if ( InReportView() ) // we only cache max widths when in Report View + { + delete m_aColWidths.Item(col); + m_aColWidths.RemoveAt(col); + } + + // invalidate it as it has to be recalculated + m_headerWidth = 0; +} + +void wxListMainWindow::DoDeleteAllItems() +{ + if ( IsEmpty() ) + // nothing to do - in particular, don't send the event + return; + + ResetCurrent(); + + // to make the deletion of all items faster, we don't send the + // notifications for each item deletion in this case but only one event + // for all of them: this is compatible with wxMSW and documented in + // DeleteAllItems() description + + wxListEvent event( wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS, GetParent()->GetId() ); + event.SetEventObject( GetParent() ); + GetParent()->GetEventHandler()->ProcessEvent( event ); + + if ( IsVirtual() ) + { + m_countVirt = 0; + m_selStore.Clear(); + } + + if ( InReportView() ) + { + ResetVisibleLinesRange(); + for (size_t i = 0; i < m_aColWidths.GetCount(); i++) + { + m_aColWidths.Item(i)->bNeedsUpdate = true; + } + } + + m_lines.Clear(); +} + +void wxListMainWindow::DeleteAllItems() +{ + DoDeleteAllItems(); + + RecalculatePositions(); +} + +void wxListMainWindow::DeleteEverything() +{ + WX_CLEAR_LIST(wxListHeaderDataList, m_columns); + WX_CLEAR_ARRAY(m_aColWidths); + + DeleteAllItems(); +} + +// ---------------------------------------------------------------------------- +// scanning for an item +// ---------------------------------------------------------------------------- + +void wxListMainWindow::EnsureVisible( long index ) +{ + wxCHECK_RET( index >= 0 && (size_t)index < GetItemCount(), + _T("invalid index in EnsureVisible") ); + + // We have to call this here because the label in question might just have + // been added and its position is not known yet + if ( m_dirty ) + RecalculatePositions(true /* no refresh */); + + MoveToItem((size_t)index); +} + +long wxListMainWindow::FindItem(long start, const wxString& str, bool partial ) +{ + if (str.empty()) + return wxNOT_FOUND; + + long pos = start; + wxString str_upper = str.Upper(); + if (pos < 0) + pos = 0; + + size_t count = GetItemCount(); + for ( size_t i = (size_t)pos; i < count; i++ ) + { + wxListLineData *line = GetLine(i); + wxString line_upper = line->GetText(0).Upper(); + if (!partial) + { + if (line_upper == str_upper ) + return i; + } + else + { + if (line_upper.find(str_upper) == 0) + return i; + } + } + + return wxNOT_FOUND; +} + +long wxListMainWindow::FindItem(long start, wxUIntPtr data) +{ + long pos = start; + if (pos < 0) + pos = 0; + + size_t count = GetItemCount(); + for (size_t i = (size_t)pos; i < count; i++) + { + wxListLineData *line = GetLine(i); + wxListItem item; + line->GetItem( 0, item ); + if (item.m_data == data) + return i; + } + + return wxNOT_FOUND; +} + +long wxListMainWindow::FindItem( const wxPoint& pt ) +{ + size_t topItem; + GetVisibleLinesRange( &topItem, NULL ); + + wxPoint p; + GetItemPosition( GetItemCount() - 1, p ); + if ( p.y == 0 ) + return topItem; + + long id = (long)floor( pt.y * double(GetItemCount() - topItem - 1) / p.y + topItem ); + if ( id >= 0 && id < (long)GetItemCount() ) + return id; + + return wxNOT_FOUND; +} + +long wxListMainWindow::HitTest( int x, int y, int &flags ) const +{ + CalcUnscrolledPosition( x, y, &x, &y ); + + size_t count = GetItemCount(); + + if ( InReportView() ) + { + size_t current = y / GetLineHeight(); + if ( current < count ) + { + flags = HitTestLine(current, x, y); + if ( flags ) + return current; + } + } + else // !report + { + // TODO: optimize it too! this is less simple than for report view but + // enumerating all items is still not a way to do it!! + for ( size_t current = 0; current < count; current++ ) + { + flags = HitTestLine(current, x, y); + if ( flags ) + return current; + } + } + + return wxNOT_FOUND; +} + +// ---------------------------------------------------------------------------- +// adding stuff +// ---------------------------------------------------------------------------- + +void wxListMainWindow::InsertItem( wxListItem &item ) +{ + wxASSERT_MSG( !IsVirtual(), _T("can't be used with virtual control") ); + + int count = GetItemCount(); + wxCHECK_RET( item.m_itemId >= 0, _T("invalid item index") ); + + if (item.m_itemId > count) + item.m_itemId = count; + + size_t id = item.m_itemId; + + m_dirty = true; + + if ( InReportView() ) + { + ResetVisibleLinesRange(); + + // calculate the width of the item and adjust the max column width + wxColWidthInfo *pWidthInfo = m_aColWidths.Item(item.GetColumn()); + int width = GetItemWidthWithImage(&item); + item.SetWidth(width); + if (width > pWidthInfo->nMaxWidth) + pWidthInfo->nMaxWidth = width; + } + + wxListLineData *line = new wxListLineData(this); + + line->SetItem( item.m_col, item ); + + m_lines.Insert( line, id ); + + m_dirty = true; + + // If an item is selected at or below the point of insertion, we need to + // increment the member variables because the current row's index has gone + // up by one + if ( HasCurrent() && m_current >= id ) + m_current++; + + SendNotify(id, wxEVT_COMMAND_LIST_INSERT_ITEM); + + RefreshLines(id, GetItemCount() - 1); +} + +void wxListMainWindow::InsertColumn( long col, wxListItem &item ) +{ + m_dirty = true; + if ( InReportView() ) + { + if (item.m_width == wxLIST_AUTOSIZE_USEHEADER) + item.m_width = GetTextLength( item.m_text ); + + wxListHeaderData *column = new wxListHeaderData( item ); + wxColWidthInfo *colWidthInfo = new wxColWidthInfo(); + + bool insert = (col >= 0) && ((size_t)col < m_columns.GetCount()); + if ( insert ) + { + wxListHeaderDataList::compatibility_iterator + node = m_columns.Item( col ); + m_columns.Insert( node, column ); + m_aColWidths.Insert( colWidthInfo, col ); + } + else + { + m_columns.Append( column ); + m_aColWidths.Add( colWidthInfo ); + } + + if ( !IsVirtual() ) + { + // update all the items + for ( size_t i = 0; i < m_lines.GetCount(); i++ ) + { + wxListLineData * const line = GetLine(i); + wxListItemData * const data = new wxListItemData(this); + if ( insert ) + line->m_items.Insert(col, data); + else + line->m_items.Append(data); + } + } + + // invalidate it as it has to be recalculated + m_headerWidth = 0; + } +} + +int wxListMainWindow::GetItemWidthWithImage(wxListItem * item) +{ + int width = 0; + wxClientDC dc(this); + + dc.SetFont( GetFont() ); + + if (item->GetImage() != -1) + { + int ix, iy; + GetImageSize( item->GetImage(), ix, iy ); + width += ix + 5; + } + + if (!item->GetText().empty()) + { + wxCoord w; + dc.GetTextExtent( item->GetText(), &w, NULL ); + width += w; + } + + return width; +} + +// ---------------------------------------------------------------------------- +// sorting +// ---------------------------------------------------------------------------- + +MuleListCtrlCompare list_ctrl_compare_func_2; +long list_ctrl_compare_data; + +int LINKAGEMODE list_ctrl_compare_func_1( wxListLineData **arg1, wxListLineData **arg2 ) +{ + wxListLineData *line1 = *arg1; + wxListLineData *line2 = *arg2; + wxListItem item; + line1->GetItem( 0, item ); + wxUIntPtr data1 = item.m_data; + line2->GetItem( 0, item ); + wxUIntPtr data2 = item.m_data; + return list_ctrl_compare_func_2( data1, data2, list_ctrl_compare_data ); +} + +void wxListMainWindow::SortItems( MuleListCtrlCompare fn, long data ) +{ + // selections won't make sense any more after sorting the items so reset + // them + HighlightAll(false); + ResetCurrent(); + + list_ctrl_compare_func_2 = fn; + list_ctrl_compare_data = data; + m_lines.Sort( list_ctrl_compare_func_1 ); + m_dirty = true; +} + +// ---------------------------------------------------------------------------- +// scrolling +// ---------------------------------------------------------------------------- + +void wxListMainWindow::OnScroll(wxScrollWinEvent& event) +{ + // FIXME +#if ( defined(__WXGTK__) || defined(__WXMAC__) ) && !defined(__WXUNIVERSAL__) + wxScrolledWindow::OnScroll(event); +#else + HandleOnScroll( event ); +#endif + + // update our idea of which lines are shown when we redraw the window the + // next time + ResetVisibleLinesRange(); + + if ( event.GetOrientation() == wxHORIZONTAL && HasHeader() ) + { + wxGenericListCtrl* lc = GetListCtrl(); + wxCHECK_RET( lc, _T("no listctrl window?") ); + + lc->m_headerWin->Refresh(); + lc->m_headerWin->Update(); + } +} + +int wxListMainWindow::GetCountPerPage() const +{ + if ( !m_linesPerPage ) + { + wxConstCast(this, wxListMainWindow)-> + m_linesPerPage = GetClientSize().y / GetLineHeight(); + } + + return m_linesPerPage; +} + +void wxListMainWindow::GetVisibleLinesRange(size_t *from, size_t *to) +{ + wxASSERT_MSG( InReportView(), _T("this is for report mode only") ); + + if ( m_lineFrom == (size_t)-1 ) + { + size_t count = GetItemCount(); + if ( count ) + { + m_lineFrom = GetScrollPos(wxVERTICAL); + + // this may happen if SetScrollbars() hadn't been called yet + if ( m_lineFrom >= count ) + m_lineFrom = count - 1; + + // we redraw one extra line but this is needed to make the redrawing + // logic work when there is a fractional number of lines on screen + m_lineTo = m_lineFrom + m_linesPerPage; + if ( m_lineTo >= count ) + m_lineTo = count - 1; + } + else // empty control + { + m_lineFrom = 0; + m_lineTo = (size_t)-1; + } + } + + wxASSERT_MSG( IsEmpty() || + (m_lineFrom <= m_lineTo && m_lineTo < GetItemCount()), + _T("GetVisibleLinesRange() returns incorrect result") ); + + if ( from ) + *from = m_lineFrom; + if ( to ) + *to = m_lineTo; +} + +// ------------------------------------------------------------------------------------- +// wxGenericListCtrl +// ------------------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxGenericListCtrl,wxControl) + EVT_SIZE(wxGenericListCtrl::OnSize) +END_EVENT_TABLE() + +wxGenericListCtrl::wxGenericListCtrl() +{ + m_imageListNormal = (wxImageList *) NULL; + m_imageListSmall = (wxImageList *) NULL; + m_imageListState = (wxImageList *) NULL; + + m_ownsImageListNormal = + m_ownsImageListSmall = + m_ownsImageListState = false; + + m_mainWin = (wxListMainWindow*) NULL; + m_headerWin = (wxListHeaderWindow*) NULL; + m_headerHeight = 0; +} + +wxGenericListCtrl::~wxGenericListCtrl() +{ + if (m_ownsImageListNormal) + delete m_imageListNormal; + if (m_ownsImageListSmall) + delete m_imageListSmall; + if (m_ownsImageListState) + delete m_imageListState; +} + +void wxGenericListCtrl::CalculateAndSetHeaderHeight() +{ + if ( m_headerWin ) + { +#ifdef __WXMAC__ + SInt32 h; + GetThemeMetric( kThemeMetricListHeaderHeight, &h ); +#else + // we use 'g' to get the descent, too + int w, h, d; + m_headerWin->GetTextExtent(wxT("Hg"), &w, &h, &d); + h += d + 2 * HEADER_OFFSET_Y + EXTRA_HEIGHT; +#endif + + // only update if changed + if ( h != m_headerHeight ) + { + m_headerHeight = h; + + if ( HasHeader() ) + ResizeReportView(true); + else //why is this needed if it doesn't have a header? + m_headerWin->SetSize(m_headerWin->GetSize().x, m_headerHeight); + } + } +} + +void wxGenericListCtrl::CreateHeaderWindow() +{ + m_headerWin = new wxListHeaderWindow + ( + this, wxID_ANY, m_mainWin, + wxPoint(0,0), + wxSize(GetClientSize().x, m_headerHeight), + wxTAB_TRAVERSAL + ); + CalculateAndSetHeaderHeight(); +} + +bool wxGenericListCtrl::GetFocus() +{ + return m_mainWin->m_hasFocus; +} + +bool wxGenericListCtrl::Create(wxWindow *parent, + wxWindowID id, + const wxPoint &pos, + const wxSize &size, + long style, + const wxValidator &validator, + const wxString &name) +{ + m_imageListNormal = + m_imageListSmall = + m_imageListState = (wxImageList *) NULL; + m_ownsImageListNormal = + m_ownsImageListSmall = + m_ownsImageListState = false; + + m_mainWin = (wxListMainWindow*) NULL; + m_headerWin = (wxListHeaderWindow*) NULL; + + m_headerHeight = 0; + + if ( !(style & wxLC_MASK_TYPE) ) + { + style = style | wxLC_LIST; + } + + // add more styles here that should only appear + // in the main window + unsigned long only_main_window_style = wxALWAYS_SHOW_SB; + + if ( !wxControl::Create( parent, id, pos, size, style & ~only_main_window_style, validator, name ) ) + return false; + + // don't create the inner window with the border + style &= ~wxBORDER_MASK; + + m_mainWin = new wxListMainWindow( this, wxID_ANY, wxPoint(0, 0), size, style ); + +#ifdef __WXMAC_CARBON__ + // Human Interface Guidelines ask us for a special font in this case + if ( GetWindowVariant() == wxWINDOW_VARIANT_NORMAL ) + { + wxFont font; + font.MacCreateThemeFont( kThemeViewsFont ); + SetFont( font ); + } +#endif + + if ( InReportView() ) + { + CreateHeaderWindow(); + +#ifdef __WXMAC_CARBON__ + if (m_headerWin) + { + wxFont font; + font.MacCreateThemeFont( kThemeSmallSystemFont ); + m_headerWin->SetFont( font ); + CalculateAndSetHeaderHeight(); + } +#endif + + if ( HasFlag(wxLC_NO_HEADER) ) + // VZ: why do we create it at all then? + m_headerWin->Show( false ); + } + + SetInitialSize(size); + + return true; +} + +void wxGenericListCtrl::SetSingleStyle( long style, bool add ) +{ + wxASSERT_MSG( !(style & wxLC_VIRTUAL), + _T("wxLC_VIRTUAL can't be [un]set") ); + + long flag = GetWindowStyle(); + + if (add) + { + if (style & wxLC_MASK_TYPE) + flag &= ~(wxLC_MASK_TYPE | wxLC_VIRTUAL); + if (style & wxLC_MASK_ALIGN) + flag &= ~wxLC_MASK_ALIGN; + if (style & wxLC_MASK_SORT) + flag &= ~wxLC_MASK_SORT; + } + + if (add) + flag |= style; + else + flag &= ~style; + + SetWindowStyleFlag( flag ); +} + +void wxGenericListCtrl::SetWindowStyleFlag( long flag ) +{ + if (m_mainWin) + { + m_mainWin->DeleteEverything(); + + // has the header visibility changed? + bool hasHeader = HasHeader(); + bool willHaveHeader = (flag & wxLC_REPORT) && !(flag & wxLC_NO_HEADER); + + if ( hasHeader != willHaveHeader ) + { + // toggle it + if ( hasHeader ) + { + if ( m_headerWin ) + { + // don't delete, just hide, as we can reuse it later + m_headerWin->Show(false); + } + //else: nothing to do + } + else // must show header + { + if (!m_headerWin) + { + CreateHeaderWindow(); + } + else // already have it, just show + { + m_headerWin->Show( true ); + } + } + + ResizeReportView(willHaveHeader); + } + } + + wxWindow::SetWindowStyleFlag( flag ); +} + +bool wxGenericListCtrl::GetColumn(int col, wxListItem &item) const +{ + m_mainWin->GetColumn( col, item ); + return true; +} + +bool wxGenericListCtrl::SetColumn( int col, wxListItem& item ) +{ + m_mainWin->SetColumn( col, item ); + return true; +} + +int wxGenericListCtrl::GetColumnWidth( int col ) const +{ + return m_mainWin->GetColumnWidth( col ); +} + +bool wxGenericListCtrl::SetColumnWidth( int col, int width ) +{ + m_mainWin->SetColumnWidth( col, width ); + return true; +} + +int wxGenericListCtrl::GetCountPerPage() const +{ + return m_mainWin->GetCountPerPage(); // different from Windows ? +} + +bool wxGenericListCtrl::GetItem( wxListItem &info ) const +{ + m_mainWin->GetItem( info ); + return true; +} + +bool wxGenericListCtrl::SetItem( wxListItem &info ) +{ + m_mainWin->SetItem( info ); + return true; +} + +long wxGenericListCtrl::SetItem( long index, int col, const wxString& label, int imageId ) +{ + wxListItem info; + info.m_text = label; + info.m_mask = wxLIST_MASK_TEXT; + info.m_itemId = index; + info.m_col = col; + if ( imageId > -1 ) + { + info.m_image = imageId; + info.m_mask |= wxLIST_MASK_IMAGE; + } + + m_mainWin->SetItem(info); + return true; +} + +int wxGenericListCtrl::GetItemState( long item, long stateMask ) const +{ + return m_mainWin->GetItemState( item, stateMask ); +} + +bool wxGenericListCtrl::SetItemState( long item, long state, long stateMask ) +{ + m_mainWin->SetItemState( item, state, stateMask ); + return true; +} + +bool +wxGenericListCtrl::SetItemImage( long item, int image, int WXUNUSED(selImage) ) +{ + return SetItemColumnImage(item, 0, image); +} + +bool +wxGenericListCtrl::SetItemColumnImage( long item, long column, int image ) +{ + wxListItem info; + info.m_image = image; + info.m_mask = wxLIST_MASK_IMAGE; + info.m_itemId = item; + info.m_col = column; + m_mainWin->SetItem( info ); + return true; +} + +wxString wxGenericListCtrl::GetItemText( long item ) const +{ + return m_mainWin->GetItemText(item); +} + +void wxGenericListCtrl::SetItemText( long item, const wxString& str ) +{ + m_mainWin->SetItemText(item, str); +} + +wxUIntPtr wxGenericListCtrl::GetItemData( long item ) const +{ + wxListItem info; + info.m_mask = wxLIST_MASK_DATA; + info.m_itemId = item; + m_mainWin->GetItem( info ); + return info.m_data; +} + +bool wxGenericListCtrl::SetItemPtrData( long item, wxUIntPtr data ) +{ + wxListItem info; + info.m_mask = wxLIST_MASK_DATA; + info.m_itemId = item; + info.m_data = data; + m_mainWin->SetItem( info ); + return true; +} + +#if 0 +bool wxGenericListCtrl::SetItemData(long item, long data) +{ + return SetItemPtrData(item, data); +} +#endif + +wxRect wxGenericListCtrl::GetViewRect() const +{ + return m_mainWin->GetViewRect(); +} + +bool wxGenericListCtrl::GetItemRect( long item, wxRect &rect, int WXUNUSED(code) ) const +{ + m_mainWin->GetItemRect( item, rect ); + if ( m_mainWin->HasHeader() ) + rect.y += m_headerHeight + 1; + return true; +} + +bool wxGenericListCtrl::GetItemPosition( long item, wxPoint& pos ) const +{ + m_mainWin->GetItemPosition( item, pos ); + return true; +} + +bool wxGenericListCtrl::SetItemPosition( long WXUNUSED(item), const wxPoint& WXUNUSED(pos) ) +{ + return 0; +} + +int wxGenericListCtrl::GetItemCount() const +{ + return m_mainWin->GetItemCount(); +} + +int wxGenericListCtrl::GetColumnCount() const +{ + return m_mainWin->GetColumnCount(); +} + +void wxGenericListCtrl::SetItemSpacing( int spacing, bool isSmall ) +{ + m_mainWin->SetItemSpacing( spacing, isSmall ); +} + +wxSize wxGenericListCtrl::GetItemSpacing() const +{ + const int spacing = m_mainWin->GetItemSpacing(HasFlag(wxLC_SMALL_ICON)); + + return wxSize(spacing, spacing); +} + +#if WXWIN_COMPATIBILITY_2_6 +int wxGenericListCtrl::GetItemSpacing( bool isSmall ) const +{ + return m_mainWin->GetItemSpacing( isSmall ); +} +#endif // WXWIN_COMPATIBILITY_2_6 + +void wxGenericListCtrl::OnDrawItem(int WXUNUSED(item), wxDC* WXUNUSED(dc), const wxRect& WXUNUSED(rect), const wxRect& WXUNUSED(rectHL), bool WXUNUSED(highlighted)) +{ + // do nothing here, this is just a stub +} + +void wxGenericListCtrl::SetItemTextColour( long item, const wxColour &col ) +{ + wxListItem info; + info.m_itemId = item; + info.SetTextColour( col ); + m_mainWin->SetItem( info ); +} + +wxColour wxGenericListCtrl::GetItemTextColour( long item ) const +{ + wxListItem info; + info.m_itemId = item; + m_mainWin->GetItem( info ); + return info.GetTextColour(); +} + +void wxGenericListCtrl::SetItemBackgroundColour( long item, const wxColour &col ) +{ + wxListItem info; + info.m_itemId = item; + info.SetBackgroundColour( col ); + m_mainWin->SetItem( info ); +} + +wxColour wxGenericListCtrl::GetItemBackgroundColour( long item ) const +{ + wxListItem info; + info.m_itemId = item; + m_mainWin->GetItem( info ); + return info.GetBackgroundColour(); +} + +int wxGenericListCtrl::GetScrollPos( int orient ) const +{ + return m_mainWin->GetScrollPos( orient ); +} + +void wxGenericListCtrl::SetScrollPos( int orient, int pos, bool refresh ) +{ + m_mainWin->SetScrollPos( orient, pos, refresh ); +} + +void wxGenericListCtrl::SetItemFont( long item, const wxFont &f ) +{ + wxListItem info; + info.m_itemId = item; + info.SetFont( f ); + m_mainWin->SetItem( info ); +} + +wxFont wxGenericListCtrl::GetItemFont( long item ) const +{ + wxListItem info; + info.m_itemId = item; + m_mainWin->GetItem( info ); + return info.GetFont(); +} + +int wxGenericListCtrl::GetSelectedItemCount() const +{ + return m_mainWin->GetSelectedItemCount(); +} + +wxColour wxGenericListCtrl::GetTextColour() const +{ + return GetForegroundColour(); +} + +void wxGenericListCtrl::SetTextColour(const wxColour& col) +{ + SetForegroundColour(col); +} + +long wxGenericListCtrl::GetTopItem() const +{ + size_t top; + m_mainWin->GetVisibleLinesRange(&top, NULL); + return (long)top; +} + +void wxGenericListCtrl::GetVisibleLines(long* first, long* last) +{ + size_t from, to; + + m_mainWin->GetVisibleLinesRange(&from, &to); + + if (first) *first = (long)from; + if (last) *last = (long)to; +} + +long wxGenericListCtrl::GetNextItem( long item, int geom, int state ) const +{ + return m_mainWin->GetNextItem( item, geom, state ); +} + +wxImageList *wxGenericListCtrl::GetImageList(int which) const +{ + if (which == wxIMAGE_LIST_NORMAL) + return m_imageListNormal; + else if (which == wxIMAGE_LIST_SMALL) + return m_imageListSmall; + else if (which == wxIMAGE_LIST_STATE) + return m_imageListState; + + return (wxImageList *) NULL; +} + +void wxGenericListCtrl::SetImageList( wxImageList *imageList, int which ) +{ + if ( which == wxIMAGE_LIST_NORMAL ) + { + if (m_ownsImageListNormal) + delete m_imageListNormal; + m_imageListNormal = imageList; + m_ownsImageListNormal = false; + } + else if ( which == wxIMAGE_LIST_SMALL ) + { + if (m_ownsImageListSmall) + delete m_imageListSmall; + m_imageListSmall = imageList; + m_ownsImageListSmall = false; + } + else if ( which == wxIMAGE_LIST_STATE ) + { + if (m_ownsImageListState) + delete m_imageListState; + m_imageListState = imageList; + m_ownsImageListState = false; + } + + m_mainWin->SetImageList( imageList, which ); +} + +void wxGenericListCtrl::AssignImageList(wxImageList *imageList, int which) +{ + SetImageList(imageList, which); + if ( which == wxIMAGE_LIST_NORMAL ) + m_ownsImageListNormal = true; + else if ( which == wxIMAGE_LIST_SMALL ) + m_ownsImageListSmall = true; + else if ( which == wxIMAGE_LIST_STATE ) + m_ownsImageListState = true; +} + +bool wxGenericListCtrl::Arrange( int WXUNUSED(flag) ) +{ + return 0; +} + +bool wxGenericListCtrl::DeleteItem( long item ) +{ + m_mainWin->DeleteItem( item ); + return true; +} + +bool wxGenericListCtrl::DeleteAllItems() +{ + m_mainWin->DeleteAllItems(); + return true; +} + +bool wxGenericListCtrl::DeleteAllColumns() +{ + size_t count = m_mainWin->m_columns.GetCount(); + for ( size_t n = 0; n < count; n++ ) + DeleteColumn( 0 ); + return true; +} + +void wxGenericListCtrl::ClearAll() +{ + m_mainWin->DeleteEverything(); +} + +bool wxGenericListCtrl::DeleteColumn( int col ) +{ + m_mainWin->DeleteColumn( col ); + + // if we don't have the header any longer, we need to relayout the window + if ( !GetColumnCount() ) + ResizeReportView(false /* no header */); + return true; +} + +wxTextCtrl *wxGenericListCtrl::EditLabel(long item, + wxClassInfo* textControlClass) +{ + return m_mainWin->EditLabel( item, textControlClass ); +} + +wxTextCtrl *wxGenericListCtrl::GetEditControl() const +{ + return m_mainWin->GetEditControl(); +} + +bool wxGenericListCtrl::EnsureVisible( long item ) +{ + m_mainWin->EnsureVisible( item ); + return true; +} + +long wxGenericListCtrl::FindItem( long start, const wxString& str, bool partial ) +{ + return m_mainWin->FindItem( start, str, partial ); +} + +long wxGenericListCtrl::FindItem( long start, wxUIntPtr data ) +{ + return m_mainWin->FindItem( start, data ); +} + +long wxGenericListCtrl::FindItem( long WXUNUSED(start), const wxPoint& pt, + int WXUNUSED(direction)) +{ + return m_mainWin->FindItem( pt ); +} + +// TODO: sub item hit testing +long wxGenericListCtrl::HitTest(const wxPoint& point, int& flags, long *) const +{ + return m_mainWin->HitTest( (int)point.x, (int)point.y, flags ); +} + +long wxGenericListCtrl::InsertItem( wxListItem& info ) +{ + m_mainWin->InsertItem( info ); + return info.m_itemId; +} + +long wxGenericListCtrl::InsertItem( long index, const wxString &label ) +{ + wxListItem info; + info.m_text = label; + info.m_mask = wxLIST_MASK_TEXT; + info.m_itemId = index; + return InsertItem( info ); +} + +long wxGenericListCtrl::InsertItem( long index, int imageIndex ) +{ + wxListItem info; + info.m_mask = wxLIST_MASK_IMAGE; + info.m_image = imageIndex; + info.m_itemId = index; + return InsertItem( info ); +} + +long wxGenericListCtrl::InsertItem( long index, const wxString &label, int imageIndex ) +{ + wxListItem info; + info.m_text = label; + info.m_image = imageIndex; + info.m_mask = wxLIST_MASK_TEXT | wxLIST_MASK_IMAGE; + info.m_itemId = index; + return InsertItem( info ); +} + +long wxGenericListCtrl::InsertColumn( long col, wxListItem &item ) +{ + wxCHECK_MSG( m_headerWin, -1, _T("can't add column in non report mode") ); + + m_mainWin->InsertColumn( col, item ); + + // if we hadn't had a header before but have one now + // then we need to relayout the window + if ( GetColumnCount() == 1 && m_mainWin->HasHeader() ) + ResizeReportView(true /* have header */); + + m_headerWin->Refresh(); + + return 0; +} + +long wxGenericListCtrl::InsertColumn( long col, const wxString &heading, + int format, int width ) +{ + wxListItem item; + item.m_mask = wxLIST_MASK_TEXT | wxLIST_MASK_FORMAT; + item.m_text = heading; + if (width >= -2) + { + item.m_mask |= wxLIST_MASK_WIDTH; + item.m_width = width; + } + + item.m_format = format; + + return InsertColumn( col, item ); +} + +bool wxGenericListCtrl::ScrollList( int WXUNUSED(dx), int WXUNUSED(dy) ) +{ + return 0; +} + +// Sort items. +// fn is a function which takes 3 long arguments: item1, item2, data. +// item1 is the long data associated with a first item (NOT the index). +// item2 is the long data associated with a second item (NOT the index). +// data is the same value as passed to SortItems. +// The return value is a negative number if the first item should precede the second +// item, a positive number of the second item should precede the first, +// or zero if the two items are equivalent. +// data is arbitrary data to be passed to the sort function. + +bool wxGenericListCtrl::SortItems( MuleListCtrlCompare fn, long data ) +{ + m_mainWin->SortItems( fn, data ); + return true; +} + +// ---------------------------------------------------------------------------- +// event handlers +// ---------------------------------------------------------------------------- + +void wxGenericListCtrl::OnSize(wxSizeEvent& WXUNUSED(event)) +{ + if ( !m_mainWin ) + return; + + ResizeReportView(m_mainWin->HasHeader()); + m_mainWin->RecalculatePositions(); +} + +void wxGenericListCtrl::ResizeReportView(bool showHeader) +{ + int cw, ch; + GetClientSize( &cw, &ch ); + + if ( showHeader ) + { + m_headerWin->SetSize( 0, 0, cw, m_headerHeight ); + if(ch > m_headerHeight) + m_mainWin->SetSize( 0, m_headerHeight + 1, + cw, ch - m_headerHeight - 1 ); + else + m_mainWin->SetSize( 0, m_headerHeight + 1, + cw, 0); + } + else // no header window + { + m_mainWin->SetSize( 0, 0, cw, ch ); + } +} + +void wxGenericListCtrl::OnInternalIdle() +{ + wxWindow::OnInternalIdle(); + + // do it only if needed + if ( !m_mainWin->m_dirty ) + return; + + m_mainWin->RecalculatePositions(); +} + +// ---------------------------------------------------------------------------- +// font/colours +// ---------------------------------------------------------------------------- + +bool wxGenericListCtrl::SetBackgroundColour( const wxColour &colour ) +{ + if (m_mainWin) + { + m_mainWin->SetBackgroundColour( colour ); + m_mainWin->m_dirty = true; + } + + return true; +} + +bool wxGenericListCtrl::SetForegroundColour( const wxColour &colour ) +{ + if ( !wxWindow::SetForegroundColour( colour ) ) + return false; + + if (m_mainWin) + { + m_mainWin->SetForegroundColour( colour ); + m_mainWin->m_dirty = true; + } + + if (m_headerWin) + m_headerWin->SetForegroundColour( colour ); + + return true; +} + +bool wxGenericListCtrl::SetFont( const wxFont &font ) +{ + if ( !wxWindow::SetFont( font ) ) + return false; + + if (m_mainWin) + { + m_mainWin->SetFont( font ); + m_mainWin->m_dirty = true; + } + + if (m_headerWin) + { + m_headerWin->SetFont( font ); + CalculateAndSetHeaderHeight(); + } + + Refresh(); + + return true; +} + +// static +wxVisualAttributes +wxGenericListCtrl::GetClassDefaultAttributes(wxWindowVariant variant) +{ +#if _USE_VISATTR + // Use the same color scheme as wxListBox + return wxListBox::GetClassDefaultAttributes(variant); +#else + wxUnusedVar(variant); + wxVisualAttributes attr; + attr.colFg = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT); + attr.colBg = wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOX); + attr.font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + return attr; +#endif +} + +// ---------------------------------------------------------------------------- +// methods forwarded to m_mainWin +// ---------------------------------------------------------------------------- + +#if wxUSE_DRAG_AND_DROP + +void wxGenericListCtrl::SetDropTarget( wxDropTarget *dropTarget ) +{ + m_mainWin->SetDropTarget( dropTarget ); +} + +wxDropTarget *wxGenericListCtrl::GetDropTarget() const +{ + return m_mainWin->GetDropTarget(); +} + +#endif + +bool wxGenericListCtrl::SetCursor( const wxCursor &cursor ) +{ + return m_mainWin ? m_mainWin->wxWindow::SetCursor(cursor) : false; +} + +wxColour wxGenericListCtrl::GetBackgroundColour() const +{ + return m_mainWin ? m_mainWin->GetBackgroundColour() : wxColour(); +} + +wxColour wxGenericListCtrl::GetForegroundColour() const +{ + return m_mainWin ? m_mainWin->GetForegroundColour() : wxColour(); +} + +bool wxGenericListCtrl::DoPopupMenu( wxMenu *menu, int x, int y ) +{ +#if wxUSE_MENUS + return m_mainWin->PopupMenu( menu, x, y ); +#else + return false; +#endif +} + +void wxGenericListCtrl::DoClientToScreen( int *x, int *y ) const +{ + m_mainWin->DoClientToScreen(x, y); +} + +void wxGenericListCtrl::DoScreenToClient( int *x, int *y ) const +{ + m_mainWin->DoScreenToClient(x, y); +} + +void wxGenericListCtrl::SetFocus() +{ + // The test in window.cpp fails as we are a composite + // window, so it checks against "this", but not m_mainWin. + if ( DoFindFocus() != this ) + m_mainWin->SetFocus(); +} + +wxSize wxGenericListCtrl::DoGetBestSize() const +{ + // Something is better than nothing... + // 100x80 is what the MSW version will get from the default + // wxControl::DoGetBestSize + return wxSize(100, 80); +} + +// ---------------------------------------------------------------------------- +// virtual list control support +// ---------------------------------------------------------------------------- + +wxString wxGenericListCtrl::OnGetItemText(long WXUNUSED(item), long WXUNUSED(col)) const +{ + // this is a pure virtual function, in fact - which is not really pure + // because the controls which are not virtual don't need to implement it + wxFAIL_MSG( _T("wxGenericListCtrl::OnGetItemText not supposed to be called") ); + + return wxEmptyString; +} + +int wxGenericListCtrl::OnGetItemImage(long WXUNUSED(item)) const +{ + wxCHECK_MSG(!GetImageList(wxIMAGE_LIST_SMALL), + -1, + wxT("List control has an image list, OnGetItemImage or OnGetItemColumnImage should be overridden.")); + return -1; +} + +int wxGenericListCtrl::OnGetItemColumnImage(long item, long column) const +{ + if (!column) + return OnGetItemImage(item); + + return -1; +} + +wxListItemAttr * +wxGenericListCtrl::OnGetItemAttr(long WXUNUSED_UNLESS_DEBUG(item)) const +{ + wxASSERT_MSG( item >= 0 && item < GetItemCount(), + _T("invalid item index in OnGetItemAttr()") ); + + // no attributes by default + return NULL; +} + +void wxGenericListCtrl::SetItemCount(long count) +{ + wxASSERT_MSG( IsVirtual(), _T("this is for virtual controls only") ); + + m_mainWin->SetItemCount(count); +} + +void wxGenericListCtrl::RefreshItem(long item) +{ + m_mainWin->RefreshLine(item); +} + +void wxGenericListCtrl::RefreshItems(long itemFrom, long itemTo) +{ + m_mainWin->RefreshLines(itemFrom, itemTo); +} + +// Generic wxListCtrl is more or less a container for two other +// windows which drawings are done upon. These are namely +// 'm_headerWin' and 'm_mainWin'. +// Here we override 'virtual wxWindow::Refresh()' to mimic the +// behaviour wxListCtrl has under wxMSW. +// +void wxGenericListCtrl::Refresh(bool eraseBackground, const wxRect *rect) +{ + if (!rect) + { + // The easy case, no rectangle specified. + if (m_headerWin) + m_headerWin->Refresh(eraseBackground); + + if (m_mainWin) + m_mainWin->Refresh(eraseBackground); + } + else + { + // Refresh the header window + if (m_headerWin) + { + wxRect rectHeader = m_headerWin->GetRect(); + rectHeader.Intersect(*rect); + if (rectHeader.GetWidth() && rectHeader.GetHeight()) + { + int x, y; + m_headerWin->GetPosition(&x, &y); + rectHeader.Offset(-x, -y); + m_headerWin->Refresh(eraseBackground, &rectHeader); + } + } + + // Refresh the main window + if (m_mainWin) + { + wxRect rectMain = m_mainWin->GetRect(); + rectMain.Intersect(*rect); + if (rectMain.GetWidth() && rectMain.GetHeight()) + { + int x, y; + m_mainWin->GetPosition(&x, &y); + rectMain.Offset(-x, -y); + m_mainWin->Refresh(eraseBackground, &rectMain); + } + } + } +} + +void wxGenericListCtrl::Freeze() +{ + m_mainWin->Freeze(); +} + +void wxGenericListCtrl::Thaw() +{ + m_mainWin->Thaw(); +} + +} // namespace MuleExtern + +#endif // wxUSE_LISTCTRL diff --git a/src/extern/wxWidgets/listctrl.h b/src/extern/wxWidgets/listctrl.h new file mode 100644 index 00000000..80e07991 --- /dev/null +++ b/src/extern/wxWidgets/listctrl.h @@ -0,0 +1,299 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/listctrl.h +// Purpose: Generic list control +// Author: Robert Roebling +// Created: 01/02/97 +// RCS-ID: $Id: listctrl.h 7897 2008-01-04 12:53:45Z xaignar $ +// Copyright: (c) 1998 Robert Roebling and Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef LISTCTRL_287_H +#define LISTCTRL_287_H + +#include +#include +#include + +#define wxLC_OWNERDRAW 0x10000 + +class WXDLLIMPEXP_CORE wxImageList; + +#if wxUSE_DRAG_AND_DROP +class WXDLLEXPORT wxDropTarget; +#endif + +// Fix for bug in wx's implementation, which uses longs for item* +typedef int (wxCALLBACK *MuleListCtrlCompare)(wxUIntPtr item1, wxUIntPtr item2, long sortData); + +namespace MuleExtern { + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +extern WXDLLEXPORT_DATA(const wxChar) wxListCtrlNameStr[]; + +//----------------------------------------------------------------------------- +// internal classes +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxListHeaderWindow; +class WXDLLEXPORT wxListMainWindow; + +//----------------------------------------------------------------------------- +// wxListCtrl +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxGenericListCtrl: public wxControl +{ +public: + + wxGenericListCtrl(); + wxGenericListCtrl( wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxLC_ICON, + const wxValidator& validator = wxDefaultValidator, + const wxString &name = wxListCtrlNameStr) + { + Create(parent, winid, pos, size, style, validator, name); + } + virtual ~wxGenericListCtrl(); + + bool Create( wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxLC_ICON, + const wxValidator& validator = wxDefaultValidator, + const wxString &name = wxListCtrlNameStr); + + bool GetColumn( int col, wxListItem& item ) const; + bool SetColumn( int col, wxListItem& item ); + int GetColumnWidth( int col ) const; + bool SetColumnWidth( int col, int width); + int GetCountPerPage() const; // not the same in wxGLC as in Windows, I think + void GetVisibleLines(long* first, long* last); + wxRect GetViewRect() const; + + bool GetItem( wxListItem& info ) const; + bool SetItem( wxListItem& info ); + long SetItem( long index, int col, const wxString& label, int imageId = -1 ); + int GetItemState( long item, long stateMask ) const; + bool SetItemState( long item, long state, long stateMask); + bool SetItemImage( long item, int image, int selImage = -1 ); + bool SetItemColumnImage( long item, long column, int image ); + wxString GetItemText( long item ) const; + void SetItemText( long item, const wxString& str ); + wxUIntPtr GetItemData( long item ) const; +#if wxABI_VERSION >= 20804 + bool SetItemPtrData(long item, wxUIntPtr data); +#endif // wxABI 2.8.4+ + +// It is not certain that sizeof(long) == sizeof(void*), and since we +// just about only use pointers as item-data, I've choosen to disable +// this function to prevent mistakes. Use SetItemPtrData instead. +#if 0 + bool SetItemData(long item, long data); +#endif + bool GetItemRect( long item, wxRect& rect, int code = wxLIST_RECT_BOUNDS ) const; + bool GetItemPosition( long item, wxPoint& pos ) const; + bool SetItemPosition( long item, const wxPoint& pos ); // not supported in wxGLC + int GetItemCount() const; + int GetColumnCount() const; + void SetItemSpacing( int spacing, bool isSmall = false ); + wxSize GetItemSpacing() const; + void SetItemTextColour( long item, const wxColour& col); + wxColour GetItemTextColour( long item ) const; + void SetItemBackgroundColour( long item, const wxColour &col); + wxColour GetItemBackgroundColour( long item ) const; + void SetItemFont( long item, const wxFont &f); + wxFont GetItemFont( long item ) const; + int GetSelectedItemCount() const; + wxColour GetTextColour() const; + void SetTextColour(const wxColour& col); + long GetTopItem() const; + + void SetSingleStyle( long style, bool add = true ) ; + void SetWindowStyleFlag( long style ); + void RecreateWindow() {} + long GetNextItem( long item, int geometry = wxLIST_NEXT_ALL, int state = wxLIST_STATE_DONTCARE ) const; + wxImageList *GetImageList( int which ) const; + void SetImageList( wxImageList *imageList, int which ); + void AssignImageList( wxImageList *imageList, int which ); + bool Arrange( int flag = wxLIST_ALIGN_DEFAULT ); // always wxLIST_ALIGN_LEFT in wxGLC + + void ClearAll(); + bool DeleteItem( long item ); + bool DeleteAllItems(); + bool DeleteAllColumns(); + bool DeleteColumn( int col ); + + void SetItemCount(long count); + + wxTextCtrl *EditLabel(long item, + wxClassInfo* textControlClass = CLASSINFO(wxTextCtrl)); + wxTextCtrl* GetEditControl() const; + void Edit( long item ) { EditLabel(item); } + + bool EnsureVisible( long item ); + long FindItem( long start, const wxString& str, bool partial = false ); + long FindItem( long start, wxUIntPtr data ); + long FindItem( long start, const wxPoint& pt, int direction ); // not supported in wxGLC + long HitTest( const wxPoint& point, int& flags, long *pSubItem = NULL ) const; + long InsertItem(wxListItem& info); + long InsertItem( long index, const wxString& label ); + long InsertItem( long index, int imageIndex ); + long InsertItem( long index, const wxString& label, int imageIndex ); + long InsertColumn( long col, wxListItem& info ); + long InsertColumn( long col, const wxString& heading, + int format = wxLIST_FORMAT_LEFT, int width = -1 ); + bool ScrollList( int dx, int dy ); + bool SortItems( MuleListCtrlCompare fn, long data ); + bool Update( long item ); + // Must provide overload to avoid hiding it (and warnings about it) + virtual void Update() { wxControl::Update(); } + + // are we in report mode? + bool InReportView() const { return HasFlag(wxLC_REPORT); } + + // are we in virtual report mode? + bool IsVirtual() const { return HasFlag(wxLC_VIRTUAL); } + + // do we have a header window? + bool HasHeader() const + { return InReportView() && !HasFlag(wxLC_NO_HEADER); } + + // refresh items selectively (only useful for virtual list controls) + void RefreshItem(long item); + void RefreshItems(long itemFrom, long itemTo); + +#if WXWIN_COMPATIBILITY_2_6 + // obsolete, don't use + wxDEPRECATED( int GetItemSpacing( bool isSmall ) const ); +#endif // WXWIN_COMPATIBILITY_2_6 + + virtual wxVisualAttributes GetDefaultAttributes() const + { + return GetClassDefaultAttributes(GetWindowVariant()); + } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + // implementation only from now on + // ------------------------------- + + void OnInternalIdle( ); + void OnSize( wxSizeEvent &event ); + + // We have to hand down a few functions + virtual void Refresh(bool eraseBackground = true, + const wxRect *rect = NULL); + + virtual void Freeze(); + virtual void Thaw(); + virtual void OnDrawItem(int item, wxDC* dc, const wxRect& rect, const wxRect& rectHL, bool highlighted); + + virtual bool SetBackgroundColour( const wxColour &colour ); + virtual bool SetForegroundColour( const wxColour &colour ); + virtual wxColour GetBackgroundColour() const; + virtual wxColour GetForegroundColour() const; + virtual bool SetFont( const wxFont &font ); + virtual bool SetCursor( const wxCursor &cursor ); + + virtual int GetScrollPos(int orient) const; + virtual void SetScrollPos(int orient, int pos, bool refresh = true); + +#if wxUSE_DRAG_AND_DROP + virtual void SetDropTarget( wxDropTarget *dropTarget ); + virtual wxDropTarget *GetDropTarget() const; +#endif + + virtual bool ShouldInheritColours() const { return false; } + virtual void SetFocus(); + virtual bool GetFocus(); + + // implementation + // -------------- + + wxImageList *m_imageListNormal; + wxImageList *m_imageListSmall; + wxImageList *m_imageListState; // what's that ? + bool m_ownsImageListNormal, + m_ownsImageListSmall, + m_ownsImageListState; + wxListHeaderWindow *m_headerWin; + wxListMainWindow *m_mainWin; + wxCoord m_headerHeight; + +protected: + virtual bool DoPopupMenu( wxMenu *menu, int x, int y ); + + // take into account the coordinates difference between the container + // window and the list control window itself here + virtual void DoClientToScreen( int *x, int *y ) const; + virtual void DoScreenToClient( int *x, int *y ) const; + + virtual wxSize DoGetBestSize() const; + + // return the text for the given column of the given item + virtual wxString OnGetItemText(long item, long column) const; + + // return the icon for the given item. In report view, OnGetItemImage will + // only be called for the first column. See OnGetItemColumnImage for + // details. + virtual int OnGetItemImage(long item) const; + + // return the icon for the given item and column. + virtual int OnGetItemColumnImage(long item, long column) const; + + // return the attribute for the item (may return NULL if none) + virtual wxListItemAttr *OnGetItemAttr(long item) const; + + // it calls our OnGetXXX() functions + friend class WXDLLEXPORT wxListMainWindow; + +private: + // create the header window + void CreateHeaderWindow(); + + // calculate and set height of the header + void CalculateAndSetHeaderHeight(); + + // reposition the header and the main window in the report view depending + // on whether it should be shown or not + void ResizeReportView(bool showHeader); + + DECLARE_EVENT_TABLE() +}; + +#if (!defined(__WXMSW__) || defined(__WXUNIVERSAL__)) && (!defined(__WXMAC__) || defined(__WXUNIVERSAL__)) +/* + * wxListCtrl has to be a real class or we have problems with + * the run-time information. + */ + +class WXDLLEXPORT wxListCtrl: public wxGenericListCtrl +{ +public: + wxListCtrl() {} + + wxListCtrl(wxWindow *parent, wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxLC_ICON, + const wxValidator &validator = wxDefaultValidator, + const wxString &name = wxListCtrlNameStr) + : wxGenericListCtrl(parent, winid, pos, size, style, validator, name) + { + } + +}; +#endif // !__WXMSW__ || __WXUNIVERSAL__ + +} // namespace MuleExtern + +#endif // LISTCTRL_287_H diff --git a/src/include/common/ClientVersion.h b/src/include/common/ClientVersion.h new file mode 100644 index 00000000..0456234f --- /dev/null +++ b/src/include/common/ClientVersion.h @@ -0,0 +1,67 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef CLIENTVERSION_H +#define CLIENTVERSION_H + +#ifdef HAVE_CONFIG_H + #include "config.h" // Needed for VERSION +#endif + + +// eMule version used on old MuleInfo packet (unimportant). +#define CURRENT_VERSION_SHORT 0x47 + +// This is only used to server login. It has no real "version" meaning anymore. +#define EDONKEYVERSION 0x3c + +// aMule version + +// No more Mod Version unless we're cvs + +// RELEASERS: REMOVE THE DEFINE ON THE RELEASES, PLEASE +// AND FIX THE MOD_VERSION_LONG + +#define __SVN__ + +#ifndef VERSION + #define VERSION "2.2.0" +#endif + +#ifdef __SVN__ + #define MOD_VERSION_LONG wxT("aMule SVN") +#else + #define MOD_VERSION_LONG (wxT("aMule ") wxT(VERSION)) +#endif + +#define VERSION_MJR 2 +#define VERSION_MIN 2 +#define VERSION_UPDATE 0 + +#ifndef PACKAGE +#define PACKAGE "amule" +#endif + +#endif // CLIENTVERSION_H diff --git a/src/include/common/Constants.h b/src/include/common/Constants.h new file mode 100644 index 00000000..100146fb --- /dev/null +++ b/src/include/common/Constants.h @@ -0,0 +1,34 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef COMMONCONSTANTS_H +#define COMMONMACROS_H + +const unsigned UNLIMITED = 0; + +#define MINWAIT_BEFORE_DLDISPLAY_WINDOWUPDATE 1500 +#define DISKSPACERECHECKTIME 60000 // checkDiskspace + +#endif // COMMONCONSTANTS_H diff --git a/src/include/common/DataFileVersion.h b/src/include/common/DataFileVersion.h new file mode 100644 index 00000000..f74fc778 --- /dev/null +++ b/src/include/common/DataFileVersion.h @@ -0,0 +1,48 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef DATAFILEVERSION_H +#define DATAFILEVERSION_H + +enum PreferencesDatFileVersions { + PREFFILE_VERSION = 0x14 //<<-- last change: reduced .dat, by using .ini +}; + +enum PartMetFileVersions { + PARTFILE_VERSION = 0xe0, + PARTFILE_SPLITTEDVERSION = 0xe1, // For edonkey part files importing. + PARTFILE_VERSION_LARGEFILE = 0xe2 +}; + +enum CreditFileVersions { + CREDITFILE_VERSION = 0x12 +}; + +enum KnownFileListVersions { + MET_HEADER = 0x0E, + MET_HEADER_WITH_LARGEFILES = 0x0F +}; + +#endif // DATAFILEVERSION_H diff --git a/src/include/common/EventIDs.h b/src/include/common/EventIDs.h new file mode 100644 index 00000000..948dc5c0 --- /dev/null +++ b/src/include/common/EventIDs.h @@ -0,0 +1,46 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef EVENTHANDLERS_H +#define EVENTHANDLERS_H + +// Handlers + +enum { + // Socket handlers + ID_LISTENSOCKET_EVENT = wxID_HIGHEST+123, // random safe ID + ID_CLIENTTCPSOCKET_EVENT, + ID_SERVERUDPSOCKET_EVENT, + ID_SERVERSOCKET_EVENT, + ID_CLIENTUDPSOCKET_EVENT, + ID_PROXY_SOCKET_EVENT, + + // Custom Timer Events + ID_CORE_TIMER_EVENT, + ID_GUI_TIMER_EVENT, + ID_SERVER_RETRY_TIMER_EVENT +}; + +#endif // EVENTHANDLERS_H diff --git a/src/include/common/Macros.h b/src/include/common/Macros.h new file mode 100644 index 00000000..99c86ebf --- /dev/null +++ b/src/include/common/Macros.h @@ -0,0 +1,41 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef COMMONMACROS_H +#define COMMONMACROS_H + +#define SEC2MS(sec) ((sec)*1000) +#define MIN2MS(min) SEC2MS((min)*60) +#define HR2MS(hr) MIN2MS((hr)*60) +#define DAY2MS(day) HR2MS((day)*24) +#define SEC(sec) (sec) +#define MIN2S(min) ((min)*60) +#define HR2S(hr) MIN2S((hr)*60) +#define DAY2S(day) HR2S((day)*24) + +#define COMPILE_DATE __DATE__ +#define COMPILE_TIME __TIME__ + +#endif // COMMONMACROS_H diff --git a/src/include/common/MenuIDs.h b/src/include/common/MenuIDs.h new file mode 100644 index 00000000..52087ec8 --- /dev/null +++ b/src/include/common/MenuIDs.h @@ -0,0 +1,130 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef COMMONMENUIDS_H +#define COMMONMENUIDS_H + +enum { + MP_MESSAGE = 11000, // Random start ID that doesn't conflict with wxDesigner + MP_DETAIL, + MP_ADDFRIEND, + MP_REMOVEFRIEND, + MP_SHOWLIST, + MP_FRIENDSLOT, + MP_CHANGE2FILE, + MP_CANCEL, + MP_STOP, + MP_RESUME, + MP_PAUSE, + MP_CLEARCOMPLETED, + MP_VIEW, + MP_SENDMESSAGE, + MP_WS, + MP_RAZORSTATS, + MP_ADDCOLLECTION, + MP_GETCOMMENTS, + MP_SEARCHRELATED, + MP_MARK_AS_KNOWN, +//For comments + MP_CMT, + + MP_PRIOVERYLOW, + MP_PRIOLOW, + MP_PRIONORMAL, + MP_PRIOHIGH, + MP_PRIOVERYHIGH, + MP_POWERSHARE, + MP_PRIOAUTO, + MP_GETMAGNETLINK, + MP_GETED2KLINK, + MP_GETSOURCEED2KLINK, + MP_GETCRYPTSOURCEDED2KLINK, + MP_GETHOSTNAMESOURCEED2KLINK, + MP_GETHOSTNAMECRYPTSOURCEED2KLINK, + MP_GETAICHED2KLINK, + MP_METINFO, + MP_CONNECTTO, + MP_REMOVE, + MP_REMOVEALL, + MP_UNBAN, + MP_ADDTOSTATIC, + MP_REMOVEFROMSTATIC, + MP_VIEWFILECOMMENTS, + MP_CAT_ADD, + MP_CAT_EDIT, + MP_CAT_REMOVE, + MP_TOOGLELIST, + MP_CLOSE_TAB, + MP_CLOSE_ALL_TABS, + MP_CLOSE_OTHER_TABS, + MP_RENAME, + +/* Razor 1a - Modif by MikaelB + Opcodes for : + - Drop No Needed Sources now + - Drop Full Queue Sources now + - Drop High Queue Rating Sources now + - Clean Up Sources now ( drop NNS, FQS and HQRS ) + - Swap every A4AF to this file now + - Swap every A4AF to this file ( AUTO ) + - Swap every A4AF to any other file now */ + MP_DROP_NO_NEEDED_SOURCES, + MP_DROP_FULL_QUEUE_SOURCES, + MP_DROP_HIGH_QUEUE_RATING_SOURCES, + MP_CLEAN_UP_SOURCES, + MP_SWAP_A4AF_TO_THIS, + MP_SWAP_A4AF_TO_THIS_AUTO, + MP_SWAP_A4AF_TO_ANY_OTHER, + +//menus + MP_MENU_PRIO, + MP_MENU_EXTD, + MP_MENU_CATS, + +// CMuleListCtrl tabs. + MP_LISTCOL_1, + MP_LISTCOL_2, + MP_LISTCOL_3, + MP_LISTCOL_4, + MP_LISTCOL_5, + MP_LISTCOL_6, + MP_LISTCOL_7, + MP_LISTCOL_8, + MP_LISTCOL_9, + MP_LISTCOL_10, + MP_LISTCOL_11, + MP_LISTCOL_12, + MP_LISTCOL_13, + MP_LISTCOL_14, + MP_LISTCOL_15, + + + MP_ASSIGNCAT = 10800, // reserve some for categories! + MP_CAT_SET0 = 10900, // reserve some for change all-cats (about 50) + MP_SWITCHCTRL_0 = 10950, + MP_SWITCHCTRL_9 = 10959 +}; + +#endif // COMMONMENUIDS_H diff --git a/src/include/protocol/Protocols.h b/src/include/protocol/Protocols.h new file mode 100644 index 00000000..58c0387a --- /dev/null +++ b/src/include/protocol/Protocols.h @@ -0,0 +1,54 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef ED2KPROTOCOLS_H +#define ED2KPROTOCOLS_H + +// For MuleInfoPacket (OLD - DEPRECATED.) +#define EMULE_PROTOCOL 0x01 + +// Known protocols +enum Protocols { + OP_EDONKEYHEADER = 0xE3, + OP_EDONKEYPROT = OP_EDONKEYHEADER, + OP_PACKEDPROT = 0xD4, + OP_EMULEPROT = 0xC5, + + // Reserved for later UDP headers (important for EncryptedDatagramSocket) + OP_UDPRESERVEDPROT1 = 0xA3, + OP_UDPRESERVEDPROT2 = 0xB2, + + // Kademlia 1/2 + OP_KADEMLIAHEADER = 0xE4, + OP_KADEMLIAPACKEDPROT = 0xE5, + + // Kry tests + OP_ED2KV2HEADER = 0xF4, + OP_ED2KV2PACKEDPROT = 0xF5, + + OP_MLDONKEYPROT = 0x00 +}; + +#endif // ED2KPROTOCOLS_H diff --git a/src/include/protocol/ed2k/Client2Client/TCP.h b/src/include/protocol/ed2k/Client2Client/TCP.h new file mode 100644 index 00000000..aecd2efa --- /dev/null +++ b/src/include/protocol/ed2k/Client2Client/TCP.h @@ -0,0 +1,102 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef ED2KC2CTCP_H +#define ED2KC2CTCP_H + +// Client <-> Client +enum ED2KStandardClientTCP { + OP_HELLO = 0x01, // 0x10<1 Tag_set> + OP_SENDINGPART = 0x46, // + OP_REQUESTPARTS = 0x47, // + OP_FILEREQANSNOFIL = 0x48, // + OP_END_OF_DOWNLOAD = 0x49, // // Unused for sending + OP_ASKSHAREDFILES = 0x4A, // (null) + OP_ASKSHAREDFILESANSWER = 0x4B, // (<1 Tag_set>)[count] + OP_HELLOANSWER = 0x4C, // <1 Tag_set> + OP_CHANGE_CLIENT_ID = 0x4D, // // Unused for sending + OP_MESSAGE = 0x4E, // + OP_SETREQFILEID = 0x4F, // + OP_FILESTATUS = 0x50, // + OP_HASHSETREQUEST = 0x51, // + OP_HASHSETANSWER = 0x52, // + OP_STARTUPLOADREQ = 0x54, // + OP_ACCEPTUPLOADREQ = 0x55, // (null) + OP_CANCELTRANSFER = 0x56, // (null) + OP_OUTOFPARTREQS = 0x57, // (null) + OP_REQUESTFILENAME = 0x58, // (more correctly file_name_request) + OP_REQFILENAMEANSWER = 0x59, // + OP_CHANGE_SLOT = 0x5B, // // Not used for sending + OP_QUEUERANK = 0x5C, // (slot index of the request) // Not used for sending + OP_ASKSHAREDDIRS = 0x5D, // (null) + OP_ASKSHAREDFILESDIR = 0x5E, // + OP_ASKSHAREDDIRSANS = 0x5F, // ()[count] + OP_ASKSHAREDFILESDIRANS = 0x60, // (<1 T + OP_ASKSHAREDDENIEDANS = 0x61 // (null) +}; + +// Extended prot client <-> Extended prot client +enum ED2KExtendedClientTCP { + OP_EMULEINFO = 0x01, // + OP_EMULEINFOANSWER = 0x02, // + OP_COMPRESSEDPART = 0x40, // + OP_QUEUERANKING = 0x60, // + OP_FILEDESC = 0x61, // + OP_VERIFYUPSREQ = 0x71, // (never used) + OP_VERIFYUPSANSWER = 0x72, // (never used) + OP_UDPVERIFYUPREQ = 0x73, // (never used) + OP_UDPVERIFYUPA = 0x74, // (never used) + OP_REQUESTSOURCES = 0x81, // + OP_ANSWERSOURCES = 0x82, // + OP_REQUESTSOURCES2 = 0x83, // + OP_ANSWERSOURCES2 = 0x84, // + OP_PUBLICKEY = 0x85, // + OP_SIGNATURE = 0x86, // v1: + // v2: + OP_SECIDENTSTATE = 0x87, // + OP_REQUESTPREVIEW = 0x90, // // Never used for sending on aMule + OP_PREVIEWANSWER = 0x91, // {frames * } // Never used for sending on aMule + OP_MULTIPACKET = 0x92, + OP_MULTIPACKETANSWER = 0x93, +// OP_PEERCACHE_QUERY = 0x94, // Unused on aMule - no PeerCache +// OP_PEERCACHE_ANSWER = 0x95, // Unused on aMule - no PeerCache +// OP_PEERCACHE_ACK = 0x96, // Unused on aMule - no PeerCache + OP_PUBLICIP_REQ = 0x97, + OP_PUBLICIP_ANSWER = 0x98, + OP_CALLBACK = 0x99, // + OP_REASKCALLBACKTCP = 0x9A, + OP_AICHREQUEST = 0x9B, // + OP_AICHANSWER = 0x9C, // + OP_AICHFILEHASHANS = 0x9D, + OP_AICHFILEHASHREQ = 0x9E, + OP_BUDDYPING = 0x9F, + OP_BUDDYPONG = 0xA0, + OP_COMPRESSEDPART_I64 = 0xA1, // + OP_SENDINGPART_I64 = 0xA2, // + OP_REQUESTPARTS_I64 = 0xA3, // + OP_MULTIPACKET_EXT = 0xA4 +}; + +#endif // ED2KC2CTCP_H diff --git a/src/include/protocol/ed2k/Client2Client/UDP.h b/src/include/protocol/ed2k/Client2Client/UDP.h new file mode 100644 index 00000000..850b7d3f --- /dev/null +++ b/src/include/protocol/ed2k/Client2Client/UDP.h @@ -0,0 +1,39 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef ED2KC2CUDP_H +#define ED2KC2CUDP_H + +// Extended prot client <-> Extended prot client UDP +enum ED2KExtendedClientUDP { + OP_REASKFILEPING = 0x90, // + OP_REASKACK = 0x91, // + OP_FILENOTFOUND = 0x92, // (null) + OP_QUEUEFULL = 0x93, // (null) + OP_REASKCALLBACKUDP = 0x94, + OP_PORTTEST = 0xFE // Connection Test +}; + +#endif // ED2KC2CUDP_H diff --git a/src/include/protocol/ed2k/Client2Server/TCP.h b/src/include/protocol/ed2k/Client2Server/TCP.h new file mode 100644 index 00000000..32e977ef --- /dev/null +++ b/src/include/protocol/ed2k/Client2Server/TCP.h @@ -0,0 +1,73 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef ED2KC2STCP_H +#define ED2KC2STCP_H + +enum OP_ClientToServerTCP { + OP_LOGINREQUEST = 0x01, // <1 Tag_set> + OP_REJECT = 0x05, // (null) + OP_GETSERVERLIST = 0x14, // (null)client->server + OP_OFFERFILES = 0x15, // (<1 Tag_set>)[count] + OP_SEARCHREQUEST = 0x16, // + OP_DISCONNECT = 0x18, // (not verified) + OP_GETSOURCES = 0x19, // + // v2 (17.3) (mandatory on 17.8) + // v2large (17.9) (large files only) + OP_SEARCH_USER = 0x1A, // + OP_CALLBACKREQUEST = 0x1C, // +// OP_QUERY_CHATS = 0x1D, // (deprecated, not supported by server any longer) +// OP_CHAT_MESSAGE = 0x1E, // (deprecated, not supported by server any longer) +// OP_JOIN_ROOM = 0x1F, // (deprecated, not supported by server any longer) + OP_QUERY_MORE_RESULT = 0x21, // (null) + OP_GETSOURCES_OBFU = 0x23, + OP_SERVERLIST = 0x32, // ()[count] server->client + OP_SEARCHRESULT = 0x33, // (<1 Tag_set>)[count] + OP_SERVERSTATUS = 0x34, // + OP_CALLBACKREQUESTED = 0x35, // + OP_CALLBACK_FAIL = 0x36, // (null notverified) + OP_SERVERMESSAGE = 0x38, // +// OP_CHAT_ROOM_REQUEST = 0x39, // (deprecated, not supported by server any longer) +// OP_CHAT_BROADCAST = 0x3A, // (deprecated, not supported by server any longer) +// OP_CHAT_USER_JOIN = 0x3B, // (deprecated, not supported by server any longer) +// OP_CHAT_USER_LEAVE = 0x3C, // (deprecated, not supported by server any longer) +// OP_CHAT_USER = 0x3D, // (deprecated, not supported by server any longer) + OP_IDCHANGE = 0x40, // + OP_SERVERIDENT = 0x41, // {1 TAG_SET} + OP_FOUNDSOURCES = 0x42, // ()[count] + OP_USERS_LIST = 0x43, // (<1 Tag_set>)[count] + OP_FOUNDSOURCES_OBFU = 0x44 // ((UserHash16 if obf&0x08))[count] +}; + +// Server TCP flags +#define SRV_TCPFLG_COMPRESSION 0x00000001 +#define SRV_TCPFLG_NEWTAGS 0x00000008 +#define SRV_TCPFLG_UNICODE 0x00000010 +#define SRV_TCPFLG_RELATEDSEARCH 0x00000040 +#define SRV_TCPFLG_TYPETAGINTEGER 0x00000080 +#define SRV_TCPFLG_LARGEFILES 0x00000100 +#define SRV_TCPFLG_TCPOBFUSCATION 0x00000400 + +#endif // ED2KC2STCP_H diff --git a/src/include/protocol/ed2k/Client2Server/UDP.h b/src/include/protocol/ed2k/Client2Server/UDP.h new file mode 100644 index 00000000..88966c30 --- /dev/null +++ b/src/include/protocol/ed2k/Client2Server/UDP.h @@ -0,0 +1,57 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef ED2KC2SUDP_H +#define ED2KC2SUDP_H + +enum OP_ClientToServerUDP { + OP_GLOBGETSOURCES2 = 0x94, // + // largefiles only: (17.8) + OP_GLOBSERVSTATREQ = 0x96, // (null) + OP_GLOBSERVSTATRES = 0x97, // + OP_GLOBSEARCHREQ = 0x98, // + OP_GLOBSEARCHRES = 0x99, // + OP_GLOBGETSOURCES = 0x9A, // + OP_GLOBFOUNDSOURCES = 0x9B, // + OP_GLOBCALLBACKREQ = 0x9C, // + OP_INVALID_LOWID = 0x9E, // + OP_SERVER_LIST_REQ = 0xA0, // + OP_SERVER_LIST_RES = 0xA1, // ()[count] + OP_SERVER_DESC_REQ = 0xA2, // (null) + OP_SERVER_DESC_RES = 0xA3, // + OP_SERVER_LIST_REQ2 = 0xA4 // (null) +}; + +// Server UDP flags +#define SRV_UDPFLG_EXT_GETSOURCES 0x00000001 +#define SRV_UDPFLG_EXT_GETFILES 0x00000002 +#define SRV_UDPFLG_NEWTAGS 0x00000008 +#define SRV_UDPFLG_UNICODE 0x00000010 +#define SRV_UDPFLG_EXT_GETSOURCES2 0x00000020 +#define SRV_UDPFLG_LARGEFILES 0x00000100 +#define SRV_UDPFLG_UDPOBFUSCATION 0x00000200 +#define SRV_UDPFLG_TCPOBFUSCATION 0x00000400 + +#endif // ED2KC2SUDP_H diff --git a/src/include/protocol/ed2k/ClientSoftware.h b/src/include/protocol/ed2k/ClientSoftware.h new file mode 100644 index 00000000..115c025e --- /dev/null +++ b/src/include/protocol/ed2k/ClientSoftware.h @@ -0,0 +1,50 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef CLIENTSOFTWARE_H +#define CLIENTSOFTWARE_H + +enum EClientSoftware { + SO_EMULE = 0, + SO_CDONKEY = 1, + SO_LXMULE = 2, + SO_AMULE = 3, + SO_SHAREAZA = 4, + SO_EMULEPLUS = 5, + SO_HYDRANODE = 6, + SO_NEW2_MLDONKEY = 0x0a, + SO_LPHANT = 0x14, + SO_NEW2_SHAREAZA = 0x28, + SO_EDONKEYHYBRID = 0x32, + SO_EDONKEY = 0x33, + SO_MLDONKEY = 0x34, + SO_OLDEMULE = 0x35, + SO_UNKNOWN = 0x36, + SO_NEW_SHAREAZA = 0x44, + SO_NEW_MLDONKEY = 0x98, + SO_COMPAT_UNK = 0xFF +}; + +#endif // CLIENTSOFTWARE_H diff --git a/src/include/protocol/ed2k/Constants.h b/src/include/protocol/ed2k/Constants.h new file mode 100644 index 00000000..09df9b7d --- /dev/null +++ b/src/include/protocol/ed2k/Constants.h @@ -0,0 +1,112 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef ED2KCONSTANTS_H +#define ED2KCONSTANTS_H + +#include + +// MOD Note: Do not change this part - Merkur + +// Timeouts & Reask times +#define CONNECTION_TIMEOUT 40000 // set this lower if you want less connections at once, set it higher if you have enough sockets (edonkey has its own timout too, so a very high value won't effect this) +#define FILEREASKTIME 1300000 // 1300000 <- original value *** +#define SERVERREASKTIME 800000 // don't set this too low, it wont speed up anything, but it could kill amule or your internetconnection +#define UDPSERVERREASKTIME 1300000 // 1300000 <- original value *** +#define SOURCECLIENTREASKS MIN2MS(40) //40 mins +#define SOURCECLIENTREASKF MIN2MS(5) //5 mins +#define UDPSERVERSTATTIME SEC2MS(5) //5 secs +#define UDPSERVSTATREASKTIME HR2MS(4.5) //4 hours - eMule uses HR2S, we are based on GetTickCount, hence MS +#define UDPSERVSTATMINREASKTIME MIN2MS(20) //minimum time between two pings even when trying to force a premature ping for a new UDP key +#define MINCOMMONPENALTY 4 // For file sources reask + +#define ED2KREPUBLISHTIME MIN2MS(1) //1 min + +#define UDPMAXQUEUETIME SEC2MS(30) //30 Seconds + +#define RSAKEYSIZE 384 //384 bits + +#define MAX_SOURCES_FILE_SOFT 500 +#define MAX_SOURCES_FILE_UDP 50 + +#define MAXFILECOMMENTLEN 50 + +#define MIN_UP_CLIENTS_ALLOWED 2 // min. clients allowed to download regardless UPLOAD_CLIENT_DATARATE or any other factors. Don't set this too high + +#define SOURCEEXCHANGE2_VERSION 4 // replaces the version sent in MISC_OPTIONS flag fro SX1 + +// MOD Note: end + +#define MAXCONPER5SEC 20 +#define UPLOAD_CLIENT_DATARATE 3072 +#define MAX_UP_CLIENTS_ALLOWED 250 // max. clients allowed regardless UPLOAD_CLIENT_DATARATE or any other factors. Don't set this too low, use DATARATE to adjust uploadspeed per client +#define DOWNLOADTIMEOUT 100000 +#define CONSERVTIMEOUT 25000 // agelimit for pending connection attempts +#define RARE_FILE 50 +#define MIN_REQUESTTIME 590000 +#define MAX_PURGEQUEUETIME HR2MS(1) +#define PURGESOURCESWAPSTOP MIN2MS(15) // How long forbid swapping a source to a certain file (NNP,...) +#define CONNECTION_LATENCY 22050 // latency for responces +#define CLIENTBANTIME HR2MS(2) // 2h +#define TRACKED_CLEANUP_TIME HR2MS(1) +#define KEEPTRACK_TIME HR2MS(2) // how long to keep track of clients which were once in the uploadqueue +#define CLIENTLIST_CLEANUP_TIME MIN2MS(34) // 34 min + +// (4294967295/PARTSIZE)*PARTSIZE = ~4GB +#ifdef _MSC_VER +#define OLD_MAX_FILE_SIZE 4290048000ui64 +#else +#define OLD_MAX_FILE_SIZE 4290048000ull +#endif + +// = 2^38 = 256GB +#ifdef _MSC_VER + #define MAX_FILE_SIZE 0x4000000000ui64 +#else + #define MAX_FILE_SIZE 0x4000000000ull +#endif + +const uint64 PARTSIZE = 9728000ull; +const uint32 BLOCKSIZE = 184320u; +const uint32 EMBLOCKSIZE = 184320u; + +#define INV_SERV_DESC_LEN 0xF0FF // Used as an 'invalid' string len for OP_SERVER_DESC_REQ/RES + +// This 'identifier' is used for referencing shared part (incomplete) files with the OP_ASKSHAREDDIRS and related opcodes +// it was introduced with eDonkeyHybrid and is considered as part of the protocol. +#define OP_INCOMPLETE_SHARED_FILES wxT("!Incomplete Files") + +// ed2k search expression comparison operators +// kad operators used to be different, but are the same since eMule 0.47a +enum ed2k_search_compare { + ED2K_SEARCH_OP_EQUAL = 0, // eserver 16.45+ + ED2K_SEARCH_OP_GREATER, // dserver + ED2K_SEARCH_OP_LESS, // dserver + ED2K_SEARCH_OP_GREATER_EQUAL, // eserver 16.45+ + ED2K_SEARCH_OP_LESS_EQUAL, // eserver 16.45+ + ED2K_SEARCH_OP_NOTEQUAL +}; + +#endif // ED2KCONSTANTS_H diff --git a/src/include/protocol/kad/Client2Client/UDP.h b/src/include/protocol/kad/Client2Client/UDP.h new file mode 100644 index 00000000..96c4e53c --- /dev/null +++ b/src/include/protocol/kad/Client2Client/UDP.h @@ -0,0 +1,61 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef KADC2CUDP_H +#define KADC2CUDP_H + +enum KademliaV1OPcodes { + KADEMLIA_BOOTSTRAP_REQ = 0x00, // + KADEMLIA_BOOTSTRAP_RES = 0x08, // *(CNT) + + KADEMLIA_HELLO_REQ = 0x10, // + KADEMLIA_HELLO_RES = 0x18, // + + KADEMLIA_REQ = 0x20, // + KADEMLIA_RES = 0x28, // *(CNT) + + KADEMLIA_SEARCH_REQ = 0x30, // [ext] + // UNUSED = 0x31, // Old Opcode, don't use. + KADEMLIA_SRC_NOTES_REQ = 0x32, // + KADEMLIA_SEARCH_RES = 0x38, // ( *(CNT2))*(CNT1) + // UNUSED = 0x39, // Old Opcode, don't use. + KADEMLIA_SRC_NOTES_RES = 0x3A, // ( *(CNT2))*(CNT1) + + KADEMLIA_PUBLISH_REQ = 0x40, // ( *(CNT2))*(CNT1) + // UNUSED = 0x41, // Old Opcode, don't use. + KADEMLIA_PUB_NOTES_REQ = 0x42, // *(CNT2))*(CNT1) + KADEMLIA_PUBLISH_RES = 0x48, // + // UNUSED = 0x49, // Old Opcode, don't use. + KADEMLIA_PUB_NOTES_RES = 0x4A, // + + KADEMLIA_FIREWALLED_REQ = 0x50, // + KADEMLIA_FINDBUDDY_REQ = 0x51, // + KADEMLIA_CALLBACK_REQ = 0x52, // + KADEMLIA_FIREWALLED_RES = 0x58, // + KADEMLIA_FIREWALLED_ACK = 0x59, // (null) + KADEMLIA_FINDBUDDY_RES = 0x5A // +}; + +#endif // KADC2CUDP_H diff --git a/src/include/protocol/kad/Constants.h b/src/include/protocol/kad/Constants.h new file mode 100644 index 00000000..f10f2416 --- /dev/null +++ b/src/include/protocol/kad/Constants.h @@ -0,0 +1,60 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef KADCONSTANTS_H +#define KADCONSTANTS_H + +// Kad search expression comparison operators +enum kad_search_compare { + KAD_SEARCH_OP_GREATER_EQUAL = 1, // eMule 0.40+; NOTE: this different than ED2K! + KAD_SEARCH_OP_LESS_EQUAL // eMule 0.40+; NOTE: this different than ED2K! +}; + +// MOD Note: Do not change this part - Merkur + +#define KADEMLIAASKTIME SEC2MS(1) //1 second +#define KADEMLIATOTALFILE 7 //Total files to search sources for. +#define KADEMLIAREASKTIME HR2MS(1) //1 hour +#define KADEMLIAPUBLISHTIME SEC(2) //2 second +#define KADEMLIATOTALSTORENOTES 1 //Total hashes to store. +#define KADEMLIATOTALSTORESRC 2 //Total hashes to store. +#define KADEMLIATOTALSTOREKEY 1 //Total hashes to store. +#define KADEMLIAREPUBLISHTIMES HR2S(5) //5 hours +#define KADEMLIAREPUBLISHTIMEN HR2S(24) //24 hours +#define KADEMLIAREPUBLISHTIMEK HR2S(24) //24 hours +#define KADEMLIADISCONNECTDELAY MIN2S(20) //20 mins +#define KADEMLIAMAXINDEX 50000 //Total keyword indexes. +#define KADEMLIAMAXENTRIES 60000 //Total keyword entries. +#define KADEMLIAMAXSOUCEPERFILE 300 //Max number of sources per file in index. +#define KADEMLIAMAXNOTESPERFILE 50 //Max number of notes per entry in index. +#define KADEMLIABUDDYTIMEOUT MIN2MS(10) // 10 min to receive the buddy +// MOD Note: end + +// Kad parameters +#define KADEMLIA_FIND_VALUE 0x02 +#define KADEMLIA_STORE 0x04 +#define KADEMLIA_FIND_NODE 0x0B + +#endif // KADCONSTANTS_H diff --git a/src/include/protocol/kad2/Client2Client/UDP.h b/src/include/protocol/kad2/Client2Client/UDP.h new file mode 100644 index 00000000..543d4639 --- /dev/null +++ b/src/include/protocol/kad2/Client2Client/UDP.h @@ -0,0 +1,45 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef KAD2C2CUDP_H +#define KAD2C2CUDP_H + +enum KademliaV2OPCodes { + KADEMLIA2_BOOTSTRAP_REQ = 0x01, + KADEMLIA2_BOOTSTRAP_RES = 0x09, + KADEMLIA2_HELLO_REQ = 0x11, + KADEMLIA2_HELLO_RES = 0x19, + KADEMLIA2_REQ = 0x21, + KADEMLIA2_RES = 0x29, + KADEMLIA2_SEARCH_KEY_REQ = 0x33, + KADEMLIA2_SEARCH_NOTES_REQ = 0x35, + KADEMLIA2_SEARCH_RES = 0x3B, + KADEMLIA2_PUBLISH_KEY_REQ = 0x43, + KADEMLIA2_PUBLISH_SOURCE_REQ = 0x44, + KADEMLIA2_PUBLISH_NOTES_REQ = 0x45, + KADEMLIA2_PUBLISH_RES = 0x4B +}; + +#endif // KAD2C2CUDP_H diff --git a/src/include/protocol/kad2/Constants.h b/src/include/protocol/kad2/Constants.h new file mode 100644 index 00000000..6a7c07b4 --- /dev/null +++ b/src/include/protocol/kad2/Constants.h @@ -0,0 +1,29 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef KAD2CONSTANTS_H +#define KAD2CONSTANTS_H + +#endif // KAD2CONSTANTS_H diff --git a/src/include/tags/ClientTags.h b/src/include/tags/ClientTags.h new file mode 100644 index 00000000..1a168997 --- /dev/null +++ b/src/include/tags/ClientTags.h @@ -0,0 +1,68 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef CLIENTTAGS_H +#define CLIENTTAGS_H + +enum client_tags { + CT_NAME = 0x01, + CT_PORT = 0x0F, + CT_VERSION = 0x11, + CT_SERVER_FLAGS = 0x20, // currently only used to inform a server about supported features + CT_EMULECOMPAT_OPTIONS = 0xEF, + CT_EMULE_RESERVED1 = 0xF0, + CT_EMULE_RESERVED2 = 0xF1, + CT_EMULE_RESERVED3 = 0xF2, + CT_EMULE_RESERVED4 = 0xF3, + CT_EMULE_RESERVED5 = 0xF4, + CT_EMULE_RESERVED6 = 0xF5, + CT_EMULE_RESERVED7 = 0xF6, + CT_EMULE_RESERVED8 = 0xF7, + CT_EMULE_RESERVED9 = 0xF8, + CT_EMULE_UDPPORTS = 0xF9, + CT_EMULE_MISCOPTIONS1 = 0xFA, + CT_EMULE_VERSION = 0xFB, + CT_EMULE_BUDDYIP = 0xFC, + CT_EMULE_BUDDYUDP = 0xFD, + CT_EMULE_MISCOPTIONS2 = 0xFE, + CT_EMULE_RESERVED13 = 0xFF +}; + +// Old MuleInfo tags +enum MuleInfo_tags { + ET_COMPRESSION = 0x20u, + ET_UDPPORT = 0x21u, + ET_UDPVER = 0x22u, + ET_SOURCEEXCHANGE = 0x23u, + ET_COMMENTS = 0x24u, + ET_EXTENDEDREQUEST = 0x25u, + ET_COMPATIBLECLIENT = 0x26u, + ET_FEATURES = 0x27u, //! bit 0: SecIdent v1 - bit 1: SecIdent v2 + ET_MOD_VERSION = 0x55u, + // ET_FEATURESET = 0x54u, // int - [Bloodymad Featureset] // UNUSED + ET_OS_INFO = 0x94u // Reused rand tag (MOD_OXY), because the type is unknown +}; + +#endif // CLIENTTAGS_H diff --git a/src/include/tags/FileTags.h b/src/include/tags/FileTags.h new file mode 100644 index 00000000..53ca6904 --- /dev/null +++ b/src/include/tags/FileTags.h @@ -0,0 +1,135 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef FILETAGS_H +#define FILETAGS_H + +// ED2K search + known.met + .part.met +#define FT_FILENAME 0x01 // +#define FT_FILESIZE 0x02 // +#define FT_FILESIZE_HI 0x3A // +#define FT_FILETYPE 0x03 // or +#define FT_FILEFORMAT 0x04 // +#define FT_LASTSEENCOMPLETE 0x05 // +#define FT_TRANSFERRED 0x08 // +#define FT_GAPSTART 0x09 // +#define FT_GAPEND 0x0A // +#define FT_PARTFILENAME 0x12 // +#define FT_OLDDLPRIORITY 0x13 // Not used anymore +#define FT_STATUS 0x14 // +#define FT_SOURCES 0x15 // +#define FT_PERMISSIONS 0x16 // +#define FT_OLDULPRIORITY 0x17 // Not used anymore +#define FT_DLPRIORITY 0x18 // Was 13 +#define FT_ULPRIORITY 0x19 // Was 17 +#define FT_KADLASTPUBLISHKEY 0x20 // +#define FT_KADLASTPUBLISHSRC 0x21 // +#define FT_FLAGS 0x22 // +#define FT_DL_ACTIVE_TIME 0x23 // +#define FT_CORRUPTEDPARTS 0x24 // +#define FT_DL_PREVIEW 0x25 +#define FT_KADLASTPUBLISHNOTES 0x26 // +#define FT_AICH_HASH 0x27 +#define FT_COMPLETE_SOURCES 0x30 // nr. of sources which share a + // complete version of the + // associated file (supported + // by eserver 16.46+) statistic + +#define FT_ATTRANSFERRED 0x50 // +#define FT_ATREQUESTED 0x51 // +#define FT_ATACCEPTED 0x52 // +#define FT_CATEGORY 0x53 // +#define FT_ATTRANSFERREDHI 0x54 // +#define FT_MEDIA_ARTIST 0xD0 // +#define FT_MEDIA_ALBUM 0xD1 // +#define FT_MEDIA_TITLE 0xD2 // +#define FT_MEDIA_LENGTH 0xD3 // !!! +#define FT_MEDIA_BITRATE 0xD4 // +#define FT_MEDIA_CODEC 0xD5 // +#define FT_FILERATING 0xF7 // + + +// Kad search + some unused tags to mirror the ed2k ones. +#define TAG_FILENAME wxT("\x01") // +#define TAG_FILESIZE wxT("\x02") // +#define TAG_FILESIZE_HI wxT("\x3A") // +#define TAG_FILETYPE wxT("\x03") // +#define TAG_FILEFORMAT wxT("\x04") // +#define TAG_COLLECTION wxT("\x05") +#define TAG_PART_PATH wxT("\x06") // +#define TAG_PART_HASH wxT("\x07") +#define TAG_COPIED wxT("\x08") // +#define TAG_GAP_START wxT("\x09") // +#define TAG_GAP_END wxT("\x0A") // +#define TAG_DESCRIPTION wxT("\x0B") // +#define TAG_PING wxT("\x0C") +#define TAG_FAIL wxT("\x0D") +#define TAG_PREFERENCE wxT("\x0E") +#define TAG_PORT wxT("\x0F") +#define TAG_IP_ADDRESS wxT("\x10") +#define TAG_VERSION wxT("\x11") // +#define TAG_TEMPFILE wxT("\x12") // +#define TAG_PRIORITY wxT("\x13") // +#define TAG_STATUS wxT("\x14") // +#define TAG_SOURCES wxT("\x15") // +#define TAG_AVAILABILITY wxT("\x15") // +#define TAG_PERMISSIONS wxT("\x16") +#define TAG_QTIME wxT("\x16") +#define TAG_PARTS wxT("\x17") +#define TAG_MEDIA_ARTIST wxT("\xD0") // +#define TAG_MEDIA_ALBUM wxT("\xD1") // +#define TAG_MEDIA_TITLE wxT("\xD2") // +#define TAG_MEDIA_LENGTH wxT("\xD3") // !!! +#define TAG_MEDIA_BITRATE wxT("\xD4") // +#define TAG_MEDIA_CODEC wxT("\xD5") // +#define TAG_ENCRYPTION wxT("\xF3") // +#define TAG_FILERATING wxT("\xF7") // +#define TAG_BUDDYHASH wxT("\xF8") // +#define TAG_CLIENTLOWID wxT("\xF9") // +#define TAG_SERVERPORT wxT("\xFA") // +#define TAG_SERVERIP wxT("\xFB") // +#define TAG_SOURCEUPORT wxT("\xFC") // +#define TAG_SOURCEPORT wxT("\xFD") // +#define TAG_SOURCEIP wxT("\xFE") // +#define TAG_SOURCETYPE wxT("\xFF") // + +// Media values for FT_FILETYPE +#define ED2KFTSTR_AUDIO wxT("Audio") +#define ED2KFTSTR_VIDEO wxT("Video") +#define ED2KFTSTR_IMAGE wxT("Image") +#define ED2KFTSTR_DOCUMENT wxT("Doc") +#define ED2KFTSTR_PROGRAM wxT("Pro") +#define ED2KFTSTR_ARCHIVE wxT("Arc") // *Mule internal use only +#define ED2KFTSTR_CDIMAGE wxT("Iso") // *Mule internal use only + +// Additional media meta data tags from eDonkeyHybrid (note also the uppercase/lowercase) +#define FT_ED2K_MEDIA_ARTIST "Artist" // +#define FT_ED2K_MEDIA_ALBUM "Album" // +#define FT_ED2K_MEDIA_TITLE "Title" // +#define FT_ED2K_MEDIA_LENGTH "length" // !!! +#define FT_ED2K_MEDIA_BITRATE "bitrate" // +#define FT_ED2K_MEDIA_CODEC "codec" // + +#endif // FILETAGS_H diff --git a/src/include/tags/ServerTags.h b/src/include/tags/ServerTags.h new file mode 100644 index 00000000..85a4ce02 --- /dev/null +++ b/src/include/tags/ServerTags.h @@ -0,0 +1,55 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef SERVERTAGS_H +#define SERVERTAGS_H + +// server.met and server status. +enum Server_tags { + ST_SERVERNAME = 0x01, // + // Unused (0x02-0x0A) + ST_DESCRIPTION = 0x0B, // + ST_PING = 0x0C, // + ST_FAIL = 0x0D, // + ST_PREFERENCE = 0x0E, // + // Unused (0x0F-0x84) + ST_DYNIP = 0x85, + ST_LASTPING_DEPRECATED = 0x86, // // DEPRECATED, use 0x90 + ST_MAXUSERS = 0x87, + ST_SOFTFILES = 0x88, + ST_HARDFILES = 0x89, + // Unused (0x8A-0x8F) + ST_LASTPING = 0x90, // + ST_VERSION = 0x91, // + ST_UDPFLAGS = 0x92, // + ST_AUXPORTSLIST = 0x93, // + ST_LOWIDUSERS = 0x94, // + ST_UDPKEY = 0x95, // + ST_UDPKEYIP = 0x96, // + ST_TCPPORTOBFUSCATION = 0x97, // + ST_UDPPORTOBFUSCATION = 0x98 // +}; + +#endif // SERVERTAGS_H diff --git a/src/include/tags/TagTypes.h b/src/include/tags/TagTypes.h new file mode 100644 index 00000000..cebcdab2 --- /dev/null +++ b/src/include/tags/TagTypes.h @@ -0,0 +1,79 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef COMMONTAGTYPES_H +#define COMMONTAGTYPES_H + +enum Tag_Types { + TAGTYPE_HASH16 = 0x01, + TAGTYPE_STRING = 0x02, + TAGTYPE_UINT32 = 0x03, + TAGTYPE_FLOAT32 = 0x04, + TAGTYPE_BOOL = 0x05, + TAGTYPE_BOOLARRAY = 0x06, + TAGTYPE_BLOB = 0x07, + TAGTYPE_UINT16 = 0x08, + TAGTYPE_UINT8 = 0x09, + TAGTYPE_BSOB = 0x0A, + TAGTYPE_UINT64 = 0x0B, + + // Compressed string types + TAGTYPE_STR1 = 0x11, + TAGTYPE_STR2, + TAGTYPE_STR3, + TAGTYPE_STR4, + TAGTYPE_STR5, + TAGTYPE_STR6, + TAGTYPE_STR7, + TAGTYPE_STR8, + TAGTYPE_STR9, + TAGTYPE_STR10, + TAGTYPE_STR11, + TAGTYPE_STR12, + TAGTYPE_STR13, + TAGTYPE_STR14, + TAGTYPE_STR15, + TAGTYPE_STR16, + TAGTYPE_STR17, // accepted by eMule 0.42f (02-Mai-2004) in receiving code + // only because of a flaw, those tags are handled correctly, + // but should not be handled at all + TAGTYPE_STR18, // accepted by eMule 0.42f (02-Mai-2004) in receiving code + // only because of a flaw, those tags are handled correctly, + // but should not be handled at all + TAGTYPE_STR19, // accepted by eMule 0.42f (02-Mai-2004) in receiving code + // only because of a flaw, those tags are handled correctly, + // but should not be handled at all + TAGTYPE_STR20, // accepted by eMule 0.42f (02-Mai-2004) in receiving code + // only because of a flaw, those tags are handled correctly, + // but should not be handled at all + TAGTYPE_STR21, // accepted by eMule 0.42f (02-Mai-2004) in receiving code + // only because of a flaw, those tags are handled correctly, + // but should not be handled at all + TAGTYPE_STR22 // accepted by eMule 0.42f (02-Mai-2004) in receiving code + // only because of a flaw, those tags are handled correctly, + // but should not be handled at all +}; + +#endif // COMMONTAGTYPES_H diff --git a/src/inetdownload.h b/src/inetdownload.h new file mode 100644 index 00000000..40c500ea --- /dev/null +++ b/src/inetdownload.h @@ -0,0 +1,1086 @@ +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef INETDOWNLOAD_H +#define INETDOWNLOAD_H + +static unsigned char inetDownload[] = { +0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x72, 0x00, 0x28, 0x00, 0x84, 0x0a, 0x00, 0x00, 0xff, 0xff, +0x00, 0x00, 0x00, 0xcf, 0xcf, 0xcf, 0xb0, 0xb0, 0xb0, 0x9f, 0x9f, 0x9f, 0xa0, 0xa0, 0xa0, 0x20, +0x20, 0x20, 0x8f, 0x8f, 0x8f, 0x5f, 0x5f, 0x5f, 0xd0, 0xd0, 0xd0, 0xff, 0xff, 0xff, 0xbf, 0xbf, +0xbf, 0x6f, 0x6f, 0x6f, 0xef, 0xef, 0xef, 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, +0xff, 0xf0, 0xef, 0xff, 0xef, 0xd0, 0xff, 0xd0, 0xd0, 0xff, 0xaf, 0xc0, 0x70, 0x70, 0x70, 0xff, +0xaf, 0xaf, 0xff, 0xc0, 0xaf, 0x9a, 0x9a, 0x9a, 0x89, 0x89, 0x89, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0x0b, +0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x50, 0x45, 0x32, 0x2e, 0x30, 0x03, 0x01, 0x00, 0x00, 0x00, +0x21, 0xf9, 0x04, 0x09, 0x24, 0x00, 0x1f, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, +0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, +0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, 0x78, 0xae, 0xef, 0x7c, 0xef, 0xff, 0xc0, 0xa0, 0x30, 0x67, +0x30, 0x0c, 0x8f, 0x06, 0xc2, 0xc2, 0x78, 0xe4, 0x05, 0x9e, 0xa2, 0xe4, 0x62, 0xd9, 0xd4, 0x05, +0x26, 0x93, 0x43, 0xe0, 0x23, 0xa5, 0x56, 0x6f, 0x57, 0x6c, 0xf6, 0x13, 0x20, 0x0c, 0xbc, 0xdf, +0xda, 0x95, 0x82, 0xd5, 0x96, 0xcf, 0xcc, 0x34, 0x6d, 0xcd, 0xae, 0x94, 0xcd, 0x83, 0xb8, 0x5c, +0x16, 0xb0, 0x50, 0x2c, 0x16, 0x76, 0x04, 0x66, 0x7a, 0x7b, 0x31, 0x57, 0x80, 0x13, 0x76, 0x10, +0x83, 0x85, 0x86, 0x2f, 0x6b, 0x58, 0x8b, 0x8d, 0x8f, 0x29, 0x45, 0x97, 0x7a, 0x01, 0x15, 0x75, +0x05, 0x01, 0x10, 0x8c, 0x8e, 0x95, 0x45, 0x09, 0xa4, 0xa4, 0x08, 0x97, 0x64, 0x15, 0x8a, 0x05, +0x9d, 0x9f, 0x10, 0xa1, 0x86, 0x06, 0xa4, 0x53, 0x0b, 0x03, 0x02, 0x0a, 0xb8, 0x0a, 0x06, 0x01, +0x05, 0x15, 0xac, 0x5a, 0x9f, 0x0b, 0x0c, 0xb0, 0x69, 0xb2, 0x02, 0x02, 0xb4, 0x0b, 0xb9, 0xb8, +0x0e, 0xc7, 0xac, 0x03, 0x08, 0xbc, 0xb8, 0xc3, 0x95, 0x51, 0x09, 0xc7, 0xc9, 0xca, 0xcb, 0xcd, +0x03, 0xdd, 0xb6, 0xc7, 0x0a, 0x0d, 0x0d, 0xd4, 0x8f, 0xc6, 0xc7, 0xc8, 0x53, 0xcb, 0xcc, 0xde, +0xec, 0x02, 0xe2, 0xe3, 0xc4, 0x43, 0xb2, 0xd7, 0xdf, 0xe9, 0xea, 0x0a, 0x0e, 0xde, 0x4f, 0x01, +0xdf, 0xef, 0x0c, 0x5b, 0x7b, 0xcc, 0x2d, 0x40, 0xa7, 0x4d, 0x5d, 0xbe, 0x6e, 0x4f, 0x14, 0xf0, +0x73, 0xd7, 0xc0, 0xc1, 0xbf, 0x58, 0xd7, 0x90, 0x61, 0xbb, 0xb7, 0x0e, 0xe1, 0x3e, 0x5b, 0x0e, +0x32, 0x3a, 0x00, 0x58, 0x2c, 0xc1, 0x00, 0x02, 0xe8, 0xce, 0x50, 0xc4, 0x27, 0x40, 0xdf, 0x13, +0x8c, 0x1a, 0xb7, 0x39, 0x56, 0x09, 0x60, 0xa0, 0x1b, 0xc8, 0x29, 0xdd, 0xee, 0x45, 0x20, 0xc9, +0x8e, 0x9d, 0xc6, 0x8d, 0x69, 0xf8, 0xb5, 0xfc, 0x48, 0x70, 0x80, 0xcc, 0x08, 0x19, 0x4b, 0xd6, +0x7c, 0x97, 0x51, 0xe5, 0x11, 0x9d, 0x2e, 0x05, 0x28, 0xa9, 0xe5, 0x53, 0xc1, 0x4c, 0xa7, 0x11, +0x80, 0x72, 0xf3, 0x86, 0x2b, 0xc2, 0x04, 0x71, 0x46, 0x87, 0xe8, 0x84, 0x30, 0xe0, 0xc0, 0xa0, +0x03, 0x30, 0xab, 0x46, 0x1d, 0x2b, 0x55, 0xe8, 0xad, 0x08, 0x17, 0xd2, 0xc6, 0x03, 0xc2, 0x92, +0xeb, 0xc7, 0xaf, 0x0b, 0xcc, 0x40, 0x25, 0x3b, 0xf3, 0xa6, 0x03, 0xa8, 0x15, 0x22, 0xac, 0xfd, +0xd1, 0x96, 0xdd, 0xd7, 0x03, 0x3e, 0xc7, 0x3a, 0x9d, 0x1b, 0x41, 0x42, 0x84, 0x03, 0xc3, 0x76, +0xed, 0x0d, 0x62, 0xe0, 0x80, 0xe3, 0x9a, 0x81, 0xc9, 0x8a, 0x95, 0x20, 0xc1, 0xf1, 0x62, 0x24, +0x8e, 0x33, 0x0f, 0xa5, 0x1b, 0xb5, 0x41, 0x85, 0x03, 0xe2, 0x2e, 0x63, 0xce, 0xfc, 0xd8, 0x1b, +0x26, 0x03, 0xef, 0x1a, 0x38, 0x0e, 0x5d, 0x8d, 0x44, 0x00, 0xd2, 0xa4, 0x19, 0x30, 0x60, 0x8d, +0x3a, 0x75, 0x01, 0xd6, 0xad, 0xb9, 0xc8, 0xde, 0xcd, 0x3b, 0xb5, 0x91, 0xda, 0xef, 0x50, 0xe5, +0xde, 0x47, 0xfc, 0xc9, 0x69, 0x26, 0xc7, 0xab, 0x85, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x0c, +0x00, 0x1f, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, +0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, +0xdf, 0x78, 0xae, 0xef, 0x7c, 0xef, 0x9f, 0x06, 0xc3, 0x6f, 0x88, 0x32, 0x10, 0x16, 0x42, 0xe2, +0x2f, 0xc0, 0x14, 0x19, 0x17, 0x48, 0x65, 0x2f, 0x30, 0x99, 0x1c, 0x02, 0x9f, 0x67, 0x54, 0xaa, +0xa3, 0x56, 0xad, 0x9f, 0x00, 0x61, 0xb0, 0xe5, 0xe2, 0xa8, 0x94, 0xea, 0x55, 0x4c, 0x4e, 0x9a, +0x6f, 0xe8, 0x74, 0x45, 0x3c, 0x1e, 0xb8, 0xdf, 0xb5, 0x80, 0x85, 0x62, 0xb1, 0xcc, 0x09, 0x63, +0x77, 0x78, 0x34, 0x54, 0x7d, 0x13, 0x73, 0x10, 0x80, 0x82, 0x83, 0x32, 0x68, 0x55, 0x88, 0x8a, +0x8c, 0x36, 0x01, 0x15, 0x72, 0x05, 0x01, 0x10, 0x89, 0x8b, 0x92, 0x2f, 0x94, 0x87, 0x05, 0x97, +0x99, 0x10, 0x9b, 0x9c, 0x23, 0x41, 0xa7, 0x6e, 0x06, 0x01, 0x05, 0x15, 0xa0, 0x57, 0x99, 0x0b, +0x0c, 0xa4, 0x92, 0x41, 0x09, 0xb6, 0xb6, 0x08, 0xa7, 0x0e, 0x02, 0x02, 0xa0, 0x03, 0x08, 0xab, +0x0a, 0x0a, 0xb2, 0xa5, 0x25, 0x06, 0xb6, 0x50, 0x0b, 0x03, 0x02, 0xc2, 0xc2, 0xbb, 0x03, 0xd0, +0xcb, 0xbc, 0x0a, 0x0d, 0x0d, 0xc4, 0xc5, 0x59, 0x09, 0xbc, 0xc9, 0x0b, 0xcd, 0xce, 0xd1, 0xe0, +0x02, 0xd5, 0xd6, 0xb3, 0x66, 0xc7, 0xdb, 0xdc, 0xde, 0x0a, 0x0e, 0xd1, 0x4c, 0x01, 0xd2, 0xe3, +0x0c, 0x58, 0x9c, 0xe7, 0xbc, 0x02, 0xc9, 0xea, 0xeb, 0xed, 0x01, 0x0a, 0xef, 0xe2, 0x0d, 0x0e, +0xe4, 0xd1, 0xb3, 0x25, 0x40, 0x1a, 0x94, 0x7c, 0xfa, 0xa0, 0xb9, 0xf3, 0xe7, 0xa0, 0xa1, 0x83, +0x79, 0x8c, 0xea, 0x2d, 0xb8, 0x77, 0x30, 0xdf, 0x33, 0x85, 0x4c, 0x96, 0x39, 0x7c, 0x38, 0x70, +0xdb, 0x36, 0x84, 0xeb, 0x0a, 0x82, 0x8b, 0xb6, 0x11, 0x22, 0x9e, 0x63, 0x03, 0xbe, 0x08, 0x50, +0x24, 0x03, 0xb2, 0xa1, 0x48, 0x70, 0xe3, 0x1a, 0x9a, 0x34, 0x13, 0xc0, 0x00, 0x34, 0x95, 0x50, +0xa0, 0xe5, 0x8b, 0xa0, 0x20, 0x82, 0x4b, 0x70, 0xc2, 0x22, 0x4c, 0xa8, 0x36, 0x53, 0xca, 0x3b, +0x9b, 0x29, 0x29, 0x2a, 0xdb, 0x19, 0xa1, 0xe9, 0xcf, 0x65, 0x3d, 0x2f, 0x48, 0x2d, 0xb7, 0xc4, +0xce, 0x4d, 0x01, 0x47, 0x94, 0x0d, 0x08, 0x1a, 0xb4, 0x29, 0xcf, 0x8d, 0x0e, 0x7a, 0x46, 0xa8, +0x10, 0x81, 0xaa, 0x8f, 0xa3, 0x10, 0x06, 0x1c, 0x00, 0x74, 0x20, 0x67, 0x57, 0xaf, 0x62, 0x9b, +0x4a, 0x88, 0x70, 0x40, 0x96, 0x2a, 0xb3, 0x67, 0x47, 0xa5, 0x4d, 0xc9, 0x76, 0xc1, 0x98, 0xb8, +0x4d, 0xbb, 0x4a, 0x90, 0x70, 0xe0, 0x00, 0x5e, 0x25, 0x35, 0xf7, 0xde, 0x24, 0x50, 0x78, 0x2b, +0x5c, 0xaf, 0x11, 0x1a, 0x54, 0x38, 0x50, 0xed, 0xb0, 0x14, 0x03, 0x85, 0x0f, 0x8c, 0x74, 0x0c, +0xd9, 0xc0, 0xb8, 0x06, 0x85, 0x2b, 0x63, 0x73, 0x92, 0xb9, 0x31, 0x4c, 0xaf, 0x4c, 0x3c, 0x7f, +0x2e, 0x20, 0x7a, 0x34, 0xe6, 0xd2, 0x9a, 0xa3, 0xa1, 0x72, 0xf2, 0xb9, 0xc1, 0xa9, 0xd1, 0x22, +0x02, 0xc0, 0xce, 0xcc, 0x80, 0x41, 0xeb, 0x2c, 0xa8, 0x2c, 0x73, 0x31, 0xd0, 0xbb, 0xb8, 0xf1, +0xcf, 0x45, 0x71, 0x97, 0x58, 0xc8, 0x3c, 0xb8, 0x72, 0x13, 0x21, 0x00, 0x00, 0x21, 0xf9, 0x04, +0x09, 0x0c, 0x00, 0x1f, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, +0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, +0x74, 0x6d, 0xdf, 0x78, 0xae, 0xef, 0xb4, 0x61, 0xf0, 0x40, 0x97, 0x81, 0xb0, 0xf8, 0x05, 0x8f, +0xa3, 0x80, 0x52, 0x34, 0x5c, 0x14, 0x91, 0xc7, 0xc0, 0x64, 0x72, 0x08, 0x7c, 0x9a, 0x4f, 0x28, +0x4f, 0x3a, 0xa5, 0x7e, 0x02, 0x84, 0x41, 0x56, 0xab, 0x93, 0x52, 0xa6, 0x55, 0xb0, 0xd8, 0x48, +0xce, 0x99, 0xcf, 0x15, 0x70, 0x78, 0xc0, 0x6e, 0xdf, 0x02, 0x16, 0x8a, 0xc5, 0x12, 0x27, 0x84, +0xeb, 0x76, 0x36, 0x52, 0x7b, 0x13, 0x71, 0x10, 0x7e, 0x80, 0x81, 0x34, 0x66, 0x53, 0x86, 0x88, +0x8a, 0x38, 0x01, 0x15, 0x70, 0x05, 0x01, 0x10, 0x87, 0x89, 0x90, 0x31, 0x92, 0x85, 0x05, 0x95, +0x97, 0x10, 0x99, 0x9a, 0x25, 0x3e, 0xa5, 0x6c, 0x06, 0x01, 0x05, 0x15, 0x9e, 0x55, 0x97, 0x0b, +0x0c, 0xa2, 0xa3, 0x3e, 0x09, 0xb4, 0xb4, 0x08, 0xa5, 0x0e, 0x02, 0x02, 0x9e, 0x03, 0x08, 0xa9, +0x0a, 0x0a, 0xb0, 0xa3, 0x27, 0x06, 0xb4, 0x4e, 0x0b, 0x03, 0x02, 0xc0, 0xc0, 0xb9, 0x03, 0xce, +0xc9, 0xba, 0x0a, 0x0d, 0x0d, 0xc2, 0xc3, 0x23, 0xc5, 0xba, 0xc7, 0x0b, 0xcb, 0xcc, 0xcf, 0xde, +0x02, 0xd3, 0xd4, 0xb1, 0x76, 0xd8, 0x02, 0xda, 0xdb, 0xdc, 0x0e, 0xcf, 0x4a, 0x01, 0xd0, 0xe1, +0x0c, 0x56, 0xc3, 0xe5, 0xd9, 0x4e, 0xdc, 0xdd, 0xce, 0x4a, 0x0a, 0xed, 0xe0, 0x0d, 0x0e, 0xf0, +0xf2, 0xb4, 0x04, 0x40, 0xab, 0x67, 0x4f, 0x81, 0x3a, 0x7c, 0xec, 0x92, 0x39, 0x58, 0xe8, 0x20, +0x9e, 0xa6, 0x72, 0x0b, 0xcc, 0x11, 0xb4, 0xd7, 0x0c, 0xe1, 0x3e, 0x86, 0x0d, 0x01, 0x66, 0xcb, +0x56, 0x90, 0x99, 0x40, 0x6f, 0xcf, 0x30, 0x3a, 0x54, 0x54, 0x6c, 0x00, 0x01, 0x89, 0x62, 0xca, +0x3a, 0x1a, 0xac, 0xe8, 0x2d, 0xdc, 0xc2, 0x91, 0x76, 0x02, 0x18, 0x70, 0x76, 0xd2, 0x89, 0xb3, +0x82, 0x11, 0x14, 0x44, 0x58, 0xf8, 0xf1, 0xa6, 0xce, 0x09, 0xd3, 0x60, 0x92, 0x69, 0x37, 0xd3, +0xa4, 0x44, 0x64, 0x38, 0x23, 0x28, 0xe5, 0xe9, 0x4c, 0x59, 0x84, 0x0b, 0x50, 0xc7, 0x45, 0xa1, +0x43, 0x53, 0x00, 0x11, 0x64, 0x03, 0x80, 0xe5, 0xd4, 0xa9, 0x34, 0x27, 0x46, 0x07, 0x5c, 0x2b, +0x44, 0x90, 0x1a, 0x84, 0x28, 0x84, 0x01, 0x07, 0xfc, 0x1c, 0xb0, 0xa9, 0xb5, 0x6b, 0x4e, 0xb7, +0x12, 0x22, 0x1c, 0x80, 0x85, 0x8a, 0x6c, 0xd9, 0x50, 0x67, 0x4d, 0xaa, 0x5d, 0x10, 0x86, 0x6b, +0xd7, 0xb6, 0x12, 0x24, 0x1c, 0x38, 0x60, 0x57, 0x8b, 0xcc, 0xbc, 0x34, 0x09, 0x0c, 0xce, 0xfa, +0xd7, 0x6d, 0x83, 0x0a, 0x07, 0xa6, 0x15, 0x26, 0x63, 0x60, 0x31, 0x48, 0xc6, 0x01, 0xba, 0x1a, +0x08, 0xd7, 0x20, 0x40, 0xe4, 0x06, 0x93, 0xa1, 0x54, 0x3e, 0xe0, 0x8c, 0xf4, 0x3a, 0x76, 0xec, +0x0c, 0x40, 0x08, 0x9a, 0xaa, 0xb3, 0x35, 0x52, 0xde, 0x16, 0x2f, 0x31, 0xb1, 0xd9, 0x75, 0x80, +0x07, 0xa1, 0xa1, 0x78, 0x5e, 0x3c, 0x98, 0xdd, 0x09, 0x4b, 0x0f, 0xe2, 0x09, 0xb5, 0xb6, 0x7b, +0xb0, 0x71, 0x06, 0xf0, 0x64, 0x96, 0x98, 0xfd, 0x1a, 0x85, 0x12, 0xe4, 0xd0, 0x19, 0x70, 0x1e, +0xde, 0x5c, 0x05, 0x6a, 0x99, 0xa6, 0xaa, 0xab, 0x08, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x0c, +0x00, 0x1f, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, +0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, +0xdf, 0x78, 0xae, 0xef, 0x7c, 0xef, 0xc3, 0x06, 0xc3, 0x6f, 0x88, 0x32, 0x10, 0x16, 0x42, 0xe2, +0x2f, 0xc0, 0x14, 0x19, 0x17, 0x48, 0x65, 0x2f, 0x30, 0x99, 0x1c, 0x02, 0x9f, 0x67, 0x54, 0xaa, +0xa3, 0x56, 0xad, 0x9f, 0x00, 0x61, 0xb0, 0xe5, 0xe2, 0xa8, 0x94, 0xea, 0x55, 0x4c, 0x4e, 0x9a, +0x6f, 0xe8, 0x74, 0x45, 0x3c, 0x1e, 0xb8, 0xdf, 0xa7, 0x60, 0x33, 0x15, 0xb0, 0x50, 0x2c, 0x16, +0x73, 0x04, 0x63, 0x77, 0x78, 0x25, 0x06, 0x09, 0x89, 0x09, 0x41, 0x41, 0x26, 0x54, 0x80, 0x13, +0x73, 0x10, 0x83, 0x85, 0x86, 0x4e, 0x09, 0x02, 0x02, 0x8a, 0x8a, 0x08, 0x77, 0x68, 0x55, 0x92, +0x94, 0x96, 0x87, 0x98, 0x02, 0x0b, 0x09, 0x50, 0x0b, 0x03, 0x02, 0x0a, 0x0a, 0x58, 0x22, 0x01, +0x15, 0x72, 0x05, 0x01, 0x10, 0x93, 0x95, 0x78, 0x88, 0x99, 0x99, 0xa9, 0x50, 0xad, 0xad, 0xaf, +0xb1, 0x91, 0x05, 0xb4, 0xb6, 0x10, 0xb8, 0x66, 0x88, 0x98, 0xab, 0x9a, 0xbd, 0xbf, 0xc0, 0x06, +0x01, 0x05, 0x15, 0xc4, 0x57, 0xb6, 0x0b, 0x0c, 0xc8, 0x52, 0xba, 0xa6, 0xa6, 0xa8, 0xbe, 0xcf, +0xad, 0x0e, 0x99, 0xc4, 0x03, 0x08, 0xd2, 0xad, 0xd9, 0xa3, 0x59, 0xa5, 0x0b, 0xcd, 0xe0, 0xe1, +0x0a, 0xe3, 0x03, 0xf4, 0xcc, 0xac, 0x0d, 0x0d, 0xea, 0x86, 0x88, 0x03, 0x04, 0xa6, 0xa7, 0xa9, +0xe2, 0x89, 0xab, 0x47, 0x50, 0x00, 0xbe, 0x7c, 0xda, 0x96, 0x18, 0xa0, 0xe7, 0x0f, 0x0a, 0x99, +0x05, 0x02, 0x07, 0x12, 0xa4, 0x97, 0xe9, 0x20, 0x83, 0x57, 0x5c, 0x02, 0xd8, 0x61, 0xf8, 0x2f, +0x60, 0x44, 0x07, 0x04, 0x99, 0x50, 0xc4, 0xe7, 0xe0, 0xe2, 0x1b, 0x8d, 0x0b, 0xd5, 0xfb, 0x09, +0x38, 0xe2, 0x30, 0x5e, 0x04, 0x89, 0xf5, 0x44, 0x0a, 0x70, 0x40, 0xd3, 0x01, 0x46, 0x29, 0x28, +0x21, 0x0c, 0x38, 0x30, 0xe8, 0x40, 0xcb, 0x70, 0x2f, 0xe5, 0x09, 0x98, 0xa8, 0x71, 0x66, 0xcd, +0x9b, 0x38, 0x0d, 0xe8, 0xec, 0xd7, 0xb3, 0x4e, 0xab, 0xa0, 0x41, 0xe7, 0x4d, 0xa4, 0x57, 0xd3, +0x26, 0x9e, 0x00, 0x4a, 0x09, 0x0e, 0x3a, 0x32, 0xe0, 0x69, 0x84, 0xaf, 0xe2, 0xa4, 0x12, 0x3c, +0x48, 0x13, 0x29, 0x17, 0x03, 0x07, 0x0e, 0x68, 0x5d, 0x30, 0x46, 0xc1, 0x57, 0xb0, 0x6e, 0x69, +0x0e, 0xad, 0xf7, 0x74, 0x02, 0x3e, 0xb3, 0xdb, 0xd2, 0xd2, 0x53, 0xbb, 0x53, 0xad, 0x5b, 0xb8, +0x6f, 0xe5, 0x52, 0x74, 0x7b, 0xa1, 0x70, 0x42, 0x22, 0x01, 0xf8, 0xf6, 0xd5, 0xd8, 0x35, 0x42, +0x00, 0xb0, 0x6f, 0xe5, 0x55, 0xfd, 0x5b, 0x21, 0xc2, 0xe1, 0x21, 0x89, 0xd3, 0xa6, 0x65, 0xc2, +0xb9, 0xb3, 0xdb, 0xbf, 0x5f, 0x25, 0x44, 0x38, 0x90, 0x2d, 0xda, 0x65, 0xcc, 0x99, 0x99, 0x5c, +0x39, 0xf1, 0xf8, 0xaf, 0x04, 0x09, 0x69, 0x4f, 0x67, 0x4c, 0x9c, 0x9a, 0xcf, 0xd7, 0x06, 0x15, +0x0e, 0xe0, 0x93, 0x8d, 0x93, 0xf6, 0x6a, 0x15, 0x01, 0x0e, 0x26, 0x6e, 0x80, 0x77, 0x54, 0x70, +0xe2, 0xc5, 0x4b, 0x1c, 0x67, 0x52, 0x80, 0xf8, 0x3a, 0xe5, 0x77, 0x5d, 0x44, 0x6b, 0xe0, 0x2a, +0xc0, 0x03, 0xde, 0x4a, 0xf6, 0xb8, 0xb0, 0xee, 0x2a, 0x4c, 0xf2, 0xe7, 0x2f, 0xb4, 0x83, 0x1f, +0x5f, 0x23, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x0c, 0x00, 0x1f, 0x00, 0x2c, 0x00, 0x00, 0x00, +0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, +0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, 0x78, 0xae, 0xef, 0x7c, 0xef, 0xff, +0x40, 0xa0, 0xc1, 0x10, 0x2c, 0x92, 0x0c, 0x84, 0x05, 0xd1, 0xd8, 0x0b, 0x38, 0x45, 0xc8, 0x85, +0x92, 0xb9, 0x0b, 0x4c, 0x26, 0x87, 0xc0, 0x27, 0x3a, 0xa5, 0xe2, 0xac, 0x57, 0xec, 0x27, 0x40, +0x18, 0x74, 0xbd, 0x36, 0x2b, 0xe5, 0x9a, 0x25, 0x9b, 0x97, 0x68, 0xd3, 0xd0, 0xa9, 0x4d, 0xa9, +0xd7, 0x15, 0x72, 0x79, 0x00, 0x8f, 0x8f, 0x0c, 0x09, 0x81, 0x81, 0x43, 0x7d, 0x23, 0x01, 0x16, +0x14, 0x16, 0x16, 0x79, 0x04, 0x65, 0x85, 0x7e, 0x80, 0x02, 0x02, 0x82, 0x82, 0x08, 0x85, 0x56, +0x8a, 0x13, 0x79, 0x10, 0x8d, 0x8f, 0x68, 0x91, 0x02, 0x0b, 0x09, 0x52, 0x0b, 0x03, 0x02, 0x0a, +0x0a, 0x75, 0x22, 0x6a, 0x57, 0x9b, 0x9d, 0x7e, 0x7f, 0x09, 0x92, 0x92, 0xa4, 0x52, 0xa8, 0xa8, +0x4f, 0x63, 0x15, 0x78, 0x05, 0x01, 0x10, 0x9c, 0x9e, 0x4c, 0x80, 0xb2, 0xa6, 0x93, 0xb5, 0xb7, +0xb7, 0x5a, 0x01, 0x15, 0x9a, 0x05, 0xbd, 0xbf, 0x10, 0xc1, 0x46, 0xa0, 0x0b, 0xa1, 0xa3, 0xb6, +0xc8, 0xb7, 0x06, 0x01, 0x05, 0x15, 0xce, 0x59, 0xbf, 0x0b, 0x0c, 0xd2, 0x41, 0xd4, 0xc6, 0xd8, +0xd9, 0xa8, 0x0e, 0x92, 0xce, 0x03, 0x08, 0xdc, 0xa8, 0xe3, 0x90, 0x09, 0x03, 0x04, 0xa1, 0xa2, +0xa4, 0xe9, 0xb7, 0xeb, 0x03, 0xfd, 0xc5, 0xa7, 0x0d, 0x1a, 0xc8, 0xa3, 0xa2, 0xc5, 0x40, 0x3f, +0x7b, 0x52, 0xcc, 0x2c, 0xd0, 0xb7, 0xcf, 0x9f, 0x43, 0x01, 0x01, 0x05, 0x92, 0xab, 0xf2, 0x20, +0x80, 0xc1, 0x7a, 0xf7, 0xf2, 0x31, 0x54, 0xe0, 0xc0, 0x1f, 0x9d, 0x62, 0x11, 0x19, 0xa8, 0x0a, +0x12, 0xe0, 0x01, 0x9f, 0x83, 0x02, 0xdb, 0x92, 0x24, 0xdc, 0xc8, 0xd1, 0x63, 0x80, 0x54, 0xa6, +0x02, 0x3a, 0x10, 0xc9, 0xc4, 0x17, 0x1f, 0x08, 0x03, 0x0e, 0x34, 0x3a, 0xb0, 0x32, 0x5d, 0x04, +0x75, 0x2e, 0x9d, 0x98, 0x72, 0x40, 0xd4, 0xc1, 0x48, 0x92, 0xd1, 0x70, 0xd6, 0xdb, 0xb9, 0x07, +0xd5, 0x4f, 0xa7, 0xea, 0x04, 0x04, 0x1d, 0x5a, 0xf4, 0x28, 0x49, 0x03, 0x4a, 0x0f, 0x36, 0x2a, +0xe5, 0x34, 0xc2, 0xcf, 0xa7, 0xfc, 0x1c, 0xfa, 0x2b, 0x6a, 0x34, 0x8e, 0x81, 0x03, 0x07, 0x1c, +0x26, 0x29, 0xa3, 0xc0, 0xeb, 0x57, 0x75, 0x61, 0x1d, 0x46, 0x24, 0x6a, 0xb5, 0xc8, 0xd9, 0xb4, +0x39, 0xfb, 0xa1, 0x1d, 0x10, 0x20, 0x81, 0x57, 0xbf, 0x4e, 0x89, 0x4a, 0xf5, 0xe7, 0x74, 0x42, +0xc0, 0xba, 0x45, 0x02, 0xe0, 0xcd, 0x79, 0x00, 0x27, 0x1d, 0x3a, 0x09, 0xda, 0x7a, 0x15, 0xdc, +0xef, 0x54, 0x84, 0x0b, 0x98, 0x27, 0xfe, 0x50, 0x8c, 0x16, 0x2d, 0x1d, 0x13, 0x2f, 0xdd, 0x72, +0x24, 0x2b, 0xb9, 0x42, 0x04, 0xcd, 0x3e, 0x7c, 0x79, 0xce, 0x75, 0x22, 0xc0, 0x57, 0xb7, 0x12, +0x22, 0x1c, 0x18, 0xb7, 0x0d, 0x75, 0x6a, 0x08, 0x59, 0x3c, 0xab, 0x78, 0x29, 0x59, 0x82, 0x04, +0xb4, 0xb6, 0x91, 0xe6, 0x46, 0x4c, 0xc2, 0x75, 0x84, 0x06, 0x15, 0x0e, 0x04, 0x0c, 0x0e, 0x24, +0xc0, 0x61, 0xe2, 0x25, 0x9c, 0x07, 0x44, 0xbb, 0x1c, 0x56, 0xf1, 0xc3, 0x30, 0xa4, 0x07, 0x2c, +0x50, 0xdd, 0xfa, 0x2a, 0xe8, 0x28, 0xb4, 0x5b, 0x64, 0xee, 0x1d, 0x05, 0x21, 0xf2, 0xe5, 0xcb, +0x87, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x2e, 0x00, 0x1f, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, +0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, +0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, 0x78, 0xae, 0xef, 0x7c, 0xef, 0xff, 0xc0, +0xa0, 0x70, 0x88, 0x32, 0x18, 0x88, 0x43, 0x03, 0x61, 0x71, 0x44, 0xee, 0x02, 0x50, 0x91, 0x72, +0xc1, 0x74, 0xe6, 0x02, 0x93, 0xc9, 0x21, 0xf0, 0x99, 0x56, 0xad, 0x36, 0x6c, 0x56, 0xfb, 0x09, +0x10, 0x06, 0x5f, 0x30, 0x0d, 0x4b, 0xc9, 0x6e, 0xcd, 0xe8, 0xa6, 0x7a, 0xc6, 0x6e, 0x57, 0xcc, +0xe7, 0x81, 0x7c, 0x1e, 0x0b, 0x58, 0x28, 0x16, 0x16, 0x77, 0x04, 0x67, 0x7b, 0x7c, 0x30, 0x58, +0x81, 0x13, 0x77, 0x10, 0x84, 0x86, 0x87, 0x2e, 0x6c, 0x59, 0x8c, 0x8e, 0x90, 0x45, 0x46, 0x98, +0x24, 0x01, 0x15, 0x76, 0x05, 0x01, 0x10, 0x8d, 0x8f, 0x90, 0x46, 0x09, 0xa5, 0xa5, 0x08, 0x99, +0x9b, 0x8b, 0x05, 0x9e, 0xa0, 0x10, 0xa2, 0x7c, 0x06, 0xa5, 0x54, 0x0b, 0x03, 0x02, 0x0a, 0xb8, +0x0a, 0x06, 0x01, 0x05, 0x15, 0xac, 0x5b, 0xa0, 0x0b, 0x0c, 0xb0, 0x60, 0xb2, 0x02, 0x02, 0xb4, +0x0b, 0xb9, 0xb8, 0x0e, 0xc7, 0xac, 0x03, 0x08, 0xbc, 0xb8, 0xc3, 0x96, 0x5d, 0x09, 0xc7, 0xc9, +0xca, 0xcb, 0xcd, 0x03, 0xdd, 0xb6, 0xc7, 0x0a, 0x0d, 0x0d, 0xd4, 0x87, 0xc6, 0xc7, 0xc8, 0x54, +0xcb, 0xcc, 0xde, 0xec, 0x02, 0xe2, 0xe3, 0xc4, 0x49, 0xa5, 0x02, 0xdf, 0xe9, 0xea, 0x0a, 0x0e, +0xde, 0x50, 0x01, 0xdf, 0xef, 0x0c, 0x5c, 0x73, 0xcc, 0x2d, 0x40, 0xa7, 0x4d, 0x5d, 0xbe, 0x6e, +0x01, 0x14, 0x40, 0xb1, 0x25, 0xce, 0xc1, 0xbf, 0x58, 0xd7, 0x90, 0x61, 0xbb, 0xb7, 0x0e, 0xe1, +0x3e, 0x5b, 0x0e, 0x32, 0x3a, 0x00, 0x58, 0x2c, 0xc1, 0x00, 0x02, 0xe8, 0xd0, 0x50, 0xc4, 0x47, +0xcf, 0x22, 0x3f, 0x01, 0x1a, 0xc0, 0x37, 0xaa, 0x09, 0x60, 0xa0, 0x1b, 0x48, 0x2a, 0xdd, 0xee, +0x45, 0x20, 0xc9, 0x8e, 0x5d, 0x4a, 0x8e, 0x48, 0x02, 0x3c, 0x68, 0xf9, 0x91, 0xe0, 0x00, 0x99, +0x11, 0x32, 0x96, 0x64, 0xf7, 0x2e, 0x23, 0x4e, 0x22, 0x3a, 0x79, 0x82, 0x5c, 0x52, 0xeb, 0xa7, +0x82, 0x99, 0x4f, 0x23, 0x04, 0xe5, 0xe6, 0x0d, 0x57, 0x84, 0x09, 0xe2, 0x8e, 0x0e, 0x49, 0x0a, +0x61, 0xc0, 0x01, 0x42, 0x07, 0x60, 0x5a, 0x95, 0x4a, 0x76, 0x6a, 0xc9, 0x5b, 0x11, 0x2e, 0xa8, +0x8d, 0x07, 0x84, 0x65, 0xd7, 0x8f, 0x60, 0x17, 0x9c, 0x89, 0x5a, 0x76, 0x66, 0x4a, 0x07, 0x51, +0x2b, 0x44, 0x60, 0x0b, 0xc4, 0xc0, 0x5b, 0x97, 0x04, 0x0e, 0x1c, 0xf8, 0x49, 0xf6, 0x29, 0xdd, +0x08, 0x12, 0x22, 0x1c, 0x18, 0xb6, 0x8b, 0x6f, 0x10, 0x03, 0x82, 0x07, 0xd7, 0x3c, 0x0c, 0x55, +0xaa, 0x04, 0x09, 0x82, 0x1d, 0x13, 0x81, 0x1c, 0x59, 0xb2, 0xb7, 0x06, 0x75, 0xa5, 0x36, 0xa8, +0x70, 0x40, 0x9c, 0xe6, 0xcd, 0x9d, 0x05, 0xb3, 0xc3, 0x64, 0xe4, 0x5d, 0x03, 0xc1, 0xa6, 0xab, +0x8d, 0x08, 0x90, 0x3a, 0x32, 0x03, 0x06, 0xb1, 0x0d, 0xb8, 0x6e, 0x50, 0x20, 0xb6, 0x6c, 0x03, +0xb7, 0x83, 0x0b, 0x77, 0x7d, 0x44, 0x37, 0x71, 0x23, 0xb2, 0xcb, 0xec, 0x5b, 0xce, 0x92, 0x75, +0x13, 0xe7, 0xa7, 0x5b, 0x84, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x0a, 0x00, 0x1f, 0x00, 0x2c, +0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, +0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, 0x78, 0xae, 0xef, +0x7c, 0xef, 0xe3, 0x06, 0xc3, 0x6f, 0x88, 0x32, 0x10, 0x16, 0x42, 0xe2, 0x2f, 0xc0, 0x14, 0x19, +0x17, 0x48, 0x65, 0x2f, 0x30, 0x99, 0x1c, 0x02, 0x9f, 0x67, 0x54, 0xaa, 0xa3, 0x56, 0xad, 0x9f, +0x00, 0x61, 0xb0, 0xe5, 0xe2, 0xa8, 0x94, 0xea, 0x55, 0x4c, 0x4e, 0x9a, 0x6f, 0xe8, 0x74, 0x45, +0x3c, 0x1e, 0xb8, 0xdf, 0xb5, 0x80, 0x85, 0x62, 0xb1, 0xcc, 0x09, 0x63, 0x77, 0x78, 0x34, 0x54, +0x7d, 0x13, 0x73, 0x10, 0x80, 0x82, 0x83, 0x32, 0x68, 0x55, 0x88, 0x8a, 0x8c, 0x36, 0x01, 0x15, +0x72, 0x05, 0x01, 0x10, 0x89, 0x8b, 0x92, 0x2f, 0x94, 0x87, 0x05, 0x97, 0x99, 0x10, 0x9b, 0x9c, +0x23, 0x41, 0xa7, 0x6e, 0x06, 0x01, 0x05, 0x15, 0xa0, 0x57, 0x99, 0x0b, 0x0c, 0xa4, 0x92, 0x41, +0x09, 0xb6, 0xb6, 0x08, 0xa7, 0x0e, 0x02, 0x02, 0xa0, 0x03, 0x08, 0xab, 0x0a, 0x0a, 0xb2, 0xa5, +0x25, 0x06, 0xb6, 0x50, 0x0b, 0x03, 0x02, 0xc2, 0xc2, 0xbb, 0x03, 0xd0, 0xcb, 0xbc, 0x0a, 0x0d, +0x0d, 0xc4, 0xc5, 0x59, 0x09, 0xbc, 0xc9, 0x0b, 0xcd, 0xce, 0xd1, 0xe0, 0x02, 0xd5, 0xd6, 0xb3, +0x66, 0xc7, 0xdb, 0xdc, 0xde, 0x0a, 0x0e, 0xd1, 0x4c, 0x01, 0xd2, 0xe3, 0x0c, 0x58, 0x9c, 0xe7, +0xbc, 0x02, 0xc9, 0xea, 0xeb, 0xed, 0x01, 0x0a, 0xef, 0xe2, 0x0d, 0x0e, 0xe4, 0xd1, 0xb3, 0x25, +0x40, 0x1a, 0x94, 0x7c, 0xfa, 0xa0, 0xb9, 0xf3, 0xe7, 0xa0, 0xa1, 0x83, 0x79, 0x8c, 0xea, 0x2d, +0xb8, 0x77, 0x30, 0xdf, 0x33, 0x85, 0x4c, 0x96, 0x39, 0x7c, 0x38, 0x70, 0xdb, 0x36, 0x84, 0xeb, +0x0a, 0x82, 0x8b, 0xb6, 0x11, 0x22, 0x9e, 0x63, 0x03, 0xc1, 0x08, 0x50, 0x24, 0x03, 0xb2, 0xa1, +0x48, 0x70, 0xe3, 0x1a, 0x9a, 0x34, 0x13, 0xc0, 0x00, 0x34, 0x95, 0x50, 0xa0, 0xe5, 0x8b, 0xa0, +0x20, 0x82, 0x4b, 0x70, 0xc2, 0x22, 0x4c, 0xa8, 0x36, 0x53, 0xca, 0x3b, 0x9b, 0x29, 0x29, 0x2a, +0xdb, 0x19, 0xa1, 0xe9, 0xcf, 0x65, 0x3d, 0x2f, 0x48, 0x2d, 0xb7, 0xc4, 0xce, 0x4d, 0x01, 0x47, +0x94, 0x0d, 0x08, 0x1a, 0xb4, 0x29, 0xcf, 0x8d, 0x0e, 0x7a, 0x46, 0xa8, 0x10, 0x81, 0xaa, 0x8f, +0xa3, 0x10, 0x06, 0x1c, 0x00, 0x74, 0x20, 0x67, 0x57, 0xaf, 0x62, 0x9b, 0x4a, 0x88, 0x70, 0x40, +0x96, 0x2a, 0xb3, 0x4b, 0x0c, 0xa4, 0x4d, 0xc9, 0x76, 0xc1, 0x98, 0xb8, 0x4d, 0xbb, 0x4a, 0x90, +0x70, 0xe0, 0x00, 0x5e, 0x25, 0x35, 0xf7, 0xde, 0x24, 0x50, 0x78, 0x2b, 0x5c, 0xaf, 0x11, 0x1a, +0x54, 0x38, 0x50, 0xed, 0xb0, 0x14, 0x03, 0x85, 0x0f, 0x8c, 0x74, 0x0c, 0xd9, 0xc0, 0xb8, 0x06, +0x01, 0x28, 0x37, 0xb0, 0x4c, 0x04, 0x73, 0x66, 0xcd, 0x30, 0xbd, 0x32, 0x51, 0x35, 0x8e, 0x49, +0x65, 0x6c, 0x4e, 0x4e, 0x37, 0x8e, 0x86, 0x6a, 0x44, 0x00, 0xa2, 0xae, 0x49, 0x13, 0x09, 0x2d, +0xbb, 0x30, 0x03, 0x06, 0xaf, 0x6d, 0x8f, 0x16, 0x51, 0xb4, 0x94, 0x81, 0xdf, 0xc8, 0x93, 0x7f, +0x36, 0x59, 0x1c, 0xf6, 0xc2, 0xe7, 0xa8, 0x74, 0xd7, 0x08, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x09, +0x0c, 0x00, 0x1f, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, +0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, +0x6d, 0xdf, 0x78, 0xae, 0xef, 0xbc, 0x6a, 0x18, 0xbd, 0x20, 0xcb, 0x40, 0x58, 0x00, 0x85, 0xc8, +0x4f, 0x60, 0x29, 0x22, 0x2e, 0x8c, 0xc9, 0x60, 0x60, 0x32, 0x39, 0x04, 0x3e, 0x4e, 0x68, 0x74, +0x37, 0xa5, 0x56, 0x95, 0x84, 0x81, 0x76, 0x9b, 0x9b, 0x52, 0xa8, 0xd6, 0x40, 0x78, 0x4c, 0xbe, +0x99, 0xcf, 0x15, 0x75, 0x78, 0x70, 0x6c, 0xbb, 0x2d, 0x14, 0x8b, 0x25, 0x4e, 0x08, 0xd7, 0xed, +0x36, 0x53, 0x7a, 0x13, 0x71, 0x10, 0x7d, 0x7f, 0x80, 0x34, 0x66, 0x54, 0x85, 0x87, 0x89, 0x6e, +0x15, 0x70, 0x05, 0x01, 0x10, 0x86, 0x88, 0x8f, 0x31, 0x01, 0x15, 0x84, 0x05, 0x93, 0x95, 0x10, +0x97, 0x98, 0x25, 0x3f, 0xa4, 0x75, 0x06, 0x01, 0x05, 0x15, 0x9d, 0x56, 0x95, 0x0b, 0x0c, 0xa1, +0xa2, 0x3f, 0x09, 0xb3, 0xb3, 0x08, 0xa4, 0x0e, 0x02, 0x02, 0x9d, 0x03, 0x08, 0xa8, 0x0a, 0x0a, +0xaf, 0xa2, 0x26, 0x06, 0xb3, 0x4f, 0x0b, 0x03, 0x02, 0xbf, 0xbf, 0xb8, 0x03, 0xcd, 0xc8, 0xb9, +0x0a, 0x0d, 0x0d, 0xc1, 0xc2, 0x4d, 0x09, 0xb9, 0xc6, 0x0b, 0xca, 0xcb, 0xce, 0xdd, 0x02, 0xd2, +0xd3, 0xb0, 0x76, 0xc4, 0xd8, 0xd9, 0xdb, 0x0a, 0x0e, 0xce, 0x4b, 0x01, 0xcf, 0xe0, 0x0c, 0x57, +0xb1, 0xd7, 0xb9, 0x02, 0xc6, 0xe7, 0xe8, 0xea, 0x01, 0x0a, 0xec, 0xdf, 0x0d, 0x0e, 0xef, 0xf1, +0xd7, 0x9e, 0x3d, 0xb1, 0x77, 0xaf, 0xd9, 0xba, 0x7d, 0x0e, 0x12, 0x3a, 0x80, 0xf7, 0x88, 0x1c, +0x3d, 0x7a, 0x03, 0xed, 0x31, 0x33, 0xb8, 0x04, 0x99, 0xc2, 0x85, 0xf1, 0xb0, 0x61, 0x23, 0x88, +0x4e, 0x40, 0xb7, 0x6e, 0x17, 0x19, 0x02, 0x22, 0x36, 0x80, 0x00, 0x44, 0x31, 0x1c, 0xc3, 0x13, +0x7a, 0xfc, 0x08, 0x2e, 0xa1, 0xc8, 0x36, 0x01, 0x0c, 0x34, 0x33, 0xf9, 0xa4, 0x99, 0xbd, 0x08, +0x0a, 0x22, 0xa8, 0xec, 0xf6, 0x2b, 0xc2, 0x04, 0x69, 0x2f, 0xb7, 0xb0, 0x93, 0x59, 0x12, 0xe2, +0xb1, 0x9b, 0x11, 0x92, 0xee, 0x44, 0x96, 0xf3, 0x82, 0x53, 0x71, 0x48, 0x86, 0xce, 0x14, 0x50, +0xe4, 0xd8, 0x80, 0x9e, 0x3d, 0x93, 0xe2, 0xbc, 0xe8, 0x20, 0x67, 0x84, 0x0a, 0x11, 0xa0, 0x0a, +0x19, 0x0a, 0x61, 0xc0, 0x81, 0x3e, 0x07, 0x6a, 0x66, 0xd5, 0xea, 0x35, 0xa9, 0x84, 0x08, 0x07, +0x5e, 0x9d, 0x12, 0x1b, 0xd5, 0x40, 0xd9, 0x92, 0x68, 0x17, 0x84, 0x69, 0x9b, 0x34, 0xab, 0x04, +0x09, 0x07, 0x0e, 0xd0, 0x15, 0x6a, 0xb7, 0x1b, 0xda, 0x03, 0x57, 0xd9, 0x6a, 0x8d, 0xd0, 0xa0, +0xc2, 0x01, 0x69, 0x83, 0xc9, 0x18, 0x08, 0xfc, 0xd1, 0x66, 0x84, 0x00, 0x5a, 0x0d, 0x80, 0x6b, +0x10, 0xe0, 0x71, 0x83, 0xc8, 0x51, 0x26, 0x23, 0x36, 0xdb, 0xed, 0xe0, 0xba, 0x53, 0xe0, 0x96, +0x40, 0xae, 0x36, 0x82, 0x68, 0x33, 0xca, 0x4c, 0x4e, 0x04, 0x00, 0xaa, 0x1a, 0x74, 0x92, 0xce, +0x94, 0x03, 0xaf, 0x4b, 0x31, 0xfb, 0x48, 0x50, 0x51, 0xb8, 0x03, 0x0b, 0x67, 0xf0, 0x2e, 0xa6, +0x6c, 0xd6, 0x28, 0x96, 0x10, 0x5f, 0xce, 0x60, 0xf3, 0x6f, 0xe4, 0xbc, 0x0f, 0x96, 0xb2, 0x7d, +0x23, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x0c, 0x00, 0x1f, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, +0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, +0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, 0x9f, 0x61, 0xe0, 0xbc, 0x6d, 0x10, 0x8b, +0x5d, 0x6f, 0xb8, 0x0a, 0x18, 0x45, 0xbf, 0x45, 0x90, 0xc8, 0x34, 0x05, 0x26, 0x93, 0x43, 0x20, +0x07, 0x5c, 0x36, 0xaf, 0x4f, 0x68, 0xf4, 0x13, 0x20, 0x0c, 0xac, 0x57, 0xe6, 0x93, 0x02, 0x95, +0x76, 0xbf, 0xc2, 0x30, 0x71, 0x4c, 0xae, 0x74, 0xbd, 0x83, 0xb4, 0x9a, 0xa5, 0x3b, 0xa6, 0x02, +0x16, 0x8a, 0xc5, 0xe2, 0x26, 0x78, 0xe5, 0x73, 0x2a, 0x06, 0x09, 0x84, 0x09, 0x3a, 0x3a, 0x4e, +0x13, 0x7b, 0x13, 0x6e, 0x10, 0x7e, 0x80, 0x81, 0x27, 0x83, 0x02, 0x02, 0x85, 0x85, 0x08, 0x72, +0x63, 0x50, 0x8d, 0x8f, 0x91, 0x82, 0x09, 0x94, 0x0b, 0x09, 0x4a, 0x0b, 0x03, 0x02, 0x0a, 0x0a, +0x53, 0x22, 0x01, 0x15, 0x6d, 0x05, 0x01, 0x10, 0x8e, 0x90, 0x9e, 0x48, 0xa0, 0x94, 0x02, 0xa4, +0x4a, 0xa8, 0xa8, 0xaa, 0xac, 0x8c, 0x05, 0xaf, 0xb1, 0x10, 0xb3, 0x9e, 0x83, 0xa0, 0xa6, 0x95, +0xb9, 0xbb, 0xbc, 0x06, 0x01, 0x05, 0x15, 0xc0, 0x52, 0xb1, 0x0b, 0x0c, 0xc4, 0x81, 0x93, 0xb8, +0xb8, 0xa3, 0xba, 0xcb, 0xa8, 0x0e, 0x94, 0xc0, 0x03, 0x08, 0xce, 0xa8, 0xd5, 0xb4, 0x25, 0xd8, +0x0b, 0xc9, 0xdc, 0xdd, 0x0a, 0xdf, 0x03, 0xf0, 0xc8, 0xa7, 0x0d, 0x0d, 0xe6, 0xe7, 0x39, 0x09, +0x03, 0x04, 0xb8, 0xa2, 0xa4, 0xed, 0xde, 0xf1, 0x02, 0x0a, 0xa0, 0x57, 0xcf, 0x1a, 0x16, 0x03, +0xf0, 0xf6, 0x29, 0xf9, 0xb2, 0xe0, 0x1f, 0xc0, 0x80, 0xf0, 0x28, 0x11, 0x64, 0xa0, 0x2a, 0x52, +0x80, 0x38, 0x09, 0xf9, 0xf9, 0x73, 0xe8, 0x20, 0xa0, 0x91, 0x88, 0xf4, 0x1c, 0x50, 0xa4, 0x75, +0x11, 0xa1, 0x3e, 0x01, 0x55, 0xd2, 0x4a, 0xb5, 0x8b, 0xf0, 0x30, 0xde, 0x47, 0x01, 0x0e, 0x62, +0x3a, 0xa8, 0x18, 0xa8, 0x24, 0x84, 0x01, 0x07, 0xfc, 0x1c, 0x58, 0xb8, 0xd2, 0x9b, 0x00, 0x88, +0x17, 0x61, 0xca, 0xa4, 0x59, 0xd3, 0xc0, 0x4d, 0x7d, 0x3a, 0xe1, 0xa0, 0x62, 0xa9, 0x80, 0xe9, +0x3b, 0x88, 0xf0, 0x64, 0xce, 0x3c, 0x17, 0xc0, 0x68, 0x40, 0x3f, 0x40, 0x06, 0x2c, 0x8d, 0xc0, +0xd5, 0xdb, 0xd3, 0x80, 0x04, 0x63, 0x12, 0x8d, 0x64, 0xe0, 0xc0, 0x81, 0xab, 0x0b, 0xbc, 0x34, +0xe5, 0xca, 0x34, 0x42, 0xcc, 0x9f, 0xf1, 0x96, 0x4e, 0xa0, 0x37, 0xf6, 0x9a, 0x59, 0x78, 0x67, +0x71, 0x9e, 0x5d, 0xdb, 0x96, 0xeb, 0xdb, 0x88, 0x4d, 0x2f, 0x08, 0x36, 0xa8, 0x26, 0x40, 0x5e, +0xbd, 0x17, 0xb5, 0x46, 0x08, 0xd0, 0x95, 0xad, 0x3b, 0xa9, 0x6b, 0x2b, 0x44, 0x20, 0x1c, 0xc6, +0xb0, 0x59, 0xb3, 0x46, 0x32, 0x6b, 0x6e, 0xca, 0x37, 0x82, 0x84, 0x08, 0x07, 0xaa, 0x35, 0xa3, +0x5c, 0xd9, 0xb2, 0x11, 0x29, 0x27, 0x18, 0x6f, 0x95, 0x20, 0xc1, 0x2c, 0xe9, 0x9a, 0x86, 0x4d, +0xdf, 0x61, 0xdb, 0xa0, 0xc2, 0x01, 0x7a, 0xaf, 0xe7, 0x9c, 0x8e, 0xbd, 0xc2, 0x00, 0xc1, 0x06, +0x66, 0x71, 0xdf, 0x4b, 0x4d, 0xb7, 0xae, 0x09, 0xdf, 0xbf, 0x0b, 0x08, 0x1f, 0x4e, 0x22, 0x00, +0xdd, 0x17, 0xc8, 0x09, 0x1e, 0x62, 0x5e, 0xc2, 0x0e, 0xf4, 0x43, 0x88, 0xa8, 0x6b, 0xdf, 0xce, +0xbd, 0xbb, 0xf7, 0xef, 0xe0, 0x61, 0x84, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x0c, 0x00, 0x1f, +0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, +0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, 0x78, +0xae, 0xef, 0x7c, 0xef, 0xff, 0xc0, 0x20, 0xcd, 0x60, 0x10, 0x1a, 0x45, 0x06, 0xc2, 0xa2, 0x78, +0xe4, 0x05, 0x9e, 0x48, 0xe5, 0xb2, 0xa9, 0x0b, 0x4c, 0x26, 0x87, 0xc0, 0x27, 0xb9, 0x98, 0x52, +0x6f, 0xd6, 0x2b, 0xf6, 0x13, 0x20, 0x0c, 0xbc, 0xdf, 0x9a, 0x95, 0x72, 0xcd, 0x96, 0xcf, 0xcc, +0x74, 0x89, 0xf8, 0xd4, 0xa6, 0xd6, 0xec, 0x4a, 0xd9, 0x3c, 0x88, 0xcb, 0x91, 0x09, 0x81, 0x81, +0x44, 0x7e, 0x23, 0x01, 0x16, 0x14, 0x16, 0x16, 0x7a, 0x04, 0x66, 0x85, 0x72, 0x06, 0x09, 0x02, +0x02, 0x82, 0x82, 0x08, 0x85, 0x56, 0x8a, 0x13, 0x7a, 0x10, 0x8d, 0x8f, 0x5f, 0x91, 0x93, 0x0b, +0x09, 0x5d, 0x0b, 0x03, 0x02, 0x0a, 0x0a, 0x76, 0x22, 0x6b, 0x57, 0x9c, 0x9e, 0x7f, 0x80, 0x93, +0xa2, 0xa5, 0x0b, 0xa9, 0xa9, 0x50, 0x64, 0x15, 0x79, 0x05, 0x01, 0x10, 0x9d, 0x9f, 0x47, 0x91, +0x92, 0xa7, 0x94, 0xb5, 0xb7, 0xb7, 0x5a, 0x01, 0x15, 0x9b, 0x05, 0xbd, 0xbf, 0x10, 0xc1, 0x46, +0xa1, 0x02, 0x0b, 0xd5, 0xa4, 0x5d, 0xc8, 0xc8, 0x06, 0x01, 0x05, 0x15, 0xce, 0x59, 0xbf, 0x0b, +0x0c, 0xd2, 0x41, 0xd4, 0xd6, 0xd8, 0xb6, 0xda, 0xb7, 0x0e, 0x93, 0xce, 0x03, 0x08, 0xdd, 0xa9, +0xe4, 0x90, 0x09, 0x03, 0x04, 0xd5, 0xa3, 0xa5, 0xeb, 0xec, 0x02, 0x03, 0xff, 0xc5, 0x50, 0x35, +0x68, 0x40, 0xaf, 0x89, 0x16, 0x03, 0xff, 0xf0, 0x75, 0x39, 0xa3, 0x8e, 0x9f, 0x02, 0x07, 0x00, +0x23, 0x0a, 0x18, 0x48, 0xb0, 0xdc, 0x8e, 0x00, 0x0f, 0x02, 0x20, 0xbc, 0x97, 0x6f, 0x9f, 0xc3, +0x87, 0x00, 0xeb, 0x14, 0xa3, 0xc8, 0x60, 0x55, 0x10, 0x8c, 0x7d, 0xdd, 0x12, 0x0a, 0x90, 0x62, +0xea, 0x23, 0xc8, 0x7f, 0x4f, 0x54, 0x9d, 0x1a, 0xe8, 0xa0, 0xe4, 0x11, 0x5f, 0x7d, 0x20, 0x0c, +0x38, 0xd0, 0xe8, 0xc0, 0x42, 0x7e, 0x11, 0x52, 0x41, 0x84, 0x29, 0x52, 0x80, 0x83, 0xa3, 0x0e, +0x4c, 0x9e, 0x8c, 0xa6, 0xf3, 0x5e, 0x4f, 0x3e, 0xa9, 0x82, 0x46, 0x15, 0xea, 0x8f, 0x68, 0x80, +0x53, 0x48, 0x93, 0x52, 0xd1, 0xd8, 0x34, 0x61, 0xa3, 0x96, 0x0a, 0x22, 0x88, 0x0d, 0x4b, 0x35, +0x62, 0xc4, 0xac, 0x4a, 0xa7, 0x1d, 0x38, 0x10, 0x51, 0x89, 0x99, 0xb0, 0x63, 0xa5, 0x1e, 0xad, +0x1a, 0x91, 0xe2, 0xd1, 0xb4, 0x42, 0x0c, 0xac, 0xfd, 0xc7, 0x76, 0x27, 0xdb, 0x00, 0x09, 0xc4, +0x06, 0x8e, 0x3a, 0x37, 0x62, 0xd4, 0x09, 0x03, 0xf1, 0x0a, 0x09, 0xd0, 0xd7, 0xaf, 0xce, 0x3a, +0x75, 0x12, 0xc0, 0x8d, 0x50, 0xf8, 0x54, 0xd8, 0x0b, 0x98, 0x2d, 0xfe, 0x60, 0xbc, 0x76, 0x6d, +0x1d, 0x13, 0x01, 0x26, 0x3f, 0xcc, 0x0a, 0xb7, 0x42, 0x04, 0xcd, 0x3e, 0x7c, 0x79, 0xce, 0x75, +0x22, 0x40, 0x50, 0xb1, 0x62, 0x25, 0x44, 0x38, 0x40, 0x8e, 0x1b, 0xea, 0xd4, 0x10, 0xb2, 0x78, +0x56, 0x11, 0x1a, 0xae, 0x04, 0x09, 0x6b, 0x6f, 0x2f, 0xd5, 0xad, 0x98, 0x84, 0xeb, 0x08, 0x0d, +0x2a, 0x1c, 0x18, 0x28, 0x1c, 0x48, 0x80, 0xc4, 0xc5, 0x4b, 0x3c, 0x1f, 0xb8, 0x96, 0x79, 0x2c, +0x43, 0x89, 0x61, 0x4c, 0x1f, 0x58, 0xc0, 0xfa, 0x75, 0x32, 0xd1, 0x4f, 0x18, 0xa0, 0xc8, 0x9c, +0xc8, 0xf7, 0x1a, 0x84, 0x08, 0x9d, 0xff, 0x12, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x2e, 0x00, +0x1f, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, +0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, +0x78, 0xae, 0xef, 0x7c, 0xef, 0xff, 0xc0, 0xa0, 0x70, 0xe8, 0x33, 0x18, 0x88, 0x43, 0x03, 0x61, +0x71, 0x44, 0xee, 0x02, 0x50, 0x91, 0x72, 0xc1, 0x74, 0xe6, 0x02, 0x93, 0xc9, 0x21, 0xf0, 0x99, +0x56, 0xad, 0x36, 0x6c, 0x56, 0xfb, 0x09, 0x10, 0x06, 0x5f, 0x30, 0x0d, 0x4b, 0xc9, 0x6e, 0xcd, +0xe8, 0xa6, 0x7a, 0xc6, 0x6e, 0x57, 0xcc, 0xe7, 0x81, 0x7c, 0x1e, 0x0b, 0x58, 0x28, 0x16, 0x16, +0x77, 0x04, 0x67, 0x7b, 0x7c, 0x30, 0x58, 0x81, 0x13, 0x77, 0x10, 0x84, 0x86, 0x87, 0x2e, 0x6c, +0x59, 0x8c, 0x8e, 0x90, 0x28, 0x46, 0x98, 0x7b, 0x01, 0x15, 0x76, 0x05, 0x01, 0x10, 0x8d, 0x8f, +0x90, 0x46, 0x09, 0xa5, 0xa5, 0x08, 0x98, 0x65, 0x15, 0x8b, 0x05, 0x9e, 0xa0, 0x10, 0xa2, 0x7c, +0x06, 0xa5, 0x54, 0x0b, 0x03, 0x02, 0x0a, 0xb9, 0x0a, 0x06, 0x01, 0x05, 0x15, 0xad, 0x5b, 0xa0, +0x0b, 0x0c, 0xb1, 0x60, 0xb3, 0x02, 0x02, 0xb5, 0x0b, 0xba, 0xb9, 0x0e, 0xc8, 0xad, 0x03, 0x08, +0xbd, 0xb9, 0xc4, 0x96, 0x5d, 0x09, 0xc8, 0xca, 0xcb, 0xcc, 0xce, 0x03, 0xde, 0xb7, 0xc8, 0x0a, +0x0d, 0x0d, 0xd5, 0x87, 0xc7, 0xc8, 0xc9, 0x54, 0xcc, 0xcd, 0xdf, 0xed, 0x02, 0xe3, 0xe4, 0xc5, +0x49, 0xa5, 0x02, 0xe0, 0xea, 0xeb, 0x0a, 0x0e, 0xdf, 0x50, 0x01, 0xe0, 0xf0, 0x0c, 0x5c, 0xe6, +0x9c, 0x5b, 0x90, 0x6e, 0xdb, 0x3a, 0x7d, 0xde, 0x02, 0x28, 0x80, 0x72, 0x6b, 0x9c, 0x03, 0x80, +0xb2, 0xb0, 0x25, 0xcb, 0x86, 0x8f, 0x5d, 0x42, 0x7e, 0xb7, 0x1c, 0x68, 0x74, 0x10, 0xd0, 0x58, +0x82, 0x01, 0x04, 0xd2, 0xa1, 0xa9, 0x98, 0xaf, 0xde, 0xc5, 0x7e, 0x02, 0xbe, 0x36, 0x72, 0x54, +0x13, 0xc0, 0x80, 0xb7, 0x90, 0x54, 0xbc, 0xe1, 0x8b, 0x50, 0xb2, 0x5d, 0x3b, 0x95, 0x1d, 0x91, +0x04, 0x78, 0xe0, 0x12, 0x64, 0xc1, 0x01, 0x33, 0x23, 0x68, 0x34, 0xd9, 0x0e, 0x9e, 0xc6, 0x9c, +0x44, 0x76, 0xf6, 0x0c, 0xb9, 0xc4, 0x16, 0x50, 0x05, 0x34, 0xa1, 0x46, 0x10, 0xda, 0xed, 0x5b, +0xae, 0x08, 0x13, 0xc6, 0x21, 0x1d, 0xa2, 0x14, 0xc2, 0x80, 0x03, 0x84, 0x0e, 0xc4, 0xbc, 0x3a, +0xb5, 0x2c, 0x55, 0x93, 0xb8, 0x22, 0x5c, 0x58, 0x2b, 0x0f, 0x48, 0x4b, 0xaf, 0x20, 0xc3, 0x2e, +0x38, 0x23, 0xd5, 0x2c, 0x4d, 0x95, 0x0e, 0xa4, 0x56, 0x88, 0xd0, 0x16, 0x88, 0x01, 0xb8, 0x2f, +0x09, 0x1c, 0x38, 0x00, 0xb4, 0x2c, 0xd4, 0xba, 0x11, 0x24, 0x44, 0x38, 0x40, 0x8c, 0x57, 0xdf, +0x20, 0x06, 0x06, 0x13, 0xb6, 0x89, 0x38, 0xea, 0x54, 0x09, 0x12, 0x06, 0x3f, 0x26, 0x12, 0x59, +0xf2, 0xe4, 0x6f, 0x0d, 0xec, 0x4e, 0x6d, 0x50, 0xe1, 0xc0, 0xb8, 0xcd, 0x9c, 0x3d, 0x0f, 0x6e, +0x97, 0xc9, 0x00, 0xbc, 0x06, 0x83, 0x4f, 0x5b, 0x1b, 0x11, 0x40, 0xb5, 0x64, 0x06, 0x0c, 0x64, +0xbb, 0x7e, 0x5d, 0x40, 0xf6, 0x6c, 0x03, 0xb8, 0x83, 0x0b, 0x7f, 0x7d, 0x64, 0x37, 0xbc, 0x54, +0xb3, 0xf9, 0x29, 0x87, 0xd2, 0xba, 0x49, 0x73, 0x13, 0x21, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x09, +0x0c, 0x00, 0x1f, 0x00, 0x2c, 0x28, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, +0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, +0x6d, 0xdf, 0x78, 0xae, 0xef, 0x7c, 0xef, 0x9f, 0x06, 0xc3, 0x6f, 0x88, 0x32, 0x10, 0x16, 0x42, +0xe2, 0x2f, 0xc0, 0x14, 0x19, 0x17, 0x48, 0x65, 0x2f, 0x30, 0x99, 0x1c, 0x02, 0x9f, 0x67, 0x54, +0xaa, 0xa3, 0x56, 0xad, 0x9f, 0x00, 0x61, 0xb0, 0xe5, 0xe2, 0xa8, 0x94, 0xea, 0x55, 0x4c, 0x4e, +0x9a, 0x6f, 0xe8, 0x74, 0x45, 0x3c, 0x1e, 0xb8, 0xdf, 0xb5, 0x80, 0x85, 0x62, 0xb1, 0xcc, 0x09, +0x63, 0x77, 0x78, 0x34, 0x54, 0x7d, 0x13, 0x73, 0x10, 0x80, 0x82, 0x83, 0x32, 0x68, 0x55, 0x88, +0x8a, 0x8c, 0x36, 0x01, 0x15, 0x72, 0x05, 0x01, 0x10, 0x89, 0x8b, 0x92, 0x2f, 0x94, 0x87, 0x05, +0x97, 0x99, 0x10, 0x9b, 0x9c, 0x23, 0x41, 0xa7, 0x6e, 0x06, 0x01, 0x05, 0x15, 0xa0, 0x57, 0x99, +0x0b, 0x0c, 0xa4, 0x92, 0x41, 0x09, 0xb6, 0xb6, 0x08, 0xa7, 0x0e, 0x02, 0x02, 0xa0, 0x03, 0x08, +0xab, 0x0a, 0x0a, 0xb2, 0xa5, 0x25, 0x06, 0xb6, 0x50, 0x0b, 0x03, 0x02, 0xc2, 0xc2, 0xbb, 0x03, +0xd0, 0xcb, 0xbc, 0x0a, 0x0d, 0x0d, 0xc4, 0xc5, 0x59, 0x09, 0xbc, 0xc9, 0x0b, 0xcd, 0xce, 0xd1, +0xe0, 0x02, 0xd5, 0xd6, 0xb3, 0x66, 0xc7, 0xdb, 0xdc, 0xde, 0x0a, 0x0e, 0xd1, 0x4c, 0x01, 0xd2, +0xe3, 0x0c, 0x58, 0x9c, 0xe7, 0xbc, 0x02, 0xc9, 0xea, 0xeb, 0xed, 0x01, 0x0a, 0xef, 0xe2, 0x0d, +0x0e, 0xe4, 0xd1, 0xb3, 0x25, 0x40, 0x1a, 0x94, 0x7c, 0xfa, 0xa0, 0xb9, 0xf3, 0xe7, 0xa0, 0xa1, +0x83, 0x79, 0x8c, 0xea, 0x2d, 0xb8, 0x77, 0x30, 0xdf, 0x33, 0x85, 0x4c, 0x96, 0x39, 0x7c, 0x38, +0x70, 0xdb, 0x36, 0x84, 0xeb, 0x0a, 0x82, 0x8b, 0xb6, 0x11, 0x22, 0x9e, 0x63, 0x03, 0xbe, 0x08, +0x50, 0x24, 0x03, 0xb2, 0xa1, 0x48, 0x70, 0xe3, 0x1a, 0x9a, 0x34, 0x13, 0xc0, 0x00, 0x34, 0x95, +0x50, 0xa0, 0xe5, 0x8b, 0xa0, 0x20, 0x82, 0x4b, 0x70, 0xc2, 0x22, 0x4c, 0xa8, 0x36, 0x53, 0xca, +0x3b, 0x9b, 0x29, 0x29, 0x2a, 0xdb, 0x19, 0xa1, 0xe9, 0xcf, 0x65, 0x3d, 0x2f, 0x48, 0x2d, 0xb7, +0xc4, 0xce, 0x4d, 0x01, 0x47, 0x94, 0x0d, 0x08, 0x1a, 0xb4, 0x29, 0xcf, 0x8d, 0x0e, 0x7a, 0x46, +0xa8, 0x10, 0x81, 0xaa, 0x8f, 0xa3, 0x10, 0x06, 0x1c, 0x00, 0x74, 0x20, 0x67, 0x57, 0xaf, 0x62, +0x9b, 0x4a, 0x88, 0x70, 0x40, 0x96, 0x2a, 0xb3, 0x67, 0x47, 0xa5, 0x4d, 0xc9, 0x76, 0xc1, 0x98, +0xb8, 0x4d, 0xbb, 0x4a, 0x90, 0x70, 0xe0, 0x00, 0x5e, 0x25, 0x35, 0xf7, 0xde, 0x24, 0x50, 0x78, +0x2b, 0x5c, 0xaf, 0x11, 0x1a, 0x54, 0x38, 0x50, 0xed, 0xb0, 0x14, 0x03, 0x85, 0x0f, 0x8c, 0x74, +0x0c, 0xd9, 0xc0, 0xb8, 0x06, 0x85, 0x2b, 0x63, 0x73, 0x92, 0xb9, 0x31, 0x4c, 0xaf, 0x4c, 0x3c, +0x7f, 0x2e, 0x20, 0x7a, 0x34, 0xe6, 0xd2, 0x9a, 0xa3, 0xa1, 0x72, 0xf2, 0xb9, 0xc1, 0xa9, 0xd1, +0x22, 0x02, 0xc0, 0xce, 0xcc, 0x80, 0x41, 0xeb, 0x2c, 0xa8, 0x2c, 0x73, 0x31, 0xd0, 0xbb, 0xb8, +0xf1, 0xcf, 0x45, 0x71, 0x97, 0x58, 0xc8, 0x3c, 0xb8, 0x72, 0x13, 0x21, 0x00, 0x00, 0x21, 0xf9, +0x04, 0x09, 0x0c, 0x00, 0x1f, 0x00, 0x2c, 0x28, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, +0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, +0xcf, 0x74, 0x6d, 0xdf, 0x78, 0xae, 0xef, 0xb4, 0x61, 0xf0, 0x40, 0x97, 0x81, 0xb0, 0xf8, 0x05, +0x8f, 0xa3, 0x80, 0x52, 0x34, 0x5c, 0x14, 0x91, 0xc7, 0xc0, 0x64, 0x72, 0x08, 0x7c, 0x9a, 0x4f, +0x28, 0x4f, 0x3a, 0xa5, 0x7e, 0x02, 0x84, 0x41, 0x56, 0xab, 0x93, 0x52, 0xa6, 0x55, 0xb0, 0xd8, +0x48, 0xce, 0x99, 0xcf, 0x15, 0x70, 0x78, 0xc0, 0x6e, 0xdf, 0x02, 0x16, 0x8a, 0xc5, 0x12, 0x27, +0x84, 0xeb, 0x76, 0x36, 0x52, 0x7b, 0x13, 0x71, 0x10, 0x7e, 0x80, 0x81, 0x34, 0x66, 0x53, 0x86, +0x88, 0x8a, 0x38, 0x01, 0x15, 0x70, 0x05, 0x01, 0x10, 0x87, 0x89, 0x90, 0x31, 0x92, 0x85, 0x05, +0x95, 0x97, 0x10, 0x99, 0x9a, 0x25, 0x3e, 0xa5, 0x6c, 0x06, 0x01, 0x05, 0x15, 0x9e, 0x55, 0x97, +0x0b, 0x0c, 0xa2, 0xa3, 0x3e, 0x09, 0xb4, 0xb4, 0x08, 0xa5, 0x0e, 0x02, 0x02, 0x9e, 0x03, 0x08, +0xa9, 0x0a, 0x0a, 0xb0, 0xa3, 0x27, 0x06, 0xb4, 0x4e, 0x0b, 0x03, 0x02, 0xc0, 0xc0, 0xb9, 0x03, +0xce, 0xc9, 0xba, 0x0a, 0x0d, 0x0d, 0xc2, 0xc3, 0x23, 0xc5, 0xba, 0xc7, 0x0b, 0xcb, 0xcc, 0xcf, +0xde, 0x02, 0xd3, 0xd4, 0xb1, 0x76, 0xd8, 0x02, 0xda, 0xdb, 0xdc, 0x0e, 0xcf, 0x4a, 0x01, 0xd0, +0xe1, 0x0c, 0x56, 0xc3, 0xe5, 0xd9, 0x4e, 0xdc, 0xdd, 0xce, 0x4a, 0x0a, 0xed, 0xe0, 0x0d, 0x0e, +0xf0, 0xf2, 0xb4, 0x04, 0x40, 0xab, 0x67, 0x4f, 0x81, 0x3a, 0x7c, 0xec, 0x92, 0x39, 0x58, 0xe8, +0x20, 0x9e, 0xa6, 0x72, 0x0b, 0xcc, 0x11, 0xb4, 0xd7, 0x0c, 0xe1, 0x3e, 0x86, 0x0d, 0x01, 0x66, +0xcb, 0x56, 0x90, 0x99, 0x40, 0x6f, 0xcf, 0x30, 0x3a, 0x54, 0x54, 0x6c, 0x00, 0x01, 0x89, 0x62, +0xca, 0x3a, 0x1a, 0xac, 0xe8, 0x2d, 0xdc, 0xc2, 0x91, 0x76, 0x02, 0x18, 0x70, 0x76, 0xd2, 0x89, +0xb3, 0x82, 0x11, 0x14, 0x44, 0x58, 0xf8, 0xf1, 0xa6, 0xce, 0x09, 0xd3, 0x60, 0x92, 0x69, 0x37, +0xd3, 0xa4, 0x44, 0x64, 0x38, 0x23, 0x28, 0xe5, 0xe9, 0x4c, 0x59, 0x84, 0x0b, 0x50, 0xc7, 0x45, +0xa1, 0x43, 0x53, 0x00, 0x11, 0x64, 0x03, 0x80, 0xe5, 0xd4, 0xa9, 0x34, 0x27, 0x46, 0x07, 0x5c, +0x2b, 0x44, 0x90, 0x1a, 0x84, 0x28, 0x84, 0x01, 0x07, 0xfc, 0x1c, 0xb0, 0xa9, 0xb5, 0x6b, 0x4e, +0xb7, 0x12, 0x22, 0x1c, 0x80, 0x85, 0x8a, 0x6c, 0xd9, 0x50, 0x67, 0x4d, 0xaa, 0x5d, 0x10, 0x86, +0x6b, 0xd7, 0xb6, 0x12, 0x24, 0x1c, 0x38, 0x60, 0x57, 0x8b, 0xcc, 0xbc, 0x34, 0x09, 0x0c, 0xce, +0xfa, 0xd7, 0x6d, 0x83, 0x0a, 0x07, 0xa6, 0x15, 0x26, 0x63, 0x60, 0x31, 0x48, 0xc6, 0x01, 0xba, +0x1a, 0x08, 0xd7, 0x20, 0x40, 0xe4, 0x06, 0x93, 0xa1, 0x54, 0x3e, 0xe0, 0x8c, 0xf4, 0x3a, 0x76, +0xec, 0x0c, 0x40, 0x08, 0x9a, 0xaa, 0xb3, 0x35, 0x52, 0xde, 0x16, 0x2f, 0x31, 0xb1, 0xd9, 0x75, +0x80, 0x07, 0xa1, 0xa1, 0x78, 0x5e, 0x3c, 0x98, 0xdd, 0x09, 0x4b, 0x0f, 0xe2, 0x09, 0xb5, 0xb6, +0x7b, 0xb0, 0x71, 0x06, 0xf0, 0x64, 0x96, 0x98, 0xfd, 0x1a, 0x85, 0x12, 0xe4, 0xd0, 0x19, 0x70, +0x1e, 0xde, 0x5c, 0x05, 0x6a, 0x99, 0xa6, 0xaa, 0xab, 0x08, 0x01, 0x00, 0x21, 0xf9, 0x04, 0x09, +0x0c, 0x00, 0x1f, 0x00, 0x2c, 0x28, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, +0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, +0x6d, 0xdf, 0x78, 0xae, 0xef, 0x7c, 0xef, 0xc3, 0x06, 0xc3, 0x6f, 0x88, 0x32, 0x10, 0x16, 0x42, +0xe2, 0x2f, 0xc0, 0x14, 0x19, 0x17, 0x48, 0x65, 0x2f, 0x30, 0x99, 0x1c, 0x02, 0x9f, 0x67, 0x54, +0xaa, 0xa3, 0x56, 0xad, 0x9f, 0x00, 0x61, 0xb0, 0xe5, 0xe2, 0xa8, 0x94, 0xea, 0x55, 0x4c, 0x4e, +0x9a, 0x6f, 0xe8, 0x74, 0x45, 0x3c, 0x1e, 0xb8, 0xdf, 0xa7, 0x60, 0x33, 0x15, 0xb0, 0x50, 0x2c, +0x16, 0x73, 0x04, 0x63, 0x77, 0x78, 0x25, 0x06, 0x09, 0x89, 0x09, 0x41, 0x41, 0x26, 0x54, 0x80, +0x13, 0x73, 0x10, 0x83, 0x85, 0x86, 0x4e, 0x09, 0x02, 0x02, 0x8a, 0x8a, 0x08, 0x77, 0x68, 0x55, +0x92, 0x94, 0x96, 0x87, 0x98, 0x02, 0x0b, 0x09, 0x50, 0x0b, 0x03, 0x02, 0x0a, 0x0a, 0x58, 0x22, +0x01, 0x15, 0x72, 0x05, 0x01, 0x10, 0x93, 0x95, 0x78, 0x88, 0x99, 0x99, 0xa9, 0x50, 0xad, 0xad, +0xaf, 0xb1, 0x91, 0x05, 0xb4, 0xb6, 0x10, 0xb8, 0x66, 0x88, 0x98, 0xab, 0x9a, 0xbd, 0xbf, 0xc0, +0x06, 0x01, 0x05, 0x15, 0xc4, 0x57, 0xb6, 0x0b, 0x0c, 0xc8, 0x52, 0xba, 0xa6, 0xa6, 0xa8, 0xbe, +0xcf, 0xad, 0x0e, 0x99, 0xc4, 0x03, 0x08, 0xd2, 0xad, 0xd9, 0xa3, 0x59, 0xa5, 0x0b, 0xcd, 0xe0, +0xe1, 0x0a, 0xe3, 0x03, 0xf4, 0xcc, 0xac, 0x0d, 0x0d, 0xea, 0x86, 0x88, 0x03, 0x04, 0xa6, 0xa7, +0xa9, 0xe2, 0x89, 0xab, 0x47, 0x50, 0x00, 0xbe, 0x7c, 0xda, 0x96, 0x18, 0xa0, 0xe7, 0x0f, 0x0a, +0x99, 0x05, 0x02, 0x07, 0x12, 0xa4, 0x97, 0xe9, 0x20, 0x83, 0x57, 0x5c, 0x02, 0xd8, 0x61, 0xf8, +0x2f, 0x60, 0x44, 0x07, 0x04, 0x99, 0x50, 0xc4, 0xe7, 0xe0, 0xe2, 0x1b, 0x8d, 0x0b, 0xd5, 0xfb, +0x09, 0x38, 0xe2, 0x30, 0x5e, 0x04, 0x89, 0xf5, 0x44, 0x0a, 0x70, 0x40, 0xd3, 0x01, 0x46, 0x29, +0x28, 0x21, 0x0c, 0x38, 0x30, 0xe8, 0x40, 0xcb, 0x70, 0x2f, 0xe5, 0x09, 0x98, 0xa8, 0x71, 0x66, +0xcd, 0x9b, 0x38, 0x0d, 0xe8, 0xec, 0xd7, 0xb3, 0x4e, 0xab, 0xa0, 0x41, 0xe7, 0x4d, 0xa4, 0x57, +0xd3, 0x26, 0x9e, 0x00, 0x4a, 0x09, 0x0e, 0x3a, 0x32, 0xe0, 0x69, 0x84, 0xaf, 0xe2, 0xa4, 0x12, +0x3c, 0x48, 0x13, 0x29, 0x17, 0x03, 0x07, 0x0e, 0x68, 0x5d, 0x30, 0x46, 0xc1, 0x57, 0xb0, 0x6e, +0x69, 0x0e, 0xad, 0xf7, 0x74, 0x02, 0x3e, 0xb3, 0xdb, 0xd2, 0xd2, 0x53, 0xbb, 0x53, 0xad, 0x5b, +0xb8, 0x6f, 0xe5, 0x52, 0x74, 0x7b, 0xa1, 0x70, 0x42, 0x22, 0x01, 0xf8, 0xf6, 0xd5, 0xd8, 0x35, +0x42, 0x00, 0xb0, 0x6f, 0xe5, 0x55, 0xfd, 0x5b, 0x21, 0xc2, 0xe1, 0x21, 0x89, 0xd3, 0xa6, 0x65, +0xc2, 0xb9, 0xb3, 0xdb, 0xbf, 0x5f, 0x25, 0x44, 0x38, 0x90, 0x2d, 0xda, 0x65, 0xcc, 0x99, 0x99, +0x5c, 0x39, 0xf1, 0xf8, 0xaf, 0x04, 0x09, 0x69, 0x4f, 0x67, 0x4c, 0x9c, 0x9a, 0xcf, 0xd7, 0x06, +0x15, 0x0e, 0xe0, 0x93, 0x8d, 0x93, 0xf6, 0x6a, 0x15, 0x01, 0x0e, 0x26, 0x6e, 0x80, 0x77, 0x54, +0x70, 0xe2, 0xc5, 0x4b, 0x1c, 0x67, 0x52, 0x80, 0xf8, 0x3a, 0xe5, 0x77, 0x5d, 0x44, 0x6b, 0xe0, +0x2a, 0xc0, 0x03, 0xde, 0x4a, 0xf6, 0xb8, 0xb0, 0xee, 0x2a, 0x4c, 0xf2, 0xe7, 0x2f, 0xb4, 0x83, +0x1f, 0x5f, 0x23, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x0c, 0x00, 0x1f, 0x00, 0x2c, 0x28, 0x00, +0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, +0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, 0x78, 0xae, 0xef, 0x7c, 0xef, +0xff, 0x40, 0xa0, 0xc1, 0x10, 0x2c, 0x92, 0x0c, 0x84, 0x05, 0xd1, 0xd8, 0x0b, 0x38, 0x45, 0xc8, +0x85, 0x92, 0xb9, 0x0b, 0x4c, 0x26, 0x87, 0xc0, 0x27, 0x3a, 0xa5, 0xe2, 0xac, 0x57, 0xec, 0x27, +0x40, 0x18, 0x74, 0xbd, 0x36, 0x2b, 0xe5, 0x9a, 0x25, 0x9b, 0x97, 0x68, 0xd3, 0xd0, 0xa9, 0x4d, +0xa9, 0xd7, 0x15, 0x72, 0x79, 0x00, 0x8f, 0x8f, 0x0c, 0x09, 0x81, 0x81, 0x43, 0x7d, 0x23, 0x01, +0x16, 0x14, 0x16, 0x16, 0x79, 0x04, 0x65, 0x85, 0x7e, 0x80, 0x02, 0x02, 0x82, 0x82, 0x08, 0x85, +0x56, 0x8a, 0x13, 0x79, 0x10, 0x8d, 0x8f, 0x68, 0x91, 0x02, 0x0b, 0x09, 0x52, 0x0b, 0x03, 0x02, +0x0a, 0x0a, 0x75, 0x22, 0x6a, 0x57, 0x9b, 0x9d, 0x7e, 0x7f, 0x09, 0x92, 0x92, 0xa4, 0x52, 0xa8, +0xa8, 0x4f, 0x63, 0x15, 0x78, 0x05, 0x01, 0x10, 0x9c, 0x9e, 0x4c, 0x80, 0xb2, 0xa6, 0x93, 0xb5, +0xb7, 0xb7, 0x5a, 0x01, 0x15, 0x9a, 0x05, 0xbd, 0xbf, 0x10, 0xc1, 0x46, 0xa0, 0x0b, 0xa1, 0xa3, +0xb6, 0xc8, 0xb7, 0x06, 0x01, 0x05, 0x15, 0xce, 0x59, 0xbf, 0x0b, 0x0c, 0xd2, 0x41, 0xd4, 0xc6, +0xd8, 0xd9, 0xa8, 0x0e, 0x92, 0xce, 0x03, 0x08, 0xdc, 0xa8, 0xe3, 0x90, 0x09, 0x03, 0x04, 0xa1, +0xa2, 0xa4, 0xe9, 0xb7, 0xeb, 0x03, 0xfd, 0xc5, 0xa7, 0x0d, 0x1a, 0xc8, 0xa3, 0xa2, 0xc5, 0x40, +0x3f, 0x7b, 0x52, 0xcc, 0x2c, 0xd0, 0xb7, 0xcf, 0x9f, 0x43, 0x01, 0x01, 0x05, 0x92, 0xab, 0xf2, +0x20, 0x80, 0xc1, 0x7a, 0xf7, 0xf2, 0x31, 0x54, 0xe0, 0xc0, 0x1f, 0x9d, 0x62, 0x11, 0x19, 0xa8, +0x0a, 0x12, 0xe0, 0x01, 0x9f, 0x83, 0x02, 0xdb, 0x92, 0x24, 0xdc, 0xc8, 0xd1, 0x63, 0x80, 0x54, +0xa6, 0x02, 0x3a, 0x10, 0xc9, 0xc4, 0x17, 0x1f, 0x08, 0x03, 0x0e, 0x34, 0x3a, 0xb0, 0x32, 0x5d, +0x04, 0x75, 0x2e, 0x9d, 0x98, 0x72, 0x40, 0xd4, 0xc1, 0x48, 0x92, 0xd1, 0x70, 0xd6, 0xdb, 0xb9, +0x07, 0xd5, 0x4f, 0xa7, 0xea, 0x04, 0x04, 0x1d, 0x5a, 0xf4, 0x28, 0x49, 0x03, 0x4a, 0x0f, 0x36, +0x2a, 0xe5, 0x34, 0xc2, 0xcf, 0xa7, 0xfc, 0x1c, 0xfa, 0x2b, 0x6a, 0x34, 0x8e, 0x81, 0x03, 0x07, +0x1c, 0x26, 0x29, 0xa3, 0xc0, 0xeb, 0x57, 0x75, 0x61, 0x1d, 0x46, 0x24, 0x6a, 0xb5, 0xc8, 0xd9, +0xb4, 0x39, 0xfb, 0xa1, 0x1d, 0x10, 0x20, 0x81, 0x57, 0xbf, 0x4e, 0x89, 0x4a, 0xf5, 0xe7, 0x74, +0x42, 0xc0, 0xba, 0x45, 0x02, 0xe0, 0xcd, 0x79, 0x00, 0x27, 0x1d, 0x3a, 0x09, 0xda, 0x7a, 0x15, +0xdc, 0xef, 0x54, 0x84, 0x0b, 0x98, 0x27, 0xfe, 0x50, 0x8c, 0x16, 0x2d, 0x1d, 0x13, 0x2f, 0xdd, +0x72, 0x24, 0x2b, 0xb9, 0x42, 0x04, 0xcd, 0x3e, 0x7c, 0x79, 0xce, 0x75, 0x22, 0xc0, 0x57, 0xb7, +0x12, 0x22, 0x1c, 0x18, 0xb7, 0x0d, 0x75, 0x6a, 0x08, 0x59, 0x3c, 0xab, 0x78, 0x29, 0x59, 0x82, +0x04, 0xb4, 0xb6, 0x91, 0xe6, 0x46, 0x4c, 0xc2, 0x75, 0x84, 0x06, 0x15, 0x0e, 0x04, 0x0c, 0x0e, +0x24, 0xc0, 0x61, 0xe2, 0x25, 0x9c, 0x07, 0x44, 0xbb, 0x1c, 0x56, 0xf1, 0xc3, 0x30, 0xa4, 0x07, +0x2c, 0x50, 0xdd, 0xfa, 0x2a, 0xe8, 0x28, 0xb4, 0x5b, 0x64, 0xee, 0x1d, 0x05, 0x21, 0xf2, 0xe5, +0xcb, 0x87, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x2e, 0x00, 0x1f, 0x00, 0x2c, 0x28, 0x00, 0x00, +0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, +0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, 0x78, 0xae, 0xef, 0x7c, 0xef, 0xff, +0xc0, 0xa0, 0x70, 0x88, 0x32, 0x18, 0x88, 0x43, 0x03, 0x61, 0x71, 0x44, 0xee, 0x02, 0x50, 0x91, +0x72, 0xc1, 0x74, 0xe6, 0x02, 0x93, 0xc9, 0x21, 0xf0, 0x99, 0x56, 0xad, 0x36, 0x6c, 0x56, 0xfb, +0x09, 0x10, 0x06, 0x5f, 0x30, 0x0d, 0x4b, 0xc9, 0x6e, 0xcd, 0xe8, 0xa6, 0x7a, 0xc6, 0x6e, 0x57, +0xcc, 0xe7, 0x81, 0x7c, 0x1e, 0x0b, 0x58, 0x28, 0x16, 0x16, 0x77, 0x04, 0x67, 0x7b, 0x7c, 0x30, +0x58, 0x81, 0x13, 0x77, 0x10, 0x84, 0x86, 0x87, 0x2e, 0x6c, 0x59, 0x8c, 0x8e, 0x90, 0x45, 0x46, +0x98, 0x24, 0x01, 0x15, 0x76, 0x05, 0x01, 0x10, 0x8d, 0x8f, 0x90, 0x46, 0x09, 0xa5, 0xa5, 0x08, +0x99, 0x9b, 0x8b, 0x05, 0x9e, 0xa0, 0x10, 0xa2, 0x7c, 0x06, 0xa5, 0x54, 0x0b, 0x03, 0x02, 0x0a, +0xb8, 0x0a, 0x06, 0x01, 0x05, 0x15, 0xac, 0x5b, 0xa0, 0x0b, 0x0c, 0xb0, 0x60, 0xb2, 0x02, 0x02, +0xb4, 0x0b, 0xb9, 0xb8, 0x0e, 0xc7, 0xac, 0x03, 0x08, 0xbc, 0xb8, 0xc3, 0x96, 0x5d, 0x09, 0xc7, +0xc9, 0xca, 0xcb, 0xcd, 0x03, 0xdd, 0xb6, 0xc7, 0x0a, 0x0d, 0x0d, 0xd4, 0x87, 0xc6, 0xc7, 0xc8, +0x54, 0xcb, 0xcc, 0xde, 0xec, 0x02, 0xe2, 0xe3, 0xc4, 0x49, 0xa5, 0x02, 0xdf, 0xe9, 0xea, 0x0a, +0x0e, 0xde, 0x50, 0x01, 0xdf, 0xef, 0x0c, 0x5c, 0x73, 0xcc, 0x2d, 0x40, 0xa7, 0x4d, 0x5d, 0xbe, +0x6e, 0x01, 0x14, 0x40, 0xb1, 0x25, 0xce, 0xc1, 0xbf, 0x58, 0xd7, 0x90, 0x61, 0xbb, 0xb7, 0x0e, +0xe1, 0x3e, 0x5b, 0x0e, 0x32, 0x3a, 0x00, 0x58, 0x2c, 0xc1, 0x00, 0x02, 0xe8, 0xd0, 0x50, 0xc4, +0x47, 0xcf, 0x22, 0x3f, 0x01, 0x1a, 0xc0, 0x37, 0xaa, 0x09, 0x60, 0xa0, 0x1b, 0x48, 0x2a, 0xdd, +0xee, 0x45, 0x20, 0xc9, 0x8e, 0x5d, 0x4a, 0x8e, 0x48, 0x02, 0x3c, 0x68, 0xf9, 0x91, 0xe0, 0x00, +0x99, 0x11, 0x32, 0x96, 0x64, 0xf7, 0x2e, 0x23, 0x4e, 0x22, 0x3a, 0x79, 0x82, 0x5c, 0x52, 0xeb, +0xa7, 0x82, 0x99, 0x4f, 0x23, 0x04, 0xe5, 0xe6, 0x0d, 0x57, 0x84, 0x09, 0xe2, 0x8e, 0x0e, 0x49, +0x0a, 0x61, 0xc0, 0x01, 0x42, 0x07, 0x60, 0x5a, 0x95, 0x4a, 0x76, 0x6a, 0xc9, 0x5b, 0x11, 0x2e, +0xa8, 0x8d, 0x07, 0x84, 0x65, 0xd7, 0x8f, 0x60, 0x17, 0x9c, 0x89, 0x5a, 0x76, 0x66, 0x4a, 0x07, +0x51, 0x2b, 0x44, 0x60, 0x0b, 0xc4, 0xc0, 0x5b, 0x97, 0x04, 0x0e, 0x1c, 0xf8, 0x49, 0xf6, 0x29, +0xdd, 0x08, 0x12, 0x22, 0x1c, 0x18, 0xb6, 0x8b, 0x6f, 0x10, 0x03, 0x82, 0x07, 0xd7, 0x3c, 0x0c, +0x55, 0xaa, 0x04, 0x09, 0x82, 0x1d, 0x13, 0x81, 0x1c, 0x59, 0xb2, 0xb7, 0x06, 0x75, 0xa5, 0x36, +0xa8, 0x70, 0x40, 0x9c, 0xe6, 0xcd, 0x9d, 0x05, 0xb3, 0xc3, 0x64, 0xe4, 0x5d, 0x03, 0xc1, 0xa6, +0xab, 0x8d, 0x08, 0x90, 0x3a, 0x32, 0x03, 0x06, 0xb1, 0x0d, 0xb8, 0x6e, 0x50, 0x20, 0xb6, 0x6c, +0x03, 0xb7, 0x83, 0x0b, 0x77, 0x7d, 0x44, 0x37, 0x71, 0x23, 0xb2, 0xcb, 0xec, 0x5b, 0xce, 0x92, +0x75, 0x13, 0xe7, 0xa7, 0x5b, 0x84, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x0a, 0x00, 0x1f, 0x00, +0x2c, 0x28, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, +0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, 0x78, 0xae, +0xef, 0x7c, 0xef, 0xe3, 0x06, 0xc3, 0x6f, 0x88, 0x32, 0x10, 0x16, 0x42, 0xe2, 0x2f, 0xc0, 0x14, +0x19, 0x17, 0x48, 0x65, 0x2f, 0x30, 0x99, 0x1c, 0x02, 0x9f, 0x67, 0x54, 0xaa, 0xa3, 0x56, 0xad, +0x9f, 0x00, 0x61, 0xb0, 0xe5, 0xe2, 0xa8, 0x94, 0xea, 0x55, 0x4c, 0x4e, 0x9a, 0x6f, 0xe8, 0x74, +0x45, 0x3c, 0x1e, 0xb8, 0xdf, 0xb5, 0x80, 0x85, 0x62, 0xb1, 0xcc, 0x09, 0x63, 0x77, 0x78, 0x34, +0x54, 0x7d, 0x13, 0x73, 0x10, 0x80, 0x82, 0x83, 0x32, 0x68, 0x55, 0x88, 0x8a, 0x8c, 0x36, 0x01, +0x15, 0x72, 0x05, 0x01, 0x10, 0x89, 0x8b, 0x92, 0x2f, 0x94, 0x87, 0x05, 0x97, 0x99, 0x10, 0x9b, +0x9c, 0x23, 0x41, 0xa7, 0x6e, 0x06, 0x01, 0x05, 0x15, 0xa0, 0x57, 0x99, 0x0b, 0x0c, 0xa4, 0x92, +0x41, 0x09, 0xb6, 0xb6, 0x08, 0xa7, 0x0e, 0x02, 0x02, 0xa0, 0x03, 0x08, 0xab, 0x0a, 0x0a, 0xb2, +0xa5, 0x25, 0x06, 0xb6, 0x50, 0x0b, 0x03, 0x02, 0xc2, 0xc2, 0xbb, 0x03, 0xd0, 0xcb, 0xbc, 0x0a, +0x0d, 0x0d, 0xc4, 0xc5, 0x59, 0x09, 0xbc, 0xc9, 0x0b, 0xcd, 0xce, 0xd1, 0xe0, 0x02, 0xd5, 0xd6, +0xb3, 0x66, 0xc7, 0xdb, 0xdc, 0xde, 0x0a, 0x0e, 0xd1, 0x4c, 0x01, 0xd2, 0xe3, 0x0c, 0x58, 0x9c, +0xe7, 0xbc, 0x02, 0xc9, 0xea, 0xeb, 0xed, 0x01, 0x0a, 0xef, 0xe2, 0x0d, 0x0e, 0xe4, 0xd1, 0xb3, +0x25, 0x40, 0x1a, 0x94, 0x7c, 0xfa, 0xa0, 0xb9, 0xf3, 0xe7, 0xa0, 0xa1, 0x83, 0x79, 0x8c, 0xea, +0x2d, 0xb8, 0x77, 0x30, 0xdf, 0x33, 0x85, 0x4c, 0x96, 0x39, 0x7c, 0x38, 0x70, 0xdb, 0x36, 0x84, +0xeb, 0x0a, 0x82, 0x8b, 0xb6, 0x11, 0x22, 0x9e, 0x63, 0x03, 0xc1, 0x08, 0x50, 0x24, 0x03, 0xb2, +0xa1, 0x48, 0x70, 0xe3, 0x1a, 0x9a, 0x34, 0x13, 0xc0, 0x00, 0x34, 0x95, 0x50, 0xa0, 0xe5, 0x8b, +0xa0, 0x20, 0x82, 0x4b, 0x70, 0xc2, 0x22, 0x4c, 0xa8, 0x36, 0x53, 0xca, 0x3b, 0x9b, 0x29, 0x29, +0x2a, 0xdb, 0x19, 0xa1, 0xe9, 0xcf, 0x65, 0x3d, 0x2f, 0x48, 0x2d, 0xb7, 0xc4, 0xce, 0x4d, 0x01, +0x47, 0x94, 0x0d, 0x08, 0x1a, 0xb4, 0x29, 0xcf, 0x8d, 0x0e, 0x7a, 0x46, 0xa8, 0x10, 0x81, 0xaa, +0x8f, 0xa3, 0x10, 0x06, 0x1c, 0x00, 0x74, 0x20, 0x67, 0x57, 0xaf, 0x62, 0x9b, 0x4a, 0x88, 0x70, +0x40, 0x96, 0x2a, 0xb3, 0x4b, 0x0c, 0xa4, 0x4d, 0xc9, 0x76, 0xc1, 0x98, 0xb8, 0x4d, 0xbb, 0x4a, +0x90, 0x70, 0xe0, 0x00, 0x5e, 0x25, 0x35, 0xf7, 0xde, 0x24, 0x50, 0x78, 0x2b, 0x5c, 0xaf, 0x11, +0x1a, 0x54, 0x38, 0x50, 0xed, 0xb0, 0x14, 0x03, 0x85, 0x0f, 0x8c, 0x74, 0x0c, 0xd9, 0xc0, 0xb8, +0x06, 0x01, 0x28, 0x37, 0xb0, 0x4c, 0x04, 0x73, 0x66, 0xcd, 0x30, 0xbd, 0x32, 0x51, 0x35, 0x8e, +0x49, 0x65, 0x6c, 0x4e, 0x4e, 0x37, 0x8e, 0x86, 0x6a, 0x44, 0x00, 0xa2, 0xae, 0x49, 0x13, 0x09, +0x2d, 0xbb, 0x30, 0x03, 0x06, 0xaf, 0x6d, 0x8f, 0x16, 0x51, 0xb4, 0x94, 0x81, 0xdf, 0xc8, 0x93, +0x7f, 0x36, 0x59, 0x1c, 0xf6, 0xc2, 0xe7, 0xa8, 0x74, 0xd7, 0x08, 0x01, 0x00, 0x21, 0xf9, 0x04, +0x09, 0x0c, 0x00, 0x1f, 0x00, 0x2c, 0x28, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, +0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, +0x74, 0x6d, 0xdf, 0x78, 0xae, 0xef, 0xbc, 0x6a, 0x18, 0xbd, 0x20, 0xcb, 0x40, 0x58, 0x00, 0x85, +0xc8, 0x4f, 0x60, 0x29, 0x22, 0x2e, 0x8c, 0xc9, 0x60, 0x60, 0x32, 0x39, 0x04, 0x3e, 0x4e, 0x68, +0x74, 0x37, 0xa5, 0x56, 0x95, 0x84, 0x81, 0x76, 0x9b, 0x9b, 0x52, 0xa8, 0xd6, 0x40, 0x78, 0x4c, +0xbe, 0x99, 0xcf, 0x15, 0x75, 0x78, 0x70, 0x6c, 0xbb, 0x2d, 0x14, 0x8b, 0x25, 0x4e, 0x08, 0xd7, +0xed, 0x36, 0x53, 0x7a, 0x13, 0x71, 0x10, 0x7d, 0x7f, 0x80, 0x34, 0x66, 0x54, 0x85, 0x87, 0x89, +0x6e, 0x15, 0x70, 0x05, 0x01, 0x10, 0x86, 0x88, 0x8f, 0x31, 0x01, 0x15, 0x84, 0x05, 0x93, 0x95, +0x10, 0x97, 0x98, 0x25, 0x3f, 0xa4, 0x75, 0x06, 0x01, 0x05, 0x15, 0x9d, 0x56, 0x95, 0x0b, 0x0c, +0xa1, 0xa2, 0x3f, 0x09, 0xb3, 0xb3, 0x08, 0xa4, 0x0e, 0x02, 0x02, 0x9d, 0x03, 0x08, 0xa8, 0x0a, +0x0a, 0xaf, 0xa2, 0x26, 0x06, 0xb3, 0x4f, 0x0b, 0x03, 0x02, 0xbf, 0xbf, 0xb8, 0x03, 0xcd, 0xc8, +0xb9, 0x0a, 0x0d, 0x0d, 0xc1, 0xc2, 0x4d, 0x09, 0xb9, 0xc6, 0x0b, 0xca, 0xcb, 0xce, 0xdd, 0x02, +0xd2, 0xd3, 0xb0, 0x76, 0xc4, 0xd8, 0xd9, 0xdb, 0x0a, 0x0e, 0xce, 0x4b, 0x01, 0xcf, 0xe0, 0x0c, +0x57, 0xb1, 0xd7, 0xb9, 0x02, 0xc6, 0xe7, 0xe8, 0xea, 0x01, 0x0a, 0xec, 0xdf, 0x0d, 0x0e, 0xef, +0xf1, 0xd7, 0x9e, 0x3d, 0xb1, 0x77, 0xaf, 0xd9, 0xba, 0x7d, 0x0e, 0x12, 0x3a, 0x80, 0xf7, 0x88, +0x1c, 0x3d, 0x7a, 0x03, 0xed, 0x31, 0x33, 0xb8, 0x04, 0x99, 0xc2, 0x85, 0xf1, 0xb0, 0x61, 0x23, +0x88, 0x4e, 0x40, 0xb7, 0x6e, 0x17, 0x19, 0x02, 0x22, 0x36, 0x80, 0x00, 0x44, 0x31, 0x1c, 0xc3, +0x13, 0x7a, 0xfc, 0x08, 0x2e, 0xa1, 0xc8, 0x36, 0x01, 0x0c, 0x34, 0x33, 0xf9, 0xa4, 0x99, 0xbd, +0x08, 0x0a, 0x22, 0xa8, 0xec, 0xf6, 0x2b, 0xc2, 0x04, 0x69, 0x2f, 0xb7, 0xb0, 0x93, 0x59, 0x12, +0xe2, 0xb1, 0x9b, 0x11, 0x92, 0xee, 0x44, 0x96, 0xf3, 0x82, 0x53, 0x71, 0x48, 0x86, 0xce, 0x14, +0x50, 0xe4, 0xd8, 0x80, 0x9e, 0x3d, 0x93, 0xe2, 0xbc, 0xe8, 0x20, 0x67, 0x84, 0x0a, 0x11, 0xa0, +0x0a, 0x19, 0x0a, 0x61, 0xc0, 0x81, 0x3e, 0x07, 0x6a, 0x66, 0xd5, 0xea, 0x35, 0xa9, 0x84, 0x08, +0x07, 0x5e, 0x9d, 0x12, 0x1b, 0xd5, 0x40, 0xd9, 0x92, 0x68, 0x17, 0x84, 0x69, 0x9b, 0x34, 0xab, +0x04, 0x09, 0x07, 0x0e, 0xd0, 0x15, 0x6a, 0xb7, 0x1b, 0xda, 0x03, 0x57, 0xd9, 0x6a, 0x8d, 0xd0, +0xa0, 0xc2, 0x01, 0x69, 0x83, 0xc9, 0x18, 0x08, 0xfc, 0xd1, 0x66, 0x84, 0x00, 0x5a, 0x0d, 0x80, +0x6b, 0x10, 0xe0, 0x71, 0x83, 0xc8, 0x51, 0x26, 0x23, 0x36, 0xdb, 0xed, 0xe0, 0xba, 0x53, 0xe0, +0x96, 0x40, 0xae, 0x36, 0x82, 0x68, 0x33, 0xca, 0x4c, 0x4e, 0x04, 0x00, 0xaa, 0x1a, 0x74, 0x92, +0xce, 0x94, 0x03, 0xaf, 0x4b, 0x31, 0xfb, 0x48, 0x50, 0x51, 0xb8, 0x03, 0x0b, 0x67, 0xf0, 0x2e, +0xa6, 0x6c, 0xd6, 0x28, 0x96, 0x10, 0x5f, 0xce, 0x60, 0xf3, 0x6f, 0xe4, 0xbc, 0x0f, 0x96, 0xb2, +0x7d, 0x23, 0x04, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x0c, 0x00, 0x1f, 0x00, 0x2c, 0x28, 0x00, 0x00, +0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, +0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, 0x9f, 0x61, 0xe0, 0xbc, 0x6d, 0x10, +0x8b, 0x5d, 0x6f, 0xb8, 0x0a, 0x18, 0x45, 0xbf, 0x45, 0x90, 0xc8, 0x34, 0x05, 0x26, 0x93, 0x43, +0x20, 0x07, 0x5c, 0x36, 0xaf, 0x4f, 0x68, 0xf4, 0x13, 0x20, 0x0c, 0xac, 0x57, 0xe6, 0x93, 0x02, +0x95, 0x76, 0xbf, 0xc2, 0x30, 0x71, 0x4c, 0xae, 0x74, 0xbd, 0x83, 0xb4, 0x9a, 0xa5, 0x3b, 0xa6, +0x02, 0x16, 0x8a, 0xc5, 0xe2, 0x26, 0x78, 0xe5, 0x73, 0x2a, 0x06, 0x09, 0x84, 0x09, 0x3a, 0x3a, +0x4e, 0x13, 0x7b, 0x13, 0x6e, 0x10, 0x7e, 0x80, 0x81, 0x27, 0x83, 0x02, 0x02, 0x85, 0x85, 0x08, +0x72, 0x63, 0x50, 0x8d, 0x8f, 0x91, 0x82, 0x09, 0x94, 0x0b, 0x09, 0x4a, 0x0b, 0x03, 0x02, 0x0a, +0x0a, 0x53, 0x22, 0x01, 0x15, 0x6d, 0x05, 0x01, 0x10, 0x8e, 0x90, 0x9e, 0x48, 0xa0, 0x94, 0x02, +0xa4, 0x4a, 0xa8, 0xa8, 0xaa, 0xac, 0x8c, 0x05, 0xaf, 0xb1, 0x10, 0xb3, 0x9e, 0x83, 0xa0, 0xa6, +0x95, 0xb9, 0xbb, 0xbc, 0x06, 0x01, 0x05, 0x15, 0xc0, 0x52, 0xb1, 0x0b, 0x0c, 0xc4, 0x81, 0x93, +0xb8, 0xb8, 0xa3, 0xba, 0xcb, 0xa8, 0x0e, 0x94, 0xc0, 0x03, 0x08, 0xce, 0xa8, 0xd5, 0xb4, 0x25, +0xd8, 0x0b, 0xc9, 0xdc, 0xdd, 0x0a, 0xdf, 0x03, 0xf0, 0xc8, 0xa7, 0x0d, 0x0d, 0xe6, 0xe7, 0x39, +0x09, 0x03, 0x04, 0xb8, 0xa2, 0xa4, 0xed, 0xde, 0xf1, 0x02, 0x0a, 0xa0, 0x57, 0xcf, 0x1a, 0x16, +0x03, 0xf0, 0xf6, 0x29, 0xf9, 0xb2, 0xe0, 0x1f, 0xc0, 0x80, 0xf0, 0x28, 0x11, 0x64, 0xa0, 0x2a, +0x52, 0x80, 0x38, 0x09, 0xf9, 0xf9, 0x73, 0xe8, 0x20, 0xa0, 0x91, 0x88, 0xf4, 0x1c, 0x50, 0xa4, +0x75, 0x11, 0xa1, 0x3e, 0x01, 0x55, 0xd2, 0x4a, 0xb5, 0x8b, 0xf0, 0x30, 0xde, 0x47, 0x01, 0x0e, +0x62, 0x3a, 0xa8, 0x18, 0xa8, 0x24, 0x84, 0x01, 0x07, 0xfc, 0x1c, 0x58, 0xb8, 0xd2, 0x9b, 0x00, +0x88, 0x17, 0x61, 0xca, 0xa4, 0x59, 0xd3, 0xc0, 0x4d, 0x7d, 0x3a, 0xe1, 0xa0, 0x62, 0xa9, 0x80, +0xe9, 0x3b, 0x88, 0xf0, 0x64, 0xce, 0x3c, 0x17, 0xc0, 0x68, 0x40, 0x3f, 0x40, 0x06, 0x2c, 0x8d, +0xc0, 0xd5, 0xdb, 0xd3, 0x80, 0x04, 0x63, 0x12, 0x8d, 0x64, 0xe0, 0xc0, 0x81, 0xab, 0x0b, 0xbc, +0x34, 0xe5, 0xca, 0x34, 0x42, 0xcc, 0x9f, 0xf1, 0x96, 0x4e, 0xa0, 0x37, 0xf6, 0x9a, 0x59, 0x78, +0x67, 0x71, 0x9e, 0x5d, 0xdb, 0x96, 0xeb, 0xdb, 0x88, 0x4d, 0x2f, 0x08, 0x36, 0xa8, 0x26, 0x40, +0x5e, 0xbd, 0x17, 0xb5, 0x46, 0x08, 0xd0, 0x95, 0xad, 0x3b, 0xa9, 0x6b, 0x2b, 0x44, 0x20, 0x1c, +0xc6, 0xb0, 0x59, 0xb3, 0x46, 0x32, 0x6b, 0x6e, 0xca, 0x37, 0x82, 0x84, 0x08, 0x07, 0xaa, 0x35, +0xa3, 0x5c, 0xd9, 0xb2, 0x11, 0x29, 0x27, 0x18, 0x6f, 0x95, 0x20, 0xc1, 0x2c, 0xe9, 0x9a, 0x86, +0x4d, 0xdf, 0x61, 0xdb, 0xa0, 0xc2, 0x01, 0x7a, 0xaf, 0xe7, 0x9c, 0x8e, 0xbd, 0xc2, 0x00, 0xc1, +0x06, 0x66, 0x71, 0xdf, 0x4b, 0x4d, 0xb7, 0xae, 0x09, 0xdf, 0xbf, 0x0b, 0x08, 0x1f, 0x4e, 0x22, +0x00, 0xdd, 0x17, 0xc8, 0x09, 0x1e, 0x62, 0x5e, 0xc2, 0x0e, 0xf4, 0x43, 0x88, 0xa8, 0x6b, 0xdf, +0xce, 0xbd, 0xbb, 0xf7, 0xef, 0xe0, 0x61, 0x84, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x0c, 0x00, +0x1f, 0x00, 0x2c, 0x28, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, +0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, +0x78, 0xae, 0xef, 0x7c, 0xef, 0xff, 0xc0, 0x20, 0xcd, 0x60, 0x10, 0x1a, 0x45, 0x06, 0xc2, 0xa2, +0x78, 0xe4, 0x05, 0x9e, 0x48, 0xe5, 0xb2, 0xa9, 0x0b, 0x4c, 0x26, 0x87, 0xc0, 0x27, 0xb9, 0x98, +0x52, 0x6f, 0xd6, 0x2b, 0xf6, 0x13, 0x20, 0x0c, 0xbc, 0xdf, 0x9a, 0x95, 0x72, 0xcd, 0x96, 0xcf, +0xcc, 0x74, 0x89, 0xf8, 0xd4, 0xa6, 0xd6, 0xec, 0x4a, 0xd9, 0x3c, 0x88, 0xcb, 0x91, 0x09, 0x81, +0x81, 0x44, 0x7e, 0x23, 0x01, 0x16, 0x14, 0x16, 0x16, 0x7a, 0x04, 0x66, 0x85, 0x72, 0x06, 0x09, +0x02, 0x02, 0x82, 0x82, 0x08, 0x85, 0x56, 0x8a, 0x13, 0x7a, 0x10, 0x8d, 0x8f, 0x5f, 0x91, 0x93, +0x0b, 0x09, 0x5d, 0x0b, 0x03, 0x02, 0x0a, 0x0a, 0x76, 0x22, 0x6b, 0x57, 0x9c, 0x9e, 0x7f, 0x80, +0x93, 0xa2, 0xa5, 0x0b, 0xa9, 0xa9, 0x50, 0x64, 0x15, 0x79, 0x05, 0x01, 0x10, 0x9d, 0x9f, 0x47, +0x91, 0x92, 0xa7, 0x94, 0xb5, 0xb7, 0xb7, 0x5a, 0x01, 0x15, 0x9b, 0x05, 0xbd, 0xbf, 0x10, 0xc1, +0x46, 0xa1, 0x02, 0x0b, 0xd5, 0xa4, 0x5d, 0xc8, 0xc8, 0x06, 0x01, 0x05, 0x15, 0xce, 0x59, 0xbf, +0x0b, 0x0c, 0xd2, 0x41, 0xd4, 0xd6, 0xd8, 0xb6, 0xda, 0xb7, 0x0e, 0x93, 0xce, 0x03, 0x08, 0xdd, +0xa9, 0xe4, 0x90, 0x09, 0x03, 0x04, 0xd5, 0xa3, 0xa5, 0xeb, 0xec, 0x02, 0x03, 0xff, 0xc5, 0x50, +0x35, 0x68, 0x40, 0xaf, 0x89, 0x16, 0x03, 0xff, 0xf0, 0x75, 0x39, 0xa3, 0x8e, 0x9f, 0x02, 0x07, +0x00, 0x23, 0x0a, 0x18, 0x48, 0xb0, 0xdc, 0x8e, 0x00, 0x0f, 0x02, 0x20, 0xbc, 0x97, 0x6f, 0x9f, +0xc3, 0x87, 0x00, 0xeb, 0x14, 0xa3, 0xc8, 0x60, 0x55, 0x10, 0x8c, 0x7d, 0xdd, 0x12, 0x0a, 0x90, +0x62, 0xea, 0x23, 0xc8, 0x7f, 0x4f, 0x54, 0x9d, 0x1a, 0xe8, 0xa0, 0xe4, 0x11, 0x5f, 0x7d, 0x20, +0x0c, 0x38, 0xd0, 0xe8, 0xc0, 0x42, 0x7e, 0x11, 0x52, 0x41, 0x84, 0x29, 0x52, 0x80, 0x83, 0xa3, +0x0e, 0x4c, 0x9e, 0x8c, 0xa6, 0xf3, 0x5e, 0x4f, 0x3e, 0xa9, 0x82, 0x46, 0x15, 0xea, 0x8f, 0x68, +0x80, 0x53, 0x48, 0x93, 0x52, 0xd1, 0xd8, 0x34, 0x61, 0xa3, 0x96, 0x0a, 0x22, 0x88, 0x0d, 0x4b, +0x35, 0x62, 0xc4, 0xac, 0x4a, 0xa7, 0x1d, 0x38, 0x10, 0x51, 0x89, 0x99, 0xb0, 0x63, 0xa5, 0x1e, +0xad, 0x1a, 0x91, 0xe2, 0xd1, 0xb4, 0x42, 0x0c, 0xac, 0xfd, 0xc7, 0x76, 0x27, 0xdb, 0x00, 0x09, +0xc4, 0x06, 0x8e, 0x3a, 0x37, 0x62, 0xd4, 0x09, 0x03, 0xf1, 0x0a, 0x09, 0xd0, 0xd7, 0xaf, 0xce, +0x3a, 0x75, 0x12, 0xc0, 0x8d, 0x50, 0xf8, 0x54, 0xd8, 0x0b, 0x98, 0x2d, 0xfe, 0x60, 0xbc, 0x76, +0x6d, 0x1d, 0x13, 0x01, 0x26, 0x3f, 0xcc, 0x0a, 0xb7, 0x42, 0x04, 0xcd, 0x3e, 0x7c, 0x79, 0xce, +0x75, 0x22, 0x40, 0x50, 0xb1, 0x62, 0x25, 0x44, 0x38, 0x40, 0x8e, 0x1b, 0xea, 0xd4, 0x10, 0xb2, +0x78, 0x56, 0x11, 0x1a, 0xae, 0x04, 0x09, 0x6b, 0x6f, 0x2f, 0xd5, 0xad, 0x98, 0x84, 0xeb, 0x08, +0x0d, 0x2a, 0x1c, 0x18, 0x28, 0x1c, 0x48, 0x80, 0xc4, 0xc5, 0x4b, 0x3c, 0x1f, 0xb8, 0x96, 0x79, +0x2c, 0x43, 0x89, 0x61, 0x4c, 0x1f, 0x58, 0xc0, 0xfa, 0x75, 0x32, 0xd1, 0x4f, 0x18, 0xa0, 0xc8, +0x9c, 0xc8, 0xf7, 0x1a, 0x84, 0x08, 0x9d, 0xff, 0x12, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x2e, +0x00, 0x1f, 0x00, 0x2c, 0x28, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, +0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, +0xdf, 0x78, 0xae, 0xef, 0x7c, 0xef, 0xff, 0xc0, 0xa0, 0x70, 0xe8, 0x33, 0x18, 0x88, 0x43, 0x03, +0x61, 0x71, 0x44, 0xee, 0x02, 0x50, 0x91, 0x72, 0xc1, 0x74, 0xe6, 0x02, 0x93, 0xc9, 0x21, 0xf0, +0x99, 0x56, 0xad, 0x36, 0x6c, 0x56, 0xfb, 0x09, 0x10, 0x06, 0x5f, 0x30, 0x0d, 0x4b, 0xc9, 0x6e, +0xcd, 0xe8, 0xa6, 0x7a, 0xc6, 0x6e, 0x57, 0xcc, 0xe7, 0x81, 0x7c, 0x1e, 0x0b, 0x58, 0x28, 0x16, +0x16, 0x77, 0x04, 0x67, 0x7b, 0x7c, 0x30, 0x58, 0x81, 0x13, 0x77, 0x10, 0x84, 0x86, 0x87, 0x2e, +0x6c, 0x59, 0x8c, 0x8e, 0x90, 0x28, 0x46, 0x98, 0x7b, 0x01, 0x15, 0x76, 0x05, 0x01, 0x10, 0x8d, +0x8f, 0x90, 0x46, 0x09, 0xa5, 0xa5, 0x08, 0x98, 0x65, 0x15, 0x8b, 0x05, 0x9e, 0xa0, 0x10, 0xa2, +0x7c, 0x06, 0xa5, 0x54, 0x0b, 0x03, 0x02, 0x0a, 0xb9, 0x0a, 0x06, 0x01, 0x05, 0x15, 0xad, 0x5b, +0xa0, 0x0b, 0x0c, 0xb1, 0x60, 0xb3, 0x02, 0x02, 0xb5, 0x0b, 0xba, 0xb9, 0x0e, 0xc8, 0xad, 0x03, +0x08, 0xbd, 0xb9, 0xc4, 0x96, 0x5d, 0x09, 0xc8, 0xca, 0xcb, 0xcc, 0xce, 0x03, 0xde, 0xb7, 0xc8, +0x0a, 0x0d, 0x0d, 0xd5, 0x87, 0xc7, 0xc8, 0xc9, 0x54, 0xcc, 0xcd, 0xdf, 0xed, 0x02, 0xe3, 0xe4, +0xc5, 0x49, 0xa5, 0x02, 0xe0, 0xea, 0xeb, 0x0a, 0x0e, 0xdf, 0x50, 0x01, 0xe0, 0xf0, 0x0c, 0x5c, +0xe6, 0x9c, 0x5b, 0x90, 0x6e, 0xdb, 0x3a, 0x7d, 0xde, 0x02, 0x28, 0x80, 0x72, 0x6b, 0x9c, 0x03, +0x80, 0xb2, 0xb0, 0x25, 0xcb, 0x86, 0x8f, 0x5d, 0x42, 0x7e, 0xb7, 0x1c, 0x68, 0x74, 0x10, 0xd0, +0x58, 0x82, 0x01, 0x04, 0xd2, 0xa1, 0xa9, 0x98, 0xaf, 0xde, 0xc5, 0x7e, 0x02, 0xbe, 0x36, 0x72, +0x54, 0x13, 0xc0, 0x80, 0xb7, 0x90, 0x54, 0xbc, 0xe1, 0x8b, 0x50, 0xb2, 0x5d, 0x3b, 0x95, 0x1d, +0x91, 0x04, 0x78, 0xe0, 0x12, 0x64, 0xc1, 0x01, 0x33, 0x23, 0x68, 0x34, 0xd9, 0x0e, 0x9e, 0xc6, +0x9c, 0x44, 0x76, 0xf6, 0x0c, 0xb9, 0xc4, 0x16, 0x50, 0x05, 0x34, 0xa1, 0x46, 0x10, 0xda, 0xed, +0x5b, 0xae, 0x08, 0x13, 0xc6, 0x21, 0x1d, 0xa2, 0x14, 0xc2, 0x80, 0x03, 0x84, 0x0e, 0xc4, 0xbc, +0x3a, 0xb5, 0x2c, 0x55, 0x93, 0xb8, 0x22, 0x5c, 0x58, 0x2b, 0x0f, 0x48, 0x4b, 0xaf, 0x20, 0xc3, +0x2e, 0x38, 0x23, 0xd5, 0x2c, 0x4d, 0x95, 0x0e, 0xa4, 0x56, 0x88, 0xd0, 0x16, 0x88, 0x01, 0xb8, +0x2f, 0x09, 0x1c, 0x38, 0x00, 0xb4, 0x2c, 0xd4, 0xba, 0x11, 0x24, 0x44, 0x38, 0x40, 0x8c, 0x57, +0xdf, 0x20, 0x06, 0x06, 0x13, 0xb6, 0x89, 0x38, 0xea, 0x54, 0x09, 0x12, 0x06, 0x3f, 0x26, 0x12, +0x59, 0xf2, 0xe4, 0x6f, 0x0d, 0xec, 0x4e, 0x6d, 0x50, 0xe1, 0xc0, 0xb8, 0xcd, 0x9c, 0x3d, 0x0f, +0x6e, 0x97, 0xc9, 0x00, 0xbc, 0x06, 0x83, 0x4f, 0x5b, 0x1b, 0x11, 0x40, 0xb5, 0x64, 0x06, 0x0c, +0x64, 0xbb, 0x7e, 0x5d, 0x40, 0xf6, 0x6c, 0x03, 0xb8, 0x83, 0x0b, 0x7f, 0x7d, 0x64, 0x37, 0xbc, +0x54, 0xb3, 0xf9, 0x29, 0x87, 0xd2, 0xba, 0x49, 0x73, 0x13, 0x21, 0x00, 0x00, 0x21, 0xf9, 0x04, +0x09, 0x12, 0x00, 0x1f, 0x00, 0x2c, 0x28, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, +0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, +0x74, 0x6d, 0xdf, 0x78, 0xae, 0xef, 0x7c, 0xef, 0xff, 0xc0, 0xa0, 0x70, 0x48, 0x2c, 0x1a, 0x8f, +0xb7, 0x80, 0x48, 0x89, 0xe4, 0x05, 0x06, 0x81, 0x80, 0x80, 0xd9, 0xc4, 0x3d, 0xa1, 0x04, 0xc2, +0xb4, 0x6a, 0x1d, 0x60, 0xb5, 0x54, 0x2e, 0xed, 0x1a, 0xc8, 0x6e, 0xc5, 0xb6, 0x67, 0x19, 0x8c, +0x4e, 0x7b, 0xd7, 0xe1, 0xb6, 0x4c, 0x4d, 0x28, 0xc4, 0xe5, 0x23, 0x83, 0x7e, 0x7f, 0xa2, 0xdb, +0xf1, 0x25, 0x7a, 0x09, 0x83, 0x83, 0x08, 0x7c, 0x23, 0x6a, 0x05, 0x07, 0x77, 0x6d, 0x06, 0x83, +0x0b, 0x90, 0x03, 0x02, 0x0a, 0x94, 0x53, 0x4a, 0x51, 0x01, 0x07, 0x03, 0x08, 0x51, 0x80, 0x1f, +0x8e, 0x02, 0x02, 0x90, 0x90, 0x94, 0x95, 0xa1, 0x51, 0x02, 0x5e, 0xaa, 0x67, 0x8d, 0x09, 0xa1, +0xa3, 0xa4, 0xa5, 0x0a, 0xa1, 0xa1, 0xaa, 0xab, 0xac, 0x5c, 0xa0, 0xb4, 0xa3, 0xb2, 0xa6, 0xa9, +0xb6, 0x5e, 0xa1, 0x0c, 0x06, 0x62, 0x8e, 0xae, 0x92, 0xa2, 0x0b, 0xbd, 0x94, 0x0e, 0xb5, 0xb6, +0x98, 0x03, 0x0d, 0x0c, 0xc5, 0xae, 0xa2, 0xc9, 0xca, 0xcb, 0xcd, 0xbf, 0x5e, 0x0f, 0x51, 0x0a, +0x52, 0x0c, 0x8c, 0x44, 0xba, 0x0b, 0xaf, 0xcb, 0xcc, 0xce, 0xdc, 0x98, 0x01, 0x0e, 0x0e, 0xe2, +0x42, 0x8e, 0x03, 0x5a, 0x91, 0xd8, 0xd9, 0xb4, 0xaa, 0x0f, 0xdd, 0x51, 0xed, 0xef, 0x40, 0x01, +0x06, 0x5e, 0xe6, 0x2d, 0xf0, 0xb2, 0x2c, 0x82, 0x02, 0x6d, 0xdb, 0xf2, 0x41, 0x80, 0x30, 0x80, +0x1f, 0x92, 0x00, 0x0f, 0x00, 0xca, 0xbb, 0x36, 0xa0, 0x60, 0x84, 0x76, 0xe9, 0x80, 0x39, 0x3c, +0x02, 0x51, 0xa2, 0x16, 0x02, 0x91, 0x2a, 0x2a, 0x30, 0x38, 0x32, 0xc2, 0x45, 0x5a, 0xdb, 0x83, +0xbc, 0x34, 0x58, 0xd9, 0xcf, 0x47, 0x47, 0x86, 0x07, 0xb2, 0x1c, 0x88, 0x44, 0xc9, 0xa4, 0x4d, +0x93, 0x18, 0xd3, 0x51, 0x6a, 0x40, 0xac, 0xc9, 0x3f, 0x86, 0xf2, 0x64, 0x2e, 0x20, 0x50, 0xf1, +0xa6, 0xcd, 0x83, 0xed, 0xda, 0x95, 0xec, 0x94, 0x0b, 0x68, 0x40, 0x02, 0x07, 0x34, 0x95, 0x34, +0x48, 0xd5, 0xa6, 0x84, 0x08, 0x07, 0x86, 0xf5, 0x44, 0x63, 0x20, 0xaa, 0x26, 0x60, 0x53, 0x4d, +0xd6, 0x8c, 0x20, 0x41, 0x42, 0xd4, 0xad, 0x8d, 0xbc, 0x46, 0x05, 0xd6, 0xc0, 0xa8, 0xc9, 0x95, +0x0d, 0x02, 0xf0, 0xf4, 0xd4, 0x55, 0xed, 0x57, 0x2f, 0x7b, 0xf4, 0x44, 0x81, 0xbb, 0x68, 0x2e, +0xa0, 0x4c, 0x76, 0xa3, 0x32, 0x60, 0xb0, 0x72, 0xab, 0xdc, 0x95, 0x76, 0xfc, 0xca, 0x31, 0x30, +0xb8, 0xb1, 0x63, 0xb8, 0x8a, 0x0f, 0xf3, 0xd4, 0xf3, 0x77, 0xdd, 0xba, 0xbc, 0x94, 0xf3, 0x1c, +0x22, 0x11, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x12, 0x00, 0x1f, 0x00, 0x2c, 0x28, 0x00, 0x00, +0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, +0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, 0x78, 0xae, 0xef, 0x7c, 0xef, 0xff, +0xc0, 0xa0, 0x70, 0x58, 0x0b, 0x88, 0x8c, 0x44, 0x60, 0x60, 0x10, 0x08, 0x08, 0x90, 0x49, 0xde, +0x92, 0x49, 0x20, 0x3c, 0xa3, 0xd2, 0x01, 0xd5, 0x0a, 0xc5, 0xe2, 0xa6, 0x81, 0xea, 0xd5, 0xab, +0x5b, 0x86, 0xb9, 0xe4, 0xb2, 0xf6, 0xdc, 0x4d, 0xdb, 0xcc, 0x84, 0x42, 0xdb, 0x4d, 0x83, 0xcb, +0xe9, 0x5f, 0x66, 0xe1, 0x30, 0xc7, 0xa3, 0x0c, 0x80, 0x81, 0x4d, 0x83, 0x07, 0x04, 0x08, 0x4d, +0x7e, 0x2a, 0x80, 0x09, 0x8c, 0x8c, 0x08, 0x81, 0x55, 0x91, 0x55, 0x7d, 0x89, 0x06, 0x8c, 0x0b, +0x0b, 0x09, 0x03, 0x02, 0x0b, 0x0a, 0x0a, 0x4f, 0x92, 0x93, 0x89, 0x26, 0x96, 0x02, 0x9c, 0x98, +0xa8, 0x9e, 0xa6, 0x02, 0x91, 0x5a, 0x4c, 0xa3, 0x23, 0xa5, 0xa7, 0x09, 0x99, 0x09, 0x9e, 0xaa, +0xa6, 0x04, 0xae, 0xaf, 0xb0, 0xb2, 0xa6, 0xa8, 0x98, 0xb7, 0x9f, 0xb9, 0xbb, 0x94, 0x64, 0x96, +0x09, 0x02, 0x9b, 0xb3, 0xc1, 0xb7, 0x0e, 0xa6, 0xbb, 0xbc, 0x95, 0xc9, 0x9c, 0xcc, 0xcd, 0x9e, +0xcf, 0xca, 0xae, 0x0f, 0xc6, 0x5e, 0xb2, 0x0b, 0xbf, 0xc0, 0x9d, 0xd8, 0xd0, 0xdb, 0xdd, 0x58, +0x96, 0x9b, 0x98, 0x03, 0xe2, 0xe3, 0x0a, 0xd9, 0xda, 0x03, 0xdc, 0xa3, 0x01, 0x06, 0x4b, 0xa7, +0x5a, 0xe2, 0x0a, 0x11, 0xef, 0xab, 0x6b, 0xe7, 0x49, 0x02, 0x3c, 0x78, 0xc0, 0xe4, 0xd4, 0x02, +0x76, 0xc0, 0xf6, 0x45, 0x70, 0x90, 0x6d, 0x0d, 0x2c, 0x81, 0x04, 0xd5, 0xad, 0xd3, 0x17, 0xa1, +0x22, 0x3c, 0x80, 0x51, 0x04, 0x6a, 0x79, 0x80, 0xe9, 0x40, 0xbb, 0x8a, 0x20, 0x17, 0x3e, 0xc3, +0x98, 0x51, 0x0b, 0x04, 0x08, 0x1d, 0x59, 0x17, 0x10, 0x40, 0x45, 0x20, 0x24, 0x3f, 0x07, 0x24, +0xd1, 0x9d, 0x84, 0xc0, 0x8e, 0xc0, 0x81, 0x03, 0x35, 0x5b, 0x2a, 0x94, 0x20, 0x21, 0x26, 0xba, +0x03, 0x34, 0x5d, 0x85, 0x0a, 0xd9, 0xa0, 0xa8, 0xcf, 0x28, 0x06, 0x80, 0x42, 0xb8, 0xb9, 0x0b, +0x13, 0xd1, 0xa2, 0x7c, 0x60, 0x95, 0x48, 0x8a, 0x53, 0x4b, 0x55, 0x2d, 0x81, 0xec, 0x05, 0x30, +0x2a, 0xb5, 0x44, 0x80, 0x9b, 0x60, 0xc1, 0x32, 0x60, 0x50, 0xd4, 0xc0, 0x11, 0x44, 0x5d, 0x63, +0x8d, 0x5d, 0xcb, 0xb6, 0x68, 0xd9, 0xb4, 0x27, 0x06, 0xc9, 0x6d, 0x92, 0x15, 0x90, 0x8b, 0x10, +0x00, 0x21, 0xf9, 0x04, 0x09, 0x12, 0x00, 0x1f, 0x00, 0x2c, 0x28, 0x00, 0x00, 0x00, 0x4a, 0x00, +0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, +0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, 0x78, 0xae, 0xef, 0x7c, 0xef, 0xff, 0xc0, 0xa0, 0x70, +0xd8, 0x0a, 0x04, 0x48, 0x47, 0x62, 0x2f, 0x20, 0x48, 0x7e, 0x98, 0x4e, 0x25, 0x2e, 0x40, 0x20, +0x34, 0x9f, 0x82, 0x6a, 0x54, 0x5a, 0xa3, 0x5a, 0x8f, 0x4c, 0x2d, 0x77, 0x5a, 0xbd, 0x86, 0x09, +0xdb, 0xb1, 0xcc, 0x6b, 0xce, 0xa2, 0xd5, 0x37, 0x2f, 0x58, 0x0c, 0xb7, 0x51, 0x0b, 0xe0, 0xc2, +0xbb, 0xde, 0x25, 0xe0, 0x9f, 0x7a, 0x69, 0x7c, 0x2f, 0x01, 0x05, 0x07, 0x60, 0x07, 0x7f, 0x83, +0x33, 0x46, 0x8d, 0x01, 0x08, 0x46, 0x8b, 0x31, 0x06, 0x06, 0x0f, 0x96, 0x97, 0x96, 0x68, 0x82, +0x92, 0x26, 0x06, 0x09, 0x09, 0x96, 0x09, 0x03, 0x02, 0x0b, 0x96, 0x02, 0x0f, 0x7b, 0x9c, 0x28, +0x9e, 0xa7, 0x0f, 0x0b, 0xaf, 0xaf, 0xa6, 0x02, 0x59, 0x9b, 0x9c, 0xac, 0xa4, 0x0b, 0x09, 0xb9, +0xa0, 0x97, 0xb3, 0xb4, 0xaa, 0x25, 0xb7, 0xa7, 0xb0, 0xb1, 0xbd, 0xb3, 0xa9, 0xc0, 0x9e, 0x09, +0x02, 0xa3, 0xb8, 0xba, 0xa5, 0x97, 0x0e, 0xb3, 0x03, 0x03, 0xb5, 0x75, 0x9e, 0x0f, 0xa4, 0xa4, +0x9e, 0xa3, 0xd0, 0xc6, 0xd4, 0xd6, 0x70, 0xd8, 0xae, 0x4d, 0x06, 0x01, 0xdd, 0xde, 0xd9, 0x0f, +0xe0, 0xc0, 0x4f, 0x18, 0x97, 0x0b, 0x01, 0x96, 0xd5, 0xb8, 0x98, 0xa7, 0xcc, 0xd5, 0xc0, 0xf2, +0xf0, 0xfb, 0xe0, 0xc5, 0xa6, 0xd9, 0x06, 0x3c, 0x08, 0xc7, 0x65, 0x9f, 0xa5, 0x78, 0xeb, 0x04, +0x06, 0xf8, 0xd7, 0xeb, 0x01, 0x06, 0x82, 0x52, 0x02, 0x60, 0x78, 0xe7, 0x2a, 0x1e, 0x35, 0x08, +0x07, 0x18, 0x9a, 0x9a, 0x08, 0x51, 0x49, 0x80, 0x03, 0x14, 0x17, 0x1c, 0x18, 0x29, 0x32, 0x23, +0xa6, 0x4b, 0x1c, 0x4c, 0x3b, 0x12, 0xf9, 0x38, 0x71, 0x60, 0x86, 0x91, 0x30, 0x1d, 0x1a, 0x41, +0x89, 0xe1, 0x50, 0xbb, 0x0f, 0x06, 0x40, 0x06, 0xc8, 0x90, 0xe1, 0x23, 0x4c, 0x90, 0x3c, 0x25, +0x4e, 0xb4, 0x79, 0x33, 0x27, 0x84, 0x9d, 0x3d, 0xab, 0x54, 0x39, 0x14, 0xb4, 0x26, 0xd1, 0x9b, +0x4f, 0x8e, 0x8e, 0xf4, 0x09, 0x13, 0xe9, 0xc7, 0x48, 0x50, 0x47, 0x18, 0x09, 0xea, 0x68, 0x6b, +0x4f, 0x95, 0x83, 0xac, 0x96, 0x10, 0x9b, 0xf5, 0x04, 0xd6, 0xb1, 0x60, 0xcb, 0xce, 0x08, 0x01, +0x00, 0x21, 0xf9, 0x04, 0x09, 0x0c, 0x00, 0x1f, 0x00, 0x2c, 0x28, 0x00, 0x00, 0x00, 0x4a, 0x00, +0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, +0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, 0x78, 0xae, 0xef, 0x7c, 0xef, 0xff, 0xc0, 0xa0, 0x70, +0x58, 0x0a, 0x88, 0x8c, 0x44, 0x60, 0x40, 0x10, 0x08, 0x0c, 0x90, 0x49, 0xde, 0x92, 0x40, 0x70, +0x3e, 0xa3, 0x52, 0x01, 0xd5, 0x0a, 0xc5, 0xe2, 0xa6, 0xd5, 0xc1, 0xd5, 0x9b, 0x03, 0x3b, 0xbb, +0x64, 0x5b, 0x60, 0x2b, 0x46, 0x06, 0x0c, 0xf0, 0x78, 0x1a, 0x16, 0x28, 0x84, 0xdd, 0x06, 0x44, +0x62, 0xbf, 0x87, 0xcf, 0x5b, 0x75, 0x77, 0x1f, 0x01, 0x0a, 0x0a, 0x0b, 0x02, 0x03, 0x09, 0x0b, +0x0b, 0x7d, 0x7f, 0x2b, 0x01, 0x07, 0x05, 0x67, 0x84, 0x85, 0x8b, 0x96, 0x87, 0x02, 0x09, 0x06, +0x8e, 0x28, 0x4d, 0x08, 0x04, 0x07, 0x4d, 0x94, 0x85, 0x7b, 0x8c, 0x8b, 0x02, 0x99, 0x9b, 0x9c, +0x24, 0x6b, 0x54, 0xae, 0x04, 0x85, 0xb1, 0x97, 0x98, 0xa8, 0x9a, 0xab, 0x23, 0xad, 0xaf, 0xa3, +0x95, 0xa6, 0x98, 0x03, 0x99, 0xb6, 0xab, 0x56, 0x03, 0xae, 0xa8, 0xb1, 0xbc, 0xbd, 0x02, 0x98, +0xc1, 0x9c, 0xc3, 0xc4, 0xa8, 0x02, 0xc7, 0xb3, 0x98, 0xcb, 0xaa, 0xcd, 0x62, 0x62, 0x04, 0xd0, +0xd2, 0xb3, 0x03, 0xa7, 0x89, 0xd6, 0x8e, 0xce, 0xbf, 0x02, 0x0e, 0xdc, 0x96, 0x62, 0xdf, 0x6f, +0x68, 0x69, 0x01, 0x0f, 0xd8, 0xe4, 0xe6, 0xb2, 0x97, 0xde, 0xa7, 0x4e, 0x0f, 0x0f, 0xec, 0x5e, +0xee, 0xf0, 0xa8, 0xf2, 0xc8, 0x8b, 0xea, 0x1d, 0x12, 0x83, 0x4f, 0x1f, 0x16, 0x7e, 0x62, 0xa0, +0xfd, 0x8b, 0x10, 0x61, 0xda, 0x81, 0x45, 0xef, 0x06, 0xe4, 0x13, 0x66, 0x45, 0xa1, 0x82, 0x08, +0x17, 0x09, 0x58, 0xd2, 0xf8, 0x70, 0x01, 0x04, 0x08, 0x6d, 0x6e, 0x0d, 0x4a, 0x58, 0xce, 0x01, +0xc3, 0x8c, 0x1a, 0x69, 0x07, 0x1c, 0x38, 0x90, 0xf2, 0x23, 0x84, 0x70, 0xc2, 0x14, 0x32, 0x9c, +0x19, 0xe1, 0x15, 0x01, 0x78, 0x10, 0x0e, 0xc0, 0x6c, 0x56, 0x92, 0xe6, 0xcc, 0x80, 0xd8, 0x56, +0x7e, 0xd4, 0x29, 0x12, 0x97, 0x39, 0x9f, 0x70, 0xe0, 0x1d, 0x08, 0x4a, 0xb4, 0x28, 0x2e, 0x09, +0x12, 0x68, 0x36, 0x60, 0xc0, 0x20, 0x14, 0xa4, 0x95, 0x90, 0x0c, 0x0a, 0x6b, 0xc0, 0x55, 0x54, +0x13, 0x06, 0x01, 0xa8, 0x5a, 0x3d, 0xc0, 0x60, 0xe7, 0x2d, 0x48, 0x5d, 0x03, 0x44, 0x50, 0xd5, +0x04, 0xeb, 0xd5, 0x26, 0x4e, 0x71, 0x75, 0xfd, 0x60, 0x40, 0x81, 0x1b, 0xbb, 0x57, 0x43, 0xc5, +0x65, 0x05, 0x97, 0x2e, 0x14, 0xb8, 0x5e, 0xf7, 0x0a, 0x1e, 0xfc, 0x21, 0x04, 0x00, 0x21, 0xf9, +0x04, 0x09, 0x2e, 0x00, 0x1f, 0x00, 0x2c, 0x28, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, +0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, +0xcf, 0x74, 0x6d, 0xdf, 0x78, 0xae, 0xef, 0x7c, 0xef, 0xbf, 0x06, 0xc3, 0x6f, 0x88, 0x32, 0x2c, +0x08, 0x42, 0xa2, 0xf2, 0x63, 0x3c, 0x26, 0x03, 0xd0, 0x65, 0xaf, 0x89, 0xfc, 0x04, 0x0e, 0x93, +0x49, 0x40, 0xba, 0x33, 0x0e, 0x08, 0x5b, 0x6c, 0x56, 0xcb, 0xcd, 0x79, 0xc1, 0xd7, 0x2c, 0x85, +0x5c, 0xbe, 0x19, 0x06, 0x5f, 0x70, 0x65, 0x42, 0x59, 0x6f, 0xdb, 0xee, 0x78, 0xa0, 0x62, 0xb1, +0x50, 0x2c, 0x77, 0x78, 0x35, 0x06, 0x04, 0x04, 0x10, 0x7b, 0x13, 0x7d, 0x6c, 0x82, 0x34, 0x84, +0x86, 0x88, 0x74, 0x8b, 0x8c, 0x32, 0x84, 0x10, 0x87, 0x05, 0x73, 0x14, 0x15, 0x81, 0x4c, 0x41, +0x9e, 0x93, 0x2a, 0x06, 0x96, 0x97, 0x98, 0x13, 0x9b, 0x9d, 0x06, 0x08, 0x09, 0xab, 0xab, 0x41, +0xa0, 0x26, 0x06, 0x0c, 0x0b, 0x96, 0x57, 0x05, 0x98, 0x05, 0x01, 0x06, 0x0a, 0xbb, 0x0a, 0x02, +0x03, 0x0b, 0xc0, 0xad, 0xaf, 0x24, 0xb1, 0xbb, 0xb8, 0x08, 0x03, 0xb6, 0x02, 0x02, 0x0e, 0xbc, +0xbb, 0xc0, 0xc0, 0xcb, 0x09, 0x49, 0xaf, 0xb1, 0x0d, 0x0d, 0xbd, 0xcb, 0x70, 0x70, 0xcc, 0xce, +0x0a, 0xd0, 0xd1, 0x02, 0xd3, 0xc3, 0xd6, 0xd7, 0xbe, 0xdb, 0xdb, 0xcd, 0xde, 0xd0, 0xcb, 0xd2, +0xd4, 0x82, 0x01, 0x0c, 0xd7, 0x0d, 0xda, 0x50, 0x01, 0xe9, 0xde, 0xcf, 0x0b, 0xda, 0xe2, 0xe3, +0x8c, 0xf1, 0x0e, 0xcc, 0x0d, 0x08, 0xa0, 0x00, 0x0a, 0xbe, 0x7c, 0xec, 0xf6, 0x89, 0x7b, 0xd7, +0x26, 0x80, 0x83, 0x87, 0x0e, 0x7c, 0xd9, 0xbb, 0x07, 0x47, 0x1d, 0xc2, 0x65, 0x0a, 0xfd, 0xc1, +0x83, 0x18, 0x71, 0xa0, 0x41, 0x6e, 0x16, 0xd7, 0xfd, 0xda, 0x47, 0x60, 0x80, 0xc6, 0x86, 0x1c, +0xb7, 0xd1, 0xa1, 0xeb, 0x16, 0x21, 0x1f, 0x9c, 0x68, 0x25, 0x07, 0x18, 0xe0, 0xc4, 0xc5, 0x61, +0xc0, 0x6b, 0x2a, 0x07, 0x30, 0x73, 0x10, 0xa1, 0xa5, 0xb7, 0x91, 0x24, 0xe1, 0xbc, 0xa1, 0xb9, +0x24, 0xc0, 0xb5, 0x09, 0x3e, 0x57, 0x3e, 0xec, 0xe9, 0x33, 0xe9, 0x48, 0x02, 0x02, 0x62, 0x0e, +0x15, 0x64, 0xe0, 0x82, 0xd5, 0x96, 0xe7, 0x76, 0x32, 0xdd, 0xba, 0x6b, 0xe4, 0x81, 0x42, 0x07, +0x06, 0x40, 0x98, 0x8a, 0xc7, 0x40, 0x84, 0x0a, 0x3d, 0x15, 0x70, 0x6c, 0xb6, 0x95, 0xa9, 0x82, +0x2f, 0x0b, 0xbe, 0x16, 0x82, 0x33, 0x96, 0x28, 0x97, 0x99, 0x41, 0x18, 0x1c, 0x88, 0x20, 0x81, +0x6b, 0x4b, 0xb7, 0x03, 0x0e, 0xc8, 0x45, 0x57, 0x77, 0x18, 0x13, 0xc1, 0x12, 0xfa, 0x36, 0xe5, +0x9a, 0x53, 0xf0, 0x01, 0x86, 0xa0, 0x0c, 0x5c, 0x3b, 0x50, 0xa1, 0x41, 0xdb, 0x9e, 0x0d, 0x54, +0x3a, 0x16, 0x0c, 0x99, 0x91, 0xe4, 0x06, 0x82, 0xe7, 0x35, 0xf0, 0x14, 0x04, 0xdd, 0x66, 0xce, +0x86, 0x99, 0x5c, 0x2b, 0x20, 0x7a, 0xb4, 0xea, 0x06, 0x0c, 0xf4, 0x9e, 0x16, 0x6c, 0xd7, 0x73, +0x90, 0xd6, 0x42, 0x3e, 0x5f, 0x8b, 0xcd, 0xbb, 0x77, 0xe7, 0xc8, 0xa4, 0x93, 0x04, 0x9f, 0x39, +0x71, 0x62, 0xea, 0xe3, 0xc8, 0x5d, 0x84, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x0c, 0x00, 0x1f, +0x00, 0x2c, 0x28, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, +0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0x93, 0x86, +0x71, 0xef, 0xbb, 0xb1, 0x10, 0x3a, 0x9e, 0x30, 0xe6, 0xfb, 0x05, 0x03, 0xc8, 0xa1, 0x32, 0x55, +0x04, 0x7e, 0x02, 0x87, 0xc9, 0x24, 0xb0, 0xac, 0xe2, 0x16, 0x03, 0x02, 0x35, 0x2a, 0x9d, 0x5a, +0xad, 0xbe, 0x2c, 0x92, 0x4b, 0xf1, 0x7e, 0x97, 0x86, 0x41, 0x56, 0x5b, 0x99, 0x50, 0xca, 0xd4, +0x33, 0x7a, 0x1d, 0xa8, 0x58, 0x2c, 0x14, 0x4b, 0x5c, 0x3e, 0x34, 0x10, 0x08, 0x10, 0x75, 0x13, +0x77, 0x66, 0x7c, 0x42, 0x7e, 0x80, 0x82, 0x6e, 0x85, 0x86, 0x3d, 0x80, 0x81, 0x05, 0x6d, 0x14, +0x15, 0x7b, 0x8d, 0x37, 0x06, 0x10, 0x99, 0x01, 0x05, 0x91, 0x13, 0x94, 0x96, 0x3d, 0x0c, 0x0b, +0x9a, 0x07, 0x9c, 0x15, 0x05, 0x01, 0x41, 0x1f, 0x39, 0xac, 0xaa, 0xa0, 0x2a, 0x06, 0x0c, 0x0a, +0x0a, 0xa8, 0x08, 0x03, 0x9c, 0x02, 0x02, 0x0e, 0xac, 0x08, 0x09, 0xbe, 0xbe, 0x39, 0xaf, 0x4c, +0x0c, 0x0d, 0x0d, 0x0a, 0xb9, 0x02, 0x6a, 0x6a, 0xba, 0xb3, 0xb3, 0xc9, 0x0b, 0xd0, 0xc0, 0xc2, +0x27, 0xb1, 0xc5, 0x0d, 0xc9, 0xca, 0xca, 0x0e, 0xcd, 0xb3, 0xd0, 0xd0, 0xb9, 0x09, 0xae, 0xd3, +0x01, 0xc4, 0xc5, 0xb9, 0x03, 0x48, 0x01, 0xda, 0xdc, 0x0a, 0xde, 0xdf, 0x02, 0xe1, 0xd3, 0x23, +0xe4, 0x0e, 0xe6, 0xe8, 0x0a, 0x48, 0xeb, 0xec, 0xde, 0xc8, 0xf0, 0xe2, 0xa0, 0x01, 0x1c, 0x08, +0x74, 0x90, 0x2c, 0x9d, 0x3a, 0x35, 0xdb, 0xd8, 0xb5, 0x5b, 0x70, 0x0e, 0x5e, 0xbc, 0x71, 0x03, +0x09, 0xa2, 0xcb, 0xb7, 0x2c, 0xe1, 0xbe, 0x6f, 0x0c, 0xfd, 0xc9, 0x0b, 0x38, 0x30, 0x5b, 0x36, +0x66, 0x0a, 0xdb, 0xe5, 0xca, 0xf8, 0x50, 0x18, 0x47, 0x6b, 0x1e, 0xc9, 0x07, 0xe8, 0xb2, 0xb8, +0x6f, 0xc0, 0x37, 0x02, 0x03, 0x4a, 0x02, 0x2c, 0x36, 0x21, 0xc2, 0xac, 0x8f, 0x02, 0x6d, 0xda, +0x64, 0xa7, 0xe6, 0xa5, 0x1a, 0x03, 0x95, 0x2c, 0x19, 0xb8, 0x40, 0xd4, 0x26, 0xb6, 0x95, 0x11, +0x92, 0xee, 0xe4, 0xe6, 0xd2, 0xe7, 0x80, 0x34, 0x41, 0x0d, 0x19, 0x88, 0x50, 0x21, 0xa9, 0x82, +0x88, 0xdb, 0x94, 0xee, 0xdc, 0xd9, 0xf3, 0x87, 0x00, 0x98, 0x4f, 0xd1, 0x4d, 0x03, 0x9a, 0x83, +0xc1, 0x81, 0x08, 0x12, 0xb4, 0x2a, 0xd0, 0xca, 0x15, 0xda, 0x81, 0x3f, 0x07, 0x06, 0x40, 0x80, +0x2a, 0x6f, 0x84, 0x81, 0x03, 0x07, 0x24, 0xa4, 0xdd, 0xaa, 0x36, 0xcb, 0x82, 0xb7, 0x7f, 0xd4, +0xcc, 0x0d, 0x54, 0x57, 0x84, 0x81, 0x62, 0x07, 0x2a, 0x34, 0x50, 0xab, 0x54, 0xc1, 0x00, 0xbc, +0x81, 0x95, 0xcd, 0x8d, 0xfa, 0xea, 0x70, 0x03, 0xbc, 0xd6, 0x1a, 0x4c, 0x4d, 0x1a, 0xc0, 0x66, +0xca, 0xc7, 0x07, 0xfe, 0x8d, 0x6b, 0x50, 0x20, 0xb3, 0x66, 0x83, 0xe9, 0xb2, 0xc5, 0x05, 0x2d, +0x5a, 0xd8, 0xe1, 0x00, 0x99, 0x45, 0xe7, 0xc3, 0x9b, 0xad, 0xb5, 0xc9, 0x06, 0xb0, 0x35, 0xb7, +0x4e, 0x47, 0x1b, 0xef, 0x01, 0xca, 0x1b, 0x9f, 0x50, 0x06, 0x4a, 0xce, 0xac, 0x6f, 0xdf, 0xc0, +0x0b, 0x9f, 0xc8, 0x5d, 0x8c, 0x81, 0xf3, 0xe7, 0x49, 0x94, 0xbf, 0x68, 0x45, 0x3c, 0x9d, 0xf4, +0xeb, 0xd8, 0x69, 0x84, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x0e, 0x00, 0x1f, 0x00, 0x2c, 0x28, +0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, +0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0xfc, 0x1a, 0x86, 0x6c, 0xdf, 0xae, 0xb1, 0x10, 0x35, +0xee, 0xff, 0x22, 0xdd, 0xae, 0x17, 0x28, 0x02, 0x8f, 0xb3, 0xc5, 0xf0, 0x13, 0x38, 0x4c, 0x26, +0x01, 0xa4, 0x54, 0xa5, 0x1b, 0x10, 0xa2, 0xce, 0x27, 0x74, 0xca, 0x2d, 0x55, 0xaf, 0xcd, 0x27, +0x65, 0xdb, 0x2d, 0x1b, 0x06, 0xd6, 0x6b, 0x65, 0x42, 0x19, 0x47, 0xcb, 0xe6, 0x74, 0xa0, 0x62, +0xb1, 0x50, 0x2c, 0x6f, 0x54, 0x91, 0x06, 0x8f, 0x19, 0x08, 0x04, 0x10, 0x73, 0x13, 0x75, 0x64, +0x24, 0x34, 0x34, 0x09, 0x8a, 0x09, 0x3d, 0x7d, 0x2d, 0x7f, 0x81, 0x83, 0x6c, 0x86, 0x1f, 0x06, +0x08, 0x8b, 0x8b, 0x02, 0x02, 0x8c, 0x8e, 0x8f, 0x81, 0x82, 0x05, 0x6b, 0x14, 0x15, 0x79, 0x01, +0x0a, 0x0a, 0x02, 0x03, 0x4a, 0x0b, 0x09, 0x0b, 0x9a, 0x9c, 0x9d, 0x54, 0x10, 0xb3, 0x01, 0x05, +0xa1, 0x13, 0xa4, 0x22, 0xa6, 0xa7, 0x0a, 0xab, 0x4a, 0x9a, 0xaf, 0x8d, 0xb1, 0x5e, 0x0c, 0x0b, +0xb4, 0x07, 0xb6, 0x15, 0x05, 0x01, 0x06, 0xbb, 0xbc, 0xbe, 0x09, 0x9a, 0x03, 0x9b, 0xb0, 0xc3, +0x87, 0x0c, 0xa7, 0xcb, 0x08, 0x03, 0xb6, 0x9a, 0x0e, 0xbc, 0xe0, 0xab, 0xad, 0x02, 0xae, 0x9b, +0xc2, 0xd6, 0x06, 0x0c, 0x0d, 0x0d, 0xa8, 0xd2, 0x68, 0xd3, 0xdf, 0xe0, 0xcf, 0x4a, 0xd1, 0xe5, +0xd5, 0xd6, 0x95, 0xea, 0xeb, 0xa9, 0xef, 0xef, 0xf1, 0xf2, 0xbd, 0xe8, 0xfd, 0x22, 0x30, 0xe0, +0x5e, 0xac, 0x00, 0xfa, 0x1a, 0xb8, 0xeb, 0x37, 0xe0, 0x1f, 0x40, 0x25, 0xaa, 0x5c, 0x11, 0x1c, +0xd0, 0x0c, 0x1f, 0x42, 0x07, 0xfb, 0xd0, 0x14, 0xe9, 0xe7, 0x50, 0x9e, 0x2f, 0x89, 0x68, 0xce, +0xe4, 0xe9, 0x14, 0xc0, 0x81, 0x49, 0x07, 0xa9, 0xd6, 0x36, 0x72, 0x3c, 0x15, 0x01, 0x60, 0xc4, +0x1d, 0x02, 0x26, 0x8a, 0xb4, 0x56, 0xf2, 0x64, 0x4a, 0x86, 0x02, 0xe2, 0xb5, 0x94, 0x17, 0xf1, +0x00, 0xa0, 0x03, 0x03, 0x20, 0xcc, 0x1c, 0x56, 0xd3, 0x24, 0xc3, 0x77, 0x39, 0x59, 0x2a, 0x55, +0x80, 0x86, 0x80, 0x4f, 0x40, 0x68, 0x84, 0x8e, 0x24, 0x69, 0x72, 0x5d, 0x83, 0xa3, 0x39, 0x75, +0x46, 0xd8, 0x7a, 0x4a, 0x15, 0xa0, 0x89, 0x51, 0x2b, 0xd2, 0x5c, 0x37, 0x61, 0x67, 0xbf, 0xac, +0x3b, 0xb7, 0x72, 0xb5, 0xb2, 0xa3, 0xdf, 0x81, 0x03, 0xe7, 0x86, 0x19, 0xb8, 0x40, 0xb7, 0x25, +0x3f, 0xb4, 0x5c, 0x15, 0xa8, 0x65, 0xfa, 0x16, 0x0d, 0xd0, 0x01, 0x6f, 0xe3, 0xc6, 0x32, 0x10, +0xa1, 0x02, 0xd7, 0x93, 0x26, 0xf5, 0x72, 0xdd, 0x1a, 0xa0, 0xa5, 0xc6, 0xbe, 0x7e, 0xa7, 0xe2, +0x6b, 0x46, 0x83, 0xc1, 0x81, 0x08, 0x12, 0xd4, 0xb6, 0x6c, 0x59, 0xa4, 0xb3, 0xe7, 0xb7, 0xa0, +0x25, 0xe3, 0x1b, 0x61, 0xe0, 0xad, 0x84, 0xcc, 0x69, 0x45, 0x37, 0x29, 0xf2, 0xd6, 0xc8, 0xe8, +0x13, 0x06, 0xd6, 0x1d, 0xa8, 0xd0, 0x40, 0xad, 0x68, 0x5d, 0xad, 0x0f, 0xb8, 0x7e, 0x7d, 0x48, +0xf6, 0x01, 0xab, 0x0d, 0x04, 0x93, 0x58, 0xad, 0xfb, 0x36, 0xba, 0x75, 0x05, 0x80, 0x07, 0x6f, +0x51, 0x64, 0x9d, 0x71, 0xb9, 0x34, 0x94, 0x0b, 0x3f, 0x11, 0xc0, 0x39, 0x6f, 0x13, 0x88, 0x10, +0xc5, 0xd8, 0x7d, 0xbd, 0xbb, 0xf7, 0xef, 0xe0, 0xc3, 0x8b, 0x1f, 0x4f, 0xde, 0x7b, 0x08, 0x00, +0x21, 0xf9, 0x04, 0x09, 0x0e, 0x00, 0x1f, 0x00, 0x2c, 0x28, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, +0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, +0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, 0x78, 0xae, 0xef, 0x7c, 0x7f, 0x1b, 0x06, 0x9f, 0x50, 0x65, +0x58, 0x10, 0x82, 0xc3, 0xe4, 0xa8, 0x68, 0x44, 0x06, 0x9e, 0x4a, 0x1f, 0xf3, 0xf8, 0x09, 0x1c, +0x26, 0x93, 0x40, 0x94, 0x57, 0x1c, 0x10, 0xb4, 0x57, 0x6c, 0x76, 0xab, 0xeb, 0x7e, 0xad, 0x58, +0xca, 0x98, 0x8c, 0x33, 0x0c, 0xbc, 0xdf, 0xca, 0x84, 0xa2, 0xd6, 0xa6, 0x9e, 0x01, 0x20, 0x9b, +0x08, 0x0f, 0x54, 0x2c, 0x16, 0x14, 0x16, 0x76, 0x25, 0x40, 0x06, 0x09, 0x88, 0x88, 0x48, 0x7b, +0x26, 0x06, 0x04, 0x04, 0x10, 0x7e, 0x13, 0x80, 0x6b, 0x4b, 0x08, 0x89, 0x89, 0x02, 0x02, 0x09, +0x8b, 0x8c, 0x4b, 0x8f, 0x91, 0x72, 0x73, 0x95, 0x55, 0x0a, 0x0a, 0x02, 0x03, 0x0b, 0xaa, 0x09, +0x0b, 0x9a, 0x9c, 0x9e, 0x24, 0x8e, 0x10, 0x91, 0x05, 0x72, 0x14, 0x15, 0x76, 0x4f, 0xa6, 0xa6, +0xaa, 0xbd, 0x9a, 0xae, 0x9d, 0x8c, 0x06, 0xb3, 0xb4, 0xb5, 0x13, 0xb8, 0xa5, 0xbb, 0xbc, 0xbd, +0x09, 0x9a, 0x03, 0x9b, 0xaf, 0x9e, 0x06, 0x0c, 0x0b, 0xb3, 0x56, 0x05, 0xb5, 0x05, 0x79, 0xca, +0xca, 0xcc, 0xad, 0xad, 0x9b, 0xc1, 0x64, 0xd3, 0xa6, 0xda, 0x08, 0x03, 0xd8, 0x9a, 0x0e, 0xdc, +0xdd, 0xab, 0x02, 0xe0, 0xd1, 0x7b, 0xd3, 0x0d, 0x0d, 0xa7, 0xce, 0x6f, 0xcf, 0xeb, 0xec, 0xcb, +0x0b, 0xac, 0xad, 0x04, 0x03, 0xe2, 0x8d, 0x63, 0x40, 0xaf, 0x01, 0x2a, 0x7c, 0xf8, 0xf4, 0xed, +0x53, 0xa0, 0x2a, 0xd5, 0xbf, 0x37, 0x41, 0x08, 0x29, 0x09, 0x40, 0x90, 0x9e, 0x33, 0x3c, 0x09, +0x17, 0xf2, 0x53, 0x25, 0x00, 0xe0, 0x00, 0x03, 0x01, 0x1e, 0x48, 0x1c, 0x42, 0xd1, 0x81, 0xc5, +0x01, 0x01, 0xdf, 0x14, 0x3c, 0xc9, 0xa8, 0xd1, 0xa1, 0x91, 0x8e, 0x10, 0x07, 0x88, 0xdc, 0x12, +0xc0, 0x81, 0x4d, 0x07, 0xa8, 0xf0, 0x04, 0x60, 0x19, 0x61, 0x9f, 0xc3, 0x03, 0x8f, 0x0e, 0x0c, +0x80, 0xe0, 0x26, 0x12, 0xcd, 0x9b, 0x38, 0x51, 0xae, 0x7c, 0x23, 0x40, 0x5f, 0x4f, 0x53, 0x4f, +0xdf, 0x10, 0x00, 0xfa, 0xe8, 0x0d, 0x51, 0xa3, 0x47, 0x6f, 0x22, 0x44, 0xd8, 0x14, 0xaa, 0x82, +0x08, 0x60, 0x4d, 0xa5, 0x7a, 0xe4, 0xd1, 0x2a, 0x48, 0x36, 0x35, 0x4d, 0xd2, 0xdb, 0x9a, 0xcf, +0xe9, 0xd7, 0xb0, 0x5e, 0x8c, 0x20, 0x3c, 0x70, 0x40, 0xdc, 0x44, 0x7a, 0x13, 0xa2, 0xe2, 0x6b, +0xea, 0xe0, 0x69, 0x84, 0x04, 0x60, 0x13, 0xec, 0xa4, 0xfb, 0x46, 0xe8, 0x00, 0xba, 0x76, 0x95, +0x18, 0xb8, 0xc0, 0xb8, 0xe7, 0x41, 0xbe, 0x60, 0x7b, 0x0a, 0xd6, 0xb9, 0x13, 0x02, 0xe1, 0xc2, +0x23, 0xc7, 0x45, 0xa8, 0x10, 0x16, 0xe9, 0xba, 0xc8, 0x2a, 0x4d, 0xe0, 0xa1, 0x4b, 0x3a, 0xf3, +0xb8, 0x3c, 0xd3, 0x0e, 0x44, 0x90, 0x10, 0xb9, 0x67, 0x04, 0xd3, 0x22, 0x46, 0x1f, 0xc0, 0x0a, +0x6b, 0x09, 0x5d, 0x09, 0xac, 0x9f, 0xc2, 0x8e, 0x4d, 0xd7, 0x0a, 0xed, 0xda, 0x1f, 0x0c, 0xd0, +0x3b, 0x50, 0xa1, 0x01, 0xd8, 0xdd, 0x23, 0xac, 0xf8, 0x46, 0xbe, 0x45, 0x78, 0x03, 0xba, 0x05, +0x99, 0x27, 0x0f, 0x40, 0x4f, 0x7a, 0x12, 0xe7, 0x05, 0x0a, 0x36, 0xb0, 0x9e, 0xbc, 0x3a, 0xf0, +0xe0, 0x40, 0xb4, 0x37, 0x48, 0x7c, 0x87, 0xbb, 0x62, 0x43, 0x7a, 0xbe, 0xab, 0x5f, 0xcf, 0xbe, +0x45, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x2e, 0x00, 0x1f, 0x00, 0x2c, 0x28, 0x00, 0x00, 0x00, +0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, +0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, 0x78, 0xae, 0xef, 0x7c, 0xef, 0xff, 0x40, +0x83, 0x01, 0x48, 0x34, 0x19, 0x16, 0x84, 0x61, 0xb1, 0x78, 0x44, 0x2a, 0x03, 0xd0, 0x65, 0xaf, +0x99, 0xfc, 0x04, 0x0e, 0x93, 0x49, 0x40, 0xba, 0x3b, 0x0e, 0x08, 0x5b, 0x6c, 0x56, 0xcb, 0xcd, +0x79, 0xc1, 0xd7, 0x2c, 0x85, 0x5c, 0xbe, 0x19, 0x06, 0x5f, 0x70, 0x65, 0x42, 0x59, 0x6f, 0xdb, +0xee, 0x78, 0xa0, 0x62, 0xb1, 0x50, 0x2c, 0x77, 0x78, 0x35, 0x06, 0x04, 0x04, 0x10, 0x7b, 0x13, +0x7d, 0x6c, 0x82, 0x34, 0x84, 0x86, 0x88, 0x74, 0x8b, 0x8c, 0x32, 0x84, 0x10, 0x87, 0x05, 0x73, +0x14, 0x15, 0x81, 0x1f, 0x42, 0x9e, 0x4a, 0x93, 0x28, 0x06, 0x96, 0x97, 0x98, 0x13, 0x9b, 0x9d, +0x42, 0x08, 0x09, 0xac, 0xac, 0x42, 0xa1, 0x46, 0x0c, 0x0b, 0x96, 0x57, 0x05, 0x98, 0x05, 0x01, +0x06, 0x0a, 0xbb, 0x0a, 0x02, 0x03, 0x0b, 0xc0, 0xae, 0xb0, 0x24, 0x06, 0x0c, 0xbb, 0xb8, 0x08, +0x03, 0xb6, 0x02, 0x02, 0x0e, 0xbc, 0xbb, 0xc0, 0xc0, 0xcc, 0x09, 0xa0, 0xa1, 0xc5, 0x0d, 0x0d, +0xbd, 0xcc, 0x70, 0x70, 0xcd, 0xcf, 0x0a, 0xd1, 0xd2, 0x02, 0xd4, 0xc3, 0xd7, 0xd8, 0xbe, 0xdc, +0xdc, 0xce, 0xdf, 0xd1, 0xcc, 0xd3, 0xd5, 0x78, 0x01, 0x0c, 0xd8, 0x0d, 0xdb, 0x50, 0x01, 0xea, +0xdf, 0xd0, 0x0b, 0xdb, 0xe3, 0xe4, 0x8c, 0xf2, 0x1c, 0x9c, 0x1b, 0x10, 0x40, 0x01, 0x94, 0x7c, +0xfa, 0xda, 0xf1, 0x1b, 0x07, 0xaf, 0x4c, 0x00, 0x07, 0x10, 0x1d, 0xf8, 0xba, 0x87, 0x0f, 0xce, +0xba, 0x84, 0xcc, 0x16, 0xfe, 0x13, 0xf4, 0x30, 0xe2, 0xc4, 0x83, 0xdd, 0x2e, 0xb2, 0xfb, 0xc5, +0x8f, 0xc0, 0x80, 0x8d, 0x6d, 0xb9, 0x3a, 0x42, 0x4c, 0x97, 0xce, 0x5b, 0x04, 0x7d, 0x70, 0xa4, +0x99, 0x1c, 0x60, 0x80, 0x13, 0x97, 0x8e, 0xf4, 0x58, 0x0e, 0x68, 0xe6, 0x20, 0xc2, 0xcb, 0x6f, +0x24, 0x4b, 0xc2, 0x31, 0xf0, 0xc0, 0xe6, 0x92, 0x00, 0xd8, 0x26, 0xfc, 0x6c, 0x09, 0xd1, 0xe7, +0xcf, 0xa5, 0x24, 0x09, 0x08, 0x98, 0x49, 0xd4, 0xe8, 0x12, 0x03, 0x17, 0xb2, 0xbe, 0x44, 0xc7, +0xd3, 0xa9, 0xd7, 0x5d, 0x24, 0x0f, 0x14, 0x3a, 0x30, 0x00, 0x42, 0x55, 0x41, 0x06, 0x22, 0x54, +0xf0, 0xa9, 0x20, 0x22, 0x44, 0x05, 0x5e, 0x9d, 0x2a, 0xf8, 0xb2, 0x40, 0x6c, 0x21, 0x38, 0x66, +0xad, 0x4a, 0xa9, 0x29, 0x84, 0xc1, 0x81, 0x08, 0x12, 0xbe, 0xbe, 0x94, 0x3b, 0xe0, 0x80, 0xdd, +0x74, 0x66, 0x87, 0x89, 0x30, 0x60, 0x58, 0x42, 0xe0, 0xa7, 0x5f, 0x75, 0x1a, 0x3e, 0xd0, 0x70, +0x92, 0x01, 0x6c, 0x07, 0x2a, 0x34, 0x88, 0xeb, 0xb3, 0x01, 0xcb, 0xc9, 0x86, 0x2b, 0xa3, 0xc5, +0x7c, 0x80, 0x5e, 0x83, 0x4f, 0x6f, 0xb8, 0x81, 0x0e, 0xad, 0xb8, 0x13, 0xb6, 0x02, 0xa6, 0x4f, +0xbb, 0x6e, 0xc0, 0xc0, 0xef, 0x6a, 0xc3, 0x7a, 0xd1, 0x0a, 0x89, 0x3d, 0xe4, 0x32, 0xbd, 0xda, +0xc0, 0x83, 0x8b, 0xb6, 0x8c, 0x7a, 0x31, 0x6a, 0x8a, 0xc8, 0x5b, 0x2b, 0x87, 0x11, 0x02, 0x00, +0x21, 0xf9, 0x04, 0x09, 0x0c, 0x00, 0x1f, 0x00, 0x2c, 0x0d, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, +0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, +0x70, 0x2c, 0xcf, 0x74, 0x6d, 0x93, 0x86, 0x71, 0xef, 0xbb, 0xb1, 0x10, 0x3a, 0x9e, 0x30, 0xe6, +0xfb, 0x05, 0x03, 0xc8, 0xa1, 0x32, 0x55, 0x04, 0x7e, 0x02, 0x87, 0xc9, 0x24, 0xb0, 0xac, 0xe2, +0x16, 0x03, 0x02, 0x35, 0x2a, 0x9d, 0x5a, 0xad, 0xbe, 0x2c, 0x92, 0x4b, 0xf1, 0x7e, 0x97, 0x86, +0x41, 0x56, 0x5b, 0x99, 0x50, 0xca, 0xd4, 0x33, 0x7a, 0x1d, 0xa8, 0x58, 0x2c, 0x14, 0x4b, 0x5c, +0x3e, 0x34, 0x10, 0x08, 0x10, 0x75, 0x13, 0x77, 0x66, 0x7c, 0x42, 0x7e, 0x80, 0x82, 0x6e, 0x85, +0x86, 0x3d, 0x80, 0x81, 0x05, 0x6d, 0x14, 0x15, 0x7b, 0x8d, 0x37, 0x06, 0x10, 0x99, 0x01, 0x05, +0x91, 0x13, 0x94, 0x96, 0x3d, 0x0c, 0x0b, 0x9a, 0x07, 0x9c, 0x15, 0x05, 0x01, 0x41, 0x1f, 0x39, +0xac, 0xaa, 0xa0, 0x2a, 0x06, 0x0c, 0x0a, 0x0a, 0xa8, 0x08, 0x03, 0x9c, 0x02, 0x02, 0x0e, 0xac, +0x08, 0x09, 0xbe, 0xbe, 0x39, 0xaf, 0x4c, 0x0c, 0x0d, 0x0d, 0x0a, 0xb9, 0x02, 0x6a, 0x6a, 0xba, +0xb3, 0xb3, 0xc9, 0x0b, 0xd0, 0xc0, 0xc2, 0x27, 0xb1, 0xc5, 0x0d, 0xc9, 0xca, 0xca, 0x0e, 0xcd, +0xb3, 0xd0, 0xd0, 0xb9, 0x09, 0xae, 0xd3, 0x01, 0xc4, 0xc5, 0xb9, 0x03, 0x48, 0x01, 0xda, 0xdc, +0x0a, 0xde, 0xdf, 0x02, 0xe1, 0xd3, 0x23, 0xe4, 0x0e, 0xe6, 0xe8, 0x0a, 0x48, 0xeb, 0xec, 0xde, +0xc8, 0xf0, 0xe2, 0xa0, 0x01, 0x1c, 0x08, 0x74, 0x90, 0x2c, 0x9d, 0x3a, 0x35, 0xdb, 0xd8, 0xb5, +0x5b, 0x70, 0x0e, 0x5e, 0xbc, 0x71, 0x03, 0x09, 0xa2, 0xcb, 0xb7, 0x2c, 0xe1, 0xbe, 0x6f, 0x0c, +0xfd, 0xc9, 0x0b, 0x38, 0x30, 0x5b, 0x36, 0x66, 0x0a, 0xdb, 0xe5, 0xca, 0xf8, 0x50, 0x18, 0x47, +0x6b, 0x1e, 0xc9, 0x07, 0xe8, 0xb2, 0xb8, 0x6f, 0xc0, 0x37, 0x02, 0x03, 0x4a, 0x02, 0x2c, 0x36, +0x21, 0xc2, 0xac, 0x8f, 0x02, 0x6d, 0xda, 0x64, 0xa7, 0xe6, 0xa5, 0x1a, 0x03, 0x95, 0x2c, 0x19, +0xb8, 0x40, 0xd4, 0x26, 0xb6, 0x95, 0x11, 0x92, 0xee, 0xe4, 0xe6, 0xd2, 0xe7, 0x80, 0x34, 0x41, +0x0d, 0x19, 0x88, 0x50, 0x21, 0xa9, 0x82, 0x88, 0xdb, 0x94, 0xee, 0xdc, 0xd9, 0xf3, 0x87, 0x00, +0x98, 0x4f, 0xd1, 0x4d, 0x03, 0x9a, 0x83, 0xc1, 0x81, 0x08, 0x12, 0xb4, 0x2a, 0xd0, 0xca, 0x15, +0xda, 0x81, 0x3f, 0x07, 0x06, 0x40, 0x80, 0x2a, 0x6f, 0x84, 0x81, 0x03, 0x07, 0x24, 0xa4, 0xdd, +0xaa, 0x36, 0xcb, 0x82, 0xb7, 0x7f, 0xd4, 0xcc, 0x0d, 0x54, 0x57, 0x84, 0x81, 0x62, 0x07, 0x2a, +0x34, 0x50, 0xab, 0x54, 0xc1, 0x00, 0xbc, 0x81, 0x95, 0xcd, 0x8d, 0xfa, 0xea, 0x70, 0x03, 0xbc, +0xd6, 0x1a, 0x4c, 0x4d, 0x1a, 0xc0, 0x66, 0xca, 0xc7, 0x07, 0xfe, 0x8d, 0x6b, 0x50, 0x20, 0xb3, +0x66, 0x83, 0xe9, 0xb2, 0xc5, 0x05, 0x2d, 0x5a, 0xd8, 0xe1, 0x00, 0x99, 0x45, 0xe7, 0xc3, 0x9b, +0xad, 0xb5, 0xc9, 0x06, 0xb0, 0x35, 0xb7, 0x4e, 0x47, 0x1b, 0xef, 0x01, 0xca, 0x1b, 0x9f, 0x50, +0x06, 0x4a, 0xce, 0xac, 0x6f, 0xdf, 0xc0, 0x0b, 0x9f, 0xc8, 0x5d, 0x8c, 0x81, 0xf3, 0xe7, 0x49, +0x94, 0xbf, 0x68, 0x45, 0x3c, 0x9d, 0xf4, 0xeb, 0xd8, 0x69, 0x84, 0x00, 0x00, 0x21, 0xf9, 0x04, +0x09, 0x0e, 0x00, 0x1f, 0x00, 0x2c, 0x0b, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, +0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0xfc, 0x1a, +0x86, 0x6c, 0xdf, 0xae, 0xb1, 0x10, 0x35, 0xee, 0xff, 0x22, 0xdd, 0xae, 0x17, 0x28, 0x02, 0x8f, +0xb3, 0xc5, 0xf0, 0x13, 0x38, 0x4c, 0x26, 0x01, 0xa4, 0x54, 0xa5, 0x1b, 0x10, 0xa2, 0xce, 0x27, +0x74, 0xca, 0x2d, 0x55, 0xaf, 0xcd, 0x27, 0x65, 0xdb, 0x2d, 0x1b, 0x06, 0xd6, 0x6b, 0x65, 0x42, +0x19, 0x47, 0xcb, 0xe6, 0x74, 0xa0, 0x62, 0xb1, 0x50, 0x2c, 0x6f, 0x54, 0x91, 0x06, 0x8f, 0x19, +0x08, 0x04, 0x10, 0x73, 0x13, 0x75, 0x64, 0x24, 0x34, 0x34, 0x09, 0x8a, 0x09, 0x3d, 0x7d, 0x2d, +0x7f, 0x81, 0x83, 0x6c, 0x86, 0x1f, 0x06, 0x08, 0x8b, 0x8b, 0x02, 0x02, 0x8c, 0x8e, 0x8f, 0x81, +0x82, 0x05, 0x6b, 0x14, 0x15, 0x79, 0x01, 0x0a, 0x0a, 0x02, 0x03, 0x4a, 0x0b, 0x09, 0x0b, 0x9a, +0x9c, 0x9d, 0x54, 0x10, 0xb3, 0x01, 0x05, 0xa1, 0x13, 0xa4, 0x22, 0xa6, 0xa7, 0x0a, 0xab, 0x4a, +0x9a, 0xaf, 0x8d, 0xb1, 0x5e, 0x0c, 0x0b, 0xb4, 0x07, 0xb6, 0x15, 0x05, 0x01, 0x06, 0xbb, 0xbc, +0xbe, 0x09, 0x9a, 0x03, 0x9b, 0xb0, 0xc3, 0x87, 0x0c, 0xa7, 0xcb, 0x08, 0x03, 0xb6, 0x9a, 0x0e, +0xbc, 0xe0, 0xab, 0xad, 0x02, 0xae, 0x9b, 0xc2, 0xd6, 0x06, 0x0c, 0x0d, 0x0d, 0xa8, 0xd2, 0x68, +0xd3, 0xdf, 0xe0, 0xcf, 0x4a, 0xd1, 0xe5, 0xd5, 0xd6, 0x95, 0xea, 0xeb, 0xa9, 0xef, 0xef, 0xf1, +0xf2, 0xbd, 0xe8, 0xfd, 0x22, 0x30, 0xe0, 0x5e, 0xac, 0x00, 0xfa, 0x1a, 0xb8, 0xeb, 0x37, 0xe0, +0x1f, 0x40, 0x25, 0xaa, 0x5c, 0x11, 0x1c, 0xd0, 0x0c, 0x1f, 0x42, 0x07, 0xfb, 0xd0, 0x14, 0xe9, +0xe7, 0x50, 0x9e, 0x2f, 0x89, 0x68, 0xce, 0xe4, 0xe9, 0x14, 0xc0, 0x81, 0x49, 0x07, 0xa9, 0xd6, +0x36, 0x72, 0x3c, 0x15, 0x01, 0x60, 0xc4, 0x1d, 0x02, 0x26, 0x8a, 0xb4, 0x56, 0xf2, 0x64, 0x4a, +0x86, 0x02, 0xe2, 0xb5, 0x94, 0x17, 0xf1, 0x00, 0xa0, 0x03, 0x03, 0x20, 0xcc, 0x1c, 0x56, 0xd3, +0x24, 0xc3, 0x77, 0x39, 0x59, 0x2a, 0x55, 0x80, 0x86, 0x80, 0x4f, 0x40, 0x68, 0x84, 0x8e, 0x24, +0x69, 0x72, 0x5d, 0x83, 0xa3, 0x39, 0x75, 0x46, 0xd8, 0x7a, 0x4a, 0x15, 0xa0, 0x89, 0x51, 0x2b, +0xd2, 0x5c, 0x37, 0x61, 0x67, 0xbf, 0xac, 0x3b, 0xb7, 0x72, 0xb5, 0xb2, 0xa3, 0xdf, 0x81, 0x03, +0xe7, 0x86, 0x19, 0xb8, 0x40, 0xb7, 0x25, 0x3f, 0xb4, 0x5c, 0x15, 0xa8, 0x65, 0xfa, 0x16, 0x0d, +0xd0, 0x01, 0x6f, 0xe3, 0xc6, 0x32, 0x10, 0xa1, 0x02, 0xd7, 0x93, 0x26, 0xf5, 0x72, 0xdd, 0x1a, +0xa0, 0xa5, 0xc6, 0xbe, 0x7e, 0xa7, 0xe2, 0x6b, 0x46, 0x83, 0xc1, 0x81, 0x08, 0x12, 0xd4, 0xb6, +0x6c, 0x59, 0xa4, 0xb3, 0xe7, 0xb7, 0xa0, 0x25, 0xe3, 0x1b, 0x61, 0xe0, 0xad, 0x84, 0xcc, 0x69, +0x45, 0x37, 0x29, 0xf2, 0xd6, 0xc8, 0xe8, 0x13, 0x06, 0xd6, 0x1d, 0xa8, 0xd0, 0x40, 0xad, 0x68, +0x5d, 0xad, 0x0f, 0xb8, 0x7e, 0x7d, 0x48, 0xf6, 0x01, 0xab, 0x0d, 0x04, 0x93, 0x58, 0xad, 0xfb, +0x36, 0xba, 0x75, 0x05, 0x80, 0x07, 0x6f, 0x51, 0x64, 0x9d, 0x71, 0xb9, 0x34, 0x94, 0x0b, 0x3f, +0x11, 0xc0, 0x39, 0x6f, 0x13, 0x88, 0x10, 0xc5, 0xd8, 0x7d, 0xbd, 0xbb, 0xf7, 0xef, 0xe0, 0xc3, +0x8b, 0x1f, 0x4f, 0xde, 0x7b, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x0e, 0x00, 0x1f, 0x00, 0x2c, +0x09, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, +0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, 0x78, 0xae, 0xef, +0x7c, 0x7f, 0x1b, 0x06, 0x9f, 0x50, 0x65, 0x58, 0x10, 0x82, 0xc3, 0xe4, 0xa8, 0x68, 0x44, 0x06, +0x9e, 0x4a, 0x1f, 0xf3, 0xf8, 0x09, 0x1c, 0x26, 0x93, 0x40, 0x94, 0x57, 0x1c, 0x10, 0xb4, 0x57, +0x6c, 0x76, 0xab, 0xeb, 0x7e, 0xad, 0x58, 0xca, 0x98, 0x8c, 0x33, 0x0c, 0xbc, 0xdf, 0xca, 0x84, +0xa2, 0xd6, 0xa6, 0x9e, 0x01, 0x20, 0x9b, 0x08, 0x0f, 0x54, 0x2c, 0x16, 0x14, 0x16, 0x76, 0x25, +0x40, 0x06, 0x09, 0x88, 0x88, 0x48, 0x7b, 0x26, 0x06, 0x04, 0x04, 0x10, 0x7e, 0x13, 0x80, 0x6b, +0x4b, 0x08, 0x89, 0x89, 0x02, 0x02, 0x09, 0x8b, 0x8c, 0x4b, 0x8f, 0x91, 0x72, 0x73, 0x95, 0x55, +0x0a, 0x0a, 0x02, 0x03, 0x0b, 0xaa, 0x09, 0x0b, 0x9a, 0x9c, 0x9e, 0x24, 0x8e, 0x10, 0x91, 0x05, +0x72, 0x14, 0x15, 0x76, 0x4f, 0xa6, 0xa6, 0xaa, 0xbd, 0x9a, 0xae, 0x9d, 0x8c, 0x06, 0xb3, 0xb4, +0xb5, 0x13, 0xb8, 0xa5, 0xbb, 0xbc, 0xbd, 0x09, 0x9a, 0x03, 0x9b, 0xaf, 0x9e, 0x06, 0x0c, 0x0b, +0xb3, 0x56, 0x05, 0xb5, 0x05, 0x79, 0xca, 0xca, 0xcc, 0xad, 0xad, 0x9b, 0xc1, 0x64, 0xd3, 0xa6, +0xda, 0x08, 0x03, 0xd8, 0x9a, 0x0e, 0xdc, 0xdd, 0xab, 0x02, 0xe0, 0xd1, 0x7b, 0xd3, 0x0d, 0x0d, +0xa7, 0xce, 0x6f, 0xcf, 0xeb, 0xec, 0xcb, 0x0b, 0xac, 0xad, 0x04, 0x03, 0xe2, 0x8d, 0x63, 0x40, +0xaf, 0x01, 0x2a, 0x7c, 0xf8, 0xf4, 0xed, 0x53, 0xa0, 0x2a, 0xd5, 0xbf, 0x37, 0x41, 0x08, 0x29, +0x09, 0x40, 0x90, 0x9e, 0x33, 0x3c, 0x09, 0x17, 0xf2, 0x53, 0x25, 0x00, 0xe0, 0x00, 0x03, 0x01, +0x1e, 0x48, 0x1c, 0x42, 0xd1, 0x81, 0xc5, 0x01, 0x01, 0xdf, 0x14, 0x3c, 0xc9, 0xa8, 0xd1, 0xa1, +0x91, 0x8e, 0x10, 0x07, 0x88, 0xdc, 0x12, 0xc0, 0x81, 0x4d, 0x07, 0xa8, 0xf0, 0x04, 0x60, 0x19, +0x61, 0x9f, 0xc3, 0x03, 0x8f, 0x0e, 0x0c, 0x80, 0xe0, 0x26, 0x12, 0xcd, 0x9b, 0x38, 0x51, 0xae, +0x7c, 0x23, 0x40, 0x5f, 0x4f, 0x53, 0x4f, 0xdf, 0x10, 0x00, 0xfa, 0xe8, 0x0d, 0x51, 0xa3, 0x47, +0x6f, 0x22, 0x44, 0xd8, 0x14, 0xaa, 0x82, 0x08, 0x60, 0x4d, 0xa5, 0x7a, 0xe4, 0xd1, 0x2a, 0x48, +0x36, 0x35, 0x4d, 0xd2, 0xdb, 0x9a, 0xcf, 0xe9, 0xd7, 0xb0, 0x5e, 0x8c, 0x20, 0x3c, 0x70, 0x40, +0xdc, 0x44, 0x7a, 0x13, 0xa2, 0xe2, 0x6b, 0xea, 0xe0, 0x69, 0x84, 0x04, 0x60, 0x13, 0xec, 0xa4, +0xfb, 0x46, 0xe8, 0x00, 0xba, 0x76, 0x95, 0x18, 0xb8, 0xc0, 0xb8, 0xe7, 0x41, 0xbe, 0x60, 0x7b, +0x0a, 0xd6, 0xb9, 0x13, 0x02, 0xe1, 0xc2, 0x23, 0xc7, 0x45, 0xa8, 0x10, 0x16, 0xe9, 0xba, 0xc8, +0x2a, 0x4d, 0xe0, 0xa1, 0x4b, 0x3a, 0xf3, 0xb8, 0x3c, 0xd3, 0x0e, 0x44, 0x90, 0x10, 0xb9, 0x67, +0x04, 0xd3, 0x22, 0x46, 0x1f, 0xc0, 0x0a, 0x6b, 0x09, 0x5d, 0x09, 0xac, 0x9f, 0xc2, 0x8e, 0x4d, +0xd7, 0x0a, 0xed, 0xda, 0x1f, 0x0c, 0xd0, 0x3b, 0x50, 0xa1, 0x01, 0xd8, 0xdd, 0x23, 0xac, 0xf8, +0x46, 0xbe, 0x45, 0x78, 0x03, 0xba, 0x05, 0x99, 0x27, 0x0f, 0x40, 0x4f, 0x7a, 0x12, 0xe7, 0x05, +0x0a, 0x36, 0xb0, 0x9e, 0xbc, 0x3a, 0xf0, 0xe0, 0x40, 0xb4, 0x37, 0x48, 0x7c, 0x87, 0xbb, 0x62, +0x43, 0x7a, 0xbe, 0xab, 0x5f, 0xcf, 0xbe, 0x45, 0x08, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x2e, 0x00, +0x1f, 0x00, 0x2c, 0x07, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, +0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, +0x78, 0xae, 0xef, 0x7c, 0xef, 0xff, 0x40, 0x83, 0x01, 0x48, 0x34, 0x19, 0x16, 0x84, 0x61, 0xb1, +0x78, 0x44, 0x2a, 0x03, 0xd0, 0x65, 0xaf, 0x99, 0xfc, 0x04, 0x0e, 0x93, 0x49, 0x40, 0xba, 0x3b, +0x0e, 0x08, 0x5b, 0x6c, 0x56, 0xcb, 0xcd, 0x79, 0xc1, 0xd7, 0x2c, 0x85, 0x5c, 0xbe, 0x19, 0x06, +0x5f, 0x70, 0x65, 0x42, 0x59, 0x6f, 0xdb, 0xee, 0x78, 0xa0, 0x62, 0xb1, 0x50, 0x2c, 0x77, 0x78, +0x35, 0x06, 0x04, 0x04, 0x10, 0x7b, 0x13, 0x7d, 0x6c, 0x82, 0x34, 0x84, 0x86, 0x88, 0x74, 0x8b, +0x8c, 0x32, 0x84, 0x10, 0x87, 0x05, 0x73, 0x14, 0x15, 0x81, 0x1f, 0x42, 0x9e, 0x4a, 0x93, 0x28, +0x06, 0x96, 0x97, 0x98, 0x13, 0x9b, 0x9d, 0x42, 0x08, 0x09, 0xac, 0xac, 0x42, 0xa1, 0x46, 0x0c, +0x0b, 0x96, 0x57, 0x05, 0x98, 0x05, 0x01, 0x06, 0x0a, 0xbb, 0x0a, 0x02, 0x03, 0x0b, 0xc0, 0xae, +0xb0, 0x24, 0x06, 0x0c, 0xbb, 0xb8, 0x08, 0x03, 0xb6, 0x02, 0x02, 0x0e, 0xbc, 0xbb, 0xc0, 0xc0, +0xcc, 0x09, 0xa0, 0xa1, 0xc5, 0x0d, 0x0d, 0xbd, 0xcc, 0x70, 0x70, 0xcd, 0xcf, 0x0a, 0xd1, 0xd2, +0x02, 0xd4, 0xc3, 0xd7, 0xd8, 0xbe, 0xdc, 0xdc, 0xce, 0xdf, 0xd1, 0xcc, 0xd3, 0xd5, 0x78, 0x01, +0x0c, 0xd8, 0x0d, 0xdb, 0x50, 0x01, 0xea, 0xdf, 0xd0, 0x0b, 0xdb, 0xe3, 0xe4, 0x8c, 0xf2, 0x1c, +0x9c, 0x1b, 0x10, 0x40, 0x01, 0x94, 0x7c, 0xfa, 0xda, 0xf1, 0x1b, 0x07, 0xaf, 0x4c, 0x00, 0x07, +0x10, 0x1d, 0xf8, 0xba, 0x87, 0x0f, 0xce, 0xba, 0x84, 0xcc, 0x16, 0xfe, 0x13, 0xf4, 0x30, 0xe2, +0xc4, 0x83, 0xdd, 0x2e, 0xb2, 0xfb, 0xc5, 0x8f, 0xc0, 0x80, 0x8d, 0x6d, 0xb9, 0x3a, 0x42, 0x4c, +0x97, 0xce, 0x5b, 0x04, 0x7d, 0x70, 0xa4, 0x99, 0x1c, 0x60, 0x80, 0x13, 0x97, 0x8e, 0xf4, 0x58, +0x0e, 0x68, 0xe6, 0x20, 0xc2, 0xcb, 0x6f, 0x24, 0x4b, 0xc2, 0x31, 0xf0, 0xc0, 0xe6, 0x92, 0x00, +0xd8, 0x26, 0xfc, 0x6c, 0x09, 0xd1, 0xe7, 0xcf, 0xa5, 0x24, 0x09, 0x08, 0x98, 0x49, 0xd4, 0xe8, +0x12, 0x03, 0x17, 0xb2, 0xbe, 0x44, 0xc7, 0xd3, 0xa9, 0xd7, 0x5d, 0x24, 0x0f, 0x14, 0x3a, 0x30, +0x00, 0x42, 0x55, 0x41, 0x06, 0x22, 0x54, 0xf0, 0xa9, 0x20, 0x22, 0x44, 0x05, 0x5e, 0x9d, 0x2a, +0xf8, 0xb2, 0x40, 0x6c, 0x21, 0x38, 0x66, 0xad, 0x4a, 0xa9, 0x29, 0x84, 0xc1, 0x81, 0x08, 0x12, +0xbe, 0xbe, 0x94, 0x3b, 0xe0, 0x80, 0xdd, 0x74, 0x66, 0x87, 0x89, 0x30, 0x60, 0x58, 0x42, 0xe0, +0xa7, 0x5f, 0x75, 0x1a, 0x3e, 0xd0, 0x70, 0x92, 0x01, 0x6c, 0x07, 0x2a, 0x34, 0x88, 0xeb, 0xb3, +0x01, 0xcb, 0xc9, 0x86, 0x2b, 0xa3, 0xc5, 0x7c, 0x80, 0x5e, 0x83, 0x4f, 0x6f, 0xb8, 0x81, 0x0e, +0xad, 0xb8, 0x13, 0xb6, 0x02, 0xa6, 0x4f, 0xbb, 0x6e, 0xc0, 0xc0, 0xef, 0x6a, 0xc3, 0x7a, 0xd1, +0x0a, 0x89, 0x3d, 0xe4, 0x32, 0xbd, 0xda, 0xc0, 0x83, 0x8b, 0xb6, 0x8c, 0x7a, 0x31, 0x6a, 0x8a, +0xc8, 0x5b, 0x2b, 0x87, 0x11, 0x02, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x0c, 0x00, 0x1f, 0x00, 0x2c, +0x03, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, 0x8e, 0x64, 0x69, +0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, 0x78, 0x6a, 0x18, +0x79, 0x4f, 0x1b, 0x0b, 0x02, 0xcf, 0x47, 0x6c, 0x01, 0x83, 0xc3, 0x80, 0xb2, 0xc8, 0x2c, 0x1d, +0x85, 0x9f, 0xc0, 0x61, 0x32, 0x09, 0x34, 0xaf, 0xc0, 0x01, 0xc1, 0x3a, 0xa5, 0x56, 0xaf, 0xcc, +0xec, 0x56, 0x4a, 0xa5, 0x7c, 0xc1, 0x44, 0xc3, 0x40, 0xbb, 0xad, 0x4c, 0x28, 0x66, 0x2b, 0x3a, +0xcd, 0x0e, 0x54, 0x2c, 0x16, 0x8a, 0x45, 0x3e, 0xef, 0x19, 0x08, 0x04, 0x10, 0x76, 0x13, 0x78, +0x67, 0x7d, 0x39, 0x7f, 0x81, 0x83, 0x6f, 0x86, 0x87, 0x37, 0x7f, 0x10, 0x82, 0x05, 0x6e, 0x14, +0x15, 0x7c, 0x8e, 0x36, 0x06, 0x91, 0x92, 0x93, 0x13, 0x96, 0x98, 0x8f, 0x0c, 0x0b, 0x91, 0x52, +0x05, 0x93, 0x05, 0x01, 0x06, 0x97, 0xa0, 0x30, 0x06, 0x0c, 0x0a, 0x0a, 0xa8, 0x08, 0x03, 0xa6, +0x02, 0x02, 0x0e, 0x0a, 0xa9, 0x3b, 0x43, 0xac, 0x2b, 0xae, 0x0d, 0x0d, 0x0a, 0xb6, 0x02, 0x6b, +0x6b, 0xb7, 0xb0, 0x09, 0xc9, 0x09, 0x3b, 0xbd, 0x2a, 0xbf, 0xc0, 0xc4, 0xc5, 0xc5, 0xb8, 0x0a, +0x03, 0x0b, 0xd7, 0xc9, 0xbc, 0xcd, 0x24, 0x01, 0x0c, 0xc0, 0x0d, 0xb6, 0x03, 0x4a, 0x01, 0xd3, +0xb0, 0xd7, 0xd7, 0xb6, 0xcb, 0xdb, 0x25, 0xdd, 0x0e, 0xd0, 0xe2, 0xb9, 0xe4, 0x6b, 0xd4, 0xe7, +0xe8, 0x02, 0xea, 0xeb, 0x22, 0x01, 0x0e, 0xfc, 0x0e, 0xc4, 0xe3, 0xf2, 0x06, 0x50, 0x53, 0x70, +0x6e, 0xd8, 0x3d, 0x6d, 0xcd, 0xf6, 0xf5, 0xfb, 0xa7, 0xa4, 0xd8, 0x31, 0x58, 0x04, 0x17, 0x84, +0xbb, 0x87, 0x6f, 0x9b, 0x42, 0x7e, 0xd2, 0xa4, 0x1d, 0x8b, 0x60, 0x0e, 0x9d, 0xc4, 0x83, 0xf9, +0x14, 0x7e, 0xcb, 0x38, 0xe0, 0x96, 0x83, 0x08, 0x1c, 0xbf, 0xcd, 0xd9, 0xfa, 0x98, 0xa0, 0xc1, +0x2a, 0x50, 0x01, 0x80, 0x4d, 0x48, 0xa9, 0x91, 0x1f, 0xca, 0x94, 0x04, 0xad, 0x49, 0x24, 0x30, +0xa0, 0x62, 0x33, 0x03, 0x17, 0x82, 0x72, 0x8c, 0x66, 0xf2, 0x26, 0xce, 0x35, 0xe8, 0x78, 0x0e, +0x50, 0xb5, 0xce, 0x40, 0x84, 0x0a, 0x28, 0x15, 0xf4, 0xe3, 0xa7, 0xc0, 0x28, 0x2c, 0xa4, 0x49, +0xd7, 0x18, 0x78, 0xf0, 0x12, 0x93, 0xaa, 0x1d, 0x0c, 0x0e, 0x44, 0x90, 0x60, 0x95, 0x26, 0x56, +0x02, 0x02, 0x94, 0x6e, 0xed, 0xda, 0xcb, 0xc0, 0x81, 0x03, 0x12, 0xc8, 0xa6, 0x8c, 0x8a, 0xf5, +0x00, 0xa0, 0x03, 0x03, 0x20, 0xac, 0xcd, 0x37, 0xc2, 0x00, 0xb0, 0x03, 0x15, 0x1a, 0x18, 0x8d, +0xb0, 0x86, 0xc0, 0x02, 0xbb, 0x80, 0xd6, 0xe8, 0x65, 0xdb, 0x2b, 0xe6, 0x81, 0x98, 0xc0, 0x74, +0x15, 0x7b, 0x9b, 0xb8, 0x98, 0x5e, 0xbe, 0x23, 0x62, 0xe6, 0xfa, 0x36, 0x4e, 0x0d, 0xc9, 0x01, +0x6f, 0x0f, 0x20, 0x0c, 0x19, 0x0c, 0xb2, 0x1c, 0x35, 0x01, 0xd7, 0x84, 0x7e, 0x3b, 0x7a, 0x5d, +0xcc, 0x54, 0xc0, 0x78, 0x8c, 0x23, 0xac, 0x7a, 0xb5, 0x68, 0xcc, 0xdc, 0xac, 0x8c, 0xd3, 0x87, +0xf2, 0x81, 0xed, 0xd0, 0x8c, 0x71, 0x67, 0x06, 0xc6, 0xa0, 0xb8, 0x71, 0xe3, 0xad, 0x85, 0x3b, +0xd9, 0x01, 0xb0, 0xb9, 0xf2, 0xe7, 0x2a, 0x42, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x09, 0x0c, 0x00, +0x1f, 0x00, 0x2c, 0x02, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x28, 0x00, 0x00, 0x05, 0xfe, 0xe0, 0x27, +0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, 0x2c, 0xcf, 0x74, 0x6d, 0xdf, +0x78, 0xae, 0xef, 0xb2, 0x61, 0xf0, 0x40, 0x97, 0x81, 0xb0, 0xf8, 0x05, 0x8f, 0xa3, 0x80, 0x52, +0x34, 0x5c, 0x14, 0x91, 0xc7, 0xc0, 0x64, 0x72, 0x08, 0x7c, 0x9a, 0x4f, 0x28, 0x4f, 0x3a, 0xa5, +0x7e, 0x02, 0x84, 0x41, 0x56, 0xab, 0x93, 0x52, 0xa6, 0x55, 0xb0, 0xd8, 0x48, 0xce, 0x99, 0xcf, +0x15, 0x70, 0x78, 0xc0, 0x6e, 0xdf, 0x02, 0x16, 0x8a, 0xc5, 0x12, 0x27, 0x84, 0xeb, 0x76, 0x31, +0x4a, 0x83, 0x52, 0x7b, 0x13, 0x71, 0x10, 0x7e, 0x80, 0x81, 0x2d, 0x4a, 0x02, 0x8f, 0x8f, 0x66, +0x53, 0x88, 0x8a, 0x8c, 0x30, 0x8e, 0x90, 0x02, 0x0f, 0x01, 0x15, 0x70, 0x05, 0x01, 0x10, 0x89, +0x8b, 0x96, 0x28, 0x06, 0x09, 0x99, 0x8f, 0x0a, 0x9c, 0x87, 0x05, 0x9f, 0xa1, 0x10, 0xa3, 0xa4, +0x25, 0xa6, 0xa8, 0x02, 0x0a, 0x06, 0x01, 0x05, 0x15, 0xad, 0x55, 0xa1, 0x0b, 0x0c, 0xb1, 0xb2, +0x57, 0x09, 0xa7, 0x03, 0xc4, 0xb6, 0x0a, 0x0e, 0x8f, 0xad, 0x03, 0x08, 0xb9, 0x0a, 0x0a, 0xc0, +0xc2, 0xa5, 0xa7, 0x02, 0xc6, 0xa9, 0xc9, 0xd6, 0x03, 0xdb, 0x90, 0x0a, 0x0d, 0x0d, 0xd2, 0xd3, +0x24, 0x01, 0x0d, 0xd5, 0xd7, 0xc8, 0x0e, 0xdb, 0xea, 0xdc, 0xdf, 0xe0, 0xc1, 0x96, 0x6a, 0x04, +0xda, 0xf2, 0xd0, 0xe9, 0xdb, 0x83, 0x03, 0x8f, 0xed, 0x0c, 0x56, 0xe2, 0x22, 0x01, 0xdb, 0xe4, +0xa9, 0x43, 0xa7, 0x4e, 0x89, 0xaa, 0x7c, 0xdf, 0x1c, 0xf0, 0xf3, 0xf7, 0x2f, 0xa0, 0xb6, 0x6d, +0xf5, 0x0a, 0xe2, 0x13, 0xe0, 0xa0, 0xa2, 0x83, 0x7e, 0xfe, 0x00, 0x0e, 0x10, 0xa8, 0xae, 0xde, +0xc3, 0x89, 0x16, 0x2f, 0x32, 0xfc, 0x02, 0x61, 0xc0, 0x81, 0x75, 0x10, 0x9c, 0x95, 0xa1, 0x54, +0x17, 0x12, 0xa3, 0x38, 0x50, 0x2b, 0xb7, 0x45, 0xa8, 0xf8, 0x60, 0x65, 0xbb, 0x8a, 0x2e, 0xa7, +0xc1, 0xdc, 0x38, 0x07, 0xe2, 0xcc, 0x07, 0x0f, 0x07, 0x40, 0x8b, 0x30, 0xe1, 0x5b, 0xce, 0x69, +0x06, 0x0e, 0x1c, 0xf0, 0x33, 0x67, 0x68, 0x84, 0x07, 0x50, 0xb9, 0x29, 0x88, 0x70, 0xa1, 0xea, +0x3b, 0x4b, 0x49, 0x95, 0x32, 0x95, 0x19, 0x21, 0x42, 0xb2, 0x90, 0x53, 0x23, 0x54, 0x88, 0x70, +0x15, 0xab, 0xd2, 0xa5, 0x7e, 0x06, 0x78, 0xed, 0xda, 0x55, 0x42, 0x84, 0x03, 0xc0, 0x70, 0x95, +0x85, 0x17, 0xe0, 0x2c, 0xd3, 0x07, 0x4e, 0x25, 0x48, 0x50, 0x3a, 0x57, 0xe7, 0x59, 0xbb, 0x01, +0xf0, 0x42, 0x1d, 0xdc, 0x57, 0x98, 0x92, 0x34, 0x4a, 0x7c, 0x08, 0x56, 0xf2, 0xa0, 0xc1, 0xd1, +0x91, 0x49, 0x94, 0xf6, 0x0b, 0x80, 0x0b, 0xef, 0x64, 0x6f, 0x8f, 0x21, 0x07, 0x50, 0x95, 0x64, +0x40, 0x60, 0xce, 0x5f, 0x30, 0x43, 0x3e, 0xb1, 0x64, 0xdc, 0x67, 0x8c, 0xe4, 0x32, 0x8f, 0x26, +0x9d, 0xb3, 0xf4, 0xea, 0xd7, 0xb0, 0xed, 0x84, 0x00, 0x00, 0x3b +}; + +#endif +// File_checked_for_headers diff --git a/src/kademlia/Makefile.am b/src/kademlia/Makefile.am new file mode 100644 index 00000000..19bf6298 --- /dev/null +++ b/src/kademlia/Makefile.am @@ -0,0 +1,4 @@ +SUBDIRS = kademlia net routing utils + + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/kademlia/Makefile.in b/src/kademlia/Makefile.in new file mode 100644 index 00000000..ce0f5bec --- /dev/null +++ b/src/kademlia/Makefile.in @@ -0,0 +1,602 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/kademlia +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +SUBDIRS = kademlia net routing utils +MAINTAINERCLEANFILES = Makefile.in +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/kademlia/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/kademlia/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-recursive ctags ctags-recursive \ + distclean distclean-generic distclean-recursive distclean-tags \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/kademlia/kademlia/Defines.h b/src/kademlia/kademlia/Defines.h new file mode 100644 index 00000000..a3dbeceb --- /dev/null +++ b/src/kademlia/kademlia/Defines.h @@ -0,0 +1,78 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#ifndef __KAD_DEFINES_H__ +#define __KAD_DEFINES_H__ + +//////////////////////////////////////// +namespace Kademlia { +//////////////////////////////////////// + +#define SEARCHTOLERANCE 16777216 +const unsigned int K = 10; +#define KBASE 4 +#define KK 5 +#define ALPHA_QUERY 3 +#define LOG_BASE_EXPONENT 5 +#define HELLO_TIMEOUT 20 +#define SEARCH_JUMPSTART 2 +#define SEARCH_LIFETIME 45 +#define SEARCHFILE_LIFETIME 45 +#define SEARCHKEYWORD_LIFETIME 45 +#define SEARCHNOTES_LIFETIME 45 +#define SEARCHNODE_LIFETIME 45 +#define SEARCHNODECOMP_LIFETIME 10 +#define SEARCHSTOREFILE_LIFETIME 140 +#define SEARCHSTOREKEYWORD_LIFETIME 140 +#define SEARCHSTORENOTES_LIFETIME 100 +#define SEARCHFINDBUDDY_LIFETIME 100 +#define SEARCHFINDSOURCE_LIFETIME 45 +#define SEARCHFILE_TOTAL 300 +#define SEARCHKEYWORD_TOTAL 300 +#define SEARCHNOTES_TOTAL 50 +#define SEARCHSTOREFILE_TOTAL 10 +#define SEARCHSTOREKEYWORD_TOTAL 10 +#define SEARCHSTORENOTES_TOTAL 10 +#define SEARCHNODECOMP_TOTAL 10 +#define SEARCHFINDBUDDY_TOTAL 10 +#define SEARCHFINDSOURCE_TOTAL 20 + +} // End namespace + +#endif // __KAD_DEFINES_H__ +// File_checked_for_headers diff --git a/src/kademlia/kademlia/Entry.h b/src/kademlia/kademlia/Entry.h new file mode 100644 index 00000000..a84e5dc2 --- /dev/null +++ b/src/kademlia/kademlia/Entry.h @@ -0,0 +1,110 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#ifndef __KAD_ENTRY_H__ +#define __KAD_ENTRY_H__ + + +#include "../utils/UInt128.h" + +//////////////////////////////////////// +namespace Kademlia { +//////////////////////////////////////// + +class CEntry +{ +public: + CEntry() + { + m_iIP = 0; + m_iTCPport = 0; + m_iUDPport = 0; + m_iSize = 0; + m_tLifeTime = time(NULL); + m_bSource = false; + } + ~CEntry() + { + TagPtrList::const_iterator it; + for (it = m_lTagList.begin(); it != m_lTagList.end(); ++it) { + delete *it; + } + } + + uint32 GetIntTagValue(const wxString& tagname) const + { + TagPtrList::const_iterator it; + CTag* tag; + for (it = m_lTagList.begin(); it != m_lTagList.end(); ++it) { + tag = *it; + if ((tag->GetName() == tagname) && tag->IsInt()) { + return tag->GetInt(); + } + } + return 0; + } + + wxString GetStrTagValue(const wxString& tagname) const + { + TagPtrList::const_iterator it; + CTag* tag; + for (it = m_lTagList.begin(); it != m_lTagList.end(); ++it) { + tag = *it; + if ((tag->GetName() == tagname) && tag->IsStr()) { + return tag->GetStr(); + } + } + return wxEmptyString; + } + + uint32 m_iIP; + uint16 m_iTCPport; + uint16 m_iUDPport; + CUInt128 m_iKeyID; + CUInt128 m_iSourceID; + wxString m_sFileName; // NOTE: this always holds the string in LOWERCASE!!! + uint32 m_iSize; + TagPtrList m_lTagList; + time_t m_tLifeTime; + bool m_bSource; +}; + +} + +#endif // __KAD_ENTRY_H__ +// File_checked_for_headers diff --git a/src/kademlia/kademlia/Error.h b/src/kademlia/kademlia/Error.h new file mode 100644 index 00000000..a55b0748 --- /dev/null +++ b/src/kademlia/kademlia/Error.h @@ -0,0 +1,80 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ +#ifndef __KAD_ERROR_H__ +#define __KAD_ERROR_H__ + + +//////////////////////////////////////// +namespace Kademlia { +//////////////////////////////////////// + +#define ERR_SUCCESS 0x0000 +#define ERR_UNKNOWN 0xFFFF + +#define ERR_WINSOCK 0x0001 +#define ERR_TCP_LISTENER_START_FAILURE 0x0002 +#define ERR_UDP_LISTENER_START_FAILURE 0x0003 + +#define ERR_READ_ONLY 0x0004 +#define ERR_WRITE_ONLY 0x0005 +#define ERR_END_OF_FILE 0x0006 +#define ERR_BUFFER_TOO_SMALL 0x0007 + +#define ERR_CREATE_SOCKET_FAILED 0x0008 +#define ERR_CREATE_THREAD_FAILED 0x0009 +#define ERR_CREATE_HANDLE_FAILED 0x000A +#define ERR_LISTEN_FAILED 0x000B + +#define ERR_QUEUE_FULL 0x000C + +#define ERR_NO_CONTACTS 0x000D + +class CKademliaError +{ +public: + + CKademliaError(int errorCode, const wxString& errorDescription) {m_ErrorCode = errorCode; m_ErrorDescription = errorDescription;} + + int m_ErrorCode; + wxString m_ErrorDescription; // For internationalisation use error code to lookup description +}; + +} // End namespace + +#endif // __KAD_ERROR_H__ +// File_checked_for_headers diff --git a/src/kademlia/kademlia/Indexed.cpp b/src/kademlia/kademlia/Indexed.cpp new file mode 100644 index 00000000..1c1359a9 --- /dev/null +++ b/src/kademlia/kademlia/Indexed.cpp @@ -0,0 +1,1107 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#include "Indexed.h" + + +#include +#include +#include +#include +#include + +#include "../routing/Contact.h" +#include "../net/KademliaUDPListener.h" +#include "../../CFile.h" +#include "../../MemFile.h" +#include "../../amule.h" +#include "../../Preferences.h" +#include "../../Logger.h" + +//////////////////////////////////////// +using namespace Kademlia; +//////////////////////////////////////// + +wxString CIndexed::m_kfilename; +wxString CIndexed::m_sfilename; +wxString CIndexed::m_loadfilename; + +CIndexed::CIndexed() +{ + m_sfilename = theApp->ConfigDir + wxT("src_index.dat"); + m_kfilename = theApp->ConfigDir + wxT("key_index.dat"); + m_loadfilename = theApp->ConfigDir + wxT("load_index.dat"); + m_lastClean = time(NULL) + (60*30); + m_totalIndexSource = 0; + m_totalIndexKeyword = 0; + ReadFile(); +} + + +void CIndexed::ReadFile(void) +{ + try { + uint32 totalLoad = 0; + uint32 totalSource = 0; + uint32 totalKeyword = 0; + uint32 numKeys = 0; + uint32 numSource = 0; + uint32 numName = 0; + uint32 numLoad = 0; + uint32 tagList = 0; + + CFile load_file; + if(CPath::FileExists(m_loadfilename) && load_file.Open(m_loadfilename, CFile::read)) { + uint32 version = load_file.ReadUInt32(); + if(version<2) { + /*time_t savetime =*/ load_file.ReadUInt32(); // Savetime is unused now + + numLoad = load_file.ReadUInt32(); + while(numLoad) { + CUInt128 keyID = load_file.ReadUInt128(); + if(AddLoad(keyID, load_file.ReadUInt32())) { + totalLoad++; + } + numLoad--; + } + } + load_file.Close(); + } + + CFile k_file; + if (CPath::FileExists(m_kfilename) && k_file.Open(m_kfilename, CFile::read)) { + uint32 version = k_file.ReadUInt32(); + if( version < 2 ) { + time_t savetime = k_file.ReadUInt32(); + if( savetime > time(NULL) ) { + CUInt128 id = k_file.ReadUInt128(); + if( !Kademlia::CKademlia::GetPrefs()->GetKadID().CompareTo(id) ) { + numKeys = k_file.ReadUInt32(); + while( numKeys ) { + CUInt128 keyID = k_file.ReadUInt128(); + numSource = k_file.ReadUInt32(); + while( numSource ) { + CUInt128 sourceID = k_file.ReadUInt128(); + numName = k_file.ReadUInt32(); + while( numName ) { + Kademlia::CEntry* toaddN = new Kademlia::CEntry(); + toaddN->m_bSource = false; + uint32 expire = k_file.ReadUInt32(); + toaddN->m_tLifeTime = expire; + tagList = k_file.ReadUInt8(); + while( tagList ) { + CTag* tag = k_file.ReadTag(); + if(tag) { + if (!tag->GetName().Cmp(TAG_FILENAME)) { + toaddN->m_sFileName = tag->GetStr(); + // Make lowercase, the search code expects lower case strings! + toaddN->m_sFileName.MakeLower(); + // NOTE: always add the 'name' tag, even if it's stored separately in 'fileName'. the tag is still needed for answering search request + toaddN->m_lTagList.push_back(tag); + } else if (!tag->GetName().Cmp(TAG_FILESIZE)) { + if (tag->IsBsob() && (tag->GetBsobSize() == 8)) { + // We've previously wrongly saved BSOB uint64s to key_index.dat, + // so we'll have to handle those here as well. Too bad ... + toaddN->m_iSize = PeekUInt64(tag->GetBsob()); + + // Don't save as a BSOB tag again ... + delete tag; + tag = new CTagVarInt(TAG_FILESIZE, toaddN->m_iSize); + } else { + toaddN->m_iSize = tag->GetInt(); + } + + // NOTE: always add the 'size' tag, even if it's stored separately in 'size'. the tag is still needed for answering search request + toaddN->m_lTagList.push_back(tag); + } else if (!tag->GetName().Cmp(TAG_SOURCEIP)) { + toaddN->m_iIP = tag->GetInt(); + toaddN->m_lTagList.push_back(tag); + } else if (!tag->GetName().Cmp(TAG_SOURCEPORT)) { + toaddN->m_iTCPport = tag->GetInt(); + toaddN->m_lTagList.push_back(tag); + } else if (!tag->GetName().Cmp(TAG_SOURCEUPORT)) { + toaddN->m_iUDPport = tag->GetInt(); + toaddN->m_lTagList.push_back(tag); + } else { + toaddN->m_lTagList.push_back(tag); + } + } + tagList--; + } + toaddN->m_iKeyID.SetValue(keyID); + toaddN->m_iSourceID.SetValue(sourceID); + uint8 load = 0; + if(AddKeyword(keyID, sourceID, toaddN, load)) { + totalKeyword++; + } else { + delete toaddN; + } + numName--; + } + numSource--; + } + numKeys--; + } + } + } + } + k_file.Close(); + } + + CFile s_file; + if (CPath::FileExists(m_sfilename) && s_file.Open(m_sfilename, CFile::read)) { + uint32 version = s_file.ReadUInt32(); + if( version < 2 ) { + time_t savetime = s_file.ReadUInt32(); + if( savetime > time(NULL) ) { + numKeys = s_file.ReadUInt32(); + CUInt128 id; + while( numKeys ) { + CUInt128 keyID = s_file.ReadUInt128(); + numSource = s_file.ReadUInt32(); + while( numSource ) { + CUInt128 sourceID = s_file.ReadUInt128(); + numName = s_file.ReadUInt32(); + while( numName ) { + Kademlia::CEntry* toaddN = new Kademlia::CEntry(); + toaddN->m_bSource = true; + uint32 test = s_file.ReadUInt32(); + toaddN->m_tLifeTime = test; + tagList = s_file.ReadUInt8(); + while( tagList ) { + CTag* tag = s_file.ReadTag(); + if(tag) { + if (!tag->GetName().Cmp(TAG_SOURCEIP)) + { + toaddN->m_iIP = tag->GetInt(); + toaddN->m_lTagList.push_back(tag); + } else if (!tag->GetName().Cmp(TAG_SOURCEPORT)) { + toaddN->m_iTCPport = tag->GetInt(); + toaddN->m_lTagList.push_back(tag); + } else if (!tag->GetName().Cmp(TAG_SOURCEUPORT)) { + toaddN->m_iUDPport = tag->GetInt(); + toaddN->m_lTagList.push_back(tag); + } else { + toaddN->m_lTagList.push_back(tag); + } + } + tagList--; + } + toaddN->m_iKeyID.SetValue(keyID); + toaddN->m_iSourceID.SetValue(sourceID); + uint8 load = 0; + if(AddSources(keyID, sourceID, toaddN, load)) { + totalSource++; + } else { + delete toaddN; + } + numName--; + } + numSource--; + } + numKeys--; + } + } + } + s_file.Close(); + + m_totalIndexSource = totalSource; + m_totalIndexKeyword = totalKeyword; + AddDebugLogLineM( false, logKadIndex, wxString::Format(wxT("Read %u source, %u keyword, and %u load entries"),totalSource,totalKeyword,totalLoad)); + } + } catch (const CSafeIOException& err) { + AddDebugLogLineM(true, logKadIndex, wxT("CSafeIOException in CIndexed::readFile: ") + err.what()); + } catch (const CInvalidPacket& err) { + AddDebugLogLineM(true, logKadIndex, wxT("CInvalidPacket Exception in CIndexed::readFile: ") + err.what()); + } catch (const wxString& e) { + AddDebugLogLineM(true, logKadIndex, wxT("Exception in CIndexed::readFile: ") + e); + } +} + +CIndexed::~CIndexed() +{ + try + { + uint32 s_total = 0; + uint32 k_total = 0; + uint32 l_total = 0; + + CFile load_file; + if(load_file.Open(m_loadfilename, CFile::write)) { + uint32 version = 1; + load_file.WriteUInt32(version); + load_file.WriteUInt32(time(NULL)); + load_file.WriteUInt32(m_Load_map.size()); + LoadMap::iterator it = m_Load_map.begin(); + for ( ; it != m_Load_map.end(); ++it ) { + Load* load = it->second; + wxASSERT(load); + if (load) { + load_file.WriteUInt128(load->keyID); + load_file.WriteUInt32(load->time); + l_total++; + delete load; + } + } + load_file.Close(); + } + + CFile s_file; + if (s_file.Open(m_sfilename, CFile::write)) { + + uint32 version = 1; + s_file.WriteUInt32(version); + + s_file.WriteUInt32(time(NULL)+KADEMLIAREPUBLISHTIMES); + + s_file.WriteUInt32(m_Sources_map.size()); + SrcHashMap::iterator itSrcHash = m_Sources_map.begin(); + for ( ; itSrcHash != m_Sources_map.end(); ++itSrcHash ) { + SrcHash* currSrcHash = itSrcHash->second; + s_file.WriteUInt128(currSrcHash->keyID); + + CKadSourcePtrList& KeyHashSrcMap = currSrcHash->m_Source_map; + s_file.WriteUInt32(KeyHashSrcMap.size()); + + CKadSourcePtrList::iterator itSource = KeyHashSrcMap.begin(); + for (; itSource != KeyHashSrcMap.end(); ++itSource) { + Source* currSource = *itSource; + s_file.WriteUInt128(currSource->sourceID); + + CKadEntryPtrList& SrcEntryList = currSource->entryList; + s_file.WriteUInt32(SrcEntryList.size()); + + CKadEntryPtrList::iterator itEntry = SrcEntryList.begin(); + for (; itEntry != SrcEntryList.end(); ++itEntry) { + Kademlia::CEntry* currName = *itEntry; + s_file.WriteUInt32(currName->m_tLifeTime); + s_file.WriteTagPtrList(currName->m_lTagList); + delete currName; + s_total++; + } + delete currSource; + } + delete currSrcHash; + } + s_file.Close(); + } + + CFile k_file; + if (k_file.Open(m_kfilename, CFile::write)) { + + uint32 version = 1; + k_file.WriteUInt32(version); + + k_file.WriteUInt32(time(NULL)+KADEMLIAREPUBLISHTIMEK); + + k_file.WriteUInt128(Kademlia::CKademlia::GetPrefs()->GetKadID()); + + k_file.WriteUInt32(m_Keyword_map.size()); + KeyHashMap::iterator itKeyHash = m_Keyword_map.begin(); + for ( ; itKeyHash != m_Keyword_map.end(); ++itKeyHash ) { + KeyHash* currKeyHash = itKeyHash->second; + k_file.WriteUInt128(currKeyHash->keyID); + + CSourceKeyMap& KeyHashSrcMap = currKeyHash->m_Source_map; + k_file.WriteUInt32(KeyHashSrcMap.size()); + + CSourceKeyMap::iterator itSource = KeyHashSrcMap.begin(); + for ( ; itSource != KeyHashSrcMap.end(); ++itSource ) { + Source* currSource = itSource->second; + k_file.WriteUInt128(currSource->sourceID); + + CKadEntryPtrList& SrcEntryList = currSource->entryList; + k_file.WriteUInt32(SrcEntryList.size()); + + CKadEntryPtrList::iterator itEntry = SrcEntryList.begin(); + for (; itEntry != SrcEntryList.end(); ++itEntry) { + Kademlia::CEntry* currName = *itEntry; + k_file.WriteUInt32(currName->m_tLifeTime); + k_file.WriteTagPtrList(currName->m_lTagList); + delete currName; + k_total++; + } + delete currSource; + } + delete currKeyHash; + } + k_file.Close(); + } + AddDebugLogLineM( false, logKadIndex, wxString::Format(wxT("Wrote %u source, %u keyword, and %u load entries"), s_total, k_total, l_total)); + + SrcHashMap::iterator itNoteHash = m_Notes_map.begin(); + for ( ; itNoteHash != m_Notes_map.end(); ++itNoteHash) { + SrcHash* currNoteHash = itNoteHash->second; + CKadSourcePtrList& KeyHashNoteMap = currNoteHash->m_Source_map; + + CKadSourcePtrList::iterator itNote = KeyHashNoteMap.begin(); + for (; itNote != KeyHashNoteMap.end(); ++itNote) { + Source* currNote = *itNote; + CKadEntryPtrList& NoteEntryList = currNote->entryList; + CKadEntryPtrList::iterator itNoteEntry = NoteEntryList.begin(); + for (; itNoteEntry != NoteEntryList.end(); ++itNoteEntry) { + delete *itNoteEntry; + } + delete currNote; + } + delete currNoteHash; + } + + m_Notes_map.clear(); + } catch (const CSafeIOException& err) { + AddDebugLogLineM(true, logKadIndex, wxT("CSafeIOException in CIndexed::~CIndexed: ") + err.what()); + } catch (const CInvalidPacket& err) { + AddDebugLogLineM(true, logKadIndex, wxT("CInvalidPacket Exception in CIndexed::~CIndexed: ") + err.what()); + } catch (const wxString& e) { + AddDebugLogLineM(true, logKadIndex, wxT("Exception in CIndexed::~CIndexed: ") + e); + } +} + + +void CIndexed::Clean(void) +{ + if( m_lastClean > time(NULL) ) { + return; + } + + uint32 k_Removed = 0; + uint32 s_Removed = 0; + uint32 s_Total = 0; + uint32 k_Total = 0; + time_t tNow = time(NULL); + + KeyHashMap::iterator itKeyHash = m_Keyword_map.begin(); + while (itKeyHash != m_Keyword_map.end()) { + KeyHashMap::iterator curr_itKeyHash = itKeyHash++; // Don't change this to a ++it! + KeyHash* currKeyHash = curr_itKeyHash->second; + + CSourceKeyMap::iterator itSource = currKeyHash->m_Source_map.begin(); + for ( ; itSource != currKeyHash->m_Source_map.end(); ) { + CSourceKeyMap::iterator curr_itSource = itSource++; // Don't change this to a ++it! + Source* currSource = curr_itSource->second; + + CKadEntryPtrList::iterator itEntry = currSource->entryList.begin(); + while (itEntry != currSource->entryList.end()) { + k_Total++; + + Kademlia::CEntry* currName = *itEntry; + if( !currName->m_bSource && currName->m_tLifeTime < tNow) { + k_Removed++; + itEntry = currSource->entryList.erase(itEntry); + delete currName; + } else { + ++itEntry; + } + } + + if( currSource->entryList.empty()) { + currKeyHash->m_Source_map.erase(curr_itSource); + delete currSource; + } + } + + if( currKeyHash->m_Source_map.empty()) { + m_Keyword_map.erase(curr_itKeyHash); + delete currKeyHash; + } + } + + SrcHashMap::iterator itSrcHash = m_Sources_map.begin(); + while (itSrcHash != m_Sources_map.end()) { + SrcHashMap::iterator curr_itSrcHash = itSrcHash++; // Don't change this to a ++it! + SrcHash* currSrcHash = curr_itSrcHash->second; + + CKadSourcePtrList::iterator itSource = currSrcHash->m_Source_map.begin(); + while (itSource != currSrcHash->m_Source_map.end()) { + Source* currSource = *itSource; + + CKadEntryPtrList::iterator itEntry = currSource->entryList.begin(); + while (itEntry != currSource->entryList.end()) { + s_Total++; + + Kademlia::CEntry* currName = *itEntry; + if (currName->m_tLifeTime < tNow) { + s_Removed++; + itEntry = currSource->entryList.erase(itEntry); + delete currName; + } else { + ++itEntry; + } + } + + if( currSource->entryList.empty()) { + itSource = currSrcHash->m_Source_map.erase(itSource); + delete currSource; + } else { + ++itSource; + } + } + + if( currSrcHash->m_Source_map.empty()) { + m_Sources_map.erase(curr_itSrcHash); + delete currSrcHash; + } + } + + m_totalIndexSource = s_Total; + m_totalIndexKeyword = k_Total; + AddDebugLogLineM( false, logKadIndex, wxString::Format(wxT("Removed %u keyword out of %u and %u source out of %u"), k_Removed, k_Total, s_Removed, s_Total)); + m_lastClean = time(NULL) + MIN2S(30); +} + +bool CIndexed::AddKeyword(const CUInt128& keyID, const CUInt128& sourceID, Kademlia::CEntry* entry, uint8& load) +{ + if( !entry ) { + return false; + } + + if( m_totalIndexKeyword > KADEMLIAMAXENTRIES ) { + load = 100; + return false; + } + + if( entry->m_iSize == 0 || entry->m_sFileName.IsEmpty() || entry->m_lTagList.size() == 0 || entry->m_tLifeTime < time(NULL)) { + return false; + } + + KeyHashMap::iterator itKeyHash = m_Keyword_map.find(keyID); + KeyHash* currKeyHash = NULL; + if(itKeyHash == m_Keyword_map.end()) { + Source* currSource = new Source; + currSource->sourceID.SetValue(sourceID); + currSource->entryList.push_front(entry); + currKeyHash = new KeyHash; + currKeyHash->keyID.SetValue(keyID); + currKeyHash->m_Source_map[currSource->sourceID] = currSource; + m_Keyword_map[currKeyHash->keyID] = currKeyHash; + load = 1; + m_totalIndexKeyword++; + return true; + } else { + currKeyHash = itKeyHash->second; + uint32 indexTotal = currKeyHash->m_Source_map.size(); + if ( indexTotal > KADEMLIAMAXINDEX ) { + load = 100; + //Too many entries for this Keyword.. + return false; + } + Source* currSource = NULL; + CSourceKeyMap::iterator itSource = currKeyHash->m_Source_map.find(sourceID); + if(itSource != currKeyHash->m_Source_map.end()) { + currSource = itSource->second; + if (currSource->entryList.size() > 0) { + if( indexTotal > KADEMLIAMAXINDEX - 5000 ) { + load = 100; + //We are in a hot node.. If we continued to update all the publishes + //while this index is full, popular files will be the only thing you index. + return false; + } + delete currSource->entryList.front(); + currSource->entryList.pop_front(); + } else { + m_totalIndexKeyword++; + } + load = (indexTotal*100)/KADEMLIAMAXINDEX; + currSource->entryList.push_front(entry); + return true; + } else { + currSource = new Source; + currSource->sourceID.SetValue(sourceID); + currSource->entryList.push_front(entry); + currKeyHash->m_Source_map[currSource->sourceID] = currSource; + m_totalIndexKeyword++; + load = (indexTotal*100)/KADEMLIAMAXINDEX; + return true; + } + } + + return false; +} + + +bool CIndexed::AddSources(const CUInt128& keyID, const CUInt128& sourceID, Kademlia::CEntry* entry, uint8& load) +{ + if( !entry ) { + return false; + } + if( entry->m_iIP == 0 || entry->m_iTCPport == 0 || entry->m_iUDPport == 0 || entry->m_lTagList.size() == 0 || entry->m_tLifeTime < time(NULL)) { + return false; + } + + SrcHash* currSrcHash = NULL; + SrcHashMap::iterator itSrcHash = m_Sources_map.find(keyID); + if(itSrcHash == m_Sources_map.end()) { + Source* currSource = new Source; + currSource->sourceID.SetValue(sourceID); + currSource->entryList.push_front(entry); + currSrcHash = new SrcHash; + currSrcHash->keyID.SetValue(keyID); + currSrcHash->m_Source_map.push_front(currSource); + m_Sources_map[currSrcHash->keyID] = currSrcHash; + m_totalIndexSource++; + load = 1; + return true; + } else { + currSrcHash = itSrcHash->second; + uint32 size = currSrcHash->m_Source_map.size(); + + CKadSourcePtrList::iterator itSource = currSrcHash->m_Source_map.begin(); + for (; itSource != currSrcHash->m_Source_map.end(); ++itSource) { + Source* currSource = *itSource; + if( currSource->entryList.size() ) { + CEntry* currEntry = currSource->entryList.front(); + wxASSERT(currEntry!=NULL); + if( currEntry->m_iIP == entry->m_iIP && ( currEntry->m_iTCPport == entry->m_iTCPport || currEntry->m_iUDPport == entry->m_iUDPport )) { + CEntry* currName = currSource->entryList.front(); + currSource->entryList.pop_front(); + delete currName; + currSource->entryList.push_front(entry); + load = (size*100)/KADEMLIAMAXSOUCEPERFILE; + return true; + } + } else { + //This should never happen! + currSource->entryList.push_front(entry); + wxASSERT(0); + load = (size*100)/KADEMLIAMAXSOUCEPERFILE; + return true; + } + } + if( size > KADEMLIAMAXSOUCEPERFILE ) { + Source* currSource = currSrcHash->m_Source_map.back(); + currSrcHash->m_Source_map.pop_back(); + wxASSERT(currSource!=NULL); + Kademlia::CEntry* currName = currSource->entryList.back(); + currSource->entryList.pop_back(); + wxASSERT(currName!=NULL); + delete currName; + currSource->sourceID.SetValue(sourceID); + currSource->entryList.push_front(entry); + currSrcHash->m_Source_map.push_front(currSource); + load = 100; + return true; + } else { + Source* currSource = new Source; + currSource->sourceID.SetValue(sourceID); + currSource->entryList.push_front(entry); + currSrcHash->m_Source_map.push_front(currSource); + m_totalIndexSource++; + load = (size*100)/KADEMLIAMAXSOUCEPERFILE; + return true; + } + } + + return false; +} + +bool CIndexed::AddNotes(const CUInt128& keyID, const CUInt128& sourceID, Kademlia::CEntry* entry, uint8& load) +{ + if( !entry ) { + return false; + } + if( entry->m_iIP == 0 || entry->m_lTagList.size() == 0 ) { + return false; + } + + SrcHash* currNoteHash = NULL; + SrcHashMap::iterator itNoteHash = m_Notes_map.find(keyID); + if(itNoteHash == m_Notes_map.end()) { + Source* currNote = new Source; + currNote->sourceID.SetValue(sourceID); + currNote->entryList.push_front(entry); + currNoteHash = new SrcHash; + currNoteHash->keyID.SetValue(keyID); + currNoteHash->m_Source_map.push_front(currNote); + m_Notes_map[currNoteHash->keyID] = currNoteHash; + load = 1; + return true; + } else { + currNoteHash = itNoteHash->second; + uint32 size = currNoteHash->m_Source_map.size(); + + CKadSourcePtrList::iterator itSource = currNoteHash->m_Source_map.begin(); + for (; itSource != currNoteHash->m_Source_map.end(); ++itSource) { + Source* currNote = *itSource; + if( currNote->entryList.size() ) { + CEntry* currEntry = currNote->entryList.front(); + wxASSERT(currEntry!=NULL); + if(currEntry->m_iIP == entry->m_iIP || !currEntry->m_iSourceID.CompareTo(entry->m_iSourceID)) { + CEntry* currName = currNote->entryList.front(); + currNote->entryList.pop_front(); + delete currName; + currNote->entryList.push_front(entry); + load = (size*100)/KADEMLIAMAXNOTESPERFILE; + return true; + } + } else { + //This should never happen! + currNote->entryList.push_front(entry); + wxASSERT(0); + load = (size*100)/KADEMLIAMAXNOTESPERFILE; + return true; + } + } + if( size > KADEMLIAMAXNOTESPERFILE ) { + Source* currNote = currNoteHash->m_Source_map.back(); + currNoteHash->m_Source_map.pop_back(); + wxASSERT(currNote!=NULL); + CEntry* currName = currNote->entryList.back(); + currNote->entryList.pop_back(); + wxASSERT(currName!=NULL); + delete currName; + currNote->sourceID.SetValue(sourceID); + currNote->entryList.push_front(entry); + currNoteHash->m_Source_map.push_front(currNote); + load = 100; + return true; + } else { + Source* currNote = new Source; + currNote->sourceID.SetValue(sourceID); + currNote->entryList.push_front(entry); + currNoteHash->m_Source_map.push_front(currNote); + load = (size*100)/KADEMLIAMAXNOTESPERFILE; + return true; + } + } + + return false; +} + +bool CIndexed::AddLoad(const CUInt128& keyID, uint32 timet) +{ + Load* load = NULL; + + if((uint32)time(NULL)>timet) { + return false; + } + + LoadMap::iterator it = m_Load_map.find(keyID); + if(it != m_Load_map.end()) + { + wxASSERT(0); + return false; + } + + load = new Load(); + load->keyID.SetValue(keyID); + load->time = timet; + m_Load_map[load->keyID] = load; + return true; +} + +bool SearchTermsMatch(const SSearchTerm* pSearchTerm, const Kademlia::CEntry* item/*, CStringArray& astrFileNameTokens*/) +{ + // boolean operators + if (pSearchTerm->type == SSearchTerm::AND) { + return SearchTermsMatch(pSearchTerm->left, item/*, astrFileNameTokens*/) && SearchTermsMatch(pSearchTerm->right, item/*, astrFileNameTokens*/); + } + if (pSearchTerm->type == SSearchTerm::OR) { + return SearchTermsMatch(pSearchTerm->left, item/*, astrFileNameTokens*/) || SearchTermsMatch(pSearchTerm->right, item/*, astrFileNameTokens*/); + } + if (pSearchTerm->type == SSearchTerm::NAND) { + return SearchTermsMatch(pSearchTerm->left, item/*, astrFileNameTokens*/) && !SearchTermsMatch(pSearchTerm->right, item/*, astrFileNameTokens*/); + } + // word which is to be searched in the file name (and in additional meta data as done by some ed2k servers???) + if (pSearchTerm->type == SSearchTerm::String) { + int iStrSearchTerms = pSearchTerm->astr->GetCount(); + if (iStrSearchTerms == 0) { + return false; + } +#if 0 + //TODO: Use a pre-tokenized list for better performance. + // tokenize the filename (very expensive) only once per search expression and only if really needed + if (astrFileNameTokens.GetCount() == 0) + { + int iPosTok = 0; + CString strTok(item->m_sFileName.Tokenize(_aszInvKadKeywordChars, iPosTok)); + while (!strTok.IsEmpty()) + { + astrFileNameTokens.Add(strTok); + strTok = item->m_sFileName.Tokenize(_aszInvKadKeywordChars, iPosTok); + } + } + if (astrFileNameTokens.GetCount() == 0) + return false; + + // if there are more than one search strings specified (e.g. "aaa bbb ccc") the entire string is handled + // like "aaa AND bbb AND ccc". search all strings from the string search term in the tokenized list of + // the file name. all strings of string search term have to be found (AND) + for (int iSearchTerm = 0; iSearchTerm < iStrSearchTerms; iSearchTerm++) + { + bool bFoundSearchTerm = false; + for (int i = 0; i < astrFileNameTokens.GetCount(); i++) + { + // the file name string was already stored in lowercase + // the string search term was already stored in lowercase + if (strcmp(astrFileNameTokens.GetAt(i), pSearchTerm->astr->GetAt(iSearchTerm)) == 0) + { + bFoundSearchTerm = true; + break; + } + } + if (!bFoundSearchTerm) + return false; + } +#else + // if there are more than one search strings specified (e.g. "aaa bbb ccc") the entire string is handled + // like "aaa AND bbb AND ccc". search all strings from the string search term in the tokenized list of + // the file name. all strings of string search term have to be found (AND) + for (int iSearchTerm = 0; iSearchTerm < iStrSearchTerms; iSearchTerm++) { + // this will not give the same results as when tokenizing the filename string, but it is 20 times faster. + if (item->m_sFileName.Find((*(pSearchTerm->astr))[iSearchTerm]) == -1) { + return false; + } + } +#endif + return true; + + // search string value in all string meta tags (this includes also the filename) + // although this would work, I am no longer sure if it's the correct way to process the search requests.. + /*const CTag *tag; + TagPtrList::const_iterator it; + for (it = item->m_lTagList.begin(); it != item->m_lTagList.end(); it++) + { + tag = *it; + if (tag->m_type == 2) + { + //TODO: Use a pre-tokenized list for better performance. + int iPos = 0; + CString strTok(static_cast(tag)->m_value.Tokenize(_aszInvKadKeywordChars, iPos)); + while (!strTok.IsEmpty()){ + if (stricmp(strTok, *(pSearchTerm->str)) == 0) + return true; + strTok = static_cast(tag)->m_value.Tokenize(_aszInvKadKeywordChars, iPos); + } + } + } + return false;*/ + } + + if (pSearchTerm->type == SSearchTerm::MetaTag) { + if (pSearchTerm->tag->GetType() == 2) { // meta tags with string values + TagPtrList::const_iterator it; + for (it = item->m_lTagList.begin(); it != item->m_lTagList.end(); ++it) { + const CTag* tag = *it; + if (tag->IsStr() && pSearchTerm->tag->GetName().Cmp(tag->GetName()) == 0) { + return tag->GetStr().CmpNoCase(pSearchTerm->tag->GetStr()) == 0; + } + } + } + } else if (pSearchTerm->type == SSearchTerm::OpGreaterEqual) { + if (pSearchTerm->tag->IsInt()) { // meta tags with integer values + TagPtrList::const_iterator it; + for (it = item->m_lTagList.begin(); it != item->m_lTagList.end(); ++it) { + const CTag* tag = *it; + if (tag->IsInt() && pSearchTerm->tag->GetName().Cmp(tag->GetName()) == 0) { + return tag->GetInt() >= pSearchTerm->tag->GetInt(); + } + } + } else if (pSearchTerm->tag->IsFloat()) { // meta tags with float values + TagPtrList::const_iterator it; + for (it = item->m_lTagList.begin(); it != item->m_lTagList.end(); ++it) { + const CTag* tag = *it; + if (tag->IsFloat() && pSearchTerm->tag->GetName().Cmp(tag->GetName()) == 0) { + return tag->GetFloat() >= pSearchTerm->tag->GetFloat(); + } + } + } + } else if (pSearchTerm->type == SSearchTerm::OpLessEqual) { + if (pSearchTerm->tag->IsInt()) { // meta tags with integer values + TagPtrList::const_iterator it; + for (it = item->m_lTagList.begin(); it != item->m_lTagList.end(); ++it) { + const CTag* tag = *it; + if (tag->IsInt() && pSearchTerm->tag->GetName().Cmp(tag->GetName()) == 0) { + return tag->GetInt() <= pSearchTerm->tag->GetInt(); + } + } + } else if (pSearchTerm->tag->IsFloat()) { // meta tags with float values + TagPtrList::const_iterator it; + for (it = item->m_lTagList.begin(); it != item->m_lTagList.end(); ++it) { + const CTag* tag = *it; + if (tag->IsFloat() && pSearchTerm->tag->GetName().Cmp(tag->GetName()) == 0) { + return tag->GetFloat() <= pSearchTerm->tag->GetFloat(); + } + } + } + } else if (pSearchTerm->type == SSearchTerm::OpGreater) { + if (pSearchTerm->tag->IsInt()) { // meta tags with integer values + TagPtrList::const_iterator it; + for (it = item->m_lTagList.begin(); it != item->m_lTagList.end(); ++it) { + const CTag* tag = *it; + if (tag->IsInt() && pSearchTerm->tag->GetName().Cmp(tag->GetName()) == 0) { + return tag->GetInt() > pSearchTerm->tag->GetInt(); + } + } + } else if (pSearchTerm->tag->IsFloat()) { // meta tags with float values + TagPtrList::const_iterator it; + for (it = item->m_lTagList.begin(); it != item->m_lTagList.end(); it++) { + const CTag* tag = *it; + if (tag->IsFloat() && pSearchTerm->tag->GetName().Cmp(tag->GetName()) == 0) { + return tag->GetFloat() > pSearchTerm->tag->GetFloat(); + } + } + } + } else if (pSearchTerm->type == SSearchTerm::OpLess) { + if (pSearchTerm->tag->IsInt()) { // meta tags with integer values + TagPtrList::const_iterator it; + for (it = item->m_lTagList.begin(); it != item->m_lTagList.end(); ++it) { + const CTag* tag = *it; + if (tag->IsInt() && pSearchTerm->tag->GetName().Cmp(tag->GetName()) == 0) { + return tag->GetInt() < pSearchTerm->tag->GetInt(); + } + } + } else if (pSearchTerm->tag->IsFloat()) { // meta tags with float values + TagPtrList::const_iterator it; + for (it = item->m_lTagList.begin(); it != item->m_lTagList.end(); ++it) { + const CTag* tag = *it; + if (tag->IsFloat() && pSearchTerm->tag->GetName().Cmp(tag->GetName()) == 0) { + return tag->GetFloat() < pSearchTerm->tag->GetFloat(); + } + } + } + } else if (pSearchTerm->type == SSearchTerm::OpEqual) { + if (pSearchTerm->tag->IsInt()) { // meta tags with integer values + TagPtrList::const_iterator it; + for (it = item->m_lTagList.begin(); it != item->m_lTagList.end(); it++) { + const CTag* tag = *it; + if (tag->IsInt() && pSearchTerm->tag->GetName().Cmp(tag->GetName()) == 0) { + return tag->GetInt() == pSearchTerm->tag->GetInt(); + } + } + } else if (pSearchTerm->tag->IsFloat()) { // meta tags with float values + TagPtrList::const_iterator it; + for (it = item->m_lTagList.begin(); it != item->m_lTagList.end(); it++) { + const CTag* tag = *it; + if (tag->IsFloat() && pSearchTerm->tag->GetName().Cmp(tag->GetName()) == 0) { + return tag->GetFloat() == pSearchTerm->tag->GetFloat(); + } + } + } + } else if (pSearchTerm->type == SSearchTerm::OpNotEqual) { + if (pSearchTerm->tag->IsInt()) { // meta tags with integer values + TagPtrList::const_iterator it; + for (it = item->m_lTagList.begin(); it != item->m_lTagList.end(); it++) { + const CTag* tag = *it; + if (tag->IsInt() && pSearchTerm->tag->GetName().Cmp(tag->GetName()) == 0) { + return tag->GetInt() != pSearchTerm->tag->GetInt(); + } + } + } else if (pSearchTerm->tag->IsFloat()) { // meta tags with float values + TagPtrList::const_iterator it; + for (it = item->m_lTagList.begin(); it != item->m_lTagList.end(); it++) { + const CTag* tag = *it; + if (tag->IsFloat() && pSearchTerm->tag->GetName().Cmp(tag->GetName()) == 0) { + return tag->GetFloat() != pSearchTerm->tag->GetFloat(); + } + } + } + } + + return false; +} + +//bool SearchTermsMatch(const SSearchTerm* pSearchTerm, const Kademlia::CEntry* item) +//{ +// // tokenize the filename (very expensive) only once per search expression and only if really needed +// CStringArray astrFileNameTokens; +// return SearchTermsMatch(pSearchTerm, item, astrFileNameTokens); +//} + +void CIndexed::SendValidKeywordResult(const CUInt128& keyID, const SSearchTerm* pSearchTerms, uint32 ip, uint16 port) +{ + KeyHash* currKeyHash = NULL; + KeyHashMap::iterator itKeyHash = m_Keyword_map.find(keyID); + if(itKeyHash != m_Keyword_map.end()) { + currKeyHash = itKeyHash->second; + CMemFile packetdata(1024 * 50); + packetdata.WriteUInt128(keyID); + packetdata.WriteUInt16(50); + uint16 maxResults = 300; + uint16 count = 0; + + CSourceKeyMap::iterator itSource = currKeyHash->m_Source_map.begin(); + for ( ; itSource != currKeyHash->m_Source_map.end(); ++itSource) { + Source* currSource = itSource->second; + + CKadEntryPtrList::iterator itEntry = currSource->entryList.begin(); + for (; itEntry != currSource->entryList.end(); ++itEntry) { + Kademlia::CEntry* currName = *itEntry; + if ( !pSearchTerms || SearchTermsMatch(pSearchTerms, currName) ) { + if( count < maxResults ) { + packetdata.WriteUInt128(currName->m_iSourceID); + packetdata.WriteTagPtrList(currName->m_lTagList); + count++; + if( count % 50 == 0 ) { + AddDebugLogLineM(false, logClientKadUDP, wxT("KadSearchRes ") + Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + CKademlia::GetUDPListener()->SendPacket(packetdata, KADEMLIA_SEARCH_RES, ip, port); + packetdata.Reset(); + packetdata.WriteUInt128(keyID); + packetdata.WriteUInt16(50); + } + } + } + } + } + + // Send whichever were left. + uint16 ccount = count % 50; + if( ccount ) { + packetdata.Seek(16/* skip the uint128 keyID at the start */, wxFromStart); + packetdata.WriteUInt16(ccount); + AddDebugLogLineM(false, logClientKadUDP, wxT("KadSearchRes ") + Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + CKademlia::GetUDPListener()->SendPacket(packetdata, KADEMLIA_SEARCH_RES, ip, port); + } + Clean(); + } +} + +void CIndexed::SendValidSourceResult(const CUInt128& keyID, uint32 ip, uint16 port) +{ + SrcHash* currSrcHash = NULL; + SrcHashMap::iterator itSrcHash = m_Sources_map.find(keyID); + if(itSrcHash != m_Sources_map.end()) { + currSrcHash = itSrcHash->second; + CMemFile packetdata(1024*50); + packetdata.WriteUInt128(keyID); + packetdata.WriteUInt16(50); + uint16 maxResults = 300; + uint16 count = 0; + + CKadSourcePtrList::iterator itSource = currSrcHash->m_Source_map.begin(); + for (; itSource != currSrcHash->m_Source_map.end(); ++itSource) { + Source* currSource = *itSource; + if( currSource->entryList.size() ) { + Kademlia::CEntry* currName = currSource->entryList.front(); + if( count < maxResults ) { + packetdata.WriteUInt128(currName->m_iSourceID); + packetdata.WriteTagPtrList(currName->m_lTagList); + count++; + if( count % 50 == 0 ) { + AddDebugLogLineM(false, logClientKadUDP, wxT("KadSearchRes ") + Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip) , port)); + CKademlia::GetUDPListener()->SendPacket(packetdata, KADEMLIA_SEARCH_RES, ip, port); + packetdata.Reset(); + packetdata.WriteUInt128(keyID); + packetdata.WriteUInt16(50); + } + } + } + } + uint16 ccount = count % 50; + if( ccount ) { + packetdata.Seek(16/* skip the uint128 keyID at the start */, wxFromStart); + packetdata.WriteUInt16(ccount); + AddDebugLogLineM(false, logClientKadUDP, wxT("KadSearchRes ") + Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + CKademlia::GetUDPListener()->SendPacket(packetdata, KADEMLIA_SEARCH_RES, ip, port); + } + Clean(); + } +} + +void CIndexed::SendValidNoteResult(const CUInt128& keyID, const CUInt128& WXUNUSED(sourceID), uint32 ip, uint16 port) +{ + SrcHash* currNoteHash = NULL; + SrcHashMap::iterator itNote = m_Notes_map.find(keyID); + if(itNote != m_Notes_map.end()) { + currNoteHash = itNote->second; + CMemFile packetdata(1024*50); + packetdata.WriteUInt128(keyID); + packetdata.WriteUInt16(50); + uint16 maxResults = 50; + uint16 count = 0; + + CKadSourcePtrList::iterator itSource = currNoteHash->m_Source_map.begin(); + for (; itSource != currNoteHash->m_Source_map.end(); ++itSource ) { + Source* currNote = *itSource; + if( currNote->entryList.size() ) { + Kademlia::CEntry* currName = currNote->entryList.front(); + if( count < maxResults ) { + packetdata.WriteUInt128(currName->m_iSourceID); + packetdata.WriteTagPtrList(currName->m_lTagList); + count ++; + if( count % 50 == 0 ) { + AddDebugLogLineM(false, logClientKadUDP, wxT("KadNotesRes ") + Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + CKademlia::GetUDPListener()->SendPacket(packetdata, KADEMLIA_SRC_NOTES_RES, ip, port); + packetdata.Reset(); + packetdata.WriteUInt128(keyID); + packetdata.WriteUInt16(50); + } + } + } + } + uint16 ccount = count % 50; + if( ccount ) { + packetdata.Seek(16/* skip the uint128 keyID at the start */, wxFromStart); + packetdata.WriteUInt16(ccount); + AddDebugLogLineM(false, logClientKadUDP, wxT("KadNotesRes ") + Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + CKademlia::GetUDPListener()->SendPacket(packetdata, KADEMLIA_SRC_NOTES_RES, ip, port); + } + } +} + +bool CIndexed::SendStoreRequest(const CUInt128& keyID) +{ + Load* load = NULL; + LoadMap::iterator it = m_Load_map.find(keyID); + if(it != m_Load_map.end()) { + load = it->second; + if(load->time < (uint32)time(NULL)) { + m_Load_map.erase(it); + delete load; + return true; + } + return false; + } + return true; +} + +SSearchTerm::SSearchTerm() +{ + type = AND; + tag = NULL; + left = NULL; + right = NULL; +} + +SSearchTerm::~SSearchTerm() +{ + if (type == String) { + delete astr; + } + delete tag; +} +// File_checked_for_headers diff --git a/src/kademlia/kademlia/Indexed.h b/src/kademlia/kademlia/Indexed.h new file mode 100644 index 00000000..6a46e5c9 --- /dev/null +++ b/src/kademlia/kademlia/Indexed.h @@ -0,0 +1,149 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#ifndef __INDEXED_H__ +#define __INDEXED_H__ + + +#include "SearchManager.h" +#include "Entry.h" + +class wxArrayString; + + +typedef std::list CKadEntryPtrList; + +struct Source +{ + Kademlia::CUInt128 sourceID; + CKadEntryPtrList entryList; +}; + +typedef std::list CKadSourcePtrList; +typedef std::map CSourceKeyMap; + +struct KeyHash +{ + Kademlia::CUInt128 keyID; + CSourceKeyMap m_Source_map; +}; + + +struct SrcHash +{ + Kademlia::CUInt128 keyID; + CKadSourcePtrList m_Source_map; +}; + +struct Load +{ + Kademlia::CUInt128 keyID; + uint32 time; +}; + +struct SSearchTerm +{ + SSearchTerm(); + ~SSearchTerm(); + + enum ESearchTermType { + AND, + OR, + NAND, + String, + MetaTag, + OpGreaterEqual, + OpLessEqual, + OpGreater, + OpLess, + OpEqual, + OpNotEqual + } type; + + CTag* tag; + wxArrayString* astr; + + SSearchTerm* left; + SSearchTerm* right; +}; + +typedef std::map KeyHashMap; +typedef std::map SrcHashMap; +typedef std::map LoadMap; + +//////////////////////////////////////// +namespace Kademlia { +//////////////////////////////////////// + +class CIndexed +{ + +public: + CIndexed(); + ~CIndexed(); + + bool AddKeyword(const CUInt128& keyWordID, const CUInt128& sourceID, Kademlia::CEntry* entry, uint8& load); + bool AddSources(const CUInt128& keyWordID, const CUInt128& sourceID, Kademlia::CEntry* entry, uint8& load); + bool AddNotes(const CUInt128& keyID, const CUInt128& sourceID, Kademlia::CEntry* entry, uint8& load); + bool AddLoad(const CUInt128& keyID, uint32 time); + uint32 GetIndexedCount() {return m_Keyword_map.size();} + uint32 GetFileKeyCount() {return m_Keyword_map.size();} + void SendValidKeywordResult(const CUInt128& keyID, const SSearchTerm* pSearchTerms, uint32 ip, uint16 port); + void SendValidSourceResult(const CUInt128& keyID, uint32 ip, uint16 port); + void SendValidNoteResult(const CUInt128& keyID, const CUInt128& CheckID, uint32 ip, uint16 port); + bool SendStoreRequest(const CUInt128& keyID); + uint32 m_totalIndexSource; + uint32 m_totalIndexKeyword; + +private: + time_t m_lastClean; + KeyHashMap m_Keyword_map; + SrcHashMap m_Sources_map; + SrcHashMap m_Notes_map; + LoadMap m_Load_map; + static wxString m_sfilename; + static wxString m_kfilename; + static wxString m_loadfilename; + void ReadFile(void); + void Clean(void); +}; + +} // End namespace + +#endif //__INDEXED_H__ +// File_checked_for_headers diff --git a/src/kademlia/kademlia/Kademlia.cpp b/src/kademlia/kademlia/Kademlia.cpp new file mode 100644 index 00000000..dacaffe1 --- /dev/null +++ b/src/kademlia/kademlia/Kademlia.cpp @@ -0,0 +1,408 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#include "Kademlia.h" // Interface declarations + +#include +#include + +#include "Defines.h" +#include "Indexed.h" +#include "../net/KademliaUDPListener.h" +#include "../routing/RoutingZone.h" +#include "../routing/Contact.h" +#include "../../amule.h" +#include "../../Logger.h" + +//////////////////////////////////////// +using namespace Kademlia; +//////////////////////////////////////// + +CKademlia *CKademlia::instance = NULL; +EventMap CKademlia::m_events; +time_t CKademlia::m_nextSearchJumpStart; +time_t CKademlia::m_nextSelfLookup; +time_t CKademlia::m_statusUpdate; +time_t CKademlia::m_bigTimer; +time_t CKademlia::m_nextFirewallCheck; +time_t CKademlia::m_nextFindBuddy; +time_t CKademlia::m_bootstrap; +bool CKademlia::m_running = false; + +void CKademlia::Start(void) +{ + if (instance != NULL) { + return; + } + Start(new CPrefs()); +} + +void CKademlia::Start(CPrefs *prefs) +{ + if( m_running ) { + delete prefs; + return; + } + + AddDebugLogLineM(false, logKadMain, wxT("Starting Kademlia")); + + m_nextSearchJumpStart = time(NULL); + m_nextSelfLookup = time(NULL) + MIN2S(3); + m_statusUpdate = time(NULL); + m_bigTimer = time(NULL); + m_nextFirewallCheck = time(NULL) + (HR2S(1)); + // First Firewall check is done on connect, find a buddy after the first 10min of starting + // the client to try to allow it to settle down.. + m_nextFindBuddy = time(NULL) + (MIN2S(5)); + m_bootstrap = 0; + + srand((uint32)time(NULL)); + instance = new CKademlia(); + instance->m_prefs = prefs; + instance->m_udpListener = NULL; + instance->m_routingZone = NULL; + instance->m_indexed = new CIndexed(); + instance->m_routingZone = new CRoutingZone(); + instance->m_udpListener = new CKademliaUDPListener(); + m_running = true; +} + + +void CKademlia::Stop() +{ + if( !m_running ) { + return; + } + + AddDebugLogLineM(false, logKadMain, wxT("Stopping Kademlia")); + m_running = false; + + CSearchManager::StopAllSearches(); + delete instance->m_udpListener; + instance->m_udpListener = NULL; + + delete instance->m_routingZone; + instance->m_routingZone = NULL; + + delete instance->m_indexed; + instance->m_indexed = NULL; + + delete instance->m_prefs; + instance->m_prefs = NULL; + + delete instance; + instance = NULL; + + m_events.clear(); + + theApp->ShowConnectionState(); +} + +void CKademlia::Process() +{ + + if( instance == NULL || !m_running) { + return; + } + wxASSERT(instance != NULL); + time_t now; + CRoutingZone *zone; + EventMap::const_iterator it; + uint32 maxUsers = 0; + uint32 tempUsers = 0; + uint32 lastContact = 0; + bool updateUserFile = false; + + now = time(NULL); + wxASSERT(instance->m_prefs != NULL); + lastContact = instance->m_prefs->GetLastContact(); + CSearchManager::UpdateStats(); + if( m_statusUpdate <= now ) { + updateUserFile = true; + m_statusUpdate = MIN2S(1) + now; + } + if( m_nextFirewallCheck <= now) { + RecheckFirewalled(); + } + if (m_nextSelfLookup <= now) { + CSearchManager::FindNodeComplete(instance->m_prefs->GetKadID()); + m_nextSelfLookup = HR2S(4) + now; + } + if (m_nextFindBuddy <= now) { + instance->m_prefs->SetFindBuddy(); + m_nextFindBuddy = MIN2S(5) + m_nextFirewallCheck; + } + for (it = m_events.begin(); it != m_events.end(); it++) { + zone = it->first; + if( updateUserFile ) { + tempUsers = zone->EstimateCount(); + if( maxUsers < tempUsers ) { + maxUsers = tempUsers; + } + } + if (m_bigTimer <= now) { + if( zone->m_nextBigTimer <= now ) { + if(zone->OnBigTimer()) { + zone->m_nextBigTimer = HR2S(1) + now; + m_bigTimer = SEC(10) + now; + } + } else { + if( lastContact && ( (now - lastContact) > (KADEMLIADISCONNECTDELAY-MIN2S(5)))) { + if(zone->OnBigTimer()) { + zone->m_nextBigTimer = HR2S(1) + now; + m_bigTimer = SEC(10) + now; + } + } + } + } + + if (zone->m_nextSmallTimer <= now) { + zone->OnSmallTimer(); + zone->m_nextSmallTimer = MIN2S(1) + now; + } + // This is a convenient place to add this, although not related to routing + if (m_nextSearchJumpStart <= now) { + CSearchManager::JumpStart(); + m_nextSearchJumpStart += SEARCH_JUMPSTART; + } + } + + it = m_events.begin(); + + /* Do needed merges if there was a successful deletion */ + while (it != m_events.end()) { + zone = it->first; + ++it; + if (zone->IsDirty()) { + zone->Merge(); + it = m_events.begin(); /* restart */ + } + } + + //Update user count only if changed. + if( updateUserFile ) { + if( maxUsers != instance->m_prefs->GetKademliaUsers()) { + instance->m_prefs->SetKademliaUsers(maxUsers); + instance->m_prefs->SetKademliaFiles(); + theApp->ShowUserCount(); + } + } +} + +void CKademlia::AddEvent(CRoutingZone *zone) +{ + m_events[zone] = zone; +} + +void CKademlia::RemoveEvent(CRoutingZone *zone) +{ + m_events.erase(zone); +} + +bool CKademlia::IsConnected(void) +{ + if( instance && instance->m_prefs ) { + return instance->m_prefs->HasHadContact(); + } + return false; +} + +bool CKademlia::IsFirewalled(void) +{ + if( instance && instance->m_prefs ) { + return instance->m_prefs->GetFirewalled(); + } + return true; +} + +uint32 CKademlia::GetKademliaUsers(void) +{ + if( instance && instance->m_prefs ) { + return instance->m_prefs->GetKademliaUsers(); + } + return 0; +} + +uint32 CKademlia::GetKademliaFiles(void) +{ + if( instance && instance->m_prefs ) { + return instance->m_prefs->GetKademliaFiles(); + } + return 0; +} + +uint32 CKademlia::GetTotalStoreKey(void) +{ + if( instance && instance->m_prefs ) { + return instance->m_prefs->GetTotalStoreKey(); + } + return 0; +} + +uint32 CKademlia::GetTotalStoreSrc(void) +{ + if( instance && instance->m_prefs ) { + return instance->m_prefs->GetTotalStoreSrc(); + } + return 0; +} + +uint32 CKademlia::GetTotalStoreNotes(void) +{ + if( instance && instance->m_prefs ) { + return instance->m_prefs->GetTotalStoreNotes(); + } + return 0; +} + +uint32 CKademlia::GetTotalFile(void) +{ + if( instance && instance->m_prefs ) { + return instance->m_prefs->GetTotalFile(); + } + return 0; +} + +uint32 CKademlia::GetIPAddress(void) +{ + if( instance && instance->m_prefs ) { + return instance->m_prefs->GetIPAddress(); + } + return 0; +} + +void CKademlia::ProcessPacket(const byte *data, uint32 lenData, uint32 ip, uint16 port) +{ + try { + if( instance && instance->m_udpListener ) { + instance->m_udpListener->ProcessPacket( data, lenData, ip, port); + } + } catch (const wxString& error) { + AddDebugLogLineM(false, logKadMain, wxT("Exception on Kad processPacket: ") + error); + throw; + } catch (...) { + AddDebugLogLineM(false, logKadMain, wxT("Unhandled exception on Kad processPacket")); + throw; + } +} + +bool CKademlia::GetPublish(void) +{ + if( instance && instance->m_prefs ) { + return instance->m_prefs->GetPublish(); + } + return 0; +} + +void CKademlia::Bootstrap(uint32 ip, uint16 port) +{ + if( instance && instance->m_udpListener && !IsConnected() && time(NULL) - m_bootstrap > MIN2S(1) ) { + instance->m_udpListener->Bootstrap( ip, port); + } +} + +void CKademlia::RecheckFirewalled() +{ + if( instance && instance->GetPrefs() ) { + instance->m_prefs->SetFindBuddy(false); + instance->m_prefs->SetRecheckIP(); + m_nextFindBuddy = MIN2S(5) + m_nextFirewallCheck; + m_nextFirewallCheck = HR2S(1) + time(NULL); + } +} + +CPrefs *CKademlia::GetPrefs(void) +{ + if (instance == NULL || instance->m_prefs == NULL) { + wxASSERT(0); + return NULL; + } + return instance->m_prefs; +} + +CKademliaUDPListener *CKademlia::GetUDPListener(void) +{ + if (instance == NULL || instance->m_udpListener == NULL) { + wxASSERT(0); + return NULL; + } + return instance->m_udpListener; +} + +CRoutingZone *CKademlia::GetRoutingZone(void) +{ + if (instance == NULL || instance->m_routingZone == NULL) { + wxASSERT(0); + return NULL; + } + return instance->m_routingZone; +} + +CIndexed *CKademlia::GetIndexed(void) +{ + if ( instance == NULL || instance->m_indexed == NULL) { + wxASSERT(0); + return NULL; + } + return instance->m_indexed; +} + +// Global function. + +#include "../../CryptoPP_Inc.h" +void KadGetKeywordHash(const wxString& rstrKeyword, Kademlia::CUInt128* pKadID) +{ + byte Output[16]; + + #ifdef __WEAK_CRYPTO__ + CryptoPP::Weak::MD4 md4_hasher; + #else + CryptoPP::MD4 md4_hasher; + #endif + + // This should be safe - we assume rstrKeyword is ANSI anyway. + char* ansi_buffer = strdup(unicode2UTF8(rstrKeyword)); + + //printf("Kad keyword hash: UTF8 %s\n",ansi_buffer); + md4_hasher.CalculateDigest(Output,(const unsigned char*)ansi_buffer,strlen(ansi_buffer)); + //DumpMem(Output,16); + free(ansi_buffer); + + pKadID->SetValueBE(Output); +} +// File_checked_for_headers diff --git a/src/kademlia/kademlia/Kademlia.h b/src/kademlia/kademlia/Kademlia.h new file mode 100644 index 00000000..a40217d5 --- /dev/null +++ b/src/kademlia/kademlia/Kademlia.h @@ -0,0 +1,121 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#ifndef __KAD_KADEMLIA_H__ +#define __KAD_KADEMLIA_H__ + +#include +#include "../utils/UInt128.h" + +class CSharedFileList; +struct Status; + +//////////////////////////////////////// +namespace Kademlia { +//////////////////////////////////////// + +class CPrefs; +class CRoutingZone; +class CKademliaUDPListener; +class CKademliaError; +class CSearch; +class CContact; +class CIndexed; +class CEntry; + +typedef std::map EventMap; + +#define KADEMLIA_VERSION 0.1 + +class CKademlia +{ +public: + static void Start(void); + static void Start(CPrefs *prefs); + static void Stop(); + + static CPrefs *GetPrefs(void); + static CRoutingZone *GetRoutingZone(void); + static CKademliaUDPListener *GetUDPListener(void); + static CIndexed *GetIndexed(void); + static bool IsRunning(void) {return m_running;} + static bool IsConnected(void); + static bool IsFirewalled(void); + static void RecheckFirewalled(void); + static uint32 GetKademliaUsers(void); + static uint32 GetKademliaFiles(void); + static uint32 GetTotalStoreKey(void); + static uint32 GetTotalStoreSrc(void); + static uint32 GetTotalStoreNotes(void); + static uint32 GetTotalFile(void); + static bool GetPublish(void); + static uint32 GetIPAddress(void); + static void Bootstrap(uint32 ip, uint16 port); + static void ProcessPacket(const byte* data, uint32 lenData, uint32 ip, uint16 port); + + static void AddEvent(CRoutingZone *zone); + static void RemoveEvent(CRoutingZone *zone); + static void Process(); + +private: + CKademlia() {} + + static CKademlia *instance; + static EventMap m_events; + static time_t m_nextSearchJumpStart; + static time_t m_nextSelfLookup; + static time_t m_nextFirewallCheck; + static time_t m_nextFindBuddy; + static time_t m_statusUpdate; + static time_t m_bigTimer; + static time_t m_bootstrap; + static bool m_running; + + CPrefs *m_prefs; + CRoutingZone *m_routingZone; + CKademliaUDPListener *m_udpListener; + CIndexed *m_indexed; +}; + +} // End namespace + +void KadGetKeywordHash(const wxString& rstrKeyword, Kademlia::CUInt128* pKadID); +wxString KadGetKeywordBytes(const wxString& rstrKeywordW); + +#endif // __KAD_KADEMLIA_H__ +// File_checked_for_headers diff --git a/src/kademlia/kademlia/Makefile.am b/src/kademlia/kademlia/Makefile.am new file mode 100644 index 00000000..ba3c9f0a --- /dev/null +++ b/src/kademlia/kademlia/Makefile.am @@ -0,0 +1,11 @@ +noinst_HEADERS = Defines.h \ + Entry.h \ + Error.h \ + Indexed.h \ + Kademlia.h \ + Prefs.h \ + Search.h \ + SearchManager.h \ + Tag.h + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/kademlia/kademlia/Makefile.in b/src/kademlia/kademlia/Makefile.in new file mode 100644 index 00000000..27450a05 --- /dev/null +++ b/src/kademlia/kademlia/Makefile.in @@ -0,0 +1,502 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/kademlia/kademlia +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +noinst_HEADERS = Defines.h \ + Entry.h \ + Error.h \ + Indexed.h \ + Kademlia.h \ + Prefs.h \ + Search.h \ + SearchManager.h \ + Tag.h + +MAINTAINERCLEANFILES = Makefile.in +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/kademlia/kademlia/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/kademlia/kademlia/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(HEADERS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + ctags distclean distclean-generic distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/kademlia/kademlia/Prefs.cpp b/src/kademlia/kademlia/Prefs.cpp new file mode 100644 index 00000000..20f00af1 --- /dev/null +++ b/src/kademlia/kademlia/Prefs.cpp @@ -0,0 +1,238 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#include "Prefs.h" + +#include +#include + +#include "../kademlia/Kademlia.h" +#include "../kademlia/Indexed.h" +#include "../../Preferences.h" +#include "../../amule.h" +#include "../../CFile.h" +#include "../../ServerList.h" +#include "../../Logger.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + + +//////////////////////////////////////// +using namespace Kademlia; +//////////////////////////////////////// + +CPrefs::CPrefs() +{ + Init(theApp->ConfigDir + wxT("preferencesKad.dat")); +} + +CPrefs::~CPrefs() +{ + if (!m_filename.IsEmpty()) { + WriteFile(); + } +} + +void CPrefs::Init(const wxString& filename) +{ + m_clientID.SetValueRandom(); + m_lastContact = 0; + m_recheckip = 0; + m_firewalled = 0; + m_totalFile = 0; + m_totalStoreSrc = 0; + m_totalStoreKey = 0; + m_totalSource = 0; + m_totalNotes = 0; + m_totalStoreNotes = 0; + m_Publish = false; + m_clientHash.SetValueBE(thePrefs::GetUserHash().GetHash()); + m_ip = 0; + m_ipLast = 0; + m_firewalled = 0; + m_findBuddy = false; + m_kademliaUsers = 0; + m_kademliaFiles = 0; + m_filename = filename; + m_lastFirewallState = true; + ReadFile(); +} + +void CPrefs::ReadFile() +{ + const CPath path = CPath(m_filename); + + try { + CFile file; + if (path.FileExists() && file.Open(path, CFile::read)) { + m_ip = file.ReadUInt32(); + file.ReadUInt16(); + m_clientID = file.ReadUInt128(); + } + } catch (const CSafeIOException& e) { + AddDebugLogLineM(true, logKadPrefs, wxT("IO error while reading prefs: ") + e.what()); + } +} + +void CPrefs::WriteFile() +{ + try { + CFile file; + if (file.Open(m_filename, CFile::write)) { + file.WriteUInt32(m_ip); + file.WriteUInt16(0); //This is no longer used. + file.WriteUInt128(m_clientID); + file.WriteUInt8(0); //This is to tell older clients there are no tags.. + file.Close(); + } + } catch (const CIOFailureException& e) { + AddDebugLogLineM(true, logKadPrefs, wxT("IO failure while saving kad-prefs: ") + e.what()); + } +} + +void CPrefs::SetIPAddress(uint32 val) +{ + //This is our first check on connect, init our IP.. + if( !val || !m_ipLast ) { + m_ip = val; + m_ipLast = val; + } + //If the last check matches this one, reset our current IP. + //If the last check does not match, wait for our next incoming IP. + //This happens for two reasons.. We just changed our IP, or a client responsed with a bad IP. + if( val == m_ipLast ) { + m_ip = val; + } else { + m_ipLast = val; + } +} + + +bool CPrefs::HasLostConnection() const +{ + if( m_lastContact ) { + return !((time(NULL) - m_lastContact) < KADEMLIADISCONNECTDELAY); + } + return false; +} + +bool CPrefs::HasHadContact() const +{ + if( m_lastContact ) { + return ((time(NULL) - m_lastContact) < KADEMLIADISCONNECTDELAY); + } + return false; +} + +bool CPrefs::GetFirewalled() const +{ + if( m_firewalled<2 ) { + //Not enough people have told us we are open but we may be doing a recheck + //at the moment which will give a false lowID.. Therefore we check to see + //if we are still rechecking and will report our last known state.. + if(GetRecheckIP()) { + return m_lastFirewallState; + } + return true; + } + //We had enough tell us we are not firewalled.. + return false; +} + +void CPrefs::SetFirewalled() +{ + //Are are checking our firewall state.. Let keep a snapshot of our + //current state to prevent false reports during the recheck.. + m_lastFirewallState = (m_firewalled<2); + m_firewalled = 0; + theApp->ShowConnectionState(); +} + +void CPrefs::IncFirewalled() +{ + m_firewalled++; + theApp->ShowConnectionState(); +} + +bool CPrefs::GetFindBuddy() /*const*/ +{ + if( m_findBuddy ) { + m_findBuddy = false; + return true; + } + return false; +} + +void CPrefs::SetKademliaFiles() +{ + //There is no real way to know how many files are in the Kad network.. + //So we first try to see how many files per user are in the ED2K network.. + //If that fails, we use a set value based on previous tests.. + uint32 nServerAverage = theApp->serverlist->GetAvgFile(); + uint32 nKadAverage = Kademlia::CKademlia::GetIndexed()->GetFileKeyCount(); + +#ifdef __DEBUG__ + wxString method; +#endif + if( nServerAverage > nKadAverage ) { +#ifdef __DEBUG__ + method = wxString::Format(wxT("Kad file estimate used Server avg(%u)"), nServerAverage); +#endif + nKadAverage = nServerAverage; + } +#ifdef __DEBUG__ + else { + method = wxString::Format(wxT("Kad file estimate used Kad avg(%u)"), nKadAverage); + } +#endif + if( nKadAverage < 108 ) { +#ifdef __DEBUG__ + method = wxString(wxT("Kad file estimate used default avg(108, min value)")); +#endif + nKadAverage = 108; + } +#ifdef ___DEBUG__ + AddDebugLogLineM(false, logKadPrefs, method); +#endif + m_kademliaFiles = nKadAverage*m_kademliaUsers; +} +// File_checked_for_headers diff --git a/src/kademlia/kademlia/Prefs.h b/src/kademlia/kademlia/Prefs.h new file mode 100644 index 00000000..c4fcae45 --- /dev/null +++ b/src/kademlia/kademlia/Prefs.h @@ -0,0 +1,139 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#ifndef __PREFS_H__ +#define __PREFS_H__ + +#include "../utils/UInt128.h" +#include + +//////////////////////////////////////// +namespace Kademlia { +//////////////////////////////////////// + +class CPrefs +{ +public: + CPrefs(); + ~CPrefs(); + + void SetKadID(const CUInt128 &id) {m_clientID = id;} + const CUInt128& GetKadID() const {return m_clientID;} + + void SetClientHash(const CUInt128 &id) {m_clientHash = id;} + const CUInt128& GetClientHash() const {return m_clientHash;} + + uint32 GetIPAddress() const {return m_ip;} + void SetIPAddress(uint32 val); + + bool GetRecheckIP() const {return (m_recheckip<4);} + void SetRecheckIP() {m_recheckip = 0; SetFirewalled();} + void IncRecheckIP() {m_recheckip++;} + + bool HasHadContact() const; + void SetLastContact() {m_lastContact = time(NULL);} + bool HasLostConnection() const; + uint32 GetLastContact() const {return m_lastContact;} + + bool GetFirewalled() const; + void SetFirewalled(); + void IncFirewalled(); + + uint8 GetTotalFile() const {return m_totalFile;} + void SetTotalFile(uint8 val) {m_totalFile = val;} + + uint8 GetTotalStoreSrc() const {return m_totalStoreSrc;} + void SetTotalStoreSrc(uint8 val) {m_totalStoreSrc = val;} + + uint8 GetTotalStoreKey() const {return m_totalStoreKey;} + void SetTotalStoreKey(uint8 val) {m_totalStoreKey = val;} + + uint8 GetTotalSource() const {return m_totalSource;} + void SetTotalSource(uint8 val) {m_totalSource = val;} + + uint8 GetTotalNotes() const {return m_totalNotes;} + void SetTotalNotes(uint8 val) {m_totalNotes = val;} + + uint8 GetTotalStoreNotes() const {return m_totalStoreNotes;} + void SetTotalStoreNotes(uint8 val) {m_totalStoreNotes = val;} + + uint32 GetKademliaUsers() const {return m_kademliaUsers;} + void SetKademliaUsers(uint32 val) {m_kademliaUsers = val;} + + uint32 GetKademliaFiles() const {return m_kademliaFiles;} + void SetKademliaFiles(); + + bool GetPublish() const {return m_Publish;} + void SetPublish(bool val) {m_Publish = val;} + + bool GetFindBuddy(); + void SetFindBuddy(bool val = true) {m_findBuddy = val;} + +private: + wxString m_filename; + + time_t m_lastContact; + CUInt128 m_clientID; + CUInt128 m_clientHash; + uint32 m_ip; + uint32 m_ipLast; + uint32 m_recheckip; + uint32 m_firewalled; + uint32 m_kademliaUsers; + uint32 m_kademliaFiles; + uint8 m_totalFile; + uint8 m_totalStoreSrc; + uint8 m_totalStoreKey; + uint8 m_totalSource; + uint8 m_totalNotes; + uint8 m_totalStoreNotes; + bool m_Publish; + bool m_findBuddy; + bool m_lastFirewallState; + + void Init(const wxString& filename); + void Reset(); + void SetDefaults(); + void ReadFile(); + void WriteFile(); +}; + +} // End namespace + +#endif //__PREFS_H__ +// File_checked_for_headers diff --git a/src/kademlia/kademlia/Search.cpp b/src/kademlia/kademlia/Search.cpp new file mode 100644 index 00000000..be1b63cf --- /dev/null +++ b/src/kademlia/kademlia/Search.cpp @@ -0,0 +1,981 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + + + +#include "Search.h" + +#include +#include +#include +#include +#include + +#include "Defines.h" +#include "../routing/RoutingZone.h" +#include "../routing/Contact.h" +#include "../net/KademliaUDPListener.h" +#include "../../amule.h" +#include "../../SharedFileList.h" +#include "../../DownloadQueue.h" +#include "../../PartFile.h" +#include "../../SearchList.h" +#include "../../MemFile.h" +#include "../../ClientList.h" +#include "../../updownclient.h" +#include "../../Logger.h" +#include "../../Preferences.h" +#include "../../GuiEvents.h" + +//////////////////////////////////////// +using namespace Kademlia; +//////////////////////////////////////// + +CSearch::CSearch() +{ + m_created = time(NULL); + m_searchTerms = NULL; + m_type = (uint32)-1; + m_uAnswers = 0; + m_totalRequestAnswers = 0; + m_kadPacketSent = 0; + m_searchID = (uint32)-1; + m_keywordPublish = 0; + (void)m_fileName; + m_stoping = false; + m_totalLoad = 0; + m_totalLoadResponses = 0; + m_lastResponse = time(NULL); +} + +CSearch::~CSearch() +{ + + CPartFile* temp = theApp->downloadqueue->GetFileByKadFileSearchID(GetSearchID()); + + if(temp) { + temp->SetKadFileSearchID(0); + } + + delete m_searchTerms; + + ContactMap::iterator it; + for (it = m_inUse.begin(); it != m_inUse.end(); it++) { + ((CContact*)it->second)->DecUse(); + } + + ContactList::const_iterator it2; + for (it2 = m_delete.begin(); it2 != m_delete.end(); it2++) { + delete *it2; + } + + if(CKademlia::IsRunning() && GetNodeLoad() > 20) { + switch(GetSearchTypes()) { + case CSearch::STOREKEYWORD: + Kademlia::CKademlia::GetIndexed()->AddLoad(GetTarget(), ((uint32)(DAY2S(7)*((double)GetNodeLoad()/100.0))+(uint32)time(NULL))); + break; + default: + ; + // WTF? + } + } + + switch (m_type) { + case KEYWORD: + Notify_KadSearchEnd(m_searchID); + break; + default: + ; + // WTF? + } +} + +void CSearch::Go(void) +{ + // Start with a lot of possible contacts, this is a fallback in case search stalls due to dead contacts + if (m_possible.empty()) { + CUInt128 distance(CKademlia::GetPrefs()->GetKadID()); + distance.XOR(m_target); + CKademlia::GetRoutingZone()->GetClosestTo(3, m_target, distance, 50, &m_possible, true, true); + } + + if (m_possible.empty()) { + return; + } + + ContactMap::iterator it; + //Lets keep our contact list entries in mind to dec the inUse flag. + for (it = m_possible.begin(); it != m_possible.end(); ++it) { + m_inUse[it->first] = it->second; + } + wxASSERT(m_possible.size() == m_inUse.size()); + // Take top 3 possible + int count = min(ALPHA_QUERY, (int)m_possible.size()); + CContact *c; + for (int i=0; isecond; + // Move to tried + m_tried[it->first] = c; + m_possible.erase(it); + // Send request + c->CheckingType(); + SendFindValue(c->GetClientID(), c->GetIPAddress(), c->GetUDPPort()); + if(m_type == NODE) { + break; + } + } +} + +//If we allow about a 15 sec delay before deleting, we won't miss a lot of delayed returning packets. +void CSearch::PrepareToStop() +{ + if( m_stoping ) { + return; + } + uint32 baseTime = 0; + switch(m_type) { + case NODE: + case NODECOMPLETE: + baseTime = SEARCHNODE_LIFETIME; + break; + case FILE: + baseTime = SEARCHFILE_LIFETIME; + break; + case KEYWORD: + baseTime = SEARCHKEYWORD_LIFETIME; + break; + case NOTES: + baseTime = SEARCHNOTES_LIFETIME; + break; + case STOREFILE: + baseTime = SEARCHSTOREFILE_LIFETIME; + break; + case STOREKEYWORD: + baseTime = SEARCHSTOREKEYWORD_LIFETIME; + break; + case STORENOTES: + baseTime = SEARCHSTORENOTES_LIFETIME; + break; + case FINDBUDDY: + baseTime = SEARCHFINDBUDDY_LIFETIME; + break; + case FINDSOURCE: + baseTime = SEARCHFINDSOURCE_LIFETIME; + break; + default: + baseTime = SEARCH_LIFETIME; + } + m_created = time(NULL) - baseTime + SEC(15); + m_stoping = true; +} + +void CSearch::JumpStart(void) +{ + if (m_possible.empty()) { + PrepareToStop(); + return; + } + + if ((time_t)(m_lastResponse + SEC(3)) > time(NULL)) { + return; + } + + while (!m_possible.empty()) { + + CContact *c = m_possible.begin()->second; + + //Have we already tried to contact this node. + if (m_tried.count(m_possible.begin()->first) > 0) { + //Did we get a response from this node, if so, try to store or get info. + if(m_responded.count(m_possible.begin()->first) > 0) { + StorePacket(); + } + m_possible.erase(m_possible.begin()); + } else { + // Move to tried + m_tried[m_possible.begin()->first] = c; + // Send request + c->CheckingType(); + SendFindValue(c->GetClientID(), c->GetIPAddress(), c->GetUDPPort()); + break; + } + } + +} + +void CSearch::ProcessResponse(uint32 fromIP, uint16 fromPort, ContactList *results) +{ + AddDebugLogLineM(false, logKadSearch, wxT("Process search response from ") + Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(fromIP), fromPort)); + + if (results) { + m_lastResponse = time(NULL); + } + + // Remember the contacts to be deleted when finished + ContactList::iterator response; + for (response = results->begin(); response != results->end(); ++response) { + m_delete.push_back(*response); + } + + // Not interested in responses for FIND_NODE, will be added to contacts by udp listener + if (m_type == NODE) { + AddDebugLogLineM(false, logKadSearch, wxT("Node type search result, discarding.")); + m_uAnswers++; + m_possible.clear(); + delete results; + return; + } + + ContactMap::const_iterator tried; + CContact *c; + CContact *from; + CUInt128 distance; + CUInt128 fromDistance; + + //Find contact that is responding. + for (tried = m_tried.begin(); tried != m_tried.end(); ++tried) { + fromDistance = tried->first; + from = tried->second; + + if ((from->GetIPAddress() == fromIP) && (from->GetUDPPort() == fromPort)) { + // Add to list of people who responded + m_responded[fromDistance] = from; + + // Loop through their responses + for (response = results->begin(); response != results->end(); ++response) { + c = *response; + + distance = c->GetClientID(); + distance.XOR(m_target); + + // Ignore this contact if already know him + if (m_possible.count(distance) > 0) { + // AddDebugLogLineM(false, logKadSearch, wxT("Search result from already known client: ignore")); + continue; + } + if (m_tried.count(distance) > 0) { + // AddDebugLogLineM(false, logKadSearch, wxT("Search result from already tried client: ignore")); + continue; + } + + // Add to possible + m_possible[distance] = c; + + if (distance < fromDistance) { + + bool top = false; + if (m_best.size() < ALPHA_QUERY) { + top = true; + m_best[distance] = c; + } else { + ContactMap::iterator it = m_best.end(); + --it; + if (distance < it->first) { + // Rotate best list + m_best.erase(it); + m_best[distance] = c; + top = true; + } + } + + if (top) { + // Add to tried + m_tried[distance] = c; + // Send request + c->CheckingType(); + SendFindValue(c->GetClientID(), c->GetIPAddress(), c->GetUDPPort()); + } + } + } + + // We don't want anything from these people, so just increment the counter. + if( m_type == NODECOMPLETE ) { + AddDebugLogLineM(false, logKadSearch, wxT("Search result type: Node complete")); + m_uAnswers++; + } + break; + } + } + + delete results; +} + +void CSearch::StorePacket() +{ + wxASSERT(!m_possible.empty()); + + CContact *from; + CUInt128 fromDistance; + ContactMap::const_iterator possible; + + possible = m_possible.begin(); + fromDistance = possible->first; + from = possible->second; + + if(thePrefs::FilterLanIPs() && fromDistance.Get32BitChunk(0) > SEARCHTOLERANCE) { + AddDebugLogLineM(false, logKadSearch, wxT("Not stored: filtered lan ip")); + return; + } + + switch(m_type) { + case FILE: + case KEYWORD: { + if (m_type == FILE) { + AddDebugLogLineM(false, logKadSearch, wxT("Search result type: File")); + AddDebugLogLineM(false, logClientKadUDP, wxT("KadSearchReq (File) ") + Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(from->GetIPAddress()), from->GetUDPPort())); + } else { + AddDebugLogLineM(false, logKadSearch, wxT("Search result type: Keyword")); + AddDebugLogLineM(false, logClientKadUDP, wxT("KadSearchReq (Keyword) ") + Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(from->GetIPAddress()), from->GetUDPPort())); + } + wxASSERT( m_searchTerms->GetLength() > 0 ); + CKademlia::GetUDPListener()->SendPacket(*m_searchTerms, KADEMLIA_SEARCH_REQ, from->GetIPAddress(), from->GetUDPPort()); + m_totalRequestAnswers++; + break; + } + case NOTES: { + AddDebugLogLineM(false, logKadSearch, wxT("Search result type: Notes")); + CMemFile packetdata(34); + packetdata.WriteUInt128(m_target); + packetdata.WriteUInt128(CKademlia::GetPrefs()->GetKadID()); + CKademlia::GetUDPListener()->SendPacket( packetdata, KADEMLIA_SRC_NOTES_REQ, from->GetIPAddress(), from->GetUDPPort()); + m_totalRequestAnswers++; + break; + } + case STOREFILE: { + AddDebugLogLineM(false, logKadSearch, wxT("Search result type: StoreFile")); + if( m_uAnswers > SEARCHSTOREFILE_TOTAL ) { + PrepareToStop(); + break; + } + byte fileid[16]; + m_target.ToByteArray(fileid); + CKnownFile* file = theApp->sharedfiles->GetFileByID(CMD4Hash(fileid)); + if (file) { + m_fileName = file->GetFileName().GetPrintable(); + + CUInt128 id(CKademlia::GetPrefs()->GetClientHash()); + TagPtrList taglist; + + //We can use type for different types of sources. + //1 is reserved for highID sources.. + //2 cannot be used as older clients will not work. + //3 Firewalled Kad Source. + //4 >4GB file HighID Source. + //5 >4GB file Firewalled Kad source. + + if( theApp->IsFirewalled() ) { + if( theApp->clientlist->GetBuddy() ) { + CUInt128 buddyID(true); + buddyID.XOR(CKademlia::GetPrefs()->GetKadID()); + taglist.push_back(new CTagInt8(TAG_SOURCETYPE, file->IsLargeFile() ? 5 : 3)); + taglist.push_back(new CTagVarInt(TAG_SERVERIP, theApp->clientlist->GetBuddy()->GetIP())); + taglist.push_back(new CTagVarInt(TAG_SERVERPORT, theApp->clientlist->GetBuddy()->GetUDPPort())); + byte hashBytes[16]; + buddyID.ToByteArray(hashBytes); + taglist.push_back(new CTagString(TAG_BUDDYHASH, CMD4Hash(hashBytes).Encode())); + taglist.push_back(new CTagVarInt(TAG_SOURCEPORT, thePrefs::GetPort())); + } else { + PrepareToStop(); + break; + } + } else { + taglist.push_back(new CTagInt8(TAG_SOURCETYPE, file->IsLargeFile() ? 4 : 1)); + taglist.push_back(new CTagVarInt(TAG_SOURCEPORT, thePrefs::GetPort())); + } + + // Encryption options Tag + // 5 Reserved (!) + // 1 CryptLayer Required + // 1 CryptLayer Requested + // 1 CryptLayer Supported + const uint8 uSupportsCryptLayer = thePrefs::IsClientCryptLayerSupported() ? 1 : 0; + const uint8 uRequestsCryptLayer = thePrefs::IsClientCryptLayerRequested() ? 1 : 0; + const uint8 uRequiresCryptLayer = thePrefs::IsClientCryptLayerRequired() ? 1 : 0; + const uint8 byCryptOptions = (uRequiresCryptLayer << 2) | (uRequestsCryptLayer << 1) | (uSupportsCryptLayer << 0); + taglist.push_back(new CTagInt8(TAG_ENCRYPTION, byCryptOptions)); + + CKademlia::GetUDPListener()->PublishPacket(from->GetIPAddress(), from->GetUDPPort(),m_target,id, taglist); + m_totalRequestAnswers++; + TagPtrList::const_iterator it; + for (it = taglist.begin(); it != taglist.end(); ++it) { + delete *it; + } + } + break; + } + case STOREKEYWORD: { + AddDebugLogLineM(false, logKadSearch, wxT("Search result type: StoreKeyword")); + + if( (m_uAnswers > SEARCHSTOREKEYWORD_TOTAL) || (m_fileIDs.size() == 0) ) { + PrepareToStop(); + break; + } + + UIntList::iterator itListFileID = m_fileIDs.begin(); + + CMemFile packetdata(1024*50); // Allocate a good amount of space. + uint16 iCount = 0; + uint16 iPacketCount = 0; + packetdata.WriteUInt128(m_target); + packetdata.WriteUInt16(0); // Will be updated before sending. + while ((iCount < 150) && (itListFileID != m_fileIDs.end())) { + CKnownFile* pFile = theApp->sharedfiles->GetFileByID(CMD4Hash(*itListFileID)); + if (pFile) { + iCount++; + iPacketCount++; + packetdata.WriteUInt128(*itListFileID); + PreparePacketForTags( &packetdata, pFile ); + ++itListFileID; + } else { + // File is not shared anymore, remove from list. + itListFileID = m_fileIDs.erase(itListFileID); + } + + // Send packet + if ((iPacketCount == 50) || ((itListFileID == m_fileIDs.end()) && iPacketCount)) { + // Correct the file count. + packetdata.Seek(16,wxFromStart); + packetdata.WriteUInt16(iPacketCount); + if (from->GetVersion() > 1) { + AddDebugLogLineM(false, logClientKadUDP, wxT("Kad2StoreKeywReq ") + Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(from->GetIPAddress()), from->GetUDPPort())); + CKademlia::GetUDPListener()->SendPacket( packetdata, KADEMLIA2_PUBLISH_KEY_REQ, from->GetIPAddress(), from->GetUDPPort()); + } else { + AddDebugLogLineM(false, logClientKadUDP, wxT("KadStoreKeywReq ") + Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(from->GetIPAddress()), from->GetUDPPort())); + CKademlia::GetUDPListener()->SendPacket( packetdata, KADEMLIA_PUBLISH_REQ, from->GetIPAddress(), from->GetUDPPort()); + } + // Now reset the packet data for the next one. + iPacketCount = 0; + packetdata.Reset(); + packetdata.WriteUInt128(m_target); + packetdata.WriteUInt16(0); // Will be updated before sending. + } + } + + m_totalRequestAnswers++; + break; + } + case STORENOTES: { + AddDebugLogLineM(false, logKadSearch, wxT("Search result type: StoreNotes")); + byte fileid[16]; + m_target.ToByteArray(fileid); + CKnownFile* file = theApp->sharedfiles->GetFileByID(CMD4Hash(fileid)); + if (file) { + CMemFile packetdata(1024*2); + packetdata.WriteUInt128(m_target); + packetdata.WriteUInt128(CKademlia::GetPrefs()->GetKadID()); + uint8 tagcount = 1; + if(file->GetFileRating() != 0) { + ++tagcount; + } + if(!file->GetFileComment().IsEmpty()) { + ++tagcount; + } + //Number of tags. + packetdata.WriteUInt8(tagcount); + CTagString fileName(TAG_FILENAME, file->GetFileName().GetPrintable()); + packetdata.WriteTag(fileName); + if(file->GetFileRating() != 0) { + CTagVarInt rating(TAG_FILERATING, file->GetFileRating()); + packetdata.WriteTag(rating); + } + if(!file->GetFileComment().IsEmpty()) { + CTagString description(TAG_DESCRIPTION, file->GetFileComment()); + packetdata.WriteTag(description); + } + + CKademlia::GetUDPListener()->SendPacket( packetdata, KADEMLIA_PUB_NOTES_REQ, from->GetIPAddress(), from->GetUDPPort()); + m_totalRequestAnswers++; + } + break; + } + case FINDBUDDY: + { + AddDebugLogLineM(false, logKadSearch, wxT("Search result type: FindBuddy")); + if( m_uAnswers > SEARCHFINDBUDDY_TOTAL ) { + PrepareToStop(); + break; + } + CMemFile packetdata(34); + packetdata.WriteUInt128(m_target); + packetdata.WriteUInt128(CKademlia::GetPrefs()->GetClientHash()); + packetdata.WriteUInt16(thePrefs::GetPort()); + CKademlia::GetUDPListener()->SendPacket( packetdata, KADEMLIA_FINDBUDDY_REQ, from->GetIPAddress(), from->GetUDPPort()); + m_uAnswers++; + break; + } + case FINDSOURCE: + { + AddDebugLogLineM(false, logKadSearch, wxT("Search result type: FindSource")); + if( m_uAnswers > SEARCHFINDSOURCE_TOTAL ) { + PrepareToStop(); + break; + } + CMemFile packetdata(34); + packetdata.WriteUInt128(m_target); + if( m_fileIDs.size() != 1) { + throw wxString(wxT("Kademlia.CSearch.processResponse: m_fileIDs.size() != 1")); + } + packetdata.WriteUInt128(m_fileIDs.front()); + packetdata.WriteUInt16(thePrefs::GetPort()); + CKademlia::GetUDPListener()->SendPacket( packetdata, KADEMLIA_CALLBACK_REQ, from->GetIPAddress(), from->GetUDPPort()); + m_uAnswers++; + break; + } + case NODECOMPLETE: + AddDebugLogLineM(false, logKadSearch, wxT("Search result type: NodeComplete")); + break; + case NODE: + AddDebugLogLineM(false, logKadSearch, wxT("Search result type: Node")); + break; + default: + AddDebugLogLineM(false, logKadSearch, wxString::Format(wxT("Search result type: Unknown (%i)"),m_type)); + break; + } +} + +void CSearch::ProcessResult(uint32 fromIP, uint16 fromPort, const CUInt128 &answer, TagPtrList *info) +{ + wxString type = wxT("Unknown"); + switch(m_type) { + case FILE: + type = wxT("File"); + ProcessResultFile(fromIP, fromPort, answer, info); + break; + case KEYWORD: + type = wxT("Keyword"); + ProcessResultKeyword(fromIP, fromPort, answer, info); + break; + case NOTES: + type = wxT("Notes"); + ProcessResultNotes(fromIP, fromPort, answer, info); + break; + } + AddDebugLogLineM(false, logKadSearch, wxT("Got result ") + type + wxT(" from ") + Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(fromIP),fromPort)); +} + +void CSearch::ProcessResultFile(uint32 WXUNUSED(fromIP), uint16 WXUNUSED(fromPort), const CUInt128 &answer, TagPtrList *info) +{ + uint8 type = 0; + uint32 ip = 0; + uint16 tcp = 0; + uint16 udp = 0; + uint32 serverip = 0; + uint16 serverport = 0; + uint32 clientid = 0; + uint8 byCryptOptions = 0; + CUInt128 buddy; + + CTag *tag; + TagPtrList::const_iterator it; + for (it = info->begin(); it != info->end(); ++it) { + tag = *it; + if (!tag->GetName().Cmp(TAG_SOURCETYPE)) { + type = tag->GetInt(); + } else if (!tag->GetName().Cmp(TAG_SOURCEIP)) { + ip = tag->GetInt(); + } else if (!tag->GetName().Cmp(TAG_SOURCEPORT)) { + tcp = tag->GetInt(); + } else if (!tag->GetName().Cmp(TAG_SOURCEUPORT)) { + udp = tag->GetInt(); + } else if (!tag->GetName().Cmp((TAG_SERVERIP))) { + serverip = tag->GetInt(); + } else if (!tag->GetName().Cmp(TAG_SERVERPORT)) { + serverport = tag->GetInt(); + } else if (!tag->GetName().Cmp(TAG_CLIENTLOWID)) { + clientid = tag->GetInt(); + } else if (!tag->GetName().Cmp(TAG_BUDDYHASH)) { + CMD4Hash hash; + // TODO: Error handling + if (!hash.Decode(tag->GetStr())) { +#ifdef __DEBUG__ + printf("Invalid buddy-hash: '%s'\n", (const char*)tag->GetStr().fn_str()); +#endif + } + buddy.SetValueBE(hash.GetHash()); + } else if (!tag->GetName().Cmp(TAG_ENCRYPTION)) { + byCryptOptions = (uint8)tag->GetInt(); + } + + delete tag; + } + delete info; + + switch( type ) { + case 1: + case 3: + case 4: + case 5: + m_uAnswers++; + theApp->downloadqueue->KademliaSearchFile(m_searchID, &answer, &buddy, type, ip, tcp, udp, serverip, serverport, byCryptOptions); + break; + case 2: + //Don't use this type, some clients will process it wrong. + default: + break; + } +} + +void CSearch::ProcessResultNotes(uint32 WXUNUSED(fromIP), uint16 WXUNUSED(fromPort), const CUInt128 &answer, TagPtrList *info) +{ + CEntry* entry = new CEntry(); + entry->m_iKeyID.SetValue(m_target); + entry->m_iSourceID.SetValue(answer); + + bool bFilterComment = false; + + CTag *tag; + TagPtrList::const_iterator it; + for (it = info->begin(); it != info->end(); it++) { + tag = *it; + if (!tag->GetName().Cmp(TAG_SOURCEIP)) { + entry->m_iIP = tag->GetInt(); + delete tag; + } else if (!tag->GetName().Cmp(TAG_SOURCEPORT)) { + entry->m_iTCPport = tag->GetInt(); + delete tag; + } else if (!tag->GetName().Cmp(TAG_FILENAME)) { + entry->m_sFileName = tag->GetStr(); + delete tag; + } else if (!tag->GetName().Cmp(TAG_DESCRIPTION)) { + wxString strComment(tag->GetStr()); + bFilterComment = thePrefs::IsMessageFiltered(strComment); + entry->m_lTagList.push_front(tag); + } else if (!tag->GetName().Cmp(TAG_FILERATING)) { + entry->m_lTagList.push_front(tag); + } else { + delete tag; + } + } + delete info; + + if (bFilterComment) { + delete entry; + return; + } + + byte fileid[16]; + m_target.ToByteArray(fileid); + const CMD4Hash fileHash(fileid); + + //Check if this hash is in our shared files.. + CKnownFile* file = theApp->sharedfiles->GetFileByID(fileHash); + + if (!file) { + // If we didn't find anything check if it's in our download queue. + file = (CKnownFile*)theApp->downloadqueue->GetFileByID(fileHash); + } + + if (file) { + // Ok, found the file. Add the note to it. + m_uAnswers++; + file->AddNote(entry); + } else { + AddDebugLogLineM(false, logKadSearch, wxT("Comment received for unknown file")); + } +} + +void CSearch::ProcessResultKeyword(uint32 WXUNUSED(fromIP), uint16 WXUNUSED(fromPort), const CUInt128 &answer, TagPtrList *info) +{ + bool interested = false; + wxString name; + uint64 size = 0; + wxString type; + wxString format; + wxString artist; + wxString album; + wxString title; + uint32 length = 0; + wxString codec; + uint32 bitrate = 0; + uint32 availability = 0; + + for (TagPtrList::const_iterator it = info->begin(); it != info->end(); ++it) { + CTag* tag = *it; + if (tag->GetName() == TAG_FILENAME) { + name = tag->GetStr(); + interested = !name.IsEmpty(); + } else if (tag->GetName() == TAG_FILESIZE) { + if (tag->IsBsob() && (tag->GetBsobSize() == 8)) { + // Kad1.0 uint64 type using a BSOB. + size = PeekUInt64(tag->GetBsob()); + } else { + wxASSERT(tag->IsInt()); + size = tag->GetInt(); + } + } else if (tag->GetName() == TAG_FILETYPE) { + type = tag->GetStr(); + } else if (tag->GetName() == TAG_FILEFORMAT) { + format = tag->GetStr(); + } else if (tag->GetName() == TAG_MEDIA_ARTIST) { + artist = tag->GetStr(); + } else if (tag->GetName() == TAG_MEDIA_ALBUM) { + album = tag->GetStr(); + } else if (tag->GetName() == TAG_MEDIA_TITLE) { + title = tag->GetStr(); + } else if (tag->GetName() == TAG_MEDIA_LENGTH) { + length = tag->GetInt(); + } else if (tag->GetName() == TAG_MEDIA_BITRATE) { + bitrate = tag->GetInt(); + } else if (tag->GetName() == TAG_MEDIA_CODEC) { + codec = tag->GetStr(); + } else if (tag->GetName() == TAG_SOURCES) { + availability = tag->GetInt(); + if( availability > 65500 ) { + availability = 0; + } + } + delete tag; + } + delete info; + + TagPtrList taglist; + + if (!format.IsEmpty()) { + taglist.push_back(new CTagString(TAG_FILEFORMAT, format)); + } + if (!artist.IsEmpty()) { + taglist.push_back(new CTagString(TAG_MEDIA_ARTIST, artist)); + } + if (!album.IsEmpty()) { + taglist.push_back(new CTagString(TAG_MEDIA_ALBUM, album)); + } + if (!title.IsEmpty()) { + taglist.push_back(new CTagString(TAG_MEDIA_TITLE, title)); + } + if (length) { + taglist.push_back(new CTagVarInt(TAG_MEDIA_LENGTH, length)); + } + if (bitrate) { + taglist.push_back(new CTagVarInt(TAG_MEDIA_BITRATE, bitrate)); + } + if (availability) { + taglist.push_back(new CTagVarInt(TAG_SOURCES, availability)); + } + + if (interested) { + m_uAnswers++; + theApp->searchlist->KademliaSearchKeyword(m_searchID, &answer, name, size, type, taglist); + } else { + printf("Not adding search results: not interested\n"); + } + + // Free tags memory + for (TagPtrList::iterator it = taglist.begin(); it != taglist.end(); ++it) { + delete (*it); + } + +} + +void CSearch::SendFindValue(const CUInt128 &check, uint32 ip, uint16 port) +{ + try { + if(m_stoping) { + return; + } + CMemFile packetdata(33); + switch(m_type){ + case NODE: + case NODECOMPLETE: + packetdata.WriteUInt8(KADEMLIA_FIND_NODE); + break; + case FILE: + case KEYWORD: + case FINDSOURCE: + case NOTES: + packetdata.WriteUInt8(KADEMLIA_FIND_VALUE); + break; + case FINDBUDDY: + case STOREFILE: + case STOREKEYWORD: + case STORENOTES: + packetdata.WriteUInt8(KADEMLIA_STORE); + break; + default: + AddDebugLogLineM(false, logKadSearch, wxT("Invalid search type. (CSearch::sendFindValue)")); + return; + } + packetdata.WriteUInt128(m_target); + packetdata.WriteUInt128(check); + m_kadPacketSent++; + #ifdef __DEBUG__ + wxString Type; + switch(m_type) { + case NODE: + Type = wxT("KadReqFindNode"); + break; + case NODECOMPLETE: + Type = wxT("KadReqFindNodeCompl"); + break; + case FILE: + Type = wxT("KadReqFindFile"); + break; + case KEYWORD: + Type = wxT("KadReqFindKeyw"); + break; + case STOREFILE: + Type = wxT("KadReqStoreFile"); + break; + case STOREKEYWORD: + Type = wxT("KadReqStoreKeyw"); + break; + case STORENOTES: + Type = wxT("KadReqStoreNotes"); + break; + case NOTES: + Type = wxT("KadReqNotes"); + break; + default: + Type = wxT("KadReqUnknown"); + } + AddDebugLogLineM(false, logClientKadUDP, Type + wxT(" to ") + Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip),port)); + #endif + + CKademlia::GetUDPListener()->SendPacket(packetdata, KADEMLIA_REQ, ip, port); + } catch (const CEOFException& err) { + AddDebugLogLineM(true, logKadIndex, wxT("CEOFException in CIndexed::sendFindValue: ") + err.what()); + } catch (const CInvalidPacket& err) { + AddDebugLogLineM(true, logKadIndex, wxT("CInvalidPacket Exception in CIndexed::sendFindValue: ") + err.what()); + } catch (const wxString& e) { + AddDebugLogLineM(true, logKadIndex, wxT("Exception in CIndexed::sendFindValue: ") + e); + } +} + +void CSearch::AddFileID(const CUInt128& id) +{ + m_fileIDs.push_back(id); +} + +void CSearch::PreparePacketForTags( CMemFile *bio, CKnownFile *file) +{ + TagPtrList taglist; + + try { + if( file && bio ) { + // Name, Size + taglist.push_back(new CTagString(TAG_FILENAME, file->GetFileName().GetPrintable())); + if (file->IsLargeFile()) { + byte size64[sizeof(uint64)]; + PokeUInt64(size64,file->GetFileSize()); + taglist.push_back(new CTagBsob(TAG_FILESIZE, size64, sizeof(uint64))); + } else { + taglist.push_back(new CTagVarInt(TAG_FILESIZE, file->GetFileSize())); + } + taglist.push_back(new CTagVarInt(TAG_SOURCES, + std::max((uint32)1, (uint32)file->m_nCompleteSourcesCount))); + + // eD2K file type (Audio, Video, ...) + // NOTE: Archives and CD-Images are published with file type "Pro" + wxString strED2KFileType(GetED2KFileTypeSearchTerm(GetED2KFileTypeID(file->GetFileName()))); + if (!strED2KFileType.IsEmpty()) { + taglist.push_back(new CTagString(TAG_FILETYPE, strED2KFileType)); + } + + // file format (filename extension) + const wxString strExt = file->GetFileName().GetExt(); + if (!strExt.IsEmpty()) { + taglist.push_back(new CTagString(TAG_FILEFORMAT, strExt)); + } + + // additional meta data (Artist, Album, Codec, Length, ...) + // only send verified meta data to nodes + if (file->GetMetaDataVer() > 0) { + static const struct{ + uint8 nName; + uint8 nType; + } _aMetaTags[] = + { + { FT_MEDIA_ARTIST, 2 }, + { FT_MEDIA_ALBUM, 2 }, + { FT_MEDIA_TITLE, 2 }, + { FT_MEDIA_LENGTH, 3 }, + { FT_MEDIA_BITRATE, 3 }, + { FT_MEDIA_CODEC, 2 } + }; + for (unsigned int i = 0; i < itemsof(_aMetaTags); i++) { + const ::CTag* pTag = file->GetTag(_aMetaTags[i].nName, _aMetaTags[i].nType); + if (pTag) { + // skip string tags with empty string values + if (pTag->IsStr() && pTag->GetStr().IsEmpty()) { + continue; + } + // skip integer tags with '0' values + if (pTag->IsInt() && pTag->GetInt() == 0) { + continue; + } + wxString szKadTagName = wxString::Format(wxT("%c"),pTag->GetNameID()); + if (pTag->IsStr()) { + taglist.push_back(new CTagString(szKadTagName, pTag->GetStr())); + } else { + taglist.push_back(new CTagVarInt(szKadTagName, pTag->GetInt())); + } + } + } + } + bio->WriteTagPtrList(taglist); + } else { + //If we get here.. Bad things happen.. Will fix this later if it is a real issue. + wxASSERT(0); + } + } catch (const CEOFException& err) { + AddDebugLogLineM(true, logKadIndex, wxT("CEOFException in CIndexed::PreparePacketForTags: ") + err.what()); + } catch (const CInvalidPacket& err) { + AddDebugLogLineM(true, logKadIndex, wxT("CInvalidPacket Exception in CIndexed::PreparePacketForTags: ") + err.what()); + } catch (const wxString& e) { + AddDebugLogLineM(true, logKadIndex, wxT("Exception in CIndexed::PreparePacketForTags: ") + e); + } + + for (TagPtrList::const_iterator it = taglist.begin(); it != taglist.end(); ++it) { + delete *it; + } +} + +uint32 CSearch::GetNodeLoad() const +{ + if( m_totalLoadResponses == 0 ) { + return 0; + } + return m_totalLoad/m_totalLoadResponses; +} + +uint32 CSearch::GetAnswers() const { + // Each 50 files make for a response packet, so we have to convert this from packet responses to full store responses. + return (m_fileIDs.size() ? m_uAnswers/((m_fileIDs.size()+49)/50) : m_uAnswers); +} + +// File_checked_for_headers diff --git a/src/kademlia/kademlia/Search.h b/src/kademlia/kademlia/Search.h new file mode 100644 index 00000000..da392136 --- /dev/null +++ b/src/kademlia/kademlia/Search.h @@ -0,0 +1,137 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#ifndef __SEARCH_H__ +#define __SEARCH_H__ + +#include "SearchManager.h" + +class CKnownFile; +class CMemFile; +class CTag; + +//////////////////////////////////////// +namespace Kademlia { +//////////////////////////////////////// + +void deleteTagPtrListEntries(TagPtrList* taglist); + +class CSearch +{ + friend class CSearchManager; + +public: + uint32 GetSearchID() const {return m_searchID;} + uint32 GetSearchTypes() const {return m_type;} + void SetSearchTypes( uint32 val ) {m_type = val;} + void SetTargetID( CUInt128 val ) {m_target = val;} + + uint32 GetKadPacketSent() const {return m_kadPacketSent;} + uint32 GetRequestAnswer() const {return m_totalRequestAnswers;} + void StorePacket(); + + CUInt128 m_keywordPublish; //Need to make this private... + const wxString& GetFileName(void) const { return m_fileName; } + void SetFileName(const wxString& fileName) { m_fileName = fileName; } + CUInt128 GetTarget(void) const {return m_target;} + void AddFileID(const CUInt128& id); + void PreparePacketForTags( CMemFile* packet, CKnownFile* file ); + bool Stoping(void) const {return m_stoping;} + uint32 GetNodeLoad() const; + uint32 GetNodeLoadResonse() const {return m_totalLoadResponses;} + uint32 GetNodeLoadTotal() const {return m_totalLoad;} + void UpdateNodeLoad( uint8 load ){ m_totalLoad += load; m_totalLoadResponses++; } + uint32 GetAnswers() const; + + enum + { + NODE, + NODECOMPLETE, + FILE, + KEYWORD, + NOTES, + STOREFILE, + STOREKEYWORD, + STORENOTES, + FINDBUDDY, + FINDSOURCE + }; + + CSearch(); + ~CSearch(); + +private: + void Go(void); + void ProcessResponse(uint32 fromIP, uint16 fromPort, ContactList *results); + void ProcessResult(uint32 fromIP, uint16 fromPort, const CUInt128 &answer, TagPtrList *info); + void ProcessResultFile(uint32 fromIP, uint16 fromPort, const CUInt128 &answer, TagPtrList *info); + void ProcessResultKeyword(uint32 fromIP, uint16 fromPort, const CUInt128 &answer, TagPtrList *info); + void ProcessResultNotes(uint32 fromIP, uint16 fromPort, const CUInt128 &answer, TagPtrList *info); + void JumpStart(void); + void SendFindValue(const CUInt128 &check, uint32 ip, uint16 port); + void PrepareToStop(void); + + bool m_stoping; + time_t m_created; + uint32 m_type; + uint32 m_uAnswers; + uint32 m_totalRequestAnswers; + uint32 m_kadPacketSent; //Used for gui reasons.. May not be needed later.. + uint32 m_totalLoad; + uint32 m_totalLoadResponses; + uint32 m_lastResponse; + + uint32 m_searchID; + CUInt128 m_target; + CMemFile* m_searchTerms; + WordList m_words; + wxString m_fileName; + UIntList m_fileIDs; + + ContactMap m_possible; + ContactMap m_tried; + ContactMap m_responded; + ContactMap m_best; + ContactList m_delete; + ContactMap m_inUse; +}; + +} // End namespace + +#endif //__SEARCH_H__ +// File_checked_for_headers diff --git a/src/kademlia/kademlia/SearchManager.cpp b/src/kademlia/kademlia/SearchManager.cpp new file mode 100644 index 00000000..e6b9c409 --- /dev/null +++ b/src/kademlia/kademlia/SearchManager.cpp @@ -0,0 +1,530 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#include + +#include "Search.h" + +#include + +#include "Indexed.h" +#include "Defines.h" +#include "../routing/Contact.h" +#include "../../MemFile.h" +#include "../../Logger.h" + +#include + +wxChar* InvKadKeywordChars = wxT(" ()[]{}<>,._-!?:;\\/"); + +//////////////////////////////////////// +using namespace Kademlia; +//////////////////////////////////////// + +uint32 CSearchManager::m_nextID = 0; +SearchMap CSearchManager::m_searches; + +void CSearchManager::StopSearch(uint32 searchID, bool delayDelete) +{ + if(searchID == (uint32)-1) { + return; + } + + SearchMap::iterator it = m_searches.begin(); + while ( it != m_searches.end()) { + if (it->second->m_searchID == searchID) { + if(delayDelete) { + it->second->PrepareToStop(); + ++it; + } else { + delete it->second; + m_searches.erase(it++); + } + } else { + ++it; + } + } +} + +bool CSearchManager::IsNodeSearch(const CUInt128 &target) +{ + SearchMap::iterator it = m_searches.begin(); + while (it != m_searches.end()) { + if (it->second->m_target == target) { + return it->second->m_type == CSearch::NODE || + it->second->m_type == CSearch::NODECOMPLETE; + } else { + ++it; + } + } + + return false; +} + +void CSearchManager::StopAllSearches(void) +{ + SearchMap::iterator it; + for (it = m_searches.begin(); it != m_searches.end(); ++it) { + delete it->second; + } + + m_searches.clear(); +} + +bool CSearchManager::StartSearch(CSearch* pSearch) +{ + if (AlreadySearchingFor(pSearch->m_target)) { + delete pSearch; + return false; + } + m_searches[pSearch->m_target] = pSearch; + pSearch->Go(); + return true; +} + +void CSearchManager::DeleteSearch(CSearch* pSearch) +{ + delete pSearch; +} + +CSearch* CSearchManager::PrepareFindKeywords(const wxString& keyword, CMemFile* ed2k_packet, uint32 searchid) +{ + CSearch *s = new CSearch; + try { + s->m_type = CSearch::KEYWORD; + + // This will actually get the first word. + GetWords(keyword, &s->m_words); + if (s->m_words.size() == 0) { + throw wxString(_("Kademlia: search keyword too short")); + } + + wxString wstrKeyword = s->m_words.front(); + + printf("Keyword for search: %s\n",(const char*)unicode2char(wstrKeyword)); + + // Kry - I just decided to assume everyone is unicoded + KadGetKeywordHash(wstrKeyword, &s->m_target); + + if (AlreadySearchingFor(s->m_target)) { + throw wxT("Kademlia: Search keyword is already on search list: ") + wstrKeyword; + } + + // Write complete packet + s->m_searchTerms = ed2k_packet; + s->m_searchTerms->Seek(0,wxFromStart); + s->m_searchTerms->WriteUInt128(s->m_target); + if (s->m_searchTerms->GetLength() > (16 /*uint128*/ + 1 /*uint8*/)) { + // There is actually ed2k search data + s->m_searchTerms->WriteUInt8(1); + } // 0 is default, no need for else branch + + // if called from external client - use predefined search id + s->m_searchID = ((searchid & 0xffffff00) == 0xffffff00) ? searchid : ++m_nextID; + + m_searches[s->m_target] = s; + s->Go(); + } catch (const CEOFException& err) { + delete s; + wxString strError = wxT("CEOFException in ") + wxString::FromAscii(__FUNCTION__) + wxT(": ") + err.what(); + throw strError; + } catch (const CInvalidPacket& err) { + delete s; + wxString strError = wxT("CInvalidPacket exception in ") + wxString::FromAscii(__FUNCTION__) + wxT(": ") + err.what(); + throw strError; + } catch (...) { + delete s; + throw; + } + return s; +} + +CSearch* CSearchManager::PrepareLookup(uint32 type, bool start, const CUInt128 &id) +{ + + if(AlreadySearchingFor(id)) { + return NULL; + } + + CSearch *s = new CSearch; + try { + switch(type) { + case CSearch::STOREKEYWORD: + if(!Kademlia::CKademlia::GetIndexed()->SendStoreRequest(id)) { + delete s; + return NULL; + } + break; + } + + s->m_type = type; + s->m_target = id; + + // Write complete packet + s->m_searchTerms = new CMemFile(); + s->m_searchTerms->WriteUInt128(s->m_target); + s->m_searchTerms->WriteUInt8(1); + + s->m_searchID = ++m_nextID; + if( start ) { + m_searches[s->m_target] = s; + s->Go(); + } + }catch (const CEOFException& err) { + delete s; + AddDebugLogLineM( false, logKadSearch, wxT("CEOFException in ") + wxString::FromAscii(__FUNCTION__) + wxT(": ") + err.what()); + return NULL; + } catch (const CInvalidPacket& err) { + delete s; + AddDebugLogLineM( false, logKadSearch, wxT("CInvalidPacket exception in ") + wxString::FromAscii(__FUNCTION__) + wxT(": ") + err.what()); + return NULL; + } catch (...) { + AddDebugLogLineM(false, logKadSearch, + wxT("Exception in CSearchManager::prepareLookup")); + delete s; + throw; + } + + return s; +} + +void CSearchManager::FindNode(const CUInt128 &id) +{ + if (AlreadySearchingFor(id)) { + return; + } + + CSearch *s = new CSearch; + s->m_type = CSearch::NODE; + s->m_target = id; + s->m_searchTerms = NULL; + m_searches[s->m_target] = s; + s->Go(); +} + +void CSearchManager::FindNodeComplete(const CUInt128 &id) +{ + if (AlreadySearchingFor(id)) { + return; + } + + CSearch *s = new CSearch; + s->m_type = CSearch::NODECOMPLETE; + s->m_target = id; + s->m_searchTerms = NULL; + m_searches[s->m_target] = s; + s->Go(); +} + +bool CSearchManager::AlreadySearchingFor(const CUInt128 &target) +{ + return m_searches.count(target); +} + +void CSearchManager::GetWords(const wxString& str, WordList *words) +{ + int len = 0; + wxString current_word; + wxStringTokenizer tkz(str, InvKadKeywordChars); + while (tkz.HasMoreTokens()) { + current_word = tkz.GetNextToken(); + + if ((len = current_word.Length()) > 2) { + current_word.MakeLower(); + words->remove(current_word); + words->push_back(current_word); + } + } + // If the last word is 3 bytes long, chances are it's a file extension. + if(words->size() > 1 && len == 3) { + words->pop_back(); + } +} + +void CSearchManager::JumpStart(void) +{ + time_t now = time(NULL); + SearchMap::iterator next_it = m_searches.begin(); + while (next_it != m_searches.end()) { + SearchMap::iterator current_it = next_it++; /* don't change this to a ++next_it! */ + switch(current_it->second->GetSearchTypes()){ + case CSearch::FILE: { + if (current_it->second->m_created + SEARCHFILE_LIFETIME < now) { + delete current_it->second; + m_searches.erase(current_it); + } else if ( current_it->second->GetAnswers() > SEARCHFILE_TOTAL || + current_it->second->m_created + SEARCHFILE_LIFETIME - SEC(20) < now) { + current_it->second->PrepareToStop(); + } else { + current_it->second->JumpStart(); + } + break; + } + case CSearch::KEYWORD: { + if (current_it->second->m_created + SEARCHKEYWORD_LIFETIME < now) { + delete current_it->second; + m_searches.erase(current_it); + } else if ( current_it->second->GetAnswers() > SEARCHKEYWORD_TOTAL || + current_it->second->m_created + SEARCHKEYWORD_LIFETIME - SEC(20) < now) { + current_it->second->PrepareToStop(); + } else { + current_it->second->JumpStart(); + } + break; + } + case CSearch::NOTES: { + if (current_it->second->m_created + SEARCHNOTES_LIFETIME < now) { + delete current_it->second; + m_searches.erase(current_it); + } else if ( current_it->second->GetAnswers() > SEARCHNOTES_TOTAL || + current_it->second->m_created + SEARCHNOTES_LIFETIME - SEC(20) < now) { + current_it->second->PrepareToStop(); + } else { + current_it->second->JumpStart(); + } + break; + } + case CSearch::FINDBUDDY: { + if (current_it->second->m_created + SEARCHFINDBUDDY_LIFETIME < now) { + delete current_it->second; + m_searches.erase(current_it); + } else if ( current_it->second->GetAnswers() > SEARCHFINDBUDDY_TOTAL || + current_it->second->m_created + SEARCHFINDBUDDY_LIFETIME - SEC(20) < now) { + current_it->second->PrepareToStop(); + } else { + current_it->second->JumpStart(); + } + break; + } + case CSearch::FINDSOURCE: { + if (current_it->second->m_created + SEARCHFINDSOURCE_LIFETIME < now) { + delete current_it->second; + m_searches.erase(current_it); + } else if ( current_it->second->GetAnswers() > SEARCHFINDSOURCE_TOTAL || + current_it->second->m_created + SEARCHFINDSOURCE_LIFETIME - SEC(20) < now) { + current_it->second->PrepareToStop(); + } else { + current_it->second->JumpStart(); + } + break; + } + case CSearch::NODE: { + if (current_it->second->m_created + SEARCHNODE_LIFETIME < now) { + delete current_it->second; + m_searches.erase(current_it); + } else { + current_it->second->JumpStart(); + } + break; + } + case CSearch::NODECOMPLETE: { + if (current_it->second->m_created + SEARCHNODE_LIFETIME < now) { + CKademlia::GetPrefs()->SetPublish(true); + delete current_it->second; + m_searches.erase(current_it); + } else if ( (current_it->second->m_created + SEARCHNODECOMP_LIFETIME < now) && + (current_it->second->GetAnswers() > SEARCHNODECOMP_TOTAL)) { + CKademlia::GetPrefs()->SetPublish(true); + delete current_it->second; + m_searches.erase(current_it); + } else { + current_it->second->JumpStart(); + } + break; + } + case CSearch::STOREFILE: { + if (current_it->second->m_created + SEARCHSTOREFILE_LIFETIME < now) { + delete current_it->second; + m_searches.erase(current_it); + } else if ( current_it->second->GetAnswers() > SEARCHSTOREFILE_TOTAL || + current_it->second->m_created + SEARCHSTOREFILE_LIFETIME - SEC(20) < now) { + current_it->second->PrepareToStop(); + } else { + current_it->second->JumpStart(); + } + break; + } + case CSearch::STOREKEYWORD: { + if (current_it->second->m_created + SEARCHSTOREKEYWORD_LIFETIME < now) { + delete current_it->second; + m_searches.erase(current_it); + } else if ( current_it->second->GetAnswers() > SEARCHSTOREKEYWORD_TOTAL || + current_it->second->m_created + SEARCHSTOREKEYWORD_LIFETIME - SEC(20)< now) { + current_it->second->PrepareToStop(); + } else { + current_it->second->JumpStart(); + } + break; + } + case CSearch::STORENOTES: { + if (current_it->second->m_created + SEARCHSTORENOTES_LIFETIME < now) { + delete current_it->second; + m_searches.erase(current_it); + } else if ( current_it->second->GetAnswers() > SEARCHSTORENOTES_TOTAL || + current_it->second->m_created + SEARCHSTORENOTES_LIFETIME - SEC(20)< now) { + current_it->second->PrepareToStop(); + } else { + current_it->second->JumpStart(); + } + break; + } + default: { + if (current_it->second->m_created + SEARCH_LIFETIME < now) { + delete current_it->second; + m_searches.erase(current_it); + } else { + current_it->second->JumpStart(); + } + break; + } + } + } +} + +void CSearchManager::UpdateStats(void) +{ + uint8 m_totalFile = 0; + uint8 m_totalStoreSrc = 0; + uint8 m_totalStoreKey = 0; + uint8 m_totalSource = 0; + uint8 m_totalNotes = 0; + uint8 m_totalStoreNotes = 0; + + for (SearchMap::iterator it = m_searches.begin(); it != m_searches.end(); ++it) { + switch(it->second->GetSearchTypes()){ + case CSearch::FILE: { + m_totalFile++; + break; + } + case CSearch::STOREFILE: { + m_totalStoreSrc++; + break; + } + case CSearch::STOREKEYWORD: { + m_totalStoreKey++; + break; + } + case CSearch::FINDSOURCE: { + m_totalSource++; + break; + } + case CSearch::STORENOTES: { + m_totalStoreNotes++; + break; + } + case CSearch::NOTES: { + m_totalNotes++; + break; + } + default: + break; + } + } + + CPrefs *prefs = CKademlia::GetPrefs(); + prefs->SetTotalFile(m_totalFile); + prefs->SetTotalStoreSrc(m_totalStoreSrc); + prefs->SetTotalStoreKey(m_totalStoreKey); + prefs->SetTotalSource(m_totalSource); + prefs->SetTotalNotes(m_totalNotes); + prefs->SetTotalStoreNotes(m_totalStoreNotes); +} + +void CSearchManager::ProcessPublishResult(const CUInt128 &target, const uint8 load, const bool loadResponse) +{ + CSearch *s = NULL; + SearchMap::const_iterator it = m_searches.find(target); + if (it != m_searches.end()) { + s = it->second; + } + + if (s == NULL) { +// AddDebugLogLineM(false, logKadSearch, +// wxT("Search either never existed or receiving late results (CSearchManager::ProcessPublishResults)")); + return; + } + + s->m_uAnswers++; + if( loadResponse ) { + s->UpdateNodeLoad( load ); + } +} + + +void CSearchManager::ProcessResponse(const CUInt128 &target, uint32 fromIP, uint16 fromPort, ContactList *results) +{ + CSearch *s = NULL; + SearchMap::const_iterator it = m_searches.find(target); + if (it != m_searches.end()) { + s = it->second; + } + + if (s == NULL) { + AddDebugLogLineM(false, logKadSearch, + wxT("Search either never existed or receiving late results (CSearchManager::processResponse)")); + ContactList::const_iterator it2; + for (it2 = results->begin(); it2 != results->end(); ++it2) { + delete (*it2); + } + delete results; + return; + } else { + s->ProcessResponse(fromIP, fromPort, results); + } +} + +void CSearchManager::ProcessResult(const CUInt128 &target, uint32 fromIP, uint16 fromPort, const CUInt128 &answer, TagPtrList *info) +{ + CSearch *s = NULL; + SearchMap::const_iterator it = m_searches.find(target); + if (it != m_searches.end()) { + s = it->second; + } + + if (s == NULL) { + AddDebugLogLineM (false, logKadSearch, + wxT("Search either never existed or receiving late results (CSearchManager::processResult)")); + for (TagPtrList::const_iterator tagIt = info->begin(); tagIt != info->end(); tagIt++) { + delete *tagIt; + } + delete info; + } else { + s->ProcessResult(fromIP, fromPort, answer, info); + } +} +// File_checked_for_headers diff --git a/src/kademlia/kademlia/SearchManager.h b/src/kademlia/kademlia/SearchManager.h new file mode 100644 index 00000000..6636ed3e --- /dev/null +++ b/src/kademlia/kademlia/SearchManager.h @@ -0,0 +1,114 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#ifndef __SEARCHMANAGER_H__ +#define __SEARCHMANAGER_H__ + +#include "../utils/UInt128.h" +#include "../routing/Maps.h" +#include "../../Tag.h" + +class CMemFile; + +//////////////////////////////////////// +namespace Kademlia { +//////////////////////////////////////// + +class CSearch; +class CRoutingZone; + +// If type is unknown it will be an empty string +// If there are any properties about the file to report, there will follow LPCSTR key/value pairs. +//typedef void (CALLBACK *SEARCH_KEYWORD_CALLBACK)(uint32 searchID, CUInt128 fileID, wxString name, uint32 size, wxString type, uint16 numProperties, ...); +//typedef void (CALLBACK *SEARCH_ID_CALLBACK)(uint32 searchID, CUInt128 contactID, uint8 type, uint32 ip, uint16 tcp, uint16 udp, uint32 serverip, uint16 port); + +typedef std::list WordList; +typedef std::map SearchMap; + +#define SEARCH_IMAGE "-image" +#define SEARCH_AUDIO "-audio" +#define SEARCH_VIDEO "-video" +#define SEARCH_DOC "-doc" +#define SEARCH_PRO "-pro" + +class CSearchManager +{ + friend class CRoutingZone; + friend class CKademlia; + +public: + + static void StopSearch(uint32 searchID, bool delayDelete); + static void StopAllSearches(void); + + // Search for a particular file + // Will return unique search id, returns zero if already searching for this file. + static CSearch* PrepareLookup(uint32 type, bool start, const CUInt128 &id); + + // Will return unique search id, returns zero if already searching for this keyword. + static CSearch* PrepareFindKeywords(const wxString& keyword, CMemFile* ed2k_packet, uint32 searchid); + + static bool StartSearch(CSearch* pSearch); + static void DeleteSearch(CSearch* pSearch); + + static void ProcessResponse(const CUInt128 &target, uint32 fromIP, uint16 fromPort, ContactList *results); + static void ProcessResult(const CUInt128 &target, uint32 fromIP, uint16 fromPort, const CUInt128 &answer, TagPtrList *info); + static void ProcessPublishResult(const CUInt128 &target, const uint8 load, const bool loadResponse); + + static void GetWords(const wxString& str, WordList *words); + + static void UpdateStats(void); + + static bool IsNodeSearch(const CUInt128 &target); + + static bool AlreadySearchingFor(const CUInt128 &target); +private: + + static void FindNode(const CUInt128 &id); + static void FindNodeComplete(const CUInt128 &id); + + static uint32 m_nextID; + static SearchMap m_searches; + + static void JumpStart(void); +}; + +} // End namespace + +#endif // __SEARCHMANAGER_H__ +// File_checked_for_headers diff --git a/src/kademlia/kademlia/Tag.h b/src/kademlia/kademlia/Tag.h new file mode 100644 index 00000000..22fda946 --- /dev/null +++ b/src/kademlia/kademlia/Tag.h @@ -0,0 +1,46 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#ifndef __KAD_TAG_H__ +#define __KAD_TAG_H__ + + +#error deleted file + +#endif //__KAD_TAG_H__ +// File_checked_for_headers diff --git a/src/kademlia/net/KademliaUDPListener.cpp b/src/kademlia/net/KademliaUDPListener.cpp new file mode 100644 index 00000000..3ec552df --- /dev/null +++ b/src/kademlia/net/KademliaUDPListener.cpp @@ -0,0 +1,1208 @@ +// +// This file is part of aMule Project +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Project ( http://www.amule-project.net ) +// Copyright (C)2003 Barry Dunne (http://www.emule-project.net) + +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#include + +#include "KademliaUDPListener.h" + +#include +#include +#include +#include // OP_CALLBACK is sent in some cases. +#include +#include +#include + +#include "../routing/Contact.h" +#include "../routing/RoutingZone.h" +#include "../kademlia/Indexed.h" +#include "../kademlia/Defines.h" +#include "../../amule.h" +#include "../../ClientUDPSocket.h" +#include "../../Packet.h" +#include "../../ClientList.h" +#include "../../Statistics.h" +#include "../../MemFile.h" +#include "../../updownclient.h" +#include "../../ClientTCPSocket.h" +#include "../../Logger.h" +#include "../../Preferences.h" +#include "../../ScopedPtr.h" + +#include + +#define THIS_DEBUG_IS_JUST_FOR_KRY_DONT_TOUCH_IT_KTHX 0 + +extern wxChar* InvKadKeywordChars; + +//////////////////////////////////////// +using namespace Kademlia; +//////////////////////////////////////// + +void CKademliaUDPListener::Bootstrap(uint32 ip, uint16 port) +{ + wxASSERT(ip); + SendMyDetails(KADEMLIA_BOOTSTRAP_REQ, ip, port); +} + +void CKademliaUDPListener::SendMyDetails(byte opcode, uint32 ip, uint16 port) +{ + CMemFile packetdata(25); + packetdata.WriteUInt128(CKademlia::GetPrefs()->GetKadID()); + packetdata.WriteUInt32(CKademlia::GetPrefs()->GetIPAddress()); + packetdata.WriteUInt16(thePrefs::GetEffectiveUDPPort()); + packetdata.WriteUInt16(thePrefs::GetPort()); + packetdata.WriteUInt8(0); + SendPacket(packetdata, opcode, ip, port); +} + +void CKademliaUDPListener::FirewalledCheck(uint32 ip, uint16 port) +{ + CMemFile packetdata(2); + packetdata.WriteUInt16(thePrefs::GetPort()); + SendPacket(packetdata, KADEMLIA_FIREWALLED_REQ, ip, port); +} + +void CKademliaUDPListener::SendNullPacket(byte opcode,uint32 ip, uint16 port) +{ + CMemFile packetdata(0); + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadNullPacket %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + SendPacket(packetdata, opcode, ip, port); +} + +void CKademliaUDPListener::PublishPacket(uint32 ip, uint16 port, const CUInt128 &targetID, const CUInt128 &contactID, const TagPtrList& tags) +{ + CMemFile packetdata; + packetdata.WriteUInt128(targetID); + //We only use this for publishing sources now.. So we always send one here.. + packetdata.WriteUInt16(1); + packetdata.WriteUInt128(contactID); + packetdata.WriteTagPtrList(tags); + SendPacket(packetdata, KADEMLIA_PUBLISH_REQ, ip, port); +} + +void CKademliaUDPListener::ProcessPacket(const byte* data, uint32 lenData, uint32 ip, uint16 port) +{ + //Update connection state only when it changes. + bool curCon = CKademlia::GetPrefs()->HasHadContact(); + CKademlia::GetPrefs()->SetLastContact(); + if( curCon != CKademlia::GetPrefs()->HasHadContact()) { + theApp->ShowConnectionState(); + } + + byte opcode = data[1]; + const byte *packetData = data + 2; + uint32 lenPacket = lenData - 2; + + switch (opcode) { + case KADEMLIA_BOOTSTRAP_REQ: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadBootstrapReq from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessBootstrapRequest(packetData, lenPacket, ip, port); + break; + case KADEMLIA_BOOTSTRAP_RES: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadBootstrapRes from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessBootstrapResponse(packetData, lenPacket, ip, port); + break; + case KADEMLIA_HELLO_REQ: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadHelloReq from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessHelloRequest(packetData, lenPacket, ip, port); + break; + case KADEMLIA_HELLO_RES: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadHelloRes from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessHelloResponse(packetData, lenPacket, ip, port); + break; + case KADEMLIA_REQ: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadReq from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessKademliaRequest(packetData, lenPacket, ip, port); + break; + case KADEMLIA_RES: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadRes from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessKademliaResponse(packetData, lenPacket, ip, port); + break; + case KADEMLIA_SEARCH_REQ: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadSearchReq from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessSearchRequest(packetData, lenPacket, ip, port); + break; + case KADEMLIA_SEARCH_RES: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadSearchRes from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessSearchResponse(packetData, lenPacket, ip, port); + break; + case KADEMLIA_PUBLISH_REQ: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadPublishReq from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessPublishRequest(packetData, lenPacket, ip, port); + break; + case KADEMLIA_PUBLISH_RES: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadPublishRes from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessPublishResponse(packetData, lenPacket, ip, port); + break; + case KADEMLIA_SRC_NOTES_REQ: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadSearchNotesReq from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessSearchNotesRequest(packetData, lenPacket, ip, port); + break; + case KADEMLIA_SRC_NOTES_RES: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadSearchNotesRes from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessSearchNotesResponse(packetData, lenPacket, ip, port); + break; + case KADEMLIA_PUB_NOTES_REQ: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadPublishNotesReq from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessPublishNotesRequest(packetData, lenPacket, ip, port); + break; + case KADEMLIA_PUB_NOTES_RES: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadPublishNotesRes from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessPublishNotesResponse(packetData, lenPacket, ip, port); + break; + case KADEMLIA_FIREWALLED_REQ: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadFirewalledReq from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessFirewalledRequest(packetData, lenPacket, ip, port); + break; + case KADEMLIA_FIREWALLED_RES: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadFirewalledRes from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessFirewalledResponse(packetData, lenPacket, ip, port); + break; + case KADEMLIA_FIREWALLED_ACK: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadFirewalledAck from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessFirewalledResponse2(packetData, lenPacket, ip, port); + break; + case KADEMLIA_FINDBUDDY_REQ: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadFindBuddyReq from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessFindBuddyRequest(packetData, lenPacket, ip, port); + break; + case KADEMLIA_FINDBUDDY_RES: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadFindBuddyRes from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessFindBuddyResponse(packetData, lenPacket, ip, port); + break; + case KADEMLIA_CALLBACK_REQ: + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadCallbackReq from %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + ProcessCallbackRequest(packetData, lenPacket, ip, port); + break; + default: { + throw wxString::Format(wxT("Unknown opcode %02x on CKademliaUDPListener::processPacket"), opcode); + } + } +} + +void CKademliaUDPListener::AddContact( const byte *data, uint32 lenData, uint32 ip, uint16 port, uint16 tport) +{ + CMemFile bio((byte*)data, lenData); + CUInt128 id = bio.ReadUInt128(); + bio.ReadUInt32(); + bio.ReadUInt16(); + if( tport ) { + bio.ReadUInt16(); + } else { + tport = bio.ReadUInt16(); + } + byte type = bio.ReadUInt8(); + //AddDebugLogLineM(false, logKadMain, wxT("Adding a contact with ip ") + Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip),port)); + // Look for existing client + CContact *contact = CKademlia::GetRoutingZone()->GetContact(id); + if (contact != NULL) { + contact->SetIPAddress(ip); + contact->SetUDPPort(port); + contact->SetTCPPort(tport); + } else { + if(IsGoodIPPort(wxUINT32_SWAP_ALWAYS(ip),port)) { + // Ignore stated ip and port, use the address the packet came from + CKademlia::GetRoutingZone()->Add(id, ip, port, tport, type); + } + } +} + +void CKademliaUDPListener::AddContacts( const byte *data, uint32 lenData, uint16 numContacts) +{ + CMemFile bio((byte*)data, lenData ); + CRoutingZone *routingZone = CKademlia::GetRoutingZone(); + for (uint16 i=0; iAdd(id, ip, port, tport, type); + } + } +} + +//KADEMLIA_BOOTSTRAP_REQ +void CKademliaUDPListener::ProcessBootstrapRequest (const byte *packetData, uint32 lenPacket, uint32 ip, uint16 port) +{ + // Verify packet is expected size + if (lenPacket != 25){ + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + // Add the sender to the list of contacts + AddContact(packetData, lenPacket, ip, port); + + // Get some contacts to return + ContactList contacts; + uint16 numContacts = 1 + (uint16)CKademlia::GetRoutingZone()->GetBootstrapContacts(&contacts, 20); + + // Create response packet + //We only collect a max of 20 contacts here.. Max size is 527. + //2 + 25(20) + 15(1) + CMemFile packetdata(527); + + // Write packet info + packetdata.WriteUInt16(numContacts); + CContact *contact; + ContactList::const_iterator it; + for (it = contacts.begin(); it != contacts.end(); it++) { + contact = *it; + packetdata.WriteUInt128(contact->GetClientID()); + packetdata.WriteUInt32(contact->GetIPAddress()); + packetdata.WriteUInt16(contact->GetUDPPort()); + packetdata.WriteUInt16(contact->GetTCPPort()); + packetdata.WriteUInt8(contact->GetType()); + } + + packetdata.WriteUInt128(CKademlia::GetPrefs()->GetKadID()); + packetdata.WriteUInt32(CKademlia::GetPrefs()->GetIPAddress()); + packetdata.WriteUInt16(thePrefs::GetEffectiveUDPPort()); + packetdata.WriteUInt16(thePrefs::GetPort()); + packetdata.WriteUInt8(0); + + // Send response + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadBootstrapRes %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + + SendPacket(packetdata, KADEMLIA_BOOTSTRAP_RES, ip, port); +} + +//KADEMLIA_BOOTSTRAP_RES +void CKademliaUDPListener::ProcessBootstrapResponse (const byte *packetData, uint32 lenPacket, uint32 ip, uint16 port) +{ + // Verify packet is expected size + if (lenPacket < 27){ + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + // How many contacts were given + CMemFile bio(packetData, lenPacket); + uint16 numContacts = bio.ReadUInt16(); + + // Verify packet is expected size + if (lenPacket != (uint32)(2 + 25*numContacts)) { + return; + } + + // Add these contacts to the list. + AddContacts(packetData+2, lenPacket-2, numContacts); + // Send sender to alive. + CKademlia::GetRoutingZone()->SetAlive(ip, port); +} + +//KADEMLIA_HELLO_REQ +void CKademliaUDPListener::ProcessHelloRequest (const byte *packetData, uint32 lenPacket, uint32 ip, uint16 port) +{ + // Verify packet is expected size + if (lenPacket != 25){ + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + // Add the sender to the list of contacts + AddContact(packetData, lenPacket, ip, port); + + // Send response + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadHelloRes %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + SendMyDetails(KADEMLIA_HELLO_RES, ip, port); + + // Check if firewalled + if(CKademlia::GetPrefs()->GetRecheckIP()) { + FirewalledCheck(ip, port); + } +} + +//KADEMLIA_HELLO_RES +void CKademliaUDPListener::ProcessHelloResponse (const byte *packetData, uint32 lenPacket, uint32 ip, uint16 port) +{ + // Verify packet is expected size + if (lenPacket != 25){ + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + // Add or Update contact. + AddContact(packetData, lenPacket, ip, port); + + // Set contact to alive. + CKademlia::GetRoutingZone()->SetAlive(ip, port); +} + +//KADEMLIA_REQ +void CKademliaUDPListener::ProcessKademliaRequest (const byte *packetData, uint32 lenPacket, uint32 ip, uint16 port) +{ + // Verify packet is expected size + if (lenPacket != 33){ + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + //RecheckIP and firewall status + if(CKademlia::GetPrefs()->GetRecheckIP()) + { + FirewalledCheck(ip, port); + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadHelloReq %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + SendMyDetails(KADEMLIA_HELLO_REQ, ip, port); + } + + // Get target and type + CMemFile bio(packetData, lenPacket); + byte type = bio.ReadUInt8(); +// bool flag1 = (type >> 6); //Reserved +// bool flag2 = (type >> 7); //Reserved +// bool flag3 = (type >> 8); //Reserved + + type = type & 0x1F; + if( type == 0 ) { + throw wxString::Format(wxT("***NOTE: Received wrong type (0x%02x) in "), type) + wxString::FromAscii(__FUNCTION__); + } + + //This is the target node trying to be found. + CUInt128 target = bio.ReadUInt128(); + CUInt128 distance(CKademlia::GetPrefs()->GetKadID()); + distance.XOR(target); + + //This makes sure we are not mistaken identify. Some client may have fresh installed and have a new hash. + CUInt128 check = bio.ReadUInt128(); + if( CKademlia::GetPrefs()->GetKadID().CompareTo(check)) { + return; + } + + // Get required number closest to target + ContactMap results; + CKademlia::GetRoutingZone()->GetClosestTo(2, target, distance, (int)type, &results); + uint16 count = (uint16)results.size(); + + // Write response + // Max count is 32. size 817.. + // 16 + 1 + 25(32) + CMemFile packetdata( 817 ); + packetdata.WriteUInt128(target); + packetdata.WriteUInt8((byte)count); + CContact *c; + ContactMap::const_iterator it; + for (it = results.begin(); it != results.end(); it++) { + c = it->second; + packetdata.WriteUInt128(c->GetClientID()); + packetdata.WriteUInt32(c->GetIPAddress()); + packetdata.WriteUInt16(c->GetUDPPort()); + packetdata.WriteUInt16(c->GetTCPPort()); + packetdata.WriteUInt8(c->GetType()); + } + + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadRes %s Count=%u")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port) % count); + + SendPacket(packetdata, KADEMLIA_RES, ip, port); +} + +//KADEMLIA_RES +void CKademliaUDPListener::ProcessKademliaResponse (const byte *packetData, uint32 lenPacket, uint32 ip, uint16 port) +{ + // Verify packet is expected size + if (lenPacket < 17){ + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + //Used Pointers + CRoutingZone *routingZone = CKademlia::GetRoutingZone(); + + if(CKademlia::GetPrefs()->GetRecheckIP()) { + FirewalledCheck(ip, port); + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadHelloReq %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + SendMyDetails(KADEMLIA_HELLO_REQ, ip, port); + } + + // What search does this relate to + CMemFile bio(packetData, lenPacket); + CUInt128 target = bio.ReadUInt128(); + uint16 numContacts = bio.ReadUInt8(); + + // Verify packet is expected size + if (lenPacket != (uint32)(16+1 + (16+4+2+2+1)*numContacts)) { + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + // Set contact to alive. + routingZone->SetAlive(ip, port); + + + CScopedPtr results(new ContactList); + + for (uint16 i=0; iAdd(id, contactIP, contactPort, tport, type); + results->push_back(new CContact(id, contactIP, contactPort, tport, target)); + } + } + + CSearchManager::ProcessResponse(target, ip, port, results.release()); +} + +void CKademliaUDPListener::Free(SSearchTerm* pSearchTerms) +{ + if (!pSearchTerms) { + return; + } + + Free(pSearchTerms->left); + Free(pSearchTerms->right); + delete pSearchTerms; +} + +SSearchTerm* CKademliaUDPListener::CreateSearchExpressionTree(CMemFile& bio, int iLevel) +{ + // the max. depth has to match our own limit for creating the search expression + // (see also 'ParsedSearchExpression' and 'GetSearchPacket') + if (iLevel >= 24){ + AddDebugLogLineM(false, logClientKadUDP, wxT("***NOTE: Search expression tree exceeds depth limit!")); + return NULL; + } + iLevel++; + + uint8 op = bio.ReadUInt8(); + if (op == 0x00) { + uint8 boolop = bio.ReadUInt8(); + if (boolop == 0x00) { // AND + SSearchTerm* pSearchTerm = new SSearchTerm; + pSearchTerm->type = SSearchTerm::AND; + //TRACE(" AND"); + if ((pSearchTerm->left = CreateSearchExpressionTree(bio, iLevel)) == NULL){ + wxASSERT(0); + delete pSearchTerm; + return NULL; + } + if ((pSearchTerm->right = CreateSearchExpressionTree(bio, iLevel)) == NULL){ + wxASSERT(0); + Free(pSearchTerm->left); + delete pSearchTerm; + return NULL; + } + return pSearchTerm; + } else if (boolop == 0x01) { // OR + SSearchTerm* pSearchTerm = new SSearchTerm; + pSearchTerm->type = SSearchTerm::OR; + //TRACE(" OR"); + if ((pSearchTerm->left = CreateSearchExpressionTree(bio, iLevel)) == NULL){ + wxASSERT(0); + delete pSearchTerm; + return NULL; + } + if ((pSearchTerm->right = CreateSearchExpressionTree(bio, iLevel)) == NULL){ + wxASSERT(0); + Free(pSearchTerm->left); + delete pSearchTerm; + return NULL; + } + return pSearchTerm; + } else if (boolop == 0x02) { // NAND + SSearchTerm* pSearchTerm = new SSearchTerm; + pSearchTerm->type = SSearchTerm::NAND; + //TRACE(" NAND"); + if ((pSearchTerm->left = CreateSearchExpressionTree(bio, iLevel)) == NULL){ + wxASSERT(0); + delete pSearchTerm; + return NULL; + } + if ((pSearchTerm->right = CreateSearchExpressionTree(bio, iLevel)) == NULL){ + wxASSERT(0); + Free(pSearchTerm->left); + delete pSearchTerm; + return NULL; + } + return pSearchTerm; + } else{ + AddDebugLogLineM(false, logKadSearch, wxString::Format(wxT("*** Unknown boolean search operator 0x%02x (CreateSearchExpressionTree)"), boolop)); + return NULL; + } + } else if (op == 0x01) { // String + wxString str(bio.ReadString(true)); + + // Make lowercase, the search code expects lower case strings! + str.MakeLower(); + + SSearchTerm* pSearchTerm = new SSearchTerm; + pSearchTerm->type = SSearchTerm::String; + pSearchTerm->astr = new wxArrayString; + + // pre-tokenize the string term + wxStringTokenizer token(str,InvKadKeywordChars,wxTOKEN_DEFAULT ); + while (token.HasMoreTokens()) { + wxString strTok(token.GetNextToken()); + if (!strTok.IsEmpty()) { + pSearchTerm->astr->Add(strTok); + } + } + + return pSearchTerm; + } else if (op == 0x02) { // Meta tag + // read tag value + wxString strValue(bio.ReadString(true)); + // Make lowercase, the search code expects lower case strings! + strValue.MakeLower(); + + // read tag name + wxString strTagName = bio.ReadString(true); + + SSearchTerm* pSearchTerm = new SSearchTerm; + pSearchTerm->type = SSearchTerm::MetaTag; + pSearchTerm->tag = new CTagString(strTagName, strValue); + return pSearchTerm; + } + else if (op == 0x03) { // Min/Max + static const struct { + SSearchTerm::ESearchTermType eSearchTermOp; + wxString pszOp; + } _aOps[] = + { + { SSearchTerm::OpEqual, wxT("=") }, // mmop=0x00 + { SSearchTerm::OpGreaterEqual, wxT(">=") }, // mmop=0x01 + { SSearchTerm::OpLessEqual, wxT("<=") }, // mmop=0x02 + { SSearchTerm::OpGreater, wxT(">") }, // mmop=0x03 + { SSearchTerm::OpLess, wxT("<") }, // mmop=0x04 + { SSearchTerm::OpNotEqual, wxT("!=") } // mmop=0x05 + }; + + // read tag value + uint32 uValue = bio.ReadUInt32(); + + // read integer operator + uint8 mmop = bio.ReadUInt8(); + if (mmop >= itemsof(_aOps)){ + AddDebugLogLineM(false, logClientKadUDP, wxString::Format(wxT("*** Unknown integer search op=0x%02x (CreateSearchExpressionTree)"), mmop)); + return NULL; + } + + // read tag name + wxString strTagName = bio.ReadString(false); + + SSearchTerm* pSearchTerm = new SSearchTerm; + pSearchTerm->type = _aOps[mmop].eSearchTermOp; + pSearchTerm->tag = new CTagVarInt(strTagName, uValue); + + return pSearchTerm; + } else{ + AddDebugLogLineM(false, logClientKadUDP, wxString::Format(wxT("*** Unknown search op=0x%02x (CreateSearchExpressionTree)"), op)); + return NULL; + } +} + +//KADEMLIA_SEARCH_REQ +void CKademliaUDPListener::ProcessSearchRequest (const byte *packetData, uint32 lenPacket, uint32 ip, uint16 port) +{ + // Verify packet is expected size + if (lenPacket < 17){ + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + CMemFile bio(packetData, lenPacket); + CUInt128 target = bio.ReadUInt128(); + uint8 restrictive = bio.ReadUInt8(); + +#ifdef _DEBUG + //DWORD dwNow = GetTickCount(); +#endif + if(lenPacket == 17 ) { + if(restrictive) { + //Source request + CKademlia::GetIndexed()->SendValidSourceResult(target, ip, port); + //DEBUG_ONLY( Debug("SendValidSourceResult: Time=%.2f sec\n", (GetTickCount() - dwNow) / 1000.0) ); + } else { + //Single keyword request + CKademlia::GetIndexed()->SendValidKeywordResult(target, NULL, ip, port ); + //DEBUG_ONLY( Debug("SendValidKeywordResult (Single): Time=%.2f sec\n", (GetTickCount() - dwNow) / 1000.0) ); + } + } else if(lenPacket > 17) { + SSearchTerm* pSearchTerms = NULL; + if (restrictive) { + pSearchTerms = CreateSearchExpressionTree(bio, 0); + } + //Keyword request with added options. + CKademlia::GetIndexed()->SendValidKeywordResult(target, pSearchTerms, ip, port); + Free(pSearchTerms); + //DEBUG_ONLY( Debug("SendValidKeywordResult: Time=%.2f sec\n", (GetTickCount() - dwNow) / 1000.0) ); + } +} + +//KADEMLIA_SEARCH_RES +void CKademliaUDPListener::ProcessSearchResponse (const byte *packetData, uint32 lenPacket, uint32 ip, uint16 port) +{ + // Verify packet is expected size + if (lenPacket < 37) { + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + // Set contact to alive. + CKademlia::GetRoutingZone()->SetAlive(ip, port); + + // What search does this relate to + CMemFile bio(packetData, lenPacket); + CUInt128 target = bio.ReadUInt128(); + + // How many results.. Not supported yet.. + uint16 count = bio.ReadUInt16(); + while( count > 0 ) { + // What is the answer + CUInt128 answer = bio.ReadUInt128(); + + // Get info about answer + // NOTE: this is the one and only place in Kad where we allow string conversion to local code page in + // case we did not receive an UTF8 string. this is for backward compatibility for search results which are + // supposed to be 'viewed' by user only and not feed into the Kad engine again! + // If that tag list is once used for something else than for viewing, special care has to be taken for any + // string conversion! + TagPtrList* tags = new TagPtrList; + try { + bio.ReadTagPtrList(tags, true/*bOptACP*/); + } catch(...){ + DebugClientOutput(wxT("CKademliaUDPListener::processSearchResponse"),ip,port,packetData,lenPacket); + deleteTagPtrListEntries(tags); + delete tags; + tags = NULL; + throw; + } + CSearchManager::ProcessResult(target, ip, port, answer, tags); + count--; + } +} + +//KADEMLIA_PUBLISH_REQ +void CKademliaUDPListener::ProcessPublishRequest (const byte *packetData, uint32 lenPacket, uint32 ip, uint16 port) +{ + //There are different types of publishing.. + //Keyword and File are Stored.. + // Verify packet is expected size + if (lenPacket < 37) { + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + //Used Pointers + CIndexed *indexed = CKademlia::GetIndexed(); + + if( CKademlia::GetPrefs()->GetFirewalled() ) { + //We are firewalled. We should not index this entry and give publisher a false report. + return; + } + + CMemFile bio(packetData, lenPacket); + CUInt128 file = bio.ReadUInt128(); + + CUInt128 distance(CKademlia::GetPrefs()->GetKadID()); + distance.XOR(file); + + if( thePrefs::FilterLanIPs() && distance.Get32BitChunk(0) > SEARCHTOLERANCE) { + return; + } + + wxString strInfo; + uint16 count = bio.ReadUInt16(); + uint16 totalcount = count; + bool flag = false; + uint8 load = 0; + while( count > 0 ) { + strInfo.Clear(); + + CUInt128 target = bio.ReadUInt128(); + + Kademlia::CEntry* entry = new Kademlia::CEntry(); + uint32 tags = 0, totaltags = 0; + try { + entry->m_iIP = ip; + entry->m_iUDPport = port; + entry->m_iKeyID.SetValue(file); + entry->m_iSourceID.SetValue(target); + tags = bio.ReadUInt8(); + totaltags = tags; + while(tags > 0) { + CTag* tag = bio.ReadTag(); + totaltags = tags; + if(tag) { + if (!tag->GetName().Cmp(TAG_SOURCETYPE) && tag->GetType() == 9) { + if( entry->m_bSource == false ) { + entry->m_lTagList.push_back(new CTagVarInt(TAG_SOURCEIP, entry->m_iIP)); + entry->m_lTagList.push_back(new CTagVarInt(TAG_SOURCEUPORT, entry->m_iUDPport)); + } else { + //More than one sourcetype tag found. + delete tag; + } + entry->m_bSource = true; + } + + if (!tag->GetName().Cmp(TAG_FILENAME)) { + if ( entry->m_sFileName.IsEmpty() ) { + entry->m_sFileName = tag->GetStr(); + // Make lowercase, the search code expects lower case strings! + entry->m_sFileName.MakeLower(); + strInfo += CFormat(wxT(" Name=\"%s\"")) % entry->m_sFileName; + // NOTE: always add the 'name' tag, even if it's stored separately in 'fileName'. the tag is still needed for answering search request + entry->m_lTagList.push_back(tag); + } else { + //More then one Name tag found. + delete tag; + } + } else if (!tag->GetName().Cmp(TAG_FILESIZE)) { + if( entry->m_iSize == 0 ) { + if (tag->IsBsob() && (tag->GetBsobSize() == 8)) { + // Kad1.0 uint64 type using a BSOB. + entry->m_iSize = PeekUInt64(tag->GetBsob()); + + // Don't save as a BSOB tag ... + delete tag; + tag = new CTagVarInt(TAG_FILESIZE, entry->m_iSize); + } else { + wxASSERT(tag->IsInt()); + entry->m_iSize = tag->GetInt(); + } + strInfo += wxString::Format(wxT(" Size=%") wxLongLongFmtSpec wxT("u"), entry->m_iSize); + // NOTE: always add the 'size' tag, even if it's stored separately in 'size'. the tag is still needed for answering search request + entry->m_lTagList.push_back(tag); + } else { + //More then one size tag found + delete tag; + } + } else if (!tag->GetName().Cmp(TAG_SOURCEPORT)) { + if( entry->m_iTCPport == 0 ) { + entry->m_iTCPport = tag->GetInt(); + entry->m_lTagList.push_back(tag); + } else { + //More then one port tag found + delete tag; + } + } else { + //TODO: Filter tags + entry->m_lTagList.push_back(tag); + } + } + tags--; + } + if (!strInfo.IsEmpty()) { + AddDebugLogLineM(false, logClientKadUDP, strInfo); + } + } catch(...) { + printf("Error on count %i tag %i\n",totalcount-count, totaltags-tags); + DebugClientOutput(wxT("CKademliaUDPListener::processPublishRequest"),ip,port,packetData,lenPacket); + delete entry; + throw; + } + + if( entry->m_bSource == true ) { + entry->m_tLifeTime = (uint32)time(NULL)+KADEMLIAREPUBLISHTIMES; + if( indexed->AddSources(file, target, entry, load ) ) { + flag = true; + } else { + delete entry; + entry = NULL; + } + } else { + entry->m_tLifeTime = (uint32)time(NULL)+KADEMLIAREPUBLISHTIMEK; + if( indexed->AddKeyword(file, target, entry, load) ) { + // This makes sure we send a publish response.. + // This also makes sure we index all the files for this keyword. + flag = true; + } else { + //We already indexed the maximum number of keywords. + //We do not index anymore but we still send a success.. + //Reason: Because if a VERY busy node tells the publisher it failed, + //this busy node will spread to all the surrounding nodes causing popular + //keywords to be stored on MANY nodes.. + //So, once we are full, we will periodically clean our list until we can + //begin storing again.. + flag = true; + delete entry; + entry = NULL; + } + } + count--; + } + if( flag ) { + CMemFile packetdata(17); + packetdata.WriteUInt128(file); + packetdata.WriteUInt8(load); + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadPublishRes %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + + SendPacket( packetdata, KADEMLIA_PUBLISH_RES, ip, port); + } +} + +//KADEMLIA_PUBLISH_ACK +void CKademliaUDPListener::ProcessPublishResponse (const byte *packetData, uint32 lenPacket, uint32 ip, uint16 port) +{ + // Verify packet is expected size + if (lenPacket < 16) { + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + // Set contact to alive. + CKademlia::GetRoutingZone()->SetAlive(ip, port); + + CMemFile bio(packetData, lenPacket); + CUInt128 file = bio.ReadUInt128(); + + bool loadResponse = false; + uint8 load = 0; + if( bio.GetLength() > bio.GetPosition() ) { + loadResponse = true; + load = bio.ReadUInt8(); + } + + CSearchManager::ProcessPublishResult(file, load, loadResponse); +} + +//KADEMLIA_SRC_NOTES_REQ +void CKademliaUDPListener::ProcessSearchNotesRequest (const byte *packetData, uint32 lenPacket, uint32 ip, uint16 port) +{ + // Verify packet is expected size + if (lenPacket < 32) { + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + CMemFile bio(packetData, lenPacket); + CUInt128 target = bio.ReadUInt128(); + CUInt128 source = bio.ReadUInt128(); + + CKademlia::GetIndexed()->SendValidNoteResult(target, source, ip, port); +} + +//KADEMLIA_SRC_NOTES_RES +void CKademliaUDPListener::ProcessSearchNotesResponse (const byte *packetData, uint32 lenPacket, uint32 ip, uint16 port) +{ + // Verify packet is expected size + if (lenPacket < 37) { + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + // Set contact to alive. + CKademlia::GetRoutingZone()->SetAlive(ip, port); + + // What search does this relate to + CMemFile bio(packetData, lenPacket); + CUInt128 target = bio.ReadUInt128(); + + uint16 count = bio.ReadUInt16(); + while( count > 0 ) { + // What is the answer + CUInt128 answer = bio.ReadUInt128(); + + // Get info about answer + // NOTE: this is the one and only place in Kad where we allow string conversion to local code page in + // case we did not receive an UTF8 string. this is for backward compatibility for search results which are + // supposed to be 'viewed' by user only and not feed into the Kad engine again! + // If that tag list is once used for something else than for viewing, special care has to be taken for any + // string conversion! + TagPtrList* tags = new TagPtrList; + try{ + bio.ReadTagPtrList(tags, true/*bOptACP*/); + } catch(...){ + DebugClientOutput(wxT("CKademliaUDPListener::processSearchNotesResponse"),ip,port,packetData,lenPacket); + deleteTagPtrListEntries(tags); + delete tags; + tags = NULL; + throw; + } + CSearchManager::ProcessResult(target, ip, port, answer, tags); + count--; + } +} + +//KADEMLIA_PUB_NOTES_REQ +void CKademliaUDPListener::ProcessPublishNotesRequest (const byte *packetData, uint32 lenPacket, uint32 ip, uint16 port) +{ + // Verify packet is expected size + if (lenPacket < 37) { + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + if( CKademlia::GetPrefs()->GetFirewalled() ) { + //We are firewalled. We should not index this entry and give publisher a false report. + return; + } + + CMemFile bio(packetData, lenPacket); + CUInt128 target = bio.ReadUInt128(); + + CUInt128 distance(CKademlia::GetPrefs()->GetKadID()); + distance.XOR(target); + + if( thePrefs::FilterLanIPs() && distance.Get32BitChunk(0) > SEARCHTOLERANCE) { + return; + } + + CUInt128 source = bio.ReadUInt128(); + + Kademlia::CEntry* entry = new Kademlia::CEntry(); + try { + entry->m_iIP = ip; + entry->m_iUDPport = port; + entry->m_iKeyID.SetValue(target); + entry->m_iSourceID.SetValue(source); + bio.ReadTagPtrList(&entry->m_lTagList); + entry->m_bSource = false; + } catch(...) { + DebugClientOutput(wxT("CKademliaUDPListener::processPublishNotesRequest"),ip,port,packetData,lenPacket); + delete entry; + throw; + } + + if( entry == NULL ) { + throw wxString(wxT("CKademliaUDPListener::processPublishNotesRequest: entry == NULL")); + } else if( entry->m_lTagList.size() == 0 || entry->m_lTagList.size() > 5) { + delete entry; + throw wxString(wxT("CKademliaUDPListener::processPublishNotesRequest: entry->m_lTagList.size() == 0 || entry->m_lTagList.size() > 5")); + } + + uint8 load = 0; + if( CKademlia::GetIndexed()->AddNotes(target, source, entry, load ) ) { + CMemFile packetdata(17); + packetdata.WriteUInt128(target); + packetdata.WriteUInt8(load); + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadPublishNotesRes %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + SendPacket( packetdata, KADEMLIA_PUB_NOTES_RES, ip, port); + } else { + delete entry; + } +} + +//KADEMLIA_PUB_NOTES_RES +void CKademliaUDPListener::ProcessPublishNotesResponse (const byte *packetData, uint32 lenPacket, uint32 ip, uint16 port) +{ + // Verify packet is expected size + if (lenPacket < 16){ + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + // Set contact to alive. + CKademlia::GetRoutingZone()->SetAlive(ip, port); + + CMemFile bio(packetData, lenPacket); + CUInt128 file = bio.ReadUInt128(); + + bool loadResponse = false; + uint8 load = 0; + if( bio.GetLength() > bio.GetPosition() ) { + loadResponse = true; + load = bio.ReadUInt8(); + } + + CSearchManager::ProcessPublishResult(file, load, loadResponse); +} + +//KADEMLIA_FIREWALLED_REQ +void CKademliaUDPListener::ProcessFirewalledRequest (const byte *packetData, uint32 lenPacket, uint32 ip, uint16 port) +{ + // Verify packet is expected size + if (lenPacket != 2){ + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + CMemFile bio(packetData, lenPacket); + uint16 tcpport = bio.ReadUInt16(); + + CUInt128 zero((uint32)0); + CContact contact(zero, ip, port, tcpport, zero); + theApp->clientlist->RequestTCP(&contact); + + // Send response + CMemFile packetdata(4); + packetdata.WriteUInt32(ip); + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadFirewalledRes %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + + SendPacket(packetdata, KADEMLIA_FIREWALLED_RES, ip, port); +} + +//KADEMLIA_FIREWALLED_RES +void CKademliaUDPListener::ProcessFirewalledResponse (const byte *packetData, uint32 lenPacket, uint32 ip, uint16 port) +{ + // Verify packet is expected size + if (lenPacket != 4){ + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + // Set contact to alive. + CKademlia::GetRoutingZone()->SetAlive(ip, port); + + CMemFile bio(packetData, lenPacket); + uint32 firewalledIP = bio.ReadUInt32(); + + //Update con state only if something changes. + if( CKademlia::GetPrefs()->GetIPAddress() != firewalledIP ) { + CKademlia::GetPrefs()->SetIPAddress(firewalledIP); + theApp->ShowConnectionState(); + } + CKademlia::GetPrefs()->IncRecheckIP(); +} + +//KADEMLIA_FIREWALLED_ACK +void CKademliaUDPListener::ProcessFirewalledResponse2 (const byte *WXUNUSED(packetData), uint32 lenPacket, uint32 ip, uint16 port) +{ + // Verify packet is expected size + if (lenPacket != 0) { + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + // Set contact to alive. + CKademlia::GetRoutingZone()->SetAlive(ip, port); + CKademlia::GetPrefs()->IncFirewalled(); +} + +//KADEMLIA_FINDBUDDY_REQ +void CKademliaUDPListener::ProcessFindBuddyRequest (const byte *packetData, uint32 lenPacket, uint32 ip, uint16 port) +{ + // Verify packet is expected size + if (lenPacket < 34) { + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + if( CKademlia::GetPrefs()->GetFirewalled() ) { + //We are firewalled but somehow we still got this packet.. Don't send a response.. + return; + } + + CMemFile bio(packetData, lenPacket); + CUInt128 BuddyID = bio.ReadUInt128(); + CUInt128 userID = bio.ReadUInt128(); + uint16 tcpport = bio.ReadUInt16(); + + CUInt128 zero((uint32)0); + CContact contact(userID, ip, port, tcpport, zero); + theApp->clientlist->IncomingBuddy(&contact, &BuddyID); + + CMemFile packetdata(34); + packetdata.WriteUInt128(BuddyID); + packetdata.WriteUInt128(CKademlia::GetPrefs()->GetClientHash()); + packetdata.WriteUInt16(thePrefs::GetPort()); + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadFindBuddyRes %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + + SendPacket(packetdata, KADEMLIA_FINDBUDDY_RES, ip, port); +} + +//KADEMLIA_FINDBUDDY_RES +void CKademliaUDPListener::ProcessFindBuddyResponse (const byte *packetData, uint32 lenPacket, uint32 ip, uint16 port) +{ + // Verify packet is expected size + if (lenPacket < 34) { + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + + CMemFile bio(packetData, lenPacket); + CUInt128 check = bio.ReadUInt128(); + check.XOR(CUInt128(true)); + if( CKademlia::GetPrefs()->GetKadID().CompareTo(check)) { + return; + } + CUInt128 userID = bio.ReadUInt128(); + uint16 tcpport = bio.ReadUInt16(); + + CUInt128 zero((uint32)0); + CContact contact(userID, ip, port, tcpport, zero); + theApp->clientlist->RequestBuddy(&contact); +} + +//KADEMLIA_CALLBACK_REQ +void CKademliaUDPListener::ProcessCallbackRequest (const byte *packetData, uint32 lenPacket, uint32 ip, uint16 port) +{ + // Verify packet is expected size + if (lenPacket < 34) { + throw wxString::Format(wxT("***NOTE: Received wrong size (%u) packet in "), lenPacket) + wxString::FromAscii(__FUNCTION__); + } + + CUpDownClient* buddy = theApp->clientlist->GetBuddy(); + if( buddy != NULL ) { + CMemFile bio(packetData, lenPacket); + CUInt128 check = bio.ReadUInt128(); + // JOHNTODO: Filter bad buddies + //CUInt128 bud(buddy->GetBuddyID()); + CUInt128 file = bio.ReadUInt128(); + uint16 tcp = bio.ReadUInt16(); + CMemFile packetdata(16+16+4+2); + packetdata.WriteUInt128(check); + packetdata.WriteUInt128(file); + packetdata.WriteUInt32(ip); + packetdata.WriteUInt16(tcp); + CPacket* packet = new CPacket(packetdata, OP_EMULEPROT, OP_CALLBACK); + if( buddy->GetSocket() ) { + AddDebugLogLineM(false, logClientKadUDP, CFormat(wxT("KadCallback %s")) % Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip), port)); + theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); + buddy->GetSocket()->SendPacket(packet); + } else { + wxASSERT(0); + } + } +} + +void CKademliaUDPListener::SendPacket(const CMemFile &data, byte opcode, uint32 destinationHost, uint16 destinationPort) +{ + CPacket* packet = new CPacket(data, OP_KADEMLIAHEADER, opcode); + if( packet->GetPacketSize() > 200 ) { + packet->PackPacket(); + } + theStats::AddUpOverheadKad(packet->GetPacketSize()); + theApp->clientudp->SendPacket(packet,wxUINT32_SWAP_ALWAYS(destinationHost), destinationPort, false, NULL, true, 0); +} + +void CKademliaUDPListener::DebugClientOutput(const wxString& place, uint32 kad_ip, uint32 port, const byte* data, int len) +{ +#if THIS_DEBUG_IS_JUST_FOR_KRY_DONT_TOUCH_IT_KTHX + uint32 ip = wxUINT32_SWAP_ALWAYS(kad_ip); + printf("Error on %s received from: %s\n",(const char*)unicode2char(place),(const char*)unicode2char(Uint32_16toStringIP_Port(ip,port))); + if (data) { + printf("Packet dump:\n"); + DumpMem(data, len); + } + CClientList::SourceList clientslist = theApp->clientlist->GetClientsByIP(ip); + if (!clientslist.empty()) { + for (CClientList::SourceList::iterator it = clientslist.begin(); it != clientslist.end(); ++it) { + printf("Ip Matches: %s\n",(const char*)unicode2char((*it)->GetClientFullInfo())); + } + } else { + printf("No ip match, trying to create a client connection:\n"); + printf("Trying port %d\n", port - 10); + CUpDownClient* client = new CUpDownClient(port-10,kad_ip,0,0,NULL,false,false); + client->SetConnectionReason(wxT("Error on ") + place); + client->TryToConnect(true); + } +#else + // No need for warnings for the rest of us. + (void)place; + (void)kad_ip; + (void)port; + (void)data; + (void)len; +#endif +} +// File_checked_for_headers diff --git a/src/kademlia/net/KademliaUDPListener.h b/src/kademlia/net/KademliaUDPListener.h new file mode 100644 index 00000000..d0175a25 --- /dev/null +++ b/src/kademlia/net/KademliaUDPListener.h @@ -0,0 +1,102 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#ifndef __KAD_UDP_LISTENER_H__ +#define __KAD_UDP_LISTENER_H__ + +#include "../utils/UInt128.h" +#include "../../Tag.h" + +class CKnownFile; +class CMemFile; +struct SSearchTerm; + +//////////////////////////////////////// +namespace Kademlia { +//////////////////////////////////////// + +class CSearch; + +class CKademliaUDPListener +{ + friend class CSearch; + +public: + virtual ~CKademliaUDPListener() {}; + void Bootstrap(uint32 ip, uint16 port); + void FirewalledCheck(uint32 ip, uint16 port); + void SendMyDetails(byte opcode, uint32 ip, uint16 port); + void PublishPacket(uint32 ip, uint16 port, const CUInt128& targetID, const CUInt128& contactID, const TagPtrList& tags); + void SendNullPacket(byte opcode, uint32 ip, uint16 port); + virtual void ProcessPacket(const byte* data, uint32 lenData, uint32 ip, uint16 port); + void SendPacket(const CMemFile& data, byte opcode, uint32 destinationHost, uint16 destinationPort); + +private: + void AddContact (const byte* data, uint32 lenData, uint32 ip, uint16 port, uint16 tport = 0); + void AddContacts(const byte* data, uint32 lenData, uint16 numContacts); + static SSearchTerm* CreateSearchExpressionTree(CMemFile& bio, int iLevel); + static void Free(SSearchTerm* pSearchTerms); + + void ProcessBootstrapRequest (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + void ProcessBootstrapResponse (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + void ProcessHelloRequest (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + void ProcessHelloResponse (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + void ProcessKademliaRequest (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + void ProcessKademliaResponse (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + void ProcessSearchRequest (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + void ProcessSearchResponse (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + void ProcessPublishRequest (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + void ProcessPublishResponse (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + void ProcessSearchNotesRequest (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + void ProcessSearchNotesResponse (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + void ProcessPublishNotesRequest (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + void ProcessPublishNotesResponse (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + void ProcessFirewalledRequest (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + void ProcessFirewalledResponse (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + void ProcessFirewalledResponse2 (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + void ProcessFindBuddyRequest (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + void ProcessFindBuddyResponse (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + void ProcessCallbackRequest (const byte* packetData, uint32 lenPacket, uint32 ip, uint16 port); + + void DebugClientOutput(const wxString& place, uint32 kad_ip, uint32 port, const byte* data = NULL, int len = 0); +}; + +} // End namespace + +#endif //__KAD_UDP_LISTENER_H__ +// File_checked_for_headers diff --git a/src/kademlia/net/Makefile.am b/src/kademlia/net/Makefile.am new file mode 100644 index 00000000..b0dee923 --- /dev/null +++ b/src/kademlia/net/Makefile.am @@ -0,0 +1,3 @@ +noinst_HEADERS = KademliaUDPListener.h + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/kademlia/net/Makefile.in b/src/kademlia/net/Makefile.in new file mode 100644 index 00000000..cac92c6e --- /dev/null +++ b/src/kademlia/net/Makefile.in @@ -0,0 +1,493 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/kademlia/net +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +noinst_HEADERS = KademliaUDPListener.h +MAINTAINERCLEANFILES = Makefile.in +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/kademlia/net/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/kademlia/net/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(HEADERS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + ctags distclean distclean-generic distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/kademlia/routing/Contact.cpp b/src/kademlia/routing/Contact.cpp new file mode 100644 index 00000000..25c03455 --- /dev/null +++ b/src/kademlia/routing/Contact.cpp @@ -0,0 +1,159 @@ +// +// This file is part of aMule Project +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Project ( http://www.amule-project.net ) +// Copyright (C)2003 Barry Dunne (http://www.emule-project.net) + +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + +// This work is based on the java implementation of the Kademlia protocol. +// Kademlia: Peer-to-peer routing based on the XOR metric +// Copyright (C) 2002 Petar Maymounkov [petar@post.harvard.edu] +// http://kademlia.scs.cs.nyu.edu + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#include "Contact.h" + +#include + +#include "../../Statistics.h" + +//////////////////////////////////////// +using namespace Kademlia; +//////////////////////////////////////// + +CContact::~CContact() +{ + theStats::RemoveKadNode(); +} + +CContact::CContact(const CUInt128 &clientID, uint32 ip, uint16 udpPort, uint16 tcpPort, const CUInt128 &target) +: +m_clientID(clientID), +m_distance(target), +m_ip(ip), +m_tcpPort(tcpPort), +m_udpPort(udpPort), +m_type(3), +m_lastTypeSet(time(NULL)), +m_expires(0), +m_created(time(NULL)), +m_inUse(0) +{ + m_distance.XOR(clientID); + wxASSERT(udpPort); + theStats::AddKadNode(); + //#warning Kry KAD2 - Update the version on code. + m_uVersion = 1; +} + +const wxString CContact::GetClientIDString(void) const +{ + return m_clientID.ToHexString(); +} + +#ifndef CLIENT_GUI +void CContact::SetClientID(const CUInt128 &clientID) +{ + m_clientID = clientID; + m_distance = CKademlia::GetPrefs()->GetKadID(); + m_distance.XOR(clientID); +} +#endif + +const wxString CContact::GetDistanceString(void) const +{ + return m_distance.ToBinaryString(); +} + +uint32 CContact::GetIPAddress(void) const +{ + return m_ip; +} + +void CContact::SetIPAddress(uint32 ip) +{ + m_ip = ip; +} + +uint16 CContact::GetTCPPort(void) const +{ + return m_tcpPort; +} + +void CContact::SetTCPPort(uint16 port) +{ + m_tcpPort = port; +} + +uint16 CContact::GetUDPPort(void) const +{ + return m_udpPort; +} + +void CContact::SetUDPPort(uint16 port) +{ + wxASSERT(port); + m_udpPort = port; +} + +byte CContact::GetType(void) const +{ + return m_type; +} + +void CContact::CheckingType() +{ + if(time(NULL) - m_lastTypeSet < 10 || m_type == 4) { + return; + } + + m_lastTypeSet = time(NULL); + + m_expires = time(NULL) + MIN2S(2); + m_type++; + +} + +void CContact::UpdateType() +{ + uint32 hours = (time(NULL)-m_created)/HR2S(1); + switch(hours) { + case 0: + m_type = 2; + m_expires = time(NULL) + HR2S(1); + break; + case 1: + m_type = 1; + m_expires = time(NULL) + (int)HR2S(1.5); + break; + default: + m_type = 0; + m_expires = time(NULL) + HR2S(2); + } +} +// File_checked_for_headers diff --git a/src/kademlia/routing/Contact.h b/src/kademlia/routing/Contact.h new file mode 100644 index 00000000..f2e243bd --- /dev/null +++ b/src/kademlia/routing/Contact.h @@ -0,0 +1,119 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#ifndef __CONTACT_H__ +#define __CONTACT_H__ + +#include "../kademlia/Prefs.h" +#include "../kademlia/Kademlia.h" + +//////////////////////////////////////// +namespace Kademlia { +//////////////////////////////////////// + +class CContact +{ +public: + ~CContact(); + CContact(const CUInt128 &clientID, + uint32 ip, uint16 udpPort, uint16 tcpPort, + const CUInt128 &target = CKademlia::GetPrefs()->GetKadID()); + + const CUInt128& GetClientID(void) const { return m_clientID; }; + void SetClientID(const CUInt128 &clientID); + + const wxString GetClientIDString(void) const; + + const CUInt128& GetDistance(void) const { return m_distance; } + const wxString GetDistanceString(void) const; + + uint32 GetIPAddress(void) const; + void SetIPAddress(uint32 ip); + + uint16 GetTCPPort(void) const; + void SetTCPPort(uint16 port); + + uint16 GetUDPPort(void) const; + void SetUDPPort(uint16 port); + + byte GetType(void) const; + + void UpdateType(); + void CheckingType(); + + bool InUse(void) {return (m_inUse>0); } + void IncUse(void) {m_inUse++;} + void DecUse(void) + { + if (m_inUse) { + m_inUse--; + } else { + wxASSERT(0); + } + } + + const time_t GetCreatedTime() const {return m_created;} + + void SetExpireTime(time_t value) { m_expires = value; }; + const time_t GetExpireTime() const {return m_expires;} + + const time_t GetLastTypeSet() const {return m_lastTypeSet;} + + uint8 GetVersion() const { return m_uVersion; } + +private: + CUInt128 m_clientID; + CUInt128 m_distance; + uint32 m_ip; + uint16 m_tcpPort; + uint16 m_udpPort; + byte m_type; + time_t m_lastTypeSet; + time_t m_expires; + time_t m_created; + uint32 m_inUse; + + // Kad version + uint8 m_uVersion; +}; + +} // End namespace + +#endif // __CONTACT_H__ + +// File_checked_for_headers diff --git a/src/kademlia/routing/Makefile.am b/src/kademlia/routing/Makefile.am new file mode 100644 index 00000000..5395cfc6 --- /dev/null +++ b/src/kademlia/routing/Makefile.am @@ -0,0 +1,6 @@ +noinst_HEADERS = Contact.h \ + Maps.h \ + RoutingBin.h \ + RoutingZone.h + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/kademlia/routing/Makefile.in b/src/kademlia/routing/Makefile.in new file mode 100644 index 00000000..9a767471 --- /dev/null +++ b/src/kademlia/routing/Makefile.in @@ -0,0 +1,497 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/kademlia/routing +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +noinst_HEADERS = Contact.h \ + Maps.h \ + RoutingBin.h \ + RoutingZone.h + +MAINTAINERCLEANFILES = Makefile.in +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/kademlia/routing/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/kademlia/routing/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(HEADERS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + ctags distclean distclean-generic distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/kademlia/routing/Maps.h b/src/kademlia/routing/Maps.h new file mode 100644 index 00000000..a8ac9a56 --- /dev/null +++ b/src/kademlia/routing/Maps.h @@ -0,0 +1,61 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#ifndef __KAD_MAPS_H__ +#define __KAD_MAPS_H__ + +#include +#include +#include + +//////////////////////////////////////// +namespace Kademlia { +//////////////////////////////////////// + +class CUInt128; +class CContact; + +typedef std::map ContactMap; +typedef std::list ContactList; +typedef std::list UIntList; +typedef std::set UIntSet; + +} // End namespace + +#endif // __KAD_MAPS_H__ +// File_checked_for_headers diff --git a/src/kademlia/routing/RoutingBin.cpp b/src/kademlia/routing/RoutingBin.cpp new file mode 100644 index 00000000..a1ef49f4 --- /dev/null +++ b/src/kademlia/routing/RoutingBin.cpp @@ -0,0 +1,219 @@ +// +// This file is part of aMule Project +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Project ( http://www.amule-project.net ) +// Copyright (C)2003 Barry Dunne (http://www.emule-project.net) + +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + +// This work is based on the java implementation of the Kademlia protocol. +// Kademlia: Peer-to-peer routing based on the XOR metric +// Copyright (C) 2002 Petar Maymounkov [petar@post.harvard.edu] +// http://kademlia.scs.cs.nyu.edu + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#include "RoutingBin.h" +#include "Contact.h" +#include "../kademlia/Defines.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + + +//////////////////////////////////////// +using namespace Kademlia; +//////////////////////////////////////// + +CRoutingBin::CRoutingBin() +{ + m_dontDeleteContacts = false; +} + +CRoutingBin::~CRoutingBin() +{ + ContactList::const_iterator it; + if (!m_dontDeleteContacts) { + for (it = m_entries.begin(); it != m_entries.end(); ++it) { + delete *it; + } + } + + m_entries.clear(); +} + +bool CRoutingBin::Add(CContact *contact, bool check) +{ + wxASSERT(contact != NULL); + bool retVal = false; + // If this is already in the entries list + CContact *c = NULL; + if (check) + c=GetContact(contact->GetClientID()); + + if (c != NULL) { + // Move to the end of the list + Remove(c); + m_entries.push_back(c); + retVal = false; + } else { + // If not full, add to end of list + if ( m_entries.size() < K) { + m_entries.push_back(contact); + retVal = true; + } else { + retVal = false; + } + } + return retVal; +} + +void CRoutingBin::SetAlive(uint32 ip, uint16 port) +{ + if (m_entries.empty()) { + return; + } + + CContact *c; + ContactList::iterator it; + for (it = m_entries.begin(); it != m_entries.end(); ++it) { + c = *it; + if ((ip == c->GetIPAddress()) && (port == c->GetUDPPort())) { + c->UpdateType(); + break; + } + } +} + +void CRoutingBin::SetTCPPort(uint32 ip, uint16 port, uint16 tcpPort) +{ + if (m_entries.empty()) { + return; + } + + CContact *c; + ContactList::iterator it; + for (it = m_entries.begin(); it != m_entries.end(); ++it) { + c = *it; + if ((ip == c->GetIPAddress()) && (port == c->GetUDPPort())) { + c->SetTCPPort(tcpPort); + c->UpdateType(); + // Move to the end of the list + Remove(c); + m_entries.push_back(c); + break; + } + } +} + +void CRoutingBin::Remove(CContact *contact) +{ + m_entries.remove(contact); +} + +CContact *CRoutingBin::GetContact(const CUInt128 &id) +{ + CContact *retVal = NULL; + ContactList::const_iterator it; + for (it = m_entries.begin(); it != m_entries.end(); ++it) { + if ((*it)->GetClientID() == id) { + retVal = *it; + break; + } + } + return retVal; +} + +uint32 CRoutingBin::GetSize(void) const +{ + return (uint32)m_entries.size(); +} + +uint32 CRoutingBin::GetRemaining(void) const +{ + return (uint32)K - m_entries.size(); +} + +void CRoutingBin::GetEntries(ContactList *result, bool emptyFirst) +{ + if (emptyFirst) { + result->clear(); + } + if (m_entries.size() > 0) { + result->insert(result->end(), m_entries.begin(), m_entries.end()); + } +} + +CContact *CRoutingBin::GetOldest(void) +{ + if (m_entries.size() > 0) { + return m_entries.front(); + } + return NULL; +} + +void CRoutingBin::GetClosestTo(uint32 maxType, const CUInt128 &target, uint32 maxRequired, ContactMap *result, bool emptyFirst, bool inUse) +{ + // If we have to clear the bin, do it now. + if (emptyFirst) { + result->clear(); + } + + // No entries, no closest. + if (m_entries.size() == 0) { + return; + } + + // First put results in sort order for target so we can insert them correctly. + // We don't care about max results at this time. + + ContactList::const_iterator it; + for (it = m_entries.begin(); it != m_entries.end(); ++it) { + if((*it)->GetType() <= maxType) { + CUInt128 targetDistance((*it)->GetClientID()); + targetDistance.XOR(target); + (*result)[targetDistance] = *it; + // This list will be used for an unknown time, Inc in use so it's not deleted. + if( inUse ) { + (*it)->IncUse(); + } + } + } + + // Remove any extra results by least wanted first. + while (result->size() > maxRequired) { + // Dec in use count. + if( inUse ) { + (--result->end())->second->DecUse(); + } + // Remove from results + result->erase(--result->end()); + } +} +// File_checked_for_headers diff --git a/src/kademlia/routing/RoutingBin.h b/src/kademlia/routing/RoutingBin.h new file mode 100644 index 00000000..54818a57 --- /dev/null +++ b/src/kademlia/routing/RoutingBin.h @@ -0,0 +1,88 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#ifndef __ROUTING_BIN__ +#define __ROUTING_BIN__ + +#include "Maps.h" +#include "../../Types.h" + +//////////////////////////////////////// +namespace Kademlia { +//////////////////////////////////////// + +class CUInt128; +class CRoutingZone; +class CContact; + +class CRoutingBin +{ + friend class CRoutingZone; + +public: + + ~CRoutingBin(); + +private: + + CRoutingBin(); + bool Add(CContact *contact, bool check = true); + void SetAlive(uint32 ip, uint16 port); + void SetTCPPort(uint32 ip, uint16 port, uint16 tcpPort); + void Remove(CContact *contact); + CContact *GetContact(const CUInt128 &id); + CContact *GetOldest(void); + + uint32 GetSize() const; + uint32 GetRemaining(void) const; + void GetEntries(ContactList *result, bool emptyFirst = true); + + void GetClosestTo(uint32 maxType, const CUInt128 &target, uint32 maxRequired, ContactMap *result, bool emptyFirst = true, bool +setInUse = false); + + // Debug purposes. +// void dumpContents(void); + + bool m_dontDeleteContacts; + ContactList m_entries; +}; + +} // End namespace + +#endif // __ROUTING_BIN__ +// File_checked_for_headers diff --git a/src/kademlia/routing/RoutingZone.cpp b/src/kademlia/routing/RoutingZone.cpp new file mode 100644 index 00000000..36192847 --- /dev/null +++ b/src/kademlia/routing/RoutingZone.cpp @@ -0,0 +1,566 @@ +// +// This file is part of aMule Project +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Project ( http://www.amule-project.net ) +// Copyright (C)2003 Barry Dunne (http://www.emule-project.net) + +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + +// This work is based on the java implementation of the Kademlia protocol. +// Kademlia: Peer-to-peer routing based on the XOR metric +// Copyright (C) 2002 Petar Maymounkov [petar@post.harvard.edu] +// http://kademlia.scs.cs.nyu.edu + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +/** + * The *Zone* is just a node in a binary tree of *Zone*s. + * Each zone is either an internal node or a leaf node. + * Internal nodes have "bin == null" and "subZones[i] != null", + * leaf nodes have "subZones[i] == null" and "bin != null". + * + * All key unique id's are relative to the center (self), which + * is considered to be 000..000 + */ +#include "RoutingZone.h" + +#include +#include + +#include "Contact.h" +#include "RoutingBin.h" +#include "../kademlia/SearchManager.h" +#include "../kademlia/Defines.h" +#include "../net/KademliaUDPListener.h" +#include "../../amule.h" +#include "../../CFile.h" +#include "../../Logger.h" +#include "../../NetworkFunctions.h" + +#include + +//////////////////////////////////////// +using namespace Kademlia; +//////////////////////////////////////// + +// This is just a safety precaution +#define CONTACT_FILE_LIMIT 5000 + +wxString CRoutingZone::m_filename; +CUInt128 CRoutingZone::me((uint32)0); + +CRoutingZone::CRoutingZone() +{ + // Can only create routing zone after prefs + me = CKademlia::GetPrefs()->GetKadID(); + m_filename = theApp->ConfigDir + wxT("nodes.dat"); + CUInt128 zero((uint32)0); + Init(NULL, 0, zero); +} + +CRoutingZone::CRoutingZone(CRoutingZone *super_zone, int level, const CUInt128 &zone_index) +{ + Init(super_zone, level, zone_index); +} + +void CRoutingZone::Init(CRoutingZone *super_zone, int level, const CUInt128 &zone_index) +{ + m_superZone = super_zone; + m_level = level; + m_zoneIndex = zone_index; + m_subZones[0] = NULL; + m_subZones[1] = NULL; + m_bin = new CRoutingBin(); + + m_nextSmallTimer = time(NULL) + m_zoneIndex.Get32BitChunk(3); + + if ((m_superZone == NULL) && (m_filename.Length() > 0)) { + ReadFile(); + } + + dirty = false; + + StartTimer(); +} + +CRoutingZone::~CRoutingZone() +{ + if ((m_superZone == NULL) && (m_filename.Length() > 0)) { + WriteFile(); + } + if (IsLeaf()) { + delete m_bin; + } else { + delete m_subZones[0]; + delete m_subZones[1]; + } +} + +void CRoutingZone::ReadFile(void) +{ + try { + uint32 numContacts = 0; + CFile file; + if (CPath::FileExists(m_filename) && file.Open(m_filename, CFile::read)) { + numContacts = file.ReadUInt32(); + for (uint32 i = 0; i < numContacts; i++) { + CUInt128 id = file.ReadUInt128(); + uint32 ip = file.ReadUInt32(); + uint16 udpPort = file.ReadUInt16(); + uint16 tcpPort = file.ReadUInt16(); + byte type = file.ReadUInt8(); + if(IsGoodIPPort(wxUINT32_SWAP_ALWAYS(ip),udpPort)) { + if( type < 4) { + Add(id, ip, udpPort, tcpPort, type); + } + } + } + AddLogLineM( false, wxString::Format(wxPLURAL("Read %u Kad contact", "Read %u Kad contacts", numContacts), numContacts)); + } + if (numContacts == 0) { + AddDebugLogLineM( false, logKadRouting, wxT("Error while reading Kad contacts - 0 entries")); + } + } catch (const CSafeIOException& e) { + AddDebugLogLineM(false, logKadRouting, wxT("IO error in CRoutingZone::readFile: ") + e.what()); + } +} + +void CRoutingZone::WriteFile(void) +{ + try { + unsigned int count = 0; + CContact *c; + CFile file; + if (file.Open(m_filename, CFile::write)) { + ContactList contacts; + GetBootstrapContacts(&contacts, 200); + file.WriteUInt32((uint32)std::min((int)contacts.size(), CONTACT_FILE_LIMIT)); + ContactList::const_iterator it; + for (it = contacts.begin(); it != contacts.end(); ++it) { + count++; + c = *it; + file.WriteUInt128(c->GetClientID()); + file.WriteUInt32(c->GetIPAddress()); + file.WriteUInt16(c->GetUDPPort()); + file.WriteUInt16(c->GetTCPPort()); + file.WriteUInt8(c->GetType()); + if (count == CONTACT_FILE_LIMIT) { + break; + } + } + } + AddDebugLogLineM( false, logKadRouting, wxString::Format(wxT("Wrote %d contacts to file."), count)); + } catch (const CIOFailureException& e) { + AddDebugLogLineM(true, logKadRouting, wxT("IO failure in CRoutingZone::writeFile: ") + e.what()); + } +} + +bool CRoutingZone::CanSplit(void) const +{ + if (m_level >= 127) { + return false; + } + + /* Check if we are close to the center */ + if ( (m_zoneIndex < KK || m_level < KBASE) && m_bin->GetSize() == K) { + return true; + } + return false; +} + +bool CRoutingZone::Add(const CUInt128 &id, uint32 ip, uint16 port, uint16 tport, byte type) +{ + + //AddDebugLogLineM(false, logKadMain, wxT("Adding a contact (routing) with ip ") + Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(ip),port)); + + if (id == me) { + return false; + } + + CUInt128 distance(me); + distance.XOR(id); + + return AddByDistance(distance,id,ip,port,tport,type); +} + +bool CRoutingZone::AddByDistance(const CUInt128 &distance, const CUInt128 &id, uint32 ip, uint16 port, uint16 tport, byte type) { + + bool retVal = false; + CContact *c = NULL; + + if (!IsLeaf()) { + retVal = m_subZones[distance.GetBitNumber(m_level)]->AddByDistance(distance, id, ip, port, tport, type); + } else { + c = m_bin->GetContact(id); + if (c != NULL) { + c->SetIPAddress(ip); + c->SetUDPPort(port); + c->SetTCPPort(tport); + retVal = true; + } else if (m_bin->GetRemaining() > 0) { + c = new CContact(id, ip, port, tport); + retVal = m_bin->Add(c,false); + } else if (CanSplit()) { + Split(); + retVal = m_subZones[distance.GetBitNumber(m_level)]->AddByDistance(distance, id, ip, port, tport, type); + }/* else { + Merge(); + c = new CContact(id, ip, port, tport); + retVal = m_bin->Add(c,false); + }*/ + + if (!retVal) { + if (c != NULL) { + delete c; + } + } + } + + return retVal; +} + +void CRoutingZone::Remove(const CUInt128 &id) { + CUInt128 distance(me); + distance.XOR(id); + if (!IsLeaf()) { + m_subZones[distance.GetBitNumber(m_level)]->Remove(id); + } else { + CContact *c = m_bin->GetContact(id); + if (c) { + m_bin->Remove(c); + } + } +} + +void CRoutingZone::SetAlive(uint32 ip, uint16 port) +{ + if (IsLeaf()) { + m_bin->SetAlive(ip, port); + } else { + m_subZones[0]->SetAlive(ip, port); + m_subZones[1]->SetAlive(ip, port); + } +} + +CContact *CRoutingZone::GetContact(const CUInt128 &id) const +{ + if (IsLeaf()) { + return m_bin->GetContact(id); + } else { + return m_subZones[id.GetBitNumber(m_level)]->GetContact(id); + } +} + +void CRoutingZone::GetClosestTo(uint32 maxType, const CUInt128 &target, const CUInt128 &distance, uint32 maxRequired, ContactMap *result, bool emptyFirst, bool inUse) const +{ + // If leaf zone, do it here + if (IsLeaf()) { + m_bin->GetClosestTo(maxType, target, maxRequired, result, emptyFirst, inUse); + return; + } + + // otherwise, recurse in the closer-to-the-target subzone first + int closer = distance.GetBitNumber(m_level); + m_subZones[closer]->GetClosestTo(maxType, target, distance, maxRequired, result, emptyFirst, inUse); + + // if still not enough tokens found, recurse in the other subzone too + if (result->size() < maxRequired) { + m_subZones[1-closer]->GetClosestTo(maxType, target, distance, maxRequired, result, false, inUse); + } +} + +void CRoutingZone::GetAllEntries(ContactList *result, bool emptyFirst) +{ + if (IsLeaf()) { + m_bin->GetEntries(result, emptyFirst); + } else { + m_subZones[0]->GetAllEntries(result, emptyFirst); + m_subZones[1]->GetAllEntries(result, false); + } +} + +void CRoutingZone::TopDepth(int depth, ContactList *result, bool emptyFirst) +{ + if (IsLeaf()) { + m_bin->GetEntries(result, emptyFirst); + } else if (depth <= 0) { + RandomBin(result, emptyFirst); + } else { + m_subZones[0]->TopDepth(depth-1, result, emptyFirst); + m_subZones[1]->TopDepth(depth-1, result, false); + } +} + +void CRoutingZone::RandomBin(ContactList *result, bool emptyFirst) +{ + if (IsLeaf()) { + m_bin->GetEntries(result, emptyFirst); + } else { + m_subZones[rand()&1]->RandomBin(result, emptyFirst); + } +} + +uint32 CRoutingZone::GetMaxDepth(void) const +{ + if (IsLeaf()) { + return 0; + } + return 1 + std::max(m_subZones[0]->GetMaxDepth(), m_subZones[1]->GetMaxDepth()); +} + +void CRoutingZone::Split(void) +{ + StopTimer(); + + m_subZones[0] = GenSubZone(0); + m_subZones[1] = GenSubZone(1); + + ContactList entries; + m_bin->GetEntries(&entries); + ContactList::const_iterator it; + for (it = entries.begin(); it != entries.end(); ++it) { + int sz = (*it)->GetDistance().GetBitNumber(m_level); + m_subZones[sz]->m_bin->Add(*it); + } + m_bin->m_dontDeleteContacts = true; + delete m_bin; + m_bin = NULL; +} + +void CRoutingZone::Merge(void) +{ + dirty = false; /* This subzone/superzone won't be re-checked */ + + AddDebugLogLineM( false, logKadRouting, wxT("Merge attempt")); + + if (IsLeaf() && m_superZone != NULL) { + AddDebugLogLineM( false, logKadRouting, wxT("Recursive merge")); + m_superZone->Merge(); + } else if ((!IsLeaf()) + && (m_subZones[0]->IsLeaf() && m_subZones[1]->IsLeaf()) + && (GetNumContacts()) < (K/2) ) + { + m_bin = new CRoutingBin(); + + m_subZones[0]->StopTimer(); + m_subZones[1]->StopTimer(); + + if (GetNumContacts() > 0) { + ContactList list0; + ContactList list1; + m_subZones[0]->m_bin->GetEntries(&list0); + m_subZones[1]->m_bin->GetEntries(&list1); + ContactList::const_iterator it; + for (it = list0.begin(); it != list0.end(); ++it) { + m_bin->Add(*it); + } + for (it = list1.begin(); it != list1.end(); ++it) { + m_bin->Add(*it); + } + } + + m_subZones[0]->m_superZone = NULL; + m_subZones[1]->m_superZone = NULL; + + m_subZones[0]->m_bin->m_dontDeleteContacts = true; + m_subZones[1]->m_bin->m_dontDeleteContacts = true; + + delete m_subZones[0]; + delete m_subZones[1]; + + m_subZones[0] = NULL; + m_subZones[1] = NULL; + + StartTimer(); + + AddDebugLogLineM( false, logKadRouting, wxT("Sucessful merge!")); + + if (m_superZone != NULL) { + m_superZone->Merge(); + } + } else { + AddDebugLogLineM( false, logKadRouting, wxT("No merge possible")); + } +} + +bool CRoutingZone::IsLeaf(void) const +{ + return (m_bin != NULL); +} + +CRoutingZone *CRoutingZone::GenSubZone(int side) +{ + CUInt128 newIndex(m_zoneIndex); + newIndex.ShiftLeft(1); + if (side != 0) { + newIndex.Add(1); + } + CRoutingZone *retVal = new CRoutingZone(this, m_level+1, newIndex); + return retVal; +} + +void CRoutingZone::StartTimer(void) +{ + time_t now = time(NULL); + // Start filling the tree, closest bins first. + m_nextBigTimer = now + (MIN2S(1)*m_zoneIndex.Get32BitChunk(3)) + SEC(10); + CKademlia::AddEvent(this); +} + +void CRoutingZone::StopTimer(void) +{ + CKademlia::RemoveEvent(this); +} + +bool CRoutingZone::OnBigTimer(void) +{ + if (!IsLeaf()) { + return false; + } + + if ( (m_zoneIndex < KK || m_level < KBASE || m_bin->GetRemaining() >= (K*.4))) { + RandomLookup(); + return true; + } + + return false; +} + +//This is used when we find a leaf and want to know what this sample looks like. +//We fall back two levels and take a sample to try to minimize any areas of the +//tree that will give very bad results. +uint32 CRoutingZone::EstimateCount() +{ + if( !IsLeaf() ) { + return 0; + } + if( m_level < KBASE ) { + return (uint32)(pow((double)2, (int)m_level)*10); + } + CRoutingZone* curZone = m_superZone->m_superZone->m_superZone; + + float modify = ((float)curZone->GetNumContacts())/20.0F; + return (uint32)(pow((double) 2, (int)m_level-2)*10*(modify)); +} + +void CRoutingZone::OnSmallTimer(void) +{ + if (!IsLeaf()) { + return; + } + + dirty = false; + + wxString test(m_zoneIndex.ToBinaryString()); + + CContact *c = NULL; + time_t now = time(NULL); + ContactList entries; + ContactList::iterator it; + + // Remove dead entries + m_bin->GetEntries(&entries); + for (it = entries.begin(); it != entries.end(); ++it) { + c = *it; + if ( c->GetType() == 4) { + if (((c->GetExpireTime() > 0) && (c->GetExpireTime() <= now))) { + if(!c->InUse()) { + m_bin->Remove(c); + delete c; + dirty = true; + } + continue; + } + } + if(c->GetExpireTime() == 0) { + c->SetExpireTime(now); + } + } + c = NULL; + //Ping only contacts that are in the branches that meet the set level and are not close to our ID. + //The other contacts are checked with the big timer. + if( m_bin->GetRemaining() < (K*(.4)) ) { + c = m_bin->GetOldest(); + } + + if( c != NULL ) { + if ( c->GetExpireTime() >= now || c->GetType() == 4) { + dirty = true; + m_bin->Remove(c); + m_bin->m_entries.push_back(c); + c = NULL; + } + } + + if(c != NULL) { + c->CheckingType(); + AddDebugLogLineM(false, logClientKadUDP, wxT("KadHelloReq to ") + Uint32_16toStringIP_Port(wxUINT32_SWAP_ALWAYS(c->GetIPAddress()), c->GetUDPPort())); + CKademlia::GetUDPListener()->SendMyDetails(KADEMLIA_HELLO_REQ, c->GetIPAddress(), c->GetUDPPort()); + } +} + +void CRoutingZone::RandomLookup(void) +{ + // Look-up a random client in this zone + CUInt128 prefix(m_zoneIndex); + prefix.ShiftLeft(128 - m_level); + CUInt128 random(prefix, m_level); + random.XOR(me); + CSearchManager::FindNode(random); +} + +uint32 CRoutingZone::GetNumContacts(void) const +{ + if (IsLeaf()) { + return m_bin->GetSize(); + } else { + return m_subZones[0]->GetNumContacts() + m_subZones[1]->GetNumContacts(); + } +} + +uint32 CRoutingZone::GetBootstrapContacts(ContactList *results, uint32 maxRequired) +{ + wxASSERT(m_superZone == NULL); + + results->clear(); + + uint32 retVal = 0; + ContactList top; + TopDepth(LOG_BASE_EXPONENT, &top); + if (top.size() > 0) { + ContactList::const_iterator it; + for (it = top.begin(); it != top.end(); ++it) { + results->push_back(*it); + retVal++; + if (retVal == maxRequired) { + break; + } + } + } + + return retVal; +} +// File_checked_for_headers diff --git a/src/kademlia/routing/RoutingZone.h b/src/kademlia/routing/RoutingZone.h new file mode 100644 index 00000000..f069d6c3 --- /dev/null +++ b/src/kademlia/routing/RoutingZone.h @@ -0,0 +1,172 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#ifndef __ROUTING_ZONE__ +#define __ROUTING_ZONE__ + +#include "Maps.h" +#include "../utils/UInt128.h" + +//////////////////////////////////////// +namespace Kademlia { +//////////////////////////////////////// + +class CRoutingBin; +//class CPing; +class CContact; + +/** + * The *Zone* is just a node in a binary tree of *Zone*s. + * Each zone is either an internal node or a leaf node. + * Internal nodes have "bin == null" and "subZones[i] != null", + * leaf nodes have "subZones[i] == null" and "bin != null". + * + * All key pseudoaddresses are relative to the center (self), which + * is considered to be 000..000 + */ +class CRoutingZone +{ + //friend CRoutingZone; +public: + + CRoutingZone(); + ~CRoutingZone(); + + time_t m_nextBigTimer; + time_t m_nextSmallTimer; + bool OnBigTimer(void); + void OnSmallTimer(void); + + bool Add(const CUInt128 &id, uint32 ip, uint16 port, uint16 tport, byte type); + void Remove(const CUInt128 &id); + void SetAlive(uint32 ip, uint16 port); + + CContact *GetContact(const CUInt128 &id) const; + uint32 GetNumContacts(void) const; + + // Returns a list of all contacts in all leafs of this zone. + void GetAllEntries(ContactList *result, bool emptyFirst = true); + + // Returns the *maxRequired* tokens that are closest to the target within this zone's subtree. + void GetClosestTo(uint32 maxType, const CUInt128 &target, const CUInt128 &distance, uint32 maxRequired, ContactMap *result, bool emptyFirst = true, bool setInUse = false) const; + + // Ideally: Returns all contacts that are in buckets of common range between us and the asker. + // In practice: returns the contacts from the top (2^{logBase+1}) buckets. + uint32 GetBootstrapContacts(ContactList *results, uint32 maxRequired); + + /** Debugging. */ +// void dumpContents(LPCTSTR prefix = NULL) const; +// void selfTest(void); + +// uint64 getApproximateNodeCount(uint32 ourLevel) const; + + bool IsDirty() const { return dirty; } + + uint32 EstimateCount(); + + void Merge(void); + +private: + + CRoutingZone(CRoutingZone *super_zone, int level, const CUInt128 &zone_index); + void Init(CRoutingZone *super_zone, int level, const CUInt128 &zone_index); + + bool AddByDistance(const CUInt128 &distance, const CUInt128 &id, uint32 ip, uint16 port, uint16 tport, byte type); + + /** + * Zone pair is an array of two. Either both entries are null, which + * means that *this* is a leaf zone, or both are non-null which means + * that *this* has been split into equally sized finer zones. + * The zone with index 0 is the one closer to our *self* token. + */ + CRoutingZone *m_subZones[2]; + CRoutingZone *m_superZone; + + static wxString m_filename; + static CUInt128 me; + + void ReadFile(void); + void WriteFile(void); + + bool IsLeaf(void) const; + bool CanSplit(void) const; + + // Returns all contacts from this zone tree that are no deeper than *depth* from the current zone. + void TopDepth(int depth, ContactList *result, bool emptyFirst = true); + + // Returns the maximum depth of the tree as the number of edges of the longest path to a leaf. + uint32 GetMaxDepth(void) const; + + void RandomBin(ContactList *result, bool emptyFirst = true); + + /** + * The level indicates what size chunk of the address space + * this zone is representing. Level 0 is the whole space, + * level 1 is 1/2 of the space, level 2 is 1/4, etc. + */ + uint32 m_level; + + /** + * This is the distance in number of zones from the zone at this level + * that contains the center of the system; distance is wrt the XOR metric. + */ + CUInt128 m_zoneIndex; + + /** List of contacts, if this zone is a leaf zone. */ + CRoutingBin *m_bin; + + /** + * Generates a new TokenBin for this zone. Used when the current zone is becoming a leaf zone. + * Must be deleted by caller + */ + CRoutingZone *GenSubZone(int side); + + void Split(void); + + void StartTimer(void); + void StopTimer(void); + + void RandomLookup(void); + + bool dirty; +}; + +} // End namespace + +#endif // __ROUTING_ZONE__ +// File_checked_for_headers diff --git a/src/kademlia/utils/LittleEndian.cpp b/src/kademlia/utils/LittleEndian.cpp new file mode 100644 index 00000000..f6d897e8 --- /dev/null +++ b/src/kademlia/utils/LittleEndian.cpp @@ -0,0 +1,86 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#include "LittleEndian.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + + +//////////////////////////////////////// +namespace Kademlia { +//////////////////////////////////////// + +//NOTE: avoid those function whenever possible -> terribly slow +uint16 Le(uint16 val) +{ + uint32 b0 = (val ) & 0xFF; + uint32 b1 = (val >> 8) & 0xFF; + return (uint16) ((b0 << 8) | b1); +} + +//NOTE: avoid those function whenever possible -> terribly slow +uint32 Le(uint32 val) +{ + uint32 b0 = (val ) & 0xFF; + uint32 b1 = (val >> 8) & 0xFF; + uint32 b2 = (val >> 16) & 0xFF; + uint32 b3 = (val >> 24) & 0xFF; + return (b0 << 24) | (b1 << 16) | (b2 << 8) | b3; +} + +//NOTE: avoid those function whenever possible -> terribly slow +uint64 Le(uint64 val) +{ + uint32 b0 = (uint32)((val ) & 0xFF); + uint32 b1 = (uint32)((val >> 8) & 0xFF); + uint32 b2 = (uint32)((val >> 16) & 0xFF); + uint32 b3 = (uint32)((val >> 24) & 0xFF); + uint32 b4 = (uint32)((val >> 32) & 0xFF); + uint32 b5 = (uint32)((val >> 40) & 0xFF); + uint32 b6 = (uint32)((val >> 48) & 0xFF); + uint32 b7 = (uint32)((val >> 56) & 0xFF); + return ((uint64)b0 << 56) | ((uint64)b1 << 48) | ((uint64)b2 << 40) | ((uint64)b3 << 32) | + ((uint64)b4 << 24) | ((uint64)b5 << 16) | ((uint64)b6 << 8) | (uint64)b7; +} + +} // End namespace +// File_checked_for_headers diff --git a/src/kademlia/utils/LittleEndian.h b/src/kademlia/utils/LittleEndian.h new file mode 100644 index 00000000..1cbf7a72 --- /dev/null +++ b/src/kademlia/utils/LittleEndian.h @@ -0,0 +1,56 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#ifndef __KAD_LITTLE_ENDIAN_H +#define __KAD_LITTLE_ENDIAN_H + +#include "../../Types.h" + +//////////////////////////////////////// +namespace Kademlia { +//////////////////////////////////////// + +//NOTE: avoid those function whenever possible -> terribly slow +uint16 Le(uint16 val); +uint32 Le(uint32 val); +uint64 Le(uint64 val); + +} // End namespace + +#endif // __KAD_LITTLE_ENDIAN_H +// File_checked_for_headers diff --git a/src/kademlia/utils/Makefile.am b/src/kademlia/utils/Makefile.am new file mode 100644 index 00000000..7dba598e --- /dev/null +++ b/src/kademlia/utils/Makefile.am @@ -0,0 +1,3 @@ +noinst_HEADERS = UInt128.h LittleEndian.h + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/kademlia/utils/Makefile.in b/src/kademlia/utils/Makefile.in new file mode 100644 index 00000000..d5a86a92 --- /dev/null +++ b/src/kademlia/utils/Makefile.in @@ -0,0 +1,493 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/kademlia/utils +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +noinst_HEADERS = UInt128.h LittleEndian.h +MAINTAINERCLEANFILES = Makefile.in +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/kademlia/utils/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/kademlia/utils/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(HEADERS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + ctags distclean distclean-generic distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/kademlia/utils/UInt128.cpp b/src/kademlia/utils/UInt128.cpp new file mode 100644 index 00000000..5d01869f --- /dev/null +++ b/src/kademlia/utils/UInt128.cpp @@ -0,0 +1,302 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#include "UInt128.h" + +#include "../../CryptoPP_Inc.h" +#include "../../ArchSpecific.h" + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[]=__FILE__; +#define new DEBUG_NEW +#endif + + +//////////////////////////////////////// +using namespace Kademlia; +using namespace CryptoPP; +//////////////////////////////////////// + +CUInt128::CUInt128() +{ + SetValue((uint32)0); +} + +CUInt128::CUInt128(bool fill) +{ + if( fill ) + { + // Endian safe (-1 = 0xFFFF) + m_data[0] = (uint32)-1; + m_data[1] = (uint32)-1; + m_data[2] = (uint32)-1; + m_data[3] = (uint32)-1; + } + else + SetValue((uint32)0); +} + +CUInt128::CUInt128(uint32 value) +{ + SetValue(value); +} + +CUInt128::CUInt128(const byte *valueBE) +{ + SetValueBE(valueBE); +} + +CUInt128::CUInt128(const CUInt128 &value, uint32 numBits) +{ + // Copy the whole uint32s + uint32 numULONGs = numBits / 32; + for (uint32 i=0; i 127) + return 0; + int ulongNum = bit / 32; + + int shift = 31 - (bit % 32); + return ((m_data[ulongNum] >> shift) & 1); +} + +CUInt128& CUInt128::SetBitNumber(uint32 bit, uint32 value) +{ + int ulongNum = bit / 32; + int shift = 31 - (bit % 32); + m_data[ulongNum] |= (1 << shift); + if (value == 0) + m_data[ulongNum] ^= (1 << shift); + return *this; +} + +CUInt128& CUInt128::XOR(const CUInt128 &value) +{ + for (int i=0; i<4; ++i) + m_data[i] ^= value.m_data[i]; + return *this; +} + +CUInt128& CUInt128::XORBE(const byte *valueBE) +{ + CUInt128 temp(valueBE); + return XOR(temp); +} + +wxString CUInt128::ToHexString(void) const +{ + wxString str; + for (int i=0; i<4; ++i) + { + str.Append(wxString::Format(wxT("%08X"), m_data[i])); + } + return str; +} + +wxString CUInt128::ToBinaryString(bool trim) const +{ + wxString str; + int b; + for (int i=0; i<128; ++i) + { + b = GetBitNumber(i); + if ((!trim) || (b != 0)) { + str.Append(wxString::Format(wxT("%d"), b)); + trim = false; + } + } + if (str.Len() == 0) { + str = wxT("0"); + } + return str; +} + +void CUInt128::ToByteArray(byte *b) const +{ + RawPokeUInt32(b+0, SWAP_ULONG_LE(m_data[0])); + RawPokeUInt32(b+4, SWAP_ULONG_LE(m_data[1])); + RawPokeUInt32(b+8, SWAP_ULONG_LE(m_data[2])); + RawPokeUInt32(b+12,SWAP_ULONG_LE(m_data[3])); +} + +int CUInt128::CompareTo(const CUInt128 &other) const +{ + for (int i=0; i<4; ++i) + { + if (m_data[i] < other.m_data[i]) + return -1; + if (m_data[i] > other.m_data[i]) + return 1; + } + return 0; +} + +int CUInt128::CompareTo(uint32 value) const +{ + if ((m_data[0] > 0) || (m_data[1] > 0) || (m_data[2] > 0) || (m_data[3] > value)) + return 1; + if (m_data[3] < value) + return -1; + return 0; +} + +CUInt128& CUInt128::Add(const CUInt128 &value) +{ + if (value == 0) + return *this; + int64 sum = 0; + for (int i=3; i>=0; i--) + { + sum += m_data[i]; + sum += value.m_data[i]; + m_data[i] = (uint32)sum; + sum = sum >> 32; + } + return *this; +} + +CUInt128& CUInt128::Add(uint32 value) +{ + if (value == 0) + return *this; + CUInt128 temp(value); + Add(temp); + return *this; +} + +CUInt128& CUInt128::Subtract(const CUInt128 &value) +{ + if (value == 0) + return *this; + int64 sum = 0; + for (int i=3; i>=0; i--) + { + sum += m_data[i]; + sum -= value.m_data[i]; + m_data[i] = (uint32)sum; + sum = sum >> 32; + } + return *this; +} + +CUInt128& CUInt128::Subtract(uint32 value) +{ + if (value == 0) + return *this; + CUInt128 temp(value); + Subtract(temp); + return *this; +} + +CUInt128& CUInt128::ShiftLeft(uint32 bits) +{ + if ((bits == 0) || (CompareTo(0) == 0)) + return *this; + if (bits > 127) + { + SetValue((uint32)0); + return *this; + } + + uint32 result[] = {0,0,0,0}; + int indexShift = (int)bits / 32; + int64 shifted = 0; + for (int i=3; i>=indexShift; i--) + { + shifted += ((int64)m_data[i]) << (bits % 32); + result[i-indexShift] = (uint32)shifted; + shifted = shifted >> 32; + } + for (int i=0; i<4; ++i) + m_data[i] = result[i]; + return *this; +} +// File_checked_for_headers diff --git a/src/kademlia/utils/UInt128.h b/src/kademlia/utils/UInt128.h new file mode 100644 index 00000000..8bdfdb47 --- /dev/null +++ b/src/kademlia/utils/UInt128.h @@ -0,0 +1,124 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal (Kry) ( kry@amule.org ) +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003 Barry Dunne (http://www.emule-project.net) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +// Note To Mods // +/* +Please do not change anything here and release it.. +There is going to be a new forum created just for the Kademlia side of the client.. +If you feel there is an error or a way to improve something, please +post it in the forum first and let us look at it.. If it is a real improvement, +it will be added to the offical client.. Changing something without knowing +what all it does can cause great harm to the network if released in mass form.. +Any mod that changes anything within the Kademlia side will not be allowed to advertise +there client on the eMule forum.. +*/ + +#ifndef __UINT128_H__ +#define __UINT128_H__ + +#include "../../Types.h" + +//////////////////////////////////////// +namespace Kademlia { +//////////////////////////////////////// + +class CUInt128 +{ +public: + + CUInt128(); + explicit CUInt128(bool fill); + explicit CUInt128(uint32 value); + explicit CUInt128(const byte *valueBE); + /** + * Generates a new number, copying the most significant 'numBits' bits from 'value'. + * The remaining bits are randomly generated. + */ + CUInt128(const CUInt128 &value, uint32 numBits = 128); + + ~CUInt128() {}; + + const byte* GetData() const { return (byte*)m_data; } + byte* GetDataPtr() const { return (byte*)m_data; } + + /** Bit at level 0 being most significant. */ + uint32 GetBitNumber(uint32 bit) const; + int CompareTo(const CUInt128 &other) const; + int CompareTo(uint32 value) const; + + wxString ToHexString(void) const; + wxString ToBinaryString(bool trim = false) const; + void ToByteArray(byte *b) const; + + uint32 Get32BitChunk(int val) const {return m_data[val];} + + CUInt128& SetValue(const CUInt128 &value); + CUInt128& SetValue(uint32 value); + CUInt128& SetValueBE(const byte *valueBE); + + CUInt128& SetValueRandom(void); +// CUInt128& SetValueGUID(void); + + CUInt128& SetBitNumber(uint32 bit, uint32 value); + CUInt128& ShiftLeft(uint32 bits); + + CUInt128& Add(const CUInt128 &value); + CUInt128& Add(uint32 value); + CUInt128& Subtract(const CUInt128 &value); + CUInt128& Subtract(uint32 value); + + CUInt128& XOR(const CUInt128 &value); + CUInt128& XORBE(const byte *valueBE); + + void operator+ (const CUInt128 &value) {Add(value);} + void operator- (const CUInt128 &value) {Subtract(value);} + void operator= (const CUInt128 &value) {SetValue(value);} + bool operator< (const CUInt128 &value) const {return (CompareTo(value) < 0);} + bool operator> (const CUInt128 &value) const {return (CompareTo(value) > 0);} + bool operator<= (const CUInt128 &value) const {return (CompareTo(value) <= 0);} + bool operator>= (const CUInt128 &value) const {return (CompareTo(value) >= 0);} + bool operator== (const CUInt128 &value) const {return (CompareTo(value) == 0);} + bool operator!= (const CUInt128 &value) const {return (CompareTo(value) != 0);} + + void operator+ (uint32 value) {Add(value);} + void operator- (uint32 value) {Subtract(value);} + void operator= (uint32 value) {SetValue(value);} + bool operator< (uint32 value) const {return (CompareTo(value) < 0);} + bool operator> (uint32 value) const {return (CompareTo(value) > 0);} + bool operator<= (uint32 value) const {return (CompareTo(value) <= 0);} + bool operator>= (uint32 value) const {return (CompareTo(value) >= 0);} + bool operator== (uint32 value) const {return (CompareTo(value) == 0);} + bool operator!= (uint32 value) const {return (CompareTo(value) != 0);} + +private: + + uint32 m_data[4]; +}; + +} // End namespace + +#endif +// File_checked_for_headers diff --git a/src/libs/Makefile.am b/src/libs/Makefile.am new file mode 100644 index 00000000..210fcbc6 --- /dev/null +++ b/src/libs/Makefile.am @@ -0,0 +1,3 @@ +SUBDIRS = ec common + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/libs/Makefile.in b/src/libs/Makefile.in new file mode 100644 index 00000000..6fc5610c --- /dev/null +++ b/src/libs/Makefile.in @@ -0,0 +1,602 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/libs +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +SUBDIRS = ec common +MAINTAINERCLEANFILES = Makefile.in +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/libs/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/libs/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-recursive ctags ctags-recursive \ + distclean distclean-generic distclean-recursive distclean-tags \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/libs/common/FileFunctions.cpp b/src/libs/common/FileFunctions.cpp new file mode 100644 index 00000000..789ba36b --- /dev/null +++ b/src/libs/common/FileFunctions.cpp @@ -0,0 +1,337 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include // Needed for wxDir +#include // Needed for wxZipFSHandler +#include // wxFileInputStream +#include // Needed for wxZipInputStream +#include // Needed for wxZlibInputStream +#include // Needed for wxMutex +#include // Needed for wxSysErrorMsg + +#include +#include +#ifdef __WXMAC__ +#include // Do_not_auto_remove +#endif +#include // Needed for std::auto_ptr + +#include "FileFunctions.h" +#include "StringFunctions.h" + +// +// This class assumes that the following line has been executed: +// +// wxConvFileName = &aMuleConvBrokenFileNames; +// +// This line is necessary so that wxWidgets handles unix file names correctly. +// +CDirIterator::CDirIterator(const CPath& dir) + : wxDir(dir.GetRaw()) +{ +} + + +CDirIterator::~CDirIterator() +{ +} + + +CPath CDirIterator::GetFirstFile(FileType type, const wxString& mask) +{ + if (!IsOpened()) { + return CPath(); + } + + wxString fileName; + if (!GetFirst(&fileName, mask, type)) { + return CPath(); + } + + return CPath(fileName); +} + + +CPath CDirIterator::GetNextFile() +{ + wxString fileName; + if (!GetNext(&fileName)) { + return CPath(); + } + + return CPath(fileName); +} + + +bool CDirIterator::HasSubDirs(const wxString& spec) +{ + // Checking IsOpened() in case we don't have permissions to read that dir. + return IsOpened() && wxDir::HasSubDirs(spec); +} + + +EFileType GuessFiletype(const wxString& file) +{ + wxFile archive(file, wxFile::read); + char head[10] = {0}; + int read = archive.Read(head, std::min(10, archive.Length())); + + if (read == wxInvalidOffset) { + return EFT_Unknown; + } else if ((head[0] == 'P') && (head[1] == 'K')) { + // Zip-archives have a header of "PK". + return EFT_Zip; + } else if (head[0] == (char)0x1F && head[1] == (char)0x8B) { + // Gzip-archives have a header of 0x1F8B + return EFT_GZip; + } else if (head[0] == (char)0xE0 || head[0] == (char)0x0E) { + // MET files have either of these headers + return EFT_Met; + } + + // Check at most the first ten chars, if all are printable, + // then we can probably assume it is ascii text-file. + for (int i = 0; i < read; ++i) { + if (!isprint(head[i]) && !isspace(head[i])) { + return EFT_Unknown; + } + } + + return EFT_Text; +} + + +/** + * Replaces the zip-archive with "guarding.p2p" or "ipfilter.dat", + * if either of those files are found in the archive. + */ +bool UnpackZipFile(const wxString& file, const wxChar* files[]) +{ + wxZipFSHandler archive; + wxString filename = archive.FindFirst( + wxT("file:") + file + wxT("#zip:/*"), wxFILE); + while (!filename.IsEmpty()) { + // Extract the filename part of the URI + filename = filename.AfterLast(wxT(':')).Lower(); + + // We only care about the files specified in the array + for (size_t i = 0; files[i]; ++i) { + if (files[i] == filename) { + std::auto_ptr entry; + wxFFileInputStream fileInputStream(file); + wxZipInputStream zip(fileInputStream); + while (entry.reset(zip.GetNextEntry()), entry.get() != NULL) { + // access meta-data + wxString name = entry->GetName(); + // read 'zip' to access the entry's data + if (name == filename) { + char buffer[10240]; + wxTempFile target(file); + while (!zip.Eof()) { + zip.Read(buffer, sizeof(buffer)); + target.Write(buffer, zip.LastRead()); + } + target.Commit(); + + return true; + } + } + } + } + filename = archive.FindNext(); + } + + return false; +} + + +/** + * Unpacks a GZip file and replaces the archive. + */ +bool UnpackGZipFile(const wxString& file) +{ + char buffer[10240]; + wxTempFile target(file); + + bool write = false; + +#ifdef __WXMAC__ + // AddDebugLogLineM( false, logFileIO, wxT("Reading gzip stream") ); + + gzFile inputFile = gzopen(filename2char(file), "rb"); + if (inputFile != NULL) { + write = true; + + while (int bytesRead = gzread(inputFile, buffer, sizeof(buffer))) { + if (bytesRead > 0) { + // AddDebugLogLineM( false, logFileIO, wxString::Format(wxT("Read %u bytes"), bytesRead) ); + target.Write(buffer, bytesRead); + } else if (bytesRead < 0) { + wxString errString; + int gzerrnum; + const char* gzerrstr = gzerror(inputFile, &gzerrnum); + if (gzerrnum == Z_ERRNO) { + errString = wxSysErrorMsg(); + } else { + errString = wxString::FromAscii(gzerrstr); + } + + // AddDebugLogLineM( false, logFileIO, wxT("Error reading gzip stream (") + errString + wxT(")") ); + write = false; + break; + } + } + + // AddDebugLogLineM( false, logFileIO, wxT("End reading gzip stream") ); + gzclose(inputFile); + } else { + // AddDebugLogLineM( false, logFileIO, wxT("Error opening gzip file (") + wxString(wxSysErrorMsg()) + wxT(")") ); + } +#else + { + // AddDebugLogLineM( false, logFileIO, wxT("Reading gzip stream") ); + + wxFileInputStream source(file); + wxZlibInputStream inputStream(source); + + while (!inputStream.Eof()) { + inputStream.Read(buffer, sizeof(buffer)); + + // AddDebugLogLineM( false, logFileIO, wxString::Format(wxT("Read %u bytes"),inputStream.LastRead()) ); + if (inputStream.LastRead()) { + target.Write(buffer, inputStream.LastRead()); + } else { + break; + } + }; + + // AddDebugLogLineM( false, logFileIO, wxT("End reading gzip stream") ); + + write = inputStream.IsOk() || inputStream.Eof(); + } +#endif + + if (write) { + target.Commit(); + // AddDebugLogLineM( false, logFileIO, wxT("Commited gzip stream") ); + } + + return write; +} + + +UnpackResult UnpackArchive(const CPath& path, const wxChar* files[]) +{ + const wxString file = path.GetRaw(); + + // Attempt to discover the filetype and uncompress + EFileType type = GuessFiletype(file); + switch (type) { + case EFT_Zip: + if (UnpackZipFile(file, files)) { + // Unpack nested archives if needed. + return UnpackResult(true, UnpackArchive(path, files).second); + } else { + return UnpackResult(false, EFT_Zip); + } + + case EFT_GZip: + if (UnpackGZipFile(file)) { + // Unpack nested archives if needed. + return UnpackResult(true, UnpackArchive(path, files).second); + } else { + return UnpackResult(false, EFT_GZip); + } + + default: + return UnpackResult(false, type); + } +} + + +#ifdef __WXMSW__ + +FSCheckResult CheckFileSystem(const CPath& WXUNUSED(path)) +{ + return FS_IsFAT32; +} + +#else + +FSCheckResult DoCheckFileSystem(const CPath& path) +{ + // This is an invalid filename on FAT32/NTFS + wxString fullName = JoinPaths(path.GetRaw(), wxT(":")); + + // Try to open the file, without overwriting existing files. + int fd = open(fullName.fn_str(), O_WRONLY | O_CREAT | O_EXCL); + if (fd != -1) { + // Success, the file-system cant be FAT32 + close(fd); + unlink(fullName.fn_str()); + + return FS_NotFAT32; + } + + switch (errno) { + case EINVAL: + // File-name was invalid, file-system is FAT32 + return FS_IsFAT32; + + case EEXIST: + // File already exists, file-system cant be FAT32 + return FS_NotFAT32; + + default: + // Something else failed, couldn't check + return FS_Failed; + } +} + + +typedef std::map CPathCache; + +//! Lock used to ensure the integrity of the cache. +static wxMutex s_lock; +//! Cache of results from checking various paths. +static CPathCache s_cache; + + +FSCheckResult CheckFileSystem(const CPath& path) +{ + wxCHECK_MSG(path.IsOk(), FS_Failed, wxT("Invalid path in CheckFileSystem!")); + + wxMutexLocker locker(s_lock); + CPathCache::iterator it = s_cache.find(path); + if (it != s_cache.end()) { + return it->second; + } + + return s_cache[path] = DoCheckFileSystem(path); +} + +#endif +// File_checked_for_headers diff --git a/src/libs/common/FileFunctions.h b/src/libs/common/FileFunctions.h new file mode 100644 index 00000000..969ab165 --- /dev/null +++ b/src/libs/common/FileFunctions.h @@ -0,0 +1,112 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#ifndef FILEFUNCTIONS_H +#define FILEFUNCTIONS_H + +#include "../../Types.h" +#include "Path.h" + +#include + + +// Dir iterator: needed because wxWidget's wxFindNextFile and +// wxFindFirstFile are bugged like hell. +class CDirIterator : private wxDir +{ +public: + enum FileType { + FileNoHidden = wxDIR_FILES, + DirNoHidden = wxDIR_DIRS, + File = wxDIR_FILES | wxDIR_HIDDEN, + Dir = wxDIR_DIRS | wxDIR_HIDDEN, + Any = wxDIR_FILES | wxDIR_DIRS | wxDIR_HIDDEN + }; + + CDirIterator(const CPath& dir); + ~CDirIterator(); + + CPath GetFirstFile(FileType type, const wxString& mask = wxEmptyString); + CPath GetNextFile(); + + bool HasSubDirs(const wxString& spec = wxEmptyString); +}; + + +//! Filetypes understood by UnpackArchive +enum EFileType +{ + //! Text files, will be left unchanged. + EFT_Text, + //! Zip archive, will be unpacked + EFT_Zip, + //! GZip archives, will be unpacked + EFT_GZip, + //! Met file, will be left unchanged. + EFT_Met, + //! Unknown filetype, will be left unchanged. + EFT_Unknown +}; + + +typedef std::pair UnpackResult; + +/** + * Unpacks a single file from an archive, replacing the archive. + * + * @param file The archive. + * @param files An array of filenames (terminated by a NULL entry) which should be unpacked. + * @return The first value is true if the archive was unpacked, the second is the resulting filetype. + * + * If the file specified is not an archive, it will be left unchanged and + * the file-type returned. If it is a GZip archive, the archive will be + * unpacked and the new file will replace the archive. If the archive is a + * Zip archive, the first file found matching any in the files array (case- + * insensitive) will be unpacked and overwrite the archive. + */ +UnpackResult UnpackArchive(const CPath& file, const wxChar* files[]); + + +enum FSCheckResult { + //! The file-system is FAT32, so certain chars have to be stripped. + FS_IsFAT32, + //! The file-system is not FAT32. + FS_NotFAT32, + //! Failed to check the specified file-system. + FS_Failed +}; + + +/** + * Checks if the specified path is on a FAT32 file-system. + * + * Note that CheckFileSystem always returns FS_IsFAT32 on wxMSW. + */ +FSCheckResult CheckFileSystem(const CPath& path); + + +#endif +// File_checked_for_headers diff --git a/src/libs/common/Format.cpp b/src/libs/common/Format.cpp new file mode 100644 index 00000000..cba77d71 --- /dev/null +++ b/src/libs/common/Format.cpp @@ -0,0 +1,414 @@ +// +// This file is part of the aMule Project. +// +// Copyright (C) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "Format.h" + + +//! Known type-modifiers. +enum Modifiers +{ + //! No modifier field. + modNone, + //! Argument is interpreted as short int (integer types). + modShort, + //! Argument is interpreted as long int (interger types). + modLong, + //! Two 'long' modifieres, arguments is interpreted as long long (integer types). + modLongLong, + //! Argument is interpreted as long double (floating point types). Not supported. + modLongDouble +}; + + +/** + * Extracts modifiers from the argument. + * + * Note that this function will possibly return wrong results + * for malformed format strings. + */ +Modifiers getModifier(const wxString& str) +{ + switch ( (wxChar)str[str.Len() - 2]) { + case wxT('h'): // short int (integer types). + return modShort; + case wxT('l'): // long int (interger types) or double (floating point types). + if ( str.Len() > 3 && str.GetChar( str.Len() - 3 ) == wxT('l') ) { + return modLongLong; + } else { + return modLong; + } + case wxT('L'): // long double (floating point types). + return modLongDouble; + default: + return modNone; + } +} + + +/** Returns true if the char is a format-type. */ +bool isTypeChar(wxChar c) +{ + switch (c) { + case wxT('s'): // String of characters + case wxT('u'): // Unsigned decimal integer + case wxT('i'): // Signed decimal integer + case wxT('d'): // Signed decimal integer + case wxT('c'): // Character + case wxT('f'): // Decimal floating point + case wxT('F'): // Decimal floating point + case wxT('x'): // Unsigned hexadecimal integer + case wxT('X'): // Unsigned hexadecimal integer (capital letters) + case wxT('o'): // Unsigned octal + case wxT('e'): // Scientific notation (mantise/exponent) using e character + case wxT('E'): // Scientific notation (mantise/exponent) using E character + case wxT('g'): // Use shorter %e or %f + case wxT('G'): // Use shorter %E or %f + case wxT('p'): // Not supported, still needs to be caught though + case wxT('n'): // Not supported, still needs to be caught though + return true; + } + + return false; +} + +/** Returns true if the char is a valid flag. */ +bool isFlagChar(wxChar c) +{ + switch (c) { + case wxT('+'): // Include sign for integers + case wxT('-'): // Left-align output + case wxT('#'): // Alternate form, varies + case wxT(' '): // Pad with spaces + case wxT('0'): // Pad with zeros + return true; + } + + return false; +} + +/** Returns true if the char is an integer (for width + precision). */ +bool isIntChar(wxChar c) +{ + return ((c >= wxT('0')) && (c <= wxT('9'))); +} + + +/** Returns true if the cahr is a valid length modifier. */ +bool isLengthChar(wxChar c) +{ + switch (c) { + case wxT('h'): // Short ('hh') and char ('h') + case wxT('l'): // Long ('l') and long long ('ll') + case wxT('L'): // Double long + case wxT('z'): // size_t + case wxT('j'): // intmax_t + case wxT('t'): // ptrdiff_t + return true; + } + + // Catches widths, precisons and zero-padding + return (c >= wxT('0')) && (c <= wxT('9')); +} + + +CFormat::CFormat(const wxChar* str) +{ + m_fieldStart = 0; + m_fieldLength = 0; + m_skipCount = 0; + m_format = str; + + if (m_format.Length()) { + SetCurrentField(wxEmptyString); + } +} + + +bool CFormat::IsReady() const +{ + return (m_fieldStart == m_format.Length()); +} + + +wxString CFormat::GetString() const +{ + if (IsReady()) { + return m_result; + } else { + wxFAIL_MSG(wxT("Called GetString() before all values were passed: ") + m_format); + + // Return as much as possible ... + return m_result + m_format.Mid(m_fieldStart); + } +} + + +void CFormat::SetCurrentField(const wxString& value) +{ + wxCHECK_RET(m_fieldStart < m_format.Length(), + wxT("Setting field in already completed string: ") + m_format); + + if (value.Length()) { + m_result += value; + } + + enum { + PosNone = 0, + PosStart, + PosFlags, + PosWidth, + PosPrecision, + PosLength, + PosEnd + } pos = PosNone; + + // Format strings are expected to follow the folllowing structure: + // %[Flags][Width][.Precision][Length] + for (unsigned i = m_fieldStart + m_fieldLength; i < m_format.Length(); ++i) { + const wxChar c = m_format[i]; + + if (pos >= PosStart) { + m_fieldLength++; + + if ((pos <= PosFlags) && isFlagChar(c)) { + pos = PosFlags; + } else if ((pos <= PosWidth) && isIntChar(c)) { + pos = PosWidth; + } else if ((pos < PosPrecision) && (c == wxT('.'))) { + pos = PosPrecision; + } else if ((pos == PosPrecision) && isIntChar(c)) { + // Nothing to do ... + } else if ((pos < PosLength) && isLengthChar(c)) { + pos = PosLength; + } else if ((pos == PosLength) && isLengthChar(c) && (c == m_format[i - 1])) { + // Nothing to do ... + } else if ((pos <= PosLength) && isTypeChar(c)) { + pos = PosEnd; + break; + } else if ((pos <= PosLength) && (c == wxT('%'))) { + // Append the %*% to the result + m_result += wxT("%"); + + pos = PosNone; + } else { + // Field is broken ... + break; + } + } else if (c == wxT('%')) { + const unsigned offset = m_fieldStart + m_fieldLength; + // If there was anything before this, then prepend it. + if (offset < i) { + m_result += m_format.Mid(offset, i - offset); + } + + // Starting a new format string + pos = PosStart; + m_fieldStart = i; + m_fieldLength = 1; + } else { + // Normal text, nothing to do ... + } + } + + if (pos == PosNone) { + // No fields left + m_result += m_format.Mid(m_fieldStart + m_fieldLength); + + m_fieldStart = m_fieldLength = m_format.Length(); + } else if (pos != PosEnd) { + // A partial field was found ... + wxFAIL_MSG(wxT("Invalid field in format string: ") + m_format); + wxASSERT_MSG(m_fieldStart + m_fieldLength <= m_format.Length(), + wxT("Invalid field-start/length in format string: ") + m_format); + + // Prepend the parsed part of the format-string + m_result += m_format.Mid(m_fieldStart, m_fieldLength); + + // Return an empty string the next time GetCurrentField is called + m_skipCount++; + + // Anything left to do? + if (!IsReady()) { + // Find the next format string + SetCurrentField(wxEmptyString); + } + } +} + + +wxString CFormat::GetCurrentField() +{ + wxCHECK_MSG(m_fieldStart < m_format.Length(), wxEmptyString, + wxT("Passing argument to already completed string: ") + m_format); + wxASSERT_MSG(m_fieldStart + m_fieldLength <= m_format.Length(), + wxT("Invalid field-start/length in format string: ") + m_format); + + if (m_skipCount) { + // The current field was invalid, so we skip it. + m_skipCount--; + + return wxEmptyString; + } + + return m_format.Mid(m_fieldStart, m_fieldLength); +} + + +wxString CFormat::GetIntegerField(const wxChar* fieldType) +{ + const wxString field = GetCurrentField(); + if (field.IsEmpty()) { + // Invalid or missing field ... + return field; + } + + // Drop type and length + wxString newField = field; + while (isalpha(newField.Last())) { + newField.RemoveLast(); + } + + // Set the correct integer type + newField += fieldType; + + switch (field.Last()) { + case wxT('o'): // Unsigned octal + case wxT('x'): // Unsigned hexadecimal integer + case wxT('X'): // Unsigned hexadecimal integer (capital letters) + // Override the default type + newField.Last() = field.Last(); + + case wxT('d'): // Signed decimal integer + case wxT('i'): // Signed decimal integer + case wxT('u'): // Unsigned decimal integer + return newField; + + default: + wxFAIL_MSG(wxT("Integer value passed to non-integer format string: ") + m_format); + SetCurrentField(field); + return wxEmptyString; + } +} + + +CFormat& CFormat::operator%(double value) +{ + wxString field = GetCurrentField(); + if (field.IsEmpty()) { + return *this; + } + + switch ( (wxChar)field.Last() ) { + case wxT('e'): // Scientific notation (mantise/exponent) using e character + case wxT('E'): // Scientific notation (mantise/exponent) using E character + case wxT('f'): // Decimal floating point + case wxT('F'): // Decimal floating point + case wxT('g'): // Use shorter %e or %f + case wxT('G'): // Use shorter %E or %f + wxASSERT_MSG(getModifier(field) == modNone, wxT("Invalid modifier specified for floating-point format: ") + m_format); + + SetCurrentField(wxString::Format(field, value)); + break; + + default: + wxFAIL_MSG(wxT("Floating-point value passed to non-float format string: ") + m_format); + SetCurrentField(field); + } + + return *this; +} + + +CFormat& CFormat::operator%(wxChar value) +{ + wxString field = GetCurrentField(); + + if (field.IsEmpty()) { + // We've already asserted in GetCurrentField. + } else if (field.Last() != wxT('c')) { + wxFAIL_MSG(wxT("Char value passed to non-char format string: ") + m_format); + SetCurrentField(field); + } else { + SetCurrentField(wxString::Format(field, value)); + } + + return *this; +} + + +CFormat& CFormat::operator%(signed long long value) +{ + wxString field = GetIntegerField(wxLongLongFmtSpec wxT("i")); + if (!field.IsEmpty()) { + SetCurrentField(wxString::Format(field, value)); + } + + return *this; +} + + +CFormat& CFormat::operator%(unsigned long long value) +{ + wxString field = GetIntegerField(wxLongLongFmtSpec wxT("u")); + if (!field.IsEmpty()) { + SetCurrentField(wxString::Format(field, value)); + } + + return *this; +} + + +CFormat& CFormat::operator%(const wxString& val) +{ + wxString field = GetCurrentField(); + + if (field.IsEmpty()) { + // We've already asserted in GetCurrentField + } else if (field.Last() != wxT('s')) { + wxFAIL_MSG(wxT("String value passed to non-string format string:") + m_format); + SetCurrentField(field); + } else if (field.GetChar(1) == wxT('.')) { + // A max-length is specified + wxString size = field.Mid( 2, field.Len() - 3 ); + long lSize = 0; + + // Try to convert the length-field. + if ((size.IsEmpty() || size.ToLong(&lSize)) && (lSize >= 0)) { + SetCurrentField(val.Left(lSize)); + } else { + wxFAIL_MSG(wxT("Invalid value found in 'precision' field: ") + m_format); + SetCurrentField(field); + } + } else if (field.GetChar(1) == wxT('s')) { + // No limit on size, just set the string + SetCurrentField(val); + } else { + SetCurrentField(field); + wxFAIL_MSG(wxT("Malformed string format field: ") + m_format); + } + + return *this; +} + +// File_checked_for_headers diff --git a/src/libs/common/Format.h b/src/libs/common/Format.h new file mode 100644 index 00000000..e1018604 --- /dev/null +++ b/src/libs/common/Format.h @@ -0,0 +1,232 @@ +// +// This file is part of the aMule Project. +// +// Copyright (C) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef FORMAT_H +#define FORMAT_H + + +#include "MuleDebug.h" + +#ifdef __GNUC__ + #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) +#else + /* Assume that other compilers don't have this bug */ + #define GCC_VERSION 99999 +#endif + + +/** + * Classes that implement this interface are usable as + * arguments for %s format strings. This is needed because + * CFormat objects are typically created as temporary objects, + * which makes external declarations of operator% impossible, + * due to the fact that a non-const reference to a temporary + * object is prohibited, as in: + * CFormat& operator%(CFormat& fmt, ...) + * + * With this approch, it is possible to use CFormat as usual: + * CFormat(...) % ; + */ +class CPrintable +{ +public: + /** Must return a "pretty" string representation of the object. */ + virtual wxString GetPrintableString() const = 0; + +protected: + virtual ~CPrintable() {} +}; + + + + +/** + * This class offers a typesafe alternative to wxString::Format. + * + * Unlike normal format and printf, this class does not care about the + * type of integer values passed to it, and will handle a value correctly, + * even if the format-string and the actual type dissagree. Therefore, it + * is suggested that only %i and %u be used for integers, for the sake of + * clarity, though %i alone is enough. + * + * The other integer type-fields are supported, but will have no inpact on + * how the value is represented. The only exception to this is the 'o', 'x' + * and 'X' fields, which will always be considered to be unsigned! + * + * CFormat lacks the following capabilities: + * * The "*" width-modifier, because only one argument is fed at a time. + * * The "p" type, could be implemented using void* or templates. + * * The "n" type, just unsafe, wont be implemented. + * * The Long Double type, which is extremly slow and shouldn't be used. + * + * CFormat has been implemented against the description of printf found + * in the "man 3 printf" manual page. + */ +class CFormat +{ +public: + /** + * Constructor. + * + * @param str The format-string to be used. + */ + CFormat(const wxChar* str); + + /** + * Returns true if the resulting string is ready for use. + * + * For a string to be ready to use, all format fields must have + * had a value assigned through the operator% functions. + */ + bool IsReady() const; + + + /** + * Feeds an value into the format-string. + * + * Passing an type that isn't compatible with the current format + * field results in field being skipped, and an exception is raised. + * Passing any type to an CFormat with no free fields results an + * assertion, and the argument being ignored. + * + * Special rules apply to integers, see above. + */ + // \{ + CFormat& operator%(wxChar value); + CFormat& operator%(signed short value); + CFormat& operator%(unsigned short value); + CFormat& operator%(signed int value); + CFormat& operator%(unsigned int value); + CFormat& operator%(signed long value); + CFormat& operator%(unsigned long value); + CFormat& operator%(signed long long value); + CFormat& operator%(unsigned long long value); + CFormat& operator%(double value); + CFormat& operator%(const wxChar* value); + CFormat& operator%(const wxString& value); + CFormat& operator%(const CPrintable& value); + // \} + + + /** + * Returns the resulting string, should only be used when all arguments have been given. + */ + wxString GetString() const; + + /** + * Implicit conversion to wxString. + */ + operator wxString() const { return GetString(); }; + +private: + /** + * Sets the value of the current field, and locates + * the next format field in the string. + */ + void SetCurrentField(const wxString& value); + + /** + * Returns the current format-field, or an empty + * string if no field was found. + */ + wxString GetCurrentField(); + + /** + * Returns the next field modified to fit the given integer type. + * + * @param fieldType A modifier and type for an integer value. + * @return The resulting format-string. + * + * This function is used to generate the integer-type independant + * fields, by modifying the existing format-string to fit the type + * of the integer value that has been passed to it. + */ + wxString GetIntegerField(const wxChar* fieldType); + + //! Index to the current format field. + unsigned m_fieldStart; + //! Length of the current format field. + unsigned m_fieldLength; + //! The number of fields to skip in GetCurrentField + unsigned m_skipCount; + + //! The format-string fed to the parser. + wxString m_format; + //! The current result of arguments fed to the parser. + wxString m_result; +}; + + + +//////////////////////////////////////////////////////////////////////////////// + +inline CFormat& CFormat::operator%(signed short value) +{ + return *this % (signed long long)value; +} + + +inline CFormat& CFormat::operator%(unsigned short value) +{ + return *this % (unsigned long long)value; +} + + +inline CFormat& CFormat::operator%(signed int value) +{ + return *this % (signed long long)value; +} + + +inline CFormat& CFormat::operator%(unsigned int value) +{ + return *this % (unsigned long long)value; +} + + +inline CFormat& CFormat::operator%(signed long value) +{ + return *this % (signed long long)value; +} + + +inline CFormat& CFormat::operator%(unsigned long value) +{ + return *this % (unsigned long long)value; +} + + +inline CFormat& CFormat::operator%(const wxChar* val) +{ + return *this % wxString(val); +} + +inline CFormat& CFormat::operator%(const CPrintable& value) +{ + return *this % value.GetPrintableString(); +} + + +#endif +// File_checked_for_headers diff --git a/src/libs/common/MD5Sum.cpp b/src/libs/common/MD5Sum.cpp new file mode 100644 index 00000000..84474d5b --- /dev/null +++ b/src/libs/common/MD5Sum.cpp @@ -0,0 +1,358 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "StringFunctions.h" + +#include "MD5Sum.h" // Interface declarations. + + +typedef unsigned char *POINTER; +typedef uint16_t UINT2; +typedef uint32_t UINT4; + +typedef struct { + UINT4 state[4]; + UINT4 count[2]; + unsigned char buffer[64]; +} MD5_CTX; + +void MD5Init (MD5_CTX *); +void MD5Update (MD5_CTX *, const unsigned char *, unsigned int); +void MD5Final (unsigned char [16], MD5_CTX *); + +MD5Sum::MD5Sum() +{ +} + +MD5Sum::MD5Sum(const wxString& sSource) +{ + Calculate(sSource); +} + +MD5Sum::MD5Sum(const uint8* buffer, int len) +{ + Calculate(buffer, len); +} + +wxString MD5Sum::Calculate(const wxString& sSource) +{ + return Calculate( + (const uint8*)(const char*)unicode2char(sSource), + sSource.Length()); +} + +wxString MD5Sum::Calculate(const uint8* buffer, int len) +{ + MD5_CTX context; + unsigned char digest[16]; + + MD5Init (&context); + // Nothing we can do against this unicode2char + MD5Update (&context, buffer, len); + MD5Final (digest, &context); + + m_sHash.Clear(); + for (int i = 0; i < 16; ++i) + { + wxString sT; + sT = wxString::Format(wxT("%02x"), digest[i]); + m_sHash += sT; + } + + memcpy(m_rawhash, digest, 16); + + return m_sHash; +} + +wxString MD5Sum::GetHash() +{ + return m_sHash; +} + +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + +static void MD5Transform (UINT4 [4], const unsigned char [64]); +static void Encode (unsigned char *, UINT4 *, unsigned int); +static void Decode (UINT4 *, const unsigned char *, unsigned int); +static void MD5_memcpy (POINTER, POINTER, unsigned int); +static void MD5_memset (POINTER, int, unsigned int); + +static unsigned char PADDING[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* F, G, H and I are basic MD5 functions. + */ +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +/* ROTATE_LEFT rotates x left n bits. + 15-April-2003 Sony: use _MSC_VER intrinsic to save some cycles + */ +#ifdef _MSC_VER +#pragma intrinsic(_rotl) +#define ROTATE_LEFT(x, n) _rotl((x), (n)) +#else +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) +#endif + +/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. +Rotation is separate from addition to prevent recomputation. +*/ +/* Defines must be on one line to work with GCC-2.95.3 */ +#define FF(a, b, c, d, x, s, ac) { (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } +#define GG(a, b, c, d, x, s, ac) { (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } +#define HH(a, b, c, d, x, s, ac) { (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } +#define II(a, b, c, d, x, s, ac) { (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } + +/* MD5 initialization. Begins an MD5 operation, writing a new context. + */ +void MD5Init (MD5_CTX *context) +{ + context->count[0] = context->count[1] = 0; + /* Load magic initialization constants. +*/ + context->state[0] = 0x67452301; + context->state[1] = 0xefcdab89; + context->state[2] = 0x98badcfe; + context->state[3] = 0x10325476; +} + +/* MD5 block update operation. Continues an MD5 message-digest + operation, processing another message block, and updating the + context. + */ +void MD5Update (MD5_CTX *context, const unsigned char *input, unsigned int inputLen) +{ + unsigned int i, index, partLen; + + /* Compute number of bytes mod 64 */ + index = (unsigned int)((context->count[0] >> 3) & 0x3F); + + /* Update number of bits */ + if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3)) { + context->count[1]++; + } + context->count[1] += ((UINT4)inputLen >> 29); + partLen = 64 - index; + + /* Transform as many times as possible. */ + if (inputLen >= partLen) { + MD5_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen); + MD5Transform (context->state, context->buffer); + + for (i = partLen; i + 63 < inputLen; i += 64) { + MD5Transform (context->state, &input[i]); + } + index = 0; + } else { + i = 0; + } + /* Buffer remaining input */ + MD5_memcpy((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen-i); +} + +/* MD5 finalization. Ends an MD5 message-digest operation, writing the + * the message digest and zeroizing the context. + */ +void MD5Final (unsigned char digest[16], MD5_CTX *context) +{ + unsigned char bits[8]; + unsigned int index, padLen; + + /* Save number of bits */ + Encode (bits, context->count, 8); + + /* Pad out to 56 mod 64. */ + index = (unsigned int)((context->count[0] >> 3) & 0x3f); + padLen = (index < 56) ? (56 - index) : (120 - index); + MD5Update (context, PADDING, padLen); + + /* Append length (before padding) */ + MD5Update (context, bits, 8); + /* Store state in digest */ + Encode (digest, context->state, 16); + + /* Zeroize sensitive information.*/ + MD5_memset ((POINTER)context, 0, sizeof (*context)); +} + +/* MD5 basic transformation. Transforms state based on block. + */ +static void MD5Transform (UINT4 state[4], const unsigned char block[64]) +{ + UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; + + Decode (x, block, 64); + + /* Round 1 */ + FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ + GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ + HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ + HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ + II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + /* Zeroize sensitive information. + */ + MD5_memset ((POINTER)x, 0, sizeof (x)); +} + +/* Encodes input (UINT4) into output (unsigned char). Assumes len is + a multiple of 4. + */ +static void Encode (unsigned char *output, UINT4 *input, unsigned int len) +{ + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) { + output[j] = (unsigned char)(input[i] & 0xff); + output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); + output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); + output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); + } +} + +/* Decodes input (unsigned char) into output (UINT4). Assumes len is + a multiple of 4. + */ +static void Decode (UINT4 *output, const unsigned char *input, unsigned int len) +{ + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) + output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) | + (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24); +} + +/* Note: Replace "for loop" with standard memcpy if possible. + */ + +static void MD5_memcpy (POINTER output, POINTER input, unsigned int len) +{ + unsigned int i; + + for (i = 0; i < len; i++) + output[i] = input[i]; +} + +/* Note: Replace "for loop" with standard memset if possible. + */ +static void MD5_memset (POINTER output, int value, unsigned int len) +{ + unsigned int i; + + for (i = 0; i < len; i++) + ((char *)output)[i] = (char)value; +} +// File_checked_for_headers diff --git a/src/libs/common/MD5Sum.h b/src/libs/common/MD5Sum.h new file mode 100644 index 00000000..79fef5ec --- /dev/null +++ b/src/libs/common/MD5Sum.h @@ -0,0 +1,48 @@ +// This file is part of the aMule Project. + /* + Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) + Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD5 Message-Digest + Algorithm" in all material mentioning or referencing this software + or this function. + + License is also granted to make and use derivative works provided + that such works are identified as "derived from the RSA Data + Security, Inc. MD5 Message-Digest Algorithm" in all material + mentioning or referencing the derived work. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" + without express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. + */ + +#ifndef MD5SUM_H +#define MD5SUM_H + + +class MD5Sum { +public: + MD5Sum(); + MD5Sum(const wxString& sSource); + MD5Sum(const uint8* buffer, int len); + + wxString Calculate(const wxString& sSource); + wxString Calculate(const uint8* buffer, int len); + + wxString GetHash(); + const uint8* GetRawHash() const { return m_rawhash; } + +private: + wxString m_sHash; + uint8 m_rawhash[16]; +}; + +#endif // MD5SUM_H +// File_checked_for_headers diff --git a/src/libs/common/Makefile.am b/src/libs/common/Makefile.am new file mode 100644 index 00000000..0dc8effc --- /dev/null +++ b/src/libs/common/Makefile.am @@ -0,0 +1,32 @@ +DEFS = -DHAVE_CONFIG_H + +# Sources + +noinst_LIBRARIES = \ + libmulecommon.a + +# Common to external apps and core/gui/monolithic + +libmulecommon_a_SOURCES = \ + Format.cpp \ + MD5Sum.cpp \ + MuleDebug.cpp \ + StringFunctions.cpp \ + FileFunctions.cpp \ + TextFile.cpp \ + Path.cpp + +libmulecommon_a_CFLAGS = $(WX_CXXFLAGS) $(BFD_FLAGS) +libmulecommon_a_CXXFLAGS = $(WX_CXXFLAGS) $(BFD_FLAGS) + +noinst_HEADERS = \ + Format.h \ + MD5Sum.h \ + MuleDebug.h \ + StringFunctions.h \ + FileFunctions.h \ + TextFile.h \ + Path.h + +MAINTAINERCLEANFILES = Makefile.in + diff --git a/src/libs/common/Makefile.in b/src/libs/common/Makefile.in new file mode 100644 index 00000000..2cf9ba2b --- /dev/null +++ b/src/libs/common/Makefile.in @@ -0,0 +1,681 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +SOURCES = $(libmulecommon_a_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/libs/common +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +libmulecommon_a_AR = $(AR) $(ARFLAGS) +libmulecommon_a_LIBADD = +am_libmulecommon_a_OBJECTS = libmulecommon_a-Format.$(OBJEXT) \ + libmulecommon_a-MD5Sum.$(OBJEXT) \ + libmulecommon_a-MuleDebug.$(OBJEXT) \ + libmulecommon_a-StringFunctions.$(OBJEXT) \ + libmulecommon_a-FileFunctions.$(OBJEXT) \ + libmulecommon_a-TextFile.$(OBJEXT) \ + libmulecommon_a-Path.$(OBJEXT) +libmulecommon_a_OBJECTS = $(am_libmulecommon_a_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +SOURCES = $(libmulecommon_a_SOURCES) +DIST_SOURCES = $(libmulecommon_a_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DHAVE_CONFIG_H +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ + +# Sources +noinst_LIBRARIES = \ + libmulecommon.a + + +# Common to external apps and core/gui/monolithic +libmulecommon_a_SOURCES = \ + Format.cpp \ + MD5Sum.cpp \ + MuleDebug.cpp \ + StringFunctions.cpp \ + FileFunctions.cpp \ + TextFile.cpp \ + Path.cpp + +libmulecommon_a_CFLAGS = $(WX_CXXFLAGS) $(BFD_FLAGS) +libmulecommon_a_CXXFLAGS = $(WX_CXXFLAGS) $(BFD_FLAGS) +noinst_HEADERS = \ + Format.h \ + MD5Sum.h \ + MuleDebug.h \ + StringFunctions.h \ + FileFunctions.h \ + TextFile.h \ + Path.h + +MAINTAINERCLEANFILES = Makefile.in +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/libs/common/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/libs/common/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +libmulecommon.a: $(libmulecommon_a_OBJECTS) $(libmulecommon_a_DEPENDENCIES) + -rm -f libmulecommon.a + $(libmulecommon_a_AR) libmulecommon.a $(libmulecommon_a_OBJECTS) $(libmulecommon_a_LIBADD) + $(RANLIB) libmulecommon.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmulecommon_a-FileFunctions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmulecommon_a-Format.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmulecommon_a-MD5Sum.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmulecommon_a-MuleDebug.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmulecommon_a-Path.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmulecommon_a-StringFunctions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmulecommon_a-TextFile.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +libmulecommon_a-Format.o: Format.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmulecommon_a-Format.o -MD -MP -MF "$(DEPDIR)/libmulecommon_a-Format.Tpo" -c -o libmulecommon_a-Format.o `test -f 'Format.cpp' || echo '$(srcdir)/'`Format.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmulecommon_a-Format.Tpo" "$(DEPDIR)/libmulecommon_a-Format.Po"; else rm -f "$(DEPDIR)/libmulecommon_a-Format.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Format.cpp' object='libmulecommon_a-Format.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmulecommon_a-Format.o `test -f 'Format.cpp' || echo '$(srcdir)/'`Format.cpp + +libmulecommon_a-Format.obj: Format.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmulecommon_a-Format.obj -MD -MP -MF "$(DEPDIR)/libmulecommon_a-Format.Tpo" -c -o libmulecommon_a-Format.obj `if test -f 'Format.cpp'; then $(CYGPATH_W) 'Format.cpp'; else $(CYGPATH_W) '$(srcdir)/Format.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmulecommon_a-Format.Tpo" "$(DEPDIR)/libmulecommon_a-Format.Po"; else rm -f "$(DEPDIR)/libmulecommon_a-Format.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Format.cpp' object='libmulecommon_a-Format.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmulecommon_a-Format.obj `if test -f 'Format.cpp'; then $(CYGPATH_W) 'Format.cpp'; else $(CYGPATH_W) '$(srcdir)/Format.cpp'; fi` + +libmulecommon_a-MD5Sum.o: MD5Sum.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmulecommon_a-MD5Sum.o -MD -MP -MF "$(DEPDIR)/libmulecommon_a-MD5Sum.Tpo" -c -o libmulecommon_a-MD5Sum.o `test -f 'MD5Sum.cpp' || echo '$(srcdir)/'`MD5Sum.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmulecommon_a-MD5Sum.Tpo" "$(DEPDIR)/libmulecommon_a-MD5Sum.Po"; else rm -f "$(DEPDIR)/libmulecommon_a-MD5Sum.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MD5Sum.cpp' object='libmulecommon_a-MD5Sum.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmulecommon_a-MD5Sum.o `test -f 'MD5Sum.cpp' || echo '$(srcdir)/'`MD5Sum.cpp + +libmulecommon_a-MD5Sum.obj: MD5Sum.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmulecommon_a-MD5Sum.obj -MD -MP -MF "$(DEPDIR)/libmulecommon_a-MD5Sum.Tpo" -c -o libmulecommon_a-MD5Sum.obj `if test -f 'MD5Sum.cpp'; then $(CYGPATH_W) 'MD5Sum.cpp'; else $(CYGPATH_W) '$(srcdir)/MD5Sum.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmulecommon_a-MD5Sum.Tpo" "$(DEPDIR)/libmulecommon_a-MD5Sum.Po"; else rm -f "$(DEPDIR)/libmulecommon_a-MD5Sum.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MD5Sum.cpp' object='libmulecommon_a-MD5Sum.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmulecommon_a-MD5Sum.obj `if test -f 'MD5Sum.cpp'; then $(CYGPATH_W) 'MD5Sum.cpp'; else $(CYGPATH_W) '$(srcdir)/MD5Sum.cpp'; fi` + +libmulecommon_a-MuleDebug.o: MuleDebug.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmulecommon_a-MuleDebug.o -MD -MP -MF "$(DEPDIR)/libmulecommon_a-MuleDebug.Tpo" -c -o libmulecommon_a-MuleDebug.o `test -f 'MuleDebug.cpp' || echo '$(srcdir)/'`MuleDebug.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmulecommon_a-MuleDebug.Tpo" "$(DEPDIR)/libmulecommon_a-MuleDebug.Po"; else rm -f "$(DEPDIR)/libmulecommon_a-MuleDebug.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleDebug.cpp' object='libmulecommon_a-MuleDebug.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmulecommon_a-MuleDebug.o `test -f 'MuleDebug.cpp' || echo '$(srcdir)/'`MuleDebug.cpp + +libmulecommon_a-MuleDebug.obj: MuleDebug.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmulecommon_a-MuleDebug.obj -MD -MP -MF "$(DEPDIR)/libmulecommon_a-MuleDebug.Tpo" -c -o libmulecommon_a-MuleDebug.obj `if test -f 'MuleDebug.cpp'; then $(CYGPATH_W) 'MuleDebug.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleDebug.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmulecommon_a-MuleDebug.Tpo" "$(DEPDIR)/libmulecommon_a-MuleDebug.Po"; else rm -f "$(DEPDIR)/libmulecommon_a-MuleDebug.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='MuleDebug.cpp' object='libmulecommon_a-MuleDebug.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmulecommon_a-MuleDebug.obj `if test -f 'MuleDebug.cpp'; then $(CYGPATH_W) 'MuleDebug.cpp'; else $(CYGPATH_W) '$(srcdir)/MuleDebug.cpp'; fi` + +libmulecommon_a-StringFunctions.o: StringFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmulecommon_a-StringFunctions.o -MD -MP -MF "$(DEPDIR)/libmulecommon_a-StringFunctions.Tpo" -c -o libmulecommon_a-StringFunctions.o `test -f 'StringFunctions.cpp' || echo '$(srcdir)/'`StringFunctions.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmulecommon_a-StringFunctions.Tpo" "$(DEPDIR)/libmulecommon_a-StringFunctions.Po"; else rm -f "$(DEPDIR)/libmulecommon_a-StringFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='StringFunctions.cpp' object='libmulecommon_a-StringFunctions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmulecommon_a-StringFunctions.o `test -f 'StringFunctions.cpp' || echo '$(srcdir)/'`StringFunctions.cpp + +libmulecommon_a-StringFunctions.obj: StringFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmulecommon_a-StringFunctions.obj -MD -MP -MF "$(DEPDIR)/libmulecommon_a-StringFunctions.Tpo" -c -o libmulecommon_a-StringFunctions.obj `if test -f 'StringFunctions.cpp'; then $(CYGPATH_W) 'StringFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/StringFunctions.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmulecommon_a-StringFunctions.Tpo" "$(DEPDIR)/libmulecommon_a-StringFunctions.Po"; else rm -f "$(DEPDIR)/libmulecommon_a-StringFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='StringFunctions.cpp' object='libmulecommon_a-StringFunctions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmulecommon_a-StringFunctions.obj `if test -f 'StringFunctions.cpp'; then $(CYGPATH_W) 'StringFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/StringFunctions.cpp'; fi` + +libmulecommon_a-FileFunctions.o: FileFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmulecommon_a-FileFunctions.o -MD -MP -MF "$(DEPDIR)/libmulecommon_a-FileFunctions.Tpo" -c -o libmulecommon_a-FileFunctions.o `test -f 'FileFunctions.cpp' || echo '$(srcdir)/'`FileFunctions.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmulecommon_a-FileFunctions.Tpo" "$(DEPDIR)/libmulecommon_a-FileFunctions.Po"; else rm -f "$(DEPDIR)/libmulecommon_a-FileFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FileFunctions.cpp' object='libmulecommon_a-FileFunctions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmulecommon_a-FileFunctions.o `test -f 'FileFunctions.cpp' || echo '$(srcdir)/'`FileFunctions.cpp + +libmulecommon_a-FileFunctions.obj: FileFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmulecommon_a-FileFunctions.obj -MD -MP -MF "$(DEPDIR)/libmulecommon_a-FileFunctions.Tpo" -c -o libmulecommon_a-FileFunctions.obj `if test -f 'FileFunctions.cpp'; then $(CYGPATH_W) 'FileFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/FileFunctions.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmulecommon_a-FileFunctions.Tpo" "$(DEPDIR)/libmulecommon_a-FileFunctions.Po"; else rm -f "$(DEPDIR)/libmulecommon_a-FileFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FileFunctions.cpp' object='libmulecommon_a-FileFunctions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmulecommon_a-FileFunctions.obj `if test -f 'FileFunctions.cpp'; then $(CYGPATH_W) 'FileFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/FileFunctions.cpp'; fi` + +libmulecommon_a-TextFile.o: TextFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmulecommon_a-TextFile.o -MD -MP -MF "$(DEPDIR)/libmulecommon_a-TextFile.Tpo" -c -o libmulecommon_a-TextFile.o `test -f 'TextFile.cpp' || echo '$(srcdir)/'`TextFile.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmulecommon_a-TextFile.Tpo" "$(DEPDIR)/libmulecommon_a-TextFile.Po"; else rm -f "$(DEPDIR)/libmulecommon_a-TextFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TextFile.cpp' object='libmulecommon_a-TextFile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmulecommon_a-TextFile.o `test -f 'TextFile.cpp' || echo '$(srcdir)/'`TextFile.cpp + +libmulecommon_a-TextFile.obj: TextFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmulecommon_a-TextFile.obj -MD -MP -MF "$(DEPDIR)/libmulecommon_a-TextFile.Tpo" -c -o libmulecommon_a-TextFile.obj `if test -f 'TextFile.cpp'; then $(CYGPATH_W) 'TextFile.cpp'; else $(CYGPATH_W) '$(srcdir)/TextFile.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmulecommon_a-TextFile.Tpo" "$(DEPDIR)/libmulecommon_a-TextFile.Po"; else rm -f "$(DEPDIR)/libmulecommon_a-TextFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TextFile.cpp' object='libmulecommon_a-TextFile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmulecommon_a-TextFile.obj `if test -f 'TextFile.cpp'; then $(CYGPATH_W) 'TextFile.cpp'; else $(CYGPATH_W) '$(srcdir)/TextFile.cpp'; fi` + +libmulecommon_a-Path.o: Path.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmulecommon_a-Path.o -MD -MP -MF "$(DEPDIR)/libmulecommon_a-Path.Tpo" -c -o libmulecommon_a-Path.o `test -f 'Path.cpp' || echo '$(srcdir)/'`Path.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmulecommon_a-Path.Tpo" "$(DEPDIR)/libmulecommon_a-Path.Po"; else rm -f "$(DEPDIR)/libmulecommon_a-Path.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Path.cpp' object='libmulecommon_a-Path.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmulecommon_a-Path.o `test -f 'Path.cpp' || echo '$(srcdir)/'`Path.cpp + +libmulecommon_a-Path.obj: Path.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -MT libmulecommon_a-Path.obj -MD -MP -MF "$(DEPDIR)/libmulecommon_a-Path.Tpo" -c -o libmulecommon_a-Path.obj `if test -f 'Path.cpp'; then $(CYGPATH_W) 'Path.cpp'; else $(CYGPATH_W) '$(srcdir)/Path.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmulecommon_a-Path.Tpo" "$(DEPDIR)/libmulecommon_a-Path.Po"; else rm -f "$(DEPDIR)/libmulecommon_a-Path.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Path.cpp' object='libmulecommon_a-Path.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmulecommon_a_CXXFLAGS) $(CXXFLAGS) -c -o libmulecommon_a-Path.obj `if test -f 'Path.cpp'; then $(CYGPATH_W) 'Path.cpp'; else $(CYGPATH_W) '$(srcdir)/Path.cpp'; fi` +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) $(HEADERS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-noinstLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/libs/common/MuleDebug.cpp b/src/libs/common/MuleDebug.cpp new file mode 100644 index 00000000..c287af1b --- /dev/null +++ b/src/libs/common/MuleDebug.cpp @@ -0,0 +1,468 @@ +// +// This file is part of the aMule Project. +// +// Copyright (C) 2005-2008 Mikkel Schubert ( xaignar@users.sourceforge.net ) +// Copyright (C) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include // Needed for raise() + +#include "MuleDebug.h" // Interface declaration +#include "StringFunctions.h" // Needed for unicode2char + +#ifdef __LINUX__ + #include +#endif + +#ifndef _MSC_VER + #include +#endif + +#include // Do_not_auto_remove (Old wx < 2.7) +#include // Do_not_auto_remove (Old wx < 2.7) + +#if wxUSE_STACKWALKER && defined(__WXMSW__) + #include // Do_not_auto_remove +#elif defined(HAVE_BFD) + #include // Do_not_auto_remove + #include // Do_not_auto_remove +#endif + +#include + + +/** + * This functions displays a verbose description of + * any unhandled exceptions that occour and then + * terminate the program by raising SIGABRT. + */ +void OnUnhandledException() +{ + // Revert to the original exception handler, to avoid + // infinate recursion, in case something goes wrong in + // this function. + std::set_terminate(std::abort); + +#ifndef _MSC_VER + std::type_info *t = __cxxabiv1::__cxa_current_exception_type(); + FILE* output = stderr; +#else + FILE* output = stdout; + bool t = true; +#endif + if (t) { + int status = -1; + char *dem = 0; +#ifndef _MSC_VER + // Note that "name" is the mangled name. + char const *name = t->name(); + + dem = __cxxabiv1::__cxa_demangle(name, 0, 0, &status); +#else + const char* name = "Unknown"; +#endif + fprintf(output, "\nTerminated after throwing an instance of '%s'\n", (status ? name : dem)); + free(dem); + + try { + throw; + } catch (const std::exception& e) { + fprintf(output, "\twhat(): %s\n", e.what()); + } catch (const CMuleException& e) { + fprintf(output, "\twhat(): %s\n", (const char*)unicode2char(e.what())); + } catch (const wxString& e) { + fprintf(output, "\twhat(): %s\n", (const char*)unicode2char(e)); + } catch (...) { + // Unable to retrieve cause of exception + } + + fprintf(output, "\tbacktrace:\n%s\n", (const char*)unicode2char(get_backtrace(1))); + } + raise(SIGABRT); +} + + +void InstallMuleExceptionHandler() +{ + std::set_terminate(OnUnhandledException); +} + + +// Make it 1 for getting the file path also +#define TOO_VERBOSE_BACKTRACE 0 + +#if wxUSE_STACKWALKER && defined(__WXMSW__) + +// Derived class to define the actions to be done on frame print. +// I was tempted to name it MuleSkyWalker +class MuleStackWalker : public wxStackWalker +{ +public: + MuleStackWalker() {}; + ~MuleStackWalker() {}; + + void OnStackFrame(const wxStackFrame& frame) + { + wxString btLine = wxString::Format(wxT("[%u] "), frame.GetLevel()); + wxString filename = frame.GetName(); + + if (!filename.IsEmpty()) { + btLine += filename + wxT(" (") + +#if TOO_VERBOSE_BACKTRACE + frame.GetModule() +#else + frame.GetModule().AfterLast(wxT('/')) +#endif + + wxT(")"); + } else { + btLine += wxString::Format(wxT("0x%lx"), frame.GetAddress()); + } + + if (frame.HasSourceLocation()) { + btLine += wxT(" at ") + +#if TOO_VERBOSE_BACKTRACE + frame.GetFileName() +#else + frame.GetFileName().AfterLast(wxT('/')) +#endif + + wxString::Format(wxT(":%u"),frame.GetLine()); + } else { + btLine += wxT(" (Unknown file/line)"); + } + + //! Contains the entire backtrace + m_trace += btLine + wxT("\n"); + } + + wxString m_trace; +}; + + +wxString get_backtrace(unsigned n) +{ + MuleStackWalker walker; // Texas ranger? + walker.Walk(n); // Skip this one and Walk() also! + + return walker.m_trace; +} + +#elif defined(__LINUX__) + +#ifdef HAVE_BFD + +static bfd* s_abfd; +static asymbol** s_symbol_list; +static bool s_have_backtrace_symbols = false; +static const char* s_file_name; +static const char* s_function_name; +static unsigned int s_line_number; +static int s_found; + + +/* +* read all symbols in the executable into an array +* and return the pointer to the array in symbol_list. +* Also return the number of actual symbols read +* If there's any error, return -1 +*/ +static int get_backtrace_symbols(bfd *abfd, asymbol ***symbol_list_ptr) +{ + int vectorsize = bfd_get_symtab_upper_bound(abfd); + + if (vectorsize < 0) { + fprintf (stderr, "Error while getting vector size for backtrace symbols : %s", + bfd_errmsg(bfd_get_error())); + return -1; + } + + if (vectorsize == 0) { + fprintf (stderr, "Error while getting backtrace symbols : No symbols (%s)", + bfd_errmsg(bfd_get_error())); + return -1; + } + + *symbol_list_ptr = (asymbol**)malloc(vectorsize); + + if (*symbol_list_ptr == NULL) { + fprintf (stderr, "Error while getting backtrace symbols : Cannot allocate memory"); + return -1; + } + + vectorsize = bfd_canonicalize_symtab(abfd, *symbol_list_ptr); + + if (vectorsize < 0) { + fprintf(stderr, "Error while getting symbol table : %s", + bfd_errmsg(bfd_get_error())); + return -1; + } + + return vectorsize; +} + + +/* +* print file, line and function information for address +* The info is actually set into global variables. This +* function is called from the iterator bfd_map_over_sections +* +*/ +void init_backtrace_info() +{ + bfd_init(); + s_abfd = bfd_openr("/proc/self/exe", NULL); + + if (s_abfd == NULL) { + fprintf(stderr, "Error while opening file for backtrace symbols : %s", + bfd_errmsg(bfd_get_error())); + return; + } + + if (!(bfd_check_format_matches(s_abfd, bfd_object, NULL))) { + fprintf (stderr, "Error while init. backtrace symbols : %s", + bfd_errmsg (bfd_get_error ())); + bfd_close(s_abfd); + return; + } + + s_have_backtrace_symbols = (get_backtrace_symbols(s_abfd, &s_symbol_list) > 0); +} + + +void get_file_line_info(bfd *abfd, asection *section, void* _address) +{ + wxASSERT(s_symbol_list); + + if (s_found) { + return; + } + + if ((section->flags & SEC_ALLOC) == 0) { + return; + } + + bfd_vma vma = bfd_get_section_vma(abfd, section); + + unsigned long address = (unsigned long)_address; + if (address < vma) { + return; + } + + bfd_size_type size = bfd_section_size(abfd, section); + if (address > (vma + size)) { + return; + } + + s_found = bfd_find_nearest_line(abfd, section, s_symbol_list, + address - vma, &s_file_name, &s_function_name, &s_line_number); +} + +#endif // HAVE_BFD + +wxString demangle(const wxString& function) +{ + wxString result; + + if (function.Mid(0,2) == wxT("_Z")) { + int status; + char *demangled = abi::__cxa_demangle(function.mb_str(), NULL, NULL, &status); + + if (!status) { + result = wxConvCurrent->cMB2WX(demangled); + } + + if (demangled) { + free(demangled); + } + } + + return result; +} + + +// Print a stack backtrace if available +wxString get_backtrace(unsigned n) +{ + // (stkn) create backtrace + void *bt_array[100]; // 100 should be enough ?!? + char **bt_strings; + int num_entries; + + if ((num_entries = backtrace(bt_array, 100)) < 0) { + fprintf(stderr, "* Could not generate backtrace\n"); + return wxEmptyString; + } + + if ((bt_strings = backtrace_symbols(bt_array, num_entries)) == NULL) { + fprintf(stderr, "* Could not get symbol names for backtrace\n"); + return wxEmptyString; + } + + std::vector libname(num_entries); + std::vector funcname(num_entries); + std::vector address(num_entries); + wxString AllAddresses; + + for (int i = 0; i < num_entries; ++i) { + wxString wxBtString = wxConvCurrent->cMB2WX(bt_strings[i]); + int posLPar = wxBtString.Find(wxT('(')); + int posRPar = wxBtString.Find(wxT(')')); + int posLBra = wxBtString.Find(wxT('[')); + int posRBra = wxBtString.Find(wxT(']')); + bool hasFunction = true; + if (posLPar == -1 || posRPar == -1) { + if (posLBra == -1 || posRBra == -1) { + /* It is important to have exactly num_entries + * addresses in AllAddresses */ + AllAddresses += wxT("0x0000000 "); + continue; + } + posLPar = posLBra; + hasFunction = false; + } + /* Library name */ + int len = posLPar; + libname[i] = wxBtString.Mid(0, len); + /* Function name */ + if (hasFunction) { + int posPlus = wxBtString.Find(wxT('+'), true); + if (posPlus == -1) + posPlus = posRPar; + len = posPlus - posLPar - 1; + funcname[i] = wxBtString.Mid(posLPar + 1, len); + wxString demangled = demangle(funcname[i]); + if (!demangled.IsEmpty()) { + funcname[i] = demangled; + } + } + /* Address */ + if ( posLBra == -1 || posRBra == -1) { + address[i] = wxT("0x0000000"); + } else { + len = posRBra - posLBra - 1; + address[i] = wxBtString.Mid(posLBra + 1, len); + AllAddresses += address[i] + wxT(" "); + } + } + free(bt_strings); + + /* Get line numbers from addresses */ + wxArrayString out; + bool hasLineNumberInfo = false; + +#ifdef HAVE_BFD + if (!s_have_backtrace_symbols) { + init_backtrace_info(); + wxASSERT(s_have_backtrace_symbols); + } + + for (int i = 0; i < num_entries; ++i) { + s_file_name = NULL; + s_function_name = NULL; + s_line_number = 0; + s_found = false ; + + unsigned long addr; + address[i].ToULong(&addr,0); // As it's "0x" prepended, wx will read it as base 16. Hopefully. + + bfd_map_over_sections(s_abfd, get_file_line_info, (void*)addr); + + if (s_found) { + wxString function = wxConvCurrent->cMB2WX(s_function_name); + wxString demangled = demangle(function); + if (!demangled.IsEmpty()) { + function = demangled; + funcname[i] = demangled; + } + out.Insert(wxConvCurrent->cMB2WX(s_function_name),i*2); + out.Insert(wxConvCurrent->cMB2WX(s_file_name) + wxString::Format(wxT(":%u"), s_line_number),i*2+1); + } else { + out.Insert(wxT("??"),i*2); + out.Insert(wxT("??"),i*2+1); + } + } + + hasLineNumberInfo = true; + +#else /* !HAVE_BFD */ + if (wxThread::IsMain()) { + wxString command; + command << wxT("addr2line -C -f -s -e /proc/") << + getpid() << wxT("/exe ") << AllAddresses; + // The output of the command is this wxArrayString, in which + // the even elements are the function names, and the odd elements + // are the line numbers. + + hasLineNumberInfo = wxExecute(command, out) != -1; + } + +#endif /* HAVE_BFD / !HAVE_BFD */ + + wxString trace; + // Remove 'n+1' first entries (+1 because of this function) + for (int i = n+1; i < num_entries; ++i) { + /* If we have no function name, use the result from addr2line */ + if (funcname[i].IsEmpty()) { + if (hasLineNumberInfo) { + funcname[i] = out[2*i]; + } else { + funcname[i] = wxT("??"); + } + } + wxString btLine; + btLine << wxT("[") << i << wxT("] ") << funcname[i] << wxT(" in "); + /* If addr2line did not find a line number, use bt_string */ + if (!hasLineNumberInfo || out[2*i+1].Mid(0,2) == wxT("??")) { + btLine += libname[i] + wxT("[") + address[i] + wxT("]"); + } else if (hasLineNumberInfo) { +#if TOO_VERBOSE_BACKTRACE + btLine += out[2*i+1]; +#else + btLine += out[2*i+1].AfterLast(wxT('/')); +#endif + } else { + btLine += libname[i]; + } + + trace += btLine + wxT("\n"); + } + + return trace; +} + +#else /* !__LINUX__ */ + +wxString get_backtrace(unsigned WXUNUSED(n)) +{ + fprintf(stderr, "--== no BACKTRACE for your platform ==--\n\n"); + return wxEmptyString; +} + +#endif /* !__LINUX__ */ + +void print_backtrace(unsigned n) +{ + wxString trace = get_backtrace(n); + + // This is because the string is ansi anyway, and the conv classes are very slow + fprintf(stderr, "%s\n", (const char*)unicode2char(trace.c_str())); +} + +// File_checked_for_headers diff --git a/src/libs/common/MuleDebug.h b/src/libs/common/MuleDebug.h new file mode 100644 index 00000000..41bd99ab --- /dev/null +++ b/src/libs/common/MuleDebug.h @@ -0,0 +1,150 @@ +// +// This file is part of the aMule Project. +// +// Copyright (C) 2005-2008 Mikkel Schubert ( xaignar@users.sourceforge.net ) +// Copyright (C) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef MULEDEBUG_H +#define MULEDEBUG_H + +#include +#include + +/** + * Installs an exception handler that can handle CMuleExceptions. + */ +void InstallMuleExceptionHandler(); + +/** + * + */ +void OnUnhandledException(); + + +//! Print a backtrace, skipping the first n frames. +void print_backtrace(unsigned n); + +//! Returns a backtrace, skipping the first n frames. +wxString get_backtrace(unsigned n); + + +/** + * This exception should be used to implement other + * types of exceptions. It should never be caught, + * instead catch the subtypes. + */ +class CMuleException +{ +public: + CMuleException(const wxString& type, const wxString& desc) + : m_what(type + wxT(": ") + desc) {} + virtual ~CMuleException() throw() {} + virtual const wxString& what() const throw() { return m_what; } + +private: + wxString m_what; +}; + + +/** + * This exception type is used to represent exceptions that are + * caused by invalid operations. Exceptions of this type should + * not be caught as they are the result of bugs. + */ +struct CRunTimeException : public CMuleException +{ + CRunTimeException(const wxString& type, const wxString& desc) + : CMuleException(wxT("CRunTimeException::") + type, desc) {} +}; + + + +/** + * This exception is to be thrown if invalid parameters are passed to a function. + */ +struct CInvalidParamsEx : public CRunTimeException +{ + CInvalidParamsEx(const wxString& desc) + : CRunTimeException(wxT("CInvalidArgsException"), desc) {} +}; + + +/** + * This exception is to be thrown if an object is used in an invalid state. + */ +struct CInvalidStateEx : public CRunTimeException +{ + CInvalidStateEx(const wxString& desc) + : CRunTimeException(wxT("CInvalidStateException"), desc) {} +}; + +/** + * This exception is thrown on wrong packets or tags. + */ +struct CInvalidPacket : public CMuleException +{ + CInvalidPacket(const wxString& desc) + : CMuleException(wxT("CInvalidPacket"), desc) {} +}; + + +// This ifdef ensures that we wont get assertions while +// unittesting, which would otherwise impede the tests. +#ifdef MULEUNIT + #define _MULE_THROW(cond, cls, msg) \ + do { \ + if (!(cond)) { \ + throw cls(msg); \ + } \ + } while (false) +#else + #define _MULE_THROW(cond, cls, msg) \ + do { \ + if (!(cond)) { \ + wxFAIL_MSG(wxT(#cond)); \ + throw cls(msg); \ + } \ + } while (false) +#endif + + + +#define MULE_CHECK_THROW(cond, cls, msg) \ + _MULE_THROW((cond), cls, (msg)) + +#define MULE_VALIDATE_STATE(cond, msg) \ + MULE_CHECK_THROW((cond), CInvalidStateEx, (msg)) + +#define MULE_VALIDATE_PARAMS(cond, msg) \ + MULE_CHECK_THROW((cond), CInvalidParamsEx, (msg)) + + +#define MULE_ASSERT(cond) wxASSERT((cond)) +#define MULE_ASSERT_MSG(cond, msg) wxASSERT_MSG((cond), msg) +#define MULE_FAIL() wxFAIL() +#define MULE_FAIL_MSG(msg) wxFAIL_MSG(msg) +#define MULE_CHECK(cond, retValue) wxCHECK((cond), (retValue)) +#define MULE_CHECK_MSG(cond, ret, msg) wxCHECK_MSG((cond), (ret), (msg)) +#define MULE_CHECK_RET(cond, msg) wxCHECK_RET((cond), (msg)) + +#endif +// File_checked_for_headers diff --git a/src/libs/common/Path.cpp b/src/libs/common/Path.cpp new file mode 100644 index 00000000..b78b99c4 --- /dev/null +++ b/src/libs/common/Path.cpp @@ -0,0 +1,667 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "Path.h" +#include "MuleDebug.h" +#include "StringFunctions.h" + +#include +#include +#include + + +// This is required in order to ensure that wx can "handle" filenames +// using a different encoding than the current system-wide setting. If +// this is not done, such filenames will fail during convertion to/from +// multibyte (as in cWC2MB/cMB2WC). +#if !wxUSE_GUI && !defined(__WXMSW__) +void* setFNConv() +{ + // This uses the same method as wxApp::Initialize under GTK2 + wxString encName = wxLocale::GetSystemEncodingName().Upper(); + if (encName.IsEmpty() || (encName == wxT("US-ASCII"))) { + encName = wxT("UTF-8"); + } + + return wxConvFileName = new wxConvBrokenFileNames(encName); +} + +// Ensure intialization +static void* s_foo = setFNConv(); +#endif + + +// Windows has case-insensitive paths, so we use a +// case-insensitive cmp for that platform. TODO: +// Perhaps it would be better to simply lowercase +// m_filesystem in the contructor ... +#ifdef __WXMSW__ + #define PATHCMP(a, b) wxStricmp(a, b) + #define PATHNCMP(a, b, n) wxStrnicmp(a, b, n) +#else + #define PATHCMP(a, b) wxStrcmp(a, b) + #define PATHNCMP(a, b, n) wxStrncmp(a, b, n) +#endif + + +//////////////////////////////////////////////////////////// +// Helper functions + + +/** Creates a deep copy of the string, avoiding its ref. counting. */ +inline wxString DeepCopy(const wxString& str) +{ + return wxString(str.c_str(), str.Length()); +} + + +wxString Demangle(const wxCharBuffer& fn, const wxString& filename) +{ + wxString result = wxConvUTF8.cMB2WC(fn); + + // FIXME: Is this actually needed for osx/msw? + if (!result) { + // We only try to further demangle if the current locale is + // UTF-8, C or POSIX. This is because in any other case, the + // current locale is probably the best choice for printing. + static wxFontEncoding enc = wxLocale::GetSystemEncoding(); + + switch (enc) { + // SYSTEM is needed for ANSI encodings such as + // "POSIX" and "C", which are only 7bit. + case wxFONTENCODING_SYSTEM: + case wxFONTENCODING_UTF8: + result = wxConvISO8859_1.cMB2WC(fn); + break; + + default: + // Nothing to do, the filename is probably Ok. + result = DeepCopy(filename); + } + } + + return result; +} + + +/** Splits a full path into its path and filename component. */ +inline void DoSplitPath(const wxString& strPath, wxString* path, wxString* name) +{ + bool hasExt = false; + wxString ext, vol; + + wxString* pVol = (path ? &vol : NULL); + wxString* pExt = (name ? &ext : NULL); + + wxFileName::SplitPath(strPath, pVol, path, name, pExt, &hasExt); + + if (hasExt && pExt) { + *name += wxT(".") + ext; + } + + if (path && vol.Length()) { + *path = vol + wxFileName::GetVolumeSeparator() + *path; + } +} + + +/** Removes invalid chars from a filename. */ +wxString DoCleanup(const wxString& filename, bool keepSpaces, bool isFAT32) +{ + wxString result; + for (size_t i = 0; i < filename.Length(); i++) { + const wxChar c = filename[i]; + + switch (c) { + case wxT('/'): + continue; + + case wxT('\"'): + case wxT('*'): + case wxT('<'): + case wxT('>'): + case wxT('?'): + case wxT('|'): + case wxT('\\'): + case wxT(':'): + if (isFAT32) { + continue; + } + + default: + if ((c == wxT(' ')) && !keepSpaces) { + result += wxT("%20"); + } else if (c >= 32) { + // Many illegal for filenames in windows + // below the 32th char (which is space). + result += filename[i]; + } + } + } + + return result; +} + + +/** Does the actual work of adding a postfix ... */ +wxString DoAddPostfix(const wxString& src, const wxString& postfix) +{ + const wxFileName srcFn(src); + wxString result = srcFn.GetName() + postfix; + + if (srcFn.HasExt()) { + result += wxT(".") + srcFn.GetExt(); + } + + wxString path = srcFn.GetPath(); + if (path.Length()) { + return path + wxFileName::GetPathSeparator() + result; + } + + return result; +} + +/** Removes the last extension of a filename. */ +wxString DoRemoveExt(const wxString& path) +{ + // Using wxFilename which handles paths, etc. + wxFileName tmp(path); + tmp.ClearExt(); + + return tmp.GetFullPath(); +} + + +/** Readies a path for use with wxAccess.. */ +wxString DoCleanPath(const wxString& path) +{ +#ifdef __WXMSW__ + // stat fails on windows if there are trailing path-separators. + wxString cleanPath = StripSeparators(path, wxString::trailing); + + // Root paths must end with a separator (X:\ rather than X:). + // See comments in wxDirExists. + if ((cleanPath.Length() == 2) && (cleanPath.Last() == wxT(':'))) { + cleanPath += wxFileName::GetPathSeparator(); + } + + return cleanPath; +#else + return path; +#endif +} + + +/** Returns true if the two paths are equal. */ +bool IsSameAs(const wxString& a, const wxString& b) +{ + // Cache the current directory + const wxString cwd = wxGetCwd(); + + // We normalize everything, except env. variables, which + // can cause problems when the string is not encodable + // using wxConvLibc which wxWidgets uses for the purpose. + const int flags = (wxPATH_NORM_ALL | wxPATH_NORM_CASE) & ~wxPATH_NORM_ENV_VARS; + + // Let wxFileName handle the tricky stuff involved in actually + // comparing two paths ... Currently, a path ending with a path- + // seperator will be unequal to the same path without a path- + // seperator, which is probably for the best, but can could + // lead to some unexpected behavior. + wxFileName fn1(a); + wxFileName fn2(b); + + fn1.Normalize(flags, cwd); + fn2.Normalize(flags, cwd); + + return (fn1.GetFullPath() == fn2.GetFullPath()); +} + + +//////////////////////////////////////////////////////////// +// CPath implementation + +CPath::CPath() +{ +} + + +CPath::CPath(const wxString& filename) +{ + // Equivalent to the default constructor ... + if (!filename) { + return; + } + + wxCharBuffer fn = filename2char(filename); + if (fn) { + // Filename is valid in the current locale. This means that + // it either originated from a (wx)system-call, or from a + // user with a properly setup system. + m_filesystem = DeepCopy(filename); + m_printable = Demangle(fn, filename); + } else { + // It's not a valid filename in the current locale, so we'll + // have to do some magic. This ensures that the filename is + // saved as UTF8, even if the system is not unicode enabled, + // preserving the original filename till the user has fixed + // his system ... + fn = wxConvUTF8.cWC2MB(filename); + m_filesystem = wxConvFile.cMB2WC(fn); + + // There's no need to try to unmangle the filename here. + m_printable = DeepCopy(filename); + } + + wxASSERT(m_filesystem.Length()); + wxASSERT(m_printable.Length()); +} + + +CPath::CPath(const CPath& other) + : CPrintable() + , m_printable(DeepCopy(other.m_printable)) + , m_filesystem(DeepCopy(other.m_filesystem)) +{ +} + + +CPath::~CPath() +{ +} + + +CPath CPath::FromUniv(const wxString& path) +{ + wxCharBuffer fn = wxConvISO8859_1.cWC2MB(path); + + return CPath(wxConvFile.cMB2WC(fn)); + +} + + +wxString CPath::ToUniv(const CPath& path) +{ + // The logic behind this is that by saving the filename + // as a raw bytestream (which is what ISO8859-1 amounts + // to), we can always recreate the on-disk filename, as + // if we had read it using wx functions. + wxCharBuffer fn = wxConvFile.cWC2MB(path.m_filesystem); + + return wxConvISO8859_1.cMB2WC(fn); +} + + +CPath& CPath::operator=(const CPath& other) +{ + if (this != &other) { + m_printable = DeepCopy(other.m_printable); + m_filesystem = DeepCopy(other.m_filesystem); + } + + return *this; +} + + +bool CPath::operator==(const CPath& other) const +{ + return ::IsSameAs(m_filesystem, other.m_filesystem); +} + + +bool CPath::operator!=(const CPath& other) const +{ + return !(*this == other); +} + + +bool CPath::operator<(const CPath& other) const +{ + return PATHCMP(m_filesystem.c_str(), other.m_filesystem.c_str()) < 0; +} + + +bool CPath::IsOk() const +{ + // Something is very wrong if one of the two is empty. + return m_printable.Length() && m_filesystem.Length(); +} + + +bool CPath::FileExists() const +{ + return wxFileName::FileExists(m_filesystem); +} + + +bool CPath::DirExists() const +{ + return wxFileName::DirExists(DoCleanPath(m_filesystem)); +} + + +bool CPath::IsDir(EAccess mode) const +{ + wxString path = DoCleanPath(m_filesystem); + if (!wxFileName::DirExists(path)) { + return false; + } else if ((mode & writable) && !wxIsWritable(path)) { + return false; + } else if ((mode & readable) && !wxIsReadable(path)) { + return false; + } + + return true; +} + + +bool CPath::IsFile(EAccess mode) const +{ + if (!wxFileName::FileExists(m_filesystem)) { + return false; + } else if ((mode & writable) && !wxIsWritable(m_filesystem)) { + return false; + } else if ((mode & readable) && !wxIsReadable(m_filesystem)) { + return false; + } + + return true; +} + + +wxString CPath::GetRaw() const +{ + // Copy as c-strings to ensure that the CPath objects can safely + // be passed across threads (avoiding wxString ref. counting). + return DeepCopy(m_filesystem); +} + + +wxString CPath::GetPrintable() const +{ + // Copy as c-strings to ensure that the CPath objects can safely + // be passed across threads (avoiding wxString ref. counting). + return DeepCopy(m_printable); +} + + +wxString CPath::GetExt() const +{ + return wxFileName(m_filesystem).GetExt(); +} + + +CPath CPath::GetPath() const +{ + CPath path; + ::DoSplitPath(m_printable, &path.m_printable, NULL); + ::DoSplitPath(m_filesystem, &path.m_filesystem, NULL); + + return path; +} + + +CPath CPath::GetFullName() const +{ + CPath path; + ::DoSplitPath(m_printable, NULL, &path.m_printable); + ::DoSplitPath(m_filesystem, NULL, &path.m_filesystem); + + return path; + +} + + +sint64 CPath::GetFileSize() const +{ + if (FileExists()) { + wxFile f(m_filesystem); + if (f.IsOpened()) { + return f.Length(); + } + } + + return wxInvalidOffset; +} + + +bool CPath::IsSameDir(const CPath& other) const +{ + wxString a = m_filesystem; + wxString b = other.m_filesystem; + + // This check is needed to avoid trouble in the + // case where one path is empty, and the other + // points to the root dir. + if (a.Length() && b.Length()) { + a = StripSeparators(a, wxString::trailing); + b = StripSeparators(b, wxString::trailing); + } + + return ::IsSameAs(a, b); +} + + +CPath CPath::JoinPaths(const CPath& other) const +{ + if (!IsOk()) { + return CPath(other); + } else if (!other.IsOk()) { + return CPath(*this); + } + + CPath joinedPath; + // DeepCopy shouldn't be needed, as JoinPaths results in the creation of a new string. + joinedPath.m_printable = ::JoinPaths(m_printable, other.m_printable); + joinedPath.m_filesystem = ::JoinPaths(m_filesystem, other.m_filesystem); + + return joinedPath; +} + + +CPath CPath::Cleanup(bool keepSpaces, bool isFAT32) const +{ + CPath result; + result.m_printable = ::DoCleanup(m_printable, keepSpaces, isFAT32); + result.m_filesystem = ::DoCleanup(m_filesystem, keepSpaces, isFAT32); + + return result; +} + + +CPath CPath::AddPostfix(const wxString& postfix) const +{ + wxASSERT(postfix.IsAscii()); + + CPath result; + result.m_printable = ::DoAddPostfix(m_printable, postfix); + result.m_filesystem = ::DoAddPostfix(m_filesystem, postfix); + + return result; +} + + +CPath CPath::AppendExt(const wxString& ext) const +{ + wxASSERT(ext.IsAscii()); + + // Though technically, and empty extension would simply + // be another . at the end of the filename, we ignore them. + if (ext.IsEmpty()) { + return *this; + } + + CPath result(*this); + if (ext[0] == wxT('.')) { + result.m_printable << ext; + result.m_filesystem << ext; + } else { + result.m_printable << wxT(".") << ext; + result.m_filesystem << wxT(".") << ext; + } + + return result; +} + + +CPath CPath::RemoveExt() const +{ + CPath result; + result.m_printable = DoRemoveExt(m_printable); + result.m_filesystem = DoRemoveExt(m_filesystem); + + return result; +} + + +CPath CPath::RemoveAllExt() const +{ + CPath last, current = RemoveExt(); + + // Loop untill all extensions are removed + do { + last = current; + + current = last.RemoveExt(); + } while (last != current); + + return current; +} + + +bool CPath::StartsWith(const CPath& other) const +{ + // It doesn't make sense comparing invalid paths, + // especially since if 'other' was empty, it would + // be considered a prefix of any path. + if ((IsOk() && other.IsOk()) == false) { + return false; + } + + // Adding an seperator to avoid partial matches, such as + // "/usr/bi" matching "/usr/bin". TODO: Paths should be + // normalized first (in the constructor). + const wxString a = StripSeparators(m_filesystem, wxString::trailing) + wxFileName::GetPathSeparator(); + const wxString b = StripSeparators(other.m_filesystem, wxString::trailing) + wxFileName::GetPathSeparator(); + + if (a.Length() < b.Length()) { + // Cannot possibly be a prefix. + return false; + } + + const size_t checkLen = std::min(a.Length(), b.Length()); + return PATHNCMP(a.c_str(), b.c_str(), checkLen) == 0; +} + + +wxString CPath::GetPrintableString() const +{ + return DeepCopy(m_printable); +} + + +bool CPath::CloneFile(const CPath& src, const CPath& dst, bool overwrite) +{ + return ::wxCopyFile(src.m_filesystem, dst.m_filesystem, overwrite); +} + + +bool CPath::RemoveFile(const CPath& file) +{ + return ::wxRemoveFile(file.m_filesystem); +} + + +bool CPath::RenameFile(const CPath& src, const CPath& dst, bool overwrite) +{ + return ::wxRenameFile(src.m_filesystem, dst.m_filesystem, overwrite); +} + + +bool CPath::BackupFile(const CPath& src, const wxString& appendix) +{ + wxASSERT(appendix.IsAscii()); + + CPath dst = CPath(src.m_filesystem + appendix); + + if (CPath::CloneFile(src, dst, true)) { + // Try to ensure that the backup gets physically written + wxFile backupFile; + if (backupFile.Open(dst.m_filesystem)) { + backupFile.Flush(); + } + + return true; + } + + return false; +} + + +bool CPath::RemoveDir(const CPath& file) +{ + return ::wxRmdir(file.m_filesystem); +} + + +bool CPath::MakeDir(const CPath& file) +{ + return ::wxMkdir(file.m_filesystem); +} + + +bool CPath::FileExists(const wxString& file) +{ + return CPath(file).FileExists(); +} + + +bool CPath::DirExists(const wxString& path) +{ + return CPath(path).DirExists(); +} + + +sint64 CPath::GetFileSize(const wxString& file) +{ + return CPath(file).GetFileSize(); +} + + +time_t CPath::GetModificationTime(const CPath& file) +{ + return ::wxFileModificationTime(file.m_filesystem); +} + + +sint64 CPath::GetFreeSpaceAt(const CPath& path) +{ + wxLongLong free; + if (::wxGetDiskSpace(path.m_filesystem, NULL, &free)) { + return free.GetValue(); + } + + return wxInvalidOffset; +} + diff --git a/src/libs/common/Path.h b/src/libs/common/Path.h new file mode 100644 index 00000000..4becbb50 --- /dev/null +++ b/src/libs/common/Path.h @@ -0,0 +1,217 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef FILENAME_H +#define FILENAME_H + +#include "../../Types.h" +#include "Format.h" + + +/** + * This class wraps a path/filename, serving a purpose much + * like wxFileName. But in addition CPath serves to enable + * the handling of "broken" filenames, allowing these to be + * printed in a meaningful manner, while still allowing + * access to the actual files in the filesystem. + * + * This class is thread-safe, in that the class is read-only, + * and any function that returns wxStrings or CPath objects, + * ensure that an entirely new wxString object is created to + * circumvent the thread-unsafe reference counting of that + * class. + * + * This class, and its static functions should be used in + * preference of wxFileName, for the above reason, and so + * that cross-platform issues can be worked around in a + * single place. + */ +class CPath : public CPrintable +{ +public: + /** Default constructor. */ + CPath(); + + /** Constuctor. */ + explicit CPath(const wxString& path); + + /** Copy constructor. Creates a deep-copy of the passed object. */ + CPath(const CPath& other); + + /** Destructor. */ + ~CPath(); + + + /** + * Creates a path from one saved in the 'universial' format. + * + * These are to be used when the filenames/paths are saved to + * the local machine, and ensure that locale-changes does not + * affect our ability to find previously known files. This + * should not be used when sending filenames to other clients + * or (currently) the core/gui. + **/ + static CPath FromUniv(const wxString& path); + /** Creates an 'universial' path from the specifed CPath. */ + static wxString ToUniv(const CPath& path); + + + /** Assignment operator. */ + CPath& operator=(const CPath& other); + /** Less-than operator. */ + bool operator<(const CPath& other) const; + /** Note that only exact matches are considered equal, see IsSameDir. */ + bool operator==(const CPath& other) const; + /** Note that only exact matches are considered equal, see IsSameDir. */ + bool operator!=(const CPath& other) const; + + + /** Returns true if the filename is valid, false otherwise. */ + bool IsOk() const; + /** Returns true if the path exists and is a file, false otherwise. */ + bool FileExists() const; + /** Returns true if the path exists and is a directory, false otherwise. */ + bool DirExists() const; + + + enum EAccess { + //! Only check of the file or dir exists. + exists, + //! If set, checks if a file is readable, or if a dir can be accessed. + readable, + //! If set, checks if a file or directory can be written to, + writable, + //! Combination of the two checks above. + readwritable = readable | writable + }; + + /** Returns if if the path is a dir, and the checks were positive. */ + bool IsDir(EAccess mode) const; + /** Returns if if the path is a dir, and the checks were positive. */ + bool IsFile(EAccess mode) const; + + + /** Returns the contents of the object in a form suitable for use with wx system-calls. */ + wxString GetRaw() const; + /** Returns the contents of the object in a form suitable for use in the UI. */ + wxString GetPrintable() const; + /** Returns the (raw) last extension, empty if none is found. */ + wxString GetExt() const; + + /** Returns the full path, exluding the filename. */ + CPath GetPath() const; + /** Returns the full filename, excluding the path. */ + CPath GetFullName() const; + + /** Returns the size of the specified file, or wxInvalidSize on failure. */ + sint64 GetFileSize() const; + + /** + * Compares under the assumption that both objects are dirs, even if + * one or the other lacks a terminal directory-seperator. However, an + * empty CPath object will not be considered equal to a path to the root. + */ + bool IsSameDir(const CPath& other) const; + + /** Returns a CPath created from joining the two objects. */ + CPath JoinPaths(const CPath& other) const; + /** Returns a CPath with invalid chars removed, and spaces escaped if specified. */ + CPath Cleanup(bool keepSpaces = true, bool isFAT32 = false) const; + /** Returns a CPath with a postfix before the file-extension. Must be ASCII. */ + CPath AddPostfix(const wxString& postfix) const; + + /** Returns a CPath object with the extension appended. Empty strings are ignored. */ + CPath AppendExt(const wxString& ext) const; + /** Returns a CPath with the (last, if multiple) extension removed. */ + CPath RemoveExt() const; + /** Returns a CPath object with all extensions removed. */ + CPath RemoveAllExt() const; + + + /** Returns true if the the passed path makes up an prefix of this object. */ + bool StartsWith(const CPath& other) const; + + /** @see cprintable::getprintablestring */ + wxString GetPrintableString() const; + + + /** + * Renames the file 'src' to the file 'dst', overwriting if specified. Note that + * renaming cannot be done across volumes. For that CopyFile is required. + */ + static bool RenameFile(const CPath& src, const CPath& dst, bool overwrite = false); + /** + * Copies the file 'src' to the file 'dst', overwriting if specified. + * The silly name is used to avoid conflicts with the #define CopyFile, + * which is set on MSW. + */ + static bool CloneFile(const CPath& src, const CPath& dst, bool overwrite = false); + + /** Makes a backup of a file, by copying the original file to 'src' + 'appendix' */ + static bool BackupFile(const CPath& src, const wxString& appendix); + + /** Deletes the specified file, returning true on success. */ + static bool RemoveFile(const CPath& file); + /** Deletes the specified directory, returning true on success. */ + static bool RemoveDir(const CPath& file); + /** Creates the specified directory, returning true on success. */ + static bool MakeDir(const CPath& file); + + /** Returns true if the path exists, and is a file. */ + static bool FileExists(const wxString& file); + /** Returns true if the path exists, and is a directory. */ + static bool DirExists(const wxString& path); + + /** Returns the size of the specified file, or wxInvalidOffset on failure. */ + static sint64 GetFileSize(const wxString& file); + /** Returns the modification time the specified file, or (time_t)-1 on failure. */ + static time_t GetModificationTime(const CPath& file); + /** Returns the free diskspace at the specified path, or wxInvalidOffset on failure. */ + static sint64 GetFreeSpaceAt(const CPath& path); + +private: + //! Contains the printable filename, for use in the UI. + wxString m_printable; + //! Contains the "raw" filename, for use in system-calls, + //! as well as in wxWidgets file functions. + wxString m_filesystem; + + // Is made a friend to avoid needless copying of strings. + friend int CmpAny(const CPath& ArgA, const CPath& ArgB); +}; + + +/** + * Overloaded version of CmpAny for use with CPaths. As this is + * typically used in the UI, it uses the printable filename in + * order to get visually correct results. + */ +inline int CmpAny(const CPath& ArgA, const CPath& ArgB) +{ + return ArgA.m_printable.CmpNoCase(ArgB.m_printable); +} + + + +#endif diff --git a/src/libs/common/StringFunctions.cpp b/src/libs/common/StringFunctions.cpp new file mode 100644 index 00000000..19846c13 --- /dev/null +++ b/src/libs/common/StringFunctions.cpp @@ -0,0 +1,314 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal Veiga - Kry (kry@amule.org) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#define STRINGFUNCTIONS_CPP + + +#include "StringFunctions.h" +#include "Path.h" + +#include // Needed for wxFileName +#include // Needed for wxURI + +// Implementation of the non-inlines +static byte base16Chars[17] = "0123456789ABCDEF"; + +wxString URLEncode(const wxString& sIn) +{ + wxString sOut; + unsigned char curChar; + + for ( unsigned int i = 0; i < sIn.Length(); ++i ) { + curChar = sIn.GetChar( i ); + + if ( isalnum( curChar ) ) { + sOut += curChar; + } else if( isspace ( curChar ) ) { + sOut += wxT("+"); + } else { + sOut += wxT("%"); + sOut += base16Chars[ curChar >> 4]; + sOut += base16Chars[ curChar & 0xf]; + } + + } + + return sOut; +} + +wxString TruncateFilename(const CPath& filename, size_t length, bool isFilePath) +{ + wxString file = filename.GetPrintable(); + + // Check if there's anything to do + if (file.Length() <= length) + return file; + + // If the filename is a path, then prefer to remove from the path, rather than the filename + if ( isFilePath ) { + wxString path = wxFileName(file).GetPath(); + file = wxFileName(file).GetFullName(); + + if ( path.Length() >= length ) { + path.Clear(); + } else if ( file.Length() >= length ) { + path.Clear(); + } else { + // Minus 6 for "[...]" + separator + int pathlen = length - file.Length() - 6; + + if ( pathlen > 0 ) { + path = wxT("[...]") + path.Right( pathlen ); + } else { + path.Clear(); + } + } + + file = JoinPaths(path, file); + } + + if ( file.Length() > length ) { + if ( length > 5 ) { + file = file.Left( length - 5 ) + wxT("[...]"); + } else { + file.Clear(); + } + } + + + return file; +} + + + +wxString StripSeparators(wxString path, wxString::stripType type) +{ + wxASSERT((type == wxString::leading) || (type == wxString::trailing)); + const wxString seps = wxFileName::GetPathSeparators(); + + while (!path.IsEmpty()) { + size_t pos = ((type == wxString::leading) ? 0 : path.Length() - 1); + + if (seps.Contains(path.GetChar(pos))) { + path.Remove(pos, 1); + } else { + break; + } + } + + return path; +} + + +wxString JoinPaths(const wxString& path, const wxString& file) +{ + if (path.IsEmpty()) { + return file; + } else if (file.IsEmpty()) { + return path; + } + + return StripSeparators(path, wxString::trailing) + + wxFileName::GetPathSeparator() + + StripSeparators(file, wxString::leading); +} + + +wxChar HexToDec( const wxString& hex ) +{ + wxChar result = 0; + wxString str = hex.Upper(); + + for ( size_t i = 0; i < str.Len(); ++i ) { + result *= 16; + wxChar cur = str.GetChar(i); + + if ( isdigit( cur ) ) { + result += cur - wxT('0'); + } else if ( cur >= wxT('A') && cur <= wxT('F') ) { + result += cur - wxT('A') + 10; + } else { + return wxT('\0'); + } + } + + return result; +} + + +wxString UnescapeHTML( const wxString& str ) +{ + wxString result; + result.Alloc( str.Len() ); + + for ( size_t i = 0; i < str.Len(); ++i ) { + if ( str.GetChar(i) == wxT('%') && ( i + 2 < str.Len() ) ) { + wxChar unesc = HexToDec( str.Mid( i + 1, 2 ) ); + + if ( unesc ) { + i += 2; + + result += unesc; + } else { + // If conversion failed, then we just add the escape-code + // and continue past it like nothing happened. + result += str.at(i); + } + } else { + result += str.at(i); + } + } + + return result; +} + + +wxString validateURI(const wxString& url) +{ + wxURI uri(url); + + return uri.BuildURI(); +} + + +enum ECharType { + ECTInteger, + ECTText, + ECTNone +}; + +inline wxString GetNextField(const wxString& str, size_t& cookie) +{ + // These are taken to seperate "fields" + static const wxChar* s_delims = wxT("\t\n\x0b\x0c\r !\"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~"); + + wxString field; + ECharType curType = ECTNone; + for (; cookie < str.Length(); ++cookie) { + wxChar c = str[cookie]; + + if ((c >= wxT('0')) && (c <= wxT('9'))) { + if (curType == ECTText) { + break; + } + + curType = ECTInteger; + field += c; + } else if (wxStrchr(s_delims, c)) { + if (curType == ECTNone) { + continue; + } else { + break; + } + } else { + if (curType == ECTInteger) { + break; + } + + curType = ECTText; + field += c; + } + } + + return field; +} + + +int FuzzyStrCmp(const wxString& a, const wxString& b) +{ + size_t aCookie = 0, bCookie = 0; + wxString aField, bField; + + do { + aField = GetNextField(a, aCookie); + bField = GetNextField(b, bCookie); + + if (aField.IsNumber() && bField.IsNumber()) { + unsigned long aInteger = StrToULong(aField); + unsigned long bInteger = StrToULong(bField); + + if (aInteger < bInteger) { + return -1; + } else if (aInteger > bInteger) { + return 1; + } + } else if (aField < bField) { + return -1; + } else if (aField > bField) { + return 1; + } + } while (!aField.IsEmpty() && !bField.IsEmpty()); + + return 0; +} + + +int FuzzyStrCaseCmp(const wxString& a, const wxString& b) +{ + return FuzzyStrCmp(a.Lower(), b.Lower()); +} + + + +CSimpleTokenizer::CSimpleTokenizer(const wxString& str, wxChar token) + : m_string(str), + m_delim(token), + m_ptr(m_string.c_str()), + m_count(0) +{ +} + + +wxString CSimpleTokenizer::next() +{ + const wxChar* start = m_ptr; + const wxChar* end = m_string.c_str() + m_string.Len() + 1; + + for (; m_ptr < end; ++m_ptr) { + if (*m_ptr == m_delim) { + m_count++; + break; + } + } + + // Return the token + return m_string.Mid(start - m_string.c_str(), m_ptr++ - start); +} + + +wxString CSimpleTokenizer::remaining() const +{ + return m_string.Mid(m_ptr - m_string.c_str()); +} + + +size_t CSimpleTokenizer::tokenCount() const +{ + return m_count; +} + + +// File_checked_for_headers diff --git a/src/libs/common/StringFunctions.h b/src/libs/common/StringFunctions.h new file mode 100644 index 00000000..ca194de4 --- /dev/null +++ b/src/libs/common/StringFunctions.h @@ -0,0 +1,303 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 Angel Vidal Veiga - Kry (kry@amule.org) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#ifndef STRING_FUNCTIONS_H +#define STRING_FUNCTIONS_H + +#include "../../Types.h" // Needed for uint16 and uint32 + +class CPath; + + +// UTF8 types: No UTF8, BOM prefix, or Raw UTF8 +enum EUtf8Str +{ + utf8strNone, + utf8strOptBOM, + utf8strRaw +}; + +/****************************************************/ +/******************* Inlines ************************/ +/****************************************************/ + +/** + * Functions to perform Unicode <-> (char *) and UTF-8 conversion + * + * Please, DO NOT store pointers returned by unicode2char(), because they + * get free'ed as soon as the return value of cWX2MB gets out of scope. + * If you need to store a pointer, use a buffer of type wxWX2MBbuf: + * and then cast it to a char pointer, e.g.: + * + * const wxWX2MBbuf buf(unicode2char(aWxString)); + * + * --- Now you can freely use buf as if it were a (const char *) --- + * + * puts(buf); + * printf("%s", (const char *)buf); + * + * The cast in printf is necessary because variable number of parameter + * functions have no type for these parameters, so the automatic casting + * of wxWX2MBbuf to (const char *) is not performed. + * + * --- don't worry about memory allocation, memory will be --- + * --- free'ed when buf gets out of scope, i.e., upon return --- + * + * wxMB2WXbuf, wxWX2MBbuf are always the appropriate return type, + * either (wxChar *) or (wxWCharBuffer) + * + * Use the simplified names Unicode2CharBuf and Char2UnicodeBuf, and + * do not declare these names const or the compiler will complain about + * a double const. + */ +typedef const wxWX2MBbuf Unicode2CharBuf; +typedef const wxMB2WXbuf Char2UnicodeBuf; + +inline Unicode2CharBuf unicode2char(const wxChar* x) { return wxConvLocal.cWX2MB(x); } +inline Char2UnicodeBuf char2unicode(const char* x) { return wxConvLocal.cMB2WX(x); } + +inline Unicode2CharBuf unicode2UTF8(const wxChar* x) { return wxConvUTF8.cWX2MB(x); } +inline Char2UnicodeBuf UTF82unicode(const char* x) { return wxConvUTF8.cMB2WX(x); } + +inline const wxCharBuffer char2UTF8(const char *x) { return unicode2UTF8(char2unicode(x)); } +inline const wxCharBuffer UTF82char(const char *x) { return unicode2char(UTF82unicode(x)); } + +inline Unicode2CharBuf filename2char(const wxChar* x) { return wxConvFile.cWC2MB(x); } +inline Char2UnicodeBuf char2filename(const char* x) { return wxConvFile.cMB2WC(x); } + + +// +// Replaces "&" with "&&" in 'in' for use with text-labels +// +inline wxString MakeStringEscaped(wxString in) { + in.Replace(wxT("&"),wxT("&&")); + return in; +} + +// Make a string be a folder +inline wxString MakeFoldername(wxString path) { + + if ( !path.IsEmpty() && ( path.Right(1) == wxT('/' )) ) { + path.RemoveLast(); + } + + return path; +} + +// Duplicates a string +inline char* nstrdup(const char* src) +{ + int len = (src ? strlen(src) : 0) + 1; + char *res = new char[len]; + if ( src ) strcpy(res, src); + res[len-1] = 0; + return res; +} + + +// Replacements for atoi and atol that removes the need for converting +// a string to normal chars with unicode2char. The value returned is the +// value represented in the string or 0 if the conversion failed. +inline long StrToLong( const wxString& str ) { + long value = 0; + str.ToLong( &value ); + return value; +} + +inline unsigned long StrToULong( const wxString& str ) { + unsigned long value = 0; + str.ToULong( &value ); + return value; +} + +inline unsigned long long StrToULongLong( const wxString& str ) { +#ifdef _MSC_VER + return _atoi64(unicode2char(str)); +#else + return atoll(unicode2char(str)); +#endif +} + +inline unsigned int GetRawSize(const wxString& rstr, EUtf8Str eEncode) +{ + unsigned int RealLen = 0; + switch (eEncode) { + case utf8strOptBOM: + RealLen = 3; + case utf8strRaw: { + Unicode2CharBuf s(unicode2UTF8(rstr)); + if (s) { + RealLen += strlen(s); + break; + } else { + RealLen = 0; + } + } + default: { + Unicode2CharBuf s(unicode2char(rstr)); + if (s) { + RealLen = strlen(s); + } + } + } + return RealLen; +} + + +/****************************************************/ +/***************** Non-inlines **********************/ +/****************************************************/ + +/** + * Truncates a filename to the specified length. + * + * @param filename The original filename. + * @param length The max length of the resulting filename. + * @param isFilePath If true, then the path will be truncated rather than the filename if possible. + * @return The truncated filename. + */ +wxString TruncateFilename(const CPath& filename, size_t length, bool isFilePath = false); + +/** + * Strips all path separators from the specified end of a path. + * + * Note: type must be either leading or trailing. + */ +wxString StripSeparators(wxString path, wxString::stripType type); + + +/** + * Joins two path with the operating system specific path-separator. + * + * If any of the parameters are empty, the other parameter is + * returned unchanged. + */ +wxString JoinPaths(const wxString& path, const wxString& file); + +// Makes sIn suitable for inclusion in an URL, by escaping all chars that could cause trouble. +wxString URLEncode(const wxString& sIn); + + +/** + * Converts a hexadecimal number to a char. + * + * @param hex The hex-number, must be at most 2 digits long. + * @return The resulting char or \0 if conversion failed. + */ +wxChar HexToDec( const wxString& hex ); + + +/** + * This function converts all valid HTML escape-codes to their corresponding chars. + * + * @param str The string to unescape. + * @return The unescaped version of the input string. + */ +wxString UnescapeHTML( const wxString& str ); + + +/** + * Ensures that the url pass is valid by escaping various chars. + */ +wxString validateURI(const wxString& url); + + +/** + * Compares two strings, while taking numerals into consideration. + * + * @return Returns -1 if a < b, 1 if a > b and 0 if a = b + * + * This function basically splits the two strings into a number of + * fields, deliniated by whitespace, non-alphanumerical chars. The + * numerals are then converted to integers, and the fields are + * compared. This allows strings such as "a (2)" and "a (10)" to + * be properly sorted for displaying. + * + * Currently does not handle floats (they are treated as to seperate + * fields, nor negative numbers. + */ +int FuzzyStrCmp(const wxString& a, const wxString& b); + +/** + * As with FuzzyStrCmp, but case insensitive. + */ +int FuzzyStrCaseCmp(const wxString& a, const wxString& b); + + +/** + * This class provides a simple and fast tokenizer. + */ +class CSimpleTokenizer +{ +public: + /** + * @param str The string to tokenize. + * @param delim The delimiter used to split the string. + */ + CSimpleTokenizer(const wxString& str, wxChar delim); + + /** + * Returns the next part of the string separated by the + * given delimiter. When the entire string has been + * tokenized, an empty string is returned. Note that + * empty tokens are also returned. + */ + wxString next(); + + /** + * Returns the remaining part of the string. + * + * The remaining part is defined as being the part after + * the last encountered token, or an empty string if the + * entire string has been tokenized. + * + * If next() has yet to be called, the entire string will + * be returned. + */ + wxString remaining() const; + + /** + * Returns the number of tokens encountered so far. + */ + size_t tokenCount() const; + +private: + //! The string being tokenized. + wxString m_string; + + //! The delimiter used to split the string. + wxChar m_delim; + + //! A pointer to the current position in the string. + const wxChar* m_ptr; + + //! The number of tokens encountered. + size_t m_count; +}; + + +#endif // STRING_FUNCTIONS_H +// File_checked_for_headers diff --git a/src/libs/common/TextFile.cpp b/src/libs/common/TextFile.cpp new file mode 100644 index 00000000..dfdfd952 --- /dev/null +++ b/src/libs/common/TextFile.cpp @@ -0,0 +1,203 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2006-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "TextFile.h" +#include "Path.h" + +#include + + +//! The maximum number of chars read at once in GetNextLine +const size_t TXTBUF_SIZE = 1024; + + +CTextFile::CTextFile() +{ +} + + +bool CTextFile::Open(const wxString& path, EOpenMode mode) +{ + return Open(CPath(path), mode); +} + + +bool CTextFile::Open(const CPath& path, EOpenMode mode) +{ + // wxFFile doesn't call close itself, but asserts instead. + Close(); + + m_mode = mode; + + if (mode == read) { + if (path.FileExists()) { + m_file.Open(path.GetRaw(), wxT("r")); + } + } else if (mode == write) { + m_file.Open(path.GetRaw(), wxT("w")); + } else { + wxASSERT(0); + } + + return IsOpened(); +} + + +CTextFile::~CTextFile() +{ +} + + +bool CTextFile::IsOpened() const +{ + return m_file.IsOpened(); +} + + +bool CTextFile::Eof() const +{ + // This is needed because feof will crash if the + // underlying FILE pointer is NULL, as is the + // case when the file is closed. + return m_file.IsOpened() ? m_file.Eof() : true; +} + + +bool CTextFile::Close() +{ + return m_file.Close(); +} + + +wxString CTextFile::GetNextLine(const wxMBConv& conv) +{ + wxCHECK_MSG(m_file.IsOpened(), wxEmptyString, wxT("Trying to read from closed file.")); + wxCHECK_MSG(!m_file.Eof(), wxEmptyString, wxT("Trying to read past EOF")); + wxCHECK_MSG((m_mode == read), wxEmptyString, wxT("Trying to read from non-readable file.")); + + + wxString line; + char buffer[TXTBUF_SIZE]; + + // Loop until EOF (fgets will then return NULL) or a newline is read. + while (fgets(buffer, TXTBUF_SIZE, m_file.fp())) { + // NB: The majority of the time spent by this function is + // spent converting the multibyte string to wide-char. + line += conv.cMB2WC(buffer); + + // Remove any newlines, carriage returns, etc. + if (line.Length() && (line.Last() == wxT('\n'))) { + if ((line.Length() > 1)) { + if (line[line.Length() - 2] == wxT('\r')) { + // Carriage return + newline + line.RemoveLast(2); + } else { + // Only a newline. + line.RemoveLast(1); + } + } else { + // Empty line + line.Clear(); + } + + // We've read an entire line. + break; + } + } + + return line; +} + + +bool CTextFile::WriteLine(const wxString& line, const wxMBConv& conv) +{ + wxCHECK_MSG(m_file.IsOpened(), wxEmptyString, wxT("Trying to read from closed file.")); + wxCHECK_MSG((m_mode == write), wxEmptyString, wxT("Trying to read from non-readable file.")); + + // Ensures that use of newlines/carriage-returns matches the OS + wxString result = wxTextBuffer::Translate(line); + + // Only add line-breaks between lines, as otherwise the number of + // lines would grow as the result of the addition of an empty line, + // at the end of the file. + if (m_file.Tell() > 0) { + result = wxTextBuffer::GetEOL() + result; + } + + wxCharBuffer strBuffer = conv.cWC2MB(result); + if (strBuffer) { + const size_t length = strlen(strBuffer); + + return (m_file.Write(strBuffer, length) == length); + } + + return false; +} + + +wxArrayString CTextFile::ReadLines(EReadTextFile flags, const wxMBConv& conv) +{ + wxArrayString lines; + + while (!Eof()) { + wxString line = GetNextLine(conv); + + if (flags & txtStripWhitespace) { + line = line.Strip(wxString::both); + } + + if (flags & txtIgnoreEmptyLines) { + if (line.IsEmpty()) { + continue; + } + } + + if (flags & txtIgnoreComments) { + if (flags & txtStripWhitespace) { + if (line.StartsWith(wxT("#"))) { + continue; + } + } else if (line.Strip(wxString::leading).StartsWith(wxT("#"))) { + continue; + } + } + + lines.Add(line); + } + + return lines; +} + + +bool CTextFile::WriteLines(const wxArrayString& lines, const wxMBConv& conv) +{ + bool result = true; + + for (size_t i = 0; i < lines.Count(); ++i) { + result &= WriteLine(lines[i], conv); + } + + return result; +} + diff --git a/src/libs/common/TextFile.h b/src/libs/common/TextFile.h new file mode 100644 index 00000000..932f44de --- /dev/null +++ b/src/libs/common/TextFile.h @@ -0,0 +1,125 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2006-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef TEXTFILE_H +#define TEXTFILE_H + +#include +#include +#include + + +class CPath; + +/** Criteria used when reading an entire file to an array of strings. */ +enum EReadTextFile +{ + /** Do not return empty lines. Can be combined with txtStripWhiteSpace */ + txtIgnoreEmptyLines = 1, + /** Do not return lines starting with a '#' */ + txtIgnoreComments = 2, + /** Strip whitespace from the beginning/end of lines. */ + txtStripWhitespace = 4, + + /** Default parameters for file reading. */ + txtReadDefault = txtIgnoreEmptyLines | txtIgnoreComments | txtStripWhitespace +}; + + +/** + * Text file class. + * + * This class is a wrapper around wxFFile, letting an text file be read + * or written line-by-line. The class provides transparent and automatic + * EOL-style handling. + * + * Note that it is not possible to seek in a CTextFile, only sequential + * reading or writing is possible. Also note that the maximum length of a + * line is fixed (see CTextFile::GetNextLine), however this shouldn't be + * a problem, given the uses of this class. + */ +class CTextFile +{ +public: + // Open modes. Note that these are mutually exclusive! + enum EOpenMode { + //! Opens the file for reading, if it exists. + read, + //! Opens the file for writing, overwriting old contents. + write + }; + + /* Constructor. */ + CTextFile(); + /** Destructor. Closes the file if still open. */ + ~CTextFile(); + + /** Opens the specified file, returning true on success. */ + //\{ + bool Open(const wxString& path, EOpenMode mode); + bool Open(const CPath& path, EOpenMode mode); + //\} + + /** Returns true if the file is opened. */ + bool IsOpened() const; + /** Returns true if GetNextLine has reached the end of the file. */ + bool Eof() const; + /** Closes the file, returning true on success. */ + bool Close(); + + + /** + * Returns the next line of a readable file. + * + * @param conv The converter used to convert from multibyte to widechar. + * + * Note that GetNextLine will return an empty string if the file has reached + * EOF, or if the file is closed, or not readable. However, empty lines in + * the file will also be returned, so this cannot be used to test for EOF. + * Instead, use the function Eof(). + **/ + wxString GetNextLine(const wxMBConv& conv = wxConvLibc); + + /** + * Writes the line to a writable file, returning true on success. + * + * @param conv The converter used to convert from widechar to multibyte. + */ + bool WriteLine(const wxString& line, const wxMBConv& conv = wxConvLibc); + + + /** Reads and returns the contents of a text-file, using the specifed criteria and converter. */ + wxArrayString ReadLines(EReadTextFile flags = txtReadDefault, const wxMBConv& conv = wxConvLibc); + + /** Writes the lines to the file, using the given converter, returning true if no errors occured. */ + bool WriteLines(const wxArrayString& lines, const wxMBConv& conv = wxConvLibc); + +private: + //! The actual file object. + wxFFile m_file; + //! The mode in with which the file was opened. + EOpenMode m_mode; +}; + +#endif /* TEXTFILE_H */ diff --git a/src/libs/ec/Makefile.am b/src/libs/ec/Makefile.am new file mode 100644 index 00000000..2f07ec8a --- /dev/null +++ b/src/libs/ec/Makefile.am @@ -0,0 +1,22 @@ +SUBDIRS = cpp + +# Sources + +MAINTAINERCLEANFILES = Makefile.in + +BUILT_SOURCES = ECGeneratedFiles + +ECGeneratedFilesSources = \ + abstracts/ECTagTypes.abstract \ + abstracts/ECCodes.abstract + +ECGeneratedFiles: $(ECGeneratedFilesSources) + $(srcdir)/file_generator.pl $(srcdir) $(ECGeneratedFilesSources); + echo $(ECGeneratedFilesSources) > ECGeneratedFiles + + +EXTRA_DIST = file_generator.pl +EXTRA__DIST__SUBDIRS = abstracts java # c# cannot be included because of the # in the name +include $(top_srcdir)/automake/dist-hook.am + +DISTCLEANFILES = $(BUILT_SOURCES) diff --git a/src/libs/ec/Makefile.in b/src/libs/ec/Makefile.in new file mode 100644 index 00000000..9d29487e --- /dev/null +++ b/src/libs/ec/Makefile.in @@ -0,0 +1,637 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/automake/dist-hook.am +subdir = src/libs/ec +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +SUBDIRS = cpp + +# Sources +MAINTAINERCLEANFILES = Makefile.in +BUILT_SOURCES = ECGeneratedFiles +ECGeneratedFilesSources = \ + abstracts/ECTagTypes.abstract \ + abstracts/ECCodes.abstract + +EXTRA_DIST = file_generator.pl +EXTRA__DIST__SUBDIRS = abstracts java # c# cannot be included because of the # in the name +DISTCLEANFILES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/automake/dist-hook.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/libs/ec/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/libs/ec/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(mkdir_p) $(distdir)/../../../automake + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-recursive ctags ctags-recursive \ + dist-hook distclean distclean-generic distclean-recursive \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-info-am + + +ECGeneratedFiles: $(ECGeneratedFilesSources) + $(srcdir)/file_generator.pl $(srcdir) $(ECGeneratedFilesSources); + echo $(ECGeneratedFilesSources) > ECGeneratedFiles +dist-hook: + for d in $(EXTRA__DIST__SUBDIRS) ; do \ + mkdir $(distdir)/$$d ; \ + for f in `find $(srcdir)/$$d -name '.svn' -prune -o -printf "%P\n"` ; do \ + if test -d $(srcdir)/$$d/$$f ; then \ + mkdir $(distdir)/$$d/$$f ; \ + else \ + cp -p $(srcdir)/$$d/$$f $(distdir)/$$d/$$f ; \ + fi ; \ + done ; \ + done +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/libs/ec/abstracts/ECCodes.abstract b/src/libs/ec/abstracts/ECCodes.abstract new file mode 100644 index 00000000..2c103560 --- /dev/null +++ b/src/libs/ec/abstracts/ECCodes.abstract @@ -0,0 +1,435 @@ +[Section Definition] +FileName ECCodes +FileContent EC codes and type definition. +[/Section] + +# The types of the values used on EC. +[Section Content] +Type TypeDef +ec_opcode_t uint8 +ec_tagname_t uint16 +ec_tagtype_t uint8 +ec_taglen_t uint32 +[/Section] + +# Current protocol version. +[Section Content] +Type Enum +Name ProtocolVersion +DataType uint16 +EC_CURRENT_PROTOCOL_VERSION 0x0200 +[/Section] + +# This flags are used on the transmission layer. +[Section Content] +Type Enum +Name ECFlags +DataType uint32 +EC_FLAG_ZLIB 0x00000001 +EC_FLAG_UTF8_NUMBERS 0x00000002 +EC_FLAG_HAS_ID 0x00000004 +EC_FLAG_ACCEPTS 0x00000010 +EC_FLAG_UNKNOWN_MASK 0xff7f7f08 +[/Section] + +# OpCodes +# Note: Needs some reorganization on Request/Reply +[Section Content] +Type Enum +Name ECOpCodes +DataType uint8 + +EC_OP_NOOP 0x01 + +EC_OP_AUTH_REQ 0x02 +EC_OP_AUTH_FAIL 0x03 +EC_OP_AUTH_OK 0x04 + +EC_OP_FAILED 0x05 +EC_OP_STRINGS 0x06 +EC_OP_MISC_DATA 0x07 +EC_OP_SHUTDOWN 0x08 +EC_OP_ADD_LINK 0x09 +EC_OP_STAT_REQ 0x0A +EC_OP_GET_CONNSTATE 0x0B +EC_OP_STATS 0x0C + +EC_OP_GET_DLOAD_QUEUE 0x0D +EC_OP_GET_ULOAD_QUEUE 0x0E +EC_OP_GET_WAIT_QUEUE 0x0F + +EC_OP_GET_SHARED_FILES 0x10 +EC_OP_SHARED_SET_PRIO 0x11 + +EC_OP_PARTFILE_REMOVE_NO_NEEDED 0x12 +EC_OP_PARTFILE_REMOVE_FULL_QUEUE 0x13 +EC_OP_PARTFILE_REMOVE_HIGH_QUEUE 0x14 +EC_OP_PARTFILE_CLEANUP_SOURCES 0x15 +EC_OP_PARTFILE_SWAP_A4AF_THIS 0x16 +EC_OP_PARTFILE_SWAP_A4AF_THIS_AUTO 0x17 +EC_OP_PARTFILE_SWAP_A4AF_OTHERS 0x18 +EC_OP_PARTFILE_PAUSE 0x19 +EC_OP_PARTFILE_RESUME 0x1A +EC_OP_PARTFILE_STOP 0x1B +EC_OP_PARTFILE_PRIO_SET 0x1C +EC_OP_PARTFILE_DELETE 0x1D +EC_OP_PARTFILE_SET_CAT 0x1E + +EC_OP_DLOAD_QUEUE 0x1F +EC_OP_ULOAD_QUEUE 0x20 +EC_OP_WAIT_QUEUE 0x21 + +EC_OP_SHARED_FILES 0x22 +EC_OP_SHAREDFILES_RELOAD 0x23 +EC_OP_SHAREDFILES_ADD_DIRECTORY 0x24 + +EC_OP_RENAME_FILE 0x25 + +EC_OP_SEARCH_START 0x26 +EC_OP_SEARCH_STOP 0x27 +EC_OP_SEARCH_RESULTS 0x28 +EC_OP_SEARCH_PROGRESS 0x29 + +EC_OP_DOWNLOAD_SEARCH_RESULT 0x2A + +EC_OP_IPFILTER_RELOAD 0x2B + +EC_OP_GET_SERVER_LIST 0x2C +EC_OP_SERVER_LIST 0x2D +EC_OP_SERVER_DISCONNECT 0x2E +EC_OP_SERVER_CONNECT 0x2F +EC_OP_SERVER_REMOVE 0x30 +EC_OP_SERVER_ADD 0x31 +EC_OP_SERVER_UPDATE_FROM_URL 0x32 + +EC_OP_ADDLOGLINE 0x33 +EC_OP_ADDDEBUGLOGLINE 0x34 +EC_OP_GET_LOG 0x35 +EC_OP_GET_DEBUGLOG 0x36 +EC_OP_GET_SERVERINFO 0x37 +EC_OP_LOG 0x38 +EC_OP_DEBUGLOG 0x39 +EC_OP_SERVERINFO 0x3A +EC_OP_RESET_LOG 0x3B +EC_OP_RESET_DEBUGLOG 0x3C +EC_OP_CLEAR_SERVERINFO 0x3D +EC_OP_GET_LAST_LOG_ENTRY 0x3E + +EC_OP_GET_PREFERENCES 0x3F +EC_OP_SET_PREFERENCES 0x40 + +EC_OP_CREATE_CATEGORY 0x41 +EC_OP_UPDATE_CATEGORY 0x42 +EC_OP_DELETE_CATEGORY 0x43 + +EC_OP_GET_STATSGRAPHS 0x44 +EC_OP_STATSGRAPHS 0x45 +EC_OP_GET_STATSTREE 0x46 +EC_OP_STATSTREE 0x47 + +EC_OP_KAD_START 0x48 +EC_OP_KAD_STOP 0x49 + +EC_OP_CONNECT 0x4A +EC_OP_DISCONNECT 0x4B +EC_OP_GET_DLOAD_QUEUE_DETAIL 0x4C + +EC_OP_KAD_UPDATE_FROM_URL 0x4D +EC_OP_KAD_BOOTSTRAP_FROM_IP 0x4E +[/Section] + +[Section Content] +Type Enum +Name ECTagNames +DataType uint16 + +EC_TAG_STRING 0x0000 +EC_TAG_PASSWD_HASH 0x0001 +EC_TAG_PROTOCOL_VERSION 0x0002 +EC_TAG_VERSION_ID 0x0003 +EC_TAG_DETAIL_LEVEL 0x0004 +EC_TAG_CONNSTATE 0x0005 +EC_TAG_ED2K_ID 0x0006 +EC_TAG_LOG_TO_STATUS 0x0007 +EC_TAG_BOOTSTRAP_IP 0x0008 +EC_TAG_BOOTSTRAP_PORT 0x0008 +EC_TAG_CLIENT_ID 0x0009 + + +EC_TAG_CLIENT_NAME 0x0100 + EC_TAG_CLIENT_VERSION 0x0101 + EC_TAG_CLIENT_MOD 0x0102 + +EC_TAG_STATS_UL_SPEED 0x0200 + EC_TAG_STATS_DL_SPEED 0x0201 + EC_TAG_STATS_UL_SPEED_LIMIT 0x0202 + EC_TAG_STATS_DL_SPEED_LIMIT 0x0203 + EC_TAG_STATS_UP_OVERHEAD 0x0204 + EC_TAG_STATS_DOWN_OVERHEAD 0x0205 + EC_TAG_STATS_TOTAL_SRC_COUNT 0x0206 + EC_TAG_STATS_BANNED_COUNT 0x0207 + EC_TAG_STATS_UL_QUEUE_LEN 0x0208 + EC_TAG_STATS_ED2K_USERS 0x0209 + EC_TAG_STATS_KAD_USERS 0x020A + EC_TAG_STATS_ED2K_FILES 0x020B + EC_TAG_STATS_KAD_FILES 0x020C + +EC_TAG_PARTFILE 0x0300 + EC_TAG_PARTFILE_NAME 0x0301 + EC_TAG_PARTFILE_PARTMETID 0x0302 + EC_TAG_PARTFILE_SIZE_FULL 0x0303 + EC_TAG_PARTFILE_SIZE_XFER 0x0304 + EC_TAG_PARTFILE_SIZE_XFER_UP 0x0305 + EC_TAG_PARTFILE_SIZE_DONE 0x0306 + EC_TAG_PARTFILE_SPEED 0x0307 + EC_TAG_PARTFILE_STATUS 0x0308 + EC_TAG_PARTFILE_PRIO 0x0309 + EC_TAG_PARTFILE_SOURCE_COUNT 0x030A + EC_TAG_PARTFILE_SOURCE_COUNT_A4AF 0x030B + EC_TAG_PARTFILE_SOURCE_COUNT_NOT_CURRENT 0x030C + EC_TAG_PARTFILE_SOURCE_COUNT_XFER 0x030D + EC_TAG_PARTFILE_ED2K_LINK 0x030E + EC_TAG_PARTFILE_CAT 0x030F + EC_TAG_PARTFILE_LAST_RECV 0x0310 + EC_TAG_PARTFILE_LAST_SEEN_COMP 0x0311 + EC_TAG_PARTFILE_PART_STATUS 0x0312 + EC_TAG_PARTFILE_GAP_STATUS 0x0313 + EC_TAG_PARTFILE_REQ_STATUS 0x0314 + EC_TAG_PARTFILE_SOURCE_NAMES 0x0315 + EC_TAG_PARTFILE_COMMENTS 0x0316 + +EC_TAG_KNOWNFILE 0x0400 + EC_TAG_KNOWNFILE_XFERRED 0x0401 + EC_TAG_KNOWNFILE_XFERRED_ALL 0x0402 + EC_TAG_KNOWNFILE_REQ_COUNT 0x0403 + EC_TAG_KNOWNFILE_REQ_COUNT_ALL 0x0404 + EC_TAG_KNOWNFILE_ACCEPT_COUNT 0x0405 + EC_TAG_KNOWNFILE_ACCEPT_COUNT_ALL 0x0406 + EC_TAG_KNOWNFILE_AICH_MASTERHASH 0x0407 + +EC_TAG_SERVER 0x0500 + EC_TAG_SERVER_NAME 0x0501 + EC_TAG_SERVER_DESC 0x0502 + EC_TAG_SERVER_ADDRESS 0x0503 + EC_TAG_SERVER_PING 0x0504 + EC_TAG_SERVER_USERS 0x0505 + EC_TAG_SERVER_USERS_MAX 0x0506 + EC_TAG_SERVER_FILES 0x0507 + EC_TAG_SERVER_PRIO 0x0508 + EC_TAG_SERVER_FAILED 0x0509 + EC_TAG_SERVER_STATIC 0x050A + EC_TAG_SERVER_VERSION 0x050B + +EC_TAG_CLIENT 0x0600 + EC_TAG_CLIENT_SOFTWARE 0x0601 + EC_TAG_CLIENT_SCORE 0x0602 + EC_TAG_CLIENT_HASH 0x0603 + EC_TAG_CLIENT_FRIEND 0x0604 + EC_TAG_CLIENT_WAIT_TIME 0x0605 + EC_TAG_CLIENT_XFER_TIME 0x0606 + EC_TAG_CLIENT_QUEUE_TIME 0x0607 + EC_TAG_CLIENT_LAST_TIME 0x0608 + EC_TAG_CLIENT_UPLOAD_SESSION 0x0609 + EC_TAG_CLIENT_UPLOAD_TOTAL 0x060A + EC_TAG_CLIENT_DOWNLOAD_TOTAL 0x060B + EC_TAG_CLIENT_STATE 0x060C + EC_TAG_CLIENT_UP_SPEED 0x060D + EC_TAG_CLIENT_DOWN_SPEED 0x060E + EC_TAG_CLIENT_FROM 0x060F + EC_TAG_CLIENT_USER_IP 0x0610 + EC_TAG_CLIENT_USER_PORT 0x0611 + EC_TAG_CLIENT_SERVER_IP 0x0612 + EC_TAG_CLIENT_SERVER_PORT 0x0613 + EC_TAG_CLIENT_SERVER_NAME 0x0614 + EC_TAG_CLIENT_SOFT_VER_STR 0x0615 + EC_TAG_CLIENT_WAITING_POSITION 0x0616 + +EC_TAG_SEARCHFILE 0x0700 + EC_TAG_SEARCH_TYPE 0x0701 + EC_TAG_SEARCH_NAME 0x0702 + EC_TAG_SEARCH_MIN_SIZE 0x0703 + EC_TAG_SEARCH_MAX_SIZE 0x0704 + EC_TAG_SEARCH_FILE_TYPE 0x0705 + EC_TAG_SEARCH_EXTENSION 0x0706 + EC_TAG_SEARCH_AVAILABILITY 0x0707 + EC_TAG_SEARCH_STATUS 0x0708 + +EC_TAG_SELECT_PREFS 0x1000 + + EC_TAG_PREFS_CATEGORIES 0x1100 + EC_TAG_CATEGORY 0x1101 + EC_TAG_CATEGORY_TITLE 0x1102 + EC_TAG_CATEGORY_PATH 0x1103 + EC_TAG_CATEGORY_COMMENT 0x1104 + EC_TAG_CATEGORY_COLOR 0x1105 + EC_TAG_CATEGORY_PRIO 0x1106 + + EC_TAG_PREFS_GENERAL 0x1200 + EC_TAG_USER_NICK 0x1201 + EC_TAG_USER_HASH 0x1202 + EC_TAG_USER_HOST 0x1203 + + EC_TAG_PREFS_CONNECTIONS 0x1300 + EC_TAG_CONN_DL_CAP 0x1301 + EC_TAG_CONN_UL_CAP 0x1302 + EC_TAG_CONN_MAX_DL 0x1303 + EC_TAG_CONN_MAX_UL 0x1304 + EC_TAG_CONN_SLOT_ALLOCATION 0x1305 + EC_TAG_CONN_TCP_PORT 0x1306 + EC_TAG_CONN_UDP_PORT 0x1307 + EC_TAG_CONN_UDP_DISABLE 0x1308 + EC_TAG_CONN_MAX_FILE_SOURCES 0x1309 + EC_TAG_CONN_MAX_CONN 0x130A + EC_TAG_CONN_AUTOCONNECT 0x130B + EC_TAG_CONN_RECONNECT 0x130C + EC_TAG_NETWORK_ED2K 0x130D + EC_TAG_NETWORK_KADEMLIA 0x130E + + EC_TAG_PREFS_MESSAGEFILTER 0x1400 + EC_TAG_MSGFILTER_ENABLED 0x1401 + EC_TAG_MSGFILTER_ALL 0x1402 + EC_TAG_MSGFILTER_FRIENDS 0x1403 + EC_TAG_MSGFILTER_SECURE 0x1404 + EC_TAG_MSGFILTER_BY_KEYWORD 0x1405 + EC_TAG_MSGFILTER_KEYWORDS 0x1406 + + EC_TAG_PREFS_REMOTECTRL 0x1500 + EC_TAG_WEBSERVER_AUTORUN 0x1501 + EC_TAG_WEBSERVER_PORT 0x1502 + EC_TAG_WEBSERVER_GUEST 0x1503 + EC_TAG_WEBSERVER_USEGZIP 0x1504 + EC_TAG_WEBSERVER_REFRESH 0x1505 + EC_TAG_WEBSERVER_TEMPLATE 0x1506 + + EC_TAG_PREFS_ONLINESIG 0x1600 + EC_TAG_ONLINESIG_ENABLED 0x1601 + + EC_TAG_PREFS_SERVERS 0x1700 + EC_TAG_SERVERS_REMOVE_DEAD 0x1701 + EC_TAG_SERVERS_DEAD_SERVER_RETRIES 0x1702 + EC_TAG_SERVERS_AUTO_UPDATE 0x1703 + EC_TAG_SERVERS_URL_LIST 0x1704 + EC_TAG_SERVERS_ADD_FROM_SERVER 0x1705 + EC_TAG_SERVERS_ADD_FROM_CLIENT 0x1706 + EC_TAG_SERVERS_USE_SCORE_SYSTEM 0x1707 + EC_TAG_SERVERS_SMART_ID_CHECK 0x1708 + EC_TAG_SERVERS_SAFE_SERVER_CONNECT 0x1709 + EC_TAG_SERVERS_AUTOCONN_STATIC_ONLY 0x170A + EC_TAG_SERVERS_MANUAL_HIGH_PRIO 0x170B + EC_TAG_SERVERS_UPDATE_URL 0x170C + + EC_TAG_PREFS_FILES 0x1800 + EC_TAG_FILES_ICH_ENABLED 0x1801 + EC_TAG_FILES_AICH_TRUST 0x1802 + EC_TAG_FILES_NEW_PAUSED 0x1803 + EC_TAG_FILES_NEW_AUTO_DL_PRIO 0x1804 + EC_TAG_FILES_PREVIEW_PRIO 0x1805 + EC_TAG_FILES_NEW_AUTO_UL_PRIO 0x1806 + EC_TAG_FILES_UL_FULL_CHUNKS 0x1807 + EC_TAG_FILES_START_NEXT_PAUSED 0x1808 + EC_TAG_FILES_RESUME_SAME_CAT 0x1809 + EC_TAG_FILES_SAVE_SOURCES 0x180A + EC_TAG_FILES_EXTRACT_METADATA 0x180B + EC_TAG_FILES_ALLOC_FULL_CHUNKS 0x180C + EC_TAG_FILES_ALLOC_FULL_SIZE 0x180D + EC_TAG_FILES_CHECK_FREE_SPACE 0x180E + EC_TAG_FILES_MIN_FREE_SPACE 0x180F + + EC_TAG_PREFS_SRCDROP 0x1900 + EC_TAG_SRCDROP_NONEEDED 0x1901 + EC_TAG_SRCDROP_DROP_FQS 0x1902 + EC_TAG_SRCDROP_DROP_HQRS 0x1903 + EC_TAG_SRCDROP_HQRS_VALUE 0x1904 + EC_TAG_SRCDROP_AUTODROP_TIMER 0x1905 + + EC_TAG_PREFS_DIRECTORIES 0x1A00 + + EC_TAG_PREFS_STATISTICS 0x1B00 + EC_TAG_STATSGRAPH_WIDTH 0x1B01 + EC_TAG_STATSGRAPH_SCALE 0x1B02 + EC_TAG_STATSGRAPH_LAST 0x1B03 + EC_TAG_STATSGRAPH_DATA 0x1B04 + EC_TAG_STATTREE_CAPPING 0x1B05 + EC_TAG_STATTREE_NODE 0x1B06 + EC_TAG_STAT_NODE_VALUE 0x1B07 + EC_TAG_STAT_VALUE_TYPE 0x1B08 + EC_TAG_STATTREE_NODEID 0x1B09 + + EC_TAG_PREFS_SECURITY 0x1C00 + EC_TAG_SECURITY_CAN_SEE_SHARES 0x1C01 + EC_TAG_IPFILTER_CLIENTS 0x1C02 + EC_TAG_IPFILTER_SERVERS 0x1C03 + EC_TAG_IPFILTER_AUTO_UPDATE 0x1C04 + EC_TAG_IPFILTER_UPDATE_URL 0x1C05 + EC_TAG_IPFILTER_LEVEL 0x1C06 + EC_TAG_IPFILTER_FILTER_LAN 0x1C07 + EC_TAG_SECURITY_USE_SECIDENT 0x1C08 + EC_TAG_SECURITY_OBFUSCATION_SUPPORTED 0x1C09 + EC_TAG_SECURITY_OBFUSCATION_REQUESTED 0x1C0A + EC_TAG_SECURITY_OBFUSCATION_REQUIRED 0x1C0B + + EC_TAG_PREFS_CORETWEAKS 0x1D00 + EC_TAG_CORETW_MAX_CONN_PER_FIVE 0x1D01 + EC_TAG_CORETW_VERBOSE 0x1D02 + EC_TAG_CORETW_FILEBUFFER 0x1D03 + EC_TAG_CORETW_UL_QUEUE 0x1D04 + EC_TAG_CORETW_SRV_KEEPALIVE_TIMEOUT 0x1D05 + + EC_TAG_PREFS_KADEMLIA 0x1E00 + EC_TAG_KADEMLIA_UPDATE_URL 0x1E01 +[/Section] + +[Section Content] +Type Enum +Name EC_DETAIL_LEVEL +DataType uint8 +EC_DETAIL_CMD 0x00 +EC_DETAIL_WEB 0x01 +EC_DETAIL_FULL 0x02 +EC_DETAIL_UPDATE 0x03 +EC_DETAIL_INC_UPDATE 0x04 +[/Section] + +[Section Content] +Type Enum +Name EC_SEARCH_TYPE +DataType uint8 +EC_SEARCH_LOCAL 0x00 +EC_SEARCH_GLOBAL 0x01 +EC_SEARCH_KAD 0x02 +EC_SEARCH_WEB 0x03 +[/Section] + +[Section Content] +Type Enum +Name EC_STATTREE_NODE_VALUE_TYPE +DataType uint8 +EC_VALUE_INTEGER 0x00 +EC_VALUE_ISTRING 0x01 +EC_VALUE_BYTES 0x02 +EC_VALUE_ISHORT 0x03 +EC_VALUE_TIME 0x04 +EC_VALUE_SPEED 0x05 +EC_VALUE_STRING 0x06 +EC_VALUE_DOUBLE 0x07 +[/Section] + +[Section Content] +Type Enum +Name EcPrefs +DataType uint32 +EC_PREFS_CATEGORIES 0x00000001 +EC_PREFS_GENERAL 0x00000002 +EC_PREFS_CONNECTIONS 0x00000004 +EC_PREFS_MESSAGEFILTER 0x00000008 +EC_PREFS_REMOTECONTROLS 0x00000010 +EC_PREFS_ONLINESIG 0x00000020 +EC_PREFS_SERVERS 0x00000040 +EC_PREFS_FILES 0x00000080 +EC_PREFS_SRCDROP 0x00000100 +EC_PREFS_DIRECTORIES 0x00000200 +EC_PREFS_STATISTICS 0x00000400 +EC_PREFS_SECURITY 0x00000800 +EC_PREFS_CORETWEAKS 0x00001000 +EC_PREFS_KADEMLIA 0x00002000 +[/Section] diff --git a/src/libs/ec/abstracts/ECTagTypes.abstract b/src/libs/ec/abstracts/ECTagTypes.abstract new file mode 100644 index 00000000..3f70bd54 --- /dev/null +++ b/src/libs/ec/abstracts/ECTagTypes.abstract @@ -0,0 +1,20 @@ +[Section Definition] +FileName ECTagTypes +FileContent EC tag types for use on the ec library. +[/Section] + +[Section Content] +Type Enum +Name ECTagTypes +DataType uint8 +EC_TAGTYPE_UNKNOWN 0 +EC_TAGTYPE_CUSTOM 1 +EC_TAGTYPE_UINT8 2 +EC_TAGTYPE_UINT16 3 +EC_TAGTYPE_UINT32 4 +EC_TAGTYPE_UINT64 5 +EC_TAGTYPE_STRING 6 +EC_TAGTYPE_DOUBLE 7 +EC_TAGTYPE_IPV4 8 +EC_TAGTYPE_HASH16 9 +[/Section] diff --git a/src/libs/ec/abstracts/License.abstract b/src/libs/ec/abstracts/License.abstract new file mode 100644 index 00000000..55714a1f --- /dev/null +++ b/src/libs/ec/abstracts/License.abstract @@ -0,0 +1,23 @@ + + This file is part of the aMule Project. + + Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) + + Any parts of this program derived from the xMule, lMule or eMule project, + or contributed by third-party developers are copyrighted by their + respective authors. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + diff --git a/src/libs/ec/c#/ECCodes.cs b/src/libs/ec/c#/ECCodes.cs new file mode 100644 index 00000000..e219c9cb --- /dev/null +++ b/src/libs/ec/c#/ECCodes.cs @@ -0,0 +1,371 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + +// Purpose: +// EC codes and type definition. + +namespace amule.net +{ +public enum ProtocolVersion { + EC_CURRENT_PROTOCOL_VERSION = 0x0200 +}; +public enum ECFlags { + EC_FLAG_ZLIB = 0x00000001, + EC_FLAG_UTF8_NUMBERS = 0x00000002, + EC_FLAG_HAS_ID = 0x00000004, + EC_FLAG_ACCEPTS = 0x00000010, + +}; +public enum ECOpCodes { + EC_OP_NOOP = 0x01, + EC_OP_AUTH_REQ = 0x02, + EC_OP_AUTH_FAIL = 0x03, + EC_OP_AUTH_OK = 0x04, + EC_OP_FAILED = 0x05, + EC_OP_STRINGS = 0x06, + EC_OP_MISC_DATA = 0x07, + EC_OP_SHUTDOWN = 0x08, + EC_OP_ADD_LINK = 0x09, + EC_OP_STAT_REQ = 0x0A, + EC_OP_GET_CONNSTATE = 0x0B, + EC_OP_STATS = 0x0C, + EC_OP_GET_DLOAD_QUEUE = 0x0D, + EC_OP_GET_ULOAD_QUEUE = 0x0E, + EC_OP_GET_WAIT_QUEUE = 0x0F, + EC_OP_GET_SHARED_FILES = 0x10, + EC_OP_SHARED_SET_PRIO = 0x11, + EC_OP_PARTFILE_REMOVE_NO_NEEDED = 0x12, + EC_OP_PARTFILE_REMOVE_FULL_QUEUE = 0x13, + EC_OP_PARTFILE_REMOVE_HIGH_QUEUE = 0x14, + EC_OP_PARTFILE_CLEANUP_SOURCES = 0x15, + EC_OP_PARTFILE_SWAP_A4AF_THIS = 0x16, + EC_OP_PARTFILE_SWAP_A4AF_THIS_AUTO = 0x17, + EC_OP_PARTFILE_SWAP_A4AF_OTHERS = 0x18, + EC_OP_PARTFILE_PAUSE = 0x19, + EC_OP_PARTFILE_RESUME = 0x1A, + EC_OP_PARTFILE_STOP = 0x1B, + EC_OP_PARTFILE_PRIO_SET = 0x1C, + EC_OP_PARTFILE_DELETE = 0x1D, + EC_OP_PARTFILE_SET_CAT = 0x1E, + EC_OP_DLOAD_QUEUE = 0x1F, + EC_OP_ULOAD_QUEUE = 0x20, + EC_OP_WAIT_QUEUE = 0x21, + EC_OP_SHARED_FILES = 0x22, + EC_OP_SHAREDFILES_RELOAD = 0x23, + EC_OP_SHAREDFILES_ADD_DIRECTORY = 0x24, + EC_OP_RENAME_FILE = 0x25, + EC_OP_SEARCH_START = 0x26, + EC_OP_SEARCH_STOP = 0x27, + EC_OP_SEARCH_RESULTS = 0x28, + EC_OP_SEARCH_PROGRESS = 0x29, + EC_OP_DOWNLOAD_SEARCH_RESULT = 0x2A, + EC_OP_IPFILTER_RELOAD = 0x2B, + EC_OP_GET_SERVER_LIST = 0x2C, + EC_OP_SERVER_LIST = 0x2D, + EC_OP_SERVER_DISCONNECT = 0x2E, + EC_OP_SERVER_CONNECT = 0x2F, + EC_OP_SERVER_REMOVE = 0x30, + EC_OP_SERVER_ADD = 0x31, + EC_OP_SERVER_UPDATE_FROM_URL = 0x32, + EC_OP_ADDLOGLINE = 0x33, + EC_OP_ADDDEBUGLOGLINE = 0x34, + EC_OP_GET_LOG = 0x35, + EC_OP_GET_DEBUGLOG = 0x36, + EC_OP_GET_SERVERINFO = 0x37, + EC_OP_LOG = 0x38, + EC_OP_DEBUGLOG = 0x39, + EC_OP_SERVERINFO = 0x3A, + EC_OP_RESET_LOG = 0x3B, + EC_OP_RESET_DEBUGLOG = 0x3C, + EC_OP_CLEAR_SERVERINFO = 0x3D, + EC_OP_GET_LAST_LOG_ENTRY = 0x3E, + EC_OP_GET_PREFERENCES = 0x3F, + EC_OP_SET_PREFERENCES = 0x40, + EC_OP_CREATE_CATEGORY = 0x41, + EC_OP_UPDATE_CATEGORY = 0x42, + EC_OP_DELETE_CATEGORY = 0x43, + EC_OP_GET_STATSGRAPHS = 0x44, + EC_OP_STATSGRAPHS = 0x45, + EC_OP_GET_STATSTREE = 0x46, + EC_OP_STATSTREE = 0x47, + EC_OP_KAD_START = 0x48, + EC_OP_KAD_STOP = 0x49, + EC_OP_CONNECT = 0x4A, + EC_OP_DISCONNECT = 0x4B, + EC_OP_GET_DLOAD_QUEUE_DETAIL = 0x4C, + EC_OP_KAD_UPDATE_FROM_URL = 0x4D, + EC_OP_KAD_BOOTSTRAP_FROM_IP = 0x4E +}; +public enum ECTagNames { + EC_TAG_STRING = 0x0000, + EC_TAG_PASSWD_HASH = 0x0001, + EC_TAG_PROTOCOL_VERSION = 0x0002, + EC_TAG_VERSION_ID = 0x0003, + EC_TAG_DETAIL_LEVEL = 0x0004, + EC_TAG_CONNSTATE = 0x0005, + EC_TAG_ED2K_ID = 0x0006, + EC_TAG_LOG_TO_STATUS = 0x0007, + EC_TAG_BOOTSTRAP_IP = 0x0008, + EC_TAG_BOOTSTRAP_PORT = 0x0008, + EC_TAG_CLIENT_ID = 0x0009, + EC_TAG_CLIENT_NAME = 0x0100, + EC_TAG_CLIENT_VERSION = 0x0101, + EC_TAG_CLIENT_MOD = 0x0102, + EC_TAG_STATS_UL_SPEED = 0x0200, + EC_TAG_STATS_DL_SPEED = 0x0201, + EC_TAG_STATS_UL_SPEED_LIMIT = 0x0202, + EC_TAG_STATS_DL_SPEED_LIMIT = 0x0203, + EC_TAG_STATS_UP_OVERHEAD = 0x0204, + EC_TAG_STATS_DOWN_OVERHEAD = 0x0205, + EC_TAG_STATS_TOTAL_SRC_COUNT = 0x0206, + EC_TAG_STATS_BANNED_COUNT = 0x0207, + EC_TAG_STATS_UL_QUEUE_LEN = 0x0208, + EC_TAG_STATS_ED2K_USERS = 0x0209, + EC_TAG_STATS_KAD_USERS = 0x020A, + EC_TAG_STATS_ED2K_FILES = 0x020B, + EC_TAG_STATS_KAD_FILES = 0x020C, + EC_TAG_PARTFILE = 0x0300, + EC_TAG_PARTFILE_NAME = 0x0301, + EC_TAG_PARTFILE_PARTMETID = 0x0302, + EC_TAG_PARTFILE_SIZE_FULL = 0x0303, + EC_TAG_PARTFILE_SIZE_XFER = 0x0304, + EC_TAG_PARTFILE_SIZE_XFER_UP = 0x0305, + EC_TAG_PARTFILE_SIZE_DONE = 0x0306, + EC_TAG_PARTFILE_SPEED = 0x0307, + EC_TAG_PARTFILE_STATUS = 0x0308, + EC_TAG_PARTFILE_PRIO = 0x0309, + EC_TAG_PARTFILE_SOURCE_COUNT = 0x030A, + EC_TAG_PARTFILE_SOURCE_COUNT_A4AF = 0x030B, + EC_TAG_PARTFILE_SOURCE_COUNT_NOT_CURRENT = 0x030C, + EC_TAG_PARTFILE_SOURCE_COUNT_XFER = 0x030D, + EC_TAG_PARTFILE_ED2K_LINK = 0x030E, + EC_TAG_PARTFILE_CAT = 0x030F, + EC_TAG_PARTFILE_LAST_RECV = 0x0310, + EC_TAG_PARTFILE_LAST_SEEN_COMP = 0x0311, + EC_TAG_PARTFILE_PART_STATUS = 0x0312, + EC_TAG_PARTFILE_GAP_STATUS = 0x0313, + EC_TAG_PARTFILE_REQ_STATUS = 0x0314, + EC_TAG_PARTFILE_SOURCE_NAMES = 0x0315, + EC_TAG_PARTFILE_COMMENTS = 0x0316, + EC_TAG_KNOWNFILE = 0x0400, + EC_TAG_KNOWNFILE_XFERRED = 0x0401, + EC_TAG_KNOWNFILE_XFERRED_ALL = 0x0402, + EC_TAG_KNOWNFILE_REQ_COUNT = 0x0403, + EC_TAG_KNOWNFILE_REQ_COUNT_ALL = 0x0404, + EC_TAG_KNOWNFILE_ACCEPT_COUNT = 0x0405, + EC_TAG_KNOWNFILE_ACCEPT_COUNT_ALL = 0x0406, + EC_TAG_KNOWNFILE_AICH_MASTERHASH = 0x0407, + EC_TAG_SERVER = 0x0500, + EC_TAG_SERVER_NAME = 0x0501, + EC_TAG_SERVER_DESC = 0x0502, + EC_TAG_SERVER_ADDRESS = 0x0503, + EC_TAG_SERVER_PING = 0x0504, + EC_TAG_SERVER_USERS = 0x0505, + EC_TAG_SERVER_USERS_MAX = 0x0506, + EC_TAG_SERVER_FILES = 0x0507, + EC_TAG_SERVER_PRIO = 0x0508, + EC_TAG_SERVER_FAILED = 0x0509, + EC_TAG_SERVER_STATIC = 0x050A, + EC_TAG_SERVER_VERSION = 0x050B, + EC_TAG_CLIENT = 0x0600, + EC_TAG_CLIENT_SOFTWARE = 0x0601, + EC_TAG_CLIENT_SCORE = 0x0602, + EC_TAG_CLIENT_HASH = 0x0603, + EC_TAG_CLIENT_FRIEND = 0x0604, + EC_TAG_CLIENT_WAIT_TIME = 0x0605, + EC_TAG_CLIENT_XFER_TIME = 0x0606, + EC_TAG_CLIENT_QUEUE_TIME = 0x0607, + EC_TAG_CLIENT_LAST_TIME = 0x0608, + EC_TAG_CLIENT_UPLOAD_SESSION = 0x0609, + EC_TAG_CLIENT_UPLOAD_TOTAL = 0x060A, + EC_TAG_CLIENT_DOWNLOAD_TOTAL = 0x060B, + EC_TAG_CLIENT_STATE = 0x060C, + EC_TAG_CLIENT_UP_SPEED = 0x060D, + EC_TAG_CLIENT_DOWN_SPEED = 0x060E, + EC_TAG_CLIENT_FROM = 0x060F, + EC_TAG_CLIENT_USER_IP = 0x0610, + EC_TAG_CLIENT_USER_PORT = 0x0611, + EC_TAG_CLIENT_SERVER_IP = 0x0612, + EC_TAG_CLIENT_SERVER_PORT = 0x0613, + EC_TAG_CLIENT_SERVER_NAME = 0x0614, + EC_TAG_CLIENT_SOFT_VER_STR = 0x0615, + EC_TAG_CLIENT_WAITING_POSITION = 0x0616, + EC_TAG_SEARCHFILE = 0x0700, + EC_TAG_SEARCH_TYPE = 0x0701, + EC_TAG_SEARCH_NAME = 0x0702, + EC_TAG_SEARCH_MIN_SIZE = 0x0703, + EC_TAG_SEARCH_MAX_SIZE = 0x0704, + EC_TAG_SEARCH_FILE_TYPE = 0x0705, + EC_TAG_SEARCH_EXTENSION = 0x0706, + EC_TAG_SEARCH_AVAILABILITY = 0x0707, + EC_TAG_SEARCH_STATUS = 0x0708, + EC_TAG_SELECT_PREFS = 0x1000, + EC_TAG_PREFS_CATEGORIES = 0x1100, + EC_TAG_CATEGORY = 0x1101, + EC_TAG_CATEGORY_TITLE = 0x1102, + EC_TAG_CATEGORY_PATH = 0x1103, + EC_TAG_CATEGORY_COMMENT = 0x1104, + EC_TAG_CATEGORY_COLOR = 0x1105, + EC_TAG_CATEGORY_PRIO = 0x1106, + EC_TAG_PREFS_GENERAL = 0x1200, + EC_TAG_USER_NICK = 0x1201, + EC_TAG_USER_HASH = 0x1202, + EC_TAG_USER_HOST = 0x1203, + EC_TAG_PREFS_CONNECTIONS = 0x1300, + EC_TAG_CONN_DL_CAP = 0x1301, + EC_TAG_CONN_UL_CAP = 0x1302, + EC_TAG_CONN_MAX_DL = 0x1303, + EC_TAG_CONN_MAX_UL = 0x1304, + EC_TAG_CONN_SLOT_ALLOCATION = 0x1305, + EC_TAG_CONN_TCP_PORT = 0x1306, + EC_TAG_CONN_UDP_PORT = 0x1307, + EC_TAG_CONN_UDP_DISABLE = 0x1308, + EC_TAG_CONN_MAX_FILE_SOURCES = 0x1309, + EC_TAG_CONN_MAX_CONN = 0x130A, + EC_TAG_CONN_AUTOCONNECT = 0x130B, + EC_TAG_CONN_RECONNECT = 0x130C, + EC_TAG_NETWORK_ED2K = 0x130D, + EC_TAG_NETWORK_KADEMLIA = 0x130E, + EC_TAG_PREFS_MESSAGEFILTER = 0x1400, + EC_TAG_MSGFILTER_ENABLED = 0x1401, + EC_TAG_MSGFILTER_ALL = 0x1402, + EC_TAG_MSGFILTER_FRIENDS = 0x1403, + EC_TAG_MSGFILTER_SECURE = 0x1404, + EC_TAG_MSGFILTER_BY_KEYWORD = 0x1405, + EC_TAG_MSGFILTER_KEYWORDS = 0x1406, + EC_TAG_PREFS_REMOTECTRL = 0x1500, + EC_TAG_WEBSERVER_AUTORUN = 0x1501, + EC_TAG_WEBSERVER_PORT = 0x1502, + EC_TAG_WEBSERVER_GUEST = 0x1503, + EC_TAG_WEBSERVER_USEGZIP = 0x1504, + EC_TAG_WEBSERVER_REFRESH = 0x1505, + EC_TAG_WEBSERVER_TEMPLATE = 0x1506, + EC_TAG_PREFS_ONLINESIG = 0x1600, + EC_TAG_ONLINESIG_ENABLED = 0x1601, + EC_TAG_PREFS_SERVERS = 0x1700, + EC_TAG_SERVERS_REMOVE_DEAD = 0x1701, + EC_TAG_SERVERS_DEAD_SERVER_RETRIES = 0x1702, + EC_TAG_SERVERS_AUTO_UPDATE = 0x1703, + EC_TAG_SERVERS_URL_LIST = 0x1704, + EC_TAG_SERVERS_ADD_FROM_SERVER = 0x1705, + EC_TAG_SERVERS_ADD_FROM_CLIENT = 0x1706, + EC_TAG_SERVERS_USE_SCORE_SYSTEM = 0x1707, + EC_TAG_SERVERS_SMART_ID_CHECK = 0x1708, + EC_TAG_SERVERS_SAFE_SERVER_CONNECT = 0x1709, + EC_TAG_SERVERS_AUTOCONN_STATIC_ONLY = 0x170A, + EC_TAG_SERVERS_MANUAL_HIGH_PRIO = 0x170B, + EC_TAG_SERVERS_UPDATE_URL = 0x170C, + EC_TAG_PREFS_FILES = 0x1800, + EC_TAG_FILES_ICH_ENABLED = 0x1801, + EC_TAG_FILES_AICH_TRUST = 0x1802, + EC_TAG_FILES_NEW_PAUSED = 0x1803, + EC_TAG_FILES_NEW_AUTO_DL_PRIO = 0x1804, + EC_TAG_FILES_PREVIEW_PRIO = 0x1805, + EC_TAG_FILES_NEW_AUTO_UL_PRIO = 0x1806, + EC_TAG_FILES_UL_FULL_CHUNKS = 0x1807, + EC_TAG_FILES_START_NEXT_PAUSED = 0x1808, + EC_TAG_FILES_RESUME_SAME_CAT = 0x1809, + EC_TAG_FILES_SAVE_SOURCES = 0x180A, + EC_TAG_FILES_EXTRACT_METADATA = 0x180B, + EC_TAG_FILES_ALLOC_FULL_CHUNKS = 0x180C, + EC_TAG_FILES_ALLOC_FULL_SIZE = 0x180D, + EC_TAG_FILES_CHECK_FREE_SPACE = 0x180E, + EC_TAG_FILES_MIN_FREE_SPACE = 0x180F, + EC_TAG_PREFS_SRCDROP = 0x1900, + EC_TAG_SRCDROP_NONEEDED = 0x1901, + EC_TAG_SRCDROP_DROP_FQS = 0x1902, + EC_TAG_SRCDROP_DROP_HQRS = 0x1903, + EC_TAG_SRCDROP_HQRS_VALUE = 0x1904, + EC_TAG_SRCDROP_AUTODROP_TIMER = 0x1905, + EC_TAG_PREFS_DIRECTORIES = 0x1A00, + EC_TAG_PREFS_STATISTICS = 0x1B00, + EC_TAG_STATSGRAPH_WIDTH = 0x1B01, + EC_TAG_STATSGRAPH_SCALE = 0x1B02, + EC_TAG_STATSGRAPH_LAST = 0x1B03, + EC_TAG_STATSGRAPH_DATA = 0x1B04, + EC_TAG_STATTREE_CAPPING = 0x1B05, + EC_TAG_STATTREE_NODE = 0x1B06, + EC_TAG_STAT_NODE_VALUE = 0x1B07, + EC_TAG_STAT_VALUE_TYPE = 0x1B08, + EC_TAG_STATTREE_NODEID = 0x1B09, + EC_TAG_PREFS_SECURITY = 0x1C00, + EC_TAG_SECURITY_CAN_SEE_SHARES = 0x1C01, + EC_TAG_IPFILTER_CLIENTS = 0x1C02, + EC_TAG_IPFILTER_SERVERS = 0x1C03, + EC_TAG_IPFILTER_AUTO_UPDATE = 0x1C04, + EC_TAG_IPFILTER_UPDATE_URL = 0x1C05, + EC_TAG_IPFILTER_LEVEL = 0x1C06, + EC_TAG_IPFILTER_FILTER_LAN = 0x1C07, + EC_TAG_SECURITY_USE_SECIDENT = 0x1C08, + EC_TAG_SECURITY_OBFUSCATION_SUPPORTED = 0x1C09, + EC_TAG_SECURITY_OBFUSCATION_REQUESTED = 0x1C0A, + EC_TAG_SECURITY_OBFUSCATION_REQUIRED = 0x1C0B, + EC_TAG_PREFS_CORETWEAKS = 0x1D00, + EC_TAG_CORETW_MAX_CONN_PER_FIVE = 0x1D01, + EC_TAG_CORETW_VERBOSE = 0x1D02, + EC_TAG_CORETW_FILEBUFFER = 0x1D03, + EC_TAG_CORETW_UL_QUEUE = 0x1D04, + EC_TAG_CORETW_SRV_KEEPALIVE_TIMEOUT = 0x1D05, + EC_TAG_PREFS_KADEMLIA = 0x1E00, + EC_TAG_KADEMLIA_UPDATE_URL = 0x1E01 +}; +public enum EC_DETAIL_LEVEL { + EC_DETAIL_CMD = 0x00, + EC_DETAIL_WEB = 0x01, + EC_DETAIL_FULL = 0x02, + EC_DETAIL_UPDATE = 0x03, + EC_DETAIL_INC_UPDATE = 0x04 +}; +public enum EC_SEARCH_TYPE { + EC_SEARCH_LOCAL = 0x00, + EC_SEARCH_GLOBAL = 0x01, + EC_SEARCH_KAD = 0x02, + EC_SEARCH_WEB = 0x03 +}; +public enum EC_STATTREE_NODE_VALUE_TYPE { + EC_VALUE_INTEGER = 0x00, + EC_VALUE_ISTRING = 0x01, + EC_VALUE_BYTES = 0x02, + EC_VALUE_ISHORT = 0x03, + EC_VALUE_TIME = 0x04, + EC_VALUE_SPEED = 0x05, + EC_VALUE_STRING = 0x06, + EC_VALUE_DOUBLE = 0x07 +}; +public enum EcPrefs { + EC_PREFS_CATEGORIES = 0x00000001, + EC_PREFS_GENERAL = 0x00000002, + EC_PREFS_CONNECTIONS = 0x00000004, + EC_PREFS_MESSAGEFILTER = 0x00000008, + EC_PREFS_REMOTECONTROLS = 0x00000010, + EC_PREFS_ONLINESIG = 0x00000020, + EC_PREFS_SERVERS = 0x00000040, + EC_PREFS_FILES = 0x00000080, + EC_PREFS_SRCDROP = 0x00000100, + EC_PREFS_DIRECTORIES = 0x00000200, + EC_PREFS_STATISTICS = 0x00000400, + EC_PREFS_SECURITY = 0x00000800, + EC_PREFS_CORETWEAKS = 0x00001000, + EC_PREFS_KADEMLIA = 0x00002000 +}; +} diff --git a/src/libs/ec/c#/ECTagTypes.cs b/src/libs/ec/c#/ECTagTypes.cs new file mode 100644 index 00000000..6c451c2f --- /dev/null +++ b/src/libs/ec/c#/ECTagTypes.cs @@ -0,0 +1,41 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + +// Purpose: +// EC tag types for use on the ec library. + +namespace amule.net +{ +public enum ECTagTypes { + EC_TAGTYPE_UNKNOWN = 0, + EC_TAGTYPE_CUSTOM = 1, + EC_TAGTYPE_UINT8 = 2, + EC_TAGTYPE_UINT16 = 3, + EC_TAGTYPE_UINT32 = 4, + EC_TAGTYPE_UINT64 = 5, + EC_TAGTYPE_STRING = 6, + EC_TAGTYPE_DOUBLE = 7, + EC_TAGTYPE_IPV4 = 8, + EC_TAGTYPE_HASH16 = 9 +}; +} diff --git a/src/libs/ec/c#/amuleRemote.cs b/src/libs/ec/c#/amuleRemote.cs new file mode 100644 index 00000000..ce656806 --- /dev/null +++ b/src/libs/ec/c#/amuleRemote.cs @@ -0,0 +1,304 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003-2008 lfroen ( lfroen@gmail.com / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// +using System; +using System.IO; +using System.Security; +using System.Security.Permissions; +using System.Threading; +using System.Collections.Generic; +using System.Text; +using System.Net; +using System.Net.Sockets; + +namespace amule.net +{ + + // Define the state object for the callback. + // Use hostName to correlate calls with the proper result. + public class ResolveState { + IPHostEntry resolvedIPs; + + public string errorMsg; + + public IPHostEntry IPs + { + get { return resolvedIPs; } + set { resolvedIPs = value; } + } + } + + public class ConnectState { + public Socket sock; + public string errorMsg; + + public ConnectState(Socket s) + { + sock = s; + } + } + + public abstract class amuleECHandler { + public amuleECHandler() + { + } + + public abstract void HandlePacket(ecProto.ecPacket packet); + } + + class amuleLogicHandler : amuleECHandler { + amuleRemote m_owner; + bool m_auth_result = false; + + public amuleLogicHandler(amuleRemote o) + { + m_owner = o; + } + + public override void HandlePacket(ecProto.ecPacket packet) + { + if ( packet.Opcode() == ECOpCodes.EC_OP_AUTH_OK ) { + Console.WriteLine("amuleLogicHandler : Authenticated OK"); + m_auth_result = true; + } else { + Console.WriteLine("amuleLogicHandler : Authentication failed. Core reply was {0}", packet.Opcode()); + } + } + + public bool AuthResult() + { + return m_auth_result; + } + } + + class amuleRemote { + amuleECHandler m_handler = null; + + static ManualResetEvent m_socket_op_Done = new ManualResetEvent(false); + + // Record the IPs in the state object for later use. + static void GetHostEntryCallback(IAsyncResult ar) + { + ResolveState ioContext = (ResolveState)ar.AsyncState; + try { + ioContext.IPs = Dns.EndGetHostEntry(ar); + } catch (SocketException e) { + ioContext.errorMsg = e.Message; + } + m_socket_op_Done.Set(); + } + + Socket m_s; + + static void ConnectCallback(IAsyncResult ar) + { + // Retrieve the socket from the state object. + ConnectState state = (ConnectState)ar.AsyncState; + try { + // Complete the connection. + state.sock.EndConnect(ar); + + Console.WriteLine("Socket connected to {0}", + state.sock.RemoteEndPoint.ToString()); + + // Signal that the connection has been made. + m_socket_op_Done.Set(); + } catch (Exception e) { + state.errorMsg = e.Message; + } + } + + byte[] m_rx_buffer = new byte[32 * 1024]; + MemoryStream m_rx_mem_stream = null; + int m_rx_byte_count = 0; + int m_rx_remaining_count = 0; + + byte[] m_tx_buffer = new byte[32 * 1024]; + MemoryStream m_tx_mem_stream = null; + + //LinkedList m_tx_queue; + BinaryReader m_sock_reader = null; + BinaryWriter m_sock_writer = null; + + static void RxCallback(IAsyncResult ar) + { + amuleRemote o = (amuleRemote)ar.AsyncState; + Console.WriteLine("RxCallback signalled, calling EndReceive"); + int bytesRead = o.m_s.EndReceive(ar); + if ( bytesRead == 0 ) { + // remote side closed connection. + // indicate error to caller + o.m_rx_byte_count = -1; + m_socket_op_Done.Set(); + return; + } + o.m_rx_remaining_count -= bytesRead; + Console.WriteLine("RxCallback: got {0} bytes, waiting for {1}", + bytesRead, o.m_rx_remaining_count); + // are we still waiting for flags and size? + if (o.m_rx_byte_count < 8) { + if ((o.m_rx_byte_count + bytesRead) >= 8) { + // got flags and packet size - may proceed. + Int32 flags = o.m_sock_reader.ReadInt32(); + Int32 val32 = o.m_sock_reader.ReadInt32(); + + o.m_rx_remaining_count = (int)IPAddress.NetworkToHostOrder(val32) - (bytesRead - 8); + Console.WriteLine("RxCallback: expecting packet size={0}", o.m_rx_remaining_count); + if ( o.m_rx_buffer.Length <= (o.m_rx_remaining_count+o.m_rx_byte_count) ) { + byte [] new_buffer = new byte[o.m_rx_remaining_count + o.m_rx_buffer.Length + 1]; + o.m_rx_buffer.CopyTo(new_buffer, 0); + o.m_rx_buffer = new_buffer; + // + // update stream reader with new buffer + // + o.m_rx_mem_stream = new MemoryStream(o.m_rx_buffer); + o.m_sock_reader = new BinaryReader(o.m_rx_mem_stream); + } + } + } else { + if ( o.m_rx_remaining_count == 0 ) { + // + // Packet received - call handler + // + if ( o.m_handler != null ) { + o.m_rx_mem_stream.Seek(0, SeekOrigin.Begin); + Console.WriteLine("Packet received - call handler\n"); + ecProto.ecPacket p = new ecProto.ecPacket(o.m_sock_reader); + o.m_handler.HandlePacket(p); + } + m_socket_op_Done.Set(); + // + // Keep waiting for more packets + // + o.StartReceive(); + return; + } + } + o.m_rx_byte_count += bytesRead; + + // not just yet - keep waiting + o.m_s.BeginReceive(o.m_rx_buffer, o.m_rx_byte_count, o.m_rx_remaining_count, + SocketFlags.None, new AsyncCallback(RxCallback), o); + } + + static void TxCallback(IAsyncResult ar) + { + amuleRemote o = (amuleRemote)ar.AsyncState; + Console.WriteLine("TxCallback signalled, calling EndWrite"); + o.m_s.EndSend(ar); + m_socket_op_Done.Set(); + } + + public bool SendPacket(ecProto.ecPacket packet) + { + m_tx_mem_stream.Seek(0, SeekOrigin.Begin); + packet.Write(m_sock_writer); + + m_socket_op_Done.Reset(); + m_s.BeginSend(m_tx_buffer, 0, packet.PacketSize(), + SocketFlags.None, new AsyncCallback(TxCallback), this); + + return true; + } + public void StartReceive() + { + m_socket_op_Done.Reset(); + // reply packet is supposed to have at least 8 bytes + m_rx_remaining_count = 8; + m_rx_byte_count = 0; + m_rx_mem_stream.Seek(0, SeekOrigin.Begin); + m_s.BeginReceive(m_rx_buffer, 0, 8, SocketFlags.None, new AsyncCallback(RxCallback), this); + } + + [DnsPermission(SecurityAction.Demand, Unrestricted = true)] + public bool ConnectToCore(string host, int port, string pass, ref string error) + { + try { + m_socket_op_Done.Reset(); + ResolveState resolveContext = new ResolveState(); + Dns.BeginGetHostEntry(host, + new AsyncCallback(GetHostEntryCallback), resolveContext); + + // Wait here until the resolve completes (the callback calls .Set()) + m_socket_op_Done.WaitOne(); + if ( resolveContext.IPs == null ) { + error = resolveContext.errorMsg; + return false; + } + Console.WriteLine("Resolved: '{0}' -> '{1}", host,resolveContext.IPs.AddressList[0]); + Console.WriteLine("Connecting to {0}:{1}", resolveContext.IPs.AddressList[0], port); + IPEndPoint remoteEP = new IPEndPoint(resolveContext.IPs.AddressList[0], port); + m_s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + + m_socket_op_Done.Reset(); + ConnectState connectContext = new ConnectState(m_s); + m_s.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), connectContext); + if ( !m_socket_op_Done.WaitOne(1000,true) ) { + error = "Timeout during connection. Possible firewall"; + return false; + } + + if ( connectContext.errorMsg != null) { + error = connectContext.errorMsg; + return false; + } + + m_tx_mem_stream = new MemoryStream(m_tx_buffer); + m_sock_writer = new BinaryWriter(m_tx_mem_stream); + m_rx_mem_stream = new MemoryStream(m_rx_buffer); + m_sock_reader = new BinaryReader(m_rx_mem_stream); + + ecProto.ecLoginPacket p = new ecProto.ecLoginPacket("amule.net", "0.0.1", pass); + SendPacket(p); + + if (!m_socket_op_Done.WaitOne(1000, true)) { + // Was unable to send login request for 1sec. Line must be really slow + return false; + } + + m_handler = new amuleLogicHandler(this); + StartReceive(); + + // FIXME: must be able to cancel this read. + m_socket_op_Done.WaitOne(); + if ( m_rx_byte_count == -1 ) { + // remote side terminated connection + Console.WriteLine("Connection terminated on remote side"); + } + Console.WriteLine("Connect done"); + bool result = ((amuleLogicHandler)m_handler).AuthResult(); + m_handler = null; + return result; + } catch (Exception e) { + error = e.Message; + return false; + } + } + + public void SetECHandler(amuleECHandler h) + { + m_handler = h; + } + } +} diff --git a/src/libs/ec/c#/ecProto.cs b/src/libs/ec/c#/ecProto.cs new file mode 100644 index 00000000..49aa3d78 --- /dev/null +++ b/src/libs/ec/c#/ecProto.cs @@ -0,0 +1,669 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003-2008 lfroen ( lfroen@gmail.com / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +using System; +using System.IO; +using System.Security.Cryptography; +using System.Collections.Generic; +using System.Text; + +namespace amule.net +{ + public enum EcTagTypes { + EC_TAGTYPE_UNKNOWN = 0, + EC_TAGTYPE_CUSTOM = 1, + EC_TAGTYPE_UINT8 = 2, + EC_TAGTYPE_UINT16 = 3, + EC_TAGTYPE_UINT32 = 4, + EC_TAGTYPE_UINT64 = 5, + EC_TAGTYPE_STRING = 6, + EC_TAGTYPE_DOUBLE = 7, + EC_TAGTYPE_IPV4 = 8, + EC_TAGTYPE_HASH16 = 9 + }; + + public class ecProto { + + public class ecTag { + protected int m_size; + protected EcTagTypes m_type; + protected ECTagNames m_name; + protected LinkedList m_subtags; + + public ecTag(ECTagNames n, EcTagTypes t) + { + m_name = n; + m_type = t; + m_subtags = new LinkedList(); + } + public ecTag(ECTagNames n, EcTagTypes t, LinkedList subtags) + { + m_name = n; + m_type = t; + m_subtags = subtags; ; + } + + public ecTag() + { + m_subtags = new LinkedList(); + } + + public int SubtagCount() + { + return m_subtags.Count; + } + + protected void WriteSubtags(BinaryWriter wr) + { + Int16 count16 = (Int16)m_subtags.Count; + if (count16 != 0) { + wr.Write(System.Net.IPAddress.HostToNetworkOrder(count16)); + foreach (ecTag t in m_subtags) + { + t.Write(wr); + } + } + } + + public ECTagNames Name() + { + return m_name; + } + + public virtual void Write(BinaryWriter wr) + { + Int16 name16 = (Int16)(m_name); + name16 <<= 1; + byte type8 = (byte)m_type; + Int32 size32 = (Int32)Size(); + if (m_subtags.Count != 0) { + name16 |= 1; + } + wr.Write(System.Net.IPAddress.HostToNetworkOrder(name16)); + wr.Write(type8); + wr.Write(System.Net.IPAddress.HostToNetworkOrder(size32)); + + WriteSubtags(wr); + // + // here derived class will put actual data + // + } + + protected int Size() + { + int total_size = m_size; + foreach (ecTag t in m_subtags) { + total_size += t.Size(); + // name + type + size for each tag + total_size += (2 + 1 + 4); + if (t.HaveSubtags()) { + total_size += 2; + } + } + return total_size; + } + + public LinkedList.Enumerator GetTagIterator() + { + return m_subtags.GetEnumerator(); + } + + public void AddSubtag(ecTag t) + { + m_subtags.AddLast(t); + } + + bool HaveSubtags() + { + return (m_subtags.Count != 0); + } + + public ecTag SubTag(ECTagNames name) + { + foreach (ecTag t in m_subtags) { + if (t.m_name == name) { + return t; + } + } + return null; + } + } + + public class ecTagInt : ecTag { + protected Int64 m_val; + public ecTagInt(ECTagNames n, byte v) + : base(n, EcTagTypes.EC_TAGTYPE_UINT8) + { + m_val = v; + m_size = 1; + } + + public ecTagInt(ECTagNames n, Int16 v) + : base(n, EcTagTypes.EC_TAGTYPE_UINT16) + { + m_val = v; + m_size = 2; + } + + public ecTagInt(ECTagNames n, Int32 v) + : base(n, EcTagTypes.EC_TAGTYPE_UINT32) + { + m_val = v; + m_size = 4; + } + + public ecTagInt(ECTagNames n, Int64 v) + : base(n, EcTagTypes.EC_TAGTYPE_UINT64) + { + m_val = v; + m_size = 8; + } + + public ecTagInt(ECTagNames n, Int32 tag_size, BinaryReader br, LinkedList subtags) + : base(n, EcTagTypes.EC_TAGTYPE_UINT8, subtags) + { + m_size = tag_size; + UInt64 raw_val; + Int32 hi, lo, v32; + Int16 v16; + switch ( m_size ) { + case 8: + m_type = EcTagTypes.EC_TAGTYPE_UINT64; + lo = System.Net.IPAddress.NetworkToHostOrder(br.ReadInt32()); + hi = System.Net.IPAddress.NetworkToHostOrder(br.ReadInt32()); + raw_val = ((UInt64)hi) << 32 | (UInt32)lo; + break; + case 4: + m_type = EcTagTypes.EC_TAGTYPE_UINT32; + v32 = (System.Net.IPAddress.NetworkToHostOrder(br.ReadInt32())); + raw_val = (UInt32)v32; + break; + case 2: + m_type = EcTagTypes.EC_TAGTYPE_UINT16; + v16 = System.Net.IPAddress.NetworkToHostOrder(br.ReadInt16()); + raw_val = (UInt16)v16; + break; + case 1: + m_type = EcTagTypes.EC_TAGTYPE_UINT8; + raw_val = (UInt64)br.ReadByte(); + break; + default: + throw new Exception("Unexpected size of data in integer tag"); + } + m_val = (Int64)raw_val; + if ( m_val < 0 ) { + throw new Exception("WTF - typecasting is broken?!"); + } + } + + public int ValueInt() + { + return (int)m_val; + } + + public Int64 Value64() + { + return m_val; + } + + public override void Write(BinaryWriter wr) + { + base.Write(wr); + + switch ( m_size ) { + case 8: + Int32 val32 = (Int32)(m_val >> 32); + wr.Write(System.Net.IPAddress.HostToNetworkOrder(val32)); + + val32 = (Int32)(m_val & 0xffffffff); + wr.Write(System.Net.IPAddress.HostToNetworkOrder(val32)); + break; + case 4: + val32 = (Int32)(m_val & 0xffffffff); + wr.Write(System.Net.IPAddress.HostToNetworkOrder(val32)); + break; + case 2: + Int16 val16 = (Int16)(m_val & 0xffff); + wr.Write(System.Net.IPAddress.HostToNetworkOrder(val16)); + break; + case 1: + wr.Write((byte)(m_val & 0xff)); + break; + } + + } + } + + public class ecMD5 : IComparable, IEquatable { + Int64 m_lo, m_hi; + public ecMD5(Int64 lo, Int64 hi) + { + m_hi = hi; + m_lo = lo; + } + + // + // actual byte order doesn't matter, but conversion must be consistant + // + public ecMD5(byte [] v) + { + m_lo = ((Int64)v[0] << 0) | ((Int64)v[1] << 8) | ((Int64)v[2] << 16) | ((Int64)v[3] << 24) | + ((Int64)v[4] << 32) | ((Int64)v[5] << 40) | ((Int64)v[6] << 48) | ((Int64)v[7] << 56); + m_hi = ((Int64)v[8] << 0) | ((Int64)v[9] << 8) | ((Int64)v[10] << 16) | ((Int64)v[11] << 24) | + ((Int64)v[12] << 32) | ((Int64)v[13] << 40) | ((Int64)v[14] << 48) | ((Int64)v[15] << 56); + } + + public byte [] ByteValue() + { + byte[] v = { + (byte)(m_lo >> 0), (byte)(m_lo >> 8), (byte)(m_lo >> 16), (byte)(m_lo >> 24), + (byte)(m_lo >> 32), (byte)(m_lo >> 40), (byte)(m_lo >> 48), (byte)(m_lo >> 56), + (byte)(m_hi >> 0), (byte)(m_hi >> 8), (byte)(m_hi >> 16), (byte)(m_hi >> 24), + (byte)(m_hi >> 32), (byte)(m_hi >> 40), (byte)(m_hi >> 48), (byte)(m_hi >> 56), + }; + return v; + } + + public override int GetHashCode() + { + return (int)m_lo ^ (int)m_hi; + } + + public bool Equals(ecMD5 i) + { + return (m_hi == i.m_hi) && (m_lo == i.m_lo); + } + + public int CompareTo(ecMD5 i) + { + Int64 r = ((m_hi == i.m_hi) ? (m_lo - i.m_lo) : (m_hi - i.m_hi)); + return r > 0 ? 1 : (r < 0 ? -1 : 0); + } + } + + public class ecTagMD5 : ecTag { + byte[] m_val; + + public ecTagMD5(ECTagNames n, ecMD5 value) + : base(n, EcTagTypes.EC_TAGTYPE_HASH16) + { + m_val = value.ByteValue(); + m_size = 16; + } + + public ecTagMD5(ECTagNames n, string s, bool string_is_hash) + : base(n, EcTagTypes.EC_TAGTYPE_HASH16) + { + if ( string_is_hash ) { + // in this case hash is passed as hex string + if ( s.Length != 16*2 ) { + throw new Exception("md5 hash of proto version have incorrect length"); + } + //byte[] hash_str = s.ToCharArray(); + for (int i = 0; i < 16; i++) { + string v = s.Substring(i * 2, 2); + + } + m_val = new byte[16]; + } else { + MD5CryptoServiceProvider p = new MD5CryptoServiceProvider(); + byte[] bs = System.Text.Encoding.UTF8.GetBytes(s); + m_val = p.ComputeHash(bs); + } + m_size = 16; + } + + public ecTagMD5(ECTagNames name, byte[] hash_data) + : base(name, EcTagTypes.EC_TAGTYPE_HASH16) + { + m_val = hash_data; + m_size = 16; + } + + public ecTagMD5(ECTagNames name, BinaryReader br, LinkedList subtags) + : base(name, EcTagTypes.EC_TAGTYPE_HASH16, subtags) + { + m_size = 16; + m_val = br.ReadBytes(16); + } + + public override void Write(BinaryWriter wr) + { + base.Write(wr); + wr.Write(m_val); + } + + public ecMD5 ValueMD5() + { + return new ecMD5(m_val); + } + } + + public class ecTagIPv4 : ecTag { + Int32 m_addr; + Int16 m_port; + public ecTagIPv4(ECTagNames name, BinaryReader br, LinkedList subtags) + : base(name, EcTagTypes.EC_TAGTYPE_IPV4, subtags) + { + m_size = 4+2; + m_addr = System.Net.IPAddress.NetworkToHostOrder(br.ReadInt32()); + m_port = System.Net.IPAddress.NetworkToHostOrder(br.ReadInt16()); + } + } + + public class ecTagCustom : ecTag { + byte[] m_val; + public ecTagCustom(ECTagNames n, Int32 tag_size, BinaryReader br, LinkedList subtags) + : base(n, EcTagTypes.EC_TAGTYPE_CUSTOM, subtags) + { + m_val= br.ReadBytes(tag_size); + m_size = tag_size; + } + public byte [] Value() + { + return m_val; + } + + } + + public class ecTagString : ecTag { + byte[] m_val; + public ecTagString(ECTagNames n, string s) + : base(n, EcTagTypes.EC_TAGTYPE_STRING) + { + m_val = System.Text.Encoding.UTF8.GetBytes(s); + m_size = m_val.GetLength(0) + 1; + } + + public ecTagString(ECTagNames n, Int32 tag_size, BinaryReader br, LinkedList subtags) + : base(n, EcTagTypes.EC_TAGTYPE_STRING, subtags) + { + byte[] buf = br.ReadBytes(tag_size-1); + // discard trailing '0' + br.ReadBytes(1); + + m_size = tag_size; + m_val = buf; + } + + public override void Write(BinaryWriter wr) + { + base.Write(wr); + wr.Write(m_val); + byte zero_byte = 0; + wr.Write(zero_byte); + } + public string StringValue() + { + Encoding u8 = Encoding.UTF8; + string s = u8.GetString(m_val); + return s; + } + } + + public class ecPacket : ecTag { + // since I have no zlib here, effectively disable compression + const int MaxUncompressedPacket = 0x6666; + + private ECOpCodes m_opcode; + protected Int32 m_flags; + + // + // Parsing ctor + // + ecTag ReadTag(BinaryReader br) + { + ecTag t = null; + Int16 tag_name16 = System.Net.IPAddress.NetworkToHostOrder(br.ReadInt16()); + bool have_subtags = ((tag_name16 & 1) != 0); + ECTagNames tag_name = (ECTagNames)(tag_name16 >> 1); + + byte tag_type8 = br.ReadByte(); + Int32 tag_size32 = System.Net.IPAddress.NetworkToHostOrder(br.ReadInt32()); + LinkedList subtags = null; + if ( have_subtags ) { + subtags = ReadSubtags(br); + } + EcTagTypes tag_type = (EcTagTypes)tag_type8; + switch (tag_type) { + case EcTagTypes.EC_TAGTYPE_UNKNOWN: + break; + case EcTagTypes.EC_TAGTYPE_CUSTOM: + t = new ecTagCustom(tag_name, tag_size32, br, subtags); + break; + + case EcTagTypes.EC_TAGTYPE_UINT8: + t = new ecTagInt(tag_name, 1, br, subtags); + break; + case EcTagTypes.EC_TAGTYPE_UINT16: + t = new ecTagInt(tag_name, 2, br, subtags); + break; + case EcTagTypes.EC_TAGTYPE_UINT32: + t = new ecTagInt(tag_name, 4, br, subtags); + break; + case EcTagTypes.EC_TAGTYPE_UINT64: + t = new ecTagInt(tag_name, 8, br, subtags); + break; + + case EcTagTypes.EC_TAGTYPE_STRING: + t = new ecTagString(tag_name, tag_size32, br, subtags); + break; + case EcTagTypes.EC_TAGTYPE_DOUBLE: + break; + case EcTagTypes.EC_TAGTYPE_IPV4: + t = new ecTagIPv4(tag_name, br, subtags); + break; + case EcTagTypes.EC_TAGTYPE_HASH16: + t = new ecTagMD5(tag_name, br, subtags); + break; + default: + break; + } + if ( t == null ) { + throw new Exception("Unexpected tag type"); + } + return t; + } + + LinkedList ReadSubtags(BinaryReader br) + { + Int16 count16 = System.Net.IPAddress.NetworkToHostOrder(br.ReadInt16()); + LinkedList taglist = new LinkedList(); + for (int i = 0; i < count16;i++) { + ecTag st = ReadTag(br); + taglist.AddLast(st); + } + return taglist; + } + + public ecPacket() + { + m_flags = 0x20; + } + + public ecPacket(BinaryReader br) + { + m_flags = System.Net.IPAddress.NetworkToHostOrder(br.ReadInt32()); + Int32 packet_size = System.Net.IPAddress.NetworkToHostOrder(br.ReadInt32()); + m_opcode = (ECOpCodes)br.ReadByte(); + + Int16 tags_count = System.Net.IPAddress.NetworkToHostOrder(br.ReadInt16()); + + if ( tags_count != 0 ) { + for (int i = 0; i < tags_count; i++) { + ecTag t = ReadTag(br); + AddSubtag(t); + } + } + } + + // + // Default ctor - for tx packets + public ecPacket(ECOpCodes cmd) + { + m_flags = 0x20; + m_opcode = cmd; + } + + public ecPacket(ECOpCodes cmd, EC_DETAIL_LEVEL detail_level) + { + m_flags = 0x20; + m_opcode = cmd; + if ( detail_level != EC_DETAIL_LEVEL.EC_DETAIL_FULL ) { + AddSubtag(new ecTagInt(ECTagNames.EC_TAG_DETAIL_LEVEL, (Int64)detail_level)); + } + } + + // + // Size of data for TX, not of payload + // + public int PacketSize() + { + int packet_size = Size(); + if ((m_flags & (UInt32)ECFlags.EC_FLAG_ACCEPTS) != 0) { + packet_size += 4; + } + // 1 (command) + 2 (tag count) + 4 (flags) + 4 (total size) + return packet_size + 1 + 2 + 4 + 4; + } + + public ECOpCodes Opcode() + { + return m_opcode; + } + + public override void Write(BinaryWriter wr) + { + // 1 (command) + 2 (tag count) + int packet_size = Size() + 1 + 2; + if ( packet_size > MaxUncompressedPacket ) { + m_flags |= (Int32)ECFlags.EC_FLAG_ZLIB; + } + + if ((m_flags & (UInt32)ECFlags.EC_FLAG_ZLIB) != 0) { + throw new NotImplementedException("no zlib compression yet"); + } + + + wr.Write(System.Net.IPAddress.HostToNetworkOrder((Int32)(m_flags))); + if ((m_flags & (UInt32)ECFlags.EC_FLAG_ACCEPTS) != 0) { + wr.Write(System.Net.IPAddress.HostToNetworkOrder((Int32)(m_flags))); + } + + wr.Write(System.Net.IPAddress.HostToNetworkOrder((Int32)(packet_size))); + wr.Write((byte)m_opcode); + if ( m_subtags.Count != 0 ) { + WriteSubtags(wr); + } else { + wr.Write((Int16)(0)); + } + } + + } + + // + // Specific - purpose tags + // + + public class ecLoginPacket : ecPacket { + public ecLoginPacket(string client_name, string version, string pass) + : base(ECOpCodes.EC_OP_AUTH_REQ) + { + m_flags |= 0x20 | (Int32)ECFlags.EC_FLAG_ACCEPTS; + + AddSubtag(new ecTagString(ECTagNames.EC_TAG_CLIENT_NAME, client_name)); + AddSubtag(new ecTagString(ECTagNames.EC_TAG_CLIENT_VERSION, version)); + AddSubtag(new ecTagInt(ECTagNames.EC_TAG_PROTOCOL_VERSION, + (Int64)ProtocolVersion.EC_CURRENT_PROTOCOL_VERSION)); + + AddSubtag(new ecTagMD5(ECTagNames.EC_TAG_PASSWD_HASH, pass, false)); + + // discussion is ongoing + //AddSubtag(new ecTagMD5(ECTagNames.EC_TAG_VERSION_ID, EC_VERSION_ID, true)); + } + } + + public class ecDownloadsInfoReq : ecPacket { + public ecDownloadsInfoReq() : base(ECOpCodes.EC_OP_GET_DLOAD_QUEUE) + { + } + } + + // + // Class exists only for parsing purpose + // + public class ecConnStateTag { + ecTagInt m_tag; + Int32 m_tag_val; + public ecConnStateTag(ecTagInt tag) + { + m_tag = tag; + //m_tag_val = (Int32)tag.Value64(); + m_tag_val = 0xfff; + } + + //public static explicit operator ecConnStateTag(ecTagInt t) + //{ + // return new ecConnStateTag(t.ValueInt64()); + //} + + public bool IsConnected() + { + return IsConnectedED2K() || IsConnectedKademlia(); + } + + public bool IsConnectedED2K() + { + return (m_tag_val & 0x01) != 0; + } + + public bool IsConnectingED2K() + { + return (m_tag_val & 0x02) != 0; + } + + public bool IsConnectedKademlia() + { + return (m_tag_val & 0x04) != 0; + } + + public bool IsKadFirewalled() + { + return (m_tag_val & 0x08) != 0; + } + + public bool IsKadRunning() + { + return (m_tag_val & 0x10) != 0; + } + + public ecProto.ecTag Server() + { + return m_tag.SubTag(ECTagNames.EC_TAG_SERVER); + } + } + + } +} diff --git a/src/libs/ec/cpp/ECCodes.h b/src/libs/ec/cpp/ECCodes.h new file mode 100644 index 00000000..6f47fb2c --- /dev/null +++ b/src/libs/ec/cpp/ECCodes.h @@ -0,0 +1,385 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + +// Purpose: +// EC codes and type definition. + +#ifndef __ECCODES_H__ +#define __ECCODES_H__ + +typedef uint8_t ec_opcode_t; +typedef uint16_t ec_tagname_t; +typedef uint8_t ec_tagtype_t; +typedef uint32_t ec_taglen_t; + +enum ProtocolVersion { + EC_CURRENT_PROTOCOL_VERSION = 0x0200 +}; + +enum ECFlags { + EC_FLAG_ZLIB = 0x00000001, + EC_FLAG_UTF8_NUMBERS = 0x00000002, + EC_FLAG_HAS_ID = 0x00000004, + EC_FLAG_ACCEPTS = 0x00000010, + EC_FLAG_UNKNOWN_MASK = 0xff7f7f08 +}; + +enum ECOpCodes { + EC_OP_NOOP = 0x01, + EC_OP_AUTH_REQ = 0x02, + EC_OP_AUTH_FAIL = 0x03, + EC_OP_AUTH_OK = 0x04, + EC_OP_FAILED = 0x05, + EC_OP_STRINGS = 0x06, + EC_OP_MISC_DATA = 0x07, + EC_OP_SHUTDOWN = 0x08, + EC_OP_ADD_LINK = 0x09, + EC_OP_STAT_REQ = 0x0A, + EC_OP_GET_CONNSTATE = 0x0B, + EC_OP_STATS = 0x0C, + EC_OP_GET_DLOAD_QUEUE = 0x0D, + EC_OP_GET_ULOAD_QUEUE = 0x0E, + EC_OP_GET_WAIT_QUEUE = 0x0F, + EC_OP_GET_SHARED_FILES = 0x10, + EC_OP_SHARED_SET_PRIO = 0x11, + EC_OP_PARTFILE_REMOVE_NO_NEEDED = 0x12, + EC_OP_PARTFILE_REMOVE_FULL_QUEUE = 0x13, + EC_OP_PARTFILE_REMOVE_HIGH_QUEUE = 0x14, + EC_OP_PARTFILE_CLEANUP_SOURCES = 0x15, + EC_OP_PARTFILE_SWAP_A4AF_THIS = 0x16, + EC_OP_PARTFILE_SWAP_A4AF_THIS_AUTO = 0x17, + EC_OP_PARTFILE_SWAP_A4AF_OTHERS = 0x18, + EC_OP_PARTFILE_PAUSE = 0x19, + EC_OP_PARTFILE_RESUME = 0x1A, + EC_OP_PARTFILE_STOP = 0x1B, + EC_OP_PARTFILE_PRIO_SET = 0x1C, + EC_OP_PARTFILE_DELETE = 0x1D, + EC_OP_PARTFILE_SET_CAT = 0x1E, + EC_OP_DLOAD_QUEUE = 0x1F, + EC_OP_ULOAD_QUEUE = 0x20, + EC_OP_WAIT_QUEUE = 0x21, + EC_OP_SHARED_FILES = 0x22, + EC_OP_SHAREDFILES_RELOAD = 0x23, + EC_OP_SHAREDFILES_ADD_DIRECTORY = 0x24, + EC_OP_RENAME_FILE = 0x25, + EC_OP_SEARCH_START = 0x26, + EC_OP_SEARCH_STOP = 0x27, + EC_OP_SEARCH_RESULTS = 0x28, + EC_OP_SEARCH_PROGRESS = 0x29, + EC_OP_DOWNLOAD_SEARCH_RESULT = 0x2A, + EC_OP_IPFILTER_RELOAD = 0x2B, + EC_OP_GET_SERVER_LIST = 0x2C, + EC_OP_SERVER_LIST = 0x2D, + EC_OP_SERVER_DISCONNECT = 0x2E, + EC_OP_SERVER_CONNECT = 0x2F, + EC_OP_SERVER_REMOVE = 0x30, + EC_OP_SERVER_ADD = 0x31, + EC_OP_SERVER_UPDATE_FROM_URL = 0x32, + EC_OP_ADDLOGLINE = 0x33, + EC_OP_ADDDEBUGLOGLINE = 0x34, + EC_OP_GET_LOG = 0x35, + EC_OP_GET_DEBUGLOG = 0x36, + EC_OP_GET_SERVERINFO = 0x37, + EC_OP_LOG = 0x38, + EC_OP_DEBUGLOG = 0x39, + EC_OP_SERVERINFO = 0x3A, + EC_OP_RESET_LOG = 0x3B, + EC_OP_RESET_DEBUGLOG = 0x3C, + EC_OP_CLEAR_SERVERINFO = 0x3D, + EC_OP_GET_LAST_LOG_ENTRY = 0x3E, + EC_OP_GET_PREFERENCES = 0x3F, + EC_OP_SET_PREFERENCES = 0x40, + EC_OP_CREATE_CATEGORY = 0x41, + EC_OP_UPDATE_CATEGORY = 0x42, + EC_OP_DELETE_CATEGORY = 0x43, + EC_OP_GET_STATSGRAPHS = 0x44, + EC_OP_STATSGRAPHS = 0x45, + EC_OP_GET_STATSTREE = 0x46, + EC_OP_STATSTREE = 0x47, + EC_OP_KAD_START = 0x48, + EC_OP_KAD_STOP = 0x49, + EC_OP_CONNECT = 0x4A, + EC_OP_DISCONNECT = 0x4B, + EC_OP_GET_DLOAD_QUEUE_DETAIL = 0x4C, + EC_OP_KAD_UPDATE_FROM_URL = 0x4D, + EC_OP_KAD_BOOTSTRAP_FROM_IP = 0x4E +}; + +enum ECTagNames { + EC_TAG_STRING = 0x0000, + EC_TAG_PASSWD_HASH = 0x0001, + EC_TAG_PROTOCOL_VERSION = 0x0002, + EC_TAG_VERSION_ID = 0x0003, + EC_TAG_DETAIL_LEVEL = 0x0004, + EC_TAG_CONNSTATE = 0x0005, + EC_TAG_ED2K_ID = 0x0006, + EC_TAG_LOG_TO_STATUS = 0x0007, + EC_TAG_BOOTSTRAP_IP = 0x0008, + EC_TAG_BOOTSTRAP_PORT = 0x0008, + EC_TAG_CLIENT_ID = 0x0009, + EC_TAG_CLIENT_NAME = 0x0100, + EC_TAG_CLIENT_VERSION = 0x0101, + EC_TAG_CLIENT_MOD = 0x0102, + EC_TAG_STATS_UL_SPEED = 0x0200, + EC_TAG_STATS_DL_SPEED = 0x0201, + EC_TAG_STATS_UL_SPEED_LIMIT = 0x0202, + EC_TAG_STATS_DL_SPEED_LIMIT = 0x0203, + EC_TAG_STATS_UP_OVERHEAD = 0x0204, + EC_TAG_STATS_DOWN_OVERHEAD = 0x0205, + EC_TAG_STATS_TOTAL_SRC_COUNT = 0x0206, + EC_TAG_STATS_BANNED_COUNT = 0x0207, + EC_TAG_STATS_UL_QUEUE_LEN = 0x0208, + EC_TAG_STATS_ED2K_USERS = 0x0209, + EC_TAG_STATS_KAD_USERS = 0x020A, + EC_TAG_STATS_ED2K_FILES = 0x020B, + EC_TAG_STATS_KAD_FILES = 0x020C, + EC_TAG_PARTFILE = 0x0300, + EC_TAG_PARTFILE_NAME = 0x0301, + EC_TAG_PARTFILE_PARTMETID = 0x0302, + EC_TAG_PARTFILE_SIZE_FULL = 0x0303, + EC_TAG_PARTFILE_SIZE_XFER = 0x0304, + EC_TAG_PARTFILE_SIZE_XFER_UP = 0x0305, + EC_TAG_PARTFILE_SIZE_DONE = 0x0306, + EC_TAG_PARTFILE_SPEED = 0x0307, + EC_TAG_PARTFILE_STATUS = 0x0308, + EC_TAG_PARTFILE_PRIO = 0x0309, + EC_TAG_PARTFILE_SOURCE_COUNT = 0x030A, + EC_TAG_PARTFILE_SOURCE_COUNT_A4AF = 0x030B, + EC_TAG_PARTFILE_SOURCE_COUNT_NOT_CURRENT = 0x030C, + EC_TAG_PARTFILE_SOURCE_COUNT_XFER = 0x030D, + EC_TAG_PARTFILE_ED2K_LINK = 0x030E, + EC_TAG_PARTFILE_CAT = 0x030F, + EC_TAG_PARTFILE_LAST_RECV = 0x0310, + EC_TAG_PARTFILE_LAST_SEEN_COMP = 0x0311, + EC_TAG_PARTFILE_PART_STATUS = 0x0312, + EC_TAG_PARTFILE_GAP_STATUS = 0x0313, + EC_TAG_PARTFILE_REQ_STATUS = 0x0314, + EC_TAG_PARTFILE_SOURCE_NAMES = 0x0315, + EC_TAG_PARTFILE_COMMENTS = 0x0316, + EC_TAG_KNOWNFILE = 0x0400, + EC_TAG_KNOWNFILE_XFERRED = 0x0401, + EC_TAG_KNOWNFILE_XFERRED_ALL = 0x0402, + EC_TAG_KNOWNFILE_REQ_COUNT = 0x0403, + EC_TAG_KNOWNFILE_REQ_COUNT_ALL = 0x0404, + EC_TAG_KNOWNFILE_ACCEPT_COUNT = 0x0405, + EC_TAG_KNOWNFILE_ACCEPT_COUNT_ALL = 0x0406, + EC_TAG_KNOWNFILE_AICH_MASTERHASH = 0x0407, + EC_TAG_SERVER = 0x0500, + EC_TAG_SERVER_NAME = 0x0501, + EC_TAG_SERVER_DESC = 0x0502, + EC_TAG_SERVER_ADDRESS = 0x0503, + EC_TAG_SERVER_PING = 0x0504, + EC_TAG_SERVER_USERS = 0x0505, + EC_TAG_SERVER_USERS_MAX = 0x0506, + EC_TAG_SERVER_FILES = 0x0507, + EC_TAG_SERVER_PRIO = 0x0508, + EC_TAG_SERVER_FAILED = 0x0509, + EC_TAG_SERVER_STATIC = 0x050A, + EC_TAG_SERVER_VERSION = 0x050B, + EC_TAG_CLIENT = 0x0600, + EC_TAG_CLIENT_SOFTWARE = 0x0601, + EC_TAG_CLIENT_SCORE = 0x0602, + EC_TAG_CLIENT_HASH = 0x0603, + EC_TAG_CLIENT_FRIEND = 0x0604, + EC_TAG_CLIENT_WAIT_TIME = 0x0605, + EC_TAG_CLIENT_XFER_TIME = 0x0606, + EC_TAG_CLIENT_QUEUE_TIME = 0x0607, + EC_TAG_CLIENT_LAST_TIME = 0x0608, + EC_TAG_CLIENT_UPLOAD_SESSION = 0x0609, + EC_TAG_CLIENT_UPLOAD_TOTAL = 0x060A, + EC_TAG_CLIENT_DOWNLOAD_TOTAL = 0x060B, + EC_TAG_CLIENT_STATE = 0x060C, + EC_TAG_CLIENT_UP_SPEED = 0x060D, + EC_TAG_CLIENT_DOWN_SPEED = 0x060E, + EC_TAG_CLIENT_FROM = 0x060F, + EC_TAG_CLIENT_USER_IP = 0x0610, + EC_TAG_CLIENT_USER_PORT = 0x0611, + EC_TAG_CLIENT_SERVER_IP = 0x0612, + EC_TAG_CLIENT_SERVER_PORT = 0x0613, + EC_TAG_CLIENT_SERVER_NAME = 0x0614, + EC_TAG_CLIENT_SOFT_VER_STR = 0x0615, + EC_TAG_CLIENT_WAITING_POSITION = 0x0616, + EC_TAG_SEARCHFILE = 0x0700, + EC_TAG_SEARCH_TYPE = 0x0701, + EC_TAG_SEARCH_NAME = 0x0702, + EC_TAG_SEARCH_MIN_SIZE = 0x0703, + EC_TAG_SEARCH_MAX_SIZE = 0x0704, + EC_TAG_SEARCH_FILE_TYPE = 0x0705, + EC_TAG_SEARCH_EXTENSION = 0x0706, + EC_TAG_SEARCH_AVAILABILITY = 0x0707, + EC_TAG_SEARCH_STATUS = 0x0708, + EC_TAG_SELECT_PREFS = 0x1000, + EC_TAG_PREFS_CATEGORIES = 0x1100, + EC_TAG_CATEGORY = 0x1101, + EC_TAG_CATEGORY_TITLE = 0x1102, + EC_TAG_CATEGORY_PATH = 0x1103, + EC_TAG_CATEGORY_COMMENT = 0x1104, + EC_TAG_CATEGORY_COLOR = 0x1105, + EC_TAG_CATEGORY_PRIO = 0x1106, + EC_TAG_PREFS_GENERAL = 0x1200, + EC_TAG_USER_NICK = 0x1201, + EC_TAG_USER_HASH = 0x1202, + EC_TAG_USER_HOST = 0x1203, + EC_TAG_PREFS_CONNECTIONS = 0x1300, + EC_TAG_CONN_DL_CAP = 0x1301, + EC_TAG_CONN_UL_CAP = 0x1302, + EC_TAG_CONN_MAX_DL = 0x1303, + EC_TAG_CONN_MAX_UL = 0x1304, + EC_TAG_CONN_SLOT_ALLOCATION = 0x1305, + EC_TAG_CONN_TCP_PORT = 0x1306, + EC_TAG_CONN_UDP_PORT = 0x1307, + EC_TAG_CONN_UDP_DISABLE = 0x1308, + EC_TAG_CONN_MAX_FILE_SOURCES = 0x1309, + EC_TAG_CONN_MAX_CONN = 0x130A, + EC_TAG_CONN_AUTOCONNECT = 0x130B, + EC_TAG_CONN_RECONNECT = 0x130C, + EC_TAG_NETWORK_ED2K = 0x130D, + EC_TAG_NETWORK_KADEMLIA = 0x130E, + EC_TAG_PREFS_MESSAGEFILTER = 0x1400, + EC_TAG_MSGFILTER_ENABLED = 0x1401, + EC_TAG_MSGFILTER_ALL = 0x1402, + EC_TAG_MSGFILTER_FRIENDS = 0x1403, + EC_TAG_MSGFILTER_SECURE = 0x1404, + EC_TAG_MSGFILTER_BY_KEYWORD = 0x1405, + EC_TAG_MSGFILTER_KEYWORDS = 0x1406, + EC_TAG_PREFS_REMOTECTRL = 0x1500, + EC_TAG_WEBSERVER_AUTORUN = 0x1501, + EC_TAG_WEBSERVER_PORT = 0x1502, + EC_TAG_WEBSERVER_GUEST = 0x1503, + EC_TAG_WEBSERVER_USEGZIP = 0x1504, + EC_TAG_WEBSERVER_REFRESH = 0x1505, + EC_TAG_WEBSERVER_TEMPLATE = 0x1506, + EC_TAG_PREFS_ONLINESIG = 0x1600, + EC_TAG_ONLINESIG_ENABLED = 0x1601, + EC_TAG_PREFS_SERVERS = 0x1700, + EC_TAG_SERVERS_REMOVE_DEAD = 0x1701, + EC_TAG_SERVERS_DEAD_SERVER_RETRIES = 0x1702, + EC_TAG_SERVERS_AUTO_UPDATE = 0x1703, + EC_TAG_SERVERS_URL_LIST = 0x1704, + EC_TAG_SERVERS_ADD_FROM_SERVER = 0x1705, + EC_TAG_SERVERS_ADD_FROM_CLIENT = 0x1706, + EC_TAG_SERVERS_USE_SCORE_SYSTEM = 0x1707, + EC_TAG_SERVERS_SMART_ID_CHECK = 0x1708, + EC_TAG_SERVERS_SAFE_SERVER_CONNECT = 0x1709, + EC_TAG_SERVERS_AUTOCONN_STATIC_ONLY = 0x170A, + EC_TAG_SERVERS_MANUAL_HIGH_PRIO = 0x170B, + EC_TAG_SERVERS_UPDATE_URL = 0x170C, + EC_TAG_PREFS_FILES = 0x1800, + EC_TAG_FILES_ICH_ENABLED = 0x1801, + EC_TAG_FILES_AICH_TRUST = 0x1802, + EC_TAG_FILES_NEW_PAUSED = 0x1803, + EC_TAG_FILES_NEW_AUTO_DL_PRIO = 0x1804, + EC_TAG_FILES_PREVIEW_PRIO = 0x1805, + EC_TAG_FILES_NEW_AUTO_UL_PRIO = 0x1806, + EC_TAG_FILES_UL_FULL_CHUNKS = 0x1807, + EC_TAG_FILES_START_NEXT_PAUSED = 0x1808, + EC_TAG_FILES_RESUME_SAME_CAT = 0x1809, + EC_TAG_FILES_SAVE_SOURCES = 0x180A, + EC_TAG_FILES_EXTRACT_METADATA = 0x180B, + EC_TAG_FILES_ALLOC_FULL_CHUNKS = 0x180C, + EC_TAG_FILES_ALLOC_FULL_SIZE = 0x180D, + EC_TAG_FILES_CHECK_FREE_SPACE = 0x180E, + EC_TAG_FILES_MIN_FREE_SPACE = 0x180F, + EC_TAG_PREFS_SRCDROP = 0x1900, + EC_TAG_SRCDROP_NONEEDED = 0x1901, + EC_TAG_SRCDROP_DROP_FQS = 0x1902, + EC_TAG_SRCDROP_DROP_HQRS = 0x1903, + EC_TAG_SRCDROP_HQRS_VALUE = 0x1904, + EC_TAG_SRCDROP_AUTODROP_TIMER = 0x1905, + EC_TAG_PREFS_DIRECTORIES = 0x1A00, + EC_TAG_PREFS_STATISTICS = 0x1B00, + EC_TAG_STATSGRAPH_WIDTH = 0x1B01, + EC_TAG_STATSGRAPH_SCALE = 0x1B02, + EC_TAG_STATSGRAPH_LAST = 0x1B03, + EC_TAG_STATSGRAPH_DATA = 0x1B04, + EC_TAG_STATTREE_CAPPING = 0x1B05, + EC_TAG_STATTREE_NODE = 0x1B06, + EC_TAG_STAT_NODE_VALUE = 0x1B07, + EC_TAG_STAT_VALUE_TYPE = 0x1B08, + EC_TAG_STATTREE_NODEID = 0x1B09, + EC_TAG_PREFS_SECURITY = 0x1C00, + EC_TAG_SECURITY_CAN_SEE_SHARES = 0x1C01, + EC_TAG_IPFILTER_CLIENTS = 0x1C02, + EC_TAG_IPFILTER_SERVERS = 0x1C03, + EC_TAG_IPFILTER_AUTO_UPDATE = 0x1C04, + EC_TAG_IPFILTER_UPDATE_URL = 0x1C05, + EC_TAG_IPFILTER_LEVEL = 0x1C06, + EC_TAG_IPFILTER_FILTER_LAN = 0x1C07, + EC_TAG_SECURITY_USE_SECIDENT = 0x1C08, + EC_TAG_SECURITY_OBFUSCATION_SUPPORTED = 0x1C09, + EC_TAG_SECURITY_OBFUSCATION_REQUESTED = 0x1C0A, + EC_TAG_SECURITY_OBFUSCATION_REQUIRED = 0x1C0B, + EC_TAG_PREFS_CORETWEAKS = 0x1D00, + EC_TAG_CORETW_MAX_CONN_PER_FIVE = 0x1D01, + EC_TAG_CORETW_VERBOSE = 0x1D02, + EC_TAG_CORETW_FILEBUFFER = 0x1D03, + EC_TAG_CORETW_UL_QUEUE = 0x1D04, + EC_TAG_CORETW_SRV_KEEPALIVE_TIMEOUT = 0x1D05, + EC_TAG_PREFS_KADEMLIA = 0x1E00, + EC_TAG_KADEMLIA_UPDATE_URL = 0x1E01 +}; + +enum EC_DETAIL_LEVEL { + EC_DETAIL_CMD = 0x00, + EC_DETAIL_WEB = 0x01, + EC_DETAIL_FULL = 0x02, + EC_DETAIL_UPDATE = 0x03, + EC_DETAIL_INC_UPDATE = 0x04 +}; + +enum EC_SEARCH_TYPE { + EC_SEARCH_LOCAL = 0x00, + EC_SEARCH_GLOBAL = 0x01, + EC_SEARCH_KAD = 0x02, + EC_SEARCH_WEB = 0x03 +}; + +enum EC_STATTREE_NODE_VALUE_TYPE { + EC_VALUE_INTEGER = 0x00, + EC_VALUE_ISTRING = 0x01, + EC_VALUE_BYTES = 0x02, + EC_VALUE_ISHORT = 0x03, + EC_VALUE_TIME = 0x04, + EC_VALUE_SPEED = 0x05, + EC_VALUE_STRING = 0x06, + EC_VALUE_DOUBLE = 0x07 +}; + +enum EcPrefs { + EC_PREFS_CATEGORIES = 0x00000001, + EC_PREFS_GENERAL = 0x00000002, + EC_PREFS_CONNECTIONS = 0x00000004, + EC_PREFS_MESSAGEFILTER = 0x00000008, + EC_PREFS_REMOTECONTROLS = 0x00000010, + EC_PREFS_ONLINESIG = 0x00000020, + EC_PREFS_SERVERS = 0x00000040, + EC_PREFS_FILES = 0x00000080, + EC_PREFS_SRCDROP = 0x00000100, + EC_PREFS_DIRECTORIES = 0x00000200, + EC_PREFS_STATISTICS = 0x00000400, + EC_PREFS_SECURITY = 0x00000800, + EC_PREFS_CORETWEAKS = 0x00001000, + EC_PREFS_KADEMLIA = 0x00002000 +}; + +#endif // __ECCODES_H__ diff --git a/src/libs/ec/cpp/ECFileConfig.h b/src/libs/ec/cpp/ECFileConfig.h new file mode 100644 index 00000000..ed5b5d95 --- /dev/null +++ b/src/libs/ec/cpp/ECFileConfig.h @@ -0,0 +1,100 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef ECFILECONFIG_H +#define ECFILECONFIG_H + +#include +#include +#include + +#include "MD4Hash.h" // Needed for CMD4Hash +#include "OtherFunctions.h" // Needed for GetConfigDir() + + +/** + * Prepends ConfigDir to filename, if it has no PathSeparator chars in it + */ +inline wxString FinalizeFilename(const wxString filename) +{ + if (wxStrchr(filename, wxFileName::GetPathSeparator()) == NULL) { + return GetConfigDir() + filename; + } + if ((filename.GetChar(0) == '~') && (filename.GetChar(1) == wxFileName::GetPathSeparator())) { + return wxGetHomeDir() + filename.Mid(1); + } + return filename; +} + + +/** + * Extension to wxFileConfig for reading/writing CMD4Hash values. + * + * This class converts between the text and binary representation of an MD4 hash, + * and also maps empty strings to the empty hash and vica versa. + */ +class CECFileConfig : public wxFileConfig { + public: + + CECFileConfig(const wxString& localFilename = wxEmptyString) + : wxFileConfig(wxEmptyString, wxEmptyString, FinalizeFilename(localFilename), + wxEmptyString, wxCONFIG_USE_LOCAL_FILE | wxCONFIG_USE_RELATIVE_PATH) + {} + + /** + * Reads a hash from the config file + * + * @param key the key to be read + * @param hash the CMD4Hash object to write the hash to + * + * @return true on success, false otherwise. + */ + bool ReadHash(const wxString& key, CMD4Hash *hash) + { + wxString sHash; + bool retval = wxFileConfig::Read(key, &sHash, wxEmptyString); + if (sHash.IsEmpty()) { + hash->Clear(); + } else { + hash->Decode(sHash); + } + return retval; + } + + /** + * Writes a CMD4Hash object to the config file + * + * @param key the key to write to + * @param hash the hash to be written + * + * @return true on success, false otherwise. + */ + bool WriteHash(const wxString& key, const CMD4Hash& hash) + { + return wxFileConfig::Write(key, hash.IsEmpty() ? wxString(wxEmptyString) : hash.Encode()); + } +}; + +#endif /* ECFILECONFIG_H */ +// File_checked_for_headers diff --git a/src/libs/ec/cpp/ECMuleSocket.cpp b/src/libs/ec/cpp/ECMuleSocket.cpp new file mode 100644 index 00000000..428b7c7f --- /dev/null +++ b/src/libs/ec/cpp/ECMuleSocket.cpp @@ -0,0 +1,140 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2004-2008 Angel Vidal Veiga ( kry@users.sourceforge.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "ECMuleSocket.h" + +#include "../../../NetworkFunctions.h" + +//-------------------- CECSocketHandler -------------------- + +#define EC_SOCKET_HANDLER (wxID_HIGHEST + 644) + +class CECMuleSocketHandler: public wxEvtHandler { + public: + CECMuleSocketHandler() {}; + + private: + void SocketHandler(wxSocketEvent& event); + + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(CECMuleSocketHandler, wxEvtHandler) + EVT_SOCKET(EC_SOCKET_HANDLER, CECMuleSocketHandler::SocketHandler) +END_EVENT_TABLE() + +void CECMuleSocketHandler::SocketHandler(wxSocketEvent& event) +{ + CECSocket *socket = dynamic_cast(event.GetSocket()); + wxCHECK_RET(socket, wxT("Socket event with a NULL socket!")); + + switch(event.GetSocketEvent()) { + case wxSOCKET_LOST: + socket->OnLost(); + break; + case wxSOCKET_INPUT: + socket->OnInput(); + break; + case wxSOCKET_OUTPUT: + socket->OnOutput(); + break; + case wxSOCKET_CONNECTION: + socket->OnConnect(); + break; + + default: + // Nothing should arrive here... + wxFAIL; + break; + } +} + +static CECMuleSocketHandler g_ECSocketHandler; + +// +// CECMuleSocket API - User interface functions +// + +CECMuleSocket::CECMuleSocket(bool use_events) +: +CECSocket(use_events), +wxSocketClient() +{ + if ( use_events ) { + SetEventHandler(g_ECSocketHandler, EC_SOCKET_HANDLER); + SetNotify(wxSOCKET_CONNECTION_FLAG | wxSOCKET_INPUT_FLAG | + wxSOCKET_OUTPUT_FLAG | wxSOCKET_LOST_FLAG); + Notify(true); + SetFlags(wxSOCKET_NOWAIT); + } else { + SetFlags(wxSOCKET_WAITALL | wxSOCKET_BLOCK); + Notify(false); + } +} + +CECMuleSocket::~CECMuleSocket() +{ +} + +bool CECMuleSocket::ConnectSocket(wxIPV4address& address) +{ + return CECSocket::ConnectSocket(StringIPtoUint32(address.IPAddress()),address.Service()); +} + + +bool CECMuleSocket::InternalConnect(uint32_t ip, uint16_t port, bool wait) { + wxIPV4address addr; + addr.Hostname(Uint32toStringIP(ip)); + addr.Service(port); + return wxSocketClient::Connect(addr, wait); +} + +int CECMuleSocket::InternalGetLastError() { + switch(LastError()) { + case wxSOCKET_NOERROR: + return EC_ERROR_NOERROR; + case wxSOCKET_INVOP: + return EC_ERROR_INVOP; + case wxSOCKET_IOERR: + return EC_ERROR_IOERR; + case wxSOCKET_INVADDR: + return EC_ERROR_INVADDR; + case wxSOCKET_INVSOCK: + return EC_ERROR_INVSOCK; + case wxSOCKET_NOHOST: + return EC_ERROR_NOHOST; + case wxSOCKET_INVPORT: + return EC_ERROR_INVPORT; + case wxSOCKET_WOULDBLOCK: + return EC_ERROR_WOULDBLOCK; + case wxSOCKET_TIMEDOUT: + return EC_ERROR_TIMEDOUT; + case wxSOCKET_MEMERR: + return EC_ERROR_MEMERR; + case wxSOCKET_DUMMY: + return EC_ERROR_DUMMY; + } + return EC_ERROR_UNKNOWN; +} diff --git a/src/libs/ec/cpp/ECMuleSocket.h b/src/libs/ec/cpp/ECMuleSocket.h new file mode 100644 index 00000000..30230a5b --- /dev/null +++ b/src/libs/ec/cpp/ECMuleSocket.h @@ -0,0 +1,65 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2004-2008 Angel Vidal Veiga ( kry@users.sourceforge.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef ECMULESOCKET_H +#define ECMULESOCKET_H + +#include // Needed for wxSocketClient +#include "ECSocket.h" + +/*! \class CECMuleSocket + * + * \brief Socket handler for External Communications (EC), wx implementation + * + */ + +class CECMuleSocket : public CECSocket, public wxSocketClient { +public: + CECMuleSocket(bool use_events); + virtual ~CECMuleSocket(); + + bool ConnectSocket(wxIPV4address& address); + + private: + bool InternalConnect(uint32_t ip, uint16_t port, bool wait); + + int InternalGetLastError(); + + uint32_t InternalLastCount() { return wxSocketClient::LastCount(); }; + bool InternalWaitOnConnect(long secs = -1, long msecs = 0) { return wxSocketClient::WaitOnConnect(secs,msecs); }; + bool InternalWaitForWrite(long secs = -1, long msecs = 0) { return wxSocketClient::WaitForRead(secs,msecs); }; + bool InternalWaitForRead(long secs = -1, long msecs = 0) { return wxSocketClient::WaitForWrite(secs,msecs); }; + + bool InternalError() { return wxSocketClient::Error(); } + void InternalClose() { wxSocketClient::Close(); } + + void InternalRead(void* ptr, uint32_t len) { wxSocketClient::Read(ptr, len); }; + void InternalWrite(const void* ptr, uint32_t len) { wxSocketClient::Write(ptr, len); }; + + bool InternalIsConnected() { return wxSocketClient::IsConnected(); } + void InternalDestroy() { wxSocketClient::Destroy(); } +}; + +#endif // ECMULESOCKET_H diff --git a/src/libs/ec/cpp/ECPacket.cpp b/src/libs/ec/cpp/ECPacket.cpp new file mode 100644 index 00000000..c6935942 --- /dev/null +++ b/src/libs/ec/cpp/ECPacket.cpp @@ -0,0 +1,81 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "ECPacket.h" // Needed for ECPacket +#include "ECSocket.h" // Needed for CECSocket + +/********************************************************** + * * + * CECPacket class * + * * + **********************************************************/ + +bool CECPacket::ReadFromSocket(CECSocket& socket) +{ + if (m_state == bsName) { + if (!socket.ReadNumber(&m_opCode, sizeof(ec_opcode_t))) { + return false; + } else { + m_state = bsChildCnt; + } + } + if (m_state == bsChildCnt || m_state == bsChildren) { + if (!ReadChildren(socket)) { + return false; + } + } + m_state = bsFinished; + return true; +} + + +bool CECPacket::WritePacket(CECSocket& socket) const +{ + if (!socket.WriteNumber(&m_opCode, sizeof(ec_opcode_t))) return false; + if (!WriteChildren(socket)) return false; + return true; +} + +/*! + * \fn CECPacket::CECPacket(ec_opcode_t opCode, EC_DETAIL_LEVEL detail_level) + * + * \brief Creates a new packet with given OPCODE. + */ + +/*! + * \fn ec_opcode_t CECPacket::GetOpCode(void) const + * + * \brief Returns OPCODE. + * + * \return The OpCode of the packet. + */ + +/*! + * \fn uint32 CECPacket::GetPacketLength(void) const + * + * \brief Returns the length of the packet. + * + * \return The length of the packet. + */ +// File_checked_for_headers diff --git a/src/libs/ec/cpp/ECPacket.h b/src/libs/ec/cpp/ECPacket.h new file mode 100644 index 00000000..76124343 --- /dev/null +++ b/src/libs/ec/cpp/ECPacket.h @@ -0,0 +1,77 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef ECPACKET_H +#define ECPACKET_H + +#include "ECTag.h" + +// Define this to keep partial packets +// (those that had an error upon reception/creation) +#undef KEEP_PARTIAL_PACKETS + +class CECSocket; + +/** + * High level EC packet handler class + */ +class CECPacket : protected CECEmptyTag { + friend class CECSocket; + public: + CECPacket(ec_opcode_t opCode, EC_DETAIL_LEVEL detail_level = EC_DETAIL_FULL) + : CECEmptyTag(0), m_opCode(opCode) + { + // since EC_DETAIL_FULL is default - no point transmit it + if ( detail_level != EC_DETAIL_FULL ) { + AddTag(CECTag(EC_TAG_DETAIL_LEVEL, (uint64)detail_level)); + } + } + + CECTag::AddTag; + CECTag::GetTagByIndex; + CECTag::GetTagByIndexSafe; + CECTag::GetTagByName; + CECTag::GetTagByNameSafe; + CECTag::GetTagCount; + + ec_opcode_t GetOpCode(void) const { return m_opCode; } + uint32_t GetPacketLength(void) const { return CECTag::GetTagLen(); } + EC_DETAIL_LEVEL GetDetailLevel() const + { + const CECTag *tag = GetTagByName(EC_TAG_DETAIL_LEVEL); + return (tag) ? (EC_DETAIL_LEVEL)tag->GetInt() : EC_DETAIL_FULL; + } + + private: + CECPacket(const CECSocket& socket) + : CECEmptyTag(socket) + {} + + bool ReadFromSocket(CECSocket& socket); + bool WritePacket(CECSocket& socket) const; + ec_opcode_t m_opCode; +}; + +#endif /* ECPACKET_H */ +// File_checked_for_headers diff --git a/src/libs/ec/cpp/ECSocket.cpp b/src/libs/ec/cpp/ECSocket.cpp new file mode 100644 index 00000000..5e71ceb3 --- /dev/null +++ b/src/libs/ec/cpp/ECSocket.cpp @@ -0,0 +1,805 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2004-2008 Angel Vidal Veiga ( kry@users.sourceforge.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "ECSocket.h" + +#include +#include +#include + +using namespace std; + +#include "ECPacket.h" // Needed for CECPacket + +#define EC_COMPRESSION_LEVEL Z_BEST_COMPRESSION +#define EC_MAX_UNCOMPRESSED 1024 + +#ifndef __GNUC__ +#define __attribute__(x) +#endif + +// If your compiler gives errors on these lines, just remove them. +int utf8_mbtowc(wchar_t *p, const unsigned char *s, int n) __attribute__((__visibility__("internal"))); +int utf8_wctomb(unsigned char *s, wchar_t wc, int maxlen) __attribute__((__visibility__("internal"))); +int utf8_mb_remain(char c) __attribute__((__pure__)); + +/*----------=> Import from the Linux kernel <=----------*/ +/* + * linux/fs/nls_base.c + */ + +/* + * Sample implementation from Unicode home page. + * http://www.stonehand.com/unicode/standard/fss-utf.html + */ +struct utf8_table { + int cmask; + int cval; + int shift; + uint32_t lmask; + uint32_t lval; +}; + +static struct utf8_table utf8_table[] = +{ + {0x80, 0x00, 0*6, 0x7F, 0, /* 1 byte sequence */}, + {0xE0, 0xC0, 1*6, 0x7FF, 0x80, /* 2 byte sequence */}, + {0xF0, 0xE0, 2*6, 0xFFFF, 0x800, /* 3 byte sequence */}, + {0xF8, 0xF0, 3*6, 0x1FFFFF, 0x10000, /* 4 byte sequence */}, + {0xFC, 0xF8, 4*6, 0x3FFFFFF, 0x200000, /* 5 byte sequence */}, + {0xFE, 0xFC, 5*6, 0x7FFFFFFF, 0x4000000, /* 6 byte sequence */}, + {0, 0, 0, 0, 0, /* end of table */} +}; + +int utf8_mbtowc(uint32_t *p, const unsigned char *s, int n) +{ + uint32_t l; + int c0, c, nc; + struct utf8_table *t; + + nc = 0; + c0 = *s; + l = c0; + for (t = utf8_table; t->cmask; t++) { + nc++; + if ((c0 & t->cmask) == t->cval) { + l &= t->lmask; + if (l < t->lval) + return -1; + *p = l; + return nc; + } + if (n <= nc) + return -1; + s++; + c = (*s ^ 0x80) & 0xFF; + if (c & 0xC0) + return -1; + l = (l << 6) | c; + } + return -1; +} + +int utf8_wctomb(unsigned char *s, uint32_t wc, int maxlen) +{ + uint32_t l; + int c, nc; + struct utf8_table *t; + + l = wc; + nc = 0; + for (t = utf8_table; t->cmask && maxlen; t++, maxlen--) { + nc++; + if (l <= t->lmask) { + c = t->shift; + *s = t->cval | (l >> c); + while (c > 0) { + c -= 6; + s++; + *s = 0x80 | ((l >> c) & 0x3F); + } + return nc; + } + } + return -1; +} +/*----------=> End of Import <=----------*/ + +int utf8_mb_remain(char c) +{ + int i; + for (i = 0; i < 5; ++i) { + if ((c & utf8_table[i].cmask) == utf8_table[i].cval) break; + } + return i; +} + + +void CQueuedData::Write(const void *data, size_t len) +{ + const size_t canWrite = std::min(GetRemLength(), len); + wxASSERT(len == canWrite); + + memcpy(m_wr_ptr, data, canWrite); + m_wr_ptr += canWrite; +} + + +void CQueuedData::WriteAt(const void *data, size_t len, size_t offset) +{ + wxASSERT(len + offset <= m_data.size()); + if (offset > m_data.size()) { + return; + } else if (offset + len > m_data.size()) { + len = m_data.size() - offset; + } + + memcpy(&m_data[0] + offset, data, len); +} + + +void CQueuedData::Read(void *data, size_t len) +{ + const size_t canRead = std::min(GetUnreadDataLength(), len); + wxASSERT(len == canRead); + + memcpy(data, m_rd_ptr, canRead); + m_rd_ptr += canRead; +} + + +void CQueuedData::WriteToSocket(CECSocket *sock) +{ + wxCHECK_RET(m_rd_ptr < m_wr_ptr, + wxT("Reading past written data in WriteToSocket")); + + sock->SocketWrite(m_rd_ptr, GetUnreadDataLength()); + m_rd_ptr += sock->GetLastCount(); +} + + +void CQueuedData::ReadFromSocket(CECSocket *sock, size_t len) +{ + const size_t canWrite = std::min(GetRemLength(), len); + wxASSERT(len == canWrite); + + sock->SocketRead(m_wr_ptr, canWrite); + m_wr_ptr += sock->GetLastCount(); +} + + +size_t CQueuedData::ReadFromSocketAll(CECSocket *sock, size_t len) +{ + size_t read_rem = std::min(GetRemLength(), len); + wxASSERT(read_rem == len); + + // We get here when socket is truly blocking + do { + // Give socket a 10 sec chance to recv more data. + if ( !sock->WaitSocketRead(10, 0) ) { + break; + } + + wxASSERT(m_wr_ptr + read_rem <= &m_data[0] + m_data.size()); + sock->SocketRead(m_wr_ptr, read_rem); + m_wr_ptr += sock->GetLastCount(); + read_rem -= sock->GetLastCount(); + + if (sock->SocketError() && !sock->WouldBlock()) { + break; + } + } while (read_rem); + + return len - read_rem; +} + + +size_t CQueuedData::GetLength() const +{ + return m_data.size(); +} + + +size_t CQueuedData::GetDataLength() const +{ + const size_t len = m_wr_ptr - &m_data[0]; + wxCHECK_MSG(len <= m_data.size(), m_data.size(), + wxT("Write-pointer past end of buffer")); + + return len; +} + + +size_t CQueuedData::GetRemLength() const +{ + return m_data.size() - GetDataLength(); +} + + +size_t CQueuedData::GetUnreadDataLength() const +{ + wxCHECK_MSG(m_wr_ptr >= m_rd_ptr, 0, + wxT("Read position past write position.")); + + return m_wr_ptr - m_rd_ptr; +} + + + +// +// CECSocket API - User interface functions +// + +CECSocket::CECSocket(bool use_events) +: +m_use_events(use_events), +m_output_queue(), +m_in_ptr(EC_SOCKET_BUFFER_SIZE), +m_out_ptr(EC_SOCKET_BUFFER_SIZE), +m_curr_rx_data(new CQueuedData(EC_SOCKET_BUFFER_SIZE)), +m_curr_tx_data(new CQueuedData(EC_SOCKET_BUFFER_SIZE)), +m_rx_flags(0), +m_tx_flags(0), +m_my_flags(0x20 | EC_FLAG_ZLIB | EC_FLAG_UTF8_NUMBERS | EC_FLAG_ACCEPTS), +// setup initial state: 4 flags + 4 length +m_bytes_needed(8), +m_in_header(true) +{ + +} + +CECSocket::~CECSocket() +{ + while (!m_output_queue.empty()) { + CQueuedData *data = m_output_queue.front(); + m_output_queue.pop_front(); + delete data; + } +} + +bool CECSocket::ConnectSocket(uint32_t ip, uint16_t port) +{ + bool res = InternalConnect(ip, port, false); + if ( !m_use_events ) { + res = WaitSocketConnect(10, 0); + if ( res ) { + OnConnect(); + } else { + OnLost(); + } + } + return !SocketError(); +} + +void CECSocket::SendPacket(const CECPacket *packet) +{ + WritePacket(packet); + OnOutput(); +} + +const CECPacket *CECSocket::SendRecvPacket(const CECPacket *packet) +{ + SendPacket(packet); + m_curr_rx_data->ReadFromSocketAll(this, 2 * sizeof(uint32_t)); + if (SocketError() && !WouldBlock()) { + OnError(); + return 0; + } + + m_curr_rx_data->Read(&m_rx_flags, sizeof(m_rx_flags)); + m_rx_flags = ENDIAN_NTOHL(m_rx_flags); + m_curr_rx_data->Read(&m_curr_packet_len, sizeof(m_curr_packet_len)); + m_curr_packet_len = ENDIAN_NTOHL(m_curr_packet_len); + + if ( m_curr_rx_data->GetLength() < (m_curr_packet_len+2*sizeof(uint32_t)) ) { + m_curr_rx_data.reset(new CQueuedData(m_curr_packet_len)); + } + m_curr_rx_data->ReadFromSocketAll(this, m_curr_packet_len); + if (SocketError() && !WouldBlock()) { + OnError(); + return 0; + } + const CECPacket *reply = ReadPacket(); + m_curr_rx_data->Rewind(); + return reply; +} + +std::string CECSocket::GetLastErrorMsg() +{ + int code = InternalGetLastError(); + switch(code) { + case EC_ERROR_NOERROR: + return "No error happened"; + case EC_ERROR_INVOP: + return "Invalid operation"; + case EC_ERROR_IOERR: + return "Input/Output error"; + case EC_ERROR_INVADDR: + return "Invalid address passed to wxSocket"; + case EC_ERROR_INVSOCK: + return "Invalid socket (uninitialized)"; + case EC_ERROR_NOHOST: + return "No corresponding host"; + case EC_ERROR_INVPORT: + return "Invalid port"; + case EC_ERROR_WOULDBLOCK: + return "The socket is non-blocking and the operation would block"; + case EC_ERROR_TIMEDOUT: + return "The timeout for this operation expired"; + case EC_ERROR_MEMERR: + return "Memory exhausted"; + case EC_ERROR_DUMMY: + return "Dummy code - should not happen"; + } + ostringstream error_string; + error_string << "Error code " << code << " unknown."; + return error_string.str(); +} + +void CECSocket::OnError() +{ +#ifdef __DEBUG__ + cout << GetLastErrorMsg() << endl; +#endif +} + +void CECSocket::OnLost() +{ +} + +// +// Event handlers +// +void CECSocket::OnConnect() +{ +} + +void CECSocket::OnInput() +{ + size_t bytes_rx = 0; + do { + if (m_curr_rx_data.get()) { + m_curr_rx_data->ReadFromSocket(this, m_bytes_needed); + } else { + return; + } + if (SocketError() && !WouldBlock()) { + OnError(); + // socket already disconnected in this point + m_curr_rx_data.reset(0); + return; + } + bytes_rx = GetLastCount(); + m_bytes_needed -= bytes_rx; + } while (m_bytes_needed && bytes_rx); + + if (!m_bytes_needed) { + if (m_in_header) { + m_in_header = false; + m_curr_rx_data->Read(&m_rx_flags, sizeof(m_rx_flags)); + m_rx_flags = ENDIAN_NTOHL(m_rx_flags); + if (m_rx_flags & EC_FLAG_ACCEPTS) { + // Client sends its capabilities, update the internal mask. + m_curr_rx_data->Read(&m_my_flags, sizeof(m_my_flags)); + m_my_flags = ENDIAN_NTOHL(m_my_flags); + //printf("Reading accepts mask: %x\n", m_my_flags); + wxASSERT(m_my_flags & 0x20); + // There has to be 4 more bytes. THERE HAS TO BE, DAMN IT. + m_curr_rx_data->ReadFromSocketAll(this, sizeof(m_curr_packet_len)); + } + m_curr_rx_data->Read(&m_curr_packet_len, sizeof(m_curr_packet_len)); + m_curr_packet_len = ENDIAN_NTOHL(m_curr_packet_len); + m_bytes_needed = m_curr_packet_len; + // packet bigger that 16Mb looks more like broken request + if (m_bytes_needed > 16*1024*1024) { + CloseSocket(); + return; + } + size_t needed_size = m_bytes_needed + ((m_rx_flags & EC_FLAG_ACCEPTS) ? 12 : 8); + if (!m_curr_rx_data.get() || + m_curr_rx_data->GetLength() < needed_size) { + m_curr_rx_data.reset(new CQueuedData(needed_size)); + } + //#warning Kry TODO: Read packet? + } else { + //m_curr_rx_data->DumpMem(); + std::auto_ptr packet(ReadPacket()); + m_curr_rx_data->Rewind(); + if (packet.get()) { + std::auto_ptr reply(OnPacketReceived(packet.get())); + if (reply.get()) { + SendPacket(reply.get()); + } + } + m_bytes_needed = 8; + m_in_header = true; + } + } +} + +void CECSocket::OnOutput() +{ + while (!m_output_queue.empty()) { + CQueuedData* data = m_output_queue.front(); + data->WriteToSocket(this); + if (!data->GetUnreadDataLength()) { + m_output_queue.pop_front(); + delete data; + } + if (SocketError()) { + if (WouldBlock()) { + if ( m_use_events ) { + return; + } else { + if ( !WaitSocketWrite(10, 0) ) { + if (WouldBlock()) { + continue; + } else { + OnError(); + break; + } + } + } + } else { + OnError(); + return; + } + } + } +} + +// +// Socket I/O +// + +size_t CECSocket::ReadBufferFromSocket(void *buffer, size_t required_len) +{ + wxASSERT(required_len); + + if (m_curr_rx_data->GetUnreadDataLength() < required_len) { + // need more data that we have. Looks like nothing will help here + return 0; + } + m_curr_rx_data->Read(buffer, required_len); + return required_len; +} + +void CECSocket::WriteBufferToSocket(const void *buffer, size_t len) +{ + unsigned char *wr_ptr = (unsigned char *)buffer; + while ( len ) { + size_t curr_free = m_curr_tx_data->GetRemLength(); + if ( len > curr_free ) { + + m_curr_tx_data->Write(wr_ptr, curr_free); + len -= curr_free; + wr_ptr += curr_free; + m_output_queue.push_back(m_curr_tx_data.release()); + m_curr_tx_data.reset(new CQueuedData(EC_SOCKET_BUFFER_SIZE)); + } else { + m_curr_tx_data->Write(wr_ptr, len); + break; + } + } +} + + +// +// ZLib "error handler" +// + +void ShowZError(int zerror, z_streamp strm) +{ + const char *p = NULL; + + switch (zerror) { + case Z_STREAM_END: p = "Z_STREAM_END"; break; + case Z_NEED_DICT: p = "Z_NEED_DICT"; break; + case Z_ERRNO: p = "Z_ERRNO"; break; + case Z_STREAM_ERROR: p = "Z_STREAM_ERROR"; break; + case Z_DATA_ERROR: p = "Z_DATA_ERROR"; break; + case Z_MEM_ERROR: p = "Z_MEM_ERROR"; break; + case Z_BUF_ERROR: p = "Z_BUF_ERROR"; break; + case Z_VERSION_ERROR: p = "Z_VERSION_ERROR"; break; + } + printf("ZLib operation returned %s\n", p); + printf("ZLib error message: %s\n", strm->msg); + printf("zstream state:\n\tnext_in=%p\n\tavail_in=%u\n\ttotal_in=%lu\n\tnext_out=%p\n\tavail_out=%u\n\ttotal_out=%lu\n", + strm->next_in, strm->avail_in, strm->total_in, strm->next_out, strm->avail_out, strm->total_out); +} + + +bool CECSocket::ReadNumber(void *buffer, size_t len) +{ + if (m_rx_flags & EC_FLAG_UTF8_NUMBERS) { + unsigned char mb[6]; + uint32_t wc; + if (!ReadBuffer(mb, 1)) return false; + int remains = utf8_mb_remain(mb[0]); + if (remains) if (!ReadBuffer(&(mb[1]), remains)) return false; + if (utf8_mbtowc(&wc, mb, 6) == -1) return false; // Invalid UTF-8 code sequence + switch (len) { + case 1: PokeUInt8( buffer, wc ); break; + case 2: RawPokeUInt16( buffer, wc ); break; + case 4: RawPokeUInt32( buffer, wc ); break; + } + } else { + if ( !ReadBuffer(buffer, len) ) { + return false; + } + switch (len) { + case 2: + RawPokeUInt16( buffer, ENDIAN_NTOHS( RawPeekUInt16( buffer ) ) ); + break; + case 4: + RawPokeUInt32( buffer, ENDIAN_NTOHL( RawPeekUInt32( buffer ) ) ); + break; + } + } + return true; +} + +bool CECSocket::WriteNumber(const void *buffer, size_t len) +{ + if (m_tx_flags & EC_FLAG_UTF8_NUMBERS) { + unsigned char mb[6]; + uint32_t wc = 0; + int mb_len; + switch (len) { + case 1: wc = PeekUInt8( buffer ); break; + case 2: wc = RawPeekUInt16( buffer ); break; + case 4: wc = RawPeekUInt32( buffer ); break; + default: return false; + } + if ((mb_len = utf8_wctomb(mb, wc, 6)) == -1) return false; // Something is terribly wrong... + return WriteBuffer(mb, mb_len); + } else { + char tmp[8]; + + switch (len) { + case 1: PokeUInt8( tmp, PeekUInt8( buffer ) ); break; + case 2: RawPokeUInt16( tmp, ENDIAN_NTOHS( RawPeekUInt16( buffer ) ) ); break; + case 4: RawPokeUInt32( tmp, ENDIAN_NTOHL( RawPeekUInt32( buffer ) ) ); break; + } + return WriteBuffer(tmp, len); + } +} + +bool CECSocket::ReadBuffer(void *buffer, size_t len) +{ + if (m_rx_flags & EC_FLAG_ZLIB) { + if ( !m_z.avail_in ) { + // no reason for this situation: all packet should be + // buffered by now + return false; + } + m_z.avail_out = len; + m_z.next_out = (Bytef*)buffer; + int zerror = inflate(&m_z, Z_SYNC_FLUSH); + if ((zerror != Z_OK) && (zerror != Z_STREAM_END)) { + ShowZError(zerror, &m_z); + return false; + } + return true; + } else { + // using uncompressed buffered i/o + return ReadBufferFromSocket(buffer, len) == len; + } +} + +bool CECSocket::WriteBuffer(const void *buffer, size_t len) +{ + if (m_tx_flags & EC_FLAG_ZLIB) { + + unsigned char *rd_ptr = (unsigned char *)buffer; + do { + unsigned int remain_in = EC_SOCKET_BUFFER_SIZE - m_z.avail_in; + if ( remain_in >= len ) { + memcpy(m_z.next_in+m_z.avail_in, rd_ptr, len); + m_z.avail_in += len; + len = 0; + } else { + memcpy(m_z.next_in+m_z.avail_in, rd_ptr, remain_in); + m_z.avail_in += remain_in; + len -= remain_in; + rd_ptr += remain_in; + // buffer is full, calling zlib + do { + m_z.next_out = &m_out_ptr[0]; + m_z.avail_out = EC_SOCKET_BUFFER_SIZE; + int zerror = deflate(&m_z, Z_NO_FLUSH); + if ( zerror != Z_OK ) { + ShowZError(zerror, &m_z); + return false; + } + WriteBufferToSocket(&m_out_ptr[0], + EC_SOCKET_BUFFER_SIZE - m_z.avail_out); + } while ( m_z.avail_out == 0 ); + // all input should be used by now + wxASSERT(m_z.avail_in == 0); + m_z.next_in = &m_in_ptr[0]; + } + } while ( len ); + return true; + } else { + // using uncompressed buffered i/o + WriteBufferToSocket(buffer, len); + return true; + } +} + +bool CECSocket::FlushBuffers() +{ + if (m_tx_flags & EC_FLAG_ZLIB) { + do { + m_z.next_out = &m_out_ptr[0]; + m_z.avail_out = EC_SOCKET_BUFFER_SIZE; + int zerror = deflate(&m_z, Z_FINISH); + if ( zerror == Z_STREAM_ERROR ) { + ShowZError(zerror, &m_z); + return false; + } + WriteBufferToSocket(&m_out_ptr[0], + EC_SOCKET_BUFFER_SIZE - m_z.avail_out); + } while ( m_z.avail_out == 0 ); + } + if ( m_curr_tx_data->GetDataLength() ) { + m_output_queue.push_back(m_curr_tx_data.release()); + m_curr_tx_data.reset(new CQueuedData(EC_SOCKET_BUFFER_SIZE)); + } + return true; +} + +// +// Packet I/O +// + +void CECSocket::WritePacket(const CECPacket *packet) +{ + if (SocketError()) { + return; + } + + uint32_t flags = 0x20; + + if ( packet->GetPacketLength() > EC_MAX_UNCOMPRESSED ) { + flags |= EC_FLAG_ZLIB; + } else { + flags |= EC_FLAG_UTF8_NUMBERS; + } + + flags &= m_my_flags; + m_tx_flags = flags; + + if (flags & EC_FLAG_ZLIB) { + m_z.zalloc = Z_NULL; + m_z.zfree = Z_NULL; + m_z.opaque = Z_NULL; + m_z.avail_in = 0; + m_z.next_in = &m_in_ptr[0]; + int zerror = deflateInit(&m_z, EC_COMPRESSION_LEVEL); + if (zerror != Z_OK) { + // don't use zlib if init failed + flags &= ~EC_FLAG_ZLIB; + ShowZError(zerror, &m_z); + } + } + + uint32_t tmp_flags = ENDIAN_HTONL(flags/* | EC_FLAG_ACCEPTS*/); + WriteBufferToSocket(&tmp_flags, sizeof(uint32)); + +/* uint32_t tmp_accepts_flags = ENDIAN_HTONL(m_my_flags); + WriteBufferToSocket(&tmp_accepts_flags, sizeof(uint32));*/ + + // preallocate 4 bytes in buffer for packet length + uint32_t packet_len = 0; + WriteBufferToSocket(&packet_len, sizeof(uint32)); + + packet->WritePacket(*this); + + FlushBuffers(); + + // now calculate actual size of data + packet_len = m_curr_tx_data->GetDataLength(); + for(std::deque::iterator i = m_output_queue.begin(); i != m_output_queue.end(); i++) { + packet_len += (*i)->GetDataLength(); + } + // 4 flags and 4 length are not counted + packet_len -= 8; + // now write actual length @ offset 4 + packet_len = ENDIAN_HTONL(packet_len); + + CQueuedData *first_buff = m_output_queue.front(); + if ( !first_buff ) first_buff = m_curr_tx_data.get(); + first_buff->WriteAt(&packet_len, sizeof(uint32_t), sizeof(uint32_t)); + + if (flags & EC_FLAG_ZLIB) { + int zerror = deflateEnd(&m_z); + if ( zerror != Z_OK ) { + ShowZError(zerror, &m_z); + return; + } + } +} + + +const CECPacket *CECSocket::ReadPacket() +{ + CECPacket *packet = 0; + + uint32_t flags = m_rx_flags; + + if ( ((flags & 0x60) != 0x20) || (flags & EC_FLAG_UNKNOWN_MASK) ) { + // Protocol error - other end might use an older protocol + cout << "ReadPacket: packet have invalid flags " << flags << endl; + CloseSocket(); + return 0; + } + + if (flags & EC_FLAG_ZLIB) { + + m_z.zalloc = Z_NULL; + m_z.zfree = Z_NULL; + m_z.opaque = Z_NULL; + m_z.avail_in = 0; + m_z.next_in = 0; + + int zerror = inflateInit(&m_z); + if (zerror != Z_OK) { + ShowZError(zerror, &m_z); + cout << "ReadPacket: failed zlib init" << endl; + CloseSocket(); + return 0; + } + } + + m_curr_rx_data->ToZlib(m_z); + packet = new CECPacket(*this); + packet->ReadFromSocket(*this); + + if (packet->m_error != 0) { + cout << "ReadPacket: error " << packet->m_error << "in packet read" << endl; + delete packet; + packet = NULL; + CloseSocket(); + } + + if (flags & EC_FLAG_ZLIB) { + int zerror = inflateEnd(&m_z); + if ( zerror != Z_OK ) { + ShowZError(zerror, &m_z); + cout << "ReadPacket: failed zlib free" << endl; + CloseSocket(); + } + } + + return packet; +} + +const CECPacket *CECSocket::OnPacketReceived(const CECPacket *) +{ + return 0; +} +// File_checked_for_headers diff --git a/src/libs/ec/cpp/ECSocket.h b/src/libs/ec/cpp/ECSocket.h new file mode 100644 index 00000000..afe05b39 --- /dev/null +++ b/src/libs/ec/cpp/ECSocket.h @@ -0,0 +1,292 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2004-2008 Angel Vidal Veiga ( kry@users.sourceforge.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef ECSOCKET_H +#define ECSOCKET_H + + +#include // Needed for std::deque +#include // Needed for std::auto_ptr // Do_not_auto_remove (mingw-gcc-3.4.5) +#include +#include + +#include // Needed for packet (de)compression +#include "../../../Types.h" // Needed for uint32_t + +#include // Needed for wx/debug.h +#include // Needed for wxASSERT + +enum ECSocketErrors { + EC_ERROR_NOERROR, + EC_ERROR_INVOP, + EC_ERROR_IOERR, + EC_ERROR_INVADDR, + EC_ERROR_INVSOCK, + EC_ERROR_NOHOST, + EC_ERROR_INVPORT, + EC_ERROR_WOULDBLOCK, + EC_ERROR_TIMEDOUT, + EC_ERROR_MEMERR, + EC_ERROR_DUMMY, + EC_ERROR_UNKNOWN +}; + +class CECPacket; +class CQueuedData; + +/*! \class CECSocket + * + * \brief Socket handler for External Communications (EC). + * + * CECSocket takes care of the transmission of EC packets + */ + +class CECSocket{ + friend class CECPacket; + friend class CECTag; + +private: + static const unsigned int EC_SOCKET_BUFFER_SIZE = 2048; + const bool m_use_events; + + // Output related data + std::deque m_output_queue; + + // zlib (deflation) buffers + std::vector m_in_ptr; + std::vector m_out_ptr; + std::auto_ptr m_curr_rx_data; + std::auto_ptr m_curr_tx_data; + + // This transfer only + uint32_t m_rx_flags; + uint32_t m_tx_flags; + uint32_t m_my_flags; + size_t m_bytes_needed; + bool m_in_header; + + + uint32_t m_curr_packet_len; + z_stream m_z; + +public: + CECSocket(bool use_events); + virtual ~CECSocket(); + + bool ConnectSocket(uint32_t ip, uint16_t port); + + void CloseSocket() { InternalClose(); } + + /** + * Sends an EC packet and returns immediately. + * + * @param packet The CECPacket packet to be sent. + * + * This is an asynchronous call, the function returns + * immediately and the packet is sent on idle time. + * + * @note It's the caller's responsibilty to \c delete + * the \e packet. + */ + void SendPacket(const CECPacket *packet); + + /** + * Sends an EC packet and waits for a reply. + * + * @param request The CECPacket packet to be sent. + * @return The reply packet for the request. + * + * Unlike SendPacket(), this call is synchronous and blocking. + * The packet is sent immediately (or at least as soon as possible), + * and the function does not return until a reply is received, + * or a timeout encountered. + * + * The returned packet will be allocated on the heap with \c new, + * or \c NULL is returned in case of an error (timeout). + * + * @note It's the caller's responsibilty to \c delete both + * request and reply. + * + * @note OnPacketReceived() won't be called for packets + * received via this function. + */ + const CECPacket *SendRecvPacket(const CECPacket *request); + + /** + * Event handler function called when a new packet is received. + * + * @param packet The packet that has been received. + * @return The reply packet or \c NULL if no reply needed. + * + * In this function the application should process the received + * packet, and create a reply if necessary. The reply must be allocated + * on the heap with \c new. If no reply is necessary, the return + * value of the function should be \c NULL. The library will \c delete + * both packets. + * + * @note This function won't be called for packets received via the + * SendRecvPacket() function. + */ + virtual const CECPacket *OnPacketReceived(const CECPacket *packet); + + /** + * Get a message describing the error. + * + * @param error The code of the error for which a message should be returned. + * @return The text descibing the error. + */ + virtual std::string GetLastErrorMsg(); + + /** + * Error handler. + * + * This function is called when an error occurs. Use GetLastError() and + * GetErrorMsg() to find out the nature of the error. + * + * The default error handler prints out an error message in debug builds, + * and destroys the socket. + */ + virtual void OnError(); + + + /** + * Socket lost event handler. + * + * This function is called when the socket is lost (either because of a network + * failure or because the remote end closed the socket gracefully). + * + * The default handler destroys the socket. + */ + virtual void OnLost(); + + /** + * Event handler for connection events. + * + * This function is called when a connection attempt succeeds. When CECSocket + * is compiled with ECSOCKET_USE_EVENTS == 0, WaitOnConnect() should be called + * for this to work. + */ + virtual void OnConnect(); + + void OnInput(); + void OnOutput(); + + bool WouldBlock() { return InternalGetLastError() == EC_ERROR_WOULDBLOCK; } + bool GotError() { return InternalGetLastError() != EC_ERROR_NOERROR; } + + void SocketRead(void* ptr, uint32_t len) { InternalRead(ptr,len); } + void SocketWrite(const void* ptr, uint32_t len) { InternalWrite(ptr,len); } + bool SocketError() { return InternalError() && GotError(); } + + uint32_t GetLastCount() { return InternalLastCount(); } + bool WaitSocketConnect(long secs = -1, long msecs = 0) { return InternalWaitOnConnect(secs,msecs); } + bool WaitSocketWrite(long secs = -1, long msecs = 0) { return InternalWaitForWrite(secs,msecs); } + bool WaitSocketRead(long secs = -1, long msecs = 0) { return InternalWaitForRead(secs,msecs); } + + bool IsSocketConnected() { return InternalIsConnected(); } + + void DestroySocket() { return InternalDestroy(); } + + private: + const CECPacket *ReadPacket(); + void WritePacket(const CECPacket *packet); + + // These 4 methods are to be used by CECPacket & CECTag + bool ReadNumber(void *buffer, size_t len); + bool ReadBuffer(void *buffer, size_t len); + + bool WriteNumber(const void *buffer, size_t len); + bool WriteBuffer(const void *buffer, size_t len); + + // Internal stuff + bool FlushBuffers(); + + size_t ReadBufferFromSocket(void *buffer, size_t len); + void WriteBufferToSocket(const void *buffer, size_t len); + + /* virtuals */ + virtual bool InternalConnect(uint32_t ip, uint16_t port, bool wait) = 0; + + virtual uint32_t InternalLastCount() = 0; + virtual bool InternalWaitOnConnect(long secs = -1, long msecs = 0) = 0; + virtual bool InternalWaitForWrite(long secs = -1, long msecs = 0) = 0; + virtual bool InternalWaitForRead(long secs = -1, long msecs = 0) = 0; + + virtual int InternalGetLastError() = 0; + + virtual void InternalClose() = 0; + virtual bool InternalError() = 0; + virtual void InternalRead(void* ptr, uint32_t len) = 0; + virtual void InternalWrite(const void* ptr, uint32_t len) = 0; + + virtual bool InternalIsConnected() = 0; + virtual void InternalDestroy() = 0; +}; + + +class CQueuedData +{ + std::vector m_data; + unsigned char *m_rd_ptr, *m_wr_ptr; +public: + CQueuedData(size_t len) + : + m_data(len) + { + m_rd_ptr = m_wr_ptr = &m_data[0]; + } + + ~CQueuedData() {} + + void Rewind() + { + m_rd_ptr = m_wr_ptr = &m_data[0]; + } + + void Write(const void *data, size_t len); + void WriteAt(const void *data, size_t len, size_t off); + void Read(void *data, size_t len); + + /* + * Pass pointers to zlib. From now on, no Read() calls are allowed + */ + void ToZlib(z_stream &m_z) + { + m_z.avail_in = GetUnreadDataLength(); + m_z.next_in = m_rd_ptr; + } + + void WriteToSocket(CECSocket *sock); + void ReadFromSocket(CECSocket *sock, size_t len); + + size_t ReadFromSocketAll(CECSocket *sock, size_t len); + + size_t GetLength() const; + size_t GetDataLength() const; + size_t GetRemLength() const; + size_t GetUnreadDataLength() const; +}; + +#endif // ECSOCKET_H diff --git a/src/libs/ec/cpp/ECSpecialTags.cpp b/src/libs/ec/cpp/ECSpecialTags.cpp new file mode 100644 index 00000000..394f42f3 --- /dev/null +++ b/src/libs/ec/cpp/ECSpecialTags.cpp @@ -0,0 +1,159 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 Kry ( elkry@sourceforge.net / http://www.amule.org ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "ECTag.h" // Needed for CECTag +#include "ECSpecialTags.h" // Needed for special EC tag creator classes + +#include // Needed for CFormat + +#include "../../../KnownFile.h" // Needed for PS_* + +wxString CEC_PartFile_Tag::GetFileStatusString() +{ + uint8 nFileStatus = FileStatus(); + + if ((nFileStatus == PS_HASHING) || (nFileStatus == PS_WAITINGFORHASH)) { + return _("Hashing"); + } else { + switch (nFileStatus) { + case PS_COMPLETING: + return _("Completing"); + case PS_COMPLETE: + return _("Complete"); + case PS_PAUSED: + return _("Paused"); + case PS_ERROR: + return _("Erroneous"); + default: + if (SourceXferCount() > 0) { + return _("Downloading"); + } else { + return _("Waiting"); + } + } + // if stopped + } +} + +// +// Search request +// +CEC_Search_Tag::CEC_Search_Tag(const wxString &name, EC_SEARCH_TYPE search_type, const wxString &file_type, + const wxString &extension, uint32 avail, uint32 min_size, uint32 max_size) : CECTag(EC_TAG_SEARCH_TYPE, (uint32)search_type) +{ + AddTag(CECTag(EC_TAG_SEARCH_NAME, name)); + AddTag(CECTag(EC_TAG_SEARCH_FILE_TYPE, file_type)); + if ( !extension.IsEmpty() ) { + AddTag(CECTag(EC_TAG_SEARCH_EXTENSION, extension)); + } + if ( avail ) { + AddTag(CECTag(EC_TAG_SEARCH_AVAILABILITY, avail)); + } + if ( min_size != 0 ) { + AddTag(CECTag(EC_TAG_SEARCH_MIN_SIZE, min_size)); + } + if ( max_size != 0 ) { + AddTag(CECTag(EC_TAG_SEARCH_MAX_SIZE, max_size)); + } +} + +void FormatValue(CFormat& format, const CECTag* tag) +{ + wxASSERT(tag->GetTagName() == EC_TAG_STAT_NODE_VALUE); + + wxString extra; + const CECTag *tmp_tag = tag->GetTagByName(EC_TAG_STAT_NODE_VALUE); + if (tmp_tag) { + wxString tmp_fmt; + const CECTag* tmp_vt = tmp_tag->GetTagByName(EC_TAG_STAT_VALUE_TYPE); + EC_STATTREE_NODE_VALUE_TYPE tmp_valueType = tmp_vt != NULL ? (EC_STATTREE_NODE_VALUE_TYPE)tmp_vt->GetInt() : EC_VALUE_INTEGER; + switch (tmp_valueType) { + case EC_VALUE_INTEGER: + tmp_fmt = wxT("%llu"); + break; + case EC_VALUE_DOUBLE: + tmp_fmt = wxT("%.2f%%"); // it's used for percentages + break; + default: + tmp_fmt = wxT("%s"); + } + CFormat tmp_format(wxT(" (") + tmp_fmt + wxT(")")); + FormatValue(tmp_format, tmp_tag); + extra = tmp_format.GetString(); + } + + const CECTag* vt = tag->GetTagByName(EC_TAG_STAT_VALUE_TYPE); + EC_STATTREE_NODE_VALUE_TYPE valueType = vt != NULL ? (EC_STATTREE_NODE_VALUE_TYPE)vt->GetInt() : EC_VALUE_INTEGER; + switch (valueType) { + case EC_VALUE_INTEGER: + format = format % tag->GetInt(); + break; + case EC_VALUE_ISTRING: + format = format % (wxString::Format(wxT("%") wxLongLongFmtSpec wxT("u"), tag->GetInt()) + extra); + break; + case EC_VALUE_BYTES: + format = format % (CastItoXBytes(tag->GetInt()) + extra); + break; + case EC_VALUE_ISHORT: + format = format % (CastItoIShort(tag->GetInt()) + extra); + break; + case EC_VALUE_TIME: + format = format % (CastSecondsToHM(tag->GetInt()) + extra); + break; + case EC_VALUE_SPEED: + format = format % (CastItoSpeed(tag->GetInt()) + extra); + break; + case EC_VALUE_STRING: + format = format % (wxGetTranslation(tag->GetStringData()) + extra); + break; + case EC_VALUE_DOUBLE: + format = format % tag->GetDoubleData(); + break; + default: + wxASSERT(0); + } +} + +wxString CEC_StatTree_Node_Tag::GetDisplayString() const +{ + wxString en_label = GetStringData(); + wxString my_label = wxGetTranslation(en_label); + // This is needed for client names, for example + if (my_label == en_label) { + if (en_label.Right(4) == wxT(": %s")) { + my_label = wxGetTranslation(en_label.Mid(0, en_label.Length() - 4)) + wxString(wxT(": %s")); + } + } + CFormat label(my_label); + for (int i = 0; i < GetTagCount(); ++i) { + const CECTag *tmp = GetTagByIndex(i); + if (tmp->GetTagName() == EC_TAG_STAT_NODE_VALUE) { + FormatValue(label, tmp); + } + } + return label.GetString(); +} +// File_checked_for_headers diff --git a/src/libs/ec/cpp/ECSpecialTags.h b/src/libs/ec/cpp/ECSpecialTags.h new file mode 100644 index 00000000..e6d51578 --- /dev/null +++ b/src/libs/ec/cpp/ECSpecialTags.h @@ -0,0 +1,372 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef ECSPECIALTAGS_H +#define ECSPECIALTAGS_H + +//#warning Kry - Preferences packet derived from packet, and that's ok, but shouldn't be here because this is a tag file and forces a stupid include +#include "ECPacket.h" // Needed for CECPacket +#include "../../../NetworkFunctions.h" // Needed for IsLowID + + +#include + +/* + * Specific tags for specific requests + * + * \note EC remote end does not need to create these packets, + * only using the getter functions. + * + * Regarding this, those classes are removed from remote build, + * that have only a constructor. + */ + +class CServer; +class CKnownFile; +class CPartFile; +class CSearchFile; +class CUpDownClient; + +/* + * EC tags encoder. Idea: if for an object , client tag have value equal to previous + * request, skip this tag. + */ + +class CValueMap { + /* + * Tag -> LastValue map. Hold last value that transmitted to remote side + */ + std::map m_map_uint8; + std::map m_map_uint16; + std::map m_map_uint32; + std::map m_map_uint64; + std::map m_map_md4; + std::map m_map_string; + + template + void CreateTagT(ec_tagname_t tagname, T value, std::map &map, CECTag *parent) + { + if ( (map.count(tagname) == 0) || (map[tagname] != value) ) { + parent->AddTag(CECTag(tagname, value)); + map[tagname] = value; + } + } + public: + CValueMap() + { + } + + CValueMap(const CValueMap &valuemap) + { + m_map_uint8 = valuemap.m_map_uint8; + m_map_uint16 = valuemap.m_map_uint16; + m_map_uint32 = valuemap.m_map_uint32; + m_map_uint64 = valuemap.m_map_uint64; + m_map_md4 = valuemap.m_map_md4; + m_map_string = valuemap.m_map_string; + } + + ~CValueMap() + { + } + + void CreateTag(ec_tagname_t tagname, uint8 value, CECTag *parent) + { + CreateTagT(tagname, value, m_map_uint8, parent); + } + + void CreateTag(ec_tagname_t tagname, uint16 value, CECTag *parent) + { + CreateTagT(tagname, value, m_map_uint16, parent); + } + + void CreateTag(ec_tagname_t tagname, uint32 value, CECTag *parent) + { + CreateTagT(tagname, value, m_map_uint32, parent); + } + + void CreateTag(ec_tagname_t tagname, uint64 value, CECTag *parent) + { + CreateTagT(tagname, value, m_map_uint64, parent); + } + + void CreateTag(ec_tagname_t tagname, CMD4Hash value, CECTag *parent) + { + CreateTagT(tagname, value, m_map_md4, parent); + } + + void CreateTag(ec_tagname_t tagname, wxString value, CECTag *parent) + { + CreateTagT(tagname, value, m_map_string, parent); + } +}; + +class CEC_Category_Tag : public CECTag { + public: + CEC_Category_Tag(uint32 cat_index, EC_DETAIL_LEVEL detail_level = EC_DETAIL_FULL); + // for create-upate commands + CEC_Category_Tag(uint32 cat_index, wxString name, wxString path, + wxString comment, uint32 color, uint8 prio); + + void Apply(); + void Create(); + + wxString Name() { return GetTagByNameSafe(EC_TAG_CATEGORY_TITLE)->GetStringData(); } + wxString Path() { return GetTagByNameSafe(EC_TAG_CATEGORY_PATH)->GetStringData(); } + wxString Comment() { return GetTagByNameSafe(EC_TAG_CATEGORY_COMMENT)->GetStringData(); } + uint8 Prio() { return GetTagByNameSafe(EC_TAG_CATEGORY_PRIO)->GetInt(); } + uint32 Color() { return GetTagByNameSafe(EC_TAG_CATEGORY_COLOR)->GetInt(); } + +}; + +class CEC_Prefs_Packet : public CECPacket { + public: + CEC_Prefs_Packet(uint32 selection, EC_DETAIL_LEVEL prefs_detail = EC_DETAIL_FULL, EC_DETAIL_LEVEL cat_details = EC_DETAIL_FULL); + + void Apply(); +}; + +class CEC_Server_Tag : public CECTag { + public: + CEC_Server_Tag(const CServer *, EC_DETAIL_LEVEL); + + wxString ServerName() { return GetTagByNameSafe(EC_TAG_SERVER_NAME)->GetStringData(); } + wxString ServerDesc() { return GetTagByNameSafe(EC_TAG_SERVER_DESC)->GetStringData(); } + + uint8 GetPrio() { return GetTagByNameSafe(EC_TAG_SERVER_PRIO)->GetInt(); } + uint8 GetStatic() { return GetTagByNameSafe(EC_TAG_SERVER_STATIC)->GetInt(); } + + uint32 GetPing() { return GetTagByNameSafe(EC_TAG_SERVER_PING)->GetInt(); } + uint8 GetFailed() { return GetTagByNameSafe(EC_TAG_SERVER_FAILED)->GetInt(); } + + uint32 GetFiles() { return GetTagByNameSafe(EC_TAG_SERVER_FILES)->GetInt(); } + uint32 GetUsers() { return GetTagByNameSafe(EC_TAG_SERVER_USERS)->GetInt(); } + uint32 GetMaxUsers() { return GetTagByNameSafe(EC_TAG_SERVER_USERS_MAX)->GetInt(); } + + // we're not using incremental update on server list, + // but template code needs it + uint32 ID() { return 0; } +}; + + +class CEC_ConnState_Tag : public CECTag { + public: + CEC_ConnState_Tag(EC_DETAIL_LEVEL); + + uint32 GetEd2kId() { return GetTagByNameSafe(EC_TAG_ED2K_ID)->GetInt(); } + uint32 GetClientId() { return GetTagByNameSafe(EC_TAG_CLIENT_ID)->GetInt(); } + bool HasLowID() { return GetEd2kId() < HIGHEST_LOWID_ED2K_KAD; } + bool IsConnected() const { return IsConnectedED2K() || IsConnectedKademlia(); } + bool IsConnectedED2K() const { return (GetInt() & 0x01); } + bool IsConnectingED2K() const { return (GetInt() & 0x02); } + bool IsConnectedKademlia() const { return (GetInt() & 0x04); } + bool IsKadFirewalled() const { return (GetInt() & 0x08); } + bool IsKadRunning() const { return (GetInt() & 0x10); } +}; + +class CEC_PartFile_Tag : public CECTag { + public: + CEC_PartFile_Tag(CPartFile *file, EC_DETAIL_LEVEL detail_level, bool detail = false); + CEC_PartFile_Tag(CPartFile *file, CValueMap &valuemap); + void Detail_Tag(CPartFile *file); + + // template needs it + CMD4Hash ID() { return GetMD4Data(); } + + CMD4Hash FileHash() { return GetMD4Data(); } + wxString FileHashString() { return GetMD4Data().Encode(); } + + wxString FileName() { return GetTagByNameSafe(EC_TAG_PARTFILE_NAME)->GetStringData(); } + uint64 SizeFull() { return GetTagByNameSafe(EC_TAG_PARTFILE_SIZE_FULL)->GetInt(); } + uint64 SizeXfer() { return GetTagByNameSafe(EC_TAG_PARTFILE_SIZE_XFER)->GetInt(); } + uint64 SizeDone() { return GetTagByNameSafe(EC_TAG_PARTFILE_SIZE_DONE)->GetInt(); } + wxString FileEd2kLink() { return GetTagByNameSafe(EC_TAG_PARTFILE_ED2K_LINK)->GetStringData(); } + uint8 FileStatus() { return GetTagByNameSafe(EC_TAG_PARTFILE_STATUS)->GetInt(); } + uint16 SourceCount() { return GetTagByNameSafe(EC_TAG_PARTFILE_SOURCE_COUNT)->GetInt(); } + uint16 SourceNotCurrCount() { return GetTagByNameSafe(EC_TAG_PARTFILE_SOURCE_COUNT_NOT_CURRENT)->GetInt(); } + uint16 SourceXferCount() { return GetTagByNameSafe(EC_TAG_PARTFILE_SOURCE_COUNT_XFER)->GetInt(); } + uint16 SourceCountA4AF() { return GetTagByNameSafe(EC_TAG_PARTFILE_SOURCE_COUNT_A4AF)->GetInt(); } + uint32 Speed() { return GetTagByNameSafe(EC_TAG_PARTFILE_SPEED)->GetInt(); } + uint8 Prio() { return GetTagByNameSafe(EC_TAG_PARTFILE_PRIO)->GetInt(); } + + uint8 FileCat() { return GetTagByNameSafe(EC_TAG_PARTFILE_CAT)->GetInt(); } + time_t LastSeenComplete() { return (time_t)GetTagByNameSafe(EC_TAG_PARTFILE_LAST_SEEN_COMP)->GetInt(); } + + wxString PartMetName() + { + CECTag* tmp = GetTagByName(EC_TAG_PARTFILE_PARTMETID); + if (tmp) { + return wxString::Format(wxT("%03u.part.met"), tmp->GetInt()); + } else { + return wxEmptyString; + } + } + + void SetSizeXfer(uint64 value) { AssignIfExist(EC_TAG_PARTFILE_SIZE_XFER, value); } + void SetSizeDone(uint64 value) { AssignIfExist(EC_TAG_PARTFILE_SIZE_DONE, value); } + + void SetFileEd2kLink(uint32 value) { AssignIfExist(EC_TAG_PARTFILE_ED2K_LINK, value); } + + void SetFileStatus(uint8 &value) { AssignIfExist(EC_TAG_PARTFILE_STATUS, value); } + + void SetSourceCount(uint16 &value) { AssignIfExist(EC_TAG_PARTFILE_SOURCE_COUNT, value); } + void SetSourceNotCurrCount(uint16 &value) { AssignIfExist(EC_TAG_PARTFILE_SOURCE_COUNT_NOT_CURRENT, value); } + void SetSourceXferCount(uint16 &value) { AssignIfExist(EC_TAG_PARTFILE_SOURCE_COUNT_XFER, value); } + void SetSourceCountA4AF(uint16 &value) { AssignIfExist(EC_TAG_PARTFILE_SOURCE_COUNT_A4AF, value); } + + void SetSpeed(uint32 &value) { AssignIfExist(EC_TAG_PARTFILE_SPEED, value); } + void SetPrio(uint8 &value) { AssignIfExist(EC_TAG_PARTFILE_PRIO, value); } + void SetFileCat(uint8 &value) { AssignIfExist(EC_TAG_PARTFILE_CAT, value); } + void SetLastSeenComplete(time_t &value) + { + CECTag *tag = GetTagByName(EC_TAG_PARTFILE_LAST_SEEN_COMP); + if ( tag ) { + value = tag->GetInt(); + } + } + + wxString GetFileStatusString(); +}; + +class CEC_SharedFile_Tag : public CECTag { + public: + CEC_SharedFile_Tag(const CKnownFile *file, EC_DETAIL_LEVEL detail_level); + CEC_SharedFile_Tag(const CKnownFile *file, CValueMap &valuemap); + + // template needs it + CMD4Hash ID() { return GetMD4Data(); } + + CMD4Hash FileHash() { return GetMD4Data(); } + wxString FileHashString(){ return GetMD4Data().Encode(); } + + wxString FileName() { return GetTagByNameSafe(EC_TAG_PARTFILE_NAME)->GetStringData(); } + uint64 SizeFull() { return GetTagByNameSafe(EC_TAG_PARTFILE_SIZE_FULL)->GetInt(); } + wxString FileEd2kLink() { return GetTagByNameSafe(EC_TAG_PARTFILE_ED2K_LINK)->GetStringData(); } + + uint8 Prio() { return GetTagByNameSafe(EC_TAG_PARTFILE_PRIO)->GetInt(); } + uint16 GetRequests() { return GetTagByNameSafe(EC_TAG_KNOWNFILE_REQ_COUNT)->GetInt(); } + uint16 GetAllRequests() { return GetTagByNameSafe(EC_TAG_KNOWNFILE_REQ_COUNT_ALL)->GetInt(); } + + uint16 GetAccepts() { return GetTagByNameSafe(EC_TAG_KNOWNFILE_ACCEPT_COUNT)->GetInt(); } + uint16 GetAllAccepts() { return GetTagByNameSafe(EC_TAG_KNOWNFILE_ACCEPT_COUNT_ALL)->GetInt(); } + + uint64 GetXferred() { return GetTagByNameSafe(EC_TAG_KNOWNFILE_XFERRED)->GetInt(); } + uint64 GetAllXferred() { return GetTagByNameSafe(EC_TAG_KNOWNFILE_XFERRED_ALL)->GetInt(); } + + wxString GetAICHHash() { return GetTagByNameSafe(EC_TAG_KNOWNFILE_AICH_MASTERHASH)->GetStringData(); } + + void SetPrio(uint8 &val) { AssignIfExist(EC_TAG_PARTFILE_PRIO, val); } + + void SetRequests(uint16 &val) { AssignIfExist(EC_TAG_KNOWNFILE_REQ_COUNT, val); } + void SetAllRequests(uint32 &val) { AssignIfExist(EC_TAG_KNOWNFILE_REQ_COUNT_ALL, val); } + + void SetAccepts(uint16 &val) { AssignIfExist(EC_TAG_KNOWNFILE_ACCEPT_COUNT, val); } + void SetAllAccepts(uint32 &val) { AssignIfExist(EC_TAG_KNOWNFILE_ACCEPT_COUNT_ALL, val); } + + void SetXferred(uint64 &val) { AssignIfExist(EC_TAG_KNOWNFILE_XFERRED, val); } + void SetAllXferred(uint64 &val) { AssignIfExist(EC_TAG_KNOWNFILE_XFERRED_ALL, val); } +}; + +class CEC_UpDownClient_Tag : public CECTag { + public: + CEC_UpDownClient_Tag(const CUpDownClient* client, EC_DETAIL_LEVEL detail_level); + CEC_UpDownClient_Tag(const CUpDownClient* client, CValueMap &valuemap); + + uint32 ID() { return GetInt(); } + + CMD4Hash FileID() { return GetTagByNameSafe(EC_TAG_KNOWNFILE)->GetMD4Data(); } + CMD4Hash UserID() { return GetTagByNameSafe(EC_TAG_CLIENT_HASH)->GetMD4Data(); } + + bool HaveFile() { return GetTagByName(EC_TAG_KNOWNFILE) != NULL; } + + wxString ClientName() { return GetTagByNameSafe(EC_TAG_CLIENT_NAME)->GetStringData(); } + uint32 SpeedUp() { return GetTagByNameSafe(EC_TAG_CLIENT_UP_SPEED)->GetInt(); } + uint32 SpeedDown() { return GetTagByNameSafe(EC_TAG_CLIENT_DOWN_SPEED)->GetInt(); } + + uint64 XferUp() { return GetTagByNameSafe(EC_TAG_CLIENT_UPLOAD_TOTAL)->GetInt(); }; + uint64 XferDown() { return GetTagByNameSafe(EC_TAG_CLIENT_DOWNLOAD_TOTAL)->GetInt(); } + uint32 XferUpSession() { return GetTagByNameSafe(EC_TAG_CLIENT_UPLOAD_SESSION)->GetInt(); } + + bool IsFriend() { return (GetTagByName(EC_TAG_CLIENT_FRIEND) != 0); } + + uint8 ClientSoftware() { return GetTagByNameSafe(EC_TAG_CLIENT_SOFTWARE)->GetInt(); } + + uint8 ClientState() { return GetTagByNameSafe(EC_TAG_CLIENT_STATE)->GetInt(); } + + uint32 WaitTime() { return GetTagByNameSafe(EC_TAG_CLIENT_WAIT_TIME)->GetInt(); } + uint32 XferTime() { return GetTagByNameSafe(EC_TAG_CLIENT_XFER_TIME)->GetInt(); } + uint32 LastReqTime() { return GetTagByNameSafe(EC_TAG_CLIENT_LAST_TIME)->GetInt(); } + uint32 QueueTime() { return GetTagByNameSafe(EC_TAG_CLIENT_QUEUE_TIME)->GetInt(); } + uint8 GetSourceFrom() { return GetTagByNameSafe(EC_TAG_CLIENT_FROM)->GetInt(); } + uint32 UserIP() { return GetTagByNameSafe(EC_TAG_CLIENT_USER_IP)->GetInt(); } + uint16 UserPort() { return GetTagByNameSafe(EC_TAG_CLIENT_USER_PORT)->GetInt(); } + uint32 ServerIP() { return GetTagByNameSafe(EC_TAG_CLIENT_SERVER_IP)->GetInt(); } + uint16 ServerPort() { return GetTagByNameSafe(EC_TAG_CLIENT_SERVER_PORT)->GetInt(); } + wxString ServerName() { return GetTagByNameSafe(EC_TAG_CLIENT_SERVER_NAME)->GetStringData(); } + wxString SoftVerStr() { return GetTagByNameSafe(EC_TAG_CLIENT_SOFT_VER_STR)->GetStringData(); } + uint32 Score() { return GetTagByNameSafe(EC_TAG_CLIENT_SCORE)->GetInt(); } + uint16 WaitingPosition() { return GetTagByNameSafe(EC_TAG_CLIENT_WAITING_POSITION)->GetInt(); } +}; + +class CEC_SearchFile_Tag : public CECTag { + public: + CEC_SearchFile_Tag(CSearchFile *file, EC_DETAIL_LEVEL detail_level); + CEC_SearchFile_Tag(CSearchFile *file, CValueMap &valuemap); + + // template needs it + CMD4Hash ID() { return GetMD4Data(); } + + CMD4Hash FileHash() { return GetMD4Data(); } + wxString FileHashString() { return GetMD4Data().Encode(); } + + wxString FileName() { return GetTagByNameSafe(EC_TAG_PARTFILE_NAME)->GetStringData(); } + uint64 SizeFull() { return GetTagByNameSafe(EC_TAG_PARTFILE_SIZE_FULL)->GetInt(); } + uint32 SourceCount() { return GetTagByNameSafe(EC_TAG_PARTFILE_SOURCE_COUNT)->GetInt(); } + uint32 CompleteSourceCount() { return GetTagByNameSafe(EC_TAG_PARTFILE_SOURCE_COUNT_XFER)->GetInt(); } + bool AlreadyHave() { return GetTagByName(EC_TAG_KNOWNFILE) != 0; } +}; + +class CEC_Search_Tag : public CECTag { + public: + // search request + CEC_Search_Tag(const wxString &name, EC_SEARCH_TYPE search_type, const wxString &file_type, + const wxString &extension, uint32 avail, uint32 min_size, uint32 max_size); + + wxString SearchText() { return GetTagByNameSafe(EC_TAG_SEARCH_NAME)->GetStringData(); } + EC_SEARCH_TYPE SearchType() { return (EC_SEARCH_TYPE)GetInt(); } + uint32 MinSize() { return GetTagByNameSafe(EC_TAG_SEARCH_MIN_SIZE)->GetInt(); } + uint32 MaxSize() { return GetTagByNameSafe(EC_TAG_SEARCH_MAX_SIZE)->GetInt(); } + uint32 Avail() { return GetTagByNameSafe(EC_TAG_SEARCH_AVAILABILITY)->GetInt(); } + wxString SearchExt() { return GetTagByNameSafe(EC_TAG_SEARCH_EXTENSION)->GetStringData(); } + wxString SearchFileType() { return GetTagByNameSafe(EC_TAG_SEARCH_FILE_TYPE)->GetStringData(); } +}; + +class CEC_StatTree_Node_Tag : public CECTag { + public: + CEC_StatTree_Node_Tag(); // just to keep compiler happy + wxString GetDisplayString() const; +}; + +#endif /* ECSPEACIALTAGS_H */ +// File_checked_for_headers diff --git a/src/libs/ec/cpp/ECTag.cpp b/src/libs/ec/cpp/ECTag.cpp new file mode 100644 index 00000000..d2e387ba --- /dev/null +++ b/src/libs/ec/cpp/ECTag.cpp @@ -0,0 +1,890 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "ECTag.h" // Needed for ECTag +#include "ECSocket.h" // Needed for CECSocket + +/********************************************************** + * * + * CECTag class * + * * + **********************************************************/ + +//! Defines the Null tag which may be returned by GetTagByNameSafe. +const CECTag CECTag::s_theNullTag(static_cast(0)); + +//! Defines the data for the Null tag. Large enough (16 bytes) for GetMD4Data. +const uint32 CECTag::s_theNullTagData[4] = { 0, 0, 0, 0 }; + +/** + * Creates a new null-valued CECTag instance + * + * @see s_theNullTag + * @see s_theNullTagData + * @see GetTagByNameSafe + */ +CECTag::CECTag(const NullTagConstructorSelector*) : + m_error(0), + m_tagData(s_theNullTagData), + m_tagName(0), + m_dataLen(0), + m_dataType(EC_TAGTYPE_UNKNOWN), + m_dynamic(false), + m_tagList(), + m_haschildren(false) +{ +} + +/** + * Creates a new CECTag instance from the given data + * + * @param name TAG name + * @param length length of data buffer + * @param data TAG data + * @param copy whether to create a copy of the TAG data at \e *data, or should use the provided pointer. + * + * \note When you set \e copy to \b false, the provided data buffer must exist + * in the whole lifetime of the packet. + */ +CECTag::CECTag(ec_tagname_t name, unsigned int length, const void *data, bool copy) : m_tagName(name), m_dynamic(copy), m_haschildren( false ) +{ + m_error = 0; + m_dataLen = length; + if (copy && (data != NULL)) { + m_tagData = malloc(m_dataLen); + if (m_tagData != NULL) { + memcpy((void *)m_tagData, data, m_dataLen); + } else { + m_dataLen = 0; + m_error = 1; + } + } else { + m_tagData = data; + } + m_dataType = EC_TAGTYPE_CUSTOM; +} + +/** + * Creates a new CECTag instance for custom data + * + * @param name TAG name + * @param length length of data buffer that will be alloc'ed + * @param dataptr pointer to internal TAG data buffer + * + * + */ +CECTag::CECTag(ec_tagname_t name, unsigned int length, void **dataptr) : m_tagName(name), m_dynamic(true), m_haschildren( false ) +{ + m_error = 0; + m_dataLen = length; + m_tagData = malloc(m_dataLen); + if ( !m_tagData ) { + m_dataLen = 0; + m_error = 1; + } + *dataptr = (void *)m_tagData; + m_dataType = EC_TAGTYPE_CUSTOM; +} + +/** + * Creates a new CECTag instance, which contains an IPv4 address. + * + * This function takes care of the endianness of the port number. + * + * @param name TAG name + * @param data The EC_IPv4_t class containing the IPv4 address. + * + * @see GetIPv4Data() + */ +CECTag::CECTag(ec_tagname_t name, const EC_IPv4_t& data) : m_tagName(name), m_dynamic(true), m_haschildren( false ) +{ + + m_dataLen = sizeof(EC_IPv4_t); + m_tagData = malloc(sizeof(EC_IPv4_t)); + if (m_tagData != NULL) { + RawPokeUInt32( ((EC_IPv4_t *)m_tagData)->m_ip, RawPeekUInt32( data.m_ip ) ); + ((EC_IPv4_t *)m_tagData)->m_port = ENDIAN_HTONS(data.m_port); + m_error = 0; + m_dataType = EC_TAGTYPE_IPV4; + } else { + m_error = 1; + } +} + +/** + * Creates a new CECTag instance, which contains a MD4 hash. + * + * This function takes care to store hash in network byte order. + * + * @param name TAG name + * @param data The CMD4Hash class containing the MD4 hash. + * + * @see GetMD4Data() + */ +CECTag::CECTag(ec_tagname_t name, const CMD4Hash& data) : m_tagName(name), m_dynamic(true), m_haschildren( false ) +{ + + m_dataLen = 16; + m_tagData = malloc(16); + if (m_tagData != NULL) { + RawPokeUInt64( (char*)m_tagData, RawPeekUInt64( data.GetHash() ) ); + RawPokeUInt64( (char*)m_tagData + 8, RawPeekUInt64( data.GetHash() + 8 ) ); + m_error = 0; + m_dataType = EC_TAGTYPE_HASH16; + } else { + m_error = 1; + } +} + +/** + * Creates a new CECTag instance, which contains a string + * + * @param name TAG name + * @param data wxString object, it's contents are converted to UTF-8. + * + * @see GetStringDataSTL() + */ +CECTag::CECTag(ec_tagname_t name, const std::string& data) : m_tagName(name), m_dynamic(true), m_haschildren( false ) +{ + ConstructStringTag(name,data); +} + +/** + * Creates a new CECTag instance, which contains a string + * + * @param name TAG name + * @param data wxString object, it's contents are converted to UTF-8. + * + * @see GetStringData() + */ +CECTag::CECTag(ec_tagname_t name, const wxString& data) : m_tagName(name), m_dynamic(true), m_haschildren( false ) +{ + ConstructStringTag(name, (const char*)unicode2UTF8(data)); +} + +/** + * Copy constructor + */ +CECTag::CECTag(const CECTag& tag) : m_state( tag.m_state ), m_tagName( tag.m_tagName ), m_dynamic( tag.m_dynamic ), m_haschildren( tag.m_haschildren ) +{ + m_error = 0; + m_dataLen = tag.m_dataLen; + m_dataType = tag.m_dataType; + if (m_dataLen != 0) { + if (m_dynamic) { + m_tagData = malloc(m_dataLen); + if (m_tagData != NULL) { + memcpy((void *)m_tagData, tag.m_tagData, m_dataLen); + } else { + m_dataLen = 0; + m_error = 1; + return; + } + } else { + m_tagData = tag.m_tagData; + } + } else m_tagData = NULL; + if (!tag.m_tagList.empty()) { + m_tagList.reserve(tag.m_tagList.size()); + for (TagList::size_type i=0; i> 1; + m_haschildren = (tmp_tagName & 0x01) ? true : false; + m_state = bsType; + } + } + + if (m_state == bsType) { + ec_tagtype_t type; + if (!socket.ReadNumber(&type, sizeof(ec_tagtype_t))) { + m_dataType = EC_TAGTYPE_UNKNOWN; + return false; + } else { + m_dataType = type; + if (m_haschildren) { + m_state = bsLengthChld; + } else { + m_state = bsLength; + } + } + } + + if (m_state == bsLength || m_state == bsLengthChld) { + ec_taglen_t tagLen; + if (!socket.ReadNumber(&tagLen, sizeof(ec_taglen_t))) { + return false; + } else { + m_dataLen = tagLen; + if (m_state == bsLength) { + m_state = bsData1; + } else { + m_state = bsChildCnt; + } + } + } + + if (m_state == bsChildCnt || m_state == bsChildren) { + if (!ReadChildren(socket)) { + return false; + } + } + + if (m_state == bsData1) { + unsigned int tmp_len = m_dataLen; + m_dataLen = 0; + m_dataLen = tmp_len - GetTagLen(); + if (m_dataLen > 0) { + m_tagData = malloc(m_dataLen); + m_state = bsData2; + } else { + m_tagData = NULL; + m_state = bsFinished; + } + } + + if (m_state == bsData2) { + if (m_tagData != NULL) { + if (!socket.ReadBuffer((void *)m_tagData, m_dataLen)) { + return false; + } else { + m_state = bsFinished; + } + } else { + m_error = 1; + return false; + } + } + + return true; +} + + +bool CECTag::WriteTag(CECSocket& socket) const +{ + ec_tagname_t tmp_tagName = (m_tagName << 1) | (m_tagList.empty() ? 0 : 1); + ec_tagtype_t type = m_dataType; + ec_taglen_t tagLen = GetTagLen(); + wxASSERT(type != EC_TAGTYPE_UNKNOWN); + + if (!socket.WriteNumber(&tmp_tagName, sizeof(ec_tagname_t))) return false; + if (!socket.WriteNumber(&type, sizeof(ec_tagtype_t))) return false; + if (!socket.WriteNumber(&tagLen, sizeof(ec_taglen_t))) return false; + + if (!m_tagList.empty()) { + if (!WriteChildren(socket)) return false; + } + + if (m_dataLen > 0) { + if (m_tagData != NULL) { // This is here only to make sure everything, it should not be NULL at this point + if (!socket.WriteBuffer(m_tagData, m_dataLen)) return false; + } + } + + return true; +} + +bool CECTag::ReadChildren(CECSocket& socket) +{ + if (m_state == bsChildCnt) { + uint16 tmp_tagCount; + if (!socket.ReadNumber(&tmp_tagCount, sizeof(uint16))) { + return false; + } else { + m_tagList.clear(); + if (tmp_tagCount > 0) { + m_tagList.reserve(tmp_tagCount); + for (int i=0; i 0) ? 2 : 0); + } + return length; +} + + +uint64_t CECTag::GetInt() const +{ + if (m_tagData == NULL) { + // Empty tag - This is NOT an error. + EC_ASSERT(m_dataType == EC_TAGTYPE_UNKNOWN); + return 0; + } + + switch (m_dataType) { + case EC_TAGTYPE_UINT8: + return PeekUInt8(m_tagData); + case EC_TAGTYPE_UINT16: + return ENDIAN_NTOHS( RawPeekUInt16( m_tagData ) ); + case EC_TAGTYPE_UINT32: + return ENDIAN_NTOHL( RawPeekUInt32( m_tagData ) ); + case EC_TAGTYPE_UINT64: + return ENDIAN_NTOHLL( RawPeekUInt64( m_tagData ) ); + case EC_TAGTYPE_UNKNOWN: + // Empty tag - This is NOT an error. + return 0; + default: + EC_ASSERT(0); + return 0; + } +} + + +std::string CECTag::GetStringDataSTL() const +{ + if (m_dataType != EC_TAGTYPE_STRING) { + EC_ASSERT(m_dataType == EC_TAGTYPE_UNKNOWN); + return std::string(); + } else if (m_tagData == NULL) { + EC_ASSERT(false); + return std::string(); + } + + return std::string((const char*)m_tagData); +} + + +#ifdef USE_WX_EXTENSIONS +wxString CECTag::GetStringData() const +{ + return UTF82unicode(GetStringDataSTL().c_str()); +} +#endif + + +CMD4Hash CECTag::GetMD4Data() const +{ + if (m_dataType != EC_TAGTYPE_HASH16) { + EC_ASSERT(m_dataType == EC_TAGTYPE_UNKNOWN); + return CMD4Hash(); + } + + EC_ASSERT(m_tagData != NULL); + + // Doesn't matter if m_tagData is NULL in CMD4Hash(), + // that'll just result in an empty hash. + return CMD4Hash((const unsigned char *)m_tagData); +} + + +/** + * Returns an EC_IPv4_t class. + * + * This function takes care of the enadianness of the port number. + * + * @return EC_IPv4_t class. + * + * @see CECTag(ec_tagname_t, const EC_IPv4_t&) + */ +EC_IPv4_t CECTag::GetIPv4Data() const +{ + EC_IPv4_t p(0, 0); + + if (m_tagData == NULL) { + EC_ASSERT(false); + } else if (m_dataType != EC_TAGTYPE_IPV4) { + EC_ASSERT(false); + } else { + RawPokeUInt32( p.m_ip, RawPeekUInt32( ((EC_IPv4_t *)m_tagData)->m_ip ) ); + p.m_port = ENDIAN_NTOHS(((EC_IPv4_t *)m_tagData)->m_port); + } + + return p; +} + +/** + * Returns a double value. + * + * @note The returned value is what we get by converting the string form + * of the number to a double. + * + * @return The double value of the tag. + * + * @see CECTag(ec_tagname_t, double) + */ +double CECTag::GetDoubleData(void) const +{ + if (m_dataType != EC_TAGTYPE_DOUBLE) { + EC_ASSERT(m_dataType == EC_TAGTYPE_UNKNOWN); + return 0; + } else if (m_tagData == NULL) { + EC_ASSERT(false); + return 0; + } + + std::istringstream double_str((const char*)m_tagData); + + double data; + double_str >> data; + return data; +} + + +void CECTag::ConstructStringTag(ec_tagname_t /*name*/, const std::string& data) +{ + m_dataLen = strlen(data.c_str()) + 1; + m_tagData = malloc(m_dataLen); + if (m_tagData != NULL) { + memcpy((void *)m_tagData, data.c_str(), m_dataLen); + m_error = 0; + m_dataType = EC_TAGTYPE_STRING; + } else { + m_error = 1; + } +} + +/*! + * \fn CMD4Hash CECTag::GetMD4Data(void) const + * + * \brief Returns a CMD4Hash class. + * + * This function takes care of converting from MSB to LSB as necessary. + * + * \return CMD4Hash class. + * + * \sa CECTag(ec_tagname_t, const CMD4Hash&) + */ + +/*! + * \fn CECTag *CECTag::GetTagByIndex(unsigned int index) const + * + * \brief Finds the indexth child tag. + * + * \param index 0-based index, 0 <= \e index < GetTagCount() + * + * \return The child tag, or NULL if index out of range. + */ + +/*! + * \fn CECTag *CECTag::GetTagByIndexSafe(unsigned int index) const + * + * \brief Finds the indexth child tag. + * + * \param index 0-based index, 0 <= \e index < GetTagCount() + * + * \return The child tag, or a special null-valued tag if index out of range. + */ + +/*! + * \fn uint16 CECTag::GetTagCount(void) const + * + * \brief Returns the number of child tags. + * + * \return The number of child tags. + */ + +/*! + * \fn const void *CECTag::GetTagData(void) const + * + * \brief Returns a pointer to the TAG DATA. + * + * \return A pointer to the TAG DATA. (As specified with the data field of the constructor.) +*/ + +/*! + * \fn uint16 CECTag::GetTagDataLen(void) const + * + * \brief Returns the length of the data buffer. + * + * \return The length of the data buffer. + */ + +/*! + * \fn ec_tagname_t CECTag::GetTagName(void) const + * + * \brief Returns TAGNAME. + * + * \return The name of the tag. + */ + +/*! + * \fn wxString CECTag::GetStringData(void) const + * + * \brief Returns the string data of the tag. + * + * Returns a wxString created from TAGDATA. It is automatically + * converted from UTF-8 to the internal application encoding. + * Should be used with care (only on tags created with the + * CECTag(ec_tagname_t, const wxString&) constructor), + * becuse it does not perform any check to see if the tag really contains a + * string object. + * + * \return The string data of the tag. + * + * \sa CECTag(ec_tagname_t, const wxString&) + */ + +/*! + * \fn uint8 CECTag::GetInt(void) const + * + * \brief Returns the uint8 data of the tag. + * + * This function takes care of the endianness problems with numbers. + * + * \return The uint8 data of the tag. + * + * \sa CECTag(ec_tagname_t, uint8) + */ + +/*! + * \fn uint16 CECTag::GetInt(void) const + * + * \brief Returns the uint16 data of the tag. + * + * This function takes care of the endianness problems with numbers. + * + * \return The uint16 data of the tag. + * + * \sa CECTag(ec_tagname_t, uint16) + */ + +/*! + * \fn uint32 CECTag::GetInt(void) const + * + * \brief Returns the uint32 data of the tag. + * + * This function takes care of the endianness problems with numbers. + * + * \return The uint32 data of the tag. + * + * \sa CECTag(ec_tagname_t, uint32) + */ + +/*! + * \fn uint64 CECTag::GetInt(void) const + * + * \brief Returns the uint64 data of the tag. + * + * This function takes care of the endianness problems with numbers. + * + * \return The uint64 data of the tag. + * + * \sa CECTag(ec_tagname_t, uint64) + */ +// File_checked_for_headers diff --git a/src/libs/ec/cpp/ECTag.h b/src/libs/ec/cpp/ECTag.h new file mode 100644 index 00000000..f472c266 --- /dev/null +++ b/src/libs/ec/cpp/ECTag.h @@ -0,0 +1,285 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef ECTAG_H +#define ECTAG_H + +#include +#include + +// Must be first! +#ifdef USE_WX_EXTENSIONS +#include // Do_not_auto_remove +#include + +#define EC_ASSERT(x) wxASSERT(x) +#else +#define EC_ASSERT(x) assert(x) +#endif + +/* aMule/libcommon generic includes */ +#include "../../../MD4Hash.h" // Needed for CMD4Hash + +/* EC specific includes */ +#include "ECCodes.h" // Needed for EC types +#include "ECTagTypes.h" // Needed for TagTypes + + +class CECSocket; + +/** + * Class to hold IPv4 address. + */ +class EC_IPv4_t { + public: + EC_IPv4_t() { } + EC_IPv4_t(uint32 ip, uint16 port) + { + m_ip[0] = ip & 0xff; + m_ip[1] = (ip >> 8) & 0xff; + m_ip[2] = (ip >> 16) & 0xff; + m_ip[3] = (ip >> 24) & 0xff; + m_port = port; + } + + uint32 IP() + { + return m_ip[0] | (m_ip[1] << 8) | (m_ip[2] << 16) | (m_ip[3] << 24); + } + + std::string StringIPSTL(bool brackets = true) + { + std::ostringstream string_ip; + if (brackets) string_ip << "["; + string_ip << (int)m_ip[0] << "." << (int)m_ip[1] << "." << (int)m_ip[2] << "." << (int)m_ip[3] << ":" << m_port; + if (brackets) string_ip << "]"; + return string_ip.str(); + } + + #ifdef USE_WX_EXTENSIONS + wxString StringIP(bool brackets = true) { + return char2unicode(StringIPSTL(brackets).c_str()); + } + #endif + + uint8 m_ip[4]; + uint16 m_port; +}; + + +/** + * High level EC packet TAGs handler class + */ + +class CECTag { + public: + CECTag(ec_tagname_t name, unsigned int length, const void *data, bool copy = true); + // tag for custom data: just init object, alloc buffer and return pointer + CECTag(ec_tagname_t name, unsigned int length, void **dataptr); + // Routines for special data types. + CECTag(ec_tagname_t name, uint8_t data); + CECTag(ec_tagname_t name, uint16_t data); + CECTag(ec_tagname_t name, uint32_t data); + CECTag(ec_tagname_t name, uint64_t data); + CECTag(ec_tagname_t name, double data); + CECTag(ec_tagname_t name, const std::string& data); + CECTag(ec_tagname_t name, const EC_IPv4_t& data); + CECTag(ec_tagname_t name, const CMD4Hash& data); + #ifdef USE_WX_EXTENSIONS + CECTag(ec_tagname_t name, const wxString& data); + #endif + CECTag(const CECTag& tag); + ~CECTag(void); + + CECTag& operator=(const CECTag& rhs); + bool AddTag(const CECTag& tag); + const CECTag* GetTagByIndex(unsigned int index) const + { return ((index >= m_tagList.size()) ? NULL : &m_tagList[index]); } + CECTag* GetTagByIndex(unsigned int index) + { return ((index >= m_tagList.size()) ? NULL : &m_tagList[index]); } + const CECTag* GetTagByIndexSafe(unsigned int index) const + { const CECTag* result = GetTagByIndex(index); return result ? result : &s_theNullTag; } + + const CECTag* GetTagByName(ec_tagname_t name) const; + CECTag* GetTagByName(ec_tagname_t name); + const CECTag* GetTagByNameSafe(ec_tagname_t name) const; + + uint16_t GetTagCount(void) const { return m_tagList.size(); } + const void * GetTagData(void) const { + EC_ASSERT(m_dataType == EC_TAGTYPE_CUSTOM); + return m_tagData; + } + uint16_t GetTagDataLen() const { return m_dataLen; } + uint32_t GetTagLen() const; + ec_tagname_t GetTagName() const { return m_tagName; } + + // Retrieving special data types + uint64_t GetInt() const; + double GetDoubleData() const; + std::string GetStringDataSTL() const; + + #ifdef USE_WX_EXTENSIONS + wxString GetStringData() const; + #endif + + EC_IPv4_t GetIPv4Data() const; + CMD4Hash GetMD4Data() const; + + + void AssignIfExist(ec_tagname_t tagname, uint8_t &target) + { + CECTag *tag = GetTagByName(tagname); + if ( tag ) { + EC_ASSERT((tag->GetType() == EC_TAGTYPE_UINT8) || (m_dataType == EC_TAGTYPE_UNKNOWN)); + target = tag->GetInt(); + } + } + void AssignIfExist(ec_tagname_t tagname, uint16_t &target) + { + CECTag *tag = GetTagByName(tagname); + if ( tag ) { + EC_ASSERT( + (tag->GetType() == EC_TAGTYPE_UINT16) + || (tag->GetType() == EC_TAGTYPE_UINT8) + || (m_dataType == EC_TAGTYPE_UNKNOWN) + ); + target = tag->GetInt(); + } + } + void AssignIfExist(ec_tagname_t tagname, uint32_t &target) + { + CECTag *tag = GetTagByName(tagname); + if ( tag ) { + EC_ASSERT( + (tag->GetType() == EC_TAGTYPE_UINT32) + || (tag->GetType() == EC_TAGTYPE_UINT16) + || (tag->GetType() == EC_TAGTYPE_UINT8) + || (m_dataType == EC_TAGTYPE_UNKNOWN) + ); + target = tag->GetInt(); + } + } + void AssignIfExist(ec_tagname_t tagname, uint64_t &target) + { + CECTag *tag = GetTagByName(tagname); + if ( tag ) target = tag->GetInt(); + } + void AssignIfExist(ec_tagname_t tagname, double &target) + { + CECTag *tag = GetTagByName(tagname); + if ( tag ) target = tag->GetDoubleData(); + } + void AssignIfExist(ec_tagname_t tagname, CMD4Hash &target) + { + CECTag *tag = GetTagByName(tagname); + if ( tag ) target = tag->GetMD4Data(); + } + void AssignIfExist(ec_tagname_t tagname, std::string &target) + { + CECTag *tag = GetTagByName(tagname); + if ( tag ) target = tag->GetStringDataSTL(); + } + + #ifdef USE_WX_EXTENSIONS + void AssignIfExist(ec_tagname_t tagname, wxString &target) + { + CECTag *tag = GetTagByName(tagname); + if ( tag ) target = tag->GetStringData(); + } + #endif + + protected: + + uint8_t GetType() const { return m_dataType; } + + enum BuildState { + bsName, + bsType, + bsLength, + bsLengthChld, + bsChildCnt, + bsChildren, + bsData1, + bsData2, + bsFinished + }; + + CECTag(const CECSocket&) + : m_error(0), m_tagData(NULL), m_state(bsName), m_dataLen(0), m_dataType(EC_TAGTYPE_UNKNOWN), m_dynamic(true), m_haschildren(false) + {} + + bool ReadFromSocket(CECSocket& socket); + bool WriteTag(CECSocket& socket) const; + bool ReadChildren(CECSocket& socket); + bool WriteChildren(CECSocket& socket) const; + int m_error; + const void * m_tagData; + + BuildState m_state; + + bool IsOk() const { return m_state == bsFinished; } + + private: + // Special type used to invoke the Null tag constructor + struct NullTagConstructorSelector { }; + + // To init. the automatic int data + void InitInt(uint64_t data); + + // Special constructor to construct the Null tag. + explicit CECTag(const NullTagConstructorSelector*); + + ec_tagname_t m_tagName; + ec_taglen_t m_dataLen; + mutable ec_tagtype_t m_dataType; + bool m_dynamic; + + typedef std::vector TagList; + TagList m_tagList; + + bool m_haschildren; + + static const CECTag s_theNullTag; + static const uint32_t s_theNullTagData[4]; + + // To be used by the string constructors. + void ConstructStringTag(ec_tagname_t name, const std::string& data); +}; + + +/** + * An empty TAG + * + * Note, that an "empty" tag is empty because it contains no data, but it still + * may contain children. + */ +class CECEmptyTag : public CECTag { + public: + CECEmptyTag(ec_tagname_t name) : CECTag(name, 0, NULL, false) {} + protected: + CECEmptyTag(const CECSocket& socket) : CECTag(socket) {} +}; + +#endif /* ECTAG_H */ +// File_checked_for_headers diff --git a/src/libs/ec/cpp/ECTagTypes.h b/src/libs/ec/cpp/ECTagTypes.h new file mode 100644 index 00000000..edee9f37 --- /dev/null +++ b/src/libs/ec/cpp/ECTagTypes.h @@ -0,0 +1,43 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + +// Purpose: +// EC tag types for use on the ec library. + +#ifndef __ECTAGTYPES_H__ +#define __ECTAGTYPES_H__ + +enum ECTagTypes { + EC_TAGTYPE_UNKNOWN = 0, + EC_TAGTYPE_CUSTOM = 1, + EC_TAGTYPE_UINT8 = 2, + EC_TAGTYPE_UINT16 = 3, + EC_TAGTYPE_UINT32 = 4, + EC_TAGTYPE_UINT64 = 5, + EC_TAGTYPE_STRING = 6, + EC_TAGTYPE_DOUBLE = 7, + EC_TAGTYPE_IPV4 = 8, + EC_TAGTYPE_HASH16 = 9 +}; + +#endif // __ECTAGTYPES_H__ diff --git a/src/libs/ec/cpp/Makefile.am b/src/libs/ec/cpp/Makefile.am new file mode 100644 index 00000000..c82941b6 --- /dev/null +++ b/src/libs/ec/cpp/Makefile.am @@ -0,0 +1,49 @@ +EXTRA_DIST = gen_ECVersion + +# Sources + +noinst_LIBRARIES = \ + libec.a + +libec_a_SOURCES = \ + ECTag.cpp \ + ECPacket.cpp \ + ECSocket.cpp \ + ECMuleSocket.cpp \ + RemoteConnect.cpp \ + ECSpecialTags.cpp + +libec_a_CFLAGS = $(WX_CXXFLAGS) -I$(top_srcdir)/src -I$(top_srcdir)/src/libs -I$(top_srcdir)/src/include +libec_a_CXXFLAGS = $(WX_CXXFLAGS) -I$(top_srcdir)/src -I$(top_srcdir)/src/libs -I$(top_srcdir)/src/include + +libec_noevt_a_CFLAGS = $(WX_CXXFLAGS) -I$(top_srcdir)/src -I$(top_srcdir)/src/libs -I$(top_srcdir)/src/include -DECSOCKET_USE_EVENTS=0 + +noinst_HEADERS = \ + ECTag.h \ + ECSocket.h \ + ECMuleSocket.h \ + ECPacket.h \ + ECFileConfig.h \ + ECSpecialTags.h \ + ECCodes.h \ + ECTagTypes.h \ + RemoteConnect.h + +MAINTAINERCLEANFILES = Makefile.in + +BUILT_SOURCES = ECVersion.h + +CLEANFILES = ECVersion.h EC-timestamp mkFileSum$(BUILD_EXEEXT) + +mkFileSum$(BUILD_EXEEXT): $(top_srcdir)/src/utils/mkFileSum.c + $(BUILD_CC) $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) $^ -o $@ + +ECVersion.h: EC-timestamp + @if test ! -f $@; then \ + rm -f EC-timestamp; \ + $(MAKE) EC-timestamp; \ + else :; fi + +EC-timestamp: mkFileSum$(BUILD_EXEEXT) $(top_srcdir)/src/libs/ec/cpp/gen_ECVersion $(top_srcdir)/src/libs/ec/cpp/ECCodes.h + @echo "ECVersion.h timestamp file" > EC-timestamp + @$(top_srcdir)/src/libs/ec/cpp/gen_ECVersion $(top_srcdir) diff --git a/src/libs/ec/cpp/Makefile.in b/src/libs/ec/cpp/Makefile.in new file mode 100644 index 00000000..bd3e2b34 --- /dev/null +++ b/src/libs/ec/cpp/Makefile.in @@ -0,0 +1,684 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +SOURCES = $(libec_a_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/libs/ec/cpp +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +libec_a_AR = $(AR) $(ARFLAGS) +libec_a_LIBADD = +am_libec_a_OBJECTS = libec_a-ECTag.$(OBJEXT) \ + libec_a-ECPacket.$(OBJEXT) libec_a-ECSocket.$(OBJEXT) \ + libec_a-ECMuleSocket.$(OBJEXT) libec_a-RemoteConnect.$(OBJEXT) \ + libec_a-ECSpecialTags.$(OBJEXT) +libec_a_OBJECTS = $(am_libec_a_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +SOURCES = $(libec_a_SOURCES) +DIST_SOURCES = $(libec_a_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +EXTRA_DIST = gen_ECVersion + +# Sources +noinst_LIBRARIES = \ + libec.a + +libec_a_SOURCES = \ + ECTag.cpp \ + ECPacket.cpp \ + ECSocket.cpp \ + ECMuleSocket.cpp \ + RemoteConnect.cpp \ + ECSpecialTags.cpp + +libec_a_CFLAGS = $(WX_CXXFLAGS) -I$(top_srcdir)/src -I$(top_srcdir)/src/libs -I$(top_srcdir)/src/include +libec_a_CXXFLAGS = $(WX_CXXFLAGS) -I$(top_srcdir)/src -I$(top_srcdir)/src/libs -I$(top_srcdir)/src/include +libec_noevt_a_CFLAGS = $(WX_CXXFLAGS) -I$(top_srcdir)/src -I$(top_srcdir)/src/libs -I$(top_srcdir)/src/include -DECSOCKET_USE_EVENTS=0 +noinst_HEADERS = \ + ECTag.h \ + ECSocket.h \ + ECMuleSocket.h \ + ECPacket.h \ + ECFileConfig.h \ + ECSpecialTags.h \ + ECCodes.h \ + ECTagTypes.h \ + RemoteConnect.h + +MAINTAINERCLEANFILES = Makefile.in +BUILT_SOURCES = ECVersion.h +CLEANFILES = ECVersion.h EC-timestamp mkFileSum$(BUILD_EXEEXT) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .cpp .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/libs/ec/cpp/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/libs/ec/cpp/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +libec.a: $(libec_a_OBJECTS) $(libec_a_DEPENDENCIES) + -rm -f libec.a + $(libec_a_AR) libec.a $(libec_a_OBJECTS) $(libec_a_LIBADD) + $(RANLIB) libec.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libec_a-ECMuleSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libec_a-ECPacket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libec_a-ECSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libec_a-ECSpecialTags.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libec_a-ECTag.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libec_a-RemoteConnect.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +libec_a-ECTag.o: ECTag.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -MT libec_a-ECTag.o -MD -MP -MF "$(DEPDIR)/libec_a-ECTag.Tpo" -c -o libec_a-ECTag.o `test -f 'ECTag.cpp' || echo '$(srcdir)/'`ECTag.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libec_a-ECTag.Tpo" "$(DEPDIR)/libec_a-ECTag.Po"; else rm -f "$(DEPDIR)/libec_a-ECTag.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECTag.cpp' object='libec_a-ECTag.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -c -o libec_a-ECTag.o `test -f 'ECTag.cpp' || echo '$(srcdir)/'`ECTag.cpp + +libec_a-ECTag.obj: ECTag.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -MT libec_a-ECTag.obj -MD -MP -MF "$(DEPDIR)/libec_a-ECTag.Tpo" -c -o libec_a-ECTag.obj `if test -f 'ECTag.cpp'; then $(CYGPATH_W) 'ECTag.cpp'; else $(CYGPATH_W) '$(srcdir)/ECTag.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libec_a-ECTag.Tpo" "$(DEPDIR)/libec_a-ECTag.Po"; else rm -f "$(DEPDIR)/libec_a-ECTag.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECTag.cpp' object='libec_a-ECTag.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -c -o libec_a-ECTag.obj `if test -f 'ECTag.cpp'; then $(CYGPATH_W) 'ECTag.cpp'; else $(CYGPATH_W) '$(srcdir)/ECTag.cpp'; fi` + +libec_a-ECPacket.o: ECPacket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -MT libec_a-ECPacket.o -MD -MP -MF "$(DEPDIR)/libec_a-ECPacket.Tpo" -c -o libec_a-ECPacket.o `test -f 'ECPacket.cpp' || echo '$(srcdir)/'`ECPacket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libec_a-ECPacket.Tpo" "$(DEPDIR)/libec_a-ECPacket.Po"; else rm -f "$(DEPDIR)/libec_a-ECPacket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECPacket.cpp' object='libec_a-ECPacket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -c -o libec_a-ECPacket.o `test -f 'ECPacket.cpp' || echo '$(srcdir)/'`ECPacket.cpp + +libec_a-ECPacket.obj: ECPacket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -MT libec_a-ECPacket.obj -MD -MP -MF "$(DEPDIR)/libec_a-ECPacket.Tpo" -c -o libec_a-ECPacket.obj `if test -f 'ECPacket.cpp'; then $(CYGPATH_W) 'ECPacket.cpp'; else $(CYGPATH_W) '$(srcdir)/ECPacket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libec_a-ECPacket.Tpo" "$(DEPDIR)/libec_a-ECPacket.Po"; else rm -f "$(DEPDIR)/libec_a-ECPacket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECPacket.cpp' object='libec_a-ECPacket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -c -o libec_a-ECPacket.obj `if test -f 'ECPacket.cpp'; then $(CYGPATH_W) 'ECPacket.cpp'; else $(CYGPATH_W) '$(srcdir)/ECPacket.cpp'; fi` + +libec_a-ECSocket.o: ECSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -MT libec_a-ECSocket.o -MD -MP -MF "$(DEPDIR)/libec_a-ECSocket.Tpo" -c -o libec_a-ECSocket.o `test -f 'ECSocket.cpp' || echo '$(srcdir)/'`ECSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libec_a-ECSocket.Tpo" "$(DEPDIR)/libec_a-ECSocket.Po"; else rm -f "$(DEPDIR)/libec_a-ECSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECSocket.cpp' object='libec_a-ECSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -c -o libec_a-ECSocket.o `test -f 'ECSocket.cpp' || echo '$(srcdir)/'`ECSocket.cpp + +libec_a-ECSocket.obj: ECSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -MT libec_a-ECSocket.obj -MD -MP -MF "$(DEPDIR)/libec_a-ECSocket.Tpo" -c -o libec_a-ECSocket.obj `if test -f 'ECSocket.cpp'; then $(CYGPATH_W) 'ECSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ECSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libec_a-ECSocket.Tpo" "$(DEPDIR)/libec_a-ECSocket.Po"; else rm -f "$(DEPDIR)/libec_a-ECSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECSocket.cpp' object='libec_a-ECSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -c -o libec_a-ECSocket.obj `if test -f 'ECSocket.cpp'; then $(CYGPATH_W) 'ECSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ECSocket.cpp'; fi` + +libec_a-ECMuleSocket.o: ECMuleSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -MT libec_a-ECMuleSocket.o -MD -MP -MF "$(DEPDIR)/libec_a-ECMuleSocket.Tpo" -c -o libec_a-ECMuleSocket.o `test -f 'ECMuleSocket.cpp' || echo '$(srcdir)/'`ECMuleSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libec_a-ECMuleSocket.Tpo" "$(DEPDIR)/libec_a-ECMuleSocket.Po"; else rm -f "$(DEPDIR)/libec_a-ECMuleSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECMuleSocket.cpp' object='libec_a-ECMuleSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -c -o libec_a-ECMuleSocket.o `test -f 'ECMuleSocket.cpp' || echo '$(srcdir)/'`ECMuleSocket.cpp + +libec_a-ECMuleSocket.obj: ECMuleSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -MT libec_a-ECMuleSocket.obj -MD -MP -MF "$(DEPDIR)/libec_a-ECMuleSocket.Tpo" -c -o libec_a-ECMuleSocket.obj `if test -f 'ECMuleSocket.cpp'; then $(CYGPATH_W) 'ECMuleSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ECMuleSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libec_a-ECMuleSocket.Tpo" "$(DEPDIR)/libec_a-ECMuleSocket.Po"; else rm -f "$(DEPDIR)/libec_a-ECMuleSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECMuleSocket.cpp' object='libec_a-ECMuleSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -c -o libec_a-ECMuleSocket.obj `if test -f 'ECMuleSocket.cpp'; then $(CYGPATH_W) 'ECMuleSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/ECMuleSocket.cpp'; fi` + +libec_a-RemoteConnect.o: RemoteConnect.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -MT libec_a-RemoteConnect.o -MD -MP -MF "$(DEPDIR)/libec_a-RemoteConnect.Tpo" -c -o libec_a-RemoteConnect.o `test -f 'RemoteConnect.cpp' || echo '$(srcdir)/'`RemoteConnect.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libec_a-RemoteConnect.Tpo" "$(DEPDIR)/libec_a-RemoteConnect.Po"; else rm -f "$(DEPDIR)/libec_a-RemoteConnect.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='RemoteConnect.cpp' object='libec_a-RemoteConnect.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -c -o libec_a-RemoteConnect.o `test -f 'RemoteConnect.cpp' || echo '$(srcdir)/'`RemoteConnect.cpp + +libec_a-RemoteConnect.obj: RemoteConnect.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -MT libec_a-RemoteConnect.obj -MD -MP -MF "$(DEPDIR)/libec_a-RemoteConnect.Tpo" -c -o libec_a-RemoteConnect.obj `if test -f 'RemoteConnect.cpp'; then $(CYGPATH_W) 'RemoteConnect.cpp'; else $(CYGPATH_W) '$(srcdir)/RemoteConnect.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libec_a-RemoteConnect.Tpo" "$(DEPDIR)/libec_a-RemoteConnect.Po"; else rm -f "$(DEPDIR)/libec_a-RemoteConnect.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='RemoteConnect.cpp' object='libec_a-RemoteConnect.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -c -o libec_a-RemoteConnect.obj `if test -f 'RemoteConnect.cpp'; then $(CYGPATH_W) 'RemoteConnect.cpp'; else $(CYGPATH_W) '$(srcdir)/RemoteConnect.cpp'; fi` + +libec_a-ECSpecialTags.o: ECSpecialTags.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -MT libec_a-ECSpecialTags.o -MD -MP -MF "$(DEPDIR)/libec_a-ECSpecialTags.Tpo" -c -o libec_a-ECSpecialTags.o `test -f 'ECSpecialTags.cpp' || echo '$(srcdir)/'`ECSpecialTags.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libec_a-ECSpecialTags.Tpo" "$(DEPDIR)/libec_a-ECSpecialTags.Po"; else rm -f "$(DEPDIR)/libec_a-ECSpecialTags.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECSpecialTags.cpp' object='libec_a-ECSpecialTags.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -c -o libec_a-ECSpecialTags.o `test -f 'ECSpecialTags.cpp' || echo '$(srcdir)/'`ECSpecialTags.cpp + +libec_a-ECSpecialTags.obj: ECSpecialTags.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -MT libec_a-ECSpecialTags.obj -MD -MP -MF "$(DEPDIR)/libec_a-ECSpecialTags.Tpo" -c -o libec_a-ECSpecialTags.obj `if test -f 'ECSpecialTags.cpp'; then $(CYGPATH_W) 'ECSpecialTags.cpp'; else $(CYGPATH_W) '$(srcdir)/ECSpecialTags.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libec_a-ECSpecialTags.Tpo" "$(DEPDIR)/libec_a-ECSpecialTags.Po"; else rm -f "$(DEPDIR)/libec_a-ECSpecialTags.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ECSpecialTags.cpp' object='libec_a-ECSpecialTags.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libec_a_CXXFLAGS) $(CXXFLAGS) -c -o libec_a-ECSpecialTags.obj `if test -f 'ECSpecialTags.cpp'; then $(CYGPATH_W) 'ECSpecialTags.cpp'; else $(CYGPATH_W) '$(srcdir)/ECSpecialTags.cpp'; fi` +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LIBRARIES) $(HEADERS) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-noinstLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-info-am + + +mkFileSum$(BUILD_EXEEXT): $(top_srcdir)/src/utils/mkFileSum.c + $(BUILD_CC) $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) $^ -o $@ + +ECVersion.h: EC-timestamp + @if test ! -f $@; then \ + rm -f EC-timestamp; \ + $(MAKE) EC-timestamp; \ + else :; fi + +EC-timestamp: mkFileSum$(BUILD_EXEEXT) $(top_srcdir)/src/libs/ec/cpp/gen_ECVersion $(top_srcdir)/src/libs/ec/cpp/ECCodes.h + @echo "ECVersion.h timestamp file" > EC-timestamp + @$(top_srcdir)/src/libs/ec/cpp/gen_ECVersion $(top_srcdir) +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/libs/ec/cpp/RemoteConnect.cpp b/src/libs/ec/cpp/RemoteConnect.cpp new file mode 100644 index 00000000..7b4aa36e --- /dev/null +++ b/src/libs/ec/cpp/RemoteConnect.cpp @@ -0,0 +1,258 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2004-2008 Angel Vidal Veiga ( kry@users.sourceforge.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "RemoteConnect.h" + +#include + +using std::auto_ptr; + +DEFINE_LOCAL_EVENT_TYPE(wxEVT_EC_CONNECTION) + +CECLoginPacket::CECLoginPacket(const wxString &pass, + const wxString& client, const wxString& version) : CECPacket(EC_OP_AUTH_REQ) +{ + AddTag(CECTag(EC_TAG_CLIENT_NAME, client)); + AddTag(CECTag(EC_TAG_CLIENT_VERSION, version)); + AddTag(CECTag(EC_TAG_PROTOCOL_VERSION, (uint64)EC_CURRENT_PROTOCOL_VERSION)); + + CMD4Hash passhash; + wxCHECK2(passhash.Decode(pass), /* Do nothing. */); + AddTag(CECTag(EC_TAG_PASSWD_HASH, passhash)); + + + #ifdef EC_VERSION_ID + CMD4Hash versionhash; + wxCHECK2(versionhash.Decode(wxT(EC_VERSION_ID)), /* Do nothing. */); + AddTag(CECTag(EC_TAG_VERSION_ID, versionhash)); + #endif + +} + +/*! + * Connection to remote core + * + */ + +CRemoteConnect::CRemoteConnect(wxEvtHandler* evt_handler) +: +CECMuleSocket(evt_handler != 0), +m_ec_state(EC_INIT), +m_req_fifo(), +// Give application some indication about how fast requests are served +// When request fifo contain more that certain number of entries, it may +// indicate that either core or network is slowing us down +m_req_count(0), +// This is not mean to be absolute limit, because we can't drop requests +// out of calling context; it is just signal to application to slow down +m_req_fifo_thr(20), +m_notifier(evt_handler) +{ +} + +bool CRemoteConnect::ConnectToCore(const wxString &host, int port, + const wxString &WXUNUSED(login), const wxString &pass, + const wxString& client, const wxString& version) +{ + m_connectionPassword = pass; + + m_client = client; + m_version = version; + + // don't even try to connect without a valid password + if (m_connectionPassword.IsEmpty() || m_connectionPassword == wxT("d41d8cd98f00b204e9800998ecf8427e")) { + m_server_reply = _("You must specify a non-empty password."); + return false; + } else { + CMD4Hash hash; + if (!hash.Decode(m_connectionPassword)) { + m_server_reply = _("Invalid password, not a MD5 hash!"); + return false; + } else if (hash.IsEmpty()) { + m_server_reply = _("You must specify a non-empty password."); + return false; + } + } + + wxIPV4address addr; + + addr.Hostname(host); + addr.Service(port); + + if ( !ConnectSocket(addr) ) { + return false; + } + + // if we're using blocking calls - enter login sequence now. Else, + // we will wait untill OnConnect gets called + if ( !m_notifier ) { + CECLoginPacket login_req(m_connectionPassword, m_client, m_version); + std::auto_ptr reply(SendRecvPacket(&login_req)); + return ConnectionEstablished(reply.get()); + } else { + m_ec_state = EC_CONNECT_SENT; + } + + return true; +} + +void CRemoteConnect::OnConnect() { + if (m_notifier) { + wxASSERT(m_ec_state == EC_CONNECT_SENT); + CECLoginPacket login_req(m_connectionPassword, m_client, m_version); + CECSocket::SendPacket(&login_req); + + m_ec_state = EC_REQ_SENT; + } else { + // do nothing, calling code will take from here + } +} + +void CRemoteConnect::OnClose() { + if (m_notifier) { + // Notify app of failure + wxECSocketEvent event(wxEVT_EC_CONNECTION,false,_("Connection failure")); + m_notifier->AddPendingEvent(event); + } + // FIXME: wtf is that ? + //CECSocket::OnClose(); +} + +const CECPacket *CRemoteConnect::OnPacketReceived(const CECPacket *packet) +{ + CECPacket *next_packet = 0; + m_req_count--; + switch(m_ec_state) { + case EC_REQ_SENT: + if ( ConnectionEstablished(packet) ) { + m_ec_state = EC_OK; + } else { + m_ec_state = EC_FAIL; + } + break; + case EC_OK: + if ( !m_req_fifo.empty() ) { + CECPacketHandlerBase *handler = m_req_fifo.front(); + m_req_fifo.pop_front(); + if ( handler ) { + handler->HandlePacket(packet); + } + } else { + printf("EC error - packet received, but request fifo is empty\n"); + } + break; + default: + break; + } + + // no reply by default + return next_packet; +} + +/* + * Our requests are served by core in FCFS order. And core always replies. So, even + * if we're not interested in reply, we preserve place in request fifo. + */ +void CRemoteConnect::SendRequest(CECPacketHandlerBase *handler, CECPacket *request) +{ + m_req_count++; + m_req_fifo.push_back(handler); + CECSocket::SendPacket(request); +} + +void CRemoteConnect::SendPacket(CECPacket *request) +{ + SendRequest(0, request); +} + +bool CRemoteConnect::ConnectionEstablished(const CECPacket *reply) { + bool result = false; + + if (!reply) { + m_server_reply = _("EC Connection Failed. Empty reply."); + CloseSocket(); + } else { + if (reply->GetOpCode() == EC_OP_AUTH_FAIL) { + const CECTag *reason = reply->GetTagByName(EC_TAG_STRING); + if (reason != NULL) { + m_server_reply = wxString(_("ExternalConn: Access denied because: ")) + + wxGetTranslation(reason->GetStringData()); + } else { + m_server_reply = _("ExternalConn: Access denied"); + } + CloseSocket(); + } else if (reply->GetOpCode() != EC_OP_AUTH_OK) { + m_server_reply = _("ExternalConn: Bad reply from server. Connection closed."); + CloseSocket(); + } else { + if (reply->GetTagByName(EC_TAG_SERVER_VERSION)) { + m_server_reply = _("Succeeded! Connection established to aMule ") + + reply->GetTagByName(EC_TAG_SERVER_VERSION)->GetStringData(); + } else { + m_server_reply = _("Succeeded! Connection established."); + } + result = true; + } + } + if ( m_notifier ) { + wxECSocketEvent event(wxEVT_EC_CONNECTION, result, m_server_reply); + m_notifier->AddPendingEvent(event); + } + return result; +} + +/******************** EC API ***********************/ + +void CRemoteConnect::StartKad() { + CECPacket req(EC_OP_KAD_START); + SendPacket(&req); +} + +void CRemoteConnect::StopKad() { + CECPacket req(EC_OP_KAD_STOP); + SendPacket(&req); +} + +void CRemoteConnect::ConnectED2K(uint32 ip, uint16 port) { + CECPacket req(EC_OP_SERVER_CONNECT); + if (ip && port) { + req.AddTag(CECTag(EC_TAG_SERVER, EC_IPv4_t(ip, port))); + } + SendPacket(&req); +} + +void CRemoteConnect::DisconnectED2K() { + CECPacket req(EC_OP_SERVER_DISCONNECT); + SendPacket(&req); +} + +void CRemoteConnect::RemoveServer(uint32 ip, uint16 port) { + CECPacket req(EC_OP_SERVER_REMOVE); + if (ip && port) { + req.AddTag(CECTag(EC_TAG_SERVER, EC_IPv4_t(ip, port))); + } + SendPacket(&req); +} +// File_checked_for_headers diff --git a/src/libs/ec/cpp/RemoteConnect.h b/src/libs/ec/cpp/RemoteConnect.h new file mode 100644 index 00000000..383cae5a --- /dev/null +++ b/src/libs/ec/cpp/RemoteConnect.h @@ -0,0 +1,404 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2004-2008 Angel Vidal Veiga ( kry@users.sourceforge.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef REMOTECONNECT_H +#define REMOTECONNECT_H + + +#include "ECMuleSocket.h" +#include "ECPacket.h" // Needed for CECPacket + +class CECPacketHandlerBase { + public: + virtual ~CECPacketHandlerBase() { } + virtual void HandlePacket(const CECPacket *) = 0; +}; + +class CECLoginPacket : public CECPacket { + public: + CECLoginPacket(const wxString &pass, + const wxString& client, const wxString& version); +}; + +//#warning Kry TODO - move to abstract layer. +class CRemoteConnect : public CECMuleSocket { +private: + // State enums for connection SM ( client side ) in case of async processing + enum { + EC_INIT, // initial state + EC_CONNECT_SENT, // socket connect request sent + EC_REQ_SENT, // sent auth request to core, waiting for reply + EC_OK, // core replyed "ok" + EC_FAIL // core replyed "bad" + } m_ec_state; + + // fifo of handlers for on-the-air requests. all EC concept is working in fcfs + // order, so it is ok to assume that order of replies is same as order of requests + std::list m_req_fifo; + int m_req_count; + int m_req_fifo_thr; + + wxEvtHandler* m_notifier; + + wxString m_connectionPassword; + wxString m_server_reply; + wxString m_client; + wxString m_version; + +public: + // The event handler is used for notifying connect/close + CRemoteConnect(wxEvtHandler* evt_handler); + + bool ConnectToCore( + const wxString &host, int port, + const wxString& login, const wxString &pass, + const wxString& client, const wxString& version); + + const wxString& GetServerReply() const { return m_server_reply; } + + bool RequestFifoFull() + { + return m_req_count > m_req_fifo_thr; + } + + virtual void OnConnect(); // To override connection events + virtual void OnClose(); // To override close events + + void SendRequest(CECPacketHandlerBase *handler, CECPacket *request); + void SendPacket(CECPacket *request); + + /********************* EC API ********************/ + + + /* Misc */ + + // Shuts down aMule + void ShutDown(); + + // Handles a ED2K link + void Ed2kLink(wxString* link); + + + /* Kad */ + + // Connects Kad network + void StartKad(); + + // Disconnects Kad network + void StopKad(); + + + /* ED2K */ + + // Connects to ED2K. If ip and port are not 0, connect + // to the specific port. Otherwise, connect to any. + void ConnectED2K(uint32 ip, uint16 port); + + // Disconnects from ED2K + void DisconnectED2K(); + + + /* Servers */ + + // Adds a server + void AddServer(uint32 ip, + uint16 port); + + // Remove specific server + // Returns: Error message or empty string for no error + void RemoveServer(uint32 ip, + uint16 port); + + // Returns ED2K server list + void GetServerList(); + + // Updates ED2K server from a URL + void UpdateServerList(wxString url); + + + /* Search */ + + // Starts new search + void StartSearch(); + + // Stops current search + void StopSearch(); + + // Returns search progress in %% + void GetSearchProgress(); + + // Add 1 or more of found files to download queue + void DownloadSearchResult(uint32* file); + + + /* Statistics */ + + // Returns aMule statistics + void GetStatistics(); + + // Returns aMule connection status + void GetConnectionState(); + + + /* Queue/File handling */ + + // Returns downloads queue + void GetDlQueue(CMD4Hash* file); + + // Returns uploads queue + void GetUpQueue(CMD4Hash* file); + + // Returns waiting queue + void GetWtQueue(CMD4Hash* file); + + // Drops no needed sources + void DropNoNeededSources(CMD4Hash* file); + + // Drops full queue sources + void DropFullQueueSources(CMD4Hash* file); + + // Drops high queue rating sources + void DropHighQueueSources(CMD4Hash* file); + + // Cleans up sources + void CleanUpSources(CMD4Hash* file); + + // Swaps A4AF to a file + void SwapA4AFThis(CMD4Hash* file); + + // Swaps A4AF to a file (auto) + void SwapA4AFThisAuto(CMD4Hash* file); + + // Swaps A4AF to any other files + void SwapA4AFOthers(CMD4Hash* file); + + // Pauses download(s) + void Pause(CMD4Hash* file); + + // Resumes download(s) + void Resume(CMD4Hash* file); + + // Stops download(s) + void Stop(CMD4Hash* file); + + // Sets priority for a download + void SetPriority(CMD4Hash* file, + uint8 priority); + + // Deletes a download + void Delete(CMD4Hash* file); + + // Sets category for a download + void SetCategory(CMD4Hash* file, + wxString category); + + + /* Shared files */ + + // Returns a list of shared files + void GetSharedFiles(); + + // Sets priority for 1 or more shared files + void SetSharedPriority(CMD4Hash* file, + uint8 priority); + + // Reloads shared file list + void ReloadSharedFiles(); + + // Adds a directory to shared file list + void AddDirectoryToSharedFiles(wxString dir); + + // Renames a file + void RenameFile(CMD4Hash file, + wxString name); + + + /* Logging */ + + // Adds a new debug log line + void AddLogline(); + + // Adds a new debug log line + void AddDebugLogLine(); + + // Retrieves the log + void GetLog(); + + // Returns the last log line. + void GetLastLogLine(); + + // Retrieves the debug log + void GetDebugLog(); + + // Retrieves the server info log + void GetServerInfo(); + + // Clears the log + void ClearLog(); + + // Clears the debug log + void ClearDebugLog(); + + // Clears server info log + void ClearServerInfo(); + + + /* Preferences */ + + // Request for Preferences + void GetPreferences(); + + // Setting the preferences + void SetPreferencesCategories(); + void SetPreferencesGeneral(wxString userNick, + CMD4Hash userHash); + void SetPreferencesConnections(uint32 LineDownloadCapacity, + uint32 LineUploadCapacity, + uint16 MaxDownloadSpeed, + uint16 MaxUploadSpeed, + uint16 UploadSlotAllocation, + uint16 TCPPort, + uint16 UDPPort, + bool DisableUDP, + uint16 MaxSourcesPerFile, + uint16 MaxConnections, + bool EnableAutoConnect, + bool EnableReconnect, + bool EnableNetworkED2K, + bool EnableNetworkKademlia); + void SetPreferencesMessageFilter(bool Enabled, + bool FilterAll, + bool AllowFromFriends, + bool FilterFromUnknownClients, + bool FilterByKeyword, + wxString Keywords); + void SetPreferencesRemoteCrtl(bool RunOnStartup, + uint16 Port, + bool Guest, + CMD4Hash GuestPasswdHash, + bool UseGzip, + uint32 RefreshInterval, + wxString Template); + void SetPreferencesOnlineSig(bool Enabled); + void SetPreferencesServers(bool RemoveDeadServers, + uint16 RetriesDeadServers, + bool AutoUpdate, + // bool URLList, TODO: Implement this! + bool AddFromServer, + bool AddFromClient, + bool UsePrioritySystem, + bool SmartLowIDCheck, + bool SafeServerConnection, + bool AutoConnectStaticOnly, + bool ManualHighPriority); + void SetPreferencesFiles(bool ICHEnabled, + bool AIHCTrust, + bool NewPaused, + bool NewDownloadAutoPriority, + bool PreviewPriority, + bool NewAutoULPriotiry, + bool UploadFullChunks, + bool StartNextPaused, + bool ResumeSameCategory, + bool SaveSources, + bool ExtractMetadata, + bool AllocateFullChunks, + bool AllocateFullSize, + bool CheckFreeSpace, + uint32 MinFreeSpace); + void SetPreferencesSrcDrop(uint8 NoNeeded, + bool DropFQS, + bool DropHQRS, + uint16 HQRSValue, + uint16 AutodropTimer); + void SetPreferencesDirectories(); + void SetPreferencesStatistics(); + void SetPreferencesSecurity(uint8 CanSeeShares, + uint32 FilePermissions, + uint32 DirPermissions, + bool IPFilterEnabled, + bool IPFilterAutoUpdate, + wxString IPFilterUpdateURL, + uint8 IPFilterLevel, + bool IPFilterFilterLAN, + bool UseSecIdent); + void SetPreferencesCoreTweaks(uint16 MaxConnectionsPerFive, + bool Verbose, + uint32 FileBuffer, + uint32 ULQueue, + uint32 SRVKeepAliveTimeout); + + // Creates new category + void CreateCategory(uint32 category, + wxString title, + wxString folder, + wxString comment, + uint32 color, + uint8 priority); + + // Updates existing category + void UpdateCategory(uint32 category, + wxString title, + wxString folder, + wxString comment, + uint32 color, + uint8 priority); + + // Deletes existing category + void DeleteCategory(uint32 category); + + // Retrieves the statistics graphs + void GetStatsGraphs(); + + // Retrieves the statistics tree + void GetStatsTree(); + +private: + virtual const CECPacket *OnPacketReceived(const CECPacket *packet); + bool ConnectionEstablished(const CECPacket *reply); +}; + +DECLARE_LOCAL_EVENT_TYPE(wxEVT_EC_CONNECTION, wxEVT_USER_FIRST + 1000) + +class wxECSocketEvent : public wxEvent { +public: + wxECSocketEvent(int id, int event_id) : wxEvent(event_id, id) {} + wxECSocketEvent(int id) : wxEvent(-1, id) {} + wxECSocketEvent(int id, bool result, const wxString& reply) : wxEvent(-1, id) + { + m_value = result; + m_server_reply = reply; + } + wxEvent *Clone(void) const { return new wxECSocketEvent(*this); } + long GetResult() const { return m_value; } + const wxString& GetServerReply() const { return m_server_reply; } +private: + bool m_value; + wxString m_server_reply; +}; + +#endif // REMOTECONNECT_H + +// File_checked_for_headers diff --git a/src/libs/ec/cpp/gen_ECVersion b/src/libs/ec/cpp/gen_ECVersion new file mode 100755 index 00000000..117027bf --- /dev/null +++ b/src/libs/ec/cpp/gen_ECVersion @@ -0,0 +1,63 @@ +#!/bin/sh + +# This file is part of the aMule project. +# +# Copyright (c) 2003-2006 aMule Project ( admin@amule.org / http://www.amule.org ) +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +# + +# +# This program generates a unique identifier for EC version checking +# +# Invocation: gen_ECVersion +# +# Used by the makefile to generate src/ECVersion.h + +top_srcdir=$1 + +echo -n "Generating ECVersion.h... " + +final_hash="`cat $top_srcdir/src/libs/ec/cpp/ECCodes.h | ./mkFileSum`" + +cat > ECVersion.h.new </dev/null 2>&1; then + rm -f ECVersion.h.new + echo "unchanged." + else + mv ECVersion.h.new ECVersion.h + echo "updated." + fi +else + mv ECVersion.h.new ECVersion.h + echo "created." +fi diff --git a/src/libs/ec/file_generator.pl b/src/libs/ec/file_generator.pl new file mode 100755 index 00000000..a4eb8936 --- /dev/null +++ b/src/libs/ec/file_generator.pl @@ -0,0 +1,482 @@ +#!/usr/bin/perl +# + +## This file is part of the aMule Project +## +## Copyright (c) 2007-2008 Angel Vidal (Kry) ( kry@amule.org ) +## Copyright (c) 2007-2008 aMule Project ( http://www.amule-project.net ) +## +## This program is free software; you can redistribute it and/or +## modify it under the terms of the GNU General Public License +## as published by the Free Software Foundation; either +## version 2 of the License, or (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + +# Gimme a break, it's my second perl app... (Kry) + +use File::Copy; +use warnings; +use strict; +use POSIX; + +my $exit_with_help; + +if ($#ARGV < 1) { + print "You must specify at least the folder and one abstract file.\n"; + $exit_with_help = "true"; +} + +if ($exit_with_help) { + die "Usage: file_generator file.abstract [file2.abstract ...]\n"; +} + + +my $folder = $ARGV[0] . "/"; + +my $numArgs = $#ARGV; +print "Parsing $numArgs files\n"; + +foreach my $argnum (1 .. $#ARGV) { + generate_files($folder, $ARGV[$argnum]); +} + + +sub generate_files { + + my $folder = $_[0]; + my $input_file = $_[1]; + + open(INFO, $folder . $input_file) or die "Cannot open input file " . $input_file . " for reading: $!"; # Open the file + + my $line="no"; + while ($line !~ /^\[Section Definition\]$/) { + $line = ; + if (!($line)) { + die $input_file . " seems not to have a Section Definition\n"; + } + chop $line; + } + + #We're at the start of the Section Definition. + # Read the Definition Section. + + my $filename = ""; + + my $nameline = ; + if ($nameline =~ /^FileName\s+(.+)$/) { + $filename = $1; + } else { + die "Section Definition must start with FileName item."; + } + + my $filecontent = ""; + + my $contentline = ; + if ($contentline =~ /^FileContent\s+(.+)$/) { + $filecontent = $1; + } else { + die "Section Definition must have a FileContent after the FileName item."; + } + + #Skip the rest of the section, allow for extensions later. + + $line = ""; + while ($line && ($line !~ /^\[\/Section\]$/)) { + $line = ; + } + + + print "FileName: " . $filename . "\n"; + print "FileContent: " . $filecontent . "\n"; + + #Open language output files + open(CPPFILE," > " . $folder . "cpp/$filename" . ".h"); + #Open language output files + open(JAVAFILE," > " . $folder . "java/$filename" . ".java"); + + open(CDASHFILE, ">${folder}/c#/${filename}.cs"); + + # Print license on top. + write_license_header($folder, *CPPFILE, "// ", "", $filecontent); + write_license_header($folder, *CDASHFILE, "// ", "", $filecontent); + write_license_header($folder, *JAVAFILE, "// ", "", $filecontent); + #Example for a language that needs start/end: + #write_license_header($folder, *CFILE, "/* ", " */", $filecontent); + + #Add top guards for each language + write_cpp_top_guard(*CPPFILE, $filename); + write_cdash_top_guard(*CDASHFILE); + # JAVA doesn't need guards, but needs file type declaration + print JAVAFILE "public interface " . $filename . " {\n\n"; + ##Add other language guards + + + read_content(*INFO, *CPPFILE, *JAVAFILE, *CDASHFILE); + + + #Add bottom guards for each language + write_cpp_bottom_guard(*CPPFILE, $filename); + write_cdash_bottom_guard(*CDASHFILE); + # JAVA doesn't need guards, but we have to close the interface + print JAVAFILE "}\n"; + ##Add other language guards + + + # Close language files + close(CPPFILE); + close(JAVAFILE); + + print "All info parsed\n"; + + close(INFO); + +} + +################ Generic Subroutines ##################### + +sub read_content { + local (*INFO) = $_[0]; + local (*CPPFILE) = $_[1]; + local (*JAVAFILE) = $_[2]; + local (*CDASHFILE) = $_[3]; + + my $stop = ""; + + while (!($stop)) { + my $line="no"; + + #Skip till Content + while (!(eof(INFO)) && $line !~ /^\[Section Content\]$/) { + $line = ; + chop $line; + } + + if ($line =~ /^\[Section Content\]$/) { + print "Reading content section...\n"; + read_content_section(*INFO, *CPPFILE, *JAVAFILE, *CDASHFILE); + print CPPFILE "\n"; + print JAVAFILE "\n"; + } else { + print "No more content sections\n"; + $stop = "yes"; + } + } +} + +sub read_content_section { + + local (*INFO) = $_[0]; + local (*CPPOUTPUT) = $_[1]; + local (*JAVAOUTPUT) = $_[2]; + local (*CDASHFILE) = $_[3]; + + my $line = ; + my $datatype = ""; + if ($line =~ /^Type\s+(.+)$/) { + $datatype = $1; + print "\tDatatype: " . $datatype . "\n"; + } else { + die "Content section has a non-typed data stream\n"; + } + + if ($datatype eq "Define") { + read_define_content(*INFO, *CPPOUTPUT, *JAVAOUTPUT, *CDASHFILE); + } elsif ($datatype eq "Enum") { + read_enum_content(*INFO, *CPPOUTPUT, *JAVAOUTPUT, *CDASHFILE); + } elsif ($datatype eq "TypeDef") { + read_typedef_content(*INFO, *CPPOUTPUT, *JAVAOUTPUT, *CDASHFILE); + } else { + die "Unknown type on content section\n"; + } + +} + +sub read_define_content { + local (*INFO) = $_[0]; + local (*CPPOUTPUT) = $_[1]; + local (*JAVAOUTPUT) = $_[2]; + local (*CDASHFILE) = $_[3]; + + my $line = ; + while (!(eof) && ($line !~ /^\[\/Section\]$/)) { + if ($line !~ /^(#.*|\s*)$/) { + if ($line =~ /^(.+)\s+(.+)$/) { + write_cpp_define_line(*CPPOUTPUT, $1, $2); + write_java_define_line(*JAVAOUTPUT, $1, $2); + write_cdash_define_line(*CDASHFILE, $1, $2); + } else { + die "Malformed content section define line\n"; + } + } + $line = ; + } +} + +sub read_typedef_content { + + local (*INFO) = $_[0]; + local (*CPPOUTPUT) = $_[1]; + local (*JAVAOUTPUT) = $_[2]; + + my $line = ; + while (!(eof) && ($line !~ /^\[\/Section\]$/)) { + if ($line !~ /^(#.*|\s*)$/) { + if ($line =~ /^(.+)\s+(.+)$/) { + write_cpp_typedef_line(*CPPOUTPUT, $1, $2); + # Java doesn't support typedefs, ignore it. + #write_java_typedef_line(*JAVAOUTPUT, $1, $2); + # c# doesn't support typedefs either (AFAIK) + } else { + die "Malformed content section typedef line\n"; + } + } + $line = ; + } +} + +sub read_enum_content { + + local (*INFO) = $_[0]; + local (*CPPOUTPUT) = $_[1]; + local (*JAVAOUTPUT) = $_[2]; + local (*CDASHFILE) = $_[3]; + + my $line = ; + my $dataname = ""; + if ($line =~ /^Name\s+(.+)$/) { + $dataname = $1; + print "\tDataname: " . $dataname . "\n"; + } else { + die "Content section has a non-named data stream\n"; + } + + $line = ; + my $datatype = ""; + if ($line =~ /^DataType\s+(.+)$/) { + $datatype = $1; + print "\tDataType: " . $datatype . "\n"; + } else { + die "Content section has a enum stream with no data type\n"; + } + + my $first = "yes"; + $line = ; + while (!(eof) && ($line !~ /^\[\/Section\]$/)) { + if ($line !~ /^(#.*|\s*)$/) { + if ($line =~ /^(.+)\s+(.+)$/) { + my $firstoperand = $1; + my $secondoperand = $2; + + if ($first) { + write_cpp_enum_start(*CPPOUTPUT, $dataname); + write_cdash_enum_start(*CDASHFILE, $dataname); + } + + write_cpp_enum_line(*CPPOUTPUT, $firstoperand, $secondoperand, $first); + write_java_define_line(*JAVAOUTPUT, $firstoperand, $secondoperand, $datatype); + write_cdash_enum_line(*CDASHFILE, $firstoperand, $secondoperand, $first); + + if ($first) { + $first = ""; + } + } else { + die "Malformed content section enum line\n"; + } + } + $line = ; + } + + write_cpp_enum_end(*CPPOUTPUT); + write_cdash_enum_end(*CDASHFILE); + +} + +# Takes a file handle, and the comment start/end character for that language +sub write_license_header { + + my $folder = $_[0]; + local (*OUTPUT) = $_[1]; + + open(LICENSE, $folder . "abstracts/License.abstract") or die "Cannot open license file"; + + my $line = ; + while (!(eof)) { + printf OUTPUT $_[2] . $line . $_[3]; + $line = ; + } + + print OUTPUT "\n"; + + print OUTPUT $_[2] . "Purpose:" . $_[3] . "\n" . $_[2] . $_[4] . $_[3] . "\n\n"; + + close(LICENSE); +} + +################ C# Specific Subroutines ##################### + +sub write_cdash_top_guard { + local (*OUTPUT) = $_[0]; + print OUTPUT "namespace amule.net\n{\n"; +} + +sub write_cdash_bottom_guard { + local (*OUTPUT) = $_[0]; + print OUTPUT "}\n"; +} + +sub write_cdash_enum_start { + + local (*OUTPUT) = $_[0]; + + print OUTPUT "public enum " . $_[1] . " {\n"; +} + +sub write_cdash_enum_end { + + local (*OUTPUT) = $_[0]; + + print OUTPUT "\n};\n" +} + + +sub write_cdash_enum_line { + local (*OUTPUT) = $_[0]; + + if ($_[3] !~ "yes") { + print OUTPUT ",\n" + } + + # looks like c# can't handle such values as enums + if ( not (POSIX::strtod($_[2]) & 0x8000000) ) { + print OUTPUT "\t" . $_[1] . " = " . $_[2]; + } +} + +sub write_cdash_define_line { + local (*OUTPUT) = $_[0]; + + die "ERROR: c# have no 'define' directive $_[1] $_[2]" +} + +################ CPP Specific Subroutines ##################### + +sub write_cpp_top_guard { + + local (*OUTPUT) = $_[0]; + + my $guardname = uc($_[1]); + + print OUTPUT "#ifndef __" . $guardname . "_H__\n"; + print OUTPUT "#define __" . $guardname . "_H__\n\n"; +} + +sub write_cpp_bottom_guard { + + local (*OUTPUT) = $_[0]; + + my $guardname = uc($_[1]); + + print OUTPUT "#endif // __" . $guardname . "_H__\n"; + +} + +sub write_cpp_enum_start { + + local (*OUTPUT) = $_[0]; + + print OUTPUT "enum " . $_[1] . " {\n"; +} + +sub write_cpp_enum_end { + + local (*OUTPUT) = $_[0]; + + print OUTPUT "\n};\n" +} + + +sub write_cpp_enum_line { + + local (*OUTPUT) = $_[0]; + + if ($_[3] !~ "yes") { + print OUTPUT ",\n" + } + + print OUTPUT "\t" . $_[1] . " = " . $_[2]; +} + +sub write_cpp_define_line { + + local (*OUTPUT) = $_[0]; + + print OUTPUT "#define " . $_[1] . " " . $_[2] . "\n"; + +} + +sub write_cpp_typedef_line { + + local (*OUTPUT) = $_[0]; + + my $translated_type; + + my $preamble = ""; + + my $datatype = $_[2]; + + if ($datatype) { + if ($datatype =~ /^u?int(8|16|32|64)$/) { + $translated_type = $datatype . "_t"; + } elsif ($datatype eq "string") { + $translated_type = "std::string" + } else { + $preamble = "// "; + $translated_type = $datatype; + } + } else { + die "No data type on abstract"; + } + + print OUTPUT $preamble . "typedef " . $translated_type . " " . $_[1] . ";\n"; + +} + +################ JAVA Specific Subroutines ##################### + + +sub write_java_define_line { + + local (*OUTPUT) = $_[0]; + + my $datatype = "int"; + my $first = $_[1]; + my $second = $_[2]; + + if ($_[3]) { + if ($_[3] =~ /int8/) { $datatype = "byte"; } + elsif ($_[3] =~ /(uint8|int16)/) { $datatype = "short"; } + elsif ($_[3] =~ /(uint16|int32)/) { $datatype = "int"; } + elsif ($_[3] =~ /(uint32|int64)/) { $datatype = "long"; } + else { die "Unknown data type on abstract: " . $_[3]; } + } else { + if ($second =~ /^\".*\"$/) { + $datatype = "String"; + } + } + + print OUTPUT "public final static " . $datatype . " " . $first . " = " . $second . ";\n"; +} + +sub write_java_typedef_line { + + die "Typedef not supported on java"; + +} diff --git a/src/libs/ec/java/ECCodes.java b/src/libs/ec/java/ECCodes.java new file mode 100644 index 00000000..e123923d --- /dev/null +++ b/src/libs/ec/java/ECCodes.java @@ -0,0 +1,364 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + +// Purpose: +// EC codes and type definition. + +public interface ECCodes { + + +public final static short EC_CURRENT_PROTOCOL_VERSION = 0x0200; + +public final static int EC_FLAG_ZLIB = 0x00000001; +public final static int EC_FLAG_UTF8_NUMBERS = 0x00000002; +public final static int EC_FLAG_HAS_ID = 0x00000004; +public final static int EC_FLAG_ACCEPTS = 0x00000010; +public final static int EC_FLAG_UNKNOWN_MASK = 0xff7f7f08; + +public final static byte EC_OP_NOOP = 0x01; +public final static byte EC_OP_AUTH_REQ = 0x02; +public final static byte EC_OP_AUTH_FAIL = 0x03; +public final static byte EC_OP_AUTH_OK = 0x04; +public final static byte EC_OP_FAILED = 0x05; +public final static byte EC_OP_STRINGS = 0x06; +public final static byte EC_OP_MISC_DATA = 0x07; +public final static byte EC_OP_SHUTDOWN = 0x08; +public final static byte EC_OP_ADD_LINK = 0x09; +public final static byte EC_OP_STAT_REQ = 0x0A; +public final static byte EC_OP_GET_CONNSTATE = 0x0B; +public final static byte EC_OP_STATS = 0x0C; +public final static byte EC_OP_GET_DLOAD_QUEUE = 0x0D; +public final static byte EC_OP_GET_ULOAD_QUEUE = 0x0E; +public final static byte EC_OP_GET_WAIT_QUEUE = 0x0F; +public final static byte EC_OP_GET_SHARED_FILES = 0x10; +public final static byte EC_OP_SHARED_SET_PRIO = 0x11; +public final static byte EC_OP_PARTFILE_REMOVE_NO_NEEDED = 0x12; +public final static byte EC_OP_PARTFILE_REMOVE_FULL_QUEUE = 0x13; +public final static byte EC_OP_PARTFILE_REMOVE_HIGH_QUEUE = 0x14; +public final static byte EC_OP_PARTFILE_CLEANUP_SOURCES = 0x15; +public final static byte EC_OP_PARTFILE_SWAP_A4AF_THIS = 0x16; +public final static byte EC_OP_PARTFILE_SWAP_A4AF_THIS_AUTO = 0x17; +public final static byte EC_OP_PARTFILE_SWAP_A4AF_OTHERS = 0x18; +public final static byte EC_OP_PARTFILE_PAUSE = 0x19; +public final static byte EC_OP_PARTFILE_RESUME = 0x1A; +public final static byte EC_OP_PARTFILE_STOP = 0x1B; +public final static byte EC_OP_PARTFILE_PRIO_SET = 0x1C; +public final static byte EC_OP_PARTFILE_DELETE = 0x1D; +public final static byte EC_OP_PARTFILE_SET_CAT = 0x1E; +public final static byte EC_OP_DLOAD_QUEUE = 0x1F; +public final static byte EC_OP_ULOAD_QUEUE = 0x20; +public final static byte EC_OP_WAIT_QUEUE = 0x21; +public final static byte EC_OP_SHARED_FILES = 0x22; +public final static byte EC_OP_SHAREDFILES_RELOAD = 0x23; +public final static byte EC_OP_SHAREDFILES_ADD_DIRECTORY = 0x24; +public final static byte EC_OP_RENAME_FILE = 0x25; +public final static byte EC_OP_SEARCH_START = 0x26; +public final static byte EC_OP_SEARCH_STOP = 0x27; +public final static byte EC_OP_SEARCH_RESULTS = 0x28; +public final static byte EC_OP_SEARCH_PROGRESS = 0x29; +public final static byte EC_OP_DOWNLOAD_SEARCH_RESULT = 0x2A; +public final static byte EC_OP_IPFILTER_RELOAD = 0x2B; +public final static byte EC_OP_GET_SERVER_LIST = 0x2C; +public final static byte EC_OP_SERVER_LIST = 0x2D; +public final static byte EC_OP_SERVER_DISCONNECT = 0x2E; +public final static byte EC_OP_SERVER_CONNECT = 0x2F; +public final static byte EC_OP_SERVER_REMOVE = 0x30; +public final static byte EC_OP_SERVER_ADD = 0x31; +public final static byte EC_OP_SERVER_UPDATE_FROM_URL = 0x32; +public final static byte EC_OP_ADDLOGLINE = 0x33; +public final static byte EC_OP_ADDDEBUGLOGLINE = 0x34; +public final static byte EC_OP_GET_LOG = 0x35; +public final static byte EC_OP_GET_DEBUGLOG = 0x36; +public final static byte EC_OP_GET_SERVERINFO = 0x37; +public final static byte EC_OP_LOG = 0x38; +public final static byte EC_OP_DEBUGLOG = 0x39; +public final static byte EC_OP_SERVERINFO = 0x3A; +public final static byte EC_OP_RESET_LOG = 0x3B; +public final static byte EC_OP_RESET_DEBUGLOG = 0x3C; +public final static byte EC_OP_CLEAR_SERVERINFO = 0x3D; +public final static byte EC_OP_GET_LAST_LOG_ENTRY = 0x3E; +public final static byte EC_OP_GET_PREFERENCES = 0x3F; +public final static byte EC_OP_SET_PREFERENCES = 0x40; +public final static byte EC_OP_CREATE_CATEGORY = 0x41; +public final static byte EC_OP_UPDATE_CATEGORY = 0x42; +public final static byte EC_OP_DELETE_CATEGORY = 0x43; +public final static byte EC_OP_GET_STATSGRAPHS = 0x44; +public final static byte EC_OP_STATSGRAPHS = 0x45; +public final static byte EC_OP_GET_STATSTREE = 0x46; +public final static byte EC_OP_STATSTREE = 0x47; +public final static byte EC_OP_KAD_START = 0x48; +public final static byte EC_OP_KAD_STOP = 0x49; +public final static byte EC_OP_CONNECT = 0x4A; +public final static byte EC_OP_DISCONNECT = 0x4B; +public final static byte EC_OP_GET_DLOAD_QUEUE_DETAIL = 0x4C; +public final static byte EC_OP_KAD_UPDATE_FROM_URL = 0x4D; +public final static byte EC_OP_KAD_BOOTSTRAP_FROM_IP = 0x4E; + +public final static short EC_TAG_STRING = 0x0000; +public final static short EC_TAG_PASSWD_HASH = 0x0001; +public final static short EC_TAG_PROTOCOL_VERSION = 0x0002; +public final static short EC_TAG_VERSION_ID = 0x0003; +public final static short EC_TAG_DETAIL_LEVEL = 0x0004; +public final static short EC_TAG_CONNSTATE = 0x0005; +public final static short EC_TAG_ED2K_ID = 0x0006; +public final static short EC_TAG_LOG_TO_STATUS = 0x0007; +public final static short EC_TAG_BOOTSTRAP_IP = 0x0008; +public final static short EC_TAG_BOOTSTRAP_PORT = 0x0008; +public final static short EC_TAG_CLIENT_ID = 0x0009; +public final static short EC_TAG_CLIENT_NAME = 0x0100; +public final static short EC_TAG_CLIENT_VERSION = 0x0101; +public final static short EC_TAG_CLIENT_MOD = 0x0102; +public final static short EC_TAG_STATS_UL_SPEED = 0x0200; +public final static short EC_TAG_STATS_DL_SPEED = 0x0201; +public final static short EC_TAG_STATS_UL_SPEED_LIMIT = 0x0202; +public final static short EC_TAG_STATS_DL_SPEED_LIMIT = 0x0203; +public final static short EC_TAG_STATS_UP_OVERHEAD = 0x0204; +public final static short EC_TAG_STATS_DOWN_OVERHEAD = 0x0205; +public final static short EC_TAG_STATS_TOTAL_SRC_COUNT = 0x0206; +public final static short EC_TAG_STATS_BANNED_COUNT = 0x0207; +public final static short EC_TAG_STATS_UL_QUEUE_LEN = 0x0208; +public final static short EC_TAG_STATS_ED2K_USERS = 0x0209; +public final static short EC_TAG_STATS_KAD_USERS = 0x020A; +public final static short EC_TAG_STATS_ED2K_FILES = 0x020B; +public final static short EC_TAG_STATS_KAD_FILES = 0x020C; +public final static short EC_TAG_PARTFILE = 0x0300; +public final static short EC_TAG_PARTFILE_NAME = 0x0301; +public final static short EC_TAG_PARTFILE_PARTMETID = 0x0302; +public final static short EC_TAG_PARTFILE_SIZE_FULL = 0x0303; +public final static short EC_TAG_PARTFILE_SIZE_XFER = 0x0304; +public final static short EC_TAG_PARTFILE_SIZE_XFER_UP = 0x0305; +public final static short EC_TAG_PARTFILE_SIZE_DONE = 0x0306; +public final static short EC_TAG_PARTFILE_SPEED = 0x0307; +public final static short EC_TAG_PARTFILE_STATUS = 0x0308; +public final static short EC_TAG_PARTFILE_PRIO = 0x0309; +public final static short EC_TAG_PARTFILE_SOURCE_COUNT = 0x030A; +public final static short EC_TAG_PARTFILE_SOURCE_COUNT_A4AF = 0x030B; +public final static short EC_TAG_PARTFILE_SOURCE_COUNT_NOT_CURRENT = 0x030C; +public final static short EC_TAG_PARTFILE_SOURCE_COUNT_XFER = 0x030D; +public final static short EC_TAG_PARTFILE_ED2K_LINK = 0x030E; +public final static short EC_TAG_PARTFILE_CAT = 0x030F; +public final static short EC_TAG_PARTFILE_LAST_RECV = 0x0310; +public final static short EC_TAG_PARTFILE_LAST_SEEN_COMP = 0x0311; +public final static short EC_TAG_PARTFILE_PART_STATUS = 0x0312; +public final static short EC_TAG_PARTFILE_GAP_STATUS = 0x0313; +public final static short EC_TAG_PARTFILE_REQ_STATUS = 0x0314; +public final static short EC_TAG_PARTFILE_SOURCE_NAMES = 0x0315; +public final static short EC_TAG_PARTFILE_COMMENTS = 0x0316; +public final static short EC_TAG_KNOWNFILE = 0x0400; +public final static short EC_TAG_KNOWNFILE_XFERRED = 0x0401; +public final static short EC_TAG_KNOWNFILE_XFERRED_ALL = 0x0402; +public final static short EC_TAG_KNOWNFILE_REQ_COUNT = 0x0403; +public final static short EC_TAG_KNOWNFILE_REQ_COUNT_ALL = 0x0404; +public final static short EC_TAG_KNOWNFILE_ACCEPT_COUNT = 0x0405; +public final static short EC_TAG_KNOWNFILE_ACCEPT_COUNT_ALL = 0x0406; +public final static short EC_TAG_KNOWNFILE_AICH_MASTERHASH = 0x0407; +public final static short EC_TAG_SERVER = 0x0500; +public final static short EC_TAG_SERVER_NAME = 0x0501; +public final static short EC_TAG_SERVER_DESC = 0x0502; +public final static short EC_TAG_SERVER_ADDRESS = 0x0503; +public final static short EC_TAG_SERVER_PING = 0x0504; +public final static short EC_TAG_SERVER_USERS = 0x0505; +public final static short EC_TAG_SERVER_USERS_MAX = 0x0506; +public final static short EC_TAG_SERVER_FILES = 0x0507; +public final static short EC_TAG_SERVER_PRIO = 0x0508; +public final static short EC_TAG_SERVER_FAILED = 0x0509; +public final static short EC_TAG_SERVER_STATIC = 0x050A; +public final static short EC_TAG_SERVER_VERSION = 0x050B; +public final static short EC_TAG_CLIENT = 0x0600; +public final static short EC_TAG_CLIENT_SOFTWARE = 0x0601; +public final static short EC_TAG_CLIENT_SCORE = 0x0602; +public final static short EC_TAG_CLIENT_HASH = 0x0603; +public final static short EC_TAG_CLIENT_FRIEND = 0x0604; +public final static short EC_TAG_CLIENT_WAIT_TIME = 0x0605; +public final static short EC_TAG_CLIENT_XFER_TIME = 0x0606; +public final static short EC_TAG_CLIENT_QUEUE_TIME = 0x0607; +public final static short EC_TAG_CLIENT_LAST_TIME = 0x0608; +public final static short EC_TAG_CLIENT_UPLOAD_SESSION = 0x0609; +public final static short EC_TAG_CLIENT_UPLOAD_TOTAL = 0x060A; +public final static short EC_TAG_CLIENT_DOWNLOAD_TOTAL = 0x060B; +public final static short EC_TAG_CLIENT_STATE = 0x060C; +public final static short EC_TAG_CLIENT_UP_SPEED = 0x060D; +public final static short EC_TAG_CLIENT_DOWN_SPEED = 0x060E; +public final static short EC_TAG_CLIENT_FROM = 0x060F; +public final static short EC_TAG_CLIENT_USER_IP = 0x0610; +public final static short EC_TAG_CLIENT_USER_PORT = 0x0611; +public final static short EC_TAG_CLIENT_SERVER_IP = 0x0612; +public final static short EC_TAG_CLIENT_SERVER_PORT = 0x0613; +public final static short EC_TAG_CLIENT_SERVER_NAME = 0x0614; +public final static short EC_TAG_CLIENT_SOFT_VER_STR = 0x0615; +public final static short EC_TAG_CLIENT_WAITING_POSITION = 0x0616; +public final static short EC_TAG_SEARCHFILE = 0x0700; +public final static short EC_TAG_SEARCH_TYPE = 0x0701; +public final static short EC_TAG_SEARCH_NAME = 0x0702; +public final static short EC_TAG_SEARCH_MIN_SIZE = 0x0703; +public final static short EC_TAG_SEARCH_MAX_SIZE = 0x0704; +public final static short EC_TAG_SEARCH_FILE_TYPE = 0x0705; +public final static short EC_TAG_SEARCH_EXTENSION = 0x0706; +public final static short EC_TAG_SEARCH_AVAILABILITY = 0x0707; +public final static short EC_TAG_SEARCH_STATUS = 0x0708; +public final static short EC_TAG_SELECT_PREFS = 0x1000; +public final static short EC_TAG_PREFS_CATEGORIES = 0x1100; +public final static short EC_TAG_CATEGORY = 0x1101; +public final static short EC_TAG_CATEGORY_TITLE = 0x1102; +public final static short EC_TAG_CATEGORY_PATH = 0x1103; +public final static short EC_TAG_CATEGORY_COMMENT = 0x1104; +public final static short EC_TAG_CATEGORY_COLOR = 0x1105; +public final static short EC_TAG_CATEGORY_PRIO = 0x1106; +public final static short EC_TAG_PREFS_GENERAL = 0x1200; +public final static short EC_TAG_USER_NICK = 0x1201; +public final static short EC_TAG_USER_HASH = 0x1202; +public final static short EC_TAG_USER_HOST = 0x1203; +public final static short EC_TAG_PREFS_CONNECTIONS = 0x1300; +public final static short EC_TAG_CONN_DL_CAP = 0x1301; +public final static short EC_TAG_CONN_UL_CAP = 0x1302; +public final static short EC_TAG_CONN_MAX_DL = 0x1303; +public final static short EC_TAG_CONN_MAX_UL = 0x1304; +public final static short EC_TAG_CONN_SLOT_ALLOCATION = 0x1305; +public final static short EC_TAG_CONN_TCP_PORT = 0x1306; +public final static short EC_TAG_CONN_UDP_PORT = 0x1307; +public final static short EC_TAG_CONN_UDP_DISABLE = 0x1308; +public final static short EC_TAG_CONN_MAX_FILE_SOURCES = 0x1309; +public final static short EC_TAG_CONN_MAX_CONN = 0x130A; +public final static short EC_TAG_CONN_AUTOCONNECT = 0x130B; +public final static short EC_TAG_CONN_RECONNECT = 0x130C; +public final static short EC_TAG_NETWORK_ED2K = 0x130D; +public final static short EC_TAG_NETWORK_KADEMLIA = 0x130E; +public final static short EC_TAG_PREFS_MESSAGEFILTER = 0x1400; +public final static short EC_TAG_MSGFILTER_ENABLED = 0x1401; +public final static short EC_TAG_MSGFILTER_ALL = 0x1402; +public final static short EC_TAG_MSGFILTER_FRIENDS = 0x1403; +public final static short EC_TAG_MSGFILTER_SECURE = 0x1404; +public final static short EC_TAG_MSGFILTER_BY_KEYWORD = 0x1405; +public final static short EC_TAG_MSGFILTER_KEYWORDS = 0x1406; +public final static short EC_TAG_PREFS_REMOTECTRL = 0x1500; +public final static short EC_TAG_WEBSERVER_AUTORUN = 0x1501; +public final static short EC_TAG_WEBSERVER_PORT = 0x1502; +public final static short EC_TAG_WEBSERVER_GUEST = 0x1503; +public final static short EC_TAG_WEBSERVER_USEGZIP = 0x1504; +public final static short EC_TAG_WEBSERVER_REFRESH = 0x1505; +public final static short EC_TAG_WEBSERVER_TEMPLATE = 0x1506; +public final static short EC_TAG_PREFS_ONLINESIG = 0x1600; +public final static short EC_TAG_ONLINESIG_ENABLED = 0x1601; +public final static short EC_TAG_PREFS_SERVERS = 0x1700; +public final static short EC_TAG_SERVERS_REMOVE_DEAD = 0x1701; +public final static short EC_TAG_SERVERS_DEAD_SERVER_RETRIES = 0x1702; +public final static short EC_TAG_SERVERS_AUTO_UPDATE = 0x1703; +public final static short EC_TAG_SERVERS_URL_LIST = 0x1704; +public final static short EC_TAG_SERVERS_ADD_FROM_SERVER = 0x1705; +public final static short EC_TAG_SERVERS_ADD_FROM_CLIENT = 0x1706; +public final static short EC_TAG_SERVERS_USE_SCORE_SYSTEM = 0x1707; +public final static short EC_TAG_SERVERS_SMART_ID_CHECK = 0x1708; +public final static short EC_TAG_SERVERS_SAFE_SERVER_CONNECT = 0x1709; +public final static short EC_TAG_SERVERS_AUTOCONN_STATIC_ONLY = 0x170A; +public final static short EC_TAG_SERVERS_MANUAL_HIGH_PRIO = 0x170B; +public final static short EC_TAG_SERVERS_UPDATE_URL = 0x170C; +public final static short EC_TAG_PREFS_FILES = 0x1800; +public final static short EC_TAG_FILES_ICH_ENABLED = 0x1801; +public final static short EC_TAG_FILES_AICH_TRUST = 0x1802; +public final static short EC_TAG_FILES_NEW_PAUSED = 0x1803; +public final static short EC_TAG_FILES_NEW_AUTO_DL_PRIO = 0x1804; +public final static short EC_TAG_FILES_PREVIEW_PRIO = 0x1805; +public final static short EC_TAG_FILES_NEW_AUTO_UL_PRIO = 0x1806; +public final static short EC_TAG_FILES_UL_FULL_CHUNKS = 0x1807; +public final static short EC_TAG_FILES_START_NEXT_PAUSED = 0x1808; +public final static short EC_TAG_FILES_RESUME_SAME_CAT = 0x1809; +public final static short EC_TAG_FILES_SAVE_SOURCES = 0x180A; +public final static short EC_TAG_FILES_EXTRACT_METADATA = 0x180B; +public final static short EC_TAG_FILES_ALLOC_FULL_CHUNKS = 0x180C; +public final static short EC_TAG_FILES_ALLOC_FULL_SIZE = 0x180D; +public final static short EC_TAG_FILES_CHECK_FREE_SPACE = 0x180E; +public final static short EC_TAG_FILES_MIN_FREE_SPACE = 0x180F; +public final static short EC_TAG_PREFS_SRCDROP = 0x1900; +public final static short EC_TAG_SRCDROP_NONEEDED = 0x1901; +public final static short EC_TAG_SRCDROP_DROP_FQS = 0x1902; +public final static short EC_TAG_SRCDROP_DROP_HQRS = 0x1903; +public final static short EC_TAG_SRCDROP_HQRS_VALUE = 0x1904; +public final static short EC_TAG_SRCDROP_AUTODROP_TIMER = 0x1905; +public final static short EC_TAG_PREFS_DIRECTORIES = 0x1A00; +public final static short EC_TAG_PREFS_STATISTICS = 0x1B00; +public final static short EC_TAG_STATSGRAPH_WIDTH = 0x1B01; +public final static short EC_TAG_STATSGRAPH_SCALE = 0x1B02; +public final static short EC_TAG_STATSGRAPH_LAST = 0x1B03; +public final static short EC_TAG_STATSGRAPH_DATA = 0x1B04; +public final static short EC_TAG_STATTREE_CAPPING = 0x1B05; +public final static short EC_TAG_STATTREE_NODE = 0x1B06; +public final static short EC_TAG_STAT_NODE_VALUE = 0x1B07; +public final static short EC_TAG_STAT_VALUE_TYPE = 0x1B08; +public final static short EC_TAG_STATTREE_NODEID = 0x1B09; +public final static short EC_TAG_PREFS_SECURITY = 0x1C00; +public final static short EC_TAG_SECURITY_CAN_SEE_SHARES = 0x1C01; +public final static short EC_TAG_IPFILTER_CLIENTS = 0x1C02; +public final static short EC_TAG_IPFILTER_SERVERS = 0x1C03; +public final static short EC_TAG_IPFILTER_AUTO_UPDATE = 0x1C04; +public final static short EC_TAG_IPFILTER_UPDATE_URL = 0x1C05; +public final static short EC_TAG_IPFILTER_LEVEL = 0x1C06; +public final static short EC_TAG_IPFILTER_FILTER_LAN = 0x1C07; +public final static short EC_TAG_SECURITY_USE_SECIDENT = 0x1C08; +public final static short EC_TAG_SECURITY_OBFUSCATION_SUPPORTED = 0x1C09; +public final static short EC_TAG_SECURITY_OBFUSCATION_REQUESTED = 0x1C0A; +public final static short EC_TAG_SECURITY_OBFUSCATION_REQUIRED = 0x1C0B; +public final static short EC_TAG_PREFS_CORETWEAKS = 0x1D00; +public final static short EC_TAG_CORETW_MAX_CONN_PER_FIVE = 0x1D01; +public final static short EC_TAG_CORETW_VERBOSE = 0x1D02; +public final static short EC_TAG_CORETW_FILEBUFFER = 0x1D03; +public final static short EC_TAG_CORETW_UL_QUEUE = 0x1D04; +public final static short EC_TAG_CORETW_SRV_KEEPALIVE_TIMEOUT = 0x1D05; +public final static short EC_TAG_PREFS_KADEMLIA = 0x1E00; +public final static short EC_TAG_KADEMLIA_UPDATE_URL = 0x1E01; + +public final static byte EC_DETAIL_CMD = 0x00; +public final static byte EC_DETAIL_WEB = 0x01; +public final static byte EC_DETAIL_FULL = 0x02; +public final static byte EC_DETAIL_UPDATE = 0x03; +public final static byte EC_DETAIL_INC_UPDATE = 0x04; + +public final static byte EC_SEARCH_LOCAL = 0x00; +public final static byte EC_SEARCH_GLOBAL = 0x01; +public final static byte EC_SEARCH_KAD = 0x02; +public final static byte EC_SEARCH_WEB = 0x03; + +public final static byte EC_VALUE_INTEGER = 0x00; +public final static byte EC_VALUE_ISTRING = 0x01; +public final static byte EC_VALUE_BYTES = 0x02; +public final static byte EC_VALUE_ISHORT = 0x03; +public final static byte EC_VALUE_TIME = 0x04; +public final static byte EC_VALUE_SPEED = 0x05; +public final static byte EC_VALUE_STRING = 0x06; +public final static byte EC_VALUE_DOUBLE = 0x07; + +public final static int EC_PREFS_CATEGORIES = 0x00000001; +public final static int EC_PREFS_GENERAL = 0x00000002; +public final static int EC_PREFS_CONNECTIONS = 0x00000004; +public final static int EC_PREFS_MESSAGEFILTER = 0x00000008; +public final static int EC_PREFS_REMOTECONTROLS = 0x00000010; +public final static int EC_PREFS_ONLINESIG = 0x00000020; +public final static int EC_PREFS_SERVERS = 0x00000040; +public final static int EC_PREFS_FILES = 0x00000080; +public final static int EC_PREFS_SRCDROP = 0x00000100; +public final static int EC_PREFS_DIRECTORIES = 0x00000200; +public final static int EC_PREFS_STATISTICS = 0x00000400; +public final static int EC_PREFS_SECURITY = 0x00000800; +public final static int EC_PREFS_CORETWEAKS = 0x00001000; +public final static int EC_PREFS_KADEMLIA = 0x00002000; + +} diff --git a/src/libs/ec/java/ECTagTypes.java b/src/libs/ec/java/ECTagTypes.java new file mode 100644 index 00000000..01d4e8a2 --- /dev/null +++ b/src/libs/ec/java/ECTagTypes.java @@ -0,0 +1,40 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + +// Purpose: +// EC tag types for use on the ec library. + +public interface ECTagTypes { + +public final static byte EC_TAGTYPE_UNKNOWN = 0; +public final static byte EC_TAGTYPE_CUSTOM = 1; +public final static byte EC_TAGTYPE_UINT8 = 2; +public final static byte EC_TAGTYPE_UINT16 = 3; +public final static byte EC_TAGTYPE_UINT32 = 4; +public final static byte EC_TAGTYPE_UINT64 = 5; +public final static byte EC_TAGTYPE_STRING = 6; +public final static byte EC_TAGTYPE_DOUBLE = 7; +public final static byte EC_TAGTYPE_IPV4 = 8; +public final static byte EC_TAGTYPE_HASH16 = 9; + +} diff --git a/src/muuli.wdr b/src/muuli.wdr new file mode 100644 index 0000000000000000000000000000000000000000..711ad7e0e1c30ec92c319a33322420efc9d87ad9 GIT binary patch literal 360798 zcwX$i3xFd>buQd%dyUy(<6!d$CeSu(JY#0ZyK9@rIyPveo*6M3Nl2Pq+ki!n)HBnp zMlIB>ogKn;0tq2N5*~S7@+aW`CJ-*%8~#6#{6BC5mq&;bz#%-sBLtEV2>!7lfO#Z5 z_CH@$SF82xZgscjVV#wB)ZJCpRj1B5bRje^CU^Sgua(vBROzD>V=on%_r*h zO08AZ*t<#(A?sloE ziP}8$y6fburd747yk<1zWKSA*$u+93)xSD5-ls9nsjik52W71USarMqsp z0cgMren#qP{9>+MuRK;HT)T zq>eAi8NGh`gbWO$_++V&8HS3V;#X)hxQQWg>#TDrKv2VllA9WaBBb5whp=CT^ul84 zATK_bzli;q%auyGWxN0=KwWICpxOd6d8v&VQ5W=J60)bKrY=CDdDXNOA`xK4bU#EX zklIumrM$e7DWx;%tb!+~_}mIrEISNwHuul9EX$}%c60cJ8^Y3#3wJ0E_&}`*O}vWb z`9v`=4K2}^q-f=|yrDHU*)n9cT9vI0O$Il~HNusw*Vzq=@GDn%laX-SXf@@kJwC}V zY-ufRcF=2p$fU8ksXOcxSfKp0DH#& zu<3x4SH~?k2xN>(8Ylz3{s;;5kSrG$bEhExR*G)9@-y}uya1)-jmD8yLpDhawoKOb z{Zc+b;+&(}!&`b&UDwQ5q^}S==%-Q9)RsdJXTRptw<@Xfaykq8z)J=QYaCTlFmjNH`Lh~9{? zz-**P2)^U$p?SnoS7#w=^!l2SQCGDNL5FIg-w1c5ayC~^tdw#E1?>X)W{5-e`no(j zJKOFY2sz)KLrkZ2bPl`WhNx)R#y@J;PnZP-F+@DsRyc~v%Vq)80pl{OVPnEcna3HrDOrr&#I_hncIMtk$(==Sy)zzBD zb!5)1rWmPLn`%WfWm8|T>ucNWmO*81XjH&j)7X?N%wGW&V6#=%D}*Sc&PHUjp=s5= zJboE{R~p3Nvq$9@%Wwy=-xGG9uzMRGkl>kO+NQ~e9A^x&HF!4YR4n}r4K%h)AaX8H z0=3yRwgl1Y8uF`FTPxtaQQMa5hSe^1M&8zHHDjwY_jWt)1~HS21nHDKwWc?CBJWRd1`sFd9|+9 zP;5!JYMjFSdVN7YrsLU<(D&>3tBUzdxeWudwH=S{XAE-_+8qW=+>*w}rV$o%>Euw0#}=T;4MVSJ_I!+e;fC>J23?1tkbwC(HBc3>6e9SwVD@m?Bcr>pdRJuv02RX&1k}Dj3-O@oN=~raMS| zbO)wSm}Sl8M5a=sj9AqPd?O{O7&Hc(kTf|qwZRuv1jmI?Y*Ftbvy%i$!YT!(DNW0>{LrzH=5gfi3K4*2^CmEkxY~l#Uhm&6%z`Gg<${_ zhS|Fe1M+7|wW%BRh}|@RnEA#rJ5uQqH#wLAQcUL@_L-76=?f5a5V3RSK~G6|&9YvX zp(GC0HvPL-g)g|6PiK7+WU-;wT?FY|x*=wQgyWw%38~hcAeYk)DgK<)CdE-u?7*e= z^46$Fw^2=<5O@+e0<8!s_ntI-jMOa+6DJetxpXF7x=mo|h~#ghh!=eA{Pyptx%wihldHRXbnti=*f|Ya zHp^?wpU+&=C=cx^<`dnr{vyflXtkm_g`$_(9cM2ptLk`V#39!=HXa^db7Ep}6v=09 zqF!JE7(a^at(AO^s{>Qr3rvE5U$@0%Q0;`igDPs}y&W^a?%eUB2o-ZEEGjkxfOI)4 z$_34A)vS1?X8_~J+BgUc@7?pW^!6-P(++?){EAlSb|W-s=( ziEJsGJC*H+uu+f(`d!qkn!Hpuw(2qqa)bMOR(}+Lgcn5pb`;#Rcm`_zAk;_U)&gnn z@j)2XWL8}%Q79F?Xg3HQGdi`@rZtg^gJ3^ub)5^-mvaTr`SNbe-ArG;@<%gS2&_$` zsmV>Q$zk(8qM*#m*o|ej8V#dq*`czQ)T+F#Sp$QxfRUG}tO-F5g8fL4Jd{$hoJ?es zN+wbf2ZAbEMk98D;;oJ$&eVi{JW<4SeF(G^DR-G%A{8YC;e{f^;e?88*pF1itx+*7 zmJ3Qz@w7&R;0^>prl@9-p`g{O6OYG0*pJjDW?+*UA}WABkdh#?_skHq*GHfh7qcLHBZW}zFuc@Q}%D!PT|zj?GK0n zT_8X^m}NFsQs#0wXRi!a22`cd;kgoC#kcLt*B;g_ZBxEku4`K|TTMy!fwpQGr>7b! zB0kK>t}4vPTW3?+no1T$-Y|7U)R=MZ0N*o5r*Aq;<%?2z8ME{BGXBE3?R0fYKCD;e z=_yLLxlI>5@iZkrTz<~c=N-AFo!m}(6Vlo>9$2(U3!E+_Ru+azZ`4WA`VW;XrLtaHczjZcPs^Gu~$g%+JQ&9>R2W#tGsHQbz&wU zb<6>eqKyJIB+3zLD@(my?iY}M%z=LJ4UZcauLKPF69i>Ijfi7r_6_a>UJ+K9iMGca z>NXbdH_&2F+Rv4;$xI=cTh2R?qaROC9xwGmH}W1U*@~X&1Zr(Zf$NAGEdbKLm-^yU zRKl?3kg&Jh%r7SsC1rt%Qk(${d8VY%0W%RD3dt~CMRqAG?W*)sSLhZ5<oGyOoA zPWau8V)5541o~(Op|y=ixXPR}NF;7Xsc;-XJ{EqR-55>%kb2Y)RN5@_h?NLcy{M^G zt%)X&VT2f;X)Qz?1WqPRC6#gu3mMNz8^6$BH`#X>Y!AG}Q|VH2am7*Y#K7x?Kvbu= zfq;-JJpAf)^y3I4>wd`*e`L%$A8-*rMguB>zazEHOE3C_5aqFL+ak;bD4pY;?eLFi zjYWHGiO}gTxH8uM4!h`jK#v`g{P$QtfL!M19qc%Lt;j6i=Z4*)#|ed>;n_=(!yuIGJZ($z z0nw;#UYc=#^(wU1hKg@$rbz=!9^r+3scYVT9S{G|=)Uo&>NW<~QWT;!Mu*ZR(%6-Y zXwWjuW1bIojG*H#2`r!da(+y*RCI`EU0p+(8{^(?miYon-M;3tyDm)Xb{@$n z`GDY3x3`0a(xS-br+cE5a=s2aoJcvJfTG7N<#weB6&8}=82Ji<4 z#p0giVxm-3GD?y(YJpuS?XomFtV+;4T_?zPxsTnCoT=`^dUdAX3^(%_AKucd*2c`? z4MN9;H9d1Qv-6(gD5RQ@juCFXbQ>3=@-4~%A)vmDNS2jiF|p7QultbeefUDObcBTR z!K z2M-B3&~N2e$^+cI7qMP82)y!jS;Uc8*lW(I;--g%9XPK3MMH}lNd-M1m~%c=zV+w@ zLto%uas%J7>RlKbe2JrBs*}6v$Gn)(FMtH*TeX^uqbXu`V@8Vw_n8xS9Eid*2|yjQ z*CoVdY4o@Ct4U3{|E5!z;UpxP3e5e03O+^o>!GG+vljn-*+2 z(_-h%?sdWz-m3gO8nNQ6h85nb32jH-p}tz~ulG zDIuXG4PfGA@YnkRapZdpJ{lEEJc_<0d#xYBob4OV5Oe4*&hX`Oe2E;HUWr0!GD7SoHi&bCaAp+4as=iu?2`ue!HkSB&cF;f zZy=MHo6O7X8it5uTFx?Q{4wH3gL}QB}$1xqBI@`h}3x?U{8>BoN_)g z0*56awwB9@ilv{?P_~_-hGhG-~ok43H zgIBBWc~LGrK&3(=Tbx%41;ulXt0aXaZnW&dOWbivb6+kBKY%wToq#(Zfurd@yd8cDv3%g{n1I9u)_DvwyZ?VodyJj8NChr)|9r4Zh zon{Tl(>BEV9U=k<%I8SWQIJWy*lX7^_d)h(_yH?X8mVY3+YyLut??d4V4^XU4P?=fO60-xm`CN;D=+9(~GA_>Njuf}yDnS?YRaZq5=%<%WczG!R0`iwg&Kglb=1?EaYk#Rz7a)<9kt1Q zS#qGT7qTt#Uc)!CTB56*7% z*Izgz!0E4YB8yqh;m|34I?+NghEK>RfpRT3gOR55h#SnIL26{;}bJ( z?9JN;E(`31b(#Y3;+}(+Bb}WP0A$DJtM(mgaIjO>O_yQEwrz=dKV?-WA-5@S8!fq_ z)@4)OmUYXNYg&EX+L&R#P0MI*&&V~kzTQ&THFS=ApDFc%) zvbCYIbsUDZL9(D_YE4r%)?^iI!(yzuIoVfF4yQ^Kd85QujH0`)D`1lg)S8a-!tB{U`ZZ4^3UuZTgQ0a^)!E+# z!>FPFRZ!y!GL(kEz74W&6Qe3MuhB`EGzYRM%o zQtPk`;yIjWF#ZFtSw?GP9qQ03UtIva4H)0Tnh(gcYqx#0El$*~9ZzsrqjAkK=V#d% z+LJZJoZgf<9V;qOw;`yAxtphB8Pwu)T%z5`K@?C>=A*&{0BFf(R{+9 zL<|lwp4}mS_v6;{rNQ8LZ0{M2Ll5t4V6}J3M>)9T{is~DtFZtFrS8>Ok&xYxwOFVi z393Xkz3hrFap?i>4;&RX=nDm5L0{`#c;$K^4z6m~V1|0!&`FLTojE!^=;W%cv)P=j zFzo!2s#u2`d?U3vhK<#I1}zXm7=r`HGKpXnWN^>Ojhd#CA-<*R7R+k2Zy~X=Fx0Jc z5x-hcTkD#{+rodlA!gMWg%NHROQn1&cPg97B~tl9ZlRzQJ60_UTm^-;cD#@%7ngIn z(&DA!QoLs_QK;IOuuS~&6nM)mGKuzMnP7e)ylD`QIX27fk?W)JwFZxjn-!(tdUNii5vWCI9>WkX#EB> zsaC7}pxh`GoH)Gr!|N888ej!|S}=3cx6|$*k+VoTyf@r;1P4Egfbj~HDwW|oiK?Vvz zD^WK_4Y@+cLWD>uK|qW{bhr5T>aiHB0=1x^y|AStVph7oW;8cdY*Xak8{TT0`h=gsB`u> zhHS=V3(ZrRg{Tk&=ryCq+dP05pY#L227b3e9@@f(Ps`j;NtLw{t zBq%toxl^E-zFOf&l=>Bk$QQ#RD4~gXs#nMawA=3C;v)9Ky4UC4MGwwOZQ8{bG@2~7 ziFA-oib73yGWWwM7Cen6&Lg(IL5X9M>ft%i!vh(kphuoD3i`32tBLhLyN2$?V{Mo@;BfZS!(iIs{*apaDPP?*MSSZdfUsiLf?`eT<>Csy+C z?E!L;2l5UeiLfFT!ztX`nrV&YM2MhG_Y-%rSWuq5q7+MQjj%f!hZ}IsU*%^htQ|oS z)sJpbO*9ro9|A!Qh(K6P1upKE{QE^wc*AI{s-4V5P__TYN+1*72-Ngpyy2XV>+psX zN;ekfn27HkAyJTkePGo}1D5SLPOlBxem_BQi-}}X$?qKz9=WY>kp1kP%O6>mqbs>A zPgE*eqq8fe2d6~e^X%fNJc3;&Qay@p+GS*l7L50xwxEq4Mx$aya2v?UHbyFFHen&+O-Kxtl`D`;y}4(wny zMg-_alX}v`tNlz-iyrphc#+fV4ZZWuyyOs5*{Fs|P4qE|ZBID&&Q91nWW@agc%wxI zuahe3nH1m$Esu7mA6hT84c>RbCb3d%>r672cZ4z|sgS0lz;h+M+urfk86`betQZZA zZPvSf=Ge?aA(3BX`*&vej=1TY4zct{ZYgROqW(`2)lFShg~H0RUNyb*d-O(|4I6ma zg(vCutd+1ub=O*|=t&C@Rx%CQEedL7yZMg_%7eChi8MOgBn_mzq){`P^GzbD&aI+& z{mk*BGskY&dBTc)^d7Yn+hanEYdQJ>inQnV#4RD~d{q}2++(rV;(`YyA9BSUj8N`4 zh$##w-Ykv8iRJ4jytrF=5foHt)$0g#rk>H7YTJsO@Z?Bc>5nHn4g%Z>o;*I`$=%G8 z_PUp`@uYxJT>>4ps@F@!wHrCY;_-cESGUm$CK7QZjuac3R`qK0gToYDiQE*tT^cBI z`kI0(`Qe6OYhnoQ!@D_AW#2?DTwbGCl9riT)T8RYb6wWGQ`8Nk+w!*w1bAWW}i0wF<%qnex=J6UU}S znq9=3`)#n?S&wOP;xYB=M1Q;)!(a(wuo<(}7|&2CV8;!@K$Z{IfhOCc%d3%5+kgk` zGD`(T@fp{o)YLS0$USi>U?env=Im%)qAG$E5z*u>$sZ}ADOj0{O1bZ&E}R2O#5sv# znFrq~av|3f#RM=?Gnga9S^O-c8eTm*2)y!%rbe=&8DgnY)2Ykt(~}*-2pfOCxnR?14i@5_Kj7Bd$AKuP~P%OMKOp@ye`Rf6xlS^ ztSvIe;vHn-#E;;zVs73Sf=1#pG~mIqlRVDOih-EH+%_?v(VCbz-Mh4G+ifW-teDPa z{h(+ha^ABDih+I@&hxU$Ps`c6w8LGA3-;YAaQAJ5M5~ zWN|6TaU|PaWOf6t57_D4fV3A%K40YD3x%SQW`o{6O6 z0*Z&bq;TSa`8w>#;!Pe2bWAEfKdy8SZL*j{ppVL`i2MdiX_uQgu9DVMFk!9^@ zMD?Kek=`YRlN(U85_|!^z3xJ8s#eVEMYwU&FSdloG;uOjh)vI!Xw1=cRv*%StrU*5 z*>Qn3X^Zu@`;fR-;v?=@@ib;?x=RX2O_xbx?~PWKr%b+gX?j1A64aB}NNFM`qv@;| z>2d(!vQw`+|;8F(D&MIg&H6QPV_F zM$=<`h+DL2RN{sT;1-nohrGpv{7SxqxQ8KZB;ppAfmt;vfZ`W0k15mK?E~5 zWy_HHa_9rnsJ@KRJhTUfmKoSTg6y#qbR>Nckol`pxRDLWN@cEF$;+EYRbSJ!X1t6) zW*?=Pl_^kjasp?97$W2U2h-rTQ-nUO)BFIMTGT47rY7rELd3ozb3V`|%gIzaMdka! z*+_&QE6&EOHbo&h3)GnU`hHTGP)#8)W1P=Y7sJ}rqAQa%!_@jE@HH%V+kfwvm;9C+ zfI>9egF`_Q_HqYzWdyZA_FO8B4(MbwRNZXVv|>Z6P|w9GcEiNOX!96K8!!lk4>3UWGAJ>*Of=m0)dX|&Ep6zgOdo4QV@p2ihib_znw;D+;dI*4Yc<)_GVK%v8=oQT#X6*|%j6?+B1`t6ekzH6xEOZ2? zf4t-kM1jsT_dZL?UrOh)#S88CBo~$B61~iaBuQ>)mD5zLElHe9Hwe@Z!Nf3~ zTpT2vRZgAk+%MedLP?qdo>UH#3rkP$&^*gW~Q+sT+4dn`z^1Q?KirL{YMCnObd4ZZ)X+ ztnGc7(hm00w498P32|X41kH(YOu023*j&DnzRNBgHJZkzC9i5kC7P_A)iFTz#SREP zPl+2Aq#II-p*>>c00IdqG#_$=p(LA_%P6Hn;K z-rP13H_U3P+wv4Km8F`eSJmdUtdp$oi!*d0FG?;USGvLt#Tc*_lB9&^m2LxhL8+=J zdC4$`7fJa6GK(CUK+6o4{XuOa4XVx_+L-N&Q`mjWuEKf{8-=-sypdZiLS2j2Y5`rN z=SsO;rj*X7luY8ba%L_Qvj9j4iIQ8nq*q-srE*JQi6g1tpME zEPF{Og;*zHt5r<&NimZ16=%&a6o||1a)(g~ z;+__@8rg@i44d+5)7Zj3YLbe5-EI$c{arHZFKlT|qY0{BHeN)6SH;hHy-Cz|_9FY| zs@|-kX}N~hRBHA?JL0YC|Y|3-IJ5R*q2#Lvg4kU1Ip+nb2B{MJZlb3vW zPP!3?xi6(|5nXlAIdhL?_ozx3pEc0cQ`XI4U!)Ep?SHNTpS)va!~_ zzr`aCGY??HFim~6)>oikA&RG*PI+ri7I)18_ZC+D+7d|SgA9$+Uc+=haO)Bxzx$cE zcfRXdz`*I6&=WzA=`1xs8x5MIM)6T!3JUsPG!=|>5|)^7BFg`1B+svdhni+2KG!0HntBM1STBk zQQ}tjE;SfGZUu2vc>7Y!WCAhaOA`2T$}Y{dk5LFqD(LjnbJz96+8i8B2NjaV@r z0b{O2&Y0+DzB_7vuq9tE#@MpGzb-6OioAP{DQ}31OeRd}YyDbnqkR_TFt1a z(2s(%s`C|SgOm55|jP9`E7 z_s_S#dv4r!&bbatFFPq+V#Rm_ytxuFZ-!CDcOz#yMoWIemo{HI2lIxdm3_;XKW%Rlx zC)I{p(JkG3+m8T2H0`$yB4fX#5vAZ7Mb-0KkiT=nPzZs1uF$iKRg#92+Eb*?mG?wA z^{U#e%1Y|^lH4$wmP|L~idwH5Sk@?4`3k;j-#Or?Jc9rI;W_>nZ|=_?7~V_bhPjlucY#$^#3y@yZm{LrxW`n_`x;)Zd))2&F1p!lF$mesRz(P%X*WJflLJ?8bA z=kCXefEbT}5UVVSZIZccCNZZ3-h?s;P&B&UwN`3pMFdJ|w>2uk@W26HiOkQo@9l(O z823AcV2H{@!iv{6srZ~z6EIF!P#gkir2QB%*t{6wqFsO~1WZ;boyrxK;PQz|zyLug zuhU@2q_abJ6m`f_cpf`sDZAl@gHpI{YkvHR@5J~U*ZP; z@(R_@avzwdH1w2N0o{@pNU;c+C`Kw!hL}2E$!GKSCi2LFXrVdwF7TCn9sU?r?GSMT z&y(8Y<)|$mre)(Bt40|`m&Gt)1<8RfYJ2Zv(lVoHzZeZcvQ*!0Z+aM?U;cyq@40jB zdx2#f9q%)0=6(rt`8{!la;I@$3j07Y`b9Dg9l(FV_`w!X$R2!}PQ zea3~a-?-JX$C*DS8_$E1QrJ7^ z6=wn(exO74i$}qau#W|vW0M`AB46UcC&>t%&&J0nL74^tYS7fIrml4?dla#7JoR%w z9?gCs9YkLU*%O6a5QAzAa>0jGb@Miqb56oh_0yFS*UgW#8dcTOY~HTvrqvaO5xo{^ zB$A-)-8=Y+^(0CvT}rgi=oK(3N&p~+3?V^WM^3w5@~k-&^ibxqqnO@_KI#$3CxT(Qe#Gft320i!niTB*}DMlz2xzsZ7AGF4D!f&kkQ zkYi_&0#hK(RuyDd5*bbji!^ZO3;s@h^8-(oV1Qckrdn^Qwc56_U*-43u`uc{P zx21&p75?2zmq^0O^&1wl9}IIg9guoaFv$NC+Oc$5XTex>WJc*%y1-94K2_-lgO0QCkR-eaCMW5C?@1tZnom>=sbe9y)lffcC%qC|SXJwU? z@H5)Z55poDMS_}HDi9i?qDSc4C{(tZEvzfoNEC0&8>+b>Pho3TQ>z%8Yzg|bJ6rD% z#8#08C3Hklu#cNyhxO=d2*)pPsiZ*j<9bLqayKap)1T7K z(=uCw+OIT7E!M8CbWwOT#2TUyi)97iQFs&H508yy32hjU#K1-K7<52YQF1EZiFex#7zkX{DQ^4huE>1c0rxx!buq&DFla)r0P__e zMri#s>@t_1=o@TEau0djk=EcLW6f7kz$^pq-{0~vf#HPrP6?QH^!$}2S7Ar z)BzA>ptB+#_K==yEA6)yl%sTKs-UlLSXi`HVau4-j9Qh@gj0xFY$xibR@2naXxu?O zjf&0Z3JR4n3~lz+ywTM3^*S@#?BBATqN8qssR;;ioS2J=fhP9c zwKgclh6c<}Q?lYpc1g*W=W>OVQg|^*!9qEu%qLbdCDI6Q%P5DQsIOJEHMv|qb?b8R zRJnZU#WG8^m`*9>LM~T2^hB**)z=P9-*lMjE$YZCGdr)>tEbq}adX@0>J;iGPh%Eo zbDJ)B;%Q2Lxcr=>&pUEUJGq_oCZy$e(7uDY7cNl+tkv#q)-i8O*HOc@+Rz(A{Eo@g(s{E}u!<)?SPs zsS*G*Y&L4@HsRoiUOl@T6aum0o*z?r@>~~;$^n1~w1FU2)Xs^M4*Ho(B$wJpABDvu zR%a%g8kUgHsg={MhRh~gwKKZ5!)a$!|K!jGvYvD9L1`0uusG=x(&r*nU)?-+?fjFGWcFa+E z0mLB}D{4*SB(mGc!)bX;^d+n0hM`w9o2={$Hwcvav_|_Z4iRoUj>tZ4yD<2CxcwJp zz^+Ph31B~C;oTbUk{;E* z(^Zb^NmnV*wGwRmhO?cTM8l=+yJG3Gc}e@8y~-4NNO9Y=nxulH;jbkvT&u3CO<;IQ ztsbcx)S;qwoj2_YcHXq>7PI%FR~Hv+Xc$G5`KzO1FaVRQjLF2Ez{0Ux>GrBh;1?hv z8xY3s`Wwr9$dJ|t8;y@gMHstSi|-tTofgM13Zr^LNsDT@iItXs$M8-7KV~*CF8%_- zdIu0lBiq_sB|I5xGCycYKB+ZLrVE-IBmBp!MG+8~k-=>)l@2q6e&6K=FIQ|g>V`Q>LwjN`?<_oP zSo+%b#0%>s&tvq$g1;tSST~?ej4<_z%9LsGz-Nc~6%28xVKL2ig;2n-SeVK0xpHYP zTV5$D#oS8Pb8oNTj)S;i5p`gt;YL)j@$R_9+7)0bVhQm{dlkVMiz9ypm;u8>y z`8F!cqYSiC=mB%3tUV(QJVZrC0M_jBO-hFy=^*)H71SO~?`UmEACoA?2%0w!|9Gd>(Yoxn$OG2t0Q z%r8P9Pm0(hY|1KIOIO)I3`_2SLW13l84>cr#!Nn!FDEjm61RDJh5cgZ@$^l!(XvTs z!EBOlVmYR!pV6GLa*v=WmrdnP5kq+gI`)eqglb8+LV=ie=rN-yujzH&+}Qm%LIE8( z$||R93ppw*Jyzm!hwsBZ!@Ui1RkO5;wfhm&MMUXk97~cYdB^b-*L;vGC@IMUuB7iu zlg0eW8(P%ZiUKO<^BlPbW z$SQ;-gAQO$RVABRPNY4fXZvNbt0hb>)T^>umz7ObuW?n!i4r2hT(G^ngHe4czw&?3 z9v-5Iol+qC%qRI^-r32E4rX141K-)TdvY0I7 zGVHCfc6J!I&Uh#RJiz(OKK^}7wBXCg7crI1s2~*q-%)UWnL=+A%lplLHjXIXsW5#whwKpr%@gyGUY9!Y4UZ!2!Lg3wYAwphqy_; zrPpd$j0LBK#=(tRJr{)`Yx+yxtGtiD)>5k8B$EkKYWhYV#RB_@uI!(8Xd9= z9HreD>rjyg4(tIM0Am3Sn6R5$nV*Mu?sg@Bi1GvQ_96 zEo~PpNfYyTors8nCXl|*$~2)7ilTQlnTR>wXRjzLN(>YNXScn6_}MM3rP(BMBM5{a zH?#{#M8sQhkPstv;1(*mC#XXR5q<>AlA`3PtdmN)V>k(G20U4k#33mzw>82x%{UgG0;N|6Yty0qpP~_F|wp3oGf} z;lvotsEKI-A0QA8&>g}@kyi>x5mhg-HO)9UzM(ZM)F^d5u2W|Kqqn+{TbN4}qG~lp z1K#SUv5uLCRkbM(mzN{Sxmeg8_4J|0`1H|;d5-H-DJ8N{D8O&th1#OEUDKi%iv$7f ztfC{RlHsi6od0yU6uDM>(0)9847TytOP4>zN*n`CiaO#2fd(Ei={lcjuS5$=eQ5rC zO|@ceDY)-qsoheq1C;wrsS4IBxYu8YZ9M8$5Nof6s0c*iV#JlC-g&uh=>G!G30AK` z-3_7I;O7N^z%Rhge`g;tx8PaWZCQvtuQz+@DkDZ}-3_C*Sa*xP1xx8@)7a$HCvRup+0vi?2ps#Dv%LE_dsEdkGYi-uqA=?7T=5bCR%9b-a4q9X9aPp{zy9EVet_&;DNPl!i8Vies zt0fx?q@1whO^LGC40hT)KQl}xVz<=QI1iljP}2R(pcWT%rwWOZLIYO16x}&<4vjc# zZJUG@c1oB9-)PK82}C1KBvHCw%H=WQ4R-R#h{0yhTzxvZNNd7-7- zPD`&*pdSpIA2{E>7U%f5u`$GxA9|MHah+usv`xd(Z2IsqRS?+q^vfU){Brr33+5he;My<KNKpAMH zFd~Vf%6XR&8D@X--vxL_`(EU7K)~+fSM2j-KD2x`58U!a6*l{N?z!~~$0Wy_ zwvw;s8LeSi>z3NAVzH{h&F)TOM8-YA)nV3)k7o-MD$qtQ>w;1;zuQ?}EFC1W1bI@8 zyBR->dvWZHzpv?d%tO}|^vxr(LBU?9#sX+h!BMYO%(x=pMM2a^BF3?TGG9=Ni{(;! zS;?(LHl&@kzqh)mF;>dnT|=5%Q&_k?J#dq4P(XF;L2ThgdV}rHZt}Pz!m!<4h!FC# zt&5j4xl>W010ES09T{UwZsJTbQ(iIKF4l6l)(8`iY2t}u@sy(`=A}--g>TQkWyuGKj8s{Lzav*j;lYEG z4&V-V@z_|&z{im0($j2$aLbuJP81ML{)plruiNk?{V^!_XaXtsvZdi9IZNB)O9{k; z2T>Ewqs=5r&b&|96$RZ8nA*FQqV7uc>%xQfz4l9R7tLr}WO=ozZfcg+^qdQb+KYHl z+KrlvnExX#DJOH;Y&nrkD*4Db2G&EOQqdX~n;&h~)tY-JC6erFgAE{LQ>2WEf@6|W zKxjVRfh&yt+B@^mLxa7#jvF7*4{HKKOR3@_;NE$oVg>9!>Q!Cn`DH^S!CC>fAGR z6-J#M^CqUQMOGblL!Bbj#Z{#{~sa?8R-c#z5SJ=#_ep5>n9l{nFxxurdhTRuG5xJ@RqNhLE1elZLc zG*h!i#wdXK5fRD4kwiiW4Mj+>Rs+I}VffuWhION+?+_Du;DY9sbQaSqRoyzJ*Q>@> zRAZMke4GmB?%TCi2*4Ma1?9V8TA|oT$XiqH*lQrbi{}Obs=$aVwy49Mu92Zg^NA0! zW4HqmVjky!>+5Os`+-32ok*;c3HA3|CSX&4GPk^}WFwoq1T7_vO`v5Dae&yI)`g5% zdBC@?ZYN0}mE1q1@9Z<j&6MiF(D@gzcZw<2!_)lXQln&(F%KZahRz z_K~aUvCV{`MnDNadhT2oj7k^)^x5pJqkZqN1PJQ(h<^-hBO?Gqi%AQcq4R~bv!ymH zGf&Ys$)i0tnmQ@{_UsM9@T#V%uh+Gzy^H(=Go7Mbg3&oG(T7ffU^E;pCgz=Unk}5n zqc;1X{TC7`MfJALN%T&}*g~DMn6IgUSQhp54gAHfdUyWF=z35CBBbls2RPq;>^{BR zWvC=`nVhr#H7tGKNZ+DX(<&AME8sLVHUX!bvTfyV%TtwBlWb_Kwk?}1rB5A!D5?+e8ZKfPrukY2UN5g`RzsOV zXe)7G9xvw1Anx=^;Q*7v;Q8*V2;{o~FS$_i`I6`zZJwMwz}qeDPjB~qmx;4Bh{tnF zQ3+bn3wzpIeg9=*&WCWrJ=Ia+2f!4l9^do$ng{UW76F|e2)}RetFjMrGl%wHqxVGo zlT>Y;HP=%Bj4+gAC@$tR=@RwEsWgsr9Y*Xw&991$nr>NI({`zImA~tz0K6oSmg(*I zDHpNsxYQ0VayQ++OY%q4D8dv~NH!!$PytIAI+wUFe@kxB*xNR+t`3gp}UI`LeNESmVWT3=7=A zd-jnGU>0#3)j)9p6wlGLyG{M?aFVu{AbP@>iG<8I8`A;B^{S}eH2hRM+BF?6EDH1_Q-oJ=bndv_<}rYD7? zaG;BOB-`U=P?DYum>u9A-a?O+klfsQ!TM^FuPc$QGWQ5X>0czE9Ngpsi#OfdLna>? zZGz`q)^W=Xf+R*2`zQk>ZL8YceSyW~L1`Ugh0{9Q6wyKMtwvR~*rB?%!D;f4-fK-` zQ(h@#U~2*sJRSP8yL4=v81rC?@2FVq%Re!Wo1M&%QCHi3RsjrGED2B_(?Hdh9RZ~A zFucHh$R8o~Z*QQDf%qT{B1I7jN7K3Dku0b4iByWTZ0E!u>|hH_ zXD1{#owaxDyC`f%ZkbrWiQ8vq**|-W`anfIR^p37dy9djkSFTpt$MI zB(ScM+=RsT{q~a5(5+V9>V5z-H_U+8#u!QiMr^y57_O8XMb`(HVYu6510Xi~39L-5 zAyxy6;9z!WO8m@)=|Qtffb)5&ZDxZ@!8fyI^t#r;Z0v>`Vx>Hr15xFm*z5;_M(KU& zjtWFdRk2~iiBy?7zLZKA5iLPU1}3v%fHtRe)1IyrcVpF>BisQlM%74`ICRXCx!L(H ziN}p~3qDwi$)aN_`t|n#FI`*0hwSzSjOI!Lc=bge&rfJ?(oc7ni9;G$O$OUbqc5RB znb}-Pnakytd{9%?u(VafIBiptb16VjQy|K3vuU|lI7tX9iy8^?xtpHeC5_Iez=Yf7 z*Wt*Yk(?fruRW|=+NOLnvjyy%Q}W@4inYlz@{wcm^i5Bo^di~T+1Y++FtBWH(@mak zno^!Rd*TF3dgK-=8;?2)y+%R|GgQG{gTC+Yne6MD)8A|DL1#cZmr;3fu_s#s5?fNM ztReRAJ=qSyHt`A0zCtdv=mckEjEY**PN_}A_3{v#wwo!m8-8^08>=}tUSEPe_GfaG zTZzj2LwY{#(5_`c`3l`BG5d$_6p?GJ)9G5qv*ynhz8fOpP zX0+tZmTAfBT3y5Ge6r5nr>4ed3uevxgG$x?xoLSwJYGrq^3%WpmrK@FJZ% zW0{loI?bwF$Ez_*@U*S00+e_<2H3Uqgn9)!arU zFd3(_;2K-%_Ow95czY9s3$f+J#E}~T<7*=55)WfqeUI105T^{^NKs&~#^OAiRj8oE zLZW@lav079AWU6WgI;2?BQe2T>bk0T^!#Xp41@v~^|CGNy{NTkaNtGqp`^DsmdEeF zgLE|5d#`m5x@YhJiaM>@7m*h2Z#9;WvC&sK`)i7tZDF-=`Rb982*kjO9M{WILkoWAK0 zOMc{*qGn;1dWw2?>M9I#$amHB^i7AQwgt>H&Cb)C_}k{T(^WEA^{PBQCH0uWhs)17 z`n)5zw3FLOZ$etTx&wsY>{h35RZ`v32-L_nQXh4T=u4#0 z0nUj5WS2y2fq8_lWu#}jH2CXhjvt*lcEipSR;S5A+|4{$Nq`6)2+y^(@TPI1K@9Gz%M!eg7Ul=lhY&qCB+)OvA z>jNEI&}%R;&n*#{TIpZXfv&$IPn1UD!5GSn$_halvGFJ}N5i9omqm^0F6xH1W1{`t?%i196q5(tf)I0BI|y4GHsw3N-A z$_D89An>#Foihx}w3=#zFRwVnC!;Ghof>OSx=%DAaQE3uWR?=Ccy`@DCbW0m$V+O+ zTy|%5`?4__?{vNw9}5VKieUozK-XV42zeT;``vF7Zxqn)Z77|uTN||Y`T&!TJPlI& zSq;~*pr5_Z)AKaOWo9S`Hz&cv`~i+>9rH3Wv^sv=`Ps@>p{{L$mx#-*lVc;^IOw;VI>cnJ{I%C3`W3p5 zk~&UPE^3t)&XFmptC30I3;dMhbGCL25*Xh|sdR{tg)F&L8XeGkK#BWEj#x$Pc!#Hm zoeKcGMi9BU7kRJyW#z$K5pK3FhCL*{_j$K5g{py?Q|5bh)k;NcSh8WKp?nqR+7Dl7rYlX0k81>+_5U7WIU{MURiMb4%PvzW7X(8u2NY8H< zV3yn61#Sdm2V6g#bi`xF+Mo_JUpFYc7+{LND^#rEDh;PU87*twKvAwP+?}XLVvhRx zTp`JD-+hRoU)=wKG#K|r9l=Y6QTVKkor_zDYOI1hqF7#SAJw+CVaOG=E;qFowltG%-Z-Pt!N<6`|WD+mit44L3 zt?_G;)Tx@lP1cZeod=f0gj%Rm^VsH+YdDfB4q_an4_q{~O#i+QU#oz8SOUTq6S1TQ zboQYCZt@dBFrA-IX3|6m4qKoy_>e5!c0B)B^neA zGKj%*fx4~~GI6bcXge%@Q$?S4b6*$Zi*$x^_1Q%X7^VGy$fZV@MO?i$p9mW0w4QDB zkBR^QXy^*x3SBq0#N8NGSU1-LS;JO_#GrDZUU;Ri_8pz?VTAjTFB z6F*{aNEfnLRxKXyr^P(Vp4zexe|PNCFH)apOi~YhIq&Fg8SRW#I}w5A(#tVEV<`AR zg`lyESUuBOpOU)R(CaQq?OeKH{F;uvAVcs`MmgC&R~K%fFr6#lT-UW|)8J`_?WT4O zLhA7ld$QYNk=Kk?y*dN0v#}+&OoX{3%&2yJye+-z8dYKV^u;h@+@ULYrXwA>*juR6 z)ibJIgXND5y9LXFzKcpSoub4+QT$xw7ldhSQUj_)n`ATcNiiN0icb`{JpXmW5`-*Q znp#yS?jQ^mSJEg6PwhFizR1S%dmx)loN8c!rkt)4>hv|e?PeDcqc+Nrmp|et1YROt zK&OG@_igThL%d1Afv&%R!D}f7EtB)TOykj=Md#`yP_&}HzVqueCM)H_s<;@ICyO|O z0CZB$0y6PHUA0>6V|P#&lsTjgNESpX96BYl7-ULj(P7pYhN3aM=7pM?%i_q0V%nM3 z_B)d4lJLy)z;9b5EM3m|T#=3bGo+O1l?^t_x60NUROQuenYvDE)=9Nc8x7_%rBMy` zxGCttbYkh&^wa%yh(|jWkU2FSaj0obBMAjguZGtp%;4*dTu~4;smB#F_m`QhHzdVa@7J~ z2*8oI>Y-kdda`51N!w`2bfCqrs7FCOXe~Fe4Lb%qW3{SImWgFFx3O%?ptnC@nj z7RW(A9BO0p4h_v{)HLRR6=%(?v4yH^ zMG&&?7BnGo51NWfa-|U20*AxW04%lY9oy@XcDJBKEcs}oda6Fy%&3w`Da5=IN_etFkjgw`DY| zrp#0poDFG%}OKMH@^yu|;G5YbLFPU3jRz}z*F$i3vU&ZdjJv;h| z#T7P=9<(E13upZ316%~91%!F9C*-Sql#&}D z0omlSANu8an3G3#$OW|xu|!=I5h1K;B#E7Yjh16I1E=n7qa~}P zRaV-uIxHv5m>Vvz|1z4*C6|gfI=^nfv&B*={}AVnIw3VlklKb}?#0-}9R!z6EIR}z zw)1&m2KpojuHj%ouB)4!OyhzH#Ylo;8Zkz@jvNymbTTZ+^&o&Q-lmg5W33xvq!d02wf>E9g7eBh|niXT!acj zW#?v_?2oP3iBq*3ZnL%WU zcY+vku*(K-C^m@>+3#lz-wWgIwUUd_5Nx5$V>FfRxc%i*>C$3urPS$)x#NI83LFGa zl6VA$O~@D#!b#91cIFx_tCuLzkof%Z1Dxi)&iH_9ZqdU@qp2nBb4E~)!CHfVC%mtK zZa$pwQPt->KjrwSPwZ+CI&M!pwK+uz0Uqb*7C)NMe&B=$i7OYB zAgp9ZIs1U;@U{Uw=T|cy1j71d?$v$4dwj)cSxJ^jQA#^uaPF3TFrHrwq5^D6+l0-!QUwO-MjF>}1l^UEp%P*8lH&n^$8%j5ZI z$?a+C7${jz)W?qx6my|2-)c%*ZLRM*$0N$Y%?HbBZj4-xkf{Qa z=?IweQ|tHzdm?P1;0Hszb;y0#_T?0|DY2!T^_Lq)iY8TqhYm8WkyO!-7= z{$zHZ3gHFKZKtbKJmD0j+uWuLo_Ly)A1*)V=<|-;(oSwCy$NaUnhY#jq($9hMmwf! z?LAX+Qnj>oqp55D_F>0dv*6p~1jMW6^;5!Jx*p08KD!M*tQhq(TGL9^ymY$2OX7yl zagQWq4sfG8Sx&ALo|T)6YIuwNpodOk^-m$g!hedeG09x^WH~=q&LrldwX;y85L;;a zGwRTx-algS0@23Ud+uUaomrK9NgLlC3PhpL#HlH~Lkqdvm270ns~cjJo?g<-U3C<) zkXTt5y6MLzwgt7duGvl({@V>PHVC-KVC7~sl05}i*FZ%G(>2{HMvSciZcnK!$nWgz ztk;l(+?jOI@0<*@8P}YQbLoZ{+lH_wR&@XX zS=_gkNtO!=)+6w-ueg$3QnKZ_Tp^_tkTSxNRHzku)F0^XnnWsWz+7(-2#)M`0hUo$*RvAEsq{a3S0-0S`UVGPh-=3XblNN*xMOstj)S{*;`ybq+X z@u`%ebG_TFAv4yn0kuO}5qjPuRCe*Y808_5iZ>IsmlCOTc0MOieHYz5D~*O~$ht1w z_7ZWK&6O9G1gW+Iv|Rz=q^_S{5;8K3ti{u;X7Q&{3EKlGqpn%(Qk0p^m6W+$ZpjBt zWerPPHH_0XO*xkW1Wk$M6P`4MOrQyS33XN}iP{KixtpHcC5=Wc08|A8!8ZYc3rNskr%b$eEw^J{v`RG&IZ^wodPKHA@=;pEk(`Bs+-yr5&G0s zr`77IdiAR5oo}1yvUnM^gR#PJD25A{zgsy&Es64|g9AKbQL>ybDD%a#a*|l5Sk5OF zl+jeC9b1urZ=~aj_zMUd^9(Nn4)*CP1MxQs9S3jcR4(qspy5O~72`1C-qM=5j+*2Q z?{*U2C2_@R6acDxDo%8#n9eR_6ddK_LzjvP6{szvHWr7<^rD@9;HEo~U%+{;dv0bJ zB-Q(k6u=SMK6|-lMfH>gKS+stW*+8HzE^X1h7k8J^w-6rJo*QZGz@ZDBLLTZa zpeOT%P7PR{U6v z^P$U+fAizLS?EsluN!atr#HOrORxE@e|eqzLpSMBR~EWVzkh!9Q)OO(=Y8&W`taX$ zlODO#)9;Jkbirfa^T^}(*vn;Z_`>Y5PaomG=_Wm*1Wp$E@rXaYYH5y5h4v zpL-rfk0^mVJ(WQB<BTC>-fAxp1y7seI(~qb8`*lzM&N1ghmvoaJ zQG%`}P@QkS|0(oi@jsvGeCU#H^0sv0=jJaxHFfVT%imKZ7tkf$zwu*7rG8yN>2u$C z)~!D(@K5pkxy;uW6MuhmZ(=740cD|-JTbr1H*r@kKPmlu_6bvc|K5Ag{on`m`N947 z56MOMzxuI{ed7yX`2Rljsjq$fCHlS{>-vI_2xH!^7ntAKA&B>TvZ!HwwSGQftfBAwJ(1-t~n{U7MR(E>({Tq*b6~?y7P%AKJjZ$e)7FXkKTX$xbvaQf4ufu%JR;~KfbF8l%5huJwSy}dZ`CLl>WZy z>F*vt{$u*wcq2aS6;%FTU3sO{uM7U=Nl*ILlb`(EBS(JBa?x)poXY7<>|`OJWIPwW zj^F8>- z|H>bH`(I!4y|2B_`OqcZ{O3<>b!DN;f4zJDTmN_mufUJKayxzaZ@Nj3-0A7}-~HKz zU;W7C4}AVQp6172o}~}}O*iQgC2+FPkI%gKr|IVRzVPUueC4rSAG%48D1kfu7yjys z`#<-D|M==v=e}`u*N1M>BTC>-|D}&z^UZ%cf&|~csr&PdtLYIX=xW0KUw%40q95me zly^Qr@)sWcwa-7j7eC+l@-x5pjV#aN09}6T-xhn*+x_*8><_>5oS*z?6`vok)Bg|L zzjE)FGQEkNECfIK;d6Nw%FFNcP282sPf9!yDevm4zpCTHvhehD^Mwp3f%E_N_BQ>$wzhW19e23X zQ{i;~W&MC>q|)5!d17iZ)%FbxUeACxglFk$0;T78=z`w%I{2jjDa(I<%Ud`m-~8q` z^AdR5d%J*&dea~MAx}^L(}$|`%2&R!H?fn2fM=oqo$B>X+?C5uNZ%g`a0>rPKj5$EY69JK65RbObN~3}2LH{g z)QcZ?`BWLoLO*`+{U7l9^zDM)`t&W_oy9*rbmj7s($8lHm?~%kD4BKNB7Hp5JHHb8U{;I34@?RhRx%lFXdHPE)y>xg==Pf=exT#$aJ#KY6O zpYp_Sy7pQ>1^P)$A4ZR~A30bF%nJ?9Q?? zOyx6~lla3Q{*Y%DNx(-1IClo6{~HFB@^2Z??+<+714CX!kN*0v@BYX~K0=A_x#ymb zee7d?YV|Pz{t|zbr@V*3@GLwTPXjD{;QgNI-3f*uXYvX2*%_ulUOt1ddSDyHz`>uH7 zYi|G1eNVXe@1LnYKQ|7W1nMdy-!2kMB)$LD8f znCke`ZtzUwPJHg1zBeD2)2mwxPf$#;JHl3)JN zp*wzUNES*@CI7e2|Ht#*_W-4*ycci3b4YrsFja$6(&x%Q{&y!m|MaG(n^XbHLMf5> z&iC*p@aA`Ap~_r%;w0Uq9}lzs2Yq>a+ink&Tk%j+IL$o`c75nStvafPHCu2Ld(B>_s1{%@OLTwcVGG|Kl#?Te(=`+ z`M~B2fAGg|r7ZvQ*sFMYst=V+m3OD-<$wS8@A}?rf1BR&?c2&9eB>28{mk2dZE7H; z|J(b1#QTe~d@K1ZO8?zo{?+fO>;LdGS333Q2w`1^nD)ajb>=to^n zS={LbTD550)ezvYgr-+$LHe)z*5xa+Pre*NqB_NIUHbDu~l>GM}x$KLk* zCsF#pe8(IA^esbk4|MM;H zfB*YG`N>bdg8}{c(1$+sw)ea(`PV~$apZcr!{PN#?^ds-R z=YPHY?|z9s@44q)bh+`7>cYDd|MiW(OUdl|oIP89{_|h)wwKL);HhhW_q?V5Jy&?o zv!3_APA&Y!EzkXUHuZs@d(9ue`i?v9*xK5n#DDMyf3UQ)w6L)7s$Y9m?Hz0BzkJ5a ze(#s*H+^3DUtf{=P-69+&w1VJURNj-C>bSw#xtIA$t9O)nnvyVmEU^VvpVmE%NqQ0;ATd)5u!j<{K z_0>PPl{$hRQB9uqw5OdpbB5|xtyT@gAng79-~auY7j3P*(rfh-bv}-@u%;g zA1{6BODQp-=-QKSoqfPhkF|7+NAI7}yB%$xW7bFRm8?b+vE&tAJtbC`jv&{LQWNaK{J$o?by zp+^848X5w?w2JU0SO!pl**SXrsGFM`+=NOn;k5R^$HT+Jru%>btL;B`Q}M5d4pFdSl3A~fDGnF?qGzRC$s2HlC2`uQ8k+Bg8LmCba zx4pf6fK&ngq;cXkTCc|C6pl?%9)v&5fKqM4a~zOIH#qh!5Lb|H*r0{co5(wc#<$C$?m{z zhXQ`z7z&UTT!k|U^RKV9smyhhsm)ku$vt$l;F5=@tuZaY7?%zsKYz6N8TElK4o!b{LUgQqL9e-t2<%bU+XaSxUVp_P; z*w`3agfkNiZtvf}@8~|Vva+5%dj>V0o}N(I)YJq%zP`TH7U3=y{~?yGMv9B9Z))O;Gr%kD8T--?qvXJ<57huAZ=}JVPGLo2!R5O32Xp7s*n$~3pXJg z+<=F&tgI}+aK^oZC@n3vGrz;!l|G}b z-D;XMSFAqo?jz}PSIWg3^x*l6>kl8Fb-f2QryM<@iR~sfYxHko-aP!-!}P4F%T~#$ zs)fJIRk{C2<^DtWxMXS9ds436&?59@yXmbp`aK=F;BjBp)3;cwYYzO0+pdDf){@Td%0B)Icm1#WJ<<*g)$$LP={7le+vCtJr>!Qp z1g@EEF}jKQy%rAckHhuvJ=kyMD1O@$j|_|zjORgXryXWCt8~m~t6V2Xb&IJT?zp_m z9cW$rwg;RK+qwwfbl75YYo(6a@2a{~9%cbggzmiuXB^xQSUK*z;jqorW}TkJA`Qdo z%GburtFcZo*1;Qgg8CL~bS)s^IjXvo6f{PkyUYp35>V40cR_W8%;le?6bGNYz#Ya~ zuBf?IS!>k(6Z20<58r-(C(lLytWAaW+~;=24TCH<`{$l!DYtZEEKE6)9?sczdM%-@ zWlCr398EvvCw#7a(U27sVI<88r`T$|bW{GE71OArRC{uN*{P%D%5op>+kbf-+w$5s z%jkHx_9-f#X?mn3-KELjyyBEdjjs5|duM9gM03>-6koesAM5%l(L7FFkc1<2MC$Gx z>4R%a|#b90Bk>_*I|Yp?&{C)%ucuJY8* zFPRGIb{i6;wkN1=ja1#1c64+0(M{=xSEV1F86`QNkx8&qna%bZy$!Vo*S-~9^C56g ziQo2yu)~$%hYRi;q^WF3-Mc1s|BBROv-32TKf0-&;_pynAXqCp^TW19)!SCR6keWZ zwkE-3b?C{ZaR*oBn~Fs57D(DYw^DsosnPleCh7&jetBmXmkEupSv|RG?ULf{>#MFE zc_F^~`M$N)MmtN~wuY}+P_XNd*6VB1FD?zSVN6G~^y-f%R#vPSTQ+0%t94UrZB{gg zEo}x?nA9e;uwefpFPXm89DZo)+YNI*&6(CTe)ikpGhPgz96#jO_+b-rfBv;; z`tQ{X=LPOq$27%{cM6rwob&nDCGDfuR*zVfHDqq~kJGEiF3p=M5VVFF#tJ!m=JEWs zIb&A89l0g{mkrN{3q1RMqsQ?RY++JQZy1E=>jYlY3N`6!*8jR&9UW~-cqOL#>7kY ze@mUrWJq@=tmd@-Z>eMW=OI60nCDySzzqL+I8K9~x6}dqpKp88=I1SS>ag(hmU>L@ z!RK4*RDXWnQm69#yrmvPIao)Y_BU)QK85%`NchLWKjX0&``cV9z_uPLg9xIcTS1gd zoazS+9X_D?!9R_p){mRI;2%}bDNnL~*r@SA-8EPfW-R4i569A_0`uoDfb;La&q0)f zZT*x#)>3_DFWt_)9@?$w%@YI|_j-H@dIzFbvaKKJdK;+z>6?l>%y$29;yLXfPCTdm z!-?m#zW*US&-^*ZIY68`8gkrdBKf>o8RGJzD&MSupl$Y2Ff{dq28=qX@0c_{GQBuqR%oA7_b^UMdP zX+S*O2@Z(IAz0k+WT_!c2U~cc`u}TFDOC`p_}Ns)f(TMyV^dN6`Po!};pCyfbCEIe z{A`l{4bL+ln5F^our~(8qklIQlQ?yf^&nxkJBm|1rya$qp3{!vRF4Mu8iUi0;#ALR z1@l=?eXaF1>UrkFX-9FY=d`0Z)gul&if#Qs*V{n#wKf%Tz!{6Vyxk0|r!1sJEWdym zpXBoJ%rYp1WRyWUAhjG0vu zb)P!n3}wsk;-dOa^T)*i!#Sb6ljNJ*IzW+mbpV4Zn>s^Y)&mU6t?l&9s86rxqVgCc zVGs#tS9M`H;!PKozaCUFUn^NN=$)7&4GLI?>}d*q#roluz=sz1`D0HeXApMA<^hEr zBoBZ_Uid;^$Uzv$z!71=ZhvIPN#1?DEHz5E7s0Kkg$ybxF}WJ#NHHTgHy zugJStE=z)HhboX~w%Q3zx{fctWw@H83yXn5lUgacnJ{VHk-7A_OTM~}tFNB26 z`3NB>@Z7m`d4_afAp`^j;4CdIjSB=HSpi^dY|I@SKYlzI!Wr}6&z%Pt=YY#N87};m zEn6UmJwifU7|=+9m`)HQyE}z*AZyt2mv-zR#}INL$B;`y)DWI9QwTpWHH1$Xi~Ab> z4{RzmJ{T&DD1X(*4;;o{2nnn45kiGwQ}Gi*3KkqshAP$%0W*oZsrd0{-BjFpys6;K z9V32$u^`|q-FuKV?0KD@K^(bfB;)|+o%d|%cZLZ}ivVdfA%;C>o%3p zJ|V~f&fGET;}Xt+$0HT%7}5qX?0gRRfYw025dL5?gxgitms$gTvBuyfFI~LY^Fr-M z;y>|1?O**3`gq_#o4-Fos3Sig$~<{S$eukdR#pu=c2rE5z!L`5PoIwA=VQn6goDP6 zc|Cr7>@UA)3>)S%dNfa7_NSi`#*S4VHVn%6%w2Ln{p8Hwmk*OVJb3WAp+k9Me?tFm zs{fn%ShKnPb1ZDCk2PDN%##N-RILRV&gF%?7d@!1YyyTMiYMHi21D}a2fxl9#gjjI zd=Q4A%nyJ1#2|jsplZ*~AE6bV*q_k9o9h3jUK!47v|mhjTM7jbPac$OFc(NTCu{!B z69#4I{DEP9{Bar}@in6&Rc7(z4=f#lVJP#%iwKP1Ck?7L&KU-+@WlRv{@qmnH#IkH zZW@Z%+$o5~lLxJ8T|FQklh6=9{4DFmm>(;-h#!8`AqF<;>~>mrUwHB(jxL{geFaa9 zs?j?)k37iZt62Y>{%bas(c<3sE4b@(a4`78YZdoVyr1^ax?euw7dB73U$OAy|JB#l zf6b;6J2FUAm z;t6;AZ^kcdg8YW#7a{-ZKdb+mP4%T8SXUG_io9=-e}rL#Tn(SJ+)gWsdq**uh0 zT;Ldk-JsyB>%A{51##ioI@=tb%7t%YHlfPIIL`KS03`c0m)sU>LOZqVMqEcL5JgY>>H&VN|&etG;9x)SS=>08+xb zXoHjsz?ffp+H2MN1;JhmTgnB|r`_n|c2vKmwRW%jokNF37cbbShe_xu<^@mb!+^*g zCH!rNq(7O~QoV^0^=bF3%&kk7%>o7zz*B(v%?CuR)Ce~tLRFGrbmbVfOgxoj5*bK} z6Uo1r9=rzn(8u^J@)`Lna%T@JoRvI(Mvj>9S3md>c%Ksg9{(QyKOcYTrur+NQDUJR z1ag{>Zq4Dsy!;+(;`3k84auxV{&@EvIq^hd&3O0@Y1A*(USd{E(I!-p@rf+c!>tPxrL_|{1@Dy5>%`z%8KUG0{r zMDg>J-6-&n+O%7#g(yC~3a*AaJLt}5WQCrtLFEqUfp`pT4nPpps_w)i8j_FD^MwN4`+_xc=gnQJ|&QSJ4*97^c*qN$2<)4}# zYd{m^pJ29?zsl9#aBtfX*2%)kIYqp)Jy`S91Yjt{i;d=IO|}Orybv404@rs({Ey#M z`@ZR1y|{D9d@f9TI=$Sa0}7p@V>)g}b*Sw9vi+N=QS38m^7w+Mr>mx`Q`o3w@A!8T z-_bV>Dxb=RZ}x6ykd0kkmqNP^8g)AOby{8ha!jFX^7PKRgzgXhLRx&g;VXV!XH43I zf;uwHI*k-M&r5e56ziHX2hHo3Qj7OzfI9_ef9Z;Cr#p0fuX85|iv&xs^WU zXEf`Z_tSd#uCmUaoX?ni=?d+rvF*sTV(=0YUHeXT{r-FB@-b-2H)zQ>oAY1*Y53|;`2LoliM=7J_U5b)mq8dy8pw-s#9V^yX)i5;>DdCMs-*w zbY^LGUO3(9odYelXE4;3*j2g4uV~cnExk*kbJe&mleo@=g&hKiK6O3sxtnP10=21? zRR6pYJ5$v<{@X6a$It}1spwf>K2H+${%JVtWc6q~(Xm#&Qza2#D5U=M3qNa;F6W;$ zY7jppssD~m)%`hn9-_jCkAn>P(>!iBI{FR12?bokoyQ?0%!Q{i)L2eDYX}MdCHz41 zp)&mRm&uUlcyd4fG(XVwHX!{MZ>o2%zT+wCpuBhHp5I4=S&Ji%^}vE{ieVov#U z+9ZDoKhS)r3_ty4%7N#2ayeLeo+9~yuD1c{t8c15@r}PcF)FMxkRQ>DkYAv~@*{c= zBxbXPwKt5udt!!E?~mx^*@!|orwpYS-}pNo|A-!teEx_Y82X%?#pjRc0UR;FAJGFI z|A-#c@c$!vwYBe=enc-ZG4?C{h#ok*ySqY*tULfcKcc6y1m+0;h+aj-J1mxO{2j$K z``mv-4<-vdVSf4i5k25zFEhsfAMqo4YuB#jo&gigKaXJ%5fQS?bg=SzdV0V^;mw;j z&!0aJ2??>Wu~Al5W(xx;FE5W_Aicc2Ae>W%P$@1h4sMu~l9J*?lDvtD2^c~X5Xgn3 z_4ZD$`+&leCr`+Za0!8A00S6rD*T^SD|!!Be`jZBpYEf!wszB|O^_aRBsVt~b^qcK zYY6m|92qSwE#RR==+3Xd{t6*f9$+v8=aB9L8iK?i83+VtI75r9JXkq*AK(ly+=STj z@^WYtcxvDAWUcLgV1H;7&aBD9m}5_J7*|jZ*1?1cHR(R^%rXH?`s$lXLYUu29t`u( zV_5srD6-5XR{p8q0^p(WzA>Px+Op)ed`6UzpUZ5v@U;u0y>89GFp#;ahaj9&hEQp) zF&^A7X`?%tdtcyEQrHqO^tPL2pfrJdudx-tpcBHwigPrBz4vR&jpgp2`fN4uCAo}8 zD!V~ntWCGywS`Bj^;oR_*-5+dv&2B}-`5BU3dIJkN=p{5s9-!&#V5qFhCom8$UsQ2 z=lrOkB{5Iok?P{uv7@^msn%0r`4c|@1~3R30vOU5ycCOx$J0uc(&a1Q>~r7yj+X~(@-SK83G)lHjE9jN877$IV?r3?f7|3Y?vq9P zD>l_g*h!54Bm1#$Q|a(=;JZ&9u0KeDC|}0Ji9{@4*u+Y*GOQ#ghDvg0xcGdPQRb8- zck$B`e#V8LQRZjP_*nsXx$r#x_oMumy+0s#>IhF!;fVY8RasAplOKUzM*4sf9=U+R z?pkBHT3kD@V+R%1FqhnZOc1m~d;^n=j4nWkt)Uu(0MCF;q<~y>Wr2Y9TqdnmT)Ihe zH2@Go@&M15TRcO5*3tO&V;sgaX_5N8)sm}79h!8W7qdQIWa9?Yl}@#iYwj$CkhOOOe!4ydYpLrZs97bxn&e>|wj9_f^I*pU+eJgv zrmc1raH&7Lz>ZP=-DEEfEq`3$e zW*=P+0Lj}LszS&W4H(~k|0c@h7h^H9NP$s7y1YN@d42y)Zpv+S|7cE=;O`B@D z@hp&l?o804%hN!!PfP-Fg0}`PWffZoS)upIRHo zB-NC2V7|h1HYXn6UC|mcNgm)6CrwkhK8Q&e-srJ!RP@{ z-BuxBFbhIz+NxfDNF#XwQ1=g^;vYH1e00@gTEh!S6^B3*n76mLcXf3Q2ncxk^y#BV zkDv?=z=xLkK?t552nl?92lEC72J8DD5CZcU`1US@OcERe+V3NjQI~{y0GRpXn5U+X+~q4G2)9t6B|z9nd-gp9J`k^P61d*W(>aHr{$E+<-_6^1ixoaj z5Ek7%qgF-|L>)nN5kzMHdLx3+Wr490r%kK$^!)7WYuWuJ5TVPKz0uKmwR^WHJJ@{U zMAXuPH(`~>o!~`_$fppsZtkpnrL7&~TFxu9a%J(hor!AdNJ$ATS_~GA2zhQ~{;QJ` zzenW=mBwdut>2t6e{t-Tsdcgn9lQ2sAOufn-1Z+~;>`qBMpZXOwjsys=9jyN>*>n1 zcVnM>R5yFrdNRRScfS2jY|xN#-MzEu4$12Nnm@L10YUuMf83t-&SO>o5S#9rnd}C+ zvNxo%_flK;&6Qji59-a03-ed$Z`xD~7Km)!+VlI~qM|0UvQ}Jjnmt=|*Dmv8$85#L zoz9>4zIH9x!6D`3$?L4->eUw(EjqVxqrRl1qmmMkkBp3-n43og2EKgo;MKHg!c=(S zLJ2`Z{r&sRTwN0r65hnb6y3j{X=@wj=$Pc~o#E^IQcmtRm7g<5TvXI5JUllls?fyb z*|~FG5Nl@kI3VDqzkhaQWZ|nZ5JjuK)4Jaj0Ll z>bSrEtB8og#Kbqn#UFfpawbezv1rjDQBgZ3rF%(9Z}s%Tw{JK2>8Ia%liV8=RFs}x zo}FD4A7A3qVJ|n zTHCg%K*7Qy0{XReYv1owTUb1K`Lgcy>)MQra#Pc1Vq&+~tWm+26cryhI3&8erye{)4cc1=mi z2Y_2!JDQu@_4I;9j_mmhc{w=?50A{Su>8=_yoiX`DJd1Xxizm|y?^<#s-dCn!-uv< zk7y1K$wESXzn3m1rX3Ja5E`1FnORMvRp;lw4+^3|2Vrvk{BrE=lclBa&Y2@dov$TJ zPDAp~p5=Y`&;dh-JGf$n($=ji0s>NV=ZaHds&3y-fZ112xW9V!6;2G3L_{n%Zq(v* z_3zkJQmVeXw;~K|p2}+8RuN&ACd02qlBgIs~P!fmo>zvGvB_iYt1dFjfg8br*ikmd7lMBS24fkkg=_6mVapBO^2tyELIw^ zSeux7S?fmVhlaMCS9MATp_5izU31X!yU9I^Z1H-TTP`_{o@rZ;T7EzK@=xJ)O4L5a%v@%-9aHeXq>e$%OoN7T+7yd1iG9a^~v$(=@bm8)aT zK0G%|m*n>4iOyq&BcbK!)B&V@2|21aTU?NtF_{xg%69pDJE0Xy%lbaR_Ek0&ej|nd zGgaP?GMhhjw6}MC{?bYBLWquG<`zaTPyD3F) zYHMnn%PN~_`L(f0Z;Y&-T+)u1CD8Lj(_0RiIeF3UKg_$L>pNx5wW%A7f8S)}^C-RU zLt9=!osC=4!Y$fcPPqRvyXP6&>g{SauGzki@@1}g{5V^2=zJ|=in81_|M#`65%F*4 zZ`N5OY`k0Y{*UAP7LBn@`XMR1k&D!Z&eI&e@Y;~M8cX)veE1}Pzl`TkzssMv;0haw z+TU$QEaq-88L>!x!YYHALZ*LgxiNc_*__ShKQGjpE@(Vw+pX~n&M^(?ye%fHMV+>s zaNc#=Ranw}kA&M6F(;v;j!X7BjF_ju1Y-$oy&|m^q-h>^)##bJX{54#gs80d%oRMo zDslam)5bSLK@!qUK$3)mOh0^wzFwzsk$BF}ivxk5BbB?ukiN&1t{OnM%SLuDkwXr$ z$wp>rNHGL$*RMWz; z^Ts!!{+d_CI`zs~2a~@adlUGjve^=@beTK!3*L13`}C_1k&17#UvhnLPP4|N+NCma zW9HdxR4bmi+GoTZ#$Cxu`K*ig>6Zi1)nKIY7-@x}bDs6F#jOUBb#nL0HY+BsJRYiM zl%Q^wK4c=}sry=m7wREM=P5FbMkaB{ECDIrd;jv?r}LH>$Fve|-plt(Y1wB~GxK1| z&tws;Db zo(R_oZ*t2+cMFkE2{MVUPc8eb{jC11$2%d##8sywXK(iVb-p7(D3P-~ZKJ26`|HPL z^!OU&9AEpQw8b#+&B+^?GgdoJT4+lpN&Pg{RQ$@byxR82oDUWrF9o)_jhkV@iZN;3 zR;ME;ea24GV|(>0ZYnXSYB9&^6OPqlPBo0OQ#F??k2_R+=|W#RQO~(sP{|fPX8W%3 z3+hojjFlIJ?~vW@{iOs|ZJihl7TlTJsVX+QRaGS;BeQVp>CKu2BDyK= z`AASXN5T(DJYZ;vs5bEW`uYf^BSfIWBZ-NLjAqeu8Azy$>bv9Yl( zE-quo{yJ-i?LPHL;OC3R^ctef%*_1!d@6kZ{(W0pTRlBfz=TzwsimMc#BcPhd&xy%IKcV=!n6oHqrZl`+Vr`J)O0dbv-S z>-pz*j-YA>gu-)^IKKEtH3VuQP-)MCM;{2(+H>H6csMIuYt@Mje12amqlw>+?jn6v6eQuH_bAS zZ+@_2Q|9(X5nNy?wU_y?>7-OHzumdu2`6~DaJ;J*9qYCSUDt*#rA6Ppko`+*&@!P= znM0%e@N9F0F;`Q4{J8;Qo&*pdq<a(x`Y=L}aQ=pH zB21oaM%5Os_u{rIH9w1e+|~XVbv@JReQ^j!r;8%Gc`(s;y>r-lpNQ@5k$cfQLsVx` zUFi0y-Wws{pOPIxd*`FA!tHC;fAZXcUdf<*MO3VT-s++%3-r+eeeyz`AzjUZ81A|^ zyKCj}PJ(DSJ*^|@0D5r}<(xyWFQYfwsN59Q+M$mg2!&Q=oA;Q<&FPdF`*F)JO_odO z8T(P%arE*mdZmDhHBp%ns=0+4Tv6AfXs2U6eE6((yJ=qnm!hQ2DE$CRJ&ZCXP@X(0 zQbX_bQPoYqMiDba<(n!GOE@`<+>!?!>1iXPo_Ia|AK4UpKXn`T&dIlV47C+ zRyN0Z3EV7oU(z12g^6Li##+*4QOQM=cZNGm4PkAaRe#^6`g2OEOG$p8l3e#Zh7t-6s7rtyuYag9)rd(eE?Ez~6EkYo8SySE}2 z6NQ<0gQPBp%vO(ApFwsnTCRnEmI=IXkgcfu;-Y@$W#imy+k%!dg*>i6nV-;$X7u%d^ee5_U{_cymxHq8B{+XS^ZjKvbzB!Odh-MK7Ul2P} zh}AK~;^4k6TO@u7%5C+|XaYUVX}R&NeZQ~zxi^GTIdQR+IQfd$l}c>O==qAmlkRWK z5?XF1HCd-HWSQ7#9Ni*wzf|X~fIAxH&^g|yahiJB{IiL3Fs~cmaUYlNpjohw_f)k}T zPSFq*xN&}$wW`E@EA4Bd%Sc9h|2#*HGk0%jgnHacdh#GIJ+b_4acgs1S7!&E-bH8p z>#|ZhPVx#n{`m5xjd7v(=;~sKdfYWvj}LIdyt;@$<+~D+#OKb=e*8msdoMFp%-@jR zpPdp%XFVuQ#6Jsh(>RTJ=uuSQUDW?z3N6UZ))5yXc@Ps{l#`he9h&gaHQ3R>Sy#^d z!U0#!Q)HKMh>hYQ)6?s&?3sII=M4EhOPsEsgG!!L5EJNbwr7;P@nxPQR&lI%lJs!D z8*JWbV5_PW-x$e}zUKV$ZxVcBC58o9vbiH>tNci>D2bm!td-eb{fBNUJ?%-xri88* zaYLK;7r0)xnw%7OcM!2~2=T3+{-oc=asCtMtQ4`!Kg32hj2_#=C|MAihJ%0LoVJQJ z@$=999%Qu4i9wusJxk`RSFes6M9kpC%PSM(z8$Y?G+5J!u(DffX8EhJ$>5p4{%}r# zO%pe63Yc5YR8%L74Cm_^{Ay@ENJZ@jGqWG1#D6hxCWa6BfeI@b6P;hG5#z7r8xYDz zEeN$jnZ`J`A{{H@J7Ri2UY|g1sD(bVqvOY}b^>({??OZyBAU9s`PliJrWx_gH~msF zx;^+)39_~!ZWS(szp71)9?|bZ)XIhgLhor6-+V^H8Mf^s zn>t4!^amXgo#;DNRajHMQu*upWI@f+gDDY#;9|(>9&`Pw@iO-CmrTvkP7Sw+kedET&AN%KjS&eYKJwaZU(7QI+ z(rBEG`7|As|It<Nd7*LPh8)8RA=TID{@BLI;7!}7hTec<8uIz zv>RG2YAUT0wC#+Yj78p2vkDRYA};(1>kn(h-8akl&)lH2S2bzZ)%2ZLo^#=awO;N~ zOJ6VPCny~(c|B&mWYEsb9AVID>ssNfi2|a|+a%rP%u?s>wA`bf$uSwLdI{^Q13LLf zufMorOIv%wbLk!kbn_|F z^Z$JMW(A~r#H4KYX2ajNnCw>T_y6zKF-XJVrGi=9itXwOjuntOkcUmm=4>@xu-67g zmC4y65*fL_96Vv)ViBj^Y8j{Pnzt(_&D^NJRw7VDzmPR&$mF~iI_rjx->e04fw0}` zlYWeROv_nekfnR!QNywm)(xUYZvi`L(+JCwEr}%}V#ehvll}vnidF8%40$r7JauJ}k?@hcrwvIHnClAzYk&hvs)YEpB;`8DsB<(MP0tqJ%u@RZ6ju>0VID4H;dhAf zUG{FmSDM{Z(#`xDJyJ>xgK{*zKYL~PY1`JiC#I{qyY5tae>=9yCc;U_f}EH5^L8lw zUAt1EIJ<1T+=|gLJ7 z=J8&q@>PxV7gZhH0&ly8N=RQ@vV6yJaak_>QLzg_q3JhmLrzK>t{0S8z3%A5-xfK# zcr#%#(&yoP!`$(bf{BxJ^ieUx6|2szSSh(?-HFxf_HEd>1FpKbxOjPaVP5_MV`8+l z%nly9BqL+Fe1-ISL8aAeWHxS=T)1S@iZzTsH&a&bdx~#vZfsy^bpL+HFTX69Ge>yA zqLXXZ$qOt$Icv_=VZ$eh9%FovLh7tkzs!#x-nn!Cke{ZkSb5ac{PBg0j>}h`_;upa zZ+{rJYW?z+>y|q^J2Lg+QBcq>;p2ynTskGGw^mR>aPz69D|c+zyv@?ql!?^W*Hluy za9Q>8;$>?mOjq))^q1vdzA(O8tfQl=rS;3F z*7nxc_V)Hp5Pm2`9CE?gTY9eW`C~dtcX5^}eb4eRD(O=a1d`@UgAoV_Wm5 z_Rda}`tm(bHzqYVx7XCRRM)n=D{pxFu0Fr0=2cNmMRikceJdWH>h~>GHJ>W0n?Vg9 zKj#&G}=G0`;s=}kP?*+to`9*pM#NB(8a_>jtE zb+lJig(V+e71rez)V?nIz|$NQ8d+fH5n=84(AM>_ooBSYSCXAqvXxuHz2NN9ipIp$ z!mx-Jpy-4=$RQ`M`qk^YoL4oOIn~*@HQoWQxSPvsg__zw)w|(sU>$5|7inl8ZD1Rz zYaQVolvPk%2Ltk^^g~IvBI9#k=2dl@zX$WQ%*xcvO7DPN?*3~JIhv9a35KP(cy%X=~IspSUe@{?0+!J0j;jh0nU1-j0R!-_+FJ{HX)B z1C&8;-hBjr7@U-h^1J@e!=efeEW-_N#@?_?J)<1P*5A@0)!zNZ4Tr>wnh&;#-CTFr zW}}#+&~b+~qPB*%Q8};5GqQ>cimDo$zkt9$zpyTgRs+Kx{3P#Q;7gG+)>6v%cb;^Y zxyt^(flY2DSv#e<`{V>YDOS+%oVMb^yzS;o_S{^w%X0pX8_R^v=Wa1j*7t91>i~g2 zOm4=@s)XldPh;O+(0p`I%3=N%z11T2+r;m(^*6OivUW~$zMFL~FgGmfjkQzcghkS0 zmtC8*)^PG#gNbVl#;(v?E^J<2`4Lp~rU4I5TymM*wV>~QJ2hEA_R_V`vnr3KZm?kM zZ)Tfp<&^5=mFXQo3yCOJH}D-f_w0~)>OU{k8V*`?ZP)^>(MvUB67xa%h4n99R;6cE z`8=YHUUcQBKNQyVo&T01U8OGMn_Debrntc(Rne_ea zs|weHKyWt_nOJ(sJbJ`({qLrqBPQ*a)p=y+p6TQn-SDxId`3r=j(PHJk1Sc$yF;fQ z9y;&p&x>@Z&chd8gDwo6r#X4GE+{j%PQ&cU)x}3VzMC8{biCo<-wcJ7T<%0QHhx5i zZf?&0CGQRUG=W_P-%ma^Y`!M89l1pNmu0%+R_aYyWiWBI!Gu-%zb@AW?YroAWy!J6 zg9)^CFp~Tg?HrVOXnSRK&4*8)v?x!{n53i|EwK02L;;1L=P8a@e0|&sy(#OAW(t|i z*y3Ha82V$YIcU*3tvU&5w0|U!fDP!zIx(c8gp^ix`5nn} zzmk>rIy+rcnFentFmgTUuecsM+O78bI3Lt^R%)0O*egpS_E+H}lu>j~!_CtY@& zbcOR4aaU00#92s170IpZ2sj?+b2BU^)yqaN-R5XbpmeF3aHhLU7eYBS8mEC05Vi%Y zL+9@tzj*JY;{DUgerI}hLggW->Bk?Do&l2HhXPL3`CmwJzfv10hvKf(g(^LdefaTn zM`Aqh54#+e^_EighwZ7P8?0g&de!i;s^Q~HrcogJj48;`0cl)C#v&+Q3B_GTN$Pb^ z)#AhMmsZq9#zp%a+|JV~4ZBnj+O!_+-iBmlkcu?&JBOZY zp;WDmhsLofIe`y@9ynbozPy8{GgVrqv0CN{TIPwDEmJ{g{R*^b4qCMcX{n*hXOO=< z$}_G{Gl(CI2#M`QI+xM4%SclaIbKA5s>tDD zr^J4qhO9dK-FM!jhl4!EjzVjfqWzoE(OpPV1YJ0WbS|P>ddSuQS!fm=-^lqqyKH{|QvBN!q$K7K?GANEy}f=c`?^MLhMLinpGQ|=IiHKmCj^GTEFH*X?G z#~#JT_Wg%@eLeE<=(_}hn@~v}0QX)3le|fj+zH}lZxheE*EwBB2bq}k2ztSEynm0Z zta`3O0d6uK5YijoDI=3X5YD~+$=y2$UA@{*cyOo(tj6ot8G-`Sk(SmaEBj^Z)|RPL zn+O6_L|IEo*k4A5S&50vKCsxxXE-t2nERa_FJ=F|Azz-LJ;o; z4@Sd>_eoZ^FV@?;-z6-lBoBZomuQ0rgZUN8U8q<0(|}SKmWdPlq^QV#uChvETvP59Z>x-_VjJe?qk1 ze&b?}}@#Dcbz`e41m~5QHb}aaeK( z5AqaEKwv=TSk?sL1|iFqRc_r1s_0gEugZFrv259&Fvqg&evEVMex$JPzCX0-7Tj@J zc5i=kg5Ylc?~957ONZ}+rxjcC7`~5zHZdS`eDL4IpD@Pa zo(?<#{_|&hl_x;@f9?Bcp0hmAgVp>mY=V>dU(y73^Z#WN{FwjgCipl16HN@%oNR*6 zgOdZ(C!z-Wd8(g@p3h@#k(0qcRZL7L{)*33vHk4hVd*PW?GcwFwRxWy*6J<7i&t+X z`3La@RCz_@P~{qyZ5N!$#J7BIPkB`l`n(7WM`04HA0PKB_igP)v@sK9ik0nAHgbX* z;GII!fwX*(a>F-?%KJs_*>AuWNDwx+_KUyn8gb3}DTw63&?`KxsJxExjTtC9r+6FWgUulm z&D)`uZG%Bfd{jmukf7L1adAZh-~k4644*adr1DNdNf5GGM1mA#Vsa-E%;nARpV4s< zK69DM!`15gCg?H*g5V|yPd7QaBo8$fcOKJ~KO)TB8iZppT)Gc2L zQ_ub9G&XM+F?KkS`0h$d`6VX4yG4094F+tPQ)iZ1b?I)bie11#2?Yp=E|RA5xKX(D zC^G$!g-qU00`KKGNvsXU|y0=}TEQT2w4T1*Lq#C|}!MMypFotU<* zww)Ns!?=-rN@mHExa`A59@;5yAAUf$E0H1XlUi^VG_m`{WRg!RlLI+DmeMhIEPek4 zvV#7~xIEU4ExMLmed$g#DE`qrJ0tGDjSn|qv6GlL}e zpBzW>5haH}PmA|}EPM~kUe-0S^Y#x*wsg1;Wl%}W7qinnU#AAsjmgJ_n?WJ3*Lfre zUU%7lLiXx0nJW%~3TH1I^w4u|4hoN4aSHPo3o2L%@}>O&@=Bj8r8zyEb}s1Edb=lo z>|3!RPEfMbF9bq>Co$07jNd`FPiDdzgPTsVv+zhtk6ZO*?!gv&FI*3XfWcLeWzckG z%SnJ;v6@5$q_60L zPF+;Tf*J^C3WUlVx4pE??Bvz-v2YaVtfD4F9hFvu=BN(~@FX>zRu~eM1c53Bx2S=~ z&#M3|xce~4LyN#yzOPS6&k2o6@$i2FZGrQ(8;&ZvmH=-RImyH~x3n_xVC(VVF&7?S zDlaT9ODimeCfM>|4)t%#Yy3hZF%LI^XX_6&z(Z%j9|kQeuV|0;>0gp22bMp9E>9dI zg*A4>0g^9xQ@&=~J~+Gj1cATcy#w%&Zj*i&u$@=Y8B+x3pXWUqGkiD6WB&!q*E3qN zKC;+yBMIYUiF8j0=7EHSvA@#!^Qrqpfd`lr#1fkj=AoM~U)cXyLi)9%l86`rJa|(5 zNgf1UgUJPR>~DHV96AUI%o6Y60VcZuA{Q0REFMN!7;qIBAemsQ$Uv;|zib8!3j<$k zQxON8v6#!-&9HjPLR!S~3z+dqE)UNvgF;9~8I%K3%W);hJ)s<6I76A_%j;W6|H7J9 zvizc~mGqA;YNPTF5k*k2eO6TWsT0mnwhS*Ws_!&^TnsRr6UsYDzPYUf6q#2CFsQPr zGvsAGz@XgPPT!3B^olMjk1-Mkk#KfZ7ltF=bW!>1K_&CGk~M?gi8<1sfOW{8rr=ks zA6^N3XmOuE_GEGfVP|X}P}o880B8i3Fgf2&ssl3eT|2;FeuviH!*4gkZlKKS4)7#x z0R|G}_o~zBWgia!P)LD|pV&#Wzn=?{x{p5hXKw=o@^W%v{qxR2Z3V~z>ADj=B-)V1PkiGD? za?7A*=y?Gu5AbC34MVQ2{{GZrG64)jJ-`q`@&K!(>6+%)&Uf29)@(i4VnG>dfFFKz zArqfkn{_@}b*beBp}<3`PmNAIytKvVm~iN6=mqeQJQEM*Fd%c!EroO4=LYLsHyEO$ zu`-y)onp!dE=}J!n-fnRQsBj6&%-6C0seL48{N#COgz&_;sM9JS5Y7|2QX;4=N8t< zf^|spaMsK)m5f*3=_<-;W`QT`se{jiVf{^;iYjwH7*g8ZKUTqyEeXf+7ed13e1s4b zc<$V}JVUy#5CQ@MaF&*q#sz|ptN<`JHs+3vA3q)p;f#6k=gtF+bHHVs3>SXOmMxIO z9w8wv3}__5c&BS*cc*X;WDQ&X(vBVE7(x!@7;cYwO7`0;1mRNQ&Iso=~VBYuIg zAmA+BdyqBkd7Yj?9JyyCxFLW*3_eCoetQ<0BLR+-Ooni|`k&ZTmv}Q&n9*bYLVDm-zC!xoOT0sd=B`4)~bFXMd|9jM2mT$(ZC3X=l>&?xE8$ia6OlVM+MH;nzc zhd?C>lRUMCHD~_ez7R?#44wsM>Myf@e;C&@g)sS(^+fm60f4bsdDiJBVNOkuA=Da9 zZhVS_|3RAywDRm)wpzG#6_=1>=|@uApKr<$-1t;*jm0`HFc~6|ae8wt514FS;K&*{ z3;J&W7?(MvgfW*Er@dbL004hTNyu#j_f{YT@;`X@FejKg6w8kFBxBg5k6~N`S}oSs z9k{v9bv=y9eRS_!_ysb5oD!oU1LlTs2n-7(b2VI@JIoZ)hFXo;OSl;S}@99##OX16U2*Lr53| z>kL*KtT|30R2c7YSk17e*@m#fuup)2Jp((3DKWSTdyL$Nj953uKExs9KEz^^l^dfW z*yoT84&m0{ZWyNo_a<3qS-dR!#TSns$#jE0t-b>gQL zLdXovf4`gn&KB`qp+z0ET6)zd)P*?eeJcV6nzIdlC3w-3(aKWx-vbEdcqm{Turn81 zCVlwKXeGV^K`S#vZ?HB2=D%MEC(WCh8p|r)m%Oc{6;-Cbevg%uS4oPj1ONmi@EPwu zMV55Hh%q`sX#&OsMjOmw;-IHsu3`U_F$=wtG6CJRO~EVB|DLR;wj z??PcGQf^{Jz{4NIpCANs-zDgNDKPGEmi&sf{Q7qBuPq}6~4>=*D?dDOPX zpqk9z`z0MJA$eFocazwUKPP`ud({GiY0YU>$Tq1{(yMi)b|tYu0`3Z6t|5PD0?Z)+ z(!ZY}2Y;sZ16=?UjgT+GHchkSvKan?rf@d}D;E4=UIy;pZ~Z_l_{iOF+h9^Za<6mG z5?!YUb0PJ|V5~cdjP+06q^fT@As_dHdSEP!F-Na>QIdEmC;}$@lE9b$Sp> zyCDo`7$|J@+CvU%Ug!#e0wjNj8tOPxhn*CR^NnX8!MrE=UVn&9y0SRr+GR$L5<&nieQzkmlGQ%&)E<0fuh_wDN3^ zK<0+qCP2M`fia$XR^iFQg0%;02Idsj445-^E+u)8#qNn(MFbam~!^?oj3ac1%x?E}4fxBZQ zUQSc2UZneRg?=Mw%grWeR5j=e^a5JJ!vc>@jNQua!3%t_IS7^wY}?{O#y3~OpuwfB zOXemfz;gAMm=mQX2%f&a_uSoG8IQgq}`he>H@sHggWFZ__FIjwj6Az^3& zl<&M9W&!+RMLjl?c^>x!<{Fv+b2#_;!yO|Z=GY$=JYJ%tVEt?ET>!(9mX-|T4`*lv z_A)hpp3Yd1Jgh_e1Hb7BjyX4vu@_(q2ns9)D|rPaSV%Ahu$J%=<>|)OAI3jkeMz~q zAkBOg3_Ih#wEGhF{L{`@f5D3ip0Cu2HJ6B$7YTv0#A-Q)Rw*(n7ab$UEnp^BDFXb% zsXIU2sy0n3SQn)+%sl72BQ^j_4jl@jh7caFkP=BfF(Dba|p#1T`0e~U-r@#E7(cNEM+2-#LO?Twy zLm4WE___?bE`np31#`U7BqW3g5O*c+ z#NAzpJ8_rYBpaXe-?KxOu#pXvzTfx%*FV?IaQ4h|?#Iq~&Q7w~ah<+7eB45dwZo75 z58LlS{lI+E9P%eejSBzrOE!J%d4>JY(_E*`cKc(d<=pXC|9(r%efY+^)Z|sH{OM7n z4EedE);wUHnx!o@(`fE*25ZJ&IXirxGZVMTFTR8l0z2P(?*xBFG3ndo2E2Db{oRAQ zZ!Nz_O!U}$@3#|J>LtxB1f9^yl8lz+!09N?DjWTF3S9{4bGLlvx ze|OP-fdRl}{%3`7^>VKd4dLZRpQaOG%?JoXdr*}H1i0Jx)_pSx4V;1H{AV^n-nXP< zu{#&u!E7`TC04jIDyBtFp<(9S7FoF_F$s1EE9h;8c!50WDfBDf@|BXfU#$k1N_RyhwayriJpOny@`83a;Zg!xX41n(X z%R*==ky6<^nU#Mo4Df{qmxpj&fk}Sk&HRWf2@ZQ%*W8J3&{_+QBP&@$kt^d)D}TORz$&RYVs zmI7!1!FtPk^Jls4637okI1qo|OYN1iaFB(NJW_`9&>?cd{Fm|17nQ>Ziu#gb|NWO1 z)&Ix;?Vx%Nk(~n#Cp||t^OG~?K%=XxtG&Iwxw#qb!G}YD9p2sD-Pzg6GPJg~@_0N9 z=Wsan_4R{T@b0?>=2fL9fi)q z!oq@r0+C*@qe@Fli;9Zac78!V+sMkw%E-tVgh4=(las?zUB7x2KqDn3B`GN>At7P# z;Q|u&z}Ue%|3BU={`m$l93r3M)o0XyZ3CE>H;;Ns0U{*@VC4a+@}d5&@7v68*&#cM zc8C;aAutSMMG6ZbuuY_7-ywF5b|QsY2;3QZ1mHM31b&GW7T`4^Ah2x^cLc@=y&OC{ zLa`m9ZGus(B-@T^5%IWmLG}e0VyJr$5oue$qeR-)ci_-x^=sgtmz8PH-&cPAua}i~ z56@gJj zdXI`3Nr`zND^vPDy-DUHK0c)I(B2QR{>~ny9;MPw}3gqJRB4 zb^6@0xjz>CI6CLcx6Qt!R=kj;=8d6Fe!_f-Hb_)I5Mubxo#}IPW{*u7GpgVNs-AkT zD~6&Zgbk)PenrI&gBim82gZ($9rID)M{hUun98D=qSk&XEWGMV%K2^TkTCghr%&H* zee0#+fZ~TjV!((4Gd?&qo7y0p6zcew%y)$g#>Ncqt7XjDWp{(Exumm;knd#rd6*4# ze-y=`sGzr~(;riRyktDJcj{>ml?qbLC5>4mD}lsZN>WDZg&5uyn?-HvXW|V%I`u;4 z9qSJByR~;^%4Ea}#dhTFSe3WxE!hb|k{h+p?=`tX&HqTK{{z{dm*=hcHRspKnUlw6 zjr}zL(+^5Nc$@n+74jY>GrqUvXJ_U|cgHR^K8R=wkx++6e-QJ@@YZ3%p$;A?B)KI} zT&ely9QXCq;qR#>&;Oi&S~-Tg_SKguUwu^k(Qxi?W?(TzHSnJfvb&Eiu?cfh=FiIg zZ9?p%cWu6=R6nO4enLfjFq}7>`POw-Zwf`N`HGnpYx-ZUlRLJrI*pCoSFF0cblpqL0)!{!D(d>GSo%481+hK9Zc(1M{l(*nWv*#UYItAL z3%`2PfbH@236p!2aZx1%ZG8jlWnxArWVP5!bJt!xbk+UXJkpD0Tz$`8QrmF)`E%Hg$!YFW4qqqjx%imnDecf%Cv7KfaNi^L`~kKyiqY3^J-Vo5 zy;<`4qw_x9`e>{6(*&WEs9cOG=Oa#c$~+2o9BINPIQ?6N~6`ffnkZLbWq z&@^e6>}$47*HmoStK0Wm%E+p@xcf`%C7)A#{_yS#k33Yo^6ZNmOfs|7yo>J|g|hv7 zCDb?X($UssJUyWiA*~Z8e?y7AWZ@Q~?3w#0D$T^vFRdrYi`L#>xcvE4aq$eeXXqxY zW-F<1Um(yMf2}^fa>)r3BYQ!Qwz17aE1!F&-qw~cy)is4p*DZvwO@aelRkf2h{Vm) z?}34BNYINXL*7%>`QvxVnKR_BT@!w0a=*B8MQQVxx9)R?$hil2X7G%1|15F?GtP3dEMPK(AM77)Y8_>Ye%EIoB!i&nlv_b zKYsF>iZXI*J39!csl9>IUQ^Fwp5s}?sjKHTG`7|O4GbDNZSCzOzxb6Oo|{w9P~Xs2 zUfEn&RF{@jl9pAPkXoFXS5;lxQd!enS>0Sw#XK{#tg@-3oLgPXD=29e$ti$;SaDfJ zb82QqU|6b$Z>+0#l&epSvsavVP-<~$V^s~Wtb%#+X>l1R|5-hdTToY2!U>Kn6UodX zCaK)TC)w1-&&bN##3tC(KGM`aR^KKjD5{{Ks4hAoFSnpJudpsY`B_qGNp@acdUj1} zW_4O-jYwwTmS&j2vbn0}b5+e(PSsmM!`Im-{aHz4c|{WG$^ZTj(p!(JpH^^?kaw1lcM`i~e@{Q8qN=%! z$tIUgEAv>};>IjQCaWecxhyiSBqFxdJE%ZaTf`mKeo5yk3$IL=FSqfS+0HZ8J5O6~ zJ8AZ}tZhVmF^AjU(AdU44Hha2OB&gy&Bi2_I(j7e2It+^2?oE?gTeUKbz>hG#9qDY zedwI|lHHoi_UkR%ufK4Y&W_WTQHez*<@MRQ<@F7%RW%3^Co8uuCA}&>xx(Ey!^}2e z_c1Lo8Hb~?ZiDcvJc@c~6ldv>?%~` zxwpUh^Y++zx4xPUD7yJ3bDKKyiyBfhs$&w%!edG$6z*@?TpNMou~V;V*&*p31*9QTDEu4~Ns4m0Qa`t<}mo_464rpH7!v zxI=r~0;Lb9D-6c36U%=fY_eBi@zHa7)K`0io~cTGFC%r+xvIMLDc^WAhvbz9O@@Cb z_SKIEq;I%MD|#>AXEq4`od+@6CJ8E!LiQZjp0xPZ`#)XoP5$9@`FDSi`+2o$L~K!d zR;{~Vj`S_h(X+3QoOt}hahtEJcpF)zo>2%GgdbOR%u-hFP@=xr{{BzQ6Kq-L|IASM zWahQce!KqZZ`a@Z@yfOPzCOYEn~zz1`kTUt38!YRRr_wXjHJAamT}TwyNn0n2Ndo_ zOj~m6qbWy5{Uite&ws!1^_*MZ&A;>gqPr6pD+A*fDotIgI`J>%kESbp_{-Ige!243 z9)k&sRi-Uhowv#qd&K4uRmh4 z?S#e7lUBP=Tkk#d7}&$Wde-!LREdjQO+w$L|h;g*%Nlh*|DG zXLIb5(-{R4c1x+-+a^yFv2GL09hv$=vYT zcU{$ty%hlI6 zy>#j3zI|szjv5FyHXdyGUh0?w6uTlKtDJ*Dl#$w zVu^{Vs;asonOV5HdS+#1Jbju1WM-z@*f_bnKM4;H3*jH3p`k%RL3(;7#>S@c@o}lC zPa&3>-G=q*N+q_ z`KmCUPk9{pJlA}GM~1%3&i;Q=`g$-~Ln1n+hTGn;W`DhkP36uS*!G9jfUQ4o8lca?tVipOWO;Y4Y zwtjb}Nn^0`)B8IdHh-q~x?22BeAXVjkYp|)NsCCrA`&^D1pi5b){=moB=jUnx=(U# z+M;#iudPICM6&e@*S#NdgXWT~Wh8D937<~_<`SRZiTkg_=4WC)lQ?W4;de-i*)yFZ zW=lqhWa}4>TiXvCeg0H6T@jlX(BP-Lws+f%FWlG`=20H|$3$FT7Ot>3LVmvEwgGLhSUx=X z>=!0~yGOST=8c}2TJFW`z1OB^55#6c8ZV5@eTV=Y%=ucsOqd_Z-m@?#6~hN9VvkpkD8BoBsnpk{XGdp> zf7*9b*xIi52bJ|`C*h^$Xs#JZg-GbnqtefhCPYS8e!3!NtKu!BAhJJl$&Sxx5>QMRAKhlu&P_*iOv+F@dL3~M|{tbfQ!{8d(*Ga zYxTcD;?zmNc~YNTWP8DE;cKdRy!@>irSFOEG@?3zJo=qH-bVZ{kl1_VsX1{MBWhm~ zo7JSmr`+R?<U+sV5I65tZ-B{i#G}F0oio^yd=INknrz(ffrYJ*f6m zv)k~>E0F~XNYLI7s}U=$X+&!(QJX-Nza#f15cSDK9nqUe9(+#%&K8)QG+y|YNVb7s zvXJuJ`d<8r&l_%!XP8l5?oDJC(f!GFSH20~JJM>^d&UFI#-T&|4=PvcE28@Y(VPM; zRhPdB+5MsEVoLXQXOR$07g7y(zVFukAz$h%zisd1y`0_~VrGG2l6w3zw+-*=zfsyZ zg8z4JDpa2otA;fxMey!Lx2nap;%pF6EppUQaNDiqZX{1Xz1=vg-7L4mGQZ>Tvku$h zPWzHhywpqJh-4T9a-JNWr)?(L?N$XHcEz0zrJYV?o#uH=+qt~cy}HY-s>`~tLnKeX zxcsD1H?_^OpaWE%bzOdq-QM-xzKz{aYP(Ex+AZ=r-~!Xn>4tzvHX+D6m1w23S>$)P zR&@n7bw_p5@!bS~3lZ%!6gif4x>PdugFmE&b}MTY$=Msqk*$WA?H~!@cE@#-3_|kw zcml$P?u0JlRnK^YtI!UOVXd@C&KJg8XCN|2A0iyyMyC-{L`V%EK@Htt&Z0>uj|MIL zitZvn0wE%4UlD_o(TL?xf>7==3g!l$t~6}a5?z*buqD9 zpuK(DI505o$&>I9-4iLQQ<9aw2~_w&B<(9fS=r1}Lp;fFBgb!Njp_JU#j#H=zDX6< zlE1~9?CRnKwPvbv{CC!veIKsyjlJX>Q(+-7Ezf2dsWIcLxXO)0g zfc*7szu&#q|L2ij8&F{*_h(tm&6~UDyV*LOJo#!hb|`=fsTDunx}qX3F8m3oe*^z3 zZYsW6Z8vt6&6wqnM=#VDDf~+KcAecfYwfdy#gW&reZsYg({(K>KnNG(hQySO^n9%D@=ygW)8bd}G z6fM=Er<_RpWTyVdQ|^f5WHDin=Y+%Iv*Zib8FlWkqIUw;^e$_rftTAY=&k1TW;1#N zUlE*wmfz$nKAU6l;l#m~(4+&t6AyS#Jr*_RcEuL6u04%W`7WlHxm~rGUt?u#LL*5^&H1Z4Cm-zqoKW|>L)uMZ^4Kwfv zpH{++KIK85@uVfa=yP5KKm#w)iA%>^7%>QA2!gi7j9za{uQs5U>C!()q`x;-dE}>Z zFCuf$cc*flZ#t3oq{W`+R0f)-JzJJ46$`I9N-|_%Uo(gNZ^YxgJJtgcHSZ zrg1Hl>AW03AOMfx3mieXSQUrN>4T5xS+a1U?VXQbd=6*A9Q{{^Pg1FP5uWr%Z2Dr8le5Th-}< zy0mvHvB@TSX~Zyt7-ums%w%3dk$M6#O(qu{>8%>{pOU!?kA|oiCWoaqsk(6HN>_X_ z*LnPwjJHO<_*libt**-yszJN`0lo7Py<3akt3&V8rS*g9;8J3hPizVqpz%15XvGjY zXL^rT`y!d_9hV~Y9dlyy+iy5DE|Ra9d!cNmWa;SH_7k_I4Igpg1^;H3)r!@i1?K^M z`j8=g*oZ!2LW`Nwitco34GF0s{uRVBg~(#&>$NPDNtM({_KL0y$ZVB!XxOAywMZs& z*^TlAmrG|!m3%eZZtBjoVQ;62FUDQo)lV;Y=w z%|y|Y?ANVdcQfmXQF>fnlYe&WMd$j%CN-;WWKLY`IP!DFRkzBPTrK@mw)pcO4QCw5 zr-n%j_`hA}utm8_+>AbML7%jy&)CqCcJw)WBIQV=of!CJk_)b6^Nskl@>Y*5p1g1U zd6(MLb~QgA3m(1D?DL-<{;}6@l|ufHn|#L2vHE#az@p0y6!qe-y1rRsw?nlG)}FPc z&pR-L7hK3iH*(pX$axUCCnO+;D0q{dH=+abcz1&86?|(iKB+nHR6R>PVC|KJtxDOy z@AR6w)b9JmHV4jl?mg!EyI5v#{;?}<_GnasS;m>61?N>yhVZ&Cx#33?{YY>=xfMvZ zUkQ&YY|##@Qw^-S?p=Mst!lq|`n>&~Kdp8Ab&JcD`_b`P%}Vy1U)H+MK9^JeFT zN4$0IvYr-oT(xfa>uSY}Gi6`Sah!KNy*K~YORWxTSHfnN8MNS3jUZ}~L_L~lM3d-J z@*tLMIp>#<(;%%LyG+9WkH39)%7s0NtO(0)Q*dZld8hKPYZZT9D*OFh$>`a3^Ci-H z^MAG2;;>FR;&3O3VZI;9a6X75j}nM>BGE}AaTP=_g>1YKwo)=^fn@k;^~9%zP2TCP zmmKSN>r^k3OCPt`dWB;7qAR6yq>I0vW4GwkOZ=l382`M-`@DS zme~@i?B4vqXTRN_u-fjpQK?n}(Mu+VX~ZOxm}e8qTw;|+p4OAc1!U*VxTxZ`JHZWd z-gPqWwUQ3id?SYf^3SjZ-&f~hMU{@CKaL?U*~ug3gmTJ-ameP7Md-+Cj_Ae9EQ zbsn)TBo0NyshDJPh-(Sip%58bz*7sUyX{|l#j9GzrRtzo?q2nr85YzxTLGb?9H#Z-4%q-`%bdl;-;*(gTVx0WP68&Lsou`Jqna{S3{7mkb zIgh;kbJet>rp-_r{*KJBxB7WN_CLXh56_Mmb>;2%q=%2#C{nmD{#V>o{2TC0s;_PC zZtG%x%m(l}Nohluad?BsfkQz-U3VF$JHNUkw-*X(Ix3pzq|z>t!v{xfac5*fYgisH zycfb)2kG@3+lOk+4^v0QUL%wjmE(Hx_wM*WCJeYklAA~k) zg*9qNJcm|ztORoA@hZu!?M2R7UbX;ce+ zj{BjF_ktUh0vZ&3>*YLZ4_H)gF{%?uD1<}Swc>Ww(r&f#KJ|(L4R?YYl|wknVI1X9 z&fO5st)Ry1ehrts>drXV9DZEA->Ok0p%9KcG@N&Y!Tcz$SudGql-g>{hhYj&C$U8% zrul9d_nLphCGW;V<`p6d`$9E}cR#90JE6rSt<^fa%|5@wv7p1Dpu;w|-6FHi;AyL7 zETiI9=qvolzc+4$@T@Z0%rjbT^E%v$JH0EqeJi_tD!V<)x||9-t+LxqQhEBxysLg~ zBB=&~byin!MOR=&S4b@#(MX~=48rP3U{$wYS(j&V2i~}dBpDo*X}r`HlHX2>+DTbE zDQPG9Z6uRNqUwloO1H@2BC$z5N5#MDNq%c~V|QswcTo$S(m=cAb!de)?R-=sa`@ml zO?$`juCf0EZvf*d;dy=d}jrwFc$2 z`epNcvUuK^Eq+-oLAk8~x#;9sCpPaks})Jr7n}4-l!G{qDb2P?&2}lxj!&B%Q=6R_ zv^b`=IHWW~wQW+9LrT+4zsB{i9wVujDG-&U z{-DJxMCr0G_mWrr^?-)k{Fn@}_F zgmO@P9>g{4Cbk$pTMSZors=I#S?xBt?RI$`C~<&oUb}U6yLo0Cw7?^c*kml{T#GtAO1qx$;a<|^{Hzm-tg_qS7o#G&35E1dX!B9S{K5GZ zgIWv{TQp;v^pac5GTUIPOHn5Zrf*euU=7W}znVrZbt~y~C}_9LZZk}6eHh=29O=Zj z$T*3ZMK^47RS3ot5ni}lHtSJ4}pR$N>-auZ2yCQqA5ViSphmU=p*x;wa{ zGo-8|sIW%4}llJyV;#Gg`bdc^(;Uw%CrNxwtVCIriVi|IAH=i%YPRQ=q+lfUT{c zwY86>rI)$+6B846kplChzTiZy}gr@0+1}^xsvYw@+@-AZBN38Xe41MQJ9mfnywERn;LZp`nSoKBdVVlHSCS6!I8r!CBtMpp;LZ$2UHOOX3yD_Q;~NuV{-B_E82|KXo`OZbOKz9f zv#!AM?ucqSwtADINN;?FVi}X=&Mqg(Y3P zroVsx^Pe6m&Z&WIS!vGqh=>m~BXDb1Eo zJB;GnwIbUN8`Q|jX~9~oxYMVf|6&d9U_Ej;%|`ZdH+^`p1S*_!Iz0-ykT_@wuArd^ zdBpj$=5z9St2XNfFqSjq3GLcZZMXe+D^%)_$(TAi24eL|N~*H_Zf>D9H4VUB^QVs@ z+YI8`&5}DFr*$A@a0FUB3%j(v66UYkG-KXkmVEBY&04-$7D>$(DU9VBVXbFvo7UWK zSbV2$_eC!&D{mxP!0+lBj0%I9BX5!^p;5HvNZcKlI^)E4j5SYYqWUnR?X$1PZQi{3 z+&QKkkDV~>^j*`7x=$_}`pMg6U3G5}x8QD3uJ~bX)NF~|U2^`Y70%AVXU;tT(^zNc zpzdxuBctGkdFD~oXDbfHU9+##2yMIT&%5KtQw?s_3~vLiv$JzULj(2l@#psQ7n~Z; z**ERgsGPnrdZA?QK6!stRZDw&|5K-)e`gEAg=z*UTcureX}<2+qVS|e(VM3d)cPR2 zO)s_`zO3GV25jTUkB9NA_MTd?=j5_oC;!@Ua_<%6YwmS&ZY}5Rn~zy=_Ze^wUv}2l zcSgmKka)g|p$i2HWzf(j0%3#-ki%@Ps5aw-cB|A5`%ESg3i{46>SpS$F;)pR*2!G6 zc#eKlnU$5;$gBd?G-&bU zmjz5V7^4!{im0Ae_P=sP8(SxmyLq#OfFBwWB1}$DEHJZ6bS)zV4) zDuG&*)x^{Xv{C(H>PS#|H)bz<sdKFI&iLN8?4ynORh6}Q)p7Qd#2>$u=>ihNy|Mjzx zkt;SVxBy>F{qtdbP(?Rt0;~mLF@G1RZfDM={LKYQ5izW26i=J<4kfFElP8sRb)D|s zH9dOtrVu%xqhoJu?1sHNH@5`u3T#93!m1eK5fj)9+J+9&)JYmU87)wUx(ydlosj(p zj!DOl-+A!B20&xSj`Mx_0Td-HZEV>Y8HG?`K3GZ^i_H;fJ#b*KFLYH?voJIB$jK?n%PVnm3c7dS%Gp0Lub~}#dQ%rM zFwWIA%B|(|r`5I@JB6J&r-rGBn4>0~J*#@~py+R=Qc*F5n|S+#KqVw(nVNdsylJHI z(9X)%-@`lF)ho)_!uzI@nWW_X8#fFPQV86;XK~_$(oo1*T)Cog_pTY9SJx1*VeRAnA%Mk*_ir#;R`$WMW4Cwh8q&8#_J*9CrlO*uii$aAFJgr6L`$f#Yq^zh=vhqAJo;5>Kk{+Tl>;^H^9Zy)ND za{jNz|IAIrQ1JBW)5^+9KR>^L1pWz%ii+CW+G=WQHf|j7_dCJC!LqWl16>^iplxhy z#C|Lz)BiWPv9PtZjf{-+^70Z%D1_?jYVc!t?@lh4d;IuuAxZG#ty@Y;ibzfYz+7HY zjjE zkW;5l<>cguWM+Zjl$Di1MQv?udwY8~`?Xwzbar;`+qZ9^QTzAr&&%fSqU0p6yMZo0}UD5P-<|$Y6oi0d0Tw1UY@^=q#C0<%Rxj@pIUGG)s151`-QN0Immq|2WWUtY-TOnwg!4*_{cM~8ud z!K6u(dJBYJr^wSENoN2dVI*~qNJ0P=TTM;P-rl~Tpg=&5lBlDj^WAsf^_8zQrbx<< zq{EvK|2p@vgD^`;Nnzoj0AgPwy^fZamWK}?_Djy9%Y`CwV@dHT(qhmUyvSYt{eHzz z?NPlk!x0MP5oea)-Q9f<^5@W`h$lrF9x{KKmGft_*MEcr4jeduN&@4dB_<|@$K!Q% zb+P;d?Que=HlaxJOj3P?l!+1AwK0Bu@2d(53eC;UDBznmZTkA_ukkhmDp-D85=joI z9)6ejP$c3L(&5Da`=+pThd%^Y<>lqE{Mquz0&m7x{&VNfi6m!Hs6T>)j3CAP2+xvq z#}L}i<@T7~Dg`6p6EO+-#wXsjc8O$s#+N>|=VZ9h!1p*?WVk@WPon70+8Vr7Y_e6#&>Y0gU zEcjU!tS{OI;Q+1zww`InWDLQNto2K-VH>P!6$}}iy)r7hx3frx5I^F8P-E2U9flZ%u^<5(_ywHXPrCqYdzF|2D|6&w94tpV zFyCx4t2Qdy3b_FCd24Qi95!r|d(868-);eb0sWvt547yLZmbLJzK|J_z31e^O)jBn{ zg;w*>z)P47OIR_;uf7z4wvKluk_G;s7F_Gi|MSvE(5shO0~h=&nr}x}?th$$QFk2D zz>hXKOL{6#b~i1XR>gXOSb<*vMB|d@69pb#y@ytY!OI za=M3KP)orN&@Ugo`B~NAXX5~#(3TFgan9x|0$9Ir746eWm0+-zKPt6in(-wumawwC zIKc7&;9;bJv!~vjoPq_qLqE%pq{G3j*FvB|=E*ap7-zVHwSy&t zGbZO*?=tC_Qia%ZkYnJZ4WmQOPgh#`HQ;@HbB2+4kp+V&xj7(L+dPFO7la5C3;;i% z5>V`s+r+lf!193#ar0Cb;CED$2S2O@Ihf1*RdE(D!=w7@m%fz*{4gH;;DOngNT9{c zVKN?GibZ$8;3-Rvbp(Dy7?A;arp87fNOlg?Ass9;Cbl5CLN2i6z-hZ2lnX2bDaTxd z3uiF18Q& z76r0^PG|xDv-HHhzVD|=&m%P1igqJ`v#_871EYDr))~Vk0}H| zMQCj&_`S-SuZEQJ?N3%0TMuT~j}WD5Zbzq=mnYs$Y3-RArm!sBM%CBdPE|#DAQkeK ziP9d`h>vP$Da>Y7U~yqxu<>Vu17-jXOdiAsPBCqV>sF6#!CzBZWNI>?7r=4r{L>!Q za(*>X1TDw{RNz2_!T(fc^|L^20P_c41WW$NdIUwV96%U>e)$DjkSS@K4ES=vzfmrd z0Xz9w`*Y1s6xd&6U4RPkV+o@&M8`xoaq1z7^C0}aed!I%!&5Up#k2t}j2G~u2U94@ z+ZqW%a6mp3{=U#Uy;FSZ+n9>%6v7g~nOy}|N@ox~cV}Cq8!85m&p^=uF#Yg@=q_3v~+`J(V3^auX2PP-xq2HxtOl0nEM$ECkFz3_ydo!Q*Ms6wwdH73G zQqt1_4qOs4oebd+2(v%l=Jp&-%rh~$91gel!E8&Fm8^VKRTb`rD|(LFn#$0)^7z#9 zn(9hHXH88_UETAK^A_`uf}W$esGzp0sJgPGpx04URD>IPR{q(uXYAuIab#y@1V?75 z7{pmPC+Fv8X7n5oC@Cos$m0e&rRR8-pRQsM`OqvXC+kHg1fYVIhdM+ovFFIiO1Yry zr}!W^J2P3(2?2zKm4~9<^3U>~p1kIHNyVoi_i1l=_{hpPG&H28rLn2WNKXxqPM){R zX3;*|=-6buWcy(cBi54w#EN~6XI^ejY(hpvY({uYMtov=PIeaih)={*D8;R;m9yrznZGDNoiqYLD~FH*0d0)#B{Vg&*oEzgdK%r0I#5khuZw_SMW8J${q0sf!PGZ;Gg>RUwF zsU0LWTmlr=bcdug`6Y0C;<+r?e!w!gbBA&h$bXO|Q_l{jLO^~%gXa>{`K+1%DTSRZ zp-|0bJ6V~SoNihDN{|Cn&J3u6B}Ytx)4DUu2oRFi?ithAPet#gg_TSyq^0z#Kt2$^ zAS~uVopE^th|KC9oLr!SmG?^Q-gvuZ(rE(pOOE)+TeXK~5*8K#FU6$1o`m!JqjCth z^+i8&Ef`|x--#?tIK`mf$k<1AKS?Ak{1TgclL-0&=cxAP)=t4yzmyl3_Nj6~KK`UI zKa9U>)nOk=1PD##2^iph?@Q)E?U~PBco&?`bUyOzx^CNfLbnYm`0m6Des=jUS0wjb zyG(!UD@2`~ns1^2Z9*^q{r8NpHYk zMB6<0rA|$!%4ZcXLYGm}EnsE=Q$hai@#p+(VcDVDrQ%9NLe0LicjQ~z=<`NxLj1@h z$j2Ug!H-HJuHAmkjtq|57SDvpuUZL{vjF)R@#mku2RU%`QHQh{83b59LnH@4F5pMK z1-7ct$MncRIIc%Khg1m2t2s1Q%1$-XFAyIge$+tZ_t2w$aPT3$Uz6UeNiqsK0{*Mk zo#+_|$nO}jE`a4{cM5dw(`49K9C*OI?2XLA=e44!h8DUc1QC{0c=A^0XPRi zSZWi??-V0K5|gtxIlyj1+f+J_YLkI*#)#NP663%D1z4=T-6>?efPePI?vn;&ARN`K zL#cF)sJ~*>If&TAQ(b-e0d|kuquSK(Y@0K_$G2O($q**#QBuUcs3Ua@S2*@8pELwISQ)v0312jK_U z4HP)_sOqi@=?!EyyPVl=F@J*`^C zP4eCVIm_RRysPgF{~y5{xTzTEPMsRs@fz}MW5$db_4W0210U7Z)oa(T6%52(FFokd z+1Z(wmnV?NU2k`HcS1wAM`d?gXIH-m?nedk7z>7w>dt*hr#<2_gcl3nuF69hHqO&HMv5(*pVQ z^mHDN=bFn~;7)|F%8L#yYQY_IN=k}A9%I2^m)<=6G3kv}F5Rw~P4)Z(_xA$%;Vq?=wKY9Qe0;n>9%CCD8x5lyKUE{ZL8sQVXVsN2A2Bg80(p#W zXlT$4ZTW9hldS(1P2E% zTC|AjnWEItjyJNXEQV9m#}xbTIqAN=WQd?B=4_WTBn%|XK4N+(!rv$}{WuR%xUb|J zG~@qy;eRR4{etS}k>i8nAJ6+Y^Ajq^*Bv+%xKflGMY;YvDr_hU1u%<$wt3SkZ1|Sv z@^h8TZ@)nmph9WIZq+bh0$H_+J7o$~M8Baxv6g4BvuxEWa_t&(=J)(_F9ep?efup# zyJaiRyoujd@)HsHkIDa`D9X)kfcZR-rQVQ&uv z!@J`G-&v6`W>@NrgBdgSWzN`@xmrAX&xwp#v%&@Zy}fumcSrt#UCEUA09k_<)Qs0bQI+}Vut@aYhy=muKaO7nR<)- z=+tuHDS?Xhr*pyY$mh@JTbsq^dI*;H#)p&*c-~<~6KZh_e1QshF>`;8fWKhUB=Xl^ z^<&0>s%p%bp;+ES{`h?={9P(@*cYYL;znvgGgQC}1Zw8tYyp23YwcfuF_z=}8kVnR zEN4_u1c74g7t4CVzj7tHb&H%l$&m8_FVgtAupXHFJt`dJZ+%z6knd>68D5|Vxj?$d z?oWTg&)Tf6F7V=&EytN62o%%5HWoc2)+Pz~bGL0HmX^fEhEc)y0=dZImjuV2g2 zMh|j50kmcw>KhmAXpR|JY%g+DsUw+BhwJU4m z#*76EGL|mQShg&8!URw-new{osZ1IOoRY~aA^7r_b_cFtN6y+kceg}d-|NJ+# zeH8P5*#MTmAZNjP;XZ5_#yCF8Au#9UM-13)I4E8kh zA;-Lb@*#qvf^f6Pgk@YkL%Y3gD3%Wq|ElFk&`2ug9V&PD#45h!LyGwj@zK9&Ig1ze zPpbwwym%v)_eM|rbNQC%zA4LvRE(rz-=T7Fe&ggUdg_U*NXfqV-*Qv&#*sOBa#u+S z>FOfgEHWld5`gV_`rUW=zy7K^>@^>W3w{I{2>bZs z=ubb5`TTPhXanfPrO=N)G8q0ke}1-vqV$FjcX{U>Xz_mUJ^%OLXLSK+170IX;*!&d z5qBtR_N!0D9TatmqAcEe%l7TJSuG$G052UzjClO^+pys{MQwd`{!~D{WL45oP&)!uOR{<=6o3F@^#f#d~w{o(@LD0Zewot&BS6ad*!-pI2 zD-WAf@brbCilU4_SaZm`j3mGE08aek!x}8uVgzA9C$2&T%wSdQ8=4D{XKN@g$QY4 z9cRhe;)V&2*)Dk7z)pTBf)@D2s$i`WxfWmsD~~fv4k{E(RI^4oITmbjgBDf=ykOIT znJn_X1lAO4FB@cxh2U+GpWWTexub(_Y3Z)5MJiI}K-l1GY;_o*r-jbCExQxeI%j>DaVs{n8~{-+yUrzY%0o^?W$r#SdPL zUbB70hL2uiSR*5T=0mn;sjQ5QHgXU~csl^HK1IsWk3%j2cR zr7nm|p(!>)QfmCV!(xma^VuBca}H~kA6mL&`}R#6mu=d(amBLjRIh_^<|w$JV$GT3 zOwYS7*hQNCJipt{9X=}F$7+7B6eWBxRxvtY6~o=TyQeKu?`J(d$B&;D?*>Xh{OT@q)-Brosl(?^ z2-*KxZ~M1xU$TA8w(V<{2|W0EKo8!3iCd%(|5Nqtm9~Si__tX~97{p`EH=dP+r(vL zu;~lud^Gh^ecQEp>k6#36&shm$ov>;ptybTvW_?F0Hb#M3Gwmg4ok@#!R$i= literal 0 HcwPel00001 diff --git a/src/muuli_wdr.cpp b/src/muuli_wdr.cpp new file mode 100644 index 00000000..0c142b3a --- /dev/null +++ b/src/muuli_wdr.cpp @@ -0,0 +1,9507 @@ +//------------------------------------------------------------------------------ +// Source code generated by wxDesigner from file: muuli.wdr +// Do not modify this file, all changes will be lost! +//------------------------------------------------------------------------------ + +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) + #pragma implementation "muuli_wdr.h" +#endif + +// For compilers that support precompilation +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// Include private header +#include "muuli_wdr.h" + +#include + +// Euro sign hack of the year +#if wxUSE_UNICODE + #define __WDR_EURO__ wxT("\u20ac") +#else + #if defined(__WXMAC__) + #define __WDR_EURO__ wxT("\xdb") + #elif defined(__WXMSW__) + #define __WDR_EURO__ wxT("\x80") + #else + #define __WDR_EURO__ wxT("\xa4") + #endif +#endif + +// Custom source +#include "ServerListCtrl.h" +#include "DownloadListCtrl.h" +#include "SharedFilesCtrl.h" +#include "OScopeCtrl.h" +#include "ColorFrameCtrl.h" +#include "FriendListCtrl.h" +#include "FileDetailListCtrl.h" +#include "MuleGifCtrl.h" +#include "ChatSelector.h" +#include "DirectoryTreeCtrl.h" // Needed for CDirectoryTreeCtrl +#include "ClientListCtrl.h" +#include "PartFileConvert.h" +#include "KadDlg.h" + + +// Implement window functions + +wxSizer *s_dlgcnt; +wxSizer *contentSizer; +wxSizer *s_fed2klh; +wxSizer *muleDlg( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + s_dlgcnt = item0; + + wxBoxSizer *item1 = new wxBoxSizer( wxVERTICAL ); + contentSizer = item1; + + item0->Add( item1, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item2 = new wxBoxSizer( wxHORIZONTAL ); + s_fed2klh = item2; + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("ED2K Link: "), wxDefaultPosition, wxDefaultSize, 0 ); + item2->Add( item3, 0, wxALIGN_CENTER|wxLEFT, 5 ); + + CMuleTextCtrl *item4 = new CMuleTextCtrl( parent, ID_TEXTCTRL, wxT(""), wxDefaultPosition, wxSize(-1,20), wxTE_MULTILINE ); + item4->SetName( wxT("FastEd2kLinks") ); + item2->Add( item4, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + wxButton *item5 = new wxButton( parent, ID_BUTTON_FAST, _("Commit"), wxDefaultPosition, wxDefaultSize, 0 ); + item5->SetToolTip( _("Click here to add the ed2k link in the text control to your download queue.") ); + item2->Add( item5, 0, wxALIGN_CENTER|wxRIGHT, 5 ); + + item0->Add( item2, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item6 = new wxBoxSizer( wxHORIZONTAL ); + + wxBitmapButton *item7 = new wxBitmapButton( parent, IDC_SHOWSTATUSTEXT, amuleDlgImages( 31 ), wxDefaultPosition, wxSize(25,25) ); + item7->SetToolTip( _("Pop-up status text") ); + item6->Add( item7, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item8 = new wxStaticText( parent, ID_TEXT, _("Loading ..."), wxDefaultPosition, wxSize(140,-1), wxST_NO_AUTORESIZE ); + item8->SetToolTip( _("Events are displayed here. For a complete list of events, refer to the log in the Servers-tab.") ); + item8->SetName( wxT("infoLabel") ); + item6->Add( item8, 1, wxFIXED_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + wxStaticLine *item9 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(-1,20), wxLI_VERTICAL ); + item6->Add( item9, 0, wxALIGN_CENTER, 5 ); + + wxStaticBitmap *item10 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleDlgImages( 4 ), wxDefaultPosition, wxDefaultSize ); + item10->SetToolTip( _("Number of users on the server you are connected to ...") ); + item6->Add( item10, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item11 = new wxStaticText( parent, ID_TEXT, _("Users: 0"), wxDefaultPosition, wxDefaultSize, 0 ); + item11->SetToolTip( _("Users connected to the current server and an estimate of the total number of users.") ); + item11->SetName( wxT("userLabel") ); + item6->Add( item11, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + wxStaticLine *item12 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(-1,20), wxLI_VERTICAL ); + item6->Add( item12, 0, wxALIGN_CENTER|wxLEFT, 5 ); + + wxStaticBitmap *item13 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleDlgImages( 5 ), wxDefaultPosition, wxDefaultSize ); + item13->SetName( wxT("transferImg") ); + item6->Add( item13, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + wxStaticText *item14 = new wxStaticText( parent, ID_TEXT, _("Up: 0.0 | Down: 0.0"), wxDefaultPosition, wxDefaultSize, 0 ); + item14->SetToolTip( _("Current average upload and download rates. If enabled the numbers in the braces signify the overhead from client communication.") ); + item14->SetName( wxT("speedLabel") ); + item6->Add( item14, 0, wxADJUST_MINSIZE|wxALIGN_CENTER, 5 ); + + wxStaticLine *item15 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(-1,20), wxLI_VERTICAL ); + item6->Add( item15, 0, wxALIGN_CENTER|wxLEFT, 5 ); + + wxStaticBitmap *item16 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleDlgImages( 13 ), wxDefaultPosition, wxDefaultSize ); + item16->SetToolTip( _("Displays the connected status and active transfers. Red arrows signifies that you are currently not connected, yellow arrows signify that you have low ID (firewalled) and green arrows signify that you have high ID (The optimal connection type).") ); + item16->SetName( wxT("connImage") ); + item6->Add( item16, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + wxStaticText *item17 = new wxStaticText( parent, ID_TEXT, _("Not Connected ..."), wxDefaultPosition, wxDefaultSize, 0 ); + item17->SetToolTip( _("Currently connected server.") ); + item17->SetName( wxT("connLabel") ); + item6->Add( item17, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxRIGHT, 5 ); + + item0->Add( item6, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *serverListDlg( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxSplitterWindow *item1 = new wxSplitterWindow( parent, ID_SRV_SPLITTER, wxDefaultPosition, wxDefaultSize, wxSP_LIVE_UPDATE ); + wxPanel *item2 = new wxPanel( item1, -1 ); + NetDialog( item2, FALSE, TRUE ); + wxPanel *item3 = new wxPanel( item1, -1 ); + serverListDlgDown( item3, FALSE, TRUE ); + item1->SplitHorizontally( item2, item3 ); + item1->SetName( wxT("SrvSplitterWnd") ); + item0->Add( item1, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *s_searchdlgsizer; +wxSizer *s_searchsizer; +wxSizer *s_extendedsizer; +wxSizer *s_filtersizer; +wxSizer *searchDlg( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + s_searchdlgsizer = item0; + + wxStaticBox *item2 = new wxStaticBox( parent, -1, _("Search") ); + wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL ); + s_searchsizer = item1; + + wxBoxSizer *item3 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item4 = new wxStaticText( parent, ID_TEXT, _("Name:"), wxDefaultPosition, wxDefaultSize, 0 ); + item3->Add( item4, 0, wxALIGN_CENTER|wxALL, 5 ); + + CMuleTextCtrl *item5 = new CMuleTextCtrl( parent, IDC_SEARCHNAME, wxT(""), wxDefaultPosition, wxSize(80,-1), wxTE_PROCESS_ENTER ); + item3->Add( item5, 1, wxALIGN_CENTER|wxALL, 5 ); + + wxFlexGridSizer *item6 = new wxFlexGridSizer( 1, 0, 0, 0 ); + + wxStaticText *item7 = new wxStaticText( parent, ID_TEXT, _("Type"), wxDefaultPosition, wxDefaultSize, 0 ); + item6->Add( item7, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxString strs8[] = + { + _("Local"), + _("Global"), + _("Kad"), + _("FileHash") + }; + wxChoice *item8 = new wxChoice( parent, ID_SEARCHTYPE, wxDefaultPosition, wxDefaultSize, 4, strs8, 0 ); + item6->Add( item8, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticLine *item9 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(-1,20), wxLI_VERTICAL ); + item6->Add( item9, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxCheckBox *item10 = new wxCheckBox( parent, IDC_EXTENDEDSEARCHCHECK, _("Extended Parameters"), wxDefaultPosition, wxDefaultSize, 0 ); + item6->Add( item10, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticLine *item11 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(-1,20), wxLI_VERTICAL ); + item6->Add( item11, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxCheckBox *item12 = new wxCheckBox( parent, IDC_FILTERCHECK, _("Filtering"), wxDefaultPosition, wxDefaultSize, 0 ); + item6->Add( item12, 0, wxALIGN_CENTER|wxALL, 5 ); + + item3->Add( item6, 0, wxALIGN_CENTER, 0 ); + + item1->Add( item3, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxFlexGridSizer *item13 = new wxFlexGridSizer( 8, 0, 0 ); + item13->AddGrowableRow( 1 ); + s_extendedsizer = item13; + + wxStaticText *item14 = new wxStaticText( parent, ID_TEXT, _("File Type"), wxDefaultPosition, wxDefaultSize, 0 ); + item13->Add( item14, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxString strs15[] = + { + _("Any"), + _("Archives"), + _("Audio"), + _("CD-Images"), + _("Pictures"), + _("Programs"), + _("Texts"), + _("Videos") + }; + wxChoice *item15 = new wxChoice( parent, IDC_TypeSearch, wxDefaultPosition, wxDefaultSize, 8, strs15, 0 ); + item13->Add( item15, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticLine *item16 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + item13->Add( item16, 1, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + wxStaticText *item17 = new wxStaticText( parent, ID_TEXT, _("Category"), wxDefaultPosition, wxDefaultSize, 0 ); + item13->Add( item17, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxString *strs18 = (wxString*) NULL; + wxChoice *item18 = new wxChoice( parent, ID_AUTOCATASSIGN, wxDefaultPosition, wxDefaultSize, 0, strs18, 0 ); + item13->Add( item18, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticLine *item19 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + item13->Add( item19, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + wxStaticText *item20 = new wxStaticText( parent, ID_TEXT, _("Extension"), wxDefaultPosition, wxDefaultSize, 0 ); + item13->Add( item20, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + CMuleTextCtrl *item21 = new CMuleTextCtrl( parent, IDC_EDITSEARCHEXTENSION, wxT(""), wxDefaultPosition, wxSize(40,10), wxTE_PROCESS_ENTER ); + item13->Add( item21, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticText *item22 = new wxStaticText( parent, ID_TEXT, _("Min Size"), wxDefaultPosition, wxDefaultSize, 0 ); + item13->Add( item22, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxBoxSizer *item23 = new wxBoxSizer( wxHORIZONTAL ); + + wxSpinCtrl *item24 = new wxSpinCtrl( parent, IDC_SPINSEARCHMIN, wxT("0"), wxDefaultPosition, wxSize(60,-1), 0, 0, 4096, 0 ); + item23->Add( item24, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxString strs25[] = + { + _("Bytes"), + _("KB"), + _("MB"), + _("GB") + }; + wxChoice *item25 = new wxChoice( parent, IDC_SEARCHMINSIZE, wxDefaultPosition, wxDefaultSize, 4, strs25, 0 ); + item23->Add( item25, 0, wxALIGN_CENTER|wxALL, 5 ); + + item13->Add( item23, 0, wxALIGN_CENTER, 5 ); + + wxStaticLine *item26 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(-1,20), wxLI_VERTICAL ); + item13->Add( item26, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticText *item27 = new wxStaticText( parent, ID_TEXT, _("Max Size"), wxDefaultPosition, wxDefaultSize, 0 ); + item13->Add( item27, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxBoxSizer *item28 = new wxBoxSizer( wxHORIZONTAL ); + + wxSpinCtrl *item29 = new wxSpinCtrl( parent, IDC_SPINSEARCHMAX, wxT("0"), wxDefaultPosition, wxSize(60,-1), 0, 0, 4096, 0 ); + item28->Add( item29, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxString strs30[] = + { + _("Bytes"), + _("KB"), + _("MB"), + _("GB") + }; + wxChoice *item30 = new wxChoice( parent, IDC_SEARCHMAXSIZE, wxDefaultPosition, wxDefaultSize, 4, strs30, 0 ); + item28->Add( item30, 0, wxALIGN_CENTER|wxALL, 5 ); + + item13->Add( item28, 0, wxALIGN_CENTER, 5 ); + + wxStaticLine *item31 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(-1,20), wxLI_VERTICAL ); + item13->Add( item31, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticText *item32 = new wxStaticText( parent, ID_TEXT, _("Availability"), wxDefaultPosition, wxDefaultSize, 0 ); + item13->Add( item32, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxSpinCtrl *item33 = new wxSpinCtrl( parent, IDC_SPINSEARCHAVAIBILITY, wxT("0"), wxDefaultPosition, wxSize(45,-1), 0, 0, 1000, 0 ); + item13->Add( item33, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item1->Add( item13, 0, wxALIGN_CENTER, 5 ); + + wxFlexGridSizer *item34 = new wxFlexGridSizer( 1, 0, 0, 0 ); + s_filtersizer = item34; + + item34->Add( 10, 10, 1, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticText *item35 = new wxStaticText( parent, ID_TEXT, _("Filter:"), wxDefaultPosition, wxDefaultSize, 0 ); + item34->Add( item35, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxTextCtrl *item36 = new wxTextCtrl( parent, ID_FILTER_TEXT, wxT(""), wxDefaultPosition, wxSize(80,-1), wxTE_PROCESS_ENTER ); + item34->Add( item36, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticLine *item37 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(-1,20), wxLI_VERTICAL ); + item34->Add( item37, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item38 = new wxButton( parent, ID_FILTER, _("Filter Results"), wxDefaultPosition, wxDefaultSize, 0 ); + item34->Add( item38, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticLine *item39 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(-1,20), wxLI_VERTICAL ); + item34->Add( item39, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxCheckBox *item40 = new wxCheckBox( parent, ID_FILTER_INVERT, _("Invert Result"), wxDefaultPosition, wxDefaultSize, 0 ); + item34->Add( item40, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticLine *item41 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(-1,20), wxLI_VERTICAL ); + item34->Add( item41, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxCheckBox *item42 = new wxCheckBox( parent, ID_FILTER_KNOWN, _("Hide Known Files"), wxDefaultPosition, wxDefaultSize, 0 ); + item34->Add( item42, 0, wxALIGN_CENTER|wxALL, 5 ); + + item34->Add( 10, 10, 1, wxALIGN_CENTER|wxALL, 5 ); + + item1->Add( item34, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + wxBoxSizer *item43 = new wxBoxSizer( wxHORIZONTAL ); + + wxButton *item44 = new wxButton( parent, IDC_STARTS, _("Start"), wxDefaultPosition, wxDefaultSize, 0 ); + item44->Enable( false ); + item43->Add( item44, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticLine *item45 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(-1,20), wxLI_VERTICAL ); + item43->Add( item45, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item46 = new wxButton( parent, IDC_SEARCHMORE, _("More"), wxDefaultPosition, wxDefaultSize, 0 ); + item46->SetToolTip( _("Searches for more results on ED2K. Not supported for Kad yet.") ); + item46->Enable( false ); + item43->Add( item46, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticLine *item47 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(-1,20), wxLI_VERTICAL ); + item43->Add( item47, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item48 = new wxButton( parent, IDC_CANCELS, _("Stop"), wxDefaultPosition, wxDefaultSize, 0 ); + item48->Enable( false ); + item43->Add( item48, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticLine *item49 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(-1,20), wxLI_VERTICAL ); + item43->Add( item49, 0, wxGROW|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + wxButton *item50 = new wxButton( parent, IDC_SDOWNLOAD, _("Download"), wxDefaultPosition, wxDefaultSize, 0 ); + item50->Enable( false ); + item43->Add( item50, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticLine *item51 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(-1,20), wxLI_VERTICAL ); + item43->Add( item51, 0, wxGROW|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + wxButton *item52 = new wxButton( parent, IDC_SEARCH_RESET, _("Reset Fields"), wxDefaultPosition, wxDefaultSize, 0 ); + item52->Enable( false ); + item43->Add( item52, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticLine *item53 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(-1,20), wxLI_VERTICAL ); + item43->Add( item53, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item54 = new wxButton( parent, IDC_CLEAR_RESULTS, _("Clear"), wxDefaultPosition, wxDefaultSize, 0 ); + item54->Enable( false ); + item43->Add( item54, 0, wxALIGN_CENTER|wxALL, 5 ); + + item1->Add( item43, 0, wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticBox *item56 = new wxStaticBox( parent, -1, _("Results") ); + wxStaticBoxSizer *item55 = new wxStaticBoxSizer( item56, wxVERTICAL ); + + wxWindow *item57 = new CMuleNotebook(parent, ID_NOTEBOOK, wxDefaultPosition,wxDefaultSize,0); + wxASSERT( item57 ); + item55->Add( item57, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxGauge *item58 = new wxGauge( parent, ID_SEARCHPROGRESS, 100, wxDefaultPosition, wxSize(-1,10), 0 ); + item55->Add( item58, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item0->Add( item55, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *transfer_top_boxsizer; +wxSizer *transferTopPane( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + transfer_top_boxsizer = item1; + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleDlgImages( 10 ), wxDefaultPosition, wxDefaultSize ); + item1->Add( item2, 0, wxALIGN_CENTER|wxLEFT, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("Downloads"), wxDefaultPosition, wxDefaultSize, 0 ); + item3->SetName( wxT("downloadsLabel") ); + item1->Add( item3, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + wxBitmapButton *item4 = new wxBitmapButton( parent, ID_BTNCLRCOMPL, amuleDlgImages( 17 ), wxDefaultPosition, wxSize(30,30) ); + item4->SetToolTip( _("Clears completed downloads") ); + item4->Enable( false ); + item1->Add( item4, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + CMuleNotebook *item5 = new CMuleNotebook( parent, ID_CATEGORIES, wxDefaultPosition, wxSize(15,30), 0 ); + wxASSERT( item5 ); + item1->Add( item5, 1, wxFIXED_MINSIZE|wxALIGN_CENTER, 5 ); + + item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + CDownloadListCtrl *item6 = new CDownloadListCtrl( parent, ID_DLOADLIST, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxSUNKEN_BORDER ); + item6->SetName( wxT("downloadList") ); + item0->Add( item6, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *queueSizer; +wxSizer *s_clientlistHeader; +wxSizer *transferBottomPane( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + queueSizer = item0; + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + s_clientlistHeader = item1; + + wxBitmapButton *item2 = new wxBitmapButton( parent, ID_CLIENTTOGGLE, amuleDlgImages( 10 ), wxDefaultPosition, wxDefaultSize ); + item1->Add( item2, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxBitmapButton *item3 = new wxBitmapButton( parent, ID_BTNSWITCHUP, amuleDlgImages( 19 ), wxDefaultPosition, wxDefaultSize ); + item3->SetToolTip( _("Shows Upload / Up-queue") ); + item1->Add( item3, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticText *item4 = new wxStaticText( parent, ID_TEXT, _("Uploads"), wxDefaultPosition, wxDefaultSize, 0 ); + item4->SetName( wxT("uploadTitle") ); + item1->Add( item4, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxALL, 5 ); + + item1->Add( 20, 20, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + wxStaticText *item5 = new wxStaticText( parent, ID_TEXT, _("Clients on queue :"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item5, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item6 = new wxStaticText( parent, ID_CLIENTCOUNT, _("0"), wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE ); + item6->SetForegroundColour( *wxBLUE ); + item1->Add( item6, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + CClientListCtrl *item7 = new CClientListCtrl( parent, ID_CLIENTLIST, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxSUNKEN_BORDER ); + item0->Add( item7, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *messagePage( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBox *item2 = new wxStaticBox( parent, -1, wxT("") ); + wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL ); + + wxBoxSizer *item3 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item4 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleDlgImages( 14 ), wxDefaultPosition, wxDefaultSize ); + item3->Add( item4, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item5 = new wxStaticText( parent, ID_TEXT, _("Friends"), wxDefaultPosition, wxDefaultSize, 0 ); + item3->Add( item5, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT|wxTOP|wxBOTTOM, 5 ); + + item1->Add( item3, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + CFriendListCtrl *item6 = new CFriendListCtrl( parent, ID_FRIENDLIST, wxDefaultPosition, wxSize(160,120), wxLC_REPORT|wxSUNKEN_BORDER ); + item1->Add( item6, 1, wxFIXED_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxBOTTOM, 5 ); + + item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxStaticBox *item8 = new wxStaticBox( parent, -1, wxT("") ); + wxStaticBoxSizer *item7 = new wxStaticBoxSizer( item8, wxVERTICAL ); + + wxBoxSizer *item9 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item10 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleDlgImages( 15 ), wxDefaultPosition, wxDefaultSize ); + item9->Add( item10, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item11 = new wxStaticText( parent, ID_TEXT, _("Messages"), wxDefaultPosition, wxDefaultSize, 0 ); + item9->Add( item11, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxALL, 5 ); + + item7->Add( item9, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + CChatSelector *item12 = new CChatSelector(parent, IDC_CHATSELECTOR,wxDefaultPosition,wxSize(200,32),0L); + wxASSERT( item12 ); + item7->Add( item12, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 0 ); + + wxBoxSizer *item13 = new wxBoxSizer( wxHORIZONTAL ); + + CMuleTextCtrl *item14 = new CMuleTextCtrl( parent, IDC_CMESSAGE, wxT(""), wxDefaultPosition, wxSize(80,-1), wxTE_PROCESS_ENTER ); + item14->Enable( false ); + item13->Add( item14, 1, wxALIGN_CENTER, 5 ); + + wxButton *item15 = new wxButton( parent, IDC_CSEND, _("Send"), wxDefaultPosition, wxDefaultSize, 0 ); + item15->SetToolTip( _("Sends the specified message.") ); + item15->Enable( false ); + item13->Add( item15, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + wxButton *item16 = new wxButton( parent, IDC_CCLOSE, _("Close"), wxDefaultPosition, wxDefaultSize, 0 ); + item16->SetToolTip( _("Close this chat-session.") ); + item16->Enable( false ); + item13->Add( item16, 0, wxALIGN_CENTER, 5 ); + + item7->Add( item13, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); + + item0->Add( item7, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *IDC_FD_X0; +wxSizer *IDC_FD_X6; +wxSizer *IDC_FD_ICH; +wxSizer *fileDetails( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxFlexGridSizer *item0 = new wxFlexGridSizer( 1, 0, 0 ); + item0->AddGrowableCol( 0 ); + item0->AddGrowableRow( 4 ); + + wxStaticBox *item2 = new wxStaticBox( parent, -1, _("General") ); + wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL ); + IDC_FD_X0 = item1; + + wxBoxSizer *item3 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item4 = new wxStaticText( parent, IDC_FD_X1, _("Full Name :"), wxDefaultPosition, wxDefaultSize, 0 ); + item3->Add( item4, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxStaticText *item5 = new wxStaticText( parent, IDC_FNAME, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item5->SetForegroundColour( *wxBLUE ); + item3->Add( item5, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + item1->Add( item3, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item6 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item7 = new wxStaticText( parent, IDC_FD_X2, _("met-File :"), wxDefaultPosition, wxDefaultSize, 0 ); + item6->Add( item7, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxStaticText *item8 = new wxStaticText( parent, IDC_METFILE, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item8->SetForegroundColour( *wxBLUE ); + item6->Add( item8, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item1->Add( item6, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 0 ); + + wxBoxSizer *item9 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item10 = new wxStaticText( parent, IDC_FD_X3, _("Hash :"), wxDefaultPosition, wxDefaultSize, 0 ); + item9->Add( item10, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxStaticText *item11 = new wxStaticText( parent, IDC_FHASH, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item11->SetForegroundColour( *wxBLUE ); + item9->Add( item11, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item1->Add( item9, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxFlexGridSizer *item12 = new wxFlexGridSizer( 2, 0, 0 ); + item12->AddGrowableCol( 0 ); + item12->AddGrowableCol( 1 ); + + wxBoxSizer *item13 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item14 = new wxStaticText( parent, IDC_FD_X4, _("Filesize :"), wxDefaultPosition, wxDefaultSize, 0 ); + item13->Add( item14, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxStaticText *item15 = new wxStaticText( parent, IDC_FSIZE, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item15->SetForegroundColour( *wxBLUE ); + item13->Add( item15, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item12->Add( item13, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item16 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item17 = new wxStaticText( parent, IDC_FD_X5, _("Partfilestatus :"), wxDefaultPosition, wxDefaultSize, 0 ); + item16->Add( item17, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item18 = new wxStaticText( parent, IDC_PFSTATUS, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item18->SetForegroundColour( *wxBLUE ); + item16->Add( item18, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item12->Add( item16, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item19 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item20 = new wxStaticText( parent, IDC_FD_X15, _("Last seen complete :"), wxDefaultPosition, wxDefaultSize, 0 ); + item19->Add( item20, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxStaticText *item21 = new wxStaticText( parent, IDC_LASTSEENCOMPL, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item21->SetForegroundColour( *wxBLUE ); + item19->Add( item21, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item12->Add( item19, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item1->Add( item12, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item1, 1, wxGROW|wxALL, 5 ); + + wxStaticBox *item23 = new wxStaticBox( parent, -1, _("Transfer") ); + wxStaticBoxSizer *item22 = new wxStaticBoxSizer( item23, wxVERTICAL ); + IDC_FD_X6 = item22; + + wxFlexGridSizer *item24 = new wxFlexGridSizer( 2, 0, 0 ); + item24->AddGrowableCol( 0 ); + item24->AddGrowableCol( 1 ); + + wxBoxSizer *item25 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item26 = new wxStaticText( parent, IDC_FD_X7, _("Found Sources :"), wxDefaultPosition, wxDefaultSize, 0 ); + item25->Add( item26, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item27 = new wxStaticText( parent, IDC_SOURCECOUNT, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item27->SetForegroundColour( *wxBLUE ); + item25->Add( item27, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item24->Add( item25, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 0 ); + + wxBoxSizer *item28 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item29 = new wxStaticText( parent, IDC_FD_X10, _("Transferring Sources :"), wxDefaultPosition, wxDefaultSize, 0 ); + item28->Add( item29, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxStaticText *item30 = new wxStaticText( parent, IDC_SOURCECOUNT2, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item30->SetForegroundColour( *wxBLUE ); + item28->Add( item30, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item24->Add( item28, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 0 ); + + wxBoxSizer *item31 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item32 = new wxStaticText( parent, IDC_FD_X9, _("Filepart-Count :"), wxDefaultPosition, wxDefaultSize, 0 ); + item31->Add( item32, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item33 = new wxStaticText( parent, IDC_PARTCOUNT, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item33->SetForegroundColour( *wxBLUE ); + item31->Add( item33, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item24->Add( item31, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 0 ); + + wxBoxSizer *item34 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item35 = new wxStaticText( parent, IDC_FD_X11, _("Available :"), wxDefaultPosition, wxDefaultSize, 0 ); + item34->Add( item35, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxStaticText *item36 = new wxStaticText( parent, IDC_PARTAVAILABLE, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item36->SetForegroundColour( *wxBLUE ); + item34->Add( item36, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item24->Add( item34, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 0 ); + + wxBoxSizer *item37 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item38 = new wxStaticText( parent, IDC_FD_X13, _("Datarate :"), wxDefaultPosition, wxDefaultSize, 0 ); + item37->Add( item38, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item39 = new wxStaticText( parent, IDC_DATARATE, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item39->SetForegroundColour( *wxBLUE ); + item37->Add( item39, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item24->Add( item37, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 0 ); + + wxBoxSizer *item40 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item41 = new wxStaticText( parent, IDC_FD_X13, _("Download Active Time: "), wxDefaultPosition, wxDefaultSize, 0 ); + item40->Add( item41, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxStaticText *item42 = new wxStaticText( parent, IDC_DLACTIVETIME, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item42->SetForegroundColour( *wxBLUE ); + item40->Add( item42, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item24->Add( item40, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 0 ); + + wxBoxSizer *item43 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item44 = new wxStaticText( parent, IDC_FD_X14, _("Transferred :"), wxDefaultPosition, wxDefaultSize, 0 ); + item43->Add( item44, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item45 = new wxStaticText( parent, IDC_TRANSFERRED, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item45->SetForegroundColour( *wxBLUE ); + item43->Add( item45, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item24->Add( item43, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item46 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item47 = new wxStaticText( parent, IDC_FD_X12, _("Completed Size :"), wxDefaultPosition, wxDefaultSize, 0 ); + item46->Add( item47, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxBoxSizer *item48 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item49 = new wxStaticText( parent, IDC_COMPLSIZE, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item49->SetForegroundColour( *wxBLUE ); + item48->Add( item49, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item50 = new wxStaticText( parent, ID_TEXT, wxT(" / ("), wxDefaultPosition, wxDefaultSize, 0 ); + item48->Add( item50, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item51 = new wxStaticText( parent, IDC_PROCCOMPL, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item51->SetForegroundColour( *wxBLUE ); + item48->Add( item51, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item52 = new wxStaticText( parent, ID_TEXT, wxT(")"), wxDefaultPosition, wxDefaultSize, 0 ); + item48->Add( item52, 0, wxALIGN_CENTER_VERTICAL, 0 ); + + item46->Add( item48, 0, wxALIGN_CENTER|wxLEFT, 5 ); + + item24->Add( item46, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item22->Add( item24, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item22, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticBox *item54 = new wxStaticBox( parent, -1, _("Intelligent Corruption Handling") ); + wxStaticBoxSizer *item53 = new wxStaticBoxSizer( item54, wxVERTICAL ); + IDC_FD_ICH = item53; + + wxFlexGridSizer *item55 = new wxFlexGridSizer( 2, 0, 0 ); + item55->AddGrowableCol( 0 ); + item55->AddGrowableCol( 1 ); + + wxBoxSizer *item56 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item57 = new wxStaticText( parent, IDC_FD_LSTATS1, _("Lost to corruption :"), wxDefaultPosition, wxDefaultSize, 0 ); + item56->Add( item57, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item58 = new wxStaticText( parent, IDC_FD_STATS1, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item58->SetForegroundColour( *wxBLUE ); + item56->Add( item58, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item55->Add( item56, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item59 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item60 = new wxStaticText( parent, IDC_FD_LSTATS2, _("Gained by compression :"), wxDefaultPosition, wxDefaultSize, 0 ); + item59->Add( item60, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxStaticText *item61 = new wxStaticText( parent, IDC_FD_STATS2, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item61->SetForegroundColour( *wxBLUE ); + item59->Add( item61, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item55->Add( item59, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item62 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item63 = new wxStaticText( parent, IDC_FD_LSTATS3, _("Packages saved by I.C.H. :"), wxDefaultPosition, wxDefaultSize, 0 ); + item62->Add( item63, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item64 = new wxStaticText( parent, IDC_FD_STATS3, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item64->SetForegroundColour( *wxBLUE ); + item62->Add( item64, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item55->Add( item62, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 0 ); + + item53->Add( item55, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item53, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxFlexGridSizer *item65 = new wxFlexGridSizer( 1, 0, 0, 0 ); + item65->AddGrowableCol( 0 ); + item65->AddGrowableCol( 2 ); + + wxStaticLine *item66 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(20,-1), wxLI_HORIZONTAL ); + item65->Add( item66, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxStaticText *item67 = new wxStaticText( parent, ID_TEXT, _("File Names"), wxDefaultPosition, wxDefaultSize, 0 ); + item65->Add( item67, 0, wxALIGN_CENTER|wxTOP|wxBOTTOM, 5 ); + + wxStaticLine *item68 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(20,-1), wxLI_HORIZONTAL ); + item65->Add( item68, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + item0->Add( item65, 0, wxGROW, 5 ); + + CFileDetailListCtrl *item69 = new CFileDetailListCtrl( parent, IDC_LISTCTRLFILENAMES, wxDefaultPosition, wxSize(-1,130), wxLC_REPORT|wxSUNKEN_BORDER ); + wxASSERT( item69 ); + item0->Add( item69, 1, wxADJUST_MINSIZE|wxFIXED_MINSIZE|wxGROW|wxALIGN_BOTTOM|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxBoxSizer *item70 = new wxBoxSizer( wxHORIZONTAL ); + + wxButton *item71 = new wxButton( parent, IDC_TAKEOVER, _("Takeover"), wxDefaultPosition, wxDefaultSize, 0 ); + item70->Add( item71, 0, wxALIGN_CENTER, 5 ); + + item70->Add( 20, 20, 1, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item72 = new wxButton( parent, IDC_CMTBT, _("Show all comments"), wxDefaultPosition, wxDefaultSize, 0 ); + item70->Add( item72, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item70->Add( 20, 20, 1, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item73 = new wxButton( parent, IDC_BUTTONSTRIP, _("Cleanup"), wxDefaultPosition, wxDefaultSize, 0 ); + item70->Add( item73, 0, wxALIGN_CENTER, 5 ); + + item0->Add( item70, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + CMuleTextCtrl *item74 = new CMuleTextCtrl( parent, IDC_FILENAME, wxT(""), wxDefaultPosition, wxDefaultSize, 0 ); + item0->Add( item74, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxBoxSizer *item75 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item76 = new wxBoxSizer( wxHORIZONTAL ); + + item76->Add( 20, 20, 1, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item77 = new wxButton( parent, IDC_APPLY, _("Apply"), wxDefaultPosition, wxDefaultSize, 0 ); + item76->Add( item77, 0, wxALIGN_CENTER, 5 ); + + item76->Add( 20, 20, 1, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item78 = new wxButton( parent, IDC_APPLY_AND_CLOSE, _("Ok"), wxDefaultPosition, wxDefaultSize, 0 ); + item76->Add( item78, 0, wxALIGN_CENTER, 5 ); + + item76->Add( 20, 20, 1, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item79 = new wxButton( parent, ID_CLOSEWNDFD, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); + item79->SetDefault(); + item76->Add( item79, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item76->Add( 20, 20, 1, wxALIGN_CENTER|wxALL, 5 ); + + item75->Add( item76, 0, wxALIGN_CENTER, 5 ); + + item0->Add( item75, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *commentDlg( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBox *item2 = new wxStaticBox( parent, -1, _("Comment/Rate file (Text will be visible to all users)") ); + wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL ); + + wxBoxSizer *item3 = new wxBoxSizer( wxHORIZONTAL ); + + CMuleTextCtrl *item4 = new CMuleTextCtrl( parent, IDC_CMT_TEXT, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER ); + item3->Add( item4, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxButton *item5 = new wxButton( parent, IDC_FC_CLEAR, _("Clear"), wxDefaultPosition, wxDefaultSize, 0 ); + item3->Add( item5, 0, wxALIGN_CENTER|wxALL, 5 ); + + item1->Add( item3, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item6 = new wxStaticText( parent, ID_TEXT, + _("For a film you can say its length, its story, language ...\nand if it's a fake, you can tell that to other users of aMule."), + wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item6, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + item0->Add( item1, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP, 5 ); + + wxBoxSizer *item7 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBox *item9 = new wxStaticBox( parent, -1, _("File Quality") ); + wxStaticBoxSizer *item8 = new wxStaticBoxSizer( item9, wxVERTICAL ); + + wxString strs10[] = + { + _("Not rated"), + _("Invalid / Corrupt / Fake"), + _("Poor"), + _("Fair"), + _("Good"), + _("Excellent") + }; + wxChoice *item10 = new wxChoice( parent, IDC_RATELIST, wxDefaultPosition, wxDefaultSize, 6, strs10, 0 ); + item8->Add( item10, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticText *item11 = new wxStaticText( parent, ID_TEXT, _("Choose the file rating or advice users if the file is invalid ..."), wxDefaultPosition, wxDefaultSize, 0 ); + item8->Add( item11, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + item7->Add( item8, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL|wxALL, 0 ); + + wxButton *item12 = new wxButton( parent, IDCOK, _("Apply"), wxDefaultPosition, wxDefaultSize, 0 ); + item12->SetDefault(); + item7->Add( item12, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item13 = new wxButton( parent, IDCCANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); + item7->Add( item13, 0, wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item7, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *commentLstDlg( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + CMuleListCtrl *item1 = new CMuleListCtrl( parent, IDC_LST, wxDefaultPosition, wxSize(600,270), wxLC_REPORT|wxSUNKEN_BORDER ); + item0->Add( item1, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxFlexGridSizer *item2 = new wxFlexGridSizer( 1, 0, 0, 0 ); + item2->AddGrowableCol( 3 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, wxT("("), wxDefaultPosition, wxDefaultSize, 0 ); + item2->Add( item3, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxStaticText *item4 = new wxStaticText( parent, IDC_CMSTATUS, _("No comment(s)"), wxDefaultPosition, wxDefaultSize, 0 ); + item4->SetForegroundColour( *wxBLUE ); + item2->Add( item4, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item5 = new wxStaticText( parent, ID_TEXT, wxT(")"), wxDefaultPosition, wxDefaultSize, 0 ); + item2->Add( item5, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxButton *item6 = new wxButton( parent, IDCREF, _("Refresh"), wxDefaultPosition, wxDefaultSize, 0 ); + item2->Add( item6, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxButton *item7 = new wxButton( parent, IDCOK, _("Close"), wxDefaultPosition, wxDefaultSize, 0 ); + item7->SetDefault(); + item2->Add( item7, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item0->Add( item2, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *downloadDlg( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + MuleGifCtrl *item1 = new MuleGifCtrl(parent,ID_ANIMATE,wxPoint(0,0),wxSize(272,60),wxNO_BORDER); + wxASSERT( item1 ); + item0->Add( item1, 0, wxFIXED_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticText *item2 = new wxStaticText( parent, ID_TEXT, _("Downloading, please wait ..."), wxDefaultPosition, wxDefaultSize, 0 ); + item0->Add( item2, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + wxGauge *item3 = new wxGauge( parent, ID_HTTPDOWNLOADPROGRESS, 100, wxDefaultPosition, wxSize(-1,10), wxGA_SMOOTH/*|wxGA_PROGRESSBAR*/ ); + item0->Add( item3, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticText *item4 = new wxStaticText( parent, IDC_DOWNLOADSIZE, _("Unknown size"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE ); + item0->Add( item4, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticLine *item5 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(20,-1), wxLI_HORIZONTAL ); + item0->Add( item5, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxButton *item6 = new wxButton( parent, ID_HTTPCANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); + item6->SetDefault(); + item0->Add( item6, 0, wxALIGN_CENTER|wxALL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *addFriendDlg( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBox *item2 = new wxStaticBox( parent, -1, _("Required Information") ); + wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL ); + + wxFlexGridSizer *item3 = new wxFlexGridSizer( 2, 0, 0 ); + + wxStaticText *item4 = new wxStaticText( parent, ID_TEXT, _("IP Address :"), wxDefaultPosition, wxSize(70,-1), 0 ); + item3->Add( item4, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxBOTTOM, 5 ); + + CMuleTextCtrl *item5 = new CMuleTextCtrl( parent, ID_IPADDRESS, wxT(""), wxDefaultPosition, wxSize(150,-1), 0 ); + item3->Add( item5, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item6 = new wxStaticText( parent, ID_TEXT, _("Port :"), wxDefaultPosition, wxSize(70,-1), 0 ); + item3->Add( item6, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP, 5 ); + + CMuleTextCtrl *item7 = new CMuleTextCtrl( parent, ID_IPORT, wxT(""), wxDefaultPosition, wxSize(80,-1), 0 ); + item3->Add( item7, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP, 5 ); + + item1->Add( item3, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticBox *item9 = new wxStaticBox( parent, -1, _("Additional Information") ); + wxStaticBoxSizer *item8 = new wxStaticBoxSizer( item9, wxVERTICAL ); + + wxFlexGridSizer *item10 = new wxFlexGridSizer( 2, 0, 0 ); + + wxStaticText *item11 = new wxStaticText( parent, ID_TEXT, _("Username :"), wxDefaultPosition, wxSize(70,-1), 0 ); + item10->Add( item11, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxBOTTOM, 5 ); + + CMuleTextCtrl *item12 = new CMuleTextCtrl( parent, ID_USERNAME, wxT(""), wxDefaultPosition, wxSize(250,-1), 0 ); + item10->Add( item12, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxBOTTOM, 5 ); + + wxStaticText *item13 = new wxStaticText( parent, ID_TEXT, _("Userhash :"), wxDefaultPosition, wxSize(70,-1), 0 ); + item10->Add( item13, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxBOTTOM, 5 ); + + CMuleTextCtrl *item14 = new CMuleTextCtrl( parent, ID_USERHASH, wxT(""), wxDefaultPosition, wxSize(250,-1), 0 ); + item10->Add( item14, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxBOTTOM, 5 ); + + item8->Add( item10, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item0->Add( item8, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxBoxSizer *item15 = new wxBoxSizer( wxHORIZONTAL ); + + wxButton *item16 = new wxButton( parent, ID_ADDFRIEND, _("Add"), wxDefaultPosition, wxDefaultSize, 0 ); + item16->SetDefault(); + item15->Add( item16, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item17 = new wxButton( parent, ID_CLOSEDLG, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); + item15->Add( item17, 0, wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item15, 0, wxALIGN_CENTER|wxALL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *sharedfilesDlg( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxStaticBox *item1 = new wxStaticBox( parent, -1, wxT("") ); + wxStaticBoxSizer *item0 = new wxStaticBoxSizer( item1, wxVERTICAL ); + + wxBoxSizer *item2 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item3 = new wxStaticBitmap( parent, ID_STATICBITMAP, moreImages( 0 ), wxDefaultPosition, wxDefaultSize ); + item2->Add( item3, 0, wxGROW|wxALIGN_CENTER_HORIZONTAL|wxLEFT|wxTOP|wxBOTTOM, 5 ); + + wxStaticText *item4 = new wxStaticText( parent, ID_TEXT, _("Shared Files"), wxDefaultPosition, wxDefaultSize, 0 ); + item4->SetName( wxT("sharedFilesLabel") ); + item2->Add( item4, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + wxBitmapButton *item5 = new wxBitmapButton( parent, ID_BTNRELSHARED, amuleDlgImages( 18 ), wxDefaultPosition, wxSize(32,32) ); + item5->SetToolTip( _("Reload your shared files") ); + item2->Add( item5, 0, wxALIGN_CENTER|wxLEFT, 5 ); + + item0->Add( item2, 0, wxALIGN_CENTER_VERTICAL|wxALL, 0 ); + + CSharedFilesCtrl *item6 = new CSharedFilesCtrl( parent, ID_SHFILELIST, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxSUNKEN_BORDER ); + item6->SetName( wxT("sharedFilesCt") ); + item0->Add( item6, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item8 = new wxStaticBox( parent, -1, _("Statistics") ); + wxStaticBoxSizer *item7 = new wxStaticBoxSizer( item8, wxVERTICAL ); + + wxFlexGridSizer *item9 = new wxFlexGridSizer( 6, 0, 0 ); + + wxStaticBitmap *item10 = new wxStaticBitmap( parent, ID_STATICBITMAP, moreImages( 1 ), wxDefaultPosition, wxDefaultSize ); + item9->Add( item10, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item11 = new wxStaticText( parent, ID_TEXT, _("Current Session"), wxDefaultPosition, wxDefaultSize, 0 ); + item9->Add( item11, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + item9->Add( 20, 20, 0, wxALIGN_CENTER, 5 ); + + item9->Add( 20, 20, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item12 = new wxStaticText( parent, ID_TEXT, _("Total"), wxDefaultPosition, wxDefaultSize, 0 ); + item9->Add( item12, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + item9->Add( 20, 20, 0, wxALIGN_CENTER, 5 ); + + item9->Add( 20, 20, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item13 = new wxStaticText( parent, ID_TEXT, _("Requested :"), wxDefaultPosition, wxDefaultSize, 0 ); + item9->Add( item13, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + wxStaticText *item14 = new wxStaticText( parent, IDC_SREQUESTED, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item14->SetForegroundColour( *wxBLUE ); + item9->Add( item14, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + wxGauge *item15 = new wxGauge( parent, ID_GAUGE, 100, wxDefaultPosition, wxSize(200,-1), 0 ); + item15->SetName( wxT("popbar") ); + item9->Add( item15, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + wxStaticText *item16 = new wxStaticText( parent, ID_TEXT, _("Requested :"), wxDefaultPosition, wxDefaultSize, 0 ); + item9->Add( item16, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + wxStaticText *item17 = new wxStaticText( parent, IDC_SREQUESTED2, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item17->SetForegroundColour( *wxBLUE ); + item9->Add( item17, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + item9->Add( 20, 20, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item18 = new wxStaticText( parent, ID_TEXT, _("Active Uploads :"), wxDefaultPosition, wxDefaultSize, 0 ); + item9->Add( item18, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + wxStaticText *item19 = new wxStaticText( parent, IDC_SACCEPTED, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item19->SetForegroundColour( *wxBLUE ); + item9->Add( item19, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + wxGauge *item20 = new wxGauge( parent, ID_GAUGE, 100, wxDefaultPosition, wxSize(200,-1), 0 ); + item20->SetName( wxT("popbarAccept") ); + item9->Add( item20, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT|wxTOP, 5 ); + + wxStaticText *item21 = new wxStaticText( parent, ID_TEXT, _("Active Uploads :"), wxDefaultPosition, wxDefaultSize, 0 ); + item9->Add( item21, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + wxStaticText *item22 = new wxStaticText( parent, IDC_SACCEPTED2, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item22->SetForegroundColour( *wxBLUE ); + item9->Add( item22, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + item9->Add( 20, 20, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item23 = new wxStaticText( parent, ID_TEXT, _("Transferred :"), wxDefaultPosition, wxDefaultSize, 0 ); + item9->Add( item23, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + wxStaticText *item24 = new wxStaticText( parent, IDC_STRANSFERRED, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item24->SetForegroundColour( *wxBLUE ); + item9->Add( item24, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + wxGauge *item25 = new wxGauge( parent, ID_GAUGE, 100, wxDefaultPosition, wxSize(200,-1), 0 ); + item25->SetName( wxT("popbarTrans") ); + item9->Add( item25, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT|wxTOP, 5 ); + + wxStaticText *item26 = new wxStaticText( parent, ID_TEXT, _("Transferred :"), wxDefaultPosition, wxDefaultSize, 0 ); + item9->Add( item26, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + wxStaticText *item27 = new wxStaticText( parent, IDC_STRANSFERRED2, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item27->SetForegroundColour( *wxBLUE ); + item9->Add( item27, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + item7->Add( item9, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item0->Add( item7, 0, wxALIGN_CENTER|wxTOP, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *testSizer; +wxSizer *statsDlg( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxGridSizer *item0 = new wxGridSizer( 2, 0, 0 ); + testSizer = item0; + + wxStaticBox *item2 = new wxStaticBox( parent, -1, _("Download-Speed") ); + wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL ); + + wxWindow *item3 = new COScopeCtrl(3,1,GRAPH_DOWN,parent); +item3->SetName(wxT("dloadScope")); + wxASSERT( item3 ); + item1->Add( item3, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxFlexGridSizer *item4 = new wxFlexGridSizer( 2, 0, 0 ); + item4->AddGrowableCol( 0 ); + item4->AddGrowableCol( 1 ); + + wxBoxSizer *item5 = new wxBoxSizer( wxHORIZONTAL ); + + wxWindow *item6 = new CColorFrameCtrl(parent,IDC_C0,20,14); + wxASSERT( item6 ); + item5->Add( item6, 0, wxFIXED_MINSIZE|wxALIGN_CENTER, 5 ); + + wxStaticText *item7 = new wxStaticText( parent, ID_TEXT, _("Current"), wxDefaultPosition, wxDefaultSize, 0 ); + item5->Add( item7, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item4->Add( item5, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxBoxSizer *item8 = new wxBoxSizer( wxHORIZONTAL ); + + wxWindow *item9 = new CColorFrameCtrl(parent,IDC_C0_3,20,14); + wxASSERT( item9 ); + item8->Add( item9, 0, wxFIXED_MINSIZE|wxALIGN_CENTER, 5 ); + + wxStaticText *item10 = new wxStaticText( parent, ID_TEXT, _("Running average"), wxDefaultPosition, wxDefaultSize, 0 ); + item8->Add( item10, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item4->Add( item8, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxBoxSizer *item11 = new wxBoxSizer( wxHORIZONTAL ); + + wxWindow *item12 = new CColorFrameCtrl(parent,IDC_C0_2,20,14); + wxASSERT( item12 ); + item11->Add( item12, 0, wxFIXED_MINSIZE|wxALIGN_CENTER, 5 ); + + wxStaticText *item13 = new wxStaticText( parent, ID_TEXT, _("Session average"), wxDefaultPosition, wxDefaultSize, 0 ); + item11->Add( item13, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item4->Add( item11, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + item1->Add( item4, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP, 5 ); + + item0->Add( item1, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); + + wxStaticBox *item15 = new wxStaticBox( parent, -1, _("Upload-Speed") ); + wxStaticBoxSizer *item14 = new wxStaticBoxSizer( item15, wxVERTICAL ); + + wxWindow *item16 = new COScopeCtrl(3,1,GRAPH_UP,parent); +item16->SetName(wxT("uloadScope")); + wxASSERT( item16 ); + item14->Add( item16, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxFlexGridSizer *item17 = new wxFlexGridSizer( 2, 0, 0 ); + item17->AddGrowableCol( 0 ); + item17->AddGrowableCol( 1 ); + + wxBoxSizer *item18 = new wxBoxSizer( wxHORIZONTAL ); + + wxWindow *item19 = new CColorFrameCtrl(parent,IDC_C1,20,14); + wxASSERT( item19 ); + item18->Add( item19, 0, wxFIXED_MINSIZE|wxALIGN_CENTER, 5 ); + + wxStaticText *item20 = new wxStaticText( parent, ID_TEXT, _("Current"), wxDefaultPosition, wxDefaultSize, 0 ); + item18->Add( item20, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item17->Add( item18, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxBoxSizer *item21 = new wxBoxSizer( wxHORIZONTAL ); + + wxWindow *item22 = new CColorFrameCtrl(parent,IDC_C1_3,20,14); + wxASSERT( item22 ); + item21->Add( item22, 0, wxFIXED_MINSIZE|wxALIGN_CENTER, 5 ); + + wxStaticText *item23 = new wxStaticText( parent, ID_TEXT, _("Running average"), wxDefaultPosition, wxDefaultSize, 0 ); + item21->Add( item23, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item17->Add( item21, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxBoxSizer *item24 = new wxBoxSizer( wxHORIZONTAL ); + + wxWindow *item25 = new CColorFrameCtrl(parent,IDC_C1_2,20,14); + wxASSERT( item25 ); + item24->Add( item25, 0, wxFIXED_MINSIZE|wxALIGN_CENTER, 5 ); + + wxStaticText *item26 = new wxStaticText( parent, ID_TEXT, _("Session average"), wxDefaultPosition, wxDefaultSize, 0 ); + item24->Add( item26, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item17->Add( item24, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + item14->Add( item17, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP, 5 ); + + item0->Add( item14, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); + + wxStaticBox *item28 = new wxStaticBox( parent, -1, _("Connections") ); + wxStaticBoxSizer *item27 = new wxStaticBoxSizer( item28, wxVERTICAL ); + + wxWindow *item29 = new COScopeCtrl(3,0,GRAPH_CONN,parent); +item29->SetName(wxT("otherScope")); + wxASSERT( item29 ); + item27->Add( item29, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxFlexGridSizer *item30 = new wxFlexGridSizer( 2, 0, 0 ); + item30->AddGrowableCol( 0 ); + item30->AddGrowableCol( 1 ); + + wxBoxSizer *item31 = new wxBoxSizer( wxHORIZONTAL ); + + wxWindow *item32 = new CColorFrameCtrl(parent,IDC_S3,20,14); + wxASSERT( item32 ); + item31->Add( item32, 0, wxFIXED_MINSIZE|wxALIGN_CENTER, 5 ); + + wxStaticText *item33 = new wxStaticText( parent, ID_TEXT, _("Active downloads"), wxDefaultPosition, wxDefaultSize, 0 ); + item31->Add( item33, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item30->Add( item31, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxBoxSizer *item34 = new wxBoxSizer( wxHORIZONTAL ); + + wxWindow *item35 = new CColorFrameCtrl(parent,IDC_S0,20,14); + wxASSERT( item35 ); + item34->Add( item35, 0, wxFIXED_MINSIZE|wxALIGN_CENTER, 5 ); + + wxStaticText *item36 = new wxStaticText( parent, ID_ACTIVEC, _("Active connections (1:1)"), wxDefaultPosition, wxDefaultSize, 0 ); + item34->Add( item36, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item30->Add( item34, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxBoxSizer *item37 = new wxBoxSizer( wxHORIZONTAL ); + + wxWindow *item38 = new CColorFrameCtrl(parent,IDC_S1,20,14); + wxASSERT( item38 ); + item37->Add( item38, 0, wxFIXED_MINSIZE|wxALIGN_CENTER, 5 ); + + wxStaticText *item39 = new wxStaticText( parent, ID_TEXT, _("Active uploads"), wxDefaultPosition, wxDefaultSize, 0 ); + item37->Add( item39, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item30->Add( item37, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + item27->Add( item30, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP, 5 ); + + item0->Add( item27, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item41 = new wxStaticBox( parent, -1, _("Statistics Tree") ); + wxStaticBoxSizer *item40 = new wxStaticBoxSizer( item41, wxVERTICAL ); + + wxTreeCtrl *item42 = new wxTreeCtrl( parent, ID_TREECTRL, wxDefaultPosition, wxDefaultSize, wxTR_HAS_BUTTONS|wxSUNKEN_BORDER ); + item42->SetName( wxT("statTree") ); + item40->Add( item42, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item40, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *clientDetails( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBox *item2 = new wxStaticBox( parent, -1, _("General") ); + wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL ); + + wxBoxSizer *item3 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer *item4 = new wxBoxSizer( wxVERTICAL ); + + wxStaticText *item5 = new wxStaticText( parent, ID_TEXT, _("Username:"), wxDefaultPosition, wxDefaultSize, 0 ); + item4->Add( item5, 0, wxADJUST_MINSIZE|wxGROW|wxALL, 5 ); + + wxStaticText *item6 = new wxStaticText( parent, ID_TEXT, _("Userhash:"), wxDefaultPosition, wxDefaultSize, 0 ); + item4->Add( item6, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + item3->Add( item4, 0, wxALIGN_CENTER, 5 ); + + wxBoxSizer *item7 = new wxBoxSizer( wxVERTICAL ); + + wxStaticText *item8 = new wxStaticText( parent, ID_DNAME, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item8->SetForegroundColour( *wxBLUE ); + item7->Add( item8, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticText *item9 = new wxStaticText( parent, ID_DHASH, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item9->SetForegroundColour( *wxBLUE ); + item7->Add( item9, 0, wxADJUST_MINSIZE|wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + item3->Add( item7, 0, wxALIGN_CENTER, 5 ); + + item1->Add( item3, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxFlexGridSizer *item10 = new wxFlexGridSizer( 5, 0, 0 ); + item10->AddGrowableCol( 1 ); + item10->AddGrowableCol( 4 ); + + wxStaticText *item11 = new wxStaticText( parent, ID_TEXT, _("Client software:"), wxDefaultPosition, wxDefaultSize, 0 ); + item10->Add( item11, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item12 = new wxStaticText( parent, ID_DSOFT, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item12->SetForegroundColour( *wxBLUE ); + item10->Add( item12, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + item10->Add( 20, 20, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item13 = new wxStaticText( parent, ID_TEXT, _("Client version:"), wxDefaultPosition, wxDefaultSize, 0 ); + item10->Add( item13, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item14 = new wxStaticText( parent, ID_DVERSION, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item14->SetForegroundColour( *wxBLUE ); + item10->Add( item14, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item15 = new wxStaticText( parent, ID_TEXT, _("IP address:"), wxDefaultPosition, wxDefaultSize, 0 ); + item10->Add( item15, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item16 = new wxStaticText( parent, ID_DIP, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item16->SetForegroundColour( *wxBLUE ); + item10->Add( item16, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + item10->Add( 20, 20, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item17 = new wxStaticText( parent, ID_TEXT, _("User ID:"), wxDefaultPosition, wxDefaultSize, 0 ); + item10->Add( item17, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item18 = new wxStaticText( parent, ID_DID, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item18->SetForegroundColour( *wxBLUE ); + item10->Add( item18, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item19 = new wxStaticText( parent, ID_TEXT, _("Server IP:"), wxDefaultPosition, wxDefaultSize, 0 ); + item10->Add( item19, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item20 = new wxStaticText( parent, ID_DSIP, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item20->SetForegroundColour( *wxBLUE ); + item10->Add( item20, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + item10->Add( 20, 20, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item21 = new wxStaticText( parent, ID_TEXT, _("Server name:"), wxDefaultPosition, wxDefaultSize, 0 ); + item10->Add( item21, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item22 = new wxStaticText( parent, ID_DSNAME, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item22->SetForegroundColour( *wxBLUE ); + item10->Add( item22, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + item1->Add( item10, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticBox *item24 = new wxStaticBox( parent, -1, _("Transfers to client") ); + wxStaticBoxSizer *item23 = new wxStaticBoxSizer( item24, wxVERTICAL ); + + wxBoxSizer *item25 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer *item26 = new wxBoxSizer( wxVERTICAL ); + + wxStaticText *item27 = new wxStaticText( parent, ID_TEXT, _("Current request:"), wxDefaultPosition, wxDefaultSize, 0 ); + item26->Add( item27, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item25->Add( item26, 0, wxALIGN_CENTER, 5 ); + + wxBoxSizer *item28 = new wxBoxSizer( wxVERTICAL ); + + wxStaticText *item29 = new wxStaticText( parent, ID_DDOWNLOADING, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item29->SetForegroundColour( *wxBLUE ); + item28->Add( item29, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item25->Add( item28, 1, wxALIGN_CENTER, 5 ); + + item23->Add( item25, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 0 ); + + wxFlexGridSizer *item30 = new wxFlexGridSizer( 5, 0, 0 ); + item30->AddGrowableCol( 1 ); + item30->AddGrowableCol( 4 ); + + wxStaticText *item31 = new wxStaticText( parent, ID_TEXT, _("Average upload rate:"), wxDefaultPosition, wxDefaultSize, 0 ); + item30->Add( item31, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item32 = new wxStaticText( parent, ID_DAVDR, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item32->SetForegroundColour( *wxBLUE ); + item30->Add( item32, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + item30->Add( 20, 20, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item33 = new wxStaticText( parent, ID_TEXT, _("Average download rate:"), wxDefaultPosition, wxDefaultSize, 0 ); + item30->Add( item33, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item34 = new wxStaticText( parent, ID_DAVUR, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item34->SetForegroundColour( *wxBLUE ); + item30->Add( item34, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item35 = new wxStaticText( parent, ID_TEXT, _("Uploaded (session):"), wxDefaultPosition, wxDefaultSize, 0 ); + item30->Add( item35, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item36 = new wxStaticText( parent, ID_DDOWN, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item36->SetForegroundColour( *wxBLUE ); + item30->Add( item36, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + item30->Add( 20, 20, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item37 = new wxStaticText( parent, ID_TEXT, _("Downloaded (session):"), wxDefaultPosition, wxDefaultSize, 0 ); + item30->Add( item37, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item38 = new wxStaticText( parent, ID_DDUP, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item38->SetForegroundColour( *wxBLUE ); + item30->Add( item38, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item39 = new wxStaticText( parent, ID_TEXT, _("Uploaded (total):"), wxDefaultPosition, wxDefaultSize, 0 ); + item30->Add( item39, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item40 = new wxStaticText( parent, ID_DDOWNTOTAL, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item40->SetForegroundColour( *wxBLUE ); + item30->Add( item40, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + item30->Add( 20, 20, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item41 = new wxStaticText( parent, ID_TEXT, _("Downloaded (total):"), wxDefaultPosition, wxDefaultSize, 0 ); + item30->Add( item41, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item42 = new wxStaticText( parent, ID_DUPTOTAL, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item42->SetForegroundColour( *wxBLUE ); + item30->Add( item42, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + item23->Add( item30, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item23, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticBox *item44 = new wxStaticBox( parent, -1, _("Scores") ); + wxStaticBoxSizer *item43 = new wxStaticBoxSizer( item44, wxVERTICAL ); + + wxFlexGridSizer *item45 = new wxFlexGridSizer( 5, 0, 0 ); + item45->AddGrowableCol( 1 ); + item45->AddGrowableCol( 4 ); + + wxStaticText *item46 = new wxStaticText( parent, ID_TEXT, _("DL/UP modifier:"), wxDefaultPosition, wxDefaultSize, 0 ); + item45->Add( item46, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticText *item47 = new wxStaticText( parent, ID_DRATIO, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item47->SetForegroundColour( *wxBLUE ); + item45->Add( item47, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item45->Add( 20, 20, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item48 = new wxStaticText( parent, ID_TEXT, _("Secure ident:"), wxDefaultPosition, wxDefaultSize, 0 ); + item45->Add( item48, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticText *item49 = new wxStaticText( parent, IDC_CDIDENT, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item49->SetForegroundColour( *wxBLUE ); + item45->Add( item49, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticText *item50 = new wxStaticText( parent, ID_TEXT, _("Rating (total):"), wxDefaultPosition, wxDefaultSize, 0 ); + item45->Add( item50, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item51 = new wxStaticText( parent, ID_DRATING, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item51->SetForegroundColour( *wxBLUE ); + item45->Add( item51, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + item45->Add( 20, 20, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item52 = new wxStaticText( parent, ID_TEXT, _("Queue score:"), wxDefaultPosition, wxDefaultSize, 0 ); + item45->Add( item52, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + wxStaticText *item53 = new wxStaticText( parent, ID_DSCORE, _("N/A"), wxDefaultPosition, wxDefaultSize, 0 ); + item53->SetForegroundColour( *wxBLUE ); + item45->Add( item53, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 ); + + item43->Add( item45, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item43, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxButton *item54 = new wxButton( parent, ID_CLOSEWND, _("Close"), wxDefaultPosition, wxDefaultSize, 0 ); + item54->SetDefault(); + item0->Add( item54, 0, wxALIGN_CENTER|wxALL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *IDC_MISC_OPTIONS; +wxSizer *PreferencesGeneralTab( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleSpecial( 13 ), wxDefaultPosition, wxSize(16,16) ); + item1->Add( item2, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("General Settings"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxALIGN_CENTER|wxLEFT, 5 ); + + item0->Add( item1, 0, wxALIGN_CENTER_VERTICAL, 0 ); + + wxGridSizer *item4 = new wxGridSizer( 2, 0, 0 ); + + wxStaticBox *item6 = new wxStaticBox( parent, -1, _("Nick") ); + wxStaticBoxSizer *item5 = new wxStaticBoxSizer( item6, wxVERTICAL ); + + CMuleTextCtrl *item7 = new CMuleTextCtrl( parent, IDC_NICK, _("http://www.aMule.org - the Linux Mule"), wxDefaultPosition, wxSize(90,-1), 0 ); + item7->SetToolTip( _("This is the name that other users will see when connecting to you.") ); + item5->Add( item7, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item4->Add( item5, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxStaticBox *item9 = new wxStaticBox( parent, -1, _("Language") ); + wxStaticBoxSizer *item8 = new wxStaticBoxSizer( item9, wxVERTICAL ); + + wxString *strs10 = (wxString*) NULL; + wxChoice *item10 = new wxChoice( parent, IDC_LANGUAGE, wxDefaultPosition, wxSize(100,30), 0, strs10, 0 ); + item10->SetToolTip( _("This specifies the language used on controls.") ); + item8->Add( item10, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item4->Add( item8, 0, wxGROW|wxALIGN_CENTER_HORIZONTAL, 5 ); + + item0->Add( item4, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 0 ); + + wxStaticBox *item12 = new wxStaticBox( parent, -1, _("Misc Options") ); + wxStaticBoxSizer *item11 = new wxStaticBoxSizer( item12, wxVERTICAL ); + IDC_MISC_OPTIONS = item11; + + wxCheckBox *item13 = new wxCheckBox( parent, IDC_NEWVERSION, _("Check for new version at startup"), wxDefaultPosition, wxDefaultSize, 0 ); + item13->SetToolTip( _("Enabling this will make aMule check for new version at startup") ); + item11->Add( item13, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxCheckBox *item14 = new wxCheckBox( parent, IDC_STARTMIN, _("Start minimized"), wxDefaultPosition, wxDefaultSize, 0 ); + item14->SetToolTip( _("Enabling this makes aMule minimize itself upon start.") ); + item11->Add( item14, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxCheckBox *item15 = new wxCheckBox( parent, IDC_EXIT, _("Prompt on exit"), wxDefaultPosition, wxDefaultSize, 0 ); + item15->SetValue( TRUE ); + item15->SetToolTip( _("Makes aMule promt before exiting.") ); + item11->Add( item15, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxCheckBox *item16 = new wxCheckBox( parent, IDC_ENABLETRAYICON, _("Enable Tray Icon"), wxDefaultPosition, wxDefaultSize, 0 ); + item16->SetToolTip( _("This Enables/Disables the system tray (or taskbar) icon.") ); + item11->Add( item16, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 0 ); + + wxCheckBox *item17 = new wxCheckBox( parent, IDC_MINTRAY, _("Minimize to Tray Icon"), wxDefaultPosition, wxDefaultSize, 0 ); + item17->SetToolTip( _("Enabling this will make aMule minimize to the System Tray, rather than the taskbar.") ); + item11->Add( item17, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item18 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item19 = new wxStaticText( parent, IDC_TOOLTIPDELAY_LBL, _("Tooltip Delay Time in secs"), wxDefaultPosition, wxDefaultSize, 0 ); + item19->SetToolTip( _("The delay before showing tool-tips.") ); + item18->Add( item19, 1, wxALIGN_CENTER|wxLEFT, 5 ); + + wxSpinCtrl *item20 = new wxSpinCtrl( parent, IDC_TOOLTIPDELAY, wxT("1"), wxDefaultPosition, wxSize(40,-1), 0, 0, 30, 1 ); + item20->SetToolTip( _("The delay before showing tool-tips.") ); + item18->Add( item20, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxRIGHT, 5 ); + + item11->Add( item18, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item11, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item22 = new wxStaticBox( parent, -1, _("Browser Selection") ); + wxStaticBoxSizer *item21 = new wxStaticBoxSizer( item22, wxVERTICAL ); + + wxString strs23[] = + { + _("Konqueror"), + _("Mozilla"), + _("Firefox"), + _("Firebird"), + _("Opera"), + _("Netscape"), + _("Galeon"), + _("Epiphany"), + _("User Defined") + }; + wxChoice *item23 = new wxChoice( parent, IDC_BROWSER, wxDefaultPosition, wxSize(100,-1), 9, strs23, 0 ); + item23->SetToolTip( _("Select your browser here") ); + item21->Add( item23, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxFlexGridSizer *item24 = new wxFlexGridSizer( 3, 0, 0 ); + item24->AddGrowableCol( 1 ); + + wxStaticText *item25 = new wxStaticText( parent, ID_CUSTOMBROWSETEXT, _("Custom Browser:"), wxDefaultPosition, wxDefaultSize, 0 ); + item24->Add( item25, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + CMuleTextCtrl *item26 = new CMuleTextCtrl( parent, IDC_BROWSERSELF, wxT(""), wxDefaultPosition, wxSize(80,-1), 0 ); + item26->SetToolTip( _("Enter your browser name here. To use the custom browser, select the Custom menu-item from the dropdown-menu above.") ); + item26->Enable( false ); + item24->Add( item26, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxButton *item27 = new wxButton( parent, IDC_SELBROWSER, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + item24->Add( item27, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); + + item21->Add( item24, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxCheckBox *item28 = new wxCheckBox( parent, IDC_BROWSERTABS, _("Open in new tab if possible"), wxDefaultPosition, wxDefaultSize, 0 ); + item28->SetValue( TRUE ); + item28->SetToolTip( _("Open the web page in a new tab instead of in a new window when possible") ); + item21->Add( item28, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item21, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *PreferencesConnectionTab( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleSpecial( 14 ), wxDefaultPosition, wxSize(16,16) ); + item1->Add( item2, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("Connections"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxALIGN_CENTER|wxLEFT, 5 ); + + item0->Add( item1, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item4 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBox *item6 = new wxStaticBox( parent, -1, _("Bandwith Limits") ); + wxStaticBoxSizer *item5 = new wxStaticBoxSizer( item6, wxVERTICAL ); + + wxStaticText *item7 = new wxStaticText( parent, IDC_DLIMIT_LBL, _("Download"), wxDefaultPosition, wxDefaultSize, 0 ); + item5->Add( item7, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item8 = new wxBoxSizer( wxHORIZONTAL ); + + wxSpinCtrl *item9 = new wxSpinCtrl( parent, IDC_MAXDOWN, wxT("0"), wxDefaultPosition, wxSize(100,-1), 0, 0, 19375, 0 ); + item8->Add( item9, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item10 = new wxStaticText( parent, IDC_KBS1, _("kB/s"), wxDefaultPosition, wxDefaultSize, 0 ); + item8->Add( item10, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + item5->Add( item8, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item11 = new wxStaticText( parent, IDC_ULIMIT_LBL, _("Upload"), wxDefaultPosition, wxDefaultSize, 0 ); + item5->Add( item11, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item12 = new wxBoxSizer( wxHORIZONTAL ); + + wxSpinCtrl *item13 = new wxSpinCtrl( parent, IDC_MAXUP, wxT("10"), wxDefaultPosition, wxSize(100,-1), 0, 0, 19375, 10 ); + item12->Add( item13, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item14 = new wxStaticText( parent, IDC_KBS4, _("kB/s"), wxDefaultPosition, wxDefaultSize, 0 ); + item12->Add( item14, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + item5->Add( item12, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item15 = new wxStaticText( parent, ID_TEXT, _("Slot Allocation"), wxDefaultPosition, wxDefaultSize, 0 ); + item5->Add( item15, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item16 = new wxBoxSizer( wxHORIZONTAL ); + + wxSpinCtrl *item17 = new wxSpinCtrl( parent, IDC_SLOTALLOC, wxT("4"), wxDefaultPosition, wxSize(100,-1), 0, 1, 100, 4 ); + item16->Add( item17, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item18 = new wxStaticText( parent, ID_TEXT, _("kB/s"), wxDefaultPosition, wxDefaultSize, 0 ); + item16->Add( item18, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + item5->Add( item16, 0, wxALIGN_CENTER, 5 ); + + item4->Add( item5, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL, 0 ); + + wxStaticBox *item20 = new wxStaticBox( parent, -1, _("Line Capacities") ); + wxStaticBoxSizer *item19 = new wxStaticBoxSizer( item20, wxVERTICAL ); + + wxStaticText *item21 = new wxStaticText( parent, IDC_DCAP_LBL, _("Download"), wxDefaultPosition, wxDefaultSize, 0 ); + item19->Add( item21, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item22 = new wxBoxSizer( wxHORIZONTAL ); + + wxSpinCtrl *item23 = new wxSpinCtrl( parent, IDC_DOWNLOAD_CAP, wxT("3"), wxDefaultPosition, wxSize(100,-1), 0, 3, 19375, 3 ); + item22->Add( item23, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item24 = new wxStaticText( parent, IDC_KBS2, _("kB/s"), wxDefaultPosition, wxDefaultSize, 0 ); + item22->Add( item24, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + item19->Add( item22, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item25 = new wxStaticText( parent, IDC_UCAP_LBL, _("Upload"), wxDefaultPosition, wxDefaultSize, 0 ); + item19->Add( item25, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item26 = new wxBoxSizer( wxHORIZONTAL ); + + wxSpinCtrl *item27 = new wxSpinCtrl( parent, IDC_UPLOAD_CAP, wxT("3"), wxDefaultPosition, wxSize(100,-1), 0, 3, 19375, 3 ); + item26->Add( item27, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item28 = new wxStaticText( parent, IDC_KBS3, _("kB/s"), wxDefaultPosition, wxDefaultSize, 0 ); + item26->Add( item28, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + item19->Add( item26, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item29 = new wxStaticText( parent, ID_TEXT, + _("Note: These values are\nonly used for statistics."), + wxDefaultPosition, wxDefaultSize, 0 ); + item19->Add( item29, 0, wxALIGN_CENTER|wxALL, 5 ); + + item4->Add( item19, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL, 0 ); + + item0->Add( item4, 0, wxADJUST_MINSIZE|wxGROW, 5 ); + + wxBoxSizer *item30 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBox *item32 = new wxStaticBox( parent, -1, _("Standard client TCP Port:") ); + wxStaticBoxSizer *item31 = new wxStaticBoxSizer( item32, wxVERTICAL ); + + wxSpinCtrl *item33 = new wxSpinCtrl( parent, IDC_PORT, wxT("4662"), wxDefaultPosition, wxSize(100,-1), 0, 0, 65531, 4662 ); + item33->SetToolTip( _("This is the standard ED2K port and cannot be disabled.") ); + item31->Add( item33, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + item30->Add( item31, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxStaticBox *item35 = new wxStaticBox( parent, -1, _("Extended client UDP Port:") ); + wxStaticBoxSizer *item34 = new wxStaticBoxSizer( item35, wxHORIZONTAL ); + + wxSpinCtrl *item36 = new wxSpinCtrl( parent, IDC_UDPPORT, wxT("4672"), wxDefaultPosition, wxSize(100,-1), 0, 0, 65535, 4672 ); + item36->SetToolTip( _("This UDP port is used for extended Ed2K requests and Kad network") ); + item34->Add( item36, 0, wxALIGN_CENTER, 5 ); + + wxCheckBox *item37 = new wxCheckBox( parent, IDC_UDPDISABLE, _("disable"), wxDefaultPosition, wxDefaultSize, 0 ); + item34->Add( item37, 0, wxADJUST_MINSIZE|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + item30->Add( item34, 1, wxGROW|wxALIGN_RIGHT, 5 ); + + item0->Add( item30, 0, wxADJUST_MINSIZE|wxGROW, 0 ); + + wxStaticBox *item39 = new wxStaticBox( parent, -1, _("Bind Address") ); + wxStaticBoxSizer *item38 = new wxStaticBoxSizer( item39, wxVERTICAL ); + + wxTextCtrl *item40 = new wxTextCtrl( parent, IDC_ADDRESS, wxT(""), wxDefaultPosition, wxSize(80,-1), 0 ); + item38->Add( item40, 0, wxGROW|wxALIGN_CENTER_HORIZONTAL, 5 ); + + item0->Add( item38, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item42 = new wxStaticBox( parent, -1, wxT("") ); + wxStaticBoxSizer *item41 = new wxStaticBoxSizer( item42, wxVERTICAL ); + + wxStaticText *item43 = new wxStaticText( parent, ID_TEXT_CLIENT_UDP_PORT, _("UDP port for extended server requests (TCP+3): 4665"), wxDefaultPosition, wxDefaultSize, 0 ); + item41->Add( item43, 0, wxALIGN_CENTER, 5 ); + + item0->Add( item41, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item44 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBox *item46 = new wxStaticBox( parent, -1, _("Max Sources per File") ); + wxStaticBoxSizer *item45 = new wxStaticBoxSizer( item46, wxVERTICAL ); + + wxBoxSizer *item47 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer *item48 = new wxBoxSizer( wxVERTICAL ); + + wxStaticText *item49 = new wxStaticText( parent, IDC_MAXSRCHARD_LBL, _("Hard Limit"), wxDefaultPosition, wxDefaultSize, 0 ); + item48->Add( item49, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxSpinCtrl *item50 = new wxSpinCtrl( parent, IDC_MAXSOURCEPERFILE, wxT("300"), wxDefaultPosition, wxSize(100,-1), 0, 40, 5000, 300 ); + item48->Add( item50, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + item47->Add( item48, 0, wxALIGN_CENTER, 5 ); + + item45->Add( item47, 0, wxALIGN_CENTER, 0 ); + + item44->Add( item45, 1, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item52 = new wxStaticBox( parent, -1, _("Connection Limits") ); + wxStaticBoxSizer *item51 = new wxStaticBoxSizer( item52, wxVERTICAL ); + + wxBoxSizer *item53 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer *item54 = new wxBoxSizer( wxVERTICAL ); + + wxStaticText *item55 = new wxStaticText( parent, IDC_MAXCONLABEL, _("Max Connections"), wxDefaultPosition, wxDefaultSize, 0 ); + item54->Add( item55, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxSpinCtrl *item56 = new wxSpinCtrl( parent, IDC_MAXCON, wxT("500"), wxDefaultPosition, wxSize(100,-1), 0, 5, 7500, 500 ); + item54->Add( item56, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + item53->Add( item54, 0, wxALIGN_CENTER, 5 ); + + item51->Add( item53, 0, wxALIGN_CENTER, 5 ); + + item44->Add( item51, 1, wxADJUST_MINSIZE|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item44, 0, wxADJUST_MINSIZE|wxGROW, 5 ); + + wxStaticBox *item58 = new wxStaticBox( parent, -1, _("Networks") ); + wxStaticBoxSizer *item57 = new wxStaticBoxSizer( item58, wxVERTICAL ); + + wxFlexGridSizer *item59 = new wxFlexGridSizer( 1, 0, 0, 0 ); + item59->AddGrowableCol( 0 ); + item59->AddGrowableCol( 1 ); + item59->AddGrowableCol( 2 ); + item59->AddGrowableCol( 3 ); + item59->AddGrowableCol( 4 ); + item59->AddGrowableCol( 5 ); + item59->AddGrowableCol( 6 ); + + wxCheckBox *item60 = new wxCheckBox( parent, IDC_NETWORKED2K, _("ED2K"), wxDefaultPosition, wxDefaultSize, 0 ); + item60->SetValue( TRUE ); + item59->Add( item60, 0, wxALIGN_CENTER|wxLEFT, 40 ); + + wxStaticLine *item61 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(-1,20), wxLI_VERTICAL ); + item59->Add( item61, 0, wxALIGN_CENTER|wxTOP|wxBOTTOM, 5 ); + + wxCheckBox *item62 = new wxCheckBox( parent, IDC_NETWORKKAD, _("Kademlia"), wxDefaultPosition, wxDefaultSize, 0 ); + item62->SetValue( TRUE ); + item59->Add( item62, 0, wxALIGN_CENTER|wxRIGHT, 15 ); + + item57->Add( item59, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item57, 0, wxADJUST_MINSIZE|wxGROW, 5 ); + + wxStaticBox *item64 = new wxStaticBox( parent, -1, _("Universal Plug and Play") ); + wxStaticBoxSizer *item63 = new wxStaticBoxSizer( item64, wxHORIZONTAL ); + + wxCheckBox *item65 = new wxCheckBox( parent, IDC_UPNP_ENABLED, _("Enable UPnP"), wxDefaultPosition, wxDefaultSize, 0 ); + item63->Add( item65, 0, wxALIGN_CENTER, 5 ); + + item63->Add( 20, 20, 2, wxADJUST_MINSIZE|wxALIGN_CENTER, 5 ); + + wxStaticText *item66 = new wxStaticText( parent, ID_TEXT, _("UPnP TCP Port:"), wxDefaultPosition, wxDefaultSize, 0 ); + item63->Add( item66, 0, wxALIGN_CENTER, 5 ); + + wxSpinCtrl *item67 = new wxSpinCtrl( parent, IDC_UPNPTCPPORT, wxT("50000"), wxDefaultPosition, wxSize(100,-1), 0, 0, 65535, 50000 ); + item63->Add( item67, 0, wxALIGN_CENTER, 5 ); + + item0->Add( item63, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item69 = new wxStaticBox( parent, -1, wxT("") ); + wxStaticBoxSizer *item68 = new wxStaticBoxSizer( item69, wxVERTICAL ); + + wxCheckBox *item70 = new wxCheckBox( parent, IDC_AUTOCONNECT, _("Autoconnect on startup"), wxDefaultPosition, wxDefaultSize, 0 ); + item68->Add( item70, 0, wxALIGN_CENTER_VERTICAL, 10 ); + + wxCheckBox *item71 = new wxCheckBox( parent, IDC_RECONN, _("Reconnect on loss"), wxDefaultPosition, wxDefaultSize, 0 ); + item71->SetValue( TRUE ); + item68->Add( item71, 0, wxALIGN_CENTER_VERTICAL, 10 ); + + wxCheckBox *item72 = new wxCheckBox( parent, IDC_SHOWOVERHEAD, _("Show overhead bandwith"), wxDefaultPosition, wxDefaultSize, 0 ); + item72->SetValue( TRUE ); + item68->Add( item72, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item68, 0, wxADJUST_MINSIZE|wxGROW, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *PreferencesServerTab( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleSpecial( 15 ), wxDefaultPosition, wxSize(16,16) ); + item1->Add( item2, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("Servers"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxALIGN_CENTER|wxLEFT, 5 ); + + item0->Add( item1, 0, wxALIGN_CENTER_VERTICAL, 0 ); + + wxStaticBox *item5 = new wxStaticBox( parent, -1, _("Server Options") ); + wxStaticBoxSizer *item4 = new wxStaticBoxSizer( item5, wxVERTICAL ); + + wxBoxSizer *item6 = new wxBoxSizer( wxHORIZONTAL ); + + wxCheckBox *item7 = new wxCheckBox( parent, IDC_REMOVEDEAD, _("Remove dead server after"), wxDefaultPosition, wxDefaultSize, 0 ); + item6->Add( item7, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxRIGHT, 5 ); + + wxSpinCtrl *item8 = new wxSpinCtrl( parent, IDC_SERVERRETRIES, wxT("2"), wxDefaultPosition, wxSize(40,-1), 0, 1, 10, 2 ); + item6->Add( item8, 0, wxADJUST_MINSIZE|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item9 = new wxStaticText( parent, IDC_RETRIES_LBL, _("retries"), wxDefaultPosition, wxDefaultSize, 0 ); + item6->Add( item9, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + item4->Add( item6, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item10 = new wxBoxSizer( wxHORIZONTAL ); + + wxCheckBox *item11 = new wxCheckBox( parent, IDC_AUTOSERVER, _("Auto-update serverlist at startup"), wxDefaultPosition, wxDefaultSize, 0 ); + item10->Add( item11, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxButton *item12 = new wxButton( parent, IDC_EDITADR, _("List"), wxDefaultPosition, wxDefaultSize, 0 ); + item10->Add( item12, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + item4->Add( item10, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxCheckBox *item13 = new wxCheckBox( parent, IDC_UPDATESERVERCONNECT, _("Update serverlist when connecting to a server"), wxDefaultPosition, wxDefaultSize, 0 ); + item4->Add( item13, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxCheckBox *item14 = new wxCheckBox( parent, IDC_UPDATESERVERCLIENT, _("Update serverlist when a client connect"), wxDefaultPosition, wxDefaultSize, 0 ); + item4->Add( item14, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxCheckBox *item15 = new wxCheckBox( parent, IDC_SCORE, _("Use priority system"), wxDefaultPosition, wxDefaultSize, 0 ); + item15->SetValue( TRUE ); + item4->Add( item15, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxCheckBox *item16 = new wxCheckBox( parent, IDC_SMARTIDCHECK, _("Use smart LowID check on connect"), wxDefaultPosition, wxDefaultSize, 0 ); + item16->SetValue( TRUE ); + item4->Add( item16, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxCheckBox *item17 = new wxCheckBox( parent, IDC_SAFESERVERCONNECT, _("Safe connect"), wxDefaultPosition, wxDefaultSize, 0 ); + item17->SetValue( TRUE ); + item4->Add( item17, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxCheckBox *item18 = new wxCheckBox( parent, IDC_AUTOCONNECTSTATICONLY, _("Autoconnect to servers in static list only"), wxDefaultPosition, wxDefaultSize, 0 ); + item4->Add( item18, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxCheckBox *item19 = new wxCheckBox( parent, IDC_MANUALSERVERHIGHPRIO, _("Set manually added servers to High Priority"), wxDefaultPosition, wxDefaultSize, 0 ); + item19->SetValue( TRUE ); + item4->Add( item19, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item4, 0, wxADJUST_MINSIZE|wxGROW, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *PreferencesFilesTab( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleSpecial( 16 ), wxDefaultPosition, wxSize(16,16) ); + item1->Add( item2, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("Files"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxALIGN_CENTER|wxLEFT, 5 ); + + item0->Add( item1, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item5 = new wxStaticBox( parent, -1, _("Intelligent Corruption Handling") ); + wxStaticBoxSizer *item4 = new wxStaticBoxSizer( item5, wxVERTICAL ); + + wxCheckBox *item6 = new wxCheckBox( parent, IDC_ICH, _("I.C.H. active"), wxDefaultPosition, wxSize(160,-1), 0 ); + item6->SetValue( TRUE ); + item4->Add( item6, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + wxCheckBox *item7 = new wxCheckBox( parent, IDC_AICHTRUST, _("AICH trusts every hash (not recomended)"), wxDefaultPosition, wxDefaultSize, 0 ); + item4->Add( item7, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item4, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item9 = new wxStaticBox( parent, -1, wxT("") ); + wxStaticBoxSizer *item8 = new wxStaticBoxSizer( item9, wxVERTICAL ); + + wxCheckBox *item10 = new wxCheckBox( parent, IDC_ADDNEWFILESPAUSED, _("Add files to download in pause mode"), wxDefaultPosition, wxDefaultSize, 0 ); + item8->Add( item10, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + wxCheckBox *item11 = new wxCheckBox( parent, IDC_DAP, _("Add files to download with auto priority"), wxDefaultPosition, wxDefaultSize, 0 ); + item8->Add( item11, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxCheckBox *item12 = new wxCheckBox( parent, IDC_PREVIEWPRIO, _("Try to download first and last chunks first"), wxDefaultPosition, wxDefaultSize, 0 ); + item12->SetValue( TRUE ); + item8->Add( item12, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + wxCheckBox *item13 = new wxCheckBox( parent, IDC_UAP, _("Add new shared files with auto priority"), wxDefaultPosition, wxDefaultSize, 0 ); + item8->Add( item13, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + wxCheckBox *item14 = new wxCheckBox( parent, IDC_FULLCHUNKTRANS, _("Try to transfer full chunks to all uploads"), wxDefaultPosition, wxDefaultSize, 0 ); + item14->SetValue( TRUE ); + item8->Add( item14, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + wxCheckBox *item15 = new wxCheckBox( parent, IDC_STARTNEXTFILE, _("Start next paused file when a file completed"), wxDefaultPosition, wxDefaultSize, 0 ); + item15->SetValue( TRUE ); + item8->Add( item15, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + wxCheckBox *item16 = new wxCheckBox( parent, IDC_STARTNEXTFILE_SAME, _("From the same category"), wxDefaultPosition, wxDefaultSize, 0 ); + item8->Add( item16, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 20 ); + + wxCheckBox *item17 = new wxCheckBox( parent, IDC_SRCSEEDS, _("Save 10 sources on rare files (< 20 sources)"), wxDefaultPosition, wxDefaultSize, 0 ); + item17->SetValue( TRUE ); + item8->Add( item17, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 0 ); + + item0->Add( item8, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item19 = new wxStaticBox( parent, -1, _("Disk Space") ); + wxStaticBoxSizer *item18 = new wxStaticBoxSizer( item19, wxVERTICAL ); + + wxCheckBox *item20 = new wxCheckBox( parent, IDC_CHECKDISKSPACE, _("Check Disk Space"), wxDefaultPosition, wxDefaultSize, 0 ); + item20->SetToolTip( _("Select this if you want aMule to check your Disk Space") ); + item18->Add( item20, 0, wxALIGN_CENTER_VERTICAL, 0 ); + + wxBoxSizer *item21 = new wxBoxSizer( wxHORIZONTAL ); + + item21->Add( 20, 20, 0, wxALIGN_CENTER|wxALL, 0 ); + + wxStaticText *item22 = new wxStaticText( parent, ID_MINDISKTEXT, _("Min Disk Space:"), wxDefaultPosition, wxDefaultSize, 0 ); + item21->Add( item22, 0, wxALIGN_CENTER|wxRIGHT, 5 ); + + wxSpinCtrl *item23 = new wxSpinCtrl( parent, IDC_MINDISKSPACE, wxT("1"), wxDefaultPosition, wxSize(100,-1), 0, 1, 1000000, 1 ); + item23->SetToolTip( _("Enter here the min disk space desired.") ); + item21->Add( item23, 0, wxALIGN_CENTER_VERTICAL, 0 ); + + wxStaticText *item24 = new wxStaticText( parent, ID_TEXT, _("Mb"), wxDefaultPosition, wxDefaultSize, 0 ); + item21->Add( item24, 0, wxALIGN_CENTER|wxLEFT, 5 ); + + item18->Add( item21, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 0 ); + + item0->Add( item18, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *PreferencesDirectoriesTab( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleSpecial( 17 ), wxDefaultPosition, wxSize(16,16) ); + item1->Add( item2, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("Directories"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxALIGN_CENTER|wxLEFT, 5 ); + + item0->Add( item1, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item5 = new wxStaticBox( parent, -1, _("Incoming Directory :") ); + wxStaticBoxSizer *item4 = new wxStaticBoxSizer( item5, wxHORIZONTAL ); + + CMuleTextCtrl *item6 = new CMuleTextCtrl( parent, IDC_INCFILES, wxT(""), wxDefaultPosition, wxSize(80,-1), 0 ); + item4->Add( item6, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxButton *item7 = new wxButton( parent, IDC_SELINCDIR, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + item4->Add( item7, 0, wxGROW|wxALIGN_CENTER_HORIZONTAL, 5 ); + + item0->Add( item4, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item9 = new wxStaticBox( parent, -1, _("Temporary Directory :") ); + wxStaticBoxSizer *item8 = new wxStaticBoxSizer( item9, wxHORIZONTAL ); + + CMuleTextCtrl *item10 = new CMuleTextCtrl( parent, IDC_TEMPFILES, wxT(""), wxDefaultPosition, wxSize(80,-1), 0 ); + item8->Add( item10, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxButton *item11 = new wxButton( parent, IDC_SELTEMPDIR, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + item8->Add( item11, 0, wxGROW|wxALIGN_CENTER_HORIZONTAL, 5 ); + + item0->Add( item8, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item13 = new wxStaticBox( parent, -1, _("Shared Directories") ); + wxStaticBoxSizer *item12 = new wxStaticBoxSizer( item13, wxVERTICAL ); + + wxStaticText *item14 = new wxStaticText( parent, ID_TEXT, _("(Right click on folder icon for recursive share)"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE ); + item12->Add( item14, 0, wxALIGN_CENTER, 5 ); + + CDirectoryTreeCtrl *item15 = new CDirectoryTreeCtrl(parent, IDC_SHARESELECTOR,wxPoint(0,0), wxSize(100, 100),wxSUNKEN_BORDER|wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT ); + wxASSERT( item15 ); + item12->Add( item15, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxCheckBox *item16 = new wxCheckBox( parent, IDC_SHAREHIDDENFILES, _("Share hidden files"), wxDefaultPosition, wxDefaultSize, 0 ); + item16->SetValue( TRUE ); + item12->Add( item16, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item12, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item18 = new wxStaticBox( parent, -1, _("Video Player") ); + wxStaticBoxSizer *item17 = new wxStaticBoxSizer( item18, wxVERTICAL ); + + wxBoxSizer *item19 = new wxBoxSizer( wxHORIZONTAL ); + + CMuleTextCtrl *item20 = new CMuleTextCtrl( parent, IDC_VIDEOPLAYER, wxT("mplayer -idx"), wxDefaultPosition, wxSize(80,-1), 0 ); + item19->Add( item20, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxButton *item21 = new wxButton( parent, IDC_BROWSEV, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + item19->Add( item21, 0, wxGROW|wxALIGN_CENTER_HORIZONTAL, 5 ); + + item17->Add( item19, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxCheckBox *item22 = new wxCheckBox( parent, IDC_VIDEOBACKUP, _("Create Backup to preview"), wxDefaultPosition, wxDefaultSize, 0 ); + item17->Add( item22, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item17, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *PreferencesStatisticsTab( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleSpecial( 10 ), wxDefaultPosition, wxSize(16,16) ); + item1->Add( item2, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("Statistics"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxALIGN_CENTER|wxLEFT, 5 ); + + item0->Add( item1, 0, wxALIGN_CENTER_VERTICAL|wxALL, 0 ); + + wxStaticBox *item5 = new wxStaticBox( parent, -1, _("Graphs") ); + wxStaticBoxSizer *item4 = new wxStaticBoxSizer( item5, wxVERTICAL ); + + wxStaticText *item6 = new wxStaticText( parent, IDC_SLIDERINFO, _("Update delay : 5 secs"), wxDefaultPosition, wxDefaultSize, 0 ); + item4->Add( item6, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxTOP, 5 ); + + wxSlider *item7 = new wxSlider( parent, IDC_SLIDER, 5, 0, 120, wxDefaultPosition, wxSize(100,-1), wxSL_HORIZONTAL ); + item4->Add( item7, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item8 = new wxStaticText( parent, IDC_SLIDERINFO3, _("Time for average graph: 100 mins"), wxDefaultPosition, wxDefaultSize, 0 ); + item4->Add( item8, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxTOP, 5 ); + + wxSlider *item9 = new wxSlider( parent, IDC_SLIDER3, 100, 5, 100, wxDefaultPosition, wxSize(100,-1), wxSL_HORIZONTAL ); + item4->Add( item9, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item10 = new wxStaticText( parent, IDC_SLIDERINFO4, _("Connections Graph Scale: 100 "), wxDefaultPosition, wxDefaultSize, 0 ); + item4->Add( item10, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxTOP, 5 ); + + wxSlider *item11 = new wxSlider( parent, IDC_SLIDER4, 100, 2, 200, wxDefaultPosition, wxSize(100,-1), wxSL_HORIZONTAL ); + item4->Add( item11, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item12 = new wxStaticText( parent, IDC_PREFCOLORS, _("Select Statistics Colors"), wxDefaultPosition, wxDefaultSize, 0 ); + item4->Add( item12, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxTOP, 5 ); + + wxBoxSizer *item13 = new wxBoxSizer( wxHORIZONTAL ); + + wxString strs14[] = + { + _("Background"), + _("Grid"), + _("Download current"), + _("Download running average"), + _("Download session average"), + _("Upload current"), + _("Upload running average"), + _("Upload session average"), + _("Active connections"), + _("Active downloads"), + _("Active uploads"), + _("Systray Icon Speedbar"), + _("Kad-nodes current"), + _("Kad-nodes running"), + _("Kad-nodes session") + }; + wxChoice *item14 = new wxChoice( parent, IDC_COLORSELECTOR, wxDefaultPosition, wxDefaultSize, 15, strs14, 0 ); + item13->Add( item14, 0, wxGROW|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); + + wxButton *item15 = new wxButton( parent, IDC_COLOR_BUTTON, _("Select"), wxDefaultPosition, wxDefaultSize, 0 ); + item13->Add( item15, 0, wxGROW|wxLEFT, 5 ); + + item4->Add( item13, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item4, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item17 = new wxStaticBox( parent, -1, _("Statistics Tree") ); + wxStaticBoxSizer *item16 = new wxStaticBoxSizer( item17, wxVERTICAL ); + + wxStaticText *item18 = new wxStaticText( parent, IDC_SLIDERINFO2, _("Update delay : 5 secs"), wxDefaultPosition, wxDefaultSize, 0 ); + item16->Add( item18, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxSlider *item19 = new wxSlider( parent, IDC_SLIDER2, 5, 5, 100, wxDefaultPosition, wxSize(100,-1), wxSL_HORIZONTAL ); + item16->Add( item19, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item20 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item21 = new wxStaticText( parent, -1, _("Number of Client Versions shown (0=unlimited)"), wxDefaultPosition, wxDefaultSize, 0 ); + item20->Add( item21, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxSpinCtrl *item22 = new wxSpinCtrl( parent, IDC_CLIENTVERSIONS, wxT("0"), wxDefaultPosition, wxDefaultSize, 0, 0, 255, 0 ); + item20->Add( item22, 0, wxALIGN_CENTER|wxALL, 5 ); + + item16->Add( item20, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item16, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *PreferencesNotifyTab( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleSpecial( 18 ), wxDefaultPosition, wxSize(16,16) ); + item1->Add( item2, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("Notifications"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxALIGN_CENTER|wxLEFT, 5 ); + + item0->Add( item1, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item5 = new wxStaticBox( parent, -1, _("Messages popup") ); + wxStaticBoxSizer *item4 = new wxStaticBoxSizer( item5, wxVERTICAL ); + + wxCheckBox *item6 = new wxCheckBox( parent, IDC_CB_TBN_USESOUND, _("Use sound"), wxDefaultPosition, wxDefaultSize, 0 ); + item6->Enable( false ); + item4->Add( item6, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item7 = new wxBoxSizer( wxHORIZONTAL ); + + CMuleTextCtrl *item8 = new CMuleTextCtrl( parent, IDC_EDIT_TBN_WAVFILE, wxT(""), wxDefaultPosition, wxSize(80,-1), 0 ); + item8->Enable( false ); + item7->Add( item8, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxButton *item9 = new wxButton( parent, IDC_BTN_BROWSE_WAV, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + item9->Enable( false ); + item7->Add( item9, 0, wxALIGN_CENTER, 5 ); + + item4->Add( item7, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item10 = new wxBoxSizer( wxVERTICAL ); + + wxStaticText *item11 = new wxStaticText( parent, ID_TEXT, _("Pop out when :"), wxDefaultPosition, wxDefaultSize, 0 ); + item10->Add( item11, 0, wxALIGN_CENTER_VERTICAL|wxTOP, 5 ); + + wxCheckBox *item12 = new wxCheckBox( parent, IDC_CB_TBN_ONLOG, _("New entry on log"), wxDefaultPosition, wxDefaultSize, 0 ); + item12->Enable( false ); + item10->Add( item12, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxCheckBox *item13 = new wxCheckBox( parent, IDC_CB_TBN_ONCHAT, _("Starts a new chat session"), wxDefaultPosition, wxDefaultSize, 0 ); + item13->Enable( false ); + item10->Add( item13, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxCheckBox *item14 = new wxCheckBox( parent, IDC_CB_TBN_POP_ALWAYS, _("A new chat message is received"), wxDefaultPosition, wxDefaultSize, 0 ); + item14->Enable( false ); + item10->Add( item14, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxCheckBox *item15 = new wxCheckBox( parent, IDC_CB_TBN_ONDOWNLOAD, _("A download is added or finished"), wxDefaultPosition, wxDefaultSize, 0 ); + item15->Enable( false ); + item10->Add( item15, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxCheckBox *item16 = new wxCheckBox( parent, IDC_CB_TBN_ONNEWVERSION, _("New aMule version detected"), wxDefaultPosition, wxDefaultSize, 0 ); + item16->Enable( false ); + item10->Add( item16, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxCheckBox *item17 = new wxCheckBox( parent, IDC_CB_TBN_IMPORTATNT, _("Urgent OOD, serverconnection lost"), wxDefaultPosition, wxDefaultSize, 0 ); + item17->SetForegroundColour( *wxRED ); + item17->Enable( false ); + item10->Add( item17, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + item4->Add( item10, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item4, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item19 = new wxStaticBox( parent, -1, _("Notify by Mail") ); + wxStaticBoxSizer *item18 = new wxStaticBoxSizer( item19, wxVERTICAL ); + + wxCheckBox *item20 = new wxCheckBox( parent, IDC_SENDMAIL, _("Send an Email when transfer complete."), wxDefaultPosition, wxDefaultSize, 0 ); + item20->Enable( false ); + item18->Add( item20, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxFlexGridSizer *item21 = new wxFlexGridSizer( 2, 0, 0 ); + item21->AddGrowableCol( 1 ); + + wxStaticText *item22 = new wxStaticText( parent, ID_TEXT, _("SMTP server :"), wxDefaultPosition, wxDefaultSize, 0 ); + item21->Add( item22, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + CMuleTextCtrl *item23 = new CMuleTextCtrl( parent, IDC_SMTP, wxT(""), wxDefaultPosition, wxDefaultSize, wxVSCROLL ); + item23->Enable( false ); + item21->Add( item23, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item24 = new wxStaticText( parent, ID_TEXT, _("Email Address :"), wxDefaultPosition, wxDefaultSize, 0 ); + item21->Add( item24, 0, wxALIGN_CENTER|wxRIGHT, 5 ); + + CMuleTextCtrl *item25 = new CMuleTextCtrl( parent, IDC_EMAIL, wxT(""), wxDefaultPosition, wxSize(80,-1), 0 ); + item25->Enable( false ); + item21->Add( item25, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL, 5 ); + + item18->Add( item21, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item18, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *PreferencesaMuleTweaksTab( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxFlexGridSizer *item0 = new wxFlexGridSizer( 1, 0, 0 ); + item0->AddGrowableCol( 0 ); + item0->AddGrowableRow( 1 ); + + wxFlexGridSizer *item1 = new wxFlexGridSizer( 2, 0, 0 ); + item1->AddGrowableCol( 1 ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleSpecial( 12 ), wxDefaultPosition, wxDefaultSize ); + item1->Add( item2, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("Core Tweaks"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item4 = new wxBoxSizer( wxVERTICAL ); + + wxStaticText *item5 = new wxStaticText( parent, IDC_WARNING, _("!!! WARNING !!!"), wxDefaultPosition, wxDefaultSize, 0 ); + item5->SetForegroundColour( *wxRED ); + item5->SetFont( wxFont( 24, wxROMAN, wxNORMAL, wxNORMAL ) ); + item4->Add( item5, 0, wxADJUST_MINSIZE|wxALIGN_CENTER, 5 ); + + wxStaticText *item6 = new wxStaticText( parent, IDC_STATIC, + _("Do not change these setting unless you know\nwhat you are doing, otherwise you can easily\nmake things worse for yourself.\n\naMule will run fine without adjusting any of\nthese settings."), + wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE ); + item6->SetForegroundColour( *wxRED ); + item4->Add( item6, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + item0->Add( item4, 0, wxALIGN_CENTER, 0 ); + + wxStaticBox *item8 = new wxStaticBox( parent, -1, _("Advanced Settings") ); + wxStaticBoxSizer *item7 = new wxStaticBoxSizer( item8, wxVERTICAL ); + + wxStaticText *item9 = new wxStaticText( parent, IDC_MAXCON5SECLABEL, _("Max new connections / 5 secs"), wxDefaultPosition, wxDefaultSize, 0 ); + item7->Add( item9, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxTOP, 5 ); + + wxSpinCtrl *item10 = new wxSpinCtrl( parent, IDC_MAXCON5SEC, wxT("20"), wxDefaultPosition, wxSize(100,-1), 0, 5, 500, 20 ); + item7->Add( item10, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item11 = new wxStaticText( parent, IDC_FILEBUFFERSIZE_STATIC, _("File Buffer Size: 240000 bytes"), wxDefaultPosition, wxDefaultSize, 0 ); + item7->Add( item11, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxTOP, 5 ); + + wxSlider *item12 = new wxSlider( parent, IDC_FILEBUFFERSIZE, 16, 1, 100, wxDefaultPosition, wxSize(100,-1), wxSL_HORIZONTAL ); + item7->Add( item12, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item13 = new wxStaticText( parent, IDC_QUEUESIZE_STATIC, _("Upload Queue Size: 5000 clients"), wxDefaultPosition, wxDefaultSize, 0 ); + item7->Add( item13, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxTOP, 5 ); + + wxSlider *item14 = new wxSlider( parent, IDC_QUEUESIZE, 15, 5, 100, wxDefaultPosition, wxSize(100,-1), wxSL_HORIZONTAL ); + item7->Add( item14, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item15 = new wxStaticText( parent, IDC_SERVERKEEPALIVE_LABEL, _("Server connection refresh interval: Disable"), wxDefaultPosition, wxDefaultSize, 0 ); + item7->Add( item15, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxTOP, 5 ); + + wxSlider *item16 = new wxSlider( parent, IDC_SERVERKEEPALIVE, 0, 0, 30, wxDefaultPosition, wxSize(100,-1), wxSL_HORIZONTAL ); + item7->Add( item16, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item7, 0, wxGROW, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *PreferencesGuiTweaksTab( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxFlexGridSizer *item1 = new wxFlexGridSizer( 2, 0, 0 ); + item1->AddGrowableCol( 1 ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleSpecial( 19 ), wxDefaultPosition, wxSize(16,16) ); + item1->Add( item2, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("GUI Tweaks"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item5 = new wxStaticBox( parent, -1, _("Download Queue Files Progress") ); + wxStaticBoxSizer *item4 = new wxStaticBoxSizer( item5, wxVERTICAL ); + + wxCheckBox *item6 = new wxCheckBox( parent, IDC_PERCENT, _("Show percentage"), wxDefaultPosition, wxDefaultSize, 0 ); + item6->SetValue( TRUE ); + item4->Add( item6, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 0 ); + + wxCheckBox *item7 = new wxCheckBox( parent, IDC_PROGBAR, _("Show progressbar "), wxDefaultPosition, wxDefaultSize, 0 ); + item7->SetValue( TRUE ); + item4->Add( item7, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 0 ); + + wxFlexGridSizer *item8 = new wxFlexGridSizer( 2, 0, 0 ); + + wxStaticText *item9 = new wxStaticText( parent, IDC_3DDEP, _("Progressbar Style"), wxDefaultPosition, wxDefaultSize, 0 ); + item8->Add( item9, 1, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + wxBoxSizer *item10 = new wxBoxSizer( wxVERTICAL ); + + wxSlider *item11 = new wxSlider( parent, IDC_3DDEPTH, 5, 0, 5, wxDefaultPosition, wxSize(200,-1), wxSL_HORIZONTAL ); + item10->Add( item11, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxGridSizer *item12 = new wxGridSizer( 1, 0, 0, 0 ); + + wxStaticText *item13 = new wxStaticText( parent, IDC_FLAT, _("Flat"), wxDefaultPosition, wxDefaultSize, 0 ); + item12->Add( item13, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxStaticText *item14 = new wxStaticText( parent, IDC_ROUND, _("Round"), wxDefaultPosition, wxDefaultSize, 0 ); + item12->Add( item14, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + item10->Add( item12, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item8->Add( item10, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL, 5 ); + + item4->Add( item8, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item4, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item16 = new wxStaticBox( parent, -1, _("Skin Support") ); + wxStaticBoxSizer *item15 = new wxStaticBoxSizer( item16, wxHORIZONTAL ); + + wxCheckBox *item17 = new wxCheckBox( parent, IDC_USESKINFILES, _("Enable skin support "), wxDefaultPosition, wxDefaultSize, 0 ); + item15->Add( item17, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 0 ); + + wxStaticBox *item19 = new wxStaticBox( parent, -1, _("Skin:") ); + wxStaticBoxSizer *item18 = new wxStaticBoxSizer( item19, wxHORIZONTAL ); + + wxString strs20[] = + { + _("- no skins available -") + }; + wxChoice *item20 = new wxChoice( parent, IDC_SKIN, wxDefaultPosition, wxSize(200,-1), 1, strs20, 0 ); + item18->Add( item20, 0, wxALIGN_CENTER|wxALL, 5 ); + + item15->Add( item18, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 0 ); + + item0->Add( item15, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item22 = new wxStaticBox( parent, -1, _("Column Sorting") ); + wxStaticBoxSizer *item21 = new wxStaticBoxSizer( item22, wxVERTICAL ); + + wxCheckBox *item23 = new wxCheckBox( parent, IDC_AUTOSORT, _("Auto-sort files in the download queue (high CPU)"), wxDefaultPosition, wxDefaultSize, 0 ); + item23->SetValue( TRUE ); + item23->SetToolTip( _("aMule will sort the columns in your download list automatically") ); + item21->Add( item23, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item21, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item25 = new wxStaticBox( parent, -1, _("Misc Gui Tweaks") ); + wxStaticBoxSizer *item24 = new wxStaticBoxSizer( item25, wxVERTICAL ); + + wxCheckBox *item26 = new wxCheckBox( parent, IDC_FED2KLH, _("Show Fast ED2K Links Handler"), wxDefaultPosition, wxDefaultSize, 0 ); + item26->SetValue( TRUE ); + item24->Add( item26, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 0 ); + + wxCheckBox *item27 = new wxCheckBox( parent, IDC_EXTCATINFO, _("Show extended info on categories tabs"), wxDefaultPosition, wxDefaultSize, 0 ); + item27->SetValue( TRUE ); + item24->Add( item27, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 0 ); + + wxCheckBox *item28 = new wxCheckBox( parent, IDC_SHOWRATEONTITLE, _("Show transfer rates on title"), wxDefaultPosition, wxDefaultSize, 0 ); + item28->SetValue( TRUE ); + item24->Add( item28, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxCheckBox *item29 = new wxCheckBox( parent, IDC_VERTTOOLBAR, _("Vertical toolbar orientation"), wxDefaultPosition, wxDefaultSize, 0 ); + item24->Add( item29, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxCheckBox *item30 = new wxCheckBox( parent, IDC_SHOWPARTFILENUMBER, _("Show part file number before file name"), wxDefaultPosition, wxDefaultSize, 0 ); + item24->Add( item30, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item24, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *PreferencesRemoteControlsTab( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxFlexGridSizer *item0 = new wxFlexGridSizer( 1, 0, 0 ); + item0->AddGrowableCol( 0 ); + + wxFlexGridSizer *item1 = new wxFlexGridSizer( 2, 0, 0 ); + item1->AddGrowableCol( 1 ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleSpecial( 11 ), wxDefaultPosition, wxSize(16,16) ); + item1->Add( item2, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("Remote Control"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item5 = new wxStaticBox( parent, -1, _("Webserver Parameters") ); + wxStaticBoxSizer *item4 = new wxStaticBoxSizer( item5, wxVERTICAL ); + + wxCheckBox *item6 = new wxCheckBox( parent, IDC_ENABLE_WEB, _("Run amuleweb on startup"), wxDefaultPosition, wxDefaultSize, 0 ); + item4->Add( item6, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item7 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item8 = new wxStaticText( parent, ID_TEXT, _("Webserver port"), wxDefaultPosition, wxDefaultSize, 0 ); + item7->Add( item8, 1, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxSpinCtrl *item9 = new wxSpinCtrl( parent, IDC_WEB_PORT, wxT("10000"), wxDefaultPosition, wxSize(100,-1), 0, 1025, 65535, 10000 ); + item7->Add( item9, 0, wxALIGN_CENTER, 5 ); + + item4->Add( item7, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxCheckBox *item10 = new wxCheckBox( parent, IDC_UPNP_WEBSERVER_ENABLED, _("Enable UPnP port forwarding on the Webserver port"), wxDefaultPosition, wxDefaultSize, 0 ); + item4->Add( item10, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item11 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item12 = new wxStaticText( parent, ID_TEXT, _("Webserver UPnP TCP port"), wxDefaultPosition, wxDefaultSize, 0 ); + item11->Add( item12, 1, wxALIGN_CENTER|wxRIGHT, 5 ); + + wxSpinCtrl *item13 = new wxSpinCtrl( parent, IDC_WEBUPNPTCPPORT, wxT("10000"), wxDefaultPosition, wxSize(100,-1), 0, 1025, 65535, 10000 ); + item11->Add( item13, 0, wxALIGN_CENTER, 5 ); + + item4->Add( item11, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item14 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item15 = new wxStaticText( parent, ID_TEXT, _("Page Refresh Time (in secs)"), wxDefaultPosition, wxDefaultSize, 0 ); + item14->Add( item15, 1, wxADJUST_MINSIZE|wxALIGN_CENTER, 5 ); + + wxSpinCtrl *item16 = new wxSpinCtrl( parent, IDC_WEB_REFRESH_TIMEOUT, wxT("120"), wxDefaultPosition, wxSize(100,-1), 0, 120, 600, 120 ); + item14->Add( item16, 0, wxALIGN_CENTER, 5 ); + + item4->Add( item14, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxCheckBox *item17 = new wxCheckBox( parent, IDC_WEB_GZIP, _("Enable Gzip compression"), wxDefaultPosition, wxDefaultSize, 0 ); + item17->SetValue( TRUE ); + item4->Add( item17, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxCheckBox *item18 = new wxCheckBox( parent, IDC_ENABLE_WEB_LOW, _("Enable Low rights User"), wxDefaultPosition, wxDefaultSize, 0 ); + item18->SetValue( TRUE ); + item4->Add( item18, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxFlexGridSizer *item19 = new wxFlexGridSizer( 2, 0, 0 ); + item19->AddGrowableCol( 1 ); + + wxStaticText *item20 = new wxStaticText( parent, ID_TEXT, _("Full rights password"), wxDefaultPosition, wxDefaultSize, 0 ); + item19->Add( item20, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + CMuleTextCtrl *item21 = new CMuleTextCtrl( parent, IDC_WEB_PASSWD, wxT(""), wxDefaultPosition, wxSize(80,-1), wxTE_PASSWORD ); + item19->Add( item21, 1, wxGROW|wxALIGN_RIGHT, 5 ); + + wxStaticText *item22 = new wxStaticText( parent, ID_TEXT, _("Low rights password"), wxDefaultPosition, wxDefaultSize, 0 ); + item19->Add( item22, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + CMuleTextCtrl *item23 = new CMuleTextCtrl( parent, IDC_WEB_PASSWD_LOW, wxT(""), wxDefaultPosition, wxSize(80,-1), wxTE_PASSWORD ); + item19->Add( item23, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticText *item24 = new wxStaticText( parent, ID_TEXT, _("Web template"), wxDefaultPosition, wxDefaultSize, 0 ); + item19->Add( item24, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP, 5 ); + + wxString *strs25 = (wxString*) NULL; + wxChoice *item25 = new wxChoice( parent, IDC_WEBTEMPLATE, wxDefaultPosition, wxSize(200,-1), 0, strs25, 0 ); + item19->Add( item25, 0, wxALIGN_CENTER|wxALL, 5 ); + + item4->Add( item19, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item4, 0, wxGROW, 5 ); + + wxStaticBox *item27 = new wxStaticBox( parent, -1, _("External Connection Parameters") ); + wxStaticBoxSizer *item26 = new wxStaticBoxSizer( item27, wxVERTICAL ); + + wxCheckBox *item28 = new wxCheckBox( parent, IDC_EXT_CONN_ACCEPT, _("Accept external connections"), wxDefaultPosition, wxDefaultSize, 0 ); + item26->Add( item28, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item29 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item30 = new wxStaticText( parent, ID_TEXT, _("Password"), wxDefaultPosition, wxDefaultSize, 0 ); + item29->Add( item30, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + CMuleTextCtrl *item31 = new CMuleTextCtrl( parent, IDC_EXT_CONN_PASSWD, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD ); + item29->Add( item31, 1, wxALIGN_CENTER|wxLEFT, 5 ); + + item26->Add( item29, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxFlexGridSizer *item32 = new wxFlexGridSizer( 2, 0, 0 ); + item32->AddGrowableCol( 0 ); + item32->AddGrowableCol( 1 ); + + wxStaticText *item33 = new wxStaticText( parent, ID_TEXT, + _("IP of the listening interface\n(empty for any)"), + wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE ); + item32->Add( item33, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + CMuleTextCtrl *item34 = new CMuleTextCtrl( parent, IDC_EXT_CONN_IP, wxT(""), wxDefaultPosition, wxDefaultSize, 0 ); + item34->SetToolTip( _("Enter here a valid ip in the a.b.c.d format for the listening EC interface. An empty field or 0.0.0.0 will mean any interface.") ); + item32->Add( item34, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + item26->Add( item32, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item35 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item36 = new wxStaticText( parent, ID_TEXT, _("TCP port"), wxDefaultPosition, wxDefaultSize, 0 ); + item35->Add( item36, 1, wxALIGN_CENTER|wxRIGHT, 5 ); + + wxSpinCtrl *item37 = new wxSpinCtrl( parent, IDC_EXT_CONN_TCP_PORT, wxT("10000"), wxDefaultPosition, wxSize(100,-1), 0, 1025, 65535, 10000 ); + item35->Add( item37, 0, wxALIGN_CENTER, 5 ); + + item26->Add( item35, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxCheckBox *item38 = new wxCheckBox( parent, IDC_UPNP_EC_ENABLED, _("Enable UPnP port forwarding on the EC port"), wxDefaultPosition, wxDefaultSize, 0 ); + item26->Add( item38, 0, wxADJUST_MINSIZE|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + item0->Add( item26, 0, wxGROW, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *prefs_main_sizer; +wxSizer *prefs_sizer; +wxSizer *preferencesDlgTop( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + prefs_main_sizer = item0; + + wxFlexGridSizer *item1 = new wxFlexGridSizer( 2, 0, 0 ); + item1->AddGrowableCol( 1 ); + item1->AddGrowableRow( 0 ); + prefs_sizer = item1; + + wxListCtrl *item2 = new wxListCtrl( parent, ID_PREFSLISTCTRL, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_NO_HEADER|wxLC_SINGLE_SEL|wxSUNKEN_BORDER ); + item1->Add( item2, 0, wxGROW|wxALL, 5 ); + + item0->Add( item1, 1, wxADJUST_MINSIZE|wxGROW|wxALL, 0 ); + + wxStaticBox *item4 = new wxStaticBox( parent, -1, wxT("") ); + wxStaticBoxSizer *item3 = new wxStaticBoxSizer( item4, wxHORIZONTAL ); + + wxButton *item5 = new wxButton( parent, ID_PREFS_OK_TOP, _("OK"), wxDefaultPosition, wxDefaultSize, 0 ); + item5->SetDefault(); + item5->SetToolTip( _("Click here to apply any changes made to the preferences.") ); + item3->Add( item5, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item6 = new wxButton( parent, ID_PREFS_CANCEL_TOP, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); + item6->SetToolTip( _("Reset any changes made to the preferences.") ); + item3->Add( item6, 0, wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item3, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *CategoriesEditWindow( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBox *item2 = new wxStaticBox( parent, -1, wxT("") ); + wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL ); + + wxBoxSizer *item3 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item4 = new wxStaticText( parent, IDC_STATIC_TITLE, _("Title :"), wxDefaultPosition, wxDefaultSize, 0 ); + item3->Add( item4, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + CMuleTextCtrl *item5 = new CMuleTextCtrl( parent, IDC_TITLE, wxT(""), wxDefaultPosition, wxDefaultSize, 0 ); + item3->Add( item5, 1, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); + + item1->Add( item3, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); + + wxBoxSizer *item6 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item7 = new wxStaticText( parent, IDC_STATIC_COMMENT, _("Comment :"), wxDefaultPosition, wxDefaultSize, 0 ); + item6->Add( item7, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + CMuleTextCtrl *item8 = new CMuleTextCtrl( parent, IDC_COMMENT, wxT(""), wxDefaultPosition, wxDefaultSize, 0 ); + item6->Add( item8, 1, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); + + item1->Add( item6, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); + + wxBoxSizer *item9 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item10 = new wxStaticText( parent, IDC_STATIC_INCOMING, _("Incoming Dir :"), wxDefaultPosition, wxDefaultSize, 0 ); + item9->Add( item10, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + CMuleTextCtrl *item11 = new CMuleTextCtrl( parent, IDC_INCOMING, wxT(""), wxDefaultPosition, wxDefaultSize, 0 ); + item9->Add( item11, 1, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxButton *item12 = new wxButton( parent, IDC_BROWSE, _("..."), wxDefaultPosition, wxDefaultSize, 0 ); + item9->Add( item12, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + item1->Add( item9, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); + + wxFlexGridSizer *item13 = new wxFlexGridSizer( 2, 0, 0 ); + + wxStaticText *item14 = new wxStaticText( parent, IDC_STATIC_PRIO, _("Change priority for new assigned files :"), wxDefaultPosition, wxDefaultSize, 0 ); + item13->Add( item14, 0, wxADJUST_MINSIZE|wxLEFT|wxRIGHT, 5 ); + + wxString strs15[] = + { + _("Dont change"), + _("Low"), + _("Normal"), + _("High"), + _("Auto") + }; + wxChoice *item15 = new wxChoice( parent, IDC_PRIOCOMBO, wxDefaultPosition, wxDefaultSize, 5, strs15, 0 ); + item13->Add( item15, 0, wxGROW|wxRIGHT, 5 ); + + item1->Add( item13, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); + + wxFlexGridSizer *item16 = new wxFlexGridSizer( 3, 0, 0 ); + item16->AddGrowableCol( 2 ); + + wxStaticText *item17 = new wxStaticText( parent, IDC_STATIC_COLOR, _("Select color for this Category (currently selected) :"), wxDefaultPosition, wxDefaultSize, 0 ); + item16->Add( item17, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + wxStaticBox *item19 = new wxStaticBox( parent, -1, wxT("") ); + wxStaticBoxSizer *item18 = new wxStaticBoxSizer( item19, wxVERTICAL ); + + wxStaticBitmap *item20 = new wxStaticBitmap( parent, ID_BOX_CATCOLOR, amuleSpecial( 0 ), wxDefaultPosition, wxDefaultSize ); + item18->Add( item20, 0, wxALIGN_CENTER, 5 ); + + item16->Add( item18, 0, wxALIGN_CENTER, 5 ); + + wxButton *item21 = new wxButton( parent, IDC_CATCOLOR, _("Select"), wxDefaultPosition, wxDefaultSize, 0 ); + item16->Add( item21, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + item1->Add( item16, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticBox *item23 = new wxStaticBox( parent, -1, wxT("") ); + wxStaticBoxSizer *item22 = new wxStaticBoxSizer( item23, wxHORIZONTAL ); + + wxButton *item24 = new wxButton( parent, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 ); + item24->SetDefault(); + item22->Add( item24, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item25 = new wxButton( parent, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); + item22->Add( item25, 0, wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item22, 0, wxALIGN_CENTER|wxALL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *transferDlg( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxStaticBox *item1 = new wxStaticBox( parent, -1, wxT("") ); + wxStaticBoxSizer *item0 = new wxStaticBoxSizer( item1, wxVERTICAL ); + + wxSplitterWindow *item2 = new wxSplitterWindow( parent, ID_SPLATTER, wxDefaultPosition, wxDefaultSize, wxSP_LIVE_UPDATE ); + item2->SetMinimumPaneSize( 20 ); + wxPanel *item3 = new wxPanel( item2, -1 ); + transferTopPane( item3, FALSE, TRUE ); + wxPanel *item4 = new wxPanel( item2, -1 ); + transferBottomPane( item4, FALSE, TRUE ); + item2->SplitHorizontally( item3, item4 ); + item2->SetName( wxT("splitterWnd") ); + item0->Add( item2, 1, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *ServerInfoLog( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleDlgImages( 2 ), wxDefaultPosition, wxDefaultSize ); + item2->SetToolTip( _("Display server motd when connected ...") ); + item1->Add( item2, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("Server Info"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item1, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item4 = new wxBoxSizer( wxHORIZONTAL ); + + CMuleTextCtrl *item5 = new CMuleTextCtrl( parent, ID_SERVERINFO, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxVSCROLL ); + item4->Add( item5, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxButton *item6 = new wxButton( parent, ID_BTN_RESET_SERVER, _("Reset"), wxDefaultPosition, wxDefaultSize, 0 ); + item6->SetToolTip( _("Click this button to reset the log.") ); + item4->Add( item6, 0, wxGROW|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + item0->Add( item4, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *aMuleLog( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleDlgImages( 3 ), wxDefaultPosition, wxDefaultSize ); + item1->Add( item2, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("aMule Log"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item1, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item4 = new wxBoxSizer( wxHORIZONTAL ); + + CMuleTextCtrl *item5 = new CMuleTextCtrl( parent, ID_LOGVIEW, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxVSCROLL ); + item4->Add( item5, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxButton *item6 = new wxButton( parent, ID_BTN_RESET, _("Reset"), wxDefaultPosition, wxDefaultSize, 0 ); + item6->SetToolTip( _("Click this button to reset the log.") ); + item4->Add( item6, 0, wxGROW|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + item0->Add( item4, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *serverListDlgUp( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + + wxBitmapButton *item2 = new wxBitmapButton( parent, ID_UPDATELIST, amuleDlgImages( 30 ), wxDefaultPosition, wxDefaultSize ); + item2->SetToolTip( _("Click on this button to update the servers list from URL ...") ); + item2->SetName( wxT("updateList") ); + item1->Add( item2, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("Serverlist"), wxDefaultPosition, wxDefaultSize, 0 ); + item3->SetName( wxT("serverListLabel") ); + item1->Add( item3, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + CMuleTextCtrl *item4 = new CMuleTextCtrl( parent, IDC_SERVERLISTURL, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER ); + item4->SetToolTip( _("Enter the url to a server.met file here and press the button to the left to update the list of known servers.") ); + item1->Add( item4, 1, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_HORIZONTAL|wxLEFT, 5 ); + + item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer *item5 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item6 = new wxStaticText( parent, ID_TEXT, _("Manual Server Add : Name"), wxDefaultPosition, wxDefaultSize, 0 ); + item5->Add( item6, 0, wxALIGN_CENTER|wxRIGHT, 5 ); + + CMuleTextCtrl *item7 = new CMuleTextCtrl( parent, IDC_SERVERNAME, wxT(""), wxDefaultPosition, wxDefaultSize, 0 ); + item7->SetToolTip( _("Enter the name of the new server here") ); + item5->Add( item7, 1, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + wxStaticText *item8 = new wxStaticText( parent, ID_TEXT, _("IP:Port"), wxDefaultPosition, wxDefaultSize, 0 ); + item5->Add( item8, 0, wxALIGN_CENTER|wxALL, 5 ); + + CMuleTextCtrl *item9 = new CMuleTextCtrl( parent, IDC_IPADDRESS, wxT(""), wxDefaultPosition, wxDefaultSize, 0 ); + item9->SetToolTip( _("Enter the IP of the server here, using the x.x.x.x format.") ); + item5->Add( item9, 1, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + wxStaticText *item10 = new wxStaticText( parent, ID_TEXT, _(":"), wxDefaultPosition, wxDefaultSize, 0 ); + item5->Add( item10, 0, wxALIGN_CENTER, 5 ); + + CMuleTextCtrl *item11 = new CMuleTextCtrl( parent, IDC_SPORT, wxT(""), wxDefaultPosition, wxDefaultSize, 0 ); + item11->SetToolTip( _("Enter the port of the server here.") ); + item5->Add( item11, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + wxButton *item12 = new wxButton( parent, ID_ADDTOLIST, _("Add"), wxDefaultPosition, wxDefaultSize, 0 ); + item12->SetToolTip( _("Add manually a server (fill fields to the left before) ...") ); + item5->Add( item12, 0, wxALIGN_CENTER|wxLEFT, 5 ); + + wxStaticLine *item13 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + item5->Add( item13, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + wxButton *item14 = new wxButton( parent, IDC_ED2KDISCONNECT, _("Disconnect"), wxDefaultPosition, wxDefaultSize, 0 ); + item5->Add( item14, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + item0->Add( item5, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + CServerListCtrl *item15 = new CServerListCtrl( parent, ID_SERVERLIST, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxSUNKEN_BORDER ); + item0->Add( item15, 1, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *serverListDlgDown( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxStaticBox *item1 = new wxStaticBox( parent, -1, wxT("") ); + wxStaticBoxSizer *item0 = new wxStaticBoxSizer( item1, wxVERTICAL ); + + wxNotebook *item3 = new wxNotebook( parent, ID_SRVLOG_NOTEBOOK, wxDefaultPosition, wxDefaultSize, 0 ); +#if !wxCHECK_VERSION(2,5,2) + wxNotebookSizer *item2 = new wxNotebookSizer( item3 ); +#else + wxWindow *item2 = item3; +#endif + + wxPanel *item4 = new wxPanel( item3, -1 ); + aMuleLog( item4, FALSE ); + item3->AddPage( item4, _("aMule Log") ); + + wxPanel *item5 = new wxPanel( item3, -1 ); + ServerInfoLog( item5, FALSE ); + item3->AddPage( item5, _("Server Info") ); + + wxPanel *item6 = new wxPanel( item3, -1 ); + ED2K_Info( item6, FALSE ); + item3->AddPage( item6, _("ED2K Info") ); + + wxPanel *item7 = new wxPanel( item3, -1 ); + Kad_Info( item7, FALSE ); + item3->AddPage( item7, _("Kad Info") ); + + item0->Add( item2, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *LocaleWarning( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBox *item2 = new wxStaticBox( parent, -1, _("Info") ); + wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL ); + + wxStaticText *item3 = new wxStaticText( parent, ID_LOCALETEXT, + _("The selected locale seems not to be installed on your box\nYou must generate it to use this language.\nA good start on linux systems is the file /etc/locale.gen and the package 'locales'\nGood luck!\n(Note: I'll try to set it anyway)"), + wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE ); + item1->Add( item3, 0, wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item1, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item4 = new wxButton( parent, ID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 ); + item4->SetDefault(); + item0->Add( item4, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxCheckBox *item5 = new wxCheckBox( parent, ID_LOCALENEVERAGAIN, _("Never show this again"), wxDefaultPosition, wxDefaultSize, 0 ); + item0->Add( item5, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *kadSizer; +wxSizer *KadDlg( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxFlexGridSizer *item0 = new wxFlexGridSizer( 1, 0, 0 ); + item0->AddGrowableCol( 0 ); + item0->AddGrowableRow( 0 ); + kadSizer = item0; + + wxFlexGridSizer *item1 = new wxFlexGridSizer( 2, 0, 0 ); + item1->AddGrowableCol( 0 ); + item1->AddGrowableRow( 0 ); + + wxBoxSizer *item2 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item3 = new wxBoxSizer( wxHORIZONTAL ); + + wxBitmapButton *item4 = new wxBitmapButton( parent, ID_UPDATEKADLIST, amuleDlgImages( 30 ), wxDefaultPosition, wxDefaultSize ); + item4->SetToolTip( _("Click on this button to update the nodes list from URL ...") ); + item4->SetName( wxT("nodesupdateList") ); + item3->Add( item4, 0, wxALIGN_CENTER, 5 ); + + wxStaticText *item5 = new wxStaticText( parent, ID_TEXT, _("Nodes (0)"), wxDefaultPosition, wxDefaultSize, 0 ); + item5->SetName( wxT("nodesListLabel") ); + item3->Add( item5, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + CMuleTextCtrl *item6 = new CMuleTextCtrl( parent, IDC_NODESLISTURL, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER ); + item6->SetToolTip( _("Enter the url to a nodes.dat file here and press the button to the left to update the list of known nodes.") ); + item3->Add( item6, 1, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_HORIZONTAL|wxLEFT, 5 ); + + item2->Add( item3, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item8 = new wxStaticBox( parent, -1, _("Nodes stats") ); + wxStaticBoxSizer *item7 = new wxStaticBoxSizer( item8, wxVERTICAL ); + + wxWindow *item9 = new COScopeCtrl(3,0,GRAPH_KAD,parent); +item9->SetName(wxT("kadScope")); + wxASSERT( item9 ); + item7->Add( item9, 1, wxGROW, 5 ); + + wxFlexGridSizer *item10 = new wxFlexGridSizer( 3, 0, 0 ); + item10->AddGrowableCol( 0 ); + item10->AddGrowableCol( 1 ); + + wxBoxSizer *item11 = new wxBoxSizer( wxHORIZONTAL ); + + wxWindow *item12 = new CColorFrameCtrl(parent,IDC_C0,20,14); + wxASSERT( item12 ); + item11->Add( item12, 0, wxFIXED_MINSIZE|wxALIGN_CENTER, 5 ); + + wxStaticText *item13 = new wxStaticText( parent, ID_TEXT, _("Current"), wxDefaultPosition, wxDefaultSize, 0 ); + item11->Add( item13, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item10->Add( item11, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxBoxSizer *item14 = new wxBoxSizer( wxHORIZONTAL ); + + wxWindow *item15 = new CColorFrameCtrl(parent,IDC_C0_3,20,14); + wxASSERT( item15 ); + item14->Add( item15, 0, wxFIXED_MINSIZE|wxALIGN_CENTER, 5 ); + + wxStaticText *item16 = new wxStaticText( parent, ID_TEXT, _("Running average"), wxDefaultPosition, wxDefaultSize, 0 ); + item14->Add( item16, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item10->Add( item14, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxBoxSizer *item17 = new wxBoxSizer( wxHORIZONTAL ); + + wxWindow *item18 = new CColorFrameCtrl(parent,IDC_C0_2,20,14); + wxASSERT( item18 ); + item17->Add( item18, 0, wxFIXED_MINSIZE|wxALIGN_CENTER, 5 ); + + wxStaticText *item19 = new wxStaticText( parent, ID_TEXT, _("Session average"), wxDefaultPosition, wxDefaultSize, 0 ); + item17->Add( item19, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxLEFT, 5 ); + + item10->Add( item17, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + item7->Add( item10, 0, wxALIGN_BOTTOM|wxLEFT|wxRIGHT|wxTOP, 5 ); + + item2->Add( item7, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item1->Add( item2, 0, wxGROW, 0 ); + + wxStaticBox *item21 = new wxStaticBox( parent, -1, _("Bootstrap") ); + wxStaticBoxSizer *item20 = new wxStaticBoxSizer( item21, wxVERTICAL ); + + wxStaticBox *item23 = new wxStaticBox( parent, -1, _("New node") ); + wxStaticBoxSizer *item22 = new wxStaticBoxSizer( item23, wxVERTICAL ); + + wxBoxSizer *item24 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item25 = new wxStaticText( parent, ID_TEXT, _("IP:"), wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE ); + item24->Add( item25, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 10 ); + + CMuleTextCtrl *item26 = new CMuleTextCtrl( parent, ID_NODE_IP1, wxT(""), wxDefaultPosition, wxSize(30,-1), 0 ); + item24->Add( item26, 0, wxALIGN_CENTER|wxTOP|wxBOTTOM, 5 ); + + wxStaticText *item27 = new wxStaticText( parent, ID_TEXT, wxT("."), wxDefaultPosition, wxDefaultSize, 0 ); + item24->Add( item27, 0, wxALIGN_CENTER|wxTOP, 5 ); + + CMuleTextCtrl *item28 = new CMuleTextCtrl( parent, ID_NODE_IP2, wxT(""), wxDefaultPosition, wxSize(30,-1), 0 ); + item24->Add( item28, 0, wxALIGN_CENTER|wxTOP|wxBOTTOM, 5 ); + + wxStaticText *item29 = new wxStaticText( parent, ID_TEXT, wxT("."), wxDefaultPosition, wxDefaultSize, 0 ); + item24->Add( item29, 0, wxALIGN_CENTER|wxTOP, 5 ); + + CMuleTextCtrl *item30 = new CMuleTextCtrl( parent, ID_NODE_IP3, wxT(""), wxDefaultPosition, wxSize(30,-1), 0 ); + item24->Add( item30, 0, wxALIGN_CENTER|wxTOP|wxBOTTOM, 5 ); + + wxStaticText *item31 = new wxStaticText( parent, ID_TEXT, wxT("."), wxDefaultPosition, wxDefaultSize, 0 ); + item24->Add( item31, 0, wxALIGN_CENTER|wxTOP, 5 ); + + CMuleTextCtrl *item32 = new CMuleTextCtrl( parent, ID_NODE_IP4, wxT(""), wxDefaultPosition, wxSize(30,-1), 0 ); + item24->Add( item32, 0, wxALIGN_CENTER|wxTOP|wxBOTTOM, 5 ); + + item22->Add( item24, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxFlexGridSizer *item33 = new wxFlexGridSizer( 2, 0, 0 ); + item33->AddGrowableCol( 1 ); + + wxStaticText *item34 = new wxStaticText( parent, ID_TEXT, _("Port:"), wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE ); + item33->Add( item34, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + CMuleTextCtrl *item35 = new CMuleTextCtrl( parent, ID_NODE_PORT, wxT(""), wxDefaultPosition, wxSize(80,-1), 0 ); + item33->Add( item35, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item22->Add( item33, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + wxButton *item36 = new wxButton( parent, ID_NODECONNECT, _("Connect"), wxDefaultPosition, wxDefaultSize, 0 ); + item36->Enable( false ); + item22->Add( item36, 0, wxALIGN_CENTER|wxTOP|wxBOTTOM, 5 ); + + item20->Add( item22, 0, wxALIGN_RIGHT, 0 ); + + item20->Add( 20, 20, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item37 = new wxButton( parent, ID_KNOWNNODECONNECT, + _("Bootstrap from \nknown clients"), + wxDefaultPosition, wxDefaultSize, 0 ); + item20->Add( item37, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item20->Add( 20, 20, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item38 = new wxButton( parent, ID_KADDISCONNECT, _("Disconnect Kad"), wxDefaultPosition, wxDefaultSize, 0 ); + item20->Add( item38, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + item1->Add( item20, 0, wxGROW|wxALIGN_RIGHT, 0 ); + + item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *ED2K_Info( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleDlgImages( 28 ), wxDefaultPosition, wxDefaultSize ); + item1->Add( item2, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_STATICTEXT, _("ED2K Info"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item1, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxListCtrl *item4 = new wxListCtrl( parent, ID_ED2KINFO, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_NO_HEADER|wxSUNKEN_BORDER ); + item0->Add( item4, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *PreferencesSecurityTab( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleSpecial( 22 ), wxDefaultPosition, wxSize(16,16) ); + item1->Add( item2, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("Security"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item1, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticBox *item5 = new wxStaticBox( parent, -1, _("Protocol Obfuscation") ); + wxStaticBoxSizer *item4 = new wxStaticBoxSizer( item5, wxVERTICAL ); + + wxCheckBox *item6 = new wxCheckBox( parent, IDC_SUPPORT_PO, _("Support Protocol Obfuscation"), wxDefaultPosition, wxDefaultSize, 0 ); + item6->SetValue( TRUE ); + item6->SetToolTip( _("This option enabled Protocol Obfuscation, and makes aMule accept obfuscated connections from other clients.") ); + item4->Add( item6, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxCheckBox *item7 = new wxCheckBox( parent, IDC_ENABLE_PO_OUTGOING, _("Use obfuscation for outgoing connections"), wxDefaultPosition, wxDefaultSize, 0 ); + item7->SetValue( TRUE ); + item7->SetToolTip( _("This option makes aMule use Protocol Obfuscation when connecting other clients/servers.") ); + item4->Add( item7, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 25 ); + + wxCheckBox *item8 = new wxCheckBox( parent, IDC_ENFORCE_PO_INCOMING, _("Accept only obfuscated connections"), wxDefaultPosition, wxDefaultSize, 0 ); + item8->SetToolTip( _("This option makes aMule only accept obfuscated connections. You will have less sources, but all your traffic will be obfuscated") ); + item4->Add( item8, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 25 ); + + item0->Add( item4, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticBox *item10 = new wxStaticBox( parent, -1, _("File Options") ); + wxStaticBoxSizer *item9 = new wxStaticBoxSizer( item10, wxVERTICAL ); + + wxString strs11[] = + { + _("Everybody"), + _("Friends"), + _("No One") + }; + wxRadioBox *item11 = new wxRadioBox( parent, IDC_SEESHARES, _("Who can see shared files:"), wxDefaultPosition, wxDefaultSize, 3, strs11, 1, wxRA_SPECIFY_COLS ); + item11->SetToolTip( _("Select who can request to view a list of your shared files.") ); + item9->Add( item11, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item0->Add( item9, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticBox *item13 = new wxStaticBox( parent, -1, _("IP-Filtering") ); + wxStaticBoxSizer *item12 = new wxStaticBoxSizer( item13, wxVERTICAL ); + + wxBoxSizer *item14 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer *item15 = new wxBoxSizer( wxVERTICAL ); + + wxCheckBox *item16 = new wxCheckBox( parent, IDC_IPFCLIENTS, _("Filter clients"), wxDefaultPosition, wxDefaultSize, 0 ); + item16->SetValue( TRUE ); + item16->SetToolTip( _("Enable filtering of the client IPs defined in the file ~/.aMule/ipfilter.dat.") ); + item15->Add( item16, 0, wxADJUST_MINSIZE|wxGROW|wxALL, 0 ); + + wxCheckBox *item17 = new wxCheckBox( parent, IDC_IPFSERVERS, _("Filter servers"), wxDefaultPosition, wxDefaultSize, 0 ); + item17->SetValue( TRUE ); + item17->SetToolTip( _("Enable filtering of the server IPs defined in the file ~/.aMule/ipfilter.dat.") ); + item15->Add( item17, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 0 ); + + item14->Add( item15, 0, wxALIGN_CENTER|wxALL, 5 ); + + item14->Add( 10, 10, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL, 0 ); + + wxButton *item18 = new wxButton( parent, IDC_IPFRELOAD, _("Reload List"), wxDefaultPosition, wxDefaultSize, 0 ); + item18->SetToolTip( _("Reload the list of IPs to filter from the file ~/.aMule/ipfilter.dat") ); + item14->Add( item18, 0, wxALIGN_CENTER|wxALL, 5 ); + + item12->Add( item14, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxFlexGridSizer *item19 = new wxFlexGridSizer( 3, 0, 0 ); + item19->AddGrowableCol( 1 ); + + wxStaticText *item20 = new wxStaticText( parent, ID_TEXT, _("URL:"), wxDefaultPosition, wxDefaultSize, 0 ); + item19->Add( item20, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ); + + wxTextCtrl *item21 = new wxTextCtrl( parent, IDC_IPFILTERURL, wxT(""), wxDefaultPosition, wxSize(80,-1), 0 ); + item19->Add( item21, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + wxButton *item22 = new wxButton( parent, IDC_IPFILTERUPDATE, _("Update now"), wxDefaultPosition, wxDefaultSize, 0 ); + item19->Add( item22, 0, wxALIGN_CENTER|wxLEFT, 5 ); + + item12->Add( item19, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxCheckBox *item23 = new wxCheckBox( parent, IDC_AUTOIPFILTER, _("Auto-update ipfilter at startup"), wxDefaultPosition, wxDefaultSize, 0 ); + item12->Add( item23, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxBoxSizer *item24 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item25 = new wxStaticText( parent, ID_TEXT, _("Filtering Level:"), wxDefaultPosition, wxDefaultSize, 0 ); + item24->Add( item25, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item24->Add( 10, 10, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + wxSpinCtrl *item26 = new wxSpinCtrl( parent, ID_IPFILTERLEVEL, wxT("0"), wxDefaultPosition, wxDefaultSize, 0, 0, 255, 0 ); + item24->Add( item26, 0, wxALIGN_CENTER|wxALL, 5 ); + + item12->Add( item24, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 0 ); + + wxCheckBox *item27 = new wxCheckBox( parent, IDC_FILTERLAN, _("Always filter LAN IPs"), wxDefaultPosition, wxDefaultSize, 0 ); + item27->SetValue( TRUE ); + item12->Add( item27, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxCheckBox *item28 = new wxCheckBox( parent, IDC_PARANOID, _("Paranoid handling of non-matching IPs"), wxDefaultPosition, wxDefaultSize, 0 ); + item28->SetValue( TRUE ); + item28->SetToolTip( _("Rejects packet if the client ip is different from the ip where the packet is received from. Use with caution.") ); + item12->Add( item28, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxCheckBox *item29 = new wxCheckBox( parent, IDC_IPFILTERSYS, _("Use system-wide ipfilter.dat if available"), wxDefaultPosition, wxDefaultSize, 0 ); + item29->SetToolTip( _("If there's no local ipfilter.dat found, allow usage of a systemwide ipfilter file.") ); + item12->Add( item29, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxCheckBox *item30 = new wxCheckBox( parent, IDC_SECIDENT, _("Use Secure User Identification"), wxDefaultPosition, wxDefaultSize, 0 ); + item30->SetValue( TRUE ); + item30->SetToolTip( _("It is recommended to enable this option. You will not receive credits if SUI is not enabled.") ); + item12->Add( item30, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + item0->Add( item12, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *PreferencesOnlineSigTab( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleSpecial( 21 ), wxDefaultPosition, wxDefaultSize ); + item1->Add( item2, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("Online Signature"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item1, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item5 = new wxStaticBox( parent, -1, _("Enable/Disable") ); + wxStaticBoxSizer *item4 = new wxStaticBoxSizer( item5, wxHORIZONTAL ); + + wxCheckBox *item6 = new wxCheckBox( parent, IDC_ONLINESIG, _("Enable Online-Signature"), wxDefaultPosition, wxDefaultSize, 0 ); + item6->SetValue( TRUE ); + item6->SetToolTip( _("Enables the writing of the OS file, which can be used by external apps to create signatures and the like.") ); + item4->Add( item6, 0, wxADJUST_MINSIZE|wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item0->Add( item4, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticBox *item8 = new wxStaticBox( parent, -1, _("Update Frequency (Secs):") ); + wxStaticBoxSizer *item7 = new wxStaticBoxSizer( item8, wxVERTICAL ); + + wxSpinCtrl *item9 = new wxSpinCtrl( parent, IDC_OSUPDATE, wxT("5"), wxDefaultPosition, wxSize(60,-1), 0, 0, 600, 5 ); + item9->SetToolTip( _("Change the frequency (in seconds) of Online Signature updates.") ); + item9->Enable( false ); + item7->Add( item9, 0, wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item7, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticBox *item11 = new wxStaticBox( parent, -1, _("Online Signature Directory:") ); + wxStaticBoxSizer *item10 = new wxStaticBoxSizer( item11, wxHORIZONTAL ); + + CMuleTextCtrl *item12 = new CMuleTextCtrl( parent, IDC_OSDIR, wxT(""), wxDefaultPosition, wxSize(80,-1), 0 ); + item10->Add( item12, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + wxButton *item13 = new wxButton( parent, IDC_SELOSDIR, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + item13->SetToolTip( _("Click here to select the directory containing the the Online Signature files.") ); + item10->Add( item13, 0, wxGROW|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + item0->Add( item10, 0, wxGROW|wxALL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *PreferencesMessagesTab( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleSpecial( 23 ), wxDefaultPosition, wxDefaultSize ); + item1->Add( item2, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("Messages"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item1, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item5 = new wxStaticBox( parent, -1, _("Disable/Enable") ); + wxStaticBoxSizer *item4 = new wxStaticBoxSizer( item5, wxVERTICAL ); + + wxCheckBox *item6 = new wxCheckBox( parent, IDC_MSGFILTER, _("Filter incoming messages (except current chat):"), wxDefaultPosition, wxDefaultSize, 0 ); + item4->Add( item6, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticBox *item8 = new wxStaticBox( parent, -1, _("Filtering Options:") ); + wxStaticBoxSizer *item7 = new wxStaticBoxSizer( item8, wxVERTICAL ); + + wxCheckBox *item9 = new wxCheckBox( parent, IDC_MSGFILTER_ALL, _("Filter all messages"), wxDefaultPosition, wxDefaultSize, 0 ); + item7->Add( item9, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 25 ); + + wxCheckBox *item10 = new wxCheckBox( parent, IDC_MSGFILTER_NONFRIENDS, _("Filter messages from people not on your friend list"), wxDefaultPosition, wxDefaultSize, 0 ); + item7->Add( item10, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 25 ); + + wxCheckBox *item11 = new wxCheckBox( parent, IDC_MSGFILTER_NONSECURE, _("Filter messages from unknown clients"), wxDefaultPosition, wxDefaultSize, 0 ); + item7->Add( item11, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 25 ); + + wxCheckBox *item12 = new wxCheckBox( parent, IDC_MSGFILTER_WORD, _("Filter messages containing (use ',' as separator):"), wxDefaultPosition, wxDefaultSize, 0 ); + item7->Add( item12, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 25 ); + + wxTextCtrl *item13 = new wxTextCtrl( parent, IDC_MSGWORD, wxT(""), wxDefaultPosition, wxSize(80,-1), 0 ); + item13->SetToolTip( _("add here the words amule should filter and block messages including it") ); + item7->Add( item13, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 50 ); + + item4->Add( item7, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item0->Add( item4, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxBoxSizer *item14 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item15 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleSpecial( 23 ), wxDefaultPosition, wxDefaultSize ); + item14->Add( item15, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticText *item16 = new wxStaticText( parent, ID_TEXT, _("Comments"), wxDefaultPosition, wxDefaultSize, 0 ); + item14->Add( item16, 0, wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item14, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item18 = new wxStaticBox( parent, -1, _("Disable/Enable") ); + wxStaticBoxSizer *item17 = new wxStaticBoxSizer( item18, wxVERTICAL ); + + wxCheckBox *item19 = new wxCheckBox( parent, IDC_FILTERCOMMENTS, _("Filter comments containing (use ',' as separator):"), wxDefaultPosition, wxDefaultSize, 0 ); + item17->Add( item19, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxTextCtrl *item20 = new wxTextCtrl( parent, IDC_COMMENTWORD, wxT(""), wxDefaultPosition, wxSize(80,-1), 0 ); + item20->SetToolTip( _("add here the words amule should filter and block messages including it") ); + item17->Add( item20, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT, 50 ); + + item0->Add( item17, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxBoxSizer *item21 = new wxBoxSizer( wxVERTICAL ); + + item0->Add( item21, 0, wxALL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *PreferencesProxyTab( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleSpecial( 24 ), wxDefaultPosition, wxSize(16,16) ); + item1->Add( item2, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("Proxy"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item1, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item5 = new wxStaticBox( parent, -1, _("General") ); + wxStaticBoxSizer *item4 = new wxStaticBoxSizer( item5, wxVERTICAL ); + + wxFlexGridSizer *item6 = new wxFlexGridSizer( 2, 0, 0 ); + item6->AddGrowableCol( 1 ); + + wxCheckBox *item7 = new wxCheckBox( parent, ID_PROXY_ENABLE_PROXY, _("Enable Proxy"), wxDefaultPosition, wxDefaultSize, 0 ); + item7->SetToolTip( _("Enable/disable proxy support") ); + item6->Add( item7, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item6->Add( 20, 20, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticText *item8 = new wxStaticText( parent, ID_TEXT, _("Proxy type:"), wxDefaultPosition, wxDefaultSize, 0 ); + item6->Add( item8, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxString strs9[] = + { + _("SOCKS5"), + _("SOCKS4"), + _("HTTP"), + _("SOCKS4a") + }; + wxChoice *item9 = new wxChoice( parent, ID_PROXY_TYPE, wxDefaultPosition, wxSize(100,-1), 4, strs9, 0 ); + item9->SetToolTip( _("The type of proxy you are connecting to") ); + item6->Add( item9, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticText *item10 = new wxStaticText( parent, ID_TEXT, _("Proxy host:"), wxDefaultPosition, wxDefaultSize, 0 ); + item6->Add( item10, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxTextCtrl *item11 = new wxTextCtrl( parent, ID_PROXY_NAME, wxT(""), wxDefaultPosition, wxDefaultSize, 0 ); + item11->SetToolTip( _("The proxy host name") ); + item6->Add( item11, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticText *item12 = new wxStaticText( parent, ID_TEXT, _("Proxy port:"), wxDefaultPosition, wxDefaultSize, 0 ); + item6->Add( item12, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxTextCtrl *item13 = new wxTextCtrl( parent, ID_PROXY_PORT, wxT(""), wxDefaultPosition, wxSize(80,-1), 0 ); + item13->SetToolTip( _("The proxy port") ); + item6->Add( item13, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item4->Add( item6, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item0->Add( item4, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticBox *item15 = new wxStaticBox( parent, -1, _("Authentication") ); + wxStaticBoxSizer *item14 = new wxStaticBoxSizer( item15, wxVERTICAL ); + + wxCheckBox *item16 = new wxCheckBox( parent, ID_PROXY_ENABLE_PASSWORD, _("Enable authentication"), wxDefaultPosition, wxDefaultSize, 0 ); + item16->SetToolTip( _("Enable/disable username/password authentication") ); + item14->Add( item16, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxFlexGridSizer *item17 = new wxFlexGridSizer( 2, 0, 0 ); + item17->AddGrowableCol( 1 ); + + wxStaticText *item18 = new wxStaticText( parent, ID_TEXT, _("Username:"), wxDefaultPosition, wxDefaultSize, 0 ); + item17->Add( item18, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxTextCtrl *item19 = new wxTextCtrl( parent, ID_PROXY_USER, wxT(""), wxDefaultPosition, wxSize(80,-1), 0 ); + item19->SetToolTip( _("The username to use to connect to the proxy") ); + item17->Add( item19, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticText *item20 = new wxStaticText( parent, ID_TEXT, _("Password:"), wxDefaultPosition, wxDefaultSize, 0 ); + item17->Add( item20, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxTextCtrl *item21 = new wxTextCtrl( parent, ID_PROXY_PASSWORD, wxT(""), wxDefaultPosition, wxSize(80,-1), wxTE_PASSWORD ); + item21->SetToolTip( _("The password to use to connect to the proxy") ); + item17->Add( item21, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item14->Add( item17, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item0->Add( item14, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxCheckBox *item22 = new wxCheckBox( parent, ID_PROXY_AUTO_SERVER_CONNECT_WITHOUT_PROXY, _("Automatic server connect without proxy"), wxDefaultPosition, wxSize(350,-1), 0 ); + item0->Add( item22, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *CoreConnect( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer *item2 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item3 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item4 = new wxStaticText( parent, ID_TEXT, _("Connect to:"), wxDefaultPosition, wxDefaultSize, 0 ); + item3->Add( item4, 0, wxALIGN_CENTER|wxALL, 5 ); + + CMuleTextCtrl *item5 = new CMuleTextCtrl( parent, ID_REMOTE_HOST, wxT("localhost"), wxDefaultPosition, wxSize(160,-1), 0 ); + item3->Add( item5, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticText *item6 = new wxStaticText( parent, ID_TEXT, wxT(":"), wxDefaultPosition, wxDefaultSize, 0 ); + item3->Add( item6, 0, wxALIGN_CENTER|wxALL, 5 ); + + CMuleTextCtrl *item7 = new CMuleTextCtrl( parent, ID_REMOTE_PORT, wxT("4712"), wxDefaultPosition, wxSize(60,-1), 0 ); + item3->Add( item7, 0, wxALIGN_CENTER|wxALL, 5 ); + + item2->Add( item3, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticBox *item9 = new wxStaticBox( parent, -1, _("Login to remote amule") ); + wxStaticBoxSizer *item8 = new wxStaticBoxSizer( item9, wxVERTICAL ); + + wxBoxSizer *item10 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item11 = new wxStaticText( parent, ID_TEXT, _("User name"), wxDefaultPosition, wxSize(80,-1), 0 ); + item10->Add( item11, 0, wxALIGN_CENTER|wxALL, 5 ); + + CMuleTextCtrl *item12 = new CMuleTextCtrl( parent, ID_EC_LOGIN, wxT("amule"), wxDefaultPosition, wxSize(200,-1), 0 ); + item12->Enable( false ); + item10->Add( item12, 0, wxALIGN_CENTER|wxALL, 5 ); + + item8->Add( item10, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxBoxSizer *item13 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item14 = new wxStaticText( parent, ID_TEXT, _("Password"), wxDefaultPosition, wxSize(80,-1), 0 ); + item13->Add( item14, 0, wxALIGN_CENTER|wxALL, 5 ); + + CMuleTextCtrl *item15 = new CMuleTextCtrl( parent, ID_EC_PASSWD, wxT(""), wxDefaultPosition, wxSize(200,-1), wxTE_PASSWORD ); + item13->Add( item15, 0, wxALIGN_CENTER|wxALL, 5 ); + + item8->Add( item13, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item2->Add( item8, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item1->Add( item2, 0, wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item1, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxBoxSizer *item16 = new wxBoxSizer( wxHORIZONTAL ); + + wxCheckBox *item17 = new wxCheckBox( parent, ID_EC_SAVE, _("Remember those settings"), wxDefaultPosition, wxDefaultSize, 0 ); + item17->SetValue( TRUE ); + item16->Add( item17, 0, wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item16, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxBoxSizer *item18 = new wxBoxSizer( wxHORIZONTAL ); + + wxButton *item19 = new wxButton( parent, wxID_OK, _("Connect"), wxDefaultPosition, wxDefaultSize, 0 ); + item19->SetDefault(); + item18->Add( item19, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item20 = new wxButton( parent, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); + item18->Add( item20, 0, wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item18, 0, wxALIGN_CENTER|wxALL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *PreferencesDebug( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleSpecial( 25 ), wxDefaultPosition, wxDefaultSize ); + item1->Add( item2, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_TEXT, _("Debugging"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item1, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item5 = new wxStaticBox( parent, -1, _("Disable/Enable") ); + wxStaticBoxSizer *item4 = new wxStaticBoxSizer( item5, wxVERTICAL ); + + wxBoxSizer *item6 = new wxBoxSizer( wxHORIZONTAL ); + + wxCheckBox *item7 = new wxCheckBox( parent, ID_VERBOSEDEBUG, _("Enable Verbose Debug-Logging."), wxDefaultPosition, wxDefaultSize, 0 ); + item6->Add( item7, 0, wxALIGN_CENTER|wxALL, 5 ); + + item4->Add( item6, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticBox *item9 = new wxStaticBox( parent, -1, _("Message Categories:") ); + wxStaticBoxSizer *item8 = new wxStaticBoxSizer( item9, wxVERTICAL ); + + wxWindow *item10 = new wxCheckListBox( parent, ID_DEBUGCATS ); + wxASSERT( item10 ); + item8->Add( item10, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item4->Add( item8, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item0->Add( item4, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *IDC_CURJOB; +wxSizer *convertDlg( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxFlexGridSizer *item0 = new wxFlexGridSizer( 3, 0, 0, 0 ); + item0->AddGrowableCol( 0 ); + item0->AddGrowableRow( 1 ); + + wxStaticBox *item2 = new wxStaticBox( parent, -1, _("Waiting...") ); + wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL ); + IDC_CURJOB = item1; + + wxBoxSizer *item3 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText *item4 = new wxStaticText( parent, IDC_CONV_PB_LABEL, wxT(""), wxDefaultPosition, wxDefaultSize, 0 ); + item3->Add( item4, 0, wxADJUST_MINSIZE|wxGROW|wxALL, 5 ); + + item3->Add( 20, 20, 1, wxGROW|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + wxStaticText *item5 = new wxStaticText( parent, IDC_CONV_PROZENT, wxT(""), wxDefaultPosition, wxDefaultSize, 0 ); + item3->Add( item5, 0, wxADJUST_MINSIZE|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxTOP|wxBOTTOM, 5 ); + + item1->Add( item3, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxGauge *item6 = new wxGauge( parent, IDC_CONV_PB_CURRENT, 100, wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item6, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + CConvertListCtrl *item7 = new CConvertListCtrl( parent, IDC_JOBLIST, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxSUNKEN_BORDER ); + item0->Add( item7, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxFlexGridSizer *item8 = new wxFlexGridSizer( 4, 0, 0 ); + item8->AddGrowableCol( 3 ); + + wxButton *item9 = new wxButton( parent, IDC_ADDITEM, _("Add imports"), wxDefaultPosition, wxDefaultSize, 0 ); + item9->SetDefault(); + item8->Add( item9, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item10 = new wxButton( parent, IDC_RETRY, _("Retry selected"), wxDefaultPosition, wxDefaultSize, 0 ); + item8->Add( item10, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item11 = new wxButton( parent, IDC_CONVREMOVE, _("Remove selected"), wxDefaultPosition, wxDefaultSize, 0 ); + item8->Add( item11, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxButton *item12 = new wxButton( parent, wxID_CANCEL, _("Close"), wxDefaultPosition, wxDefaultSize, 0 ); + item8->Add( item12, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item0->Add( item8, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *Kad_Info( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, ID_STATICBITMAP, amuleDlgImages( 28 ), wxDefaultPosition, wxDefaultSize ); + item1->Add( item2, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, ID_STATICETXT, _("Kad Info"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxADJUST_MINSIZE|wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item1, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxListCtrl *item4 = new wxListCtrl( parent, ID_KADINFO, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_NO_HEADER|wxSUNKEN_BORDER ); + item0->Add( item4, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *netSizer; +wxSizer *NetDialog( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + netSizer = item0; + + wxNotebook *item2 = new wxNotebook( parent, ID_NETNOTEBOOK, wxDefaultPosition, wxDefaultSize, 0 ); +#if !wxCHECK_VERSION(2,5,2) + wxNotebookSizer *item1 = new wxNotebookSizer( item2 ); +#else + wxWindow *item1 = item2; +#endif + + wxPanel *item3 = new wxPanel( item2, -1 ); + serverListDlgUp( item3, FALSE ); + item2->AddPage( item3, _("ED2K") ); + + CKadDlg *item4 = new CKadDlg( item2 ); +item4->SetName(wxT("kadWnd")); + KadDlg( item4, FALSE ); + item2->AddPage( item4, _("Kad") ); + + item0->Add( item1, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +wxSizer *IDC_PREFS_EVENTS_PAGE; +wxSizer *PreferencesEventsTab( wxWindow *parent, bool call_fit, bool set_sizer ) +{ + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + IDC_PREFS_EVENTS_PAGE = item0; + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBitmap *item2 = new wxStaticBitmap( parent, -1, amuleSpecial( 5 ), wxDefaultPosition, wxSize(16,16) ); + item1->Add( item2, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticText *item3 = new wxStaticText( parent, -1, _("Events"), wxDefaultPosition, wxDefaultSize, 0 ); + item1->Add( item3, 0, wxALIGN_CENTER|wxALL, 5 ); + + item0->Add( item1, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBox *item5 = new wxStaticBox( parent, -1, _("Event types") ); + wxStaticBoxSizer *item4 = new wxStaticBoxSizer( item5, wxVERTICAL ); + + wxListCtrl *item6 = new wxListCtrl( parent, IDC_EVENTLIST, wxDefaultPosition, wxSize(160,120), wxLC_REPORT|wxLC_NO_HEADER|wxLC_SINGLE_SEL|wxSUNKEN_BORDER ); + item4->Add( item6, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item0->Add( item4, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + if (set_sizer) + { + parent->SetSizer( item0 ); + if (call_fit) + item0->SetSizeHints( parent ); + } + + return item0; +} + +// Implement menubar functions + +// Implement toolbar functions + +void muleToolbar( wxToolBar *parent ) +{ + parent->SetMargins( 0, 0 ); + + parent->AddTool( ID_BUTTONCONNECT, _("Connect"), connButImg( 0 ), wxNullBitmap, wxITEM_NORMAL, _("Connect to any server and/or Kad") ); + parent->AddSeparator(); + parent->AddTool( ID_BUTTONNETWORKS, _("Networks"), amuleDlgImages( 20 ), wxNullBitmap, wxITEM_CHECK, _("Networks Window") ); + parent->ToggleTool( ID_BUTTONNETWORKS, TRUE ); + parent->AddTool( ID_BUTTONSEARCH, _("Searches"), amuleDlgImages( 22 ), wxNullBitmap, wxITEM_CHECK, _("Searches Window") ); + parent->AddTool( ID_BUTTONTRANSFER, _("Transfers"), amuleDlgImages( 21 ), wxNullBitmap, wxITEM_CHECK, _("Files Transfers Window") ); + parent->AddTool( ID_BUTTONSHARED, _("Shared Files"), amuleDlgImages( 23 ), wxNullBitmap, wxITEM_CHECK, _("Shared Files Window") ); + parent->AddTool( ID_BUTTONMESSAGES, _("Messages"), amuleDlgImages( 24 ), wxNullBitmap, wxITEM_CHECK, _("Messages Window") ); + parent->AddTool( ID_BUTTONSTATISTICS, _("Statistics"), amuleDlgImages( 25 ), wxNullBitmap, wxITEM_CHECK, _("Statistics Graph Window") ); + parent->AddSeparator(); + parent->AddTool( ID_BUTTONNEWPREFERENCES, _("Preferences"), amuleDlgImages( 26 ), wxNullBitmap, wxITEM_NORMAL, _("Preferences Settings Window") ); + parent->AddTool( ID_BUTTONIMPORT, _("Import"), amuleDlgImages( 32 ), wxNullBitmap, wxITEM_NORMAL, _("The partfile importer tool") ); + parent->AddTool( ID_ABOUT, _("About"), amuleDlgImages( 29 ), wxNullBitmap, wxITEM_NORMAL, _("About/Help") ); + + parent->Realize(); +} + +// Implement bitmap functions + +wxBitmap clientImages( size_t index ) +{ + if (index == 0) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,0,0,0,0,0,0,0,0, + 0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,0,0,0,0,0,0,233,250,233,246,255,246,246,255,246,233,250, + 233,0,0,0,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,0,0,0,202,237,202,216,242,215,202,237,202,202,237,202,202,237,202,202,237,202,216, + 242,215,208,239,208,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,0, + 0,114,201,112,159,224,158,146,223,144,148,226,146,148,226,146,148,226,146,148,226,146,148,226,146, + 159,224,158,114,201,112,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,0,0,0,73, + 193,70,98,212,95,0,0,0,0,0,0,93,217,90,93,217,90,0,0,0,0,0,0,98,212, + 95,73,193,70,0,0,0,212,208,200,212,208,200,212,208,200,0,0,0,8,165,4,26,187,21, + 50,206,46,0,0,0,0,0,0,52,220,46,49,213,45,0,0,0,0,0,0,50,206,46,26, + 187,21,8,165,4,0,0,0,212,208,200,212,208,200,0,0,0,18,178,14,19,193,14,27,206, + 22,27,216,22,27,216,22,27,216,22,27,216,22,27,216,22,27,216,22,27,206,22,19,193,14, + 18,178,14,0,0,0,212,208,200,212,208,200,0,0,0,26,187,21,27,206,22,32,218,27,34, + 226,29,34,226,29,34,226,29,34,226,29,34,226,29,34,226,29,32,218,27,27,206,22,26,187, + 21,0,0,0,212,208,200,212,208,200,0,0,0,37,196,34,42,216,37,0,0,0,54,240,47, + 57,243,49,57,243,49,57,243,49,57,243,49,54,240,47,0,0,0,42,216,37,37,196,34,0, + 0,0,212,208,200,212,208,200,212,208,200,0,0,0,52,220,46,61,237,54,0,0,0,72,250, + 64,72,250,64,72,250,64,72,250,64,0,0,0,61,237,54,49,213,45,0,0,0,212,208,200, + 212,208,200,212,208,200,212,208,200,0,0,0,61,223,55,68,233,62,77,246,69,0,0,0,0, + 0,0,0,0,0,0,0,0,77,246,69,61,223,55,53,205,48,0,0,0,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,0,0,0,68,233,62,79,243,74,88,252,82,88,252,82, + 88,252,82,83,247,79,76,235,72,65,214,61,0,0,0,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,0,0,0,0,0,0,79,243,74,83,247,79,83,247, + 79,76,235,72,0,0,0,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,0,0,0,0,0,0,0,0,0, + 0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 1) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,0,0,0,0,0,0,0,0, + 0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,0,0,0,0,0,0,247,233,233,255,248,248,255,248,248,248,237, + 237,0,0,0,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,0,0,0,230,205,205,238,220,220,234,212,212,232,208,208,234,212,212,234,212,212,234, + 212,212,234,212,212,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,0, + 0,181,116,116,212,166,166,211,156,156,211,156,156,212,156,156,212,156,156,212,156,156,212,166,166, + 212,166,166,189,129,129,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,0,0,0,170, + 82,82,191,110,110,0,0,0,0,0,0,197,106,106,197,106,106,0,0,0,0,0,0,191,110, + 110,175,88,88,0,0,0,212,208,200,212,208,200,212,208,200,0,0,0,142,21,21,159,36,36, + 181,61,61,0,0,0,0,0,0,189,62,62,189,62,62,0,0,0,0,0,0,187,62,62,163, + 41,41,144,21,21,0,0,0,212,208,200,212,208,200,0,0,0,154,24,24,169,28,28,183,33, + 33,193,37,37,193,37,37,193,37,37,193,37,37,193,37,37,193,37,37,185,31,31,169,28,28, + 154,24,24,0,0,0,212,208,200,212,208,200,0,0,0,169,28,28,185,31,31,205,37,37,211, + 39,39,211,39,39,211,39,39,211,39,39,211,39,39,211,39,39,205,37,37,185,31,31,169,28, + 28,0,0,0,212,208,200,212,208,200,0,0,0,185,31,31,210,35,35,232,43,43,233,48,48, + 237,50,50,237,50,50,237,50,50,237,50,50,233,48,48,221,42,42,205,37,37,180,30,30,0, + 0,0,212,208,200,212,208,200,212,208,200,0,0,0,210,35,35,237,50,50,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,232,43,43,205,37,37,0,0,0,212,208,200, + 212,208,200,212,208,200,212,208,200,0,0,0,210,35,35,236,41,41,245,50,50,253,50,50,253, + 53,53,253,53,53,253,50,50,237,50,50,221,42,42,199,33,33,0,0,0,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,0,0,0,226,38,38,241,43,43,245,45,45,253,50,50, + 253,50,50,241,43,43,232,43,43,210,35,35,0,0,0,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,0,0,0,0,0,0,241,43,43,241,43,43,245,45, + 45,236,41,41,0,0,0,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,0,0,0,0,0,0,0,0,0, + 0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 2) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,0,0,0,0,0,0,0,0, + 0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,0,0,0,0,0,0,254,247,233,255,254,246,255,254,246,254,247, + 233,0,0,0,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,0,0,0,246,239,202,248,243,213,246,239,202,246,239,202,246,239,202,246,239,202,248, + 243,213,248,243,213,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,0, + 0,221,204,105,240,229,157,242,228,144,246,232,146,246,232,146,246,232,146,246,232,146,242,228,144, + 240,229,157,225,210,119,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,0,0,0,228, + 200,70,241,221,94,0,0,0,0,0,0,252,229,90,252,229,90,0,0,0,0,0,0,241,221, + 94,228,200,70,0,0,0,212,208,200,212,208,200,212,208,200,0,0,0,209,181,6,230,203,20, + 244,218,47,0,0,0,0,0,0,253,227,46,253,227,46,0,0,0,0,0,0,244,218,47,230, + 203,20,209,181,6,0,0,0,212,208,200,212,208,200,0,0,0,215,190,17,230,203,20,246,220, + 23,254,229,26,254,229,26,254,229,26,254,229,26,254,229,26,254,229,26,246,220,23,230,203,20, + 215,190,17,0,0,0,212,208,200,212,208,200,0,0,0,220,199,27,237,217,31,249,230,34,255, + 238,37,255,238,37,255,238,37,255,238,37,255,238,37,255,238,37,249,230,34,237,217,31,220,199, + 27,0,0,0,212,208,200,212,208,200,0,0,0,223,205,39,239,224,45,255,238,37,255,247,59, + 255,247,59,255,247,59,255,247,59,255,247,59,255,247,59,255,238,37,239,224,45,223,205,39,0, + 0,0,212,208,200,212,208,200,212,208,200,0,0,0,237,227,57,255,238,37,0,0,0,255,252, + 80,255,252,80,255,252,80,255,252,80,0,0,0,246,220,23,232,218,57,0,0,0,212,208,200, + 212,208,200,212,208,200,212,208,200,0,0,0,238,227,64,246,238,78,255,238,37,0,0,0,0, + 0,0,0,0,0,0,0,0,255,238,37,241,231,72,232,218,57,0,0,0,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,0,0,0,246,238,78,251,243,91,254,252,98,254,252,98, + 254,253,103,254,252,98,244,237,85,233,223,76,0,0,0,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,0,0,0,0,0,0,254,251,92,254,252,98,254,252, + 98,251,243,91,0,0,0,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,0,0,0,0,0,0,0,0,0, + 0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 3) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,0,0,0,0,0,0,0,0, + 0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,0,0,0,0,0,0,232,232,232,244,243,244,244,243,244,232,232, + 232,0,0,0,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,0,0,0,213,213,213,222,222,222,213,213,213,213,213,213,222,222,222,213,213,213,222, + 222,222,222,222,222,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,0, + 0,141,141,141,185,184,185,178,177,178,178,177,178,185,184,185,178,177,178,178,177,178,178,177,178, + 185,184,185,158,158,158,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,0,0,0,126, + 126,126,145,145,145,0,0,0,0,0,0,145,145,145,145,145,145,0,0,0,0,0,0,145,145, + 145,133,133,133,0,0,0,212,208,200,212,208,200,212,208,200,0,0,0,89,89,89,98,98,98, + 126,126,126,0,0,0,0,0,0,126,126,126,126,126,126,0,0,0,0,0,0,126,126,126,105, + 105,105,89,89,89,0,0,0,212,208,200,212,208,200,0,0,0,89,89,89,105,105,105,113,113, + 113,113,113,113,126,126,126,113,113,113,126,126,126,113,113,113,121,121,121,113,113,113,102,102,102, + 94,94,94,0,0,0,212,208,200,212,208,200,0,0,0,98,98,98,113,113,113,133,133,133,133, + 133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,126,126,126,113,113,113,105,105, + 105,0,0,0,212,208,200,212,208,200,0,0,0,113,113,113,133,133,133,141,141,141,145,145,145, + 158,158,158,158,158,158,153,153,153,153,153,153,145,145,145,145,145,145,126,126,126,113,113,113,0, + 0,0,212,208,200,212,208,200,212,208,200,0,0,0,133,133,133,158,158,158,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,133,133,133,0,0,0,212,208,200, + 212,208,200,212,208,200,212,208,200,0,0,0,141,141,141,0,0,0,158,158,158,169,168,168,178, + 177,178,178,177,178,166,166,166,158,158,158,0,0,0,126,126,126,0,0,0,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,0,0,0,145,145,145,165,164,163,169,168,168,178,177,178, + 169,168,168,169,168,168,153,153,153,138,138,138,0,0,0,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,0,0,0,0,0,0,165,164,163,169,168,168,165,164, + 163,158,158,158,0,0,0,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,0,0,0,0,0,0,0,0,0, + 0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 4) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 23 1", + " c None", + "a c Black", + "b c #DDA670", + "c c #C3C3C3", + "d c #E6E5E6", + "e c #E9E9E9", + "f c #D8D7D8", + "g c #CCCCCC", + "h c #BF7220", + "i c #D5D5D5", + "j c #F8F7F8", + "k c #ECECEC", + "l c #F1DECB", + "m c #C37A33", + "n c #DEDEDE", + "p c #BE6A13", + "q c #F2F1F2", + "r c #DBB68F", + "s c #F5F5F5", + "t c #CC9554", + "u c #D2A06B", + "v c #FEFEFE", + "w c #C88642", + /* pixels */ + " ", + " aaaa ", + " aavvvvaa ", + " asssrrqssa ", + " agkrppppldfa ", + " ainhplrptdia ", + " acidekqupudica ", + " agnkssupmsknia ", + " aidssvppvsqdia ", + " anksvvvvvvvkna ", + " akvvvwbvvska ", + " aksvvpwvjqda ", + " asvvvvvska ", + " aavvvvaa ", + " aaaa ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 5) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 6 1", + " c None", + "a c Black", + "b c #101010", + "c c #74EC48", + "d c #222222", + "f c #0D0D0D", + /* pixels */ + " aaaa ", + " acca ", + " aaaccaaa", + " acccccca", + " acccccca", + " adaccaaa", + " fccb ", + " aaaa ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 6) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 3 1", + " c None", + "a c #FF0000", + "c c #A52A2A", + /* pixels */ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " a ", + " aa ", + "a aac ", + "aa aac ", + "caaac ", + " cac " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 7) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 3 1", + " c None", + "a c #CC3232", + "b c #FF0000", + /* pixels */ + " ", + "ba ab", + " ba ab ", + " ba ab ", + " ba ab ", + " ba ab ", + " ba ab ", + " baab ", + " aa ", + " abba ", + " ab ba ", + " ab ba ", + " ab ba ", + " ab ba ", + " ab ba ", + "ab ba" + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 8) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 13 1", + " c None", + "a c Black", + "b c #CACACA", + "c c #CBCBCB", + "d c #CCCCCC", + "e c #CDCDCC", + "f c #CDCDCD", + "g c #C6C6C4", + "h c #CECECE", + "i c #CFCFCF", + "k c #C6C2C1", + "l c #C9C9C8", + "m c #C2C2C2", + /* pixels */ + " a ", + " aga ", + " aaadddaaa", + " abbdiibma", + " alcihfa ", + " afffa ", + " aefahha ", + " aha aka ", + " aa aa ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 9) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,85,85,85,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,85,85,85,251,225,54,99,98,78,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,85,85,85,85,85,85,99,98, + 78,253,244,13,255,248,7,252,235,31,85,85,85,85,85,85,85,85,85,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,85,85,85,238,222,51,255,241,41,253, + 250,0,252,249,0,253,249,3,251,230,42,235,217,58,99,98,78,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,120,116,64,233,224,28,253,250,0, + 253,250,0,251,242,12,227,216,37,120,118,66,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,121,120,65,255,248,8,251,239, + 21,252,235,32,120,118,66,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,99,98,78,241,229,35,252,236,27,159,144,90,252, + 236,31,233,214,64,97,96,79,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,80,84,80,203,194,47,98,97,78,212,208,200,85,85,85, + 217,210,34,87,86,84,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,80,84,80,96,96,72,212,208,200,212,208,200,212,208,200,96,96, + 72,85,85,85,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 10) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 3 1", + " c None", + "a c #FFFF00", + "b c #323834", + /* pixels */ + " b ", + " bab ", + " baaab ", + " baaaaab ", + " baaaaaaab", + " bbbaaabbb", + " baaab ", + " bbbbb ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 11) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,9,84,125,8,73,108,7,65,97,7, + 65,97,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,9,84,125,16,149,221,27,164,239,15,139,206,10,90,133, + 6,52,77,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,9,84,125,16,149,221,255,255,255,130,205,246,67,180,242,14,132,196,10,94, + 140,6,52,77,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,9,84,125,27,164,239,162,218,249,93,191,244,67,180,242,16,149,221,13,121,180,6, + 52,77,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,7,65,97,15,139,206,67,180,242,67,180,242,33,167,240,16,149,221,13,121,180,6,52,77, + 6,52,77,6,52,77,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,6, + 52,77,10,94,140,15,139,206,16,149,221,16,149,221,13,126,187,10,90,133,6,52,77,8,73, + 108,7,65,97,6,52,77,212,208,200,212,208,200,212,208,200,212,208,200,9,84,125,6,58,86, + 6,52,77,9,84,125,12,116,172,12,116,172,10,90,133,6,52,77,9,78,116,10,90,133,9, + 84,125,6,52,77,212,208,200,212,208,200,212,208,200,9,84,125,12,111,165,10,94,140,7,62, + 92,6,52,77,6,52,77,6,52,77,6,52,77,121,0,0,121,0,0,9,84,125,121,0,0, + 121,0,0,212,208,200,212,208,200,9,84,125,78,185,243,104,195,244,14,132,196,12,116,172,10, + 94,140,10,94,140,10,94,140,121,0,0,242,84,90,237,28,36,121,0,0,237,28,36,237,28, + 36,68,1,0,212,208,200,9,84,125,186,227,250,63,179,242,13,121,180,16,149,221,63,179,242, + 27,164,239,121,0,0,242,84,90,251,199,201,245,122,126,239,49,56,245,117,122,243,100,105,237, + 28,36,68,1,0,9,84,125,104,195,244,27,164,239,10,94,140,33,167,240,231,245,253,113,198, + 245,121,0,0,245,130,134,254,241,241,248,170,173,244,109,113,248,167,170,245,117,122,226,26,34, + 68,1,0,9,84,125,78,185,243,16,149,221,7,62,92,33,167,240,231,245,253,113,198,245,121, + 0,0,242,84,90,251,199,201,247,156,160,246,145,149,245,122,126,242,89,95,195,21,27,68,1, + 0,9,84,125,44,171,240,16,149,221,6,52,77,33,167,240,207,236,252,93,191,244,67,180,242, + 121,0,0,241,67,74,247,156,160,245,132,136,243,97,103,219,25,33,68,1,0,212,208,200,9, + 84,125,16,149,221,16,149,221,6,52,77,33,167,240,138,209,247,72,182,242,44,171,240,44,171, + 240,121,0,0,237,28,36,245,126,130,219,25,33,68,1,0,212,208,200,212,208,200,7,65,97, + 16,149,221,16,149,221,6,52,77,16,149,221,85,187,243,54,175,241,15,144,215,6,52,77,6, + 52,77,121,0,0,179,14,18,68,1,0,212,208,200,212,208,200,212,208,200,7,65,97,6,52, + 77,6,52,77,212,208,200,6,52,77,6,52,77,6,52,77,6,52,77,212,208,200,212,208,200, + 212,208,200,68,1,0,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 12) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,100,41,9,100,41,9,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,100,41,9,100,41,9,129,63,18,212,208,200,100,41,9,100,41,9,100,41,9,100,41, + 9,100,41,9,100,41,9,100,41,9,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 100,41,9,191,111,45,129,63,18,100,41,9,242,220,175,233,195,143,223,170,110,206,130,64,174, + 98,39,100,41,9,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,129,63, + 18,167,93,36,100,41,9,242,220,175,223,170,110,213,147,84,191,111,45,100,41,9,100,41,9, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,142,74,26,206, + 130,64,223,170,110,215,150,87,149,79,29,100,41,9,100,41,9,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,199,118,49,187,109,45, + 166,94,38,134,69,27,100,41,9,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,100,41,9,100,41,9,185,108,46,187,109,45,93,45, + 14,222,170,125,180,123,80,128,64,23,100,41,9,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,203,124,57,190,111,46,223,174,133,255, + 255,255,0,0,0,147,106,72,167,96,42,50,55,62,50,55,62,50,55,62,212,208,200,212,208, + 200,212,208,200,212,208,200,100,41,9,100,41,9,210,138,74,217,154,92,217,154,92,236,236,235, + 65,64,65,194,119,57,204,145,78,230,210,186,255,255,255,196,196,192,50,55,62,212,208,200,212, + 208,200,212,208,200,212,208,200,100,41,9,223,170,110,242,220,175,223,170,110,217,154,92,180,104, + 44,191,119,50,193,140,87,107,108,111,23,22,20,255,255,255,50,55,62,212,208,200,212,208,200, + 212,208,200,100,41,9,110,49,12,217,154,92,223,170,110,223,170,110,210,138,74,180,104,44,168, + 94,37,193,160,128,198,198,194,160,160,159,235,235,233,50,55,62,212,208,200,212,208,200,212,208, + 200,100,41,9,110,49,12,166,92,35,210,138,74,210,138,74,199,119,49,171,96,38,168,94,37, + 197,179,159,228,228,225,228,228,225,231,231,229,50,55,62,212,208,200,212,208,200,212,208,200,100, + 41,9,128,63,19,100,41,9,100,41,9,100,41,9,100,41,9,100,41,9,114,116,118,160,160, + 158,170,170,166,164,165,162,50,55,62,212,208,200,212,208,200,212,208,200,212,208,200,100,41,9, + 141,73,25,172,101,39,163,91,33,127,62,19,100,41,9,212,208,200,50,55,62,50,55,62,50, + 55,62,50,55,62,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,143,75, + 26,193,116,45,193,116,45,154,83,30,100,41,9,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 13) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,174,174,174,165,165,165, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,120, + 215,116,85,213,79,212,208,200,212,208,200,153,153,153,143,143,143,153,153,153,153,153,153,142,142, + 142,151,151,151,190,190,190,212,208,200,81,211,75,139,216,134,212,208,200,212,208,200,212,208,200, + 94,191,89,92,211,85,168,173,168,193,193,193,211,211,211,179,179,179,179,179,179,211,211,211,196, + 196,196,171,187,171,67,201,60,112,191,108,212,208,200,212,208,200,212,208,200,129,129,129,156,168, + 155,63,197,55,136,206,132,202,204,203,190,206,188,135,209,131,135,209,131,187,206,185,202,204,203, + 104,203,100,71,186,65,152,159,151,129,129,129,212,208,200,212,208,200,120,120,120,95,96,96,137, + 171,133,66,194,55,102,209,93,75,192,66,82,187,74,93,188,87,71,189,62,92,208,78,68,194, + 60,144,167,143,94,94,94,119,119,119,212,208,200,157,157,157,75,75,75,71,71,71,139,140,139, + 108,179,102,73,197,63,133,154,132,139,140,139,139,140,139,138,152,137,76,196,65,98,180,91,146, + 146,146,82,82,82,75,75,75,157,157,157,63,63,63,14,14,14,101,101,101,190,190,190,134,148, + 133,81,194,68,131,153,128,193,193,193,198,198,198,139,156,137,84,227,66,124,158,121,190,190,190, + 119,119,119,14,14,14,63,63,63,85,85,85,20,20,20,151,151,151,218,218,218,153,153,153,99, + 170,91,114,171,107,196,196,196,206,206,207,114,171,107,90,208,80,139,139,139,215,215,215,174,174, + 174,22,22,22,84,84,84,116,116,116,57,57,57,135,135,135,219,219,219,193,193,193,104,131,99, + 97,191,83,148,153,148,168,173,168,115,195,103,98,157,88,165,165,165,219,219,219,157,157,157,56, + 56,56,118,118,118,146,146,146,100,100,100,111,111,111,211,211,211,214,214,214,118,122,119,102,179, + 89,98,135,90,108,124,104,116,217,100,90,126,81,206,206,207,215,215,215,123,123,123,101,101,101, + 147,147,147,174,174,174,129,129,129,123,123,123,171,171,171,211,211,211,165,165,165,87,130,79,88, + 161,74,79,125,69,102,176,87,126,126,126,206,206,207,179,178,179,126,126,126,130,130,130,174,174, + 174,212,208,200,175,175,175,135,135,135,153,153,153,142,142,142,186,186,186,78,88,75,119,191,102, + 108,194,89,76,108,68,157,157,157,145,144,145,151,151,151,137,137,137,174,174,174,212,208,200,212, + 208,200,212,208,200,186,186,186,139,139,139,157,157,157,196,196,196,120,120,120,90,126,81,95,162, + 82,80,87,80,193,193,193,151,151,151,134,134,134,186,186,186,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,193,193,193,151,151,151,179,179,179,193,193,193,94,94,94,88,90,88,159, + 159,159,179,179,179,151,151,151,196,196,196,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,186,186,186,161,161,161,148,148,148,148,148,148,161,161,161, + 186,186,186,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 14) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,176,176,176,168,168,168,172,172,172,168,168,168,166,166, + 166,172,172,172,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,163,164,166,188,188,189,198,198,199,201,201,202,201,201,202,201,201,202,185, + 186,188,162,163,165,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,142,142,143,166,166,166,175,176,178,182,183,185,185,186,188,187,188,190,182,183,185,181,182,183, + 164,165,167,144,144,144,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,148,148,149,142, + 142,143,163,164,166,168,169,171,170,171,173,170,171,173,170,171,173,170,171,173,170,171,173,163,164, + 166,144,144,144,155,156,156,212,208,200,212,208,200,212,208,200,212,208,200,134,134,136,175,176,178, + 189,190,192,189,190,192,189,190,192,189,190,192,189,190,192,187,188,190,187,188,190,187,188,190,176, + 176,176,135,136,135,212,208,200,212,208,200,212,208,200,166,166,166,152,152,153,166,166,168,179,180, + 182,182,183,185,175,176,178,182,183,185,179,180,182,172,172,172,182,183,185,180,181,183,169,170,170, + 152,152,153,172,172,172,212,208,200,212,208,200,195,195,195,200,200,200,175,175,175,198,198,198,204, + 204,204,172,172,172,201,201,202,199,199,199,172,172,172,204,204,204,198,198,198,175,175,175,201,201, + 202,199,199,199,212,208,200,212,208,200,199,199,199,198,198,198,198,198,198,200,200,200,199,199,199, + 198,198,198,198,198,198,196,196,196,196,196,196,199,199,199,199,199,199,193,193,193,193,193,193,199, + 199,199,212,208,200,212,208,200,201,201,202,198,198,198,195,195,195,201,201,202,199,199,199,195,195, + 195,198,198,198,196,196,196,187,188,190,191,191,191,198,198,198,193,193,193,193,193,193,199,199,199, + 212,208,200,212,208,200,200,200,200,199,199,199,192,192,192,192,192,192,199,199,199,193,193,193,201, + 201,202,199,199,199,191,191,191,213,213,213,199,199,199,188,188,189,184,184,184,199,199,199,212,208, + 200,212,208,200,200,200,200,184,184,184,215,215,215,188,188,189,204,204,204,195,195,195,212,208,200, + 188,188,189,192,192,192,195,195,195,207,207,207,188,188,188,212,208,200,201,201,202,212,208,200,212, + 208,200,188,188,189,212,208,200,203,203,203,212,208,200,198,198,198,188,188,189,212,208,200,212,208, + 200,188,188,189,207,207,207,198,198,198,204,204,204,212,208,200,184,184,184,212,208,200,188,188,189, + 212,208,200,212,208,200,198,198,198,212,208,200,212,208,200,201,201,202,211,211,211,212,208,200,204, + 204,204,204,204,204,212,208,200,213,213,213,198,198,198,213,213,213,188,188,189,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 15) + { + static const unsigned char data[] = + { + 212,208,200,140,128,115,212,208,200,212,208,200,212,208,200,212,208,200,142,125,108,176,159,142,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,162,149,136,212,174,136,212,208,200,212,208,200,130,130,130,255,217,178,183,157,132,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,64,100,144,212,208,200,212,208,200,212,208,200,212, + 208,200,196,183,170,170,144,119,85,85,85,238,225,212,255,128,115,183,106,157,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,162,149,136,153,153,153,246,183,144,255,128,153,110,110,110,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,119,119, + 119,230,231,230,238,238,238,212,174,162,142,91,125,212,208,200,212,208,200,136,136,136,85,85,85, + 136,136,136,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,110,110,110,234,234,234,251, + 251,251,251,251,251,208,208,208,187,187,187,110,110,110,162,162,162,234,234,234,242,242,242,230,231, + 230,170,170,170,110,110,110,212,208,200,212,208,200,212,208,200,174,174,174,255,255,255,255,255,255, + 149,123,200,157,106,170,246,246,246,191,191,191,246,246,246,255,255,255,255,255,255,255,255,255,251, + 251,251,238,238,238,147,147,147,212,208,200,110,110,110,212,212,212,225,212,200,238,238,238,208,170, + 196,255,217,242,251,251,251,238,238,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,196,196,196,212,208,200,212,208,200,174,162,149,178,166,153,234,234,234,255,255,255,234, + 234,234,183,183,183,246,246,246,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,230,231,230,85,85,85,212,208,200,85,85,85,128,128,128,140,140,140,132,132,132,174,174,174, + 221,221,221,255,255,255,255,255,255,255,255,255,251,251,251,255,255,255,255,255,255,255,255,255,238, + 238,238,170,170,170,212,208,200,85,85,85,191,191,191,178,178,178,200,200,200,242,242,242,255,255, + 255,255,255,255,251,251,251,251,251,251,200,200,200,238,238,238,255,255,255,255,255,255,234,234,234, + 144,144,144,212,208,200,136,136,136,221,221,221,221,221,221,242,242,242,255,255,255,255,255,255,246, + 246,246,208,208,208,225,225,225,178,178,178,208,208,208,230,231,230,238,238,238,217,217,217,170,170, + 170,212,208,200,212,208,200,130,130,130,183,183,183,234,234,234,251,251,251,242,242,242,225,225,225, + 149,149,149,187,187,187,128,128,128,178,178,178,187,187,187,212,212,212,204,204,204,110,110,110,212, + 208,200,85,85,85,200,200,200,204,204,204,170,170,170,208,208,208,242,242,242,204,204,204,106,106, + 106,128,128,128,106,106,106,85,85,85,128,128,128,178,178,178,125,125,125,212,208,200,162,162,162, + 191,191,191,200,200,200,128,128,128,130,130,130,123,123,123,217,217,217,149,149,149,170,170,170,162, + 162,162,85,85,85,174,174,174,238,238,238,162,162,162,212,208,200,212,208,200,212,208,200,85,85, + 85,136,136,136,212,208,200,110,110,110,162,162,162,119,119,119,85,85,85,136,136,136,212,208,200, + 212,208,200,119,119,119,130,130,130,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 16) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,94,153,160,87,148,157,105,157,164,109,157,164,88,149,157,86,148,157, + 86,148,156,89,150,157,64,100,144,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,93,153,157,90,150,156,90,150,156,89,150,156,91,152,160,91,152,160,93,152,160,91,152, + 160,90,151,159,87,149,157,212,208,200,212,208,200,212,208,200,88,152,152,212,208,200,212,208,200, + 93,152,157,101,157,166,97,155,163,96,155,163,97,155,165,98,157,164,99,156,165,98,156,165,96, + 154,163,92,152,160,86,148,156,212,208,200,212,208,200,56,132,144,212,208,200,75,121,124,36,54, + 57,105,160,168,99,157,165,100,157,166,100,157,166,172,201,206,129,176,182,101,158,167,99,157,165, + 95,154,162,87,149,157,71,137,148,58,132,144,56,132,144,212,208,200,140,184,187,176,204,208,32, + 52,56,108,119,121,184,210,213,118,169,177,118,169,176,160,194,199,102,158,167,100,158,166,96,155, + 163,86,148,157,71,138,147,58,132,144,212,208,200,212,208,200,107,161,169,106,161,169,110,163,172, + 181,208,212,221,233,236,175,205,208,123,172,178,195,217,219,120,169,177,97,156,162,95,154,162,83, + 147,155,67,136,146,72,138,147,212,208,200,97,156,161,104,159,167,99,157,165,97,156,163,99,157, + 164,171,201,206,221,233,235,204,222,225,196,218,220,103,159,168,99,157,165,91,151,159,78,143,152, + 60,132,142,59,130,140,212,208,200,92,153,158,63,136,146,99,156,160,115,168,173,112,165,173,120, + 171,177,127,175,181,125,173,179,103,159,167,99,157,165,94,153,161,84,147,155,69,137,147,51,126, + 137,68,135,144,212,208,200,92,153,158,77,142,152,160,182,184,132,167,172,80,145,154,93,153,162, + 99,156,165,98,156,165,97,155,163,91,152,160,83,146,155,72,139,148,56,128,140,38,118,129,212, + 208,200,212,208,200,212,208,200,68,138,150,56,132,144,212,208,200,109,157,163,91,151,159,93,153, + 161,91,151,159,86,149,157,78,144,152,68,137,147,55,128,139,39,119,130,38,118,129,212,208,200, + 212,208,200,212,208,200,88,152,152,88,152,152,212,208,200,130,167,172,97,152,160,81,145,154,73, + 141,152,70,138,148,60,131,142,47,123,134,34,115,126,25,109,121,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,83,141,150,63,132,142,58,130,142, + 51,126,137,40,119,130,28,112,123,19,104,116,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,51,121,132,24,107,119,16,103, + 116,12,100,113,9,94,107,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,53,113,124,59,115,125,18, + 80,92,44,92,102,15,71,81,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 17) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,201,168,153,205,141,133,208,159,151,201,162,139, + 200,147,130,192,142,138,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,201,161,156,209,150,131,245,181,158,227,114,101,236,154,138,244,216,196,248,230, + 206,239,208,178,188,135,102,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 200,149,123,210,159,115,248,208,192,241,128,114,235,94,80,227,95,88,228,115,108,238,169,151,249, + 218,193,245,218,170,208,135,90,184,127,95,212,208,200,212,208,200,212,208,200,212,208,200,207,138, + 87,245,204,157,242,173,140,229,95,82,233,130,93,240,167,97,233,159,85,213,122,81,221,126,116, + 237,193,158,244,197,140,194,122,63,212,208,200,212,208,200,212,208,200,188,128,82,236,167,87,251, + 189,155,237,107,91,241,156,103,242,220,93,226,206,86,237,217,84,227,177,79,207,90,66,212,102, + 89,236,136,100,233,144,72,173,106,65,212,208,200,212,208,200,204,127,61,238,171,85,243,131,104, + 230,95,73,249,207,112,204,150,62,196,100,71,196,119,69,189,119,70,203,88,67,209,88,66,204, + 86,56,204,88,36,190,99,44,212,208,200,207,179,155,227,148,71,233,131,62,235,83,59,224,85, + 58,238,175,76,222,171,71,239,183,86,230,184,86,217,163,83,212,118,62,202,77,58,193,80,54, + 202,89,38,214,123,53,177,144,122,200,173,152,233,133,63,235,85,36,238,70,47,232,70,56,210, + 78,53,214,139,58,196,137,57,181,94,50,194,83,56,216,138,82,191,75,51,198,71,42,230,122, + 56,225,135,61,172,137,122,217,179,171,214,101,48,227,64,25,233,57,29,231,59,49,221,71,61, + 231,126,87,206,93,57,201,79,59,232,135,73,222,159,69,184,58,45,217,74,41,246,129,58,204, + 110,50,180,148,138,212,208,200,191,102,57,240,92,55,229,54,22,227,35,38,215,60,32,235,148, + 54,243,183,50,242,179,66,229,157,62,179,76,24,202,33,34,239,82,34,236,106,51,177,91,52, + 212,208,200,212,208,200,183,127,90,223,93,59,244,75,38,225,43,25,225,19,27,207,35,18,199, + 64,29,193,75,25,190,36,26,191,21,15,224,35,28,247,64,46,217,80,47,164,103,81,212,208, + 200,212,208,200,212,208,200,184,84,69,224,62,40,244,40,33,242,25,38,224,15,35,206,15,29, + 195,10,23,195,13,26,213,14,23,242,34,39,232,46,43,175,72,60,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,182,73,64,227,36,40,248,23,49,250,18,59,232,16,56,208,10, + 42,209,7,34,232,22,50,214,36,51,178,58,60,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,180,101,97,182,44,59,211,20,57,224,17,68,216,21,62,201, + 15,51,187,39,65,161,90,92,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,186,141,133,180,132,128,175,126,125,181,134,134, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 18) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 7 1", + " c None", + "a c Black", + "b c #32373E", + "c c #414041", + "d c #303438", + "e c #808080", + "f c #ECECEB", + /* pixels */ + " e ", + " ed ", + " edd eddddde ", + " daadaaaaae ", + " edaaaaadee ", + " ddaaadde ", + " daaade ", + "edaadaaee ", + "edaaaaaaabbb ", + "edaaafcaaaaab ", + "edaaaaaaaaaab ", + "edaaaaaaaaaab ", + "edaaaaaaaaaab ", + "edaaaddaaaaa ", + "edaaad bbbb ", + "edaaae " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 19) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,100,41,9,100,41,9,192,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,100,41,9,100,41,9,192,192,192,0,0,0,8,3,0,1,0,0,13,5,1,54,22, + 4,192,192,192,100,41,9,100,41,9,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 100,41,9,192,192,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192, + 192,192,100,41,9,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,129,63, + 18,192,192,192,26,10,2,192,192,192,192,192,192,192,192,192,192,192,192,0,0,0,9,4,0, + 192,192,192,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,142,74,26,192, + 192,192,192,192,192,192,192,192,149,79,29,100,41,9,192,192,192,0,0,0,0,0,0,192,192, + 192,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,199,118,49,187,109,45, + 166,94,38,134,69,27,100,41,9,192,192,192,0,0,0,0,0,0,0,0,0,192,192,192,212, + 208,200,212,208,200,212,208,200,212,208,200,100,41,9,100,41,9,185,108,46,187,109,45,93,45, + 14,192,192,192,192,192,192,0,0,0,10,4,0,192,192,192,192,192,192,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,203,124,57,190,111,46,223,174,133,192, + 192,192,0,0,0,14,10,7,192,192,192,192,192,192,50,55,62,50,55,62,212,208,200,212,208, + 200,212,208,200,212,208,200,100,41,9,100,41,9,210,138,74,217,154,92,217,154,92,192,192,192, + 15,14,15,0,0,0,192,192,192,230,210,186,255,255,255,196,196,192,50,55,62,212,208,200,212, + 208,200,212,208,200,212,208,200,100,41,9,223,170,110,242,220,175,223,170,110,192,192,192,3,2, + 0,0,0,0,192,192,192,107,108,111,23,22,20,255,255,255,50,55,62,212,208,200,212,208,200, + 212,208,200,100,41,9,110,49,12,217,154,92,223,170,110,223,170,110,192,192,192,0,0,0,0, + 0,0,192,192,192,198,198,194,160,160,159,235,235,233,50,55,62,212,208,200,212,208,200,212,208, + 200,100,41,9,110,49,12,166,92,35,210,138,74,210,138,74,192,192,192,192,192,192,192,192,192, + 197,179,159,228,228,225,228,228,225,231,231,229,50,55,62,212,208,200,212,208,200,212,208,200,100, + 41,9,128,63,19,100,41,9,100,41,9,100,41,9,192,192,192,0,0,0,0,0,0,192,192, + 192,170,170,166,164,165,162,50,55,62,212,208,200,212,208,200,212,208,200,212,208,200,100,41,9, + 141,73,25,172,101,39,163,91,33,127,62,19,192,192,192,0,0,0,0,0,0,192,192,192,50, + 55,62,50,55,62,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,143,75, + 26,193,116,45,193,116,45,154,83,30,192,192,192,192,192,192,192,192,192,192,192,192,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 20) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 17 1", + " c None", + "a c Black", + "b c #0D1219", + "c c #263247", + "d c #080B0F", + "e c #FFFFFF", + "f c #B20000", + "g c #090C11", + "h c #272728", + "i c #161E2A", + "j c #07090E", + "k c #E50000", + "l c #1A2332", + "m c #18202D", + "o c #323233", + "p c #1F293B", + "q c #2C2C2D", + /* pixels */ + " ", + " eeeeeeeeeeeeee ", + "eejaaieeeejaaiee", + "ejfkkfieejfkkfie", + "edfkkfieedfkkfie", + "egfkkfmeegfkkfme", + "egfkkfmeegfkkfme", + "egfkkfmeegfkkfme", + "egfkkfieegfkkfie", + "ebffffleebffffle", + "eeoqoheeeeoqohee", + "epffffceepffffce", + "ebkkkkpeebkkkkpe", + "eebggpeeeebggpee", + " eeeeeeeeeeeeee ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 21) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 17 1", + " c None", + "a c Black", + "b c #0D1219", + "c c #263247", + "d c #080B0F", + "e c #FFFFFF", + "f c #B20000", + "g c #090C11", + "h c #272728", + "i c #161E2A", + "j c #07090E", + "k c #E50000", + "l c #1A2332", + "m c #18202D", + "o c #323233", + "p c #1F293B", + "q c #2C2C2D", + /* pixels */ + " ", + " eeeeeeee ", + "eeejaaieee ", + "eejfkkfiee ", + "eedfkkfiee ", + "eegfkkfmee ", + "eegfkkfmee ", + "eegfkkfmee ", + "eegfkkfiee ", + "eebfffflee ", + "eeeoqoheee ", + "eepffffcee ", + "eebkkkkpee ", + "eeebggpeee ", + " eeeeeeee ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 22) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 17 1", + " c None", + "a c #0D1219", + "b c #263247", + "c c #080B0F", + "d c #FFFFFF", + "e c #090C11", + "f c #272728", + "g c #161E2A", + "h c #07090E", + "i c #1A2332", + "j c #10151F", + "k c #18202D", + "l c #D1761A", + "m c #F0981B", + "o c #323233", + "p c #1F293B", + "q c #2C2C2D", + /* pixels */ + " ", + " dddddddd ", + "dddjecpddd ", + "ddjmmmmpdd ", + "ddillllbdd ", + "dddoqofddd ", + "ddallllidd ", + "ddelmmlgdd ", + "ddelmmlkdd ", + "ddelmmlkdd ", + "ddelmmlgdd ", + "ddclmmlgdd ", + "ddhlmmlgdd ", + "dddhhhgddd ", + " dddddddd ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 23) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 17 1", + " c None", + "a c #0D1219", + "b c #263247", + "c c #080B0F", + "d c #FFFFFF", + "e c #090C11", + "f c #272728", + "g c #59B200", + "h c #161E2A", + "i c #07090E", + "j c #1A2332", + "k c #10151F", + "l c #18202D", + "m c #72E500", + "o c #323233", + "p c #1F293B", + "q c #2C2C2D", + /* pixels */ + " ", + " dddddddd ", + "dddkecpddd ", + "ddkmmmmpdd ", + "ddjggggbdd ", + "dddoqofddd ", + "ddaggggjdd ", + "ddegmmghdd ", + "ddegmmgldd ", + "ddegmmgldd ", + "ddegmmghdd ", + "ddcgmmghdd ", + "ddigmmghdd ", + "dddiiihddd ", + " dddddddd ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 24) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 17 1", + " c None", + "a c #0D1219", + "b c #263247", + "c c #080B0F", + "d c #FFFFFF", + "e c #090C11", + "f c #272728", + "g c #59B200", + "h c #161E2A", + "i c #07090E", + "j c #1A2332", + "k c #10151F", + "l c #18202D", + "m c #72E500", + "o c #323233", + "p c #1F293B", + "q c #2C2C2D", + /* pixels */ + " ", + " dddddddddddddd ", + "ddkecpddddkecpdd", + "dkmmmmpddkmmmmpd", + "djggggbddjggggbd", + "ddoqofddddoqofdd", + "daggggjddaggggjd", + "degmmghddegmmghd", + "degmmglddegmmgld", + "degmmglddegmmgld", + "degmmghddegmmghd", + "dcgmmghddcgmmghd", + "digmmghddigmmghd", + "ddiiihddddiiihdd", + " dddddddddddddd ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 25) + { + static const unsigned char data[] = + { + 212,208,200,0,81,156,0,81,156,0,81,156,212,208,200,0,81,156,0,81,156,0,81,156,212, + 208,200,0,71,139,0,71,139,0,71,139,212,208,200,0,71,139,0,64,125,0,53,107,212,208, + 200,0,81,156,168,199,228,184,207,227,0,81,156,180,205,227,168,199,228,174,202,228,0,81,156, + 168,199,228,168,199,228,160,196,228,0,71,139,160,196,228,168,199,228,0,53,107,212,208,200,0, + 81,156,228,237,245,0,81,156,212,208,200,0,81,156,219,233,246,0,81,156,212,208,200,0,81, + 156,206,227,246,0,71,139,212,208,200,0,71,139,191,220,247,0,53,107,212,208,200,0,81,156, + 228,237,245,152,188,220,0,81,156,149,187,220,236,244,252,149,187,220,0,81,156,143,184,221,220, + 237,252,140,182,221,0,71,139,140,182,221,196,228,252,0,53,107,212,208,200,0,81,156,243,247, + 251,243,247,251,189,214,236,236,244,252,236,244,252,230,242,252,180,210,237,220,237,252,220,237,252, + 213,235,252,170,205,237,204,229,253,196,228,252,0,53,107,212,208,200,0,81,156,236,244,252,236, + 244,252,236,244,252,236,244,252,230,242,252,230,242,252,220,237,252,220,237,252,213,235,252,209,231, + 253,204,229,253,196,228,252,188,223,253,0,53,107,212,208,200,0,81,156,236,244,252,129,178,222, + 44,125,199,124,178,226,91,154,212,44,125,199,44,125,199,44,125,199,84,151,212,112,171,221,132, + 184,230,196,228,252,181,221,252,0,53,107,212,208,200,0,81,156,230,242,252,230,242,252,230,242, + 252,230,242,252,220,237,252,220,237,252,213,235,252,213,235,252,204,229,253,196,228,252,196,228,252, + 188,223,253,174,219,251,0,53,107,212,208,200,0,81,156,220,237,252,123,175,222,91,154,212,44, + 125,199,44,125,199,44,125,199,84,151,212,153,198,236,196,228,252,189,226,250,188,223,253,181,221, + 252,163,212,250,0,53,107,212,208,200,0,71,139,213,235,252,213,235,252,213,235,252,207,232,251, + 204,229,253,204,229,253,196,228,252,196,228,252,189,226,250,181,221,252,181,221,252,171,215,252,155, + 210,250,0,53,107,212,208,200,0,71,139,204,229,253,112,171,221,84,151,212,36,122,199,36,122, + 199,76,148,212,36,122,199,36,122,199,70,146,212,96,163,222,139,195,239,163,212,250,146,206,250, + 0,53,107,212,208,200,0,71,139,196,228,252,189,226,250,189,226,250,188,223,253,181,221,252,181, + 221,252,174,219,251,174,219,251,163,212,250,163,212,250,163,212,250,155,210,250,137,202,250,0,53, + 107,212,208,200,0,62,122,181,221,252,70,146,212,36,122,199,36,122,199,70,146,212,107,175,228, + 64,143,212,31,120,199,30,119,199,61,141,212,81,158,221,93,167,228,124,195,248,0,53,107,212, + 208,200,0,62,122,149,208,248,146,206,250,137,202,250,139,203,247,139,203,247,134,203,249,134,203, + 249,134,203,249,130,199,249,130,199,249,124,195,248,117,191,246,100,179,243,0,53,107,212,208,200, + 0,62,122,109,185,242,109,185,242,109,185,242,104,181,239,104,181,239,109,185,242,109,185,242,109, + 185,242,105,183,243,100,179,243,100,179,243,94,173,241,87,168,238,0,53,107,212,208,200,0,53, + 107,0,53,107,0,53,107,0,53,107,0,53,107,0,53,107,0,53,107,0,53,107,0,53,107, + 0,53,107,0,53,107,0,53,107,0,53,107,0,53,107,0,53,107 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 26) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 3 1", + " c None", + "a c #00FFFF", + "b c #0000FF", + /* pixels */ + " bbba ", + " bba ", + " ba ", + " ba ", + " bbba ", + "bbabba ", + " bbba ", + " ba ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + return wxNullBitmap; +} + +wxBitmap dlStatusImages( size_t index ) +{ + if (index == 0) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 16 1", + " c None", + "a c Black", + "b c #110000", + "c c #6F4848", + "d c #7F0000", + "e c #220000", + "f c #444444", + "g c #888888", + "h c #8C0000", + "i c #4C4040", + "j c #C10000", + "k c #191919", + "l c #2A2A2A", + "m c #FF0000", + "n c #666666", + "p c #333333", + /* pixels */ + " h ", + " dma ", + " dmjma ", + " dmjhjma ", + " amjhlhjma ", + " aapanpaaa ", + " aga ", + " kpk ana ", + " pnp ppa ", + " fgi ", + " bebanabeb ", + " cmjhphjmi ", + " cmjhjmi ", + " cmjmi ", + " cmi ", + " h " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 1) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 17 1", + " c None", + "a c #444444", + "b c #114C11", + "c c #888888", + "d c #790000", + "e c #008000", + "f c #007700", + "g c #191919", + "h c #00B700", + "i c #B70000", + "j c #2A2A2A", + "k c #FF0000", + "l c #666666", + "m c #002A00", + "o c #00FF00", + "p c #333333", + "q c #001500", + /* pixels */ + " d ", + " dkd ", + " dkikd ", + " dkidikd ", + " dkidjdikd ", + " l ", + " c ", + " gpg l ", + " plp pp ", + " aca ", + " qmqlllqmq ", + " eohbpbhoe ", + " eohfhoe ", + " eohoe ", + " eoe ", + " e " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 2) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 16 1", + " c None", + "a c #110000", + "b c #6F4848", + "c c #220000", + "d c #444444", + "e c #888888", + "f c #008000", + "g c #770000", + "h c #191919", + "i c #BB0000", + "j c #00AE00", + "k c #2A2A2A", + "l c #FF0000", + "m c #666666", + "o c #00FF00", + "p c #333333", + /* pixels */ + " f ", + " fof ", + " fojof ", + " fojfjof ", + " fojfkfjof ", + " mp ", + " e ", + " hph m ", + " pmp pp ", + " ded ", + " acammmaca ", + " bligpgilg ", + " bligilg ", + " glilg ", + " glg ", + " g " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 3) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 12 1", + " c None", + "a c #006F00", + "b c #888888", + "c c #191919", + "d c #404F40", + "e c #00D400", + "f c #666666", + "g c #002A00", + "i c #00FF00", + "j c #333333", + "k c #001500", + "l c #00CA00", + /* pixels */ + " a ", + " aia ", + " ailia ", + " ailalia ", + " aila alia ", + " fj ", + " b ", + " cjc f ", + " jfj jj ", + " dbd ", + " kgk f kgk ", + " aila aeia ", + " ailalia ", + " ailia ", + " aia ", + " a " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + return wxNullBitmap; +} + +wxBitmap connImages( size_t index ) +{ + if (index == 0) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 23 1", + " c None", + "a c #6C0C0C", + "b c #A81313", + "c c #F05151", + "d c #6A0C0C", + "e c #FFFFFF", + "f c #F7ADAD", + "g c #C11515", + "h c #C41616", + "i c #7A0D0D", + "j c #9C1010", + "k c #B21414", + "l c #FBD8D8", + "m c #680B0B", + "n c #E51A1A", + "o c #ED2222", + "p c #C91616", + "q c #EF4848", + "r c #560909", + "s c #DA1919", + "u c #F59191", + "v c #F04C4C", + "w c #7B0D0D", + /* pixels */ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " cfelc ", + " vuqn ", + " oqnp ", + " ksgwb ", + " dhi i ", + " aj ", + " rm ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 1) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 13 1", + " c None", + "a c #4C4907", + "b c #E4DB13", + "c c #F0E943", + "d c #F0E945", + "e c #ECE31A", + "f c #FFFFFF", + "g c #EFE73B", + "i c #6D6909", + "j c #DAD112", + "k c #5E5A08", + "l c #FAF8C1", + "m c #605C08", + /* pixels */ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " clfdc ", + " gdgb ", + " egbd ", + " dddij ", + " kdi j ", + " md ", + " ak ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 2) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 12 1", + " c None", + "a c #41280D", + "b c #BD7625", + "c c #5D3A12", + "d c #513210", + "e c #CD8029", + "f c #D5852A", + "g c #523310", + "h c #F19730", + "j c #C77C27", + "k c #FE9F32", + "l c #D7862B", + /* pixels */ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " lhkll ", + " flfj ", + " efjl ", + " lllcb ", + " dlc b ", + " gl ", + " ad ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 3) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 13 1", + " c None", + "a c #126547", + "b c #134943", + "c c #CBFFBC", + "d c #38F639", + "e c #2ACB2A", + "f c #105835", + "h c #16632F", + "i c #43FC3F", + "j c #259230", + "k c #1B8136", + "l c #115342", + "m c #12542F", + /* pixels */ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " eciii ", + " diii ", + " iiei ", + " jiihi ", + " mia e ", + " fk ", + " bl ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 4) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 23 1", + " c None", + "a c #A81313", + "b c #F05151", + "c c #650B0B", + "d c #F6A3A3", + "e c #DD1919", + "f c #FFFFFF", + "g c #630B0B", + "h c #F15858", + "i c #7A0D0D", + "j c #9C1010", + "k c #F16060", + "l c #EC1B1B", + "m c #E51A1A", + "n c #F8B3B3", + "o c #ED2222", + "p c #A01212", + "q c #C91616", + "s c #7B0D0D", + "t c #F37F7F", + "u c #BA1515", + "v c #FCDEDE", + "w c #971010", + /* pixels */ + " ", + " gg ", + " ji ", + " t cqw ", + " vkloa ", + " fdhe ", + " nkmp ", + " bmqus ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 5) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 15 1", + " c None", + "a c #E4DB13", + "b c #F0E943", + "c c #F0E945", + "d c #FDFCE2", + "e c #FBF9CC", + "f c #555207", + "g c #F3ED6F", + "h c #F1EA52", + "i c #5B5708", + "j c #948E0C", + "k c #9D970D", + "m c #6D6909", + "n c #B2AB0F", + "o c #EBE213", + /* pixels */ + " ", + " if ", + " cc ", + " g icc ", + " dhocc ", + " cccc ", + " eckj ", + " bacnm ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 6) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 9 1", + " c None", + "a c #25853C", + "b c #134943", + "c c #31A941", + "d c #2ACB2A", + "f c #16632F", + "g c #1F812F", + "h c #43FC3F", + "i c #0E5245", + /* pixels */ + " ", + " ib ", + " hc ", + " h hhh ", + " hdhha ", + " hhhh ", + " hhdg ", + " hhhhf ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + return wxNullBitmap; +} + +wxBitmap moreImages( size_t index ) +{ + if (index == 0) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,128,67,11,128,67,11, + 128,67,11,128,67,11,128,67,11,128,67,11,128,67,11,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,128,67,11,192,133,75,192,133,75,179,120, + 61,166,107,50,166,107,50,128,67,11,128,67,11,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,128,67,11,128,67,11,128,67,11,128,67,11,128,67,11,128, + 67,11,128,67,11,148,88,32,128,67,11,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,128,67,11,245,193,137,226,168,106,219,162,100,212,156,94,212,156,94, + 128,67,11,148,88,32,128,67,11,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,128,67,11,226,168,106,219,162,100,212,156,94,212,156,94,212,156,94,128,67, + 11,148,88,32,125,66,12,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,125,66,12,212,156,94,200,146,86,200,146,86,200,146,86,200,146,86,125,66,12,143, + 85,31,125,66,12,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,114,58,6,183,131,75,183,131,75,183,131,75,183,131,75,183,131,75,114,58,6,135,80,29, + 114,58,6,212,208,200,212,208,200,115,115,115,115,115,115,115,115,115,105,105,105,121,71,20,161, + 106,39,161,106,39,161,106,39,161,106,39,161,106,39,161,106,39,128,67,11,109,52,0,152,93, + 30,152,93,30,212,208,200,205,205,205,241,241,241,205,205,205,138,138,138,166,107,50,239,183,123, + 253,198,137,255,223,189,255,234,211,255,241,226,252,212,168,161,106,39,161,106,39,226,168,106,254, + 209,159,109,52,0,115,115,115,115,115,115,115,115,115,105,105,105,166,107,50,221,164,105,232,175, + 115,201,143,84,157,95,36,143,80,22,125,66,12,198,139,80,254,221,183,254,209,159,109,52,0, + 212,208,200,85,85,85,85,85,85,75,75,75,68,68,68,166,107,50,201,143,84,230,174,113,250, + 203,150,254,221,183,254,230,201,254,230,201,254,221,183,214,164,112,109,52,0,212,208,200,212,208, + 200,75,75,75,75,75,75,75,75,75,43,43,43,114,62,14,109,52,0,192,133,75,234,177,117, + 248,193,132,232,175,115,192,133,75,109,52,0,109,52,0,212,208,200,212,208,200,212,208,200,43, + 43,43,43,43,43,43,43,43,212,208,200,212,208,200,212,208,200,109,52,0,109,52,0,109,52, + 0,109,52,0,109,52,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 1) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,27,73,140,27,73,140,27,73,140,27,73,140,27, + 73,140,27,73,140,27,73,140,27,73,140,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,27,73,140,27,73,140,59,107,179,77,129,205,95,146,225,95,146,225,95,146,225, + 95,146,225,77,129,205,59,107,179,27,73,140,27,73,140,212,208,200,212,208,200,212,208,200,27, + 73,140,49,97,168,81,133,210,95,146,225,101,153,233,101,153,233,73,120,188,101,153,233,101,153, + 233,101,153,233,101,153,233,95,146,225,59,107,179,27,73,140,212,208,200,27,73,140,49,97,168, + 95,146,225,101,153,233,101,153,233,101,153,233,77,125,195,82,65,0,82,132,206,101,153,233,101, + 153,233,111,162,243,111,162,243,111,162,243,77,125,195,27,73,140,24,65,124,70,121,196,101,153, + 233,101,153,233,101,153,233,77,125,195,88,71,0,178,167,63,79,92,86,95,143,218,111,162,243, + 111,162,243,111,162,243,121,171,252,121,171,252,21,56,107,21,56,107,84,137,215,101,153,233,101, + 153,233,80,127,197,92,74,0,178,167,63,212,193,51,92,74,0,77,125,195,111,162,243,111,162, + 243,121,171,252,121,171,252,110,157,234,18,48,91,18,47,90,62,105,170,101,153,233,82,132,206, + 92,74,0,178,167,63,239,214,41,239,214,41,179,172,74,79,92,86,110,157,234,121,171,252,121, + 171,252,121,171,252,69,110,170,15,39,74,18,47,90,21,56,107,62,103,165,92,74,0,178,167, + 63,255,230,60,255,230,60,255,230,60,237,222,74,92,74,0,92,128,174,121,171,252,98,146,220, + 62,100,157,15,39,74,15,39,74,18,47,90,50,96,164,56,61,45,179,164,46,245,228,63,255, + 244,75,255,240,71,255,237,68,246,235,77,160,163,84,86,85,48,45,79,131,15,39,74,15,39, + 74,24,65,124,15,39,74,18,47,90,63,95,132,82,65,0,108,88,0,173,149,10,204,185,33, + 245,232,66,255,244,75,255,244,75,215,207,69,49,52,37,15,39,74,21,56,107,27,73,140,27, + 73,140,15,39,74,18,47,90,67,81,82,145,121,0,159,135,0,119,99,0,92,74,0,92,74, + 0,92,74,0,92,74,0,82,65,0,49,52,37,21,56,107,24,65,124,27,73,140,24,65,124, + 15,39,74,212,208,200,82,65,0,167,142,0,185,158,0,185,158,0,185,158,0,185,158,0,179, + 153,0,172,146,0,135,114,0,82,65,0,21,56,107,24,65,124,21,56,107,15,39,74,212,208, + 200,212,208,200,82,65,0,179,153,0,185,158,0,185,158,0,185,158,0,185,158,0,185,158,0, + 185,158,0,185,158,0,82,65,0,18,47,90,15,39,74,15,39,74,212,208,200,212,208,200,212, + 208,200,82,65,0,82,65,0,82,65,0,130,108,0,172,146,0,185,158,0,185,158,0,185,158, + 0,185,158,0,82,65,0,15,39,74,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,82,65,0,82,65,0,82,65,0,82,65,0,82,65,0,82, + 65,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + return wxNullBitmap; +} + +wxBitmap amuleSpecial( size_t index ) +{ + if (index == 0) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 1 1", + "a c Black", + /* pixels */ + "aaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaa" + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 1) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 255,141,0,255,155,44,255,147,40,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,213,219,245,167,180,221,212,208,200,255,159,16,255,220, + 149,239,211,89,245,145,4,189,84,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,194,198,216,255,255,255,255,255,255,230,238,255,234,172,96,214,187,56,225, + 170,5,250,142,11,227,100,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,196,203,220,255,255,255,239,245,255,242,179,122,245,167,91,250,230,153,253,225,119,230,203,108, + 245,132,36,252,110,0,130,51,0,212,208,200,212,208,200,212,208,200,212,208,200,200,205,219,255, + 255,255,253,185,116,254,179,95,250,244,177,247,245,142,244,224,119,242,214,111,253,188,83,250,132, + 38,255,104,0,189,84,0,212,208,200,212,208,200,212,208,200,203,206,211,255,255,255,255,150,34, + 253,255,190,249,255,151,247,252,149,247,235,133,243,225,123,249,198,94,251,153,56,248,121,19,255, + 101,0,233,100,0,212,208,200,212,208,200,240,240,240,255,255,255,255,255,255,254,179,95,253,255, + 179,249,251,148,246,246,149,247,235,133,251,203,98,254,177,78,248,149,44,255,129,16,255,92,0, + 255,116,0,156,66,16,212,208,200,231,235,238,205,219,234,238,252,255,255,242,232,251,205,129,249, + 255,151,246,246,149,253,225,119,255,202,98,247,168,64,255,145,20,255,140,8,219,182,134,176,206, + 253,179,98,50,212,208,200,212,208,200,255,145,7,224,155,85,190,200,229,236,166,101,255,255,173, + 253,250,143,255,222,113,248,185,75,255,175,41,235,203,147,202,219,255,195,204,231,190,200,229,181, + 156,152,130,44,0,212,208,200,255,186,58,255,228,152,255,240,45,237,160,33,237,219,156,249,244, + 126,244,212,104,249,227,169,232,244,255,217,224,240,217,224,240,208,221,241,176,134,112,186,103,52, + 68,15,0,212,208,200,212,208,200,255,134,20,253,199,136,255,230,42,231,160,70,255,255,198,255, + 255,255,255,255,255,245,250,255,245,250,255,209,176,158,196,109,50,130,44,0,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,236,115,12,243,182,123,237,160,33,255,255,255,255,255,255, + 255,255,255,247,228,215,213,127,62,167,70,10,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,211,95,0,226,149,83,233,186,137,255,255,255,226,149, + 83,195,91,19,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,250,175,112,206,91,10,0,0,0,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,0,0,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 2) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 255,79,1,252,57,48,252,49,44,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,250,204,254,228,137,251,212,208,200,252,85,20,251,153, + 190,251,118,77,249,71,1,190,18,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,242,161,249,255,255,255,255,255,255,253,233,253,252,78,135,245,77,25,226, + 98,4,254,66,8,228,32,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,243,166,250,255,255,255,253,241,253,253,111,181,253,83,135,252,152,171,252,145,120,249,89,112, + 253,29,34,252,42,0,130,6,0,212,208,200,212,208,200,212,208,200,212,208,200,245,170,250,255, + 255,255,253,117,171,253,97,137,250,178,178,251,205,139,252,135,112,252,105,102,253,83,91,253,35, + 40,255,43,1,190,18,0,212,208,200,212,208,200,212,208,200,245,166,248,255,255,255,252,63,38, + 249,253,193,250,254,152,251,238,151,252,166,128,252,134,114,253,91,99,253,55,69,254,31,14,255, + 37,1,234,33,0,212,208,200,212,208,200,253,227,252,255,255,255,255,255,255,253,97,137,249,253, + 181,251,233,149,251,207,145,252,166,128,252,98,98,253,79,95,253,39,39,252,53,20,255,31,1, + 255,49,1,162,10,25,212,208,200,251,217,253,246,187,253,251,243,250,253,235,253,253,127,171,250, + 254,152,251,207,145,252,145,120,251,103,106,253,59,68,252,67,24,253,68,11,249,105,190,235,176, + 254,210,20,74,212,208,200,212,208,200,253,78,9,250,60,123,241,168,252,252,86,152,247,253,175, + 251,230,145,251,143,117,253,75,71,252,93,44,252,130,199,247,205,253,244,174,252,241,168,252,235, + 99,218,130,3,0,212,208,200,252,98,62,250,158,182,252,221,48,252,62,18,251,143,196,252,208, + 124,252,107,96,252,166,211,253,235,253,250,205,253,250,205,253,247,197,253,230,58,171,220,18,75, + 68,0,0,212,208,200,212,208,200,252,56,24,253,137,194,252,196,46,251,51,84,244,253,201,255, + 255,255,255,255,255,254,246,253,254,246,253,247,121,222,232,14,65,130,3,0,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,246,25,2,253,113,182,252,62,18,255,255,255,255,255,255, + 255,255,255,254,208,249,248,28,85,166,12,15,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,25,0,251,59,122,252,118,197,255,255,255,251,59, + 122,202,12,21,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,254,108,173,208,18,8,0,0,0,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,0,0,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 3) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 4 1", + " c None", + "a c #FFFFFF", + "b c #000080", + "c c #BFBFDF", + /* pixels */ + " ", + " bbbbbbbbbbbb ", + " baaaaaaaaaaaab ", + " baaaaaaaaaaaab ", + " baabbcaacbbaab ", + " baabbbccbbbaab ", + " baacbbbbbbcaab ", + " baaacbbbbcaaab ", + " baaacbbbbcaaab ", + " baacbbbbbbcaab ", + " baabbbccbbbaab ", + " baabbcaacbbaab ", + " baaaaaaaaaaaab ", + " baaaaaaaaaaaab ", + " bbbbbbbbbbbb ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 4) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 5 1", + " c None", + "a c #FFFFFF", + "b c #000080", + "c c #E2D704", + "d c #BFBFDF", + /* pixels */ + " ", + " bbbbbbbbbbbb ", + " bccccccccccccb ", + " bcaaaaaaaaaacb ", + " bcabbdaadbbacb ", + " bcabbbddbbbacb ", + " bcadbbbbbbdacb ", + " bcaadbbbbdaacb ", + " bcaadbbbbdaacb ", + " bcadbbbbbbdacb ", + " bcabbbddbbbacb ", + " bcabbdaadbbacb ", + " bcaaaaaaaaaacb ", + " bccccccccccccb ", + " bbbbbbbbbbbb ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 5) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,100,41,9,100,41,9,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,100,41,9,100,41,9,128,63,18,212,208,200,100,41,9,100,41,9,100,41,9,100,41, + 9,100,41,9,100,41,9,100,41,9,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 100,41,9,188,109,45,128,63,18,100,41,9,242,220,175,233,195,143,223,170,110,206,130,64,172, + 98,38,100,41,9,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,127,62, + 19,165,92,35,100,41,9,242,220,175,223,170,110,214,148,85,188,109,45,100,41,9,100,41,9, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,142,74,25,206, + 130,64,223,170,110,214,148,85,149,79,29,100,41,9,100,41,9,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,199,118,49,188,109,45, + 168,94,37,134,69,27,100,41,9,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,100,41,9,100,41,9,188,109,45,188,109,45,93,45, + 14,222,170,125,180,123,80,128,64,23,100,41,9,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,203,124,57,188,109,45,223,174,133,255, + 255,255,212,208,200,147,106,72,167,96,42,50,55,62,50,55,62,50,55,62,212,208,200,212,208, + 200,212,208,200,212,208,200,100,41,9,100,41,9,210,138,74,217,154,92,217,154,92,235,235,234, + 65,64,65,194,119,57,204,145,78,230,210,186,255,255,255,197,197,193,50,55,62,212,208,200,212, + 208,200,212,208,200,212,208,200,100,41,9,223,170,110,242,220,175,223,170,110,217,154,92,180,104, + 44,191,119,50,193,140,87,107,108,111,23,22,20,255,255,255,50,55,62,212,208,200,212,208,200, + 212,208,200,100,41,9,110,49,12,217,154,92,223,170,110,223,170,110,210,138,74,180,104,44,168, + 94,37,193,160,128,197,197,193,160,160,158,235,235,234,50,55,62,212,208,200,212,208,200,212,208, + 200,100,41,9,110,49,12,168,94,37,210,138,74,210,138,74,199,118,49,172,98,38,168,94,37, + 197,179,159,229,229,226,229,229,226,229,229,226,50,55,62,212,208,200,212,208,200,212,208,200,100, + 41,9,128,63,18,100,41,9,100,41,9,100,41,9,100,41,9,100,41,9,114,116,118,160,160, + 158,170,170,166,164,165,162,50,55,62,212,208,200,212,208,200,212,208,200,212,208,200,100,41,9, + 142,74,25,172,98,38,165,92,35,127,62,19,100,41,9,212,208,200,50,55,62,50,55,62,50, + 55,62,50,55,62,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,142,74, + 25,193,116,45,188,109,45,154,83,30,100,41,9,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 6) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,59,59,59,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,59,59,59,59,59,59,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,59,59,59,59,59,59,82,82,82,212,208,200,59,59,59,59,59,59,59,59,59,59,59, + 59,59,59,59,59,59,59,59,59,59,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 59,59,59,131,131,131,82,82,82,59,59,59,223,223,223,201,201,201,180,180,180,148,148,148,115, + 115,115,59,59,59,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,59,59,59,82,82, + 82,109,109,109,59,59,59,223,223,223,180,180,180,164,164,164,131,131,131,59,59,59,59,59,59, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,59,59,59,93,93,93,148, + 148,148,180,180,180,164,164,164,100,100,100,59,59,59,59,59,59,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,59,59,59,137,137,137,131,131,131, + 109,109,109,93,93,93,59,59,59,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,59,59,59,59,59,59,131,131,131,131,131,131,59,59, + 59,185,185,185,131,131,131,82,82,82,59,59,59,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,59,59,59,148,148,148,131,131,131,185,185,185,255, + 255,255,212,208,200,115,115,115,115,115,115,54,54,54,54,54,54,54,54,54,212,208,200,212,208, + 200,212,208,200,212,208,200,59,59,59,59,59,59,156,156,156,168,168,168,168,168,168,235,235,235, + 66,66,66,137,137,137,164,164,164,213,213,213,255,255,255,196,196,196,54,54,54,212,208,200,212, + 208,200,212,208,200,212,208,200,59,59,59,180,180,180,223,223,223,180,180,180,164,164,164,125,125, + 125,137,137,137,148,148,148,109,109,109,23,23,23,255,255,255,54,54,54,212,208,200,212,208,200, + 212,208,200,59,59,59,66,66,66,168,168,168,180,180,180,180,180,180,156,156,156,131,131,131,115, + 115,115,164,164,164,196,196,196,164,164,164,235,235,235,54,54,54,212,208,200,212,208,200,212,208, + 200,59,59,59,66,66,66,109,109,109,156,156,156,156,156,156,137,137,137,115,115,115,109,109,109, + 180,180,180,228,228,228,223,223,223,235,235,235,59,59,59,212,208,200,212,208,200,212,208,200,59, + 59,59,82,82,82,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,115,115,115,164,164, + 164,168,168,168,164,164,164,54,54,54,212,208,200,212,208,200,212,208,200,212,208,200,59,59,59, + 93,93,93,115,115,115,109,109,109,82,82,82,59,59,59,212,208,200,54,54,54,54,54,54,54, + 54,54,54,54,54,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,59,59,59,100,100, + 100,137,137,137,137,137,137,100,100,100,59,59,59,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 7) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,98,78,9,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,98,78,9,98,78,9,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,98,78,9,98,78,9,127,111,18,212,208,200,98,78,9,98,78,9,98,78,9,98,78, + 9,98,78,9,98,78,9,98,78,9,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 98,78,9,186,171,45,127,111,18,98,78,9,234,241,174,231,232,143,222,218,109,205,190,64,171, + 157,38,98,78,9,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,98,78,9,126,107, + 19,164,147,35,98,78,9,234,241,174,222,218,109,213,202,84,186,171,45,98,78,9,98,78,9, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,98,78,9,140,123,25,205, + 190,64,222,218,109,213,202,84,148,130,29,98,78,9,98,78,9,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,98,78,9,198,183,49,186,171,45, + 166,150,37,133,114,26,98,78,9,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,98,78,9,98,78,9,186,171,45,186,171,45,92,78, + 13,221,211,124,179,166,80,127,108,22,98,78,9,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,98,78,9,202,187,57,186,171,45,222,213,133,255, + 255,255,150,8,249,146,138,71,165,149,42,50,55,61,50,55,61,50,55,61,212,208,200,212,208, + 200,212,208,200,212,208,200,98,78,9,98,78,9,209,198,74,216,208,91,216,208,91,234,234,233, + 64,63,64,193,178,56,203,199,78,229,229,186,255,255,255,195,196,193,50,55,61,212,208,200,212, + 208,200,212,208,200,212,208,200,98,78,9,222,218,109,234,241,174,222,218,109,216,208,91,179,162, + 44,190,178,49,192,186,87,107,108,110,22,22,19,255,255,255,50,55,61,212,208,200,212,208,200, + 212,208,200,98,78,9,109,92,12,216,208,91,222,218,109,222,218,109,209,198,74,179,162,44,166, + 150,37,192,187,127,195,196,193,159,159,158,234,234,233,50,55,61,212,208,200,212,208,200,212,208, + 200,98,78,9,109,92,12,166,150,37,209,198,74,209,198,74,198,183,49,171,157,38,166,150,37, + 196,195,159,227,228,225,227,228,225,227,228,225,50,55,61,212,208,200,212,208,200,212,208,200,98, + 78,9,127,111,18,98,78,9,98,78,9,98,78,9,98,78,9,98,78,9,114,116,117,159,159, + 158,168,169,166,163,164,161,50,55,61,212,208,200,212,208,200,212,208,200,212,208,200,98,78,9, + 140,123,25,171,157,38,164,147,35,126,107,19,98,78,9,212,208,200,50,55,61,50,55,61,50, + 55,61,50,55,61,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,98,78,9,140,123, + 25,192,180,45,186,171,45,153,137,30,98,78,9,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 8) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "13 7 3 1", + " c None", + "a c #FFFFFF", + "b c #808080", + /* pixels */ + "bbbbbbbbbbbba", + " b a ", + " b a ", + " b a ", + " b a ", + " b a ", + " a " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 9) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "13 7 3 1", + " c None", + "a c #FFFFFF", + "b c #808080", + /* pixels */ + " b ", + " b a ", + " b a ", + " b a ", + " b a ", + " b a ", + "baaaaaaaaaaaa" + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 10) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,108,95,87,108,95,87,108,95,87,108,95,87,108,95,87,108,95,87,108,95,87, + 108,95,87,108,95,87,108,95,87,108,95,87,108,95,87,212,208,200,212,208,200,212,208,200,108, + 95,87,188,169,151,231,208,185,221,199,177,221,199,177,210,189,168,210,189,168,196,177,157,196,177, + 157,183,165,146,183,165,146,183,165,146,158,142,126,81,72,72,212,208,200,108,95,87,188,169,151, + 231,208,185,123,140,99,71,89,63,71,89,63,72,93,62,72,93,62,72,93,62,72,93,62,72, + 93,62,72,93,62,135,135,107,183,165,146,149,134,121,81,72,72,108,95,87,231,208,185,123,137, + 100,71,89,63,47,117,45,51,127,42,51,127,42,51,127,42,51,127,42,51,127,42,51,127,42, + 59,113,50,66,99,57,123,137,100,183,165,146,81,72,72,108,95,87,231,208,185,71,89,63,44, + 108,48,35,132,37,88,195,61,20,152,25,20,152,25,20,152,25,20,152,25,20,152,25,20,152, + 25,47,122,43,57,99,56,183,165,146,81,72,72,108,95,87,210,189,168,69,84,64,44,108,48, + 74,175,57,183,255,119,85,186,64,16,140,28,16,140,28,16,140,28,16,140,28,16,140,28,78, + 181,61,56,96,56,175,157,139,81,72,72,108,95,87,210,189,168,69,82,65,62,138,55,155,235, + 99,58,163,50,183,255,119,59,165,51,12,129,31,12,129,31,12,129,31,50,158,47,183,255,119, + 56,93,57,175,157,139,81,72,72,108,95,87,196,177,157,68,81,65,103,172,72,45,149,47,10, + 121,33,57,158,51,157,237,101,45,150,47,10,121,33,39,145,44,155,234,99,45,149,47,55,90, + 58,175,157,139,81,72,72,108,95,87,196,177,157,68,80,66,54,121,55,8,114,35,8,114,35, + 8,114,35,45,146,49,133,219,87,52,152,52,132,217,86,44,144,48,8,114,35,54,88,59,166, + 149,132,81,72,72,108,95,87,183,165,146,67,78,66,38,92,52,5,108,36,5,108,36,5,108, + 36,5,108,36,36,135,47,109,198,76,36,136,47,5,108,36,5,108,36,53,85,59,166,149,132, + 81,72,72,108,95,87,183,165,146,118,124,103,64,79,65,3,102,39,3,102,39,3,102,39,3, + 102,39,3,102,39,28,124,47,3,102,39,3,102,39,38,88,53,118,124,103,166,149,132,81,72, + 72,108,95,87,149,134,119,183,165,146,117,123,103,51,81,60,51,81,60,51,81,60,51,81,60, + 51,81,60,51,81,60,51,81,60,51,81,60,117,123,103,166,149,132,137,123,113,81,72,72,212, + 208,200,81,72,72,137,123,113,183,165,146,183,165,146,183,165,146,183,165,146,175,157,139,175,157, + 139,175,157,139,166,149,132,166,149,132,166,149,132,137,123,113,81,72,72,212,208,200,212,208,200, + 212,208,200,81,72,72,81,72,72,81,72,72,81,72,72,81,72,72,81,72,72,81,72,72,81, + 72,72,81,72,72,81,72,72,81,72,72,81,72,72,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 11) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,53,136,37,53,136,37,51, + 130,36,51,130,36,47,116,33,47,116,33,38,92,28,38,92,28,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,53,136,37,69,175,50,69,175,50,69,175,50, + 69,175,50,69,175,50,69,175,50,69,175,50,38,92,28,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,53,136,37,106,194,89,106,194,89,106,194,89,106,194,89,106,194, + 89,106,194,89,106,194,89,69,175,50,38,92,28,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,53,136,37,123,202,107,134,207,119,134,207,119,134,207,119,134,207,119,134,207,119,134, + 207,119,92,187,75,59,157,42,38,92,28,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,53,136,37,202,235,194,202,235,194,202,235,194,202,235,194,202,235,194,202,235,194,119,200,104, + 69,175,50,54,138,38,38,92,28,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,53, + 136,37,202,235,194,255,255,255,255,255,255,212,239,207,202,235,194,202,235,194,119,200,104,54,138, + 38,92,92,92,30,71,22,212,208,200,212,208,200,212,208,200,212,208,200,104,104,104,53,136,37, + 202,235,194,255,255,255,158,217,146,255,255,255,212,239,207,202,235,194,119,200,104,54,138,38,181, + 181,181,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,220,220,220,51,130,36,202,235, + 194,232,247,229,51,133,37,158,217,146,233,247,231,210,238,203,119,200,104,54,138,38,181,181,181, + 220,220,220,255,255,255,238,238,238,238,238,238,255,255,255,220,220,220,51,130,36,191,231,182,212, + 239,206,38,92,28,51,133,37,158,217,146,212,239,207,119,200,104,54,138,38,151,151,151,158,158, + 158,174,174,174,186,186,186,177,177,177,158,158,158,181,181,181,51,130,36,181,227,171,191,231,182, + 38,92,28,38,92,28,51,133,37,175,224,163,119,200,104,54,138,38,133,133,133,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,158,158,158,47,116,33,175,224,165,181,227,171,28,63, + 20,28,63,20,80,168,64,205,236,198,119,200,104,54,138,38,61,61,61,30,71,22,212,208,200, + 212,208,200,212,208,200,212,208,200,61,61,61,47,116,33,171,223,160,171,223,160,28,63,20,64, + 154,48,214,240,209,171,223,160,119,200,104,59,156,42,46,115,33,30,71,22,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,47,116,33,156,216,143,156,216,143,55,143,39,198,234,191, + 171,223,160,156,216,143,119,200,104,67,173,49,54,138,38,30,71,22,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,38,92,28,156,216,143,156,216,143,171,223,160,164,220,152,156,216, + 143,156,216,143,119,200,104,67,173,49,30,71,22,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,38,92,28,142,211,128,142,211,128,142,211,128,142,211,128,142,211,128,142, + 211,128,106,194,89,30,71,22,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,38,92,28,38,92,28,38,92,28,30,71,22,30,71,22,30,71,22,30,71,22, + 30,71,22,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 12) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,255,0,0,255,0,0,255,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,255,0,0,212,208,200,212,208,200,129, + 0,0,255,0,0,255,0,0,254,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,255,0,0,121,0,0,212,208,200,212,208,200,212,208,200, + 173,0,0,255,0,0,151,0,0,151,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,90,0,0,142,0,0,0,0,0,212,208,200,212,208,200,212,208,200,212,208, + 200,189,0,0,236,0,0,253,0,0,207,0,0,212,208,200,212,208,200,212,208,200,212,208,200, + 135,0,0,130,0,0,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,197,33,33,230,162,162,248,170,170,143,26,26,212,208,200,181,52,52,223,128,128,215,75, + 75,85,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,140,27,27, + 255,245,245,255,255,255,255,255,255,231,161,163,179,47,47,255,255,255,255,255,255,255,255,255,235, + 159,160,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,230,149,150,255,255, + 255,255,211,215,255,55,55,221,70,73,197,121,122,255,114,114,255,47,48,245,255,255,241,255,255, + 162,65,69,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,222,171,177,228,255,255,225, + 195,205,253,61,67,205,44,48,193,31,32,236,106,112,251,74,77,205,255,255,200,255,255,159,80, + 87,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,139,51,55,190,232,242,189,247,255, + 154,129,140,116,0,0,255,0,0,186,55,59,165,193,201,161,232,243,161,149,162,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,163,2,4,91,8,10,24,0, + 0,212,208,200,142,0,0,255,0,0,208,0,0,193,0,0,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,217,0,0,30,0,0,0,0,0,212,208,200,212, + 208,200,212,208,200,186,0,0,255,0,0,255,0,0,231,0,0,212,208,200,212,208,200,212,208, + 200,212,208,200,148,0,0,231,0,0,36,0,0,0,0,0,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,230,0,0,255,0,0,255,0,0,230,0,0,212,208,200,212,208,200,247, + 0,0,255,0,0,55,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,255,0,0,255,0,0,208,0,0,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 13) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,45,45,82,69,69,132,212, + 208,200,212,208,200,85,85,137,106,106,145,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,38,38,85,74,74,140,89,89,149,93,93,155, + 105,105,166,126,126,179,152,152,200,94,94,129,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,57,57,107,47,47,104,65,65,132,99,99,154,114,114,166,126,126,177,135,135, + 185,140,140,188,175,175,210,172,172,215,33,33,78,212,208,200,212,208,200,212,208,200,212,208,200, + 46,46,98,63,63,132,80,80,139,158,158,197,196,196,223,192,192,220,169,169,207,149,149,194,154, + 154,198,166,166,205,170,170,210,108,108,153,212,208,200,212,208,200,212,208,200,212,208,200,40,40, + 93,85,85,145,184,184,213,190,190,219,137,137,187,104,104,164,80,80,139,139,139,182,174,174,210, + 173,173,209,189,189,219,215,215,240,118,118,161,212,208,200,212,208,200,32,32,69,75,75,138,168, + 168,204,187,187,218,120,120,177,70,70,129,41,41,90,212,208,200,56,56,90,173,173,215,188,188, + 219,197,197,223,221,221,238,168,168,211,26,26,54,47,47,84,85,85,150,114,114,167,198,198,224, + 131,131,184,71,71,133,12,12,30,212,208,200,212,208,200,46,46,77,178,178,220,204,204,228,209, + 209,231,195,195,222,171,171,209,82,82,142,85,85,151,106,106,163,145,145,190,181,181,215,86,86, + 146,10,10,29,212,208,200,212,208,200,212,208,200,135,135,175,202,202,229,209,209,231,180,180,214, + 139,139,187,113,113,170,66,66,125,70,70,118,113,113,170,142,142,188,166,166,205,69,69,130,212, + 208,200,212,208,200,212,208,200,142,142,185,210,210,236,218,218,235,205,205,228,138,138,187,91,91, + 153,58,58,118,212,208,200,212,208,200,113,113,172,152,152,197,160,160,202,87,87,143,212,208,200, + 55,55,88,138,138,177,211,211,237,211,211,231,230,230,242,231,231,243,124,124,177,53,53,112,212, + 208,200,212,208,200,212,208,200,129,129,182,159,159,201,169,169,207,166,166,203,120,120,162,187,187, + 225,209,209,233,222,222,238,230,230,242,246,246,251,243,243,250,131,131,178,17,17,37,212,208,200, + 212,208,200,108,108,142,161,161,207,183,183,216,181,181,214,188,188,218,200,200,229,213,213,233,215, + 215,234,210,210,231,239,239,247,238,238,247,177,177,212,152,152,199,64,64,110,212,208,200,212,208, + 200,212,208,200,91,91,127,174,174,217,181,181,216,207,207,232,212,212,232,216,216,234,178,178,212, + 139,139,187,140,140,188,171,171,211,151,151,199,102,102,165,40,40,91,212,208,200,212,208,200,212, + 208,200,212,208,200,49,49,96,87,87,143,187,187,214,238,238,251,195,195,222,138,138,187,91,91, + 153,54,54,114,69,69,118,51,51,100,42,42,93,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,153,153,196,170,170,210,112,112,169,57,57,117,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,82,82,143,65,65,125,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 14) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,100,119,170,130,147,188,133,148,186,106, + 124,167,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,126,143,187,229,232,243,249,250,253,254,253,254,255,255,255,253,253,255, + 236,240,251,147,157,186,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,139,153,194,238,239,248,216,219,229,202,206,220,208,213,227,234,235,245,233,235,245,233,234, + 245,242,244,255,161,172,206,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,73,90,148, + 190,197,224,166,174,193,156,167,192,151,164,195,190,198,219,213,216,230,208,213,228,207,211,228,216, + 220,236,218,221,243,87,102,153,212,208,200,212,208,200,212,208,200,212,208,200,78,100,169,121,135, + 170,123,140,179,126,144,186,179,189,216,225,228,241,223,225,238,210,214,230,211,215,233,208,212,232, + 202,207,231,137,150,205,212,208,200,212,208,200,212,208,200,39,56,106,63,86,154,66,88,143,89, + 112,167,92,113,168,199,205,226,249,249,254,237,239,248,226,229,242,215,218,236,195,200,223,174,181, + 213,137,149,204,48,62,108,212,208,200,212,208,200,65,82,137,146,156,205,139,150,194,80,99,150, + 48,76,141,77,100,159,129,144,183,202,207,224,234,236,246,213,217,235,188,194,222,104,118,165,87, + 105,168,45,64,120,212,208,200,212,208,200,68,84,136,149,158,208,173,181,219,144,152,186,21,48, + 114,16,48,127,0,32,116,125,141,181,238,239,247,211,215,236,114,133,181,28,54,120,58,83,154, + 4,29,91,212,208,200,212,208,200,48,61,103,147,157,211,154,162,203,69,88,143,5,38,116,12, + 44,124,1,35,119,80,103,159,225,228,242,162,177,214,27,43,113,55,69,126,118,135,188,113,123, + 146,212,208,200,212,208,200,212,208,200,122,136,194,56,75,130,6,38,116,14,46,126,18,49,127, + 18,50,128,29,59,134,122,146,194,160,73,98,199,44,19,181,81,75,255,255,255,128,131,128,212, + 208,200,212,208,200,212,208,200,49,66,115,51,77,148,25,54,128,33,62,136,43,70,141,49,75, + 145,40,74,147,72,58,121,246,101,71,250,156,80,255,255,255,196,154,135,86,20,9,255,255,255, + 212,208,200,212,208,200,212,208,200,35,58,118,62,89,160,75,99,160,81,103,162,85,106,165,73, + 108,170,160,60,92,255,117,90,233,170,112,255,255,255,227,165,98,227,187,168,255,255,255,212,208, + 200,212,208,200,212,208,200,212,208,200,44,60,103,98,116,173,126,143,196,128,148,199,121,144,196, + 204,75,91,255,100,95,255,155,103,255,197,115,255,255,255,255,255,255,126,59,43,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,61,66,95,110,87,121,97,83,116,181,53, + 60,255,55,47,255,108,96,255,165,115,232,193,139,238,201,139,204,99,68,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,156,20,15,255, + 64,53,255,95,81,255,127,111,255,154,122,243,142,107,103,35,29,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 149,53,44,150,64,54,114,52,44,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 15) + { + static const unsigned char data[] = + { + 128,128,128,212,208,200,128,128,128,212,208,200,128,128,128,212,208,200,128,128,128,212,208,200,128, + 128,128,212,208,200,128,128,128,212,208,200,128,128,128,212,208,200,128,128,128,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,166,177,207,243,244,251,250,250,253,248,249,252,254,253,255, + 255,254,255,243,246,255,165,175,202,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,174,185,220,225,227,237,197,202,215,184,191,209,203,208,225,229,231,242,229,231, + 243,226,229,241,237,239,251,172,183,217,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 96,113,171,172,181,207,147,158,183,145,157,190,151,165,199,204,209,228,211,215,229,203,207,224,206, + 211,228,213,216,235,213,217,240,93,108,160,212,208,200,212,208,200,212,208,200,212,208,200,59,84, + 154,92,111,154,111,130,177,115,133,181,206,211,230,238,239,248,229,231,243,217,221,236,212,216,234, + 202,207,229,193,198,226,133,146,202,212,208,200,212,208,200,212,208,200,50,70,126,102,118,176,90, + 108,161,73,96,154,71,95,157,152,165,200,220,223,235,233,235,243,227,230,242,212,216,235,193,198, + 223,135,145,185,111,127,188,37,51,92,212,208,200,212,208,200,68,84,139,155,164,212,169,176,214, + 117,130,170,31,58,126,32,62,136,39,66,135,168,177,204,236,238,247,214,217,236,148,159,198,46, + 68,127,68,92,160,21,38,87,212,208,200,212,208,200,57,71,121,148,158,209,170,177,216,103,117, + 161,7,38,113,11,44,125,0,31,115,108,126,173,234,235,246,188,195,223,44,67,128,58,78,136, + 75,99,169,7,25,68,212,208,200,212,208,200,212,208,200,136,148,204,84,100,150,17,47,121,11, + 43,124,15,46,126,10,42,123,49,76,144,176,185,216,80,103,162,12,39,109,92,107,158,122,136, + 194,212,208,200,212,208,200,212,208,200,212,208,200,70,87,142,42,68,137,16,47,122,26,56,133, + 36,64,138,41,68,141,38,66,139,40,67,140,14,46,125,34,63,136,40,70,147,25,45,104,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,43,68,137,57,85,155,68,92,156,74,96, + 158,78,99,160,76,98,159,68,91,155,64,88,154,49,77,152,16,43,112,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,51,69,117,102,121,178,124,140,194,120, + 135,187,122,138,189,115,132,188,85,106,166,36,54,102,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,61,68,96,136,144,180, + 109,117,153,48,56,85,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,128,128,128,131,131, + 135,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 16) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,27, + 78,179,26,93,203,25,77,181,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,31,88,188,38,112,218,53,140,249, + 65,150,254,53,141,251,24,80,189,19,50,153,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,35,91,185,35,100,200,52,127,226,73,155,251,82,162,254,80,161,254,78,160, + 254,74,157,254,66,150,253,32,98,208,15,46,153,212,208,200,212,208,200,212,208,200,37,97,189, + 40,112,210,62,140,237,84,164,252,94,171,254,97,173,254,98,173,254,96,172,254,93,170,254,87, + 166,254,81,162,254,74,156,254,45,119,227,12,46,157,212,208,200,212,208,200,38,103,210,104,173, + 253,97,173,254,105,178,254,110,182,254,114,185,255,115,186,255,113,184,255,108,181,254,102,176,254, + 94,171,254,85,164,254,75,157,254,55,136,243,11,42,162,212,208,200,34,97,215,61,126,254,114, + 174,254,120,189,255,127,194,255,132,198,255,133,198,255,130,196,255,124,192,255,116,186,255,106,179, + 254,86,163,254,61,128,241,47,93,211,14,48,175,212,208,200,40,100,213,72,134,254,76,138,254, + 119,174,254,150,209,255,150,210,255,152,211,255,148,209,255,139,203,255,113,180,255,71,132,232,104, + 141,223,154,174,224,114,139,213,4,25,148,212,208,200,45,103,212,85,146,254,89,150,254,93,154, + 254,113,170,254,166,218,255,167,221,255,136,196,255,90,145,231,130,163,223,170,196,237,126,164,229, + 60,122,230,37,83,199,5,22,144,212,208,200,50,106,209,98,158,254,103,163,254,107,166,254,109, + 169,254,120,176,255,118,170,243,171,199,237,179,211,243,123,177,235,50,103,194,20,43,148,65,121, + 221,27,57,168,16,40,160,212,208,200,55,109,208,110,169,254,116,175,255,120,179,255,123,182,255, + 125,183,255,104,162,237,193,221,246,133,189,236,108,167,227,67,113,197,55,90,181,121,135,196,122, + 139,204,10,27,145,212,208,200,59,112,206,122,180,255,128,186,255,134,191,255,137,194,255,139,196, + 255,113,167,234,210,226,244,105,143,205,89,125,196,144,167,216,171,200,245,79,135,233,36,83,200, + 11,26,142,212,208,200,50,98,192,124,183,251,140,197,255,147,203,255,151,207,255,154,209,255,124, + 179,236,136,163,214,170,197,233,158,198,242,74,129,212,21,46,151,67,127,228,35,72,184,16,35, + 149,212,208,200,212,208,200,50,92,184,128,184,242,159,214,255,165,219,255,168,222,255,137,191,237, + 202,227,248,127,187,237,101,161,226,64,113,197,56,96,189,38,67,171,23,44,154,0,0,114,212, + 208,200,212,208,200,212,208,200,33,65,162,113,160,218,182,227,254,195,233,255,156,195,235,206,225, + 245,134,175,223,94,141,207,35,57,154,28,46,149,0,0,114,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,12,32,138,93,117,187,214,235,250,189,211,238,142,161,210,51, + 70,159,24,35,137,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,60,69,155,87,94,168,22,28,131,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 17) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,91,155,232,91,154,232,92,154,232,91,155,233,91,155,232,91,155,232,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,90,152,229,249,253,255,249,252,255,249,253,255,249,252,255,249,252,255,249,252,255,90,152,229, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,89,149,226,241, + 249,255,241,249,255,241,249,255,241,250,255,241,249,255,242,249,255,241,249,255,136,163,203,90,149, + 225,89,150,225,90,150,226,89,150,225,89,149,225,90,149,225,212,208,200,89,146,222,232,246,255, + 232,246,255,232,246,255,232,246,255,232,246,255,231,245,255,232,246,255,232,245,255,232,245,255,231, + 245,255,232,246,255,232,245,255,232,246,255,231,246,255,89,146,222,87,143,218,221,241,255,221,241, + 255,221,241,255,221,241,255,221,241,255,221,241,255,221,241,255,221,242,255,75,136,225,75,136,225, + 75,136,225,75,136,225,75,136,225,75,136,225,75,136,225,86,140,214,209,237,255,209,237,255,210, + 237,255,209,237,255,210,237,255,209,236,255,210,236,255,75,136,225,176,204,230,190,190,191,206,206, + 207,254,254,255,254,254,255,199,225,255,75,136,225,85,138,211,197,231,255,197,232,255,75,136,225, + 75,136,225,75,136,225,75,136,225,75,136,225,153,170,185,212,212,212,218,218,218,213,213,213,166, + 173,181,148,178,214,173,211,255,75,136,225,84,135,208,185,227,255,72,131,221,147,198,255,254,254, + 255,254,254,255,254,254,255,122,122,123,255,255,255,255,255,255,211,211,211,247,247,247,255,255,255, + 115,118,122,129,172,223,72,131,222,83,132,203,172,221,255,68,124,217,122,184,255,121,184,255,121, + 184,255,106,160,223,0,0,0,251,251,251,239,239,201,191,189,110,213,193,133,231,231,231,103,103, + 103,46,69,96,67,124,217,82,130,200,160,216,255,63,115,211,98,171,255,98,172,255,98,172,255, + 49,85,127,0,0,0,132,132,132,255,255,204,255,255,0,255,219,87,197,197,197,0,0,0,6, + 11,16,62,115,211,81,127,196,149,212,255,57,106,205,79,162,255,79,162,255,49,100,159,0,0, + 0,13,13,13,255,255,255,255,255,255,255,255,229,243,243,243,218,218,218,112,112,112,0,0,0, + 18,33,64,80,124,193,139,207,255,50,96,198,255,255,255,255,255,255,191,191,191,64,64,64,177, + 177,177,255,255,255,255,255,255,243,243,243,217,217,217,193,193,193,157,157,157,22,22,23,37,72, + 149,79,122,189,139,207,255,44,85,192,255,255,255,255,255,255,255,255,255,207,207,207,216,216,216, + 255,255,255,243,243,243,217,217,217,193,193,193,169,169,169,149,149,149,131,131,138,44,85,192,78, + 119,187,121,200,255,37,75,185,200,200,218,200,200,218,200,200,218,200,200,218,223,223,229,238,238, + 238,216,216,216,192,192,192,168,168,168,145,145,145,133,133,135,190,190,206,38,75,185,212,208,200, + 77,117,183,32,65,179,32,65,179,31,65,179,32,66,179,101,103,133,213,212,173,255,229,133,254, + 228,168,183,158,105,201,163,87,255,232,152,255,255,184,213,198,145,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,255,233,0,255,245,0,255,225,0, + 212,208,200,212,208,200,255,238,0,255,246,0,255,225,0,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 18) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,74,67,198,106,102,218,128,120,218,106,83,198,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,75,94,222,97,110,228,113,123,228, + 145,153,243,185,193,254,212,217,254,185,192,254,162,172,254,115,128,254,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,66,85,209,155,167,254,175,187,254,175,187,254,175,187, + 254,162,174,254,110,123,254,99,112,254,99,112,254,99,112,254,82,51,189,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,120,136,254,129,146,254,128,144,254,118,133,254,102, + 116,254,99,112,254,99,112,254,95,96,237,90,78,220,82,50,189,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,97,113,254,83,88,223,79,76,209,77,64,198,76,55,189, + 70,31,162,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,96,107,248,77,71,203,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,87,92,229,77,67,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,86,90,227,77,62,197,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,77,78,218,73,56,194,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 71,62,203,70,51,191,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,79,98,193,143,148,213,144,139,207,90,67,172,72,66, + 207,71,47,188,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,100,121,210,216,218,254,216,218,254,216,218,254,216,218,254,118,116,224,73, + 45,185,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,53,78,195,158,164,254,158,164,254,158,164,254,153,161,254,130,148,254,100,125,254,75,46,186, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,52, + 64,181,103,111,248,106,116,254,102,115,254,91,110,254,88,109,254,85,93,237,71,19,152,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 76,67,195,112,115,248,118,122,254,118,122,254,108,102,237,73,16,146,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,58,19,141,85,46,171,81,27,153,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 19) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,128,128,128,128,128,128,128,128,128,244,223,132, + 255,239,153,207,210,204,195,206,241,128,128,128,128,128,128,128,128,128,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,128,128,128,190,182,77,172,212,111,154,215,146,179,206,112,232,222, + 132,169,181,219,132,168,255,131,165,251,235,236,190,128,128,128,128,128,128,212,208,200,212,208,200, + 212,208,200,128,128,128,128,128,128,118,186,62,61,187,75,82,191,87,140,191,93,249,226,132,143, + 161,210,49,106,255,63,111,249,187,202,208,244,229,161,128,128,128,212,208,200,212,208,200,128,128, + 128,128,128,128,255,212,85,176,188,63,0,156,1,0,155,0,137,185,67,255,232,142,158,167,194, + 71,114,243,187,193,182,253,250,182,255,253,187,128,128,128,212,208,200,128,128,128,128,128,128,252, + 157,113,255,144,83,197,170,61,156,183,61,168,188,71,160,189,77,255,226,134,255,236,142,232,219, + 159,244,237,166,255,255,182,255,253,186,128,128,128,128,128,128,128,128,128,255,77,44,255,69,78, + 250,58,61,244,162,72,255,215,103,255,216,113,255,221,123,255,224,130,255,231,142,255,240,152,255, + 244,164,255,252,180,253,243,175,128,128,128,128,128,128,253,167,38,253,55,15,252,0,0,239,96, + 33,251,198,81,255,206,94,255,211,104,255,218,116,255,223,127,255,228,138,255,235,150,255,240,161, + 255,255,181,230,209,140,128,128,128,128,128,128,255,194,40,252,98,22,240,68,21,242,143,49,254, + 205,80,255,203,90,255,210,101,255,215,112,255,221,124,255,227,135,255,233,147,255,239,158,255,253, + 177,191,155,89,128,128,128,128,128,128,255,184,37,250,150,33,249,175,50,255,198,67,255,204,81, + 255,202,86,255,207,98,255,214,109,255,220,121,255,226,132,255,231,144,255,243,160,251,227,145,128, + 128,128,128,128,128,128,128,128,255,181,37,255,180,37,255,187,50,225,165,58,213,168,78,255,203, + 88,255,206,94,255,216,107,255,221,119,255,224,128,255,233,143,255,245,156,128,128,128,128,128,128, + 212,208,200,128,128,128,255,188,49,255,178,32,219,151,40,212,208,200,212,208,200,235,179,71,255, + 212,95,244,200,101,247,211,116,255,232,132,255,228,130,128,128,128,128,128,128,212,208,200,212,208, + 200,128,128,128,255,203,89,255,185,34,152,102,21,212,208,200,212,208,200,250,187,69,193,143,55, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,212,208,200,212,208,200,212,208,200,128, + 128,128,128,128,128,255,224,106,211,156,49,212,208,200,225,160,49,250,188,68,128,128,128,128,128, + 128,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 128,128,128,128,128,128,245,204,106,255,222,110,255,214,97,128,128,128,128,128,128,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 20) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 198,236,200,199,234,200,199,236,201,180,234,180,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,107,203,105,110,198, + 103,110,199,100,109,198,100,114,201,111,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,94,143,201,155,188,226,155,186,225,95,128,167,212,208,200,43,180,9,66,189,23,72, + 193,22,70,191,22,56,183,22,26,174,7,212,208,200,212,208,200,212,208,200,212,208,200,112,156, + 206,211,233,255,212,231,251,212,232,252,211,231,255,113,171,198,44,171,22,77,205,0,89,212,0, + 83,208,0,65,198,0,45,178,2,212,208,200,212,208,200,212,208,200,212,208,200,134,191,250,155, + 198,241,155,199,241,154,199,241,154,198,241,127,176,250,71,159,128,120,228,10,141,242,16,132,235, + 17,98,214,14,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,115,183,246,130,189,239, + 138,195,241,138,194,241,130,189,239,108,172,243,86,159,181,137,211,84,154,228,74,150,224,82,110, + 197,78,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,133,198,253,152,207,246,161,215, + 248,161,215,248,150,206,245,126,184,248,103,175,169,133,209,113,130,206,110,132,207,116,136,213,126, + 70,178,50,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,182,229,255,207,244,255,206, + 243,255,182,224,255,108,182,182,67,184,35,82,198,27,81,199,26,81,198,27,78,195,32,61,193, + 24,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,165,206,247,194,223,247,194,223,248, + 173,207,252,78,159,154,62,192,1,81,207,0,85,208,0,83,206,0,73,200,0,57,192,0,48, + 179,2,212,208,200,212,208,200,212,208,200,142,197,249,178,213,246,166,205,242,166,205,242,176,211, + 245,141,187,250,80,170,122,104,223,0,114,228,0,110,225,0,94,215,0,74,202,0,70,205,13, + 212,208,200,212,208,200,94,160,223,139,196,245,144,198,242,146,200,242,146,200,242,143,197,241,136, + 191,245,103,169,225,128,224,51,160,255,18,152,252,25,135,241,33,122,227,44,101,197,40,212,208, + 200,212,208,200,130,195,251,141,200,244,152,207,245,158,212,246,158,211,246,151,207,245,139,198,243, + 124,187,250,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,159,215,255,161,214,248,175,225,251,185,231,253,184,230,253,174,224,250,158,212,247,153,212, + 255,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 155,202,238,191,235,255,209,250,255,223,255,255,222,255,255,209,251,255,192,237,255,161,208,248,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 21) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,245,234,222,230,191,152,222,209,199, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,219,192,165,189,100,13,171,140,110,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,167,136,113,148,108,74,110,63,27,102,65,31,123,85,51,141, + 105,74,146,119,98,169,145,127,126,85,52,212,208,200,212,208,200,212,208,200,127,80,43,154,123, + 97,165,141,123,181,161,147,198,185,172,214,204,197,228,224,221,246,243,247,253,252,251,254,254,253, + 254,254,254,253,254,253,145,114,90,212,208,200,212,208,200,212,208,200,112,72,41,249,249,247,253, + 254,254,254,254,254,254,254,254,254,254,254,253,253,254,253,253,254,254,254,254,254,254,254,254,254, + 254,254,254,254,165,140,122,195,174,155,212,208,200,212,208,200,122,82,51,230,226,222,254,254,254, + 254,254,254,253,253,254,254,254,254,253,253,254,252,252,254,254,254,254,254,254,254,254,254,254,254, + 254,254,176,160,151,164,139,119,212,208,200,212,208,200,141,106,80,209,200,194,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,253,254,254,254,254,254,254,254,254,254,254, + 195,187,180,159,123,96,212,208,200,212,208,200,146,119,98,190,175,165,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,217,213, + 209,128,93,64,212,208,200,212,208,200,146,119,98,146,119,98,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,220,211,207,205,191,181,196,176,158,179,154,133,156,130,108,140,107,81,158, + 124,95,212,208,200,212,208,200,212,208,200,146,119,98,146,119,98,148,113,84,138,96,60,117,76, + 42,117,73,35,109,76,49,155,129,104,146,119,98,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,192,175,160,139, + 76,18,160,136,116,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,221,193,166,198,102,15, + 171,141,114,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,231,200,170,192,99,17,170,140, + 114,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,223,196,168,193,98,13,174,143,111,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,216,189,164,190,98,12,180,146,115,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 22) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,131,127,28,136,138,0,130,125,0, + 141,127,18,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,129,145,29,198,194,165,8,0,46,10,0,2,131,132, + 28,30,24,15,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,91,116,6,193,189,239,19,22,15,212,208,200,212,208,200,114,142,0,124, + 134,9,6,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,118,146,0,14,14,14,212,208,200,212,208,200,212,208,200,212,208,200,125,140,0, + 8,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,131,143,0,8,0,0,212,208,200,212,208,200,212,208,200,212,208,200,120,120,24,8,0, + 35,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 109,115,0,24,2,25,130,135,9,124,135,0,145,150,50,139,143,23,136,137,9,36,23,6,104, + 112,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,141,144,51,140,143, + 36,113,122,0,135,134,44,131,133,23,134,140,8,118,121,6,139,139,7,100,93,21,133,156,0, + 15,10,6,212,208,200,212,208,200,212,208,200,212,208,200,114,136,0,252,249,232,255,248,255,255, + 255,239,255,255,216,255,245,255,255,246,255,255,255,212,255,246,255,255,246,255,128,145,0,4,0, + 34,212,208,200,212,208,200,212,208,200,212,208,200,114,132,0,255,247,255,245,254,17,251,251,7, + 253,250,0,255,252,15,253,255,0,247,255,0,242,253,1,240,252,30,124,139,0,1,1,0,212, + 208,200,212,208,200,212,208,200,212,208,200,135,153,9,244,222,255,146,148,0,144,135,0,146,136, + 0,142,123,18,137,126,0,141,135,0,138,125,0,231,207,195,120,127,0,19,16,9,212,208,200, + 212,208,200,212,208,200,212,208,200,115,134,0,255,255,234,212,229,1,248,255,15,247,255,0,242, + 250,17,242,252,18,255,255,41,254,255,0,252,255,4,119,119,0,6,0,23,212,208,200,212,208, + 200,212,208,200,212,208,200,129,132,25,255,240,246,151,145,33,145,132,28,132,122,0,146,134,16, + 138,132,0,131,130,0,134,121,0,213,183,183,140,145,0,15,2,19,212,208,200,212,208,200,212, + 208,200,212,208,200,128,126,7,255,255,175,240,245,41,255,255,19,238,246,0,246,254,0,248,255, + 0,255,255,7,254,255,45,237,249,19,141,141,27,7,1,0,212,208,200,212,208,200,212,208,200, + 212,208,200,116,121,0,154,153,26,109,106,0,131,126,9,143,135,24,148,140,33,128,118,3,127, + 118,0,125,133,0,130,128,45,109,125,0,15,5,32,212,208,200,212,208,200,212,208,200,212,208, + 200,9,0,22,10,2,0,6,1,0,8,5,0,6,1,0,6,0,0,7,0,2,19,6,24, + 9,8,0,5,4,0,5,8,0,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 23) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,100,157,253,189,217,255,193,218,255,172,208,255,139,187,255,109,169,255,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,144,177,236,139,158,193,82,97,127,146,180,239,111,164,254,99,155,250,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,102,159, + 255,57,85,138,102,128,178,70,97,150,103,142,214,88,139,229,82,132,220,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,92,146,238,58, + 93,160,67,103,173,36,62,114,77,119,198,74,120,204,73,117,201,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,78,125,210,76,121,204, + 61,99,171,63,102,179,99,129,192,61,99,178,73,116,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,96,146,235,78,120,197,51,85, + 156,70,99,160,108,139,202,42,73,143,76,122,207,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,92,145,237,98,146,231,81,128,216,88,129,206,117, + 149,212,59,92,162,50,84,157,79,127,214,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,101,150,237,89,137,224,77,123,208,91,131,204,85,120,189, + 31,56,121,67,109,190,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,113,161,243,101,148,231,80,127,215,75,119,201,90,131,207,29,54,117,53,89, + 163,74,120,204,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,102,159,255, + 123,170,251,116,161,240,86,134,221,76,122,207,82,129,215,36,65,131,42,74,143,74,120,203,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,108,168,255,145,191,255,144,186,255,131,173, + 248,96,144,229,79,127,214,87,137,227,38,67,134,39,68,137,75,121,206,212,208,200,212,208,200, + 212,208,200,212,208,200,146,192,255,123,152,210,112,139,194,54,71,122,112,154,229,101,150,237,87, + 137,227,86,137,227,40,69,138,45,77,148,78,125,210,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,142,189,255,135,160,210,9,26,79,48,82,155,75,121,205,96,150,243,71,115,198, + 36,65,132,59,98,175,82,132,219,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,108,168,255,105,164,255,101,159,255,90,144,235,71,115,198,45,78,150,57,94,171,79,127, + 214,87,138,228,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 143,160,219,88,134,227,92,146,239,85,135,224,79,127,214,94,148,241,100,157,253,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,82,82, + 139,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 24) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,160,89, + 134,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,162,72,100,160,89,112,173, + 119,145,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,154,154,154,212,208,200,162,81,120,142,87,114,216,166,192, + 212,208,200,232,180,205,172,152,164,159,159,159,212,208,200,212,208,200,160,164,162,212,208,200,212, + 208,200,212,208,200,163,149,154,212,159,185,172,121,149,195,131,162,100,31,100,207,142,175,244,191, + 216,255,224,245,213,166,190,152,140,148,212,208,200,160,154,158,168,139,152,160,158,158,212,208,200, + 152,150,152,205,162,184,255,226,246,221,160,190,222,168,194,212,208,200,166,82,123,244,191,216,255, + 224,245,219,158,188,197,134,166,185,130,158,190,125,158,251,123,186,178,128,152,180,139,159,184,129, + 155,224,169,195,255,215,239,250,193,221,195,163,178,212,208,200,212,208,200,213,151,181,255,221,244, + 255,206,233,255,209,237,248,136,191,225,118,170,255,144,205,214,112,161,250,150,199,255,207,235,244, + 186,214,255,220,243,235,176,205,154,103,129,212,208,200,134,134,134,202,151,173,255,216,244,235,173, + 205,181,98,140,214,107,159,255,148,201,255,149,202,255,143,200,214,111,160,213,140,176,255,213,240, + 255,212,239,188,111,148,212,208,200,100,100,100,169,130,149,241,178,211,255,209,239,180,129,153,212, + 208,200,162,104,134,243,143,192,255,162,215,221,129,173,148,89,112,152,97,124,229,164,197,255,201, + 233,170,114,142,212,208,200,173,92,132,250,181,216,251,186,221,245,172,207,192,151,171,212,208,200, + 212,208,200,220,138,178,255,162,213,173,133,153,212,208,200,212,208,200,227,163,194,255,209,241,202, + 141,172,152,121,136,212,133,171,243,171,207,164,82,125,193,110,150,237,168,201,212,208,200,170,138, + 153,251,160,205,255,172,220,186,133,160,212,208,200,179,144,162,245,170,207,225,151,188,255,194,229, + 184,98,140,184,103,142,171,84,127,212,208,200,159,78,117,243,160,200,204,139,171,241,161,200,222, + 134,178,211,124,166,248,164,205,171,127,149,235,160,197,204,119,160,158,73,114,234,153,193,231,148, + 188,155,128,142,212,208,200,212,208,200,212,208,200,195,105,150,255,184,226,237,155,195,158,77,115, + 159,76,115,241,161,200,252,168,212,239,142,190,159,77,119,212,208,200,172,81,128,214,123,168,212, + 208,200,212,208,200,212,208,200,212,208,200,162,72,115,202,118,160,168,85,125,212,208,200,212,208, + 200,175,95,134,244,158,201,180,91,134,212,208,200,212,208,200,100,100,100,166,97,131,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,154,76,110,212,208,200,212,208,200,212,208,200,139, + 64,100,168,83,125,152,72,111,212,208,200,212,208,200,212,208,200,160,148,153,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 25) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,150,156,153,96,105,106,100,109,117,89,95,107, + 130,136,146,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,115,120,123,105,110,119,152,159,175,153,159,181,98,102,126,49,53, + 72,90,93,106,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,88,91,107,178,181,204,144,149,180,94,99,134,61,63,98,57,60,88,27, + 30,47,154,157,166,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,103,102,105,212,208, + 200,141,140,154,111,112,137,155,156,191,88,91,134,54,56,104,54,55,99,58,60,92,57,60,79, + 62,65,72,212,208,200,157,157,157,164,164,164,212,208,200,212,208,200,109,107,110,212,208,200,125, + 125,139,83,84,111,103,103,143,53,54,102,61,63,114,57,58,103,65,67,99,46,49,66,54,58, + 61,212,208,200,115,115,114,212,208,200,212,208,200,212,208,200,140,140,136,133,134,135,169,169,180, + 21,21,45,40,40,78,45,47,94,58,60,109,51,53,94,37,40,69,13,15,28,85,89,87,212, + 208,200,100,101,100,212,208,200,212,208,200,212,208,200,212,208,200,88,90,86,73,73,80,10,12, + 31,54,55,88,138,140,182,107,110,154,53,55,92,23,27,50,2,6,13,56,61,53,55,60,53, + 156,156,154,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,177,178,178,74,78,90,84, + 87,111,95,99,131,59,63,98,63,67,95,50,55,72,62,67,70,143,149,138,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,132,132,124,114,119,107,116,119,116,48,52,59,26,28,46, + 37,42,67,47,52,80,45,49,74,24,28,43,38,43,46,96,102,93,114,119,107,111,111,109,132, + 132,132,212,208,200,212,208,200,212,208,200,178,180,175,91,93,91,77,82,87,29,31,44,43,47, + 67,96,102,126,35,39,62,15,18,34,57,62,67,77,81,77,140,145,137,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,157,159,156,120,122,122,212,208,200,94,99,112,97,102,122,96, + 102,126,49,54,78,50,55,72,212,208,200,151,155,155,92,96,92,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,191,191,191,95,96,97,212,208,200,134,138,144,61,66,78,47,51,67, + 53,56,72,75,77,90,212,208,200,147,150,151,152,153,153,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,77,77,77,212,208,200,212,208,200,58,58,61,40,41,44,58,58, + 61,212,208,200,212,208,200,104,105,105,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,129,129,129,112,112,112,198,198,198,212,208,200,162,162,162,212,208,200,212, + 208,200,149,149,149,108,108,108,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + return wxNullBitmap; +} + +wxBitmap connButImg( size_t index ) +{ + if (index == 0) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,229,232,241,240,242,247,240,241,247,233,236,245,233,236,245,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,204,210,228,249,249,252,255,255,255,251, + 251,253,245,246,249,244,246,250,246,246,250,250,250,252,250,250,252,255,255,255,255,255,255,228,233, + 246,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,247,248,252,247,248,252,241,242,249,237,239,247,234,236,245,231,234, + 242,232,234,243,239,241,248,240,241,248,240,241,248,238,240,247,239,240,247,243,244,250,252,252,255, + 202,210,234,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,243,243,250,233,235,245,232,235,245,226,228,239,224,226,237,216,220,233,215,220,233,229,232,242, + 235,237,246,233,236,245,233,236,245,232,234,245,231,233,244,230,232,243,230,232,243,239,240,248,214, + 219,240,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,234,235,246,225,227,241, + 213,217,231,199,204,218,189,194,208,184,190,204,183,189,207,182,189,208,208,212,227,231,234,244,230, + 233,243,230,233,243,228,230,242,227,230,242,226,229,241,223,226,239,221,224,238,229,231,243,189,196, + 228,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,207,211,233,207,212,231,184,190,209,167,174,192,164, + 171,189,166,174,194,167,177,200,167,177,203,167,177,203,205,211,227,227,230,241,223,226,239,223,226, + 239,229,231,243,218,221,236,212,215,231,219,222,238,215,219,236,213,217,235,218,220,238,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,181,189,217,150,161,188,146,154,176,149,158,182,150,162,191,151,164, + 198,150,164,199,145,159,196,167,179,209,225,229,241,197,202,219,183,188,206,183,188,206,191,196,214, + 184,190,209,211,214,232,215,218,236,211,215,233,207,211,232,209,213,233,166,174,215,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,109,125,181,138,151,186,131,141,166,133,146,179,134,150,189,134,151,191,133,149,189,130,146,188, + 166,178,208,217,221,236,227,230,242,223,225,238,222,225,238,222,225,238,189,195,213,210,214,231,215, + 218,236,211,215,234,207,211,232,203,207,230,202,207,230,166,174,213,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,59,84,152, + 105,122,159,118,131,167,118,136,182,118,136,181,116,135,180,119,136,182,182,190,217,227,230,242,230, + 232,243,228,230,242,229,231,242,228,230,242,228,230,242,225,228,242,218,222,238,213,217,235,207,211, + 231,204,209,231,198,203,227,194,200,226,154,164,207,125,137,195,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,50,76,149,0,29,103,61,81,130,104, + 123,170,100,121,172,100,120,171,97,118,170,105,125,174,217,220,236,232,234,244,230,232,243,232,234, + 243,232,234,243,230,232,243,230,232,243,222,225,239,217,220,237,212,216,235,199,203,225,192,198,223, + 196,202,228,187,193,224,144,154,202,136,145,199,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,106,122,181,63,82,140,33,58,122,67,92,153,82,105, + 163,83,106,163,82,105,162,78,101,160,138,153,193,234,236,245,242,242,250,243,244,251,241,242,249, + 234,236,245,234,236,245,223,226,240,217,220,237,211,215,234,200,205,228,165,173,201,183,190,219,133, + 143,184,134,144,193,141,150,202,97,115,183,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,143,152,202,151,160,206,141,152,197,110,124,172,70,91,144,60,86,148, + 65,91,154,64,90,152,58,85,149,134,149,190,211,215,228,205,208,221,217,220,231,241,243,249,241, + 243,249,223,226,240,216,219,236,208,212,233,202,207,230,179,185,214,167,175,210,82,97,146,100,115, + 169,73,94,160,103,120,185,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,137,147,198,146,155,203,160,168,211,178,185,221,112,123,162,33,54,107,43,71,140,49, + 76,144,47,74,143,44,72,141,52,78,140,42,68,133,115,132,173,246,247,251,246,247,251,223,226, + 240,215,218,236,205,210,231,196,201,227,186,193,224,107,124,177,83,100,152,44,68,131,57,82,151, + 70,93,165,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,138, + 148,198,146,156,203,156,165,208,167,175,213,183,190,223,146,155,189,26,47,102,22,52,126,28,59, + 134,29,59,133,27,58,133,22,54,131,53,78,140,228,230,240,228,230,240,220,223,239,211,215,234, + 200,205,228,194,199,227,108,126,178,4,30,95,29,51,106,111,126,181,101,118,177,32,62,142,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,139,149,199,145,155, + 202,155,164,207,166,174,212,180,188,221,122,133,170,17,42,101,10,43,122,14,46,125,15,46,125, + 15,47,126,13,45,125,19,50,124,192,197,216,192,197,216,216,219,237,206,210,231,204,208,231,168, + 177,212,19,47,117,12,41,113,59,83,148,35,63,137,30,59,135,3,40,128,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,139,149,199,145,155,202,155,164,207, + 166,174,212,180,188,221,122,133,170,17,42,101,10,43,122,14,46,125,15,46,125,15,47,126,13, + 45,125,19,50,124,192,197,216,192,197,216,216,219,237,206,210,231,204,208,231,168,177,212,19,47, + 117,12,41,113,59,83,148,35,63,137,30,59,135,3,40,128,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,139,148,201,147,156,203,151,160,205,136,146,187,80, + 99,154,8,38,110,14,46,125,14,46,125,14,46,125,14,46,125,14,46,125,14,46,125,5,38, + 120,112,129,178,112,129,178,207,211,233,189,197,225,111,140,191,16,53,132,4,34,104,0,28,80, + 106,128,177,150,160,207,155,162,191,239,240,241,164,164,164,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,128,140,199,153,161,208,106,119,165,11,32,86,11,43,120,14,47, + 128,14,46,125,14,46,125,14,46,125,14,46,125,15,46,126,15,47,126,11,43,124,29,57,130, + 29,57,130,207,213,236,123,139,185,120,48,87,161,4,29,174,11,25,134,9,30,134,78,114,157, + 163,190,241,241,240,255,255,254,140,140,139,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,141,151,203,51,74,133,5,29,89,13,44,124,14,46,125,14,46,125, + 17,49,127,21,52,130,24,55,131,26,56,133,27,57,133,26,56,132,23,53,130,23,53,130,79, + 110,171,117,49,89,248,9,0,255,69,9,255,99,23,255,73,8,207,84,71,230,232,233,238,244, + 244,125,132,132,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,114,130,191,51,77,147,27,51,112,14,43,113,16,48,129,24,54,131,31,60,135,36, + 64,137,40,68,139,42,69,141,43,70,141,43,70,141,41,69,140,41,69,140,47,60,125,236,98, + 102,255,80,29,255,165,76,251,162,78,209,160,112,225,230,227,224,232,234,174,122,118,212,208,200, + 212,208,200,212,208,200,205,205,205,182,182,182,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,85,105,171,36,65,137,40,67,137,36,64,138,37,65,138,43,70,142,50,76,145,54,80, + 148,57,81,149,58,82,150,57,82,149,55,81,148,55,81,148,141,60,91,255,118,114,255,114,55, + 253,171,87,208,160,117,208,214,218,209,214,219,166,152,134,196,109,54,195,30,8,212,208,200,177, + 184,184,255,255,255,219,219,219,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,32,62,138,55,80,148,64,88,153,64,88,153,64,88,153,66,89,154,69,92,156,72,94,157, + 72,94,158,72,94,157,68,93,158,68,93,158,207,27,37,255,118,119,255,108,60,251,174,90,194, + 168,144,183,192,202,164,148,131,204,148,88,233,175,102,225,139,78,207,160,157,253,255,255,211,212, + 212,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 51,78,149,72,94,157,84,105,163,90,110,167,94,113,169,96,115,171,97,115,171,97,115,171,97, + 115,171,92,118,176,92,118,176,242,7,7,255,131,133,255,102,79,255,174,95,236,173,107,200,160, + 117,235,175,108,255,194,117,236,181,114,201,193,176,240,248,251,197,195,197,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,86,106,166,100,119,173,108,126,178,114,130,179,118,134,181,120,134,182,119,134,182,111,138, + 190,111,138,190,254,35,31,255,154,152,255,123,120,255,136,82,255,195,114,255,194,116,255,198,122, + 236,186,121,195,183,169,225,229,235,189,194,191,168,83,71,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,127,140,194,129,142,193,133,145,193,132,146,192,134,147,194,123,150,202,123,150,202, + 255,66,61,255,75,70,255,106,103,255,118,102,255,171,104,255,201,125,255,202,125,205,176,136,193, + 200,211,175,176,178,172,155,117,221,116,72,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,125,138,193,125,140,196,125,140,197,116,143,202,116,143,202,255,61,54,255, + 47,40,255,56,47,255,125,121,255,116,97,255,173,109,255,214,136,237,197,135,185,169,145,195,169, + 128,238,203,133,254,174,118,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,152,44,62,100,44,63,212,208,200,212,208,200,253,50,45,255,53,44,255,58, + 47,255,78,67,255,128,121,255,116,101,255,146,98,255,204,132,255,220,143,255,224,149,255,231,155, + 255,151,107,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,107,0,0,197,0,0,212,208,200,212,208,200,240,42,37,255,60,50,255,69,58,255,77,64, + 255,91,77,255,128,116,255,126,116,255,124,99,255,154,110,255,171,119,255,152,110,252,98,80,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 101,4,4,166,19,15,166,19,15,161,22,18,255,59,50,255,80,67,255,88,74,255,99,82,255, + 107,89,255,128,110,255,147,131,255,149,133,255,142,124,220,90,77,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,214,55,46,250,86,73,253,102,85,253,113,95,251,120, + 100,233,109,90,185,80,67,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 32, 32, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 1) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,200,0,0, + 202,0,0,200,0,0,198,0,0,197,0,0,195,0,0,194,0,0,194,0,0,191,0,0,189, + 0,0,187,0,0,186,0,0,184,0,0,177,0,0,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,200,0,0,202,0,0,224,0,0,231, + 0,0,231,0,0,230,0,0,230,0,0,230,0,0,230,0,0,229,0,0,229,0,0,228,0, + 0,228,0,0,216,0,0,181,0,0,164,0,0,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,200,0,0,201,0,0,229,45,45,254,228,228,255,244,244,255,244, + 244,255,244,244,255,244,244,255,244,244,255,244,244,255,244,244,255,244,244,255,244,244,255,244,244, + 254,228,228,221,45,45,178,0,0,161,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,200,0,0,201,0,0,229,43,43,254,216,216,255,231,231,255,231,231,255,231,231,255,231,231, + 255,231,231,255,231,231,255,231,231,255,231,231,255,231,231,255,231,231,255,231,231,255,231,231,254, + 216,216,220,43,43,175,0,0,157,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,200,0,0,201,0,0, + 229,40,40,254,203,203,255,217,217,255,217,217,255,217,217,255,217,217,255,217,217,255,217,217,255, + 217,217,255,217,217,255,217,217,255,217,217,255,217,217,255,217,217,255,217,217,255,217,217,254,203, + 203,219,40,40,172,0,0,155,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,200,0,0,201,0,0,229,37,37,254,189,189,255, + 202,202,255,202,202,255,202,202,255,202,202,255,202,202,255,202,202,255,202,202,255,202,202,255,202, + 202,255,202,202,255,202,202,255,202,202,255,202,202,255,202,202,255,202,202,255,202,202,254,189,189, + 218,37,37,169,0,0,152,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,200,0,0,201,0,0,229,34,34,254,174,174,255,186,186,255,186,186,255,186, + 186,255,209,209,255,191,191,255,186,186,255,186,186,255,186,186,255,186,186,255,186,186,255,186,186, + 255,186,186,255,186,186,255,191,191,255,200,200,255,186,186,255,186,186,255,186,186,254,174,174,216, + 34,34,166,0,0,149,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,200,0, + 0,201,0,0,229,31,31,254,159,159,255,170,170,255,170,170,255,170,170,255,203,203,255,255,255, + 255,240,240,255,176,176,255,170,170,255,170,170,255,170,170,255,170,170,255,170,170,255,170,170,255, + 176,176,255,240,240,255,255,255,255,203,203,255,170,170,255,170,170,255,170,170,254,159,159,215,31, + 31,163,0,0,146,0,0,212,208,200,212,208,200,212,208,200,200,0,0,201,0,0,229,28,28, + 254,144,144,255,154,154,255,154,154,255,154,154,255,193,193,255,255,255,255,255,255,255,255,255,255, + 237,237,255,161,161,255,154,154,255,154,154,255,154,154,255,154,154,255,161,161,255,237,237,255,255, + 255,255,255,255,255,255,255,255,193,193,255,154,154,255,154,154,255,154,154,254,144,144,214,28,28, + 160,0,0,144,0,0,212,208,200,212,208,200,201,0,0,224,0,0,254,128,128,255,137,137,255, + 137,137,255,137,137,255,159,159,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,234, + 234,255,145,145,255,137,137,255,137,137,255,145,145,255,234,234,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,159,159,255,137,137,255,137,137,255,137,137,252,103,103,205,0,0,156, + 0,0,212,208,200,212,208,200,199,0,0,231,0,0,255,120,120,255,120,120,255,120,120,255,120, + 120,255,120,120,255,203,203,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,231,231, + 255,129,129,255,129,129,255,231,231,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 203,203,253,106,106,249,69,69,245,32,32,242,0,0,242,0,0,220,0,0,155,0,0,212,208, + 200,212,208,200,198,0,0,231,0,0,255,103,103,255,103,103,255,103,103,255,103,103,255,103,103, + 255,103,103,255,197,197,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,228,228,255, + 228,228,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,251,166,166,245,27,27,242,0, + 0,242,0,0,242,0,0,242,0,0,242,0,0,220,0,0,153,0,0,212,208,200,212,208,200, + 196,0,0,230,0,0,255,85,85,255,85,85,255,85,85,255,85,85,255,85,85,255,85,85,255, + 85,85,255,190,190,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,250,159,159,242,0,0,242,0,0,242,0,0,242,0,0, + 242,0,0,242,0,0,242,0,0,220,0,0,152,0,0,212,208,200,212,208,200,194,0,0,230, + 0,0,255,68,68,255,68,68,255,68,68,255,68,68,255,68,68,255,68,68,255,68,68,255,68, + 68,255,183,183,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,250,159,159,242,0,0,242,0,0,242,0,0,242,0,0,242,0,0,242,0,0,242, + 0,0,242,0,0,219,0,0,150,0,0,212,208,200,212,208,200,193,0,0,230,0,0,255,50, + 50,255,50,50,255,50,50,255,50,50,255,50,50,255,50,50,255,50,50,255,50,50,255,50,50, + 255,177,177,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,250,159,159,242, + 0,0,242,0,0,242,0,0,242,0,0,242,0,0,242,0,0,242,0,0,242,0,0,242,0, + 0,219,0,0,149,0,0,212,208,200,212,208,200,193,0,0,230,0,0,255,50,50,255,50,50, + 255,50,50,255,50,50,255,50,50,255,50,50,255,50,50,255,50,50,255,50,50,255,177,177,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,250,159,159,242,0,0,242,0, + 0,242,0,0,242,0,0,242,0,0,242,0,0,242,0,0,242,0,0,242,0,0,219,0,0, + 149,0,0,212,208,200,212,208,200,190,0,0,230,0,0,255,14,14,255,14,14,255,14,14,255, + 14,14,255,14,14,255,14,14,255,14,14,255,29,29,255,211,211,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,207,207,244,16,16,243,0,0, + 243,0,0,243,0,0,243,0,0,243,0,0,243,0,0,243,0,0,219,0,0,145,0,0,212, + 208,200,212,208,200,188,0,0,232,0,0,255,1,1,255,1,1,255,1,1,255,1,1,255,1, + 1,255,1,1,255,17,17,255,208,208,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,207,207,247,16,16,247,0,0,247, + 0,0,247,0,0,247,0,0,247,0,0,247,0,0,221,0,0,144,0,0,212,208,200,212,208, + 200,187,0,0,234,0,0,251,0,0,252,0,0,253,1,1,253,1,1,253,1,1,252,16,16, + 255,207,207,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,159,159,253,159,159,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,207,207,250,16,16,250,0,0,250,0, + 0,250,0,0,250,0,0,250,0,0,223,0,0,142,0,0,212,208,200,212,208,200,185,0,0, + 236,0,0,253,0,0,253,0,0,253,0,0,253,0,0,253,16,16,255,207,207,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,254,159,159,253,0,0,253,0,0,254,159,159,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,207,207,253,16,16,253,0,0,253,0,0, + 253,0,0,253,0,0,225,0,0,141,0,0,212,208,200,212,208,200,183,0,0,223,2,2,255, + 4,4,255,4,4,255,4,4,255,4,4,255,51,51,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,162,162,255,4,4,255,4,4,255,4,4,255,4,4,255,162,162,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,51,51,255,4,4,255,4,4,255,4,4,255, + 4,4,205,2,2,139,0,0,212,208,200,212,208,200,176,0,0,180,0,0,226,9,9,255,15, + 15,255,15,15,255,15,15,255,15,15,255,106,106,255,255,255,255,255,255,255,255,255,255,166,166, + 255,15,15,255,15,15,255,15,15,255,15,15,255,15,15,255,15,15,255,166,166,255,255,255,255, + 255,255,255,255,255,255,106,106,255,15,15,255,15,15,255,15,15,255,15,15,212,9,9,139,0, + 0,117,0,0,212,208,200,212,208,200,212,208,200,164,0,0,177,0,0,225,16,16,255,27,27, + 255,27,27,255,27,27,255,27,27,255,113,113,255,255,255,255,170,170,255,27,27,255,27,27,255, + 27,27,255,27,27,255,27,27,255,27,27,255,27,27,255,27,27,255,170,170,255,255,255,255,113, + 113,255,27,27,255,27,27,255,27,27,255,27,27,212,16,16,139,0,0,117,0,0,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,160,0,0,174,0,0,224,23,23,255,38,38,255, + 38,38,255,38,38,255,38,38,255,79,79,255,38,38,255,38,38,255,38,38,255,38,38,255,38, + 38,255,38,38,255,38,38,255,38,38,255,38,38,255,38,38,255,79,79,255,38,38,255,38,38, + 255,38,38,255,38,38,212,23,23,139,0,0,117,0,0,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,157,0,0,171,0,0,223,30,30,255,49,49,255,49, + 49,255,49,49,255,49,49,255,49,49,255,49,49,255,49,49,255,49,49,255,49,49,255,49,49, + 255,49,49,255,49,49,255,49,49,255,49,49,255,49,49,255,49,49,255,49,49,255,49,49,212, + 30,30,139,0,0,117,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,154,0,0,168,0,0,222,37,37,255,60,60,255,60,60, + 255,60,60,255,60,60,255,60,60,255,60,60,255,60,60,255,60,60,255,60,60,255,60,60,255, + 60,60,255,60,60,255,60,60,255,60,60,255,60,60,255,60,60,212,37,37,138,0,0,117,0, + 0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,151,0,0,165,0,0,221,44,44,255,72,72,255,72,72,255, + 72,72,255,72,72,255,72,72,255,72,72,255,72,72,255,72,72,255,72,72,255,72,72,255,72, + 72,255,72,72,255,72,72,255,72,72,212,44,44,138,0,0,117,0,0,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,148,0,0,162,0,0,219,51,51,255,83,83,255,83,83,255,83, + 83,255,83,83,255,83,83,255,83,83,255,83,83,255,83,83,255,83,83,255,83,83,255,83,83, + 255,83,83,212,51,51,138,0,0,117,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,146,0,0,159,0,0,212,52,52,230,69,69,230,69,69,229,69,69, + 229,69,69,228,69,69,228,69,69,228,69,69,227,69,69,227,69,69,227,69,69,205,52,52,138, + 0,0,117,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,143,0,0,155,0,0,154,0,0,152,0,0,151,0,0,149,0,0,148, + 0,0,148,0,0,145,0,0,143,0,0,142,0,0,140,0,0,138,0,0,117,0,0,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 32, 32, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 2) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "32 32 4 1", + " c None", + "a c #FFFFFF", + "b c #808080", + "c c #C0C0C0", + /* pixels */ + " ", + " ", + " bbbbbbbbbbbbbb ", + " bccccccccccccccb ", + " bccccccccccccccccb ", + " bccccccccccccccccccb ", + " bccccccccccccccccccccb ", + " bccccccccccccccccccccccb ", + " bccccccccccccccccccccccccb ", + " bcccccccaccccccccccacccccccb ", + " bcccccccaaaccccccccaaacccccccb", + " bccccccaaaaaccccccaaaaaccccccb", + " bcccccccaaaaaccccaaaaacccccccb", + " bccccccccaaaaaccaaaaaccccccccb", + " bcccccccccaaaaaaaaaacccccccccb", + " bccccccccccaaaaaaaaccccccccccb", + " bcccccccccccaaaaaacccccccccccb", + " bcccccccccccaaaaaacccccccccccb", + " bccccccccccaaaaaaaaccccccccccb", + " bcccccccccaaaaaaaaaacccccccccb", + " bccccccccaaaaaccaaaaaccccccccb", + " bcccccccaaaaaccccaaaaacccccccb", + " bccccccaaaaaccccccaaaaaccccccb", + " bcccccccaaaccccccccaaacccccccb", + " bcccccccaccccccccccacccccccb ", + " bccccccccccccccccccccccccb ", + " bccccccccccccccccccccccb ", + " bccccccccccccccccccccb ", + " bccccccccccccccccccb ", + " bccccccccccccccccb ", + " bccccccccccccccb ", + " bbbbbbbbbbbbbb " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + return wxNullBitmap; +} + +wxBitmap amuleDlgImages( size_t index ) +{ + if (index == 0) + { + static const unsigned char data[] = + { + 212,208,200,86,102,117,86,102,117,86,102,117,86,102,117,86,102,117,76,93,108,76,93,108,76, + 93,108,76,93,108,67,79,91,67,79,91,67,79,91,57,68,78,48,57,65,212,208,200,212,208, + 200,86,102,117,172,195,217,172,195,217,172,195,217,172,195,217,172,195,217,164,188,211,164,188,211, + 164,188,211,164,188,211,164,188,211,158,183,209,150,179,207,48,57,65,212,208,200,212,208,200,86, + 102,117,172,195,217,245,248,250,200,215,229,181,201,220,181,201,220,181,201,220,172,195,217,164,188, + 211,158,183,209,150,179,207,150,179,207,150,179,207,48,57,65,212,208,200,212,208,200,86,102,117, + 172,194,215,213,224,235,65,255,65,207,255,207,91,227,76,115,135,155,172,194,215,164,188,211,155, + 180,204,150,179,207,143,172,200,141,170,198,48,57,65,212,208,200,212,208,200,86,102,117,171,191, + 211,198,212,226,93,227,93,93,227,93,103,217,102,106,126,146,172,194,215,164,188,211,155,180,204, + 141,170,198,137,167,196,135,165,194,48,57,65,212,208,200,212,208,200,86,102,117,164,188,211,182, + 197,211,76,93,108,76,93,108,76,93,108,87,105,123,171,191,211,155,180,204,150,179,207,135,165, + 194,132,162,191,132,162,191,48,57,65,212,208,200,212,208,200,86,102,117,164,188,211,245,247,250, + 194,209,223,172,194,215,171,191,211,171,191,211,164,188,211,155,180,204,146,171,195,129,158,188,126, + 156,186,126,156,186,48,57,65,212,208,200,212,208,200,76,93,108,164,184,203,220,228,236,255,255, + 0,255,255,191,211,221,70,106,126,146,155,180,204,150,179,207,137,167,196,124,153,181,116,149,179, + 116,149,179,48,57,65,212,208,200,212,208,200,76,93,108,164,184,203,190,205,219,211,221,70,211, + 221,70,193,207,93,93,113,133,155,180,204,137,167,196,129,158,188,116,149,179,116,149,179,101,133, + 162,48,57,65,212,208,200,212,208,200,76,93,108,155,178,198,164,184,203,67,82,98,67,82,98, + 67,82,98,67,82,98,146,171,195,137,163,189,124,153,181,109,140,169,97,128,157,78,97,116,48, + 57,65,212,208,200,212,208,200,76,93,108,146,171,195,232,237,242,182,197,211,155,178,198,155,178, + 198,146,171,195,146,171,195,86,102,117,86,102,117,67,79,91,57,68,78,48,57,65,48,57,65, + 212,208,200,212,208,200,67,79,91,142,163,182,212,221,229,255,124,124,255,222,222,195,63,76,93, + 113,133,129,158,188,86,102,117,181,201,220,164,184,203,106,132,156,68,86,104,68,86,104,212,208, + 200,212,208,200,67,79,91,126,152,175,175,191,205,195,63,76,195,63,76,175,84,101,78,97,116, + 124,153,181,67,79,91,164,184,203,116,140,163,87,115,143,48,57,65,212,208,200,212,208,200,212, + 208,200,67,79,91,116,140,163,142,163,182,50,62,74,50,62,74,50,62,74,50,62,74,82,108, + 138,57,68,78,106,132,156,87,115,143,48,57,65,212,208,200,212,208,200,212,208,200,212,208,200, + 57,68,78,106,132,156,96,124,151,93,121,149,90,118,146,87,115,143,80,105,132,67,82,98,48, + 57,65,68,86,104,48,57,65,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,48,57, + 65,48,57,65,48,57,65,48,57,65,48,57,65,48,57,65,48,57,65,48,57,65,48,57,65, + 68,86,104,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 1) + { + static const unsigned char data[] = + { + 137,170,33,137,170,33,137,170,33,137,170,33,137,170,33,121,151,29,121,151,29,121,151,29,121, + 151,29,107,133,26,107,133,26,107,133,26,91,113,22,75,93,22,212,208,200,212,208,200,137,170, + 33,210,233,138,210,233,138,210,233,138,210,233,138,210,233,138,210,233,138,210,233,138,210,233,138, + 208,232,133,208,232,133,207,231,131,204,230,123,75,93,22,212,208,200,212,208,200,137,170,33,208, + 232,133,208,232,133,208,232,133,164,183,112,66,77,91,66,77,91,66,77,91,120,137,106,164,185, + 117,204,230,123,204,230,123,202,229,118,75,93,22,212,208,200,212,208,200,137,170,33,207,231,131, + 207,231,131,164,185,117,69,81,95,88,118,138,100,147,170,98,138,162,80,104,123,67,71,82,136, + 152,92,197,226,117,200,228,111,75,93,22,212,208,200,212,208,200,137,170,33,207,231,131,204,230, + 123,75,93,109,108,123,138,100,147,170,143,211,236,139,202,231,111,165,193,118,150,174,83,98,112, + 136,152,92,191,220,102,75,93,22,212,208,200,212,208,200,137,170,33,204,230,123,204,230,123,83, + 98,112,177,189,204,84,142,168,213,255,255,228,248,255,139,225,255,117,190,222,114,155,181,75,93, + 109,169,198,93,75,93,22,212,208,200,212,208,200,137,170,33,202,229,118,202,229,118,83,98,112, + 217,227,241,119,141,157,121,192,222,213,255,255,193,238,255,130,220,255,122,194,226,91,127,149,127, + 150,91,75,93,22,212,208,200,212,208,200,121,151,29,202,229,118,202,229,118,83,98,112,200,207, + 222,185,194,209,86,135,161,127,200,224,176,238,255,153,230,255,134,212,244,121,179,208,75,93,109, + 75,92,29,212,208,200,212,208,200,121,151,29,198,227,108,198,227,108,155,182,100,128,140,154,225, + 234,249,177,189,204,98,138,162,103,157,182,130,193,220,126,199,232,111,163,191,75,93,109,75,92, + 29,212,208,200,212,208,200,121,151,29,198,227,108,192,224,94,190,223,89,140,166,96,135,149,164, + 210,218,235,193,201,218,147,163,180,120,147,167,109,140,161,95,121,139,119,141,157,80,94,24,212, + 208,200,212,208,200,121,151,29,188,222,84,188,222,84,186,221,76,186,221,76,142,170,86,106,116, + 130,137,150,166,173,183,199,143,152,169,106,116,130,106,116,130,222,245,249,139,96,85,212,208,200, + 212,208,200,107,133,26,186,221,76,186,221,76,182,219,67,182,219,67,180,218,60,161,196,63,129, + 157,80,92,106,120,89,103,117,152,175,112,101,107,83,161,131,156,243,178,184,189,54,95,212,208, + 200,107,133,26,182,219,67,180,218,60,178,217,55,178,217,55,170,212,41,170,212,41,164,204,42, + 100,124,34,184,212,104,178,215,61,150,185,41,79,54,62,194,63,99,252,171,180,189,54,95,107, + 133,26,178,217,55,170,212,41,170,212,41,170,212,41,165,205,39,165,205,39,149,185,36,91,113, + 22,170,212,41,155,193,37,75,93,22,212,208,200,102,24,56,185,42,83,245,151,164,91,113,22, + 170,212,41,164,204,42,165,205,39,155,193,37,155,193,37,143,178,34,115,143,28,75,93,22,117, + 145,28,75,93,22,212,208,200,212,208,200,212,208,200,110,26,58,185,42,83,75,93,22,75,93, + 22,75,93,22,75,93,22,75,93,22,75,93,22,75,93,22,75,93,22,75,93,22,117,145,28, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,127,7,46 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 2) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,80,95,109,80,95,109,76,90,102,76,90,102,65, + 77,88,65,77,88,65,77,88,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,86,102,117,86,102,117,86,102,117,102,117,130,102,117,130,95,110,122,95,110,122,95,110,122, + 86,102,117,80,95,109,65,77,88,65,77,88,65,77,88,212,208,200,212,208,200,86,102,117,141, + 153,164,125,139,150,109,121,132,109,121,132,109,121,132,102,117,130,102,117,130,102,117,130,101,113, + 124,95,110,122,88,102,113,76,90,102,48,57,65,212,208,200,212,208,200,86,102,117,255,255,255, + 204,212,219,180,190,198,141,153,164,118,133,147,109,121,132,109,121,132,109,121,132,102,117,130,90, + 105,118,76,90,102,63,75,86,48,57,65,212,208,200,212,208,200,80,95,109,255,255,255,230,234, + 237,196,204,211,181,190,200,161,173,185,125,139,150,101,113,124,126,141,154,118,130,143,76,90,102, + 69,82,94,63,75,86,48,57,65,212,208,200,212,208,200,80,95,109,243,245,246,230,234,237,196, + 204,211,181,190,200,161,173,185,125,139,150,90,105,118,161,172,182,118,130,143,76,90,102,69,82, + 94,63,75,86,48,57,65,212,208,200,212,208,200,80,95,109,243,245,246,196,204,211,196,204,211, + 181,190,200,161,173,185,125,139,150,78,93,106,212,219,225,126,141,154,76,90,102,69,82,94,63, + 75,86,48,57,65,212,208,200,212,208,200,80,95,109,230,234,237,76,90,102,224,228,233,171,181, + 189,161,173,185,125,139,150,76,90,102,212,219,225,118,130,143,76,90,102,69,82,94,63,75,86, + 48,57,65,212,208,200,212,208,200,76,90,102,230,234,237,180,190,198,196,204,211,65,77,88,208, + 214,220,76,146,96,21,198,29,175,228,185,109,121,132,27,20,100,27,20,100,27,20,100,22,16, + 81,212,208,200,212,208,200,76,90,102,217,223,228,58,70,79,217,223,228,158,168,178,161,173,185, + 63,167,81,65,255,65,148,204,165,27,20,100,73,120,255,97,138,255,73,120,255,14,43,177,20, + 15,75,212,208,200,76,90,102,217,223,228,180,190,198,196,204,211,45,53,61,196,204,211,65,146, + 87,48,143,65,27,20,100,73,120,255,97,138,255,255,255,255,255,255,255,49,102,255,14,43,177, + 20,15,75,76,90,102,217,223,228,45,53,61,212,219,225,158,168,178,161,173,185,114,105,105,202, + 79,85,27,20,100,97,138,255,97,138,255,97,138,255,97,138,255,73,120,255,0,66,255,20,15, + 75,76,90,102,171,181,189,204,212,219,196,204,211,45,53,61,187,196,204,126,88,99,255,0,10, + 27,20,100,49,102,255,97,138,255,255,255,255,255,255,255,49,102,255,0,66,255,20,15,75,76, + 90,102,76,90,102,109,121,132,141,153,164,161,173,185,161,173,185,114,105,105,138,84,93,22,16, + 81,14,43,177,37,93,255,255,255,255,255,255,255,0,66,255,14,43,177,20,15,75,212,208,200, + 212,208,200,65,77,88,65,77,88,65,77,88,101,113,124,118,130,143,76,90,102,118,133,147,20, + 15,75,14,43,177,0,66,255,0,66,255,14,43,177,20,15,75,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,65,77,88,65,77,88,65,77,88,65,77,88,65,77,88, + 25,21,67,20,15,75,20,15,75,20,15,75,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 3) + { + static const unsigned char data[] = + { + 212,208,200,0,81,156,0,81,156,0,81,156,212,208,200,0,81,156,0,81,156,0,81,156,212, + 208,200,0,71,139,0,71,139,0,71,139,212,208,200,0,71,139,0,64,125,0,53,107,212,208, + 200,0,81,156,168,199,228,184,207,227,0,81,156,180,205,227,168,199,228,174,202,228,0,81,156, + 168,199,228,168,199,228,160,196,228,0,71,139,160,196,228,168,199,228,0,53,107,212,208,200,0, + 81,156,228,237,245,0,81,156,212,208,200,0,81,156,219,233,246,0,81,156,212,208,200,0,81, + 156,206,227,246,0,71,139,212,208,200,0,71,139,191,220,247,0,53,107,212,208,200,0,81,156, + 228,237,245,152,188,220,0,81,156,149,187,220,236,244,252,149,187,220,0,81,156,143,184,221,220, + 237,252,140,182,221,0,71,139,140,182,221,196,228,252,0,53,107,212,208,200,0,81,156,243,247, + 251,243,247,251,189,214,236,236,244,252,236,244,252,230,242,252,180,210,237,220,237,252,220,237,252, + 213,235,252,170,205,237,204,229,253,196,228,252,0,53,107,212,208,200,0,81,156,236,244,252,236, + 244,252,236,244,252,236,244,252,230,242,252,230,242,252,220,237,252,220,237,252,213,235,252,209,231, + 253,204,229,253,196,228,252,188,223,253,0,53,107,212,208,200,0,81,156,236,244,252,129,178,222, + 44,125,199,124,178,226,91,154,212,44,125,199,44,125,199,44,125,199,84,151,212,112,171,221,132, + 184,230,196,228,252,181,221,252,0,53,107,212,208,200,0,81,156,230,242,252,230,242,252,230,242, + 252,230,242,252,220,237,252,220,237,252,213,235,252,213,235,252,204,229,253,196,228,252,196,228,252, + 188,223,253,174,219,251,0,53,107,212,208,200,0,81,156,220,237,252,123,175,222,91,154,212,44, + 125,199,44,125,199,44,125,199,84,151,212,153,198,236,196,228,252,189,226,250,188,223,253,181,221, + 252,163,212,250,0,53,107,212,208,200,0,71,139,213,235,252,213,235,252,213,235,252,207,232,251, + 204,229,253,204,229,253,196,228,252,196,228,252,189,226,250,181,221,252,181,221,252,171,215,252,155, + 210,250,0,53,107,212,208,200,0,71,139,204,229,253,112,171,221,84,151,212,36,122,199,36,122, + 199,76,148,212,36,122,199,36,122,199,70,146,212,96,163,222,139,195,239,163,212,250,146,206,250, + 0,53,107,212,208,200,0,71,139,196,228,252,189,226,250,189,226,250,188,223,253,181,221,252,181, + 221,252,174,219,251,174,219,251,163,212,250,163,212,250,163,212,250,155,210,250,137,202,250,0,53, + 107,212,208,200,0,62,122,181,221,252,70,146,212,36,122,199,36,122,199,70,146,212,107,175,228, + 64,143,212,31,120,199,30,119,199,61,141,212,81,158,221,93,167,228,124,195,248,0,53,107,212, + 208,200,0,62,122,149,208,248,146,206,250,137,202,250,139,203,247,139,203,247,134,203,249,134,203, + 249,134,203,249,130,199,249,130,199,249,124,195,248,117,191,246,100,179,243,0,53,107,212,208,200, + 0,62,122,109,185,242,109,185,242,109,185,242,104,181,239,104,181,239,109,185,242,109,185,242,109, + 185,242,105,183,243,100,179,243,100,179,243,94,173,241,87,168,238,0,53,107,212,208,200,0,53, + 107,0,53,107,0,53,107,0,53,107,0,53,107,0,53,107,0,53,107,0,53,107,0,53,107, + 0,53,107,0,53,107,0,53,107,0,53,107,0,53,107,0,53,107 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 4) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,36,93,43,34,83,40,32, + 73,37,32,73,37,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,36,93,43,76,161,115,76,190,130,40,178,106, + 0,114,54,28,54,31,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,36,93,43,76,161,115,255,255,255,161,215,181,109,199,126,0,166, + 81,0,114,54,28,54,31,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,36,93,43,76,190,130,185,225,200,130,202,156,109,199,126,57,181,74,0, + 166,81,28,54,31,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,24,81,41,40,178,106,109,199,126,109,199,126,83,190,101,57,181,74,0,166,81, + 28,54,31,28,54,31,28,54,31,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,13,70,40,17,131,61,29,174,77,57,181,74,57,181,74,0,166,81,0,114,54,28,54, + 31,7,92,47,18,80,43,28,54,31,212,208,200,212,208,200,212,208,200,212,208,200,36,93,43, + 9,83,44,28,54,31,4,127,62,0,166,81,0,166,81,0,114,54,28,54,31,2,108,52,4, + 127,62,11,105,51,28,54,31,212,208,200,212,208,200,212,208,200,36,93,43,29,140,62,10,126, + 57,5,95,48,28,54,31,28,54,31,28,54,31,28,54,31,2,108,52,29,140,62,11,105,51, + 4,127,62,28,54,31,212,208,200,212,208,200,36,93,43,118,203,130,138,211,149,44,159,67,22, + 139,61,0,114,54,0,114,54,0,114,54,22,139,61,44,159,67,29,140,62,15,88,46,4,127, + 62,28,54,31,212,208,200,212,208,200,36,93,43,202,235,208,105,199,119,50,143,62,64,175,84, + 119,186,135,92,176,111,68,168,89,78,181,96,57,181,74,29,140,62,18,80,43,4,127,62,28, + 54,31,212,208,200,212,208,200,36,93,43,138,211,149,83,190,101,42,104,50,83,190,101,236,248, + 239,146,213,159,109,199,126,88,193,103,57,181,74,29,140,62,28,54,31,4,127,62,28,54,31, + 212,208,200,212,208,200,36,93,43,118,203,130,57,181,74,34,65,38,83,190,101,236,248,239,146, + 213,159,109,199,126,88,193,103,57,181,74,29,140,62,28,54,31,28,54,31,28,54,31,212,208, + 200,212,208,200,36,93,43,91,193,105,57,181,74,28,54,31,83,190,101,218,241,223,130,207,144, + 109,199,126,88,193,103,57,181,74,29,140,62,28,54,31,212,208,200,212,208,200,212,208,200,212, + 208,200,36,93,43,57,181,74,57,181,74,28,54,31,83,190,101,164,220,175,118,203,130,88,193, + 103,88,193,103,53,162,68,28,54,31,28,54,31,212,208,200,212,208,200,212,208,200,212,208,200, + 32,73,37,57,181,74,57,181,74,28,54,31,57,181,74,124,205,138,99,195,115,73,158,85,28, + 54,31,28,54,31,28,54,31,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,32,73, + 37,28,54,31,28,54,31,212,208,200,28,54,31,28,54,31,28,54,31,28,54,31,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 5) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 16 1", + " c None", + "a c Black", + "b c #110000", + "c c #6F4848", + "d c #7F0000", + "e c #220000", + "f c #444444", + "g c #888888", + "h c #8C0000", + "i c #4C4040", + "j c #C10000", + "k c #191919", + "l c #2A2A2A", + "m c #FF0000", + "n c #666666", + "p c #333333", + /* pixels */ + " h ", + " dma ", + " dmjma ", + " dmjhjma ", + " amjhlhjma ", + " aapanpaaa ", + " aga ", + " kpk ana ", + " pnp ppa ", + " fgi ", + " bebanabeb ", + " cmjhphjmi ", + " cmjhjmi ", + " cmjmi ", + " cmi ", + " h " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 6) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 17 1", + " c None", + "a c #444444", + "b c #114C11", + "c c #888888", + "d c #790000", + "e c #008000", + "f c #007700", + "g c #191919", + "h c #00B700", + "i c #B70000", + "j c #2A2A2A", + "k c #FF0000", + "l c #666666", + "m c #002A00", + "o c #00FF00", + "p c #333333", + "q c #001500", + /* pixels */ + " d ", + " dkd ", + " dkikd ", + " dkidikd ", + " dkidjdikd ", + " l ", + " c ", + " gpg l ", + " plp pp ", + " aca ", + " qmqlllqmq ", + " eohbpbhoe ", + " eohfhoe ", + " eohoe ", + " eoe ", + " e " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 7) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 16 1", + " c None", + "a c #110000", + "b c #6F4848", + "c c #220000", + "d c #444444", + "e c #888888", + "f c #008000", + "g c #770000", + "h c #191919", + "i c #BB0000", + "j c #00AE00", + "k c #2A2A2A", + "l c #FF0000", + "m c #666666", + "o c #00FF00", + "p c #333333", + /* pixels */ + " f ", + " fof ", + " fojof ", + " fojfjof ", + " fojfkfjof ", + " mp ", + " e ", + " hph m ", + " pmp pp ", + " ded ", + " acammmaca ", + " bligpgilg ", + " bligilg ", + " glilg ", + " glg ", + " g " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 8) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 12 1", + " c None", + "a c #006F00", + "b c #888888", + "c c #191919", + "d c #404F40", + "e c #00D400", + "f c #666666", + "g c #002A00", + "i c #00FF00", + "j c #333333", + "k c #001500", + "l c #00CA00", + /* pixels */ + " a ", + " aia ", + " ailia ", + " ailalia ", + " aila alia ", + " fj ", + " b ", + " cjc f ", + " jfj jj ", + " dbd ", + " kgk f kgk ", + " aila aeia ", + " ailalia ", + " ailia ", + " aia ", + " a " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 9) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "16 16 8 1", + " c None", + "a c #FFF0D4", + "b c #008000", + "c c #800000", + "d c #FFAA25", + "e c #C0C0C0", + "g c #808000", + "h c #232375", + /* pixels */ + " ", + " c cc ", + " ccc eeeee cccc", + " cccceaaebccccc ", + " ccccbbbcccccd ", + "gggcccchccccbga ", + " adccccccchgad ", + " adcccccagadd ", + " gaddcccccdadd ", + "gaddcccccccdd ", + "gddcccchccccdd ", + "gdcccc hcccc ", + "gdcccb hhhccc ", + " cccc hhhhcccc ", + " cc cccc ", + " c " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 10) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,55,101,59,55,101,59,55,101,59,55,101,59,55,101,59,55,101,59, + 55,101,59,55,101,59,46,69,56,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,55,101,59,89,204,87,202,250,201,66,211,63,65,186,63,58,142, + 60,46,69,56,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,55,101,59,98,205,96,67,235,63,58,142,60,46,69,56,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,55,101, + 59,55,101,59,55,101,59,51,87,58,55,101,59,63,173,62,46,69,56,51,87,58,55,101,59, + 55,101,59,46,69,56,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,55, + 101,59,63,173,62,157,245,155,77,164,79,46,69,56,58,142,60,65,186,63,64,159,62,46,69, + 56,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 55,101,59,63,173,62,202,250,201,83,165,86,65,186,63,64,159,62,46,69,56,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,55,101,59,55,101,59,55,101,59,55,101,59,52,89, + 58,55,101,59,63,173,62,134,242,132,64,159,62,46,69,56,52,89,58,55,101,59,55,101,59, + 57,91,60,46,69,56,212,208,200,212,208,200,55,101,59,60,158,61,66,211,63,169,255,167,104, + 184,107,55,101,59,63,173,62,46,69,56,58,142,60,65,186,63,65,186,63,64,133,62,46,69, + 56,212,208,200,212,208,200,212,208,200,212,208,200,55,101,59,60,158,61,67,235,63,202,250,201, + 120,184,122,46,69,56,58,142,60,65,186,63,65,186,63,64,133,62,46,69,56,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,55,101,59,60,158,61,67,235,63,247,255, + 246,115,181,118,65,186,63,65,186,63,64,133,62,46,69,56,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,55,101,59,60,158,61,66,211,63,188, + 249,186,65,186,63,64,133,62,46,69,56,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,55,101,59,60,158,61,66,204,63, + 65,151,62,46,69,56,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,55,101,59,60,158,61,46,69, + 56,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,46,69,56,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 11) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,46,69,56, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,46,69,56,60,158,61,55,101, + 59,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,46,69,56,65,151,62,66,204,63,60,158,61,55, + 101,59,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,46,69,56,64,133,62,65,186,63,188,249,186,66,211,63,60,158,61, + 55,101,59,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,46,69,56,64,133,62,65,186,63,65,186,63,115,181,118,247,255,246,67,235,63,60,158, + 61,55,101,59,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,46,69,56, + 64,133,62,65,186,63,65,186,63,58,142,60,46,69,56,120,184,122,202,250,201,67,235,63,60, + 158,61,55,101,59,212,208,200,212,208,200,212,208,200,212,208,200,46,69,56,64,133,62,65,186, + 63,65,186,63,58,142,60,46,69,56,63,173,62,55,101,59,104,184,107,169,255,167,66,211,63, + 60,158,61,55,101,59,212,208,200,212,208,200,46,69,56,57,91,60,55,101,59,55,101,59,52, + 89,58,46,69,56,64,159,62,134,242,132,63,173,62,55,101,59,52,89,58,55,101,59,55,101, + 59,55,101,59,55,101,59,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,46,69,56, + 64,159,62,65,186,63,83,165,86,202,250,201,63,173,62,55,101,59,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,46,69,56,64,159,62,65,186, + 63,58,142,60,46,69,56,77,164,79,157,245,155,63,173,62,55,101,59,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,46,69,56,55,101,59,55,101,59,51,87,58,46, + 69,56,63,173,62,55,101,59,51,87,58,55,101,59,55,101,59,55,101,59,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,46,69,56,58,142,60, + 67,235,63,98,205,96,55,101,59,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,46,69,56,58,142,60,65,186,63,66,211, + 63,202,250,201,89,204,87,55,101,59,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,46,69,56,55,101,59,55,101,59,55,101,59,55,101,59,55, + 101,59,55,101,59,55,101,59,55,101,59,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 12) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,0,60,131,0,60,131,0,60,131,0,60,131,0,60,131,0,57,124,0,57,124, + 0,57,124,0,57,124,0,57,124,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,60,131,0,60,131,0,60,131, + 21,88,167,59,149,219,84,175,237,116,194,250,126,198,251,131,201,251,126,198,251,117,184,238,113, + 166,218,36,95,159,0,57,124,0,53,114,0,53,114,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,0,63,138,0,60,131,27,101,174,73,151,216,117,188,243,149,204,251,156, + 209,251,190,225,253,190,225,253,190,225,253,190,225,253,190,225,253,190,225,253,180,217,247,175,213, + 243,157,197,238,113,166,218,52,101,155,0,53,114,0,53,114,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,64,139,0, + 63,138,39,116,196,73,151,216,142,195,253,181,220,251,212,235,254,231,244,255,253,255,255,253,255, + 255,253,255,255,253,255,255,253,255,255,253,255,255,253,255,255,253,255,255,253,255,255,234,246,255, + 212,235,254,190,225,253,149,179,215,63,110,162,0,53,114,0,50,108,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,64,139,21,88,167,59,149,219,116,194, + 250,181,220,251,212,235,254,253,255,255,253,255,255,253,255,255,253,255,255,253,255,255,253,255,255, + 253,255,255,253,255,255,253,255,255,253,255,255,253,255,255,253,255,255,253,255,255,253,255,255,238, + 248,255,212,235,254,195,229,255,149,179,215,35,85,141,0,50,108,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,0,64,139,39,107,184,59,149,219,116,194,250,181,220,251,242,242,241, + 227,229,234,222,224,230,212,220,230,202,218,234,202,218,234,202,218,234,198,214,230,198,214,230,198, + 214,230,198,214,230,202,218,234,202,218,234,202,218,234,212,220,230,212,220,230,222,224,230,227,229, + 234,205,226,244,189,222,251,157,197,238,63,110,162,0,50,108,212,208,200,212,208,200,212,208,200, + 0,63,138,27,101,174,59,149,219,126,198,251,190,225,253,242,242,241,123,151,186,0,63,138,0, + 63,138,0,63,138,0,63,138,100,133,174,0,63,138,0,63,138,0,63,138,0,63,138,0,63, + 138,0,63,138,100,133,174,0,63,138,0,63,138,0,63,138,0,63,138,0,63,138,123,151,186, + 205,226,244,189,222,251,113,166,218,35,85,141,0,50,108,212,208,200,212,208,200,0,64,139,65, + 130,199,116,194,250,189,222,251,253,255,255,202,218,234,0,63,138,255,128,128,255,128,128,255,128, + 128,217,0,0,0,63,138,255,128,128,255,128,128,255,128,128,255,128,128,255,128,128,217,0,0, + 0,63,138,255,255,224,255,255,224,255,255,224,255,255,224,217,217,0,0,63,138,227,229,234,212, + 235,254,158,203,252,83,132,189,0,50,108,212,208,200,0,64,139,39,107,184,91,164,225,181,220, + 251,234,246,255,238,248,255,183,207,230,0,63,138,255,128,128,253,255,255,255,5,4,181,0,1, + 0,63,138,255,128,128,253,255,255,255,5,4,255,5,4,255,5,4,188,0,3,0,63,138,255, + 255,0,255,255,0,255,255,0,255,255,0,178,178,0,0,63,138,212,220,230,238,248,255,181,220, + 251,121,174,233,24,82,156,0,50,108,0,64,139,65,130,199,142,195,253,189,222,251,243,250,255, + 212,235,254,183,207,230,0,63,138,255,98,98,181,0,1,181,0,1,181,0,1,0,63,138,255, + 128,128,255,5,4,255,5,4,181,0,1,181,0,1,188,0,3,0,63,138,255,255,0,178,178, + 0,178,178,0,178,178,0,178,178,0,0,63,138,202,218,234,243,250,255,181,220,251,138,191,251, + 39,107,184,0,50,108,0,63,138,91,164,225,149,204,251,189,222,251,243,250,255,206,233,255,173, + 202,230,0,63,138,0,63,138,0,63,138,0,63,138,0,63,138,0,63,138,255,128,128,255,5, + 4,255,5,4,181,0,1,0,63,138,0,63,138,0,63,138,255,255,0,0,63,138,0,63,138, + 0,63,138,0,63,138,104,141,186,193,221,244,238,248,255,172,214,254,131,187,249,65,130,199,0, + 50,108,0,63,138,117,184,238,158,203,252,189,222,251,238,248,255,195,229,255,173,202,230,0,63, + 138,255,128,128,255,128,128,255,128,128,194,0,0,0,63,138,255,128,128,255,5,4,255,5,4, + 181,0,1,0,63,138,255,255,224,255,255,0,255,255,0,0,63,138,138,162,193,149,175,206,149, + 179,215,172,203,233,189,222,251,231,244,255,172,214,254,118,177,247,58,133,232,0,50,108,0,63, + 138,91,164,225,166,210,254,172,214,254,206,233,255,190,225,253,165,198,230,0,63,138,255,128,128, + 253,255,255,255,5,4,181,0,1,0,63,138,255,128,128,255,5,4,255,5,4,181,0,1,0, + 63,138,255,255,224,255,255,0,255,255,0,0,63,138,0,63,138,0,63,138,0,63,138,77,121, + 175,179,212,243,203,231,255,149,198,252,99,164,246,55,127,230,0,45,98,0,60,131,83,132,189, + 158,203,252,166,210,254,190,225,253,189,222,251,165,198,230,0,63,138,255,128,128,255,5,4,255, + 5,4,181,0,1,0,63,138,255,128,128,255,5,4,255,5,4,181,0,1,0,63,138,255,255, + 224,255,255,0,255,255,0,255,255,224,255,255,224,255,255,224,217,217,0,0,63,138,172,203,233, + 190,225,253,123,180,249,78,148,242,37,108,208,0,45,98,0,63,138,36,95,159,113,166,218,166, + 210,254,181,220,251,189,222,251,165,198,230,0,63,138,255,128,128,255,5,4,255,5,4,181,0, + 1,0,63,138,255,128,128,255,5,4,255,5,4,181,0,1,0,63,138,255,255,224,255,255,0, + 255,255,0,255,255,0,255,255,0,255,255,0,178,178,0,0,63,138,165,198,230,166,210,254,108, + 169,247,62,137,237,17,77,156,0,50,108,212,208,200,0,60,131,65,130,199,100,41,9,100,41, + 9,100,41,9,163,197,234,0,63,138,100,41,9,100,41,9,100,41,9,100,41,9,100,41,9, + 100,41,9,100,41,9,181,0,1,181,0,1,0,63,138,255,255,168,160,165,11,165,170,11,165, + 170,11,165,170,11,165,170,11,169,172,11,0,63,138,163,197,234,138,191,251,91,157,244,47,118, + 215,0,45,98,212,208,200,212,208,200,0,60,131,100,41,9,212,141,78,100,41,9,158,203,252, + 100,41,9,100,41,9,218,161,108,212,141,78,206,130,64,206,130,64,174,99,39,100,41,9,0, + 63,138,0,63,138,0,63,138,77,121,175,0,63,138,0,63,138,0,63,138,0,63,138,0,63, + 138,0,63,138,0,63,138,83,132,189,141,187,240,91,157,244,62,137,237,17,77,156,0,45,98, + 212,208,200,212,208,200,100,41,9,198,117,48,180,104,44,100,41,9,100,41,9,235,201,153,228, + 184,134,211,142,82,206,130,64,155,85,34,100,41,9,100,41,9,157,197,238,150,190,230,150,190, + 230,157,197,238,157,197,238,163,197,234,165,198,230,165,198,230,165,198,230,165,198,230,158,194,230, + 157,197,238,141,187,240,91,157,244,67,137,242,45,112,205,0,45,98,212,208,200,212,208,200,212, + 208,200,100,41,9,180,104,44,120,57,16,206,130,64,224,174,125,214,149,87,212,141,78,134,70, + 26,100,41,9,133,133,136,158,203,252,166,210,254,166,210,254,166,210,254,166,210,254,166,210,254, + 166,210,254,166,210,254,181,220,251,189,222,251,189,222,251,189,222,251,172,214,254,149,198,252,78, + 148,242,55,127,230,45,112,205,24,82,156,0,45,98,212,208,200,212,208,200,100,41,9,100,41, + 9,142,75,27,206,130,64,212,141,78,206,130,64,174,99,39,100,41,9,103,91,99,129,146,175, + 123,180,249,142,195,253,142,195,253,142,195,253,142,195,253,142,195,253,142,195,253,142,195,253,149, + 198,252,160,206,253,181,220,251,181,220,251,181,220,251,127,189,249,91,157,244,66,137,236,39,107, + 184,17,77,156,0,45,98,212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,145,76,27, + 186,108,44,174,99,39,174,99,39,120,57,16,155,85,34,100,41,9,39,116,196,62,137,237,99, + 164,246,103,169,248,109,170,248,108,169,247,109,170,248,109,170,248,109,170,248,123,180,249,138,191, + 251,158,203,252,172,214,254,131,187,249,78,148,242,66,137,236,24,87,177,10,64,131,0,50,108, + 212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,100,41,9,165,92,37,186,108,44,198, + 117,48,90,45,18,224,174,125,238,210,174,182,112,56,100,41,9,0,53,114,13,81,165,20,98, + 210,33,113,232,47,130,240,54,132,241,54,132,241,68,144,242,99,164,246,119,178,249,149,198,252, + 138,191,251,78,148,242,55,127,230,21,88,167,0,50,108,0,50,108,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,100,41,9,186,108,44,198,117,48,198,117,48,218,161, + 108,253,255,255,221,219,215,212,208,200,142,75,27,100,41,9,69,49,42,50,55,62,50,55,62, + 0,53,114,0,50,108,0,50,108,1,68,153,6,87,198,99,164,246,131,187,249,99,164,246,33, + 113,232,21,88,167,0,50,108,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,100,41,9,111,49,13,198,117,48,206,130,64,198,117,48,207,135,74,246,231,218, + 154,151,148,72,73,76,167,96,42,209,178,139,229,220,210,242,242,241,189,189,182,50,55,62,212, + 208,200,212,208,200,0,50,108,1,68,153,20,98,210,91,157,244,54,132,241,21,88,167,0,50, + 108,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 100,41,9,145,76,27,212,141,78,220,162,92,214,149,87,202,123,56,207,135,74,214,149,87,194, + 119,57,198,131,56,209,178,139,104,106,109,23,22,20,242,242,241,180,180,177,50,55,62,212,208, + 200,212,208,200,0,50,108,6,87,198,54,132,241,6,87,198,0,45,98,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,174, + 99,39,212,141,78,238,210,174,224,174,125,212,141,78,202,123,56,180,104,44,173,98,40,190,125, + 63,180,180,177,170,170,167,160,160,158,242,242,241,227,227,224,50,55,62,212,208,200,212,208,200, + 0,50,108,6,87,198,20,98,210,0,50,108,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,145,76,27,205,129, + 63,217,154,97,218,161,108,212,141,78,202,123,56,186,108,44,173,98,40,182,112,56,212,205,194, + 232,232,230,242,242,241,253,255,255,239,239,237,50,55,62,212,208,200,212,208,200,0,50,108,5, + 78,176,0,50,108,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,100,41,9,111,49,13,180,104,44,205,129,63, + 205,129,63,216,156,71,198,117,48,186,108,44,165,92,37,182,139,103,201,194,185,221,219,215,232, + 232,230,239,239,237,232,232,230,50,55,62,212,208,200,212,208,200,0,45,98,0,50,108,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,100,41,9,120,57,16,100,41,9,165,92,37,165,92,37,165, + 92,37,165,92,37,155,85,34,124,77,45,160,160,158,203,203,199,104,106,109,203,203,199,221,219, + 215,133,133,136,50,55,62,212,208,200,212,208,200,0,50,108,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,111,49,13,142,75,27,151,81,30,131,63,20,104,43,9,100,41,9,90,45, + 18,63,51,48,50,55,62,109,112,114,154,151,148,180,180,177,72,73,76,50,55,62,50,55,62, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,111,49,13,145,76,27,195,122,49,228,156,63,212,140,56,173,98,40,100,41,9,212,208,200, + 212,208,200,50,55,62,50,55,62,50,55,62,50,55,62,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 32, 32, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 13) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,58,111,0,55,110,0,51,101,0, + 57,108,0,57,108,0,56,113,212,208,200,0,47,89,0,24,45,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,0,56,113,0,58,111,6,95,163,12,147,232,138,198,217,60,190,123, + 13,140,211,4,87,148,0,47,89,99,11,11,99,11,11,0,24,45,212,208,200,212,208,200,212, + 208,200,0,54,113,46,127,99,104,229,123,0,148,197,2,182,255,75,205,175,16,169,151,2,70, + 127,0,64,130,47,124,71,0,47,89,156,16,16,122,13,13,0,24,45,212,208,200,0,54,113, + 61,116,106,242,255,221,20,210,175,0,161,222,14,201,241,88,214,97,0,106,188,2,70,127,243, + 127,127,0,47,89,101,11,11,201,22,22,151,16,16,0,24,45,212,208,200,0,54,113,148,220, + 148,28,207,135,0,164,210,0,211,252,0,219,242,0,142,186,20,132,186,0,64,130,252,222,222, + 241,96,96,236,27,27,237,34,34,168,19,19,0,24,45,0,58,111,0,100,144,60,218,133,0, + 159,216,14,201,241,90,236,255,0,211,252,2,182,255,35,169,223,0,64,130,255,255,255,246,163, + 163,241,88,88,221,25,25,0,24,45,0,25,49,0,51,101,0,122,137,0,138,171,0,150,192, + 8,202,231,78,206,223,8,202,231,247,247,218,131,223,126,0,64,130,248,179,179,241,96,96,229, + 26,26,160,18,18,0,24,45,0,32,58,0,64,130,0,64,130,0,64,130,0,64,130,2,70, + 127,0,64,130,0,24,45,111,231,84,34,208,30,0,64,130,240,81,81,229,26,26,201,22,22, + 186,21,21,123,13,13,0,24,45,0,64,130,240,81,81,247,173,173,255,255,255,251,216,216,240, + 81,81,0,24,45,10,170,157,8,129,82,0,64,130,0,24,45,0,24,45,0,24,45,0,24, + 45,0,24,45,0,24,45,0,47,89,0,64,130,240,76,76,245,145,145,239,72,72,229,26,26, + 0,24,45,0,141,223,20,133,207,14,123,183,0,87,159,0,82,159,0,75,148,0,64,130,0, + 60,115,0,30,49,0,46,93,0,64,130,237,34,34,239,72,72,229,26,26,201,22,22,0,24, + 45,138,198,217,237,247,201,77,189,66,38,150,157,20,126,206,0,90,204,0,87,166,0,63,111, + 0,34,65,0,64,130,178,20,20,218,25,25,193,21,21,123,13,13,168,19,19,0,24,45,160, + 206,114,40,186,55,36,177,46,80,196,31,61,163,74,2,103,188,1,92,180,0,41,65,212,208, + 200,0,64,130,106,12,12,196,22,22,122,13,13,0,24,45,122,13,13,0,24,45,69,171,44, + 40,177,40,54,178,52,49,164,56,32,124,96,3,100,179,2,78,136,0,37,71,212,208,200,0, + 64,130,108,12,12,156,16,16,0,24,45,0,73,146,0,24,45,0,24,45,53,150,114,49,157, + 56,50,155,73,32,123,110,2,91,175,2,70,127,0,37,71,212,208,200,212,208,200,212,208,200, + 0,24,45,86,9,9,104,11,11,0,24,45,0,58,111,0,87,178,0,87,178,9,93,143,7, + 94,152,3,68,119,0,37,73,0,37,73,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,0,24,45,0,24,45,212,208,200,0,35,67,0,41,65,0,40,71,0,40,71,0,42,73, + 0,37,73,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 14) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,9,84,125,8,73,108,7,65,97,7, + 65,97,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,9,84,125,16,149,221,27,164,239,15,139,206,10,90,133, + 6,52,77,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,9,84,125,16,149,221,255,255,255,130,205,246,67,180,242,14,132,196,10,94, + 140,6,52,77,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,9,84,125,27,164,239,162,218,249,93,191,244,67,180,242,16,149,221,13,121,180,6, + 52,77,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,7,65,97,15,139,206,67,180,242,67,180,242,33,167,240,16,149,221,13,121,180,6,52,77, + 6,52,77,6,52,77,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,6, + 52,77,10,94,140,15,139,206,16,149,221,16,149,221,13,126,187,10,90,133,6,52,77,8,73, + 108,7,65,97,6,52,77,212,208,200,212,208,200,212,208,200,212,208,200,9,84,125,6,58,86, + 6,52,77,9,84,125,12,116,172,12,116,172,10,90,133,6,52,77,9,78,116,10,90,133,9, + 84,125,6,52,77,212,208,200,212,208,200,212,208,200,9,84,125,12,111,165,10,94,140,7,62, + 92,6,52,77,6,52,77,6,52,77,6,52,77,121,0,0,121,0,0,9,84,125,121,0,0, + 121,0,0,212,208,200,212,208,200,9,84,125,78,185,243,104,195,244,14,132,196,12,116,172,10, + 94,140,10,94,140,10,94,140,121,0,0,242,84,90,237,28,36,121,0,0,237,28,36,237,28, + 36,68,1,0,212,208,200,9,84,125,186,227,250,63,179,242,13,121,180,16,149,221,63,179,242, + 27,164,239,121,0,0,242,84,90,251,199,201,245,122,126,239,49,56,245,117,122,243,100,105,237, + 28,36,68,1,0,9,84,125,104,195,244,27,164,239,10,94,140,33,167,240,231,245,253,113,198, + 245,121,0,0,245,130,134,254,241,241,248,170,173,244,109,113,248,167,170,245,117,122,226,26,34, + 68,1,0,9,84,125,78,185,243,16,149,221,7,62,92,33,167,240,231,245,253,113,198,245,121, + 0,0,242,84,90,251,199,201,247,156,160,246,145,149,245,122,126,242,89,95,195,21,27,68,1, + 0,9,84,125,44,171,240,16,149,221,6,52,77,33,167,240,207,236,252,93,191,244,67,180,242, + 121,0,0,241,67,74,247,156,160,245,132,136,243,97,103,219,25,33,68,1,0,212,208,200,9, + 84,125,16,149,221,16,149,221,6,52,77,33,167,240,138,209,247,72,182,242,44,171,240,44,171, + 240,121,0,0,237,28,36,245,126,130,219,25,33,68,1,0,212,208,200,212,208,200,7,65,97, + 16,149,221,16,149,221,6,52,77,16,149,221,85,187,243,54,175,241,15,144,215,6,52,77,6, + 52,77,121,0,0,179,14,18,68,1,0,212,208,200,212,208,200,212,208,200,7,65,97,6,52, + 77,6,52,77,212,208,200,6,52,77,6,52,77,6,52,77,6,52,77,212,208,200,212,208,200, + 212,208,200,68,1,0,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 15) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,165,121,54,165, + 121,54,165,121,54,165,121,54,165,121,54,165,121,54,165,121,54,165,121,54,165,121,54,165,121, + 54,165,121,54,165,121,54,165,121,54,165,121,54,165,121,54,152,106,46,165,121,54,255,255,255, + 255,255,255,254,251,221,254,246,188,254,244,172,254,243,155,254,243,155,253,238,121,253,238,121,253, + 238,121,253,238,121,253,238,121,253,238,121,245,227,114,138,90,37,165,121,54,255,255,255,254,251, + 221,254,246,188,254,246,188,254,243,155,254,243,155,254,243,155,253,238,121,253,238,121,253,238,121, + 253,238,121,253,238,121,253,238,121,245,227,114,138,90,37,165,121,54,254,251,221,237,222,159,221, + 198,131,221,197,123,205,172,90,205,172,90,205,172,90,221,194,97,199,130,68,192,153,75,192,153, + 75,204,151,76,224,189,95,245,227,114,138,90,37,165,121,54,254,246,188,254,246,188,254,244,172, + 254,243,155,254,243,155,254,243,155,253,238,121,253,238,121,253,238,121,253,238,121,253,238,121,253, + 238,121,245,227,114,239,218,109,138,90,37,165,121,54,254,244,172,231,210,126,209,178,98,198,162, + 85,192,153,75,198,162,85,220,192,94,253,238,121,192,153,75,192,153,75,192,153,75,192,153,75, + 224,189,95,239,218,109,138,90,37,165,121,54,254,243,155,254,243,155,254,243,155,254,243,155,254, + 241,138,253,238,121,253,238,121,253,238,121,253,238,121,253,238,121,253,238,121,253,238,121,253,238, + 121,239,218,109,138,90,37,165,121,54,254,243,155,231,210,126,208,175,81,189,149,66,189,149,66, + 208,175,81,208,175,81,192,153,68,192,153,75,192,153,75,192,153,75,192,153,75,216,177,87,239, + 218,109,138,90,37,165,121,54,253,238,121,253,238,121,253,238,121,253,238,121,253,238,121,253,238, + 121,253,238,121,253,238,121,253,238,121,253,238,121,253,238,121,253,238,121,253,238,121,239,218,109, + 138,90,37,165,121,54,253,238,121,253,238,121,253,238,121,253,238,121,253,238,121,253,238,121,249, + 232,117,245,227,114,245,227,114,245,227,114,253,238,121,253,238,121,253,238,121,239,218,109,138,90, + 37,152,106,46,138,90,37,138,90,37,138,90,37,138,90,37,138,90,37,138,90,37,138,90,37, + 138,90,37,138,90,37,138,90,37,138,90,37,138,90,37,138,90,37,138,90,37,138,90,37,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 16) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,0,0,0, + 0,0,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,0,0,0,0,0,0,0,0, + 0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,0,0,0,255,255,255,255,255,255,255,255,255,217,217,217,0, + 0,0,0,0,0,217,217,217,252,252,252,249,249,249,244,244,244,217,217,217,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,0,0, + 217,217,217,255,255,255,255,255,255,253,253,253,251,251,251,0,0,0,0,0,0,247,247,247,246, + 246,246,244,244,244,241,241,241,238,238,238,0,0,0,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,0,0,0,217,217,217,255,255,255,255,255,255, + 253,253,253,251,251,251,0,0,0,0,0,0,247,247,247,246,246,246,244,244,244,241,241,241,238, + 238,238,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,0,0,0,248,248,248,246,246,246,244,244,244,242,242,242,240,240,240,0,0,0, + 0,0,0,236,236,236,235,235,235,233,233,233,231,231,231,229,229,229,0,0,0,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,0,0,240,240, + 240,0,0,0,217,217,217,235,235,235,233,233,233,0,0,0,0,0,0,229,229,229,0,0,0, + 217,217,217,223,223,223,222,222,222,0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,0,0,0,217,217,217,0,0,0,0,0,0,228,228, + 228,225,225,225,0,0,0,0,0,0,221,222,221,0,0,0,0,0,0,216,216,216,214,214,214, + 0,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,0,0,0,217,217,217,218,218,218,217,217,217,0,0,0,128,124,124,128,124, + 124,0,0,0,209,209,209,207,207,207,205,205,205,0,0,0,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0, + 0,0,0,0,0,0,0,0,128,124,124,212,208,200,212,208,200,212,208,200,0,0,0,0,0, + 0,0,0,0,128,124,124,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200 + }; + wxImage image( 22, 22, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 17) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "18 19 8 1", + " c None", + "a c #00D200", + "b c #1DD71D", + "c c #55E155", + "d c #72E672", + "f c #AAF0AA", + "g c #C7F5C7", + "h c #39DC39", + /* pixels */ + " ", + " haa ", + " aaad ", + " baac ", + " haab ", + " aaa ", + " aaaf ", + " baad ", + " caah ", + " aab ", + " baaf ", + " caa caac ", + " aaa aab ", + " aaab aag ", + " haaaaad ", + " aaaab ", + " aaaag ", + " aac ", + " " + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 18) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,7,97,49,73,156,107,106,193,130,91,200,108,53, + 185,69,13,156,34,0,111,23,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,74,24, + 80,159,117,202,247,209,187,255,185,130,239,127,76,221,75,37,213,36,20,221,18,9,233,9,0, + 201,8,0,100,20,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,0,74,23,103,178,134,216,255,213,152,242,151,96,223,96, + 52,215,50,24,216,23,13,223,14,5,241,4,0,255,0,0,255,0,0,248,0,0,101,17,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,2,100,38,0,86, + 26,50,140,86,190,252,188,126,232,126,74,218,74,36,213,34,11,183,22,0,123,20,0,105,20, + 0,123,16,0,191,4,0,255,0,0,255,0,0,227,0,0,75,23,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,35,152,67,89,226,89,43,200,48,44,211,46,56,229,56,42,222, + 42,23,218,22,4,161,22,0,69,23,212,208,200,212,208,200,212,208,200,0,57,26,0,106,17, + 0,223,0,0,255,0,0,140,11,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,16, + 134,46,56,218,54,27,209,26,12,222,11,0,238,0,0,255,0,0,255,0,0,201,0,0,105, + 17,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,78,24,0,202,1,0,227,0, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,93,27,23,202,26,14,223,14,4, + 239,4,0,255,0,0,255,0,0,255,0,0,255,0,0,244,0,0,74,22,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,0,71,22,0,175,4,0,95,17,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,2,174,18,4,247,3,0,255,0,0,255,0,0,255,0,0, + 255,0,0,255,0,0,130,13,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,5,93,47,11,107,54,0,77,20,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 0,103,22,0,250,0,0,255,0,0,255,0,0,255,0,0,201,2,0,95,17,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,26,110,67,136,192,166,242,255,251,252,255,255,30,116, + 71,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,141,12,0,241,0, + 0,191,3,0,108,15,0,52,22,212,208,200,212,208,200,212,208,200,212,208,200,0,90,39,108, + 180,138,231,255,234,242,255,240,216,255,216,205,255,201,120,207,137,0,74,23,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,7,100,53,0,79,23,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,2,99,39,118,215,134,166,250,162,136,236,136,116,229,116,100, + 223,100,85,220,85,71,220,71,3,117,34,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,78,150,113,90,159,123,0,59,14,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 11,117,44,68,220,69,48,218,48,37,215,37,27,216,27,18,221,18,11,228,11,4,242,4,0, + 193,9,0,116,32,212,208,200,212,208,200,212,208,200,212,208,200,19,109,59,200,253,202,63,158, + 94,0,71,22,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,97,23,11,201,17, + 2,247,1,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,192,8,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,81,190,101,135,244,131,55,179,76,0,97,33,0,65, + 25,212,208,200,212,208,200,0,70,26,0,127,24,22,209,24,14,226,14,2,242,2,0,255,0, + 0,226,0,0,239,0,0,228,0,0,88,22,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,0,100,34,55,209,59,53,219,50,34,202,36,7,168,25,0,140,20,0,147,17,0,197, + 11,2,246,2,0,253,0,0,255,0,0,255,0,0,209,0,0,73,24,0,71,22,0,73,23, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,117,25,9, + 221,12,5,244,3,1,252,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255, + 0,0,228,0,0,88,22,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,0,110,17,0,222,0,0,255,0,0, + 255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,182,5,0,80,22,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,0,116,15,0,161,8,0,185,4,0,178,6,0, + 144,12,0,93,19,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 22, 20, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 19) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,70,73,124,73,77,145,73,77,125,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,130,130,161,45,48,129,55,56,116,212,208,200,212,208,200,212,208,200, + 212,208,200,217,221,221,168,174,181,190,194,199,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,115,116,140,57,62,120,51,59,125,121,122,153,212,208,200,212,208,200,212,208,200,212,208, + 200,170,177,180,146,158,174,141,158,182,152,164,175,212,208,200,212,208,200,212,208,200,158,157,179, + 69,71,121,66,75,116,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,196,207,219,130,152,186,138,164,187,175,183,191,212,208,200,212,208,200,48,81,137,57,84, + 131,212,208,200,212,208,200,212,208,200,116,127,150,111,144,184,120,153,196,124,131,155,212,208,200, + 212,208,200,184,185,195,122,148,214,119,138,193,212,208,200,154,155,166,67,100,157,104,117,149,212, + 208,200,212,208,200,56,74,119,95,124,179,102,139,182,108,147,184,91,119,186,84,102,155,212,208, + 200,212,208,200,125,149,184,128,146,208,172,177,186,110,120,142,77,108,164,212,208,200,212,208,200, + 102,122,145,91,137,196,75,115,182,63,102,164,107,150,194,53,106,169,36,77,179,89,100,138,212, + 208,200,212,208,200,116,130,200,128,132,148,119,135,166,80,111,165,212,208,200,212,208,200,18,82, + 148,82,150,210,60,110,184,73,109,202,111,154,215,54,130,164,46,104,206,44,72,156,212,208,200, + 212,208,200,96,108,183,129,131,154,122,140,171,87,116,171,212,208,200,212,208,200,37,102,164,58, + 134,187,100,156,222,115,159,225,131,178,219,85,161,188,114,172,246,87,113,193,212,208,200,212,208, + 200,86,94,172,123,124,149,126,137,159,109,140,196,212,208,200,212,208,200,138,158,176,85,144,200, + 136,189,229,133,183,214,142,194,212,115,176,217,127,169,243,127,138,168,212,208,200,212,208,200,84, + 92,164,116,117,142,176,179,188,115,153,208,112,130,159,212,208,200,212,208,200,118,148,180,138,183, + 220,171,225,239,159,215,216,142,184,226,136,157,194,212,208,200,212,208,200,90,105,143,80,87,151, + 150,152,164,212,208,200,104,144,197,115,151,195,125,129,135,212,208,200,212,208,200,163,178,193,137, + 182,219,148,199,212,159,173,187,212,208,200,212,208,200,212,208,200,62,74,141,61,68,125,212,208, + 200,212,208,200,176,182,189,139,156,178,117,142,169,111,126,141,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,64,72,108,70,65,104,159,157,171,212,208,200,212, + 208,200,212,208,200,150,158,168,147,165,185,139,160,184,166,164,170,212,208,200,212,208,200,212,208, + 200,212,208,200,103,105,142,59,61,127,48,50,122,115,113,133,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,178,182,187,146,155,169,193,191,195,212,208,200,212,208,200,212,208,200,139, + 140,151,52,51,111,49,47,122,127,127,166,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,123,123,135, + 80,79,131,69,68,129,59,59,120,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 20) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,166,179,208,208,215,230,232,235,243,240,242,246,231,235,242,210,217,233, + 172,184,215,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,158,171,206,236,238,246, + 253,253,254,253,253,254,248,249,252,243,245,248,244,246,249,248,249,252,253,253,255,255,255,255,254, + 254,255,240,243,253,167,181,215,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,214,219,236,251,250,255,241,243,249,239,241,249,235, + 238,246,232,234,243,230,233,241,237,238,246,239,240,247,237,240,247,237,239,247,237,239,247,240,241, + 248,249,249,255,221,226,245,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,218,222,239,238,239,248,230,232,244,223,225,237,212,216,227,212,216,228,205,211, + 226,215,220,233,234,236,245,232,235,244,232,234,244,231,233,243,230,232,243,229,232,243,227,230,242, + 234,236,246,222,227,244,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,188,195, + 226,229,231,244,211,215,231,190,195,211,180,186,202,177,184,199,177,185,201,175,183,203,184,191,211, + 226,228,240,233,235,246,229,231,243,228,230,242,226,229,241,221,224,238,221,224,238,219,222,237,225, + 227,241,192,198,229,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,201,207,230,176,185,208, + 160,168,187,157,165,184,159,168,192,160,171,198,160,171,202,154,168,201,191,199,222,222,225,237,200, + 205,220,219,222,236,220,223,237,204,208,224,207,211,227,217,220,237,213,217,235,211,215,234,212,215, + 235,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,132,145,195,155,167,198,136,147,172,139,151,179,141, + 155,189,142,157,195,140,156,194,136,153,191,163,175,206,218,221,237,218,220,234,198,203,219,200,205, + 221,179,185,205,189,194,213,214,217,235,214,217,235,209,213,232,204,209,231,202,206,229,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,84,105,166,118,132,168,123,135,168,124,142,185,124,142,186,122,140, + 184,126,144,186,175,185,213,224,227,240,230,231,243,229,231,243,230,233,244,224,227,240,218,221,236, + 220,223,240,214,218,236,209,214,233,205,209,231,200,204,228,194,199,226,151,160,205,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,10,41,115,82,99,143,108,126,172,105,125,175,105,125,174,100,120,171,139,154,193, + 231,233,244,229,232,243,229,232,242,231,233,243,230,232,243,227,230,242,223,226,240,216,220,237,213, + 216,235,203,208,229,198,203,227,197,202,228,184,191,222,140,150,199,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,92,111,175, + 38,61,123,34,59,122,78,102,161,86,109,166,86,108,164,83,106,161,96,117,169,197,204,226,241, + 242,249,239,240,248,241,242,249,234,236,245,230,232,243,223,227,240,217,220,237,212,216,235,201,206, + 228,173,180,207,186,192,220,141,151,192,140,150,199,135,146,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,143,152,202,146,155,202,124, + 136,184,95,112,162,65,88,145,67,92,153,67,92,154,61,87,151,85,108,164,199,206,225,227,230, + 238,217,219,230,238,239,247,233,235,244,224,227,241,216,219,237,209,213,233,204,208,231,179,186,214, + 161,169,205,88,102,149,100,116,172,99,117,178,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,138,148,199,147,157,203,164,172,213,172,179, + 214,83,98,138,35,60,119,47,75,145,48,76,144,45,72,142,52,78,143,55,79,139,69,91,144, + 228,230,239,238,239,248,224,227,240,215,219,236,207,211,232,198,203,227,186,192,223,110,125,177,81, + 98,149,42,66,133,73,96,163,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,139,149,199,146,156,203,157,165,208,171,178,215,186,192,223, + 101,114,152,14,40,105,25,56,133,28,58,133,27,57,132,24,54,132,24,54,130,178,186,208,242, + 243,250,221,225,239,211,214,234,201,206,229,196,201,228,105,122,174,6,31,96,46,66,121,112,128, + 183,77,99,165,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,140,150,202,145,155,202,156,164,207,171,178,215,168,176,208,64,81,126,8, + 38,110,13,45,125,14,46,125,14,46,125,15,46,125,3,35,117,136,149,185,241,241,251,216,219, + 236,206,210,231,204,208,231,165,175,211,20,47,116,18,46,115,61,85,150,31,60,135,13,46,126, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,140,151,202,145,155,202,155,164,208,183,190,226,99,112,153,0,24,89,14,47,128,14,46, + 125,14,46,125,14,46,125,14,46,125,0,33,116,114,131,175,233,234,247,210,214,234,201,206,229, + 161,172,208,70,94,159,2,30,100,24,42,93,115,129,178,115,130,184,68,91,161,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,134,146, + 201,150,159,205,138,148,193,89,103,150,36,63,132,10,43,121,14,46,125,14,46,125,14,46,125, + 14,46,125,13,46,125,7,41,122,44,72,140,197,202,225,213,216,236,179,187,218,115,132,182,23, + 54,128,8,35,103,13,31,80,128,138,184,157,165,211,109,126,189,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,109,126,189,151,161,209, + 70,85,135,0,21,84,10,43,125,15,47,126,14,46,125,14,46,125,16,47,126,17,49,127,19, + 50,128,18,50,128,9,42,123,127,141,186,185,192,221,80,102,163,18,50,126,5,34,107,49,74, + 142,30,54,116,111,125,176,149,158,207,64,87,158,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,126,139,197,40,65,132,14, + 38,98,12,43,122,15,47,126,20,51,129,25,55,132,30,59,134,33,62,136,35,63,137,35,63, + 137,32,61,135,39,66,140,35,64,137,14,46,126,13,45,124,14,45,123,64,89,155,34,63,138, + 40,68,140,57,83,156,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,87,108,176,70,93,161,32,59,126,25,55, + 127,26,57,133,34,63,136,40,68,140,45,72,143,49,75,145,51,77,146,52,77,146,50,76,146, + 44,72,143,39,67,139,35,63,136,27,57,133,21,52,130,28,58,132,39,67,139,23,55,132,7, + 40,120,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,63,88,162,36,66,139,55,81,148,55,81,148, + 54,80,147,56,81,148,60,85,151,64,88,153,67,90,155,67,90,155,65,89,154,61,86,151,56, + 82,149,52,77,145,49,76,145,51,77,145,48,75,144,30,60,136,14,48,132,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,39,69,148,58,83,150,76,98,159,83,104,163,86, + 106,165,88,108,166,90,109,167,90,109,167,89,109,167,89,109,166,87,107,165,84,105,164,81,102, + 162,77,99,160,69,92,155,48,76,146,26,58,139,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,61,86,157,77,100,164,92,112,168,102,120,174,109,126, + 177,114,130,180,117,132,181,117,132,181,115,131,180,111,127,178,104,122,175,95,114,170,85,105,165, + 68,92,160,45,72,144,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,68,85,138,103,121,182,127,140,198,126,139,193,131,143,193, + 131,143,191,132,145,192,131,143,191,124,138,188,113,129,184,98,117,179,79,100,165,48,67,120,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,74,82,120,104,116,165,122,133,186,125,136,191,125, + 137,191,124,136,191,116,129,183,91,103,151,50,61,96,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,30,34,46,155,159,176,168,172,188,78,81, + 101,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,198,197,201,223,223,220,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,132,132,150,132,132,145,224,224,227,242,242,242,154,154,160,120,120,131,91,91,109,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,168,168,180,203,203,209,197,197,204,197,197,204,202,202,208,159,159,171,207, + 207,208,233,233,232,223,223,223,222,222,222,229,229,229,229,229,228,164,164,171,146,146,154,192,192, + 199,198,198,205,197,197,204,206,206,211,140,140,152,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,177,177,182,216,216,214,210,210,209,210,210,209,215,215,213,168,168,174,179,179,181,196,196, + 195,193,193,193,193,193,193,194,194,194,191,191,191,153,153,159,158,158,160,204,204,203,211,211,210, + 210,210,209,220,220,218,148,148,155,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,85,85, + 93,93,93,98,91,91,97,91,91,97,89,89,95,100,100,110,164,164,167,168,168,169,166,166,167, + 166,166,167,167,167,168,167,167,167,133,133,140,69,69,75,88,88,92,92,92,98,91,91,97,94, + 94,100,73,73,81,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,51,51,56,49,49,54,50,50,55,50,50,55,50, + 50,55,50,50,55,40,40,44,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 32, 32, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 21) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,155,54,0, + 177,84,11,171,76,8,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,158,59,0,180,93,20,219,162,92,250,214,154,176, + 86,17,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,159,62,0,190,114,37,231,185,103,254,225,154,255,245,199,247,208,152,160,62,0,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,161,65,2,194,118,31,235,186, + 78,255,224,110,255,219,106,255,202,78,255,216,131,242,196,129,178,90,27,161,64,3,154,54,0, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,195,117,24,239,188,57,255,217,74,255,216,72,255,207,61, + 255,197,53,255,192,54,255,209,122,255,217,154,253,215,159,240,192,137,210,141,85,172,80,19,153, + 54,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,187,104,19,249,202,61,255,215,65,255,207,62,255,205,62,255,198,59,255, + 192,58,255,191,74,255,189,86,255,194,106,255,207,141,255,219,168,248,200,152,204,127,70,158,59, + 0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,177,90,13,242,191,56,255,216,67,255,203,62,255,196,59,255,189,56,255,185, + 51,255,179,48,255,168,44,255,162,49,255,172,81,255,196,134,255,209,161,224,151,98,161,65,5, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,173,82,10,239,185,53,255,212,65,255,194,58,255,187,55,254,189,56,250,186,54, + 255,185,53,255,176,49,255,153,36,255,147,46,255,174,103,255,199,148,226,148,92,159,61,1,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,167,75,6,234,177,50,255,206,62,255,187,55,252,188,55,179,92,12,184,95,16,222, + 144,36,254,177,51,255,156,40,255,135,35,255,162,89,255,186,129,211,122,59,154,56,0,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,165,72,5,236,179,51,255,209,64,248,184,53,162,68,2,212,208,200,153,55,0,187,97, + 16,249,172,49,255,154,40,255,130,36,255,163,92,254,168,102,178,80,15,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,172,82,10,232,174,48,242,181,52,161,64,0,212,208,200,212,208,200,151,54,0,186,95,15, + 250,168,47,255,141,34,255,139,53,255,164,90,217,117,46,153,56,0,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,155,57,0,180,92,26,197,128,67,196,126,63,197,125,59,173,83, + 15,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 163,68,2,192,110,21,159,64,0,212,208,200,212,208,200,212,208,200,152,53,0,195,104,19,255, + 167,46,255,134,35,255,143,56,250,141,59,170,70,4,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,155,60,0,223,122,34,255,203,105,255,232,173,255,243,208,183,101,33,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,156,58,0,229,142,36,255,153, + 41,255,128,32,255,137,43,199,92,17,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 158,62,0,229,121,26,255,169,35,255,203,111,252,227,187,170,79,14,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,193,101,17,255,164,46,255,130,31, + 255,131,32,223,106,21,156,59,0,212,208,200,212,208,200,212,208,200,212,208,200,158,62,0,228, + 124,28,255,167,39,255,201,113,251,218,169,170,78,12,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,170,75,6,252,162,45,255,135,34,255,129,31,238, + 117,26,161,63,0,212,208,200,212,208,200,212,208,200,212,208,200,156,60,0,222,118,26,255,164, + 39,255,193,103,254,216,160,180,90,18,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,161,66,1,244,156,42,255,140,37,255,127,31,247,123,29,164,65, + 1,212,208,200,212,208,200,212,208,200,212,208,200,152,56,0,209,107,21,255,160,39,255,183,87, + 255,215,151,201,117,42,151,52,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,161,65,1,240,153,40,255,142,37,255,127,31,250,124,29,164,65,1,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,188,88,12,255,152,39,255,170,65,255,206,136,233, + 160,81,157,58,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,157,59,0,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 164,68,2,250,165,46,255,142,37,255,131,32,249,124,29,163,65,1,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,164,67,2,245,140,35,255,158,46,255,187,105,255,195,118,191,97, + 21,151,53,0,212,208,200,212,208,200,212,208,200,212,208,200,166,69,2,158,59,0,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,167,72,5,226, + 136,33,228,114,25,228,110,23,215,101,18,160,62,0,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,154,56,0,211,111,22,255,155,39,255,165,66,255,192,116,244,169,87,171,73,6, + 212,208,200,212,208,200,212,208,200,153,54,0,206,126,53,216,143,70,157,56,0,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,158,61,0,157,60,0,157,60, + 0,157,60,0,157,60,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,176,79,7,254,150,39,255,150,41,255,173,86,255,193,117,231,147,66,162,63,1,153, + 54,0,212,208,200,153,52,0,216,148,86,255,246,211,218,145,73,157,56,0,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,154, + 57,0,213,113,23,255,153,40,255,150,46,255,172,88,255,188,114,235,156,81,185,91,23,158,59, + 0,153,49,0,227,159,95,255,241,216,255,243,219,220,156,96,159,57,0,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,161,64, + 1,233,132,32,255,151,38,255,144,41,255,163,75,255,186,112,255,189,119,234,159,90,213,128,57, + 247,188,129,255,203,143,255,189,113,255,238,208,225,169,118,161,61,0,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,167,68,3, + 235,135,33,255,152,40,255,140,34,255,148,51,255,167,83,255,188,118,255,202,139,255,210,162,255, + 179,100,255,142,22,255,168,72,255,227,185,230,180,134,164,66,5,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,165,66,2,223, + 122,28,255,153,41,255,146,36,255,138,33,255,141,39,255,151,56,255,163,76,255,154,56,255,145, + 36,255,145,32,255,153,45,255,207,146,234,187,142,170,77,18,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,156,59,0,191,90, + 13,234,132,32,255,149,40,255,149,39,255,142,34,255,137,30,255,139,34,255,143,37,255,143,38, + 255,144,35,255,146,33,255,189,110,222,159,106,158,61,3,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,159,61,0, + 182,82,9,204,104,20,239,133,32,255,143,37,255,135,34,255,139,35,255,142,37,255,141,37,237, + 123,28,196,90,8,165,71,9,158,60,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,150, + 52,0,219,114,24,255,152,41,255,145,38,255,143,37,233,121,28,193,88,13,160,63,0,152,57, + 0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,160,61,0,239,134, + 33,253,152,41,221,114,24,187,83,10,159,62,0,153,57,0,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,163,65,1,211,103,19,178,77,7, + 154,57,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 32, 32, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 22) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,140,181,226,140,195,243,135,197, + 246,139,200,247,142,203,247,139,200,247,155,197,234,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,133,178,227,136,198,246,154,213,249,158,216,249,161,219,250,164,221,250, + 167,224,250,169,226,251,171,227,251,161,219,250,153,205,241,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 122,182,241,151,210,248,159,217,249,165,222,250,170,226,251,172,228,251,174,229,251,162,220,250,170, + 226,251,175,230,251,179,234,252,178,233,252,166,223,250,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,121,181,240,152,211,248,164, + 222,250,175,230,251,182,237,252,187,240,253,184,238,253,186,240,253,181,236,252,160,218,249,163,220, + 250,171,227,251,182,237,252,187,241,253,175,230,251,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,125,174,227,149,209,248,163,221,250,177,233,252,190,243, + 253,199,251,254,204,253,255,204,253,255,172,228,251,197,249,254,184,238,253,173,229,251,176,232,252, + 178,233,252,187,241,253,193,245,254,178,229,247,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,137,198,247,156,215,249,173,229,251,189,242,253,203,253,255,214,255,255, + 220,255,255,220,255,255,181,233,252,187,239,253,205,252,255,183,238,252,187,240,253,189,242,253,190, + 243,253,197,249,254,195,247,254,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 125,166,214,152,211,248,161,219,250,179,234,252,196,248,254,212,255,255,225,255,255,235,255,255,235, + 255,255,191,239,253,183,238,252,216,254,255,194,246,254,197,249,254,199,251,254,200,252,255,200,252, + 255,205,255,255,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,137,192,240,155, + 214,249,165,223,250,181,236,252,199,251,255,216,255,255,231,255,255,246,255,255,238,253,255,186,240, + 253,192,245,254,219,253,255,203,254,255,206,255,255,208,255,255,208,255,255,208,255,255,209,255,255, + 206,255,255,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,136,198,247,158,216,249,168,225, + 251,178,234,252,198,249,254,213,255,255,228,255,255,232,253,255,197,243,253,193,246,254,203,252,255, + 229,255,255,210,255,255,212,255,255,214,255,255,215,255,255,215,255,255,214,255,255,213,255,255,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,144,204,247,160,218,249,169,226,251,174,230,251, + 162,220,250,176,230,251,186,236,252,183,237,252,192,245,254,200,252,255,226,255,255,222,255,255,215, + 255,255,219,255,255,221,255,255,222,255,255,222,255,255,220,255,255,219,255,255,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,139,200,247,162,220,250,170,226,251,179,234,252,182,236,252,171, + 227,251,178,234,252,188,242,253,198,250,254,221,255,255,233,255,255,216,255,255,221,255,255,224,255, + 255,227,255,255,228,255,255,228,255,255,226,255,255,224,255,255,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,135,193,239,164,221,250,171,227,251,157,215,249,180,235,252,200,251,254,203,250, + 254,213,252,255,220,254,255,218,255,255,215,255,255,221,255,255,226,255,255,230,255,255,233,255,255, + 235,255,255,235,255,255,232,255,255,228,255,255,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,126,165,208,165,222,250,172,228,251,164,221,250,164,221,250,174,230,251,185,239,253,195,248,254, + 205,254,255,211,255,255,218,255,255,224,255,255,230,255,255,235,255,255,239,255,255,242,255,255,241, + 255,255,238,255,255,224,245,247,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 157,216,249,173,229,251,174,230,251,166,223,250,176,232,252,187,240,253,197,249,254,206,255,255,213, + 255,255,219,255,255,226,255,255,232,255,255,238,255,255,244,255,255,248,255,255,247,255,255,242,255, + 255,182,194,206,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,126,172,215,171, + 227,251,180,235,252,171,228,251,177,232,252,187,241,253,198,250,254,207,255,255,213,255,255,220,255, + 255,227,255,255,233,255,255,240,255,255,246,255,255,252,255,255,250,255,255,234,244,247,105,107,137, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,151,206,241,179,234, + 252,185,239,253,179,234,252,187,240,253,197,249,254,206,255,255,213,255,255,219,255,255,226,255,255, + 232,255,255,238,255,255,244,255,255,247,255,255,246,255,255,144,149,171,113,113,142,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,157,211,242,183,238,252, + 191,244,253,188,242,253,195,247,254,204,254,255,211,255,255,217,255,255,224,255,255,229,255,255,234, + 255,255,239,255,255,241,255,255,144,149,171,111,111,140,167,167,185,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,144,187,218,182,236,252,196, + 248,254,199,251,255,204,254,255,209,255,255,215,255,255,220,255,255,225,255,255,230,255,255,214,234, + 238,132,138,162,114,114,143,183,183,198,154,154,175,167,167,185,189,189,202,198,139,58,199,133,42, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,150,187,211,191,241, + 250,199,250,254,208,255,255,212,255,255,216,255,255,193,219,226,144,155,176,94,96,128,100,100,132, + 167,167,185,133,133,158,190,190,203,181,181,196,193,152,104,209,140,38,208,135,28,190,126,41,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,137,137,161,182,144,101,207,156,78,241,187,86,235,160,32,202,130,27,181,119,41,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,166,111, + 50,204,159,87,252,241,191,247,215,140,241,188,86,235,161,33,196,126,28,171,111,41,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,163,105,40,220,168,67, + 255,235,161,252,241,191,247,215,141,241,188,87,235,161,34,190,121,27,161,103,40,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,154,98,40,216,165,67,255, + 234,160,252,241,191,247,215,142,241,188,88,236,161,34,184,116,27,152,96,40,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,144,90,39,212,162,65,255,234, + 159,252,241,192,247,216,142,241,189,88,236,162,35,178,111,27,142,88,39,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,134,83,39,209,159,64,255,233,158, + 253,241,192,247,216,143,241,189,89,236,162,36,171,107,27,132,81,39,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,125,75,38,205,156,63,255,233,157,253, + 242,192,247,216,144,241,189,90,236,162,36,166,102,27,123,73,38,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,117,68,38,203,154,62,255,233,155,253,242, + 193,247,217,144,241,190,90,213,145,37,118,73,46,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,116,68,38,194,146,61,255,232,154,253,242,193, + 223,189,125,128,83,51,136,127,141,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,116,68,38,168,122,58,229,201,131,131,88,59,178, + 169,174,106,106,137,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,116,68,38,114,69,43,132,123,138,101,101,133,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 32, 32, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 23) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,28,72, + 170,27,71,168,26,68,167,23,61,154,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,29,75,170,28,74,170,25,88,196,36,121,237, + 39,120,233,23,66,167,22,58,152,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,31,79,173,29,80,178,31,97,202,46,129,238,60,147,253,62,148,254,61,147,254,51, + 136,246,23,73,179,20,53,152,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,32,82,176,31,83,180,38, + 106,209,55,139,244,71,155,254,71,154,254,70,154,254,68,153,254,67,151,254,65,150,254,60,146, + 253,30,87,195,19,50,153,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,33,85,178,32,89,186,44,118,219,67,151,250,79,160,254,79,160, + 254,78,160,254,78,159,254,76,159,254,75,157,254,73,156,254,71,154,254,68,153,254,66,151,254, + 38,104,212,17,49,154,15,38,134,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,34,89, + 182,34,97,196,53,125,222,75,157,251,85,165,254,86,165,254,86,166,254,87,166,254,86,165,254, + 85,165,254,84,163,254,82,162,254,80,161,254,77,159,254,75,157,254,71,155,254,68,153,254,50, + 125,231,19,55,163,13,35,137,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,36,93,186,35,93,184,39,102,199,55,133,231,81,161,252, + 89,167,254,91,169,254,93,170,254,94,171,254,94,171,254,95,171,254,94,171,254,93,170,254,91, + 169,254,89,168,254,87,166,254,84,164,254,81,162,254,78,159,254,74,157,254,70,154,254,57,139, + 244,23,66,174,12,31,137,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 37,97,188,37,95,187,39,109,207,61,140,237,84,164,253,91,169,254,94,171,254,97,173,254,99, + 174,254,101,176,254,102,177,254,103,177,254,103,177,254,102,177,254,101,176,254,99,175,254,97,173, + 254,94,171,254,91,169,254,87,166,254,84,164,254,80,161,254,75,158,254,71,155,254,64,149,253, + 32,84,193,10,27,135,8,21,117,212,208,200,212,208,200,212,208,200,212,208,200,37,96,188,113, + 162,227,82,163,253,90,168,254,94,171,254,98,174,254,101,176,254,105,178,254,107,180,254,109,182, + 254,111,183,254,112,183,255,112,183,255,111,183,254,109,182,254,107,180,254,105,178,254,102,176,254, + 98,174,254,94,171,254,90,168,254,85,165,254,81,161,254,76,158,254,72,155,254,67,152,254,41, + 105,213,9,27,137,8,18,122,212,208,200,212,208,200,212,208,200,36,94,186,86,137,237,186,213, + 255,115,182,254,100,175,254,105,179,254,109,181,254,113,184,255,115,186,255,118,188,255,120,189,255, + 120,190,255,120,190,255,120,189,255,118,188,255,116,186,255,113,184,255,109,181,254,105,179,254,101, + 175,254,96,172,254,91,169,254,86,165,254,81,162,254,76,158,254,71,155,254,88,160,254,53,111, + 234,7,17,127,212,208,200,212,208,200,212,208,200,35,91,185,49,111,236,68,128,254,172,200,255, + 153,203,254,112,183,254,116,187,255,120,189,255,124,192,255,126,194,255,128,195,255,129,196,255,130, + 196,255,128,195,255,127,194,255,124,192,255,121,189,255,116,187,255,112,183,255,107,180,254,102,176, + 254,97,173,254,91,169,254,86,165,254,95,162,254,94,148,254,53,117,254,41,105,248,6,15,126, + 212,208,200,212,208,200,212,208,200,34,89,183,53,114,236,62,125,254,64,127,254,137,177,254,175, + 214,255,123,192,255,128,195,255,132,198,255,135,200,255,137,202,255,139,202,255,139,202,255,138,202, + 255,135,200,255,132,198,255,128,195,255,124,192,255,119,188,255,113,184,255,108,180,254,121,186,254, + 104,166,254,87,143,254,52,110,240,31,70,190,48,75,179,32,87,224,5,13,124,212,208,200,212, + 208,200,212,208,200,33,87,181,58,118,235,69,131,254,71,133,254,73,135,254,109,159,254,190,219, + 255,143,203,255,140,203,255,144,206,255,147,208,255,148,209,255,148,209,255,147,208,255,144,206,255, + 140,203,255,136,200,255,131,197,255,125,193,255,133,194,255,111,169,254,83,142,254,56,111,229,48, + 88,194,108,125,191,188,202,237,93,109,187,29,80,215,4,10,122,212,208,200,212,208,200,212,208, + 200,32,84,179,63,122,235,75,137,254,78,140,254,80,142,254,82,143,254,94,152,254,184,211,255, + 168,217,255,153,212,255,156,214,255,158,216,255,158,216,255,156,215,255,153,212,255,148,209,255,143, + 205,255,160,208,255,118,173,254,82,144,254,58,111,219,61,99,193,138,156,208,195,211,243,140,176, + 241,56,115,231,21,56,175,32,81,214,3,8,120,212,208,200,212,208,200,212,208,200,31,82,177, + 67,126,234,82,143,254,84,146,254,86,148,254,88,149,254,90,151,254,91,152,254,154,192,254,192, + 228,255,165,221,255,168,223,255,168,223,255,165,221,255,167,220,255,149,201,255,122,175,254,89,149, + 249,62,116,217,85,120,198,154,173,218,202,221,249,129,172,240,62,125,231,56,118,229,49,111,228, + 23,54,171,35,83,212,2,5,118,212,208,200,212,208,200,212,208,200,31,80,176,72,130,234,88, + 149,254,91,152,254,93,154,254,95,156,254,97,157,254,98,159,254,100,160,254,130,179,254,211,235, + 255,193,235,255,188,231,255,164,209,255,117,173,254,94,153,245,61,116,211,111,144,208,183,200,232, + 189,215,247,122,172,239,79,142,233,62,116,215,67,129,230,60,121,228,53,114,227,24,54,170,39, + 86,212,1,3,116,212,208,200,212,208,200,212,208,200,30,77,174,76,133,234,95,155,254,97,158, + 254,100,160,254,102,162,254,104,164,254,106,165,254,107,166,254,108,167,254,117,173,254,237,244,255, + 130,182,255,92,152,238,75,131,216,123,157,213,203,220,243,188,217,247,119,175,238,97,159,235,71, + 129,215,35,74,173,8,20,130,71,132,229,65,124,228,58,117,226,20,42,156,47,98,221,0,1, + 115,212,208,200,212,208,200,212,208,200,29,75,172,81,137,233,101,161,254,103,163,254,106,166,254, + 109,168,254,111,170,254,112,171,255,114,173,255,115,174,255,115,174,255,185,215,255,118,177,255,80, + 129,204,212,230,247,180,216,246,125,186,238,113,176,236,108,170,235,44,102,192,23,61,161,20,43, + 147,52,90,187,71,126,221,42,79,185,31,55,165,44,79,189,62,121,239,0,0,114,212,208,200, + 212,208,200,212,208,200,28,73,170,85,140,233,107,166,254,110,169,254,113,172,255,115,174,255,118, + 176,255,119,178,255,121,179,255,122,180,255,122,181,255,189,218,255,126,184,255,86,129,200,189,220, + 246,134,191,238,126,186,236,119,181,235,113,174,234,53,101,189,74,123,205,82,135,217,51,86,183, + 39,66,170,33,63,168,93,109,182,90,102,177,51,100,215,0,0,114,212,208,200,212,208,200,212, + 208,200,27,70,168,89,144,232,113,172,255,116,175,255,119,178,255,122,180,255,124,182,255,126,184, + 255,128,186,255,129,187,255,130,187,255,192,221,255,132,190,255,84,123,196,199,223,245,150,195,237, + 140,190,235,128,184,234,118,178,233,92,143,213,57,92,182,43,74,173,48,81,176,123,141,200,204, + 216,244,135,171,241,45,74,179,54,102,214,0,0,114,212,208,200,212,208,200,212,208,200,26,68, + 167,93,147,233,119,177,255,122,181,255,125,183,255,128,186,255,131,189,255,133,191,255,135,192,255, + 136,193,255,137,194,255,196,225,255,139,196,255,82,118,192,208,226,245,164,199,235,151,193,234,98, + 139,204,69,107,190,44,80,175,61,98,184,152,170,216,210,225,250,124,166,239,64,124,231,47,109, + 229,22,55,173,57,103,213,0,0,114,212,208,200,212,208,200,212,208,200,25,66,165,97,150,232, + 124,182,255,128,186,255,131,189,255,135,192,255,137,194,255,140,197,255,142,198,255,143,200,255,144, + 200,255,200,228,255,146,202,255,81,112,187,205,218,239,115,143,202,67,105,188,52,96,186,86,122, + 195,181,198,231,195,217,248,126,172,239,70,134,232,64,127,231,58,120,229,51,112,227,23,54,170, + 59,105,212,0,0,114,212,208,200,212,208,200,212,208,200,24,63,163,97,151,230,130,187,255,134, + 191,255,137,194,255,141,198,255,144,200,255,146,203,255,148,205,255,150,206,255,151,207,255,203,231, + 255,153,209,255,78,118,195,70,111,191,60,111,196,108,143,206,210,223,243,184,213,247,120,173,238, + 88,151,234,67,122,213,31,63,166,69,130,230,62,123,228,55,115,226,25,55,170,62,107,212,0, + 0,114,212,208,200,212,208,200,212,208,200,23,60,158,44,89,184,113,171,243,139,196,255,143,200, + 255,147,203,255,150,206,255,153,209,255,155,211,255,157,212,255,158,214,255,207,234,255,160,215,255, + 88,143,214,137,170,219,217,232,248,176,212,245,126,182,239,105,168,235,76,138,218,40,88,182,15, + 40,145,13,25,135,73,133,229,66,125,227,37,74,184,31,53,161,65,114,217,0,0,114,212,208, + 200,212,208,200,212,208,200,212,208,200,19,50,141,34,72,170,103,157,228,149,205,255,153,208,255, + 156,212,255,159,215,255,162,217,255,164,219,255,165,220,255,210,238,255,167,222,255,86,131,203,199, + 226,248,134,192,239,122,184,237,116,179,236,111,172,234,31,81,177,34,69,166,60,102,193,79,135, + 222,39,69,172,52,81,179,65,105,202,26,48,158,0,0,111,0,0,85,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,24,55,154,82,129,206,155,211,254,162,217,255,166, + 220,255,169,223,255,172,225,255,174,226,255,215,241,255,177,227,255,85,126,198,194,222,246,142,193, + 237,133,188,236,123,183,234,116,176,233,94,149,219,90,143,218,47,77,172,69,103,191,66,102,194, + 19,33,142,0,0,109,0,0,86,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,15,41,142,56,93,179,152,205,245,173,225,255,180,228, + 255,186,230,255,189,231,255,223,243,255,192,232,255,83,121,194,204,225,245,157,198,236,146,192,235, + 133,186,233,93,142,208,60,93,179,84,123,200,75,110,193,11,18,128,0,0,109,0,0,74,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,13,35,132,35,63,158,140,182,228,193,233,255,200,235,255, + 204,237,255,230,246,255,206,238,255,82,115,189,212,227,244,170,201,235,103,136,200,76,111,187,100, + 142,208,67,94,178,6,10,121,0,0,102,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,20,40,143,119,147,204,209,237,254,219,242,255,238, + 249,255,220,243,255,66,98,179,122,142,200,106,136,199,129,166,217,53,74,161,0,0,114,0,0, + 94,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,10,25,131,80,97,173,215,230,246,245,252,255,234,247, + 255,185,206,235,138,158,208,52,65,154,1,3,113,0,1,96,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,8,19,122,45,55,148,184,188,219,142,149,199,40,47,142, + 2,6,116,1,3,88,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,5,13,110,5,12,123,4,9,115,2,5,78,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 32, 32, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 24) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,182,207,238,236,244,253,248,252,255,252,255,255,252,255,255,246,251,255, + 228,239,252,158,196,239,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 222,237,253,229,241,253,221,234,250,219,234,250,219,234,250,219,234,250,219,234,250,222,235,250,231, + 243,254,207,228,252,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,202,226,251,198,222,247,195, + 220,246,196,220,246,196,220,246,196,220,246,196,220,246,195,220,246,195,220,246,195,219,246,202,224, + 248,185,216,250,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,143,190,242,180,212,244,174,207,243,175,208,243,175,208, + 243,176,209,243,176,209,243,176,209,243,176,209,243,175,208,243,174,208,243,173,207,243,181,212,246, + 113,173,238,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,143,191,241,156,197,240,155,197,240,159,199,241,160,201,241,161,202,242, + 162,202,242,162,202,242,161,201,241,160,200,241,157,199,240,154,197,240,158,198,240,123,180,239,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 73,151,232,122,179,237,141,189,238,143,191,238,146,194,240,149,195,240,150,197,240,150,197,240,150, + 197,240,149,196,240,148,195,240,145,193,239,141,190,238,140,188,238,109,172,236,65,143,228,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,85,159,234,102, + 168,233,127,184,237,132,188,238,137,190,239,139,193,240,142,194,240,142,194,240,142,194,240,141,194, + 240,139,192,240,135,189,239,130,186,238,122,180,236,93,163,232,81,157,237,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,95,166,236,101,170,234,115,178, + 236,125,185,238,130,189,239,134,192,240,137,193,241,137,195,241,137,194,241,136,193,241,132,191,240, + 128,187,239,121,183,237,109,175,235,97,167,234,92,165,240,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,103,172,239,113,178,237,120,184,237,128,190,240, + 135,194,241,140,198,243,143,200,243,144,201,243,144,201,243,142,199,243,138,196,242,132,192,241,124, + 187,238,116,181,237,109,176,237,97,169,241,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,98,169,236,124,187,240,130,191,240,140,198,243,148,203,244,153, + 208,246,157,211,247,158,211,247,158,211,247,156,209,246,151,206,245,144,201,244,136,195,242,127,188, + 239,120,184,240,95,162,231,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,140,199,246,141,199,243,150,205,245,159,212,247,166,217,248,171,221, + 250,173,222,250,172,222,250,169,219,249,163,215,248,155,210,247,145,202,244,136,195,242,132,194,247, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,132,193,246,165,214,248,162,214,247,169,220,250,178,226,251,184,231,253,186,232,253, + 185,232,253,182,229,252,174,223,251,165,217,249,159,211,246,154,208,246,124,187,248,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,166,216,252,192,231,252,190,231,252,193,236,254,197,240,255,199,241,255,199,241,255,195, + 238,255,190,233,253,187,229,252,182,226,250,155,211,255,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,164,212,246,211,245,255,221,249,255,225,249,255,229,249,255,227,249,255,221,248,255,215,246, + 255,199,237,255,158,209,253,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,79,143, + 218,138,188,233,181,221,247,217,240,253,228,245,253,225,245,254,209,239,254,178,220,250,149,194,243, + 86,148,227,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,107,172,237,180,212,245,176,206,241, + 147,189,236,143,187,237,148,191,239,148,191,239,146,189,238,157,193,239,185,211,242,177,211,244,96, + 166,237,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,97,167,235,170,208,244,192,220,247,190,220,247,191,220,247,187, + 217,246,185,216,246,184,215,245,187,216,245,191,219,247,189,219,247,191,220,246,166,206,244,88,161, + 236,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,79,153,227,137,191,241,173,209,244,169,207,244,170,209,244,173,210,244,173,211,244,174,211, + 244,174,211,245,173,211,245,172,209,244,170,208,244,169,207,243,172,209,243,131,187,240,76,148,227, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,111,178, + 239,145,195,240,155,200,242,156,202,242,158,203,242,160,205,243,161,205,243,161,205,243,161,205,243, + 161,205,243,159,204,243,158,203,242,155,200,242,154,200,241,143,193,240,103,172,240,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,99,169,235,117,182,239,138,192,240, + 142,196,241,145,198,241,148,200,242,149,200,242,147,200,242,145,200,242,145,199,242,147,199,242,148, + 200,242,146,199,242,143,196,241,140,194,240,135,190,239,113,178,238,94,163,236,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,121,186,242,120,183,238,128,189,239,133,193,241,137, + 195,241,140,198,242,140,198,242,140,198,242,140,198,242,140,198,242,140,198,242,139,197,242,139,196, + 242,135,194,241,131,191,240,126,187,239,117,182,238,111,179,243,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,98,167,231,125,188,241,126,188,240,132,193,241,137,197,242,142,200,243,146,202, + 243,148,204,244,151,206,245,151,207,245,151,206,245,149,205,244,148,204,244,144,201,243,140,198,242, + 135,194,241,129,190,240,124,186,239,119,184,240,95,159,228,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,126,190,243,128,190,240,134,194,241,141,199,243,146,203,244,152,206,245,156,210,246,158,212,247, + 161,213,247,161,214,247,161,214,247,160,212,247,157,211,247,154,208,246,149,205,245,143,201,243,137, + 197,242,131,192,240,125,188,239,115,181,247,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,135,196,245, + 134,194,241,141,199,242,148,204,245,155,209,246,160,213,247,165,216,249,168,219,249,170,220,250,171, + 221,250,171,221,250,169,220,249,166,217,249,162,215,248,157,211,247,151,207,245,144,202,244,137,196, + 242,130,191,241,124,189,246,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,99,163,224,144,201,246,139,198,242,148, + 204,244,155,209,246,162,214,248,168,219,249,173,223,250,177,225,251,180,228,252,181,228,252,181,228, + 252,179,227,252,175,224,251,171,221,250,165,217,248,158,212,247,151,207,245,144,200,243,136,195,242, + 134,194,244,99,156,221,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,130,191,245,155,206,245,145,202,243,153,208,245,161,215, + 248,169,220,249,176,225,251,182,229,252,186,233,253,190,235,254,190,235,254,190,235,254,188,234,254, + 184,231,253,178,227,251,172,222,249,164,217,248,156,211,247,147,204,244,146,202,243,151,204,245,116, + 174,236,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,131,192,246,178,221,251,166,212,247,162,213,247,166,218,248,173,223,250, + 181,230,252,189,234,254,195,238,255,198,241,255,199,241,255,199,241,255,197,240,255,192,237,255,185, + 232,252,177,226,251,169,220,250,163,215,247,164,213,247,171,214,246,161,210,248,118,177,241,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,149,203,248,194,233,255,199,234,254,194,231,252,193,233,253,196,237,254,199, + 241,255,203,242,255,208,243,255,211,244,255,210,244,255,206,243,255,201,241,255,197,238,254,193,234, + 253,192,231,251,193,229,250,191,228,250,174,220,254,140,198,255,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,150,199,242,194,233,255,214,244,255,224,250,255,233,255,255,238,255, + 255,242,255,255,245,255,255,243,255,255,237,255,255,231,254,255,224,252,255,217,247,255,207,242,255, + 191,234,255,159,208,254,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,148,187,229,168,201,238,182,211,244, + 184,214,245,183,215,246,180,214,248,169,208,246,157,200,242,140,182,228,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 32, 32, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 25) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,176,176,192,174,174,190,171,171,189,169,169,187,166,166,185,164,164, + 183,162,162,181,159,159,179,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,181,181,196,179,179, + 194,186,186,200,209,209,219,228,228,234,232,232,237,252,252,253,251,251,252,228,228,233,221,221,228, + 196,196,208,167,167,185,153,153,174,149,149,170,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,184,184,198,182,182,197,199,199,210,236,236,240,254,254,255, + 254,254,254,239,239,242,232,232,237,216,216,224,209,209,218,227,227,233,231,231,236,245,245,247,243, + 243,245,218,218,226,171,171,189,147,147,169,140,140,162,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,184,184,199,187,187,201,232,232,237,255,255,255,245,245,248,208,208,217,182,182,197,175, + 180,202,166,181,214,154,175,215,151,173,214,164,178,207,161,168,192,162,162,181,187,187,201,228,228, + 233,236,236,240,206,206,216,148,148,170,137,137,160,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,185,185,199,197, + 197,209,246,246,248,251,251,252,215,215,223,184,185,199,184,200,226,223,237,250,246,252,255,250,254, + 255,186,190,231,181,188,231,235,249,255,229,247,255,194,223,247,173,190,213,153,155,176,185,185,199, + 226,226,232,217,217,225,155,155,175,131,131,154,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,185,185,200,197,197,209,250,250,251,242,242, + 245,193,193,206,175,192,220,223,242,251,231,248,255,237,250,255,241,251,255,244,252,255,121,125,207, + 119,125,207,233,249,255,227,247,255,221,245,255,215,243,255,193,227,248,137,161,201,152,152,173,209, + 209,219,217,217,225,150,150,172,127,127,151,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,186,186,200,188,188,202,246,246,248,242,242,245,189,189,203,155,186,228, + 217,244,255,222,245,255,228,247,255,232,248,255,236,249,255,237,250,255,206,218,243,204,217,243,229, + 247,255,224,246,255,218,244,255,212,242,255,206,241,255,198,235,254,131,165,214,142,142,165,204,204, + 214,206,206,216,135,135,160,113,113,136,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,184,184,199,233,233,237,251,251,252,194,194,206,152,185,228,208,241,255,213,243,255,218, + 244,255,223,246,255,227,247,255,229,247,255,230,248,255,230,248,255,228,247,255,224,246,255,220,245, + 255,215,243,255,209,242,255,203,239,255,194,233,254,185,226,253,124,160,212,142,142,165,208,208,218, + 184,184,199,126,126,152,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,185,185,199,201, + 201,212,255,255,255,216,216,224,146,173,217,196,234,254,204,239,255,209,241,255,214,243,255,218,244, + 255,221,245,255,223,246,255,224,246,255,224,246,255,222,245,255,219,244,255,215,243,255,210,242,255, + 129,150,159,12,15,16,154,186,206,181,223,252,172,216,251,111,139,192,163,163,182,206,206,216,144, + 144,167,112,112,137,212,208,200,212,208,200,212,208,200,212,208,200,183,183,198,237,237,241,246,246, + 248,175,179,201,154,200,245,190,229,253,197,235,254,204,240,255,209,241,255,212,242,255,215,243,255, + 217,244,255,217,244,255,217,244,255,215,243,255,213,243,255,210,242,255,129,150,159,0,0,0,0, + 0,0,69,85,96,171,213,244,168,212,250,133,183,240,118,123,156,193,193,205,180,180,195,120,120, + 148,212,208,200,212,208,200,212,208,200,212,208,200,191,191,204,255,255,255,210,210,220,126,163,221, + 176,219,252,183,224,252,190,230,253,197,234,254,202,239,255,206,241,255,209,241,255,210,242,255,211, + 242,255,210,242,255,209,242,255,207,241,255,128,150,159,0,0,0,0,0,0,58,71,80,153,190, + 216,166,209,244,162,209,250,154,202,249,93,132,199,149,149,171,195,195,207,127,127,154,92,92,115, + 212,208,200,212,208,200,182,182,197,213,213,221,255,255,255,187,187,201,121,175,241,169,214,251,176, + 219,252,183,224,252,189,229,253,194,232,254,198,236,254,201,238,255,203,239,255,204,239,255,203,239, + 255,202,238,255,125,149,159,0,0,0,0,0,0,58,71,80,153,190,216,167,209,244,164,210,250, + 157,204,249,149,198,248,97,155,235,122,122,149,191,191,204,147,147,169,108,108,134,212,208,200,212, + 208,200,180,180,195,231,231,236,241,241,244,157,171,203,131,185,246,162,209,250,169,214,251,175,218, + 251,180,222,252,185,226,253,189,229,253,192,231,254,194,232,254,194,233,254,194,232,254,121,145,159, + 0,0,0,0,0,0,57,71,80,152,189,216,166,209,244,164,210,250,157,205,249,150,199,248,133, + 187,246,69,138,238,102,116,160,173,173,190,162,162,181,111,111,140,212,208,200,212,208,200,178,178, + 194,235,235,239,235,235,239,136,162,210,148,198,248,155,203,249,161,208,250,167,212,250,172,216,251, + 176,219,252,180,222,252,182,223,252,150,183,205,59,71,79,47,57,63,0,0,0,0,0,0,56, + 70,80,149,186,216,163,207,244,163,209,250,157,204,249,144,195,247,110,169,243,73,141,239,63,134, + 237,88,119,183,165,165,184,163,163,182,111,111,140,212,208,200,212,208,200,177,177,192,254,254,254, + 216,216,224,125,159,215,105,144,225,73,98,203,134,176,237,158,206,249,163,209,250,162,208,250,154, + 202,249,147,197,248,19,25,31,80,80,80,112,112,112,0,0,0,27,34,40,108,136,160,119,152, + 181,121,156,187,125,170,216,124,179,245,101,163,242,81,137,231,41,74,199,54,105,219,87,122,188, + 148,148,170,175,175,192,109,109,139,212,208,200,212,208,200,175,175,191,253,253,254,214,214,222,129, + 162,215,99,140,224,69,95,203,127,171,237,144,194,248,136,188,246,134,187,246,140,192,247,145,196, + 248,0,0,0,175,175,175,239,239,239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 58,84,113,118,174,240,112,171,243,90,144,232,46,78,200,61,111,219,91,125,188,140,140,164,171, + 171,188,107,107,138,212,208,200,212,208,200,173,173,190,232,232,237,232,232,237,137,165,212,119,176, + 244,128,182,245,126,181,245,130,184,246,138,191,247,146,196,248,153,202,249,158,206,249,72,92,109, + 0,0,0,32,32,32,27,34,40,71,90,107,69,89,106,67,87,106,64,85,106,90,123,158,127, + 179,237,122,178,245,112,171,244,102,163,242,91,155,241,97,121,175,154,154,175,152,152,173,105,105, + 136,212,208,200,212,208,200,171,171,188,226,226,232,236,236,240,156,168,197,110,169,243,119,176,244, + 130,184,246,140,192,247,149,199,248,158,205,249,165,211,250,171,215,251,176,219,252,126,154,175,116, + 143,161,143,177,201,165,205,235,166,208,242,161,204,241,154,199,240,146,193,239,141,191,245,132,186, + 246,122,178,245,111,170,243,100,161,242,101,113,154,155,155,176,145,145,168,103,103,132,212,208,200, + 212,208,200,169,169,186,204,204,214,250,250,251,172,172,189,119,173,240,128,183,245,139,191,247,150, + 199,248,160,207,249,169,214,251,177,220,252,184,225,253,189,229,253,193,232,254,194,233,254,193,232, + 254,190,230,253,185,226,253,179,221,252,171,215,251,162,208,250,152,201,248,141,193,247,130,184,246, + 119,176,244,107,163,236,105,105,136,163,163,182,128,128,154,96,96,125,212,208,200,212,208,200,212, + 208,200,176,176,192,248,248,250,195,195,208,142,173,217,135,188,246,147,197,248,159,206,249,170,214, + 251,180,221,252,188,228,253,196,234,254,202,238,255,205,240,255,207,241,255,206,240,255,203,239,255, + 198,235,254,190,230,253,182,223,252,172,216,251,161,208,250,150,199,248,138,190,247,126,181,245,108, + 137,188,123,123,150,159,159,179,109,109,139,80,80,105,212,208,200,212,208,200,212,208,200,163,163, + 182,226,226,232,235,235,239,158,161,183,143,191,243,154,203,249,166,212,250,178,220,252,189,229,253, + 199,236,254,207,241,255,212,242,255,214,243,255,216,243,255,215,243,255,212,242,255,208,241,255,201, + 237,255,191,230,253,180,222,252,169,214,251,157,204,249,144,195,248,130,180,239,101,105,139,152,152, + 173,142,142,165,100,100,132,212,208,200,212,208,200,212,208,200,212,208,200,159,159,178,181,181,196, + 244,244,246,194,194,207,153,174,207,160,207,250,173,217,251,185,226,253,197,235,254,207,241,255,214, + 243,255,219,245,255,223,246,255,225,246,255,224,246,255,220,245,255,215,243,255,209,241,255,200,237, + 255,188,228,253,176,219,252,163,209,250,150,199,248,117,140,182,125,125,152,155,155,176,113,113,143, + 91,91,120,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,157,157,177,215,215,223,235, + 235,239,163,163,182,160,188,221,178,220,252,191,231,253,204,239,255,212,242,255,220,245,255,226,247, + 255,232,248,255,234,249,255,232,248,255,228,247,255,221,245,255,214,243,255,205,240,255,194,232,254, + 181,223,252,168,213,250,135,165,205,106,106,137,152,152,174,136,136,160,99,99,131,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,151,151,171,158,158,178,227,227,233,219,219, + 227,153,153,174,169,194,220,195,233,254,207,241,255,216,243,255,224,246,255,232,248,255,239,250,255, + 243,251,255,240,251,255,234,249,255,226,247,255,218,244,255,209,241,255,198,236,254,184,225,253,146, + 173,207,103,103,134,146,146,168,146,146,168,103,103,134,85,85,113,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,147,147,169,165,165,184,228,228,233,214,214,223, + 153,153,174,165,182,203,204,235,249,218,244,255,227,247,255,236,249,255,244,252,255,125,127,207,123, + 126,207,237,250,255,228,247,255,220,245,255,210,242,255,194,229,247,139,157,185,107,107,138,147,147, + 169,150,150,172,109,109,139,93,93,124,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,142,142,163,161,161,180,218,218,225,220,220,227,174, + 174,191,139,141,165,175,188,206,220,239,249,235,249,255,243,252,255,155,158,219,152,157,219,236,250, + 255,228,247,255,212,236,248,158,174,195,109,112,142,128,128,154,155,155,176,148,148,170,110,110,140, + 94,94,125,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,138,138,160,146,146,168,196,196,208,219,219,227,205,205, + 216,160,160,180,131,131,157,144,147,170,165,169,188,180,184,200,177,183,199,158,163,184,131,135,161, + 111,111,141,129,129,155,158,158,178,160,160,180,139,139,163,104,104,135,94,94,125,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,123,123,144,136,136,161,155,155,175,192,192,205,209,209,218, + 205,205,215,186,186,200,177,177,193,158,158,178,154,154,175,164,164,183,164,164,183,172,172,189,167, + 167,185,148,148,170,117,117,146,102,102,133,87,87,114,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,122,122,145,130,130,156,138,138,162,159,159,178,174, + 174,191,175,175,191,188,188,202,183,183,198,162,162,181,154,154,175,135,135,160,114,114,143,105,105, + 135,95,95,123,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,100,100,122,116,116,142,120,120,147,119,119, + 147,117,117,145,114,114,143,112,112,141,109,109,138,101,101,129,84,84,108,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 32, 32, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 26) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,210,210,210,232,232,232, + 187,187,187,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,225,225,225,248,248,248,235,235,235,78,78,78,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,192,192, + 192,117,117,117,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,235,235,235,240,240,240,239,239,239,116,116,116,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,169,169,169,198,198,198, + 183,183,183,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,234,234,234,240,240,240,169,169,169,212,208,200,212,208,200,212,208,200,212,208,200,242,242,242, + 103,103,103,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,198,198,198,255,255,255,209, + 209,209,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,240,240,240,230,231,230, + 240,240,240,165,165,165,212,208,200,212,208,200,212,208,200,217,217,217,255,255,255,145,145,145,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,173,173,173,255,255,255,105,105, + 105,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,237,237,237,230,231,230,232,232,232,238, + 238,238,164,164,164,212,208,200,223,223,223,255,255,255,255,255,255,135,135,135,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,107,107,107,218,218,218,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,234,234,234,229,229,229,230,231,230,236,236,236,249,249, + 249,253,253,253,255,255,255,255,255,255,251,251,251,91,91,91,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,92,92,92,215,215,215,90,90,90,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,238,238,238,228,228,228,228,228,228,233,233,233,240,240,240,247,247,247, + 255,255,255,255,255,255,202,202,202,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,91,91,91,214,214,214,95,95,95,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 230,231,230,206,206,206,218,218,218,230,231,230,233,233,233,237,237,237,239,239,239,229,229,229,193, + 193,193,71,71,71,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,82,82,82,209,209,209,100,100,100,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,235,235,235,203,203,203,165, + 165,165,214,214,214,233,233,233,205,205,205,154,154,154,105,105,105,67,67,67,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,83,83,83,207,207,207,105,105,105,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,236,236,236,211,211,211,177,177,177,211,211,211,234,234, + 234,175,175,175,63,63,63,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,82,82,82,203,203,203,110,110,110,212,208,200,212,208, + 200,212,208,200,236,236,236,219,219,219,189,189,189,218,218,218,235,235,235,170,170,170,43,43,43, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,83,83,83,197,197,197,102,102,102,212,208,200,238,238,238, + 228,228,228,203,203,203,225,225,225,236,236,236,166,166,166,41,41,41,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,68,68,68,183,183,183,187,187,187,226,226,226,220,220,220,231, + 232,233,237,237,238,159,159,159,40,40,40,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,191,191,191,177,177,177,173,173,173,223,224,228,230,228,227,143,143, + 142,29,31,32,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,230,231,230,243,243,243,198,198,198,164,166,171,201,183,159,232,202,151,148,119,71,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,212,212,255,255,255, + 255,255,255,239,241,244,202,184,153,235,194,98,255,255,255,253,230,197,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,202,202,202,255,255,255,255,255,255,255,255,255,242, + 246,253,223,185,103,255,203,3,249,230,141,255,232,158,170,117,2,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,204,204,204,255,255,255,255,255,255,255,255,255,248,248,248,154,156,163,110,85, + 34,221,164,0,244,179,0,255,225,94,255,248,154,216,161,29,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,187,187, + 187,255,255,255,255,255,255,255,255,255,249,249,249,159,159,159,38,38,38,212,208,200,212,208,200, + 141,91,0,255,204,34,255,252,188,255,255,186,246,193,43,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,180,180,180,255,255,255,255,255,255, + 255,255,255,250,250,250,155,155,155,36,36,36,212,208,200,212,208,200,212,208,200,212,208,200,194, + 128,0,255,210,42,255,251,189,255,255,195,255,211,55,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 135,135,135,142,142,142,171,171,171,222,222,222,255,255,255,255,255,255,255,255,255,247,247,247,151, + 151,151,30,30,30,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,232,158, + 0,255,209,42,255,250,184,255,255,188,237,179,27,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,114,114,114,226,226,226,237,237,237,242, + 242,242,255,255,255,255,255,255,255,255,255,255,255,255,245,245,245,147,147,147,30,30,30,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,252,176,0, + 255,203,27,255,226,107,255,245,155,240,192,62,179,125,10,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,215,215,215,240,240,240,243,243,243,250,250,250,248,248, + 248,250,250,250,255,255,255,255,255,255,179,179,179,30,30,30,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,145,0,255, + 182,0,255,239,147,255,255,221,255,218,58,244,183,16,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,93,93,93,236,236,236,237,237,237,215,215,215,201,201,201,246,246,246,252,252,252, + 255,255,255,255,255,255,135,135,135,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,234,159,0,255,208, + 49,255,234,123,255,229,100,255,254,177,240,204,76,212,208,200,212,208,200,212,208,200,212,208,200, + 126,126,126,244,244,244,205,205,205,79,79,79,25,25,25,116,116,116,246,246,246,255,255,255,255, + 255,255,126,126,126,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,140,97,7,255,185,0,255,197,17, + 255,250,174,255,255,226,255,255,195,213,172,52,212,208,200,212,208,200,212,208,200,125,125,125,230, + 231,230,102,102,102,212,208,200,212,208,200,212,208,200,210,210,210,255,255,255,255,255,255,112,112, + 112,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,223,154,5,255,193,5,255,226,91,255, + 246,164,255,253,201,255,254,170,176,133,26,212,208,200,212,208,200,212,208,200,125,125,125,212,208, + 200,212,208,200,212,208,200,91,91,91,236,236,236,255,255,255,217,217,217,57,57,57,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,211,148,6,255,192,0,255,212,38,255,234, + 114,255,255,210,255,242,138,130,96,12,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,211,211,211,255,255,255,218,218,218,93,93,93,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,174,121,8,255,187,0,255,206,23,255,240,136, + 255,254,167,242,190,35,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,144,144,144,220, + 220,220,168,168,168,73,73,73,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,128,90,11,249,176,3,255,202,17,255,220,42,232, + 172,17,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,37,37,37,15,15, + 15,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,74,54,10,201,142,7,212,152,4,89,63,10,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 32, 32, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 27) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,126,127,155,126,127,155,126,127,155,126,127,155,126,127,155,126,127,155,126,127, + 155,126,127,155,126,127,155,88,90,123,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,79,81,115,85,93, + 136,173,178,201,228,228,234,238,241,245,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 213,219,231,150,151,179,67,72,115,59,60,103,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,115,125,143,58,76,124,163,172,183,231,235,241,238,241,245, + 219,225,235,219,225,235,238,241,245,231,235,241,228,228,234,228,228,234,213,219,231,254,254,254,254, + 254,254,213,219,231,126,127,155,41,41,92,88,90,123,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,93,111,137,72,113,150,199,215,228,230,243,246,199,215,228,196,199,218,196,199,218,228, + 228,234,228,228,234,196,199,218,196,199,218,196,199,218,196,199,218,196,199,218,228,228,234,238,241, + 245,213,219,231,145,145,173,41,41,92,59,60,103,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,147,161,181,72, + 113,150,199,215,228,238,241,245,219,225,235,199,215,228,179,199,224,181,197,217,231,235,241,179,184, + 211,168,171,206,179,184,211,196,199,218,238,241,245,213,219,231,179,184,211,228,228,234,213,219,231, + 196,199,218,126,127,155,41,41,92,59,60,103,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,163,172,183,105,138,169,122,151,184,217,236, + 243,228,228,234,228,228,234,199,215,228,154,179,206,213,219,231,179,199,224,159,164,202,168,171,206, + 168,171,206,179,184,211,228,228,234,196,199,218,150,155,196,150,155,196,213,219,231,213,219,231,169, + 182,212,102,116,156,59,60,103,79,81,115,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,144,169,192,140,165,192,102,116,156,140,165,192,183,214,232,213,219,231, + 213,219,231,164,194,220,164,194,220,213,219,231,149,161,202,135,148,193,132,144,190,132,144,190,130, + 137,189,132,144,190,150,155,196,130,137,189,119,135,184,132,144,190,199,215,228,181,197,217,119,135, + 184,85,93,136,67,72,115,138,138,152,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,116,131,163,140,165,192,102,116,156,119,135,184,133,165,194,139,183,219,139,183,219,144, + 170,208,183,214,232,169,182,212,105,119,180,105,119,180,105,119,180,105,119,180,105,119,180,105,119, + 180,119,135,184,119,135,184,105,119,180,119,135,184,144,170,208,217,236,243,154,194,220,73,122,168, + 58,76,124,67,72,115,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,144,169,192,133, + 165,194,140,169,194,97,115,168,88,105,171,97,115,168,119,135,184,132,144,190,107,138,188,179,199, + 224,119,135,184,88,105,171,88,105,171,97,115,168,86,119,183,88,105,171,88,105,171,97,115,168, + 105,119,180,98,111,173,107,138,188,139,183,219,201,233,244,223,243,247,123,178,203,72,113,150,41, + 50,110,126,127,155,212,208,200,212,208,200,212,208,200,212,208,200,144,169,192,164,194,220,154,179, + 206,97,115,168,72,85,156,98,111,173,105,119,180,88,105,171,86,119,183,179,199,224,86,119,183, + 88,105,171,88,105,171,84,108,176,84,108,176,88,105,171,88,105,171,71,100,172,105,119,180,88, + 105,171,98,147,203,154,194,220,196,199,218,230,243,246,168,215,233,78,130,169,58,76,124,67,72, + 115,212,208,200,212,208,200,212,208,200,144,169,192,57,73,133,154,179,206,201,233,244,83,122,167, + 88,105,171,84,108,176,59,84,163,59,84,163,105,119,180,154,179,206,71,100,172,84,108,176,86, + 119,183,89,132,187,89,132,187,86,119,183,71,105,178,67,92,168,88,105,171,71,100,172,87,137, + 198,123,177,220,179,199,224,202,227,239,183,214,232,73,122,168,58,76,124,41,50,110,144,169,192, + 212,208,200,212,208,200,144,169,192,43,60,135,105,138,169,210,252,254,168,204,230,97,111,176,59, + 84,163,67,92,168,59,84,163,113,142,196,139,183,219,72,115,182,87,145,199,97,169,211,102,182, + 218,102,182,218,99,165,206,89,132,187,72,115,182,84,108,176,71,100,172,71,105,178,89,132,187, + 107,164,214,102,182,218,186,223,241,83,122,167,57,73,133,38,47,115,144,169,192,212,208,200,212, + 208,200,144,169,192,43,60,135,87,145,199,235,253,254,242,254,254,99,165,206,72,115,182,71,105, + 178,67,92,168,124,155,204,139,183,219,87,145,199,102,182,218,131,220,236,174,240,248,194,234,246, + 131,220,236,102,182,218,87,137,198,97,111,176,71,105,178,67,92,168,72,115,182,72,120,197,71, + 105,178,151,184,215,119,135,184,57,73,133,43,60,127,144,169,192,212,208,200,212,208,200,144,169, + 192,44,66,148,83,122,167,153,215,235,210,252,254,188,231,244,133,200,232,92,167,211,72,115,182, + 134,172,212,139,183,219,92,167,211,131,220,236,227,254,254,254,254,254,254,254,254,217,253,254,117, + 212,233,99,165,206,89,132,187,86,119,183,67,92,168,67,92,168,67,92,168,67,92,168,107,138, + 188,154,179,206,51,77,157,62,88,152,144,169,192,212,208,200,212,208,200,144,169,192,44,66,148, + 88,105,171,100,156,209,167,220,240,210,252,254,235,253,254,183,242,248,115,179,221,122,187,226,150, + 196,228,102,182,218,174,240,248,254,254,254,235,253,254,235,253,254,242,254,254,150,229,242,102,182, + 218,87,137,198,86,119,183,71,100,172,71,105,178,67,92,168,67,92,168,86,119,183,154,194,220, + 72,113,150,144,170,208,144,169,192,212,208,200,212,208,200,144,169,192,51,77,157,86,119,183,87, + 145,199,150,229,242,242,254,254,227,254,254,235,253,254,174,240,248,203,250,252,183,242,248,117,212, + 233,150,229,242,242,254,254,235,253,254,242,254,254,254,254,254,150,229,242,102,182,218,254,254,254, + 254,254,254,254,254,254,71,105,178,71,105,178,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,144,169,192,212,208,200,212,208,200,144,169,192,67,92,168,86,119,183,87,145,199,131,220, + 236,227,254,254,235,253,254,194,245,250,131,220,236,194,245,250,217,253,254,174,240,248,174,240,248, + 210,252,254,235,253,254,227,254,254,174,240,248,108,207,232,254,254,254,166,125,99,114,69,40,158, + 120,100,254,254,254,254,254,254,232,230,226,189,164,146,189,164,146,180,157,144,189,164,146,182,153, + 134,218,205,198,212,208,200,144,169,192,86,119,183,86,119,183,87,137,198,102,182,218,174,240,248, + 204,241,252,117,212,233,92,167,211,122,187,226,168,231,243,122,187,226,153,215,235,181,237,246,203, + 250,252,203,250,252,174,240,248,254,254,254,161,118,92,177,108,51,131,59,8,182,153,134,212,195, + 186,159,109,78,170,105,56,168,92,34,182,103,39,182,103,39,167,85,21,124,55,9,212,195,186, + 212,208,200,144,169,192,119,135,184,71,105,178,82,127,193,87,137,198,116,181,224,188,231,244,116, + 181,224,87,145,199,98,147,203,168,215,233,98,147,203,97,169,211,110,184,229,115,201,228,126,202, + 230,254,254,254,212,195,186,148,77,23,193,113,46,135,70,25,135,70,25,184,128,80,214,157,101, + 225,163,101,225,163,101,199,122,55,167,85,21,142,80,38,212,195,186,212,208,200,212,208,200,212, + 208,200,144,169,192,72,120,197,72,120,197,87,137,198,87,137,198,138,189,226,180,219,243,87,137, + 198,87,137,198,180,219,243,123,177,220,98,147,203,101,162,211,101,162,211,101,162,211,254,254,254, + 173,142,125,148,77,23,168,92,34,135,70,25,214,157,101,229,188,140,214,157,101,199,122,55,167, + 85,21,142,80,38,182,153,134,238,234,234,212,208,200,212,208,200,212,208,200,212,208,200,144,169, + 192,82,127,193,72,120,197,98,147,203,87,145,199,100,156,209,180,219,243,150,196,228,87,145,199, + 150,196,228,168,204,230,93,155,210,101,162,211,101,162,211,107,164,214,254,254,254,180,157,144,131, + 59,8,135,70,25,215,144,78,215,144,78,191,117,55,148,77,23,166,125,99,182,153,134,238,234, + 234,72,115,182,144,169,192,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,144,169,192, + 72,120,197,87,145,199,100,156,209,100,156,209,108,170,218,201,233,244,133,200,232,114,173,219,188, + 231,244,114,173,219,107,164,214,107,164,214,254,254,254,218,205,198,132,85,55,124,55,9,193,113, + 46,191,117,55,172,97,38,135,70,25,113,47,6,172,145,130,123,177,220,150,202,246,119,135,184, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,144,169,192,107,138,188,80, + 140,213,100,156,209,107,164,214,108,170,218,130,188,226,201,233,244,122,187,226,167,220,240,168,215, + 233,107,164,214,114,173,219,254,254,254,224,213,206,90,31,3,135,70,25,199,122,55,182,103,39, + 168,92,34,142,80,38,185,150,121,177,116,66,119,57,18,203,190,183,140,169,194,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,144,169,192,98,147,203,93,155, + 210,107,164,214,114,173,219,115,179,221,142,203,232,201,233,244,153,215,235,194,234,246,133,200,232, + 115,179,221,254,254,254,228,224,218,132,85,55,157,83,27,182,103,39,182,103,39,175,121,74,242, + 238,231,254,254,254,157,136,115,148,77,23,135,70,25,180,157,144,126,127,155,126,127,155,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,144,169,192,115,164,218,107,168,227, + 114,173,219,116,181,224,116,181,224,142,203,232,194,236,251,194,234,246,183,229,244,124,193,228,254, + 254,254,224,213,208,143,100,76,182,103,39,199,122,55,193,113,46,211,145,84,254,254,254,183,183, + 182,0,0,0,149,89,49,195,126,67,196,168,140,186,179,170,140,138,137,126,127,155,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,144,169,192,125,164,206,115,180,234,130, + 188,226,140,194,228,133,200,232,142,203,232,194,236,251,235,253,254,204,241,252,254,254,254,218,205, + 198,135,70,25,199,122,55,211,145,84,211,145,84,199,122,55,214,157,101,185,150,121,132,85,55, + 199,122,55,214,172,128,165,167,169,186,179,170,235,232,225,160,159,155,126,127,155,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,144,169,192,144,169,192,103,166,221,108,180, + 234,122,187,235,130,188,226,133,200,232,167,220,240,235,253,254,254,254,254,203,190,183,135,70,25, + 210,138,72,224,190,150,224,190,150,215,144,78,193,113,46,192,111,42,182,103,39,199,122,55,185, + 150,121,140,138,137,140,138,137,228,224,218,228,224,218,126,127,155,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,144,169,192,140,169,194,115,168,214, + 115,180,234,118,188,240,122,198,240,122,198,240,254,254,254,173,142,125,135,70,25,199,122,55,219, + 161,104,222,171,119,211,145,84,199,122,55,193,113,46,182,103,39,170,105,56,189,164,146,200,201, + 200,243,241,238,254,254,254,243,241,238,126,127,155,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,144,169,192,144,169,192,144, + 169,192,144,169,192,144,169,192,144,169,192,172,145,130,107,47,18,168,92,34,199,122,55,215,144, + 78,211,145,84,199,122,55,193,113,46,168,92,34,177,116,66,199,184,166,224,213,208,235,232,225, + 243,241,238,243,241,238,126,127,155,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,149,108,86,101,39,4,119,57,18,157,83,27,182,103,39,191,117,55, + 182,103,39,172,97,38,135,70,25,165,135,109,203,190,183,179,175,169,183,183,182,235,232,225,228, + 224,218,126,127,155,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,154,115,93,124,55,9,135,70,25,119,57,18,119,57,18,119,57,18,119,57,18,114, + 69,40,89,73,63,98,96,95,154,153,151,154,153,151,131,129,125,131,129,125,140,138,137,126,127, + 155,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,143, + 100,76,149,89,49,187,120,67,211,145,84,199,136,80,170,105,56,142,80,38,180,157,144,212,208, + 200,126,127,155,126,127,155,126,127,155,126,127,155,126,127,155,126,127,155,212,208,200 + }; + wxImage image( 32, 32, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 28) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,207,207,207,210,210,210,210,210,210,210,210,210,210,210,210,210, + 210,210,210,210,210,210,210,210,210,210,210,207,207,207,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,212,208,200,212,208,200,212,208,200,223, + 223,223,255,255,255,242,242,242,242,242,242,242,242,242,243,242,242,240,240,242,241,241,242,242,242, + 242,242,242,242,242,242,242,242,242,242,254,254,254,232,232,232,212,208,200,212,208,200,233,233,233, + 236,236,236,231,231,231,231,231,231,231,231,231,236,235,232,194,203,230,204,211,230,235,234,232,231, + 231,231,231,231,231,231,231,231,235,235,235,237,237,237,212,208,200,212,208,200,226,226,226,226,226, + 226,222,222,222,222,222,222,222,222,222,226,225,222,236,233,225,234,232,227,222,222,222,222,222,222, + 222,222,222,222,222,222,225,225,225,230,231,230,212,208,200,212,208,200,224,224,224,216,216,216,214, + 214,214,214,214,214,217,216,214,192,198,214,138,155,203,163,175,208,221,219,215,214,214,214,214,214, + 214,214,214,214,216,216,216,227,227,227,212,208,200,212,208,200,224,224,224,211,211,211,209,209,209, + 209,209,209,209,209,209,224,221,213,138,155,198,147,161,199,218,216,211,209,209,209,209,209,209,209, + 209,209,211,211,211,225,225,225,212,208,200,212,208,200,222,222,222,207,207,207,206,206,206,206,206, + 206,206,206,206,218,216,209,118,137,187,130,146,192,217,215,208,206,206,206,206,206,206,206,206,206, + 207,207,207,223,223,223,212,208,200,212,208,200,227,227,227,207,207,207,206,206,206,206,206,206,206, + 206,206,224,220,210,106,127,182,120,138,185,222,219,210,206,206,206,206,206,206,206,206,206,207,207, + 207,226,226,226,212,208,200,212,208,200,239,239,239,212,212,212,210,210,210,210,210,210,214,213,211, + 196,200,208,57,87,168,62,91,169,200,202,208,214,213,211,210,210,210,210,210,210,211,211,211,239, + 239,239,212,208,200,212,208,200,212,208,200,237,237,237,218,218,218,217,217,217,220,219,218,202,205, + 214,197,202,214,196,201,214,204,206,213,218,217,216,217,217,217,218,218,218,235,235,235,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,247,247,247,242,242,242,241,241,241,244,243,242,246, + 245,242,247,246,243,231,231,229,231,231,231,243,243,243,247,247,247,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,166,166,166,199,199,199,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,233,233,233,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 29) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,57,122,255,57,122,255,56,121,255,56,121,255,56,121,255,54,120,255, + 52,118,255,50,118,255,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,59,124,255,59,124,255, + 59,124,255,57,122,255,56,121,255,56,121,255,56,121,255,54,120,255,52,118,255,50,118,255,50, + 118,255,50,118,255,48,117,255,47,115,255,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,59,124,255,59,124,255,59,124,255,61,125,255,70, + 131,255,77,136,255,123,162,242,134,171,249,134,171,249,133,169,242,75,135,255,65,127,255,54,120, + 255,47,115,255,47,115,255,45,114,255,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,61,125,255,59,124,255,59,124,255,63,126,255,75,135,255,149,182,250,197,215,252,246,249, + 255,246,249,255,246,249,255,246,249,255,246,249,255,246,249,255,217,229,253,170,196,251,109,151,236, + 50,118,255,45,114,255,43,113,255,43,113,255,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,61,125,255,59,124, + 255,59,124,255,72,132,255,137,174,249,217,229,253,235,242,255,235,242,255,226,235,253,193,209,243, + 187,205,241,185,204,242,185,204,242,185,204,242,235,242,255,235,242,255,235,242,255,164,192,251,85, + 137,243,43,113,255,41,111,255,39,110,255,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,61,125,255,59,124,255,59,124,255,93,144,246, + 176,201,251,224,234,255,224,234,255,209,223,251,185,204,242,185,204,242,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,185,204,242,185,204,242,224,234,255,224,234,255,201,218,253,117,154, + 232,39,110,255,39,110,255,38,109,255,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,59,124,255,59,124,255,75,135,255,192,212,253,215,229,255,215, + 229,255,193,212,249,182,201,240,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,185,204,242,215,229,255,215,229,255,207,223,254,114,153,233, + 38,109,255,38,109,255,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,59,124,255,59,124,255,72,132,255,162,191,251,203,220,255,203,220,255,198,216,253,182,201, + 240,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,185,204,242,203,220,255,203,220,255,183,206,253,78,133,245,36, + 108,255,36,108,255,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,59,124,255,59,124, + 255,61,125,255,125,165,249,194,215,255,194,215,255,194,215,255,163,189,242,255,255,255,255,255,255, + 255,255,255,255,255,255,230,238,255,196,215,255,194,215,255,199,218,255,242,247,255,255,255,255,255, + 255,255,255,255,255,246,249,255,194,215,255,194,215,255,194,215,255,156,188,251,41,111,255,34,107, + 255,34,107,255,212,208,200,212,208,200,212,208,200,212,208,200,59,124,255,59,124,255,75,135,255, + 171,198,253,181,206,255,181,206,255,181,206,255,187,206,244,255,255,255,255,255,255,255,255,255,246, + 249,255,181,206,255,181,206,255,181,206,255,181,206,255,175,199,249,244,247,251,255,255,255,255,255, + 255,255,255,255,187,209,255,181,206,255,181,206,255,181,206,255,91,140,242,34,107,255,32,106,255, + 212,208,200,212,208,200,212,208,200,212,208,200,59,124,255,61,125,255,124,165,250,171,198,255,171, + 198,255,171,198,255,171,198,255,194,211,246,255,255,255,255,255,255,255,255,255,203,220,255,171,198, + 255,171,198,255,171,198,255,171,198,255,162,191,249,215,224,242,255,255,255,255,255,255,255,255,255, + 192,213,255,171,198,255,148,182,252,128,169,251,104,152,248,38,109,255,30,104,255,212,208,200,212, + 208,200,212,208,200,57,122,255,57,122,255,68,130,255,139,177,252,160,191,255,160,191,255,160,191, + 255,160,191,255,184,206,252,255,255,255,255,255,255,248,251,255,165,195,255,160,191,255,160,191,255, + 160,191,255,160,191,255,145,172,228,255,255,255,255,255,255,255,255,255,255,255,255,126,166,250,94, + 145,251,84,141,255,84,141,255,84,141,255,56,121,255,30,104,255,30,104,255,212,208,200,212,208, + 200,57,122,255,56,121,255,77,136,255,145,180,254,149,184,255,149,184,255,149,184,255,149,184,255, + 149,184,255,181,206,255,199,218,255,162,192,255,149,184,255,149,184,255,149,184,255,149,184,255,145, + 174,232,224,231,244,255,255,255,255,255,255,255,255,255,214,227,253,84,141,255,84,141,255,84,141, + 255,84,141,255,84,141,255,68,130,255,30,104,255,29,103,255,212,208,200,212,208,200,56,121,255, + 56,121,255,85,140,252,138,177,255,138,177,255,138,177,255,138,177,255,138,177,255,138,177,255,138, + 177,255,138,177,255,138,177,255,138,177,255,138,177,255,138,177,255,142,171,232,244,247,251,255,255, + 255,255,255,255,255,255,255,245,248,254,113,157,248,84,141,255,84,141,255,84,141,255,84,141,255, + 84,141,255,75,135,255,29,103,255,27,102,255,212,208,200,212,208,200,56,121,255,54,120,255,101, + 150,249,127,170,255,127,170,255,127,170,255,127,170,255,127,170,255,127,170,255,127,170,255,127,170, + 255,127,170,255,127,170,255,127,170,255,133,163,224,244,247,251,255,255,255,255,255,255,255,255,255, + 245,248,254,124,165,248,84,141,255,84,141,255,84,141,255,84,141,255,84,141,255,84,141,255,84, + 141,255,27,102,255,26,101,254,212,208,200,212,208,200,54,120,255,54,120,255,99,148,250,115,161, + 255,115,161,255,115,161,255,115,161,255,115,161,255,115,161,255,115,161,255,115,161,255,115,161,255, + 115,161,255,114,153,233,244,247,251,255,255,255,255,255,255,255,255,255,245,248,254,124,165,248,84, + 141,255,84,141,255,84,141,255,84,141,255,84,141,255,84,141,255,84,141,255,84,141,255,26,101, + 254,26,101,254,212,208,200,212,208,200,52,118,255,52,118,255,82,138,254,102,153,255,102,153,255, + 102,153,255,102,153,255,102,153,255,102,153,255,102,153,255,102,153,255,102,153,255,103,153,254,175, + 193,231,255,255,255,255,255,255,255,255,255,234,241,254,125,165,249,86,142,255,86,142,255,86,142, + 255,86,142,255,86,142,255,86,142,255,86,142,255,86,142,255,75,135,255,26,101,254,26,101,254, + 212,208,200,212,208,200,52,118,255,50,118,255,77,136,255,95,148,255,95,148,255,95,148,255,95, + 148,255,95,148,255,95,148,255,95,148,255,94,147,254,92,145,254,90,145,255,214,223,241,255,255, + 255,255,255,255,255,255,255,124,166,251,90,145,255,90,145,255,90,145,255,90,145,255,90,145,255, + 90,145,255,90,145,255,90,145,255,90,145,255,68,130,255,26,100,252,26,100,252,212,208,200,212, + 208,200,50,118,255,50,118,255,68,130,255,91,145,255,94,147,254,94,147,254,94,147,254,93,146, + 255,91,145,255,91,145,255,91,145,255,91,145,255,91,145,255,215,223,240,255,255,255,255,255,255, + 225,235,254,91,145,255,91,145,255,91,145,255,91,145,255,91,145,255,91,145,255,91,145,255,91, + 145,255,91,145,255,91,145,255,52,118,255,26,100,251,26,100,251,212,208,200,212,208,200,212,208, + 200,48,117,255,54,120,255,93,146,255,93,146,255,93,146,255,93,146,255,93,146,255,93,146,255, + 93,146,255,93,146,255,93,146,255,93,146,255,195,211,243,255,255,255,255,255,255,174,201,255,93, + 146,255,93,146,255,93,146,255,93,146,255,93,146,255,93,146,255,93,146,255,93,146,255,93,146, + 255,93,146,255,30,104,255,26,100,251,212,208,200,212,208,200,212,208,200,212,208,200,47,115,255, + 47,115,255,83,138,251,99,150,255,99,150,255,99,150,255,99,150,255,99,150,255,99,150,255,99, + 150,255,99,150,255,99,150,255,109,157,255,169,198,255,158,190,255,99,150,255,99,150,255,99,150, + 255,99,150,255,99,150,255,99,150,255,99,150,255,99,150,255,99,150,255,99,150,255,74,133,251, + 26,100,251,26,100,251,212,208,200,212,208,200,212,208,200,212,208,200,47,115,255,47,115,255,54, + 119,253,106,155,255,106,155,255,106,155,255,106,155,255,106,155,255,106,155,255,106,155,255,106,155, + 255,106,155,255,99,145,237,185,204,242,177,197,238,123,165,251,106,155,255,106,155,255,106,155,255, + 106,155,255,106,155,255,106,155,255,106,155,255,106,155,255,106,155,255,35,107,252,26,100,251,26, + 100,251,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,45,114,255,43,113,255,89,140, + 243,115,161,255,115,161,255,115,161,255,115,161,255,115,161,255,115,161,255,115,161,255,109,153,242, + 224,230,242,255,255,255,255,255,255,246,249,255,122,166,255,115,161,255,115,161,255,115,161,255,115, + 161,255,115,161,255,115,161,255,115,161,255,82,135,242,26,100,251,26,100,249,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,43,113,255,43,113,255,107,150,238, + 120,165,255,120,165,255,120,165,255,120,165,255,120,165,255,120,165,255,114,154,238,255,255,255,255, + 255,255,255,255,255,255,255,255,154,188,255,120,165,255,120,165,255,120,165,255,120,165,255,120,165, + 255,120,165,255,101,145,236,26,100,251,26,100,249,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,43,113,255,41,111,255,39,110,255,114,153,234,127, + 170,255,127,170,255,127,170,255,127,170,255,127,170,255,123,164,247,246,249,255,255,255,255,255,255, + 255,255,255,255,144,180,255,127,170,255,127,170,255,127,170,255,127,170,255,127,170,255,110,151,233, + 26,100,251,26,100,249,26,100,249,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,39,110,255,38,109,255,38,109,255,107,148,233,136,176, + 255,136,176,255,136,176,255,136,176,255,136,176,255,158,190,255,217,230,255,224,234,255,174,201,255, + 136,176,255,136,176,255,136,176,255,136,176,255,136,176,255,102,145,230,26,100,251,26,100,249,26, + 100,249,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,38,109,255,36,108,255,36,108,255,56,118,245,125,161,233, + 144,180,255,144,180,255,144,180,255,144,180,255,144,180,255,144,180,255,144,180,255,144,180,255,144, + 180,255,144,180,255,124,158,228,47,112,243,26,100,251,26,100,249,26,100,249,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,34,107,255,34,107,255,32,106,255,59,119,242,110, + 149,227,132,166,234,140,173,242,151,185,255,151,185,255,140,174,242,131,165,233,107,145,225,52,114, + 241,26,100,251,26,100,251,26,100,249,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,32,106,255,32,106,255,30,104,255,30,104,255,29,103, + 255,27,102,255,27,102,255,26,101,254,26,101,254,26,100,252,26,100,251,26,100,251,26,100,251, + 26,100,249,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,29,103,255,29,103,255,27,102,255, + 26,101,254,26,101,254,26,100,252,26,100,252,26,100,251,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 32, 32, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 30) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,212,208,200,212,208, + 200,212,208,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,212,208,200,0,0,0,0, + 0,0,47,47,47,238,238,238,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237, + 237,237,237,237,237,237,237,237,237,237,234,234,234,74,74,74,0,0,0,0,0,0,0,0,0, + 225,225,225,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,254,251,251,251,220,220,220,0,0,0,0,0,0,0,0,0,223,223, + 223,253,253,253,205,239,253,180,232,253,248,251,252,252,252,252,252,252,252,252,252,252,252,252,252, + 252,252,252,252,252,252,252,252,252,218,218,218,0,0,0,0,0,0,0,0,0,220,220,220,251, + 251,251,193,234,251,91,207,255,113,213,254,203,237,251,249,249,249,249,249,249,249,249,249,249,249, + 249,249,249,249,249,249,249,216,216,216,0,0,0,0,0,0,0,0,0,219,219,219,250,250,250, + 189,230,250,83,200,255,83,200,255,83,200,255,129,213,253,220,239,248,247,247,247,247,247,247,247, + 247,247,247,247,247,214,214,214,0,0,0,0,0,0,0,0,0,216,216,216,248,248,248,184,225, + 248,73,191,255,73,191,255,73,191,255,73,191,255,75,192,255,143,213,250,232,240,245,244,244,244, + 244,244,244,211,211,211,0,0,0,0,0,0,0,0,0,213,213,213,246,246,246,177,219,246,60, + 179,255,60,179,255,60,179,255,60,179,255,60,179,255,60,179,255,71,183,254,194,225,245,241,241, + 241,209,209,209,0,0,0,0,0,0,0,0,0,211,211,211,244,244,244,170,213,244,46,167,255, + 46,167,255,46,167,255,46,167,255,46,167,255,71,176,253,177,215,243,238,238,238,238,238,238,206, + 206,206,0,0,0,0,0,0,0,0,0,208,208,208,242,242,242,163,206,242,31,154,255,31,154, + 255,31,154,255,41,158,254,137,196,245,228,232,236,235,235,235,235,235,235,235,235,235,204,204,204, + 0,0,0,0,0,0,0,0,0,206,206,206,240,240,240,156,200,240,18,142,255,18,142,255,94, + 174,247,212,224,234,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,201,201,201,0,0, + 0,0,0,0,0,0,0,204,204,204,239,239,239,152,196,239,55,154,250,183,209,235,230,231,230, + 230,231,230,230,231,230,230,231,230,230,231,230,230,231,230,230,231,230,199,199,199,0,0,0,0, + 0,0,0,0,0,197,197,197,223,223,223,214,221,229,227,227,227,227,227,227,227,227,227,227,227, + 227,227,227,227,227,227,227,227,227,227,227,227,227,221,222,221,194,194,194,0,0,0,0,0,0, + 0,0,0,39,39,39,196,196,196,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195, + 195,195,195,195,195,195,195,195,195,195,195,192,192,192,62,62,62,0,0,0,212,208,200,212,208, + 200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,212,208,200 + }; + wxImage image( 16, 16, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 31) + { + /* XPM */ + static const char *xpm_data[] = { + /* columns rows colors chars-per-pixel */ + "15 15 4 1", + "a c #1C89FF", + "b c #AAD1FF", + "c c #0000FF", + "d c #5B5AFF", + /* pixels */ + "ddddddddddddddc", + "dbbbbbbbbbbbbbc", + "dbbbbbbccbbbbbc", + "dbbbbbacabbbbbc", + "dbbbbbaabbbbbbc", + "dbbbbbbccbbbbbc", + "dbbbbbaccbbbbbc", + "dbbbbbaccbbbbbc", + "dbbbbbaccbbbbbc", + "dbbbbbaccbbbbbc", + "dbbbbbaccbbbbbc", + "dbbbbbacabbbbbc", + "dbbbbbaabbbbbbc", + "dbbbbbbbbbbbbbc", + "ccccccccccccccc" + }; + wxBitmap bitmap( xpm_data ); + return bitmap; + } + if (index == 32) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,173,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,177,0,0,178,0,0, + 177,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,168,0,0,201,0,0,216,0,0,201,0,0,168, + 0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,168,0,0,178,0,0,219,0,0,255,0,0,219,0,0,178,0,0,168,0, + 0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,168,0, + 0,194,0,0,214,0,0,239,34,34,255,71,71,242,38,38,219,0,0,200,0,0,177,0,0, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,168,0,0,178,0,0,214,0,0, + 255,0,0,255,71,71,255,127,127,255,71,71,255,0,0,214,0,0,178,0,0,168,0,0,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,168,0,0,194,0,0,214,0,0,237,29,29,255,71,71,255, + 81,82,255,71,71,246,35,29,232,0,0,216,0,0,198,0,0,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,168,0,0,178,0,0,214,0,0,255,0,0,255,71,71,255,127,127,255,71,71,255,0, + 0,214,0,0,178,0,0,168,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,178,0,0,178,0,0,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,168,0,0,194,0, + 0,214,0,0,237,29,29,255,71,71,255,82,82,255,71,71,245,30,24,214,0,0,148,0,38, + 86,0,94,45,1,135,0,0,200,0,0,200,14,0,172,9,0,168,4,0,168,4,0,168,4, + 0,168,0,0,168,0,0,168,2,0,173,12,0,178,178,0,0,178,0,0,177,0,0,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,168,0,0,178,0,0,214,0,0,255,0,0, + 255,71,71,255,127,127,255,71,71,255,0,0,227,0,0,178,0,0,90,0,89,12,0,178,2, + 0,189,12,0,178,12,0,178,12,0,178,12,0,178,12,0,178,12,0,178,12,0,178,12,0, + 178,12,0,178,12,0,178,12,0,178,178,0,0,178,0,0,174,0,0,168,0,0,212,208,200, + 212,208,200,212,208,200,168,0,0,194,0,0,214,0,0,237,29,29,255,71,71,255,82,82,255, + 71,71,237,29,29,214,0,0,203,0,0,168,0,0,70,1,104,0,0,199,0,0,190,12,0, + 178,7,31,190,6,69,205,26,87,211,47,94,214,47,91,215,47,87,215,72,101,217,89,104,214, + 53,53,196,12,0,178,178,0,0,178,0,0,178,0,0,178,0,0,177,0,0,212,208,200,167, + 0,0,178,0,0,214,0,0,255,0,0,255,71,71,255,127,127,255,71,71,255,0,0,214,0, + 0,178,0,0,168,0,0,212,208,200,212,208,200,212,208,200,13,0,172,12,0,178,2,59,201, + 0,131,229,37,163,245,76,178,254,75,179,255,76,178,254,130,210,255,164,216,254,94,110,216,12, + 0,178,176,0,0,178,0,0,199,0,0,214,0,0,199,0,0,168,0,0,192,0,0,214,0, + 0,237,29,29,255,71,71,255,82,82,255,71,71,237,29,29,214,0,0,194,0,0,168,0,0, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,12,0,177,5,47,188,6,74,202,23, + 80,232,42,92,255,39,132,255,42,174,245,93,210,255,130,210,255,76,108,219,12,0,178,173,0, + 0,178,0,0,221,0,0,255,0,0,216,0,0,178,0,0,212,0,0,255,0,0,255,71,71, + 255,127,127,255,71,71,255,0,0,214,0,0,178,0,0,168,0,0,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,13,0,168,12,0,178,6,0,216,0,0, + 255,0,63,245,0,131,229,42,174,245,76,178,254,49,92,218,12,0,178,173,0,0,178,0,0, + 222,36,36,255,64,64,238,26,26,214,0,0,233,26,26,255,71,71,255,82,82,255,71,71,237, + 29,29,214,0,0,194,0,0,168,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,13,0,167,10,0,196,7,0,215,1,21,228,0,63,240,0,60,244, + 0,63,245,39,132,255,75,179,255,49,97,217,12,0,178,173,0,0,178,0,0,216,71,71,255, + 127,127,255,64,64,255,0,0,255,64,64,255,127,127,255,71,71,255,0,0,214,0,0,178,0, + 0,168,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 13,0,168,12,0,178,6,0,216,0,0,255,0,74,245,0,131,229,0,63,240,0,0,255,42, + 92,255,76,178,254,49,100,216,12,0,178,173,0,0,178,0,0,216,70,70,255,132,132,255,106, + 106,255,64,64,255,64,64,255,64,64,233,26,26,212,0,0,192,0,0,166,0,0,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,13,0,168,9,0,196,6, + 0,216,3,30,231,0,74,245,0,85,249,0,74,245,1,21,228,6,0,216,23,80,232,37,163, + 245,27,92,213,12,0,178,173,0,0,178,0,0,216,64,64,255,127,127,255,143,143,255,127,127, + 255,64,64,255,0,0,214,0,0,178,0,0,168,0,0,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,13,0,168,12,0,178,6,0,216,0,0,255,0,74, + 245,0,131,229,0,74,245,0,0,255,7,0,215,12,0,178,6,74,202,0,131,229,5,74,207, + 12,0,178,173,0,0,178,0,0,219,83,83,255,164,164,255,168,168,255,143,143,255,106,106,255, + 64,64,238,26,26,216,0,0,199,0,0,177,0,0,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,13,0,168,9,0,196,6,0,216,3,30,231,0,74,245,0,85,249,0,74,245, + 3,30,231,6,0,216,10,0,196,13,0,168,5,47,188,2,59,201,6,33,191,12,0,178,173, + 0,0,178,0,0,216,92,92,255,178,178,255,164,164,255,127,127,255,132,132,255,127,127,255,64, + 64,255,0,0,214,0,0,178,0,0,168,0,0,212,208,200,212,208,200,212,208,200,13,0,168, + 12,0,178,6,0,216,0,0,255,0,74,245,0,131,229,0,74,245,0,0,255,6,0,216,12, + 0,178,13,0,167,212,208,200,12,0,177,12,0,178,12,0,178,12,0,178,176,0,0,178,0, + 0,196,45,45,214,87,87,216,78,78,214,60,60,214,66,66,214,67,67,219,34,34,219,0,0, + 197,0,0,178,0,0,188,0,0,198,0,0,109,1,63,13,0,168,2,0,205,6,0,216,3, + 30,231,0,74,245,0,85,249,0,74,245,3,30,231,6,0,216,9,0,196,13,0,168,212,208, + 200,212,208,200,212,208,200,13,0,171,12,0,176,12,0,178,178,0,0,178,0,0,178,0,0, + 178,0,0,178,0,0,178,0,0,178,0,0,178,0,0,178,0,0,178,0,0,178,0,0,178, + 0,0,188,0,0,178,0,0,96,0,84,12,0,178,0,0,229,0,0,255,0,74,245,0,131, + 229,0,74,245,0,0,255,6,0,216,12,0,178,13,0,168,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,12,0,177,12,0,178,179,1,1,178,0,0,173,0,0,168,0,0,168, + 0,0,168,0,0,168,0,0,168,0,0,167,0,0,168,0,0,195,1,0,197,0,0,138,1, + 36,101,0,79,53,0,146,6,0,216,0,31,239,0,74,245,0,85,249,0,74,245,3,30,231, + 6,0,216,9,0,196,13,0,168,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,12,0,178,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,13,0,168,12,0,178, + 6,0,216,0,0,255,0,74,245,0,131,229,0,74,245,0,0,255,6,0,216,12,0,178,13, + 0,168,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,0,0,191,0,0,213,0,0,229,0,31,238,0, + 74,245,0,84,248,0,74,245,3,30,231,6,0,216,9,0,196,13,0,168,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,13,0,168,12,0,178,6,0,216,0,0,255,0,74,245,0,131,229,0,74, + 245,0,0,255,6,0,216,12,0,178,13,0,168,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,12,0, + 177,8,0,201,6,0,219,2,35,233,0,74,245,0,84,249,0,74,245,3,30,231,6,0,216, + 9,0,196,13,0,168,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,14,0,168,12,0,178,6,0,216, + 0,0,255,0,74,245,0,131,229,0,74,245,0,0,255,6,0,216,12,0,178,13,0,168,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,12,0,177,8,0,201,6,0,219,2, + 40,234,0,74,245,2,35,233,6,0,216,9,0,196,13,0,168,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,13,0,168,12,0,178,6,0,219,0,0, + 255,6,0,219,12,0,178,13,0,168,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,13,0,168,8,0,202,6,0,218,8,0,202, + 13,0,168,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,12,0,177,12,0,178,12,0,177,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 32, 32, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + if (index == 33) + { + static const unsigned char data[] = + { + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,215,37,37,252,227,227,255,252,252,255,254,254,255,254,254,255,250,250, + 250,210,210,191,12,12,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 248,191,191,251,214,214,247,183,183,246,174,174,246,174,174,246,174,174,246,174,174,247,183,183,252, + 222,222,241,134,134,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,238,109,109,233,85,85,232, + 82,82,232,82,82,232,82,82,232,82,82,232,82,82,232,82,82,232,82,82,232,82,82,236,101, + 101,225,59,59,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,177,7,7,220,46,46,212,31,31,212,31,31,212,31, + 31,214,36,36,214,36,36,214,36,36,214,36,36,212,31,31,212,31,31,210,30,30,221,48,48, + 140,1,1,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,177,7,7,191,12,12,191,12,12,195,15,15,200,18,18,201,20,20, + 201,20,20,201,20,20,200,18,18,200,18,18,195,15,15,191,12,12,194,14,14,155,2,2,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 65,0,0,153,2,2,176,6,6,177,7,7,184,9,9,188,10,10,191,12,12,191,12,12,191, + 12,12,188,10,10,188,10,10,183,8,8,177,7,7,174,5,5,134,0,0,54,0,0,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,85,0,0,120, + 0,0,163,3,3,169,4,4,176,6,6,177,7,7,183,8,8,183,8,8,183,8,8,183,8, + 8,177,7,7,172,5,5,167,4,4,153,2,2,103,0,0,82,0,0,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,107,0,0,122,0,0,145,1, + 1,163,3,3,169,4,4,176,6,6,177,7,7,183,8,8,179,7,7,176,6,6,172,5,5, + 167,4,4,155,2,2,140,1,1,111,0,0,107,0,0,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,131,0,0,145,1,1,157,2,2,169,4,4, + 177,7,7,184,9,9,188,10,10,191,12,12,191,12,12,188,10,10,183,8,8,174,5,5,163, + 3,3,151,1,1,140,1,1,120,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,120,0,0,163,3,3,172,5,5,184,9,9,194,14,14,201, + 20,20,208,26,26,208,26,26,208,26,26,205,24,24,200,18,18,191,12,12,179,7,7,167,4, + 4,157,2,2,103,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,188,10,10,188,10,10,197,16,16,210,30,30,219,44,44,223,53, + 53,223,53,53,223,53,53,221,48,48,214,36,36,205,24,24,191,12,12,179,7,7,177,7,7, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,176,6,6,215,37,37,214,36,36,221,48,48,231,75,75,236,101,101,236,101,101, + 236,101,101,233,85,85,226,62,62,219,44,44,208,26,26,204,22,22,167,4,4,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,215,37,37,238,109,109,238,109,109,241,134,134,245,161,161,246,170,170,246,170,170,243, + 147,147,239,118,118,236,101,101,232,82,82,208,26,26,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,214,36,36,249,201,201,252,227,227,252,227,227,253,232,232,253,232,232,252,227,227,251,214, + 214,243,147,147,208,26,26,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,57,0, + 0,169,4,4,228,68,68,249,194,194,252,222,222,251,216,216,246,174,174,225,59,59,184,9,9, + 70,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,134,0,0,220,46,46,210,30,30, + 177,7,7,174,5,5,183,8,8,183,8,8,177,7,7,188,10,10,220,46,46,215,37,37,111, + 0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,111,0,0,210,30,30,231,75,75,231,75,75,231,75,75,228, + 68,68,225,59,59,221,48,48,225,59,59,231,75,75,228,68,68,231,75,75,205,24,24,89,0, + 0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,70,0,0,176,6,6,212,31,31,208,26,26,212,31,31,212,31,31,214,36,36,215,37, + 37,215,37,37,214,36,36,212,31,31,210,30,30,208,26,26,212,31,31,169,4,4,65,0,0, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,145,1, + 1,184,9,9,195,15,15,197,16,16,200,18,18,201,20,20,201,20,20,201,20,20,201,20,20, + 201,20,20,201,20,20,200,18,18,195,15,15,195,15,15,179,7,7,131,0,0,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,120,0,0,155,2,2,177,7,7, + 184,9,9,188,10,10,191,12,12,191,12,12,191,12,12,191,12,12,188,10,10,191,12,12,191, + 12,12,188,10,10,184,9,9,183,8,8,174,5,5,145,1,1,103,0,0,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,159,2,2,155,2,2,169,4,4,174,5,5,183, + 8,8,184,9,9,184,9,9,184,9,9,184,9,9,184,9,9,184,9,9,184,9,9,183,8, + 8,177,7,7,172,5,5,163,3,3,155,2,2,145,1,1,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,111,0,0,163,3,3,163,3,3,174,5,5,184,9,9,188,10,10,191,12, + 12,195,15,15,200,18,18,201,20,20,200,18,18,195,15,15,195,15,15,191,12,12,184,9,9, + 177,7,7,169,4,4,163,3,3,155,2,2,91,0,0,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,169,4,4,169,4,4,177,7,7,188,10,10,191,12,12,200,18,18,205,24,24,210,30,30, + 212,31,31,214,36,36,214,36,36,212,31,31,208,26,26,204,22,22,195,15,15,188,10,10,184, + 9,9,174,5,5,163,3,3,153,2,2,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,179,7,7, + 177,7,7,188,10,10,195,15,15,205,24,24,212,31,31,215,37,37,221,48,48,221,48,48,223, + 53,53,223,53,53,221,48,48,219,44,44,214,36,36,208,26,26,201,20,20,191,12,12,183,8, + 8,172,5,5,169,4,4,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,103,0,0,191,12,12,184,9,9,195, + 15,15,205,24,24,214,36,36,221,48,48,225,59,59,228,68,68,232,82,82,232,82,82,232,82, + 82,231,75,75,228,68,68,223,53,53,219,44,44,210,30,30,201,20,20,191,12,12,179,7,7, + 177,7,7,89,0,0,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,172,5,5,201,20,20,191,12,12,201,20,20,214,36, + 36,221,48,48,228,68,68,233,85,85,236,101,101,240,122,122,240,122,122,240,122,122,239,118,118, + 236,101,101,231,75,75,223,53,53,219,44,44,208,26,26,195,15,15,191,12,12,197,16,16,140, + 1,1,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,176,6,6,226,62,62,214,36,36,212,31,31,219,44,44,225,59,59, + 233,85,85,239,118,118,243,147,147,246,170,170,246,170,170,246,170,170,245,161,161,242,138,138,236, + 101,101,231,75,75,221,48,48,214,36,36,214,36,36,219,44,44,208,26,26,147,1,1,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,195,15,15,241,134,134,242,138,138,239,118,118,239,118,118,242,138,138,246, + 170,170,246,174,174,249,194,194,249,197,197,249,197,197,248,191,191,246,174,174,243,147,147,240,122, + 122,238,109,109,236,101,101,236,101,101,223,53,53,188,10,10,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,191,12,12,241,134,134,249,201,201,253,232,232,254,246,246,255,250, + 250,255,252,252,255,253,253,255,252,252,255,250,250,254,245,245,253,236,236,251,216,216,248,191,191, + 241,134,134,205,24,24,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,176,6,6,201,20,20,219,44,44, + 221,48,48,221,48,48,221,48,48,210,30,30,197,16,16,167,4,4,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200, + 212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212, + 208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208, + 200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200,212,208,200 + }; + wxImage image( 32, 32, (unsigned char*)data, TRUE ); + image.SetMaskColour( 212, 208, 200); + wxBitmap bitmap( image ); + return bitmap; + } + return wxNullBitmap; +} + + +// End of generated file diff --git a/src/muuli_wdr.h b/src/muuli_wdr.h new file mode 100644 index 00000000..b2ed732f --- /dev/null +++ b/src/muuli_wdr.h @@ -0,0 +1,560 @@ +//------------------------------------------------------------------------------ +// Header generated by wxDesigner from file: muuli.wdr +// Do not modify this file, all changes will be lost! +//------------------------------------------------------------------------------ + +#ifndef __WDR_muuli_H__ +#define __WDR_muuli_H__ + +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) + #pragma interface "muuli_wdr.h" +#endif + +// Include wxWidgets' headers + +#ifndef WX_PRECOMP + #include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Declare window functions + +extern wxSizer *s_dlgcnt; +extern wxSizer *contentSizer; +extern wxSizer *s_fed2klh; +const int ID_TEXT = 10000; +const int ID_TEXTCTRL = 10001; +const int ID_BUTTON_FAST = 10002; +const int IDC_SHOWSTATUSTEXT = 10003; +const int ID_LINE = 10004; +const int ID_STATICBITMAP = 10005; +wxSizer *muleDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int ID_SRV_SPLITTER = 10006; +wxSizer *serverListDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +extern wxSizer *s_searchdlgsizer; +extern wxSizer *s_searchsizer; +const int IDC_SEARCHNAME = 10007; +const int ID_SEARCHTYPE = 10008; +const int IDC_EXTENDEDSEARCHCHECK = 10009; +const int IDC_FILTERCHECK = 10010; +extern wxSizer *s_extendedsizer; +const int IDC_TypeSearch = 10011; +const int ID_AUTOCATASSIGN = 10012; +const int IDC_EDITSEARCHEXTENSION = 10013; +const int IDC_SPINSEARCHMIN = 10014; +const int IDC_SEARCHMINSIZE = 10015; +const int IDC_SPINSEARCHMAX = 10016; +const int IDC_SEARCHMAXSIZE = 10017; +const int IDC_SPINSEARCHAVAIBILITY = 10018; +extern wxSizer *s_filtersizer; +const int ID_FILTER_TEXT = 10019; +const int ID_FILTER = 10020; +const int ID_FILTER_INVERT = 10021; +const int ID_FILTER_KNOWN = 10022; +const int IDC_STARTS = 10023; +const int IDC_SEARCHMORE = 10024; +const int IDC_CANCELS = 10025; +const int IDC_SDOWNLOAD = 10026; +const int IDC_SEARCH_RESET = 10027; +const int IDC_CLEAR_RESULTS = 10028; +const int ID_NOTEBOOK = 10029; +const int ID_SEARCHPROGRESS = 10030; +wxSizer *searchDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +extern wxSizer *transfer_top_boxsizer; +const int ID_BTNCLRCOMPL = 10031; +const int ID_CATEGORIES = 10032; +const int ID_DLOADLIST = 10033; +wxSizer *transferTopPane( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +extern wxSizer *queueSizer; +extern wxSizer *s_clientlistHeader; +const int ID_CLIENTTOGGLE = 10034; +const int ID_BTNSWITCHUP = 10035; +const int ID_CLIENTCOUNT = 10036; +const int ID_CLIENTLIST = 10037; +wxSizer *transferBottomPane( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int ID_FRIENDLIST = 10038; +const int IDC_CHATSELECTOR = 10039; +const int IDC_CMESSAGE = 10040; +const int IDC_CSEND = 10041; +const int IDC_CCLOSE = 10042; +wxSizer *messagePage( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +extern wxSizer *IDC_FD_X0; +const int IDC_FD_X1 = 10043; +const int IDC_FNAME = 10044; +const int IDC_FD_X2 = 10045; +const int IDC_METFILE = 10046; +const int IDC_FD_X3 = 10047; +const int IDC_FHASH = 10048; +const int IDC_FD_X4 = 10049; +const int IDC_FSIZE = 10050; +const int IDC_FD_X5 = 10051; +const int IDC_PFSTATUS = 10052; +const int IDC_FD_X15 = 10053; +const int IDC_LASTSEENCOMPL = 10054; +extern wxSizer *IDC_FD_X6; +const int IDC_FD_X7 = 10055; +const int IDC_SOURCECOUNT = 10056; +const int IDC_FD_X10 = 10057; +const int IDC_SOURCECOUNT2 = 10058; +const int IDC_FD_X9 = 10059; +const int IDC_PARTCOUNT = 10060; +const int IDC_FD_X11 = 10061; +const int IDC_PARTAVAILABLE = 10062; +const int IDC_FD_X13 = 10063; +const int IDC_DATARATE = 10064; +const int IDC_DLACTIVETIME = 10065; +const int IDC_FD_X14 = 10066; +const int IDC_TRANSFERRED = 10067; +const int IDC_FD_X12 = 10068; +const int IDC_COMPLSIZE = 10069; +const int IDC_PROCCOMPL = 10070; +extern wxSizer *IDC_FD_ICH; +const int IDC_FD_LSTATS1 = 10071; +const int IDC_FD_STATS1 = 10072; +const int IDC_FD_LSTATS2 = 10073; +const int IDC_FD_STATS2 = 10074; +const int IDC_FD_LSTATS3 = 10075; +const int IDC_FD_STATS3 = 10076; +const int IDC_LISTCTRLFILENAMES = 10077; +const int IDC_TAKEOVER = 10078; +const int IDC_CMTBT = 10079; +const int IDC_BUTTONSTRIP = 10080; +const int IDC_FILENAME = 10081; +const int IDC_APPLY = 10082; +const int IDC_APPLY_AND_CLOSE = 10083; +const int ID_CLOSEWNDFD = 5100; +wxSizer *fileDetails( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int IDC_CMT_TEXT = 10084; +const int IDC_FC_CLEAR = 10085; +const int IDC_RATELIST = 10086; +const int IDCOK = 10087; +const int IDCCANCEL = 10088; +wxSizer *commentDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int IDC_LST = 10089; +const int IDC_CMSTATUS = 10090; +const int IDCREF = 10091; +wxSizer *commentLstDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int ID_ANIMATE = 10092; +const int ID_HTTPDOWNLOADPROGRESS = 10093; +const int IDC_DOWNLOADSIZE = 10094; +const int ID_HTTPCANCEL = 5101; +wxSizer *downloadDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int ID_IPADDRESS = 10095; +const int ID_IPORT = 10096; +const int ID_USERNAME = 10097; +const int ID_USERHASH = 10098; +const int ID_ADDFRIEND = 10099; +const int ID_CLOSEDLG = 10100; +wxSizer *addFriendDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int ID_BTNRELSHARED = 10101; +const int ID_SHFILELIST = 10102; +const int IDC_SREQUESTED = 10103; +const int ID_GAUGE = 10104; +const int IDC_SREQUESTED2 = 10105; +const int IDC_SACCEPTED = 10106; +const int IDC_SACCEPTED2 = 10107; +const int IDC_STRANSFERRED = 10108; +const int IDC_STRANSFERRED2 = 10109; +wxSizer *sharedfilesDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +extern wxSizer *testSizer; +const int ID_DLOADSCOPE = 10110; +const int IDC_C0 = 10111; +const int IDC_C0_3 = 10112; +const int IDC_C0_2 = 10113; +const int ID_ULOADSCOPE = 10114; +const int IDC_C1 = 10115; +const int IDC_C1_3 = 10116; +const int IDC_C1_2 = 10117; +const int ID_OTHERS = 10118; +const int IDC_S3 = 10119; +const int IDC_S0 = 10120; +const int ID_ACTIVEC = 10121; +const int IDC_S1 = 10122; +const int ID_TREECTRL = 10123; +wxSizer *statsDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int ID_DNAME = 10124; +const int ID_DHASH = 10125; +const int ID_DSOFT = 10126; +const int ID_DVERSION = 10127; +const int ID_DIP = 10128; +const int ID_DID = 10129; +const int ID_DSIP = 10130; +const int ID_DSNAME = 10131; +const int ID_DDOWNLOADING = 10132; +const int ID_DAVDR = 10133; +const int ID_DAVUR = 10134; +const int ID_DDOWN = 10135; +const int ID_DDUP = 10136; +const int ID_DDOWNTOTAL = 10137; +const int ID_DUPTOTAL = 10138; +const int ID_DRATIO = 10139; +const int IDC_CDIDENT = 10140; +const int ID_DRATING = 10141; +const int ID_DSCORE = 10142; +const int ID_CLOSEWND = 10143; +wxSizer *clientDetails( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int IDC_NICK = 10144; +const int IDC_LANGUAGE = 10145; +extern wxSizer *IDC_MISC_OPTIONS; +const int IDC_NEWVERSION = 10146; +const int IDC_STARTMIN = 10147; +const int IDC_EXIT = 10148; +const int IDC_ENABLETRAYICON = 10149; +const int IDC_MINTRAY = 10150; +const int IDC_TOOLTIPDELAY_LBL = 10151; +const int IDC_TOOLTIPDELAY = 10152; +const int IDC_BROWSER = 10153; +const int ID_CUSTOMBROWSETEXT = 10154; +const int IDC_BROWSERSELF = 10155; +const int IDC_SELBROWSER = 10156; +const int IDC_BROWSERTABS = 10157; +wxSizer *PreferencesGeneralTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int IDC_DLIMIT_LBL = 10158; +const int IDC_MAXDOWN = 10159; +const int IDC_KBS1 = 10160; +const int IDC_ULIMIT_LBL = 10161; +const int IDC_MAXUP = 10162; +const int IDC_KBS4 = 10163; +const int IDC_SLOTALLOC = 10164; +const int IDC_DCAP_LBL = 10165; +const int IDC_DOWNLOAD_CAP = 10166; +const int IDC_KBS2 = 10167; +const int IDC_UCAP_LBL = 10168; +const int IDC_UPLOAD_CAP = 10169; +const int IDC_KBS3 = 10170; +const int IDC_PORT = 10171; +const int IDC_UDPPORT = 10172; +const int IDC_UDPDISABLE = 10173; +const int IDC_ADDRESS = 10174; +const int ID_TEXT_CLIENT_UDP_PORT = 10175; +const int IDC_MAXSRCHARD_LBL = 10176; +const int IDC_MAXSOURCEPERFILE = 10177; +const int IDC_MAXCONLABEL = 10178; +const int IDC_MAXCON = 10179; +const int IDC_NETWORKED2K = 10180; +const int IDC_NETWORKKAD = 10181; +const int IDC_UPNP_ENABLED = 10182; +const int IDC_UPNPTCPPORT = 10183; +const int IDC_AUTOCONNECT = 10184; +const int IDC_RECONN = 10185; +const int IDC_SHOWOVERHEAD = 10186; +wxSizer *PreferencesConnectionTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int IDC_REMOVEDEAD = 10187; +const int IDC_SERVERRETRIES = 10188; +const int IDC_RETRIES_LBL = 10189; +const int IDC_AUTOSERVER = 10190; +const int IDC_EDITADR = 10191; +const int IDC_UPDATESERVERCONNECT = 10192; +const int IDC_UPDATESERVERCLIENT = 10193; +const int IDC_SCORE = 10194; +const int IDC_SMARTIDCHECK = 10195; +const int IDC_SAFESERVERCONNECT = 10196; +const int IDC_AUTOCONNECTSTATICONLY = 10197; +const int IDC_MANUALSERVERHIGHPRIO = 10198; +wxSizer *PreferencesServerTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int IDC_ICH = 10199; +const int IDC_AICHTRUST = 10200; +const int IDC_ADDNEWFILESPAUSED = 10201; +const int IDC_DAP = 10202; +const int IDC_PREVIEWPRIO = 10203; +const int IDC_UAP = 10204; +const int IDC_FULLCHUNKTRANS = 10205; +const int IDC_STARTNEXTFILE = 10206; +const int IDC_STARTNEXTFILE_SAME = 10207; +const int IDC_SRCSEEDS = 10208; +const int IDC_CHECKDISKSPACE = 10209; +const int ID_MINDISKTEXT = 10210; +const int IDC_MINDISKSPACE = 10211; +wxSizer *PreferencesFilesTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int IDC_INCFILES = 10212; +const int IDC_SELINCDIR = 10213; +const int IDC_TEMPFILES = 10214; +const int IDC_SELTEMPDIR = 10215; +const int IDC_SHARESELECTOR = 10216; +const int IDC_SHAREHIDDENFILES = 10217; +const int IDC_VIDEOPLAYER = 10218; +const int IDC_BROWSEV = 10219; +const int IDC_VIDEOBACKUP = 10220; +wxSizer *PreferencesDirectoriesTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int IDC_SLIDERINFO = 10221; +const int IDC_SLIDER = 10222; +const int IDC_SLIDERINFO3 = 10223; +const int IDC_SLIDER3 = 10224; +const int IDC_SLIDERINFO4 = 10225; +const int IDC_SLIDER4 = 10226; +const int IDC_PREFCOLORS = 10227; +const int IDC_COLORSELECTOR = 10228; +const int IDC_COLOR_BUTTON = 10229; +const int IDC_SLIDERINFO2 = 10230; +const int IDC_SLIDER2 = 10231; +const int IDC_CLIENTVERSIONS = 10232; +wxSizer *PreferencesStatisticsTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int IDC_CB_TBN_USESOUND = 10233; +const int IDC_EDIT_TBN_WAVFILE = 10234; +const int IDC_BTN_BROWSE_WAV = 10235; +const int IDC_CB_TBN_ONLOG = 10236; +const int IDC_CB_TBN_ONCHAT = 10237; +const int IDC_CB_TBN_POP_ALWAYS = 10238; +const int IDC_CB_TBN_ONDOWNLOAD = 10239; +const int IDC_CB_TBN_ONNEWVERSION = 10240; +const int IDC_CB_TBN_IMPORTATNT = 10241; +const int IDC_SENDMAIL = 10242; +const int IDC_SMTP = 10243; +const int IDC_EMAIL = 10244; +wxSizer *PreferencesNotifyTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int IDC_WARNING = 10245; +const int IDC_STATIC = 10246; +const int IDC_MAXCON5SECLABEL = 10247; +const int IDC_MAXCON5SEC = 10248; +const int IDC_FILEBUFFERSIZE_STATIC = 10249; +const int IDC_FILEBUFFERSIZE = 10250; +const int IDC_QUEUESIZE_STATIC = 10251; +const int IDC_QUEUESIZE = 10252; +const int IDC_SERVERKEEPALIVE_LABEL = 10253; +const int IDC_SERVERKEEPALIVE = 10254; +wxSizer *PreferencesaMuleTweaksTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int IDC_PERCENT = 10255; +const int IDC_PROGBAR = 10256; +const int IDC_3DDEP = 10257; +const int IDC_3DDEPTH = 10258; +const int IDC_FLAT = 10259; +const int IDC_ROUND = 10260; +const int IDC_USESKINFILES = 10261; +const int IDC_SKIN = 10262; +const int IDC_AUTOSORT = 10263; +const int IDC_FED2KLH = 10264; +const int IDC_EXTCATINFO = 10265; +const int IDC_SHOWRATEONTITLE = 10266; +const int IDC_VERTTOOLBAR = 10267; +const int IDC_SHOWPARTFILENUMBER = 10268; +wxSizer *PreferencesGuiTweaksTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int IDC_ENABLE_WEB = 10269; +const int IDC_WEB_PORT = 10270; +const int IDC_UPNP_WEBSERVER_ENABLED = 10271; +const int IDC_WEBUPNPTCPPORT = 10272; +const int IDC_WEB_REFRESH_TIMEOUT = 10273; +const int IDC_WEB_GZIP = 10274; +const int IDC_ENABLE_WEB_LOW = 10275; +const int IDC_WEB_PASSWD = 10276; +const int IDC_WEB_PASSWD_LOW = 10277; +const int IDC_WEBTEMPLATE = 10278; +const int IDC_EXT_CONN_ACCEPT = 10279; +const int IDC_EXT_CONN_PASSWD = 10280; +const int IDC_EXT_CONN_IP = 10281; +const int IDC_EXT_CONN_TCP_PORT = 10282; +const int IDC_UPNP_EC_ENABLED = 10283; +wxSizer *PreferencesRemoteControlsTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +extern wxSizer *prefs_main_sizer; +extern wxSizer *prefs_sizer; +const int ID_PREFSLISTCTRL = 10284; +const int ID_PREFS_OK_TOP = 10285; +const int ID_PREFS_CANCEL_TOP = 10286; +wxSizer *preferencesDlgTop( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int IDC_STATIC_TITLE = 10287; +const int IDC_TITLE = 10288; +const int IDC_STATIC_COMMENT = 10289; +const int IDC_COMMENT = 10290; +const int IDC_STATIC_INCOMING = 10291; +const int IDC_INCOMING = 10292; +const int IDC_BROWSE = 10293; +const int IDC_STATIC_PRIO = 10294; +const int IDC_PRIOCOMBO = 10295; +const int IDC_STATIC_COLOR = 10296; +const int ID_BOX_CATCOLOR = 10297; +const int IDC_CATCOLOR = 10298; +wxSizer *CategoriesEditWindow( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int ID_SPLATTER = 10299; +wxSizer *transferDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int ID_SERVERINFO = 10300; +const int ID_BTN_RESET_SERVER = 10301; +wxSizer *ServerInfoLog( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int ID_LOGVIEW = 10302; +const int ID_BTN_RESET = 10303; +wxSizer *aMuleLog( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int ID_UPDATELIST = 10304; +const int IDC_SERVERLISTURL = 10305; +const int IDC_SERVERNAME = 10306; +const int IDC_IPADDRESS = 10307; +const int IDC_SPORT = 10308; +const int ID_ADDTOLIST = 10309; +const int IDC_ED2KDISCONNECT = 10310; +const int ID_SERVERLIST = 10311; +wxSizer *serverListDlgUp( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int ID_SRVLOG_NOTEBOOK = 10312; +wxSizer *serverListDlgDown( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int ID_LOCALETEXT = 10313; +const int ID_OK = 10314; +const int ID_LOCALENEVERAGAIN = 10315; +wxSizer *LocaleWarning( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +extern wxSizer *kadSizer; +const int ID_UPDATEKADLIST = 10316; +const int IDC_NODESLISTURL = 10317; +const int ID_KADSCOPE = 10318; +const int ID_NODE_IP1 = 10319; +const int ID_NODE_IP2 = 10320; +const int ID_NODE_IP3 = 10321; +const int ID_NODE_IP4 = 10322; +const int ID_NODE_PORT = 10323; +const int ID_NODECONNECT = 10324; +const int ID_KNOWNNODECONNECT = 10325; +const int ID_KADDISCONNECT = 10326; +wxSizer *KadDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int ID_STATICTEXT = 10327; +const int ID_ED2KINFO = 10328; +wxSizer *ED2K_Info( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int IDC_SUPPORT_PO = 10329; +const int IDC_ENABLE_PO_OUTGOING = 10330; +const int IDC_ENFORCE_PO_INCOMING = 10331; +const int IDC_SEESHARES = 10332; +const int IDC_IPFCLIENTS = 10333; +const int IDC_IPFSERVERS = 10334; +const int IDC_IPFRELOAD = 10335; +const int IDC_IPFILTERURL = 10336; +const int IDC_IPFILTERUPDATE = 10337; +const int IDC_AUTOIPFILTER = 10338; +const int ID_IPFILTERLEVEL = 10339; +const int IDC_FILTERLAN = 10340; +const int IDC_PARANOID = 10341; +const int IDC_IPFILTERSYS = 10342; +const int IDC_SECIDENT = 10343; +wxSizer *PreferencesSecurityTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int IDC_ONLINESIG = 10344; +const int IDC_OSUPDATE = 10345; +const int IDC_OSDIR = 10346; +const int IDC_SELOSDIR = 10347; +wxSizer *PreferencesOnlineSigTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int IDC_MSGFILTER = 10348; +const int IDC_MSGFILTER_ALL = 10349; +const int IDC_MSGFILTER_NONFRIENDS = 10350; +const int IDC_MSGFILTER_NONSECURE = 10351; +const int IDC_MSGFILTER_WORD = 10352; +const int IDC_MSGWORD = 10353; +const int IDC_FILTERCOMMENTS = 10354; +const int IDC_COMMENTWORD = 10355; +wxSizer *PreferencesMessagesTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int ID_PROXY_ENABLE_PROXY = 10356; +const int ID_PROXY_TYPE = 10357; +const int ID_PROXY_NAME = 10358; +const int ID_PROXY_PORT = 10359; +const int ID_PROXY_ENABLE_PASSWORD = 10360; +const int ID_PROXY_USER = 10361; +const int ID_PROXY_PASSWORD = 10362; +const int ID_PROXY_AUTO_SERVER_CONNECT_WITHOUT_PROXY = 10363; +wxSizer *PreferencesProxyTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int ID_REMOTE_HOST = 10364; +const int ID_REMOTE_PORT = 10365; +const int ID_EC_LOGIN = 10366; +const int ID_EC_PASSWD = 10367; +const int ID_EC_SAVE = 10368; +wxSizer *CoreConnect( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int ID_VERBOSEDEBUG = 10369; +const int ID_DEBUGCATS = 10370; +wxSizer *PreferencesDebug( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +extern wxSizer *IDC_CURJOB; +const int IDC_CONV_PB_LABEL = 10371; +const int IDC_CONV_PROZENT = 10372; +const int IDC_CONV_PB_CURRENT = 10373; +const int IDC_JOBLIST = 10374; +const int IDC_ADDITEM = 10375; +const int IDC_RETRY = 10376; +const int IDC_CONVREMOVE = 10377; +wxSizer *convertDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +const int ID_STATICETXT = 10378; +const int ID_KADINFO = 10379; +wxSizer *Kad_Info( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +extern wxSizer *netSizer; +const int ID_NETNOTEBOOK = 10380; +wxSizer *NetDialog( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +extern wxSizer *IDC_PREFS_EVENTS_PAGE; +const int IDC_EVENTLIST = 10381; +wxSizer *PreferencesEventsTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); + +// Declare menubar functions + +// Declare toolbar functions + +const int ID_BUTTONCONNECT = 10382; +const int ID_BUTTONNETWORKS = 10383; +const int ID_BUTTONSEARCH = 10384; +const int ID_BUTTONTRANSFER = 10385; +const int ID_BUTTONSHARED = 10386; +const int ID_BUTTONMESSAGES = 10387; +const int ID_BUTTONSTATISTICS = 10388; +const int ID_BUTTONNEWPREFERENCES = 10389; +const int ID_BUTTONIMPORT = 10390; +const int ID_ABOUT = 10391; +void muleToolbar( wxToolBar *parent ); + +// Declare bitmap functions + +wxBitmap clientImages( size_t index ); + +wxBitmap dlStatusImages( size_t index ); + +wxBitmap connImages( size_t index ); + +wxBitmap moreImages( size_t index ); + +wxBitmap amuleSpecial( size_t index ); + +wxBitmap connButImg( size_t index ); + +wxBitmap amuleDlgImages( size_t index ); + +#endif + +// End of generated file diff --git a/src/pixmaps/Makefile.am b/src/pixmaps/Makefile.am new file mode 100644 index 00000000..1c0f1064 --- /dev/null +++ b/src/pixmaps/Makefile.am @@ -0,0 +1,23 @@ + +SUBDIRS = + +if ENABLE_IP2COUNTRY +OPT_IP2COUNTRY = flags_xpm + +SUBDIRS += $(OPT_IP2COUNTRY) +endif + +EXTRA_DIST = chat.ico.xpm \ + mule_TrayIcon.ico.xpm \ + mule_Tr_grey.ico.xpm \ + mule_Tr_yellow.ico.xpm \ + mule_TrayIcon_big.ico.xpm \ + mule_Tr_grey_big.ico.xpm \ + mule_Tr_yellow_big.ico.xpm \ + sort_dnx2.xpm \ + sort_dn.xpm \ + sort_upx2.xpm \ + sort_up.xpm + + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/pixmaps/Makefile.in b/src/pixmaps/Makefile.in new file mode 100644 index 00000000..f737eae3 --- /dev/null +++ b/src/pixmaps/Makefile.in @@ -0,0 +1,616 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@ENABLE_IP2COUNTRY_TRUE@am__append_1 = $(OPT_IP2COUNTRY) +subdir = src/pixmaps +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = flags_xpm +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +SUBDIRS = $(am__append_1) +@ENABLE_IP2COUNTRY_TRUE@OPT_IP2COUNTRY = flags_xpm +EXTRA_DIST = chat.ico.xpm \ + mule_TrayIcon.ico.xpm \ + mule_Tr_grey.ico.xpm \ + mule_Tr_yellow.ico.xpm \ + mule_TrayIcon_big.ico.xpm \ + mule_Tr_grey_big.ico.xpm \ + mule_Tr_yellow_big.ico.xpm \ + sort_dnx2.xpm \ + sort_dn.xpm \ + sort_upx2.xpm \ + sort_up.xpm + +MAINTAINERCLEANFILES = Makefile.in +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/pixmaps/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/pixmaps/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-recursive ctags ctags-recursive \ + distclean distclean-generic distclean-recursive distclean-tags \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/pixmaps/chat.ico.xpm b/src/pixmaps/chat.ico.xpm new file mode 100644 index 00000000..0aa0db02 --- /dev/null +++ b/src/pixmaps/chat.ico.xpm @@ -0,0 +1,78 @@ +/* XPM */ +static const char * chat_ico_xpm[] = { +"16 16 59 1", +" c None", +". c #6B5600", +"+ c #9C8A2E", +"@ c #D9CB71", +"# c #FEF6B3", +"$ c #A89846", +"% c #FFF8BC", +"& c #FFFFFF", +"* c #FFFDEE", +"= c #FEFBDD", +"- c #FEF289", +"; c #A8983D", +"> c #5B4800", +", c #ECDF7A", +"' c #073E5C", +") c #D5CB84", +"! c #AD9F4C", +"~ c #09547D", +"{ c #0E84C4", +"] c #147BB3", +"^ c #EBD96B", +"/ c #1095DD", +"( c #72B3D7", +"_ c #3287B5", +": c #DDCB60", +"< c #D1BF57", +"[ c #1BA4EF", +"} c #A2DAF9", +"| c #59BDF3", +"1 c #3B9DD4", +"2 c #0C70A7", +"3 c #0A5A85", +"4 c #BDAE54", +"5 c #074161", +"6 c #0F89CC", +"7 c #43B4F2", +"8 c #21A7F0", +"9 c #67540A", +"0 c #04273A", +"a c #06344D", +"b c #0A5D8A", +"c c #0D7EBB", +"d c #095076", +"e c #063751", +"f c #063A56", +"g c #0C74AC", +"h c #094E74", +"i c #0C6EA3", +"j c #4EB9F3", +"k c #68C3F4", +"l c #07405F", +"m c #BAE3FA", +"n c #3FB3F2", +"o c #0D79B4", +"p c #14A2EF", +"q c #E7F5FD", +"r c #71C6F5", +"s c #28A9F0", +"t c #ACDDF9", +" ....... ", +" .+@###@+. ", +" .$%&&**=-;>", +" >-%&&**=#,>", +" '>)-%**=#-!>", +" ~{]>!----^!> ", +" ~/&(_>>:^<>> ", +" ~[}|123>4> ", +" 56778/3490 ", +" ab6//cd0efa ", +" ~fa~gg3ah3~a ", +"~ib'aaaahi~3a ", +"jk{gbbbgcil3a ", +"mno/n[/p/ifda ", +"k[b8qr7s/iada ", +"j/'8tr7s/iaaa "}; diff --git a/src/pixmaps/flags_xpm/CountryFlags.h b/src/pixmaps/flags_xpm/CountryFlags.h new file mode 100644 index 00000000..a4beff0e --- /dev/null +++ b/src/pixmaps/flags_xpm/CountryFlags.h @@ -0,0 +1,519 @@ + + +#ifndef COUNTRY_FLAGS_H +#define COUNTRY_FLAGS_H + + +#include "ad.xpm" +#include "ae.xpm" +#include "af.xpm" +#include "ag.xpm" +#include "ai.xpm" +#include "al.xpm" +#include "am.xpm" +#include "an.xpm" +#include "ao.xpm" +#include "ar.xpm" +#include "as.xpm" +#include "at.xpm" +#include "au.xpm" +#include "aw.xpm" +#include "ax.xpm" +#include "az.xpm" +#include "ba.xpm" +#include "bb.xpm" +#include "bd.xpm" +#include "be.xpm" +#include "bf.xpm" +#include "bg.xpm" +#include "bh.xpm" +#include "bi.xpm" +#include "bj.xpm" +#include "bm.xpm" +#include "bn.xpm" +#include "bo.xpm" +#include "br.xpm" +#include "bs.xpm" +#include "bt.xpm" +#include "bv.xpm" +#include "bw.xpm" +#include "by.xpm" +#include "bz.xpm" +#include "ca.xpm" +#include "catalonia.xpm" +#include "cc.xpm" +#include "cd.xpm" +#include "cf.xpm" +#include "cg.xpm" +#include "ch.xpm" +#include "ci.xpm" +#include "ck.xpm" +#include "cl.xpm" +#include "cm.xpm" +#include "cn.xpm" +#include "co.xpm" +#include "cr.xpm" +#include "cs.xpm" +#include "cu.xpm" +#include "cv.xpm" +#include "cx.xpm" +#include "cy.xpm" +#include "cz.xpm" +#include "de.xpm" +#include "dj.xpm" +#include "dk.xpm" +#include "dm.xpm" +#include "do.xpm" +#include "dz.xpm" +#include "ec.xpm" +#include "ee.xpm" +#include "eg.xpm" +#include "eh.xpm" +#include "england.xpm" +#include "er.xpm" +#include "es.xpm" +#include "et.xpm" +#include "europeanunion.xpm" +#include "fam.xpm" +#include "fi.xpm" +#include "fj.xpm" +#include "fk.xpm" +#include "fm.xpm" +#include "fo.xpm" +#include "fr.xpm" +#include "ga.xpm" +#include "gb.xpm" +#include "gd.xpm" +#include "ge.xpm" +#include "gf.xpm" +#include "gh.xpm" +#include "gi.xpm" +#include "gl.xpm" +#include "gm.xpm" +#include "gn.xpm" +#include "gp.xpm" +#include "gq.xpm" +#include "gr.xpm" +#include "gs.xpm" +#include "gt.xpm" +#include "gu.xpm" +#include "gw.xpm" +#include "gy.xpm" +#include "hk.xpm" +#include "hm.xpm" +#include "hn.xpm" +#include "hr.xpm" +#include "ht.xpm" +#include "hu.xpm" +#include "id.xpm" +#include "ie.xpm" +#include "il.xpm" +#include "in.xpm" +#include "io.xpm" +#include "iq.xpm" +#include "ir.xpm" +#include "is.xpm" +#include "it.xpm" +#include "jm.xpm" +#include "jo.xpm" +#include "jp.xpm" +#include "ke.xpm" +#include "kg.xpm" +#include "kh.xpm" +#include "ki.xpm" +#include "km.xpm" +#include "kn.xpm" +#include "kp.xpm" +#include "kr.xpm" +#include "kw.xpm" +#include "ky.xpm" +#include "kz.xpm" +#include "la.xpm" +#include "lb.xpm" +#include "lc.xpm" +#include "li.xpm" +#include "lk.xpm" +#include "lr.xpm" +#include "ls.xpm" +#include "lt.xpm" +#include "lu.xpm" +#include "lv.xpm" +#include "ly.xpm" +#include "ma.xpm" +#include "mc.xpm" +#include "md.xpm" +#include "me.xpm" +#include "mg.xpm" +#include "mh.xpm" +#include "mk.xpm" +#include "ml.xpm" +#include "mm.xpm" +#include "mn.xpm" +#include "mo.xpm" +#include "mp.xpm" +#include "mq.xpm" +#include "mr.xpm" +#include "ms.xpm" +#include "mt.xpm" +#include "mu.xpm" +#include "mv.xpm" +#include "mw.xpm" +#include "mx.xpm" +#include "my.xpm" +#include "mz.xpm" +#include "na.xpm" +#include "nc.xpm" +#include "ne.xpm" +#include "nf.xpm" +#include "ng.xpm" +#include "ni.xpm" +#include "nl.xpm" +#include "no.xpm" +#include "np.xpm" +#include "nr.xpm" +#include "nu.xpm" +#include "nz.xpm" +#include "om.xpm" +#include "pa.xpm" +#include "pe.xpm" +#include "pf.xpm" +#include "pg.xpm" +#include "ph.xpm" +#include "pk.xpm" +#include "pl.xpm" +#include "pm.xpm" +#include "pn.xpm" +#include "pr.xpm" +#include "ps.xpm" +#include "pt.xpm" +#include "pw.xpm" +#include "py.xpm" +#include "qa.xpm" +#include "re.xpm" +#include "ro.xpm" +#include "rs.xpm" +#include "ru.xpm" +#include "rw.xpm" +#include "sa.xpm" +#include "sb.xpm" +#include "sc.xpm" +#include "scotland.xpm" +#include "sd.xpm" +#include "se.xpm" +#include "sg.xpm" +#include "sh.xpm" +#include "si.xpm" +#include "sj.xpm" +#include "sk.xpm" +#include "sl.xpm" +#include "sm.xpm" +#include "sn.xpm" +#include "so.xpm" +#include "sr.xpm" +#include "st.xpm" +#include "sv.xpm" +#include "sy.xpm" +#include "sz.xpm" +#include "tc.xpm" +#include "td.xpm" +#include "tf.xpm" +#include "tg.xpm" +#include "th.xpm" +#include "tj.xpm" +#include "tk.xpm" +#include "tl.xpm" +#include "tm.xpm" +#include "tn.xpm" +#include "to.xpm" +#include "tr.xpm" +#include "tt.xpm" +#include "tv.xpm" +#include "tw.xpm" +#include "tz.xpm" +#include "ua.xpm" +#include "ug.xpm" +#include "um.xpm" +#include "unknown.xpm" +#include "us.xpm" +#include "uy.xpm" +#include "uz.xpm" +#include "va.xpm" +#include "vc.xpm" +#include "ve.xpm" +#include "vg.xpm" +#include "vi.xpm" +#include "vn.xpm" +#include "vu.xpm" +#include "wales.xpm" +#include "wf.xpm" +#include "ws.xpm" +#include "ye.xpm" +#include "yt.xpm" +#include "za.xpm" +#include "zm.xpm" +#include "zw.xpm" + + +struct FlagXPMCode +{ + const char **xpm; + const char *code; +}; + + +static struct FlagXPMCode flagXPMCodeVector[] = { + {ad, "ad"}, + {ae, "ae"}, + {af, "af"}, + {ag, "ag"}, + {ai, "ai"}, + {al, "al"}, + {am, "am"}, + {an, "an"}, + {ao, "ao"}, + {ar, "ar"}, + {as, "as"}, + {at, "at"}, + {au, "au"}, + {aw, "aw"}, + {ax, "ax"}, + {az, "az"}, + {ba, "ba"}, + {bb, "bb"}, + {bd, "bd"}, + {be, "be"}, + {bf, "bf"}, + {bg, "bg"}, + {bh, "bh"}, + {bi, "bi"}, + {bj, "bj"}, + {bm, "bm"}, + {bn, "bn"}, + {bo, "bo"}, + {br, "br"}, + {bs, "bs"}, + {bt, "bt"}, + {bv, "bv"}, + {bw, "bw"}, + {by, "by"}, + {bz, "bz"}, + {ca, "ca"}, + {catalonia, "catalonia"}, + {cc, "cc"}, + {cd, "cd"}, + {cf, "cf"}, + {cg, "cg"}, + {ch, "ch"}, + {ci, "ci"}, + {ck, "ck"}, + {cl, "cl"}, + {cm, "cm"}, + {cn, "cn"}, + {co, "co"}, + {cr, "cr"}, + {cs, "cs"}, + {cu, "cu"}, + {cv, "cv"}, + {cx, "cx"}, + {cy, "cy"}, + {cz, "cz"}, + {de, "de"}, + {dj, "dj"}, + {dk, "dk"}, + {dm, "dm"}, + {do_, "do"}, + {dz, "dz"}, + {ec, "ec"}, + {ee, "ee"}, + {eg, "eg"}, + {eh, "eh"}, + {england, "england"}, + {er, "er"}, + {es, "es"}, + {et, "et"}, + {europeanunion, "europeanunion"}, + {fam, "fam"}, + {fi, "fi"}, + {fj, "fj"}, + {fk, "fk"}, + {fm, "fm"}, + {fo, "fo"}, + {fr, "fr"}, + {ga, "ga"}, + {gb, "gb"}, + {gd, "gd"}, + {ge, "ge"}, + {gf, "gf"}, + {gh, "gh"}, + {gi, "gi"}, + {gl, "gl"}, + {gm, "gm"}, + {gn, "gn"}, + {gp, "gp"}, + {gq, "gq"}, + {gr, "gr"}, + {gs, "gs"}, + {gt, "gt"}, + {gu, "gu"}, + {gw, "gw"}, + {gy, "gy"}, + {hk, "hk"}, + {hm, "hm"}, + {hn, "hn"}, + {hr, "hr"}, + {ht_, "ht"}, + {hu, "hu"}, + {id, "id"}, + {ie, "ie"}, + {il, "il"}, + {in, "in"}, + {io, "io"}, + {iq, "iq"}, + {ir, "ir"}, + {is, "is"}, + {it_, "it"}, + {jm, "jm"}, + {jo, "jo"}, + {jp, "jp"}, + {ke, "ke"}, + {kg, "kg"}, + {kh, "kh"}, + {ki, "ki"}, + {km, "km"}, + {kn, "kn"}, + {kp, "kp"}, + {kr, "kr"}, + {kw, "kw"}, + {ky, "ky"}, + {kz, "kz"}, + {la, "la"}, + {lb, "lb"}, + {lc, "lc"}, + {li, "li"}, + {lk, "lk"}, + {lr, "lr"}, + {ls, "ls"}, + {lt, "lt"}, + {lu, "lu"}, + {lv, "lv"}, + {ly, "ly"}, + {ma, "ma"}, + {mc, "mc"}, + {md, "md"}, + {me, "me"}, + {mg, "mg"}, + {mh, "mh"}, + {mk, "mk"}, + {ml, "ml"}, + {mm, "mm"}, + {mn, "mn"}, + {mo, "mo"}, + {mp, "mp"}, + {mq, "mq"}, + {mr, "mr"}, + {ms, "ms"}, + {mt, "mt"}, + {mu, "mu"}, + {mv, "mv"}, + {mw, "mw"}, + {mx, "mx"}, + {my, "my"}, + {mz, "mz"}, + {na, "na"}, + {nc, "nc"}, + {ne, "ne"}, + {nf, "nf"}, + {ng, "ng"}, + {ni, "ni"}, + {nl, "nl"}, + {no, "no"}, + {np, "np"}, + {nr, "nr"}, + {nu, "nu"}, + {nz, "nz"}, + {om, "om"}, + {pa, "pa"}, + {pe, "pe"}, + {pf, "pf"}, + {pg, "pg"}, + {ph, "ph"}, + {pk, "pk"}, + {pl, "pl"}, + {pm, "pm"}, + {pn, "pn"}, + {pr, "pr"}, + {ps, "ps"}, + {pt, "pt"}, + {pw, "pw"}, + {py, "py"}, + {qa, "qa"}, + {re, "re"}, + {ro, "ro"}, + {rs, "rs"}, + {ru, "ru"}, + {rw, "rw"}, + {sa, "sa"}, + {sb, "sb"}, + {sc, "sc"}, + {scotland, "scotland"}, + {sd, "sd"}, + {se, "se"}, + {sg, "sg"}, + {sh, "sh"}, + {si, "si"}, + {sj, "sj"}, + {sk, "sk"}, + {sl, "sl"}, + {sm, "sm"}, + {sn, "sn"}, + {so, "so"}, + {sr, "sr"}, + {st, "st"}, + {sv, "sv"}, + {sy, "sy"}, + {sz_, "sz"}, + {tc, "tc"}, + {td, "td"}, + {tf, "tf"}, + {tg, "tg"}, + {th, "th"}, + {tj, "tj"}, + {tk, "tk"}, + {tl, "tl"}, + {tm, "tm"}, + {tn, "tn"}, + {to, "to"}, + {tr, "tr"}, + {tt, "tt"}, + {tv, "tv"}, + {tw, "tw"}, + {tz, "tz"}, + {ua, "ua"}, + {ug, "ug"}, + {um, "um"}, + {unknown, "unknown"}, + {us, "us"}, + {uy, "uy"}, + {uz, "uz"}, + {va, "va"}, + {vc, "vc"}, + {ve, "ve"}, + {vg, "vg"}, + {vi, "vi"}, + {vn, "vn"}, + {vu, "vu"}, + {wales, "wales"}, + {wf, "wf"}, + {ws, "ws"}, + {ye, "ye"}, + {yt, "yt"}, + {za, "za"}, + {zm, "zm"}, + {zw, "zw"}, +}; + + +static const int FLAGS_XPM_SIZE = (sizeof flagXPMCodeVector) / (sizeof flagXPMCodeVector[0]); + + +#endif // COUNTRY_FLAGS_H diff --git a/src/pixmaps/flags_xpm/Makefile.am b/src/pixmaps/flags_xpm/Makefile.am new file mode 100644 index 00000000..2775ba0a --- /dev/null +++ b/src/pixmaps/flags_xpm/Makefile.am @@ -0,0 +1,251 @@ + +EXTRA_DIST = \ + ad.xpm \ + ae.xpm \ + af.xpm \ + ag.xpm \ + ai.xpm \ + al.xpm \ + am.xpm \ + an.xpm \ + ao.xpm \ + ar.xpm \ + as.xpm \ + at.xpm \ + au.xpm \ + aw.xpm \ + ax.xpm \ + az.xpm \ + ba.xpm \ + bb.xpm \ + bd.xpm \ + be.xpm \ + bf.xpm \ + bg.xpm \ + bh.xpm \ + bi.xpm \ + bj.xpm \ + bm.xpm \ + bn.xpm \ + bo.xpm \ + br.xpm \ + bs.xpm \ + bt.xpm \ + bv.xpm \ + bw.xpm \ + by.xpm \ + bz.xpm \ + ca.xpm \ + catalonia.xpm \ + cc.xpm \ + cd.xpm \ + cf.xpm \ + cg.xpm \ + ch.xpm \ + ci.xpm \ + ck.xpm \ + cl.xpm \ + cm.xpm \ + cn.xpm \ + co.xpm \ + cr.xpm \ + cs.xpm \ + cu.xpm \ + cv.xpm \ + cx.xpm \ + cy.xpm \ + cz.xpm \ + de.xpm \ + dj.xpm \ + dk.xpm \ + dm.xpm \ + do.xpm \ + dz.xpm \ + ec.xpm \ + ee.xpm \ + eg.xpm \ + eh.xpm \ + england.xpm \ + er.xpm \ + es.xpm \ + et.xpm \ + europeanunion.xpm \ + fam.xpm \ + fi.xpm \ + fj.xpm \ + fk.xpm \ + fm.xpm \ + fo.xpm \ + fr.xpm \ + ga.xpm \ + gb.xpm \ + gd.xpm \ + ge.xpm \ + gf.xpm \ + gh.xpm \ + gi.xpm \ + gl.xpm \ + gm.xpm \ + gn.xpm \ + gp.xpm \ + gq.xpm \ + gr.xpm \ + gs.xpm \ + gt.xpm \ + gu.xpm \ + gw.xpm \ + gy.xpm \ + hk.xpm \ + hm.xpm \ + hn.xpm \ + hr.xpm \ + ht.xpm \ + hu.xpm \ + id.xpm \ + ie.xpm \ + il.xpm \ + in.xpm \ + io.xpm \ + iq.xpm \ + ir.xpm \ + is.xpm \ + it.xpm \ + jm.xpm \ + jo.xpm \ + jp.xpm \ + ke.xpm \ + kg.xpm \ + kh.xpm \ + ki.xpm \ + km.xpm \ + kn.xpm \ + kp.xpm \ + kr.xpm \ + kw.xpm \ + ky.xpm \ + kz.xpm \ + la.xpm \ + lb.xpm \ + lc.xpm \ + li.xpm \ + lk.xpm \ + lr.xpm \ + ls.xpm \ + lt.xpm \ + lu.xpm \ + lv.xpm \ + ly.xpm \ + ma.xpm \ + mc.xpm \ + md.xpm \ + me.xpm \ + mg.xpm \ + mh.xpm \ + mk.xpm \ + ml.xpm \ + mm.xpm \ + mn.xpm \ + mo.xpm \ + mp.xpm \ + mq.xpm \ + mr.xpm \ + ms.xpm \ + mt.xpm \ + mu.xpm \ + mv.xpm \ + mw.xpm \ + mx.xpm \ + my.xpm \ + mz.xpm \ + na.xpm \ + nc.xpm \ + ne.xpm \ + nf.xpm \ + ng.xpm \ + ni.xpm \ + nl.xpm \ + no.xpm \ + np.xpm \ + nr.xpm \ + nu.xpm \ + nz.xpm \ + om.xpm \ + pa.xpm \ + pe.xpm \ + pf.xpm \ + pg.xpm \ + ph.xpm \ + pk.xpm \ + pl.xpm \ + pm.xpm \ + pn.xpm \ + pr.xpm \ + ps.xpm \ + pt.xpm \ + pw.xpm \ + py.xpm \ + qa.xpm \ + re.xpm \ + ro.xpm \ + rs.xpm \ + ru.xpm \ + rw.xpm \ + sa.xpm \ + sb.xpm \ + sc.xpm \ + scotland.xpm \ + sd.xpm \ + se.xpm \ + sg.xpm \ + sh.xpm \ + si.xpm \ + sj.xpm \ + sk.xpm \ + sl.xpm \ + sm.xpm \ + sn.xpm \ + so.xpm \ + sr.xpm \ + st.xpm \ + sv.xpm \ + sy.xpm \ + sz.xpm \ + tc.xpm \ + td.xpm \ + tf.xpm \ + tg.xpm \ + th.xpm \ + tj.xpm \ + tk.xpm \ + tl.xpm \ + tm.xpm \ + tn.xpm \ + to.xpm \ + tr.xpm \ + tt.xpm \ + tv.xpm \ + tw.xpm \ + tz.xpm \ + ua.xpm \ + ug.xpm \ + um.xpm \ + unknown.xpm \ + us.xpm \ + uy.xpm \ + uz.xpm \ + va.xpm \ + vc.xpm \ + ve.xpm \ + vg.xpm \ + vi.xpm \ + vn.xpm \ + vu.xpm \ + wales.xpm \ + wf.xpm \ + ws.xpm \ + ye.xpm \ + yt.xpm \ + za.xpm \ + zm.xpm \ + zw.xpm \ + makeflags.sh diff --git a/src/pixmaps/flags_xpm/Makefile.in b/src/pixmaps/flags_xpm/Makefile.in new file mode 100644 index 00000000..79b33bc7 --- /dev/null +++ b/src/pixmaps/flags_xpm/Makefile.in @@ -0,0 +1,694 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/pixmaps/flags_xpm +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +EXTRA_DIST = \ + ad.xpm \ + ae.xpm \ + af.xpm \ + ag.xpm \ + ai.xpm \ + al.xpm \ + am.xpm \ + an.xpm \ + ao.xpm \ + ar.xpm \ + as.xpm \ + at.xpm \ + au.xpm \ + aw.xpm \ + ax.xpm \ + az.xpm \ + ba.xpm \ + bb.xpm \ + bd.xpm \ + be.xpm \ + bf.xpm \ + bg.xpm \ + bh.xpm \ + bi.xpm \ + bj.xpm \ + bm.xpm \ + bn.xpm \ + bo.xpm \ + br.xpm \ + bs.xpm \ + bt.xpm \ + bv.xpm \ + bw.xpm \ + by.xpm \ + bz.xpm \ + ca.xpm \ + catalonia.xpm \ + cc.xpm \ + cd.xpm \ + cf.xpm \ + cg.xpm \ + ch.xpm \ + ci.xpm \ + ck.xpm \ + cl.xpm \ + cm.xpm \ + cn.xpm \ + co.xpm \ + cr.xpm \ + cs.xpm \ + cu.xpm \ + cv.xpm \ + cx.xpm \ + cy.xpm \ + cz.xpm \ + de.xpm \ + dj.xpm \ + dk.xpm \ + dm.xpm \ + do.xpm \ + dz.xpm \ + ec.xpm \ + ee.xpm \ + eg.xpm \ + eh.xpm \ + england.xpm \ + er.xpm \ + es.xpm \ + et.xpm \ + europeanunion.xpm \ + fam.xpm \ + fi.xpm \ + fj.xpm \ + fk.xpm \ + fm.xpm \ + fo.xpm \ + fr.xpm \ + ga.xpm \ + gb.xpm \ + gd.xpm \ + ge.xpm \ + gf.xpm \ + gh.xpm \ + gi.xpm \ + gl.xpm \ + gm.xpm \ + gn.xpm \ + gp.xpm \ + gq.xpm \ + gr.xpm \ + gs.xpm \ + gt.xpm \ + gu.xpm \ + gw.xpm \ + gy.xpm \ + hk.xpm \ + hm.xpm \ + hn.xpm \ + hr.xpm \ + ht.xpm \ + hu.xpm \ + id.xpm \ + ie.xpm \ + il.xpm \ + in.xpm \ + io.xpm \ + iq.xpm \ + ir.xpm \ + is.xpm \ + it.xpm \ + jm.xpm \ + jo.xpm \ + jp.xpm \ + ke.xpm \ + kg.xpm \ + kh.xpm \ + ki.xpm \ + km.xpm \ + kn.xpm \ + kp.xpm \ + kr.xpm \ + kw.xpm \ + ky.xpm \ + kz.xpm \ + la.xpm \ + lb.xpm \ + lc.xpm \ + li.xpm \ + lk.xpm \ + lr.xpm \ + ls.xpm \ + lt.xpm \ + lu.xpm \ + lv.xpm \ + ly.xpm \ + ma.xpm \ + mc.xpm \ + md.xpm \ + me.xpm \ + mg.xpm \ + mh.xpm \ + mk.xpm \ + ml.xpm \ + mm.xpm \ + mn.xpm \ + mo.xpm \ + mp.xpm \ + mq.xpm \ + mr.xpm \ + ms.xpm \ + mt.xpm \ + mu.xpm \ + mv.xpm \ + mw.xpm \ + mx.xpm \ + my.xpm \ + mz.xpm \ + na.xpm \ + nc.xpm \ + ne.xpm \ + nf.xpm \ + ng.xpm \ + ni.xpm \ + nl.xpm \ + no.xpm \ + np.xpm \ + nr.xpm \ + nu.xpm \ + nz.xpm \ + om.xpm \ + pa.xpm \ + pe.xpm \ + pf.xpm \ + pg.xpm \ + ph.xpm \ + pk.xpm \ + pl.xpm \ + pm.xpm \ + pn.xpm \ + pr.xpm \ + ps.xpm \ + pt.xpm \ + pw.xpm \ + py.xpm \ + qa.xpm \ + re.xpm \ + ro.xpm \ + rs.xpm \ + ru.xpm \ + rw.xpm \ + sa.xpm \ + sb.xpm \ + sc.xpm \ + scotland.xpm \ + sd.xpm \ + se.xpm \ + sg.xpm \ + sh.xpm \ + si.xpm \ + sj.xpm \ + sk.xpm \ + sl.xpm \ + sm.xpm \ + sn.xpm \ + so.xpm \ + sr.xpm \ + st.xpm \ + sv.xpm \ + sy.xpm \ + sz.xpm \ + tc.xpm \ + td.xpm \ + tf.xpm \ + tg.xpm \ + th.xpm \ + tj.xpm \ + tk.xpm \ + tl.xpm \ + tm.xpm \ + tn.xpm \ + to.xpm \ + tr.xpm \ + tt.xpm \ + tv.xpm \ + tw.xpm \ + tz.xpm \ + ua.xpm \ + ug.xpm \ + um.xpm \ + unknown.xpm \ + us.xpm \ + uy.xpm \ + uz.xpm \ + va.xpm \ + vc.xpm \ + ve.xpm \ + vg.xpm \ + vi.xpm \ + vn.xpm \ + vu.xpm \ + wales.xpm \ + wf.xpm \ + ws.xpm \ + ye.xpm \ + yt.xpm \ + za.xpm \ + zm.xpm \ + zw.xpm \ + makeflags.sh + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/pixmaps/flags_xpm/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/pixmaps/flags_xpm/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \ + uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/pixmaps/flags_xpm/ad.xpm b/src/pixmaps/flags_xpm/ad.xpm new file mode 100644 index 00000000..6adcf847 --- /dev/null +++ b/src/pixmaps/flags_xpm/ad.xpm @@ -0,0 +1,177 @@ +/* XPM */ +static const char *ad[] = { +/* columns rows colors chars-per-pixel */ +"16 11 160 2", +" c #C50000", +". c #C70000", +"X c #CB0000", +"o c #CD0000", +"O c #D30000", +"+ c #D50000", +"@ c #DB0000", +"# c #DD0000", +"$ c #E10000", +"% c #E50000", +"& c #E70000", +"* c #EB0000", +"= c #EF0000", +"- c #F10000", +"; c #E61010", +": c #E81514", +"> c #E81515", +", c #E91B1B", +"< c #EA1D1D", +"1 c #EA1E1E", +"2 c #EB2523", +"3 c #EB2424", +"4 c #EC2425", +"5 c #E82D2D", +"6 c #EE2C2C", +"7 c #EE2D2D", +"8 c #EE302B", +"9 c #E93131", +"0 c #EF3733", +"q c #EA3636", +"w c #EC3A3A", +"e c #EC3B3B", +"r c #F03335", +"t c #F03635", +"y c #F13C3C", +"u c #F23D3D", +"i c #F1403C", +"p c #ED4242", +"a c #EF4949", +"s c #F34545", +"d c #F34644", +"f c #F54D4D", +"g c #F1504F", +"h c #F45C4B", +"j c #F25656", +"k c #F45D5D", +"l c #F1624C", +"z c #F56464", +"x c #F76A6A", +"c c #F37D6D", +"v c #F86F70", +"b c #CFCF00", +"n c #D3D300", +"m c #D7D700", +"M c #DBDB00", +"N c #DFDF00", +"B c #E1E100", +"V c #F5F500", +"C c #F9F900", +"Z c #FDFD00", +"A c #FBFB05", +"S c #EBEB23", +"D c #EDED2A", +"F c #EEEE2B", +"G c #F1F13C", +"H c #AC9465", +"J c #B0996B", +"K c #B1996B", +"L c #B59D71", +"P c #B8A276", +"I c #BCA77D", +"U c #C7B74F", +"Y c #CBBC57", +"T c #CAA262", +"R c #D1A46A", +"E c #C2AE7C", +"W c #D8AE74", +"Q c #D0AF7D", +"! c #E0A97A", +"~ c #CCC04D", +"^ c #E5D052", +"/ c #EDED40", +"( c #EEEE46", +") c #F2F240", +"_ c #F3F344", +"` c #F0F04B", +"' c #F4F448", +"] c #F5F54B", +"[ c #F2F252", +"{ c #F5F550", +"} c #F6F654", +"| c #F2F258", +" . c #F7F75C", +".. c #F4F45F", +"X. c #DACF6F", +"o. c #E9D361", +"O. c #F1EE69", +"+. c #F9F960", +"@. c #F3F16F", +"#. c #FAFA68", +"$. c #FBFB6F", +"%. c #F9F976", +"&. c #FCFC75", +"*. c #FBFB7C", +"=. c #0011AD", +"-. c #031FAD", +";. c #0D2BB1", +":. c #1933B7", +">. c #2B47BD", +",. c #2F49BF", +"<. c #3951C5", +"1. c #415BC7", +"2. c #4961CB", +"3. c #5167CF", +"4. c #556BD7", +"5. c #596DD1", +"6. c #5B71D3", +"7. c #5D71D3", +"8. c #5D71D5", +"9. c #5F73D5", +"0. c #677BD7", +"q. c #7D8DDA", +"w. c #CCB98B", +"e. c #D3B285", +"r. c #FBFB81", +"t. c #FCFC86", +"y. c #FCFC8C", +"u. c #FDFD8F", +"i. c #8695DA", +"p. c #8494DD", +"a. c #8C9ADB", +"s. c #8B9ADC", +"d. c #8C9ADD", +"f. c #8C9BDE", +"g. c #919FDE", +"h. c #919FDF", +"j. c #94A1DD", +"k. c #99A6DF", +"l. c #91A0E0", +"z. c #96A4E0", +"x. c #96A4E1", +"c. c #97A5E2", +"v. c #99A7E5", +"b. c #9BA8E2", +"n. c #9BA8E3", +"m. c #9EAAE1", +"M. c #9FACE4", +"N. c #9FACE5", +"B. c #9EAAE8", +"V. c #A3AEE2", +"C. c #A3AFE6", +"Z. c #A7B2E5", +"A. c #A6B3E7", +"S. c #ABB6E7", +"D. c #AEB9E8", +"F. c #B2BCE9", +"G. c #B4BEEB", +"H. c #B4BFEB", +"J. c #B0BBED", +"K. c #B7C0EC", +/* pixels */ +"0.9.9.9.4.Z A C C V V - = * & & ", +"6.K.H.G.D.y.u.t.r.*.%.v x z k # ", +"9.K.A.C.B.&.&.@.O. .} f s y j # ", +"7.G.C.N.n.$.w.e.Q E ] s y 0 j # ", +"5.G.N.n.z.#.! c ^ R _ i r 6 a + ", +"3.D.n.z.l.+.W o.l T G 0 6 4 p O ", +"1.D.z.g.f.X.I l ^ L U 8 3 1 e o ", +"1.S.g.s.p.{ P L K H F 2 1 > q X ", +"<.V.s.i.q.` ) Y U F S , > ; 9 . ", +">.m.k.j.s.+.| [ ` ` G e q 9 5 . ", +",.:.;.-.=.B N M m n b o X . . " +}; diff --git a/src/pixmaps/flags_xpm/ae.xpm b/src/pixmaps/flags_xpm/ae.xpm new file mode 100644 index 00000000..5fc8540e --- /dev/null +++ b/src/pixmaps/flags_xpm/ae.xpm @@ -0,0 +1,125 @@ +/* XPM */ +static const char *ae[] = { +/* columns rows colors chars-per-pixel */ +"16 11 108 2", +" c black", +". c #0B0B0B", +"X c #0F0F0E", +"o c #131313", +"O c #181919", +"+ c #1E1E1E", +"@ c #232323", +"# c gray16", +"$ c #2C2C2C", +"% c gray18", +"& c #2F2F2F", +"* c #323232", +"= c #343434", +"- c #353535", +"; c #393939", +": c gray24", +"> c #004100", +", c #004700", +"< c #004D00", +"1 c #005300", +"2 c #005900", +"3 c #005D00", +"4 c #006300", +"5 c #006900", +"6 c #006D00", +"7 c #007300", +"8 c #007500", +"9 c #007900", +"0 c #007D00", +"q c gray26", +"w c #464646", +"e c #4B4B4B", +"r c #505050", +"t c #ED0000", +"y c #EF0000", +"u c #F10000", +"i c #F30000", +"p c #F50000", +"a c #F70000", +"s c #F90000", +"d c #FB0000", +"f c #FD0000", +"g c red", +"h c #F93A3A", +"j c #FA3F3F", +"k c #FA4444", +"l c #FB4545", +"z c #FB4949", +"x c #FB4A49", +"c c #FC4A4B", +"v c #FC4F4F", +"b c #FD4F50", +"n c #FD5353", +"m c #F95455", +"M c #FD5454", +"N c #F95858", +"B c #FE5858", +"V c #FE5959", +"C c #FA5D5D", +"Z c #FE5C5C", +"A c #FE5F5F", +"S c #FB6162", +"D c #FC6666", +"F c #FC6A6A", +"G c #FD6F6F", +"H c #FE7273", +"J c #FE7676", +"K c #FE7777", +"L c #FE7979", +"P c #FF7B7A", +"I c #FF7B7B", +"U c #2CA62C", +"Y c #31A931", +"T c #37AB37", +"R c #3DAE3D", +"E c #42B142", +"W c #47B347", +"Q c #49B249", +"! c #4CB64C", +"~ c #4EB44E", +"^ c #51B751", +"/ c #53B753", +"( c #54BA54", +") c #58B957", +"_ c #5CBB5C", +"` c #61BE60", +"' c #65C065", +"] c #69C269", +"[ c #6DC36D", +"{ c #70C571", +"} c #74C774", +"| c gray81", +" . c gray82", +".. c #D5D5D5", +"X. c #D7D7D7", +"o. c gray95", +"O. c #F3F3F3", +"+. c #F4F4F4", +"@. c #F4F5F5", +"#. c gray96", +"$. c #F6F6F6", +"%. c gray97", +"&. c #F8F8F8", +"*. c #F9F9F9", +"=. c gray98", +"-. c #FBFBFB", +";. c gray99", +":. c #FDFDFD", +/* pixels */ +"g g g g g 0 9 8 7 6 5 4 3 2 1 < ", +"g I I I J } { [ [ ` _ _ _ / ~ , ", +"g I A Z Z / ^ ! W E R T Y U ! > ", +"g I A M n ;.-.-.-.-.%.%.%.+.%...", +"g J B M v ;.-.-.*.%.%.%.+.+.+...", +"d H M v z -.-.*.&.%.%.+.+.O.%. .", +"g G v z k -.&.&.%.%.+.+.O.O.O. .", +"d F z k k *.&.%.%.+.O.O.o.O.O.| ", +"d D k j h - & $ @ + O o X . & ", +"a S C N m e e w q : ; - * & $ ", +"a u u t t " +}; diff --git a/src/pixmaps/flags_xpm/af.xpm b/src/pixmaps/flags_xpm/af.xpm new file mode 100644 index 00000000..ea0addbe --- /dev/null +++ b/src/pixmaps/flags_xpm/af.xpm @@ -0,0 +1,168 @@ +/* XPM */ +static const char *af[] = { +/* columns rows colors chars-per-pixel */ +"16 11 151 2", +" c black", +". c #000101", +"X c #0B0909", +"o c #170000", +"O c #001700", +"+ c #001B00", +"@ c #001F00", +"# c #131313", +"$ c #151515", +"% c gray9", +"& c #191919", +"* c #1B1B1B", +"= c #002100", +"- c #002500", +"; c #002700", +": c #002D00", +"> c #003300", +", c #003B00", +"< c gray16", +"1 c #6F1500", +"2 c #004500", +"3 c #004D00", +"4 c #005300", +"5 c #006700", +"6 c #006D00", +"7 c #007500", +"8 c #505050", +"9 c gray34", +"0 c #585858", +"q c #5F5F5F", +"w c #656565", +"e c gray40", +"r c gray42", +"t c #6D6D6D", +"y c #6D6D6E", +"u c gray43", +"i c #717272", +"p c gray45", +"a c #747474", +"s c #777777", +"d c #787979", +"f c #797A7A", +"g c gray48", +"h c #7E7E7E", +"j c #CF0000", +"k c #D30000", +"l c #D70000", +"z c #DB0000", +"x c #DF0000", +"c c #E10000", +"v c #F50000", +"b c #F90000", +"n c #FD0000", +"m c #FB0505", +"M c #EB2323", +"N c #ED2A2A", +"B c #EE2B2B", +"V c #EF3232", +"C c #F13939", +"Z c #F13C3C", +"A c #925723", +"S c #975E2A", +"D c #9B6432", +"F c #A0693A", +"G c #A06E40", +"H c #A47143", +"J c #A9784A", +"K c #AE7D53", +"L c #ED4040", +"P c #EE4646", +"I c #F24040", +"U c #F34444", +"Y c #F04B4B", +"T c #F44848", +"R c #F54C4B", +"E c #ED4F51", +"W c #F25252", +"Q c #F55050", +"! c #F65454", +"~ c #F25858", +"^ c #F75959", +"/ c #F45E5F", +"( c #F85B5B", +") c #F96060", +"_ c #F96262", +"` c #F36A69", +"' c #FA6868", +"] c #FA6869", +"[ c #FA6F6F", +"{ c #FB6F6F", +"} c #E77B7A", +"| c #F17776", +" . c #F97676", +".. c #FC7575", +"X. c #FB7C7C", +"o. c #0F9110", +"O. c #159514", +"+. c #159415", +"@. c #1D981D", +"#. c #1E981E", +"$. c #249D24", +"%. c #249C25", +"&. c #2D9E2D", +"*. c #319E31", +"=. c #2CA12C", +"-. c #2DA12D", +";. c #31A031", +":. c #36A236", +">. c #36A336", +",. c #35A535", +"<. c #36A535", +"1. c #3BA53B", +"2. c #3CAA3C", +"3. c #3EAA3D", +"4. c #42A942", +"5. c #45AF45", +"6. c #49AD49", +"7. c #50B04F", +"8. c #56B456", +"9. c #5DB85D", +"0. c #64BB64", +"q. c #6ABE6A", +"w. c #BF9775", +"e. c #E8807E", +"r. c #828383", +"t. c #848484", +"y. c #898989", +"u. c #8E8E8E", +"i. c #929292", +"p. c gray58", +"a. c gray59", +"s. c #969796", +"d. c gray60", +"f. c #F68385", +"g. c #F28785", +"h. c #FB8181", +"j. c #FC8686", +"k. c #FC8B8C", +"l. c #FD8F8F", +"z. c #EEA0A1", +"x. c #F4B2AF", +"c. c #EEB4B3", +"v. c #EEBDBB", +"b. c #EEC8C7", +"n. c #F4C1C3", +"m. c #F7C6C5", +"M. c #F0C9C8", +"N. c #F2C9C9", +"B. c #F8C9C9", +"V. c #F9CACA", +"C. c #F7D3D2", +/* pixels */ +"< * * * % n m v n v v 1 7 6 5 5 ", +"% d.d.s.p.l.k.j.h.X...w.q.0.9.4 ", +"* d.r.h f ..{ ] _ ^ ! K 5.3.8.3 ", +"* s.h f a { { V.m.f.R J 2.<.7.2 ", +"# i.f p t ] V.g.| n.U J <.-.6., ", +"X u.a t w ) C.v.c.N.Z D -.$.4.> ", +" y.t w q ( x.N.b.z.V D $.#.1.: ", +" r.w q 0 Q ` } } E B S #.+.<.; ", +" h q 0 8 T I C V B M A +.o.;.= ", +" s p r w / ~ W Y P L G :.*.&.O ", +" c x z l k j o - @ + - " +}; diff --git a/src/pixmaps/flags_xpm/ag.xpm b/src/pixmaps/flags_xpm/ag.xpm new file mode 100644 index 00000000..a4ac5136 --- /dev/null +++ b/src/pixmaps/flags_xpm/ag.xpm @@ -0,0 +1,163 @@ +/* XPM */ +static const char *ag[] = { +/* columns rows colors chars-per-pixel */ +"16 11 146 2", +" c black", +". c #390000", +"X c #2B2C2D", +"o c #302C2C", +"O c #313131", +"+ c #393731", +"@ c #3A3937", +"# c #7A2626", +"$ c #7F6F36", +"% c #535353", +"& c #585757", +"* c #5A5854", +"= c #5B5A59", +"- c #58595A", +"; c gray36", +": c #614E4E", +"> c #645F5F", +", c #656560", +"< c #7C7765", +"1 c #777777", +"2 c #787774", +"3 c #797979", +"4 c #7B7B7B", +"5 c #810000", +"6 c #AB0000", +"7 c #AD0000", +"8 c #B10000", +"9 c #B30000", +"0 c #B50000", +"q c #B70000", +"w c #B90000", +"e c #BB0000", +"r c #BD0000", +"t c #B72D3B", +"y c #C30000", +"u c #C50000", +"i c #C90000", +"p c #CB0000", +"a c #CF0000", +"s c #D30000", +"d c #D50000", +"f c #D70000", +"g c #D90000", +"h c #DB0000", +"j c #DD0000", +"k c #DF0000", +"l c #E50000", +"z c #CA2424", +"x c #D72B24", +"c c #D82F28", +"v c #D82F29", +"b c #DA332C", +"n c #DA342C", +"m c #DA342E", +"M c #DD3831", +"N c #DF3932", +"B c #DE3E37", +"V c #E03931", +"C c #943F5A", +"Z c #B14949", +"A c #A35C5C", +"S c #8C7F51", +"D c #AD5D72", +"F c #8E7B7B", +"G c #DB4741", +"H c #DB4444", +"J c #DD4B44", +"K c #DD4D47", +"L c #DE4D47", +"P c #DE504B", +"I c #DF544D", +"U c #E4544D", +"Y c #E4544F", +"T c #E05550", +"R c #E25954", +"E c #E55954", +"W c #E75A54", +"Q c #E75E58", +"! c #E75E59", +"~ c #E8625E", +"^ c #EC635E", +"/ c #CD5964", +"( c #D86060", +") c #DB6666", +"_ c #CE7B7A", +"` c #E66762", +"' c #E96761", +"] c #E76B66", +"[ c #ED6C66", +"{ c #E86F6A", +"} c #EE706A", +"| c #E9746F", +" . c #EA7773", +".. c #EC7B76", +"X. c #EA7979", +"o. c #ED7F7A", +"O. c #DFBF3D", +"+. c #EAC83C", +"@. c #AE9842", +"#. c #B19D51", +"$. c #848071", +"%. c #B5B36B", +"&. c #ED837E", +"*. c #CCB969", +"=. c #CDBB6D", +"-. c #DBC154", +";. c #E4C547", +":. c #E6C84C", +">. c #EACA4B", +",. c #FADE42", +"<. c #FBDF47", +"1. c #4684CC", +"2. c #5E91CB", +"3. c #428AD9", +"4. c #4788D9", +"5. c #4D8CDA", +"6. c #518FDC", +"7. c #5D98D2", +"8. c #5692DD", +"9. c #5E9DDC", +"0. c #689CD7", +"q. c #639ED9", +"w. c #6DA3D5", +"e. c #67A1DA", +"r. c #6BA4DC", +"t. c #71A6D6", +"y. c #75A9D8", +"u. c #70A8DE", +"i. c #79ACDA", +"p. c #5B9AE1", +"a. c #74AAE1", +"s. c #7CAEE0", +"d. c #EE8582", +"f. c #F08984", +"g. c #E39999", +"h. c #C1BF80", +"j. c #E9A09F", +"k. c #83AFDD", +"l. c #EDCBCA", +"z. c #F0C9C9", +"x. c #F5ECEC", +"c. c #F4EEEE", +"v. c gray96", +"b. c #F6F6F6", +"n. c gray97", +"m. c #F8F8F8", +/* pixels */ +". ", +"q F 3 3 2 2 F *.*.< , ; - % : 5 ", +"l _ , ; = -.#.:.;.@.O.@ O X Z 6 ", +"k X.A - & S :.<.,.+.$ + X # H e ", +"k f.[ k.s.h.y.y.t.w.%.7.2.B E e ", +"h d.[ / 0.p.p.6.5.4.3.1.t V I q ", +"h &.` ^ D s.u.r.e.q.9.C N m I 8 ", +"h o.~ ! Q g.m.m.v.v.g.N n v K 8 ", +"f ..! E U U l.v.v.l.z m c x J 7 ", +"s .| { ] ` ) c.c.( I P K J H 7 ", +"f a p p u u r e e 8 q 8 8 7 7 8 " +}; diff --git a/src/pixmaps/flags_xpm/ai.xpm b/src/pixmaps/flags_xpm/ai.xpm new file mode 100644 index 00000000..6bf003a6 --- /dev/null +++ b/src/pixmaps/flags_xpm/ai.xpm @@ -0,0 +1,177 @@ +/* XPM */ +static const char *ai[] = { +/* columns rows colors chars-per-pixel */ +"16 11 160 2", +" c #000036", +". c #000039", +"X c #00003E", +"o c #000041", +"O c #000044", +"+ c #000049", +"@ c #00004F", +"# c #000052", +"$ c #000057", +"% c #00005A", +"& c #00005F", +"* c #000068", +"= c #00006D", +"- c #000070", +"; c #000076", +": c #00017E", +"> c #D2546D", +", c #F8D86B", +"< c #F9DF7E", +"1 c #000B84", +"2 c #001289", +"3 c #001691", +"4 c #001B91", +"5 c #001E97", +"6 c #002297", +"7 c #002599", +"8 c #00279C", +"9 c #002EA2", +"0 c #004BB4", +"q c #005BBA", +"w c #005EBB", +"e c #115BB9", +"r c #2B60B7", +"t c #2C76B7", +"y c #2975BE", +"u c #5F5AA6", +"i c #4E64B4", +"p c #5D68B6", +"a c #347FC3", +"s c #A95681", +"d c #B05981", +"f c #C96C89", +"g c #5A86B8", +"h c #2D80C4", +"j c #3081C5", +"k c #3385C6", +"l c #3A84C2", +"z c #3A86C5", +"x c #3F88C6", +"c c #3F89C7", +"v c #398BC8", +"b c #4A86C4", +"n c #4189C7", +"m c #448DC8", +"M c #458EC8", +"N c #4791C7", +"B c #4691C9", +"V c #4692CA", +"C c #4A91C9", +"Z c #4B91C9", +"A c #4892CA", +"S c #4C92C8", +"D c #4E94C9", +"F c #4C95CB", +"G c #4D95CB", +"H c #4F95CA", +"J c #4C96CC", +"K c #5695C7", +"L c #5295CB", +"P c #5096CB", +"I c #5098CC", +"U c #5199CC", +"Y c #5398CC", +"T c #5299CD", +"R c #5298CE", +"E c #549ACC", +"W c #569BCC", +"Q c #5499CE", +"! c #559BCE", +"~ c #579BCE", +"^ c #559CCE", +"/ c #569CCE", +"( c #589DCF", +") c #5A9DCE", +"_ c #5B9DCE", +"` c #599ECF", +"' c #5C9DCE", +"] c #5A9ED0", +"[ c #5DA0CF", +"{ c #5FA0CF", +"} c #5CA0D1", +"| c #5DA0D1", +" . c #66A0CF", +".. c #62A1D0", +"X. c #62A2D0", +"o. c #62A3D3", +"O. c #65A4D2", +"+. c #66A4D2", +"@. c #68A5D3", +"#. c #6AA6D3", +"$. c #6BA6D4", +"%. c #6AA7D4", +"&. c #6EA9D4", +"*. c #71A8D4", +"=. c #71ABD6", +"-. c #74ACD6", +";. c #75ACD7", +":. c #77ADD7", +">. c #79AED8", +",. c #7BB0D9", +"<. c #7CB1D9", +"1. c #7FB0D9", +"2. c #7DB2D9", +"3. c #4AB4E6", +"4. c #4DB6E5", +"5. c #55B5E3", +"6. c #61BBE6", +"7. c #64BDE6", +"8. c #68BFE7", +"9. c #AD839E", +"0. c #B0809A", +"q. c #919BBD", +"w. c #B090AA", +"e. c #EF8188", +"r. c #FE8186", +"t. c #FF878B", +"y. c #FF8A8E", +"u. c #F88890", +"i. c #E5939D", +"p. c #FB9195", +"a. c #FC9095", +"s. c #FF9498", +"d. c #DF94A1", +"f. c #EAA0AA", +"g. c #FFAAAE", +"h. c #FFADB0", +"j. c #F7B1BA", +"k. c #F4B4BD", +"l. c #FFBEBF", +"z. c #F7E296", +"x. c #F5E5A7", +"c. c #F6E6A7", +"v. c #88A8CE", +"b. c #81B3DB", +"n. c #9EB1D2", +"m. c #F5BAC2", +"M. c #9EC7EA", +"N. c #97CDEF", +"B. c #A7CAEA", +"V. c #AED4F2", +"C. c #D4CADC", +"Z. c #FFC5CA", +"A. c #F9DCE5", +"S. c #FFE5EF", +"D. c #F9EEED", +"F. c #F9EFEF", +"G. c #EDF3F8", +"H. c #FDF6F5", +"J. c #F0F5FA", +"K. c #FEFAF9", +/* pixels */ +"p e w s d q b f 7 5 3 2 1 : ; - ", +"r A.V.m.j.B.Z.M.2.>.-.*.$.@.+.* ", +"> g.s.t.r.y.u.e. .` $.2.>.' o.& ", +"u C.l.a.p.h.f.w.' R G.F.F.G.` $ ", +"0 S.n.d.i.N.k.g I J c.< K.z.W # ", +"i v.l 9.0.t K q.P B c.K., c.! O ", +"9 b.o.} ` / I G Z n 6.8.6.5.P O ", +"8 2.} ` ! I G B M c v 3.3.a D X ", +"6 >.` / I G Z M c z a k j y C . ", +"4 :.=.=.@.+.o.' ` ! Y P D C N ", +"2 1 : ; = * & % # @ O o X . " +}; diff --git a/src/pixmaps/flags_xpm/al.xpm b/src/pixmaps/flags_xpm/al.xpm new file mode 100644 index 00000000..139351c7 --- /dev/null +++ b/src/pixmaps/flags_xpm/al.xpm @@ -0,0 +1,169 @@ +/* XPM */ +static const char *al[] = { +/* columns rows colors chars-per-pixel */ +"16 11 152 2", +" c #2F2F2F", +". c #3D2725", +"X c #373636", +"o c #3F3736", +"O c gray24", +"+ c #3E3D3E", +"@ c #403F3E", +"# c #473E3D", +"$ c #543C3A", +"% c #65312D", +"& c #643A34", +"* c #6E3A36", +"= c #723935", +"- c #713A34", +"; c #434343", +": c #444444", +"> c gray27", +", c gray29", +"< c #5B4644", +"1 c #5F4D4C", +"2 c #505151", +"3 c #555150", +"4 c #565656", +"5 c #5B5252", +"6 c #5F5858", +"7 c #5E5D5D", +"8 c #704743", +"9 c #795654", +"0 c #795B59", +"q c #950000", +"w c #9D0000", +"e c #9F0000", +"r c #A30000", +"t c #A70000", +"y c #A90000", +"u c #AD0000", +"i c #AF0000", +"p c #B10000", +"a c #B70000", +"s c #B90000", +"d c #BB0000", +"f c #BD0000", +"g c #953931", +"h c #C10000", +"j c #C30000", +"k c #C50000", +"l c #C70000", +"z c #C90000", +"x c #CD0000", +"c c #CF0000", +"v c #D10000", +"b c #D30000", +"n c #D50000", +"m c #D70000", +"M c #D70100", +"N c #D50700", +"B c #D70700", +"V c #DB0000", +"C c #DB0500", +"Z c #D30900", +"A c #D70900", +"S c #D42B1B", +"D c #D52E1F", +"F c #D63324", +"G c #D53425", +"H c #D73425", +"J c #D6392B", +"K c #D8392A", +"L c #D9392A", +"P c #D8392B", +"I c #CF3D30", +"U c #DB3E30", +"Y c #DA3F31", +"T c #C84135", +"R c #CF4235", +"E c #D94032", +"W c #D84638", +"Q c #DA4638", +"! c #DC4538", +"~ c #D9493B", +"^ c #D9493C", +"/ c #DC4C3F", +"( c #DE4C3E", +") c #804B48", +"_ c #AB4841", +"` c #B74A40", +"' c #B35B53", +"] c #8F635F", +"[ c #B3635C", +"{ c #906C69", +"} c #80706F", +"| c #8D7E7C", +" . c #BA6A63", +".. c #DB4B40", +"X. c #DB4D40", +"o. c #D35247", +"O. c #DB5043", +"+. c #DD5044", +"@. c #DD5447", +"#. c #DD5549", +"$. c #DF584B", +"%. c #DE5A4E", +"&. c #C45C52", +"*. c #D35D53", +"=. c #E45042", +"-. c #E05245", +";. c #E15447", +":. c #E3594D", +">. c #E15B50", +",. c #E35C51", +"<. c #E35F53", +"1. c #DD6459", +"2. c #E06053", +"3. c #E66053", +"4. c #E26055", +"5. c #E26458", +"6. c #E2655B", +"7. c #E56559", +"8. c #E3695E", +"9. c #E36A5F", +"0. c #E76A5F", +"q. c #C36F68", +"w. c #E56E63", +"e. c #E56F65", +"r. c #E96C60", +"t. c #E86F65", +"y. c #EC7066", +"u. c #E77368", +"i. c #E5756B", +"p. c #E7746A", +"a. c #E6776E", +"s. c #E87469", +"d. c #ED756A", +"f. c #E8796F", +"g. c #EA786E", +"h. c #EE796F", +"j. c #E97B72", +"k. c #EB7D73", +"l. c #EF7E73", +"z. c #E97D74", +"x. c #EC8076", +"c. c #E3847B", +"v. c #E1877E", +"b. c #EA8278", +"n. c #EC857D", +"m. c #EC8A81", +"M. c #ED8E85", +"N. c #F18F87", +"B. c #EE9189", +"V. c #ED928A", +"C. c #EF948C", +"Z. c #F0978F", +/* pixels */ +"Z B A A C M V b b b c z k j j a ", +"A Z.Z.C.B.N.| v.M.0 j.g.u.w.8.a ", +"A Z.x.l.{ i. .6 4 ' <.8 +.( 5.p ", +"B C.k.h.q.7 4 3 5 > @ _ ( ! 1.u ", +"M B.h.d.] 0 2 , > + $ * ! E %.u ", +"M M.s.t.[ 9 &.: O ` & g P P #.p ", +"b m.t.r.1.*.) # o * T J P G @.y ", +"c n.0.7.<.< o.X R . P G D / e ", +"z b.7.<.:.@.=.= % E P G D S ~ e ", +"c k.f.i.e.0.6.4.:.$.#.O./ ~ W e ", +"k z k j f f a u u t t t r w w q " +}; diff --git a/src/pixmaps/flags_xpm/am.xpm b/src/pixmaps/flags_xpm/am.xpm new file mode 100644 index 00000000..9d9d2e3a --- /dev/null +++ b/src/pixmaps/flags_xpm/am.xpm @@ -0,0 +1,172 @@ +/* XPM */ +static const char *am[] = { +/* columns rows colors chars-per-pixel */ +"16 11 155 2", +" c #00005B", +". c #000063", +"X c #E30000", +"o c #E50000", +"O c #E90000", +"+ c #EB0000", +"@ c #ED0000", +"# c #EF0000", +"$ c #F10000", +"% c #F30000", +"& c #F50000", +"* c #F70000", +"= c #F70303", +"- c #FB0505", +"; c #F70909", +": c #F90D0D", +"> c #FB1313", +", c #FB1515", +"< c #FB2525", +"1 c #D74900", +"2 c #D74B00", +"3 c #D94F00", +"4 c #D75500", +"5 c #D95100", +"6 c #D95500", +"7 c #DD5500", +"8 c #D95900", +"9 c #DF5900", +"0 c #DF5D00", +"q c #E16100", +"w c #E36500", +"e c #E76B00", +"r c #E96F00", +"t c #EB7300", +"y c #ED7900", +"u c #EF7D00", +"i c #F45352", +"p c #F45757", +"a c #F55757", +"s c #F55C5B", +"d c #F55C5C", +"f c #F6605F", +"g c #F66161", +"h c #F76464", +"j c #F76565", +"k c #F46A6A", +"l c #F66F6F", +"z c #F86868", +"x c #F96D6D", +"c c #F77373", +"v c #F77676", +"b c #FA7171", +"n c #FB7575", +"m c #FB7878", +"M c #FB7979", +"N c #F87A7A", +"B c #FB7B7B", +"V c #FB7B7C", +"C c #F87E7E", +"Z c #FC7E7E", +"A c #F18300", +"S c #F38900", +"D c #F18D00", +"F c #F79500", +"G c #F59700", +"H c #EEAC3B", +"J c #EFAE3F", +"K c #EFB043", +"L c #F0B043", +"P c #F0B247", +"I c #F0B248", +"U c #F1B44B", +"Y c #F3B74F", +"T c #EFB155", +"R c #EFB357", +"E c #EFB859", +"W c #F3B750", +"Q c #F4B954", +"! c #F4B955", +"~ c #F1B35B", +"^ c #F2B55E", +"/ c #F1B95B", +"( c #F5BB59", +") c #F6BE5E", +"_ c #F2B861", +"` c #F2B964", +"' c #F3BB67", +"] c #F5BD6B", +"[ c #F6BF6F", +"{ c #F7C062", +"} c #F8C366", +"| c #F8C367", +" . c #F9C56B", +".. c #FAC66F", +"X. c #F7C173", +"o. c #F7C377", +"O. c #F8C57B", +"+. c #F9C87F", +"@. c #03039B", +"#. c #09099B", +"$. c #0F0F9F", +"%. c #4242AD", +"&. c #4747AE", +"*. c #4646AF", +"=. c #4B4BB0", +"-. c #4B4BB1", +";. c #5050B3", +":. c #5050B4", +">. c #5353B6", +",. c #5455B5", +"<. c #5555B6", +"1. c #5858B7", +"2. c #5858B8", +"3. c #5959B8", +"4. c #5D5DB9", +"5. c #5D5DBA", +"6. c #5C5CBB", +"7. c #5E5EBA", +"8. c #6060B9", +"9. c #6161BC", +"0. c #6161BD", +"q. c #6262BD", +"w. c #6565BC", +"e. c #6666BE", +"r. c #6666BF", +"t. c #6666C0", +"y. c #6A6AC1", +"u. c #6B6BC1", +"i. c #6A6AC2", +"p. c #6F6EC3", +"a. c #6E6EC4", +"s. c #6F6FC4", +"d. c #7272C5", +"f. c #7272C6", +"g. c #7373C6", +"h. c #7676C7", +"j. c #7777C7", +"k. c #797AC9", +"l. c #F98181", +"z. c #FC8181", +"x. c #FA8484", +"c. c #FB8888", +"v. c #FC8B8B", +"b. c #FC8F8F", +"n. c #FC9191", +"m. c #FC9494", +"M. c #FC9595", +"N. c #FD9796", +"B. c #FD9797", +"V. c #FAC983", +"C. c #FBCF86", +"Z. c #FBD18A", +"A. c #8C8CD0", +"S. c #8F8FD1", +"D. c #9191D3", +/* pixels */ +"< , , , > : ; = = = $ $ $ # # O ", +"> B.B.B.B.n.b.v.x.l.l.Z N v c O ", +", B.Z Z V M n x x z j g d p l o ", +"- M.Z B M n b l z j f s p i k X ", +"$.D.k.h.g.s.u.e.q.4.2.<.:.-.e.. ", +"#.S.h.f.p.u.e.0.4.2.<.:.-.&.8. ", +"@.A.f.a.u.t.0.6.2.<.:.-.*.%.4. ", +"F Z... .| { ) ( ! W I I K J ( 6 ", +"F C. .} ' ) ( Q W U P K J H E 8 ", +"S V.+.O.o.X.[ ] ` ` _ _ ~ R R 1 ", +"D A u y t t e w q 0 9 6 5 3 1 4 " +}; diff --git a/src/pixmaps/flags_xpm/an.xpm b/src/pixmaps/flags_xpm/an.xpm new file mode 100644 index 00000000..19068b3f --- /dev/null +++ b/src/pixmaps/flags_xpm/an.xpm @@ -0,0 +1,129 @@ +/* XPM */ +static const char *an[] = { +/* columns rows colors chars-per-pixel */ +"16 11 112 2", +" c #000025", +". c #00002D", +"X c #000031", +"o c #000073", +"O c #000077", +"+ c #000079", +"@ c #D30000", +"# c #D70000", +"$ c #D90000", +"% c #EB0000", +"& c #ED0000", +"* c #EF0000", +"= c #F41E1E", +"- c #F52323", +"; c #F52424", +": c #F62929", +"> c #F62A2A", +", c #F72E2E", +"< c #F72F2F", +"1 c #F83434", +"2 c #F53D3D", +"3 c #F93C3C", +"4 c #F64242", +"5 c #F74646", +"6 c #FA4142", +"7 c #FA4242", +"8 c #FB4747", +"9 c #F74B4B", +"0 c #FC4B4B", +"q c #FC4C4C", +"w c #FD5151", +"e c #FC6565", +"r c #FC6969", +"t c #FD6D6D", +"y c #FD7071", +"u c #141497", +"i c #191999", +"p c #1A1A9C", +"a c #1F1F9C", +"s c #1F1F9E", +"d c #20209E", +"f c #24249D", +"g c #2525A0", +"h c #2525A1", +"j c #2B2BA4", +"k c #3636A6", +"l c #3133AB", +"z c #3636AB", +"x c #3737AB", +"c c #3637AC", +"v c #3B3BA9", +"b c #3F3FAB", +"n c #3B3BAD", +"m c #4040AB", +"M c #4344B2", +"N c #4545B0", +"B c #4648B4", +"V c #494AB2", +"C c #4B4AB4", +"Z c #4F4FB5", +"A c #4F4FB6", +"S c #504FB6", +"D c #5050B7", +"F c #5353B9", +"G c #5454B8", +"H c #5858BA", +"J c #6F6FC3", +"K c #7272C6", +"L c #7676C7", +"P c #8385CB", +"I c #8C8ED0", +"U c #B6B6DD", +"Y c #B9BAE1", +"T c #BBBCE2", +"R c #CBCBCB", +"E c #CFCDCD", +"W c gray81", +"Q c #D1CDCD", +"! c #D7D7D7", +"~ c gray85", +"^ c #DDDDDD", +"/ c #DFDFDF", +"( c #CDCDE7", +") c #CFD0E9", +"_ c #D7D7ED", +"` c #E1E1E1", +"' c gray89", +"] c gray90", +"[ c #E7E7E7", +"{ c #E9E7E7", +"} c #E9E9E9", +"| c gray92", +" . c gray93", +".. c #EFEFF1", +"X. c #F1F1F1", +"o. c gray95", +"O. c #F2F2F3", +"+. c #F3F3F3", +"@. c #F4F2F2", +"#. c #F4F4F4", +"$. c gray96", +"%. c #F6F6F6", +"&. c gray97", +"*. c #F8F8F8", +"=. c #F9F9F9", +"-. c gray98", +";. c #FBFAFA", +":. c #FBFBFB", +">. c gray99", +",. c #FDFDFD", +"<. c #FEFEFE", +"1. c gray100", +/* pixels */ +"X.X.X.X. ...* * * % { [ ] ] ` / ", +"X.1.1.1.1.1.y t r e :.:.&.*.&.^ ", +" .1.1.1.1.>.w 0 8 7 :.&.&.&.&.~ ", +"X.1.:.1.>.1.0 8 7 2 &.&.&.@.&.! ", +"+ L H G D D B T Y c x j f s b X ", +"+ K D Z C _ M n x l U g s p n . ", +"o J Z V m m I ) ( P f a i u k ", +" .1.:.:.1.:.1 , > ; #.#.X.X.+.E ", +"| :.:.:.=.&., > ; = +.X.X.X.X.R ", +"} :.=.=.=.:.9 5 4 2 @.+.#.X.+.R ", +"[ ] ' ` / ^ $ # # @ Q E E R R R " +}; diff --git a/src/pixmaps/flags_xpm/ao.xpm b/src/pixmaps/flags_xpm/ao.xpm new file mode 100644 index 00000000..399170e9 --- /dev/null +++ b/src/pixmaps/flags_xpm/ao.xpm @@ -0,0 +1,131 @@ +/* XPM */ +static const char *ao[] = { +/* columns rows colors chars-per-pixel */ +"16 11 114 2", +" c gray11", +". c #1D1D1D", +"X c #1E1E1E", +"o c gray12", +"O c #202020", +"+ c gray13", +"@ c #222222", +"# c #232323", +"$ c gray15", +"% c #282828", +"& c #2A2A2A", +"* c gray17", +"= c #2C2C2C", +"- c #2D2D2D", +"; c gray18", +": c #2F2F2F", +"> c gray19", +", c #313131", +"< c #323232", +"1 c gray20", +"2 c #343434", +"3 c #353535", +"4 c gray21", +"5 c #373737", +"6 c gray22", +"7 c #393939", +"8 c #3A3A3A", +"9 c gray23", +"0 c #3C3C3C", +"q c gray24", +"w c #3F3F3F", +"e c #6D6D2F", +"r c #7F7F31", +"t c gray25", +"y c #434343", +"u c #882626", +"i c #A32727", +"p c #A52727", +"a c #A82727", +"s c #AB2727", +"d c #B12727", +"f c #B52828", +"g c #B82828", +"h c #BA2828", +"j c #BE2828", +"k c #BF2929", +"l c #C32828", +"z c #C42828", +"x c #C62828", +"c c #C72828", +"v c #CC2929", +"b c #CE2929", +"n c #EB2727", +"m c #EB2B2B", +"M c #EC3131", +"N c #EC3232", +"B c #EC3434", +"V c #ED3838", +"C c #ED3A3A", +"Z c #ED3C3C", +"A c #ED3F3F", +"S c #807F2B", +"D c #ED4141", +"F c #EE4545", +"G c #EE4747", +"H c #EE4F47", +"J c #EE4848", +"K c #EE4C4C", +"L c #EF5A40", +"P c #EF5050", +"I c #EF5353", +"U c #EF5555", +"Y c #F05959", +"T c #F05B5B", +"R c #F05E5E", +"E c #F0645F", +"W c #F06859", +"Q c #F06060", +"! c #F06160", +"~ c #F06262", +"^ c #F16464", +"/ c #F16666", +"( c #F16969", +") c #F16D6D", +"_ c #F26F6F", +"` c #F27373", +"' c #F27676", +"] c #F37C7C", +"[ c #F37F7F", +"{ c #83812D", +"} c #858530", +"| c #ADAD2F", +" . c #B9B72E", +".. c #F3B039", +"X. c #C8C82C", +"o. c #CCCC2C", +"O. c #D8D52B", +"+. c #F4D02E", +"@. c #F4C131", +"#. c #F4C835", +"$. c #F5D730", +"%. c #F5D831", +"&. c #E6E32C", +"*. c #F5E62E", +"=. c #F6F12B", +"-. c #F6F22B", +";. c #F18446", +":. c #F18151", +">. c #F38181", +",. c #F38383", +"<. c #F48585", +"1. c #F48787", +"2. c #F48989", +"3. c #F48A8A", +/* pixels */ +"b v b b v z l l l k j h g g d d ", +"b 3.3.1.3.:.2.>.' ' _ ( ^ ~ T a ", +"v 3._ ) ) / W W %.:.K J D Z U a ", +"v 1.) ( ( W W =.#.=.J A C B P a ", +"x >.^ ~ R T %.I L ..Z V M m J i ", +"j [ ^ R T I ..%.L +.V M m n F u ", +"$ y 9 6 6 | r .&.e > > = = 1 + ", +"# t 5 5 5 { o.X.{ O.= = = % > ", +"@ w 6 3 3 3 ; ; ; ; r % % % ; ", +"@ 9 9 6 6 6 6 3 2 < < < ; ; ; ", +"O @ O O O O O O X X X X " +}; diff --git a/src/pixmaps/flags_xpm/ar.xpm b/src/pixmaps/flags_xpm/ar.xpm new file mode 100644 index 00000000..1921a9a1 --- /dev/null +++ b/src/pixmaps/flags_xpm/ar.xpm @@ -0,0 +1,166 @@ +/* XPM */ +static const char *ar[] = { +/* columns rows colors chars-per-pixel */ +"16 11 149 2", +" c #F5E246", +". c #F6E44B", +"X c #F5E25B", +"o c #F6E361", +"O c #F6E568", +"+ c #F7E668", +"@ c #F8E66C", +"# c #FAEB75", +"$ c #0081DD", +"% c #0083DD", +"& c #0081DF", +"* c #0087DD", +"= c #0087DF", +"- c #0089DD", +"; c #008BE1", +": c #008FE3", +"> c #0091E5", +", c #0093E7", +"< c #0097E9", +"1 c #0099E9", +"2 c #009DEB", +"3 c #039FED", +"4 c #0BA3ED", +"5 c #13A7EF", +"6 c #19A9EF", +"7 c #19ABF1", +"8 c #21AFF3", +"9 c #27B1F5", +"0 c #2BB3F7", +"q c #2DB3F7", +"w c #29B5F9", +"e c #33B5F5", +"r c #35B7F9", +"t c #39B9FB", +"y c #3FBDFD", +"u c #43BDFD", +"i c #43BFFF", +"p c #5FBFF1", +"a c #45C1FD", +"s c #4BC3FD", +"d c #4BC3FF", +"f c #4DC3FF", +"g c #59C7FF", +"h c #62C1F1", +"j c #66C3F2", +"k c #69C5F3", +"l c #6DC7F4", +"z c #77C8F2", +"x c #71C9F5", +"c c #75CBF6", +"v c #77CCF6", +"b c #7BCAF2", +"n c #7CCAF2", +"m c #7FCCF3", +"M c #78CCF7", +"N c #7BCEF7", +"B c #7CCEF8", +"V c #7FD0F8", +"C c #F6EEAB", +"Z c #F8F0B1", +"A c #F9F1B3", +"S c #FBF3B9", +"D c #96BDCE", +"F c #9FC2D5", +"G c #82CDF3", +"H c #84CFF4", +"J c #86D0F5", +"K c #8AD2F6", +"L c #8AD3F7", +"P c #8DD3F7", +"I c #80D0F9", +"U c #82D2F9", +"Y c #83D2FA", +"T c #86D3FA", +"R c #87D4FA", +"E c #8AD5FB", +"W c #8ED7FC", +"Q c #90D5F7", +"! c #93D7F7", +"~ c #93D7F8", +"^ c #96D8F8", +"/ c #96D8F9", +"( c #90D8FD", +") c #93DAFD", +"_ c #96DBFE", +"` c #99D9F9", +"' c #99DAF9", +"] c #9BDBFA", +"[ c #9CDBFA", +"{ c #9EDDFB", +"} c #9FDDFB", +"| c #98DCFE", +" . c #9ADDFE", +".. c #9EDDFC", +"X. c #BFDAE7", +"o. c #A1DDFC", +"O. c #A4DFFC", +"+. c #A7E0FD", +"@. c #A9E2FE", +"#. c #ABE2FE", +"$. c #ABE2FF", +"%. c #ADE3FE", +"&. c #AEE4FE", +"*. c #B0E4FF", +"=. c gray82", +"-. c LightGray", +";. c #D5D5D5", +":. c #C2DCEB", +">. c #D2E6F2", +",. c #D4E8F2", +"<. c #D5E9F3", +"1. c #D6EAF4", +"2. c #D8EAF3", +"3. c #D8ECF5", +"4. c #DAECF6", +"5. c #DAEDF6", +"6. c #DBEEF7", +"7. c #DDEDF6", +"8. c #DCEDF7", +"9. c #DDEFF8", +"0. c #DFF0F9", +"q. c #DEF1F9", +"w. c #DFF1FA", +"e. c #E9E9E9", +"r. c #E0F1FA", +"t. c #E0F2FB", +"y. c #E2F2FB", +"u. c #E3F3FB", +"i. c #E2F4FC", +"p. c #E3F4FD", +"a. c #E5F5FD", +"s. c #E5F6FE", +"d. c #E6F6FE", +"f. c #E9F6FC", +"g. c #EBF8FE", +"h. c gray95", +"j. c #F3F3F3", +"k. c #F4F4F4", +"l. c #F4F5F5", +"z. c gray96", +"x. c #F6F6F6", +"c. c gray97", +"v. c gray98", +"b. c #FBFBFB", +"n. c #FBFCFB", +"m. c gray99", +"M. c #FDFCFD", +"N. c #FDFDFD", +"B. c #FEFEFE", +/* pixels */ +"g f f f d u u y t r q 9 9 7 5 7 ", +"d *.*.&.%.$.$.+.+.o.{ ] ^ ^ ! 2 ", +"i $. . ._ ) ( W R R U V N v K < ", +":.f.s.s.s.p.p.w.w.q.6.6.6.2.7.F ", +"e.B.B.B.m.b.S @ + Z c.k.k.k.k.;.", +"e.B.B.n.m.b.# . + x.k.k.k.k.-.", +"e.B.m.b.b.b.Z o X C k.k.k.h.k.=.", +"X.f.u.u.u.9.9.8.6.3.1.1.1.>.1.D ", +"w ..E I I B N c x l k j h p z $ ", +"0 { [ ' / ! P P K J U G G b b $ ", +"e 8 7 5 4 3 2 1 , > : - * * $ - " +}; diff --git a/src/pixmaps/flags_xpm/as.xpm b/src/pixmaps/flags_xpm/as.xpm new file mode 100644 index 00000000..86e54e9e --- /dev/null +++ b/src/pixmaps/flags_xpm/as.xpm @@ -0,0 +1,178 @@ +/* XPM */ +static const char *as[] = { +/* columns rows colors chars-per-pixel */ +"16 11 161 2", +" c #030000", +". c #770003", +"X c #7B624F", +"o c #810000", +"O c #9B0000", +"+ c #BB0000", +"@ c #C10000", +"# c #98502A", +"$ c #8E4D32", +"% c #D7453C", +"& c #A06440", +"* c #B17B50", +"= c #B94065", +"- c #DB4E42", +"; c #DF5D51", +": c #E05C51", +"> c #DE605F", +", c #D05A73", +"< c #D46C7D", +"1 c #E46C66", +"2 c #E77268", +"3 c #E5786D", +"4 c #E67770", +"5 c #E97F79", +"6 c #EA7E7B", +"7 c #B5835A", +"8 c #B58D6F", +"9 c #BC9B78", +"0 c #BFA672", +"q c #E58B77", +"w c #EA817B", +"e c #EC847A", +"r c #C4A079", +"t c #C5A27E", +"y c #E9CB4B", +"u c #EACE51", +"i c #E9D366", +"p c #EDDC7F", +"a c #00009D", +"s c #0000A1", +"d c #6500B6", +"f c #7339AF", +"g c #0000DF", +"h c #0000E1", +"j c #0000E3", +"k c #0000E7", +"l c #0000E9", +"z c #0000EB", +"x c #0000ED", +"c c #0000EF", +"v c #0000F3", +"b c #0400F2", +"n c #0000F5", +"m c #0000F7", +"M c #0000F9", +"N c #0000FB", +"B c #0000FC", +"V c #0000FD", +"C c #0303FD", +"Z c #0B0BFD", +"A c #0D0BFD", +"S c #0D0DFF", +"D c #1111FF", +"F c #2121FF", +"G c #403DED", +"H c #7755CC", +"J c #5650EC", +"K c #4545F8", +"L c #4C4CF9", +"P c #5757F7", +"I c #5A5AF5", +"U c #5353FA", +"Y c #5A5AFB", +"T c #5F5FF8", +"R c #6F6AF6", +"E c #6565F9", +"W c #6161FC", +"Q c #6C6CF9", +"! c #6F6FFD", +"~ c #7474FA", +"^ c #7474FE", +"/ c #7574FE", +"( c #7C7CFB", +") c #7979FE", +"_ c #7D7DFE", +"` c #BB5786", +"' c #A053B0", +"] c #BA73AE", +"[ c #A16AB6", +"{ c #CD7592", +"} c #E07B81", +"| c #C47DAA", +" . c #9572CF", +".. c #888A8C", +"X. c #9E9A98", +"o. c #9D9D9D", +"O. c #A28C81", +"+. c #BDA086", +"@. c #A0A099", +"#. c #A0A09E", +"$. c #A2A2A2", +"%. c #A5A5A5", +"&. c #E58080", +"*. c #E88C80", +"=. c #EB8C81", +"-. c #E79397", +";. c #E99391", +":. c #EE9694", +">. c #C3A78E", +",. c #CEB095", +"<. c #D2B59E", +"1. c #F2A19A", +"2. c #F1AB9F", +"3. c #C691BC", +"4. c #F3AFA7", +"5. c #F3AAA8", +"6. c #ECB8B0", +"7. c #F4BBB2", +"8. c #EED980", +"9. c #F0DE93", +"0. c #F0E4AF", +"q. c #9A86E9", +"w. c #8384FC", +"e. c #8A8AFD", +"r. c #9B91F0", +"t. c #9191FD", +"y. c #9595FD", +"u. c #9797FD", +"i. c #9A9AFD", +"p. c #9E9EFD", +"a. c #A1A1FE", +"s. c #A4A4FE", +"d. c #A7A6FE", +"f. c #A7A7FE", +"g. c #A8A8FF", +"h. c #A8A9FF", +"j. c #A9A9FF", +"k. c #B1A4F0", +"l. c #F3C9C2", +"z. c #F8CFC7", +"x. c #EDD6C5", +"c. c #F0D6CE", +"v. c #E3DAD3", +"b. c #E4E4C5", +"n. c #EAE0C2", +"m. c #E9E8C9", +"M. c #E8E9CF", +"N. c #F0E8C2", +"B. c #F9E4DC", +"V. c #E4E0E2", +"C. c #F8F1E9", +"Z. c #F4F4F0", +"A. c #F4F4F4", +"S. c #F6F6F6", +"D. c gray97", +"F. c #FAF1F0", +"G. c #F8F6F6", +"H. c #F8F8F8", +"J. c #F9F9F9", +"K. c gray98", +"L. c #FBFBFB", +/* pixels */ +"F D D D Z B B B M M M m a . + @ ", +"S j.j.f.s.p.p.i.u.r.3.-.;.5.z.O.", +"D f._ ) ^ ! R [ < 1 6 7.x.>.9 X ", +"D f.) ^ .{ 3 5 4.C.H.,.* $ +.X.", +"A k.| &.w 1.B.L.J.H.<.7 8 # r ..", +"d :.e 2.F.L.L.L.H.p Z.M.V.& t o.", +"b q.] } 2 =.l.G.H.S.0.p m.r v.%.", +"B u.W I H ` > : q c.Z.i u y 9.#.", +"M t.Y U J K F f = % - q n.b.N.$.", +"M e.w.( ~ ~ ~ T Y J ' , ; 3 6.@.", +"m m m c l l l j j j j g s o O " +}; diff --git a/src/pixmaps/flags_xpm/at.xpm b/src/pixmaps/flags_xpm/at.xpm new file mode 100644 index 00000000..2775dd2e --- /dev/null +++ b/src/pixmaps/flags_xpm/at.xpm @@ -0,0 +1,143 @@ +/* XPM */ +static const char *at[] = { +/* columns rows colors chars-per-pixel */ +"16 11 126 2", +" c #DD0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #ED0000", +"% c #EF0000", +"& c #F10000", +"* c #F30000", +"= c #F50000", +"- c #F70000", +"; c #F90000", +": c #FB0000", +"> c #FD0000", +", c red", +"< c #F10B0B", +"1 c #F10F0E", +"2 c #F21313", +"3 c #F31919", +"4 c #F41E1E", +"5 c #F52323", +"6 c #F62929", +"7 c #F22C2C", +"8 c #F22F2F", +"9 c #F62C2C", +"0 c #F72E2E", +"q c #FB2F2F", +"w c #F23232", +"e c #F73131", +"r c #F33535", +"t c #F83434", +"y c #F83737", +"u c #FF3535", +"i c #F43939", +"p c #F53D3D", +"a c #F93A3A", +"s c #F93C3D", +"d c #FA3F3F", +"f c #F64242", +"g c #F74646", +"h c #FA4242", +"j c #FA4444", +"k c #FB4747", +"l c #F74949", +"z c #F74B4B", +"x c #F74E4E", +"c c #FC4C4C", +"v c #F85050", +"b c #F85353", +"n c #FD5151", +"m c #F95455", +"M c #F95757", +"N c #FD5454", +"B c #F95858", +"V c #FE5959", +"C c #FA5C5C", +"Z c #FA5D5D", +"A c #FE5C5C", +"S c #FE5F5F", +"D c #F26363", +"F c #F26666", +"G c #FB6060", +"H c #FB6162", +"J c #FC6565", +"K c #FC6666", +"L c #F06868", +"P c #F36A6A", +"I c #F46E6E", +"U c #F66E6E", +"Y c #FC6969", +"T c #FD6D6D", +"R c #F57171", +"E c #F77272", +"W c #F67575", +"Q c #FD7071", +"! c #F87676", +"~ c #FE7474", +"^ c #FE7777", +"/ c #F37A7A", +"( c #F77879", +") c #F67F7F", +"_ c #F97A7A", +"` c #FE7979", +"' c #FF7B7A", +"] c #FF7B7B", +"[ c #F87C7C", +"{ c #FA7D7D", +"} c #F98080", +"| c #FB8181", +" . c #FA8484", +".. c #FC8585", +"X. c #FB8888", +"o. c #FB8B8B", +"O. c #FD8888", +"+. c #FD8B8B", +"@. c #FE8F8F", +"#. c #FE9091", +"$. c #FCA0A0", +"%. c #FEA4A4", +"&. c #DFDFDF", +"*. c #E1E1E1", +"=. c #E2E2E2", +"-. c gray91", +";. c #E9E9E9", +":. c #EAEAEA", +">. c #EEEEEE", +",. c #EFEFEF", +"<. c gray94", +"1. c #F1F1F1", +"2. c #F4F4F4", +"3. c #F4F5F5", +"4. c gray96", +"5. c #F6F6F6", +"6. c gray97", +"7. c #F8F8F8", +"8. c #F9F9F9", +"9. c gray98", +"0. c #FBFBFB", +"q. c #FBFCFB", +"w. c gray99", +"e. c #FDFCFD", +"r. c #FDFDFD", +"t. c #FEFEFE", +/* pixels */ +", , , , , , : : : : = * * * $ $ ", +", ] ] ] ~ ~ ~ T Y J S C M b x # ", +", ] S A A N n c k h s a e 9 l # ", +"u %.@.@.O.O. .} { ( ! E U L ) O ", +";.t.t.t.9.t.9.9.9.6.6.1.<.;.6.=.", +";.t.t.t.9.9.9.9.6.6.6.,.,.;.2.=.", +";.t.t.q.9.9.9.6.6.6.6.,.,.-.<.=.", +"q #.o.o. .} ) ( W R U L F D / . ", +"= J k s i t 9 6 5 4 3 2 1 < 8 . ", +": G S B M v c g f p i r w 8 7 ", +"* * * $ $ $ # O O O o o . " +}; diff --git a/src/pixmaps/flags_xpm/au.xpm b/src/pixmaps/flags_xpm/au.xpm new file mode 100644 index 00000000..fc562a3e --- /dev/null +++ b/src/pixmaps/flags_xpm/au.xpm @@ -0,0 +1,183 @@ +/* XPM */ +static const char *au[] = { +/* columns rows colors chars-per-pixel */ +"16 11 166 2", +" c #000003", +". c #000005", +"X c #00000D", +"o c #00000F", +"O c #000013", +"+ c #000017", +"@ c #000019", +"# c #00001B", +"$ c #00001F", +"% c #000025", +"& c #000029", +"* c #00002D", +"= c #00002F", +"- c #000035", +"; c #000037", +": c #000039", +"> c #00003B", +", c #00003F", +"< c #000041", +"1 c #000049", +"2 c #00004D", +"3 c #000051", +"4 c #000053", +"5 c #000059", +"6 c #00005B", +"7 c #00005F", +"8 c #000063", +"9 c #000B73", +"0 c #753D69", +"q c #6B4575", +"w c #CD0909", +"e c #8D2743", +"r c #912541", +"t c #8F3555", +"y c #D6666A", +"u c #E26564", +"i c #E46C6B", +"p c #E7716F", +"a c #E06F70", +"s c #E97A79", +"d c #002387", +"f c #1B3B87", +"g c #003795", +"h c #203F8B", +"j c #254183", +"k c #22408A", +"l c #29468F", +"z c #28478F", +"x c #304D93", +"c c #304D94", +"v c #314D94", +"b c #314E94", +"n c #325095", +"m c #355196", +"M c #355197", +"N c #355297", +"B c #365297", +"V c #385499", +"C c #3A5699", +"Z c #3B569A", +"A c #3C5798", +"S c #3D599B", +"D c #3E5A9C", +"F c #4B4D8D", +"G c #40599A", +"H c #435C9B", +"J c #405B9D", +"K c #435D9D", +"L c #405C9E", +"P c #445E9D", +"I c #455F9E", +"U c #475E9E", +"Y c #48619F", +"T c #49639F", +"R c #405DA0", +"E c #445FA0", +"W c #4A63A1", +"Q c #4862A2", +"! c #4962A2", +"~ c #4A63A2", +"^ c #4C65A3", +"/ c #4F6AA8", +"( c #4C6CAB", +") c #4C6CAC", +"_ c #5069A4", +"` c #5068A5", +"' c #536AA6", +"] c #576AA6", +"[ c #5F6EA7", +"{ c #556EA8", +"} c #576FAA", +"| c #5271AE", +" . c #5A71A9", +".. c #5A72A9", +"X. c #5870AB", +"o. c #5B72AA", +"O. c #5D74AC", +"+. c #5D74AD", +"@. c #5A7AB6", +"#. c #667BB1", +"$. c #697EB3", +"%. c #697FB3", +"&. c #8A749B", +"*. c #8C789E", +"=. c #B77187", +"-. c #877FA7", +";. c #C77783", +":. c #E17F80", +">. c #6D81B3", +",. c #6F84B6", +"<. c #7F89B7", +"1. c #7285B8", +"2. c #7086B8", +"3. c #7186B8", +"4. c #7589BA", +"5. c #778ABB", +"6. c #778EBD", +"7. c #B38298", +"8. c #9A89A9", +"9. c #9495BB", +"0. c #A490AC", +"q. c #CA8794", +"w. c #C88B97", +"e. c #DB8C91", +"r. c #E28284", +"t. c #E68E8F", +"y. c #DCA4AA", +"u. c #DDACB3", +"i. c #DEB8BE", +"p. c #F1A4A2", +"a. c #F1A7A5", +"s. c #E8B9BE", +"d. c #8D9BC1", +"f. c #8F9EC2", +"g. c #909EC2", +"h. c #94A3C5", +"j. c #97A4C5", +"k. c #94A4C8", +"l. c #9AA9CA", +"z. c #9AA8CB", +"x. c #9DABCC", +"c. c #9FB9DB", +"v. c #A1A2C2", +"b. c #A5B2CF", +"n. c #A4B0D0", +"m. c #A6B3D0", +"M. c #ACB6D2", +"N. c #A9B5D4", +"B. c #AEB8D3", +"V. c #B2BBD4", +"C. c #B3BCD4", +"Z. c #B6BFD4", +"A. c #BAC2D9", +"S. c #BAC4DA", +"D. c #DDC3CC", +"F. c #C3CADD", +"G. c #EAC6C9", +"H. c #E8CCD1", +"J. c #EDD8DC", +"K. c #C4CCE0", +"L. c #C8D0E1", +"P. c #C9D0E2", +"I. c #E5DDE6", +"U. c #DBE0EB", +"Y. c #E0E2EA", +"T. c #E7E9F0", +/* pixels */ +";.-.g e r d 0 =.9 8 7 6 T 4 , : ", +"F G.I.u.y.G.J.n.5.1.$.K.K.m.+.: ", +"w t.s i y p a y [ / ~ #.M.B } ; ", +"t s.p.:.r.a.e.7.] x.~ D B B.>.* ", +"<.H.v.w.q.c.i.0.l.A.S.B d.C.V.% ", +"q 9.@.*.&.) 2.8.I b.X.c ~ f.Y % ", +"8 6.+.| ( ` ~ E L V B b h.b I $ ", +"7 5.X.n.P.~ E D Z B b l f k H @ ", +"6 1.X.U.T.l.D V B x z H j.f G + ", +"4 ,.>.k.F.X.X.] ` ^ I Z.Y.g.Z X ", +"2 1 , : - * & % $ @ O X j . " +}; diff --git a/src/pixmaps/flags_xpm/aw.xpm b/src/pixmaps/flags_xpm/aw.xpm new file mode 100644 index 00000000..89ba6c19 --- /dev/null +++ b/src/pixmaps/flags_xpm/aw.xpm @@ -0,0 +1,186 @@ +/* XPM */ +static const char *aw[] = { +/* columns rows colors chars-per-pixel */ +"16 11 169 2", +" c #E26D6D", +". c #E37171", +"X c #DDAF00", +"o c #DFB300", +"O c #F7D500", +"+ c #FBDB00", +"@ c #F2DB27", +"# c #F2DC2C", +"$ c #F3DE2F", +"% c #F4DF34", +"& c #F5E139", +"* c #F6E23E", +"= c #F2DD40", +"- c #F2DF42", +"; c #F2DF46", +": c #F3DF46", +"> c #F7E343", +", c #F3E149", +"< c #F4E24B", +"1 c #F8E548", +"2 c #F9E64D", +"3 c #F5E350", +"4 c #F6E354", +"5 c #FAE852", +"6 c #FBE957", +"7 c #F7E558", +"8 c #F7E65C", +"9 c #FBEA5C", +"0 c #F8E861", +"q c #F9E965", +"w c #F9EA69", +"e c #FAEB6E", +"r c #FBED72", +"t c #FCEE7A", +"y c #001F85", +"u c #00338F", +"i c #002391", +"p c #002593", +"a c #002995", +"s c #002D95", +"d c #002D97", +"f c #003991", +"g c #003F93", +"h c #003199", +"j c #00379D", +"k c #003BA1", +"l c #003FA3", +"z c #004597", +"x c #004B9B", +"c c #004D9D", +"v c #0045A7", +"b c #004BAB", +"n c #005DA7", +"m c #0051AD", +"M c #0055B1", +"N c #005BB5", +"B c #0061A9", +"V c #0063AB", +"C c #0067AF", +"Z c #0061B7", +"A c #006DB1", +"S c #006DB5", +"D c #006FBF", +"F c #0071B3", +"G c #0075B7", +"H c #0079B9", +"J c #007DBD", +"K c #007DBF", +"L c #0581BD", +"P c #0781C1", +"I c #0B83C1", +"U c #0D87C1", +"Y c #0F87C3", +"T c #0F89C3", +"R c #0F8BC5", +"E c #1189C5", +"W c #158BC5", +"Q c #1991C9", +"! c #1D91C9", +"~ c #2191C7", +"^ c #3694C4", +"/ c #3A96C6", +"( c #3E98C7", +") c #3F99C8", +"_ c #439BC9", +"` c #449BC9", +"' c #459BC9", +"] c #479ECB", +"[ c #489ECB", +"{ c #499ECB", +"} c #4B9FCA", +"| c #4CA1CD", +" . c #4DA1CD", +".. c #4EA1CC", +"X. c #4FA2CC", +"o. c #50A2CC", +"O. c #51A3CF", +"+. c #55A3CC", +"@. c #51A4CF", +"#. c #53A4CE", +"$. c #54A5CE", +"%. c #55A6CE", +"&. c #5BA7CF", +"*. c #58A8CF", +"=. c #54A6D1", +"-. c #57A7D0", +";. c #56A7D1", +":. c #59A8D0", +">. c #59A9D0", +",. c #59A9D3", +"<. c #5BAAD3", +"1. c #5FA9D0", +"2. c #5EABD1", +"3. c #5CAAD2", +"4. c #5EABD2", +"5. c #5EABD4", +"6. c #62AED3", +"7. c #64ADD2", +"8. c #60ACD4", +"9. c #61ADD4", +"0. c #63AED4", +"q. c #62AED6", +"w. c #63AFD6", +"e. c #64AFD6", +"r. c #68AFD3", +"t. c #66B0D5", +"y. c #67B0D5", +"u. c #67B1D5", +"i. c #69B2D7", +"p. c #6AB3D7", +"a. c #6BB3D7", +"s. c #6CB2D5", +"d. c #67B1D8", +"f. c #68B1D8", +"g. c #6DB4D9", +"h. c #6EB5D8", +"j. c #6EB6D8", +"k. c #6FB6D8", +"l. c #6CB4DA", +"z. c #70B4D7", +"x. c #70B6DB", +"c. c #71B6DB", +"v. c #72B7DA", +"b. c #73B7DA", +"n. c #75B7D8", +"m. c #76BADB", +"M. c #74B9DC", +"N. c #75BADC", +"B. c #76BADC", +"V. c #79B9D9", +"C. c #7CBBDB", +"Z. c #7EBBDA", +"A. c #7DBFDF", +"S. c #7BBFE0", +"D. c #E88989", +"F. c #80BEDD", +"G. c #83BFDF", +"H. c #84C0DD", +"J. c #87C2DF", +"K. c #9DC4DD", +"L. c #9FC4DC", +"P. c #8AC3E0", +"I. c #8AC3E2", +"U. c #8DC5E2", +"Y. c #8EC6E2", +"T. c #8FC7E2", +"R. c #91C8E3", +"E. c #91C8E4", +"W. c #99C8E1", +/* pixels */ +"~ W Q E E I L K H G F A C V n V ", +"T L.D.W.E.U.U.J.J.H.F.Z.V.n.z.c ", +"Q D.. S.m.v.v.s.u.6.2.&.%.s.x ", +"E L. Z.m.v.j.i.i.6.2.*.#.o.r.z ", +"T R.S.N.M.g.i.y.6.2.*.#.X.{ 7.z ", +"P U.N.l.g.i.e.9.2.%.#...{ ' &.u ", +"K I.k.k.f.e.8.<.;.#...] ' ) &.u ", +"+ t 9 6 5 2 1 > * & % % # @ > o ", +"S F.d.9.5.,.=.O.| ] _ ) / ^ +.y ", +"O r r w q 0 8 7 4 3 < , ; - - X ", +"D Z N M b b v l k j h d s i i s " +}; diff --git a/src/pixmaps/flags_xpm/ax.xpm b/src/pixmaps/flags_xpm/ax.xpm new file mode 100644 index 00000000..d2784e02 --- /dev/null +++ b/src/pixmaps/flags_xpm/ax.xpm @@ -0,0 +1,189 @@ +/* XPM */ +static const char *ax[] = { +/* columns rows colors chars-per-pixel */ +"16 11 172 2", +" c #000047", +". c #00004B", +"X c #00004D", +"o c #00004F", +"O c #000055", +"+ c #00005B", +"@ c #000061", +"# c #000065", +"$ c #000067", +"% c #000069", +"& c #000075", +"* c #00007B", +"= c #D30000", +"- c #E10000", +"; c #FD1309", +": c #FD1D0F", +"> c #EC2C25", +", c #EE342C", +"< c #EF3B33", +"1 c #CB5900", +"2 c #CF6B00", +"3 c #DD6F00", +"4 c #F1433C", +"5 c #ED4A42", +"6 c #F34943", +"7 c #F45348", +"8 c #F4514A", +"9 c #F55A50", +"0 c #F65852", +"q c #F75C59", +"w c #F75D59", +"e c #F4685F", +"r c #F96060", +"t c #FA6A66", +"y c #FA6C68", +"u c #FB736E", +"i c #FB776F", +"p c #FC7873", +"a c #FC7D75", +"s c #CF8D00", +"d c #FBAF15", +"f c #F7B111", +"g c #F9BB23", +"h c #E8AF31", +"j c #EAB237", +"k c #ECB63F", +"l c #EFC12D", +"z c #EAB940", +"x c #EDBA45", +"c c #EDBC48", +"v c #EBBA4D", +"b c #F0BD4C", +"n c #F2BC51", +"m c #F6BA60", +"M c #EFC04E", +"N c #EDC15A", +"B c #F2C054", +"V c #F0C355", +"C c #F4C259", +"Z c #F3C65A", +"A c #F2C65C", +"S c #EBCB66", +"D c #F2C367", +"F c #F3C963", +"G c #F9C46F", +"H c #F6CF6A", +"J c #F9CB6E", +"K c #F0D26B", +"L c #FACE76", +"P c #EDD179", +"I c #F8D074", +"U c #FAD27B", +"Y c #FBD37B", +"T c #FBD07C", +"R c #000987", +"E c #000789", +"W c #000B89", +"Q c #00118F", +"! c #00178F", +"~ c #002195", +"^ c #002B9B", +"/ c #00339F", +"( c #0033A1", +") c #0035A1", +"_ c #003DA5", +"` c #014BA5", +"' c #0043AB", +"] c #0045AF", +"[ c #0B53A9", +"{ c #1A59AB", +"} c #215DAE", +"| c #1F63BB", +" . c #1D61BD", +".. c #1F61BD", +"X. c #1F63BD", +"o. c #2560AB", +"O. c #2C65AE", +"+. c #2762B1", +"@. c #2365B7", +"#. c #2D67B4", +"$. c #2569BB", +"%. c #2769BD", +"&. c #326AB1", +"*. c #376FB0", +"=. c #356DB7", +"-. c #396FB5", +";. c #3B6DBF", +":. c #3B72B3", +">. c #3B70B7", +",. c #3F75B4", +"<. c #4475B6", +"1. c #4679B7", +"2. c #4175B9", +"3. c #457AB8", +"4. c #477ABC", +"5. c #4A7EBA", +"6. c #4C7FBB", +"7. c #487ABD", +"8. c #487BC0", +"9. c #4C7EC1", +"0. c #4F81BD", +"q. c #5384BF", +"w. c #4F81C3", +"e. c #5583C3", +"r. c #5686C7", +"t. c #5B8AC2", +"y. c #5E8AC0", +"u. c #5F8AC3", +"i. c #5E8BCA", +"p. c #5E8CC8", +"a. c #5F8FCB", +"s. c #628FC5", +"d. c #6593C8", +"f. c #6491CD", +"g. c #6792CF", +"h. c #6892C9", +"j. c #6F98C9", +"k. c #6C98CB", +"l. c #759BC7", +"z. c #729CCD", +"x. c #749CCC", +"c. c #749DCF", +"v. c #789FCD", +"b. c #6A92D3", +"n. c #78A0D0", +"m. c #79A1D3", +"M. c #7EA5D3", +"N. c #7FA5D3", +"B. c #FC928E", +"V. c #FD968F", +"C. c #F5DC85", +"Z. c #FBD881", +"A. c #FBD987", +"S. c #F5DB8B", +"D. c #FCDB94", +"F. c #FCDA96", +"G. c #FCE19D", +"H. c #F7E2A2", +"J. c #83A9D5", +"K. c #86AAD5", +"L. c #84A9D8", +"P. c #86ABDA", +"I. c #88AADA", +"U. c #89ACD8", +"Y. c #89ACDD", +"T. c #8FB0D8", +"R. c #93B3D7", +"E. c #9FBCDF", +"W. c #9CBAE2", +"Q. c #9EBCE2", +"!. c #9EBDE2", +"~. c #9EBCE3", +/* pixels */ +"%.| X.X.l : d [ ' _ ( ^ ~ ! R R ", +"$.!.W.W.H.V.F.R.I.J.M.n.c.k.d.* ", +"X.!.Y.P.S.a T v.b.f.i.r.w.8.p.& ", +"@.E.U.K.C.i L l.h.s.t.e.5.1.y.# ", +"g F.A.Z.U y G H F A V c c z N 2 ", +"; V.p u t r q 9 8 6 4 < , > 5 = ", +"f F.U I J w m Z B b x k j j v 1 ", +"` T.c.j.K 9 C 9.7.2.-.&.O.o.<.X ", +"' L.g.f.S 7 n 4.;.=.#.+.} { >.X ", +"( N.m.v.P t D y.e.q.5.1.,.:.*.. ", +"( ~ Q E s = 3 % % @ + O X . . " +}; diff --git a/src/pixmaps/flags_xpm/az.xpm b/src/pixmaps/flags_xpm/az.xpm new file mode 100644 index 00000000..0fdfe1ed --- /dev/null +++ b/src/pixmaps/flags_xpm/az.xpm @@ -0,0 +1,185 @@ +/* XPM */ +static const char *az[] = { +/* columns rows colors chars-per-pixel */ +"16 11 168 2", +" c #002700", +". c #002900", +"X c #002D00", +"o c #002F00", +"O c #003300", +"+ c #003500", +"@ c #003900", +"# c #003D00", +"$ c #004100", +"% c #004700", +"& c #004D00", +"* c #005100", +"= c #005700", +"- c #005D00", +"; c #006300", +": c #006700", +"> c #006F00", +", c #007500", +"< c #007D00", +"1 c #870000", +"2 c #930000", +"3 c #950000", +"4 c #970000", +"5 c #990000", +"6 c #BB0000", +"7 c #C10000", +"8 c #C30101", +"9 c #C30303", +"0 c #C73C3C", +"q c #CB3E41", +"w c #C94040", +"e c #CD4345", +"r c #CA4444", +"t c #CA4545", +"y c #CF474A", +"u c #CD4948", +"i c #CC4949", +"p c #CF4D4D", +"a c #CE4E4E", +"s c #CF4F4F", +"d c #CE5858", +"f c #D15251", +"g c #D05252", +"h c #D05353", +"j c #D25556", +"k c #D25858", +"l c #D35B5B", +"z c #D25A5C", +"x c #D45D5D", +"c c #D55F5F", +"v c #D95D60", +"b c #D26060", +"n c #D66161", +"m c #D46261", +"M c #D76363", +"N c #D56767", +"B c #D76666", +"V c #D96867", +"C c #DB6769", +"Z c #D76868", +"A c #D96868", +"S c #D96A6A", +"D c #DC6B6D", +"F c #DA6C6C", +"G c #DB6E6E", +"H c #DD6F71", +"J c #DD7070", +"K c #DC7171", +"L c #DC7272", +"P c #D97274", +"I c #DD7574", +"U c #DD7575", +"Y c #DE7676", +"T c #DF7877", +"R c #DE7979", +"E c #DE797A", +"W c #DF7B7C", +"Q c #DB7D7C", +"! c #0B9A39", +"~ c #0F9C3C", +"^ c #139F40", +"/ c #18A145", +"( c #1EA349", +") c #23A54D", +"_ c #2CA253", +"` c #29A550", +"' c #2FA455", +"] c #2EAB55", +"[ c #2FA956", +"{ c #32A558", +"} c #35A85B", +"| c #34AE5B", +" . c #39A95F", +".. c #3DAC62", +"X. c #3AB160", +"o. c #3FB364", +"O. c #42AE65", +"+. c #46B069", +"@. c #44B669", +"#. c #4BB26D", +"$. c #50B471", +"%. c #54B775", +"&. c #58B979", +"*. c #5DBC7D", +"=. c #004D9D", +"-. c #005DA7", +";. c #0053A9", +":. c #0061A9", +">. c #0063AB", +",. c #0067AF", +"<. c #006DB1", +"1. c #0071B3", +"2. c #0075B7", +"3. c #0079B9", +"4. c #007DBD", +"5. c #0081BD", +"6. c #61BE80", +"7. c #66C384", +"8. c #0083C1", +"9. c #0085C3", +"0. c #0087C3", +"q. c #0089C3", +"w. c #008FCD", +"e. c #0091C7", +"r. c #2CAAD4", +"t. c #31ADD6", +"y. c #37AFD8", +"u. c #3DB2DA", +"i. c #4EB4D7", +"p. c #42B4DB", +"a. c #47B6DC", +"s. c #49B5DA", +"d. c #4CB7DC", +"f. c #53B7D8", +"g. c #51BADF", +"h. c #58B9D9", +"j. c #5CBBDB", +"k. c #61BEDD", +"l. c #54BDE0", +"z. c #59BFE2", +"x. c #65C0DD", +"c. c #69C2DF", +"v. c #5CC0E3", +"b. c #5FC2E3", +"n. c #6DC3E0", +"m. c #70C5E2", +"M. c #74C7E2", +"N. c #77C8E3", +"B. c #79C9E4", +"V. c #7BCAE4", +"C. c #7BCDE8", +"Z. c #E18787", +"A. c #E0898A", +"S. c #E48A8B", +"D. c #E38E8F", +"F. c #E58F8F", +"G. c #E59393", +"H. c #E59B9C", +"J. c #E4AAAA", +"K. c #E9B5B6", +"L. c #EABAB9", +"P. c #EDBFC1", +"I. c #EFC2C1", +"U. c #EFCDCD", +"Y. c #F0CECE", +"T. c #F1D8D9", +"R. c #F4DCDC", +"E. c #F4E2E2", +/* pixels */ +"e.q.q.q.9.8.5.4.3.2.1.<.,.>.-.:.", +"9.V.V.V.V.M.n.n.n.x.k.j.h.f.i.=.", +"w.C.b.z.z.l.g.d.a.p.u.y.t.r.s.;.", +"8 G.W E U L G S N M x j h s N 4 ", +"8 G.T U J V I.R.H.L.Q g a i M 5 ", +"8 D.U L Z S.E.Z U.T.J.a i t b 4 ", +"8 S.H D S v P.Y.E K.P y r q l 2 ", +"6 Z.S Z M c l j g a i t q 0 d 1 ", +"! 7.@.o.X.| [ ` ) ( / ~ ~ ! [ @ ", +"; *.*.&.%.$.#.+.O... .} } ' _ ", +"> ; ; - = * & % $ # @ O X X . + " +}; diff --git a/src/pixmaps/flags_xpm/ba.xpm b/src/pixmaps/flags_xpm/ba.xpm new file mode 100644 index 00000000..1007ef82 --- /dev/null +++ b/src/pixmaps/flags_xpm/ba.xpm @@ -0,0 +1,172 @@ +/* XPM */ +static const char *ba[] = { +/* columns rows colors chars-per-pixel */ +"16 11 155 2", +" c #555353", +". c #797878", +"X c #807E7E", +"o c #EBAF00", +"O c #F3AF00", +"+ c #F5B300", +"@ c #F7B300", +"# c #F9B700", +"$ c #F7B900", +"% c #FBB900", +"& c #FDBD00", +"* c #F1C50E", +"= c #F2C714", +"- c #F3C819", +"; c #F3C919", +": c #F4CB1F", +"> c #F4CC1F", +", c #F3CA25", +"< c #F5CC25", +"1 c #F5CD25", +"2 c #F6CF2B", +"3 c #F6D02B", +"4 c #F1CB33", +"5 c #F7D030", +"6 c #F7D131", +"7 c #F8D236", +"8 c #F8D337", +"9 c #F6D13E", +"0 c #F9D43D", +"q c #F9D63C", +"w c #FAD542", +"e c #FBD947", +"r c #F7D44A", +"t c #FBD84D", +"y c #F8D754", +"u c #F9DA57", +"i c #FADC5C", +"p c #FBDD60", +"a c #FCDD65", +"s c #FCDF69", +"d c #FDE16D", +"f c #FCE071", +"g c #FAE077", +"h c #00008F", +"j c #000091", +"k c #000093", +"l c #000097", +"z c #000099", +"x c #00009B", +"c c #00009D", +"v c #00009F", +"b c #0000A1", +"n c #0000A3", +"m c #0000A5", +"M c #0000A9", +"N c #0000AD", +"B c #0000AF", +"V c #0000B3", +"C c #0000B7", +"Z c #0000B9", +"A c #0000BD", +"S c #0000BF", +"D c #0000C3", +"F c #0000C5", +"G c #0000C7", +"H c #0000C9", +"J c #0000CB", +"K c #0B2FCB", +"L c #1033CC", +"P c #1438CE", +"I c #1A3CCF", +"U c #2042D2", +"Y c #2344D3", +"T c #2647D3", +"R c #2C4BD1", +"E c #2F4DD2", +"W c #2949D5", +"Q c #2C4CD5", +"! c #2E4ED6", +"~ c #2F4ED7", +"^ c #2547DB", +"/ c #3350D3", +"( c #3453D7", +") c #3654D4", +"_ c #3B58D6", +"` c #3D5AD7", +"' c #3F5CD7", +"] c #3453D8", +"[ c #3A57D9", +"{ c #3A58D9", +"} c #3B58DA", +"| c #3F5CDB", +" . c #425ED8", +".. c #405DDB", +"X. c #405DDC", +"o. c #4460D9", +"O. c #4662DA", +"+. c #4461DC", +"@. c #4561DD", +"#. c #4562DD", +"$. c #4662DD", +"%. c #4965DB", +"&. c #4B66DB", +"*. c #4966DE", +"=. c #4B66DE", +"-. c #4E69DC", +";. c #506ADD", +":. c #536DDD", +">. c #546EDD", +",. c #5872DF", +"<. c #5F76DC", +"1. c #687EDF", +"2. c #4F6AE0", +"3. c #4F6BE0", +"4. c #506BE0", +"5. c #536FE1", +"6. c #546FE1", +"7. c #5872E2", +"8. c #5D76E1", +"9. c #5C75E4", +"0. c #5F79E4", +"q. c #617AE2", +"w. c #667EE3", +"e. c #7989CF", +"r. c #7286DF", +"t. c #6A82E5", +"y. c #6F85E6", +"u. c #7086E2", +"i. c #7288E7", +"p. c #798DE5", +"a. c #768BE8", +"s. c #798EE8", +"d. c #7B8FE8", +"f. c #7B90E9", +"g. c #888686", +"h. c #8A8989", +"j. c #8F8D8D", +"k. c #969494", +"l. c #9D9B9B", +"z. c #A2A1A1", +"x. c #B5B3B3", +"c. c #8194E8", +"v. c #879AEA", +"b. c #8D9FEC", +"n. c #B8C3F3", +"m. c #D0D5EE", +"M. c #D4D8EF", +"N. c #CDD5F7", +"B. c #D8DCF1", +"V. c #DBDFF4", +"C. c #DDE2F0", +"Z. c #DEE2F6", +"A. c #E1E5F8", +"S. c #E3E7F9", +"D. c #E9EDFC", +/* pixels */ +"J ^ N. $ o & & % % @ @ O V B B ", +"J f.n.D.x.g f d s a p i u :.-.M ", +"J s.0.b.A.z.y t e w 0 7 6 Q %.m ", +"J s.9.7.v.A.l.r w q 7 6 2 T o.b ", +"G a.7.6.4.c.Z.k.9 8 3 2 1 U ' c ", +"G i.6.2.*.@.p.Z.j.4 3 1 : I _ z ", +"G u.2.*.@.X.} u.B.g., : ; P ) l ", +"D t.*.@.X.} ] ~ w.M.X ; = L / k ", +"S w.O.| [ ( ~ W Y 1.m.. * K E h ", +"S q.8.,.>.;.%.O.' _ r.C.h.E R h ", +"Z C V B B M m b c z z B e.M h h " +}; diff --git a/src/pixmaps/flags_xpm/bb.xpm b/src/pixmaps/flags_xpm/bb.xpm new file mode 100644 index 00000000..5a95ea1f --- /dev/null +++ b/src/pixmaps/flags_xpm/bb.xpm @@ -0,0 +1,177 @@ +/* XPM */ +static const char *bb[] = { +/* columns rows colors chars-per-pixel */ +"16 11 160 2", +" c #00001F", +". c #000021", +"X c #000025", +"o c #00002B", +"O c #00002F", +"+ c #000031", +"@ c #000035", +"# c #000039", +"$ c #00003B", +"% c #74662A", +"& c #72652F", +"* c #7C6E35", +"= c #7D6F36", +"- c #7F7136", +"; c #000041", +": c #000047", +"> c #00004D", +", c #000053", +"< c #000059", +"1 c #00005D", +"2 c #00005F", +"3 c #000063", +"4 c #000067", +"5 c #000069", +"6 c #00006F", +"7 c #000073", +"8 c #000077", +"9 c #00007B", +"0 c #00007D", +"q c #00007F", +"w c #00037F", +"e c #8C7A2F", +"r c #82743B", +"t c #81743C", +"y c #86783C", +"u c #897B41", +"i c #887B46", +"p c #AE9430", +"a c #E79300", +"s c #E59F00", +"d c #E99900", +"f c #E3A300", +"g c #EBA900", +"h c #EDB300", +"j c #FBB900", +"k c #FDBD00", +"l c #F7C500", +"z c #F9C300", +"x c #FDCF00", +"c c #F3D419", +"v c #F4D01E", +"b c #F4D61F", +"n c #F5CC23", +"m c #F6CE29", +"M c #F5D624", +"N c #F5D824", +"B c #F6D12A", +"V c #F7D62E", +"C c #F6D92B", +"Z c #F7DB30", +"A c #F8DB34", +"S c #F8DC34", +"D c #F8DE36", +"F c #F5D63D", +"G c #F4DA39", +"H c #F9D83A", +"J c #F9DE3A", +"K c #F9DF3D", +"L c #8C804B", +"P c #B99F40", +"I c #DABC42", +"U c #DBBE47", +"Y c #F6D242", +"T c #F7D346", +"R c #FBDB47", +"E c #F7DB4B", +"W c #FCDC4C", +"Q c #FAE040", +"! c #FAE042", +"~ c #FBE146", +"^ c #FCE34B", +"/ c #F8E150", +"( c #FDE451", +") c #FDE554", +"_ c #FCDF69", +"` c #FBE660", +"' c #FCE265", +"] c #FDE06D", +"[ c #FDE671", +"{ c #FEEB74", +"} c #000381", +"| c #0B3995", +" . c #0F3C97", +".. c #103D97", +"X. c #133D9C", +"o. c #144199", +"O. c #14419A", +"+. c #19429F", +"@. c #19459C", +"#. c #1A469D", +"$. c #1F4A9F", +"%. c #204B9F", +"&. c #1F47A2", +"*. c #254FA2", +"=. c #254CA5", +"-. c #2650A2", +";. c #2C53A2", +":. c #2B54A5", +">. c #2F55A4", +",. c #2F56A4", +"<. c #2C54A6", +"1. c #2B52A8", +"2. c #3258A6", +"3. c #3359A6", +"4. c #3157AB", +"5. c #3159A9", +"6. c #3559A9", +"7. c #365CA8", +"8. c #375CAE", +"9. c #3A5CB0", +"0. c #3B60AA", +"q. c #3F64AD", +"w. c #3F63B0", +"e. c #4468AF", +"r. c #4061B3", +"t. c #4566B6", +"y. c #4469B1", +"u. c #4568B2", +"i. c #496CB1", +"p. c #496DB4", +"a. c #496DB5", +"s. c #4B6AB8", +"d. c #506FBB", +"f. c #4E70B4", +"g. c #4F71B7", +"h. c #4F71B8", +"j. c #5375B7", +"k. c #5471BA", +"l. c #5376B9", +"z. c #5475BA", +"x. c #5473BD", +"c. c #5976BF", +"v. c #5878B9", +"b. c #5878BA", +"n. c #5879BC", +"m. c #5C7ABE", +"M. c #5D7DBC", +"N. c #5C7CBE", +"B. c #5F7FBF", +"V. c #6180BE", +"C. c #6684C0", +"Z. c #6A88C3", +"A. c #6F8BC4", +"S. c #728EC6", +"D. c #778FCB", +"F. c #7691C8", +"G. c #7993C9", +"H. c #7994C9", +"J. c #7B95C9", +"K. c #7B95CA", +/* pixels */ +"} } } } w x x k j z l 6 1 < , > ", +"} K.K.G.D.{ [ _ _ ' ` m.b.j.g.: ", +"} K.B.B.c.) ( W R R K 8.5.<.i.$ ", +"w F.B.z.x.( L U I t D 5.:.*.y.$ ", +"w D.n.z.d.^ i u y * Z 1.*.%.q.@ ", +"9 S.l.h.s.~ P r - p C =.$.#.0.O ", +"7 A.g.p.t.Q H * & B M &.#.O.7.o ", +"7 Z.p.u.r.J A e % M b +.o...3.X ", +"6 V.e.r.9.D V m n v c X...| <.. ", +"5 V.M.b.d./ R T Y F G 6.2.>.;. ", +"3 4 3 3 1 h g d a f f # + . " +}; diff --git a/src/pixmaps/flags_xpm/bd.xpm b/src/pixmaps/flags_xpm/bd.xpm new file mode 100644 index 00000000..ccc5ba40 --- /dev/null +++ b/src/pixmaps/flags_xpm/bd.xpm @@ -0,0 +1,143 @@ +/* XPM */ +static const char *bd[] = { +/* columns rows colors chars-per-pixel */ +"16 11 126 2", +" c black", +". c #000500", +"X c #000D00", +"o c #001300", +"O c #001900", +"+ c #002100", +"@ c #002700", +"# c #002D00", +"$ c #002F00", +"% c #003300", +"& c #003500", +"* c #003700", +"= c #003B00", +"- c #003D00", +"; c #004100", +": c #004300", +"> c #0B670B", +", c #0F6A0E", +"< c #106A10", +"1 c #136C13", +"2 c #146E14", +"3 c #197019", +"4 c #1A701A", +"5 c #1F741F", +"6 c #207520", +"7 c #257825", +"8 c #267A26", +"9 c #2B7C2B", +"0 c #2C7B2C", +"q c #2C7C2C", +"w c #2F7C2F", +"e c #2F7D2F", +"r c #327F32", +"t c #337F32", +"y c #6B5019", +"u c #7C6331", +"i c #7E6534", +"p c #B9361F", +"a c #CF2D1E", +"s c #F1201F", +"d c #D53C2E", +"f c #ED2825", +"g c #F32423", +"h c #F52424", +"j c #F42A29", +"k c #F62A2A", +"l c #F62B2B", +"z c #F72F2F", +"x c #F73030", +"c c #F83434", +"v c #F83535", +"b c #F83636", +"n c #F53836", +"m c #F63C3A", +"M c #F93B3A", +"N c #F93B3B", +"B c #F93B3C", +"V c #F93C3C", +"C c #BE412B", +"Z c #846C3D", +"A c #856E3F", +"S c #947F54", +"D c #DB4F42", +"F c #C85945", +"G c #DF5C51", +"H c #FA4040", +"J c #FA4141", +"K c #FA4142", +"L c #FB4646", +"P c #FB4747", +"I c #F94847", +"U c #F44D4B", +"Y c #FC4B4B", +"T c #FA4C4C", +"R c #FA5151", +"E c #CC6350", +"W c #318131", +"Q c #358235", +"! c #368236", +"~ c #378437", +"^ c #398439", +"/ c #3B853B", +"( c #3A863A", +") c #3D863D", +"_ c #3F893F", +"` c #3F8A3F", +"' c #428A42", +"] c #448C44", +"[ c #448E44", +"{ c #458E45", +"} c #468D46", +"| c #498F49", +" . c #499149", +".. c #4B904B", +"X. c #4E934E", +"o. c #4F954F", +"O. c #509350", +"+. c #539653", +"@. c #539753", +"#. c #549754", +"$. c #549655", +"%. c #589857", +"&. c #589958", +"*. c #589A58", +"=. c #589B59", +"-. c #599B59", +";. c #5C9B5C", +":. c #5C9D5C", +">. c #5D9D5D", +",. c #5F9F5F", +"<. c #619E60", +"1. c #619F62", +"2. c #65A165", +"3. c #66A366", +"4. c #69A469", +"5. c #6AA56A", +"6. c #6DA76D", +"7. c #6FA86F", +"8. c #70A971", +"9. c #72AA73", +"0. c #74AB74", +"q. c #76AD76", +"w. c #77AD77", +"e. c #79AE79", +"r. c #7BB07A", +"t. c #7BB07B", +/* pixels */ +": : : : : = & % $ @ + O o X . ", +": t.t.e.w.0.8.6.5.1.<.;.%.$.X. ", +": t.,.,.:.S G T P D A ~ W q | ", +": w.:.*.S R Y P H V n u 9 8 ] ", +"= w.*.@.E Y L H V c x C 7 6 _ ", +"= 9.@.o.U L H M c x l f 5 4 / ", +"& 7.o. .F H M c x l h p 3 2 ! ", +"$ 5. .{ A m c z l h s y 2 < t ", +"@ 2.{ _ / i d l g a y < , > e ", +"+ 1.,.&.$.O.| { ' ) / ! t e q ", +"O o X . " +}; diff --git a/src/pixmaps/flags_xpm/be.xpm b/src/pixmaps/flags_xpm/be.xpm new file mode 100644 index 00000000..2b07044e --- /dev/null +++ b/src/pixmaps/flags_xpm/be.xpm @@ -0,0 +1,150 @@ +/* XPM */ +static const char *be[] = { +/* columns rows colors chars-per-pixel */ +"16 11 133 2", +" c black", +". c #3A3A3A", +"X c #3F3F3F", +"o c #403F3F", +"O c #444444", +"+ c gray27", +"@ c #494949", +"# c #494A49", +"$ c #4B4A4B", +"% c gray31", +"& c #504F50", +"* c #535353", +"= c gray33", +"- c #545455", +"; c #585858", +": c #585959", +"> c gray35", +", c gray36", +"< c #5D5D5D", +"1 c #5F5F5F", +"2 c #616162", +"3 c gray40", +"4 c #6A6A6A", +"5 c #6F6F6F", +"6 c #727273", +"7 c #767676", +"8 c #777777", +"9 c #797979", +"0 c #7B7B7A", +"q c #7B7B7B", +"w c #A50000", +"e c #C10000", +"r c #C30000", +"t c #C70000", +"y c #C90000", +"u c #E30000", +"i c #E50000", +"p c #E70000", +"a c #E90000", +"s c #EB0000", +"d c #ED0000", +"f c #EF0000", +"g c #F10000", +"h c #F30000", +"j c #F50000", +"k c #F10B0B", +"l c #F10F0E", +"z c #F21010", +"x c #F21313", +"c c #F21414", +"v c #F31919", +"b c #F31A1A", +"n c #F41F1F", +"m c #F42020", +"M c #F52525", +"N c #F52626", +"B c #F62B2B", +"V c #F22C2C", +"C c #F22F2F", +"Z c #F62C2C", +"A c #F23232", +"S c #F33232", +"D c #F73131", +"F c #F33535", +"G c #F43636", +"H c #F83737", +"J c #F43B3B", +"K c #F53F3F", +"L c #F64444", +"P c #F74949", +"I c #F74E4E", +"U c #F85353", +"Y c #F95757", +"T c #FA5C5C", +"R c #CFDB00", +"E c #DFD100", +"W c #D1DF00", +"Q c #DBDD00", +"! c #D5E100", +"~ c #E1E300", +"^ c #FBE700", +"/ c #F7E900", +"( c #F1EF00", +") c #FDE900", +"_ c #F9F700", +"` c #F4ED1F", +"' c #F3F219", +"] c #F4F41E", +"[ c #F5EE24", +"{ c #F6EF2B", +"} c #F5F523", +"| c #F5F524", +" . c #F6F629", +".. c #F6F62A", +"X. c #F7F72E", +"o. c #F7F72F", +"O. c #F4ED39", +"+. c #F7F130", +"@. c #F7F730", +"#. c #F1F134", +"$. c #F8F236", +"%. c #F8F834", +"&. c #F8F835", +"*. c #F8F836", +"=. c #F2F23A", +"-. c #F5F53D", +";. c #F9F33D", +":. c #F9F93A", +">. c #F9F93B", +",. c #F9F93C", +"<. c #F3F340", +"1. c #F6F642", +"2. c #F4F446", +"3. c #F7F746", +"4. c #FAFA40", +"5. c #FAFA41", +"6. c #FAFA42", +"7. c #FBFB46", +"8. c #FBFB47", +"9. c #F5F54B", +"0. c #F7F74B", +"q. c #FCFC4B", +"w. c #FCFC4C", +"e. c #F2F250", +"r. c #F6F651", +"t. c #F7F754", +"y. c #FDFD51", +"u. c #FBF660", +"i. c #FCFC65", +"p. c #FCFC69", +"a. c #FDFD6D", +"s. c #FDFD71", +"d. c #F9F974", +/* pixels */ +" ( ) ) ) _ / j h h f f ", +" q q q 8 d.s.a.p.i.u.T Y U I a ", +" q < < > t.y.w.8.6.;.H D Z P a ", +" q , ; - r.w.8.6.,.$.D B N L p ", +" 7 ; = % 9.8.6.,.*.+.B N m K p ", +" 6 * % @ 2.,.-.*.@.{ N n v J p ", +" 5 % @ + -.>.*.o...[ n v c F u ", +" 4 @ + O =.@.@...| ` v c z A t ", +" 3 + X . #.X...} ] ' z z k C e ", +" 2 < ; - e.0.2.1.-.O.F A C V e ", +" Q ! ! R ~ E t y e y w " +}; diff --git a/src/pixmaps/flags_xpm/bf.xpm b/src/pixmaps/flags_xpm/bf.xpm new file mode 100644 index 00000000..185e1410 --- /dev/null +++ b/src/pixmaps/flags_xpm/bf.xpm @@ -0,0 +1,165 @@ +/* XPM */ +static const char *bf[] = { +/* columns rows colors chars-per-pixel */ +"16 11 148 2", +" c #002100", +". c #002300", +"X c #002500", +"o c #002900", +"O c #002B00", +"+ c #002D00", +"@ c #003100", +"# c #003700", +"$ c #003B00", +"% c #003F00", +"& c #004500", +"* c #004B00", +"= c #005100", +"- c #005500", +"; c #005B00", +": c #006100", +"> c #006700", +", c #006B00", +"< c #007100", +"1 c #007500", +"2 c #007D00", +"3 c #AF0000", +"4 c #CB0000", +"5 c #E70000", +"6 c #E90000", +"7 c #EB0000", +"8 c #ED0000", +"9 c #EF0000", +"0 c #F10000", +"q c #F30000", +"w c #F50000", +"e c #F70000", +"r c #F90000", +"t c #FB0000", +"y c #FD0000", +"u c red", +"i c #D82A1A", +"p c #D9301F", +"a c #DB3425", +"s c #DD3A2B", +"d c #F42020", +"f c #F52525", +"g c #F52626", +"h c #F62B2B", +"j c #F62C2C", +"k c #F73030", +"l c #F73131", +"z c #F83736", +"x c #F83737", +"c c #F83B36", +"v c #F53F3F", +"b c #F93C3C", +"n c #F93C3D", +"m c #DD493B", +"M c #DE5646", +"N c #F64444", +"B c #FA4242", +"V c #FB4747", +"C c #FB4946", +"Z c #F74949", +"A c #F74E4E", +"S c #FC4B4B", +"D c #FC4C4C", +"F c #E05B4B", +"G c #FD4F50", +"H c #F85353", +"J c #FD5151", +"K c #F95757", +"L c #FD5454", +"P c #FE5858", +"I c #FE5959", +"U c #FA5C5C", +"Y c #FE5C5C", +"T c #FE5F5F", +"R c #E1604F", +"E c #E26453", +"W c #FB6060", +"Q c #FC6565", +"! c #FC6969", +"~ c #FD6D6D", +"^ c #E87F73", +"/ c #FD7071", +"( c #FE7474", +") c #FE7676", +"_ c #FE7777", +"` c #FE7979", +"' c #FF7B7A", +"] c #FF7B7B", +"[ c #0B950B", +"{ c #0F970E", +"} c #109710", +"| c #139913", +" . c #149914", +".. c #149B14", +"X. c #189C19", +"o. c #199C19", +"O. c #199D19", +"+. c #1E9F1E", +"@. c #1F9F1F", +"#. c #1FA21F", +"$. c #23A123", +"%. c #26A324", +"&. c #24A424", +"*. c #2AA32A", +"=. c #29A429", +"-. c #2AA72A", +";. c #2CA22C", +":. c #2FA42F", +">. c #2EA62E", +",. c #2FA62F", +"<. c #32A532", +"1. c #33A632", +"2. c #34A934", +"3. c #35A835", +"4. c #35AA34", +"5. c #36A936", +"6. c #39A939", +"7. c #3AAC3A", +"8. c #3DAC3D", +"9. c #3FAF3F", +"0. c #3BB43A", +"q. c #40AF3F", +"w. c #42AE42", +"e. c #40B240", +"r. c #44B144", +"t. c #45B245", +"y. c #46B046", +"u. c #45B445", +"i. c #4BB24B", +"p. c #49B449", +"a. c #49B749", +"s. c #4FB94F", +"d. c #50B450", +"f. c #54B755", +"g. c #58B958", +"h. c #5DBC5D", +"j. c #61BE62", +"k. c #66C066", +"l. c #6AC36A", +"z. c #6FC66F", +"x. c #F1B43C", +"c. c #D8DB30", +"v. c #D7E82F", +"b. c #D8E935", +"n. c #EAF036", +"m. c #EAF03B", +"M. c #F2B641", +"N. c #DDDD40", +/* pixels */ +"u u u u u u u t t t e e q q 8 8 ", +"u ] ] ] _ ) / ~ ! Q W U K H A 7 ", +"u ] T Y I L G D Z B n x l j Z 7 ", +"u _ T K L G D S B n x l h g N 5 ", +"u _ Y L D D D M.x.c l h g d v 5 ", +"4 ^ E F F M c.m.n.c.s a p i m 3 ", +"2 z.s.a.u.e.0.b.v.-.&.#.O...3.+ ", +"1 l.p.t.e.7.5.,.*.%.@.o...} 1.O ", +"< k.r.9.7.5.,.;.$.@.....{ [ :.. ", +", j.h.g.f.d.i.w.w.8.7.5.<.:.;.. ", +"> : ; - = * & % $ # + + O X . . " +}; diff --git a/src/pixmaps/flags_xpm/bg.xpm b/src/pixmaps/flags_xpm/bg.xpm new file mode 100644 index 00000000..dc33c16e --- /dev/null +++ b/src/pixmaps/flags_xpm/bg.xpm @@ -0,0 +1,160 @@ +/* XPM */ +static const char *bg[] = { +/* columns rows colors chars-per-pixel */ +"16 11 143 2", +" c black", +". c #003B00", +"X c #003D00", +"o c #003F00", +"O c #004900", +"+ c #457610", +"@ c #497A14", +"# c #4D7C19", +"$ c #527F1F", +"% c #DD0000", +"& c #DF0000", +"* c #E10000", +"= c #E30000", +"- c #E50000", +"; c #E70000", +": c #E90000", +"> c #EB0000", +", c #ED0000", +"< c #EF0000", +"1 c #F10000", +"2 c #F30000", +"3 c #F50000", +"4 c #F70000", +"5 c #F90000", +"6 c #F10B0B", +"7 c #F10F0E", +"8 c #F21313", +"9 c #F31919", +"0 c #F41E1E", +"q c #F52323", +"w c #F62929", +"e c #F22C2C", +"r c #F22F2F", +"t c #F72E2E", +"y c #F23232", +"u c #F33535", +"i c #F83434", +"p c #F43939", +"a c #F53D3D", +"s c #F93A3A", +"d c #FA3F3F", +"f c #F64242", +"g c #F74646", +"h c #FA4444", +"j c #F74B4B", +"k c #F85050", +"l c #F95455", +"z c #F95858", +"x c #FA5D5D", +"c c #FB6162", +"v c #FC6666", +"b c #008300", +"n c #008500", +"m c #149E14", +"M c #1A9C1A", +"N c #1F9F1F", +"B c #19A119", +"V c #1FA41F", +"C c #209E20", +"Z c #25A025", +"A c #25A225", +"S c #24A524", +"D c #2BA42B", +"F c #2AA52B", +"G c #2AA82A", +"H c #2FAB2F", +"J c #30A630", +"K c #30A830", +"L c #36A936", +"P c #36AB36", +"I c #35AE35", +"U c #36AC36", +"Y c #3BAA3B", +"T c #3BAD3B", +"R c #3FAB3F", +"E c #3BAC3C", +"W c #3BB03A", +"Q c #568324", +"! c #5B872A", +"~ c #5F8A2F", +"^ c #618A32", +"/ c #638E34", +"( c #68913A", +") c #6C943F", +"_ c #709845", +"` c #749B49", +"' c #41AF41", +"] c #40B040", +"[ c #40B340", +"{ c #46B246", +"} c #45B645", +"| c #4BB44B", +" . c #4BB54B", +".. c #4FB74F", +"X. c #49B849", +"o. c #4FBB4F", +"O. c #50B650", +"+. c #53B953", +"@. c #54B854", +"#. c #58BA58", +"$. c #6FC86F", +"%. c #72C673", +"&. c #76C776", +"*. c #8EAE6A", +"=. c #B7D3B7", +"-. c #DDDDDD", +";. c #DFDFDF", +":. c #D1E7D1", +">. c #DBEBDB", +",. c #DDECDD", +"<. c #DFEDDF", +"1. c #E0EDDF", +"2. c #E1E3E3", +"3. c gray90", +"4. c #E7E7E7", +"5. c #E0EFE0", +"6. c #E9E9E9", +"7. c gray92", +"8. c gray93", +"9. c #EFEFEF", +"0. c #E2F0E2", +"q. c #E3F1E3", +"w. c #E4F2E4", +"e. c #E6F3E6", +"r. c #E7F3E7", +"t. c #E8F4E8", +"y. c #E9F5E9", +"u. c #EAF6EA", +"i. c #EDF7ED", +"p. c #F1F1F1", +"a. c #F3F3F3", +"s. c gray96", +"d. c #F6F6F6", +"f. c gray97", +"g. c #F8F8F8", +"h. c #F9F9F9", +"j. c gray98", +"k. c #FBFBFB", +"l. c gray99", +"z. c #FDFDFD", +"x. c #FDFDFE", +"c. c #FEFEFE", +"v. c gray100", +/* pixels */ +"s.s.s.s.a.a.a.a.9.9.9.7.6.4.4.2.", +"s.v.v.v.v.v.v.j.v.j.j.j.g.g.s.-.", +"s.v.v.v.v.j.v.j.j.j.j.g.g.s.g.-.", +":.i.y.r.r.r.r.r.0.0.<.<.<.>.1.=.", +"b &.#.@.O.| { ' E L J D Z N R X ", +"b %.+...| { [ T L K D A N M Y . ", +"n $.o.X.} [ W I H G S V B m I X ", +"O *.` _ ) ( / ~ ! Q $ # @ + ^ ", +"5 v h d s i t w q 0 9 8 7 6 r & ", +"4 c x z l k j g f a p u y r e & ", +"4 1 1 , , , : : ; ; * * & % % % " +}; diff --git a/src/pixmaps/flags_xpm/bh.xpm b/src/pixmaps/flags_xpm/bh.xpm new file mode 100644 index 00000000..532d8b80 --- /dev/null +++ b/src/pixmaps/flags_xpm/bh.xpm @@ -0,0 +1,134 @@ +/* XPM */ +static const char *bh[] = { +/* columns rows colors chars-per-pixel */ +"16 11 117 2", +" c #DD0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #ED0000", +"% c #EF0000", +"& c #F10000", +"* c #F30000", +"= c #F50000", +"- c #F90000", +"; c #FB0000", +": c #FD0000", +"> c #FD0303", +", c #F10B0B", +"< c #F10F0E", +"1 c #F21010", +"2 c #F21313", +"3 c #F21414", +"4 c #F31919", +"5 c #F31A1A", +"6 c #F41E1E", +"7 c #F41F1F", +"8 c #F42020", +"9 c #F52323", +"0 c #F52424", +"q c #F52525", +"w c #F52626", +"e c #F62929", +"r c #F62A2A", +"t c #F62B2B", +"y c #F22C2C", +"u c #F22F2F", +"i c #F62C2C", +"p c #F72E2E", +"a c #F72F2F", +"s c #F23232", +"d c #F33232", +"f c #F73030", +"g c #F73131", +"h c #F33535", +"j c #F43636", +"k c #F83434", +"l c #F83535", +"z c #F83636", +"x c #F83737", +"c c #F43B3B", +"v c #F53D3D", +"b c #F53F3F", +"n c #F93B3A", +"m c #F93B3B", +"M c #F93B3C", +"N c #F93C3C", +"B c #F64242", +"V c #F64444", +"C c #F74646", +"Z c #FA4040", +"A c #FA4141", +"S c #FA4142", +"D c #FA4242", +"F c #FB4646", +"G c #FB4747", +"H c #F74949", +"J c #F74B4B", +"K c #F74E4E", +"L c #FC4B4B", +"P c #FC4C4C", +"I c #F95151", +"U c #F85353", +"Y c #FB5252", +"T c #FD5151", +"R c #F95756", +"E c #F95757", +"W c #FD5757", +"Q c #F85858", +"! c #FD5B5C", +"~ c #FA5C5C", +"^ c #FB6665", +"/ c #FC6565", +"( c #FC6969", +") c #FE6A69", +"_ c #FD6D6D", +"` c #FD6E6E", +"' c #FD7071", +"] c #EF8787", +"[ c #FE8686", +"{ c #FFA9A9", +"} c #FAC4C4", +"| c #FBC8C7", +" . c #FDD0D0", +".. c #FED0D0", +"X. c #F9D8D8", +"o. c #E9E9E9", +"O. c #EAEAEA", +"+. c #ECECEC", +"@. c #EEEEEE", +"#. c #FAE2E2", +"$. c #FEE8E7", +"%. c #FDEBEB", +"&. c #FCECEC", +"*. c gray94", +"=. c #F1F1F1", +"-. c gray95", +";. c #F3F3F3", +":. c #F9F7F7", +">. c gray98", +",. c #FBFAFA", +"<. c #FBFBFB", +"1. c gray99", +"2. c #FDFDFD", +"3. c #FEFDFC", +"4. c #FEFDFD", +"5. c #FEFEFE", +"6. c gray100", +/* pixels */ +"-.-.-.-.{ > > > > ; ; = * * % % ", +"-.6.6.6.3.$.[ ` ` ^ ^ ~ Q U K @ ", +"-.6.6.6. .) W T P G A x g i H @ ", +"-.<.6.6.6.%.` L F A N g i w V + ", +"@.6.6.6. .! L F A N k r w 8 b + ", +"@.6.<.6.<.&.^ A M k g w 7 5 c + ", +"-.6.<.<.} Y A n k g r 7 5 3 j X ", +"@.<.<.<.<.#.R k a r 9 5 2 1 s . ", +"O.<.:.<.} I k p r 9 7 2 , , u . ", +"O.<.<.<.:.X.! J C B b j s u y . ", +"O.-.-.-.] @ @ @ @ + + . . " +}; diff --git a/src/pixmaps/flags_xpm/bi.xpm b/src/pixmaps/flags_xpm/bi.xpm new file mode 100644 index 00000000..52572281 --- /dev/null +++ b/src/pixmaps/flags_xpm/bi.xpm @@ -0,0 +1,174 @@ +/* XPM */ +static const char *bi[] = { +/* columns rows colors chars-per-pixel */ +"16 11 157 2", +" c #7D0000", +". c #004D00", +"X c #005300", +"o c #005900", +"O c #005B00", +"+ c #005D00", +"@ c #006300", +"# c #006500", +"$ c #007D00", +"% c #830000", +"& c #8B0000", +"* c #8F0000", +"= c #910000", +"- c #930000", +"; c #990000", +": c #9D0000", +"> c #9F0000", +", c #A30000", +"< c #AB0000", +"1 c #C30000", +"2 c #CB0000", +"3 c #CD0000", +"4 c #CF0000", +"5 c #D30101", +"6 c #D50000", +"7 c #D70703", +"8 c #D50909", +"9 c #D50F0F", +"0 c #D71313", +"q c #D91717", +"w c #D34443", +"e c #D54B4A", +"r c #D95555", +"t c #DE5B5B", +"y c #DD5E5E", +"u c #DD5F5F", +"i c #DB6363", +"p c #DF6766", +"a c #DD6868", +"s c #DC6969", +"d c #DD6D6D", +"f c #E26A6A", +"g c #E26C6C", +"h c #E47171", +"j c #E27777", +"k c #E57474", +"l c #E27A7A", +"z c #008D00", +"x c #178F01", +"c c #009700", +"v c #009F00", +"b c #1B9907", +"n c #259B0F", +"m c #299D11", +"M c #03A103", +"N c #2BA721", +"B c #28A527", +"V c #39AE38", +"C c #3AAD3A", +"Z c #37B134", +"A c #41AF41", +"S c #44AF44", +"D c #49B647", +"F c #4AB44A", +"G c #50B950", +"H c #54BB55", +"J c #57BE56", +"K c #59BE59", +"L c #59BF59", +"P c #5DBF5D", +"I c #5EBF5E", +"U c #64BE63", +"Y c #60C05F", +"T c #66C465", +"R c #69C269", +"E c #6BC16A", +"W c #6CC66B", +"Q c #6CC46C", +"! c #6DC56D", +"~ c #71C571", +"^ c #70C670", +"/ c #73C873", +"( c #76C975", +") c #7DD07D", +"_ c #7DD07E", +"` c #D48C82", +"' c #DA9A91", +"] c #E98484", +"[ c #E88585", +"{ c #E78A8A", +"} c #E88989", +"| c #E88D8D", +" . c #EC9696", +".. c #EC9999", +"X. c #C1A7AD", +"o. c #E7AAAC", +"O. c #EDB3B4", +"+. c #EDB9B9", +"@. c #87CF86", +"#. c #81D181", +"$. c #83D284", +"%. c #88D288", +"&. c #8CD48A", +"*. c #97C197", +"=. c #90D590", +"-. c #95D894", +";. c #97D997", +":. c #9ADA9A", +">. c #9DDC9E", +",. c #B2E0B7", +"<. c #EFB5C7", +"1. c #C1DFC1", +"2. c #DDCFD7", +"3. c #F0C1C2", +"4. c #F5C8C8", +"5. c #E3D1C7", +"6. c #E6D5CD", +"7. c #EFD0CF", +"8. c #E7D8CF", +"9. c #EECFD0", +"0. c #FFCFDF", +"q. c #E7DED7", +"w. c #FFD5D5", +"e. c #F9DADD", +"r. c #F8DBDE", +"t. c #C3EBC7", +"y. c #C8EDCB", +"u. c #C9EACC", +"i. c #CCEFD1", +"p. c #D7F5DC", +"a. c #E2E5DA", +"s. c #E8EADE", +"d. c #F7EAEF", +"f. c #F2ECF2", +"g. c #F8EAF1", +"h. c #FAEEF5", +"j. c #ECF7F2", +"k. c #EAF5F5", +"l. c #EDFCF4", +"z. c #EBFAFA", +"x. c #F1F1F1", +"c. c gray95", +"v. c #F3F3F3", +"b. c #F4F4F4", +"n. c gray96", +"m. c #F6F6F6", +"M. c gray97", +"N. c #FEF4FA", +"B. c #F8F8F8", +"V. c #F9F8F9", +"C. c #F9F9F9", +"Z. c gray98", +"A. c #FBFBFB", +"S. c gray99", +"D. c #FDFDFD", +"F. c #FEFEFE", +"G. c gray100", +/* pixels */ +"w.0.7 6 q 0 9 8 5 4 4 2 1 1 <.+.", +"N G.G.4.[ .. .{ [ | { g O.B.M.$ ", +"x &.p.G.N.k h r.r.f t g.M.i.I X ", +"m :.W >.A.G.A.s.a.Z.M.M.@.V ~ @ ", +"n :.#./ T l.Z.6.5.C.j.D F L ! O ", +"b ;.@._ I y.h.C.M.d.u.C L H ! O ", +"M ;._ Q J z.' 8.q.` k.Z S G E @ ", +"v &.I &.Z.C.B.B.M.M.b.v.E B U @ ", +"z ( t.Z.V.u u 7.9.r w d.x.,.A . ", +"c Z.Z.3.p l j a i d d e o.j.f.O ", +"1.2.< : , : : ; = = * & % X.*." +}; diff --git a/src/pixmaps/flags_xpm/bj.xpm b/src/pixmaps/flags_xpm/bj.xpm new file mode 100644 index 00000000..f0f0842e --- /dev/null +++ b/src/pixmaps/flags_xpm/bj.xpm @@ -0,0 +1,156 @@ +/* XPM */ +static const char *bj[] = { +/* columns rows colors chars-per-pixel */ +"16 11 139 2", +" c #004900", +". c #005300", +"X c #005700", +"o c #005D00", +"O c #006300", +"+ c #006700", +"@ c #006F00", +"# c #007500", +"$ c #007700", +"% c #007B00", +"& c #007F00", +"* c #DD0000", +"= c #DF0000", +"- c #E10000", +"; c #E30000", +": c #E50000", +"> c #E70000", +", c #E90000", +"< c #F10B0B", +"1 c #F10F0E", +"2 c #F21010", +"3 c #F21313", +"4 c #F21414", +"5 c #F31919", +"6 c #F41E1E", +"7 c #F41F1F", +"8 c #F3261A", +"9 c #F42B1F", +"0 c #F52323", +"q c #F52424", +"w c #F62929", +"e c #F62A2A", +"r c #F22C2C", +"t c #F22F2F", +"y c #F72F2F", +"u c #F53025", +"i c #F6362B", +"p c #F23232", +"a c #F33232", +"s c #F33535", +"d c #F43636", +"f c #F83535", +"g c #F73B30", +"h c #F43939", +"j c #F53D3D", +"k c #F84036", +"l c #F4463B", +"z c #F9463B", +"x c #F64242", +"c c #F74646", +"v c #008300", +"b c #008500", +"n c #008700", +"m c #008900", +"M c #009100", +"N c #3CAA3A", +"B c #3AAC3A", +"V c #3EAE3E", +"C c #3FAF3F", +"Z c #40AF3F", +"A c #43AD40", +"S c #44B144", +"D c #45B245", +"F c #48B046", +"G c #4EB24B", +"H c #49B449", +"J c #49B549", +"K c #4BB54B", +"L c #4FB64F", +"P c #4FB74F", +"I c #50B750", +"U c #53B751", +"Y c #56B555", +"T c #54B755", +"R c #53B953", +"E c #54B954", +"W c #54BA54", +"Q c #58BA56", +"! c #58B958", +"~ c #59BB59", +"^ c #58BC58", +"/ c #58BC59", +"( c #59BC59", +") c #5CBD5B", +"_ c #5CBD5C", +"` c #5DBC5D", +"' c #5CBE5C", +"] c #5EBD5E", +"[ c #5FBF5F", +"{ c #61BE62", +"} c #66C066", +"| c #6AC36A", +" . c #6FC46F", +".. c #72C673", +"X. c #76C876", +"o. c #77C877", +"O. c #79C879", +"+. c #79C979", +"@. c #7AC97A", +"#. c #7BCA7A", +"$. c #7BCA7B", +"%. c #E7E700", +"&. c #E9E900", +"*. c #EBEB00", +"=. c #EDEF00", +"-. c #EFEF00", +";. c #F1F100", +":. c #F3F300", +">. c #F5F500", +",. c #F7F700", +"<. c #F9F900", +"1. c #FBFB00", +"2. c #FDFD00", +"3. c #F4F420", +"4. c #F5F525", +"5. c #F5F526", +"6. c #F6F62B", +"7. c #F6F62C", +"8. c #F7F730", +"9. c #F7F731", +"0. c #F8F836", +"q. c #F8F837", +"w. c #F5F53F", +"e. c #F9F93C", +"r. c #F9F93D", +"t. c #F6F644", +"y. c #FAFA41", +"u. c #FAFA42", +"i. c #FBFB47", +"p. c #F7F749", +"a. c #F7F74E", +"s. c #FCFC4C", +"d. c #F8F853", +"f. c #F9F957", +"g. c #FAFA5C", +"h. c #FBFB60", +"j. c #FCFC65", +"k. c #FCFC69", +"l. c #FDFD6D", +/* pixels */ +"M m m m b v v 2.1.1.1.>.:.-.-.-.", +"b $.$.$.o.$.$.l.k.j.g.g.g.d.a.*.", +"b $.] ' ~ ] ) s.i.u.w.0.9.7.p.&.", +"m $.' ^ W ~ Q i.u.e.0.8.7.5.t.%.", +"b X.^ R I W U u.r.0.7.7.5.3.w.%.", +"b ..R P H P G z k g i u 9 8 l ; ", +"& .P H D H D f y e q 7 5 4 d ; ", +"% | H D A D A y e q 7 5 4 2 a = ", +"% { D V B V N e 0 7 5 3 1 < t = ", +"@ { ` ! Y Q Y c x j h d p t r * ", +"# + O o X . > > > ; ; = * * * " +}; diff --git a/src/pixmaps/flags_xpm/bm.xpm b/src/pixmaps/flags_xpm/bm.xpm new file mode 100644 index 00000000..95b173f5 --- /dev/null +++ b/src/pixmaps/flags_xpm/bm.xpm @@ -0,0 +1,175 @@ +/* XPM */ +static const char *bm[] = { +/* columns rows colors chars-per-pixel */ +"16 11 158 2", +" c #34302F", +". c #7F153D", +"X c #000059", +"o c #00006B", +"O c #331B6B", +"+ c #6B1D4D", +"@ c #7F254D", +"# c #810000", +"$ c #830000", +"% c #870000", +"& c #890000", +"* c #8B0000", +"= c #8F0000", +"- c #910000", +"; c #930000", +": c #970000", +"> c #990000", +", c #9B0000", +"< c #9D0000", +"1 c #9F0000", +"2 c #A30000", +"3 c #A70000", +"4 c #AB0000", +"5 c #AF0000", +"6 c #B10000", +"7 c #B30000", +"8 c #B50000", +"9 c #B70000", +"0 c #B90000", +"q c #BB0000", +"w c #83173D", +"e c #C20B0B", +"r c #CA0F0E", +"t c #C51010", +"y c #CB1313", +"u c #C71919", +"i c #CF1919", +"p c #C91E1E", +"a c #CB1F1F", +"s c #D91B15", +"d c #CB2323", +"f c #CB2424", +"g c #CD2929", +"h c #CD2A2A", +"j c #CE2A2A", +"k c #CA2C2C", +"l c #CA2F2F", +"z c #CB2F2F", +"x c #CF2C2C", +"c c #CF2E2E", +"v c #CF2F2F", +"b c #CF3030", +"n c #CF3131", +"m c #CC3232", +"M c #CD3232", +"N c #CD3535", +"B c #CE3636", +"V c #CF3939", +"C c #CF3B3B", +"Z c #D13434", +"A c #D13535", +"S c #D13636", +"D c #D13737", +"F c #D33636", +"G c #D33A3A", +"H c #D43B3A", +"J c #D23B3D", +"K c #D03D3D", +"L c #D23F3F", +"P c #D43C3C", +"I c #D43C3D", +"U c #D43F3F", +"Y c #D53F3F", +"T c #87466A", +"R c #925379", +"E c #AF677F", +"W c #D24242", +"Q c #D64040", +"! c #D54142", +"~ c #D54242", +"^ c #D34444", +"/ c #D34646", +"( c #D64444", +") c #D64545", +"_ c #D74747", +"` c #D54949", +"' c #D54B4B", +"] c #D74E4E", +"[ c #D84949", +"{ c #D84A49", +"} c #DB4F4F", +"| c #D75050", +" . c #D85353", +".. c #D85455", +"X. c #D95757", +"o. c #DA5858", +"O. c #DB5C5C", +"+. c #DB5D5D", +"@. c #C55B67", +"#. c #C65E69", +"$. c #C7626E", +"%. c #DD6060", +"&. c #DD6162", +"*. c #DF6565", +"=. c #DE6666", +"-. c #DD696A", +";. c #DE6E6E", +":. c #C96775", +">. c #DF787A", +",. c #E06A6A", +"<. c #E46B69", +"1. c #E16F6F", +"2. c #E4726F", +"3. c #E57472", +"4. c #E87C79", +"5. c #76B55E", +"6. c #79B862", +"7. c #7CBD66", +"8. c #7EBD66", +"9. c #80BF6A", +"0. c #88C372", +"q. c #6567A3", +"w. c #856995", +"e. c #9C789B", +"r. c #AF758C", +"t. c #C37C8E", +"y. c #6BC3E4", +"u. c #6FC5E5", +"i. c #998B8B", +"p. c #BA8399", +"a. c #B8839A", +"s. c #9186B1", +"d. c #D58890", +"f. c #E28284", +"g. c #EB8481", +"h. c #E3898B", +"j. c #E79495", +"k. c #D9A1AA", +"l. c #DAADB6", +"z. c #D1AFBB", +"x. c #F1A5A2", +"c. c #F1AAA7", +"v. c #E5B9BF", +"b. c #8FA0CD", +"n. c #A3A0C3", +"m. c #DAB7C1", +"M. c #E7BDC3", +"N. c #DFC1CB", +"B. c #E8CFD6", +"V. c #E2D5DF", +"C. c #EFD8D8", +"Z. c #F1DAD9", +"A. c #F2DCDB", +"S. c #F3DFDE", +"D. c #F2E0E0", +"F. c #F3E7E7", +"G. c #F4E5E5", +"H. c #F4E8E8", +/* pixels */ +":.w.o . w X + @.8 8 8 6 5 4 3 3 ", +"O M.V.l.k.m.B.n.-.*.%.+.X. .] < ", +"i j.g.3.,.4.4.;.) ~ P A n x ` , ", +"@ v.x.f.h.c.d.r.~ Y G.F.F.D.^ : ", +"q.N.s.a.a.b.z.e.L A S.u.y.Z.L ; ", +"s t.R $.#.T E 2.A x S. i.C.C = ", +"0 1.} [ ) Q H A b j 0.6.5.7.B * ", +"0 ,.[ ) Y H Z v j f a 9.7.t n % ", +"8 *.( Y G A x k f p u y r e l % ", +"6 &.+.o.X.| ` ^ W K C N m l k # ", +"8 6 4 3 2 < < , ; ; = * % % # * " +}; diff --git a/src/pixmaps/flags_xpm/bn.xpm b/src/pixmaps/flags_xpm/bn.xpm new file mode 100644 index 00000000..48e78046 --- /dev/null +++ b/src/pixmaps/flags_xpm/bn.xpm @@ -0,0 +1,173 @@ +/* XPM */ +static const char *bn[] = { +/* columns rows colors chars-per-pixel */ +"16 11 156 2", +" c black", +". c #0B0B0B", +"X c #0F0F0E", +"o c #131313", +"O c gray8", +"+ c #181919", +"@ c #191919", +"# c gray12", +"$ c #2C2C2C", +"% c #2F2F2F", +"& c #4A2F30", +"* c #522936", +"= c #403535", +"- c gray27", +"; c #474545", +": c #404049", +"> c #494A49", +", c #4B4A4B", +"< c gray31", +"1 c #535353", +"2 c gray38", +"3 c #727273", +"4 c #767676", +"5 c #D3765F", +"6 c #DD765E", +"7 c #D57F6C", +"8 c #DD7E6A", +"9 c #B38700", +"0 c #B2A437", +"q c #D7A700", +"w c #D9A900", +"e c #D9AB00", +"r c #DDAF00", +"t c #D5B500", +"y c #DBB300", +"u c #DFB300", +"i c #DBB500", +"p c #DFB500", +"a c #D7B900", +"s c #D7BB00", +"d c #E1B700", +"f c #E1B900", +"g c #E3BB00", +"h c #E3BD00", +"j c #E5BF00", +"k c #CDAC33", +"l c #CEBD3B", +"z c #E9C100", +"x c #E9C500", +"c c #EBC500", +"v c #EBC700", +"b c #EDC700", +"n c #EFC900", +"m c #EDCB00", +"M c #EFCB00", +"N c #EFCD00", +"B c #F1CF00", +"V c #F1D100", +"C c #F3D100", +"Z c #F1D300", +"A c #F3D300", +"S c #F5D300", +"D c #F3D700", +"F c #F5D500", +"G c #F5D900", +"H c #EED82F", +"J c #E7CD33", +"K c #E8CE37", +"L c #EDD73B", +"P c #EAD73F", +"I c #F0D935", +"U c #F1DC35", +"Y c #F2DD3A", +"T c #F2DE3B", +"R c #F5E63D", +"E c #C9AE47", +"W c #D48473", +"Q c #D78777", +"! c #DD8370", +"~ c #DD8272", +"^ c #DF8977", +"/ c #E18878", +"( c #D8C247", +") c #D0C257", +"_ c #EFDB4B", +"` c #F4DF40", +"' c #F4DE45", +"] c #F2DE4D", +"[ c #F1DE4E", +"{ c #EDD250", +"} c #EFDD50", +"| c #F0DD50", +" . c #F1E541", +".. c #F6E643", +"X. c #F2E646", +"o. c #F1E048", +"O. c #F4E048", +"+. c #F6E348", +"@. c #F6E34A", +"#. c #F5E14D", +"$. c #F8ED4D", +"%. c #F2E151", +"&. c #F6E550", +"*. c #F5E653", +"=. c #F3E257", +"-. c #F7E855", +";. c #F3E258", +":. c #F4E35B", +">. c #F3E05E", +",. c #F4E25C", +"<. c #F6E45F", +"1. c #F5E460", +"2. c #F7E564", +"3. c #F7E768", +"4. c #F7E76C", +"5. c #F7E868", +"6. c #F7E96C", +"7. c #F8EA70", +"8. c #F9EB70", +"9. c #F9EA74", +"0. c #F9ED75", +"q. c #F4E778", +"w. c #F9E978", +"e. c #FAEA7A", +"r. c #FAEC79", +"t. c #FAEC7D", +"y. c #898787", +"u. c #AAAAAA", +"i. c #DC9A91", +"p. c #FCEE8E", +"a. c #FCF2A3", +"s. c #C2C8C8", +"d. c #C3C9C9", +"f. c #C7D3D3", +"g. c #C9D1D1", +"h. c #D5DBDF", +"j. c #DADFDF", +"k. c #DFDFDF", +"l. c #F5F2D7", +"z. c #E4DEF8", +"x. c gray89", +"c. c gray90", +"v. c #EDE4E2", +"b. c #FCFBE8", +"n. c gray95", +"m. c #F3F3F3", +"M. c #F2F7F7", +"N. c #F4F4F4", +"B. c #F4F5F5", +"V. c gray96", +"C. c #F6F6F6", +"Z. c #F9F3F3", +"A. c gray99", +"S. c #FDFDFD", +"D. c #FEFEFE", +"F. c gray100", +/* pixels */ +"G S F F Z Z B B B B B b b j j j ", +"F.F.a.p.r.r.r.9.8.4.3.2.<.| <.d ", +"F.F.F.F.F.b.r.,.{ @.' ` T U | d ", +"y.A.F.F.A.F.A.h.i.] ' T I H | r ", +" 4 2 d.j.A.Z./ ~ z.M.C.l.| | q ", +" 3 1 < > W Q g.v./ ~ N.Z.N.N.c.", +"D q.) > - : 7 = & 5 s.f.m.n.N.c.", +"Z 0.-.$.] ( E 8 6 * # @ O ; u.k.", +"Z 7.*.+...R L K J k @ o X . % ", +"N 6.5.1.,.;.*.} _ X. .P l 0 $ ", +"m v v j f f p f i e e y a a t 9 " +}; diff --git a/src/pixmaps/flags_xpm/bo.xpm b/src/pixmaps/flags_xpm/bo.xpm new file mode 100644 index 00000000..97ce2662 --- /dev/null +++ b/src/pixmaps/flags_xpm/bo.xpm @@ -0,0 +1,172 @@ +/* XPM */ +static const char *bo[] = { +/* columns rows colors chars-per-pixel */ +"16 11 155 2", +" c #DB1F00", +". c #E90000", +"X c #EB0000", +"o c #ED0000", +"O c #EF0000", +"+ c #F10000", +"@ c #F30000", +"# c #F50000", +"$ c #F70000", +"% c #F90000", +"& c #FB0000", +"* c #FD0100", +"= c #FD0900", +"- c #FD0B00", +"; c #FD1100", +": c #FF1503", +"> c #F56D00", +", c #F66054", +"< c #F76459", +"1 c #F8695E", +"2 c #F96D63", +"3 c #FA7167", +"4 c #F7766C", +"5 c #FB756C", +"6 c #FC786F", +"7 c #F77A70", +"8 c #FD7C72", +"9 c #F87D75", +"0 c #FD7F76", +"q c #008300", +"w c #008700", +"e c #008B00", +"r c #008F00", +"t c #009100", +"y c #009300", +"u c #009900", +"i c #009D00", +"p c #009F00", +"a c #00A300", +"s c #00A700", +"d c #00AB00", +"f c #00AF00", +"g c #00B100", +"h c #00B300", +"j c #00B700", +"k c #519500", +"l c #19C51A", +"z c #1DC71D", +"x c #22C822", +"c c #26CA26", +"v c #2BCC2B", +"b c #31CE31", +"n c #38CD38", +"m c #3BCD3B", +"M c #3ECE3E", +"N c #36D036", +"B c #3BD13B", +"V c #41D041", +"C c #41D341", +"Z c #46D145", +"A c #46D546", +"S c #49D249", +"D c #4AD74A", +"F c #4DD44D", +"G c #4FD94F", +"H c #51D651", +"J c #55D855", +"K c #5BD85B", +"L c #5EDA5F", +"P c #63DC63", +"I c #67DD67", +"U c #6BDE6B", +"Y c #6FE06F", +"T c #C59D00", +"R c #C9A100", +"E c #CBA300", +"W c #93C500", +"Q c #ACCD28", +"! c #AFCE2C", +"~ c #B0D030", +"^ c #B3D235", +"/ c #B5D43A", +"( c #B8D63F", +") c #E7C900", +"_ c #E9CD00", +"` c #E9CF00", +"' c #E4D130", +"] c #E5D334", +"[ c #E5D335", +"{ c #E7D539", +"} c #E8D73E", +"| c #E8D73F", +" . c #EF9648", +".. c #F0994D", +"X. c #F29C52", +"o. c #F39F56", +"O. c #F4A25B", +"+. c #F98178", +"@. c #FE837A", +"#. c #FA847C", +"$. c #FE857C", +"%. c #FB887F", +"&. c #FE887F", +"*. c #F1A462", +"=. c #F5A560", +"-. c #F5A864", +";. c #F6AA68", +":. c #F7AC6D", +">. c #F8AF70", +",. c #F9B173", +"<. c #F9B377", +"1. c #BAD744", +"2. c #B8D446", +"3. c #BCD849", +"4. c #BFDA4E", +"5. c #C1DC53", +"6. c #C3DD58", +"7. c #C5DF5D", +"8. c #E9D843", +"9. c #E9D943", +"0. c #E9D944", +"q. c #EBD948", +"w. c #EBD949", +"e. c #EBDA49", +"r. c #E8D84E", +"t. c #ECDB4D", +"y. c #ECDC4E", +"u. c #E9D851", +"i. c #EDDD52", +"p. c #EDDD53", +"a. c #E9DA55", +"s. c #EEDE57", +"d. c #EFDE57", +"f. c #F0E05B", +"g. c #F0E05C", +"h. c #F1E15F", +"j. c #D0E57A", +"k. c #F1E161", +"l. c #F1E364", +"z. c #F2E365", +"x. c #F2E468", +"c. c #F3E56C", +"v. c #F4E87F", +"b. c #FC8C84", +"n. c #FC8F87", +"m. c #FD918A", +"M. c #FD948D", +"N. c #FE978F", +"B. c #FE9991", +"V. c #FE9B94", +"C. c #FF9C95", +"Z. c #FF9D95", +"A. c #FBC18F", +"S. c #F5E884", +"D. c #F6EA87", +/* pixels */ +": : : : - - - * & & # # @ @ o o ", +": Z.Z.V.B.N.N.m.n.b.#.#.#.9 7 X ", +": Z.&.$.@.0 8 6 5 3 2 1 < , 4 X ", +"> A.<.,.>.:.;.=.O.O.O.X... .*. ", +"` D.c.x.l.k.h.s.p.y.0.9.| { a.E ", +"` S.x.l.h.h.s.i.y.e.0.| { [ u.R ", +") v.l.h.f.s.i.t.e.8.| { [ ' r.T ", +"W j.7.6.5.4.3.1.( / ^ ~ ! Q 2.k ", +"j Y H D A C B n b v c x z l m w ", +"h Y P P L K H H F S Z V M m n q ", +"h f d s a p i u y y r e w w q q " +}; diff --git a/src/pixmaps/flags_xpm/br.xpm b/src/pixmaps/flags_xpm/br.xpm new file mode 100644 index 00000000..793f4804 --- /dev/null +++ b/src/pixmaps/flags_xpm/br.xpm @@ -0,0 +1,164 @@ +/* XPM */ +static const char *br[] = { +/* columns rows colors chars-per-pixel */ +"16 11 147 2", +" c black", +". c #000300", +"X c #000700", +"o c #000B00", +"O c #000D00", +"+ c #000F00", +"@ c #001300", +"# c #001900", +"$ c #001B00", +"% c #002100", +"& c #002700", +"* c #002D00", +"= c #002F00", +"- c #003500", +"; c #003B00", +": c #004100", +"> c #004700", +", c #004B00", +"< c #004D00", +"1 c #005100", +"2 c #005300", +"3 c #005700", +"4 c #005B00", +"5 c #005D00", +"6 c #006100", +"7 c #006300", +"8 c #157F15", +"9 c #198219", +"0 c #1D851D", +"q c #1E851E", +"w c #379714", +"e c #228722", +"r c #2A8C2A", +"t c #30902F", +"y c #368A36", +"u c #358F35", +"i c #349334", +"p c #359335", +"a c #369136", +"s c #379237", +"d c #3A933B", +"f c #3B943B", +"g c #3B963B", +"h c #3E963E", +"j c #39A434", +"k c #76B73B", +"l c #3F9940", +"z c #419841", +"x c #429B42", +"c c #459945", +"v c #459D45", +"b c #479C47", +"n c #479E47", +"m c #4C9E4C", +"M c #4CA14C", +"N c #4DA14D", +"B c #51A251", +"V c #52A252", +"C c #51A451", +"Z c #56A456", +"A c #57A457", +"S c #5BA75B", +"D c #5BA85B", +"F c #5CAA5C", +"G c #5FAC5F", +"H c #63B24F", +"J c #60A95F", +"K c #60B058", +"L c #60AA60", +"P c #60AC60", +"I c #63AE63", +"U c #64AD64", +"Y c #64AD65", +"T c #67AF67", +"R c #68AF69", +"E c #66B067", +"W c #6BB16B", +"Q c #6DB36D", +"! c #71B471", +"~ c #75B875", +"^ c #77B877", +"/ c #7ABA7A", +"( c #7BBB7B", +") c #7DBB7D", +"_ c #7FBD7F", +"` c #A4D419", +"' c #9ED231", +"] c #AFDC3F", +"[ c #F4E91F", +"{ c #F3F319", +"} c #F3F31A", +"| c #F4F41E", +" . c #F4F41F", +".. c #F5F525", +"X. c #F6F62B", +"o. c #F7F72E", +"O. c #F8EF36", +"+. c #F9F03A", +"@. c #ADDD46", +"#. c #A8D954", +"$. c #B0E142", +"%. c #95CA73", +"&. c #B7E269", +"*. c #B3E26D", +"=. c #F5ED44", +"-. c #FAFA42", +";. c #FBFB45", +":. c #F6F249", +">. c #FBFC49", +",. c #FCFC4B", +"<. c #FCFC4F", +"1. c #FDF351", +"2. c #FDFC50", +"3. c #FDFD51", +"4. c #FDFD53", +"5. c #FBFB55", +"6. c #FAFD54", +"7. c #FCFC5A", +"8. c #6D73AA", +"9. c #2A5EF6", +"0. c #2F61F7", +"q. c #2F6BF7", +"w. c #3670F8", +"e. c #3B74F9", +"r. c #4271FA", +"t. c #4775FB", +"y. c #4078FA", +"u. c #4478F8", +"i. c #6569E2", +"p. c #6067EE", +"a. c #6A6FEA", +"s. c #7777E3", +"d. c #7E9FD9", +"f. c #5C83E9", +"g. c #739AF9", +"h. c #80BE80", +"j. c #80BE81", +"k. c #81BE81", +"l. c #8F94B3", +"z. c #ADACA1", +"x. c #CDCAA6", +"c. c #ACC6EB", +"v. c #A8C0F3", +"b. c #A9C0F6", +"n. c #B9D5F7", +"m. c #DFE9F4", +"M. c #D0E1FB", +/* pixels */ +"7 7 7 7 7 5 4 3 2 , , : ; - = & ", +"7 k.k._ ) ( ^ *.&.R T Y J S A % ", +"7 h.E I J F 4.7.5.-.b h g p B # ", +"7 _ I G #.1.s.t.r.i.O.' i t m @ ", +"7 ( K 6.4.x.M.m.c.w.8.X...r b o ", +"4 %.4.<.>.f.y.g.v.n.d... .} k ", +"3 ~ H >.;.l.e.u.q.b.z. .{ w y + ", +"2 ! C N ] +.p.0.9.a.[ ` q 9 d ", +"< Q N b z j o.:.=. .e q 9 8 p ", +"> R Y G D S B @.$.b z h g p u ", +": ; - = & % # @ o X " +}; diff --git a/src/pixmaps/flags_xpm/bs.xpm b/src/pixmaps/flags_xpm/bs.xpm new file mode 100644 index 00000000..f23b6d81 --- /dev/null +++ b/src/pixmaps/flags_xpm/bs.xpm @@ -0,0 +1,167 @@ +/* XPM */ +static const char *bs[] = { +/* columns rows colors chars-per-pixel */ +"16 11 150 2", +" c black", +". c #001B1B", +"X c #004B4B", +"o c #4B4846", +"O c #494949", +"+ c #494A49", +"@ c #4B4A4B", +"# c gray31", +"$ c #554C45", +"% c #455656", +"& c #445F5F", +"* c #535353", +"= c gray33", +"- c #585858", +"; c gray36", +": c #625950", +"> c #586C6C", +", c #5F7B7B", +"< c gray40", +"1 c #6A6A6A", +"2 c #6F6F6F", +"3 c #727273", +"4 c #767676", +"5 c #797979", +"6 c #7B7B7A", +"7 c #BA9E3F", +"8 c #DF8300", +"9 c #E38B00", +"0 c #E58F00", +"q c #E79300", +"w c #F2C410", +"e c #F2C614", +"r c #F3C819", +"t c #F3C81A", +"y c #F4C91F", +"u c #F4CA1F", +"i c #F4CA20", +"p c #F5CB24", +"a c #F5CB25", +"s c #F5CC25", +"d c #F5CD26", +"f c #F6CD2A", +"g c #F6CD2B", +"h c #F6CE2B", +"j c #F7CF2F", +"k c #F3CC32", +"l c #F7CF30", +"z c #F4CD36", +"x c #F4CF3B", +"c c #F7D031", +"v c #F8D134", +"b c #F8D235", +"n c #F8D136", +"m c #F8D236", +"M c #F5D23F", +"N c #F9D33A", +"B c #F9D53A", +"V c #F9D33C", +"C c #F9D83B", +"Z c #BA9E40", +"A c #C4AA4B", +"S c #DCBC40", +"D c #C3AA54", +"F c #F6D344", +"G c #FAD641", +"H c #FAD542", +"J c #FBD747", +"K c #FBD846", +"L c #FCD84B", +"P c #FDDA51", +"I c #008181", +"U c #008383", +"Y c #008787", +"T c #008989", +"R c #008B8B", +"E c #008F8F", +"W c #008799", +"Q c #009191", +"! c #009393", +"~ c #009999", +"^ c #009D9D", +"/ c #009F9F", +"( c #009BA9", +") c #00A3A3", +"_ c #00A7A7", +"` c #00A9A9", +"' c #00ABAB", +"] c #00AFAF", +"[ c #00B1B1", +"{ c #00B3B3", +"} c #00B5B5", +"| c #00B7B7", +" . c #00B9B9", +".. c #00BDBD", +"X. c #3FBFBF", +"o. c #618485", +"O. c #7B9E9E", +"+. c #00C1C1", +"@. c #00C3C3", +"#. c #00C5C5", +"$. c #0BC2CC", +"%. c #0FC4CD", +"&. c #00CBCB", +"*. c #13C6CF", +"=. c #18C7D1", +"-. c #1EC9D3", +";. c #2CCACA", +":. c #2FCACA", +">. c #32CCCC", +",. c #35CDCD", +"<. c #39CFCF", +"1. c #23CBD4", +"2. c #2FCBD3", +"3. c #29CDD6", +"4. c #2CCED6", +"5. c #2ECFD7", +"6. c #3DD0D0", +"7. c #31D0D8", +"8. c #34D1D9", +"9. c #37D2DA", +"0. c #3DD4DB", +"q. c #3ADCDF", +"w. c #5CCFCF", +"e. c #42D2D2", +"r. c #46D3D3", +"t. c #4BD5D5", +"y. c #4ED7D7", +"u. c #42D5DD", +"i. c #47D7DE", +"p. c #49D5DB", +"a. c #50D7D7", +"s. c #5DD2D2", +"d. c #53D8D8", +"f. c #54D8D8", +"g. c #58D9D9", +"h. c #5CDBDB", +"j. c #58DFDF", +"k. c #61DDDD", +"l. c #65DDDD", +"z. c #69DFDF", +"x. c #7BDFDF", +"c. c #4CD8E0", +"v. c #51DAE1", +"b. c #54DBE2", +"n. c #59E4E7", +"m. c #6DE0E0", +"M. c #70E2E2", +"N. c #74E2E2", +"B. c #77E3E3", +"V. c #79E8E8", +/* pixels */ +"X #.&.@.@.@..... .| { [ ] ' _ ` ", +" O.x.V.N.N.M.z.z.z.k.h.g.f.y.^ ", +" 5 , w.n.b.b.c.i.u.0.9.7.4.i.( ", +" 5 ; > D P L J H N v c g a H q ", +" 4 - = : A K G V v l g a i M q ", +" 3 = # + o S C N l g a i t x 0 ", +" 2 # + $ Z B v g g i i t e z 9 ", +" 1 + % Z N v l h a y t e w k 8 ", +" < & X.q.8.4.3.1.-.=.*.%.$.2.W ", +" o.s.j.f.a.t.r.e.6.<.,.>.:.:.I ", +". ` | _ ) ^ ^ ~ ! ! E R Y Y U T " +}; diff --git a/src/pixmaps/flags_xpm/bt.xpm b/src/pixmaps/flags_xpm/bt.xpm new file mode 100644 index 00000000..cda1201b --- /dev/null +++ b/src/pixmaps/flags_xpm/bt.xpm @@ -0,0 +1,168 @@ +/* XPM */ +static const char *bt[] = { +/* columns rows colors chars-per-pixel */ +"16 11 151 2", +" c #DD0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #E90500", +"% c #ED0B00", +"& c #ED0F00", +"* c #F10000", +"= c #F30700", +"- c #EF1500", +"; c #ED5300", +": c #F25714", +"> c #F1670B", +", c #F16B0E", +"< c #F26413", +"1 c #F26B10", +"2 c #F26F14", +"3 c #F36319", +"4 c #F36419", +"5 c #F3701A", +"6 c #F4741E", +"7 c #F4741F", +"8 c #CE6D3E", +"9 c #F46720", +"0 c #F56D23", +"q c #F4632C", +"w c #F66D2A", +"e c #F57326", +"r c #F27B2C", +"t c #F27C2F", +"y c #F27D2F", +"u c #F86934", +"i c #F27F32", +"p c #F37F32", +"a c #F39F00", +"s c #EFBB00", +"d c #F3B100", +"f c #F3B300", +"g c #F5B100", +"h c #F1B700", +"j c #F7B700", +"k c #F5B900", +"l c #F7BB00", +"z c #F5BF00", +"x c #F9BD00", +"c c #FBBD00", +"v c #F9BF00", +"b c #FBBF00", +"n c #F38035", +"m c #F48236", +"M c #F48239", +"N c #F4853B", +"B c #F5873D", +"V c #F58A3F", +"C c #F7C300", +"Z c #F9C100", +"A c #F9C300", +"S c #BA977C", +"D c #D78B57", +"F c #E68844", +"G c #F68542", +"H c #F68D44", +"J c #F78649", +"K c #F78E4E", +"L c #F88A50", +"P c #F98F55", +"I c #F98858", +"U c #F19151", +"Y c #DFBB56", +"T c #F9AB5F", +"R c #FBD346", +"E c #FBD647", +"W c #FBDE45", +"Q c #F2D24D", +"! c #FBDA49", +"~ c #FCDB4B", +"^ c #FBDC49", +"/ c #FCDF4B", +"( c #FCD94F", +") c #FCDA4F", +"_ c #ECD75F", +"` c #F8D753", +"' c #F7DD57", +"] c #FDD951", +"[ c #FDDA50", +"{ c #FDDB51", +"} c #FDDB53", +"| c #FDDB54", +" . c #FEDC58", +".. c #FEDC59", +"X. c #FADD5C", +"o. c #FEDE5C", +"O. c #FEDF5F", +"+. c #E5CD61", +"@. c #FBDC60", +"#. c #FCDF6A", +"$. c #FBE462", +"%. c #FCE266", +"&. c #FDE26D", +"*. c #FDE16F", +"=. c #FDE271", +"-. c #FEE273", +";. c #FAE472", +":. c #FEE274", +">. c #FEE376", +",. c #FEE477", +"<. c #FCE479", +"1. c #FEE579", +"2. c #FFE57A", +"3. c #FFE57B", +"4. c #F5A487", +"5. c #ECBA95", +"6. c #F8E28B", +"7. c #FCE88F", +"8. c #F2E69B", +"9. c #E8DBA7", +"0. c #E6CAB9", +"q. c #E8E4BB", +"w. c #D4CECC", +"e. c #D6D0CF", +"r. c #CFD7DD", +"t. c #D6D7D9", +"y. c #DDD8D8", +"u. c #DFDFDF", +"i. c #E0C0C0", +"p. c #E3CFC1", +"a. c #EAD2C3", +"s. c #E0D7C9", +"d. c #E8D8D0", +"f. c #EBDDD5", +"g. c #D8E2CE", +"h. c #D6D7E5", +"j. c #D4DBE6", +"k. c #D6DDEE", +"l. c #DEE0E1", +"z. c #D9E0E4", +"x. c #DBE2ED", +"c. c #DDE5EC", +"v. c #E7E4E2", +"b. c #E7E4E4", +"n. c #EFE8E5", +"m. c #EAEAEA", +"M. c #EAEAEB", +"N. c #EDEBEE", +"B. c #EAEDF3", +"V. c #F0F2F6", +"C. c #FAFAF7", +/* pixels */ +"C b b z b z k j b b j g d h s ; ", +"b 3.3.3.>.-.-.&.7.6.@.X.' ` K # ", +"A 3.O.o.o.} ( 3.C.V.m._ Y q J $ ", +"A 3.o. .} } / E m.B.n.N.8 e H + ", +"A >. .} } ! Q +.9.x.S r.p.9 V + ", +"b -.} ( ~ R k.h.z.c.v.b.7 5 N + ", +"k *.( ! W q.j.f.d.t.a.F 3 2 m X ", +"k #.^ 8.g.e.y.0.w 4.u.w.: 1 p . ", +"h %.;.s.w.u l.D 0 6 3 < , > t . ", +"z $.T I L L 5.U G B M m p t r ", +"a = * - = = # + + + X X . " +}; diff --git a/src/pixmaps/flags_xpm/bv.xpm b/src/pixmaps/flags_xpm/bv.xpm new file mode 100644 index 00000000..e2e1ef6f --- /dev/null +++ b/src/pixmaps/flags_xpm/bv.xpm @@ -0,0 +1,142 @@ +/* XPM */ +static const char *bv[] = { +/* columns rows colors chars-per-pixel */ +"16 11 125 2", +" c #B10000", +". c #B50000", +"X c #B90000", +"o c #BB0000", +"O c #BD0000", +"+ c #BF0000", +"@ c #C30000", +"# c #C50000", +"$ c #C90000", +"% c #CB0000", +"& c #CF0000", +"* c #D10000", +"= c #D50000", +"- c #D70000", +"; c #D90000", +": c #DB0000", +"> c #DD0000", +", c #DA0E0B", +"< c #DC110E", +"1 c #DC1210", +"2 c #DD1613", +"3 c #DD1714", +"4 c #DF1B19", +"5 c #DF1C19", +"6 c #E10000", +"7 c #E0211E", +"8 c #E0211F", +"9 c #DE2E2C", +"0 c #E12623", +"q c #E22724", +"w c #E22926", +"e c #E22B29", +"r c #E22C2A", +"t c #E42E2B", +"y c #E42E2C", +"u c #E0312F", +"i c #E4302E", +"p c #E4312F", +"a c #E03432", +"s c #E03532", +"d c #E53431", +"f c #E23735", +"g c #E63734", +"h c #E73936", +"j c #E73A37", +"k c #E23B39", +"l c #E83E3C", +"z c #E83F3D", +"x c #E4403D", +"c c #E44442", +"v c #E64644", +"b c #E94342", +"n c #E94442", +"m c #EA4644", +"M c #E64946", +"N c #EA4947", +"B c #EB4947", +"V c #E74B49", +"C c #E74C4B", +"Z c #EB4B49", +"A c #EB4E4B", +"S c #EB4E4C", +"D c #E8504E", +"F c #EC5251", +"G c #E95553", +"H c #EB5A57", +"J c #EF5D5C", +"K c #EC5E5C", +"L c #EC5F5D", +"P c #F0615F", +"I c #ED6360", +"U c #ED6462", +"Y c #EE6765", +"T c #EE6866", +"R c #EF6B69", +"E c #EF6D6A", +"W c #EF6F6D", +"Q c #F07271", +"! c #F27A79", +"~ c #F27D7A", +"^ c #F27D7B", +"/ c #0000A5", +"( c #001DB7", +") c #0353CF", +"_ c #0959D1", +"` c #4B83D5", +"' c #5086D7", +"] c #548AD8", +"[ c #598DD9", +"{ c #5D90DB", +"} c #6594DA", +"| c #6294DD", +" . c #6596DE", +".. c #6697DE", +"X. c #6A99E0", +"o. c #6B9AE0", +"O. c #6F9CE1", +"+. c #6F9DE1", +"@. c #739FE3", +"#. c #77A3E4", +"$. c #7AA4E2", +"%. c #7AA5E5", +"&. c #7BA6E5", +"*. c #7EA8E7", +"=. c #92B6EA", +"-. c #95B9EB", +";. c gray89", +":. c #E7E7E7", +">. c gray93", +",. c #EFEFEF", +"<. c gray95", +"1. c #F3F3F3", +"2. c #F4F4F4", +"3. c gray96", +"4. c #F6F6F6", +"5. c gray97", +"6. c #F8F8F8", +"7. c #F9F9F9", +"8. c gray98", +"9. c #FBFBFB", +"0. c #FBFCFB", +"q. c gray99", +"w. c #FDFDFD", +"e. c #FEFEFE", +"r. c gray100", +/* pixels */ +"6 6 6 r._ r.: : : - - = & & % % ", +"6 ^ ^ r.=.r.Q W R Y P L H G D @ ", +"> ! P r.*.r.F A B b z h d y V @ ", +"6 ! J r.$.r.A B b l h d t w v + ", +"r.r.r.0.#.q.w.9.9.6.6.3.3.3.3.:.", +") =.%.#.@.+.....| { [ ] ` ` } / ", +"9.r.9.9.O.9.9.6.3.3.3.3.1.1.3.;.", +": E Z 9...9.d p t q 8 5 3 1 s . ", +": T n 9...6.p e 0 7 4 1 < , u ", +"- U L 9.$.6.C M c x k f s a 9 ", +"= & & >.( >.@ + + X X . . " +}; diff --git a/src/pixmaps/flags_xpm/bw.xpm b/src/pixmaps/flags_xpm/bw.xpm new file mode 100644 index 00000000..d705e169 --- /dev/null +++ b/src/pixmaps/flags_xpm/bw.xpm @@ -0,0 +1,153 @@ +/* XPM */ +static const char *bw[] = { +/* columns rows colors chars-per-pixel */ +"16 11 136 2", +" c black", +". c gray8", +"X c #191919", +"o c gray10", +"O c gray12", +"+ c #202020", +"@ c gray14", +"# c #252525", +"$ c #2A2A2A", +"% c #2A2B2B", +"& c gray17", +"* c #2F2F2F", +"= c gray19", +"- c #353535", +"; c gray21", +": c #3B3B3A", +"> c gray23", +", c #3B3B3C", +"< c #3F3F3F", +"1 c gray25", +"2 c #414141", +"3 c gray27", +"4 c #464646", +"5 c #494A49", +"6 c #4B4A4B", +"7 c #4B4B4B", +"8 c gray31", +"9 c #504F50", +"0 c #535353", +"q c gray33", +"w c #585858", +"e c #6F6F6F", +"r c #727273", +"t c #767676", +"y c #0083DD", +"u c #0085DD", +"i c #0087DF", +"p c #0089DD", +"a c #008BDD", +"s c #0089DF", +"d c #008DE1", +"f c #008FE3", +"g c #0091E5", +"h c #0095E7", +"j c #009BE9", +"k c #009DEB", +"l c #009FEB", +"z c #00A1ED", +"x c #00A5ED", +"c c #00A9EF", +"v c #00ADF1", +"b c #00AFF3", +"n c #00B1F5", +"m c #00B3F7", +"M c #00B7F5", +"N c #00B5F7", +"B c #00B7F9", +"V c #00B9F9", +"C c #00BBFB", +"Z c #01BDFD", +"A c #07BFFD", +"S c #0BC1FD", +"D c #11C3FD", +"F c #11C3FF", +"G c #13C3FF", +"H c #15C5FF", +"J c #25C9FF", +"K c #37C2F1", +"L c #3BC4F1", +"P c #3FC6F2", +"I c #44C7F3", +"U c #48C9F4", +"Y c #4CCBF5", +"T c #55CBF2", +"R c #57CBF2", +"E c #51CDF6", +"W c #55CEF6", +"Q c #55CFF7", +"! c #5ACDF3", +"~ c #5DCEF3", +"^ c #59D0F7", +"/ c #5AD1F8", +"( c #5ED2F8", +") c #5FD3F9", +"_ c #60CFF4", +"` c #63D1F5", +"' c #67D3F6", +"] c #6AD4F7", +"[ c #6CD5F7", +"{ c #6FD6F7", +"} c #63D4F9", +"| c #63D4FA", +" . c #67D5FA", +".. c #68D6FA", +"X. c #6BD7FB", +"o. c #6FD8FC", +"O. c #72D7F7", +"+. c #73D8F8", +"@. c #75D8F8", +"#. c #76D9F9", +"$. c #73DAFD", +"%. c #76DBFD", +"&. c #7ADAF9", +"*. c #7EDCFA", +"=. c #7ADCFE", +"-. c #7CDEFE", +";. c #7FDFFE", +":. c #81DDFB", +">. c #82DDFB", +",. c #84DEFC", +"<. c #88DFFC", +"1. c #8AE1FD", +"2. c #8EE2FE", +"3. c #90E2FE", +"4. c #93E4FE", +"5. c #94E5FE", +"6. c #95E4FF", +"7. c #96E5FF", +"8. c #97E5FF", +"9. c #CDCDCD", +"0. c #D5D5D5", +"q. c gray93", +"w. c #F1F1F1", +"e. c gray95", +"r. c #F3F3F3", +"t. c #F4F4F4", +"y. c gray96", +"u. c #F6F6F6", +"i. c gray97", +"p. c #F8F8F8", +"a. c #F9F9F9", +"s. c gray98", +"d. c #FBFBFB", +"f. c gray99", +"g. c #FDFDFD", +"h. c #FEFEFE", +/* pixels */ +"J H H H F S A Z C C N n b b x c ", +"F 8.8.8.3.3.3.1.<.,.:.*.&.@.O.z ", +"F 8.-.-.=.%.$.o.X. .' ( ^ W ] j ", +"w.h.h.h.h.f.f.f.d.p.p.u.u.u.u.0.", +" t w q 8 5 4 1 , ; * & # + < ", +" r 0 8 7 4 1 : ; = & @ O o : ", +" e 8 5 4 1 : - * & @ O o . ; ", +"q.f.d.d.d.a.a.u.u.u.u.u.w.w.w.9.", +"B ,.X.| ( ^ W E Y I I I L K R i ", +"n :.*.&.@.+.O.' ' ` _ ~ R R R y ", +"M n b c x z k j h g f f i a u a " +}; diff --git a/src/pixmaps/flags_xpm/by.xpm b/src/pixmaps/flags_xpm/by.xpm new file mode 100644 index 00000000..846866a1 --- /dev/null +++ b/src/pixmaps/flags_xpm/by.xpm @@ -0,0 +1,163 @@ +/* XPM */ +static const char *by[] = { +/* columns rows colors chars-per-pixel */ +"16 11 146 2", +" c #002B00", +". c #002D00", +"X c #002F00", +"o c #003300", +"O c #003700", +"+ c #003D00", +"@ c #004100", +"# c #004700", +"$ c #004D00", +"% c #005100", +"& c #005700", +"* c #005D00", +"= c #E30000", +"- c #E50000", +"; c #E70000", +": c #E90000", +"> c #EB0000", +", c #ED0000", +"< c #EF0000", +"1 c #F10000", +"2 c #F30000", +"3 c #F50000", +"4 c #F70000", +"5 c #F90000", +"6 c #FB0000", +"7 c #FD0000", +"8 c red", +"9 c #F21414", +"0 c #F31919", +"q c #F31A1A", +"w c #F41F1F", +"e c #F42020", +"r c #F52424", +"t c #F52525", +"y c #F52626", +"u c #F62A2A", +"i c #F62B2B", +"p c #F62C2C", +"a c #F72F2F", +"s c #F73030", +"d c #F73131", +"f c #F43636", +"g c #F83535", +"h c #F83636", +"j c #F83736", +"k c #F83737", +"l c #FB353B", +"z c #F43B3B", +"x c #F53F3F", +"c c #F93B3A", +"v c #F93B3B", +"b c #F93B3C", +"n c #F93C3C", +"m c #F93C3D", +"M c #F64444", +"N c #FA4040", +"B c #FA4141", +"V c #FA4142", +"C c #FA4242", +"Z c #FB4545", +"A c #FB4646", +"S c #FB4747", +"D c #F74949", +"F c #F74E4E", +"G c #FB4A49", +"H c #FC4A4B", +"J c #FC4B4B", +"K c #FC4C4C", +"L c #FC4F4F", +"P c #FD4F50", +"I c #EF5B53", +"U c #F85353", +"Y c #FD5151", +"T c #F95757", +"R c #FD5454", +"E c #FD5757", +"W c #FE5959", +"Q c #FA5C5C", +"! c #FE5C5C", +"~ c #FF5F5F", +"^ c #FB6060", +"/ c #FE6161", +"( c #FC6565", +") c #FC6969", +"_ c #FD6D6D", +"` c #E97066", +"' c #FD7071", +"] c #F87775", +"[ c #FE7474", +"{ c #FE7777", +"} c #FE7979", +"| c #FF7E7E", +" . c #0B9C0B", +".. c #0F9E0E", +"X. c #189810", +"o. c #1D9A14", +"O. c #219D19", +"+. c #13A013", +"@. c #18A219", +"#. c #1EA51E", +"$. c #27A01F", +"%. c #2CA324", +"&. c #23A823", +"*. c #29AA29", +"=. c #2CA82C", +"-. c #2FA92F", +";. c #2EAD2E", +":. c #31A52A", +">. c #37A72F", +",. c #3AA732", +"<. c #32AA32", +"1. c #35AD35", +"2. c #3CAA34", +"3. c #39AE39", +"4. c #34B034", +"5. c #3AB33A", +"6. c #3DB03D", +"7. c #3FB53F", +"8. c #41AD3A", +"9. c #47B03F", +"0. c #42B342", +"q. c #46B546", +"w. c #4CB245", +"e. c #4BB74B", +"r. c #50B950", +"t. c #54BC55", +"y. c #58BE58", +"u. c #FDA3A3", +"i. c #FEA5A5", +"p. c #FFB3B3", +"a. c #FFDFDF", +"s. c #CBE3CB", +"d. c #F5E7E9", +"f. c #F9E9EB", +"g. c #FCE9EA", +"h. c #FDEBEB", +"j. c #FEECEC", +"k. c #FEEDED", +"l. c #E7F3E7", +"z. c #F7F4F2", +"x. c #FAF3F2", +"c. c #FFF1F1", +"v. c #FEF4F4", +"b. c #FEF5F5", +"n. c #FFF5F5", +"m. c #FFF9F9", +/* pixels */ +"n.~ a.8 8 8 6 8 6 4 4 4 1 1 < < ", +"8 m.| } [ [ [ _ ) ( ^ Q T U F : ", +"v.p.k.~ W Y Y K A B m k d p D : ", +"8 v./ E E Y J A B m k d p y M ; ", +"h.i.h.R L G A B b g s i y e x ; ", +"8 n.E L H A N v g s i y w q z ; ", +"h.u.h.G A V b g s i y e q 9 f = ", +"l x.I w.8.8.2.,.:.%.O.O.o.X.,.. ", +"h.] l.7.5.4.;.*.&.$.@.+... .-.o ", +"4 z.` y.t.r.e.q.0.6.3.1.<.-.=.. ", +"d.: s.* & % $ # @ + + O . . . . " +}; diff --git a/src/pixmaps/flags_xpm/bz.xpm b/src/pixmaps/flags_xpm/bz.xpm new file mode 100644 index 00000000..1c338366 --- /dev/null +++ b/src/pixmaps/flags_xpm/bz.xpm @@ -0,0 +1,173 @@ +/* XPM */ +static const char *bz[] = { +/* columns rows colors chars-per-pixel */ +"16 11 156 2", +" c #C30000", +". c #C70000", +"X c #CB0000", +"o c #CF0000", +"O c #D10000", +"+ c #D30000", +"@ c #DD0000", +"# c #E10000", +"$ c #E50000", +"% c #E70000", +"& c #E90000", +"* c #EB0000", +"= c #ED0000", +"- c #EF0000", +"; c #F10000", +": c #F50000", +"> c #F90000", +", c #0000A7", +"< c #0000B1", +"1 c #0000C9", +"2 c #0000CB", +"3 c MediumBlue", +"4 c #0000CF", +"5 c #0000D1", +"6 c #0000D7", +"7 c #0001DB", +"8 c #001FDD", +"9 c #0017F1", +"0 c #001FF1", +"q c #0025F1", +"w c #002BF3", +"e c #002FF5", +"r c #0033F5", +"t c #3C5ED9", +"y c #1351E7", +"u c #1753E5", +"i c #1753E7", +"p c #1D57E7", +"a c #1C57E9", +"s c #235BEA", +"d c #225CE8", +"f c #2860E9", +"g c #2861EB", +"h c #2E65EB", +"j c #2D64ED", +"k c #376AE4", +"l c #366AEA", +"z c #3369EC", +"x c #3469EE", +"c c #396DE9", +"v c #3D6FE9", +"b c #396DEF", +"n c #3677E9", +"m c #3E71F0", +"M c #4060DA", +"N c #4263DB", +"B c #4565DC", +"V c #5B79DF", +"C c #6175DE", +"Z c #4173EB", +"A c #4476E9", +"S c #4676E8", +"D c #4676EC", +"F c #4B7AED", +"G c #417BF4", +"H c #467FF5", +"J c #507EF0", +"K c #6579E0", +"L c #6A7DE1", +"P c #76ACBB", +"I c #728DD9", +"U c #7590D9", +"Y c #70A4C7", +"T c #4A87F2", +"R c #4D86F1", +"E c #4C83F5", +"W c #4C83F6", +"Q c #5385F2", +"! c #5186F6", +"~ c #5187F6", +"^ c #568AF7", +"/ c #5A8AF0", +"( c #578AF8", +") c #5B8DF8", +"_ c #5E90F9", +"` c #5E91F9", +"' c #5F91F9", +"] c #6681E5", +"[ c #6E80E1", +"{ c #6084EC", +"} c #6588ED", +"| c #698CED", +" . c #6D8FEE", +".. c #798FE7", +"X. c #6192F6", +"o. c #6D92F0", +"O. c #6293F9", +"+. c #6393F9", +"@. c #6197F9", +"#. c #6696FA", +"$. c #6C99F8", +"%. c #709CF8", +"&. c #759FF9", +"*. c #7DA2F6", +"=. c #78A2F9", +"-. c #7BA4FA", +";. c #7FA6FB", +":. c #B2A08E", +">. c #93A0B3", +",. c #B4ADAB", +"<. c #B3BDA6", +"1. c #88C7AE", +"2. c #8ED5BF", +"3. c #BCC9AF", +"4. c #BED5BE", +"5. c #B1F4A9", +"6. c #B1F4B2", +"7. c #BAF9B6", +"8. c #B9F5BD", +"9. c #C9F5BE", +"0. c #83ABDE", +"q. c #87B0D6", +"w. c #A6B4C0", +"e. c #8A9DE2", +"r. c #8F9FE6", +"t. c #8497EC", +"y. c #849BEE", +"u. c #869EEE", +"i. c #889EEF", +"p. c #80A8FB", +"a. c #9FCCC6", +"s. c #92D6C6", +"d. c #94DBC0", +"f. c #9EDEC1", +"g. c #A1D5D7", +"h. c #A2E2C1", +"j. c #AFEECC", +"k. c #B7F1CF", +"l. c #DDD5D3", +"z. c #D2F5C8", +"x. c #D5FCCD", +"c. c #D8FACE", +"v. c #D4E9D2", +"b. c #D9F5D3", +"n. c #DEF3DA", +"m. c #E5FBDE", +"M. c #DDE2E1", +"N. c #E3E5E3", +"B. c #E1E6E2", +"V. c #E5ECE4", +"C. c #F3EDE5", +"Z. c #E7FCE4", +"A. c #EAF3EC", +"S. c #F0F1F0", +"D. c #F5F4F5", +"F. c #F9F9F9", +/* pixels */ +"> > > > > : ; & & - ; - - & & & ", +"8 i.i.u.y.*.t.r.e...o.L L K C < ", +"r ;.#.+.+.@.g.k.j.s.R m b x J 6 ", +"r ;.+.` X.8.Z.A.V.n.6.A z h F 5 ", +"r -.) ) 0.x.C.3.<.l.9.Y j g D 4 ", +"w -.) ^ a.m.F.,.:.D.b.1.g d A 4 ", +"q &.^ ! q.c.S.w.>.B.z.P d p v 2 ", +"0 %.! E Q 7.v.N.M.4.5.k p u c 2 ", +"9 $.E E H T 2.h.f.2.n a i y l 2 ", +"7 .} } { / ] U I V S B N M t , ", +"& & % % # @ + . X + + + o o o " +}; diff --git a/src/pixmaps/flags_xpm/ca.xpm b/src/pixmaps/flags_xpm/ca.xpm new file mode 100644 index 00000000..b8d7557b --- /dev/null +++ b/src/pixmaps/flags_xpm/ca.xpm @@ -0,0 +1,162 @@ +/* XPM */ +static const char *ca[] = { +/* columns rows colors chars-per-pixel */ +"16 11 145 2", +" c #A10000", +". c #A50000", +"X c #A70000", +"o c #AD0000", +"O c #B10000", +"+ c #B50000", +"@ c #BB0000", +"# c #BF0000", +"$ c #C30000", +"% c #C70000", +"& c #C90000", +"* c #CF0000", +"= c #D30000", +"- c #D50000", +"; c #D90000", +": c #DB0000", +"> c #DF0000", +", c #D41514", +"< c #D61D1D", +"1 c #E30000", +"2 c #E7131B", +"3 c #E91F27", +"4 c #D72424", +"5 c #D8232B", +"6 c #DC2C2C", +"7 c #DA2932", +"8 c #D93636", +"9 c #DD3038", +"0 c #DE373E", +"q c #ED272F", +"w c #E92929", +"e c #EF2D37", +"r c #ED2F37", +"t c #E03335", +"y c #EF353D", +"u c #E23C3C", +"i c #EF393F", +"p c #E03D44", +"a c #EF3B43", +"s c #F13F45", +"d c #DB4444", +"f c #DA4148", +"g c #DC464C", +"h c #DD4A50", +"j c #DF4F55", +"k c #DB5559", +"l c #E74343", +"z c #E24545", +"x c #E3464D", +"c c #E54D51", +"v c #E64E55", +"b c #E64F56", +"n c #F14B53", +"m c #E85757", +"M c #E2555B", +"N c #EA525D", +"B c #EC5959", +"V c #EA5D5E", +"C c #EA5F5F", +"Z c #E45B60", +"A c #EC5E65", +"S c #DE6A6B", +"D c #E56164", +"F c #E56167", +"G c #ED6366", +"H c #EC6666", +"J c #E26C6D", +"K c #E86A6A", +"L c #EA6B6B", +"P c #E9686C", +"I c #E8686D", +"U c #E9686E", +"Y c #EE6D6E", +"T c #EA6E73", +"R c #EE6E74", +"E c #EE6E75", +"W c #EC7176", +"Q c #ED7476", +"! c #EF757A", +"~ c #F07373", +"^ c #F17A7A", +"/ c #F17E7E", +"( c #E87B81", +") c #F17C81", +"_ c gray75", +"` c #EA8384", +"' c #EF8084", +"] c #E98B8B", +"[ c #F28186", +"{ c #F0848A", +"} c #F4868B", +"| c #F28B8F", +" . c #F58B90", +".. c #F39094", +"X. c #F69094", +"o. c #F49796", +"O. c #F49599", +"+. c #F5999E", +"@. c #F79EA2", +"#. c #E8A8A7", +"$. c #E9AFAF", +"%. c #F7A1A5", +"&. c #F8A4A7", +"*. c #F8A4A8", +"=. c #ECBDBE", +"-. c gray77", +";. c #C5C5C5", +":. c #CBCBCB", +">. c gray80", +",. c gray83", +"<. c #E8C0C1", +"1. c #EECECD", +"2. c #E8DDDB", +"3. c #F5D0D3", +"4. c #EBE3E3", +"5. c #EDE1E2", +"6. c #EDE6E6", +"7. c #E9E9E9", +"8. c gray92", +"9. c #ECECEC", +"0. c gray93", +"q. c #EEEEEE", +"w. c #EFEFEF", +"e. c #F7EBED", +"r. c #F1ECED", +"t. c #F0EEEE", +"y. c #F5EDED", +"u. c #F6EDED", +"i. c #F1F1F1", +"p. c gray95", +"a. c #F3F3F3", +"s. c #F3F5F5", +"d. c #F4F4F4", +"f. c gray96", +"g. c #F6F6F6", +"h. c gray97", +"j. c #F8F7F8", +"k. c #F9F9F9", +"l. c #F8FAFB", +"z. c gray98", +"x. c #FAFBFB", +"c. c #FBFBFB", +"v. c gray99", +"b. c #FDFDFD", +"n. c #FEFEFE", +/* pixels */ +"n a s w d.d.d.f.a.a.a.9.= ; = * ", +"e *.*.o.b.b.b.u.e.z.z.z.K W T & ", +"i &.X./ b.v.z.` ( s.d.d.z v I $ ", +"y %. .^ v.3.1.G V <.=.d.u x F # ", +"e @.} ~ c.P Q R I Z d a.t p Z @ ", +"q +.[ Y z.] B A N l S a.6 0 M + ", +"w O.( H z.u.J v v k 5.9.4 9 j O ", +"2 .! A g.f.r.#.$.6.9.8.< 7 h o ", +"1 | W m s.a.a.2.4.9.8.7., 5 g X ", +"> { [ L d.a.a.w.9.w.0.0.8 g f X ", +"; ; - & ,.>.:.:.;.;.;._ X . . " +}; diff --git a/src/pixmaps/flags_xpm/catalonia.xpm b/src/pixmaps/flags_xpm/catalonia.xpm new file mode 100644 index 00000000..eed61c47 --- /dev/null +++ b/src/pixmaps/flags_xpm/catalonia.xpm @@ -0,0 +1,154 @@ +/* XPM */ +static const char *catalonia[] = { +/* columns rows colors chars-per-pixel */ +"16 11 137 2", +" c #E71802", +". c #E61B06", +"X c #E61B0B", +"o c #F1380B", +"O c #F13A0E", +"+ c #EF2511", +"@ c #F23E13", +"# c #F23B14", +"$ c #F43E20", +"% c #F34019", +"& c #F34319", +"* c #F0441B", +"= c #F4451F", +"- c #F4471E", +"; c #E55918", +": c #E65A19", +"> c #E75B1A", +", c #E85C1B", +"< c #F54325", +"1 c #F34823", +"2 c #F54C23", +"3 c #F54924", +"4 c #F6482B", +"5 c #F64E2A", +"6 c #F4492C", +"7 c #F65029", +"8 c #F6532C", +"9 c #F7532F", +"0 c #F7542E", +"q c #F74D30", +"w c #F85236", +"e c #F75831", +"r c #F65C37", +"t c #F85934", +"y c #F85835", +"u c #F85C37", +"i c #F9563C", +"p c #F95C3A", +"a c #F95E3A", +"s c #F9613D", +"d c #FA623F", +"f c #FA5B41", +"g c #FB5F46", +"h c #F76043", +"j c #FA6642", +"k c #FB6A47", +"l c #FA634D", +"z c #FC6E4C", +"x c #FD7151", +"c c #FD7554", +"v c #FE7859", +"b c #FE7B5C", +"n c #D0A409", +"m c #D1A50A", +"M c #D3A70C", +"N c #D6AA0F", +"B c #D7AB10", +"V c #D9AD12", +"C c #DBAF14", +"Z c #DDB116", +"A c #DEB217", +"S c #E0B419", +"D c #E3B71C", +"F c #E5B91E", +"G c #E8BC21", +"H c #EBBF24", +"J c #E4EC10", +"K c #E6ED15", +"L c #E3EB18", +"P c #E7EE1A", +"I c #E5EB1C", +"U c #E6EC1F", +"Y c #E8EF1F", +"T c #F3E41A", +"R c #F4E61F", +"E c #ECC025", +"W c #EEC227", +"Q c #EFC328", +"! c #F0C429", +"~ c #F1C52A", +"^ c #F3C72C", +"/ c #F4C82D", +"( c #F5C92E", +") c #F6CA2F", +"_ c #F7CB30", +"` c #F8CC31", +"' c #F9CD32", +"] c #FACE33", +"[ c #FBCF34", +"{ c #FCD035", +"} c #E6ED22", +"| c #E8EE27", +" . c #E9EE2B", +".. c #F5E725", +"X. c #F3E628", +"o. c #F6E92B", +"O. c #EAF025", +"+. c #EAF126", +"@. c #EBF12B", +"#. c #EBF22C", +"$. c #F7EA30", +"%. c #F8EB36", +"&. c #F9EC3B", +"*. c #EAF030", +"=. c #EBF133", +"-. c #ECF230", +";. c #EDF332", +":. c #EBF135", +">. c #EEF335", +",. c #EEF437", +"<. c #ECF23A", +"1. c #EFF43B", +"2. c #ECF33E", +"3. c #EDF33F", +"4. c #EFF53D", +"5. c #FAEE40", +"6. c #EEF443", +"7. c #EEF445", +"8. c #EFF548", +"9. c #EFF549", +"0. c #F0F540", +"q. c #F0F642", +"w. c #F1F747", +"e. c #F0F64D", +"r. c #F2F74C", +"t. c #F0F64E", +"y. c #F1F652", +"u. c #F2F756", +"i. c #F3F851", +"p. c #F3F955", +"a. c #F3F85B", +"s. c #F4F860", +"d. c #F5F963", +"f. c #F5FA67", +"g. c #F6FA6A", +"h. c #F6FB6D", +"j. c #F6FB6F", +/* pixels */ +"{ { { { { ] ` _ ) ^ Q Q E H G F ", +"] j.j.j.g.f.d.a.a.u.y.r.9.6.2.D ", +", b b b b x x z k j s p e 8 r + ", +") p.p.p.p.i.r.w.6.4.,.-.#.+.=.Z ", +"> l l l l l g f i w q 4 < $ 6 X ", +") &.5.5.5.5.5.&.%.$.o...R T X.B ", +"> h h h h h p y 9 5 2 1 % # 1 . ", +"~ 6.4.0.0.1.>.-.@.| U P K J U M ", +"> h j s p t 0 7 2 - % @ O o % ", +"W t.9.9.7.2.<.,.#. .| } U I L n ", +"E E E G F D A A C V V N M m n n " +}; diff --git a/src/pixmaps/flags_xpm/cc.xpm b/src/pixmaps/flags_xpm/cc.xpm new file mode 100644 index 00000000..beb36369 --- /dev/null +++ b/src/pixmaps/flags_xpm/cc.xpm @@ -0,0 +1,168 @@ +/* XPM */ +static const char *cc[] = { +/* columns rows colors chars-per-pixel */ +"16 11 151 2", +" c black", +". c #000500", +"X c #000900", +"o c #000B00", +"O c #000F00", +"+ c #001100", +"@ c #001700", +"# c #001900", +"$ c #001D00", +"% c #002300", +"& c #002500", +"* c #002B00", +"= c #003100", +"- c #003700", +"; c #003D00", +": c #003F00", +"> c #004300", +", c #004500", +"< c #004900", +"1 c #004B00", +"2 c #004D00", +"3 c #005100", +"4 c #005300", +"5 c #005500", +"6 c #005700", +"7 c #005900", +"8 c #005D03", +"9 c #004F19", +"0 c #005D17", +"q c #0B7A38", +"w c #107D3B", +"e c #137F3E", +"r c #147F3F", +"t c #4E9232", +"y c #188243", +"u c #198243", +"i c #198244", +"p c #1A8444", +"a c #1E8547", +"s c #1F8648", +"d c #1F8748", +"f c #24894D", +"g c #25894D", +"h c #258B4E", +"j c #268B4E", +"k c #2E8C4B", +"l c #2A8A52", +"z c #2C8A51", +"x c #2B8E53", +"c c #2C8E53", +"v c #2F8D55", +"b c #318F57", +"n c #388E50", +"m c #338F58", +"M c #3C9354", +"N c #3E9256", +"B c #349359", +"V c #36915B", +"C c #37955D", +"Z c #39945D", +"A c #3A965E", +"S c #3D9760", +"D c #3B9860", +"F c #3C9861", +"G c #3D9961", +"H c #3F9962", +"J c #5C9A42", +"K c #4C9B52", +"L c #43965A", +"P c #46985B", +"I c #44985E", +"U c #4C9D5E", +"Y c #659E4D", +"T c #60A251", +"R c #6AA453", +"E c #6FA658", +"W c #7CAD5F", +"Q c #429765", +"! c #409963", +"~ c #429B66", +"^ c #449C67", +"/ c #459D67", +"( c #4D9C63", +") c #469C68", +"_ c #479D6A", +"` c #499E6A", +"' c #4B9A6F", +"] c #499F6C", +"[ c #4B9E6C", +"{ c #529F68", +"} c #559F6F", +"| c #549D79", +" . c #4FA066", +".. c #49A06C", +"X. c #4EA16F", +"o. c #50A06F", +"O. c #57A16D", +"+. c #57A26C", +"@. c #5AA76F", +"#. c #4FA270", +"$. c #54A474", +"%. c #59A073", +"&. c #59A571", +"*. c #58A677", +"=. c #5DA97B", +"-. c #64AE70", +";. c #6CAD71", +":. c #61AC7F", +">. c #D1BE27", +",. c #C2C03E", +"<. c #CFC33C", +"1. c #E6CC3E", +"2. c #8CAA47", +"3. c #93B051", +"4. c #A8BA4D", +"5. c #81B36D", +"6. c #81B576", +"7. c #87B976", +"8. c #B9C06B", +"9. c #ADC472", +"0. c #CAC448", +"q. c #D4C441", +"w. c #DAC941", +"e. c #DACA4F", +"r. c #CFC952", +"t. c #E1CD4A", +"y. c #ECD24F", +"u. c #E2CF51", +"i. c #E3D154", +"p. c #EAD455", +"a. c #FEDD58", +"s. c #FDED54", +"d. c #FEEE59", +"f. c #E2D365", +"g. c #FEF17D", +"h. c #FFF67E", +"j. c #5FA283", +"k. c #65AE82", +"l. c #66AE83", +"z. c #69B085", +"x. c #6AB187", +"c. c #6DB389", +"v. c #6FB38A", +"b. c #74B38F", +"n. c #70B58C", +"m. c #72B48F", +"M. c #77B591", +"N. c #ACCC8A", +"B. c #B3CD8D", +"V. c #F3E284", +"C. c #FFE982", +/* pixels */ +"8 8 8 8 7 6 4 2 < > : - 5 * & $ ", +"8 B.h.V.M.b.n.v.x.k.z.;.f.5.o.@ ", +"8 C.j.7.d.| &.} _ ^ F C T c [ O ", +"0 g.9.8.s.%.' p.t.F 3.B c j W X ", +"9 N.a.s.-.O.i.r.F 4.w.2.j t u.* ", +"4 m.;.@.O.{ y.U ! I >.j f u E ", +"4 v.#.] .( t.0.N l f s a >.D ", +"< x.../ ! I L 1.<.f s i r q m ", +", k./ H A B M n k s i e t q v ", +": :.=.*.$.X.[ _ Q F Z R q.Y z ", +"- = * % $ @ + X . # " +}; diff --git a/src/pixmaps/flags_xpm/cd.xpm b/src/pixmaps/flags_xpm/cd.xpm new file mode 100644 index 00000000..c39b6ba7 --- /dev/null +++ b/src/pixmaps/flags_xpm/cd.xpm @@ -0,0 +1,132 @@ +/* XPM */ +static const char *cd[] = { +/* columns rows colors chars-per-pixel */ +"16 11 115 2", +" c #B20000", +". c #B80000", +"X c #C10000", +"o c #C40000", +"O c #C80000", +"+ c #CA0000", +"@ c #F2000E", +"# c #F4000E", +"$ c #F5000F", +"% c #F6000F", +"& c #F7000F", +"* c #F8000F", +"= c #F9000F", +"- c #FC000F", +"; c #FE000F", +": c #FF000F", +"> c #FF0010", +", c #FF0011", +"< c #FF370D", +"1 c #FF380D", +"2 c #F52528", +"3 c #FE2529", +"4 c #FF252A", +"5 c #C86200", +"6 c #FF6319", +"7 c #FF6419", +"8 c #FF6519", +"9 c #FF5326", +"0 c #FF5627", +"q c #FF7831", +"w c #B8B600", +"e c #C1DA07", +"r c yellow", +"t c #FFFF0A", +"y c #FFFD10", +"u c #FFFF10", +"i c #FFFF11", +"p c #FFFF12", +"a c #FFFF23", +"s c #FFFB2A", +"d c #FFFF2B", +"f c #EFFF6F", +"g c #0084B2", +"h c #0086B2", +"j c #0086B4", +"k c #0088B4", +"l c #0089B6", +"z c #0089B9", +"x c #008DBF", +"c c #3DFFA0", +"v c #4EC884", +"b c #0092C1", +"n c #0094C4", +"m c #0098CB", +"M c #00B2E8", +"N c #00B4ED", +"B c #00B9F4", +"V c #00BDF8", +"C c #00BFFB", +"Z c #48B1D1", +"A c #49B2D3", +"S c #49B3D4", +"D c #4AB4D6", +"F c #4AB5D6", +"G c #4AB6D7", +"H c #4BB7D9", +"J c #4BB8DA", +"K c #61BAD4", +"L c #61BBD4", +"P c #62BBD5", +"I c #62BCD5", +"U c #62BDD7", +"Y c #63BED9", +"T c #63BFDA", +"R c #00C1FD", +"E c #02C4FF", +"W c #04C8FF", +"Q c #05CAFF", +"! c #05CBFF", +"~ c #05CFFF", +"^ c #07FFF6", +"/ c #64C0DB", +"( c #65C2DD", +") c #54CEF4", +"_ c #55D0F7", +"` c #55D1F8", +"' c #56D3FA", +"] c #57D4FB", +"[ c #57D5FD", +"{ c #58D7FF", +"} c #66C4E0", +"| c #6CD4F3", +" . c #6DD7F8", +".. c #6ED9FA", +"X. c #6FDBFD", +"o. c #6FDCFE", +"O. c #70DEFF", +"+. c #70E0FF", +"@. c #71E0FF", +"#. c #BCEE84", +"$. c #BDEF85", +"%. c #BFF186", +"&. c #B4EFAB", +"*. c #B2EEAC", +"=. c #B3F8A1", +"-. c #BBF6AA", +";. c #B9FBB6", +":. c #BCFCB7", +">. c #C5EF91", +",. c #C5F190", +"<. c #C6F391", +"1. c #CCF19B", +"2. c #F6FF81", +"3. c #C3F6B2", +"4. c #C9FDB7", +/* pixels */ +"~ ~ c ~ ~ ~ Q W R C B N M e o o ", +"~ :.a ;.+.+.O.X. . .| 1.s 9 2 ", +"^ d p p =.{ ' ` ) ,.p < & @ 4 . ", +"~ 2.p f ' ' ` <.t < & & , , q w ", +"Q 4.[ -.' *.p < * & , : 6 p >.x ", +"E o.' *.p 1 : * , , 8 p #.G T l ", +"C 3.t 1 : & , : 8 t $.H G A U l ", +"r 0 : : : , 8 p %.J G S A Z P g ", +"O * , , 8 p %.H J J D S S A P g ", +"O 3 8 t %.} } } } T T U P P P g ", +"o 5 v m m m n b b z j j g g g g " +}; diff --git a/src/pixmaps/flags_xpm/cf.xpm b/src/pixmaps/flags_xpm/cf.xpm new file mode 100644 index 00000000..255d293b --- /dev/null +++ b/src/pixmaps/flags_xpm/cf.xpm @@ -0,0 +1,175 @@ +/* XPM */ +static const char *cf[] = { +/* columns rows colors chars-per-pixel */ +"16 11 158 2", +" c #001D00", +". c #002300", +"X c #005A00", +"o c #005E00", +"O c #0C6D0C", +"+ c #D80000", +"@ c #DA0000", +"# c #F00000", +"$ c #F30000", +"% c #F52323", +"& c #F62929", +"* c #F62A2A", +"= c #F72F2F", +"- c #F83535", +"; c #F83636", +": c #F93B3B", +"> c #F93B3C", +", c #F64242", +"< c #F74646", +"1 c #FA4141", +"2 c #FA4142", +"3 c #FB4747", +"4 c #FC4C4C", +"5 c #FC6969", +"6 c #FD6D6D", +"7 c #109610", +"8 c #149314", +"9 c #149914", +"0 c #199519", +"q c #199619", +"w c #1F981F", +"e c #3F8F00", +"r c #249B24", +"t c #2A9E2A", +"y c #33A532", +"u c #36A236", +"i c #34AF34", +"p c #3AB23A", +"a c #3BB23A", +"s c #74BC00", +"d c #40B43F", +"f c #4AA74A", +"g c #40B540", +"h c #45B745", +"j c #49B949", +"k c #49BA49", +"l c #4FBC4F", +"z c #6AC76A", +"x c #6FC86F", +"c c #BBBB02", +"v c #AAD50B", +"b c #ACD60E", +"n c #AED713", +"m c #B0DA19", +"M c #B3DC1E", +"N c #B6DA2F", +"B c #BAE12E", +"V c #BCE234", +"C c #BFE23A", +"Z c #C2C200", +"A c #C4C400", +"S c #CCCC00", +"D c #CDCD00", +"F c #CECE00", +"G c #D1D100", +"H c #D3D300", +"J c #D4D400", +"K c #D6D600", +"L c #DDDD00", +"P c #DFDF00", +"I c #DFE200", +"U c #C1E43F", +"Y c #F2F22C", +"T c #F2F22F", +"R c #F2F232", +"E c #F3F335", +"W c #F4F439", +"Q c #F5F53D", +"! c #C3E544", +"~ c #F7F74B", +"^ c #F8F850", +"/ c #F9F955", +"( c #F9F958", +") c #FAFA5D", +"_ c #CEEA66", +"` c #FBFB62", +"' c #EDED7E", +"] c #FFFF7F", +"[ c #0000CE", +"{ c #000CCE", +"} c #0010D3", +"| c #0016D7", +" . c #001CD9", +".. c #001FDC", +"X. c #0025DE", +"o. c #092FD8", +"O. c #0024E3", +"+. c #0029E1", +"@. c #0230E7", +"#. c #053CE7", +"$. c #0A3BE8", +"%. c #0A3CE9", +"&. c #0A3EE9", +"*. c #0C3EE8", +"=. c #0C3EE9", +"-. c #5D82F1", +";. c #6286F2", +":. c #6689F4", +">. c #6B8DF5", +",. c #6F90F6", +"<. c #7493F2", +"1. c #779EF2", +"2. c #7A9FF4", +"3. c #7B99F8", +"4. c #7D9CF9", +"5. c #7FA3F5", +"6. c #7FA1F9", +"7. c #B7B7B7", +"8. c #87C887", +"9. c #8BCA8B", +"0. c #8ECB8E", +"q. c #98CF98", +"w. c #90D191", +"e. c #94D394", +"r. c #9DD89D", +"t. c #A0DAA1", +"y. c #A3D8A3", +"u. c #A6DAA6", +"i. c #A9DBA9", +"p. c #B9E2B9", +"a. c #EDED8F", +"s. c #E4E499", +"d. c #82A5F6", +"f. c #85A8F7", +"g. c #81A0F9", +"h. c #8AA5F8", +"j. c #93ACFA", +"k. c #94B3FA", +"l. c #97B5FA", +"z. c #9CB3FB", +"x. c gray77", +"c. c #E4E4E4", +"v. c #E4E4E9", +"b. c #F4F4F4", +"n. c #F4F4F5", +"m. c gray96", +"M. c #F5F5F6", +"N. c #F6F6F6", +"B. c gray97", +"V. c #F8F8F8", +"C. c #F9F9F9", +"Z. c #FBFBFB", +"A. c #FBFBFE", +"S. c gray99", +"D. c #FCFCFD", +"F. c #FDFCFD", +"G. c #FDFDFD", +"H. c #FEFEFE", +/* pixels */ +"o.*.c %.%.#.@.$ $ O.+.X... .| } ", +"*.s.] a.k.k.j.6 5 h.f.d.5.2.1.{ ", +"$.z.' g.5.4.3.4 3 ,.>.:.;.-.<.[ ", +"v.H.A.A.A.F.F.3 2 Z.V.B.B.b.B.x.", +"c.H.H.H.H.Z.F.2 > V.B.B.b.b.b.7.", +"f p.i.u.y.t.r.> ; e.w.0.9.8.q.O ", +"o x l j h g a ; = t r w 0 8 u ", +"X z j h a a i = * r w 0 9 7 y . ", +"s _ ! ! C V B * % M m n b v N e ", +"Z ` ) ( / ~ ~ < , Q W E R T T S ", +"Z A D J I P L + + K H H D S S S " +}; diff --git a/src/pixmaps/flags_xpm/cg.xpm b/src/pixmaps/flags_xpm/cg.xpm new file mode 100644 index 00000000..88828660 --- /dev/null +++ b/src/pixmaps/flags_xpm/cg.xpm @@ -0,0 +1,142 @@ +/* XPM */ +static const char *cg[] = { +/* columns rows colors chars-per-pixel */ +"16 11 125 2", +" c #DD0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #F10B0B", +"% c #F10F0E", +"& c #F21010", +"* c #F21313", +"= c #F21414", +"- c #F31919", +"; c #F31A1A", +": c #F41E1E", +"> c #F41F1F", +", c #F42020", +"< c #F52725", +"1 c #F52B23", +"2 c #F52B24", +"3 c #F52A25", +"4 c #F52826", +"5 c #F22C2C", +"6 c #F22F2F", +"7 c #F23232", +"8 c #F33232", +"9 c #F33535", +"0 c #F43636", +"q c #F43939", +"w c #F43B3B", +"e c #F53D3D", +"r c #F53F3F", +"t c #ED4900", +"y c #F64242", +"u c #F64444", +"i c #F74949", +"p c #F75346", +"a c #00B100", +"s c #00B700", +"d c #00B900", +"f c #00BB00", +"g c #00BD00", +"h c #00BF00", +"j c #00C100", +"k c #00C300", +"l c #00C700", +"z c #4DD500", +"x c #49D649", +"c c #49D749", +"v c #4BD74B", +"b c #4DD74B", +"n c #4DD84B", +"m c #4FD94F", +"M c #50D84C", +"N c #50D950", +"B c #51D951", +"V c #53DB53", +"C c #54DB54", +"Z c #58DC58", +"A c #58DC59", +"S c #59DC59", +"D c #5CDE5C", +"F c #5FDF5F", +"G c #66DD66", +"H c #6EDF69", +"J c #6DDF6D", +"K c #6AE06A", +"L c #6FE16F", +"P c #70E271", +"I c #72E273", +"U c #74E274", +"Y c #76E376", +"T c #77E377", +"R c #79E479", +"E c #7BE47A", +"W c #7BE47B", +"Q c #EDBF00", +"! c #F6A52B", +"~ c #F6A02C", +"^ c #F6AA2B", +"/ c #F6AF2B", +"( c #F6B32A", +") c #F6BD29", +"_ c #EDC300", +"` c #EFC500", +"' c #F1C901", +"] c #F3CB09", +"[ c #F5CD11", +"{ c #F7D117", +"} c #F7F72E", +"| c #F7F72F", +" . c #F7F730", +".. c #F7F731", +"X. c #F8F834", +"o. c #F8F835", +"O. c #F8F836", +"+. c #F8F837", +"@. c #F9F93A", +"#. c #F9F93B", +"$. c #F9F93C", +"%. c #F9F93D", +"&. c #FAFA3F", +"*. c #F7AE4E", +"=. c #9EE844", +"-. c #A5EA45", +";. c #ABEB45", +":. c #B1EC46", +">. c #B3ED46", +",. c #B4ED47", +"<. c #BFF047", +"1. c #ACEB62", +"2. c #F7CB4B", +"3. c #FAFA40", +"4. c #FAFA41", +"5. c #FAFA42", +"6. c #F8F850", +"7. c #F8F853", +"8. c #F9F955", +"9. c #F9F957", +"0. c #F9F958", +"q. c #FAFA5C", +"w. c #FAFA5D", +"e. c #CAF265", +"r. c #FBFB60", +/* pixels */ +"l k k k k k f g f s [ [ ] ' ` t ", +"k W W W Y U I J H e.r.q.q.7.*.# ", +"k W F D D V V M <.4.%.+...~ i # ", +"k R D Z C M b ,.4.%.+...! 4 u + ", +"k Y Z V V x :.4.&.o.| ^ < , r + ", +"g I V m b :.4.@.+.../ 4 > ; w + ", +"g L m x ;.&.@.o.| ( 1 > ; = 0 X ", +"f K x -.&.@.o.| ( 1 > ; = & 7 . ", +"s G =.&.@...| ) 1 > = = % $ 6 . ", +"a 1.q.q.9.6.2.p y w w 0 7 6 6 . ", +"z ] ' ` _ Q # + + + X X . " +}; diff --git a/src/pixmaps/flags_xpm/ch.xpm b/src/pixmaps/flags_xpm/ch.xpm new file mode 100644 index 00000000..65c665d9 --- /dev/null +++ b/src/pixmaps/flags_xpm/ch.xpm @@ -0,0 +1,81 @@ +/* XPM */ +static const char *ch[] = { +/* columns rows colors chars-per-pixel */ +"11 11 64 1", +" c #E30000", +". c #E50000", +"X c #E70000", +"o c #E90000", +"O c #EB0000", +"+ c #ED0000", +"@ c #EF0000", +"# c #F10000", +"$ c #F30000", +"% c #F50000", +"& c #F70000", +"* c #F90000", +"= c #FB0000", +"- c #FD0000", +"; c red", +": c #F52323", +"> c #F62929", +", c #F62A2A", +"< c #F72F2F", +"1 c #F53D3D", +"2 c #FA3F3F", +"3 c #F64242", +"4 c #F74646", +"5 c #F74747", +"6 c #FA4142", +"7 c #FA4444", +"8 c #FB4545", +"9 c #FB4747", +"0 c #FB4949", +"q c #FC4C4C", +"w c #F75050", +"e c #F85758", +"r c #F95858", +"t c #F95859", +"y c #F85B5B", +"u c #F95B5B", +"i c #FA5B5B", +"p c #FE5959", +"a c #FA5D5D", +"s c #FE5C5C", +"d c #FE5F5F", +"f c #FB6060", +"g c #FB6162", +"h c #FC6565", +"j c #FC6666", +"k c #FC6969", +"l c #FC6A6A", +"z c #FD6D6D", +"x c #FD7272", +"c c #FD7575", +"v c #FE7979", +"b c #FE7A7A", +"n c #FF7B7A", +"m c #FF7B7B", +"M c gray97", +"N c #F8F8F8", +"B c #F9F9F9", +"V c gray98", +"C c #FBFBFB", +"Z c #FBFCFB", +"A c gray99", +"S c #FDFCFD", +"D c #FDFDFD", +"F c #FEFEFE", +/* pixels */ +";;;;;==;==%", +";mmcmmczkh%", +";mdsDDDq9g%", +";mspDDZ97t#", +"=mDDDACCNa@", +";mDDDCCNNyo", +"=xACCCNNMw@", +"=l07NCN<>9.", +"=j72CMM>:3.", +"%gartew431.", +"%##@@@oo.. " +}; diff --git a/src/pixmaps/flags_xpm/ci.xpm b/src/pixmaps/flags_xpm/ci.xpm new file mode 100644 index 00000000..a4d8efaa --- /dev/null +++ b/src/pixmaps/flags_xpm/ci.xpm @@ -0,0 +1,137 @@ +/* XPM */ +static const char *ci[] = { +/* columns rows colors chars-per-pixel */ +"16 11 120 2", +" c #ED5300", +". c #EF5B00", +"X c #F16300", +"o c #F36700", +"O c #F76F00", +"+ c #F57500", +"@ c #F97700", +"# c #FB7B00", +"$ c #FD7F00", +"% c #008100", +"& c #008300", +"* c #008700", +"= c #008900", +"- c #008B00", +"; c #008F00", +": c #009300", +"> c #009700", +", c #009B00", +"< c #009D00", +"1 c #00A700", +"2 c #00A900", +"3 c #00AB00", +"4 c #00AF00", +"5 c #00B100", +"6 c #0BC20B", +"7 c #0FC40E", +"8 c #10C410", +"9 c #13C513", +"0 c #14C614", +"q c #19C719", +"w c #19C819", +"e c #1AC81A", +"r c #1FC91F", +"t c #1FCA1F", +"y c #20CA20", +"u c #25CB25", +"i c #25CC25", +"p c #26CD26", +"a c #2BCD2B", +"s c #2BCE2B", +"d c #2CCA2C", +"f c #2FCA2F", +"g c #2FCB2F", +"h c #2CCE2C", +"j c #31CF31", +"k c #32CC32", +"l c #33CC32", +"z c #35CD35", +"x c #36CD36", +"c c #3BCF3B", +"v c #31D031", +"b c #37D137", +"n c #3FD23F", +"m c #44D344", +"M c #49D549", +"N c #4ED74E", +"B c #53D853", +"V c #58D957", +"C c #5CDA5C", +"Z c #FD8300", +"A c #FF8500", +"S c #FD8700", +"D c #FF8700", +"F c #FF8900", +"G c #FF9100", +"H c #F9AA3A", +"J c #FAAD3F", +"K c #FAAE3F", +"L c #FAB144", +"P c #FBB045", +"I c #FBB145", +"U c #FCB34B", +"Y c #FBB449", +"T c #FCB64F", +"R c #FCB74F", +"E c #FDB550", +"W c #F9B555", +"Q c #FDB754", +"! c #FDB953", +"~ c #FDB954", +"^ c #F9B958", +"/ c #FEBA59", +"( c #FEBB59", +") c #FEBC58", +"_ c #FABC5D", +"` c #FEBD5C", +"' c #FEBF5F", +"] c #FBBE62", +"[ c #FCC066", +"{ c #FCC36A", +"} c #FDC46F", +"| c #FEC673", +" . c #FEC777", +".. c #FEC876", +"X. c #FEC879", +"o. c #FFCA7A", +"O. c #FFCA7B", +"+. c gray82", +"@. c LightGray", +"#. c #D7D7D7", +"$. c gray85", +"%. c #DDDDDD", +"&. c #E9E9E9", +"*. c gray92", +"=. c gray93", +"-. c #EFEFEF", +";. c #EFEFF1", +":. c #F3F3F3", +">. c #F4F4F4", +",. c gray96", +"<. c #F6F6F6", +"1. c gray97", +"2. c #F8F8F8", +"3. c #F9F9F9", +"4. c gray98", +"5. c #FBFBFB", +"6. c gray99", +"7. c #FDFDFD", +"8. c #FDFDFE", +"9. c #FEFEFE", +/* pixels */ +"G F F A Z ;.-.=.=.*.&.5 4 3 1 3 ", +"A O.O.O. .9.7.7.5.7.5.C V B N , ", +"A O.' ` / 7.7.5.5.5.3.b k h M , ", +"F O.' ~ Q 9.5.5.5.3.2.k s p m > ", +"A ..~ ~ Q 6.5.3.3.3.>.s p t n > ", +"Z | ~ T Y 5.5.2.2.2.2.u t w c ; ", +"Z } T Y P 3.3.2.>.>.>.y w 0 x = ", +"# { Y L L 2.2.2.5.>.>.q 0 8 k * ", +"@ ] L L H 2.5.>.>.>.:.8 8 6 f * ", +"O ] _ W W 5.>.2.>.>.>.z k f d % ", +"+ o X . %.$.#.$.@.@.= * = % = " +}; diff --git a/src/pixmaps/flags_xpm/ck.xpm b/src/pixmaps/flags_xpm/ck.xpm new file mode 100644 index 00000000..dc633ce5 --- /dev/null +++ b/src/pixmaps/flags_xpm/ck.xpm @@ -0,0 +1,165 @@ +/* XPM */ +static const char *ck[] = { +/* columns rows colors chars-per-pixel */ +"16 11 148 2", +" c black", +". c #000003", +"X c #000009", +"o c #00000B", +"O c #000011", +"+ c #000019", +"@ c #00001F", +"# c #000023", +"$ c #000025", +"% c #00002B", +"& c #000031", +"* c #000037", +"= c #000039", +"- c #00003F", +"; c #000045", +": c #00004B", +"> c #00196B", +", c #002977", +"< c #203A76", +"1 c #253D79", +"2 c #571D59", +"3 c #591F5D", +"4 c #29417B", +"5 c #2A427C", +"6 c #2D467E", +"7 c #2E467F", +"8 c #2F477F", +"9 c #3E517F", +"0 c #D31B19", +"q c #891D43", +"w c #8D1D41", +"e c #8B3155", +"r c #A5536D", +"t c #BB677B", +"y c #D86F73", +"u c #E36C6B", +"i c #E57372", +"p c #E27879", +"a c #EA7D7A", +"s c #373781", +"d c #324982", +"f c #324B82", +"g c #344B83", +"h c #374E85", +"j c #374E86", +"k c #385086", +"l c #395086", +"z c #3A5187", +"x c #3C5289", +"c c #3C5389", +"v c #3D5389", +"b c #3E5488", +"n c #3D558A", +"m c #3E558A", +"M c #3F558A", +"N c #445683", +"B c #40568A", +"V c #41578A", +"C c #41578C", +"Z c #42578C", +"A c #42588D", +"S c #43598D", +"D c #44598C", +"F c #445A8D", +"G c #475C8E", +"H c #4A5C88", +"J c #485D8F", +"K c #465C90", +"L c #475C90", +"P c #485E91", +"I c #4A5F92", +"U c #6F578F", +"Y c #4F618B", +"T c #4B6090", +"R c #4B6093", +"E c #4C6092", +"W c #4C6193", +"Q c #4E6293", +"! c #4D6194", +"~ c #4E6394", +"^ c #4F6395", +"/ c #506594", +"( c #526695", +") c #516596", +"_ c #516597", +"` c #516697", +"' c #536898", +"] c #576A99", +"[ c #556A9A", +"{ c #556A9B", +"} c #566A9A", +"| c #5A6D9A", +" . c #5A6E9C", +".. c #5B6E9C", +"X. c #5B6E9D", +"o. c #5F719E", +"O. c #6B6197", +"+. c #60719E", +"@. c #5F72A0", +"#. c #6375A0", +"$. c #6475A1", +"%. c #6377A5", +"&. c #6779A4", +"*. c #687AA4", +"=. c #6B7DA6", +"-. c #6B7DA7", +";. c #6C7EA7", +":. c #707FA1", +">. c #826995", +",. c #846D99", +"<. c #8F769B", +"1. c #AF7B95", +"2. c #947DA3", +"3. c #6F80A9", +"4. c #7081A9", +"5. c #7384AB", +"6. c #7585AC", +"7. c #7989AE", +"8. c #7C8CB1", +"9. c #868BB3", +"0. c #908EB7", +"q. c #C78696", +"w. c #C58999", +"e. c #D99097", +"r. c #E08587", +"t. c #EC8583", +"y. c #E18689", +"u. c #E89596", +"i. c #D8A4AE", +"p. c #D4ABB7", +"a. c #DAABB4", +"s. c #F0AAA8", +"d. c #F0ACAB", +"f. c #E6B9BF", +"g. c #93A0C7", +"h. c #A4ACCA", +"j. c #D4BAC8", +"k. c #DFBFC8", +"l. c #C3C3C3", +"z. c #DDD3DE", +"x. c #E6C3CA", +"c. c #E8CED4", +"v. c #F1F1F1", +"b. c #F3F3F3", +"n. c #F4F4F4", +"m. c #F6F6F6", +"M. c gray97", +"N. c #F8F8F8", +/* pixels */ +"t U , q w > 2 r # - * % % $ # + ", +"s x.z.a.i.j.c.h.:.5.3.-.&.$.o.O ", +"0 u.t.i u a p y Y } ! R m.M | X ", +"e f.s.r.y.d.e.1.H ! N.F M z m.. ", +"O.k.0.w.q.g.p.2.N K S M z g ` . ", +"3 9.%.,.>.} -.<.9 m.M h f 8 Y l.", +": 8.@. .} ` ! K S M z f 8 4 K . ", +"; 7. .} _ ! K Z c h n.8 4 1 b.. ", +"- 6.} ` R K V c h f 6 4 v.< V . ", +"= 4.;.*.$.+.| ] ` W Y G A M b . ", +"& % $ @ + O X . . . . . . . . . " +}; diff --git a/src/pixmaps/flags_xpm/cl.xpm b/src/pixmaps/flags_xpm/cl.xpm new file mode 100644 index 00000000..750eb326 --- /dev/null +++ b/src/pixmaps/flags_xpm/cl.xpm @@ -0,0 +1,138 @@ +/* XPM */ +static const char *cl[] = { +/* columns rows colors chars-per-pixel */ +"16 11 121 2", +" c #DD0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #ED0000", +"% c #EF0000", +"& c #F10000", +"* c #F30000", +"= c #F50000", +"- c #F70000", +"; c #F90000", +": c #FB0000", +"> c #FD0000", +", c #F10B0B", +"< c #F10F0E", +"1 c #F21010", +"2 c #F21313", +"3 c #F21414", +"4 c #F31919", +"5 c #F41E1E", +"6 c #F41F1F", +"7 c #F52323", +"8 c #F52424", +"9 c #F62929", +"0 c #F62A2A", +"q c #F22C2C", +"w c #F22F2F", +"e c #F72E2E", +"r c #F72F2F", +"t c #F23232", +"y c #F33232", +"u c #F33535", +"i c #F43636", +"p c #F83434", +"a c #F83535", +"s c #F43939", +"d c #F53D3D", +"f c #F93A3A", +"g c #F93B3A", +"h c #FA3F3F", +"j c #F64242", +"k c #F74646", +"l c #FA4040", +"z c #FA4444", +"x c #FB4545", +"c c #F74B4B", +"v c #FB4949", +"b c #FB4A49", +"n c #FC4F4F", +"m c #F85050", +"M c #F95455", +"N c #F95858", +"B c #FA5D5D", +"V c #FB6162", +"C c #FC6666", +"Z c #FC6A6A", +"A c #FD6F6F", +"S c #003FAF", +"D c #0053C1", +"F c #0059C3", +"G c #005BC3", +"H c #005DC3", +"J c #0067C7", +"K c #0061D3", +"L c #5293D1", +"P c #5695D3", +"I c #5B98D4", +"U c #549ADA", +"Y c #599EDB", +"T c #5CA1DA", +"R c #62A4DC", +"E c #66A7DE", +"W c #6AAADE", +"Q c #78ABDC", +"! c #50A1E2", +"~ c #54A6E5", +"^ c #58A7E5", +"/ c #77B1E2", +"( c #7BB5E4", +") c #7AB6E5", +"_ c #76B9EB", +"` c #85BAE5", +"' c #85BDE6", +"] c #91C3E7", +"[ c #E5D3D3", +"{ c #D7E9F6", +"} c #D8EAF7", +"| c #DAEAF7", +" . c #DAEBF7", +".. c #DFEDF8", +"X. c #E7E7E7", +"o. c #E9E9E9", +"O. c gray92", +"+. c #EDEFEF", +"@. c #EFEFEF", +"#. c #F3EBEB", +"$. c #F4ECEC", +"%. c #F4EDED", +"&. c #F5EDED", +"*. c #F6EFEF", +"=. c #F1F1F1", +"-. c #F3F3F3", +";. c #F7F0F0", +":. c #F4F4F4", +">. c gray96", +",. c #F6F6F6", +"<. c gray97", +"1. c #F8F1F1", +"2. c #F9F2F2", +"3. c #FAF2F2", +"4. c #F8F8F8", +"5. c #F9F9F9", +"6. c gray98", +"7. c #FBFBFB", +"8. c gray99", +"9. c #FDFDFD", +"0. c #FDFDFE", +/* pixels */ +"J H G G D H 9.9.6.6.<.<.=.=.@.@.", +"G ( | ( / ` 9.9.8.8.8.6.6.<.<.O.", +"F ..| { Y W 9.9.6.6.6.<.<.<.<.o.", +"F ' { ] U E 9.6.6.6.<.<.<.:.<.X.", +"K _ ^ ~ ! R 8.6.6.4.<.<.:.:.>.X.", +"S Q I P L T 2.2.;.;.&.&.#.#.%.[ ", +"> A n b x l f p r 0 8 6 4 3 i X ", +": Z b x l f p r 0 8 6 4 3 1 y . ", +": C x h s p r 0 8 6 4 2 < , w . ", +"- V B N M n c k j d s i y w q ", +"- & & $ $ $ @ @ + + X X . " +}; diff --git a/src/pixmaps/flags_xpm/cm.xpm b/src/pixmaps/flags_xpm/cm.xpm new file mode 100644 index 00000000..8a9c2f7b --- /dev/null +++ b/src/pixmaps/flags_xpm/cm.xpm @@ -0,0 +1,171 @@ +/* XPM */ +static const char *cm[] = { +/* columns rows colors chars-per-pixel */ +"16 11 154 2", +" c #005F00", +". c #006300", +"X c #006700", +"o c #006F00", +"O c #007500", +"+ c #007700", +"@ c #007B00", +"# c #007F00", +"$ c #C90000", +"% c #E10000", +"& c #E30000", +"* c #E50000", +"= c #E70000", +"- c #E90000", +"; c #EB0000", +": c #F70000", +"> c #F90000", +", c #FB0000", +"< c #FD0000", +"1 c #F41E1E", +"2 c #F32B19", +"3 c #F4301F", +"4 c #F52323", +"5 c #F52424", +"6 c #F62929", +"7 c #F62A2A", +"8 c #F72E2E", +"9 c #F72F2F", +"0 c #F53524", +"q c #F63A2B", +"w c #E63F34", +"e c #F83434", +"r c #F83C36", +"t c #F53D3D", +"y c #F93B3A", +"u c #F93C3C", +"i c #E7453A", +"p c #F74030", +"a c #F84736", +"s c #F44939", +"d c #F94C3D", +"f c #E84A40", +"g c #EA4F46", +"h c #F64242", +"j c #F74646", +"k c #FA4142", +"l c #FA4242", +"z c #FB4747", +"x c #FB4C46", +"c c #F74B4B", +"v c #FC4B4B", +"b c #FC4C4C", +"n c #EB554B", +"m c #E85950", +"M c #EC5A51", +"N c #ED5E54", +"B c #FD5151", +"V c #FC6565", +"C c #FB6E60", +"Z c #FC6969", +"A c #FD6D6D", +"S c #FD7071", +"D c #F17B74", +"F c #008300", +"G c #008500", +"H c #008700", +"J c #008900", +"K c #008D00", +"L c #009100", +"P c #3AB03A", +"I c #3FB03F", +"U c #40B33F", +"Y c #44B144", +"T c #45B245", +"R c #45B645", +"E c #49B449", +"W c #49B549", +"Q c #4FB74F", +"! c #4BB84B", +"~ c #4FB84F", +"^ c #50BB50", +"/ c #53B953", +"( c #54BA54", +") c #54BA55", +"_ c #54BD54", +"` c #58BA58", +"' c #58BC58", +"] c #58BC59", +"[ c #59BF59", +"{ c #5CBD5C", +"} c #5DBC5D", +"| c #5CBE5C", +" . c #5FBF5F", +".. c #61BE62", +"X. c #66C066", +"o. c #6AC36A", +"O. c #6FC46F", +"+. c #72C673", +"@. c #76C876", +"#. c #77CB77", +"$. c #79C879", +"%. c #79C979", +"&. c #7BCA7A", +"*. c #7BCA7B", +"=. c #F7B630", +"-. c #DDDD00", +";. c #DFDF00", +":. c #E1E100", +">. c #E3E300", +",. c #E5E500", +"<. c #E7E700", +"1. c #E9E900", +"2. c #EBEB00", +"3. c #EDEF00", +"4. c #EFEF00", +"5. c #F1F100", +"6. c #F3F300", +"7. c #F5F500", +"8. c #F1F10B", +"9. c #F1F10E", +"0. c #F2F210", +"q. c #F2F213", +"w. c #F2F214", +"e. c #F3F319", +"r. c #F3F31A", +"t. c #F4F41F", +"y. c #F7C32F", +"u. c #F8C435", +"i. c #F9C53C", +"p. c #F8DE36", +"a. c #F9DD3B", +"s. c #F4F420", +"d. c #F5F525", +"f. c #F5F526", +"g. c #F6F62B", +"h. c #F2F22C", +"j. c #F2F22F", +"k. c #F6F62C", +"l. c #F2F232", +"z. c #F3F332", +"x. c #F7F731", +"c. c #F3F335", +"v. c #F4F436", +"b. c #F8F837", +"n. c #F4F53B", +"m. c #F5F53F", +"M. c #FABC40", +"N. c #FAC741", +"B. c #F6F644", +"V. c #F7F749", +"C. c #F7F74E", +"Z. c #F8F853", +"A. c #F9F957", +"S. c #FAFA5C", +/* pixels */ +"L J J J K % < < , , : 7.7.4.4.3.", +"G *.*.*.#.D S A Z V C S.A.Z.C.2.", +"G *. .{ { N B b z l d b.x.k.V.1.", +"J *. .) ) M v z l u a x.g.f.B.1.", +"G @.) ) ^ n x N.i.r p g.f.s.m.,.", +"G +./ ~ ~ g M.a.p.=.q f.t.e.n.,.", +"# O.Q E R i a i.y.7 0 t.e.w.v.,.", +"@ o.E T I i e 9 7 5 3 e.w.0.z.-.", +"+ ..Y I P i 8 7 5 1 2 0.9.8.j.-.", +"o ..} ` / m c j h t s c.z.z.h.-.", +"+ X . $ ; ; * * % :.-.-.-.-." +}; diff --git a/src/pixmaps/flags_xpm/cn.xpm b/src/pixmaps/flags_xpm/cn.xpm new file mode 100644 index 00000000..bcd11abe --- /dev/null +++ b/src/pixmaps/flags_xpm/cn.xpm @@ -0,0 +1,151 @@ +/* XPM */ +static const char *cn[] = { +/* columns rows colors chars-per-pixel */ +"16 11 134 2", +" c #9D0000", +". c #9F0000", +"X c #A10000", +"o c #A30000", +"O c #A50000", +"+ c #A70000", +"@ c #A90000", +"# c #AB0000", +"$ c #AF0000", +"% c #B30000", +"& c #B70000", +"* c #B90000", +"= c #BD0000", +"- c #C10000", +"; c #C30000", +": c #C70000", +"> c #CB0000", +", c #CD0000", +"< c #CF0000", +"1 c #D10000", +"2 c #D30000", +"3 c #D50000", +"4 c #D70000", +"5 c #D00B0B", +"6 c #D10F0E", +"7 c #D11010", +"8 c #D31313", +"9 c #D31414", +"0 c #D41919", +"q c #D51919", +"w c #D51A1A", +"e c #D51E1E", +"r c #D61F1F", +"t c #D71F1F", +"y c #D72020", +"u c #D72323", +"i c #D82424", +"p c #D92525", +"a c #D92626", +"s c #D62C2C", +"d c #D62F2F", +"f c #D72F2F", +"g c #D92929", +"h c #D92A2A", +"j c #D92B2B", +"k c #DA2B2B", +"l c #DB2C2C", +"z c #DB2E2E", +"x c #DB2F2F", +"c c #DB3030", +"v c #D83232", +"b c #DC3131", +"n c #D83535", +"m c #D83636", +"M c #DC3434", +"N c #DD3434", +"B c #DD3535", +"V c #DD3636", +"C c #DE3736", +"Z c #DE3737", +"A c #DA3939", +"S c #DA3B3B", +"D c #DE3A3A", +"F c #DE3B3A", +"G c #DE3B3B", +"H c #DE3B3C", +"J c #DB3D3D", +"K c #DE3C3C", +"L c #DF3C3D", +"P c #DC3F3F", +"I c #E03F3F", +"U c #E54500", +"Y c #DF4040", +"T c #DC4242", +"R c #DD4444", +"E c #DD4646", +"W c #DF4949", +"Q c #DF4B4B", +"! c #E14241", +"~ c #E04142", +"^ c #E04242", +"/ c #E14444", +"( c #E14545", +") c #E14747", +"_ c #E34949", +"` c #E34A49", +"' c #E14E4E", +"] c #E34F4F", +"[ c #E44F4F", +"{ c #E4524B", +"} c #E15050", +"| c #E25353", +" . c #E55353", +".. c #E25455", +"X. c #E35757", +"o. c #E45454", +"O. c #E65754", +"+. c #E35858", +"@. c #E65858", +"#. c #E75C59", +"$. c #E45C5C", +"%. c #E45D5D", +"&. c #EA7F47", +"*. c #E66060", +"=. c #E66162", +"-. c #E76565", +";. c #E86666", +":. c #E86969", +">. c #E86A6A", +",. c #E86F6D", +"<. c #E96F6F", +"1. c #EA7273", +"2. c #EC7976", +"3. c #ED7F7B", +"4. c #EC9046", +"5. c #ED9246", +"6. c #ED964C", +"7. c #ED8950", +"8. c #EF9859", +"9. c #F09B54", +"0. c #F1A851", +"q. c #ED8479", +"w. c #EE8979", +"e. c #F2A577", +"r. c #F5BF71", +"t. c #F5CB4B", +"y. c #F5CC4B", +"u. c #F6CF51", +"i. c #FAE25C", +"p. c #FBE65C", +"a. c #FDF35F", +"s. c #F9DA74", +"d. c #FADD7A", +"f. c #FADC7B", +/* pixels */ +"4 2 2 4 4 U < < > > > : - - = = ", +"4 3.f.q.e.s.r.<.:.-.*.%.X.| ] & ", +"2 f.a.i.#.9.u.6.( ! H Z c l W % ", +"2 w.p.8.| 0.t.&.! P B b j a R $ ", +"2 2.@.O.7.y.5.! H m c j a y P # ", +"< 1. .] { 5.! D B c j a t w S + ", +"< <.] ` ( I D B x j u t w 9 m + ", +"< >.` ( P D B x j p t w 9 7 c . ", +"> ;.( I D c z j u t 0 8 6 5 d . ", +": =.%.X.X.| W E T S S m c d j . ", +": - - = & & % $ # # + X . . . " +}; diff --git a/src/pixmaps/flags_xpm/co.xpm b/src/pixmaps/flags_xpm/co.xpm new file mode 100644 index 00000000..52092175 --- /dev/null +++ b/src/pixmaps/flags_xpm/co.xpm @@ -0,0 +1,174 @@ +/* XPM */ +static const char *co[] = { +/* columns rows colors chars-per-pixel */ +"16 11 157 2", +" c #AD0000", +". c #B90000", +"X c #BB0000", +"o c #BD0000", +"O c #BF0000", +"+ c #C10000", +"@ c #C30000", +"# c #C50000", +"$ c #C90000", +"% c #CB0000", +"& c #CF0000", +"* c #D10000", +"= c #D30000", +"- c #D70000", +"; c #D90000", +": c #DD0000", +"> c #D80E13", +", c #DA1117", +"< c #DB161C", +"1 c #DD1B20", +"2 c #DE2125", +"3 c #DE3136", +"4 c #E0262A", +"5 c #E22E2E", +"6 c #E22B30", +"7 c #E33131", +"8 c #E23035", +"9 c #E43435", +"0 c #E63737", +"q c #E4363B", +"w c #E63B3B", +"e c #CF7F00", +"r c #E53B40", +"t c #E74040", +"y c #E74145", +"u c #E84444", +"i c #E8464B", +"p c #E94949", +"a c #EB4C4C", +"s c #EC5151", +"d c #ED5555", +"f c #EE5B5B", +"g c #EF5F5F", +"h c #ED686C", +"j c #F06464", +"k c #CF8100", +"l c #D38700", +"z c #D58B00", +"x c #D99300", +"c c #DB9300", +"v c #DD9700", +"b c #DF9B00", +"n c #E19F00", +"m c #E3A300", +"M c #E5A700", +"N c #E7AB00", +"B c #E9AD00", +"V c #E9AF00", +"C c #EBB100", +"Z c #EDB100", +"A c #EDB300", +"S c #EDB500", +"D c #EFB700", +"F c #F4CC20", +"G c #F5CE25", +"H c #F5CD26", +"J c #F6CE2B", +"K c #F6CE2C", +"L c #F6D02B", +"P c #F7D031", +"I c #F7D230", +"U c #F8D236", +"Y c #F8D237", +"T c #F8D436", +"R c #F5D33F", +"E c #F9D33C", +"W c #F9D53C", +"Q c #F9D43D", +"! c #F6D344", +"~ c #FAD741", +"^ c #FAD542", +"/ c #FBD747", +"( c #FBD946", +") c #F7D549", +"_ c #F7D74E", +"` c #FCD84B", +"' c #FCDB4B", +"] c #FCD84C", +"[ c #F8D853", +"{ c #FDDA51", +"} c #FDDC50", +"| c #F9D957", +" . c #FDDB54", +".. c #FDDD54", +"X. c #FEDC59", +"o. c #FEDE58", +"O. c #FADB5C", +"+. c #FEDE5C", +"@. c #FEDF5F", +"#. c #FBDD60", +"$. c #FCDD65", +"%. c #FCDF69", +"&. c #FDE06D", +"*. c #FDE271", +"=. c #FEE274", +"-. c #FEE377", +";. c #FEE476", +":. c #FEE479", +">. c #FFE47A", +",. c #FFE47B", +"<. c #00009D", +"1. c #00009F", +"2. c #0001C7", +"3. c #0009C7", +"4. c #0011C7", +"5. c #104ACF", +"6. c #1851CE", +"7. c #1D56CF", +"8. c #144ED0", +"9. c #1952D2", +"0. c #1D55D0", +"q. c #1F56D4", +"w. c #2259D2", +"e. c #235AD2", +"r. c #245AD6", +"t. c #285ED3", +"y. c #285CD4", +"u. c #2A5ED7", +"i. c #2E62D5", +"p. c #2E61D6", +"a. c #2F62D8", +"s. c #3364D5", +"d. c #3366D7", +"f. c #396AD5", +"g. c #3E6ED6", +"h. c #3365D8", +"j. c #3467DA", +"k. c #3869D9", +"l. c #396BD9", +"z. c #3E6EDA", +"x. c #3E6FDA", +"c. c #3A6BDC", +"v. c #406FDD", +"b. c #4272DC", +"n. c #4373DC", +"m. c #4573DF", +"M. c #4876DD", +"N. c #4877DD", +"B. c #4D7BDE", +"V. c #4C7ADF", +"C. c #4978E0", +"Z. c #527EE0", +"A. c #527FE0", +"S. c #5682E1", +"D. c #6A90E7", +"F. c #7195E7", +"G. c #7599E7", +/* pixels */ +"D A S S Z V V V N M m n b v c c ", +"D ,.:.:.,.=.*.&.%.$.+.O.| [ _ z ", +"D :.#.+.X. .{ ' / ^ E Y P K ) l ", +"D :.+.X. .{ ] / ^ E Y P K H ! e ", +"V ;.X...} ' ( ~ W T P L H F R k ", +"4.G.S.Z.B.N.n.z.l.d.i.t.w.0.g.1.", +"3.F.Z.N.N.n.z.k.d.i.y.w.7.6.f.1.", +"2.D.C.C.v.c.j.a.u.r.q.0.5.5.s.1.", +"- h i y r q 8 6 2 2 < < , > 3 ", +": j g f d s a p u y w w 0 7 5 . ", +": ; ; = & & % % # @ @ O O . . . " +}; diff --git a/src/pixmaps/flags_xpm/cr.xpm b/src/pixmaps/flags_xpm/cr.xpm new file mode 100644 index 00000000..d8d17241 --- /dev/null +++ b/src/pixmaps/flags_xpm/cr.xpm @@ -0,0 +1,177 @@ +/* XPM */ +static const char *cr[] = { +/* columns rows colors chars-per-pixel */ +"16 11 160 2", +" c #000023", +". c #000025", +"X c #000029", +"o c #00002B", +"O c #000031", +"+ c #000037", +"@ c #00003B", +"# c #00003F", +"$ c #000045", +"% c #00004B", +"& c #000051", +"* c #000055", +"= c #000057", +"- c #00005B", +"; c #00005D", +": c #000061", +"> c #000063", +", c #000067", +"< c #00006D", +"1 c #000071", +"2 c #000073", +"3 c #000075", +"4 c #000079", +"5 c #00007D", +"6 c #00017F", +"7 c #B70000", +"8 c #B90000", +"9 c #BB0000", +"0 c #DD0000", +"q c #DF0000", +"w c #DC1414", +"e c #DD1919", +"r c #DE1A1A", +"t c #DF1F1F", +"y c #E10000", +"u c #E01F1F", +"i c #E02020", +"p c #E02424", +"a c #E12525", +"s c #E22A2A", +"d c #E32B2B", +"f c #E32F2F", +"g c #E43030", +"h c #E03636", +"j c #E53535", +"k c #E63636", +"l c #E23B3B", +"z c #E63B3A", +"x c #E73B3B", +"c c #E73B3C", +"v c #E33F3F", +"b c #D3413F", +"n c #E74040", +"m c #E84040", +"M c #E94141", +"N c #E84545", +"B c #E94646", +"V c #E94A49", +"C c #EA4A4B", +"Z c #EA4B4B", +"A c #EB4F4F", +"S c #EB4F50", +"D c #ED5353", +"F c #ED5454", +"G c #EE5858", +"H c #DF6967", +"J c #EF6F6F", +"K c #F17273", +"L c #F17676", +"P c #000783", +"I c #000985", +"U c #000F85", +"Y c #00198D", +"T c #5B79B5", +"R c #5C7AB6", +"E c #607DB8", +"W c #627FB9", +"Q c #6582BB", +"! c #6984BD", +"~ c #6C88BE", +"^ c #6F8AC1", +"/ c #6F8AC2", +"( c #738EC3", +") c #748EC3", +"_ c #7791C5", +"` c #7790C6", +"' c #7B94C7", +"] c #7A94C8", +"[ c #7F97C9", +"{ c #7F97CA", +"} c #F18785", +"| c #EBA09F", +" . c #ECA2A2", +".. c #EEA4A3", +"X. c #EEA7A6", +"o. c #EFAAA9", +"O. c #EDAEAD", +"+. c #F9A1A1", +"@. c #F0ACAB", +"#. c #F1AFAE", +"$. c #F3B2B1", +"%. c #F2B4B3", +"&. c #F4B4B3", +"*. c #F3B6B5", +"=. c #F5B7B6", +"-. c #F4B9B8", +";. c #F6B9B8", +":. c #F4BCBB", +">. c #F7BCBB", +",. c #F3BEBE", +"<. c #F5BDBD", +"1. c #F6BFBF", +"2. c #829ACB", +"3. c #829ACC", +"4. c #859DCD", +"5. c #859ECD", +"6. c #89A0CE", +"7. c #8BA2D0", +"8. c #8FA4D2", +"9. c #91A7D3", +"0. c #93A8D4", +"q. c #94A9D4", +"w. c #95A9D4", +"e. c #DDDFDF", +"r. c #F7C2C1", +"t. c #F8C4C3", +"y. c #F9C6C5", +"u. c #FAC8C7", +"i. c #F9C8C8", +"p. c #FAC9C9", +"a. c #FBCBCA", +"s. c #FCD4D4", +"d. c #E5E9E9", +"f. c #F0F1F1", +"g. c #F1F1F1", +"h. c #F1F2F2", +"j. c #F2F3F3", +"k. c #F3F4F4", +"l. c #F4F5F5", +"z. c #F4F6F6", +"x. c #F5F6F6", +"c. c #F5F7F7", +"v. c gray97", +"b. c #F5F8F8", +"n. c #F6F9F9", +"m. c #F7F9F9", +"M. c #F7FAFA", +"N. c #F8F8F8", +"B. c #F9F9F9", +"V. c #F9FAFA", +"C. c #F8FBFB", +"Z. c gray98", +"A. c #F9FCFC", +"S. c #FBFCFC", +"D. c #FAFDFD", +"F. c #FBFDFD", +"G. c #F9FFFF", +"H. c #FBFEFE", +"J. c #FCFEFE", +"K. c #FCFFFF", +/* pixels */ +"U I I I P 6 6 4 3 1 < , > ; - * ", +"Y w.w.0.9.8.6.6.5.3.{ ] ) ) / * ", +"H.J.H.J.H.H.H.H.C.C.N.c.c.c.b.d.", +"+.s.p.p.y.y.r.t.1.1.:.-.*.%.,.H ", +"y L G D D V B M c k g d a u v 9 ", +"q K D S V B c x k g d a u r l 9 ", +"q J S V B n z j f s p t r w h 7 ", +"} i.:.;.=.&.&.O.O.o.X. . .| O.b ", +"N.S.B.C.B.N.c.c.c.j.k.j.g.g.j.e.", +"1 5.2.2.' _ ) / ~ ! Q W E R T o ", +", > ; * % % $ # @ + o o o . . " +}; diff --git a/src/pixmaps/flags_xpm/cs.xpm b/src/pixmaps/flags_xpm/cs.xpm new file mode 100644 index 00000000..cd122d89 --- /dev/null +++ b/src/pixmaps/flags_xpm/cs.xpm @@ -0,0 +1,155 @@ +/* XPM */ +static const char *cs[] = { +/* columns rows colors chars-per-pixel */ +"16 11 138 2", +" c #000043", +". c #00004D", +"X c #00005D", +"o c #000061", +"O c #000063", +"+ c #000067", +"@ c #00006D", +"# c #000071", +"$ c #000075", +"% c #000079", +"& c #00007B", +"* c #00007D", +"= c #DD0000", +"- c #DF0000", +"; c #E10000", +": c #E30000", +"> c #E50000", +", c #E70000", +"< c #E90000", +"1 c #EB0000", +"2 c #ED0000", +"3 c #EF0000", +"4 c #F10000", +"5 c #F30000", +"6 c #F50000", +"7 c #F70000", +"8 c #F90000", +"9 c #F10B0B", +"0 c #F10F0E", +"q c #F21313", +"w c #F31919", +"e c #F41E1E", +"r c #F52323", +"t c #F62929", +"y c #F22C2C", +"u c #F22F2F", +"i c #F72E2E", +"p c #FB2929", +"a c #F23232", +"s c #F33535", +"d c #F83434", +"f c #F43939", +"g c #F53D3D", +"h c #F93A3A", +"j c #FA3F3F", +"k c #F64242", +"l c #F74646", +"z c #FA4444", +"x c #F74B4B", +"c c #F85050", +"v c #F95455", +"b c #F95858", +"n c #FA5D5D", +"m c #F26363", +"M c #F26666", +"N c #FB6162", +"B c #FC6666", +"V c #F36A6A", +"C c #F46E6E", +"Z c #F57171", +"A c #F37777", +"S c #F67575", +"D c #F77879", +"F c #F87C7C", +"G c #000081", +"H c #000083", +"J c #000085", +"K c #000087", +"L c #000089", +"P c #000091", +"I c #2C2CA1", +"U c #3131A4", +"Y c #3737A7", +"T c #3535AF", +"R c #3D3CAA", +"E c #4242AD", +"W c #4949AE", +"Q c #4747B0", +"! c #4C4CB2", +"~ c #4E4EB4", +"^ c #5151B4", +"/ c #5353B7", +"( c #5454B7", +") c #5857B9", +"_ c #5959B8", +"` c #5C5CBA", +"' c #5C5CBB", +"] c #5F5FBB", +"[ c #6160BE", +"{ c #6A6ABE", +"} c #6565C0", +"| c #6969C2", +" . c #6E6EC0", +".. c #6D6DC3", +"X. c #7272C2", +"o. c #7070C5", +"O. c #7676C4", +"+. c #7474C7", +"@. c #7A7AC6", +"#. c #7F7FC6", +"$. c #7777C8", +"%. c #7979C9", +"&. c #7B7BC8", +"*. c #7B7BCA", +"=. c #7D7DC9", +"-. c #F98080", +";. c #FA8484", +":. c #FB8888", +">. c #FB8B8B", +",. c #FCA0A0", +"<. c #8181CA", +"1. c #8585CC", +"2. c #8888CE", +"3. c #8B8BCF", +"4. c #8E8FD1", +"5. c #9090D2", +"6. c #A4A4DA", +"7. c #E3C7C7", +"8. c #E5C9C9", +"9. c #E7CDCD", +"0. c #FDE7E7", +"q. c #FDE9E9", +"w. c gray95", +"e. c #F3F3F3", +"r. c #F4F4F4", +"t. c #F4F5F5", +"y. c gray96", +"u. c #F6F6F6", +"i. c gray97", +"p. c #F8F8F8", +"a. c #F9F9F9", +"s. c gray98", +"d. c #FBFBFB", +"f. c #FBFCFB", +"g. c gray99", +"h. c #FDFCFD", +"j. c #FDFDFD", +"k. c #FEFEFE", +/* pixels */ +"P L L L L G G * & $ # @ + O X O ", +"J *.*.*.O.+.o...| } [ ' ) / ~ . ", +"G *.] ` ` / ^ ! Q E R Y U I W ", +"T 6.4.4.3.1.1.<.=.@.O.X.{ { #.& ", +"q.k.k.k.g.g.d.p.d.i.i.i.i.y.y.9.", +"q.k.f.k.g.d.d.d.i.i.y.i.y.e.y.8.", +"0.k.d.d.d.d.p.p.i.i.i.w.w.w.y.7.", +"p ,.>.:.;.-.F D S C C V M m A - ", +"8 B z j h d i t r e w q 0 9 u - ", +"8 N n b v c x l k g f s a u y = ", +"6 4 4 2 2 2 < < > > : : - = = = " +}; diff --git a/src/pixmaps/flags_xpm/cu.xpm b/src/pixmaps/flags_xpm/cu.xpm new file mode 100644 index 00000000..66ae4891 --- /dev/null +++ b/src/pixmaps/flags_xpm/cu.xpm @@ -0,0 +1,177 @@ +/* XPM */ +static const char *cu[] = { +/* columns rows colors chars-per-pixel */ +"16 11 160 2", +" c #00005F", +". c #00006B", +"X c #00006D", +"o c #00006F", +"O c #000073", +"+ c #000075", +"@ c #000079", +"# c #00007B", +"$ c #00007F", +"% c #CB0000", +"& c #DB0000", +"* c #EB0000", +"= c #ED0000", +"- c #EF0000", +"; c #F10000", +": c #F30000", +"> c #F70000", +", c red", +"< c #9F4E6F", +"1 c #A85271", +"2 c #AD5D7A", +"3 c #EB4545", +"4 c #EB4646", +"5 c #ED4545", +"6 c #F64949", +"7 c #F44A4B", +"8 c #F44D4C", +"9 c #EF4F50", +"0 c #F15A59", +"q c #F65858", +"w c #F95C5C", +"e c #EC6365", +"r c #F06161", +"t c #FB6666", +"y c #F76A6A", +"u c #F27D7E", +"i c #F97979", +"p c #FE7B7A", +"a c #000081", +"s c #000083", +"d c #000185", +"f c #000087", +"g c #00008B", +"h c #00078B", +"j c #00018F", +"k c #00098B", +"l c #00118F", +"z c #000993", +"x c #000F97", +"c c #001793", +"v c #001D97", +"b c #001599", +"n c #00239B", +"m c #00299D", +"M c #002FA1", +"N c #0035A3", +"B c #0039A5", +"V c #003DA9", +"C c #003FA9", +"Z c #0041A7", +"A c #0047B3", +"S c #1A58B0", +"D c #1F5CB2", +"F c #2560B4", +"G c #2A65B6", +"H c #3069B9", +"J c #366EBC", +"K c #3B70BA", +"L c #3775C0", +"P c #3B74C1", +"I c #3B78C2", +"U c #3F7CC4", +"Y c #427DC3", +"T c #457EC3", +"R c #427EC4", +"E c #4480C6", +"W c #4781C6", +"Q c #4880C4", +"! c #4B83C5", +"~ c #4E85C7", +"^ c #4983C8", +"/ c #4B85C8", +"( c #4E86CA", +") c #5389C8", +"_ c #5288C9", +"` c #5088CA", +"' c #568BCB", +"] c #528ACC", +"[ c #548CCC", +"{ c #5A8CCC", +"} c #5B8FCD", +"| c #598ECE", +" . c #5C8FCC", +".. c #5F91CE", +"X. c #5E92D0", +"o. c #6194CF", +"O. c #6394D0", +"+. c #6494D0", +"@. c #6597D1", +"#. c #6798D2", +"$. c #6A99D3", +"%. c #6B9AD3", +"&. c #6F9DD4", +"*. c #719DD3", +"=. c #729FD6", +"-. c #76A3D8", +";. c #7AA5D9", +":. c #7EA8DB", +">. c #F88484", +",. c #F88787", +"<. c #FAA5A3", +"1. c #F5ADAC", +"2. c #FDB8B6", +"3. c #F9B8B9", +"4. c #FBBDBD", +"5. c #FABEBE", +"6. c #97A5CD", +"7. c #80AADC", +"8. c #84ACDD", +"9. c #86AEDE", +"0. c #87B0DF", +"q. c #D5D7DB", +"w. c #DFDFDF", +"e. c #FEC3C1", +"r. c #FCCCCC", +"t. c #E1E5E7", +"y. c #E7E7E7", +"u. c #ECEDEF", +"i. c #EDEEF0", +"p. c #EEEEF0", +"a. c #EEEFF1", +"s. c #F0F1F2", +"d. c #F1F2F3", +"f. c gray95", +"g. c #F3F3F3", +"h. c #F1F3F5", +"j. c #F2F3F5", +"k. c #F2F4F6", +"l. c #F3F4F6", +"z. c #F4F4F4", +"x. c gray96", +"c. c #F4F5F7", +"v. c #F6F6F6", +"b. c gray97", +"n. c #F4F5F8", +"m. c #F5F5F8", +"M. c #F5F7F9", +"N. c #F6F6F9", +"B. c #F6F7FA", +"V. c #F7F8FB", +"C. c #F8F8F8", +"Z. c #F9F9F9", +"A. c #F8F9FB", +"S. c gray98", +"D. c #FBFBFB", +"F. c #FCF9F9", +"G. c #F9FBFC", +"H. c #F9FBFD", +"J. c gray99", +"K. c #FDFDFD", +/* pixels */ +"& Z A C C B N M m n v c k k d k ", +", u 6.0.9.9.7.:.;.-.=.&.%.#.O.g ", +": p r e.A.A.A.B.B.B.n.B.k.k.k.t.", +": i w 0 2.K.K.S.S.S.C.x.x.x.x.y.", +"- ,.4.q 9 2 O.X.| [ ` / W R ..a ", +"- r.F.3.8 3 < P J H G F D S K ", +"- ,.4.8 5 1 ' ] ( / E U P L ) # ", +"* y 6 5 <.F.F.x.x.g.k.g.g.g.g.w.", +"* t 3 1.B.B.l.l.g.s.a.u.a.u.u.q.", +"> e =.%.@.O...} [ ) ~ ! Q T Y ", +"% b x z g g d a $ # + O O X . X " +}; diff --git a/src/pixmaps/flags_xpm/cv.xpm b/src/pixmaps/flags_xpm/cv.xpm new file mode 100644 index 00000000..313815db --- /dev/null +++ b/src/pixmaps/flags_xpm/cv.xpm @@ -0,0 +1,156 @@ +/* XPM */ +static const char *cv[] = { +/* columns rows colors chars-per-pixel */ +"16 11 139 2", +" c #CF0000", +". c #ED0000", +"X c #E92828", +"o c #EA2D2D", +"O c #EB3231", +"+ c #EB4646", +"@ c #F04545", +"# c #F14B4B", +"$ c #F25050", +"% c #F35454", +"& c #EF7E44", +"* c #F77B7B", +"= c #F1854E", +"- c #F8996A", +"; c #F6E65D", +": c #F0EA5D", +"> c #F4EF6E", +", c #F5EF70", +"< c #FBEE76", +"1 c #F7F077", +"2 c #FCF478", +"3 c #F8F27F", +"4 c #0000DD", +"5 c #0000DF", +"6 c #0000E1", +"7 c #0000E3", +"8 c #0005E5", +"9 c #0009E7", +"0 c #000FE7", +"q c #0011E9", +"w c #0015E9", +"e c #0017EB", +"r c #001DEB", +"t c #001DED", +"y c #0025ED", +"u c #0025EF", +"i c #002BEF", +"p c #0031F1", +"a c #0039F3", +"s c #003FF5", +"d c #0045F7", +"f c #0049F9", +"g c #004BF9", +"h c #004FFB", +"j c #0053FD", +"k c #0059FD", +"l c #005BFD", +"z c #005DFD", +"x c #005FFD", +"c c #0061FF", +"v c #207DF1", +"b c #7EAFB5", +"n c #2480F1", +"m c #2983F2", +"M c #2D86F3", +"N c #348AF4", +"B c #3E8EF2", +"V c #398DF5", +"C c #3A8EF5", +"Z c #3E91F6", +"A c #3F91F6", +"S c #66A4D5", +"D c #6EA9D7", +"F c #78B0DC", +"G c #7FB5DE", +"H c #4090F2", +"J c #4190F2", +"K c #4491F3", +"L c #4794F3", +"P c #4192F7", +"I c #4394F7", +"U c #4494F7", +"Y c #4594F7", +"T c #4B97F4", +"R c #4E99F5", +"E c #4997F8", +"W c #4A98F8", +"Q c #4E9BF9", +"! c #4F9BF9", +"~ c #509AF5", +"^ c #559DF6", +"/ c #539EFA", +"( c #559FFA", +") c #5AA0F7", +"_ c #5FA3F7", +"` c #57A0FB", +"' c #5DA3FC", +"] c #63A6F8", +"[ c #61A6FD", +"{ c #67A9F9", +"} c #65A9FD", +"| c #67ABFE", +" . c #68A9F9", +".. c #6BABFA", +"X. c #6CACFA", +"o. c #6FAEFB", +"O. c #69ABFE", +"+. c #6BADFE", +"@. c #6EAFFE", +"#. c #70AEFB", +"$. c #73B0FC", +"%. c #75B1FC", +"&. c #77B2FC", +"*. c #7AB4FD", +"=. c #7EB7FE", +"-. c #8EBABF", +";. c #8FBAC3", +":. c #93BEC3", +">. c #96BEC3", +",. c #92BEC6", +"<. c #81B9FE", +"1. c #83B9FE", +"2. c #84BAFE", +"3. c #85BBFE", +"4. c #85BCFE", +"5. c #88BDFF", +"6. c #98C1C6", +"7. c #9CC2C7", +"8. c #9CC3CA", +"9. c #9EC5CA", +"0. c #9EC5CD", +"q. c #A1C7CB", +"w. c #DFDFDF", +"e. c gray90", +"r. c #FCFBE0", +"t. c gray95", +"y. c #F3F3F3", +"u. c #F4F4F4", +"i. c #F4F5F5", +"p. c gray96", +"a. c #F6F6F6", +"s. c gray97", +"d. c #F8F8F8", +"f. c #F9F9F9", +"g. c gray98", +"h. c #FBFBFB", +"j. c gray99", +"k. c #FDFDFD", +"l. c #FEFEFE", +/* pixels */ +"c c c c z l l j h d d s a p i u ", +"c 5.5.4.1.<.=.*.&.$.@...{ ] _ r ", +"c 5.@.+.O.| [ ' ` / Q W Y A ) w ", +"c 3.+.| 0.9.2 6.,.Q T I A C ^ 0 ", +"z 1.| q.3 G ( F > -.P A C N ~ 9 ", +"l.l.l.r.h.h.h.h.d.s.s.i.u.y.s.e.", +". * - < % # # + = ; & O o X + ", +"h.h.h.h.h.h.f.s.s.s.y.y.t.y.y.w.", +"g &./ ,.> D I S : b M m v v H 4 ", +"d #.X...7.7.1 >.;.T T L L H B 4 ", +"s a p i u t w q 9 8 7 7 4 4 4 4 " +}; diff --git a/src/pixmaps/flags_xpm/cx.xpm b/src/pixmaps/flags_xpm/cx.xpm new file mode 100644 index 00000000..5b30e659 --- /dev/null +++ b/src/pixmaps/flags_xpm/cx.xpm @@ -0,0 +1,184 @@ +/* XPM */ +static const char *cx[] = { +/* columns rows colors chars-per-pixel */ +"16 11 167 2", +" c #000100", +". c #006500", +"X c #006900", +"o c #006B00", +"O c #006F00", +"+ c #007300", +"@ c #007700", +"# c #000041", +"$ c #00175F", +"% c #000069", +"& c #00006D", +"* c #000077", +"= c #00007B", +"- c #0F7D4A", +"; c #008100", +": c #008500", +"> c #008B00", +", c #008F00", +"< c #009300", +"1 c #009700", +"2 c #009B00", +"3 c #009D00", +"4 c #00A100", +"5 c #00A300", +"6 c #00A500", +"7 c #00A700", +"8 c #00AB00", +"9 c #00AD00", +"0 c #00AF00", +"q c #0BB70B", +"w c #10B910", +"e c #14BB14", +"r c #19AC2A", +"t c #2CB636", +"y c #24C124", +"u c #25C125", +"i c #2AC32B", +"p c #2BC32B", +"a c #2FC12F", +"s c #33C332", +"d c #30C530", +"f c #31C631", +"g c #36C436", +"h c #37C836", +"j c #37C837", +"k c #3ECA36", +"l c #3BC63B", +"z c #3CCA3C", +"x c #3DCA3D", +"c c #7DD300", +"v c #7EE13B", +"b c #51B76B", +"n c #42CB42", +"m c #42CC42", +"M c #47CE47", +"N c #49CC49", +"B c #4ECD4E", +"V c #4BD04B", +"C c #4CD04C", +"Z c #51D151", +"A c #54D354", +"S c #58D257", +"D c #59D05D", +"F c #5CD35C", +"G c #61D460", +"H c #65D665", +"J c #69D869", +"K c #6DD96D", +"L c #70DA71", +"P c #74DB74", +"I c #77DD77", +"U c #79DD79", +"Y c #8BDB19", +"T c #8BDB1A", +"R c #8EDD1F", +"E c #95E02C", +"W c #9EE13F", +"Q c #9FE53C", +"! c #C0EA20", +"~ c #C2EC26", +"^ c #C3ED2B", +"/ c #CBEA2E", +"( c #D6F32F", +") c #C5EE30", +"_ c #C5EE31", +"` c #C7EF36", +"' c #EAF835", +"] c #87877D", +"[ c #A3E641", +"{ c #A9E753", +"} c #D3DE4E", +"| c #CAED44", +" . c #D3EE4C", +".. c #ECF942", +"X. c #000081", +"o. c #000085", +"O. c #000089", +"+. c #00008D", +"@. c #00008F", +"#. c #000093", +"$. c #000097", +"%. c #00009B", +"&. c #0000A1", +"*. c #0000A5", +"=. c #0000A7", +"-. c #0000AB", +";. c #0000AF", +":. c #0000B1", +">. c #0000B3", +",. c #0000B5", +"<. c #131DB1", +"1. c #1819BC", +"2. c #1E1EBE", +"3. c #1F4A93", +"4. c #2F5D92", +"5. c #2424C1", +"6. c #2E2EC6", +"7. c #2323C8", +"8. c #2929CA", +"9. c #3232C3", +"0. c #3535C3", +"q. c #3434C7", +"w. c #3939C5", +"e. c #3D3DC7", +"r. c #3535C9", +"t. c #3A3AC9", +"y. c #3A3ACA", +"u. c #4242C8", +"i. c #4646CA", +"p. c #4242CC", +"a. c #4B4BCC", +"s. c #4949CE", +"d. c #4949CF", +"f. c #4B4DCE", +"g. c #5050CE", +"h. c #5454CF", +"j. c #4040D1", +"k. c #4646D8", +"l. c #504FD1", +"z. c #5151D0", +"x. c #5050D1", +"c. c #5353D2", +"v. c #5555D4", +"b. c #5959D2", +"n. c #5859D4", +"m. c #5C5CD5", +"M. c #5F5FD7", +"N. c #5467C0", +"B. c #6161D4", +"V. c #6363D7", +"C. c #6666D7", +"Z. c #6A6AD8", +"A. c #7677DA", +"S. c #7676DB", +"D. c #7979DD", +"F. c #7B7BDD", +"G. c #5C91A1", +"H. c #7BC397", +"J. c #7B85D3", +"K. c #828287", +"L. c #8484DF", +"P. c #A9A9E5", +"I. c #B0B0E8", +"U. c #DFDFF3", +"Y. c #E2E2F5", +"T. c #E1E1F7", +"R. c #E8E8F7", +/* pixels */ +"$ 5 0 0 0 0 0 6 6 5 3 2 1 < , > ", +";.J.H.U P P L K J H G F S { B : ", +",.F.M.G.D A Z C N m x h f E N ; ", +",.S.M.n.N.b C M n x h _ ^ ~ | c ", +">.S.T.C.l.f. .[ Q ` d p u ! W @ ", +">.L.x.v.T.k...v k ^ p u R T l + ", +";.R.x.b.g.j.} ' ( / u R T e g O ", +"-.Z.d.I.P.y.r.K.] 5.3.r e w s o ", +"*.C.d.p.w.q.6.8.7.2.1.<.- q a o ", +"%.B.A.Y.h.g.d.i.p.e.w.0.9.4.t . ", +"*.%.$.#.@.@.O.o.X.= * & % % # " +}; diff --git a/src/pixmaps/flags_xpm/cy.xpm b/src/pixmaps/flags_xpm/cy.xpm new file mode 100644 index 00000000..2ffb0e16 --- /dev/null +++ b/src/pixmaps/flags_xpm/cy.xpm @@ -0,0 +1,94 @@ +/* XPM */ +static const char *cy[] = { +/* columns rows colors chars-per-pixel */ +"16 11 77 1", +" c #F9D33F", +". c #FACD41", +"X c #F9CD42", +"o c #FAD340", +"O c #F8D547", +"+ c #FBD456", +"@ c #F8D95A", +"# c #FBDD64", +"$ c #FCDA6A", +"% c #F7D678", +"& c #F8D97B", +"* c #7AC182", +"= c #87C991", +"- c #8DCC96", +"; c #9AD09F", +": c #9ED5A5", +"> c #A6D7AE", +", c #A5D8AD", +"< c #BBDFB1", +"1 c #FBDF8C", +"2 c #F7E397", +"3 c #F7E594", +"4 c #EAE6A7", +"5 c gray81", +"6 c gray82", +"7 c LightGray", +"8 c #D5D5D5", +"9 c #D7D7D7", +"0 c gray85", +"q c gray86", +"w c #DDDDDD", +"e c #DFDFDF", +"r c #CEE4C0", +"t c #DFEDDF", +"y c #FDF1C5", +"u c #FDF3D3", +"i c #F8F1D5", +"p c #F9F2D6", +"a c #E1E1E1", +"s c #E1E3E1", +"d c gray89", +"f c gray90", +"g c #E7E7E7", +"h c #E1ECE1", +"j c #E9E9E9", +"k c gray92", +"l c gray93", +"z c #EFEFEF", +"x c #FCF7E4", +"c c #FAF8EF", +"v c #EFEFF1", +"b c #F1F1F1", +"n c gray95", +"m c #F2F2F3", +"M c #F3F3F3", +"N c #F6F5F0", +"B c #F6F6F3", +"V c #F4F4F4", +"C c #F4F5F5", +"Z c gray96", +"A c #F6F6F6", +"S c gray97", +"D c #F7F9F7", +"F c #FCFAF2", +"G c #F8F8F7", +"H c #F8F8F8", +"J c #F9F9F9", +"K c #F8FAF9", +"L c gray98", +"P c #FBFBFB", +"I c #FBFCFB", +"U c gray99", +"Y c #FDFDFC", +"T c #FDFDFD", +"R c #FDFDFE", +"E c #FEFEFE", +"W c gray100", +/* pixels */ +"bbbbbvzzkkkgfddw", +"ZWWWPWWPUPIPHHHw", +"bWWWWWWUPPPZHZHw", +"ZWPWPux1cp%%ZZZq", +"ZWWPy$+..O2NZVZ9", +"bWWPF# @2ZZVMZ8", +"bWPPD<4ir,ZZMMM7", +"bWPPD:=>*-MZbbM7", +"zPPPPHt;hMMMbbb6", +"kPPDHDDZZDMMbMb6", +"kkggdwwqq8876555" +}; diff --git a/src/pixmaps/flags_xpm/cz.xpm b/src/pixmaps/flags_xpm/cz.xpm new file mode 100644 index 00000000..4fe85fbd --- /dev/null +++ b/src/pixmaps/flags_xpm/cz.xpm @@ -0,0 +1,141 @@ +/* XPM */ +static const char *cz[] = { +/* columns rows colors chars-per-pixel */ +"16 11 124 2", +" c #5D0011", +". c #C30000", +"X c #C50000", +"o c #C70000", +"O c #C90000", +"+ c #CD0000", +"@ c #CF0000", +"# c #D10000", +"$ c #D50000", +"% c #D70000", +"& c #D70707", +"* c #D90000", +"= c #DB0000", +"- c #E30B0B", +"; c #E30F0E", +": c #E41010", +"> c #E51313", +", c #E41414", +"< c #E51414", +"1 c #E51919", +"2 c #E61919", +"3 c #E71F1F", +"4 c #E81E1E", +"5 c #E81F1F", +"6 c #E92323", +"7 c #E82424", +"8 c #E92424", +"9 c #E62C2C", +"0 c #E72F2F", +"q c #EA2929", +"w c #E92A2A", +"e c #EA2A2A", +"r c #EB2E2E", +"t c #EC2F2F", +"y c #E83232", +"u c #E83535", +"i c #E83636", +"p c #ED3434", +"a c #ED3535", +"s c #E93939", +"d c #EE3A3A", +"f c #EE3B3A", +"g c #EA3D3D", +"h c #EB4242", +"j c #ED4646", +"k c #ED4B4B", +"l c #EE5050", +"z c #F05455", +"x c #F05858", +"c c #0039AF", +"v c #0041B3", +"b c #0047B5", +"n c #004DB9", +"m c #0351BB", +"M c #0755BF", +"N c #0D59C1", +"B c #005FCD", +"V c #115DC1", +"C c #115DC3", +"Z c #135FC3", +"A c #AF6B89", +"S c #AF6C89", +"D c #B06D8A", +"F c #639DDE", +"G c #719DD8", +"H c #75A0D9", +"J c #76A0DA", +"K c #7AA3DB", +"L c #7DA6DC", +"P c #7EA6DD", +"I c #6DA4E1", +"U c #73A9E4", +"Y c #79ADE6", +"T c #BB839C", +"R c #D28796", +"E c #EE8989", +"W c #EF8C8C", +"Q c #F08F8F", +"! c #EF9999", +"~ c #F09292", +"^ c #F19595", +"/ c #F39999", +"( c #F49C9C", +") c #81A9DD", +"_ c #83AADE", +"` c #87ACDE", +"' c #8BAFDF", +"] c #8BAFE1", +"[ c #8FB2E1", +"{ c #92B4E2", +"} c #95B6E2", +"| c #97B8E4", +" . c #99B9E5", +".. c #9CBBE6", +"X. c #91BCEA", +"o. c #BBD0EB", +"O. c #BFD3ED", +"+. c #D7D7D7", +"@. c gray86", +"#. c #DDDDDD", +"$. c #DFDFDF", +"%. c #C2D5EF", +"&. c #CEDDF2", +"*. c #E1E3E3", +"=. c gray90", +"-. c #E7E7E7", +";. c #E9E9E9", +":. c gray92", +">. c gray93", +",. c #EFEFEF", +"<. c #F1F1F1", +"1. c #F3F3F3", +"2. c #F4F4F4", +"3. c gray96", +"4. c #F6F6F6", +"5. c gray97", +"6. c #F8F8F8", +"7. c #F9F9F9", +"8. c gray98", +"9. c #FBFBFB", +"0. c gray99", +"q. c #FDFDFD", +"w. c #FDFDFE", +"e. c #FEFEFE", +/* pixels */ +"B ] 3.3.3.1.1.<.,.,.,.:.;.-.=.*.", +"V X.&.e.e.e.q.q.0.0.8.8.7.6.3.$.", +"V ..Y %.e.q.q.e.8.8.7.8.6.3.6.#.", +"Z ._ U O.q.0.8.8.8.6.3.3.3.3.@.", +"N | _ P I o.0.8.8.7.6.3.3.3.3.+.", +"N } P K G F R ( / ^ ~ Q W E ! & ", +"n { K H G D f a r w 8 5 1 , i o ", +"n [ H G S f a t w 8 5 1 , : y o ", +"b ' G A f p r w 6 4 1 > ; - 0 . ", +"v ` T x z l k j h g s u y 0 9 . ", +"c = = % % $ @ @ @ O O o . . o " +}; diff --git a/src/pixmaps/flags_xpm/de.xpm b/src/pixmaps/flags_xpm/de.xpm new file mode 100644 index 00000000..573b35a9 --- /dev/null +++ b/src/pixmaps/flags_xpm/de.xpm @@ -0,0 +1,176 @@ +/* XPM */ +static const char *de[] = { +/* columns rows colors chars-per-pixel */ +"16 11 159 2", +" c #3F3F2F", +". c #3F3F31", +"X c #3E3D3D", +"o c #653635", +"O c #6C3C3C", +"+ c #404136", +"@ c #46463A", +"# c #47473A", +"$ c #4C4738", +"% c #4C493A", +"& c #49493C", +"* c #4C4A3C", +"= c #66493C", +"- c gray27", +"; c #4C4C43", +": c gray30", +"> c gray33", +", c #5B5B5B", +"< c #714544", +"1 c #784C4B", +"2 c #7E5353", +"3 c #626262", +"4 c #696869", +"5 c #6F6F6F", +"6 c gray46", +"7 c gray48", +"8 c #7E7E7E", +"9 c #9D3F2F", +"0 c #A53F2F", +"q c #A83F2F", +"w c #A93F2F", +"e c #BC3F2F", +"r c #BD3F2F", +"t c #EA1E1E", +"y c #EB2424", +"u c #EC2425", +"i c #EE2C2B", +"p c #EE2C2C", +"a c #EE2D2D", +"s c #EF3232", +"d c #EF3333", +"f c #F03335", +"g c #F13B3B", +"h c #F13C3C", +"j c #BE4435", +"k c #93732F", +"l c #9D792F", +"z c #9E7C2F", +"x c #A1762F", +"c c #A1792F", +"v c #A07F2F", +"b c #A37E2F", +"n c #AA7F2F", +"m c #AC7F2F", +"M c #B7792F", +"N c #835B5B", +"B c #896161", +"V c #8E6868", +"C c #936F6F", +"Z c #977474", +"A c #9B7A7A", +"S c #9F7E7E", +"D c #F24242", +"F c #F34343", +"G c #F34444", +"H c #F44949", +"J c #F44A4A", +"K c #F44B4B", +"L c #F65151", +"P c #F65252", +"I c #F65253", +"U c #F75959", +"Y c #F85A5A", +"T c #F95F5F", +"R c #F96060", +"E c #F96161", +"W c #FA6666", +"Q c #FA6868", +"! c #FB6D6D", +"~ c #FB6D6E", +"^ c #FB6E6E", +"/ c #F17C6B", +"( c #FC7373", +") c #F27F70", +"_ c #FD7979", +"` c #9B842F", +"' c #A3852F", +"] c #A9822F", +"[ c #AB852F", +"{ c #A98D2F", +"} c #AE8E2F", +"| c #B4852F", +" . c #B3882F", +".. c #B68B2F", +"X. c #B6A12F", +"o. c #B6A72F", +"O. c #E8821D", +"+. c #EA8724", +"@. c #EB8B2A", +"#. c #EE9032", +"$. c #EF9439", +"%. c #E6CD1D", +"&. c #E8CF22", +"*. c #E9D129", +"=. c #EBD42F", +"-. c #EDD737", +";. c #EFD93D", +":. c #8D8D7F", +">. c #A5897A", +",. c #F19941", +"<. c #F29D47", +"1. c #F4A24F", +"2. c #F5A556", +"3. c #F7AA5D", +"4. c #F38476", +"5. c #F9AF64", +"6. c #F0B66C", +"7. c #FAB26B", +"8. c #F1DB45", +"9. c #F2DD4B", +"0. c #F4E053", +"q. c #F5E25A", +"w. c #EFDA69", +"e. c #EFDB6B", +"r. c #F0DC6F", +"t. c #F1DD73", +"y. c #F2DE76", +"u. c #EFE06D", +"i. c #F7E461", +"p. c #F9E668", +"a. c #F3E07A", +"s. c #F4E27F", +"d. c #828383", +"f. c #919184", +"g. c #969689", +"h. c #9A9A8E", +"j. c #9E9D92", +"k. c #A2A297", +"l. c #A6A69B", +"z. c #AAAA9F", +"x. c #ADADA3", +"c. c #B0B0A7", +"v. c #B3B3A9", +"b. c #B6B6AD", +"n. c #B8B8AF", +"m. c #BABAB1", +"M. c #CAB8AF", +"N. c #FCAFA5", +"B. c #FCB2A9", +"V. c #FDB5AC", +"C. c #F5E482", +"Z. c #F5E587", +"A. c #F7E78B", +"S. c #F8E991", +"D. c #F9EB94", +"F. c #F9EB9A", +"G. c #FAED9D", +"H. c #FCD5A4", +"J. c #FBF1A2", +/* pixels */ +"; % $ * # + . . . ", +"# m.m.n.b.c.x.x.z.l.k.j.h.g.f. ", +"& m.d.8 7 6 5 4 3 , > : - X :. ", +"= M.S A Z Z V B N 2 1 < O o >. ", +"j V._ ( ! Q E U I K D h f a 4.w ", +"r B.( ! W E U L K D h s a u / w ", +"r N.! W T U L H D h s i y t / j ", +"M H.7.5.3.2.1.<.,.$.#.@.+.O.6.9 ", +"o.J.p.q.q.0.9.8.;.-.=.*.&.%.u.` ", +"X.G.G.D.S.A.Z.C.s.a.y.t.r.e.e.l ", +"} ..| .m m { [ ` ` v z v x c k " +}; diff --git a/src/pixmaps/flags_xpm/dj.xpm b/src/pixmaps/flags_xpm/dj.xpm new file mode 100644 index 00000000..4550e6dd --- /dev/null +++ b/src/pixmaps/flags_xpm/dj.xpm @@ -0,0 +1,170 @@ +/* XPM */ +static const char *dj[] = { +/* columns rows colors chars-per-pixel */ +"16 11 153 2", +" c #FD6E6E", +". c #008100", +"X c #008300", +"o c #008700", +"O c #008900", +"+ c #008B00", +"@ c #008F00", +"# c #009100", +"$ c #009300", +"% c #009900", +"& c #009D00", +"* c #009F00", +"= c #00A300", +"- c #00A500", +"; c #00A700", +": c #00B500", +"> c #0BC20B", +", c #0FC40E", +"< c #10C410", +"1 c #13C613", +"2 c #14C614", +"3 c #14CA14", +"4 c #18C719", +"5 c #19C819", +"6 c #19CB19", +"7 c #1EC91E", +"8 c #1FC91F", +"9 c #1FCD1F", +"0 c #23CB23", +"q c #24CB24", +"w c #24CF24", +"e c #29CD29", +"r c #2ACD2A", +"t c #2CCA2C", +"y c #2FCA2F", +"u c #2FCB2F", +"i c #2ECF2E", +"p c #2FCE2F", +"a c #2AD12A", +"s c #2FD22F", +"d c #32CC32", +"f c #33CC32", +"g c #35CD35", +"h c #34CE34", +"j c #34CF34", +"k c #39CF39", +"l c #36D136", +"z c #3DD03D", +"x c #42D242", +"c c #46D346", +"v c #48D644", +"b c #4BD54B", +"n c #4BD64B", +"m c #50D750", +"M c #54D855", +"N c #58D858", +"B c #74DE74", +"V c #004981", +"C c #0039E7", +"Z c #0045E7", +"A c #004BE9", +"S c #004DEB", +"D c #135DEF", +"F c #1961EF", +"G c #1963F1", +"H c #2167F3", +"J c #276DF5", +"K c #2D71F7", +"L c #3575F9", +"P c #3979FB", +"I c #3F7DFD", +"U c #5DA6C0", +"Y c #61A9C2", +"T c #65ACC4", +"R c #69AEC6", +"E c #6DB1C9", +"W c #71B3CB", +"Q c #74B3C9", +"! c #4381FD", +"~ c #4381FF", +"^ c #4583FD", +"/ c #4B87FD", +"( c #4B87FF", +") c #5B93FF", +"_ c #7B9CF4", +"` c #7F9FF5", +"' c #7AA2F5", +"] c #7CA5F6", +"[ c #7EA6F6", +"{ c #FCA9A9", +"} c #FCB2B2", +"| c #FEB7B7", +" . c #8DDF8D", +".. c #95E796", +"X. c #ABEAAB", +"o. c #B7ECB7", +"O. c #82A2F6", +"+. c #86A5F7", +"@. c #80A8F7", +"#. c #81A9F7", +"$. c #8DA9F5", +"%. c #8CAFF6", +"&. c #84ABF8", +"*. c #8AA8F8", +"=. c #8BAAF9", +"-. c #88AEF9", +";. c #8FB2F7", +":. c #8BB0FA", +">. c #8BB1FA", +",. c #8CB2FB", +"<. c #8FB3FB", +"1. c #8CB2FC", +"2. c #93B4F7", +"3. c #95B3FA", +"4. c #96B7F8", +"5. c #92B6FC", +"6. c #93B7FD", +"7. c #95B7FD", +"8. c #99B9F9", +"9. c #9BBBFA", +"0. c #9EBEFB", +"q. c #A0BFFE", +"w. c #BFE3D6", +"e. c #A1C0FC", +"r. c #A4C2FC", +"t. c #A7C3FD", +"y. c #A9C5FE", +"u. c #ABC7FE", +"i. c #AFC9FD", +"p. c #FECACA", +"a. c #DDF4DD", +"s. c #C3D7FF", +"d. c #C9DAFB", +"f. c #C8DAFF", +"g. c #D6E4FE", +"h. c #E9F7E9", +"j. c #EAF1FD", +"k. c gray97", +"l. c #FBF1F1", +"z. c #FDF3F3", +"x. c #F3F7FF", +"c. c #F9F9F9", +"v. c #F9FAF9", +"b. c gray98", +"n. c #FBFBFB", +"m. c #FAFAFC", +"M. c gray99", +"N. c #FDFCFC", +"B. c #FDFCFD", +"V. c #FDFDFD", +"C. c #FEFDFD", +"Z. c #FEFEFE", +"A. c gray100", +/* pixels */ +"s.) ~ ( ( ^ ~ I P L K J H F D F ", +"A.x.f.u.u.u.u.t.e.e.0.9.9.4.2.S ", +"A.A.A.g.0.6.7.5.5.>.-.&.#.[ ;.A ", +"A.A.A.A.j.i.1.>.-.-.&.#.] ' %.Z ", +"n.N.| l.N.m.d.3.=.*.+.O.` _ $.C ", +"A.p. { N.n.n.w.Q E R T Y U Q V ", +"n.A.} l.n.n.X.v s r w 9 6 3 l $ ", +"n.n.n.n.a.B d p r q 8 6 2 < d o ", +"n.m.n.o.n j p r 0 9 4 2 , > y o ", +"k.h...N M m n c x k k g d y t . ", +" .: ; ; = & & % $ @ @ + o o . + " +}; diff --git a/src/pixmaps/flags_xpm/dk.xpm b/src/pixmaps/flags_xpm/dk.xpm new file mode 100644 index 00000000..999163d2 --- /dev/null +++ b/src/pixmaps/flags_xpm/dk.xpm @@ -0,0 +1,139 @@ +/* XPM */ +static const char *dk[] = { +/* columns rows colors chars-per-pixel */ +"16 11 122 2", +" c #C50000", +". c #C70000", +"X c #C90000", +"o c #CB0000", +"O c #CD0000", +"+ c #CF0000", +"@ c #D10000", +"# c #D50000", +"$ c #D70000", +"% c #DB0000", +"& c #DF0000", +"* c #E10000", +"= c #E30000", +"- c #E50000", +"; c #E70000", +": c #E90000", +"> c #EB0000", +", c #ED0000", +"< c #EF0000", +"1 c #E40B0B", +"2 c #E40F0E", +"3 c #F10000", +"4 c #E41010", +"5 c #E61313", +"6 c #E51414", +"7 c #E61919", +"8 c #E71919", +"9 c #E81E1E", +"0 c #E81F1F", +"q c #E92020", +"w c #EA2323", +"e c #E92424", +"r c #EA2525", +"t c #E92626", +"y c #E62C2C", +"u c #EA2A2A", +"i c #EA2B2B", +"p c #EB2B2B", +"a c #EB2C2C", +"s c #E82F2F", +"d c #E83232", +"f c #EC3030", +"g c #EC3131", +"h c #ED3131", +"j c #E83535", +"k c #ED3736", +"l c #EE3636", +"z c #EE3737", +"x c #EC3738", +"c c #EA3939", +"v c #EF3A3A", +"b c #EF3B3C", +"n c #EB3D3D", +"m c #EB3F3F", +"M c #EE3C3C", +"N c #EF3C3D", +"B c #EF3F3F", +"V c #EF4142", +"C c #EC4242", +"Z c #EC4444", +"A c #ED4949", +"S c #EE4E4E", +"D c #F04141", +"F c #F04242", +"G c #F04444", +"H c #F04545", +"J c #F14747", +"K c #F14949", +"L c #F14E4E", +"P c #F34F50", +"I c #F05353", +"U c #F35354", +"Y c #F05455", +"T c #F35454", +"R c #F15757", +"E c #F15858", +"W c #F45858", +"Q c #F45959", +"! c #F25C5C", +"~ c #F25D5D", +"^ c #F55C5C", +"/ c #F55F5F", +"( c #F26060", +") c #F26162", +"_ c #F36565", +"` c #F36666", +"' c #F46969", +"] c #F46A6A", +"[ c #F67473", +"{ c #F77676", +"} c #F77777", +"| c #F77979", +" . c #F77B7A", +".. c #F77B7B", +"X. c #E9CFCF", +"o. c gray89", +"O. c gray90", +"+. c gray93", +"@. c #FBE7E7", +"#. c #F7E9E9", +"$. c #F7ECEC", +"%. c #F8EAEA", +"&. c gray95", +"*. c #F3F3F3", +"=. c #F4F4F4", +"-. c #F4F5F5", +";. c gray96", +":. c #F6F6F6", +">. c gray97", +",. c #FBF0F0", +"<. c #FAF2F2", +"1. c #FCF1F1", +"2. c #FDF4F4", +"3. c #F8F8F8", +"4. c #F9F9F9", +"5. c #FAF9F9", +"6. c gray98", +"7. c #FBFBFB", +"8. c #FBFCFB", +"9. c gray99", +"0. c #FDFDFD", +"q. c #FEFEFE", +/* pixels */ +"3 < < < < q.@.: : - - = = & % % ", +"< ......{ q.2.[ ' _ ( ~ R I S $ ", +"< ../ ^ W 0.1.U H F N k h a A $ ", +"< ..^ W W q.$.L F N k h i t Z O ", +": { R T L q.<.D b k f i t 0 m O ", +"q.q.q.9.7.7.3.7.3.3.;.;.=.*.;.O.", +"q.q.7.7.7.7.3.3.;.;.;.=.*.*.;.o.", +"- ' K H B 7.%.k p t 0 7 6 2 d . ", +"- ` H N v ;.#.d w 0 7 5 2 1 d . ", +"- ) ~ E R 7.#.S C b c j d y y . ", +"- = & % $ +.X.$ @ O o o . . " +}; diff --git a/src/pixmaps/flags_xpm/dm.xpm b/src/pixmaps/flags_xpm/dm.xpm new file mode 100644 index 00000000..c98cb83c --- /dev/null +++ b/src/pixmaps/flags_xpm/dm.xpm @@ -0,0 +1,164 @@ +/* XPM */ +static const char *dm[] = { +/* columns rows colors chars-per-pixel */ +"16 11 147 2", +" c black", +". c #002900", +"X c #002D00", +"o c #002F00", +"O c #003100", +"+ c #003300", +"@ c #003900", +"# c #282720", +"$ c #2E2D26", +"% c #004500", +"& c #004B00", +"* c #004D00", +"= c #005100", +"- c #005700", +"; c #005D00", +": c #006300", +"> c #006700", +", c #006D00", +"< c #007100", +"1 c #007700", +"2 c #007B00", +"3 c #474640", +"4 c #4E4D46", +"5 c #56554F", +"6 c #5A5A54", +"7 c #5F5E58", +"8 c #73736D", +"9 c #7C7B76", +"0 c #9F6D22", +"q c #A97B37", +"w c #AB7E39", +"e c #DD621F", +"r c #E05632", +"t c #E05634", +"y c #EF662B", +"u c #F16D2A", +"i c #EA6B30", +"p c #F36F31", +"a c #E47135", +"s c #E77337", +"d c #F37136", +"f c #F37735", +"g c #F16B42", +"h c #F16C44", +"j c #F47340", +"k c #E86E55", +"l c #E87053", +"z c #008100", +"x c #008300", +"c c #008700", +"v c #008900", +"b c #189A19", +"n c #1C9C1C", +"m c #1D9C1D", +"M c #219F21", +"N c #32A832", +"B c #37AA37", +"V c #38A738", +"C c #38AA38", +"Z c #3AA83A", +"A c #3BA93B", +"S c #3DA93D", +"D c #3EAA3E", +"F c #3DAE3D", +"G c #74B327", +"H c #72B427", +"J c #76B83C", +"K c #57C02A", +"L c #51CF39", +"P c #40AC40", +"I c #40AE40", +"U c #45AE44", +"Y c #42B042", +"T c #45B145", +"R c #4AB34A", +"E c #4BB44A", +"W c #4FB34F", +"Q c #4EB64E", +"! c #4FB64F", +"~ c #53B653", +"^ c #55B655", +"/ c #54B954", +"( c #58B958", +") c #5AB95A", +"_ c #5CBB5C", +"` c #5EBB5E", +"' c #5EBE5E", +"] c #60BD5B", +"[ c #61BD60", +"{ c #62BE62", +"} c #62BF62", +"| c #65BF65", +" . c #66BF66", +".. c #3CD553", +"X. c #7FCD50", +"o. c #65C166", +"O. c #66C166", +"+. c #68C369", +"@. c #6AC16A", +"#. c #6AC26A", +"$. c #6FC36F", +"%. c #73C673", +"&. c #79C87A", +"*. c #7BCA7B", +"=. c #7FCB7F", +"-. c #91B42F", +";. c #99BA3D", +":. c #E7BB00", +">. c #E9BF00", +",. c #FDDB00", +"<. c #FDE100", +"1. c #F7E134", +"2. c #F4E13B", +"3. c #AF8342", +"4. c #B08545", +"5. c #BA9258", +"6. c #EA824C", +"7. c #F98953", +"8. c #F88854", +"9. c #F68362", +"0. c #F78462", +"q. c #97CB46", +"w. c #F5E241", +"e. c #E0FA4C", +"r. c #F5E457", +"t. c #F7E65E", +"y. c #FDEC66", +"u. c #FDED6A", +"i. c #FEEE6D", +"p. c #FDEF7F", +"a. c #36A3E4", +"s. c #589EDD", +"d. c #42A8E9", +"f. c #80CD80", +"g. c #83CD83", +"h. c #FEF287", +"j. c gray89", +"k. c gray90", +"l. c gray95", +"z. c #F3F3F3", +"x. c #F4F4F4", +"c. c gray96", +"v. c #F9F9F9", +"b. c #FBFBFB", +"n. c #FBFCFB", +"m. c gray99", +"M. c #FDFDFD", +/* pixels */ +"v v v v c x x ,. b.< , > : ; - ", +"v g.g.g.=.*.&.p.8 b.@.O.] ` ) = ", +"v g.O.O.} ' 5.8.k 9.4.Y F C ~ & ", +"v =.o.o.' 5.6.X.d.` a w B N W % ", +"<.h.i.u.y.7.q.e...a.J d w.2.r.:.", +" 9 7 6 5 l j s.L i y t $ # 3 ", +"M.M.n.n.b.0.;.f 1.K G h l.l.x.j.", +"2 %./ ! E 3.a -.u H e 0 M m D O ", +"1 $.! R T I q p r g 0 M m b D X ", +"< #.| } ` ) ^ t.4 x.U I D V V . ", +", > : ; - = * >. k.@ + X X . . " +}; diff --git a/src/pixmaps/flags_xpm/do.xpm b/src/pixmaps/flags_xpm/do.xpm new file mode 100644 index 00000000..3ae5f77c --- /dev/null +++ b/src/pixmaps/flags_xpm/do.xpm @@ -0,0 +1,158 @@ +/* XPM */ +static const char *do_[] = { +/* columns rows colors chars-per-pixel */ +"16 11 141 2", +" c #000053", +". c #000055", +"X c #000059", +"o c #00005D", +"O c #00005F", +"+ c #000063", +"@ c #BB0000", +"# c #BF0000", +"$ c #C30000", +"% c #C50000", +"& c #C90000", +"* c #CB0000", +"= c #CF0000", +"- c #D10000", +"; c #D50000", +": c #D70000", +"> c #D90000", +", c #DB0000", +"< c #DD0000", +"1 c #E12020", +"2 c #E22525", +"3 c #E22626", +"4 c #E32B2B", +"5 c #E42B2B", +"6 c #E42C2C", +"7 c #E42E2E", +"8 c #E53030", +"9 c #E53131", +"0 c #E63434", +"q c #E73636", +"w c #E73736", +"e c #E73737", +"r c #E73A3A", +"t c #E73B3A", +"y c #E43F3F", +"u c #E83C3C", +"i c #E83C3D", +"p c #E83F3F", +"a c #E64444", +"s c #E84040", +"d c #E94242", +"f c #EA4444", +"g c #EA4545", +"h c #E74949", +"j c #E74B4B", +"k c #EB4949", +"l c #EB4A49", +"z c #E84E4E", +"x c #EC4F4F", +"c c #E85050", +"v c #E95353", +"b c #EA5455", +"n c #EB5757", +"m c #EB5858", +"M c #EC5C5C", +"N c #EC5D5D", +"B c #ED6060", +"V c #ED6162", +"C c #EE6565", +"Z c #EE6666", +"A c #EF6A6A", +"S c #F06F6F", +"D c #001D9D", +"F c #001F9F", +"G c #0023A1", +"H c #0025A1", +"J c #0027A3", +"K c #0329A3", +"L c #3654AE", +"P c #3A57AF", +"I c #3B57AF", +"U c #3E5AB2", +"Y c #3F5BB2", +"T c #435EB4", +"R c #435FB4", +"E c #445FB4", +"W c #4762B6", +"Q c #4863B6", +"! c #4D67B9", +"~ c #516AB8", +"^ c #516BBB", +"/ c #546DB9", +"( c #556DB9", +") c #566FBB", +"_ c #586FBB", +"` c #5A72BC", +"' c #5B72BD", +"] c #5D75BE", +"[ c #6078C0", +"{ c #697FC7", +"} c #6D83C9", +"| c #7186CA", +" . c #7187CB", +".. c #7287CB", +"X. c #758ACC", +"o. c #788DCE", +"O. c #798DCE", +"+. c #7B8FCF", +"@. c #7E92D0", +"#. c #8B9DD4", +"$. c #8F9FD6", +"%. c #8FA1D7", +"&. c #91A1D7", +"*. c #93A3D8", +"=. c #93A4D8", +"-. c #94A4D8", +";. c #94A5D8", +":. c #95A5D8", +">. c #E9D5D1", +",. c #D9DFE7", +"<. c gray90", +"1. c #F6ECEA", +"2. c #F7EDEB", +"3. c #F7EEED", +"4. c #FBEFED", +"5. c #EDF2F5", +"6. c #EFF3F6", +"7. c #EDF3FD", +"8. c #F3F3F3", +"9. c #F4F4F4", +"0. c #F4F5F5", +"q. c gray96", +"w. c #F5F6F7", +"e. c #F6F6F6", +"r. c gray97", +"t. c #F8F4F3", +"y. c #FAF4F2", +"u. c #FBF5F4", +"i. c #F9F6F5", +"p. c #FCF7F7", +"a. c #F2F7FB", +"s. c #F6F8FA", +"d. c #F4F8FC", +"f. c #F7F9FD", +"g. c #F8F8F8", +"h. c #F9F9F9", +"j. c gray98", +"k. c #FBFBFB", +"l. c gray99", +"z. c #FDFDFD", +"x. c #FEFEFE", +/* pixels */ +"K K K K J F D 7.4., : : = = * * ", +"K :.:.=.&.%.#.s.p.C B N n v z $ ", +"K =.@.+.+...| d.p.d t e 9 6 h $ ", +"J *.+.o.X.| } a.y.r e 9 5 3 a # ", +"G %.+...| } { w.t.w 8 4 3 1 t @ ", +"x.x.x.x.l.k.k.k.h.w.w.w.9.8.w.<.", +"< A v k f s r t.w./ ! W W Y ' O ", +", A k g p r 0 2.6.! W R U I _ X ", +", C g t r 9 6 2.6.W R U P L / ", +": C N n n v j 3.6.] ] ` ) / ~ ", +"; = = * * $ $ >.,.+ O O X . " +}; diff --git a/src/pixmaps/flags_xpm/dz.xpm b/src/pixmaps/flags_xpm/dz.xpm new file mode 100644 index 00000000..7a6bbfb5 --- /dev/null +++ b/src/pixmaps/flags_xpm/dz.xpm @@ -0,0 +1,153 @@ +/* XPM */ +static const char *dz[] = { +/* columns rows colors chars-per-pixel */ +"16 11 136 2", +" c #000500", +". c #000B00", +"X c #001100", +"o c #001B00", +"O c #002300", +"+ c #002D00", +"@ c #003500", +"# c #004709", +"$ c #004B11", +"% c #004F17", +"& c #005721", +"* c #005F2B", +"= c #016533", +"- c #036535", +"; c #036737", +": c #096B39", +"> c #0B6D3D", +", c #0D6F3D", +"< c #116F3F", +"1 c #117141", +"2 c #21794D", +"3 c #727056", +"4 c #B96D60", +"5 c #DB5144", +"6 c #DD554A", +"7 c #DF5550", +"8 c #D65A50", +"9 c #E0584D", +"0 c #E15E52", +"q c #CE6E61", +"w c #DD776D", +"e c #D17B6F", +"r c #E57066", +"t c #E67166", +"y c #E77166", +"u c #E3746C", +"i c #E67B74", +"p c #3E8560", +"a c #458E69", +"s c #4C916E", +"d c #549170", +"f c #539574", +"g c #559574", +"h c #549775", +"j c #549C7A", +"k c #5A9A7A", +"l c #5B9A7B", +"z c #5B9E7D", +"x c #758569", +"c c #669A7C", +"v c #619E80", +"b c #619F80", +"n c #629E80", +"m c #4EA280", +"M c #62A182", +"N c #67A385", +"B c #68A385", +"V c #68A486", +"C c #6AA486", +"Z c #69A788", +"A c #6EA68A", +"S c #6EA78A", +"D c #6FA78B", +"F c #6FA88C", +"G c #6FA98C", +"H c #74AA8F", +"J c #73AB90", +"K c #74AB90", +"L c #75AB90", +"P c #79AE94", +"I c #7AAE94", +"U c #7DB197", +"Y c #7FB299", +"T c #8D9580", +"R c #8C9B82", +"E c #85B59D", +"W c #87B59E", +"Q c #85B9A1", +"! c #8AB8A1", +"~ c #8BB9A2", +"^ c #8EBBA4", +"/ c #8FBCA5", +"( c #92BEA8", +") c #94BFA9", +"_ c #94BFAA", +"` c #95BFAA", +"' c #E78C84", +"] c #E7908A", +"[ c #EDB9B8", +"{ c #BEC7C3", +"} c gray79", +"| c #CBCBCB", +" . c #CECECE", +".. c #D0D0D0", +"X. c #D2D2D2", +"o. c gray84", +"O. c #D8D8D8", +"+. c gray85", +"@. c gray86", +"#. c #DDDDDD", +"$. c #E8CFCC", +"%. c #F5CBCB", +"&. c #EAD9D7", +"*. c #F1D3D3", +"=. c #F3D7D7", +"-. c #E1E1E1", +";. c #E0E3E1", +":. c gray89", +">. c gray90", +",. c #E6E6E6", +"<. c gray92", +"1. c #ECECEC", +"2. c gray93", +"3. c #EEEEEE", +"4. c #EFEFEF", +"5. c #F4E8E8", +"6. c #F4EAEA", +"7. c #F1ECEC", +"8. c #F3ECEC", +"9. c #F2EEEE", +"0. c #EBF4F2", +"q. c gray94", +"w. c #F1F1F1", +"e. c gray95", +"r. c #F3F3F3", +"t. c #F5F0F0", +"y. c #F4F4F4", +"u. c gray96", +"i. c #F6F6F6", +"p. c gray97", +"a. c #F5FCFA", +"s. c #F8F8F8", +"d. c #F9F9F9", +"f. c gray98", +"g. c #FCFBFB", +"h. c gray99", +/* pixels */ +"2 1 1 1 > ; * ; ;.,.,.,.;.-.#.@.", +", ` ` ( / ! E Q a.h.g.f.f.s.p.+.", +"1 ` U P H G C T *.8.w.4.4.1.p.+.", +"< ( P J H R w r ] =.8.4.1.<.p.o.", +": ^ J S Z e r c &.' 8.4.1.<.p.X.", +"= ! S V M r 4 m 0 9 5 q.q.1.w...", +"* E N M z q 7 d $.i t.p.w.q.w. .", +"& Y c j h x 8 6 u %.6.w.w.w.w.| ", +"% P l f s a p 3 [ 6.w.w.w.q.w.| ", +"# H S C n l g j 0.w.w.w.w.w.4.| ", +"$ @ + O o . . { X... .| | } } " +}; diff --git a/src/pixmaps/flags_xpm/ec.xpm b/src/pixmaps/flags_xpm/ec.xpm new file mode 100644 index 00000000..aa2c8776 --- /dev/null +++ b/src/pixmaps/flags_xpm/ec.xpm @@ -0,0 +1,171 @@ +/* XPM */ +static const char *ec[] = { +/* columns rows colors chars-per-pixel */ +"16 11 154 2", +" c #000045", +". c #000065", +"X c #000067", +"o c #A50000", +"O c #C10000", +"+ c #C30000", +"@ c #C50000", +"# c #C70000", +"$ c #CB0000", +"% c #CD0000", +"& c #CF0000", +"* c #D10000", +"= c #D30000", +"- c #D50000", +"; c #D70000", +": c #D90000", +"> c #DB0000", +", c #DD0000", +"< c #D31D1D", +"1 c #E10000", +"2 c #EF0000", +"3 c #D42120", +"4 c #D52525", +"5 c #D62A2A", +"6 c #D82F2F", +"7 c #DA3333", +"8 c #DC3838", +"9 c #D83F3F", +"0 c #DD3E3E", +"q c #EC332C", +"w c #ED352F", +"e c #ED3832", +"r c #EE3C35", +"t c #EF4039", +"y c #F0433D", +"u c #DF4343", +"i c #E04848", +"p c #E24D4D", +"a c #F14742", +"s c #F24C46", +"d c #F2504B", +"f c #E35252", +"g c #F35550", +"h c #F55A55", +"j c #F65F58", +"k c #F7635D", +"l c #F76762", +"z c #E97272", +"x c #DFB100", +"c c #E3B300", +"v c #E5B900", +"b c #E7BB00", +"n c #E9BF00", +"m c #EBC100", +"M c #EDC500", +"N c #EFC700", +"B c #EFC900", +"V c #F1CB00", +"C c #F3CF01", +"Z c #F5D107", +"A c #F7D10D", +"S c #FDDF0B", +"D c #F7D311", +"F c #F9D715", +"G c #F9D517", +"H c #F9D519", +"J c #F9D719", +"K c #F9D927", +"L c #F4DE49", +"P c #F5DF4E", +"I c #F2DA54", +"U c #F3DB59", +"Y c #F4DD5D", +"T c #F6E152", +"R c #F7E357", +"E c #F8E45C", +"W c #F4DE62", +"Q c #F5DF62", +"! c #F5DF66", +"~ c #F6DF67", +"^ c #F3DE6C", +"/ c #F5E262", +"( c #F9E660", +") c #FAE765", +"_ c #F6E16B", +"` c #F7E26F", +"' c #FBE869", +"] c #FCE96D", +"[ c #F4E070", +"{ c #F5E175", +"} c #F8E473", +"| c #F9E577", +" . c #FDEA71", +".. c #FDEB75", +"X. c #F6E279", +"o. c #F7E47B", +"O. c #F7E57F", +"+. c #FAE67B", +"@. c #FAE77D", +"#. c #FEEC78", +"$. c #0025A1", +"%. c #002DA3", +"&. c #115389", +"*. c #2463B5", +"=. c #2967B7", +"-. c #2D6AB9", +";. c #2E6BBA", +":. c #316EBC", +">. c #326FBC", +",. c #3772BD", +"<. c #3772BE", +"1. c #3C76BF", +"2. c #447ABF", +"3. c #4179C1", +"4. c #417AC2", +"5. c #477DC1", +"6. c #467DC4", +"7. c #5480A4", +"8. c #5983A6", +"9. c #5D87A8", +"0. c #608BAB", +"q. c #658EAE", +"w. c #6991B0", +"e. c #6C93B0", +"r. c #6E95B3", +"t. c #7298B6", +"y. c #769BB8", +"u. c #7A9EBA", +"i. c #7DA0BD", +"p. c #4B81C6", +"a. c #4C81C6", +"s. c #5084C8", +"d. c #5185C8", +"f. c #5588CA", +"g. c #5589CA", +"h. c #5A8CCC", +"j. c #5F8FCE", +"k. c #78A1D6", +"l. c #7CA4D8", +"z. c #81A3BE", +"x. c #F8E683", +"c. c #F8E787", +"v. c #FBE880", +"b. c #FCE983", +"n. c #F9E88A", +"m. c #FAE98D", +"M. c #FEF08F", +"N. c #FBEA90", +"B. c #FBEB92", +"V. c #FCEC95", +"C. c #FCED96", +"Z. c #FCED98", +"A. c #FCED99", +"S. c #97B4CA", +/* pixels */ +"K J J J F D A Z C V B N N n n n ", +"F A.A.C.C.B.N.m.n.c.x.@.o.X.{ v ", +"J A.b.v.@.+.| } ` _ ~ W Y U [ c ", +"J C.v.@.+.| } ` _ ~ W Y U I ^ x ", +"S m.#... .] ' ) E E R P P L R n ", +"&.S.z.i.u.y.t.r.w.q.0.0.8.2.e. ", +"%.l.j.h.g.d.a.6.3.1.,.>.;.=.2.. ", +"$.k.j.g.a.a.6.4.1.<.>.;.=.=.2.. ", +"% z f p i u 0 8 7 6 5 4 3 < 9 o ", +"2 l k j h g d s a y r r r w q * ", +"1 , : : ; ; * * * % # # # O O O " +}; diff --git a/src/pixmaps/flags_xpm/ee.xpm b/src/pixmaps/flags_xpm/ee.xpm new file mode 100644 index 00000000..44ae9efa --- /dev/null +++ b/src/pixmaps/flags_xpm/ee.xpm @@ -0,0 +1,131 @@ +/* XPM */ +static const char *ee[] = { +/* columns rows colors chars-per-pixel */ +"16 11 114 2", +" c black", +". c gray8", +"X c #191919", +"o c gray10", +"O c gray12", +"+ c #202020", +"@ c gray14", +"# c #252525", +"$ c #2A2A2A", +"% c #2A2B2B", +"& c gray17", +"* c #2F2F2F", +"= c gray19", +"- c #353535", +"; c gray21", +": c #3B3B3A", +"> c gray23", +", c #3B3B3C", +"< c #3F3F3F", +"1 c gray25", +"2 c #414141", +"3 c gray27", +"4 c #464646", +"5 c #494A49", +"6 c #4B4A4B", +"7 c #4B4B4B", +"8 c gray31", +"9 c #504F50", +"0 c #535353", +"q c gray33", +"w c #585858", +"e c #6F6F6F", +"r c #727273", +"t c #767676", +"y c #000093", +"u c #000097", +"i c #00009B", +"p c #00009F", +"a c #0005A3", +"s c #000DA5", +"d c #0013A9", +"f c #0019AD", +"g c #0021B1", +"h c #0027B3", +"j c #002DB5", +"k c #0033B9", +"l c #0037BB", +"z c #003BBD", +"x c #0041BF", +"c c #0043BF", +"v c #267ACC", +"b c #2B7CCE", +"n c #2C7CCE", +"m c #3180D0", +"M c #3181D0", +"N c #3784D1", +"B c #3784D2", +"V c #3C88D3", +"C c #3D88D4", +"Z c #448CD3", +"A c #428BD5", +"S c #478FD7", +"D c #498FD5", +"F c #4E93D7", +"G c #4B92D8", +"H c #4C92D8", +"J c #5396D8", +"K c #5195DA", +"L c #5498DB", +"P c #5898D9", +"I c #5C9BDB", +"U c #589BDC", +"Y c #599BDD", +"T c #5C9DDE", +"R c #5F9FDF", +"E c #619EDD", +"W c #65A1DD", +"Q c #69A4DF", +"! c #6DA7E0", +"~ c #70A9E2", +"^ c #74ABE2", +"/ c #77ADE3", +"( c #79AEE4", +") c #7BB0E4", +"_ c gray75", +"` c #C1C1C1", +"' c #C3C3C3", +"] c #C5C5C5", +"[ c gray79", +"{ c #CBCBCB", +"} c gray81", +"| c gray82", +" . c LightGray", +".. c #D7D7D7", +"X. c #D9D7D9", +"o. c gray85", +"O. c gray86", +"+. c #DFDFDF", +"@. c #E1E1E1", +"#. c gray89", +"$. c gray90", +"%. c #F1F1F1", +"&. c gray95", +"*. c #F2F2F3", +"=. c #F3F3F3", +"-. c #F4F4F4", +";. c gray96", +":. c #F6F6F6", +">. c gray97", +",. c #F8F8F8", +"<. c #F9F9F9", +"1. c gray98", +"2. c #FBFBFB", +"3. c gray99", +/* pixels */ +"c c c c c z l k j h g f d s a p ", +"c ) ) ( / ^ ~ ! Q E E I P K F i ", +"c ) R R Y L K H D A C V M n D u ", +"c / R L L K G S A C B n n v Z y ", +" t w q 9 5 4 2 , - = & # + < ", +" r 0 8 6 4 1 : - = & @ O o > ", +" e 8 5 4 < : - = & @ O X . - ", +"$.3.2.2.2.2.>.>.>.>.=.=.=.=.=.] ", +"#.2.2.2.2.>.>.>.=.=.=.=.%.%.=._ ", +"#.2.>.2.>.>.>.>.>.>.=.=.=.=.=._ ", +"+.O.O.X...| | } [ [ ] ] ' _ _ _ " +}; diff --git a/src/pixmaps/flags_xpm/eg.xpm b/src/pixmaps/flags_xpm/eg.xpm new file mode 100644 index 00000000..b91afc90 --- /dev/null +++ b/src/pixmaps/flags_xpm/eg.xpm @@ -0,0 +1,143 @@ +/* XPM */ +static const char *eg[] = { +/* columns rows colors chars-per-pixel */ +"16 11 126 2", +" c black", +". c #0B0B0B", +"X c #0F0F0E", +"o c #131313", +"O c #181919", +"+ c #1E1E1E", +"@ c #232323", +"# c gray16", +"$ c #2C2C2C", +"% c gray18", +"& c #2F2F2F", +"* c #323232", +"= c #343434", +"- c #353535", +"; c #393939", +": c #3A3A3A", +"> c gray24", +", c #3F3F3F", +"< c gray26", +"1 c #444444", +"2 c #464646", +"3 c #4B4B4B", +"4 c #505050", +"5 c #545455", +"6 c #585858", +"7 c #5D5D5D", +"8 c #616162", +"9 c gray39", +"0 c gray40", +"q c #6A6A6A", +"w c #6C6C6D", +"e c #707071", +"r c gray48", +"t c #7B7B7C", +"y c #CF0000", +"u c #D30000", +"i c #D50000", +"p c #D70000", +"a c #D90000", +"s c #DB0000", +"d c #DF0000", +"f c #E10000", +"g c #E30000", +"h c #E50000", +"j c #E70000", +"k c #E90000", +"l c #EB0000", +"z c #ED0000", +"x c #E92C2C", +"c c #E93131", +"v c #EB3737", +"b c #EC3C3D", +"n c #F13535", +"m c #ED4242", +"M c #EF4747", +"N c #EB4949", +"B c #ED4E4E", +"V c #F04C4C", +"C c #ED5353", +"Z c #EE5757", +"A c #F15151", +"S c #F25454", +"D c #F25959", +"F c #F05C5C", +"G c #F35C5C", +"H c #F35F5F", +"J c #EC6969", +"K c #ED6D6D", +"L c #F16060", +"P c #F26565", +"I c #F26969", +"U c #F36D6D", +"Y c #EE7171", +"T c #EF7575", +"R c #ED7E7E", +"E c #F47071", +"W c #F57474", +"Q c #F67777", +"! c #F17A7B", +"~ c #F67979", +"^ c #F67B7A", +"/ c #F77B7B", +"( c #F2BB76", +") c #DECB62", +"_ c #DFCC66", +"` c #EFDD72", +"' c #F0DD74", +"] c #F1DE77", +"[ c #F2E07B", +"{ c #F3E27F", +"} c #EF7E80", +"| c #808080", +" . c #848484", +".. c #888888", +"X. c #8B8B8B", +"o. c #A0A0A0", +"O. c #F48585", +"+. c #F48888", +"@. c #F58B8B", +"#. c #F68E8E", +"$. c #F69090", +"%. c #F8A4A4", +"&. c #E8D883", +"*. c #E9DA88", +"=. c #EEDE89", +"-. c #F4E383", +";. c #F2E597", +":. c gray89", +">. c gray90", +",. c #E7E7E7", +"<. c gray95", +"1. c #F3F3F3", +"2. c #F4F4F4", +"3. c #F4F5F5", +"4. c gray96", +"5. c #F6F6F6", +"6. c gray97", +"7. c #F7F8F3", +"8. c #FAFAF9", +"9. c gray98", +"0. c #FBFBFB", +"q. c #FBFCFB", +"w. c gray99", +"e. c #FDFCFD", +"r. c #FDFDFD", +"t. c #FEFEFE", +/* pixels */ +"z l l l z z z l j j f d s s p p ", +"l / / / } } E E I P L F Z C B u ", +"l / H G G S V b M m b v c x N y ", +"v %.#.#.$.} } ( ( ! T Y K J } p ", +"e.t.e.e.e.e.8.;.[ 4.6.4.3.1.3.,.", +"e.t.e.e.e.q.-.=.' ] 6.4.3.1.3.>.", +"e.e.e.q.q.8.{ *.&.` 3.1.1.<.3.:.", +"& o.X... .| r _ ) e w q 0 9 t ", +" 0 2 < ; - & # @ + O o X . & ", +" 8 7 6 5 3 3 2 < , ; - * & $ ", +" " +}; diff --git a/src/pixmaps/flags_xpm/eh.xpm b/src/pixmaps/flags_xpm/eh.xpm new file mode 100644 index 00000000..da6a1f0a --- /dev/null +++ b/src/pixmaps/flags_xpm/eh.xpm @@ -0,0 +1,162 @@ +/* XPM */ +static const char *eh[] = { +/* columns rows colors chars-per-pixel */ +"16 11 145 2", +" c black", +". c #002500", +"X c #002700", +"o c #002B00", +"O c #002D00", +"+ c #002F00", +"@ c #003500", +"# c #003B00", +"$ c #003F00", +"% c #3B3737", +"& c gray24", +"* c #004500", +"= c #004B00", +"- c #005100", +"; c #005500", +": c #005B00", +"> c #006100", +", c #006B00", +"< c #006D00", +"1 c #006F00", +"2 c gray26", +"3 c gray28", +"4 c #4B4B4D", +"5 c #515051", +"6 c #555555", +"7 c gray35", +"8 c #5A5858", +"9 c gray36", +"0 c #5D5D5D", +"q c #616061", +"w c gray38", +"e c #646464", +"r c #656565", +"t c #6A6A6A", +"y c #6D6D6D", +"u c #717170", +"i c gray46", +"p c #777777", +"a c gray48", +"s c gray49", +"d c #7F7F7E", +"f c gray50", +"g c #B10000", +"h c #B90000", +"j c #DD0000", +"k c #DF0000", +"l c #DF0B0B", +"z c #E30000", +"x c #E50000", +"c c #E70000", +"v c #E90000", +"b c #EB0000", +"n c #E21414", +"m c #E41F1F", +"M c #F21010", +"N c #F21414", +"B c #F31919", +"V c #F31A1A", +"C c #F41F1F", +"Z c #D82C2C", +"A c #D82D2D", +"S c #E22C2C", +"D c #F42020", +"F c #F52525", +"G c #F52626", +"H c #F22F2F", +"J c #F33232", +"K c #F43636", +"L c #F43B3B", +"P c #F53F3F", +"I c #DE4F4F", +"U c #F64444", +"Y c #F74949", +"T c #FA6262", +"R c #F7797A", +"E c #F87878", +"W c #12960E", +"Q c #139A13", +"! c #189B19", +"~ c #1E9C1E", +"^ c #239F23", +"/ c #29A229", +"( c #2EA62E", +") c #31A32F", +"_ c #32A632", +"` c #34A934", +"' c #35A835", +"] c #39A939", +"[ c #3AAB3A", +"{ c #3DAC3D", +"} c #3FAD3F", +"| c #42AE42", +" . c #44B044", +".. c #46B046", +"X. c #4BB24B", +"o. c #50B450", +"O. c #54B755", +"+. c #58B958", +"@. c #5DBC5D", +"#. c #61BE62", +"$. c #66BF66", +"%. c #F98181", +"&. c #F88486", +"*. c #FA9191", +"=. c #DFDFDF", +"-. c #F9C4C4", +";. c #FBC8C8", +":. c #FBD0D0", +">. c #F9D7D7", +",. c #DFE8DB", +"<. c #DDEFDD", +"1. c #E4E1E1", +"2. c #E5E6E6", +"3. c #E6E6E6", +"4. c #E0EDE1", +"5. c #E2EDE2", +"6. c #E2EFE2", +"7. c #E4EFE4", +"8. c gray91", +"9. c #E9E9E9", +"0. c #EAEAEA", +"q. c gray92", +"w. c #ECECEC", +"e. c gray93", +"r. c #F5E7E9", +"t. c #E6F1E6", +"y. c #E7F1E7", +"u. c #E8F2E8", +"i. c #EAF3EA", +"p. c #EBF4EB", +"a. c #EFF7EF", +"s. c #F1F1F1", +"d. c #F7F3F3", +"f. c #F6F6F6", +"g. c gray97", +"h. c #F1F9F1", +"j. c #F3F9F3", +"k. c #F8F8F8", +"l. c gray98", +"z. c #FBFBFB", +"x. c #FBFCFB", +"c. c gray99", +"v. c #FDFCFD", +"b. c #FDFDFD", +"n. c #FEFEFE", +/* pixels */ +" g ", +" f f f a p p u y t e e 7 7 I b ", +" f e 0 0 7 6 5 4 3 2 & % A Y b ", +"=.s.e.e.w.w.9.9.3.3.3.1.A G U c ", +"j.n.n.n.c.z.;.*.%.g.d.Z G C P c ", +"h.n.n.x.c.:.T >.E g.Z G C V L c ", +"a.n.n.z.z.z.-.&.R g.r.m V N K z ", +"<.a.i.i.i.t.7.7.5.5.4.,.n M J k ", +"1 $...{ ] ` ( / ^ ~ ! Q W l H k ", +"1 #.@.+.O.o.X...| { ] ' _ ) S k ", +"1 > : ; - = * $ # @ + o . . + h " +}; diff --git a/src/pixmaps/flags_xpm/england.xpm b/src/pixmaps/flags_xpm/england.xpm new file mode 100644 index 00000000..031c4f69 --- /dev/null +++ b/src/pixmaps/flags_xpm/england.xpm @@ -0,0 +1,123 @@ +/* XPM */ +static const char *england[] = { +/* columns rows colors chars-per-pixel */ +"16 11 106 2", +" c #8D0000", +". c #910000", +"X c #970000", +"o c #9D0000", +"O c #A70000", +"+ c #B90000", +"@ c #BB0000", +"# c #BF0000", +"$ c #CA2222", +"% c #CB2828", +"& c #CD2A2A", +"* c #CD2C2C", +"= c #CF3030", +"- c #CF3232", +"; c #C93F3F", +": c #D13636", +"> c #D13737", +", c #D33B3B", +"< c #D33C3C", +"1 c #D14242", +"2 c #D54242", +"3 c #D34747", +"4 c #D64747", +"5 c #D74748", +"6 c #D54C4C", +"7 c #D84C4C", +"8 c #D84D4D", +"9 c #D15555", +"0 c #DA5151", +"q c #DA5252", +"w c #DB5556", +"e c #DC5A5A", +"r c #D87070", +"t c #D97373", +"y c #DB7777", +"u c #DD7A7A", +"i c #DE7A7A", +"p c #E06E6E", +"a c #E27272", +"s c #E27777", +"d c #DD8181", +"f c #DD8484", +"g c #DE8585", +"h c #E28686", +"j c #E08888", +"k c #E28B8B", +"l c #E38B8B", +"z c #E48D8D", +"x c #E19393", +"c c #E69090", +"v c #E69493", +"b c #E79595", +"n c #E89696", +"m c #E99C9C", +"M c #E99F9F", +"N c #D1BFBF", +"B c #EAA1A1", +"V c #ECA4A4", +"C c #EDA9A9", +"Z c #EFB4B4", +"A c #CBCBCB", +"S c #CFCDCD", +"D c gray81", +"F c #D7CBCB", +"G c gray82", +"H c #D7D7D7", +"J c gray85", +"K c #DDDDDD", +"L c #DFDFDF", +"P c #E9DBDB", +"I c #E1E1E1", +"U c gray89", +"Y c gray90", +"T c #E7E7E7", +"R c #EDE5E5", +"E c #E9E9E9", +"W c gray92", +"Q c gray93", +"! c #F2EBEB", +"~ c #F3EDED", +"^ c #F4EEEE", +"/ c #EFEFF1", +"( c #F1F1F1", +") c gray95", +"_ c #F2F2F3", +"` c #F3F3F3", +"' c #F6F1F1", +"] c #F7F1F1", +"[ c #F4F4F4", +"{ c gray96", +"} c #F6F6F6", +"| c gray97", +" . c #F9F2F2", +".. c #F8F3F3", +"X. c #FAF5F5", +"o. c #FBF5F5", +"O. c #FBF6F6", +"+. c #F8F8F8", +"@. c #F9F9F9", +"#. c gray98", +"$. c #FBFBFB", +"%. c #FCF8F8", +"&. c gray99", +"*. c #FDFDFD", +"=. c #FEFEFE", +"-. c gray100", +/* pixels */ +"( ( ( ( Q / R @ @ P E T Y U I L ", +"( -.-.-.-.-.&.a p o.$.$.+.+.} K ", +"Q -.-.-.-.&.O.q 8 ..$.+.} } | J ", +"( -.$.-.&.-.o.6 4 ..o.} } } } H ", +"9 Z V B M M b 4 2 z z j g d x O ", +"# s e w 8 6 4 2 < - - % % $ 1 ", +"1 C b v c z h , > u u y t t g o ", +"W &.&.$.$.$.' : - ^ } [ ( ( ( D ", +"W $.$.$.@.@.' = & ! ( ( ( ( [ A ", +"E $.@.@.@.@.' 6 3 ~ } ( [ ( ( A ", +"T Y U I L K F X . N G D D A A A " +}; diff --git a/src/pixmaps/flags_xpm/er.xpm b/src/pixmaps/flags_xpm/er.xpm new file mode 100644 index 00000000..38f737e4 --- /dev/null +++ b/src/pixmaps/flags_xpm/er.xpm @@ -0,0 +1,183 @@ +/* XPM */ +static const char *er[] = { +/* columns rows colors chars-per-pixel */ +"16 11 166 2", +" c black", +". c #003F00", +"X c #5F3500", +"o c #004900", +"O c #004D00", +"+ c #005100", +"@ c #005F00", +"# c #006300", +"$ c #006900", +"% c #006D00", +"& c #0B6B00", +"* c #007100", +"= c #007700", +"- c #007B00", +"; c #007F00", +": c #6E7021", +"> c #550041", +", c #B10000", +"< c #C30900", +"1 c #DF0000", +"2 c #E10000", +"3 c #E50000", +"4 c #E70000", +"5 c #EF0000", +"6 c #F11A1A", +"7 c #F41F1F", +"8 c #DB272E", +"9 c #DC352E", +"0 c #DF2F37", +"q c #EB2525", +"w c #EC2424", +"e c #E72D2D", +"r c #EE2A2A", +"t c #E92F2F", +"y c #EF2F2F", +"u c #E73333", +"i c #E83639", +"p c #E63F3C", +"a c #EC3B3F", +"s c #F13034", +"d c #F33639", +"f c #AA4F28", +"g c #817E38", +"h c #B8613E", +"j c #EC5D37", +"k c #EF773D", +"l c #F47634", +"z c #F7753A", +"x c #F5753F", +"c c #B1375C", +"v c #B93E61", +"b c #C53C5E", +"n c #D34A4A", +"m c #E44844", +"M c #EF4D45", +"N c #EC4648", +"B c #F5474A", +"V c #EF5F44", +"C c #EF594D", +"Z c #CA6852", +"A c #F16B56", +"S c #EF7857", +"D c #FB735B", +"F c #FA7F5E", +"G c #ED5F63", +"H c #D3647E", +"J c #F56162", +"K c #F46762", +"L c #F16669", +"P c #F57B7C", +"I c #F27E7E", +"U c #FB7B7E", +"Y c #008500", +"T c #008900", +"R c #008B00", +"E c #009100", +"W c #26AA26", +"Q c #2BA92B", +"! c #2CA92C", +"~ c #31AC31", +"^ c #37B037", +"/ c #3DB43D", +"( c #499B32", +") c #55A03F", +"_ c #54AF48", +"` c #42B442", +"' c #44B344", +"] c #49B449", +"[ c #4EB74E", +"{ c #53B953", +"} c #58BC57", +"| c #5CBE5C", +" . c #61C060", +".. c #65C265", +"X. c #69C569", +"o. c #6DC86D", +"O. c #70C571", +"+. c #F4B93A", +"@. c #F6D63B", +"#. c #97874E", +"$. c #8AB675", +"%. c #B1A078", +"&. c #F29D42", +"*. c #F59C50", +"=. c #F59059", +"-. c #F4AF46", +";. c #FAB54D", +":. c #F7BD4B", +">. c #F6A155", +",. c #D8897A", +"<. c #F38F6D", +"1. c #F6907A", +"2. c #F6C142", +"3. c #F6C046", +"4. c #F6C940", +"5. c #F7CD47", +"6. c #F7C64C", +"7. c #F8CB4A", +"8. c #F8C251", +"9. c #F9C156", +"0. c #F8C851", +"q. c #FACC51", +"w. c #FACB5E", +"e. c #F9D059", +"r. c #FAD86F", +"t. c #FBD776", +"y. c #FBDD73", +"u. c #01009D", +"i. c #0000B9", +"p. c #0000BB", +"a. c #0000BD", +"s. c #0000BF", +"d. c #0000C1", +"f. c #0000C3", +"g. c #0000C5", +"h. c #0000C9", +"j. c MediumBlue", +"k. c #0000D5", +"l. c #000DD5", +"z. c #0005DD", +"x. c #3964DF", +"c. c #3C68E1", +"v. c #3C6BE7", +"b. c #3D6EE7", +"n. c #346DEC", +"m. c #3B73EE", +"M. c #5864CC", +"N. c #616BCE", +"B. c #6F76D3", +"V. c #4673E8", +"C. c #5479E2", +"Z. c #567AE3", +"A. c #577BE3", +"S. c #597DE4", +"D. c #597EE7", +"F. c #5C7FE6", +"G. c #804A95", +"H. c #875297", +"J. c #965694", +"K. c #AC72A9", +"L. c #7E8ADD", +"P. c #6082E6", +"I. c #6285E8", +"U. c #6588EA", +"Y. c #688CED", +"T. c #6D8EEC", +/* pixels */ +"< X & T E T Y Y - = % % $ # # @ ", +"5 U I ,.%.$.O.o.X.....| } { [ O ", +"4 P K F D S Z #._ ` / ~ ~ ! ] O ", +"4 1.w.e.9.q.;.B m h g ( ! W ' o ", +"4 t.=.>.0.C 5.V a d s 9 f : ) o ", +"4 y.A 8.6.N 2.k i u e q 7 6 n ", +"3 r.*.:.3.&.@.j t r w 8 c G.B.h.", +"1 <.7.-.4.+.l y 0 v H.M.b.n.D.d.", +"1 L V V z p b J.N.V.m.v.c.x.Z.p.", +"3 J J H K.L.T.Y.U.I.P.F.D.Z.Z.p.", +", > u.l.z.k.h.h.g.d.d.d.p.p.i.i." +}; diff --git a/src/pixmaps/flags_xpm/es.xpm b/src/pixmaps/flags_xpm/es.xpm new file mode 100644 index 00000000..b5295c39 --- /dev/null +++ b/src/pixmaps/flags_xpm/es.xpm @@ -0,0 +1,153 @@ +/* XPM */ +static const char *es[] = { +/* columns rows colors chars-per-pixel */ +"16 11 136 2", +" c #DD0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #ED0000", +"% c #EF0000", +"& c #F10000", +"* c #F30000", +"= c #F50000", +"- c #F70000", +"; c #F90000", +": c #FB0000", +"> c #FD0000", +", c red", +"< c #F10B0B", +"1 c #F10F0E", +"2 c #F21313", +"3 c #F31919", +"4 c #F41E1E", +"5 c #F52323", +"6 c #F62929", +"7 c #F22C2C", +"8 c #F22F2F", +"9 c #F62C2C", +"0 c #F72E2E", +"q c #F23232", +"w c #F73131", +"e c #F33535", +"r c #F83434", +"t c #F83737", +"y c #F43939", +"u c #F53D3D", +"i c #F93A3A", +"p c #F93C3D", +"a c #FA3F3F", +"s c #F64242", +"d c #F74646", +"f c #FA4242", +"g c #FA4444", +"h c #FB4747", +"j c #F74949", +"k c #F74B4B", +"l c #F74E4E", +"z c #FC4C4C", +"x c #EC5351", +"c c #F85050", +"v c #F85353", +"b c #FD5151", +"n c #F95455", +"m c #F95757", +"M c #FD5454", +"N c #F95858", +"B c #FE5959", +"V c #FA5C5C", +"C c #FA5D5D", +"Z c #FE5C5C", +"A c #FE5F5F", +"S c #ED6753", +"D c #EB6957", +"F c #F17E57", +"G c #FB6060", +"H c #FB6162", +"J c #FC6565", +"K c #FC6666", +"L c #FC6969", +"P c #FD6D6D", +"I c #FD7071", +"U c #FE7474", +"Y c #FE7777", +"T c #FE7979", +"R c #FF7B7A", +"E c #FF7B7B", +"W c #DFDF00", +"Q c #E3E300", +"! c #E5E500", +"~ c #E7E700", +"^ c #FBFB00", +"/ c #FDFD00", +"( c #FFFD00", +") c #F2F210", +"_ c #F2F214", +"` c #F3F319", +"' c #F3F31A", +"] c #F4F41F", +"[ c #F4F420", +"{ c #F5F524", +"} c #F5F525", +"| c #F5F426", +" . c #F6F62A", +".. c #F6F62B", +"X. c #F7F72F", +"o. c #E8EE3D", +"O. c #F3F332", +"+. c #F7F730", +"@. c #F7F731", +"#. c #F4F436", +"$. c #F8F836", +"%. c #F4F53B", +"&. c #F5F53F", +"*. c #F9F93C", +"=. c #E08C51", +"-. c #E4A74A", +";. c #EBC94B", +":. c #EBDE53", +">. c #ECE142", +",. c #F0E048", +"<. c #F3F441", +"1. c #F6F544", +"2. c #FAFA42", +"3. c #FBFB47", +"4. c #F8F44B", +"5. c #FBFB49", +"6. c #FCFC4F", +"7. c #F4EE57", +"8. c #F2F355", +"9. c #FDFD53", +"0. c #FEFE58", +"q. c #FEFE59", +"w. c #FEFE5C", +"e. c #FCFC6A", +"r. c #FDFD6F", +"t. c #FEFE73", +"y. c #FEFE76", +"u. c #FEFE79", +"i. c #B6BB9D", +"p. c #F2BDB0", +"a. c #EDE08D", +"s. c #C0CEA8", +"d. c #F5C3B1", +"f. c #ECD3D4", +"g. c #F9F1D6", +"h. c #F5EAE2", +/* pixels */ +", , , , : , : , : - - - & % % # ", +", E E E Y U I P L J G V m b l # ", +", E A Z Z b b z h f p t w 9 k # ", +"( u.w.0.7.:.4.5.2.*.$.@...| 1.~ ", +"( y.0.8.F D a.1.*.$.X...| ] &.~ ", +"^ t.9.d.S f.p.>.$.X...| ] ' %.! ", +"( r.6.g.=.x h.>.X...| ] ' _ #.Q ", +"^ e.5.s.;.-.i.o.X.[ [ ' ) ) O.W ", +": J h a i r 9 6 5 4 3 2 1 < 8 ", +"- H V m m c l d s u y e q 8 7 ", +"& & & % % # # # O O o o " +}; diff --git a/src/pixmaps/flags_xpm/et.xpm b/src/pixmaps/flags_xpm/et.xpm new file mode 100644 index 00000000..d84d1692 --- /dev/null +++ b/src/pixmaps/flags_xpm/et.xpm @@ -0,0 +1,175 @@ +/* XPM */ +static const char *et[] = { +/* columns rows colors chars-per-pixel */ +"16 11 158 2", +" c black", +". c #001300", +"X c #001500", +"o c #001900", +"O c #001B00", +"+ c #002100", +"@ c #002700", +"# c #002D00", +"$ c #003500", +"% c #003900", +"& c #003D00", +"* c #004305", +"= c #00450B", +"- c #004B0F", +"; c #004315", +": c #004D13", +"> c #006500", +", c #005921", +"< c #2C7657", +"1 c #317B5C", +"2 c #377F61", +"3 c #DD0000", +"4 c #DF0000", +"5 c #E10000", +"6 c #E30000", +"7 c #E50000", +"8 c #E70000", +"9 c #E90000", +"0 c #EB0000", +"q c #ED0000", +"w c #EF0000", +"e c #F10000", +"r c #F30000", +"t c #F50000", +"y c #F70000", +"u c #F90000", +"i c #FB0000", +"p c #F10B0B", +"a c #F10F0E", +"s c #F21313", +"d c #F31919", +"f c #F23810", +"g c #F23C14", +"h c #F11E23", +"j c #F22C2C", +"k c #F22F2F", +"l c #F52E31", +"z c #F23232", +"x c #F33535", +"c c #F83434", +"v c #F43939", +"b c #F53D3D", +"n c #F93A3A", +"m c #FA3F3F", +"M c #F34119", +"N c #EF4225", +"B c #F35532", +"V c #F45A3F", +"C c #FA613F", +"Z c #C94259", +"A c #CC465C", +"S c #F64242", +"D c #F74646", +"F c #FA4444", +"G c #F74B4B", +"H c #F85050", +"J c #F95455", +"K c #F95858", +"L c #FA5D5D", +"P c #FB6545", +"I c #FB6949", +"U c #FB6162", +"Y c #FC6666", +"T c #3D8361", +"R c #488E49", +"E c #4C914D", +"W c #519452", +"Q c #52955A", +"! c #428B66", +"~ c #498A6F", +"^ c #4E9370", +"/ c #519572", +"( c #539675", +") c #549476", +"_ c #59967C", +"` c #589878", +"' c #5C9B7C", +"] c #5C987E", +"[ c #619D62", +"{ c #619E7F", +"} c #69A470", +"| c #70A970", +" . c #72AB74", +".. c #76AD77", +"X. c #E3E300", +"o. c #E5E500", +"O. c #E7E700", +"+. c #FDFD00", +"@. c #F2F214", +"#. c #F3F319", +"$. c #F3F31A", +"%. c #F4F41F", +"&. c #F4F420", +"*. c #F5F525", +"=. c #F6F62B", +"-. c #F4F436", +";. c #F4F53B", +":. c #F5F53F", +">. c #FC846A", +",. c #FBFB45", +"<. c #FBFC49", +"1. c #FCFC4B", +"2. c #FCFC4F", +"3. c #FDFC50", +"4. c #FDFD53", +"5. c #FDFD54", +"6. c #FEFE58", +"7. c #FDFD6F", +"8. c #FEFE73", +"9. c #FEFE76", +"0. c #4D968A", +"q. c #5F9A81", +"w. c #52998C", +"e. c #65A182", +"r. c #69A383", +"t. c #6DA586", +"y. c #70A98C", +"u. c #74AB8F", +"i. c #77AD91", +"p. c #7BAB96", +"a. c #79AE94", +"s. c #7BB095", +"d. c #73B8CA", +"f. c #7EBCCB", +"g. c #6BA3D1", +"h. c #77ABD7", +"j. c #6AB3DB", +"k. c #6BB3DE", +"l. c #63B0E2", +"z. c #64B0E2", +"x. c #68B2E3", +"c. c #6EB6E4", +"v. c #77BAE2", +"b. c #71B9E6", +"n. c #77BBE6", +"m. c #7CBEE7", +"M. c #7ABDE8", +"N. c #8FBB8F", +"B. c #B0D588", +"V. c #B0D589", +"C. c #BADB92", +"Z. c #98CAAD", +"A. c #96C9B0", +"S. c #9ACBB2", +"D. c #9ACBB3", +"F. c #86C4D2", +"G. c #85C2DA", +"H. c #90C8D4", +/* pixels */ +", : : : - = * & % $ # @ + O . O ", +"- s.s.a.i.u.y.t.r.e.{ ] ` ( ^ ", +"; p.q.] _ ) / w.0.! T 2 1 < ~ ", +"> N... .| } v.M.n.k.Q W E R [ X ", +"+.9.6.5.4.H.m.C.S.c.f.=.*.&.:.O.", +"+.8.4.2.<.G.C.S.A.B.j.*.%.$.;.O.", +"+.7.2.<.,.F.b.Z.B.l.d.%.$.@.-.X.", +"i >.I P C V h.x.l.g.N M g f B 4 ", +"i Y F m n c l A Z h d s a p k 4 ", +"y U L K J H G D S b v x z k j 4 ", +"y e e q q q 9 9 8 8 5 5 4 3 3 3 " +}; diff --git a/src/pixmaps/flags_xpm/europeanunion.xpm b/src/pixmaps/flags_xpm/europeanunion.xpm new file mode 100644 index 00000000..c35b458e --- /dev/null +++ b/src/pixmaps/flags_xpm/europeanunion.xpm @@ -0,0 +1,153 @@ +/* XPM */ +static const char *europeanunion[] = { +/* columns rows colors chars-per-pixel */ +"16 11 136 2", +" c #333A66", +". c #333B67", +"X c #343B67", +"o c #343B68", +"O c #343C69", +"+ c #353C6B", +"@ c #353C6C", +"# c #353D6C", +"$ c #363D6C", +"% c #363E6D", +"& c #373E6E", +"* c #383F6F", +"= c #394071", +"- c #394172", +"; c #3A4173", +": c #3A4274", +"> c #3B4275", +", c #3C4377", +"< c #3D4477", +"1 c #3D4478", +"2 c #3E4579", +"3 c #3E457A", +"4 c #3F467B", +"5 c #41487F", +"6 c #DBBC3F", +"7 c #E2CD70", +"8 c #E3CE74", +"9 c #E4D078", +"0 c #E4D07A", +"q c #3F4A86", +"w c #3F4B87", +"e c #424982", +"r c #444B85", +"t c #454C86", +"y c #404B89", +"u c #414C8A", +"i c #464D8A", +"p c #474D8A", +"a c #424D8D", +"s c #424E8E", +"d c #434E8E", +"f c #424E8F", +"g c #474F8D", +"h c #484F8D", +"j c #434F90", +"k c #444F91", +"l c #445091", +"z c #445191", +"x c #455293", +"c c #465396", +"v c #465397", +"b c #4A5190", +"n c #4B5293", +"m c #4C5394", +"M c #4D5495", +"N c #4E5596", +"B c #465398", +"V c #475399", +"C c #475499", +"Z c #49559B", +"A c #4F5598", +"S c #4F5599", +"D c #4F5699", +"F c #49559C", +"G c #49559D", +"H c #49569D", +"J c #50569B", +"K c #757788", +"L c #75788B", +"P c #75798B", +"I c #797C92", +"U c #7A7D95", +"Y c #4956A0", +"T c #4957A0", +"R c #4957A1", +"E c #4A56A1", +"W c #4B57A1", +"Q c #4B5AA0", +"! c #4B5AA1", +"~ c #4B59A3", +"^ c #4B5BA2", +"/ c #4B5AA3", +"( c #4C5BA2", +") c #4C5BA3", +"_ c #4C5BA5", +"` c #4D5BA6", +"' c #4D5BA7", +"] c #4E5DA5", +"[ c #4C5CA7", +"{ c #4D5CA7", +"} c #4E5EA6", +"| c #4D5CA8", +" . c #4D5DA8", +".. c #4D5CA9", +"X. c #4E5DAA", +"o. c #4E5DAB", +"O. c #4F5FAC", +"+. c #505FAF", +"@. c #4F60A8", +"#. c #5161AA", +"$. c #5362AD", +"%. c #5060AF", +"&. c #5364AC", +"*. c #5364AD", +"=. c #5364AF", +"-. c #5161B0", +";. c #5262B2", +":. c #5262B3", +">. c #5666B1", +",. c #5667B1", +"<. c #5363B4", +"1. c #5464B5", +"2. c #5464B7", +"3. c #5769B2", +"4. c #5768B5", +"5. c #5969B4", +"6. c #596BB5", +"7. c #5464B8", +"8. c #5564BA", +"9. c #5666BB", +"0. c #5767BC", +"q. c #5767BE", +"w. c #5B6DB9", +"e. c #5C6FB9", +"r. c #5E71BC", +"t. c #5E72BD", +"y. c #6175C0", +"u. c #6175C5", +"i. c #6377C4", +"p. c #6378C4", +"a. c #647AC6", +"s. c #657BC9", +"d. c #677CCB", +"f. c #677DCB", +"g. c #7D809A", +"h. c #7F84A1", +/* pixels */ +"D J D M m b h p t e 5 4 < : = % ", +"D u.s.s.a.p.y.r.r.3.1.*.@.} c * ", +"M f.q.q.8.1.%.g.9 U H c l d ^ % ", +"n d.8.8.1.<.0 o.[ H 0 c j d ( % ", +"b a.8.1.1.h.%.o._ W H L j d ^ % ", +"h p.1.-.-.0 o.o.~ H B 6 j d ^ + ", +"p y.%.-.-.U o._ W G B K j w ^ + ", +"r t.o.o.o.[ 8 W H B 8 j d q W . ", +"e w._ _ } ( H I 7 K z d u q H % ", +"e $.6.3.3.3.1.%.&.+.@.( ^ W z . ", +"5 2 4 4 < 4 , , : : * % % X X . " +}; diff --git a/src/pixmaps/flags_xpm/fam.xpm b/src/pixmaps/flags_xpm/fam.xpm new file mode 100644 index 00000000..e60f37bc --- /dev/null +++ b/src/pixmaps/flags_xpm/fam.xpm @@ -0,0 +1,176 @@ +/* XPM */ +static const char *fam[] = { +/* columns rows colors chars-per-pixel */ +"16 11 159 2", +" c #E30000", +". c #E50000", +"X c #E70000", +"o c #E90000", +"O c #EB0000", +"+ c #ED0000", +"@ c #F70011", +"# c #F90017", +"$ c #FB001F", +"% c #FD0025", +"& c #FD0029", +"* c #FD002F", +"= c #F32267", +"- c #F4276B", +"; c #F4286B", +": c #F52C6E", +"> c #F52D6F", +", c #F72E6F", +"< c #F63172", +"1 c #F63273", +"2 c #F63373", +"3 c #F73777", +"4 c #F83473", +"5 c #F73877", +"6 c #F93B77", +"7 c #F73978", +"8 c #F83C7A", +"9 c #F83D7B", +"0 c #F83E7B", +"q c #F83F7C", +"w c #F4417C", +"e c #F5457F", +"r c #FA407C", +"t c #F9427E", +"y c #F9437F", +"u c #53C900", +"i c #63D100", +"p c #67D300", +"a c #69D300", +"s c #69D500", +"d c #69D700", +"f c #6DD700", +"g c #71D900", +"h c #75DB00", +"j c #7FE100", +"k c #8FE500", +"l c #95EB00", +"z c #99EF00", +"x c #9DEF00", +"c c #A1ED00", +"v c #A1F100", +"b c #A3F300", +"n c #BFF14B", +"m c #C1F14E", +"M c #C1F24F", +"N c #C2F251", +"B c #C3F252", +"V c #C3F253", +"C c #C5F356", +"Z c #C6F356", +"A c #C6F357", +"S c #C7F45A", +"D c #C8F45A", +"F c #C8F45C", +"G c #C9F55E", +"H c #CAF55F", +"J c #C8F263", +"K c #CAF560", +"L c #CBF663", +"P c #C8F265", +"I c #CCF664", +"U c #CCF665", +"Y c #C9F268", +"T c #C9F368", +"R c #CAF36A", +"E c #CBF46B", +"W c #CDF768", +"Q c #CEF769", +"! c #CDF56F", +"~ c #CFF86E", +"^ c #CFF573", +"/ c #D1F676", +"( c #D3F77A", +") c #D4F77E", +"_ c #F94480", +"` c #FB4680", +"' c #F64982", +"] c #F74B82", +"[ c #F74E85", +"{ c #FA4883", +"} c #FA4983", +"| c #FA4984", +" . c #FC4B84", +".. c #FB4D87", +"X. c #FB4E87", +"o. c #FB4F88", +"O. c #FD5188", +"+. c #FC538A", +"@. c #FC538B", +"#. c #F8568C", +"$. c #FD588E", +"%. c #FD5C91", +"&. c #FB6798", +"*. c #FC6B9B", +"=. c #FC6F9E", +"-. c #FD74A0", +";. c #FD77A3", +":. c #FE7AA5", +">. c #00A7EF", +",. c #00ABE9", +"<. c #00A9F1", +"1. c #00ADF3", +"2. c #00B1F5", +"3. c #00B3F7", +"4. c #00B5F9", +"5. c #00B9FB", +"6. c #00BBFD", +"7. c #00BFFD", +"8. c #00C5F3", +"9. c #00C1FD", +"0. c #00C3FF", +"q. c #3BD8F9", +"w. c #46D7FA", +"e. c #41DAFA", +"r. c #47DCFB", +"t. c #4CD8FA", +"y. c #4CD9FB", +"u. c #4CDDFC", +"i. c #51D9FB", +"p. c #51DAFB", +"a. c #55DDF9", +"s. c #56DBFC", +"d. c #52DFFD", +"f. c #56DCFC", +"g. c #5FDCF9", +"h. c #5BDCFD", +"j. c #5BDDFD", +"k. c #5FDDFE", +"l. c #5EDEFE", +"z. c #64DDFA", +"x. c #63DFFE", +"c. c #68DEFB", +"v. c #6DDFFC", +"b. c #56E0FD", +"n. c #5BE2FE", +"m. c #63E0FE", +"M. c #66E0FE", +"N. c #71E1FC", +"B. c #75E2FD", +"V. c #78E2FE", +"C. c #7BE4FE", +"Z. c #7FE5FE", +"A. c #7FE6FE", +"S. c #79E8FE", +"D. c #D6F881", +"F. c #D8F985", +"G. c #D8FA89", +"H. c #80E6FF", +"J. c #81E6FF", +/* pixels */ +"0.0.0.0.8.* & % $ # @ b c v x z ", +"0.J.J.A.S.:.;.-.=.*.&.G.F.D.) l ", +"0.A.M.m.n.%.+.+.+.| _ ! Q U ( k ", +"0.A.x.l.f.$. .X.` ` q W U K / j ", +"0.C.l.j.d.+.` { t q 7 K H H ^ h ", +"6.C.j.f.u...t t q 7 2 H D A ! g ", +"6.B.s.i.r.` 6 9 5 2 > S A N E f ", +"5.N.i.t.e.t 2 7 2 > ; A N N P s ", +"4.N.t.w.q.8 > 2 : - = N n n P p ", +"3.z.z.g.f.#.' [ ' e w R R P P s ", +"3.1.<.>.,.+ O O X X d a p i u " +}; diff --git a/src/pixmaps/flags_xpm/fi.xpm b/src/pixmaps/flags_xpm/fi.xpm new file mode 100644 index 00000000..b5bfcee6 --- /dev/null +++ b/src/pixmaps/flags_xpm/fi.xpm @@ -0,0 +1,143 @@ +/* XPM */ +static const char *fi[] = { +/* columns rows colors chars-per-pixel */ +"16 11 126 2", +" c #000085", +". c #000087", +"X c #00008F", +"o c #000099", +"O c #00009B", +"+ c #00009F", +"@ c #0029B9", +"# c #0029BB", +"$ c #002BBD", +"% c #002FBD", +"& c #0035BD", +"* c #0033C1", +"= c #3063C9", +"- c #3265CB", +"; c #3567CA", +": c #376ACC", +"> c #3A6BCC", +", c #3A6CCD", +"< c #3D6DCE", +"1 c #3F6FCE", +"2 c #406FCF", +"3 c #4172D0", +"4 c #4473D0", +"5 c #4473D1", +"6 c #4574D1", +"7 c #4776D2", +"8 c #4977D2", +"9 c #4A78D3", +"0 c #4E7AD0", +"q c #4D7AD3", +"w c #4C7AD4", +"e c #4F7BD5", +"r c #4F7CD5", +"t c #507CD2", +"y c #517DD5", +"u c #537FD6", +"i c #5680D4", +"p c #5480D7", +"a c #5580D7", +"s c #5581D7", +"d c #5983D7", +"f c #5984D9", +"g c #5A85D9", +"h c #5E86D8", +"j c #5E88DA", +"k c #5F88DB", +"l c #628AD8", +"z c #6089DA", +"x c #668DDA", +"c c #628BDC", +"v c #638BDC", +"b c #638CDC", +"n c #648CDC", +"m c #658EDD", +"M c #668EDE", +"N c #678FDE", +"B c #6990DD", +"V c #6B91DE", +"C c #6C93DF", +"Z c #A7B1C1", +"A c #B5BDCD", +"S c #B7BFCD", +"D c #B7BFD7", +"F c #80A1E3", +"G c #80A2E2", +"H c #81A3E3", +"J c #83A4E3", +"K c #85A5E5", +"L c #87A7E5", +"P c #B9C1CF", +"I c #BBC3D1", +"U c #B9C1D3", +"Y c #BFC3D3", +"T c #BFC7D5", +"R c #C1C9D7", +"E c #C3C9D7", +"W c #C1CBD9", +"Q c #C7CFDB", +"! c #CDD3DD", +"~ c #D1D7E3", +"^ c #D3D9E5", +"/ c #D7DBE7", +"( c #D5DBED", +") c #D9DDE9", +"_ c #DBDFEB", +"` c #DBDFEF", +"' c #DDE1EB", +"] c #DBE1ED", +"[ c #DDE3ED", +"{ c #DFE3ED", +"} c #E3E9F3", +"| c #E5EBF3", +" . c #E7EBF3", +".. c #E5EBF5", +"X. c #F1F1F1", +"o. c #F1F1F2", +"O. c gray95", +"+. c #F2F2F3", +"@. c #F3F3F3", +"#. c #F3F3F4", +"$. c #F4F4F4", +"%. c #F4F4F5", +"&. c #F4F5F5", +"*. c gray96", +"=. c #F4F5F6", +"-. c #F5F5F6", +";. c #F5F6F7", +":. c #F6F6F6", +">. c gray97", +",. c #F6F7F8", +"<. c #F7F8F9", +"1. c #F6F8FA", +"2. c #F7F9FA", +"3. c #F8F8F8", +"4. c #F9F9F9", +"5. c #F8F9FA", +"6. c #F9FAFA", +"7. c gray98", +"8. c #FBFBFB", +"9. c #F9FBFC", +"0. c #FBFCFD", +"q. c gray99", +"w. c #FDFDFD", +"e. c #FCFDFE", +"r. c #FEFEFE", +"t. c gray100", +/* pixels */ +"| | | ..% @ & ` { [ _ _ / ^ ~ R ", +"| t.t.t.L K C t.8.t.8.8.3.3.;.! ", +"| t.t.t.B m n e.8.8.8.;.3.;.3.Q ", +"} e.0.8.m n k 8.<.,.;.;.$.@.;.R ", +"* L C B c k f d y e 9 3 2 > i X ", +"$ H m l k f s y e 7 3 1 : - t . ", +"@ C C l f p r q 8 3 1 > ; = 0 . ", +"` 0.8.8.p r 9 ,.;.-.+.O.O.O.O.I ", +"{ 8.7.7.t 8 6 ;.-.@.@.O.O.X.O.S ", +"' 7.7.4.x z z 3.;.;.@.@.O.O.O.S ", +"_ / ^ ~ + O O D E R Y P S S A Z " +}; diff --git a/src/pixmaps/flags_xpm/fj.xpm b/src/pixmaps/flags_xpm/fj.xpm new file mode 100644 index 00000000..62f37094 --- /dev/null +++ b/src/pixmaps/flags_xpm/fj.xpm @@ -0,0 +1,181 @@ +/* XPM */ +static const char *fj[] = { +/* columns rows colors chars-per-pixel */ +"16 11 164 2", +" c #7F133B", +". c #000059", +"X c #00006B", +"o c #311D6F", +"O c #67194B", +"+ c #89193D", +"@ c #CF1919", +"# c #CF3A37", +"$ c #D23B39", +"% c #D13F3C", +"& c #832349", +"* c #B86070", +"= c #B7697F", +"- c #BC6D7A", +"; c #D54845", +": c #D54846", +"> c #CF5354", +", c #D35C5D", +"< c #CC6066", +"1 c #CE656A", +"2 c #CD6A70", +"3 c #CF6F74", +"4 c #C56D7B", +"5 c #D87479", +"6 c #E36B69", +"7 c #E57472", +"8 c #E0787A", +"9 c #E97C7A", +"0 c #E5B050", +"q c #E6B053", +"w c #E7B459", +"e c #E8B559", +"r c #69558F", +"t c #7D7FB7", +"y c #0027DD", +"u c #0029DD", +"i c #0029DF", +"p c #002DDF", +"a c #002FDF", +"s c #002FE1", +"d c #0031E3", +"f c #0035E3", +"g c #0037E5", +"h c #003BE5", +"j c #003DE7", +"k c #0041E7", +"l c #0043E9", +"z c #0047E9", +"x c #0049EB", +"c c #004DEB", +"v c #004DED", +"b c #0055ED", +"n c #0055EF", +"m c #0059EF", +"M c #005FF1", +"N c #005BFB", +"B c #0063F1", +"V c #0065F3", +"C c #0069F5", +"Z c #006FF7", +"A c #0071F7", +"S c #0075F9", +"D c #0077F9", +"F c #007BFB", +"G c #5178C5", +"H c #816795", +"J c #9A7A9C", +"K c #AC7B95", +"L c #C07C8D", +"P c #C37C8C", +"I c #0081FD", +"U c #5E85CE", +"Y c #789DD9", +"T c #549EF8", +"R c #42A0F3", +"E c #46A1F4", +"W c #4DA1F5", +"Q c #4CA4F5", +"! c #4DA7F6", +"~ c #50A5F2", +"^ c #53A7F2", +"/ c #54A7F2", +"( c #52A4F6", +") c #56A6F7", +"_ c #57A7F7", +"` c #55A8F3", +"' c #52A9F6", +"] c #52AAF7", +"[ c #57A8F7", +"{ c #57ACF7", +"} c #59AAF3", +"| c #5CADF4", +" . c #59A1F9", +".. c #5EA4FA", +"X. c #5BA9F8", +"o. c #5BAAF8", +"O. c #5CAAF8", +"+. c #5AADF8", +"@. c #5CAFF8", +"#. c #5BB1F9", +"$. c #60AEF5", +"%. c #63A7FB", +"&. c #60ACF9", +"*. c #60ADF9", +"=. c #64AFFA", +"-. c #65AFFA", +";. c #64B0F6", +":. c #68B3F7", +">. c #6AB4F7", +",. c #6BB5F7", +"<. c #6EB7F7", +"1. c #60B1F9", +"2. c #65B0FA", +"3. c #63B4FA", +"4. c #69B1FA", +"5. c #69B2FB", +"6. c #6DB4FB", +"7. c #6DB5FB", +"8. c #6FB8F8", +"9. c #71B7FC", +"0. c #72B9F8", +"q. c #73B9F9", +"w. c #76BCF9", +"e. c #77BCF9", +"r. c #7ABEFA", +"t. c #7EC0FB", +"y. c #7FC0FB", +"u. c #9A83A8", +"i. c #D7888E", +"p. c #E28182", +"a. c #E38687", +"s. c #EB8583", +"d. c #E79495", +"f. c #D9A1AA", +"g. c #D9A7AF", +"h. c #DAABB4", +"j. c #F1A6A4", +"k. c #F1A9A7", +"l. c #E4B7BE", +"z. c #9393C0", +"x. c #9295C3", +"c. c #979AC2", +"v. c #9FA4CB", +"b. c #99A7D3", +"n. c #A6AFD5", +"m. c #87BEF1", +"M. c #80B8FC", +"N. c #DAB9C4", +"B. c #E5BFC6", +"V. c #E6BFC6", +"C. c #8CC2F2", +"Z. c #84C0FC", +"A. c #88C3FC", +"S. c #8BC4FD", +"D. c #E9CFD4", +"F. c #C7DFF4", +"G. c #C9DFF3", +"H. c #E2D6E0", +"J. c #CDE2F5", +"K. c #CCE3F6", +"L. c #E7EDF2", +"P. c #EAEEF3", +"I. c #EAEFF3", +"U. c #EDF1F5", +/* pixels */ +"4 H X + . O K n Z A C V B M n ", +"o V.H.h.f.N.D.v.M.m.r.r.r.q.7.x ", +"@ d.s.7 6 9 8 5 %.2.1.@.{ ' >.z ", +"& l.j.p.a.k.i.K %.@.1 , w > 3 k ", +"r V.u.P P c.g.J .+.< e q 0 2 j ", +"t b.U x.x.G Y n.T ' J.U.; P.J.g ", +"I S.9.7.5.-.&.O.{ ! * ; $ % - d ", +"F Z.7.5.-.$.o._ ( Q F.P.% L.G.a ", +"D Z.5.-.&.O._ ( W E R C.# m./ i ", +"Z y.r.e.q.8.,.2.=.$.| } / ^ ^ y ", +"C V M m b v z l j h f a a y y y " +}; diff --git a/src/pixmaps/flags_xpm/fk.xpm b/src/pixmaps/flags_xpm/fk.xpm new file mode 100644 index 00000000..333ba6f7 --- /dev/null +++ b/src/pixmaps/flags_xpm/fk.xpm @@ -0,0 +1,185 @@ +/* XPM */ +static const char *fk[] = { +/* columns rows colors chars-per-pixel */ +"16 11 168 2", +" c #000003", +". c #000007", +"X c #000009", +"o c #00000F", +"O c #000013", +"+ c #000017", +"@ c #000019", +"# c #00001D", +"$ c #00001F", +"% c #000021", +"& c #000025", +"* c #00002B", +"= c #00002D", +"- c #00002F", +"; c #000033", +": c #000039", +"> c #00003F", +", c #000045", +"< c #000049", +"1 c #00004B", +"2 c #00004F", +"3 c #000053", +"4 c #000057", +"5 c #000059", +"6 c #00005B", +"7 c #00005D", +"8 c #000061", +"9 c #000065", +"0 c #000069", +"q c #00037D", +"w c #793165", +"e c #726967", +"r c #746C6E", +"t c #7D726D", +"y c #FD1315", +"u c #9D1F45", +"i c #A31F43", +"p c #81295B", +"a c #A52D51", +"s c #827873", +"d c #807875", +"f c #807A78", +"g c #CD6375", +"h c #DF717B", +"j c #FE6867", +"k c #F06C70", +"l c #FE7270", +"z c #FD7875", +"x c #F97678", +"c c #FB7B7D", +"v c #FE807D", +"b c #001D93", +"n c #213B8F", +"m c #3B3383", +"M c #233B91", +"N c #2A3C91", +"B c #2C4393", +"V c #294294", +"C c #2A4294", +"Z c #2F4696", +"A c #2E4797", +"S c #2F4797", +"D c #2F4998", +"F c #314497", +"G c #364796", +"H c #364B91", +"J c #324A95", +"K c #3C4C96", +"L c #364B9A", +"P c #344C9A", +"I c #344C9B", +"U c #35499C", +"Y c #3B4C98", +"T c #3B4D9C", +"R c #3C4F9D", +"E c #3C5094", +"W c #3D539A", +"Q c #3A519D", +"! c #3A519E", +"~ c #3D549D", +"^ c #3F53A0", +"/ c #3F55A1", +"( c #3A78B8", +") c #3D7AB9", +"_ c #40529C", +"` c #42579F", +"' c #44569E", +"] c #7A7985", +"[ c #4056A0", +"{ c #4056A1", +"} c #4257A2", +"| c #465CA2", +" . c #445AA4", +".. c #455AA4", +"X. c #4659A7", +"o. c #455AA6", +"O. c #4959A0", +"+. c #495DA2", +"@. c #495FA7", +"#. c #495FA8", +"$. c #525EA1", +"%. c #4B60A5", +"&. c #4E63A8", +"*. c #4F63A9", +"=. c #5063A8", +"-. c #5467A9", +";. c #5468AA", +":. c #5A6BAB", +">. c #586CAD", +",. c #5C6EAE", +"<. c #4675A9", +"1. c #536AB2", +"2. c #5D70B0", +"3. c #7377AF", +"4. c #6173B0", +"5. c #6174B3", +"6. c #6577B3", +"7. c #6678B4", +"8. c #6B7AB6", +"9. c #687CB6", +"0. c #6A7CB7", +"q. c #6F7FB9", +"w. c #8D6B98", +"e. c #92719C", +"r. c #BC7C96", +"t. c #8779A7", +"y. c #4F80B0", +"u. c #5384B3", +"i. c #7AA8B6", +"p. c #4587D1", +"a. c #458FDC", +"s. c #4C90D8", +"d. c #5E95D1", +"f. c #5893D7", +"g. c #5897DB", +"h. c #4D95E0", +"j. c #5499E2", +"k. c #559AE3", +"l. c #928E91", +"z. c #969190", +"x. c #989191", +"c. c #9F9E9D", +"v. c #908BB7", +"b. c #A381A4", +"n. c #A483A6", +"m. c #A496B9", +"M. c #85ABB1", +"N. c #D48797", +"B. c #D78998", +"V. c #EB878D", +"C. c #FA8586", +"Z. c #FC9394", +"A. c #FE9F9C", +"S. c #FDA19E", +"D. c #E7A1A9", +"F. c #E9AEB6", +"G. c #E8B2B7", +"H. c #F2B8BE", +"J. c #9FADD3", +"K. c #9BAED5", +"L. c #E2B9C2", +"P. c #F0BFC4", +"I. c #B4CAD5", +"U. c #BCD7E8", +"Y. c #EEC6CB", +"T. c #EFD3D8", +"R. c #C0D9E8", +"E. c #E6D8E2", +/* pixels */ +"h t.b i i b p g 0 6 4 2 < , > , ", +"m P.E.F.D.L.Y.J.8.6.4.,.:.-.=.- ", +"y Z.v l j x x k $.} f.g.s.p.+.* ", +"a H.A.c C.A.V.N.' R k.R.U.a.' & ", +"3.Y.m.B.N.K.H.n.{ I h.i.M.) _ $ ", +"w v.1.e.w...u.e.K D k.I.c.) Y @ ", +"9 q.*.#.../ T I D N d.x.f <.G O ", +"8 0.@...} ! I S C x.x.u.<.r ] o ", +"7 7.../ Q P D V M M d d t e A . ", +"3 5.2.>.;.=.@.| ' ~ W K H H B ", +"6 < , > : ; - % % $ + O o X . O " +}; diff --git a/src/pixmaps/flags_xpm/fm.xpm b/src/pixmaps/flags_xpm/fm.xpm new file mode 100644 index 00000000..c61173f0 --- /dev/null +++ b/src/pixmaps/flags_xpm/fm.xpm @@ -0,0 +1,156 @@ +/* XPM */ +static const char *fm[] = { +/* columns rows colors chars-per-pixel */ +"16 11 139 2", +" c #001F7D", +". c #002181", +"X c #002581", +"o c #002783", +"O c #002985", +"+ c #002B85", +"@ c #002D89", +"# c #002F89", +"$ c #00338B", +"% c #00358D", +"& c #00398F", +"* c #003B93", +"= c #003D93", +"- c #004197", +"; c #00479B", +": c #004D9F", +"> c #0353A3", +", c #0B59A5", +"< c #115DA9", +"1 c #1963AD", +"2 c #1F69B1", +"3 c #256DB3", +"4 c #276FB5", +"5 c #2B73B5", +"6 c #2D73B5", +"7 c #3175B9", +"8 c #3377B9", +"9 c #3579BB", +"0 c #397BBD", +"q c #3B7DBD", +"w c #3D7DBF", +"e c #3F7FBF", +"r c #417FBF", +"t c #4181BF", +"y c #6795C2", +"u c #6A97C4", +"i c #6C99C6", +"p c #6E99C6", +"a c #6E9AC6", +"s c #6F9BC7", +"d c #6F9BC8", +"f c #709CC7", +"g c #709CC8", +"h c #729DC9", +"j c #759FCA", +"k c #77A1CB", +"l c #7BA2CA", +"z c #7CA4CA", +"x c #7DA4CB", +"c c #78A1CC", +"v c #7AA2CC", +"b c #7AA4CD", +"n c #7FA5CC", +"m c #7FA6CC", +"M c #7CA5CE", +"N c #7EA6CE", +"B c #7EA7CF", +"V c #82A8CD", +"C c #84A9CF", +"Z c #85AACF", +"A c #85ABCF", +"S c #80A8D0", +"D c #81A9D0", +"F c #82A9D0", +"G c #82A9D1", +"H c #83A9D1", +"J c #81AAD1", +"K c #83ABD2", +"L c #84ABD2", +"P c #85ACD2", +"I c #86ADD2", +"U c #86ACD3", +"Y c #87ADD3", +"T c #89ADD2", +"R c #8CAFD3", +"E c #88ADD4", +"W c #88AED4", +"Q c #89AFD5", +"! c #8AAED4", +"~ c #8AAFD4", +"^ c #8FB1D4", +"/ c #8FB2D5", +"( c #8EB1D6", +") c #8EB2D6", +"_ c #91B4D7", +"` c #93B4D7", +"' c #95B6D7", +"] c #91B4D8", +"[ c #90B5D8", +"{ c #91B5D8", +"} c #92B6D9", +"| c #92B7D9", +" . c #96B7D8", +".. c #95B7DA", +"X. c #97B9DB", +"o. c #97BADB", +"O. c #98B8D8", +"+. c #99B9D9", +"@. c #99B9DA", +"#. c #98BADB", +"$. c #9BBBDB", +"%. c #9CBCDB", +"&. c #9ABCDC", +"*. c #9BBCDD", +"=. c #9EBEDD", +"-. c #9FBEDD", +";. c #9DBDDE", +":. c #9DBEDE", +">. c #9FBFDF", +",. c #A0BFDD", +"<. c #A5C0DB", +"1. c #A3C0DE", +"2. c #A6C1DC", +"3. c #A5C2DF", +"4. c #A8C2DB", +"5. c #ADC6DD", +"6. c #AEC7DF", +"7. c #A5C3E0", +"8. c #A8C4E0", +"9. c #A8C4E1", +"0. c #AAC6E2", +"q. c #ABC7E2", +"w. c #ADC8E3", +"e. c #AEC8E4", +"r. c #AEC9E4", +"t. c #B1C9E0", +"y. c #B0CAE4", +"u. c #B5CCE4", +"i. c #B9CFE4", +"p. c #B8CEE6", +"a. c #B9D0E6", +"s. c #BAD0E6", +"d. c #BFD2E5", +"f. c #BDD3E7", +"g. c #BFD4E9", +"h. c gray96", +"j. c #F6F6F6", +"k. c #FBFBFB", +"l. c gray99", +/* pixels */ +"t t t t t q 9 7 5 3 3 1 , , > : ", +"t y.y.r.w.q.9.a.u.,.>.#.#.' ` ; ", +"t r.>.>.*.X.[ k.k.W W K K B _ = ", +"r w.>.#.X.} [ 3.3.W K B M v R * ", +"w w.&.X.g.f._ R P P t.5.j j R $ ", +"0 0.X.} l.k.u.P L d.j.h.h h Z # ", +"8 0..._ p.p.R K B B 5.2.p p V + ", +"6 7._ ( Q K K ' ' k h d p u B o ", +"4 ,.( R L L l j.h.p f p u y n ", +"3 ,.%.#.' _ ( 2.2.A Z V n z l ", +"1 < , > : ; - = & $ @ O o . " +}; diff --git a/src/pixmaps/flags_xpm/fo.xpm b/src/pixmaps/flags_xpm/fo.xpm new file mode 100644 index 00000000..a0ca68a5 --- /dev/null +++ b/src/pixmaps/flags_xpm/fo.xpm @@ -0,0 +1,121 @@ +/* XPM */ +static const char *fo[] = { +/* columns rows colors chars-per-pixel */ +"16 11 104 2", +" c #B30000", +". c #BF0000", +"X c #D90000", +"o c #DB0000", +"O c #DB311A", +"+ c #DD361F", +"@ c #DE3B25", +"# c #E0402B", +"$ c #E24530", +"% c #E34934", +"& c #E34A36", +"* c #E04F3B", +"= c #E54E3A", +"- c #E54F3B", +"; c #E65440", +": c #E75946", +"> c #E85D4B", +", c #E95E4B", +"< c #E9624F", +"1 c #E66150", +"2 c #E96351", +"3 c #EA6553", +"4 c #EB6754", +"5 c #EE8173", +"6 c #EF8274", +"7 c #0000B1", +"8 c #0000B5", +"9 c #0000BD", +"0 c #0000C3", +"q c #0003D7", +"w c #0007D9", +"e c #000FDB", +"r c #0011DB", +"t c #144CDA", +"y c #1950DB", +"u c #1F55DD", +"i c #2055DD", +"p c #2459DE", +"a c #2559DE", +"s c #3665DE", +"d c #2A5EE0", +"f c #2B5EE0", +"g c #2E60E2", +"h c #2F62E2", +"j c #3063E2", +"k c #3465E3", +"l c #3566E3", +"z c #3667E3", +"x c #3F6DE1", +"c c #3A69E4", +"v c #3B6BE5", +"b c #406EE5", +"n c #4170E6", +"m c #4572E7", +"M c #4B76E5", +"N c #4674E8", +"B c #4977E8", +"V c #4B77E9", +"C c #4F7AE9", +"Z c #547DE7", +"A c #507BE9", +"S c #517BE9", +"D c #547EEA", +"F c #547FEA", +"G c #5882EC", +"H c #5982EC", +"J c #6F93ED", +"K c #7094EE", +"L c #7698EF", +"P c #7799F0", +"I c #CDCDCD", +"U c #D1CFCF", +"Y c gray82", +"T c LightGray", +"R c #D5D5D5", +"E c #D7D7D7", +"W c gray85", +"Q c gray86", +"! c #DDDDDD", +"~ c #E1E1E1", +"^ c gray89", +"/ c gray90", +"( c #E7E7E7", +") c #E9E9E9", +"_ c gray92", +"` c gray93", +"' c #EFEFEF", +"] c #F1F1F1", +"[ c gray95", +"{ c #F2F2F3", +"} c #F3F3F3", +"| c #F4F4F4", +" . c gray96", +".. c #F6F6F6", +"X. c gray97", +"o. c #F8F8F8", +"O. c #F9F9F9", +"+. c gray98", +"@. c #FBFBFB", +"#. c #F9FEFE", +"$. c gray99", +"%. c #FDFDFD", +"&. c #FEFEFE", +"*. c gray100", +/* pixels */ +"} } } } r o w ' ` ` _ _ / / ^ ~ ", +"} *.*.*.P 6 K *.@.@.@.@.@.X.X.! ", +"} *.*.*.G 4 C *.@.@.X.X.X.X.X.Q ", +"} @.*.#.D 2 B $.@.@.X.X.X.| X.W ", +"e L G D A , N b v v k a p u s 8 ", +"X 5 3 < , : ; - & # # @ + O - ", +"q J C B m ; v k h g a u y t s 7 ", +"' @.@.@.x - k o. . .| } ] } | T ", +"` @.o.@.c % g X. .| } ] ] ] ] I ", +"_ @.@.@.Z 1 M X.X. .| | ] } } I ", +") / / ^ 0 . 9 W E R T Y U I I I " +}; diff --git a/src/pixmaps/flags_xpm/fr.xpm b/src/pixmaps/flags_xpm/fr.xpm new file mode 100644 index 00000000..3d840624 --- /dev/null +++ b/src/pixmaps/flags_xpm/fr.xpm @@ -0,0 +1,146 @@ +/* XPM */ +static const char *fr[] = { +/* columns rows colors chars-per-pixel */ +"16 11 129 2", +" c #C50000", +". c #C70000", +"X c #CB0000", +"o c #CD0000", +"O c #D30000", +"+ c #D50000", +"@ c #DB0000", +"# c #DD0000", +"$ c #E10000", +"% c #E50000", +"& c #E70000", +"* c #EB0000", +"= c #EF0700", +"- c #F11300", +"; c #E64D3E", +": c #E85243", +"> c #E95648", +", c #EA5748", +"< c #EA574A", +"1 c #EB5D4F", +"2 c #EC5E50", +"3 c #E86355", +"4 c #EE6355", +"5 c #EE6456", +"6 c #EE6457", +"7 c #E96659", +"8 c #E9665A", +"9 c #EA695D", +"0 c #EA6A5D", +"q c #EF695C", +"w c #F06A5C", +"e c #F06C5D", +"r c #EC6D61", +"t c #EC6E62", +"y c #ED7468", +"u c #EF786C", +"i c #F17063", +"p c #F17064", +"a c #F27164", +"s c #F3776A", +"d c #F3776B", +"f c #F17E72", +"g c #F57D72", +"h c #F28478", +"j c #F4887E", +"k c #1747A5", +"l c #234FAB", +"z c #2D57AF", +"x c #355FB5", +"c c #3F67B9", +"v c #4971BD", +"b c #5377C3", +"n c #5B7FC7", +"m c #6385CB", +"M c #6989CD", +"N c #6F8FD1", +"B c #7191D1", +"V c #7393D3", +"C c #7395D3", +"Z c #9F9F9F", +"A c #A7A7A7", +"S c gray68", +"D c #B3B0B0", +"F c gray72", +"G c gray", +"H c #F58D83", +"J c #F79389", +"K c #F8978E", +"L c #97ACD8", +"P c #9CB0DA", +"I c #A0B4DD", +"U c #A0B5DD", +"Y c #A1B5DD", +"T c #A3B5DC", +"R c #A7B9DD", +"E c #A5B8DF", +"W c #A5B9DF", +"Q c #A6B9E0", +"! c #A9BCE1", +"~ c #A9BDE1", +"^ c #AABDE0", +"/ c #AABDE1", +"( c #AFBFE2", +") c #AEBFE3", +"_ c #AEBFE4", +"` c #AEC0E4", +"' c #B1C2E5", +"] c #B1C3E5", +"[ c #B3C3E4", +"{ c #B2C3E5", +"} c #B4C5E7", +"| c #B7C7E6", +" . c #B7C8E8", +".. c #BAC9E8", +"X. c #BECCE9", +"o. c #CECECE", +"O. c gray81", +"+. c #D2D2D2", +"@. c #D5D5D5", +"#. c gainsboro", +"$. c #DFDFDF", +"%. c #C0CEEA", +"&. c #C1CFEB", +"*. c #C3D0EC", +"=. c #C3D1EC", +"-. c #C4D2ED", +";. c #C4D3ED", +":. c #E2E2E2", +">. c #E4E4E4", +",. c gray90", +"<. c #E6E6E6", +"1. c #E7E7E7", +"2. c gray91", +"3. c #E9E9E9", +"4. c #E9E9EA", +"5. c #EAEAEA", +"6. c gray92", +"7. c #ECEBEB", +"8. c #ECECEC", +"9. c gray93", +"0. c #EEEEEE", +"q. c #EFEFEF", +"w. c gray94", +"e. c #F1F1F1", +"r. c #F3F3F3", +"t. c #F4F4F4", +"y. c #F6F6F6", +"u. c gray97", +"i. c #F8F8F8", +/* pixels */ +"C C C C V $.#.@.+.o.O.- = * * % ", +"C ;.;.=.%.i.u.u.u.t.e.K J H j # ", +"V ;. .} ] 0.8.6.2.6.1.g d a h # ", +"V =.} ] _ 0.6.8.6.2.,.s a e f # ", +"N %.] _ ^ 0.0.6.6.2.1.i q 6 u + ", +"M X.) ^ Q e.0.0.6.6.1.q 6 2 y O ", +"m ..^ W Y w.0.8.6.6.1.4 1 < t o ", +"n } W Y P 0.8.6.1.1.>.1 < : 0 X ", +"b [ Y P L 6.6.2.1.:.:.> : ; 7 ", +"v ' R W Y 0.6.6.1.1.1.r 8 7 3 ", +"v x z l k G F D S A Z o o " +}; diff --git a/src/pixmaps/flags_xpm/ga.xpm b/src/pixmaps/flags_xpm/ga.xpm new file mode 100644 index 00000000..333a48ed --- /dev/null +++ b/src/pixmaps/flags_xpm/ga.xpm @@ -0,0 +1,173 @@ +/* XPM */ +static const char *ga[] = { +/* columns rows colors chars-per-pixel */ +"16 11 156 2", +" c #004100", +". c #004700", +"X c #004900", +"o c #005100", +"O c #005500", +"+ c #005900", +"@ c #005F00", +"# c #006500", +"$ c #006B00", +"% c #006F00", +"& c #007300", +"* c #007700", +"= c #007B00", +"- c #007D00", +"; c #00006D", +": c #00007D", +"> c #00007F", +", c #008100", +"< c #008300", +"1 c #008900", +"2 c #2CA52C", +"3 c #32A826", +"4 c #37AA2B", +"5 c #31A831", +"6 c #37AA37", +"7 c #3DAD31", +"8 c #3DAD3D", +"9 c #42B036", +"0 c #47B23C", +"q c #42B042", +"w c #47B347", +"e c #4CB442", +"r c #4FB344", +"t c #49B149", +"y c #4CB54C", +"u c #4EB44E", +"i c #51B747", +"p c #56B94B", +"a c #51B751", +"s c #53B753", +"d c #54B954", +"f c #5BBC51", +"g c #58B957", +"h c #5EBE54", +"j c #59BB59", +"k c #5CBB5C", +"l c #5CBD5C", +"z c #5FBE5F", +"x c #62BF59", +"c c #61BE60", +"v c #65C15C", +"b c #65C065", +"n c #69C269", +"m c #6DC36D", +"M c #70C571", +"N c #74C774", +"B c #77C877", +"V c #79C979", +"C c #7BC97A", +"Z c #7BCA7B", +"A c #E3E300", +"S c #E5E500", +"D c #E7E700", +"F c #FDFD00", +"G c #F2F214", +"H c #F3F319", +"J c #F3F31A", +"K c #F4F41F", +"L c #F4F420", +"P c #F5F524", +"I c #F5F525", +"U c #F6F62A", +"Y c #F6F62B", +"T c #F7F72F", +"R c #F7F730", +"E c #F4F436", +"W c #F8F835", +"Q c #F8F836", +"! c #F4F53B", +"~ c #F5F53F", +"^ c #F9F93A", +"/ c #F9F93B", +"( c #F9F93C", +") c #80CD79", +"_ c #FAFA40", +"` c #FAFA41", +"' c #FBFB45", +"] c #FBFB46", +"[ c #FBFC49", +"{ c #FCFC4B", +"} c #FCFC4F", +"| c #FDFC50", +" . c #FDFD53", +".. c #FDFD54", +"X. c #FEFE58", +"o. c #FDFD6F", +"O. c #FEFE73", +"+. c #FEFE76", +"@. c #000083", +"#. c #000087", +"$. c #00008B", +"%. c #00008D", +"&. c #000091", +"*. c #000095", +"=. c #000099", +"-. c #00009D", +";. c #0001A1", +":. c #0007A3", +">. c #000DA7", +",. c #0013A9", +"<. c #001DAF", +"1. c #003FA7", +"2. c #0023B3", +"3. c #0029B7", +"4. c #4973B8", +"5. c #4D76BA", +"6. c #5179BB", +"7. c #557DBD", +"8. c #3666C4", +"9. c #3A69C6", +"0. c #3E6BC7", +"q. c #436FC9", +"w. c #4773CB", +"e. c #4C76CD", +"r. c #537BCA", +"t. c #557CCA", +"y. c #517ACF", +"u. c #557CCC", +"i. c #587FCC", +"p. c #547ED1", +"a. c #5A80C0", +"s. c #5E83C2", +"d. c #5B82CD", +"f. c #5F84CF", +"g. c #5982D3", +"h. c #5E85D4", +"j. c #6487C2", +"k. c #6286C4", +"l. c #668AC6", +"z. c #6A8EC8", +"x. c #6F91CA", +"c. c #7394CD", +"v. c #7798CE", +"b. c #6286D0", +"n. c #658AD2", +"m. c #6289D6", +"M. c #698DD3", +"N. c #678DD8", +"B. c #6D90D5", +"V. c #7193D7", +"C. c #7596D8", +"Z. c #7999DA", +"A. c #7D9DDB", +"S. c #809FDD", +"D. c #83A2DF", +"F. c #90ABD8", +/* pixels */ +"< < < < - - - * & % $ # @ + O o ", +"< Z Z Z B N M m n b c k g s u X ", +"< C z l j d a y w q 8 6 5 2 t ", +"1 Z v x h f p i e 0 9 7 4 3 i . ", +"F +..... .[ [ ` ( W R Y P K ~ S ", +"F O. .} } ] ( ^ W R Y P K H ! S ", +"F o.} [ ] ( ^ W R Y P K H G E S ", +"1.F.v.c.c.z.l.k.s.t.7.6.5.4.j.; ", +"3.D.N.m.h.g.p.y.e.w.q.0.9.8.t.#.", +"2.S.A.Z.C.V.B.M.n.b.b.d.i.t.r.> ", +"<.,.>.:.;.-.*.*.%.$.$.#.@.@.> > " +}; diff --git a/src/pixmaps/flags_xpm/gb.xpm b/src/pixmaps/flags_xpm/gb.xpm new file mode 100644 index 00000000..36b561e2 --- /dev/null +++ b/src/pixmaps/flags_xpm/gb.xpm @@ -0,0 +1,155 @@ +/* XPM */ +static const char *gb[] = { +/* columns rows colors chars-per-pixel */ +"16 11 138 2", +" c #001167", +". c #00136B", +"X c #00136D", +"o c #001570", +"O c #001773", +"+ c #14317E", +"@ c #45356E", +"# c #841734", +"$ c #851B38", +"% c #851F3A", +"& c #F52B2B", +"* c #F52E2E", +"= c #FA292B", +"- c #FC2B2D", +"; c #FB2F31", +": c #F73434", +"> c #FE3234", +", c #FC3638", +"< c #F93939", +"1 c #FA3F3F", +"2 c #FF3D3D", +"3 c #944463", +"4 c #9C516F", +"5 c #AC617D", +"6 c #AC607E", +"7 c #E54241", +"8 c #FE4545", +"9 c #FF4C4C", +"0 c #FF4E4E", +"q c #FB5243", +"w c #F95346", +"e c #FD5448", +"r c #FF5454", +"t c #FF5555", +"y c #FF5758", +"u c #FF5959", +"i c #FF5C5C", +"p c #FF5F5F", +"a c #EB604D", +"s c #E8605C", +"d c #F9635F", +"f c #FF6061", +"g c #FF6464", +"h c #FF6569", +"j c #FF6D69", +"k c #F78778", +"l c #F3817E", +"z c #FC827F", +"x c #FE8A7C", +"c c #181B9A", +"v c #082590", +"b c #0C2893", +"n c #112D91", +"m c #112C9C", +"M c #193498", +"N c #3A3FA4", +"B c #3756AE", +"V c #3D5CB0", +"C c #3F5EB2", +"Z c #4149A7", +"A c #555EAB", +"S c #4369A2", +"D c #5460AF", +"F c #496BB6", +"G c #4866B8", +"H c #5766B6", +"J c #5A66B8", +"K c #6B72A4", +"L c #5C74C6", +"P c #AD6381", +"I c #5A81B9", +"U c #6181C0", +"Y c #6483C3", +"T c #6284C1", +"R c #6483C6", +"E c #6E80C3", +"W c #7180C1", +"Q c #7282C4", +"! c #7B97C6", +"~ c #7A9EC0", +"^ c #7B9DC5", +"/ c #748ED2", +"( c #7E91D5", +") c #9299BE", +"_ c #BF99B5", +"` c #FF8E85", +"' c #F08A8A", +"] c #F78B8B", +"[ c #FF9388", +"{ c #FF948C", +"} c #F49A9D", +"| c #FFA5A7", +" . c #F4A2AC", +".. c #FFB1AA", +"X. c #FFC1BD", +"o. c #8295CE", +"O. c #8C9CCF", +"+. c #8696D5", +"@. c #8D9DD0", +"#. c #92A1D3", +"$. c #9EAAD2", +"%. c #9FAFDC", +"&. c #8DBCD7", +"*. c #90B2D0", +"=. c #93B3D3", +"-. c #A4A8CA", +";. c #A3AFD5", +":. c #A2B0DB", +">. c #A1B0DD", +",. c #E1BEDF", +"<. c #B7C3DA", +"1. c #BCC9EE", +"2. c #B8D5EC", +"3. c #C5C0DB", +"4. c #C9C8E3", +"5. c #C9D5E8", +"6. c #CBD4E9", +"7. c #CCD6E9", +"8. c #CFD6E8", +"9. c #D4D5EF", +"0. c #D0DCED", +"q. c #D9DDED", +"w. c #DBE1F4", +"e. c #FFE8E8", +"r. c #FFEDEC", +"t. c #FDFCF8", +"y. c #FEFDF9", +"u. c #FBFCFC", +"i. c #F9FFFF", +"p. c #FCFDFC", +"a. c #FDFDFD", +"s. c #FEFDFD", +"d. c #FEFEFD", +"f. c #FFFFFD", +"g. c #FFFEFE", +"h. c #FFFFFE", +"j. c #FEFEFF", +"k. c gray100", +/* pixels */ +") 2.! R Y U q.P 5 q.F G C I 4 ^ ", +"-...j.w.:.%.j.{ ` j.#.@.4.x y.*.", +"T 1.| X.j.+.j.h f j./ .] j.$.M ", +"T >.( ,.z j.j.p r j.j e.0.Z Q n ", +"q.j.j.j.j.j.j.r 9 j.j.j.j.j.j.7.", +"5 [ g p u r 9 9 8 1 < : * & w % ", +"q.j.j.j.j.j.j.2 , j.j.j.j.y.p.5.", +"C O.J 9.r.d j.> > j.j.7 _ c D . ", +"B ;.j.l ' L j.- = y.N i.} s o. ", +"=.j.k 3.Q E j.e q j.H A <.y.a K ", +"~ 3 S m v v 8.$ # 6.O X X + &.@ " +}; diff --git a/src/pixmaps/flags_xpm/gd.xpm b/src/pixmaps/flags_xpm/gd.xpm new file mode 100644 index 00000000..64bb90b9 --- /dev/null +++ b/src/pixmaps/flags_xpm/gd.xpm @@ -0,0 +1,173 @@ +/* XPM */ +static const char *gd[] = { +/* columns rows colors chars-per-pixel */ +"16 11 156 2", +" c #D70000", +". c #DD0000", +"X c #DF0000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #ED0000", +"% c #EF0000", +"& c #F10000", +"* c #F30000", +"= c #F50000", +"- c #F70000", +"; c #F90000", +": c #FB0000", +"> c #FD0000", +", c red", +"< c #E32300", +"1 c #E13B00", +"2 c #E73D00", +"3 c #ED3F00", +"4 c #E94100", +"5 c #ED5F00", +"6 c #F75D00", +"7 c #F56F00", +"8 c #FB7300", +"9 c #FD7300", +"0 c #FD7700", +"q c #F55E37", +"w c #C37036", +"e c #F6643C", +"r c #CA7B46", +"t c #F86B43", +"y c #F87048", +"u c #109C10", +"i c #179914", +"p c #199B19", +"a c #1F9C1F", +"s c #1F9F1F", +"d c #14A014", +"f c #1AA31A", +"g c #36B00B", +"h c #20A620", +"j c #25A125", +"k c #25A225", +"l c #26A626", +"z c #2BA32B", +"x c #2AA42B", +"c c #38A524", +"v c #31A62B", +"b c #70AE19", +"n c #419C2F", +"m c #479B32", +"M c #4B9E36", +"N c #608C2C", +"B c #5ABF2C", +"V c #49AC30", +"C c #4FA13B", +"Z c #53A43F", +"A c #58A644", +"S c #5AAC49", +"D c #45B145", +"F c #45B245", +"G c #46B246", +"H c #4BB44B", +"J c #49B949", +"K c #50B240", +"L c #5FB94B", +"P c #50B550", +"I c #54BA54", +"U c #5BBC59", +"Y c #7DA04E", +"T c #67B249", +"R c #76B966", +"E c #7BB96A", +"W c #7FBD6F", +"Q c #5CC05C", +"! c #64C844", +"~ c #9BBD2A", +"^ c #89BA31", +"/ c #87BD3F", +"( c #FD8900", +") c #B3C40E", +"_ c #A9C336", +"` c #A0C43A", +"' c #D7C51F", +"] c #F2D113", +"[ c #F3D419", +"{ c #F4D41E", +"} c #DDCE3A", +"| c #C9D231", +" . c #C3D43F", +".. c #F5CE24", +"X. c #F0CC2F", +"o. c #F5D423", +"O. c #F6D729", +"+. c #F6D42A", +"@. c #F7D62F", +"#. c #F7D92E", +"$. c #E5CE36", +"%. c #F4C736", +"&. c #F2CD32", +"*. c #F5C93B", +"=. c #F4CF39", +"-. c #F3D035", +";. c #F8D334", +":. c #F8DC34", +">. c #F8DC37", +",. c #F5D13D", +"<. c #F9D63C", +"1. c #F9DC3A", +"2. c #F9DF3D", +"3. c #8BBB4F", +"4. c #8AAC62", +"5. c #84BF73", +"6. c #86BF76", +"7. c #9FBA7B", +"8. c #DF8955", +"9. c #9CC854", +"0. c #80D35F", +"q. c #AFCA46", +"w. c #88C279", +"e. c #89C47A", +"r. c #D5DF5C", +"t. c #D8DD58", +"y. c #F6D342", +"u. c #F7D546", +"i. c #FADB42", +"p. c #FBDC47", +"a. c #F7D64B", +"s. c #FCDB4B", +"d. c #F7C853", +"f. c #F7CD5D", +"g. c #E9D751", +"h. c #F3DD53", +"j. c #F8D850", +"k. c #F9DB55", +"l. c #F9DA57", +"z. c #F9DA58", +"x. c #FADD5C", +"c. c #FAE042", +"v. c #FBE047", +"b. c #FCE14C", +"n. c #FDE351", +"m. c #FDE554", +"M. c #FEE559", +"N. c #FBDD60", +"B. c #FCDD65", +"V. c #FCE069", +"C. c #FDE26D", +"Z. c #FDE271", +"A. c #FEE274", +"S. c #FEE577", +"D. c #FEE479", +"F. c #FEE47B", +/* pixels */ +", , , , ( 9 , 0 8 - 6 7 * * $ $ ", +", 7.D.D.S.A.Z.C.V.B.N.x.l.d.Y @ ", +": e.W r.M.m.m.b.v.c.2.>.| B S + ", +", e.Q Q 9.g.s.p.i.<.$.^ v l A + ", +", e.r.I H L q.y t _ V z k h A + ", +"- w.n.8.H F r *.%.w x k f f C + ", +": W 3.T F V ` e q ~ c a p u M o ", +": E J F 3.} ;.#.+...' b p u m . ", +"; R ! .1.>.#.+.o.{ [ ] ) g n . ", +"- 4.f.z.k.s.a.u.y.,.=.-.&.X.N ", +"* * * $ 5 2 $ 4 2 + < 1 . . . . " +}; diff --git a/src/pixmaps/flags_xpm/ge.xpm b/src/pixmaps/flags_xpm/ge.xpm new file mode 100644 index 00000000..0773fbac --- /dev/null +++ b/src/pixmaps/flags_xpm/ge.xpm @@ -0,0 +1,143 @@ +/* XPM */ +static const char *ge[] = { +/* columns rows colors chars-per-pixel */ +"16 11 126 2", +" c #CD0000", +". c #D30300", +"X c #D50000", +"o c #D70000", +"O c #D91D17", +"+ c #ED0000", +"@ c #ED0300", +"# c #E82E28", +"$ c #E9332D", +"% c #EB3832", +"& c #EC3D36", +"* c #ED453F", +"= c #D35146", +"- c #EB4C46", +"; c #EC4D48", +": c #ED524D", +"> c #ED544F", +", c #F1534E", +"< c #EE5650", +"1 c #EE5954", +"2 c #EF5A54", +"3 c #EF5B56", +"4 c #F25551", +"5 c #F15B55", +"6 c #F25A56", +"7 c #F05D58", +"8 c #F35F5A", +"9 c #DF675E", +"0 c #F1605B", +"q c #F4635E", +"w c #ED6560", +"e c #EE6B67", +"r c #F26560", +"t c #F26661", +"y c #F36B66", +"u c #F56D67", +"i c #F36D68", +"p c #E2756D", +"a c #F4716D", +"s c #E47D74", +"d c #F77F7B", +"f c #EA807A", +"g c #EB807D", +"h c gray75", +"j c #EF8380", +"k c #EE8782", +"l c #E68983", +"z c #E98A82", +"x c #EE8884", +"c c #EF8986", +"v c #EF8E8D", +"b c #F68783", +"n c #F78B88", +"m c #E7938B", +"M c #ED918F", +"N c #F3918D", +"B c #F3928E", +"V c #F19592", +"C c #F19894", +"Z c #F19994", +"A c #F29895", +"S c #F49A97", +"D c #F19E9B", +"F c #F59D9A", +"G c #F69E9B", +"H c #F7A3A0", +"J c #F0A5A0", +"K c #F0A7A2", +"L c #F7A4A1", +"P c #F7A7A4", +"I c #F6A9A7", +"U c #F8AAA7", +"Y c #F3ADA8", +"T c #F9AEAC", +"R c #F9B0AD", +"E c #F9B3B1", +"W c #F3B8B5", +"Q c #F3BBB7", +"! c #F1BFBB", +"~ c #FABDBA", +"^ c #F8BEBA", +"/ c #FBBEBC", +"( c #F9C1BE", +") c #C1C1C1", +"_ c #C3C3C3", +"` c #C5C5C5", +"' c gray79", +"] c #CDCDCD", +"[ c #CFCFD1", +"{ c gray82", +"} c LightGray", +"| c #D7D7D7", +" . c #D9D7D9", +".. c gray85", +"X. c gray86", +"o. c #DFDFDF", +"O. c #EFC9C8", +"+. c #F9CECA", +"@. c #F2D8D8", +"#. c #F7DEDD", +"$. c #F8DDDC", +"%. c #FADFDE", +"&. c #E1E1E1", +"*. c gray89", +"=. c gray90", +"-. c #E7E7E7", +";. c #E9E9E9", +":. c gray92", +">. c #FAEAEA", +",. c #FDEDEC", +"<. c #FEEEED", +"1. c gray95", +"2. c #F3F3F3", +"3. c #F4F4F4", +"4. c gray96", +"5. c #F6F6F6", +"6. c gray97", +"7. c #F8F8F8", +"8. c #F9F9F9", +"9. c gray98", +"0. c #FBFBFB", +"q. c gray99", +"w. c #FDFDFD", +"e. c #FDFDFE", +"r. c #FEFEFE", +"t. c gray100", +/* pixels */ +":.:.:.:.:.=.=.+ + =.&.o.X.....| ", +":.t.<./ >.t.t.n b q.0.>.I #.5.} ", +":.t.( z ^ t.t.a y 0.6.Q 9 J 5.[ ", +":.t.t.+.q.t.0.i t 0.6.6.! 5.5.] ", +"y ~ T R U L G w 0 N S V C v G O ", +"+ d q 8 5 4 > 7 1 * & % $ # - ", +"5 E H L G S n 3 > g c x x g M . ", +"=.q.0.Q 0.0.7.3 > 6.3.1.m 1.1._ ", +"*.q.Y p K 5.5.> - 5.3.l = s 1.) ", +"*.0.%.C $.0.6.e w 3.3.@.f O.1.h ", +"o.X.X.| | } { X X ' ` ` _ ) h h " +}; diff --git a/src/pixmaps/flags_xpm/gf.xpm b/src/pixmaps/flags_xpm/gf.xpm new file mode 100644 index 00000000..ec1668f7 --- /dev/null +++ b/src/pixmaps/flags_xpm/gf.xpm @@ -0,0 +1,146 @@ +/* XPM */ +static const char *gf[] = { +/* columns rows colors chars-per-pixel */ +"16 11 129 2", +" c #C50000", +". c #C70000", +"X c #CB0000", +"o c #CD0000", +"O c #D30000", +"+ c #D50000", +"@ c #DB0000", +"# c #DD0000", +"$ c #E10000", +"% c #E50000", +"& c #E70000", +"* c #EB0000", +"= c #EF0700", +"- c #F11300", +"; c #E64D3E", +": c #E85243", +"> c #E95648", +", c #EA5748", +"< c #EA574A", +"1 c #EB5D4F", +"2 c #EC5E50", +"3 c #E86355", +"4 c #EE6355", +"5 c #EE6456", +"6 c #EE6457", +"7 c #E96659", +"8 c #E9665A", +"9 c #EA695D", +"0 c #EA6A5D", +"q c #EF695C", +"w c #F06A5C", +"e c #F06C5D", +"r c #EC6D61", +"t c #EC6E62", +"y c #ED7468", +"u c #EF786C", +"i c #F17063", +"p c #F17064", +"a c #F27164", +"s c #F3776A", +"d c #F3776B", +"f c #F17E72", +"g c #F57D72", +"h c #F28478", +"j c #F4887E", +"k c #1747A5", +"l c #234FAB", +"z c #2D57AF", +"x c #355FB5", +"c c #3F67B9", +"v c #4971BD", +"b c #5377C3", +"n c #5B7FC7", +"m c #6385CB", +"M c #6989CD", +"N c #6F8FD1", +"B c #7191D1", +"V c #7393D3", +"C c #7395D3", +"Z c #9F9F9F", +"A c #A7A7A7", +"S c gray68", +"D c #B3B0B0", +"F c gray72", +"G c gray", +"H c #F58D83", +"J c #F79389", +"K c #F8978E", +"L c #97ACD8", +"P c #9CB0DA", +"I c #A0B4DD", +"U c #A0B5DD", +"Y c #A1B5DD", +"T c #A3B5DC", +"R c #A7B9DD", +"E c #A5B8DF", +"W c #A5B9DF", +"Q c #A6B9E0", +"! c #A9BCE1", +"~ c #A9BDE1", +"^ c #AABDE0", +"/ c #AABDE1", +"( c #AFBFE2", +") c #AEBFE3", +"_ c #AEBFE4", +"` c #AEC0E4", +"' c #B1C2E5", +"] c #B1C3E5", +"[ c #B3C3E4", +"{ c #B2C3E5", +"} c #B4C5E7", +"| c #B7C7E6", +" . c #B7C8E8", +".. c #BAC9E8", +"X. c #BECCE9", +"o. c #CECECE", +"O. c gray81", +"+. c #D2D2D2", +"@. c #D5D5D5", +"#. c gainsboro", +"$. c #DFDFDF", +"%. c #C0CEEA", +"&. c #C1CFEB", +"*. c #C3D0EC", +"=. c #C3D1EC", +"-. c #C4D2ED", +";. c #C4D3ED", +":. c #E2E2E2", +">. c #E4E4E4", +",. c gray90", +"<. c #E6E6E6", +"1. c #E7E7E7", +"2. c gray91", +"3. c #E9E9E9", +"4. c #E9E9EA", +"5. c #EAEAEA", +"6. c gray92", +"7. c #ECEBEB", +"8. c #ECECEC", +"9. c gray93", +"0. c #EEEEEE", +"q. c #EFEFEF", +"w. c gray94", +"e. c #F1F1F1", +"r. c #F3F3F3", +"t. c #F4F4F4", +"y. c #F6F6F6", +"u. c gray97", +"i. c #F8F8F8", +/* pixels */ +"C C C C V $.#.@.+.o.O.- = * * % ", +"C ;.;.=.%.i.u.u.u.t.e.K J H j # ", +"V ;. .} ] 0.8.6.2.6.1.g d a h # ", +"V =.} ] _ 0.6.8.6.2.,.s a e f # ", +"N %.] _ ^ 0.0.6.6.2.1.i q 6 u + ", +"M X.) ^ Q e.0.0.6.6.1.q 6 2 y O ", +"m ..^ W Y w.0.8.6.6.1.4 1 < t o ", +"n } W Y P 0.8.6.1.1.>.1 < : 0 X ", +"b [ Y P L 6.6.2.1.:.:.> : ; 7 ", +"v ' R W Y 0.6.6.1.1.1.r 8 7 3 ", +"v x z l k G F D S A Z o o " +}; diff --git a/src/pixmaps/flags_xpm/gh.xpm b/src/pixmaps/flags_xpm/gh.xpm new file mode 100644 index 00000000..60353e16 --- /dev/null +++ b/src/pixmaps/flags_xpm/gh.xpm @@ -0,0 +1,164 @@ +/* XPM */ +static const char *gh[] = { +/* columns rows colors chars-per-pixel */ +"16 11 147 2", +" c #001F00", +". c #002100", +"X c #002500", +"o c #002700", +"O c #002900", +"+ c #002D00", +"@ c #003300", +"# c #003900", +"$ c #003D00", +"% c #004100", +"& c #004700", +"* c #004D00", +"= c #005300", +"- c #005900", +"; c #005D00", +": c #006300", +"> c #006900", +", c #006F00", +"< c #007300", +"1 c #434336", +"2 c #4A4B3B", +"3 c #605E2F", +"4 c #686635", +"5 c #E70000", +"6 c #E90000", +"7 c #EB0000", +"8 c #ED0000", +"9 c #EF0000", +"0 c #F10000", +"q c #F30000", +"w c #F50000", +"e c #F70000", +"r c #F90000", +"t c #FB0000", +"y c #FD0000", +"u c red", +"i c #F52626", +"p c #F62B2B", +"a c #F62C2C", +"s c #F73131", +"d c #F83736", +"f c #F83737", +"g c #F93C3C", +"h c #F93C3D", +"j c #F64444", +"k c #FA4142", +"l c #FA4242", +"z c #FB4747", +"x c #F74949", +"c c #F74E4E", +"v c #FC4B4B", +"b c #FC4C4C", +"n c #F85353", +"m c #FD5151", +"M c #F95757", +"N c #FD5454", +"B c #FE5959", +"V c #FA5C5C", +"C c #FE5C5C", +"Z c #FE5F5F", +"A c #FB6060", +"S c #FC6565", +"D c #FC6969", +"F c #FD6D6D", +"G c #FD7071", +"H c #FE7474", +"J c #FE7777", +"K c #FE7979", +"L c #FF7B7A", +"P c #FF7B7B", +"I c #0B950B", +"U c #0F970E", +"Y c #109710", +"T c #139913", +"R c #149914", +"E c #189C19", +"W c #199C19", +"Q c #1E9F1E", +"! c #1F9F1F", +"~ c #23A123", +"^ c #24A224", +"/ c #29A429", +"( c #2AA42A", +") c #2CA22C", +"_ c #2FA42F", +"` c #2EA62E", +"' c #2FA72F", +"] c #32A532", +"[ c #33A632", +"{ c #34A934", +"} c #35A835", +"| c #34AA34", +" . c #39A939", +".. c #3AAC3A", +"X. c #3DAC3D", +"o. c #3FAF3F", +"O. c #40AF3F", +"+. c #42AE42", +"@. c #44B144", +"#. c #45B245", +"$. c #46B046", +"%. c #4BB24B", +"&. c #49B449", +"*. c #50B450", +"=. c #54B755", +"-. c #58B958", +";. c #5DBC5D", +":. c #61BE62", +">. c #66C066", +",. c #6AC36A", +"<. c #939430", +"1. c #92953C", +"2. c #E3E300", +"3. c #E5E500", +"4. c #E7E700", +"5. c #FDFD00", +"6. c #F2F214", +"7. c #F3F319", +"8. c #F3F31A", +"9. c #F4F41F", +"0. c #F2EF2A", +"q. c #F4F420", +"w. c #F5F524", +"e. c #F5F525", +"r. c #F6F62B", +"t. c #ECEF36", +"y. c #F7F730", +"u. c #F4F436", +"i. c #F4F53B", +"p. c #F5F53F", +"a. c #F9F43A", +"s. c #989A41", +"d. c #A1A140", +"f. c #F0F346", +"g. c #FAFA40", +"h. c #FBFB45", +"j. c #FBFB46", +"k. c #FBFC49", +"l. c #FCFC4B", +"z. c #FCFC4F", +"x. c #FDFC50", +"c. c #FDFD53", +"v. c #FDFD54", +"b. c #FEFE58", +"n. c #FDFD6F", +"m. c #FEFE73", +"M. c #FEFE76", +/* pixels */ +"u u u u u u u t t t w w q q 8 8 ", +"u P P P J H G F D S A V M n c 7 ", +"u P Z C B N N b z l h d s a x 7 ", +"u J Z M N m v z l g d s p i j 5 ", +"5.M.v.v.c.l.f.s.1.t.r.r.e.q.p.4.", +"5.m.c.z.l.j.d.2 1 <.r.e.9.8.i.3.", +"5.n.z.k.j.p.a.4 3 0.e.9.8.6.u.2.", +"< ,.&.#.O...| ' ( ^ ! W T Y [ o ", +"< >.#.X...} ` ( ^ ! E T U I _ ", +"> :.;.-.=.*.%.#.+.X...} ] _ ) ", +": ; - = * & $ $ # @ + O o . " +}; diff --git a/src/pixmaps/flags_xpm/gi.xpm b/src/pixmaps/flags_xpm/gi.xpm new file mode 100644 index 00000000..9147f299 --- /dev/null +++ b/src/pixmaps/flags_xpm/gi.xpm @@ -0,0 +1,130 @@ +/* XPM */ +static const char *gi[] = { +/* columns rows colors chars-per-pixel */ +"16 11 113 2", +" c #B93D35", +". c #D50000", +"X c #DD0000", +"o c #DF0000", +"O c #E10000", +"+ c #E30000", +"@ c #E50000", +"# c #E70000", +"$ c #E90000", +"% c #ED0000", +"& c #EF0000", +"* c #F10000", +"= c #F30000", +"- c #F50000", +"; c #F70000", +": c #F91505", +"> c #DE3D31", +", c #F2382C", +"< c #F23B2F", +"1 c #F23F32", +"2 c #E1483C", +"3 c #F34135", +"4 c #F04337", +"5 c #F44639", +"6 c #F2483B", +"7 c #F54A3D", +"8 c #AD6965", +"9 c #F24D41", +"0 c #F14E43", +"q c #E8554A", +"w c #F45042", +"e c #F15245", +"r c #F35A41", +"t c #F15448", +"y c #F2584C", +"u c #F4584D", +"i c #EC5E54", +"p c #F05B51", +"a c #F35C51", +"s c #F55E53", +"d c #F85B50", +"f c #F95F55", +"g c #F76055", +"h c #F96358", +"j c #FA685D", +"k c #F26A60", +"l c #F86B61", +"z c #FB6B62", +"x c #F86D63", +"c c #F7776E", +"v c #F9746A", +"b c #FA786E", +"n c #FA7C72", +"m c #E1A13F", +"M c #E8A73C", +"N c #EEAB58", +"B c #EBB055", +"V c #FB847C", +"C c #FC948D", +"Z c #C9C7C7", +"A c #CBCBCB", +"S c #CDCDCD", +"D c gray81", +"F c gray82", +"G c #D5D5D5", +"H c #D7D7D7", +"J c gray85", +"K c gray86", +"L c #DFDFDF", +"P c #E3CAC8", +"I c #EDCCCA", +"U c #EBD3D0", +"Y c #EDD4D3", +"T c #F1DEDD", +"R c #F7E0DE", +"E c #E1E1E1", +"W c gray89", +"Q c gray90", +"! c #E7E7E7", +"~ c #EFE2E1", +"^ c #E9E7E7", +"/ c #EEE5E4", +"( c #E9E9E9", +") c gray92", +"_ c gray93", +"` c #EFEFEF", +"' c #F7E5E4", +"] c #F9E3E2", +"[ c #F2F1F1", +"{ c gray95", +"} c #F3F2F2", +"| c #F3F3F3", +" . c #F7F2F1", +".. c #F6F3F3", +"X. c #F4F4F4", +"o. c #F4F5F5", +"O. c gray96", +"+. c #F6F6F6", +"@. c gray97", +"#. c #FAF3F3", +"$. c #F8F8F8", +"%. c #F9F9F9", +"&. c gray98", +"*. c #FBFAFA", +"=. c #FBFBFB", +"-. c #FBFCFB", +";. c gray99", +":. c #FDFCFC", +">. c #FDFCFD", +",. c #FDFDFD", +"<. c #FDFDFE", +"1. c #FEFEFE", +"2. c gray100", +/* pixels */ +"` ` ` ` _ _ ) ! ) ! W W E T J J ", +"` 2.2.2.:.2.:.2.=.=.=.=.%.$.o.G ", +"` 2.2.2.2.=.#.V ' =.=.$.$.o.o.J ", +"` 2.=.2.2.] l i s T $.$.o.o.o.F ", +") 2.2.:.2.Y i 8 q Y %.o.o.o.o.D ", +") 2.=.=.=.c 7 6 4 0 ..o.o.o.o.S ", +") 2.=.=.=.I 2 > P o.X.{ { o.A ", +"! =.=.=.=. .~ m T ~ o.{ { { { Z ", +": C n b v x f M r y a t t e k o ", +"; l j h g u N B w 7 5 4 3 < < o ", +"; * * & & & # . # # + + o X o X " +}; diff --git a/src/pixmaps/flags_xpm/gl.xpm b/src/pixmaps/flags_xpm/gl.xpm new file mode 100644 index 00000000..5a90bded --- /dev/null +++ b/src/pixmaps/flags_xpm/gl.xpm @@ -0,0 +1,141 @@ +/* XPM */ +static const char *gl[] = { +/* columns rows colors chars-per-pixel */ +"16 11 124 2", +" c #DD0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #ED0000", +"% c #EF0000", +"& c #F10000", +"* c #F30000", +"= c #F50000", +"- c #F70000", +"; c #F90000", +": c #FB0000", +"> c #FD0000", +", c #F10B0B", +"< c #F10F0E", +"1 c #E51111", +"2 c #F21010", +"3 c #F21313", +"4 c #F21414", +"5 c #F31919", +"6 c #F41E1E", +"7 c #F41F1F", +"8 c #F52424", +"9 c #F22C2C", +"0 c #F22F2F", +"q c #F23232", +"w c #F33232", +"e c #F33535", +"r c #F43636", +"t c #F43939", +"y c #F53D3D", +"u c #F93B3C", +"i c #F64242", +"p c #FA4141", +"a c #FA4444", +"s c #FB4646", +"d c #FA4647", +"f c #FB4747", +"g c #FB4B4B", +"h c #FC4B4B", +"j c #FD4F50", +"k c #F75252", +"l c #FA5151", +"z c #FD5151", +"x c #F95455", +"c c #FD5454", +"v c #FD5555", +"b c #F55858", +"n c #F95858", +"m c #FA5D5D", +"M c #FD5E5E", +"N c #FB6162", +"B c #FD6565", +"V c #FC6666", +"C c #FC6767", +"Z c #F56E6E", +"A c #F86A6A", +"S c #FC6A6A", +"D c #FC6D6D", +"F c #FD6F6F", +"G c #F77070", +"H c #F87575", +"J c #F38787", +"K c #F48B8B", +"L c #F58E8E", +"P c #F69191", +"I c #F79494", +"U c #FE9292", +"Y c #FE9393", +"T c #F89797", +"R c #F49898", +"E c #F99A9A", +"W c #FA9D9D", +"Q c #FBA0A1", +"! c #FCA3A3", +"~ c #FCA5A5", +"^ c #FDA9A9", +"/ c #F6B6B6", +"( c #FEB9B9", +") c #F9BEBE", +"_ c #D5D5D5", +"` c #D7D7D7", +"' c gray85", +"] c #DDDDDD", +"[ c #DFDFDF", +"{ c #FBC0C0", +"} c #FBC2C2", +"| c #F9CFCF", +" . c #F6DCDC", +".. c #E1E1E1", +"X. c gray89", +"o. c gray90", +"O. c #E7E7E7", +"+. c #E9E9E9", +"@. c gray92", +"#. c gray93", +"$. c #EFEFEF", +"%. c #FEE3E3", +"&. c #FDE5E5", +"*. c #FEEDED", +"=. c #EFEFF1", +"-. c #F1F1F1", +";. c #F6F2F2", +":. c #F4F4F4", +">. c gray96", +",. c #F7F4F4", +"<. c #F6F6F6", +"1. c gray97", +"2. c #F8F1F1", +"3. c #FEF2F2", +"4. c #FDF7F7", +"5. c #F8F8F8", +"6. c #F9F9F9", +"7. c gray98", +"8. c #FBFBFB", +"9. c #FBFCFB", +"0. c gray99", +"q. c #FEFDFD", +"w. c #FEFEFE", +"e. c gray100", +/* pixels */ +"-.-.-.-.-.=.$.$.@.@.+.O.o.X...[ ", +"-.e.e.e.e.*.&.4.0.0.8.8.5.5.1.] ", +"-.e.e.3.U M v C } 8.5.5.1.1.1.' ", +"-.e.0.U v z g s s | 5.1.1.:.1.` ", +"-.e.%.c h h s p u H 1.1.:.:.:._ ", +"B ( ^ ~ ! ! W E I I P L K J R 1 ", +": F F 8.0.8.1.5.5./ 8 7 5 4 r X ", +": S g ) 8.8.1.1.;.b 7 5 4 2 w . ", +"- C s l ) 2.1. .Z 7 5 3 < , 0 . ", +"- B m v x A Z k i y t r w 0 9 ", +"& - & $ $ $ @ @ + + X X . " +}; diff --git a/src/pixmaps/flags_xpm/gm.xpm b/src/pixmaps/flags_xpm/gm.xpm new file mode 100644 index 00000000..2fa1ba8f --- /dev/null +++ b/src/pixmaps/flags_xpm/gm.xpm @@ -0,0 +1,182 @@ +/* XPM */ +static const char *gm[] = { +/* columns rows colors chars-per-pixel */ +"16 11 165 2", +" c #002100", +". c #002300", +"X c #002700", +"o c #002B00", +"O c #002F00", +"+ c #003500", +"@ c #003900", +"# c #003D00", +"$ c #004300", +"% c #004900", +"& c #004F00", +"* c #005500", +"= c #005900", +"- c #005F00", +"; c #006700", +": c #006B00", +"> c #006F00", +", c #990000", +"< c #9D0000", +"1 c #A70000", +"2 c #AB0000", +"3 c #AF0000", +"4 c #B10000", +"5 c #B30000", +"6 c #B70000", +"7 c #B90000", +"8 c #BD0000", +"9 c #C10000", +"0 c #C30000", +"q c #C70000", +"w c #CE2C2C", +"e c #D03131", +"r c #D13737", +"t c #D33C3D", +"y c #D54242", +"u c #D64747", +"i c #D44949", +"p c #D74E4E", +"a c #D84C4C", +"s c #D95151", +"d c #D85353", +"f c #DB5454", +"g c #D95757", +"h c #DD5959", +"j c #DB5C5C", +"k c #DD5C5C", +"l c #DE5F5F", +"z c #DD6060", +"x c #DD6565", +"c c #DF6969", +"v c #E06D6D", +"b c #E27071", +"n c #E27474", +"m c #E37777", +"M c #E47979", +"N c #E47B7A", +"B c #E47B7B", +"V c #0B920B", +"C c #0F940E", +"Z c #139613", +"A c #189919", +"S c #1E9C1E", +"D c #239F23", +"F c #29A229", +"G c #2CA22C", +"H c #2FA22F", +"J c #2EA52E", +"K c #2FA42F", +"L c #32A532", +"P c #34A834", +"I c #35A835", +"U c #39A939", +"Y c #3AAB3A", +"T c #3DAC3D", +"R c #3FAE3F", +"E c #42AE42", +"W c #44B144", +"Q c #46B046", +"! c #4BB24B", +"~ c #50B450", +"^ c #54B755", +"/ c #58B958", +"( c #5DBC5D", +") c #61BE62", +"_ c #66BF66", +"` c #0003E3", +"' c #0000E5", +"] c #0015E7", +"[ c #0041FD", +"{ c #095BFD", +"} c #1767FD", +"| c #3C71F3", +" . c #4175F4", +".. c #4579F5", +"X. c #4A7DF6", +"o. c #4E83F2", +"O. c #4F80F7", +"+. c #5286F3", +"@. c #5886F5", +"#. c #568AF4", +"$. c #588DF4", +"%. c #5B8DF5", +"&. c #5F8FF6", +"*. c #5484F8", +"=. c #5988F9", +"-. c #5E8BFA", +";. c #5C90F5", +":. c #628FFB", +">. c #6193F6", +",. c #6393F7", +"<. c #6794F4", +"1. c #6596F7", +"2. c #6F9DF5", +"3. c #6796F8", +"4. c #6692FC", +"5. c #6B95FC", +"6. c #6A9AF8", +"7. c #6C99F9", +"8. c #6D9DF9", +"9. c #6F98FD", +"0. c #709DFA", +"q. c #749FFB", +"w. c #71A0FA", +"e. c #75A3FB", +"r. c #78A2FB", +"t. c #79A6FC", +"y. c #7CA5FC", +"u. c #7DA8FD", +"i. c #BBC1BB", +"p. c #80ABFD", +"a. c #83ADFE", +"s. c #88AAFE", +"d. c #94B6FD", +"f. c #99BCFE", +"g. c #CDC7C7", +"h. c #DFE5DF", +"j. c #EBE7E7", +"k. c #EDF0ED", +"l. c #EEF0EE", +"z. c #EEF1EE", +"x. c #EFF2EF", +"c. c #F0F2F0", +"v. c #F4F2F1", +"b. c #F5F3F2", +"n. c #F6F3F2", +"m. c #F1F4F1", +"M. c #F2F5F2", +"N. c #F3F6F3", +"B. c #F7F4F3", +"V. c #F4F7F4", +"C. c #F8F4F3", +"Z. c #F9F5F5", +"A. c #FAF6F6", +"S. c #FAF7F7", +"D. c #F5F8F5", +"F. c #F6F9F6", +"G. c #F7FAF7", +"H. c #FBF8F7", +"J. c #F8FAF8", +"K. c #FCF9F8", +"L. c #FCFAF9", +"P. c #FDFAF9", +"I. c #FEFBFA", +"U. c #FAFCFA", +"Y. c #FEFCFC", +/* pixels */ +"q 0 0 0 q 8 8 8 7 7 5 5 3 2 1 1 ", +"0 B B B m n b v c x l k g d p < ", +"0 B l k k s s a u y t r e w i , ", +"j.I.I.K.H.I.H.S.S.S.n.n.n.v.v.g.", +"} f.a.p.u.t.e.w.8.6.3.;.;.%.2.] ", +"[ s.9.5.4.:.-.=.*.O.X...| | @.` ", +"{ d.y.r.q.0.7.3.,.;.%.#.+.o.<.` ", +"h.U.J.G.G.V.V.N.N.N.c.z.z.z.c.i.", +"> _ W R U I J G D S A Z C V H X ", +": ) ( / ^ ~ ! E E T U I L H G ", +"; - * * * % $ # @ + O o X X " +}; diff --git a/src/pixmaps/flags_xpm/gn.xpm b/src/pixmaps/flags_xpm/gn.xpm new file mode 100644 index 00000000..4a490d53 --- /dev/null +++ b/src/pixmaps/flags_xpm/gn.xpm @@ -0,0 +1,161 @@ +/* XPM */ +static const char *gn[] = { +/* columns rows colors chars-per-pixel */ +"16 11 144 2", +" c #002100", +". c #002300", +"X c #002700", +"o c #002900", +"O c #002B00", +"+ c #002D00", +"@ c #003100", +"# c #003700", +"$ c #003D00", +"% c #004300", +"& c #004900", +"* c #005100", +"= c #005500", +"- c #005900", +"; c #005F00", +": c #006500", +"> c #ED0000", +", c #EF0000", +"< c #F10000", +"1 c #F30000", +"2 c #F50000", +"3 c #F70000", +"4 c #F90000", +"5 c #FB0000", +"6 c #FD0000", +"7 c red", +"8 c #F93A3A", +"9 c #FA3F3F", +"0 c #FA4444", +"q c #FB4545", +"w c #FB4949", +"e c #FB4A49", +"r c #FC4A4B", +"t c #FC4F4F", +"y c #FD4F50", +"u c #FD5353", +"i c #F95455", +"p c #FD5454", +"a c #F95858", +"s c #FE5858", +"d c #FE5959", +"f c #FA5D5D", +"g c #FE5C5C", +"h c #FE5F5F", +"j c #FB6162", +"k c #FC6666", +"l c #FC6A6A", +"z c #FD6F6F", +"x c #FE7273", +"c c #FE7676", +"v c #FE7777", +"b c #FE7979", +"n c #FF7B7A", +"m c #FF7B7B", +"M c #0B950B", +"N c #0F970E", +"B c #109710", +"V c #139913", +"C c #149914", +"Z c #149A14", +"A c #199C19", +"S c #1A9C1A", +"D c #1F9F1F", +"F c #209F20", +"G c #25A225", +"H c #26A226", +"J c #2BA52B", +"K c #2CA22C", +"L c #2CA62C", +"P c #2FA42F", +"I c #32A532", +"U c #33A632", +"Y c #31A831", +"T c #31A931", +"R c #35A835", +"E c #36A836", +"W c #37AB37", +"Q c #3BAA3B", +"! c #3FAD3F", +"~ c #44AF44", +"^ c #49B249", +"/ c #4EB44E", +"( c #53B753", +") c #58B957", +"_ c #5CBB5C", +"` c #CBDB00", +"' c #EDD500", +"] c #E5E500", +"[ c #E7E700", +"{ c #E5EF00", +"} c #E9E900", +"| c #EBEB00", +" . c #FDEB00", +".. c #F9F900", +"X. c #FBFB00", +"o. c #FDFD00", +"O. c #E7EE19", +"+. c #E8EF1F", +"@. c #F4F41E", +"#. c #EAF024", +"$. c #EBF12B", +"%. c #F5F523", +"&. c #F5F524", +"*. c #F6F629", +"=. c #F6F62A", +"-. c #F7F72E", +";. c #F7F72F", +":. c #F8EC34", +">. c #F9ED3A", +",. c #ECF230", +"<. c #EEF436", +"1. c #EAF039", +"2. c #EFF53D", +"3. c #F7F730", +"4. c #F8F834", +"5. c #F8F835", +"6. c #F8F836", +"7. c #F5F53D", +"8. c #F9F93A", +"9. c #F9F93B", +"0. c #F9F93C", +"q. c #FAEE40", +"w. c #F6F642", +"e. c #F7F746", +"r. c #FBF046", +"t. c #FAFA40", +"y. c #FAFA41", +"u. c #FAFA42", +"i. c #FBFB46", +"p. c #FBFB47", +"a. c #F7F74B", +"s. c #FCF14B", +"d. c #FCFC4B", +"f. c #FCFC4C", +"g. c #F8EE50", +"h. c #FDF251", +"j. c #FDF254", +"k. c #FDFD51", +"l. c #F2F760", +"z. c #FCFC65", +"x. c #FCFC69", +"c. c #FDFD6D", +"v. c #FEF574", +"b. c #FDFD71", +/* pixels */ +"7 7 7 7 7 .o.o.X.X.{ : ; - = * ", +"7 m m m c v.b.c.x.z.l._ ) ( / & ", +"7 m h g g h.k.f.p.u.7.W T L ^ % ", +"7 m h p p h.f.p.u.7.<.T J H ~ $ ", +"7 c s p t s.p.u.8.8.$.J H D ! # ", +"5 x p t w r.0.8.6.3.$.H D S Q @ ", +"7 z t w 0 >.0.6.3.=.#.D A C W O ", +"5 l w 0 0 >.6.3.=.&.+.A C B I O ", +"5 k 0 9 8 :.;.=.%.@.O.B B M P . ", +"3 j f a i g.a.e.w.7.1.R I P K . ", +"3 < < > > ' | } [ [ ` O X . . " +}; diff --git a/src/pixmaps/flags_xpm/gp.xpm b/src/pixmaps/flags_xpm/gp.xpm new file mode 100644 index 00000000..7a086deb --- /dev/null +++ b/src/pixmaps/flags_xpm/gp.xpm @@ -0,0 +1,165 @@ +/* XPM */ +static const char *gp[] = { +/* columns rows colors chars-per-pixel */ +"16 11 148 2", +" c #DB0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #FB0000", +"@ c #FB0900", +"# c #F90B00", +"$ c #FF0F00", +"% c #FB1500", +"& c #F0411F", +"* c #F14624", +"= c #F24328", +"- c #F3472C", +"; c #F14929", +": c #F14A2A", +"> c #F24E2E", +", c #F24E2F", +"< c #F24F2F", +"1 c #F44A31", +"2 c #F54F36", +"3 c #F45233", +"4 c #F45334", +"5 c #F45335", +"6 c #F45435", +"7 c #F65439", +"8 c #F55738", +"9 c #F6543B", +"0 c #F5573A", +"q c #F5583B", +"w c #F7593E", +"e c #F65B3E", +"r c #F75840", +"t c #F25C40", +"y c #F65C40", +"u c #F85D43", +"i c #F85D45", +"p c #F26043", +"a c #F76043", +"s c #F76145", +"d c #F36448", +"f c #F96149", +"g c #F9614A", +"h c #F86448", +"j c #F8654A", +"k c #FA664E", +"l c #FA664F", +"z c #F4684C", +"x c #F9694D", +"c c #F9694F", +"v c #F96A4F", +"b c #F56C50", +"n c #FA6A51", +"m c #FB6953", +"M c #FB6A53", +"N c #FA6E53", +"B c #FA6E54", +"V c #FC6E57", +"C c #FB6A58", +"Z c #FA6D58", +"A c #FA7258", +"S c #FD725B", +"D c #FB755C", +"F c #FD7660", +"G c #FE7564", +"H c #00C100", +"J c #00C300", +"K c #00C500", +"L c #00C700", +"P c #00CB00", +"I c #00CD00", +"U c #00CF00", +"Y c #00D300", +"T c #00D500", +"R c #00D700", +"E c #00D900", +"W c #00DB00", +"Q c #00DD00", +"! c #00DF00", +"~ c #00E100", +"^ c #00E300", +"/ c #00E500", +"( c #00E700", +") c #00E900", +"_ c #03EB00", +"` c #09EB00", +"' c #0DED00", +"] c #1DED00", +"[ c #00F100", +"{ c #17F903", +"} c #57ED47", +"| c #59ED4B", +" . c #5CEF4D", +".. c #60F050", +"X. c #62F054", +"o. c #65F157", +"O. c #69F25B", +"+. c #6DF35F", +"@. c #71F463", +"#. c #75F567", +"$. c #75F66A", +"%. c #78F66B", +"&. c #79F76E", +"*. c #7CF76F", +"=. c #7DF772", +"-. c #7FF774", +";. c #FBB55F", +":. c #FB8862", +">. c #FE8368", +",. c #FC8677", +"<. c #81F776", +"1. c #84F878", +"2. c #84F87A", +"3. c #88F97D", +"4. c #FCD668", +"5. c #FCCA7F", +"6. c #FCE369", +"7. c #FDFA6F", +"8. c #FEE970", +"9. c #FE9382", +"0. c #C9B197", +"q. c #FDB584", +"w. c #DDBFA9", +"e. c #8BFA80", +"r. c #8FFB84", +"t. c #91FC88", +"y. c #94FC8A", +"u. c #96FC8D", +"i. c #98FC8F", +"p. c #99FC90", +"a. c #FEED88", +"s. c #EBD9C5", +"d. c #F5DFCF", +"f. c #F1F1F1", +"g. c gray95", +"h. c #F3F3F3", +"j. c #F4F4F4", +"k. c gray96", +"l. c #F6F6F6", +"z. c gray97", +"x. c #F8F8F8", +"c. c #F9F9F9", +"v. c gray98", +"b. c #FBFBFB", +"n. c gray99", +"m. c #FDFDFD", +"M. c #FEFEFE", +"N. c gray100", +/* pixels */ +"] ' ' ' ` _ ( _ ( ^ ^ ! ! E E R ", +"{ p.p.i.u.y.t.r.e.3.2.<.=.&.$.( ", +"d.M.M.M.M.M.m.M.b.b.b.z.z.z.z.w.", +"$ 9.>.G D S V M k g y w 7 5 b O ", +"% q.8.:.D A B v j s y 0 4 , z o ", +"@ a.7.4.Z B v j s y q 4 , : d o ", +"@ 5.6.;.M z j a e 0 3 , ; * p . ", +"+ ,.C M k f i w 9 2 1 - = & t ", +"s.n.b.b.b.z.z.z.j.j.h.h.h.h.h.0.", +"[ 1.=.*.$.#.@.+.O.o.X...| | } Y ", +"^ E E E R Y Y I I P L L L H H H " +}; diff --git a/src/pixmaps/flags_xpm/gq.xpm b/src/pixmaps/flags_xpm/gq.xpm new file mode 100644 index 00000000..3a4d3e20 --- /dev/null +++ b/src/pixmaps/flags_xpm/gq.xpm @@ -0,0 +1,174 @@ +/* XPM */ +static const char *gq[] = { +/* columns rows colors chars-per-pixel */ +"16 11 157 2", +" c #004300", +". c #004D00", +"X c #005D00", +"o c #006100", +"O c #006300", +"+ c #006700", +"@ c #006D00", +"# c #007100", +"$ c #007500", +"% c #007900", +"& c #007D00", +"* c #990000", +"= c #9B0000", +"- c #9D0000", +"; c #A10000", +": c #A30000", +"> c #A50000", +", c #A90000", +"< c #AB0000", +"1 c #AF0000", +"2 c #B30000", +"3 c #B70000", +"4 c #B90000", +"5 c #BD0000", +"6 c #CD0000", +"7 c #CC1D1D", +"8 c #CE201F", +"9 c #CF2424", +"0 c #D12929", +"q c #D32E2E", +"w c #D73535", +"e c #D73939", +"r c #D33E3E", +"t c #D73D3D", +"y c #D44343", +"u c #D54646", +"i c #D94242", +"p c #D64A4A", +"a c #D74C4C", +"s c #DB4848", +"d c #DE4C4B", +"f c #D85050", +"g c #D95454", +"h c #DB5757", +"j c #DD5C5C", +"k c #E05959", +"l c #DD6060", +"z c #DF6364", +"x c #E16869", +"c c #E26C6C", +"v c #E46F6F", +"b c #008100", +"n c #008300", +"m c #008700", +"M c #008900", +"N c #2CA12C", +"B c #31A431", +"V c #37A737", +"C c #3DAA3D", +"Z c #42AD42", +"A c #49AE49", +"S c #47B047", +"D c #4CB34C", +"F c #4EB44E", +"G c #51B451", +"H c #53B753", +"J c #54B754", +"K c #58B957", +"L c #59B859", +"P c #5CBA5C", +"I c #5CBB5C", +"U c #5FBD5F", +"Y c #61BE60", +"T c #65C065", +"R c #69C269", +"E c #6DC36D", +"W c #70C571", +"Q c #74C774", +"! c #77C877", +"~ c #79C979", +"^ c #7BCA7B", +"/ c #005FDD", +"( c #0071F5", +") c #007BFB", +"_ c #007DF9", +"` c #037FFD", +"' c #1389DF", +"] c #0783FD", +"[ c #0D87FD", +"{ c #1187FF", +"} c #1589FB", +"| c #1589FF", +" . c #7CBBFC", +".. c #8ABF85", +"X. c #B9BFB9", +"o. c #90C38B", +"O. c #BDC4BE", +"+. c #F8EFB6", +"@. c #F9F0B8", +"#. c #9EA5D0", +"$. c #80BEFD", +"%. c #83BFFE", +"&. c #91BEF3", +"*. c #BFC1C2", +"=. c #8FCAE9", +"-. c #88C1FC", +";. c #88C3FD", +":. c #8FC5FC", +">. c #9ACDF7", +",. c #91C8FE", +"<. c #98C9FA", +"1. c #99CBFE", +"2. c #9BCDFE", +"3. c #A1D0FD", +"4. c #C5C8C9", +"5. c #DDD7D5", +"6. c #D8DCDD", +"7. c gray87", +"8. c #DFE5DF", +"9. c #DEE2E2", +"0. c #E1E0E0", +"q. c gray89", +"w. c gray90", +"e. c #E7E7E7", +"r. c #F1EDED", +"t. c #F1EEEE", +"y. c #F2EEEE", +"u. c #F2EFEF", +"i. c #E9F7FB", +"p. c #F3F0F0", +"a. c gray95", +"s. c #F3F3F3", +"d. c #F4F1F1", +"f. c #F1F4F1", +"g. c #F2F5F2", +"h. c #F3F6F3", +"j. c #F4F7F3", +"k. c #F4F4F4", +"l. c #F4F5F5", +"z. c gray96", +"x. c #F6F6F6", +"c. c gray97", +"v. c #F8F4F4", +"b. c #F9F5F5", +"n. c #F9F6F6", +"m. c #FAF7F7", +"M. c #F5F8F5", +"N. c #F7FAF7", +"B. c #F1F6FD", +"V. c #F8F8F8", +"C. c #F8FBF8", +"Z. c #F9FBF9", +"A. c gray98", +"S. c #FBFBFB", +"D. c #F9FCF9", +"F. c gray99", +"G. c #FDFCFD", +/* pixels */ +"' M M M m n n & $ $ # @ + O X O ", +"} =.~ ~ ! Q W E R T Y I K H F . ", +"| >.Y P K J G D S Z C V B N A ", +"{ 2.3.D.A.A.N.+.+.M.j.h.h.f.h.8.", +"[ 1.$.B.G.G.A.o...c.c.c.k.k.k.e.", +"] ,.$.;.S.S.A.O.X.c.c.k.k.f.z.w.", +"` ;. .i.S.A.9.4.*.6.k.k.k.f.k.q.", +") :.<.m.m.m.v.0.0.p.p.r.r.r.p.5.", +"_ &.k d s i t e w q 0 9 8 7 r * ", +"( #.v c x z l j h g f a p u y * ", +"/ 6 5 4 3 2 2 , , > : : - * * - " +}; diff --git a/src/pixmaps/flags_xpm/gr.xpm b/src/pixmaps/flags_xpm/gr.xpm new file mode 100644 index 00000000..6b9625a6 --- /dev/null +++ b/src/pixmaps/flags_xpm/gr.xpm @@ -0,0 +1,168 @@ +/* XPM */ +static const char *gr[] = { +/* columns rows colors chars-per-pixel */ +"16 11 151 2", +" c #000087", +". c #00008B", +"X c #00008F", +"o c #000091", +"O c #000093", +"+ c #000097", +"@ c #00009B", +"# c #00009F", +"$ c #0000A3", +"% c #0000A7", +"& c #0000AB", +"* c #0001AB", +"= c #0007AD", +"- c #000FAF", +"; c #0018A1", +": c #0017B3", +"> c #001DB7", +", c #0721A9", +"< c #0A34A1", +"1 c #0023B9", +"2 c #0029BD", +"3 c #002FBF", +"4 c #0035C1", +"5 c #0335C3", +"6 c #073BC3", +"7 c #093DC3", +"8 c #093BC4", +"9 c #0D3FC5", +"0 c #2B56C8", +"q c #2D57C9", +"w c #2F58CA", +"e c #315ACB", +"r c #335CCC", +"t c #355ECD", +"y c #375FCC", +"u c #3760CD", +"i c #3961CE", +"p c #3C63CF", +"a c #3D65D0", +"s c #3F67D1", +"d c #5876C8", +"f c #4C71D4", +"g c #4D71D4", +"h c #4D72D5", +"j c #4F73D5", +"k c #7A92D9", +"l c #7C95DA", +"z c #8182C8", +"x c #8184CD", +"c c #8098DC", +"v c #849CDD", +"b c #899FD8", +"n c #889FDE", +"m c #8CA1D9", +"M c #8FA3DA", +"N c #8CA2DD", +"B c #92A5DC", +"V c #95A8DE", +"C c #97AADF", +"Z c #9BACDD", +"A c #AAB0C7", +"S c #8BA2E0", +"D c #8FA5E1", +"F c #92A7E3", +"G c #97AAE0", +"H c #9AADE1", +"J c #9DAFE2", +"K c #A0B2E3", +"L c #A3B5E5", +"P c #A6B7E6", +"I c #A9BAE7", +"U c #B3C0E4", +"Y c #B5C1E5", +"T c #B5C2E7", +"R c #B6C3E6", +"E c #B8C4E6", +"W c #BAC5E7", +"Q c #BDC8E7", +"! c #B7C4E8", +"~ c #B9C5E9", +"^ c #BBC7E8", +"/ c #BBC7E9", +"( c #B9C6ED", +") c #BDC8E9", +"_ c #BECAE9", +"` c #BCC8EA", +"' c #BFCAEA", +"] c #BECAEB", +"[ c #C8CAD6", +"{ c #D0D0D4", +"} c #D5D5D5", +"| c #D2D6DD", +" . c #C0CCEA", +".. c #C2CDEB", +"X. c #C0CBEC", +"o. c #C2CCEC", +"O. c #C4CEEC", +"+. c #C5D0ED", +"@. c #CFD7EF", +"#. c #D9DFF1", +"$. c #E2E2E2", +"%. c #E0E3ED", +"&. c #E2E4ED", +"*. c #E2E5EF", +"=. c #E8E8EC", +"-. c #E3E6F0", +";. c #E4E7F0", +":. c #E5E8F1", +">. c #E6E9F2", +",. c #E8EAF3", +"<. c #ECEEF2", +"1. c #E8ECF4", +"2. c #E9EDF5", +"3. c #EBEDF6", +"4. c #EDEFF4", +"5. c #EDEEF7", +"6. c #EEF0F4", +"7. c #EFF0F5", +"8. c #EDF0F7", +"9. c #EEF1F8", +"0. c #F0F0F1", +"q. c #F0F0F2", +"w. c #F1F2F3", +"e. c #F2F2F3", +"r. c #F3F3F4", +"t. c #F0F2F6", +"y. c #F1F3F7", +"u. c #F2F4F7", +"i. c #F4F4F5", +"p. c #F4F5F7", +"a. c #F5F5F7", +"s. c #F2F3F8", +"d. c #F3F4F9", +"f. c #F3F5FA", +"g. c #F5F6F8", +"h. c #F6F6F8", +"j. c #F6F7F9", +"k. c #F7F7F9", +"l. c #F7F7FA", +"z. c #F7F8FB", +"x. c #F7F9FC", +"c. c #F8F8F9", +"v. c #F9F9FA", +"b. c #FAFAFB", +"n. c #FBFBFB", +"m. c #F8F9FC", +"M. c #F9FAFC", +"N. c gray99", +"B. c #FDFDFD", +"V. c #FEFEFE", +"C. c gray100", +/* pixels */ +"9 9 } } 7 8 5 3 2 1 > : - = * % ", +"9 j V.V.g f z.z.z.z.l.l.l.u.u.| ", +"$.V.V.V.V.V...X.' / / / ! T ' x ", +"$.V.V.V.V.V.F D S N v l l k N ; ", +"6 j V.N.s s f.f.u.t.t.6.4.<.6.[ ", +"5 f V.N.s i i u y r e w q 0 y , ", +"=.N.n.n.l.n.l.a.a.a.e.e.e.6.e.{ ", +"G @.+.O...' ' W W W E T Y U Q z ", +"d ( I P P J J Z C C B B m b Z < ", +"#.9.9.4.3.2.2.,.>.;.*.*.*.&.%.A ", +": - = * % $ # @ + O O X . . " +}; diff --git a/src/pixmaps/flags_xpm/gs.xpm b/src/pixmaps/flags_xpm/gs.xpm new file mode 100644 index 00000000..f9a0e561 --- /dev/null +++ b/src/pixmaps/flags_xpm/gs.xpm @@ -0,0 +1,166 @@ +/* XPM */ +static const char *gs[] = { +/* columns rows colors chars-per-pixel */ +"16 11 149 2", +" c black", +". c #000005", +"X c #000007", +"o c #00000D", +"O c #000015", +"+ c #00001B", +"@ c #000023", +"# c #000027", +"$ c #000029", +"% c #00002B", +"& c #00002F", +"* c #000031", +"= c #000037", +"- c #000039", +"; c #5F0D3F", +": c #6F032D", +"> c #000043", +", c #000059", +"< c #00005D", +"1 c #0B0B64", +"2 c #15156F", +"3 c #18196D", +"4 c #00007D", +"5 c #1A1A73", +"6 c #1E1E74", +"7 c #232377", +"8 c #242474", +"9 c #2A2A79", +"0 c #29297B", +"q c #2A2A7B", +"w c #2C2C7A", +"e c #2C2C7B", +"r c #2F2F7C", +"t c #2F2F7D", +"y c #2E2E7F", +"u c #2F2F7F", +"i c #32327F", +"p c #36367F", +"a c #3A377F", +"s c #46467C", +"d c #97112D", +"f c #A52137", +"g c #FF1B00", +"h c #972F4F", +"j c #E75959", +"k c #EA655F", +"l c #FC6950", +"z c #E36261", +"x c #F06A62", +"c c #F16F67", +"v c #E57A79", +"b c #E47D7E", +"n c #F97971", +"m c #598E5E", +"M c #313182", +"N c #333382", +"B c #353581", +"V c #343483", +"C c #3B3B83", +"Z c #393984", +"A c #383986", +"S c #3A3A86", +"D c #3C3C85", +"F c #3D3C86", +"G c #3D3D86", +"H c #3F3F87", +"J c #3F3F8A", +"K c #403F8A", +"L c #40408A", +"P c #42428A", +"I c #42428C", +"U c #46468D", +"Y c #44448E", +"T c #45458E", +"R c #45458F", +"E c #48448B", +"W c #49498F", +"Q c #50498D", +"! c #494991", +"~ c #4B4B90", +"^ c #494A92", +"/ c #4E4E93", +"( c #4F4F94", +") c #505093", +"_ c #535396", +"` c #545496", +"' c #53539B", +"] c #585798", +"[ c #585899", +"{ c #5C5C9B", +"} c #5D5D9D", +"| c #61609E", +" . c #61619F", +".. c #686A99", +"X. c #75729F", +"o. c #4F67AF", +"O. c #6565A1", +"+. c #6666A3", +"@. c #6B6BA4", +"#. c #6A6AA5", +"$. c #6F6FA8", +"%. c #7070A2", +"&. c #7777A8", +"*. c #7E7EAB", +"=. c #7A7FB4", +"-. c #8A6088", +";. c #8B648D", +":. c #A47B9B", +">. c #AA7E98", +",. c #6587C7", +"<. c #77A3DB", +"1. c #7AB6F0", +"2. c #95969A", +"3. c #B5B583", +"4. c #8686B4", +"5. c #8B85B3", +"6. c #9BB8B8", +"7. c #D88085", +"8. c #D8848C", +"9. c #D38C96", +"0. c #E78D8C", +"q. c #FD9981", +"w. c #C891A0", +"e. c #DAA3AC", +"r. c #DAB3BD", +"t. c #FEBCAC", +"y. c #CAC39F", +"u. c #D3CEA2", +"i. c #FDC9B8", +"p. c #C1C1D4", +"a. c #C5C5D7", +"s. c #C8C8D9", +"d. c #CACADA", +"f. c #FFCAC4", +"g. c #FBDAC6", +"h. c #E8CAD0", +"j. c #EBCED3", +"k. c #FEDFD1", +"l. c #DEDFE6", +"z. c #E3E2E3", +"x. c #E1E1E8", +"c. c #E4E4EC", +"v. c #EBECEB", +"b. c #E8E8EC", +"n. c #E9E9EE", +"m. c #EEEEEE", +"M. c #F3F3F4", +"N. c #FDFDF7", +"B. c #F9FFFF", +/* pixels */ +"n 5., d f < : q.> & $ @ + O o X ", +"4 f.B.r.e.j.N.<.@.O.| { ` ` / ", +"g b c k j x k l W P F S V e W ", +"; h.t.v 0.i.7.>.E F 5.b.M.d.*. ", +",.k.=.9.8.1.g.:.F p c.v...x.d. ", +"h X.' ;.-.s o.w.a i M.6.m 2.n. ", +"- $.( ! T L S V i 9 l.u.3.y.a. ", +"= #.! T K S V u 9 8 &.z.m.p.$. ", +"* O.T L S V u 9 7 6 3 5 2 1 u ", +"$ | } [ ` ) ! T L F C V i r e ", +"$ + O o X " +}; diff --git a/src/pixmaps/flags_xpm/gt.xpm b/src/pixmaps/flags_xpm/gt.xpm new file mode 100644 index 00000000..10ebd599 --- /dev/null +++ b/src/pixmaps/flags_xpm/gt.xpm @@ -0,0 +1,154 @@ +/* XPM */ +static const char *gt[] = { +/* columns rows colors chars-per-pixel */ +"16 11 137 2", +" c #0000DD", +". c #0000DF", +"X c #0000E1", +"o c #0000E3", +"O c #0000E5", +"+ c #0003E7", +"@ c #0009E7", +"# c #0011E9", +"$ c #0015EB", +"% c #0019ED", +"& c #0023EF", +"* c #0025EF", +"= c #002DEF", +"- c #002DF1", +"; c #0031F3", +": c #0033F3", +"> c #0035F5", +", c #003DF7", +"< c #0045F5", +"1 c #0047F9", +"2 c #004DFB", +"3 c #0051FD", +"4 c #0053FD", +"5 c #0055FD", +"6 c #0059FD", +"7 c #005BFF", +"8 c #005DFF", +"9 c #005FFF", +"0 c #0367FF", +"q c #1F73F1", +"w c #2375F1", +"e c #2376F2", +"r c #2476F2", +"t c #2879F2", +"y c #297AF2", +"u c #297AF3", +"i c #2D7CF3", +"p c #2E7DF3", +"a c #2E7EF4", +"s c #3280F4", +"d c #3481F4", +"f c #3482F5", +"g c #3D86F2", +"h c #3883F5", +"j c #3985F5", +"k c #3986F6", +"l c #3D87F6", +"z c #3E88F6", +"x c #3F89F7", +"c c #4087F2", +"v c #4289F3", +"b c #428AF3", +"n c #448AF3", +"m c #438BF7", +"M c #478DF4", +"N c #4B8FF5", +"B c #458DF8", +"V c #458DF9", +"C c #4B90FA", +"Z c #4F93FA", +"A c #5093F5", +"S c #5596F6", +"D c #5999F7", +"F c #5E9CF7", +"G c #5094FB", +"H c #5597FA", +"J c #5497FB", +"K c #5597FC", +"L c #599BFB", +"P c #5A9BFB", +"I c #5E9CF9", +"U c #5A9BFD", +"Y c #5E9EFC", +"T c #5F9EFC", +"R c #5E9EFD", +"E c #629EF8", +"W c #66A1F9", +"Q c #66A2F9", +"! c #63A0FD", +"~ c #63A1FD", +"^ c #62A1FE", +"/ c #66A3FE", +"( c #67A3FE", +") c #68A3FA", +"_ c #6BA5FA", +"` c #6AA5FE", +"' c #6AA6FE", +"] c #6FA8FB", +"[ c #6EA8FE", +"{ c #74AAFC", +"} c #78AEFC", +"| c #7CAFFD", +" . c #7FB1FE", +".. c #7FB2FE", +"X. c #82B3FE", +"o. c #84B5FE", +"O. c #85B5FE", +"+. c #87B7FF", +"@. c #BBC1CB", +"#. c gray81", +"$. c #CBCFD7", +"%. c gray82", +"&. c LightGray", +"*. c #D7D7D7", +"=. c #D9DDE5", +"-. c #E7E7E7", +";. c #E3E7ED", +":. c #E9E9E9", +">. c gray92", +",. c #EAEEF3", +"<. c #EBEEF4", +"1. c #EDEFF4", +"2. c #ECEFF5", +"3. c #EEF1F6", +"4. c #EFF2F7", +"5. c #F4F4F4", +"6. c gray96", +"7. c #F6F6F6", +"8. c gray97", +"9. c #F0F4F8", +"0. c #F1F5F9", +"q. c #F2F4F8", +"w. c #F3F5F8", +"e. c #F3F5F9", +"r. c #F4F6FA", +"t. c #F5F7FB", +"y. c #F6F8FC", +"u. c #F7F9FD", +"i. c #F8F8F8", +"p. c #F9F9F9", +"a. c gray98", +"s. c #FBFBFB", +"d. c #F8FAFD", +"f. c #FAFBFE", +"g. c gray99", +"h. c #FDFDFD", +"j. c #FDFDFE", +/* pixels */ +"0 9 9 9 5 ;.>.>.:.-.=.> ; - * = ", +"7 +.+.o. .f.h.h.h.a.t.Q Q E F $ ", +"9 +.[ ` ^ y.h.h.a.a.t.B m z D # ", +"7 +.` ( T u.h.a.a.a.4.z l j S @ ", +"7 X.( ^ U y.a.a.p.t.9.j h d A + ", +"4 .E T K t.a.p.p.8.4.d s p N + ", +"4 | T P Z t.t.i.8.8.2.p i t M o ", +"2 } P H C t.i.8.8.5.<.t t w M . ", +"1 { H Z V q.8.8.5.5.<.w w w g . ", +", ] _ Q I 5.8.8.8.5.1.b b g g . ", +"< ; - & % $.*.&.%.#.@.. . " +}; diff --git a/src/pixmaps/flags_xpm/gu.xpm b/src/pixmaps/flags_xpm/gu.xpm new file mode 100644 index 00000000..2780db58 --- /dev/null +++ b/src/pixmaps/flags_xpm/gu.xpm @@ -0,0 +1,152 @@ +/* XPM */ +static const char *gu[] = { +/* columns rows colors chars-per-pixel */ +"16 11 135 2", +" c #D90000", +". c #DB0000", +"X c #DF0000", +"o c #E10000", +"O c #E30000", +"+ c #E50000", +"@ c #E70000", +"# c #EB0000", +"$ c #ED0000", +"% c #EF0000", +"& c #F10000", +"* c #F30000", +"= c #F50000", +"- c #F70000", +"; c #F90000", +": c #FB0000", +"> c #FB0100", +", c #FB0300", +"< c #FD0700", +"1 c #FD0900", +"2 c #A04A7B", +"3 c #C8555F", +"4 c #D5585F", +"5 c #DD6643", +"6 c #CE5665", +"7 c #D9616C", +"8 c #E56460", +"9 c #E36668", +"0 c #E56E6D", +"q c #E26D71", +"w c #AC817F", +"e c #DABC42", +"r c #7F75A9", +"t c #3558F1", +"y c #385CF1", +"u c #395CF2", +"i c #3C5EF2", +"p c #3D60F2", +"a c #4964ED", +"s c #4162F3", +"d c #4262F3", +"f c #4264F3", +"g c #4666F4", +"h c #4667F4", +"j c #4767F4", +"k c #4768F4", +"l c #4C6BF3", +"z c #4C6BF5", +"x c #4C6DF5", +"c c #506FF2", +"v c #516FF3", +"b c #516FF6", +"n c #5270F2", +"m c #5370F2", +"M c #5573F3", +"N c #5673F3", +"B c #5170F6", +"V c #5171F6", +"C c #5572F5", +"Z c #5573F6", +"A c #5674F7", +"S c #5675F7", +"D c #5875F3", +"F c #5976F4", +"G c #5B78F4", +"H c #5C7AF5", +"J c #5976F8", +"K c #5B78F8", +"L c #5C7AF9", +"P c #5D7AF9", +"I c #6564E9", +"U c #607BF5", +"Y c #617DF5", +"T c #637FF5", +"R c #607CF9", +"E c #627FF9", +"W c #617EFA", +"Q c #627EFA", +"! c #667FF8", +"~ c #C76085", +"^ c #C77B9F", +"/ c #C279A0", +"( c #6581F6", +") c #6883F6", +"_ c #6984F7", +"` c #6B85F7", +"' c #6E88F7", +"] c #6682FA", +"[ c #6783FA", +"{ c #6682FB", +"} c #6A86FB", +"| c #6B86FC", +" . c #6C87FC", +".. c #6E89F8", +"X. c #6E89FC", +"o. c #6F8AFC", +"O. c #728BF8", +"+. c #718BFB", +"@. c #728CF9", +"#. c #758FF9", +"$. c #768FF9", +"%. c #708AFD", +"&. c #708BFD", +"*. c #738CFD", +"=. c #738DFD", +"-. c #738EFD", +";. c #748EFD", +":. c #7690FE", +">. c #7790FE", +",. c #7A91FA", +"<. c #7A93FA", +"1. c #7E94FB", +"2. c #7E96FB", +"3. c #7A93FE", +"4. c #7D95FE", +"5. c #9FB889", +"6. c #A0BA8F", +"7. c #8D83A9", +"8. c #B4C1A6", +"9. c #8198FC", +"0. c #8299FC", +"q. c #849AFC", +"w. c #859CFC", +"e. c #889EFD", +"r. c #8A9EFD", +"t. c #8AA0FE", +"y. c #8CA1FE", +"u. c #8DA2FE", +"i. c #8FA4FE", +"p. c #92A5FE", +"a. c #92A6FE", +"s. c #94A8FF", +"d. c #DCCFD5", +"f. c #DDD1D6", +"g. c #D3D2D8", +/* pixels */ +"1 1 1 1 < , - , - - - & & & % % ", +"1 s.s.a.i.u.r.w.q.9.1.,.#.O.' # ", +"1 s.4.3.>.>.' ^ ^ ! Q K A V _ + ", +"1 a.3.>.=.o.w 6.g.~ J A V x ( + ", +", i.>.=.%. .q 6.8.9 Z b z k Y O ", +", i.=.X.} { 0 f.d.8 v x j f H O ", +"- r.X.} { Q 7 I 7.4 l g s p A X ", +"- q.} { Q P 6 r e 2 g s p u D . ", +"- 0.{ Q K H V 3 5 a p p u t n . ", +"- 1.,.:.@.' ` _ Y U G D D v x . ", +"& & % % % # + + + O X X . . . . " +}; diff --git a/src/pixmaps/flags_xpm/gw.xpm b/src/pixmaps/flags_xpm/gw.xpm new file mode 100644 index 00000000..7d802745 --- /dev/null +++ b/src/pixmaps/flags_xpm/gw.xpm @@ -0,0 +1,168 @@ +/* XPM */ +static const char *gw[] = { +/* columns rows colors chars-per-pixel */ +"16 11 151 2", +" c #002300", +". c #002500", +"X c #002700", +"o c #002D00", +"O c #002F00", +"+ c #003100", +"@ c #003300", +"# c #003500", +"$ c #003900", +"% c #003B00", +"& c #003D00", +"* c #004100", +"= c #004700", +"- c #5B5353", +"; c #654F4F", +": c #664F4F", +"> c #6F5858", +", c #ED0000", +"< c #EF0000", +"1 c #F10000", +"2 c #F30000", +"3 c #F50000", +"4 c #F70000", +"5 c #F90000", +"6 c #FB0000", +"7 c #FD0000", +"8 c red", +"9 c #F93A3A", +"0 c #FA3F3F", +"q c #8D7273", +"w c #D44A49", +"e c #DC5454", +"r c #FA4444", +"t c #FB4545", +"y c #FB4949", +"u c #FB4A4B", +"i c #FC4F50", +"p c #F95455", +"a c #FD5454", +"s c #F95858", +"d c #FE5959", +"f c #FA5D5D", +"g c #FD5C5C", +"h c #FE5C5C", +"j c #FE5F5F", +"k c #FB6162", +"l c #FC6666", +"z c #F66F6F", +"x c #FC6A6A", +"c c #F57676", +"v c #FE7777", +"b c #FE7979", +"n c #FF7B7A", +"m c #FF7B7B", +"M c #118F00", +"N c #0B950B", +"B c #0F970E", +"V c #109710", +"C c #139913", +"Z c #149914", +"A c #149A14", +"S c #199C19", +"D c #189D19", +"F c #199D19", +"G c #1F9F1F", +"H c #1EA01E", +"J c #1FA01F", +"K c #23A223", +"L c #24A224", +"P c #24A324", +"I c #29A429", +"U c #2AA52A", +"Y c #2CA32C", +"T c #2FA42F", +"R c #2FA72F", +"E c #2EA82E", +"W c #2FA82F", +"Q c #32A532", +"! c #33A632", +"~ c #35A835", +"^ c #34AB34", +"/ c #35AA35", +"( c #36A836", +") c #39A939", +"_ c #3BAE3A", +"` c #3DAC3D", +"' c #41A334", +"] c #47A63A", +"[ c #42AE42", +"{ c #4BA840", +"} c #46B046", +"| c #4BB34B", +" . c #5BAE50", +".. c #D7A100", +"X. c #DBA500", +"o. c #DDA900", +"O. c #DFAD00", +"+. c #E1B100", +"@. c #E5B500", +"#. c #E7B700", +"$. c #E9BB00", +"%. c #EBBF00", +"&. c #87C81A", +"*. c #8BCA1F", +"=. c #8ECB25", +"-. c #90CD2B", +";. c #94CF30", +":. c #98CF3B", +">. c #97D136", +",. c #9AD33B", +"<. c #EDC100", +"1. c #EFC500", +"2. c #F1C700", +"3. c #F3C900", +"4. c #F3CB00", +"5. c #F4F420", +"6. c #F5F525", +"7. c #F5F526", +"8. c #F6F62B", +"9. c #F6F62C", +"0. c #F7F730", +"q. c #F7F731", +"w. c #F8F836", +"e. c #F8F837", +"r. c #F5F53F", +"t. c #F9F93C", +"y. c #F9F93D", +"u. c #9DD840", +"i. c #A7D046", +"p. c #F6F644", +"a. c #FAFA41", +"s. c #FAFA42", +"d. c #FBFB46", +"f. c #FBFB47", +"g. c #F7F749", +"h. c #F7F74E", +"j. c #FCF14B", +"k. c #FCFC4B", +"l. c #FCFC4C", +"z. c #FDF151", +"x. c #FDF254", +"c. c #F8F853", +"v. c #FDFD51", +"b. c #F9F957", +"n. c #FAFA5C", +"m. c #FBFB60", +"M. c #FCFC65", +"N. c #FCFC69", +"B. c #FDFD6D", +"V. c #FEF574", +"C. c #FDFD71", +/* pixels */ +"8 8 8 8 8 4.4.2.1.1.<.%.$.#.#.+.", +"8 m m m v V.C.B.N.M.m.n.b.c.h.O.", +"8 m j g g z.v.k.f.s.y.w.q.9.g.o.", +"8 m j a a z.k.f.s.y.w.q.9.7.p.X.", +"8 c > e i j.k.a.y.e.9.9.7.5.r...", +"6 q - ; y i.,.,.>.;.-.=.*.&.:.M ", +"8 z ; w r ] ` ^ W U L G S Z ~ o ", +"6 x y r r ] ^ ! U P G F Z V ! + ", +"6 l r 0 9 ) W U K J D C B N T . ", +"3 k f s a .| } [ ` ) / ! T Y . ", +"3 1 1 < < $ = = * & $ + o o . # " +}; diff --git a/src/pixmaps/flags_xpm/gy.xpm b/src/pixmaps/flags_xpm/gy.xpm new file mode 100644 index 00000000..5e57ffd2 --- /dev/null +++ b/src/pixmaps/flags_xpm/gy.xpm @@ -0,0 +1,181 @@ +/* XPM */ +static const char *gy[] = { +/* columns rows colors chars-per-pixel */ +"16 11 164 2", +" c #000100", +". c #150900", +"X c #002700", +"o c #002900", +"O c #002D00", +"+ c #002F00", +"@ c #003300", +"# c #003500", +"$ c #003900", +"% c #003B00", +"& c #003D00", +"* c #39391D", +"= c #004100", +"- c #004300", +"; c #004500", +": c #004700", +"> c #004B00", +", c #004D00", +"< c #005700", +"1 c #005D00", +"2 c #006100", +"3 c #006300", +"4 c #006700", +"5 c #006D00", +"6 c #007100", +"7 c #007500", +"8 c #007700", +"9 c #007900", +"0 c #007D00", +"q c #007F00", +"w c #6B4E3F", +"e c #744040", +"r c #794040", +"t c #6D6241", +"y c #777046", +"u c #CD0000", +"i c #D30000", +"p c #F90000", +"a c #FB0000", +"s c #FD0000", +"d c red", +"f c #BA4444", +"g c #B24F4B", +"h c #A27554", +"j c #B57779", +"k c #D94545", +"l c #DB5959", +"z c #F64545", +"x c #FB4646", +"c c #FB4949", +"v c #FB4A49", +"b c #FC4A4B", +"n c #FC4F4F", +"m c #F44F50", +"M c #FD5353", +"N c #FD5454", +"B c #FE5858", +"V c #FE5C5C", +"C c #C1605F", +"Z c #FB6666", +"A c #FC6A6A", +"S c #FD6F6F", +"D c #FE7273", +"F c #FE7676", +"G c #FE7979", +"H c #FC7B7A", +"J c #008900", +"K c #009300", +"L c #0B950B", +"P c #0F960E", +"I c #109210", +"U c #139613", +"Y c #189619", +"T c #14981C", +"R c #15AB1B", +"E c #1E9D25", +"W c #269E26", +"Q c #2BA32F", +"! c #2CA22C", +"~ c #2CA62C", +"^ c #2FA42F", +"/ c #33A432", +"( c #32A532", +") c #31A831", +"_ c #35A835", +"` c #37AA37", +"' c #39A939", +"] c #3DA93D", +"[ c #3DAB3D", +"{ c #39A747", +"} c #39A845", +"| c #42AC42", +" . c #42AE46", +".. c #44AE44", +"X. c #46AC46", +"o. c #49B249", +"O. c #4EB44E", +"+. c #44AE50", +"@. c #47B152", +"#. c #4CB255", +"$. c #53B352", +"%. c #53B753", +"&. c #55B455", +"*. c #58B957", +"=. c #5CBB5C", +"-. c #5DBB68", +";. c #61BE60", +":. c #65BF65", +">. c #73BF68", +",. c #69C069", +"<. c #6DC06D", +"1. c #71C069", +"2. c #70C475", +"3. c #7AC377", +"4. c #71C178", +"5. c #83833B", +"6. c #9E8B3A", +"7. c #BAC03A", +"8. c #F5F525", +"9. c #F6F62B", +"0. c #F7F72F", +"q. c #E2E335", +"w. c #F7F730", +"e. c #F6F635", +"r. c #F4F636", +"t. c #F4F43C", +"y. c #F8F83C", +"u. c #F9F93C", +"i. c #8D907D", +"p. c #B0A163", +"a. c #CAD051", +"s. c #E9EA41", +"d. c #F8F845", +"f. c #E6EC5D", +"g. c #FCFC56", +"h. c #F7F75D", +"j. c #FBFB75", +"k. c #F1F67D", +"l. c #C19192", +"z. c #82C881", +"x. c #8ACF91", +"c. c #CDD5B3", +"v. c #C1E1BE", +"b. c #D5E7BC", +"n. c #F5F5A5", +"m. c #F7F7AF", +"M. c #EFF2B8", +"N. c #F2F5BE", +"B. c #F8F8BE", +"V. c #CAE8CA", +"C. c #D3E7C1", +"Z. c #D8EAC1", +"A. c #D1EACC", +"S. c #DCEDCA", +"D. c #DAF1D8", +"F. c #E2EEC8", +"G. c #F0F3C0", +"H. c #F5F8C9", +"J. c #FCFDCD", +"K. c #E6F3D4", +"L. c #E8F4D2", +"P. c #EDF9DD", +"I. c #F3F3D9", +"U. c #E8EFE4", +/* pixels */ +"* { R J J 9 0 9 7 6 5 4 3 1 < < ", +"i l.c.P.D.x.2.>.,.:.;.=.*.%.O.> ", +"s G C p.k.J.K.V.-. .} ` ) ~ o.; ", +"s G V l h a.g.j.H.S.z.@.Q W ..= ", +"s F B N m g y s.y.d.m.N.C.1.&.= ", +"s D M n v x e 5.r.0.9.8.t.I.U.9 ", +"s S n v z e 6.q.0.e.n.N.b.>.$.% ", +"s A v k e 7.u.h.N.b.3.} T I / + ", +"a Z f t f.B.F.v.+.E Y U P L ^ + ", +"u j i.L.A.4.#.X.| [ ' _ / ^ Q X ", +". K 3 , > > ; = & % @ + + X # " +}; diff --git a/src/pixmaps/flags_xpm/hk.xpm b/src/pixmaps/flags_xpm/hk.xpm new file mode 100644 index 00000000..c9b4d0bc --- /dev/null +++ b/src/pixmaps/flags_xpm/hk.xpm @@ -0,0 +1,152 @@ +/* XPM */ +static const char *hk[] = { +/* columns rows colors chars-per-pixel */ +"16 11 135 2", +" c #BB0000", +". c #BD0000", +"X c #BF0000", +"o c #C10000", +"O c #C30000", +"+ c #C70000", +"@ c #C90000", +"# c #CB0000", +"$ c #CD0000", +"% c #CF0000", +"& c #D10000", +"* c #D50000", +"= c #D70000", +"- c #D90000", +"; c #DB0000", +": c #DF0000", +"> c #DF0B0B", +", c #E10000", +"< c #E30000", +"1 c #E50000", +"2 c #E70000", +"3 c #E90000", +"4 c #EB0000", +"5 c #ED0000", +"6 c #E10F0E", +"7 c #E11010", +"8 c #E11313", +"9 c #E21414", +"0 c #E31919", +"q c #E21B1B", +"w c #E41A1A", +"e c #E41F1F", +"r c #E52020", +"t c #E52424", +"y c #E62525", +"u c #E62626", +"i c #E72B2B", +"p c #E22C2C", +"a c #E32F2F", +"s c #E82C2C", +"d c #E92C2C", +"f c #EA2E2E", +"g c #E43232", +"h c #E63535", +"j c #E63636", +"k c #E83131", +"l c #E93131", +"z c #EB3131", +"x c #EA3737", +"c c #E63939", +"v c #E73B3B", +"b c #E73D3D", +"n c #EB3838", +"m c #EB3A3A", +"M c #EC3838", +"N c #EE3838", +"B c #EB3C3D", +"V c #E83F3F", +"C c #EC3E3D", +"Z c #EC3F3F", +"A c #E84242", +"S c #EC4040", +"D c #ED4242", +"F c #E94444", +"G c #E94646", +"H c #EE4444", +"J c #EE4545", +"K c #EA4949", +"L c #EB4B4B", +"P c #EF4949", +"I c #EF4A49", +"U c #EF4A4C", +"Y c #EC4E4E", +"T c #F04F4F", +"R c #F24F4F", +"E c #EC5050", +"W c #ED5353", +"Q c #ED5455", +"! c #EE5757", +"~ c #EE5858", +"^ c #EF5C5C", +"/ c #EF5D5D", +"( c #F05151", +") c #F35050", +"_ c #F05353", +"` c #F35353", +"' c #F15454", +"] c #F25454", +"[ c #F25555", +"{ c #F15656", +"} c #F35656", +"| c #F55555", +" . c #F15858", +".. c #F15959", +"X. c #F25C5C", +"o. c #F35F5F", +"O. c #F06060", +"+. c #F06162", +"@. c #F16565", +"#. c #F26666", +"$. c #F26A6A", +"%. c #F26D6D", +"&. c #F26F6F", +"*. c #F37071", +"=. c #F37273", +"-. c #F37474", +";. c #F47676", +":. c #F47777", +">. c #F57979", +",. c #F57B7A", +"<. c #F57B7B", +"1. c #F67E7E", +"2. c #F68F8F", +"3. c #FC8B8C", +"4. c #FB9696", +"5. c #F99E9F", +"6. c #F8A7A8", +"7. c #F9AAAA", +"8. c #FBAAAA", +"9. c #FABDBD", +"0. c #F7C3C3", +"q. c #FBC0C0", +"w. c #F9C5C6", +"e. c #F7CACB", +"r. c #F7CECE", +"t. c #F7CECF", +"y. c #FACDCE", +"u. c #F8D0D1", +"i. c #FCD1D1", +"p. c #F6D8D8", +"a. c #F8D8D8", +"s. c #F5E1E1", +"d. c #F8E7E7", +"f. c #FAECEC", +"g. c #FBEEEE", +/* pixels */ +"5 3 5 3 2 3 2 2 , , : ; ; = = = ", +"3 <.<.<.:.-.=.%.$.@.O.^ ! E E % ", +"3 <.o.X.~ | E 3.4.D B x k s K % ", +"5 <.X.} } } | g.9.| B k i u G # ", +"3 ;.} Q } i.q.y.w.d.r.M u e B + ", +"3 =._ R U 8.f.5.6.0.1.f e w b + ", +"2 &.Y P H S 8.u.r.p.d e 0 9 j O ", +"2 $.T D Z R a.e.2.s.M 0 9 7 g O ", +", @.J B m n R k u _ 0 8 6 > a X ", +": +./ ! ! E U G A B c j g a a ", +", ; ; = = % % # + + O O O X O " +}; diff --git a/src/pixmaps/flags_xpm/hm.xpm b/src/pixmaps/flags_xpm/hm.xpm new file mode 100644 index 00000000..56fca646 --- /dev/null +++ b/src/pixmaps/flags_xpm/hm.xpm @@ -0,0 +1,183 @@ +/* XPM */ +static const char *hm[] = { +/* columns rows colors chars-per-pixel */ +"16 11 166 2", +" c #000003", +". c #000005", +"X c #00000D", +"o c #00000F", +"O c #000013", +"+ c #000017", +"@ c #000019", +"# c #00001B", +"$ c #00001F", +"% c #000025", +"& c #000029", +"* c #00002D", +"= c #00002F", +"- c #000035", +"; c #000037", +": c #000039", +"> c #00003B", +", c #00003F", +"< c #000041", +"1 c #000049", +"2 c #00004D", +"3 c #000051", +"4 c #000053", +"5 c #000059", +"6 c #00005B", +"7 c #00005F", +"8 c #000063", +"9 c #000B73", +"0 c #753D69", +"q c #6B4575", +"w c #CD0909", +"e c #8D2743", +"r c #912541", +"t c #8F3555", +"y c #D6666A", +"u c #E26564", +"i c #E46C6B", +"p c #E7716F", +"a c #E06F70", +"s c #E97A79", +"d c #002387", +"f c #1B3B87", +"g c #003795", +"h c #203F8B", +"j c #254183", +"k c #22408A", +"l c #29468F", +"z c #28478F", +"x c #304D93", +"c c #304D94", +"v c #314D94", +"b c #314E94", +"n c #325095", +"m c #355196", +"M c #355197", +"N c #355297", +"B c #365297", +"V c #385499", +"C c #3A5699", +"Z c #3B569A", +"A c #3C5798", +"S c #3D599B", +"D c #3E5A9C", +"F c #4B4D8D", +"G c #40599A", +"H c #435C9B", +"J c #405B9D", +"K c #435D9D", +"L c #405C9E", +"P c #445E9D", +"I c #455F9E", +"U c #475E9E", +"Y c #48619F", +"T c #49639F", +"R c #405DA0", +"E c #445FA0", +"W c #4A63A1", +"Q c #4862A2", +"! c #4962A2", +"~ c #4A63A2", +"^ c #4C65A3", +"/ c #4F6AA8", +"( c #4C6CAB", +") c #4C6CAC", +"_ c #5069A4", +"` c #5068A5", +"' c #536AA6", +"] c #576AA6", +"[ c #5F6EA7", +"{ c #556EA8", +"} c #576FAA", +"| c #5271AE", +" . c #5A71A9", +".. c #5A72A9", +"X. c #5870AB", +"o. c #5B72AA", +"O. c #5D74AC", +"+. c #5D74AD", +"@. c #5A7AB6", +"#. c #667BB1", +"$. c #697EB3", +"%. c #697FB3", +"&. c #8A749B", +"*. c #8C789E", +"=. c #B77187", +"-. c #877FA7", +";. c #C77783", +":. c #E17F80", +">. c #6D81B3", +",. c #6F84B6", +"<. c #7F89B7", +"1. c #7285B8", +"2. c #7086B8", +"3. c #7186B8", +"4. c #7589BA", +"5. c #778ABB", +"6. c #778EBD", +"7. c #B38298", +"8. c #9A89A9", +"9. c #9495BB", +"0. c #A490AC", +"q. c #CA8794", +"w. c #C88B97", +"e. c #DB8C91", +"r. c #E28284", +"t. c #E68E8F", +"y. c #DCA4AA", +"u. c #DDACB3", +"i. c #DEB8BE", +"p. c #F1A4A2", +"a. c #F1A7A5", +"s. c #E8B9BE", +"d. c #8D9BC1", +"f. c #8F9EC2", +"g. c #909EC2", +"h. c #94A3C5", +"j. c #97A4C5", +"k. c #94A4C8", +"l. c #9AA9CA", +"z. c #9AA8CB", +"x. c #9DABCC", +"c. c #9FB9DB", +"v. c #A1A2C2", +"b. c #A5B2CF", +"n. c #A4B0D0", +"m. c #A6B3D0", +"M. c #ACB6D2", +"N. c #A9B5D4", +"B. c #AEB8D3", +"V. c #B2BBD4", +"C. c #B3BCD4", +"Z. c #B6BFD4", +"A. c #BAC2D9", +"S. c #BAC4DA", +"D. c #DDC3CC", +"F. c #C3CADD", +"G. c #EAC6C9", +"H. c #E8CCD1", +"J. c #EDD8DC", +"K. c #C4CCE0", +"L. c #C8D0E1", +"P. c #C9D0E2", +"I. c #E5DDE6", +"U. c #DBE0EB", +"Y. c #E0E2EA", +"T. c #E7E9F0", +/* pixels */ +";.-.g e r d 0 =.9 8 7 6 T 4 , : ", +"F G.I.u.y.G.J.n.5.1.$.K.K.m.+.: ", +"w t.s i y p a y [ / ~ #.M.B } ; ", +"t s.p.:.r.a.e.7.] x.~ D B B.>.* ", +"<.H.v.w.q.c.i.0.l.A.S.B d.C.V.% ", +"q 9.@.*.&.) 2.8.I b.X.c ~ f.Y % ", +"8 6.+.| ( ` ~ E L V B b h.b I $ ", +"7 5.X.n.P.~ E D Z B b l f k H @ ", +"6 1.X.U.T.l.D V B x z H j.f G + ", +"4 ,.>.k.F.X.X.] ` ^ I Z.Y.g.Z X ", +"2 1 , : - * & % $ @ O X j . " +}; diff --git a/src/pixmaps/flags_xpm/hn.xpm b/src/pixmaps/flags_xpm/hn.xpm new file mode 100644 index 00000000..022157db --- /dev/null +++ b/src/pixmaps/flags_xpm/hn.xpm @@ -0,0 +1,169 @@ +/* XPM */ +static const char *hn[] = { +/* columns rows colors chars-per-pixel */ +"16 11 152 2", +" c #00004B", +". c #00004D", +"X c #000051", +"o c #000053", +"O c #000055", +"+ c #000057", +"@ c #000059", +"# c #00005F", +"$ c #000063", +"% c #000067", +"& c #00006D", +"* c #00006F", +"= c #000071", +"- c #000075", +"; c #00007B", +": c #00007F", +"> c #000083", +", c #000087", +"< c #000089", +"1 c #00008B", +"2 c #00008D", +"3 c #00008F", +"4 c #000093", +"5 c #000097", +"6 c #000399", +"7 c #00079B", +"8 c #00079D", +"9 c #000D9F", +"0 c #0011A1", +"q c #001FA5", +"w c #0B32B1", +"e c #0F36B2", +"r c #1339B4", +"t c #183EB8", +"y c #3B519B", +"u c #1E42B9", +"i c #2347BB", +"p c #294BBC", +"a c #2C4EBF", +"s c #2F50BC", +"d c #2E50BF", +"f c #3655BE", +"g c #3757BF", +"h c #455BA5", +"j c #3154C1", +"k c #3456C2", +"l c #3758C4", +"z c #3B5BC0", +"x c #3A5AC3", +"c c #3F5EC2", +"v c #3D5EC6", +"b c #3F5EC6", +"n c #4261C3", +"m c #4664C4", +"M c #4A67C6", +"N c #4262C8", +"B c #4463C8", +"V c #4766CA", +"C c #4967C8", +"Z c #4F6BC8", +"A c #4C6ACC", +"S c #536FCA", +"D c #516ECD", +"F c #5773CC", +"G c #5572CF", +"H c #5873CC", +"J c #5B76CD", +"K c #5C77CD", +"L c #5975D1", +"P c #5C78D1", +"I c #5F7BD3", +"U c #607ACF", +"Y c #607BCF", +"T c #647ED1", +"R c #657FD1", +"E c #667FD3", +"W c #6881D3", +"Q c #6983D3", +"! c #6C84D5", +"~ c #7088D6", +"^ c #748BD7", +"/ c #778FD8", +"( c #7A91DA", +") c #7B92DA", +"_ c #7D94DA", +"` c #7F95DC", +"' c #8393C9", +"] c #8797CD", +"[ c #8195D6", +"{ c #8197DC", +"} c #8498D9", +"| c #879BD9", +" . c #97A8DF", +".. c #A9B5DD", +"X. c #ABB7DE", +"o. c #A2B0E1", +"O. c #A6B5E2", +"+. c #ADB9E0", +"@. c #AEBAE0", +"#. c #AEBBE2", +"$. c #B2BDE2", +"%. c #B4BFE1", +"&. c #B0BDE4", +"*. c #B2BFE5", +"=. c #B5BFE7", +"-. c #B4C0E3", +";. c #B6C2E5", +":. c #B9C4E6", +">. c #B9C4E7", +",. c #B8C4E8", +"<. c #BBC6E9", +"1. c #BDC8E9", +"2. c #BEC8EA", +"3. c #BFCAEB", +"4. c #C1C1C1", +"5. c #C5C5C5", +"6. c gray78", +"7. c #C0CAEA", +"8. c #C1CAEC", +"9. c #C2CCEC", +"0. c #C2CDED", +"q. c #C5CFEE", +"w. c #C6D0EF", +"e. c #CDD6F0", +"r. c #D0D8F2", +"t. c gray90", +"y. c #E7E7E7", +"u. c #E3E5F1", +"i. c #EBECF1", +"p. c #EAEDF3", +"a. c #E8EBF6", +"s. c gray95", +"d. c #F3F3F3", +"f. c #F3F3F4", +"g. c #F4F4F4", +"h. c #F4F5F5", +"j. c gray96", +"k. c #F6F6F6", +"l. c gray97", +"z. c #F3F4F9", +"x. c #F3F4FB", +"c. c #F8F8F8", +"v. c #F8F9F9", +"b. c #F9F9F9", +"n. c #F9F9FA", +"m. c gray98", +"M. c #FAFAFB", +"N. c #FBFBFB", +"B. c #FBFCFB", +"V. c gray99", +"C. c #FDFDFD", +"Z. c #FEFEFE", +/* pixels */ +"q 0 0 0 9 7 6 5 4 3 3 , > : ; ; ", +"9 { { ` _ ( / ^ ! ! W T U J F * ", +"8 ) I I L G D A C N v l j a M % ", +"] r.q.0.8.9.9.1.1.,.=.*.#.#.>.h ", +"y.Z.Z.Z.z. .m.m.c.c.| i.k.d.k.6.", +"y.Z.Z.m.m.a.m.O.o.c.u.g.k.d.d.6.", +"y.V.V.m.z.} m.l.c.k.[ i.d.d.d.4.", +"' e.9.9.1.,.,.;.*.%.X.#.....%.y ", +"3 E B v z j a p i u t r e w s ", +", Q E U K F F Z M m n c z g g ", +"; > : ; - = * % $ # @ + o . . + " +}; diff --git a/src/pixmaps/flags_xpm/hr.xpm b/src/pixmaps/flags_xpm/hr.xpm new file mode 100644 index 00000000..757dceb8 --- /dev/null +++ b/src/pixmaps/flags_xpm/hr.xpm @@ -0,0 +1,146 @@ +/* XPM */ +static const char *hr[] = { +/* columns rows colors chars-per-pixel */ +"16 11 129 2", +" c #E70000", +". c #E90000", +"X c #EB0000", +"o c #ED0000", +"O c #EF0000", +"+ c #F10000", +"@ c #F30000", +"# c #F50000", +"$ c #F70000", +"% c #F90000", +"& c #FB0000", +"* c #FD0000", +"= c red", +"- c #F52626", +"; c #F62A2A", +": c #F62B2B", +"> c #F62C2C", +", c #F72F2F", +"< c #F73131", +"1 c #F43736", +"2 c #F83535", +"3 c #F83636", +"4 c #F83737", +"5 c #F93C3D", +"6 c #F64444", +"7 c #FA4040", +"8 c #FA4141", +"9 c #FA4142", +"0 c #F74949", +"q c #FC4B4B", +"w c #F75757", +"e c #F85151", +"r c #FD5454", +"t c #FE5959", +"y c #F85C5C", +"u c #FE5C5C", +"i c #FE5F5F", +"p c #F96060", +"a c #FA6565", +"s c #FB6969", +"d c #FB6E6E", +"f c #FA7374", +"g c #FB7676", +"h c #FE7979", +"j c #FD797A", +"k c #FF7B7A", +"l c #FE7B7B", +"z c #FF7B7B", +"x c #00008F", +"c c #000091", +"v c #000093", +"b c #000395", +"n c #000997", +"m c #000D9B", +"M c #00139F", +"N c #0019A3", +"B c #001FA5", +"V c #0027A9", +"C c #002DAD", +"Z c #0033AF", +"A c #0039B3", +"S c #0041B7", +"D c #0045B9", +"F c #004BBD", +"G c #0051BF", +"H c #4274A9", +"J c #0057C3", +"K c #5180B1", +"L c #3682CB", +"P c #3A85CC", +"I c #3B85CC", +"U c #3E86CD", +"Y c #3F88CD", +"T c #438ACF", +"R c #478DD1", +"E c #488DD1", +"W c #4C90D3", +"Q c #5192D1", +"! c #5494D2", +"~ c #5594D2", +"^ c #5695D3", +"/ c #5193D5", +"( c #5496D6", +") c #5896D3", +"_ c #5A98D4", +"` c #599AD7", +"' c #5D99D5", +"] c #5E9DD9", +"[ c #609CD7", +"{ c #659ED8", +"} c #62A0DB", +"| c #63A0DB", +" . c #67A3DC", +".. c #67A3DD", +"X. c #68A1DA", +"o. c #6CA4DB", +"O. c #6AA4DE", +"+. c #6FA7DD", +"@. c #6CA6DE", +"#. c #74A9DD", +"$. c #77ACDF", +"%. c #72A9E0", +"&. c #7BAFE1", +"*. c #7FB2E2", +"=. c #66C4DC", +"-. c #6EC8DF", +";. c #83B4E3", +":. c #87B6E5", +">. c #F7C8C8", +",. c #F9CCCC", +"<. c #FBD0D0", +"1. c gray89", +"2. c gray90", +"3. c #E7E7E7", +"4. c #EFEFEF", +"5. c #F0F1F1", +"6. c gray95", +"7. c #F3F3F3", +"8. c #F4F4F4", +"9. c #F4F5F5", +"0. c gray96", +"q. c #F6F6F6", +"w. c gray97", +"e. c #FBFBFB", +"r. c #FBFCFB", +"t. c gray99", +"y. c #FDFCFD", +"u. c #FDFDFD", +"i. c #FEFEFE", +/* pixels */ +"= = = = = = & & & & $ $ + + O O ", +"= z z z h z z g f d s a p y w . ", +"= z i u u r %.-.O.=.5 4 < , 0 . ", +"= z i r r e q <.9 >.1 < : - 6 ", +"u.u.u.u.u.w.<.7 ,.2 5.w.w.7.w.2.", +"u.u.u.u.e.w.7 ,.2 >.5.w.7.7.9.2.", +"u.u.u.r.e.9.,.1 >.: 4.8.7.7.9.1.", +"J :.@...{ ] K < : H E T U I ^ v ", +"G ;.o.| ] ` ( Q E E T U I L ^ x ", +"F *.&.$.#.@.o.X.{ [ ' ' ^ ! Q x ", +"D S A Z C V B N M m n b v v x x " +}; diff --git a/src/pixmaps/flags_xpm/ht.xpm b/src/pixmaps/flags_xpm/ht.xpm new file mode 100644 index 00000000..6e10b3d4 --- /dev/null +++ b/src/pixmaps/flags_xpm/ht.xpm @@ -0,0 +1,174 @@ +/* XPM */ +static const char *ht_[] = { +/* columns rows colors chars-per-pixel */ +"16 11 157 2", +" c #000079", +". c #C50000", +"X c #C90000", +"o c #CB0000", +"O c #CF0000", +"+ c #D10000", +"@ c #D30000", +"# c #D70000", +"$ c #D90000", +"% c #DB0000", +"& c #DF0000", +"* c #E10000", +"= c #E30000", +"- c #E50000", +"; c #E70000", +": c #E90000", +"> c #FD0000", +", c #E5200B", +"< c #E5240E", +"1 c #E52510", +"2 c #E72913", +"3 c #E72A14", +"4 c #E82D19", +"5 c #E82E19", +"6 c #F22814", +"7 c #F32D19", +"8 c #E9321E", +"9 c #E9321F", +"0 c #F4321F", +"q c #EB3723", +"w c #EB3724", +"e c #E73E2C", +"r c #EC3C29", +"t c #EC3C2A", +"y c #F53724", +"u c #F63B2A", +"i c #E8402F", +"p c #E8412F", +"a c #ED412E", +"s c #ED412F", +"d c #F7402F", +"f c #E94432", +"g c #E94735", +"h c #EE4634", +"j c #EE4734", +"k c #EB4B39", +"l c #EF4B3A", +"z c #EC4E3D", +"x c #F44636", +"c c #F84535", +"v c #F04C3A", +"b c #F94B3A", +"n c #F0513F", +"m c #F1513F", +"M c #ED5242", +"N c #EE5746", +"B c #EF5B4B", +"V c #F15544", +"C c #F15645", +"Z c #FA5040", +"A c #FB5445", +"S c #F25A49", +"D c #FB5A49", +"F c #FC5E4F", +"G c #EF6050", +"H c #F16455", +"J c #F26858", +"K c #F26C5D", +"L c #F37062", +"P c #F47566", +"I c #F5796A", +"U c #FD7B6F", +"Y c #000099", +"T c #00009B", +"R c #00009F", +"E c #0000A3", +"W c #0000AB", +"Q c #0000AF", +"! c #0B15AF", +"~ c #0000B1", +"^ c #0000B5", +"/ c #0001B9", +"( c #0007BB", +") c #000FBF", +"_ c #5258BE", +"` c #0013C1", +"' c #0019C3", +"] c #001FC5", +"[ c #0123C5", +"{ c #0021C7", +"} c #0325C7", +"| c #0327C7", +" . c #0527C7", +".. c #465FCF", +"X. c #565CC0", +"o. c #5A60C3", +"O. c #5F65C5", +"+. c #4B63D1", +"@. c #4F65D1", +"#. c #5068D3", +"$. c #5369D3", +"%. c #5469D3", +"&. c #546CD4", +"*. c #586DD4", +"=. c #586DD5", +"-. c #5970D6", +";. c #5D71D6", +":. c #5E74D8", +">. c #6369C7", +",. c #676DC9", +"<. c #6A70C8", +"1. c #6C72CB", +"2. c #6F76CD", +"3. c #7379CF", +"4. c #6075D5", +"5. c #677AD7", +"6. c #6175D8", +"7. c #6276D8", +"8. c #6378DA", +"9. c #6679DA", +"0. c #667ADA", +"q. c #677CDB", +"w. c #6B7ED8", +"e. c #6A7DDB", +"r. c #6B7DDB", +"t. c #787DD1", +"y. c #6F82DA", +"u. c #6B80DD", +"i. c #6E81DD", +"p. c #6F81DD", +"a. c #6F83DE", +"s. c #7B81D3", +"d. c #7F84D4", +"f. c #7284DE", +"g. c #7286DF", +"h. c #7485DC", +"j. c #7687DF", +"k. c #7889DD", +"l. c #7B8CDE", +"z. c #7689E0", +"x. c #798AE0", +"c. c #7B8DE2", +"v. c #7F8FE0", +"b. c #7C8DE2", +"n. c #7E8FE2", +"m. c #969ADC", +"M. c #8393E1", +"N. c #8696E2", +"B. c #8A99E3", +"V. c #8C9BE5", +"C. c #8F9EE5", +"Z. c #8F9EE6", +"A. c #919FE7", +"S. c #93A1E7", +"D. c #94A3E8", +"F. c #94A4E8", +"G. c #95A4E8", +/* pixels */ +" .| . .[ ] ' ` ) ( / ^ ~ Q W W ", +"| G.G.S.A.Z.V.B.N.M.M.l.k.h.y.E ", +"| D.n.c.x.j.f.i.e.9.6.;.*.%.w.R ", +"| S.c.x.j.f.i.e.9.6.;.*.$.@.5.T ", +"] Z.z.z.i.e.e.8.:.-.&.$.+...4.T ", +"! m.d.s.t.3.2.1.,.>.O.o.X._ <. ", +"> U F D A Z b c d u y 0 7 6 x = ", +": I S C M v j s t w 9 5 3 < f X ", +": P C m l j s t w 8 5 2 < < e . ", +"- L K J H G B N M z k g f e e . ", +"= = & $ $ # $ @ O O X X X . . . " +}; diff --git a/src/pixmaps/flags_xpm/hu.xpm b/src/pixmaps/flags_xpm/hu.xpm new file mode 100644 index 00000000..2d4378cd --- /dev/null +++ b/src/pixmaps/flags_xpm/hu.xpm @@ -0,0 +1,136 @@ +/* XPM */ +static const char *hu[] = { +/* columns rows colors chars-per-pixel */ +"16 11 119 2", +" c black", +". c #000100", +"X c #000700", +"o c #000D00", +"O c #001300", +"+ c #001B00", +"@ c #002100", +"# c #002700", +"$ c #002F00", +"% c #003500", +"& c #003B00", +"* c #004100", +"= c #004700", +"- c #004F00", +"; c #0B7B0B", +": c #0F7E0E", +"> c #107E10", +", c #A30000", +"< c #A90000", +"1 c #AB0000", +"2 c #AF0000", +"3 c #B30000", +"4 c #B70000", +"5 c #B90000", +"6 c #BD0000", +"7 c #BF0000", +"8 c #C30000", +"9 c #C70000", +"0 c #C90000", +"q c #CD0000", +"w c #D52626", +"e c #D72B2B", +"r c #D72C2C", +"t c #D93131", +"y c #DA3736", +"u c #DA3737", +"i c #DC3C3C", +"p c #DC3C3D", +"a c #DE4142", +"s c #DE4242", +"d c #DB4444", +"f c #DF4747", +"g c #DC4949", +"h c #DD4E4E", +"j c #DF5353", +"k c #E04B4B", +"l c #E14C4C", +"z c #E15151", +"x c #E35454", +"c c #E15757", +"v c #E45959", +"b c #E25C5C", +"n c #E45C5C", +"m c #E55F5F", +"M c #E36060", +"N c #E46565", +"B c #E66969", +"V c #E66D6D", +"C c #E87071", +"Z c #E87474", +"A c #E87777", +"S c #E97979", +"D c #EA7B7A", +"F c #EA7B7B", +"G c #138113", +"H c #148114", +"J c #188419", +"K c #198419", +"L c #1E871E", +"P c #1F871F", +"I c #238A23", +"U c #248B24", +"Y c #298D29", +"T c #2A8E2A", +"R c #2C8C2C", +"E c #2F8F2F", +"W c #2E902E", +"Q c #2F912F", +"! c #328F32", +"~ c #339032", +"^ c #359335", +"/ c #349434", +"( c #399539", +") c #3A973A", +"_ c #3D983D", +"` c #3F9A3F", +"' c #409B3F", +"] c #429942", +"[ c #449E44", +"{ c #459E45", +"} c #469D46", +"| c #4B9F4B", +" . c #49A149", +".. c #50A250", +"X. c #54A455", +"o. c #58A858", +"O. c #5DAA5D", +"+. c #61AD62", +"@. c #66AF66", +"#. c #6AB36A", +"$. c gray89", +"%. c gray90", +"&. c #E7E7E7", +"*. c gray95", +"=. c #F3F3F3", +"-. c #F4F4F4", +";. c #F4F5F5", +":. c gray96", +">. c #F6F6F6", +",. c gray97", +"<. c #F8F8F8", +"1. c #F9F9F9", +"2. c gray98", +"3. c #FBFBFB", +"4. c #FBFCFB", +"5. c gray99", +"6. c #FDFCFD", +"7. c #FDFDFD", +"8. c #FEFEFE", +/* pixels */ +"q q q q q 0 0 0 8 8 7 7 5 4 3 2 ", +"q F F F A A C V B N M b c j h 1 ", +"q F m n v x z k f a p y t r g 1 ", +"q A m c x z g f a i y t r w d , ", +"7.7.7.7.7.7.3.<.3.<.<.;.;.-.;.&.", +"7.7.7.5.5.3.3.3.<.<.;.;.-.=.=.&.", +"7.7.7.5.3.3.3.<.;.<.;.-.=.=.-.$.", +"- #. .{ ' ) ~ Q T U P K H : ~ ", +"= @.[ ` ) / E T U P J > > ; E ", +"* +.O.o.X...| { ] _ ) ^ ! E R ", +"& % $ # @ + O o X " +}; diff --git a/src/pixmaps/flags_xpm/id.xpm b/src/pixmaps/flags_xpm/id.xpm new file mode 100644 index 00000000..74f16259 --- /dev/null +++ b/src/pixmaps/flags_xpm/id.xpm @@ -0,0 +1,127 @@ +/* XPM */ +static const char *id[] = { +/* columns rows colors chars-per-pixel */ +"16 11 110 2", +" c #B50000", +". c #BB0000", +"X c #BF0000", +"o c #C10000", +"O c #C70000", +"+ c #C90000", +"@ c #CB0000", +"# c #CF0000", +"$ c #D10000", +"% c #D30000", +"& c #D50000", +"* c #D90000", +"= c #DB0000", +"- c #DD0000", +"; c #DF0000", +": c #DF0300", +"> c #DF1103", +", c #CB1F13", +"< c #DB3327", +"1 c #DD372C", +"2 c #DF3D32", +"3 c #DF4439", +"4 c #E04237", +"5 c #E2473C", +"6 c #E0483E", +"7 c #E1483E", +"8 c #E34B41", +"9 c #E24E43", +"0 c #E24E44", +"q c #E05046", +"w c #E55046", +"e c #E35248", +"r c #E35349", +"t c #E6554C", +"y c #E5574E", +"u c #E75A50", +"i c #E65C52", +"p c #E65C53", +"a c #E25E55", +"s c #E95E55", +"d c #E86056", +"f c #E86157", +"g c #E46259", +"h c #E6665E", +"j c #E9635A", +"k c #E9645B", +"l c #E9645C", +"z c #EA675D", +"x c #E76A62", +"c c #E96860", +"v c #EA6860", +"b c #EA6C64", +"n c #EB6C64", +"m c #EB6D65", +"M c #E86F66", +"N c #E9736B", +"B c #EC7068", +"V c #ED736B", +"C c #EA776F", +"Z c #ED766E", +"A c #EC7A73", +"S c #ED7F76", +"D c #ED817A", +"F c #EE817A", +"G c #EE847E", +"H c #EF8780", +"J c #E68E88", +"K c #F08A83", +"L c #F08B85", +"P c #F08C85", +"I c #F18E87", +"U c #E8918B", +"Y c #E9948E", +"T c #EA9791", +"R c #EC9A95", +"E c #E99E99", +"W c #ED9E98", +"Q c #EEA09B", +"! c #EFA49E", +"~ c #F0A7A1", +"^ c #F1A9A4", +"/ c #F2ABA7", +"( c #F3AEAA", +") c #F6BDB9", +"_ c #DDDDDD", +"` c #DFDFDF", +"' c #E1E1E1", +"] c gray89", +"[ c gray90", +"{ c #E7E7E7", +"} c #E9E9E9", +"| c gray92", +" . c gray93", +".. c #EDEFED", +"X. c #EFEFEF", +"o. c #F1F1F1", +"O. c gray95", +"+. c #F2F2F3", +"@. c #F3F3F3", +"#. c #F4F4F4", +"$. c gray96", +"%. c #F6F6F6", +"&. c gray97", +"*. c #F8F8F8", +"=. c #F9F9F9", +"-. c gray98", +";. c #FBFBFB", +":. c #FBFCFB", +">. c gray99", +",. c #FDFDFD", +/* pixels */ +"> ; : : ; = = = & & $ $ # @ @ O ", +"; I I I P H G D S A C N M x h X ", +"; I Z V B b z k f u y r 0 6 g X ", +"; P V B b c z d u u r 0 6 3 a . ", +"= D z j s u t w 7 5 4 2 1 < q ", +"m ) ( / ^ ~ ! Q Q R T Y U J E , ", +",.,.>.:.;.;.&.*.*.&.#.#.+.+.&.' ", +":.>.:.;.;.;.&.&.&.#.#.+.+.+.+.` ", +"*.>.>.*.*.*.*.&.#.#.+.O.O.O.O._ ", +"*.>.*.*.*.*.&.*.*.#.#.#.O.O.O._ ", +"#.#.+.O...| | { { [ [ ` ` _ _ _ " +}; diff --git a/src/pixmaps/flags_xpm/ie.xpm b/src/pixmaps/flags_xpm/ie.xpm new file mode 100644 index 00000000..21f4dff4 --- /dev/null +++ b/src/pixmaps/flags_xpm/ie.xpm @@ -0,0 +1,151 @@ +/* XPM */ +static const char *ie[] = { +/* columns rows colors chars-per-pixel */ +"16 11 134 2", +" c #005300", +". c #005B00", +"X c #006300", +"o c #006700", +"O c #006F00", +"+ c #007500", +"@ c #007700", +"# c #007B00", +"$ c #007F00", +"% c #DD0000", +"& c #DF0000", +"* c #E10000", +"= c #E30000", +"- c #E50000", +"; c #E70000", +": c #E90000", +"> c #EB0000", +", c #EF1300", +"< c #ED1B00", +"1 c #F11900", +"2 c #F31F00", +"3 c #F52100", +"4 c #F1670B", +"5 c #F1690E", +"6 c #F26A10", +"7 c #F26913", +"8 c #F26D14", +"9 c #F26E14", +"0 c #F36D19", +"q c #F36F19", +"w c #F3701A", +"e c #F4721F", +"r c #F4741F", +"t c #F47520", +"y c #F57525", +"u c #F57725", +"i c #F57A26", +"p c #F6792B", +"a c #F67B2B", +"s c #F27B2C", +"d c #F27C2F", +"f c #F27D2F", +"g c #F67C2C", +"h c #F27F32", +"j c #F37F32", +"k c #F77E31", +"l c #F37F35", +"z c #008300", +"x c #008500", +"c c #008700", +"v c #008900", +"b c #009100", +"n c #3AAA3A", +"m c #3FAE3F", +"M c #40AD3F", +"N c #44B144", +"B c #45B045", +"V c #45B145", +"C c #4BB34B", +"Z c #49B449", +"A c #4FB64F", +"S c #4FB74F", +"D c #50B550", +"F c #54B555", +"G c #54B754", +"H c #53B953", +"J c #54B954", +"K c #58B958", +"L c #59BA59", +"P c #58BB59", +"I c #58BC58", +"U c #5CBD5C", +"Y c #5DBC5D", +"T c #5FBF5F", +"R c #61BE62", +"E c #66C066", +"W c #6AC36A", +"Q c #6FC46F", +"! c #72C673", +"~ c #77C777", +"^ c #76C876", +"/ c #79C879", +"( c #7BCA7A", +") c #7BCA7B", +"_ c #F78131", +"` c #F48236", +"' c #F88237", +"] c #F4853B", +"[ c #F5893F", +"{ c #F68C44", +"} c #F78F49", +"| c #F7934E", +" . c #F89653", +".. c #F99857", +"X. c #FA995C", +"o. c #C5B5A9", +"O. c #B7C7B7", +"+. c gray79", +"@. c #CBCBCB", +"#. c gray81", +"$. c gray82", +"%. c #E1DFDB", +"&. c gray89", +"*. c gray90", +"=. c #E5E7E5", +"-. c #E7E7E7", +";. c #F3EAE2", +":. c #F4EBE4", +">. c #F5ECE5", +",. c #F4ECE6", +"<. c #F6EEE7", +"1. c #F7EFE8", +"2. c #E9F2E9", +"3. c #EAF3EA", +"4. c #EBF3EB", +"5. c #ECF4EC", +"6. c #EDF5ED", +"7. c #EEF6EE", +"8. c #EFF7EF", +"9. c #F8F0EA", +"0. c #F9F1EB", +"q. c #F4F4F4", +"w. c gray96", +"e. c #F6F6F6", +"r. c gray97", +"t. c #F0F8F0", +"y. c #F8F8F8", +"u. c #F9F9F9", +"i. c #FBFAF8", +"p. c gray98", +"a. c #FBFBFB", +"s. c gray99", +"d. c #FDFDFD", +"f. c #FDFDFE", +/* pixels */ +"b v v x z =.=.-.=.&.%.2 2 1 , < ", +"x ) ) ) ~ d.d.d.f.f.s.X... .| > ", +"x ) T U L t.d.s.u.u.0.' _ g } > ", +"v ) T J G 7.s.s.u.p.0.k g i { > ", +"x ^ J J G 7.s.u.p.r.1.p u r [ - ", +"x ! H S C 7.u.u.r.p.:.y r q ] - ", +"$ Q S Z B 5.u.y.r.r.:.t q 9 ` = ", +"# W Z V m 2.y.r.r.q.:.q 9 6 j & ", +"# R N m n 2.r.r.q.q.:.7 5 4 d & ", +"O R Y K F 2.r.r.r.q.:.l j h s % ", +"+ o X . O.$.#.@.+.o.= & % % % " +}; diff --git a/src/pixmaps/flags_xpm/il.xpm b/src/pixmaps/flags_xpm/il.xpm new file mode 100644 index 00000000..98567692 --- /dev/null +++ b/src/pixmaps/flags_xpm/il.xpm @@ -0,0 +1,109 @@ +/* XPM */ +static const char *il[] = { +/* columns rows colors chars-per-pixel */ +"16 11 92 1", +" c #0000BB", +". c #0000CF", +"X c #0025DF", +"o c #0747E9", +"O c #5884F2", +"+ c #5A85F2", +"@ c #5D87F3", +"# c #5D82F6", +"$ c #6285F7", +"% c #608AF3", +"& c #638CF4", +"* c #668FF5", +"= c #678AF8", +"- c #6B8BF9", +"; c #768EF7", +": c #708FFA", +"> c #6A91F6", +", c #6E94F7", +"< c #7197F7", +"1 c #7599F7", +"2 c #7494FB", +"3 c #759AF8", +"4 c #799DF8", +"5 c #799EF9", +"6 c #7C9FF9", +"7 c #7DA0F9", +"8 c #7FA3FA", +"9 c #BBBBBB", +"0 c gray74", +"q c gray75", +"w c #8093F6", +"e c #8194F7", +"r c #869FF5", +"t c #8399FA", +"y c #889FFA", +"u c #9B9BF9", +"i c #9F9FF8", +"p c #8DA6F7", +"a c #80A4FA", +"s c #83A5FB", +"d c #84A6FB", +"f c #8AA0FB", +"g c #87A8FC", +"h c #8AAAFC", +"j c #8DADFD", +"k c #95ABFA", +"l c #90AFFE", +"z c #92B1FE", +"x c #95B3FE", +"c c #96B4FE", +"v c #9CB1FC", +"b c #99B5FF", +"n c #C1C1C1", +"m c #C3C3C3", +"M c #C5C5C5", +"N c gray78", +"B c #CBCBCB", +"V c #CDCDCD", +"C c gray81", +"Z c LightGray", +"A c #D5D5D5", +"S c #D7D7D7", +"D c gray86", +"F c #DFDFDF", +"G c #E1E1E1", +"H c gray89", +"J c gray90", +"K c #E7E7E7", +"L c #E9E9E9", +"P c #E9E9F6", +"I c #E9E9F8", +"U c #EFEFF9", +"Y c #ECECFB", +"T c #F1F1F1", +"R c gray95", +"E c #F3F3F3", +"W c #F2F2F4", +"Q c #F4F4F4", +"! c #F4F5F5", +"~ c gray96", +"^ c #F6F6F6", +"/ c gray97", +"( c #F8F8F8", +") c #F9F9F9", +"_ c gray98", +"` c #FBFBFB", +"' c #FBFCFB", +"] c gray99", +"[ c #FDFCFD", +"{ c #FDFDFD", +"} c #FEFEFE", +"| c gray100", +/* pixels */ +"LLLLLKKJHGFDDAAZ", +"obbcxljjggsa641.", +"L}}}}}]}]_))/^/V", +"L}}}]}]fy))/^~^B", +"K}}}]v2tu=p^~~~N", +"K}`}]Y:UP$P~~R~M", +"K}`'`k-i;#r^~RRn", +"H````((ww^RRRRRq", +"H]``/`/^QQRRRRR0", +"Xd7753<,>*&%@+O ", +"DDDZZVVBNNnn0099" +}; diff --git a/src/pixmaps/flags_xpm/in.xpm b/src/pixmaps/flags_xpm/in.xpm new file mode 100644 index 00000000..1eabd326 --- /dev/null +++ b/src/pixmaps/flags_xpm/in.xpm @@ -0,0 +1,171 @@ +/* XPM */ +static const char *in[] = { +/* columns rows colors chars-per-pixel */ +"16 11 154 2", +" c #001F00", +". c #002100", +"X c #002500", +"o c #002700", +"O c #002900", +"+ c #002D00", +"@ c #003300", +"# c #003900", +"$ c #003D00", +"% c #004100", +"& c #004700", +"* c #004D00", +"= c #005300", +"- c #005900", +"; c #005D00", +": c #006300", +"> c #006900", +", c #006F00", +"< c #007300", +"1 c #389539", +"2 c #3C973C", +"3 c #3D973D", +"4 c #409940", +"5 c #419941", +"6 c #459C45", +"7 c #499F49", +"8 c #4DA14D", +"9 c #4EA24E", +"0 c #53A253", +"q c #52A452", +"w c #55A455", +"e c #56A456", +"r c #56A656", +"t c #57A757", +"y c #58A558", +"u c #59A659", +"i c #5BA85B", +"p c #5BA95B", +"a c #5BAA5B", +"s c #5FA95F", +"d c #60AC60", +"f c #62AC62", +"g c #64AF64", +"h c #65AF64", +"j c #65AE65", +"k c #69B069", +"l c #69B169", +"z c #69B269", +"x c #6DB26D", +"c c #6DB46D", +"v c #71B471", +"b c #75B775", +"n c #79B979", +"m c #7DBC7D", +"M c #E99700", +"N c #EB9B00", +"B c #ED9F00", +"V c #EFA300", +"C c #F1A500", +"Z c #F3A900", +"A c #F5AD00", +"S c #E7B100", +"D c #F7B100", +"F c #F9B300", +"G c #FBB500", +"H c #FDB900", +"J c #FDBB00", +"K c #FDBD00", +"L c #FDBF00", +"P c #FFBF00", +"I c #F6CE2C", +"U c #F7D031", +"Y c #F8D237", +"T c #FDD535", +"R c #F9D43D", +"E c #FAD542", +"W c #FBD747", +"Q c #F7D549", +"! c #F7D74E", +"~ c #FCD84C", +"^ c #F8D853", +"/ c #FDDA51", +"( c #F9D957", +") c #FDDB54", +"_ c #FEDC59", +"` c #FADB5C", +"' c #FEDE5C", +"] c #FEDF5F", +"[ c #FBDD60", +"{ c #FCDD65", +"} c #F4DA69", +"| c #F6DB6D", +" . c #FCDF69", +".. c #F7DD71", +"X. c #F8DE75", +"o. c #F5DE7E", +"O. c #FDE06D", +"+. c #FDE271", +"@. c #FEE274", +"#. c #FEE377", +"$. c #FEE479", +"%. c #FFE47A", +"&. c #FFE47B", +"*. c #7F92C7", +"=. c #80BE80", +"-. c #838CBD", +";. c #A1AAB5", +":. c #A4ACB8", +">. c #84C084", +",. c #88C388", +"<. c #D3CA90", +"1. c #D8D09A", +"2. c #FCE588", +"3. c #FCE68B", +"4. c #FDE78E", +"5. c #FEE890", +"6. c #FEEDA4", +"7. c #8495CA", +"8. c #8A9ECE", +"9. c #9AA5CF", +"0. c #96A8D3", +"q. c #97A9D5", +"w. c #A1B3DA", +"e. c #BDC0D9", +"r. c #BBC2DE", +"t. c #C4CBE4", +"y. c #C9CDE2", +"u. c gray89", +"i. c #E3E3E5", +"p. c #E3E5E7", +"a. c gray95", +"s. c #F2F2F3", +"d. c #F3F3F3", +"f. c #F2F3F4", +"g. c #F3F3F4", +"h. c #F4F4F4", +"j. c #F4F4F5", +"k. c gray96", +"l. c #F5F6F6", +"z. c #F6F6F6", +"x. c gray97", +"c. c gray98", +"v. c #FBFBFB", +"b. c #FBFCFB", +"n. c #FBFBFC", +"m. c #FBFCFC", +"M. c #FBFCFD", +"N. c #FBFDFD", +"B. c gray99", +"V. c #FCFCFD", +"C. c #FDFDFD", +"Z. c #FCFDFE", +"A. c #FDFDFE", +"S. c #FDFEFE", +/* pixels */ +"P P P P P P J H G D D A Z C V V ", +"P &.&.&.#.@.@.O.O.{ [ ` ( ^ ! N ", +"P &.] ' ' / ~ W W R R Y U I Q M ", +"T 6.5.4.4.2.1.:.;.<.X...| } o.S ", +"N.S.n.N.n.N.w.9.y.q.k.k.g.g.g.p.", +"S.S.S.v.n.v.w.w.-.8.k.j.g.s.j.i.", +"B.S.B.b.v.v.t.7.7.r.k.k.s.s.j.u.", +"< ,.x z h d p t q 9 7 6 5 3 u o ", +", =.z g d p t 0 8 7 6 4 2 1 w . ", +"> =.m n b v x z g f s p y w 0 ", +": ; - = * & $ $ # @ + O o . " +}; diff --git a/src/pixmaps/flags_xpm/io.xpm b/src/pixmaps/flags_xpm/io.xpm new file mode 100644 index 00000000..2d3a338a --- /dev/null +++ b/src/pixmaps/flags_xpm/io.xpm @@ -0,0 +1,186 @@ +/* XPM */ +static const char *io[] = { +/* columns rows colors chars-per-pixel */ +"16 11 169 2", +" c #00290F", +". c #000037", +"X c #000039", +"o c #00003D", +"O c #000041", +"+ c #000043", +"@ c #000049", +"# c #00004B", +"$ c #00004F", +"% c #000053", +"& c #000057", +"* c #000059", +"= c #00005B", +"- c #000061", +"; c #000067", +": c #00006B", +"> c #00006D", +", c #000071", +"< c #000073", +"1 c #000075", +"2 c #00007F", +"3 c #A72B53", +"4 c #A12955", +"5 c #833771", +"6 c #AA6646", +"7 c #AB6D4C", +"8 c #B07356", +"9 c #A94D73", +"0 c #C74446", +"q c #CE4542", +"w c #CE5A4E", +"e c #F55F5F", +"r c #6C9B4B", +"t c #6F9C5C", +"y c #75A551", +"u c #76A356", +"i c #79A855", +"p c #75A158", +"a c #75A15F", +"s c #7EA95F", +"d c #719A60", +"f c #7AA563", +"g c #EECC39", +"h c #81AA65", +"j c #85AC70", +"k c #99BB7F", +"l c #B2A564", +"z c #DDC945", +"x c #EFCF43", +"c c #EBD54E", +"v c #DDCD7A", +"b c #000081", +"n c #000083", +"m c #000089", +"M c #000991", +"N c #3F278B", +"B c #5B4799", +"V c #4049A7", +"C c #454DAA", +"Z c #4951AC", +"A c #4A52AC", +"S c #4E56AF", +"D c #4F57AF", +"F c #5259AE", +"G c #535AB1", +"H c #535BB2", +"J c #565FB1", +"K c #585FB4", +"L c #5960B2", +"P c #5D65B3", +"I c #5860B4", +"U c #5961B5", +"Y c #5C64B7", +"T c #5D64B7", +"R c #5E65B7", +"E c #5F67B7", +"W c #636DB1", +"Q c #6068B8", +"! c #6269B9", +"~ c #636ABA", +"^ c #656DBB", +"/ c #676FBB", +"( c #666DBC", +") c #676EBC", +"_ c #6A71BD", +"` c #6E75BF", +"' c #B57F9F", +"] c #8F75AB", +"[ c #837EBB", +"{ c #D77D8D", +"} c #94B383", +"| c #9BB597", +" . c #9287BE", +".. c #8F9BB4", +"X. c #8F93BB", +"o. c #9397BF", +"O. c #A382B1", +"+. c #FB9896", +"@. c #FB9F9C", +"#. c #F49FA1", +"$. c #C1A0BE", +"%. c #DEA7B6", +"&. c #DAA7B8", +"*. c #F5A1A0", +"=. c #FCA4A1", +"-. c #FEAAA7", +";. c #E9B6BE", +":. c #F8B4B4", +">. c #F9BFBF", +",. c #AAC59C", +"<. c #8D8AC2", +"1. c #8188C8", +"2. c #898ECC", +"3. c #998FC3", +"4. c #999DC5", +"5. c #9DA2CD", +"6. c #9DA2D0", +"7. c #9EA2D0", +"8. c #9DA2D3", +"9. c #A1A3CB", +"0. c #A9ABCF", +"q. c #B8ABCE", +"w. c #A6B1C3", +"e. c #A3A8D4", +"r. c #A7ABD6", +"t. c #A7ACD4", +"y. c #A9AED3", +"u. c #AAAED7", +"i. c #AFB3D9", +"p. c #B3B6D8", +"a. c #B1B6DD", +"s. c #B4B8D8", +"d. c #B7BBDA", +"f. c #B4B8DD", +"g. c #BBBFDF", +"h. c #B9C1D0", +"j. c #BBC0DF", +"k. c #BDC0DD", +"l. c #BCC0E0", +"z. c #BCC0E1", +"x. c #C1C5DA", +"c. c #E2C3CC", +"v. c #E0CEDC", +"b. c #F1CCD1", +"n. c #EDD4DB", +"m. c #FDD3D0", +"M. c #F2D6DC", +"N. c #F5D9DD", +"B. c #C2C4E1", +"V. c #C3C6E0", +"C. c #C2C6E2", +"Z. c #C3C6E2", +"A. c #C4C5E2", +"S. c #C7C9E4", +"D. c #DBD3E5", +"F. c #D3D4EA", +"G. c #D7D7E9", +"H. c #D4D5EB", +"J. c #D6D8EC", +"K. c #DADBEA", +"L. c #DEDFED", +"P. c #DCDDEE", +"I. c #EEDBE2", +"U. c #F5DEE2", +"Y. c #DEE0EE", +"T. c #FEE3E1", +"R. c #F5EBED", +"E. c #E0E0F1", +"W. c #F7F2F7", +/* pixels */ +"{ ] M 4 3 b 5 N b b < > : ; - ", +"B U.W.M.;.I.R.8.z.G.h.k ,.| x.0.", +"e :.-.@.+.=.*.O.( ! E f a d j & ", +"9 N.T.>.*.m.b. .u.S.f i y u } 9.", +"3.n.q.&.%.a.c.[ E I L t 7 r W # ", +"' D.E.v.$.A.P.<.e.x.u w.6 ..h 4.", +"m 2.` _ ( ! T I H D A w x 0 L + ", +"/ J.f.l.P.r.j.G.8.g.8.v q c d.o.", +"2 1./ ! T K G S A C V l g z F X ", +"P F.g.C.Y.i.C.K.y.A.y.p.8 5.s.X.", +"1 < > ; - * * % $ # + o o X . . " +}; diff --git a/src/pixmaps/flags_xpm/iq.xpm b/src/pixmaps/flags_xpm/iq.xpm new file mode 100644 index 00000000..6f87c12d --- /dev/null +++ b/src/pixmaps/flags_xpm/iq.xpm @@ -0,0 +1,158 @@ +/* XPM */ +static const char *iq[] = { +/* columns rows colors chars-per-pixel */ +"16 11 141 2", +" c black", +". c #0B0B0B", +"X c #0F0F0E", +"o c #131313", +"O c #181919", +"+ c #1E1E1E", +"@ c #232323", +"# c gray16", +"$ c #2C2C2C", +"% c gray18", +"& c #2F2F2F", +"* c #323232", +"= c #343434", +"- c #353535", +"; c #393939", +": c #3A3A3A", +"> c gray24", +", c #3F3F3F", +"< c gray26", +"1 c #444444", +"2 c #464646", +"3 c #4B4B4B", +"4 c #505050", +"5 c #545455", +"6 c #585858", +"7 c #5D5D5D", +"8 c #616162", +"9 c gray39", +"0 c gray40", +"q c #6B6A6B", +"w c #6C686C", +"e c #706E70", +"r c #737273", +"t c #787678", +"y c gray48", +"u c #7D7A7D", +"i c #7F7D7F", +"p c #E70000", +"a c #E90000", +"s c #EB0000", +"d c #ED0000", +"f c #EF0000", +"g c #F10000", +"h c #F30000", +"j c #F50000", +"k c #F70000", +"l c #F90000", +"z c #FB0000", +"x c #FD0000", +"c c red", +"v c #F62C2C", +"b c #F73131", +"n c #F83737", +"m c #FF3535", +"M c #F93C3D", +"N c #FA4242", +"B c #FB4747", +"V c #F74949", +"C c #F74E4E", +"Z c #FC4C4C", +"A c #F85353", +"S c #FD5151", +"D c #F95757", +"F c #FD5454", +"G c #FE5959", +"H c #FA5C5C", +"J c #FE5C5C", +"K c #FE5F5F", +"L c #FB6060", +"P c #FC6565", +"I c #F56A6A", +"U c #FC6969", +"Y c #FD6D6D", +"T c #F67071", +"R c #F77273", +"E c #FD7071", +"W c #F87777", +"Q c #FE7474", +"! c #FE7777", +"~ c #F67F7F", +"^ c #F97A7A", +"/ c #FE7979", +"( c #FF7B7A", +") c #FF7B7B", +"_ c #FA7E7F", +"` c #6BBF6D", +"' c #848284", +"] c #888588", +"[ c #8C8B8C", +"{ c #8D8A8D", +"} c #A0A0A0", +"| c #FB8284", +" . c #FC8585", +".. c #FD8889", +"X. c #FD8B8B", +"o. c #FE8F91", +"O. c #FE9091", +"+. c #FEA4A4", +"@. c #89CD8B", +"#. c #8DCF8E", +"$. c #8BD08D", +"%. c #8FCD92", +"&. c #95CF96", +"*. c #9BD19D", +"=. c #9CD39E", +"-. c #A8DAA9", +";. c #ADDDAE", +":. c #B3E0B4", +">. c #B4E1B7", +",. c #BCE2BD", +"<. c #BDE3BD", +"1. c #BDE0C0", +"2. c #BEE4C4", +"3. c #C1E5C4", +"4. c #C3E6C5", +"5. c #CAE7CD", +"6. c #D4ECD6", +"7. c gray89", +"8. c gray90", +"9. c #E7E7E7", +"0. c #E4F3E4", +"q. c #E7F6E7", +"w. c #E9F4E9", +"e. c #EAF5EA", +"r. c #EFF4EF", +"t. c #EEF6F1", +"y. c #EDF7F2", +"u. c gray95", +"i. c #F2F4F4", +"p. c #F4F4F4", +"a. c #F4F5F5", +"s. c gray96", +"d. c #F1F9F0", +"f. c #F5F8F8", +"g. c #F6FBFA", +"h. c #F8FCFC", +"j. c #F9FEFC", +"k. c gray99", +"l. c #FCFCFD", +"z. c #FDFDFD", +"x. c #FEFEFE", +/* pixels */ +"c c c c c z c z z z j j h h d d ", +"c ) ) ) ! Q E Y U P L H D A C s ", +"c ) K J J S S Z B N M n b v V s ", +"m +.O.X.X... .| _ ^ W R T I ~ p ", +"x.x.j.>.l.j.h.3.3.f.y.t.=.t.s.9.", +"x.x.:.$.-.2.6.@.#.5.1.%.` =.s.8.", +"l.x.k.;.q.0.d.<.,.e.w.r.&.p.p.7.", +"& } [ { ' ' i u t r e w w 9 y ", +" 0 2 , ; = & # @ + O o X . & ", +" 8 7 6 5 4 3 2 < > ; - * & $ ", +" " +}; diff --git a/src/pixmaps/flags_xpm/ir.xpm b/src/pixmaps/flags_xpm/ir.xpm new file mode 100644 index 00000000..9af86eb0 --- /dev/null +++ b/src/pixmaps/flags_xpm/ir.xpm @@ -0,0 +1,164 @@ +/* XPM */ +static const char *ir[] = { +/* columns rows colors chars-per-pixel */ +"16 11 147 2", +" c #004B00", +". c #004D00", +"X c #005D00", +"o c #006100", +"O c #006300", +"+ c #006700", +"@ c #006D00", +"# c #007100", +"$ c #007500", +"% c #007900", +"& c #007D00", +"* c #DD0000", +"= c #DF0000", +"- c #E10000", +"; c #E30000", +": c #E50000", +"> c #E70000", +", c #E90000", +"< c #EB0000", +"1 c #ED0000", +"2 c #EF0000", +"3 c #F10000", +"4 c #F30000", +"5 c #F50000", +"6 c #F70000", +"7 c #F90000", +"8 c #F10F0F", +"9 c #F11212", +"0 c #F21717", +"q c #F31C1C", +"w c #F42222", +"e c #F52727", +"r c #F22C2C", +"t c #F22F2F", +"y c #F62C2C", +"u c #F23232", +"i c #F73131", +"p c #F33535", +"a c #F83737", +"s c #F43939", +"d c #F53D3D", +"f c #F93C3C", +"g c #F64242", +"h c #F74646", +"j c #FA4141", +"k c #FA4747", +"l c #F74B4B", +"z c #F85050", +"x c #F95455", +"c c #F95858", +"v c #FA5D5D", +"b c #FB6162", +"n c #FC6969", +"m c #008100", +"M c #008300", +"N c #008500", +"B c #008700", +"V c #008900", +"C c #009100", +"Z c #2EA62D", +"A c #33A933", +"S c #3FA33F", +"D c #39AC39", +"F c #3EAF3E", +"G c #44B144", +"H c #4BB34B", +"J c #48B449", +"K c #4EB34E", +"L c #4EB74E", +"P c #53B653", +"I c #52B851", +"U c #56BA56", +"Y c #58B957", +"T c #5ABC5A", +"R c #5CBA5C", +"E c #5EBE5E", +"W c #61BD60", +"Q c #60BF61", +"! c #65BF65", +"~ c #69C169", +"^ c #6DC36D", +"/ c #70C471", +"( c #74C674", +") c #77C877", +"_ c #79C879", +"` c #7BCA7B", +"' c #7CCA7C", +"] c #DF8381", +"[ c #F78282", +"{ c #FB8585", +"} c #F88787", +"| c #F79191", +" . c #FA9B9B", +".. c #F2A5A5", +"X. c #F9A2A2", +"o. c #F4A8A8", +"O. c #F6ABAB", +"+. c #F3AFAF", +"@. c #F8B5B5", +"#. c #F9B4B6", +"$. c #FAB6B7", +"%. c #FAB9B9", +"&. c #F8BABA", +"*. c #FBBCBC", +"=. c #A3D5A3", +"-. c #AAD9AA", +";. c #AFDEB1", +":. c #B3DFB4", +">. c #B7E3B7", +",. c #B8E1B8", +"<. c #BDE4BD", +"1. c #F2C2C2", +"2. c #F3C7C7", +"3. c #F5CCCC", +"4. c #F7CCCD", +"5. c #F9D2D2", +"6. c #FBD5D5", +"7. c #C8E4C8", +"8. c #CCE7CC", +"9. c #CDE6CD", +"0. c #C9E9C9", +"q. c #CFE9CF", +"w. c #D4ECD5", +"e. c #D7EED7", +"r. c #D9EFD9", +"t. c gray89", +"y. c gray90", +"u. c #E7E7E7", +"i. c #FCE5E5", +"p. c #F8EFF1", +"a. c gray95", +"s. c #F3F3F3", +"d. c #F6F2F2", +"f. c #F4F4F4", +"g. c #F4F5F5", +"h. c gray96", +"j. c #F6F6F6", +"k. c gray97", +"l. c #FBF3F5", +"z. c #F9F7F7", +"x. c gray98", +"c. c #FBFBFB", +"v. c #FBFCFB", +"b. c gray99", +"n. c #FDFCFD", +"m. c #FDFDFD", +"M. c #FEFEFE", +/* pixels */ +"C V V V N N m & % $ # @ + O X O ", +"N ` ` ` ( ( / ^ ~ ! W R Y P K ", +"V ' E E T U I L J G F D A Z H . ", +">.0.r.<.e.>.w.:.q.:.8.-.7.=.9.S ", +"n.n.n.n.n.m.l.$.#.p.k.k.k.s.k.y.", +"n.n.m.m.m.m. .X.&.| k.g.s.s.k.y.", +"n.n.n.m.x.x.k.} [ d.k.s.s.s.s.t.", +"{ i.*.6.&.5.@.4.o.3...2...1.+.] ", +"7 n k j f a i y e w q 0 9 8 u = ", +"6 b v c x z l h g d s p u t r = ", +"6 3 3 1 1 1 , , > > - - = * * * " +}; diff --git a/src/pixmaps/flags_xpm/is.xpm b/src/pixmaps/flags_xpm/is.xpm new file mode 100644 index 00000000..caaa6446 --- /dev/null +++ b/src/pixmaps/flags_xpm/is.xpm @@ -0,0 +1,146 @@ +/* XPM */ +static const char *is[] = { +/* columns rows colors chars-per-pixel */ +"16 11 129 2", +" c #000043", +". c #000045", +"X c #000049", +"o c #00004B", +"O c #00004F", +"+ c #000055", +"@ c #000057", +"# c #00005B", +"$ c #00005D", +"% c #000061", +"& c #000065", +"* c #00006B", +"= c #000071", +"- c #000075", +"; c #00007B", +": c #00037F", +"> c #B30000", +", c #C10000", +"< c #DB0000", +"1 c #DC2422", +"2 c #DE2828", +"3 c #DF2D2C", +"4 c #E13332", +"5 c #E33837", +"6 c #E33C3B", +"7 c #E43E3C", +"8 c #E14342", +"9 c #E54241", +"0 c #E64342", +"q c #E74846", +"w c #E74847", +"e c #E74D4C", +"r c #E75655", +"t c #E95251", +"y c #E95351", +"u c #EA5756", +"i c #EA5856", +"p c #EB5B5A", +"a c #EB5C5B", +"s c #EF7877", +"d c #EF7A79", +"f c #000983", +"g c #000B83", +"h c #001187", +"j c #001189", +"k c #00178B", +"l c #00198D", +"z c #001D8F", +"x c #002D97", +"c c #002F99", +"v c #2358A5", +"b c #275CA7", +"n c #285CA8", +"m c #2B5EAA", +"M c #2C60AA", +"N c #2F62AD", +"B c #3062AD", +"V c #3466AE", +"C c #3566AF", +"Z c #396AB0", +"A c #3A6AB1", +"S c #3D6DB2", +"D c #3F6EB3", +"F c #406FB1", +"G c #4370B3", +"H c #4673B3", +"J c #4773B3", +"K c #4070B5", +"L c #4271B5", +"P c #4472B6", +"I c #4674B7", +"U c #4675B7", +"Y c #4A75B5", +"T c #4B78BA", +"R c #4D78B8", +"E c #507BB9", +"W c #557FBB", +"Q c #507CBC", +"! c #517CBC", +"~ c #537EBD", +"^ c #557FBF", +"/ c #5580BF", +"( c #5881BD", +") c #5982BD", +"_ c #5882BF", +"` c #5C84BE", +"' c #5983C0", +"] c #5A83C1", +"[ c #5D86C2", +"{ c #5F87C2", +"} c #6088C1", +"| c #658BC3", +" . c #6A8FC5", +".. c #6A90C8", +"X. c #6D91C8", +"o. c #6D93C9", +"O. c #6E93C8", +"+. c #7194C9", +"@. c #7296C9", +"#. c #7095CB", +"$. c #7598CB", +"%. c #7699CB", +"&. c #799ACC", +"*. c #7A9CCD", +"=. c #7C9ECD", +"-. c #87A5D3", +";. c #87A6D3", +":. c #89A8D3", +">. c #89A8D4", +",. c gray89", +"<. c #E7E7E7", +"1. c gray92", +"2. c #EDEFED", +"3. c gray95", +"4. c #F3F3F3", +"5. c #F4F4F4", +"6. c gray96", +"7. c #F6F6F6", +"8. c gray97", +"9. c #F8F8F8", +"0. c #F9F9F9", +"q. c gray98", +"w. c #FBFBFB", +"e. c #FBFCFB", +"r. c gray99", +"t. c #FDFCFD", +"y. c #FDFDFD", +"u. c #FDFDFE", +"i. c #FEFEFE", +/* pixels */ +"c c c c t.< t.z l h f : ; - = * ", +"c >.>.;.t.d t.=.&.%.+.o. .| } & ", +"c :.#.o.t.a t.{ ] / Q T U G ` % ", +"x ;.o...t.i t._ / Q T U F S _ # ", +"t.t.t.t.t.y w.w.9.8.8.8.8.5.6.<.", +"< s a i y e q 9 7 5 4 3 2 1 8 > ", +"t.t.t.e.e.q w.9.8.8.8.5.3.3.5.,.", +"l *.[ _ w.9 8.P S Z C B M n J X ", +"j &._ Q w.6 8.F Z C N m b b F . ", +"f @.o. .9.r 8._ W E R Y J F F . ", +": ; - = 2., 1.$ @ @ O X X . " +}; diff --git a/src/pixmaps/flags_xpm/it.xpm b/src/pixmaps/flags_xpm/it.xpm new file mode 100644 index 00000000..0f69af13 --- /dev/null +++ b/src/pixmaps/flags_xpm/it.xpm @@ -0,0 +1,129 @@ +/* XPM */ +static const char *it_[] = { +/* columns rows colors chars-per-pixel */ +"16 11 112 2", +" c #005300", +". c #005B00", +"X c #006300", +"o c #006700", +"O c #006F00", +"+ c #007500", +"@ c #007700", +"# c #007B00", +"$ c #007F00", +"% c #DD0000", +"& c #DF0000", +"* c #E10000", +"= c #E30000", +"- c #E50000", +"; c #E70000", +": c #E90000", +"> c #EB0000", +", c #ED0000", +"< c #EF0000", +"1 c #F10000", +"2 c #F30000", +"3 c #F50000", +"4 c #F10B0B", +"5 c #F10F0E", +"6 c #F21010", +"7 c #F21313", +"8 c #F21414", +"9 c #F31919", +"0 c #F31A1A", +"q c #F41F1F", +"w c #F42020", +"e c #F52525", +"r c #F52626", +"t c #F62B2B", +"y c #F22C2C", +"u c #F22F2F", +"i c #F62C2C", +"p c #F23232", +"a c #F33232", +"s c #F73131", +"d c #F33535", +"f c #F43636", +"g c #F83737", +"h c #F43B3B", +"j c #F53F3F", +"k c #F64444", +"l c #F74949", +"z c #F74E4E", +"x c #F85353", +"c c #F95757", +"v c #FA5C5C", +"b c #008300", +"n c #008500", +"m c #008700", +"M c #008900", +"N c #009100", +"B c #3AAA3A", +"V c #3FAE3F", +"C c #40AD3F", +"Z c #44B144", +"A c #45B045", +"S c #45B145", +"D c #4BB34B", +"F c #49B449", +"G c #4FB64F", +"H c #4FB74F", +"J c #50B550", +"K c #54B555", +"L c #54B754", +"P c #53B953", +"I c #54B954", +"U c #58B958", +"Y c #59BA59", +"T c #58BB59", +"R c #58BC58", +"E c #5CBD5C", +"W c #5DBC5D", +"Q c #5FBF5F", +"! c #61BE62", +"~ c #66C066", +"^ c #6AC36A", +"/ c #6FC46F", +"( c #72C673", +") c #77C777", +"_ c #76C876", +"` c #79C879", +"' c #7BCA7A", +"] c #7BCA7B", +"[ c #C1C1C1", +"{ c #C3C3C3", +"} c gray78", +"| c gray79", +" . c #CDCDCD", +".. c gray86", +"X. c #DDDDDD", +"o. c #DFDFDF", +"O. c #E1E1E1", +"+. c gray89", +"@. c gray90", +"#. c #F3F3F3", +"$. c #F4F4F4", +"%. c gray96", +"&. c #F6F6F6", +"*. c gray97", +"=. c #F8F8F8", +"-. c #F9F9F9", +";. c gray98", +":. c #FBFBFB", +">. c gray99", +",. c #FDFDFD", +"<. c #FDFDFE", +"1. c #FEFEFE", +/* pixels */ +"N M M n b @.+.O.o.X...3 2 2 < < ", +"n ] ] ] ) <.<.<.>.>.>.v c x z : ", +"n ] Q E Y <.>.:.>.:.=.g s i l : ", +"M ] Q I L >.>.:.:.=.=.s i r k ; ", +"n _ I I L >.:.:.*.*.*.i r q j ; ", +"n ( P H D :.:.-.=.*.*.e q 9 h ; ", +"$ / H F S :.-.=.*.*.*.q 9 8 d * ", +"# ^ F S V -.*.*.*.*.$.9 8 6 a & ", +"@ ! Z V B =.*.*.#.#.#.6 6 4 u & ", +"O ! Q U K =.*.*.*.*.#.d a u y & ", +"@ o X . .| } [ [ [ & & % % % " +}; diff --git a/src/pixmaps/flags_xpm/jm.xpm b/src/pixmaps/flags_xpm/jm.xpm new file mode 100644 index 00000000..4f9c668d --- /dev/null +++ b/src/pixmaps/flags_xpm/jm.xpm @@ -0,0 +1,172 @@ +/* XPM */ +static const char *jm[] = { +/* columns rows colors chars-per-pixel */ +"16 11 155 2", +" c black", +". c #130000", +"X c #121210", +"o c gray8", +"O c #191919", +"+ c gray10", +"@ c gray12", +"# c #290F00", +"$ c #002D00", +"% c #003100", +"& c #003900", +"* c #003D00", +"= c #202020", +"- c #252525", +"; c #2D2B26", +": c #39352B", +"> c #333232", +", c gray21", +"< c gray23", +"1 c #3F3F3F", +"2 c #553B00", +"3 c #004100", +"4 c #004700", +"5 c #004D00", +"6 c #005100", +"7 c #005500", +"8 c #005900", +"9 c #006300", +"0 c #006B00", +"q c #007100", +"w c #007500", +"e c #007900", +"r c #007D00", +"t c #0D7D00", +"y c #49401F", +"u c #7A6514", +"i c #4C462F", +"p c #5A512B", +"a c #444444", +"s c #494A49", +"d c #4B4B49", +"f c #4B4A4B", +"g c gray31", +"h c #504E46", +"j c #535353", +"k c gray33", +"l c #585858", +"z c #605F5C", +"x c #666045", +"c c #696349", +"v c #766E50", +"b c #6A6A6A", +"n c #6F6F6F", +"m c #7B7766", +"M c #727273", +"N c #767676", +"B c #797979", +"V c #917C2B", +"C c #008100", +"Z c #008300", +"A c #008500", +"S c #1E9C1E", +"D c #379B00", +"F c #23A123", +"G c #29A329", +"H c #2EA52E", +"J c #36A62A", +"K c #3CA82F", +"L c #39A739", +"P c #3DAC3D", +"I c #5DA919", +"U c #4AAA35", +"Y c #73B634", +"T c #70B83D", +"R c #42AE42", +"E c #46B046", +"W c #47B347", +"Q c #48B142", +"! c #4EB447", +"~ c #4BB24B", +"^ c #4CB54C", +"/ c #50B350", +"( c #51B651", +") c #67B955", +"_ c #6ABD5C", +"` c #61BB60", +"' c #65C065", +"] c #69C269", +"[ c #6DC36D", +"{ c #70C571", +"} c #74C574", +"| c #AF8F0B", +" . c #B78500", +".. c #9BBA24", +"X. c #BEA124", +"o. c #ABBE32", +"O. c #DD9300", +"+. c #D1A700", +"@. c #DBAF00", +"#. c #EDB100", +"$. c #F5BD00", +"%. c #C5A72C", +"&. c #CCAE30", +"*. c #D7B630", +"=. c #E1BE2C", +"-. c #A6C134", +";. c #A0C23C", +":. c #D7C513", +">. c #E5C300", +",. c #FFCF00", +"<. c #F1CF0E", +"1. c #ECC319", +"2. c #F4D31F", +"3. c #D2C82F", +"4. c #D5CB35", +"5. c #DBCF37", +"6. c #D0CB3C", +"7. c #F6D02A", +"8. c #F2D42F", +"9. c #F6CF31", +"0. c #F2CF3F", +"q. c #E4D23A", +"w. c #F8D536", +"e. c #F7DC31", +"r. c #F8D936", +"t. c #F9D53A", +"y. c #F9DB3B", +"u. c #F9DC3A", +"i. c #FADF3F", +"p. c #958545", +"a. c #A99959", +"s. c #928D7A", +"d. c #C5AC44", +"f. c #C8AE40", +"g. c #DABC40", +"h. c #D3B94B", +"j. c #D6BF5F", +"k. c #85C354", +"l. c #AAC94B", +"z. c #B7CC57", +"x. c #82C977", +"c. c #D3CE41", +"v. c #C0CF58", +"b. c #EECF4E", +"n. c #FBDA46", +"m. c #E6DB59", +"M. c #F8DF53", +"N. c #FBDA54", +"B. c #FDE151", +"V. c #FAE35D", +"C. c #FEE65C", +"Z. c #C8D979", +"A. c #EED362", +"S. c #F7DF7B", +"D. c #FFEA7B", +/* pixels */ +",.>.D A A Z Z r w w 0 0 9 r +.#.", +"2 S.D.Z.x.} { [ ] ' _ _ z.M.b.. ", +" s.j.C.m.k.( ^ W R T 5.e.%.c ", +" B z a.N.M.l.! Q ;.r.w.V ; a ", +" N l j v h.n.c.6.w.f.p - = 1 ", +" M j g d h g.i.r.*., - @ + < ", +" n g d x &.t.4.3.8.X.2 + o , ", +" b d p.b.r.-.K J ..2.1.u X > ", +" m f.n.q.Y H G F S I :.<.| i ", +"# A.V.v.) / ^ R R P L U o.8.=. ", +"$.@.t 8 7 6 5 4 3 * & % $ 5 .O." +}; diff --git a/src/pixmaps/flags_xpm/jo.xpm b/src/pixmaps/flags_xpm/jo.xpm new file mode 100644 index 00000000..ef300f8b --- /dev/null +++ b/src/pixmaps/flags_xpm/jo.xpm @@ -0,0 +1,137 @@ +/* XPM */ +static const char *jo[] = { +/* columns rows colors chars-per-pixel */ +"16 11 120 2", +" c black", +". c #002900", +"X c #002D00", +"o c #002F00", +"O c #003300", +"+ c #003900", +"@ c #003D00", +"# c #2C2C2C", +"$ c #313131", +"% c #373737", +"& c #3D3C3D", +"* c #004100", +"= c #004700", +"- c #004D00", +"; c #005100", +": c #005700", +"> c #005D00", +", c #006300", +"< c gray26", +"1 c gray28", +"2 c #494949", +"3 c #4C4C4C", +"4 c #4E4E4E", +"5 c #515151", +"6 c #535353", +"7 c gray33", +"8 c #585757", +"9 c gray36", +"0 c #635959", +"q c #616060", +"w c #656565", +"e c DimGray", +"r c #6D6D6D", +"t c #707071", +"y c #747474", +"u c #777777", +"i c #797979", +"p c #890000", +"a c #9B0000", +"s c #F70000", +"d c #F90000", +"f c #FB0000", +"g c #FD0000", +"h c red", +"j c #B5693F", +"k c #DC513F", +"l c #BC5C5C", +"z c #A47B7B", +"x c #DD5454", +"c c #FA4040", +"v c #FA4444", +"b c #FB4545", +"n c #FB4646", +"m c #FA4449", +"M c #FB4949", +"N c #FC4A4B", +"B c #FB4E4E", +"V c #FD4F50", +"C c #FC5555", +"Z c #FD5757", +"A c #FE5959", +"S c #FE5C5C", +"D c #FE5F5F", +"F c #E86C62", +"G c #FC6666", +"H c #FC6A6A", +"J c #FD6F6F", +"K c #EB7B7B", +"L c #FE7676", +"P c #FE7979", +"I c #FF7B7A", +"U c #189A19", +"Y c #1C9C1C", +"T c #219F21", +"R c #25A126", +"E c #2AA32A", +"W c #30A630", +"Q c #35A935", +"! c #38A738", +"~ c #3AA83A", +"^ c #3BA93B", +"/ c #3AAC3A", +"( c #3DA93D", +") c #40AC40", +"_ c #40AE40", +"` c #45AE44", +"' c #48AF48", +"] c #45B145", +"[ c #4CB24C", +"{ c #50B450", +"} c #55B655", +"| c #5AB95A", +" . c #5EBB5E", +".. c #62BE62", +"X. c #949B5D", +"o. c #F98889", +"O. c #FC8D8D", +"+. c #FE8E8E", +"@. c #F98E91", +"#. c #FC9090", +"$. c #FE9A9A", +"%. c #FB9E9E", +"&. c #FD9C9F", +"*. c gray81", +"=. c gray82", +"-. c #D5D5D5", +";. c #D7D7D7", +":. c gray95", +">. c #F3F3F3", +",. c #F4F4F4", +"<. c #F4F5F5", +"1. c gray96", +"2. c #F6F6F6", +"3. c gray97", +"4. c #F8F8F8", +"5. c #F9F9F9", +"6. c gray98", +"7. c #FBFBFB", +"8. c gray99", +"9. c #FDFDFD", +/* pixels */ +"a ", +"h K z i u y t r e w q 9 7 7 4 ", +"h I D l 0 7 5 3 1 < & % $ # 2 ", +"h L D A x %.9.6.6.6.4.3.3.3.3.;.", +"h L +.Z V Z %.6.6.3.3.3.,.,.3.-.", +"f $.9.#.M b c o.3.3.,.3.,.>.<.*.", +"h J O.B b m @.4.3.3.>.>.>.:.,.-.", +"f H M b k @.4.3.3.,.>.>.:.:.>.*.", +"f G v j ] ` / Q E E R T Y U ( X ", +"s F X... .| } { [ ' ` ` ( ! ! . ", +"p ; , > : ; - = * @ + O X X . . " +}; diff --git a/src/pixmaps/flags_xpm/jp.xpm b/src/pixmaps/flags_xpm/jp.xpm new file mode 100644 index 00000000..fd2fa643 --- /dev/null +++ b/src/pixmaps/flags_xpm/jp.xpm @@ -0,0 +1,97 @@ +/* XPM */ +static const char *jp[] = { +/* columns rows colors chars-per-pixel */ +"16 11 80 1", +" c #F52424", +". c #F52A2A", +"X c #F62A2A", +"o c #F62B2B", +"O c #F72F2F", +"+ c #F73030", +"@ c #F73737", +"# c #F83434", +"$ c #F83535", +"% c #F83636", +"& c #F93B3A", +"* c #F93B3B", +"= c #F93B3C", +"- c #F93C3C", +"; c #FA4040", +": c #FA4141", +"> c #FA4142", +", c #FB4646", +"< c #FB4747", +"1 c #FA4848", +"2 c #FC4B4B", +"3 c #F55555", +"4 c #FC5555", +"5 c #F65B5B", +"6 c #F47D7D", +"7 c #FB7979", +"8 c #FC7E7F", +"9 c #F49393", +"0 c #F89493", +"q c #F99797", +"w c #F7A1A1", +"e c #FDAAAA", +"r c #FAAFAF", +"t c #F5BBBB", +"y c #FDBBBB", +"u c gray81", +"i c gray82", +"p c LightGray", +"a c #D5D5D5", +"s c #D7D7D7", +"d c gray85", +"f c gray86", +"g c #DDDDDD", +"h c #DFDFDF", +"j c #F4D5D5", +"k c #FCD2D2", +"l c #F6DADA", +"z c #E1E3E1", +"x c #E1E3E3", +"c c gray90", +"v c #E7E7E7", +"b c #E9E9E9", +"n c gray92", +"m c gray93", +"M c #EFEFEF", +"N c #FBE7E7", +"B c #F3EFEF", +"V c #FDEAEA", +"C c #F1F1F1", +"Z c gray95", +"A c #F2F2F3", +"S c #F3F3F3", +"D c #F4F4F4", +"F c #F4F5F5", +"G c gray96", +"H c #F6F4F4", +"J c #F7F5F5", +"K c #F6F6F6", +"L c gray97", +"P c #F8F7F7", +"I c #F8F8F8", +"U c #F9F9F9", +"Y c gray98", +"T c #FBFBFB", +"R c #FBFCFB", +"E c gray99", +"W c #FDFDFD", +"Q c #FDFDFE", +"! c #FEFEFE", +"~ c gray100", +/* pixels */ +"GGGGSSSCMMnnbvcx", +"G~~~~~WWTWTTUUGh", +"S~~~~Ty87rUTUGGh", +"G~T~~e21>-0GGGGf", +"G~~TV4,>*@@lGFGs", +"S~~Tk,-&@O.tGSSs", +"M~TTN,&@O..jSSFp", +"STTTTq#O. 6SCSSp", +"MTTTTGw539BSCMSu", +"MTIIITGHHHHSSSSu", +"nvvvzhgffsppuuuu" +}; diff --git a/src/pixmaps/flags_xpm/ke.xpm b/src/pixmaps/flags_xpm/ke.xpm new file mode 100644 index 00000000..2c3a2dbe --- /dev/null +++ b/src/pixmaps/flags_xpm/ke.xpm @@ -0,0 +1,170 @@ +/* XPM */ +static const char *ke[] = { +/* columns rows colors chars-per-pixel */ +"16 11 153 2", +" c black", +". c #002900", +"X c #002D00", +"o c #002F00", +"O c #003100", +"+ c #003300", +"@ c #003500", +"# c #003900", +"$ c #003D00", +"% c #2C2C2C", +"& c #313131", +"* c #373737", +"= c #582F31", +"- c #4C3233", +"; c #4D3F3E", +": c #623C3C", +"> c #004100", +", c #004700", +"< c #004D00", +"1 c #005100", +"2 c #005700", +"3 c #005D00", +"4 c #006300", +"5 c #006700", +"6 c #006F00", +"7 c #007100", +"8 c #007900", +"9 c #414646", +"0 c #494949", +"q c #4E4E4E", +"w c #5D4343", +"e c #535353", +"r c #585757", +"t c #575C5C", +"y c gray35", +"u c gray36", +"i c #5F5F5F", +"p c #704D4D", +"a c #646363", +"s c #656666", +"d c DimGray", +"f c #6D6D6D", +"g c #727272", +"h c gray46", +"j c #777777", +"k c #797979", +"l c #7B7B7A", +"z c #7B7B7B", +"x c #BB0000", +"c c #C10000", +"v c #DF0000", +"b c #E50000", +"n c #E90000", +"m c #E0171F", +"M c #E01B21", +"N c #E11A22", +"B c #E11F27", +"V c #E22026", +"C c #E3242A", +"Z c #E3252C", +"A c #E4272D", +"S c #E5272D", +"D c #E42C32", +"F c #E52D33", +"G c #E7353A", +"H c #E4383F", +"J c #E33B41", +"K c #E03F43", +"L c #805758", +"P c #835E5E", +"I c #DC4246", +"U c #DE4348", +"Y c #DC484B", +"T c #DF4E51", +"R c #E74348", +"E c #EF474D", +"W c #E44B4E", +"Q c #EE484C", +"! c #EC4A50", +"~ c #EE4B51", +"^ c #ED5055", +"/ c #EF5155", +"( c #EE5459", +") c #F15558", +"_ c #F1555A", +"` c #F1595C", +"' c #F25D61", +"] c #E26869", +"[ c #E06C6C", +"{ c #F36165", +"} c #E77B7B", +"| c #E77F7F", +" . c #F17377", +".. c #F37578", +"X. c #F67D7F", +"o. c #0B9A0E", +"O. c #0F9C11", +"+. c #139F16", +"@. c #19A120", +"#. c #2CA434", +"$. c #36A636", +"%. c #36A937", +"&. c #34AF3A", +"*. c #38A838", +"=. c #3BA93C", +"-. c #3AB13B", +";. c #6F8239", +":. c #6E883E", +">. c #3BAD43", +",. c #3FB341", +"<. c #40AB40", +"1. c #41AC40", +"2. c #44AE44", +"3. c #44B646", +"4. c #48B148", +"5. c #4DB34D", +"6. c #51B551", +"7. c #56B756", +"8. c #5BB95B", +"9. c #5FBB5F", +"0. c #64BE64", +"q. c #68BF68", +"w. c #6CC36D", +"e. c #B19D9D", +"r. c #ABAF8F", +"t. c #D5D7BF", +"y. c #C6C8C8", +"u. c #CCCDCD", +"i. c #D5C9C9", +"p. c #DBD3C8", +"a. c #E0D9CE", +"s. c #E5D5D5", +"d. c #E9DBDB", +"f. c #EBE7E7", +"g. c #E7E8E2", +"h. c #E9EAE3", +"j. c #EAEBE4", +"k. c #EBEBE6", +"l. c #EBECE6", +"z. c #ECE9E9", +"x. c #EDEAEA", +"c. c #EDEBEA", +"v. c #EFEBEB", +"b. c #F0F1EC", +"n. c #F2F2EE", +"m. c #F3F3EF", +"M. c #F3F1F1", +"N. c #F4F2F2", +"B. c #F5F3F3", +"V. c #F4F4F0", +"C. c #F7F7F3", +"Z. c #F6F4F4", +"A. c #F7F6F6", +/* pixels */ +" ", +" z z z j h g f d s a u y e q ", +" z i u t t u.P p y.9 * & % 0 ", +"i.Z.Z.M.N.N.d.| X.d.v.c.z.f.c.e.", +"n X.{ ' ` _ p W W : G F A C R c ", +"v .( / Q Q w Y I - F C B M J x ", +"b .._ / ~ Q ; Y K = S B N m J x ", +"t.C.V.m.m.b.p.[ ] p.k.k.h.g.k.r.", +"8 w.3.,.-.&.>.:.;.#.@.+.+.o.%.+ ", +"7 q.0.9.8.7.6.5.4.2.1.<.*.*.$.. ", +"6 5 4 3 2 1 < , > $ # + X X . + " +}; diff --git a/src/pixmaps/flags_xpm/kg.xpm b/src/pixmaps/flags_xpm/kg.xpm new file mode 100644 index 00000000..070d47d0 --- /dev/null +++ b/src/pixmaps/flags_xpm/kg.xpm @@ -0,0 +1,148 @@ +/* XPM */ +static const char *kg[] = { +/* columns rows colors chars-per-pixel */ +"16 11 131 2", +" c #C70000", +". c #C90000", +"X c #CB0000", +"o c #CD0000", +"O c #D10000", +"+ c #D30000", +"@ c #D50000", +"# c #D70000", +"$ c #D90000", +"% c #DB0000", +"& c #DD0000", +"* c #E10000", +"= c #E30000", +"- c #E50000", +"; c #E70000", +": c #E90000", +"> c #EB0000", +", c #ED0000", +"< c #EF0000", +"1 c #E50B0B", +"2 c #E50F0E", +"3 c #F10000", +"4 c #E51010", +"5 c #E71313", +"6 c #E71414", +"7 c #E81919", +"8 c #E81A1A", +"9 c #E91F1F", +"0 c #E9201F", +"q c #EA281F", +"w c #EA2C1E", +"e c #E92020", +"r c #EB2525", +"t c #EB2625", +"y c #EB2626", +"u c #E72C2C", +"i c #EC2B2B", +"p c #E82F2F", +"a c #EC2C2C", +"s c #ED382E", +"d c #E93232", +"f c #ED3131", +"g c #E93535", +"h c #E93636", +"j c #EE3434", +"k c #EF3737", +"l c #EB3939", +"z c #EB3B3B", +"x c #EF3A3A", +"c c #EC3D3D", +"v c #EC3F3F", +"b c #F03C3D", +"n c #F03F3F", +"m c #F13F3F", +"M c #EE5F23", +"N c #EF4036", +"B c #F0413A", +"V c #EF6924", +"C c #EF6729", +"Z c #F26930", +"A c #ED4242", +"S c #ED4444", +"D c #EE4646", +"F c #EE4949", +"G c #EF4B4B", +"H c #EF4E4E", +"J c #F14444", +"K c #F14545", +"L c #F24842", +"P c #F24949", +"I c #F24A49", +"U c #F24A4B", +"Y c #F34F4F", +"T c #EF5050", +"R c #F35050", +"E c #F05353", +"W c #F45353", +"Q c #F45551", +"! c #F15455", +"~ c #F25757", +"^ c #F45454", +"/ c #F45951", +"( c #F25858", +") c #F55858", +"_ c #F55959", +"` c #F25C5C", +"' c #F25D5D", +"] c #F65C5C", +"[ c #F65F5F", +"{ c #F47340", +"} c #F57747", +"| c #F5764C", +" . c #F67D4B", +".. c #F36060", +"X. c #F36162", +"o. c #F46565", +"O. c #F46666", +"+. c #F56969", +"@. c #F56A6A", +"#. c #F66D6D", +"$. c #F66F6F", +"%. c #F67071", +"&. c #F77273", +"*. c #F77474", +"=. c #F77676", +"-. c #F77777", +";. c #F77979", +":. c #F87B7A", +">. c #F87B7B", +",. c #F1852B", +"<. c #F29924", +"1. c #F3942F", +"2. c #F38236", +"3. c #F5883B", +"4. c #F49735", +"5. c #F59E34", +"6. c #F69B3C", +"7. c #F4B72A", +"8. c #F6A03C", +"9. c #F5C42A", +"0. c #F6C72F", +"q. c #F5C330", +"w. c #F7C236", +"e. c #F8C03A", +"r. c #F79246", +"t. c #F6A041", +"y. c #F8A54B", +"u. c #F8CB40", +"i. c #F9C846", +"p. c #FAD442", +"a. c #FAD747", +/* pixels */ +"3 3 3 3 < < < > > ; > = = & & & ", +"3 >.>.;.-.&.&.#.+.o...' ( Q H $ ", +"3 >.[ [ ] Q / | } L c k f a F @ ", +"3 >.] ~ ^ ^ y.a.p.6.N f i y S + ", +"< =.) ^ R .i.t.r.7.Z i y 9 c + ", +"< &.W Y P r.u.3.3.0.,.y 9 8 c X ", +"> $.Y P K Z e.5.1.7.V 0 7 6 h o ", +"> @.P K J b 8.0.9.<.q 7 6 4 d X ", +"> O.K n x j s C V w 8 4 4 1 p X ", +"; X.' ( Q T Y S A z l h d p u ", +"; = = & $ @ @ @ + o o o X " +}; diff --git a/src/pixmaps/flags_xpm/kh.xpm b/src/pixmaps/flags_xpm/kh.xpm new file mode 100644 index 00000000..93ba4dc7 --- /dev/null +++ b/src/pixmaps/flags_xpm/kh.xpm @@ -0,0 +1,176 @@ +/* XPM */ +static const char *kh[] = { +/* columns rows colors chars-per-pixel */ +"16 11 159 2", +" c #000069", +". c #00007B", +"X c #00007D", +"o c #00007F", +"O c #8B0000", +"+ c #8F0000", +"@ c #970000", +"# c #BD0000", +"$ c #BF0000", +"% c #C30000", +"& c #C61010", +"* c #C81414", +"= c #C91816", +"- c #C81919", +"; c #C81A1A", +": c #C91F1F", +"> c #CC2020", +", c #CD2525", +"< c #CD2626", +"1 c #CE2B2B", +"2 c #CF2E2D", +"3 c #CF3131", +"4 c #CD3232", +"5 c #CE3232", +"6 c #CF3636", +"7 c #CF3B3B", +"8 c #D03837", +"9 c #D23839", +"0 c #D23C3C", +"q c #D33F3F", +"w c #D34444", +"e c #D84746", +"r c #D74947", +"t c #D74B4B", +"y c #D94949", +"u c #D84A49", +"i c #D94F4F", +"p c #DB4F4F", +"a c #DB5150", +"s c #DA5152", +"d c #DA5252", +"f c #DB5353", +"g c #DB5454", +"h c #DD5454", +"j c #DC5857", +"k c #DD5858", +"l c #DC5959", +"z c #DD5B5A", +"x c #DE5C5C", +"c c #DB6061", +"v c #DD6363", +"b c #DE6F6E", +"n c #E16A6A", +"m c #E26F6F", +"M c #E27273", +"N c #E47676", +"B c #E47979", +"V c #000081", +"C c #000085", +"Z c #000089", +"A c #00008B", +"S c #00008F", +"D c #000093", +"F c #000097", +"G c #000099", +"H c #00009B", +"J c #00009F", +"K c #0000A1", +"L c #0000A3", +"P c #0000A7", +"I c #0000A9", +"U c #0000AD", +"Y c #0000AF", +"T c #0000B1", +"R c #0000B3", +"E c #0007B3", +"W c #0000B7", +"Q c #0000B9", +"! c #0000BB", +"~ c #0003BD", +"^ c #0007BD", +"/ c #0007BF", +"( c #000DBF", +") c #2238B4", +"_ c #263BB7", +"` c #2B44BC", +"' c #2F47BD", +"] c #344BBF", +"[ c #4255BF", +"{ c #394FC1", +"} c #3F54C3", +"| c #3452C8", +" . c #3655C9", +".. c #3957CA", +"X. c #3D5BCB", +"o. c #4558C6", +"O. c #4459C6", +"+. c #415ECD", +"@. c #4A5DC8", +"#. c #495EC8", +"$. c #4461CE", +"%. c #4F62CA", +"&. c #4E63CB", +"*. c #4865CF", +"=. c #5263C9", +"-. c #5366CB", +";. c #5768CB", +":. c #576BCD", +">. c #5A6BCB", +",. c #5D6ECF", +"<. c #4D68D1", +"1. c #516CD3", +"2. c #556FD5", +"3. c #5670D4", +"4. c #5B75D6", +"5. c #5A74D7", +"6. c #5F77D8", +"7. c #5F78D8", +"8. c #6172D1", +"9. c #6576D2", +"0. c #6979D3", +"q. c #6B7CD5", +"w. c #6E7ED6", +"e. c #637BDA", +"r. c #647CDA", +"t. c #677FDB", +"y. c #687FDC", +"u. c #6A83DD", +"i. c #6F86DD", +"p. c #7684D5", +"a. c #738ADF", +"s. c #768CE0", +"d. c #798FE2", +"f. c #7C91E2", +"g. c #7F93E3", +"h. c #E58180", +"j. c #E59B9B", +"k. c #E8A3A3", +"l. c #8894DD", +"z. c #8095E3", +"x. c #EEDCDB", +"c. c #F5DEDD", +"v. c #F4DEDE", +"b. c #F2E2E2", +"n. c #F3E4E4", +"m. c #F6E5E5", +"M. c #F4E6E6", +"N. c #F5E6E6", +"B. c #F6E8E7", +"V. c #F7E8E8", +"C. c #F4EBEB", +"Z. c #F7EDEC", +"A. c #F7F2F2", +"S. c #F4F4F4", +"D. c #F5F4F4", +"F. c #F6F6F6", +"G. c gray97", +"H. c #F9F6F6", +"J. c #F8F8F8", +/* pixels */ +"( / ^ ^ ~ ! ! W R R U I P L J J ", +"/ z.z.g.f.f.a.a.i.u.t.e.7.5.2.G ", +"E l.w.q.0.9.8.,.:.-.=.#.o.} >.C ", +"% B x j g d t v c 0 9 3 1 < w @ ", +"% N k h d h.k c.v.r b 2 < > q @ ", +"$ M d p d N.k.N.M.j.b.3 : - 7 + ", +"$ m p y j H.V.J.A.M.S.8 ; * 6 + ", +"$ b e e N.H.Z.H.F.C.S.x.= & 3 O ", +"J p.;.=.&.#.o.} { ] ' ` _ ) [ ", +"U t.t.7.5.3.1.<.*.$.+.X... .| o ", +"U I L J G F D S A A C o o o . . " +}; diff --git a/src/pixmaps/flags_xpm/ki.xpm b/src/pixmaps/flags_xpm/ki.xpm new file mode 100644 index 00000000..07a7b892 --- /dev/null +++ b/src/pixmaps/flags_xpm/ki.xpm @@ -0,0 +1,180 @@ +/* XPM */ +static const char *ki[] = { +/* columns rows colors chars-per-pixel */ +"16 11 163 2", +" c #00004F", +". c #000051", +"X c #00005B", +"o c #00005F", +"O c #00006D", +"+ c #000073", +"@ c #000777", +"# c #00007F", +"$ c #011F73", +"% c #092377", +"& c #332F69", +"* c #B90000", +"= c #BB0000", +"- c #BF0000", +"; c #C10000", +": c #C30000", +"> c #C70000", +", c #CB0000", +"< c #CD0000", +"1 c #CF0000", +"2 c #D70000", +"3 c #DB0000", +"4 c #DD0000", +"5 c #DF0000", +"6 c #E30000", +"7 c #DD3420", +"8 c #DE3925", +"9 c #DF3C26", +"0 c #E53E2B", +"q c #E1412D", +"w c #E1412E", +"e c #E1422F", +"r c #E34331", +"t c #E34834", +"y c #E34835", +"u c #E44C3A", +"i c #E44D3B", +"p c #E4523F", +"a c #AD4945", +"s c #E25341", +"d c #E65240", +"f c #E25745", +"g c #E75545", +"h c #E85B47", +"j c #E45B4A", +"k c #E95C4C", +"l c #E6604F", +"z c #E8604E", +"x c #EE604F", +"c c #E76554", +"v c #EA6352", +"b c #EA6353", +"n c #EB6353", +"m c #EA6554", +"M c #EB6757", +"N c #E56F51", +"B c #E96F55", +"V c #EC6758", +"C c #E86A5B", +"Z c #EC6B5B", +"A c #EA6E5F", +"S c #ED6E5E", +"D c #ED6F5E", +"F c #EB7163", +"G c #ED7060", +"H c #E87C69", +"J c #E7BB48", +"K c #EF8375", +"L c #EC8574", +"P c #F08579", +"I c #F0867A", +"U c #F2877A", +"Y c #F1887B", +"T c #F1897B", +"R c #F48A7B", +"E c #F1897C", +"W c #EAC156", +"Q c #E9C257", +"! c #EBC35B", +"~ c #E8DC52", +"^ c #EADE57", +"/ c #F2E350", +"( c #F5E655", +") c #F1DD7A", +"_ c #F2DD7E", +"` c #13338F", +"' c #002391", +"] c #334B95", +"[ c #354D95", +"{ c #475785", +"} c #535F8D", +"| c #455B9F", +" . c #53618B", +".. c #5B6993", +"X. c #637199", +"o. c #5369A9", +"O. c #7F7BA5", +"+. c #4E6FC9", +"@. c #5371C6", +"#. c #5271C9", +"$. c #5B78CA", +"%. c #5F7BCC", +"&. c #5F7CD0", +"*. c #637CCA", +"=. c #627DCC", +"-. c #617DCF", +";. c #6A84CD", +":. c #6380D1", +">. c #6B84D1", +",. c #6E88D1", +"<. c #7089D1", +"1. c #7089D3", +"2. c #708BD6", +"3. c #7A91D5", +"4. c #7E94D7", +"5. c #7B93D9", +"6. c #7D97DB", +"7. c #8D99BB", +"8. c #D78D8B", +"9. c #F9C3BB", +"0. c #EFDCBE", +"q. c #879DDB", +"w. c #8E9DD8", +"e. c #8BA0DD", +"r. c #93A6DF", +"t. c #9CACDA", +"y. c #9BACDD", +"u. c #A9B7DF", +"i. c #AAB9DF", +"p. c #8BA4E1", +"a. c #91A5E0", +"s. c #AFBCE2", +"d. c #B2C0E6", +"f. c #B3C1E7", +"g. c #B7C3E6", +"h. c #B9C5E8", +"j. c #F2CDC9", +"k. c #F4CECB", +"l. c #FBCFC8", +"z. c #F1D4CF", +"x. c #E4CED2", +"c. c #E2D4DA", +"v. c #EEDBDD", +"b. c #F8D7D3", +"n. c #E4E4DE", +"m. c #F6EEDD", +"M. c #C1CAE4", +"N. c #C3CDE6", +"B. c #C6CDE6", +"V. c #C0CCEB", +"C. c #C8D0E9", +"Z. c #CBD3E8", +"A. c #CBD3EA", +"S. c #CDD5EB", +"D. c #CED7ED", +"F. c #D0D7EB", +"G. c #D0D8EF", +"H. c #D4DBEF", +"J. c #D6DDF1", +"K. c #D8DDF0", +"L. c #DEE3F3", +"P. c #E7E7E1", +"I. c #F0E5E9", +/* pixels */ +"4 4 3 4 3 3 2 2 2 < < < < > : : ", +"4 E E Y I K K _ ) H F A C c l : ", +"4 Y G D Z m v B N g d i t q j - ", +"6 I D Z V v z ! Q p i t q 9 f = ", +"6 I V m v k Q ^ ~ J r q 9 7 s * ", +"8.R l.9.x b.m.( / 0.k.0 j.z.j a ", +"O.I.p.K.v.w.6.P.n.&.*.x.*.+.c.& ", +"7.a.J.f.2.G.D.:.-.C.y.#.N.M.,. .", +"' L.6.H.f.1.>.S.C.-.$.B.t.@.Z.% ", +"o.r.V.q.q.h.g.4.3.F.s.1.i.u.;. ", +"@ | # [ ] + O X...o X .$ . { ` " +}; diff --git a/src/pixmaps/flags_xpm/km.xpm b/src/pixmaps/flags_xpm/km.xpm new file mode 100644 index 00000000..02709bcd --- /dev/null +++ b/src/pixmaps/flags_xpm/km.xpm @@ -0,0 +1,167 @@ +/* XPM */ +static const char *km[] = { +/* columns rows colors chars-per-pixel */ +"16 11 150 2", +" c #005300", +". c #005900", +"X c #005517", +"o c #006700", +"O c #006F00", +"+ c #B30000", +"@ c #B50000", +"# c #DA2E14", +"$ c #DB3510", +"% c #DC3914", +"& c #DB3119", +"* c #DD361F", +"= c #DE3D19", +"- c #DE3B24", +"; c #E13F2A", +": c #B36E3A", +"> c #DF411F", +", c #DE4B36", +"< c #D35635", +"1 c #E14624", +"2 c #E4452F", +"3 c #E24B2A", +"4 c #E84E2F", +"5 c #E05232", +"6 c #ED5134", +"7 c #4FA700", +"8 c #59963F", +"9 c #40A040", +"0 c #41A140", +"q c #46A346", +"w c #4FA751", +"e c #50A950", +"r c #53A953", +"t c #5CB05D", +"y c #60B15F", +"u c #7D9B74", +"i c #68B566", +"p c #6CB66B", +"a c #63AF71", +"s c #74B973", +"d c #7BBC7A", +"f c #82813A", +"g c #E7D600", +"h c #EAD300", +"j c #EBD400", +"k c #ECD500", +"l c #EDD600", +"z c #EED700", +"x c #EFD800", +"c c #F0D900", +"v c #F1DA00", +"b c #F2DB00", +"n c #80A562", +"m c #9DCF5C", +"M c #8EC87B", +"N c #F7F74E", +"B c #F8F853", +"V c #F9F957", +"C c #FAFA5C", +"Z c #D4EA7B", +"A c #F6F660", +"S c #F7F764", +"D c #FBFB60", +"F c #FCFC65", +"G c #F8F869", +"H c #FCFC69", +"J c #F9F96D", +"K c #FDFD6D", +"L c #F7F775", +"P c #FAFA71", +"I c #FDFD71", +"U c #FBFB75", +"Y c #FEFE74", +"T c #FEFE77", +"R c #F3F979", +"E c #FCFC79", +"W c #FEFE79", +"Q c #FDFD7D", +"! c #6D6DA7", +"~ c #0000DD", +"^ c #0000DF", +"/ c #0039C3", +"( c #0000E1", +") c #0000E3", +"_ c #0000E5", +"` c #0001E7", +"' c #0007E9", +"] c #000FEB", +"[ c #0013ED", +"{ c #001BED", +"} c #0021EF", +"| c #002FF1", +" . c #6EA7BD", +".. c #4D8AF2", +"X. c #4F8CF2", +"o. c #528FF3", +"O. c #5590F3", +"+. c #5993F4", +"@. c #5C95F5", +"#. c #6098F6", +"$. c #649BF7", +"%. c #689EF7", +"&. c #6B9FF8", +"*. c #73A2F9", +"=. c #79A3F9", +"-. c #8882BE", +";. c #8884BE", +":. c #9787B5", +">. c #DBA597", +",. c #9BCD9E", +"<. c #B9DDB9", +"1. c #FDFD86", +"2. c #8985C0", +"3. c #8986C1", +"4. c #8A87C2", +"5. c #8B89C4", +"6. c #8B8AC5", +"7. c #8B8BC7", +"8. c #8D8CC7", +"9. c #8E8DC9", +"0. c #EFD3CC", +"q. c #F1D5CE", +"w. c #F1D7D0", +"e. c #F1D8D3", +"r. c #F2D9D2", +"t. c #F3D9D3", +"y. c #F4DBD4", +"u. c #CAE4CA", +"i. c #CEE7CE", +"p. c #CFE7CF", +"a. c #D3E8D3", +"s. c #DCEDDC", +"d. c #E7E7E7", +"f. c #E8F3E8", +"g. c #EAF3EA", +"h. c #E8F4E8", +"j. c #EBF4EB", +"k. c #EEF7EE", +"l. c #ECF8F2", +"z. c #F4F4F4", +"x. c #F5F5F4", +"c. c gray96", +"v. c #F6F6F5", +"b. c #F6F6F6", +"n. c gray97", +"m. c #F8F8F8", +"M. c #F9F9F9", +"N. c gray98", +"B. c #FBFBFB", +"V. c gray99", +/* pixels */ +"7 g b b b x b b x b x x l l l l ", +"o M Z W Y Y I K H F D C V B N h ", +"O d p m R 1.W I U P J G S A L h ", +". d h.s.s i.V.M.N.M.M.n.b.z.b.d.", +". h.z.t i.e ,.k.M.N.b.b.z.z.b.d.", +". j.<.e g.q 0 u t.t.t.w.q.0.e.>.", +". j.j.e u.9 f < 2 2 - * & # , + ", +". i g.a.8 : 6 4 3 1 > = % $ 5 + ", +". i y u :.9.8.7.3.3.3.;.;.-.7.! ", +" a .=.*.&.%.$.@.@.@.O.o.X...~ ", +"X / | } { [ ] ' ` ` ( ( ~ ~ ~ ~ " +}; diff --git a/src/pixmaps/flags_xpm/kn.xpm b/src/pixmaps/flags_xpm/kn.xpm new file mode 100644 index 00000000..c2063bac --- /dev/null +++ b/src/pixmaps/flags_xpm/kn.xpm @@ -0,0 +1,162 @@ +/* XPM */ +static const char *kn[] = { +/* columns rows colors chars-per-pixel */ +"16 11 145 2", +" c black", +". c #353535", +"X c gray21", +"o c #3B3B3A", +"O c gray23", +"+ c #3B3B3C", +"@ c #4D2F00", +"# c #443F2C", +"$ c #006F00", +"% c #007300", +"& c #007900", +"* c #007D00", +"= c #007F00", +"- c #4D492F", +"; c #56502F", +": c #494330", +"> c #4A4530", +", c #4E4834", +"< c #514C36", +"1 c #554E3C", +"2 c #404048", +"3 c #4E4E4E", +"4 c #565040", +"5 c #5A5440", +"6 c #595444", +"7 c #535353", +"8 c #545251", +"9 c #615A40", +"0 c #645F41", +"q c #656149", +"w c #746F42", +"e c #6A6657", +"r c #65635D", +"t c #6D6958", +"y c #716B55", +"u c #696762", +"i c #DD0000", +"p c #DF0000", +"a c #E10000", +"s c #E30000", +"d c #E50000", +"f c #E70000", +"g c #E90000", +"h c #EB0000", +"j c #ED0000", +"k c #F10B0B", +"l c #F10F0E", +"z c #F21010", +"x c #F21313", +"c c #F21414", +"v c #F31919", +"b c #F31A1A", +"n c #F41E1E", +"m c #F41F1F", +"M c #ED3B00", +"N c #F4291F", +"B c #F52323", +"V c #F22C2C", +"C c #F22F2F", +"Z c #F53624", +"A c #F23232", +"S c #F33232", +"D c #F33535", +"F c #F43636", +"G c #F43939", +"H c #F43B3B", +"J c #F53D3D", +"K c #F53F3F", +"L c #C76D00", +"P c #F45120", +"I c #F64242", +"U c #F74646", +"Y c #008100", +"T c #008300", +"R c #008500", +"E c #008700", +"W c #008900", +"Q c #009100", +"! c #019B00", +"~ c #4CB44C", +"^ c #53BB4B", +"/ c #53BB4F", +"( c #50B550", +") c #51B551", +"_ c #51B751", +"` c #53B653", +"' c #54B954", +"] c #54BA54", +"[ c #58BC58", +"{ c #58BC59", +"} c #59BC59", +"| c #5CBD5C", +" . c #5CBE5C", +".. c #5FBF5F", +"X. c #69BF69", +"o. c #6DC84F", +"O. c #76CC47", +"+. c #73CA4B", +"@. c #6DC36D", +"#. c #6FC26F", +"$. c #71C765", +"%. c #70C571", +"&. c #72C673", +"*. c #74C774", +"=. c #76C876", +"-. c #77C877", +";. c #79C879", +":. c #79C979", +">. c #7BCA7A", +",. c #7BCA7B", +"<. c #9FA700", +"1. c #9DBF00", +"2. c #BAB12B", +"3. c #F58B24", +"4. c #F69329", +"5. c #CFBE26", +"6. c #D3BA2E", +"7. c #F4B925", +"8. c #F4BE2A", +"9. c #E6C325", +"0. c #E3C52A", +"q. c #86815C", +"w. c #868266", +"e. c #8C8879", +"r. c #8C887B", +"t. c #F78E4B", +"y. c #BADB47", +"u. c #BADD4B", +"i. c #C6C446", +"p. c #C7C849", +"a. c #CAD342", +"s. c #C9D746", +"d. c #C9DA49", +"f. c #F6C144", +"g. c #F2CA50", +"h. c #C8E060", +"j. c #C3E26A", +"k. c #87878D", +"l. c #8B8A8A", +"z. c #9D9A8E", +"x. c #A09C8A", +"c. c #DADADA", +"v. c #DFDFE0", +"b. c #E9E8E8", +"n. c #EAEAEC", +/* pixels */ +"Q W W W R R T * & % % ! <. ", +"R ,.,.,.-.*.&.@.X.$.h.q.e 7 3 ", +"W ,...| } ] ` ~ O.a.9 c.2 : q L ", +"R ;.| [ ] ` ^ y.w 1 k.n.e.6.f.g ", +"W =.[ ] ~ +.d.0 O X : e.9.P K s ", +"T &.` / u.i.1 O X > 2.7.N v H s ", +"* #.o.d.x.1 + . - 0.3.m v c F s ", +"* j.p.z.n.l.< ; 8.Z m v c z S p ", +"1.w.6 8 c.< 6.4.B m c c z k C p ", +" u r t y g.t.U I J H D S C C p ", +" @ M j g g f f s p p i i i " +}; diff --git a/src/pixmaps/flags_xpm/kp.xpm b/src/pixmaps/flags_xpm/kp.xpm new file mode 100644 index 00000000..84b8173e --- /dev/null +++ b/src/pixmaps/flags_xpm/kp.xpm @@ -0,0 +1,175 @@ +/* XPM */ +static const char *kp[] = { +/* columns rows colors chars-per-pixel */ +"16 11 158 2", +" c #C70000", +". c #CD0000", +"X c #CF0000", +"o c #D10000", +"O c #D50000", +"+ c #D70000", +"@ c #E90000", +"# c #ED0000", +"$ c #EF0000", +"% c #F10000", +"& c #F10001", +"* c #E71010", +"= c #E71414", +"- c #E91414", +"; c #E81919", +": c #EA1919", +"> c #E81A1A", +", c #E91F1F", +"< c #EB1F1F", +"1 c #E62323", +"2 c #E62727", +"3 c #E92020", +"4 c #EB2424", +"5 c #EB2525", +"6 c #EC2424", +"7 c #ED2626", +"8 c #E82B2B", +"9 c #EC2A2A", +"0 c #EC2B2B", +"q c #EE2A2A", +"w c #EE2B2B", +"e c #ED2F2F", +"r c #E93030", +"t c #EB3232", +"y c #ED3030", +"u c #EF3131", +"i c #EA3434", +"p c #E93636", +"a c #EF3434", +"s c #EF3636", +"d c #EB3B3B", +"f c #EC3939", +"g c #ED3E3E", +"h c #EC3F3F", +"j c #F03736", +"k c #F03B3C", +"l c #F13C3C", +"z c #E94343", +"x c #ED4142", +"c c #EE4444", +"v c #EC4A4C", +"b c #EE4D4D", +"n c #F24142", +"m c #F34747", +"M c #F04848", +"N c #F24D4D", +"B c #F04E4E", +"V c #ED5051", +"C c #EF5456", +"Z c #F05152", +"A c #F25858", +"S c #F0595B", +"D c #F15E5F", +"F c #EE6465", +"G c #F26161", +"H c #F26163", +"J c #F26565", +"K c #F36667", +"L c #F46969", +"P c #F76A6A", +"I c #F66F6F", +"U c #F46E71", +"Y c #F47272", +"T c #F47273", +"R c #F77273", +"E c #F67475", +"W c #F57676", +"Q c #F77676", +"! c #F67779", +"~ c #F87979", +"^ c #F97979", +"/ c #000BDD", +"( c #000FDD", +") c #0011DF", +"_ c #0019DD", +"` c #0017E1", +"' c #001DE3", +"] c #0021E5", +"[ c #0025E7", +"{ c #002BE9", +"} c #0031EB", +"| c #0037ED", +" . c #003FED", +".. c #0043EF", +"X. c #0049EF", +"o. c #0049F1", +"O. c #004FF3", +"+. c #0055F5", +"@. c #005BF7", +"#. c #035FF5", +"$. c #055FF9", +"%. c #0B63FB", +"&. c #1167FD", +"*. c #176DFD", +"=. c #1B6FFD", +"-. c #2173FD", +";. c #2575FF", +":. c #317DFF", +">. c #7FA3DD", +",. c #F68584", +"<. c #F58A8A", +"1. c #F78C8C", +"2. c #F88F8F", +"3. c #F79999", +"4. c #F9A3A3", +"5. c #9DBBEB", +"6. c #B3CDF7", +"7. c #F8C2C2", +"8. c #FAC5C5", +"9. c #FBC8C7", +"0. c #FBC8C8", +"q. c #FBC9C9", +"w. c #FACACA", +"e. c #F9D3D3", +"r. c #FBD2D2", +"t. c #FBDDDC", +"y. c #FADEDE", +"u. c #CBD9F2", +"i. c #CBDAF2", +"p. c #CDDBF3", +"a. c #CEDCF3", +"s. c #C1D9FF", +"d. c #D0DDF4", +"f. c #D1DEF5", +"g. c #D3E0F6", +"h. c #D4E1F7", +"j. c #D6E2F7", +"k. c #D7E3F7", +"l. c #D8E4F8", +"z. c #D8E5F8", +"x. c #D9E6F9", +"c. c #DAE6F9", +"v. c #DAE7F9", +"b. c #DCE8FA", +"n. c #DDE8FB", +"m. c #DEE9FC", +"M. c #DFEBFC", +"N. c #F9E1E1", +"B. c #F9E3E2", +"V. c #FDE1E1", +"C. c #F9E8E8", +"Z. c #F9EAEA", +"A. c #FCE8E8", +"S. c #E1ECFD", +"D. c #E2EDFE", +"F. c #E4EEFE", +"G. c #E5EEFE", +"H. c #E5EFFF", +/* pixels */ +":.;.;.;.-.=.*.&.%.$.@.+.O.X...X.", +"s.H.H.H.H.D.S.S.m.m.b.b.c.l.l.5.", +"& 2.! E U R K L H D S C V v F O ", +"& ~ ~ 0.A.V.1.M n l j a w 7 c O ", +"$ Q 0.4.9.3.t.B g s e w 7 , h o ", +"$ R t.e.Y e.Z.H s e 9 7 , ; d . ", +"$ I 8.,.7.<.B.c e w 6 , ; = p . ", +"# P L 0.B.C.J a w 4 , ; - * a . ", +"# Q A Z B B c h s i i 8 2 1 z ", +"6.b.b.c.c.l.f.h.g.a.d.a.u.u.u.>.", +"#.O.X... .| } { [ ] ' ` ) ( / _ " +}; diff --git a/src/pixmaps/flags_xpm/kr.xpm b/src/pixmaps/flags_xpm/kr.xpm new file mode 100644 index 00000000..951579c5 --- /dev/null +++ b/src/pixmaps/flags_xpm/kr.xpm @@ -0,0 +1,139 @@ +/* XPM */ +static const char *kr[] = { +/* columns rows colors chars-per-pixel */ +"16 11 122 2", +" c #565656", +". c #585858", +"X c gray39", +"o c #676666", +"O c DimGray", +"+ c gray42", +"@ c #777777", +"# c #7C7B7C", +"$ c #7E7E7E", +"% c gray50", +"& c #E7363D", +"* c #EE3D43", +"= c #E3434F", +"- c #E84249", +"; c #FA4141", +": c #FA4442", +"> c #FB4646", +", c #FB4A4A", +"< c #F97875", +"1 c #656EBE", +"2 c #2A66D6", +"3 c #3A6DD5", +"4 c #3C72D9", +"5 c #3A76DD", +"6 c #4B67C5", +"7 c #5569C2", +"8 c #586FC7", +"9 c #C67993", +"0 c #6D92DC", +"q c #7AA1E6", +"w c gray53", +"e c gray55", +"r c gray62", +"t c #ABAAA7", +"y c #AAA9A8", +"u c #ADAFAF", +"i c #AEAEAE", +"p c #ADB0B0", +"a c #B1B1B1", +"s c #BAB9BA", +"d c #BBBBBB", +"f c #FC8A8A", +"g c #F79695", +"h c #F3B1B5", +"j c #B59DC3", +"k c #A3ACD9", +"l c #AAC4F0", +"z c gray76", +"x c #C5C5C5", +"c c #C6C6C6", +"v c #C8C8C8", +"b c #CBCBCB", +"n c #CBD1CF", +"m c #D0D0CD", +"M c #CBD1D1", +"N c #CBD3D1", +"B c #CFD3D1", +"V c #CFD5D3", +"C c #CFD7D5", +"Z c #D3D3D1", +"A c #D1D7D5", +"S c #D5D5D5", +"D c #D7D7D7", +"F c #D1D9D7", +"G c #D3D9D9", +"H c #D5DBD9", +"J c #D7DBDB", +"K c #D7DFDD", +"L c gray85", +"P c #DAD9DA", +"I c #D8DADB", +"U c #DADADA", +"Y c #DBDADA", +"T c #DADCDC", +"R c #DFDFDF", +"E c #FBD6D6", +"W c #FCDADA", +"Q c #D9E1DF", +"! c #C5D2EC", +"~ c #C9D5ED", +"^ c #DDE3E1", +"/ c #DFE5E3", +"( c #E1E7E5", +") c #E7E7E7", +"_ c #E3E9E9", +"` c #E5EBEB", +"' c #E7EDED", +"] c gray91", +"[ c #E9E9E9", +"{ c #E9E9EA", +"} c #EAEAEA", +"| c #EDECE8", +" . c #E9EEEE", +".. c #E9EFEF", +"X. c #EBF1EF", +"o. c #E8EEF4", +"O. c #EBF1F1", +"+. c #EDF1F1", +"@. c #EDF3F3", +"#. c #EFF5F3", +"$. c gray95", +"%. c #F2F2F3", +"&. c #F3F3F3", +"*. c #F5F4F3", +"=. c #F2F5F5", +"-. c #F1F7F5", +";. c #F4F4F4", +":. c #F4F5F5", +">. c gray96", +",. c #F6F6F6", +"<. c gray97", +"1. c #F8F0F0", +"2. c #FDF6F5", +"3. c #F2F4F9", +"4. c #F8F8F8", +"5. c gray98", +"6. c #FBFBFB", +"7. c gray99", +"8. c #FDFDFD", +"9. c #FDFDFE", +"0. c #FEFEFE", +"q. c gray100", +/* pixels */ +"-.-.-.-.-.-.#.@.X.X.' ' ' _ / / ", +"-.q.q.D c *.q.7.7.7.%.s v 4.4.^ ", +"-.q.} e # T 8.W E 6.U o @ U <.Q ", +"-.q.U w i 2.f , : < 1.i X z <.K ", +"-.q.q.) -.h > * * & g .U -.*.H ", +"@.q.7.7.7.j - = 1 6 9 <.;.%.<.A ", +"@.q.6.} *.l 7 8 5 2 k | U %.;.A ", +"X.7.S $ y 3.q 4 3 0 o.t . s %.V ", +"o.6.R $ + m <.~ ! %.n O b %.M ", +" .6.6.c i } <.<.<.*.) r a *.%.M ", +" .` _ ( ( ^ Q K H G A C V M n n " +}; diff --git a/src/pixmaps/flags_xpm/kw.xpm b/src/pixmaps/flags_xpm/kw.xpm new file mode 100644 index 00000000..7efbb721 --- /dev/null +++ b/src/pixmaps/flags_xpm/kw.xpm @@ -0,0 +1,157 @@ +/* XPM */ +static const char *kw[] = { +/* columns rows colors chars-per-pixel */ +"16 11 140 2", +" c black", +". c #004100", +"X c #004900", +"o c #005100", +"O c #005500", +"+ c #005900", +"@ c #005F00", +"# c #006500", +"$ c #006B00", +"% c #006F00", +"& c #007300", +"* c #007500", +"= c #007900", +"- c #007D00", +"; c #484945", +": c #4D4944", +"> c #494949", +", c #494A49", +"< c gray31", +"1 c #535353", +"2 c gray33", +"3 c #585858", +"4 c #585F59", +"5 c gray36", +"6 c #5F695F", +"7 c #646762", +"8 c gray40", +"9 c #6A6A6A", +"0 c #6F6F6F", +"q c #727273", +"w c #767676", +"e c #797979", +"r c #7B7B7A", +"t c #C70000", +"y c #C90000", +"u c #CD0000", +"i c #CF0000", +"p c #D10000", +"a c #D50000", +"s c #D70000", +"d c #DB0000", +"f c #DD0000", +"g c #DF0000", +"h c #E50B0B", +"j c #E50F0E", +"k c #F10000", +"l c #E71313", +"z c #E81919", +"x c #E91E1E", +"c c #C53F3F", +"v c #EB2323", +"b c #EC2929", +"n c #E82C2C", +"m c #E82F2F", +"M c #E92F2F", +"N c #ED2E2E", +"B c #E93232", +"V c #EA3535", +"C c #EE3434", +"Z c #EC3939", +"A c #ED3D3D", +"S c #F83A3A", +"D c #D74545", +"F c #ED4242", +"G c #EE4646", +"H c #EF4B4B", +"J c #E15D5D", +"K c #F05050", +"L c #F15455", +"P c #F95858", +"I c #008100", +"U c #008900", +"Y c #009100", +"T c #2CA52C", +"R c #31A831", +"E c #37AA37", +"W c #3DAD3D", +"Q c #4FA94F", +"! c #42B042", +"~ c #47B347", +"^ c #49B149", +"/ c #4CB54C", +"( c #4EB44E", +") c #5CA95C", +"_ c #51B751", +"` c #53B753", +"' c #54B954", +"] c #58B957", +"[ c #59BC59", +"{ c #5CBB5C", +"} c #7B877B", +"| c #61BE60", +" . c #65C065", +".. c #69C269", +"X. c #6DC36D", +"o. c #70C571", +"O. c #74C774", +"+. c #77C877", +"@. c #7BC37B", +"#. c #79CD79", +"$. c #D9A4A4", +"%. c #EEA2A2", +"&. c #EFA4A4", +"*. c #EFA6A6", +"=. c #F1A9A9", +"-. c #F2ABAB", +";. c #F0AEAE", +":. c #F3AEAE", +">. c #F4B0B1", +",. c #F5B3B3", +"<. c #F8B6B6", +"1. c #AECEAE", +"2. c #A8D6A8", +"3. c #AAD8AA", +"4. c #ADDAAD", +"5. c #B0DBAF", +"6. c #B3DBB3", +"7. c #B2DDB2", +"8. c #B4DEB4", +"9. c #B7DFB7", +"0. c #B9E1B9", +"q. c #BCE3BC", +"w. c #DDDFDF", +"e. c gray88", +"r. c #E2E0E2", +"t. c gray89", +"y. c gray90", +"u. c #E7E7E7", +"i. c gray95", +"p. c #F3F3F3", +"a. c #F4F4F4", +"s. c #F4F5F5", +"d. c gray96", +"f. c #F6F6F6", +"g. c gray97", +"h. c #F8F8F8", +"j. c #F9F9F9", +"k. c gray98", +"l. c #FBFBFB", +"z. c gray99", +/* pixels */ +" U Y U I - = * & % $ # @ + O o ", +" } @.#.+.+.o.X... .| { ] ` ( X ", +" e 6 ) [ ' ( / ~ ! W E R T ^ . ", +" e 5 4 1.q.0.9.8.8.4.4.3.2.6.Q ", +" w 3 2 r.z.l.l.l.h.h.d.d.a.d.u.", +" q 2 < r.l.l.h.h.h.d.d.d.p.p.u.", +" 0 < , w.l.h.h.d.d.a.a.a.p.a.r.", +" 9 , ; $.<.,.>.:.-.=.*.&.%.;.D ", +" 8 : c S C N b v x z l j h m t ", +" 7 J P L K H G F A Z V B m n y ", +" f k f f d a a a p i i i y y y " +}; diff --git a/src/pixmaps/flags_xpm/ky.xpm b/src/pixmaps/flags_xpm/ky.xpm new file mode 100644 index 00000000..99299ea4 --- /dev/null +++ b/src/pixmaps/flags_xpm/ky.xpm @@ -0,0 +1,169 @@ +/* XPM */ +static const char *ky[] = { +/* columns rows colors chars-per-pixel */ +"16 11 152 2", +" c black", +". c #000003", +"X c #00000B", +"o c #000011", +"O c #000019", +"+ c #00001F", +"@ c #000025", +"# c #000027", +"$ c #00002D", +"% c #00002F", +"& c #000031", +"* c #000033", +"= c #000039", +"- c #00003B", +"; c #00003F", +": c #000049", +"> c #000963", +", c #001D75", +"< c #273373", +"1 c #772D4F", +"2 c #7F2F4F", +"3 c #573965", +"4 c #713D61", +"5 c #753D61", +"6 c #30437F", +"7 c #3B4E7F", +"8 c #607049", +"9 c #63744D", +"0 c #647350", +"q c #6F7E5D", +"w c #5D666F", +"e c #6A7277", +"r c #CB322E", +"t c #C33339", +"y c #D1423D", +"u c #B5717F", +"i c #C0656B", +"p c #C2696F", +"a c #E0777B", +"s c #738159", +"d c #77845E", +"f c #AC9C6E", +"g c #B09978", +"h c #B29D7F", +"j c #B7A16E", +"k c #CE966D", +"l c #C0A065", +"z c #CCA373", +"x c #CAAC72", +"c c #233D82", +"v c #2A4187", +"b c #2C4385", +"n c #294485", +"m c #2D4486", +"M c #2F4088", +"N c #2E4889", +"B c #2F4989", +"V c #2E4B8E", +"C c #364E87", +"Z c #3B4E86", +"A c #304288", +"S c #35488B", +"D c #344D8D", +"F c #344E8D", +"G c #374E8C", +"H c #3A4E8B", +"J c #394B8F", +"K c #3B4D8D", +"L c #3B4F8D", +"P c #3B5289", +"I c #3D548F", +"U c #364C90", +"Y c #3A5290", +"T c #3C5291", +"R c #3F5592", +"E c #3F5793", +"W c #3F5594", +"Q c #415483", +"! c #475987", +"~ c #4C5E8B", +"^ c #405793", +"/ c #405893", +"( c #425993", +") c #425895", +"_ c #445A95", +"` c #465997", +"' c #445C97", +"] c #455C97", +"[ c #465E96", +"{ c #485C95", +"} c #455B98", +"| c #415C99", +" . c #495F98", +".. c #4B6099", +"X. c #49609A", +"o. c #49609B", +"O. c #4E649B", +"+. c #4F649D", +"@. c #526196", +"#. c #50659C", +"$. c #54699E", +"%. c #676F9B", +"&. c #7E7097", +"*. c #7F749B", +"=. c #5368A3", +"-. c #5469A0", +";. c #586DA2", +":. c #5D72A4", +">. c #6175A7", +",. c #6D7BA0", +"<. c #6D7AA2", +"1. c #6174A9", +"2. c #6577A8", +"3. c #647AA9", +"4. c #667AAA", +"5. c #6B7CAC", +"6. c #6A7EAD", +"7. c #6F7FAE", +"8. c #8D7FA1", +"9. c #7C92BA", +"0. c #7F95BC", +"q. c #8B8EB2", +"w. c #9C97B4", +"e. c #DE868B", +"r. c #C38E9E", +"t. c #E48084", +"y. c #E88A8C", +"u. c #E08E93", +"i. c #EA9293", +"p. c #E09398", +"a. c #D7BF95", +"s. c #C090A1", +"d. c #D397A0", +"f. c #E69FA4", +"g. c #CBACB5", +"h. c #D8A9B3", +"j. c #D0B4BC", +"k. c #D9B5BE", +"l. c #DAB5BE", +"z. c #F1B3B4", +"x. c #F1B6B6", +"c. c #97AACB", +"v. c #DABFCA", +"b. c #BFCADA", +"n. c #DFC2CA", +"m. c #C1CBDB", +"M. c #C3CDDD", +"N. c #C5CFDE", +"B. c #E2C1C8", +"V. c #E4C9D1", +"C. c #E4D3DC", +"Z. c #E2D9E2", +/* pixels */ +"u 8., 1 2 > 4 @ ; = * % @ @ O X ", +"< n.Z.l.h.v.C.,.6.2.1.,.a.-.+.X ", +"t f.i.t.a y.e.~ @.) | d s D .. ", +"5 B.z.u.p.x.d.! { T y k z r / . ", +"%.V.w.s.r.c.l.Q ^ K j.u u g.T . ", +"3 q.=.*.&.` 3.7 Z 6 q q.q.8 H . ", +": 7.+.X.} / L S N b N.N.m.m.H . ", +"; 6.X.] ^ Y F B c g x 8 8 j h . ", +"= 3.' E I F B b c A e j f w Q . ", +"* >.:.;.$.#...{ ( ^ K P Z c b . ", +"% @ @ O X X . . . . . . " +}; diff --git a/src/pixmaps/flags_xpm/kz.xpm b/src/pixmaps/flags_xpm/kz.xpm new file mode 100644 index 00000000..784c8a54 --- /dev/null +++ b/src/pixmaps/flags_xpm/kz.xpm @@ -0,0 +1,178 @@ +/* XPM */ +static const char *kz[] = { +/* columns rows colors chars-per-pixel */ +"16 11 161 2", +" c #87A903", +". c #DFBF00", +"X c #DFCA38", +"o c #F8D136", +"O c #F8D336", +"+ c #F9D53C", +"@ c #B5CA6D", +"# c #A2C87F", +"$ c #B2CA71", +"% c #D3CE56", +"& c #D2D15F", +"* c #E7CF46", +"= c #FAD543", +"- c #EAD352", +"; c #ECD653", +": c #C5D06D", +"> c #D0D46E", +", c #EBDD75", +"< c #EDDE7A", +"1 c #007FDD", +"2 c #78C7B2", +"3 c #0081DD", +"4 c #0083DF", +"5 c #0087DD", +"6 c #0085DF", +"7 c #0087DF", +"8 c #0085E1", +"9 c #0087E3", +"0 c #0089E3", +"q c #008BE5", +"w c #008FE7", +"e c #0095E7", +"r c #0093E9", +"t c #0097E9", +"y c #0097EB", +"u c #009DEB", +"i c #009DED", +"p c #00A3ED", +"a c #00A1EF", +"s c #00A7EF", +"d c #00ABF1", +"f c #00AFF3", +"g c #00ADF5", +"h c #00B1F7", +"j c #00B3F9", +"k c #00B5F9", +"l c #00B5FB", +"z c #00B9FD", +"x c #00BBFD", +"c c #00BDFD", +"v c #00BFFD", +"b c #03BFFF", +"n c #09C3FF", +"m c #0FC3FD", +"M c #13C3FF", +"N c #38C2F1", +"B c #3BC6F2", +"V c #3CC4F1", +"C c #3DC4F2", +"Z c #72CBC9", +"A c #7CD1D0", +"S c #7ED3D4", +"D c #5ECEE7", +"F c #41C6F2", +"G c #45C8F3", +"H c #46C8F3", +"J c #4ACAF4", +"K c #4BCAF4", +"L c #4FCCF5", +"P c #53CAF2", +"I c #55CAF2", +"U c #56CBF2", +"Y c #50CDF5", +"T c #54CEF6", +"R c #55CEF6", +"E c #55CFF7", +"W c #58CCF3", +"Q c #59CCF3", +"! c #5BCDF3", +"~ c #5CCDF4", +"^ c #5ECFF4", +"/ c #53D0F7", +"( c #59D0F7", +") c #5BD1F8", +"_ c #5CD2F8", +"` c #5FD3F9", +"' c #61CDE1", +"] c #6FD0E5", +"[ c #71D2E7", +"{ c #7FD6E0", +"} c #7CD7E4", +"| c #75D6EC", +" . c #60CFF5", +".. c #64D2F5", +"X. c #68D4F1", +"o. c #68D3F6", +"O. c #68D3F7", +"+. c #6CD5F7", +"@. c #62D5F9", +"#. c #64D4FA", +"$. c #64D6FA", +"%. c #69D6FB", +"&. c #6BD8FB", +"*. c #6DDAFC", +"=. c #6FDAFC", +"-. c #70D7F7", +";. c #75D8F3", +":. c #71D8F7", +">. c #71D7F8", +",. c #73DAFB", +"<. c #75D8F8", +"1. c #75D8F9", +"2. c #74DAF8", +"3. c #72DAFC", +"4. c #73DBFD", +"5. c #75DBFD", +"6. c #76DBFD", +"7. c #75DCFE", +"8. c #79D9F9", +"9. c #79DAF9", +"0. c #7CDBFA", +"q. c #7FDDFB", +"w. c #79DCFE", +"e. c #7ADCFE", +"r. c #7ADFFE", +"t. c #7CDEFE", +"y. c #AACC81", +"u. c #A2CC8D", +"i. c #A8CD8B", +"p. c #BCD388", +"a. c #AFD191", +"s. c #BED794", +"d. c #8BCBAC", +"f. c #97CFA9", +"g. c #9FD2A7", +"h. c #82CDBB", +"j. c #ABD5A5", +"k. c #A3D5AE", +"l. c #C2D78F", +"z. c #C6D88A", +"x. c #CADB91", +"c. c #CCDB96", +"v. c #CEDE97", +"b. c #D3E09F", +"n. c #EFE284", +"m. c #F0E387", +"M. c #F2E48D", +"N. c #D4E1A2", +"B. c #D8E4A9", +"V. c #D8E4AA", +"C. c #D8E4AB", +"Z. c #8DD5C9", +"A. c #8ED8D5", +"S. c #83D8E1", +"D. c #87DDF7", +"F. c #8EDFF4", +"G. c #8AE0FC", +"H. c #8CE2FE", +"J. c #8FE2FE", +"K. c #91E3FE", +"L. c #94E4FE", +/* pixels */ +"b . n M m b x x l l l g f d s i ", +"b M.C.L.K.J.G.D.F.D.D.0.8.<.+.u ", +"b B.r.t.r.6.3.A.l.j...( ( E +.t ", +"b B.v.r.3.,.-.l.= - k.T E L +.e ", +"b n.7.6.2.;.} ; + O & D L J ..w ", +"x n.x.*.S.S.k.p.O * i.d.J H .q ", +"x N.*.%.| Z.> A f.h.Z @ H F ~ 9 ", +"l b.z.%.@.S a.: % u.X # F C Q 6 ", +"k < #.#.@.( T D # $ 2 V V N U 4 ", +"h , v.9.<.-.+.+.[ [ .~ Q U P 1 ", +"f d s p u t r w q q 4 6 5 1 3 " +}; diff --git a/src/pixmaps/flags_xpm/la.xpm b/src/pixmaps/flags_xpm/la.xpm new file mode 100644 index 00000000..bb8cd944 --- /dev/null +++ b/src/pixmaps/flags_xpm/la.xpm @@ -0,0 +1,168 @@ +/* XPM */ +static const char *la[] = { +/* columns rows colors chars-per-pixel */ +"16 11 151 2", +" c black", +". c #230000", +"X c #4D003F", +"o c #6D034F", +"O c #7D326F", +"+ c #D90000", +"@ c #DB0000", +"# c #DF0000", +"$ c #E10000", +"% c #E30000", +"& c #E50000", +"* c #E70000", +"= c #EB0000", +"- c #ED0000", +"; c #EF0000", +": c #F10000", +"> c #F30000", +", c #F50000", +"< c #F70000", +"1 c #F90000", +"2 c #FB0000", +"3 c #FD0000", +"4 c #F02C2C", +"5 c #F02F2F", +"6 c #F23232", +"7 c #F23535", +"8 c #F23939", +"9 c #F33D3D", +"0 c #803671", +"q c #833975", +"w c #863D78", +"e c #843E7B", +"r c #87437D", +"t c #954D7E", +"y c #F44242", +"u c #F54646", +"i c #F74B4B", +"p c #F74E4E", +"a c #F75050", +"s c #F75353", +"d c #F85455", +"f c #F85757", +"g c #F95858", +"h c #F95C5C", +"j c #FA5D5D", +"k c #FA6060", +"l c #FA6162", +"z c #FB6565", +"x c #FC6969", +"c c #FC6D6D", +"v c #FC7071", +"b c #FC7474", +"n c #FD7777", +"m c #FD7979", +"M c #FE7B7B", +"N c #000081", +"B c #000083", +"V c #000087", +"C c #00008B", +"Z c #000091", +"A c #0011B5", +"S c #0017B9", +"D c #001BBB", +"F c #0021BD", +"G c #0025BF", +"H c #2A55C3", +"J c #2D59C5", +"K c #2F59C5", +"L c #335DC7", +"P c #355DC6", +"I c #315CC8", +"U c #335DC8", +"Y c #355FC8", +"T c #395FC8", +"R c #3A61C8", +"E c #3962CA", +"W c #3E66CC", +"Q c #3F68CD", +"! c #4066C9", +"~ c #456ACB", +"^ c #496FCB", +"/ c #486CCC", +"( c #4A6ECE", +") c #4B6ECE", +"_ c #4C70CD", +"` c #5075CE", +"' c #4B72D1", +"] c #5074D0", +"[ c #5478D1", +"{ c #5679D5", +"} c #5B7AD0", +"| c #5C7ED3", +" . c #587BD5", +".. c #5A7DD6", +"X. c #5C7DD5", +"o. c #5D7DD5", +"O. c #8B4880", +"+. c #8F4D84", +"@. c #905084", +"#. c #995282", +"$. c #9C5686", +"%. c #955589", +"&. c #9F5A8A", +"*. c #995A8D", +"=. c #9F5D8C", +"-. c #9C5E90", +";. c #9F6393", +":. c #A06090", +">. c #A36493", +",. c #A46590", +"<. c #A76996", +"1. c #AD7099", +"2. c #AF739C", +"3. c #B1769E", +"4. c #B279A0", +"5. c #B17FA8", +"6. c #5E80D7", +"7. c #5F81D7", +"8. c #6784D3", +"9. c #6382D7", +"0. c #6585D7", +"q. c #6D88D6", +"w. c #6284D8", +"e. c #6385D9", +"r. c #6484D8", +"t. c #6584D8", +"y. c #6987D9", +"u. c #6888DB", +"i. c #6A88DA", +"p. c #6D8BDA", +"a. c #6B8BDC", +"s. c #718DDB", +"d. c #7490DA", +"f. c #7691DB", +"g. c #7B98DF", +"h. c #7F9BE0", +"j. c #C090B1", +"k. c #829EE2", +"l. c #859FE2", +"z. c #8AA2E2", +"x. c #C9D3ED", +"c. c #CED6EF", +"v. c #CFD7F0", +"b. c #E3E8F2", +"n. c #E6E9F4", +"m. c #ECEFF6", +"M. c #EDF0F7", +"N. c gray97", +"B. c #F8F8F8", +"V. c #F9F9F9", +"C. c gray98", +/* pixels */ +"3 3 3 3 3 2 2 < < < < : : : ; ; ", +"3 M M M n v v c x z k h f s p = ", +"o j.3.3.2.2.<.>.:.=.&.$.#.t ,.. ", +"G z.s.p.i.r.f.c.c.q.( ( ~ W } Z ", +"F l.i.i.e.e.M.C.C.n._ Q W R [ C ", +"D k.i.t.X.d.C.B.B.B.8.R R P ` V ", +"S h.e.6.....m.B.N.b./ L L J _ B ", +"A g.6...{ ' 0.x.x.| L L J H _ B ", +"X 5.;.=.*.%.+.O.r e w q O O @. ", +": l j g s s i u y 9 8 7 7 5 4 + ", +": : : ; = = * * % % # # # + + + " +}; diff --git a/src/pixmaps/flags_xpm/lb.xpm b/src/pixmaps/flags_xpm/lb.xpm new file mode 100644 index 00000000..1dbf3bef --- /dev/null +++ b/src/pixmaps/flags_xpm/lb.xpm @@ -0,0 +1,154 @@ +/* XPM */ +static const char *lb[] = { +/* columns rows colors chars-per-pixel */ +"16 11 137 2", +" c #AD0000", +". c #B10000", +"X c #B50000", +"o c #B70000", +"O c #BB0000", +"+ c #BD0000", +"@ c #BF0000", +"# c #C10000", +"$ c #C30000", +"% c #C50000", +"& c #C90000", +"* c #CB0000", +"= c #CF0000", +"- c #D10000", +"; c #D30000", +": c #D50000", +"> c #D70000", +", c #D90000", +"< c #DB0000", +"1 c #DD0000", +"2 c #DF0000", +"3 c #E12A14", +"4 c #E22D18", +"5 c #E3311D", +"6 c #E43621", +"7 c #E53A25", +"8 c #E43E29", +"9 c #E43E2C", +"0 c #E5402F", +"q c #E64432", +"w c #E74735", +"e c #E84430", +"r c #E94533", +"t c #E54936", +"y c #E94835", +"u c #E84B39", +"i c #EA4B38", +"p c #E84E3D", +"a c #EB4E3C", +"s c #EB4F3E", +"d c #EA5242", +"f c #EC5341", +"g c #ED5443", +"h c #EB5746", +"j c #EE5846", +"k c #EE5A48", +"l c #EC5B4B", +"z c #EB5F4F", +"x c #EF5C4C", +"c c #EF5E4D", +"v c #ED5F4E", +"b c #ED6050", +"n c #ED6353", +"m c #EE6455", +"M c #EE6757", +"N c #EF6858", +"B c #F06251", +"V c #F16656", +"C c #F26A5A", +"Z c #F06B5C", +"A c #F06C5D", +"S c #F36D5E", +"D c #F16F60", +"F c #F17062", +"G c #F47161", +"H c #F27365", +"J c #F47365", +"K c #F27769", +"L c #F27A6C", +"P c #F37A6D", +"I c #F47E71", +"U c #3B923B", +"Y c #3E933E", +"T c #3E943E", +"R c #439643", +"E c #439644", +"W c #449745", +"Q c #459945", +"! c #499949", +"~ c #499B4A", +"^ c #529D53", +"/ c #57A257", +"( c #57A357", +") c #5AA45A", +"_ c #62A862", +"` c #7DB37B", +"' c #F58174", +"] c #F68477", +"[ c #F68679", +"{ c #F7887B", +"} c #F78C7F", +"| c #85BA84", +" . c #BBBBBB", +".. c gray75", +"X. c #96C697", +"o. c #A0CDA2", +"O. c #A3CAA4", +"+. c #C1C1C1", +"@. c #C5C3C3", +"#. c #CBDFCB", +"$. c #DFDFDF", +"%. c #CEE4CF", +"&. c #D8E8DA", +"*. c #D8E9DA", +"=. c #DEEADE", +"-. c #E1E1E1", +";. c gray89", +":. c #E5E3E3", +">. c gray90", +",. c #E7F0E6", +"<. c #EEF2EF", +"1. c gray95", +"2. c #F3F3F3", +"3. c #F3F6F3", +"4. c #F1F4F4", +"5. c #F3F7F6", +"6. c #F4F4F4", +"7. c #F5F4F4", +"8. c #F4F5F5", +"9. c gray96", +"0. c #F6F5F4", +"q. c #F6F5F5", +"w. c #F6F6F6", +"e. c #F7F6F6", +"r. c #F8F8F8", +"t. c gray98", +"y. c #FAFBFB", +"u. c #FBFBFB", +"i. c #FDFBFB", +"p. c #FBFCFB", +"a. c #FDFBFC", +"s. c gray99", +"d. c #FDFCFD", +"f. c #FDFDFD", +"g. c #FEFCFC", +"h. c #FEFDFD", +"j. c #FEFEFE", +/* pixels */ +"2 2 2 2 2 < < < > > ; ; = & & % ", +"2 { { [ ] ' I P K H F N M n v # ", +"2 } J G S C V n v j g s y r z @ ", +">.g.g.g.i.i.,.| ` =.y.9.9.9.9.@.", +">.g.g.g.f.f.o.( ! X.5.9.9.9.9.+.", +">.g.g.s.f.%.) Q R ! #.2.9.6.9...", +"-.f.f.y.y._ ( W T W ^ 4.2.2.2. .", +"-.y.y.y.y.3.*.T U O.&.<.2.2.2. .", +"> L x j s a y q 8 7 6 5 4 3 t ", +"; F S N M b l h d p u w q 0 9 ", +"; = & & % % @ @ O o o . " +}; diff --git a/src/pixmaps/flags_xpm/lc.xpm b/src/pixmaps/flags_xpm/lc.xpm new file mode 100644 index 00000000..be08b843 --- /dev/null +++ b/src/pixmaps/flags_xpm/lc.xpm @@ -0,0 +1,169 @@ +/* XPM */ +static const char *lc[] = { +/* columns rows colors chars-per-pixel */ +"16 11 152 2", +" c gray21", +". c gray23", +"X c #3F3B3C", +"o c #4A4141", +"O c #8F6B24", +"+ c #947437", +"@ c #887F7D", +"# c #CA9F35", +"$ c #D0A22F", +"% c #F4C71E", +"& c #F7CC2E", +"* c #F5D123", +"= c #F6D429", +"- c #F5D23D", +"; c #F4D939", +": c #F6ED2A", +"> c #F7ED2F", +", c #F6D142", +"< c #F7D346", +"1 c #F7D84B", +"2 c #F8E250", +"3 c #55548B", +"4 c #6C6B9F", +"5 c #2A5DDD", +"6 c #2A5FDC", +"7 c #2A5EDD", +"8 c #2A5FDD", +"9 c #2A5EDE", +"0 c #2A5FDE", +"q c #2A60DB", +"w c #2A5FE0", +"e c #2A5FE1", +"r c #2A5FE2", +"t c #2A61E2", +"y c #2A62E2", +"u c #2A62E3", +"i c #2A62E4", +"p c #2A62ED", +"a c #2A63F2", +"s c #2C64F2", +"d c #3168F3", +"f c #3468F1", +"g c #3369F5", +"h c #356AF4", +"j c #386BF5", +"k c #386BF7", +"l c #3F6FF7", +"z c #3B6FF9", +"x c #567FEC", +"c c #4374F7", +"v c #4674F5", +"b c #4172FA", +"n c #4876F8", +"m c #4B7AF9", +"M c #4D7CF9", +"N c #4F7CF9", +"B c #4F7DFA", +"V c #517EFA", +"C c #4580EE", +"Z c #5384EE", +"A c #5983EC", +"S c #5982ED", +"D c #5E87ED", +"F c #5F88EF", +"G c #5280F9", +"H c #5481FA", +"J c #5581FA", +"K c #5F8AF9", +"L c #6089EE", +"P c #638EEF", +"I c #658FEF", +"U c #6C92EC", +"Y c #6E93EC", +"T c #6B94ED", +"R c #6E95EC", +"E c #6999EE", +"W c #7097ED", +"Q c #7399EE", +"! c #779DEF", +"~ c #618BF2", +"^ c #668DF0", +"/ c #6197F4", +"( c #6891F0", +") c #6F93F1", +"_ c #6B94F0", +"` c #6D95F1", +"' c #6E95F0", +"] c #6F96F0", +"[ c #6C9EF4", +"{ c #7199F1", +"} c #719EF3", +"| c #749DF1", +" . c #759CF5", +".. c #7A9CF4", +"X. c #7BA2EF", +"o. c #78A9EF", +"O. c #68AAF2", +"+. c #76A7F7", +"@. c #79A1F3", +"#. c #7EA4F0", +"$. c #7CA2F4", +"%. c #7DBAF6", +"&. c #948C8A", +"*. c #80A7F3", +"=. c #80A5F4", +"-. c #81A6F5", +";. c #81A5F7", +":. c #81A9F1", +">. c #81AFF3", +",. c #86AEF1", +"<. c #82A9F4", +"1. c #83AAF4", +"2. c #88AEF5", +"3. c #89AEF5", +"4. c #89AEF6", +"5. c #8AAFF6", +"6. c #89B0F2", +"7. c #88B0F3", +"8. c #8CB2F2", +"9. c #8FB5F3", +"0. c #8BB0F6", +"q. c #8CB0F6", +"w. c #8DB1F7", +"e. c #8EB1F7", +"r. c #87B9F3", +"t. c #91B5F3", +"y. c #91B4F7", +"u. c #90B5F7", +"i. c #93B9F4", +"p. c #92B9F7", +"a. c #97BBF5", +"s. c #ADBEE1", +"d. c #9AC0F6", +"f. c #9DC2F7", +"g. c #9FC3F7", +"h. c #B2C3ED", +"j. c #B0C5EF", +"k. c #A0C3F7", +"l. c #A2C6F8", +"z. c #A3C7F8", +"x. c #A5C7F9", +"c. c #B4CBF4", +"v. c #8BE6F3", +"b. c #97EDF7", +"n. c #9DEDF8", +"m. c #9FEDF9", +"M. c #BBE1F8", +"N. c #BBE2F9", +"B. c #CBDCE9", +"V. c #D1DCE8", +"C. c #C0F2F6", +"Z. c #C5F5F9", +/* pixels */ +"K V H H G B B b z c l j h d a h ", +"B x.x.z.z.z.w.N.N.5.p.9.8.6.,.t ", +"H x.p.u.w.w.+.B.V.[ @.| { R :.t ", +"H z.u.w.w.$.m.&.@ b.) { ` ` X.t ", +"G z.w.5.4. .Z.o X C.~ ` ( I X.t ", +"M g.0.0.#.%.c.. j.O.I ^ F ! t ", +"m g.5.<...n.4 # $ 3 v.F L F Q w ", +"n a.<.#. .r.+ > : O o.Z D S R 9 ", +"c a.<.@./ h.& = * % s.C S x R 9 ", +"j p.t.7.>.2 1 < , - ; E R Y U 9 ", +"v g d s p t t t w w 9 9 9 6 9 q " +}; diff --git a/src/pixmaps/flags_xpm/li.xpm b/src/pixmaps/flags_xpm/li.xpm new file mode 100644 index 00000000..2acdddec --- /dev/null +++ b/src/pixmaps/flags_xpm/li.xpm @@ -0,0 +1,177 @@ +/* XPM */ +static const char *li[] = { +/* columns rows colors chars-per-pixel */ +"16 11 160 2", +" c #00000B", +". c #00006F", +"X c #000071", +"o c #000075", +"O c #000079", +"+ c #00007F", +"@ c #290B61", +"# c #B90000", +"$ c #BB0000", +"% c #BD0000", +"& c #BF0000", +"* c #C10000", +"= c #C30000", +"- c #C50000", +"; c #C90000", +": c #CB0000", +"> c #CF0000", +", c #D10000", +"< c #D50000", +"1 c #D70000", +"2 c #DB0000", +"3 c #DD0000", +"4 c #DF0000", +"5 c #E90000", +"6 c #DE260B", +"7 c #E0290E", +"8 c #E02A10", +"9 c #E12D13", +"0 c #E12E14", +"q c #EA2E14", +"w c #E23219", +"e c #E23319", +"r c #E3371E", +"t c #E3371F", +"y c #EC3219", +"u c #ED371F", +"i c #E43C23", +"p c #E43D24", +"a c #EE3C24", +"s c #E64129", +"d c #E6422A", +"f c #E2432C", +"g c #E2462F", +"h c #E7462E", +"j c #E7472F", +"k c #EF412A", +"l c #F0462F", +"z c #E34932", +"x c #E54B35", +"c c #E94B34", +"v c #E94C34", +"b c #ED4C36", +"n c #E64F39", +"m c #F14B35", +"M c #E6533D", +"N c #EA503A", +"B c #EB553F", +"V c #EC563F", +"C c #F2503A", +"Z c #E85742", +"A c #E85B46", +"S c #ED5A44", +"D c #ED5A45", +"F c #EE5F49", +"G c #F35540", +"H c #F45A45", +"J c #F55F49", +"K c #EA604B", +"L c #F6624F", +"P c #EB6350", +"I c #ED6855", +"U c #ED6C58", +"Y c #EE705D", +"T c #F07462", +"R c #F17866", +"E c #F27C6A", +"W c #F67F6F", +"Q c #F5DB5D", +"! c #FBDF5F", +"~ c #E0CF6E", +"^ c #F4DC67", +"/ c #F9DE61", +"( c #F0DA6D", +") c #E9D675", +"_ c #FBE063", +"` c #000083", +"' c #000087", +"] c #00008B", +"[ c #000091", +"{ c #000095", +"} c #000099", +"| c #00039B", +" . c #00099D", +".. c #000FA1", +"X. c #0015A5", +"o. c #0019A7", +"O. c #001BA7", +"+. c #001DA7", +"@. c #0019A9", +"#. c #001DA9", +"$. c #275ABB", +"%. c #2C5EBD", +"&. c #305EBB", +"*. c #3562BD", +"=. c #3662BD", +"-. c #3A66BF", +";. c #614A86", +":. c #654E89", +">. c #69528C", +",. c #6C5790", +"<. c #705B93", +"1. c #756096", +"2. c #776497", +"3. c #796599", +"4. c #7D699B", +"5. c #3263C0", +"6. c #3766C2", +"7. c #3B67C0", +"8. c #3F6BC2", +"9. c #3D6AC4", +"0. c #406BC2", +"q. c #416FC6", +"w. c #456FC4", +"e. c #4671C4", +"r. c #4A72C6", +"t. c #4A73C7", +"y. c #4D74C4", +"u. c #4673C8", +"i. c #4F76C9", +"p. c #4C77CB", +"a. c #5178C6", +"s. c #587EC6", +"d. c #517BCB", +"f. c #547BCB", +"g. c #577CC8", +"h. c #5B7FCA", +"j. c #806D9F", +"k. c #8371A4", +"l. c #8675A7", +"z. c #8A79A8", +"x. c #5C81C8", +"c. c #5D84CF", +"v. c #6083CC", +"b. c #6487CE", +"n. c #688AD0", +"m. c #6C8ED2", +"M. c #7090D3", +"N. c #7494D4", +"B. c #7A9BDA", +"V. c #7F9DD9", +"C. c #8F9EA1", +"Z. c #9F91B7", +"A. c #A1ABA2", +"S. c #BEC1A7", +"D. c #F2E086", +"F. c #C2C3AA", +"G. c #819ED9", +"H. c #819EDA", +"J. c #94A8C2", +"K. c #9FB0C4", +/* pixels */ +"+.o.+.#.@.X.X. .} { { [ ] ' ` + ", +"o.H.K.F.D.S.J.N.M.m.n.b.v.h.f.O ", +"+.H.) ( ^ / ~ f.i.r.w.8.-.=.a.o ", +"o.V.A._ ! Q C.i.r.w.8.7.=.&.y.. ", +"@.B.c.x.s.f.p.u.9.9.6.*.%.$.e.X ", +"@ Z.z.l.k.j.4.3.2.<.,.>.:.;.2. ", +"5 W L J H C C m l k a u y q b , ", +"4 E K S V N v c d p i e 0 7 z & ", +"4 R S B N x h d p r w 9 6 6 g # ", +"4 T Y U I P F A Z M n x x g f # ", +"2 1 , , > > : : - = = & & # # # " +}; diff --git a/src/pixmaps/flags_xpm/lk.xpm b/src/pixmaps/flags_xpm/lk.xpm new file mode 100644 index 00000000..02fd5153 --- /dev/null +++ b/src/pixmaps/flags_xpm/lk.xpm @@ -0,0 +1,176 @@ +/* XPM */ +static const char *lk[] = { +/* columns rows colors chars-per-pixel */ +"16 11 159 2", +" c #9B2D3F", +". c #9D3238", +"X c #9C313A", +"o c #A0383D", +"O c #B25A2B", +"+ c #A3403B", +"@ c #A3413C", +"# c #B8662F", +"$ c #BB6735", +"% c #BF6D3A", +"& c #C46F17", +"* c #C36E1B", +"= c #C5711E", +"- c #C67521", +"; c #C97824", +": c #CB7B28", +"> c #C77B3B", +", c #982B40", +"< c #982B41", +"1 c #9A2F44", +"2 c #9F3443", +"3 c #9A3045", +"4 c #9C3248", +"5 c #9D3549", +"6 c #9C314F", +"7 c #9F374C", +"8 c #A03847", +"9 c #A03A4E", +"0 c #A13C50", +"q c #A33F53", +"w c #A13B5A", +"e c #AD4E4F", +"r c #AE504A", +"t c #A5415F", +"y c #A84659", +"u c #A9485B", +"i c #AF525D", +"p c #B05753", +"a c #B25954", +"s c #B15B55", +"d c #BB6747", +"f c #B8664D", +"g c #B9674F", +"h c #B7645E", +"j c #A94A62", +"k c #AC4E60", +"l c #AC4E64", +"z c #AA4B68", +"x c #AC4D6E", +"c c #AF5365", +"v c #AD5068", +"b c #B05769", +"n c #B2586A", +"m c #B45A6C", +"M c #B35C6D", +"N c #B55D6E", +"B c #B66072", +"V c #B86576", +"C c #C17571", +"Z c #C57C77", +"A c #448C44", +"S c #4E9046", +"D c #4A9049", +"F c #4F944F", +"G c #52934C", +"H c #519451", +"J c #549653", +"K c #559755", +"L c #589A58", +"P c #5A995A", +"I c #5D9C5C", +"U c #5E9D5F", +"Y c #5F9D5F", +"T c #639F63", +"R c #66A266", +"E c #68A267", +"W c #6FA768", +"Q c #70A768", +"! c #CF8210", +"~ c #DDA21F", +"^ c #E1B115", +"/ c #E1B316", +"( c #E2B318", +") c #E3B61B", +"_ c #E5B91E", +"` c #CC842E", +"' c #D0842C", +"] c #D6962E", +"[ c #DC992A", +"{ c #D69836", +"} c #F9823A", +"| c #F8873D", +" . c #FA873F", +".. c #E6BA21", +"X. c #E7BB25", +"o. c #E8BF28", +"O. c #EDBD29", +"+. c #EDBE30", +"@. c #EDBF35", +"#. c #EFC61B", +"$. c #F4D41F", +"%. c #EAC12C", +"&. c #EBC32F", +"*. c #F1C621", +"=. c #F4CA25", +"-. c #F4CA2B", +";. c #ECC532", +":. c #ECC533", +">. c #EFC837", +",. c #F0CA3B", +"<. c #F1CD3E", +"1. c #F6D537", +"2. c #F6D538", +"3. c #CB8240", +"4. c #CF8A43", +"5. c #D59340", +"6. c #D89842", +"7. c #DB9E45", +"8. c #D1914E", +"9. c #CA8254", +"0. c #F88840", +"q. c #FB8B45", +"w. c #FB8E49", +"e. c #FC8E4B", +"r. c #FC924F", +"t. c #FD9250", +"y. c #FD9554", +"u. c #FE9759", +"i. c #FE9859", +"p. c #FE9A5C", +"a. c #DEA740", +"s. c #ECBD42", +"d. c #E5B14C", +"f. c #C8826B", +"g. c #FEA264", +"h. c #FEA166", +"j. c #F2CE41", +"k. c #F4CF45", +"l. c #F2D34B", +"z. c #F5D249", +"x. c #F2D34E", +"c. c #F5D34C", +"v. c #F6D44C", +"b. c #F6D54F", +"n. c #F3D550", +"m. c #F7D551", +"M. c #F7D752", +"N. c #F4D756", +"B. c #F7D853", +"V. c #F9D854", +"C. c #F9D954", +"Z. c #F9D956", +"A. c #F9D957", +"S. c #F5D95B", +"D. c #EBC067", +"F. c #F6DB60", +"G. c #F7DC65", +"H. c #F8DE68", +"J. c #F9DF72", +/* pixels */ +"A.A.A.A.C.B.b.b.b.z.k.j.j.,.>.:.", +"A.W Q h.h.J.D.Z V B M c c h 8.[ ", +"A.R Y p.u.H.C f.m c l i y g s ` ", +"A.R Y i.y.G.N x d.9.7.6.` r q : ", +"V.T P y.r.S.n z s.2.@.e { d 0 ; ", +"m.Y J r.r.S.c j 1.4.+.O.$.` 7 - ", +"b.P F w.q.N.k t 5.-.=.*.#.o 3 = ", +"v.J D q. .n.u w d > ] $ ~ X , * ", +"z.H A .} l.a f 6 8 8 . # + & ", +"k.G S | | l.a.p 9 9 4 1 o O ! ", +"j.<.,.>.;.&.%.%.X..._ ) / / ^ ^ " +}; diff --git a/src/pixmaps/flags_xpm/lr.xpm b/src/pixmaps/flags_xpm/lr.xpm new file mode 100644 index 00000000..5b45e750 --- /dev/null +++ b/src/pixmaps/flags_xpm/lr.xpm @@ -0,0 +1,126 @@ +/* XPM */ +static const char *lr[] = { +/* columns rows colors chars-per-pixel */ +"16 11 109 2", +" c #000057", +". c #000059", +"X c #00005B", +"o c #990000", +"O c #9B0000", +"+ c #9D0000", +"@ c #A10000", +"# c #A30000", +"$ c #A50000", +"% c #A70000", +"& c #A90000", +"* c #AB0000", +"= c #AF0000", +"- c #B30000", +"; c #B70000", +": c #B90000", +"> c #BD0000", +", c #BF0000", +"< c #C30000", +"1 c #C50000", +"2 c #C70000", +"3 c #C90000", +"4 c #CD0000", +"5 c #CF0000", +"6 c #D03B31", +"7 c #D13F34", +"8 c #D34338", +"9 c #D34439", +"0 c #D4473D", +"q c #D5483D", +"w c #D54B41", +"e c #D64D42", +"r c #D74D42", +"t c #D74F46", +"y c #D85047", +"u c #D95248", +"i c #D9544B", +"p c #D9554B", +"a c #DA574C", +"s c #DB574D", +"d c #D7594F", +"f c #DB594F", +"g c #DB5950", +"h c #DB5A51", +"j c #DC5C52", +"k c #D85F55", +"l c #DC5E55", +"z c #DD5E55", +"x c #DD5F56", +"c c #DE6157", +"v c #DE6259", +"b c #DE635A", +"n c #DE635B", +"m c #DF655C", +"M c #DC665E", +"N c #E0665E", +"B c #E0675F", +"V c #E0685F", +"C c #DF6F66", +"Z c #E06860", +"A c #E16B63", +"S c #E16C63", +"D c #E16C64", +"F c #E16D65", +"G c #E37067", +"H c #E37068", +"J c #E37169", +"K c #E4746C", +"L c #E4756D", +"P c #E57971", +"I c #E8867F", +"U c #6364A2", +"Y c #6668A5", +"T c #6669A5", +"R c #6A6CA7", +"E c #6B6DA8", +"W c #8487B7", +"Q c #8587B8", +"! c #E98E86", +"~ c #A0A1C7", +"^ c #B3B3D3", +"/ c #B3B4D3", +"( c #B3B5D3", +") c #D9C7C5", +"_ c #DBCBC9", +"` c #E1CDCD", +"' c #E5D3D1", +"] c #EBD9D7", +"[ c #F5E7E5", +"{ c #F7EBE9", +"} c #FBEDEB", +"| c #EFEFF5", +" . c gray95", +".. c #F2F2F3", +"X. c #F3F3F3", +"o. c #F4F4F4", +"O. c #F4F5F5", +"+. c gray96", +"@. c #F6F6F6", +"#. c gray97", +"$. c #F7F7FA", +"%. c #F8F8F8", +"&. c #F9F9F9", +"*. c gray98", +"=. c #FBFBFB", +"-. c gray99", +";. c #FDFDFD", +":. c #FDFDFE", +">. c #FEFEFE", +/* pixels */ +"X X X X X 4 4 4 3 2 2 < > > : ; ", +"X ( $.( W >.>.>.-.-.=.=.=.#.#.] ", +"X $.>.| E P L J F m m c h s C = ", +"X ^ | ~ T >.-.-.=.=.$.#.#.o.#.' ", +" W R Y U F A m b l h p y e M % ", +"} >.>.>.>.-.=.=.%.#.#.#.o.o.o.` ", +"4 ! K F C N b j f p t e 0 9 c + ", +"{ -.=.=.&.%.%.%.#.o.X.X.X.X.X._ ", +"3 I C m b l f i t w 0 8 7 6 d O ", +"[ =.%.=.=.#.#.#.#.o.o.o.X.X.X.) ", +"< > > : ; - = * % % @ @ O O o o " +}; diff --git a/src/pixmaps/flags_xpm/ls.xpm b/src/pixmaps/flags_xpm/ls.xpm new file mode 100644 index 00000000..483fada6 --- /dev/null +++ b/src/pixmaps/flags_xpm/ls.xpm @@ -0,0 +1,158 @@ +/* XPM */ +static const char *ls[] = { +/* columns rows colors chars-per-pixel */ +"16 11 141 2", +" c #002700", +". c #002900", +"X c #002D00", +"o c #002F00", +"O c #003100", +"+ c #003300", +"@ c #003500", +"# c #003900", +"$ c #003B00", +"% c #003D00", +"& c #004100", +"* c #004300", +"= c #004700", +"- c #004B00", +"; c #000165", +": c #000369", +"> c #00136B", +", c #001975", +"< c #0B950B", +"1 c #0F970E", +"2 c #109710", +"3 c #139913", +"4 c #149914", +"5 c #149B14", +"6 c #189E19", +"7 c #199E19", +"8 c #199F19", +"9 c #1EA01E", +"0 c #1A9B21", +"q c #1F9D25", +"w c #1F9B2D", +"e c #1F9935", +"r c #239C32", +"t c #2CA22C", +"y c #2FA42F", +"u c #32A532", +"i c #33A632", +"p c #35A835", +"a c #36A836", +"s c #39A939", +"d c #3BAD3B", +"f c #3DAC3D", +"g c #208D5A", +"h c #249451", +"j c #3FA949", +"k c #42AF42", +"l c #46AE4C", +"z c #4BA673", +"x c #BD9D64", +"c c #BEA068", +"v c #C0A16B", +"b c #C1A36D", +"n c #C6AA79", +"m c #003183", +"M c #00418D", +"N c #247B98", +"B c #297D9E", +"V c #257EB3", +"C c #257EB5", +"Z c #2A81B5", +"A c #2683B9", +"S c #2B85B9", +"D c #2A85BA", +"F c #2B86BA", +"G c #2D87BA", +"H c #2A85BC", +"J c #2F87BC", +"K c #2E88BE", +"L c #3087BB", +"P c #348ABE", +"I c #348BBE", +"U c #4491BD", +"Y c #6F9DB3", +"T c #2F8AC0", +"R c #318BC0", +"E c #388EC0", +"W c #3C91C1", +"Q c #3D92C2", +"! c #4094C3", +"~ c #4997C3", +"^ c #4798C6", +"/ c #549BC3", +"( c #509AC8", +") c #569EC8", +"_ c #549FCB", +"` c #58A2CD", +"' c #67A7CB", +"] c #71ADD0", +"[ c #78B1D1", +"{ c #CCB383", +"} c #CBB385", +"| c #D1BA8D", +" . c #D2BC94", +".. c #D2BD95", +"X. c #D2BD96", +"o. c #D3BD96", +"O. c #D4BD95", +"+. c #D5C09B", +"@. c #DFCFB1", +"#. c #DFD0B2", +"$. c #E1D2B7", +"%. c #E1D3B7", +"&. c #8EBEDA", +"*. c #BDC9CD", +"=. c #B2CFDF", +"-. c gray86", +";. c #DDDDDD", +":. c #DFDFDF", +">. c #E3DDD5", +",. c #EDE6D7", +"<. c #CADDE7", +"1. c #D1E1EA", +"2. c gray89", +"3. c gray90", +"4. c #E7E7E7", +"5. c #E9E9E9", +"6. c gray92", +"7. c #EDEBEB", +"8. c #E8EDEE", +"9. c gray93", +"0. c #F5EFE5", +"q. c #F7F2EA", +"w. c #E7F0F2", +"e. c #EDF2F4", +"r. c #F1F4F5", +"t. c #F8F6F1", +"y. c #F9F7F1", +"u. c #F8F6F3", +"i. c #FBF9F5", +"p. c #FBF9F7", +"a. c #FAFAF7", +"s. c #F7F9F9", +"d. c #F9F9F9", +"f. c gray98", +"g. c #FBFAFA", +"h. c #FBFBFB", +"j. c #FCFBFB", +"k. c #FCFCFB", +"l. c gray99", +"z. c #FDFDFD", +"x. c #FDFDFE", +/* pixels */ +"9.9.9.9.6.6.6.6.3.3.3.:.:.-.*.M ", +"9.%.q.0.@.k.z.z.z.d.d.d.d.&.) ; ", +"9.y.| { $.k.z.z.d.z.d.e.^ G ~ : ", +"7.o.v c b d.l.l.d.d.<.Q S A U ", +">.o.+.} n y.l.d.r.' R S C g j * ", +"6.q.v x ,.d.d.1.! J S V e 0 d $ ", +"5.%.o.o.o.d.] E J H N w 7 5 a @ ", +"4.d.a.a.8./ I T Z h q 7 5 2 i O ", +"3.l.d.=.Q P J B r 8 7 3 1 < y X ", +"2.w.[ ` _ ( z l k j s a i y t ", +"Y m , , > $ - - * % $ O X X . @ " +}; diff --git a/src/pixmaps/flags_xpm/lt.xpm b/src/pixmaps/flags_xpm/lt.xpm new file mode 100644 index 00000000..79c1101d --- /dev/null +++ b/src/pixmaps/flags_xpm/lt.xpm @@ -0,0 +1,177 @@ +/* XPM */ +static const char *lt[] = { +/* columns rows colors chars-per-pixel */ +"16 11 160 2", +" c #002F00", +". c #003B00", +"X c #770000", +"o c #007B00", +"O c #AD0000", +"+ c #B70000", +"@ c #B90000", +"# c #BB0000", +"$ c #BD0000", +"% c #BF0000", +"& c #BC2610", +"* c #BD2B14", +"= c #BF2E19", +"- c #C10000", +"; c #C30000", +": c #C70000", +"> c #C90000", +", c #CD0000", +"< c #CF0000", +"1 c #D10000", +"2 c #D50000", +"3 c #D70000", +"4 c #DB0000", +"5 c #DD0000", +"6 c #E30000", +"7 c #E10B0B", +"8 c #E20F0E", +"9 c #E31313", +"0 c #E41919", +"q c #E61E1E", +"w c #C1331F", +"e c #C33824", +"r c #C53D2A", +"t c #E72323", +"y c #E12C2C", +"u c #E22F2F", +"i c #E52F2F", +"p c #E82929", +"a c #EA2E2E", +"s c #E23232", +"d c #E43535", +"f c #EB3434", +"g c #E53939", +"h c #E63D3D", +"j c #EC3A3A", +"k c #EE3F3F", +"l c #C7422F", +"z c #C54532", +"x c #C94834", +"c c #CB4C3A", +"v c #CE523F", +"b c #CF5645", +"n c #D15B49", +"m c #E74242", +"M c #E84646", +"N c #EF4444", +"B c #E94B4B", +"V c #EA5050", +"C c #EC5455", +"Z c #ED5858", +"A c #EE5D5D", +"S c #DA7A6A", +"D c #EF6162", +"F c #F26666", +"G c #008300", +"H c #149B14", +"J c #199D19", +"K c #1A9C1A", +"L c #1F9F1F", +"P c #1FA01F", +"I c #209F20", +"U c #24A324", +"Y c #25A225", +"T c #2AA52A", +"R c #2AA52B", +"E c #2BA52B", +"W c #2FA92F", +"Q c #30A830", +"! c #35AB35", +"~ c #36A936", +"^ c #36AB36", +"/ c #3BAA3B", +"( c #3BAD3B", +") c #3BAE3A", +"_ c #3BAE3C", +"` c #3FAD3F", +"' c #40B040", +"] c #41B041", +"[ c #45B245", +"{ c #46B246", +"} c #46B346", +"| c #49B549", +" . c #4BB54B", +".. c #4FB74F", +"X. c #4FB84F", +"o. c #50B750", +"O. c #53B953", +"+. c #54B954", +"@. c #58BC58", +"#. c #6FC56F", +"$. c #72C673", +"%. c #76C876", +"&. c #AB9B00", +"*. c #E9B100", +"=. c #EDB700", +"-. c #EBB900", +";. c #EFBB00", +":. c #F1BF00", +">. c #D1C700", +",. c #F1C100", +"<. c #F3C500", +"1. c #F5C500", +"2. c #F7C900", +"3. c #F7CB00", +"4. c #F7CD00", +"5. c #F9CD00", +"6. c #FBD100", +"7. c #FFD300", +"8. c #FBD500", +"9. c #D7CF30", +"0. c #D9D136", +"q. c #DAD33B", +"w. c #F6DA38", +"e. c #F7DC3D", +"r. c #DCD540", +"t. c #DED646", +"y. c #DCD64D", +"u. c #DFD84B", +"i. c #F8DE42", +"p. c #F9DF48", +"a. c #E0DA50", +"s. c #E1DB54", +"d. c #E3DD59", +"f. c #E4DE5D", +"g. c #F7DF53", +"h. c #F7DE57", +"j. c #FAE04D", +"k. c #FBE152", +"l. c #FCE357", +"z. c #F7E05C", +"x. c #FDE45B", +"c. c #FDE55E", +"v. c #E5DF61", +"b. c #E6E064", +"n. c #F8E160", +"m. c #FEE662", +"M. c #F8E265", +"N. c #FEE766", +"B. c #F9E469", +"V. c #FAE56D", +"C. c #FEE869", +"Z. c #EBE67F", +"A. c #FBE671", +"S. c #FCE775", +"D. c #FCE879", +"F. c #FCE97B", +"G. c #FCE97E", +"H. c #FCEA80", +"J. c #FDEB83", +"K. c #FFEC83", +/* pixels */ +"8.6.6.6.6.5.4.3.3.1.<.:.:.;.=.-.", +"6.J.J.J.G.G.F.S.A.V.N.M.M.h.h.*.", +"7.K.N.N.m.x.x.l.g.j.p.p.e.w.g.*.", +">.Z.b.v.f.d.s.a.u.t.q.q.0.9.y.&.", +"G %.@.+.o.| { ' _ ! Q E Y I ` . ", +"o $.O... .{ ] ) ! Q E Y L K / ", +"o #.X.| { ' ) ! Q E Y P K H ! ", +"O S n b v c x l r e w = * & z X ", +"6 F N N j f a p t q 0 9 8 5 d % ", +"4 D A Z C V B M m h g d s u u + ", +"4 2 2 1 < < > > ; ; % % @ @ + @ " +}; diff --git a/src/pixmaps/flags_xpm/lu.xpm b/src/pixmaps/flags_xpm/lu.xpm new file mode 100644 index 00000000..7be5e0ce --- /dev/null +++ b/src/pixmaps/flags_xpm/lu.xpm @@ -0,0 +1,162 @@ +/* XPM */ +static const char *lu[] = { +/* columns rows colors chars-per-pixel */ +"16 11 145 2", +" c #E90000", +". c #EB0000", +"X c #ED0000", +"o c #EF0000", +"O c #F10000", +"+ c #F30000", +"@ c #F50000", +"# c #F70500", +"$ c #F90B00", +"% c #FB1105", +"& c #FD170B", +"* c #FD1D0F", +"= c #E71F17", +"- c #FF1F13", +"; c #FD2117", +": c #FF2719", +"> c #FD271B", +", c #FF291D", +"< c #FF372D", +"1 c #F65D54", +"2 c #F76259", +"3 c #F8665E", +"4 c #F96A63", +"5 c #FA6F67", +"6 c #FF6D67", +"7 c #F7746C", +"8 c #FB736C", +"9 c #FC776F", +"0 c #F77E77", +"q c #FD7A72", +"w c #FD7D76", +"e c #F8817A", +"r c #FE817A", +"t c #F9857F", +"y c #FE847C", +"u c #FE867F", +"i c #003BDF", +"p c #003FDD", +"a c #0041DD", +"s c #0043DD", +"d c #0047DF", +"f c #0049DD", +"g c #0049E1", +"h c #004DE3", +"j c #0053E5", +"k c #0055E7", +"l c #005BE9", +"z c #005FEB", +"x c #0065ED", +"c c #0069ED", +"v c #006FEF", +"b c #0075F1", +"n c #0079F3", +"m c #0F81DF", +"M c #0081F7", +"N c #0185F5", +"B c #0081F9", +"V c #379CF1", +"C c #3B9EF1", +"Z c #3FA0F2", +"A c #44A2F3", +"S c #48A5F4", +"D c #4CA8F5", +"F c #55A9F2", +"G c #51AAF6", +"H c #55ADF7", +"J c #5BACF2", +"K c #5DAEF2", +"L c #5AB0F8", +"P c #5FB3F9", +"I c #60AFF3", +"U c #63B1F3", +"Y c #66B3F4", +"T c #6AB5F5", +"R c #6DB7F6", +"E c #61B5FB", +"W c #63B5FA", +"Q c #68B8FA", +"! c #70B9F7", +"~ c #75BBF7", +"^ c #78BDF8", +"/ c #7BBFF9", +"( c #7FC2F9", +") c #FA8882", +"_ c #FB8B85", +"` c #FC8F8A", +"' c #F5908B", +"] c #F6938E", +"[ c #FC928D", +"{ c #FD958F", +"} c #F79792", +"| c #FD9892", +" . c #F89995", +".. c #FE9994", +"X. c #FF9B95", +"o. c #FE9D97", +"O. c #F69F9A", +"+. c #F99C98", +"@. c #FE9E99", +"#. c #FA9F9C", +"$. c #FFA09B", +"%. c #FBA29F", +"&. c #FCA5A1", +"*. c #FDA8A4", +"=. c #FDABA6", +"-. c #FEACA9", +";. c #FEAFAB", +":. c #FEBDBA", +">. c #86BFF2", +",. c #88C1F2", +"<. c #8BC4F3", +"1. c #8EC6F4", +"2. c #83C3FA", +"3. c #86C5FB", +"4. c #84C5FC", +"5. c #97C8F3", +"6. c #91C8F5", +"7. c #94CAF6", +"8. c #97CBF7", +"9. c #9BCDF8", +"0. c #9ECFF9", +"q. c #A1D1FA", +"w. c #A4D2FB", +"e. c #A7D4FB", +"r. c #B7DDFC", +"t. c gainsboro", +"y. c gray87", +"u. c gray88", +"i. c gray93", +"p. c gray95", +"a. c #F3F3F3", +"s. c #F4F4F4", +"d. c #F4F5F5", +"f. c gray96", +"g. c #F6F6F6", +"h. c gray97", +"j. c #F8F8F8", +"k. c #F9F9F9", +"l. c gray98", +"z. c #FBFBFB", +"x. c #FBFCFB", +"c. c gray99", +"v. c #FDFCFD", +"b. c #FDFDFD", +"n. c #FEFEFE", +/* pixels */ +"< , , , : - - & $ $ # # O O o o ", +": $.$.@.@.X. .{ [ { _ ) t 0 0 . ", +"- X.u u w w q 9 8 5 4 3 2 1 7 . ", +"6 :.;.=.=.*.&.%.#.+. .} ' ' O.= ", +"i.n.n.z.n.z.z.z.z.j.j.f.g.d.d.u.", +"i.n.n.z.z.z.z.j.j.j.f.f.d.a.d.y.", +"i.n.z.z.z.z.z.j.f.f.d.a.a.p.d.t.", +"E r.e.e.q.0.9.7.7.6.1.<.,.>.5.m ", +"B 4.Q E P L H G D S A C C C F i ", +"M 3.2.2.^ ^ ~ ! R T Y U I K J p ", +"N n b v c x z l k k h g g a a f " +}; diff --git a/src/pixmaps/flags_xpm/lv.xpm b/src/pixmaps/flags_xpm/lv.xpm new file mode 100644 index 00000000..32514ff6 --- /dev/null +++ b/src/pixmaps/flags_xpm/lv.xpm @@ -0,0 +1,173 @@ +/* XPM */ +static const char *lv[] = { +/* columns rows colors chars-per-pixel */ +"16 11 156 2", +" c #270000", +". c #290000", +"X c #2B0000", +"o c #2D0000", +"O c #2F0000", +"+ c #330000", +"@ c #350000", +"# c #390000", +"$ c #3D0000", +"% c #410000", +"& c #470000", +"* c #4B0000", +"= c #4D0000", +"- c #510000", +"; c #570000", +": c #5D0000", +"> c #5F0000", +", c #630000", +"< c #670000", +"1 c #6D0000", +"2 c #6F0000", +"3 c #710000", +"4 c #750000", +"5 c #770000", +"6 c #790000", +"7 c #7D0000", +"8 c #810000", +"9 c #830000", +"0 c #850000", +"q c #870000", +"w c #890000", +"e c #910000", +"r c #940B0B", +"t c #960F0E", +"y c #951010", +"u c #971414", +"i c #981313", +"p c #991919", +"a c #9B1919", +"s c #9C1F1F", +"d c #9E1E1E", +"f c #9F2424", +"g c #9E2626", +"h c #A12323", +"j c #A32929", +"k c #A12B2B", +"l c #A22A2A", +"z c #A22C2C", +"x c #A32F2F", +"c c #A62C2C", +"v c #A42F2F", +"b c #A52F2F", +"n c #A62E2E", +"m c #A43131", +"M c #A43232", +"N c #A53232", +"B c #A73736", +"V c #A93131", +"C c #A83434", +"Z c #A93434", +"A c #A83535", +"S c #AB3737", +"D c #A93939", +"F c #AB3A3A", +"G c #AA3C3C", +"H c #AC3D3D", +"J c #AE3C3D", +"K c #AD3F3F", +"L c #AE3F3F", +"P c #AD4142", +"I c #AE4242", +"U c #AC4444", +"Y c #AF4747", +"T c #B14242", +"R c #B14444", +"E c #B04545", +"W c #B04646", +"Q c #B34747", +"! c #B14949", +"~ c #B24949", +"^ c #B24B4B", +"/ c #B64C4C", +"( c #B44E4E", +") c #B45050", +"_ c #B45151", +"` c #B75353", +"' c #B65454", +"] c #B75455", +"[ c #B85151", +"{ c #BA5454", +"} c #B95757", +"| c #B95858", +" . c #B85959", +".. c #BC5959", +"X. c #BA5C5C", +"o. c #BB5C5C", +"O. c #BB5D5D", +"+. c #BE5C5C", +"@. c #BF5F5F", +"#. c #BE6060", +"$. c #BE6162", +"%. c #BF6666", +"&. c #C06565", +"*. c #C26969", +"=. c #C16A6A", +"-. c #C36D6D", +";. c #C57071", +":. c #C77474", +">. c #C87777", +",. c #C67979", +"<. c #C97979", +"1. c #CA7B7A", +"2. c #CA7B7B", +"3. c #C79F9F", +"4. c #C99D9D", +"5. c #E4CFCF", +"6. c #E9C9C9", +"7. c #E9CBCB", +"8. c #E5D0D0", +"9. c #E5D1D1", +"0. c #E6D2D2", +"q. c #E7D3D3", +"w. c #E8D3D3", +"e. c #E8D5D5", +"r. c #E9D5D5", +"t. c #E8D6D6", +"y. c #E9D6D6", +"u. c #E9D7D7", +"i. c #EAD7D7", +"p. c #EBD8D8", +"a. c #ECD9D9", +"s. c #EDDADA", +"d. c #EDDBDB", +"f. c #EEDCDC", +"g. c #EEDDDD", +"h. c #F0DEDE", +"j. c #F1DEDE", +"k. c gray90", +"l. c #F1E0E0", +"z. c #F1E1E1", +"x. c #F2E1E1", +"c. c #F4E7E7", +"v. c #F5E7E7", +"b. c #F3F3F3", +"n. c #F4F4F4", +"m. c #F4F5F5", +"M. c gray96", +"N. c #F6F6F6", +"B. c gray97", +"V. c #F8F8F8", +"C. c #F9F9F9", +"Z. c gray98", +"A. c #FBFBFB", +"S. c gray99", +"D. c #FDFDFD", +"F. c #FEFEFE", +/* pixels */ +"e w w w 0 8 8 7 6 5 2 2 < , : : ", +"0 2.2.2.>.:.;.-.=.&.@.@.] ] / = ", +"w 2.@.+...{ [ / Q T J A V b ^ * ", +"8 ,.O.] ] _ ^ Y I F B M l g U $ ", +"6.c.l.l.j.j.a.a.a.t.t.w.0.8.t.4.", +"F.F.F.S.S.A.A.A.A.B.M.M.n.b.m.k.", +"6.c.z.j.g.g.d.a.t.t.e.0.0.5.t.3.", +"5 =.^ Y L F A b l h s p u y M X ", +"5 %.Y J F A b l h d a u y r v X ", +"2 $.X...] / ^ Y I J F A M b z ", +"4 < , : ; - = * % $ # + o o X + " +}; diff --git a/src/pixmaps/flags_xpm/ly.xpm b/src/pixmaps/flags_xpm/ly.xpm new file mode 100644 index 00000000..318123e7 --- /dev/null +++ b/src/pixmaps/flags_xpm/ly.xpm @@ -0,0 +1,149 @@ +/* XPM */ +static const char *ly[] = { +/* columns rows colors chars-per-pixel */ +"16 11 132 2", +" c #004300", +". c #004500", +"X c #004700", +"o c #004900", +"O c #004B00", +"+ c #004D00", +"@ c #005100", +"# c #005300", +"$ c #005700", +"% c #005900", +"& c #005D00", +"* c #005F00", +"= c #006300", +"- c #006700", +"; c #006D00", +": c #007100", +"> c #007700", +", c #007B00", +"< c #008100", +"1 c #008500", +"2 c #008700", +"3 c #008900", +"4 c #008B00", +"5 c #008D00", +"6 c #008F00", +"7 c #009100", +"8 c #009300", +"9 c #009500", +"0 c #009700", +"q c #009900", +"w c #17A618", +"e c #1CA81B", +"r c #1CA91C", +"t c #20AB20", +"y c #21AB21", +"u c #24AD25", +"i c #25AE25", +"p c #26AE26", +"a c #2AAF2A", +"s c #2BB02B", +"d c #2FB12F", +"f c #2FB22F", +"g c #30B230", +"h c #30B330", +"j c #31B331", +"k c #37B237", +"l c #34B434", +"z c #35B435", +"x c #35B536", +"c c #36B536", +"v c #37B537", +"b c #37B637", +"n c #39B339", +"m c #3AB33A", +"M c #3AB63A", +"N c #3AB73A", +"B c #3BB73B", +"V c #3CB43C", +"C c #3DB43D", +"Z c #3BB83B", +"A c #3CB83C", +"S c #3FB93F", +"D c #40B640", +"F c #41B741", +"G c #40B940", +"H c #40BA40", +"J c #41BA40", +"K c #41BB41", +"L c #41BB42", +"P c #44B943", +"I c #44BB44", +"U c #46B946", +"Y c #47B947", +"T c #45BC45", +"R c #46BC46", +"E c #46BD46", +"W c #47BD47", +"Q c #49BB49", +"! c #49BE49", +"~ c #4BBC4B", +"^ c #4ABE4A", +"/ c #4BBE4B", +"( c #4CBF4C", +") c #4EBE4E", +"_ c #50BE50", +"` c #52BF52", +"' c #4EC04E", +"] c #4FC04F", +"[ c #50C050", +"{ c #50C150", +"} c #51C151", +"| c #53C253", +" . c #55C055", +".. c #54C354", +"X. c #55C355", +"o. c #56C356", +"O. c #57C257", +"+. c #59C259", +"@. c #58C558", +"#. c #58C559", +"$. c #5AC55A", +"%. c #5CC35C", +"&. c #5DC75D", +"*. c #5DC45E", +"=. c #5EC75E", +"-. c #60C660", +";. c #62C662", +":. c #61C861", +">. c #61C961", +",. c #62C962", +"<. c #65C865", +"1. c #65CA65", +"2. c #65C866", +"3. c #69CA69", +"4. c #6ACA6A", +"5. c #68CC68", +"6. c #6DCC6D", +"7. c #6FCC6F", +"8. c #71CD71", +"9. c #73CD73", +"0. c #75CE75", +"q. c #77D076", +"w. c #79D079", +"e. c #7AD17A", +"r. c #7BD27B", +"t. c #7DD37D", +"y. c #7ED37E", +"u. c #80D380", +"i. c #80D480", +"p. c #82D482", +"a. c #82D483", +"s. c #83D483", +/* pixels */ +"q q q q q 0 7 5 4 2 2 < , > : ; ", +"q s.s.s.y.y.e.0.9.6.3.1.-.%.X.- ", +"q s.5.,.,.&.+.X.] ] T L M M ` = ", +"q y.1.,.&.@.X.| ^ T L A v j ) & ", +"0 y.,.&.@.X.| ^ T J Z c j s Q & ", +"0 e.&.@.X.| ^ T J M c j s p Y @ ", +"7 0.@.X.) ^ T S M c j s p y F O ", +"5 9.| ] ^ T S M c f s p r r C O ", +"4 7.] ^ U G M l f a p y e w n . ", +"< 3.1.-.*.+.` ` Q U J F C n k . ", +"< , > : ; - = * & # @ + O . " +}; diff --git a/src/pixmaps/flags_xpm/ma.xpm b/src/pixmaps/flags_xpm/ma.xpm new file mode 100644 index 00000000..1b386813 --- /dev/null +++ b/src/pixmaps/flags_xpm/ma.xpm @@ -0,0 +1,139 @@ +/* XPM */ +static const char *ma[] = { +/* columns rows colors chars-per-pixel */ +"16 11 122 2", +" c #DD0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #ED0000", +"% c #EF0000", +"& c #F10000", +"* c #F30000", +"= c #F50000", +"- c #F70000", +"; c #F90000", +": c #FB0000", +"> c #FD0000", +", c red", +"< c #F10B0B", +"1 c #F10F0E", +"2 c #F21010", +"3 c #F21313", +"4 c #F21414", +"5 c #F31919", +"6 c #F31A1A", +"7 c #F41E1E", +"8 c #F41F1F", +"9 c #F42020", +"0 c #F52323", +"q c #F52424", +"w c #F42524", +"e c #F52525", +"r c #F52626", +"t c #F62929", +"y c #F62A2A", +"u c #F62B2B", +"i c #F22D2A", +"p c #F22C2C", +"a c #F22F2F", +"s c #F62C2C", +"d c #F72E2E", +"f c #F72F2F", +"g c #F23232", +"h c #F33232", +"j c #F73030", +"k c #F73131", +"l c #F33535", +"z c #F43636", +"x c #F83434", +"c c #F83534", +"v c #F83736", +"b c #F83737", +"n c #F13B36", +"m c #F43939", +"M c #F43B3B", +"N c #F63D3A", +"B c #F53D3D", +"V c #F53F3F", +"C c #F93A3A", +"Z c #F93C3C", +"A c #F93C3D", +"S c #FA3F3F", +"D c #BD5F2F", +"F c #B27936", +"G c #BE713C", +"H c #B57D3B", +"J c #C95830", +"K c #C06335", +"L c #F64242", +"P c #F64444", +"I c #F74646", +"U c #FA4040", +"Y c #F94242", +"T c #FA4242", +"R c #FA4444", +"E c #FB4545", +"W c #FB4646", +"Q c #FA4747", +"! c #FB4747", +"~ c #F34A46", +"^ c #F74949", +"/ c #F74B4B", +"( c #F74E4E", +") c #FB4949", +"_ c #FB4A49", +"` c #FC4A4B", +"' c #FC4B4B", +"] c #FC4C4C", +"[ c #FC4F4F", +"{ c #FD4F50", +"} c #F85050", +"| c #F85353", +" . c #FD5151", +".. c #FD5353", +"X. c #F95455", +"o. c #F95757", +"O. c #FD5454", +"+. c #F95858", +"@. c #FE5858", +"#. c #FE5959", +"$. c #FA5C5C", +"%. c #FA5D5D", +"&. c #FE5C5C", +"*. c #FE5F5F", +"=. c #D06440", +"-. c #C07541", +";. c #FB6060", +":. c #FB6162", +">. c #FC6565", +",. c #FC6666", +"<. c #FC6969", +"1. c #FC6A6A", +"2. c #FD6D6D", +"3. c #FD6F6F", +"4. c #FD7071", +"5. c #FE7273", +"6. c #FE7474", +"7. c #FE7676", +"8. c #FE7777", +"9. c #FE7979", +"0. c #FF7B7A", +"q. c #FF7B7B", +/* pixels */ +", , , , , , : , : - : - & & % % ", +", q.q.q.8.6.4.3.1.>.:.%.o.| ( @ ", +", q.*.&.@.....[ E Y C c f f ^ @ ", +", 8.*.o.....) E Y S z k u r P + ", +", 8.@.O.[ ) ~ -.G n f u w 9 V + ", +", 5...[ [ E =.H F J u r 8 6 M + ", +": 3.[ ) E S N K D i 0 8 6 4 l X ", +": 1.) E S C c f u w 8 6 4 2 h . ", +": >.R S C k f u 0 8 4 4 1 < a . ", +"- :.%.+.o.| ^ P L B M l h a p . ", +"& & % % % % @ @ + + X X . " +}; diff --git a/src/pixmaps/flags_xpm/makeflags.sh b/src/pixmaps/flags_xpm/makeflags.sh new file mode 100755 index 00000000..8b9ae133 --- /dev/null +++ b/src/pixmaps/flags_xpm/makeflags.sh @@ -0,0 +1,59 @@ +#!/bin/sh + +# Create Makefile.am +echo > Makefile.am +echo 'EXTRA_DIST = \' >> Makefile.am +ls *.xpm | sed -e 's/^/\t/' | sed -e 's/$/ \\/' >> Makefile.am +echo ' makeflags.sh' >> Makefile.am + +# Create CountryFlags.h and header +echo > CountryFlags.h +echo >> CountryFlags.h +echo '#ifndef COUNTRY_FLAGS_H' >> CountryFlags.h +echo '#define COUNTRY_FLAGS_H' >> CountryFlags.h +echo >> CountryFlags.h +echo >> CountryFlags.h + +# Create include directives +ls *.xpm | sed -e 's/^/#include "/' | sed -e 's/$/"/' >> CountryFlags.h +echo >> CountryFlags.h +echo >> CountryFlags.h + +# Define the struct +echo 'struct FlagXPMCode' >> CountryFlags.h +echo '{' >> CountryFlags.h +echo ' const char **xpm;' >> CountryFlags.h +echo ' const char *code;' >> CountryFlags.h +echo '};' >> CountryFlags.h +echo >> CountryFlags.h +echo >> CountryFlags.h + +# "do" is a reserved word, we can't use it +#sed -i -e 's/do\[\]/do_\[\]/' do.xpm + +# globally used names by wx +#sed -i -e 's/ht\[\]/ht_\[\]/' ht.xpm +#sed -i -e 's/it\[\]/it_\[\]/' it.xpm +#sed -i -e 's/sz\[\]/sz_\[\]/' sz.xpm + +# Create the flag/Code vector +echo 'static struct FlagXPMCode flagXPMCodeVector[] = {'>> CountryFlags.h +ls *.xpm | xargs -i basename '{}' .xpm | \ + sed -e 's/[A-Za-z]*/\t{&, "&"},/' | \ + sed -e 's/do/do_/1' | + sed -e 's/ht/ht_/1' | + sed -e 's/it/it_/1' | + sed -e 's/sz/sz_/1' \ + >> CountryFlags.h +echo '};'>> CountryFlags.h +echo >> CountryFlags.h +echo >> CountryFlags.h + +# Calculate the vector size +echo 'static const int FLAGS_XPM_SIZE = (sizeof flagXPMCodeVector) / (sizeof flagXPMCodeVector[0]);' >> CountryFlags.h +echo >> CountryFlags.h +echo >> CountryFlags.h + +# Finish +echo '#endif // COUNTRY_FLAGS_H' >> CountryFlags.h + diff --git a/src/pixmaps/flags_xpm/mc.xpm b/src/pixmaps/flags_xpm/mc.xpm new file mode 100644 index 00000000..2ef232cc --- /dev/null +++ b/src/pixmaps/flags_xpm/mc.xpm @@ -0,0 +1,123 @@ +/* XPM */ +static const char *mc[] = { +/* columns rows colors chars-per-pixel */ +"16 11 106 2", +" c #E50000", +". c #E70000", +"X c #E90000", +"o c #EB0000", +"O c #ED0000", +"+ c #EF0000", +"@ c #F10000", +"# c #F30000", +"$ c #F50000", +"% c #F70000", +"& c #F90000", +"* c #FB0000", +"= c #FD0000", +"- c red", +"; c #FD0505", +": c #F42020", +"> c #F52525", +", c #F52626", +"< c #F62B2B", +"1 c #F62C2C", +"2 c #F73030", +"3 c #F73131", +"4 c #F83636", +"5 c #F83736", +"6 c #F83737", +"7 c #F53F3F", +"8 c #F93B3C", +"9 c #F93C3C", +"0 c #F93C3D", +"q c #F64444", +"w c #FA4141", +"e c #FA4142", +"r c #FA4242", +"t c #FB4646", +"y c #FB4747", +"u c #F74949", +"i c #F34C4C", +"p c #F74E4E", +"a c #FC4B4B", +"s c #FC4C4C", +"d c #FD4F50", +"f c #F45151", +"g c #F55555", +"h c #F85353", +"j c #FD5151", +"k c #F95757", +"l c #FD5454", +"z c #F65A5A", +"x c #F75E5E", +"c c #FE5858", +"v c #FE5959", +"b c #FA5C5C", +"n c #FE5C5C", +"m c #FE5F5F", +"M c #F46666", +"N c #FB6060", +"B c #F86363", +"V c #F96767", +"C c #FC6565", +"Z c #FA6B6B", +"A c #FC6969", +"S c #FD6D6D", +"D c #FB7070", +"F c #FD7071", +"G c #FC7474", +"H c #FE7474", +"J c #FE7676", +"K c #FE7777", +"L c #FC7778", +"P c #FE7979", +"I c #FD7A7A", +"U c #FF7B7A", +"Y c #FF7B7B", +"T c #FE9393", +"R c #C5C5C5", +"E c gray78", +"W c gray79", +"Q c #C9CBC9", +"! c #CBCBCB", +"~ c gray81", +"^ c gray82", +"/ c LightGray", +"( c #D7D7D7", +") c gray85", +"_ c gray86", +"` c #DFDFDF", +"' c gray89", +"] c gray90", +"[ c #E7E7E7", +"{ c #E9E9E9", +"} c gray92", +"| c #F1F1F1", +" . c gray95", +".. c #F2F2F3", +"X. c #F3F3F3", +"o. c #F4F4F4", +"O. c gray96", +"+. c #F6F6F6", +"@. c gray97", +"#. c #F8F8F8", +"$. c #F9F9F9", +"%. c gray98", +"&. c #FBFBFB", +"*. c #FBFCFB", +"=. c gray99", +"-. c #FDFDFD", +/* pixels */ +"- - - - - * - * * * % % # # + + ", +"- Y Y Y K H F S A V N b k g p X ", +"- Y m n n j j s t w 0 6 3 1 u X ", +"- K m k l j s t w 8 6 3 1 , q . ", +"- K n j s s t w 9 5 2 < , : 7 ", +"; T Y L K D Z V B x z g p p M ", +"} =.%.*.%.%.%.@.@.@.@.X.X.....! ", +"} %.%.=.%.%.@.@.@.X.X.X.......W ", +"[ =.%.%.#.#.@.@.X.X.X...| | ..R ", +"] *.%.%.#.@.@.@.@.@.X.......| R ", +"' ' ` _ ) ( ( / ^ ~ ! Q E R Q R " +}; diff --git a/src/pixmaps/flags_xpm/md.xpm b/src/pixmaps/flags_xpm/md.xpm new file mode 100644 index 00000000..52a7555a --- /dev/null +++ b/src/pixmaps/flags_xpm/md.xpm @@ -0,0 +1,172 @@ +/* XPM */ +static const char *md[] = { +/* columns rows colors chars-per-pixel */ +"16 11 155 2", +" c #9F0000", +". c #A10000", +"X c #A30000", +"o c #A50000", +"O c #A70000", +"+ c #A90000", +"@ c #AD0000", +"# c #B10000", +"$ c #B30000", +"% c #B90000", +"& c #BB0000", +"* c #BF0000", +"= c #C10000", +"- c #C50000", +"; c #C70000", +": c #D3291A", +"> c #D42C1D", +", c #D53022", +"< c #D63122", +"1 c #D73527", +"2 c #D73627", +"3 c #D73628", +"4 c #D83B2C", +"5 c #D83B2D", +"6 c #DA4032", +"7 c #DB4133", +"8 c #D84538", +"9 c #DC4538", +"0 c #DC4638", +"q c #DD4639", +"w c #D8483B", +"e c #DA4B3E", +"r c #DA4B3F", +"t c #DE4B3D", +"y c #DE4B3E", +"u c #DB4E41", +"i c #DB4F42", +"p c #DF5043", +"a c #DD5346", +"s c #DE574B", +"d c #DF5B50", +"f c #E15448", +"g c #E2594C", +"h c #E16054", +"j c #E26459", +"k c #E4695D", +"l c #E56C61", +"z c #E67066", +"x c #97823C", +"c c #97833D", +"v c #E3BB00", +"b c #E5BD00", +"n c #E7BF00", +"m c #E9C100", +"M c #EDC700", +"N c #EBC900", +"B c #FBD100", +"V c #FDD300", +"C c #F7D900", +"Z c #F9DB00", +"A c #FDDF00", +"S c #FDE300", +"D c #F4E31E", +"F c #F2D723", +"G c #F4D929", +"H c #F3E026", +"J c #F4E12B", +"K c #F7EA2E", +"L c #F5E230", +"P c #F5E331", +"I c #F6E436", +"U c #F5E43D", +"Y c #F7E63C", +"T c #9A8642", +"R c #9A8743", +"E c #9E8B48", +"W c #A08D4C", +"Q c #A49152", +"! c #A79457", +"~ c #A99652", +"^ c #AF9E57", +"/ c #B1A15C", +"( c #ED9E41", +") c #D1BE52", +"_ c #EEA046", +"` c #DED042", +"' c #E7D84E", +"] c #F4E344", +"[ c #F8E640", +"{ c #F8E842", +"} c #F9E845", +"| c #F6E54C", +" . c #F9E948", +".. c #FAE94B", +"X. c #FAEA4D", +"o. c #F7E750", +"O. c #F7E855", +"+. c #FBEB51", +"@. c #FCEC56", +"#. c #F8E95A", +"$. c #FDED5B", +"%. c #FDEE5E", +"&. c #FDF351", +"*. c #FCEE65", +"=. c #FBED6A", +"-. c #FCEF72", +";. c #FDF075", +":. c #FDF17A", +">. c #FEF27B", +",. c #000099", +"<. c #00009D", +"1. c #0000A1", +"2. c #0000A5", +"3. c #0000A9", +"4. c #0000AB", +"5. c #0000AF", +"6. c #0000B3", +"7. c #0000B5", +"8. c #0000B9", +"9. c #0003BB", +"0. c #0005BB", +"q. c #0007BB", +"w. c #0009BB", +"e. c #3C5ACD", +"r. c #415FCF", +"t. c #4663D0", +"y. c #4A67D2", +"u. c #4C67D2", +"i. c #4F6CD4", +"p. c #516CD4", +"a. c #5470D6", +"s. c #5571D6", +"d. c #5671D6", +"f. c #5974D7", +"g. c #5E78D6", +"h. c #5A75D8", +"j. c #5E79D9", +"k. c #5F79D9", +"l. c #5F79DA", +"z. c #637BD8", +"x. c #627CDB", +"c. c #637CDB", +"v. c #677FD9", +"b. c #667FDC", +"n. c #6B83DB", +"m. c #6982DD", +"M. c #6F87DD", +"N. c #748ADD", +"B. c #788EDF", +"V. c #7B90E1", +"C. c #7F94E2", +"Z. c #8195E2", +"A. c #8196E2", +"S. c #8497E2", +"D. c #8498E2", +/* pixels */ +"w.w.w.w.q.A S V B Z C ; ; * * & ", +"w.D.D.A.C.>.>.-.-.*.=.z l k j & ", +"w.S.m.b.c.%.&./ ^ X...p t q h # ", +"q.A.b.c.l.$.' ) ~ ` { t 0 7 d # ", +"9.C.c.l.h.@.! g f E Y q 7 5 s @ ", +"9.V.l.h.d.+.Q _ ( R I 5 5 3 a O ", +"6.B.f.d.i...W r.e.c P 4 2 < i O ", +"6.N.p.p.u.} [ R c P J 2 < > r X ", +"5.M.i.y.t.[ K G F D G < > : w ", +"4.n.v.z.g.#.O.o.| Y ] i e w 8 ", +"4.1.1.<.,.N N m n n v X X X " +}; diff --git a/src/pixmaps/flags_xpm/me.xpm b/src/pixmaps/flags_xpm/me.xpm new file mode 100644 index 00000000..c1fbcac0 --- /dev/null +++ b/src/pixmaps/flags_xpm/me.xpm @@ -0,0 +1,161 @@ +/* XPM */ +static const char *me[] = { +/* columns rows colors chars-per-pixel */ +"16 12 143 2", +" c #5D3B68", +". c #C80308", +"X c #CA0308", +"o c #CB0308", +"O c #CC0308", +"+ c #CD0308", +"@ c #CF0308", +"# c #D00309", +"$ c #D10309", +"% c #D20309", +"& c #D40309", +"* c #D50309", +"= c #D60309", +"- c #D70309", +"; c #D80309", +": c #D90309", +"> c #DB0309", +", c #DC0309", +"< c #DD0309", +"1 c #DF0309", +"2 c #E40006", +"3 c #E00309", +"4 c #E10309", +"5 c #E30309", +"6 c #E40309", +"7 c #E50409", +"8 c #E70409", +"9 c #E80409", +"0 c #EA040A", +"q c #EB040A", +"w c #EC040A", +"e c #EE040A", +"r c #EF040A", +"t c #F0040A", +"y c #F1040A", +"u c #F3040A", +"i c #F4040A", +"p c #F5040A", +"a c #F6040A", +"s c #F7040A", +"d c #FA040A", +"f c #E32412", +"g c #EC2112", +"h c #D44135", +"j c #D54135", +"k c #D74135", +"l c #D84135", +"z c #D94135", +"x c #DB4135", +"c c #DC4136", +"v c #DD4136", +"b c #E04136", +"n c #E14136", +"m c #E24136", +"M c #E34136", +"N c #E54136", +"B c #E74136", +"V c #E84136", +"C c #EA4136", +"Z c #EC4236", +"A c #ED4236", +"S c #EE4236", +"D c #F04237", +"F c #F24237", +"G c #F34237", +"H c #F44237", +"J c #F64237", +"K c #F84237", +"L c #FB4237", +"P c #FC4237", +"I c #D86426", +"U c #DC6826", +"Y c #DE772B", +"T c #E96F29", +"R c #219C7C", +"E c #42A668", +"W c #DE9C32", +"Q c #F08831", +"! c #F38A31", +"~ c #E29433", +"^ c #E69634", +"/ c #E89C33", +"( c #D8A72A", +") c #DAA92A", +"_ c #DBAA2A", +"` c #DEAD2A", +"' c #D5B235", +"] c #D6B335", +"[ c #D8B335", +"{ c #D8B535", +"} c #D9B535", +"| c #DBB737", +" . c #DDB837", +".. c #DFB938", +"X. c #E1AE2B", +"o. c #E3B02C", +"O. c #E7B32C", +"+. c #EBB52E", +"@. c #EFB92F", +"#. c #E3A034", +"$. c #E8A437", +"%. c #EBAE3A", +"&. c #E3B43D", +"*. c #E7B53D", +"=. c #EDB63E", +"-. c #E1BC38", +";. c #E3BD39", +":. c #E6B83F", +">. c #E8BC3B", +",. c #EBBA3F", +"<. c #F2BC30", +"1. c #E6C03A", +"2. c #E7C13A", +"3. c #EBC33C", +"4. c #EDC63C", +"5. c #EFC73D", +"6. c #F2CB3E", +"7. c #F6CE3F", +"8. c #FED438", +"9. c #FFD839", +"0. c #FFDB3A", +"q. c #FFDF3C", +"w. c #FFE23D", +"e. c #FFE63E", +"r. c #FFE73E", +"t. c #FFE93F", +"y. c #FFEB3F", +"u. c #FFED3F", +"i. c #D3AC44", +"p. c #E3BC40", +"a. c #E9BC40", +"s. c #FAD041", +"d. c #FBD141", +"f. c #FED441", +"g. c #FFD642", +"h. c #FFD843", +"j. c #FFDA43", +"k. c #FFDD45", +"l. c #FFDE45", +"z. c #FFDF46", +"x. c #FFE146", +"c. c #0F65B1", +"v. c #0E66B1", +/* pixels */ +"x.x.x.x.x.z.z.k.h.h.g.g.s.s.7.6.", +"u.P P L L J J J J D A A A C C <.", +"y.L d s s s y e r q 8 5 5 1 M @.", +"y.L s s y y e / $.2 5 1 > > M +.", +"e.J s r r ! g %.#.f ^ > > & M O.", +"e.J t r q Q =.v.v.*.~ > & % v X.", +"w.D e q 8 T ,.R E &.U & % % v X.", +"q.D 9 6 5 1 1 a.:.i. % + + z ` ", +"0.C 6 1 < < >.Y :.I W O O o k _ ", +"0.C 5 1 < : & & O O O o O o h _ ", +"8.B N M M v v v v z k k h h h ( ", +"4.4.4.2.2.-.-... . .{ { ] ] ' ' " +}; diff --git a/src/pixmaps/flags_xpm/mg.xpm b/src/pixmaps/flags_xpm/mg.xpm new file mode 100644 index 00000000..5ae4b20f --- /dev/null +++ b/src/pixmaps/flags_xpm/mg.xpm @@ -0,0 +1,149 @@ +/* XPM */ +static const char *mg[] = { +/* columns rows colors chars-per-pixel */ +"16 11 132 2", +" c #002700", +". c #002900", +"X c #002D00", +"o c #002F00", +"O c #003100", +"+ c #003300", +"@ c #003500", +"# c #003900", +"$ c #003D00", +"% c #003F00", +"& c #004100", +"* c #004700", +"= c #005D00", +"- c #9B0000", +"; c #E70000", +": c #E90000", +"> c #EB0000", +", c #ED0000", +"< c #EF0000", +"1 c #F10000", +"2 c #F30000", +"3 c #F50000", +"4 c #F70000", +"5 c #F90000", +"6 c #FB0000", +"7 c #FD0000", +"8 c #CE311A", +"9 c #D1351F", +"0 c #D23A25", +"q c #D43F2B", +"w c #F42020", +"e c #F52525", +"r c #F52626", +"t c #F62B2B", +"y c #F62C2C", +"u c #F73030", +"i c #F73131", +"p c #F83636", +"a c #F83736", +"s c #F83737", +"d c #F53F3F", +"f c #F93B3C", +"g c #F93C3C", +"h c #F93C3D", +"j c #D64430", +"k c #D84936", +"l c #D54E3B", +"z c #D94E3B", +"x c #DB5240", +"c c #F64444", +"v c #FA4141", +"b c #FA4142", +"n c #FA4242", +"m c #FB4646", +"M c #FB4747", +"N c #F74949", +"B c #F74E4E", +"V c #FC4B4B", +"C c #FC4C4C", +"Z c #F85353", +"A c #FD5151", +"S c #F95757", +"D c #FA5C5C", +"F c #E7675D", +"G c #FB6060", +"H c #FC6062", +"J c #FC6565", +"K c #FD6666", +"L c #FC6969", +"P c #FD6A6A", +"I c #FD6D6D", +"U c #FD7071", +"Y c #0B950B", +"T c #0F970E", +"R c #109710", +"E c #139913", +"W c #149914", +"Q c #189C19", +"! c #199C19", +"~ c #1E9F1E", +"^ c #1F9F1F", +"/ c #14A314", +"( c #19A519", +") c #1FA81F", +"_ c #23A123", +"` c #24A224", +"' c #24AB24", +"] c #29A429", +"[ c #2AA42A", +"{ c #2CA22C", +"} c #2FA42F", +"| c #2EA62E", +" . c #2FA72F", +".. c #2AAD2A", +"X. c #2FB02F", +"o. c #32A532", +"O. c #33A632", +"+. c #34A934", +"@. c #35A835", +"#. c #35AD35", +"$. c #39A939", +"%. c #3BAE3A", +"&. c #3DAC3D", +"*. c #36B036", +"=. c #42AE42", +"-. c #46B046", +";. c #4BB14B", +":. c #4DB44D", +">. c #52B752", +",. c #55BB58", +"<. c #64BD64", +"1. c #FE8585", +"2. c gray85", +"3. c gray86", +"4. c #DFDFDF", +"5. c #E1E1E1", +"6. c gray89", +"7. c gray90", +"8. c #E7E7E7", +"9. c #E9E9E9", +"0. c gray92", +"q. c gray93", +"w. c #EFEFEF", +"e. c #F9F9F9", +"r. c gray98", +"t. c #FBFBFB", +"y. c #FBFCFB", +"u. c gray99", +"i. c #FDFCFD", +"p. c #FDFDFD", +"a. c #FEFEFE", +"s. c gray100", +/* pixels */ +"w.w.w.w.0.7 7 7 6 6 4 4 2 2 , , ", +"w.s.s.s.s.1.U I L J G D S Z B > ", +"w.s.s.s.s.L A C m b f a i y N > ", +"w.s.t.s.s.K V m b d a i t r c ; ", +"0.s.s.t.s.G m b f a i t r w c ; ", +"0.s.t.s.t.F x z k j q 0 8 8 l - ", +"0.t.t.y.t.,.%.#.....' ) ( / #.* ", +"8.s.t.t.t.>.+.| | ` ^ ! W R O.+ ", +"8.t.e.t.t.:.| ] _ ^ Q E T Y } X ", +"6.t.t.t.e.<.;.-.=.&.$.@.O.} { ", +"6.6.4.3.2.= & $ & $ # + X X . @ " +}; diff --git a/src/pixmaps/flags_xpm/mh.xpm b/src/pixmaps/flags_xpm/mh.xpm new file mode 100644 index 00000000..b96d7b3e --- /dev/null +++ b/src/pixmaps/flags_xpm/mh.xpm @@ -0,0 +1,174 @@ +/* XPM */ +static const char *mh[] = { +/* columns rows colors chars-per-pixel */ +"16 11 157 2", +" c #000013", +". c #000017", +"X c #000019", +"o c #00001B", +"O c #00001F", +"+ c #3B0000", +"@ c #000025", +"# c #000027", +"$ c #00002D", +"% c #000033", +"& c #000039", +"* c #00003F", +"= c #000045", +"- c #00004B", +"; c #00004F", +": c #000051", +"> c #000055", +", c #00005B", +"< c #00005F", +"1 c #000065", +"2 c #000069", +"3 c #00006B", +"4 c #00006D", +"5 c #00006F", +"6 c #000071", +"7 c #000073", +"8 c #000175", +"9 c #000375", +"0 c #000777", +"q c #000979", +"w c #00097B", +"e c #0F2973", +"r c #47436B", +"t c #EB0000", +"y c #E95D00", +"u c #D3743C", +"i c #F2762C", +"p c #AF6F59", +"a c #BB785D", +"s c #846B77", +"d c #957577", +"f c #A26E62", +"g c #E27E41", +"h c #F6812D", +"j c #F78135", +"k c #F7924B", +"l c #D28A62", +"z c #F5A56F", +"x c #F7A96B", +"c c #F6A86E", +"v c #F8A86A", +"b c #F1A674", +"n c #143B8F", +"m c #123D8F", +"M c #164192", +"N c #174192", +"B c #194092", +"V c #184393", +"C c #1B4494", +"Z c #1E4896", +"A c #1E4897", +"S c #204997", +"D c #234997", +"F c #2C509B", +"G c #32579E", +"H c #35599E", +"J c #36599F", +"K c #365BA1", +"L c #345AA2", +"P c #375CA1", +"I c #385CA1", +"U c #3B60A4", +"Y c #3C64AD", +"T c #3D65B0", +"R c #5E6795", +"E c #54679C", +"W c #726984", +"Q c #6F7196", +"! c #7E7E9D", +"~ c #4662A2", +"^ c #4062A4", +"/ c #4265A7", +"( c #4D69A7", +") c #4267AE", +"_ c #4769A9", +"` c #476AAD", +"' c #4A6AAB", +"] c #4B6AAB", +"[ c #496DAF", +"{ c #4C6EAF", +"} c #4269B0", +"| c #4168B2", +" . c #466AB1", +".. c #4568B2", +"X. c #496FB4", +"o. c #4E71B0", +"O. c #4F71B0", +"+. c #5071B1", +"@. c #5172B1", +"#. c #5374B2", +"$. c #5375B3", +"%. c #5475B3", +"&. c #5575B3", +"*. c #5C7AB2", +"=. c #5879B4", +"-. c #5879B5", +";. c #587AB9", +":. c #5E7FB9", +">. c #6B83B1", +",. c #6581B9", +"<. c #6582B9", +"1. c #6683BD", +"2. c #6C86B9", +"3. c #6A86BC", +"4. c #6E8ABE", +"5. c #6F8BBE", +"6. c #718DC0", +"7. c #728EC0", +"8. c #758FC2", +"9. c #718FC4", +"0. c #7590C2", +"q. c #7190C5", +"w. c #7892C3", +"e. c #7F98C7", +"r. c #B2A4AC", +"t. c #CF9D82", +"y. c #D8C1B9", +"u. c #F5CDAE", +"i. c #F7DEBF", +"p. c #F8D8B8", +"a. c #8A9EC6", +"s. c #849BC8", +"d. c #859BC8", +"f. c #97A7CE", +"g. c #90A7D1", +"h. c #9DADD1", +"j. c #9CADD2", +"k. c #AEB8CF", +"l. c #A3B3D5", +"z. c #A9B6D6", +"x. c #B6C2DD", +"c. c #BFC7D9", +"v. c #B9C3DC", +"b. c #B5C5E1", +"n. c #F5DECC", +"m. c #F6E3CC", +"M. c #F6E2D3", +"N. c #C3CBE2", +"B. c #D6DAE6", +"V. c #D7E0EE", +"C. c #E7E7E7", +"Z. c #EEEFF3", +"A. c #EEF3F5", +"S. c #F4F4F4", +"D. c gray96", +"F. c #FDFDFE", +"G. c #FEFEFE", +/* pixels */ +"w w w w 0 8 9 2 2 1 < , > : ; + ", +"w s.x.N.s.w.5.8.5.3.,.:.;.! l t ", +"w j.G.G.f.-.&.#.X.` T ~ f i k y ", +"w l.G.G.h.&.{ { ` Y W u h z M.C.", +"9 e.z.v.,.o.[ | E p j c n.D.A.2.", +"9 8.=.$.o. .) s g c m.D.B.a.*.@ ", +"4 7.#.o...R a v i.A.x.2.F n P O ", +"2 5.X.( d b p.B.f.] S V V N I o ", +"1 1.Q t.u.c.q.L A A Z C N m H . ", +"< r.y.k.q.O.] ] _ / ^ I P H H ", +"r e 2 - = * & % $ @ @ @ o . " +}; diff --git a/src/pixmaps/flags_xpm/mk.xpm b/src/pixmaps/flags_xpm/mk.xpm new file mode 100644 index 00000000..3fc14796 --- /dev/null +++ b/src/pixmaps/flags_xpm/mk.xpm @@ -0,0 +1,180 @@ +/* XPM */ +static const char *mk[] = { +/* columns rows colors chars-per-pixel */ +"16 11 163 2", +" c #DD0000", +". c #DF0000", +"X c #DD0300", +"o c #E10000", +"O c #E30000", +"+ c #E50000", +"@ c #E70000", +"# c #E90000", +"$ c #EB0000", +"% c #ED0000", +"& c #EF0000", +"* c #F10000", +"= c #F30000", +"- c #F50000", +"; c #F70000", +": c #F90000", +"> c #FB0000", +", c #FD0000", +"< c red", +"1 c #F21010", +"2 c #F31919", +"3 c #F41E1E", +"4 c #EF3100", +"5 c #EB3D00", +"6 c #FD3500", +"7 c #FD3900", +"8 c #F32C19", +"9 c #F42D1F", +"0 c #F52626", +"q c #F52D24", +"w c #F52E25", +"e c #F72E2E", +"r c #F6382B", +"t c #F33232", +"y c #F33535", +"u c #F83434", +"i c #F83E34", +"p c #F43939", +"a c #F53E3D", +"s c #F93C3D", +"d c #F34D00", +"f c #F74D00", +"g c #F24014", +"h c #F24114", +"j c #F25A13", +"k c #FF6700", +"l c #FF7700", +"z c #F4791F", +"x c #F44020", +"c c #F2472F", +"v c #F65D2B", +"b c #F24B32", +"n c #F9423C", +"m c #F56524", +"M c #F66F2A", +"N c #F6762A", +"B c #F7772F", +"V c #F46E36", +"C c #F86C37", +"Z c #F56C3F", +"A c #F77230", +"S c #F87636", +"D c #F9793A", +"F c #F97C3A", +"G c #F64444", +"H c #FA4242", +"J c #F74B4B", +"K c #FB4949", +"L c #FB5145", +"P c #FC514B", +"I c #FB5A49", +"U c #F85050", +"Y c #FD5151", +"T c #F95455", +"R c #FD5454", +"E c #FD5950", +"W c #FD5C54", +"Q c #FA5C5C", +"! c #FE5C5C", +"~ c #FB6645", +"^ c #F76549", +"/ c #FA7940", +"( c #FC714F", +") c #F96857", +"_ c #F96F58", +"` c #FE7158", +"' c #FE7F59", +"] c #FB6060", +"[ c #FC6665", +"{ c #FC6A6A", +"} c #FC7866", +"| c #FD7071", +" . c #FE7474", +".. c #FE7777", +"X. c #FE7979", +"o. c #F1940B", +"O. c #F39D19", +"+. c #F6842B", +"@. c #F88436", +"#. c #F78F30", +"$. c #F98D3A", +"%. c #F5AC23", +"&. c #F6A729", +"*. c #F6AE2C", +"=. c #F5B625", +"-. c #F2BE2F", +";. c #F7BF2F", +":. c #F7AE31", +">. c #FAAF3F", +",. c #F9BC3C", +"<. c #DDDD00", +"1. c #E7C500", +"2. c #E9C700", +"3. c #F1CA0E", +"4. c #F4D81F", +"5. c #E5E500", +"6. c #EDEF00", +"7. c #FBE300", +"8. c #FDE300", +"9. c #F5F500", +"0. c #FDFD00", +"q. c yellow", +"w. c #F3E61A", +"e. c #F8C035", +"r. c #F7D431", +"t. c #FADB3F", +"y. c #F2E32C", +"u. c #F8F836", +"i. c #F4F43B", +"p. c #F9F93B", +"a. c #FB8346", +"s. c #FA8942", +"d. c #FB8947", +"f. c #FC844B", +"g. c #FA9640", +"h. c #FB9646", +"j. c #FE8859", +"k. c #FD9751", +"l. c #FAAF44", +"z. c #FABE41", +"x. c #FBBE47", +"c. c #FCBA4C", +"v. c #FDBF54", +"b. c #FD996F", +"n. c #FE8879", +"m. c #FF8F7A", +"M. c #FE9776", +"N. c #F6CF42", +"B. c #F7CD46", +"V. c #FCC84B", +"C. c #F8C753", +"Z. c #FEC45F", +"A. c #FAD35D", +"S. c #FCE74F", +"D. c #F7EF4E", +"F. c #FEE25C", +"G. c #FDF353", +"H. c #FCDE69", +"J. c #FDDD6D", +"K. c #FFD97B", +"L. c #FBF062", +"P. c #FEFD73", +"I. c #FFF77B", +/* pixels */ +"q.k < < < : < 8.7.: ; ; * * 4 6.", +"l I.K.n. . .| J.H.[ ] Q ) C.D.5 ", +"< m.Z.F.j.R Y c.x.H s C r.*.^ # ", +"< X.! ' v.k.P d.s.n @.:.v 0 G @ ", +"6 M.` W E f.a.z.,.S B r w x ~ O ", +"q.P.G.S.V.h.h.p.u.#.+.=.4.w.i.5.", +"7 b.( I L / F ;.;.M m 9 8 h S . ", +": { K ~ >.$.i B N q z O.h 1 t . ", +": } l.t.F u e &.%.3 2 j 3.o.c . ", +"f L.A._ T U J B.N.a p y b -.y. ", +"9.d * % % % # 2.1.O O O . <." +}; diff --git a/src/pixmaps/flags_xpm/ml.xpm b/src/pixmaps/flags_xpm/ml.xpm new file mode 100644 index 00000000..6a7135f4 --- /dev/null +++ b/src/pixmaps/flags_xpm/ml.xpm @@ -0,0 +1,164 @@ +/* XPM */ +static const char *ml[] = { +/* columns rows colors chars-per-pixel */ +"16 11 147 2", +" c #005300", +". c #005B00", +"X c #006300", +"o c #006700", +"O c #006F00", +"+ c #007500", +"@ c #007700", +"# c #007B00", +"$ c #007F00", +"% c #DD0000", +"& c #DF0000", +"* c #E10000", +"= c #E30000", +"- c #E50000", +"; c #E70000", +": c #E90000", +"> c #EB0000", +", c #ED0000", +"< c #EF0000", +"1 c #F10000", +"2 c #F30000", +"3 c #F50000", +"4 c #F10B0B", +"5 c #F10F0E", +"6 c #F21010", +"7 c #F21313", +"8 c #F21414", +"9 c #F31919", +"0 c #F31A1A", +"q c #F41F1F", +"w c #F42020", +"e c #F52525", +"r c #F52626", +"t c #F62B2B", +"y c #F22C2C", +"u c #F22F2F", +"i c #F62C2C", +"p c #F23232", +"a c #F33232", +"s c #F73131", +"d c #F33535", +"f c #F43636", +"g c #F83737", +"h c #F43B3B", +"j c #F53F3F", +"k c #F64444", +"l c #F74949", +"z c #F74E4E", +"x c #F85353", +"c c #F95757", +"v c #FA5C5C", +"b c #008300", +"n c #008500", +"m c #008700", +"M c #008900", +"N c #009100", +"B c #3AAA3A", +"V c #3FAE3F", +"C c #40AD3F", +"Z c #44B144", +"A c #45B045", +"S c #45B145", +"D c #4BB34B", +"F c #49B449", +"G c #4FB64F", +"H c #4FB74F", +"J c #50B550", +"K c #54B555", +"L c #54B754", +"P c #53B953", +"I c #54B954", +"U c #58B958", +"Y c #59BA59", +"T c #58BB59", +"R c #58BC58", +"E c #5CBD5C", +"W c #5DBC5D", +"Q c #5FBF5F", +"! c #61BE62", +"~ c #66C066", +"^ c #6AC36A", +"/ c #6FC46F", +"( c #72C673", +") c #77C777", +"_ c #76C876", +"` c #79C879", +"' c #7BCA7A", +"] c #7BCA7B", +"[ c #E3A300", +"{ c #CBDF00", +"} c #F7C500", +"| c #F3D319", +" . c #F4D51F", +".. c #E5E500", +"X. c #E7E700", +"o. c #E9E900", +"O. c #EBEB00", +"+. c #E3F300", +"@. c #F9F900", +"#. c #FBFB00", +"$. c #FDFD00", +"%. c #F4F41E", +"&. c #F5D724", +"*. c #F6D92B", +"=. c #F7DA30", +"-. c #F8DC36", +";. c #F4D839", +":. c #F9DE3D", +">. c #F5F523", +",. c #F5F524", +"<. c #F6F629", +"1. c #F6F62A", +"2. c #F7F72E", +"3. c #F7F72F", +"4. c #E8F234", +"5. c #E9F33A", +"6. c #F7F730", +"7. c #F8F834", +"8. c #F8F835", +"9. c #F8F836", +"0. c #F5F53D", +"q. c #F9F93A", +"w. c #F9F93B", +"e. c #F9F93C", +"r. c #EBF440", +"t. c #ECF546", +"y. c #EDF64B", +"u. c #F6F642", +"i. c #F7F746", +"p. c #FAFA40", +"a. c #FAFA41", +"s. c #FAFA42", +"d. c #FBFB46", +"f. c #FBFB47", +"g. c #F7F74B", +"h. c #FCFC4B", +"j. c #FCFC4C", +"k. c #EAF350", +"l. c #EEF751", +"z. c #F0F854", +"x. c #FDFD51", +"c. c #FBE460", +"v. c #FCFC65", +"b. c #FCFC69", +"n. c #FDFD6D", +"m. c #F3FA74", +"M. c #FDFD71", +/* pixels */ +"N M M n b +.$.$.#.#.} 3 3 1 < < ", +"n ] ] ] ` m.M.n.b.v.c.v c x z > ", +"n ] Q E Y z.x.j.f.s.:.f s i l > ", +"M ] Q I L l.j.f.s.e.-.s t r k - ", +"n _ I I L y.f.s.e.9.*.t r q j - ", +"n ( P H D t.e.w.9.6.*.e q 0 h - ", +"$ / H F S 5.e.9.6.1.&.q 0 8 f = ", +"# ^ F S V 5.9.6.1.,.&.0 6 6 a & ", +"@ ! Z V B 4.3.1.,.%.| 6 6 4 u & ", +"O ! Q U K k.g.i.u.0.;.d a u y % ", +"@ o X . { O.o.X.X.[ = & % % % " +}; diff --git a/src/pixmaps/flags_xpm/mm.xpm b/src/pixmaps/flags_xpm/mm.xpm new file mode 100644 index 00000000..ae44573a --- /dev/null +++ b/src/pixmaps/flags_xpm/mm.xpm @@ -0,0 +1,147 @@ +/* XPM */ +static const char *mm[] = { +/* columns rows colors chars-per-pixel */ +"16 11 130 2", +" c #DD0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #ED0000", +"% c #EF0000", +"& c #F10000", +"* c #F30000", +"= c #F50000", +"- c #F70000", +"; c #F90000", +": c #FB0000", +"> c #F10B0B", +", c #F10F0E", +"< c #F21010", +"1 c #F21313", +"2 c #F21414", +"3 c #F31919", +"4 c #F31A1A", +"5 c #F41E1E", +"6 c #F41F1F", +"7 c #F42020", +"8 c #F52323", +"9 c #F52424", +"0 c #F52525", +"q c #F52626", +"w c #F62929", +"e c #F62A2A", +"r c #F62B2B", +"t c #F22C2C", +"y c #F22F2F", +"u c #F62C2C", +"i c #F72E2E", +"p c #F72F2F", +"a c #F23232", +"s c #F33232", +"d c #F73030", +"f c #F73131", +"g c #F33535", +"h c #F43636", +"j c #F83434", +"k c #F83636", +"l c #F83736", +"z c #F83737", +"x c #F23539", +"c c #F43939", +"v c #F43B3B", +"b c #F53D3D", +"n c #F53F3F", +"m c #F93A3A", +"M c #F93B3C", +"N c #F93C3C", +"B c #F93C3D", +"V c #FA3F3F", +"C c #F03B42", +"Z c #F64242", +"A c #F14047", +"S c #F64444", +"D c #F74646", +"F c #FA4142", +"G c #FA4242", +"H c #FA4444", +"J c #FB4545", +"K c #FB4747", +"L c #F1454C", +"P c #F74949", +"I c #F74B4B", +"U c #F74E4E", +"Y c #FB4949", +"T c #F14A51", +"R c #F34F56", +"E c #F85050", +"W c #F85353", +"Q c #F95455", +"! c #F95757", +"~ c #F95858", +"^ c #FA5C5C", +"/ c #FA5D5D", +"( c #FB6060", +") c #FB6162", +"_ c #FC6565", +"` c #FC6666", +"' c #FC6969", +"] c #FC6A6A", +"[ c #F66F74", +"{ c #0000B7", +"} c #0000C1", +"| c #0000C3", +" . c #0000C5", +".. c #0000C7", +"X. c #0000C9", +"o. c #453BCE", +"O. c #4740D3", +"+. c #4641D3", +"@. c #4B46D3", +"#. c #4C47D5", +"$. c #4646DD", +"%. c #4B4BDB", +"&. c #514CD7", +"*. c #5E57D6", +"=. c #5D58D7", +"-. c #5151DD", +";. c #5558DE", +":. c #6C65DA", +">. c #716DDF", +",. c #7672DE", +"<. c #7070E4", +"1. c #7779E5", +"2. c #7979E3", +"3. c #7D7DE4", +"4. c #8080E5", +"5. c #8183E7", +"6. c #8282E6", +"7. c #9495EA", +"8. c #A9ABED", +"9. c #AEAFED", +"0. c #B0B0EE", +"q. c #B4B5F0", +"w. c #B9B9F1", +"e. c #BABAF0", +"r. c #BABAF1", +"t. c #C1C1F2", +"y. c #DBDBF7", +"u. c #DCDCF8", +"i. c #DDDDF9", +"p. c #DEDEF8", +/* pixels */ +"..| | X.| | ..{ : : : * * * % # ", +"| 3.7.t.r.2.<.>.' _ ( / ~ W U # ", +"| 6.r.p.y.0.-.&.K G b z f u P # ", +"| 3.r.p.y.9.%.#.G N j f r q S O ", +"..1.5.0.9.;.$.O.m h p r q 7 b O ", +"{ ,.=.:.=.@.O.o.j d r q 6 4 N O ", +"% [ R T L A C x f r 8 6 4 2 h X ", +": ] Y J V m j d r q 6 4 2 < a . ", +": _ J V m j p r 8 5 4 < , > y . ", +"= ) / ~ Q U P D G b c h a y y . ", +"= * % % % % # O O O O X . " +}; diff --git a/src/pixmaps/flags_xpm/mn.xpm b/src/pixmaps/flags_xpm/mn.xpm new file mode 100644 index 00000000..ad8be20d --- /dev/null +++ b/src/pixmaps/flags_xpm/mn.xpm @@ -0,0 +1,158 @@ +/* XPM */ +static const char *mn[] = { +/* columns rows colors chars-per-pixel */ +"16 11 141 2", +" c #DD0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #ED0000", +"% c #EF0000", +"& c #F10000", +"* c #F30000", +"= c #F50000", +"- c #F70000", +"; c #F90000", +": c #FB0000", +"> c #FD0000", +", c red", +"< c #F10B0B", +"1 c #F10F0E", +"2 c #F21010", +"3 c #F21313", +"4 c #F21414", +"5 c #F31919", +"6 c #F31A1A", +"7 c #F41F1F", +"8 c #F42020", +"9 c #F52525", +"0 c #F52626", +"q c #F62B2B", +"w c #F22C2C", +"e c #F22F2F", +"r c #F62C2C", +"t c #F23232", +"y c #F33232", +"u c #F73131", +"i c #F33535", +"p c #F43636", +"a c #F83737", +"s c #F43B3B", +"d c #F53F3F", +"f c #F95B3A", +"g c #FA5F3F", +"h c #F64444", +"j c #F74949", +"k c #F74E4E", +"l c #F85353", +"z c #FD5650", +"x c #F95757", +"c c #FD5454", +"v c #F95B55", +"b c #FE5959", +"n c #FA5C5C", +"m c #FB6545", +"M c #FC6A4B", +"N c #FA655D", +"B c #F96958", +"V c #FE6B5C", +"C c #FB7162", +"Z c #FE7777", +"A c #FF7B7A", +"S c #FF7B7B", +"D c #FE7F79", +"F c #FAD33F", +"G c #FD8354", +"H c #FAB244", +"J c #FDAC53", +"K c #FEAC58", +"L c #FE8776", +"P c #FFB57B", +"I c #FBCC49", +"U c #FBDA45", +"Y c #FCD04F", +"T c #FCD64F", +"R c #FBDA49", +"E c #FEC359", +"W c #FECE5F", +"Q c #FEDE5C", +"! c #FCD866", +"~ c #FCDB6A", +"^ c #FDDD6F", +"/ c #FEC879", +"( c #FEDC73", +") c #0000D3", +"_ c #0000D9", +"` c #0000E5", +"' c #0000E7", +"] c #0000E9", +"[ c #0000EB", +"{ c #0000EF", +"} c #1E19EE", +"| c #0000F9", +" . c #0000FB", +".. c #0000FD", +"X. c #1E1EF4", +"o. c #241FEF", +"O. c #2323F5", +"+. c #2424F5", +"@. c #2A24F0", +"#. c #2929F6", +"$. c #2A2AF6", +"%. c #2E2EF7", +"&. c #2F2FF7", +"*. c #302BF1", +"=. c #3530F2", +"-. c #3030F7", +";. c #3C37F3", +":. c #3E39F0", +">. c #3D3DF5", +",. c #3434F8", +"<. c #3535F8", +"1. c #3636F8", +"2. c #3B3BF9", +"3. c #3C3CF9", +"4. c #4135EC", +"5. c #473BED", +"6. c #413CF5", +"7. c #4D41EE", +"8. c #5B50EE", +"9. c #4242F6", +"0. c #4646F7", +"q. c #4B4BF7", +"w. c #4040FA", +"e. c #4141FA", +"r. c #4241FA", +"t. c #4242FA", +"y. c #4646FB", +"u. c #4747FB", +"i. c #4B4BFC", +"p. c #4C4CFC", +"a. c #5246F0", +"s. c #574CF1", +"d. c #5B51F2", +"f. c #5151FD", +"g. c #6055F2", +"h. c #6560F7", +"j. c #6565FC", +"k. c #6969FC", +"l. c #6D6DFD", +"z. c #7D75F5", +"x. c #7070FE", +/* pixels */ +", , , , , ] .... . .{ = * * % % ", +", S P D Z z.x.l.k.j.h.n x l k @ ", +", S W V b d.f.p.u.t.6.a u r j @ ", +", / Q E c d.p.y.e.>.;.u r 0 h + ", +", L K G z s.y.e.3.1.*.q 0 8 d + ", +": ( J T M a.w.2.1.-.*.9 8 6 s + ", +", ^ Y R m 7.2.<.-.$.@.7 6 4 p X ", +": ~ I U g 5.,.%.$.+.o.6 4 2 t . ", +"= ! H F f 4.%.$.+.X.} 3 1 < e . ", +"= C N B v 8.q.y.9.>.:.p t e w . ", +"= = * % % ) ] ] ' ' _ X . . " +}; diff --git a/src/pixmaps/flags_xpm/mo.xpm b/src/pixmaps/flags_xpm/mo.xpm new file mode 100644 index 00000000..32293b1b --- /dev/null +++ b/src/pixmaps/flags_xpm/mo.xpm @@ -0,0 +1,172 @@ +/* XPM */ +static const char *mo[] = { +/* columns rows colors chars-per-pixel */ +"16 11 155 2", +" c #002700", +". c #002900", +"X c #002D00", +"o c #002F00", +"O c #003100", +"+ c #003300", +"@ c #003500", +"# c #003900", +"$ c #003B00", +"% c #003D00", +"& c #003F00", +"* c #004500", +"= c #004B00", +"- c #004D00", +"; c #005100", +": c #005700", +"> c #005D00", +", c #006100", +"< c #006300", +"1 c #006700", +"2 c #006D00", +"3 c #006F00", +"4 c #007100", +"5 c #007500", +"6 c #007700", +"7 c #007B00", +"8 c #007D00", +"9 c #007F00", +"0 c #008100", +"q c #008300", +"w c #008500", +"e c #008700", +"r c #008900", +"t c #009100", +"y c #0B950B", +"u c #0F970E", +"i c #109710", +"p c #139813", +"a c #149914", +"s c #149A14", +"d c #199B19", +"f c #1A9C1A", +"g c #1B9C1B", +"h c #209F20", +"j c #25A125", +"k c #26A226", +"l c #28A22B", +"z c #2BA52B", +"x c #2CA22C", +"c c #2CA62C", +"v c #2FA42F", +"b c #39AA2B", +"n c #30A530", +"m c #32A532", +"M c #33A632", +"N c #31A931", +"B c #35A835", +"V c #36A836", +"C c #37A937", +"Z c #37AA37", +"A c #39A939", +"S c #3AAB3A", +"D c #3BAA3B", +"F c #3DAB3D", +"G c #3EAC3E", +"H c #3FAD3F", +"J c #3FAF3F", +"K c #41AE30", +"L c #40AE3F", +"P c #45B036", +"I c #45B13D", +"U c #4BB33E", +"Y c #42AD42", +"T c #44AF44", +"R c #45AE45", +"E c #44B144", +"W c #45B045", +"Q c #45B245", +"! c #46B146", +"~ c #47B047", +"^ c #46B247", +"/ c #45B049", +"( c #49B049", +") c #49B249", +"_ c #4BB24B", +"` c #49B449", +"' c #49B549", +"] c #4EB44E", +"[ c #4FB74F", +"{ c #51B542", +"} c #57B94B", +"| c #5CBB4B", +" . c #5FBD4C", +".. c #50B350", +"X. c #53B753", +"o. c #54B755", +"O. c #53B953", +"+. c #56B950", +"@. c #54B954", +"#. c #57BA54", +"$. c #58B957", +"%. c #58B958", +"&. c #59BB59", +"*. c #58BC58", +"=. c #58BC59", +"-. c #5CBB5C", +";. c #5CBD5C", +":. c #5DBC5D", +">. c #5CBE5C", +",. c #5FBF5F", +"<. c #62BE51", +"1. c #61BD60", +"2. c #61BE62", +"3. c #66BA67", +"4. c #65BE65", +"5. c #66C066", +"6. c #6AC16A", +"7. c #6AC36A", +"8. c #6FC46F", +"9. c #71C569", +"0. c #71C56D", +"q. c #70C371", +"w. c #72C673", +"e. c #74C774", +"r. c #76C876", +"t. c #77C877", +"y. c #79C879", +"u. c #79C979", +"i. c #7BCA7A", +"p. c #7BCA7B", +"a. c #7FC97E", +"s. c #9CC027", +"d. c #A7C737", +"f. c #BED44D", +"g. c #B2D050", +"h. c #B9D456", +"j. c #86CB88", +"k. c #93CD93", +"l. c #97CF97", +"z. c #9AD19A", +"x. c #A8D7AA", +"c. c #ABDAAB", +"v. c #AEDCAF", +"b. c #B4DCB4", +"n. c #B8DEB7", +"m. c #D1EAD1", +"M. c #D6EAD6", +"N. c #D8ECD8", +"B. c #DCECDC", +"V. c #E1EDE1", +"C. c #EEF4EE", +"Z. c #F3F6F3", +"A. c #F3F7F4", +"S. c #F6F6F6", +"D. c #F9F9F9", +/* pixels */ +"t r r r w w q 7 6 6 4 2 1 , > , ", +"w p.p.p.t.e.q.0.9.4.2.=.-.o...- ", +"r p.,.;.&.#.<. .f./ J Z N c _ = ", +"w y.;.*.$.h.} 7.g./ J d.c k R * ", +"r r.*.O.+.| Q v.A./ K b k h H & ", +"q w.O.[ g.j.c.N.A.n.x.l s.f D $ ", +"9 8.[ ` Q m.D.C.M.S.B.k.d a C @ ", +"7 7.` Q Y Q ] R G Y n g a i M O ", +"6 5.E J S A z.b.V.l.3.p u y v X ", +"3 2.-.&.@...( ( R G A B M v x ", +"6 1 < > : ; - * & $ $ O X X . @ " +}; diff --git a/src/pixmaps/flags_xpm/mp.xpm b/src/pixmaps/flags_xpm/mp.xpm new file mode 100644 index 00000000..9f7b8444 --- /dev/null +++ b/src/pixmaps/flags_xpm/mp.xpm @@ -0,0 +1,169 @@ +/* XPM */ +static const char *mp[] = { +/* columns rows colors chars-per-pixel */ +"16 11 152 2", +" c #00001D", +". c #00001F", +"X c #000023", +"o c #000027", +"O c #000029", +"+ c #00002B", +"@ c #00002F", +"# c #000031", +"$ c #000033", +"% c #000037", +"& c #000039", +"* c #00003B", +"= c #00003F", +"- c #000041", +"; c #000045", +": c #00004B", +"> c #000051", +", c #000057", +"< c #00005D", +"1 c #000361", +"2 c #000767", +"3 c #000B67", +"4 c #000F6B", +"5 c #00116D", +"6 c #001771", +"7 c #001D73", +"8 c #001F77", +"9 c #002377", +"0 c #002379", +"q c #00257B", +"w c #00297D", +"e c #002B7D", +"r c #002D7F", +"t c #F4DB7F", +"y c #002D81", +"u c #305794", +"i c #345B96", +"p c #375E98", +"a c #385F99", +"s c #395F99", +"d c #3C629B", +"f c #3D639C", +"g c #3658A3", +"h c #41679E", +"j c #42679E", +"k c #476AA1", +"l c #486CA1", +"z c #4B6EA1", +"x c #4E6FA3", +"c c #4C70A5", +"v c #4D70A5", +"b c #4D78AC", +"n c #5072A5", +"m c #5172A5", +"M c #5475A7", +"N c #5575A7", +"B c #5274A8", +"V c #5777A9", +"C c #5979A9", +"Z c #5879AB", +"A c #5D7CAC", +"S c #5D7DAE", +"D c #476BB2", +"F c #466AB9", +"G c #517BC4", +"H c #6B9F9D", +"J c #6180AE", +"K c #778EA6", +"L c #6281B1", +"P c #6584B1", +"I c #6684B2", +"U c #6685B4", +"Y c #6785B4", +"T c #6A87B3", +"R c #608AB3", +"E c #6A88B3", +"W c #6B89B6", +"Q c #6E8AB6", +"! c #6F8BB6", +"~ c #6F8CB9", +"^ c #7284B5", +"/ c #708DB9", +"( c #728EB9", +") c #738FB9", +"_ c #728FBB", +"` c #7691BA", +"' c #7692BB", +"] c #7692BD", +"[ c #7E97BA", +"{ c #7A95BD", +"} c #7995BE", +"| c #7F99BF", +" . c #7DA1A3", +".. c #7F97C1", +"X. c #7A95C6", +"o. c #829488", +"O. c #89A488", +"+. c #809ABB", +"@. c #869CB9", +"#. c #9EB5A6", +"$. c #8FA2B7", +"%. c #94A6B9", +"&. c #ADBCB5", +"*. c #A6B8BD", +"=. c #A9BBBF", +"-. c #C9B980", +";. c #C0B897", +":. c #E6BF99", +">. c #F4BFAA", +",. c #D7CA8A", +"<. c #D0D095", +"1. c #E5C881", +"2. c #EFDF87", +"3. c #EFD58D", +"4. c #F4D68D", +"5. c #E9CE90", +"6. c #EED190", +"7. c #E0DD9F", +"8. c #F4E486", +"9. c #FAE295", +"0. c #F7E59B", +"q. c #C3C1A6", +"w. c #CDD4AA", +"e. c #C0CCBE", +"r. c #D3CFB1", +"t. c #CFD4BA", +"y. c #DDDCBB", +"u. c #E3D4A2", +"i. c #E6DFA5", +"p. c #FDEDA4", +"a. c #FAF0A6", +"s. c #FCE8B4", +"d. c #F3E8B8", +"f. c #839BC2", +"g. c #849AC1", +"h. c #859EC3", +"j. c #89A1C6", +"k. c #8BA4C7", +"l. c #8DA4C8", +"z. c #8FA5C8", +"x. c #8FA6C8", +"c. c #91A6C7", +"v. c #90A7C9", +"b. c #90A7CA", +"n. c #A1B2C3", +"m. c #ACBDC1", +"M. c #B2C2C5", +"N. c #B4C3C8", +"B. c #B4C5CA", +"V. c #B8C5E2", +"C. c #CCD5D8", +"Z. c #F8F8F8", +/* pixels */ +"y y y y w q 0 7 6 4 2 1 < , > : ", +"y b.b.x.c.n.e.d.s.y.%.) ) ! W ; ", +"y b.} ] @.w.-.5.>.9.,.K M v I = ", +"r x.] _ &.p.#.| B.^ 1.i.x z S & ", +"w k._ ~ u.<.F ..V.g .2.k h A $ ", +"9 k.~ W i.t.X.c.Z.g.D 8.h f C # ", +"8 h.W W r.p.b [ C.G O.3.d s N O ", +"6 g.U S @.5.5.=.=.q.t o.p i m X ", +"5 +.L A C H 0.=.*.4.;.p i u n ", +"3 } ] _ ! T I B.M.R V N v v z ", +"1 < , > : ; - & $ # @ o X " +}; diff --git a/src/pixmaps/flags_xpm/mq.xpm b/src/pixmaps/flags_xpm/mq.xpm new file mode 100644 index 00000000..55a42317 --- /dev/null +++ b/src/pixmaps/flags_xpm/mq.xpm @@ -0,0 +1,166 @@ +/* XPM */ +static const char *mq[] = { +/* columns rows colors chars-per-pixel */ +"16 11 149 2", +" c #000015", +". c #000017", +"X c #000019", +"o c #00001D", +"O c #000027", +"+ c #000031", +"@ c #000035", +"# c #000037", +"$ c #000041", +"% c #000045", +"& c #00004D", +"* c #000051", +"= c #000053", +"- c #00005D", +"; c #000063", +": c #000065", +"> c #000069", +", c #00006B", +"< c #000071", +"1 c #000173", +"2 c #000575", +"3 c #000F7B", +"4 c #00117D", +"5 c #00177F", +"6 c #001B83", +"7 c #001D83", +"8 c #002587", +"9 c #2F509A", +"0 c #33529C", +"q c #35559D", +"w c #37559D", +"e c #38589F", +"r c #3755A3", +"t c #435FA1", +"y c #415EA2", +"u c #425EA2", +"i c #4865A6", +"p c #4864A7", +"a c #4965A8", +"s c #4966A8", +"d c #4E68A8", +"f c #4F6AA8", +"g c #4E69AB", +"h c #506BAA", +"j c #506BAC", +"k c #596FAF", +"l c #5B71A5", +"z c #5B73A5", +"x c #5671AF", +"c c #5872B0", +"v c #5873B1", +"b c #5D76B1", +"n c #5E77B1", +"m c #5F77B1", +"M c #5C76B2", +"N c #5F78B1", +"B c #6079B2", +"V c #667CB1", +"C c #617AB6", +"Z c #6981B9", +"A c #7187BD", +"S c #7188BC", +"D c #748ABE", +"F c #768CBE", +"G c #778CBE", +"H c #778CBF", +"J c #788EC1", +"K c #7A8FC1", +"L c #8094C3", +"P c #8195C5", +"I c #8296C5", +"U c #8598C3", +"Y c #8598C7", +"T c #8C9CC2", +"R c #8B9DC5", +"E c #8A9CC9", +"W c #8A9DC9", +"Q c #93A4CD", +"! c #96A6CC", +"~ c #9BA9CF", +"^ c #9BABCF", +"/ c #9FAECE", +"( c #A1AFCE", +") c #A5B2D0", +"_ c #A7B5D7", +"` c #B2BCD4", +"' c #B3BDD6", +"] c #B3BED7", +"[ c #B6C0D9", +"{ c #B6C1DA", +"} c #B6C1DC", +"| c #B9C2D8", +" . c #B8C2DB", +".. c #BCC5DB", +"X. c #B9C5DE", +"o. c #BAC4DE", +"O. c #BBC5DE", +"+. c #BDC6DD", +"@. c #BEC7DD", +"#. c #BEC8DE", +"$. c #BFC8DF", +"%. c #C3CBDC", +"&. c #C3CBDD", +"*. c #C2CAE0", +"=. c #C7CFE3", +"-. c #C9D1E1", +";. c #C8D0E2", +":. c #C8D1E4", +">. c #CAD2E5", +",. c #CBD3E6", +"<. c #CDD4E5", +"1. c #CFD5E4", +"2. c #D0D6E2", +"3. c #D0D7E7", +"4. c #D5D9E6", +"5. c #D6DBE7", +"6. c #D9DEE7", +"7. c #D0D8E9", +"8. c #D1D8EA", +"9. c #D6DBE8", +"0. c #D5DDEC", +"q. c #DBDEE8", +"w. c #DDE2EF", +"e. c gray90", +"r. c #E7E7E7", +"t. c #E1E6ED", +"y. c #E9E9E9", +"u. c #E0E5F0", +"i. c #E7E9F0", +"p. c #E6EAF1", +"a. c #E6E9F3", +"s. c #E6EAF3", +"d. c #EAEDF3", +"f. c #ECEDF1", +"g. c #EFF0F1", +"h. c #F4F4F4", +"j. c #F4F5F5", +"k. c gray96", +"l. c #F6F6F6", +"z. c gray97", +"x. c #F6F7FA", +"c. c #F7F7FA", +"v. c #F8F8F8", +"b. c #F9F9F9", +"n. c gray98", +"m. c #FBFBFB", +"M. c gray99", +"N. c #FDFDFD", +"B. c #FEFEFE", +/* pixels */ +"8 7 P _ r 4 3 B.b.< : k R > = = ", +"6 W Q w.0.P L B.B.H S H 9.@.B % ", +"7 W J X.s.A C B.b.v j x { 1.m $ ", +"5 Y ,.s.d.D v b.b.g a -.5.-.N # ", +"^ 8.} X.X.=.$.b.b. .] / ) ( ..z ", +"B.B.B.c.c.M.b.b.b.v.k.h.f.g.k.e.", +"~ 8.t.s.,.@.@.v.k.{ ' 5.6.' | z ", +"2 J V 8.*.a p c.k.e 0 f %.V u o ", +"< J m ! <.b i k.k.w 9 w T ` u X ", +"> D :.i.t.U B v.k.h g &.6.2.t ", +", - - ; - & $ y.y.+ O + # # " +}; diff --git a/src/pixmaps/flags_xpm/mr.xpm b/src/pixmaps/flags_xpm/mr.xpm new file mode 100644 index 00000000..e1697fd8 --- /dev/null +++ b/src/pixmaps/flags_xpm/mr.xpm @@ -0,0 +1,172 @@ +/* XPM */ +static const char *mr[] = { +/* columns rows colors chars-per-pixel */ +"16 11 155 2", +" c #002500", +". c #002900", +"X c #003100", +"o c #003300", +"O c #003700", +"+ c #003900", +"@ c #003B00", +"# c #003D00", +"$ c #003F00", +"% c #004300", +"& c #004500", +"* c #004900", +"= c #004B00", +"- c #004F00", +"; c #005500", +": c #005B00", +"> c #005D00", +", c #005F00", +"< c #006500", +"1 c #006700", +"2 c #006B00", +"3 c #006D00", +"4 c #006F00", +"5 c #007300", +"6 c #007700", +"7 c #007900", +"8 c #007D00", +"9 c #008100", +"0 c #008500", +"q c #008700", +"w c #008900", +"e c #008B00", +"r c #009500", +"t c #0B950B", +"y c #0F970E", +"u c #1F891F", +"i c #1F8B1F", +"p c #1E8E1E", +"a c #109710", +"s c #139A13", +"d c #149A14", +"f c #1F941F", +"g c #199919", +"h c #199B19", +"j c #189C19", +"k c #1A9D1A", +"l c #239023", +"z c #259625", +"x c #299329", +"c c #2E992E", +"v c #308D30", +"b c #369436", +"n c #3B973B", +"m c #3A9A3A", +"M c #20A020", +"N c #26A226", +"B c #2BA32B", +"V c #2CA22C", +"C c #2CA62C", +"Z c #2FA42F", +"A c #30A630", +"S c #32A532", +"D c #33A632", +"F c #36A436", +"G c #31A931", +"H c #34A934", +"J c #35A835", +"K c #36A836", +"L c #37A936", +"P c #37A837", +"I c #3CA03C", +"U c #39A939", +"Y c #3BAA3B", +"T c #3AAD3A", +"R c #3BAE3C", +"E c #3DAC3D", +"W c #3DAE3D", +"Q c #3FAD3F", +"! c #3FAF3F", +"~ c #40AE3F", +"^ c #43B031", +"/ c #6BC025", +"( c #409A40", +") c #45A145", +"_ c #42AD42", +"` c #44AF44", +"' c #46AC46", +"] c #46AF46", +"[ c #4BA84B", +"{ c #4FAE4F", +"} c #41B241", +"| c #44B144", +" . c #45B245", +".. c #49B249", +"X. c #4BB34B", +"o. c #49B449", +"O. c #49B549", +"+. c #4BB54B", +"@. c #4EB44E", +"#. c #4FB74F", +"$. c #54AF54", +"%. c #50B450", +"&. c #51B451", +"*. c #51B751", +"=. c #53B753", +"-. c #54B755", +";. c #53BA53", +":. c #54B854", +">. c #58B957", +",. c #58B958", +"<. c #59B959", +"1. c #58BA59", +"2. c #58BC58", +"3. c #5CBB5C", +"4. c #5CBD5C", +"5. c #5DBC5D", +"6. c #5CBE5C", +"7. c #5FBF5F", +"8. c #61BE60", +"9. c #61BE62", +"0. c #65BE65", +"q. c #69BA69", +"w. c #6DBC6D", +"e. c #7AC84B", +"r. c #63C054", +"t. c #66C066", +"y. c #6AC36A", +"u. c #6FC46F", +"i. c #70C371", +"p. c #72C673", +"a. c #74C774", +"s. c #76C876", +"d. c #77C877", +"f. c #79C879", +"g. c #79C979", +"h. c #7BCA7A", +"j. c #7BCA7B", +"k. c #80C824", +"l. c #8CCD2F", +"z. c #9DD32B", +"x. c #82C934", +"c. c #90CF35", +"v. c #D9EC24", +"b. c #DDED2B", +"n. c #EFF52A", +"m. c #EFF62F", +"M. c #F6F62A", +"N. c #F9F93A", +"B. c #A2D847", +"V. c #A3D94C", +"C. c #ADDD50", +"Z. c #D2EB40", +"A. c #EFF746", +"S. c #FAFA42", +"D. c #FAFB47", +/* pixels */ +"r w w e w w 0 9 8 6 5 4 2 < > < ", +"0 j.j.j.d.a.i.w.q.0.9.5.:.-.#.= ", +"w j.7.6.1.-.&.V.B._ E P G C ..- ", +"w j.7.:.r.*.[ D.S.I P ^ B N .& ", +"w s.2.$.C.O.' | R F D z.z M E % ", +"0 p.;.{ e.A.( n b v b./ f k Y $ ", +"9 u.#.O.) b.A.c.l.M.v.u h d P + ", +"8 y.O. ._ m x.m.M./ u h d a D o ", +"7 t. .E R J c x z p g s y t Z . ", +"4 9.7.>.=.&.X.' ~ ~ Y L D Z V . ", +"6 < < > : ; ; = & $ $ O O . . $ " +}; diff --git a/src/pixmaps/flags_xpm/ms.xpm b/src/pixmaps/flags_xpm/ms.xpm new file mode 100644 index 00000000..187e1b47 --- /dev/null +++ b/src/pixmaps/flags_xpm/ms.xpm @@ -0,0 +1,177 @@ +/* XPM */ +static const char *ms[] = { +/* columns rows colors chars-per-pixel */ +"16 11 160 2", +" c #000011", +". c #000015", +"X c #000017", +"o c #000019", +"O c #00001D", +"+ c #000023", +"@ c #000025", +"# c #000029", +"$ c #00002B", +"% c #00002F", +"& c #000031", +"* c #000035", +"= c #000037", +"- c #00003D", +"; c #000043", +": c #000049", +"> c #00004F", +", c #000055", +"< c #000059", +"1 c #00005B", +"2 c #00005D", +"3 c #00005F", +"4 c #000063", +"5 c #000067", +"6 c #000069", +"7 c #00006D", +"8 c #7F1947", +"9 c #67235D", +"0 c #6B3371", +"q c #CD1517", +"w c #8D1D43", +"e c #81214F", +"r c #B15D75", +"t c #C36B7D", +"y c #D66C71", +"u c #E26867", +"i c #E47271", +"p c #E87A76", +"a c #E07578", +"s c #E07B7E", +"d c #9D964A", +"f c #9B8A55", +"g c #9E8C57", +"h c #9E8D58", +"j c #A49360", +"k c #91A571", +"l c #94A775", +"z c #C59E44", +"x c #EA817E", +"c c #000383", +"v c #001795", +"b c #1E2A8E", +"n c #2F2583", +"m c #232E91", +"M c #273293", +"N c #2C3796", +"B c #283A98", +"V c #2D3F9B", +"C c #2E3F9B", +"Z c #313C99", +"A c #33449E", +"S c #33449F", +"D c #36459D", +"F c #3B459F", +"G c #38489E", +"H c #3848A1", +"J c #3849A2", +"K c #394AA2", +"L c #3D4DA4", +"P c #3E4EA5", +"I c #424B9D", +"U c #434C9D", +"Y c #4E509E", +"T c #404BA0", +"R c #404BA1", +"E c #424CA3", +"W c #464FA3", +"Q c #4251A4", +"! c #4352A7", +"~ c #4453A7", +"^ c #4655A6", +"/ c #4950A0", +"( c #4E55A1", +") c #4E56A4", +"_ c #4D56A6", +"` c #4857AA", +"' c #4A59A9", +"] c #4958AA", +"[ c #4D5BAA", +"{ c #4F5EAB", +"} c #4D5CAD", +"| c #4E5CAD", +" . c #4E5CAE", +".. c #5259A4", +"X. c #5A5CA7", +"o. c #535CAA", +"O. c #5160AD", +"+. c #5360AE", +"@. c #5260B0", +"#. c #5261B0", +"$. c #5764B0", +"%. c #5765B2", +"&. c #5865B0", +"*. c #5C69B3", +"=. c #5B6CB7", +"-. c #6361A7", +";. c #6067AD", +":. c #6469AE", +">. c #6D69AB", +",. c #606DB5", +"<. c #6470B7", +"1. c #6572B8", +"2. c #6875B9", +"3. c #6975BA", +"4. c #6E7ABD", +"5. c #717AB9", +"6. c #747ABA", +"7. c #717EBE", +"8. c #777FBC", +"9. c #5E7FD7", +"0. c #8B6C9D", +"q. c #AB7594", +"w. c #836DA3", +"e. c #8B70A1", +"r. c #9A7FA6", +"t. c #9B7EA7", +"y. c #7581C0", +"u. c #7F9AC2", +"i. c #6482D9", +"p. c #6886DB", +"a. c #6C89DD", +"s. c #6D89DD", +"d. c #708CDF", +"f. c #718DDF", +"g. c #7490E0", +"h. c #7591E0", +"j. c #7994E2", +"k. c #948AB9", +"l. c #9F90B9", +"z. c #D3808B", +"x. c #C68496", +"c. c #C18499", +"v. c #E08384", +"b. c #E69394", +"n. c #EE9E9C", +"m. c #EEA19F", +"M. c #D89EA9", +"N. c #D7ACB7", +"B. c #D8AAB6", +"V. c #E1B2BA", +"C. c #869ED2", +"Z. c #8EA3CC", +"A. c #91A1C5", +"S. c #9DA4D0", +"D. c #9CAAD5", +"F. c #D7B6C4", +"G. c #DFB9C3", +"H. c #DFD3DE", +"J. c #E3C2CA", +"K. c #E2CBD4", +/* pixels */ +"t w.v 8 w c 9 r 6 4 2 1 , > : ; ", +"n G.H.B.M.F.K.S.8.6.3.,.:.:.%.- ", +"q b.x i u p a y -.o.j.h.f.s.o.* ", +"e V.n.s v.m.z.q.X.) g.Z.A.p.[ % ", +">.J.l.c.x.D.N.r.) W d.u.l i...# ", +"0 k.=.e.0.} 5.r.Y L a.A.k i.( + ", +"7 y.%.@.} ] ~ P J H j z g f W O ", +"6 7.@.} ` ~ P J S C Z g d m L o ", +"4 4.} ] Q P J D C B N M m b D . ", +"4 3.1.,.*.&.+.} _ ~ Q E E I D ", +", , , ; ; - * & % + + O . . " +}; diff --git a/src/pixmaps/flags_xpm/mt.xpm b/src/pixmaps/flags_xpm/mt.xpm new file mode 100644 index 00000000..d0d39c68 --- /dev/null +++ b/src/pixmaps/flags_xpm/mt.xpm @@ -0,0 +1,128 @@ +/* XPM */ +static const char *mt[] = { +/* columns rows colors chars-per-pixel */ +"16 11 111 2", +" c #DD0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #ED0000", +"% c #EF0000", +"& c #F10000", +"* c #F30000", +"= c #F50000", +"- c #F70000", +"; c #F90000", +": c #FB0000", +"> c #F10B0B", +", c #F10F0E", +"< c #F21010", +"1 c #F21313", +"2 c #F21414", +"3 c #F31919", +"4 c #F31A1A", +"5 c #F41E1E", +"6 c #F41F1F", +"7 c #F42020", +"8 c #F52424", +"9 c #F52525", +"0 c #F52626", +"q c #F62A2A", +"w c #F62B2B", +"e c #F22C2C", +"r c #F22F2F", +"t c #F62C2C", +"y c #F23232", +"u c #F33232", +"i c #F53030", +"p c #F73030", +"a c #F73131", +"s c #F33535", +"d c #F43636", +"f c #F63636", +"g c #F83636", +"h c #F83736", +"j c #F83737", +"k c #F43939", +"l c #F43B3B", +"z c #F73B3B", +"x c #F53D3D", +"c c #F53F3F", +"v c #F93C3C", +"b c #F93C3D", +"n c #F64444", +"m c #F84141", +"M c #FA4242", +"N c #F94747", +"B c #F74949", +"V c #F64C4C", +"C c #F74E4E", +"Z c #FA4C4C", +"A c #F85353", +"S c #FB5252", +"D c #F95757", +"F c #FA5C5C", +"G c #FB6060", +"H c #FC6565", +"J c #FC7272", +"K c #BDB8B8", +"L c #C9C8C8", +"P c #CFCDCD", +"I c #D9C5C5", +"U c #D3D2D2", +"Y c #D6D4D3", +"T c gray86", +"R c #DDDDDD", +"E c #EFDDDD", +"W c #E1E1E1", +"Q c gray89", +"! c gray90", +"~ c #E7E7E7", +"^ c gray92", +"/ c gray93", +"( c #EFEFEF", +") c #F6EAEA", +"_ c #F7EBEC", +"` c #F1EFEF", +"' c #F7EDED", +"] c #F8EDED", +"[ c #F9EEEE", +"{ c #FAEFEF", +"} c #F1F1F1", +"| c #F3F1F1", +" . c #F3F3F3", +".. c gray96", +"X. c gray97", +"o. c #FBF0F0", +"O. c #FCF2F2", +"+. c #FDF5F5", +"@. c #F8F8F8", +"#. c #F9F9F9", +"$. c #FAF9F9", +"%. c gray98", +"&. c #FBFBFB", +"*. c #FBFCFB", +"=. c gray99", +"-. c #FDFCFD", +";. c #FDFDFD", +":. c #FEFCFC", +">. c #FEFDFC", +",. c #FDFDFE", +"<. c #FEFEFE", +/* pixels */ +"} ` } } . . .E ; ; - - * * $ $ ", +"..$.U >.>.>.-.X.J H G F D A C # ", +"} Y K P >.-.>.o.S M b j a t B # ", +"..>.L >.-.-.-.o.Z v f a w 0 n O ", +" .>.-.-.-.-.*.{ N j t w 0 6 c O ", +"} >.-.-.-.*.$.' M a t 0 6 4 l O ", +"} >.-.*.*.*.#.' l w 0 6 4 2 f o ", +"( -.$.-.#.#.X.' f 8 7 4 < < y . ", +"/ -.#.#.#.#.X.) t 6 4 < < > r . ", +"/ -.$.#.#.#.X.' B c k s y r e ", +"^ ~ ! Q W R T I O O O o . " +}; diff --git a/src/pixmaps/flags_xpm/mu.xpm b/src/pixmaps/flags_xpm/mu.xpm new file mode 100644 index 00000000..b61c2a57 --- /dev/null +++ b/src/pixmaps/flags_xpm/mu.xpm @@ -0,0 +1,178 @@ +/* XPM */ +static const char *mu[] = { +/* columns rows colors chars-per-pixel */ +"16 11 161 2", +" c black", +". c #001700", +"X c #001900", +"o c #001B00", +"O c #001F00", +"+ c #002500", +"@ c #002900", +"# c #002D00", +"$ c #003300", +"% c #003900", +"& c #003D00", +"* c #00003F", +"= c #490000", +"- c #004300", +"; c #004900", +": c #004D00", +"> c #005300", +", c #005900", +"< c #005F00", +"1 c #006300", +"2 c #000049", +"3 c #00194B", +"4 c #495C7B", +"5 c #4E607E", +"6 c #870000", +"7 c #A70000", +"8 c #AB0000", +"9 c #AF0000", +"0 c #B10000", +"q c #B30000", +"w c #B70000", +"e c #B90000", +"r c #BD0000", +"t c #C10000", +"y c #C30000", +"u c #C70000", +"i c #CD0000", +"p c #A52C41", +"a c #A83146", +"s c #AA374B", +"d c #AD3C50", +"f c #B04254", +"g c #B34759", +"h c #B1495B", +"j c #B54C5E", +"k c #B85162", +"l c #B95466", +"z c #BB5969", +"x c #BD5C6D", +"c c #BE5F70", +"v c #DC4E4E", +"b c #DD5353", +"n c #DE5757", +"m c #E05C5C", +"M c #E16060", +"N c #E26565", +"B c #E36969", +"V c #E56D6D", +"C c #E67071", +"Z c #E77474", +"A c #E87777", +"S c #E87979", +"D c #E87B7B", +"F c #E97B7B", +"G c #0F8B00", +"H c #2C9E2C", +"J c #2F9F2F", +"K c #32A232", +"L c #35A435", +"P c #39A539", +"I c #3DA83D", +"U c #61B900", +"Y c #42AA42", +"T c #46AD46", +"R c #4BAF4B", +"E c #50B250", +"W c #54B455", +"Q c #58B758", +"! c #5DB95D", +"~ c #61BB62", +"^ c #88C50B", +"/ c #8BC70E", +"( c #8EC813", +") c #91CA19", +"_ c #94CC1E", +"` c #96CE23", +"' c #9ACD2F", +"] c #99D029", +"[ c #9CD12E", +"{ c #9FD334", +"} c #A2D53A", +"| c #A6D73F", +" . c #DFDF00", +".. c #E3E300", +"X. c #FBFB00", +"o. c #FDFD00", +"O. c #F2F210", +"+. c #F2F214", +"@. c #F3F319", +"#. c #F4F41F", +"$. c #F5F524", +"%. c #F6F62A", +"&. c #F7F72F", +"*. c #F3F332", +"=. c #F4F436", +"-. c #F8F834", +";. c #F8F835", +":. c #F9F93A", +">. c #FAFA3F", +",. c #A8D944", +"<. c #B9E066", +"1. c #FAFA40", +"2. c #FBFB45", +"3. c #FBFB49", +"4. c #FBFC49", +"5. c #FCFC4F", +"6. c #FCFC6A", +"7. c #FDFD6F", +"8. c #000083", +"9. c #00008B", +"0. c #2642A2", +"q. c #2042A7", +"w. c #2B46A5", +"e. c #2546AA", +"r. c #2B4BAD", +"t. c #314CA8", +"y. c #3751AB", +"u. c #3C55AE", +"i. c #3050B0", +"p. c #3655B2", +"a. c #3B5AB5", +"s. c #3F5DB4", +"d. c #526482", +"f. c #566885", +"g. c #5A6C88", +"h. c #5F708C", +"j. c #63738D", +"k. c #64758F", +"l. c #687992", +"z. c #6D7C96", +"x. c #717F99", +"c. c #445CAF", +"v. c #425AB0", +"b. c #475FB3", +"n. c #415FB7", +"m. c #4B63B6", +"M. c #4663BA", +"N. c #4B67BC", +"B. c #5167B7", +"V. c #546BBA", +"C. c #506CBF", +"Z. c #586EBC", +"A. c #5C71BE", +"S. c #5470C0", +"D. c #5872C2", +"F. c #C97B88", +"G. c #75839C", +"H. c #79879F", +"J. c #768BCD", +"K. c #798AC9", +"L. c #909DB0", +/* pixels */ +"u y y y y y r r e w q q 9 8 7 7 ", +"i F S F A Z C V B N M n n b b 8 ", +"6 F.c x l l k j h f d s a p h = ", +"8.K.A.Z.V.B.m.b.c.u.y.t.w.0.c.* ", +"9.J.S.S.S.N.M.M.a.p.y.r.e.q.n.2 ", +"3 L.H.G.x.z.l.k.h.g.f.d.4 4 j. ", +"o.7.5.4.2.1.:.-.-.%.$.#.@.+.=...", +"X.6.3.2.>.:.=.&.%.$.#.@.+.O.*. .", +"U <.,.,.} { [ ' ` _ ) ( / ^ ' G ", +"1 ~ ! W W E R T Y I P L K J H . ", +"< , > : ; - & % $ # @ + + X X X " +}; diff --git a/src/pixmaps/flags_xpm/mv.xpm b/src/pixmaps/flags_xpm/mv.xpm new file mode 100644 index 00000000..cd970c3b --- /dev/null +++ b/src/pixmaps/flags_xpm/mv.xpm @@ -0,0 +1,164 @@ +/* XPM */ +static const char *mv[] = { +/* columns rows colors chars-per-pixel */ +"16 11 147 2", +" c #B90000", +". c #BB0000", +"X c #BD0000", +"o c #BF0000", +"O c #C10000", +"+ c #C30000", +"@ c #C50000", +"# c #C90000", +"$ c #CB0000", +"% c #CF0000", +"& c #D10000", +"* c #D30000", +"= c #D70000", +"- c #D90000", +"; c #DB0000", +": c #DD0000", +"> c #DF0000", +", c #DD1511", +"< c #DA1911", +"1 c #DE1A16", +"2 c #DB1D16", +"3 c #E10000", +"4 c #E30000", +"5 c #E50000", +"6 c #E70000", +"7 c #E90000", +"8 c #EB0000", +"9 c #E10B0B", +"0 c #E01F1C", +"q c #DD221B", +"w c #DE2722", +"e c #DF2C26", +"r c #E12522", +"t c #E32B27", +"y c #E22C2C", +"u c #E22F2F", +"i c #E52F2F", +"p c #E92C2C", +"a c #E0312A", +"s c #E63232", +"d c #E23730", +"f c #E83232", +"g c #E93535", +"h c #E83636", +"j c #E23C35", +"k c #E43C36", +"l c #EB3939", +"z c #E83B3B", +"x c #EB3D3D", +"c c #E93F3F", +"v c #E3433B", +"b c #E5423B", +"n c #E74741", +"m c #EC4242", +"M c #EB4444", +"N c #EF4444", +"B c #EE4646", +"V c #E44841", +"C c #E54D46", +"Z c #EB4949", +"A c #EF4B4B", +"S c #EC4D4A", +"D c #ED4E4E", +"F c #E6524A", +"G c #E7564E", +"H c #EE524F", +"J c #EF5050", +"K c #ED5353", +"L c #EF5754", +"P c #E95B54", +"I c #EF5B59", +"U c #EA5E58", +"Y c #F15455", +"T c #F05757", +"R c #F15858", +"E c #F05D5D", +"W c #F25C5C", +"Q c #F05F5D", +"! c #F45F5F", +"~ c #EB635C", +"^ c #ED655E", +"/ c #F26060", +"( c #F16162", +") c #F26565", +"_ c #F26666", +"` c #F36A6A", +"' c #F46969", +"] c #F56D6D", +"[ c #F46F6F", +"{ c #F57071", +"} c #F57273", +"| c #F67474", +" . c #F67676", +".. c #F77777", +"X. c #F67979", +"o. c #F77979", +"O. c #F77B7A", +"+. c #F77B7B", +"@. c #4FD44C", +"#. c #4FDA51", +"$. c #52D751", +"%. c #58D755", +"&. c #56D854", +"*. c #5BDA5A", +"=. c #58DD5B", +"-. c #58DF5B", +";. c #5DDF5D", +":. c #5FDE5F", +">. c #60DD5F", +",. c #51E057", +"<. c #63DE62", +"1. c #62DF62", +"2. c #5CE360", +"3. c #5FE665", +"4. c #63E163", +"5. c #65E468", +"6. c #6CE16A", +"7. c #6AE56C", +"8. c #6CE46C", +"9. c #6DE56F", +"0. c #6CE66F", +"q. c #74E272", +"w. c #73E775", +"e. c #78E577", +"r. c #70E975", +"t. c #72E975", +"y. c #7DE67B", +"u. c #75E978", +"i. c #79EB7C", +"p. c #7AEA7D", +"a. c #80E77E", +"s. c #7BEE81", +"d. c #89E387", +"f. c #83E983", +"g. c #88E98A", +"h. c #8DEB8F", +"j. c #93ED95", +"k. c #9BE99C", +"l. c #A2ECA3", +"z. c #B2EEB2", +"x. c #B5ECB5", +"c. c #BFF3C1", +"v. c #CBF1CD", +"b. c #D0F4D1", +"n. c #D6F4D7", +"m. c #D6F5D7", +"M. c #DAF6DA", +/* pixels */ +"8 8 5 5 8 4 4 4 4 > > ; ; = * * ", +"8 +.o.o...| { [ ` ) / Q L K D % ", +"8 o./ ^ ^ U P G F C V v j i Z $ ", +"8 o.Q f.s.p.r.j.c.8.5.3.>.t M $ ", +"5 ..I a.i.w.h.M.b.l.5.,.*.r c @ ", +"5 | L y.u.8.z.m.:.1.:.-.%.0 z + ", +"5 [ H e.r.7.g.m.v.k.=.-.$.1 h o ", +"5 ` S q.8.6.<.d.x.*.&.#.@., s o ", +"4 _ B n b k a a e w q 1 < 9 i o ", +"> / Q L Y Y D B m c z h f u y ", +"> ; = * * % $ $ @ + + o o " +}; diff --git a/src/pixmaps/flags_xpm/mw.xpm b/src/pixmaps/flags_xpm/mw.xpm new file mode 100644 index 00000000..4faabd7d --- /dev/null +++ b/src/pixmaps/flags_xpm/mw.xpm @@ -0,0 +1,165 @@ +/* XPM */ +static const char *mw[] = { +/* columns rows colors chars-per-pixel */ +"16 11 148 2", +" c black", +". c #070000", +"X c #000700", +"o c #002300", +"O c #002900", +"+ c #002B00", +"@ c #002D00", +"# c #002F00", +"$ c #003300", +"% c #003900", +"& c #003D00", +"* c #2C2C2C", +"= c #313131", +"- c #6D0000", +"; c #6F0000", +": c #402626", +"> c #452B2B", +", c #613737", +"< c #004100", +"1 c #004700", +"2 c #004D00", +"3 c #005100", +"4 c #005700", +"5 c #005B00", +"6 c #005D00", +"7 c #006300", +"8 c #006700", +"9 c #006D00", +"0 c #007500", +"q c #494949", +"w c #4E4E4E", +"e c #5B4444", +"r c #535353", +"t c #585757", +"y c gray36", +"u c #5E5C5C", +"i c #5F5F5F", +"p c #734242", +"a c #705151", +"s c #715151", +"d c #715C5C", +"f c #787777", +"g c #797979", +"h c #7B7B7A", +"j c #7B7B7B", +"k c #883736", +"l c #E30000", +"z c #E50000", +"x c #E70000", +"c c #FD0000", +"v c #F21414", +"b c #F31919", +"n c #F31A1A", +"m c #F41F1F", +"M c #C73131", +"N c #C63C3C", +"B c #C63C3D", +"V c #F42020", +"C c #F52424", +"Z c #F52525", +"A c #F62A2A", +"S c #F62B2B", +"D c #F72F2F", +"F c #F63030", +"G c #F73030", +"H c #F23636", +"J c #F43636", +"K c #F83535", +"L c #F83636", +"P c #F43B3B", +"I c #F13B3C", +"U c #F53F3F", +"Y c #F93B3A", +"T c #F93B3B", +"R c #9A5959", +"E c #A15959", +"W c #996060", +"Q c #986969", +"! c #996D6D", +"~ c #8A7979", +"^ c #A47474", +"/ c #CD4142", +"( c #CF4747", +") c #CA4B4B", +"_ c #D05454", +"` c #D45454", +"' c #EE4747", +"] c #EE4C4C", +"[ c #F24141", +"{ c #F44646", +"} c #FA4040", +"| c #FB4545", +" . c #FB4646", +".. c #FB4A49", +"X. c #FA4B4B", +"o. c #FC4A4B", +"O. c #FC4F4F", +"+. c #FC4F50", +"@. c #FD5353", +"#. c #FD5454", +"$. c #FE5858", +"%. c #C46565", +"&. c #D97071", +"*. c #FD6F6F", +"=. c #FE7273", +"-. c #FE7676", +";. c #0B970B", +":. c #0F9A0E", +">. c #139C13", +",. c #189F19", +"<. c #2F8510", +"1. c #348814", +"2. c #388A19", +"3. c #3D8D1F", +"4. c #1EA11E", +"5. c #23A323", +"6. c #29A629", +"7. c #2CA22C", +"8. c #2FA42F", +"9. c #2FA62F", +"0. c #2EA92E", +"q. c #32A532", +"w. c #35A835", +"e. c #34AC34", +"r. c #39A939", +"t. c #3AAE3A", +"y. c #3DAC3D", +"u. c #3FB13F", +"i. c #429024", +"p. c #46932A", +"a. c #4B962F", +"s. c #4D9632", +"d. c #509A34", +"f. c #559D3A", +"g. c #58A13F", +"h. c #42AE42", +"j. c #5DA445", +"k. c #46B046", +"l. c #44B444", +"z. c #4BB24B", +"x. c #50B450", +"c. c #54B755", +"v. c #58B958", +"b. c #5DBC5D", +"n. c #61A749", +"m. c #61BE62", +"M. c #7FB76A", +"N. c #66C266", +/* pixels */ +" . ; ; ", +" j j j f ^ &.! Q %.W u t r w ", +" j i y E _ a ] ' p B , = * q ", +" ~ d R ` a ) ( / B k M > : e ", +"c -.#.#.@... .[ I H G S Z V U x ", +"c =.@.O.o. .U T L G S Z m n P x ", +"c *.O... .} T J G S V V n v H l ", +"5 M.n.j.j.d.d.a.p.i.3.2.1.<.s.X ", +"0 N.l.u.t.e.0.6.5.4.,.>.:.;.8.@ ", +"9 m.b.v.c.x.z.k.h.y.r.w.q.8.7.o ", +"0 8 7 6 5 2 2 1 < & % $ @ @ O $ " +}; diff --git a/src/pixmaps/flags_xpm/mx.xpm b/src/pixmaps/flags_xpm/mx.xpm new file mode 100644 index 00000000..43ffe388 --- /dev/null +++ b/src/pixmaps/flags_xpm/mx.xpm @@ -0,0 +1,170 @@ +/* XPM */ +static const char *mx[] = { +/* columns rows colors chars-per-pixel */ +"16 11 153 2", +" c #001F00", +". c #002F00", +"X c #003100", +"o c #003900", +"O c #003D00", +"+ c #004300", +"@ c #004900", +"# c #004F00", +"$ c #005300", +"% c #005701", +"& c #005D07", +"* c #005D0B", +"= c #005F0B", +"- c #005F0D", +"; c #00610F", +": c #A90000", +"> c #AB0000", +", c #AD0000", +"< c #AF0000", +"1 c #B10000", +"2 c #B30000", +"3 c #B70000", +"4 c #B90000", +"5 c #BD0000", +"6 c #BF0000", +"7 c #C50000", +"8 c #C70000", +"9 c #C90000", +"0 c #CD0000", +"q c #D6272C", +"w c #D7292F", +"e c #D82A2F", +"r c #D72A30", +"t c #D92E34", +"y c #D92F35", +"u c #D93035", +"i c #DA3339", +"p c #DA343A", +"a c #DC353A", +"s c #DC383E", +"d c #DC393F", +"f c #835F3F", +"g c #DE3B40", +"h c #DE3E43", +"j c #DE3F44", +"k c #DF3F44", +"l c #8D7D6A", +"z c #DA4246", +"x c #DC464B", +"c c #DD484C", +"v c #DD494D", +"b c #DE4D50", +"n c #DF5155", +"m c #E04348", +"M c #E04449", +"N c #E0454A", +"B c #E1494E", +"V c #E24A50", +"C c #E05559", +"Z c #E25A5D", +"A c #E35E62", +"S c #E56266", +"D c #E6676B", +"F c #E86A6F", +"G c #E86C70", +"H c #3C9460", +"J c #429764", +"K c #489A69", +"L c #489C6A", +"P c #4D9D6E", +"I c #4E9E6E", +"U c #4E9E6F", +"Y c #52A072", +"T c #52A172", +"R c #53A172", +"E c #56A275", +"W c #57A376", +"Q c #57A476", +"! c #5BA67A", +"~ c #5CA67A", +"^ c #5CA77A", +"/ c #60A77C", +"( c #60A97D", +") c #60AA7E", +"_ c #64AB80", +"` c #65AA81", +"' c #64AB81", +"] c #67AD83", +"[ c #69AD84", +"{ c #6EAF88", +"} c #71B38B", +"| c #75B58F", +" . c #79B791", +".. c #79B792", +"X. c #7CB994", +"o. c #7FBA96", +"O. c #9AAA96", +"+. c #9BAA96", +"@. c #9DAD99", +"#. c #9EAD99", +"$. c #81BB98", +"%. c #81BC98", +"&. c #81BC99", +"*. c #A3B29F", +"=. c #BAB19A", +"-. c #9FB9AC", +";. c #C6AF8C", +":. c #D1C5AE", +">. c #D8CEBA", +",. c #DAD0BC", +"<. c #C9C3C3", +"1. c gray81", +"2. c #DFD5C4", +"3. c gray82", +"4. c LightGray", +"5. c #D1D5D1", +"6. c #D7D7D7", +"7. c #E3DFDF", +"8. c #DEE4DE", +"9. c #E1E0D5", +"0. c #E5E5DA", +"q. c #E5E7E2", +"w. c #E7E7E7", +"e. c #E9E9E9", +"r. c #E9EBE9", +"t. c gray92", +"y. c #F2EEEE", +"u. c #F3F0F0", +"i. c #F4F1F1", +"p. c #F6F2F2", +"a. c #F4F4F4", +"s. c gray96", +"d. c #F7F4F4", +"f. c #F4F6F5", +"g. c #F5F6F5", +"h. c #F5F7F6", +"j. c #F6F6F6", +"k. c gray97", +"l. c #F8F4F4", +"z. c #F9F5F6", +"x. c #FBF7F7", +"c. c #F5F8F6", +"v. c #F6F8F7", +"b. c #F7F9F8", +"n. c #F8FAF9", +"m. c #F9FBFA", +"M. c gray98", +"N. c #FAFBFB", +"B. c #FBFBFB", +"V. c #FBFCFC", +"C. c gray99", +"Z. c #FDFDFD", +"A. c #FDFDFE", +/* pixels */ +"= ; ; ; = r.r.r.e.w.7.0 0 0 8 8 ", +"- %.%.o. .V.Z.Z.C.C.x.F F D S 6 ", +"- $.] ' ! N.Z.Z.B.N.z.B B x A 6 ", +"= o.' ( Q N.V.,.>.j.z.x m j Z 3 ", +"& o.^ ^ R N.2.;.f :.l.m h d C 4 ", +"% .! W P b.0.=.l 7.p.d s i n 2 ", +"$ | W R L v.*.-.+.+.p.p p u v 2 ", +"# } R P J v.q.@.+.8.u.y y r v < ", +"@ { P K H f.v.j.d.a.t.r r q x > ", +"+ [ ' ~ W j.v.v.g.g.u.x v x z > ", +"O o . . 5.6.4.3.1.>.: 2 > < < " +}; diff --git a/src/pixmaps/flags_xpm/my.xpm b/src/pixmaps/flags_xpm/my.xpm new file mode 100644 index 00000000..274807ad --- /dev/null +++ b/src/pixmaps/flags_xpm/my.xpm @@ -0,0 +1,174 @@ +/* XPM */ +static const char *my[] = { +/* columns rows colors chars-per-pixel */ +"16 11 157 2", +" c #B10000", +". c #B70000", +"X c #BB0000", +"o c #C30000", +"O c #C90000", +"+ c #CB0000", +"@ c #CF0000", +"# c #D10000", +"$ c #D50000", +"% c #D70000", +"& c #D90000", +"* c #DA1A1A", +"= c #DC1D1D", +"- c #DD2222", +"; c #DD2525", +": c #DF2626", +"> c #DF2A2A", +", c #E02B2B", +"< c #E02F2F", +"1 c #E13131", +"2 c #E23132", +"3 c #E13434", +"4 c #E23434", +"5 c #E23636", +"6 c #E23839", +"7 c #E33939", +"8 c #E03B3B", +"9 c #E43B3B", +"0 c #E33E3E", +"q c #E43C3C", +"w c #DA3640", +"e c #DC3C45", +"r c #87774B", +"t c #DD424A", +"y c #DE474E", +"u c #DE464F", +"i c #E64141", +"p c #E54242", +"a c #E54343", +"s c #E24444", +"d c #E74646", +"f c #E74747", +"g c #E84A4A", +"h c #E84C4D", +"j c #EA4F4F", +"k c #E04A54", +"l c #E04F59", +"z c #E45050", +"x c #E95151", +"c c #E75857", +"v c #E15158", +"b c #EE6F6F", +"n c #E76F77", +"m c #C3AD25", +"M c #E8DA7E", +"N c #F2E37B", +"B c #F2E37C", +"V c #F2E57F", +"C c #F4E77C", +"Z c #0B0397", +"A c #0D0797", +"S c #110999", +"D c #726FBD", +"F c #0000C1", +"G c #0000C3", +"H c #0000C5", +"J c #0000C9", +"K c #3B3BD9", +"L c #4141D7", +"P c #4040DA", +"I c #4747DB", +"U c #4646DC", +"Y c #4C4CDB", +"T c #4B4ADD", +"R c #7C7AC6", +"E c #6D6DE1", +"W c #A09AB6", +"Q c #B8B1AA", +"! c #D59D9D", +"~ c #D79D9D", +"^ c #D79F9F", +"/ c #D7A1A1", +"( c #DBA5A3", +") c #DDA7A7", +"_ c #DDA9A9", +"` c #DFABAB", +"' c #DDBBBB", +"] c #E3AFAF", +"[ c #E5B3B3", +"{ c #E7B7B7", +"} c #E9B9B9", +"| c #EBBDBD", +" . c #DBCF82", +".. c #DCCF81", +"X. c #DCD084", +"o. c #DCD085", +"O. c #DDD187", +"+. c #DED38B", +"@. c #E6DB89", +"#. c #E3DA9E", +"$. c #F5EA95", +"%. c #F2E899", +"&. c #F2E89B", +"*. c #F2E89C", +"=. c #DDD4A5", +"-. c #928FCF", +";. c #9491D0", +":. c #B1ADC3", +">. c #DFC3C3", +",. c #E5C5C5", +"<. c #E7C7C7", +"1. c #EDC1C1", +"2. c #EFC3C3", +"3. c #F1C7C5", +"4. c #EBD3D3", +"5. c #F7DFDF", +"6. c #EEE5EE", +"7. c #F2E2E2", +"8. c #F2E3E3", +"9. c #F3E4E4", +"0. c #F3E5E5", +"q. c #F3E6E6", +"w. c #F4E4E4", +"e. c #F4E5E5", +"r. c #F5E5E5", +"t. c #F4E6E6", +"y. c #F5E6E6", +"u. c #F4E7E7", +"i. c #F5E7E7", +"p. c #F6E6E6", +"a. c #F6E7E7", +"s. c #FBE7E5", +"d. c #F7E8E7", +"f. c #F1E7EE", +"g. c #F6E8E8", +"h. c #F7E8E8", +"j. c #F6E9E9", +"k. c #F7EAEA", +"l. c #F7EBEB", +"z. c #F7EDED", +"x. c #F8E9E8", +"c. c #F9EAEA", +"v. c #F8EBEB", +"b. c #F8EDEC", +"n. c #F9EDED", +"m. c #F9EEED", +"M. c #F8EEEE", +"N. c #F9EFEF", +"B. c #FAEEEE", +"V. c #FAEFEE", +"C. c #F5EFF5", +"Z. c #FAF0F0", +"A. c #FBF0F0", +"S. c #FBF1F0", +"D. c #FBF2F2", +"F. c #FCF2F2", +"G. c #FCF4F3", +/* pixels */ +"J S m m A H G G O & % % @ @ O O ", +"S *.*.:.=.#.-.E C.S.S.Z.B.z.z.4.", +"r %.Q @.V B o.Y v x h f p q c o ", +"r %.W +.N M .I f.c.c.d.y.y.k.<.", +"Z $.C R . .D L y f f 0 6 4 z X ", +"H ;.+. .T U P K 6.y.y.g.y.8.y.,.", +"O n l k u t e w 4 6 4 > > ; s . ", +"s.G.S.S.B.B.B.k.k.y.y.8.8.8.q.>.", +"& b h g f p q 4 4 > ; - = * 6 ", +"5.A.B.n.n.n.k.y.y.y.y.8.8.8.8.' ", +"3.3.1.| } { [ ] ` ` ) ( ( ! ! ! " +}; diff --git a/src/pixmaps/flags_xpm/mz.xpm b/src/pixmaps/flags_xpm/mz.xpm new file mode 100644 index 00000000..97cc85b3 --- /dev/null +++ b/src/pixmaps/flags_xpm/mz.xpm @@ -0,0 +1,187 @@ +/* XPM */ +static const char *mz[] = { +/* columns rows colors chars-per-pixel */ +"16 11 170 2", +" c black", +". c gray10", +"X c gray12", +"o c #141622", +"O c #191B26", +"+ c #1F212B", +"@ c #252525", +"# c #2A2B2B", +"$ c #242631", +"% c #2A2C36", +"& c #312831", +"* c #362D36", +"= c #2F313B", +"- c gray19", +"; c gray21", +": c #3B333B", +"> c gray23", +", c #004D00", +"< c #005100", +"1 c #005D00", +"2 c #006100", +"3 c #006300", +"4 c #006700", +"5 c #006D00", +"6 c #007100", +"7 c #007500", +"8 c #007900", +"9 c #007D00", +"0 c #353640", +"q c #363741", +"w c #403740", +"e c #463C45", +"r c #553C46", +"t c #4B424B", +"y c #4E464E", +"u c #504750", +"i c #6A4C54", +"p c #6C726E", +"a c #8D2F00", +"s c #E70000", +"d c #EF0000", +"f c #F50000", +"g c #F70000", +"h c #F90000", +"j c red", +"k c #F51500", +"l c #BC4040", +"z c #917E74", +"x c #C2424B", +"c c #CF5159", +"v c #FB4646", +"b c #FA4D44", +"n c #FA4548", +"m c #FB4A49", +"M c #FB5545", +"N c #FC574B", +"B c #FD5655", +"V c #F95959", +"C c #E56A54", +"Z c #F0675F", +"A c #FE685C", +"S c #FC6666", +"D c #FB7B62", +"F c #FC7A6A", +"G c #FE7979", +"H c #FF7B7A", +"J c #008100", +"K c #008300", +"L c #008500", +"P c #008700", +"I c #008900", +"U c #009100", +"Y c #2CA82C", +"T c #31AB31", +"R c #37AE37", +"E c #3DB03D", +"W c #42B342", +"Q c #47B547", +"! c #49B349", +"~ c #4CB74C", +"^ c #4EB44E", +"/ c #53B753", +"( c #51BA51", +") c #54BC54", +"_ c #58B957", +"` c #5CBB5C", +"' c #61BE60", +"] c #59C159", +"[ c #65C065", +"{ c #69C269", +"} c #6DC36D", +"| c #70C571", +" . c #74C774", +".. c #77C877", +"X. c #79CE79", +"o. c #DD8100", +"O. c #DD8300", +"+. c #DD8700", +"@. c #DF8700", +"#. c #DD8900", +"$. c #DF9500", +"%. c #E18B00", +"&. c #E38F00", +"*. c #E59100", +"=. c #E79300", +"-. c #E99900", +";. c #EB9D00", +":. c #ED9F00", +">. c #EDA300", +",. c #EFA700", +"<. c #F3A100", +"1. c #F1B700", +"2. c #FA9E3F", +"3. c #F1CA0B", +"4. c #F1CB0E", +"5. c #F2CC13", +"6. c #F3CE19", +"7. c #F4D01E", +"8. c #F2CA2C", +"9. c #F2CA2F", +"0. c #F5D223", +"q. c #F6D429", +"w. c #F2D12F", +"e. c #F7D62E", +"r. c #F2CC32", +"t. c #F3CD35", +"y. c #F4CF39", +"u. c #F8D834", +"i. c #F5D03D", +"p. c #F9DB3A", +"a. c #8FA05C", +"s. c #91BE7B", +"d. c #BBAF7F", +"f. c #CD8376", +"g. c #DF8F7B", +"h. c #E28766", +"j. c #F6D242", +"k. c #F7D346", +"l. c #F7D54B", +"z. c #EEC558", +"x. c #FAC45D", +"c. c #F2C95E", +"v. c #F8D750", +"b. c #F9D955", +"n. c #F9E158", +"m. c #F4CF64", +"M. c #E6C977", +"N. c #B9CDB9", +"B. c #DFD8BF", +"V. c #E0DAC1", +"C. c #E2DBC4", +"Z. c #E2DDC6", +"A. c #E4D8CA", +"S. c #E2DDC8", +"D. c #E4DEC8", +"F. c #F9D5C2", +"G. c #DEE7DE", +"H. c #E5E0CA", +"J. c #E6E2CC", +"K. c #E6E3CD", +"L. c #EAE5CF", +"P. c #E0E9E0", +"I. c #E1EAE1", +"U. c #E2EBE2", +"Y. c #E3EBE3", +"T. c #E4EDE4", +"R. c #E5EEE5", +"E. c #E7EFE7", +"W. c #E8F0E8", +"Q. c #E9F1E9", +/* pixels */ +"a L U I L L J 9 8 7 6 5 4 3 1 3 ", +"j g.s.X.....| } { [ ` ` ` / ^ , ", +"j G Z a.] ) ( ~ Q W E R Y Y ! , ", +"j G A V A.W.W.E.E.T.U.U.U.G.T.N.", +"f f.z.C B c i u t e w : * & y ", +"d M.p c.N v l > ; - # @ X . > ", +"s z m.h.n x r 0 = % $ + O o 0 ", +"h F m M F.L.K.K.H.D.Z.Z.B.B.D.d.", +"h S b 2.p.u.e.q.0.7.6.5.4.3.9.$.", +"f D x.n.b.v.l.k.j.i.y.t.r.r.8.O.", +"k <.1.>.>.>.:.-.=.=.&.%.O.#.O.#." +}; diff --git a/src/pixmaps/flags_xpm/na.xpm b/src/pixmaps/flags_xpm/na.xpm new file mode 100644 index 00000000..7ea38ef4 --- /dev/null +++ b/src/pixmaps/flags_xpm/na.xpm @@ -0,0 +1,175 @@ +/* XPM */ +static const char *na[] = { +/* columns rows colors chars-per-pixel */ +"16 11 158 2", +" c #002700", +". c #002900", +"X c #002D00", +"o c #002F00", +"O c #003100", +"+ c #003300", +"@ c #003500", +"# c #003900", +"$ c #003B00", +"% c #003D00", +"& c #003F00", +"* c #004100", +"= c #004700", +"- c #004900", +"; c #005B00", +": c #006500", +"> c #000073", +", c #000079", +"< c #00007D", +"1 c #EB0000", +"2 c #ED0000", +"3 c #EF0000", +"4 c #F10000", +"5 c #F30000", +"6 c #F50000", +"7 c #F70D07", +"8 c #F62C2D", +"9 c #F73030", +"0 c #F73131", +"q c #F83535", +"w c #F83636", +"e c #F83736", +"r c #F83737", +"t c #F93A3A", +"y c #F93B3A", +"u c #F93B3B", +"i c #F93B3C", +"p c #FA3F3F", +"a c #F83D43", +"s c #FA4240", +"d c #FA4B45", +"f c #F74148", +"g c #F74E4E", +"h c #F9504A", +"j c #F64C53", +"k c #F85353", +"l c #FA5D56", +"z c #F95B5F", +"x c #FA5D5D", +"c c #F9615F", +"v c #FB6162", +"b c #F8666D", +"n c #FB706B", +"m c #F97874", +"M c #F7777A", +"N c #0B950B", +"B c #0F970E", +"V c #109710", +"C c #139913", +"Z c #149914", +"A c #149A14", +"S c #199B19", +"D c #1A9A1A", +"F c #189C19", +"G c #199C19", +"H c #1F9C1F", +"J c #1E9E1E", +"K c #25A125", +"L c #2CA22C", +"P c #2FA42F", +"I c #32A532", +"U c #32A632", +"Y c #33A632", +"T c #35A835", +"R c #36A836", +"E c #39A939", +"W c #3BAA3B", +"Q c #3FAB3F", +"! c #3DAC3D", +"~ c #3FB142", +"^ c #42AE42", +"/ c #46AE46", +"( c #55BC5C", +") c #F7DA5D", +"_ c #EDD266", +"` c #ECD26B", +"' c #F4D962", +"] c #000081", +"[ c #000083", +"{ c #000087", +"} c #000089", +"| c #00008D", +" . c #000091", +".. c #5151B7", +"X. c #5857B5", +"o. c #5353BB", +"O. c #5655BC", +"+. c #5A5ABA", +"@. c #6F6AAE", +"#. c #7970A3", +"$. c #7D75A1", +"%. c #7C75A6", +"&. c #6767C6", +"*. c #6969C0", +"=. c #6D6DC3", +"-. c #6F6FC3", +";. c #7070C5", +":. c #7272C6", +">. c #7474C7", +",. c #7D7BC5", +"<. c #7776C8", +"1. c #7577CA", +"2. c #7E7DCA", +"3. c #7CCB83", +"4. c #948FB9", +"5. c #F68688", +"6. c #FA8C8A", +"7. c #F99F9F", +"8. c #CBA993", +"9. c #F7A9AB", +"0. c #EDB2AD", +"q. c #F3B2AE", +"w. c #81C989", +"e. c #88D08D", +"r. c #96D59C", +"t. c #B9C7AD", +"y. c #ABDDAF", +"u. c #ECC0BB", +"i. c #8582C3", +"p. c #8482C5", +"a. c #8C88C1", +"s. c #8F95D6", +"d. c #9195D3", +"f. c #9B9FD8", +"g. c #A3A8DE", +"h. c #B5BAE3", +"j. c #D7BBCD", +"k. c #E9CBC4", +"l. c #F9C1C2", +"z. c #E2D8CC", +"x. c #E2DFD3", +"c. c #F3D0D3", +"v. c #F1D3D7", +"b. c #C5E2C5", +"n. c #C7E3C7", +"m. c #D1E5D0", +"M. c #DEE2D5", +"N. c #DDEADC", +"B. c #DDD7E7", +"V. c #F2DDE1", +"C. c #EBE1EB", +"Z. c #ECE7EF", +"A. c #F2E4E9", +"S. c #E0E1F2", +"D. c #E1E2F2", +"F. c #E4E4F2", +"G. c #EDE9F1", +"H. c #EAEAF4", +/* pixels */ +" .} | .} [ [ < , > { d.j.4 3 3 ", +"{ 2.a.4.,.:.;.-.@.f.H.c.c k g 1 ", +"| p.` ' %.O...+.h.C.M r 0 8 9.t.", +"| i._ ) $.o.<.F.v.j r 0 j k.b.; ", +"{ <.@.#.X.g.Z.6.i r 0 5.M.3.Q & ", +"[ :.o.&.S.V.l y r g 0.n.~ G W $ ", +"< -.s.G.7.s y q M x.r.K S A R @ ", +"{ S.A.n p y a 0.m.( H G A V Y O ", +"B.l.d a y b z.y.I J F V B N P X ", +"7 v x z q.N.e./ ^ ~ W T Y P L ", +"6 6 4 8.w.: - = & $ $ O X X . @ " +}; diff --git a/src/pixmaps/flags_xpm/nc.xpm b/src/pixmaps/flags_xpm/nc.xpm new file mode 100644 index 00000000..201d91a8 --- /dev/null +++ b/src/pixmaps/flags_xpm/nc.xpm @@ -0,0 +1,173 @@ +/* XPM */ +static const char *nc[] = { +/* columns rows colors chars-per-pixel */ +"16 11 156 2", +" c black", +". c #000500", +"X c #000D00", +"o c #001500", +"O c #001B00", +"+ c #002300", +"@ c #002900", +"# c #003100", +"$ c #003700", +"% c #250035", +"& c #0B6D39", +"* c #0F6F3C", +"= c #106F3D", +"- c #54552F", +"; c #474734", +": c #48483A", +"> c #4D4D3A", +", c #53523F", +"< c #711D7D", +"1 c #137240", +"2 c #147241", +"3 c #187545", +"4 c #197545", +"5 c #1E7949", +"6 c #1F7949", +"7 c #237C4E", +"8 c #247D4E", +"9 c #2C7F53", +"0 c #5C5E40", +"q c #6D6D46", +"w c #72714B", +"e c #767650", +"r c #767651", +"t c #507F6A", +"y c #E30000", +"u c #E50000", +"i c #E70000", +"p c #FD0005", +"a c #FD0007", +"s c #FD000B", +"d c #F21441", +"f c #F31945", +"g c #F31A45", +"h c #F41F49", +"j c #F41F4A", +"k c #F42045", +"l c #F5254A", +"z c #F5254E", +"x c #F5244F", +"c c #F62B4F", +"v c #F62B53", +"b c #F62A54", +"n c #F73053", +"m c #F73059", +"M c #F4365C", +"N c #F83659", +"B c #F43B60", +"V c #F53F60", +"C c #2F8155", +"Z c #2F8156", +"A c #328358", +"S c #338459", +"D c #35855B", +"F c #39895F", +"G c #3D8B62", +"H c #76AC43", +"J c #79A840", +"K c #428E65", +"L c #4B8A6C", +"P c #54846E", +"I c #469169", +"U c #589178", +"Y c #5DA07D", +"T c #919134", +"R c #F5C13A", +"E c #F5F52F", +"W c #F8F137", +"Q c #F8F835", +"! c #F9F93A", +"~ c #F9F93B", +"^ c #989840", +"/ c #9B9B45", +"( c #9E9E4B", +") c #A0A04F", +"_ c #A4A454", +"` c #FCB97B", +"' c #A8C753", +"] c #B7D479", +"[ c #D3D750", +"{ c #F7C644", +"} c #FAFA41", +"| c #FBFB46", +" . c #F9F948", +".. c #FBFC49", +"X. c #FCFC4B", +"o. c #FBF94F", +"O. c #ECEE5B", +"+. c #FDFD53", +"@. c #FCFC54", +"#. c #FDFD54", +"$. c #F1F15A", +"%. c #FBF958", +"&. c #FEFE59", +"*. c #DEE270", +"=. c #F5F561", +"-. c #FCEE75", +";. c #0000A5", +":. c #0000A9", +">. c #0005AD", +",. c #000DAF", +"<. c #0015B3", +"1. c #001BB7", +"2. c #0023B9", +"3. c #0029BD", +"4. c #002FBF", +"5. c #0035C3", +"6. c #0039C3", +"7. c #003FC7", +"8. c #0F4BC3", +"9. c #0043C9", +"0. c #0047C9", +"q. c #004BCB", +"w. c #9861A0", +"e. c #9B65A3", +"r. c #9E69A6", +"t. c #A16DA9", +"y. c #A471AB", +"u. c #A677AD", +"i. c #61A380", +"p. c #66A684", +"a. c #4B82D5", +"s. c #5086D7", +"d. c #5589D9", +"f. c #5A8DDB", +"g. c #5E90DC", +"h. c #6493DB", +"j. c #6294DE", +"k. c #6996DC", +"l. c #6D99DD", +"z. c #719CDF", +"x. c #759FE1", +"c. c #79A2E2", +"v. c #7CA5E3", +"b. c #7FA8E4", +"n. c #9FBCA8", +"m. c #C6A886", +"M. c #FDBE83", +"N. c #C2CF95", +"B. c #E2D09E", +"V. c #99AEC9", +"C. c #98ADCA", +"Z. c #89A4E1", +"A. c #83AAE5", +"S. c #8FAAE2", +"D. c #8FB3E8", +"F. c #8FB3E9", +/* pixels */ +"q.q.q.q.0.9.7.6.5.4.3.2.1.<.,.>.", +"8.F.F.S.C.C.Z.A.b.v.c.x.z.l.k.:.", +"q.F.N.*.$.@.O.n.j.g.f.d.s.a.h.;.", +"< B.=.&._ r X...m.y.t.r.e.w.u.% ", +"a M.%.+.w ) | } { N n v l k M i ", +"s -.+.) w q ^ ! W m v x h g V i ", +"a ` o.../ ^ ! Q R v x j g d M y ", +"$ ] [ / , > T E H 8 6 4 2 * S . ", +"@ p.' 0 : : - J 7 6 3 1 * * 9 ", +"@ i.Y U P t L I K G F D 9 9 9 ", +"+ O o X . . . . . . " +}; diff --git a/src/pixmaps/flags_xpm/ne.xpm b/src/pixmaps/flags_xpm/ne.xpm new file mode 100644 index 00000000..52f4d734 --- /dev/null +++ b/src/pixmaps/flags_xpm/ne.xpm @@ -0,0 +1,171 @@ +/* XPM */ +static const char *ne[] = { +/* columns rows colors chars-per-pixel */ +"16 11 154 2", +" c #002100", +". c #002700", +"X c #002900", +"o c #002D00", +"O c #002F00", +"+ c #003300", +"@ c #003500", +"# c #003900", +"$ c #003D00", +"% c #004100", +"& c #004700", +"* c #004D00", +"= c #005100", +"- c #005700", +"; c #005D00", +": c #006300", +"> c #006500", +", c #006F00", +"< c #007100", +"1 c #007500", +"2 c #E90000", +"3 c #EB0300", +"4 c #EF0F00", +"5 c #ED1B00", +"6 c #F11900", +"7 c #F32100", +"8 c #F52700", +"9 c #F72D00", +"0 c #F93500", +"q c #FB3900", +"w c #FD3D00", +"e c #FD4300", +"r c #FF4300", +"t c #FD4500", +"y c #FD4B00", +"u c #FF4B00", +"i c #FF4D00", +"p c #FF5900", +"a c #F6762C", +"s c #F87536", +"d c #F77B31", +"f c #F87F37", +"g c #F97C3B", +"h c #0B8F0B", +"j c #0F920E", +"k c #139413", +"l c #189619", +"z c #1E991E", +"x c #239D23", +"c c #2F9F2F", +"v c #29A029", +"b c #2CA22C", +"n c #2EA22E", +"m c #2FA42F", +"M c #32A532", +"N c #34A534", +"B c #35A835", +"V c #39A939", +"C c #3AA83A", +"Z c #3FAB3F", +"A c #3DAC3D", +"S c #42AE42", +"D c #44AE44", +"F c #46B046", +"G c #4BB24B", +"H c #50B450", +"J c #54B755", +"K c #58B958", +"L c #5DBC5D", +"P c #61BE62", +"I c #66BD66", +"U c #F9823D", +"Y c #FA8642", +"T c #FB8A47", +"R c #F78A49", +"E c #FC8D4C", +"W c #F7934E", +"Q c #FD8F51", +"! c #F89653", +"~ c #FD9354", +"^ c #F99857", +"/ c #FE9659", +"( c #FA9B5C", +") c #FE985C", +"_ c #FE9A5F", +"` c #FB9E60", +"' c #FCA165", +"] c #FCA469", +"[ c #FDA76D", +"{ c #F7A471", +"} c #FDA971", +"| c #FEAB74", +" . c #FEAD77", +".. c #F8A978", +"X. c #FFAB7A", +"o. c #FEAE79", +"O. c #F9AE7F", +"+. c #FFB07B", +"@. c #DBB59D", +"#. c #F7B186", +"$. c #FAB286", +"%. c #FABD98", +"&. c #A1C7A1", +"*. c #F6C8AC", +"=. c #F8CDB3", +"-. c #F9CFB7", +";. c #FBD4BD", +":. c #C5DFC5", +">. c LightGray", +",. c #D5D5D5", +"<. c #D7D7D7", +"1. c #F5D9C9", +"2. c #D0E4D0", +"3. c #D2E6D2", +"4. c #D4E7D4", +"5. c #D5E8D5", +"6. c #D7E8D7", +"7. c #D7EAD8", +"8. c #D8ECDC", +"9. c #DAEDDD", +"0. c #DCEEDD", +"q. c #DDEFDD", +"w. c #DFF0DF", +"e. c #F5E3D6", +"r. c #F6E4D8", +"t. c #F7E6DA", +"y. c #F6E6DB", +"u. c #F8E8DB", +"i. c #F9E9DE", +"p. c #FAEAE0", +"a. c #FBEBE1", +"s. c #FCECE1", +"d. c #FDEDE2", +"f. c #FDEEE3", +"g. c #FEEFE5", +"h. c #E0F0E0", +"j. c #E2F1E2", +"k. c #E8F4E8", +"l. c #FEF2EA", +"z. c #F1F1F1", +"x. c gray95", +"c. c #F3F3F3", +"v. c #F4F4F4", +"b. c #F4F5F5", +"n. c gray96", +"m. c #F6F6F6", +"M. c gray97", +"N. c gray98", +"B. c #FBFBFB", +"V. c #FBFCFB", +"C. c gray99", +"Z. c #FDFCFD", +"A. c #FDFDFD", +"S. c #FEFEFE", +/* pixels */ +"p u i i u t r w q 0 9 8 7 6 4 5 ", +"i +.+.o. .| } [ ] ' ( ( ( ! W 3 ", +"r X._ _ / ~ Q E T Y U f d a R 3 ", +"1.l.g.f.f.s.s.a.a.i.y.y.e.e.y.@.", +"n.S.S.S.C.B.;.$.#.=.M.n.b.v.b.<.", +"c.S.S.C.C.B.%.g s $.n.b.v.v.v.,.", +"c.C.B.B.B.B.-...] *.b.b.c.c.v.>.", +":.k.j.h.q.q.q.9.8.6.4.4.3.2.6.&.", +", I D S C M n v x z l k j j c ", +", P L K J H G F S A C B M m b X ", +"1 > : ; - = * & $ $ # + o o . @ " +}; diff --git a/src/pixmaps/flags_xpm/nf.xpm b/src/pixmaps/flags_xpm/nf.xpm new file mode 100644 index 00000000..056f1015 --- /dev/null +++ b/src/pixmaps/flags_xpm/nf.xpm @@ -0,0 +1,163 @@ +/* XPM */ +static const char *nf[] = { +/* columns rows colors chars-per-pixel */ +"16 11 146 2", +" c black", +". c #000500", +"X c #000D00", +"o c #001300", +"O c #001900", +"+ c #002100", +"@ c #002700", +"# c #002F00", +"$ c #003500", +"% c #003B00", +"& c #003D00", +"* c #004100", +"= c #004300", +"- c #0B670B", +"; c #0F6A0E", +": c #106A10", +"> c #146E14", +", c #197019", +"< c #1A701A", +"1 c #1F741F", +"2 c #207520", +"3 c #257825", +"4 c #267A26", +"5 c #2A732A", +"6 c #2F772F", +"7 c #2B7C2B", +"8 c #2C7B2C", +"9 c #2C7C2C", +"0 c #2F7C2F", +"q c #2F7D2F", +"w c #327F32", +"e c #337F32", +"r c #357C35", +"t c #357E35", +"y c #3A7F3A", +"u c #318131", +"i c #368236", +"p c #3B853B", +"a c #3D833D", +"s c #3F893F", +"d c #3F8A3F", +"f c #418541", +"g c #438643", +"h c #448C44", +"j c #448E44", +"k c #458E45", +"l c #4A8A4A", +"z c #498F49", +"x c #499149", +"c c #4E934E", +"v c #4F954F", +"b c #508E50", +"n c #539653", +"m c #539753", +"M c #549754", +"N c #589857", +"B c #5A925A", +"V c #599459", +"C c #5D915D", +"Z c #5C935C", +"A c #589958", +"S c #589A58", +"D c #589B59", +"F c #5D985D", +"G c #5C9D5C", +"H c #5D9D5D", +"J c #5F9F5F", +"K c #639C63", +"L c #619F62", +"P c #6A9F6A", +"I c #66A366", +"U c #6AA56A", +"Y c #6DA06D", +"T c #6FA86F", +"R c #75A675", +"E c #72AA73", +"W c #76AD76", +"Q c #7BA77B", +"! c #79A979", +"~ c #7AA87A", +"^ c #79AE79", +"/ c #7EAC7E", +"( c #7BB07A", +") c #7BB07B", +"_ c #80AA80", +"` c #85AF85", +"' c #86AE86", +"] c #8BB58B", +"[ c #90B390", +"{ c #9BBC9B", +"} c #9BBD9B", +"| c #A1C1A1", +" . c #B2CBB2", +".. c #B4CCB4", +"X. c #B6CFB6", +"o. c #B9D1B9", +"O. c #BBD3BB", +"+. c #BCD2BC", +"@. c #BED5BE", +"#. c #BFD5BF", +"$. c #C3CBC3", +"%. c #CBCFCB", +"&. c #C0D6C0", +"*. c #C4D6C4", +"=. c #C2D8C2", +"-. c #C4D9C4", +";. c #C6DBC6", +":. c #CBD1CB", +">. c #C8DDC9", +",. c #C9DDC9", +"<. c #CADDCA", +"1. c #CCDFCC", +"2. c #CDDECD", +"3. c #CEDFCE", +"4. c #D7D7D7", +"5. c #D7D9D5", +"6. c #DDDDDD", +"7. c #CEE0CE", +"8. c #D7E7D7", +"9. c #D9E3D9", +"0. c #E2EDE2", +"q. c #E5E9E5", +"w. c #E9EEE9", +"e. c #EBEDEB", +"r. c #EBEFEB", +"t. c #EFEFEF", +"y. c #F1F1F1", +"u. c #F0F2F0", +"i. c #F3F3F3", +"p. c #F1F6F1", +"a. c gray96", +"s. c #F5F6F5", +"d. c #F5F7F5", +"f. c #F6F6F6", +"g. c #F6F7F6", +"h. c gray97", +"j. c #F7F8F7", +"k. c #F8F9F7", +"l. c #F9FAF9", +"z. c gray98", +"x. c #FAFBFA", +"c. c #FBFBFB", +"v. c #FBFCFB", +"b. c gray99", +"n. c #FDFDFD", +"m. c #FDFDFE", +/* pixels */ +"= = = = } r.i.i.r.t.q.] o X . ", +"= ) ) ^ 8.v.m.p.0.c.k.2.N m c ", +"= ) J J 7.c.m./ R c.s.&.u 9 z ", +"= W G S <.c.c.K F s.s.#.7 4 h ", +"% W S M <.v.#.l g ' k.o.4 2 s ", +"% E m v <.c.~ f y P s.o.1 , p ", +"$ T v x ;.| Y a r V [ X., > i ", +"# U x k =.} b 6 5 r ' ..> : e ", +"@ I j d &.r.2.C B *.9. .; - 0 ", +"+ L J S <.s.k./ Q s.i.+.e 0 9 ", +"O o X . ~ 5.6.:.$.4.%.C " +}; diff --git a/src/pixmaps/flags_xpm/ng.xpm b/src/pixmaps/flags_xpm/ng.xpm new file mode 100644 index 00000000..7dd79949 --- /dev/null +++ b/src/pixmaps/flags_xpm/ng.xpm @@ -0,0 +1,149 @@ +/* XPM */ +static const char *ng[] = { +/* columns rows colors chars-per-pixel */ +"16 11 132 2", +" c #002700", +". c #002900", +"X c #002D00", +"o c #002F00", +"O c #003100", +"+ c #003500", +"@ c #003B00", +"# c #003F00", +"$ c #004500", +"% c #004B00", +"& c #004D00", +"* c #005300", +"= c #005B00", +"- c #005D00", +"; c #006100", +": c #006300", +"> c #006500", +", c #006700", +"< c #006900", +"1 c #006F00", +"2 c #007500", +"3 c #007700", +"4 c #007B00", +"5 c #007F00", +"6 c #008300", +"7 c #008500", +"8 c #008700", +"9 c #008900", +"0 c #009100", +"q c #0B950B", +"w c #0F960E", +"e c #109710", +"r c #139713", +"t c #149914", +"y c #149A14", +"u c #199A19", +"i c #199B19", +"p c #1A9C1A", +"a c #1F9D1F", +"s c #1F9E1F", +"d c #209F20", +"f c #25A025", +"g c #25A125", +"h c #26A226", +"j c #2BA42B", +"k c #2BA52B", +"l c #2CA22C", +"z c #2CA62C", +"x c #2FA42F", +"c c #31A731", +"v c #32A532", +"b c #33A632", +"n c #35A635", +"m c #31A831", +"M c #36A836", +"N c #37AA37", +"B c #3AAA3A", +"V c #3BAA3B", +"C c #3FAD3F", +"Z c #3FAE3F", +"A c #40AD3F", +"S c #44AF44", +"D c #44B144", +"F c #45B045", +"G c #45B145", +"H c #49B249", +"J c #4BB34B", +"K c #49B449", +"L c #4EB44E", +"P c #4FB64F", +"I c #4FB74F", +"U c #50B550", +"Y c #53B753", +"T c #54B555", +"R c #54B754", +"E c #53B953", +"W c #54B954", +"Q c #58B957", +"! c #58B958", +"~ c #59BA59", +"^ c #58BB59", +"/ c #58BC58", +"( c #5CB95C", +") c #5CBD5C", +"_ c #5DBC5D", +"` c #5FBF5F", +"' c #61BE62", +"] c #66C066", +"[ c #6AC36A", +"{ c #6FC46F", +"} c #72C673", +"| c #77C777", +" . c #76C876", +".. c #79C879", +"X. c #7BCA7A", +"o. c #7BCA7B", +"O. c #BDC7BD", +"+. c #C7D3C7", +"@. c LightGray", +"#. c #D7D7D7", +"$. c gray85", +"%. c #D9E3D9", +"&. c #DFE9DF", +"*. c #E7EEE7", +"=. c gray92", +"-. c #E8EFE8", +";. c gray93", +":. c #EFEFEF", +">. c #EAF0EA", +",. c #EBF1EB", +"<. c #ECF2EC", +"1. c #EEF3EE", +"2. c #EEF4EE", +"3. c #EFF4EF", +"4. c #EFF5EF", +"5. c #F0F6F0", +"6. c #F1F7F1", +"7. c #F2F7F2", +"8. c #F4F4F4", +"9. c gray96", +"0. c #F6F6F6", +"q. c gray97", +"w. c #F3F8F3", +"e. c #F4F9F4", +"r. c #F6FBF6", +"t. c #F8F8F8", +"y. c #F9F9F9", +"u. c gray98", +"i. c #FBFBFB", +"p. c gray99", +"a. c #FDFDFD", +"s. c #FDFDFE", +/* pixels */ +"0 9 9 7 6 &.:.:.;.=.%.< > ; - ; ", +"7 o.o.o.| r.a.a.a.y.7.~ ~ Y I & ", +"7 o.` ) ~ e.a.p.y.p.7.N m x J % ", +"9 o.` W R w.p.p.y.y.1.c x d S $ ", +"7 .W W Y 7.p.y.y.t.1.x g d C $ ", +"7 } E I J 7.y.y.t.t.-.d s p V @ ", +"5 { I K G 7.y.t.t.q.-.a p t n + ", +"4 [ K G C 1.q.q.q.9.-.p t e c o ", +"3 ' G C B 1.q.q.9.8.-.r w q x X ", +"1 ' ` Q T 1.q.q.9.9.-.n v x x ", +"3 > ; = * +.$.#.#.@.O.o X X + " +}; diff --git a/src/pixmaps/flags_xpm/ni.xpm b/src/pixmaps/flags_xpm/ni.xpm new file mode 100644 index 00000000..7e5b2acd --- /dev/null +++ b/src/pixmaps/flags_xpm/ni.xpm @@ -0,0 +1,163 @@ +/* XPM */ +static const char *ni[] = { +/* columns rows colors chars-per-pixel */ +"16 11 146 2", +" c #CE9177", +". c #EBE07F", +"X c #0000DD", +"o c #0000DF", +"O c #0005DD", +"+ c #0005DF", +"@ c #0009E1", +"# c #000DE3", +"$ c #0013E5", +"% c #0019E7", +"& c #001FE9", +"* c #0025EB", +"= c #0029EB", +"- c #002BED", +"; c #0033ED", +": c #0037EF", +"> c #003DF1", +", c #0057DF", +"< c #005FE7", +"1 c #0043F3", +"2 c #0049F5", +"3 c #004FF5", +"4 c #004DF7", +"5 c #004FF7", +"6 c #0051F9", +"7 c #0055F9", +"8 c #0059FB", +"9 c #005DFD", +"0 c #0061FD", +"q c #0065FD", +"w c #0067FF", +"e c #0069FD", +"r c #006BFF", +"t c #0071FF", +"y c #127EF1", +"u c #1681F1", +"i c #1B84F2", +"p c #1F87F3", +"a c #2589F4", +"s c #2A8DF5", +"d c #2F91F6", +"f c #2F97FB", +"g c #3292F2", +"h c #3691F2", +"j c #3594F2", +"k c #3795F3", +"l c #3393F6", +"z c #3493F7", +"x c #3896F7", +"c c #3B98F3", +"v c #3A96F8", +"b c #359BFF", +"n c #3E99F8", +"m c #3F9AF9", +"M c #4099F4", +"N c #429CF5", +"B c #479EF6", +"V c #439DF9", +"C c #459DFA", +"Z c #489FFA", +"A c #4BA1F7", +"S c #4FA2F7", +"D c #4AA0FA", +"F c #4CA2FB", +"G c #50A4F7", +"H c #54A7F7", +"J c #55A7F8", +"K c #51A5FC", +"L c #56A7FD", +"P c #58A9F8", +"I c #59A9F9", +"U c #5DABF9", +"Y c #5EACF9", +"T c #5AAAFD", +"R c #5EACFE", +"E c #7AB5E5", +"W c #7DB6E7", +"Q c #7FBCEF", +"! c #63AAF2", +"~ c #66ADF2", +"^ c #6AAEF3", +"/ c #61AEFA", +"( c #62AFFA", +") c #61AEFE", +"_ c #6AB0F5", +"` c #6EB1F4", +"' c #6EB2F6", +"] c #65B0FB", +"[ c #66B2FB", +"{ c #64B0FE", +"} c #6BB2FC", +"| c #6AB3FC", +" . c #6EB5FC", +".. c #71B3F4", +"X. c #72B5F7", +"o. c #7AB6F3", +"O. c #7CBBF7", +"+. c #7FBAF6", +"@. c #76B7F8", +"#. c #71B8FD", +"$. c #75BAFE", +"%. c #7ABAF9", +"&. c #78BBFE", +"*. c #7BBDFE", +"=. c #7DBEFE", +"-. c #7FBEFF", +";. c #7FBFFF", +":. c #ADC3B1", +">. c #EEE281", +",. c #F4E286", +"<. c #F6E48B", +"1. c #F6E989", +"2. c #F7E98A", +"3. c #F8EC8F", +"4. c #FAED93", +"5. c #F9EC94", +"6. c #FBF099", +"7. c #82BEF3", +"8. c #80BDF9", +"9. c #84C0FA", +"0. c #85C0FC", +"q. c #88C2FB", +"w. c #8BC4FB", +"e. c #88C2FD", +"r. c #8BC4FD", +"t. c #8EC6FE", +"y. c #90C7FE", +"u. c #A0CFFC", +"i. c #A4D2FE", +"p. c gray89", +"a. c gray90", +"s. c #E7E7E7", +"d. c gray95", +"f. c #F3F3F3", +"g. c #F4F4F4", +"h. c #F4F5F5", +"j. c gray96", +"k. c #F6F6F6", +"l. c gray97", +"z. c gray98", +"x. c #FBFBFB", +"c. c #FBFCFB", +"v. c gray99", +"b. c #FDFCFD", +"n. c #FDFDFD", +"m. c #FEFEFE", +/* pixels */ +"t r r r w w 9 9 8 7 5 2 1 > : : ", +"r ;.;.;.;.$.$.#. .| ] / Y P H = ", +"w ;.) ) R T L K F C B n x l S & ", +"b i.y.t.t.r.8.7.Q %.@.X.' _ O.< ", +"n.n.n.n.n.n.6.<.,.3.l.j.j.g.j.s.", +"n.n.n.n.n.z.4.:. 2.j.j.g.f.j.a.", +"n.n.n.c.z.z.5.>.. 2.j.g.f.d.g.p.", +"b y.w.w.9.7.O.W E ..` ^ ~ ! o., ", +"6 | F C m v l d s a p i u y j o ", +"4 ] / Y I H S S B N N c k j g o ", +"4 1 > : ; - * & % $ # @ O X X O " +}; diff --git a/src/pixmaps/flags_xpm/nl.xpm b/src/pixmaps/flags_xpm/nl.xpm new file mode 100644 index 00000000..73c01f2f --- /dev/null +++ b/src/pixmaps/flags_xpm/nl.xpm @@ -0,0 +1,153 @@ +/* XPM */ +static const char *nl[] = { +/* columns rows colors chars-per-pixel */ +"16 11 136 2", +" c #00003B", +". c #00003D", +"X c #000041", +"o c #000043", +"O c #000047", +"+ c #00004D", +"@ c #000051", +"# c #000057", +"$ c #00005B", +"% c #00005F", +"& c #000065", +"* c #00006B", +"= c #00006F", +"- c #000075", +"; c #00007B", +": c #00017F", +"> c #E70000", +", c #E90000", +"< c #EB0000", +"1 c #ED0000", +"2 c #EF0000", +"3 c #F10000", +"4 c #F30000", +"5 c #F50000", +"6 c #F70000", +"7 c #F90000", +"8 c #FB0000", +"9 c #FD0000", +"0 c red", +"q c #FF1531", +"w c #F62C3C", +"e c #F73142", +"r c #F83747", +"t c #F93C4D", +"y c #FA4251", +"u c #FB4756", +"i c #F74957", +"p c #FC4C5A", +"a c #FD515E", +"s c #F74E60", +"d c #FD5463", +"f c #F85365", +"g c #FE5967", +"h c #F5566A", +"j c #F95768", +"k c #F65A6E", +"l c #FE5C69", +"z c #FA5C6D", +"x c #FE5F6C", +"c c #F75F72", +"v c #FB6070", +"b c #F86476", +"n c #FC6574", +"m c #F66D7F", +"M c #F9687A", +"N c #FC6978", +"B c #FD6D7B", +"V c #FA6C7D", +"C c #FD707F", +"Z c #000781", +"A c #00218F", +"S c #0B50A1", +"D c #0F52A3", +"F c #1356A5", +"G c #185AA8", +"H c #1E5EAA", +"J c #2360A9", +"K c #2362AD", +"L c #2863AC", +"P c #2966AF", +"I c #2C67AD", +"U c #2C67AE", +"Y c #2F69AE", +"T c #2F6AAE", +"R c #2E6AB2", +"E c #316BB0", +"W c #326CB0", +"Q c #356FB2", +"! c #366FB2", +"~ c #346FB5", +"^ c #3971B3", +"/ c #3B73B5", +"( c #3A73B7", +") c #3D75B6", +"_ c #3F76B9", +"` c #4377B5", +"' c #4077B7", +"] c #4278B8", +"[ c #457BBA", +"{ c #447ABB", +"} c #467CBA", +"| c #4A7EBC", +" . c #4B7FBC", +".. c #FB7081", +"X. c #FE7481", +"o. c #FC7485", +"O. c #FE7784", +"+. c #FF7B85", +"@. c #FE7987", +"#. c #FD7888", +"$. c #FF7B89", +"%. c #FD7B8B", +"&. c #FE7F8F", +"*. c #5082BE", +"=. c #5082BF", +"-. c #5485C0", +";. c #5485C1", +":. c #5889C2", +">. c #5989C3", +",. c #5D8DC4", +"<. c #6190C6", +"1. c #6693C8", +"2. c #779ECE", +"3. c #FE8291", +"4. c #FE97A4", +"5. c gray82", +"6. c #D5D5D5", +"7. c #EDEFEF", +"8. c #EFEFEF", +"9. c #F1F1F1", +"0. c gray95", +"q. c #F3F3F3", +"w. c #F4F4F4", +"e. c #F4F5F5", +"r. c gray96", +"t. c #F6F6F6", +"y. c gray97", +"u. c #F8F8F8", +"i. c #F9F9F9", +"p. c gray98", +"a. c #FBFBFB", +"s. c #FBFCFB", +"d. c gray99", +"f. c #FDFCFD", +"g. c #FDFDFD", +"h. c #FEFEFE", +/* pixels */ +"0 0 0 0 0 8 0 0 8 6 6 6 4 1 1 1 ", +"0 $.$.@.O.o.V B N n z k g f s < ", +"0 @.x l g d a p u y t r e w i < ", +"q 4.3.&.$.$.o.V V N b b k h ..> ", +"9.h.h.h.d.a.a.u.u.a.t.t.e.e.e.6.", +"8.h.h.s.d.a.a.a.t.t.t.t.q.0.e.5.", +"8.h.s.s.a.a.a.u.t.t.t.w.w.9.q.5.", +"A 2.>.;.=.| ] ' / ^ E U L J ' + ", +"Z 1.] _ / ~ R I K H G F D S T ", +"Z <.,.:.;.*.| } ] ) ^ Q W T I ", +"; - = * & % $ # @ + O o o . . " +}; diff --git a/src/pixmaps/flags_xpm/no.xpm b/src/pixmaps/flags_xpm/no.xpm new file mode 100644 index 00000000..34b9cb9d --- /dev/null +++ b/src/pixmaps/flags_xpm/no.xpm @@ -0,0 +1,142 @@ +/* XPM */ +static const char *no[] = { +/* columns rows colors chars-per-pixel */ +"16 11 125 2", +" c #B10000", +". c #B50000", +"X c #B90000", +"o c #BB0000", +"O c #BD0000", +"+ c #BF0000", +"@ c #C30000", +"# c #C50000", +"$ c #C90000", +"% c #CB0000", +"& c #CF0000", +"* c #D10000", +"= c #D50000", +"- c #D70000", +"; c #D90000", +": c #DB0000", +"> c #DD0000", +", c #DA0E0B", +"< c #DC110E", +"1 c #DC1210", +"2 c #DD1613", +"3 c #DD1714", +"4 c #DF1B19", +"5 c #DF1C19", +"6 c #E10000", +"7 c #E0211E", +"8 c #E0211F", +"9 c #DE2E2C", +"0 c #E12623", +"q c #E22724", +"w c #E22926", +"e c #E22B29", +"r c #E22C2A", +"t c #E42E2B", +"y c #E42E2C", +"u c #E0312F", +"i c #E4302E", +"p c #E4312F", +"a c #E03432", +"s c #E03532", +"d c #E53431", +"f c #E23735", +"g c #E63734", +"h c #E73936", +"j c #E73A37", +"k c #E23B39", +"l c #E83E3C", +"z c #E83F3D", +"x c #E4403D", +"c c #E44442", +"v c #E64644", +"b c #E94342", +"n c #E94442", +"m c #EA4644", +"M c #E64946", +"N c #EA4947", +"B c #EB4947", +"V c #E74B49", +"C c #E74C4B", +"Z c #EB4B49", +"A c #EB4E4B", +"S c #EB4E4C", +"D c #E8504E", +"F c #EC5251", +"G c #E95553", +"H c #EB5A57", +"J c #EF5D5C", +"K c #EC5E5C", +"L c #EC5F5D", +"P c #F0615F", +"I c #ED6360", +"U c #ED6462", +"Y c #EE6765", +"T c #EE6866", +"R c #EF6B69", +"E c #EF6D6A", +"W c #EF6F6D", +"Q c #F07271", +"! c #F27A79", +"~ c #F27D7A", +"^ c #F27D7B", +"/ c #0000A5", +"( c #001DB7", +") c #0353CF", +"_ c #0959D1", +"` c #4B83D5", +"' c #5086D7", +"] c #548AD8", +"[ c #598DD9", +"{ c #5D90DB", +"} c #6594DA", +"| c #6294DD", +" . c #6596DE", +".. c #6697DE", +"X. c #6A99E0", +"o. c #6B9AE0", +"O. c #6F9CE1", +"+. c #6F9DE1", +"@. c #739FE3", +"#. c #77A3E4", +"$. c #7AA4E2", +"%. c #7AA5E5", +"&. c #7BA6E5", +"*. c #7EA8E7", +"=. c #92B6EA", +"-. c #95B9EB", +";. c gray89", +":. c #E7E7E7", +">. c gray93", +",. c #EFEFEF", +"<. c gray95", +"1. c #F3F3F3", +"2. c #F4F4F4", +"3. c gray96", +"4. c #F6F6F6", +"5. c gray97", +"6. c #F8F8F8", +"7. c #F9F9F9", +"8. c gray98", +"9. c #FBFBFB", +"0. c #FBFCFB", +"q. c gray99", +"w. c #FDFDFD", +"e. c #FEFEFE", +"r. c gray100", +/* pixels */ +"6 6 6 r._ r.: : : - - = & & % % ", +"6 ^ ^ r.=.r.Q W R Y P L H G D @ ", +"> ! P r.*.r.F A B b z h d y V @ ", +"6 ! J r.$.r.A B b l h d t w v + ", +"r.r.r.0.#.q.w.9.9.6.6.3.3.3.3.:.", +") =.%.#.@.+.....| { [ ] ` ` } / ", +"9.r.9.9.O.9.9.6.3.3.3.3.1.1.3.;.", +": E Z 9...9.d p t q 8 5 3 1 s . ", +": T n 9...6.p e 0 7 4 1 < , u ", +"- U L 9.$.6.C M c x k f s a 9 ", +"= & & >.( >.@ + + X X . . " +}; diff --git a/src/pixmaps/flags_xpm/np.xpm b/src/pixmaps/flags_xpm/np.xpm new file mode 100644 index 00000000..5a5440b0 --- /dev/null +++ b/src/pixmaps/flags_xpm/np.xpm @@ -0,0 +1,83 @@ +/* XPM */ +static const char *np[] = { +/* columns rows colors chars-per-pixel */ +"9 11 66 1", +" c #060936", +". c #070A37", +"X c #070B38", +"o c #080C38", +"O c #080D3A", +"+ c #090E3C", +"@ c #0A0F3E", +"# c #161236", +"$ c #1A153E", +"% c #0A1044", +"& c #0B1047", +"* c #0B1149", +"= c #0E165D", +"- c #1E1855", +"; c #111A72", +": c #111B75", +"> c #121C78", +", c #131D7F", +"< c #181E7F", +"1 c #221C6C", +"2 c #AB0000", +"3 c #B30000", +"4 c #C10000", +"5 c #C20000", +"6 c #C70000", +"7 c #D00000", +"8 c #D80000", +"9 c #DC0000", +"0 c #DD0000", +"q c #DE0000", +"w c #E70101", +"e c #EC0000", +"r c #F00000", +"t c #DF4B4B", +"y c #E35252", +"u c #E45757", +"i c #E45D5D", +"p c #E76D6D", +"a c #EA7D7D", +"s c #271F83", +"d c #1D2D96", +"f c #1A249D", +"g c #2A2299", +"h c #1C2AB7", +"j c #2E25AB", +"k c #3027B9", +"l c #2C44B4", +"z c #1D2DC9", +"x c #1F30D6", +"c c #3329C6", +"v c #3229C9", +"b c #EA8282", +"n c #EC8888", +"m c #F2AEAE", +"M c #F6D3D3", +"N c #F9DBDB", +"B c #F9DCDC", +"V c #F9DDDD", +"C c #F9DFDF", +"Z c #F9E0E0", +"A c #FAE4E4", +"S c #FAE6E6", +"D c #FBEAEA", +"F c #FBEBEB", +"G c #FCF0F0", +"H c None", +/* pixels */ +"vxxHHHHHH", +"crwzHHHHH", +"keAMhHHHH", +"jGVNAfHHH", +"gmFF06,HH", +"s09lds>;H", +"19nb:HHHH", +"-aZVt=HHH", +"$pVNi3&HH", +"#6uy632+H", +"*%@++X..." +}; diff --git a/src/pixmaps/flags_xpm/nr.xpm b/src/pixmaps/flags_xpm/nr.xpm new file mode 100644 index 00000000..9840e2d9 --- /dev/null +++ b/src/pixmaps/flags_xpm/nr.xpm @@ -0,0 +1,174 @@ +/* XPM */ +static const char *nr[] = { +/* columns rows colors chars-per-pixel */ +"16 11 157 2", +" c black", +". c #000001", +"X c #000003", +"o c #000007", +"O c #00000D", +"+ c #000013", +"@ c #000019", +"# c #00001B", +"$ c #000021", +"% c #000023", +"& c #000027", +"* c #00002D", +"= c #00002F", +"- c #000033", +"; c #000035", +": c #000039", +"> c #00003B", +", c #00003F", +"< c #000041", +"1 c #000047", +"2 c #00004B", +"3 c #00004D", +"4 c #000351", +"5 c #000551", +"6 c #000955", +"7 c #000D59", +"8 c #00135D", +"9 c #00135F", +"0 c #00155F", +"q c #001D5B", +"w c #00195F", +"e c #10457A", +"r c #13477D", +"t c #14487C", +"y c #194B7F", +"u c #1C4D7F", +"i c #BB8100", +"p c #DFB51D", +"a c #DEC158", +"s c #E0C35C", +"d c #E1C560", +"f c #E3C765", +"g c #E4C969", +"h c #E6CB6D", +"j c #E2C970", +"k c #E7CD72", +"l c #E8CF76", +"z c #E9D17A", +"x c #E8D17D", +"c c #184B80", +"v c #1D4F83", +"b c #1E5082", +"n c #215182", +"m c #225386", +"M c #245485", +"N c #265685", +"B c #285785", +"V c #285889", +"C c #2A5A89", +"Z c #28588A", +"A c #2A5A8B", +"S c #2D5B89", +"D c #2D5C8C", +"F c #2D5C8D", +"G c #315D8A", +"H c #305E8C", +"J c #305E8E", +"K c #315F8E", +"L c #325F8F", +"P c #33608C", +"I c #34608D", +"U c #35638F", +"Y c #36628F", +"T c #326191", +"R c #366290", +"E c #366391", +"W c #356292", +"Q c #376392", +"! c #376490", +"~ c #3A6591", +"^ c #3B6692", +"/ c #3B6693", +"( c #3C6690", +") c #3B6795", +"_ c #3D6893", +"` c #3C6895", +"' c #3E6894", +"] c #406B96", +"[ c #426B96", +"{ c #426D97", +"} c #466F96", +"| c #406B98", +" . c #416C98", +".. c #436E9A", +"X. c #466F99", +"o. c #456F9C", +"O. c #467099", +"+. c #47709A", +"@. c #46709B", +"#. c #48709A", +"$. c #4A729C", +"%. c #4A739F", +"&. c #4B749E", +"*. c #4C749D", +"=. c #4D759D", +"-. c #4F769E", +";. c #53799F", +":. c #4E77A1", +">. c #5078A1", +",. c #5279A0", +"<. c #5379A0", +"1. c #547BA0", +"2. c #557BA3", +"3. c #567CA2", +"4. c #577DA3", +"5. c #547AA4", +"6. c #5A7EA2", +"7. c #587EA6", +"8. c #597FA6", +"9. c #5E82A3", +"0. c #5C80A6", +"q. c #5B81A9", +"w. c #5D82A8", +"e. c #5F84AB", +"r. c #6284A6", +"t. c #6084A9", +"y. c #6185A9", +"u. c #6284A9", +"i. c #6085AB", +"p. c #6587AA", +"a. c #6387AC", +"s. c #6587AC", +"d. c #6588AB", +"f. c #698BAE", +"g. c #6A8BAE", +"h. c #6D8FB0", +"j. c #6E8FB1", +"k. c #7091B2", +"l. c #7394B3", +"z. c #7694B3", +"x. c #7494B4", +"c. c #7796B6", +"v. c #7E9BB6", +"b. c #7A99B9", +"n. c #7B99BA", +"m. c #7C9AB9", +"M. c #7E9CBA", +"N. c #7E9DBB", +"B. c #8FA8BF", +"V. c #E8D380", +"C. c #ECD684", +"Z. c #F1DD9A", +"A. c #93ABC4", +"S. c #B8C7D6", +"D. c #DBE3EC", +"F. c #E4E8EE", +"G. c #FBFBFB", +/* pixels */ +"w 0 0 0 9 7 6 3 2 1 < > ; = & % ", +"0 N.N.m.n.c.l.l.j.f.d.e.9.7.<.@ ", +"0 N.a.i.q.0.5.>.&.@...) W L =.+ ", +"9 n.e.q.7.5.>.&.o.' ) W L A O.O ", +"q v.r.9.6.<.=.O.{ _ Q P S B } X ", +"p Z.C.x x z l k h g f s a a j i ", +"5 l.3.B.3.O.' / U P A N n u ( . ", +"3 j.A.G.D...Q T F Z m v y t W . ", +"1 g.i.F.S.( L D Z M v y t e Y . ", +", p.i.z.p.;.=.$.} { ' / Y P G . ", +"> - = & % @ + O X . . . . . . . " +}; diff --git a/src/pixmaps/flags_xpm/nu.xpm b/src/pixmaps/flags_xpm/nu.xpm new file mode 100644 index 00000000..147d2fae --- /dev/null +++ b/src/pixmaps/flags_xpm/nu.xpm @@ -0,0 +1,165 @@ +/* XPM */ +static const char *nu[] = { +/* columns rows colors chars-per-pixel */ +"16 11 148 2", +" c #DF5957", +". c #F94D43", +"X c #F1494D", +"o c #FD5345", +"O c #F5504C", +"+ c #E6575A", +"@ c #ED5F67", +"# c #E25C68", +"$ c #FD776F", +"% c #DFC033", +"& c #DFC134", +"* c #DFC135", +"= c #DFC236", +"- c #DFC337", +"; c #E1C538", +": c #E4C83B", +"> c #E4C83C", +", c #E6CA3E", +"< c #E6CA3F", +"1 c #E6DC3C", +"2 c #E6DC3D", +"3 c #E7DE3F", +"4 c #E9DF3C", +"5 c #EAE03E", +"6 c #EAE13F", +"7 c #FD827E", +"8 c #E8CD41", +"9 c #E8CD42", +"0 c #E8CE43", +"q c #E8CE44", +"w c #E8D046", +"e c #EAD146", +"r c #E7DF40", +"t c #E7DF41", +"y c #EAD349", +"u c #EBD349", +"i c #ECD54C", +"p c #EDD54D", +"a c #EFD64F", +"s c #EFD750", +"d c #EFD654", +"f c #EFD955", +"g c #F0D952", +"h c #F0D956", +"j c #F2DC55", +"k c #F3DB5A", +"l c #F3DB5B", +"z c #F4DF58", +"x c #E7E041", +"c c #EBE241", +"v c #E8E143", +"b c #E9E143", +"n c #ECE443", +"m c #E9E144", +"M c #EBE446", +"N c #EBE447", +"B c #ECE444", +"V c #EDE647", +"C c #EEE647", +"Z c #E6E249", +"A c #ECE548", +"S c #ECE649", +"D c #EEE749", +"F c #EFE749", +"G c #ECE64A", +"H c #EDE74A", +"J c #EFE64E", +"K c #EEE84B", +"L c #EEE84C", +"P c #EEE94C", +"I c #EEE94D", +"U c #EFEA4D", +"Y c #EFEA4E", +"T c #EFEA4F", +"R c #F0EA4D", +"E c #F2EB4D", +"W c #F2EC4F", +"Q c #F0EB50", +"! c #F1E953", +"~ c #F1EC51", +"^ c #F2EC50", +"/ c #F2ED52", +"( c #F3EE53", +") c #F4EF53", +"_ c #F3EF56", +"` c #F2EF57", +"' c #F6E25B", +"] c #F4EB58", +"[ c #F5F055", +"{ c #F6F155", +"} c #F4F057", +"| c #F6F157", +" . c #FDF352", +".. c #F4F158", +"X. c #F5F259", +"o. c #F6F258", +"O. c #F5F35B", +"+. c #F6F35B", +"@. c #F8F45A", +"#. c #F8F45B", +"$. c #F9F65D", +"%. c #F8F65E", +"&. c #FDCB60", +"*. c #FED369", +"=. c #FBDA69", +"-. c #FCDF71", +";. c #FBF860", +":. c #FBF961", +">. c #FCFA63", +",. c #FEFA7C", +"<. c #3631B1", +"1. c #6E64B4", +"2. c #5656CA", +"3. c #6771D7", +"4. c #6576D4", +"5. c #6F77DF", +"6. c #7373D7", +"7. c #5775EB", +"8. c #5F7DF1", +"9. c #837AC9", +"0. c #7F85DE", +"q. c #7F8BE9", +"w. c #7184F5", +"e. c #FD958F", +"r. c #EF959C", +"t. c #FE9694", +"y. c #FEA4A0", +"u. c #F0A2A8", +"i. c #FEABA9", +"p. c #FBB4B3", +"a. c #FEE880", +"s. c #FEEA83", +"d. c #FEC0BE", +"f. c #8383DF", +"g. c #908BD9", +"h. c #8294EB", +"j. c #9DA9EE", +"k. c #C7B5DE", +"l. c #BDCAF7", +"z. c #FDC6C5", +"x. c #FCD0D3", +"c. c #FBD3D6", +"v. c #FFD8D7", +"b. c #DED1E8", +"n. c #D6D3F2", +"m. c #D5DFFB", +"M. c #D9E2FC", +"N. c #E5E1F5", +/* pixels */ +"6.$ f.q.. 5.3.. <.h ' z j g a p ", +"8.M.v.N.,.n.z.l.w._ $.#.+.) ( u ", +"@ c.s.i.&.e.=.u.# ] _ / Y J W q ", +"X x.s.t.&.e.=.r.+ ! / Y Y G W q ", +"7.m.d.b. .k.p.j.4.Z Y Y G M H 0 ", +"2.y.g.h.O 0.9. 1.J K G M x V < ", +"k >.$.+.+.} ( ( Y K G M c x n > ", +"k $.+.+._ ( Q Y H G M x t 3 c - ", +"j ;.+.| ( W W H M c 3 3 1 3 4 - ", +"h #.+.| _ ) W W H H V 6 6 4 4 % ", +"d j g p i u q 8 8 < : ; - % - % " +}; diff --git a/src/pixmaps/flags_xpm/nz.xpm b/src/pixmaps/flags_xpm/nz.xpm new file mode 100644 index 00000000..5c7a7700 --- /dev/null +++ b/src/pixmaps/flags_xpm/nz.xpm @@ -0,0 +1,180 @@ +/* XPM */ +static const char *nz[] = { +/* columns rows colors chars-per-pixel */ +"16 11 163 2", +" c black", +". c #000001", +"X c #000003", +"o c #000007", +"O c #000009", +"+ c #00000B", +"@ c #00000F", +"# c #000011", +"$ c #000015", +"% c #000017", +"& c #000019", +"* c #00001D", +"= c #00001F", +"- c #000023", +"; c #000025", +": c #000029", +"> c #00002D", +", c #000033", +"< c #000039", +"1 c #00003D", +"2 c #00003F", +"3 c #7F153B", +"4 c #000045", +"5 c #000047", +"6 c #00004D", +"7 c #00004F", +"8 c #000051", +"9 c #000053", +"0 c #000055", +"q c #000059", +"w c #00005D", +"e c #00005F", +"r c #000061", +"t c #000067", +"y c #2D176B", +"u c #651F53", +"i c #5D235D", +"p c #7F2349", +"a c #6E3663", +"s c #753D6A", +"d c #79426E", +"f c #85173D", +"g c #CF1919", +"h c #A8485B", +"j c #B94650", +"k c #804D76", +"l c #895378", +"z c #88567F", +"x c #8E597D", +"c c #AE5265", +"v c #B1596D", +"b c #AF5F79", +"n c #B66275", +"m c #C3606A", +"M c #C86670", +"N c #D76E72", +"B c #E46B6A", +"V c #E57472", +"C c #E17778", +"Z c #E97C7A", +"A c #102986", +"S c #142E89", +"D c #18318A", +"F c #19318B", +"G c #1E358E", +"H c #1F368E", +"J c #1F378E", +"K c #233A91", +"L c #243B90", +"P c #243B91", +"I c #253C92", +"U c #293F94", +"Y c #2C4193", +"T c #2A4094", +"R c #2B4195", +"E c #2C4294", +"W c #2C4396", +"Q c #2F4494", +"! c #2E4597", +"~ c #2F4597", +"^ c #2F4598", +"/ c #334797", +"( c #354A99", +") c #364B99", +"_ c #344A9A", +"` c #344A9B", +"' c #374C99", +"] c #374C9B", +"[ c #394D9A", +"{ c #3B4F9C", +"} c #3A4F9D", +"| c #3A4F9E", +" . c #3B509C", +".. c #3D519D", +"X. c #3C519F", +"o. c #3F54A1", +"O. c #46468E", +"+. c #435299", +"@. c #42559F", +"#. c #4B559B", +"$. c #53539A", +"%. c #6B6199", +"&. c #7B6395", +"*. c #4055A0", +"=. c #4054A1", +"-. c #4256A2", +";. c #4457A2", +":. c #465AA2", +">. c #4458A4", +",. c #4559A4", +"<. c #485AA1", +"1. c #4B5BA3", +"2. c #495DA4", +"3. c #4B5EA5", +"4. c #495EA7", +"5. c #4E61A8", +"6. c #4F61A9", +"7. c #5062A8", +"8. c #5365A9", +"9. c #5466AA", +"0. c #586AAD", +"q. c #5D6FB0", +"w. c #6264A1", +"e. c #606EAD", +"r. c #6171B1", +"t. c #6172B3", +"y. c #6575B3", +"u. c #6676B4", +"i. c #6A7AB5", +"p. c #6A7AB7", +"a. c #6F7FB9", +"s. c #8F5F86", +"d. c #805E8C", +"f. c #945D80", +"g. c #916185", +"h. c #816290", +"j. c #92769C", +"k. c #98799E", +"l. c #A87390", +"z. c #A47B9A", +"x. c #887CA9", +"c. c #C37181", +"v. c #9787AF", +"b. c #C38293", +"n. c #C18395", +"m. c #D58991", +"M. c #E08284", +"N. c #EB8582", +"B. c #E28789", +"V. c #E79495", +"C. c #D8A1AA", +"Z. c #D8AAB4", +"A. c #D9B2BA", +"S. c #F1A8A6", +"D. c #F1ACA9", +"F. c #E2B8BE", +"G. c #939CC6", +"H. c #9A9CC3", +"J. c #D8BAC5", +"K. c #E4C0C8", +"L. c #E3C4CC", +"P. c #E6CFD7", +"I. c #E0D4DF", +/* pixels */ +"c.&.t 3 f 0 u b w 0 8 6 4 2 < 2 ", +"y K.I.Z.C.J.P.H.p.y.r.z.e.8.5.: ", +"g V.N.V B Z C N 1.=.g.M x Y 2.; ", +"p F.S.M.B.D.m.l.;.X.] z ~ l 1.= ", +"%.L.v.n.b.G.A.k.X.n #.R k c g.& ", +"i x.$.h.d.O.w.j.] m v I J d .$ ", +"r a.6.4.,.=.{ _ ~ Y L J F S ] @ ", +"w p.4.,.=.| _ ~ R K J F s A / o ", +"q u.,.o.{ _ ~ U K J S h j a Q . ", +"8 r.q.0.8.7.4.:.@.| { +.x / Y . ", +"8 5 2 < , > : - & & # + o . . + " +}; diff --git a/src/pixmaps/flags_xpm/om.xpm b/src/pixmaps/flags_xpm/om.xpm new file mode 100644 index 00000000..92ac395b --- /dev/null +++ b/src/pixmaps/flags_xpm/om.xpm @@ -0,0 +1,151 @@ +/* XPM */ +static const char *om[] = { +/* columns rows colors chars-per-pixel */ +"16 11 134 2", +" c #002D00", +". c #003100", +"X c #003300", +"o c #003700", +"O c #003D00", +"+ c #003F00", +"@ c #004100", +"# c #004B00", +"$ c #004F00", +"% c #005500", +"& c #910000", +"* c #930000", +"= c #9F0000", +"- c #A30000", +"; c #A50000", +": c #A90000", +"> c #AD0000", +", c #B10000", +"< c #B50000", +"1 c #B90000", +"2 c #BD0000", +"3 c #BF0000", +"4 c #CA1414", +"5 c #CB1919", +"6 c #C91A1A", +"7 c #CB1F1F", +"8 c #CD1F1F", +"9 c #CA2020", +"0 c #CC2525", +"q c #CF2424", +"w c #CD2B2B", +"e c #CE2B2B", +"r c #D12A2A", +"t c #D32F2F", +"y c #CF3030", +"u c #D03030", +"i c #D13636", +"p c #D23636", +"a c #D43535", +"s c #D03B3B", +"d c #D33A3A", +"f c #D43B3B", +"g c #D63B3A", +"h c #D23B3C", +"j c #D13F3F", +"k c #D43F3F", +"l c #D53F3F", +"z c #D44141", +"x c #D64040", +"c c #D64444", +"v c #D64545", +"b c #D64646", +"n c #D74646", +"m c #D84040", +"M c #D74B4B", +"N c #D84949", +"B c #D84A49", +"V c #D84A4B", +"C c #DA4F4F", +"Z c #DA4F50", +"A c #DB5353", +"S c #D85455", +"D c #DB5454", +"F c #DA5858", +"G c #DC5858", +"H c #DD5959", +"J c #DB5D5D", +"K c #DD6162", +"L c #DE6666", +"P c #E06A6A", +"I c #E16F6F", +"U c #E27273", +"Y c #E37676", +"T c #E37777", +"R c #0B9C0B", +"E c #0F9E0E", +"W c #109E10", +"Q c #13A013", +"! c #14A114", +"~ c #18A219", +"^ c #19A319", +"/ c #1EA51E", +"( c #1FA51F", +") c #23A823", +"_ c #24A824", +"` c #29AA29", +"' c #2AAB2A", +"] c #2CA92C", +"[ c #2FA92F", +"{ c #2EAD2E", +"} c #2FAD2F", +"| c #32AB32", +" . c #33AC32", +".. c #35AE35", +"X. c #39AF39", +"o. c #34B034", +"O. c #3AB33A", +"+. c #3DB13D", +"@. c #42B342", +"#. c #46B546", +"$. c #4BB84B", +"%. c #50BA50", +"&. c #EEB0B0", +"*. c #F2BEBE", +"=. c #D7D7D7", +"-. c gray85", +";. c #DDDDDD", +":. c #DFDFDF", +">. c #F7D7D7", +",. c #E1E1E1", +"<. c gray89", +"1. c gray90", +"2. c #E7E7E7", +"3. c #E9E9E9", +"4. c gray92", +"5. c gray93", +"6. c #EFEFEF", +"7. c #F9E1E1", +"8. c #EFEFF1", +"9. c gray96", +"0. c #F6F6F6", +"q. c gray97", +"w. c #FCF0F0", +"e. c #FCF7F7", +"r. c #F8F8F8", +"t. c #F9F9F9", +"y. c gray98", +"u. c #FBFBFB", +"i. c #FDF9F9", +"p. c #FEFAFA", +"a. c gray99", +"s. c #FDFDFD", +"d. c #FDFDFE", +"f. c #FEFEFE", +/* pixels */ +"3 3 3 3 3 8.6.5.5.4.3.2.1.<.,.:.", +"3 w.*.e.T d.d.d.a.s.a.t.t.t.q.;.", +"3 7.p.>.H d.a.a.a.t.t.q.0.0.q.-.", +"3 e.&.p.D d.a.a.t.t.t.q.0.0.0.=.", +"3 Y G D C M v z h p y w 0 7 j & ", +"3 U A C V v x g p u w q 7 6 s & ", +"< I C N v m g a u r q 9 6 4 y * ", +"< P N v x O.o.} ' _ ( ^ ! W ..o ", +"< L v k g ..] ' _ ( ~ W W R [ . ", +", K J F D %.$.#.@.+.X...| [ ] ", +"> : ; - = % % # @ + + o . . " +}; diff --git a/src/pixmaps/flags_xpm/pa.xpm b/src/pixmaps/flags_xpm/pa.xpm new file mode 100644 index 00000000..2db75970 --- /dev/null +++ b/src/pixmaps/flags_xpm/pa.xpm @@ -0,0 +1,148 @@ +/* XPM */ +static const char *pa[] = { +/* columns rows colors chars-per-pixel */ +"16 11 131 2", +" c #D10000", +". c #D50000", +"X c #D70000", +"o c #DB0000", +"O c #DD0000", +"+ c #DF0000", +"@ c #E10000", +"# c #E30000", +"$ c #E70000", +"% c #E90000", +"& c #EB0000", +"* c #ED0000", +"= c #E92020", +"- c #EB2525", +"; c #EC2626", +": c #EC2B2B", +"> c #ED2B2B", +", c #ED2C2C", +"< c #E83231", +"1 c #ED3030", +"2 c #EE3131", +"3 c #EF3636", +"4 c #EF3736", +"5 c #EF3737", +"6 c #EC3F3F", +"7 c #F13B3C", +"8 c #F13C3C", +"9 c #F13C3D", +"0 c #ED4444", +"q c #E94949", +"w c #EF4949", +"e c #F24242", +"r c #F24A4A", +"t c #F04E4E", +"y c #F44F50", +"u c #F15353", +"i c #F25757", +"p c #F35C5C", +"a c #ED6868", +"s c #EE6D6D", +"d c #F46060", +"f c #F56565", +"g c #EF7171", +"h c #EE7E7E", +"j c #F77070", +"k c #F07474", +"l c #F17878", +"z c #F27D7E", +"x c #0017DD", +"c c #001DDF", +"v c #0025E1", +"b c #002BE3", +"n c #0031E5", +"m c #0037E9", +"M c #003FEB", +"N c #0045ED", +"B c #004BEF", +"V c #004FF1", +"C c #0055F1", +"Z c #005BF3", +"A c #1B7FF5", +"S c #4592F0", +"D c #4995F1", +"F c #4A96F1", +"G c #4C96F3", +"H c #4F99F3", +"J c #539CF4", +"K c #549CF4", +"L c #549DF4", +"P c #589FF5", +"I c #599FF5", +"U c #5EA1F2", +"Y c #59A0F5", +"T c #5DA2F6", +"R c #5EA3F6", +"E c #62A4F2", +"W c #66A6F3", +"Q c #62A5F7", +"! c #6AA9F5", +"~ c #6FABF6", +"^ c #67A8F8", +"/ c #73AEF7", +"( c #78ADF2", +") c #77B1F7", +"_ c #78B1F6", +"` c #7CB3F7", +"' c #7AB3F8", +"] c #7FB6F9", +"[ c #ED8383", +"{ c #EE8C8C", +"} c #80B6F7", +"| c #83B8F9", +" . c #84B8F8", +".. c #87BBF9", +"X. c #85B9FA", +"o. c #91C0FB", +"O. c #9DC8FA", +"+. c #B2D3FB", +"@. c #BEDAFB", +"#. c #CBCBCB", +"$. c #CFCDCD", +"%. c gray81", +"&. c gray82", +"*. c LightGray", +"=. c #D7D7D7", +"-. c #EFC7C7", +";. c #F1CBCB", +":. c #F2D3D3", +">. c #F2D5D5", +",. c gray93", +"<. c #EFEFEF", +"1. c #EFEFF1", +"2. c #E3EFFC", +"3. c #E5F1FE", +"4. c #EBF3FE", +"5. c #EDF5FE", +"6. c #F1F1F1", +"7. c gray95", +"8. c #F3F3F3", +"9. c #F4F4F4", +"0. c gray96", +"q. c #F6F6F6", +"w. c gray97", +"e. c gray98", +"r. c #FBFBFB", +"t. c gray99", +"y. c #FDFCFD", +"u. c #FDFDFD", +"i. c #FDFDFE", +"p. c #FEFEFE", +"a. c gray100", +/* pixels */ +"6.6.6.6.6.<.<.<.& & & $ # # + + ", +"6.a.a.5.4.a.a.y.j f d p i u w o ", +"<.a.3.o.X.2.t.t.t e 9 4 2 , w X ", +"6.a.a.@.+.t.t.r.r 9 4 2 > ; q X ", +"6.a.a.a.t.t.r.r.7 5 2 : - = 6 ", +"A O...} } ` _ ( z l g g s a h X ", +"Z | ^ Q T I L H w.0.0.9.9.9.9.&.", +"C ] Q T I K G F 0.0.9.{ [ 6.6.%.", +"V ' T L J H D S 0.0.;.q < -.6.#.", +"V _ / ~ ! W E U 0.0.9.>.:.6.9.#.", +"N M m n b v c x =.*.&.&.%.#.#.#." +}; diff --git a/src/pixmaps/flags_xpm/pe.xpm b/src/pixmaps/flags_xpm/pe.xpm new file mode 100644 index 00000000..d58ca0c1 --- /dev/null +++ b/src/pixmaps/flags_xpm/pe.xpm @@ -0,0 +1,116 @@ +/* XPM */ +static const char *pe[] = { +/* columns rows colors chars-per-pixel */ +"16 11 99 2", +" c #DD0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #ED0000", +"% c #EF0000", +"& c #F10000", +"* c #F30000", +"= c #F50000", +"- c #F70000", +"; c #F90000", +": c #FB0000", +"> c #FD0000", +", c red", +"< c #F10B0B", +"1 c #F10F0E", +"2 c #F21010", +"3 c #F21313", +"4 c #F21414", +"5 c #F31919", +"6 c #F31A1A", +"7 c #F41F1F", +"8 c #F42020", +"9 c #F52525", +"0 c #F52626", +"q c #F62B2B", +"w c #F22C2C", +"e c #F22F2F", +"r c #F62C2C", +"t c #F23232", +"y c #F33232", +"u c #F73131", +"i c #F33535", +"p c #F43636", +"a c #F83737", +"s c #F43B3B", +"d c #F53F3F", +"f c #F93A3A", +"g c #FA3F3F", +"h c #F64444", +"j c #FA4444", +"k c #FB4545", +"l c #F74949", +"z c #F74E4E", +"x c #FB4949", +"c c #FB4A49", +"v c #FC4A4B", +"b c #FC4F4F", +"n c #FD4F50", +"m c #F85353", +"M c #FD5353", +"N c #F95455", +"B c #F95757", +"V c #FD5454", +"C c #F95858", +"Z c #FE5858", +"A c #FE5959", +"S c #FA5C5C", +"D c #FA5D5D", +"F c #FE5C5C", +"G c #FE5F5F", +"H c #FB6162", +"J c #FC6666", +"K c #FC6A6A", +"L c #FD6F6F", +"P c #FE7273", +"I c #FE7676", +"U c #FE7777", +"Y c #FE7979", +"T c #FF7B7A", +"R c #FF7B7B", +"E c #E3C3C3", +"W c #E5C5C5", +"Q c #E7C7C7", +"! c #E9CBCB", +"~ c #EBCDCD", +"^ c #EDCFCF", +"/ c #F7DFDF", +"( c #F9E1E1", +") c #FBE3E3", +"_ c #FDE5E5", +"` c #FDE7E7", +"' c #F3F3F3", +"] c #F4F4F4", +"[ c gray96", +"{ c #F6F6F6", +"} c gray97", +"| c #F8F8F8", +" . c #F9F9F9", +".. c gray98", +"X. c #FBFBFB", +"o. c gray99", +"O. c #FDFDFD", +"+. c #FDFDFE", +"@. c #FEFEFE", +/* pixels */ +", , , , , ` ` ` ( ( / = * * % % ", +", R R R U O.o.O.o.o.X.S B m z @ ", +", R G F F o.O.X.X.X.| a u r l @ ", +", U G B V O.o.X.X.| | u q 0 h + ", +", U Z V b o.X.| } } } q 0 8 d + ", +", P M b x X.X.X.| } } 9 7 5 s + ", +": L b x k X.| | } } } 7 5 4 p X ", +": K x k g X.| } } } ] 5 4 2 y . ", +"= J j g s | } } ' ' ' 2 2 < e . ", +"= H D C B | } } } } ' p y e w ", +"= = * % % ^ ~ ! W E E X . " +}; diff --git a/src/pixmaps/flags_xpm/pf.xpm b/src/pixmaps/flags_xpm/pf.xpm new file mode 100644 index 00000000..8e5c69c6 --- /dev/null +++ b/src/pixmaps/flags_xpm/pf.xpm @@ -0,0 +1,150 @@ +/* XPM */ +static const char *pf[] = { +/* columns rows colors chars-per-pixel */ +"16 11 133 2", +" c #990000", +". c #9B0000", +"X c #9D0000", +"o c #9F0000", +"O c #A30000", +"+ c #A50000", +"@ c #A70000", +"# c #A90000", +"$ c #AD0000", +"% c #B10000", +"& c #B30000", +"* c #B50000", +"= c #B70000", +"- c #BB0000", +"; c #BF0000", +": c #C10000", +"> c #C50000", +", c #C70000", +"< c #C90000", +"1 c #CB0000", +"2 c #CD0000", +"3 c #CF0000", +"4 c #CF0B0B", +"5 c #D10000", +"6 c #D30000", +"7 c #D70000", +"8 c #D00F0E", +"9 c #D21313", +"0 c #D31919", +"q c #D51E1E", +"w c #D72323", +"e c #D32C2C", +"r c #D42F2F", +"t c #D62F2F", +"y c #D82929", +"u c #DA2C2C", +"i c #DA2E2E", +"p c #D53232", +"a c #D63535", +"s c #DB3131", +"d c #DC3434", +"f c #DD3737", +"g c #D83939", +"h c #DD3A3A", +"j c #D93D3D", +"k c #DF3C3D", +"l c #DF3F3F", +"z c #DB4242", +"x c #DD4646", +"c c #DE4949", +"v c #DD4B4B", +"b c #DF4E4E", +"n c #DE5050", +"m c #E04242", +"M c #E04444", +"N c #E14747", +"B c #E24C4C", +"V c #E15353", +"C c #E45151", +"Z c #E05455", +"A c #E25757", +"S c #E55454", +"D c #E25858", +"F c #E65959", +"G c #E35C5C", +"H c #E25D5D", +"J c #E65C5C", +"K c #E75F5F", +"L c #E36848", +"P c #D06961", +"I c #E46060", +"U c #E46162", +"Y c #E66565", +"T c #E76666", +"R c #E66969", +"E c #E86D6D", +"W c #E87071", +"Q c #E97474", +"! c #EA7777", +"~ c #EB7979", +"^ c #EB7B7B", +"/ c #EC7B7A", +"( c #E89B51", +") c #E8DE59", +"_ c #EBDA62", +"` c #EED47B", +"' c #EBE964", +"] c #EFED70", +"[ c #968296", +"{ c #99869A", +"} c #BD9182", +"| c #9FB1BF", +" . c #EFE282", +".. c #EFEE8A", +"X. c #F3F39A", +"o. c #92AFC2", +"O. c #90B4CC", +"+. c #93B6CE", +"@. c #DFDFDF", +"#. c #F9F9C8", +"$. c #FCFCD0", +"%. c #F7F7DF", +"&. c #CADDEB", +"*. c #D1E2EE", +"=. c gray89", +"-. c gray90", +";. c #E7E7E7", +":. c #E5EFEC", +">. c gray91", +",. c #E9E9E9", +"<. c #EBE9E9", +"1. c #FCFCE7", +"2. c #ECF5F2", +"3. c gray95", +"4. c #F3F3F3", +"5. c #F4F4F4", +"6. c #F5F4F4", +"7. c #F4F5F5", +"8. c gray96", +"9. c #F6F5F5", +"0. c #F6F6F6", +"q. c gray97", +"w. c #F8F8F8", +"e. c #F9F9F9", +"r. c gray98", +"t. c #FBFBFB", +"y. c #FBFCFB", +"u. c gray99", +"i. c #FDFCFC", +"p. c #FDFCFD", +"a. c #FDFDFD", +"s. c #FEFDFD", +"d. c #FEFEFE", +/* pixels */ +"7 6 6 6 7 6 3 3 < < > > ; ; - - ", +"6 ^ ^ ^ ! Q W E R Y K G A V b & ", +"6 / K J J C C B N z k f s u c $ ", +"<.s.s.i.s.s.$.` .#.e.e.9.6.9.;.", +"<.s.s.s.s.1.] L ( ' %.9.9.4.9.;.", +",.s.y.s.y.X._ P } ) ..6.7.4.7.;.", +",.y.y.y.u.2.o.{ [ o.:.6.4.4.4.=.", +",.y.y.y.u.w.*.+.O.&.6.4.2.4.4.@.", +", Y m z h d i y w q 0 9 4 4 r . ", +", U H G n n c x z j g a a r r . ", +", > ; - = = & $ # @ @ O X X . X " +}; diff --git a/src/pixmaps/flags_xpm/pg.xpm b/src/pixmaps/flags_xpm/pg.xpm new file mode 100644 index 00000000..c55d5e73 --- /dev/null +++ b/src/pixmaps/flags_xpm/pg.xpm @@ -0,0 +1,157 @@ +/* XPM */ +static const char *pg[] = { +/* columns rows colors chars-per-pixel */ +"16 11 140 2", +" c black", +". c #181919", +"X c #1E1E1E", +"o c #211313", +"O c #232323", +"+ c gray14", +"@ c gray16", +"# c #2A2A2A", +"$ c gray18", +"% c #2F2F2F", +"& c #392F2F", +"* c #323232", +"= c #343434", +"- c #353535", +"; c #393939", +": c gray24", +"> c #4D0000", +", c #541F1F", +"< c #6F0000", +"1 c #6B2F2F", +"2 c #603B3B", +"3 c gray25", +"4 c gray26", +"5 c #444444", +"6 c gray27", +"7 c #464646", +"8 c #464B4B", +"9 c #494949", +"0 c #4B4A4B", +"q c #4B4B4B", +"w c #4C4C4C", +"e c #505050", +"r c gray33", +"t c #585858", +"y c gray36", +"u c #5D5D5D", +"i c #605F5F", +"p c #795C5C", +"a c #5B6161", +"s c #616162", +"d c gray39", +"f c gray40", +"g c #6A6A6A", +"h c #747474", +"j c #767676", +"k c #797979", +"l c gray48", +"z c #7B7B7A", +"x c #970F0E", +"c c #982A2A", +"v c #DD0000", +"b c #DF0000", +"n c #CD1919", +"m c #E30000", +"M c #E50000", +"N c #E70000", +"B c #E90000", +"V c #EB0000", +"C c #ED0000", +"Z c #EF0000", +"A c #F10000", +"S c #F30000", +"D c #F50000", +"F c #F70000", +"G c #F90000", +"H c #FB0000", +"J c #FD0000", +"K c red", +"L c #F00B0B", +"P c #F21010", +"I c #F21414", +"U c #F21714", +"Y c #F41F1F", +"T c #D82C2C", +"R c #CF3636", +"E c #F12424", +"W c #F52B26", +"Q c #F62B2B", +"! c #F22F2F", +"~ c #F62C2C", +"^ c #F33232", +"/ c #F73030", +"( c #F43636", +") c #F43B3B", +"_ c #F53F3F", +"` c #F3421A", +"' c #F37A19", +"] c #F85E36", +"[ c #F57625", +"{ c #F76931", +"} c #F9693C", +"| c #9B4646", +" . c #9E5C5C", +".. c #8D7B7B", +"X. c #D25151", +"o. c #F24241", +"O. c #F64444", +"+. c #FB4747", +"@. c #FB4B47", +"#. c #F74949", +"$. c #F74E4E", +"%. c #FC4B4B", +"&. c #FC4C4C", +"*. c #F85353", +"=. c #FD5151", +"-. c #F95757", +";. c #FD5454", +":. c #F35959", +">. c #FA635C", +",. c #D87B7B", +"<. c #FC6969", +"1. c #FD6D6D", +"2. c #FC7365", +"3. c #FD7071", +"4. c #FE7474", +"5. c #FE7777", +"6. c #FE7979", +"7. c #F4B61F", +"8. c #F58425", +"9. c #F49120", +"0. c #F79030", +"q. c #F6AA2B", +"w. c #F6BC2B", +"e. c #F8BC37", +"r. c #F9CA3C", +"t. c #F7DA31", +"y. c #F8DB36", +"u. c #F9D33D", +"i. c #FA8642", +"p. c #FA8942", +"a. c #FBAD60", +"s. c gray55", +"d. c #909090", +"f. c #9A9A9A", +"g. c #9B9D9D", +"h. c gray61", +"j. c gray69", +"k. c #B1B1B1", +"l. c #BCBDBD", +"z. c #C1C1C1", +/* pixels */ +"> N K K K K H K H F F F A A Z Z ", +" ..,.6.4.4.4.1.<.2.a.>.-.*.$.B ", +" k i .:.;.=.&.@.i.u.e.{ ~ #.B ", +" k y a p X.%.+.p.r.y.t.q.W O.N ", +" j t l.g.9 | o.} ] 0.w.[ 9._ N ", +" k z.r w k.8 2 R / Q 8.7.` ) N ", +" j f.w 6 j 4 = & c E Y ' U ( m ", +" g 9 6 6 h.= % # O , n U P ^ v ", +" f 5 j.s.= % # O X . o x L ! v ", +" d y d.d e w 6 4 : ; = * 1 T v ", +" < " +}; diff --git a/src/pixmaps/flags_xpm/ph.xpm b/src/pixmaps/flags_xpm/ph.xpm new file mode 100644 index 00000000..ad984654 --- /dev/null +++ b/src/pixmaps/flags_xpm/ph.xpm @@ -0,0 +1,174 @@ +/* XPM */ +static const char *ph[] = { +/* columns rows colors chars-per-pixel */ +"16 11 157 2", +" c black", +". c #000035", +"X c #00003B", +"o c #000041", +"O c #000047", +"+ c #00004D", +"@ c #000053", +"# c #000059", +"$ c #00005D", +"% c #000063", +"& c #000069", +"* c #00006D", +"= c #000073", +"- c #000075", +"; c #000079", +": c #00007D", +"> c #00007F", +", c #5F1A73", +"< c #631F77", +"1 c #67257B", +"2 c #6C2B7E", +"3 c #DD0000", +"4 c #DF0000", +"5 c #E10000", +"6 c #E30000", +"7 c #E50000", +"8 c #E70000", +"9 c #E90000", +"0 c #EB0000", +"q c #ED0000", +"w c #EF0000", +"e c #F10000", +"r c #F30000", +"t c #F10B0B", +"y c #F10F0E", +"u c #F21010", +"i c #F21313", +"p c #F21414", +"a c #F31919", +"s c #F41E1E", +"d c #F41F1F", +"f c #F52323", +"g c #F52424", +"h c #F62929", +"j c #F62A2A", +"k c #F22C2C", +"l c #F22F2F", +"z c #F72E2E", +"x c #F72F2F", +"c c #F23232", +"v c #F33232", +"b c #F33535", +"n c #F43636", +"m c #F83434", +"M c #F83535", +"N c #F43939", +"B c #F53D3D", +"V c #F64242", +"C c #F74646", +"Z c #F94445", +"A c #F74B4B", +"S c #F85050", +"D c #F95455", +"F c #F95858", +"G c #F96566", +"H c #EFEF1A", +"J c #FFFF37", +"K c #F59B49", +"L c #FDFD53", +"P c #FCFC5D", +"I c #FAFA6B", +"U c #FEFE73", +"Y c #FCFC77", +"T c #FDFD7E", +"R c #000081", +"E c #00008D", +"W c #20209F", +"Q c #2525A2", +"! c #2626A2", +"~ c #2B2BA5", +"^ c #2C2CA6", +"/ c #3030A8", +"( c #3131A8", +") c #3131A9", +"_ c #3636AB", +"` c #3737AB", +"' c #3B3BAE", +"] c #3F3FAD", +"[ c #3C3CAE", +"{ c #3D3CAE", +"} c #703082", +"| c #743685", +" . c #753B88", +".. c #4444AF", +"X. c #4141B0", +"o. c #4241B0", +"O. c #4242B1", +"+. c #4747B3", +"@. c #4747B4", +"#. c #4949B1", +"$. c #4B4BB6", +"%. c #4E4EB4", +"&. c #4C4CB6", +"*. c #5151B7", +"=. c #5353B7", +"-. c #5454B7", +";. c #5857B9", +":. c #5C5CBB", +">. c #5E5EBD", +",. c #6160BE", +"<. c #6565C0", +"1. c #6969C2", +"2. c #6D6DC3", +"3. c #7777C3", +"4. c #7171C4", +"5. c #7070C5", +"6. c #7474C7", +"7. c #7777C8", +"8. c #7979C9", +"9. c #A68D96", +"0. c #ADAD97", +"q. c #F9958D", +"w. c #FA8F91", +"e. c #FAAAAD", +"r. c #FBFC8D", +"t. c #FEFEB9", +"y. c #9F9FDA", +"u. c #B2B2E2", +"i. c #FAD1CB", +"p. c #FBEAC1", +"a. c #FCFCC9", +"s. c #EDEDD3", +"d. c #FBFBD3", +"f. c #FDFDD5", +"g. c #FEFED8", +"h. c #FEFEDC", +"j. c #D2D2E7", +"k. c #FBFBE3", +"l. c #FEFEE7", +"z. c #F1F1E8", +"x. c #F5F5E8", +"c. c #F7F7E9", +"v. c #FDFCEA", +"b. c #FBFBEC", +"n. c #F3F3F3", +"m. c #F5F5F3", +"M. c gray96", +"N. c gray97", +"B. c #FAF2F2", +"V. c #FCFCF1", +"C. c #FEFEF5", +"Z. c #F0F0F8", +"A. c #FBFBF9", +"S. c gray98", +"D. c gray99", +"F. c #FCFCFE", +"G. c gray100", +/* pixels */ +"0.E R R > > - - - * & % $ # @ + ", +"J s.y.8.7.6.4.2.1.<.,.:.;.*.%.O ", +"c.F.F.u.>.-.*.&.@.o.{ ` ) ^ #.o ", +"N.C.h.l.j.4.&.+.o.[ ` ) ^ ! ..X ", +"N.f.U T v.Z.3.o.' ` ( ^ ! W { . ", +"c.t.L P a.A.I 9.| } 2 1 < , . ", +"m.f.Y r.b.B.q.n x j g d a p n 7 ", +"n.V.d.k.i.G m x j g d a p u v 4 ", +"z.F.A.e.Z M x j f s a i y t l 4 ", +"H p.w.F D A A C V B N b c l k 3 ", +"K r e q q q 9 9 7 7 6 6 4 3 3 3 " +}; diff --git a/src/pixmaps/flags_xpm/pk.xpm b/src/pixmaps/flags_xpm/pk.xpm new file mode 100644 index 00000000..714db79f --- /dev/null +++ b/src/pixmaps/flags_xpm/pk.xpm @@ -0,0 +1,162 @@ +/* XPM */ +static const char *pk[] = { +/* columns rows colors chars-per-pixel */ +"16 11 145 2", +" c #002100", +". c #002300", +"X c #002500", +"o c #002900", +"O c #002B00", +"+ c #002D00", +"@ c #002F00", +"# c #003300", +"$ c #003500", +"% c #003900", +"& c #003B00", +"* c #003F00", +"= c #004300", +"- c #004500", +"; c #004700", +": c #004900", +"> c #005700", +", c #005B00", +"< c #006100", +"1 c #006700", +"2 c #006B00", +"3 c #007100", +"4 c #007300", +"5 c #007700", +"6 c #007B00", +"7 c #007D00", +"8 c #008900", +"9 c #0B900B", +"0 c #139313", +"q c #159715", +"w c #1A991A", +"e c #1F981F", +"r c #1E9A1E", +"t c #209A20", +"y c #249A24", +"u c #269E26", +"i c #2A9B2A", +"p c #2C9F2C", +"a c #2F9D2F", +"s c #2BA02A", +"d c #2AA12B", +"f c #2CA22C", +"g c #2FA02F", +"h c #2EA32E", +"j c #30A230", +"k c #32A232", +"l c #33A332", +"z c #31A431", +"x c #35A235", +"c c #34A434", +"v c #34A534", +"b c #36A536", +"n c #37A637", +"m c #3CA73C", +"M c #3DA73D", +"N c #3EA73E", +"B c #3AA83A", +"V c #3BA83B", +"C c #3DAB3D", +"Z c #3FA93F", +"A c #42A742", +"S c #40AA40", +"D c #41AC41", +"F c #46AB46", +"G c #44AC44", +"H c #45AD45", +"J c #45AE45", +"K c #46AD46", +"L c #46AE46", +"P c #49AE49", +"I c #4AAD4A", +"U c #4BB04A", +"Y c #4BB04B", +"T c #4EB14E", +"R c #57AF57", +"E c #50B150", +"W c #50B350", +"Q c #53B353", +"! c #50B450", +"~ c #51B451", +"^ c #54B654", +"/ c #55B655", +"( c #58B657", +") c #5CB45C", +"_ c #5DB75D", +"` c #5AB95A", +"' c #5CB95C", +"] c #5EB95E", +"[ c #5EBB5E", +"{ c #5FB960", +"} c #61BB60", +"| c #62BD62", +" . c #65BE65", +".. c #69BE69", +"X. c #6DB96D", +"o. c #6BBF6C", +"O. c #6DC16D", +"+. c #70C371", +"@. c #74C374", +"#. c #7CC47B", +"$. c #7FC87F", +"%. c #87C687", +"&. c #85C985", +"*. c #90CA90", +"=. c #92CE92", +"-. c #94CC94", +";. c #A3D3A3", +":. c #A7D3A7", +">. c #A6D4A6", +",. c #A7D6A7", +"<. c #ACD6AC", +"1. c #ACD7AC", +"2. c #BBDFBB", +"3. c #D0E4D0", +"4. c #D5E8D5", +"5. c #DBE7DB", +"6. c #DCEADC", +"7. c #E3EBE3", +"8. c #E1EFE1", +"9. c #E5EDE5", +"0. c #E7EFE7", +"q. c #E5F3E5", +"w. c #E9F1E9", +"e. c #EAF2EA", +"r. c #EBF3EB", +"t. c #EDF3ED", +"y. c #EDF5EF", +"u. c #EFF4EF", +"i. c #EFF5EF", +"p. c #EFF7EF", +"a. c #F0F5F0", +"s. c #F0F6F0", +"d. c #F1F7F1", +"f. c #F1F9F1", +"g. c #F2F8F2", +"h. c #F3F9F3", +"j. c #F4F9F4", +"k. c #F5FAF5", +"l. c #F7FCF7", +"z. c gray98", +"x. c #FBFBFB", +"c. c gray99", +"v. c #FDFDFD", +"b. c #FEFEFE", +"n. c gray100", +/* pixels */ +"f.f.f.q.8 7 6 5 4 4 2 1 < , > , ", +"f.n.n.l.$.@.+.O... .} [ ( Q T : ", +"p.n.n.j.| / ~ W o.K C c z f I = ", +"f.n.n.j.[ ~ Y 2.,.M S 1.I u K * ", +"f.n.n.d.` I &.8.{ b _ 4.,.e C $ ", +"p.n.n.f./ K =.w.G l f ( M w C $ ", +"t.c.c.d.W S #.d.;.i y e e q b + ", +"t.c.x.s.Y B c 1.u.-.%.:.R 0 l O ", +"w.x.x.u.K v g f *.3.6.X.a 9 g X ", +"w.x.x.d.[ T Y K A Z m b l a p ", +"0.0.8.5., - - * % $ + + O X + " +}; diff --git a/src/pixmaps/flags_xpm/pl.xpm b/src/pixmaps/flags_xpm/pl.xpm new file mode 100644 index 00000000..b28f7685 --- /dev/null +++ b/src/pixmaps/flags_xpm/pl.xpm @@ -0,0 +1,123 @@ +/* XPM */ +static const char *pl[] = { +/* columns rows colors chars-per-pixel */ +"16 11 106 2", +" c #DD0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #ED0000", +"% c #EF0000", +"& c #F10000", +"* c #F30000", +"= c #F50000", +"- c #F70000", +"; c #F90000", +": c #FB0000", +"> c #FD0000", +", c #F10B0B", +"< c #F10F0E", +"1 c #F21010", +"2 c #F21313", +"3 c #F21414", +"4 c #F31919", +"5 c #F41E1E", +"6 c #F41F1F", +"7 c #F52323", +"8 c #F52424", +"9 c #F62929", +"0 c #F62A2A", +"q c #F22C2C", +"w c #F22F2F", +"e c #F72E2E", +"r c #F72F2F", +"t c #F23232", +"y c #F33232", +"u c #F33535", +"i c #F43636", +"p c #F83434", +"a c #F83535", +"s c #F43939", +"d c #F53D3D", +"f c #F93A3A", +"g c #F93B3A", +"h c #FA3F3F", +"j c #F64242", +"k c #F34444", +"l c #F74646", +"z c #FA4040", +"x c #FA4444", +"c c #FB4545", +"v c #F44848", +"b c #F74B4B", +"n c #F54D4D", +"m c #FB4949", +"M c #FB4A49", +"N c #FC4F4F", +"B c #F65252", +"V c #F75657", +"C c #F85050", +"Z c #F95455", +"A c #F45F5F", +"S c #F95858", +"D c #F85B5B", +"F c #FA5D5D", +"G c #F96060", +"H c #FB6162", +"J c #FA6464", +"K c #FC6666", +"L c #FB6868", +"P c #FC6A6A", +"I c #FC6C6C", +"U c #FD6F6F", +"Y c #FC7070", +"T c #FD7474", +"R c #FE8E8E", +"E c #E7D5D5", +"W c #E7D7D7", +"Q c #E9D9D9", +"! c #EBDDDD", +"~ c #EDDFDF", +"^ c #EFE1E1", +"/ c #F1E3E3", +"( c #F3E5E5", +") c #F5E7E7", +"_ c #F7E9E9", +"` c #F9EBEB", +"' c #FBEDED", +"] c #FDEDED", +"[ c #FDEFEF", +"{ c #FDEFF1", +"} c #F4F4F4", +"| c gray96", +" . c #F6F6F6", +".. c gray97", +"X. c #FDF1F1", +"o. c #FFF1F1", +"O. c #F8F8F8", +"+. c #F9F9F9", +"@. c gray98", +"#. c #FBFBFB", +"$. c gray99", +"%. c #FDFCFD", +"&. c #FDFDFD", +"*. c #FDFDFE", +"=. c #FEFEFE", +"-. c gray100", +/* pixels */ +"o.o.o.o.[ { [ [ ` ` _ ) ( ^ ^ ~ ", +"o.-.-.-.-.-.*.*.$.#.#.#.#.....! ", +"[ -.-.-.-.$.-.$.#.#...........Q ", +"o.-.#.-.#.-.#.#.#.#.....} ....W ", +"o.-.-.-.$.#.$.#.#.......} } } E ", +": R T Y I L J F D V B n l l A X ", +"> U N M c z f i r 9 8 6 4 3 u X ", +": L M c h f p r 9 8 6 4 3 1 y . ", +": J c h f a r 9 8 5 4 1 1 , w . ", +"- H F S Z n b l j d s i y w w . ", +"- & % % % % @ @ O O X X . " +}; diff --git a/src/pixmaps/flags_xpm/pm.xpm b/src/pixmaps/flags_xpm/pm.xpm new file mode 100644 index 00000000..cb3064dc --- /dev/null +++ b/src/pixmaps/flags_xpm/pm.xpm @@ -0,0 +1,186 @@ +/* XPM */ +static const char *pm[] = { +/* columns rows colors chars-per-pixel */ +"16 11 169 2", +" c #000011", +". c #000017", +"X c #00001B", +"o c #00001D", +"O c #000027", +"+ c #000029", +"@ c #00002B", +"# c #000031", +"$ c #000033", +"% c #000035", +"& c #000039", +"* c #00003D", +"= c #154F0D", +"- c #256300", +"; c #2F6D03", +": c #000041", +"> c #000045", +", c #000047", +"< c #000049", +"1 c #00004D", +"2 c #00005D", +"3 c #00005F", +"4 c #000061", +"5 c #000063", +"6 c #000065", +"7 c #000067", +"8 c #00006F", +"9 c #000077", +"0 c #00007B", +"q c #6C6353", +"w c #776D5D", +"e c #615960", +"r c #615C71", +"t c #6B6270", +"y c #6A6474", +"u c #696476", +"i c #796F71", +"p c #990000", +"a c #D70000", +"s c #D90000", +"d c #E30000", +"f c #E70000", +"g c #E90000", +"h c #817358", +"j c #827B70", +"k c #D14D5C", +"l c #D25664", +"z c #D66571", +"x c #F16961", +"c c #EB7D6B", +"v c #EF7F6B", +"b c #B7A02A", +"n c #BCA629", +"m c #B4A034", +"M c #B8A336", +"N c #BBA639", +"B c #BBAA3D", +"V c #C2A91D", +"C c #C3AC23", +"Z c #CBB728", +"A c #C0AF36", +"S c #C6AF37", +"D c #C6B338", +"F c #D1BD38", +"G c #D8C438", +"H c #DECA3A", +"J c #E3CC27", +"K c #EED82B", +"L c #E3CC32", +"P c #E3CE34", +"I c #E7D339", +"U c #E7D33F", +"Y c #F1DB36", +"T c #9B8F5A", +"R c #BEAE42", +"E c #BFAF47", +"W c #BFAF50", +"Q c #BDAD53", +"! c #BFAE56", +"~ c #928B7F", +"^ c #9A9176", +"/ c #A49967", +"( c #E08244", +") c #CCB845", +"_ c #C0B14D", +"` c #C1AF52", +"' c #C5B551", +"] c #C2B258", +"[ c #CFBF58", +"{ c #D89E68", +"} c #E48C60", +"| c #F1816D", +" . c #F2887F", +".. c #DBA366", +"X. c #C8BB72", +"o. c #E4D144", +"O. c #E6D44F", +"+. c #E6D554", +"@. c #E1D059", +"#. c #D6C764", +"$. c #DED173", +"%. c #E2D57A", +"&. c #000083", +"*. c #000085", +"=. c #00008D", +"-. c #35379F", +";. c #3C3F9D", +":. c #3334A4", +">. c #3332AE", +",. c #3638AD", +"<. c #3B3FB2", +"1. c #404198", +"2. c #44459C", +"3. c #4B4C9B", +"4. c #4E4C9E", +"5. c #52529F", +"6. c #615C8A", +"7. c #696690", +"8. c #6D6C9C", +"9. c #4143A3", +"0. c #484AA3", +"q. c #4C4FA9", +"w. c #4E50A3", +"e. c #5A5AA1", +"r. c #5A5AA4", +"t. c #5556A8", +"y. c #5657A9", +"u. c #5355AF", +"i. c #4042B4", +"p. c #4A4CB0", +"a. c #4D4DB0", +"s. c #4A4CB8", +"d. c #504FB7", +"f. c #4C50B8", +"g. c #4F53B8", +"h. c #5759B3", +"j. c #575BB3", +"k. c #595DB6", +"l. c #5151BD", +"z. c #5455BC", +"x. c #5458BC", +"c. c #595ABE", +"v. c #7B7AA8", +"b. c #7878AE", +"n. c #7575BA", +"m. c #7577C7", +"M. c #7778C8", +"N. c #7F80BE", +"B. c #898381", +"V. c #83A281", +"C. c #F2B9B3", +"Z. c #F7BDB3", +"A. c #C9D3D7", +"S. c #D7D3D3", +"D. c #F5C6C1", +"F. c #FACAC1", +"G. c #DBE0E6", +"H. c #DDE1E7", +"J. c #DDE3E8", +"K. c #E1E0E0", +"L. c #E0E0E1", +"P. c #E1E3E3", +"I. c #E2E1E5", +"U. c #E7E5E6", +"Y. c #E7E7E7", +"T. c #E7E8E6", +"R. c #E8E8E5", +"E. c #EEEAE7", +"W. c #E8E7E8", +/* pixels */ +"- | c = =.*.&.9 0 7 7 8 3 5 3 3 ", +"| W.Y.D.M.M.N.%.n.%.b.v.X.j.g.1 ", +"v Y.K.C.c.z.#.@.t.[ 7.4.` 1.s., ", +"; F.Z.V.l.l.+.O.^ o._ 6.G y r., ", +"S.Y.E.I.d.s.8.B.o.I _ K _ t ` , ", +"K.L.U.K.a.~ t./ Y P E J N h Q > ", +"A.S.K.K.q.] ` ) j T u r w n 3.* ", +"g C.x k i.5.P L F D A Z C e >.@ ", +"g ..( k <.,.i S N M m b V q :.+ ", +"d { } z k.j.u.y.w.w.0.9.2.;.:.o ", +"f a s p , * * # % + + O . X X " +}; diff --git a/src/pixmaps/flags_xpm/pn.xpm b/src/pixmaps/flags_xpm/pn.xpm new file mode 100644 index 00000000..318b44d2 --- /dev/null +++ b/src/pixmaps/flags_xpm/pn.xpm @@ -0,0 +1,178 @@ +/* XPM */ +static const char *pn[] = { +/* columns rows colors chars-per-pixel */ +"16 11 161 2", +" c #000025", +". c #000027", +"X c #00002B", +"o c #00002D", +"O c #00002F", +"+ c #000033", +"@ c #000035", +"# c #000039", +"$ c #00003B", +"% c #000041", +"& c #000045", +"* c #000047", +"= c #00004B", +"- c #00004D", +"; c #000053", +": c #000057", +"> c #00005D", +", c #000063", +"< c #000067", +"1 c #00006D", +"2 c #000073", +"3 c #000077", +"4 c #31497D", +"5 c #335075", +"6 c #477250", +"7 c #4B7553", +"8 c #4B7555", +"9 c #4F7857", +"0 c #507958", +"q c #547C5C", +"w c #617348", +"e c #6A7351", +"r c #5A7674", +"t c #C46A79", +"y c #D5677F", +"u c #ED6567", +"i c #ED6771", +"p c #FD7373", +"a c #66815A", +"s c #75825F", +"d c #77AC5E", +"f c #598060", +"g c #7C8964", +"h c #7C8C7D", +"j c #7AA975", +"k c #ACB923", +"l c #BCBF40", +"z c #ABB460", +"x c #000081", +"c c #2946A4", +"v c #2E4AA6", +"b c #314CA3", +"n c #3750A5", +"m c #3650A6", +"M c #3651A6", +"N c #3953A0", +"B c #3955A1", +"V c #3654AC", +"C c #3B54A9", +"Z c #3A55AB", +"A c #3C55A9", +"S c #3C56A9", +"D c #415A98", +"F c #446382", +"G c #496986", +"H c #4F6899", +"J c #506597", +"K c #5D6E9F", +"L c #4057A3", +"P c #4059A1", +"I c #405EA3", +"U c #435BA4", +"Y c #465DAB", +"T c #4159AC", +"R c #415AAC", +"E c #405AAD", +"W c #465EAE", +"Q c #465EAF", +"! c #5953B9", +"~ c #7F5DAB", +"^ c #4D64A1", +"/ c #4E64A9", +"( c #4860AE", +") c #4C65AF", +"_ c #5467A7", +"` c #546EAE", +"' c #4A62B1", +"] c #4C63B1", +"[ c #4D66B2", +"{ c #4966B6", +"} c #4F67B4", +"| c #4D6AB9", +" . c #5068B2", +".. c #556CB4", +"X. c #546CB7", +"o. c #586EB7", +"O. c #5A6FB7", +"+. c #596FB8", +"@. c #5C72BB", +"#. c #5E74B9", +"$. c #7B69BF", +"%. c #6276B6", +"&. c #667BB7", +"*. c #6277BB", +"=. c #667BBE", +"-. c #7976B9", +";. c #1B39C7", +":. c #3B5DDB", +">. c #5F71DF", +",. c #6361CB", +"<. c #6A7FC0", +"1. c #697DC2", +"2. c #516FE7", +"3. c #4F71E7", +"4. c #AE6185", +"5. c #C16481", +"6. c #C36387", +"7. c #CC6E84", +"8. c #659486", +"9. c #6DA092", +"0. c #6E82C2", +"q. c #6F83C2", +"w. c #7387C4", +"e. c #7389C7", +"r. c #7782CE", +"t. c #878D9E", +"y. c #8E9393", +"u. c #FE8986", +"i. c #F89597", +"p. c #FE9897", +"a. c #F79999", +"s. c #FEA19E", +"d. c #FDA29F", +"f. c #DB9EAB", +"g. c #DDA2B4", +"h. c #FDA9A4", +"j. c #F0A2AB", +"k. c #EAB1BB", +"l. c #EAB8BE", +"z. c #F5B3B6", +"x. c #9B8ECA", +"c. c #A298CF", +"v. c #8492E1", +"b. c #889AE6", +"n. c #99A4E8", +"m. c #9BB0ED", +"M. c #B5B3E3", +"N. c #AEBFF5", +"B. c #CAB5D7", +"V. c #FDCECE", +"C. c #FED0D1", +"Z. c #FCD8D5", +"A. c #D7CEE8", +"S. c #D6CFE8", +"D. c #CED3F3", +"F. c #CED7F7", +"G. c #FEE1E0", +"H. c #FAE2E4", +"J. c #F0E0E8", +"K. c #F7E5E9", +"L. c #FFEEEE", +/* pixels */ +",.a.>.$.u :.~ 6.;.3 1 < , > : ; ", +"2.F.L.A.Z.A.J.N.n.0.1.&.%.@.o.= ", +"i H.V.s.u.h.z.j.5.[ _ H t.B ` & ", +"y K.C.p.p s.k.g.4./ d r y.s j % ", +"3.D.G.B.i.M.f.m.r.I G e w a K $ ", +"! l.b.c.7.v.x.t -.A D f 8.0 ^ @ ", +"x e.+.| { ] E V Z B F q 9.8 J O ", +"3 w.X.} ] Q E A M v l 9 7 6 z X ", +"2 w.} ' W R A n b c g 5 k 4 h ", +"1 1.=.*.%.o.X. .) ( Y U U B n ", +"< , > : ; - & % $ $ + X O " +}; diff --git a/src/pixmaps/flags_xpm/pr.xpm b/src/pixmaps/flags_xpm/pr.xpm new file mode 100644 index 00000000..1a18bffd --- /dev/null +++ b/src/pixmaps/flags_xpm/pr.xpm @@ -0,0 +1,173 @@ +/* XPM */ +static const char *pr[] = { +/* columns rows colors chars-per-pixel */ +"16 11 156 2", +" c #810000", +". c #830000", +"X c #850000", +"o c #870000", +"O c #890000", +"+ c #8D0000", +"@ c #8F0000", +"# c #910000", +"$ c #970000", +"% c #9B0000", +"& c #9D0000", +"* c #9F0000", +"= c #A10000", +"- c #A50000", +"; c #A70000", +": c #A90000", +"> c #AB0000", +", c #AD0000", +"< c #A30009", +"1 c #B10000", +"2 c #B50000", +"3 c #B90000", +"4 c #BB0000", +"5 c #BD0000", +"6 c #BF0000", +"7 c #C10000", +"8 c #C70000", +"9 c #CF0000", +"0 c #C31A1A", +"q c #C51F1F", +"w c #C72525", +"e c #C92B2B", +"r c #CB3030", +"t c #CB3333", +"y c #CD3536", +"u c #CE3639", +"i c #CB3B3B", +"p c #CE3939", +"a c #D13030", +"s c #D13C3C", +"d c #D03D3D", +"f c #D14141", +"g c #D34141", +"h c #D34545", +"j c #D44646", +"k c #D44A4A", +"l c #D64B4B", +"z c #D64E4E", +"x c #D35353", +"c c #D75252", +"v c #D55656", +"b c #D85050", +"n c #D85353", +"m c #D95557", +"M c #D85656", +"N c #DF5D57", +"B c #D75858", +"V c #D65A5A", +"C c #DA5B5B", +"Z c #D85E5E", +"A c #CC5A6D", +"S c #D95D62", +"D c #DA6363", +"F c #DC6060", +"G c #DD6464", +"H c #DB6768", +"J c #D86B6B", +"K c #DE6868", +"L c #DF6C6C", +"P c #D86B73", +"I c #E16F6F", +"U c #E27374", +"Y c #E37776", +"T c #E87E79", +"R c #0000D5", +"E c #0000D9", +"W c #0000F7", +"Q c #0000F9", +"! c #0000FB", +"~ c #0000FD", +"^ c blue", +"/ c #4040FA", +"( c #4444FA", +") c #4545FB", +"_ c #4946FB", +"` c #4A46FB", +"' c #4949FB", +"] c #4D4EFA", +"[ c #4B4BFC", +"{ c #5451FC", +"} c #5859FE", +"| c #5F5DFD", +" . c #5F5FFE", +".. c #6851E0", +"X. c #5D60FD", +"o. c #7F6BE8", +"O. c #6D61F0", +"+. c #6866FC", +"@. c #6C68FE", +"#. c #706AFC", +"$. c #7874FB", +"%. c #7979FE", +"&. c #7E7AFD", +"*. c #7D7BFF", +"=. c #9C3D83", +"-. c #A45FA3", +";. c #A45DA7", +":. c #AA68AA", +">. c #B77BB8", +",. c #E37D80", +"<. c #857BF5", +"1. c #D9BFBF", +"2. c #8F8FFE", +"3. c #918DFD", +"4. c #D9C9C9", +"5. c #E5CDCD", +"6. c #E3D1D1", +"7. c #C2C0FC", +"8. c #C5C3FE", +"9. c #D2D1FE", +"0. c #D8D9F9", +"q. c #DDDBFC", +"w. c #DFDFFD", +"e. c #E9DDEC", +"r. c #F0ECEC", +"t. c #F1EDED", +"y. c #F1EEEE", +"u. c #F2EEEE", +"i. c #F0E6F2", +"p. c #F3F0F0", +"a. c gray95", +"s. c #F3F3F3", +"d. c #F4F1F1", +"f. c #F6F3F3", +"g. c #F4F4F4", +"h. c gray96", +"j. c #F6F5F5", +"k. c #F6F6F6", +"l. c #F7F6F6", +"z. c #F7F7F6", +"x. c gray97", +"c. c #F8F4F4", +"v. c #F9F5F5", +"b. c #FAF6F6", +"n. c #FAF7F7", +"m. c #F8F8F7", +"M. c #F5F7F8", +"N. c #F8F8F8", +"B. c #F9F9F9", +"V. c #FBF8F8", +"C. c gray98", +"Z. c #FBFBFB", +"A. c #FCF8F8", +"S. c #FDFAF9", +"D. c #F9FAFC", +"F. c #FBFBFD", +/* pixels */ +"E < 9 8 7 7 5 4 4 2 2 , , : - - ", +"^ <.>.,.T Y U I L K G F C M c = ", +"^ *. .o.i.m.A.Z.n.n.x.f.x.f.f.5.", +"^ %.@.} | w.Z.Z.Z.N.n.x.x.x.x.6.", +"^ 2.9.3. .' :.A M b l h d d B & ", +"! 8.Z.q.{ ` / =.u a e w q 0 i . ", +"^ &.7.$.` / -.P H D Z V v x J = ", +"! #.' ) ] 0.M.x.x.x.s.s.s.s.s.4.", +"! +.) ..e.x.x.x.u.p.u.u.u.r.r.1.", +"W O.;.S N c z k h f d p y t r . ", +"R . 4 : & = % $ # @ @ o o . . o " +}; diff --git a/src/pixmaps/flags_xpm/ps.xpm b/src/pixmaps/flags_xpm/ps.xpm new file mode 100644 index 00000000..281f7507 --- /dev/null +++ b/src/pixmaps/flags_xpm/ps.xpm @@ -0,0 +1,131 @@ +/* XPM */ +static const char *ps[] = { +/* columns rows colors chars-per-pixel */ +"16 11 114 2", +" c black", +". c #002900", +"X c #002D00", +"o c #002F00", +"O c #003300", +"+ c #003900", +"@ c #003D00", +"# c #2C2C2C", +"$ c #313131", +"% c #373737", +"& c #3D3C3D", +"* c #004100", +"= c #004700", +"- c #004D00", +"; c #005100", +": c #005700", +"> c #005D00", +", c #006300", +"< c gray26", +"1 c gray28", +"2 c #494949", +"3 c #4C4C4C", +"4 c #4E4E4E", +"5 c #515151", +"6 c #535353", +"7 c gray33", +"8 c #585757", +"9 c gray36", +"0 c #635959", +"q c #616060", +"w c #656565", +"e c DimGray", +"r c #6D6D6D", +"t c #707071", +"y c #747474", +"u c #777777", +"i c #797979", +"p c #890000", +"a c #9B0000", +"s c #F70000", +"d c #F90000", +"f c #FB0000", +"g c #FD0000", +"h c red", +"j c #B5693F", +"k c #DC513F", +"l c #BC5C5C", +"z c #A47B7B", +"x c #DD5454", +"c c #FA4040", +"v c #FA4444", +"b c #FB4545", +"n c #FB4646", +"m c #FA4449", +"M c #FB4949", +"N c #FC4A4B", +"B c #FB4E4E", +"V c #FD4F50", +"C c #FC5555", +"Z c #FD5757", +"A c #FE5959", +"S c #FE5C5C", +"D c #FE5F5F", +"F c #E86C62", +"G c #FC6666", +"H c #FC6A6A", +"J c #FD6F6F", +"K c #EB7B7B", +"L c #FE7979", +"P c #FF7B7A", +"I c #189A19", +"U c #1C9C1C", +"Y c #219F21", +"T c #25A126", +"R c #2AA32A", +"E c #30A630", +"W c #35A935", +"Q c #38A738", +"! c #3AA83A", +"~ c #3BA93B", +"^ c #3AAC3A", +"/ c #3DA93D", +"( c #40AC40", +") c #40AE40", +"_ c #45AE44", +"` c #48AF48", +"' c #45B145", +"] c #4CB24C", +"[ c #50B450", +"{ c #55B655", +"} c #5AB95A", +"| c #5EBB5E", +" . c #62BE62", +".. c #949B5D", +"X. c #F98889", +"o. c #F98E91", +"O. c #FB9E9E", +"+. c #FD9C9F", +"@. c gray81", +"#. c gray82", +"$. c #D5D5D5", +"%. c #D7D7D7", +"&. c gray95", +"*. c #F3F3F3", +"=. c #F4F4F4", +"-. c #F4F5F5", +";. c gray96", +":. c #F6F6F6", +">. c gray97", +",. c #F8F8F8", +"<. c #F9F9F9", +"1. c gray98", +"2. c #FBFBFB", +"3. c gray99", +/* pixels */ +"a ", +"h K z i u y t r e w 0 9 9 6 4 ", +"h L D l 0 7 5 3 1 < & % $ # 2 ", +"h L D A x +.3.1.1.1.,.>.>.>.>.%.", +"h J S Z V Z O.1.1.>.>.>.*.=.>.$.", +"h J S V M n c X.>.>.-.>.*.*.-.@.", +"f J B B n m o.,.>.>.=.*.*.*.=.#.", +"f H M n k o.,.>.>.=.*.*.*.*.*.@.", +"f G n j ' ( ^ W R R T Y U I ~ X ", +"s F .. .| } { [ ] ` _ ( / / Q . ", +"p ; , > : ; - = * @ + O X X . . " +}; diff --git a/src/pixmaps/flags_xpm/pt.xpm b/src/pixmaps/flags_xpm/pt.xpm new file mode 100644 index 00000000..e838db88 --- /dev/null +++ b/src/pixmaps/flags_xpm/pt.xpm @@ -0,0 +1,161 @@ +/* XPM */ +static const char *pt[] = { +/* columns rows colors chars-per-pixel */ +"16 11 144 2", +" c #000B00", +". c #000D00", +"X c #001300", +"o c #001900", +"O c #002100", +"+ c #002B00", +"@ c #003300", +"# c #003500", +"$ c #003B00", +"% c #003F00", +"& c #004500", +"* c #004B00", +"= c #004D00", +"- c #004F00", +"; c #005900", +": c #DD0000", +"> c #DF0000", +", c #E10000", +"< c #E30000", +"1 c #E50000", +"2 c #E70000", +"3 c #E90000", +"4 c #EB0000", +"5 c #ED0000", +"6 c #EF0000", +"7 c #F10000", +"8 c #F30000", +"9 c #F50000", +"0 c #F70000", +"q c #F90000", +"w c #FB0000", +"e c #FD0000", +"r c #F10B0B", +"t c #F10F0E", +"y c #F21010", +"u c #F21313", +"i c #F21414", +"p c #F31919", +"a c #F31A1A", +"s c #F41E1E", +"d c #F41F1F", +"f c #F42020", +"g c #F52323", +"h c #F52424", +"j c #F52525", +"k c #F52626", +"l c #F62B2B", +"z c #F32F2A", +"x c #F22C2C", +"c c #F22F2F", +"v c #F62C2C", +"b c #F72E2E", +"n c #F33529", +"m c #F23232", +"M c #F33232", +"N c #F73030", +"B c #F73131", +"V c #F33535", +"C c #F43636", +"Z c #F83736", +"A c #F83737", +"S c #F53C36", +"D c #F43939", +"F c #F43B3B", +"G c #F53D3D", +"H c #F53F3F", +"J c #F93C3C", +"K c #F93C3D", +"L c #F04130", +"P c #EA692A", +"I c #F64242", +"U c #F64444", +"Y c #F74646", +"T c #FA4242", +"R c #F74949", +"E c #F74B4B", +"W c #F74E4E", +"Q c #FB5347", +"! c #F85353", +"~ c #F95757", +"^ c #FA5C5C", +"/ c #F4674C", +"( c #E8764B", +") c #EF7051", +"_ c #ED765B", +"` c #E77858", +"' c #FB6060", +"] c #FC6565", +"[ c #FC6969", +"{ c #FD6D6D", +"} c #E67860", +"| c #FD7071", +" . c #3A843A", +".. c #3F8A3F", +"X. c #419134", +"o. c #448E44", +"O. c #499149", +"+. c #4F944F", +"@. c #539145", +"#. c #509550", +"$. c #539653", +"%. c #549655", +"&. c #589958", +"*. c #5C9D5C", +"=. c #5D9D5D", +"-. c #5F9F5F", +";. c #69A25C", +":. c #619F62", +">. c #66A366", +",. c #6AA56A", +"<. c #6FA86F", +"1. c #72AA73", +"2. c #74AE74", +"3. c #76AD76", +"4. c #77AD77", +"5. c #79AE79", +"6. c #7BB07A", +"7. c #7BB07B", +"8. c #E7A332", +"9. c #E9AF37", +"0. c #EEBA36", +"q. c #F0B83D", +"w. c #D9C23C", +"e. c #E0C830", +"r. c #E1C939", +"t. c #9AB349", +"y. c #9BB559", +"u. c #ADBB40", +"i. c #BFB946", +"p. c #F18151", +"a. c #F3AB47", +"s. c #F5AC4C", +"d. c #EFB142", +"f. c #EA8376", +"g. c #CEC84F", +"h. c #C7C854", +"j. c #CAC854", +"k. c #DAD359", +"l. c #E9CC55", +"z. c #F9C151", +"x. c #E6D0D4", +"c. c #EEDDDD", +"v. c #F5DBD4", +"b. c #D6E8FA", +/* pixels */ +"; = = = * = e e w w 0 0 8 8 5 5 ", +"* 7.7.5.4.2.| { [ ] ' ^ ~ ! W 4 ", +"= 5.-.;.y.h.z.s.Q T K A B v R 4 ", +"= 4.-.k.l.) / s.d.G A B l k U 1 ", +"* 4.&.j.p.v.x._ q.S n l k f G 1 ", +"& 1.$.g.( c.b.` 0.S v k d a G 1 ", +"% <.+.t.i.` f.r.e.z h s a i C < ", +"$ ,.O.@.u.w.9.8.P g s a u y M > ", +"@ >.o... .X.v n g d a u t r c > ", +"+ :.-.&.$.$.W U I G D V M c x > ", +"@ O o X . 4 1 1 1 < < > : : : " +}; diff --git a/src/pixmaps/flags_xpm/pw.xpm b/src/pixmaps/flags_xpm/pw.xpm new file mode 100644 index 00000000..31b0c7fc --- /dev/null +++ b/src/pixmaps/flags_xpm/pw.xpm @@ -0,0 +1,167 @@ +/* XPM */ +static const char *pw[] = { +/* columns rows colors chars-per-pixel */ +"16 11 150 2", +" c #FFFC00", +". c #FFFC03", +"X c #FFFC04", +"o c #FEFC05", +"O c #FCFA12", +"+ c #FDFB16", +"@ c #FEFC1A", +"# c #FEFC1E", +"$ c #F2F726", +"% c #F8F721", +"& c #F2F82A", +"* c #F1F536", +"= c #FBFA34", +"- c #DBEB45", +"; c #C4E15B", +": c #DDED53", +"> c #C4E261", +", c #CAE87F", +"< c #0029DD", +"1 c #002BDD", +"2 c #002FDD", +"3 c #002FDF", +"4 c #0031DF", +"5 c #0033DF", +"6 c #0039DD", +"7 c #0035E1", +"8 c #0037E3", +"9 c #003BE3", +"0 c #003DE5", +"q c #003FE5", +"w c #0041E7", +"e c #0047E7", +"r c #0045E9", +"t c #004BEB", +"y c #004DE9", +"u c #004FEB", +"i c #0051ED", +"p c #0059ED", +"a c #005DEF", +"s c #005FEF", +"d c #0061EF", +"f c #0063F1", +"g c #0067F3", +"h c #0069F3", +"j c #006DF5", +"k c #0071F7", +"l c #0077F5", +"z c #0075F9", +"x c #0079F9", +"c c #0079FB", +"v c #007BFB", +"b c #007DFD", +"n c #75C1A3", +"m c #78C3A1", +"M c #7BC6B2", +"N c #0081FD", +"B c #0083FD", +"V c #0087FD", +"C c #0087FF", +"Z c #0089FD", +"A c #0089FF", +"S c #0B95F1", +"D c #0F97F1", +"F c #0093FF", +"G c #1097F2", +"H c #1399F2", +"J c #1499F2", +"K c #149AF2", +"L c #189BF3", +"P c #199CF3", +"I c #1A9CF3", +"U c #1F9BF4", +"Y c #1E9DF4", +"T c #1F9EF4", +"R c #1F9FF4", +"E c #209FF4", +"W c #2BA4EE", +"Q c #3CACE5", +"! c #25A0F5", +"~ c #25A2F5", +"^ c #26A2F5", +"/ c #2CA2F2", +"( c #2FA4F2", +") c #2BA4F6", +"_ c #2BA5F6", +"` c #2CA6F6", +"' c #32A5F3", +"] c #33A6F3", +"[ c #35A8F3", +"{ c #37ABF2", +"} c #31A8F7", +"| c #31A9F7", +" . c #36A8F4", +".. c #39A9F4", +"X. c #3BAAF5", +"o. c #3DABF5", +"O. c #3FADF5", +"+. c #37A8F8", +"@. c #37ABF8", +"#. c #3AAAF9", +"$. c #3DADF9", +"%. c #3FAEFA", +"&. c #42ABF6", +"*. c #44AFF6", +"=. c #42AEFA", +"-. c #47B0F6", +";. c #49B2F7", +":. c #4BB2F7", +">. c #4EB4F7", +",. c #4EB6F7", +"<. c #44B1FA", +"1. c #45B0FB", +"2. c #49B4FB", +"3. c #4FB6FC", +"4. c #59BBF2", +"5. c #50B3F8", +"6. c #53B7F8", +"7. c #54B7F9", +"8. c #53B8FD", +"9. c #58B9F9", +"0. c #58BBF9", +"q. c #5CBBFA", +"w. c #5DBCFA", +"e. c #58B9FE", +"r. c #59BAFE", +"t. c #58BBFE", +"y. c #5CBDFE", +"u. c #5CBEFE", +"i. c #5FBFFE", +"p. c #61BEFB", +"a. c #69BFFC", +"s. c #65C0FC", +"d. c #66C0FC", +"f. c #6AC3FC", +"g. c #6DC3FD", +"h. c #6FC4FD", +"j. c #70C4FE", +"k. c #72C6FE", +"l. c #74C4FE", +"z. c #76C8FE", +"x. c #77C8FE", +"c. c #79C8FE", +"v. c #79C9FE", +"b. c #7BCAFF", +"n. c #9ED58E", +"m. c #A7DA99", +"M. c #84CAB2", +"N. c #85CCBD", +"B. c #C9E983", +"V. c #8BCFC7", +/* pixels */ +"F A A A A B B b x z k j h f a d ", +"C b.b.b.x.l.j.g.a.a.i.q.9.6.,.u ", +"A b.i.y.r.V.B.B.N.=.$.+.} _ ;.y ", +"A x.y.e.m.# @ = M.+.} _ ^ *.e ", +"C x.e.0.& + : { _ ^ E O.w ", +"B k.8.4.o . * Q E R I X.0 ", +"B h.3.,.$ O - W R I K .8 ", +"x f.2.1.n.+ O % m U I H G ] 5 ", +"x d.<.=.#.M > ; n Y L J G S ( 3 ", +"k p.w.0.7.5.:.*.&.o.{ [ ' ( ( < ", +"l h f a p u y r w 0 9 8 3 3 < 6 " +}; diff --git a/src/pixmaps/flags_xpm/py.xpm b/src/pixmaps/flags_xpm/py.xpm new file mode 100644 index 00000000..f35a5c7f --- /dev/null +++ b/src/pixmaps/flags_xpm/py.xpm @@ -0,0 +1,163 @@ +/* XPM */ +static const char *py[] = { +/* columns rows colors chars-per-pixel */ +"16 11 146 2", +" c #E90000", +". c #EB0000", +"X c #ED0000", +"o c #EF0000", +"O c #F10000", +"+ c #F30000", +"@ c #F50000", +"# c #F70000", +"$ c #F90000", +"% c #FB0000", +"& c #FD0000", +"* c red", +"= c #F62C2C", +"- c #F73131", +"; c #F83737", +": c #F93C3D", +"> c #FA4242", +", c #FB4747", +"< c #F74949", +"1 c #F74E4E", +"2 c #FC4C4C", +"3 c #F85353", +"4 c #FD5151", +"5 c #F95757", +"6 c #FD5454", +"7 c #FE5959", +"8 c #FA5C5C", +"9 c #FE5C5C", +"0 c #FE5F5F", +"q c #FB6060", +"w c #FC6565", +"e c #FC6969", +"r c #FD6D6D", +"t c #EA7973", +"y c #FD7071", +"u c #FE7474", +"i c #FE7777", +"p c #FE7979", +"a c #FF7B7A", +"s c #FF7B7B", +"d c #9ABD7A", +"f c #EA8079", +"g c #0000A7", +"h c #0000AB", +"j c #0000AD", +"k c #0000AF", +"l c #0000B1", +"z c #0000B5", +"x c #0000B9", +"c c #0000BB", +"v c #0000BD", +"b c #0000C1", +"n c #0000C3", +"m c #0000C7", +"M c #0000C9", +"N c #0003CD", +"B c #000BCF", +"V c #0011D1", +"C c #3658D6", +"Z c #395CD7", +"A c #3D5ED9", +"S c #4262DA", +"D c #4666DC", +"F c #4B6ADD", +"G c #506FDA", +"H c #506EDF", +"J c #5370DC", +"K c #5470DC", +"L c #5573DD", +"P c #5975DD", +"I c #5C78DF", +"U c #5472E1", +"Y c #5976E2", +"T c #5D7AE4", +"R c #607BE0", +"E c #647FE2", +"W c #627EE4", +"Q c #7081CA", +"! c #6682E6", +"~ c #6882E2", +"^ c #6B85E4", +"/ c #6F89E6", +"( c #738CE7", +") c #778FE8", +"_ c #7A93E8", +"` c #7F96EA", +"' c #F18D87", +"] c #F3928C", +"[ c #8399EB", +"{ c #CFD3DB", +"} c #CFD1DF", +"| c #F6CCC8", +" . c #E7DDDD", +".. c #F6D4D1", +"X. c #F9D2D0", +"o. c #F7D9D9", +"O. c #F9DBD8", +"+. c #FADEDE", +"@. c #CFD3E1", +"#. c #D3D7E3", +"$. c #F5EFEF", +"%. c #E7E9F0", +"&. c #E9EAF0", +"*. c #EAECF1", +"=. c #EBECF2", +"-. c #EBEDF2", +";. c #ECEEF4", +":. c #EFEFF5", +">. c #EDEFF9", +",. c #EDF1F7", +"<. c #EFF0F7", +"1. c #EFF1F7", +"2. c #EFF1FB", +"3. c #EFF3FB", +"4. c gray95", +"5. c #F3F3F3", +"6. c #F6F0F0", +"7. c #F6F1F1", +"8. c #F7F2F2", +"9. c #F4F4F4", +"0. c #F4F5F5", +"q. c gray96", +"w. c #F6F6F6", +"e. c gray97", +"r. c #F8F3F3", +"t. c #F9F4F4", +"y. c #FAF4F5", +"u. c #FBF5F5", +"i. c #FFF5F5", +"p. c #FCF6F6", +"a. c #FDF7F7", +"s. c #F0F2F8", +"d. c #F2F3F9", +"f. c #F3F4FA", +"g. c #F4F5FA", +"h. c #F7F7FC", +"j. c gray98", +"k. c #FBFBFB", +"l. c #FDF8F8", +"z. c #FEF9F9", +"x. c #FEFBFB", +"c. c #FBFCFB", +"v. c gray99", +"b. c #FDFCFD", +"n. c #FDFDFD", +"m. c #FEFEFE", +/* pixels */ +"* * * * * * * % % % # # O O o o ", +"* s s s i u y r e w q 8 5 3 1 ", +"* s 0 9 9 4 4 , , > : ; - = < ", +"a.z.z.a.a.a.a.i.t.t.8.8.6.$.8. .", +"d.m.m.m.k.m.$.' ' o.p.0.0.9.0.#.", +"2.m.v.m.k.j.X.d Q | 0.0.9.5.0.@.", +">.m.k.c.j.j.O.t t ..0.9.5.5.9.} ", +",.h.f.f.d.d.,.,.,.;.*.&.=.%.=.{ ", +"V [ ! W T Y L H F D S A Z C K g ", +"B ` _ ) ( / ^ ~ E R I P L K G g ", +"N M m b b v c c z l k k h g g g " +}; diff --git a/src/pixmaps/flags_xpm/qa.xpm b/src/pixmaps/flags_xpm/qa.xpm new file mode 100644 index 00000000..0ea57325 --- /dev/null +++ b/src/pixmaps/flags_xpm/qa.xpm @@ -0,0 +1,124 @@ +/* XPM */ +static const char *qa[] = { +/* columns rows colors chars-per-pixel */ +"16 11 107 2", +" c black", +". c #050000", +"X c #0D0000", +"o c #130000", +"O c #170000", +"+ c #1B0000", +"@ c #210000", +"# c #250000", +"$ c #570D05", +"% c #5A1A11", +"& c #5E1D15", +"* c #5E1D16", +"= c #60221A", +"- c #60221B", +"; c #62221B", +": c #64261F", +"> c #64271F", +", c #642720", +"< c #682B24", +"1 c #682C25", +"2 c #682D25", +"3 c #692D26", +"4 c #6C3129", +"5 c #6C322A", +"6 c #6D322B", +"7 c #6D332C", +"8 c #70362E", +"9 c #70362F", +"0 c #70372F", +"q c #703731", +"w c #703831", +"e c #713831", +"r c #723932", +"t c #723B34", +"y c #723B35", +"u c #743B34", +"i c #743C34", +"p c #743C35", +"a c #753C36", +"s c #753D36", +"d c #753E37", +"f c #753F37", +"g c #763E37", +"h c #77413B", +"j c #784139", +"k c #78413A", +"l c #79423A", +"z c #78423B", +"x c #79423C", +"c c #79433C", +"v c #7A433D", +"b c #7A453F", +"n c #7C473F", +"m c #7B4640", +"M c #7D4740", +"N c #7D4741", +"B c #7D4842", +"V c #7C4942", +"C c #7E4842", +"Z c #7F4B45", +"A c #7F4D46", +"S c #814C45", +"D c #814D47", +"F c #825049", +"G c #83514B", +"H c #85524B", +"J c #85524D", +"K c #84544E", +"L c #865550", +"P c #885750", +"I c #895751", +"U c #8A5953", +"Y c #8C5B55", +"T c #8C5D58", +"R c #8F615C", +"E c #926661", +"W c #936661", +"Q c #966A65", +"! c #996E6A", +"~ c #996F6A", +"^ c #9C736D", +"/ c #9E7670", +"( c #A07773", +") c #A17975", +"_ c #A6807C", +"` c #E3E3E1", +"' c #E7E5E5", +"] c #E9E7E7", +"[ c #EBE9E9", +"{ c #EFEDEB", +"} c #F1EFED", +"| c #F1EFEF", +" . c #F1F1F1", +".. c #F3F1F1", +"X. c #F5F3F3", +"o. c #F5F5F3", +"O. c #F7F5F5", +"+. c #F9F5F5", +"@. c #F8F8F8", +"#. c #F9F9F9", +"$. c gray98", +"%. c #FBFBFB", +"&. c #FBFCFB", +"*. c gray99", +"=. c #FDFDFD", +"-. c #FEFEFE", +";. c gray100", +/* pixels */ +"+.O.O.O.o.$ # @ + o X . ", +"+.;.;.;.;.;.) / ^ ! Q W R T Y ", +"X.;.;.;.;.) Y I J D V b i r J ", +"O.;.%.;.%.;.I H S V v i r 6 G ", +"O.;.;.%.%./ H S M h s r 7 3 Z ", +"..;.;.&.;.%.S M k s q 6 3 , m ", +"..;.%.%.%.! m k i q 5 1 > ; k ", +"..&.%.%.@.@.k i 7 6 1 > - & h ", +"| %.%.%.%.E i 7 6 1 > ; & % s ", +"| %.@.%.O.%.L G S V b h s t w ", +"{ [ ] ' ` O " +}; diff --git a/src/pixmaps/flags_xpm/re.xpm b/src/pixmaps/flags_xpm/re.xpm new file mode 100644 index 00000000..40ce068e --- /dev/null +++ b/src/pixmaps/flags_xpm/re.xpm @@ -0,0 +1,146 @@ +/* XPM */ +static const char *re[] = { +/* columns rows colors chars-per-pixel */ +"16 11 129 2", +" c #C50000", +". c #C70000", +"X c #CB0000", +"o c #CD0000", +"O c #D30000", +"+ c #D50000", +"@ c #DB0000", +"# c #DD0000", +"$ c #E10000", +"% c #E50000", +"& c #E70000", +"* c #EB0000", +"= c #EF0700", +"- c #F11300", +"; c #E64D3E", +": c #E85243", +"> c #E95648", +", c #EA5748", +"< c #EA574A", +"1 c #EB5D4F", +"2 c #EC5E50", +"3 c #E86355", +"4 c #EE6355", +"5 c #EE6456", +"6 c #EE6457", +"7 c #E96659", +"8 c #E9665A", +"9 c #EA695D", +"0 c #EA6A5D", +"q c #EF695C", +"w c #F06A5C", +"e c #F06C5D", +"r c #EC6D61", +"t c #EC6E62", +"y c #ED7468", +"u c #EF786C", +"i c #F17063", +"p c #F17064", +"a c #F27164", +"s c #F3776A", +"d c #F3776B", +"f c #F17E72", +"g c #F57D72", +"h c #F28478", +"j c #F4887E", +"k c #1747A5", +"l c #234FAB", +"z c #2D57AF", +"x c #355FB5", +"c c #3F67B9", +"v c #4971BD", +"b c #5377C3", +"n c #5B7FC7", +"m c #6385CB", +"M c #6989CD", +"N c #6F8FD1", +"B c #7191D1", +"V c #7393D3", +"C c #7395D3", +"Z c #9F9F9F", +"A c #A7A7A7", +"S c gray68", +"D c #B3B0B0", +"F c gray72", +"G c gray", +"H c #F58D83", +"J c #F79389", +"K c #F8978E", +"L c #97ACD8", +"P c #9CB0DA", +"I c #A0B4DD", +"U c #A0B5DD", +"Y c #A1B5DD", +"T c #A3B5DC", +"R c #A7B9DD", +"E c #A5B8DF", +"W c #A5B9DF", +"Q c #A6B9E0", +"! c #A9BCE1", +"~ c #A9BDE1", +"^ c #AABDE0", +"/ c #AABDE1", +"( c #AFBFE2", +") c #AEBFE3", +"_ c #AEBFE4", +"` c #AEC0E4", +"' c #B1C2E5", +"] c #B1C3E5", +"[ c #B3C3E4", +"{ c #B2C3E5", +"} c #B4C5E7", +"| c #B7C7E6", +" . c #B7C8E8", +".. c #BAC9E8", +"X. c #BECCE9", +"o. c #CECECE", +"O. c gray81", +"+. c #D2D2D2", +"@. c #D5D5D5", +"#. c gainsboro", +"$. c #DFDFDF", +"%. c #C0CEEA", +"&. c #C1CFEB", +"*. c #C3D0EC", +"=. c #C3D1EC", +"-. c #C4D2ED", +";. c #C4D3ED", +":. c #E2E2E2", +">. c #E4E4E4", +",. c gray90", +"<. c #E6E6E6", +"1. c #E7E7E7", +"2. c gray91", +"3. c #E9E9E9", +"4. c #E9E9EA", +"5. c #EAEAEA", +"6. c gray92", +"7. c #ECEBEB", +"8. c #ECECEC", +"9. c gray93", +"0. c #EEEEEE", +"q. c #EFEFEF", +"w. c gray94", +"e. c #F1F1F1", +"r. c #F3F3F3", +"t. c #F4F4F4", +"y. c #F6F6F6", +"u. c gray97", +"i. c #F8F8F8", +/* pixels */ +"C C C C V $.#.@.+.o.O.- = * * % ", +"C ;.;.=.%.i.u.u.u.t.e.K J H j # ", +"V ;. .} ] 0.8.6.2.6.1.g d a h # ", +"V =.} ] _ 0.6.8.6.2.,.s a e f # ", +"N %.] _ ^ 0.0.6.6.2.1.i q 6 u + ", +"M X.) ^ Q e.0.0.6.6.1.q 6 2 y O ", +"m ..^ W Y w.0.8.6.6.1.4 1 < t o ", +"n } W Y P 0.8.6.1.1.>.1 < : 0 X ", +"b [ Y P L 6.6.2.1.:.:.> : ; 7 ", +"v ' R W Y 0.6.6.1.1.1.r 8 7 3 ", +"v x z l k G F D S A Z o o " +}; diff --git a/src/pixmaps/flags_xpm/ro.xpm b/src/pixmaps/flags_xpm/ro.xpm new file mode 100644 index 00000000..6ec33d8c --- /dev/null +++ b/src/pixmaps/flags_xpm/ro.xpm @@ -0,0 +1,168 @@ +/* XPM */ +static const char *ro[] = { +/* columns rows colors chars-per-pixel */ +"16 11 151 2", +" c #DD0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #ED0000", +"% c #EF0000", +"& c #F10000", +"* c #F30000", +"= c #F50000", +"- c #F10B0B", +"; c #F10F0E", +": c #F21010", +"> c #F21313", +", c #F21414", +"< c #F31919", +"1 c #F31A1A", +"2 c #F41F1F", +"3 c #F42020", +"4 c #F52525", +"5 c #F52626", +"6 c #F62B2B", +"7 c #F22C2C", +"8 c #F22F2F", +"9 c #F62C2C", +"0 c #F23232", +"q c #F33232", +"w c #F73131", +"e c #F33535", +"r c #F43636", +"t c #F83737", +"y c #F43B3B", +"u c #F53F3F", +"i c #F64444", +"p c #F74949", +"a c #F74E4E", +"s c #F85353", +"d c #F95757", +"f c #FA5C5C", +"g c #E3A900", +"h c #E5B900", +"j c #E7BD00", +"k c #E9BD00", +"l c #EBC100", +"z c #EFDD00", +"x c #F7D500", +"c c #F3DD00", +"v c #F5DF00", +"b c #F7E100", +"n c #F7E300", +"m c #F3E319", +"M c #F4E51F", +"N c #F4F41E", +"B c #F5E624", +"V c #F6E82B", +"C c #F5F523", +"Z c #F5F524", +"A c #F6F629", +"S c #F6F62A", +"D c #F7F72E", +"F c #F7F72F", +"G c #F7E930", +"H c #F8EA36", +"J c #F4E739", +"K c #F9EC3D", +"L c #F7F730", +"P c #F8F834", +"I c #F8F835", +"U c #F8F836", +"Y c #F0F03A", +"T c #F5F53D", +"R c #F9F93A", +"E c #F9F93B", +"W c #F9F93C", +"Q c #F1F140", +"! c #F6F642", +"~ c #F2F246", +"^ c #F7F746", +"/ c #FAFA40", +"( c #FAFA41", +") c #FAFA42", +"_ c #FBFB46", +"` c #FBFB47", +"' c #F3F34B", +"] c #F7F74B", +"[ c #FCFC4B", +"{ c #FCFC4C", +"} c #F4F450", +"| c #F2F255", +" . c #F5F556", +".. c #FDFD51", +"X. c #F6F65A", +"o. c #FBF060", +"O. c #FCFC65", +"+. c #FCFC69", +"@. c #FDFD6D", +"#. c #FDFD71", +"$. c #F8F878", +"%. c #0000A9", +"&. c #0000AB", +"*. c #0000AD", +"=. c #0000AF", +"-. c #0000B3", +";. c #0000B5", +":. c #0000B7", +">. c #0007BB", +",. c #000DBD", +"<. c #0013BF", +"1. c #0019C1", +"2. c #0019C3", +"3. c #001DC3", +"4. c #001DC5", +"5. c #001DC9", +"6. c #002BC7", +"7. c #3F6BD5", +"8. c #3A68D8", +"9. c #446FD6", +"0. c #406CD9", +"q. c #4570D7", +"w. c #4571DB", +"e. c #4974D8", +"r. c #4974D9", +"t. c #4B75DD", +"y. c #4F78DA", +"u. c #4F78DB", +"i. c #537CDB", +"p. c #5079DE", +"a. c #547CDC", +"s. c #547CDD", +"d. c #547DDF", +"f. c #587FDA", +"g. c #5D83DB", +"h. c #5880DC", +"j. c #5880DD", +"k. c #5C83DE", +"l. c #5F85DF", +"z. c #6186DD", +"x. c #668ADE", +"c. c #5981E0", +"v. c #6A8EE0", +"b. c #6F91E0", +"n. c #7294E2", +"m. c #7697E3", +"M. c #7798E7", +"N. c #7999E4", +"B. c #7999E5", +"V. c #7B9AE4", +"C. c #7B9BE4", +/* pixels */ +"6.3.3.4.5.z n n v c x = * * % % ", +"2.C.C.C.M.$.#.@.+.O.o.f d s a @ ", +"4.C.k.k.c.X...{ ` ( K t w 9 p @ ", +"2.C.k.j.d. .[ _ ( W H w 9 5 i + ", +"2.m.j.a.p.' _ ( W U G 6 5 3 u + ", +"<.n.i.y.t.' ( R U F V 4 2 1 y + ", +",.n.y.e.w.' R I F S B 2 1 , r X ", +">.x.e.q.0.Q P D S Z M 1 , : 0 . ", +";.x.9.9.8.Y F S C N m > ; - 8 . ", +"-.z.g.a.a.| ] ^ ! T J r 0 8 7 . ", +"-.*.&.&.*.j l j j h g X . " +}; diff --git a/src/pixmaps/flags_xpm/rs.xpm b/src/pixmaps/flags_xpm/rs.xpm new file mode 100644 index 00000000..13b2e77a --- /dev/null +++ b/src/pixmaps/flags_xpm/rs.xpm @@ -0,0 +1,135 @@ +/* XPM */ +static const char *rs[] = { +/* columns rows colors chars-per-pixel */ +"16 11 118 2", +" c #001A6C", +". c #001D76", +"X c #001D78", +"o c #001E7A", +"O c #BF0000", +"+ c #C10000", +"@ c #C30000", +"# c #C50000", +"$ c #C70000", +"% c #C90000", +"& c #CB0000", +"* c #CD0000", +"= c #D00000", +"- c #D20000", +"; c #D50000", +": c #D70000", +"> c #D90000", +", c #DA0000", +"< c #DB0000", +"1 c #DD0000", +"2 c #E00000", +"3 c #E10000", +"4 c #E20000", +"5 c #E40000", +"6 c #C43C3F", +"7 c #D03131", +"8 c #D23131", +"9 c #D33232", +"0 c #D43232", +"q c #D53232", +"w c #D63232", +"e c #D73232", +"r c #D73333", +"t c #D83333", +"y c #D93333", +"u c #DB3434", +"i c #DD3434", +"p c #D2353B", +"a c #E53636", +"s c #E73636", +"d c #E93737", +"f c #EB3737", +"g c #C83D41", +"h c #CD3E42", +"j c #CE3E43", +"k c #D03F43", +"l c #D03F45", +"z c #D54145", +"x c #D8574E", +"c c #D9584F", +"v c #DC5950", +"b c #DE5A51", +"n c #E05B51", +"m c #E35C52", +"M c #E55D53", +"N c #E75E54", +"B c #E95F55", +"V c #EB6056", +"C c #ED6156", +"Z c #F06257", +"A c #F36357", +"S c #F56458", +"D c #F56459", +"F c #F56559", +"G c #F5665A", +"H c #E57E54", +"J c #D15D60", +"K c #D25E61", +"L c #CE6E72", +"P c #D07174", +"I c #D77779", +"U c #DD7A7C", +"Y c #E88055", +"T c #F5F576", +"R c #F5F577", +"E c #005496", +"W c #005497", +"Q c #005597", +"! c #005598", +"~ c #005699", +"^ c #00569A", +"/ c #00569B", +"( c #00569C", +") c #00579C", +"_ c #00579E", +"` c #00599F", +"' c #005AA1", +"] c #005AA2", +"[ c #005BA4", +"{ c #005CA4", +"} c #005DA7", +"| c #3073A4", +" . c #3073A5", +".. c #347EB3", +"X. c #357FB6", +"o. c #3682B8", +"O. c #EDA3A4", +"+. c #EEB8B8", +"@. c #F1BABA", +"#. c #EBC2C3", +"$. c #EDC3C4", +"%. c #E9CCCE", +"&. c #F0C7C7", +"*. c #EDD0D1", +"=. c gray90", +"-. c #E6E6E6", +";. c #E7E7E7", +":. c #E9E9E9", +">. c gray92", +",. c gray93", +"<. c #EFEFEF", +"1. c gray94", +"2. c #F1F1F1", +"3. c gray95", +"4. c #F3F3F3", +"5. c #F5F1F1", +"6. c #F4F4F4", +"7. c gray96", +/* pixels */ +"5 3 3 1 , , : : - * * * * % $ $ ", +"3 G S G A A C V B B M m m v c + ", +"1 S f f p H H l i u y r 9 9 c + ", +", A a a z T T h y r r 9 9 9 x + ", +"o o.} [ O.k h +.` ^ ^ ^ W W . ", +"o X.[ ' @.7.5.&.) ^ ^ W W W . ", +". ..' ` U K K I / W W W W W | ", +"6.7.7.7.g $.#.6 6.6.3.2.2.<.7.=.", +"7.7.7.7.*.P L %.3.3.3.2.<.<.3.=.", +"<.7.7.7.7.7.6.3.3.3.3.<.<.3.3.=.", +"<.:.:.:.;.=.=.=.=.=.=.=.=.=.=.=." +}; diff --git a/src/pixmaps/flags_xpm/ru.xpm b/src/pixmaps/flags_xpm/ru.xpm new file mode 100644 index 00000000..d3ef92aa --- /dev/null +++ b/src/pixmaps/flags_xpm/ru.xpm @@ -0,0 +1,152 @@ +/* XPM */ +static const char *ru[] = { +/* columns rows colors chars-per-pixel */ +"16 11 135 2", +" c #7B0000", +". c #B30000", +"X c #DD0000", +"o c #DF0000", +"O c #E10000", +"+ c #E30000", +"@ c #E50000", +"# c #E70000", +"$ c #E90000", +"% c #EB0000", +"& c #ED0000", +"* c #EF0000", +"= c #F10000", +"- c #F30000", +"; c #F50000", +": c #F70000", +"> c #F90000", +", c #F10B0B", +"< c #F10F0E", +"1 c #F21313", +"2 c #F31919", +"3 c #F41E1E", +"4 c #F52323", +"5 c #F62929", +"6 c #F22C2C", +"7 c #F22F2F", +"8 c #F72E2E", +"9 c #F23232", +"0 c #F33535", +"q c #F83434", +"w c #F43939", +"e c #F53D3D", +"r c #F93A3A", +"t c #FA3F3F", +"y c #BD1043", +"u c #BF1446", +"i c #C2194B", +"p c #C41F4F", +"a c #C62453", +"s c #C82A58", +"d c #CA2F5D", +"f c #C8325E", +"g c #CC3461", +"h c #CE3A66", +"j c #D03F6A", +"k c #F64242", +"l c #F74646", +"z c #FA4444", +"x c #F74B4B", +"c c #F85050", +"v c #F95455", +"b c #F95858", +"n c #FA5D5D", +"m c #D1456E", +"M c #D34972", +"N c #FB6162", +"B c #FC6666", +"V c #0000E3", +"C c #0000E5", +"Z c #0000E7", +"A c #0000FD", +"S c #1414F2", +"D c #1919F3", +"F c #1A1AF3", +"G c #1F1FF4", +"H c #2020F4", +"J c #2424F5", +"K c #2525F5", +"L c #2A2AF6", +"P c #2A2BF6", +"I c #2B2BF6", +"U c #2F2FF7", +"Y c #3030F7", +"T c #3636F4", +"R c #3B3BF5", +"E c #3F3FF5", +"W c #3535F8", +"Q c #3636F8", +"! c #3B3BF9", +"~ c #4040FA", +"^ c #4141FA", +"/ c #4545FB", +"( c #4646FB", +") c #494AFB", +"_ c #4B4AFC", +"` c #4B4BFC", +"' c #4949FF", +"] c #4F4FFC", +"[ c #504FFD", +"{ c #5353FD", +"} c #5454FD", +"| c #5858FE", +" . c #6F6FFD", +".. c #7D7DF5", +"X. c #7272FE", +"o. c #7676FE", +"O. c #DC6A8C", +"+. c #8181F6", +"@. c #8585F7", +"#. c #8F8FF6", +"$. c #8888F8", +"%. c #8C8CF9", +"&. c #8F8FFA", +"*. c #9393FB", +"=. c #9696FC", +"-. c #9898FD", +";. c #9B9BFD", +":. c #9E9EFE", +">. c #A0A0FE", +",. c #B1B1FE", +"<. c #DDDDE9", +"1. c #DFDFEB", +"2. c #E1E3EF", +"3. c #E5E5EF", +"4. c #E7E7F1", +"5. c #E9E9F3", +"6. c #EBEBF5", +"7. c #EDEDF7", +"8. c #EFEFF9", +"9. c #EFEFFB", +"0. c #F6F6F6", +"q. c gray97", +"w. c #F1F1FD", +"e. c #F3F3FD", +"r. c #F5F5FD", +"t. c #F5F5FF", +"y. c #F8F8F8", +"u. c #F9F9F9", +"i. c gray98", +"p. c #FBFBFB", +"a. c gray99", +"s. c #FDFDFD", +"d. c #FDFDFE", +"f. c #FEFEFE", +"g. c gray100", +/* pixels */ +"t.t.t.t.e.e.e.w.8.8.7.6.5.4.3.2.", +"t.g.g.g.g.g.g.a.a.a.i.i.i.y.q.1.", +"t.g.g.g.g.a.g.a.i.i.i.q.q.q.q.1.", +"' ,.>.;.;.=.=.*.&.%.$.@.+...#.C ", +"A o.| } [ ) ( ^ ! W U I J G E C ", +"A X.{ ] ` ( ~ ! W U I K G F R C ", +"A .] ) ( ~ ! W Y I J G F S T V ", +". O.M m j h g d s a p i u y f ", +"> B z t t q 8 5 4 3 2 1 < , 7 X ", +": N n b v x x l k e w 0 9 7 7 X ", +": = = & & & % % # # + + X X X X " +}; diff --git a/src/pixmaps/flags_xpm/rw.xpm b/src/pixmaps/flags_xpm/rw.xpm new file mode 100644 index 00000000..a3cd80b9 --- /dev/null +++ b/src/pixmaps/flags_xpm/rw.xpm @@ -0,0 +1,175 @@ +/* XPM */ +static const char *rw[] = { +/* columns rows colors chars-per-pixel */ +"16 11 158 2", +" c #001700", +". c #001B00", +"X c #001D00", +"o c #001F00", +"O c #002100", +"+ c #002700", +"@ c #002900", +"# c #002F00", +"$ c #003500", +"% c #003900", +"& c #003F00", +"* c #004300", +"= c #004900", +"- c #004F00", +"; c #005500", +": c #005B00", +"> c #006300", +", c #007900", +"< c #1E990B", +"1 c #239B0E", +"2 c #279E13", +"3 c #2CA119", +"4 c #30A21E", +"5 c #2C9E2C", +"6 c #2F9F2F", +"7 c #35A523", +"8 c #3AA829", +"9 c #3FAB2E", +"0 c #32A232", +"q c #35A435", +"w c #39A539", +"e c #3DA83D", +"r c #40A82F", +"t c #45AD34", +"y c #4AB03A", +"u c #4FB33F", +"i c #42AA42", +"p c #46AD46", +"a c #4BAF4B", +"s c #54B544", +"d c #50B250", +"f c #54B455", +"g c #58B758", +"h c #5DB95D", +"j c #61BB62", +"k c #74C366", +"l c #D5DD00", +"z c #DFDF00", +"x c #E3E300", +"c c #F3F900", +"v c #FBFB00", +"b c #FDFD00", +"n c #F2F210", +"m c #F2F214", +"M c #F3F319", +"N c #F4F41F", +"B c #ECF024", +"V c #EDF128", +"C c #EEF22D", +"Z c #F5F524", +"A c #F6F62A", +"S c #F7F72F", +"D c #EFF333", +"F c #F3F332", +"G c #F4F436", +"H c #F8F834", +"J c #F8F835", +"K c #F1F439", +"L c #F2F53E", +"P c #F9F93A", +"I c #FAFA3F", +"U c #CAC25D", +"Y c #D6C654", +"T c #DFCA52", +"R c #E1C848", +"E c #EDF243", +"W c #F2F643", +"Q c #FAFA40", +"! c #FBFB45", +"~ c #F3F748", +"^ c #F4F84E", +"/ c #FBFB49", +"( c #FBFC49", +") c #FCFC4F", +"_ c #F5F952", +"` c #F6FA57", +"' c #F7FA5B", +"] c #C4C579", +"[ c #CFCA7B", +"{ c #FCFC6A", +"} c #FDFD6F", +"| c #F8FC79", +" . c #0035E7", +".. c #0043E7", +"X. c #0049E9", +"o. c #0049EB", +"O. c #0055EF", +"+. c #0057EF", +"@. c #005BF1", +"#. c #0061F3", +"$. c #0067F5", +"%. c #006BF7", +"&. c #0071F9", +"*. c #0073FB", +"=. c #0077FD", +"-. c #007BFD", +";. c #007DFD", +":. c #0381FD", +">. c #0583FF", +",. c #0783FF", +"<. c #0D85FF", +"1. c #4D9FF2", +"2. c #51A1F3", +"3. c #50A4F6", +"4. c #55A6F7", +"5. c #5AA9F8", +"6. c #5BAAF8", +"7. c #5EACF9", +"8. c #5FACF9", +"9. c #6BADE1", +"0. c #7AB6ED", +"q. c #61ABF5", +"w. c #62AEF9", +"e. c #66AFFA", +"r. c #67B0FA", +"t. c #67B1FA", +"y. c #69B2FB", +"u. c #6AB3FB", +"i. c #6BB3FB", +"p. c #6CB4FC", +"a. c #6EB6FC", +"s. c #6FB6FC", +"d. c #7EBCF7", +"f. c #70B6FD", +"g. c #72B7FD", +"h. c #73B7FD", +"j. c #73B8FD", +"k. c #76BAFD", +"l. c #76BAFE", +"z. c #7FBEFB", +"x. c #79BCFE", +"c. c #7ABCFE", +"v. c #7CBDFE", +"b. c #7CBEFE", +"n. c #7FBFFE", +"m. c #D4CF81", +"M. c #D3D087", +"N. c #8AB7CC", +"B. c #84C0FC", +"V. c #87C2FC", +"C. c #8AC3FD", +"Z. c #8DC5FE", +"A. c #8FC7FE", +"S. c #90C7FE", +"D. c #91C8FE", +"F. c #94C8FE", +"G. c #94C9FE", +"H. c #95CAFF", +/* pixels */ +"<.,.,.,.:.;.-.=.*.&.%.$.#.@.+.+.", +",.H.H.H.D.A.A.C.V.B.z.d.m.m.0.o.", +",.H.n.v.v.l.f.s.y.y.8.] T R [ o.", +",.S.v.v.l.j.f.y.e.w.6.9.Y U N...", +";.A.l.j.f.p.y.e.7.5.4.3.2.1.q. .", +"c | ' ` _ ^ ~ W L K D C V B E l ", +"b } ) ( ! I P H S A Z N M m G x ", +"v { / ! I P H S A Z N M m n F z ", +", k s u y t 9 8 7 4 3 2 1 < r # ", +"> j h g f d a p i e w q 0 6 6 ", +"> : ; - = * & % $ # + + o o . o " +}; diff --git a/src/pixmaps/flags_xpm/sa.xpm b/src/pixmaps/flags_xpm/sa.xpm new file mode 100644 index 00000000..ec804ebc --- /dev/null +++ b/src/pixmaps/flags_xpm/sa.xpm @@ -0,0 +1,155 @@ +/* XPM */ +static const char *sa[] = { +/* columns rows colors chars-per-pixel */ +"16 11 138 2", +" c black", +". c #000700", +"X c #000F00", +"o c #001700", +"O c #001D00", +"+ c #002300", +"@ c #002B00", +"# c #003100", +"$ c #003300", +"% c #003700", +"& c #003900", +"* c #003B00", +"= c #003F00", +"- c #004100", +"; c #004500", +": c #004700", +"> c #004900", +", c #004B00", +"< c #146E13", +"1 c #187017", +"2 c #1C721B", +"3 c #1F731E", +"4 c #20751F", +"5 c #217520", +"6 c #227621", +"7 c #237823", +"8 c #267A26", +"9 c #297B27", +"0 c #297B29", +"q c #2F7E2F", +"w c #358233", +"e c #358034", +"r c #348234", +"t c #368236", +"y c #378236", +"u c #388438", +"i c #3A843A", +"p c #3A853A", +"a c #3B853A", +"s c #3E863D", +"d c #3F873E", +"f c #3C883C", +"g c #40883F", +"h c #408A3F", +"j c #418A40", +"k c #438A42", +"l c #448C43", +"z c #448A45", +"x c #458C44", +"c c #478D46", +"v c #478F46", +"b c #498F48", +"n c #4A9149", +"m c #4B914A", +"M c #4C904B", +"N c #4C914C", +"B c #4D914D", +"V c #4E914D", +"C c #4C924C", +"Z c #50944F", +"A c #519450", +"S c #529451", +"D c #519651", +"F c #539752", +"G c #549653", +"H c #569755", +"J c #579756", +"K c #569956", +"L c #579A56", +"P c #5C975C", +"I c #5B9A5A", +"U c #5B9A5B", +"Y c #5B9B5B", +"T c #5C9B5B", +"R c #5B9D5B", +"E c #5E9C5D", +"W c #609E5F", +"Q c #5FA05E", +"! c #609A62", +"~ c #619E60", +"^ c #64A064", +"/ c #64A264", +"( c #66A265", +") c #66A266", +"_ c #66A466", +"` c #68A069", +"' c #68A468", +"] c #6AA46A", +"[ c #6DA66C", +"{ c #6EA76D", +"} c #70A373", +"| c #71A970", +" . c #72AA71", +".. c #75AC74", +"X. c #76AC75", +"o. c #78AE77", +"O. c #78A979", +"+. c #78AE78", +"@. c #7AAB7D", +"#. c #7BB07A", +"$. c #7BB07B", +"%. c #7FB37E", +"&. c #7FB27F", +"*. c #80AD81", +"=. c #80B380", +"-. c #81B380", +";. c #89B48A", +":. c #89B48B", +">. c #8AB38C", +",. c #8AB58C", +"<. c #8CB48D", +"1. c #91B793", +"2. c #94BD95", +"3. c #96BB98", +"4. c #99BD99", +"5. c #99BD9A", +"6. c #99C19A", +"7. c #A3C2A4", +"8. c #A1C4A4", +"9. c #A8C8A9", +"0. c #AAC9AC", +"q. c #ADC9AD", +"w. c #AECBAF", +"e. c #ADCCAC", +"r. c #AFCCB1", +"t. c #B1CBB1", +"y. c #B0CBB2", +"u. c #B3CDB3", +"i. c #B3CCB4", +"p. c #B3CCB5", +"a. c #B6CDB6", +"s. c #B6CFB6", +"d. c #B6CEB8", +"f. c #B7D0B7", +"g. c #B6D0B8", +"h. c #BBD0BB", +"j. c #BCD4BF", +"k. c #CEDFCF", +/* pixels */ +", , , , , ; ; & % @ @ + O o X . ", +", -.-.%.#.o.X.| { [ ' ~ E U H ", +", =._ / ) ) T H R H B b h y S ", +", %.Q 6.j.r.@.0.r.i.O.s.:.0 b ", +"; @.R 2.w.g.3.p.3.<.~ 7.<.7 c ", +"; o.L 9.k.8.,.:.5.! } *.z 4 k ", +"= ..K D G Z m l j a a 8 6 3 g ", +"& | D m e.f.s.u.y.q.h.s.4 1 a ", +"$ { B v h s a t q 0 4.P 2 < t ", +"@ _ ^ W U J S Z c z j s a t q ", +"+ O o X . " +}; diff --git a/src/pixmaps/flags_xpm/sb.xpm b/src/pixmaps/flags_xpm/sb.xpm new file mode 100644 index 00000000..655ea4ef --- /dev/null +++ b/src/pixmaps/flags_xpm/sb.xpm @@ -0,0 +1,161 @@ +/* XPM */ +static const char *sb[] = { +/* columns rows colors chars-per-pixel */ +"16 11 144 2", +" c black", +". c #000900", +"X c #59353F", +"o c #0B670B", +"O c #0F6A0E", +"+ c #106A10", +"@ c #136C13", +"# c #146E14", +"$ c #187019", +"% c #197019", +"& c #1A701A", +"* c #1E741E", +"= c #1F741F", +"- c #207520", +"; c #237723", +": c #257625", +"> c #257725", +", c #267626", +"< c #247824", +"1 c #297B29", +"2 c #2A792B", +"3 c #2A7A2A", +"4 c #2A7B2A", +"5 c #2C7A2B", +"6 c #2C7B2C", +"7 c #2E7C2E", +"8 c #2F7C2F", +"9 c #2F7D2F", +"0 c #327F32", +"q c #337F32", +"w c #436700", +"e c #676B00", +"r c #915700", +"t c #358235", +"y c #368236", +"u c #398439", +"i c #3B853B", +"p c #3D863D", +"a c #3F893F", +"s c #558F36", +"d c #428A42", +"f c #448B44", +"g c #468D46", +"h c #498C49", +"j c #4B904B", +"k c #509250", +"l c #549355", +"z c #709C40", +"x c #AF9900", +"c c #9FAD3F", +"v c #C79300", +"b c #C39B00", +"n c #D3C83A", +"m c #E8CC3F", +"M c #A2B043", +"N c #AAB547", +"B c #BFBE43", +"V c #BCA178", +"C c #D5B86C", +"Z c #BEC568", +"A c #C8C044", +"S c #C8C247", +"D c #CFC74B", +"F c #D8CA40", +"G c #E8CC47", +"H c #E4C74F", +"J c #E4CE49", +"K c #E9CC4E", +"L c #E4C45D", +"P c #E1D45D", +"I c #E3C461", +"U c #E4C96F", +"Y c #E3D263", +"T c #00009F", +"R c #0000B1", +"E c #0000B3", +"W c #0000B7", +"Q c #0000B9", +"! c #0000BB", +"~ c #0000BD", +"^ c #0000BF", +"/ c #786FBA", +"( c #0000C3", +") c #0000C7", +"_ c #0303CD", +"` c #3B3BD7", +"' c #4542D3", +"] c #4644D5", +"[ c #4747D7", +"{ c #4B4BD7", +"} c #4747D9", +"| c #4242DC", +" . c #4241DE", +".. c #4646DD", +"X. c #4B4BD8", +"o. c #4C4CD8", +"O. c #4F4FDA", +"+. c #494ADD", +"@. c #5151D9", +"#. c #5151DA", +"$. c #5353DB", +"%. c #5454DB", +"&. c #5252DC", +"*. c #5859DB", +"=. c #5C5CDD", +"-. c #6160DE", +";. c #6565DD", +":. c #6969DF", +">. c #6B6BDF", +",. c #4646E0", +"<. c #4949E0", +"1. c #5C5CE2", +"2. c #6A6AE0", +"3. c #6D6DE0", +"4. c #6F6FE0", +"5. c #7071E1", +"6. c #7070E2", +"7. c #7575E2", +"8. c #7474E3", +"9. c #7B7BE5", +"0. c #8E7EA6", +"q. c #907FA0", +"w. c #B79D82", +"e. c #AA9899", +"r. c #BFA888", +"t. c #A697A8", +"y. c #AEA2B5", +"u. c #C4AB81", +"i. c #C7B292", +"p. c #8787E7", +"a. c #8C8CE7", +"s. c #8F8FE8", +"d. c #9E9EEA", +"f. c #A1A1EA", +"g. c #A1A1EB", +"h. c #A3A3EB", +"j. c #A9A9ED", +"k. c #B5B5F0", +"l. c #D2D2F5", +"z. c #E3E3F8", +"x. c #F7F7FB", +"c. c #F7F7FC", +"v. c #F7F7FD", +"b. c #FAFAFD", +/* pixels */ +"_ p.^ 9._ ^ ^ ^ W W E E Q T r b ", +"g.v.a.b.j.8.5.>.:.;.-.1.t.U Y e ", +"( d.l.8.=.%.@.O.{ | ' V m A h ", +") s.z.5.:.@.X.} .q.L J c , f ", +"` v.*.x.g.o...] w.G B 4 , - a ", +"( k.$.g.&...0.I F M 4 , * & i ", +"^ 4.O.+./ u.K S s 4 < = % # y ", +"Q :.<.e.C n N 9 4 , = % # + q ", +"^ y.r.H D z 9 4 ; * $ + + o 9 ", +"X i.P Z l k h g d p u y t 6 5 ", +"v x w . " +}; diff --git a/src/pixmaps/flags_xpm/sc.xpm b/src/pixmaps/flags_xpm/sc.xpm new file mode 100644 index 00000000..257fb5d4 --- /dev/null +++ b/src/pixmaps/flags_xpm/sc.xpm @@ -0,0 +1,173 @@ +/* XPM */ +static const char *sc[] = { +/* columns rows colors chars-per-pixel */ +"16 11 156 2", +" c #002100", +". c #002700", +"X c #002900", +"o c #002D00", +"O c #002F00", +"+ c #003300", +"@ c #003500", +"# c #003900", +"$ c #003B00", +"% c #003D00", +"& c #05012F", +"* c #004100", +"= c #005100", +"- c #006700", +"; c #000079", +": c #E70000", +"> c #E90000", +", c #EB0000", +"< c #ED0000", +"1 c #EF0000", +"2 c #F10000", +"3 c #F30000", +"4 c #F50000", +"5 c #F70700", +"6 c #F52525", +"7 c #F52626", +"8 c #F62B2B", +"9 c #F62C2C", +"0 c #F62D2D", +"q c #F73030", +"w c #F73131", +"e c #F83535", +"r c #F83636", +"t c #F83736", +"y c #F83737", +"u c #F73A3A", +"i c #F93A3A", +"p c #F93B3A", +"a c #F93B3B", +"s c #F93B3C", +"d c #F93C3C", +"f c #F93C3D", +"g c #FA3F3F", +"h c #854D0F", +"j c #83570B", +"k c #F64444", +"l c #FA4040", +"z c #FA4141", +"x c #FA4142", +"c c #FA4242", +"v c #F74949", +"b c #F74E4E", +"n c #F84848", +"m c #F45252", +"M c #F85353", +"N c #F95357", +"B c #F95757", +"V c #FA5C5C", +"C c #F56464", +"Z c #FB6060", +"A c #F67575", +"S c #008300", +"D c #009500", +"F c #159715", +"G c #2B9525", +"H c #2CA12C", +"J c #2FA32F", +"K c #32A432", +"L c #35A435", +"P c #39A639", +"I c #3CA83C", +"U c #42AE42", +"Y c #5BB85B", +"T c #71BD71", +"R c #C9C900", +"E c #F9ED00", +"W c #FBFB00", +"Q c #FDFD00", +"! c #FB8547", +"~ c #FB8B47", +"^ c #FB8C46", +"/ c #FB8F46", +"( c #FB9545", +") c #FB9745", +"_ c #FA9F44", +"` c #FC9665", +"' c #FBB267", +"] c #FBFB49", +"[ c #FCF94B", +"{ c #FCFA4B", +"} c #FCFB4B", +"| c #FBFC49", +" . c #FCF84C", +".. c #FCFC4F", +"X. c #FDFC50", +"o. c #FDFD51", +"O. c #FDFD54", +"+. c #D4D767", +"@. c #DBDB68", +"#. c #D6DB7C", +"$. c #E0E06A", +"%. c #FCF769", +"&. c #FDFD6D", +"*. c #FDFD71", +"=. c #FEFE74", +"-. c #000081", +";. c #000083", +":. c #000085", +">. c #000087", +",. c #000089", +"<. c #00008B", +"1. c #000091", +"2. c #5C5CBB", +"3. c #6161BC", +"4. c #5F5FC0", +"5. c #5C5CC2", +"6. c #7070C4", +"7. c #7272CA", +"8. c #7676C8", +"9. c #7979C9", +"0. c #7B7BC9", +"q. c #7B7BCA", +"w. c #7979CD", +"e. c #FA7D85", +"r. c #8C8B97", +"t. c #919199", +"y. c #9799A8", +"u. c #A9A9A9", +"i. c #F78B8C", +"p. c #F89B9F", +"a. c #F5B2B2", +"s. c #F4B7B7", +"d. c #F9B7B7", +"f. c #83C883", +"g. c #A1D2A1", +"h. c #A8DBAC", +"j. c #B3D9B3", +"k. c #E7CFCF", +"l. c #F5C2C2", +"z. c #F6D6D7", +"x. c #CFE6CF", +"c. c #CBEED3", +"v. c #D3E4D3", +"b. c #EBE7DF", +"n. c gray89", +"m. c gray90", +"M. c #F7E6ED", +"N. c #EEF0EE", +"B. c #ECF5F3", +"V. c #F3F0F1", +"C. c gray95", +"Z. c #F3F3F3", +"A. c #F4F4F4", +"S. c #F4F5F5", +"D. c gray96", +"F. c #F6F6F6", +/* pixels */ +"1.,.,.,.;.R Q Q W E 5 4 3 3 1 1 ", +":.q.q.w.u.=.*.&.%.` Z V B m b , ", +",.q.4.3.$.O.o. .! z s r w 0 v , ", +",.8.4.t.O.X. .~ z g r w 9 7 k : ", +",.8.2.@.X.{ / l i r q 9 7 m a.k.", +";.7.r...{ / z i r q 0 C s.V.A.m.", +";.6.+.| ) l i e u A l.A.C.C.Z.n.", +";.y.] ) g i n i.z.D.A.A.N.v.j.S ", +"; #._ l N p.M.D.B.x.g.T I F J ", +"& ' e.d.m.c.h.f.Y U P L K J H . ", +"h j G D - = * % $ % $ + o o X @ " +}; diff --git a/src/pixmaps/flags_xpm/scotland.xpm b/src/pixmaps/flags_xpm/scotland.xpm new file mode 100644 index 00000000..f3320b9f --- /dev/null +++ b/src/pixmaps/flags_xpm/scotland.xpm @@ -0,0 +1,160 @@ +/* XPM */ +static const char *scotland[] = { +/* columns rows colors chars-per-pixel */ +"16 11 143 2", +" c #000061", +". c #000065", +"X c #000075", +"o c #000077", +"O c #000081", +"+ c #000083", +"@ c #000085", +"# c #000087", +"$ c #000189", +"% c #000589", +"& c #00078B", +"* c #00058F", +"= c #000D8F", +"- c #000091", +"; c #000D93", +": c #001393", +"> c #00159D", +", c #001F9B", +"< c #00239F", +"1 c #002FA9", +"2 c #002FAB", +"3 c #0055A5", +"4 c #0045B1", +"5 c #0047B1", +"6 c #0049B3", +"7 c #004BB3", +"8 c #004FB5", +"9 c #0051B7", +"0 c #0053B7", +"q c #0055B9", +"w c #0057B9", +"e c #005BBD", +"r c #005DBD", +"t c #005FBF", +"y c #1957B4", +"u c #1058B2", +"i c #1E5DB7", +"p c #254CB0", +"a c #0061AD", +"s c #1470BF", +"d c #2560B9", +"f c #266CBE", +"g c #2E6ABE", +"h c #3375BF", +"j c #3970BF", +"k c #1D7DC3", +"l c #1A7DC4", +"z c #2077C1", +"x c #2375C2", +"c c #2A72C1", +"v c #2F76C3", +"b c #2A78C3", +"n c #2978C4", +"m c #4B6BC0", +"M c #4277C4", +"N c #427FCA", +"B c #497DC8", +"V c #1F80C6", +"C c #2583C3", +"Z c #3D8DC5", +"A c #358AC9", +"S c #368EC9", +"D c #3B8ECB", +"F c #3D8ECC", +"G c #3F93CD", +"H c #4480C7", +"J c #4783CB", +"K c #4983CA", +"L c #468ACE", +"P c #478FCF", +"I c #5081C8", +"U c #5182CA", +"Y c #5483CC", +"T c #4793CB", +"R c #4294CE", +"E c #4697D0", +"W c #4C92D1", +"Q c #4B96D1", +"! c #4F96D4", +"~ c #4F9ED6", +"^ c #4B9BD9", +"/ c #5C92D2", +"( c #559ED2", +") c #559FD3", +"_ c #549ED5", +"` c #589CD6", +"' c #5C9FD6", +"] c #618FD0", +"[ c #6A9ED6", +"{ c #749DD7", +"} c #53A1D8", +"| c #67A8D7", +" . c #65A8D9", +".. c #68AAD8", +"X. c #69ACDD", +"o. c #6DAEDD", +"O. c #79A5DB", +"+. c #70AEDD", +"@. c #6FB0DE", +"#. c #72B1DD", +"$. c #72B0DF", +"%. c #77B0DF", +"&. c #79B3DF", +"*. c #76B4E0", +"=. c #7DB9E3", +"-. c #80B6D9", +";. c #83BCE2", +":. c #8EBFE2", +">. c #91C0E1", +",. c #92C3E6", +"<. c #9DC9E8", +"1. c #AFCDE4", +"2. c #D2D4D4", +"3. c gray83", +"4. c #DDDDDD", +"5. c #C5DBEB", +"6. c #C4DDF0", +"7. c #D5E7F4", +"8. c gray88", +"9. c #E2E2E2", +"0. c #E6F0F5", +"q. c #E8F0F3", +"w. c #ECF1F2", +"e. c #ECF3F6", +"r. c #EEF5F7", +"t. c #EAF3F8", +"y. c #F1F1F1", +"u. c gray95", +"i. c #F3F3F3", +"p. c #F4F4F4", +"a. c gray96", +"s. c #F6F6F6", +"d. c gray97", +"f. c #F4F8F9", +"g. c #F5FBFC", +"h. c #F8F8F8", +"j. c #F9F9F9", +"k. c gray98", +"l. c #FBFBFB", +"z. c gray99", +"x. c #FDFDFD", +"c. c #FEFEFE", +"v. c gray100", +/* pixels */ +"9.9.^ 2 6 r q 0 6 5 4 < - k 4.2.", +"=.v.v.g.+.{ +.+.o. .] ' r.h.d.Z ", +"1 ,.v.v.v.<.U W P M :.h.j.d.| o ", +"r O./ 7.l.v.t.K N 0.h.d.5.f N ; ", +"e *._ Y ;.x.l.j.j.d.d.| d f G & ", +"w $.} ~ m L j.j.f.d.n p k l G % ", +"0 @.! B +.l.j.j.j.d.d.( y s S o ", +"8 [ K 6.l.j.e.v f q.p.i.1.u h @ ", +"> &.j.j.j.>.g n x i -.i.i.y.T ", +") v.j.f._ I Q Q R G j A q.u.u.a ", +"9.8.C @ * , : = & @ $ o 3 3.3." +}; diff --git a/src/pixmaps/flags_xpm/sd.xpm b/src/pixmaps/flags_xpm/sd.xpm new file mode 100644 index 00000000..4e8c9783 --- /dev/null +++ b/src/pixmaps/flags_xpm/sd.xpm @@ -0,0 +1,153 @@ +/* XPM */ +static const char *sd[] = { +/* columns rows colors chars-per-pixel */ +"16 11 136 2", +" c black", +". c #0B0B0B", +"X c #0F0F0E", +"o c #131313", +"O c #181919", +"+ c #1E1E1E", +"@ c #003D00", +"# c #232323", +"$ c gray16", +"% c #2C2C2C", +"& c gray18", +"* c #2F2F2F", +"= c #323232", +"- c #343434", +"; c #353535", +": c #393939", +"> c #3A3A3A", +", c gray24", +"< c #195F00", +"1 c #006D00", +"2 c #007900", +"3 c #007B00", +"4 c #007F00", +"5 c #3F463F", +"6 c gray26", +"7 c #464646", +"8 c #4B4B4B", +"9 c #505050", +"0 c #545455", +"q c #585858", +"w c #5D615D", +"e c #E90000", +"r c #EB0000", +"t c #ED0000", +"y c #EF0000", +"u c #F10000", +"i c #F30000", +"p c #F50000", +"a c #F70000", +"s c #F90000", +"d c #FB0000", +"f c #FD0000", +"g c red", +"h c #F62C2C", +"j c #F73131", +"k c #F83737", +"l c #F93C3D", +"z c #FA4242", +"x c #FB4747", +"c c #F74949", +"v c #F74E4E", +"b c #FC4C4C", +"n c #F85353", +"m c #FD5151", +"M c #F95757", +"N c #FD5454", +"B c #FE5959", +"V c #FA5C5C", +"C c #FC5E5C", +"Z c #FB6060", +"A c #FC6565", +"S c #FC6969", +"D c #FD6D6D", +"F c #FD7071", +"G c #FE7474", +"H c #FE7777", +"J c #FE7979", +"K c #FC7D7B", +"L c #008300", +"P c #008700", +"I c #008B00", +"U c #008F00", +"Y c #539F53", +"T c #49B549", +"R c #49B649", +"E c #4BB44B", +"W c #4FB74F", +"Q c #54A154", +"! c #5CA95C", +"~ c #53B953", +"^ c #54BC54", +"/ c #58BC58", +"( c #6EAC6F", +") c #70AF6B", +"_ c #62B162", +"` c #68B068", +"' c #78B271", +"] c #5CC25C", +"[ c #66C266", +"{ c #6AC36A", +"} c #6FC46F", +"| c #72C673", +" . c #76C876", +".. c #79C979", +"X. c #7BCF7A", +"o. c #90BF8A", +"O. c gray74", +"+. c #CBCBCB", +"@. c #CDCDCD", +"#. c gray81", +"$. c #E7C7C7", +"%. c #DEF2DE", +"&. c gray88", +"*. c #E1E1E1", +"=. c #E2E2E2", +"-. c gray89", +";. c #E4E4E4", +":. c #E6E6E6", +">. c #E7E7E7", +",. c #E9E9E9", +"<. c #E9EBE9", +"1. c gray92", +"2. c #F5E5E5", +"3. c #F6E6E6", +"4. c #F7E8E7", +"5. c #F6E8E8", +"6. c #F8E9E8", +"7. c #F9EAEA", +"8. c #FAEBEB", +"9. c #FBECEC", +"0. c #FBEFEE", +"q. c #FCEDED", +"w. c #FDEEEF", +"e. c #E0F4E4", +"r. c gray95", +"t. c #F3F3F3", +"y. c #F4F4F4", +"u. c #F4F5F5", +"i. c gray96", +"p. c #F6F6F6", +"a. c gray97", +"s. c #F8F8F8", +"d. c #F9F9F9", +"f. c #F8FAF9", +"g. c gray98", +"h. c #FBFBFB", +/* pixels */ +"< g g g g g d g d a a a u u y y ", +"U o.K J J G F D S A Z V M n v e ", +"I X.' C B N m b x z l k j h c e ", +"P ..] ) q.w.q.q.8.7.7.3.3.3.5.$.", +"P ./ ^ ( %.f.f.f.f.a.u.u.y.u.#.", +"L | ~ W R ! f.s.s.a.u.u.y.t.t.#.", +"4 } W R _ %.f.f.a.a.t.t.t.t.y.+.", +"3 { R Q <.1.<.>.:.;.-.-.-.&.-.O.", +"3 [ Y 5 > - * $ # + O o X . * ", +"1 ( w q 0 9 8 7 6 , > ; = * % ", +"@ " +}; diff --git a/src/pixmaps/flags_xpm/se.xpm b/src/pixmaps/flags_xpm/se.xpm new file mode 100644 index 00000000..1955ee7c --- /dev/null +++ b/src/pixmaps/flags_xpm/se.xpm @@ -0,0 +1,160 @@ +/* XPM */ +static const char *se[] = { +/* columns rows colors chars-per-pixel */ +"16 11 143 2", +" c #00001F", +". c #000021", +"X c #000025", +"o c #000027", +"O c #00002D", +"+ c #000033", +"@ c #000039", +"# c #00003B", +"$ c #00003D", +"% c #000041", +"& c #000047", +"* c #00004D", +"= c #000553", +"- c #000D59", +"; c #00135D", +": c #001963", +"> c #002169", +", c #00276D", +"< c #00276F", +"1 c #002D73", +"2 c #002F73", +"3 c #003375", +"4 c #00417F", +"5 c #E38700", +"6 c #E58B00", +"7 c #E78F00", +"8 c #EB9900", +"9 c #ED9D00", +"0 c #EDA100", +"q c #FDBB00", +"w c #FDBD00", +"e c #FDBF00", +"r c #FDC100", +"t c #F2C714", +"y c #F3C919", +"u c #F3C91A", +"i c #F4CA1F", +"p c #F4CB1F", +"a c #F4CB20", +"s c #F5CC24", +"d c #F5CC25", +"f c #F6CE2A", +"g c #F6CE2B", +"h c #F7D02E", +"j c #F7D02F", +"k c #F4CE36", +"l c #F7D030", +"z c #F8D234", +"x c #F8D235", +"c c #F8D236", +"v c #F4D03B", +"b c #F5D23F", +"n c #F9D33A", +"m c #F9D43A", +"M c #F9D43B", +"N c #F9D43C", +"B c #FAD53F", +"V c #FAD540", +"C c #FAD640", +"Z c #FAD641", +"A c #FBD745", +"S c #FBD746", +"D c #F7D64B", +"F c #FBD949", +"G c #FCD94B", +"H c #FCDA4F", +"J c #F8D850", +"K c #FDDB50", +"L c #FDDB51", +"P c #FDDC53", +"I c #F9D955", +"U c #FDDC54", +"Y c #FEDD58", +"T c #FEDD59", +"R c #FDE16F", +"E c #FDE271", +"W c #FEE273", +"Q c #FEE274", +"! c #FEE376", +"~ c #FEE477", +"^ c #004381", +"/ c #0B6795", +"( c #0F6A97", +") c #10659D", +"_ c #136C99", +"` c #18709C", +"' c #1E749F", +"] c #1469A0", +"[ c #196CA2", +"{ c #1F70A4", +"} c #2377A1", +"| c #2478A2", +" . c #267AA2", +".. c #2C7BA2", +"X. c #297BA4", +"o. c #2A7BA4", +"O. c #2B7CA5", +"+. c #2F7CA4", +"@. c #2F7DA4", +"#. c #2C7CA6", +"$. c #2F7FA8", +"%. c #327FA6", +"&. c #337BAB", +"*. c #3180A8", +"=. c #3181A9", +"-. c #3582A8", +";. c #3784AB", +":. c #3984A9", +">. c #3D86AC", +",. c #3C88AE", +"<. c #3D88AE", +"1. c #3F8AAF", +"2. c #428AAE", +"3. c #448CAF", +"4. c #5093AE", +"5. c #428BB0", +"6. c #428BB1", +"7. c #468DB0", +"8. c #448EB1", +"9. c #458EB2", +"0. c #478FB4", +"q. c #498FB1", +"w. c #4991B4", +"e. c #4E93B4", +"r. c #4C92B6", +"t. c #5396B7", +"y. c #5898B9", +"u. c #5899B9", +"i. c #5C9BBB", +"p. c #5D9DBC", +"a. c #5C9DBE", +"s. c #5F9FBF", +"d. c #619EBE", +"f. c #619FBE", +"g. c #5896C3", +"h. c #65A1C0", +"j. c #66A3C0", +"k. c #69A4C2", +"l. c #6AA5C3", +"z. c #6DA7C3", +"x. c #79AEC9", +"c. c #7BB0C9", +"v. c #7BB0CA", +/* pixels */ +"^ ^ ^ ^ w r w 3 2 , : : ; - = * ", +"^ v.v.x.! ! W z.l.f.d.a.u.t.e.& ", +"^ x.s.s.Y P P r.q.6.<.;.=.#.w.% ", +"4 x.a.g.P P G 4.6.>.;.=.O. .3.$ ", +"r ! U U P G S Z B z k g d p b 7 ", +"w W P H G S Z m z l f d p u v 6 ", +"q R H F S B m z l f d a u t k 5 ", +"2 l.w.9.B m z $.o. .{ [ _ ) &.$ ", +", j.9.<.n z h o.} ' ` _ ( / @.. ", +"> d.s.u.I J D 3.2.>.:.-.%.+.+. ", +": ; - = 0 9 8 $ @ + O o o " +}; diff --git a/src/pixmaps/flags_xpm/sg.xpm b/src/pixmaps/flags_xpm/sg.xpm new file mode 100644 index 00000000..9f236124 --- /dev/null +++ b/src/pixmaps/flags_xpm/sg.xpm @@ -0,0 +1,137 @@ +/* XPM */ +static const char *sg[] = { +/* columns rows colors chars-per-pixel */ +"16 11 120 2", +" c #C30000", +". c #C70000", +"X c #C90000", +"o c #CB0000", +"O c #CF0000", +"+ c #D30000", +"@ c #D70000", +"# c #D90000", +"$ c #DB0000", +"% c #DD0000", +"& c #DF0000", +"* c #E10000", +"= c #E30000", +"- c #E50000", +"; c #E70000", +": c #E90000", +"> c #EB0303", +", c #EB0909", +"< c #E32020", +"1 c #E52525", +"2 c #E62626", +"3 c #E62B2B", +"4 c #E72B2B", +"5 c #E72C2C", +"6 c #E73030", +"7 c #E83131", +"8 c #E83636", +"9 c #E93736", +"0 c #EA3737", +"q c #E43C3D", +"w c #E73F3F", +"e c #EA3B3C", +"r c #EA3C3C", +"t c #EB3C3D", +"y c #E64141", +"u c #E74545", +"i c #EB4141", +"p c #EC4142", +"a c #EC4242", +"s c #E84444", +"d c #EC4646", +"f c #ED4747", +"g c #EA4949", +"h c #E94A4A", +"j c #EB4E4E", +"k c #EA4F4F", +"l c #EC5353", +"z c #EF5353", +"x c #EB5454", +"c c #ED5757", +"v c #E85858", +"b c #EC5959", +"n c #EE5C5C", +"m c #EE5D5D", +"M c #F15959", +"N c #F0595A", +"B c #F05A5A", +"V c #EF6161", +"C c #F06060", +"Z c #F06565", +"A c #F06566", +"S c #F16969", +"D c #F26D6D", +"F c #F17273", +"G c #F27272", +"H c #F47272", +"J c #F27878", +"K c #F58787", +"L c #F38889", +"P c #F68989", +"I c #F6A2A2", +"U c #F6A5A5", +"Y c #F8B3B3", +"T c #F8B4B4", +"R c #F8B6B6", +"E c #F8BABA", +"W c #F9BDBD", +"Q c #DBCFCF", +"! c #DDCFCF", +"~ c #DDD1D1", +"^ c #DDD3D3", +"/ c #F7C9C9", +"( c #FBCACA", +") c #F8CDCD", +"_ c #E1D3D3", +"` c #E1D5D5", +"' c #E3D7D7", +"] c #E5D9D9", +"[ c #E7DBDB", +"{ c #E9DDDD", +"} c #EBDFDF", +"| c #FCDCDC", +" . c #EDE3E1", +".. c #EFE5E5", +"X. c #F1E7E7", +"o. c #F3E9E9", +"O. c #F5EBEB", +"+. c #F5EDED", +"@. c #F7EFEF", +"#. c #FCEEEE", +"$. c #F1F1F1", +"%. c gray95", +"&. c #F2F2F3", +"*. c #F3F3F3", +"=. c #F4F4F4", +"-. c gray96", +";. c #F6F6F6", +":. c gray97", +">. c #F9F1F1", +",. c #FBF1F1", +"<. c #FDF2F2", +"1. c #FEF5F5", +"2. c #FEF6F6", +"3. c #F8F8F8", +"4. c #F9F9F9", +"5. c gray98", +"6. c #FBFBFB", +"7. c #FBFCFB", +"8. c gray99", +"9. c #FDFDFD", +/* pixels */ +": ; , : ; ; = = = % % $ $ @ + + ", +"; ( 2.R P T U D S V C n c l j O ", +": 2.W H E B J L g a t 0 6 5 g o ", +"; <.| B F ) / f a t 0 7 5 1 u o ", +"; T #.I b z d i t 8 6 3 1 < w ", +": K F F A C n b x k g u y q v . ", +",.7.7.8.8.5.4.3.:.:.=.*.*.*.=._ ", +",.7.8.8.5.5.3.:.:.=.*.*.*.*.*.^ ", +"@.8.5.5.3.3.:.:.=.=.*.*.$.$.*.Q ", +"+.5.5.5.3.3.:.:.:.=.*.*.*.*.+.Q ", +"O.o..... . .{ [ ] ' ^ ' ~ Q Q Q " +}; diff --git a/src/pixmaps/flags_xpm/sh.xpm b/src/pixmaps/flags_xpm/sh.xpm new file mode 100644 index 00000000..ab610b10 --- /dev/null +++ b/src/pixmaps/flags_xpm/sh.xpm @@ -0,0 +1,180 @@ +/* XPM */ +static const char *sh[] = { +/* columns rows colors chars-per-pixel */ +"16 11 163 2", +" c #00002B", +". c #00002F", +"X c #000033", +"o c #000035", +"O c #000039", +"+ c #00003B", +"@ c #00003F", +"# c #000041", +"$ c #000045", +"% c #000047", +"& c #00004B", +"* c #00004D", +"= c #000051", +"- c #000053", +"; c #000057", +": c #00005B", +"> c #000061", +", c #000065", +"< c #000067", +"1 c #00006D", +"2 c #00006F", +"3 c #000073", +"4 c #000075", +"5 c #000079", +"6 c #00007B", +"7 c #00007F", +"8 c #A1052F", +"9 c #C10015", +"0 c #C9051F", +"q c #FF0703", +"w c #E10715", +"e c #C11733", +"r c #E52D39", +"t c #8E7868", +"y c #937C6F", +"u c #E8616A", +"i c #FE6765", +"p c #FC6666", +"a c #FE6968", +"s c #FC6D6D", +"d c #FB706F", +"f c #FD716F", +"g c #EC757B", +"h c #FE7975", +"j c #F07B7F", +"k c #FE7D7C", +"l c #5C933A", +"z c #608F3A", +"x c #5C9143", +"c c #659165", +"v c #CCAD37", +"b c #D1B13A", +"n c #D3B43E", +"m c #BAA24A", +"M c #BFAA52", +"N c #9E8361", +"B c #CFB140", +"V c #D2B444", +"C c #C2AC57", +"Z c #000083", +"A c #000085", +"S c #132E97", +"D c #17329E", +"F c #203A9F", +"G c #1B36A1", +"H c #253EA1", +"J c #2A43A3", +"K c #2B44A4", +"L c #334AA4", +"P c #3048A6", +"I c #3049A6", +"U c #354CA6", +"Y c #364DA6", +"T c #3149A9", +"R c #324AA9", +"E c #354DA9", +"W c #364DA9", +"Q c #364EA9", +"! c #314BAF", +"~ c #354BAD", +"^ c #354FAD", +"/ c #354EAF", +"( c #384FA8", +") c #3950A8", +"_ c #3C52A9", +"` c #3D53A9", +"' c #3D51AA", +"] c #3B52AC", +"[ c #3D53AC", +"{ c #3C53AD", +"} c #3F56AD", +"| c #374EB1", +" . c #3F56B1", +".. c #3D55B4", +"X. c #4257AB", +"o. c #4056AC", +"O. c #4057AE", +"+. c #4157AF", +"@. c #4B57AF", +"#. c #4359AE", +"$. c #475DAF", +"%. c #4258B1", +"&. c #4259B1", +"*. c #455CB1", +"=. c #465CB1", +"-. c #465EB4", +";. c #475EB4", +":. c #455FB6", +">. c #485DB2", +",. c #4C61B2", +"<. c #4B60B4", +"1. c #4B62B4", +"2. c #4F62B5", +"3. c #4963B9", +"4. c #5161B3", +"5. c #5065B3", +"6. c #5065B4", +"7. c #5065B7", +"8. c #5569B6", +"9. c #5569B7", +"0. c #5569B8", +"q. c #596DB9", +"w. c #5A6DB9", +"e. c #5C6FBC", +"r. c #5F71BB", +"t. c #6073BE", +"y. c #6375BE", +"u. c #6579BF", +"i. c #7D77B5", +"p. c #677AC0", +"a. c #6A7CC2", +"s. c #6C7DC2", +"d. c #6D7FC3", +"f. c #6A7DC5", +"g. c #B86482", +"h. c #BA6482", +"j. c #C26B85", +"k. c #C86A80", +"l. c #E07582", +"z. c #7081C4", +"x. c #7184C7", +"c. c #7B85C3", +"v. c #8F8ABD", +"b. c #EB868C", +"n. c #FD8684", +"m. c #FE8B8B", +"M. c #F19499", +"N. c #F7999B", +"B. c #F8A0A3", +"V. c #F0A4AA", +"C. c #F9A9AB", +"Z. c #F2AEB3", +"A. c #8497C6", +"S. c #8C9DC8", +"D. c #8B9DD3", +"F. c #9AA6D4", +"G. c #A0ADD9", +"H. c #ADB9DE", +"J. c #B2BCDF", +"K. c #B9C1E2", +"L. c #CDC9E2", +"P. c #CCD4E4", +"I. c #CDD2E9", +/* pixels */ +"r c.! w 9 ~ i.e Z 5 4 2 2 < > < ", +"@.C.I.N.M.L.Z.G.d.a.u.t.e.w.8.= ", +"q m.h a i d p u 2.:.#.X.` R 5.= ", +"0 B.k s d n.g k.>...C V B m =.& ", +"4.V.J.j l.H.b.v. .| M n b v &.% ", +"8 K.D.j.h.f.F.h.` ^ N S.P.A.+.# ", +"A x.0.3.:.=.{ ^ W R y t l c ` + ", +"7 z.7.<.=.+.] W P K <.z x } ) o ", +"7 a.<.=.} ] E L K H F G D S Y X ", +"3 p.p.r.w.0.2.,.=.#.` _ ) Y L ", +"4 2 < : : : = * % # @ + o X . + " +}; diff --git a/src/pixmaps/flags_xpm/si.xpm b/src/pixmaps/flags_xpm/si.xpm new file mode 100644 index 00000000..a849eb4f --- /dev/null +++ b/src/pixmaps/flags_xpm/si.xpm @@ -0,0 +1,166 @@ +/* XPM */ +static const char *si[] = { +/* columns rows colors chars-per-pixel */ +"16 11 149 2", +" c #3F0000", +". c #850015", +"X c #DD0000", +"o c #DF0000", +"O c #E10000", +"+ c #E30000", +"@ c #E50000", +"# c #E70000", +"$ c #E90000", +"% c #EB0000", +"& c #ED0000", +"* c #EF0000", +"= c #F10000", +"- c #F30000", +"; c #F50000", +": c #F70000", +"> c #F90000", +", c #F10B0B", +"< c #F10F0E", +"1 c #F21313", +"2 c #F31919", +"3 c #F41E1E", +"4 c #F52323", +"5 c #F62929", +"6 c #F22C2C", +"7 c #F22F2F", +"8 c #F72E2E", +"9 c #F23232", +"0 c #F33535", +"q c #F83434", +"w c #F43939", +"e c #F53D3D", +"r c #F93A3A", +"t c #FA3F3F", +"y c #9E1650", +"u c #A11B53", +"i c #A31F57", +"p c #A5255B", +"a c #A8295F", +"s c #AB2F63", +"d c #AE3468", +"f c #AC3769", +"g c #B0396C", +"h c #B33F70", +"j c #B54474", +"k c #B84A78", +"l c #BA4E7C", +"z c #F64242", +"x c #F74646", +"c c #FA4444", +"v c #F74B4B", +"b c #F85050", +"n c #F95455", +"m c #F95858", +"M c #FA5D5D", +"N c #FB6162", +"B c #FC6666", +"V c #000081", +"C c #000083", +"Z c #000085", +"A c #000097", +"S c #0000B5", +"D c #0000B7", +"F c #0000B9", +"G c #0311C3", +"H c #1426C3", +"J c #1A28C1", +"K c #1F2EC3", +"L c #192BC6", +"P c #1F30C7", +"I c #202CC1", +"U c #2531C4", +"Y c #2533C5", +"T c #2B37C6", +"R c #2A38C7", +"E c #2435CA", +"W c #2A3ACB", +"Q c #303CC8", +"! c #303DC9", +"~ c #2F40CD", +"^ c #3641CA", +"/ c #3643CB", +"( c #3645CB", +") c #3544CF", +"_ c #3B47C9", +"` c #3B47CC", +"' c #3F4AC9", +"] c #3B48CD", +"[ c #3B49D0", +"{ c #414CCE", +"} c #404ECF", +"| c #4B50CD", +" . c #4F58CE", +".. c #404ED2", +"X. c #464FD0", +"o. c #454FD3", +"O. c #4650D0", +"+. c #4954D5", +"@. c #4F5CD7", +"#. c #535CD0", +"$. c #5861D2", +"%. c #5D65D4", +"&. c #787ACE", +"*. c #6169D6", +"=. c #676FD5", +"-. c #666DD7", +";. c #6A72D9", +":. c #6E76DB", +">. c #6F7ADF", +",. c #757CD1", +"<. c #7077DB", +"1. c #727CDD", +"2. c #767DDD", +"3. c #A65F9A", +"4. c #AA649D", +"5. c #9659A3", +"6. c #C86F94", +"7. c #7C83DE", +"8. c #F3AFB5", +"9. c #F4B2B9", +"0. c #868CE1", +"q. c #8D92E2", +"w. c #9399E5", +"e. c #E1E3E3", +"r. c gray90", +"t. c #E7E7E7", +"y. c #E9E9E9", +"u. c gray92", +"i. c gray93", +"p. c #EFEFEF", +"a. c #E0E0F4", +"s. c #F1EEF6", +"d. c #F1F1F1", +"f. c #F3F3F3", +"g. c gray96", +"h. c #F6F6F6", +"j. c gray97", +"k. c #F6F7FB", +"l. c #F6F6FC", +"z. c #F8F8F8", +"x. c #F9F9F9", +"c. c gray98", +"v. c #FBFBFB", +"b. c #FDFBFB", +"n. c gray99", +"m. c #FDFDFD", +"M. c #FDFDFE", +"N. c #FEFEFF", +"B. c gray100", +/* pixels */ +"g.g.g.g.f.f.f.f.i.i.i.u.u.u.r.e.", +"g.B.B.l.k.B.B.b.v.B.n.v.z.g.g.u.", +"g.B.q.,.&.b.B.n.v.v.z.g.z.g.g.u.", +"G w.0.a.7.:.:.;.-.*.%.$.#. .-.A ", +"D 2.9.s.8.| O.{ ' ^ W T U I ' V ", +"D 1.5.4.3.X...` / ! T Y K J _ V ", +"D >.@.+.X.[ [ ) W W E K L H ( Z ", +". 6.l k j h g g s s p p u y f ", +"> B c t r q 8 5 4 3 2 1 < , 7 o ", +": N M m n b v x z e w 0 9 7 6 o ", +": = = & & & $ $ $ @ + + o X X X " +}; diff --git a/src/pixmaps/flags_xpm/sj.xpm b/src/pixmaps/flags_xpm/sj.xpm new file mode 100644 index 00000000..aaeefa0d --- /dev/null +++ b/src/pixmaps/flags_xpm/sj.xpm @@ -0,0 +1,142 @@ +/* XPM */ +static const char *sj[] = { +/* columns rows colors chars-per-pixel */ +"16 11 125 2", +" c #B10000", +". c #B50000", +"X c #B90000", +"o c #BB0000", +"O c #BD0000", +"+ c #BF0000", +"@ c #C30000", +"# c #C50000", +"$ c #C90000", +"% c #CB0000", +"& c #CF0000", +"* c #D10000", +"= c #D50000", +"- c #D70000", +"; c #D90000", +": c #DB0000", +"> c #DD0000", +", c #DA0E0B", +"< c #DC110E", +"1 c #DC1210", +"2 c #DD1613", +"3 c #DD1714", +"4 c #DF1B19", +"5 c #DF1C19", +"6 c #E10000", +"7 c #E0211E", +"8 c #E0211F", +"9 c #DE2E2C", +"0 c #E12623", +"q c #E22724", +"w c #E22926", +"e c #E22B29", +"r c #E22C2A", +"t c #E42E2B", +"y c #E42E2C", +"u c #E0312F", +"i c #E4302E", +"p c #E4312F", +"a c #E03432", +"s c #E03532", +"d c #E53431", +"f c #E23735", +"g c #E63734", +"h c #E73936", +"j c #E73A37", +"k c #E23B39", +"l c #E83E3C", +"z c #E83F3D", +"x c #E4403D", +"c c #E44442", +"v c #E64644", +"b c #E94342", +"n c #E94442", +"m c #EA4644", +"M c #E64946", +"N c #EA4947", +"B c #EB4947", +"V c #E74B49", +"C c #E74C4B", +"Z c #EB4B49", +"A c #EB4E4B", +"S c #EB4E4C", +"D c #E8504E", +"F c #EC5251", +"G c #E95553", +"H c #EB5A57", +"J c #EF5D5C", +"K c #EC5E5C", +"L c #EC5F5D", +"P c #F0615F", +"I c #ED6360", +"U c #ED6462", +"Y c #EE6765", +"T c #EE6866", +"R c #EF6B69", +"E c #EF6D6A", +"W c #EF6F6D", +"Q c #F07271", +"! c #F27A79", +"~ c #F27D7A", +"^ c #F27D7B", +"/ c #0000A5", +"( c #001DB7", +") c #0353CF", +"_ c #0959D1", +"` c #4B83D5", +"' c #5086D7", +"] c #548AD8", +"[ c #598DD9", +"{ c #5D90DB", +"} c #6594DA", +"| c #6294DD", +" . c #6596DE", +".. c #6697DE", +"X. c #6A99E0", +"o. c #6B9AE0", +"O. c #6F9CE1", +"+. c #6F9DE1", +"@. c #739FE3", +"#. c #77A3E4", +"$. c #7AA4E2", +"%. c #7AA5E5", +"&. c #7BA6E5", +"*. c #7EA8E7", +"=. c #92B6EA", +"-. c #95B9EB", +";. c gray89", +":. c #E7E7E7", +">. c gray93", +",. c #EFEFEF", +"<. c gray95", +"1. c #F3F3F3", +"2. c #F4F4F4", +"3. c gray96", +"4. c #F6F6F6", +"5. c gray97", +"6. c #F8F8F8", +"7. c #F9F9F9", +"8. c gray98", +"9. c #FBFBFB", +"0. c #FBFCFB", +"q. c gray99", +"w. c #FDFDFD", +"e. c #FEFEFE", +"r. c gray100", +/* pixels */ +"6 6 6 r._ r.: : : - - = & & % % ", +"6 ^ ^ r.=.r.Q W R Y P L H G D @ ", +"> ! P r.*.r.F A B b z h d y V @ ", +"6 ! J r.$.r.A B b l h d t w v + ", +"r.r.r.0.#.q.w.9.9.6.6.3.3.3.3.:.", +") =.%.#.@.+.....| { [ ] ` ` } / ", +"9.r.9.9.O.9.9.6.3.3.3.3.1.1.3.;.", +": E Z 9...9.d p t q 8 5 3 1 s . ", +": T n 9...6.p e 0 7 4 1 < , u ", +"- U L 9.$.6.C M c x k f s a 9 ", +"= & & >.( >.@ + + X X . . " +}; diff --git a/src/pixmaps/flags_xpm/sk.xpm b/src/pixmaps/flags_xpm/sk.xpm new file mode 100644 index 00000000..01a7f539 --- /dev/null +++ b/src/pixmaps/flags_xpm/sk.xpm @@ -0,0 +1,169 @@ +/* XPM */ +static const char *sk[] = { +/* columns rows colors chars-per-pixel */ +"16 11 152 2", +" c #8D0000", +". c #BF0000", +"X c #DD0000", +"o c #DF0000", +"O c #E10000", +"+ c #E30000", +"@ c #E50000", +"# c #E70000", +"$ c #E90000", +"% c #EB0000", +"& c #ED0000", +"* c #EF0000", +"= c #F10000", +"- c #F30000", +"; c #F50000", +": c #F70000", +"> c #F90000", +", c #F10B0B", +"< c #F10F0E", +"1 c #F21313", +"2 c #F31919", +"3 c #F41E1E", +"4 c #C7233F", +"5 c #F52323", +"6 c #F62929", +"7 c #F22C2C", +"8 c #F22F2F", +"9 c #F72E2E", +"0 c #F23232", +"q c #F33535", +"w c #F43939", +"e c #F53D3D", +"r c #C92843", +"t c #CA2C48", +"y c #CC314B", +"u c #CE3650", +"i c #D03B55", +"p c #CE435B", +"a c #D24059", +"s c #F64242", +"d c #F74646", +"f c #FA4444", +"g c #F74B4B", +"h c #F85050", +"j c #F95455", +"k c #F7585B", +"l c #F95858", +"z c #F95A5A", +"x c #FA5A5B", +"c c #FA5D5D", +"v c #FB6162", +"b c #FE6361", +"n c #FC6560", +"m c #FC6666", +"M c #EF6972", +"N c #F16C74", +"B c #FA7472", +"V c #F3747C", +"C c #F17B7F", +"Z c #00009D", +"A c #0000A3", +"S c #0003B5", +"D c #001FC9", +"F c #001FCF", +"G c #0323C9", +"H c #3E57CF", +"J c #3855D2", +"K c #3C59D4", +"L c #3F59D9", +"P c #425ACF", +"I c #435AD1", +"U c #405DD6", +"Y c #485ED1", +"T c #485ED2", +"R c #4561D7", +"E c #4C63D3", +"W c #4D63D4", +"Q c #4A65D8", +"! c #4D69DB", +"~ c #5166D4", +"^ c #5167D6", +"/ c #566AD6", +"( c #5B6FD5", +") c #526CD9", +"_ c #546ED8", +"` c #566EDA", +"' c #5E71D5", +"] c #5973DD", +"[ c #6B6ECE", +"{ c #6B75D5", +"} c #6076DD", +"| c #7078D4", +" . c #7D7ED2", +".. c #E1778A", +"X. c #E17F8E", +"o. c #8675C3", +"O. c #7687DB", +"+. c #7A8ADD", +"@. c #7E8EDF", +"#. c #FD8584", +"$. c #FB8986", +"%. c #F48B8F", +"&. c #E68694", +"*. c #F48B91", +"=. c #F58F94", +"-. c #F69096", +";. c #F69EA2", +":. c #F0ADB3", +">. c #8997DF", +",. c #8291E0", +"<. c #8594E2", +"1. c #8898E4", +"2. c #8298E9", +"3. c #8399EB", +"4. c #849BEC", +"5. c #909AE1", +"6. c #ACB7EE", +"7. c #E0B3C3", +"8. c #D7C2D9", +"9. c #D2C1DD", +"0. c #DDC5D8", +"q. c #FDCDCC", +"w. c #E7DDDF", +"e. c #FCDEDE", +"r. c #FDDEDE", +"t. c #EBE1E3", +"y. c #EDE3E5", +"u. c #EFE5E5", +"i. c #FCE2E1", +"p. c #F1E7E9", +"a. c #F3E9EB", +"s. c #F5EBED", +"d. c #F5EDEF", +"f. c #F7EFEF", +"g. c #FDEDEC", +"h. c #F9EFF1", +"j. c #F6F6F6", +"k. c gray97", +"l. c #FBF1F3", +"z. c #FBF3F3", +"x. c #FDF3F3", +"c. c #FDF5F5", +"v. c #FDF5F7", +"b. c #F8F8F8", +"n. c #F9F9F9", +"m. c gray98", +"M. c #FBFBFB", +"N. c gray99", +"B. c #FDFDFD", +"V. c #FDFDFE", +"C. c #FEFEFE", +"Z. c gray100", +/* pixels */ +"v.v.c.c.c.c.z.l.f.f.d.s.a.p.u.y.", +"v.Z.Z.Z.B.B.B.B.N.B.m.m.m.b.k.t.", +"v.Z.;.=.-.%.%.c.N.b.b.b.k.k.k.w.", +"K 6.V b r.#.z 5.1.>.,.@.+.O.>.S ", +"G 4.N q.g.i.k O._ / ~ E Y P ( Z ", +"D 4.M n e.$.l | _ ~ W T I H ( Z ", +"F @.9. .{ [ 7.] ! Q R U K J _ A ", +"X ..&.9.' 8.&.a i u y t r 4 p ", +"> m f B :...9 6 5 3 2 1 < , 8 X ", +"; v c z j h g d s e w q 0 8 7 X ", +"; - - - ; & & $ $ @ + + X X X X " +}; diff --git a/src/pixmaps/flags_xpm/sl.xpm b/src/pixmaps/flags_xpm/sl.xpm new file mode 100644 index 00000000..5dc5756e --- /dev/null +++ b/src/pixmaps/flags_xpm/sl.xpm @@ -0,0 +1,154 @@ +/* XPM */ +static const char *sl[] = { +/* columns rows colors chars-per-pixel */ +"16 11 137 2", +" c #000079", +". c #00007B", +"X c #00007D", +"o c #00007F", +"O c #009B00", +"+ c #009F00", +"@ c #00A300", +"# c #00A700", +"$ c #00AB00", +"% c #00AF00", +"& c #00B100", +"* c #00B300", +"= c #00B500", +"- c #00B700", +"; c #00B900", +": c #00BD00", +"> c #00C100", +", c #00C300", +"< c #38D038", +"1 c #3DD23D", +"2 c #3DD93D", +"3 c #42D442", +"4 c #48D648", +"5 c #4DD74D", +"6 c #53D753", +"7 c #52D952", +"8 c #57DB57", +"9 c #58D858", +"0 c #5BDC5B", +"q c #5CDA5C", +"w c #5EDE5E", +"e c #61DB60", +"r c #62DE62", +"t c #65DD65", +"y c #6ADD6A", +"u c #6DDB6D", +"i c #6EDF6E", +"p c #71DC71", +"a c #76DE75", +"s c #79DF79", +"d c #66E066", +"f c #68E169", +"g c #72E172", +"h c #75E275", +"j c #79E37A", +"k c #7BE37B", +"l c #7DE17D", +"z c #7FE57F", +"x c #000083", +"c c #000087", +"v c #000089", +"b c #00008D", +"n c #000091", +"m c #000095", +"M c #000099", +"N c #00009D", +"B c #0000A1", +"V c #0000A5", +"C c #0000A7", +"Z c #0000A9", +"A c #0000AB", +"S c #0000AF", +"D c #0B0BBF", +"F c #0F0FC1", +"G c #1313C3", +"H c #1819C5", +"J c #1E1EC7", +"K c #2323C8", +"L c #2929CA", +"P c #2C2CC8", +"I c #2F2FC8", +"U c #2E2ECC", +"Y c #3232C9", +"T c #3535CB", +"R c #3434CE", +"E c #3939CD", +"W c #3D3DCE", +"Q c #2D2DD1", +"! c #3A3AD0", +"~ c #3F3FD2", +"^ c #4242CF", +"/ c #4646D1", +"( c #4444D4", +") c #4B4BD3", +"_ c #5050D4", +"` c #5454D6", +"' c #5858D8", +"] c #5D5DD9", +"[ c #6363D5", +"{ c #6666D6", +"} c #6A6AD7", +"| c #6161DB", +" . c #6666DD", +".. c #6E6ED9", +"X. c #7171DB", +"o. c #7575DD", +"O. c #7A7ADB", +"+. c #7978DE", +"@. c #7C7CE0", +"#. c #82DF81", +"$. c #81E281", +"%. c #80E680", +"&. c #83E683", +"*. c #85E485", +"=. c #88E588", +"-. c #8CE68C", +";. c #8EE88E", +":. c #91E891", +">. c #94E994", +",. c #A7EDA7", +"<. c #8080E1", +"1. c #8484E3", +"2. c #8888E4", +"3. c #8B8BE6", +"4. c #A0A0EA", +"5. c #D3D3DF", +"6. c #D5D5E1", +"7. c #D7D7E3", +"8. c gray95", +"9. c #F3F3F3", +"0. c #F4F4F4", +"q. c #F4F5F5", +"w. c gray96", +"e. c #F6F6F6", +"r. c gray97", +"t. c #F1F1F9", +"y. c #F3F3FB", +"u. c #F5F5FB", +"i. c #F8F8F8", +"p. c #F9F9F9", +"a. c gray98", +"s. c #FBFBFB", +"d. c #FBFCFB", +"f. c gray99", +"g. c #FDFCFD", +"h. c #FDFDFD", +"j. c #FEFEFE", +/* pixels */ +", , , , , , : : - - & & % $ # @ ", +", &.&.&.z k k h g i y t e q 9 + ", +", &.d d r w 0 8 7 5 4 3 1 < 6 O ", +"2 ,.>.:.-.-.=.&.&.s s a p u #.- ", +"u.j.d.d.j.d.s.s.i.i.u.w.w.w.w.7.", +"y.j.d.g.d.g.s.p.i.i.w.w.w.9.0.6.", +"y.g.g.g.g.s.s.s.i.w.w.9.9.9.0.5.", +"U 4.3.2.1.@.+.+.o.X...} { [ O.C ", +"S .( ~ E R U L K J H G G D I ", +"A | ] ' ` _ ) / ^ W E T Y I P ", +"A C B N M m n b v c x o o " +}; diff --git a/src/pixmaps/flags_xpm/sm.xpm b/src/pixmaps/flags_xpm/sm.xpm new file mode 100644 index 00000000..c88a1bc2 --- /dev/null +++ b/src/pixmaps/flags_xpm/sm.xpm @@ -0,0 +1,151 @@ +/* XPM */ +static const char *sm[] = { +/* columns rows colors chars-per-pixel */ +"16 11 134 2", +" c #558D48", +". c #75A265", +"X c #75A466", +"o c #BFAC58", +"O c #9B9269", +"+ c #AF9D64", +"@ c #92B071", +"# c #9CB974", +"$ c #BDAB68", +"% c #DFB65B", +"& c #DAB25F", +"* c #C2B160", +"= c #C1B96A", +"- c #E9CD6E", +"; c #E9CE70", +": c #406D9E", +"> c #47739F", +", c #001FDD", +"< c #0021DD", +"1 c #0021DF", +"2 c #0025DF", +"3 c #0027DF", +"4 c #0029E1", +"5 c #002BE3", +"6 c #002DE3", +"7 c #002FE5", +"8 c #0033E5", +"9 c #0039E7", +"0 c #003DE9", +"q c #0041EB", +"w c #0047ED", +"e c #004DED", +"r c #0053EF", +"t c #0059F1", +"y c #005DF3", +"u c #0063F5", +"i c #0069F7", +"p c #006FF9", +"a c #0073FB", +"s c #0077FD", +"d c #007BFD", +"f c #3895F1", +"g c #3C97F1", +"h c #3D97F2", +"j c #4893D5", +"k c #659DD3", +"l c #6AACD2", +"z c #4099F2", +"x c #4199F2", +"c c #419AF2", +"v c #459CF3", +"b c #459DF3", +"n c #469CF3", +"m c #459EF3", +"M c #4A9FF4", +"N c #4FA2F5", +"B c #53A2F2", +"V c #55A4F2", +"C c #56A4F2", +"Z c #58A5F3", +"A c #59A6F3", +"S c #5BA8F3", +"D c #5CA8F4", +"F c #5FA9F4", +"G c #59A9F8", +"H c #7EB3E1", +"J c #60AAF5", +"K c #61ACF5", +"L c #65AEF6", +"P c #60ACF9", +"I c #64AFFA", +"U c #65AFFA", +"Y c #68B0F7", +"T c #6CB2F7", +"R c #69B1FA", +"E c #69B2FB", +"W c #6DB4FB", +"Q c #6DB5FB", +"! c #6EB5FC", +"~ c #71B4F8", +"^ c #75B7F9", +"/ c #71B7FC", +"( c #72B7FC", +") c #76B9FD", +"_ c #79B9F9", +"` c #7DBCFA", +"' c #8EB881", +"] c #90A9AD", +"[ c #86BCB3", +"{ c #91C1B4", +"} c #DDC895", +"| c #E2D09E", +" . c #80BEFB", +".. c #A3CCD2", +"X. c #8AC0F4", +"o. c #84C0FC", +"O. c #88C3FC", +"+. c #8BC4FD", +"@. c #8EC6FE", +"#. c #94C6F7", +"$. c #D5DBE7", +"%. c #D7DFE7", +"&. c #D9E1E9", +"*. c #DDE3EB", +"=. c #DDE7EF", +"-. c #DFE7EF", +";. c #E3E9F1", +":. c #E5EBF3", +">. c #E7EDF5", +",. c #E9EFF7", +"<. c #EBF1F9", +"1. c #EDF1FB", +"2. c #EDF3FD", +"3. c #EFF5FD", +"4. c #F4F4F4", +"5. c gray96", +"6. c #F6F6F6", +"7. c gray97", +"8. c #F1F7FD", +"9. c #F1F7FF", +"0. c #F1F9FF", +"q. c #F8F8F8", +"w. c #F9F9F9", +"e. c #FAFAF8", +"r. c #FBFBF8", +"t. c #FAFAF9", +"y. c gray98", +"u. c #FBFBFB", +"i. c gray99", +"p. c #FDFCFD", +"a. c #FDFDFD", +"s. c #FDFDFE", +"d. c #FEFEFE", +"f. c gray100", +/* pixels */ +"0.9.9.9.3.3.3.2.1.<.,.>.:.;.-.-.", +"9.f.f.f.f.f.f.u.f.u.u.u.q.q.7.*.", +"3.f.f.f.f.p.f.r.e.u.q.q.7.7.7.&.", +"9.f.u.f.r.f.e.; - q.7.7.7.4.7.%.", +"9.f.f.i.i.' | % & } . 7.4.4.4.$.", +"d @.) / Q ..$ { [ + ] N M v F 7 ", +"s +./ Q R X = # @ O M v x F 5 ", +"a O.W R U l H * o k j b x h Z 4 ", +"p O.R U F G #.> : .N g g f V < ", +"i ` ` _ ) ~ T Y L L F F C V B < ", +"u y t r e w q 0 9 8 3 3 2 < < , " +}; diff --git a/src/pixmaps/flags_xpm/sn.xpm b/src/pixmaps/flags_xpm/sn.xpm new file mode 100644 index 00000000..24383be1 --- /dev/null +++ b/src/pixmaps/flags_xpm/sn.xpm @@ -0,0 +1,169 @@ +/* XPM */ +static const char *sn[] = { +/* columns rows colors chars-per-pixel */ +"16 11 152 2", +" c #004D00", +". c #005300", +"X c #005900", +"o c #005D00", +"O c #006300", +"+ c #006900", +"@ c #006F00", +"# c #007300", +"$ c #007700", +"% c #007B00", +"& c #007D00", +"* c #007F00", +"= c #DD0000", +"- c #DF0000", +"; c #E10000", +": c #E30000", +"> c #E50000", +", c #E70000", +"< c #E90000", +"1 c #EB0000", +"2 c #ED0000", +"3 c #EF0000", +"4 c #F10000", +"5 c #F30000", +"6 c #F50000", +"7 c #F10B0B", +"8 c #F10F0E", +"9 c #F21010", +"0 c #F21313", +"q c #F21414", +"w c #F31919", +"e c #F31A1A", +"r c #F41F1F", +"t c #F42020", +"y c #F52525", +"u c #F52626", +"i c #F62B2B", +"p c #F22C2C", +"a c #F22F2F", +"s c #F62C2C", +"d c #F23232", +"f c #F33232", +"g c #F73131", +"h c #F33535", +"j c #F43636", +"k c #F83737", +"l c #F43B3B", +"z c #F53F3F", +"x c #F64444", +"c c #F74949", +"v c #F74E4E", +"b c #F85353", +"n c #F95757", +"m c #FA5C5C", +"M c #008100", +"N c #3AAC3A", +"B c #3FAF3F", +"V c #40AF3F", +"C c #48B136", +"Z c #55B63B", +"A c #44B144", +"S c #45B245", +"D c #49B449", +"F c #49B549", +"G c #4BB54B", +"H c #4FB74F", +"J c #50B750", +"K c #54B755", +"L c #53B953", +"P c #54B954", +"I c #54BA54", +"U c #58B958", +"Y c #58BC58", +"T c #58BC59", +"R c #59BC59", +"E c #5CBD5C", +"W c #5DBC5D", +"Q c #5CBE5C", +"! c #5FBF5F", +"~ c #61BE62", +"^ c #66C066", +"/ c #6AC36A", +"( c #6FC46F", +") c #72C673", +"_ c #76C876", +"` c #77C877", +"' c #79C879", +"] c #79C979", +"[ c #7BCA7A", +"{ c #7BCA7B", +"} c #82C82F", +"| c #8CCE35", +" . c #97D13C", +".. c #B1DE30", +"X. c #E3D100", +"o. c #E5D700", +"O. c #E7D900", +"+. c #E9DB00", +"@. c #EBDD00", +"#. c #F7D700", +"$. c #F9DB00", +"%. c #FBDD00", +"&. c #FBDF00", +"*. c #FDDF00", +"=. c #FDE100", +"-. c #F3F119", +";. c #F4F21F", +":. c #F4F41E", +">. c #EFF62A", +",. c #F5F523", +"<. c #F3F524", +"1. c #F5F424", +"2. c #F6F629", +"3. c #F6F52B", +"4. c #F6F62A", +"5. c #F7F72E", +"6. c #F7F72F", +"7. c #E7F336", +"8. c #F7F630", +"9. c #F8F736", +"0. c #F7F834", +"q. c #F8F834", +"w. c #F4F239", +"e. c #F5F53D", +"r. c #F8F93A", +"t. c #F9F93A", +"y. c #F9F93C", +"u. c #F9F83D", +"i. c #9ED441", +"p. c #C3E440", +"a. c #EFF646", +"s. c #F6F642", +"d. c #F7F746", +"f. c #F9F940", +"g. c #F8FA42", +"h. c #FAFA42", +"j. c #FAFA46", +"k. c #FBFB47", +"l. c #F7F74B", +"z. c #FAFB4B", +"x. c #FCFC4B", +"c. c #FCFC4C", +"v. c #F7F750", +"b. c #FBFC51", +"n. c #FDFD51", +"m. c #FCFC54", +"M. c #FCF265", +"N. c #FBFA60", +"B. c #FCF469", +"V. c #FDFD6D", +"C. c #FDFD71", +"Z. c #FCFD74", +/* pixels */ +"M M M M * &.=.*.&.$.#.6 6 4 3 3 ", +"M { { { ` Z.C.V.B.M.N.m n b v 1 ", +"M { ! E E b.n.c.k.h.u.j g s c 1 ", +"* ' E Y L b.c.k.g.y.9.g i u x > ", +"* _ I I J c.a.i. .7.5.i u t z > ", +"% ) L H G k.p.Z C ..3.u r e l > ", +"$ ( H D S s.t.| } >.1.r e q j : ", +"# / D S A 9.q.5.3.1.;.e 0 9 f - ", +"@ ~ A B N q.5.3.,.:.-.0 8 7 a - ", +"+ ~ ! U L v.l.d.s.e.w.h f a p = ", +"O o X . @.@.O.O.o.X.: - = = = " +}; diff --git a/src/pixmaps/flags_xpm/so.xpm b/src/pixmaps/flags_xpm/so.xpm new file mode 100644 index 00000000..3b16fc48 --- /dev/null +++ b/src/pixmaps/flags_xpm/so.xpm @@ -0,0 +1,173 @@ +/* XPM */ +static const char *so[] = { +/* columns rows colors chars-per-pixel */ +"16 11 156 2", +" c #0027DD", +". c #0029DD", +"X c #002DDD", +"o c #002DDF", +"O c #002FDF", +"+ c #0031DF", +"@ c #0035DD", +"# c #0033E1", +"$ c #0035E3", +"% c #0039E3", +"& c #003BE5", +"* c #003DE5", +"= c #003FE7", +"- c #0041E7", +"; c #0045E7", +": c #0047E9", +"> c #004BE9", +", c #004DEB", +"< c #0051ED", +"1 c #0057ED", +"2 c #005DEF", +"3 c #0061EF", +"4 c #0063F1", +"5 c #0067F3", +"6 c #006DF5", +"7 c #006FF7", +"8 c #0071F7", +"9 c #0075F5", +"0 c #0075F9", +"q c #0077F9", +"w c #0079FB", +"e c #007BFB", +"r c #007DFD", +"t c #037FFD", +"y c #0581FD", +"u c #0783FD", +"i c #0B83FD", +"p c #0D87FD", +"a c #0F87FD", +"s c #0F85FF", +"d c #1187FF", +"f c #1389FF", +"g c #2191FF", +"h c #3895F1", +"j c #3C97F1", +"k c #3D97F2", +"l c #4099F2", +"z c #4199F2", +"x c #419AF2", +"c c #459CF3", +"v c #469CF3", +"b c #459CF4", +"n c #469DF4", +"m c #469DF5", +"M c #4A9FF4", +"N c #4B9FF4", +"B c #49A0F5", +"V c #4DA1F5", +"C c #4FA2F5", +"Z c #4EA2F6", +"A c #53A2F2", +"S c #55A4F2", +"D c #56A4F2", +"F c #50A2F5", +"G c #51A4F6", +"H c #54A5F6", +"J c #55A6F6", +"K c #54A6F7", +"L c #57A7F6", +"P c #58A5F3", +"I c #59A6F3", +"U c #5BA8F3", +"Y c #59A8F7", +"T c #59A9F7", +"R c #5CA8F4", +"E c #5FA9F4", +"W c #55A7F9", +"Q c #5BA9F8", +"! c #5BAAF8", +"~ c #5DABF9", +"^ c #5EABF8", +"/ c #5FADFA", +"( c #60AAF5", +") c #62ACF5", +"_ c #64ADF5", +"` c #65AEF6", +"' c #68AFF6", +"] c #60ACF9", +"[ c #63AEF9", +"{ c #64AFFA", +"} c #65AFFA", +"| c #69B0F7", +" . c #6CB2F7", +".. c #6DB2F7", +"X. c #67B1FA", +"o. c #63B0FC", +"O. c #69B1FA", +"+. c #69B2FB", +"@. c #6BB3FB", +"#. c #6DB3FB", +"$. c #6DB4FB", +"%. c #6DB5FB", +"&. c #6CB4FC", +"*. c #70B4F7", +"=. c #7AB8F6", +"-. c #71B4F8", +";. c #75B7F8", +":. c #75B7F9", +">. c #70B6FC", +",. c #71B7FC", +"<. c #70B6FD", +"1. c #71B7FD", +"2. c #72B7FC", +"3. c #73B7FD", +"4. c #76B9FD", +"5. c #76BAFD", +"6. c #79B9F9", +"7. c #7CBBFA", +"8. c #7DBCFA", +"9. c #79BCFE", +"0. c #7ABCFE", +"q. c #7CBDFE", +"w. c #7CBEFE", +"e. c #7FBFFE", +"r. c #81BBF7", +"t. c #80BEFB", +"y. c #8CC0F6", +"u. c #84C0FC", +"i. c #86C2FC", +"p. c #88C3FC", +"a. c #8AC3FD", +"s. c #8BC4FD", +"d. c #8DC5FE", +"f. c #8EC6FE", +"g. c #8FC7FE", +"h. c #9BC9F5", +"j. c #98C8F7", +"k. c #90C4F9", +"l. c #91C8FE", +"z. c #94C8FE", +"x. c #94C9FE", +"c. c #95CAFF", +"v. c #A6D1FC", +"b. c #AED3F8", +"n. c #ADD3FA", +"m. c #AED4FB", +"M. c #BEDAF7", +"N. c #B2D5F8", +"B. c #B8DAFB", +"V. c #C1DDFA", +"C. c #D7E9FA", +"Z. c #D8E9F9", +"A. c #E1ECF7", +"S. c #E2EDF8", +"D. c #F0F3F8", +"F. c #F1F5F9", +/* pixels */ +"g f f f a i y r e 0 8 6 5 4 2 3 ", +"s c.c.c.l.f.f.a.a.t.t.7.6.:.*., ", +"f c.e.q.q.5.>.>.O.o.} ) T J .> ", +"d l.q.q.5.3.o.m.m.W T T J F ' ; ", +"s g.q.5.$.v.B.C.Z.N.j.G C M _ = ", +"u f.5.,.&.#.V.F.D.M.J C M v ) & ", +"y s.,.$.O./ k.S.S.y.b M c z R $ ", +"e p.$.O.o.^ b.r.=.h.b c z k I O ", +"0 u.O.} ^ R J C B b v z j h S X ", +"8 t.7.6.:.,. .| _ ) ( I I S A ", +"9 5 4 2 1 < > : - = % $ O O @ " +}; diff --git a/src/pixmaps/flags_xpm/sr.xpm b/src/pixmaps/flags_xpm/sr.xpm new file mode 100644 index 00000000..d3074fc2 --- /dev/null +++ b/src/pixmaps/flags_xpm/sr.xpm @@ -0,0 +1,177 @@ +/* XPM */ +static const char *sr[] = { +/* columns rows colors chars-per-pixel */ +"16 11 160 2", +" c #002700", +". c #002B00", +"X c #002D00", +"o c #003100", +"O c #003300", +"+ c #003700", +"@ c #003D00", +"# c #003F00", +"$ c #004500", +"% c #004B00", +"& c #004F00", +"* c #005100", +"= c #005500", +"- c #005B00", +"; c #005F00", +": c #006100", +"> c #006500", +", c #006B00", +"< c #006F00", +"1 c #007300", +"2 c #007500", +"3 c #007700", +"4 c #007D00", +"5 c #DF0000", +"6 c #E30000", +"7 c #E50000", +"8 c #E70000", +"9 c #FB0000", +"0 c #FD0000", +"q c red", +"w c #F21414", +"e c #F31919", +"r c #F31A1A", +"t c #F41F1F", +"y c #F42020", +"u c #F52424", +"i c #F52525", +"p c #F22A2B", +"a c #F62B2B", +"s c #F62D2B", +"d c #F22E30", +"f c #F73030", +"g c #F33335", +"h c #F43636", +"j c #F43739", +"k c #F43B3B", +"l c #F53F3F", +"z c #F5433E", +"x c #F77C30", +"c c #F54243", +"v c #FA4040", +"b c #FB4545", +"n c #FB4746", +"m c #F64843", +"M c #F64648", +"N c #F3494B", +"B c #F74D49", +"V c #F74C4D", +"C c #FB4A49", +"Z c #FC4A4B", +"A c #FC4B4B", +"S c #FC4F4F", +"D c #F8514D", +"F c #FD4F50", +"G c #F95052", +"H c #F85152", +"J c #FD5353", +"K c #F95557", +"L c #FA5656", +"P c #FD5454", +"I c #F65C5D", +"U c #FB5A5B", +"Y c #FE5858", +"T c #FB5E5F", +"R c #FC6364", +"E c #FD6768", +"W c #FD6B6C", +"Q c #FD6F6F", +"! c #FE6E70", +"~ c #FE7173", +"^ c #FE7273", +"/ c #FE7676", +"( c #FC7C7D", +") c #008100", +"_ c #008300", +"` c #008500", +"' c #008700", +"] c #008900", +"[ c #008F00", +"{ c #30A531", +"} c #33A734", +"| c #35A837", +" . c #39AA3B", +".. c #3DAD3F", +"X. c #41AE42", +"o. c #45B046", +"O. c #4AB34B", +"+. c #4EB550", +"@. c #50B650", +"#. c #53B854", +"$. c #54B855", +"%. c #57B959", +"&. c #59BA5A", +"*. c #5BBC5D", +"=. c #5EBD5E", +"-. c #60BE62", +";. c #62BE63", +":. c #65C066", +">. c #66C167", +",. c #6AC36B", +"<. c #6FC46E", +"1. c #71C672", +"2. c #75C875", +"3. c #78C879", +"4. c #7ACA7A", +"5. c #7CCB7D", +"6. c #F7B52F", +"7. c #F8B735", +"8. c #F6C22A", +"9. c #F8C736", +"0. c #F9C83A", +"q. c #F9D73C", +"w. c #F8F336", +"e. c #F9F23B", +"r. c #FA8240", +"t. c #FAAA4F", +"y. c #FBAD54", +"u. c #FBCD46", +"i. c #FAD841", +"p. c #FE8A8C", +"a. c #C9D9CB", +"s. c #D3E5D5", +"d. c #E6EEE7", +"f. c #E6EFE7", +"g. c #E8EFE9", +"h. c #E9EFEA", +"j. c #E9F0EA", +"k. c #EAF1EB", +"l. c #EBF5EB", +"z. c #ECF1EC", +"x. c #EDF2ED", +"c. c #EDF9F1", +"v. c #F1F5F2", +"b. c #F2F6F3", +"n. c #F2F7F3", +"m. c #F4F7F4", +"M. c #F3F8F4", +"N. c #F5F8F5", +"B. c #F4F9F5", +"V. c #F5F9F6", +"C. c #F6F9F6", +"Z. c #F6FAF7", +"A. c #F7FBF8", +"S. c #F8FBF8", +"D. c #F8FBF9", +"F. c #F9FCF9", +"G. c #F9FCFA", +"H. c #F9FDFA", +"J. c #FAFDFB", +"K. c #FBFEFC", +/* pixels */ +"[ ' ' ' ' ) ) 4 3 1 < , > ; - ; ", +"] 5.5.4.3.2.1.<.,.>.;.=.&.$.+.* ", +"c.K.J.J.A.J.A.A.A.m.m.b.b.b.b.s.", +"q p.~ Q W E R y.y.K J V M c I 8 ", +"q / Y P F C u.i.q.9.d a i y l 8 ", +"9 ~ J S A n r.e.w.x s i t r k 8 ", +"q Q S C n v 0.7.7.8.i t r w h 6 ", +"9 ( T U P H D B m z j h p p N 5 ", +"l.G.A.m.C.C.b.x.z.k.h.g.f.f.h.a.", +"3 ;.;.*.%.$.O.O.X.X.X. .| } { X ", +"1 > > - = & % $ # # + o X . o " +}; diff --git a/src/pixmaps/flags_xpm/st.xpm b/src/pixmaps/flags_xpm/st.xpm new file mode 100644 index 00000000..b71c55bd --- /dev/null +++ b/src/pixmaps/flags_xpm/st.xpm @@ -0,0 +1,184 @@ +/* XPM */ +static const char *st[] = { +/* columns rows colors chars-per-pixel */ +"16 11 167 2", +" c #002700", +". c #002900", +"X c #002D00", +"o c #002F00", +"O c #003300", +"+ c #003500", +"@ c #003900", +"# c #003D00", +"$ c #2E2E1F", +"% c #004100", +"& c #004700", +"* c #004D00", +"= c #004F00", +"- c #005100", +"; c #005700", +": c #005D00", +"> c #006100", +", c #006300", +"< c #006700", +"1 c #006D00", +"2 c #007100", +"3 c #007300", +"4 c #007500", +"5 c #007900", +"6 c #007D00", +"7 c #424236", +"8 c #AD0000", +"9 c #BB0000", +"0 c #E50000", +"q c #F50000", +"w c #F90000", +"e c #FB0000", +"r c #FD0000", +"t c red", +"y c #BA6F44", +"u c #FC504F", +"i c #FD5353", +"p c #FE5958", +"a c #F46349", +"s c #FC654B", +"d c #FC6D4F", +"f c #FB7749", +"g c #E86E5F", +"h c #F5755C", +"j c #CC7F62", +"k c #FC6A6A", +"l c #FD6F6F", +"z c #E07766", +"x c #FE7273", +"c c #FE7676", +"v c #FE7979", +"b c #008100", +"n c #008300", +"m c #008700", +"M c #008900", +"N c #009300", +"B c #13980B", +"V c #179A0E", +"C c #1C9D13", +"Z c #20A019", +"A c #25A11E", +"S c #2AA423", +"D c #30A729", +"F c #31A42C", +"G c #30A72C", +"H c #34A52F", +"J c #36A72F", +"K c #35AA2E", +"L c #36A732", +"P c #36AB31", +"I c #3AA935", +"U c #3BAD34", +"Y c #3CAE37", +"T c #3EAB39", +"R c #40AF3A", +"E c #42AE3D", +"W c #41B03D", +"Q c #45B43F", +"! c #46AE42", +"~ c #46B242", +"^ c #4AB146", +"/ c #4BB547", +"( c #4CB349", +") c #4FB34B", +"_ c #50B74C", +"` c #52B64E", +"' c #53B650", +"] c #54B951", +"[ c #57B853", +"{ c #58B955", +"} c #58BB54", +"| c #5CBA57", +" . c #5CBA58", +".. c #5CBD59", +"X. c #60BD5C", +"o. c #65BE60", +"O. c #5DC05D", +"+. c #5FC05C", +"@. c #69C165", +"#. c #6DC369", +"$. c #70C46D", +"%. c #74C671", +"&. c #77C874", +"*. c #7AC877", +"=. c #7CCA79", +"-. c #7BCD7B", +";. c #959319", +":. c #9E9B1A", +">. c #95BF00", +",. c #8C8A25", +"<. c #99983B", +"1. c #A09E2F", +"2. c #A4A125", +"3. c #AAA730", +"4. c #AEAB3C", +"5. c #9DC700", +"6. c #B5D100", +"7. c #B7D100", +"8. c #BBD500", +"9. c #E2EA10", +"0. c #E6ED14", +"q. c #E6E51F", +"w. c #E6EE19", +"e. c #E6EE1F", +"r. c #F2F214", +"t. c #E7EE24", +"y. c #E5ED26", +"u. c #EBEA2B", +"i. c #E7F02B", +"p. c #EBF12A", +"a. c #ECF22F", +"s. c #F4F420", +"d. c #F5F524", +"f. c #F4F42B", +"g. c #F6F62A", +"h. c #E6ED32", +"j. c #EBEA35", +"k. c #E8F131", +"l. c #EBF234", +"z. c #E9F136", +"x. c #ECF33A", +"c. c #EAF23C", +"v. c #EEF43F", +"b. c #F7F730", +"n. c #F4F436", +"m. c #F8F836", +"M. c #F4F53B", +"N. c #F5F53F", +"B. c #F9F93A", +"V. c #F08845", +"C. c #FB8C45", +"Z. c #FD8054", +"A. c #FD9350", +"S. c #F19659", +"D. c #EE857B", +"F. c #F4827A", +"G. c #E8EF44", +"H. c #F0EF41", +"J. c #ECF442", +"K. c #EDF447", +"L. c #EDF44B", +"P. c #F7F740", +"I. c #FAFA40", +"U. c #FBFB46", +"Y. c #FCFC4B", +"T. c #EEF551", +"R. c #F0F654", +/* pixels */ +"9 N M M M n n 6 5 4 3 1 < , : , ", +"q D.-.=.*.*.%.#.#.#.o... .{ ` * ", +"t F.g +...} ] ) ( ~ T Y P G ( * ", +"t v h S.T.T.L.P.J.c.x.k.i.y.G.5.", +"t c p Z.A.Y.U.G.4.n.b.u.2.s.P.8.", +"e x i d s U.P.<.7 3.f.,.$ :.M.7.", +"t l u f C.I.B.j.1.g.s.q.;.r.n.7.", +"e k a V.v.x.l.a.p.y.t.w.0.9.h.>.", +"e z y Q R U K F S A Z C V B H + ", +"0 j +.| { ` _ ^ ! E T I L H F ", +"8 3 , : ; * * * % # @ + X X . + " +}; diff --git a/src/pixmaps/flags_xpm/sv.xpm b/src/pixmaps/flags_xpm/sv.xpm new file mode 100644 index 00000000..a70e2026 --- /dev/null +++ b/src/pixmaps/flags_xpm/sv.xpm @@ -0,0 +1,159 @@ +/* XPM */ +static const char *sv[] = { +/* columns rows colors chars-per-pixel */ +"16 11 142 2", +" c #8DAD5F", +". c #91AF64", +"X c #E9D679", +"o c #00009F", +"O c #0000A1", +"+ c #0000A3", +"@ c #0000A5", +"# c #0000A9", +"$ c #0000AB", +"% c #0000AD", +"& c #0000B1", +"* c #0000B3", +"= c #0000B5", +"- c #0000B9", +"; c #0000BB", +": c #0000BF", +"> c #0000C1", +", c #0000C5", +"< c #0003C5", +"1 c #0000C7", +"2 c #0005C9", +"3 c #0007CB", +"4 c #000BCB", +"5 c #0011CF", +"6 c #0017D1", +"7 c #001DD1", +"8 c #0021D3", +"9 c #0027D5", +"0 c #0029D7", +"q c #002FD7", +"w c #294ED1", +"e c #2D51D2", +"r c #3154D4", +"t c #3658D5", +"y c #3B5CD6", +"u c #4967D7", +"i c #4061D9", +"p c #4566DB", +"a c #4767DB", +"s c #4968D8", +"d c #4C6AD8", +"f c #4E6CD9", +"g c #4869DC", +"h c #4C6CDD", +"j c #4E6DDD", +"k c #526FDA", +"l c #5572DB", +"z c #5170DF", +"x c #5371DF", +"c c #5875DC", +"v c #5C79DD", +"b c #607CDF", +"n c #5674E0", +"m c #5875E0", +"M c #5B78E1", +"N c #5C79E2", +"B c #5F7CE3", +"V c #607CE0", +"C c #657FE1", +"Z c #6480E4", +"A c #6783E5", +"S c #6882E2", +"D c #6983E2", +"F c #6C85E3", +"G c #6D86E3", +"H c #6B86E6", +"J c #6F89E7", +"K c #7089E4", +"L c #708AE5", +"P c #748DE6", +"I c #758EE6", +"U c #728CE8", +"Y c #748EE9", +"T c #7890E7", +"R c #7990E8", +"E c #7A91E8", +"W c #7C94E8", +"Q c #7F97E8", +"! c #B7CB9E", +"~ c #BACDA1", +"^ c #DED480", +"/ c #8799D3", +"( c #93A1DB", +") c #8299EA", +"_ c #859BEB", +"` c #899EEB", +"' c #8BA0ED", +"] c #8CA2ED", +"[ c #8DA2ED", +"{ c #8FA4ED", +"} c #BBC7F1", +"| c #BFCBF5", +" . c #C4CDEA", +".. c #C6CEEB", +"X. c #C1CBEC", +"o. c #C8D0ED", +"O. c #C9D2EE", +"+. c #CAD2EF", +"@. c #CBD4EF", +"#. c #CBD5EF", +"$. c #CCD4ED", +"%. c #CDD7EF", +"&. c #C8D2F2", +"*. c #CCD4F0", +"=. c #CED5F2", +"-. c #D0D7F3", +";. c #D1D8F1", +":. c #D1D8F2", +">. c #D3DAF3", +",. c #D2D9F4", +"<. c #D3DAF4", +"1. c #D4DCF4", +"2. c #D5DCF4", +"3. c #D6DDF5", +"4. c #D6DEF6", +"5. c #D8DFF6", +"6. c #D8DFF7", +"7. c #DAE0F8", +"8. c #DBE1F9", +"9. c #DCE2F9", +"0. c gray89", +"q. c gray90", +"w. c #E7E7E7", +"e. c #E0E5F8", +"r. c #E2E8FB", +"t. c gray95", +"y. c #F3F3F3", +"u. c #F4F4F4", +"i. c #F4F5F5", +"p. c gray96", +"a. c #F6F6F5", +"s. c #F6F6F6", +"d. c gray97", +"f. c #F8F8F8", +"g. c #F9F9F8", +"h. c gray98", +"j. c #FBFBFB", +"k. c #FBFCFB", +"l. c gray99", +"z. c #FDFCFD", +"x. c #FDFDFD", +"c. c #FEFEFE", +/* pixels */ +"q 0 0 0 9 8 7 6 5 4 2 1 1 : : - ", +"0 { { [ ' ` _ ) Q W T I J F S - ", +"9 [ Y U J H A Z B M n x h a V * ", +"| r.9.8.7.7.3.2.>.,.=.=.O.O.>.( ", +"x.x.x.x.x.x.l.X X g.s.s.s.u.s.w.", +"x.x.x.x.j.j.&.. X.s.u.s.t.t.q.", +"x.x.x.k.j.j.f.! ~ i.a.a.u.t.s.0.", +"} e.6.3.3.>.-.%.O.&.O.o. . .O./ ", +"2 E N m x j h a i y t r e w u O ", +"2 E I L F F V v v c l k f d d o ", +"< 1 > > - - = * % $ $ @ O O o o " +}; diff --git a/src/pixmaps/flags_xpm/sy.xpm b/src/pixmaps/flags_xpm/sy.xpm new file mode 100644 index 00000000..113534a7 --- /dev/null +++ b/src/pixmaps/flags_xpm/sy.xpm @@ -0,0 +1,124 @@ +/* XPM */ +static const char *sy[] = { +/* columns rows colors chars-per-pixel */ +"16 11 107 2", +" c black", +". c #0B0B0B", +"X c #0F0F0E", +"o c #131313", +"O c #181919", +"+ c #1E1E1E", +"@ c #232323", +"# c gray16", +"$ c #2C2C2C", +"% c gray18", +"& c #2F2F2F", +"* c #323232", +"= c #343434", +"- c #353535", +"; c #393939", +": c #3A3A3A", +"> c gray24", +", c #3F3F3F", +"< c gray26", +"1 c #444444", +"2 c #464646", +"3 c #4B4B4B", +"4 c #505050", +"5 c #545455", +"6 c #585858", +"7 c #5D5D5D", +"8 c #616162", +"9 c gray40", +"0 c #E90000", +"q c #EB0000", +"w c #ED0000", +"e c #EF0000", +"r c #F10000", +"t c #F30000", +"y c #F50000", +"u c #F70000", +"i c #F90000", +"p c #FB0000", +"a c #FD0000", +"s c red", +"d c #F62C2C", +"f c #F73131", +"g c #F83737", +"h c #F93C3D", +"j c #FA4242", +"k c #FB4747", +"l c #F74949", +"z c #F74E4E", +"x c #FC4C4C", +"c c #F85353", +"v c #FD5151", +"b c #F95757", +"n c #FD5454", +"m c #FE5959", +"M c #FA5C5C", +"N c #FE5C5C", +"B c #FE5F5F", +"V c #FB6060", +"C c #FC6565", +"Z c #FC6969", +"A c #FD6D6D", +"S c #FD7071", +"D c #FE7474", +"F c #FE7777", +"G c #FE7979", +"H c #FF7B7A", +"J c #FF7B7B", +"K c #52B554", +"L c #66BF67", +"P c #80C882", +"I c #85CA86", +"U c #95D396", +"Y c #97D39A", +"T c #9DD49F", +"R c #9DD69F", +"E c #A3DAA5", +"W c #A7DBA9", +"Q c gray81", +"! c gray82", +"~ c #D5D5D5", +"^ c #D7D7D7", +"/ c gray93", +"( c #EDEFEF", +") c #EFEFEF", +"_ c #E1F0E1", +"` c #E9F3EB", +"' c #F1F1F1", +"] c gray95", +"[ c #F3F3F3", +"{ c #F4F4F4", +"} c #F4F5F5", +"| c gray96", +" . c #F6F6F6", +".. c gray97", +"X. c #F1F9F0", +"o. c #F3F8F6", +"O. c #F3FBF7", +"+. c #F5FBF5", +"@. c #F4FBF6", +"#. c #F8F8F8", +"$. c #F9F9F9", +"%. c gray98", +"&. c #FBFBFB", +"*. c #FBFCFB", +"=. c gray99", +"-. c #FDFDFD", +";. c #FEFEFE", +/* pixels */ +"s s s s s p s p p p y y t t w w ", +"s J J J F D S A Z C V M b c z q ", +"s J B N N n x x k j h g f d l q ", +"' -.-.-.-.-.-.&.&.#.......} ..^ ", +"' -.-.-.+.W @.&.#.} Y ` } ' ..^ ", +"' -.-.=.E L R &.+.T K P ' } } ! ", +"( -.=.&.+.U ` #.#...I _ ..' ' ! ", +"( =.&.&.&.&.&.....| ..' ' ' } Q ", +" 9 2 < ; - & # @ + O o X . & ", +" 8 7 6 5 3 3 2 < > ; - * & $ ", +" " +}; diff --git a/src/pixmaps/flags_xpm/sz.xpm b/src/pixmaps/flags_xpm/sz.xpm new file mode 100644 index 00000000..72a20849 --- /dev/null +++ b/src/pixmaps/flags_xpm/sz.xpm @@ -0,0 +1,185 @@ +/* XPM */ +static const char *sz_[] = { +/* columns rows colors chars-per-pixel */ +"16 11 168 2", +" c #350000", +". c #390000", +"X c #3F0000", +"o c #372F2F", +"O c #3F3838", +"+ c #4F0000", +"@ c #7D0000", +"# c #7F0000", +"$ c #4E3434", +"% c #7A2020", +"& c #003D77", +"* c #474040", +"= c #4B4343", +"- c #4C4545", +"; c #564B4B", +": c #534C4B", +"> c #564F4F", +", c #545153", +"< c #585051", +"1 c #666162", +"2 c #810000", +"3 c #850000", +"4 c #870000", +"5 c #961717", +"6 c #9A1514", +"7 c #9A1919", +"8 c #933A3A", +"9 c #A22626", +"0 c #AA2D2B", +"q c #A83232", +"w c #AD3231", +"e c #AC3533", +"r c #AD3835", +"t c #A73A3A", +"y c #AE3F3F", +"u c #B73F3F", +"i c #B24A3D", +"p c #D14500", +"a c #DD6100", +"s c #9A4546", +"d c #B34444", +"f c #B04B4C", +"g c #B44C4C", +"h c #BC534C", +"j c #A25151", +"k c #BE5959", +"l c #BF5D58", +"z c #BF5C5C", +"x c #C25854", +"c c #C57272", +"v c #C77676", +"b c #C87673", +"n c #C87675", +"m c #CC7979", +"M c #F18900", +"N c #F59903", +"B c #E9A336", +"V c #EAA638", +"C c #EBA93C", +"Z c #BA8042", +"A c #D48C4B", +"S c #C18952", +"D c #D4985F", +"F c #EDAB40", +"G c #EDAD46", +"H c #EEB04C", +"J c #EEB24F", +"K c #EDB253", +"L c #F0B554", +"P c #F1B554", +"I c #F2B758", +"U c #F3B759", +"Y c #F3BA5C", +"T c #F3BA5D", +"R c #E39B63", +"E c #DDA571", +"W c #DAAB78", +"Q c #F4BB61", +"! c #F4BC62", +"~ c #F5BE66", +"^ c #F5BF66", +"/ c #F2BE6B", +"( c #F5C16B", +") c #F6C26F", +"_ c #F7C472", +"` c #F8C676", +"' c #F9C879", +"] c #F9C97C", +"[ c #FACB7E", +"{ c #002789", +"} c #002B8B", +"| c #002D8D", +" . c #00338D", +".. c #003191", +"X. c #003793", +"o. c #003D95", +"O. c #003F99", +"+. c #00459D", +"@. c #0B5D97", +"#. c #004BA1", +"$. c #014FA5", +"%. c #0755A7", +"&. c #0F5BAB", +"*. c #175FAD", +"=. c #1761AF", +"-. c #1D65B1", +";. c #377FAB", +":. c #236BB5", +">. c #2B6FB9", +",. c #3173B9", +"<. c #3173BB", +"1. c #3777BF", +"2. c #3B7DC1", +"3. c #837290", +"4. c #5393BD", +"5. c #798DB5", +"6. c #3F81C3", +"7. c #4583C5", +"8. c #4985C5", +"9. c #4B87C7", +"0. c #558FCB", +"q. c #8F8B89", +"w. c #A29A97", +"e. c #A39C99", +"r. c #A19DB6", +"t. c #C7AEAF", +"y. c #C1BDBA", +"u. c #CABEBC", +"i. c #E4B6B2", +"p. c #F7CB82", +"a. c #FBD494", +"s. c #C5C1BE", +"d. c #DFC1B6", +"f. c #EAC2BC", +"g. c #83ACC4", +"h. c #84ADC5", +"j. c #86AEC7", +"k. c #9BA8C7", +"l. c #89B0C8", +"z. c #8CB2C9", +"x. c #8EB3CA", +"c. c #90B3CA", +"v. c #96B9CF", +"b. c #98BBD1", +"n. c #98BBD3", +"m. c #99BDD2", +"M. c #9DBFD3", +"N. c #9BBDD5", +"B. c #9EBFD7", +"V. c #9FC1D5", +"C. c #A3C3D7", +"Z. c #A1C1D8", +"A. c #A4C3DA", +"S. c #A5C5D8", +"D. c #A6C4DA", +"F. c #A8C4DA", +"G. c #ABC8DD", +"H. c #AECBDF", +"J. c #AFCCE0", +"K. c #B1CDE1", +"L. c #B3CEE2", +"P. c #B3CFE2", +"I. c #CCC8C5", +"U. c #DFCEC8", +"Y. c #DFCFCB", +"T. c #E3E0DE", +"R. c #F2E9E5", +"E. c #F6EDE9", +/* pixels */ +"0.9.9.9.8.7.2.2.2.>.>.:.-.*.*.*.", +"4.P.P.P.K.J.J.G.F.F.D.Z.B.N.n.@.", +"N a.[ [ ' ` ` / / ^ ~ T I K / a ", +"4 n z k x j , : E.f.h w 0 9 d + ", +"4 v x R D , , - I.R.Y.A U.% d X ", +"2 n E W ; e.w.* y.1 q.d.Z Z f . ", +"@ n r.k.s = * $ s.T.t.e 3.5.t ", +"@ c g f i 8 $ o s.i.r 7 6 5 q ", +"M p.~ Q T P P J H G F C V B K p ", +";.S.C.V.V.m.n.v.c.c.z.z.j.j.g.& ", +",.-.=.&.%.$.#.+.o.o.X...| } { ." +}; diff --git a/src/pixmaps/flags_xpm/tc.xpm b/src/pixmaps/flags_xpm/tc.xpm new file mode 100644 index 00000000..65cc002c --- /dev/null +++ b/src/pixmaps/flags_xpm/tc.xpm @@ -0,0 +1,179 @@ +/* XPM */ +static const char *tc[] = { +/* columns rows colors chars-per-pixel */ +"16 11 162 2", +" c #00000B", +". c #00000D", +"X c #00000F", +"o c #000011", +"O c #000015", +"+ c #000017", +"@ c #00001D", +"# c #00001F", +"$ c #000021", +"% c #000025", +"& c #00002B", +"* c #000031", +"= c #000037", +"- c #00003D", +"; c #00003F", +": c #000043", +"> c #000049", +", c #00004F", +"< c #000055", +"1 c #00005B", +"2 c #00005F", +"3 c #000061", +"4 c #000063", +"5 c #000065", +"6 c #000069", +"7 c #5D2D5D", +"8 c #732147", +"9 c #7F355B", +"0 c #5B3F71", +"q c #274E7D", +"w c #2E527E", +"e c #4C6274", +"r c #576D7D", +"t c #CD1919", +"y c #832543", +"u c #AD5F73", +"i c #BF6F7D", +"p c #D56F74", +"a c #E26869", +"s c #E57372", +"d c #E0797A", +"f c #E97C79", +"g c #B19B3E", +"h c #BCA33F", +"j c #C8AC2E", +"k c #C8AE35", +"l c #C7B337", +"z c #CBBF3B", +"x c #E3AE30", +"c c #E7BB34", +"v c #B79F47", +"b c #83BF4D", +"n c #B8A24F", +"m c #C3A543", +"M c #D2B241", +"N c #DDBA50", +"B c #90C344", +"V c #F0CB5E", +"C c #001D87", +"Z c #1D3783", +"A c #002F95", +"S c #1E4E96", +"D c #305581", +"F c #335886", +"G c #235299", +"H c #245199", +"J c #29579C", +"K c #2A579C", +"L c #2C589A", +"P c #2F5A9D", +"I c #2E5B9F", +"U c #2F5B9F", +"Y c #335B9E", +"T c #325D9E", +"R c #3A5F9F", +"E c #2A51A2", +"W c #2F5CA0", +"Q c #365BA6", +"! c #3057A9", +"~ c #3560A0", +"^ c #3460A2", +"/ c #3561A2", +"( c #3963A3", +") c #3A64A5", +"_ c #3A65A5", +"` c #3B65A5", +"' c #3D66A4", +"] c #3E65A6", +"[ c #3B60AA", +"{ c #3C63A8", +"} c #3F66AB", +"| c #3F69A8", +" . c #527094", +".. c #5F7B9E", +"X. c #426AA6", +"o. c #4166AE", +"O. c #4069A8", +"+. c #406AA8", +"@. c #476BA8", +"#. c #466EA9", +"$. c #446DAB", +"%. c #456EAB", +"&. c #4269AC", +"*. c #446AAE", +"=. c #456DAE", +"-. c #466CAE", +";. c #496FAC", +":. c #506FA8", +">. c #4B71AC", +",. c #4972AE", +"<. c #4E75AE", +"1. c #4F75AF", +"2. c #5075AE", +"3. c #5F73A9", +"4. c #4971B0", +"5. c #5379B0", +"6. c #5479B1", +"7. c #537AB7", +"8. c #587BB3", +"9. c #587DB3", +"0. c #5C7FB5", +"q. c #7777A3", +"w. c #7F78A1", +"e. c #80749C", +"r. c #E07F81", +"t. c #72848C", +"y. c #74868E", +"u. c #5D81B5", +"i. c #6183B8", +"p. c #6184B9", +"a. c #6285B9", +"s. c #6587BA", +"d. c #6688BA", +"f. c #698ABC", +"g. c #6A8BBD", +"h. c #6F8FBF", +"j. c #A9829B", +"k. c #BC8597", +"l. c #9186A7", +"z. c #9486A7", +"x. c #8A94B9", +"c. c #9797B9", +"v. c #C38493", +"b. c #D38A92", +"n. c #E18587", +"m. c #EC8381", +"M. c #E69495", +"N. c #D69FA9", +"B. c #D6ACB6", +"V. c #D5AEB7", +"C. c #F1A6A4", +"Z. c #F0A8A7", +"A. c #E4D2A1", +"S. c #96ACD0", +"D. c #93B0D5", +"F. c #D4B9C4", +"G. c #DDBAC3", +"H. c #E0B9C0", +"J. c #DDD4DE", +"K. c #E2C3CA", +"L. c #E2CCD3", +"P. c #F6E9CD", +/* pixels */ +"i q.A 8 y C 7 u 4 2 1 < , > : ; ", +"Z G.J.B.N.F.L.S.g.d.i.0.8.5.1.= ", +"t M.m.s a f d p :.&...y.t. .;.* ", +"9 H.C.r.n.Z.b.j.@.{ N V c n &.& ", +"3.K.c.k.v.D.B.l.] o.A.P.x v } % ", +"0 x.7.w.e.-.a.l.R ! M z l h [ # ", +"6 h.1.4.-.+._ / U E m b B g Q + ", +"5 g.,.%.| _ / U K H r k j e Y + ", +"4 d.%.| ( / U L G S F w w q P . ", +"1 i.u.9.6.1.,.%.X.] ( ~ ~ U L . ", +"< , > : ; = * & % # # + o . . " +}; diff --git a/src/pixmaps/flags_xpm/td.xpm b/src/pixmaps/flags_xpm/td.xpm new file mode 100644 index 00000000..635e47d3 --- /dev/null +++ b/src/pixmaps/flags_xpm/td.xpm @@ -0,0 +1,179 @@ +/* XPM */ +static const char *td[] = { +/* columns rows colors chars-per-pixel */ +"16 11 162 2", +" c #BF0000", +". c #C10000", +"X c #C30000", +"o c #C50000", +"O c #C90000", +"+ c #CB0000", +"@ c #CD0000", +"# c #CF0000", +"$ c #D30000", +"% c #D70000", +"& c #D90000", +"* c #DB0000", +"= c #DF0000", +"- c #E12525", +"; c #E22828", +": c #E22A2A", +"> c #E32A2C", +", c #E32C2D", +"< c #E42E2E", +"1 c #E42E31", +"2 c #E43132", +"3 c #E43233", +"4 c #E63436", +"5 c #E63737", +"6 c #E63838", +"7 c #E7393C", +"8 c #E73C3D", +"9 c #E73E3D", +"0 c #E93E41", +"q c #E44242", +"w c #E54545", +"e c #E94142", +"r c #E94242", +"t c #EA4547", +"y c #E64748", +"u c #EA4748", +"i c #E64848", +"p c #E7484B", +"a c #EB4A4C", +"s c #E84C4C", +"d c #E85050", +"f c #E95454", +"g c #EB5958", +"h c #EB5D5D", +"j c #ED6161", +"k c #ED6565", +"l c #EE696A", +"z c #F06C6E", +"x c #CD9700", +"c c #C1AB00", +"v c #D1B700", +"b c #D5B500", +"n c #D7B900", +"m c #DBBD00", +"M c #E7BB00", +"N c #EDD301", +"B c #EBD500", +"V c #EDD507", +"C c #F1D90B", +"Z c #DBC921", +"A c #E9CD50", +"S c #EAD054", +"D c #EBDE57", +"F c #ECD159", +"G c #EDD35E", +"H c #ECDD5A", +"J c #EEDF5F", +"K c #ECE05B", +"L c #EED563", +"P c #EFD767", +"I c #ECD368", +"U c #F1D96C", +"Y c #E3D870", +"T c #E5DA74", +"R c #E6DC79", +"E c #E7DD7D", +"W c #EEE260", +"Q c #EFE163", +"! c #EFE164", +"~ c #EFE365", +"^ c #EDE26E", +"/ c #F0E261", +"( c #F1E466", +") c #F0E268", +"_ c #F0E569", +"` c #F2E56B", +"' c #F1E46D", +"] c #F1E46E", +"[ c #F1E66F", +"{ c #F3E76F", +"} c #EEE270", +"| c #EEE275", +" . c #F2E571", +".. c #F2E572", +"X. c #F3E775", +"o. c #F1E577", +"O. c #F4E777", +"+. c #F2E873", +"@. c #F4E874", +"#. c #F5EA78", +"$. c #F5E87A", +"%. c #F6EA7C", +"&. c #000093", +"*. c #000095", +"=. c #000399", +"-. c #000FA1", +";. c #0019A3", +":. c #001BA5", +">. c #0021A9", +",. c #0029AD", +"<. c #002DAF", +"1. c #002DB7", +"2. c #0031B1", +"3. c #0133B3", +"4. c #0335B3", +"5. c #0537B3", +"6. c #0335B5", +"7. c #1543B9", +"8. c #5173CB", +"9. c #5777CD", +"0. c #5B7ACB", +"q. c #5B7BCF", +"w. c #607ECD", +"e. c #607FCD", +"r. c #617FD2", +"t. c #6583CE", +"y. c #6482CF", +"u. c #6584D4", +"i. c #6986D1", +"p. c #6A87D0", +"a. c #6985D2", +"s. c #6987D5", +"d. c #6D8AD3", +"f. c #6E8AD2", +"g. c #6E8AD6", +"h. c #708CD2", +"j. c #718ED3", +"k. c #708DD4", +"l. c #748FD5", +"z. c #7590D3", +"x. c #7590D5", +"c. c #7A93D4", +"v. c #7893D6", +"b. c #7D96D6", +"n. c #E6DD83", +"m. c #E9DF81", +"M. c #E9E185", +"N. c #EBE288", +"B. c #F4E188", +"V. c #F6ED8E", +"C. c #F7EC8F", +"Z. c #EFE89E", +"A. c #F7ED93", +"S. c #F8EE94", +"D. c #819AD8", +"F. c #859DD8", +"G. c #879EDA", +"H. c #889FDE", +"J. c #8AA2DC", +"K. c #8DA4DD", +"L. c #8EA4DD", +"P. c #8FA5DD", +/* pixels */ +"7.5.5.6.1.Z C V N B M = * * * % ", +"3.P.P.P.J.Z.S.S.A.C.B.z l k j $ ", +"5.P.x.x.g.M.%.$.X. .U a u r h @ ", +"4.P.x.k.s.M.$.X. .[ P u r 9 g @ ", +"3.J.z.p.u.M.@. . .~ L 0 8 5 f + ", +"<.G.f.p.u.E .] ~ ~ G 7 5 3 d + ", +",.G.p.t.q.R ~ ~ U K F 5 2 < s X ", +":.D.t.q.9.T _ Q Q K A 1 < > i X ", +":.b.y.0.8.T K L K D A , > - w X ", +"=.c.z.f.i.M.#.| ^ ^ I i w w q ", +":.=.*.&.&.c m n b v x o X X " +}; diff --git a/src/pixmaps/flags_xpm/tf.xpm b/src/pixmaps/flags_xpm/tf.xpm new file mode 100644 index 00000000..c2979402 --- /dev/null +++ b/src/pixmaps/flags_xpm/tf.xpm @@ -0,0 +1,160 @@ +/* XPM */ +static const char *tf[] = { +/* columns rows colors chars-per-pixel */ +"16 11 143 2", +" c #00000B", +". c #00000D", +"X c #00000F", +"o c #000011", +"O c #000015", +"+ c #000017", +"@ c #000019", +"# c #00001B", +"$ c #00001D", +"% c #000021", +"& c #000025", +"* c #000027", +"= c #00002B", +"- c #00002D", +"; c #000033", +": c #000039", +"> c #00003F", +", c #000043", +"< c #000045", +"1 c #000049", +"2 c #00004B", +"3 c #000051", +"4 c #000057", +"5 c #00005D", +"6 c #000061", +"7 c #000063", +"8 c #000065", +"9 c #00006B", +"0 c #00006F", +"q c #000373", +"w c #000975", +"e c #000977", +"r c #FB0000", +"t c #FD0000", +"y c #F83636", +"u c #F93B3B", +"i c #F93B3C", +"p c #FA4040", +"a c #FA4141", +"s c #FA4142", +"d c #FB4646", +"f c #FB4747", +"g c #FC4B4B", +"h c #FC4C4C", +"j c #FD5151", +"k c #FC6969", +"l c #FD6D6D", +"z c #FD7071", +"x c #2D4190", +"c c #304391", +"v c #314492", +"b c #354894", +"n c #364994", +"m c #374A96", +"M c #3A4D95", +"N c #3B4D97", +"B c #3A4D98", +"V c #3B4E99", +"C c #3C4E99", +"Z c #3C4F99", +"A c #3E5098", +"S c #3F529B", +"D c #405199", +"F c #425399", +"G c #40529A", +"H c #40539B", +"J c #42559B", +"K c #41539C", +"L c #41549C", +"P c #45569D", +"I c #45579D", +"U c #44589F", +"Y c #46589F", +"T c #4A5B9E", +"R c #485AA0", +"E c #4A5BA0", +"W c #4A5DA3", +"Q c #4E5FA1", +"! c #4C5DA2", +"~ c #4E5FA3", +"^ c #4E60A3", +"/ c #4F60A3", +"( c #4F62A6", +") c #5060A2", +"_ c #5364A2", +"` c #5263A4", +"' c #5364A6", +"] c #5665A4", +"[ c #5464A6", +"{ c #5767A7", +"} c #5A69A7", +"| c #5868A8", +" . c #5868A9", +".. c #5869A9", +"X. c #5C6BA9", +"o. c #5E6DA9", +"O. c #5C6DAC", +"+. c #5D6DAC", +"@. c #606FAC", +"#. c #6171AD", +"$. c #6171AE", +"%. c #6574AE", +"&. c #6575AF", +"*. c #6675B1", +"=. c #6977B2", +"-. c #6A78B2", +";. c #6D7BB3", +":. c #6E7CB3", +">. c #6A79B4", +",. c #6E7CB5", +"<. c #6F7FB7", +"1. c #717FB7", +"2. c #7581B3", +"3. c #7280B6", +"4. c #7784B4", +"5. c #7B88B7", +"6. c #7483BA", +"7. c #7684B9", +"8. c #7A88BB", +"9. c #7D89B8", +"0. c #7D89B9", +"q. c #7F8BBE", +"w. c #828EBF", +"e. c #8591C1", +"r. c #8894C3", +"t. c #8A95C5", +"y. c #8C98C5", +"u. c #8C98C6", +"i. c #8D98C6", +"p. c #919BC2", +"a. c #BBC1D5", +"s. c #BCC2D7", +"d. c #DCDEE7", +"f. c #DFE1E7", +"g. c #E2E4EA", +"h. c #E6E8ED", +"j. c #E8E9EE", +"k. c #FBFBFB", +"l. c gray99", +"z. c #FDFCFD", +"x. c #FDFDFD", +"c. c #FEFEFE", +"v. c gray100", +/* pixels */ +"e e e v.k.v.r t r 6 5 4 3 2 , 2 ", +"e i.t.v.v.v.z l k <.;.=.&.@.X.: ", +"e i.6.v.v.l.j h d ( W Y J C { ; ", +"e r.1.v.l.v.h f p W Y K V m ` = ", +"q r.,.v.k.k.d p i R F N b c ~ & ", +"0 w.=.v.l.k.p u y S V n c x T % ", +"9 w.&.$.+...[ / R I 9.j.h.d.5.@ ", +"8 w.$.+. .' ~ E P S J 9.s.F A + ", +"6 8.O.} [ / Y P S N ] g.a.f.4.o ", +"5 6.1.:.-.&.$.o.} ] ~ p.g.4.N . ", +"4 3 2 < > : ; - & % $ @ + . @ " +}; diff --git a/src/pixmaps/flags_xpm/tg.xpm b/src/pixmaps/flags_xpm/tg.xpm new file mode 100644 index 00000000..0417f988 --- /dev/null +++ b/src/pixmaps/flags_xpm/tg.xpm @@ -0,0 +1,172 @@ +/* XPM */ +static const char *tg[] = { +/* columns rows colors chars-per-pixel */ +"16 11 155 2", +" c #002700", +". c #002900", +"X c #002B00", +"o c #002D00", +"O c #002F00", +"+ c #003100", +"@ c #003300", +"# c #003700", +"$ c #003D00", +"% c #003F00", +"& c #004500", +"* c #004B00", +"= c #004D00", +"- c #004F00", +"; c #005100", +": c #005500", +"> c #005B00", +", c #005F00", +"< c #006100", +"1 c #006500", +"2 c #006B00", +"3 c #006F00", +"4 c #007100", +"5 c #007300", +"6 c #007700", +"7 c #FD0000", +"8 c red", +"9 c #AB7D00", +"0 c #F94646", +"q c #FB4646", +"w c #FA4B4B", +"e c #FC4B4B", +"r c #FB5050", +"t c #FB5151", +"y c #FB5554", +"u c #FC5555", +"i c #FC5656", +"p c #FC5959", +"a c #FD5B5B", +"s c #FD5E5E", +"d c #FE7172", +"f c #FD7777", +"g c #FE7676", +"h c #FE7777", +"j c #FD797A", +"k c #FE7B7B", +"l c #FF7B7B", +"z c #FE7D7D", +"x c #FE7E7E", +"c c #008700", +"v c #1A971A", +"b c #1F9A1F", +"n c #259D25", +"m c #2AA02B", +"M c #30A32C", +"N c #33A42F", +"B c #30A330", +"V c #35A632", +"C c #36A636", +"Z c #39A835", +"A c #3BA63B", +"S c #3DAA39", +"D c #3BB13B", +"F c #4BA314", +"G c #4FA519", +"H c #54A81F", +"J c #5BA920", +"K c #58AB24", +"L c #5FAC25", +"P c #5DAD2A", +"I c #41AD3D", +"U c #55B035", +"Y c #63AE2B", +"T c #61B02F", +"R c #67B130", +"E c #65B036", +"W c #6BB436", +"Q c #6FB63C", +"! c #72B53F", +"~ c #45AE42", +"^ c #4AB046", +"/ c #4EB34B", +"( c #50B44E", +") c #53B550", +"_ c #54B753", +"` c #57B855", +"' c #59B957", +"] c #5BBA58", +"[ c #5EBB5C", +"{ c #74BE41", +"} c #60BC5D", +"| c #62BE60", +" . c #65BE62", +".. c #66C065", +"X. c #6AC269", +"o. c #6FC96D", +"O. c #DF8D00", +"+. c #D59700", +"@. c #E79D00", +"#. c #D3B100", +"$. c #D6BE0B", +"%. c #D7C00E", +"&. c #D9C213", +"*. c #DAC419", +"=. c #DCC61E", +"-. c #FBC500", +";. c #F2C710", +":. c #F2C914", +">. c #F3CA19", +",. c #F4CC1F", +"<. c #DDC723", +"1. c #DFCA29", +"2. c #DCC82F", +"3. c #E1CC2E", +"4. c #EBCE2C", +"5. c #F5CE24", +"6. c #F5CF26", +"7. c #F6D02A", +"8. c #F6D12B", +"9. c #F7D22F", +"0. c #E2CE34", +"q. c #E4CF3A", +"w. c #F3CE32", +"e. c #EDD031", +"r. c #EED237", +"t. c #E4D13F", +"y. c #EFD43D", +"u. c #F7D331", +"i. c #F8D534", +"p. c #F8D536", +"a. c #F9D63C", +"s. c #F9D93A", +"d. c #FADA3F", +"f. c #E6D344", +"g. c #EDD549", +"h. c #EDDA4C", +"j. c #F0D542", +"k. c #F1D747", +"l. c #F6D644", +"z. c #FAD842", +"x. c #FBDC45", +"c. c #FBDD49", +"v. c #FBE347", +"b. c #EBDC66", +"n. c #FCE46A", +"m. c #FF8383", +"M. c #FE8787", +"N. c #FE9B9B", +"B. c #FDB3B4", +"V. c #FEB7B7", +"C. c #FED0D0", +"Z. c #FEDADA", +"A. c #FDDEDE", +"S. c #FDE4E4", +"D. c #FEFEFE", +/* pixels */ +"8 8 8 8 8 7 7 c 6 5 4 2 1 < > , ", +"8 l l x f k j o.X...} [ ' _ ( = ", +"8 m.N.C.d s a h.k.j.y.r.e.4.g.+.", +"8 x Z.D.A.a i v.z.a.p.i.8.6.l.@.", +"8 g V.S.B.w t { Q W R Y L J ! ; ", +"7 M.s p u q w D C B m n b v A O ", +"7 f p y w w q U T P K H G F E & ", +"-.n.c.x.x.s.i.9.7.6.,.>.:.;.w.O.", +"#.b.f.t.q.0.3.3.<.=.*.&.$.$.2.9 ", +"4 .} ] ` ( ( ^ ~ I S Z V V m . ", +"4 1 < > : = * & % % # O O . . @ " +}; diff --git a/src/pixmaps/flags_xpm/th.xpm b/src/pixmaps/flags_xpm/th.xpm new file mode 100644 index 00000000..91a3f10d --- /dev/null +++ b/src/pixmaps/flags_xpm/th.xpm @@ -0,0 +1,159 @@ +/* XPM */ +static const char *th[] = { +/* columns rows colors chars-per-pixel */ +"16 11 142 2", +" c #000025", +". c #000031", +"X c #000033", +"o c #00005B", +"O c #000073", +"+ c #00007B", +"@ c #00007D", +"# c #00007F", +"$ c #DD0000", +"% c #DF0000", +"& c #E10000", +"* c #E30000", +"= c #E50000", +"- c #E70000", +"; c #E90000", +": c #EB0000", +"> c #ED0000", +", c #EF0000", +"< c #F10000", +"1 c #F30000", +"2 c #F50000", +"3 c #F70000", +"4 c #F90000", +"5 c #FB0000", +"6 c #FD0000", +"7 c red", +"8 c #F24343", +"9 c #F24646", +"0 c #F24949", +"q c #F34B4B", +"w c #F44F4F", +"e c #F55353", +"r c #F65757", +"t c #F75858", +"y c #F75B5B", +"u c #F85C5C", +"i c #F76060", +"p c #F96060", +"a c #F86364", +"s c #FA6565", +"d c #F96868", +"f c #F96B6B", +"g c #FB6A6A", +"h c #FA6F6F", +"j c #FC6E6E", +"k c #FC7272", +"l c #FB7474", +"z c #FD7575", +"x c #FD797A", +"c c #FE7B7B", +"v c #FE7F7F", +"b c #0B0D99", +"n c #141494", +"m c #191996", +"M c #1A1A9A", +"N c #1F1F99", +"B c #1F1F9D", +"V c #20209B", +"C c #24249C", +"Z c #25259E", +"A c #25259F", +"S c #2A2A9F", +"D c #2B2BA1", +"F c #2A2BA3", +"G c #2F2FA2", +"H c #3636A3", +"J c #3030A4", +"K c #3030A5", +"L c #3535A5", +"P c #3636A7", +"I c #3B3BA7", +"U c #3636A8", +"Y c #3B3BA9", +"T c #3B3BAA", +"R c #3B3BAB", +"E c #3F3FA9", +"W c #4040AA", +"Q c #4141AC", +"! c #4040AE", +"~ c #4545AD", +"^ c #4646AF", +"/ c #4E50AF", +"( c #4145B1", +") c #4646B1", +"_ c #494AB0", +"` c #4B4BB2", +"' c #4B4AB3", +"] c #4F4FB2", +"[ c #4F4FB5", +"{ c #504FB4", +"} c #5153B1", +"| c #5557B3", +" . c #5353B7", +".. c #5454B6", +"X. c #595BB5", +"o. c #5858B8", +"O. c #5D5FB8", +"+. c #6263BA", +"@. c #6667BC", +"#. c #6769BA", +"$. c #6A6CBF", +"%. c #6F6FC0", +"&. c #6E70C1", +"*. c #7374C3", +"=. c #7272C4", +"-. c #7676C5", +";. c #7779C2", +":. c #7778C6", +">. c #7B7BC4", +",. c #7B7CC7", +"<. c #7F80C6", +"1. c #FE8180", +"2. c #FF8383", +"3. c #8283C8", +"4. c #8587CA", +"5. c #8A8BCB", +"6. c #898ACC", +"7. c #8C8ECF", +"8. c #9091D0", +"9. c #9394D2", +"0. c #9395D2", +"q. c #9697D4", +"w. c #989AD5", +"e. c #9B9CD6", +"r. c #ADAEDD", +"t. c #DFDFDF", +"y. c #E9E9E9", +"u. c #F1F1F1", +"i. c gray95", +"p. c #F3F3F3", +"a. c #F4F4F4", +"s. c gray96", +"d. c #F6F6F6", +"f. c gray97", +"g. c #F8F8F8", +"h. c #F9F9F9", +"j. c gray98", +"k. c #FBFBFB", +"l. c gray99", +"z. c #FDFDFD", +"x. c #FEFEFE", +"c. c gray100", +/* pixels */ +"7 7 7 7 7 7 7 7 4 4 3 3 1 1 > > ", +"7 2.2.2.1.c x l k h g s p u t : ", +"z.z.z.z.z.z.z.z.k.k.k.g.f.d.f.y.", +"( r.e.w.0.0.8.7.6.4.3.,.>.;.5.# ", +"# -.o...} _ ) ! R L J D Z V E X ", +"+ =. .[ ' ) ! Y U K D Z B M I X ", +"O =.] _ ^ W Y L J S C V m n H ", +"b 0.>.-.=.%.$.@.@.X.X.| } / #.o ", +"g.l.g.k.g.g.d.d.s.s.p.p.u.u.u.t.", +"3 k k g g a i y r e w q 0 9 8 $ ", +"1 1 1 > : > : : = = * * $ $ $ $ " +}; diff --git a/src/pixmaps/flags_xpm/tj.xpm b/src/pixmaps/flags_xpm/tj.xpm new file mode 100644 index 00000000..76938228 --- /dev/null +++ b/src/pixmaps/flags_xpm/tj.xpm @@ -0,0 +1,132 @@ +/* XPM */ +static const char *tj[] = { +/* columns rows colors chars-per-pixel */ +"16 11 115 2", +" c black", +". c #000700", +"X c #000F00", +"o c #001700", +"O c #001D00", +"+ c #002500", +"@ c #0B640B", +"# c #0F670E", +"$ c #136A13", +"% c #186D19", +"& c #1E711E", +"* c #237523", +"= c #297829", +"- c #2C792C", +"; c #2F7A2F", +": c #2F7B2F", +"> c #2E7C2E", +", c #327D32", +"< c #357F35", +"1 c #950000", +"2 c #990000", +"3 c #9D0000", +"4 c #A10000", +"5 c #A50000", +"6 c #A70000", +"7 c #AB0000", +"8 c #AF0000", +"9 c #B10000", +"0 c #B30000", +"q c #B70000", +"w c #BB0000", +"e c #BD0000", +"r c #BF0000", +"t c #CE2C2C", +"y c #D03131", +"u c #D13737", +"i c #D33C3D", +"p c #D54242", +"a c #D64747", +"s c #D44949", +"d c #D64E4E", +"f c #D84C4C", +"g c #D95151", +"h c #D85353", +"j c #DB5454", +"k c #D95757", +"l c #DD5959", +"z c #DA5C5C", +"x c #DD5C5C", +"c c #DE5F5F", +"v c #DC6060", +"b c #DD6565", +"n c #DE6969", +"m c #DF6D6D", +"M c #E17071", +"N c #E27474", +"B c #E27777", +"V c #E37979", +"C c #E47B7A", +"Z c #E47B7B", +"A c #348034", +"S c #398239", +"D c #3A843A", +"F c #3D843D", +"G c #3F873F", +"H c #428842", +"J c #448B44", +"K c #468A46", +"L c #4B8E4B", +"P c #509150", +"I c #549455", +"U c #589758", +"Y c #5D9A5D", +"T c #619E62", +"R c #66A166", +"E c #F5CF5D", +"W c #F6D161", +"Q c #F5D673", +"! c #F3D475", +"~ c #F4D678", +"^ c #F7D97D", +"/ c #F5D87E", +"( c #F7DB83", +") c #F8DD8C", +"_ c #F8DE8D", +"` c #F6DF97", +"' c #F7E19A", +"] c #F7E19B", +"[ c #F8E29E", +"{ c #F9E5A8", +"} c #F8E5AB", +"| c #F9E9B6", +" . c LightGray", +".. c #D5D5D5", +"X. c #D7D7D7", +"o. c gray86", +"O. c #F8F2DD", +"+. c #F8F6EE", +"@. c #F1F1F1", +"#. c gray95", +"$. c #F3F3F3", +"%. c #F4F4F4", +"&. c #F4F5F5", +"*. c gray96", +"=. c #F6F6F6", +"-. c gray97", +";. c #F8F8F8", +":. c #F9F9F9", +">. c gray98", +",. c #FBFBFB", +"<. c #FBFCFB", +"1. c gray99", +"2. c #FDFCFD", +"3. c #FDFDFD", +"4. c #FEFEFE", +/* pixels */ +"r r r r r w w q 0 0 8 7 6 6 3 3 ", +"r Z Z V V N M m n b v z k h d 2 ", +"r C c c l j g f a p i u y t s 1 ", +"=.2.2.2.2.<.^ { } Q +.=.=.=.=.o.", +"=.2.2.2.2._ | [ ] O./ =.=.%.=.X.", +"%.2.2.2._ <.,.' ` ;.=.! #.%.#.X.", +"#.2.<.<.<.,.( W E ~ &.#.%.#.%. .", +"@.<.<.<.,.:.-.=.=.=.=.#.#.#.#. .", +"+ R J G S A > - * & % $ # @ ; ", +"O T Y U I P L K H F S < , ; - ", +"o o . " +}; diff --git a/src/pixmaps/flags_xpm/tk.xpm b/src/pixmaps/flags_xpm/tk.xpm new file mode 100644 index 00000000..8690dda1 --- /dev/null +++ b/src/pixmaps/flags_xpm/tk.xpm @@ -0,0 +1,172 @@ +/* XPM */ +static const char *tk[] = { +/* columns rows colors chars-per-pixel */ +"16 11 155 2", +" c #000071", +". c #000073", +"X c #000077", +"o c #000079", +"O c #00007B", +"+ c #00007D", +"@ c #00007F", +"# c #407C68", +"$ c #52A03B", +"% c #57A33F", +"& c #5BA450", +"* c #60A448", +"= c #498A65", +"- c #43806B", +"; c #5A8E7E", +": c #A3A65E", +"> c #AFB05D", +", c #969662", +"< c #A7A464", +"1 c #A4A56B", +"2 c #B0B161", +"3 c #B0B164", +"4 c #B4B568", +"5 c #B7B96B", +"6 c #A6A679", +"7 c #A7A87A", +"8 c #B7B872", +"9 c #BAB871", +"0 c #B0B27D", +"q c #B4B47F", +"w c #B8B67F", +"e c #BABC7A", +"r c #C5BA45", +"t c #C1BB5A", +"y c #D9CE4D", +"u c #CAC255", +"i c #CCC459", +"p c #CEC85D", +"a c #D3CB58", +"s c #DDD258", +"d c #EADB4B", +"f c #EBDD50", +"g c #CFC860", +"h c #D6CD6E", +"j c #D8D065", +"k c #C9C679", +"l c #DFD97C", +"z c #F3E670", +"x c #F4E874", +"c c #000081", +"v c #000083", +"b c #000085", +"n c #000087", +"m c #00008D", +"M c #000091", +"N c #000093", +"B c #000099", +"V c #00009D", +"C c #0000A1", +"Z c #0000A5", +"A c #0000A7", +"S c #0000A9", +"D c #0000AB", +"F c #0000AD", +"G c #0000AF", +"H c #0000B3", +"J c #0000B5", +"K c #0000B9", +"L c #0000BB", +"P c #0B2CBE", +"I c #1334BB", +"U c #1030BF", +"Y c #2D5AB1", +"T c #2A56B9", +"R c #465DBC", +"E c #4461BE", +"W c #0000C3", +"Q c #0001C3", +"! c #0003C5", +"~ c #0005C5", +"^ c #000BC5", +"/ c #1435C1", +"( c #1A3AC4", +") c #203FC6", +"_ c #2C48C6", +"` c #2F4BC7", +"' c #2645C8", +"] c #2F4BC8", +"[ c #2C49CA", +"{ c #2F4CCF", +"} c #324DC8", +"| c #334EC8", +" . c #3651C9", +".. c #3651CF", +"X. c #3B56CC", +"o. c #3F5ACD", +"O. c #3551D0", +"+. c #3B56D1", +"@. c #3B56D2", +"#. c #445ECF", +"$. c #415BD2", +"%. c #445FD2", +"&. c #5268C3", +"*. c #516CC5", +"=. c #4963D1", +"-. c #4E67D3", +";. c #4963D4", +":. c #4F68D6", +">. c #556ED3", +",. c #536BD4", +"<. c #586FD6", +"1. c #536CD8", +"2. c #5D77D2", +"3. c #5F76D4", +"4. c #5871D9", +"5. c #5870DA", +"6. c #5D75D8", +"7. c #5C7ADF", +"8. c #6578C8", +"9. c #6D7FCC", +"0. c #6178D9", +"q. c #667CDB", +"w. c #607CDC", +"e. c #5F7DE0", +"r. c #7A838D", +"t. c #7B8BBE", +"y. c #6A80DD", +"u. c #6F84DE", +"i. c #7286DF", +"p. c #7F91DA", +"a. c #768AE0", +"s. c #7991E5", +"d. c #7992E5", +"f. c #7B94E6", +"g. c #828E82", +"h. c #818E88", +"j. c #89908E", +"k. c #8B978E", +"l. c #919E81", +"z. c #8C9991", +"x. c #8B939C", +"c. c #919C99", +"v. c #9DA98E", +"b. c #97A29B", +"n. c #A0A595", +"m. c #A0AB92", +"M. c #A1A79B", +"N. c #A4B093", +"B. c #8C96A7", +"V. c #AAAFA1", +"C. c #B3B8AE", +"Z. c #E3DC86", +"A. c #E2E7F6", +"S. c #E9EBF7", +"D. c #E7EAF8", +/* pixels */ +"^ ~ ~ ~ L K J A C F H A A V V V ", +"! f.f.d.p.C.Z.x z l V.9.<.,.:.N ", +"~ d.e.w.S.t.k m.v.v.g 6 R [ =.M ", +"! d.7.4.0.S.0.q q 8 5 u r.' #.m ", +"Q a.4.M.B.>.A.$.$.k.t j.< ( #.n ", +"K i.1.h b.e *.@. .#.3 ; r ( X.v ", +"J i.:.q c.s z.O.{ T & * , I .@ ", +"H y.;.x.9 p y t < Y = * # U | @ ", +"F q.%.&.7 i l.2 > : # % I P ` O ", +"F 0.6.<.8.n.j f d a j.; | ` _ X ", +"D A C V B B m . . v v @ O O O O " +}; diff --git a/src/pixmaps/flags_xpm/tl.xpm b/src/pixmaps/flags_xpm/tl.xpm new file mode 100644 index 00000000..0a9a113d --- /dev/null +++ b/src/pixmaps/flags_xpm/tl.xpm @@ -0,0 +1,151 @@ +/* XPM */ +static const char *tl[] = { +/* columns rows colors chars-per-pixel */ +"16 11 134 2", +" c black", +". c #450000", +"X c #711900", +"o c #494949", +"O c #4B4A4B", +"+ c #4C4C52", +"@ c #545458", +"# c gray36", +"$ c #717145", +"% c gray40", +"& c #6D6D6D", +"* c #797979", +"= c #7B7B7A", +"- c #DD0000", +"; c #DF0000", +": c #E10000", +"> c #E30000", +", c #E50000", +"< c #E70000", +"1 c #E90000", +"2 c #EB0000", +"3 c #ED0000", +"4 c #EF0000", +"5 c #F10000", +"6 c #F30000", +"7 c #F50000", +"8 c #F70000", +"9 c #F90000", +"0 c #FB0000", +"q c #FD0000", +"w c red", +"e c #FF0900", +"r c #F10B0B", +"t c #F10F0E", +"y c #F21010", +"u c #F21313", +"i c #F21414", +"p c #F31919", +"a c #F31A1A", +"s c #F41E1E", +"d c #F41F1F", +"f c #F42020", +"g c #F52323", +"h c #F52424", +"j c #F52525", +"k c #F52626", +"l c #F62929", +"z c #F62A2A", +"x c #F62B2B", +"c c #F22C2C", +"v c #F22F2F", +"b c #F62C2C", +"n c #F72E2E", +"m c #F72F2F", +"M c #F23232", +"N c #F33232", +"B c #F73030", +"V c #F73131", +"C c #F33535", +"Z c #F43636", +"A c #F83434", +"S c #F83636", +"D c #F83736", +"F c #F83737", +"G c #F73A30", +"H c #F43939", +"J c #F43B3B", +"K c #F53D3D", +"L c #F53F3F", +"P c #F93C3C", +"I c #F93C3D", +"U c #F84C35", +"Y c #F9433D", +"T c #F9763B", +"R c #F64242", +"E c #F64444", +"W c #F74646", +"Q c #FA4142", +"! c #FA4242", +"~ c #FB4747", +"^ c #F74949", +"/ c #F74B4B", +"( c #F74E4E", +") c #FC4C4C", +"_ c #FC5C4C", +"` c #F85050", +"' c #F85353", +"] c #FD5151", +"[ c #F95455", +"{ c #F95757", +"} c #FD5454", +"| c #FA5C5C", +" . c #F96659", +".. c #FB6060", +"X. c #FC6565", +"o. c #FC6969", +"O. c #FD6D6D", +"+. c #FD7071", +"@. c #FE7474", +"#. c #FE7777", +"$. c #7A8045", +"%. c #7F8150", +"&. c #F88736", +"*. c #F88B38", +"=. c #F9B33C", +"-. c #F2D73F", +";. c #F9E53B", +":. c #F9F93C", +">. c #818A44", +",. c #8E8D47", +"<. c #8F9659", +"1. c #9AA25F", +"2. c #9D9662", +"3. c #B3AB7C", +"4. c #FA8642", +"5. c #FE855A", +"6. c #F7AD5E", +"7. c #FDB651", +"8. c #FE817A", +"9. c #FDBA7C", +"0. c #F9DD5D", +"q. c #E1E841", +"w. c #E8EF4C", +"e. c #FBE147", +"r. c #EEF040", +"t. c #F9FA40", +"y. c #F6F355", +"u. c #A3A3A2", +"i. c #A4A4A4", +"p. c #D5D5D5", +"a. c #D7D7D7", +"s. c #D7D7D8", +"d. c #EEEDED", +"f. c gray96", +/* pixels */ +"X e w w w 0 w 0 0 0 0 6 6 6 3 3 ", +" 3.9.8.#.@.+.+.o.X...| { ' ( 2 ", +" * 1.0.5.} ] ) ~ Q K F V b ^ 2 ", +" * # <.y.7._ ~ Q I F V x k E , ", +" i.s.@ >.w.e.4.Y F b x k f K , ", +" d.f.p.+ ,.t.:.*.V b k d a I , ", +" i.p.+ $ q.;.&.G x g d a i C : ", +" & o $.r.=.U n x g d a i y N ; ", +" % >.-.T F n x g d i i y r v ; ", +" 2.6. .[ ( / E R J J C N v v ; ", +". 6 6 3 3 3 2 , 2 : , : ; - - - " +}; diff --git a/src/pixmaps/flags_xpm/tm.xpm b/src/pixmaps/flags_xpm/tm.xpm new file mode 100644 index 00000000..8ecd9269 --- /dev/null +++ b/src/pixmaps/flags_xpm/tm.xpm @@ -0,0 +1,160 @@ +/* XPM */ +static const char *tm[] = { +/* columns rows colors chars-per-pixel */ +"16 11 143 2", +" c black", +". c #000700", +"X c #000F00", +"o c #001500", +"O c #001700", +"+ c #001D00", +"@ c #002300", +"# c #002500", +"$ c #002B00", +"% c #002D00", +"& c #002F00", +"* c #003100", +"= c #003500", +"- c #003700", +"; c #003900", +": c #0B632D", +"> c #0D602D", +", c #106231", +"< c #116331", +"1 c #156635", +"2 c #166635", +"3 c #166636", +"4 c #1A693A", +"5 c #1B6A3A", +"6 c #1B6A3B", +"7 c #206D3D", +"8 c #206E3E", +"9 c #216E3F", +"0 c #226E40", +"q c #257142", +"w c #267143", +"e c #267243", +"r c #277244", +"t c #277245", +"y c #287345", +"u c #2B7447", +"i c #2C7547", +"p c #2B7548", +"a c #2C7548", +"s c #2C7649", +"d c #2D764A", +"f c #2E764A", +"g c #30764B", +"h c #30774B", +"j c #30784C", +"k c #31784C", +"l c #317A4D", +"z c #33794E", +"x c #337B4F", +"c c #347A4E", +"v c #337B50", +"b c #367B51", +"n c #367C51", +"m c #377C51", +"M c #367D52", +"N c #397F54", +"B c #3A7E55", +"V c #3B7F56", +"C c #890000", +"Z c #910000", +"A c #9F0000", +"S c #AB0000", +"D c #AD0000", +"F c #BB2719", +"G c #9D6354", +"H c #956859", +"J c #B7605E", +"K c #C55B54", +"L c #CD6553", +"P c #C8645E", +"I c #C9645F", +"U c #CE695B", +"Y c #CE6A5C", +"T c #D16954", +"R c #C16360", +"E c #CC6C67", +"W c #CC6D67", +"Q c #CF7167", +"! c #CF7565", +"~ c #CF736D", +"^ c #CF776C", +"/ c #D17164", +"( c #D27265", +") c #D4796C", +"_ c #D37F75", +"` c #3C8056", +"' c #3C8156", +"] c #3D8157", +"[ c #3E8157", +"{ c #40825A", +"} c #42845B", +"| c #42845C", +" . c #42855C", +".. c #43865D", +"X. c #45865E", +"o. c #478760", +"O. c #478861", +"+. c #488961", +"@. c #488A62", +"#. c #4A8A63", +"$. c #4C8A65", +"%. c #4D8C65", +"&. c #4F8D67", +"*. c #508E69", +"=. c #518F6A", +"-. c #528F6A", +";. c #54906C", +":. c #59946F", +">. c #5B9572", +",. c #5E9674", +"<. c #629978", +"1. c #639A79", +"2. c #649979", +"3. c #649A79", +"4. c #679E7D", +"5. c #DE8A70", +"6. c #D5857E", +"7. c #6CA081", +"8. c #6FA182", +"9. c #6FA282", +"0. c #70A484", +"q. c #74A687", +"w. c #75A789", +"e. c #76A88A", +"r. c #7AAA8D", +"t. c #7CAB8F", +"y. c #7CAC8F", +"u. c #7EAC8F", +"i. c #80AE92", +"p. c #85B095", +"a. c #8EB59E", +"s. c #8FB69E", +"d. c #DD9388", +"f. c #DC918F", +"g. c #DC9A92", +"h. c #E2A199", +"j. c #B5CEBE", +"k. c #BFD4C8", +"l. c #C1D6C9", +"z. c #D3E2DA", +"x. c #D8E5DD", +"c. c #E2EBE5", +"v. c #E4ECE7", +/* pixels */ +"; ; F S S * & : @ + o X . ", +"; y.d.f.h.w.u.9.l.a.1.,.>.-.&. ", +"; t.~ 5.W p.-.y.#.c.>.N v f @. ", +"- r.) Q / -.j.@.k.v.1.v f y X. ", +"- w.E R I $.9.x.z.s.| f t 0 [ ", +"& q./ J Y O.| ' 1. .f r 0 6 V ", +"$ 0.I H K | ' m k f e 9 6 3 M ", +"# 7.U G L ' m k u e 9 6 3 < c ", +"+ 4.g.T 6.m f f e 6 6 2 , > g ", +"o 1.^ _ ! -.$.X...' V M z g i ", +"o . Z D C " +}; diff --git a/src/pixmaps/flags_xpm/tn.xpm b/src/pixmaps/flags_xpm/tn.xpm new file mode 100644 index 00000000..e2d963b3 --- /dev/null +++ b/src/pixmaps/flags_xpm/tn.xpm @@ -0,0 +1,153 @@ +/* XPM */ +static const char *tn[] = { +/* columns rows colors chars-per-pixel */ +"16 11 136 2", +" c #DD0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #ED0000", +"% c #EF0000", +"& c #F10000", +"* c #F30000", +"= c #F50000", +"- c #F70000", +"; c #F90000", +": c #FB0000", +"> c #FD0000", +", c red", +"< c #F10B0B", +"1 c #F10F0E", +"2 c #F21010", +"3 c #F21313", +"4 c #F21414", +"5 c #F31919", +"6 c #F31A1A", +"7 c #F41F1F", +"8 c #F42020", +"9 c #F52525", +"0 c #F52626", +"q c #F62B2B", +"w c #F22C2C", +"e c #F22F2F", +"r c #F62C2C", +"t c #F23232", +"y c #F33232", +"u c #F73131", +"i c #F33535", +"p c #F43636", +"a c #F83737", +"s c #F43939", +"d c #F43B3B", +"f c #F53D3D", +"g c #F73C3C", +"h c #F53F3F", +"j c #F93A3A", +"k c #FA3F3F", +"l c #F64242", +"z c #F64444", +"x c #F74646", +"c c #F84242", +"v c #FA4444", +"b c #FB4545", +"n c #F74949", +"m c #F74B4B", +"M c #F74E4E", +"N c #FB4949", +"B c #FB4A49", +"V c #FC4F4F", +"C c #F35555", +"Z c #F85050", +"A c #FB5151", +"S c #F85353", +"D c #FB5252", +"F c #FD5353", +"G c #F95455", +"H c #F95757", +"J c #FD5454", +"K c #F45959", +"L c #F35D5D", +"P c #F65C5C", +"I c #F55E5E", +"U c #F95858", +"Y c #FE5858", +"T c #FE5959", +"R c #FA5C5C", +"E c #FA5D5D", +"W c #FE5C5C", +"Q c #FE5F5F", +"! c #F66363", +"~ c #FB6060", +"^ c #FB6162", +"/ c #F86565", +"( c #FC6565", +") c #FC6666", +"_ c #F76867", +"` c #FC6969", +"' c #FC6A6A", +"] c #FA6D6D", +"[ c #FA6F6F", +"{ c #FD6D6D", +"} c #FD6F6F", +"| c #FD7071", +" . c #FE7273", +".. c #F97777", +"X. c #FE7474", +"o. c #FC7676", +"O. c #FC7777", +"+. c #FE7676", +"@. c #FE7777", +"#. c #F67C7C", +"$. c #F97878", +"%. c #FE7979", +"&. c #FF7B7A", +"*. c #FF7B7B", +"=. c #F98282", +"-. c #F88484", +";. c #F89493", +":. c #F79D9D", +">. c #F99998", +",. c #FB9F9F", +"<. c #F4A1A1", +"1. c #F4ABAB", +"2. c #F9A9A9", +"3. c #FAACAC", +"4. c #F5B2B2", +"5. c #F7B5B5", +"6. c #FBB0B0", +"7. c #FAB1B1", +"8. c #F8B2B2", +"9. c #FCB2B2", +"0. c #FDB4B4", +"q. c #FDB5B5", +"w. c #FDB7B7", +"e. c #F9BDBD", +"r. c #FDC1C1", +"t. c #F7D6D6", +"y. c #F5D9D9", +"u. c #F7DCDC", +"i. c #FDDFDF", +"p. c #F8E7E7", +"a. c #F6E9E9", +"s. c #F5EBEB", +"d. c #F6ECEC", +"f. c #FAE9E9", +"g. c #FBEEEE", +"h. c #FCEFEF", +/* pixels */ +", , , , , : , , : : - - & & % % ", +", *.*.*.@.X.| ] ' ( ~ E H S M @ ", +", *.Q W W r.i.h.g.9.$.p u r n @ ", +", @.Q H q.q.O.A ] e.;._ q 0 z + ", +", @.Y J q.o.,.f.=.-.u./ 0 7 h + ", +", .F V 9.A a.o.l 5.a.I 7 6 d + ", +": } V N 6.] >.p.:.#.y.K 6 4 p X ", +": ' N b 3.2./ g P 4.1.C 2 2 t . ", +": ) b k j 4.t.d.a.<.L 2 1 < e . ", +"- ~ E U G V M z l h d p t e e ", +"- & & % % @ @ @ + + X X . " +}; diff --git a/src/pixmaps/flags_xpm/to.xpm b/src/pixmaps/flags_xpm/to.xpm new file mode 100644 index 00000000..3426917a --- /dev/null +++ b/src/pixmaps/flags_xpm/to.xpm @@ -0,0 +1,134 @@ +/* XPM */ +static const char *to[] = { +/* columns rows colors chars-per-pixel */ +"16 11 117 2", +" c #DD0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #ED0000", +"% c #EF0000", +"& c #F10000", +"* c #F30000", +"= c #F50000", +"- c #F70000", +"; c #F90000", +": c #FB0000", +"> c #FD0000", +", c #F10B0B", +"< c #F10F0E", +"1 c #F21010", +"2 c #F21313", +"3 c #F21414", +"4 c #F31919", +"5 c #F31A1A", +"6 c #F41E1E", +"7 c #F41F1F", +"8 c #F42020", +"9 c #F52323", +"0 c #F52424", +"q c #F52525", +"w c #F52626", +"e c #F62929", +"r c #F62A2A", +"t c #F62B2B", +"y c #F22C2C", +"u c #F22F2F", +"i c #F62C2C", +"p c #F72E2E", +"a c #F72F2F", +"s c #F23232", +"d c #F33232", +"f c #F73030", +"g c #F73131", +"h c #F33535", +"j c #F43636", +"k c #F83434", +"l c #F83535", +"z c #F83636", +"x c #F83736", +"c c #F83737", +"v c #F43939", +"b c #F43B3B", +"n c #F53D3D", +"m c #F53F3F", +"M c #F93A3A", +"N c #F93B3A", +"B c #F93B3B", +"V c #F93B3C", +"C c #F93C3C", +"Z c #F93C3D", +"A c #FA3F3F", +"S c #F64242", +"D c #F64444", +"F c #F74646", +"G c #FA4040", +"H c #FA4141", +"J c #FA4142", +"K c #FA4242", +"L c #FA4444", +"P c #FB4545", +"I c #FB4646", +"U c #FB4747", +"Y c #F74949", +"T c #F74B4B", +"R c #F74E4E", +"E c #FB4949", +"W c #FB4A49", +"Q c #FC4A4B", +"! c #FC4C4C", +"~ c #FC4F4F", +"^ c #F85050", +"/ c #F85353", +"( c #FD5353", +") c #F95455", +"_ c #F95757", +"` c #F95858", +"' c #FA5C5C", +"] c #FA5D5D", +"[ c #FE5C5C", +"{ c #FE5E5F", +"} c #FE5F5F", +"| c #FB6060", +" . c #FB6162", +".. c #FE6060", +"X. c #FC6565", +"o. c #FC6666", +"O. c #FC6969", +"+. c #FC6A6A", +"@. c #FD6D6D", +"#. c #FD6F6F", +"$. c #FE7273", +"%. c #FE8585", +"&. c #FDCFCF", +"*. c #FED2D2", +"=. c #FED9D9", +"-. c #FFDBDB", +";. c #EFEFEF", +":. c #EFEFF1", +">. c #F1F1F1", +",. c #FBFBFB", +"<. c gray99", +"1. c #FDFCFC", +"2. c #FDFCFD", +"3. c #FDFDFD", +"4. c #FDFDFE", +"5. c #FEFEFE", +"6. c gray100", +/* pixels */ +">.>.>.>.;.:.;.> : : - - & & % % ", +">.6.-.%.=.6.6.@.O.X.| ' _ / R @ ", +";.6.} } } <.6.! P G A M a a Y @ ", +">.6.*.} &.<.,.E G n l g t w D + ", +">.6.6.6.,.,.,.G V l a t w 6 n + ", +"> $.( ~ Q P G M l g t w 6 5 n + ", +"> #.~ E P G M l a t 9 7 5 3 j X ", +": +.E P A M l a t w 7 5 3 1 d ", +"- X.P A M j a t 9 7 3 3 < , u ", +"- .' ` ) R Y P S b b j d u u ", +"- & & % % % @ @ + + X X X " +}; diff --git a/src/pixmaps/flags_xpm/tr.xpm b/src/pixmaps/flags_xpm/tr.xpm new file mode 100644 index 00000000..01d740e9 --- /dev/null +++ b/src/pixmaps/flags_xpm/tr.xpm @@ -0,0 +1,150 @@ +/* XPM */ +static const char *tr[] = { +/* columns rows colors chars-per-pixel */ +"16 11 133 2", +" c #DD0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #ED0000", +"% c #EF0000", +"& c #F10000", +"* c #F30000", +"= c #F50000", +"- c #F70000", +"; c #F90000", +": c #FB0000", +"> c #FD0000", +", c red", +"< c #F10B0B", +"1 c #F10F0E", +"2 c #F21010", +"3 c #F21313", +"4 c #F21414", +"5 c #F31919", +"6 c #F31A1A", +"7 c #F41E1E", +"8 c #F41F1F", +"9 c #F42020", +"0 c #F52323", +"q c #F52424", +"w c #F52525", +"e c #F52626", +"r c #F62B2B", +"t c #F22C2C", +"y c #F22F2F", +"u c #F62C2C", +"i c #F23232", +"p c #F33232", +"a c #F63030", +"s c #F73131", +"d c #F63333", +"f c #F33535", +"g c #F43636", +"h c #F83736", +"j c #F83737", +"k c #F43939", +"l c #F43B3B", +"z c #F53D3D", +"x c #F53F3F", +"c c #F93A3A", +"v c #F93B3A", +"b c #F93B3B", +"n c #F93C3C", +"m c #F93C3D", +"M c #F93D3D", +"N c #FA3F3F", +"B c #F64242", +"V c #F74343", +"C c #F64444", +"Z c #F74646", +"A c #FA4040", +"S c #FA4242", +"D c #FA4444", +"F c #FB4545", +"G c #FB4646", +"H c #FB4747", +"J c #F74949", +"K c #F74B4B", +"L c #F74E4E", +"P c #FA4848", +"I c #FB4949", +"U c #FC4F4F", +"Y c #F85050", +"T c #F85353", +"R c #FD5353", +"E c #F95455", +"W c #F95757", +"Q c #FC5555", +"! c #F95858", +"~ c #FE5858", +"^ c #FE5959", +"/ c #FA5C5C", +"( c #FA5D5D", +") c #FE5C5C", +"_ c #FE5F5F", +"` c #F56262", +"' c #F86161", +"] c #FB6060", +"[ c #FB6565", +"{ c #FC6565", +"} c #FC6666", +"| c #FC6969", +" . c #FC6A6A", +".. c #FD6D6D", +"X. c #FD6F6F", +"o. c #FA7070", +"O. c #FA7171", +"+. c #FD7071", +"@. c #FE7273", +"#. c #FE7474", +"$. c #FE7777", +"%. c #F67D7D", +"&. c #FE7979", +"*. c #FD7A7A", +"=. c #FE7A7A", +"-. c #FF7B7B", +";. c #FE7D7D", +":. c #FF7E7E", +">. c #FF7F7F", +",. c #FC8080", +"<. c #F88787", +"1. c #F78C8C", +"2. c #FD9D9D", +"3. c #FD9F9F", +"4. c #FBA2A2", +"5. c #F7B7B7", +"6. c #FAB0B0", +"7. c #FDB4B4", +"8. c #FCBEBF", +"9. c #FBC0C0", +"0. c #F5D1D1", +"q. c #F7D7D7", +"w. c #F8D8D8", +"e. c #F8E3E3", +"r. c #F9E3E3", +"t. c #F8E5E5", +"y. c #FCE4E4", +"u. c #F6EFEF", +"i. c #FDE9E9", +"p. c #F7F5F5", +"a. c #FBF3F3", +"s. c #FCF3F3", +"d. c #FDF6F6", +/* pixels */ +", , , , , , : , : - - - * * $ $ ", +", :.&.&.&.#.+.X.| [ ] / W T L # ", +", :.] ) ^ 2.2.Q F A n j d u J # ", +", :.) ^ 7.i.y.8.I n j d r e C O ", +", &.^ &.d.,.G O.n r.V u e 7 x O ", +", #.R 8.a.F A b t.p.u.` 7 5 l O ", +": X.U 4.a.O.b ` 5.%.0.9 5 4 g o ", +": .I F 6.e.w.q.d e 8 5 4 2 p . ", +": | F n b <.1.g 9 8 5 2 2 < y . ", +"- [ / W T T I C V x k f p y y ", +"- * * $ $ $ # O O O O o . " +}; diff --git a/src/pixmaps/flags_xpm/tt.xpm b/src/pixmaps/flags_xpm/tt.xpm new file mode 100644 index 00000000..19dd1743 --- /dev/null +++ b/src/pixmaps/flags_xpm/tt.xpm @@ -0,0 +1,163 @@ +/* XPM */ +static const char *tt[] = { +/* columns rows colors chars-per-pixel */ +"16 11 146 2", +" c black", +". c #131313", +"X c gray9", +"o c #181919", +"O c #191919", +"+ c gray12", +"@ c gray14", +"# c #2A2A2A", +"$ c #2F2F2F", +"% c #323232", +"& c #353535", +"* c gray21", +"= c gray23", +"- c #414141", +"; c #464646", +": c #4B4B4B", +"> c #4C4C4C", +", c #515151", +"< c gray33", +"1 c #555555", +"2 c #585858", +"3 c gray35", +"4 c gray36", +"5 c gray38", +"6 c gray39", +"7 c #656566", +"8 c DimGray", +"9 c #6C6C6C", +"0 c #6F6F6F", +"q c #727272", +"w c #777777", +"e c #797979", +"r c #7B7B7B", +"t c gray50", +"y c #DD0000", +"u c #DF0000", +"i c #E30000", +"p c #E50000", +"a c #E70000", +"s c #E50505", +"d c #E90000", +"f c #EB0000", +"g c #ED0000", +"h c #EF0000", +"j c #F10000", +"k c #F30000", +"l c #F50000", +"z c #F70000", +"x c #F90000", +"c c #FB0000", +"v c #FD0000", +"b c red", +"n c #F21414", +"m c #F31A1A", +"M c #F41F1F", +"N c #F42020", +"B c #F52525", +"V c #F52626", +"C c #FF2525", +"Z c #F62B2B", +"A c #F62C2C", +"S c #F72E2E", +"D c #F33232", +"F c #F73131", +"G c #F43636", +"H c #F83434", +"J c #F83736", +"K c #F83737", +"L c #F43B3B", +"P c #F53F3F", +"I c #F93A3A", +"U c #F93C3D", +"Y c #FA3F3F", +"T c #F64444", +"R c #F74646", +"E c #FA4242", +"W c #FA4444", +"Q c #FB4545", +"! c #F74949", +"~ c #F74B4B", +"^ c #F74E4E", +"/ c #FB4949", +"( c #FB4A49", +") c #FC4F4F", +"_ c #F85050", +"` c #F85353", +"' c #FD5353", +"] c #F95455", +"[ c #F95757", +"{ c #F95858", +"} c #FD5959", +"| c #FE5858", +" . c #FA5C5C", +".. c #FA5D5D", +"X. c #FB6060", +"o. c #FB6162", +"O. c #FC6565", +"+. c #FC6666", +"@. c #FC6969", +"#. c #FC6A6A", +"$. c #FD6F6F", +"%. c #FE7273", +"&. c #FE7676", +"*. c #F27A7A", +"=. c #F37F7F", +"-. c #FE7979", +";. c gray51", +":. c #888888", +">. c gray60", +",. c gray62", +"<. c #F58686", +"1. c #F28A8A", +"2. c #F68A8A", +"3. c #F78D8D", +"4. c #F69696", +"5. c #F89191", +"6. c #F99494", +"7. c #FA9898", +"8. c #FB9B9B", +"9. c #FC9E9E", +"0. c #DBBBBB", +"q. c #FDA3A3", +"w. c #FEA8A9", +"e. c #FDB0B0", +"r. c #FFB9B9", +"t. c #E3C1C1", +"y. c #F1DEDE", +"u. c #F2E1E1", +"i. c #F1E2E2", +"p. c #F4E3E2", +"a. c #F5E4E4", +"s. c #F4E6E6", +"d. c #F6E6E6", +"f. c #F7E6E6", +"g. c #FDE5E5", +"h. c #F8E8E8", +"j. c #F9EAEA", +"k. c #FAEBEB", +"l. c #FDEBEB", +"z. c #FAEDED", +"x. c #FCEDED", +"c. c #FCEFEF", +"v. c #FDF1F1", +"b. c #FDF2F2", +"n. c #FEF3F3", +"m. c #FEF5F5", +/* pixels */ +"l.O X g.} b c z c z j j h h ", +"C m.,.e w >.n.w.@.@.X. .[ ` ^ d ", +"b r.n.:.3 < t x.9.E Y K F A ! d ", +"b &.w.n.;., : w k.5.G F Z V T a ", +"b &.} q.c.e ; - 0 k.3.A V M P a ", +"c %.' ) 9.c.q = & 7 f.<.M m L a ", +"b $.) ( Q 6.k.8 $ # 4 u.=.n G i ", +"c #.( Q Y L 5.h.5 @ + 1 u.*.D y ", +"z +.Q Y I F A 2.p.3 O . > y.1.y ", +"z o. .[ [ ` ^ Q 4.s.8 & % 7 u.y ", +"z j h h h h d d a s t. 0." +}; diff --git a/src/pixmaps/flags_xpm/tv.xpm b/src/pixmaps/flags_xpm/tv.xpm new file mode 100644 index 00000000..69345fce --- /dev/null +++ b/src/pixmaps/flags_xpm/tv.xpm @@ -0,0 +1,156 @@ +/* XPM */ +static const char *tv[] = { +/* columns rows colors chars-per-pixel */ +"16 11 139 2", +" c black", +". c #010000", +"X c #050000", +"o c #1B0000", +"O c #210000", +"+ c #270000", +"@ c #290000", +"# c #2F0000", +"$ c #350000", +"% c #3B0000", +"& c #410000", +"* c #470000", +"= c #4B0000", +"- c #510000", +"; c #570000", +": c #590000", +"> c #5D0000", +", c #5F0000", +"< c #630000", +"1 c #670000", +"2 c #690000", +"3 c #000D7B", +"4 c #00137F", +"5 c #912100", +"6 c #A35D00", +"7 c #934631", +"8 c #944A34", +"9 c #964C37", +"0 c #C16300", +"q c #9F5A46", +"w c #A25E4B", +"e c #A56250", +"r c #A86654", +"t c #A96A58", +"y c #AA6A59", +"u c #AD6F5D", +"i c #AF7362", +"p c #B17665", +"a c #B27766", +"s c #B37A6A", +"d c #B67E6D", +"f c #C38E38", +"g c #DDB23B", +"h c #E4C71F", +"j c #DEC72C", +"k c #E7CA2A", +"l c #E8CD30", +"z c #BD8440", +"x c #BE8E57", +"c c #B98070", +"v c #BA8475", +"b c #BC8677", +"n c #BE897A", +"m c #BE8B7D", +"M c #A7B968", +"N c #C08D7F", +"B c #D3AF65", +"V c #FEE058", +"C c #E4CD65", +"Z c #FEE676", +"A c #FCE67C", +"S c #001781", +"D c #001D87", +"F c #00238B", +"G c #6DA281", +"H c #78A98B", +"J c #288DC2", +"K c #2C90C5", +"L c #2D90C5", +"P c #3193C7", +"I c #3294C7", +"U c #3696C9", +"Y c #3796C9", +"T c #3897C9", +"R c #3B9ACB", +"E c #3C9ACB", +"W c #3D9ACB", +"Q c #439BC8", +"! c #469ECA", +"~ c #409CCC", +"^ c #409DCC", +"/ c #419DCD", +"( c #429DCD", +") c #439DCD", +"_ c #459FCE", +"` c #46A0CD", +"' c #47A0CE", +"] c #46A0CF", +"[ c #48A0CF", +"{ c #4BA3CF", +"} c #4CA3CF", +"| c #4CA4CF", +" . c #4DA4CF", +".. c #50A3CE", +"X. c #4AA2D0", +"o. c #4DA3D1", +"O. c #50A5D1", +"+. c #51A6D1", +"@. c #53A7D1", +"#. c #52A6D3", +"$. c #55A9D3", +"%. c #56A9D4", +"&. c #5AABD5", +"*. c #5BACD4", +"=. c #5FAED7", +"-. c #5DB1DB", +";. c #63B0D9", +":. c #71BDE2", +">. c #88B398", +",. c #8FB79E", +"<. c #A1C3A2", +"1. c #B3CEB3", +"2. c #FDE785", +"3. c #FDEB94", +"4. c #E7E6B7", +"5. c #FBF1BC", +"6. c #DFDFDF", +"7. c #FCF3C8", +"8. c #C4E0EE", +"9. c #CDE4F0", +"0. c #E9E9E9", +"q. c #E4F0F5", +"w. c #E9F5F9", +"e. c #F1F1F1", +"r. c gray95", +"t. c #F3F3F3", +"y. c #F4F4F4", +"u. c gray96", +"i. c #F6F6F6", +"p. c gray97", +"a. c #F8F8F8", +"s. c #F9F9F9", +"d. c gray98", +"f. c #FBFBFB", +"g. c gray99", +"h. c #FCFDFD", +"j. c #FDFDFD", +"k. c #FEFEFE", +"l. c gray100", +/* pixels */ +"2 2 2 2 1 < , , ; - = * & % 6 # ", +"2 N N m n v v c d s p B C t x + ", +"k.k.k.k.k.k.k.g.f.f.f.a.p.p.p.0.", +"k.k.w.:.;.=.&.$.+.o._ ) E l ,.F ", +"k.Z V k.8.*.$.+.} ` ! W Y H ..D ", +"k.1.<.f.f.q. . .` ~ E T I j >.S ", +"2.3.A 5.9.$.{ ` ) R M k J J ! 4 ", +"f.7.4.-.o.X._ ~ R Y I J k G Q 3 ", +"f.f.f.f.f.p.p.p.p.t.t.t.t.t.t.6.", +"= p i u t r e w q z g f 8 8 7 ", +"* % % $ # @ O o 5 0 ; X " +}; diff --git a/src/pixmaps/flags_xpm/tw.xpm b/src/pixmaps/flags_xpm/tw.xpm new file mode 100644 index 00000000..ec2d5b6f --- /dev/null +++ b/src/pixmaps/flags_xpm/tw.xpm @@ -0,0 +1,148 @@ +/* XPM */ +static const char *tw[] = { +/* columns rows colors chars-per-pixel */ +"16 11 131 2", +" c #DD0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #ED0000", +"% c #EF0000", +"& c #F10000", +"* c #F30000", +"= c #F50000", +"- c #F70000", +"; c #F90000", +": c #FB0000", +"> c #FD0000", +", c #F10B0B", +"< c #F10F0E", +"1 c #F21010", +"2 c #F21313", +"3 c #F21414", +"4 c #F31919", +"5 c #F31A1A", +"6 c #F41E1E", +"7 c #F41F1F", +"8 c #F42020", +"9 c #F52323", +"0 c #F52424", +"q c #F52525", +"w c #F52626", +"e c #F62929", +"r c #F62A2A", +"t c #F62B2B", +"y c #F22C2C", +"u c #F22F2F", +"i c #F62C2C", +"p c #F72E2E", +"a c #F72F2F", +"s c #F23232", +"d c #F33232", +"f c #F73030", +"g c #F73131", +"h c #F33535", +"j c #F43636", +"k c #F83434", +"l c #F83535", +"z c #F83636", +"x c #F83736", +"c c #F83737", +"v c #F1363A", +"b c #F43939", +"n c #F43B3B", +"m c #F53D3D", +"M c #F53F3F", +"N c #F93A3A", +"B c #F93B3A", +"V c #F93C3C", +"C c #F93C3D", +"Z c #FA3F3F", +"A c #EA3B46", +"S c #EC414B", +"D c #F64242", +"F c #F64444", +"G c #F74646", +"H c #FA4040", +"J c #FA4242", +"K c #FA4444", +"L c #FB4545", +"P c #F74949", +"I c #F74B4B", +"U c #F74E4E", +"Y c #FB4949", +"T c #FB4A49", +"R c #FC4F4F", +"E c #ED4750", +"W c #F85050", +"Q c #F85353", +"! c #F95455", +"~ c #F95757", +"^ c #F95858", +"/ c #FA5C5C", +"( c #FA5D5D", +") c #FB6060", +"_ c #FB6162", +"` c #FC6565", +"' c #FC6666", +"] c #FC6A6A", +"[ c #FD6F6F", +"{ c #F16970", +"} c #0011A9", +"| c #001BAB", +" . c #0019AD", +".. c #001FAF", +"X. c #0021AF", +"o. c #0023B1", +"O. c #0025B3", +"+. c #0027B3", +"@. c #4A75C9", +"#. c #4F79CB", +"$. c #4E7BCD", +"%. c #527CCE", +"&. c #537DCF", +"*. c #537ECF", +"=. c #587FCF", +"-. c #5781D1", +";. c #5782D1", +":. c #5881D1", +">. c #5C83D1", +",. c #5C85D3", +"<. c #6087D2", +"1. c #638BD5", +"2. c #7193D8", +"3. c #7595DA", +"4. c #7799D9", +"5. c #7D9DDB", +"6. c #7A9CDC", +"7. c #7D9EDC", +"8. c #7F9FDD", +"9. c #9090D8", +"0. c #9393DA", +"q. c #9999DC", +"w. c #9899DD", +"e. c #82A2DD", +"r. c #84A4DF", +"t. c #B6B7E6", +"y. c #B9B9E8", +"u. c #F9F9FB", +"i. c #F9F9FC", +"p. c #F9F9FD", +"a. c #FEFEFE", +/* pixels */ +"+.+.+.+.+... .} X : : = * * $ $ ", +"+.r.r.t.y.5.6.3.{ ` ) ( ^ Q U # ", +"+.r.w.p.a.q.,.:.E J Z l g i P # ", +"+.e.0.p.u.0.;.%.S V j f t w F O ", +"..8.1.3.2.;.%.$.A l f t w 8 M O ", +"| 5.<.>.=.%.#.@.v f t w 7 5 n O ", +"> [ R Y L H N l a t 0 6 5 3 j X ", +": ] Y L Z N k a t 0 6 5 2 1 d X ", +": ` L Z N l a t 9 6 3 3 < , u . ", +"= _ ( ^ ! U P G D M n h d u u . ", +"= * * $ $ $ # O O O O X . . " +}; diff --git a/src/pixmaps/flags_xpm/tz.xpm b/src/pixmaps/flags_xpm/tz.xpm new file mode 100644 index 00000000..21afc414 --- /dev/null +++ b/src/pixmaps/flags_xpm/tz.xpm @@ -0,0 +1,174 @@ +/* XPM */ +static const char *tz[] = { +/* columns rows colors chars-per-pixel */ +"16 11 157 2", +" c black", +". c #2C2C2C", +"X c #37332B", +"o c gray19", +"O c #313131", +"+ c #343130", +"@ c #353535", +"# c #363434", +"$ c gray21", +"% c #383836", +"& c #3A3A3A", +"* c #3B3B3A", +"= c #3E3E3B", +"- c #3F3F3F", +"; c #403F3F", +": c #006F00", +"> c #007900", +", c #007B00", +"< c #007D00", +"1 c #57512F", +"2 c #5C572B", +"3 c #444437", +"4 c #4A4A3C", +"5 c #514D34", +"6 c #7D7B3C", +"7 c #4E4E4E", +"8 c #535240", +"9 c #555544", +"0 c #535353", +"q c #585858", +"w c #5D5D5D", +"e c #797449", +"r c #656462", +"t c #008100", +"y c #008300", +"u c #008500", +"i c #008700", +"p c #008900", +"a c #009100", +"s c #009300", +"d c #53AD00", +"f c #5FC100", +"g c #51B84C", +"h c #51B451", +"j c #51B551", +"k c #53B553", +"l c #54B754", +"z c #52B950", +"x c #54B954", +"c c #54BA54", +"v c #58BC58", +"b c #58BC59", +"n c #59BC59", +"m c #5CBD5C", +"M c #5CBE5C", +"N c #5FBF5F", +"B c #69BF69", +"V c #6DC64F", +"C c #6FC84B", +"Z c #6DC36D", +"A c #6FC46F", +"S c #70C571", +"D c #72C673", +"F c #74C774", +"G c #76C876", +"H c #77C877", +"J c #79C879", +"K c #79C979", +"L c #7BCA7A", +"P c #7BCA7B", +"I c #818100", +"U c #899D00", +"Y c #BFBD00", +"T c #928C2B", +"R c #918B2F", +"E c #989326", +"W c #BBB73D", +"Q c #9DC900", +"! c #CBDF00", +"~ c #D1DB00", +"^ c #C0C032", +"/ c #C2C532", +"( c #C4CB35", +") c #D9E53F", +"_ c #E5ED37", +"` c #898740", +"' c #8B8845", +"] c #8F8E57", +"[ c #969055", +"{ c #9DDB4F", +"} c #A4DE4B", +"| c #AEE047", +" . c #8BD365", +".. c #9AD07C", +"X. c #CFCB41", +"o. c #D5D145", +"O. c #E1DE42", +"+. c #E1DE46", +"@. c #CFE64A", +"#. c #D7E442", +"$. c #D2E544", +"%. c #D4E847", +"&. c #D4EA4B", +"*. c #D7EA4A", +"=. c #C1E15B", +"-. c #E3E342", +";. c #E7E846", +":. c #E6E949", +">. c #F5F349", +",. c #EFED5C", +"<. c #E6F05D", +"1. c #D5D266", +"2. c #DAE860", +"3. c #DBE960", +"4. c #D8ED6A", +"5. c #E0E860", +"6. c #0027DD", +"7. c #0029DD", +"8. c #002DDD", +"9. c #002DDF", +"0. c #002FDF", +"q. c #0031DF", +"w. c #0035DD", +"e. c #0033E1", +"r. c #0035E3", +"t. c #0039E3", +"y. c #003BE5", +"u. c #003DE5", +"i. c #0047C1", +"p. c #004BD7", +"a. c #0041E7", +"s. c #0047E9", +"d. c #53B0BB", +"f. c #55B1BD", +"g. c #33A2DF", +"h. c #0B95F1", +"j. c #0F97F1", +"k. c #1097F2", +"l. c #1399F2", +"z. c #1499F2", +"x. c #149AF2", +"c. c #1A99F2", +"v. c #1C9BF0", +"b. c #189CF3", +"n. c #2CA2F2", +"m. c #2FA4F2", +"M. c #32A5F3", +"N. c #33A6F3", +"B. c #35A8F3", +"V. c #36A8F4", +"C. c #39A9F4", +"Z. c #3BA9F5", +"A. c #3DACF5", +"S. c #42ADF6", +"D. c #74C0C9", +"F. c #98D083", +"G. c #A2D394", +/* pixels */ +"a p p p u u y , , : , f Y ", +"u P P P G F S Z B .3.,.] 0 7 ", +"p P N m b x k g } -.W 3 O . e U ", +"u J m v x h C %.O.6 % X X E 3.Q ", +"p G v x g } ;.X.4 $ o 2 ( @.G.i.", +"y D k V &.+.` = $ X T #.$.f.Z.y.", +", A { :.o.8 * @ 5 / _ ..c.l.V.r.", +"a 4.>.' ; * @ R #.=.f.v.z.j.V.0.", +"~ 1.9 - $ 5 ^ *.F.g.b.l.j.h.m.9.", +" r w q [ <.<.D.S.S.C.B.N.m.n.6.", +" I ! d p.s.a.u.t.q.9.9.7.w." +}; diff --git a/src/pixmaps/flags_xpm/ua.xpm b/src/pixmaps/flags_xpm/ua.xpm new file mode 100644 index 00000000..173a729f --- /dev/null +++ b/src/pixmaps/flags_xpm/ua.xpm @@ -0,0 +1,165 @@ +/* XPM */ +static const char *ua[] = { +/* columns rows colors chars-per-pixel */ +"16 11 148 2", +" c #DDB500", +". c #DDB700", +"X c #DFB700", +"o c #DFB900", +"O c #DFBB00", +"+ c #E1BB00", +"@ c #E3BB00", +"# c #E3BF00", +"$ c #E5BF00", +"% c #E7C300", +"& c #E9C500", +"* c #EBC700", +"= c #EDCB00", +"- c #EDCD00", +"; c #EFD100", +": c #F1D300", +"> c #F3D700", +", c #F5D900", +"< c #F7DB00", +"1 c #F9DD00", +"2 c #FBDF00", +"3 c #FDE100", +"4 c #F1F10B", +"5 c #F1F10E", +"6 c #F2F210", +"7 c #F2F213", +"8 c #F2F214", +"9 c #F3F319", +"0 c #F4F41E", +"q c #F4F41F", +"w c #F5F523", +"e c #F5F524", +"r c #F6F629", +"t c #F6F62A", +"y c #F2F22C", +"u c #F2F22F", +"i c #F7F72E", +"p c #F7F72F", +"a c #F2F232", +"s c #F3F332", +"d c #F3F335", +"f c #F4F436", +"g c #F8F834", +"h c #F8F835", +"j c #F4F439", +"k c #F5F53D", +"l c #F9F93A", +"z c #FAFA3F", +"x c #F6F642", +"c c #F7F746", +"v c #FAFA40", +"b c #FAFA44", +"n c #FBFB45", +"m c #F7F74B", +"M c #FBFB49", +"N c #FBFC49", +"B c #FCFC4F", +"V c #F8F850", +"C c #F9F955", +"Z c #F9F958", +"A c #FAFA5D", +"S c #FBFB62", +"D c #FCFC66", +"F c #FCFC6A", +"G c #FDFD6F", +"H c #004F99", +"J c #0035E7", +"K c #0045E7", +"L c #0045E9", +"P c #004DEB", +"I c #0057EF", +"U c #005DF1", +"Y c #0063F3", +"T c #0067F5", +"R c #006DF7", +"E c #0071F9", +"W c #0075FB", +"Q c #0079FD", +"! c #007DFD", +"~ c #007FFD", +"^ c #0091C7", +"/ c #3EABCF", +"( c #0083FD", +") c #0083FF", +"_ c #0085FF", +"` c #209FF4", +"' c #25A1F5", +"] c #26A2F5", +"[ c #2BA4F6", +"{ c #2BA5F6", +"} c #2CA6F6", +"| c #30A7F7", +" . c #31A8F7", +".. c #31A9F7", +"X. c #3FADF5", +"o. c #36AAF8", +"O. c #37ABF8", +"+. c #3BADF9", +"@. c #3CAEF9", +"#. c #3DAEF9", +"$. c #43AED1", +"%. c #48B0D2", +"&. c #4DB3D4", +"*. c #51B5D6", +"=. c #5BB7D5", +"-. c #56B8D8", +";. c #5BBAD9", +":. c #60BCDB", +">. c #64BEDD", +",. c #44AFF6", +"<. c #41AFFA", +"1. c #49B2F7", +"2. c #4EB4F7", +"3. c #42B0FA", +"4. c #42B1FA", +"5. c #46B2FB", +"6. c #47B3FB", +"7. c #4BB5FC", +"8. c #4BB6FC", +"9. c #4CB6FC", +"0. c #53B7F8", +"q. c #50B6FD", +"w. c #51B7FD", +"e. c #54B9FD", +"r. c #54BAFD", +"t. c #58B9F9", +"y. c #5CBBFA", +"u. c #58BBFE", +"i. c #58BCFE", +"p. c #59BCFE", +"a. c #5CBDFE", +"s. c #5CBEFE", +"d. c #5FBFFE", +"f. c #61BEFB", +"g. c #69C0DD", +"h. c #6DC2DF", +"j. c #70C4E0", +"k. c #65C0FC", +"l. c #69C2FC", +"z. c #6DC3FD", +"x. c #70C5FE", +"c. c #74C7FE", +"v. c #76C7FE", +"b. c #77C8FE", +"n. c #79C8FE", +"m. c #79C9FE", +"M. c #7BCAFF", +"N. c #8AD0E7", +/* pixels */ +"_ _ _ _ _ ) ! Q W E R T Y U I I ", +") M.M.M.b.b.z.z.l.k.f.y.t.0.2.P ", +"_ M.d.a.a.w.q.9.6.3.#.O...} 1.L ", +") b.a.i.e.w.9.5.3.#.O...{ ] ,.K ", +"! v.u.e.q.7.5.<.+.o.| { ] ` X.J ", +"^ N.j.h.g.>.:.;.-.*.&.%.$./ =.H ", +"3 G B N n z l g p t e q 9 8 f @ ", +"2 F M n z l g p t e q 9 8 5 s O ", +"1 D n v l g p t w q 9 7 5 4 u X ", +"< S A C C V m c x k j d s u u ", +", > ; ; - = * & % $ # @ X X " +}; diff --git a/src/pixmaps/flags_xpm/ug.xpm b/src/pixmaps/flags_xpm/ug.xpm new file mode 100644 index 00000000..c0ff81e2 --- /dev/null +++ b/src/pixmaps/flags_xpm/ug.xpm @@ -0,0 +1,168 @@ +/* XPM */ +static const char *ug[] = { +/* columns rows colors chars-per-pixel */ +"16 11 151 2", +" c black", +". c #150000", +"X c gray8", +"o c #191919", +"O c gray12", +"+ c gray14", +"@ c gray21", +"# c #710000", +"$ c #737D00", +"% c gray25", +"& c gray27", +"* c #494A49", +"= c gray31", +"- c #606055", +"; c #646459", +": c #68685E", +"> c #6C6C62", +", c gray42", +"< c #6F6F6F", +"1 c #706F66", +"2 c #74746A", +"3 c #78786E", +"4 c #7B7B72", +"5 c #7F7F75", +"6 c #901A1A", +"7 c #931F1F", +"8 c #962525", +"9 c #992B2B", +"0 c #9F3B3B", +"q c #DD0000", +"w c #DF0000", +"e c #E10000", +"r c #E30000", +"t c #E50000", +"y c #E70000", +"u c #E90000", +"i c #EB0000", +"p c #ED0000", +"a c #EF0000", +"s c #F10000", +"d c #F30000", +"f c #F50000", +"g c #F70000", +"h c #FD0000", +"j c #F42020", +"k c #F52525", +"l c #F62B2B", +"z c #F73030", +"x c #F53F3F", +"c c #F25B2C", +"v c #F25C2F", +"b c #F26032", +"n c #F36235", +"m c #F46539", +"M c #F5693D", +"N c #A74646", +"B c #AA4A4B", +"V c #AD4F4F", +"C c #AF5353", +"Z c #BE7273", +"A c #D64545", +"S c #FC4B4B", +"D c #FD4F50", +"F c #FD5454", +"G c #FE5858", +"H c #F66C42", +"J c #F76F46", +"K c #F7744B", +"L c #F87750", +"P c #F97B55", +"I c #F97F58", +"U c #FE7676", +"Y c #ABB300", +"T c #BABD10", +"R c #BCBF14", +"E c #E39F00", +"W c #BDC219", +"Q c #BFC41F", +"! c #DFDF00", +"~ c #FBCD00", +"^ c #DDE900", +"/ c #F5FF00", +"( c #F9F900", +") c #F1F10B", +"_ c #F1F10E", +"` c #F2F213", +"' c #F3F319", +"] c #F4F41E", +"[ c #C1C624", +"{ c #C4C82A", +"} c #C6CA2F", +"| c #C3C732", +" . c #C8CC34", +".. c #CACE3A", +"X. c #CCCF3F", +"o. c #F4D326", +"O. c #F4D42B", +"+. c #F5D631", +"@. c #F6D836", +"#. c #F7DA3C", +"$. c #F5F523", +"%. c #F6F629", +"&. c #F2F22F", +"*. c #F0F62C", +"=. c #F7F72E", +"-. c #F1F731", +";. c #F2F837", +":. c #F8F834", +">. c #F3F93D", +",. c #F9F93A", +"<. c #FAFA3F", +"1. c #818179", +"2. c #84847B", +"3. c #86867E", +"4. c #88887F", +"5. c #FA825D", +"6. c #FB8562", +"7. c #CED145", +"8. c #D0D349", +"9. c #F4D844", +"0. c #F8DB42", +"q. c #F9DD47", +"w. c #FADE4B", +"e. c #FBDF51", +"r. c #F4FA42", +"t. c #F5FA47", +"y. c #FAFA44", +"u. c #F1F749", +"i. c #F6FB4C", +"p. c #FBE054", +"a. c #FBE259", +"s. c #FCE35C", +"d. c #F6FD51", +"f. c #F7FD54", +"g. c #F8FE59", +"h. c #F8FE5C", +"j. c #F9FE5F", +"k. c #D8DC6A", +"l. c #FCFC66", +"z. c #FCE879", +"x. c #FAFF7A", +"c. c gray61", +"v. c #9F9E9E", +"b. c #B6B6B6", +"n. c gray74", +"m. c #F8BBBB", +"M. c #FBC2C2", +"N. c #F6F4F4", +"B. c #F9F7F7", +"V. c #F8F8F8", +"C. c #F9F9F9", +/* pixels */ +" ", +" 4.4.3.2.1.5 4 3 2 1 > : ; - ", +"/ x.j.j.h.f.d.i.t.r.>.;.-.*.u.^ ", +"~ z.s.p.e.e.w.q.0.#.@.+.O.o.9.E ", +"h U G F D S M.v.C.m.z l k j x y ", +"# Z C V B N V.c., N.9 8 7 6 0 . ", +" < = * & % n.V.A b.+ O o X @ ", +"Y k.8.7.7. . .} { [ Q W R T | $ ", +"( l.y.<.,.:.=.%.$.] ' ` _ ) &.! ", +"g 6.5.I P L K J H M m n b v c q ", +"g s s p i p i i y y r r q q q q " +}; diff --git a/src/pixmaps/flags_xpm/um.xpm b/src/pixmaps/flags_xpm/um.xpm new file mode 100644 index 00000000..3ca657ed --- /dev/null +++ b/src/pixmaps/flags_xpm/um.xpm @@ -0,0 +1,147 @@ +/* XPM */ +static const char *um[] = { +/* columns rows colors chars-per-pixel */ +"16 11 130 2", +" c #710000", +". c #7B0000", +"X c #7E0000", +"o c #4C4C4C", +"O c #5C5959", +"+ c gray47", +"@ c #8B0000", +"# c #950000", +"$ c #9F0000", +"% c #A60000", +"& c #B20000", +"* c #BA0000", +"= c #C00000", +"- c #CC0000", +"; c #CD0000", +": c #CF0000", +"> c #D20000", +", c #D30000", +"< c #D60000", +"1 c #D90000", +"2 c #DC0000", +"3 c #DD0201", +"4 c #DD0202", +"5 c #CD1C1C", +"6 c #D41F1F", +"7 c #D92222", +"8 c #DB2424", +"9 c #D33737", +"0 c #DB3C3C", +"q c #E02626", +"w c #E02828", +"e c #E32828", +"r c #E62A2A", +"t c #E62C2C", +"y c #E62D2D", +"u c #E72F2F", +"i c #E33333", +"p c #E73131", +"a c #E83232", +"s c #E83636", +"d c #E83838", +"f c #E93939", +"g c #E93A3A", +"h c #E93D3D", +"j c #EA4141", +"k c #E94242", +"l c #EB4242", +"z c #EB4646", +"x c #EB4949", +"c c #EC4B4C", +"v c #EB4D4C", +"b c #EC4F4F", +"n c #EE5657", +"m c #EE5C5C", +"M c #EE6464", +"N c #EF6F6F", +"B c #4F77C9", +"V c #537BCD", +"C c #557DCF", +"Z c #577DCF", +"A c #577FD1", +"S c #5981D3", +"D c #5983D3", +"F c #5B83D5", +"G c #6095D9", +"H c #6BA4DA", +"J c #6EA7DA", +"K c #7BB4DC", +"L c #7CB4DD", +"P c gray52", +"I c #A7A7A7", +"U c #F29F9F", +"Y c #8DB5DE", +"T c #8EB5DE", +"R c #92B6DE", +"E c #93B6DF", +"W c #A3B7E0", +"Q c #A3B8E0", +"! c #A4B9E1", +"~ c #A5B9E2", +"^ c #A6BAE2", +"/ c #A6BAE3", +"( c #A7BBE3", +") c #A8BCE5", +"_ c #A9BDE6", +"` c #A9BEE7", +"' c #AABEE7", +"] c #ABBFE8", +"[ c #ACC0E9", +"{ c #B4C5E7", +"} c #B6C7E9", +"| c #B6C8EA", +" . c #B9C9EB", +".. c #B9C9EC", +"X. c #B9CAED", +"o. c #BACBED", +"O. c gray76", +"+. c gray81", +"@. c #D0D0D0", +"#. c gray83", +"$. c #D9D9DA", +"%. c #DCDADA", +"&. c gainsboro", +"*. c #E1E1E1", +"=. c gray90", +"-. c #E7E7E7", +";. c gray91", +":. c #E9E9E9", +">. c #E9EAEA", +",. c #EAEAEA", +"<. c #EBEBEA", +"1. c #ECECEC", +"2. c gray93", +"3. c #EEEEEE", +"4. c #EFEFEF", +"5. c gray94", +"6. c #F1F1F1", +"7. c gray95", +"8. c #F3F3F3", +"9. c #F4F4F4", +"0. c #F4F5F5", +"q. c gray96", +"w. c #F6F6F6", +"e. c gray97", +"r. c #F8F8F8", +"t. c #F9F9F9", +"y. c gray98", +"u. c gray99", +"i. c #FDFEFD", +"p. c #FEFEFE", +/* pixels */ +"F F F F D Z Z V B i 8 4 4 1 < , ", +"F p.o.p. .u.| y.{ e.w.9.8.8.8.+ ", +"F o.[ ' ' ) / / Q M n c l f v - ", +"D o.u.' y./ w.W R 8.5.3.1.,.3.I ", +"D } ) ) / / W R K v l f p y l * ", +"Z p.' w.W w.Y 8.J 3.,.,.,.-.>.P ", +"V } / / W Y K H G s p t w 8 0 $ ", +"+.r.w.9.8.8.3.3.1.,.-.-.-.&.%.o ", +"i U N m b z h s y t q 7 6 5 9 X ", +"O.w.9.8.8.5.3.2.1.,.;.*.%.#.+.O ", +"4 1 1 < , : : : = & % # @ . " +}; diff --git a/src/pixmaps/flags_xpm/unknown.xpm b/src/pixmaps/flags_xpm/unknown.xpm new file mode 100644 index 00000000..c2b4f046 --- /dev/null +++ b/src/pixmaps/flags_xpm/unknown.xpm @@ -0,0 +1,44 @@ +/* XPM */ +static const char * unknown[] = { +"16 11 30 1", +" c None", +". c #7F7F7F", +"+ c #808080", +"@ c #D0D0D0", +"# c #D7D7D7", +"$ c #DCDCDC", +"% c #DFDFDF", +"& c #E0E0E0", +"* c #E3E3E3", +"= c #D8D8D8", +"- c #C2C2C2", +"; c #AAAAAA", +"> c #A1A1A1", +", c #A2A2A2", +"' c #A9A9A9", +") c #B1B1B1", +"! c #B9B9B9", +"~ c #CFCFCF", +"{ c #C8C8C8", +"] c #CDCDCD", +"^ c #CACACA", +"/ c #C0C0C0", +"( c #B8B8B8", +"_ c #AFAFAF", +": c #A7A7A7", +"< c #9D9D9D", +"[ c #A3A3A3", +"} c #D6D6D6", +"| c #DEDEDE", +"1 c #E1E1E1", +"................", +"+@#$%&*=-;>,')!.", +"+~{]^/(_:<<[')!.", +"+~{]^/(_:<<[')!.", +"+~{]^/(_:<<[')!.", +"+~{]^/(_:<<[')!.", +"+~{]^/(_:<<[')!.", +"+~{]^/(_:<<[')!.", +"+~{]^/!_:<<[')!.", +".~}$%|1#-;>,')!.", +"................"}; diff --git a/src/pixmaps/flags_xpm/us.xpm b/src/pixmaps/flags_xpm/us.xpm new file mode 100644 index 00000000..c630a57c --- /dev/null +++ b/src/pixmaps/flags_xpm/us.xpm @@ -0,0 +1,152 @@ +/* XPM */ +static const char *us[] = { +/* columns rows colors chars-per-pixel */ +"16 11 135 2", +" c #F80B0B", +". c #F91010", +"X c #F91616", +"o c #FA1B1B", +"O c #FA2020", +"+ c #FB2323", +"@ c #FB2828", +"# c #FB2A2A", +"$ c #FB2C2C", +"% c #FB2E2E", +"& c #FB3131", +"* c #FB3232", +"= c #FC3838", +"- c #FC3939", +"; c #FC3A3A", +": c #FC3D3D", +"> c #9A634A", +", c #9E634A", +"< c #A0634A", +"1 c #A6634A", +"2 c #AB634A", +"3 c #AF634A", +"4 c #B5634A", +"5 c #BF634A", +"6 c #FC4040", +"7 c #FC4646", +"8 c #FC4747", +"9 c #FC4C4C", +"0 c #FC5050", +"q c #FC5354", +"w c #FC5858", +"e c #C5634A", +"r c #CC634A", +"t c #D4634A", +"y c #D5634A", +"u c #D8634A", +"i c #DA634A", +"p c #DE634A", +"a c #E0634A", +"s c #E2634A", +"d c #E5644A", +"f c #E8634A", +"g c #F4745E", +"h c #FC6163", +"j c #FC6868", +"k c #FC7862", +"l c #FB7F6B", +"z c #FC7373", +"x c #FD7F7F", +"c c #FD826D", +"v c #FC8672", +"b c #FD8E7C", +"n c #FDFD5B", +"m c #002BB3", +"M c #0049B6", +"N c #004FB5", +"B c #0068B9", +"V c #0069BC", +"C c #6363B1", +"Z c #6363B7", +"A c #6363B8", +"S c #6363BE", +"D c #6367BF", +"F c #036FE1", +"G c #0371E5", +"H c #0473F1", +"J c #0474F8", +"K c #2F73F8", +"L c #3070F8", +"P c #3275F8", +"I c #3674F9", +"U c #3777F9", +"Y c #3976F9", +"T c #3A79F9", +"R c #3D7AF9", +"E c #3F7EFA", +"W c #6365C2", +"Q c #6367C4", +"! c #407CFA", +"~ c #437EFA", +"^ c #4680FA", +"/ c #4982FA", +"( c #919180", +") c #ACAC9F", +"_ c #B4B4A8", +"` c #FD9786", +"' c #98B9FC", +"] c #9BBBFC", +"[ c #9CBDFC", +"{ c #A1BEFC", +"} c #A2C0FC", +"| c #C9C9C1", +" . c #DADAD3", +".. c gainsboro", +"X. c #FECAC1", +"o. c #E2E2DD", +"O. c #E2E2DE", +"+. c #FDE1DC", +"@. c #D7FEFD", +"#. c gray89", +"$. c #E5E5E0", +"%. c gray90", +"&. c #E7E7E7", +"*. c gray91", +"=. c #E9E9E9", +"-. c #EAEAEA", +";. c gray92", +":. c #EDEDEA", +">. c #ECECEC", +",. c #EEEEEE", +"<. c #EFEFEF", +"1. c #F1F1EF", +"2. c #E5E5FC", +"3. c #ECFEFE", +"4. c gray94", +"5. c #F1F1F1", +"6. c #F2F2F0", +"7. c #F3F3F1", +"8. c gray95", +"9. c #F3F3F3", +"0. c #F4F4F2", +"q. c #F5F5F3", +"w. c #F4F4F4", +"e. c gray96", +"r. c #F6F6F4", +"t. c #F6F6F6", +"y. c #F7F7F6", +"u. c #F8F8F6", +"i. c #F8F8F7", +"p. c #F9F9F8", +"a. c #F9F9F9", +"s. c #FAFAF9", +"d. c #FBFBFB", +"f. c #FBFFFA", +"g. c #FEFEFD", +/* pixels */ +"Q Q Q Q W S A A C c k f s a p i ", +"Q g.} f.{ a.[ a.' a.a.i.t.t.t.) ", +"Q } / ^ ~ R T U P z h q 8 : ` y ", +"D { a.E t.T <.K J 9.<.,.:.n 0.| ", +"W { ! R T I K H V 9 7 = * $ b e ", +"A a.R 4.I ;.F #.N ,.;.;.;.&.@._ ", +"A [ Y P L F B M m ; * $ + o v 3 ", +"O.d.t.t.9.9.,.,.>.;.&.&.%...+.( ", +"c X.x j w 9 6 = % $ + X c , ", +" .i.3.i.t.t.0.0.1.1.1.:.2.$.O.g ", +"d a s p u p u y r 5 4 2 1 , > > " +}; diff --git a/src/pixmaps/flags_xpm/uy.xpm b/src/pixmaps/flags_xpm/uy.xpm new file mode 100644 index 00000000..61d2a305 --- /dev/null +++ b/src/pixmaps/flags_xpm/uy.xpm @@ -0,0 +1,177 @@ +/* XPM */ +static const char *uy[] = { +/* columns rows colors chars-per-pixel */ +"16 11 160 2", +" c #00007F", +". c #F4F459", +"X c #F5F55C", +"o c #F5F55F", +"O c #F3F368", +"+ c #EDED77", +"@ c #EEEF7B", +"# c #00008F", +"$ c #0033A3", +"% c #003FB5", +"& c #0757A9", +"* c #0043B3", +"= c #1967B3", +"- c #2979CA", +"; c #2C7CCB", +": c #317FCC", +"> c #3682CF", +", c #3783CF", +"< c #3B86D0", +"1 c #3C86D1", +"2 c #4089D2", +"3 c #418AD3", +"4 c #458CD4", +"5 c #468DD4", +"6 c #488CD1", +"7 c #4B8ED0", +"8 c #4E90D1", +"9 c #4A90D6", +"0 c #4B91D6", +"q c #4F93D8", +"w c #5091D3", +"e c #5494D3", +"r c #5494D5", +"t c #5797D4", +"y c #5D97D3", +"u c #5B99D6", +"i c #5094D8", +"p c #5596D9", +"a c #5497D9", +"s c #599ADB", +"d c #5F9BD8", +"f c #5E9CDC", +"g c #639ED9", +"h c #629EDD", +"j c #66A1DB", +"k c #6AA4DC", +"l c #6FA6DD", +"z c #73A9DE", +"x c #7AACDF", +"c c #76ACE0", +"v c #7AAEE2", +"b c #7DAEE1", +"n c #F3F394", +"m c #F1F196", +"M c #F2F29D", +"N c #F3F39F", +"B c #F4F49F", +"V c #8DB6DE", +"C c #ADB9C5", +"Z c #81B1E2", +"A c #84B3E3", +"S c #89B6E4", +"D c #8FB8E0", +"F c #8CB9E6", +"G c #8FBBE6", +"H c #92BAE1", +"J c #95BCE3", +"K c #97BDE3", +"L c #91BBE7", +"P c #99BFE3", +"I c #9DBFE2", +"U c #99BFE4", +"Y c #B7C1CB", +"T c #BDC3C9", +"R c #BFC3C9", +"E c #BFC9D5", +"W c #9CC1E5", +"Q c #9DC1E6", +"! c #9FC2E7", +"~ c #99C2EA", +"^ c #A0C3E7", +"/ c #A4C5E6", +"( c #A2C4E8", +") c #A3C6E9", +"_ c #A5C7E9", +"` c #A6C8EA", +"' c #A7C9EA", +"] c #A9CAEB", +"[ c #AACBEC", +"{ c #ABCBEC", +"} c #ADCDED", +"| c #BCD7F1", +" . c #C1C7CD", +".. c #C3C9CD", +"X. c #C3C9CF", +"o. c #C7CDD1", +"O. c #C9CFD5", +"+. c #CDD1D5", +"@. c #CFD5D7", +"#. c #D1D5DB", +"$. c #D5D7DD", +"%. c #D7DBDF", +"&. c #DFDFDF", +"*. c #D7DFE7", +"=. c #D9DDE1", +"-. c #DBDFE3", +";. c #DFE1E7", +":. c #E1E1E1", +">. c gray89", +",. c gray90", +"<. c #E7E7E7", +"1. c #E1E7EE", +"2. c #E2E8EF", +"3. c #E3E9EF", +"4. c #E5EBEF", +"5. c #E9E9E9", +"6. c #EBEBE9", +"7. c gray92", +"8. c #EBEDEF", +"9. c gray93", +"0. c #EFEFEF", +"q. c #F5F3E0", +"w. c #F5F4E6", +"e. c #F7F7ED", +"r. c #F8F7ED", +"t. c #E4EBF0", +"y. c #E6ECF1", +"u. c #E7EDF2", +"i. c #E7ECF3", +"p. c #E8EDF2", +"a. c #E9EFF3", +"s. c #EFEFF1", +"d. c #E8EEF4", +"f. c #E9EFF4", +"g. c #EAEFF5", +"h. c #EAF0F4", +"j. c #EAF0F5", +"k. c #EBF1F5", +"l. c #EBF0F6", +"z. c #EBF1F6", +"x. c #ECF1F7", +"c. c #ECF2F6", +"v. c #EDF2F7", +"b. c #EEF2F8", +"n. c #EEF3F8", +"m. c #EFF3F9", +"M. c #EFF4F9", +"N. c #EFF4FB", +"B. c #F1F1F1", +"V. c #F3F5F6", +"C. c #F0F5FA", +"Z. c #F1F5FB", +"A. c #F2F6FA", +"S. c #F2F6FB", +"D. c #F5F5F8", +"F. c #F6F6F9", +"G. c #F4F8FD", +"H. c #F8F9FA", +"J. c #FAFBFC", +"K. c #FCFCFE", +/* pixels */ +"B.B.B.s.B.B.9.9.9.7.5.<.,.,.:.&.", +"B.e.B M r.G.~ L L F S A b b x $ ", +"9.M o o n C.C.N.N.n.v.c.h.h.c.E ", +"6.m X . O V.{ { ' ( ( W P K ( = ", +"B.w.@ + q.N.h p q 0 5 1 < , r # ", +"8.K.F.D.H.H.v.c.h.c.c.y.y.4.p.Y ", +"y | } { { ) ( ! ! K K H D V I & ", +"% v f s a q 0 4 1 < , : ; - 6 ", +"*.S.b.b.c.g.c.d.p.y.4.3.3.3.3.C ", +"* v c z l k j g g u r e 8 8 6 ", +";.-.=.%.$.#.@.+.o.o.o.....R R R " +}; diff --git a/src/pixmaps/flags_xpm/uz.xpm b/src/pixmaps/flags_xpm/uz.xpm new file mode 100644 index 00000000..cec64c0a --- /dev/null +++ b/src/pixmaps/flags_xpm/uz.xpm @@ -0,0 +1,157 @@ +/* XPM */ +static const char *uz[] = { +/* columns rows colors chars-per-pixel */ +"16 11 140 2", +" c black", +". c #000100", +"X c #000700", +"o c #000B00", +"O c #150000", +"+ c #001100", +"@ c #001900", +"# c #001F00", +"$ c #000015", +"% c #00001D", +"& c #002700", +"* c #002D00", +"= c #003300", +"- c #003900", +"; c #003F00", +": c #000025", +"> c #00002B", +", c #000031", +"< c #000039", +"1 c #00003F", +"2 c #530000", +"3 c #650000", +"4 c #004700", +"5 c #004F00", +"6 c #0B7D0B", +"7 c #000045", +"8 c #000049", +"9 c #00005B", +"0 c #00005F", +"q c #000061", +"w c #831030", +"e c #861435", +"r c #881939", +"t c #8B1F3E", +"y c #8F2442", +"u c #902644", +"i c #922A47", +"p c #932B49", +"a c #952F4C", +"s c #97314E", +"d c #94324E", +"f c #983451", +"g c #993753", +"h c #9C3A55", +"j c #9C3C58", +"k c #9F3F5A", +"l c #9F445E", +"z c #A0415D", +"x c #A2455F", +"c c #A24760", +"v c #A44963", +"b c #A54B65", +"n c #A85169", +"m c #AB546D", +"M c #AC5971", +"N c #AF5C74", +"B c #0F800E", +"V c #138313", +"C c #188619", +"Z c #1E881E", +"A c #238C23", +"S c #298F29", +"D c #2C8E2C", +"F c #2F902F", +"G c #2E922E", +"H c #329132", +"J c #349534", +"K c #359435", +"L c #399739", +"P c #3A993A", +"I c #3D993D", +"U c #3F9C3F", +"Y c #429B42", +"T c #449F44", +"R c #469E46", +"E c #4BA14B", +"W c #50A450", +"Q c #54A655", +"! c #58A958", +"~ c #5DAC5D", +"^ c #61AE62", +"/ c #66B166", +"( c #2C2C91", +") c #313194", +"_ c #373798", +"` c #3D3C9B", +"' c #42429E", +"] c #4949A0", +"[ c #4E4EA3", +"{ c #5353A6", +"} c #5857A9", +"| c #5C5CAB", +" . c #5F5FAF", +".. c #6160AE", +"X. c #6565B0", +"o. c #7777BA", +"O. c #7979BC", +"+. c #B56A80", +"@. c #BE798C", +"#. c #8F8DC3", +"$. c #9797CA", +"%. c #ABABD4", +"&. c #ADADD7", +"*. c #B3B3D7", +"=. c #BDBDD1", +"-. c #B9B9D9", +";. c #C1C1D1", +":. c #C3C3D5", +">. c #C2C2DF", +",. c #C6C6E1", +"<. c #CCCCE4", +"1. c #D5D5E8", +"2. c #D5D5EB", +"3. c #D9D8EA", +"4. c #D9D9EC", +"5. c #DCDCEC", +"6. c #DDDDED", +"7. c #DFDFED", +"8. c #E2E2EF", +"9. c #EAEAF4", +"0. c #EDEFF5", +"q. c #EFEFF7", +"w. c gray95", +"e. c #F3F3F3", +"r. c #F2F2F7", +"t. c #F4F4F4", +"y. c #F4F5F5", +"u. c gray96", +"i. c #F6F6F6", +"p. c gray97", +"a. c #F1F1F9", +"s. c #F8F8F8", +"d. c #F9F9F9", +"f. c gray98", +"g. c #FBFBFB", +"h. c #FBFCFB", +"j. c gray99", +"k. c #FDFCFD", +"l. c #FDFDFD", +"z. c #FEFEFE", +/* pixels */ +"q &.2. .0 9 -.#.*.8 7 1 < > > : ", +"q r.%.O.o.8.4.6.<.X...| } { [ % ", +"q 6.9.$.5.,.3.>.2.' ` _ ) ( ] $ ", +"3 @.N M m n b l z j g s a y x O ", +"a.z.z.z.j.g.g.g.g.s.u.u.y.t.u.:.", +"q.z.z.j.j.g.g.d.u.g.u.u.r.e.u.;.", +"q.z.z.h.g.g.g.s.u.u.u.e.e.e.t.=.", +"2 N b c k h s a i u t r e w d . ", +"5 / T U P K G S A Z C V 6 6 H . ", +"4 ^ ~ ! Q W E R Y U L K K D D . ", +"; - = * & # @ + o X . . . . . . " +}; diff --git a/src/pixmaps/flags_xpm/va.xpm b/src/pixmaps/flags_xpm/va.xpm new file mode 100644 index 00000000..54bb4dff --- /dev/null +++ b/src/pixmaps/flags_xpm/va.xpm @@ -0,0 +1,160 @@ +/* XPM */ +static const char *va[] = { +/* columns rows colors chars-per-pixel */ +"16 11 143 2", +" c #BBB732", +". c #CDA700", +"X c #CFA700", +"o c #D1AB00", +"O c #D5AF00", +"+ c #D7B300", +"@ c #D9B700", +"# c #DBB700", +"$ c #DDBF00", +"% c #DFBF00", +"& c #E3C300", +"* c #E5C500", +"= c #E7C700", +"- c #E5C901", +"; c #E7C900", +": c #E9C900", +"> c #E9CB01", +", c #E9CD03", +"< c #EBCD03", +"1 c #EBCD05", +"2 c #EBCD07", +"3 c #EBCF15", +"4 c #A9886E", +"5 c #A8AC6E", +"6 c #BEA361", +"7 c #CCBC5F", +"8 c #C9BF7D", +"9 c #F4DF4E", +"0 c #F5E153", +"q c #F3E057", +"w c #F5E156", +"e c #F6E258", +"r c #F6E35B", +"t c #F4E25C", +"y c #F7E45E", +"u c #F7E45F", +"i c #DDD063", +"p c #C4C27C", +"a c #F5E361", +"s c #F7E460", +"d c #F5E266", +"f c #F6E565", +"g c #F8E562", +"h c #F8E564", +"j c #F8E664", +"k c #F8E665", +"l c #F9E767", +"z c #F7E66A", +"x c #F4E36E", +"c c #F6E56D", +"v c #F9E668", +"b c #F9E769", +"n c #F9E76A", +"m c #FAE86B", +"M c #FAE86D", +"N c #F8E86F", +"B c #FAE86E", +"V c #FAE96E", +"C c #F7E671", +"Z c #F7E775", +"A c #FAE971", +"S c #FBE971", +"D c #F9E973", +"F c #FBEA75", +"G c #F8E879", +"H c #FCEB78", +"J c #FCEC7B", +"K c #F9E97C", +"L c #BDBC81", +"P c #BBB6AF", +"I c #E0B19D", +"U c #D9A4B6", +"Y c #DFADB9", +"T c #E0A7A6", +"R c #FAEA80", +"E c #FBEC84", +"W c #FBED87", +"Q c #FCED87", +"! c #FCED8A", +"~ c #FCED8B", +"^ c #FBED8D", +"/ c #FCEE8E", +"( c #FCEF8F", +") c #FCF092", +"_ c #ECE7A9", +"` c #EAE6AE", +"' c gray81", +"] c #CDD0CC", +"[ c #D9D7C3", +"{ c gray82", +"} c #D3D3D1", +"| c LightGray", +" . c #D5D5D5", +".. c #D7D7D7", +"X. c gray86", +"o. c #DDDDDD", +"O. c #DFDFDF", +"+. c #E5E2C3", +"@. c #E5E3CC", +"#. c #EFEDDF", +"$. c #F3F0DD", +"%. c #DBDCEA", +"&. c #E1E3E3", +"*. c gray90", +"=. c #E7E7E7", +"-. c #EAE1E1", +";. c #EBE3E2", +":. c #E9E9E9", +">. c #EAEBEA", +",. c gray92", +"<. c gray93", +"1. c #EFEDED", +"2. c #EFEFEF", +"3. c #F1EFE1", +"4. c #F1F1E2", +"5. c #F0F0EB", +"6. c #F5F3E9", +"7. c #F6F4EB", +"8. c #F5F5EF", +"9. c #F6F5EF", +"0. c #F8F6ED", +"q. c #F1F1F1", +"w. c gray95", +"e. c #F2F2F3", +"r. c #F3F3F3", +"t. c #F1F1F6", +"y. c #F4F4F4", +"u. c #F4F5F4", +"i. c gray96", +"p. c #F7F7F4", +"a. c #F7F7F5", +"s. c #F6F6F6", +"d. c gray97", +"f. c #FBF9F0", +"g. c #FAFAF2", +"h. c #F8F8F6", +"j. c #F9F9F6", +"k. c #FCFCF4", +"l. c #F8F8F8", +"z. c #F9F9F9", +"x. c gray98", +"c. c #FBFBFB", +"v. c gray99", +/* pixels */ +"3 < 2 2 < > = - #.2.2.,.,.=.=.&.", +"2 ) ) ( ( ! Q ^ k.v.x.x.d.d.d.O.", +"2 ) J H F S m D f.x.x.d.i.d.d.o.", +"2 ( H F S N k N f.t.@.p 5 +.$.X.", +"> ( F S M n s z h.%.5 8 i ` ..", +"> ! S M n k y d 0.d.8.6 4 q.i. .", +"= W M n k s r a d._ i I U P ' { ", +"= E f k s r 0 r 9.3.3.Y T 1.,.| ", +"& E s u r q 9 q 6.i.r.-.-.2.r.' ", +"$ K K Z C c d x 6.d.d.r.r.r.r.' ", +"$ @ @ + O o X X [ .. .{ ' ' ' ' " +}; diff --git a/src/pixmaps/flags_xpm/vc.xpm b/src/pixmaps/flags_xpm/vc.xpm new file mode 100644 index 00000000..db138736 --- /dev/null +++ b/src/pixmaps/flags_xpm/vc.xpm @@ -0,0 +1,181 @@ +/* XPM */ +static const char *vc[] = { +/* columns rows colors chars-per-pixel */ +"16 11 164 2", +" c #001B00", +". c #001D00", +"X c #001F00", +"o c #002100", +"O c #002300", +"+ c #002700", +"@ c #002D00", +"# c #003100", +"$ c #003700", +"% c #003D00", +"& c #004300", +"* c #004900", +"= c #004F00", +"- c #005500", +"; c #005B00", +": c #0B930B", +"> c #0F950E", +", c #109510", +"< c #149814", +"1 c #199A19", +"2 c #1A9B1A", +"3 c #1F9D1F", +"4 c #209E20", +"5 c #25A025", +"6 c #26A126", +"7 c #2BA42B", +"8 c #2CA02C", +"9 c #2FA22F", +"0 c #2FA32F", +"q c #2CA42C", +"w c #30A730", +"e c #31A731", +"r c #32A432", +"t c #33A432", +"y c #36A736", +"u c #3BA93B", +"i c #3FAB3F", +"p c #43AF2A", +"a c #53B52F", +"s c #62BC2F", +"d c #65BD35", +"f c #6ABF36", +"g c #44AE44", +"h c #43B140", +"j c #49B049", +"k c #4EB34E", +"l c #53B553", +"z c #58B857", +"x c #7BC846", +"c c #E1AF00", +"v c #E3B300", +"b c #E5B500", +"n c #E7B900", +"m c #E9BB00", +"M c #EBBD00", +"N c #86CB2B", +"B c #95CF23", +"V c #94CF2A", +"C c #9ED329", +"Z c #B7DD24", +"A c #A3D73A", +"S c #B9DF30", +"D c #B2DD3C", +"F c #EDC100", +"G c #EDC500", +"H c #F5CF00", +"J c #F7D100", +"K c #F9D500", +"L c #FBD700", +"P c #FDD700", +"I c #FDD900", +"U c #FDDB00", +"Y c #FDDD00", +"T c #E5ED13", +"R c #E6EE19", +"E c #E8F01F", +"W c #F3F319", +"Q c #F4F41E", +"! c #F4F41F", +"~ c #DFEF36", +"^ c #DFEF3B", +"/ c #EEF225", +"( c #EDF22B", +") c #F1F424", +"_ c #F7F72E", +"` c #E8EF35", +"' c #ECF331", +"] c #EDF437", +"[ c #E8F23C", +"{ c #F7F834", +"} c #F8F834", +"| c #F8F836", +" . c #F4F439", +".. c #F5F53D", +"X. c #F9F93A", +"o. c #F9F93D", +"O. c #99D546", +"+. c #ADDC41", +"@. c #C3E440", +"#. c #C5E74B", +"$. c #EEEE43", +"%. c #EFEF48", +"&. c #ECF54B", +"*. c #F3F542", +"=. c #F5F646", +"-. c #F6F942", +";. c #F6F947", +":. c #FAFA42", +">. c #FBFB47", +",. c #F7F74B", +"<. c #F0F04E", +"1. c #FCFC4C", +"2. c #F4F153", +"3. c #F8F850", +"4. c #FDFD51", +"5. c #FDFD54", +"6. c #F3F258", +"7. c #F0F05C", +"8. c #F3F35D", +"9. c #F1F75C", +"0. c #F4F460", +"q. c #FBFB60", +"w. c #FCFC65", +"e. c #FCFC69", +"r. c #FDFD6D", +"t. c #FDFD71", +"y. c #FEFE74", +"u. c #F7F77D", +"i. c #00008F", +"p. c #000093", +"a. c #0000AF", +"s. c #0000B1", +"d. c #0000B3", +"f. c #0000B5", +"g. c #0000B7", +"h. c #0000BB", +"j. c #0000BD", +"k. c #0000BF", +"l. c #0000C1", +"z. c #0000C3", +"x. c #0000C7", +"c. c #4A4ACC", +"v. c #4E4ECE", +"b. c #4F4FCE", +"n. c #5454D0", +"m. c #5455D0", +"M. c #5959D2", +"N. c #5E5ED3", +"B. c #6262D3", +"V. c #6262D5", +"C. c #6666D4", +"Z. c #6565D6", +"A. c #6666D6", +"S. c #6161DD", +"D. c #6666DE", +"F. c #6869D8", +"G. c #6A6AE0", +"H. c #6F6FE0", +"J. c #7272E2", +"K. c #7676E3", +"L. c #7979E4", +"P. c #7B7BE4", +"I. c #8081DD", +"U. c #8383DE", +/* pixels */ +"x.z.s.s.Y U U L L L J H ; - = * ", +"z.P.I.I.u.y.t.r.e.w.q.9.z l k & ", +"z.P.F.A.0.5.4.1.>.:...] e q j % ", +"z.P.A.V.8.4.&.,.-.[ | ' q 6 g $ ", +"z.K.B.N.6.#.x +.D f S ( 6 4 i # ", +"k.J.N.M.2.O.h ^ ` e N ) 3 2 u @ ", +"k.J.M.m.<.^ A d a C Z E 2 < y + ", +"h.D.m.b.%.X.] p p / ) R , , t O ", +"g.D.b.c.$.} } C B Q W T > : 9 X ", +"s.S.C.B.7.3.,.,.*... .` t 9 4 ", +"g.a.p.i.F F M M n b b v o . . " +}; diff --git a/src/pixmaps/flags_xpm/ve.xpm b/src/pixmaps/flags_xpm/ve.xpm new file mode 100644 index 00000000..c2585ac5 --- /dev/null +++ b/src/pixmaps/flags_xpm/ve.xpm @@ -0,0 +1,175 @@ +/* XPM */ +static const char *ve[] = { +/* columns rows colors chars-per-pixel */ +"16 11 158 2", +" c black", +". c #43003B", +"X c #771072", +"o c #7B1475", +"O c #7D1978", +"+ c #DD0000", +"@ c #DF0000", +"# c #E10000", +"$ c #E30000", +"% c #E50000", +"& c #E70000", +"* c #E90000", +"= c #EB0000", +"- c #ED0000", +"; c #EF0000", +": c #F10000", +"> c #F30000", +", c #F50000", +"< c #F70000", +"1 c #F90000", +"2 c #F10B0B", +"3 c #F10F0E", +"4 c #F21313", +"5 c #F31919", +"6 c #F41E1E", +"7 c #F52323", +"8 c #F62929", +"9 c #F22C2C", +"0 c #F22F2F", +"q c #F72E2E", +"w c #F23232", +"e c #F33535", +"r c #F83434", +"t c #F43939", +"y c #F53D3D", +"u c #F93A3A", +"i c #FA3F3F", +"p c #801F7C", +"a c #F64242", +"s c #F74646", +"d c #FA4444", +"f c #F74B4B", +"g c #F85050", +"h c #F95455", +"j c #F95858", +"k c #FA5D5D", +"l c #FB6162", +"z c #FC6666", +"x c #439500", +"c c #419700", +"v c #E7B900", +"b c #E9BD00", +"n c #B7D300", +"m c #B7D500", +"M c #EBC100", +"N c #EDCD00", +"B c #EFD100", +"V c #F1D500", +"C c #F3D700", +"Z c #F5DB00", +"A c #F7DB00", +"S c #F9DD00", +"D c #FBDF00", +"F c #FFDD00", +"G c #FDE100", +"H c #FDE300", +"J c #FDE500", +"K c #FFE700", +"L c #FDEB00", +"P c #F5F526", +"I c #F6F62B", +"U c #F6F62C", +"Y c #F7F731", +"T c #F8F836", +"R c #F8F837", +"E c #F9F93C", +"W c #F9F93D", +"Q c #F38A7F", +"! c #B9DA69", +"~ c #F6F644", +"^ c #FAFA42", +"/ c #FBFB47", +"( c #F7F749", +") c #F7F74E", +"_ c #FCFC4B", +"` c #FCFC4C", +"' c #F8F853", +"] c #FDFD51", +"[ c #F9F957", +"{ c #FDFD54", +"} c #FEFE59", +"| c #FAFA5C", +" . c #FEFE5C", +".. c #FBFB60", +"X. c #FCFC65", +"o. c #FCFC69", +"O. c #FDFD6D", +"+. c #FDFD71", +"@. c #FEFE74", +"#. c #FEFE77", +"$. c #FEFE79", +"%. c #FCFC7C", +"&. c #000089", +"*. c #00008D", +"=. c #000091", +"-. c #0000BB", +";. c #0000BF", +":. c #0000C1", +">. c #1414C8", +",. c #1919C9", +"<. c #1A1ACA", +"1. c #1F1FCB", +"2. c #2020CC", +"3. c #2525CD", +"4. c #2A2ACF", +"5. c #2B2BCF", +"6. c #3636CF", +"7. c #2F2FD1", +"8. c #3030D1", +"9. c #3535D3", +"0. c #3636D3", +"q. c #3B3BD1", +"w. c #3F3FD3", +"e. c #3B3BD4", +"r. c #3B3BD5", +"t. c #494ADA", +"y. c #4B4ADA", +"u. c #4B4BDA", +"i. c #4F4FDB", +"p. c #504FDB", +"a. c #5353DC", +"s. c #5454DD", +"d. c #5858DD", +"f. c #6769D8", +"g. c #6F6FE2", +"h. c #7272E2", +"j. c #7676E4", +"k. c #842480", +"l. c #872A82", +"z. c #8B2F86", +"x. c #8B3286", +"c. c #8E3489", +"v. c #923A8D", +"b. c #953F90", +"n. c #984594", +"m. c #9B4997", +"M. c #AE6AAA", +"N. c #ACD289", +"B. c #8384DE", +"V. c #9595E3", +"C. c #9C9CE6", +"Z. c #A5A5EA", +"A. c #DFE0F0", +"S. c #E3E3F2", +"D. c #E6E6F4", +"F. c #E9E9F7", +"G. c #F1F1F8", +"H. c #F2F2F9", +/* pixels */ +"L n m K K H H H D S A A V V B N ", +"c Q %.N.@.@.+.O.o.X...| [ ' ) M ", +"c B.f.! } { ] ` / ^ W R Y U ( b ", +"F $. .} { ] ` / ^ W R Y U P ~ v ", +":.j.d.s.p.t.F.H.G.D.7.7.3.1.w.=.", +";.h.a.i.y.F.Z.e.9.C.S.3.1.<.q.*.", +"-.g.i.t.F.Z.e.0.7.4.V.S.<.>.6.&.", +". M.m.n.b.v.c.z.l.k.O O o X x. ", +"1 z d i i r q 8 7 6 5 4 3 2 0 + ", +"< l k j h f f s a y t e w 0 0 + ", +"< : : - - - = = % % $ $ + + + + " +}; diff --git a/src/pixmaps/flags_xpm/vg.xpm b/src/pixmaps/flags_xpm/vg.xpm new file mode 100644 index 00000000..dec1da69 --- /dev/null +++ b/src/pixmaps/flags_xpm/vg.xpm @@ -0,0 +1,181 @@ +/* XPM */ +static const char *vg[] = { +/* columns rows colors chars-per-pixel */ +"16 11 164 2", +" c #00001D", +". c #00001F", +"X c #000021", +"o c #000023", +"O c #000025", +"+ c #000027", +"@ c #00002B", +"# c #00002F", +"$ c #000031", +"% c #000035", +"& c #000037", +"* c #00003B", +"= c #000041", +"- c #000045", +"; c #000047", +": c #00004B", +"> c #00004D", +", c #000051", +"< c #000053", +"1 c #000057", +"2 c #000059", +"3 c #00005D", +"4 c #000063", +"5 c #000065", +"6 c #000069", +"7 c #00006D", +"8 c #00006F", +"9 c #000073", +"0 c #000077", +"q c #73094B", +"w c #7D1751", +"e c #5D0F61", +"r c #5B1F75", +"t c #477941", +"y c #487A47", +"u c #4F7F4B", +"i c #CD1517", +"p c #831145", +"a c #AD5777", +"s c #BF677D", +"d c #D56A71", +"f c #DF7578", +"g c #DE7B7D", +"h c #E26867", +"j c #E57371", +"k c #E87B76", +"l c #5C9149", +"z c #538150", +"x c #548253", +"c c #548455", +"v c #5C895A", +"b c #568365", +"n c #558568", +"m c #618C61", +"M c #7EA66F", +"N c #819E4F", +"B c #819D50", +"V c #ABAB58", +"C c #ADAD5C", +"Z c #9C9666", +"A c #A29D6F", +"S c #C6BF5D", +"D c #EA837E", +"F c #C8C267", +"G c #00008F", +"H c #1D0789", +"J c #00009D", +"K c #1E1E9E", +"L c #2323A0", +"P c #2424A3", +"I c #2929A2", +"U c #2A2AA3", +"Y c #2C2CA0", +"T c #2F2FA3", +"R c #2A2AA7", +"E c #2D2DA4", +"W c #2F2FA4", +"Q c #2E2EA6", +"! c #2F2FA6", +"~ c #2F2FA7", +"^ c #3135A5", +"/ c #3534A7", +"( c #3B37A3", +") c #3030AB", +"_ c #3232AA", +"` c #3535A8", +"' c #3434A9", +"] c #3535A9", +"[ c #3636AB", +"{ c #3636AE", +"} c #373AA8", +"| c #3939A9", +" . c #3B3BAA", +".. c #3A3AAB", +"X. c #3D3DAA", +"o. c #3B3BAE", +"O. c #3D3EAC", +"+. c #3F3FAD", +"@. c #3F3FAF", +"#. c #3C3CB0", +"$. c #403FAE", +"%. c #4242AD", +"&. c #4040AE", +"*. c #4646AE", +"=. c #4843AC", +"-. c #5249AC", +";. c #4242B1", +":. c #4444B0", +">. c #4545B0", +",. c #4545B3", +"<. c #4646B3", +"1. c #4949B0", +"2. c #4B4BB1", +"3. c #4949B3", +"4. c #4E4EB3", +"5. c #494AB5", +"6. c #4F4FB5", +"7. c #5050B3", +"8. c #5353B5", +"9. c #5454B6", +"0. c #5353BE", +"q. c #5857B9", +"w. c #5858B8", +"e. c #5C5CBA", +"r. c #5D5DBA", +"t. c #6155AF", +"y. c #775DA7", +"u. c #7E5FA5", +"i. c #6160BC", +"p. c #6161BD", +"a. c #6263BD", +"s. c #6565BE", +"d. c #6666BF", +"f. c #6A6AC1", +"g. c #6A6BC1", +"h. c #6F6FC4", +"j. c #805C9F", +"k. c #A76D95", +"l. c #BB7C99", +"z. c #9172A9", +"x. c #9373A9", +"c. c #8A7ABD", +"v. c #D17E8B", +"b. c #C37E95", +"n. c #9FBE9E", +"m. c #9783BD", +"M. c #E08184", +"N. c #E59194", +"B. c #EFA09C", +"V. c #EEA29E", +"C. c #D79AA9", +"Z. c #D6A7B7", +"A. c #D4AAB7", +"S. c #DFAFBB", +"D. c #ACC29C", +"F. c #A7C3A2", +"G. c #ABC3A3", +"H. c #9598D4", +"J. c #939BDA", +"K. c #D4B3C5", +"L. c #DDB6C3", +"P. c #DDCEDF", +"I. c #E2C0CB", +"U. c #E1C8D4", +/* pixels */ +"s y.J q p G e a 0 7 7 4 2 2 < > ", +"H L.P.Z.C.K.U.J.d.s.a.r.q.8.4.; ", +"i N.D j h k j d -.>.O.} ^ ~ 3.* ", +"w S.B.g M.V.v.k.=.#.m n b x >.* ", +"t.I.m.l.b.J.A.z.O.{ v M D.u O.& ", +"r c.0.u.j.>.a.z.( ) c n.G.y ..# ", +"0 h.6.5.<.&...] ~ R z l F.t { @ ", +"9 f.3.>.$...] ~ U P F N B S / O ", +"8 f.>.O.../ ~ U L K A C V Z T . ", +"7 a.r.q.9.7.2.*.&.O...] ) ^ Y . ", +"4 2 1 > : ; = * & $ @ O X . . " +}; diff --git a/src/pixmaps/flags_xpm/vi.xpm b/src/pixmaps/flags_xpm/vi.xpm new file mode 100644 index 00000000..87d4e4cb --- /dev/null +++ b/src/pixmaps/flags_xpm/vi.xpm @@ -0,0 +1,160 @@ +/* XPM */ +static const char *vi[] = { +/* columns rows colors chars-per-pixel */ +"16 11 143 2", +" c #D66B53", +". c #D8605E", +"X c #D9716C", +"o c #DC7173", +"O c #499250", +"+ c #EBD51E", +"@ c #CECE2B", +"# c #E1D725", +"$ c #E4DE2B", +"% c #E3D73A", +"& c #E9D93E", +"* c #EEE831", +"= c #BB9A42", +"- c #92B34D", +"; c #BFBF6D", +": c #C9BF52", +"> c #DDDD5A", +", c #E3D442", +"< c #E0D942", +"1 c #E7DB42", +"2 c #EBDD43", +"3 c #EBDF55", +"4 c #E6DD5A", +"5 c #EBDF58", +"6 c #ECE048", +"7 c #F3E74C", +"8 c #F5EF49", +"9 c #ECE554", +"0 c #E8E15F", +"q c #F5EB56", +"w c #D0CD62", +"e c #DFD962", +"r c #DCD56D", +"t c #EDE867", +"y c #F1E76C", +"u c #F2E96E", +"i c #E6E37E", +"p c #EDE779", +"a c #F2EC73", +"s c #5A43D5", +"d c #5E49DD", +"f c #6450DD", +"g c #7968CB", +"h c #7575CF", +"j c #7775CF", +"k c #786CDE", +"l c #8B7FE0", +"z c #8883AD", +"x c #918CBF", +"c c #BCBCBA", +"v c #BCCEA6", +"b c #DDD581", +"n c #DDDF82", +"m c #D9D195", +"M c #F3E985", +"N c #F2E88D", +"B c #F4EE8F", +"V c #FBEF8E", +"C c #E4E596", +"Z c #F7EF98", +"A c #F7EE9E", +"S c #D3D5A3", +"D c #D4CEBD", +"F c #ECE5A3", +"G c #F4F0A3", +"H c #F6F1A2", +"J c #F8F0A4", +"K c #F9F2A9", +"L c #FCF6BE", +"P c #8989CD", +"I c #9595D7", +"U c #9B9BD9", +"Y c #BBBBCB", +"T c #BDBDCD", +"R c #BFBFCF", +"E c #A9A8DE", +"W c #9C9CE1", +"Q c #AAA9E0", +"! c #AEAEE2", +"~ c #B9B9E5", +"^ c #BEBEE6", +"/ c #B8B7EA", +"( c #B5B6F1", +") c #CBCBCB", +"_ c #CFCDCD", +"` c #CFCFCD", +"' c gray81", +"] c gray82", +"[ c LightGray", +"{ c #D3D3D7", +"} c #D7D7D7", +"| c gray85", +" . c #DDDDDD", +".. c #DFDFDF", +"X. c #EDCFCF", +"o. c #EBCBD0", +"O. c #E7E7CD", +"+. c #F8F2C0", +"@. c #EEEED6", +"#. c #F7F3D0", +"$. c #F9F6D5", +"%. c #FCF9DC", +"&. c #C2C2E8", +"*. c #C2C1ED", +"=. c #C9C8EF", +"-. c #D8D8E7", +";. c #DCDCEA", +":. c #D6D5F2", +">. c #E1E1E1", +",. c gray89", +"<. c gray90", +"1. c #E7E7E7", +"2. c #E6EAE3", +"3. c #E1E1EA", +"4. c #E9E9E9", +"5. c gray92", +"6. c gray93", +"7. c #EDEDEF", +"8. c #EFEFEF", +"9. c #F7F7E4", +"0. c #FDFBE1", +"q. c #F0F1E9", +"w. c #F1F1EF", +"e. c #EFEFF1", +"r. c #F1F1F0", +"t. c #F1F1F1", +"y. c gray95", +"u. c #F2F2F3", +"i. c #F5F5F0", +"p. c gray97", +"a. c #F9F7F0", +"s. c #F8F6F2", +"d. c #FAFAF2", +"f. c #FDFDF5", +"g. c #F7F7F8", +"h. c #F7F7FC", +"j. c #F9F9F9", +"k. c gray98", +"l. c #FBFBFB", +"z. c #FBFCFB", +"x. c #FBFBFC", +"c. c gray99", +"v. c #FDFDFE", +/* pixels */ +"t.t.t.t.t.t.7.7.7.4.4.1.<.,.>...", +"w.K %.0.L V v.A Z l.J +.$.#.N m ", +"t.G t p Z J f.u 8 d.9.y 3 < 4 ; ", +"7.x.M 0 9 q P P z k b * @ % O.{ ", +"h h.D i 4 7 g f d s , $ e F ! T ", +"h :./ c.c.u a.o X.. 1 S U ;.Q T ", +"I *.=.c.O 3 a.X o. 2 ( P 3.E Y ", +"7.c.l.l.2 - C : = w n + ;.t.t.' ", +"5.x.x.h.q.v 2.2 # r U c t.t.t.' ", +"4.x.x.h.j.p.p.w.@.*.~ ^ u.u.t.) ", +"4.,.,.O.....| } } ] ] ' ' ) ) ) " +}; diff --git a/src/pixmaps/flags_xpm/vn.xpm b/src/pixmaps/flags_xpm/vn.xpm new file mode 100644 index 00000000..ebe9b7de --- /dev/null +++ b/src/pixmaps/flags_xpm/vn.xpm @@ -0,0 +1,143 @@ +/* XPM */ +static const char *vn[] = { +/* columns rows colors chars-per-pixel */ +"16 11 126 2", +" c #DD0000", +". c #DF0000", +"X c #E10000", +"o c #E30000", +"O c #E50000", +"+ c #E70000", +"@ c #E90000", +"# c #EB0000", +"$ c #ED0000", +"% c #EF0000", +"& c #F10000", +"* c #F30000", +"= c #F50000", +"- c #F70000", +"; c #F90000", +": c #FB0000", +"> c #FD0000", +", c red", +"< c #F10B0B", +"1 c #F10F0E", +"2 c #F21010", +"3 c #F21313", +"4 c #F21414", +"5 c #F31919", +"6 c #F31A1A", +"7 c #F41F1F", +"8 c #F32719", +"9 c #F4301E", +"0 c #F42020", +"q c #F52323", +"w c #F52424", +"e c #F52525", +"r c #F52626", +"t c #F62929", +"y c #F62B2B", +"u c #F22C2C", +"i c #F22F2F", +"p c #F62C2C", +"a c #F6332B", +"s c #F23232", +"d c #F33232", +"f c #F73131", +"g c #F33535", +"h c #F43636", +"j c #F83736", +"k c #F83737", +"l c #F83E34", +"z c #F43939", +"x c #F43B3B", +"c c #F53D3D", +"v c #F53F3F", +"b c #F93A3A", +"n c #F93C3C", +"m c #F93C3D", +"M c #FA3F3F", +"N c #F6422B", +"B c #F7432E", +"V c #F64E2A", +"C c #F7602F", +"Z c #F6772A", +"A c #F9733A", +"S c #F64242", +"D c #F64444", +"F c #F74646", +"G c #FA4040", +"H c #FA4242", +"J c #FA4444", +"K c #FB4545", +"L c #F74949", +"P c #F74B4B", +"I c #F74E4E", +"U c #FB4949", +"Y c #FB4A49", +"T c #FC4A4B", +"R c #FC4B4B", +"E c #FC4F4F", +"W c #FB5446", +"Q c #F85050", +"! c #F85353", +"~ c #FD5150", +"^ c #FD5151", +"/ c #FD5353", +"( c #F95455", +") c #F95757", +"_ c #FD5454", +"` c #F95858", +"' c #FE5858", +"] c #FE5959", +"[ c #FA5C5C", +"{ c #FA5D5D", +"} c #FE5C5C", +"| c #FE5F5F", +" . c #FB7647", +".. c #FC784C", +"X. c #FB6060", +"o. c #FB6162", +"O. c #FC6565", +"+. c #FC6666", +"@. c #FC6969", +"#. c #FC6A6A", +"$. c #FD6D6D", +"%. c #FD6F6F", +"&. c #FD7071", +"*. c #FE7273", +"=. c #FE7474", +"-. c #FE7676", +";. c #FE7777", +":. c #FE7979", +">. c #FF7B7A", +",. c #FF7B7B", +"<. c #F8C136", +"1. c #F7D230", +"2. c #F5F524", +"3. c #F7F72F", +"4. c #F7F730", +"5. c #F8F834", +"6. c #F8F835", +"7. c #F8F836", +"8. c #F9F93B", +"9. c #F9F93C", +"0. c #FBBF47", +"q. c #FACC42", +"w. c #FBCB46", +"e. c #FCD54B", +"r. c #FAFA40", +"t. c #FAFA41", +/* pixels */ +", , , , , , : : : : - - * * $ $ ", +", ,.,.,.;.*.*.$.#.O.X.[ ) ! I # ", +", ,.| } } / / .. .G m j f p L # ", +", ;.| ) / / U 0.q.c j f y r D O ", +", ;.' _ ~ e.w.r.9.<.1.a r 7 v O ", +", *./ E U W r.8.7.3.N r 7 6 c O ", +": %.E U K G A 6.3.Z w 7 6 4 g o ", +": #.U K M b 6.C V 2.7 6 4 1 d . ", +": +.J M b l B y w 9 8 3 1 < i . ", +"- o.{ ` ) Q L D S c z g d i u ", +"- * * $ $ $ # O # O o o . " +}; diff --git a/src/pixmaps/flags_xpm/vu.xpm b/src/pixmaps/flags_xpm/vu.xpm new file mode 100644 index 00000000..fc2b7723 --- /dev/null +++ b/src/pixmaps/flags_xpm/vu.xpm @@ -0,0 +1,172 @@ +/* XPM */ +static const char *vu[] = { +/* columns rows colors chars-per-pixel */ +"16 11 155 2", +" c black", +". c #010000", +"X c #090000", +"o c #191714", +"O c #1E1C19", +"+ c #2D1B00", +"@ c #003D00", +"# c #23221F", +"$ c #242320", +"% c #292724", +"& c #2A2825", +"* c #2E2D2A", +"= c #2F2E2B", +"- c #34322F", +"; c #353330", +": c #383735", +"> c #3A3836", +", c #3B3936", +"< c #3E3D3A", +"1 c #3F3E3C", +"2 c #3C5A3A", +"3 c #3D5A3A", +"4 c #43413F", +"5 c #454341", +"6 c #494946", +"7 c #4D4B49", +"8 c #4E4C4B", +"9 c #5F5D5C", +"0 c #755251", +"q c #7C5A59", +"w c #5B7458", +"e c #746F53", +"r c #6A6866", +"t c #6E6D6A", +"y c #7B7A79", +"u c #7D7D7A", +"i c #950000", +"p c #E70000", +"a c #E90000", +"s c #EB0000", +"d c #ED0000", +"f c #EF0000", +"g c #F10000", +"h c #F30000", +"j c #F50000", +"k c #F70000", +"l c #F90000", +"z c #FB0000", +"x c #FD0000", +"c c #F52626", +"v c #F62B2B", +"b c #F62C2C", +"n c #F73131", +"m c #F83736", +"M c #F83737", +"N c #F93C3C", +"B c #F93C3D", +"V c #B37500", +"C c #B34C4B", +"Z c #807644", +"A c #817745", +"S c #817746", +"D c #897F50", +"F c #967A79", +"G c #C25554", +"H c #F64444", +"J c #FA4142", +"K c #FA4242", +"L c #FB4747", +"P c #F74949", +"I c #F74E4E", +"U c #FC4C4C", +"Y c #F85353", +"T c #FD5151", +"R c #F95757", +"E c #FA5C5C", +"W c #D07777", +"Q c #FB6060", +"! c #FC6565", +"~ c #FC6969", +"^ c #FD6D6D", +"/ c #FD7071", +"( c #FE7474", +") c #008100", +"_ c #008300", +"` c #008700", +"' c #008900", +"] c #008B00", +"[ c #008F00", +"{ c #009100", +"} c #009300", +"| c #009900", +" . c #009D00", +".. c #009F00", +"X. c #00A300", +"o. c #369134", +"O. c #369A34", +"+. c #0BC20B", +"@. c #0FC40E", +"#. c #13C613", +"$. c #10CA10", +"%. c #14CB14", +"&. c #18C719", +"*. c #19CC19", +"=. c #1EC91E", +"-. c #1FCF1F", +";. c #23CB23", +":. c #29CD29", +">. c #2CCA2C", +",. c #2FCA2F", +"<. c #2FCB2F", +"1. c #24D024", +"2. c #2AD22A", +"3. c #2ED32E", +"4. c #2FD52F", +"5. c #32CC32", +"6. c #35CD35", +"7. c #39CF39", +"8. c #33D132", +"9. c #3DD03D", +"0. c #55AD55", +"q. c #42D242", +"w. c #46D346", +"e. c #4BD54B", +"r. c #50D850", +"t. c #C79500", +"y. c #D5AB00", +"u. c #DBBD22", +"i. c #DDC028", +"p. c #DEC22C", +"a. c #E0C432", +"s. c #E2C637", +"d. c #E3C83C", +"f. c #8E8559", +"g. c #948B5F", +"h. c #BFAF4F", +"j. c #948C62", +"k. c #A79F7B", +"l. c #B0A66F", +"z. c #CDBF73", +"x. c #D7C249", +"c. c #DAC654", +"v. c #E0C742", +"b. c #E5CA42", +"n. c #E1C845", +"m. c #E1C846", +"M. c #E8CF42", +"N. c #E9D34F", +"B. c #E4CD50", +"V. c #E7D05A", +"C. c #ECD658", +"Z. c #D5C776", +"A. c #E6D162", +"S. c #E9D361", +"D. c #EDDC7F", +/* pixels */ +"+ y.X i x x x x z z j j h h d d ", +" k.D.F W ( / ^ ~ ! Q E R Y I s ", +" u g.S.q G T U L J N M n b P s ", +" y 9 f.V.0 C L J N M n v c H p ", +" Z.C.c.D B.6 5 < , - - & $ 4 ", +" z.e N.8 A M.b.d.s.a.p.i.u.x.V ", +" l.h.x.A m.< : - * & # O o , ", +" t 7 A m.3 o.4.2.1.-.*.%.$.8.} ", +" r A m.3 O.3.:.;.=.&.#.@.+.,.` ", +" j.A.w 0.r.e.w.q.9.7.6.5.,.>.) ", +" t. @ X. . .| } } [ ] ` ` ) ] " +}; diff --git a/src/pixmaps/flags_xpm/wales.xpm b/src/pixmaps/flags_xpm/wales.xpm new file mode 100644 index 00000000..3cba665c --- /dev/null +++ b/src/pixmaps/flags_xpm/wales.xpm @@ -0,0 +1,179 @@ +/* XPM */ +static const char *wales[] = { +/* columns rows colors chars-per-pixel */ +"16 11 162 2", +" c #002500", +". c #002F00", +"X c #003100", +"o c #003300", +"O c #003500", +"+ c #003700", +"@ c #003900", +"# c #003F00", +"$ c #004100", +"% c #004700", +"& c #004D00", +"* c #005100", +"= c #005700", +"- c #005D00", +"; c #006100", +": c #006700", +"> c #006D00", +", c #006F00", +"< c #007500", +"1 c #007900", +"2 c #037F00", +"3 c #7B711F", +"4 c #F41F1F", +"5 c #CD2725", +"6 c #CC2C25", +"7 c #C3382B", +"8 c #C63B2A", +"9 c #CD3737", +"0 c #DB3736", +"q c #D93C37", +"w c #DA3C36", +"e c #D13C3D", +"r c #D13F3C", +"t c #EC242C", +"y c #F62A3B", +"u c #A3411B", +"i c #BE412F", +"p c #9E6B39", +"a c #B3663E", +"s c #C54E38", +"d c #D5413B", +"f c #D2443C", +"g c #DD3F42", +"h c #E53D44", +"j c #F43A4A", +"k c #9E7440", +"l c #B56948", +"z c #BA6A49", +"x c #CE4142", +"c c #C04B4B", +"v c #CF4A49", +"b c #D54242", +"n c #DB4740", +"m c #D84840", +"M c #DA5145", +"N c #D1544B", +"B c #D5554A", +"V c #DF574D", +"C c #D5594E", +"Z c #C95B51", +"A c #D25151", +"S c #D25551", +"D c #DE5454", +"F c #E34146", +"G c #E74B4F", +"H c #E3504F", +"J c #E05D58", +"K c #D1665E", +"L c #D86559", +"P c #C7755D", +"I c #ED5864", +"U c #DB7474", +"Y c #D97972", +"T c #E26D65", +"R c #F3626D", +"E c #098300", +"W c #3CA118", +"Q c #3FA521", +"! c #459F1C", +"~ c #41A21C", +"^ c #568E22", +"/ c #4A9C20", +"( c #738C2E", +") c #7F8D3A", +"_ c #7A9537", +"` c #46A727", +"' c #59AB32", +"] c #5CA939", +"[ c #5FA938", +"{ c #4ABD3F", +"} c #61AB37", +"| c #60A93A", +" . c #65AE3D", +".. c #7A9541", +"X. c #68AE43", +"o. c #6FB24B", +"O. c #76B851", +"+. c #7AB957", +"@. c #7BBB57", +"#. c #7EBB5C", +"$. c #7FBE5C", +"%. c #948747", +"&. c #9E8F4D", +"*. c #E1827B", +"=. c #89C269", +"-. c #8CC36D", +";. c #8FC671", +":. c #93C875", +">. c #95C97A", +",. c #A2B794", +"<. c #E68682", +"1. c #E28E86", +"2. c #F4849A", +"3. c #E99991", +"4. c #E3A6A1", +"5. c #EBB3AD", +"6. c #E9B3AF", +"7. c #E3BBB7", +"8. c #E7BBB7", +"9. c #EDB8B4", +"0. c #E7BCBB", +"q. c #AED19E", +"w. c #CDCDCD", +"e. c gray81", +"r. c gray82", +"t. c #D5D5D5", +"y. c #D7D7D7", +"u. c #D7DBD9", +"i. c gray85", +"p. c gray86", +"a. c gray87", +"s. c #EEC4C1", +"d. c #E8CAC8", +"f. c #EACCC8", +"g. c #EBCCC9", +"h. c #EED0CB", +"j. c #EDDDDC", +"k. c #EEDFDD", +"l. c #F2D9D8", +"z. c #DEEEDD", +"x. c #EFE0DE", +"c. c #E1F2DC", +"v. c gray88", +"b. c #E1E1E1", +"n. c #E3E0E0", +"m. c gray89", +"M. c #E5E5E7", +"N. c #E7E7E7", +"B. c #E7F6E7", +"V. c #EEF6F6", +"C. c gray96", +"Z. c #F7F6F6", +"A. c gray97", +"S. c #FAF8F7", +"D. c #F8F8F8", +"F. c #FCFCFB", +"G. c gray99", +"H. c #FDFDFD", +"J. c #FDFEFE", +"K. c #FEFEFE", +"L. c #FEFFFE", +"P. c gray100", +/* pixels */ +"N.N.N.N.N.M.j.b.m.b.b.a.u.u.u.y.", +"N.L.L.l.3.U d.J.J.1.6.s.x.A.C.y.", +"N.L.8.4.K D 9.L.N b e 9 C.L g.r.", +"N.F.7.L.d.A S.6.x C 0 j.0.7 k.e.", +"N.L.J L.<.c h.*.f 0 Y V.6 2.C.e.", +"q.c.R B.N S n d M q n T H %.z.,.", +"E >.$.v G V h h f s t 4 ^ Q X.+ ", +"2 :.+.&.z j a ) y ( ` 3 5 ! ' + ", +"1 ;.O.{ p _ .| i 7 / ~ u W [ X ", +"< -.-.I P #.+.Z l o...g p ] [ ", +", , : ; ; - * & % $ $ @ + X . . " +}; diff --git a/src/pixmaps/flags_xpm/wf.xpm b/src/pixmaps/flags_xpm/wf.xpm new file mode 100644 index 00000000..87292520 --- /dev/null +++ b/src/pixmaps/flags_xpm/wf.xpm @@ -0,0 +1,154 @@ +/* XPM */ +static const char *wf[] = { +/* columns rows colors chars-per-pixel */ +"16 11 137 2", +" c #670000", +". c #6D0000", +"X c #6F0000", +"o c #730000", +"O c #750000", +"+ c #770000", +"@ c #7B0000", +"# c #7F0000", +"$ c #810000", +"% c #850000", +"& c #890000", +"* c #8D0000", +"= c #8F0000", +"- c #930000", +"; c #950000", +": c #970000", +"> c #9B0000", +", c #9F0000", +"< c #A10000", +"1 c #A30000", +"2 c #A50000", +"3 c #A70000", +"4 c #AB0000", +"5 c #AD0000", +"6 c #AF0000", +"7 c #B70B0B", +"8 c #B70F0E", +"9 c #B81313", +"0 c #BA1919", +"q c #BE1E1E", +"w c #BD2525", +"e c #C02323", +"r c #C22727", +"t c #C32929", +"y c #C32A2A", +"u c #C02C2C", +"i c #C12F2F", +"p c #C22E2E", +"a c #C32F2F", +"s c #C42C2C", +"d c #C52E2E", +"f c #C52F2F", +"g c #C23232", +"h c #C33232", +"j c #C53131", +"k c #C33535", +"l c #C33636", +"z c #C73434", +"x c #C73535", +"c c #C53636", +"v c #C53737", +"b c #C33B3B", +"n c #C53939", +"m c #C73A3A", +"M c #C73B3B", +"N c #C73D3C", +"B c #C73D3D", +"V c #C73F3F", +"C c #C93A3A", +"Z c #C93B3A", +"A c #C93B3B", +"S c #C83B3C", +"D c #C93C3D", +"F c #CB3F3F", +"G c #CB4040", +"H c #C84242", +"J c #CA4343", +"K c #CC4141", +"L c #CC4142", +"P c #CC4242", +"I c #CA4444", +"U c #CA4646", +"Y c #CD4444", +"T c #CD4545", +"R c #CE4747", +"E c #CC4949", +"W c #CF4949", +"Q c #CF4A49", +"! c #CC4B4B", +"~ c #CD4E4E", +"^ c #CE4E4E", +"/ c #D14341", +"( c #D14E4E", +") c #D14F4F", +"_ c #D14F50", +"` c #CE5050", +"' c #CE5151", +"] c #CF5353", +"[ c #D05353", +"{ c #D05454", +"} c #D05455", +"| c #D35454", +" . c #D25757", +".. c #D25858", +"X. c #D45959", +"o. c #D35C5C", +"O. c #D35D5D", +"+. c #D46060", +"@. c #D56162", +"#. c #D66565", +"$. c #D76666", +"%. c #D86969", +"&. c #D86A6A", +"*. c #D96F6E", +"=. c #DA6F6F", +"-. c #D97474", +";. c #DD7777", +":. c #000093", +">. c #000095", +",. c #7676D1", +"<. c #7979D3", +"1. c #7B7BD3", +"2. c #DD8989", +"3. c #DA8C8C", +"4. c #DA8E8E", +"5. c #DF8D8E", +"6. c #E09090", +"7. c #E29293", +"8. c #E19494", +"9. c #E29595", +"0. c #E39696", +"q. c #E49898", +"w. c #E2AEAE", +"e. c #E3AFAF", +"r. c #E4AEAE", +"t. c #E9A9A9", +"y. c #E9ABAB", +"u. c #E5B1B1", +"i. c #E5BEBE", +"p. c #EDCBCB", +"a. c #EECDCD", +"s. c #EFD8D8", +"d. c #F3F3F3", +"f. c gray97", +"g. c #FDFDFD", +"h. c #FEFEFE", +"j. c gray100", +/* pixels */ +">.>.j.j.6 4 W 6 4 3 1 , > : - : ", +">.1.j.j.;.-.t.*.&.$.+.o. .` ` % ", +">.1.j.j...| q.) T P F l f f E % ", +">.,.g.j.| ` 0.W G ` a.f.s.B I # ", +":.,.j.j.^ [ 0.G S p.G u.M e.B # ", +"/ t.0.7.6.5.2.C l f.e.r 4.d.b @ ", +"6 =.) W T F C x a s.M 3.a i.l + ", +"4 &.W T F C z f y M e.d.i.w g o ", +"3 $.Y F M x f y e q 0 9 8 9 g X ", +", @.o...{ ^ ^ E G B n l g w w ", +"3 > : - = = % % # @ + + o X X + " +}; diff --git a/src/pixmaps/flags_xpm/ws.xpm b/src/pixmaps/flags_xpm/ws.xpm new file mode 100644 index 00000000..cfebf28b --- /dev/null +++ b/src/pixmaps/flags_xpm/ws.xpm @@ -0,0 +1,149 @@ +/* XPM */ +static const char *ws[] = { +/* columns rows colors chars-per-pixel */ +"16 11 132 2", +" c #000023", +". c #00002B", +"X c #000031", +"o c #000033", +"O c #000037", +"+ c #000039", +"@ c #00003B", +"# c #41367F", +"$ c #DD0000", +"% c #DF0000", +"& c #E10000", +"* c #E30000", +"= c #E50000", +"- c #E70000", +"; c #E90000", +": c #EB0000", +"> c #ED0000", +", c #EF0000", +"< c #F10000", +"1 c #F30000", +"2 c #F50000", +"3 c #F70000", +"4 c #F90000", +"5 c #FB0000", +"6 c #FD0000", +"7 c #F10B0B", +"8 c #F10F0E", +"9 c #F21010", +"0 c #F21313", +"q c #F21414", +"w c #F31919", +"e c #F31A1A", +"r c #F41E1E", +"t c #F41F1F", +"y c #F42020", +"u c #F52323", +"i c #F52424", +"p c #F52525", +"a c #F52626", +"s c #F62929", +"d c #F62A2A", +"f c #F62B2B", +"g c #F22C2C", +"h c #F22F2F", +"j c #F62C2C", +"k c #F72E2E", +"l c #F72F2F", +"z c #F23232", +"x c #F33232", +"c c #F73030", +"v c #F73131", +"b c #F33535", +"n c #F43636", +"m c #F83434", +"M c #F83535", +"N c #F83636", +"B c #F83736", +"V c #F83737", +"C c #F43939", +"Z c #F43B3B", +"A c #F53D3D", +"S c #F53F3F", +"D c #F93A3A", +"F c #F93B3A", +"G c #F93C3C", +"H c #F93C3D", +"J c #FA3F3F", +"K c #F64242", +"L c #F64444", +"P c #F74646", +"I c #FA4040", +"U c #FA4242", +"Y c #FA4444", +"T c #FB4545", +"R c #F74949", +"E c #F74B4B", +"W c #F74E4E", +"Q c #FB4949", +"! c #FB4A49", +"~ c #FC4F4F", +"^ c #F85050", +"/ c #F85353", +"( c #F95455", +") c #F95757", +"_ c #F95858", +"` c #FA5C5C", +"' c #FA5D5D", +"] c #FB6060", +"[ c #FB6162", +"{ c #FC6565", +"} c #FC6666", +"| c #FC6A6A", +" . c #FD6F6F", +".. c #463B82", +"X. c #473B83", +"o. c #4B4086", +"O. c #4C4186", +"+. c #4C4188", +"@. c #50468A", +"#. c #51478A", +"$. c #52478B", +"%. c #554A8D", +"&. c #574C8E", +"*. c #464694", +"=. c #4B4B93", +"-. c #4B4B94", +";. c #515195", +":. c #5E5393", +">. c #58589B", +",. c #5A5A9C", +"<. c #6363A1", +"1. c #6969A4", +"2. c #7269A1", +"3. c #756DA3", +"4. c #786FA5", +"5. c #7171A9", +"6. c #7A72A8", +"7. c #7979AE", +"8. c #7B7BAE", +"9. c #7A7AAF", +"0. c #7B7BAF", +"q. c #7676B0", +"w. c #8B8BB9", +"e. c #8C8CB9", +"r. c #9C9CC3", +"t. c #9C9DC3", +"y. c #9BA3CA", +"u. c #ABABCB", +"i. c #AEB5D4", +"p. c #BBBBD6", +"a. c #BEBED6", +"s. c #D0D1E2", +/* pixels */ +"@ @ @ @ @ X X . 5 3 3 < < , , ", +"@ 0.t.s.e.a.w.3.2.{ ] ' ) / W ; ", +"@ 0.p.1.<.r.;.&.#.I H V l l R ; ", +"O 0.0.,.u.5.=.#.+.H V v f a L - ", +"O q.>.i.y.=.*.O.X.n c f a y S - ", +"X 6.:.4.&.+.O...# c f a r e Z - ", +"6 .~ Q T I F M l d i r e q b & ", +"5 | Q T I F M l d i r e q 9 x % ", +"5 } T H F v l f u r q q 9 7 h % ", +"3 ] ' _ ( / R L I S Z b x h h % ", +"< < , , , , ; ; - - & & % $ $ $ " +}; diff --git a/src/pixmaps/flags_xpm/ye.xpm b/src/pixmaps/flags_xpm/ye.xpm new file mode 100644 index 00000000..301b559e --- /dev/null +++ b/src/pixmaps/flags_xpm/ye.xpm @@ -0,0 +1,136 @@ +/* XPM */ +static const char *ye[] = { +/* columns rows colors chars-per-pixel */ +"16 11 119 2", +" c black", +". c #161616", +"X c gray10", +"o c #1E1E1E", +"O c #222323", +"+ c #282828", +"@ c #2D2D2D", +"# c #333232", +"$ c gray21", +"% c #373737", +"& c gray22", +"* c gray23", +"= c gray24", +"- c #3F3F3F", +"; c #424141", +": c #434343", +"> c #464646", +", c #484848", +"< c gray29", +"1 c gray30", +"2 c gray31", +"3 c #535353", +"4 c #585758", +"5 c gray36", +"6 c #606060", +"7 c #656565", +"8 c #69696A", +"9 c gray43", +"0 c #D50000", +"q c #D70000", +"w c #D90000", +"e c #DB0000", +"r c #DF0000", +"t c #E10000", +"y c #E30000", +"u c #E50000", +"i c #E70000", +"p c #E90000", +"a c #EB0000", +"s c #ED0000", +"d c #EF0000", +"f c #EC3C2C", +"g c #ED4131", +"h c #EF4637", +"j c #F04C3D", +"k c #E74D4D", +"l c #EE5749", +"z c #EF5C4E", +"x c #F15042", +"c c #F25547", +"v c #F3594C", +"b c #F45D51", +"n c #F06053", +"m c #F46254", +"M c #F26557", +"N c #F56659", +"B c #F2695C", +"V c #F6695C", +"C c #F66C5F", +"Z c #F36D60", +"A c #F47165", +"S c #F57569", +"D c #F6786D", +"F c #F67B71", +"G c #F77F74", +"H c #81817F", +"J c #F78177", +"K c #F78479", +"L c #F8857A", +"P c #F8857B", +"I c gray61", +"U c gray62", +"Y c gray63", +"T c #A2A2A2", +"R c #A5A5A5", +"E c gray66", +"W c #A9A9A9", +"Q c gray67", +"! c #AEAEAE", +"~ c gray69", +"^ c gray70", +"/ c gray71", +"( c gray72", +") c #FF8D8D", +"_ c #F5A7A7", +"` c #F6A9A9", +"' c #F7ADAC", +"] c #F8AFAF", +"[ c #F6B3B3", +"{ c #F9B2B2", +"} c #FAB3B4", +"| c #FBB6B6", +" . c #FCB9B9", +".. c #FDBBBB", +"X. c #FDBDBD", +"o. c #FEBFBF", +"O. c #C5C5C5", +"+. c LightGray", +"@. c #D5D5D5", +"#. c #D7D7D7", +"$. c #FEC0C0", +"%. c #FECCCC", +"&. c #F1F1F1", +"*. c gray95", +"=. c #F3F3F3", +"-. c #F4F4F4", +";. c #F4F5F5", +":. c gray96", +">. c #F6F6F6", +",. c gray97", +"<. c #F8F8F8", +"1. c #F9F9F9", +"2. c gray98", +"3. c #FBFBFB", +"4. c #FBFCFB", +"5. c gray99", +"6. c #FDFCFD", +"7. c #FDFDFD", +"8. c #FEFEFE", +/* pixels */ +"d d d d d a a a i i i t t r e e ", +"d P P K J G F D S A Z B M n z 0 ", +"d P C V N m b v c x j h g f l 0 ", +") %.$.o.o. . .} } } ' ' ` _ [ k ", +":.8.8.7.7.3.3.3.3.<.<.:.:.-.:.#.", +"=.8.7.7.7.3.3.<.:.<.:.:.:.=.-.#.", +"=.8.7.4.3.3.<.<.<.:.;.-.=.=.-.+.", +"9 +.( / ^ ~ ! Q Q R Y Y U I W $ ", +" 9 2 , ; - & # @ + O o X . * ", +" 8 7 6 5 4 3 2 , > ; - * $ $ ", +" " +}; diff --git a/src/pixmaps/flags_xpm/yt.xpm b/src/pixmaps/flags_xpm/yt.xpm new file mode 100644 index 00000000..a98e47e2 --- /dev/null +++ b/src/pixmaps/flags_xpm/yt.xpm @@ -0,0 +1,150 @@ +/* XPM */ +static const char *yt[] = { +/* columns rows colors chars-per-pixel */ +"16 11 133 2", +" c #D83B29", +". c #D93E2A", +"X c #D53E34", +"o c #DA422F", +"O c #D54137", +"+ c #D64239", +"@ c #DE4D3D", +"# c #DB5347", +"$ c #4C42A9", +"% c #4747B1", +"& c #4B4FB5", +"* c #4B4DB6", +"= c #625AB3", +"- c #6264BE", +"; c #AEACAD", +": c #B5B2B2", +"> c #B5B4B5", +", c #B6B5B6", +"< c #BBB8B8", +"1 c #BBBABB", +"2 c #E29295", +"3 c #E09899", +"4 c #E5989A", +"5 c #C0BDBA", +"6 c #E6ADAE", +"7 c #FAB1B1", +"8 c #FEB3B3", +"9 c #FDBFBF", +"0 c #FEBEBE", +"q c #B5B7D6", +"w c #B2B5DA", +"e c #B4B6DB", +"r c #C7C5C4", +"t c #C6C5C5", +"y c #C7C7C6", +"u c #C9C7C8", +"i c #CBC9C9", +"p c #CDCAC9", +"a c #CCCACA", +"s c #CECDCD", +"d c #CFCDCD", +"f c gray81", +"g c gray82", +"h c #D2D1D1", +"j c #D3D1D1", +"k c LightGray", +"l c #D5D5D5", +"z c #D7D5D5", +"x c #D7D7D7", +"c c #D9D7D7", +"v c gray86", +"b c gainsboro", +"n c #DDDDDD", +"m c #DFDFDF", +"M c #FBC1C1", +"N c #FCC3C3", +"B c #FDC6C6", +"V c #E1E1DF", +"C c #C4C7E1", +"Z c #DBD8EA", +"A c #DBD9EA", +"S c #E1E2E2", +"D c #E1E3E3", +"F c #E6E0E1", +"G c #E6E3E2", +"H c #E4E4E4", +"J c gray90", +"K c #E7E6E7", +"L c #E7E7E7", +"P c #EDE3E3", +"I c #E8E7E7", +"U c #EBE7E7", +"Y c #EFE5E5", +"T c #E9E8E6", +"R c #E6EAEA", +"E c gray91", +"W c #E9E9E9", +"Q c #EAE9E9", +"! c #E9EBE9", +"~ c #E9E9EB", +"^ c gray92", +"/ c #ECE8E9", +"( c #EDEBEB", +") c #EEEAEA", +"_ c #EFEBEB", +"` c #EBEBED", +"' c gray93", +"] c #EEEEEE", +"[ c #EFEFEF", +"{ c #F1E9E9", +"} c #F1EFEF", +"| c #F3EFEF", +" . c #FEE8E8", +".. c #F9EEEE", +"X. c #EFEFF0", +"o. c #F3EFF1", +"O. c #EBF0F0", +"+. c #EEF0F0", +"@. c #EFF0F0", +"#. c #EFF1F1", +"$. c gray94", +"%. c #F1F1F1", +"&. c #F2F1F2", +"*. c gray95", +"=. c #F2F3F3", +"-. c #F3F3F3", +";. c #F5F1F1", +":. c #F5F3F3", +">. c #F4F4F4", +",. c #F4F4F5", +"<. c gray96", +"1. c #F6F6F6", +"2. c #F7F6F6", +"3. c #F7F7F6", +"4. c gray97", +"5. c #F8F0F0", +"6. c #F9F6F6", +"7. c #FBF6F6", +"8. c #FDF7F7", +"9. c #FEF7F7", +"0. c #FDF8F7", +"q. c #F8F8F8", +"w. c #FAF9F8", +"e. c #F8FBFB", +"r. c gray98", +"t. c #FBFBFB", +"y. c #FCF9F8", +"u. c gray99", +"i. c #FDFDFD", +"p. c #FEFCFC", +"a. c #FEFDFD", +"s. c #FEFEFE", +"d. c gray100", +/* pixels */ +"<.<.<.:.:.o.| { ) Y P U W L L S ", +"<.d.d. .8 0 0 B N N 0 7 ..q.<.m ", +"-.d.d.p.3.0.8.p.8.r.6.:.<.<.<.m ", +"<.d.d.[ ' r.C e w q :.R L <.<.v ", +"<.d.b a a %.- * & % ` 5 < y <.x ", +"-.d.h } <.[ = Z A $ W T L < <.l ", +"[ d.a t 3.-.# O X + W W : , -.k ", +"-.r.r.t -.) @ o . F S ; [ -.k ", +"[ d.<.u <.( 6 4 2 3 S U , U @.f ", +"^ t.r.L L q.,.@.@.@.-.m m [ -.f ", +"W W L H S m x l h h i d h f d f " +}; diff --git a/src/pixmaps/flags_xpm/za.xpm b/src/pixmaps/flags_xpm/za.xpm new file mode 100644 index 00000000..b034fa48 --- /dev/null +++ b/src/pixmaps/flags_xpm/za.xpm @@ -0,0 +1,185 @@ +/* XPM */ +static const char *za[] = { +/* columns rows colors chars-per-pixel */ +"16 11 168 2", +" c black", +". c #002D00", +"X c #003900", +"o c #004500", +"O c #006500", +"+ c #006900", +"@ c #535353", +"# c #6F6F6F", +"$ c #727273", +"% c #767676", +"& c #E90000", +"* c #EB0000", +"= c #ED0000", +"- c #EF0000", +"; c #F10000", +": c #F30000", +"> c #F50000", +", c #F70000", +"< c #F90000", +"1 c #FB0000", +"2 c #FD0000", +"3 c #F32727", +"4 c #F62C2C", +"5 c #F73131", +"6 c #F83737", +"7 c #F93C3D", +"8 c #FA4242", +"9 c #FB4747", +"0 c #F74949", +"q c #F74E4E", +"w c #F85353", +"e c #F95757", +"r c #FA5C5C", +"t c #E7696B", +"y c #FB6060", +"u c #FC6565", +"i c #FC676B", +"p c #FC6969", +"a c #FD6D6D", +"s c #FD7072", +"d c #00850F", +"f c #008513", +"g c #1A9534", +"h c #179D3B", +"j c #1F9838", +"k c #259A3D", +"l c #2A9D42", +"z c #29A14C", +"x c #30A048", +"c c #36A34D", +"v c #2EA350", +"b c #32A555", +"n c #3BA451", +"m c #34A758", +"M c #37A859", +"N c #37AA5A", +"B c #3AA859", +"V c #39A85C", +"C c #3BAB5C", +"Z c #3BAB5D", +"A c #3CAB5E", +"S c #3FAF5F", +"D c #3FAA60", +"F c #3EAB61", +"G c #72BA5D", +"H c #40AE60", +"J c #40AE64", +"K c #43AE65", +"L c #43AF67", +"P c #47AE65", +"I c #43B065", +"U c #46B165", +"Y c #48B169", +"T c #4BB36D", +"R c #52B362", +"E c #53B564", +"W c #50B36F", +"Q c #51B46D", +"! c #58B76C", +"~ c #4BBF77", +"^ c #54B776", +"/ c #5DB777", +"( c #5CB979", +") c #6EBC60", +"_ c #73BB67", +"` c #6DBF72", +"' c #66BE7B", +"] c #61BD7F", +"[ c #5CC07E", +"{ c #9F8300", +"} c #B39B00", +"| c #81C300", +" . c #9DCD00", +".. c #8D8D56", +"X. c #999555", +"o. c #A29E5E", +"O. c #84BB5A", +"+. c #BEB670", +"@. c #DCD454", +"#. c #E9DB55", +"$. c #E2DB5E", +"%. c #E6E356", +"&. c #C9C17E", +"*. c #EAE868", +"=. c #E5EC74", +"-. c #000081", +";. c #000083", +":. c #000087", +">. c #000089", +",. c #00008B", +"<. c #00008F", +"1. c #000091", +"2. c #000093", +"3. c #000099", +"4. c #00009B", +"5. c #00009D", +"6. c #0000B5", +"7. c #0B0BC0", +"8. c #0F0FC2", +"9. c #1313C4", +"0. c #1819C6", +"q. c #1E1EC7", +"w. c #2323C9", +"e. c #2F2FC9", +"r. c #2C2CCA", +"t. c #2F2FCA", +"y. c #3232CC", +"u. c #3535CD", +"i. c #3939CF", +"p. c #3B38D2", +"a. c #3D3DD0", +"s. c #4242D2", +"d. c #4646D2", +"f. c #514FD8", +"g. c #635FCB", +"h. c #77C98C", +"j. c #7BC690", +"k. c #7BC894", +"l. c #F8A1A0", +"z. c #F9ABAC", +"x. c #F5B5B6", +"c. c #F6B7B8", +"v. c #F7BABA", +"b. c #F8BCBD", +"n. c #F9BEBF", +"m. c #92D8AB", +"M. c #ADDCB9", +"N. c #E9F287", +"B. c #888BDD", +"V. c #95ADCB", +"C. c #8581E4", +"Z. c #B0AEE6", +"A. c #B3B0E8", +"S. c #B5B2E9", +"D. c #B7B4EA", +"F. c #BAB7EB", +"G. c #BCB9EA", +"H. c #F6BEC0", +"J. c #D9D1CB", +"K. c #FAC9CA", +"L. c #C4E5D5", +"P. c #CDE3DB", +"I. c #CDE4D8", +"U. c #D3EBDF", +"Y. c #C4C3EE", +"T. c #D8E6E3", +"R. c #E8EBE4", +"E. c #E4EEE8", +/* pixels */ +"f d ~ J.3 1 1 2 1 1 > > : : = = ", +"| k.j.m.E.z.s a p u y r e w q * ", +"} N.' ( [ T.l.i 9 8 7 6 5 4 0 * ", +" &.*.` ^ W L.R.K.n.n.v.c.x.n.t ", +" % o.$._ ! U U T Y J F N m W o ", +" $ @ ..#.G J C c x l k j g n . ", +" # X.@.O.R C N H A N b v z P X ", +" +.%.) J B I.T.Y.F.D.S.A.Z.G.g.", +"{ =.E D S M.B.p.w.q.0.9.8.7.t.;.", +" .] / h.P.C.f.d.s.a.i.u.y.t.r.;.", +"+ O h V.6.4.4.4.2.2.<.,.:.:.;.:." +}; diff --git a/src/pixmaps/flags_xpm/zm.xpm b/src/pixmaps/flags_xpm/zm.xpm new file mode 100644 index 00000000..3233e7ec --- /dev/null +++ b/src/pixmaps/flags_xpm/zm.xpm @@ -0,0 +1,161 @@ +/* XPM */ +static const char *zm[] = { +/* columns rows colors chars-per-pixel */ +"16 11 144 2", +" c black", +". c #100F0B", +"X c #151410", +"o c #1A1914", +"O c #1F1D1A", +"+ c #240F0E", +"@ c #291414", +"# c #2E1919", +"$ c #331F1F", +"% c #112700", +"& c #003300", +"* c #003900", +"= c #003B00", +"- c #003D00", +"; c #232320", +": c #372525", +"> c #34332F", +", c #3E3432", +"< c #004100", +"1 c #004700", +"2 c #004D00", +"3 c #005300", +"4 c #005900", +"5 c #005D00", +"6 c #006300", +"7 c #006900", +"8 c #006D00", +"9 c #006F00", +"0 c #007300", +"q c #007500", +"w c #007700", +"e c #007900", +"r c #007B00", +"t c #007D00", +"y c #007F00", +"u c #037F03", +"i c #C50000", +"p c #CF0000", +"a c #D70000", +"s c #DD0000", +"d c #DF0000", +"f c #E30000", +"g c #E50000", +"h c #E70000", +"j c #ED1313", +"k c #EE1919", +"l c #EF1F1F", +"z c #E4241C", +"x c #E62922", +"c c #E72F28", +"v c #F12525", +"b c #F52B2B", +"n c #E9342E", +"m c #EF3535", +"M c #EB3A33", +"N c #E8423C", +"B c #EB7E35", +"V c #ED7F37", +"C c #038103", +"Z c #499F49", +"A c #4DA14D", +"S c #4EA24E", +"D c #50A250", +"F c #52A452", +"G c #53A553", +"H c #54A554", +"J c #56A656", +"K c #57A757", +"L c #57A857", +"P c #58A858", +"I c #59A859", +"U c #5BA95B", +"Y c #5BAA5B", +"T c #5CAA5C", +"R c #5DAB5D", +"E c #5EAB5D", +"W c #5EAB5E", +"Q c #5EAE5D", +"! c #59B466", +"~ c #60AC60", +"^ c #60AD60", +"/ c #61AD61", +"( c #62AC62", +") c #62AE62", +"_ c #64AF64", +"` c #65AF64", +"' c #65AE65", +"] c #68AF68", +"[ c #78AE68", +"{ c #65B065", +"} c #66B065", +"| c #67B067", +" . c #67B167", +".. c #69B069", +"X. c #69B169", +"o. c #69B269", +"O. c #6AB26A", +"+. c #6AB36A", +"@. c #6BB36C", +"#. c #6DB26D", +"$. c #6DB46D", +"%. c #6DB56D", +"&. c #6EB56E", +"*. c #6EB66E", +"=. c #6FB66F", +"-. c #71B471", +";. c #71B771", +":. c #72B772", +">. c #73B772", +",. c #75B775", +"<. c #76B976", +"1. c #76BA76", +"2. c #79B979", +"3. c #79BC79", +"4. c #79BC7A", +"5. c #7ABC7A", +"6. c #7CBD7C", +"7. c #7DBC7D", +"8. c #7CBE7C", +"9. c #7FBF7F", +"0. c #ED833B", +"q. c #ED853F", +"w. c #E78C3F", +"e. c #E88839", +"r. c #9CB075", +"t. c #DD9F5B", +"y. c #EE8843", +"u. c #F18A47", +"i. c #E89957", +"p. c #E3A25F", +"a. c #E8A465", +"s. c #80BE80", +"d. c #84C084", +"f. c #87C287", +"g. c #88C388", +"h. c #8AC38A", +"j. c #8BC48B", +"k. c #8DC58D", +"l. c #8EC68F", +"z. c #8FC78F", +"x. c #91C891", +"c. c #94C894", +"v. c #94C994", +"b. c #95CA95", +/* pixels */ +"C C C C C u w w 0 8 7 6 5 4 3 2 ", +"C b.b.b.v.x.j.h.h.s.r.a.p.t.i.% ", +"C v.9.5.5.<.;.;.@.o.! Q w.e.[ - ", +"u c.9.5.<.>.%.+.{ / W Y K D ] - ", +"u z.5.<.;.%.o.{ / T M b : ; y.h ", +"e z.<.;.=.o.{ / W Y n v $ O y.h ", +"w j.;.%.o.' / T L G c l # o q.f ", +"0 f.%.o.' / Y K G S x k @ X 0.s ", +"8 s.] ' W Y K G A Z z j + . V s ", +"7 s.7.2.,.-.#.] ' ~ N m , > V s ", +"7 5 5 3 2 1 < - * & i a p s " +}; diff --git a/src/pixmaps/flags_xpm/zw.xpm b/src/pixmaps/flags_xpm/zw.xpm new file mode 100644 index 00000000..0c84bed8 --- /dev/null +++ b/src/pixmaps/flags_xpm/zw.xpm @@ -0,0 +1,183 @@ +/* XPM */ +static const char *zw[] = { +/* columns rows colors chars-per-pixel */ +"16 11 166 2", +" c black", +". c #000100", +"X c #001F00", +"o c gray10", +"O c gray12", +"+ c #002100", +"@ c #002500", +"# c #002900", +"$ c #002B00", +"% c #002D00", +"& c #003300", +"* c #003700", +"= c #003900", +"- c #003D00", +"; c #252525", +": c #2A2B2B", +"> c gray19", +", c gray21", +"< c gray23", +"1 c #5F0000", +"2 c #004100", +"3 c #004700", +"4 c #004D00", +"5 c #005300", +"6 c #005900", +"7 c #005D00", +"8 c #005F00", +"9 c #006300", +"0 c #006900", +"q c #006D00", +"w c #006F00", +"e c #007300", +"r c #007500", +"t c #007900", +"y c #007D00", +"u c #007F00", +"i c #404242", +"p c #890000", +"a c #AD0000", +"s c #B90000", +"d c #B02F20", +"f c #B33425", +"g c #B5392B", +"h c #B83F30", +"j c #C53614", +"k c #C73A19", +"l c #C93F1F", +"z c #D73C10", +"x c #BB4436", +"c c #BC493C", +"v c #BB4C3F", +"b c #D84014", +"n c #D94419", +"m c #DB491F", +"M c #CA4324", +"N c #CC482A", +"B c #CE4D2F", +"V c #DD4E24", +"C c #DE5826", +"Z c #DE522A", +"A c #CD5236", +"S c #D05235", +"D c #DD5832", +"F c #D3573A", +"G c #DD5A3A", +"H c #E0552F", +"J c #E05C2B", +"K c #E15B34", +"L c #E16131", +"P c #E36536", +"I c #E4693C", +"U c #9C5C56", +"Y c #BE4E41", +"T c #A15746", +"R c #96634E", +"E c #A4775D", +"W c #C15346", +"Q c #E56D42", +"! c #E26F44", +"~ c #E77247", +"^ c #E8764B", +"/ c #E67551", +"( c #008100", +") c #008500", +"_ c #059300", +"` c #86C331", +"' c #87C434", +"] c #8AC637", +"[ c #8CC73B", +"{ c #8EC83F", +"} c #DFDD00", +"| c #E9E900", +" . c #F1F00B", +".. c #F1F10E", +"X. c #F2F113", +"o. c #F3F219", +"O. c #F4F31E", +"+. c #F5F423", +"@. c #F6F529", +"#. c #F2F12F", +"$. c #F6F62C", +"%. c #F7F72E", +"&. c #F7F731", +"*. c #F8F834", +"=. c #F8F837", +"-. c #F9F43A", +";. c #F9F93D", +":. c #A7A54B", +">. c #8AA962", +",. c #95B37E", +"<. c #B9B762", +"1. c #F2BD5E", +"2. c #E7876F", +"3. c #ED9379", +"4. c #EE977D", +"5. c #EE977E", +"6. c #90CB42", +"7. c #94CD46", +"8. c #97CE4B", +"9. c #94D24E", +"0. c #99D050", +"q. c #98D353", +"w. c #9CD154", +"e. c #9BD557", +"r. c #9FD359", +"t. c #9ED75C", +"y. c #A2D45D", +"u. c #A1D860", +"i. c #A4DA65", +"p. c #A7DC69", +"a. c #A9DD6D", +"s. c #ABDE71", +"d. c #ADDF74", +"f. c #AFE077", +"g. c #B2E179", +"h. c #FAFA42", +"j. c #FBFB47", +"k. c #F7F749", +"l. c #FCFB4F", +"z. c #FCFC4C", +"x. c #FDFD51", +"c. c #FDFC53", +"v. c #FDFD54", +"b. c #FEFD58", +"n. c #FEFC59", +"m. c #F1A28C", +"M. c #F1A690", +"N. c #F2B9A9", +"B. c #F7D68F", +"V. c #FEFD84", +"C. c #EDC5BD", +"Z. c #D7E1D7", +"A. c #E1E7E1", +"S. c #EFEFEF", +"D. c #F1ECE8", +"F. c #F1EFF1", +"G. c #EFF2F0", +"H. c #F5F4F0", +"J. c #F4F3F4", +"K. c #F5F3F5", +"L. c gray96", +"P. c gray97", +"I. c #FAFAF9", +"U. c #FCFCFB", +"Y. c #FFFAFC", +"T. c gray99", +/* pixels */ +"Z.* ) ( u u r r r q 0 9 7 6 5 6 ", +"K.T.,.g.f.d.s.a.p.i.u.t.e.q.9._ ", +"L.Y.U.<.b.v.c.z.j.h.;.=.&.$.k.| ", +"L.V.M.U.E / ^ ~ Q I P L J C ! s ", +"2.B.b.4.3.U W Y c x h g f d v 1 ", +"C.m.c.l.N.L.i < , > : ; O o < ", +"F.4.l.1.L.T F S B N M l k j A p ", +"S.U.I.D.R G K H Z V m n b z D a ", +"S.T.H.:.-.*.%.@.+.O.o.X... .#.} ", +"L.G.>.y.y.w.q.8.7.6.{ [ ] ' ` q ", +"A. 7 5 4 3 2 - = & % # @ + + # " +}; diff --git a/src/pixmaps/mule_Tr_grey.ico.xpm b/src/pixmaps/mule_Tr_grey.ico.xpm new file mode 100644 index 00000000..0575f785 --- /dev/null +++ b/src/pixmaps/mule_Tr_grey.ico.xpm @@ -0,0 +1,49 @@ +/* XPM */ +static const char *mule_Tr_grey_ico[] = { +/* columns rows colors chars-per-pixel */ +"16 16 27 1", +" c None", +". c gray9", +"X c #363636", +"o c #3b3b3b", +"O c #424242", +"+ c #525252", +"@ c #5d5d5d", +"# c #646464", +"$ c #6d6d6d", +"% c #737373", +"& c gray49", +"* c #838383", +"= c #898989", +"- c #949494", +"; c #9c9c9c", +": c #a4a4a4", +"> c #a8a8a8", +", c #b4b4b4", +"< c #b9b9b9", +"1 c #c4c4c4", +"2 c gray79", +"3 c #d5d5d5", +"4 c #dfdfdf", +"5 c #e4e4e4", +"6 c gray92", +"7 c white", +"8 c None", +/* pixels */ +"8888o88888888888", +"888oo88888888888", +"88oo+8ooooooo888", +"88o*+o42,-%o8888", +"8o+$o4,:*oo88888", +"8o@-,:#oo8888888", +"8o=*$@o888888888", +"oo**o<*+o8888888", +"8o-*<7 %%XXX8888", +"oo;>>6O=:371X888", +"8o,4,:&=-$.7X888", +"oO>,,;*%:1:6X888", +"oO$;;=%$,546o888", +"o+ooooo%:>:X8888", +"o@%$+o8XXXX88888", +"o#==#o8888888888" +}; diff --git a/src/pixmaps/mule_Tr_grey_big.ico.xpm b/src/pixmaps/mule_Tr_grey_big.ico.xpm new file mode 100644 index 00000000..174d9762 --- /dev/null +++ b/src/pixmaps/mule_Tr_grey_big.ico.xpm @@ -0,0 +1,131 @@ +/* XPM */ +static const char * mule_Tr_grey_big_ico_xpm[] = { +"22 22 106 2", +" c #ff0000", +". c #3B3B3B", +"+ c #3E3E3E", +"@ c #3D3D3D", +"# c #4C4C4C", +"$ c #3F3F3F", +"% c #3C3C3C", +"& c #717171", +"* c #5D5D5D", +"= c #464646", +"- c #787878", +"; c #C5C5C5", +"> c #B5B5B5", +", c #A6A6A6", +"' c #8F8F8F", +") c #777777", +"! c #565656", +"~ c #6E6E6E", +"{ c #505050", +"] c #7E7E7E", +"^ c #B6B6B6", +"/ c #BCBCBC", +"( c #ACACAC", +"_ c #949494", +": c #636363", +"< c #4F4F4F", +"[ c #484848", +"} c #404040", +"| c #595959", +"1 c #7D7D7D", +"2 c #7F7F7F", +"3 c #A2A2A2", +"4 c #A9A9A9", +"5 c #818181", +"6 c #696969", +"7 c #5C5C5C", +"8 c #444444", +"9 c #6F6F6F", +"0 c #898989", +"a c #959595", +"b c #737373", +"c c #494949", +"d c #878787", +"e c #848484", +"f c #6B6B6B", +"g c #838383", +"h c #575757", +"i c #888888", +"j c #A8A8A8", +"k c #535353", +"l c #414141", +"m c #4B4B4B", +"n c #929292", +"o c #858585", +"p c #D8D8D8", +"q c #F4F4F4", +"r c #707070", +"s c #363636", +"t c #4D4D4D", +"u c #9A9A9A", +"v c #9F9F9F", +"w c #D1D1D1", +"x c #555555", +"y c #979797", +"z c #AAAAAA", +"A c #C3C3C3", +"B c #BBBBBB", +"C c #ABABAB", +"D c #B7B7B7", +"E c #B9B9B9", +"F c #9C9C9C", +"G c #8A8A8A", +"H c #999999", +"I c #A7A7A7", +"J c #B4B4B4", +"K c #AFAFAF", +"L c #C8C8C8", +"M c #939393", +"N c #808080", +"O c #969696", +"P c #9E9E9E", +"Q c #BEBEBE", +"R c #525252", +"S c #989898", +"T c #ADADAD", +"U c #A1A1A1", +"V c #8D8D8D", +"W c #7B7B7B", +"X c #767676", +"Y c #A4A4A4", +"Z c #BFBFBF", +"` c #CDCDCD", +" . c #373737", +".. c #4A4A4A", +"+. c #676767", +"@. c #868686", +"#. c #6C6C6C", +"$. c #D2D2D2", +"%. c #D9D9D9", +"&. c #D5D5D5", +"*. c #434343", +"=. c #4E4E4E", +"-. c #646464", +";. c #545454", +">. c #424242", +",. c #686868", +" ", +" ", +" ", +" . ", +" . ", +" . + ", +" . @ # $ $ + + @ % . . ", +" @ & * = - ; > , ' ) ! . ", +" $ # ~ { ] ^ / ( _ : < [ ", +" } | 1 2 3 4 5 6 7 [ ", +" 8 9 0 a ' b { . . ", +" . c d e f f : # ", +". . c e g h i j ) k l ", +" m n o 3 p q r 9 8 s s s ", +". . t u v j w ^ x o y z A B 0 s ", +" . { C ; D E F ~ G H y 5 I J s ", +" @ k K L B 4 M N 5 H O ~ P Q s ", +". @ R S z T U V W X Y ; Z ` D . ", +". + ..+.G ' @.) #.b T $.%.&.C . ", +". *.=.% @ + @ @ c ) U j I X . ", +". = * 6 -.;.*.. >...m m [ ", +". [ +.5 N ,.m . "}; diff --git a/src/pixmaps/mule_Tr_yellow.ico.xpm b/src/pixmaps/mule_Tr_yellow.ico.xpm new file mode 100644 index 00000000..61449caa --- /dev/null +++ b/src/pixmaps/mule_Tr_yellow.ico.xpm @@ -0,0 +1,70 @@ +/* XPM */ +static const char * mule_Tr_yellow_ico[] = { +"16 16 51 1", +" c None", +". c #624E09", +"+ c #7F6F12", +"@ c #BAAB2D", +"# c #EAF1AE", +"$ c #E7E88F", +"% c #DEDA6D", +"& c #CDBE40", +"* c #AB9D26", +"= c #7E6B13", +"- c #A49323", +"; c #D5CA54", +"> c #8C7B19", +", c #94821D", +"' c #C6B731", +") c #A69625", +"! c #85721A", +"~ c #5C4E0D", +"{ c #DDD37C", +"] c #B3A650", +"^ c #7F6C16", +"/ c #CABB39", +"( c #DED585", +"_ c #FFFFFF", +": c #9608F9", +"< c #928A47", +"[ c #A5952A", +"} c #32373D", +"| c #D1C64A", +"1 c #D8D05B", +"2 c #EAEAE9", +"3 c #403F40", +"4 c #C1B238", +"5 c #CBC74E", +"6 c #E5E5BA", +"7 c #C3C4C1", +"8 c #B3A22C", +"9 c #BEB231", +"0 c #C0BA57", +"a c #6B6C6E", +"b c #161613", +"c c #6D5C0C", +"d c #C0BB7F", +"e c #9F9F9E", +"f c #C4C39F", +"g c #E3E4E1", +"h c #727475", +"i c #A8A9A6", +"j c #A3A4A1", +"k c #C0B42D", +"l c #99891E", +" . ", +" .. ", +" ..+ ....... ", +" .@+.#$%&*. ", +" .=-.#%;@.. ", +" .>&%;,.. ", +" .'@)!. ", +"..@@~{]^. ", +" ./@(_:<[}}} ", +"..|1123456_7} ", +" .%#%1890ab_} ", +".c1%%|8)d7e2} ", +".c)||'*)fggg} ", +".+.....heij} ", +".>*-=. }}}} ", +".>k@l. "}; diff --git a/src/pixmaps/mule_Tr_yellow_big.ico.xpm b/src/pixmaps/mule_Tr_yellow_big.ico.xpm new file mode 100644 index 00000000..5e1e08e5 --- /dev/null +++ b/src/pixmaps/mule_Tr_yellow_big.ico.xpm @@ -0,0 +1,191 @@ +/* XPM */ +static const char * mule_Tr_yellow_big_ico_xpm[] = { +"22 22 166 2", +" c #ff0000", +". c #624E09", +"+ c #66520A", +"@ c #64500A", +"# c #776610", +"$ c #66520D", +"% c #65520C", +"& c #65510B", +"* c #634F09", +"= c #A49424", +"- c #8D7D18", +"; c #705E0D", +"> c #958B46", +", c #D7DA92", +"' c #D5D37B", +") c #CEC962", +"! c #C2B542", +"~ c #AD9E2B", +"{ c #857417", +"] c #67530B", +"^ c #776411", +"/ c #A39323", +"( c #7D6B13", +"_ c #9B924B", +": c #CFCE7F", +"< c #E0DD79", +"[ c #D8D162", +"} c #C6BB42", +"| c #918022", +"1 c #7B6914", +"2 c #736110", +"3 c #69550B", +"4 c #877517", +"5 c #B4A42F", +"6 c #ACA03C", +"7 c #C5BF61", +"8 c #CEC865", +"9 c #AEA13C", +"0 c #948429", +"a c #8A791A", +"b c #725F10", +"c c #6E5B0E", +"d c #A49423", +"e c #C1B236", +"f c #C7BD4A", +"g c #BEB246", +"h c #A0902D", +"i c #7B6813", +"j c #746110", +"k c #C3B430", +"l c #BBAC2D", +"m c #9F9023", +"n c #978729", +"o c #8B7A28", +"p c #76631A", +"q c #BBAC2E", +"r c #BAAB2D", +"s c #7F701D", +"t c #A99E54", +"u c #CDBE76", +"v c #A58F4D", +"w c #7F6C19", +"x c #69560D", +"y c #756212", +"z c #C8B938", +"A c #BCAD2E", +"B c #CCC165", +"C c #EAE6BE", +"D c #D5A0F1", +"E c #9630C4", +"F c #928841", +"G c #9F8F2A", +"H c #4E4D38", +"I c #32373D", +"J c #766414", +"K c #CFC346", +"L c #D1C74F", +"M c #D7CE5F", +"N c #E5E2B1", +"O c #B2A4BB", +"P c #6B4E60", +"Q c #B7AA3C", +"R c #C1BA45", +"S c #BCBC88", +"T c #C7C8BC", +"U c #BABBBC", +"V c #86898A", +"W c #786619", +"X c #D9D360", +"Y c #E2E287", +"Z c #DEDA71", +"` c #DED87F", +" . c #BCB56D", +".. c #938834", +"+. c #C0B336", +"@. c #C4BE51", +"#. c #A5A47F", +"$. c #82827B", +"%. c #A6A7A5", +"&. c #B3B5B5", +"*. c #65510A", +"=. c #7C6C1B", +"-. c #DCD666", +";. c #E3E48B", +">. c #E0DE77", +",. c #D9D25F", +"'. c #C7BB44", +"). c #B3A32C", +"!. c #B4A730", +"~. c #BFB964", +"{. c #9D9D89", +"]. c #6C6D6B", +"^. c #9C9C9B", +"/. c #BDBEC0", +"(. c #66530A", +"_. c #7E6E18", +":. c #CAC04C", +"<. c #D8D160", +"[. c #DAD463", +"}. c #D3CA51", +"|. c #C2B539", +"1. c #AE9E29", +"2. c #A8992D", +"3. c #BFBA80", +"4. c #CAC9BB", +"5. c #BDBDBB", +"6. c #CBCBC9", +"7. c #B3B5B6", +"8. c #67540A", +"9. c #786711", +"0. c #9E8E22", +"a. c #BDB13D", +"b. c #C2B641", +"c. c #BDAF35", +"d. c #B0A028", +"e. c #A19225", +"f. c #A29538", +"g. c #BDBB96", +"h. c #D5D5CB", +"i. c #DBDCD9", +"j. c #D4D5D3", +"k. c #A4A6A6", +"l. c #6C590C", +"m. c #7A6910", +"n. c #685923", +"o. c #777876", +"p. c #9C9D9B", +"q. c #A7A8A5", +"r. c #737677", +"s. c #373C41", +"t. c #705D0E", +"u. c #8D7D19", +"v. c #9D8E21", +"w. c #99871F", +"x. c #826F15", +"y. c #6C590D", +"z. c #3E4348", +"A. c #454A4E", +"B. c #474C50", +"C. c #474B50", +"D. c #44484D", +"E. c #94841C", +"F. c #B9AC2B", +"G. c #B3A42A", +"H. c #9A891F", +"I. c #766411", +" ", +" ", +" ", +" . ", +" . ", +" . + ", +" . @ # $ % % & @ * . . ", +" @ = - ; > , ' ) ! ~ { . ", +" ] ^ / ( _ : < [ } | 1 2 ", +" 3 4 5 6 7 8 9 0 a b ", +" c d e f g h i . . ", +" . j k l m n o p ", +". . b q r s t u v w x ", +" y z A B C D E F G H I I I ", +". . J K L M N O P Q R S T U V I ", +" . W X Y Z ` ...+.@.#.$.%.&.I ", +" *.=.-.;.>.,.'.).!.~.{.].^./.I ", +". (._.:.<.[.}.|.1.2.3.4.5.6.7.I ", +". 8.9.0.a.b.c.d.e.f.g.h.i.j.k.I ", +". l.m.@ & & *.@ n.o.p.q.q.r.s. ", +". t.u.v.w.x.y.. z.A.B.C.D. ", +". t.E.F.G.H.I.. "}; diff --git a/src/pixmaps/mule_TrayIcon.ico.xpm b/src/pixmaps/mule_TrayIcon.ico.xpm new file mode 100644 index 00000000..2fe0801d --- /dev/null +++ b/src/pixmaps/mule_TrayIcon.ico.xpm @@ -0,0 +1,73 @@ +/* XPM */ +static const char *mule_TrayIcon_ico[] = { +/* columns rows colors chars-per-pixel */ +"16 16 51 1", +" c None", +". c #171614", +"X c #32373e", +"o c #5d2d0e", +"O c #642909", +"+ c #6e310c", +"@ c #7f3e13", +"# c #414041", +"$ c #6b6c6f", +"% c #727476", +"& c #803f12", +"* c #804017", +"= c #86451b", +"- c #8e4a19", +"; c #954f1d", +": c #9a531e", +"> c #a55c23", +", c #a85e25", +"< c #a7602a", +"1 c #ac6226", +"2 c #b4682c", +"3 c #bc6d2d", +"4 c #bf7732", +"5 c #936a48", +"6 c #b47b50", +"7 c #c1742d", +"8 c #c77631", +"9 c #c27739", +"0 c #cb7c39", +"q c #ce8240", +"w c #c18c57", +"e c #cc914e", +"r c #d28a4a", +"t c #d69455", +"y c #d99a5c", +"u c #dfaa6e", +"i c #deaa7d", +"p c #a0a09e", +"a c #a4a5a2", +"s c #aaaaa6", +"d c #c1a080", +"f c #c5b39f", +"g c #dfae85", +"h c #e9c38f", +"j c #e6d2ba", +"k c #f2dcaf", +"l c #c5c5c1", +"z c #e5e5e2", +"x c #ebebea", +"c c white", +"v c None", +/* pixels */ +"vvvvOvvvvvvvvvvv", +"vvvOOvvvvvvvvvvv", +"vvOO&vOOOOOOOvvv", +"vvO3&Okhuq1Ovvvv", +"vO@>Okut3OOvvvvv", +"vO-qut;OOvvvvvvv", +"vO83,=Ovvvvvvvvv", +"OO33oi6*Ovvvvvvv", +"vO03gc 5@OvXXXXvvvvv", +"O-73:Ovvvvvvvvvv" +}; diff --git a/src/pixmaps/mule_TrayIcon_big.ico.xpm b/src/pixmaps/mule_TrayIcon_big.ico.xpm new file mode 100644 index 00000000..351c5a69 --- /dev/null +++ b/src/pixmaps/mule_TrayIcon_big.ico.xpm @@ -0,0 +1,194 @@ +/* XPM */ +static const char * mule_TrayIcon_big_ico_xpm[] = { +"22 22 169 2", +" c #ff0000", +". c #642909", +"+ c #682C0A", +"@ c #662B0A", +"# c #793910", +"$ c #682E0D", +"% c #672D0C", +"& c #672C0C", +"* c #672C0B", +"= c #652A09", +"- c #A65C24", +"; c #8E4A18", +"> c #72340D", +", c #996C47", +"' c #DDBF93", +") c #D7AD7B", +"! c #D09B63", +"~ c #C47F42", +"{ c #AE652B", +"] c #874417", +"^ c #692D0B", +"/ c #793911", +"( c #A55C23", +"_ c #7F3E13", +": c #9F724B", +"< c #D4AF80", +"[ c #E2B37A", +"} c #DA9F63", +"| c #C88143", +"1 c #935122", +"2 c #7D3D14", +"3 c #753610", +"4 c #6B2E0B", +"5 c #894617", +"6 c #B56B2F", +"7 c #AE703D", +"8 c #C89662", +"9 c #D19C66", +"0 c #AF703C", +"a c #96572A", +"b c #8C491B", +"c c #743510", +"d c #70320E", +"e c #C27636", +"f c #C9874A", +"g c #BF7F47", +"h c #A2602E", +"i c #7D3C13", +"j c #763710", +"k c #C47430", +"l c #BD6E2D", +"m c #A15A23", +"n c #99582A", +"o c #8D5029", +"p c #783D1A", +"q c #743610", +"r c #BD6E2E", +"s c #BC6D2D", +"t c #80471E", +"u c #AA7A55", +"v c #D09D73", +"w c #A76D43", +"x c #80421A", +"y c #6B2F0D", +"z c #773812", +"A c #C97A38", +"B c #BE6F2E", +"C c #CE9465", +"D c #EBD2BF", +"E c #F9F2ED", +"F c #936642", +"G c #A05D2A", +"H c #4E4038", +"I c #32373E", +"J c #783A14", +"K c #D08746", +"L c #D28E4F", +"M c #D89A60", +"N c #E6CCB2", +"O c #B6B5B5", +"P c #634F40", +"Q c #B8753D", +"R c #C28445", +"S c #BDA488", +"T c #C7C2BD", +"U c #BBBCBC", +"V c #888A8A", +"W c #7A3E19", +"X c #DA9E61", +"Y c #E6BD88", +"Z c #E0AC72", +"` c #DFB080", +" . c #BD936E", +".. c #946034", +"+. c #C17937", +"@. c #C58C51", +"#. c #A5937F", +"$. c #83807C", +"%. c #A7A7A5", +"&. c #B3B5B6", +"*. c #7E421B", +"=. c #DDA467", +"-. c #E8C18C", +";. c #E2B278", +">. c #DA9D60", +",. c #C88244", +"'. c #B4692C", +"). c #B66F31", +"!. c #C09265", +"~. c #9E948A", +"{. c #6D6D6C", +"]. c #9D9C9B", +"^. c #BDBFC0", +"/. c #672C0A", +"(. c #7F4118", +"_. c #CB894D", +":. c #D99E60", +"<. c #DBA164", +"[. c #D49151", +"}. c #C37839", +"|. c #AF6429", +"1. c #AA642D", +"2. c #C0A081", +"3. c #CBC5BB", +"4. c #BEBEBC", +"5. c #CCCCCA", +"6. c #B4B6B7", +"7. c #793A11", +"8. c #A05822", +"9. c #BF783D", +"0. c #C47D41", +"a. c #BE7435", +"b. c #B16528", +"c. c #A25C25", +"d. c #A36738", +"e. c #BEAA96", +"f. c #D6D3CC", +"g. c #DDDDDA", +"h. c #D6D6D4", +"i. c #A5A7A7", +"j. c #6D300C", +"k. c #7B3B10", +"l. c #662A0A", +"m. c #672B0B", +"n. c #672B0A", +"o. c #693C23", +"p. c #777777", +"q. c #9D9D9B", +"r. c #A9A9A5", +"s. c #A8A9A5", +"t. c #747778", +"u. c #373C42", +"v. c #71340E", +"w. c #8F4B19", +"x. c #9F5721", +"y. c #9A531F", +"z. c #834115", +"A. c #6E310D", +"B. c #3E4349", +"C. c #464A4F", +"D. c #484C51", +"E. c #474C51", +"F. c #44494E", +"G. c #72340E", +"H. c #96511C", +"I. c #BA6E2B", +"J. c #B5682A", +"K. c #9B541F", +"L. c #783911", +" ", +" ", +" ", +" . ", +" . ", +" . + ", +" . @ # $ % & * @ = . . ", +" @ - ; > , ' ) ! ~ { ] . ", +" ^ / ( _ : < [ } | 1 2 3 ", +" 4 5 6 7 8 9 0 a b c ", +" d ( e f g h i . . ", +" . j k l m n o p ", +". . q r s t u v w x y ", +" z A B C D E F G H I I I ", +". . J K L M N O P Q R S T U V I ", +" . W X Y Z ` ...+.@.#.$.%.&.I ", +" @ *.=.-.;.>.,.'.).!.~.{.].^.I ", +". /.(._.:.<.[.}.|.1.2.3.4.5.6.I ", +". + 7.8.9.0.a.b.c.d.e.f.g.h.i.I ", +". j.k.l.m.* n.@ o.p.q.r.s.t.u. ", +". v.w.x.y.z.A.. B.C.D.E.F. ", +". G.H.I.J.K.L.. "}; diff --git a/src/pixmaps/sort_dn.xpm b/src/pixmaps/sort_dn.xpm new file mode 100644 index 00000000..4c082b32 --- /dev/null +++ b/src/pixmaps/sort_dn.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static const char * sort_dn_xpm[] = { +"16 16 3 1", +" c None", +". c #808080", +"+ c #FFFFFF", +" ", +" ", +" ", +" ", +" ............+ ", +" . + ", +" . + ", +" . + ", +" . + ", +" . + ", +" + ", +" ", +" ", +" ", +" ", +" "}; diff --git a/src/pixmaps/sort_dnx2.xpm b/src/pixmaps/sort_dnx2.xpm new file mode 100644 index 00000000..89509d19 --- /dev/null +++ b/src/pixmaps/sort_dnx2.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static const char * sort_dnx2_xpm[] = { +"16 16 3 1", +" c None", +". c #808080", +"+ c #FFFFFF", +" ", +" ", +" .++++++++++++ ", +" . + ", +" . + ", +" . + ", +" . + ", +" .+++++ ++++++ ", +" . + ", +" . + ", +" . + ", +" . + ", +" . + ", +" . ", +" ", +" "}; diff --git a/src/pixmaps/sort_up.xpm b/src/pixmaps/sort_up.xpm new file mode 100644 index 00000000..3bd1557c --- /dev/null +++ b/src/pixmaps/sort_up.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static const char * sort_up_xpm[] = { +"16 16 3 1", +" c None", +". c #808080", +"+ c #FFFFFF", +" ", +" ", +" ", +" ", +" . ", +" . + ", +" . + ", +" . + ", +" . + ", +" . + ", +" .++++++++++++ ", +" ", +" ", +" ", +" ", +" "}; diff --git a/src/pixmaps/sort_upx2.xpm b/src/pixmaps/sort_upx2.xpm new file mode 100644 index 00000000..a9040928 --- /dev/null +++ b/src/pixmaps/sort_upx2.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static const char * sort_upx2_xpm[] = { +"16 16 3 1", +" c None", +". c #808080", +"+ c #FFFFFF", +" ", +" ", +" . ", +" . + ", +" . + ", +" . + ", +" . + ", +" . + ", +" .+++++ ++++++ ", +" . + ", +" . + ", +" . + ", +" . + ", +" .++++++++++++ ", +" ", +" "}; diff --git a/src/remote-gui.net/AboutBox.Designer.cs b/src/remote-gui.net/AboutBox.Designer.cs new file mode 100755 index 00000000..7730f8a1 --- /dev/null +++ b/src/remote-gui.net/AboutBox.Designer.cs @@ -0,0 +1,186 @@ +namespace amule.net { + partial class AboutBox { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if ( disposing && (components != null) ) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutBox)); + this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); + this.logoPictureBox = new System.Windows.Forms.PictureBox(); + this.labelProductName = new System.Windows.Forms.Label(); + this.labelVersion = new System.Windows.Forms.Label(); + this.labelCopyright = new System.Windows.Forms.Label(); + this.labelCompanyName = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.textBoxDescription = new System.Windows.Forms.TextBox(); + this.tableLayoutPanel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit(); + this.SuspendLayout(); + // + // tableLayoutPanel + // + this.tableLayoutPanel.AutoSize = true; + this.tableLayoutPanel.ColumnCount = 2; + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F)); + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F)); + this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0); + this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0); + this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1); + this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2); + this.tableLayoutPanel.Controls.Add(this.labelCompanyName, 1, 3); + this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4); + this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5); + this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel.Location = new System.Drawing.Point(9, 9); + this.tableLayoutPanel.Name = "tableLayoutPanel"; + this.tableLayoutPanel.RowCount = 6; + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel.Size = new System.Drawing.Size(461, 265); + this.tableLayoutPanel.TabIndex = 0; + // + // logoPictureBox + // + this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.logoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("logoPictureBox.Image"))); + this.logoPictureBox.Location = new System.Drawing.Point(3, 3); + this.logoPictureBox.Name = "logoPictureBox"; + this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6); + this.logoPictureBox.Size = new System.Drawing.Size(146, 259); + this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.logoPictureBox.TabIndex = 12; + this.logoPictureBox.TabStop = false; + // + // labelProductName + // + this.labelProductName.AutoSize = true; + this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelProductName.Location = new System.Drawing.Point(158, 0); + this.labelProductName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); + this.labelProductName.MaximumSize = new System.Drawing.Size(0, 17); + this.labelProductName.Name = "labelProductName"; + this.labelProductName.Size = new System.Drawing.Size(300, 17); + this.labelProductName.TabIndex = 19; + this.labelProductName.Text = "aMule remote control"; + this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // labelVersion + // + this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelVersion.Location = new System.Drawing.Point(158, 26); + this.labelVersion.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); + this.labelVersion.MaximumSize = new System.Drawing.Size(0, 17); + this.labelVersion.Name = "labelVersion"; + this.labelVersion.Size = new System.Drawing.Size(300, 17); + this.labelVersion.TabIndex = 0; + this.labelVersion.Text = "Version 0.0.1"; + this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // labelCopyright + // + this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelCopyright.Location = new System.Drawing.Point(158, 52); + this.labelCopyright.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); + this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 17); + this.labelCopyright.Name = "labelCopyright"; + this.labelCopyright.Size = new System.Drawing.Size(300, 17); + this.labelCopyright.TabIndex = 21; + this.labelCopyright.Text = "Copyright (c) 2007-2008 aMule Team"; + this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // labelCompanyName + // + this.labelCompanyName.AutoSize = true; + this.labelCompanyName.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelCompanyName.Location = new System.Drawing.Point(158, 78); + this.labelCompanyName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); + this.labelCompanyName.MaximumSize = new System.Drawing.Size(0, 17); + this.labelCompanyName.Name = "labelCompanyName"; + this.labelCompanyName.Size = new System.Drawing.Size(300, 17); + this.labelCompanyName.TabIndex = 22; + this.labelCompanyName.Text = "Copyright (c) 2007-2008 Froenchenko Lenid l(froen@gmail.com)"; + this.labelCompanyName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // okButton + // + this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.okButton.Location = new System.Drawing.Point(383, 239); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(75, 23); + this.okButton.TabIndex = 24; + this.okButton.Text = "&OK"; + // + // textBoxDescription + // + this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBoxDescription.Location = new System.Drawing.Point(158, 107); + this.textBoxDescription.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3); + this.textBoxDescription.Multiline = true; + this.textBoxDescription.Name = "textBoxDescription"; + this.textBoxDescription.ReadOnly = true; + this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.textBoxDescription.Size = new System.Drawing.Size(300, 126); + this.textBoxDescription.TabIndex = 23; + this.textBoxDescription.TabStop = false; + this.textBoxDescription.Text = "Description"; + // + // AboutBox + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(479, 283); + this.Controls.Add(this.tableLayoutPanel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AboutBox"; + this.Padding = new System.Windows.Forms.Padding(9); + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "About amule.net"; + this.tableLayoutPanel.ResumeLayout(false); + this.tableLayoutPanel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel; + private System.Windows.Forms.PictureBox logoPictureBox; + private System.Windows.Forms.Label labelProductName; + private System.Windows.Forms.Label labelVersion; + private System.Windows.Forms.Label labelCopyright; + private System.Windows.Forms.Label labelCompanyName; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.TextBox textBoxDescription; + } +} diff --git a/src/remote-gui.net/AboutBox.cs b/src/remote-gui.net/AboutBox.cs new file mode 100755 index 00000000..a11f2cfd --- /dev/null +++ b/src/remote-gui.net/AboutBox.cs @@ -0,0 +1,112 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using System.Reflection; + +namespace amule.net { + partial class AboutBox : Form { + public AboutBox() + { + InitializeComponent(); + + // Initialize the AboutBox to display the product information from the assembly information. + // Change assembly information settings for your application through either: + // - Project->Properties->Application->Assembly Information + // - AssemblyInfo.cs + this.Text = String.Format("About {0}", AssemblyTitle); + this.labelProductName.Text = AssemblyProduct; + this.labelVersion.Text = String.Format("Version {0}", AssemblyVersion); + this.labelCopyright.Text = AssemblyCopyright; + this.labelCompanyName.Text = AssemblyCompany; + this.textBoxDescription.Text = AssemblyDescription; + } + + #region Assembly Attribute Accessors + + public string AssemblyTitle + { + get + { + // Get all Title attributes on this assembly + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false); + // If there is at least one Title attribute + if ( attributes.Length > 0 ) { + // Select the first one + AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0]; + // If it is not an empty string, return it + if ( titleAttribute.Title != "" ) + return titleAttribute.Title; + } + // If there was no Title attribute, or if the Title attribute was the empty string, return the .exe name + return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase); + } + } + + public string AssemblyVersion + { + get + { + return Assembly.GetExecutingAssembly().GetName().Version.ToString(); + } + } + + public string AssemblyDescription + { + get + { + // Get all Description attributes on this assembly + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false); + // If there aren't any Description attributes, return an empty string + if ( attributes.Length == 0 ) + return ""; + // If there is a Description attribute, return its value + return ((AssemblyDescriptionAttribute)attributes[0]).Description; + } + } + + public string AssemblyProduct + { + get + { + // Get all Product attributes on this assembly + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false); + // If there aren't any Product attributes, return an empty string + if ( attributes.Length == 0 ) + return ""; + // If there is a Product attribute, return its value + return ((AssemblyProductAttribute)attributes[0]).Product; + } + } + + public string AssemblyCopyright + { + get + { + // Get all Copyright attributes on this assembly + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false); + // If there aren't any Copyright attributes, return an empty string + if ( attributes.Length == 0 ) + return ""; + // If there is a Copyright attribute, return its value + return ((AssemblyCopyrightAttribute)attributes[0]).Copyright; + } + } + + public string AssemblyCompany + { + get + { + // Get all Company attributes on this assembly + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false); + // If there aren't any Company attributes, return an empty string + if ( attributes.Length == 0 ) + return ""; + // If there is a Company attribute, return its value + return ((AssemblyCompanyAttribute)attributes[0]).Company; + } + } + #endregion + } +} diff --git a/src/remote-gui.net/AboutBox.resx b/src/remote-gui.net/AboutBox.resx new file mode 100755 index 00000000..3df4dcb6 --- /dev/null +++ b/src/remote-gui.net/AboutBox.resx @@ -0,0 +1,610 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + AZ+4Ui+mkTlKAAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/src/remote-gui.net/AddLinkDialog.Designer.cs b/src/remote-gui.net/AddLinkDialog.Designer.cs new file mode 100644 index 00000000..238d0a1b --- /dev/null +++ b/src/remote-gui.net/AddLinkDialog.Designer.cs @@ -0,0 +1,81 @@ +namespace amule.net { + partial class AddLinkDialog { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if ( disposing && (components != null) ) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonOK = new System.Windows.Forms.Button(); + this.textBoxLink = new System.Windows.Forms.TextBox(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // buttonOK + // + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.Location = new System.Drawing.Point(223, 69); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 0; + this.buttonOK.Text = "O&K"; + this.buttonOK.UseVisualStyleBackColor = true; + // + // textBoxLink + // + this.textBoxLink.Location = new System.Drawing.Point(12, 28); + this.textBoxLink.Name = "textBoxLink"; + this.textBoxLink.Size = new System.Drawing.Size(612, 20); + this.textBoxLink.TabIndex = 1; + // + // buttonCancel + // + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(321, 69); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 2; + this.buttonCancel.Text = "&Cancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // AddLinkDialog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(636, 118); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.textBoxLink); + this.Controls.Add(this.buttonOK); + this.Name = "AddLinkDialog"; + this.Text = "Add ed2k link"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + public System.Windows.Forms.TextBox textBoxLink; + } +} \ No newline at end of file diff --git a/src/remote-gui.net/AddLinkDialog.cs b/src/remote-gui.net/AddLinkDialog.cs new file mode 100644 index 00000000..94daaaf2 --- /dev/null +++ b/src/remote-gui.net/AddLinkDialog.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace amule.net { + public partial class AddLinkDialog : Form { + public AddLinkDialog() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/src/remote-gui.net/AddLinkDialog.resx b/src/remote-gui.net/AddLinkDialog.resx new file mode 100644 index 00000000..ff31a6db --- /dev/null +++ b/src/remote-gui.net/AddLinkDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/remote-gui.net/ConnectDlg.Designer.cs b/src/remote-gui.net/ConnectDlg.Designer.cs new file mode 100644 index 00000000..8406a135 --- /dev/null +++ b/src/remote-gui.net/ConnectDlg.Designer.cs @@ -0,0 +1,154 @@ +namespace amule.net +{ + partial class ConnectDlg + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonConnect = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.amuleHost = new System.Windows.Forms.TextBox(); + this.amulePwd = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.amulePort = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // buttonConnect + // + this.buttonConnect.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonConnect.Location = new System.Drawing.Point(66, 190); + this.buttonConnect.Name = "buttonConnect"; + this.buttonConnect.Size = new System.Drawing.Size(128, 50); + this.buttonConnect.TabIndex = 0; + this.buttonConnect.Text = "&Connect"; + this.buttonConnect.UseVisualStyleBackColor = true; + // + // buttonCancel + // + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(238, 190); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(128, 50); + this.buttonCancel.TabIndex = 1; + this.buttonCancel.Text = "Cancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(60, 46); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(59, 13); + this.label1.TabIndex = 2; + this.label1.Text = "aMule host"; + // + // amuleHost + // + this.amuleHost.Location = new System.Drawing.Point(139, 43); + this.amuleHost.Name = "amuleHost"; + this.amuleHost.Size = new System.Drawing.Size(112, 20); + this.amuleHost.TabIndex = 3; + this.amuleHost.Text = "leox"; + // + // amulePwd + // + this.amulePwd.Location = new System.Drawing.Point(139, 106); + this.amulePwd.Name = "amulePwd"; + this.amulePwd.PasswordChar = '*'; + this.amulePwd.Size = new System.Drawing.Size(112, 20); + this.amulePwd.TabIndex = 5; + this.amulePwd.Text = "123456"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(60, 109); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(53, 13); + this.label2.TabIndex = 4; + this.label2.Text = "Password"; + // + // amulePort + // + this.amulePort.Location = new System.Drawing.Point(296, 43); + this.amulePort.MaxLength = 5; + this.amulePort.Name = "amulePort"; + this.amulePort.Size = new System.Drawing.Size(66, 20); + this.amulePort.TabIndex = 7; + this.amulePort.Text = "4712"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(265, 46); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(25, 13); + this.label3.TabIndex = 6; + this.label3.Text = "port"; + // + // ConnectDlg + // + this.AcceptButton = this.buttonConnect; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.buttonCancel; + this.ClientSize = new System.Drawing.Size(432, 272); + this.ControlBox = false; + this.Controls.Add(this.amulePort); + this.Controls.Add(this.label3); + this.Controls.Add(this.amulePwd); + this.Controls.Add(this.label2); + this.Controls.Add(this.amuleHost); + this.Controls.Add(this.label1); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonConnect); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.Name = "ConnectDlg"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Connect to aMule core"; + this.Load += new System.EventHandler(this.ConnectDlg_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonConnect; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox amuleHost; + private System.Windows.Forms.TextBox amulePwd; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox amulePort; + private System.Windows.Forms.Label label3; + + } +} + diff --git a/src/remote-gui.net/ConnectDlg.cs b/src/remote-gui.net/ConnectDlg.cs new file mode 100644 index 00000000..5ee93d9a --- /dev/null +++ b/src/remote-gui.net/ConnectDlg.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace amule.net +{ + public partial class ConnectDlg : Form + { + public ConnectDlg() + { + InitializeComponent(); + } + + private void ConnectDlg_Load(object sender, EventArgs e) + { + + } + public string Host() + { + return amuleHost.Text; + } + public string Pass() + { + return amulePwd.Text; + } + public string Port() + { + return amulePort.Text; + } + } +} \ No newline at end of file diff --git a/src/remote-gui.net/ConnectDlg.resx b/src/remote-gui.net/ConnectDlg.resx new file mode 100644 index 00000000..a764f1c7 --- /dev/null +++ b/src/remote-gui.net/ConnectDlg.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + \ No newline at end of file diff --git a/src/remote-gui.net/DownloadControl.cs b/src/remote-gui.net/DownloadControl.cs new file mode 100755 index 00000000..bffd4732 --- /dev/null +++ b/src/remote-gui.net/DownloadControl.cs @@ -0,0 +1,597 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003-2008 lfroen ( lfroen@gmail.com / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Configuration; + +namespace amule.net { + + [SettingsGroupNameAttribute("XferControl")] + public class amuleXferControlSettings : ApplicationSettingsBase { + [UserScopedSetting()] + [DefaultSettingValueAttribute("true")] + public bool FilenameVisible + { + get { return (bool)this["FilenameVisible"]; } + set { this["FilenameVisible"] = value; } + } + [UserScopedSetting()] + [DefaultSettingValueAttribute("200")] + public int FilenameWidth + { + get { return (int)this["FilenameWidth"]; } + set { this["FilenameWidth"] = value; } + } + + [UserScopedSetting()] + [DefaultSettingValueAttribute("true")] + public bool StatusVisible + { + get { return (bool)this["StatusVisible"]; } + set { this["StatusVisible"] = value; } + } + [UserScopedSetting()] + [DefaultSettingValueAttribute("100")] + public int StatusWidth + { + get { return (int)this["StatusWidth"]; } + set { this["StatusWidth"] = value; } + } + + [UserScopedSetting()] + [DefaultSettingValueAttribute("true")] + public bool SizeVisible + { + get { return (bool)this["SizeVisible"]; } + set { this["StatusVisible"] = value; } + } + [UserScopedSetting()] + [DefaultSettingValueAttribute("100")] + public int SizeWidth + { + get { return (int)this["SizeWidth"]; } + set { this["StatusWidth"] = value; } + } + + [UserScopedSetting()] + [DefaultSettingValueAttribute("true")] + public bool SpeedVisible + { + get { return (bool)this["SpeedVisible"]; } + set { this["SpeedVisible"] = value; } + } + [UserScopedSetting()] + [DefaultSettingValueAttribute("100")] + public int SpeedWidth + { + get { return (int)this["SpeedWidth"]; } + set { this["SpeedWidth"] = value; } + } + + [UserScopedSetting()] + [DefaultSettingValueAttribute("true")] + public bool CompletedVisible + { + get { return (bool)this["CompletedVisible"]; } + set { this["CompletedVisible"] = value; } + } + [UserScopedSetting()] + [DefaultSettingValueAttribute("100")] + public int CompletedWidth + { + get { return (int)this["CompletedWidth"]; } + set { this["CompletedWidth"] = value; } + } + + [UserScopedSetting()] + [DefaultSettingValueAttribute("true")] + public bool SourcesVisible + { + get { return (bool)this["SourcesVisible"]; } + set { this["SourcesVisible"] = value; } + } + [UserScopedSetting()] + [DefaultSettingValueAttribute("100")] + public int SourcesWidth + { + get { return (int)this["SourcesWidth"]; } + set { this["SourcesWidth"] = value; } + } + } + + public delegate void DownloadStatusListEventHandler(); + + public class amuleDownloadStatusList : amuleListView, IContainerUI { + DownloadQueueContainer m_item_container; + amuleXferControlSettings m_settings = new amuleXferControlSettings(); + + enum DOWNLOAD_CTRL_COL_ID { + COL_FILENAME_ID = 0, + COL_STATUS_ID, + COL_SIZE_ID, + COL_COMPLETED_ID, + COL_SPEED_ID, + COL_SOURCES_ID, + + COL_LAST_ID, + }; + + private ContextMenuStrip m_ctx_menu = new ContextMenuStrip(); + + public event DownloadStatusListEventHandler OnCancelItem, OnPauseItem, OnResumeItem; + + void UpdateColumnIndexes() + { + int i = 0; + m_column_index[(int)DOWNLOAD_CTRL_COL_ID.COL_FILENAME_ID] = i; + if ( m_settings.FilenameVisible ) i++; + m_column_index[(int)DOWNLOAD_CTRL_COL_ID.COL_STATUS_ID] = i; + if ( m_settings.StatusVisible ) i++; + m_column_index[(int)DOWNLOAD_CTRL_COL_ID.COL_SIZE_ID] = i; + if ( m_settings.SizeVisible ) i++; + m_column_index[(int)DOWNLOAD_CTRL_COL_ID.COL_COMPLETED_ID] = i; + if ( m_settings.CompletedVisible ) i++; + m_column_index[(int)DOWNLOAD_CTRL_COL_ID.COL_SPEED_ID] = i; + if ( m_settings.SpeedVisible ) i++; + m_column_index[(int)DOWNLOAD_CTRL_COL_ID.COL_SOURCES_ID] = i; + if ( m_settings.SourcesVisible ) i++; + } + + void SaveSettigs() + { + if ( m_settings.FilenameVisible ) { + m_settings.FilenameWidth = + Columns[m_column_index[(int)DOWNLOAD_CTRL_COL_ID.COL_FILENAME_ID]].Width; + } + if ( m_settings.StatusVisible ) { + m_settings.StatusWidth = + Columns[(int)DOWNLOAD_CTRL_COL_ID.COL_STATUS_ID].Width; + } + m_settings.Save(); + } + + public amuleDownloadStatusList() + { + OwnerDraw = true; + + DrawColumnHeader += + new DrawListViewColumnHeaderEventHandler(amuleDownloadStatusList_DrawColumnHeader); + + DrawSubItem += new DrawListViewSubItemEventHandler(amuleDownloadStatusList_DrawSubItem); + DownloadQueueItem.InitDraw3DModifiers(FontHeight + 1); + + MouseClick += new MouseEventHandler(amuleDownloadStatusList_MouseClickHandler); + ColumnClick += new ColumnClickEventHandler(amuleDownloadStatusList_ColumtClickHandler); + + m_ctx_menu.Opening += new System.ComponentModel.CancelEventHandler(cms_Opening); + m_ctx_menu.Items.Add(new ToolStripLabel("Downloads")); + m_ctx_menu.Items.Add(new ToolStripSeparator()); + + ToolStripButton it_pause = new ToolStripButton("Pause"); + it_pause.Click += new EventHandler(it_pause_Click); + m_ctx_menu.Items.Add(it_pause); + ContextMenuStrip = m_ctx_menu; + + ToolStripButton it_resume = new ToolStripButton("Resume"); + it_resume.Click += new EventHandler(it_resume_Click); + m_ctx_menu.Items.Add(it_resume); + + ToolStripButton it_cancel = new ToolStripButton("Cancel"); + it_cancel.Click += new EventHandler(it_cancel_Click); + m_ctx_menu.Items.Add(it_cancel); + + m_ctx_menu.Items.Add(new ToolStripSeparator()); + // + // Init columns + // + m_column_index = new int[(int)DOWNLOAD_CTRL_COL_ID.COL_LAST_ID]; + UpdateColumnIndexes(); + // File name + if ( m_settings.FilenameVisible ) { + CreateColumtAt("File name", m_settings.FilenameWidth, + (int)DOWNLOAD_CTRL_COL_ID.COL_FILENAME_ID); + } + AppendItemToCtxMenu(m_ctx_menu, "File name", DOWNLOAD_CTRL_COL_ID.COL_FILENAME_ID, + m_settings.FilenameVisible, new EventHandler(column_Click)); + // Status + if ( m_settings.StatusVisible ) { + CreateColumtAt("Status", m_settings.StatusWidth, + (int)DOWNLOAD_CTRL_COL_ID.COL_STATUS_ID); + } + AppendItemToCtxMenu(m_ctx_menu, "Status", DOWNLOAD_CTRL_COL_ID.COL_STATUS_ID, + m_settings.StatusVisible, new EventHandler(column_Click)); + // Size + if ( m_settings.SizeVisible ) { + CreateColumtAt("Size", m_settings.SizeWidth, + (int)DOWNLOAD_CTRL_COL_ID.COL_SIZE_ID); + } + AppendItemToCtxMenu(m_ctx_menu, "Size", DOWNLOAD_CTRL_COL_ID.COL_SIZE_ID, + m_settings.SizeVisible, new EventHandler(column_Click)); + // Completed size + if ( m_settings.CompletedVisible ) { + CreateColumtAt("Completed", m_settings.CompletedWidth, + (int)DOWNLOAD_CTRL_COL_ID.COL_COMPLETED_ID); + } + AppendItemToCtxMenu(m_ctx_menu, "Completed", DOWNLOAD_CTRL_COL_ID.COL_COMPLETED_ID, + m_settings.CompletedVisible, new EventHandler(column_Click)); + // Speed + if ( m_settings.SpeedVisible ) { + CreateColumtAt("Speed", m_settings.SpeedWidth, + (int)DOWNLOAD_CTRL_COL_ID.COL_SPEED_ID); + } + AppendItemToCtxMenu(m_ctx_menu, "Speed", DOWNLOAD_CTRL_COL_ID.COL_SPEED_ID, + m_settings.SpeedVisible, new EventHandler(column_Click)); + // Sources + if ( m_settings.SourcesVisible ) { + CreateColumtAt("Sources", m_settings.SourcesWidth, + m_column_index[(int)DOWNLOAD_CTRL_COL_ID.COL_SOURCES_ID]); + } + AppendItemToCtxMenu(m_ctx_menu, "Sources", DOWNLOAD_CTRL_COL_ID.COL_SOURCES_ID, + m_settings.SizeVisible, new EventHandler(column_Click)); + + ContextMenuStrip = m_ctx_menu; + } + + // + // Click on column visibility checkbox in context menu + // + void column_Click(object sender, EventArgs e) + { + ToolStripMenuItem col = sender as ToolStripMenuItem; + DOWNLOAD_CTRL_COL_ID col_id = (DOWNLOAD_CTRL_COL_ID)col.Tag; + bool status = !col.Checked; + col.Checked = status; + if ( !status ) { + RemoveColumnAt((int)col_id); + } + switch ( col_id ) { + case DOWNLOAD_CTRL_COL_ID.COL_FILENAME_ID: + m_settings.FilenameVisible = status; + UpdateColumnIndexes(); + if ( status ) { + CreateColumtAt("File name", m_settings.FilenameWidth, (int)col_id); + } + break; + case DOWNLOAD_CTRL_COL_ID.COL_STATUS_ID: + m_settings.StatusVisible = status; + UpdateColumnIndexes(); + if ( status ) { + CreateColumtAt("Status", m_settings.StatusWidth, (int)col_id); + } + break; + case DOWNLOAD_CTRL_COL_ID.COL_SIZE_ID: + m_settings.SizeVisible = status; + UpdateColumnIndexes(); + if ( status ) { + CreateColumtAt("Size", m_settings.SizeWidth, (int)col_id); + } + break; + case DOWNLOAD_CTRL_COL_ID.COL_COMPLETED_ID: + m_settings.CompletedVisible = status; + UpdateColumnIndexes(); + if ( status ) { + CreateColumtAt("Completed", m_settings.CompletedWidth, (int)col_id); + } + break; + case DOWNLOAD_CTRL_COL_ID.COL_SPEED_ID: + m_settings.SpeedVisible = status; + UpdateColumnIndexes(); + if ( status ) { + CreateColumtAt("Speed", m_settings.SpeedWidth, (int)col_id); + } + break; + case DOWNLOAD_CTRL_COL_ID.COL_SOURCES_ID: + m_settings.SourcesVisible = status; + UpdateColumnIndexes(); + if ( status ) { + CreateColumtAt("Sources", m_settings.SourcesWidth, (int)col_id); + } + break; + default: + break; + } + Items.Clear(); + foreach ( DownloadQueueItem i in m_item_container.Items ) { + DoInsertItem(i); + } + } + + // + // "Cancel" command in context menu + // + void it_cancel_Click(object sender, EventArgs e) + { + OnCancelItem(); + } + + // + // "Resume" command in context menu + // + void it_resume_Click(object sender, EventArgs e) + { + OnResumeItem(); + } + + // + // "Pause" command in context menu + // + void it_pause_Click(object sender, EventArgs e) + { + OnPauseItem(); + } + + public void SelectedItemsToCommand(ecProto.ecPacket cmd) + { + foreach ( ListViewItem i in SelectedItems ) { + DownloadQueueItem it = i.Tag as DownloadQueueItem; + ecProto.ecTagMD5 tag = new ecProto.ecTagMD5(ECTagNames.EC_TAG_PARTFILE, it.ID); + cmd.AddSubtag(tag); + } + } + + // + // Context menu - on opening. Can support dynamic menu creation + // + void cms_Opening(object sender, System.ComponentModel.CancelEventArgs e) + { + + e.Cancel = false; + } + + protected override void OnHandleDestroyed(EventArgs e) + { + SaveSettigs(); + base.OnHandleDestroyed(e); + } + public DownloadQueueContainer ItemContainer + { + get { return m_item_container; } + set + { + m_item_container = value; + m_item_container.NewItemStatusLineLength = Columns[1].Width; + } + } + + override protected void OnColumnWidthChanged(ColumnWidthChangedEventArgs e) + { + int status_index = m_column_index[(int)DOWNLOAD_CTRL_COL_ID.COL_STATUS_ID]; + if ( (e.ColumnIndex == status_index) && m_settings.StatusVisible) { + int new_size = Columns[status_index].Width + 1; + m_item_container.NewItemStatusLineLength = new_size; + + foreach ( ListViewItem i in Items ) { + DownloadQueueItem it = i.Tag as DownloadQueueItem; + it.AllocColorLine(new_size); + it.DrawLine(); + } + } + } + + void amuleDownloadStatusList_MouseClickHandler(object o, MouseEventArgs e) + { + if ( e.Button == MouseButtons.Right ) { + + } + } + + void amuleDownloadStatusList_ColumtClickHandler(object o, ColumnClickEventArgs e) + { + } + + unsafe void DrawStatusBar(DownloadQueueItem it, Graphics g, Rectangle posR) + { + // + // Bitmap is created as 32bpp (rgb+alpha) + // + Bitmap status_bmp = new Bitmap(posR.Width, posR.Height, + System.Drawing.Imaging.PixelFormat.Format32bppArgb); + + System.Drawing.Imaging.BitmapData bmd = status_bmp.LockBits( + new Rectangle(0, 0, status_bmp.Width, status_bmp.Height), + System.Drawing.Imaging.ImageLockMode.ReadWrite, + System.Drawing.Imaging.PixelFormat.Format32bppArgb); + + RGB[] item_color_line = it.ColorLine; + byte[] modifiers = DownloadQueueItem.Get_3D_Modifiers(); + + for ( int y = 0; y < bmd.Height; y++ ) { + byte* row = (byte*)bmd.Scan0 + (y * bmd.Stride); + + for ( int x = 0; x < bmd.Width; x++ ) { + UInt32* pixel_ptr = (UInt32*)(row + x * 4); + //row[x * 3 + 2] = 255; + //*pixel_ptr = 0xff0000; //RED + //*pixel_ptr = 0x00ff00; //GREEN + //*pixel_ptr = 0x1f0000ff; // BLUE + //*pixel_ptr = item_color_line[x] | (x << 24); + item_color_line[x].WriteToBuffWithModifier(pixel_ptr, modifiers[y]); + } + + } + + status_bmp.UnlockBits(bmd); + + g.DrawImage(status_bmp, posR); + status_bmp.Dispose(); + } + + void amuleDownloadStatusList_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) + { + if ( (e.ColumnIndex == m_column_index[(int)DOWNLOAD_CTRL_COL_ID.COL_STATUS_ID]) + && m_settings.StatusVisible ) { + // status is colored bar + Rectangle r = e.Bounds; + DownloadQueueItem it = e.Item.Tag as DownloadQueueItem; + DrawStatusBar(it, e.Graphics, r); + e.DrawDefault = false; + } + else { + e.DrawBackground(); + } + e.DrawText(); + if ( e.Item.Selected ) { + e.DrawFocusRectangle(e.Bounds); + } + } + + void amuleDownloadStatusList_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) + { + e.DrawBackground(); + e.DrawText(); + } + + /// + // interface to core + /// + void DoInsertItem(DownloadQueueItem i) + { + string first_col_txt; + if ( m_settings.FilenameVisible ) { + first_col_txt = i.Name; + } else if ( m_settings.StatusVisible ) { + first_col_txt = i.PercentDone; + } else if ( m_settings.SizeVisible ) { + first_col_txt = i.Size; + } else if ( m_settings.CompletedVisible ) { + first_col_txt = i.SizeDone; + } else if ( m_settings.SpeedVisible ) { + first_col_txt = i.Speed; + } else if ( m_settings.SourcesVisible ) { + first_col_txt = i.Sources; + } else { + first_col_txt = "all columns hidden"; + } + + ListViewItem it = new ListViewItem(first_col_txt); + + if ( m_settings.StatusVisible ) { + it.SubItems.Add(new ListViewItem.ListViewSubItem(it, i.PercentDone)); + } + if ( m_settings.SizeVisible ) { + it.SubItems.Add(new ListViewItem.ListViewSubItem(it, i.Size)); + } + if ( m_settings.CompletedVisible ) { + it.SubItems.Add(new ListViewItem.ListViewSubItem(it, i.SizeDone)); + } + if ( m_settings.SpeedVisible ) { + it.SubItems.Add(new ListViewItem.ListViewSubItem(it, i.Speed)); + } + if ( m_settings.SourcesVisible ) { + it.SubItems.Add(new ListViewItem.ListViewSubItem(it, i.Sources)); + } + + if ( m_settings.StatusVisible ) { + it.SubItems[m_column_index[(int)DOWNLOAD_CTRL_COL_ID.COL_STATUS_ID]].ForeColor = Color.White; + Columns[(int)DOWNLOAD_CTRL_COL_ID.COL_STATUS_ID].TextAlign = HorizontalAlignment.Center; + + } + it.Tag = i; + + Items.Add(it); + + i.UiItem = it; + } + + void DoUpdateItem(DownloadQueueItem i) + { + ListViewItem it = i.UiItem as ListViewItem; + int idx = m_column_index[(int)DOWNLOAD_CTRL_COL_ID.COL_STATUS_ID]; + if ( it.SubItems[idx].Text != i.PercentDone ) { + it.SubItems[idx].Text = i.PercentDone; + } + idx = (int)DOWNLOAD_CTRL_COL_ID.COL_COMPLETED_ID; + if ( it.SubItems[idx].Text != i.SizeDone ) { + it.SubItems[idx].Text = i.SizeDone; + } + idx = (int)DOWNLOAD_CTRL_COL_ID.COL_SPEED_ID; + if ( it.SubItems[idx].Text != i.Speed ) { + it.SubItems[idx].Text = i.Speed; + } + //Items + } + + #region IContainerUI Members + + delegate void UpdateCallback(); + + public void MyEndUpdate() + { + if ( InvokeRequired ) { + UpdateCallback d = new UpdateCallback(EndUpdate); + Invoke(d); + } + else { + EndUpdate(); + } + } + + public void MyBeginUpdate() + { + if ( InvokeRequired ) { + UpdateCallback d = new UpdateCallback(BeginUpdate); + Invoke(d); + } + else { + BeginUpdate(); + } + } + + delegate void ItemCallback(DownloadQueueItem i); + + public void InsertItem(object i) + { + DownloadQueueItem it = i as DownloadQueueItem; + if ( InvokeRequired ) { + ItemCallback d = new ItemCallback(DoInsertItem); + Invoke(d, it); + } + else { + DoInsertItem(it); + } + } + + public void UpdateItem(object i) + { + DownloadQueueItem it = i as DownloadQueueItem; + if ( InvokeRequired ) { + ItemCallback d = new ItemCallback(DoUpdateItem); + Invoke(d, it); + } + else { + DoUpdateItem(it); + } + } + + #endregion + } + +} diff --git a/src/remote-gui.net/ECCodes.cs b/src/remote-gui.net/ECCodes.cs new file mode 120000 index 00000000..2920471b --- /dev/null +++ b/src/remote-gui.net/ECCodes.cs @@ -0,0 +1 @@ +../libs/ec/c#/ECCodes.cs \ No newline at end of file diff --git a/src/remote-gui.net/ECTagTypes.cs b/src/remote-gui.net/ECTagTypes.cs new file mode 120000 index 00000000..942a0496 --- /dev/null +++ b/src/remote-gui.net/ECTagTypes.cs @@ -0,0 +1 @@ +../libs/ec/c#/ECTagTypes.cs \ No newline at end of file diff --git a/src/remote-gui.net/MainWindow.Designer.cs b/src/remote-gui.net/MainWindow.Designer.cs new file mode 100644 index 00000000..9b4d9041 --- /dev/null +++ b/src/remote-gui.net/MainWindow.Designer.cs @@ -0,0 +1,222 @@ +namespace amule.net +{ + partial class MainWindow + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.panelStatus = new System.Windows.Forms.Panel(); + this.textLinktatus = new System.Windows.Forms.TextBox(); + this.panelToolbar = new System.Windows.Forms.Panel(); + this.buttonAbout = new System.Windows.Forms.Button(); + this.buttonPrefs = new System.Windows.Forms.Button(); + this.buttonAddLink = new System.Windows.Forms.Button(); + this.buttonShared = new System.Windows.Forms.Button(); + this.buttonNetwork = new System.Windows.Forms.Button(); + this.buttonSearch = new System.Windows.Forms.Button(); + this.buttonXfer = new System.Windows.Forms.Button(); + this.panelMain = new System.Windows.Forms.Panel(); + this.textBoxDownSpeed = new System.Windows.Forms.TextBox(); + this.textBoxUpSpeed = new System.Windows.Forms.TextBox(); + this.panelStatus.SuspendLayout(); + this.panelToolbar.SuspendLayout(); + this.SuspendLayout(); + // + // panelStatus + // + this.panelStatus.Controls.Add(this.textBoxUpSpeed); + this.panelStatus.Controls.Add(this.textBoxDownSpeed); + this.panelStatus.Controls.Add(this.textLinktatus); + this.panelStatus.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panelStatus.Location = new System.Drawing.Point(0, 362); + this.panelStatus.Name = "panelStatus"; + this.panelStatus.Size = new System.Drawing.Size(678, 24); + this.panelStatus.TabIndex = 0; + // + // textLinktatus + // + this.textLinktatus.Dock = System.Windows.Forms.DockStyle.Left; + this.textLinktatus.Location = new System.Drawing.Point(0, 0); + this.textLinktatus.Name = "textLinktatus"; + this.textLinktatus.ReadOnly = true; + this.textLinktatus.Size = new System.Drawing.Size(362, 20); + this.textLinktatus.TabIndex = 0; + // + // panelToolbar + // + this.panelToolbar.Controls.Add(this.buttonAbout); + this.panelToolbar.Controls.Add(this.buttonPrefs); + this.panelToolbar.Controls.Add(this.buttonAddLink); + this.panelToolbar.Controls.Add(this.buttonShared); + this.panelToolbar.Controls.Add(this.buttonNetwork); + this.panelToolbar.Controls.Add(this.buttonSearch); + this.panelToolbar.Controls.Add(this.buttonXfer); + this.panelToolbar.Dock = System.Windows.Forms.DockStyle.Top; + this.panelToolbar.Location = new System.Drawing.Point(0, 0); + this.panelToolbar.Name = "panelToolbar"; + this.panelToolbar.Size = new System.Drawing.Size(678, 45); + this.panelToolbar.TabIndex = 1; + // + // buttonAbout + // + this.buttonAbout.Dock = System.Windows.Forms.DockStyle.Left; + this.buttonAbout.Image = global::amule.net.Properties.Resources.Toolbar_About; + this.buttonAbout.Location = new System.Drawing.Point(270, 0); + this.buttonAbout.Name = "buttonAbout"; + this.buttonAbout.Size = new System.Drawing.Size(45, 45); + this.buttonAbout.TabIndex = 6; + this.buttonAbout.UseVisualStyleBackColor = true; + this.buttonAbout.Click += new System.EventHandler(this.buttonAbout_Click); + // + // buttonPrefs + // + this.buttonPrefs.Dock = System.Windows.Forms.DockStyle.Left; + this.buttonPrefs.Image = global::amule.net.Properties.Resources.Toolbar_Prefs; + this.buttonPrefs.Location = new System.Drawing.Point(225, 0); + this.buttonPrefs.Name = "buttonPrefs"; + this.buttonPrefs.Size = new System.Drawing.Size(45, 45); + this.buttonPrefs.TabIndex = 5; + this.buttonPrefs.UseVisualStyleBackColor = true; + this.buttonPrefs.Click += new System.EventHandler(this.buttonPrefs_Click); + // + // buttonAddLink + // + this.buttonAddLink.Dock = System.Windows.Forms.DockStyle.Left; + this.buttonAddLink.Image = global::amule.net.Properties.Resources.Toolbar_Import; + this.buttonAddLink.Location = new System.Drawing.Point(180, 0); + this.buttonAddLink.Name = "buttonAddLink"; + this.buttonAddLink.Size = new System.Drawing.Size(45, 45); + this.buttonAddLink.TabIndex = 4; + this.buttonAddLink.UseVisualStyleBackColor = true; + this.buttonAddLink.Click += new System.EventHandler(this.buttonAddLink_Click); + // + // buttonShared + // + this.buttonShared.Dock = System.Windows.Forms.DockStyle.Left; + this.buttonShared.Image = global::amule.net.Properties.Resources.Toolbar_Shared; + this.buttonShared.Location = new System.Drawing.Point(135, 0); + this.buttonShared.Name = "buttonShared"; + this.buttonShared.Size = new System.Drawing.Size(45, 45); + this.buttonShared.TabIndex = 3; + this.buttonShared.UseVisualStyleBackColor = true; + this.buttonShared.Click += new System.EventHandler(this.buttonShared_Click); + // + // buttonNetwork + // + this.buttonNetwork.Dock = System.Windows.Forms.DockStyle.Left; + this.buttonNetwork.Image = global::amule.net.Properties.Resources.Toolbar_Network; + this.buttonNetwork.Location = new System.Drawing.Point(90, 0); + this.buttonNetwork.Name = "buttonNetwork"; + this.buttonNetwork.Size = new System.Drawing.Size(45, 45); + this.buttonNetwork.TabIndex = 2; + this.buttonNetwork.UseVisualStyleBackColor = true; + this.buttonNetwork.Click += new System.EventHandler(this.buttonNetwork_Click); + // + // buttonSearch + // + this.buttonSearch.Dock = System.Windows.Forms.DockStyle.Left; + this.buttonSearch.Image = global::amule.net.Properties.Resources.Toolbar_Search; + this.buttonSearch.Location = new System.Drawing.Point(45, 0); + this.buttonSearch.Name = "buttonSearch"; + this.buttonSearch.Size = new System.Drawing.Size(45, 45); + this.buttonSearch.TabIndex = 1; + this.buttonSearch.UseVisualStyleBackColor = true; + this.buttonSearch.Click += new System.EventHandler(this.buttonSearch_Click); + // + // buttonXfer + // + this.buttonXfer.Dock = System.Windows.Forms.DockStyle.Left; + this.buttonXfer.Image = global::amule.net.Properties.Resources.Toolbar_Transfers; + this.buttonXfer.Location = new System.Drawing.Point(0, 0); + this.buttonXfer.Name = "buttonXfer"; + this.buttonXfer.Size = new System.Drawing.Size(45, 45); + this.buttonXfer.TabIndex = 0; + this.buttonXfer.UseVisualStyleBackColor = true; + this.buttonXfer.Click += new System.EventHandler(this.buttonXfer_Click); + // + // panelMain + // + this.panelMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelMain.Location = new System.Drawing.Point(0, 45); + this.panelMain.Name = "panelMain"; + this.panelMain.Size = new System.Drawing.Size(678, 317); + this.panelMain.TabIndex = 2; + // + // textBoxDownSpeed + // + this.textBoxDownSpeed.Dock = System.Windows.Forms.DockStyle.Left; + this.textBoxDownSpeed.Location = new System.Drawing.Point(362, 0); + this.textBoxDownSpeed.Name = "textBoxDownSpeed"; + this.textBoxDownSpeed.ReadOnly = true; + this.textBoxDownSpeed.Size = new System.Drawing.Size(90, 20); + this.textBoxDownSpeed.TabIndex = 1; + // + // textBoxUpSpeed + // + this.textBoxUpSpeed.Dock = System.Windows.Forms.DockStyle.Left; + this.textBoxUpSpeed.Location = new System.Drawing.Point(452, 0); + this.textBoxUpSpeed.Name = "textBoxUpSpeed"; + this.textBoxUpSpeed.ReadOnly = true; + this.textBoxUpSpeed.Size = new System.Drawing.Size(90, 20); + this.textBoxUpSpeed.TabIndex = 2; + // + // MainWindow + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(678, 386); + this.Controls.Add(this.panelMain); + this.Controls.Add(this.panelToolbar); + this.Controls.Add(this.panelStatus); + this.Name = "MainWindow"; + this.Text = "aMule remote control"; + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.MainWindow_FormClosed); + this.Load += new System.EventHandler(this.MainWindow_Load); + this.panelStatus.ResumeLayout(false); + this.panelStatus.PerformLayout(); + this.panelToolbar.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panelStatus; + private System.Windows.Forms.Panel panelToolbar; + private System.Windows.Forms.Panel panelMain; + private System.Windows.Forms.Button buttonXfer; + private System.Windows.Forms.Button buttonSearch; + private System.Windows.Forms.TextBox textLinktatus; + private System.Windows.Forms.Button buttonNetwork; + private System.Windows.Forms.Button buttonShared; + private System.Windows.Forms.Button buttonAddLink; + private System.Windows.Forms.Button buttonPrefs; + private System.Windows.Forms.Button buttonAbout; + private System.Windows.Forms.TextBox textBoxUpSpeed; + private System.Windows.Forms.TextBox textBoxDownSpeed; + + } +} \ No newline at end of file diff --git a/src/remote-gui.net/MainWindow.cs b/src/remote-gui.net/MainWindow.cs new file mode 100644 index 00000000..5376ee5f --- /dev/null +++ b/src/remote-gui.net/MainWindow.cs @@ -0,0 +1,509 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003-2008 lfroen ( lfroen@gmail.com / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Configuration; + +namespace amule.net +{ + public partial class MainWindow : Form + { + amuleRemote m_amuleRemote = new amuleRemote(); + Timer m_updateTimer = null; + + DownloadQueueContainer m_dload_info; + SharedFileListContainer m_shared_info; + + amuleDownloadStatusList m_download_status_ctrl; + amuleSharedFilesList m_shared_list_ctrl; + + amuleSearchControl m_search_ctrl; + amuleSettings m_settings = new amuleSettings(); + + public MainWindow() + { + InitializeComponent(); + } + + enum UpdateRequestState { Stats, MainInfo }; + UpdateRequestState m_req_state; + + ecProto.ecPacket GetFullInfoRequest() + { + ecProto.ecPacket req = null; + Control current_ctrl = panelMain.Controls[0]; + if (current_ctrl == m_download_status_ctrl) { + req = m_dload_info.ReQuery(); + } else if (current_ctrl == m_shared_list_ctrl) { + req = m_shared_info.ReQuery(); + } + + if ( req == null ) { + throw new Exception("unhandled GUI state"); + } + return req; + } + + private static void UpdateTimerProc(Object myObject, + EventArgs myEventArgs) + { + MainWindow w = (MainWindow)((Timer)myObject).Tag; + + // TODO: for testing 1 request is enough + w.m_updateTimer.Stop(); + + ecProto.ecPacket req = null; + switch(w.m_req_state) { + case UpdateRequestState.Stats: + req = new ecProto.ecPacket(ECOpCodes.EC_OP_STAT_REQ); + w.m_req_state = UpdateRequestState.MainInfo; + break; + case UpdateRequestState.MainInfo: + req = w.GetFullInfoRequest(); + w.m_req_state = UpdateRequestState.Stats; + break; + } + w.m_amuleRemote.SendPacket(req); + } + + private void MainWindow_Load(object sender, EventArgs e) + { + // + // First, attempt to connect to remote core + // + ConnectDlg connectDlg = new ConnectDlg(); + string errorMsg = null; + bool connect_ok = false; + string amuleHost = "", amulePort = ""; + while ( !connect_ok ) { + if (connectDlg.ShowDialog() == DialogResult.OK) { + amuleHost = connectDlg.Host(); + amulePort = connectDlg.Port(); + string pass = connectDlg.Pass(); + int amulePort_int = 0; + try { + amulePort_int = Convert.ToInt16(amulePort, 10); + }catch(Exception) { + MessageBox.Show("Invalid port number", "Error", + MessageBoxButtons.OK, MessageBoxIcon.Error); + continue; + } + connect_ok = m_amuleRemote.ConnectToCore(amuleHost, amulePort_int, pass, ref errorMsg); + if (!connect_ok) { + Console.WriteLine("Connect failed '{0}'", errorMsg); + MessageBox.Show(errorMsg, "Connection to aMule core failed", + MessageBoxButtons.OK, MessageBoxIcon.Stop); + } + } else { + Application.Exit(); + return; + } + } + + textLinktatus.Text = "aMule core on [" + amuleHost + ":" + amulePort + "]"; + Text = "aMule remote control [" + amuleHost + ":" + amulePort + "]"; + Size = m_settings.MainWindowSize; + + m_amuleRemote.SetECHandler(new amuleMainECHanler(this)); + + // + // Connection OK at this point + // + m_download_status_ctrl = new amuleDownloadStatusList(); + m_dload_info = new DownloadQueueContainer(m_download_status_ctrl); + m_download_status_ctrl.ItemContainer = m_dload_info; + + m_download_status_ctrl.OnCancelItem += + new DownloadStatusListEventHandler(m_download_status_ctrl_OnCancelItem); + m_download_status_ctrl.OnPauseItem += + new DownloadStatusListEventHandler(m_download_status_ctrl_OnPauseItem); + m_download_status_ctrl.OnResumeItem += + new DownloadStatusListEventHandler(m_download_status_ctrl_OnResumeItem); + + m_shared_list_ctrl = new amuleSharedFilesList(); + m_shared_info = new SharedFileListContainer(m_shared_list_ctrl); + + m_search_ctrl = new amuleSearchControl(); + + m_updateTimer = new Timer(); + m_updateTimer.Tag = this; + m_updateTimer.Tick += new EventHandler(UpdateTimerProc); + m_updateTimer.Interval = 1000; + m_updateTimer.Start(); + + // default - download list view + panelMain.Controls.Add(m_download_status_ctrl); + + // for testing set needed state! + m_req_state = UpdateRequestState.MainInfo; + } + + void m_download_status_ctrl_OnResumeItem() + { + ecProto.ecPacket cmd = new ecProto.ecPacket(ECOpCodes.EC_OP_PARTFILE_RESUME); + m_download_status_ctrl.SelectedItemsToCommand(cmd); + m_amuleRemote.SendPacket(cmd); + } + + void m_download_status_ctrl_OnPauseItem() + { + ecProto.ecPacket cmd = new ecProto.ecPacket(ECOpCodes.EC_OP_PARTFILE_PAUSE); + m_download_status_ctrl.SelectedItemsToCommand(cmd); + m_amuleRemote.SendPacket(cmd); + } + + void m_download_status_ctrl_OnCancelItem() + { + string msg = "Following files will be cancelled:\n"; + foreach ( ListViewItem i in m_download_status_ctrl.SelectedItems ) { + msg += i.Text + "\n"; + } + if ( MessageBox.Show(msg, "Cancel files", MessageBoxButtons.OKCancel, + MessageBoxIcon.Question) == DialogResult.OK ) { + ecProto.ecPacket cmd = new ecProto.ecPacket(ECOpCodes.EC_OP_PARTFILE_DELETE); + m_download_status_ctrl.SelectedItemsToCommand(cmd); + m_amuleRemote.SendPacket(cmd); + } + } + + // + // Process reply for "stats" + // + delegate void StatsReplyCallback(ecProto.ecPacket packet); + public void StatsReplyInvoke(ecProto.ecPacket packet) + { + if ( InvokeRequired ) { + StatsReplyCallback d = new StatsReplyCallback(StatsReply); + Invoke(d, packet); + } else { + StatsReply(packet); + } + } + + void StatsReply(ecProto.ecPacket packet) + { + ecProto.ecTag t = null; + t = packet.SubTag(ECTagNames.EC_TAG_STATS_DL_SPEED); + int dl_speed = ((ecProto.ecTagInt)t).ValueInt(); + + t = packet.SubTag(ECTagNames.EC_TAG_STATS_UL_SPEED); + int ul_speed = ((ecProto.ecTagInt)t).ValueInt(); + //string server = ((ecProto.ecTagString)t).ToString(); + + ecProto.ecConnStateTag connState = + new ecProto.ecConnStateTag((ecProto.ecTagInt)packet.SubTag(ECTagNames.EC_TAG_CONNSTATE)); + + textBoxDownSpeed.Text = "Down:" + ValueToPrefix(dl_speed) + "/s"; + textBoxUpSpeed.Text = "Up:" + ValueToPrefix(ul_speed) + "/s"; + if ( connState.IsConnected() ) { + if (connState.IsConnectedED2K()) { + textLinktatus.Text = "ED2K: connected"; + //ecProto.ecTagString server_name = (ecProto.ecTagString)server.SubTag(ECTagNames.EC_TAG_SERVER_NAME); + //toolStripStatusServer.Text = server_name.StringValue(); + } else { + //toolStripStatusServer.Text = ""; + if (connState.IsConnectingED2K() ) { + textLinktatus.Text = "ED2K: connecting ..."; + } else { + textLinktatus.Text = "ED2K: disconnected"; + } + } + if (connState.IsConnectedKademlia()) { + //textLinktatus.Text = "KAD: connected"; + } + + } + } + + public void DloadQueueReply(ecProto.ecPacket packet) + { + ecProto.ecPacket reply = m_dload_info.HandlePacket(packet); + if ( reply != null ) { + m_amuleRemote.SendPacket(reply); + } + } + + public void SharedFilesReply(ecProto.ecPacket packet) + { + ecProto.ecPacket reply = m_shared_info.HandlePacket(packet); + if (reply != null) { + m_amuleRemote.SendPacket(reply); + } + } + + private void buttonXfer_Click(object sender, EventArgs e) + { + if ( panelMain.Controls[0] != m_download_status_ctrl ) { + panelMain.Controls.Clear(); + panelMain.Controls.Add(m_download_status_ctrl); + } + } + + private void buttonNetwork_Click(object sender, EventArgs e) + { + UpdateTimerProc(m_updateTimer, null); + } + + private void buttonSearch_Click(object sender, EventArgs e) + { + if ( panelMain.Controls[0] != m_search_ctrl ) { + panelMain.Controls.Clear(); + panelMain.Controls.Add(m_search_ctrl); + } + } + + private void buttonShared_Click(object sender, EventArgs e) + { + if ( panelMain.Controls[0] != m_shared_list_ctrl ) { + panelMain.Controls.Clear(); + panelMain.Controls.Add(m_shared_list_ctrl); + } + + } + + private void buttonAddLink_Click(object sender, EventArgs e) + { + AddLinkDialog dlg = new AddLinkDialog(); + if ( dlg.ShowDialog() == DialogResult.OK ) { + string link = dlg.textBoxLink.Text; + ecProto.ecPacket cmd = new ecProto.ecPacket(ECOpCodes.EC_OP_ADD_LINK); + ecProto.ecTagString linktag = new ecProto.ecTagString(ECTagNames.EC_TAG_STRING, link); + cmd.AddSubtag(linktag); + m_amuleRemote.SendPacket(cmd); + } + } + + private void buttonPrefs_Click(object sender, EventArgs e) + { + + } + + private void buttonAbout_Click(object sender, EventArgs e) + { + AboutBox dlg = new AboutBox(); + dlg.ShowDialog(); + } + + private void MainWindow_FormClosed(object sender, FormClosedEventArgs e) + { + m_settings.MainWindowSize = Size; + + m_settings.Save(); + } + + public string ValueToPrefix(Int64 value) + { + if ( value < 1024 ) { + return string.Format("{0} bytes", value); + } else if ( value < 1048576 ) { + return string.Format("{0:f} Kb", ((float)value) / 1024); + } else if ( value < 1073741824 ) { + return string.Format("{0:f} Mb", ((float)value) / 1048576); + } else { + return string.Format("{0:f} Gb", ((float)value) / 1073741824); + } + } + + } + + [SettingsGroupNameAttribute("Application")] + public class amuleSettings : ApplicationSettingsBase { + + [UserScopedSettingAttribute()] + public string Host + { + get { return (string)this["Host"]; } + set { this["Host"] = value; } + } + + [UserScopedSettingAttribute()] + public string Password + { + get { return (string)this["Password"]; } + set { this["Password"] = value; } + } + + [UserScopedSetting()] + [DefaultSettingValueAttribute("500, 400")] + public Size MainWindowSize + { + get { return (Size)this["MainWindowSize"]; } + set { this["MainWindowSize"] = value; } + } + + } + + public class amuleMainECHanler : amuleECHandler { + MainWindow m_owner = null; + public amuleMainECHanler(MainWindow o) + { + m_owner = o; + } + + public override void HandlePacket(ecProto.ecPacket packet) + { + ECOpCodes op = packet.Opcode(); + switch(op) { + case ECOpCodes.EC_OP_STATS: + m_owner.StatsReplyInvoke(packet); + break; + case ECOpCodes.EC_OP_DLOAD_QUEUE: + m_owner.DloadQueueReply(packet); + break; + case ECOpCodes.EC_OP_SHARED_FILES: + m_owner.SharedFilesReply(packet); + break; + case ECOpCodes.EC_OP_NOOP: + break; + default: + throw new Exception("Unhandled EC reply"); + } + } + } + + public class amuleListView : ListView { + protected int[] m_column_index; + + public amuleListView() + { + Dock = DockStyle.Fill; + View = View.Details; + DoubleBuffered = true; + FullRowSelect = true; + MultiSelect = true; + } + + public void LoadColumns(string [] columns, int [] width) + { + int i = 0; + foreach (string c in columns) { + if ( width[i] == 0 ) { + continue; + } + ColumnHeader h = new ColumnHeader(); + h.Text = c; + h.Width = width[i++]; + Columns.Add(h); + } + } + + public void CreateColumtAt(string name, int width, int index) + { + ColumnHeader h = new ColumnHeader(); + h.Text = name; + h.Width = width; + h.Tag = index; + Columns.Insert(m_column_index[index], h); + } + public void RemoveColumnAt(int index) + { + Columns.RemoveAt(m_column_index[index]); + } + + public void AppendItemToCtxMenu(ContextMenuStrip menu, string text, + object tag, bool check_state, EventHandler target) + { + ToolStripMenuItem it = new ToolStripMenuItem(text); + it.Click += target; + it.CheckState = check_state ? CheckState.Checked : CheckState.Unchecked; + it.Tag = tag; + menu.Items.Add(it); + } + } + + public class amuleSharedFilesList : amuleListView, IContainerUI { + public amuleSharedFilesList() + { + string[] columns = { "File name", "Size" }; + int[] width = { 300, 100, 100, 100 }; + LoadColumns(columns, width); + } + + #region IContainerUI Members + + delegate void UpdateCallback(); + void IContainerUI.MyEndUpdate() + { + if (InvokeRequired) { + UpdateCallback d = new UpdateCallback(EndUpdate); + Invoke(d); + } else { + EndUpdate(); + } + } + + void IContainerUI.MyBeginUpdate() + { + if (InvokeRequired) { + UpdateCallback d = new UpdateCallback(BeginUpdate); + Invoke(d); + } else { + BeginUpdate(); + } + } + + delegate void ItemCallback(SharedFileItem i); + + void IContainerUI.InsertItem(object i) + { + SharedFileItem it = i as SharedFileItem; + if (InvokeRequired) { + ItemCallback d = new ItemCallback(DoInsertItem); + Invoke(d, it); + } else { + DoInsertItem(it); + } + } + + void IContainerUI.UpdateItem(object i) + { + throw new Exception("The method or operation is not implemented."); + } + + void DoInsertItem(SharedFileItem i) + { + ListViewItem it = new ListViewItem(i.Name); + + it.SubItems.Add(new ListViewItem.ListViewSubItem(it, i.Size)); + + Items.Add(it); + + i.UiItem = it; + } + + void DoUpdateItem(SharedFileItem i) + { + ListViewItem it = i.UiItem as ListViewItem; + //Items + } + + #endregion + } +} \ No newline at end of file diff --git a/src/remote-gui.net/MainWindow.resx b/src/remote-gui.net/MainWindow.resx new file mode 100644 index 00000000..ff31a6db --- /dev/null +++ b/src/remote-gui.net/MainWindow.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/remote-gui.net/Program.cs b/src/remote-gui.net/Program.cs new file mode 100644 index 00000000..e2355b94 --- /dev/null +++ b/src/remote-gui.net/Program.cs @@ -0,0 +1,44 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003-2008 lfroen ( lfroen@gmail.com / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace amule.net +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainWindow()); + } + } +} \ No newline at end of file diff --git a/src/remote-gui.net/Properties/AssemblyInfo.cs b/src/remote-gui.net/Properties/AssemblyInfo.cs new file mode 100755 index 00000000..f40036ce --- /dev/null +++ b/src/remote-gui.net/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("amule-remote.net")] +[assembly: AssemblyDescription("aMule remote control")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("remote-gui.net")] +[assembly: AssemblyCopyright("Copyright © 2007-2008 aMule Team")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("717566ab-386c-42db-a3cf-bb2b5cd0939d")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("0.0.1.0")] +[assembly: AssemblyFileVersion("0.0.1.0")] diff --git a/src/remote-gui.net/Properties/Resources.Designer.cs b/src/remote-gui.net/Properties/Resources.Designer.cs new file mode 100755 index 00000000..e45f6b35 --- /dev/null +++ b/src/remote-gui.net/Properties/Resources.Designer.cs @@ -0,0 +1,126 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.832 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace amule.net.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("amule.net.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + internal static System.Drawing.Bitmap Toolbar_About { + get { + object obj = ResourceManager.GetObject("Toolbar_About", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap Toolbar_Disconnect { + get { + object obj = ResourceManager.GetObject("Toolbar_Disconnect", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap Toolbar_Import { + get { + object obj = ResourceManager.GetObject("Toolbar_Import", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap Toolbar_Network { + get { + object obj = ResourceManager.GetObject("Toolbar_Network", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap Toolbar_Prefs { + get { + object obj = ResourceManager.GetObject("Toolbar_Prefs", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap Toolbar_Search { + get { + object obj = ResourceManager.GetObject("Toolbar_Search", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap Toolbar_Shared { + get { + object obj = ResourceManager.GetObject("Toolbar_Shared", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap Toolbar_Stats { + get { + object obj = ResourceManager.GetObject("Toolbar_Stats", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap Toolbar_Transfers { + get { + object obj = ResourceManager.GetObject("Toolbar_Transfers", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/src/remote-gui.net/Properties/Resources.resx b/src/remote-gui.net/Properties/Resources.resx new file mode 100755 index 00000000..090df9b7 --- /dev/null +++ b/src/remote-gui.net/Properties/Resources.resx @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\images\Toolbar_About.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\images\Toolbar_Disconnect.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\images\Toolbar_Import.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\images\Toolbar_Network.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\images\Toolbar_Prefs.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\images\Toolbar_Search.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\images\Toolbar_Shared.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\images\Toolbar_Stats.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\images\Toolbar_Transfers.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/src/remote-gui.net/Properties/Settings.Designer.cs b/src/remote-gui.net/Properties/Settings.Designer.cs new file mode 100755 index 00000000..737b7d2f --- /dev/null +++ b/src/remote-gui.net/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.832 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace amule.net.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/src/remote-gui.net/Properties/Settings.settings b/src/remote-gui.net/Properties/Settings.settings new file mode 100755 index 00000000..abf36c5d --- /dev/null +++ b/src/remote-gui.net/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/remote-gui.net/SearchControl.Designer.cs b/src/remote-gui.net/SearchControl.Designer.cs new file mode 100755 index 00000000..949686fc --- /dev/null +++ b/src/remote-gui.net/SearchControl.Designer.cs @@ -0,0 +1,106 @@ +namespace amule.net { + partial class amuleSearchControl { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if ( disposing && (components != null) ) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.textBoxSearch = new System.Windows.Forms.TextBox(); + this.buttonStartSearch = new System.Windows.Forms.Button(); + this.comboBoxType = new System.Windows.Forms.ComboBox(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.AutoSize = true; + this.tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.tableLayoutPanel1.ColumnCount = 3; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 44.69027F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 94F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 55.30973F)); + this.tableLayoutPanel1.Controls.Add(this.textBoxSearch, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.buttonStartSearch, 2, 0); + this.tableLayoutPanel1.Controls.Add(this.comboBoxType, 1, 0); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 3; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 12.77533F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 87.22467F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(452, 248); + this.tableLayoutPanel1.TabIndex = 0; + // + // textBoxSearch + // + this.textBoxSearch.Location = new System.Drawing.Point(3, 3); + this.textBoxSearch.Name = "textBoxSearch"; + this.textBoxSearch.Size = new System.Drawing.Size(153, 20); + this.textBoxSearch.TabIndex = 2; + // + // buttonStartSearch + // + this.buttonStartSearch.Location = new System.Drawing.Point(256, 3); + this.buttonStartSearch.Name = "buttonStartSearch"; + this.buttonStartSearch.Size = new System.Drawing.Size(60, 20); + this.buttonStartSearch.TabIndex = 3; + this.buttonStartSearch.Text = "Search"; + this.buttonStartSearch.UseVisualStyleBackColor = true; + // + // comboBoxType + // + this.comboBoxType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxType.FormattingEnabled = true; + this.comboBoxType.Items.AddRange(new object[] { + "Local", + "Global", + "Kad"}); + this.comboBoxType.Location = new System.Drawing.Point(162, 3); + this.comboBoxType.Name = "comboBoxType"; + this.comboBoxType.Size = new System.Drawing.Size(70, 21); + this.comboBoxType.TabIndex = 4; + // + // amuleSearchControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.tableLayoutPanel1); + this.Name = "amuleSearchControl"; + this.Size = new System.Drawing.Size(452, 248); + this.tableLayoutPanel1.ResumeLayout(false); + this.tableLayoutPanel1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.TextBox textBoxSearch; + private System.Windows.Forms.Button buttonStartSearch; + private System.Windows.Forms.ComboBox comboBoxType; + } +} diff --git a/src/remote-gui.net/SearchControl.cs b/src/remote-gui.net/SearchControl.cs new file mode 100755 index 00000000..6ee01d18 --- /dev/null +++ b/src/remote-gui.net/SearchControl.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; + +namespace amule.net { + public partial class amuleSearchControl : UserControl { + public amuleSearchControl() + { + InitializeComponent(); + } + } +} diff --git a/src/remote-gui.net/SearchControl.resx b/src/remote-gui.net/SearchControl.resx new file mode 100755 index 00000000..ff31a6db --- /dev/null +++ b/src/remote-gui.net/SearchControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/remote-gui.net/amuleData.cs b/src/remote-gui.net/amuleData.cs new file mode 100755 index 00000000..513c9f94 --- /dev/null +++ b/src/remote-gui.net/amuleData.cs @@ -0,0 +1,723 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2003-2008 lfroen ( lfroen@gmail.com / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// +using System; +using System.IO; +using System.Collections.Generic; +using System.Security.Cryptography; + +namespace amule.net +{ + public class FileGap : IComparable { + public Int64 m_start, m_end; + + public int CompareTo(object obj) + { + if ( obj is FileGap ) { + FileGap temp = (FileGap)obj; + return m_start.CompareTo(temp.m_start); + } + throw new ArgumentException("object is not a FileGap"); + } + } + + public class RGB { + public byte m_R, m_G, m_B; + + unsafe public void WriteToBuffAlpha(UInt32* ptr) + { + UInt32 val = (UInt32)((m_R << 16) | (m_G << 8) | m_B); + val |= 0xff000000; + *ptr = val; + } + + unsafe public void WriteToBuffWithModifier(UInt32* ptr, byte modif) + { + byte R = (m_R > modif) ? (byte)(m_R - modif) : (byte)0; + byte G = (m_G > modif) ? (byte)(m_G - modif) : (byte)0; + byte B = (m_B > modif) ? (byte)(m_B - modif) : (byte)0; + UInt32 val = (UInt32)((R << 16) | (G << 8) | B); + val |= 0xff000000; + *ptr = val; + } + + public Int32 Color + { + get { return (Int32)((m_R << 16) | (m_G << 8) | m_B); } + set + { + m_R = (byte)(value >> 16); + m_G = (byte)((value >> 8) & 0xff); + m_B = (byte)(value & 0xff); + } + } + + } + + public class FileColoredGap : FileGap { + public Int32 m_color; + + } + + public class GapBuffer { + public FileGap[] m_buffer; + + public GapBuffer(byte[] raw_buffer, int size) + { + BinaryReader br = new BinaryReader(new MemoryStream(raw_buffer)); + int bufsize = size / (2 * sizeof(Int64)); + m_buffer = new FileGap[bufsize]; + for ( int i = 0; i < bufsize; i++ ) { + m_buffer[i] = new FileGap(); + m_buffer[i].m_start = System.Net.IPAddress.NetworkToHostOrder(br.ReadInt64()); + m_buffer[i].m_end = System.Net.IPAddress.NetworkToHostOrder(br.ReadInt64()); + } + System.Array.Sort(m_buffer); + } + } + + public class ColoredGapBuffer { + public FileColoredGap[] m_buffer; + + public ColoredGapBuffer(int size) + { + m_buffer = new FileColoredGap[size]; + for ( int i = 0; i < size; i++ ) { + m_buffer[i] = new FileColoredGap(); + } + m_buffer[0].m_start = 0; + m_buffer[0].m_end = 0; + m_buffer[0].m_color = 0; + } + } + + /// + /// RLE implementation. I need only decoder part + /// + public class RLE_Data { + bool m_use_diff; + int m_len; + byte[] m_enc_buff; + byte[] m_buff; + + public RLE_Data(int len, bool use_diff) + { + m_len = len; + m_use_diff = use_diff; + // in worst case 2-byte sequence encoded as 3. So, data can grow at 1/3 + m_enc_buff = new byte[m_len*4/3 + 1]; + m_buff = new byte[m_len]; + } + + public byte[] Buffer + { + get { return m_buff; } + } + + public int Length + { + get { return m_len; } + } + + public void Realloc(int size) + { + if ( size == m_len ) { + return; + } + + if ( (size > m_len) && (size > m_buff.Length) ) { + m_buff = new byte[size]; + m_enc_buff = new byte[size * 4 / 3 + 1]; + } + m_len = size; + } + + public void Decode(byte [] buff, int start_offset) + { + int len = buff.Length; + + int i = start_offset, j = 0; + while ( j != m_len ) { + if ( i < (len -1) ) { + if (buff[i+1] == buff[i]) { + // this is sequence + //memset(m_enc_buff + j, buff[i], buff[i + 2]); + for(int k = 0; k < buff[i + 2]; k++) { + m_enc_buff[j + k] = buff[i]; + } + j += buff[i + 2]; + i += 3; + } else { + // this is single byte + m_enc_buff[j++] = buff[i++]; + } + } else { + // only 1 byte left in encoded data - it can't be sequence + m_enc_buff[j++] = buff[i++]; + // if there's no more data, but buffer end is not reached, + // it must be error in some point + if ( j != m_len ) { + Console.WriteLine("RLE_Data: decoding error. {0} bytes decoded to {1} instead of {2}", + len, j, m_len); + throw new Exception("RLE_Data: decoding error"); + } + } + } + if ( m_use_diff ) { + for (int k = 0; k < m_len; k++) { + m_buff[k] ^= m_enc_buff[k]; + } + } + } + } + + public class PartFileEncoderData { + public RLE_Data m_part_status; + public RLE_Data m_gap_status; + + public PartFileEncoderData(int partcount, int gapcount) + { + m_part_status = new RLE_Data(partcount+1, true); + m_gap_status = new RLE_Data(gapcount*sizeof(Int64)+1, true); + } + + public void Decode(byte [] gapdata, byte [] partdata) + { + m_part_status.Decode(partdata, 0); + + // in a first dword - real size + //uint32 gapsize = ENDIAN_NTOHL(RawPeekUInt32(gapdata)); + //gapdata += sizeof(uint32); + //m_gap_status.Realloc(gapsize * 2 * sizeof(uint64)); + Int32 gapsize = System.Net.IPAddress.NetworkToHostOrder( + (Int32)gapdata[0] | ((Int32)gapdata[1] << 8) | + ((Int32)gapdata[2] << 16) | ((Int32)gapdata[3] << 24)); + + m_gap_status.Realloc(gapsize*2*sizeof(Int64)); + m_gap_status.Decode(gapdata, 4); + } + } + + // + // I: ID for this kind of tag + class amuleTag2ItemConnector { + virtual public I ID(ecProto.ecTag tag) + { + return default(I); + } + + virtual public ecProto.ecTag CreateTag(I value) + { + return null; + } + } + + public interface IContainerUI { + void MyEndUpdate(); + void MyBeginUpdate(); + + void InsertItem(object i); + void UpdateItem(object i); + } + + // + // T: item in container + abstract public class amuleGenericContainer { + private enum REQ_STATE { IDLE, REQ_SENT, FULL_REQ_SENT }; + REQ_STATE m_state = REQ_STATE.IDLE; + + LinkedList m_items = new LinkedList(); + Dictionary m_items_hash = new Dictionary(32); + + ECOpCodes m_req_cmd; + + ECTagNames m_item_tagname; + + bool m_inc_tags = true; + + protected IContainerUI m_owner; + + public amuleGenericContainer(ECOpCodes req_cmd, ECTagNames item_tagname, IContainerUI owner) + { + m_owner = owner; + m_req_cmd = req_cmd; + m_item_tagname = item_tagname; + } + + protected virtual bool Phase1Done() + { + return true; + } + + public LinkedList Items + { + get { return m_items; } + } + + protected virtual ecProto.ecTag CreateItemTag(ecProto.ecMD5 id) + { + return null; + } + + public ecProto.ecPacket ReQuery() + { + // can not issue new query until previous one is replied + if ( m_state != REQ_STATE.IDLE ) { + return null; + } + + ecProto.ecPacket request = new ecProto.ecPacket(m_req_cmd, + m_inc_tags ? EC_DETAIL_LEVEL.EC_DETAIL_INC_UPDATE : EC_DETAIL_LEVEL.EC_DETAIL_UPDATE); + m_state = REQ_STATE.REQ_SENT; + + return request; + } + + void ProcessUpdate(ecProto.ecPacket packet, ecProto.ecPacket full_req) + { + m_owner.MyBeginUpdate(); + LinkedList.Enumerator i = packet.GetTagIterator(); + while (i.MoveNext()) + { + ecProto.ecTag t = i.Current; + // sometimes reply contains additional tags + if ( t.Name() != m_item_tagname ) { + continue; + } + ecProto.ecMD5 item_id = ((ecProto.ecTagMD5)t).ValueMD5(); + if ( m_items_hash.ContainsKey(item_id) ) { + T item = m_items_hash[item_id]; + ProcessItemUpdate(item, t); + + if ( m_owner != null ) { + m_owner.UpdateItem(item); + } + } else { + if ( m_inc_tags ) { + T item = CreateItem(t); + m_items.AddLast(item); + m_items_hash[item_id] = item; + + if (m_owner != null) { + m_owner.InsertItem(item); + } + + } else { + full_req.AddSubtag(CreateItemTag(item_id)); + } + } + // + // now process item deletion + // + // TODO + } + m_owner.MyEndUpdate(); + } + + // + // derived class must provide + // + abstract protected void ProcessItemUpdate(T item, ecProto.ecTag tag); + + abstract protected T CreateItem(ecProto.ecTag tag); + + public ecProto.ecPacket HandlePacket(ecProto.ecPacket p) + { + ecProto.ecPacket reply = null; + switch (m_state) { + case REQ_STATE.IDLE: + throw new Exception("Should not get packet in IDLE state"); + case REQ_STATE.REQ_SENT: + m_state = REQ_STATE.IDLE; + if ( !Phase1Done() ) { + break; + } + ecProto.ecPacket full_request = new ecProto.ecPacket(m_req_cmd); + ProcessUpdate(p, full_request); + + // // Phase 3: request full info about files we don't have yet + if ( !m_inc_tags && (full_request.SubtagCount() != 0)) { + reply = full_request; + m_state = REQ_STATE.FULL_REQ_SENT; + } + + break; + case REQ_STATE.FULL_REQ_SENT: + m_state = REQ_STATE.IDLE; + break; + } + return reply; + } + } + + public class amuleFileItem { + protected ecProto.ecMD5 m_id; + + protected string m_filename; + protected Int64 m_filesize; + + protected const Int32 FILE_PARTSIZE = 9728000; + object m_ui_item; + + public amuleFileItem(ecProto.ecMD5 id, string name, Int64 size) + { + m_id = id; + m_filename = name; + m_filesize = size; + } + + public ecProto.ecMD5 ID + { + get { return m_id; } + } + + public string ValueToPrefix(Int64 value) + { + if (value < 1024) + { + return string.Format("{0} bytes", value); + } + else if (value < 1048576) + { + return string.Format("{0:f} Kb", ((float)value) / 1024); + } + else if (value < 1073741824) + { + return string.Format("{0:f} Mb", ((float)value) / 1048576); + } + else + { + return string.Format("{0:f} Gb", ((float)value) / 1073741824); + } + } + + public string Name + { + get { return m_filename; } + } + + public string Size + { + get { return ValueToPrefix(m_filesize); } + } + public object UiItem + { + get { return m_ui_item; } + set { m_ui_item = value; } + } + } + + public class DownloadQueueItem : amuleFileItem { + Int64 m_size_xfered, m_size_done; + Int32 m_speed; + + Int32 m_src_count, m_non_current_src_count, m_xfer_src_count, m_a4af_src_count; + + PartFileEncoderData m_decoder; + + // + // Used for colored status + // + ColoredGapBuffer m_color_gap_buff; + GapBuffer m_req_parts; + + // + // Format24BppRgb or similar + // + RGB[] m_color_line; + + public static byte[] m_modifiers; + + public RGB [] ColorLine + { + get { return m_color_line; } + } + + public static byte[] Get_3D_Modifiers() + { + return m_modifiers; + } + + public DownloadQueueItem(ecProto.ecMD5 id, string name, Int64 size, PartFileEncoderData encoder) + : base(id, name, size) + { + m_decoder = encoder; + m_color_gap_buff = new ColoredGapBuffer((Int32)(size / FILE_PARTSIZE) + 1 + 1); + } + + public static void InitDraw3DModifiers(int height) + { + if ( m_modifiers != null && m_modifiers.Length == height ) { + return; + } + m_modifiers = new byte[height]; + for ( int i = 0; i < height; i++ ) { + double curr_mod = 30 * (1 + System.Math.Cos((2*System.Math.PI)*(height-(((double)i)/height)))); + m_modifiers[i] = (byte)System.Math.Floor(curr_mod); + } + } + + public void AllocColorLine(int size) + { + m_color_line = new RGB[size]; + for ( int i = 0; i < m_color_line.Length; i++ ) { + m_color_line[i] = new RGB(); + } + } + + public void UpdateItem(ecProto.ecTag tag) + { + ecProto.ecTagInt itag = (ecProto.ecTagInt)tag.SubTag(ECTagNames.EC_TAG_PARTFILE_SIZE_DONE); + if ( itag != null ) { + m_size_done = itag.Value64(); + } + itag = (ecProto.ecTagInt)tag.SubTag(ECTagNames.EC_TAG_PARTFILE_SIZE_XFER); + if ( itag != null ) { + m_size_xfered = itag.Value64(); + } + + itag = (ecProto.ecTagInt)tag.SubTag(ECTagNames.EC_TAG_PARTFILE_SPEED); + if ( itag != null ) { + m_speed = (Int32)itag.Value64(); + } + + itag = (ecProto.ecTagInt)tag.SubTag(ECTagNames.EC_TAG_PARTFILE_SOURCE_COUNT); + if ( itag != null ) { + m_src_count = (Int32)itag.Value64(); + } + + itag = (ecProto.ecTagInt)tag.SubTag(ECTagNames.EC_TAG_PARTFILE_SOURCE_COUNT_A4AF); + if ( itag != null ) { + m_a4af_src_count = (Int32)itag.Value64(); + } + + itag = (ecProto.ecTagInt)tag.SubTag(ECTagNames.EC_TAG_PARTFILE_SOURCE_COUNT_NOT_CURRENT); + if ( itag != null ) { + m_non_current_src_count = (Int32)itag.Value64(); + } + + itag = (ecProto.ecTagInt)tag.SubTag(ECTagNames.EC_TAG_PARTFILE_SOURCE_COUNT_XFER); + if ( itag != null ) { + m_xfer_src_count = (Int32)itag.Value64(); + } + + ecProto.ecTagCustom gapstat = (ecProto.ecTagCustom)tag.SubTag(ECTagNames.EC_TAG_PARTFILE_GAP_STATUS); + ecProto.ecTagCustom partstat = (ecProto.ecTagCustom)tag.SubTag(ECTagNames.EC_TAG_PARTFILE_PART_STATUS); + m_decoder.Decode(gapstat.Value(), partstat.Value()); + + ecProto.ecTagCustom reqstat = (ecProto.ecTagCustom)tag.SubTag(ECTagNames.EC_TAG_PARTFILE_REQ_STATUS); + BinaryReader br = new BinaryReader(new MemoryStream(reqstat.Value())); + + m_req_parts = new GapBuffer(reqstat.Value(), reqstat.Value().Length); + DrawLine(); + } + + public void DrawLine() + { + GapBuffer status_gaps = new GapBuffer(m_decoder.m_gap_status.Buffer, m_decoder.m_gap_status.Length); + byte[] part_info = m_decoder.m_part_status.Buffer; + + int colored_gaps_size = 0; + for ( int j = 0; j < status_gaps.m_buffer.Length; j++ ) { + Int64 gap_start = status_gaps.m_buffer[j].m_start; + Int64 gap_end = status_gaps.m_buffer[j].m_end; + Int64 start = gap_start / FILE_PARTSIZE; + Int64 end = (gap_end / FILE_PARTSIZE) + 1; + + // + // Order is RGB + // + Int32 color = 0xff0000; + for ( Int64 i = start; i < end; i++ ) { + if ( part_info[i] != 0 ) { + int blue = 210 - (22 * (part_info[i] - 1)); + if ( blue < 0 ) { blue = 0; } + color = (blue << 8) | 255; + } + Int64 fill_gap_begin = ((i == start) ? gap_start : FILE_PARTSIZE * i); + Int64 fill_gap_end = ((i == (end - 1)) ? gap_end : FILE_PARTSIZE * (i + 1)); + + if ( (m_color_gap_buff.m_buffer[colored_gaps_size].m_end == fill_gap_begin) && + (m_color_gap_buff.m_buffer[colored_gaps_size].m_color == color) ) { + m_color_gap_buff.m_buffer[colored_gaps_size].m_end = fill_gap_end; + } else { + colored_gaps_size++; + m_color_gap_buff.m_buffer[colored_gaps_size].m_start = fill_gap_begin; + m_color_gap_buff.m_buffer[colored_gaps_size].m_end = fill_gap_end; + m_color_gap_buff.m_buffer[colored_gaps_size].m_color = color; + } + } + } + // + // Now actual drawing + // + int width = m_color_line.Length; + for ( int i = 0; i < width; i++ ) { + m_color_line[i].Color = 0x7f7f7f; + } + if ( m_filesize < width ) { + // + // if file is that small, draw it in single step + // + if ( m_req_parts.m_buffer.Length != 0 ) { + for ( int i = 0; i < width; i++ ) { + // yellow + m_color_line[i].Color = 0xffd000; + } + } else if ( m_color_gap_buff.m_buffer.Length != 0 ) { + for ( int i = 0; i < width; i++ ) { + m_color_line[i].Color = m_color_gap_buff.m_buffer[i].m_color; + } + } + } else { + Int32 factor = (Int32)(m_filesize / width); + for ( int i = 1; i <= colored_gaps_size; i++ ) { + Int32 start = (Int32)(m_color_gap_buff.m_buffer[i].m_start / factor); + Int32 end = (Int32)(m_color_gap_buff.m_buffer[i].m_end / factor); + for ( Int32 j = start; j < end; j++ ) { + m_color_line[j].Color = m_color_gap_buff.m_buffer[i].m_color; + } + } + foreach ( FileGap g in m_req_parts.m_buffer ) { + Int32 start = (Int32)(g.m_start / factor); + Int32 end = (Int32)(g.m_end / factor); + for ( Int32 j = start; j < end; j++ ) { + m_color_line[j].Color = 0xffd000; + } + } + } + } + + public string SizeDone + { + get { return ValueToPrefix(m_size_done); } + } + public string Speed + { + get { return (m_speed == 0) ? "" : (ValueToPrefix(m_speed) + "/s"); } + } + public string PercentDone + { + get { return String.Format("{0} %", m_size_done * 100 / m_filesize); } + } + public string Sources + { + get + { + string result; + if (m_non_current_src_count != 0) { + result = String.Format("{0} / {1}", + m_src_count - m_non_current_src_count, m_src_count); + } else { + result = String.Format("{0}", m_src_count); + } + if (m_a4af_src_count != 0) { + result += String.Format(" +{0}", m_a4af_src_count); + } + if ( m_xfer_src_count != 0 ) { + result += String.Format(" ({0})", m_xfer_src_count); + } + return result; + } + } + } + + public class DownloadQueueContainer : amuleGenericContainer { + Dictionary m_enc_map; + + private int m_new_item_status_length; + + public int NewItemStatusLineLength + { + get { return m_new_item_status_length; } + set { m_new_item_status_length = value; } + } + + public DownloadQueueContainer(IContainerUI owner) + : base(ECOpCodes.EC_OP_GET_DLOAD_QUEUE, ECTagNames.EC_TAG_PARTFILE, owner) + { + m_enc_map = new Dictionary(); + } + + override protected void ProcessItemUpdate(DownloadQueueItem item, ecProto.ecTag tag) + { + item.UpdateItem(tag); + + ecProto.ecMD5 id = ((ecProto.ecTagMD5)tag).ValueMD5(); + if ( !m_enc_map.ContainsKey(id) ) { + throw new Exception("No RLE decoder for download queue item"); + } + } + + override protected DownloadQueueItem CreateItem(ecProto.ecTag tag) + { + ecProto.ecMD5 id = ((ecProto.ecTagMD5)tag).ValueMD5(); + string filename = ((ecProto.ecTagString)tag.SubTag(ECTagNames.EC_TAG_PARTFILE_NAME)).StringValue(); + Int64 filesize = (Int64)((ecProto.ecTagInt)tag.SubTag(ECTagNames.EC_TAG_PARTFILE_SIZE_FULL)).Value64(); + + PartFileEncoderData e = new PartFileEncoderData((int)(filesize / 9728000), 10); + m_enc_map[id] = e; + + DownloadQueueItem i = new DownloadQueueItem(id, filename, filesize, e); + + i.AllocColorLine(m_new_item_status_length); + + i.UpdateItem(tag); + + return i; + } + } + + public class SharedFileItem : amuleFileItem { + public SharedFileItem(ecProto.ecMD5 id, string name, Int64 size) + : base(id, name, size) + { + } + } + + class SharedFileListContainer : amuleGenericContainer + { + public SharedFileListContainer(IContainerUI owner) + : base(ECOpCodes.EC_OP_GET_SHARED_FILES, ECTagNames.EC_TAG_KNOWNFILE, owner) + { + } + + override protected void ProcessItemUpdate(SharedFileItem item, ecProto.ecTag tag) + { + } + + override protected SharedFileItem CreateItem(ecProto.ecTag tag) + { + ecProto.ecMD5 id = ((ecProto.ecTagMD5)tag).ValueMD5(); + string filename = ((ecProto.ecTagString)tag.SubTag(ECTagNames.EC_TAG_PARTFILE_NAME)).StringValue(); + Int64 filesize = (Int64)((ecProto.ecTagInt)tag.SubTag(ECTagNames.EC_TAG_PARTFILE_SIZE_FULL)).Value64(); + SharedFileItem i = new SharedFileItem(id, filename, filesize); + + //i.UpdateItem(tag); + + return i; + } + } + +} \ No newline at end of file diff --git a/src/remote-gui.net/amuleRemote.cs b/src/remote-gui.net/amuleRemote.cs new file mode 120000 index 00000000..49b7c148 --- /dev/null +++ b/src/remote-gui.net/amuleRemote.cs @@ -0,0 +1 @@ +../libs/ec/c#/amuleRemote.cs \ No newline at end of file diff --git a/src/remote-gui.net/ecProto.cs b/src/remote-gui.net/ecProto.cs new file mode 120000 index 00000000..e9dc8960 --- /dev/null +++ b/src/remote-gui.net/ecProto.cs @@ -0,0 +1 @@ +../libs/ec/c#/ecProto.cs \ No newline at end of file diff --git a/src/remote-gui.net/images/Toolbar_About.png b/src/remote-gui.net/images/Toolbar_About.png new file mode 100644 index 0000000000000000000000000000000000000000..dbe93204d6cdb1fb9efac146b198de585ee060b0 GIT binary patch literal 1517 zcwPbR1rqv+P)v1GX{D@MC_y_wGGiyayq8Fq5WI z7wwU*^mKLKIp6a=Kkm8kzb>kkLuaP0DWF>^HR`!~!c9112}ciTrEO!?1yaRl=JaeV|tpJQ(diz3GHucNFzTD(+e}`5|A%GP@M6mY25+O8}&{!UBlrXS+*V zGC|7IlxrcSodzq9D?E5oq1FfyfmAY~2YYivTB++#O4ZkZ8!a&~dg<*8Lw&h-UmWQf z(psT_L_+h*`C&#*c9HZvT+hYP8l@E0T7n>;QmwK0&kbfjTVwS}C1S)zVOd?@y}!9# zd-d*(*XIt~a}Fn5M<(^_(*yZ)p6e(OL_jOWxzT<`275`k9##~gjqoQuk7UxLJ)Nef zGfl2dbLYz~>b{9{1rl0kYmM;v>V8OncLvW*;CU`xnG_EmZ?n2l!5F*efU;Ib$~FJ*`4@lo zkK&z=n&v=vI^|yO%eQM|1qCP-c^O#CZ*Q$23hIq;-!l3#{N;QSAUQA&|cr#RV@ zK^7k)0@g+#a_ycj?l_nIz{~<0PXSPh(R{9L9HO71Jw?O=l3fON_o_X9I}5P;rC;^>L?HaBl6est8-&K}SA+cu_*hc_TB`xq(M0i=nEt25Sc@@&9~!m4trTvE0Lih`9 zCwp;SmnX$C)9-!4XLlYw%Q!%;DF7?7;|B)M)gY1gL15UeHrOgRC|CU`H$+G!6I}e! z5Z`@a0MGN-snnVN%`HAzSS2*}xcg_PDF9<_q2Y&U?Gl6`JLLw&of?g}p&XRHt~Ope zJ3uOxLIh_2e2>{rSMUSV$_-p-4#3D_rS7v^^(pN}hL4i|e3}zI9cZm7?Ns>P{1;Sf zL8~*!;t>Gs{CcrkG*N3F9P#T0SGLG#x4LqK2FQs zLWwu8{~;<@D^%)XtKKgFOGjPDo4`B3`GXDWuxPEA80+Dsu^zNmSS#H8Q-Ry}O2-+u zvHs1k>D&8=XSff6x%hB%07`N8bT5}KjPuG*&hhf(_ZU9W*^2SGcubR~0AdhjVES;T z9u_y@lFeqxX0v2684?MnmCT=RHX}Yo_43S>Ip8X=-b_<86Mmf_YoD2d>%i4mZ)+nN za1(e9cq?w5`k=A*e}9*cZ$CoE6Vb}U?W1Tf#LnFOx2EDVQ`aVeH-O1!CFV0?K7Ewu z-}qesTn5I0{4sUD5NG?he-|8n83Cif1TYqdCKvbiLfqlz<2rBoW%Pgfugkvx9U8hz6@9C6|JsA~8@#+Co%z)_J*V6h!#S8gCLE3RFh8Co%D zySW^0HUlCwDpeZg3eywQX8iO-b-q|ag}o`mlcTD&{~6$r$OaL9yyWWTnUy!K%y_N? zr75&DjrcXxZy*S`X>dIxKZq2Dsn!Ed{r+Ta^2|g{4O{O}eg3}#5RpR`-*>awZL8O= z^72_5GyX18p2f02EI}*~X?IZtHK0b(-T~yQ>zJ!FIq~|Rs*Orz{~d;1TtRFxfQTFx zjun;+t^fFEuJ`Oqcbtnvy= zhSndl*t<}#3*hG>qv>qsYahG$!(RB_NpyY|iKi*j2_cA0B5pbHZ%ewvBcOA$n0Nll zs!x5yb3N~?heS4AF$6yq>2Zbe8`rKL%+{u1`eK)WWrOWVGW*s&5kWPw+yqJ(DkfCI zp!=Q-EM?vs_8~qbjuBW=?iC}KGzlB!Q&H1 zUjcyT^Uo4KwR^Dx#=?GhANCjS2Ebe#XLkL{wkv_6ULXFFt2zFwx5_D{Fsd3_01a5v zlgo)K5SB}zQD(Q!{u{3(Gf8dQinHzUDC0vgVJyD0Ee_znau`+Z8pq6)aBU@<%hG@~ zNeCR+I5M2igr#D)xPq!u{_cbLuf3QI?reMj`x{S0u{ILT{PP{+FCC<||Iv61MYRKB zrpUN=pVMu37<>=6qcu*6sF-L3K&pPR0I_;qR?zIziW(~F{IaTjKXpI zmaateUy8&{U@%58M%xfZ!GLKraMBJ2mL(xjWiXX;FbzLSs1D-Dg=i4d3@GpZGXASC zu<-C-I!I;DgP5klgnGr<8&!X(ei>8wzSn($500gy}}z2Rqf?Pz-3eU=S>_kL<_2?e0YY?uPsDzVj5J0kc3{ z!;UamDH^o~A`}w#v7Fr1HfcE1j_N*+4)soF6WqP1w}EP)>{?>KX?{zLtDIh>;R>2Z3Tfs5R&=g zT>yBaW2g~|ySFB}kcfwhmB~>m&6`kpGjSk*7p7+Bs${Z>0~)rS$nV%gcC;;CIeLKN zH@`yI3<>>^>784s9y^#k&u+e#{I{RzSg6|L;bobgE>#R1NdR0p?$;YMng(32I}9P@ zHr$yEUOw_OrXGHPuo+^4*lOQ!dB+yYM-L?LdFyUX`nMqH@u>SD)oNW_IGzBEs)iwa z@7%=2sx>eacWk$reUH;T`#z z28KC1ez6AZZ56Fu+i@DkS6=g>!Jg`TR0~)Osvn7v1!2u>e~_9{ z-kH4U|E<~lnDXg9h;$>(UWqf)jD3&Y1FW}e__)Vv9e4bL(`A&coFci~B;thDa31y%{be9q_FJdr*9XobBBFpk`fhd>Dg(OMXwvA<3z11|$-e=$TKz%^F zX_{Y^2Sq5vYb#c)i0W=*nkKR=<2cSuc75OPupPB}_3GCK1z=fLjIQf9^>we{e=3qB zVHie?G?-xz>el)Se*I)Lhu>I3V^#4@Hn!CT$k0Nc9>`z@wrv9tosi0u&u`?ykzMTl zK@R`gxstH10&ufRM%FK=v9gF zd+2PhM+-He1}lh)i6iI1Z*#V_+UGy-u^x_zw|>gKDPqNCHD`&u}MiEIqA`s zP~+??_2uggQ^(`+&^Ht%$;EwZ-{S2T=Tg(qMu)1Ck}-`DsrTcU2F*=%9DQ#Ok`ToD z1OYerhI%;u*0-oA{1XeG`7;r|=>DBBZ{kDB12dORPfwY&tJXM6ZDaKCjcggnxR`|+!#&{&8Py2P~U(~;a>>Vg`V>olqxbR;E$+Op&9-I7mxV|5n;v)9Yd z;o$8f&f^iniH(VMYhny#Mb$nU-bLMAzB2zqld zx`0l#16>W#(ow^Z*l21(LFRnrWyZ~24x&r>!&(S%ux%UJ7ZLTs{WF(FNJ2sg2}wwH zd?10!)*>WH7FiitG&eW1x9}Har!QgR$Q*2=leW4FQl~5;SW`%AV=X7^$Kw}mjN%yO zo&{WM(m;tJno5$!&Y`2F7GLZ=UF=2pktC^W3l!NCF=j+2N|ZxHK;Q`osj{_5beKU} zjaq_MHU4-vaS1WJTl@wGi*|#ekd!uyaXCwIa5!|y%QrUeWZo06P~&8hy~k?ncIp9>tmJ zzw?{-U%(fWh{qd)V;TtAO;u$D^YRO*HdCpuyH4J`d0ne@yQwLCzuyp-E!*U3%Ox&0 zoa`1Gfuc)Y)h**uB8hPMiBpCnkm(GoH?o=#xFe&8H_!9HgNpz-T~f}kx+kx0cE}09 z;a%S(DSa;9K*CKLVB2f85T3FRZy)2{l9A^pBJ8_9VV)XomnPL<~7 zAdYP@dEx|~_}b%a`tF8a06h{fAN{ep^(L8JC#P7JHQ8$MnrAPRR2%0%lluINtB8&q za?63@-G3hE>8GAX*E)FTz(IEJ*+Xt_Hla{Ex}kHXD@_U(l{<2#*`n zGyc&@6dsH#fhumlzs z%xB$(jpXKLqv{&ra2S{D!Y~XjUMQ#HaurcWkFh!!q$oF+sfC4jy!eQ2&DI#m;Oj^f|<;vm1*tXrJfc-Hr z(1{4Z<#G`S1n_#j7>0qSX~f0Fk(xRZP1CR}>xPHRGGzq?TqrFi914;5@yA5^{V0lp z=uS+70_g7uF3U2qEaUZh2OOVy?b?9f2Lli#Nm82-BG4nhmSv$R$}Ja@|E9Rz?)HJM zW>LV<88c>lF(oBs6A*b-c00000NkvXXu0mjf-K4#- literal 0 HcwPel00001 diff --git a/src/remote-gui.net/images/Toolbar_Network.png b/src/remote-gui.net/images/Toolbar_Network.png new file mode 100755 index 0000000000000000000000000000000000000000..096e8489584adb762d2bdb7ef6e6719e32d19c44 GIT binary patch literal 2464 zcwPaZ319Y!P)ZH!!18OMM3b>`0O?Ci|GOgr7(cKgCYZA+oFC|DFwF##2M z5imx-0BTGSVJSK-U!Ukff_E zil!8&2SsR6PdZ7%SG+x(Lj;Q6wOyDR7@8vP=omUE1;v`rq2WA7$7VTl zdWzzFl{48Xnj;~WwMGdSX8p0jk$YZ#`Io<6s%b0{*MQHz{`!F2f8f;bzjViE!W&k1 zV3|6$sS^!b=(>iXYed2pVOzsq{94n%GISC#8&i`^P8T_GdJ+*x>aLGe;F-2j9M64b zRoCVxGMTp;=XCWYFg-xeOD`RM;KtjobxczyJ3WsGB&BMDkz5gMhj~|{;e%~}kRTP* zJjq1Sqi;S zo+qg_1bqibd2?U{Uj*oePBh{WNJXXA;P1Pq*gbHD2fuYal^d=Iz4*r$z6$*A9RL9T z+IcX1QL>y*{RUUfg0QcN*3Hy`HmtDw&JpYe<(T-#jTY6W}s8va|Mo2gst6NP@ zOuCfo97xIWdoN3G#g_XNjIW|2xEl|m_nk_)Y=l%iI52|Hnwf^2q**AI`edSyra zod3=PY}s;eT={|V+CYxYD`P}-L32oFecEAs&O?ZRhU-(Vxm4=jB7jGw+MqCBK}xld zOF@)EDM`KFzz&5lEsJ8sWpZLp-?HW2=63+}_dhwWX<86*LY$haaq}nFa{1~wpqQAR zqg*P16jW;NLe^cXbq`lak}b_hDc=Jj)q-Ctl`4S@h(v6vz9di@_TnZKHen>2C(`T@7$KwtsT4v;d=apD<627P8m46uNX1mXfRqcfKL;g* zhuz}PWGR3G{7k;bglPKU?9|*f>2w=n(NGHLXo+x4Dc%|wCfuB0#qu_!R0M&-4*~)O zS6sdx*B3NApHitx*{@;f3#Ju95s8H8T@hzyECX=-J#7e}g!lBw(V?xq8`n5ZVUsro za|mCsye-Dno4PqMmS@-ABP8N6HmvU<))YYm65kJSeSzx>gphQtXr)#TVHg@hNUC+0 z)!l8_$|rv&SCxT$`hoz4VLpHS@QFumy7LB#6_26u66JE4Jp&m+w#hBmuBWpj&Oi1J zF*#j8GfaXYz!wtF4**3hY!FMuabqTysUreOJZh7OIUIU>7_U?{EzA7tdCjE&namrN zuAWb>JiVqt@L z#3JsPw8cZD+nQOOPOx%WoQZsa`H5+-JXiVCu2+AxpBSACK`~4JG95cn2m;5x3=T?)>b#PRPQ|i zK;*!Izx)Q_9vIrS+YRfAL~OxqK_D^h5K1@C?*-X>nZBbrUOAlQ;P4c+dV^@_Kh_dL zBI^y=6tOaE)-)f=X0uH|Gxe{T`@DUJhr^Ua6%@&)Ce~)N?yQzxTmXK_6rAp*umbE;IFpN&SvtHokr>d>J>XZGybGY8b) z49NB{QB_U-Ft zOe=BI$iTr)-?C-%ie={d?i6cRb+BziH#3C_fBySE^0^sWY%OSsIC>&!=UbE75yvqm zeczv{R4SRizP^)#gM&q&a!&01j^z%}3bX(%u~@A2{`>F0qPKVB70G1kV#{_?#bV7q zHJmf{?mfoLObMw1Pl)=QX;hDQcG{!qbh4OCCcRK7RQ7#8zkB!Y!JRvIjscUv`Q!Nq zT}%uh0mOmWVxBXQ1B7%v6n32EnCH#ceBbo|AMgyrXr$9=zon(ct=H>?Y&JXNy6z-U z1=LcJ4|6rs7X_OaA;ODku~5Quog^1$=CM%UDo_NiOxp=0000>YW--eBsD&0Ow>eQ`w_KNz@@td3T5jq zOJTpd_l^(1Wp`Q7G*x`?pKRvNIWu$qbLPxBvqDPAYC>66>;Dt@FAylo7xeV{tAMwF zHb6W;TfYFux;jrxtVjTOw|T?Hy^lY(8ATBYQJ6#a?U7Pi{X*YTN(P4p>iVx=`xtm8 zdmWLzP*1O4O{eco2Lb^{DwV=CO{A2ls*0j0?A!YsyLavROJjxlnM{WBpMR2(Qo6c2 zPb8M}K+EjxjN^%|tsFjd$PyZc!N}+cXV0Ex*R#73LU8=}ank8D00#~nVCT-A*7&1G zk7Al800$2q#OL#&sw(B~@}fvI(hB^z9D!}=RGPZ_hlxZZISQA{g<7OCHa13ebv47o z!spe;5%O){AvaASykR8~I3wft<+&DAFiv%<AUg=RRaEEzn5Ic|W(K>{Y5kl|C&5sV zb?d5$#-c=H5vxt6lQcJP;OdpD%*@WciYkC5?sw0}MJNU`i{{rNJ%;EnA$1ayzSn70jshWa{SF1wYxHB8gQZnyKrg+7*pVHkwNljt5Vjq4xD zDOiS-tSK!8z*C_U4Blvm#UO0ebuTbiL|U2}X=!R)QVCz}I+?TR!uae~Q51v_9Dd<> zOP*h#JRTk9Zh}Q%lUHB70oiRf6s7R{C7(oooB!>p@Bmcx^!n`!1S)jhi`{N7SpN&j zmU~Sv=b>yQlSx#y2*b#fSa~2E4r8;~{&tPOA6X$Ni^`RmXD@a?vU~{Oo3FohDnbaG zVHiWVZ%_Q=Mi($O6(yNUj(-2$51Ass4E!GGmQucLv)LM!o%H~bPNzqHyFPFlNQwD~ zF9UR-9B=}O6<4@Fn1BYPfV)5#n6MtDLI@k+0@lnAG9NGj1#kdKAPS_Ulv1p8R{sW8 e{h!gQ6ZjL&HnQOzDPki40000|JW_w48Qt z%aMty&C8EGxNh*FdjtNqW>?7N5FENm&1|t+x|l4cu3XJeo*zqY{LatMB!2tC&edIA zT}Y);{zM}2Jb>4h0^k>nqeqWAWm!Jm-QA7Z*;%~)-o&M}N`+nFb>m;(5n6w5(9`0P zMOolDUf?-icJR`w2BqGkNSq}|SCZ*MTNUs;an_RjdDq7Vf%#Lul;rEi2dg6iMMZ!b<`#@H`sc()!yKD zIRuAI8KaDurcHImPz6xsL8=^qPB@|$G$YS(oYfTYUi(e|SWXm0tXQ!EjIk&07y!T) zNs?gOHqKA0?nb{W)9QD6Oxw0?N_Ep@Wz%MwO`$Q$%9NoDpiEt0i+c0d(t0A z^P+9r@cDcI(6tmm?ME0Qgn&|tvQFKy%c0eYyl7GAoCOL{%2C)HM=Z*i$-qp;U|mQS z#z2S;FzQsqj9M`j!!Y1a~8+J;utf*VAzyd zSJG;9a#l@(LE#7?1jGs8=79x(E(hQ<+qN47L4eE2Yh_heawQ`#3Y-MM1f>Qi@POehsA4v!+~j4`oNsQ^H7IRJm3pP%2@($azl+UqfqQ3IE+ z7RERNr_U`x7J0+c?R>FnPM?n#MpN^e${1vha2y5d2w=|UiYvn%4I%(!G8tHwHFU=S zjIsAFU%q^>t*s5ud||ck`Cp76lMjsKipC5D@&NK2P_ThK81e+n28c+(Yyi}>DPJh4 z_wC=c*f$DE88WB?)u!ZS+vi=)$D*|#m|YV=4*r_+eVVv~|2{pF4UB9VweDgE)_;2;3t zN8i}yYIKs|$hp{KR>gEt0*Qb)U=xKWoQDUzAVjGeRqx29*tb_TI@bU2sm zX0CYmR5H_@n9h86&z9DfSHHDgn4im`uC5MVuNT#7wK*D%?g|Ej@5f>>Z83m(% z`T~L=e6(T1hBaHaZiUb1!}wGd?+jkHhsUy3u2dBOMjAa1d&j00;i;YXl12r{<#KR1 z9Eiu`ICt(G{C+=FRmF)DCnf>(_V@Q+x+4GpICA7jBc=3sb93{~&dyFWH8nv|6o{e- zp66lPHZ03Rxm<>(X-KEjIDPswcJJPeL?VG|wTe_K1)t9c#u(mx_uWFJQhDZs4?Z~g zxg}VTlP6D>AAb1ZW4f+S#pCg=OeW(kl}b=m6~$r^`FtMfbQ|IeMd*fQ{iwJ7rY*vUyqkpa41-TKFs{vTBxnswUt=hC{Q=8Z8UF~!_n+PGYZQF*f>)E-vx#Z~R zX#Bu|191Qh01b!3+X8{W@AmKC?^P59lu~qbbU>0M%*@Q-l~-Q5+TY*b%H0xtL4_I> zySuyHEiEmrZnt}#%jLSy<#O$)udm{paN5 z3O85rw6%Q4sX5n7P8sw%O8IDVc%jUShN&3 z)-611{aKCH!ce!{&2QVb?fZftJj)of0Q@=}4!;qJMCf8&P#cWL;(>1kxE;tsHWrlC p_$<2(Z}nNQYhTK4Gxz^1{{l@K_Ij~~K-~ZU002ovPDHLkV1i1lMwtKr literal 0 HcwPel00001 diff --git a/src/remote-gui.net/images/Toolbar_Shared.png b/src/remote-gui.net/images/Toolbar_Shared.png new file mode 100755 index 0000000000000000000000000000000000000000..0171b09fa2b02c488da603cdffeacab9c28a7bb0 GIT binary patch literal 1015 zcwPbb0|@+yP)+s^wa(Qec2WuE*swad-w0(C(ANK1Q8*GfQX=~s{nZR z?Ab?y!Qd|N^wt2PC|VpH9i_*|$A}2t`xQtTB}A*$YKq7gw+i6Bmz|v*vMeKnP>B*i zL@>r!W6Xnx4-7jBtTIrVUjzVXHk+;8 z-Ca7J4kbhsMHpj<n*37N7 zt2m!G-KYd2k`ISN`u+YY1DDN12$cH|^*30KB0Oy=f)09r9Lzp&cHER6%&y*LZ`BnfnGL-jSy=K|ltrJDjxB{T6*?2r= zI22x|cjcBAXE^G&&3JbS1 z2S{SWZ0^9zaXIGV9yrUgjI(J5?2*Lgynb(H>_sV@AQ$e7nvIy|MF{BM6#(a4p{k^< zcW7zC+1%e~qRPrZmy19Iya;*)yD^4oRum}13P1>9lIJ<&!qaZXWETKbm%CY138HIf z`*kF$jI-RU(U%o~qA2DfLR{~XrZr}ZfDeibN(jQ66=PjNl<~CCNa0A0LCEIL7^GSP@4br1!q(equnBn)maD$B^i4AHU*(w>!eZ_cYK$rX zsycDbnX`pZk1W|d;QXtZt~J){#w>dcFv&emLhaYbU%iB{D*#4B97($t)Q~$_eR8!r z-=z+7xwA4v4U8rWEM^8~HOtz^Xi@lRw5ao5oUAU7&9vDTJv})?)jtPzfYUXAe!u^- z?0uFvAM^Z=zh1+9a~YMBkVM_K^%MXA002ovPDHLkV1g=#;xqsN literal 0 HcwPel00001 diff --git a/src/remote-gui.net/images/Toolbar_Stats.png b/src/remote-gui.net/images/Toolbar_Stats.png new file mode 100755 index 0000000000000000000000000000000000000000..b62959e4f3d7871c986f24c6f112153561912ea8 GIT binary patch literal 1886 zcwPZs2ch_hP)-U0|+Dp3WA0}6@ieFRyc7|mpHW@J5HSS{_yVJ zJ2Qued%e4^od}^Y(&(O4AIEWY$i^<`y(gKDE}g8M^PBd1 z*U9K*rQiPM*KYwQLucKyVLS5y-m+t7r**DU;pAUve_)o`z*kQfIH{eHM)(1dq)$dsb8~Mp?@G? zdD)>Pf=Pv|Ch_*^fmffz-z#1f^&amPF^1V0kBGtdcybfs9D;T0b^#&`^a;Z|GAu4R zTpFEq9-3P30X%plS$m%dwCRh(%rK3Qv2R13-RfwEoy%IY`LfAQ;XJ}iVd?CQP#M*3DiPwdvLaY~@ zcGt0kR^*vqu5)Ll(N&|x=zTFY}!JB^}L>6u2XM%3WY4Cz6_I3m*_8t1P01wgZHpw z7!K?W`RGPWwc%+;j&@{eMV4mU5=C(ue+Lp^0zrMk--vm%2bz)6uCy@Kn888Aj^RA3 z%~ez(S8Q?n{wmKrU*L&d1+t|YvonGK17%OPpk(rbY6kB->P=FHttX1%USjFiSs)0R zjGn8$o33%VW<*uAH~x4$(^K9d84zzE|z3jAa0KFzk}xr0M|ZZc$aD9_dD z2OQd8=IApqr;iso^3)J!Gp0M^UOh{p&paB0B0?b-(3cItBsu=^T!mZnZ5l0j;kkf) zPxR4hd9K`0_U-bVd8wb#p+5e0^*&QGEz~QDPm7X*_gL@n*3w$@X&OERgtNES_|e-H zkPwjoF#*N|m>^)^lTdG34nEn(?Zp;1Z{@f;)8h1zK|Z)r=v=BX{5=N1yR!;;bGbAv{bKxGWR3r9J6uCKPX*6^EbIPK+%AYT1S*~PJ zJc>g_5OIhoNC2WBn%*JiAs(Pxsgh|hVh|G`#?WdT7VcWcwtH?b3Z5MEiy3N-kdL5TB)%4!}l9-{(S zR1Kn<-lTpbKQAd{`k;uJH0mfEG=ElL-luo1B74cZ0WIwlei$8p5c z^3n#yItr*N%~q4x##kF;W80x)Yq2)QIoJ6xj$`6>M4{N1A{$!GCdLT4d_FNMwzQ*& zLLrYa-7=jCGab6K>%C7}XxrOPTdZ?Qi@ia(<v$v^N>)f3Fm?-LotrvvG7}Jhzj1hygiNHq*2WZsl3=Iu&^ysmU^$Hw5e3;3} zN$T|mjYfn1{y~l%JB|^_T4Y--n0ArB4)p}F8qJ} zoT{p|*3C{|pZ>vx3xE0}u()3T4A2jhfE-)2YL8*~B&Ni`Do_KQZ1G~Za6kUht;y;5 Y4{P?sxg-E8IRF3v07*qoM6N<$g5g<-#{d8T literal 0 HcwPel00001 diff --git a/src/remote-gui.net/images/Toolbar_Transfers.png b/src/remote-gui.net/images/Toolbar_Transfers.png new file mode 100755 index 0000000000000000000000000000000000000000..d2adb7595c112e7870f932aa164d0e2aabf4e50a GIT binary patch literal 1504 zcwPbE1t0o}P)HYZ53YuY{Gbtez~Ls&Ts*`zY!V&adk%6l`e;#MhIIz7mm zwaj(BrsA1#3!MuMZgbhLqtFrdDl_}Zc zaDA!c`>z1}-)D{yMvAj5a^FZWB7hsdE0A15aE0rw7vXoj$je?n0;Er8ZNlhb1z5cr zf*_AA&3r9oTw*f+v-La#S7DU^W4KiR6XN1ySHh|_S;>+yxyv+3J z8S3}ua}Z2GNrfnv3(CboA_%Sszt$f{>ZGZ1&a?&TF$rSdu*5)ip)8#BNXEM_=B$Y+ zZ#)Cd0uYjcOMpp&-|+#$fe;Mf1}%4QAS>-9+1B3nX#CuE)8ID047m_xZ5H{d$G<@GhZUb@ryen^Fg z3szXyQWf*z*Xu){MKNpp#y!!>CE*XYz!rWe#lZj&0bDYCzITVEgA^TpPAnwb3}9#g zrA2zlKMGKxBrXJ$OW|&y6)K8@a{!Eih#&-m4pOwcShI&#iaBTS>)RlqAzchyGBCzK zhQI`S_`QHL0n6M0;{X>7QgLv}po0dCMV4!M69!5B7UvkP`~T-m^DI`lw(Zw6WnB4Q+yOjD}-uXk#PjSlE4VN794700W@HYZ+dH2zV}~ z0K^Qq02pH-O9G7PB^c4eey;iu0=f$U-G!iI^{!u-wV~f5km0wM5g^_zpRG&m=lHxm zu=mbyHsBc0eTNfwv7Q|P#lsqYf0(dppl3KCP{g?qh4w@SMAR<;0kFdw83!W5c~4xJ z2neSK{%>an6gD9u*iK;3SwP{3>if~&|MhXRobhKkM3~7KHa7i%6f`ztF0TaO6tG7iH z0k$2$(NhPyylqW82Q-r1OB%|ka^&20tEIhR@wAk5b*cVGRQoQ%a1D)awA)SSGCpv{ zASA;zpBr`U<(QZ-6Q|3Lbv5|vw!4d+JwpZnfci317CZaq6x+5R%Sc-yTl`h9=nh(~ zDi|JsPz+Lqs;5guVR7mjTrR(0Ro0dtaTht820WBLNES|@;}yE*`H`^+6K1A9A+CB) z08&G`ID}#libF__MH5${wzf`RxN@$%yWPoez6>)g02LLW$vNh`>c(qplgCa>7@wHJ zymmFD;=K@$k6Q+RyQUMTe`s-Roqgd8`1_p+2P37Qpp)Bn?(tJ4ccPq8NE?$4>0(e( z9BGMJh;c^a*oh;Z1o3RyF5DjUy_Aenz>T z-Vp^Ls@_eWF>@?5-)dS=S@VZ(tZOWB7waMbu81DfQ_{_#E~kAQ_wAgK&5UQhBR&>_ zCtcoc7X*W_`}7SRF8Mvx)*dW?ig4U_-FI(CIJ57w5B>!sR%iM1 literal 0 HcwPel00001 diff --git a/src/remote-gui.net/remote-gui.net.csproj b/src/remote-gui.net/remote-gui.net.csproj new file mode 100755 index 00000000..0b21600e --- /dev/null +++ b/src/remote-gui.net/remote-gui.net.csproj @@ -0,0 +1,140 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {DA4C427D-607A-4AB8-9C12-1B60AB283471} + WinExe + Properties + amule.net + amule-remote.net + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + true + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + true + + + + + + + + + + + + Form + + + AboutBox.cs + + + Form + + + AddLinkDialog.cs + + + + + Form + + + ConnectDlg.cs + + + Component + + + + + + Form + + + MainWindow.cs + + + + + Designer + AboutBox.cs + + + Designer + AddLinkDialog.cs + + + ConnectDlg.cs + Designer + + + MainWindow.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + Designer + SearchControl.cs + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + UserControl + + + SearchControl.cs + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/remote-gui.net/remote-gui.net.sln b/src/remote-gui.net/remote-gui.net.sln new file mode 100755 index 00000000..42f6f773 --- /dev/null +++ b/src/remote-gui.net/remote-gui.net.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual C# Express 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "remote-gui.net", "remote-gui.net.csproj", "{DA4C427D-607A-4AB8-9C12-1B60AB283471}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DA4C427D-607A-4AB8-9C12-1B60AB283471}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DA4C427D-607A-4AB8-9C12-1B60AB283471}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DA4C427D-607A-4AB8-9C12-1B60AB283471}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DA4C427D-607A-4AB8-9C12-1B60AB283471}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/src/skins/Makefile.am b/src/skins/Makefile.am new file mode 100644 index 00000000..73549953 --- /dev/null +++ b/src/skins/Makefile.am @@ -0,0 +1,9 @@ +dist_skin_DATA = \ + gnome.zip \ + kde4.zip \ + tango.zip \ + xfce.zip + +skindir = $(pkgdatadir)/skins + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/skins/Makefile.in b/src/skins/Makefile.in new file mode 100644 index 00000000..9a2c3c61 --- /dev/null +++ b/src/skins/Makefile.in @@ -0,0 +1,484 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/skins +DIST_COMMON = $(dist_skin_DATA) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(skindir)" +dist_skinDATA_INSTALL = $(INSTALL_DATA) +DATA = $(dist_skin_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +dist_skin_DATA = \ + gnome.zip \ + kde4.zip \ + tango.zip \ + xfce.zip + +skindir = $(pkgdatadir)/skins +MAINTAINERCLEANFILES = Makefile.in +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/skins/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/skins/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: +install-dist_skinDATA: $(dist_skin_DATA) + @$(NORMAL_INSTALL) + test -z "$(skindir)" || $(mkdir_p) "$(DESTDIR)$(skindir)" + @list='$(dist_skin_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(dist_skinDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(skindir)/$$f'"; \ + $(dist_skinDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(skindir)/$$f"; \ + done + +uninstall-dist_skinDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_skin_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(skindir)/$$f'"; \ + rm -f "$(DESTDIR)$(skindir)/$$f"; \ + done +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(skindir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-dist_skinDATA + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-dist_skinDATA uninstall-info-am + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-dist_skinDATA install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am uninstall uninstall-am uninstall-dist_skinDATA \ + uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/skins/gnome.zip b/src/skins/gnome.zip new file mode 100644 index 0000000000000000000000000000000000000000..c0f911466491a89eabd00bf01adc6cef5bdd2599 GIT binary patch literal 45194 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�R}3@zBKst7IrI`YKiARiI&$)8w8c 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 M;*RjEzrzau2TX4v`2YX_ literal 0 HcwPel00001 diff --git a/src/skins/kde4.zip b/src/skins/kde4.zip new file mode 100644 index 0000000000000000000000000000000000000000..777eb879b0bf64dab92f96d45da647f297df909f GIT binary patch literal 49922 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 z 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 bq9FKI6wU{oY&HS(urD8M002^X^6CEp@!x6( literal 0 HcwPel00001 diff --git a/src/skins/tango.zip b/src/skins/tango.zip new file mode 100644 index 0000000000000000000000000000000000000000..bdcfcc5f237802e5cffd987dad2e21369c7a0be8 GIT binary patch literal 47904 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 literal 0 HcwPel00001 diff --git a/src/updownclient.h b/src/updownclient.h new file mode 100644 index 00000000..f1da74b8 --- /dev/null +++ b/src/updownclient.h @@ -0,0 +1,885 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef UPDOWNCLIENT_H +#define UPDOWNCLIENT_H + +#include "GetTickCount.h" // Needed for GetTickCount +#include "MD4Hash.h" +#include +#include "NetworkFunctions.h" + +#include + + +typedef std::vector BitVector; + + +class CPartFile; +class CClientTCPSocket; +class CClientCredits; +class CPacket; +class CFriend; +class Requested_Block_Struct; +class CKnownFile; +class Pending_Block_Struct; +class CMemFile; +class CMemFile; +class Requested_File_Struct; +class CAICHHash; + + +// uploadstate +#define US_UPLOADING 0 +#define US_ONUPLOADQUEUE 1 +#define US_WAITCALLBACK 2 +#define US_CONNECTING 3 +#define US_PENDING 4 +#define US_LOWTOLOWIP 5 +#define US_BANNED 6 +#define US_ERROR 7 +#define US_NONE 8 + +// downloadstate +enum EDownloadState { + DS_DOWNLOADING = 0, + DS_ONQUEUE, + DS_CONNECTED, + DS_CONNECTING, + DS_WAITCALLBACK, + DS_WAITCALLBACKKAD, + DS_REQHASHSET, + DS_NONEEDEDPARTS, + DS_TOOMANYCONNS, + DS_TOOMANYCONNSKAD, + DS_LOWTOLOWIP, + DS_BANNED, + DS_ERROR, + DS_NONE, + DS_REMOTEQUEUEFULL // not used yet, except in statistics +}; + +// m_byChatstate +enum { + MS_NONE = 0, + MS_CHATTING, + MS_CONNECTING, + MS_UNABLETOCONNECT +}; + +enum ESourceFrom { + SF_NONE, + SF_LOCAL_SERVER, + SF_REMOTE_SERVER, + SF_KADEMLIA, + SF_SOURCE_EXCHANGE, + SF_PASSIVE, + SF_LINK, + SF_SOURCE_SEEDS +}; + +enum ESecureIdentState{ + IS_UNAVAILABLE = 0, + IS_ALLREQUESTSSEND = 0, + IS_SIGNATURENEEDED = 1, + IS_KEYANDSIGNEEDED = 2 +}; + +enum EInfoPacketState{ + IP_NONE = 0, + IP_EDONKEYPROTPACK = 1, + IP_EMULEPROTPACK = 2, + IP_BOTH = 3 +}; + +enum EKadState{ + KS_NONE, + KS_QUEUED_FWCHECK, + KS_CONNECTING_FWCHECK, + KS_CONNECTED_FWCHECK, + KS_QUEUED_BUDDY, + KS_INCOMING_BUDDY, + KS_CONNECTING_BUDDY, + KS_CONNECTED_BUDDY, + KS_NONE_LOWID, + KS_WAITCALLBACK_LOWID, + KS_QUEUE_LOWID +}; + +//! Used to keep track of the state of the client +enum ClientState +{ + //! New is for clients that have just been created. + CS_NEW = 0, + //! Listed is for clients that are on the clientlist + CS_LISTED, + //! Dying signifies clients that have been queued for deletion + CS_DYING +}; + +// This is fixed on ed2k v1, but can be any number on ED2Kv2 +#define STANDARD_BLOCKS_REQUEST 3 + +class CUpDownClient +{ + friend class CClientList; + friend class CUpDownClientListRem; +private: + /** + * Please note that only the ClientList is allowed to delete the clients. + * To schedule a client for deletion, call the CClientList::AddToDeleteQueue + * funtion, which will safely remove dead clients once every second. + */ + ~CUpDownClient(); + +public: +#ifdef CLIENT_GUI + CUpDownClient(class CEC_UpDownClient_Tag *); +#else + //base + CUpDownClient(CClientTCPSocket* sender = 0); + CUpDownClient(uint16 in_port, uint32 in_userid, uint32 in_serverup, uint16 in_serverport,CPartFile* in_reqfile, bool ed2kID, bool checkfriend); +#endif + /** + * This function should be called when the client object is to be deleted. + * It'll close the socket of the client and add it to the deletion queue + * owned by the CClientList class. However, if the CUpDownClient isn't on + * the normal clientlist, it will be deleted immediatly. + * + * The purpose of this is to avoid clients suddenly being removed due to + * asyncronous events, such as socket errors, which can result in the + * problems, as each CUpDownClient object is often kept in multiple lists, + * and instantly removing the client poses the risk of invalidating + * currently used iterators and/or creating dangling pointers. + * + * @see CClientList::AddToDeleteQueue + * @see CClientList::Process + */ + void Safe_Delete(); + + /** + * Specifies if the client has been queued for deletion. + * + * @return True if Safe_Delete has been called, false otherwise. + */ + bool HasBeenDeleted() { return m_clientState == CS_DYING; } + + ClientState GetClientState() { return m_clientState; } + + bool Disconnected(const wxString& strReason, bool bFromSocket = false); + bool TryToConnect(bool bIgnoreMaxCon = false); + bool Connect(); + void ConnectionEstablished(); + const wxString& GetUserName() const { return m_Username; } + //Only use this when you know the real IP or when your clearing it. + void SetIP( uint32 val ); + uint32 GetIP() const { return m_dwUserIP; } + bool HasLowID() const { return IsLowID(m_nUserIDHybrid); } + const wxString& GetFullIP() const { return m_FullUserIP; } + uint32 GetConnectIP() const { return m_nConnectIP; } + uint32 GetUserIDHybrid() const { return m_nUserIDHybrid; } + void SetUserIDHybrid(uint32 val); + uint32 GetUserPort() const { return m_nUserPort; } + uint32 GetTransferredDown() const { return m_nTransferredDown; } + uint32 GetServerIP() const { return m_dwServerIP; } + void SetServerIP(uint32 nIP) { m_dwServerIP = nIP; } + uint16 GetServerPort() const { return m_nServerPort; } + void SetServerPort(uint16 nPort) { m_nServerPort = nPort; } + const CMD4Hash& GetUserHash() const { return m_UserHash; } + void SetUserHash(const CMD4Hash& userhash); + void ValidateHash() { m_HasValidHash = !m_UserHash.IsEmpty(); } + bool HasValidHash() const { return m_HasValidHash; } + uint32 GetVersion() const { return m_nClientVersion;} + uint8 GetMuleVersion() const { return m_byEmuleVersion;} + bool ExtProtocolAvailable() const { return m_bEmuleProtocol;} + bool IsEmuleClient() const { return m_byEmuleVersion;} + bool IsBanned() const; + const wxString& GetClientFilename() const { return m_clientFilename; } + uint16 GetUDPPort() const { return m_nUDPPort; } + void SetUDPPort(uint16 nPort) { m_nUDPPort = nPort; } + uint8 GetUDPVersion() const { return m_byUDPVer; } + uint8 GetExtendedRequestsVersion() const { return m_byExtendedRequestsVer; } + bool IsFriend() const { return m_Friend != NULL; } + bool IsML() const { return m_bIsML; } + bool IsHybrid() const { return m_bIsHybrid; } + uint32 GetCompatibleClient() const { return m_byCompatibleClient; } + + void ClearDownloadBlockRequests(); + void RequestSharedFileList(); + void ProcessSharedFileList(const byte* pachPacket, uint32 nSize, wxString& pszDirectory); + + wxString GetUploadFileInfo(); + + void SetUserName(const wxString& NewName) { m_Username = NewName; } + + uint8 GetClientSoft() const { return m_clientSoft; } + void ReGetClientSoft(); + bool ProcessHelloAnswer(const byte* pachPacket, uint32 nSize); + bool ProcessHelloPacket(const byte* pachPacket, uint32 nSize); + void SendHelloAnswer(); + bool SendHelloPacket(); + void SendMuleInfoPacket(bool bAnswer, bool OSInfo = false); + bool ProcessMuleInfoPacket(const byte* pachPacket, uint32 nSize); + void ProcessMuleCommentPacket(const byte* pachPacket, uint32 nSize); + bool Compare(const CUpDownClient* tocomp, bool bIgnoreUserhash = false) const; + void SetLastSrcReqTime() { m_dwLastSourceRequest = ::GetTickCount(); } + void SetLastSrcAnswerTime() { m_dwLastSourceAnswer = ::GetTickCount(); } + void SetLastAskedForSources() { m_dwLastAskedForSources = ::GetTickCount(); } + uint32 GetLastSrcReqTime() const { return m_dwLastSourceRequest; } + uint32 GetLastSrcAnswerTime() const { return m_dwLastSourceAnswer; } + uint32 GetLastAskedForSources() const { return m_dwLastAskedForSources; } + bool GetFriendSlot() const { return m_bFriendSlot; } + void SetFriendSlot(bool bNV) { m_bFriendSlot = bNV; } + void SetCommentDirty(bool bDirty = true) { m_bCommentDirty = bDirty; } + uint8 GetSourceExchange1Version() const { return m_bySourceExchange1Ver; } + bool SupportsSourceExchange2() const { return m_fSupportsSourceEx2; } + + bool SafeSendPacket(CPacket* packet); + + void ProcessRequestPartsPacket(const byte* pachPacket, uint32 nSize, bool largeblocks); + void ProcessRequestPartsPacketv2(const CMemFile& data); + + void SendPublicKeyPacket(); + void SendSignaturePacket(); + void ProcessPublicKeyPacket(const byte* pachPacket, uint32 nSize); + void ProcessSignaturePacket(const byte* pachPacket, uint32 nSize); + uint8 GetSecureIdentState(); + + void SendSecIdentStatePacket(); + void ProcessSecIdentStatePacket(const byte* pachPacket, uint32 nSize); + + uint8 GetInfoPacketsReceived() const { return m_byInfopacketsReceived; } + void InfoPacketsReceived(); + + //upload + uint8 GetUploadState() const { return m_nUploadState; } + void SetUploadState(uint8 news); + uint32 GetTransferredUp() const { return m_nTransferredUp; } + uint32 GetSessionUp() const { return m_nTransferredUp - m_nCurSessionUp; } + void ResetSessionUp() { + m_nCurSessionUp = m_nTransferredUp; + m_addedPayloadQueueSession = 0; + m_nCurQueueSessionPayloadUp = 0; + } + uint32 GetUploadDatarate() const { return m_nUpDatarate; } + +#ifndef CLIENT_GUI + uint32 GetWaitTime() const { return m_dwUploadTime - GetWaitStartTime(); } + uint32 GetUpStartTimeDelay() const { return ::GetTickCount() - m_dwUploadTime; } + uint32 GetWaitStartTime() const; +#else + uint32 m_WaitTime, m_UpStartTimeDelay, m_WaitStartTime; + uint32 GetWaitTime() const { return m_WaitTime; } + uint32 GetUpStartTimeDelay() const { return m_UpStartTimeDelay; } + uint32 GetWaitStartTime() const { return m_WaitStartTime; } +#endif + + bool IsDownloading() const { return (m_nUploadState == US_UPLOADING); } + +#ifndef CLIENT_GUI + uint32 GetScore( + bool sysvalue, + bool isdownloading = false, + bool onlybasevalue = false) const; +#else + uint32 m_score; + uint32 GetScore( + bool WXUNUSED(sysvalue), + bool WXUNUSED(isdownloading) = false, + bool WXUNUSED(onlybasevalue) = false) const + { + return m_score; + } + uint16 m_waitingPosition; + uint16 GetWaitingPosition() const { return m_waitingPosition; } +#endif + double GetRating() const + { + return (double)GetScore(false, IsDownloading(), true); + } + + void AddReqBlock(Requested_Block_Struct* reqblock); + void CreateNextBlockPackage(); + void SetUpStartTime() { m_dwUploadTime = ::GetTickCount(); } + void SetWaitStartTime(); + void ClearWaitStartTime(); + void SendHashsetPacket(const CMD4Hash& forfileid); + bool SupportMultiPacket() const { return m_bMultiPacket; } + bool SupportExtMultiPacket() const { return m_fExtMultiPacket; } + + void SetUploadFileID(CKnownFile *newreqfile); + + /** + *Gets the file actually on upload + * + */ + const CKnownFile* GetUploadFile() const { return m_uploadingfile; } + + void SendOutOfPartReqsAndAddToWaitingQueue(); + void ProcessExtendedInfo(const CMemFile *data, CKnownFile *tempreqfile); + void ProcessFileInfo(const CMemFile* data, const CPartFile* file); + void ProcessFileStatus(bool bUdpPacket, const CMemFile* data, const CPartFile* file); + + const CMD4Hash& GetUploadFileID() const { return m_requpfileid; } + void SetUploadFileID(const CMD4Hash& new_id); + void ClearUploadFileID() { m_requpfileid.Clear(); m_uploadingfile = NULL;}; + uint32 SendBlockData(); + void ClearUploadBlockRequests(); + void SendRankingInfo(); + void SendCommentInfo(CKnownFile *file); + bool IsDifferentPartBlock() const; + void UnBan(); + void Ban(); + bool m_bAddNextConnect; // VQB Fix for LowID slots only on connection + uint32 GetAskedCount() const { return m_cAsked; } + void AddAskedCount() { m_cAsked++; } + void ClearAskedCount() { m_cAsked = 1; } // 1, because it's cleared *after* the first request... + void FlushSendBlocks(); // call this when you stop upload, + // or the socket might be not able to send + void SetLastUpRequest() { m_dwLastUpRequest = ::GetTickCount(); } + uint32 GetLastUpRequest() const { return m_dwLastUpRequest; } + uint16 GetUpPartCount() const { return m_upPartStatus.size(); } + + + //download + void SetRequestFile(CPartFile* reqfile); + CPartFile* GetRequestFile() const { return m_reqfile; } + + uint8 GetDownloadState() const { return m_nDownloadState; } + void SetDownloadState(uint8 byNewState); + uint32 GetLastAskedTime() const { return m_dwLastAskedTime; } + + bool IsPartAvailable(uint16 iPart) const + { return ( iPart < m_downPartStatus.size() ) ? m_downPartStatus[iPart] : 0; } + bool IsUpPartAvailable(uint16 iPart) const + { return ( iPart < m_upPartStatus.size() ) ? m_upPartStatus[iPart] : 0;} + + const BitVector& GetPartStatus() const { return m_downPartStatus; } + const BitVector& GetUpPartStatus() const { return m_upPartStatus; } + float GetKBpsDown() const { return kBpsDown; } + float CalculateKBpsDown(); + uint16 GetRemoteQueueRank() const { return m_nRemoteQueueRank; } + uint16 GetOldRemoteQueueRank() const { return m_nOldRemoteQueueRank; } + void SetRemoteQueueFull(bool flag) { m_bRemoteQueueFull = flag; } + bool IsRemoteQueueFull() const { return m_bRemoteQueueFull; } + void SetRemoteQueueRank(uint16 nr); + bool AskForDownload(); + void SendStartupLoadReq(); + void SendFileRequest(); + void ProcessHashSet(const byte* packet, uint32 size); + bool AddRequestForAnotherFile(CPartFile* file); + bool DeleteFileRequest(CPartFile* file); + void DeleteAllFileRequests(); + void SendBlockRequests(); + void ProcessBlockPacket(const byte* packet, uint32 size, bool packed, bool largeblocks); + +#ifndef CLIENT_GUI + uint16 GetAvailablePartCount() const; +#else + uint16 m_AvailPartCount; + uint16 GetAvailablePartCount() const { return m_AvailPartCount; } +#endif + + bool SwapToAnotherFile(bool bIgnoreNoNeeded, bool ignoreSuspensions, bool bRemoveCompletely, CPartFile* toFile = NULL); + void UDPReaskACK(uint16 nNewQR); + void UDPReaskFNF(); + void UDPReaskForDownload(); + bool IsSourceRequestAllowed(); + uint16 GetUpCompleteSourcesCount() const { return m_nUpCompleteSourcesCount; } + void SetUpCompleteSourcesCount(uint16 n) { m_nUpCompleteSourcesCount = n; } + + //chat + uint8 GetChatState() { return m_byChatstate; } + void SetChatState(uint8 nNewS) { m_byChatstate = nNewS; } + + //File Comment + const wxString& GetFileComment() const { return m_strComment; } + uint8 GetFileRating() const { return m_iRating; } + + const wxString& GetSoftStr() const { return m_clientSoftString; } + const wxString& GetSoftVerStr() const { return m_clientVerString; } +#ifndef CLIENT_GUI + const wxString GetServerName() const; +#else + wxString m_ServerName; + const wxString& GetServerName() const { return m_ServerName; } +#endif + + uint16 GetKadPort() const { return m_nKadPort; } + void SetKadPort(uint16 nPort) { m_nKadPort = nPort; } + + // Kry - AICH import + void SetReqFileAICHHash(CAICHHash* val); + CAICHHash* GetReqFileAICHHash() const {return m_pReqFileAICHHash;} + bool IsSupportingAICH() const {return m_fSupportsAICH & 0x01;} + void SendAICHRequest(CPartFile* pForFile, uint16 nPart); + bool IsAICHReqPending() const {return m_fAICHRequested; } + void ProcessAICHAnswer(const byte* packet, uint32 size); + void ProcessAICHRequest(const byte* packet, uint32 size); + void ProcessAICHFileHash(CMemFile* data, const CPartFile* file); + + EUtf8Str GetUnicodeSupport() const; + + // Barry - Process zip file as it arrives, don't need to wait until end of block + int unzip(Pending_Block_Struct *block, byte *zipped, uint32 lenZipped, byte **unzipped, uint32 *lenUnzipped, int iRecursion = 0); + // Barry - Sets string to show parts downloading, eg NNNYNNNNYYNYN + wxString ShowDownloadingParts() const; + void UpdateDisplayedInfo(bool force = false); + int GetFileListRequested() const { return m_iFileListRequested; } + void SetFileListRequested(int iFileListRequested) { m_iFileListRequested = iFileListRequested; } + + void ResetFileStatusInfo(); + + bool CheckHandshakeFinished(uint32 protocol, uint32 opcode) const; + + bool GetSentCancelTransfer() const { return m_fSentCancelTransfer; } + void SetSentCancelTransfer(bool bVal) { m_fSentCancelTransfer = bVal; } + + wxString GetClientFullInfo(); + + const wxString& GetClientOSInfo() const { return m_sClientOSInfo; } + + void ProcessPublicIPAnswer(const byte* pbyData, uint32 uSize); + void SendPublicIPRequest(); + + /** + * Sets the current socket of the client. + * + * @param socket The pointer to the new socket, can be NULL. + * + * Please note that this function DOES NOT delete the old socket. + */ + void SetSocket(CClientTCPSocket* socket); + + /** + * Function for accessing the socket owned by a client. + * + * @return The pointer (can be NULL) to the socket used by this client. + * + * Please note that the socket object is quite volatile and can be removed + * from one function call to the next, therefore, you should normally use + * the safer functions below, which all check if the socket is valid before + * deferring it. + */ + CClientTCPSocket* GetSocket() const { return m_socket; } + + /** + * Safe function for checking if the socket is connected. + * + * @return True if the socket exists and is connected, false otherwise. + */ +#ifndef CLIENT_GUI + bool IsConnected() const; +#else + bool m_IsConnected; + bool IsConnected() const { return m_IsConnected; } +#endif + + /** + * Safe function for sending packets. + * + * @return True if the socket exists and the packet was sent, false otherwise. + */ + bool SendPacket(CPacket* packet, bool delpacket = true, bool controlpacket = true); + + /** + * Safe function for setting the download limit of the socket. + * + * @return Current download speed of the client. + */ + float SetDownloadLimit(uint32 reducedownload); + + /** + * Sends a message to a client + * + * @return True if sent, false if connecting + */ + bool SendMessage(const wxString& message); + + uint32 GetPayloadInBuffer() const { return m_addedPayloadQueueSession - GetQueueSessionPayloadUp(); } + uint32 GetQueueSessionPayloadUp() const { return m_nCurQueueSessionPayloadUp; } + bool HasBlocks() const { return !m_BlockRequests_queue.empty(); } + + /* Source comes from? */ + ESourceFrom GetSourceFrom() const { return (ESourceFrom)m_nSourceFrom; } + void SetSourceFrom(ESourceFrom val) { m_nSourceFrom = val; } + + /* Kad buddy support */ + // ID + const byte* GetBuddyID() const { return m_achBuddyID; } + void SetBuddyID(const byte* m_achTempBuddyID); + bool HasValidBuddyID() const { return m_bBuddyIDValid; } + /* IP */ + void SetBuddyIP( uint32 val ) { m_nBuddyIP = val; } + uint32 GetBuddyIP() const { return m_nBuddyIP; } + /* Port */ + void SetBuddyPort( uint16 val ) { m_nBuddyPort = val; } + uint16 GetBuddyPort() const { return m_nBuddyPort; } + + //KadIPCheck + bool SendBuddyPingPong() { return m_dwLastBuddyPingPongTime < ::GetTickCount(); } + bool AllowIncomeingBuddyPingPong() { return m_dwLastBuddyPingPongTime < (::GetTickCount()-(3*60*1000)); } + void SetLastBuddyPingPongTime() { m_dwLastBuddyPingPongTime = (::GetTickCount()+(10*60*1000)); } + EKadState GetKadState() const { return m_nKadState; } + void SetKadState(EKadState nNewS) { m_nKadState = nNewS; } + uint8 GetKadVersion() { return m_byKadVersion; } + // Kad added by me + bool SendBuddyPing(); + + /* Returns the client hash type (SO_EMULE, mldonkey, etc) */ + int GetHashType() const; + + /** + * Checks that a client isn't aggressively re-asking for files. + * + * Call this when a file is requested. If the time since the last request is + * less than MIN_REQUESTTIME, 3 is added to the m_Aggressiveness variable. + * If the time since the last request is >= MIN_REQUESTTIME, the variable is + * decremented by 1. The client is banned if the variable reaches 10 or above. + * + * To check if a client is aggressive use the IsClientAggressive() function. + * + * Currently this function is called when the following packets are received: + * - OP_STARTUPLOADREQ + * - OP_REASKFILEPING + */ + void CheckForAggressive(); + + const wxString& GetClientModString() const { return m_strModVersion; } + + const wxString& GetClientVerString() const { return m_fullClientVerString; } + + const wxString& GetVersionString() const { return m_clientVersionString; } + + void UpdateStats(); + + /* Returns a pointer to the credits, only for hash purposes */ + void* GetCreditsHash() const { return (void*)credits; } + + uint32 GetLastBlockOffset() const { return m_nLastBlockOffset; } + + bool GetOSInfoSupport() const { return m_fOsInfoSupport; } + + bool GetVBTTags() const { return m_fValueBasedTypeTags; } + + uint16 GetLastPartAsked() const { return m_lastPartAsked; } + + void SetLastPartAsked(uint16 nPart) { m_lastPartAsked = nPart; } + + CFriend* GetFriend() const { return m_Friend; } + + void SetFriend(CFriend* newfriend) { m_Friend = newfriend; } + + bool IsIdentified() const; + + bool IsBadGuy() const; + + bool SUIFailed() const; + + bool SUINeeded() const; + + bool SUINotSupported() const; + + uint64 GetDownloadedTotal() const; + + uint64 GetUploadedTotal() const; + + double GetScoreRatio() const; + + uint32 GetCreationTime() const { return m_nCreationTime; } + + bool SupportsLargeFiles() const { return m_fSupportsLargeFiles; } + + #ifdef __DEBUG__ + /* Kry - Debug. See connection_reason definition comment below */ + void SetConnectionReason(const wxString& reason) { connection_reason = reason; } + #endif + + // Encryption / Obfuscation + bool SupportsCryptLayer() const { return m_fSupportsCryptLayer; } + bool RequestsCryptLayer() const { return SupportsCryptLayer() && m_fRequestsCryptLayer; } + bool RequiresCryptLayer() const { return RequestsCryptLayer() && m_fRequiresCryptLayer; } + bool HasObfuscatedConnectionBeenEstablished() const { return m_hasbeenobfuscatinglately; } + + void SetCryptLayerSupport(bool bVal) { m_fSupportsCryptLayer = bVal ? 1 : 0; } + void SetCryptLayerRequest(bool bVal) { m_fRequestsCryptLayer = bVal ? 1 : 0; } + void SetCryptLayerRequires(bool bVal) { m_fRequiresCryptLayer = bVal ? 1 : 0; } + bool ShouldReceiveCryptUDPPackets() const; + + bool HasDisabledSharedFiles() const { return m_fNoViewSharedFiles; } + +private: + + CClientCredits *credits; + CFriend *m_Friend; + + uint32 m_nTransferredUp; + uint32 m_nCurQueueSessionPayloadUp; + uint32 m_addedPayloadQueueSession; + + struct TransferredData { + uint32 datalen; + uint32 timestamp; + }; + + ////////////////////////////////////////////////////////// + // Upload data rate computation + // + uint32 m_nUpDatarate; + uint32 m_nSumForAvgUpDataRate; + std::list m_AvarageUDR_list; + + + /** + * This struct is used to keep track of CPartFiles which this source shares. + */ + struct A4AFStamp { + //! Signifies if this sources has needed parts for this file. + bool NeededParts; + //! This is set when we wish to avoid swapping to this file for a while. + uint32 timestamp; + }; + + //! I typedef in the name of readability! + typedef std::map A4AFList; + //! This list contains all PartFiles which this client can be used as a source for. + A4AFList m_A4AF_list; + + /** + * Helper function used by SwapToAnotherFile(). + * + * @param it The iterator of the PartFile to be examined. + * @param ignorenoneeded Do not check for the status NoNeededParts when checking the file. + * @param ignoresuspended Do not check the timestamp when checking the file. + * @return True if the file is a viable target, false otherwise. + * + * This function is used to perform checks to see if we should consider + * this file a viable target for A4AF swapping. Unless ignoresuspended is + * true, it will examine the timestamp of the file and reset it if needed. + */ + bool IsValidSwapTarget( A4AFList::iterator it, bool ignorenoneeded = false, bool ignoresuspended = false ); + + CPartFile* m_reqfile; + + // base + void Init(); + bool ProcessHelloTypePacket(const CMemFile& data); + void SendHelloTypePacket(CMemFile* data); + void ClearHelloProperties(); // eMule 0.42 + uint32 m_dwUserIP; + uint32 m_nConnectIP; // holds the supposed IP or (after we had a connection) the real IP + uint32 m_dwServerIP; + uint32 m_nUserIDHybrid; + int16 m_nUserPort; + int16 m_nServerPort; + uint32 m_nClientVersion; + uint32 m_cSendblock; + uint8 m_byEmuleVersion; + uint8 m_byDataCompVer; + bool m_bEmuleProtocol; + wxString m_Username; + wxString m_FullUserIP; + CMD4Hash m_UserHash; + bool m_HasValidHash; + uint16 m_nUDPPort; + uint8 m_byUDPVer; + uint8 m_bySourceExchange1Ver; + uint8 m_byAcceptCommentVer; + uint8 m_byExtendedRequestsVer; + uint8 m_clientSoft; + uint32 m_dwLastSourceRequest; + uint32 m_dwLastSourceAnswer; + uint32 m_dwLastAskedForSources; + int m_iFileListRequested; + bool m_bFriendSlot; + bool m_bCommentDirty; + bool m_bIsHybrid; + bool m_bIsML; + bool m_bSupportsPreview; + bool m_bUnicodeSupport; + uint16 m_nKadPort; + bool m_bMultiPacket; + ClientState m_clientState; + CClientTCPSocket* m_socket; + bool m_fNeedOurPublicIP; // we requested our IP from this client + + // Kry - Secure User Ident import + ESecureIdentState m_SecureIdentState; + uint8 m_byInfopacketsReceived; // have we received the edonkeyprot and emuleprot packet already (see InfoPacketsReceived() ) + uint32 m_dwLastSignatureIP; + uint8 m_bySupportSecIdent; + + uint32 m_byCompatibleClient; + std::list m_WaitingPackets_list; + uint32 m_lastRefreshedDLDisplay; + + //upload + void CreateStandartPackets(const unsigned char* data,uint32 togo, Requested_Block_Struct* currentblock); + void CreatePackedPackets(const unsigned char* data,uint32 togo, Requested_Block_Struct* currentblock); + + uint8 m_nUploadState; + uint32 m_dwUploadTime; + uint32 m_cAsked; + uint32 m_dwLastUpRequest; + uint32 m_nCurSessionUp; + uint16 m_nUpPartCount; + CMD4Hash m_requpfileid; + uint16 m_nUpCompleteSourcesCount; + + //! This vector contains the avilability of parts for the file that the user + //! is requesting. When changing it, be sure to call CKnownFile::UpdatePartsFrequency + //! so that the files know the actual availability of parts. + BitVector m_upPartStatus; + uint16 m_lastPartAsked; + wxString m_strModVersion; + + std::list m_BlockRequests_queue; + std::list m_DoneBlocks_list; + + //download + bool m_bRemoteQueueFull; + uint8 m_nDownloadState; + uint16 m_nPartCount; + uint32 m_dwLastAskedTime; + wxString m_clientFilename; + uint32 m_nTransferredDown; + uint32 m_nLastBlockOffset; // Patch for show parts that you download [Cax2] + uint16 m_cShowDR; + uint32 m_dwLastBlockReceived; + uint16 m_nRemoteQueueRank; + uint16 m_nOldRemoteQueueRank; + bool m_bCompleteSource; + bool m_bReaskPending; + bool m_bUDPPending; + bool m_bHashsetRequested; + + std::list m_PendingBlocks_list; + std::list m_DownloadBlocks_list; + + float kBpsDown; + float fDownAvgFilter; + uint32 msReceivedPrev; + uint32 bytesReceivedCycle; + // chat + uint8 m_byChatstate; + wxString m_strComment; + int8 m_iRating; + unsigned int + m_fHashsetRequesting : 1, // we have sent a hashset request to this client + m_fNoViewSharedFiles : 1, // client has disabled the 'View Shared Files' feature, + // if this flag is not set, we just know that we don't know + // for sure if it is enabled + m_fSupportsPreview : 1, + m_fSentCancelTransfer: 1, // we have sent an OP_CANCELTRANSFER in the current connection + m_fSharedDirectories : 1, // client supports OP_ASKSHAREDIRS opcodes + m_fSupportsAICH : 3, + m_fAICHRequested : 1, + m_fSupportsLargeFiles : 1, + m_fSentOutOfPartReqs : 1, + m_fExtMultiPacket : 1, + m_fRequestsCryptLayer: 1, + m_fSupportsCryptLayer: 1, + m_fRequiresCryptLayer: 1, + m_fSupportsSourceEx2 : 1; + + unsigned int + m_fOsInfoSupport : 1, + m_fValueBasedTypeTags : 1; + + /* Razor 1a - Modif by MikaelB */ + + bool m_bHelloAnswerPending; + + //! This vector contains the avilability of parts for the file we requested + //! from this user. When changing it, be sure to call CPartFile::UpdatePartsFrequency + //! so that the files know the actual availability of parts. + BitVector m_downPartStatus; + + CAICHHash* m_pReqFileAICHHash; + + ESourceFrom m_nSourceFrom; + + /* Kad Stuff */ + byte m_achBuddyID[16]; + bool m_bBuddyIDValid; + uint32 m_nBuddyIP; + uint16 m_nBuddyPort; + + EKadState m_nKadState; + + uint8 m_byKadVersion; + uint32 m_dwLastBuddyPingPongTime; + + //! This keeps track of aggressive requests for files. + uint16 m_Aggressiveness; + //! This tracks the time of the last time since a file was requested + uint32 m_LastFileRequest; + + bool m_OSInfo_sent; + + wxString m_clientSoftString; /* software name */ + wxString m_clientVerString; /* version + optional mod name */ + wxString m_clientVersionString; /* version string */ + wxString m_fullClientVerString; /* full info string */ + wxString m_sClientOSInfo; + wxString m_pendingMessage; + + int SecIdentSupRec; + + CKnownFile* m_uploadingfile; + + uint8 m_MaxBlockRequests; + + // needed for stats + uint32 m_lastClientSoft; + uint32 m_lastClientVersion; + wxString m_lastOSInfo; + + /* For buddies timeout */ + uint32 m_nCreationTime; + + /* Calculation of last average speed */ + uint32 m_lastaverage; + uint32 m_last_block_start; + + /* Save the encryption status for display when disconnected */ + bool m_hasbeenobfuscatinglately; + + /* Kry - Debug thing. Clients created just to check their data + have this string set to the reason we want to check them. + Obviously, once checked, we disconect them. Take that, sucker. + This debug code is just for me I'm afraid. */ + #ifdef __DEBUG__ + wxString connection_reason; + #endif +}; + + +#define MAKE_CLIENT_VERSION(mjr, min, upd) \ + ((uint32)(mjr)*100U*10U*100U + (uint32)(min)*100U*10U + (uint32)(upd)*100U) + + +#endif // UPDOWNCLIENT_H +// File_checked_for_headers diff --git a/src/utils/Makefile.am b/src/utils/Makefile.am new file mode 100644 index 00000000..bb34e895 --- /dev/null +++ b/src/utils/Makefile.am @@ -0,0 +1,25 @@ +if CAS + OPT_CAS = cas +endif + +if WXCAS + OPT_WXCAS = wxCas +endif + +if ALC + OPT_ALC = aLinkCreator +endif + +if ALCC + OPT_ALC = aLinkCreator +endif + +SUBDIRS = xas $(OPT_CAS) $(OPT_WXCAS) $(OPT_ALC) + +MAINTAINERCLEANFILES = Makefile.in + +EXTRA_DIST = mkFileSum.c +EXTRA__DIST__SUBDIRS = amps scripts +include $(top_srcdir)/automake/dist-hook.am + +DISTCLEANFILES = scripts/denoiser.sed diff --git a/src/utils/Makefile.in b/src/utils/Makefile.in new file mode 100644 index 00000000..125850df --- /dev/null +++ b/src/utils/Makefile.in @@ -0,0 +1,626 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/automake/dist-hook.am +subdir = src/utils +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = xas cas wxCas aLinkCreator +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +@CAS_TRUE@OPT_CAS = cas +@WXCAS_TRUE@OPT_WXCAS = wxCas +@ALCC_TRUE@OPT_ALC = aLinkCreator +@ALC_TRUE@OPT_ALC = aLinkCreator +SUBDIRS = xas $(OPT_CAS) $(OPT_WXCAS) $(OPT_ALC) +MAINTAINERCLEANFILES = Makefile.in +EXTRA_DIST = mkFileSum.c +EXTRA__DIST__SUBDIRS = amps scripts +DISTCLEANFILES = scripts/denoiser.sed +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/automake/dist-hook.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/utils/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(mkdir_p) $(distdir)/../../automake + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-recursive ctags ctags-recursive \ + dist-hook distclean distclean-generic distclean-recursive \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-info-am + +dist-hook: + for d in $(EXTRA__DIST__SUBDIRS) ; do \ + mkdir $(distdir)/$$d ; \ + for f in `find $(srcdir)/$$d -name '.svn' -prune -o -printf "%P\n"` ; do \ + if test -d $(srcdir)/$$d/$$f ; then \ + mkdir $(distdir)/$$d/$$f ; \ + else \ + cp -p $(srcdir)/$$d/$$f $(distdir)/$$d/$$f ; \ + fi ; \ + done ; \ + done +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/utils/aLinkCreator/Makefile.am b/src/utils/aLinkCreator/Makefile.am new file mode 100644 index 00000000..4e59c5dd --- /dev/null +++ b/src/utils/aLinkCreator/Makefile.am @@ -0,0 +1,13 @@ +SUBDIRS = src docs + +EXTRA_DIST = alc.rc alc.ico + +if ALC +dist_icon_DATA = alc.xpm +icondir = $(datadir)/pixmaps + +dist_util_DATA = alc.desktop +utildir = $(datadir)/applications +endif + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/utils/aLinkCreator/Makefile.in b/src/utils/aLinkCreator/Makefile.in new file mode 100644 index 00000000..fbca8aed --- /dev/null +++ b/src/utils/aLinkCreator/Makefile.in @@ -0,0 +1,661 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/utils/aLinkCreator +DIST_COMMON = $(am__dist_icon_DATA_DIST) $(am__dist_util_DATA_DIST) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +am__dist_icon_DATA_DIST = alc.xpm +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(icondir)" "$(DESTDIR)$(utildir)" +dist_iconDATA_INSTALL = $(INSTALL_DATA) +am__dist_util_DATA_DIST = alc.desktop +dist_utilDATA_INSTALL = $(INSTALL_DATA) +DATA = $(dist_icon_DATA) $(dist_util_DATA) +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +SUBDIRS = src docs +EXTRA_DIST = alc.rc alc.ico +@ALC_TRUE@dist_icon_DATA = alc.xpm +@ALC_TRUE@icondir = $(datadir)/pixmaps +@ALC_TRUE@dist_util_DATA = alc.desktop +@ALC_TRUE@utildir = $(datadir)/applications +MAINTAINERCLEANFILES = Makefile.in +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/aLinkCreator/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/utils/aLinkCreator/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: +install-dist_iconDATA: $(dist_icon_DATA) + @$(NORMAL_INSTALL) + test -z "$(icondir)" || $(mkdir_p) "$(DESTDIR)$(icondir)" + @list='$(dist_icon_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(dist_iconDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(icondir)/$$f'"; \ + $(dist_iconDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(icondir)/$$f"; \ + done + +uninstall-dist_iconDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_icon_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(icondir)/$$f'"; \ + rm -f "$(DESTDIR)$(icondir)/$$f"; \ + done +install-dist_utilDATA: $(dist_util_DATA) + @$(NORMAL_INSTALL) + test -z "$(utildir)" || $(mkdir_p) "$(DESTDIR)$(utildir)" + @list='$(dist_util_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(dist_utilDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(utildir)/$$f'"; \ + $(dist_utilDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(utildir)/$$f"; \ + done + +uninstall-dist_utilDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_util_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(utildir)/$$f'"; \ + rm -f "$(DESTDIR)$(utildir)/$$f"; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(DATA) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(icondir)" "$(DESTDIR)$(utildir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: install-dist_iconDATA install-dist_utilDATA + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-dist_iconDATA uninstall-dist_utilDATA \ + uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-recursive ctags ctags-recursive \ + distclean distclean-generic distclean-recursive distclean-tags \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-dist_iconDATA \ + install-dist_utilDATA install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-dist_iconDATA \ + uninstall-dist_utilDATA uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/utils/aLinkCreator/alc.desktop b/src/utils/aLinkCreator/alc.desktop new file mode 100644 index 00000000..2aab81db --- /dev/null +++ b/src/utils/aLinkCreator/alc.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Name=aLinkCreator +Exec=alc +Icon=alc +Terminal=false +Type=Application +Categories=Network;P2P; +Comment=aMule ed2k link creator +Comment[de]=ed2k-Linkersteller +Comment[fr]=Créateur de liens ed2k d'aMule +Comment[hu]=ed2k hivatkozás készítő diff --git a/src/utils/aLinkCreator/alc.ico b/src/utils/aLinkCreator/alc.ico new file mode 100644 index 0000000000000000000000000000000000000000..c3ffdcff3bfcab6b6ae1fe70b424538df16c7649 GIT binary patch literal 7406 zcwX(8i+2=P9ml_uoyjC5u-V=CsIRQ4Vkth*(V`ZG+JGW`#Ku?!)E3DsSZW0y_@YTc zkNyS4kshG|Dy7OP)l$y^au%tzLQ3RS9!go-YJs*kr#J}-kn#JwcPIPE1`KeH=k)Mf zK6`h5zwf>GcOP?^31A?Cni{aIz&s1M4nQ)guh&%ozou`(gzWVgU>doGni|nT`^Bah zC~1~uVf^^<*sx&(R&sR;`gEyBF{^D%qYEXq9zaKt~S6=Hzw|^QBu2_LneP@u~ zvKe)pv|lp5>VXwF{@Uy4XWv_&cmj_wzhz68qPn^ojg5`y;&@(X>@QDl$G={B3C}%u z1g2@?an8%Dr+jp5+m21Ye+^_BU9Ua)bbt`IX6EF+|v$z&JcI-e`R~Nc=?nIjNxrO6<`l+XIhHdQLvj->ta~gl# z^f=b8S%ZlaCt@A@Y36#~yJQJgu6qOztoaRo)xH+@uWZMPRqbfJ^%l&TGY1v6U3!yT zu{WmO`NJRm_$N#5ZEd@6>9U{x09bJMx9<7&!bRWt?)SdGIGLp5&N<(h+v28@^OEzw znY@cNX3b81^=nDm*YA)9n!cD!Hh(FZy#32xnJL#ZZer->TW)Rq!fmR9hN+^R_Sw%( z|Ge&T(x*P1oIK@*&)lf4KKiliCVu=ApS(Vs&Idn~oRIwRN1QOd_q=!P`>q*xEk=)j z{|A)gZEt_aJKt3&O}@MSYH^H-*2Ln8+Bd!VEpNRltYueJj;g92jX^WYBBoW2q1MJT zv5jR~;O}%K3vYvTl(AL@0%?-Jv$3=MJwSMSs&h6;rXY9DwwZYycdif<$k2o zX{7&=M)!_~=xSqkf$B0)U%4N0R(78Wux8aNbn>@HT;hh)Wy-@v(o8xWrMpbh7zQHr2^$8iz0u{$q@I#3c@)gSpU8 zJmM0EP{ds5CmwN$Ls*fy&`&(#5{IxcNH+5Eh)Wy-$uOXYc*G?RVW-T8e&P|AIE0BX zL_hI}OB})r=0iX6h)Wzo0rR1sc*G?RVI?&)l8t;^;th=~T1gsBGi|@#(E7+fKHa zY#rGqvL$5sWvOLZWeH`uWNBm>WXffFWh!ObWQt@uWQa0+8Iq(gsY+Usf^?^LiKk`I z2h0(&nXD(jAd5*eX(06%4j(y!W4cKx zhqWMVAuiFvuo7fbl-4=VMPZtr0bhbcqQ02);SZ_GF#D5`ohX=;T$l@{1c_2%jOAj- zZME2?!Wf&hZ9AJ=={Pr6Z-0MZHk?wHCyGlE|exwB1%j3_G%4ZLP{I^>D4xjpu_}RlBI#Gi9wJd z-5P^Lh)tpyOj5w0YkV?9ttM6QJdEFR2u`l4!Y4AoThky zWsnZUU!Gm~q|9RXMB?iBz!>>P=Ik%Ge$ShLVY%wJ%y9retd+YbimwrSj1F{Co!W%A(ZU zw$8s?HEXKwa_W)mnZK!Xux+!p)-ISNTLy&!E70p7msM}%o+`awwob*2RaY1PVYE;$U8pKt2yR#Fvg=ji)SA&KYgHS?a)k4l--RSk@zBOE zO0QG0!Ww#JOm!~|BNsFI$f+8)%gsGJ(P;7RDzr*N&J0`WInvSRPv#=@qegKNtHYb|0)th04!|latEi}`%DXj; z&@NG*-OQFnJ%?b1GAp#9bqsZP(DZ3gc&3-@I+vo?xn}E_gOv;F44pJp$2236h}!w4 zl{5M4|0V0QR#sLPQD)|BSg|srOj#tf^Q%X$haO8=&MqWZHtdEN#zw0DzgUJCKi8%F z?Y5w#oh~ZR=9flMX=lr5Q8_tVzqo8IT^fO|7s)H-1_Yfp5zynDzCh8gk_M?dcJS!{07Tz)n34t(MUlVWTLuMd4%PE0f#kN ABLDyZ literal 0 HcwPel00001 diff --git a/src/utils/aLinkCreator/alc.rc b/src/utils/aLinkCreator/alc.rc new file mode 100644 index 00000000..57027378 --- /dev/null +++ b/src/utils/aLinkCreator/alc.rc @@ -0,0 +1,3 @@ +alc ICON "alc.ico" + +#include "wx/msw/wx.rc" diff --git a/src/utils/aLinkCreator/alc.xpm b/src/utils/aLinkCreator/alc.xpm new file mode 100644 index 00000000..d010b8ed --- /dev/null +++ b/src/utils/aLinkCreator/alc.xpm @@ -0,0 +1,55 @@ +/* XPM */ +static const char *alc[] = { +/* columns rows colors chars-per-pixel */ +"32 32 17 1", +" c black", +". c gray60", +"X c gray80", +"o c gray100", +"O c #FFCCCC", +"+ c gray20", +"@ c gray40", +"# c #FF6699", +"$ c #FF9999", +"% c black", +"& c black", +"* c black", +"= c black", +"- c black", +"; c black", +": c black", +"> c None", +/* pixels */ +">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", +">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", +">>>>>>>>>>>>>>>>>>......>>>>>>>>", +">>>>>>>>>>>>>>>...@@@@@@@>>>>>>>", +">>>>>>>>>>>>>.@@@@++++++>>>>>>>>", +">>>>>>>>>>>>@@++++.......>>>>>>>", +">>>>>>>.....++....XXXXXXX..>>>>>", +">>>>....XXXX..XXXXooooooooX.>>>>", +">>>..XXXXoOXXXoooooooooXXX.>>>>>", +">>..XOX XO......XXXXXX...>>>>>>", +">#$XoX@ +X..>>>>......>>>>>>>>>", +">#$...XOooOX..>>>>>>>>>>>>>>>>>>", +">#.OOO.XOoOX..>>>>>>>>>>>>>>>>>>", +">.XooX.XOOX.X..>>>>>>>>>>>>>>>>>", +">>.XX.XOOX..XX..>>>>>>>>>>>>>>>>", +">>>..XXXXX.XOOX...>>>>>>>>>>>>>>", +">>>>>.....XOooOX.....>>>>>>>>>>>", +">>>>>>..XXOooooOXX.....>>>>>>>>>", +">>>>>..XOOooooooOOXXX...>>>>>>>>", +">>>>..XOoooooooOO...XXX..>>>>>>>", +">>>>..XOooooooO..XXX..OX..>>>>>>", +">>>>..XOoooooO.XXOOOXX.X..>>>>>>", +">>>>..XOooooO.XOOoooOOX.X..>>>>>", +">>>>>..XOoooO.XOooooooOXX..>>>>>", +">>>>>+..XOooO.XOoooooooOOX..>>>>", +">>>>>+..XOooO.XOoooooooOOX..>>>>", +">>>>>++.XOOOOX.XOoooOooOX..XXX>>", +">>>>>++.XO...X.XXOooXXOOX.XOOOX>", +">>>>++..X..X.....XXOX.OOX.XOoOX>", +">>>++.XoX.XoooooooooOX.X..XOOOX>", +">>>++.Xo..X.OOOOOOOOOX....>XXX>>", +">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" +}; diff --git a/src/utils/aLinkCreator/docs/Makefile.am b/src/utils/aLinkCreator/docs/Makefile.am new file mode 100644 index 00000000..1e957c38 --- /dev/null +++ b/src/utils/aLinkCreator/docs/Makefile.am @@ -0,0 +1,13 @@ +SELECTED_MANPAGES = $(ALC_MANPAGES) $(ALCC_MANPAGES) + +EXTRA_DIST = \ + alc.1 alcc.1 \ + alc.de.1 alcc.de.1 \ + alc.es.1 alcc.es.1 \ + alc.eu.1 alcc.eu.1 \ + alcc.fr.1 \ + alc.hu.1 alcc.hu.1 + +include $(top_srcdir)/automake/manpages.am + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/utils/aLinkCreator/docs/Makefile.in b/src/utils/aLinkCreator/docs/Makefile.in new file mode 100644 index 00000000..ebad4a9b --- /dev/null +++ b/src/utils/aLinkCreator/docs/Makefile.in @@ -0,0 +1,496 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/automake/manpages.am +subdir = src/utils/aLinkCreator/docs +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +SELECTED_MANPAGES = $(ALC_MANPAGES) $(ALCC_MANPAGES) +EXTRA_DIST = \ + alc.1 alcc.1 \ + alc.de.1 alcc.de.1 \ + alc.es.1 alcc.es.1 \ + alc.eu.1 alcc.eu.1 \ + alcc.fr.1 \ + alc.hu.1 alcc.hu.1 + +MAINTAINERCLEANFILES = Makefile.in +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/automake/manpages.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/aLinkCreator/docs/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/utils/aLinkCreator/docs/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + $(mkdir_p) $(distdir)/../../../../automake + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-data-hook install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am uninstall uninstall-am uninstall-hook \ + uninstall-info-am + +install-data-hook: + @for file in $(SELECTED_MANPAGES); do \ + lang=`echo $$file | sed -e 's/^[^.]*\.//'`; \ + if test $$lang == 1; then \ + echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/man1" ; \ + $(mkinstalldirs) $(DESTDIR)$(mandir)/man1 ; \ + if test -f $(srcdir)/$$file; then name=$(srcdir)/$$file; \ + else name=$$file; fi; \ + inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ + echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/man1/$$inst" ; \ + $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/man1/$$inst ; \ + else \ + locale=`echo $$lang | sed -e 's/\..*//'` ; \ + echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/$$locale/man1" ; \ + $(mkinstalldirs) $(DESTDIR)$(mandir)/$$locale/man1 ; \ + if test -f $(srcdir)/$$file; then name=$(srcdir)/$$file; \ + else name=$$file; fi; \ + inst=`echo $$file | sed -e "s/\.$${locale}\.1//" -e '$(transform)'`.1 ; \ + echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$locale/man1/$$inst" ; \ + $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$locale/man1/$$inst ; \ + fi; \ + done + +uninstall-hook: + @for file in $(SELECTED_MANPAGES); do \ + lang=`echo $$file | sed -e 's/^[^.]*\.//'`; \ + if test $$lang == 1; then \ + inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ + rm -f $(DESTDIR)$(mandir)/man1/$$inst ; \ + else \ + locale=`echo $$lang | sed -e 's/\..*//'` ; \ + inst=`echo $$file | sed -e "s/\.$${locale}\.1//" -e '$(transform)'`.1 ; \ + rm -f $(DESTDIR)$(mandir)/$$locale/man1/$$inst ; \ + fi; \ + done +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/utils/aLinkCreator/docs/alc.1 b/src/utils/aLinkCreator/docs/alc.1 new file mode 100644 index 00000000..ebe81452 --- /dev/null +++ b/src/utils/aLinkCreator/docs/alc.1 @@ -0,0 +1,16 @@ +.TH ALC 1 "January 2007" "aLinkCreator" "aMule utilities" +.SH NAME +aLinkCreator \- the aMule ED2k link creator +.SH SYNOPSIS +.B alc +.SH DESCRIPTION +\fBalc\fR is a graphical utility to create an ED2k link to any file on your computer. + +This programm doesn't take any arguments. +.SH REPORTING BUGS +Please report bugs either on our forum (\fIhttp://forum.amule.org/\fR), or in our bugtracker (\fIhttp://bugs.amule.org/\fR). +Please do not report bugs in e-mail, neither to our mailing list nor directly to any team member. +.SH COPYRIGHT +aMule and all of its related utilities are distributed under the GNU General Public License. +.SH SEE ALSO +\fBalcc\fR(1), \fBamule\fR(1) diff --git a/src/utils/aLinkCreator/docs/alc.de.1 b/src/utils/aLinkCreator/docs/alc.de.1 new file mode 100644 index 00000000..b0e596b0 --- /dev/null +++ b/src/utils/aLinkCreator/docs/alc.de.1 @@ -0,0 +1,14 @@ +.TH ALC 1 "March 2005" "aLinkCreator" "aMule utilities" +.SH NAME +aLinkCreator \- the aMule ED2k link creator +.SH SYNOPSIS +.B alc +.SH DESCRIPTION +\fBalc\fR ist ein Grafisches Tool zum erstellen von ED2K Links für jede Datei auf dem Computer. +.SH PROBLEME BERICHTEN +Bitte berichte Fehler im Programm entweder im Forum (\fIhttp://forum.amule.org/\fR), oder in unserem Bugtracker (\fIhttp://bugs.amule.org/\fR). +Bitte berichte keine Fehler per E-Mail, zu unserer Mailingliste oder direkt zu einem Teammitglied. +.SH COPYRIGHT +aMule und alle seine Tools stehen unter der GNU General Public License. +.SH SIEHE AUCH +\fBalcc\fR(1), \fBamule\fR(1) diff --git a/src/utils/aLinkCreator/docs/alc.es.1 b/src/utils/aLinkCreator/docs/alc.es.1 new file mode 100644 index 00000000..bf7f08fa --- /dev/null +++ b/src/utils/aLinkCreator/docs/alc.es.1 @@ -0,0 +1,14 @@ +.TH ALC 1 "Marzo 2005" "aLinkCreator" "Utilidades de aMule" +.SH NOMBRE +aLinkCreator \- Creador de enlaces eD2k de aMule +.SH SINOPSIS +.B alc +.SH DESCRIPCIÓN +\fBalc\fR es una utilidad gráfica para crear enlaces eD2k de cualquier archivo. +.SH BUGS +Si descubre bugs, por favor comuníquelos en (\fIhttp://forum.amule.org/\fR), o en nuestro bugtracker (\fIhttp://bugs.amule.org/\fR). +Por favor, no comunique bugs por e-mail, ni a nuestro maillist ni directamente a ningún miembro del equipo de aMule. +.SH COPYRIGHT +aMule, y todas las utilidades que con el vienen, se distribuyen bajo la licencia GPL. +.SH VER +\fBalcc\fR(1), \fBamule\fR(1) diff --git a/src/utils/aLinkCreator/docs/alc.eu.1 b/src/utils/aLinkCreator/docs/alc.eu.1 new file mode 100644 index 00000000..aa9e4545 --- /dev/null +++ b/src/utils/aLinkCreator/docs/alc.eu.1 @@ -0,0 +1,15 @@ +.TH ALC 1 "2005 Martxoa" "aLinkCreator" "aMule lanabesak" +.SH NAME +aLinkCreator \- aMule ED2k lotura sortzailea +.SH LABURPENA +.B alc +.SH DESCRIPTION +\fBalc\fR zure ordenagailuko edozein fitxategira ED2k lotura sortzeko lanabes grafikoa da. +.SH ZORRIEN BERRI EMATEN +Mesedez zorrien berri emateko gure foroa (\fIhttp://forum.amule.org/\fR), edo gure zorri kudeatzailea +(\fIhttp://bugs.amule.org/\fR) erabili. +Mesedez ez eman zorrien berri epostaz, ez gure eposta zerrendan ez taldeko partaideei. +.SH COPYRIGHT +aMule eta inguruneko lanabes guztiak GNU Lizentzia Publiko Orokorraz banatzen dira. +.SH IKUSI ERE +\fBalcc\fR(1), \fBamule\fR(1) diff --git a/src/utils/aLinkCreator/docs/alc.hu.1 b/src/utils/aLinkCreator/docs/alc.hu.1 new file mode 100644 index 00000000..bc116628 --- /dev/null +++ b/src/utils/aLinkCreator/docs/alc.hu.1 @@ -0,0 +1,16 @@ +.TH ALC 1 "2005 március" "aLinkCreator" "aMule segédprogramok" +.SH NÉV +aLinkCreator \- az aMule ED2k hivatkozás készítõ +.SH ÁTTEKINTÉS +.B alc +.SH LEÍRÁS +Az \fBalc\fR egy grafikus segédeszköz ED2k hivatkozások készítéséhez bármely fájlhoz a számítógépen. +.SH HIBÁK JELENTÉSE +A hibákat kérjük vagy a fórumon (\fIhttp://forum.amule.org/\fR), vagy a hibakövetõben (\fIhttp://bugs.amule.org/\fR) jelentsék. +Hibákról kérjük ne írjanak levelet (e-mail-t) se a levelzési listára, se közvetlenül valamelyik fejlesztõnek. +.SH COPYRIGHT +Az aMule és az összes hozzá tartozó segédprogram a GNU General Public Licence védelme alatt áll. +.SH LÁSD MÉG +\fBalcc\fR(1), \fBamule\fR(1) +.SH MAGYAR FORDÍTÁS +Dévai Tamás diff --git a/src/utils/aLinkCreator/docs/alcc.1 b/src/utils/aLinkCreator/docs/alcc.1 new file mode 100644 index 00000000..20f21b35 --- /dev/null +++ b/src/utils/aLinkCreator/docs/alcc.1 @@ -0,0 +1,30 @@ +.TH ALCC "1" "January 2007" "aMule ED2k links calculator" "aMule utilities" +.SH NAME +alcc \- text based ED2K links calculator for aMule +.SH SYNOPSIS +.B alcc +.RB [ \-p ] +.RB [ \-v ] +.I +.PP +.B alcc +.RB [ \-h ] +.SH DESCRIPTION +Compute the ED2K links of all the input files given in the \fI\fR (There can be one or more files). +.SS "Usage:" +.TP +\fB\-h, \-\-help\fR +Prints a short usage description. +.TP +\fB\-v, \-\-verbose\fR +Be verbose: print calculation steps. +.TP +\fB\-p, \-\-parthashes\fR +Compute and add part hashes to the computed ED2K links. +.SH REPORTING BUGS +Please report bugs either on our forum (\fIhttp://forum.amule.org/\fR), or in our bugtracker (\fIhttp://bugs.amule.org/\fR). +Please do not report bugs in e-mail, neither to our mailing list nor directly to any team member. +.SH COPYRIGHT +aMule and all of its related utilities are distributed under the GNU General Public License. +.SH SEE ALSO +\fBalc\fR(1), \fBamuled\fR(1), \fBamulecmd\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1), \fBwxcas\fR(1), \fBxas\fR(1) diff --git a/src/utils/aLinkCreator/docs/alcc.de.1 b/src/utils/aLinkCreator/docs/alcc.de.1 new file mode 100644 index 00000000..a4339bff --- /dev/null +++ b/src/utils/aLinkCreator/docs/alcc.de.1 @@ -0,0 +1,27 @@ +.TH ALCC 1 "March 2005" "aLinkCreator" "aMule utilities" +.SH NAME +aLinkCreator \- the aMule ED2k link creator +.SH SYNOPSIS +.B alcc +.RB [ \-h ] +.RB [ \-v ] +.RB [ \-p ] +.I zu berechnende Dateien... +.SH BESCHREIBUNG +\fBalcc\fR ist ein Kommandozeilen Tool zum Erstellen von ED2K Links für jede Datei auf dem Computer. +.TP +\fB\-h\fR, \fB\-\-help\fR +Zeigt diese Hilfe. +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Gibt zusätliche Informationen. +.TP +\fB\-p\fR, \fB\-\-parthashes\fR +Hängt Part-Hashes an den ED2K Link. +.SH PROBLEME BERICHTEN +Bitte berichte Fehler im Programm entweder im Forum (\fIhttp://forum.amule.org/\fR), oder in unserem Bugtracker (\fIhttp://bugs.amule.org/\fR). +Bitte berichte keine Fehler per E-Mail, auch nicht an unsere Mailingliste oder direkt an ein Teammitglied. +.SH COPYRIGHT +aMule und alle seine Tools stehen unter der GNU General Public License. +.SH SIEHE AUCH +\fBalc\fR(1), \fBamule\fR(1) diff --git a/src/utils/aLinkCreator/docs/alcc.es.1 b/src/utils/aLinkCreator/docs/alcc.es.1 new file mode 100644 index 00000000..c3092fec --- /dev/null +++ b/src/utils/aLinkCreator/docs/alcc.es.1 @@ -0,0 +1,27 @@ +.TH ALCC 1 "Marzo 2005" "aLinkCreator" "Utilidades de aMule" +.SH NOMBRE +aLinkCreator \- Creador de enlaces eD2k de aMule +.SH SINOPSIS +.B alcc +.RB [ \-h ] +.RB [ \-v ] +.RB [ \-p ] +.I archivos... +.SH DESCRIPCIÓN +\fBalcc\fR es una utilidad en modo comando para crear enlaces eD2k de cualquier archivo. +.TP +\fB\-h\fR, \fB\-\-help\fR +Muestra ayuda del modo de uso. +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Mostrar información adicional. +.TP +\fB\-p\fR, \fB\-\-parthashes\fR +Añadir part-hashes a los enlaces eD2k. +.SH BUGS +Si descubre bugs, por favor comuníquelos en (\fIhttp://forum.amule.org/\fR), o en nuestro bugtracker (\fIhttp://bugs.amule.org/\fR). +Por favor, no comunique bugs por e-mail, ni a nuestro maillist ni directamente a ningún miembro del equipo de aMule. +.SH COPYRIGHT +aMule, y todas las utilidades que con el vienen, se distribuyen bajo la licencia GPL. +.SH VER +\fBalc\fR(1), \fBamule\fR(1) diff --git a/src/utils/aLinkCreator/docs/alcc.eu.1 b/src/utils/aLinkCreator/docs/alcc.eu.1 new file mode 100644 index 00000000..f73c157d --- /dev/null +++ b/src/utils/aLinkCreator/docs/alcc.eu.1 @@ -0,0 +1,32 @@ +.TH ALCC "1" "2005 Martxoa" "aMule ED2k lotura sortzailea" "aMule lanabesak" +.SH IZENA +alcc \- testuan oinarrituriko aMule ED2k lotura sortzailea +.SH LABURPENA +.B alcc +.RB [ \-p ] +.RB [ \-v ] +.I +.PP +.B alcc +.RB [ \-h ] +.SH AZALPENA +\fI\fR-en emandako sarrera fitxategi guztien ED2K loturak kalkulatu (fixtategi bat edo gehiago izan +daitezke). +.SS "Erabilera:" +.TP +\fB\-h, \-\-help\fR +Laguntza hau inprimatu. +.TP +\fB\-v, \-\-verbose\fR +Luze izan: kalkulu pausuak inprimatu. +.TP +\fB\-p, \-\-parthashes\fR +Kalkulatutako ED2k loturei zati egiaztapenak gehitu edo kalkulatu. +ZORRIEN BERRI EMATEN +Mesedez zorrien berri emateko gure foroa (\fIhttp://forum.amule.org/\fR), edo gure zorri kudeatzailea +(\fIhttp://bugs.amule.org/\fR) erabili. +Mesedez ez eman zorrien berri epostaz, ez gure eposta zerrendan ez taldeko partaideei. +.SH COPYRIGHT +aMule eta inguruneko lanabes guztiak GNU Lizentzia Publiko Orokorraz banatzen dira. +.SH IKUSI ERE +\fBalc\fR(1), \fBamuled\fR(1), \fBamulecmd\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1), \fBwxcas\fR(1), \fBxas\fR(1) diff --git a/src/utils/aLinkCreator/docs/alcc.fr.1 b/src/utils/aLinkCreator/docs/alcc.fr.1 new file mode 100644 index 00000000..874ac055 --- /dev/null +++ b/src/utils/aLinkCreator/docs/alcc.fr.1 @@ -0,0 +1,32 @@ +.TH ALCC "1" "Mars 2005" "Calculatrice de liens ED2K pour aMule" "Outil pour aMule" +.SH NOM +alcc \- calculatrice en ligne de commande de liens ED2K pour aMule +.SH SYNOPSIS +.B alcc +.RB [ \-p ] +.RB [ \-v ] +.I +.PP +.B alcc +.RB [ \-h ] +.SH DESCRIPTION +Calcule les liens ED2K de tous les fichiers de la liste \fI\fR (La liste peut contenir un ou plusieurs fichiers séparés par des espaces). +.SS "Usage:" +.TP +\fB\-h, \-\-help\fR +Afficher l'aide d'utilisation et quitter. +.TP +\fB\-v, \-\-verbose\fR +Mode bavard: afficher les étapes des calculs. +.TP +\fB\-p, \-\-parthashes\fR +Calculer et ajouter les hashes partiels aux liens ED2K calculés. +.SH SIGNALEMENT DES BUGS +Reportez les bugs sur notre forum (\fIhttp://forum.amule.org/\fR), ou dans notre bugtracker (\fIhttp://bugs.amule.org/\fR). +N'utilisez ni un e-mail, ni notre liste de diffusion ni ne reportez directement un bug à un membre de notre equipe. +.SH COPYRIGHT +aMule et tous les utilitaires associés sont distribués sous licence GNU General Public License. +.SH VOIR AUSSI +\fBalc\fR(1), \fBamuled\fR(1), \fBamulecmd\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1), \fBwxcas\fR(1), \fBxas\fR(1) +.SH TRADUCTION +ThePolish, 2005 diff --git a/src/utils/aLinkCreator/docs/alcc.hu.1 b/src/utils/aLinkCreator/docs/alcc.hu.1 new file mode 100644 index 00000000..e69680ee --- /dev/null +++ b/src/utils/aLinkCreator/docs/alcc.hu.1 @@ -0,0 +1,32 @@ +.TH ALCC "1" "2005 március" "aMule ED2k hivatkozás készítõ" "aMule segédeszközök" +.SH NÉV +alcc \- szöveges ED2K hivatkozás készítõ az aMule-hoz +.SH ÁTTEKINTÉS +.B alcc +.RB [ \-p ] +.RB [ \-v ] +.I +.PP +.B alcc +.RB [ \-h ] +.SH LEÍRÁS +Kiszámítja az ED2K hivatkozásokat minden megadott fájlra a \fI\fR-ban (egy vagy több fájl lehetséges). +.SS "Használat:" +.TP +\fB\-h, \-\-help\fR +Kiírja ezt a súgót. +.TP +\fB\-v, \-\-verbose\fR +Bõbeszédû: a számítási lépéseket is kiírja. +.TP +\fB\-p, \-\-parthashes\fR +Rész-hash-ek számítása és hozzáadása a készített ED2K hivatkozáshoz. +.SH HIBÁK JELENTÉSE +A hibákat kérjük vagy a fórumon (\fIhttp://forum.amule.org/\fR), vagy a hibakövetõben (\fIhttp://bugs.amule.org/\fR) jelentsék. +Hibákról kérjük ne írjanak levelet (e-mail-t) se a levelzési listára, se közvetlenül valamelyik fejlesztõnek. +.SH COPYRIGHT +Az aMule és az összes hozzá tartozó segédprogram a GNU General Public Licence védelme alatt áll. +.SH LÁSD MÉG +\fBalc\fR(1), \fBamule\fR(1) +.SH MAGYAR FORDÍTÁS +Dévai Tamás diff --git a/src/utils/aLinkCreator/src/Makefile.am b/src/utils/aLinkCreator/src/Makefile.am new file mode 100644 index 00000000..01636497 --- /dev/null +++ b/src/utils/aLinkCreator/src/Makefile.am @@ -0,0 +1,73 @@ +bin_PROGRAMS = + +if ALC +bin_PROGRAMS += alc +endif + +if ALCC +bin_PROGRAMS += alcc +endif + +alc_SOURCES = alc.cpp \ + alcframe.cpp \ + ed2khash.cpp \ + alcpix.cpp \ + md4.cpp + +noinst_HEADERS = alc.h \ + alcc.h \ + alcframe.h \ + ed2khash.h \ + alcpix.h \ + md4.h \ + bithelp.h + +alc_CFLAGS = $(WX_CFLAGS) +alc_CXXFLAGS = $(WX_CXXFLAGS) +alc_LDADD = $(WX_LIBS) + + +alcc_SOURCES = alcc.cpp \ + ed2khash.cpp \ + md4.cpp + +alcc_CFLAGS = $(WXBASE_CFLAGS) +alcc_CXXFLAGS = $(WXBASE_CXXFLAGS) +alcc_LDADD = $(WXBASE_LIBS) + +# Resources + +if NEED_RC + +SUFFIXES = .rc + +.rc.$(OBJEXT): + $(RC) $(RCFLAGS) -I$(top_srcdir) -D__WIN95__ -D__WIN32__ -D__GNUWIN32__ -O COFF -i "$<" -o "$@" + +nodist_alcc_SOURCES = alcc-version.rc +alc_LDADD += alcrc.$(OBJEXT) + +alcrc.$(OBJEXT): $(srcdir)/../alc.rc alc-version.rc + cat $^ | \ + ( \ + abs_builddir=`pwd` ; \ + abs_top_srcdir=`cd $(top_srcdir) ; pwd` ; \ + cd $( "$@" + +alcc-version.rc: $(top_builddir)/version.rc + @sed -e 's/VER_FILEDESCRIPTION_STR/"aMule Link Creator, Console"/' \ + -e 's/VER_INTERNALNAME_STR/"alcc"/' \ + -e 's/VER_ORIGINALFILENAME_STR/"alcc$(EXEEXT)"/' "$<" > "$@" + +CLEANFILES = *-version.rc + +endif + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/utils/aLinkCreator/src/Makefile.in b/src/utils/aLinkCreator/src/Makefile.in new file mode 100644 index 00000000..bb8c1b9d --- /dev/null +++ b/src/utils/aLinkCreator/src/Makefile.in @@ -0,0 +1,754 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +SOURCES = $(alc_SOURCES) $(alcc_SOURCES) $(nodist_alcc_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) +@ALC_TRUE@am__append_1 = alc +@ALCC_TRUE@am__append_2 = alcc +@NEED_RC_TRUE@am__append_3 = alcrc.$(OBJEXT) +subdir = src/utils/aLinkCreator/src +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +@ALC_TRUE@am__EXEEXT_1 = alc$(EXEEXT) +@ALCC_TRUE@am__EXEEXT_2 = alcc$(EXEEXT) +am__installdirs = "$(DESTDIR)$(bindir)" +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +PROGRAMS = $(bin_PROGRAMS) +am_alc_OBJECTS = alc-alc.$(OBJEXT) alc-alcframe.$(OBJEXT) \ + alc-ed2khash.$(OBJEXT) alc-alcpix.$(OBJEXT) alc-md4.$(OBJEXT) +alc_OBJECTS = $(am_alc_OBJECTS) +am__DEPENDENCIES_1 = +@NEED_RC_TRUE@am__DEPENDENCIES_2 = alcrc.$(OBJEXT) +alc_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) +am_alcc_OBJECTS = alcc-alcc.$(OBJEXT) alcc-ed2khash.$(OBJEXT) \ + alcc-md4.$(OBJEXT) +@NEED_RC_TRUE@nodist_alcc_OBJECTS = alcc-version.$(OBJEXT) +alcc_OBJECTS = $(am_alcc_OBJECTS) $(nodist_alcc_OBJECTS) +alcc_DEPENDENCIES = $(am__DEPENDENCIES_1) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +SOURCES = $(alc_SOURCES) $(alcc_SOURCES) $(nodist_alcc_SOURCES) +DIST_SOURCES = $(alc_SOURCES) $(alcc_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +alc_SOURCES = alc.cpp \ + alcframe.cpp \ + ed2khash.cpp \ + alcpix.cpp \ + md4.cpp + +noinst_HEADERS = alc.h \ + alcc.h \ + alcframe.h \ + ed2khash.h \ + alcpix.h \ + md4.h \ + bithelp.h + +alc_CFLAGS = $(WX_CFLAGS) +alc_CXXFLAGS = $(WX_CXXFLAGS) +alc_LDADD = $(WX_LIBS) $(am__append_3) +alcc_SOURCES = alcc.cpp \ + ed2khash.cpp \ + md4.cpp + +alcc_CFLAGS = $(WXBASE_CFLAGS) +alcc_CXXFLAGS = $(WXBASE_CXXFLAGS) +alcc_LDADD = $(WXBASE_LIBS) + +# Resources +@NEED_RC_TRUE@SUFFIXES = .rc +@NEED_RC_TRUE@nodist_alcc_SOURCES = alcc-version.rc +@NEED_RC_TRUE@CLEANFILES = *-version.rc +MAINTAINERCLEANFILES = Makefile.in +all: all-am + +.SUFFIXES: +.SUFFIXES: .rc .$(OBJEXT) .cpp .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/aLinkCreator/src/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/utils/aLinkCreator/src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +alc$(EXEEXT): $(alc_OBJECTS) $(alc_DEPENDENCIES) + @rm -f alc$(EXEEXT) + $(CXXLINK) $(alc_LDFLAGS) $(alc_OBJECTS) $(alc_LDADD) $(LIBS) +alcc$(EXEEXT): $(alcc_OBJECTS) $(alcc_DEPENDENCIES) + @rm -f alcc$(EXEEXT) + $(CXXLINK) $(alcc_LDFLAGS) $(alcc_OBJECTS) $(alcc_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alc-alc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alc-alcframe.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alc-alcpix.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alc-ed2khash.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alc-md4.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alcc-alcc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alcc-ed2khash.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alcc-md4.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +alc-alc.o: alc.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-alc.o -MD -MP -MF "$(DEPDIR)/alc-alc.Tpo" -c -o alc-alc.o `test -f 'alc.cpp' || echo '$(srcdir)/'`alc.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/alc-alc.Tpo" "$(DEPDIR)/alc-alc.Po"; else rm -f "$(DEPDIR)/alc-alc.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='alc.cpp' object='alc-alc.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-alc.o `test -f 'alc.cpp' || echo '$(srcdir)/'`alc.cpp + +alc-alc.obj: alc.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-alc.obj -MD -MP -MF "$(DEPDIR)/alc-alc.Tpo" -c -o alc-alc.obj `if test -f 'alc.cpp'; then $(CYGPATH_W) 'alc.cpp'; else $(CYGPATH_W) '$(srcdir)/alc.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/alc-alc.Tpo" "$(DEPDIR)/alc-alc.Po"; else rm -f "$(DEPDIR)/alc-alc.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='alc.cpp' object='alc-alc.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-alc.obj `if test -f 'alc.cpp'; then $(CYGPATH_W) 'alc.cpp'; else $(CYGPATH_W) '$(srcdir)/alc.cpp'; fi` + +alc-alcframe.o: alcframe.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-alcframe.o -MD -MP -MF "$(DEPDIR)/alc-alcframe.Tpo" -c -o alc-alcframe.o `test -f 'alcframe.cpp' || echo '$(srcdir)/'`alcframe.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/alc-alcframe.Tpo" "$(DEPDIR)/alc-alcframe.Po"; else rm -f "$(DEPDIR)/alc-alcframe.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='alcframe.cpp' object='alc-alcframe.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-alcframe.o `test -f 'alcframe.cpp' || echo '$(srcdir)/'`alcframe.cpp + +alc-alcframe.obj: alcframe.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-alcframe.obj -MD -MP -MF "$(DEPDIR)/alc-alcframe.Tpo" -c -o alc-alcframe.obj `if test -f 'alcframe.cpp'; then $(CYGPATH_W) 'alcframe.cpp'; else $(CYGPATH_W) '$(srcdir)/alcframe.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/alc-alcframe.Tpo" "$(DEPDIR)/alc-alcframe.Po"; else rm -f "$(DEPDIR)/alc-alcframe.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='alcframe.cpp' object='alc-alcframe.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-alcframe.obj `if test -f 'alcframe.cpp'; then $(CYGPATH_W) 'alcframe.cpp'; else $(CYGPATH_W) '$(srcdir)/alcframe.cpp'; fi` + +alc-ed2khash.o: ed2khash.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-ed2khash.o -MD -MP -MF "$(DEPDIR)/alc-ed2khash.Tpo" -c -o alc-ed2khash.o `test -f 'ed2khash.cpp' || echo '$(srcdir)/'`ed2khash.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/alc-ed2khash.Tpo" "$(DEPDIR)/alc-ed2khash.Po"; else rm -f "$(DEPDIR)/alc-ed2khash.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ed2khash.cpp' object='alc-ed2khash.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-ed2khash.o `test -f 'ed2khash.cpp' || echo '$(srcdir)/'`ed2khash.cpp + +alc-ed2khash.obj: ed2khash.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-ed2khash.obj -MD -MP -MF "$(DEPDIR)/alc-ed2khash.Tpo" -c -o alc-ed2khash.obj `if test -f 'ed2khash.cpp'; then $(CYGPATH_W) 'ed2khash.cpp'; else $(CYGPATH_W) '$(srcdir)/ed2khash.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/alc-ed2khash.Tpo" "$(DEPDIR)/alc-ed2khash.Po"; else rm -f "$(DEPDIR)/alc-ed2khash.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ed2khash.cpp' object='alc-ed2khash.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-ed2khash.obj `if test -f 'ed2khash.cpp'; then $(CYGPATH_W) 'ed2khash.cpp'; else $(CYGPATH_W) '$(srcdir)/ed2khash.cpp'; fi` + +alc-alcpix.o: alcpix.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-alcpix.o -MD -MP -MF "$(DEPDIR)/alc-alcpix.Tpo" -c -o alc-alcpix.o `test -f 'alcpix.cpp' || echo '$(srcdir)/'`alcpix.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/alc-alcpix.Tpo" "$(DEPDIR)/alc-alcpix.Po"; else rm -f "$(DEPDIR)/alc-alcpix.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='alcpix.cpp' object='alc-alcpix.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-alcpix.o `test -f 'alcpix.cpp' || echo '$(srcdir)/'`alcpix.cpp + +alc-alcpix.obj: alcpix.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-alcpix.obj -MD -MP -MF "$(DEPDIR)/alc-alcpix.Tpo" -c -o alc-alcpix.obj `if test -f 'alcpix.cpp'; then $(CYGPATH_W) 'alcpix.cpp'; else $(CYGPATH_W) '$(srcdir)/alcpix.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/alc-alcpix.Tpo" "$(DEPDIR)/alc-alcpix.Po"; else rm -f "$(DEPDIR)/alc-alcpix.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='alcpix.cpp' object='alc-alcpix.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-alcpix.obj `if test -f 'alcpix.cpp'; then $(CYGPATH_W) 'alcpix.cpp'; else $(CYGPATH_W) '$(srcdir)/alcpix.cpp'; fi` + +alc-md4.o: md4.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-md4.o -MD -MP -MF "$(DEPDIR)/alc-md4.Tpo" -c -o alc-md4.o `test -f 'md4.cpp' || echo '$(srcdir)/'`md4.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/alc-md4.Tpo" "$(DEPDIR)/alc-md4.Po"; else rm -f "$(DEPDIR)/alc-md4.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='md4.cpp' object='alc-md4.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-md4.o `test -f 'md4.cpp' || echo '$(srcdir)/'`md4.cpp + +alc-md4.obj: md4.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-md4.obj -MD -MP -MF "$(DEPDIR)/alc-md4.Tpo" -c -o alc-md4.obj `if test -f 'md4.cpp'; then $(CYGPATH_W) 'md4.cpp'; else $(CYGPATH_W) '$(srcdir)/md4.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/alc-md4.Tpo" "$(DEPDIR)/alc-md4.Po"; else rm -f "$(DEPDIR)/alc-md4.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='md4.cpp' object='alc-md4.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-md4.obj `if test -f 'md4.cpp'; then $(CYGPATH_W) 'md4.cpp'; else $(CYGPATH_W) '$(srcdir)/md4.cpp'; fi` + +alcc-alcc.o: alcc.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -MT alcc-alcc.o -MD -MP -MF "$(DEPDIR)/alcc-alcc.Tpo" -c -o alcc-alcc.o `test -f 'alcc.cpp' || echo '$(srcdir)/'`alcc.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/alcc-alcc.Tpo" "$(DEPDIR)/alcc-alcc.Po"; else rm -f "$(DEPDIR)/alcc-alcc.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='alcc.cpp' object='alcc-alcc.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -c -o alcc-alcc.o `test -f 'alcc.cpp' || echo '$(srcdir)/'`alcc.cpp + +alcc-alcc.obj: alcc.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -MT alcc-alcc.obj -MD -MP -MF "$(DEPDIR)/alcc-alcc.Tpo" -c -o alcc-alcc.obj `if test -f 'alcc.cpp'; then $(CYGPATH_W) 'alcc.cpp'; else $(CYGPATH_W) '$(srcdir)/alcc.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/alcc-alcc.Tpo" "$(DEPDIR)/alcc-alcc.Po"; else rm -f "$(DEPDIR)/alcc-alcc.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='alcc.cpp' object='alcc-alcc.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -c -o alcc-alcc.obj `if test -f 'alcc.cpp'; then $(CYGPATH_W) 'alcc.cpp'; else $(CYGPATH_W) '$(srcdir)/alcc.cpp'; fi` + +alcc-ed2khash.o: ed2khash.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -MT alcc-ed2khash.o -MD -MP -MF "$(DEPDIR)/alcc-ed2khash.Tpo" -c -o alcc-ed2khash.o `test -f 'ed2khash.cpp' || echo '$(srcdir)/'`ed2khash.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/alcc-ed2khash.Tpo" "$(DEPDIR)/alcc-ed2khash.Po"; else rm -f "$(DEPDIR)/alcc-ed2khash.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ed2khash.cpp' object='alcc-ed2khash.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -c -o alcc-ed2khash.o `test -f 'ed2khash.cpp' || echo '$(srcdir)/'`ed2khash.cpp + +alcc-ed2khash.obj: ed2khash.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -MT alcc-ed2khash.obj -MD -MP -MF "$(DEPDIR)/alcc-ed2khash.Tpo" -c -o alcc-ed2khash.obj `if test -f 'ed2khash.cpp'; then $(CYGPATH_W) 'ed2khash.cpp'; else $(CYGPATH_W) '$(srcdir)/ed2khash.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/alcc-ed2khash.Tpo" "$(DEPDIR)/alcc-ed2khash.Po"; else rm -f "$(DEPDIR)/alcc-ed2khash.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ed2khash.cpp' object='alcc-ed2khash.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -c -o alcc-ed2khash.obj `if test -f 'ed2khash.cpp'; then $(CYGPATH_W) 'ed2khash.cpp'; else $(CYGPATH_W) '$(srcdir)/ed2khash.cpp'; fi` + +alcc-md4.o: md4.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -MT alcc-md4.o -MD -MP -MF "$(DEPDIR)/alcc-md4.Tpo" -c -o alcc-md4.o `test -f 'md4.cpp' || echo '$(srcdir)/'`md4.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/alcc-md4.Tpo" "$(DEPDIR)/alcc-md4.Po"; else rm -f "$(DEPDIR)/alcc-md4.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='md4.cpp' object='alcc-md4.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -c -o alcc-md4.o `test -f 'md4.cpp' || echo '$(srcdir)/'`md4.cpp + +alcc-md4.obj: md4.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -MT alcc-md4.obj -MD -MP -MF "$(DEPDIR)/alcc-md4.Tpo" -c -o alcc-md4.obj `if test -f 'md4.cpp'; then $(CYGPATH_W) 'md4.cpp'; else $(CYGPATH_W) '$(srcdir)/md4.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/alcc-md4.Tpo" "$(DEPDIR)/alcc-md4.Po"; else rm -f "$(DEPDIR)/alcc-md4.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='md4.cpp' object='alcc-md4.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -c -o alcc-md4.obj `if test -f 'md4.cpp'; then $(CYGPATH_W) 'md4.cpp'; else $(CYGPATH_W) '$(srcdir)/md4.cpp'; fi` +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-binPROGRAMS + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-binPROGRAMS uninstall-info-am + + +@NEED_RC_TRUE@.rc.$(OBJEXT): +@NEED_RC_TRUE@ $(RC) $(RCFLAGS) -I$(top_srcdir) -D__WIN95__ -D__WIN32__ -D__GNUWIN32__ -O COFF -i "$<" -o "$@" + +@NEED_RC_TRUE@alcrc.$(OBJEXT): $(srcdir)/../alc.rc alc-version.rc +@NEED_RC_TRUE@ cat $^ | \ +@NEED_RC_TRUE@ ( \ +@NEED_RC_TRUE@ abs_builddir=`pwd` ; \ +@NEED_RC_TRUE@ abs_top_srcdir=`cd $(top_srcdir) ; pwd` ; \ +@NEED_RC_TRUE@ cd $( "$@" + +@NEED_RC_TRUE@alcc-version.rc: $(top_builddir)/version.rc +@NEED_RC_TRUE@ @sed -e 's/VER_FILEDESCRIPTION_STR/"aMule Link Creator, Console"/' \ +@NEED_RC_TRUE@ -e 's/VER_INTERNALNAME_STR/"alcc"/' \ +@NEED_RC_TRUE@ -e 's/VER_ORIGINALFILENAME_STR/"alcc$(EXEEXT)"/' "$<" > "$@" +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/utils/aLinkCreator/src/alc.cpp b/src/utils/aLinkCreator/src/alc.cpp new file mode 100644 index 00000000..11770a14 --- /dev/null +++ b/src/utils/aLinkCreator/src/alc.cpp @@ -0,0 +1,65 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: Alc Class +/// +/// Purpose: aMule ed2k link creator +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Pixmaps from http://jimmac.musichall.cz/ikony.php3 | http://www.everaldo.com | http://www.icomania.com +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#ifdef HAVE_CONFIG_H +#include "config.h" // Needed for PACKAGE +#endif + +#include "alc.h" + +// Application implementation +IMPLEMENT_APP (alc) + +bool alc::OnInit () +{ +#ifndef _MSC_VER + // Used to tell wxCas to use aMule catalog + m_locale.Init(); + m_locale.AddCatalog(wxT(PACKAGE)); +#endif + + m_alcFrame = new AlcFrame (_("aLinkCreator, the aMule ed2k link creator")); + m_alcFrame->Show (true); + SetTopWindow (m_alcFrame); + return true; +} + +AlcFrame *alc::GetMainFrame() +{ + return (m_alcFrame); +} +// File_checked_for_headers diff --git a/src/utils/aLinkCreator/src/alc.h b/src/utils/aLinkCreator/src/alc.h new file mode 100644 index 00000000..fc4375fa --- /dev/null +++ b/src/utils/aLinkCreator/src/alc.h @@ -0,0 +1,61 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: Alc Class +/// +/// Purpose: aMule ed2k link creator +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Pixmaps from http://jimmac.musichall.cz/ikony.php3 | http://www.everaldo.com | http://www.icomania.com +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _ALC_H +#define _ALC_H + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include "alcframe.h" + +/// Application +class alc:public wxApp + { + private: + AlcFrame *m_alcFrame; + + protected: + wxLocale m_locale; // Used to tell wxCas to use aMule catalog + + public: + virtual bool OnInit (); + AlcFrame *GetMainFrame(); + }; + +DECLARE_APP (alc) + + +#endif /* _ALC_H */ +// File_checked_for_headers diff --git a/src/utils/aLinkCreator/src/alcc.cpp b/src/utils/aLinkCreator/src/alcc.cpp new file mode 100644 index 00000000..9ef37cb0 --- /dev/null +++ b/src/utils/aLinkCreator/src/alcc.cpp @@ -0,0 +1,124 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: Main wxBase App +/// +/// Purpose: aMule ed2k link creator +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#ifdef HAVE_CONFIG_H +#include "config.h" // Needed for PACKAGE +#endif + + +#include "alcc.h" +#include "ed2khash.h" + +// Application implementation +IMPLEMENT_APP (alcc) + +/// Running Alcc +int alcc::OnRun () +{ + // Used to tell wxCas to use aMule catalog + m_locale.Init(); + m_locale.AddCatalog(wxT(PACKAGE)); + + wxLog::DontCreateOnDemand(); + delete wxLog::SetActiveTarget(new wxLogStderr); // Replace printf by Log on Stderr + wxLog::SetTimestamp(NULL); // Disable timestamp on messages + + Ed2kHash hash; + size_t i; + for (i=0;i<(m_filesToHash.GetCount());++i) + { + if (wxFileExists(m_filesToHash[i])) + { + if (m_flagVerbose) + { + wxLogMessage(_("Processing file number %u: %s"),i+1,m_filesToHash[i].c_str()); + + if (m_flagPartHashes) + { + wxLogMessage(_("You have asked for part hashes (Only used for files > 9.5 MB)")); + } + } + + wxLogMessage(_("Please wait... ")); + + if (hash.SetED2KHashFromFile(m_filesToHash[i], NULL)) + { + wxLogMessage(wxT("%s ---> %s\n"),m_filesToHash[i].c_str(), + hash.GetED2KLink(m_flagPartHashes).c_str()); + } + } + else + { + wxLogMessage(_("%s ---> Non existant file !\n"),m_filesToHash[i].c_str()); + } + } + return 0; +} + +// On exit +int +alcc::OnExit() +{ + delete wxLog::SetActiveTarget(NULL); + return 0; +} + +/// Parse command line +void alcc::OnInitCmdLine(wxCmdLineParser& cmdline) +{ + cmdline.SetDesc(cmdLineDesc); +} + +/// Command line preocessing +bool alcc::OnCmdLineParsed(wxCmdLineParser& cmdline) +{ + + wxFileName filename; + size_t i; + + m_flagVerbose = cmdline.Found(wxT("v")); + m_flagPartHashes = cmdline.Found(wxT("p")); + + m_filesToHash.Clear(); + for (i = 0; i < cmdline.GetParamCount(); ++i) + { + filename.Assign(cmdline.GetParam(i)); + m_filesToHash.Add(filename.GetFullPath()); + } + m_filesToHash.Shrink(); + + return true; +} +// File_checked_for_headers diff --git a/src/utils/aLinkCreator/src/alcc.h b/src/utils/aLinkCreator/src/alcc.h new file mode 100644 index 00000000..84446799 --- /dev/null +++ b/src/utils/aLinkCreator/src/alcc.h @@ -0,0 +1,99 @@ +//////////////////////////////////////////////////////////////////////////////// +/// Name: Main wxBase App +/// +/// Purpose: aMule ed2k link creator +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +//////////////////////////////////////////////////////////////////////////////// + +#ifndef _ALCC_H +#define _ALCC_H + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include + +//----------------------------------------------------------------------------- +// This can be put in a separete include file +#include +static wxCSConv aMuleConv(wxT("iso8859-1")); +#ifdef wxUSE_UNICODE + #define unicode2char(x) (const char*) aMuleConv.cWX2MB(x) + #define char2unicode(x) aMuleConv.cMB2WX(x) +#else + #define unicode2char(x) x.c_str() + #define char2unicode(x) x +#endif +//----------------------------------------------------------------------------- + +/// Command line parameters +static const wxCmdLineEntryDesc cmdLineDesc[] = + { + { + wxCMD_LINE_SWITCH, wxT("h"), wxT("help"), wxT("show this help message"), wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP + }, + { wxCMD_LINE_SWITCH, wxT("v"), wxT("verbose"), wxT("be verbose"), wxCMD_LINE_VAL_NONE, wxCMD_LINE_PARAM_OPTIONAL}, + + { wxCMD_LINE_SWITCH, wxT("p"), wxT("parthashes"), wxT("add part-hashes to ed2k link"), wxCMD_LINE_VAL_NONE,wxCMD_LINE_PARAM_OPTIONAL }, + + { wxCMD_LINE_PARAM, NULL, NULL, wxT("input files"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE }, + + { wxCMD_LINE_NONE, NULL, NULL, NULL, wxCMD_LINE_VAL_NONE, 0 } + }; + + +// Application +class alcc : public wxAppConsole +{ + private: + bool m_flagVerbose ; + bool m_flagPartHashes; + wxArrayString m_filesToHash; + + /// Parse command line + virtual void OnInitCmdLine(wxCmdLineParser& cmdline); + + /// Command line preocessing + virtual bool OnCmdLineParsed(wxCmdLineParser& cmdline); + + protected: + wxLocale m_locale; // Used to tell wxCas to use aMule catalog + + public: + /// Application + virtual int OnRun (); + + /// Cleaning on exit + virtual int OnExit(); +}; + +DECLARE_APP(alcc) + +#endif /* _ALCC_H */ + +// File_checked_for_headers diff --git a/src/utils/aLinkCreator/src/alcframe.cpp b/src/utils/aLinkCreator/src/alcframe.cpp new file mode 100644 index 00000000..1748c418 --- /dev/null +++ b/src/utils/aLinkCreator/src/alcframe.cpp @@ -0,0 +1,636 @@ +//////////////////////////////////////////////////////////////////////////////// +/// Name: AlcFrame Class +/// +/// Purpose: aMule ed2k link creator +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Copyright (C) 2004 by Phoenix +/// +/// Pixmaps from: +/// http://jimmac.musichall.cz/ikony.php3 +/// http://www.everaldo.com +/// http://www.icomania.com +/// +/// 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 +/// (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 +/// the Free Software Foundation; either version 2 of the License, or +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __WXMSW__ + #include + #include +#elif defined(__WXMAC__) + #include + #include + #include +#endif + +#include "md4.h" +#include "ed2khash.h" +#include "alcframe.h" +#include "alcpix.h" +#include "alc.h" + +/// Constructor +AlcFrame::AlcFrame (const wxString & title): + wxFrame ((wxFrame *) NULL, -1, title) +{ + // Give it an icon +#ifdef __WXMSW__ + wxIcon icon(wxT("alc")); +#else + wxIcon icon; + icon.CopyFromBitmap(AlcPix::getPixmap(wxT("alc"))); +#endif + SetIcon (icon); + + // Status Bar + CreateStatusBar (); + SetStatusText (_("Welcome!")); + + // Unused dialog for now + m_progressBar = NULL; + + // Frame Vertical sizer + m_frameVBox = new wxBoxSizer (wxVERTICAL); + + // Add Main panel to frame (needed by win32 for padding sub panels) + m_mainPanel = new wxPanel (this, -1); + + // Main Panel Vertical Sizer + m_mainPanelVBox = new wxBoxSizer (wxVERTICAL); + + // Main Panel static line + m_staticLine = new wxStaticLine (m_mainPanel, -1); + m_mainPanelVBox->Add (m_staticLine, 0, wxALL | wxGROW); + + // Input Parameters + m_inputSBox = + new wxStaticBox (m_mainPanel, -1, _("Input parameters")); + m_inputSBoxSizer = new wxStaticBoxSizer (m_inputSBox, wxHORIZONTAL); + + // Input Grid + m_inputFlexSizer = new wxFlexGridSizer (6, 2, 5, 10); + + // Left col is growable + m_inputFlexSizer->AddGrowableCol (0); + + // Static texts + m_inputFileStaticText=new wxStaticText(m_mainPanel, -1, + _("File to Hash"), + wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE); + + m_inputAddStaticText=new wxStaticText(m_mainPanel, -1, + _("Add Optional URLs for this file"), + wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE); + + // Text ctrls + m_inputFileTextCtrl = new wxTextCtrl (m_mainPanel,-1,wxEmptyString, + wxDefaultPosition, wxSize(300,-1)); + m_inputFileTextCtrl-> + SetToolTip (_ + ("Enter here the file you want to compute the Ed2k link")); + + m_inputAddTextCtrl = new wxTextCtrl (m_mainPanel,-1,wxEmptyString, + wxDefaultPosition, wxSize(300,-1)); + m_inputAddTextCtrl-> + SetToolTip (_ + ("Enter here the URL you want to add to the Ed2k link: Add / at the end to let aLinkCreator append the current file name")); + + // List box + m_inputUrlListBox = new wxListBox(m_mainPanel, -1, wxDefaultPosition, + wxDefaultSize, 0, NULL, wxLB_SINGLE | wxLB_NEEDED_SB | wxLB_HSCROLL); + + // Buttons + m_inputFileBrowseButton = + new wxButton (m_mainPanel, ID_BROWSE_BUTTON, wxString (_("Browse"))); + + m_inputAddButton = + new wxButton (m_mainPanel, ID_ADD_BUTTON, wxString (_("Add"))); + + // Button bar + m_buttonUrlVBox = new wxBoxSizer (wxVERTICAL); + m_removeButton = + new wxButton (m_mainPanel, ID_REMOVE_BUTTON, wxString (_("Remove"))); + m_clearButton = + new wxButton (m_mainPanel, ID_CLEAR_BUTTON, wxString (_("Clear"))); + + m_buttonUrlVBox->Add (m_removeButton, 0, wxALIGN_CENTER | wxTOP | wxBOTTOM, 5); + m_buttonUrlVBox->Add (m_clearButton, 0, wxALIGN_CENTER | wxTOP | wxBOTTOM, 5); + + // Check button + m_parthashesCheck = + new wxCheckBox (m_mainPanel, ID_PARTHASHES_CHECK, + _ + ("Create link with part-hashes")); + + m_parthashesCheck->SetValue(false); + + m_parthashesCheck-> + SetToolTip (_ + ("Help to spread new and rare files faster, at the cost of an increased link size")); + + // Add to sizers + m_inputFlexSizer->Add (m_inputFileStaticText, 1, wxGROW | wxALIGN_BOTTOM | wxTOP, 10); + m_inputFlexSizer->Add (1,1); + + m_inputFlexSizer->Add (m_inputFileTextCtrl, 1, wxGROW | wxALIGN_TOP , 0); + m_inputFlexSizer->Add (m_inputFileBrowseButton, 0, wxGROW | wxALIGN_TOP , 0); + + m_inputFlexSizer->Add (m_inputAddStaticText, 1, wxGROW | wxALIGN_BOTTOM | wxTOP, 10); + m_inputFlexSizer->Add (1,1); + + m_inputFlexSizer->Add (m_inputAddTextCtrl, 1, wxGROW | wxALIGN_TOP , 0); + m_inputFlexSizer->Add (m_inputAddButton, 0, wxGROW | wxALIGN_TOP , 0); + + m_inputFlexSizer->Add (m_inputUrlListBox, 0, wxGROW | wxALIGN_CENTER , 0); + m_inputFlexSizer->Add (m_buttonUrlVBox, 0, wxGROW | wxALIGN_CENTER , 0); + + m_inputFlexSizer->Add (m_parthashesCheck, 0, wxGROW | wxALIGN_CENTER | wxTOP, 10); + m_inputFlexSizer->Add (1,1); + + m_inputSBoxSizer->Add (m_inputFlexSizer, 1, wxGROW | wxALIGN_CENTER | wxALL, 10); + m_mainPanelVBox->Add (m_inputSBoxSizer, 0, wxGROW | wxALIGN_CENTER | wxALL, 10); + +#ifdef WANT_MD4SUM + // MD4 Hash Vertical Box Sizer + m_md4HashSBox = new wxStaticBox (m_mainPanel, -1, _("MD4 File Hash")); + m_md4HashSBoxSizer = new wxStaticBoxSizer (m_md4HashSBox, wxHORIZONTAL); + + // MD4 Hash results + m_md4HashTextCtrl = new wxTextCtrl( m_mainPanel, -1, wxEmptyString, wxDefaultPosition, + wxDefaultSize, wxTE_READONLY ); + + m_md4HashSBoxSizer->Add (m_md4HashTextCtrl, 1, wxALL | wxALIGN_CENTER, 5); + m_mainPanelVBox->Add( m_md4HashSBoxSizer, 0, wxALL | wxGROW, 10 ); +#endif + + // Hash Vertical Box Sizer + m_e2kHashSBox = new wxStaticBox (m_mainPanel, -1, _("Ed2k File Hash")); + m_e2kHashSBoxSizer = new wxStaticBoxSizer (m_e2kHashSBox, wxHORIZONTAL); + + // Hash results + m_e2kHashTextCtrl = new wxTextCtrl( m_mainPanel, -1, wxEmptyString, wxDefaultPosition, + wxDefaultSize, wxTE_READONLY ); + + m_e2kHashSBoxSizer->Add (m_e2kHashTextCtrl, 1, wxALL | wxALIGN_CENTER, 5); + m_mainPanelVBox->Add( m_e2kHashSBoxSizer, 0, wxALL | wxGROW, 10 ); + + // Ed2k Vertical Box Sizer + m_ed2kSBox = new wxStaticBox (m_mainPanel, -1, _("Ed2k link")); + m_ed2kSBoxSizer = new wxStaticBoxSizer (m_ed2kSBox, wxVERTICAL); + + // Ed2k results + m_ed2kTextCtrl = new wxTextCtrl( m_mainPanel, -1, wxEmptyString, wxDefaultPosition, + wxSize(-1,60), wxTE_MULTILINE|wxTE_READONLY|wxVSCROLL ); + + m_ed2kSBoxSizer->Add (m_ed2kTextCtrl, 1, wxALL | wxGROW, 5); + m_mainPanelVBox->Add( m_ed2kSBoxSizer, 1, wxALL | wxGROW, 10 ); + + // Button bar + m_buttonHBox = new wxBoxSizer (wxHORIZONTAL); + m_startButton = + new wxButton (m_mainPanel, ID_START_BUTTON, wxString (_("Start"))); + m_saveButton = + new wxButton (m_mainPanel, ID_SAVEAS_BUTTON, wxString (_("Save"))); + m_copyButton = + new wxButton (m_mainPanel, ID_COPY_BUTTON, wxString (_("Copy to clipboard"))); + m_closeButton = + new wxButton (m_mainPanel, ID_EXIT_BUTTON, wxString (_("Exit"))); + + m_buttonHBox->Add (m_copyButton, 0, wxALIGN_LEFT | wxALL, 5); + m_buttonHBox->Add(1,1,1); + m_buttonHBox->Add (m_startButton, 0, wxALIGN_RIGHT | wxALL, 5); + m_buttonHBox->Add (m_saveButton, 0, wxALIGN_RIGHT | wxALL, 5); + m_buttonHBox->Add (m_closeButton, 0, wxALIGN_RIGHT | wxALL, 5); + + + m_mainPanelVBox->Add (m_buttonHBox, 0, wxALL | wxGROW, 5); + + // Toolbar Pixmaps + m_toolBarBitmaps[0] = AlcPix::getPixmap(wxT("open")); + m_toolBarBitmaps[1] = AlcPix::getPixmap(wxT("copy")); + m_toolBarBitmaps[2] = AlcPix::getPixmap(wxT("saveas")); + m_toolBarBitmaps[3] = AlcPix::getPixmap(wxT("about")); + + // Constructing toolbar + m_toolbar = + new wxToolBar (this, -1, wxDefaultPosition, wxDefaultSize, + wxTB_HORIZONTAL | wxTB_FLAT); + + m_toolbar->SetToolBitmapSize (wxSize (32, 32)); + m_toolbar->SetMargins (2, 2); + + m_toolbar->AddTool (ID_BAR_OPEN, wxT("Open"), m_toolBarBitmaps[0], + _("Open a file to compute its ed2k link")); + + m_toolbar->AddTool (ID_BAR_COPY, wxT("Copy"), m_toolBarBitmaps[1], + _("Copy computed ed2k link to clipboard")); + + m_toolbar->AddTool (ID_BAR_SAVEAS, wxT("Save as"), m_toolBarBitmaps[2], + _("Save computed ed2k link to file")); + + m_toolbar->AddSeparator (); + + m_toolbar->AddTool (ID_BAR_ABOUT, wxT("About"), m_toolBarBitmaps[3], + _("About aLinkCreator")); + + m_toolbar->Realize (); + + SetToolBar (m_toolbar); + + // Main panel Layout + m_mainPanel->SetAutoLayout(true); + m_mainPanel->SetSizerAndFit (m_mainPanelVBox); + + // Frame Layout + m_frameVBox->Add (m_mainPanel, 1, wxALL | wxGROW, 0); + SetAutoLayout (true); + SetSizerAndFit (m_frameVBox); + + m_startButton->SetFocus(); +} + +/// Destructor +AlcFrame::~AlcFrame () +{} + +/// Events table +BEGIN_EVENT_TABLE (AlcFrame, wxFrame) +EVT_TOOL (ID_BAR_OPEN, AlcFrame::OnBarOpen) +EVT_TOOL (ID_BAR_SAVEAS, AlcFrame::OnBarSaveAs) +EVT_TOOL (ID_BAR_COPY, AlcFrame::OnBarCopy) +EVT_TOOL (ID_BAR_ABOUT, AlcFrame::OnBarAbout) +EVT_BUTTON (ID_START_BUTTON, AlcFrame::OnStartButton) +EVT_BUTTON (ID_EXIT_BUTTON, AlcFrame::OnCloseButton) +EVT_BUTTON (ID_SAVEAS_BUTTON, AlcFrame::OnSaveAsButton) +EVT_BUTTON (ID_COPY_BUTTON, AlcFrame::OnCopyButton) +EVT_BUTTON (ID_BROWSE_BUTTON, AlcFrame::OnBrowseButton) +EVT_BUTTON (ID_ADD_BUTTON, AlcFrame::OnAddUrlButton) +EVT_BUTTON (ID_REMOVE_BUTTON, AlcFrame::OnRemoveUrlButton) +EVT_BUTTON (ID_CLEAR_BUTTON, AlcFrame::OnClearUrlButton) +END_EVENT_TABLE () + +/// Toolbar Open button +void +AlcFrame::OnBarOpen (wxCommandEvent & WXUNUSED(event)) +{ + SetFileToHash(); +} + +/// Browse button to select file to hash +void +AlcFrame::OnBrowseButton (wxCommandEvent & WXUNUSED(event)) +{ + SetFileToHash(); +} + +/// Set File to hash in wxTextCtrl +void +AlcFrame::SetFileToHash() +{ +#ifdef __WXMSW__ + wxString browseroot; + LPITEMIDLIST pidl; + HRESULT hr = SHGetSpecialFolderLocation(NULL, CSIDL_PERSONAL, &pidl); + if (SUCCEEDED(hr)) { + if (!SHGetPathFromIDList(pidl, wxStringBuffer(browseroot, MAX_PATH))) { + browseroot = wxFileName::GetHomeDir(); + } + } else { + browseroot = wxFileName::GetHomeDir(); + } + if (pidl) { + LPMALLOC pMalloc; + SHGetMalloc(&pMalloc); + if (pMalloc) { + pMalloc->Free(pidl); + pMalloc->Release(); + } + } +#elif defined(__WXMAC__) + + FSRef fsRef; + wxString browseroot; + if (FSFindFolder(kUserDomain, kDocumentsFolderType, kCreateFolder, &fsRef) == noErr) + { + CFURLRef urlRef = CFURLCreateFromFSRef(NULL, &fsRef); + CFStringRef cfString = CFURLCopyFileSystemPath(urlRef, kCFURLPOSIXPathStyle); + CFRelease(urlRef) ; + browseroot = wxMacCFStringHolder(cfString).AsString(wxLocale::GetSystemEncoding()); + } else { + browseroot = wxFileName::GetHomeDir(); + } + +#else + wxString browseroot = wxFileName::GetHomeDir(); +#endif + const wxString & filename = + wxFileSelector (_("Select the file you want to compute the ed2k link"), + browseroot, wxEmptyString, wxEmptyString, wxT("*.*"), + wxFD_OPEN | wxFD_FILE_MUST_EXIST, this); + + if (!filename.empty ()) + { + m_inputFileTextCtrl->SetValue(filename); + } +} + +/// Toolbar Save As button +void +AlcFrame::OnBarSaveAs (wxCommandEvent & WXUNUSED(event)) +{ + SaveEd2kLinkToFile(); +} + +/// Save As button +void +AlcFrame::OnSaveAsButton(wxCommandEvent & WXUNUSED(event)) +{ + SaveEd2kLinkToFile(); +} + +/// Copy Ed2k link to clip board +void +AlcFrame::CopyEd2kLinkToClipBoard() +{ + wxString link = m_ed2kTextCtrl->GetValue(); + if (!link.IsEmpty()) + { + wxClipboardLocker clipLocker; + if ( !clipLocker ) + { + wxLogError(wxT("Can't open the clipboard")); + + return; + } + + wxTheClipboard->AddData(new wxTextDataObject(link)); + } + else + { + SetStatusText (_("Nothing to copy for now !")); + } +} + +/// Copy button +void +AlcFrame::OnCopyButton(wxCommandEvent & WXUNUSED(event)) +{ + CopyEd2kLinkToClipBoard(); +} + +/// Toolbar Copy button +void +AlcFrame::OnBarCopy(wxCommandEvent & WXUNUSED(event)) +{ + CopyEd2kLinkToClipBoard(); +} + +/// Save computed Ed2k link to file +void +AlcFrame::SaveEd2kLinkToFile() +{ + wxString link(m_ed2kTextCtrl->GetValue()); + + if (!link.IsEmpty()) + { + const wxString & filename = + wxFileSelector (_("Select the file to your computed ed2k link"), + wxFileName::GetHomeDir(),wxT("my_ed2k_link"), + wxT("txt"), wxT("*.txt"), wxFD_SAVE, this); + + if (!filename.empty ()) + { + // Open file and let wxFile destructor close the file + // Closing it explicitly may crash on Win32 ... + wxFile file(filename,wxFile::write_append); + if (! file.IsOpened()) + { + SetStatusText (_("Unable to open ") + filename); + return; + } + file.Write(link + wxTextFile::GetEOL()); + } + else + { + SetStatusText (_("Please, enter a non empty file name")); + } + } + else + { + SetStatusText (_("Nothing to save for now !")); + } +} + +/// Toolbar About button +void +AlcFrame::OnBarAbout (wxCommandEvent & WXUNUSED(event)) +{ + wxMessageBox (_ + ("aLinkCreator, the aMule ed2k link creator\n\n(c) 2004 ThePolish \n\nPixmaps from http://www.everaldo.com and http://www.icomania.com\nand http://jimmac.musichall.cz/ikony.php3\n\nDistributed under GPL"), + _("About aLinkCreator"), wxOK | wxCENTRE | wxICON_INFORMATION); +} + +/// Close Button +void AlcFrame::OnCloseButton (wxCommandEvent & WXUNUSED(event)) +{ + Close (false); +} + +/// Hook into MD4/ED2K routine +bool AlcFrame::Hook(int percent) +{ + // Update progress bar + bool goAhead = ::wxGetApp().GetMainFrame()->m_progressBar->Update(percent); + if (!goAhead) + { + // Destroying progressbar: no merci for croissants ! + ::wxGetApp().GetMainFrame()->m_progressBar->Destroy(); + // Now, be paranoid + delete ::wxGetApp().GetMainFrame()->m_progressBar; + ::wxGetApp().GetMainFrame()->m_progressBar = NULL; + } + + return (goAhead); +} + +/// Compute Hashes on Start Button +void AlcFrame::OnStartButton (wxCommandEvent & WXUNUSED(event)) +{ + int i; + wxString filename = m_inputFileTextCtrl->GetValue(); + + if (!filename.empty ()) + { + // Initialize computation + m_goAhead=true; + + // Chrono + wxStopWatch chrono; + + // wxFileName needed for base name + wxFileName fileToHash(filename); + + // Set waiting msg + m_e2kHashTextCtrl->SetValue(_("Hashing...")); + m_ed2kTextCtrl->SetValue(_("Hashing...")); + +#ifdef WANT_MD4SUM + // Create MD4 progress bar dialog + m_progressBar=new wxProgressDialog (wxT("aLinkCreator is working for you"), wxT("Computing MD4 Hash..."), + 100, this, wxPD_AUTO_HIDE | wxPD_CAN_ABORT | wxPD_REMAINING_TIME); + m_md4HashTextCtrl->SetValue(_("Hashing...")); + + // Md4 hash + MD4 md4; + m_md4HashTextCtrl->SetValue(md4.calcMd4FromFile(filename,Hook)); + + // Deleting MD4 progress bar dialog + delete m_progressBar; + m_progressBar=NULL; + +#endif + + // Create ED2K progress bar dialog + m_progressBar=new wxProgressDialog (wxT("aLinkCreator is working for you"), wxT("Computing ED2K Hashes..."), + 100, this, wxPD_AUTO_HIDE | wxPD_CAN_ABORT | wxPD_REMAINING_TIME); + + // Compute ed2k Hash + Ed2kHash hash; + + // Test the return value to see if was aborted. + if (hash.SetED2KHashFromFile(filename, Hook)) + { + + wxArrayString ed2kHash (hash.GetED2KHash()); + + // Get URLs + wxArrayString arrayOfUrls; + wxString url; + for (i=0;i < m_inputUrlListBox->GetCount();++i) + { + url=m_inputUrlListBox->GetString(i); + if (url.Right(1) == wxT("/")) + { + url += fileToHash.GetFullName(); + } + arrayOfUrls.Add(wxURI(url).BuildURI()); + } + arrayOfUrls.Shrink(); // Reduce memory usage + + // Ed2k hash + m_e2kHashTextCtrl->SetValue(ed2kHash.Last()); + + // Ed2k link + m_ed2kTextCtrl->SetValue(hash.GetED2KLink(m_parthashesCheck->IsChecked(), &arrayOfUrls)); + } + else + { + // Set cancelled msg + m_e2kHashTextCtrl->SetValue(_("Cancelled !")); + m_ed2kTextCtrl->SetValue(_("Cancelled !")); + } + + // Deleting progress bar dialog + delete m_progressBar; + m_progressBar=NULL; + + // Set status text + SetStatusText (wxString::Format(_("Done in %.2f s"), + chrono.Time()*.001)); + } + else + { + // Set status text + SetStatusText (_("Please, enter a non empty file name")); + } +} + + +/// Add an URL to the URL list box +void +AlcFrame::OnAddUrlButton (wxCommandEvent & WXUNUSED(event)) +{ + wxString url(m_inputAddTextCtrl->GetValue()); + + if (!url.IsEmpty()) + { + // Check if the URL already exist in list + int i; + bool UrlNotExists = true; + for (i=0;i < m_inputUrlListBox->GetCount();++i) + { + if (url == m_inputUrlListBox->GetString(i)) + { + UrlNotExists =false; + break; + } + } + + // Add only a not already existant URL + if (UrlNotExists) + { + m_inputUrlListBox->Append(wxURI(url).BuildURI()); + m_inputAddTextCtrl->SetValue(wxEmptyString); + } + else + { + wxLogError(_("You have already added this URL !")); + } + } + else + { + SetStatusText (_("Please, enter a non empty URL")); + } +} + +/// Remove the selected URL from the URL list box +void +AlcFrame::OnRemoveUrlButton (wxCommandEvent & WXUNUSED(event)) +{ + m_inputUrlListBox->Delete(m_inputUrlListBox->GetSelection()); +} + +/// Clear the URL list box +void +AlcFrame::OnClearUrlButton (wxCommandEvent & WXUNUSED(event)) +{ + m_inputUrlListBox->Clear(); +} +// File_checked_for_headers diff --git a/src/utils/aLinkCreator/src/alcframe.h b/src/utils/aLinkCreator/src/alcframe.h new file mode 100644 index 00000000..af196bae --- /dev/null +++ b/src/utils/aLinkCreator/src/alcframe.h @@ -0,0 +1,184 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: AlcFrame Class +/// +/// Purpose: aMule ed2k link creator +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Copyright (C) 2004 by Phoenix +/// +/// Pixmaps from http://jimmac.musichall.cz/ikony.php3 | http://www.everaldo.com | http://www.icomania.com +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _ALCFRAME_H +#define _ALCFRAME_H + +// For compilers that support precompilation, includes "wx/wx.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include +#include + + +// Compute and display md4sum or not +//#define WANT_MD4SUM 1 + + +/// Main Alc Frame +class AlcFrame:public wxFrame + { + private: + wxToolBar *m_toolbar; + wxBitmap m_toolBarBitmaps[4]; + + wxBoxSizer *m_frameVBox; + + wxPanel *m_mainPanel; + wxBoxSizer *m_mainPanelVBox; + + wxStaticLine *m_staticLine; + + wxStaticBox *m_inputSBox; + wxStaticBoxSizer* m_inputSBoxSizer; + wxFlexGridSizer *m_inputFlexSizer; + wxStaticText *m_inputFileStaticText; + wxTextCtrl *m_inputFileTextCtrl; + wxButton *m_inputFileBrowseButton ; + wxStaticText *m_inputAddStaticText; + wxTextCtrl *m_inputAddTextCtrl; + wxButton *m_inputAddButton ; + wxListBox *m_inputUrlListBox; + wxBoxSizer *m_buttonUrlVBox; + wxButton *m_removeButton; + wxButton *m_clearButton; + wxCheckBox *m_parthashesCheck; + + wxProgressDialog *m_progressBar; + bool m_goAhead; + + +#ifdef WANT_MD4SUM + + wxStaticBox *m_md4HashSBox; + wxStaticBoxSizer* m_md4HashSBoxSizer; + wxTextCtrl *m_md4HashTextCtrl; +#endif + + wxStaticBox *m_e2kHashSBox; + wxStaticBoxSizer* m_e2kHashSBoxSizer; + wxTextCtrl *m_e2kHashTextCtrl; + + wxStaticBox *m_ed2kSBox; + wxStaticBoxSizer* m_ed2kSBoxSizer; + wxTextCtrl *m_ed2kTextCtrl; + + wxBoxSizer* m_buttonHBox; + wxButton *m_copyButton; + wxButton *m_startButton; + wxButton *m_saveButton; + wxButton *m_closeButton; + + enum + { + ID_BAR_OPEN = 1000, + ID_BAR_SAVEAS, + ID_BAR_COPY, + ID_BAR_ABOUT, + ID_START_BUTTON, + ID_SAVEAS_BUTTON, + ID_COPY_BUTTON, + ID_EXIT_BUTTON, + ID_BROWSE_BUTTON, + ID_ADD_BUTTON, + ID_REMOVE_BUTTON, + ID_CLEAR_BUTTON, + ID_PARTHASHES_CHECK + }; + + /// Set File to hash in wxTextCtrl + void SetFileToHash(); + + /// Save computed Ed2k link to file + void SaveEd2kLinkToFile(); + + /// Copy Ed2k link to clip board + void CopyEd2kLinkToClipBoard(); + + protected: + + /// Toolbar Open button + void OnBarOpen (wxCommandEvent & event); + + /// Toolbar Save As button + void OnBarSaveAs (wxCommandEvent & event); + + /// Toolbar Copy button + void OnBarCopy(wxCommandEvent & event); + + /// Toolbar About button + void OnBarAbout (wxCommandEvent & event); + + /// Close Button + void OnCloseButton (wxCommandEvent & event); + + /// Save As button + void OnSaveAsButton(wxCommandEvent & event); + + /// Copy button + void OnCopyButton(wxCommandEvent & event); + + /// Compute Hashes on Start Button + void OnStartButton (wxCommandEvent & event); + + /// Browse button to select file to hash + void OnBrowseButton (wxCommandEvent & event); + + /// Add an URL to the URL list box + void OnAddUrlButton (wxCommandEvent & event); + + /// Remove the selected URL from the URL list box + void OnRemoveUrlButton (wxCommandEvent & event); + + /// Clear the URL list box + void OnClearUrlButton (wxCommandEvent & event); + + DECLARE_EVENT_TABLE () + + public: + /// Constructor + AlcFrame (const wxString& title); + + /// Destructor + ~AlcFrame (); + + // Hook function for external update of the progress bar + static bool Hook(int percent); + }; + +#endif /* _ALCFRAME_H */ +// File_checked_for_headers diff --git a/src/utils/aLinkCreator/src/alcpix.cpp b/src/utils/aLinkCreator/src/alcpix.cpp new file mode 100644 index 00000000..75010cdd --- /dev/null +++ b/src/utils/aLinkCreator/src/alcpix.cpp @@ -0,0 +1,2646 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: AlcPix Class +/// +/// Purpose: aMule ed2k link creator +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Pixmaps from http://jimmac.musichall.cz/ikony.php3 | http://www.everaldo.com | http://www.icomania.com +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include "alcpix.h" + +wxBitmap AlcPix::getPixmap(const wxString& name) +{ + if (name == wxT("about")) + { + wxBitmap bitmap(m_about_xpm); + return bitmap; + } +#ifndef __WXMSW__ + else if (name == wxT("alc")) + { + wxBitmap bitmap(m_alc_xpm); + return bitmap; + } +#endif + else if (name == wxT("copy")) + { + wxBitmap bitmap(m_copy_xpm); + return bitmap; + } + else if (name == wxT("open")) + { + wxBitmap bitmap(m_open_xpm); + return bitmap; + } + else if (name == wxT("saveas")) + { + wxBitmap bitmap(m_saveas_xpm); + return bitmap; + } + else + { + return wxNullBitmap; + } +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// +/// Several themes follow. Switch them by CPP macro in alcpix.h +/// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifdef WANT_KDE_THEME +const char * +AlcPix::m_about_xpm[]= + { /* XPM */ + /* columns rows colors chars-per-pixel */ + "32 32 251 2", + " c black", + ". c #890000", + "X c #8A0000", + "o c #8B0000", + "O c #8C0000", + "+ c #8D0000", + "@ c #8E0000", + "# c #8F0000", + "$ c #900000", + "% c #910000", + "& c #920000", + "* c #930000", + "= c #940000", + "- c #950000", + "; c #960000", + ": c #970000", + "> c #980000", + ", c #990000", + "< c #9A0000", + "1 c #9B0000", + "2 c #9B0202", + "3 c #9C0000", + "4 c #9D0000", + "5 c #9E0000", + "6 c #9F0000", + "7 c #9B0909", + "8 c #9C0B0B", + "9 c #A00000", + "0 c #A20000", + "q c #A30000", + "w c #A40000", + "e c #A50000", + "r c #A60000", + "t c #A70000", + "y c #A80000", + "u c #A90000", + "i c #AA0000", + "p c #AB0000", + "a c #AC0000", + "s c #AD0000", + "d c #AE0000", + "f c #AF0000", + "g c #A90B0B", + "h c #AD0909", + "j c #B00000", + "k c #B10000", + "l c #B20000", + "z c #B30000", + "x c #B40000", + "c c #B50000", + "v c #B60000", + "b c #B70000", + "n c #B80000", + "m c #B90000", + "M c #BA0000", + "N c #BB0000", + "B c #BB0202", + "V c #BC0000", + "C c #BD0000", + "Z c #BE0000", + "A c #BF0000", + "S c #C00000", + "D c #C10000", + "F c #C20000", + "G c #C30000", + "H c #C40000", + "J c #C50000", + "K c #C60000", + "L c #C70000", + "P c #C60F0F", + "I c #C80000", + "U c #C90000", + "Y c #CA0000", + "T c #CB0000", + "R c #CC0000", + "E c #CD0000", + "W c #CC0B0B", + "Q c #D20000", + "! c #D50000", + "~ c #D60000", + "^ c #D70000", + "/ c #D50505", + "( c #D20E0E", + ") c #D70F0F", + "_ c #D80000", + "` c #D90000", + "' c #DD0000", + "] c #D51111", + "[ c #D21818", + "{ c #D41A1A", + "} c #DC1D1D", + "| c #C02626", + " . c #C62020", + ".. c #C72626", + "X. c #CF3E3E", + "o. c #D22020", + "O. c #D42121", + "+. c #D92222", + "@. c #D92323", + "#. c #DA2626", + "$. c #DE2121", + "%. c #D53030", + "&. c #DB3030", + "*. c #DD3C3C", + "=. c #DF3C3C", + "-. c #E10000", + ";. c #E20000", + ":. c #E30000", + ">. c #E30505", + ",. c #E40000", + "<. c #E30D0D", + "1. c #EA0101", + "2. c #EA0404", + "3. c #E01A1A", + "4. c #EC1919", + "5. c #F20000", + "6. c #F30707", + "7. c #F40000", + "8. c #F70000", + "9. c #F50808", + "0. c #F50D0D", + "q. c #F80000", + "w. c #FA0101", + "e. c #FB0000", + "r. c #FC0000", + "t. c #FD0000", + "y. c #FD0101", + "u. c #FE0000", + "i. c #FE0101", + "p. c #FF0202", + "a. c #FF0808", + "s. c #FE0E0E", + "d. c #FF0F0F", + "f. c #F41010", + "g. c #FF1414", + "h. c #FF1818", + "j. c #E52020", + "k. c #EB2F2F", + "l. c #EB3E3E", + "z. c #F42020", + "x. c #F72E2E", + "c. c #FF2020", + "v. c #FF2222", + "b. c #F82F2F", + "n. c #FF2B2B", + "m. c #FF2D2D", + "M. c #F23030", + "N. c #F43030", + "B. c #F63030", + "V. c #F73232", + "C. c #F53E3E", + "Z. c #F93030", + "A. c #FF3434", + "S. c #FF3737", + "D. c #F83838", + "F. c #DA4B4B", + "G. c #D45252", + "H. c #DA5252", + "J. c #EB4848", + "K. c #EC4848", + "L. c #F64545", + "P. c #FF4343", + "I. c #FF4646", + "U. c #FB4848", + "Y. c #FF4E4E", + "T. c #F75858", + "R. c #FB5656", + "E. c #FF5050", + "W. c #FE5252", + "Q. c #FF5858", + "!. c #FF5A5A", + "~. c #EB6F6F", + "^. c #F56C6C", + "/. c #FA6262", + "(. c #FF6060", + "). c #FF6666", + "_. c #FF6767", + "`. c #F96F6F", + "'. c #FA6C6C", + "]. c #FF6969", + "[. c #FF6C6C", + "{. c #F97676", + "}. c #FF7272", + "|. c #FF7676", + " X c #FD7A7A", + ".X c #FF7B7B", + "XX c #FF7E7E", + "oX c #D98181", + "OX c #E48383", + "+X c #E58383", + "@X c #E88B8B", + "#X c #E88C8C", + "$X c #E99292", + "%X c #EB9090", + "&X c #EE9393", + "*X c #ED9C9C", + "=X c #F58282", + "-X c #FA8181", + ";X c #FF8080", + ":X c #FF8B8B", + ">X c #FD8D8D", + ",X c #FF8C8C", + ".a.a.a.a.a.a.a.a.a.h..X).a.a.a.a.a.a.a.a.a.a./ # X JXJX", + "JXJXf v B g.g.g.g.g.g.g.g.g.[ OXOXx.g.g.g.g.g.g.g.g.g.< # X JXJX", + "JXJXJXf f ] c.c.c.c.c.h.h.4.kXHXHXSXm.c.h.c.c.c.c.h.P X X JXJXJX", + "JXJXJXJXp f 3.n.m.n.n.m.m.j.HXHXHXHX(.m.m.m.n.m.m.{ X X JXJXJXJX", + "JXJXJXJXp p i $.S.A.A.S.A.M.GXHXHXHXW.A.A.S.A.A.O.X X X JXJXJXJX", + "JXJXJXJXJXi i e o.P.P.P.I.P.).cXmXXXP.P.I.P.P. .X X X JXJXJXJXJX", + "JXJXJXJXJXJXe e q h &.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.%.7 X X X JXJXJXJXJXJX", + "JXJXJXJXJXJXJXJXq q 4 g | l.K.Q.Q.K.*.| 8 # X X JXJXJXJXJXJXJXJX", + "JXJXJXJXJXJXJXJXJX4 4 < < < * * % % % # # X X JXJXJXJXJXJXJXJXJX", + "JXJXJXJXJXJXJXJXJXJXJXJX* < * * % # # # JXJXJXJXJXJXJXJXJXJXJXJX", + "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX" + }; + +#ifndef __WXMSW__ +const char * +AlcPix::m_alc_xpm[]= + { /* XPM */ + /* columns rows colors chars-per-pixel */ + "32 32 142 2", + " c #000000", + ". c #0C0B00", + "X c #0B0B0B", + "o c #131313", + "O c #121318", + "+ c #1A1A1A", + "@ c #2D1A00", + "# c #292100", + "$ c #29251E", + "% c #222222", + "& c #292929", + "* c #323232", + "= c #36383B", + "- c #393836", + "; c #3E3E3E", + ": c #5F3F06", + "> c #534400", + ", c #594400", + "< c #584A00", + "1 c #6F4700", + "2 c #604418", + "3 c #7F6F00", + "4 c gray26", + "5 c #4A4A4A", + "6 c #4D4D58", + "7 c #505052", + "8 c #5A5A5A", + "9 c #5B5C63", + "0 c #786448", + "q c #646464", + "w c #696B6F", + "e c #747474", + "r c #77797D", + "t c #7C7C7C", + "y c #7C7D82", + "u c #995B0A", + "i c #9A7700", + "p c #8D682E", + "a c #AA7900", + "s c #9B7F4C", + "d c #867C6A", + "f c #817D7A", + "g c #9A8B00", + "h c #A38002", + "j c #AC8800", + "k c #A59200", + "l c #BE8D2D", + "z c #B5A200", + "x c #97876C", + "c c #958873", + "v c #9F9079", + "b c #B3B272", + "n c #BFB97D", + "m c #D59700", + "M c #C5B500", + "N c #E4AA14", + "B c #FBB904", + "V c #E9AB38", + "C c #FCBC20", + "Z c #D1AB66", + "A c #F0B355", + "S c #E0B96A", + "D c #D6C500", + "F c #D9C300", + "G c #DED100", + "H c #E4D700", + "J c #EDDE00", + "K c #F1C500", + "L c #FFC604", + "P c #FCC90B", + "I c #FFD600", + "U c #FFDB00", + "Y c #FFD81D", + "T c #FFCF2A", + "R c #FFD32C", + "E c #FFD433", + "W c #FFD23A", + "Q c #F0E500", + "! c #FEE300", + "~ c #FFE800", + "^ c #FDE114", + "/ c #FFF000", + "( c #FEFB01", + ") c #FDFC28", + "_ c #FFD541", + "` c #FFD64A", + "' c #E0E046", + "] c #858585", + "[ c #83868D", + "{ c #86888C", + "} c #8B8B8B", + "| c #8A8C91", + " . c #8E9197", + ".. c #939393", + "X. c #9B9B9B", + "o. c #9D9EA0", + "O. c #9FA1A6", + "+. c #AB9B82", + "@. c #AAA297", + "#. c #B6A588", + "$. c #BBAC94", + "%. c #A3A3A3", + "&. c #ABABAB", + "*. c #B2B2B2", + "=. c #BABABA", + "-. c #BCBEC0", + ";. c #BFC1C4", + ":. c #CBBCA4", + ">. c #C6C6A3", + ",. c #D9C8AE", + "<. c #D8D9BA", + "1. c #EBDB9F", + "2. c #F9D78E", + "3. c #F3D598", + "4. c #FDD790", + "5. c #FBDE9E", + "6. c #EDDEBE", + "7. c #FFEAAB", + "8. c #F7EAB4", + "9. c #FEE6B1", + "0. c #FFEBB2", + "q. c #FFF1B2", + "w. c #C3C3C3", + "e. c #C5C5C9", + "r. c #CCCCCC", + "t. c #CDCFD3", + "y. c #D0D0C0", + "u. c #D4D4D3", + "i. c #D2D2D8", + "p. c #DBDBDB", + "a. c #EEDFD0", + "s. c #EDE7DD", + "d. c #FCFBD4", + "f. c #FEF8D9", + "g. c #E3E3E3", + "h. c #E7E9ED", + "j. c #EAEAEA", + "k. c #E8EBF3", + "l. c #F2F2F2", + "z. c #F0F1F8", + "x. c #FDFDFD", + "c. c None", + /* pixels */ + "c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.", + "c.c.c.c.c.c.c.c.c.c.c.c. X o + o c.c.c.c.c.c.c.c.c.c.c.c.", + "c.c.c.c.c.c.c.c.c.c. $ q X.=.r.w.w.&.t * c.c.c.c.c.c.c.c.c.c.", + "c.c.c.c.c.c.c.c.c.X q w.p.r.=.=.=.w.=.w.=.t + c.c.c.c.c.c.c.c.", + "c.c.c.c.c.c.c. X t j.x.x.x.u.%.%.X.%.&.&.&...% c.c.c.c.c.c.c.", + "c.c.c.c.c.c.c. 7 p.x.x.x.x.x.w.} =.g.x.l.u.%.e X c.c.c.c.c.c.", + "c.c.c.c.c.c. o } x.x.x.x.l.=.%.*.x.x.x.x.l.r.] * c.c.c.c.c.c.", + "c.c.c.c.c. & X.x.x.x.l.r.e & } ..x.x.j.p.u.} ; c.c.c.c.c.", + "c.c.c.c.c. % t x.x.l.g.r.9 6 y } x.j.p.r.w.t * c.c.c.c.c.", + "c.c.c.c. o 4 p.x.g.p.y.>.b n f.s.p.t.e.%.5 + c.c.c.c.", + "c.c.c.c. + q p.p.e.' ( ( U L A r.*.] 4 % c.c.c.c.", + "c.c.c.c. ; r.i.<.) / I C s.h.%.& X c.c.c.c.", + "c.c.c.c. X %.x.x.x.d.^ P a.h.g.s.*.& c.c.c.", + "c.c. X *.x.x.x.x.x.8.1.k.s.p.u.p.*.% X c.c.c.", + "c. X X X X ] x.x.x.x.x.x.k.h.g.i.u.r.w.e...o X X X c.", + " o o o o X 4 l.x.x.x.x.x.j.j.g.p.u.r.w.=.=.=.8 X o X ", + " X X o o + X X.x.x.x.x.x.l.j.g.p.u.r.e.w.=.*.*...o X X ", + " + * h.x.x.x.l.l.j.g.p.t.r.e.w.=.*.&.%.%.5 + ", + "c.c.c.c. o e x.x.x.x.l.j.s.p.u.r.w.-.=.*.&.%.%.@.e % c.c.c.c.", + "c.c.c.c. o &.x.x.x.l.h.g.p.u.r.y.=.=.*.&.%.%.X...[ % c.c.c.c.", + "c.c.c.c. X r.x.x.l.j.s.a.i.t.e.;.=.*.&.&.O.....} } + c.c.c.c.", + "c.c.c.c.c.X s.x.l.j.g.p.u.r.e.;.*.*.&.%.O.X.....} } + c.c.c.c.", + "c.c.c.c.c.X p.x.h.g.p.i.r.e.-.=.*.&.&.@.......} } 8 c.c.c.c.c.", + "c.c.c.c.c.c.6 h.s.p.u.r.e.-.=.*.&.%.o.X.....] ] t o c.c.c.c.c.", + "c.c.c.c.c.c.c.9 t.r.;.;.-.=.*.&.%.o.X...{ ] r w O c.c.c.c.c.c.", + "c.c.c.c.c.c.u 2 #.,.:.$.@.o.O.X.X.| [ f c v $.v 0 p : c.c.c.c.c.", + "c.c.c.c.1 V 4.0.0.0.9.9.3.Z x | } t s S 5.7.7.q.q.7.2.l @ c.c.c.", + "c.c.c. m E ` _ _ _ W _ ` T N } .d B R E E E E E E W Y a c.c.", + "c.c.c. i U U U ~ U ~ U U U a - = $ j U ~ ~ ~ ~ ~ ~ U K , c.c.", + "c.c.c.c. > k D J Q J F k < c. > g M G H D z 3 # c.c.c.", + "c.c.c.c.c.c. . . . . c.c.c.c.c.c. . . c.c.c.c.", + "c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c." + }; +#endif /* !__WXMSW__ */ + +const char * +AlcPix::m_copy_xpm[]= + { /* XPM */ + /* columns rows colors chars-per-pixel */ + "32 32 71 1", + " c black", + ". c #9A99A3", + "X c #A1A2B5", + "o c #ACACB0", + "O c #AEAEB1", + "+ c #AFAFB2", + "@ c #ACADBE", + "# c #ADAFBE", + "$ c #B1B0B3", + "% c #B2B1B3", + "& c #B3B2B4", + "* c #B3B3B6", + "= c #B4B4B6", + "- c #B6B6B7", + "; c #B7B7B7", + ": c #B2B3C3", + "> c #C0BEC3", + ", c #C4C3D1", + "< c #DBDADF", + "1 c #D3D3E3", + "2 c #D4D3E3", + "3 c #D6D6E4", + "4 c #D8D7E6", + "5 c #D9D8E7", + "6 c #DCDBE0", + "7 c #DCDCE1", + "8 c #DEDEE2", + "9 c #DCDAE8", + "0 c #DDDCE9", + "q c #DEDDE9", + "w c #DFDEEA", + "e c #E0DFE4", + "r c #E1DFEC", + "t c #E1E0E5", + "y c #E2E1E5", + "u c #E2E1E7", + "i c #E4E2E5", + "p c #E5E4E6", + "a c #E2E1ED", + "s c #E3E2ED", + "d c #E4E2E8", + "f c #E4E3EE", + "g c #E5E5E8", + "h c #E6E4EF", + "j c #E7E6EF", + "k c #E8E6E9", + "l c #EAEAEA", + "z c #E8E7F1", + "x c #E9E8F2", + "c c #EAE9F3", + "v c #ECEAF3", + "b c #EEEDF3", + "n c #EDECF4", + "m c #EEEDF6", + "M c #EFEEF6", + "N c #F1EFF7", + "B c #F2F1F7", + "V c #F3F2F8", + "C c #F4F3F9", + "Z c #F6F4FA", + "A c #F6F6FA", + "S c #F7F6FA", + "D c #F8F7FC", + "F c #F9F8FD", + "G c #FAF9FD", + "H c #FCFAFE", + "J c #FDFCFF", + "K c #FEFDFF", + "L c #FEFEFF", + "P c gray100", + "I c None", + /* pixels */ + "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII", + "I555555555555XIIIIIIIIIIIIIIIIII", + "I5PPPPPPPPPP5bXIIIIIIIIIIIIIIIII", + "I5PPPPPGZBmM5b@XIIIIIIIIIIIIIIII", + "I4PPPPPDZZBM4c0#XIIIIIIIIIIIIIII", + "I4PPPPPHHZBM5Pms:XIIIIIIIIIIIIII", + "I4PPPPPHHZZMXXXXXX IIIIIIIIIIIII", + "I4PPPPPPHDVMMc021X IIIIIIIIIIIII", + "I4PPPPPHGDZVba423X.,55555XIIIIII", + "I4PPPPPPPDZmh0044X-lPPPP5mXIIIII", + "I5PPPPPHGZmzsrr0aX*iZBmm5v#XIIII", + "I5PPPPHDGVvjssarhX*iSZBM5b4#XIII", + "I5PPPPPDBmzzjjjshX*iGZBM5PMs:XII", + "I5PPPPDVmmmcczjjjX-iHSZMXXXXXX I", + "I5PPPGVVBmmbczzjcX*pHZVmmz011X I", + "I5PPHZVZBmMbMczjcX=pHGZBma423X I", + "I4PPGAZVNNMMbczzmX*iPGZmh0055X I", + "I4PPGZZZVVMMmcmzmX-pGZmzaa00aX I", + "I4PPDAZVVNMMbczzbX%yGBbjhssasX I", + "I4PPAZZVNNMMbczzcX*eBmzzhhhshX I", + "I4PPZZZVCMMcmzzhbX% c #05389B", + ", c #0026A4", + "< c #0023AD", + "1 c #0029A3", + "2 c #002BAA", + "3 c #0025B2", + "4 c #012AB6", + "5 c #032CB8", + "6 c #082AB1", + "7 c #0033A4", + "8 c #0034AA", + "9 c #083AAA", + "0 c #0632BE", + "q c #003DB1", + "w c #1038BC", + "e c #002EC0", + "r c #053AC7", + "t c #073CC9", + "y c #0936C0", + "u c #083FCC", + "i c #133EC2", + "p c #0344A6", + "a c #0D43AE", + "s c #0043B7", + "d c #0044B8", + "f c #064DBB", + "g c #0B47B6", + "h c #0D4DBA", + "j c #0851BE", + "k c #1442AC", + "l c #1349A4", + "z c #1253BF", + "x c #1D58BF", + "c c #2C4C98", + "v c #2F56B0", + "b c #2A58B5", + "n c #2C5BB8", + "m c #305EBA", + "M c #3362BE", + "N c #0840CD", + "B c #0745D3", + "V c #0946D4", + "C c #094DDB", + "Z c #0752C1", + "A c #0B54C1", + "S c #0950DF", + "D c #1A44C3", + "F c #1D4CCB", + "G c #134CD4", + "H c #1D4FD3", + "J c #1358C2", + "K c #1E53D4", + "L c #1F5ADC", + "P c #1F65C9", + "I c #1C66DF", + "U c #1F62E2", + "Y c #2758D4", + "T c #215ADD", + "R c #2361C4", + "E c #2366CA", + "W c #2A63C2", + "Q c #2B6ACB", + "! c #2B65DF", + "~ c #316FCD", + "^ c #3867C2", + "/ c #3B6CC5", + "( c #3C6FC8", + ") c #3472CE", + "_ c #3C73CC", + "` c #3E79D1", + "' c #2262E3", + "] c #2865E0", + "[ c #2B6CE9", + "{ c #316DE3", + "} c #306FEA", + "| c #386FE0", + " . c #3877EC", + ".. c #3C7AEA", + "X. c #4D5B98", + "o. c #596190", + "O. c #5C6BAE", + "+. c #536FB8", + "@. c #606AA4", + "#. c #6D77AC", + "$. c #757EB3", + "%. c #4074CB", + "&. c #4379CE", + "*. c #447CD1", + "=. c #4A7FD4", + "-. c #427DED", + ";. c #3D80D8", + ":. c #7C85B3", + ">. c #7F85B8", + ",. c #7A8ABE", + "<. c #4780D3", + "1. c #4A80D3", + "2. c #5282D5", + "3. c #5389D6", + "4. c #518DDB", + "5. c #5D8EDC", + "6. c #5892DD", + "7. c #4582F0", + "8. c #4C87F1", + "9. c #4D96FA", + "0. c #568FE7", + "q. c #588DED", + "w. c #518DF2", + "e. c #5D98E0", + "r. c #5F9CEF", + "t. c #5590F3", + "y. c #509EFF", + "u. c #5C96F3", + "i. c #55A1FF", + "p. c #5BA5FF", + "a. c #6391DB", + "s. c #7193D4", + "d. c #769EDD", + "f. c #7899D8", + "g. c #639CF5", + "h. c #689CF2", + "j. c #64AAFF", + "k. c #6CA3F6", + "l. c #6BAEFF", + "z. c #73ACE9", + "x. c #70A6F7", + "c. c #76A8F5", + "v. c #74ABF9", + "b. c #7AAAF0", + "n. c #7AAFFA", + "m. c #7CB4F3", + "M. c #79B9FF", + "N. c #868BB7", + "B. c #848CBA", + "V. c #9198AA", + "C. c #9FA2AC", + "Z. c #A2A4AE", + "A. c #A4A8B0", + "S. c #ABADB6", + "D. c #B3B5BE", + "F. c #838CC0", + "G. c #8C94C0", + "H. c #919BC3", + "J. c #979FC9", + "K. c #989FC7", + "L. c #99A0C4", + "P. c #9CA2C8", + "I. c #9CAFD4", + "U. c #9FB2D6", + "Y. c #84AEE2", + "T. c #85B7F3", + "R. c #81B5FA", + "E. c #82B8F3", + "W. c #86BCFE", + "Q. c #89BDFC", + "!. c #A2A9CD", + "~. c #A8ADCD", + "^. c #ACB3D4", + "/. c #B5B5CA", + "(. c #BABDC4", + "). c #BBBBCD", + "_. c #BEBED1", + "`. c #B9BEDD", + "'. c #86C2FF", + "]. c #8DC2FF", + "[. c #92C3FD", + "{. c #96CBFF", + "}. c #99C7F2", + "|. c #9CCCFE", + " X c #A0C0EC", + ".X c #A3C5F2", + "XX c #ABCAF3", + "oX c #A4D3FD", + "OX c #A4DBFF", + "+X c #AAD6FB", + "@X c #AEDBFF", + "#X c #BCCBEB", + "$X c #B4CEF2", + "%X c #B3D2F3", + "&X c #B5D9FF", + "*X c #BAD6F5", + "=X c #BFDAF3", + "-X c #BADDFF", + ";X c #ADE1FF", + ":X c #B5E4FF", + ">X c #BAE4FE", + ",X c #BCE9FF", + ".2XMXMXMXnXnXcXlXkXjXjXMXF.c # NXNXNX", + "NX<.vXiXiXuX,X,X:XU.P.kXMXMXMXnXnXnXnXlXkXkXjXlXaXO.: NXNXNX", + "NX*.vXiXiXuX,X%XH.6XMXMXMXMXMXMXnXnXlXlXkXkXjXjXMX^.X. NXNXNX", + "NX*.vXiXiXtXU.!.nXMXMXMXMXMXnXnXnXnXlXlXkX#Xs.s.s.f.v > 7 8 7 7 ", + "NX*.xXiXiX>XL.MXMXMXMXMXMXMXnXMXnXnXnXnX#Xh _ a.5.5.6.1.1.2.g ; ", + "NX*.xXiXiXuXU.6XMXMXMXMXMXMXMXMXnXnXnXaXW =.&XQ.W.Q.[.n.r.0.q # ", + "NX` fXiXiXuX6.m <.<.*.*.&.&.&._ _ _ ( F <.-Xj.y.i.y.y.i.U 3 8 ", + "NX_ dXiXiX@XZ XX#X8X8X=X*X%X$XXXXXXX XXX-Xl.i.y.y.y.p.{ 5 2 ; ", + "NX` dXiXiXz.) mXaXcXmXxXdXiX>X&XoX{.W.M.l.p.y.y.9...i 3 * 2 # ", + "NX_ sXiXiXE XmXdX7XvXfXsXtX@X[.M.h.t.7. .{ ! Y i 5 3 & & 2 X ", + "NX) sXiXoXZ vXvXxXrX=XsX@XQ.R.x.g.w...} ' T H y 0 e * & < ; ", + "NX~ iXiX6.3.MXxXdX,X}.|.{.Q.n.k.u.8...[ ' G r u t e * & 2 = ", + "NX) uXiXE XmXdX,XOX{.T.Q.W.c.g.t.7. .U V B V u t e * & 2 O ", + "NXQ tX+XJ cXsX>X;XOX{.E.E.R.v.g.w.7.U C S C V u t e * < 1 ", + "NXQ tX4.a.sXyXtX>X@XoX{.b.R.c.h.q.| ] U L K F D D w 6 < = ", + "NXQ ,XJ $XMXMXMXMXMXnXnXlXhXhXgXwXqX9X9X4X4X1X_.)././.9 + NX", + "NXQ m.z MXMXMXMXMXMXMXnXbXkXhXgXwXqX9X9X4X4X4X1X_.).H., . NX", + "NXE ;.d.MXMXMXMXMXMXMXnXbXkXhXhXgXwXqX9X4X4X4X1X_.).+.- NX", + "NXE j pXMXMXMXMXMXMXMXnXnXbXbXhXgXwXqX9X9X4X4X1X1X).k @ NXNX", + "NXs R MXMXMXMXMXMXMXMXMXbXhXgX5X5X3X c #072764", + ", c #202254", + "< c #232359", + "1 c #212F58", + "2 c #2A2B5B", + "3 c #262954", + "4 c #23315A", + "5 c #2B325D", + "6 c #2F2F64", + "7 c #2B3862", + "8 c #203C74", + "9 c #323B65", + "0 c #3E3E70", + "q c #3A426B", + "w c #33416A", + "e c #304B7E", + "r c #3A4771", + "t c #284479", + "y c #42456E", + "u c #444C74", + "i c #444776", + "p c #48567D", + "a c #485178", + "s c #51537D", + "d c #54587E", + "f c #4D5C82", + "g c #595C83", + "h c #555884", + "j c #536186", + "k c #5A648B", + "l c #5B698E", + "z c #5A6388", + "x c #5E6C90", + "c c #526893", + "v c #666788", + "b c #6B6D94", + "n c #616E93", + "m c #6C728E", + "M c #637194", + "N c #65759A", + "B c #697699", + "V c #6C799B", + "C c #6D7193", + "Z c #73738D", + "A c #74749A", + "S c #7C7C93", + "D c #7A7B9E", + "F c #737799", + "G c #6B7EA3", + "H c #7D7DA2", + "J c #76809F", + "K c #7484A4", + "L c #7B87A7", + "P c #BB4400", + "I c #AE6139", + "U c #9A6047", + "Y c #8F786E", + "T c #996C6A", + "R c #9C7971", + "E c #AB6749", + "W c #A6745E", + "Q c #B46946", + "! c #A77D72", + "~ c #B47A61", + "^ c #C15414", + "/ c #C16C39", + "( c #C1703A", + ") c #D5742B", + "_ c #E67A1C", + "` c #E67F27", + "' c #C47E52", + "] c #C67545", + "[ c #AB8876", + "{ c #B9A176", + "} c #DD8032", + "| c #DFA93D", + " . c #EC9A00", + ".. c #EC9100", + "X. c #EE8521", + "o. c #FF9A2C", + "O. c #FF9F34", + "+. c #F79834", + "@. c #FFA81F", + "#. c #FFBD02", + "$. c #FFB908", + "%. c #F5BD01", + "&. c #FFB719", + "*. c #FFBE18", + "=. c #F6BD1F", + "-. c #FFA321", + ";. c #FFA73D", + ":. c #FFB12C", + ">. c #F8BA36", + ",. c #D78853", + "<. c #DD9A6E", + "1. c #DDB145", + "2. c #E6984E", + "3. c #FBA444", + "4. c #FFB14E", + "5. c #FDB058", + "6. c #FFB75A", + "7. c #EAAE6E", + "8. c #EEB472", + "9. c #FFBD68", + "0. c #F0B86E", + "q. c #F7C701", + "w. c #FFCA04", + "e. c #FFC10D", + "r. c #FBC414", + "t. c #FFC51B", + "y. c #FFDD0F", + "u. c #F9D30E", + "i. c #FFD314", + "p. c #FFC723", + "a. c #FFC629", + "s. c #FFC92A", + "d. c #FFCC33", + "f. c #FFCD3A", + "g. c #FFD927", + "h. c #FDDC3A", + "j. c #FEE302", + "k. c #FFEB01", + "l. c #FFEC0B", + "z. c #FFE818", + "x. c #FCE117", + "c. c #FFED2F", + "v. c #FEE828", + "b. c #FFF03D", + "n. c #FCC545", + "m. c #FFCC5C", + "M. c #FDD345", + "N. c #FDD24D", + "B. c #FFD95C", + "V. c #FFD556", + "C. c #F5C262", + "Z. c #FFC16F", + "A. c #F7C56B", + "S. c #F7CA7F", + "D. c #FFC779", + "F. c #FFDB68", + "G. c #FFD766", + "H. c #FFDD71", + "J. c #FFD87B", + "K. c #FFE651", + "L. c #FFF147", + "P. c #FFF25F", + "I. c #FFF255", + "U. c #FFEB68", + "Y. c #FFE26D", + "T. c #FFE07B", + "R. c #FFF46E", + "E. c #FFF27B", + "W. c #86869B", + "Q. c #9A878B", + "!. c #8383A4", + "~. c #808EAC", + "^. c #8A8AA4", + "/. c #8C8CAA", + "(. c #8494B2", + "). c #8B99B6", + "_. c #8D97B2", + "`. c #9293AD", + "'. c #9898A9", + "]. c #9595B2", + "[. c #949AB4", + "{. c #9A9AB4", + "}. c #95A2BC", + "|. c #9BA5BD", + " X c #A68A8E", + ".X c #AA9F8B", + "XX c #B69897", + "oX c #B89E97", + "OX c #B29493", + "+X c #A0A0AF", + "@X c #A3A3B3", + "#X c #A2A2BA", + "$X c #A8A8BE", + "%X c #AAAAB6", + "&X c #B9AAB2", + "*X c #9F9FC0", + "=X c #99A7C0", + "-X c #9DAAC2", + ";X c #A2AEC5", + ":X c #ACACC2", + ">X c #A8A8C8", + ",X c #A4A4C4", + " 8 t e IXIXIXIXIXGX%.k.w.e.$.o._ Q.L & YXYXYXYXYXYX", + "#XAXVXNXIXIX: c N K IXIXIXIXIXC.j.j.r.$.@.o.I ).H * YXYXYXYXYXYX", + "#XAXNXvXIXIX; G L (.IXIXIXIXPXr.l.i.r.*.o.X.[ (.C * YXYXYXYXYXYX", + "{.AXvXcXIXIXe (.}..3.) HXB M g & YXYXYXYXYXYX", + "/.NXqXqXZXZXVXVXVXVXNXNXcX>.b.h.f.f.4.;.~ |.M x d # YXYXYXYXYXYX", + "/.nXqX5X5X5X2X1X;X;X-X|.{ h.L.M.M.n.6.) m M l l a # YXYXYXYXYXYX", + "!.cX5X5X3X2X1XX,X,X{. X[ W T H H H H D A A b ^.4 1 $ O YXYXYXYXYXYX", + "a ).V B MXbXxX6X6XXXI ! ].].]././.!.!.^./.`.1 - % . YXYXYXYXYXYX", + "i _.B M vXbXxXxXxX&XOX$X#X@X@X{./.`.`.`././.- - o . YXYXYXYXYXYX", + "0 !.g d %X%X+X+X'.'.'.^./.^.W.W.W.S S S Z Z o o X . YXYXYXYXYXYX", + "YX6 < & 2 < 2 < < < < < < < * , , * * * * * . . . YXYXYXYXYXYXYX", + "YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX", + "YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX", + "YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX" + }; + +#else // Default DeltaHF theme + +const char * +AlcPix::m_about_xpm[]= + { /* XPM */ + /* columns rows colors chars-per-pixel */ + "32 32 291 2", + " c None", + ". c #0C0C0C", + "+ c #0A0A0A", + "@ c #090909", + "# c #222222", + "$ c #9A9A9A", + "% c #A2A2A2", + "& c #9B9B9B", + "* c #959595", + "= c #858585", + "- c #5C5C5C", + "; c #2B2B2B", + "> c #7D7D7D", + ", c #969696", + "' c #878787", + ") c #989898", + "! c #8B8B8B", + "~ c #777777", + "{ c #292929", + "] c #4F4F4F", + "^ c #A8A8A8", + "/ c #8F8F8F", + "( c #6A6A6A", + "_ c #212121", + ": c #161616", + "< c #6E6E6E", + "[ c #898989", + "} c #888888", + "| c #414141", + "1 c #353535", + "2 c #2F2F2F", + "3 c #5A5A5A", + "4 c #8C8C8C", + "5 c #555555", + "6 c #AFAFAF", + "7 c #838383", + "8 c #3E3E3E", + "9 c #505050", + "0 c #A1A1A1", + "a c #7E7E7E", + "b c #454545", + "c c #585958", + "d c #A9A9A9", + "e c #3C3C3C", + "f c #CAD7CA", + "g c #DFE8DF", + "h c #808780", + "i c #979797", + "j c #404440", + "k c #242D24", + "l c #C8D5C8", + "m c #D5DED5", + "n c #B0B9B0", + "o c #788378", + "p c #2B362B", + "q c #A4A4A4", + "r c #A0A0A0", + "s c #3D433D", + "t c #768576", + "u c #576657", + "v c #374237", + "w c #C9D6C9", + "x c #E0E9E0", + "y c #B4BDB4", + "z c #465546", + "A c #344334", + "B c #2E3A2E", + "C c #2B322B", + "D c #3D413D", + "E c #5B635B", + "F c #819081", + "G c #96A996", + "H c #7F907F", + "I c #6C796C", + "J c #516051", + "K c #2C372C", + "L c #C6D5C6", + "M c #D7E0D7", + "N c #B3BCB3", + "O c #798479", + "P c #374637", + "Q c #364536", + "R c #354435", + "S c #334233", + "T c #384738", + "U c #485948", + "V c #9BAE9B", + "W c #9EB19E", + "X c #94A794", + "Y c #889D88", + "Z c #7F947F", + "` c #7A897A", + " . c #6B7A6B", + ".. c #596859", + "+. c #374437", + "@. c #B0BBB0", + "#. c #ABB6AB", + "$. c #C7D0C7", + "%. c #939E93", + "&. c #576457", + "*. c #3D4C3D", + "=. c #3C4B3C", + "-. c #3B4A3B", + ";. c #2F3A2F", + ">. c #A7A7A7", + ",. c #556255", + "'. c #8CA18C", + "). c #829582", + "!. c #758A75", + "~. c #687D68", + "{. c #6F826F", + "]. c #728372", + "^. c #606F60", + "/. c #212A21", + "(. c #A6B9A6", + "_. c #B1BEB1", + ":. c #808B80", + "<. c #5B685B", + "[. c #4E5D4E", + "}. c #4B5C4B", + "|. c #4D5E4D", + "1. c #4C5C4C", + "2. c #313D31", + "3. c #9F9F9F", + "4. c #B8B8B8", + "5. c #7C917C", + "6. c #6F846F", + "7. c #637863", + "8. c #5E735E", + "9. c #708370", + "0. c #8C9D8C", + "a. c #323D32", + "b. c #ACBDAC", + "c. c #D8E1D8", + "d. c #D9E2D9", + "e. c #CBD6CB", + "f. c #AAB7AA", + "g. c #717E71", + "h. c #5D6C5D", + "i. c #576857", + "j. c #566756", + "k. c #404D40", + "l. c #1F251F", + "m. c #2D332D", + "n. c #2E342E", + "o. c #3D483D", + "p. c #6C816C", + "q. c #778A77", + "r. c #889988", + "s. c #657665", + "t. c #A9BEA9", + "u. c #D5E0D5", + "v. c #E1E8E1", + "w. c #E3EAE3", + "x. c #DBE4DB", + "y. c #D2DDD2", + "z. c #C1D0C1", + "A. c #9DAC9D", + "B. c #738473", + "C. c #5F705F", + "D. c #5B6C5B", + "E. c #697E69", + "F. c #667B66", + "G. c #758875", + "H. c #90A190", + "I. c #7A8B7A", + "J. c #697A69", + "K. c #586758", + "L. c #232C23", + "M. c #A0B5A0", + "N. c #E2E9E2", + "O. c #DCE5DC", + "P. c #D4DFD4", + "Q. c #BFD0BF", + "R. c #B2C3B2", + "S. c #9BAC9B", + "T. c #6A796A", + "U. c #5C6D5C", + "V. c #607560", + "W. c #7D907D", + "X. c #92A592", + "Y. c #889B88", + "Z. c #6A7D6A", + "`. c #677867", + " + c #637463", + ".+ c #5E6E5E", + "++ c #5B6A5B", + "@+ c #283328", + "#+ c #AFBCAF", + "$+ c #D0DBD0", + "%+ c #BBCCBB", + "&+ c #B7C8B7", + "*+ c #495649", + "=+ c #ABBAAB", + "-+ c #8B9E8B", + ";+ c #7A8F7A", + ">+ c #718471", + ",+ c #667766", + "'+ c #647564", + ")+ c #617261", + "!+ c #3B483B", + "~+ c #1E251E", + "{+ c #B2BFB2", + "]+ c #C3CEC3", + "^+ c #C3D0C3", + "/+ c #BDCEBD", + "(+ c #B5C6B5", + "_+ c #AABBAA", + ":+ c #3D4A3D", + "<+ c #627162", + "[+ c #525D52", + "}+ c #8B9A8B", + "|+ c #788B78", + "1+ c #768976", + "2+ c #6B7E6B", + "3+ c #384538", + "4+ c #141B15", + "5+ c #485548", + "6+ c #95A295", + "7+ c #ACBBAC", + "8+ c #AFC0AF", + "9+ c #9CAB9C", + "0+ c #354035", + "a+ c #505D50", + "b+ c #728572", + "c+ c #4F5E4F", + "d+ c #444D44", + "e+ c #869386", + "f+ c #394639", + "g+ c #192019", + "h+ c #333E33", + "i+ c #5F6E5F", + "j+ c #334033", + "k+ c #4B584B", + "l+ c #8C9B8C", + "m+ c #343F34", + "n+ c #4A554A", + "o+ c #4D5C4D", + "p+ c #505F50", + "q+ c #495249", + "r+ c #818E81", + "s+ c #3F4D3E", + "t+ c #394439", + "u+ c #3F4C3F", + "v+ c #6C7F6C", + "w+ c #798C79", + "x+ c #516251", + "y+ c #3F463F", + "z+ c #3C493C", + "A+ c #414E41", + "B+ c #768574", + "C+ c #889D86", + "D+ c #819681", + "E+ c #6D806D", + "F+ c #657865", + "G+ c #809580", + "H+ c #556655", + "I+ c #546354", + "J+ c #4B5A4B", + "K+ c #465346", + "L+ c #3E4B3E", + "M+ c #4D5A4D", + "N+ c #566354", + "O+ c #7C8C79", + "P+ c #819580", + "Q+ c #859C85", + "R+ c #5A6B5A", + "S+ c #526152", + "T+ c #4C5B4C", + "U+ c #485748", + "V+ c #434E43", + "W+ c #333C33", + "X+ c #5D6D5C", + "Y+ c #7B8B78", + "Z+ c #7E937E", + "`+ c #8AA18A", + " @ c #5D6E5D", + ".@ c #536453", + "+@ c #536253", + "@@ c #3A473A", + "#@ c #556354", + "$@ c #778877", + "%@ c #869C85", + "&@ c #91A891", + "*@ c #607160", + "=@ c #566556", + "-@ c #3B463B", + ";@ c #5A6A59", + ">@ c #859782", + ",@ c #5C6B5C", + "'@ c #415041", + " ", + " ", + " ", + " . + @ @ ", + " # $ % & * = - ; ", + " + > , ' $ ) ! = ~ { ", + " ] ^ / ( _ : < [ } | ", + " : 1 2 : 3 4 [ | ", + " 5 6 7 7 8 ", + " 9 0 a 4 b ", + " c d a > e ", + " f g h $ $ i j k ", + " l m n o p q r 6 s t u v ", + " w x y o z A B C D E F G H I J K ", + " L M N O P Q R S T U V W V X Y Z ` ...+. ", + " @.#.$.%.&.*.=.*.*.-.;.r >.6 ,.'.).!.~.{.].^.v /. ", + " (._.:.<.[.}.|.1.2.3.r 4.C 5.6.7.8.9.0.a. ", + " b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.8.q.r.H s.h./. ", + " t.u.v.w.x.y.z.A.B.C.D.D.E.7.F.G.H.I.J.s.h.K...L. ", + " M.f u.v.N.O.P.L Q.R.S.T.U.V.W.X.Y.{.Z.`. +.+++C.s.@+ ", + " h.#+P.M u.$+L Q.%+&+b.*+=+-+;+q.>+Z.`.,+'+)+!+~+ ", + " h.{+]+^+z./+(+_+:+<+[+}+|+1+>+2+,+,+3+4+ ", + " v 5+6+7+8+9+0+a+b+c+d+e+>+2+ +f+g+h+ ", + " I i+j+k+l+m+n+C.b+o+p+q+r+s+g+t+u+:+ ", + " H 1+v+C.j+5+..s.w+x+J *+y+a.z+!+A+A+ ", + " B+C+D+E+F+s. +J.G+H+I+J+K+u+L+u+5+M+ ", + " N+O+P+;+1+b+{.Q+R+j.S+T+U+T+V+W+ ", + " X+Y+D+Z Z+`+ @D.j..@+@@@ ", + " #@$@%@&@ @*@=@-@ ", + " ;@>@,@'@ ", + " ", + " " + }; + +#ifndef __WXMSW__ +const char * +AlcPix::m_alc_xpm[]= + { /* XPM */ + /* columns rows colors chars-per-pixel */ + "32 32 142 2", + " c #000000", + ". c #0C0B00", + "X c #0B0B0B", + "o c #131313", + "O c #121318", + "+ c #1A1A1A", + "@ c #2D1A00", + "# c #292100", + "$ c #29251E", + "% c #222222", + "& c #292929", + "* c #323232", + "= c #36383B", + "- c #393836", + "; c #3E3E3E", + ": c #5F3F06", + "> c #534400", + ", c #594400", + "< c #584A00", + "1 c #6F4700", + "2 c #604418", + "3 c #7F6F00", + "4 c gray26", + "5 c #4A4A4A", + "6 c #4D4D58", + "7 c #505052", + "8 c #5A5A5A", + "9 c #5B5C63", + "0 c #786448", + "q c #646464", + "w c #696B6F", + "e c #747474", + "r c #77797D", + "t c #7C7C7C", + "y c #7C7D82", + "u c #995B0A", + "i c #9A7700", + "p c #8D682E", + "a c #AA7900", + "s c #9B7F4C", + "d c #867C6A", + "f c #817D7A", + "g c #9A8B00", + "h c #A38002", + "j c #AC8800", + "k c #A59200", + "l c #BE8D2D", + "z c #B5A200", + "x c #97876C", + "c c #958873", + "v c #9F9079", + "b c #B3B272", + "n c #BFB97D", + "m c #D59700", + "M c #C5B500", + "N c #E4AA14", + "B c #FBB904", + "V c #E9AB38", + "C c #FCBC20", + "Z c #D1AB66", + "A c #F0B355", + "S c #E0B96A", + "D c #D6C500", + "F c #D9C300", + "G c #DED100", + "H c #E4D700", + "J c #EDDE00", + "K c #F1C500", + "L c #FFC604", + "P c #FCC90B", + "I c #FFD600", + "U c #FFDB00", + "Y c #FFD81D", + "T c #FFCF2A", + "R c #FFD32C", + "E c #FFD433", + "W c #FFD23A", + "Q c #F0E500", + "! c #FEE300", + "~ c #FFE800", + "^ c #FDE114", + "/ c #FFF000", + "( c #FEFB01", + ") c #FDFC28", + "_ c #FFD541", + "` c #FFD64A", + "' c #E0E046", + "] c #858585", + "[ c #83868D", + "{ c #86888C", + "} c #8B8B8B", + "| c #8A8C91", + " . c #8E9197", + ".. c #939393", + "X. c #9B9B9B", + "o. c #9D9EA0", + "O. c #9FA1A6", + "+. c #AB9B82", + "@. c #AAA297", + "#. c #B6A588", + "$. c #BBAC94", + "%. c #A3A3A3", + "&. c #ABABAB", + "*. c #B2B2B2", + "=. c #BABABA", + "-. c #BCBEC0", + ";. c #BFC1C4", + ":. c #CBBCA4", + ">. c #C6C6A3", + ",. c #D9C8AE", + "<. c #D8D9BA", + "1. c #EBDB9F", + "2. c #F9D78E", + "3. c #F3D598", + "4. c #FDD790", + "5. c #FBDE9E", + "6. c #EDDEBE", + "7. c #FFEAAB", + "8. c #F7EAB4", + "9. c #FEE6B1", + "0. c #FFEBB2", + "q. c #FFF1B2", + "w. c #C3C3C3", + "e. c #C5C5C9", + "r. c #CCCCCC", + "t. c #CDCFD3", + "y. c #D0D0C0", + "u. c #D4D4D3", + "i. c #D2D2D8", + "p. c #DBDBDB", + "a. c #EEDFD0", + "s. c #EDE7DD", + "d. c #FCFBD4", + "f. c #FEF8D9", + "g. c #E3E3E3", + "h. c #E7E9ED", + "j. c #EAEAEA", + "k. c #E8EBF3", + "l. c #F2F2F2", + "z. c #F0F1F8", + "x. c #FDFDFD", + "c. c None", + /* pixels */ + "c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.", + "c.c.c.c.c.c.c.c.c.c.c.c. X o + o c.c.c.c.c.c.c.c.c.c.c.c.", + "c.c.c.c.c.c.c.c.c.c. $ q X.=.r.w.w.&.t * c.c.c.c.c.c.c.c.c.c.", + "c.c.c.c.c.c.c.c.c.X q w.p.r.=.=.=.w.=.w.=.t + c.c.c.c.c.c.c.c.", + "c.c.c.c.c.c.c. X t j.x.x.x.u.%.%.X.%.&.&.&...% c.c.c.c.c.c.c.", + "c.c.c.c.c.c.c. 7 p.x.x.x.x.x.w.} =.g.x.l.u.%.e X c.c.c.c.c.c.", + "c.c.c.c.c.c. o } x.x.x.x.l.=.%.*.x.x.x.x.l.r.] * c.c.c.c.c.c.", + "c.c.c.c.c. & X.x.x.x.l.r.e & } ..x.x.j.p.u.} ; c.c.c.c.c.", + "c.c.c.c.c. % t x.x.l.g.r.9 6 y } x.j.p.r.w.t * c.c.c.c.c.", + "c.c.c.c. o 4 p.x.g.p.y.>.b n f.s.p.t.e.%.5 + c.c.c.c.", + "c.c.c.c. + q p.p.e.' ( ( U L A r.*.] 4 % c.c.c.c.", + "c.c.c.c. ; r.i.<.) / I C s.h.%.& X c.c.c.c.", + "c.c.c.c. X %.x.x.x.d.^ P a.h.g.s.*.& c.c.c.", + "c.c. X *.x.x.x.x.x.8.1.k.s.p.u.p.*.% X c.c.c.", + "c. X X X X ] x.x.x.x.x.x.k.h.g.i.u.r.w.e...o X X X c.", + " o o o o X 4 l.x.x.x.x.x.j.j.g.p.u.r.w.=.=.=.8 X o X ", + " X X o o + X X.x.x.x.x.x.l.j.g.p.u.r.e.w.=.*.*...o X X ", + " + * h.x.x.x.l.l.j.g.p.t.r.e.w.=.*.&.%.%.5 + ", + "c.c.c.c. o e x.x.x.x.l.j.s.p.u.r.w.-.=.*.&.%.%.@.e % c.c.c.c.", + "c.c.c.c. o &.x.x.x.l.h.g.p.u.r.y.=.=.*.&.%.%.X...[ % c.c.c.c.", + "c.c.c.c. X r.x.x.l.j.s.a.i.t.e.;.=.*.&.&.O.....} } + c.c.c.c.", + "c.c.c.c.c.X s.x.l.j.g.p.u.r.e.;.*.*.&.%.O.X.....} } + c.c.c.c.", + "c.c.c.c.c.X p.x.h.g.p.i.r.e.-.=.*.&.&.@.......} } 8 c.c.c.c.c.", + "c.c.c.c.c.c.6 h.s.p.u.r.e.-.=.*.&.%.o.X.....] ] t o c.c.c.c.c.", + "c.c.c.c.c.c.c.9 t.r.;.;.-.=.*.&.%.o.X...{ ] r w O c.c.c.c.c.c.", + "c.c.c.c.c.c.u 2 #.,.:.$.@.o.O.X.X.| [ f c v $.v 0 p : c.c.c.c.c.", + "c.c.c.c.1 V 4.0.0.0.9.9.3.Z x | } t s S 5.7.7.q.q.7.2.l @ c.c.c.", + "c.c.c. m E ` _ _ _ W _ ` T N } .d B R E E E E E E W Y a c.c.", + "c.c.c. i U U U ~ U ~ U U U a - = $ j U ~ ~ ~ ~ ~ ~ U K , c.c.", + "c.c.c.c. > k D J Q J F k < c. > g M G H D z 3 # c.c.c.", + "c.c.c.c.c.c. . . . . c.c.c.c.c.c. . . c.c.c.c.", + "c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c." + }; +#endif /* !__WXMSW__ */ + +const char * +AlcPix::m_copy_xpm[]= + { /* XPM */ + /* columns rows colors chars-per-pixel */ + "32 32 258 2", + " c None", + ". c #F8F1E4", + "+ c #EAD097", + "@ c #9F8753", + "# c #CE920B", + "$ c #865F07", + "% c #F1E2C0", + "& c #F9F5EF", + "* c #583E04", + "= c #634504", + "- c #E0BD6D", + "; c #785505", + "> c #CAD7CA", + ", c #C8D5C8", + "' c #D5DED5", + ") c #B0B9B0", + "! c #788378", + "~ c #768576", + "{ c #576657", + "] c #374237", + "^ c #C9D6C9", + "/ c #E0E9E0", + "( c #B4BDB4", + "_ c #465546", + ": c #344334", + "< c #394839", + "[ c #9FB29F", + "} c #96A996", + "| c #7F907F", + "1 c #6C796C", + "2 c #516051", + "3 c #2C372C", + "4 c #C6D5C6", + "5 c #D7E0D7", + "6 c #B3BCB3", + "7 c #798479", + "8 c #374637", + "9 c #364536", + "0 c #324132", + "a c #475847", + "b c #80682F", + "c c #A2AD97", + "d c #A89478", + "e c #9A896F", + "f c #89967F", + "g c #7F947F", + "h c #7A897A", + "i c #6B7A6B", + "j c #596859", + "k c #374437", + "l c #B0BBB0", + "m c #ABB6AB", + "n c #C7D0C7", + "o c #939E93", + "p c #576457", + "q c #3D4C3D", + "r c #3C4B3C", + "s c #3A493A", + "t c #344040", + "u c #3C3D74", + "v c #3E4A4B", + "w c #8F917B", + "x c #BC7A57", + "y c #D7683F", + "z c #BB4E21", + "A c #935834", + "B c #7A7F67", + "C c #687D68", + "D c #6F826F", + "E c #728372", + "F c #606F60", + "G c #212A21", + "H c #A6B9A6", + "I c #B1BEB1", + "J c #808B80", + "K c #5B685B", + "L c #4D5C4D", + "M c #3E4B4F", + "N c #28295F", + "O c #272372", + "P c #363070", + "Q c #272551", + "R c #7F4B35", + "S c #D06E47", + "T c #EE8C6A", + "U c #CF592E", + "V c #9D3508", + "W c #864F2B", + "X c #5E735E", + "Y c #708370", + "Z c #8C9D8C", + "` c #323D32", + " . c #ACBDAC", + ".. c #D8E1D8", + "+. c #D9E2D9", + "@. c #CBD6CB", + "#. c #AAB7AA", + "$. c #5D6771", + "%. c #2A2D63", + "&. c #171264", + "*. c #1F1A5E", + "=. c #1D1A45", + "-. c #181631", + ";. c #62260D", + ">. c #A0512F", + ",. c #D06D3F", + "'. c #B64D1C", + "). c #8B451F", + "!. c #836E53", + "~. c #889988", + "{. c #657665", + "]. c #5D6C5D", + "^. c #A9BEA9", + "/. c #D5E0D5", + "(. c #E1E8E1", + "_. c #E3EAE3", + ":. c #DBE4DB", + "<. c #D2DDD2", + "[. c #C1D0C1", + "}. c #9DAC9D", + "|. c #58636F", + "1. c #323463", + "2. c #1D1A46", + "3. c #110E24", + "4. c #32190C", + "5. c #4F220B", + "6. c #7F4D2A", + "7. c #7F7157", + "8. c #90A190", + "9. c #7A8B7A", + "0. c #697A69", + "a. c #586758", + "b. c #232C23", + "c. c #A0B5A0", + "d. c #E2E9E2", + "e. c #DCE5DC", + "f. c #D4DFD4", + "g. c #BFD0BF", + "h. c #B2C3B2", + "i. c #94A499", + "j. c #515A67", + "k. c #2D2F48", + "l. c #3A392E", + "m. c #6E6A56", + "n. c #919E8A", + "o. c #889B88", + "p. c #6A7D6A", + "q. c #677867", + "r. c #637463", + "s. c #5E6E5E", + "t. c #5B6A5B", + "u. c #5F705F", + "v. c #283328", + "w. c #AFBCAF", + "x. c #D0DBD0", + "y. c #BBCCBB", + "z. c #B7C8B7", + "A. c #495649", + "B. c #ABBAAB", + "C. c #8B9E8B", + "D. c #7A8F7A", + "E. c #778A77", + "F. c #718471", + "G. c #667766", + "H. c #647564", + "I. c #617261", + "J. c #3B483B", + "K. c #1E251E", + "L. c #B2BFB2", + "M. c #C3CEC3", + "N. c #C3D0C3", + "O. c #BDCEBD", + "P. c #B5C6B5", + "Q. c #AABBAA", + "R. c #3D4A3D", + "S. c #627162", + "T. c #525D52", + "U. c #8B9A8B", + "V. c #788B78", + "W. c #768976", + "X. c #6B7E6B", + "Y. c #384538", + "Z. c #141B15", + "`. c #485548", + " + c #95A295", + ".+ c #ACBBAC", + "++ c #AFC0AF", + "@+ c #9CAB9C", + "#+ c #354035", + "$+ c #505D50", + "%+ c #728572", + "&+ c #4F5E4F", + "*+ c #444D44", + "=+ c #869386", + "-+ c #394639", + ";+ c #192019", + ">+ c #333E33", + ",+ c #5F6E5F", + "'+ c #334033", + ")+ c #4B584B", + "!+ c #8C9B8C", + "~+ c #343F34", + "{+ c #4A554A", + "]+ c #505F50", + "^+ c #495249", + "/+ c #818E81", + "(+ c #3F4D3E", + "_+ c #394439", + ":+ c #3F4C3F", + "<+ c #6C7F6C", + "[+ c #798C79", + "}+ c #516251", + "|+ c #3F463F", + "1+ c #3C493C", + "2+ c #414E41", + "3+ c #768574", + "4+ c #889D86", + "5+ c #819681", + "6+ c #6D806D", + "7+ c #657865", + "8+ c #809580", + "9+ c #556655", + "0+ c #546354", + "a+ c #4B5A4B", + "b+ c #465346", + "c+ c #3E4B3E", + "d+ c #4D5A4D", + "e+ c #566354", + "f+ c #7C8C79", + "g+ c #819580", + "h+ c #859C85", + "i+ c #5A6B5A", + "j+ c #566756", + "k+ c #526152", + "l+ c #4C5B4C", + "m+ c #485748", + "n+ c #434E43", + "o+ c #333C33", + "p+ c #5D6D5C", + "q+ c #7B8B78", + "r+ c #7E937E", + "s+ c #8AA18A", + "t+ c #5D6E5D", + "u+ c #5B6C5B", + "v+ c #536453", + "w+ c #536253", + "x+ c #3A473A", + "y+ c #556354", + "z+ c #778877", + "A+ c #869C85", + "B+ c #91A891", + "C+ c #607160", + "D+ c #566556", + "E+ c #3B463B", + "F+ c #5A6A59", + "G+ c #859782", + "H+ c #5C6B5C", + "I+ c #415041", + " ", + " ", + " ", + " . + + + @ ", + " + # # # $ ", + " + # # # $ ", + " + # # # $ ", + " + # # # $ ", + " + # # # $ ", + " % + + & # # # * $ $ = ", + " - # # # # # # # ; ", + " > - # # # # # ; ", + " , ' ) ! - # # # ; ~ { ] ", + " ^ / ( ! _ : < - # ; [ } | 1 2 3 ", + " 4 5 6 7 8 9 : 0 8 a b c d e f g h i j k ", + " l m n o p q r r s t u v w x y z A B C D E F ] G ", + " H I J K L M N O P Q R S T U V W X Y Z ` ", + " ...+.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.| {.].G ", + " ^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.{.].a.j b. ", + " c.> /.(.d.e.f.4 g.h.i.j.k.l.m.n.o.D p.q.r.s.t.u.{.v. ", + " ].w.f.5 /.x.4 g.y.z. .A.B.C.D.E.F.p.q.G.H.I.J.K. ", + " ].L.M.N.[.O.P.Q.R.S.T.U.V.W.F.X.G.G.Y.Z. ", + " ] `. +.+++@+#+$+%+&+*+=+F.X.r.-+;+>+ ", + " 1 ,+'+)+!+~+{+u.%+L ]+^+/+(+;+_+:+R. ", + " | W.<+u.'+`.j {.[+}+2 A.|+` 1+J.2+2+ ", + " 3+4+5+6+7+{.r.0.8+9+0+a+b+:+c+:+`.d+ ", + " e+f+g+D.W.%+D h+i+j+k+l+m+l+n+o+ ", + " p+q+5+g r+s+t+u+j+v+w+x+ ", + " y+z+A+B+t+C+D+E+ ", + " F+G+H+I+ ", + " ", + " " + }; + +const char * +AlcPix::m_open_xpm[]= + { /* XPM */ + /* columns rows colors chars-per-pixel */ + "32 32 258 2", + " c None", + ". c #CAADA4", + "+ c #B08476", + "@ c #884631", + "# c #6E3827", + "$ c #3D1F15", + "% c #522A1D", + "& c #5F3122", + "* c #B2887A", + "= c #B68E81", + "- c #CAD7CA", + "; c #DFE8DF", + "> c #2A352A", + ", c #C8D5C8", + "' c #D5DED5", + ") c #B0B9B0", + "! c #788378", + "~ c #768576", + "{ c #576657", + "] c #374237", + "^ c #C9D6C9", + "/ c #E0E9E0", + "( c #B4BDB4", + "_ c #465546", + ": c #344334", + "< c #8A6559", + "[ c #3E1F15", + "} c #96A996", + "| c #7F907F", + "1 c #6C796C", + "2 c #516051", + "3 c #2C372C", + "4 c #C6D5C6", + "5 c #D7E0D7", + "6 c #B3BCB3", + "7 c #798479", + "8 c #374637", + "9 c #364536", + "0 c #324132", + "a c #475847", + "b c #9AAD9A", + "c c #A2AD97", + "d c #A89478", + "e c #9A896F", + "f c #89967F", + "g c #7F947F", + "h c #7A897A", + "i c #6B7A6B", + "j c #596859", + "k c #374437", + "l c #B0BBB0", + "m c #ABB6AB", + "n c #C7D0C7", + "o c #939E93", + "p c #576457", + "q c #3D4C3D", + "r c #3C4B3C", + "s c #3A493A", + "t c #344040", + "u c #3C3D74", + "v c #3E4A4B", + "w c #8F917B", + "x c #BC7A57", + "y c #D7683F", + "z c #BB4E21", + "A c #935834", + "B c #7A7F67", + "C c #687D68", + "D c #6F826F", + "E c #728372", + "F c #606F60", + "G c #212A21", + "H c #A6B9A6", + "I c #B1BEB1", + "J c #808B80", + "K c #5B685B", + "L c #4D5C4D", + "M c #3E4B4F", + "N c #28295F", + "O c #272372", + "P c #363070", + "Q c #272551", + "R c #7F4B35", + "S c #D06E47", + "T c #EE8C6A", + "U c #CF592E", + "V c #9D3508", + "W c #864F2B", + "X c #5E735E", + "Y c #708370", + "Z c #8C9D8C", + "` c #323D32", + " . c #ACBDAC", + ".. c #D8E1D8", + "+. c #D9E2D9", + "@. c #CBD6CB", + "#. c #AAB7AA", + "$. c #5D6771", + "%. c #2A2D63", + "&. c #171264", + "*. c #1F1A5E", + "=. c #1D1A45", + "-. c #181631", + ";. c #62260D", + ">. c #A0512F", + ",. c #D06D3F", + "'. c #B64D1C", + "). c #8B451F", + "!. c #836E53", + "~. c #889988", + "{. c #657665", + "]. c #5D6C5D", + "^. c #A9BEA9", + "/. c #D5E0D5", + "(. c #E1E8E1", + "_. c #E3EAE3", + ":. c #DBE4DB", + "<. c #D2DDD2", + "[. c #C1D0C1", + "}. c #9DAC9D", + "|. c #58636F", + "1. c #323463", + "2. c #1D1A46", + "3. c #110E24", + "4. c #32190C", + "5. c #4F220B", + "6. c #7F4D2A", + "7. c #7F7157", + "8. c #90A190", + "9. c #7A8B7A", + "0. c #697A69", + "a. c #586758", + "b. c #232C23", + "c. c #A0B5A0", + "d. c #E2E9E2", + "e. c #DCE5DC", + "f. c #D4DFD4", + "g. c #BFD0BF", + "h. c #B2C3B2", + "i. c #94A499", + "j. c #515A67", + "k. c #2D2F48", + "l. c #3A392E", + "m. c #6E6A56", + "n. c #919E8A", + "o. c #889B88", + "p. c #6A7D6A", + "q. c #677867", + "r. c #637463", + "s. c #5E6E5E", + "t. c #5B6A5B", + "u. c #5F705F", + "v. c #283328", + "w. c #AFBCAF", + "x. c #D0DBD0", + "y. c #BBCCBB", + "z. c #B7C8B7", + "A. c #495649", + "B. c #ABBAAB", + "C. c #8B9E8B", + "D. c #7A8F7A", + "E. c #778A77", + "F. c #718471", + "G. c #667766", + "H. c #647564", + "I. c #617261", + "J. c #3B483B", + "K. c #1E251E", + "L. c #B2BFB2", + "M. c #C3CEC3", + "N. c #C3D0C3", + "O. c #BDCEBD", + "P. c #B5C6B5", + "Q. c #AABBAA", + "R. c #3D4A3D", + "S. c #627162", + "T. c #525D52", + "U. c #8B9A8B", + "V. c #788B78", + "W. c #768976", + "X. c #6B7E6B", + "Y. c #384538", + "Z. c #141B15", + "`. c #485548", + " + c #95A295", + ".+ c #ACBBAC", + "++ c #AFC0AF", + "@+ c #9CAB9C", + "#+ c #354035", + "$+ c #505D50", + "%+ c #728572", + "&+ c #4F5E4F", + "*+ c #444D44", + "=+ c #869386", + "-+ c #394639", + ";+ c #192019", + ">+ c #333E33", + ",+ c #5F6E5F", + "'+ c #334033", + ")+ c #4B584B", + "!+ c #8C9B8C", + "~+ c #343F34", + "{+ c #4A554A", + "]+ c #505F50", + "^+ c #495249", + "/+ c #818E81", + "(+ c #3F4D3E", + "_+ c #394439", + ":+ c #3F4C3F", + "<+ c #6C7F6C", + "[+ c #798C79", + "}+ c #516251", + "|+ c #3F463F", + "1+ c #3C493C", + "2+ c #414E41", + "3+ c #768574", + "4+ c #889D86", + "5+ c #819681", + "6+ c #6D806D", + "7+ c #657865", + "8+ c #809580", + "9+ c #556655", + "0+ c #546354", + "a+ c #4B5A4B", + "b+ c #465346", + "c+ c #3E4B3E", + "d+ c #4D5A4D", + "e+ c #566354", + "f+ c #7C8C79", + "g+ c #819580", + "h+ c #859C85", + "i+ c #5A6B5A", + "j+ c #566756", + "k+ c #526152", + "l+ c #4C5B4C", + "m+ c #485748", + "n+ c #434E43", + "o+ c #333C33", + "p+ c #5D6D5C", + "q+ c #7B8B78", + "r+ c #7E937E", + "s+ c #8AA18A", + "t+ c #5D6E5D", + "u+ c #5B6C5B", + "v+ c #536453", + "w+ c #536253", + "x+ c #3A473A", + "y+ c #556354", + "z+ c #778877", + "A+ c #869C85", + "B+ c #91A891", + "C+ c #607160", + "D+ c #566556", + "E+ c #3B463B", + "F+ c #5A6A59", + "G+ c #859782", + "H+ c #5C6B5C", + "I+ c #415041", + " ", + " ", + " . ", + " + @ # ", + " + @ @ @ # ", + " + @ @ @ @ @ # ", + " + @ @ @ @ @ @ @ # ", + " + @ @ @ @ @ @ $ % % & ", + " * @ @ @ % ", + " = @ @ @ % ", + " = @ @ @ % ", + " - ; = @ @ @ % > ", + " , ' ) ! = @ @ @ % ~ { ] ", + " ^ / ( ! _ : < % % % [ } | 1 2 3 ", + " 4 5 6 7 8 9 : 0 8 a b c d e f g h i j k ", + " l m n o p q r r s t u v w x y z A B C D E F ] G ", + " H I J K L M N O P Q R S T U V W X Y Z ` ", + " ...+.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.| {.].G ", + " ^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.{.].a.j b. ", + " c.- /.(.d.e.f.4 g.h.i.j.k.l.m.n.o.D p.q.r.s.t.u.{.v. ", + " ].w.f.5 /.x.4 g.y.z. .A.B.C.D.E.F.p.q.G.H.I.J.K. ", + " ].L.M.N.[.O.P.Q.R.S.T.U.V.W.F.X.G.G.Y.Z. ", + " ] `. +.+++@+#+$+%+&+*+=+F.X.r.-+;+>+ ", + " 1 ,+'+)+!+~+{+u.%+L ]+^+/+(+;+_+:+R. ", + " | W.<+u.'+`.j {.[+}+2 A.|+` 1+J.2+2+ ", + " 3+4+5+6+7+{.r.0.8+9+0+a+b+:+c+:+`.d+ ", + " e+f+g+D.W.%+D h+i+j+k+l+m+l+n+o+ ", + " p+q+5+g r+s+t+u+j+v+w+x+ ", + " y+z+A+B+t+C+D+E+ ", + " F+G+H+I+ ", + " ", + " " + }; + +const char * +AlcPix::m_saveas_xpm[]= + { /* XPM */ + /* columns rows colors chars-per-pixel */ + "32 32 251 2", + " c None", + ". c #DFE3DE", + "+ c #92A28D", + "@ c #97A692", + "# c #5D6A59", + "$ c #5D7555", + "% c #3B4A36", + "& c #9BAA96", + "* c #B0BCAC", + "= c #9CAB97", + "- c #A8B5A4", + "; c #C9D1C8", + "> c #303E2D", + ", c #374633", + "' c #788C71", + ") c #40503A", + "! c #CAD7CA", + "~ c #C8D5C8", + "{ c #D5DED5", + "] c #B0B9B0", + "^ c #788378", + "/ c #768576", + "( c #576657", + "_ c #374237", + ": c #C9D6C9", + "< c #E0E9E0", + "[ c #B4BDB4", + "} c #465546", + "| c #344334", + "1 c #394839", + "2 c #9FB29F", + "3 c #96A996", + "4 c #7F907F", + "5 c #6C796C", + "6 c #516051", + "7 c #2C372C", + "8 c #C6D5C6", + "9 c #D7E0D7", + "0 c #B3BCB3", + "a c #798479", + "b c #374637", + "c c #364536", + "d c #354435", + "e c #334233", + "f c #384738", + "g c #485948", + "h c #444F40", + "i c #9EB19E", + "j c #9BAE9B", + "k c #94A794", + "l c #889D88", + "m c #7F947F", + "n c #7A897A", + "o c #6B7A6B", + "p c #596859", + "q c #374437", + "r c #B0BBB0", + "s c #ABB6AB", + "t c #C7D0C7", + "u c #939E93", + "v c #576457", + "w c #3D4C3D", + "x c #3C4B3C", + "y c #3B4A3B", + "z c #3E4D3E", + "A c #91A691", + "B c #8CA18C", + "C c #829582", + "D c #758A75", + "E c #687D68", + "F c #6F826F", + "G c #728372", + "H c #606F60", + "I c #212A21", + "J c #A6B9A6", + "K c #B1BEB1", + "L c #808B80", + "M c #5B685B", + "N c #4E5D4E", + "O c #4B5C4B", + "P c #4D5E4D", + "Q c #4C5C4C", + "R c #4A5B4A", + "S c #4E5F4E", + "T c #839883", + "U c #849984", + "V c #819681", + "W c #7C917C", + "X c #6F846F", + "Y c #637863", + "Z c #5E735E", + "` c #708370", + " . c #8C9D8C", + ".. c #323D32", + "+. c #ACBDAC", + "@. c #D8E1D8", + "#. c #D9E2D9", + "$. c #CBD6CB", + "%. c #AAB7AA", + "&. c #717E71", + "*. c #5D6C5D", + "=. c #576857", + "-. c #566756", + ";. c #546554", + ">. c #788D78", + ",. c #778C77", + "'. c #728772", + "). c #6C816C", + "!. c #778A77", + "~. c #889988", + "{. c #657665", + "]. c #A9BEA9", + "^. c #D5E0D5", + "/. c #E1E8E1", + "(. c #E3EAE3", + "_. c #DBE4DB", + ":. c #D2DDD2", + "<. c #C1D0C1", + "[. c #9DAC9D", + "}. c #738473", + "|. c #5F705F", + "1. c #5B6C5B", + "2. c #697E69", + "3. c #667B66", + "4. c #758875", + "5. c #90A190", + "6. c #7A8B7A", + "7. c #697A69", + "8. c #586758", + "9. c #232C23", + "0. c #A0B5A0", + "a. c #E2E9E2", + "b. c #DCE5DC", + "c. c #D4DFD4", + "d. c #BFD0BF", + "e. c #B2C3B2", + "f. c #9BAC9B", + "g. c #6A796A", + "h. c #5C6D5C", + "i. c #607560", + "j. c #7D907D", + "k. c #92A592", + "l. c #889B88", + "m. c #6A7D6A", + "n. c #677867", + "o. c #637463", + "p. c #5E6E5E", + "q. c #5B6A5B", + "r. c #283328", + "s. c #AFBCAF", + "t. c #D0DBD0", + "u. c #BBCCBB", + "v. c #B7C8B7", + "w. c #495649", + "x. c #ABBAAB", + "y. c #8B9E8B", + "z. c #7A8F7A", + "A. c #718471", + "B. c #667766", + "C. c #647564", + "D. c #617261", + "E. c #3B483B", + "F. c #1E251E", + "G. c #B2BFB2", + "H. c #C3CEC3", + "I. c #C3D0C3", + "J. c #BDCEBD", + "K. c #B5C6B5", + "L. c #AABBAA", + "M. c #3D4A3D", + "N. c #627162", + "O. c #525D52", + "P. c #8B9A8B", + "Q. c #788B78", + "R. c #768976", + "S. c #6B7E6B", + "T. c #384538", + "U. c #141B15", + "V. c #485548", + "W. c #95A295", + "X. c #ACBBAC", + "Y. c #AFC0AF", + "Z. c #9CAB9C", + "`. c #354035", + " + c #505D50", + ".+ c #728572", + "++ c #4F5E4F", + "@+ c #444D44", + "#+ c #869386", + "$+ c #394639", + "%+ c #192019", + "&+ c #333E33", + "*+ c #5F6E5F", + "=+ c #334033", + "-+ c #4B584B", + ";+ c #8C9B8C", + ">+ c #343F34", + ",+ c #4A554A", + "'+ c #4D5C4D", + ")+ c #505F50", + "!+ c #495249", + "~+ c #818E81", + "{+ c #3F4D3E", + "]+ c #394439", + "^+ c #3F4C3F", + "/+ c #6C7F6C", + "(+ c #798C79", + "_+ c #516251", + ":+ c #3F463F", + "<+ c #3C493C", + "[+ c #414E41", + "}+ c #768574", + "|+ c #889D86", + "1+ c #6D806D", + "2+ c #657865", + "3+ c #809580", + "4+ c #556655", + "5+ c #546354", + "6+ c #4B5A4B", + "7+ c #465346", + "8+ c #3E4B3E", + "9+ c #4D5A4D", + "0+ c #566354", + "a+ c #7C8C79", + "b+ c #819580", + "c+ c #859C85", + "d+ c #5A6B5A", + "e+ c #526152", + "f+ c #4C5B4C", + "g+ c #485748", + "h+ c #434E43", + "i+ c #333C33", + "j+ c #5D6D5C", + "k+ c #7B8B78", + "l+ c #7E937E", + "m+ c #8AA18A", + "n+ c #5D6E5D", + "o+ c #536453", + "p+ c #536253", + "q+ c #3A473A", + "r+ c #556354", + "s+ c #778877", + "t+ c #869C85", + "u+ c #91A891", + "v+ c #607160", + "w+ c #566556", + "x+ c #3B463B", + "y+ c #5A6A59", + "z+ c #859782", + "A+ c #5C6B5C", + "B+ c #415041", + " ", + " ", + " ", + " . + @ @ # ", + " @ $ $ $ % ", + " @ $ $ $ % ", + " @ $ $ $ % ", + " @ $ $ $ % ", + " & $ $ $ % ", + " * = - ; $ $ $ > % % , ", + " ' $ $ $ $ $ $ $ ) ", + " ! ' $ $ $ $ $ ) ", + " ~ { ] ^ ' $ $ $ ) / ( _ ", + " : < [ ^ } | 1 ' $ ) 2 3 4 5 6 7 ", + " 8 9 0 a b c d e f g h i j k l m n o p q ", + " r s t u v w x w w y z g A k A B C D E F G H _ I ", + " J K L M N O P Q R S T U V W X Y Z ` ... ", + " +.@.#.$.%.&.*.=.-.;.;.>.,.'.).Z !.~.4 {.*.I ", + " ].^./.(._.:.<.[.}.|.1.1.2.Y 3.4.5.6.7.{.*.8.p 9. ", + " 0.! ^./.a.b.c.8 d.e.f.g.h.i.j.k.l.F m.n.o.p.q.|.{.r. ", + " *.s.c.9 ^.t.8 d.u.v.+.w.x.y.z.!.A.m.n.B.C.D.E.F. ", + " *.G.H.I.<.J.K.L.M.N.O.P.Q.R.A.S.B.B.T.U. ", + " _ V.W.X.Y.Z.`. +.+++@+#+A.S.o.$+%+&+ ", + " 5 *+=+-+;+>+,+|..+'+)+!+~+{+%+]+^+M. ", + " 4 R./+|.=+V.p {.(+_+6 w.:+..<+E.[+[+ ", + " }+|+V 1+2+{.o.7.3+4+5+6+7+^+8+^+V.9+ ", + " 0+a+b+z.R..+F c+d+-.e+f+g+f+h+i+ ", + " j+k+V m l+m+n+1.-.o+p+q+ ", + " r+s+t+u+n+v+w+x+ ", + " y+z+A+B+ ", + " ", + " " + }; + +#endif +// File_checked_for_headers diff --git a/src/utils/aLinkCreator/src/alcpix.h b/src/utils/aLinkCreator/src/alcpix.h new file mode 100644 index 00000000..69e9e1e5 --- /dev/null +++ b/src/utils/aLinkCreator/src/alcpix.h @@ -0,0 +1,60 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: AlcPix Class +/// +/// Purpose: aMule ed2k link creator +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Pixmaps from http://jimmac.musichall.cz/ikony.php3 | http://www.everaldo.com | http://www.icomania.com +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _ALCPIX_H +#define _ALCPIX_H + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +// Switch between themes (select just one of them) +//#define WANT_KDE_THEME 1 + +class AlcPix + { + private: + static const char *m_about_xpm[]; +#ifndef __WXMSW__ + static const char *m_alc_xpm[]; +#endif + static const char *m_copy_xpm[]; + static const char *m_open_xpm[]; + static const char *m_saveas_xpm[]; + + public: + static wxBitmap getPixmap(const wxString& name); + }; + +#endif /* _ALCPIX_H */ +// File_checked_for_headers diff --git a/src/utils/aLinkCreator/src/bithelp.h b/src/utils/aLinkCreator/src/bithelp.h new file mode 100644 index 00000000..d4ba860e --- /dev/null +++ b/src/utils/aLinkCreator/src/bithelp.h @@ -0,0 +1,56 @@ +/* bithelp.h - Some bit manipulation helpers + * Copyright (C) 1999, 2002 Free Software Foundation, Inc. + * + * This file is part of Libgcrypt. + * + * Libgcrypt is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser general Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * Libgcrypt 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef G10_BITHELP_H +#define G10_BITHELP_H + + +/**************** + * Rotate the 32 bit unsigned integer X by N bits left/right + */ +#if defined(__GNUC__) && defined(__i386__) +static inline uint32_t +rol(uint32_t x, int n) +{ + __asm__("roll %%cl,%0" + :"=r" (x) + :"0" (x),"c" (n)); + return x; +} +#else +#define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) ) +#endif + +#if defined(__GNUC__) && defined(__i386__) +static inline uint32_t +ror(uint32_t x, int n) +{ + __asm__("rorl %%cl,%0" + :"=r" (x) + :"0" (x),"c" (n)); + return x; +} +#else +#define ror(x,n) ( ((x) >> (n)) | ((x) << (32-(n))) ) +#endif + + +#endif /*G10_BITHELP_H*/ +// File_checked_for_headers diff --git a/src/utils/aLinkCreator/src/ed2khash.cpp b/src/utils/aLinkCreator/src/ed2khash.cpp new file mode 100644 index 00000000..d2e0291a --- /dev/null +++ b/src/utils/aLinkCreator/src/ed2khash.cpp @@ -0,0 +1,274 @@ +//////////////////////////////////////////////////////////////////////////////// +/// Name: Ed2kHash Class +/// +/// Purpose: aMule ed2k link creator +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Copyright (C) 2004 by Phoenix +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +//////////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx/wx.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include +#include + +#include "ed2khash.h" + + +// efe, sorry for that, i have not enough time to do the right thing now, but +// please, create a file called like unicodestuff.h and put this. Include in +// alcc.c and here. And remove this stupid comment :) +//----------------------------------------------------------------------------- +// efe, this can be put in a separete include file, if you want to reuse +static wxCSConv aMuleConv(wxT("iso8859-1")); +#ifdef wxUSE_UNICODE + #define unicode2char(x) (const char*) aMuleConv.cWX2MB(x) + #define char2unicode(x) aMuleConv.cMB2WX(x) +#else + #define unicode2char(x) x.c_str() + #define char2unicode(x) x +#endif +//----------------------------------------------------------------------------- + + +/// Constructor +Ed2kHash::Ed2kHash():MD4() +{ + m_ed2kArrayOfHashes.Clear(); + m_filename.Clear(); + m_fileSize=0; +} + +/// Destructor +Ed2kHash::~Ed2kHash() +{} + +/// Set Ed2k hash from a file +// returns false if aborted +bool Ed2kHash::SetED2KHashFromFile(const wxFileName& filename, MD4Hook hook) +{ + // Open file and let wxFFile destructor close the file + // Closing it explicitly may crash on Win32 ... + wxFFile file(filename.GetFullPath(), wxT("rbS")); + if (! file.IsOpened()) + { + wxLogError (_("Unable to open %s"),unicode2char(filename.GetFullPath())); + return (false); + } + else if (file.Length() > (size_t)-1) + { + wxLogError (_("The file %s is to big for the Donkey: maximum allowed is 4 GB."), + unicode2char(filename.GetFullPath())); + return (false); + } + else + { + unsigned char ret[MD4_HASHLEN_BYTE]; + MD4Context hdc; + + size_t read; + size_t partcount; + size_t dataread; + size_t totalread; + + char *buf = new char[BUFSIZE]; + + bool goAhead = true; + +#ifdef WANT_STRING_IMPLEMENTATION + + wxString tmpHash(wxEmptyString); +#else + + unsigned char* tmpCharHash = NULL; +#endif + // Clear Ed2k Hash + m_ed2kArrayOfHashes.Clear(); + + // Processing each block + totalread=0; + partcount = 0; + while (!file.Eof()) + { + dataread = 0; + MD4Init(&hdc); + while (dataread < PARTSIZE && !file.Eof()) + { + if (hook) + { + goAhead = hook( (int)((double)(100.0 * totalread) / file.Length())); + } + if (goAhead) + { + if ((dataread + BUFSIZE) > PARTSIZE) + { + read = file.Read(buf, PARTSIZE - dataread); + } + else + { + read = file.Read(buf, BUFSIZE); + } + dataread += read; + totalread += read; + MD4Update(&hdc, reinterpret_cast(buf), + read); + } + else + { + return (false); + } + + } + MD4Final(&hdc, ret); + + // Add part-hash + m_ed2kArrayOfHashes.Add(charToHex(reinterpret_cast(ret), + MD4_HASHLEN_BYTE)); + + partcount++; + +#ifdef WANT_STRING_IMPLEMENTATION + // MD4_HASHLEN_BYTE is ABSOLUTLY needed as we dont want NULL + // character to be interpreted as the end of the parthash string +#if wxUSE_UNICODE + + tmpHash += wxString(reinterpret_cast(ret),MD4_HASHLEN_BYTE); +#else + + tmpHash += wxString(reinterpret_cast(ret),MD4_HASHLEN_BYTE); +#endif +#else + + tmpCharHash = (unsigned char*)realloc(tmpCharHash, + sizeof(unsigned char) * (MD4_HASHLEN_BYTE * partcount)); + memcpy ( tmpCharHash + MD4_HASHLEN_BYTE * (partcount - 1), ret, MD4_HASHLEN_BYTE ); +#endif + + } + + delete [] buf; + + // hash == hash of concatenned parthashes + if (partcount > 1) + { + wxString finalHash; + +#ifdef WANT_STRING_IMPLEMENTATION + + finalHash=calcMd4FromString(tmpHash); +#else + + MD4Init(&hdc); + MD4Update(&hdc, tmpCharHash, MD4_HASHLEN_BYTE * partcount); + MD4Final(&hdc, ret); + + finalHash = charToHex(reinterpret_cast(ret), + MD4_HASHLEN_BYTE); +#endif + + m_ed2kArrayOfHashes.Add(finalHash); + } + +#ifndef WANT_STRING_IMPLEMENTATION + free(tmpCharHash); + tmpCharHash=NULL; +#endif + + m_ed2kArrayOfHashes.Shrink(); + + // Set members + m_fileSize = file.Length(); + m_filename = filename.GetFullName(); + + return true; + } +} + +/// Set Ed2k hash from a file +bool Ed2kHash::SetED2KHashFromFile(const wxString& filename, MD4Hook hook) +{ + return SetED2KHashFromFile(wxFileName(filename), hook); +} + +/// Get Ed2k link +wxString Ed2kHash::GetED2KLink(const bool addPartHashes, const wxArrayString* arrayOfUrls) +{ + // Constructing ed2k basic link + wxString ed2kLink = wxT("ed2k://|file|")+CleanFilename(m_filename) + +wxT("|")+ wxString::Format(wxT("%u"),m_fileSize) +wxT("|") + + m_ed2kArrayOfHashes.Last() + wxT("|"); + + + // Add optional URLs + if ( arrayOfUrls && !arrayOfUrls->IsEmpty()) + { + size_t i; + for ( i = 0; i < arrayOfUrls->GetCount(); i++ ) + { + ed2kLink += wxT("s=") + (*arrayOfUrls)[i] + wxT("|"); + } + } + + // Add Optional part-hashes + if (addPartHashes && m_ed2kArrayOfHashes.GetCount()>1) + { + ed2kLink += wxT("p="); + size_t i; + for (i=0;i<(m_ed2kArrayOfHashes.GetCount()-1);++i) + { + ed2kLink += m_ed2kArrayOfHashes[i] + wxT(":"); + } + ed2kLink.RemoveLast(); // Remove last : + ed2kLink += wxT("|"); + } + + // Add last slash + ed2kLink += wxT("/"); + + return ed2kLink; +} + +/// Strip all non-alphanumeric characters of a filename string +wxString Ed2kHash::CleanFilename(const wxString& filename) +{ + wxString name(filename); + + wxRegEx toStrip(wxT("[^[:alnum:]_.-]")); + toStrip.Replace(&name, wxT("_")); + + return (name); +} + +/// Get Ed2k Array of hashes +wxArrayString Ed2kHash::GetED2KHash() +{ + return (m_ed2kArrayOfHashes); +} +// File_checked_for_headers diff --git a/src/utils/aLinkCreator/src/ed2khash.h b/src/utils/aLinkCreator/src/ed2khash.h new file mode 100644 index 00000000..7a4c3d6e --- /dev/null +++ b/src/utils/aLinkCreator/src/ed2khash.h @@ -0,0 +1,80 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: Ed2kHash Class +/// +/// Purpose: aMule ed2k link creator +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Copyright (C) 2004 by Phoenix +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _ED2KHASH_H +#define _ED2KHASH_H + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include + +#include "md4.h" + +class Ed2kHash:public MD4 + { + private: + + wxArrayString m_ed2kArrayOfHashes; + wxString m_filename; + size_t m_fileSize; + + protected: + + /// Strip all non-alphanumeric characters of a filename string + wxString CleanFilename(const wxString& filename); + + public: + /// Constructor + Ed2kHash (); + + /// Destructor + ~Ed2kHash (); + + /// Set Ed2k hash from a file + bool SetED2KHashFromFile(const wxFileName& filename, MD4Hook hook); + + /// Set Ed2k hash from a file + bool SetED2KHashFromFile(const wxString& filename, MD4Hook hook); + + /// Get Ed2k Array of hashes + wxArrayString GetED2KHash(); + + /// Get Ed2k link + wxString GetED2KLink(const bool addPartHashes=false, const wxArrayString* arrayOfUrls = NULL); + }; + +#endif /* _ED2KHASH_H */ + +// File_checked_for_headers diff --git a/src/utils/aLinkCreator/src/md4.cpp b/src/utils/aLinkCreator/src/md4.cpp new file mode 100644 index 00000000..91c8edf3 --- /dev/null +++ b/src/utils/aLinkCreator/src/md4.cpp @@ -0,0 +1,402 @@ +//////////////////////////////////////////////////////////////////////////////// +/// Name: MD4 Class +/// +/// Purpose: aMule ed2k link creator +/// +/// Last modified by: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Copyright (C) 2004 by Phoenix +/// +/// Copyright (C) 2004 by Madcat +/// +/// Copyright (C) 2002, 2003, 2004 by Michael Buesch +/// Email: mbuesch@freenet.de +/// +/// The algorithm is due to Ron Rivest. This code is based on code +/// written by Colin Plumb in 1993. +/// +/// This code implements the MD4 message-digest algorithm. +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include + +#include "md4.h" +#include "bithelp.h" + + +/// BIG ENDIAN byte reversing +#if wxBYTE_ORDER == wxBIG_ENDIAN +// Note: this code is harmless on little-endian machines. +void MD4::byteReverse(unsigned char *buf, unsigned longs) +{ + uint32_t t; + do + { + t = (uint32_t) ((unsigned) buf[3] << 8 | buf[2]) << 16 | + ((unsigned) buf[1] << 8 | buf[0]); + *(uint32_t *) buf = t; + buf += 4; + } + while (--longs); +} +#else +#define byteReverse(buf, len) do { } while (0) +#endif + +/// Start MD4 accumulation. +/// Set bit count to 0 and buffer to mysteriousinitialization constants. +void MD4::MD4Init(struct MD4Context *ctx) +{ + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + ctx->bits[0] = 0; + ctx->bits[1] = 0; +} + +/// Update context to reflect the concatenation of another buffer full of bytes. +void MD4::MD4Update(struct MD4Context *ctx, unsigned char const *buf, + size_t len) +{ + register uint32_t t; + + // Update bitcount + t = ctx->bits[0]; + if ((ctx->bits[0] = t + ((uint32_t) len << 3)) < t) + ctx->bits[1]++; // Carry from low to high + ctx->bits[1] += len >> 29; + + t = (t >> 3) & 0x3f; // Bytes already in shsInfo->data + + // Handle any leading odd-sized chunks + if (t) + { + unsigned char *p = (unsigned char *) ctx->in + t; + + t = 64 - t; + if (len < t) + { + memcpy(p, buf, len); + return; + } + memcpy(p, buf, t); + byteReverse(ctx->in, 16); + MD4Transform(ctx->buf, (uint32_t *) ctx->in); + buf += t; + len -= t; + } + + // Process data in 64-byte chunks + while (len >= 64) + { + memcpy(ctx->in, buf, 64); + byteReverse(ctx->in, 16); + MD4Transform(ctx->buf, (uint32_t *) ctx->in); + buf += 64; + len -= 64; + } + + //Handle any remaining bytes of data. + memcpy(ctx->in, buf, len); +} + + +/// Final wrapup - pad to 64-byte boundary with the bit pattern +/// 1 0* (64-bit count of bits processed, MSB-first) +void MD4::MD4Final(struct MD4Context *ctx, unsigned char* digest) +{ + unsigned int count; + unsigned char *p; + + // Compute number of bytes mod 64 + count = (ctx->bits[0] >> 3) & 0x3F; + + // Set the first char of padding to 0x80. + //This is safe since there is always at least one byte free + p = ctx->in + count; + *p++ = 0x80; + + // Bytes of padding needed to make 64 bytes + count = 64 - 1 - count; + + // Pad out to 56 mod 64 + if (count < 8) + { + // Two lots of padding: Pad the first block to 64 bytes + memset(p, 0, count); + byteReverse(ctx->in, 16); + MD4Transform(ctx->buf, (uint32_t *) ctx->in); + + // Now fill the next block with 56 bytes + memset(ctx->in, 0, 56); + } + else + { + // Pad block to 56 bytes + memset(p, 0, count - 8); + } + byteReverse(ctx->in, 14); + + // Append length in bits and transform + ((uint32_t *) ctx->in)[14] = ctx->bits[0]; + ((uint32_t *) ctx->in)[15] = ctx->bits[1]; + + MD4Transform(ctx->buf, (uint32_t *) ctx->in); + byteReverse((unsigned char *) ctx->buf, 4); + + if (digest!=NULL) + { + memcpy(digest, ctx->buf, 16); + } + memset(ctx, 0, sizeof(ctx)); // In case it's sensitive +} + +/// The three core functions +#define MD4_F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define MD4_G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z))) +#define MD4__H(x, y, z) ((x) ^ (y) ^ (z)) + +#define MD4_FF(a, b, c, d, x, s) { \ + (a) += MD4_F ((b), (c), (d)) + (x); \ + (a) = rol ((a), (s)); \ + } +#define MD4_GG(a, b, c, d, x, s) { \ + (a) += MD4_G ((b), (c), (d)) + (x) + (uint32_t)0x5a827999; \ + (a) = rol ((a), (s)); \ + } +#define MD4_HH(a, b, c, d, x, s) { \ + (a) += MD4__H ((b), (c), (d)) + (x) + (uint32_t)0x6ed9eba1; \ + (a) = rol ((a), (s)); \ + } + +/// The core of the MD4 algorithm +void MD4::MD4Transform(uint32_t buf[4], uint32_t const in[16]) +{ + register uint32_t a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD4_FF(a, b, c, d, in[0], 3); /* 1 */ + MD4_FF(d, a, b, c, in[1], 7); /* 2 */ + MD4_FF(c, d, a, b, in[2], 11); /* 3 */ + MD4_FF(b, c, d, a, in[3], 19); /* 4 */ + MD4_FF(a, b, c, d, in[4], 3); /* 5 */ + MD4_FF(d, a, b, c, in[5], 7); /* 6 */ + MD4_FF(c, d, a, b, in[6], 11); /* 7 */ + MD4_FF(b, c, d, a, in[7], 19); /* 8 */ + MD4_FF(a, b, c, d, in[8], 3); /* 9 */ + MD4_FF(d, a, b, c, in[9], 7); /* 10 */ + MD4_FF(c, d, a, b, in[10], 11); /* 11 */ + MD4_FF(b, c, d, a, in[11], 19); /* 12 */ + MD4_FF(a, b, c, d, in[12], 3); /* 13 */ + MD4_FF(d, a, b, c, in[13], 7); /* 14 */ + MD4_FF(c, d, a, b, in[14], 11); /* 15 */ + MD4_FF(b, c, d, a, in[15], 19); /* 16 */ + + MD4_GG(a, b, c, d, in[0], 3); /* 17 */ + MD4_GG(d, a, b, c, in[4], 5); /* 18 */ + MD4_GG(c, d, a, b, in[8], 9); /* 19 */ + MD4_GG(b, c, d, a, in[12], 13); /* 20 */ + MD4_GG(a, b, c, d, in[1], 3); /* 21 */ + MD4_GG(d, a, b, c, in[5], 5); /* 22 */ + MD4_GG(c, d, a, b, in[9], 9); /* 23 */ + MD4_GG(b, c, d, a, in[13], 13); /* 24 */ + MD4_GG(a, b, c, d, in[2], 3); /* 25 */ + MD4_GG(d, a, b, c, in[6], 5); /* 26 */ + MD4_GG(c, d, a, b, in[10], 9); /* 27 */ + MD4_GG(b, c, d, a, in[14], 13); /* 28 */ + MD4_GG(a, b, c, d, in[3], 3); /* 29 */ + MD4_GG(d, a, b, c, in[7], 5); /* 30 */ + MD4_GG(c, d, a, b, in[11], 9); /* 31 */ + MD4_GG(b, c, d, a, in[15], 13); /* 32 */ + + MD4_HH(a, b, c, d, in[0], 3); /* 33 */ + MD4_HH(d, a, b, c, in[8], 9); /* 34 */ + MD4_HH(c, d, a, b, in[4], 11); /* 35 */ + MD4_HH(b, c, d, a, in[12], 15); /* 36 */ + MD4_HH(a, b, c, d, in[2], 3); /* 37 */ + MD4_HH(d, a, b, c, in[10], 9); /* 38 */ + MD4_HH(c, d, a, b, in[6], 11); /* 39 */ + MD4_HH(b, c, d, a, in[14], 15); /* 40 */ + MD4_HH(a, b, c, d, in[1], 3); /* 41 */ + MD4_HH(d, a, b, c, in[9], 9); /* 42 */ + MD4_HH(c, d, a, b, in[5], 11); /* 43 */ + MD4_HH(b, c, d, a, in[13], 15); /* 44 */ + MD4_HH(a, b, c, d, in[3], 3); /* 45 */ + MD4_HH(d, a, b, c, in[11], 9); /* 46 */ + MD4_HH(c, d, a, b, in[7], 11); /* 47 */ + MD4_HH(b, c, d, a, in[15], 15); /* 48 */ + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} + +/// Algorithm verification +bool MD4::selfTest() +{ + wxString test1(wxEmptyString); + wxString test1_md(wxT("31D6CFE0D16AE931B73C59D7E0C089C0")); + wxString test2(wxT("a")); + wxString test2_md(wxT("BDE52CB31DE33E46245E05FBDBD6FB24")); + wxString test3(wxT("abc")); + wxString test3_md(wxT("A448017AAF21D8525FC10AE87AA6729D")); + wxString test4(wxT("message digest")); + wxString test4_md(wxT("D9130A8164549FE818874806E1C7014B")); + wxString test5(wxT("abcdefghijklmnopqrstuvwxyz")); + wxString test5_md(wxT("D79E1C308AA5BBCDEEA8ED63DF412DA9")); + wxString test6(wxT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")); + wxString test6_md(wxT("043F8582F241DB351CE627E153E7F0E4")); + wxString test7(wxT("12345678901234567890123456789012345678901234567890123456789012345678901234567890")); + wxString test7_md(wxT("E33B4DDC9C38F2199C3E7B164FCC0536")); + + MD4 md4; + + if (md4.calcMd4FromString(test1) != test1_md) + return false; + if (md4.calcMd4FromString(test2) != test2_md) + return false; + if (md4.calcMd4FromString(test3) != test3_md) + return false; + if (md4.calcMd4FromString(test4) != test4_md) + return false; + if (md4.calcMd4FromString(test5) != test5_md) + return false; + if (md4.calcMd4FromString(test6) != test6_md) + return false; + if (md4.calcMd4FromString(test7) != test7_md) + return false; + + return true; +} + +/// Get Md4 hash from a string +wxString MD4::calcMd4FromString(const wxString &buf) +{ + MD4Context hdc; + unsigned char ret[MD4_HASHLEN_BYTE]; + + MD4Init(&hdc); + MD4Update(&hdc, (const unsigned char*)buf.c_str(), buf.length()); + MD4Final(&hdc, ret); + + return charToHex((const char*)ret, MD4_HASHLEN_BYTE); +} + +/// Get Md4 hash from a file +wxString MD4::calcMd4FromFile(const wxString &filename, MD4Hook hook) +{ + unsigned int bufSize; + unsigned char ret[MD4_HASHLEN_BYTE]; + MD4Context hdc; + + // Open file and let wxFFile destructor close the file + // Closing it explicitly may crash on Win32 ... + wxFFile file(filename, wxT("rbS")); + if (! file.IsOpened()) + { + return wxEmptyString; + } + else + { + bufSize = calcBufSize(file.Length()); + char *buf = new char[bufSize]; + + bool keep_going = true; + size_t read = 0; + size_t totalread = 0; + + bool goAhead = true; + + MD4Init(&hdc); + while (!file.Eof() && keep_going) + { + if (hook) + { + goAhead = hook( (int)((double)(100.0 * totalread) / file.Length())); + } + if (goAhead) + { + read = file.Read(buf, bufSize); + MD4Update(&hdc, reinterpret_cast(buf), + read ); + totalread += read; + } + else + { + return (_("Cancelled !")); + } + } + MD4Final(&hdc, ret); + + delete [] buf; + + return charToHex(reinterpret_cast(ret), + MD4_HASHLEN_BYTE); + } +} + +/// Convert hash to hexa string +wxString MD4::charToHex(const char *buf, size_t len) +{ + size_t i; + wxString hexString; + + for (i = 0; i < len; ++i) + { + hexString += wxString::Format(wxT("%02x"), 0xFF & *(buf + i)); + } + + // Reduce memory usage + hexString.Shrink(); + + return (hexString); +} + +/// Compute Md4 buffsize +size_t MD4::calcBufSize(size_t filesize) +{ + if (filesize < 100000) + { + filesize = 100000; + } + else if (filesize > 200000) + { + filesize = 200000; + } + + return (filesize); +} +// File_checked_for_headers diff --git a/src/utils/aLinkCreator/src/md4.h b/src/utils/aLinkCreator/src/md4.h new file mode 100644 index 00000000..140c907e --- /dev/null +++ b/src/utils/aLinkCreator/src/md4.h @@ -0,0 +1,117 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: MD4 Class +/// +/// Purpose: aMule ed2k link creator +/// +/// Last modified by: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Copyright (C) 2004 by Phoenix +/// +/// Copyright (C) 2004 by Madcat +/// +/// Copyright (C) 2002, 2003, 2004 by Michael Buesch +/// Email: mbuesch@freenet.de +/// +/// The algorithm is due to Ron Rivest. This code is based on code +/// written by Colin Plumb in 1993. +/// +/// This code implements the MD4 message-digest algorithm. +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _MD4_H +#define _MD4_H + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include "../../../Types.h" // needed for uint32_t + +// Use wxString implementation or not +//#define WANT_STRING_IMPLEMENTATION 1 + +// Hook for external progress bar +typedef bool (*MD4Hook)(int percent); + + +const unsigned int MD4_HASHLEN_BYTE = 128 / 8; +const unsigned int BUFSIZE = 64*1024; +const unsigned int PARTSIZE = 9500*1024; + + +class MD4 + { + private: + + protected: + + struct MD4Context + { + uint32_t buf[4]; + uint32_t bits[2]; + unsigned char in[64]; + }; + + void MD4Init(struct MD4Context *context); + void MD4Update(struct MD4Context *context, + unsigned char const *buf, size_t len); + void MD4Final(struct MD4Context *context, + unsigned char *digest); + void MD4Transform(uint32_t buf[4], uint32_t const in[16]); + + wxString charToHex(const char *buf, size_t len); + + size_t calcBufSize(size_t filesize); + + // Needed to reverse byte order on BIG ENDIAN machines +#if wxBYTE_ORDER == wxBIG_ENDIAN + + void byteReverse(unsigned char *buf, unsigned longs); +#endif + + public: + + /// Constructor + MD4() + {} + + /// Destructor + virtual ~MD4() + {} + + /// Algorithm verification + static bool selfTest(); + + /// Get Md4 hash from a string + wxString calcMd4FromString(const wxString &buf); + + /// Get Md4 hash from a file + wxString calcMd4FromFile(const wxString &filename, MD4Hook hook); + }; + +#endif /* _MD4_H */ + +// File_checked_for_headers diff --git a/src/utils/amps/CHANGELOG b/src/utils/amps/CHANGELOG new file mode 100644 index 00000000..a87c45e1 --- /dev/null +++ b/src/utils/amps/CHANGELOG @@ -0,0 +1,78 @@ +AMPS Changelog + +version 0.7.6 + +- fulgas: added Kad info to amps + +version 0.7.5 +------------- +- Fixed parsing of ps output to take into account other processes with 'amule' + in the process name. (thanks GonoszTopi) + +version 0.7.4 +------------- +- Translation updates + +version 0.7.3 +------------- +- Fixed minor bug in the language parsing + +version 0.7.2 +------------- +- Added new 'connecting' connection status. +- Catalan and Spanish translations updated by Jacobo221 +- Dutch translation updated by Supersnail +- French translation updated by thepolish and efe +- Hungarian translation updated by biger +- Basque translation updated by piarres +- Portuguese Brazilian translation added by IgoR + +version 0.7.1 +------------- +- Added setting to allow easy changing of the text color used in the signature + image. (you're welcome deltaHF) +- Fixed BSD support (thanks to Stevil for the help) + +version 0.7 +----------- +- Removed the requirement of register_globals being set in your php.ini (yay!) + +version 0.6 +----------- +- Added support for writing the signature image in PNG, JPEG, and GIF format + (assuming the GD installation supports these). Default is now PNG. +- Modified error images to use the same font as the signature image. +- Made language selection non case-sensative. + +version 0.5 +----------- +- Minor updates to allow AMPS to work with the signature file format used in + the current amule CVS (I developed AMPS with an older stable version). +- Basque translation added by piarres + +version 0.4 +----------- +- Improved multilingual support +- Polish translation added by Ogon +- Dutch translation added by Supersnail +- Hungarian translation added by biger +- Catalan translation added by pukyxd +- Portuguese translation added by rommel +- Italian translation added by GhePeU and ilbuio +- French translation added by thepolish + +version 0.3 +----------- +- Added drop-down list box that allows language selection + +version 0.2 +----------- +- First public release +- Multilanguage support +- German translation added by Citroklar +- Spanish translation added by Jacobo221 +- Finnish translation added by Nikerabbit + +version 0.1 +----------- +- Initial unreleased testing version diff --git a/src/utils/amps/COPYING b/src/utils/amps/COPYING new file mode 100644 index 00000000..bf50f20d --- /dev/null +++ b/src/utils/amps/COPYING @@ -0,0 +1,482 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 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. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, 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 library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, 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 companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, 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 library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete 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 distribute a copy of this License along with the +Library. + + 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 Library or any portion +of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +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 Library, 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 Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you 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. + + If distribution of 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 satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. 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. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library 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. + + 9. 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 Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +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. + + 11. 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 Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library 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 Library. + +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. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library 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. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library 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 Library +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 Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +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 + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. 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 LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. 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 library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; 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. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/src/utils/amps/README b/src/utils/amps/README new file mode 100644 index 00000000..6b7f8d02 --- /dev/null +++ b/src/utils/amps/README @@ -0,0 +1,37 @@ +AMPS - AMule PHP Statistics + +Copyright (c) 2004 Matt Britt +Thanks to BigBob for writing the original aStats, which inspired this script + +To use AMPS, just copy this entire directory somewhere under your HTTP +server's document root. AMPS requires that your PHP binaries have been +compiled with GD and FreeType support (configure options '--with-gd[=DIR] +--enable-gd-native-ttf'). Since AMPS has to access files outside the document +root of your webserver (specifically the aMule signature file), the safe_mode +option in your '/etc/php.ini' MUST be set to 'off'. If you want AMPS to display +in a different language, append '?lang=xx' to the 'index.php' file where 'xx' is +the two-letter country code (assuming that translation exists) such as en, de, +fr, etc. If you input a country code the script does not recognize, it will +simply default to en. Or you could just use the handy language selection drop- +down list at the bottom of the page! + +AMPS looks for the aMule signature file (amulesig.dat) in /tmp. So make sure +amulesig.dat is actually being written to /tmp (the default is ~/.aMule). + +If you would like to add a translation in your language, open the file 'en.inc' +in the 'langs/' directory, translate all the strings, and save the translated +file as 'xx.inc' where 'xx' is the two-leter language code (en, fr, etc). That's +it! Also, you probably will want to add the two-letter language code to the +array $completedlangs that is set near the top of 'index.php'. If you produce a +translation, please be sure to send it to me for inclusion in the main +distribution! + +Sometime in the near future I will complete the theme support I have stubbed +into the script. If you have a colour scheme that you think looks good, modify +'style.css' and be sure to send me a copy of your new syle so I can include it +in future versions! + +Please send any bugs, translations, or verbal abuse to + +Questions or comments regarding translations can be directed to the respective +translators listed in the CHANGELOG file. diff --git a/src/utils/amps/SETTINGS b/src/utils/amps/SETTINGS new file mode 100644 index 00000000..51379077 --- /dev/null +++ b/src/utils/amps/SETTINGS @@ -0,0 +1,72 @@ +AMPS settings: documentation for the constants defined in AMPS + +General +------- + +VERSION : Version number of AMPS +AMULESIGDAT : Path of the aMule signature file. This must correspond + with the path specified in the Tweaks settings tab in + aMule. You must be sure that the user that PHP scripts + run as (apache in many default installations) has + sufficient privileges to read this file. If the file is + outside the webserver's DocumentRoot, the safe_mode + option in your php.ini MUST be set to Off. Default is + /tmp/amulesig.dat +IMAGEPATH : Path (absolute or relative) where all the images AMPS + uses are looked for. Default is ./images +IMAGETYPE : Type of image to output for error images and the + signature image. Valid types are jpg, gif, and png. Note + that your installation of GD must support the image type + specified here. Default is png + + +Icon settings +NOTE: All icons are assumed to be PNG. This will probably not change. +------------- + +CLEANSIGIMG : Image used as the base image for the signature. Default + is baseimg.png +RUNNINGIMG : Icon placed beside the process status information in the + signature. Default is running.png +RX0TX0IMG : Transmission status icon used when both RX and TX + traffic are zero. Default is rx0tx0.png +RX0TX1IMG : Transmission status icon used when RX traffic is zero + and TX traffic is nonzero. Default is rx0tx1.png +RX1TX0IMG : Transmission status icon used when RX traffic is nonzero + and TX traffic is zero. Default is rx1tx0.png +RX1TX1IMG : Transmission status icon used when both RX and TX + traffic are nonzero. Default is rx1tx1.png +HIGHIDIMG : Connection status image used when user is connected with + high ID. Default is conn_highid.png +LOWIDIMG : Connection status image used when user is connected with + low ID. Default is conn_lowid.png +NOCONNIMG : Connection status image used when user is not connected + to a server. Default is noconn.png +TIMEGENIMG : Icon placed next to timestamp. Default is clock.png +SERVERIMG : Icon placed next to the server info. Default is + serverbox.png +SHAREDFILESIMG : Icon placed next to the number of shared files. Default + is files.png +QUEUEIMG : Icon placed to the queue status information. + +Font information: +NOTE: AMPS uses TrueType fonts. This may be changed to support PS type 1 or +other font types if there is sufficient demand for it. +----------------- + +ERRFONTPADDING : Number of pixels to pad around the text in error message + images (hopefully you'll never see these images). + Default is 5 +FONTSIZE : Font size (in points) to use on the signature image. You + will need to adjust this if you use a font other than + the default one provided with AMPS. Default is 10 +FONTFILE : Path and filename of the font to use for the error and + signature image. Right now this must be a valid TrueType + font that can be read by the user that the PHP script is + run as. Make sure this is a *good* font that supports + most of the European special characters used in the + various translations. If you modify this from the + default, make sure to adjust FONTSIZE accordingly. + Default is ./LucidaSansRegular.ttf +IMAGETEXTCOLOR : Hex triplet that defines what color text to use in the + signature image. Default is ffffff (white) diff --git a/src/utils/amps/TODO b/src/utils/amps/TODO new file mode 100644 index 00000000..817dccdf --- /dev/null +++ b/src/utils/amps/TODO @@ -0,0 +1,11 @@ +AMPS Todo + +- FEATURE [DONE]: Change image output to PNG or add an option to select type + (version 0.6) +- FIXME [DONE]: Fix the incorrect display of special characters in the signature + image. (version 0.4) +- FEATURE/FIXME: Improve multilingual support by allowing formatable strings + via printf() +- FEATURE: Improve 'theme' support beyond the simple CSS file. +- FIXME [DONE]: Change passing of sig_image variable so using register_globals + is not necessary. (version 0.7) diff --git a/src/utils/amps/images/baseimage.png b/src/utils/amps/images/baseimage.png new file mode 100644 index 0000000000000000000000000000000000000000..03ab797c4f0908739e2b2d9432d0cc5d1d6de8d8 GIT binary patch literal 83838 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

h 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 FV1mmyv%vrW literal 0 HcwPel00001 diff --git a/src/utils/amps/images/clock.png b/src/utils/amps/images/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..450254dc14410ae03548d47217e2f8ef0273ec47 GIT binary patch literal 994 zcwVJaziZQR5PgYgw6@w-Tnb_-6MCd}|xjSlecB^9LNYCN)^-M&CRY(QF!iy}*tW3%X zQr=6V#7d+D=jfvfQLus(2+E@ zFA@up5L~^J@?HT8NPsXS%<^fs!}TM)2}us-q@5+gs#xsU4((V7=c4Sn2QedzbbY?o zGa@FquP)bFc#%O2gw1gkiQX_8;d*!{F&cItjt~kZkb*SgCc#4jIG_Oc*s0u>+w27n&#{f~0H-EOs7&1SP+uh(j|YPDLaRI)64@@#R{M{~0ilT8=LPF?~w_r{ZZ-U?BLYpN0r;T zEi3(<`L_?}y6x+`!KKRZuGiO>8jbqQ)3uqdo`u}GD=$00|C~Qwn;w3%ePP?3<<{fn ziTZ`JAE#ek#l8I8hQlYS{X19N_lrw=8-E7(JZKIbSUdmuM{aRt->rfDFK+lUlt#+g J^Fybu{RK=cu2%p6 literal 0 HcwPel00001 diff --git a/src/utils/amps/images/conn_highid_kad_fw.png b/src/utils/amps/images/conn_highid_kad_fw.png new file mode 100644 index 0000000000000000000000000000000000000000..fe1129a776a7f1b4b22a2d8472a99f44132681fa GIT binary patch literal 845 zcwXxa@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl@{{DHy+jH4$lLb7jA+U0~#x8S(>bwsxoj0xKk9za}?e~+0b1j&n z*Z=-`hH2Y>k=FD1&qG3k*i|PPu*c0140ckwAji=d#54KDls+B?Ezi^c_XvABOE;P^ zq)cGwy`P)O$#Lqr^2+-ReY=>__b^1A={k1P;+v)65{rN%@@(;onNv24)Sc7VsKGG* zhRCJ$LLvHU)8;ZPx#WFzz0CP`k(OPb-{uRYy6e}tH{Y-0tKOdRwAyvG4#UEG5!VtK zZh!jz{g%zG)&=K^YA^0*P_Xhlci(1TwOF#g(QHo!-RKW5U7i2fGr83>Na+6m|Nq(> zo@8LeRFnky1^*uyz)%w|(F1hDb59q?kcwL>7mg+!HV|;VXn2Hg`57NgV`JkbXU^P- znzj7?`X~49&bcccq&B~#k86R*%gYP@?(BcRX_bO0BlE;t?O$HFnt#q!VDWIhCFMWw z(Rtq**(LuL{`zF|aZ}~drKYTGbEa;8{KH{UZF4K1q}G}Yzw7mD_uu>2p)v2cdZEOz z^d0MizN~M&5j`bnQR*~7H^%2YYx?fGFE%VQl3MabrHpNJdi(94`@C&5pY|WA_CFbS zIBee94*#dTHa2oo-(Qn0iInP^Cdh2nURT|I)AaEM6JGn7Idfla&=Fn7Iwkw|w#SCVJ z43;?z%FbG+wHV|KpGrwFcu(QI@R{NAABLd$C&k1VrW|Dm+xjsfA(@+dj)1_&hzMa% zXNK@)OzC?Vv^>?O%}wRzR$h7EaEXOLgy{-lVU3L%Ea6jZ_Ekr{`TyzvU52VoquHKJ z(d$qD-(&I3QlTb+A?l1s%PwY@a*oEJDqddB*na&Q_bGR#{JD3Jp=-72v?3z0dXaJd?5G96j_ZsqRX%W_}61A;emYQJv!Q~vqxT*Z|}C(lmcTcYya*sH<-7->F;pOg?Hnv>7DHRtqd(LTP+`q^9eZN_ed(!LeA}MQZeOk2+ z>AUXvKld-IeQ$W_v9P*x*Uc+U1tkt^Y!q+%{X<2d)~ET#I#H*DO*0?5@?F>5acgg% zOH~H9GeaA8&iJcE`Up(d7$Mm>m~n zudCYGrfbS)DQ@uitG literal 0 HcwPel00001 diff --git a/src/utils/amps/images/conn_highid_kad_on.png b/src/utils/amps/images/conn_highid_kad_on.png new file mode 100644 index 0000000000000000000000000000000000000000..6f85e52fb64ca68b36dd04be5644dea822bc4bfa GIT binary patch literal 799 zcwPY?1K|9LP)1ySobk`heJ#|d1D@46_nz;&-@WI%60^nH zqdG#4T{D@W{i1~PfR5S$-cAWXifJmV))^m1Szdxtyp^gAZl3v{@bUd#!f#&?>3&VJ zqYqP9;CJJS4e1v`BNdTgw0j8J&V z3h7Q=o&vAmFiQLBlhpZ(!D1&VBZ$S^fcC-xz^3Nse0*S~-1P^5l-&XVL&2WPTyj6$ z#n+JqMT;0p(z)|!AJz(sI3wa5+y%QUw!^q<*A`}GA)9EQp zf&aQxgXH|$F}@rhW8>xvO9q(}ECIwxJ!EKN^gD$<=3_waT~WR>eEGiRm1 dxD*4NivQ}<3=Hh%us literal 0 HcwPel00001 diff --git a/src/utils/amps/images/conn_lowid_kad_fw.png b/src/utils/amps/images/conn_lowid_kad_fw.png new file mode 100644 index 0000000000000000000000000000000000000000..6617fe1f6626014a9e23dbddf7516f4f5adfaacd GIT binary patch literal 844 zcwXxa@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlcaF=08*V zo~~mz8B!)N^xkJsuu_{g*LAhd_wTo!+!p>g-GC*0%Ewnh3e|ZWjX{nYyr19Z+uUlM za%T!d*XrC%PLY;fwu`-NOR_%wzq{aEQS<#evrQ%pS$i~gnTxcZmpR{VIM>4O+wo_|$XFoYh&hWR%bZhy*nTFu*YdG2&x z{Tg?^WA_zm5;$Y~8DqBaRc~kL+ZAywks;~~>w*79vpqMh=Kt{0x%T3IftAzQ<7T}5 zev)CyC5DCfru6aX)hFBRtNu6N=xl?g$fflnb?1~<-shS8f+>3a>qo*&+y1k~FJ?~J z92&%~bU}`xsx$w2h{{Gi!zC6>ejTRMikMx>8FZtsw`qTP>B{6*&mf`u|Ns9O(_^OwdL-= z|HkhA?)zQF)?-Oc%%vHpnuC@s_B{W+eY*G8xM!mKIAV2{&2#IY5pJXDsCDIPZL!$R zchA%GKkG-e`xPHu%Qx?={jWnh`H>w{o|L_h$P!p~s5&~UG-chg>BpaZvefEi{_yb_ z`_`iUvPTxZ^WyL^HDWrE>~0Yl!jq>qnbYiWRE%|Cr3M&wl&#_Jt%T1;#%-?@etsyzO@m7R$5RTlXhhLMwt>zopr0L=cW6951J literal 0 HcwPel00001 diff --git a/src/utils/amps/images/conn_lowid_kad_off.png b/src/utils/amps/images/conn_lowid_kad_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3d0dce0bcaca605130c3aa83219ef1830f6a1d58 GIT binary patch literal 880 zcwXxa@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl#aCOk z7%X!b%nBKlollC1?JZM1UZc(+XBcZG6lf&CFy$yi*j9$ie;B-{@Lu@L5H$a(l+?$B zgk)}Rk=FAJ^KV34OHAeFX6U^?M?iofWkUY*klKs;8Dq96ue{HC;Q#mUw~S_c>esmQ z9lNhklb|+jF4wBL-xe>{t54S0sKL;+T43dL@3ZSorxkI=_W#(tdBM3NvrQ&dyu3V< zUoa?GeXg$$I3n+N?*50sz>KHWeAU|-mRy>0X9`33GT*&UHn&s zl)mSUw6x6mcEhVsl`S$xsk(OP5?%iYZ z>rlENXSl@Tt&&pLv76PryzFr^rUQLZ)ybT)S)}e9Q}p_~l9C^%8~mGZVzxZQB#4b@$+r?fg8}(Sir`VQcxvth>FivH-{mEuu^$KC( z=KFOFy3yC$w3*!M86IIRqRPdGKfXVzd+*$tcmJDu7Ja<)BzDi9 zp6RdW>kBMeKY3Y3>HpfJ^4rrd^}kU3=I~LEf5~6{c7rgi8VX%|7{+{JmUgGZKsnT%m z=c%Q|+wK4USV`}!SZ40aY|8N^H{95I^`NN$&P<~?YboFyt=akR{ E0Dv66yZ`_I literal 0 HcwPel00001 diff --git a/src/utils/amps/images/conn_lowid_kad_on.png b/src/utils/amps/images/conn_lowid_kad_on.png new file mode 100644 index 0000000000000000000000000000000000000000..4272cdd4f38d0f08a08eb80deb8248f4a03fc4cc GIT binary patch literal 814 zcwXxa@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl#SF^M zS6j6hEOQvl3bjsa?JZM{wG!gJ@R`AT3WJ;>L(u%=HR=pgjxvO84Kxy9xcrCpz<=+v z>lw24F!bJM37;a;dOpZl;M4!R0xPE*&GuxB*`iRBpxSDqP@Tt6)yZ+{xzYtWk-BpX zQD;;(>M?Y!wk^pLOV(d-uBiEbo#7G-!}Y@ z<{Hkmu({RB(6>wE(t5K^CK|iUnO(|l7kjy`))8shrLj?C%AF|;3-75-n=9<;ti1C6 zzxhT?>3eu4zhLs~2sk4D_WMcGX+?hL?#rBS=d0e%oU)nk*nNg2mzbj0cOARQ8Qag% z7!>v9zoP~(gKqToHf`rW_DpW|3=+Ek|NozO$UYqy2Zbd;e!>6g3>Y+h4x|Dtf8y!l z7*cUdX2Q`j7DFBu(;a6L)6&vz@fsT!=dAwwfBB7I^Q*7zws=H48C66%WE(AamoA?? zTe~#r9aq?qQ^7wwU#UGSTa!8SlD;m=&f)n+GNRZWnZHVwQXo5dDAF*=09R zOKg;RqOwo!xZdvSX-@Y;miVX{RNVMoP;>iH#-l|(N{y2@H$S|#z503wTc^o~Etl{7 zJGoD`eZSHnr-#*FPL!5z5xcPOu?2VDm(F@dHU=hdPZozGOkP0$GI+ZBxvXEp-gxmXWL)Ql)`Y+2Dw=$xBm7cD6UUl)AEz z&g3TLMy=)v_78a;I`jxnwp%#1g%AQ^{|Q1M0B6`?{_+BD6cpo8uFlPo&g8y1o3a}6 z;BffM_+u|nFRik-Q=}~S?M@DTg@18Ay>Y5E8T{J32I*vAE+=stXbK0Jm8-K+7(V){3?*PJqRfvPDeirj@{ z`QPSs-A#J^K~$fP>eERiBgsm+oNhZV6t{w^sg0(p;;}`vf3BcZ{K161EUkF ztRN6bK)v2zvs9Y-+uFrxw~zXL8aG$72uC0glnPrEOXYVy eOIe@x-r#RRr$zsEC}>6i0000+Zt_8i8Cg6$p+W2{;Ztr&N-9+6G0eZg7_)^b zdOd@2>eq=AKlu2F)SZ(#-_CdJK10-*u46Yj8iN@6cC8Q=&duax^6Owwu+pnfX4>}u zyJ>@bHLS zT7OVflqr4B?;AH*5B#4yoj2;ue}o9b!wk^r}^#86%%P##I_kbhv zwHNm3=ifh%!Z5+PEYLNt zJzX3_DsHJiyilr{diXLVh2%%y+l`wtMFF)+q{4BO~WlbUm^8Jb~j+`{rB1_Z==vy)R3%Iyhs$ zR`;2oY40L$O;~X1{L_rs|7Tz8&Ode2af{&Y3D=K{@7%PV^~k?@-!tv&q$Kr(Vq!(P z9zFb|D#pEe;)cWJ8Wk;V{o5bU`o(iu$#1HUoLTbg@{;7lRWad5Tn`r>+4yD0+-(&X zR^3dr;ZA(;D|`8tCf#(IZ*B=ydtbK3&RTY7Ys03JSp5rk{QqzoFf5-I@b*<={CuFd O89ZJ6T-G@yGywp~pUuGl literal 0 HcwPel00001 diff --git a/src/utils/amps/images/noconn_kad_off.png b/src/utils/amps/images/noconn_kad_off.png new file mode 100644 index 0000000000000000000000000000000000000000..5f8874f01a4fcb5c14a15a9d2da76126b543ef6a GIT binary patch literal 888 zcwXxa@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlh0kt_@OuvrhM@WX|Nm#0a+Kln9|rF!9}^PZDk(9@ z8CLW1GK6iNBOs8>&Hd-zJ*I8{KSo5@+-hZuU%X3Hlp$q;z{=^~XV-5M5fQnx{`>b^ zEa6jXFYZ4gCiZ>p+OHEQGH7{x6M~e(>>;Ip1zL*CK|*HK#W4Sd%0@lEbN6pa zN`9`dXLc!1<>uy@{DMI@n#rx6K|&W8qye*+&I86-V@Z%-@c#h@43kbg_6IuVou`Xq zNX0Fg374CW1coXVU+^FAk?Ebg)bx*pQ8#lgqc3b=Tk#b?i2_aMd zznkCpZcgD2cgJ4ZoW45n|I=c zLkfb*#kr0~cv&e4hLmj4)rpPWzDGi>@a6Sjt%hrV`>#&DtQRS8J~VQ}h1+-TUN*S3 z&MHZ*S;D|*M}_^lWzy~Y6eV7M`E{g!71w$(fn_?Ux32nrWIqEl!+lHd;=C2R%z!>; N@O1TaS?83{1OOg?!!`f_ literal 0 HcwPel00001 diff --git a/src/utils/amps/images/noconn_kad_on.png b/src/utils/amps/images/noconn_kad_on.png new file mode 100644 index 0000000000000000000000000000000000000000..26529f8759d2994e0c0f0c806db87c2a71d0fd18 GIT binary patch literal 863 zcwXxa@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl_Gmt_leW(bg^2S z%Ob8N&Jhq0X+598&26~SvFq4P_P7}gDHB-2r!Z7?>eVOz|NnoJh=@W>g3YZ~)m9s& z3vyhm=6>+;5%zRen>Lpr>WoOsE{?_^W|wl`y-vSx+z8|3v@OZ{zIH8>Ux&snbCFBy z8J1l7I&osuoBy>J_j{jRpZ`3hnwR&8n3(Ho9j55@3=8k6Y}8}O+7oa@{;iTy4iAsU zMvWE1!hFZ>GxXkPjM*~f&J=~}ypv*LrqhZzPCfth|1QJ)8w_2md3!E5->+lZ_FsAB zeX~s_Z@-_^uW^?--=6WbnmJ`NQ~DmibN6i*d)e%(7E9LWnfxM)hlel7l{2>AXtt-} z5(@?eD~7&Z2Sr5%R!(P&Uu-znV!^p01}#sKx^oQ1so%ffx+N(o->A=U`xAq1wDTW( zCbxP930+`ld|~0A35=wgk|4j}{{sgY7_)8}0^RY_)5S5Q;+D*WqtlKU2ryfpR5`rk z%$YNLHUo(>IotnymfoGWYI(Pd*W*e3OIfBU*++e;vaQ(}td}=?f$M@#Dm%?T9jZ}D zG4x>FW&T^;`R8Sw)+s^VQy(|pxF4*2x?@VI!s<0;+9o2WZ>F#0&iu9NhM(TN{F?W_ zls#&6@)Z%1=XHn&YW-1qGKG@I+n z>;6^BMIWfXf91^4o0}GQ}OzR$T{xUqo@0F4$#vKp00i_>zopr0JCYXJOBUy literal 0 HcwPel00001 diff --git a/src/utils/amps/images/queue.png b/src/utils/amps/images/queue.png new file mode 100644 index 0000000000000000000000000000000000000000..b26dfeee3585014073072435ceb2a3907eef54fd GIT binary patch literal 727 zcwPb50x127P)mE1Pa=Q8zu}L-wF~1)T_~8a zFf>G>#PCg9EYk03JJZhhTo)wJBAn&D@B7^Io_nvvEtOuLT^F{$;2R#o5dh!vpAHwV z>!e%Exks6~Rm>Lh{{b%RL6oiL0hZIHWog`3JZ8rO?2B>Os`W|x0J`o2kkhNIRW=w? z6f{Ribz0Yt$R*|`0ap3|osIy&{JqDTcTVh1fFW5>wPlVfKEYpQ02-+g6juw{vADu?G>E3U1Y0ilK_ zfKT0Nps6ka+e7lj6`*8P$kw*0X)5NvP9mLRIrEZ+*+?q-?DnSKH2x?QSf9U%mE$3h4}+tyL-7N%$2##k(7 z3sMk3b30&^`*!!5M;M-g>eSI(4dM8>MFa7!(5DN!H5)JP_AQppGKbm;5&_golhg0V z6xUCBC6|9eO1_vDzUAZVEWdP)GRek#dSYMK`l88p2zAeO5ik!3Lw^sQiBvxii+L`!!sgQreXOpK!EbL3M~ zjKBLz>~jvF07QlpTJl#1k`Oey8fb58W_y1Jiqpm9!~2ZBddJ7F1vI?^aD6zTovS;7 zy+LNH8pK>G^XYAj>4Hu=tC7kSS*|u-ZwGQzby&c0n<5ih?LiWPcyf-4XAMV=9-=wu z!_*f~tDfqmZm;BxTe447T78 z1W=-?!;)pe3L7jHXDNOdMJNhYL&ume0x**+(HK}o*Oork?_5hJa{w?gbmR9G3|(j9 z)f+lGLO5LxDrJquLY}f=U|ANDJAk*P4gcCsRP_gAnpH$pbyyC&%u2V7>Aa3{ph>!*==PXzECMneIc;QMFu00000 LNkvXXu0mjf{7F|T literal 0 HcwPel00001 diff --git a/src/utils/amps/images/rx0tx0.png b/src/utils/amps/images/rx0tx0.png new file mode 100644 index 0000000000000000000000000000000000000000..1ff47b5b39350256c6aa31c4cdeeb08d73e69b77 GIT binary patch literal 707 zcwPa+0zCbRP)7SRkie8_{A^}Eoqv}pG#7ksFFf!1Jg8ZUgZO#4`{#K{SBKt#QczbETz0 z>D6L8AXnV!#{-yvabOZqfKi~gJ|7@wynQ&ZtbqGsxl3o%`6_OAQ4MSY-X#jefh1r7 z_z3u`i&%^;mW^}|^+*7R8cUljsTObLy-u_i}R8no5+5NzW8Q2ND2i~~L zP{K;H!P{In@ zuJ+DlcL3OTuuwjCrp4|#>}Gy0f>xCf>H_`#zQADr>zt)r?P@BRtVTw^e8SMHN5lnz zpv-J+8jWp5FQikK8pO}=G*e2Dw5`b~^Yf^RidkbN-IhUeN-}eiUyKBX3C>PpG1*8} z)6xAlKrEp`&GlnV2D8Ci()x&OUPPcG~s6bfNXGH~Gj7kf~Fadl^ zNIL;^*X{tw`P%V0u-g3qC^%mr-v#k9VdXXuO&}cZy(_G|Celu(_^yFy1yKhg+mpNT pXZnlk(?`9o6BT0rkz(&!oIkSF*yFj8IXm5~tv_zy%sL>cXf|m+V;j54dSu zxYC8hd10zXh!K!D+m`z3K!~x3wSCa`)&AU|iAarSbrgFT8MLZ|Q1kTl_r?eM9v2VsmrPb8k#}z}Jk%o!g7}EccrJm)_SY<= z{iiy_SSrD&GJ<2S9c5wyRZ%f(td!d-u$S0LXTI|`{+f~TPgqPgO4V|7lLp9v1hD=5 zj!uKw5M0-Fg(~1H5C?9Ys3Vz7Vw_`O?Zqf=zzWE~i|wssQkjFlcWOD);@6w>q21kg zSO?4ko&X;KBcKDaKm-_S_fg0eHaxxAfB%o87Ib*sfPDIL6yMa7#DEWgGF9K(xe&nf zz9$@?DL(*K9$zV60PzUKZ4licIze~?^>R^Yx*YpTLgzqqfoKO&)m9VwZ}^wC9@-Z4 i@7*X?Z)pq`^ZW$kr|&=2RUNGW000085jjOp9_NeOW<;76z6d)lje~q%P`0p`xpZh%SPln{J}3 zt^@O;J1>gJ5Q<5lMl;b>bAIHRZKlOc=REVcGxzVtLQ|sW?uFm`yf4pV;2%2DT-jE< zv*=mTjso}e==bOUVmGMf$_eis5cfb_0#WYS}t1UF$KHXxmS=zSjDyF!kklCM6CMO~U10%#@G2|=@jv@!!%eIm)yIAlq zG3B2|i)*caeyY1!S7WxCz5A>8a`;#!DOsoQ!#lo)!&uBRR%0f5B1PomH0sbI>E(3o zz)N4Z;kSX(r-U-LOYI~6ksD@*30Hv&XNi-PWrcWLWhs^F|nN`o)_gBwB| zeL5BbBwMy!nb+ps6-O({%g7@<|BW9*QKJ2Gp~F9ld%DX zS!KRE()p$KZ_cpUGQiSjt-Y*hmwO=)KOknrli^qXvzu|h0H>7<;Ma1+zW@LL07*qo IM6N<$f=C!^x&QzG literal 0 HcwPel00001 diff --git a/src/utils/amps/images/rx1tx1.png b/src/utils/amps/images/rx1tx1.png new file mode 100644 index 0000000000000000000000000000000000000000..31dde0fdd9e4fa95a7c3c2fb8ca5cd1dc4fefbee GIT binary patch literal 808 zcwPZ01K0eCP)6hiGN1u zz1kD5v)Ep*?`Y-pkyGHRF&Y~s9-pMD8aOQt_?;^;N&@AS-scJUpJe28LICJK*LmLI zcJ#OH+K6|Rmwd56^j(bj`$@Edj@#+Q>-A!HIA~kDf%wQ2(XlA1qFxYsPaZM^n?TK> zqg3*k&1Te}WvrUW(E}$~?F%sca+sl!AuRPK^tlQ~8SIh+RZ%fNy8S?yZ{qf@cKPzf zE5Sntdnpz)%({S~S9vx(lo)yTVrdiq$W|{A`}hIzsTHGUkeHU4sbnxY7t}&H(|6X$ zDjCx1G@cbM)M61`)v=rEX>$5-HMl5fvrHt$nVw1EusLz-O;}1IR6qbYeB;P@(JuC{ zXlZ%;kfdcszlb#QZM z8#}r>s7gA|M_=$cnMAZo*vxh4#VV<{Y1FX-wQ_CmtNX)`|K5T8Tuv-oBMd|%(LSro zg0InsJK&}&&Y>tOrF?~Col+x8eyvu-7}}oR$l=@9Ds^%tJEw zh3{h-G9xpIPmiMiY+<3TzvVgIFu1#WcUY3@h`*A_%DKm>2UC0Jb4z|>>Ag14;%^Pk mjw{=Yug1*}4j!`xLj=?4c6=lh4>`JMCCkyU5TUrqt6 zBohG0v8aX(4?fpr^K}4?PFE^(U@b5MkVq&RDXt_@6AEG|kYi?Obh=W<>T8KaqeMcX z4c;bgXWXVoHEqX~XF!r<=D*Kqm;vCbvzf84KKx4orf23@42D4xHBtg2Nku}EWMX1u z(-rjUTB~Ix0#=Ke>b(wXs`p_P1QbP~&{l%gY$hs3NGJ-~r3a9f<2e9;tf*8~ly8Y` zG60zSwU7f!l0faRr6j|O{4d^rPeX+HLdH)jK zPx`3cU&VOdCq^&5W@g6}@wm+R+f^pt8}W@=Snygk14E{R+wFJhfBKkn%}q>rXNeVy z96ave_gIh@eLpzd+J{{Le+Whf2e75oR8aKj3>l}J*V_pE3DectK~GON`VU6J58=+O zVNL9IrMY#X24+XV1}SZbH`>~;7Ff7)&Bg4`1&(+Hdf(XqunTF2%ACgdZwNP5uz_({>qLW}*9Kbl=if%lA>8-gpq4we wwlm_O=+WiGGutdvQy&8))%Ab{MUM{P9~TYwapm2h7ytkO07*qoM6N<$g5AM3_W%F@ literal 0 HcwPel00001 diff --git a/src/utils/amps/index.php b/src/utils/amps/index.php new file mode 100644 index 00000000..1fa2d09b --- /dev/null +++ b/src/utils/amps/index.php @@ -0,0 +1,781 @@ +false, "psuptime"=>"", "connected"=>"0", + "servername"=>"", "serverip"=>"0.0.0.0", "highlowid"=>"", "rxspeed"=> + "0.0", "txspeed"=>"0.0", "queuedclients"=>"0", "sharedfiles"=>"0", + "nick"=>"", "rxtotal"=>"0.0", "txtotal"=>"0.0", "muleversion"=>"0.0.0" + ); + +// make sure gd and freetype are loaded; we need them for the signature image +if (!extension_loaded("gd")) +{ + echo "gd extension missing"; + exit(); +} + +if (!in_array("imagettftext", get_extension_funcs("gd"))) +{ + echo "FreeType extensions missing from gd"; + exit(); +} + +// lang can come from two places; as an argument to the script (i.e. +// index.php?lang=xx or as an HTTP POST variable. The latter takes prescedence +// over the former. + +if (isset($_GET["lang"])) + $lang = $_GET["lang"]; + +if (isset($_POST["lang"])) + $lang = $_POST["lang"]; + +if (isset($lang)) +{ + $temp = @fopen("./langs/".$lang.".inc", "r"); + if (!$temp) + { + $lang = strtolower($lang); + $temp = @fopen("./langs/".$lang.".inc", "r"); + } + + if (!$temp) + { + require("./langs/en.inc"); + } + else + { + require("./langs/".$lang.".inc"); + fclose($temp); + } +} +else +{ + $lang = "en"; + require("./langs/en.inc"); +} + +// if the variable $sig_image is set, only output the signature image + +if (isset($_GET["sig_image"])) +{ + $ret = get_stats(); + if (!$ret) + output_error_img($text["sigfileerr"]." (".AMULESIGDAT. + ")"); + else + output_sig_image(); + + exit(); +} + +/** + * Retrieves the statistics, of course! First checks to see if the process is + * actually running. If not, the function returns true without attempting to + * read the aMule signature file. If the process IS running, the function reads + * the appropriate data from the aMule signiture file, stores them in the + * associative array $values and returns true on success, and false if there + * is a failure reading the signature file. + */ + +function get_stats() +{ + global $values, $text; + + // the ps command should output something like 1-05:23:45, in + // days-hours:minutes:seconds format. + + // alternative ps command; doesn't work on *BSD! + // $values["psuptime"] = trim(exec("ps --no-header -C amule -o etime")); + + $values["psuptime"] = trim(exec("ps ax -o etime,comm --no-header | ". + "awk '/amule$/ {print $1}' | head -n 1")); + + if (!$values["psuptime"]) + { + $values["running"] = false; + return true; + } + else + { + $values["running"] = true; + + // Uncomment to test etime parser... + // $values["psuptime"] = "3442-12:34:55"; + if (strlen($values["psuptime"]) >= 5) + $uptimestr = substr($values["psuptime"], -5, 2). + $text["minabbr"]." ".substr($values["psuptime"], + -2).$text["secabbr"]; + if (strlen($values["psuptime"]) >= 8) + $uptimestr = substr($values["psuptime"], -8, 2). + $text["hourabbr"]." ".$uptimestr; + if (strlen($values["psuptime"]) >= 10) + $uptimestr = substr($values["psuptime"], 0, strlen( + $values["psuptime"]) - 9).$text["dayabbr"]." ". + $uptimestr; + + $values["psuptime"] = $uptimestr; + + $sigfile = @fopen(AMULESIGDAT, "r"); + + if (!$sigfile) + return false; + else + { + $values["connected"] = trim(fgets($sigfile)); + $values["servername"] = trim(fgets($sigfile)); + $values["serverip"] = trim(fgets($sigfile)); + $values["serverport"] = trim(fgets($sigfile)); + $values["highlowid"] = trim(fgets($sigfile)); + $values["kad"] = trim(fgets($sigfile)); + $values["rxspeed"] = trim(fgets($sigfile)); + $values["txspeed"] = trim(fgets($sigfile)); + $values["queuedclients"] = trim(fgets($sigfile)); + $values["sharedfiles"] = trim(fgets($sigfile)); + $values["nick"] = trim(fgets($sigfile)); + $values["rxtotal"] = trim(fgets($sigfile)); + $values["txtotal"] = trim(fgets($sigfile)); + $values["muleversion"] = trim(fgets($sigfile)); + fclose($sigfile); + + return true; + } + } +} + +/** + * This function creates the signiture image and writes out in JPEG format (may + * change this to PNG or add an option for image time in the future). The + * function assumes get_stats() has already been called and will use whatever + * values are in the $values array. + */ + +function output_sig_image() +{ + global $values, $text; + + // open the base image for writing on. If unsuccessful, exit with an + // error image. + + $finalimg = @imagecreatefrompng(IMAGEPATH."/".CLEANSIGIMG); + + if (!$finalimg) + { + output_error_img($text["baseimgerr"]); + exit(); + } + + // open up all the icons + + $runningimg = @imagecreatefrompng(IMAGEPATH."/".RUNNINGIMG); + $sharedfilesimg = @imagecreatefrompng(IMAGEPATH."/".SHAREDFILESIMG); + $serverimg = @imagecreatefrompng(IMAGEPATH."/".SERVERIMG); + $queueimg = @imagecreatefrompng(IMAGEPATH."/".QUEUEIMG); + $timegenimg = @imagecreatefrompng(IMAGEPATH."/".TIMEGENIMG); + + if($values["kad"] == "2") { + if ($values["highlowid"] == "H" && $values["connected"] == "1") + $idimg = @imagecreatefrompng(IMAGEPATH."/".HIGHIDIMGKADON); + else if ($values["highlowid"] == "L" && $values["connected"] == "1") + $idimg = @imagecreatefrompng(IMAGEPATH."/".LOWIDIMGKADON); + else + $idimg = @imagecreatefrompng(IMAGEPATH."/".NOCONNIMGKADON); + } else if ($values["kad"] == "1") { + if ($values["highlowid"] == "H" && $values["connected"] == "1") + $idimg = @imagecreatefrompng(IMAGEPATH."/".HIGHIDIMGKADFW); + else if ($values["highlowid"] == "L" && $values["connected"] == "1") + $idimg = @imagecreatefrompng(IMAGEPATH."/".LOWIDIMGKADFW); + else + $idimg = @imagecreatefrompng(IMAGEPATH."/".NOCONNIMGKADFW); + } else { + if ($values["highlowid"] == "H" && $values["connected"] == "1") + $idimg = @imagecreatefrompng(IMAGEPATH."/".HIGHIDIMGKADOFF); + else if ($values["highlowid"] == "L" && $values["connected"] == "1") + $idimg = @imagecreatefrompng(IMAGEPATH."/".LOWIDIMGKADOFF); + else + $idimg = @imagecreatefrompng(IMAGEPATH."/".NOCONNIMGKADOFF); + } + + if (($values["rxspeed"] == "0.0" && $values["txspeed"] == "0.0") || + !$values["running"]) + $speedimg = @imagecreatefrompng(IMAGEPATH."/".RX0TX0IMG); + else if ($values["rxspeed"] == "0.0" && $values["txspeed"] != "0.0") + $speedimg = @imagecreatefrompng(IMAGEPATH."/".RX0TX1IMG); + else if ($values["rxspeed"] != "0.0" && $values["txspeed"] == "0.0") + $speedimg = @imagecreatefrompng(IMAGEPATH."/".RX1TX0IMG); + else if ($values["rxspeed"] != "0.0" && $values["txspeed"] != "0.0") + $speedimg = @imagecreatefrompng(IMAGEPATH."/".RX1TX1IMG); + + // check to make sure all the icons were successfully opened. If not, + // output an image containing the appropriate error message and exit + // the script here. + + if (! ($runningimg && $sharedfilesimg && $serverimg && $queueimg && + $timegenimg && $idimg && $speedimg)) + { + output_error_img($text["iconerr"]); + exit(); + } + + // place the icons onto the base image + + imagecopy($finalimg, $runningimg, 5, 5, 0, 0, imagesx($runningimg) - 1, + imagesy($runningimg) - 1); + imagecopy($finalimg, $sharedfilesimg, 249, 71, 0, 0, + imagesy($sharedfilesimg) - 1, imagesy($sharedfilesimg) - 1); + imagecopy($finalimg, $idimg, 5, 27, 0, 0, imagesx($idimg) - 1, + imagesy($idimg) - 1); + imagecopy($finalimg, $serverimg, 5, 49, 0, 0, imagesx($serverimg) - 1, + imagesy($serverimg) - 1); + imagecopy($finalimg, $speedimg, 5, 71, 0, 0, imagesx($speedimg) - 1, + imagesy($speedimg) - 1); + imagecopy($finalimg, $queueimg, 249, 93, 0, 0, imagesx($queueimg) - 1, + imagesy($queueimg) - 1); + imagecopy($finalimg, $timegenimg, 5, 93, 0, 0, imagesx($timegenimg) - + 1, imagesy($timegenimg) - 1); + + // allocate white for the text color + + sscanf(IMAGETEXTCOLOR, "%2x%2x%2x", $red, $green, $blue); + $fgcolor = imagecolorallocate($finalimg, $red, $green, $blue); + + // aMule version and process status + + if ($values["running"]) + imagettftext($finalimg, FONTSIZE, 0, 26, 19, $fgcolor, + FONTFILE, "aMule ".$values["muleversion"]. + " ".$text["runtimemsg"]." ".$values["psuptime"]); + else + imagettftext($finalimg, FONTSIZE, 0, 26, 19, $fgcolor, + FONTFILE, "aMule ".$text["norunmsg"]); + + // connection status and nickname + + if($values["kad"] == "2") + { + if ($values["running"] && $values["connected"] == "2") + imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, + "aMule ".$text["connmsg"]." ".$text["kadonmsg"]); + else if ($values["running"] && $values["connected"] != "0" && + $values["highlowid"] == "H") + imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, + $values["nick"]." ".$text["highidmsg"]." ".$text["kadonmsg"]); + else if ($values["running"] && $values["connected"] != "0" && + $values["highlowid"] != "H") + imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, + $values["nick"]." ".$text["lowidmsg"]." ".$text["kadonmsg"]); + else if ($values["running"] && $values["connected"] == "0") + imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, + $values["nick"]." ".$text["offrunmsg"]." ". + $text["amulenorun"]." ".$text["kadonmsg"]); + else + imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, + $text["offline"]." ".$text["amulenorun"]); + } else if($values["kad"] == "1") + { + if ($values["running"] && $values["connected"] == "2") + imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, + "aMule ".$text["connmsg"]." ".$text["kadfwmsg"]); + else if ($values["running"] && $values["connected"] != "0" && + $values["highlowid"] == "H") + imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, + $values["nick"]." ".$text["highidmsg"]." ".$text["kadfwmsg"]); + else if ($values["running"] && $values["connected"] != "0" && + $values["highlowid"] != "H") + imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, + $values["nick"]." ".$text["lowidmsg"]." ".$text["kadfwmsg"]); + else if ($values["running"] && $values["connected"] == "0") + imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, + $values["nick"]." ".$text["offrunmsg"]." ". + $text["amulenorun"]." ".$text["kadfwmsg"]); + else + imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, + $text["offline"]." ".$text["amulenorun"]); + } else { + if ($values["running"] && $values["connected"] == "2") + imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, + "aMule ".$text["connmsg"]." ".$text["kadoffmsg"]); + else if ($values["running"] && $values["connected"] != "0" && + $values["highlowid"] == "H") + imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, + $values["nick"]." ".$text["highidmsg"]." ".$text["kadoffmsg"]); + else if ($values["running"] && $values["connected"] != "0" && + $values["highlowid"] != "H") + imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, + $values["nick"]." ".$text["lowidmsg"]." ".$text["kadoffmsg"]); + else if ($values["running"] && $values["connected"] == "0") + imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, + $values["nick"]." ".$text["offrunmsg"]." ". + $text["amulenorun"]." ".$text["kadoffmsg"]); + else + imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, + $text["offline"]." ".$text["amulenorun"]); + } + + + + // shared files + + if ($values["running"] && $values["connected"] == "1") + imagettftext($finalimg, FONTSIZE, 0, 270, 85, $fgcolor, + FONTFILE, $text["sharedfiles"].": ". + $values["sharedfiles"]); + else + imagettftext($finalimg, FONTSIZE, 0, 270, 85, $fgcolor, + FONTFILE, $text["sharedfiles"].": ".$text["na"]); + + // server name, ip, port + + if ($values["running"] && $values["connected"] == "1") + imagettftext($finalimg, FONTSIZE, 0, 25, 63, $fgcolor, FONTFILE, + $values["servername"]." (".$values["serverip"].":". + $values["serverport"].")"); + else + imagettftext($finalimg, FONTSIZE, 0, 25, 63, $fgcolor, FONTFILE, + $text["na"]); + + // RX & TX + + if ($values["running"]) + imagettftext($finalimg, FONTSIZE, 0, 25, 85, $fgcolor, FONTFILE, + $text["rx"].": ".$values["rxspeed"].$text["transrate"]. + " | ".$text["tx"].": ".$values["txspeed"]. + $text["transrate"]); + else + imagettftext($finalimg, FONTSIZE, 0, 25, 85, $fgcolor, FONTFILE, + $text["rx"].": ".$text["na"]." | ".$text["tx"].": ". + $text["na"]); + + // queued clients + + if ($values["running"]) + imagettftext($finalimg, FONTSIZE, 0, 270, 107, $fgcolor, + FONTFILE, $text["queuedclients"].": ". + $values["queuedclients"]); + else + imagettftext($finalimg, FONTSIZE, 0, 270, 107, $fgcolor, + FONTFILE, $text["queuedclients"].": ".$text["na"]); + + // RFC 2822 Datestamp + + imagettftext($finalimg, FONTSIZE, 0, 25, 107, $fgcolor, FONTFILE, + date("r")); + + // outputs the signature image based on the value of IMAGETYPE. The case + // for png and default are the same; in other words, PNG is the default + // image output type. Note that your installation of GD has to support + // the type of image you are outputting here. + + switch (IMAGETYPE) + { + case "jpg": + case "jpeg": + { + header("Content-type: image/jpeg"); + imagejpeg($finalimg, "", 100); + } + case "gif": + { + header("Content-type: image/gif"); + imagegif($finalimg); + } + case "png": + default: + { + header("Content-type: image/png"); + imagepng($finalimg); + } + } +} + +/** + * This function outputs a simple image containing an error message specified + * by the only parameter, $err_message. The image is black text and border on + * a white background. + */ + +function output_error_img($err_message) +{ + // determine the size of the text string and add to it the amount of + // padding specified earlier. + + $fontdims = imagettfbbox(FONTSIZE, 0, FONTFILE, $err_message); + + $min_x = min($fontdims[0], $fontdims[2], $fontdims[4], $fontdims[6]); + $max_x = max($fontdims[0], $fontdims[2], $fontdims[4], $fontdims[6]); + $min_y = min($fontdims[1], $fontdims[3], $fontdims[5], $fontdims[7]); + $max_y = max($fontdims[1], $fontdims[3], $fontdims[5], $fontdims[7]); + + $width = ($max_x - $min_x) + (2 * ERRFONTPADDING); + $height = ($max_y - $min_y) + (2 * ERRFONTPADDING); + + $img = @imagecreate($width, $height); + + $bgcolor = imagecolorallocate($img, 255, 255, 255); + $fgcolor = imagecolorallocate($img, 0, 0, 0); + imagesetthickness($img, 2); + + // draw the border + + imagerectangle($img, 1, 1, $width - 2, $height - 2, $fgcolor); + + // print the text + + imagettftext($img, FONTSIZE, 0, ERRFONTPADDING, ERRFONTPADDING + 0.5 * + $height, $fgcolor, FONTFILE, $err_message); + + header("Content-type: image/jpeg"); + imagejpeg($img, "", 100); +} + +/** + * Writes the non-dynamic leading part of the HTML that makes up the statistics + * page. Right now this is just a stub for future theme support. + */ + +function write_header() +{ + +?> + + + + + AMPS - AMule PHP Statistics + + + + +

+ + + + + +
+ + + +
+ +

+ +Generated by AMPS version
+
http://www.amule-project.net/
+<uberpenguin at hotpop dot com> + + + +".$text["na"]. + "\n\t\t\t\t\n"; + $titlecolstart = "\t\t\t\t\n\t\t\t\t\t"; + $titlecolend = "\n"; + $datacolstart = "\t\t\t\t\t"; + $datacolend = "\n\t\t\t\t\n"; + + $sectiontablestart = "\t\n\t\t". + "\n\t\t\t\n\t\t\n"; + $sectionend = "\t\t\t
"; + $sectiontablenext = "
\n\t\t\t\n\t\t\n\t". + "\n\t

\n"; + $innertable = "\t\t\n\t\t\t". + "\n"; + $organizetable = "\t\t\t\n"; + + // title + + echo "\t
\n\t\t\n\t\t\t". + "\n\t\t\n\t". + "

AMPS - ". + "AMule PHP Statistics

\n\t

\n"; + + // first section + + echo $sectiontablestart.$text["general"].$sectiontablenext; + + echo $innertable; + echo $organizetable; + + // client info + + echo $titlecolstart.$text["client"].$titlecolend; + + if ($values["running"]) + echo $datacolstart."aMule ".$values["muleversion"]." ". + $text["runtimemsg"]." ".$values["psuptime"].$datacolend; + else + echo $datacolstart."aMule ".$text["norunmsg"].$datacolend; + + // ed2kstatus + + echo $titlecolstart.$text["ed2kstatus"].$titlecolend; + + if ($values["connected"] == "2") + echo $datacolstart.$text["connecting"]; + else if ($values["connected"] == "1") + echo $datacolstart.$text["online"]; + else + echo $datacolstart.$text["offline"]; + + if (!$values["running"]) + echo " ".$text["amulenorun"].$datacolend; + else + echo $datacolend; + + // kadstatus + + echo $titlecolstart.$text["kadstatus"].$titlecolend; + + if ($values["kad"] == "2") + echo $datacolstart.$text["kadon"]; + else if ($values["kad"] == "1") + echo $datacolstart.$text["kadfw"]; + else + echo $datacolstart.$text["kadoff"]; + + if (!$values["running"]) + echo " ".$text["amulenorun"].$datacolend; + else + echo $datacolend; + + // nick + + echo $titlecolstart.$text["nick"].$titlecolend; + + if ($values["running"]) + echo $datacolstart.$values["nick"].$datacolend; + else + echo $nastring; + + // RFC 2282 datestamp + + echo $titlecolstart.$text["localtime"].$titlecolend; + echo $datacolstart.date("r").$datacolend; + + // RX speed + + echo $titlecolstart.$text["rxspeed"].$titlecolend; + + if ($values["running"]) + echo $datacolstart.$values["rxspeed"].$text["transrate"]. + $datacolend; + else + echo $nastring; + + // TX speed + + echo $titlecolstart.$text["txspeed"].$titlecolend; + + if ($values["running"]) + echo $datacolstart.$values["txspeed"].$text["transrate"]. + $datacolend; + else + echo $nastring; + + // queued clients + + echo $titlecolstart.$text["queuedclients"].$titlecolend; + + if ($values["running"]) + echo $datacolstart.$values["queuedclients"].$datacolend; + else + echo $nastring; + + // TX total + + echo $titlecolstart.$text["txtotal"].$titlecolend; + + if ($values["running"]) + echo $datacolstart.round($values["txtotal"] / 1073741824, 2). + $text["gigabytes"].$datacolend; + else + echo $nastring; + + // RX total + + echo $titlecolstart.$text["rxtotal"].$titlecolend; + + if ($values["running"]) + echo $datacolstart.round($values["rxtotal"] / 1073741824, 2). + $text["gigabytes"].$datacolend; + else + echo $nastring; + + // shared files + + echo $titlecolstart.$text["sharedfiles"].$titlecolend; + + if ($values["running"] && $values["connected"] == "1") + echo $datacolstart.$values["sharedfiles"].$datacolend; + else + echo $nastring; + + // OS identification + + echo $titlecolstart.$text["osversion"].$titlecolend; + echo $datacolstart.exec("uname -sr").$datacolend; + + // uptime + + echo $titlecolstart.$text["hostuptime"].$titlecolend; + echo $datacolstart.exec("uptime").$datacolend; + + // break into next section + + echo $sectionend; + echo $sectiontablestart.$text["server"].$sectiontablenext; + echo $innertable; + echo $organizetable; + + // server name + + echo $titlecolstart.$text["servername"].$titlecolend; + + if ($values["running"] && $values["connected"] == "1") + echo $datacolstart.$values["servername"].$datacolend; + else + echo $nastring; + + // server IP:port + + echo $titlecolstart.$text["serveraddr"].$titlecolend; + + if ($values["running"] && $values["connected"] == "1") + echo $datacolstart.$values["serverip"].":". + $values["serverport"].$datacolend; + else + echo $nastring; + + // ED2K link + + echo $titlecolstart.$text["ed2klink"].$titlecolend; + + if ($values["running"] && $values["connected"] == "1") + echo $datacolstart."ed2k://".$values["servername"]."|". + $values["serverip"]."|".$values["serverport"]. + "|/".$datacolend; + else + echo $nastring; + + // break into next section + + echo $sectionend; + echo $sectiontablestart.$text["signature"].$sectiontablenext; + echo $innertable; + echo $organizetable; + + // signature image + + global $lang; + + echo "\t\t\t\t\"\"\n"; + + // language selection + + echo $sectionend; + echo $sectiontablestart; + + echo "\n\t\t\t\t

\n\t\t\t\t\t". + $text["language"].":  \n\t\t\t\t\t  \n\t\t\t\t\n"; + echo "\t\t\t\n\t\t\n\t"; +} + +write_footer(); + +?> diff --git a/src/utils/amps/langs/ca.inc b/src/utils/amps/langs/ca.inc new file mode 100644 index 00000000..a6b815b2 --- /dev/null +++ b/src/utils/amps/langs/ca.inc @@ -0,0 +1,71 @@ + diff --git a/src/utils/amps/langs/de.inc b/src/utils/amps/langs/de.inc new file mode 100644 index 00000000..cd59bb0b --- /dev/null +++ b/src/utils/amps/langs/de.inc @@ -0,0 +1,67 @@ + diff --git a/src/utils/amps/langs/en.inc b/src/utils/amps/langs/en.inc new file mode 100644 index 00000000..ba64dd59 --- /dev/null +++ b/src/utils/amps/langs/en.inc @@ -0,0 +1,83 @@ + diff --git a/src/utils/amps/langs/es.inc b/src/utils/amps/langs/es.inc new file mode 100644 index 00000000..3f85797f --- /dev/null +++ b/src/utils/amps/langs/es.inc @@ -0,0 +1,67 @@ + diff --git a/src/utils/amps/langs/eu.inc b/src/utils/amps/langs/eu.inc new file mode 100644 index 00000000..0481ce56 --- /dev/null +++ b/src/utils/amps/langs/eu.inc @@ -0,0 +1,71 @@ + diff --git a/src/utils/amps/langs/fi.inc b/src/utils/amps/langs/fi.inc new file mode 100644 index 00000000..260c7946 --- /dev/null +++ b/src/utils/amps/langs/fi.inc @@ -0,0 +1,65 @@ + diff --git a/src/utils/amps/langs/fr.inc b/src/utils/amps/langs/fr.inc new file mode 100644 index 00000000..ba95be82 --- /dev/null +++ b/src/utils/amps/langs/fr.inc @@ -0,0 +1,71 @@ + diff --git a/src/utils/amps/langs/hu.inc b/src/utils/amps/langs/hu.inc new file mode 100644 index 00000000..69f010cb --- /dev/null +++ b/src/utils/amps/langs/hu.inc @@ -0,0 +1,71 @@ + diff --git a/src/utils/amps/langs/it.inc b/src/utils/amps/langs/it.inc new file mode 100644 index 00000000..2ae6b020 --- /dev/null +++ b/src/utils/amps/langs/it.inc @@ -0,0 +1,69 @@ + diff --git a/src/utils/amps/langs/nl.inc b/src/utils/amps/langs/nl.inc new file mode 100644 index 00000000..ac8bf983 --- /dev/null +++ b/src/utils/amps/langs/nl.inc @@ -0,0 +1,67 @@ + diff --git a/src/utils/amps/langs/pl.inc b/src/utils/amps/langs/pl.inc new file mode 100644 index 00000000..209d3654 --- /dev/null +++ b/src/utils/amps/langs/pl.inc @@ -0,0 +1,69 @@ + diff --git a/src/utils/amps/langs/pt.inc b/src/utils/amps/langs/pt.inc new file mode 100644 index 00000000..02afce58 --- /dev/null +++ b/src/utils/amps/langs/pt.inc @@ -0,0 +1,77 @@ + diff --git a/src/utils/amps/langs/pt_BR.inc b/src/utils/amps/langs/pt_BR.inc new file mode 100644 index 00000000..e80d62a3 --- /dev/null +++ b/src/utils/amps/langs/pt_BR.inc @@ -0,0 +1,78 @@ + + * thanks fly out to: CapEnt ;) + ** + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +// if you are translating this file, please replace all special characters with +// html unicode entities (&#nnn;). It's not always necessary, but ensures that +// there are minimal problems displaying the text in all browsers. + +$text["dayabbr"] = "d"; +$text["hourabbr"] = "h"; +$text["minabbr"] = "m"; +$text["secabbr"] = "s"; +$text["runtimemsg"] = "em execução por"; // execução +$text["norunmsg"] = "não está ativo"; // está +$text["connmsg"] = "conectando"; +$text["highidmsg"] = "está online (HiGH iD)"; // está +$text["lowidmsg"] = "está online (LOW iD)"; // está +$text["offrunmsg"] = "está offline"; // está +$text["amulerun"] = "(aMule rodando)"; +$text["amulenorun"] = "(aMule parado)"; +$text["sharedfiles"] = "Shared files"; + +// try to keep these next three short, otherwise the signature +// image will look messy +$text["na"] = "N/A"; +$text["rx"] = "RX"; +$text["tx"] = "TX"; + +$text["queuedclients"] = "Clientes na espera"; +$text["transrate"] = "kB/s"; +$text["gigabytes"] = "GB"; +$text["client"] = "Cliente"; +$text["status"] = "Status"; +$text["nick"] = "Nick"; +$text["localtime"] = "Hora local"; +$text["rxspeed"] = "RX speed"; +$text["txspeed"] = "TX speed"; +$text["rxtotal"] = "RX total"; +$text["txtotal"] = "TX total"; +$text["osversion"] = "Versão de OS"; +$text["hostuptime"] = "uptime host"; +$text["servername"] = "Nome do servidor"; +$text["serveraddr"] = "servidor.endereço:porta"; // endereço +$text["ed2klink"] = "Link ED2K"; +$text["general"] = "General"; +$text["server"] = "Servidor"; +$text["signature"] = "Assinatura"; +$text["connecting"] = "Conectando"; +$text["online"] = "Online"; +$text["offline"] = "Offline"; +$text["language"] = "Lingua"; +$text["submit"] = "Enviar"; + +$text["sigfileerr"] = "Erro ao abrir o arquivo de assinatura"; +$text["baseimgerr"] = "Não foi encontrado a imagem da base"; // Não +$text["iconerr"] = "Não foi encontrado icones"; // Não + +?> diff --git a/src/utils/amps/style.css b/src/utils/amps/style.css new file mode 100644 index 00000000..3e8ce940 --- /dev/null +++ b/src/utils/amps/style.css @@ -0,0 +1,85 @@ +/** + * AMPS - AMule PHP Statistics + * Written by überpenguin, AMPS is an adaptation of BigBob's aStats + * + * 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. + */ + +/* Be VERY careful with this one... I'm providing it because I'm a nice guy */ + +body.thebody +{ +} + +/* High level table */ + +table.toplevel +{ + width: 50%; +} + +/* Top table for each section box */ + +table.sec +{ + width: 100%; + background-color: #486591; +} + +/* Lowest level table where the data is arranged */ + +table.organize +{ + width: 100%; +} + +/* Area where the title of each section lives */ + +tr.secheader +{ + background-color: #486591; +} + +/* Area where the data table is placed in each section */ + +tr.secbody +{ + background-color: #e6e6e6; +} + + +/* Area where the title of each section lives */ + +td.secheader +{ + color: #fefefe; + text-align: center; +} + +/* Area where the data table is placed in each section */ + +td.secbody +{ + color: #00000; +} + +/* Place where the statistics are put */ + +td.organize +{ + border-style: none; + border-width: thin; + background-color: #fefefe; +} diff --git a/src/utils/cas/Makefile.am b/src/utils/cas/Makefile.am new file mode 100644 index 00000000..d21b9e19 --- /dev/null +++ b/src/utils/cas/Makefile.am @@ -0,0 +1,51 @@ +EXTRA_DIST = README + +SUBDIRS = docs + +bin_PROGRAMS = cas + +dist_cas_DATA = tmp.html stat.png +casdir = $(datadir)/cas + +cas_SOURCES = cas.c \ + configfile.c \ + functions.c \ + graphics.c \ + html.c \ + lines.c + +noinst_HEADERS = configfile.h \ + functions.h \ + graphics.h \ + html.h \ + lines.h \ + version.h + +cas_CFLAGS= $(GDLIB_CFLAGS) $(CAS_DEFS) +cas_LDADD= $(GDLIB_LDFLAGS) $(GDLIB_LIBS) + +if NEED_CORESERVICES +cas_LDFLAGS = -framework CoreServices +endif + +# Resources + +if NEED_RC + +SUFFIXES = .rc + +.rc.$(OBJEXT): + $(RC) $(RCFLAGS) -I$(top_srcdir) -D__WIN95__ -D__WIN32__ -D__GNUWIN32__ -O COFF -i "$<" -o "$@" + +nodist_cas_SOURCES = cas-version.rc + +cas-version.rc: $(top_builddir)/version.rc + @sed -e 's/VER_FILEDESCRIPTION_STR/"C aMule Statistics"/' \ + -e 's/VER_INTERNALNAME_STR/"cas"/' \ + -e 's/VER_ORIGINALFILENAME_STR/"cas$(EXEEXT)"/' "$<" > "$@" + +CLEANFILES = *-version.rc + +endif + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/utils/cas/Makefile.in b/src/utils/cas/Makefile.in new file mode 100644 index 00000000..a063874c --- /dev/null +++ b/src/utils/cas/Makefile.in @@ -0,0 +1,833 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + + +SOURCES = $(cas_SOURCES) $(nodist_cas_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = cas$(EXEEXT) +subdir = src/utils/cas +DIST_COMMON = README $(dist_cas_DATA) $(noinst_HEADERS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(casdir)" +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +PROGRAMS = $(bin_PROGRAMS) +am_cas_OBJECTS = cas-cas.$(OBJEXT) cas-configfile.$(OBJEXT) \ + cas-functions.$(OBJEXT) cas-graphics.$(OBJEXT) \ + cas-html.$(OBJEXT) cas-lines.$(OBJEXT) +@NEED_RC_TRUE@nodist_cas_OBJECTS = cas-version.$(OBJEXT) +cas_OBJECTS = $(am_cas_OBJECTS) $(nodist_cas_OBJECTS) +am__DEPENDENCIES_1 = +cas_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(cas_SOURCES) $(nodist_cas_SOURCES) +DIST_SOURCES = $(cas_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +dist_casDATA_INSTALL = $(INSTALL_DATA) +DATA = $(dist_cas_DATA) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +EXTRA_DIST = README +SUBDIRS = docs +dist_cas_DATA = tmp.html stat.png +casdir = $(datadir)/cas +cas_SOURCES = cas.c \ + configfile.c \ + functions.c \ + graphics.c \ + html.c \ + lines.c + +noinst_HEADERS = configfile.h \ + functions.h \ + graphics.h \ + html.h \ + lines.h \ + version.h + +cas_CFLAGS = $(GDLIB_CFLAGS) $(CAS_DEFS) +cas_LDADD = $(GDLIB_LDFLAGS) $(GDLIB_LIBS) +@NEED_CORESERVICES_TRUE@cas_LDFLAGS = -framework CoreServices + +# Resources +@NEED_RC_TRUE@SUFFIXES = .rc +@NEED_RC_TRUE@nodist_cas_SOURCES = cas-version.rc +@NEED_RC_TRUE@CLEANFILES = *-version.rc +MAINTAINERCLEANFILES = Makefile.in +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .rc .$(OBJEXT) .c .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/cas/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/utils/cas/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +cas$(EXEEXT): $(cas_OBJECTS) $(cas_DEPENDENCIES) + @rm -f cas$(EXEEXT) + $(LINK) $(cas_LDFLAGS) $(cas_OBJECTS) $(cas_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cas-cas.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cas-configfile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cas-functions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cas-graphics.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cas-html.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cas-lines.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +cas-cas.o: cas.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-cas.o -MD -MP -MF "$(DEPDIR)/cas-cas.Tpo" -c -o cas-cas.o `test -f 'cas.c' || echo '$(srcdir)/'`cas.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cas-cas.Tpo" "$(DEPDIR)/cas-cas.Po"; else rm -f "$(DEPDIR)/cas-cas.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cas.c' object='cas-cas.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-cas.o `test -f 'cas.c' || echo '$(srcdir)/'`cas.c + +cas-cas.obj: cas.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-cas.obj -MD -MP -MF "$(DEPDIR)/cas-cas.Tpo" -c -o cas-cas.obj `if test -f 'cas.c'; then $(CYGPATH_W) 'cas.c'; else $(CYGPATH_W) '$(srcdir)/cas.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cas-cas.Tpo" "$(DEPDIR)/cas-cas.Po"; else rm -f "$(DEPDIR)/cas-cas.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cas.c' object='cas-cas.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-cas.obj `if test -f 'cas.c'; then $(CYGPATH_W) 'cas.c'; else $(CYGPATH_W) '$(srcdir)/cas.c'; fi` + +cas-configfile.o: configfile.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-configfile.o -MD -MP -MF "$(DEPDIR)/cas-configfile.Tpo" -c -o cas-configfile.o `test -f 'configfile.c' || echo '$(srcdir)/'`configfile.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cas-configfile.Tpo" "$(DEPDIR)/cas-configfile.Po"; else rm -f "$(DEPDIR)/cas-configfile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='configfile.c' object='cas-configfile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-configfile.o `test -f 'configfile.c' || echo '$(srcdir)/'`configfile.c + +cas-configfile.obj: configfile.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-configfile.obj -MD -MP -MF "$(DEPDIR)/cas-configfile.Tpo" -c -o cas-configfile.obj `if test -f 'configfile.c'; then $(CYGPATH_W) 'configfile.c'; else $(CYGPATH_W) '$(srcdir)/configfile.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cas-configfile.Tpo" "$(DEPDIR)/cas-configfile.Po"; else rm -f "$(DEPDIR)/cas-configfile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='configfile.c' object='cas-configfile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-configfile.obj `if test -f 'configfile.c'; then $(CYGPATH_W) 'configfile.c'; else $(CYGPATH_W) '$(srcdir)/configfile.c'; fi` + +cas-functions.o: functions.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-functions.o -MD -MP -MF "$(DEPDIR)/cas-functions.Tpo" -c -o cas-functions.o `test -f 'functions.c' || echo '$(srcdir)/'`functions.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cas-functions.Tpo" "$(DEPDIR)/cas-functions.Po"; else rm -f "$(DEPDIR)/cas-functions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='functions.c' object='cas-functions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-functions.o `test -f 'functions.c' || echo '$(srcdir)/'`functions.c + +cas-functions.obj: functions.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-functions.obj -MD -MP -MF "$(DEPDIR)/cas-functions.Tpo" -c -o cas-functions.obj `if test -f 'functions.c'; then $(CYGPATH_W) 'functions.c'; else $(CYGPATH_W) '$(srcdir)/functions.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cas-functions.Tpo" "$(DEPDIR)/cas-functions.Po"; else rm -f "$(DEPDIR)/cas-functions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='functions.c' object='cas-functions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-functions.obj `if test -f 'functions.c'; then $(CYGPATH_W) 'functions.c'; else $(CYGPATH_W) '$(srcdir)/functions.c'; fi` + +cas-graphics.o: graphics.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-graphics.o -MD -MP -MF "$(DEPDIR)/cas-graphics.Tpo" -c -o cas-graphics.o `test -f 'graphics.c' || echo '$(srcdir)/'`graphics.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cas-graphics.Tpo" "$(DEPDIR)/cas-graphics.Po"; else rm -f "$(DEPDIR)/cas-graphics.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='graphics.c' object='cas-graphics.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-graphics.o `test -f 'graphics.c' || echo '$(srcdir)/'`graphics.c + +cas-graphics.obj: graphics.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-graphics.obj -MD -MP -MF "$(DEPDIR)/cas-graphics.Tpo" -c -o cas-graphics.obj `if test -f 'graphics.c'; then $(CYGPATH_W) 'graphics.c'; else $(CYGPATH_W) '$(srcdir)/graphics.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cas-graphics.Tpo" "$(DEPDIR)/cas-graphics.Po"; else rm -f "$(DEPDIR)/cas-graphics.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='graphics.c' object='cas-graphics.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-graphics.obj `if test -f 'graphics.c'; then $(CYGPATH_W) 'graphics.c'; else $(CYGPATH_W) '$(srcdir)/graphics.c'; fi` + +cas-html.o: html.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-html.o -MD -MP -MF "$(DEPDIR)/cas-html.Tpo" -c -o cas-html.o `test -f 'html.c' || echo '$(srcdir)/'`html.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cas-html.Tpo" "$(DEPDIR)/cas-html.Po"; else rm -f "$(DEPDIR)/cas-html.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='html.c' object='cas-html.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-html.o `test -f 'html.c' || echo '$(srcdir)/'`html.c + +cas-html.obj: html.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-html.obj -MD -MP -MF "$(DEPDIR)/cas-html.Tpo" -c -o cas-html.obj `if test -f 'html.c'; then $(CYGPATH_W) 'html.c'; else $(CYGPATH_W) '$(srcdir)/html.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cas-html.Tpo" "$(DEPDIR)/cas-html.Po"; else rm -f "$(DEPDIR)/cas-html.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='html.c' object='cas-html.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-html.obj `if test -f 'html.c'; then $(CYGPATH_W) 'html.c'; else $(CYGPATH_W) '$(srcdir)/html.c'; fi` + +cas-lines.o: lines.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-lines.o -MD -MP -MF "$(DEPDIR)/cas-lines.Tpo" -c -o cas-lines.o `test -f 'lines.c' || echo '$(srcdir)/'`lines.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cas-lines.Tpo" "$(DEPDIR)/cas-lines.Po"; else rm -f "$(DEPDIR)/cas-lines.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lines.c' object='cas-lines.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-lines.o `test -f 'lines.c' || echo '$(srcdir)/'`lines.c + +cas-lines.obj: lines.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-lines.obj -MD -MP -MF "$(DEPDIR)/cas-lines.Tpo" -c -o cas-lines.obj `if test -f 'lines.c'; then $(CYGPATH_W) 'lines.c'; else $(CYGPATH_W) '$(srcdir)/lines.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/cas-lines.Tpo" "$(DEPDIR)/cas-lines.Po"; else rm -f "$(DEPDIR)/cas-lines.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lines.c' object='cas-lines.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-lines.obj `if test -f 'lines.c'; then $(CYGPATH_W) 'lines.c'; else $(CYGPATH_W) '$(srcdir)/lines.c'; fi` +uninstall-info-am: +install-dist_casDATA: $(dist_cas_DATA) + @$(NORMAL_INSTALL) + test -z "$(casdir)" || $(mkdir_p) "$(DESTDIR)$(casdir)" + @list='$(dist_cas_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(dist_casDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(casdir)/$$f'"; \ + $(dist_casDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(casdir)/$$f"; \ + done + +uninstall-dist_casDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_cas_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(casdir)/$$f'"; \ + rm -f "$(DESTDIR)$(casdir)/$$f"; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(PROGRAMS) $(DATA) $(HEADERS) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(casdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: install-dist_casDATA + +install-exec-am: install-binPROGRAMS + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-dist_casDATA \ + uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-binPROGRAMS clean-generic clean-recursive ctags \ + ctags-recursive distclean distclean-compile distclean-generic \ + distclean-recursive distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dist_casDATA install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-recursive pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-dist_casDATA uninstall-info-am + + +@NEED_RC_TRUE@.rc.$(OBJEXT): +@NEED_RC_TRUE@ $(RC) $(RCFLAGS) -I$(top_srcdir) -D__WIN95__ -D__WIN32__ -D__GNUWIN32__ -O COFF -i "$<" -o "$@" + +@NEED_RC_TRUE@cas-version.rc: $(top_builddir)/version.rc +@NEED_RC_TRUE@ @sed -e 's/VER_FILEDESCRIPTION_STR/"C aMule Statistics"/' \ +@NEED_RC_TRUE@ -e 's/VER_INTERNALNAME_STR/"cas"/' \ +@NEED_RC_TRUE@ -e 's/VER_ORIGINALFILENAME_STR/"cas$(EXEEXT)"/' "$<" > "$@" +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/utils/cas/README b/src/utils/cas/README new file mode 100644 index 00000000..caff01ad --- /dev/null +++ b/src/utils/cas/README @@ -0,0 +1,18 @@ +C AMULE STATS + + + +This is a little app that i've been doing cause i really didnt liked aStats. +I was too slow, so i tried to do a little remake of it in c just to learn a +bit more of c and do a nice app too. + +feel free to contact me at falso@rdk.homeip.net + +--- +Nice things to do if you have the time and want to contribute: + +* Put an end to lines[] madness +* Get the mule to formally define onlinesig format and use that to access + the fields, not meaningless offsets (needs a patch against/rewrite of + amule[d].cpp:OnlineSig() at this time) +* Clean up confusing code \ No newline at end of file diff --git a/src/utils/cas/cas.c b/src/utils/cas/cas.c new file mode 100644 index 00000000..50ab07ac --- /dev/null +++ b/src/utils/cas/cas.c @@ -0,0 +1,307 @@ +/* + * Name: Main cas file + * + * Purpose: aMule Statistics + * + * Author: Pedro de Oliveira + * + * Copyright (C) 2004 by Pedro de Oliveira + * + * This file is part of aMule. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "version.h" +#include "configfile.h" +#include "functions.h" +#include "graphics.h" +#include "html.h" +#include "lines.h" + +/* + * History: + * + * ????.??.?? - falso: creation of cas. + * ????.??.?? - Jacobo221: Detect connecting state + * ????.??.?? - falso: HTML page generation + * 2004.08.27 - GonoszTopi: New line handling routines, to cope with lines + * longer than 80 characters. Fixes buffer overflow. + * 2005.12.10 - fulgas: added kad info support + * 2005,12,16 - stefanero: fixed Kad related stuff and some other things + */ + +static struct option long_options[] = { + { "help", no_argument, NULL, 'h' }, + { "html", optional_argument, NULL, 'p' }, + { "picture", optional_argument, NULL, 'o' }, + { "config-dir", required_argument, NULL, 'c' }, + { NULL, 0, NULL, 0 } +}; + +void usage(char *myname) +{ + printf (" ___ _ _ ___ c aMule statistics\n" + " /'___) /'_` )/',__) by Pedro de Oliveira\n" + "( (___ ( (_| |\\__, \\ \n" + "`\\____)`\\__,_)(____/ Version %s\n\n" + + "Usage: %s [OPTION]\n" + "If run without any option prints stats to stdout\n\n" + "OPTIONS:\n" +#ifdef __GD__ + "-o, --picture, -P\tWrites the online signature picture\n" +#endif + "-p, --html, -H\t\tHTML Page with stats and picture\n" + "-c, --config-dir\tSpecifies a config-dir different from home\n" + "-h, --help\t\tThis help you're reading\n", CAS_VERSION, myname); +} + +int main(int argc, char *argv[]) +{ + /* Declaration of variables */ + FILE *amulesig; + int use_out_pic = 0; + int use_page = 0; + char *config_path=NULL; + char *path; + char *stats[20]; + char *lines[7]; + long lSize; + char * buffer; + int i; + int c; + char *path_for_picture=NULL; + char *path_for_html=NULL; + CONF config; + time_t lt; + struct tm *ltp; + char arr[20]; + + while ((c = getopt_long (argc, argv, "c:P:H:hpo", long_options, NULL)) != -1) + + switch (c) + { + case 'c': + config_path=optarg; + break; + case 'h': + usage(argv[0]); + exit(0); + case 'H': + case 'p': + use_page=1; + if (optarg != NULL) { + path_for_html = optarg; + } + break; + case 'P': + case 'o': + use_out_pic=1; + if (optarg != NULL) { + path_for_picture = optarg; + } + break; + } + + /* get amulesig path */ + + path = get_amule_path("amulesig.dat", 1, config_path); + + if (path == NULL) { + perror("Unable to get aMule settings path\n"); + exit(1); + } + + /* open the file and if not exists exit with an error */ + if ((amulesig = fopen(path, "r")) == NULL) { + fprintf(stderr, "Unable to open file %s\nCheck if you have amule online signature enabled.\n", path); + exit(2); + } + /* i believe this shouldnt be here. + The freq of update could be higher than 60 seconds. + And it doesn't mean that the amule is not running. + */ + /* + else { + struct stat s_file; + if ( stat(path, &s_file) == 0 ) { + time_t t_now = time(0); + if ( (t_now - s_file.st_mtime) > 60 ) { + perror("aMule online signature last updated more then 60 sec ago\n"); + perror("Check that your aMule is running\n"); + } + } + }*/ + free(path); + + /* initialize all the strings with nothing */ + for (i = 0; i <= 19; i++) + stats[i] = 0; + + /* start reading the stuff from amulesign to the stats array */ + // obtain file size. + fseek (amulesig , 0 , SEEK_END); + lSize = ftell (amulesig); + rewind (amulesig); + buffer = (char*) malloc (lSize); + if (buffer == NULL) { + perror("Could not create buffer\n"); + exit (2); + } + fread (buffer,1,lSize,amulesig); + fclose(amulesig); + + stats[0] = strtok (buffer,"\n"); /* ed2k status*/ + stats[1] = strtok (NULL,"\n"); /* server name */ + stats[2] = strtok (NULL,"\n"); /* server ip */ + stats[3] = strtok (NULL,"\n"); /* server port */ + stats[4] = strtok (NULL,"\n"); /* high or low id */ + stats[5] = strtok (NULL,"\n"); /* kad status */ + stats[6] = strtok (NULL,"\n"); /* dl */ + stats[7] = strtok (NULL,"\n"); /* ul*/ + stats[8] = strtok (NULL,"\n"); /* queue*/ + stats[9] = strtok (NULL,"\n"); /* clients*/ + stats[10] = strtok (NULL,"\n"); /* nick*/ + stats[11] = strtok (NULL,"\n"); /* total download */ + stats[12] = strtok (NULL,"\n"); /* total upload */ + stats[13] = strtok (NULL,"\n"); /* version */ + stats[14] = strtok (NULL,"\n"); /*Session download*/ + stats[15] = strtok (NULL,"\n"); /* Session upload */ + stats[16] = strtok (NULL,"\n"); /* aMule running Time */ + + // local time stored as stats[17] + lt = time(NULL); + ltp = localtime(<); + strftime(arr, 20, "%b %d %Y, %H:%M", ltp); + + // if amule isn't running say that and exit else print out the stuff + + // if amule uptime is 0, then its not running... + if (strncmp(stats[16],"0",1) == 0 ) { + perror("aMule is not running\n"); + exit(3); + } + + + if (strncmp(stats[0],"2",1) == 0) + CreateLine(lines, 0 ,"aMule %s is connecting\n", stats[13]); + else + CreateLine(lines, 0, "aMule %s has been running for %s\n", + stats[13], timeconv(stats[16])); + + + + if (strncmp(stats[0],"0",1) == 0 && strncmp(stats[5],"0",1) == 0) + CreateLine(lines, 1, "%s is not connected ", stats[10]); + else if (strncmp(stats[0],"0",1) == 0 && strncmp(stats[5],"0",1) != 0) + CreateLine(lines, 1, "%s is connected to ", stats[10]); + else + CreateLine(lines, 1, "%s is connected to %s [%s:%s] with ", stats[10], + stats[1], stats[2], stats[3]); + + + if (strncmp(stats[5],"2",1) == 0) { + if (strncmp(stats[4],"H",1) == 0) + AppendToLine(lines, 1, "HighID | Kad: ok \n"); + else if (strncmp(stats[4],"L",1) == 0) + AppendToLine(lines, 1, "LowID | Kad: ok \n"); + else + AppendToLine(lines, 1, "Kad: ok \n"); + } else if (strncmp(stats[5],"1",1) == 0) { + if (strncmp(stats[4],"H",1) == 0) + AppendToLine(lines, 1, "HighID | Kad: firewalled \n"); + else if (strncmp(stats[4],"L",1) == 0) + AppendToLine(lines, 1, "LowID | Kad: firewalled \n"); + else + AppendToLine(lines, 1, "Kad: firewalled \n"); + } else { + if (strncmp(stats[4],"H",1) == 0) + AppendToLine(lines, 1, "HighID | Kad: off \n"); + else if (strncmp(stats[4],"L",1) == 0) + AppendToLine(lines, 1, "LowID | Kad: off \n"); + else + AppendToLine(lines, 1, "but running\n"); + } + + stats[11] = strdup(convbytes(stats[11])); + stats[12] = strdup(convbytes(stats[12])); + + CreateLine(lines, 2, "Total Download: %s, Upload: %s\n",stats[11] , stats[12]); + + stats[15] = strdup(convbytes(stats[15])); + stats[14] = strdup(convbytes(stats[14])); + + CreateLine(lines, 3, "Session Download: %s, Upload: %s\n",stats[14], stats[15]); + + CreateLine(lines, 4, "Download: %s kB/s, Upload: %s kB/s\n", stats[6], stats[7]); + + CreateLine(lines, 5, "Sharing: %s file(s), Clients on queue: %s\n", stats[9] , stats[8]); + + CreateLine(lines, 6, "Time: %s\n", arr); + +#ifdef __GD__ + if (use_out_pic == 1) { + if (!readconfig(&config)) { + perror("Could not read config file\n"); + exit(4); + } + + if (!createimage(&config, lines, path_for_picture)) { + perror("Could not create image!\n"); + exit(5); + } + exit(0); + } +#endif + + if (use_page == 1) { + + if (!readconfig(&config)) { + perror("Could not read config file\n"); + exit(4); + } + + if (!create_html(stats,lines,config.template, path_for_html)) { + perror("Could not create the HTML Page.\n"); + } + +#ifdef __GD__ + if (!createimage(&config, lines, path_for_picture)) { + perror("Could not create image!\n"); + exit(5); + } +#endif + + + exit(0); + } + for (i = 0; i <= 6; i++) { + printf("%s", lines[i]); + free(lines[i]); + } + free(buffer); + exit(0); +} + diff --git a/src/utils/cas/configfile.c b/src/utils/cas/configfile.c new file mode 100644 index 00000000..412cadc6 --- /dev/null +++ b/src/utils/cas/configfile.c @@ -0,0 +1,151 @@ +/* + * Name: Config file functions + * + * Purpose: Read info from casrc ou create one if it doesnt exist + * + * Author: Pedro de Oliveira + * + * Copyright (C) 2004 by Pedro de Oliveira + * + * This file is part of aMule. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +*/ + +#include +#include +#include + +#include "configfile.h" +#include "functions.h" + +int writeconfig(void) +{ + FILE *config; + char *path; + unsigned int i; + char *def[] = { + "# cas config file\n", + "#\n", + "# font - full path to a ttf font\n", + "# font_size - size the font\n", + "# source_image - image where the text will be writen\n", + "# *_line - x,y,[1/0] enabled or disabled\n\n", + "font /usr/share/fonts/corefonts/times.ttf\n", + "font_size 10.5\n", + "source_image /usr/share/pixmaps/stat.png\n", + "first_line 23,17,1\n", + "second_line 23,34,1\n", + "third_line 23,51,1\n", + "fourth_line 23,68,1\n", + "fifth_line 23,85,1\n", + "sixth_line 23,102,1\n", + "seventh_line 23,119,1\n", + "template /usr/share/pixmaps/tmp.html\n", + "img_type 0\n" + }; + + path = get_path("casrc"); + if (path == NULL) + return 0; + + if ( (config = fopen(path, "w")) == NULL) + return 0; + + for (i = 0; i < sizeof(def) / sizeof(char *); i++) + fprintf(config, "%s", def[i]); + + fclose(config); + + printf("%s created, please edit it and then rerun cas\n", path); + free(path); + + return 1; +} + +/* Jacobo221 - [ToDo] There should be a check for corrupt config files! */ +int readconfig(CONF *config) +{ + char buffer[120], option[15], *path; + FILE *conf; + int i = 0; + char lines[IMG_TEXTLINES][13] = { + "first_line", + "second_line", + "third_line", + "fourth_line", + "fifth_line", + "sixth_line", + "seventh_line" + }; + + path = get_path("casrc"); + if (path == NULL) { + return 0; + } + + if ((conf = fopen(path, "r")) == NULL) { + printf("Unable to open %s. Creating it.\n", path); + free(path); + if (!writeconfig()) { + perror("readconfig: unable to create initial config file\n"); + } + return 0; + } + free(path); + + buffer[0] = 0; + while (!feof(conf)) { + // Jacobo221 - [ToDo] Only first char per line is comment... + if (fgets (buffer,120,conf)) { + if (buffer[0] != '#') { + /* Only two fileds per line */ + sscanf(buffer, "%s %*s", option); + fflush (stdout); + // Jacobo221 - [ToDo] So lines can't be swapped... + if (strcmp(option, "font") == 0) { + sscanf(buffer, "%*s %s", config->font); + } + if (strcmp(option, "font_size") == 0) { + sscanf(buffer, "%*s %f", &config->size); + } + if (strcmp(option, "source_image") == 0) { + sscanf(buffer, "%*s %s", config->source); + } + if (strcmp(option, "template") == 0) { + sscanf(buffer, "%*s %s", config->template); + } + if (strcmp(option, "img_type") == 0) { + sscanf(buffer, "%*s %d", &config->img_type); + } + + for (i = 0; i <= IMG_TEXTLINES; i++) { + if (strcmp(option, lines[i]) == 0) { + sscanf(buffer, + "%*s %d,%d,%d", + &config->x[i], &config->y[i], + &config->enabled[i]); + } + } + } + } + } + + fclose(conf); + + return 1; +} + diff --git a/src/utils/cas/configfile.h b/src/utils/cas/configfile.h new file mode 100644 index 00000000..b7359a2c --- /dev/null +++ b/src/utils/cas/configfile.h @@ -0,0 +1,49 @@ +/* + * Name: Config file functions + * + * Purpose: Read info from casrc ou create one if it doesnt exist + * + * Author: Pedro de Oliveira + * + * Copyright (C) 2004 by Pedro de Oliveira + * + * This file is part of aMule. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +*/ + + +#ifndef CAS_CONFIGFILE_H +#define CAS_CONFIGFILE_H + +#define IMG_TEXTLINES 7 + +typedef struct { + char font[120]; + char source[120]; + char template[120]; + int x[6]; + int y[6]; + int enabled[6]; + float size; + int img_type; // 0 = PNG, else = JPG +} CONF; + +int writeconfig(void); +int readconfig(CONF *config); + +#endif +/* // File_checked_for_headers */ diff --git a/src/utils/cas/docs/Makefile.am b/src/utils/cas/docs/Makefile.am new file mode 100644 index 00000000..b21a3d0f --- /dev/null +++ b/src/utils/cas/docs/Makefile.am @@ -0,0 +1,7 @@ +SELECTED_MANPAGES = $(CAS_MANPAGES) + +EXTRA_DIST = cas.1 cas.de.1 cas.es.1 cas.eu.1 cas.hu.1 + +include $(top_srcdir)/automake/manpages.am + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/utils/cas/docs/Makefile.in b/src/utils/cas/docs/Makefile.in new file mode 100644 index 00000000..b4112b63 --- /dev/null +++ b/src/utils/cas/docs/Makefile.in @@ -0,0 +1,489 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/automake/manpages.am +subdir = src/utils/cas/docs +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +SELECTED_MANPAGES = $(CAS_MANPAGES) +EXTRA_DIST = cas.1 cas.de.1 cas.es.1 cas.eu.1 cas.hu.1 +MAINTAINERCLEANFILES = Makefile.in +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/automake/manpages.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/cas/docs/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/utils/cas/docs/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + $(mkdir_p) $(distdir)/../../../../automake + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-data-hook install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am uninstall uninstall-am uninstall-hook \ + uninstall-info-am + +install-data-hook: + @for file in $(SELECTED_MANPAGES); do \ + lang=`echo $$file | sed -e 's/^[^.]*\.//'`; \ + if test $$lang == 1; then \ + echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/man1" ; \ + $(mkinstalldirs) $(DESTDIR)$(mandir)/man1 ; \ + if test -f $(srcdir)/$$file; then name=$(srcdir)/$$file; \ + else name=$$file; fi; \ + inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ + echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/man1/$$inst" ; \ + $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/man1/$$inst ; \ + else \ + locale=`echo $$lang | sed -e 's/\..*//'` ; \ + echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/$$locale/man1" ; \ + $(mkinstalldirs) $(DESTDIR)$(mandir)/$$locale/man1 ; \ + if test -f $(srcdir)/$$file; then name=$(srcdir)/$$file; \ + else name=$$file; fi; \ + inst=`echo $$file | sed -e "s/\.$${locale}\.1//" -e '$(transform)'`.1 ; \ + echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$locale/man1/$$inst" ; \ + $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$locale/man1/$$inst ; \ + fi; \ + done + +uninstall-hook: + @for file in $(SELECTED_MANPAGES); do \ + lang=`echo $$file | sed -e 's/^[^.]*\.//'`; \ + if test $$lang == 1; then \ + inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ + rm -f $(DESTDIR)$(mandir)/man1/$$inst ; \ + else \ + locale=`echo $$lang | sed -e 's/\..*//'` ; \ + inst=`echo $$file | sed -e "s/\.$${locale}\.1//" -e '$(transform)'`.1 ; \ + rm -f $(DESTDIR)$(mandir)/$$locale/man1/$$inst ; \ + fi; \ + done +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/utils/cas/docs/cas.1 b/src/utils/cas/docs/cas.1 new file mode 100644 index 00000000..9041ec8b --- /dev/null +++ b/src/utils/cas/docs/cas.1 @@ -0,0 +1,47 @@ +.TH CAS 1 "January 2007" "cas v0.8" "aMule utilities" +.SH NAME +cas \- c aMule statistics +.SH SYNOPSIS +.B cas +.TH CAS "1" "January 2007" "aMule ED2k links calculator" "aMule utilities" +.SH DESCRIPTION +.PP + ___ _ _ ___ c aMule statistics + /'___) /'_` )/',__) by Pedro de Oliveira + ( (___ ( (_| |\\\__, \\ + `\\____)`\\__,_)(____/ Version 0.5 +.P +\fBcas\fR is a program for displaying the contents of your aMule online +signature file to console (in a human readable form). +.SS OPTIONS: +.TP +\fB\-o\fR, \fB\-\-picture\fR, \fB\-P\fR +Writes the online signature picture. +You can optionally append \fI\=\\fR to this option, to specify where the picture should be written +.TP +\fB\-p\fR, \fB\-\-html\fR, \fB\-H\fR +HTML page with stats and picture. +You can optionally append \fI\=\\fR to this option, to specify where the page should be written +.TP +\fB\-c\fR, \fB\-\-config\-dir\fR +Specifies a config-dir different from home +.TP +\fB\-h\fR, \fB\-\-help\fR +Prints a short usage description. +.P +Without any options, prints online signature data to stdout. +.SH FILES +~/.aMule/casrc +.br +stat.png +.br +tmp.html +.SH AUTHOR +\fBcas\fR was written by Pedro de Oliveira +.SH REPORTING BUGS +Please report bugs either on our forum (\fIhttp://forum.amule.org/\fR), or in our bugtracker (\fIhttp://bugs.amule.org/\fR). +Please do not report bugs in e-mail, neither to our mailing list nor directly to any team member. +.SH COPYRIGHT +aMule and all of its related utilities are distributed under the GNU General Public License. +.SH SEE ALSO +\fBamule\fR(1), \fBwxcas\fR(1) diff --git a/src/utils/cas/docs/cas.de.1 b/src/utils/cas/docs/cas.de.1 new file mode 100644 index 00000000..f617685e --- /dev/null +++ b/src/utils/cas/docs/cas.de.1 @@ -0,0 +1,63 @@ +.\"******************************************************************* +.\" +.\" This file was generated with po4a. Translate the source file. +.\" +.\"******************************************************************* +.TH CAS 1 "Januar 2007" "cas v0.8" "aMule Hilfsprogramme" +.SH NAME +cas \- c aMule statistics +.SH SYNTAX +\fBcas\fP +.\"******************************************************************* +.\" +.\" This file was generated with po4a. Translate the source file. +.\" +.\"******************************************************************* +.TH CAS 1 "Januar 2007" "aMule ED2k links Ersteller" "aMule Hilfsprogramme" +.SH BESCHREIBUNG +.PP + ___ _ _ ___ c aMule statistics + /'___) /'_` )/',__) von Pedro de Oliveira + ( (___ ( (_| |\e\__, \e + `\e____)`\e__,_)(____/ Version 0.5 +.P +\fBcas\fP ist ein Program das den Inhalt deiner aMule Onlinesignaturedatei in +menschenlesbarer Form auf der Konsole ausgibt. +.SS OPTIONEN: +.TP +\fB\-o\fP, \fB\-\-picture\fP, \fB\-P\fP +Erstellt ein Bild deiner Onlinesignatur. Optional kannst du +\fI\=\\fP dieser Option übergeben, um anzugeben wohin das Bild +geschrieben werden soll. +.TP +\fB\-p\fP, \fB\-\-html\fP, \fB\-H\fP +HTML Seite mit Statistik und Bild. Optional kannst du \fI\=\\fP +dieser Option übergeben, um anzugeben wohin die Seite geschrieben werden +soll. +.TP +\fB\-c\fP, \fB\-\-config\-dir\fP +Gibt ein Konfigurationsverzeichnis abweichend des Home an +.TP +\fB\-h\fP, \fB\-\-help\fP +Gibt eine kurze Beschreibung aus. +.P +Ohne Optionen wird die Onlinesignatur nach stdout geschrieben. +.SH DATEIEN +~/.aMule/casrc +.br +stat.png +.br +tmp.html +.SH VERFASSER +\fBcas\fP wurde geschrieben von Pedro de Oliveira + +.SH "FEHLER MELDEN" +Bitte meldet Fehler entweder in unserem Forum (\fIhttp://forum.amule.org/\fP), +oder in unseren Bugtracker (\fIhttp://bugs.amule.org/\fP). Bitte meldet uns +keine Fehler per E\-Mail, noch auf unsere Mailingliste oder direkt an unsere +Teammitglieder. +.SH COPYRIGHT +aMule und alle seine zugehörigen Anwendungen werden verteilt unter der GNU +General Public License +.SH "SIEHE AUCH" +\fBamule\fP(1), \fBwxcas\fP(1) diff --git a/src/utils/cas/docs/cas.es.1 b/src/utils/cas/docs/cas.es.1 new file mode 100644 index 00000000..1cddbbed --- /dev/null +++ b/src/utils/cas/docs/cas.es.1 @@ -0,0 +1,41 @@ +.TH CAS 1 "Marzo 2005" "cas v0.5" "Utilidades de aMule" +.SH NOMBRE +cas \- Estadísticas de aMule +.SH SINOPSIS +.B cas +.RI [ OPCIONES ] +.SH DESCRIPCIÓN +.PP + ___ _ _ ___ Estadístics de aMule + /'___) /'_` )/',__) por Pedro de Oliveira + ( (___ ( (_| |\\\__, \\ + `\\____)`\\__,_)(____/ Versión 0.5 +.P +\fBcas\fR es un programa que permite ver el contenido de la firma de aMule en tu consola de manera sencilla. +.SS OPCIONES: +.TP +\fB\-o\fR +Crea una imágen de la firma. +.TP +\fB\-p\fR +Crea una página HTML con las estadísticas y la imágen de la firma. +.TP +\fB\-h\fR, \fB\-\-help\fR +Printra una breve ayuda. +.P +Sin opciones, muestra en consola las estadísticas de la firma. +.SH ARCHIVOS +~/.aMule/casrc +.br +stat.png +.br +tmp.html +.SH AUTOR +\fBcas\fR ha sido escrito por Pedro de Oliveira +.SH BUGS +Si descubre bugs, por favor comuníquelos en (\fIhttp://forum.amule.org/\fR), o en nuestro bugtracker (\fIhttp://bugs.amule.org/\fR). +Por favor, no comunique bugs por e-mail, ni a nuestro maillist ni directamente a ningún miembro del equipo de aMule. +.SH COPYRIGHT +aMule, y todas las utilidades que con el vienen, se distribuyen bajo la licencia GPL. +.SH VER +\fBamule\fR(1), \fBwxcas\fR(1) diff --git a/src/utils/cas/docs/cas.eu.1 b/src/utils/cas/docs/cas.eu.1 new file mode 100644 index 00000000..08073676 --- /dev/null +++ b/src/utils/cas/docs/cas.eu.1 @@ -0,0 +1,48 @@ +.TH CAS 1 "2005 Martxoa" "cas v0.5" "aMule lanabesak" +.SH IZENA +cas \- c aMule statistikak +.SH LABURPENA +.B cas +.RI [ AUKERAK ] +.SH AZALPENA +.PP + ___ _ _ ___ c aMule statistics + /'___) /'_` )/',__) by Pedro de Oliveira + ( (___ ( (_| |\\\__, \\ + `\\____)`\\__,_)(____/ Version 0.5 +.P +\fBcas\fR zure aMule lineako sinadura fitxategiarne edukiak +(gizakiak irakurtzeko moduan) bistaratzeko programa. +.SS AUKERAK: +.TP +\fB\-o\fR, \fB\-\-picture\fR, \fB\-P\fR +Lineako sinadura irudia idatzi. +Aukeran \fI\=\\fR gehitu diezaiokezu aukera honi, irudia non gordeko den ezartzeko +.TP +\fB\-p\fR, \fB\-\-html\fR, \fB\-H\fR +Estatistika eta irudiarekin HTML orrialdea. +Aukeran \fI\=\\fR gehitu diezaiokezu aukera honi, orria non gordeko den ezartzeko +.TP +\fB\-c\fR, \fB\-\-config\-dir\fR +home-etik ezberdina den konfigurazio direktorio bat ezarri +.TP +\fB\-h\fR, \fB\-\-help\fR +Erabilera azalpen labur bat inprimatu. +.P +Aukerarik gabe lineako sinadura datuak irteera estandarrean inprimatuko dira. +.SH FITXATEGIAK +~/.aMule/casrc +.br +stat.png +.br +tmp.html +.SH EGILEA +\fBcas\fR Pedro de Oliveira-k idatzia izan da. +.SH ZORRIEN BERRI EMATEN +Mesedez zorrien berri emateko gure foroa (\fIhttp://forum.amule.org/\fR), edo gure zorri kudeatzailea +(\fIhttp://bugs.amule.org/\fR) erabili. +Mesedez ez eman zorrien berri epostaz, ez gure eposta zerrendan ez taldeko partaideei. +.SH COPYRIGHT +aMule eta inguruneko lanabes guztiak GNU Lizentzia Publiko Orokorraz banatzen dira. +.SH IKUSI ERE +\fBamule\fR(1), \fBwxcas\fR(1) diff --git a/src/utils/cas/docs/cas.hu.1 b/src/utils/cas/docs/cas.hu.1 new file mode 100644 index 00000000..43e8af97 --- /dev/null +++ b/src/utils/cas/docs/cas.hu.1 @@ -0,0 +1,43 @@ +.TH CAS 1 "2005 március" "cas v0.5" "aMule segédprogramok" +.SH NÉV +cas \- c aMule statisztikák +.SH ÁTTEKINTÉS +.B cas +.RI [ OPCIÓK ] +.SH LEÍRÁS +.PP + ___ _ _ ___ c aMule statisztikák + /'___) /'_` )/',__) írta Pedro de Oliveira + ( (___ ( (_| |\\\__, \\ + `\\____)`\\__,_)(____/ Verzió: 0.5 +.P +A \fBcas\fR egy program az aMule online-aláírás fájl tartamlának megjelenítésére a képernyõn. +.SS OPCIÓK: +.TP +\fB\-o\fR +Online-aláírás képet készít. +.TP +\fB\-p\fR +HTML oldal a statisztikákkal és képpel. +.TP +\fB\-h\fR, \fB\-\-help\fR +Rövid használati útmutató. +.P +Opciók nélkül kiírja az online-aláírás fájl tartalmát az stdout-ra. +.SH FÁJLOK +~/.aMule/casrc +.br +stat.png +.br +tmp.html +.SH ÍRÓ +A \fBcas\fR-t Pedro de Oliveira készítette. +.SH HIBÁK JELENTÉSE +A hibákat kérjük vagy a fórumon (\fIhttp://forum.amule.org/\fR), vagy a hibakövetõben (\fIhttp://bugs.amule.org/\fR) jelentsék. +Hibákról kérjük ne írjanak levelet (e-mail-t) se a levelzési listára, se közvetlenül valamelyik fejlesztõnek. +.SH COPYRIGHT +Az aMule és az összes hozzá tartozó segédprogram a GNU General Public Licence védelme alatt áll. +.SH LÁSD MÉG +\fBamule\fR(1), \fBwxcas\fR(1) +.SH MAGYAR FORDÍTÁS +Dévai Tamás diff --git a/src/utils/cas/functions.c b/src/utils/cas/functions.c new file mode 100644 index 00000000..172865a0 --- /dev/null +++ b/src/utils/cas/functions.c @@ -0,0 +1,311 @@ +/* + * Name: Shared functions + * + * Purpose: Functions that are used various times in cas + * + * Author: Pedro de Oliveira + * + * Copyright (C) 2004 by Pedro de Oliveira + * + * This file is part of aMule. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include + + +/* XXX This needs to be replaced so that we use + * autoconf to detect the target OS -- As of now + * it should compile fine in other non UNIX-like + * platforms, at the expense of only being sure + * that UNIX-specific code will be compiled if + * using GCC (which defines those __unix__ macros) + * autoconf defines should be in place to test for + * functions like getpwuid() in UNIX-like systems + * instead of doing this... + */ + +#ifdef __APPLE__ + #include + #define CAS_DIR_SEPARATOR "/" +#elif defined(__WIN32__) + #define COBJMACROS + #include + #include + #include + #define CAS_DIR_SEPARATOR "\\" +#else + #define CAS_DIR_SEPARATOR "/" + #if defined(unix) || defined(__unix__) || defined(__unix) + #include + #include + #include + #define CAS_UNIX + #endif +#endif + +/* try (hard) to get correct path for aMule signature + * !! it's caller's responsibility to free return value + */ + +char *get_path(const char *file) +{ + char *ret; /* caller should free return value */ + static char *saved_home = NULL; + static size_t home_len = 0; + + if (saved_home == NULL) { +#ifdef __APPLE__ + + char home[PATH_MAX]; + home[0] = '\0'; + + FSRef fsRef; + if (FSFindFolder(kUserDomain, kApplicationSupportFolderType, kCreateFolder, &fsRef) == noErr) { + CFURLRef urlRef = CFURLCreateFromFSRef(NULL, &fsRef); + if (urlRef != NULL) { + if (CFURLGetFileSystemRepresentation(urlRef, true, home, sizeof(home))) { + strcat(home, CAS_DIR_SEPARATOR "aMule"); + } + CFRelease(urlRef) ; + } + } + +#elif defined(__WIN32__) + + LPITEMIDLIST pidl; + char home[MAX_PATH]; + home[0] = '\0'; + + HRESULT hr = SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl); + + if (SUCCEEDED(hr)) { + if (SHGetPathFromIDList(pidl, home)) { + strcat(home, CAS_DIR_SEPARATOR "aMule"); + } + } + + if (pidl) { + LPMALLOC pMalloc; + SHGetMalloc(&pMalloc); + if (pMalloc) { + IMalloc_Free(pMalloc, pidl); + IMalloc_Release(pMalloc); + } + } + + +#else + char *home; + + /* get home directory */ + if ( (home = getenv("HOME")) == NULL) { +#ifndef CAS_UNIX + return NULL; +#else + /* if $HOME is not available try user database */ + uid_t uid; + struct passwd *pwd; + + uid = getuid(); + pwd = getpwuid(uid); + endpwent(); + + /* XXX + * Section 6.5.14 of ANSI C specs (grab C99 at http://www.nirvani.net/docs/ansi_c.pdf) + * states this: + * "Unlike the bitwise | operator, the || operator _guarantees_ left-to-right + * evaluation; there is a sequence point after the evaluation of the first + * operand. If the first operand compares unequal to 0, the second operand + * _is not evaluated_." + * + * I'm going to revert it and wait until Jacobo or whoever changed it + * screams loudly, tries to kill me, and explains why this has to be + * this way. Maybe pre-ansi compilers? Doubtful. + * + * - Unleashed + */ + if (pwd == NULL || pwd->pw_dir == NULL) + return NULL; + + home = pwd->pw_dir; +#endif /* CAS_UNIX */ + } + strcat(home, CAS_DIR_SEPARATOR ".aMule"); + +#endif /* !__APPLE__ && !__WIN32__ */ + + /* save the result for future calls */ + home_len = strlen(home); + if ( (saved_home = strdup(home)) == NULL) + return NULL; + } + + /* get full path space */ + + /* Unleashed - Guys... you broke this and it was OK + * "+ 2" means "plus '/' and '\0'" + */ + ret = malloc((home_len + strlen(file) + 2) * sizeof(char)); + if (ret == NULL) + return NULL; + + strcpy(ret, saved_home); + ret[home_len] = CAS_DIR_SEPARATOR[0]; + ret[home_len+1] = '\0'; + strcat(ret, file); + /* the string is guaranteed to be null-terminated + * so no need to do this... + * ret[total_len] = '\0'; + */ + + return ret; +} + +char *get_amule_path(const char *file, int force_directory, const char *cmdline_path) +{ + char *path; + + if (!cmdline_path) { + return get_path(file); + } + + if ((path = malloc(strlen(cmdline_path) + strlen(file) + 2)) == NULL) { + return NULL; + } + + strcpy(path, cmdline_path); + if (force_directory) { + if (path[strlen(path) - 1] != CAS_DIR_SEPARATOR[0]) { + strcat(path, CAS_DIR_SEPARATOR); + } + strcat(path, file); + } else { + if (path[strlen(path) - 1] == CAS_DIR_SEPARATOR[0]) { + strcat(path, file); + } + } + + return path; +} + +/* + * this function is used to convert bytes to any other unit + * nicer to the eye. + * + * return "Bad format" if could not convert string + */ +char *convbytes(char *input) +{ + char *units[] = { "Bytes", "KB", "MB", "GB", "TB", "PB" }; + char *endptr; + static char output[50]; + float bytes; + unsigned int i = 0; + + /* do proper conversion and check for errors */ + errno = 0; + bytes = (float) strtod(input, &endptr); + + /* check bad string conversion or value out of range */ + if (*endptr != '\0' || errno == ERANGE) + return "Bad format"; + + /* this loop converts bytes and sets i to the appropriate + * index in 'units' array + * note: sizeof(units) / sizeof(char*) is the number of + * elements in 'units' array + */ + for (; i < (sizeof(units) / sizeof(char *)) - 1; i++) { + if (bytes < 1024) + break; + bytes /= 1024; + } + + snprintf(output, 50, "%.2f %s", bytes, units[i]); + + return output; +} + +void replace(char *tmpl, const char *search, const char *to_replace) +{ + char *dest = NULL; + char *retStr = NULL; + int befLen,srchLen,repLen,totLen; + + /* returning the 'tmpl' if 'search' is NULL */ + if (NULL == tmpl || NULL == search) /* || NULL == to_replace) */ + { + return; + } + + while (1) + { + /* if 'search' is found in 'tmpl' */ + retStr = strstr(tmpl, search); + if (NULL == retStr) + { + return; + } + + totLen = strlen(tmpl); + befLen = (int)(retStr - tmpl); + srchLen = strlen(search); + repLen = strlen(to_replace); + + /* dynamic buffer creation... */ + dest = (char*)malloc(totLen + 1 + repLen - srchLen); + if (NULL == dest) + return; + + /* copy the before buffer */ + strncpy(dest, tmpl, befLen); + /* copy the replace string */ + memcpy((dest+befLen), to_replace, repLen); /* strcat(dest, to_replace); */ + /* copy the after buffer */ + memcpy((dest+befLen+repLen), &tmpl[befLen + srchLen], strlen(&tmpl[befLen + srchLen])); /*strcat(dest, &tmpl[befLen + repLen]); */ + + /* now replace the template string with the resulting and search it again */ + strcpy(tmpl, dest); + /* we need this, because we're modifying the 'tmpl' instead of creating a new one (so we need to update the position of the null char) */ + tmpl[totLen - srchLen + repLen] = '\0'; + /* clean up... */ + free(dest); + } +} + +char *timeconv(char *input) +{ + int count = atoi(input); + static char ret[50]; + + if (count < 0) + snprintf (ret,50,"?"); + else if (count < 60) + snprintf (ret,50,"%02i %s", count, "secs" ); + else if (count < 3600) + snprintf (ret,50,"%i:%02i %s", count/60, (count % 60), "mins" ); + else if (count < 86400) + snprintf (ret,50,"%i:%02i %s", count/3600, (count % 3600)/60, "h" ); + else + snprintf (ret,50,"%i %s %02i %s", count/86400, "D" , (count % 86400) / 3600, "h" ); + + return (ret); +} diff --git a/src/utils/cas/functions.h b/src/utils/cas/functions.h new file mode 100644 index 00000000..05784e9a --- /dev/null +++ b/src/utils/cas/functions.h @@ -0,0 +1,38 @@ +/* + * Name: Shared functions + * + * Purpose: Functions that are used various times in cas + * + * Author: Pedro de Oliveira + * + * Copyright (C) 2004 by Pedro de Oliveira + * + * This file is part of aMule. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +*/ + +#ifndef CAS_FUNCTIONS_H +#define CAS_FUNCTIONS_H + +char *get_path(const char *file); +char *get_amule_path(const char *file, int force_directory, const char *cmdline_path); +char *convbytes(char *input); +char *timeconv(char *input); +void replace(char *tmpl, const char *search, const char *replace); + +#endif +/* // File_checked_for_headers */ diff --git a/src/utils/cas/graphics.c b/src/utils/cas/graphics.c new file mode 100644 index 00000000..a263f63d --- /dev/null +++ b/src/utils/cas/graphics.c @@ -0,0 +1,101 @@ +/* + * Name: Graphics functions + * + * Purpose: All the functions that are used to create the Online Signature Image + * + * Author: Pedro de Oliveira + * + * Copyright (C) 2004 by Pedro de Oliveira + * + * This file is part of aMule. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +*/ + + +#ifdef __GD__ + +#include + +#include + +#include "functions.h" +#include "configfile.h" +#include "graphics.h" + +/* + * this is the funcion that writes the text to the image. + * almost everything is taken from libgd examples + */ +int createimage(CONF *config, char *lines[IMG_TEXTLINES], char *path_for_picture) +{ + FILE *in, *out; + char *path; + gdImagePtr im; + int white, i; + int brect[8]; + + if ( (in = fopen(config->font, "r")) == NULL) { + perror("font not found\ncheck casrc\n"); + return 0; + } + fclose(in); + + if ( (in = fopen(config->source, "rb")) == NULL) { + perror("source_image not found\ncheck casrc\n"); + return 0; + } + + im = gdImageCreateFromPng(in); + white = gdImageColorResolve(im, 255, 255, 255); + + for (i = 0; i <= (IMG_TEXTLINES - 1); i++) { + if (config->enabled[i] == 1) + gdImageStringFT(im, &brect[0], white, config->font, config->size, + 0.0, config->x[i], config->y[i], lines[i]); + } + + if (config->img_type==0) { + path = get_amule_path("aMule-online-sign.png", 0, path_for_picture); + } else { + path = get_amule_path("aMule-online-sign.jpg", 0, path_for_picture); + } + + if (path == NULL && config->img_type==0) { + perror("could not get PNG path\n"); + return 0; + } else if (path == NULL) { + perror("could not get JPG path\n"); + return 0; + } + out = fopen(path, "w"); + free(path); + + if (config->img_type==0) { + gdImagePng(im, out); + } else { + gdImageJpeg(im, out, -1); + } + + fclose(out); + printf("Online Signature picture created.\n"); + gdImageDestroy(im); + + return 1; +} + +#endif + diff --git a/src/utils/cas/graphics.h b/src/utils/cas/graphics.h new file mode 100644 index 00000000..0f4b8c9c --- /dev/null +++ b/src/utils/cas/graphics.h @@ -0,0 +1,35 @@ +/* + * Name: Graphics functions + * + * Purpose: All the functions that are used to create the Online Signature Image + * + * Author: Pedro de Oliveira + * + * Copyright (C) 2004 by Pedro de Oliveira + * + * This file is part of aMule. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +*/ + +#ifndef CAS_GRAPHICS_H +#define CAS_GRAPHICS_H + + +int createimage(CONF *config, char *lines[7], char *path_for_picture); + +#endif +/* // File_checked_for_headers */ diff --git a/src/utils/cas/html.c b/src/utils/cas/html.c new file mode 100644 index 00000000..3f9fbfa8 --- /dev/null +++ b/src/utils/cas/html.c @@ -0,0 +1,133 @@ +/* + * Name: HTML creation functions + * + * Purpose: Create a nice HTML page with all the statistics + * + * Author: Pedro de Oliveira + * + * Copyright (C) 2004 by Pedro de Oliveira + * + * This file is part of aMule. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + + +#include +#include +#include +#include +#include +#include +#include + +#include "html.h" +#include "functions.h" +#include "version.h" + +int create_html(char *stats[20], char *lines[6], char template[120], char *path_for_html) +{ + /* Strings */ + char *path = NULL; + char version[25], upload[25], download[25]; + char *search[] = {"#VERSION#", "#CLIENT#", "#NICK#", "#UPLOADRATE#" , + "#DOWNLOADRATE#" , "#QUEUE#" , "#NUMSHARE#" , "#SESSIONUP#" , + "#SESSIONDOWN#" , "#TOTALUP#", "#TOTALDOWN#" , "#SERVER#" , "#IP#", + "#PORT#" }; + + snprintf(version, 25, "cas %s", CAS_VERSION); + snprintf(upload, 25, "%s kB/s", stats[7]); + snprintf(download, 25, "%s kB/s", stats[6]); + + char *repl[] = { version , lines[0] , stats[10] , upload , download , + stats[8] , stats[9] , stats[15] , stats[14] , stats[12] , stats[11] , + stats[1] , stats[2] , stats[3] }; + + /* get some memory to read the template into */ + int fdTmpl; + if ((fdTmpl = open(template, O_RDONLY)) < 0) + { + printf("\n\n%s\n",template); + perror("Could not open file"); + exit (43); + } + + struct stat sb; + if (fstat(fdTmpl, &sb) < 0) + { + perror("Could not stat file"); + exit(43); + } + close(fdTmpl); + + /* 2 times the size of the template should be enough */ + /* st_size is defined as off_t, but size_t seems more reasonable */ + size_t size = sb.st_size*2; + char *mem = calloc(size, 1); + if (NULL == mem) + { + perror("Could not calloc\n"); + exit(44); + } + + /* read the template into the memory */ + size_t len = 0; + int ler; + FILE *fTmpl = fopen(template,"r"); + while ((ler=fgetc(fTmpl)) != EOF && len+1 < size) + { + mem[len++] = ler; + } + fclose(fTmpl); + + /* printf ("HTML: %s\n", mem); */ + + int t; + for (t=0; t<=13; t++) + { + /* replace the special tags */ + replace(mem, search[t], repl[t]); + } + + /* printf("FINAL: %s\n",mem); */ + + path = get_amule_path("aMule-online-sign.html", 0, path_for_html); + + if (NULL == path) + { + perror("could not get the HTML path\n"); + free(mem); + return 0; + } + + FILE *fHTML = NULL; + if ((fHTML = fopen(path, "w")) == NULL) + { + perror("Unable to create file\n"); + free(path); + free(mem); + exit(44); + } + free(path); + + fprintf(fHTML, "%s", mem); + fclose(fHTML); + free(mem); + + printf("HTML file created.\n"); + + return 1; +} diff --git a/src/utils/cas/html.h b/src/utils/cas/html.h new file mode 100644 index 00000000..93548fc5 --- /dev/null +++ b/src/utils/cas/html.h @@ -0,0 +1,35 @@ +/* + * Name: HTML creation functions + * + * Purpose: Create a nice HTML page with all the statistics + * + * Author: Pedro de Oliveira + * + * Copyright (C) 2004 by Pedro de Oliveira + * + * This file is part of aMule. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef CAS_HTML_H +#define CAS_HTML_H + +int create_html(char *stats[20], char *lines[6], char template[120], char *path_for_html); + +#endif + +/* // File_checked_for_headers */ diff --git a/src/utils/cas/lines.c b/src/utils/cas/lines.c new file mode 100644 index 00000000..c6cdeb60 --- /dev/null +++ b/src/utils/cas/lines.c @@ -0,0 +1,72 @@ +/* + * This file is part of aMule. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include + +#include "lines.h" + +void CreateLine(char *lines[], int line, const char *format, ...) +{ + /* Guess we need no more than 80 bytes. */ + int n, size = 100; + char *p; + va_list ap; + if ((p = malloc(size)) == NULL) { + lines[line] = NULL; + return; + } + while (1) { + /* Try to print in the allocated space. */ + va_start(ap, format); + n = vsnprintf(p, size, format, ap); + va_end(ap); + /* If that worked, set the line. */ + if (n > -1 && n < size) { + lines[line] = p; + return; + } + /* Else try again with more space. */ + if (n > -1) /* glibc 2.1 */ + size = n+1; /* precisely what is needed */ + else /* glibc 2.0 */ + size *= 2; /* twice the old size */ + if ((p = realloc(p, size)) == NULL) { + lines[line] = NULL; + return; + } + } +} + +void AppendToLine(char *lines[], int line, const char *text) +{ + /* Are we trying to append to an empty line? */ + if (lines[line] == NULL) + CreateLine(lines, line, text); + else { + /* Calculate the new required size... */ + int size = strlen(lines[line]) + strlen(text) + 1; + if ((lines[line] = realloc(lines[line], size)) == NULL) + return; + /* ... and append the new text. */ + strcat(lines[line], text); + } +} diff --git a/src/utils/cas/lines.h b/src/utils/cas/lines.h new file mode 100644 index 00000000..0c607ae6 --- /dev/null +++ b/src/utils/cas/lines.h @@ -0,0 +1,27 @@ +/* + * This file is part of aMule. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef CAS_LINES_H +#define CAS_LINES_H + +void CreateLine(char *lines[], int line, const char *format, ...); +void AppendToLine(char *lines[], int line, const char *text); + +#endif +/* // File_checked_for_headers */ diff --git a/src/utils/cas/stat.png b/src/utils/cas/stat.png new file mode 100644 index 0000000000000000000000000000000000000000..fdedeb90dda8951cb8c599da269004783bf5b1ff GIT binary patch literal 133318 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 oXA8u1|2X`)e7?t!qXPl>7mx~<>3Ri_@% literal 0 HcwPel00001 diff --git a/src/utils/cas/tmp.html b/src/utils/cas/tmp.html new file mode 100644 index 00000000..64644372 --- /dev/null +++ b/src/utils/cas/tmp.html @@ -0,0 +1,199 @@ + + + + Info Page (generated by #VERSION#) + + + + +
+ + + + + + +
+ + + + + + + + + +
+ + + aMule Statistics Info Page generated by #VERSION# +
+
+ + General
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Client
+
#CLIENT#
+
Nick
+
#NICK#
+
Upload Rate
+
#UPLOADRATE#
+
Download Rate
+
#DOWNLOADRATE#
+
Queue
+
#QUEUE#
+
Shared Files#NUMSHARE#
+ + + + + + + + + + + +
+ + + Session Upload #SESSIONUP#
Session Download#SESSIONDOWN#
+ + + + + + + + + + + +
+ Total Upload#TOTALUP#
Total Download#TOTALDOWN#
+ + + + + + + + + +

+
+ + Server
+ + + + + + + + + + + + + + + +
Server Name
+
#SERVER#
+
Server Addres
+
#IP#:#PORT#
+
ED2K Link
+
+ + + ed2k://|server|#IP#|#PORT#|/
+
+ + + + + + + + + +

+
+ Signature (Background Graphic by uberpenguin)
+ IMAGE
+ + + + + + + + +
(the +design was taken from Blacklotus Online Sig)
+ +
+ + diff --git a/src/utils/cas/version.h b/src/utils/cas/version.h new file mode 100644 index 00000000..02770c8a --- /dev/null +++ b/src/utils/cas/version.h @@ -0,0 +1,31 @@ +/* + * Name: cas version + * + * Purpose: Just used to define cas version + * + * Author: Pedro de Oliveira + * + * Copyright (C) 2004 by Pedro de Oliveira + * + * This file is part of aMule. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +*/ + +#ifndef CAS_VERSION +#define CAS_VERSION "0.8" +#endif +/* // File_checked_for_headers */ diff --git a/src/utils/mkFileSum.c b/src/utils/mkFileSum.c new file mode 100644 index 00000000..84cdefdd --- /dev/null +++ b/src/utils/mkFileSum.c @@ -0,0 +1,388 @@ +/* + * This file is part of the aMule project. + * + * Copyright (c) 2003-2008 aMule Project ( admin@amule.org / http://www.amule.org ) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* + * This program generates an md5sum from a C/C++ source file. + * Basic preprocessing is applied to the source (comment removal, + * whitespace normalization), so only real code change will result + * in md5sum change. + * + * Preprocessor code is written by Dévai Tamás (gonosztopi@amule.org) + * md5 code is taken from src/MD5Sum.cpp + * + * Usage: the program takes input from stdin and places output to stdout. + * This behaviour cannot be altered. + */ + +#include +#include + +typedef unsigned char *POINTER; +typedef uint16_t UINT2; +typedef uint32_t UINT4; + +typedef struct { + UINT4 state[4]; + UINT4 count[2]; + unsigned char buffer[64]; +} MD5_CTX; + +void MD5Init(MD5_CTX *); +void MD5Update(MD5_CTX *, const unsigned char *, unsigned int); +void MD5Final(unsigned char [16], MD5_CTX *); + + +const int table[][9] = { + { 0x0206, 0x0206, 0x0008, 0x0100, 0x0101, 0x0102, 0x000e, 0x0100, 0x00ff }, + { 0x0101, 0x0101, 0x0101, 0x0101, 0x0100, 0x0101, 0x010b, 0x0101, 0x00ff }, + { 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0100, 0x010c, 0x0102, 0x00ff }, + { 0x0003, 0x0003, 0x0003, 0x0009, 0x0003, 0x0003, 0x0003, 0x0003, 0x00ff }, + { 0x0006, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x00ff }, + { 0x0206, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x00ff }, + { 0x0006, 0x0006, 0x0007, 0x0100, 0x0101, 0x0102, 0x000d, 0x0100, 0x00ff }, + { 0x0606, 0x0606, 0x0004, 0x000f, 0x0401, 0x0402, 0x050a, 0x0400, 0x04ff }, + { 0x0606, 0x0606, 0x0005, 0x0003, 0x0401, 0x0402, 0x050a, 0x0400, 0x04ff }, + { 0x0003, 0x0003, 0x0000, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x00ff }, + { 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x00ff }, + { 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x00ff }, + { 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x00ff }, + { 0x0006, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x00ff }, + { 0x0206, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x00ff }, + { 0x000f, 0x000f, 0x000f, 0x0010, 0x000f, 0x000f, 0x000f, 0x000f, 0x00ff }, + { 0x000f, 0x000f, 0x0006, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x00ff } +}; + +int GetCharCode(int c) +{ + if (c == '\r' || c == '\n') return 0; + if (c == ' ' || c == '\t') return 1; + if (c == '/') return 2; + if (c == '*') return 3; + if (c == '\"') return 4; + if (c == '\'') return 5; + if (c == '\\') return 6; + if (c == EOF) return 8; + return 7; +} + +int main() +{ + int c; + int state = 0; + MD5_CTX context; + unsigned char digest[16]; + unsigned char buffer[1024]; + int count = 0; + + MD5Init(&context); + + while (state != 0x00ff) { + c = getchar(); + state = table[state][GetCharCode(c)]; + if (state & 0x0800) { + buffer[count++] = '\\'; + } + if (state & 0x0400) { + buffer[count++] = '/'; + } + if (state & 0x0200) { + buffer[count++] = ' '; + } + if (state & 0x0100) { + buffer[count++] = c; + } + state &= 0x00ff; + if (count > 1020) { + MD5Update(&context, buffer, count); + count = 0; + } + } + MD5Update(&context, buffer, count); + MD5Final(digest, &context); + for (count = 0; count < 16; count++) printf("%02x", digest[count]); + putchar('\n'); + return 0; +} + + +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + +static void MD5Transform (UINT4 [4], const unsigned char [64]); +static void Encode (unsigned char *, UINT4 *, unsigned int); +static void Decode (UINT4 *, const unsigned char *, unsigned int); +static void MD5_memcpy (POINTER, POINTER, unsigned int); +static void MD5_memset (POINTER, int, unsigned int); + +static unsigned char PADDING[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* F, G, H and I are basic MD5 functions. + */ +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +/* ROTATE_LEFT rotates x left n bits. + 15-April-2003 Sony: use MSVC intrinsic to save some cycles + */ +#ifdef _MSC_VER +#pragma intrinsic(_rotl) +#define ROTATE_LEFT(x, n) _rotl((x), (n)) +#else +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) +#endif + +/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. +Rotation is separate from addition to prevent recomputation. +*/ +/* Defines must be on one line to work with GCC-2.95.3 */ +#define FF(a, b, c, d, x, s, ac) { (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } +#define GG(a, b, c, d, x, s, ac) { (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } +#define HH(a, b, c, d, x, s, ac) { (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } +#define II(a, b, c, d, x, s, ac) { (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } + +/* MD5 initialization. Begins an MD5 operation, writing a new context. + */ +void MD5Init (MD5_CTX *context) +{ + context->count[0] = context->count[1] = 0; + /* Load magic initialization constants. +*/ + context->state[0] = 0x67452301; + context->state[1] = 0xefcdab89; + context->state[2] = 0x98badcfe; + context->state[3] = 0x10325476; +} + +/* MD5 block update operation. Continues an MD5 message-digest + operation, processing another message block, and updating the + context. + */ +void MD5Update (MD5_CTX *context, const unsigned char *input, unsigned int inputLen) +{ + unsigned int i, index, partLen; + + /* Compute number of bytes mod 64 */ + index = (unsigned int)((context->count[0] >> 3) & 0x3F); + + /* Update number of bits */ + if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3)) { + context->count[1]++; + } + context->count[1] += ((UINT4)inputLen >> 29); + partLen = 64 - index; + + /* Transform as many times as possible. */ + if (inputLen >= partLen) { + MD5_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen); + MD5Transform (context->state, context->buffer); + + for (i = partLen; i + 63 < inputLen; i += 64) { + MD5Transform (context->state, &input[i]); + } + index = 0; + } else { + i = 0; + } + /* Buffer remaining input */ + MD5_memcpy((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen-i); +} + +/* MD5 finalization. Ends an MD5 message-digest operation, writing the + * the message digest and zeroizing the context. + */ +void MD5Final (unsigned char digest[16], MD5_CTX *context) +{ + unsigned char bits[8]; + unsigned int index, padLen; + + /* Save number of bits */ + Encode (bits, context->count, 8); + + /* Pad out to 56 mod 64. */ + index = (unsigned int)((context->count[0] >> 3) & 0x3f); + padLen = (index < 56) ? (56 - index) : (120 - index); + MD5Update (context, PADDING, padLen); + + /* Append length (before padding) */ + MD5Update (context, bits, 8); + /* Store state in digest */ + Encode (digest, context->state, 16); + + /* Zeroize sensitive information.*/ + MD5_memset ((POINTER)context, 0, sizeof (*context)); +} + +/* MD5 basic transformation. Transforms state based on block. + */ +static void MD5Transform (UINT4 state[4], const unsigned char block[64]) +{ + UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; + + Decode (x, block, 64); + + /* Round 1 */ + FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ + GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ + HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ + HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ + II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + /* Zeroize sensitive information. + */ + MD5_memset ((POINTER)x, 0, sizeof (x)); +} + +/* Encodes input (UINT4) into output (unsigned char). Assumes len is + a multiple of 4. + */ +static void Encode (unsigned char *output, UINT4 *input, unsigned int len) +{ + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) { + output[j] = (unsigned char)(input[i] & 0xff); + output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); + output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); + output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); + } +} + +/* Decodes input (unsigned char) into output (UINT4). Assumes len is + a multiple of 4. + */ +static void Decode (UINT4 *output, const unsigned char *input, unsigned int len) +{ + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) + output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) | + (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24); +} + +/* Note: Replace "for loop" with standard memcpy if possible. + */ + +static void MD5_memcpy (POINTER output, POINTER input, unsigned int len) +{ + unsigned int i; + + for (i = 0; i < len; i++) + output[i] = input[i]; +} + +/* Note: Replace "for loop" with standard memset if possible. + */ +static void MD5_memset (POINTER output, int value, unsigned int len) +{ + unsigned int i; + + for (i = 0; i < len; i++) + ((char *)output)[i] = (char)value; +} diff --git a/src/utils/scripts/denoiser.rules b/src/utils/scripts/denoiser.rules new file mode 100644 index 00000000..052f5912 --- /dev/null +++ b/src/utils/scripts/denoiser.rules @@ -0,0 +1,418 @@ +# This file is part of the aMule project. +# +# Copyright (c) 2003-2008 aMule Project ( admin@amule.org / http://www.amule.org ) +# Copyright (c) 2006-2008 Dévai Tamás aka GonoszTopi +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +# + +# The sed script is tested with GNU sed versions 3.02, 4.1.2 +# The generated Makefiles are tested with GNU make versions 3.79.1, 3.80 + + +# Denoising levels: +# +# 0 - do nothing, handled outside the scope of this script. +# +# 1 - only strip Makefiles from comments and empty lines, this should +# theoretically speed up 'make', although not as much that you could +# notice it. +# +# 2 - leave directory change messages from make, but silence normal +# command printing. No echo denoising at this level. +# +# 3 - silence all messages from make, and partial echo denoising. +# +# 4 - full denoising: +# * silence all messages from make +# * full echo denoising +# * compiler warning suppression + + +# Syntax of this file: +# +# This file gets preprocessed, all comments and empty lines removed. The +# preprocessor understands '#if ', '#else' and '#endif' commands, as long +# as they start on the first character on the line. No whitespace is +# allowed before the commands. Note that the space character after #if is +# part of the command, if it is replaced by a tab then it won't make a +# command anymore! +# +# #if truth testing: +# +# #if currently understands only one keyword: 'level', followed by a number +# - the current denoising level. There may be any arbitrary characters +# between the keyword and the value - i.e. 'levels 2,3' will also match +# when 'level 3' matches. +# +# #if preprocessor commands may be nested for at least 4000 levels deep :-) +# +# The preprocessor script can be found at the end of this file. + + +# ----- now the code ----- + +# suppress messages from make + +#if levels 3,4 +1 i\ +MAKEFLAGS=-s --no-print-directory +#endif + +#if level 2 +1 i\ +MAKEFLAGS=-w -s +#endif + + +#if levels 2,3,4 +:0 +#endif + + +# delete comments +/^#/ { + d +} + +# delete empty lines +/^[ ]*$/ { + d +} + + +# rewrite compiler flags +#if level 4 +/=/ { + /^[^=]*CFLAGS/ b 8 + /^[^=]*CPPFLAGS/ b 8 + /^[^=]*CXXFLAGS/ b 8 + b 9 + :8 + # save -Wl, -Wa, and -Wp, flags, they're for linker, assember and preprocessor respectively + s/ -Wl,/ -%l,/g + s/ -Wa,/ -%a,/g + s/ -Wp,/ -%p,/g + + # delete all -W flags + / -W/ s/ -W[^ ]*//g + + # insert -w flag, if it isn't already in the flags + / -w/! s/=/= -w/ + + # restore -Wl, -Wa, and -Wp, flags + s/ -%l,/ -Wl,/g + s/ -%a,/ -Wa,/g + s/ -%p,/ -Wp,/g + :9 +} +#endif + + +# rewrite rules +#if levels 2,3,4 +# all rules contain ':' and start at the very beginning of the line +/^[^ ].*:/ { + # no rules contain '=', so just skip these lines + /=/ b + + # save rule target in secondary buffer + h + s/\([^:][^:]*\):.*/\1/ + x + + # skip continuation lines + :1 + /\\$/ { + n + b 1 + } + + # process rule commands + :2 + n + :3 + + # delete comments inside rules + /^#/ { + s/.*// + N + s/\n//g + b 3 + } + + # if the current line is empty or not anymore a command, parse as usual + /^$/ b 0 + /^[^ ]/ b 0 + + x + /^\n/ b 5 + + # skipping install-strip target, since it will trigger the echo-denoiser, + # and would silence the whole installation, which is abolutely not wanted + /^install-strip$/ { + s/.*// + x + b 0 + } + + # do some output based on rule target + /\.o$/ { + i\ + echo "Compiling $(/ { + g + s/[^\n]*// + x + s/\n.*// + b 6 + } + g + s/[^\n]*// + x + s/\n.*// + s/\(.*echo[^;][^;]*\)\(.*\)/\1>\/dev\/null\2/ + :6 + } +#endif (levels 3,4) + + # mkinstalldirs will also echo its job, sink its output too + /$(mkinstalldirs)/ { + G + h + s/\($(mkinstalldirs)[^;][^;]*\).*/\1/ + # do not redirect if it's already redirected + />/ { + g + s/[^\n]*// + x + s/\n.*// + b 7 + } + g + s/[^\n]*// + x + s/\n.*// + s/\(.*$(mkinstalldirs)[^;][^;]*\)\(.*\)/\1>\/dev\/null\2/ + :7 + } + +#if level 4 + # the above applies to msgfmt, but here it's enough to remove the '--statistics' flag + /$(GMSGFMT)/ s/--statistics// + + # msgmerge needs a --silent flag + s/$(MSGMERGE)/\0 --silent/ + s/$(MSGMERGE_UPDATE)/\0 --silent/ +#endif + + # the following two ruleset must be the last two in this block and in this order! + +#if levels 3,4 + # uninstallation + /^[ ]*rm -f[^;]*$(DESTDIR)/ { + x + /uninstall/ { + H + g + s/.*rm -f[^;]*$(DESTDIR)\([^;" ][^;" ]*\).*/ echo "Uninstalling \1"; \\/ + P + g + s/[^\n]*// + x + s/\n.*// + # skip checking for install: 1) trivially false 2) uninstall would match /install/ + b 2 + } + x + } + + # installation + /^[ ]*$([^)]*INSTALL/ { + x + /install/ { + H + g + s/.*$(DESTDIR)\([^;" ][^;" ]*\).*/ echo "Installing \1"; \\/ + P + g + s/[^\n]*// + x + s/\n.*// + b 2 + } + x + } +#endif (levels 3,4) + + b 2 +} +#endif (levels 2,3,4) + + +# ---- the preprocessor ---- + +## default processing mode is 'true' +#1 { +# x +# s/.*/1/ +# x +#} +# +## delete empty lines +#/^[ ]*$/ d; +# +## look for "#if " +#/^#if / { +# /level.*$level/ { +# x +# s/^/1/ +# x +# b0 +# } +# x +# s/^/0/ +# x +# :0 +# d +#} +# +## process "#else" +#/^#else/ { +# x +# /^1/ { +# s/1/0/ +# b1 +# } +# s/0/1/ +# :1 +# x +# d +#} +# +## check for "#endif" +#/^#endif/ { +# x +# s/.// +# x +# d +#} +# +## delete comments +#/^[ ]*#/ d +# +## process code lines according to #if/#else/#endif +#x +#/^1/ { +# x +# b +#} +#x +#d diff --git a/src/utils/scripts/id2ip b/src/utils/scripts/id2ip new file mode 100755 index 00000000..1b27405d --- /dev/null +++ b/src/utils/scripts/id2ip @@ -0,0 +1,75 @@ +#!/usr/bin/awk -f + +# This file is part of the aMule project. +# +# Copyright (c) 2003-2008 aMule Project ( admin@amule.org / http://www.amule.org ) +# Copyright (c) 2004-2008 xmb ( http://xmb.ath.cx ) +# Copyright (c) 2004-2008 Jacobo Vilella aka Jacobo221 +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +# + +########################################## +# # +# Convert eD2k HighID numbers to IPs # +# # +########################################## +# # +# Original code: xmb # +# Further code improvements: Jacobo221 # +# # +# Contact: IRC @ irc.freenode.net/#awk # +# jacobo221 at @amule dot org # +# # +########################################## +# # +# This code is distributed under terms # +# of the GPL license # +# http://www.gnu.org/copyleft/gpl.html # +# # +########################################## +# # +# Usage: id2ip.awk ID <...> # +# # +########################################## + +BEGIN { + + if (ARGC == 1) { + printf "Usage: id2ip.awk ID <...>\n" + exit + } + + while (num = ARGV[++i]) { + + if (ARGV[i] < 16777216) { + printf "%s -> LowID\n",ARGV[i] + } else if (ARGV[i] > 256*256*256*256) { + printf "%s -> Invalid IP\n",ARGV[i] + } else { + + m = 256 * 256 * 256 + + for (c = 0; m > 0; c++ ) { + IP[c] = int(num / m) + num -= IP[c] * m + m /= 256 + } + + printf "%s -> %d.%d.%d.%d\n", ARGV[i], IP[3], IP[2], IP[1], IP[0] + } + } + +} diff --git a/src/utils/scripts/kadnodescreate.pl b/src/utils/scripts/kadnodescreate.pl new file mode 100755 index 00000000..2b2c827e --- /dev/null +++ b/src/utils/scripts/kadnodescreate.pl @@ -0,0 +1,173 @@ +#!/usr/bin/perl +# + +## This file is part of the aMule Project +## +## Copyright (c) 2006-2008 Angel Vidal (Kry) ( kry@amule.org ) +## Copyright (c) 2006-2008 aMule Project ( http://www.amule-project.net ) +## +## This program is free software; you can redistribute it and/or +## modify it under the terms of the GNU General Public License +## as published by the Free Software Foundation; either +## version 2 of the License, or (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + +use File::Copy; +use warnings; +use strict; + +my $exit_with_help; + +if (!($ARGV[0])) { + print "You must specify at least one ip.\n"; + $exit_with_help = "true"; +} + +if ($exit_with_help) { + die "Usage: kadnodescreate.pl [hash:ip:TCPport:UDPport:type]+\n"; +} + + +print "Creating nodes.dat...\n"; + +#Open the new file +open(MET," > nodes.dat"); +binmode MET; + +my $contactcount = $#ARGV + 1; + +print "\tContacts: " . $contactcount . "\n"; + +print MET &int32_string($contactcount); + +my $contact; +my $hash; +my $ip; +my $tcpport; +my $udpport; +my $type; + +my $contactnumber = 0; +foreach $contact (@ARGV) { + $contactnumber++; + if ($contact =~ /^(.*):(.*):(.*):(.*):(.*)$/) { + + $hash = &check_hash($1); + if ($hash == 0) { + die "Malformed hash, can't continue: " . $1 . "\n"; + } + + $ip = &check_ip($2); + if ($ip == 0) { + die "Malformed ip, can't continue: " . $2 . "\n"; + } + + my $tcpport = &check_port($3); + if ($tcpport == 0) { + die "Malformed tcp port, can't continue: " . $3 . "\n"; + } + + $udpport = &check_port($4); + if ($udpport == 0) { + die "Malformed udp port, can't continue: " . $4 . "\n"; + } + + $type = &check_type($5); + if ($type == 9) { + die "Malformed contact type, can't continue: " . $5 . "\n"; + } + + + print "\t\tAdding Contact " . $contactnumber . ":\n"; + print "\t\t\tHash : " . $1 . "\n"; + print "\t\t\tIP : " . $ip . "\n"; + print "\t\t\tTCPPort : " . $tcpport . "\n"; + print "\t\t\tUDPPort : " . $udpport . "\n"; + print "\t\t\tType : " . $type . "\n"; + + print MET &hash_string($1) . + &int32_string($ip) . + &int16_string($tcpport) . + &int16_string($udpport) . + &byte_string($type); + } else { + die "Malformed contact line, can't continue: " . $contact . "\n"; + } +} + +print "Closing nodes.dat\n\n"; +close(MET); + + +# Functions + +sub check_ip { + my $ipresult = 0; + if ($_[0] =~ /^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/) { + $ipresult = ($1*16777216) + ($2*65536) + ($3*256) + $4; + } + $ipresult; +} + +sub check_port { + my $portresult = 0; + if ($_[0] =~ /^([0-9]{1,5})$/) { + if ($1 < 65535) { + $portresult = $1; + } + } + $portresult; +} + +sub check_type { + my $typeresult = -1; + if ($_[0] =~ /^([0-9])$/) { + $typeresult = $1; + } + $typeresult; +} + +sub check_hash { + my $hashresult = 0; + if ($_[0] =~ /^([A-Z]|[0-9]|[a-z]){32}$/) { + $hashresult = 1; + } + $hashresult; +} + +#Hex write functions + +sub byte_string { + sprintf("%c",$_[0]); +} + +sub int16_string { + &byte_string($_[0] % 256) . &byte_string($_[0] / 256); +} + +sub int32_string { + &int16_string($_[0] % 65536) . &int16_string($_[0] / 65536); +} + +sub int64_string { + &int32_string($_[0] % 4294967296) . &int32_string($_[0] / 4294967296); +} + +sub hash_string { + my $i = 0; + my $final_string = ""; + while ($i < 32) { + $final_string = $final_string . &byte_string(hex(substr($_[0],$i,2))); + $i += 2; + } + $final_string; +} + diff --git a/src/utils/scripts/linkcvs b/src/utils/scripts/linkcvs new file mode 100755 index 00000000..12f30ffa --- /dev/null +++ b/src/utils/scripts/linkcvs @@ -0,0 +1,146 @@ +#!/bin/bash + +# This file is part of the aMule project. +# +# Copyright (c) 2004-2008 aMule Project ( admin@amule.org / http://www.amule.org ) +# Copyright (c) 2004-2008 Jacobo Vilella aka Jacobo221 +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +# + +################################################################### +# # +# linkcvs will link the whole cvs tree to the given path # +# allowing keeping several compilations from a single cvs tree # +# # +# Warning: This script overwrites old files in target_path # +# # +################################################################### +# # +# Script valid as of 4rd June 2004 aMule CVS # +# Suggestions go to Jacobo221 at @amule dot .org # +# # +################################################################### +# # +# This code is distributed under terms of the GPL License # +# http://www.gnu.org/copyleft/gpl.html # +# # +################################################################### +# # +# EXEC is a list of the files which will be called as scripts # +# EXEC_NUMBER is the amount of EXEC files in the list # +# EXEC_PREFIX is the command to prefix the call of the EXEC # +# EXEC_POSTFIX is the command to postfix the call of the EXEC # +# COPY is a list of files which will be copies, not linked # +# Priviledge order (max to min): EXEC, COPY, CVS # +# # +################################################################### + +EXEC_NUMBER=0 +# The follwing four lines were needed for aMule versions previous to 2.0.0 +# EXEC_NUMBER=1 +# EXEC=("autogen.sh") +# EXEC_PREFIX=("original=\`readlink src/SharedFileList.h\` && cp -d --remove-destination \"\$original\" src/ && ") +# EXEC_POSTFIX=("ln -sf \"\$original\" src/SharedFileList.h") +COPY="" + +if [ $# -ne 2 ]; then + echo "`basename $0`: invalid number of arguments" + echo "Try \``basename $0` '" + exit 1 +elif [ ! -e "$1" ]; then + echo "`basename $0`: $1 doesn't exist!" + exit 2 +elif [ ! -d "${1}/CVS" ]; then + echo "`basename $0`: $1 isn't a CVS tree!" + exit 3 +elif [ ! -e "${1}/CVS/Entries" ]; then + echo "`basename $0`: $1 has no Entries file!" + exit 4 +fi + +SOURCE="$1" +TARGET="$2" + +if [ "`echo \"$SOURCE\" | cut -c 1`" != "/" ] && [ "`echo \"$SOURCE\" | cut -c 1`" != "~" ]; then + SOURCE="`pwd`/$SOURCE" +fi +if [ "`echo \"$TARGET\" | cut -c 1`" != "/" ] && [ "`echo \"$TARGET\" | cut -c 1`" != "~" ]; then + TARGET="`pwd`/$TARGET" +fi + +cvs_rec() +{ + local FILES=`cat "${SOURCE}/$1"/CVS/Entries | cut -f 2 -d "/" -s` + # Alternative option would be to place `grep "^D/"` and `grep "^"` + for file in $FILES; do + if [ -d "${SOURCE}/${1}/$file" ]; then + mkdir -p "${TARGET}/${1}/$file" + cvs_rec "${1}/$file" + else + target="${TARGET}/${subfile/$SOURCE}/${1}" + if [ ! -e "${SOURCE}/${1}/$file" ]; then + echo "${SOURCE}/${1}/$file not found!" + else + ln -sf "${SOURCE}/${1}/$file" "$target" + fi + fi + done +} + +if [ ! -e "$TARGET" ]; then + echo -n "$TARGET doesn't exist. Should I create it? [y/n]" + read -s -n 1 opt + if [ $opt = Y -o $opt = y ]; then + echo " Copying..." + mkdir -p "$TARGET" + else + echo "`basename $0`: target_path invalid" + exit 5 + fi +fi + +cvs_rec "" + +for file in $COPY; do + mkdir -p "${TARGET}/`dirname $file`" + for subfile in ${SOURCE}/$file; do + if [ ! -e "$subfile" ]; then + echo "$subfile not found!" + else + # -d --remove-destination is esential for links handling + cp -d --remove-destination "$subfile" "${TARGET}/${subfile/$SOURCE}" + fi + done +done + +i=0 +while [ "$i" -lt "$EXEC_NUMBER" ]; do + mkdir -p "${TARGET}/`dirname $file`" + for subfile in "${SOURCE}"/${EXEC[$i]}; do + if [ ! -e "$subfile" ]; then + echo "$subfile not found!" + else + target="${TARGET}/${subfile/$SOURCE}" + rm -f "$target" # Necessary in case $target is a link + echo ${EXEC_PREFIX[$i]} > "$target" + echo -n "$subfile && " >> "$target" + echo ${EXEC_POSTFIX[$i]} >> "$target" + chmod a+x "$target" + fi + done + i=`expr $i + 1` +done + diff --git a/src/utils/scripts/logfilter b/src/utils/scripts/logfilter new file mode 100755 index 00000000..3f45ab5c --- /dev/null +++ b/src/utils/scripts/logfilter @@ -0,0 +1,58 @@ +#!/usr/bin/python +# +# This file is part of the aMule project. +# +# Copyright (c) 2003-2008 aMule Project ( admin@amule.org / http://www.amule.org ) +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +# +# Usage: +# svn log ... | logfilter [ [ ...]] + +import sys + +line = sys.stdin.readline() +while line: + if not line.strip().startswith("-"): + foundNick = False + for user in sys.argv[1:]: + if user == line.lower().split()[2]: + foundNick = True + break + + if foundNick: + print ("-" * 72) + print line.strip() + + # Check for -q + if line.count("|") > 2: + lineCount = int(line.split("|")[-1].split()[0]) + line = sys.stdin.readline() + + if foundNick: print line.rstrip() + + if line.strip() == "Changed paths:": + line = sys.stdin.readline() + while line.strip(): + if foundNick: print line.rstrip() + line = sys.stdin.readline() + + if foundNick: print + + for i in range(lineCount): + line = sys.stdin.readline() + if foundNick: print line.rstrip() + + line = sys.stdin.readline() diff --git a/src/utils/scripts/mac_packager b/src/utils/scripts/mac_packager new file mode 100755 index 00000000..3b46f4e8 --- /dev/null +++ b/src/utils/scripts/mac_packager @@ -0,0 +1,96 @@ +#!/bin/sh +################################################## +# aMule.app bundle creator. # +################################################## + +## This file is part of the aMule Project +## +## Copyright (c) 2004 Angel Vidal (Kry) ( kry@amule.org ) +## Copyright (c) 2003-2004 aMule Project ( http://www.amule-project.net ) +## +## This program is free software; you can redistribute it and/or +## modify it under the terms of the GNU General Public License +## as published by the Free Software Foundation; either +## version 2 of the License, or (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + + +echo "" +echo -n "Step 1: Cleaning bundle... " +rm aMule.app/Contents/Frameworks/libwx_* aMule.app/Contents/MacOS/* 1> /dev/null 2> /dev/null +rm -r aMule.app/Contents/Resources/webserver 1> /dev/null 2> /dev/null +rm -r aMule.app/Contents/SharedSupport 1> /dev/null 2> /dev/null +echo "Done" +echo "" +echo -n "Step 2: Copying aMule to app bundle... " +cp src/amule aMule.app/Contents/MacOS/ +cp src/webserver/src/amuleweb aMule.app/Contents/MacOS/ +cp src/ed2k aMule.app/Contents/MacOS/ +cp src/amulecmd aMule.app/Contents/MacOS/ +cp -R src/webserver aMule.app/Contents/Resources +find aMule.app/Contents/Resources/webserver \( -name .svn -o -name "Makefile*" -o -name src \) -print0 | xargs -0 rm -rf +echo "Done" +echo "" +echo -n "Step 3: Installing translations to app bundle... " +orig_dir=`pwd` +cd po +make install datadir=$orig_dir/aMule.app/Contents/SharedSupport 1> /dev/null 2> /dev/null +cd $orig_dir +echo "Done" +echo "" +echo "Step 4: Copying libs to Framework" +echo " wxWidgets..." +# wxWidgets libs to frameworks +for i in $( otool -L aMule.app/Contents/MacOS/amule \ + aMule.app/Contents/MacOS/amuleweb \ + aMule.app/Contents/MacOS/ed2k \ + aMule.app/Contents/MacOS/amulecmd \ + | sort -u | grep libwx_ | cut -d " " -f 1 ); do + cp $i aMule.app/Contents/Frameworks; +done +echo "Libs copy done." +echo "" +echo "Step 5: Update libs info" +#then install_name_tool on them to fix the path on the shared lib +cd aMule.app/Contents/ +for i in $( ls Frameworks | grep -v CVS); do + echo " Updating $i" + #update library id + install_name_tool -id @executable_path/../Frameworks/$i Frameworks/$i + #update library links + for j in $( otool -L Frameworks/$i | grep libwx_ | cut -d " " -f 1 ); do + install_name_tool -change \ + $j @executable_path/../Frameworks/`echo $j | rev | cut -d "/" -f 1 | rev` \ + Frameworks/$i 1> /dev/null 2> /dev/null + + done + echo " Updating aMule lib info for $i" + #update amule executable + install_name_tool -change \ + `otool -L MacOS/amule | grep $i | cut -d " " -f 1` \ + @executable_path/../Frameworks/$i MacOS/amule 1> /dev/null 2> /dev/null + install_name_tool -change \ + `otool -L MacOS/amuleweb | grep $i | cut -d " " -f 1` \ + @executable_path/../Frameworks/$i MacOS/amuleweb 1> /dev/null 2> /dev/null + install_name_tool -change \ + `otool -L MacOS/ed2k | grep $i | cut -d " " -f 1` \ + @executable_path/../Frameworks/$i MacOS/ed2k 1> /dev/null 2> /dev/null + install_name_tool -change \ + `otool -L MacOS/amulecmd | grep $i | cut -d " " -f 1` \ + @executable_path/../Frameworks/$i MacOS/amulecmd 1> /dev/null 2> /dev/null +done +echo "Libs info updated, aMule.app is ready to package." +echo "" +cd ../.. +echo -n "Creating aMule.zip... " +zip -9 -r aMule.zip aMule.app/ -j docs/README.Mac.txt docs/COPYING > /dev/null +echo "Done" +echo "" diff --git a/src/utils/scripts/make_store b/src/utils/scripts/make_store new file mode 100755 index 00000000..5a403246 --- /dev/null +++ b/src/utils/scripts/make_store @@ -0,0 +1,5 @@ +### make_store stores the compilation and warning messages on different files +### compilation_messages and warning_messages +### Of course, error go on warning messages... so you can't see the error happening. +#!/bin/sh +make 1>compilation_messages 2>warning_messages diff --git a/src/utils/scripts/mldonkey_importer.pl b/src/utils/scripts/mldonkey_importer.pl new file mode 100755 index 00000000..ad76f981 --- /dev/null +++ b/src/utils/scripts/mldonkey_importer.pl @@ -0,0 +1,404 @@ +#!/usr/bin/perl +# + +## This file is part of the aMule Project +## +## Copyright (c) 2006-2008 Angel Vidal (Kry) ( kry@amule.org ) +## Copyright (c) 2006-2008 aMule Project ( http://www.amule-project.net ) +## +## This program is free software; you can redistribute it and/or +## modify it under the terms of the GNU General Public License +## as published by the Free Software Foundation; either +## version 2 of the License, or (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + +# Gimme a break, is my first perl app... (Kry) + +use File::Copy; +use warnings; +use strict; + +my $exit_with_help; + +if (!($ARGV[0])) { + print "You must specify the mldonkey config folder (usually ~/.mldonkey).\n"; + $exit_with_help = "true"; +} + +if (!($ARGV[1])) { + print "You must specify the aMule temp folder for output.\n"; + $exit_with_help = "true"; +} + +if ($exit_with_help) { + die "Usage: importer2.pl mldonkey_config_folder amule_temp_folder.\n"; +} + + +my $input_folder = $ARGV[0]; + +my $output_folder = $ARGV[1]; + +open(TEST,">" . $output_folder . "/test_file") or die "Unable to write to destination folder! Error: $!\n"; +close(TEST); +unlink($output_folder . "/test_file"); + +open(INFO, $input_folder . "/files.ini") or die "Cannot open input file" . $input_folder . "/files.ini for reading: $!"; # Open the file + +my $line="no"; +while ($line !~ /^\s*files\s*=\s*\[\s*$/) { + $line = ; + if (!($line)) { + die $input_folder . "/files.ini seems not to be a mldonkey files.ini\n"; + } + chop $line; +} + +#We're at the start of the downloading files section. +# Read info for each file. + +my $number = 1; + +while ($line && ($line !~ /^.*};\].*$/)) { + print "Reading info for file $number\n"; + &read_file_info; + print "End reading\n\n"; + $number++; +} + +close(INFO); + +sub read_file_info { + $line = ; + + my @md4_list = (); + my @gap_list = (); + my $file_size = 0; + my $file_name = ""; + my $part_file = ""; + my $md4_hash = ""; + + my $done = "false"; + + while (($line) && ($line !~ /^\s*}.*/) && ($done ne "true")) { + chop $line; + if ($line =~ /.*file_network\s*=\s*(.*)$/) { + print "Network is $1\n"; + if ($1 ne "Donkey") { + print "Cannot import non-ed2k part file, skipping\n"; + while (($line) && ($line !~ /^\s*}.*/)) { + $line = ; + $done = "true"; + } + } + } + if ($line =~ /^\s*file_size\s*=\s*(\d+)\s*$/) { + $file_size = $1; + print "File size: $file_size\n"; + } + if ($line =~ /^\s*file_swarmer\s*=\s*\"(.*)\"\s*$/) { + $part_file = $1; + print "Part file to import: $part_file\n"; + } + if ($line =~ /^\s*file_md4\s*=\s*\"?(([A-Z]|[0-9])+)\"?\s*$/) { + $md4_hash = $1; + print "File hash: $md4_hash\n"; + } + if ($line =~ /^\s*file_filename\s*=\s*\"(.*)\"\s*$/) { + $file_name = $1; + print "File name: $file_name\n"; + } + if ($line =~ /^\s*file_md4s\s*=\s*\[\s*$/) { + # Read the MD4 list + my $result = ""; + do { + my $md4_line = ; + if ($md4_line =~ /^\s*\"?(([A-Z]|[0-9])+)\"?;\]?\s*$/) { + push(@md4_list,$1); + if ($md4_line =~ /^.*;\].*$/) { + $result = "done"; + } + } else { + print "Malformed md4 hash line $md4_line"; + @md4_list = (); + $result = "error"; + } + } while (!($result)); + if ($result eq "done") { + print "MD4 list: @md4_list\n"; + } + + + } + + if ($line =~ /^\s*file_present_chunks\s*=\s*\[\s*$/) { + # Read the gaps list + my $result = ""; + my @ml_gaps = (); + do { + my $gaps_line = ; + if ($gaps_line =~ /^\s*\((\d+),\s*(\d+)\)(;|])\s*$/) { + push(@ml_gaps,$1); + push(@ml_gaps,$2); + if ($gaps_line =~ /^.*\)\].*$/) { + $result = "done"; + } + } else { + print "Malformed gaps line $gaps_line"; + $result = "error"; + } + } while (!($result)); + + if ($result eq "done") { + # Process mldonkey gaps to aMule gaps + print "ML Gaps list: @ml_gaps\n"; + + @gap_list = &convert_gap_format($file_size,@ml_gaps); + + print "aMule Gaps list: @gap_list\n"; + } + + + } + + if ($done ne "true") { + $line = ; + } + } + + if ($done eq "true") { + print "File import result: false\n"; + } else { + if ($file_name && $file_size && $md4_hash && $part_file) { + if (!(@md4_list)) { + print "WARNING: File has no md4 hashes list, imported file will have 0 bytes downloaded\n"; + } + + my $first_free_number = &get_first_free_number; + + my $met_file = $output_folder . sprintf("/%03d.part.met",$first_free_number); + + &create_met_file($met_file,$file_name,$file_size,$md4_hash,@md4_list,"---",@gap_list); + + print "File $met_file imported successfully.\n"; + + my $from = $input_folder . "/" . $part_file; + my $destination = $output_folder . sprintf("/%03d.part",$first_free_number); + copy($from, $destination) or die "CRITICAL: File $from cannot be copied to $destination. Error: $!\n"; + + } else { + print "Not enough info to import file, sorry.\n"; + } + } + $line; +} + +sub create_met_file { + + print "Parameters: @_\n"; + + #Open the new file + open(MET," > $_[0]"); + binmode MET; + + my $large_file = ""; + + # Met file version (1 byte) + if ($_[2] < 4290048000) { + # Not large file + $large_file = "no"; + printf MET &byte_string(0xe0); + } else { + $large_file = "yes"; + printf MET &byte_string(0xe2); + } + # File modification time. 0 to force aMule rehash. (4 bytes) + print MET &int32_string(0); + + # MD4 hash (16 bytes) + print MET &hash_string($_[3]); + + #Calculate number of MD4 hashes + my @md4_hashlist = (); + + my $i = 4; + + while ($_[$i] ne "---") { + push (@md4_hashlist,$_[$i]); + $i++; + } + + $i++; + + my @gaps_list = (); + while ($_[$i]) { + push(@gaps_list,$_[$i]); + $i++; + } + + print "Write aMule gap list: @gaps_list\n"; + + my $md4_hashsize = @md4_hashlist; + + print "MD4 hashlist size $md4_hashsize\n"; + + #Number of MD4 hashes (2 bytes) + print MET &int16_string($md4_hashsize); + + #Write MD4 hashes (16 bytes * number of hashes) + my $md4_parthash = ""; + foreach $md4_parthash (@md4_hashlist) { + print MET &hash_string($md4_parthash); + } + + #Number of tags (4 bytes) + + my $tags_number = 2; # Fixed tags (Name + Size) + + $tags_number = $tags_number + @gaps_list; + + print MET &int32_string($tags_number); + + #Name tag (x bytes) + + print MET &tag_string(2,0,0x01,$_[1]); # Tagtype string, id FT_FILENAME, value + + #Size tag (x bytes) + + if ($large_file eq "yes") { + print MET &tag_string(0x0b,0,0x02,$_[2]); # Tagtype UINT64, id FT_FILESIZE, value + } else { + print MET &tag_string(3,0,0x02,$_[2]); # Tagtype UINT32, id FT_FILESIZE, value + } + + my $t = 0; + + my $tag_type; + if ($large_file eq "yes") { + $tag_type = 0x0b; + } else { + $tag_type = 0x03; + } + + while (@gaps_list[$t*2]) { + my $gap_start = @gaps_list[$t*2]; + my $gap_end = @gaps_list[$t*2+1]; + + print "Gap $t start $gap_start end $gap_end\n"; + + print MET &tag_string($tag_type,1,sprintf("%c%d",0x09,$t),$gap_start); + print MET &tag_string($tag_type,1,sprintf("%c%d",0x0a,$t),$gap_end); + + $t++; + } + + close(MET); +} + +sub byte_string { + sprintf("%c",$_[0]); +} + +sub int16_string { + &byte_string($_[0] % 256) . &byte_string($_[0] / 256); +} + +sub int32_string { + &int16_string($_[0] % 65536) . &int16_string($_[0] / 65536); +} + +sub int64_string { + &int32_string($_[0] % 4294967296) . &int32_string($_[0] / 4294967296); +} + +sub hash_string { + my $i = 0; + my $final_string = ""; + while ($i < 32) { + $final_string = $final_string . &byte_string(hex(substr($_[0],$i,2))); + $i += 2; + } + $final_string; +} + +sub tag_string { + # ONLY STRINGS AND UINT32/64 SUPPORTED + + my $final_string = ""; + + # Tag type + $final_string = $final_string . &byte_string($_[0]); + + if ($_[1] == 0) { + # Byte ID tag + $final_string = $final_string . &int16_string(1); + $final_string = $final_string . &byte_string($_[2]); + } else { + # String ID tag + $final_string = $final_string . &int16_string(length $_[2]) . $_[2]; + } + + if ($_[0] == 2) { + $final_string = $final_string . &int16_string(length $_[3]) . $_[3]; + } else { + if ($_[0] == 3) { + # UINT32 + $final_string = $final_string . &int32_string($_[3]); + } else { + if ($_[0] == 0x0b) { + # UINT64 + $final_string = $final_string . &int64_string($_[3]); + } + } + } + $final_string; +} + +sub convert_gap_format { + my $total_size = $_[0]; + + my @converted_gaps = (); + + my $n = 1; + + if ($_[1] != 0) { + push(@converted_gaps,0); + push(@converted_gaps,$_[1]); + } + + $n++; + + while ($_[$n+1]) { + push(@converted_gaps,$_[$n]); + push(@converted_gaps,$_[$n+1]); + $n += 2; + } + + if ($_[$n] != $total_size) { + push(@converted_gaps,$_[$n]); + push(@converted_gaps,$total_size); + } + + @converted_gaps; +} + +sub get_first_free_number { + my $n = 1; + my $result = 0; + + while (!$result && !($n>999)) { + open(TEST, " <" . $output_folder . sprintf("/%03d.part.met",$n)) or $result=$n; + close(TEST); + $n++; + } + + $result; +} diff --git a/src/utils/scripts/sanity b/src/utils/scripts/sanity new file mode 100755 index 00000000..d541d591 --- /dev/null +++ b/src/utils/scripts/sanity @@ -0,0 +1,980 @@ +#!/usr/bin/ruby + +# This file is part of the aMule project. +# +# Copyright (c) 2003-2008 aMule Project ( admin@amule.org / http://www.amule.org ) +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +# + + +# This function returns true if a file is filtered +# and shound't be included in the sainity testing. +def IsFiltered(filename) + (["./config.h", "./configWIN32.h"].index(filename) != nil) or + (filename =~ /^.\/intl\//) or + (filename =~ /CryptoPP/) +end + + + +# This class represents lines of code, with line-number and text +# It is used to store the source-files once they have been read +# and afterwards to store the lines returned by the filters. +class Line + def initialize( number, text ) + @number = number + @text = text + end + + attr_reader :number + attr_reader :text +end + + + +class Result + def initialize( type, file, line = nil ) + @type = type + @file = file + @line = line + end + + def file_name + @file.slice( /[^\/]+$/ ) + end + + def file_path + @file.slice( /^.*\// ) + end + + attr_reader :type + attr_reader :file + attr_reader :line +end + + + +# Base class for Sainity Checkers +# +# This class represents the basic sainity-check, which returns all +# files as positive results, regardless of the contents. +class SainityCheck + def initialize + @name = "None" + @title = nil + @type = "None" + @desc = "None" + @results = Array.new + end + + attr_reader :name + attr_reader :type + attr_reader :desc + + def title + if @title then + @title + else + @name + end + end + + + def results + @results + end + + # This function will be called for each file, with the argument "file" as the + # name of the file and the argument "lines" being an array of Line objects for + # each line of the file. + # + def parse_file(file, lines) + raise "Missing parse_file() implementation for Filter: #{@name}" + end + + + private + + def add_results( file, lines = [nil] ) + lines.each do |line| + @results << Result.new( self, file, line ) + end + end +end + + + + + +class CompareAgainstEmptyString < SainityCheck + def initialize + super + + @name = "CmpEmptyString" + @title = "Comparing With Empty String" + @type = "Good Practice" + @desc = "Comparisons with empty strings, such as wxT(\"\"), wxEmptyString and " + @desc += "_(\"\") should be avoided since they force the creation of a temporary " + @desc += "string object. The proper method is to use the IsEmpty() member-function " + @desc += "of wxString." + end + + def parse_file(file, lines) + results = lines.select do |line| + line.text =~ /[!=]=\s*(wxEmptyString|wxT\(""\)|_\(""\))/ or + line.text =~ /(wxEmptyString|wxT\(""\)|_\(""\))\s*[!=]=/ + end + + add_results( file, results ) + end +end + + + +class AssignmentToEmptyString < SainityCheck + def initialize + super + + @name = "EmptyStringAssignment" + @title = "Assignment To Empty String" + @type = "Good Practice" + @desc = "Assigning an empty string such as wxT(\"\"), wxEmptyString and _(\"\") " + @desc += "to a wxString should be avoided, since it forces the creation of a " + @desc += "temporary object which is assigned to the string. The proper way to " + @desc += "clear a string is to use the Clear() member-function of wxString." + end + + def parse_file(file, lines) + if file =~ /\.cpp$/ + results = lines.select do |line| + line.text =~ /[^=!]=\s*(wxEmptyString|wxT\(""\)|_\(""\))/ + end + + add_results( file, results ) + end + end +end + + + +class NoIfNDef < SainityCheck + def initialize + super + + @name = "NoIfNDef" + @title = "No #ifndef in headerfile" + @type = "Good Practice" + @desc = "All header files should contain a #ifndef ____. The purpuse is to ensure " + @desc += "that the header can't be included twice, which would introduce a number of problems." + end + + def parse_file(file, lines) + if file =~ /\.h$/ then + if not lines.find { |x| x.text =~ /^#ifndef.*_H/ } then + add_results( file ) + end + end + end +end + + + +class ThisDeference < SainityCheck + def initialize + super + + @name = "ThisDeference" + @title = "Dereference of \"this\"" + @type = "Good Practice" + @desc = "In all but the case of templates, using \"this->\" is unnescesarry and " + @desc += "only decreases the readability of the code." + end + + def parse_file(file, lines) + results = lines.select do |line| + line.text =~ /\bthis->/ + end + + add_results( file, results ) + end +end + + + +class Assert < SainityCheck + def initialize + super + + @name = "Assert" + @type = "Consistancy" + @desc = "wxASSERT()s should be used rather than normal assert()s " + @desc += "for the sake of consistancy." + end + + def parse_file(file, lines) + results = lines.select do |line| + line.text =~ /assert\s*\(/ + end + + add_results( file, results ) + end +end + + + +class PassByValue < SainityCheck + def initialize + super + + @name = "PassByValue" + @title = "Pass By Value" + @type = "Good Practice" + @desc = "Passing objects by value means an extra overhead for large datatypes. " + @desc += "Therefore should these always be passed by const reference when possible." + @desc += "Non-const references should only be used for functions where the function is " + @desc += "supposed to change the actual value of the argument and return another or no value." + end + + def parse_file(file, lines) + results = Array.new + + # Only handle header files + if file =~ /\.h$/ + # Items that should be passed by const-ref + items = [ "wxString", "wxRect", "wxPoint", "CMD4Hash" ] + + lines.each do |line| + # Try to identify function definitions + if line.text =~ /^\s*(virtual|static|inline|)\s*\w+\s+\w+\s*\(.*\)/ + # Split by arguments + line.text.match(/\(.*\)/)[0].split(",").each do |str| + items.each do |item| + if str =~ /#{item}\s*[^\s\*]/ and not str =~ /const/ + results.push( line ) + end + end + end + end + end + end + + add_results( file, results ) + end +end + + + +class CStr < SainityCheck + def initialize + super + + @name = "CStr" + @title = "C_Str or GetData" + @type = "Unicoding" + @desc = "Checks for usage of c_str() or GetData(). Using c_str will often result in " + @desc += "problems on Unicoded builds and should therefore be avoided. " + @desc += "Please note that the GetData check isn't that precise, because many other " + @desc += "classes have GetData members, so it does some crude filtering." + end + + def parse_file(file, lines) + results = lines.select do |line| + if line.text =~ /c_str\(\)/ + true + else + line.text =~ /GetData\(\)/ and line.text =~ /(wxT\(|wxString|_\()/ + end + end + + add_results( file, results ) + end +end + + + +class IfNotDefined < SainityCheck + def initialize + super + + @name = "IfDefined" + @title = "#if (!)defined" + @type = "Consistancy" + @desc = "Use #ifndef or #ifdef instead for reasons of simplicity." + end + + def parse_file(file, lines) + results = lines.select do |line| + if line.text =~ /^#if.*[\!]?defined\(/ + not line.text =~ /(\&\&|\|\|)/ + end + end + + add_results( file, results ) + end +end + + + +class GPLLicense < SainityCheck + def initialize + super + + @name = "MissingGPL" + @title = "Missing GPL License" + @type = "License" + @desc = "All header files should contain the proper GPL blorb." + end + + def parse_file(file, lines) + if file =~ /\.h$/ + if lines.find { |x| x.text =~ /This (program|library) is free software;/ } == nil + add_results( file ) + end + end + end +end + + + +class Copyright < SainityCheck + def initialize + super + + @name = "MissingCopyright" + @title = "Missing Copyright Notice" + @type = "License" + @desc = "All files should contain the proper Copyright notice." + end + + def parse_file(file, lines) + if file =~ /\.h$/ + found = lines.select do |line| + line.text =~ /Copyright\s*\([cC]\)\s*[-\d,]+ aMule (Project|Team)/ + end + + if found.empty? then + add_results( file ) + end + end + end +end + + + +class PartOfAmule < SainityCheck + def initialize + super + + @name = "aMuleNotice" + @title = "Missing aMule notice" + @type = "License" + @desc = "All files should contain a notice that they are part of the aMule project." + end + + def parse_file(file, lines) + if file =~ /\.h$/ + found = lines.select do |line| + line.text =~ /This file is part of the aMule Project/ or + line.text =~ /This file is part of aMule/ + end + + if found.empty? then + add_results( file ) + end + end + end +end + + + +class MissingBody < SainityCheck + def initialize + super + + @name = "MissingBody" + @title = "Missing Body in Loop" + @type = "Garbage" + @desc = "This checks looks for loops without any body. For example \"while(true);\" " + @desc += "In most cases this is a sign of either useless code or bugs. Only in a few " + @desc += "cases is it valid code, and in those it can often be represented clearer " + @desc += "in other ways." + end + + def parse_file(file, lines) + results = lines.select do |line| + if line.text =~ /^[^}]*while\s*\(.*\)\s*;/ or + line.text =~ /^\s*for\s*\(.*\)\s*;[^\)]*$/ + # Avoid returning "for" spanning multiple lines + # TODO A better way to count instances + line.text.split("(").size == line.text.split(")").size + else + false + end + end + + add_results( file, results ) + end +end + + + +class Translation < SainityCheck + def initialize + super + + @name = "Translation" + @type = "Consistancy" + @desc = "Calls to AddLogLineM should translate the message, whereas " + @desc += "calls to AddDebugLogLine shouldn't. This is because the user " + @desc += "is meant to see normal log lines, whereas the the debug-lines " + @desc += "are only meant for the developers and I dont know about you, but " + @desc += "I dont plan on learning every language we choose to translate " + @desc += "aMule to. :P" + end + + def parse_file(file, lines) + results = lines.select do |line| + if line.text =~ /\"/ + line.text =~ /AddLogLine(M|)\(.*wxT\(/ or + line.text =~ /AddDebugLogLine(M|)\(.*_\(/ + else + false + end + end + + add_results( file, results ) + end +end + + + +class IfZero < SainityCheck + def initialize + super + + @name = "PreIfConstant" + @title = "#if 0-9" + @type = "Garbage" + @desc = "Disabled code should be removed as soon as possible. If you wish to disable code " + @desc += "for only a short period, then please add a comment before the #if. Code with #if [1-9] " + @desc += "should be left, but the #ifs removed unless there is a pressing need for them." + end + + def parse_file(file, lines) + results = lines.select do |line| + line.text =~ /#if\s+[0-9]/ + end + + add_results( file, results ) + end +end + + + +class InlinedIfTrue < SainityCheck + def initialize + super + + @name = "InlinedIf" + @name = "Inlined If true/false" + @type = "Garbage" + @desc = "Using variations of (x ? true : false) or (x ? false : true) is just plain stupid." + end + + def parse_file(file, lines) + results = lines.select do |line| + line.text =~ /\?\s*(true|false)\s*:\s*(true|false)/i + end + + add_results( file, results ) + end +end + + + +class LoopOnConstant < SainityCheck + def initialize + super + + @name = "LoopingOnConstant" + @title = "Looping On Constant" + @type = "Garbage" + @desc = "This checks detects loops that evaluate constant values " + @desc += "(true,false,0..) or \"for\" loops with no conditionals. all " + @desc += "are often a sign of poor code and in most cases can be avoided " + @desc += "or replaced with more elegant code." + end + + def parse_file(file, lines) + results = lines.select do |line| + line.text =~ /while\s*\(\s*([0-9]+|true|false)\s*\)/i or + line.text =~ /for\s*\([^;]*;\s*;[^;]*\)/ + end + + add_results( file, results ) + end +end + + + +class MissingImplementation < SainityCheck + def initialize + super + + @name = "MissingImplementation" + @title = "Missing Function Implementation" + @type = "Garbage" + @desc = "Forgetting to remove a function-definition after having removed it " + @desc += "from the .cpp file only leads to cluttered header files. The only " + @desc += "case where non-implemented functions should be used is when it is " + @desc += "necesarry to prevent usage of for instance assignment between " + @desc += "instances of a class." + + @declarations = Array.new + @definitions = Array.new + end + + def results + @definitions.each do |definition| + @declarations.delete_if do |pair| + pair.first == definition + end + end + + + return @declarations.map do |pair| + Result.new( self, pair.last.first, pair.last.last ) + end + end + + def parse_file(file, lines) + if file =~ /\.h$/ then + level = 0 + tree = Array.new + + lines.each do |line| + level += line.text.count( "{" ) - line.text.count( "}" ) + + tree.delete_if do |struct| + struct.first > level + end + + + if line.text !~ /^\s*\/\// and line.text !~ /^\s*#/ and line.text !~ /typedef/ then + if line.text =~ /^\s*(class|struct)\s+/ and line.text.count( ";" ) == 0 then + cur_level = level; + + if line.text.count( "{" ) == 0 then + cur_level += 1 + end + + name = line.text.scan( /^\s*(class|struct)\s+([^\:{;]+)/ ) + if name != [] then + name = name.first.last.strip + else + name = "Unknown at line " + line.number.to_s + " in " + file + end + + tree << [ cur_level, name ] + elsif line.text =~ /;\s*$/ and line.text.count( "{" ) == 0 then + # No pure virtual functions and no return(blah) calls (which otherwise can fit the requirements) + if line.text !~ /=\s*0\s*;\s*$/ and line.text !~ /return/ then + re = /^\s*(virtual\s+|static\s+|inline\s+|)\w+(\s+[\*\&]?|[\*\&]\s+)(\w+)\(/.match( line.text ) + + if re and level > 0 and tree.last then + @declarations << [ tree.last.last + "::" + re[ re.length - 1 ], [ file, line ] ] + end + end + end + end + end + else + lines.each do |line| + if line.text =~ /\b\w+::\w+\s*\([^;]+$/ + @definitions << line.text.scan( /\b(\w+::\w+)\s*\([^;]+$/ ).first.first + end + end + end + end +end + + + + + + + +# List of enabled filters +filterList = Array.new +filterList.push CompareAgainstEmptyString.new +filterList.push AssignmentToEmptyString.new +filterList.push NoIfNDef.new +filterList.push ThisDeference.new +filterList.push Assert.new +filterList.push PassByValue.new +filterList.push CStr.new +filterList.push IfNotDefined.new +filterList.push GPLLicense.new +filterList.push Copyright.new +filterList.push PartOfAmule.new +filterList.push MissingBody.new +filterList.push Translation.new +filterList.push IfZero.new +filterList.push InlinedIfTrue.new +filterList.push LoopOnConstant.new +filterList.push MissingImplementation.new + + +# Sort enabled filters by type and name. The reason why this is done here is +# because it's much easier than manually resorting every time I add a filter +# or change the name or type of an existing filter. +filterList.sort! do |x,y| + cmp = x.type <=> y.type + + if cmp == 0 then + x.title <=> y.title + else + cmp + end +end + + + +def parse_files( path, filters ) + filters = filters.dup + + require "find" + + Find.find( path ) do |filename| + if filename =~ /\.(cpp|h)$/ and not IsFiltered(filename) then + File.open(filename, "r") do |aFile| + # Read lines and add line-numbers + lines = Array.new + aFile.each_line do |line| + lines.push( Line.new( aFile.lineno, line ) ) + end + + lines.freeze + + # Check the file against each filter + filters.each do |filter| + # Process the file with this filter + filter.parse_file( filename, lines ) + end + end + end + end + + results = Array.new + filters.each do |filter| + results += filter.results + end + + results +end + + + + +# Helper-function +def get_val( key, list ) + if not list.last or list.last.first != key then + list << [ key, Array.new ] + end + + list.last.last +end + + + +def create_result_tree( path, filters ) + # Gather the results + results = parse_files( path, filters ) + + # Sort the results by the following sequence of variables: Path -> File -> Filter -> Line + results.sort! do |a, b| + if (a.file_path <=> b.file_path) == 0 then + if (a.file_name <=> b.file_name) == 0 then + if (a.type.title <=> b.type.title) == 0 then + a.line.number <=> b.line.number + else + a.type.title <=> b.type.title + end + else + a.file_name <=> b.file_name + end + else + a.file_path <=> b.file_path + end + end + + + # Create a tree of results: [ Path, [ File, [ Filter, [ Line ] ] ] ] + result_tree = Array.new + results.each do |result| + get_val( result.type, get_val( result.file_name, get_val( result.file_path, result_tree ) ) ) << result + end + + + result_tree +end + + + +def create_filter_tree( filters ) + # Change the filterList to a tree: [ Type, [ Filter ] ] + filter_tree = Array.new + + filters.each do |filter| + get_val( filter.type, filter_tree ) << filter + end + + filter_tree +end + + + +# Converts a number to a string and pads with zeros so that length becomes at least 5 +def PadNum( number ) + num = number.to_s + + if ( num.size < 5 ) + ( "0" * ( 5 - num.size ) ) + num + else + num + end +end + + + +# Helper-function that escapes some chars to HTML codes +def HTMLEsc( str ) + str.gsub!( /\&/, "&" ) + str.gsub!( /\"/, """ ) + str.gsub!( //, ">" ) + str.gsub!( /\n/, "
" ) + str.gsub( /\t/, " " ) +end + + + +# Fugly output code goes here +# ... Abandon hope, yee who read past here +# TODO Enable use of templates. +# TODO Abandon hope. +def OutputHTML( filters, results ) + text = +" + + + + + +

Filters

+
+" + # List the filters + filters.each do |filterType| + text += +"
#{filterType.first}
+
+
+" + filterType.last.each do |filter| + text += +"
#{filter.title}
+
+ #{HTMLEsc(filter.desc)}

+

+" + end + + text += +"
+
+" + end + + text += +"
+ +

+ +

Directories

+
    +" + + # List the directories + results.each do |dir| + text += +"
  • + #{dir.first} +
  • +" + end + + text += +"
+ +

+ +

Results

+" + + results.each do |dir| + text += +"
+

#{dir.first}

+" + + dir.last.each do |file| + text += +"
+

#{file.first}

+ +
    +" + + file.last.each do |filter| + text += +"
  • +
    + #{filter.first.title} + +
      +" + + filter.last.each do |result| + if result.line then + text += +"
    • #{PadNum(result.line.number)}: #{HTMLEsc(result.line.text.strip)}
    • +" + end + end + + text += +"
    +
    +
  • +" + end + text += +"
+
+" + end + + text += +"
+ +

+" + end + + text += +" +" + + return text; +end + + + +# Columnizing, using the http://www.rubygarden.org/ruby?UsingTestUnit example because I'm lazy +# TODO Rewrite it to better support newlines and stuff +def Columnize( text, width, indent ) + return indent + text.scan(/(.{1,#{width}})(?: |$)/).join("\n#{indent}") +end + + + +# Fugly output code also goes here, this is a bit more sparse than the HTML stuff +def OutputTEXT( filters, results ) + + # List the filters + text = "Filters\n" + filters.each do |filterType| + text += "\t* #{filterType.first}\n" + + filterType.last.each do |filter| + text += "\t\t- #{filter.title}\n" + + text += Columnize( filter.desc, 80, "\t\t\t" ) + "\n\n" + end + end + + # List the directories + text += "\n\nDirectories\n" + results.each do |dir| + text += "\t#{dir.first}\n" + end + + text += "\n\nResults\n" + + # To avoid bad readability, I only use fullpaths here instead of sections per dir + results.each do |dir| + dir.last.each do |file| + text += "\t#{dir.first}#{file.first}\n" + + file.last.each do |filter| + text += "\t\t* #{filter.first.title}\n" + + filter.last.each do |result| + if result.line then + text += "\t\t\t#{PadNum(result.line.number)}: #{result.line.text.strip}\n" + end + end + end + + text += "\n" + end + end + + return text; +end + + + +#TODO Improved parameter-handling, add = for the outputing to a file +ARGV.each do |param| + case param + when "--text" then + puts OutputTEXT( create_filter_tree( filterList ), create_result_tree( ".", filterList ) ) + when "--html" then + puts OutputHTML( create_filter_tree( filterList ), create_result_tree( ".", filterList ) ) + end +end + diff --git a/src/utils/scripts/stats.pl b/src/utils/scripts/stats.pl new file mode 100755 index 00000000..985ff184 --- /dev/null +++ b/src/utils/scripts/stats.pl @@ -0,0 +1,96 @@ +#!/usr/bin/perl + +# Copyright 2003-2005 Nathan Walp +# +# 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., 50 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +# Taken from the Gaim project, modified by Angel Vidal (Kry) for the aMule project. + +use POSIX qw(strftime); + + +my $PACKAGE="amule"; + + +use Locale::Language; + +$lang{gl} = "Galician (Galiza)"; +$lang{en_AU} = "English (Australian)"; +$lang{en_CA} = "English (Canadian)"; +$lang{en_GB} = "English (British)"; +$lang{en_US} = "English (USA)"; +$lang{es_MX} = "Spanish (Mexico)"; +$lang{et_EE} = "Estonian (Estonia)"; +$lang{it_CH} = "Italian (Switzerland)"; +$lang{ko_KR} = "Korean (Korea)"; +$lang{my_MM} = "Burmese (Myanmar)"; +$lang{pt_BR} = "Portuguese (Brazilian)"; +$lang{pt_PT} = "Portuguese (Portugal)"; +$lang{'sr@Latn'} = "Serbian (Latin)"; +$lang{zh_CN} = "Chinese (Simplified)"; +$lang{zh_TW} = "Chinese (Traditional)"; + +opendir(DIR, ".") || die "can't open directory: $!"; +@pos = grep { /\.po$/ && -f } readdir(DIR); +foreach (@pos) { s/\.po$//; }; +closedir DIR; + +@pos = sort @pos; + +$now = `date`; + +system("intltool-update --pot > /dev/null"); + +$_ = `msgfmt --statistics $PACKAGE.pot -o /dev/null 2>&1`; + +die "unable to get total: $!" unless (/(\d+) untranslated messages/); + +$total = $1; +$generated = strftime "%Y-%m-%d %H:%M:%S", gmtime; +$stats_generated = `date`; +chomp($stats_generated); + +print "\n"; +print "\n"; +print "\n"; + +foreach $index (0 .. $#pos) { + $trans = $fuzz = $untrans = 0; + $po = $pos[$index]; + print STDERR "$po..." if($ARGV[0] eq '-v'); + system("msgmerge $po.po $PACKAGE.pot -o $po.new 2>$po.po.warnings"); + $_ = `msgfmt --statistics $po.new -o /dev/null 2>&1`; + chomp; + if(/(\d+) translated message/) { $trans = $1; } + if(/(\d+) fuzzy translation/) { $fuzz = $1; } + if(/(\d+) untranslated message/) { $untrans = $1; } + unlink("$po.new"); + + $warnings = `cat $po.po.warnings | grep -v done | wc -l | cut -d" " -f 1`; + chop($warnings); + unlink("$po.po.warnings") if $warnings eq "0"; + + $name = ""; + $name = $lang{$po}; + $name = code2language($po) unless $name ne ""; + $name = "???" unless $name ne ""; + + print "\n" unless $po eq "en_GB"; + print STDERR "done ($untrans untranslated strings).\n" if($ARGV[0] eq '-v'); +} + +print "\n"; + diff --git a/src/utils/scripts/translate-manpages b/src/utils/scripts/translate-manpages new file mode 100755 index 00000000..0e68c4f1 --- /dev/null +++ b/src/utils/scripts/translate-manpages @@ -0,0 +1,28 @@ +#!/bin/sh + +if [ -z ${1} ] ; then + + echo "You have to specify a language to translate into (i.e. de)." + exit 0 + +fi + +if [ ! -e docs/man/manpages-${1}.po ] ; then + + echo "The specified translation catalog doesn\`t exist" + echo "Make sure, that the .po-file is in docs/man" + exit 0 + +fi + +bin=`which po4a-translate` || { echo "You don't have po4a installed"; exit 0; } + +${bin} -f man -m docs/man/amule.1 -p docs/man/manpages-${1}.po -l docs/man/amule.${1}.1 -L UTF8 +${bin} -f man -m docs/man/amuled.1 -p docs/man/manpages-${1}.po -l docs/man/amuled.${1}.1 -L UTF8 +${bin} -f man -m docs/man/amulecmd.1 -p docs/man/manpages-${1}.po -l docs/man/amulecmd.${1}.1 -L UTF8 +${bin} -f man -m docs/man/amulegui.1 -p docs/man/manpages-${1}.po -l docs/man/amulegui.${1}.1 -L UTF8 +${bin} -f man -m docs/man/amuleweb.1 -p docs/man/manpages-${1}.po -l docs/man/amuleweb.${1}.1 -L UTF8 +${bin} -f man -m docs/man/ed2k.1 -p docs/man/manpages-${1}.po -l docs/man/ed2k.${1}.1 -L UTF8 +${bin} -f man -m src/utils/wxCas/docs/wxcas.1 -p docs/man/manpages-${1}.po -l src/utils/wxCas/docs/wxcas.${1}.1 -L UTF8 +${bin} -f man -m src/utils/cas/docs/cas.1 -p docs/man/manpages-${1}.po -l src/utils/cas/docs/cas.${1}.1 -L UTF8 +${bin} -f man -m src/utils/xas/docs/xas.1 -p docs/man/manpages-${1}.po -l src/utils/xas/docs/xas.${1}.1 -L UTF8 diff --git a/src/utils/scripts/version_bumper b/src/utils/scripts/version_bumper new file mode 100755 index 00000000..9943f06f --- /dev/null +++ b/src/utils/scripts/version_bumper @@ -0,0 +1,63 @@ +#!/bin/sh +################################################## +# aMule Version Info Bumper # +################################################## + +## This file is part of the aMule Project +## +## Copyright (c) 2006-2008 Angel Vidal (Kry) ( kry@amule.org ) +## Copyright (c) 2006-2008 aMule Project ( http://www.amule-project.net ) +## +## This program is free software; you can redistribute it and/or +## modify it under the terms of the GNU General Public License +## as published by the Free Software Foundation; either +## version 2 of the License, or (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + +if test x"$1" = x""; then + echo "aMule Version Info Bumper v0.2" + echo "(c) 2006-2008 Angel Vidal (Kry) and the aMule Project Team" + echo -e "Usage:" + echo -e "\tversion_bumper [old_version] new_version" + echo -e "Examples:" + echo -e "\tUpdates version 2.1.0 info to 2.1.1 -> version_bumper 2.1.0 2.1.1" + echo -e "\tUpdates current version to 2.1.1 \(autodetect old version\) -> version_bumper 2.1.1" + echo " - This script is buggy and can kill your dog. Be careful. -" +else + if test x"`ls configure.in`" = x""; then + echo "This script must be run on aMule base directory." + else + OLD_VERSION=$1 + NEW_VERSION=$2 + if test x"$NEW_VERSION" = x""; then + NEW_VERSION=$OLD_VERSION + OLD_VERSION=`grep "PROJECT_NUMBER" docs/Doxyfile | grep "=" | sed -r "s/\s+/ /g" | cut -d " " -f 3` + echo "Autodetected old version: $OLD_VERSION" + fi + if test x"`echo "$OLD_VERSION" | grep -o -E "[0-9]+\.[0-9]+\.[0-9]+"`" != x"$OLD_VERSION"; then + echo "Specified old version ($OLD_VERSION) does not conform to a.b.c form." + else + if test x"`echo "$NEW_VERSION" | grep -o -E "[0-9]+\.[0-9]+\.[0-9]+"`" != x"$NEW_VERSION"; then + echo "Specified new version ($NEW_VERSION) does not conform to a.b.c form." + else + echo "Bumping from $OLD_VERSION to $NEW_VERSION" + #Command: + sed -i "s/$OLD_VERSION/$NEW_VERSION/g" aMule.app/Contents/Info.plist configure.in src/include/common/ClientVersion.h docs/Doxyfile aMule.spec po/*.po configWIN32.h + sed -i -r "s/VERSION_MJR\s+(0x0)?`echo $OLD_VERSION | cut -d "." -f 1`/VERSION_MJR\t\t`echo $NEW_VERSION | cut -d "." -f 1`/g" src/include/common/ClientVersion.h + sed -i -r "s/VERSION_MIN\s+(0x0)?`echo $OLD_VERSION | cut -d "." -f 2`/VERSION_MIN\t\t`echo $NEW_VERSION | cut -d "." -f 2`/g" src/include/common/ClientVersion.h + sed -i -r "s/VERSION_UPDATE\s+(0x0)?`echo $OLD_VERSION | cut -d "." -f 3`/VERSION_UPDATE\t\t`echo $NEW_VERSION | cut -d "." -f 3`/g" src/include/common/ClientVersion.h + if test x"`grep -E "^#define __CVS__$" src/include/common/ClientVersion.h`" != x""; then + echo "WARNING! ClientVersion.h still defines version as CVS. Please comment the line \"#define __CVS__\" before releasing." + fi + fi + fi + fi +fi diff --git a/src/utils/scripts/wikify_latest_changelog b/src/utils/scripts/wikify_latest_changelog new file mode 100755 index 00000000..3a007c34 --- /dev/null +++ b/src/utils/scripts/wikify_latest_changelog @@ -0,0 +1,38 @@ +#!/bin/bash +## This file is part of the aMule Project +## +## Copyright (c) 2006-2008 Angel Vidal (Kry) ( kry@amule.org ) +## Copyright (c) 2006-2008 aMule Project ( http://www.amule-project.net ) +## +## This program is free software; you can redistribute it and/or +## modify it under the terms of the GNU General Public License +## as published by the Free Software Foundation; either +## version 2 of the License, or (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + +# Wikifies lastest changelog entry. No sanity checking. Must be run from sources root folder. +if test x"`ls docs/Changelog`" = x""; then + echo "This script must be run on aMule base directory." +else + CHANGELOG="Changelog-`grep -h -E 'Version [0-9]\.[0-9]+\.[0-9]+.*' docs/Changelog | head -n 1 | cut -d ' ' -f 2`" + head -n `grep -hn -E '(\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-)+' docs/Changelog | cut -d ':' -f 1 | head -1` docs/Changelog > $CHANGELOG + sed -i -r "s/\t([A-Z,a-z].+):$/'''\1:'''/g" $CHANGELOG + sed -i -r "s/^(Version .+)$/=== \1 ===/g" $CHANGELOG + sed -i -r "s/^----------$//g" $CHANGELOG + sed -i -r "s/^([0-9][0-9][0-9][0-9]-[0-9][0-9]?-[0-9][0-9]?)$/''\1''/g" $CHANGELOG + sed -i -r "s/\t+(\*? .+)$/\1/g" $CHANGELOG + while test x"`grep -E '^\s+.+$' $CHANGELOG`" != x""; do + sed -i -r "N + s/^(\*?.*)\n\s+([^\*]+)$/\1 \2/g " $CHANGELOG; + done + echo "$CHANGELOG created." +fi + diff --git a/src/utils/wxCas/Makefile.am b/src/utils/wxCas/Makefile.am new file mode 100644 index 00000000..4f02fd9e --- /dev/null +++ b/src/utils/wxCas/Makefile.am @@ -0,0 +1,11 @@ +SUBDIRS = src docs + +EXTRA_DIST = wxcas.rc wxcas.ico + +dist_icon_DATA = wxcas.xpm +icondir = $(datadir)/pixmaps + +dist_util_DATA = wxcas.desktop +utildir = $(datadir)/applications + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/utils/wxCas/Makefile.in b/src/utils/wxCas/Makefile.in new file mode 100644 index 00000000..27885e43 --- /dev/null +++ b/src/utils/wxCas/Makefile.in @@ -0,0 +1,659 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/utils/wxCas +DIST_COMMON = $(dist_icon_DATA) $(dist_util_DATA) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(icondir)" "$(DESTDIR)$(utildir)" +dist_iconDATA_INSTALL = $(INSTALL_DATA) +dist_utilDATA_INSTALL = $(INSTALL_DATA) +DATA = $(dist_icon_DATA) $(dist_util_DATA) +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +SUBDIRS = src docs +EXTRA_DIST = wxcas.rc wxcas.ico +dist_icon_DATA = wxcas.xpm +icondir = $(datadir)/pixmaps +dist_util_DATA = wxcas.desktop +utildir = $(datadir)/applications +MAINTAINERCLEANFILES = Makefile.in +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/wxCas/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/utils/wxCas/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: +install-dist_iconDATA: $(dist_icon_DATA) + @$(NORMAL_INSTALL) + test -z "$(icondir)" || $(mkdir_p) "$(DESTDIR)$(icondir)" + @list='$(dist_icon_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(dist_iconDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(icondir)/$$f'"; \ + $(dist_iconDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(icondir)/$$f"; \ + done + +uninstall-dist_iconDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_icon_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(icondir)/$$f'"; \ + rm -f "$(DESTDIR)$(icondir)/$$f"; \ + done +install-dist_utilDATA: $(dist_util_DATA) + @$(NORMAL_INSTALL) + test -z "$(utildir)" || $(mkdir_p) "$(DESTDIR)$(utildir)" + @list='$(dist_util_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(dist_utilDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(utildir)/$$f'"; \ + $(dist_utilDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(utildir)/$$f"; \ + done + +uninstall-dist_utilDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_util_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(utildir)/$$f'"; \ + rm -f "$(DESTDIR)$(utildir)/$$f"; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(DATA) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(icondir)" "$(DESTDIR)$(utildir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: install-dist_iconDATA install-dist_utilDATA + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-dist_iconDATA uninstall-dist_utilDATA \ + uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-recursive ctags ctags-recursive \ + distclean distclean-generic distclean-recursive distclean-tags \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-dist_iconDATA \ + install-dist_utilDATA install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-dist_iconDATA \ + uninstall-dist_utilDATA uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/utils/wxCas/docs/Makefile.am b/src/utils/wxCas/docs/Makefile.am new file mode 100644 index 00000000..637cea48 --- /dev/null +++ b/src/utils/wxCas/docs/Makefile.am @@ -0,0 +1,7 @@ +SELECTED_MANPAGES = $(WXCAS_MANPAGES) + +EXTRA_DIST = wxcas.1 wxcas.de.1 wxcas.es.1 wxcas.eu.1 wxcas.hu.1 + +include $(top_srcdir)/automake/manpages.am + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/utils/wxCas/docs/Makefile.in b/src/utils/wxCas/docs/Makefile.in new file mode 100644 index 00000000..1d30f4c4 --- /dev/null +++ b/src/utils/wxCas/docs/Makefile.in @@ -0,0 +1,489 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/automake/manpages.am +subdir = src/utils/wxCas/docs +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +SELECTED_MANPAGES = $(WXCAS_MANPAGES) +EXTRA_DIST = wxcas.1 wxcas.de.1 wxcas.es.1 wxcas.eu.1 wxcas.hu.1 +MAINTAINERCLEANFILES = Makefile.in +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/automake/manpages.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/wxCas/docs/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/utils/wxCas/docs/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + $(mkdir_p) $(distdir)/../../../../automake + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-data-hook install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am uninstall uninstall-am uninstall-hook \ + uninstall-info-am + +install-data-hook: + @for file in $(SELECTED_MANPAGES); do \ + lang=`echo $$file | sed -e 's/^[^.]*\.//'`; \ + if test $$lang == 1; then \ + echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/man1" ; \ + $(mkinstalldirs) $(DESTDIR)$(mandir)/man1 ; \ + if test -f $(srcdir)/$$file; then name=$(srcdir)/$$file; \ + else name=$$file; fi; \ + inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ + echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/man1/$$inst" ; \ + $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/man1/$$inst ; \ + else \ + locale=`echo $$lang | sed -e 's/\..*//'` ; \ + echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/$$locale/man1" ; \ + $(mkinstalldirs) $(DESTDIR)$(mandir)/$$locale/man1 ; \ + if test -f $(srcdir)/$$file; then name=$(srcdir)/$$file; \ + else name=$$file; fi; \ + inst=`echo $$file | sed -e "s/\.$${locale}\.1//" -e '$(transform)'`.1 ; \ + echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$locale/man1/$$inst" ; \ + $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$locale/man1/$$inst ; \ + fi; \ + done + +uninstall-hook: + @for file in $(SELECTED_MANPAGES); do \ + lang=`echo $$file | sed -e 's/^[^.]*\.//'`; \ + if test $$lang == 1; then \ + inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ + rm -f $(DESTDIR)$(mandir)/man1/$$inst ; \ + else \ + locale=`echo $$lang | sed -e 's/\..*//'` ; \ + inst=`echo $$file | sed -e "s/\.$${locale}\.1//" -e '$(transform)'`.1 ; \ + rm -f $(DESTDIR)$(mandir)/$$locale/man1/$$inst ; \ + fi; \ + done +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/utils/wxCas/docs/wxcas.1 b/src/utils/wxCas/docs/wxcas.1 new file mode 100644 index 00000000..21de8ce1 --- /dev/null +++ b/src/utils/wxCas/docs/wxcas.1 @@ -0,0 +1,23 @@ +.TH WXCAS 1 "January 2007" "wxCas" "aMule utilities" +.SH NAME +wxcas \- wx c aMule statistics +.SH SYNOPSIS +.B wxcas +.SH DESCRIPTION +.B wxcas +is a program for displaying the contents of your +online signature file in a nice wx Window on your Desktop. +Based on Pedro de Oliveira's \fBcas\fR(1). + +This program doesn't take any arguments. +.PP +The full documentation of wxcas can be downloaded from \fIhttp://download.berlios.de/amule/wxcas_user_manual.pdf\fR. +.SH AUTHOR +\fBwxcas\fR was written by ThePolish +.SH REPORTING BUGS +Please report bugs either on our forum (\fIhttp://forum.amule.org/\fR), or in our bugtracker (\fIhttp://bugs.amule.org/\fR). +Please do not report bugs in e-mail, neither to our mailing list nor directly to any team member. +.SH COPYRIGHT +aMule and all of its related utilities are distributed under the GNU General Public License. +.SH SEE ALSO +\fBamule\fR(1), \fBcas\fR(1) diff --git a/src/utils/wxCas/docs/wxcas.de.1 b/src/utils/wxCas/docs/wxcas.de.1 new file mode 100644 index 00000000..17aea68d --- /dev/null +++ b/src/utils/wxCas/docs/wxcas.de.1 @@ -0,0 +1,31 @@ +.\"******************************************************************* +.\" +.\" This file was generated with po4a. Translate the source file. +.\" +.\"******************************************************************* +.TH WXCAS 1 "Januar 2007" wxCas "aMule Hilfsprogramme" +.SH NAME +wxcas \- wx c aMule statistics +.SH SYNTAX +\fBwxcas\fP +.SH BESCHREIBUNG +\fBwxcas\fP ist ein Program das den Inhalt deiner aMule Onlinesignaturedatei in +menschenlesbarer Form in einem wx\-Fenster auf deinem Desktop +ausgibt. Basierend auf Pedro de Oliveira's \fBcas\fP(1). + +Dieses Programm hat keine Parameter +.PP +Die komplette Dokumentation zu wxcas kannst du herunter laden von: +\fIhttp://download.berlios.de/amule/wxcas_user_manual.pdf\fP. +.SH VERFASSER +\fBwxcas\fP wurde geschrieben von ThePolish +.SH "FEHLER MELDEN" +Bitte meldet Fehler entweder in unserem Forum (\fIhttp://forum.amule.org/\fP), +oder in unseren Bugtracker (\fIhttp://bugs.amule.org/\fP). Bitte meldet uns +keine Fehler per E\-Mail, noch auf unsere Mailingliste oder direkt an unsere +Teammitglieder. +.SH COPYRIGHT +aMule und alle seine zugehörigen Anwendungen werden verteilt unter der GNU +General Public License +.SH "SIEHE AUCH" +\fBamule\fP(1), \fBcas\fP(1) diff --git a/src/utils/wxCas/docs/wxcas.es.1 b/src/utils/wxCas/docs/wxcas.es.1 new file mode 100644 index 00000000..d6fd6474 --- /dev/null +++ b/src/utils/wxCas/docs/wxcas.es.1 @@ -0,0 +1,20 @@ +.TH WXCAS 1 "Marzo 2005" "wxCas" "Utilidades de aMule" +.SH NOMBRE +wxcas \- Estadísticas de aMule con interfáz gráfica +.SH SINOPSIS +.B wxcas +.SH DESCRIPCIÓN +.B wxcas +es un programa para leer el contenido de la firma de tu cliente aMule en una amigable ventana. +Basado en el programa \fBcas\fR(1) de Pedro de Oliveira. +.PP +La documentación completa de wxcas se puede descargar de \fIhttp://download.berlios.de/amule/wxcas_user_manual.pdf\fR. +.SH AUTOR +\fBwxcas\fR ha sido escrito por ThePolish +.SH BUGS +Si descubre bugs, por favor comuníquelos en (\fIhttp://forum.amule.org/\fR), o en nuestro bugtracker (\fIhttp://bugs.amule.org/\fR). +Por favor, no comunique bugs por e-mail, ni a nuestro maillist ni directamente a ningún miembro del equipo de aMule. +.SH COPYRIGHT +aMule, y todas las utilidades que con el vienen, se distribuyen bajo la licencia GPL. +.SH VER +\fBamule\fR(1), \fBcas\fR(1) diff --git a/src/utils/wxCas/docs/wxcas.eu.1 b/src/utils/wxCas/docs/wxcas.eu.1 new file mode 100644 index 00000000..8d0c7541 --- /dev/null +++ b/src/utils/wxCas/docs/wxcas.eu.1 @@ -0,0 +1,21 @@ +.TH WXCAS 1 "2005 Martxoa" "wxCas" "aMule utilities" +.SH IZENA +wxcas \- wx c aMule statistikak +.SH LABURPENA +.B wxcas +.SH AZALPENA +.B wxcas +zure aMule lineako sinadura fitxategiarne edukiak zure idazmahaieko wx leiho polit batetan bistaratzeko programa da. +Pedro de Oliveira\-ren \fBcas\fR(1)-en oinarriturik. +.PP +wxcas-en dokumentazio osoa \fIhttp://download.berlios.de/amule/wxcas_user_manual.pdf\fR-en deskarga daiteke. +.SH EGILEA +\fBwxcas\fR ThePolish-ek idatzia da. +.SH ZORRIEN BERRI EMATEN +Mesedez zorrien berri emateko gure foroa (\fIhttp://forum.amule.org/\fR), edo gure zorri kudeatzailea +(\fIhttp://bugs.amule.org/\fR) erabili. +Mesedez ez eman zorrien berri epostaz, ez gure eposta zerrendan ez taldeko partaideei. +.SH COPYRIGHT +aMule eta inguruneko lanabes guztiak GNU Lizentzia Publiko Orokorraz banatzen dira. +.SH IKUSI ERE +\fBamule\fR(1), \fBcas\fR(1) diff --git a/src/utils/wxCas/docs/wxcas.hu.1 b/src/utils/wxCas/docs/wxcas.hu.1 new file mode 100644 index 00000000..957686e3 --- /dev/null +++ b/src/utils/wxCas/docs/wxcas.hu.1 @@ -0,0 +1,21 @@ +.TH WXCAS 1 "2005 március" "wxCas" "aMule segédprogramok" +.SH NÉV +wxcas \- wx c aMule statisztikák +.SH ÁTTEKINTÉS +.B wxcas +.SH LEÍRÁS +A \fBwxcas\fR az aMule online-aláírás fájljának tartalmát jeleníti meg egy szép ablakban. +Készült a Pedro de Oliveira által készített \fBcas\fR(1) program alapján. +.PP +A \fBwxcas\fR teljes dokumentációja letölthetõ a \fIhttp://download.berlios.de/amule/wxcas_user_manual.pdf\fR címrõl. +.SH ÍRÓ +A \fBwxcas\fR-t ThePolish írta. +.SH HIBÁK JELENTÉSE +A hibákat kérjük vagy a fórumon (\fIhttp://forum.amule.org/\fR), vagy a hibakövetõben (\fIhttp://bugs.amule.org/\fR) jelentsék. +Hibákról kérjük ne írjanak levelet (e-mail-t) se a levelzési listára, se közvetlenül valamelyik fejlesztõnek. +.SH COPYRIGHT +Az aMule és az összes hozzá tartozó segédprogram a GNU General Public Licence védelme alatt áll. +.SH LÁSD MÉG +\fBamule\fR(1), \fBcas\fR(1) +.SH MAGYAR FORDÍTÁS +Dévai Tamás diff --git a/src/utils/wxCas/src/Makefile.am b/src/utils/wxCas/src/Makefile.am new file mode 100644 index 00000000..63aaa619 --- /dev/null +++ b/src/utils/wxCas/src/Makefile.am @@ -0,0 +1,51 @@ +bin_PROGRAMS = wxcas + +wxcas_SOURCES = onlinesig.cpp \ + linuxmon.cpp \ + wxcas.cpp \ + wxcasprint.cpp \ + wxcasframe.cpp \ + wxcasprefs.cpp \ + wxcascte.cpp \ + wxcaspix.cpp + +noinst_HEADERS = onlinesig.h \ + linuxmon.h \ + wxcas.h \ + wxcasprint.h \ + wxcasframe.h \ + wxcasprefs.h \ + wxcascte.h \ + wxcaspix.h + +wxcas_CFLAGS = $(WX_CFLAGS) +wxcas_CXXFLAGS = $(WX_CXXFLAGS) +wxcas_LDADD = $(WX_LIBS) + +# Resources + +if NEED_RC + +SUFFIXES = .rc + +wxcas_LDADD += wxcasrc.$(OBJEXT) + +wxcasrc.$(OBJEXT): $(srcdir)/../wxcas.rc wxcas-version.rc + cat $^ | \ + ( \ + abs_builddir=`pwd` ; \ + abs_top_srcdir=`cd $(top_srcdir) ; pwd` ; \ + cd $( "$@" + +CLEANFILES = *-version.rc + +endif + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/utils/wxCas/src/Makefile.in b/src/utils/wxCas/src/Makefile.in new file mode 100644 index 00000000..2904cb4c --- /dev/null +++ b/src/utils/wxCas/src/Makefile.in @@ -0,0 +1,732 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +SOURCES = $(wxcas_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = wxcas$(EXEEXT) +@NEED_RC_TRUE@am__append_1 = wxcasrc.$(OBJEXT) +subdir = src/utils/wxCas/src +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +PROGRAMS = $(bin_PROGRAMS) +am_wxcas_OBJECTS = wxcas-onlinesig.$(OBJEXT) wxcas-linuxmon.$(OBJEXT) \ + wxcas-wxcas.$(OBJEXT) wxcas-wxcasprint.$(OBJEXT) \ + wxcas-wxcasframe.$(OBJEXT) wxcas-wxcasprefs.$(OBJEXT) \ + wxcas-wxcascte.$(OBJEXT) wxcas-wxcaspix.$(OBJEXT) +wxcas_OBJECTS = $(am_wxcas_OBJECTS) +am__DEPENDENCIES_1 = +@NEED_RC_TRUE@am__DEPENDENCIES_2 = wxcasrc.$(OBJEXT) +wxcas_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +SOURCES = $(wxcas_SOURCES) +DIST_SOURCES = $(wxcas_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +wxcas_SOURCES = onlinesig.cpp \ + linuxmon.cpp \ + wxcas.cpp \ + wxcasprint.cpp \ + wxcasframe.cpp \ + wxcasprefs.cpp \ + wxcascte.cpp \ + wxcaspix.cpp + +noinst_HEADERS = onlinesig.h \ + linuxmon.h \ + wxcas.h \ + wxcasprint.h \ + wxcasframe.h \ + wxcasprefs.h \ + wxcascte.h \ + wxcaspix.h + +wxcas_CFLAGS = $(WX_CFLAGS) +wxcas_CXXFLAGS = $(WX_CXXFLAGS) +wxcas_LDADD = $(WX_LIBS) $(am__append_1) + +# Resources +@NEED_RC_TRUE@SUFFIXES = .rc +@NEED_RC_TRUE@CLEANFILES = *-version.rc +MAINTAINERCLEANFILES = Makefile.in +all: all-am + +.SUFFIXES: +.SUFFIXES: .rc .cpp .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/wxCas/src/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/utils/wxCas/src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +wxcas$(EXEEXT): $(wxcas_OBJECTS) $(wxcas_DEPENDENCIES) + @rm -f wxcas$(EXEEXT) + $(CXXLINK) $(wxcas_LDFLAGS) $(wxcas_OBJECTS) $(wxcas_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wxcas-linuxmon.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wxcas-onlinesig.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wxcas-wxcas.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wxcas-wxcascte.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wxcas-wxcasframe.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wxcas-wxcaspix.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wxcas-wxcasprefs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wxcas-wxcasprint.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +wxcas-onlinesig.o: onlinesig.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -MT wxcas-onlinesig.o -MD -MP -MF "$(DEPDIR)/wxcas-onlinesig.Tpo" -c -o wxcas-onlinesig.o `test -f 'onlinesig.cpp' || echo '$(srcdir)/'`onlinesig.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/wxcas-onlinesig.Tpo" "$(DEPDIR)/wxcas-onlinesig.Po"; else rm -f "$(DEPDIR)/wxcas-onlinesig.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='onlinesig.cpp' object='wxcas-onlinesig.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -c -o wxcas-onlinesig.o `test -f 'onlinesig.cpp' || echo '$(srcdir)/'`onlinesig.cpp + +wxcas-onlinesig.obj: onlinesig.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -MT wxcas-onlinesig.obj -MD -MP -MF "$(DEPDIR)/wxcas-onlinesig.Tpo" -c -o wxcas-onlinesig.obj `if test -f 'onlinesig.cpp'; then $(CYGPATH_W) 'onlinesig.cpp'; else $(CYGPATH_W) '$(srcdir)/onlinesig.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/wxcas-onlinesig.Tpo" "$(DEPDIR)/wxcas-onlinesig.Po"; else rm -f "$(DEPDIR)/wxcas-onlinesig.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='onlinesig.cpp' object='wxcas-onlinesig.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -c -o wxcas-onlinesig.obj `if test -f 'onlinesig.cpp'; then $(CYGPATH_W) 'onlinesig.cpp'; else $(CYGPATH_W) '$(srcdir)/onlinesig.cpp'; fi` + +wxcas-linuxmon.o: linuxmon.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -MT wxcas-linuxmon.o -MD -MP -MF "$(DEPDIR)/wxcas-linuxmon.Tpo" -c -o wxcas-linuxmon.o `test -f 'linuxmon.cpp' || echo '$(srcdir)/'`linuxmon.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/wxcas-linuxmon.Tpo" "$(DEPDIR)/wxcas-linuxmon.Po"; else rm -f "$(DEPDIR)/wxcas-linuxmon.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='linuxmon.cpp' object='wxcas-linuxmon.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -c -o wxcas-linuxmon.o `test -f 'linuxmon.cpp' || echo '$(srcdir)/'`linuxmon.cpp + +wxcas-linuxmon.obj: linuxmon.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -MT wxcas-linuxmon.obj -MD -MP -MF "$(DEPDIR)/wxcas-linuxmon.Tpo" -c -o wxcas-linuxmon.obj `if test -f 'linuxmon.cpp'; then $(CYGPATH_W) 'linuxmon.cpp'; else $(CYGPATH_W) '$(srcdir)/linuxmon.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/wxcas-linuxmon.Tpo" "$(DEPDIR)/wxcas-linuxmon.Po"; else rm -f "$(DEPDIR)/wxcas-linuxmon.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='linuxmon.cpp' object='wxcas-linuxmon.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -c -o wxcas-linuxmon.obj `if test -f 'linuxmon.cpp'; then $(CYGPATH_W) 'linuxmon.cpp'; else $(CYGPATH_W) '$(srcdir)/linuxmon.cpp'; fi` + +wxcas-wxcas.o: wxcas.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -MT wxcas-wxcas.o -MD -MP -MF "$(DEPDIR)/wxcas-wxcas.Tpo" -c -o wxcas-wxcas.o `test -f 'wxcas.cpp' || echo '$(srcdir)/'`wxcas.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/wxcas-wxcas.Tpo" "$(DEPDIR)/wxcas-wxcas.Po"; else rm -f "$(DEPDIR)/wxcas-wxcas.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='wxcas.cpp' object='wxcas-wxcas.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -c -o wxcas-wxcas.o `test -f 'wxcas.cpp' || echo '$(srcdir)/'`wxcas.cpp + +wxcas-wxcas.obj: wxcas.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -MT wxcas-wxcas.obj -MD -MP -MF "$(DEPDIR)/wxcas-wxcas.Tpo" -c -o wxcas-wxcas.obj `if test -f 'wxcas.cpp'; then $(CYGPATH_W) 'wxcas.cpp'; else $(CYGPATH_W) '$(srcdir)/wxcas.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/wxcas-wxcas.Tpo" "$(DEPDIR)/wxcas-wxcas.Po"; else rm -f "$(DEPDIR)/wxcas-wxcas.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='wxcas.cpp' object='wxcas-wxcas.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -c -o wxcas-wxcas.obj `if test -f 'wxcas.cpp'; then $(CYGPATH_W) 'wxcas.cpp'; else $(CYGPATH_W) '$(srcdir)/wxcas.cpp'; fi` + +wxcas-wxcasprint.o: wxcasprint.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -MT wxcas-wxcasprint.o -MD -MP -MF "$(DEPDIR)/wxcas-wxcasprint.Tpo" -c -o wxcas-wxcasprint.o `test -f 'wxcasprint.cpp' || echo '$(srcdir)/'`wxcasprint.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/wxcas-wxcasprint.Tpo" "$(DEPDIR)/wxcas-wxcasprint.Po"; else rm -f "$(DEPDIR)/wxcas-wxcasprint.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='wxcasprint.cpp' object='wxcas-wxcasprint.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -c -o wxcas-wxcasprint.o `test -f 'wxcasprint.cpp' || echo '$(srcdir)/'`wxcasprint.cpp + +wxcas-wxcasprint.obj: wxcasprint.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -MT wxcas-wxcasprint.obj -MD -MP -MF "$(DEPDIR)/wxcas-wxcasprint.Tpo" -c -o wxcas-wxcasprint.obj `if test -f 'wxcasprint.cpp'; then $(CYGPATH_W) 'wxcasprint.cpp'; else $(CYGPATH_W) '$(srcdir)/wxcasprint.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/wxcas-wxcasprint.Tpo" "$(DEPDIR)/wxcas-wxcasprint.Po"; else rm -f "$(DEPDIR)/wxcas-wxcasprint.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='wxcasprint.cpp' object='wxcas-wxcasprint.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -c -o wxcas-wxcasprint.obj `if test -f 'wxcasprint.cpp'; then $(CYGPATH_W) 'wxcasprint.cpp'; else $(CYGPATH_W) '$(srcdir)/wxcasprint.cpp'; fi` + +wxcas-wxcasframe.o: wxcasframe.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -MT wxcas-wxcasframe.o -MD -MP -MF "$(DEPDIR)/wxcas-wxcasframe.Tpo" -c -o wxcas-wxcasframe.o `test -f 'wxcasframe.cpp' || echo '$(srcdir)/'`wxcasframe.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/wxcas-wxcasframe.Tpo" "$(DEPDIR)/wxcas-wxcasframe.Po"; else rm -f "$(DEPDIR)/wxcas-wxcasframe.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='wxcasframe.cpp' object='wxcas-wxcasframe.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -c -o wxcas-wxcasframe.o `test -f 'wxcasframe.cpp' || echo '$(srcdir)/'`wxcasframe.cpp + +wxcas-wxcasframe.obj: wxcasframe.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -MT wxcas-wxcasframe.obj -MD -MP -MF "$(DEPDIR)/wxcas-wxcasframe.Tpo" -c -o wxcas-wxcasframe.obj `if test -f 'wxcasframe.cpp'; then $(CYGPATH_W) 'wxcasframe.cpp'; else $(CYGPATH_W) '$(srcdir)/wxcasframe.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/wxcas-wxcasframe.Tpo" "$(DEPDIR)/wxcas-wxcasframe.Po"; else rm -f "$(DEPDIR)/wxcas-wxcasframe.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='wxcasframe.cpp' object='wxcas-wxcasframe.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -c -o wxcas-wxcasframe.obj `if test -f 'wxcasframe.cpp'; then $(CYGPATH_W) 'wxcasframe.cpp'; else $(CYGPATH_W) '$(srcdir)/wxcasframe.cpp'; fi` + +wxcas-wxcasprefs.o: wxcasprefs.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -MT wxcas-wxcasprefs.o -MD -MP -MF "$(DEPDIR)/wxcas-wxcasprefs.Tpo" -c -o wxcas-wxcasprefs.o `test -f 'wxcasprefs.cpp' || echo '$(srcdir)/'`wxcasprefs.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/wxcas-wxcasprefs.Tpo" "$(DEPDIR)/wxcas-wxcasprefs.Po"; else rm -f "$(DEPDIR)/wxcas-wxcasprefs.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='wxcasprefs.cpp' object='wxcas-wxcasprefs.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -c -o wxcas-wxcasprefs.o `test -f 'wxcasprefs.cpp' || echo '$(srcdir)/'`wxcasprefs.cpp + +wxcas-wxcasprefs.obj: wxcasprefs.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -MT wxcas-wxcasprefs.obj -MD -MP -MF "$(DEPDIR)/wxcas-wxcasprefs.Tpo" -c -o wxcas-wxcasprefs.obj `if test -f 'wxcasprefs.cpp'; then $(CYGPATH_W) 'wxcasprefs.cpp'; else $(CYGPATH_W) '$(srcdir)/wxcasprefs.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/wxcas-wxcasprefs.Tpo" "$(DEPDIR)/wxcas-wxcasprefs.Po"; else rm -f "$(DEPDIR)/wxcas-wxcasprefs.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='wxcasprefs.cpp' object='wxcas-wxcasprefs.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -c -o wxcas-wxcasprefs.obj `if test -f 'wxcasprefs.cpp'; then $(CYGPATH_W) 'wxcasprefs.cpp'; else $(CYGPATH_W) '$(srcdir)/wxcasprefs.cpp'; fi` + +wxcas-wxcascte.o: wxcascte.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -MT wxcas-wxcascte.o -MD -MP -MF "$(DEPDIR)/wxcas-wxcascte.Tpo" -c -o wxcas-wxcascte.o `test -f 'wxcascte.cpp' || echo '$(srcdir)/'`wxcascte.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/wxcas-wxcascte.Tpo" "$(DEPDIR)/wxcas-wxcascte.Po"; else rm -f "$(DEPDIR)/wxcas-wxcascte.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='wxcascte.cpp' object='wxcas-wxcascte.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -c -o wxcas-wxcascte.o `test -f 'wxcascte.cpp' || echo '$(srcdir)/'`wxcascte.cpp + +wxcas-wxcascte.obj: wxcascte.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -MT wxcas-wxcascte.obj -MD -MP -MF "$(DEPDIR)/wxcas-wxcascte.Tpo" -c -o wxcas-wxcascte.obj `if test -f 'wxcascte.cpp'; then $(CYGPATH_W) 'wxcascte.cpp'; else $(CYGPATH_W) '$(srcdir)/wxcascte.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/wxcas-wxcascte.Tpo" "$(DEPDIR)/wxcas-wxcascte.Po"; else rm -f "$(DEPDIR)/wxcas-wxcascte.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='wxcascte.cpp' object='wxcas-wxcascte.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -c -o wxcas-wxcascte.obj `if test -f 'wxcascte.cpp'; then $(CYGPATH_W) 'wxcascte.cpp'; else $(CYGPATH_W) '$(srcdir)/wxcascte.cpp'; fi` + +wxcas-wxcaspix.o: wxcaspix.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -MT wxcas-wxcaspix.o -MD -MP -MF "$(DEPDIR)/wxcas-wxcaspix.Tpo" -c -o wxcas-wxcaspix.o `test -f 'wxcaspix.cpp' || echo '$(srcdir)/'`wxcaspix.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/wxcas-wxcaspix.Tpo" "$(DEPDIR)/wxcas-wxcaspix.Po"; else rm -f "$(DEPDIR)/wxcas-wxcaspix.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='wxcaspix.cpp' object='wxcas-wxcaspix.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -c -o wxcas-wxcaspix.o `test -f 'wxcaspix.cpp' || echo '$(srcdir)/'`wxcaspix.cpp + +wxcas-wxcaspix.obj: wxcaspix.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -MT wxcas-wxcaspix.obj -MD -MP -MF "$(DEPDIR)/wxcas-wxcaspix.Tpo" -c -o wxcas-wxcaspix.obj `if test -f 'wxcaspix.cpp'; then $(CYGPATH_W) 'wxcaspix.cpp'; else $(CYGPATH_W) '$(srcdir)/wxcaspix.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/wxcas-wxcaspix.Tpo" "$(DEPDIR)/wxcas-wxcaspix.Po"; else rm -f "$(DEPDIR)/wxcas-wxcaspix.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='wxcaspix.cpp' object='wxcas-wxcaspix.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wxcas_CXXFLAGS) $(CXXFLAGS) -c -o wxcas-wxcaspix.obj `if test -f 'wxcaspix.cpp'; then $(CYGPATH_W) 'wxcaspix.cpp'; else $(CYGPATH_W) '$(srcdir)/wxcaspix.cpp'; fi` +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-binPROGRAMS + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-binPROGRAMS uninstall-info-am + + +@NEED_RC_TRUE@wxcasrc.$(OBJEXT): $(srcdir)/../wxcas.rc wxcas-version.rc +@NEED_RC_TRUE@ cat $^ | \ +@NEED_RC_TRUE@ ( \ +@NEED_RC_TRUE@ abs_builddir=`pwd` ; \ +@NEED_RC_TRUE@ abs_top_srcdir=`cd $(top_srcdir) ; pwd` ; \ +@NEED_RC_TRUE@ cd $( "$@" +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/utils/wxCas/src/linuxmon.cpp b/src/utils/wxCas/src/linuxmon.cpp new file mode 100644 index 00000000..eda96276 --- /dev/null +++ b/src/utils/wxCas/src/linuxmon.cpp @@ -0,0 +1,114 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: LinuxMon Class +/// +/// Purpose: Monitor Linux system by reading /proc file system +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Derived from CAS by Pedro de Oliveira +/// +/// Pixmats from aMule http://www.amule.org +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include "linuxmon.h" + +#include +#include + +// Constants +const wxFileName +LinuxMon::UPTIME_FILE ( wxT( "/proc/uptime" ) ); + +const wxFileName +LinuxMon::LOADAVG_FILE ( wxT( "/proc/loadavg" ) ); + +// Constructors +LinuxMon::LinuxMon () +{ + Refresh (); +} + +// Destructor +LinuxMon::~LinuxMon () +{} + +// Refresh +void +LinuxMon::Refresh () +{ + wxFileInputStream upInput ( UPTIME_FILE.GetFullPath () ); + wxFileInputStream loadInput ( LOADAVG_FILE.GetFullPath () ); + + wxTextInputStream upText ( upInput ); + wxTextInputStream loadText ( loadInput ); + + loadText >> m_sysLoad_1; + loadText >> m_sysLoad_5; + loadText >> m_sysLoad_15; + + double uptime; + upText >> uptime; + + wxInt32 day, hour, min, sec; + day = ( wxInt32 ) ( uptime / 86400 ); + hour = ( wxInt32 ) ( ( uptime - day * 86400 ) / 3600 ); + min = ( wxInt32 ) ( ( uptime - day * 86400 - hour * 3600 ) / 60 ); + sec = ( wxInt32 ) ( uptime - day * 86400 - hour * 3600 - min * 60 ); + + m_uptime = + m_uptime.Format ( _( "%i day(s) %i hour(s) %i min %i s" ), day, hour, min, + sec ); +} + +// Accessors +wxString +LinuxMon::GetUptime () const +{ + return m_uptime; +} + +wxString +LinuxMon::GetSysLoad_1 () const +{ + return m_sysLoad_1; +} + +wxString +LinuxMon::GetSysLoad_5 () const +{ + return m_sysLoad_5; +} + +wxString +LinuxMon::GetSysLoad_15 () const +{ + return m_sysLoad_15; +} +// File_checked_for_headers diff --git a/src/utils/wxCas/src/linuxmon.h b/src/utils/wxCas/src/linuxmon.h new file mode 100644 index 00000000..7d020972 --- /dev/null +++ b/src/utils/wxCas/src/linuxmon.h @@ -0,0 +1,82 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: LinuxMon Class +/// +/// Purpose: Monitor Linux system by reading /proc file system +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Derived from CAS by Pedro de Oliveira +/// +/// Pixmats from aMule http://www.amule.org +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _LINUXMON_H +#define _LINUXMON_H + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include + +/// Linux Monitoring +class LinuxMon +{ +private: + wxString m_uptime; + + wxString m_sysLoad_1; + wxString m_sysLoad_5; + wxString m_sysLoad_15; + + static const wxFileName UPTIME_FILE; + static const wxFileName LOADAVG_FILE; + +public: + /// Constructor + LinuxMon (); + + /// Destructor + ~LinuxMon (); + + /// Refresh stored informations + void Refresh (); + + /// Get system uptime + wxString GetUptime () const; + + /// Get 1min average CPU load + wxString GetSysLoad_1 () const; + + /// Get 5min averag CPU load + wxString GetSysLoad_5 () const; + + /// Get 15min averag CPU load + wxString GetSysLoad_15 () const; +}; + +#endif /* _LINUXMON_H */ +// File_checked_for_headers diff --git a/src/utils/wxCas/src/onlinesig.cpp b/src/utils/wxCas/src/onlinesig.cpp new file mode 100644 index 00000000..49431800 --- /dev/null +++ b/src/utils/wxCas/src/onlinesig.cpp @@ -0,0 +1,363 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: OnLineSig Class +/// +/// Purpose: Monitor aMule Online Statistics by reading amulesig.dat file +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Derived from CAS by Pedro de Oliveira +/// +/// Pixmats from aMule http://www.amule.org +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include "onlinesig.h" + +#include +#include + +// Constructor +OnLineSig::OnLineSig ( const wxFileName& file, + const double absoluteMaxDL, + const wxDateTime absoluteMaxDlDate ) +{ + m_amulesig = file; + + m_sessionMaxDL = 0.0; + m_sessionMaxDLDate = wxDateTime::Now(); + + m_absoluteMaxDL = absoluteMaxDL; + m_absoluteMaxDlDate = absoluteMaxDlDate; + + m_isSessionMaxDlReseted = false; + m_isAbsoluteMaxDlReseted = false; + + Refresh (); +} + +// Destructor +OnLineSig::~OnLineSig () +{} + +// Accessors +void +OnLineSig::SetAmuleSig ( const wxFileName& file ) +{ + m_amulesig = file; + Refresh (); +} + +void +OnLineSig::Refresh () +{ + wxFile file; + if ( file.Open(m_amulesig.GetFullPath ()) ) { + wxFileInputStream input ( file ); + + wxTextInputStream text ( input ); + text.SetStringSeparators ( wxT( "\n" ) ); + + text >> m_amuleState; + text >> m_serverName; + text >> m_serverIP; + text >> m_serverPort; + text >> m_connexionID; + text >> m_kadInfo; + text >> m_DLRate; + text >> m_ULRate; + text >> m_queue; + text >> m_sharedFiles; + text >> m_user; + text >> m_totalDL; + text >> m_totalUL; + text >> m_version; + text >> m_sessionDL; + text >> m_sessionUL; + text >> m_runTimeS; + + double dl; + m_DLRate.ToDouble ( &dl ); + + if ( dl > m_sessionMaxDL || m_isSessionMaxDlReseted ) { + m_sessionMaxDL = dl; + m_sessionMaxDLDate = wxDateTime::Now(); + m_isSessionMaxDlChanged = true; + m_isSessionMaxDlReseted = false; + } + else { + m_isSessionMaxDlChanged = false; + } + + if ( dl > m_absoluteMaxDL || m_isAbsoluteMaxDlReseted ) { + m_absoluteMaxDL = dl; + m_absoluteMaxDlDate = wxDateTime::Now(); + m_isAbsoluteMaxDlChanged = true; + m_isAbsoluteMaxDlReseted = false; + } + else { + m_isAbsoluteMaxDlChanged = false; + } + } + file.Close(); + +} + +int OnLineSig::GetAmuleState() const +{ + if ( m_amuleState >= 0 && m_amuleState <= 2 ) { + return ( m_amuleState ); + } else { + return ( -1 ); + } +} + +int OnLineSig::GetKadState() const +{ + if ( m_kadInfo >= 0 && m_kadInfo <= 2 ) { + return ( m_kadInfo ); + } else { + return ( -1 ); + } +} + +wxString OnLineSig::GetServerName () const +{ + return m_serverName; +} + +wxString OnLineSig::GetServerIP () const +{ + return m_serverIP; +} + +wxString OnLineSig::GetServerPort () const +{ + return m_serverPort; +} + +wxString OnLineSig::GetConnexionID () const +{ + return m_connexionID; +} + +wxString OnLineSig::GetULRate () const +{ + return m_ULRate; +} + +wxString OnLineSig::GetDLRate () const +{ + return m_DLRate; +} + +wxString OnLineSig::GetQueue () const +{ + return m_queue; +} + +wxString OnLineSig::GetSharedFiles () const +{ + return m_sharedFiles; +} + +wxString OnLineSig::GetUser () const +{ + return m_user; +} + +wxString OnLineSig::GetTotalUL () const +{ + return m_totalUL; +} + + +wxString OnLineSig::GetTotalDL () const +{ + return m_totalDL; +} + +wxString OnLineSig::GetVersion () const +{ + return m_version; +} + +wxString OnLineSig::GetSessionUL () const +{ + return m_sessionUL; +} + +wxString OnLineSig::GetSessionDL () const +{ + return m_sessionDL; +} + +//only used to check if aMule is running or not +int OnLineSig::GetUpStatus () const +{ + return m_runTimeS; +} + +wxString OnLineSig::GetRunTime () +{ + unsigned int seconds = m_runTimeS; + unsigned int days = PullCount( &seconds, 86400 ); + unsigned int hours = PullCount( &seconds, 3600 ); + unsigned int minutes = PullCount( &seconds, 60 ); + + if ( days > 0 ) { + return ( wxString::Format ( _( "%02uD %02uh %02umin %02us" ), days, hours, minutes, seconds ) ); + } else if ( hours > 0 ) { + return ( wxString::Format ( _( "%02uh %02umin %02us" ), hours, minutes, seconds ) ); + } else if ( minutes > 0 ) { + return ( wxString::Format ( _( "%02umin %02us" ), minutes, seconds ) ); + } else { + return ( wxString::Format ( _( "%02us" ), seconds ) ); + } +} + +wxString OnLineSig::GetConvertedTotalUL () +{ + return ( BytesConvertion ( m_totalUL ) ); +} + +wxString OnLineSig::GetConvertedTotalDL () +{ + return ( BytesConvertion ( m_totalDL ) ); +} + +wxString OnLineSig::GetConvertedSessionUL () +{ + return ( BytesConvertion ( m_sessionUL ) ); +} + +wxString OnLineSig::GetConvertedSessionDL () +{ + return ( BytesConvertion ( m_sessionDL ) ); +} + +wxString OnLineSig::GetConnexionIDType () const +{ + if ( m_connexionID == wxT( "H" ) ) { + return ( wxString ( _( "HighID" ) ) ); + } else if ( m_connexionID == wxT( "L" ) ) { + return ( wxString ( _( "LowID" ) ) ); + } + else { + return ( wxString ( _( "Not Connected" ) ) ); + } +} + +double OnLineSig::GetSessionMaxDL () const +{ + return ( m_sessionMaxDL ); +} + +wxDateTime OnLineSig::GetSessionMaxDlDate () const +{ + return ( m_sessionMaxDLDate ); +} + +void OnLineSig::ResetSessionMaxDL () +{ + m_sessionMaxDL = 0.0; + m_sessionMaxDLDate = wxDateTime::Now(); + m_isSessionMaxDlReseted = true; +} + +bool OnLineSig::IsSessionMaxDlChanged() const +{ + return ( m_isSessionMaxDlChanged ); +} + +double OnLineSig::GetAbsoluteMaxDL () const +{ + return ( m_absoluteMaxDL ); +} + +wxDateTime OnLineSig::GetAbsoluteMaxDlDate () const +{ + return ( m_absoluteMaxDlDate ); +} + +void OnLineSig::ResetAbsoluteMaxDL () +{ + m_absoluteMaxDL = 0.0; + m_absoluteMaxDlDate = wxDateTime::Now(); + m_isAbsoluteMaxDlReseted = true; +} + +bool OnLineSig::IsAbsoluteMaxDlChanged() const +{ + return ( m_isAbsoluteMaxDlChanged ); +} + +// Private use +wxString OnLineSig::BytesConvertion ( const wxString & bytes ) +{ + double + d_bytes; + wxString + c_bytes; + + bytes.ToDouble ( &d_bytes ); + + int + i = 0; + while ( d_bytes > 1024 ) { + d_bytes /= 1024; + i++; + } + + switch ( i ) { + case 0: + c_bytes = wxString::Format ( _( "%.0f B" ), d_bytes ); + break; + case 1: + c_bytes = wxString::Format ( _( "%.2f KB" ), d_bytes ); + break; + case 2: + c_bytes = wxString::Format ( _( "%.2f MB" ), d_bytes ); + break; + case 3: + c_bytes = wxString::Format ( _( "%.2f GB" ), d_bytes ); + break; + default: + c_bytes = wxString::Format ( _( "%.2f TB" ), d_bytes ); + break; + } + return c_bytes; +} + +unsigned int OnLineSig::PullCount ( unsigned int *runtime, const unsigned int count ) +{ + unsigned int answer = *runtime / count; + *runtime -= answer * count; + return answer; +} +// File_checked_for_headers diff --git a/src/utils/wxCas/src/onlinesig.h b/src/utils/wxCas/src/onlinesig.h new file mode 100644 index 00000000..5e77088e --- /dev/null +++ b/src/utils/wxCas/src/onlinesig.h @@ -0,0 +1,193 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: OnLineSig Class +/// +/// Purpose: Monitor aMule Online Statistics by reading amulesig.dat file +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Derived from CAS by Pedro de Oliveira +/// +/// Pixmats from aMule http://www.amule.org +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _ONLINESIG_H +#define _ONLINESIG_H + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include +#include + +/// amulesig.dat file monitoring +class OnLineSig +{ +private: + double m_sessionMaxDL; + wxDateTime m_sessionMaxDLDate; + bool m_isSessionMaxDlChanged; + bool m_isSessionMaxDlReseted; + + double m_absoluteMaxDL; + wxDateTime m_absoluteMaxDlDate; + bool m_isAbsoluteMaxDlChanged; + bool m_isAbsoluteMaxDlReseted; + + int m_amuleState; + wxString m_serverName; + wxString m_serverIP; + wxString m_serverPort; + wxString m_connexionID; + int m_kadInfo; + wxString m_ULRate; + wxString m_DLRate; + wxString m_queue; + wxString m_sharedFiles; + wxString m_user; + wxString m_totalUL; + wxString m_totalDL; + wxString m_version; + wxString m_sessionUL; + wxString m_sessionDL; + unsigned int m_runTimeS; + + wxFileName m_amulesig; + + wxString BytesConvertion ( const wxString& bytes ); + unsigned int PullCount ( unsigned int *runtime, const unsigned int count ); + + +public: + /// Constructor + OnLineSig ( const wxFileName& file, const double absoluteMaxDL = 0.0, + const wxDateTime absoluteMaxDlDate = wxDateTime::Now() ); + + /// Destructor + ~OnLineSig (); + + /// Set amulesig.dat file name and path + void SetAmuleSig ( const wxFileName& file ); + + /// Refresh stored informations + void Refresh (); + + /// Return TRUE if aMule is running + int GetAmuleState () const; + + /// Return kad stat + int GetKadState () const; + + /// Get server name + wxString GetServerName () const; + + /// Get server IP + wxString GetServerIP () const; + + /// Get server Port + wxString GetServerPort () const; + + /// Get server connexion ID: H or L + wxString GetConnexionID () const; + + /// Get Upload rate + wxString GetULRate () const; + + /// Get Download rate + wxString GetDLRate () const; + + /// Get number of clients in queue + wxString GetQueue () const; + + /// Get number of shared files + wxString GetSharedFiles () const; + + /// Get user name + wxString GetUser () const; + + /// Get total Upload + wxString GetTotalUL () const; + + /// Get total Download + wxString GetTotalDL () const; + + /// Get aMule version + wxString GetVersion () const; + + /// Get session Upload + wxString GetSessionUL () const; + + /// Get session Download + wxString GetSessionDL () const; + + /// Getrunnin Status + int GetUpStatus () const; + + /// Get aMule runtime + wxString GetRunTime (); + + /// Get total Upload in the best representative unit + wxString GetConvertedTotalUL (); + + /// Get total Download in the best representative unit + wxString GetConvertedTotalDL (); + + /// Get session Upload in the best representative unit + wxString GetConvertedSessionUL (); + + /// Get session Download in the best representative unit + wxString GetConvertedSessionDL (); + + /// Get server connexion ID: LowID or HighID + wxString GetConnexionIDType () const; + + /// Get max Download rate since wxCas is running + double GetSessionMaxDL () const; + + /// Get max Download date since wxCas is running + wxDateTime GetSessionMaxDlDate () const; + + /// Has the Max session DL rate been beated since last refresh + bool IsSessionMaxDlChanged() const; + + /// Reset absolute max Download rate and date + void ResetSessionMaxDL (); + + /// Get absolute max Download rate + double GetAbsoluteMaxDL () const; + + /// Get absolute max Download date + wxDateTime GetAbsoluteMaxDlDate () const; + + /// Has the absolute Max session DL rate been beated since last refresh + bool IsAbsoluteMaxDlChanged() const; + + /// Reset absolute max Download rate + void ResetAbsoluteMaxDL (); +}; + +#endif /* _ONLINESIG_H */ +// File_checked_for_headers diff --git a/src/utils/wxCas/src/wxcas.cpp b/src/utils/wxCas/src/wxcas.cpp new file mode 100644 index 00000000..e0f86d11 --- /dev/null +++ b/src/utils/wxCas/src/wxcas.cpp @@ -0,0 +1,106 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: wxCas Class +/// +/// Purpose: wxCas application class +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Derived from CAS by Pedro de Oliveira +/// +/// Pixmats from aMule http://www.amule.org +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx/wx.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#ifdef HAVE_CONFIG_H +#include "config.h" // Needed for PACKAGE +#endif + +#if !wxUSE_PRINTING_ARCHITECTURE +#error You must set wxUSE_PRINTING_ARCHITECTURE to 1 in setup.h to compile wxCas. +#endif + +#include + +#include "wxcas.h" + +// Application implementation +IMPLEMENT_APP ( WxCas ) + +bool +WxCas::OnInit () +{ + // Used to tell wxCas to use aMule catalog + m_locale.Init(); + m_locale.AddCatalog( wxT( PACKAGE ) ); + +#if wxUSE_LIBPNG + + wxImage::AddHandler ( new wxPNGHandler ); +#endif + +#if wxUSE_LIBJPEG + + wxImage::AddHandler ( new wxJPEGHandler ); +#endif + +#ifdef __WXMSW__ + + SetPrintMode ( wxPRINT_WINDOWS ); +#else + + SetPrintMode ( wxPRINT_POSTSCRIPT ); +#endif + + // Prefs + wxConfigBase::Get(); + + // Main Frame + m_frame = new WxCasFrame ( _( "wxCas, aMule Online Statistics" ) ); + + // Show all + m_frame->Show ( TRUE ); + SetTopWindow ( m_frame ); + return true; +} + +int +WxCas::OnExit() +{ + delete wxConfigBase::Set( ( wxConfigBase * ) NULL ); + return 0; +} + +WxCasFrame * +WxCas::GetMainFrame () const +{ + return m_frame; +} + +// File_checked_for_headers diff --git a/src/utils/wxCas/src/wxcas.h b/src/utils/wxCas/src/wxcas.h new file mode 100644 index 00000000..d86299da --- /dev/null +++ b/src/utils/wxCas/src/wxcas.h @@ -0,0 +1,69 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: wxCas Class +/// +/// Purpose: wxCas application class +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Derived from CAS by Pedro de Oliveira +/// +/// Pixmats from aMule http://www.amule.org +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _WXCAS_H +#define _WXCAS_H + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include "wxcasframe.h" + +/// Application +class WxCas: public wxApp +{ +private: + WxCasFrame * m_frame; + +protected: + wxLocale m_locale; // Used to tell wxCas to use aMule catalog + +public: + + /// Application initialisation + virtual bool OnInit (); + + /// Cleaning on exit + virtual int OnExit(); + + /// Get application main frame + WxCasFrame *GetMainFrame () const; +}; + +DECLARE_APP ( WxCas ) + +#endif /* _WXCAS_H */ +// File_checked_for_headers diff --git a/src/utils/wxCas/src/wxcascte.cpp b/src/utils/wxCas/src/wxcascte.cpp new file mode 100644 index 00000000..ceacf580 --- /dev/null +++ b/src/utils/wxCas/src/wxcascte.cpp @@ -0,0 +1,171 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: wxCasCte Structure +/// +/// Purpose: Store constants used in wxCas application +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Derived from CAS by Pedro de Oliveira +/// +/// Pixmats from aMule http://www.amule.org +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#include + +#ifdef __WXMAC__ + #include // Do_not_auto_remove + #include // Do_not_auto_remove + #include // Do_not_auto_remove +#elif defined(__WINDOWS__) + #include // Do_not_auto_remove + #include // Do_not_auto_remove +#endif + +#include "wxcascte.h" + +const wxString +WxCasCte::AMULESIG_FILENAME ( wxT( "amulesig.dat" ) ); +const wxString +WxCasCte::AMULESIG_IMG_NAME ( wxT( "aMule-online-sign" ) ); + +// Refresh rate limits +const wxUint32 +WxCasCte::MIN_REFRESH_RATE = 1; +const wxUint32 +WxCasCte::MAX_REFRESH_RATE = 3600; + +// FTP update limits +const wxUint32 +WxCasCte::MIN_FTP_RATE = 1; +const wxUint32 +WxCasCte::MAX_FTP_RATE = 1440; + + +// Key config names +const wxString +WxCasCte::AMULESIG_PATH_KEY ( wxT( "OSDirectory" ) ); +const wxString +WxCasCte::REFRESH_RATE_KEY ( wxT( "RefreshRate" ) ); + +const wxString +WxCasCte::ENABLE_AUTOSTATIMG_KEY ( wxT( "EnableAutoStatImg" ) ); +const wxString +WxCasCte::AUTOSTATIMG_DIR_KEY ( wxT( "StatImgDirectory" ) ); +const wxString +WxCasCte::AUTOSTATIMG_TYPE_KEY ( wxT( "StatImgType" ) ); + +const wxString +WxCasCte::ENABLE_FTP_UPDATE_KEY( wxT( "EnableFtpUpdate" ) ); +const wxString +WxCasCte::FTP_UPDATE_RATE_KEY ( wxT( "FtpUpdateRate" ) ); +const wxString +WxCasCte::FTP_URL_KEY ( wxT( "FtpUrl" ) ); +const wxString +WxCasCte::FTP_PATH_KEY ( wxT( "FtpPath" ) ); +const wxString +WxCasCte::FTP_USER_KEY ( wxT( "FtpUser" ) ); +const wxString +WxCasCte::FTP_PASSWD_KEY ( wxT( "FtpPasswd" ) ); + +const wxString +WxCasCte::ABSOLUTE_MAX_DL_KEY ( wxT( "AbsoluteMaxDL" ) ); +const wxString +WxCasCte::ABSOLUTE_MAX_DL_DATE_KEY ( wxT( "AbsoluteMaxDlDate" ) ); + +// Default config parameters +const wxString +WxCasCte::DEFAULT_AMULESIG_PATH ( GetDefaultAmulesigPath() ); +const wxUint32 +WxCasCte::DEFAULT_REFRESH_RATE = 5; + +const bool +WxCasCte::DEFAULT_AUTOSTATIMG_ISENABLED = FALSE; +const wxString +WxCasCte::DEFAULT_AUTOSTATIMG_PATH ( wxFileName::GetHomeDir () ); +const wxString +WxCasCte::DEFAULT_AUTOSTATIMG_TYPE ( wxT( "PNG" ) ); + +const bool +WxCasCte::DEFAULT_FTP_UPDATE_ISENABLED = FALSE; +const wxUint32 +WxCasCte::DEFAULT_FTP_UPDATE_RATE = 10; +const wxString +WxCasCte::DEFAULT_FTP_URL( wxT( "ftp.myftp.cx" ) ); +const wxString +WxCasCte::DEFAULT_FTP_PATH( wxT( "/pub/myamuledir" ) ); +const wxString +WxCasCte::DEFAULT_FTP_USER( wxT( "anonymous" ) ); +const wxString +WxCasCte::DEFAULT_FTP_PASSWD( wxT( "whiterabit@here" ) ); + +wxString GetDefaultAmulesigPath() +{ + wxString strDir; + +#ifdef __WXMAC__ + + FSRef fsRef; + if (FSFindFolder(kUserDomain, kApplicationSupportFolderType, kCreateFolder, &fsRef) == noErr) + { + CFURLRef urlRef = CFURLCreateFromFSRef(NULL, &fsRef); + CFStringRef cfString = CFURLCopyFileSystemPath(urlRef, kCFURLPOSIXPathStyle); + CFRelease(urlRef) ; + strDir = wxMacCFStringHolder(cfString).AsString(wxLocale::GetSystemEncoding()) + + wxFileName::GetPathSeparator() + wxT("aMule"); + } + +#elif defined(__WINDOWS__) + + LPITEMIDLIST pidl; + + HRESULT hr = SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl); + + if (SUCCEEDED(hr)) { + if (!SHGetPathFromIDList(pidl, wxStringBuffer(strDir, MAX_PATH))) { + strDir = wxEmptyString; + } else { + strDir = strDir + wxFileName::GetPathSeparator() + wxT("aMule"); + } + } + + if (pidl) { + LPMALLOC pMalloc; + SHGetMalloc(&pMalloc); + if (pMalloc) { + pMalloc->Free(pidl); + pMalloc->Release(); + } + } + +#else + + strDir = wxFileName::GetHomeDir() + wxFileName::GetPathSeparator() + wxT(".aMule"); + +#endif + + return strDir; +} +// File_checked_for_headers diff --git a/src/utils/wxCas/src/wxcascte.h b/src/utils/wxCas/src/wxcascte.h new file mode 100644 index 00000000..4c989a5b --- /dev/null +++ b/src/utils/wxCas/src/wxcascte.h @@ -0,0 +1,144 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: wxCasCte Structure +/// +/// Purpose: Store constants used in wxCas application +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Derived from CAS by Pedro de Oliveira +/// +/// Pixmats from aMule http://www.amule.org +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _WXCASCTE_H +#define _WXCASCTE_H + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +/// Constants used in wxCas +struct WxCasCte +{ + /// Name of amulesig.dat file + static const wxString AMULESIG_FILENAME; + + /// Name of the generated statistics image + static const wxString AMULESIG_IMG_NAME; + + /// Refresh rate minimum limit + static const wxUint32 MIN_REFRESH_RATE; + + /// Refresh rate maximum limit + static const wxUint32 MAX_REFRESH_RATE; + + /// FTP update rate minimum limit + static const wxUint32 MIN_FTP_RATE; + + /// FTP update rate maximum limit + static const wxUint32 MAX_FTP_RATE; + + // Key config names + + /// Configuration key for amulesig.dat file's directory + static const wxString AMULESIG_PATH_KEY; + + /// Configuration key for refresh rate + static const wxString REFRESH_RATE_KEY; + + /// Configuration key for enabling autogenation of statistics image + static const wxString ENABLE_AUTOSTATIMG_KEY; + + /// Configuration key for auto saving statistics image directory + static const wxString AUTOSTATIMG_DIR_KEY; + + /// Configuration key for auto saving statistics image type + static const wxString AUTOSTATIMG_TYPE_KEY; + + /// Configuration key for enabling FTP auto update + static const wxString ENABLE_FTP_UPDATE_KEY; + + /// Configuration key for FTP update rate + static const wxString FTP_UPDATE_RATE_KEY; + + /// Configuration key for FTP URL + static const wxString FTP_URL_KEY; + + /// Configuration key for FTP path + static const wxString FTP_PATH_KEY; + + /// Configuration key for FTP login username + static const wxString FTP_USER_KEY; + + /// Configuration key for FTP login password + static const wxString FTP_PASSWD_KEY; + + /// Configuration key storing maximum DL rate during previous wxCas runs + static const wxString ABSOLUTE_MAX_DL_KEY; + + /// Configuration key storing maximum DL rate date during previous wxCas runs + static const wxString ABSOLUTE_MAX_DL_DATE_KEY; + + // Default config parameters + + /// Configuration default amulesig.dat file's directory + static const wxString DEFAULT_AMULESIG_PATH; + + /// Configuration default for refresh rate + static const wxUint32 DEFAULT_REFRESH_RATE; + + /// Configuration default for enabling autogenation of statistics image + static const bool DEFAULT_AUTOSTATIMG_ISENABLED; + + /// Configuration default for auto saving statistics image directory + static const wxString DEFAULT_AUTOSTATIMG_PATH; + + /// Configuration default for auto saving statistics image type + static const wxString DEFAULT_AUTOSTATIMG_TYPE; + + /// Configuration default for enabling FTP auto update + static const bool DEFAULT_FTP_UPDATE_ISENABLED; + + /// Configuration default for FTP update rate + static const wxUint32 DEFAULT_FTP_UPDATE_RATE; + + /// Configuration default for FTP URL + static const wxString DEFAULT_FTP_URL; + + /// Configuration default for FTP path + static const wxString DEFAULT_FTP_PATH; + + /// Configuration default for FTP login username + static const wxString DEFAULT_FTP_USER; + + /// Configuration default for FTP login password + static const wxString DEFAULT_FTP_PASSWD; +}; + +wxString GetDefaultAmulesigPath(); + +#endif /* _WXCASCTE_H */ +// File_checked_for_headers diff --git a/src/utils/wxCas/src/wxcasframe.cpp b/src/utils/wxCas/src/wxcasframe.cpp new file mode 100644 index 00000000..72c6f064 --- /dev/null +++ b/src/utils/wxCas/src/wxcasframe.cpp @@ -0,0 +1,1183 @@ +//////////////////////////////////////////////////////////////////////////////// +/// Name: wxCasFrame Class +/// +/// Purpose: wxCas main frame +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Derived from CAS by Pedro de Oliveira +/// +/// Pixmats from aMule http://www.amule.org +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "wxcasframe.h" +#include "wxcasprint.h" +#include "wxcasprefs.h" +#include "wxcascte.h" +#include "wxcaspix.h" + +// Constructor +WxCasFrame::WxCasFrame ( const wxString & title ) : + wxFrame ( ( wxFrame * ) NULL, -1, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE ) +{ + // Give it an icon +#ifdef __WXMSW__ + wxIcon icon(wxT("wxcas")); +#else + wxIcon icon; + icon.CopyFromBitmap( WxCasPix::getPixmap( wxT( "wxcas" ) ) ); +#endif + SetIcon ( icon ); + + // Prefs + wxConfigBase * prefs = wxConfigBase::Get(); + + m_maxLineCount = 0; + + // Check if we have a previous DL max hit + double absoluteMaxDL = ( double ) ( prefs->Read ( WxCasCte::ABSOLUTE_MAX_DL_KEY, 0L ) ) / 1024.0; // Stored in bytes + wxDateTime absoluteMaxDlDate( ( time_t ) ( prefs->Read ( WxCasCte::ABSOLUTE_MAX_DL_DATE_KEY, + ( long ) ( wxDateTime::Now().GetTicks() ) ) ) ); // Stored in Ticks + + // Add Online Sig file + m_aMuleSig = new OnLineSig ( wxFileName( prefs-> + Read ( WxCasCte::AMULESIG_PATH_KEY, + WxCasCte::DEFAULT_AMULESIG_PATH ), + WxCasCte::AMULESIG_FILENAME ), + absoluteMaxDL, absoluteMaxDlDate ); + + //Save absolute hit if we reach it during constructing + if ( m_aMuleSig->IsSessionMaxDlChanged() ) { + SaveAbsoluteHits(); + } + +#ifdef __LINUX__ // System monitoring on Linux + + m_sysMonitor = new LinuxMon (); +#endif + + // Status Bar + CreateStatusBar (); + SetStatusText ( _( "Welcome!" ) ); + + // Frame Vertical sizer + m_frameVBox = new wxBoxSizer ( wxVERTICAL ); + + // Add Main panel to frame (needed by win32 for padding sub panels) + m_mainPanel = new wxPanel ( this, -1 ); + + // Main Panel Vertical Sizer + m_mainPanelVBox = new wxBoxSizer ( wxVERTICAL ); + + // Main Panel static line + m_staticLine = new wxStaticLine ( m_mainPanel, -1 ); + +#ifdef __WXMSW__ + + m_BottomStaticLine = new wxStaticLine ( m_mainPanel, -1 ); +#endif + + // Statistics Static Vertical Box Sizer + m_sigPanelSBox = new wxStaticBox ( m_mainPanel, -1, _( "aMule" ) ); + m_sigPanelSBoxSizer = new wxStaticBoxSizer ( m_sigPanelSBox, wxVERTICAL ); + + // Hit Static Horizontal Box Sizer + m_hitPanelSBox = new wxStaticBox ( m_mainPanel, -1, _( "Maximum DL rate since wxCas is running" ) ); + m_hitPanelSBoxSizer = new wxStaticBoxSizer ( m_hitPanelSBox, wxHORIZONTAL ); + + // Hit Static Horizontal Box Sizer + m_absHitPanelSBox = new wxStaticBox ( m_mainPanel, -1, _( "Absolute Maximum DL rate during wxCas previous runs" ) ); + m_absHitPanelSBoxSizer = new wxStaticBoxSizer ( m_absHitPanelSBox, wxHORIZONTAL ); + + // Statistic labels + m_statLine_1 = new wxStaticText ( m_mainPanel, -1, MakeStatLine_1() ); + m_statLine_2 = new wxStaticText ( m_mainPanel, -1, MakeStatLine_2() ); + m_statLine_3 = new wxStaticText ( m_mainPanel, -1, MakeStatLine_3() ); + m_statLine_4 = new wxStaticText ( m_mainPanel, -1, MakeStatLine_4() ); + m_statLine_5 = new wxStaticText ( m_mainPanel, -1, MakeStatLine_5() ); + m_statLine_6 = new wxStaticText ( m_mainPanel, -1, MakeStatLine_6() ); + m_statLine_7 = new wxStaticText ( m_mainPanel, -1, MakeStatLine_7() ); + + m_hitLine = new wxStaticText ( m_mainPanel, -1, MakeHitsLine_1() ); + m_hitButton = + new wxButton ( m_mainPanel, ID_HIT_BUTTON, wxString ( _( "Reset" ) ) ); + + m_absHitLine = new wxStaticText ( m_mainPanel, -1, MakeHitsLine_2() ); + m_absHitButton = + new wxButton ( m_mainPanel, ID_ABS_HIT_BUTTON, wxString ( _( "Reset" ) ) ); + +#ifdef __LINUX__ // System monitoring on Linux + + // Monitoring Static Vertical Box Sizer + m_monPanelSBox = new wxStaticBox ( m_mainPanel, -1, _( "System" ) ); + m_monPanelSBoxSizer = new wxStaticBoxSizer ( m_monPanelSBox, wxVERTICAL ); + + m_sysLine_1 = new wxStaticText ( m_mainPanel, -1, MakeSysLine_1() ); + m_sysLine_2 = new wxStaticText ( m_mainPanel, -1, MakeSysLine_2() ); +#endif + + // Statistic Panel Layout + m_sigPanelSBoxSizer->Add ( m_statLine_1, 0, wxALL | wxALIGN_CENTER | wxGROW, 5 ); + m_sigPanelSBoxSizer->Add ( m_statLine_2, 0, wxALL | wxALIGN_CENTER | wxGROW, 5 ); + m_sigPanelSBoxSizer->Add ( m_statLine_3, 0, wxALL | wxALIGN_CENTER | wxGROW, 5 ); + m_sigPanelSBoxSizer->Add ( m_statLine_4, 0, wxALL | wxALIGN_CENTER | wxGROW, 5 ); + m_sigPanelSBoxSizer->Add ( m_statLine_5, 0, wxALL | wxALIGN_CENTER | wxGROW, 5 ); + m_sigPanelSBoxSizer->Add ( m_statLine_6, 0, wxALL | wxALIGN_CENTER | wxGROW, 5 ); + m_sigPanelSBoxSizer->Add ( m_statLine_7, 0, wxALL | wxALIGN_CENTER | wxGROW, 5 ); + + m_hitPanelSBoxSizer->Add ( m_hitLine, 0, wxALL | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxGROW, 5 ); + m_hitPanelSBoxSizer->Add ( m_hitButton, 0, wxALL | wxALIGN_RIGHT, 5 ); + + m_absHitPanelSBoxSizer->Add ( m_absHitLine, 0, wxALL | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxGROW, 5 ); + m_absHitPanelSBoxSizer->Add ( m_absHitButton, 0, wxALL | wxALIGN_RIGHT, 5 ); + +#ifdef __LINUX__ // System monitoring on Linux + + m_monPanelSBoxSizer->Add ( m_sysLine_1, 0, wxALL | wxALIGN_CENTER | wxGROW, 5 ); + m_monPanelSBoxSizer->Add ( m_sysLine_2, 0, wxALL | wxALIGN_CENTER | wxGROW, 5 ); +#endif + + // Main panel Layout + m_mainPanelVBox->Add ( m_staticLine, 0, wxALL | wxALIGN_CENTER | wxGROW ); + + m_mainPanelVBox->Add ( m_sigPanelSBoxSizer, 0, wxALL | wxALIGN_CENTER | wxGROW, 10 ); + +#ifdef __LINUX__ // System monitoring on Linux + + m_mainPanelVBox->Add ( m_monPanelSBoxSizer, 0, wxALL | wxALIGN_CENTER | wxGROW, 10 ); +#endif + + m_mainPanelVBox->Add ( m_hitPanelSBoxSizer, 0, wxALL | wxALIGN_CENTER | wxGROW, 10 ); + + m_mainPanelVBox->Add ( m_absHitPanelSBoxSizer, 0, wxALL | wxALIGN_CENTER | wxGROW, 10 ); + +#ifdef __WXMSW__ + + m_mainPanelVBox->Add ( m_BottomStaticLine, 0, wxALL | wxALIGN_CENTER | wxGROW ); +#endif + + // Toolbar Pixmaps + m_toolBarBitmaps[ 0 ] = WxCasPix::getPixmap( wxT( "refresh" ) ); + m_toolBarBitmaps[ 1 ] = WxCasPix::getPixmap( wxT( "save" ) ); + m_toolBarBitmaps[ 2 ] = WxCasPix::getPixmap( wxT( "print" ) ); + m_toolBarBitmaps[ 3 ] = WxCasPix::getPixmap( wxT( "about" ) ); + m_toolBarBitmaps[ 4 ] = WxCasPix::getPixmap( wxT( "stop" ) ); + m_toolBarBitmaps[ 5 ] = WxCasPix::getPixmap( wxT( "prefs" ) ); + + // Constructing toolbar + m_toolbar = + new wxToolBar ( this, -1, wxDefaultPosition, wxDefaultSize, + wxTB_HORIZONTAL | wxTB_FLAT ); + + m_toolbar->SetToolBitmapSize ( wxSize ( 32, 32 ) ); + m_toolbar->SetMargins ( 2, 2 ); + + m_toolbar->AddTool ( ID_BAR_REFRESH, wxT( "Refresh" ), m_toolBarBitmaps[ 0 ], + _( "Stop Auto Refresh" ) ); + + m_toolbar->AddSeparator (); + + m_toolbar->AddTool ( ID_BAR_SAVE, wxT( "Save" ), m_toolBarBitmaps[ 1 ], + _( "Save Online Statistics image" ) ); + + m_toolbar->AddTool ( ID_BAR_PRINT, wxT( "Print" ), m_toolBarBitmaps[ 2 ], + _( "Print Online Statistics image" ) ); + + m_toolbar->AddTool ( ID_BAR_PREFS, wxT( "Prefs" ), m_toolBarBitmaps[ 5 ], + _( "Preferences setting" ) ); + + m_toolbar->AddSeparator (); + + m_toolbar->AddTool ( ID_BAR_ABOUT, wxT( "About" ), m_toolBarBitmaps[ 3 ], + _( "About wxCas" ) ); + + m_toolbar->Realize (); + + SetToolBar ( m_toolbar ); + + // Panel Layout + m_mainPanel->SetAutoLayout( true ); + m_mainPanel->SetSizer ( m_mainPanelVBox ); + + // Frame Layout + m_frameVBox->Add ( m_mainPanel, 1, wxALL | wxGROW ); + SetAutoLayout ( TRUE ); + SetSizerAndFit ( m_frameVBox ); + + // Add refresh timer + m_refresh_timer = new wxTimer ( this, ID_REFRESH_TIMER ); + m_refresh_timer->Start ( 1000 * prefs->Read ( WxCasCte::REFRESH_RATE_KEY, WxCasCte::DEFAULT_REFRESH_RATE ) ); // s to ms + + // Add FTP update timer + m_ftp_update_timer = new wxTimer ( this, ID_FTP_UPDATE_TIMER ); + m_ftp_update_timer->Start ( 60000 * prefs->Read ( WxCasCte::FTP_UPDATE_RATE_KEY, WxCasCte::DEFAULT_FTP_UPDATE_RATE ) ); // min to ms +} + +// Destructor +WxCasFrame::~WxCasFrame () +{ + delete m_aMuleSig; + +#ifdef __LINUX__ // System monitoring on Linux + + delete m_sysMonitor; +#endif +} + +// Events table +BEGIN_EVENT_TABLE ( WxCasFrame, wxFrame ) +EVT_TOOL ( ID_BAR_REFRESH, WxCasFrame::OnBarRefresh ) +EVT_TOOL ( ID_BAR_SAVE, WxCasFrame::OnBarSave ) +EVT_TOOL ( ID_BAR_PRINT, WxCasFrame::OnBarPrint ) +EVT_TOOL ( ID_BAR_PREFS, WxCasFrame::OnBarPrefs ) +EVT_TOOL ( ID_BAR_ABOUT, WxCasFrame::OnBarAbout ) +EVT_TIMER ( ID_REFRESH_TIMER, WxCasFrame::OnRefreshTimer ) +EVT_TIMER ( ID_FTP_UPDATE_TIMER, WxCasFrame::OnFtpUpdateTimer ) +EVT_BUTTON ( ID_HIT_BUTTON, WxCasFrame::OnHitButton ) +EVT_BUTTON ( ID_ABS_HIT_BUTTON, WxCasFrame::OnAbsHitButton ) +END_EVENT_TABLE () + +// Get Stat Bitmap +wxImage * +WxCasFrame::GetStatImage () const +{ + wxBitmap + statBitmap = WxCasPix::getPixmap( wxT( "stat" ) ); + + wxMemoryDC memdc; + memdc.SelectObject ( statBitmap ); + +#ifdef __WXMSW__ + + memdc. + SetFont ( wxFont::wxFont ( 6, wxSWISS, wxNORMAL, wxBOLD ) ); +#else + + memdc. + SetFont ( wxFont::wxFont ( 8, wxSWISS, wxNORMAL, wxBOLD ) ); +#endif + + memdc. + SetTextForeground ( *wxWHITE ); + memdc. + DrawText ( m_statLine_1->GetLabel (), 25, 0 ); + memdc. + DrawText ( m_statLine_2->GetLabel (), 25, 17 ); + memdc. + DrawText ( m_statLine_3->GetLabel (), 25, 34 ); + memdc. + DrawText ( m_statLine_4->GetLabel (), 25, 51 ); + memdc. + DrawText ( m_statLine_5->GetLabel (), 25, 68 ); + memdc. + DrawText ( m_statLine_6->GetLabel (), 25, 85 ); + memdc. + DrawText ( m_statLine_7->GetLabel (), 25, 102 ); + memdc. + SelectObject ( wxNullBitmap ); + + wxImage * + statImage = new wxImage ( statBitmap.ConvertToImage() ); + + return + ( statImage ); +} + +// Refresh button +void +WxCasFrame::OnBarRefresh ( wxCommandEvent& WXUNUSED( event ) ) +{ + if ( m_refresh_timer->IsRunning () ) { + m_refresh_timer->Stop (); + m_ftp_update_timer->Stop (); + m_toolbar->DeleteTool ( ID_BAR_REFRESH ); + m_toolbar->InsertTool ( 0, ID_BAR_REFRESH, wxT( "Refresh" ), + m_toolBarBitmaps[ 4 ], wxNullBitmap, + wxITEM_NORMAL, _( "Start Auto Refresh" ) ); + m_toolbar->Realize (); + SetStatusText ( _( "Auto Refresh stopped" ) ); + } else { + m_refresh_timer->Start (); + m_ftp_update_timer->Start (); + m_toolbar->DeleteTool ( ID_BAR_REFRESH ); + m_toolbar->InsertTool ( 0, ID_BAR_REFRESH, wxT( "Refresh" ), + m_toolBarBitmaps[ 0 ], wxNullBitmap, + wxITEM_NORMAL, _( "Stop Auto Refresh" ) ); + m_toolbar->Realize (); + SetStatusText ( _( "Auto Refresh started" ) ); + } +} + +// Save button +void +WxCasFrame::OnBarSave ( wxCommandEvent& WXUNUSED( event ) ) +{ + wxImage * statImage = GetStatImage (); + + wxString saveFileName = wxFileSelector( + _( "Save Statistics Image" ), + wxFileName::GetHomeDir (), + WxCasCte::AMULESIG_IMG_NAME, + ( const wxChar * ) NULL, + wxT ( "PNG files (*.png)|*.png|" ) + wxT ( "JPEG files (*.jpg)|*.jpg|" ) + wxT ( "BMP files (*.bmp)|*.bmp|" ), + wxFD_SAVE, this); + + if ( !saveFileName.empty () ) { + // This one guesses image format from filename extension + // (it may fail if the extension is not recognized): + + if ( !statImage->SaveFile ( saveFileName ) ) { + wxMessageBox ( _( "No handler for this file type." ), + _( "File was not saved" ), wxOK | wxCENTRE, this ); + } + } + delete statImage; +} + +// Print button +void +WxCasFrame::OnBarPrint ( wxCommandEvent& WXUNUSED( event ) ) +{ + wxPrinter printer; + WxCasPrint printout ( _( "aMule Online Statistics" ) ); + if ( !printer.Print ( this, &printout, TRUE ) ) { + if ( wxPrinter::GetLastError () == wxPRINTER_ERROR ) { + wxMessageBox ( _ + ( "There was a problem printing.\nPerhaps your current printer is not set correctly?" ), + _( "Printing" ), wxOK ); + } + } +} + +// Prefs button +void +WxCasFrame::OnBarPrefs ( wxCommandEvent& WXUNUSED( event ) ) +{ + WxCasPrefs dlg ( this ); + dlg.ShowModal (); +} + +// About button +void +WxCasFrame::OnBarAbout ( wxCommandEvent& WXUNUSED( event ) ) +{ + wxMessageBox ( _ + ( "wxCas, aMule OnLine Signature Statistics\n\n" + "(c) 2004 ThePolish \n\n" + "Based on CAS by Pedro de Oliveira \n\n" + "Distributed under GPL" ), + _( "About wxCas" ), wxOK | wxCENTRE | wxICON_INFORMATION ); +} + +// Refresh timer +void +WxCasFrame::OnRefreshTimer ( wxTimerEvent& WXUNUSED( event ) ) +{ + // Prefs + wxConfigBase * prefs = wxConfigBase::Get(); + + UpdateAll (); + + // Generate stat image if asked in config + if ( ( bool ) + ( prefs-> + Read ( WxCasCte::ENABLE_AUTOSTATIMG_KEY, + WxCasCte::DEFAULT_AUTOSTATIMG_ISENABLED ) ) ) { + wxImage * statImage = GetStatImage (); + + wxFileName fileName ( prefs-> + Read ( WxCasCte::AUTOSTATIMG_DIR_KEY, + WxCasCte::DEFAULT_AUTOSTATIMG_PATH ), + WxCasCte::AMULESIG_IMG_NAME, + prefs-> + Read ( WxCasCte::AUTOSTATIMG_TYPE_KEY, + WxCasCte::DEFAULT_AUTOSTATIMG_TYPE ). + Lower () ); + + if ( !statImage->SaveFile ( fileName.GetFullPath () ) ) { + wxLogError ( wxT( "No handler for this file type. File was not saved" ) ); + } + delete statImage; + } +} + +// Ftp update timer +void +WxCasFrame::OnFtpUpdateTimer ( wxTimerEvent& WXUNUSED( event ) ) +{ + // Prefs + wxConfigBase * prefs = wxConfigBase::Get(); + + // Image must be autogenerated to be uploaded + if ( ( bool ) ( prefs->Read ( WxCasCte::ENABLE_AUTOSTATIMG_KEY, + WxCasCte::DEFAULT_AUTOSTATIMG_ISENABLED ) ) && + ( bool ) ( prefs->Read ( WxCasCte::ENABLE_FTP_UPDATE_KEY, + WxCasCte::DEFAULT_FTP_UPDATE_ISENABLED ) ) ) { + // Get image file + wxFileName fileName ( prefs-> + Read ( WxCasCte::AUTOSTATIMG_DIR_KEY, + WxCasCte::DEFAULT_AUTOSTATIMG_PATH ), + WxCasCte::AMULESIG_IMG_NAME, + prefs-> + Read ( WxCasCte::AUTOSTATIMG_TYPE_KEY, + WxCasCte::DEFAULT_AUTOSTATIMG_TYPE ). + Lower () ); + + // If img doenst exist, return + if ( ! fileName.FileExists( fileName.GetFullPath () ) ) { + wxLogError( wxT( "Image file " ) + fileName.GetFullPath () + wxT( " doesn't exist" ) ); + return ; + } + + // Connect to ftp + wxFTP ftp; + + ftp.SetUser( prefs->Read ( WxCasCte::FTP_USER_KEY, + WxCasCte::DEFAULT_FTP_USER ) ); + ftp.SetPassword( prefs->Read ( WxCasCte::FTP_PASSWD_KEY, + WxCasCte::DEFAULT_FTP_PASSWD ) ); + + if ( ! ftp.Connect( prefs->Read ( WxCasCte::FTP_URL_KEY, + WxCasCte::DEFAULT_FTP_URL ) ) ) { + wxLogError( wxT( "Cannot connect to FTP server " ) + prefs->Read ( WxCasCte::FTP_URL_KEY, + WxCasCte::DEFAULT_FTP_URL ) ); + return ; + } + + // Chdir + if ( ! ftp.ChDir( prefs->Read ( WxCasCte::FTP_PATH_KEY, + WxCasCte::DEFAULT_FTP_PATH ) ) ) { + wxLogError( wxT( "Cannot chdir to " ) + prefs->Read ( WxCasCte::FTP_PATH_KEY, + WxCasCte::DEFAULT_FTP_PATH ) ); + ftp.Close(); + return ; + } + + // Upload image + ftp.SetBinary(); + wxFileInputStream in( fileName.GetFullPath () ); + if ( in.Ok() ) { + wxOutputStream * out = ftp.GetOutputStream( fileName.GetFullName () ); + if ( out ) { + out->Write( in ); + delete out; + } else { + wxLogError( wxT( "Cannot open FTP upload stream" ) ); + } + } else { + wxLogError( wxT( "Cannot open file stream to read image file" ) ); + } + + // Close connexion + ftp.Close(); + } +} + +// Reset wxcas session hit +void +WxCasFrame::OnHitButton ( wxCommandEvent& WXUNUSED( event ) ) +{ + m_aMuleSig->ResetSessionMaxDL(); + UpdateStatsPanel (); +} + +// Reset wxcas absolute hit +void +WxCasFrame::OnAbsHitButton ( wxCommandEvent& WXUNUSED( event ) ) +{ + m_aMuleSig->ResetAbsoluteMaxDL(); + SaveAbsoluteHits(); + UpdateStatsPanel (); +} + +// Update all panels and frame, call Fit if needed +void +WxCasFrame::UpdateAll ( bool forceFitting ) +{ + bool needFit = UpdateStatsPanel (); + + if ( needFit || forceFitting ) { + // Fit stats pannel + m_mainPanel->Fit(); + + // Fit main frame + SetClientSize( m_mainPanel->GetSize() ); + } +} + +// Update stat panel +bool +WxCasFrame::UpdateStatsPanel () +{ + // Set labels + m_aMuleSig->Refresh (); + +#ifdef __LINUX__ // System monitoring on Linux + + m_sysMonitor->Refresh (); +#endif + + wxString newline; + wxString status; + unsigned int newMaxLineCount = 0; + + Freeze (); + + // Stat line 1 + newline = MakeStatLine_1(); + m_statLine_1->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + // aMule is stopped + //if ( m_aMuleSig->GetRunTime () == 0 + + // aMule is not running + if ( m_aMuleSig->GetUpStatus () == 0) { + status = _( "Oh Oh, aMule is not running..." ); + newline = MakeStatLine_2(); + m_statLine_2->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + } + // aMule is running, ed2k and kad are connected + else if ( (m_aMuleSig->GetAmuleState () == 1 ) && (m_aMuleSig->GetKadState () == 1 || m_aMuleSig->GetKadState () == 2)) { + // Stat line 2 + newline = MakeStatLine_2(); + m_statLine_2->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 3 + newline = MakeStatLine_3(); + m_statLine_3->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 4 + newline = MakeStatLine_4(); + m_statLine_4->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 5 + newline = MakeStatLine_5(); + m_statLine_5->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 6 + newline = MakeStatLine_6(); + m_statLine_6->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 7 + newline = MakeStatLine_7(); + m_statLine_7->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Hits line 1 + if ( m_aMuleSig->IsSessionMaxDlChanged() ) { + newline = MakeHitsLine_1(); + m_hitLine->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + } + + // Hits line 2 + if ( m_aMuleSig->IsAbsoluteMaxDlChanged() ) { + newline = MakeHitsLine_2(); + m_absHitLine->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Save new records + SaveAbsoluteHits(); + } + +#ifdef __LINUX__ // System monitoring on Linux + newline = MakeSysLine_1(); + m_sysLine_1->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + newline = MakeSysLine_2(); + m_sysLine_2->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); +#endif + + status = _( "aMule is running" ); + } + // aMule is running, ed2k is off, but kad connected + else if ( (m_aMuleSig->GetAmuleState () == 0) && (m_aMuleSig->GetKadState () == 1 || m_aMuleSig->GetKadState () == 2 )) { + // Stat line 2 + newline = MakeStatLine_2(); + m_statLine_2->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 3 + newline = MakeStatLine_3(); + m_statLine_3->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 4 + newline = MakeStatLine_4(); + m_statLine_4->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 5 + newline = MakeStatLine_5(); + m_statLine_5->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 6 + newline = MakeStatLine_6(); + m_statLine_6->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 7 + newline = MakeStatLine_7(); + m_statLine_7->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Hits line 1 + if ( m_aMuleSig->IsSessionMaxDlChanged() ) { + newline = MakeHitsLine_1(); + m_hitLine->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + } + + // Hits line 2 + if ( m_aMuleSig->IsAbsoluteMaxDlChanged() ) { + newline = MakeHitsLine_2(); + m_absHitLine->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Save new records + SaveAbsoluteHits(); + } + +#ifdef __LINUX__ // System monitoring on Linux + newline = MakeSysLine_1(); + m_sysLine_1->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + newline = MakeSysLine_2(); + m_sysLine_2->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); +#endif + status = _( "aMule is running" ); + } + else if ( (m_aMuleSig->GetAmuleState () == 1) && (m_aMuleSig->GetKadState () == 0)) { + // Stat line 2 + newline = MakeStatLine_2(); + m_statLine_2->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 3 + newline = MakeStatLine_3(); + m_statLine_3->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 4 + newline = MakeStatLine_4(); + m_statLine_4->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 5 + newline = MakeStatLine_5(); + m_statLine_5->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 6 + newline = MakeStatLine_6(); + m_statLine_6->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 7 + newline = MakeStatLine_7(); + m_statLine_7->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Hits line 1 + if ( m_aMuleSig->IsSessionMaxDlChanged() ) { + newline = MakeHitsLine_1(); + m_hitLine->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + } + + // Hits line 2 + if ( m_aMuleSig->IsAbsoluteMaxDlChanged() ) { + newline = MakeHitsLine_2(); + m_absHitLine->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Save new records + SaveAbsoluteHits(); + } + +#ifdef __LINUX__ // System monitoring on Linux + newline = MakeSysLine_1(); + m_sysLine_1->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + newline = MakeSysLine_2(); + m_sysLine_2->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); +#endif + status = _( "aMule is running" ); + } + //both disconnected + else if ( (m_aMuleSig->GetAmuleState () == 0) && (m_aMuleSig->GetKadState () == 0)) { + // Stat line 2 + newline = MakeStatLine_2(); + m_statLine_2->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 3 + newline = MakeStatLine_3(); + m_statLine_3->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 4 + newline = MakeStatLine_4(); + m_statLine_4->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 5 + newline = MakeStatLine_5(); + m_statLine_5->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 6 + newline = MakeStatLine_6(); + m_statLine_6->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 7 + newline = MakeStatLine_7(); + m_statLine_7->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Hits line 1 + if ( m_aMuleSig->IsSessionMaxDlChanged() ) { + newline = MakeHitsLine_1(); + m_hitLine->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + } + + // Hits line 2 + if ( m_aMuleSig->IsAbsoluteMaxDlChanged() ) { + newline = MakeHitsLine_2(); + m_absHitLine->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Save new records + SaveAbsoluteHits(); + } + +#ifdef __LINUX__ // System monitoring on Linux + newline = MakeSysLine_1(); + m_sysLine_1->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + newline = MakeSysLine_2(); + m_sysLine_2->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); +#endif + status = _( "aMule is running, but disconnected" ); + } + // aMule is connecting + else if ( m_aMuleSig->GetAmuleState () == 2 ) { + // Stat line 2 + newline = MakeStatLine_2(); + m_statLine_2->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 3 + newline = MakeStatLine_3(); + m_statLine_3->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 4 + newline = MakeStatLine_4(); + m_statLine_4->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 5 + newline = MakeStatLine_5(); + m_statLine_5->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 6 + newline = MakeStatLine_6(); + m_statLine_6->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Stat line 7 + newline = MakeStatLine_7(); + m_statLine_7->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Hits line 1 + if ( m_aMuleSig->IsSessionMaxDlChanged() ) { + newline = MakeHitsLine_1(); + m_hitLine->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + } + + // Hits line 2 + if ( m_aMuleSig->IsAbsoluteMaxDlChanged() ) { + newline = MakeHitsLine_2(); + m_absHitLine->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + // Save new records + SaveAbsoluteHits(); + } + +#ifdef __LINUX__ // System monitoring on Linux + newline = MakeSysLine_1(); + m_sysLine_1->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); + + newline = MakeSysLine_2(); + m_sysLine_2->SetLabel ( newline ); + + newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); +#endif + + status = _( "aMule is connecting..." ); + } + // aMule status is unknown + else { + status = _( "Oh Oh, aMule status is unknown..." ); + } + + Thaw (); + + // Set status bar + SetStatusText ( status ); + + // Resize only if needed + if ( m_maxLineCount != newMaxLineCount ) { + m_maxLineCount = newMaxLineCount; + return ( TRUE ); + } else { + return ( FALSE ); + } +} + +// Refresh period changing +bool +WxCasFrame::ChangeRefreshPeriod( const int newPeriod ) +{ + // As the user can stop it, we must let it in the same state + // it was before changing period + bool wasRunning = FALSE; + + if ( m_refresh_timer->IsRunning() ) { + wasRunning = TRUE; + } + + bool ok = m_refresh_timer->Start( newPeriod ); + + if ( ! wasRunning ) { + m_refresh_timer->Stop(); + } + + return ( ok ); +} + +// Ftp update period changing +bool +WxCasFrame::ChangeFtpUpdatePeriod( const int newPeriod ) +{ + // As the user can stop it, we must let it in the same state + // it was before changing period + bool wasRunning = FALSE; + + if ( m_ftp_update_timer->IsRunning() ) { + wasRunning = TRUE; + } + + bool ok = m_ftp_update_timer->Start( newPeriod ); + + if ( ! wasRunning ) { + m_ftp_update_timer->Stop(); + } + + return ( ok ); +} + +// Set amulesig.dat file +void +WxCasFrame::SetAmuleSigFile( const wxFileName& file ) +{ + m_aMuleSig->SetAmuleSig ( file ); +} + +wxString +WxCasFrame::MakeStatLine_1() const +{ + wxString newline; + if ( m_aMuleSig->GetAmuleState () == 1 || m_aMuleSig->GetKadState () == 1 || m_aMuleSig->GetKadState () == 2 ) { + newline = _( "aMule " ) + + m_aMuleSig->GetVersion () + + _( " has been running for " ) + + m_aMuleSig->GetRunTime (); + } else if ( m_aMuleSig->GetUpStatus () == 0 ) { + newline = _( "aMule " ) + + m_aMuleSig->GetVersion () + + _( " is stopped !" ); + } else if ( m_aMuleSig->GetAmuleState () == 0 && m_aMuleSig->GetKadState () == 0 ) { + newline = _( "aMule " ) + + m_aMuleSig->GetVersion () + + _( " is not connected !" ); + } else if ( m_aMuleSig->GetAmuleState () == 2 ) { + newline = _( "aMule " ) + + m_aMuleSig->GetVersion () + + _( " is connecting..." ); + } else { + newline = _( "aMule " ) + + m_aMuleSig->GetVersion () + + _( " is doing something strange, check it !" ); + } + + return ( newline ); +} + +wxString +WxCasFrame::MakeStatLine_2() const +{ + wxString notTooLongName ( m_aMuleSig->GetServerName () ); + if ( notTooLongName.Length() > 32 ) { + notTooLongName = notTooLongName.Left( 32 ) + wxT( "..." ); + } + + if ((m_aMuleSig->GetAmuleState () == 0) && (m_aMuleSig->GetKadState() == 0)){ + wxString newline = m_aMuleSig->GetUser () + + _( " is not connected !" ); + return ( newline ); + } + if (m_aMuleSig->GetAmuleState () == 0) { + wxString newline = m_aMuleSig->GetUser () + + _( " is connected to " ) + + _( " Kad: " ); + if(m_aMuleSig->GetKadState() == 2) { + newline += _( "ok" ); + } else if (m_aMuleSig->GetKadState() == 1) { + newline += _( "firewalled" ); + } else { + newline += _( "off" ); + } + return ( newline ); + } + else { + wxString newline = m_aMuleSig->GetUser () + + _( " is on " ) + + notTooLongName + + wxT( " [" ) + + m_aMuleSig->GetServerIP () + + wxT( ":" ) + + m_aMuleSig->GetServerPort () + + wxT( "]" ) + + _( " with " ) + + m_aMuleSig->GetConnexionIDType () + + wxT( " |" ) + + _( " Kad: " ); + if(m_aMuleSig->GetKadState() == 2) { + newline += _( "ok" ); + } else if (m_aMuleSig->GetKadState() == 1) { + newline += _( "firewalled" ); + } else { + newline += _( "off" ); + } + return ( newline ); + } +} + +wxString +WxCasFrame::MakeStatLine_3() const +{ + wxString newline = _( "Total Download: " ) + + m_aMuleSig->GetConvertedTotalDL () + + _( ", Upload: " ) + + m_aMuleSig->GetConvertedTotalUL (); + + return ( newline ); +} + +wxString +WxCasFrame::MakeStatLine_4() const +{ + wxString newline = _( "Session Download: " ) + + m_aMuleSig->GetConvertedSessionDL () + + _( ", Upload: " ) + + m_aMuleSig->GetConvertedSessionUL (); + + return ( newline ); +} + +wxString +WxCasFrame::MakeStatLine_5() const +{ + wxString newline = _( "Download: " ) + + m_aMuleSig->GetDLRate () + + _( " kB/s, Upload: " ) + + m_aMuleSig->GetULRate () + + _( " kB/s" ); + + return ( newline ); +} + +wxString +WxCasFrame::MakeStatLine_6() const +{ + wxString newline = _( "Sharing: " ) + + m_aMuleSig->GetSharedFiles () + + _( " file(s), Clients on queue: " ) + + m_aMuleSig->GetQueue (); + + return ( newline ); +} + +wxString +WxCasFrame::MakeStatLine_7() const +{ + wxDateTime now = wxDateTime::Now(); + wxString newline = _( "Time: " ) + + now.Format( wxDefaultDateTimeFormat , wxDateTime::Local ); + + return ( newline ); +} + +wxString +WxCasFrame::MakeHitsLine_1() const +{ + wxString newline = wxString::Format ( _( "%.2f kB/s" ), m_aMuleSig->GetSessionMaxDL () ) + + _( " on " ) + + m_aMuleSig->GetSessionMaxDlDate().Format( wxT( "%c" ) ); + + return ( newline ); +} + +wxString +WxCasFrame::MakeHitsLine_2() const +{ + wxString newline = wxString::Format ( _( "%.2f kB/s" ), m_aMuleSig->GetAbsoluteMaxDL() ) + + _( " on " ) + + m_aMuleSig->GetAbsoluteMaxDlDate().Format( wxT( "%c" ) ); + + return ( newline ); +} + +#ifdef __LINUX__ // System monitoring on Linux +wxString +WxCasFrame::MakeSysLine_1() const +{ + wxString newline = _( "System Load Average (1-5-15 min): " ) + + m_sysMonitor->GetSysLoad_1 () + wxT( " " ) + + m_sysMonitor->GetSysLoad_5 () + wxT( " " ) + + m_sysMonitor->GetSysLoad_15 (); + + return ( newline ); +} + +wxString +WxCasFrame::MakeSysLine_2() const +{ + wxString newline = _( "System uptime: " ) + + m_sysMonitor->GetUptime (); + + return ( newline ); +} +#endif + +void WxCasFrame::SaveAbsoluteHits() +{ + wxConfigBase * prefs = wxConfigBase::Get(); + prefs->Write( WxCasCte::ABSOLUTE_MAX_DL_KEY, ( long ) ( 1024.0 * m_aMuleSig->GetAbsoluteMaxDL() ) ); + prefs->Write( WxCasCte::ABSOLUTE_MAX_DL_DATE_KEY, ( long ) ( m_aMuleSig->GetAbsoluteMaxDlDate().GetTicks() ) ); + prefs->Flush(); +} +// File_checked_for_headers diff --git a/src/utils/wxCas/src/wxcasframe.h b/src/utils/wxCas/src/wxcasframe.h new file mode 100644 index 00000000..02c4c4c5 --- /dev/null +++ b/src/utils/wxCas/src/wxcasframe.h @@ -0,0 +1,189 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: wxCasFrame Class +/// +/// Purpose: wxCas main frame +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Derived from CAS by Pedro de Oliveira +/// +/// Pixmats from aMule http://www.amule.org +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _WXCASFRAME_H +#define _WXCASFRAME_H + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include +#include +#include +#include + +#include "onlinesig.h" + + +#ifdef __LINUX__ // System monitoring on Linux +#include "linuxmon.h" +#endif + +/// Main wxCas Frame +class WxCasFrame: public wxFrame +{ +private: + wxToolBar *m_toolbar; + wxBitmap m_toolBarBitmaps[ 6 ]; + + wxBoxSizer *m_frameVBox; + wxBoxSizer *m_mainPanelVBox; + + wxPanel *m_mainPanel; + + wxStaticLine *m_staticLine; +#ifdef __WXMSW__ + + wxStaticLine *m_BottomStaticLine; +#endif + + wxStaticBox *m_sigPanelSBox; + wxStaticBoxSizer *m_sigPanelSBoxSizer; + + wxStaticBox *m_monPanelSBox; + wxStaticBoxSizer *m_monPanelSBoxSizer; + + wxStaticBox *m_hitPanelSBox; + wxStaticBoxSizer *m_hitPanelSBoxSizer; + + wxStaticBox *m_absHitPanelSBox; + wxStaticBoxSizer *m_absHitPanelSBoxSizer; + + wxStaticText *m_statLine_1; + wxStaticText *m_statLine_2; + wxStaticText *m_statLine_3; + wxStaticText *m_statLine_4; + wxStaticText *m_statLine_5; + wxStaticText *m_statLine_6; + wxStaticText *m_statLine_7; + + wxStaticText *m_absHitLine; + wxButton *m_absHitButton; + + wxStaticText *m_hitLine; + wxButton *m_hitButton; + + + wxTimer * m_refresh_timer; + wxTimer * m_ftp_update_timer; + + OnLineSig *m_aMuleSig; + unsigned int m_maxLineCount; + +#ifdef __LINUX__ // System monitoring on Linux + + wxStaticText *m_sysLine_1; + wxStaticText *m_sysLine_2; + LinuxMon *m_sysMonitor; +#endif + + enum + { + ID_BAR_REFRESH = 1000, + ID_BAR_SAVE, + ID_BAR_PRINT, + ID_BAR_PREFS, + ID_BAR_ABOUT, + ID_REFRESH_TIMER, + ID_FTP_UPDATE_TIMER, + ID_HIT_BUTTON, + ID_ABS_HIT_BUTTON + }; + + // Get maximum of 2 uint + unsigned int GetMaxUInt( const unsigned int a, const unsigned int b ) + { + return ( ( a ) > ( b ) ? ( a ) : ( b ) ); + } + + // Constructing Stat_lines + wxString MakeStatLine_1() const; + wxString MakeStatLine_2() const; + wxString MakeStatLine_3() const; + wxString MakeStatLine_4() const; + wxString MakeStatLine_5() const; + wxString MakeStatLine_6() const; + wxString MakeStatLine_7() const; + + // Constructing Hits_lines + wxString MakeHitsLine_1() const; + wxString MakeHitsLine_2() const; + +#ifdef __LINUX__ // System monitoring on Linux + // Constructing Sys_lines + wxString MakeSysLine_1() const; + wxString MakeSysLine_2() const; +#endif + +protected: + bool UpdateStatsPanel (); + void UpdateAll ( bool forceFitting = FALSE ); + void SaveAbsoluteHits(); + + void OnBarRefresh ( wxCommandEvent & event ); + void OnBarAbout ( wxCommandEvent & event ); + void OnBarSave ( wxCommandEvent & event ); + void OnBarPrint ( wxCommandEvent & event ); + void OnBarPrefs ( wxCommandEvent & event ); + void OnRefreshTimer ( wxTimerEvent & event ); + void OnFtpUpdateTimer ( wxTimerEvent & event ); + void OnHitButton ( wxCommandEvent & event ); + void OnAbsHitButton ( wxCommandEvent & event ); + + DECLARE_EVENT_TABLE () + +public: + /// Constructor + WxCasFrame ( const wxString& title ); + + /// Destructor + ~WxCasFrame (); + + /// Get Online statistics image + wxImage *GetStatImage () const; + + /// Refresh timer period changing + bool ChangeRefreshPeriod( const int newPeriod ); + + /// Refresh timer period changing + bool ChangeFtpUpdatePeriod( const int newPeriod ); + + /// Set amulesig.dat file + void SetAmuleSigFile( const wxFileName& file ); +}; + +#endif /* _WXCASFRAME_H */ +// File_checked_for_headers diff --git a/src/utils/wxCas/src/wxcaspix.cpp b/src/utils/wxCas/src/wxcaspix.cpp new file mode 100644 index 00000000..156738b7 --- /dev/null +++ b/src/utils/wxCas/src/wxcaspix.cpp @@ -0,0 +1,1691 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: wxCasPix Class +/// +/// Purpose: wxCas main frame +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Derived from CAS by Pedro de Oliveira +/// +/// Pixmats from aMule http://www.amule.org +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include "wxcaspix.h" + +wxBitmap WxCasPix::getPixmap( const wxString& name ) +{ + if ( name == wxT( "about" ) ) { + wxBitmap bitmap( m_about_xpm ); + return bitmap; + } else if ( name == wxT( "prefs" ) ) { + wxBitmap bitmap( m_prefs_xpm ); + return bitmap; + } else if ( name == wxT( "print" ) ) { + wxBitmap bitmap( m_print_xpm ); + return bitmap; + } else if ( name == wxT( "refresh" ) ) { + wxBitmap bitmap( m_refresh_xpm ); + return bitmap; + } else if ( name == wxT( "save" ) ) { + wxBitmap bitmap( m_save_xpm ); + return bitmap; + } else if ( name == wxT( "stat" ) ) { + wxBitmap bitmap( m_stat_xpm ); + return bitmap; + } else if ( name == wxT( "stop" ) ) { + wxBitmap bitmap( m_stop_xpm ); + return bitmap; +#ifndef __WXMSW__ + } else if ( name == wxT( "wxcas" ) ) { + wxBitmap bitmap( m_wxcas_xpm ); + return bitmap; +#endif + } else { + return wxNullBitmap; + } + +} + +const char * +WxCasPix::m_about_xpm[] = + { /* XPM */ + /* columns rows colors chars-per-pixel */ + "32 32 179 2", + " c None", + ". c #0c0b0a", + "X c #32373e", + "o c #3f3330", + "O c #002e66", + "+ c #00306a", + "@ c #003573", + "# c #003778", + "$ c #00397c", + "% c #5a2d12", + "& c #45312a", + "* c #642909", + "= c #682b09", + "- c #6f310d", + "; c #74360f", + ": c #7a3b12", + "> c #7c4d2d", + ", c #48494c", + "< c #7e5e50", + "1 c #675b63", + "2 c #696c6f", + "3 c #003c84", + "4 c #003f89", + "5 c #00408b", + "6 c #0a4083", + "7 c #014499", + "8 c #114d9c", + "9 c #18529c", + "0 c #054eb0", + "q c #0d51a5", + "w c #1558a7", + "e c #1857b1", + "r c #1b65ae", + "t c #23558d", + "y c #245f9f", + "u c #34659b", + "i c #276bb8", + "p c #3f6ea2", + "a c #0657c6", + "s c #1462d2", + "d c #256cd0", + "f c #2774c4", + "g c #2d70cd", + "h c #2f76d7", + "j c #2171e8", + "k c #357fe6", + "l c #3b95db", + "z c #2f82f0", + "x c #3a80e6", + "c c #3a85e8", + "v c #3e89ed", + "b c #3684f1", + "n c #5185bf", + "m c #4182c7", + "M c #4997d8", + "N c #4289ec", + "B c #4389f2", + "V c #4490f2", + "C c #4e94f2", + "Z c #5a9df3", + "A c #54afed", + "S c #5ba4e1", + "D c #71a6da", + "F c #63a3f6", + "G c #67a9f8", + "H c #6ca9f7", + "J c #6daaf8", + "K c #79aee9", + "L c #75b8ee", + "P c #76b1f7", + "I c #77b2f9", + "U c #75bcf3", + "Y c #7bb4f9", + "T c #7fbdf9", + "R c #74c2fa", + "E c #7dc6fa", + "W c #833f14", + "Q c #bf2b4a", + "! c #8f4b1b", + "~ c #954f1d", + "^ c #97511e", + "/ c #9c5622", + "( c #a45b24", + ") c #a25d29", + "_ c #a7602a", + "` c #ad6227", + "' c #ad6228", + "] c #b6692b", + "[ c #b86b2c", + "{ c #b67038", + "} c #bd7031", + "| c #867069", + " . c #ac4c6f", + ".. c #b14062", + "X. c #b14a6c", + "o. c #c73351", + "O. c #ca3f5c", + "+. c #c0712f", + "@. c #c67530", + "#. c #c37a31", + "$. c #c07a3c", + "%. c #ca7b38", + "&. c #cc5773", + "*. c #c7627f", + "=. c #a35d82", + "-. c #b67698", + ";. c #ce6d87", + ":. c #b68b67", + ">. c #cd8838", + ",. c #e49c3f", + "<. c #ce8240", + "1. c #cf874a", + "2. c #d38c4d", + "3. c #d89c47", + "4. c #d69658", + "5. c #d99b62", + "6. c #dca25c", + "7. c #daa16c", + "8. c #e0ae7d", + "9. c #838186", + "0. c #9a9794", + "q. c #8192af", + "w. c #ac98bb", + "e. c #b58fb1", + "r. c #a0a09f", + "t. c #b4b4b0", + "y. c #92b2d8", + "u. c #83baf9", + "i. c #8abffb", + "p. c #abb3db", + "a. c #b5afd1", + "s. c #b4b7da", + "d. c #83c9fb", + "f. c #8bc3fc", + "g. c #9bc4e8", + "h. c #93c4fb", + "j. c #95ccfb", + "k. c #9dccfc", + "l. c #9cd1fb", + "z. c #a0cefd", + "x. c #a4d1fe", + "c. c #afd5f3", + "v. c #abd5fd", + "b. c #b7cdee", + "n. c #b7d4f5", + "m. c #b4d9f7", + "M. c #b4dbfe", + "N. c #b9defe", + "B. c #bde1fe", + "V. c #d487a0", + "C. c #d49db4", + "Z. c #d1b28b", + "A. c #d1a7be", + "S. c #e4b785", + "D. c #d0b4cb", + "F. c #d1bad0", + "G. c #e2bdcd", + "H. c #edcfa7", + "J. c #cac8c2", + "K. c #d4cdc2", + "L. c #dfdbd6", + "P. c #cad3ea", + "I. c #c4e4ff", + "U. c #c9e7ff", + "Y. c #cae8ff", + "T. c #d3ecfe", + "R. c #dbf0ff", + "E. c #e2c9d9", + "W. c #e2d4e2", + "Q. c #f6e7da", + "!. c #e7e7e5", + "~. c #e2e1ef", + "^. c #e3f3ff", + "/. c #eaf6ff", + "(. c #eef8ff", + "). c #f1f1ef", + "_. c #f2f9ff", + "`. c #fdfdfe", + "'. c None", + /* pixels */ + "'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.", + "'.'.'.'.'.'.'.'.'.'.'.4 3 3 $ $ $ $ $ $ $ '.'.'.'.'.'.'.'.'.'.'.", + "'.'.'.'.'.'.'.'.3 3 3 w l A R d.d.d.U D y # @ @ '.'.'.'.'.'.'.'.", + "'.'.'.'.'.'.4 4 r M U j.l.B.N.B.B.N.B.m.c.g.D u @ @ '.'.'.'.'.'.", + "'.'.'.'.4 4 f M d.N.T./.`.`.`.`.`.`.`.`.`.(.T.B.y.p @ + '.'.'.'.", + "'.'.'.4 w l R M.T.`.`.`.`.`.`.`.`.`.`.`.`.`.`._.R.I.y.t + '.'.'.", + "'.'.4 i l R M.`.`.`._.^.^.W.W.W.W.W.^.^.^._._.`.`.T.B.g.p + '.'.", + "'.4 r l E B.`.(.^.^.^.^.^.E.G.G.G.E.^.^.^.^.^.^._.`.R.M.D t + '.", + "'.5 m R N.`.^.T.T.T.T.T.T.A.C.C.C.F.R.R.R.R.R.^.^.^.`.T.z.n + '.", + "5 i S M./._.T.T.T.T.T.T.T.A.V.V.V.D.T.R.T.T.T.T.R.^././.M.K 9 + ", + "4 m d.N._.T.T.T.Y.Y.Y.Y.Y.A.;.;.;.D.Y.Y.Y.Y.Y.Y.T.Y.^._.M.i.i O ", + "4 S j.N._.U.I.U.Y.Y.Y.Y.Y.F.&.&.&.P.Y.Y.Y.Y.Y.Y.Y.T.Y._.v.u.m + ", + "4 L k.M.(.I.I.I.Y.Y.Y.Y.U.P.O.O.O.Y.U.U.U.U.U.I.I.I.I./.v.P c O ", + "4 S x.v.Y.B.B.I.I.I.I.I.I.I.*.o.*.Y.I.U.I.I.I.I.I.I.N.Y.i.F k O ", + "4 n k.x.B.M.M.N.B.B.B.B.B.B.-.Q -.B.B.B.B.B.I.I.N.I.I.B.Y C d O ", + "4 y D x.M.N.N.N.M.< * * * B.a.e.a.B.B.B.B.N.N.B.N.N.N.x.H N 8 + ", + "'.3 l * * * B.< ; { 6.: | N.n.e.b.N.M.B.N.N.N.B.B.N.N.i.Z h O '.", + "'.# * 2.* k.* [ S.5.) ; y.a..... .s.M.M.N.N.N.N.B.v.h.Z v 8 O '.", + "'.* @.] * ; H.S.7.>.; | v.e. . . .a.M.B.N.N.N.M.v.h.Z B g O '.'.", + "'.* ] ; <.8.4.2.) % =.z.z.a.=.=.-.s.x.v.N.N.N.v.j.C k g 9 + '.'.", + "* * ! <.2.>.' * 1 D K h.f.f.p.w.p.f.h.x.M.v.M.T F N i 8 O '.'.'.", + "'.* ~ [ ` ` : / * i c F G H H H H H I f.x.v.u.C N e 3 + '.'.'.'.", + "* * ( [ @.% 8.H.{ * @ 8 s j b b b B F I f.i.C k w O + '.'.'.'.'.", + "'.* [ } @.7._.L.. ! = & X X @ + @ 7 a F u.F j w + '.'.'.'.'.'.'.", + "* - @.<.@.2.Q.0.X ) Z.L.).t.X '.'.+ 7 s Z b w + '.'.'.'.'.'.'.'.", + "* ~ 2.6.4.%.1.4.%.%.Z.2 . `.t.X '.'.+ a b a O '.'.'.'.'.'.'.'.'.", + "* ` 2.H.8.2.%.] ) $.t.t.r.).!.X '.'.+ a s + '.'.'.'.'.'.'.'.'.'.", + "* ~ <.5.7.2.%.[ ` { K.!.`.).).X '.'.+ 0 + '.'.'.'.'.'.'.'.'.'.'.", + "* - ] <.>.3.@.[ ( :.J.L.!.).!.X '.'.O + '.'.'.'.'.'.'.'.'.'.'.'.", + "* : * ) ( ( ( / > r.J.2 J.L.9.X '.'.+ '.'.'.'.'.'.'.'.'.'.'.'.'.", + "- ! / W = * % & X 2 0.t., X X '.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.", + "- ! #.,.<.' * '.'.X X X X '.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'." + }; + +const char * +WxCasPix::m_prefs_xpm[] = + { /* XPM */ + /* columns rows colors chars-per-pixel */ + "32 32 100 2", + " c None", + ". c #9A5600", + "+ c #945300", + "@ c #904F00", + "# c #8B4C00", + "$ c #DC9124", + "% c #FFC463", + "& c #FBB648", + "* c #B66A01", + "= c #E3900B", + "- c #C17101", + "; c #8F5000", + "> c #C47A14", + ", c #F4B54F", + "' c #FFCA72", + ") c #FEBB4B", + "! c #FFB63C", + "~ c #EFAE45", + "{ c #EC950C", + "] c #F59D0B", + "^ c #FBA10D", + "/ c #BF7204", + "( c #824800", + "_ c #9D5800", + ": c #F1AF49", + "< c #FFC15C", + "[ c #FFC055", + "} c #F1AB3A", + "| c #FFB233", + "1 c #FCA512", + "2 c #F39C1C", + "3 c #E39321", + "4 c #FFB02B", + "5 c #FFAF28", + "6 c #FFAC22", + "7 c #FEAA1B", + "8 c #DF8C0B", + "9 c #7A4400", + "0 c #FFB027", + "a c #FEA816", + "b c #CE8009", + "c c #6E3D00", + "d c #E49929", + "e c #FFB843", + "f c #D48006", + "g c #FFC86E", + "h c #D9871D", + "i c #B96400", + "j c #F4AD43", + "k c #DE9B30", + "l c #E79107", + "m c #FFE5BC", + "n c #FFD897", + "o c #FFD082", + "p c #FFBE53", + "q c #C98B31", + "r c #B1751B", + "s c #E38D09", + "t c #D19036", + "u c #FFD899", + "v c #FABD5B", + "w c #AB7326", + "x c #D97E00", + "y c #D47900", + "z c #CB7300", + "A c #AC6300", + "B c #BA7C1F", + "C c #FFE0AC", + "D c #FEC669", + "E c #B36400", + "F c #DD8000", + "G c #EC8F0A", + "H c #754100", + "I c #FEC770", + "J c #FFCD7A", + "K c #C36B00", + "L c #A45B00", + "M c #B67B29", + "N c #A85D00", + "O c #FFD38B", + "P c #DAA14A", + "Q c #B26D0C", + "R c #B98131", + "S c #703F00", + "T c #C38322", + "U c #FFF3DF", + "V c #FFFFFF", + "W c #DEA751", + "X c #A7650D", + "Y c #FFDBA1", + "Z c #E18E1D", + "` c #EA9A24", + " . c #F2A52D", + ".. c #E1901D", + "+. c #D07B0B", + "@. c #E3952B", + "#. c #D98414", + "$. c #FFE3B3", + "%. c #E88903", + "&. c #9B600D", + " ", + " . + + + @ @ # ", + " . . . $ % & + + * = - # ; ", + " . > , ' % ) ! ~ + ; { ] ^ { / # ( ", + " _ : < % [ ! } | ~ ; = 1 1 ] ] 2 = # ", + " . 3 [ [ ) ! ! 4 5 / 6 7 1 ] ^ ] 8 9 ", + " . . [ [ ! ! | | 4 0 6 6 a 1 ^ ^ b c ( 9 ", + " . _ . ; 9 d [ e ! ! | | 4 5 6 6 a a 1 / c ( * f 9 ", + " _ } g } h i j ) ) e ! } k k k } 6 7 a 1 { * l ^ ^ 8 9 ", + " _ m n o o % p p ) ) q ; ; ; # # r k 7 7 a ^ ^ ^ ] ] s 9 ", + " . t m u o % v < [ p w ; * x y z A ; ; B 7 a 1 1 ^ ^ ^ ] f 9 ", + " . u C o o D % v < q # E z x F x y z E + B 7 a 1 ^ ^ ^ ] G H ", + " . I u o o D D % < _ * z x x F F x z z i ( B 7 a 1 ^ ^ ] z 9 ", + ". F F 2 & J g D % % _ ; # # # ( 9 _ E K i _ ( } a a ^ { E # H ", + ". F F y K 2 J J D % _ 9 9 _ E L 9 k 7 7 = E # ( H ", + ". + K y K L G J g D M _ H _ L 9 k 6 7 1 ^ { f E H ", + " + + K N 2 O J D P . c _ c k 6 6 7 1 ] ] ] H ", + " + Q m u o J ' R _ c # c } 0 6 6 a a ] ] S ", + " + T o U u n J J g R ( 9 c c B | | | 5 7 a a ^ H ", + " + x 2 O V m u O J J ' W w 9 9 H 9 c c X ! | | | | | | 6 a S ", + " + x F F 2 Y U u u o J g D D } k k k k } [ [ [ ! Z 3 ` . .^ S ", + " + F F F F 2 Y C ) ..J o g D % % v [ [ [ ) [ [ p Z _ E K y c ", + " + * x F F F 2 ..i + .u o J D % < < [ [ [ [ [ % j K + _ i S ", + " @ F F F F z i 9 + 3 C u o J ' % D D % % % % % O 3 K c c ", + " # F F z # # ( +.m u u O J ' I [ .I o O O o e @.c ", + " # E # 9 +.O m m u u O ' +.x { [ m Y v #.E c ", + " # ( y l ) o m m $.O i F F %. .Z z i i H ", + " ( . x F F x G 2 B 9 9 z F F i i i i L c ", + " ( A F F F F F F &.9 H x F K i i + c ", + " ( - F F F F F F 9 H F z N c c ", + " 9 9 9 A / z y H c H c ", + " 9 9 9 H " + }; + +const char * +WxCasPix::m_print_xpm[] = + { /* XPM */ + /* columns rows colors chars-per-pixel */ + "32 32 152 2", + " c None", + ". c #0c0b0a", + "X c #32373e", + "o c #303941", + "O c #1f4d2a", + "+ c #2c6c3b", + "@ c #36414a", + "# c #39434d", + "$ c #3c4752", + "% c #346246", + "& c #5d2d0e", + "* c #642909", + "= c #6e310c", + "- c #7f3e13", + "; c #723c44", + ": c #414041", + "> c #414d58", + ", c #43505b", + "< c #475460", + "1 c #485663", + "2 c #4b5865", + "3 c #4e5c6a", + "4 c #505a65", + "5 c #555f6a", + "6 c #52606e", + "7 c #5b646d", + "8 c #566675", + "9 c #576877", + "0 c #586876", + "q c #5b6b7b", + "w c #6b6c6f", + "e c #606f7d", + "r c #62717d", + "t c #727476", + "y c #5e6f80", + "u c #5e7080", + "i c #637382", + "p c #647788", + "a c #657889", + "s c #687784", + "d c #6a7986", + "f c #6d7c8b", + "g c #6b7e91", + "h c #747b82", + "j c #727f8a", + "k c #21a72c", + "l c #378346", + "z c #15c61d", + "x c green", + "c c #33e23a", + "v c #429c55", + "b c #47a55d", + "n c #41ff41", + "m c #6d8295", + "M c #74828f", + "N c #758491", + "B c #708498", + "V c #7b8792", + "C c #7e8c99", + "Z c #7fb79a", + "A c #76c493", + "S c #79c697", + "D c #813f12", + "F c #a1282d", + "G c #804017", + "H c #86451b", + "J c #8e4a1a", + "K c #954f1d", + "L c #9a531e", + "P c #a65d24", + "I c #ab6228", + "U c #b4682c", + "Y c #bc6e2d", + "T c #bf7732", + "R c #a4734c", + "E c red", + "W c #c1742d", + "Q c #c77835", + "! c #ca4f55", + "~ c #ce8240", + "^ c #c18c57", + "/ c #cc914e", + "( c #d28a4a", + ") c #d69556", + "_ c #d99a5c", + "` c #dfaa6e", + "' c #deaa7d", + "] c #878f98", + "[ c #86929e", + "{ c #8b939c", + "} c #90979f", + "| c #8694a1", + " . c #8a96a1", + ".. c #8d98a4", + "X. c #939ba2", + "o. c #939ea9", + "O. c #86ae9e", + "+. c #88bda3", + "@. c #96a2ae", + "#. c #9aa3ad", + "$. c #97a4b0", + "%. c #9aa6b2", + "&. c #9ca9b4", + "*. c #97b3af", + "=. c #a0a09f", + "-. c #a0a7ae", + ";. c #a7a8a4", + ":. c #a2abb4", + ">. c #a3aeb8", + ",. c #a8aeb4", + "<. c #a6b1bc", + "1. c #aab1b7", + "2. c #abb3bb", + "3. c #b2b8bd", + "4. c #aab5c1", + "5. c #acb8c4", + "6. c #b3bbc3", + "7. c #b1bdc8", + "8. c #8dcea7", + "9. c #8ecfa9", + "0. c #a2c3b9", + "q. c #b7c0ca", + "w. c #bac3cc", + "e. c #bdc7d1", + "r. c #bec8d2", + "t. c #c3aa90", + "y. c #dfae85", + "u. c #e9c38f", + "i. c #e6d2ba", + "p. c #f2dcaf", + "a. c #c5c5c1", + "s. c #c1c7cd", + "d. c #c2cad3", + "f. c #c9ced3", + "g. c #ccd1d6", + "h. c #cdd4da", + "j. c #d2d7dc", + "k. c #d2d9df", + "l. c #d8dbdf", + "z. c #d4dbe1", + "x. c #dadee3", + "c. c #d8e0e7", + "v. c #dfe4e8", + "b. c #e5e5e2", + "n. c #e3e6ea", + "m. c #e7eaee", + "M. c #ececea", + "N. c #eceff2", + "B. c #edf0f3", + "V. c #f0f2f5", + "C. c white", + "Z. c None", + /* pixels */ + "Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.", + "Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.3 3 3 2 2 2 Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.", + "Z.Z.Z.Z.Z.Z.Z.Z.8 8 0 0 e r r 0 8 , , , > > Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.", + "Z.Z.Z.Z.Z.8 8 8 r s s s s r r r r r r r 0 3 , $ , # # Z.Z.Z.Z.Z.", + "Z.Z.8 8 8 r s s s s s s s s s s s s r r r r e e r r # Z.Z.Z.Z.Z.", + "8 8 i d f f f f f f f d s s s s s s s s s s s s q i # Z.Z.Z.Z.Z.", + "8 5.%.| C j f f f f j f f f f f d s s s s s e 9 a m # Z.Z.Z.Z.Z.", + "8 r.c.c.z.w.>. .M f f f f f f f f f f s e 9 9 u m m # Z.Z.Z.Z.Z.", + "8 r.N.C.V.m.x.k.d.q.%.| N i f d d d q 8 8 8 y m m m o Z.Z.Z.Z.Z.", + "8 r.C.C.C.m.l.k.h.r.w.7.5.q f r C | 8 8 8 9 g B m m o Z.Z.Z.Z.Z.", + "8 w.N.C.N.m.l.k.k.d.w.7.5.6 f 6 7.&.6 8 8 a m m m m o Z.Z.Z.Z.Z.", + "8 7.n.C.m.m.z.k.k.r.w.7.5.3 M 3 z.&.3 8 y g g g B p o Z.Z.Z.Z.Z.", + "8 4.x.N.v.v.k.z.h.r.w.5.5.2 M 2 k.%.2 9 a g g g f 8 o Z.Z.Z.Z.Z.", + "8 4.x.j <.v.z.z.h.r.w.5.4.1 j 1 h.%.< y a a a g q 9 o Z.Z.Z.Z.Z.", + "8 4.x.N.s.r X.k.<.d.q.5.<.1 N 1 r.%.< y p u a y 8 u o Z.Z.Z.Z.Z.", + "8 <.x.5 X.n.2.4 [ r.7.4.<., N > 7.$.> y u u u * q m o Z.Z.Z.Z.Z.", + "8 >.x.V.3.5 X.j.<.w.7.4.<., j , 4.@.> q q r * * a m X Z.Z.Z.Z.Z.", + "8 >.x.$ o.x.2.4 { s.5.<.&., j , 4.@., 0 0 * * G g * * * * * * * ", + "8 :.v.M.3.> X.j.,.w.5.,.*.% b + 0.o., 0 0 * Y - * p.u.` ~ I * Z.", + "8 &.l.> } x.2.$ { q.5.<.+.+ v + 9.o.> 8 * G P * p.` ) Y * * Z.Z.", + "8 &.x.N.3.$ X.g.:.w.2.,.S + c k 9.o., 8 * J ~ ` ) K * * Z.Z.Z.Z.", + "8 $.x.$ X.x.2.$ ] 6.<.:.A + n z 9...> 8 * Q Y P H * o Z.Z.Z.Z.Z.", + "0 @.x.m.3.$ } g.:.6.2.:.A + x z 9..., * * Y Y & ' R G * Z.Z.Z.Z.", + "5 o.x.$ X.l.3.# ] 7.2.&.Z + l O 8. ., 8 * Q Y y.C.. R I X X X Z.", + "6 o.l.n.2.> } f.-.6.,.&.O.% b + 0. ., * * ( _ _ M.: T / i.C.a.X ", + "3 ..l.$ X.l.1.# ] 6.<.#.@.> ! ; 2. ., 8 * ` p.` _ U T ^ w . C.X ", + "3 ] 7.l.l.> } f.-.6.<.#.o.> E F 2. ., * = _ ` ` ( U P t.a.=.M.X ", + "3 s o.7.f.f.j.> ] 6.,.#.o.> E F <. .> * = P ( ( Q I P t.b.b.b.X ", + "Z.3 8 r h 1.s.f.s.6.>.#.o., 7 o <.{ , * D * * * * * t =.;.;.X Z.", + "Z.Z.Z.1 1 < i C :.,.-.#.#., r , 2..., * J I P - * Z.X X X X Z.Z.", + "Z.Z.Z.Z.Z.Z.> > $ $ , 7 h , r > V M # * J W W L * Z.Z.Z.Z.Z.Z.Z.", + "Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.# @ @ X o o X o o Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z." + }; + +const char * +WxCasPix::m_refresh_xpm[] = + { /* XPM */ + /* columns rows colors chars-per-pixel */ + "32 32 117 2", + " c None", + ". c #1c203a", + "X c #1e2252", + "o c #1e3249", + "O c #143959", + "+ c #0c3c62", + "@ c #242840", + "# c #213d5c", + "$ c #353541", + "% c #34394c", + "& c #383e4f", + "* c #3d3e78", + "= c #0d4758", + "- c #04406c", + "; c #044777", + ": c #01556d", + "> c #09566b", + ", c #056078", + "< c #444451", + "1 c #4a4a5d", + "2 c #4c4c61", + "3 c #515161", + "4 c #5c5c6d", + "5 c #53537e", + "6 c #5f5f70", + "7 c #636365", + "8 c gray42", + "9 c #636377", + "0 c #727272", + "q c #3e3e8f", + "w c #014f85", + "e c #01528a", + "r c #025691", + "t c #0a5fae", + "y c #016495", + "u c #01649b", + "i c #01708d", + "p c #0168af", + "a c #016bb4", + "s c #0175a2", + "d c #017ca4", + "f c #0173ba", + "g c #127bb3", + "h c #017bc0", + "j c #6c7698", + "k c #018bb9", + "l c #0192bc", + "z c #0589ca", + "x c #019ac5", + "c c #0192d2", + "v c #0299d7", + "b c #019bd9", + "n c #0e94d2", + "m c #089bd8", + "M c #1b91cd", + "N c #1898d2", + "B c #01a3cf", + "V c #00a5d5", + "C c #02a1dd", + "Z c #1aa4db", + "A c #01a5e0", + "S c #01aae4", + "D c #01aee8", + "F c #0daee5", + "G c #01b1e2", + "H c #01b3eb", + "J c #02b8ef", + "K c #0cb0e7", + "L c #09b4eb", + "P c #01bcf2", + "I c #10aae1", + "U c #1eabe0", + "Y c #12b3e9", + "T c #19b3e7", + "R c #2597c5", + "E c #2398d1", + "W c #27abdf", + "Q c #36a8db", + "! c #21b3e7", + "~ c #23b7e9", + "^ c #2fb2e3", + "/ c #2dbaea", + "( c #38afe0", + ") c #39bbe8", + "_ c #01c1f5", + "` c #01c3f8", + "' c #45aedb", + "] c #48bae5", + "[ c #77bed4", + "{ c #4bc5ed", + "} c #4bd0f5", + "| c #59c6ec", + " . c #5fd6f7", + ".. c #78c0d4", + "X. c #65c9ec", + "o. c #6dcef0", + "O. c #6bd4f4", + "+. c #75cfef", + "@. c #77d5f4", + "#. c #8dcdec", + "$. c #85daf6", + "%. c #96d8e9", + "&. c #93d3f3", + "*. c #97ddf1", + "=. c #84e2fb", + "-. c #8be3fb", + ";. c #8de8fe", + ":. c #92e4fb", + ">. c #92e8fd", + ",. c #9ceafe", + "<. c #a0e7fc", + "1. c #a6ecfe", + "2. c #a8e3f8", + "3. c #abebfd", + "4. c #b7edfc", + "5. c #b9f0fe", + "6. c None", + /* pixels */ + "6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.", + "6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.0 1 6.", + "6.6.6.6.6.6.6.6.6.6.6.6.6.6.X.5.} % # @ X X + O o = . 6.", + "6.6.6.6.6.6.6.6.6.: : . . o ' 5.O.t i s a d d a d a p a a . O 6.", + "6.6.6.6.. O + = : : i i s h o.5.O.d a a d d d a a p p a a . O 6.", + "6.6.6.3 * d a a d a a a d f $.5.@.a d E 5.h d p p p p p a . $ 6.", + "6.6.6.3 * d a a d a a d a z <.5.&.d d O.5.z a p p p p a a . $ 6.", + "6.6.6.3 * a a a d d d a d n 3.5.&.a a &.5.m a p p p p a a . % 6.", + "6.6.6.3 - d d a a a a a d Q 1.5.-.h a *.5.W a p p p a a a . < 6.", + "6.6.6.3 - d d a a n z a a ^ 5.| 5.h f :.5.' f a a a f f f . < 6.", + "6.6.6.3 - d d a f 5.| a a | 5.| 5.f l 5.2.X.f h h f f h f . 1 6.", + "6.6.6.3 - d a a l 5.1.f a O.5.{ 5.l n 5.*.$.l h f f h h f . 2 6.", + "6.6.6.3 * d d a m 5.5.m f =.5.' 5.l Z 5. .5.m h h f h z l . 3 6.", + "6.6.6.4 * d d f ] 4.5.( l 5.5.) 5.z ( 5./ 5.! z M m Z ! ^ ` O.@.", + "6.6.6.3 - d a f +.5.;. .m 5.^ ^ 5.m ) 5.T 5./ | *.<.5.5.5.1.6.6.", + "6.6.6.4 ; f h N 5.[ | %.~ 5.W ( 5.L ..5.L 5.| 5.X./ ) R S > 5 6.", + "6.6.6.` R ' | @.5.W ) 1.[ 5.Z ( 5.R X.@.v 5.5.5.W c b b c o 3 6.", + "6.6.1.1.5.5.$.O.{ z Z 2.=.5.N ! 5.~ 5.| b .5.3.L x c b c o 3 6.", + "o.o.J _ g N M c l l v ,.1.%.b ! 5.) 5.} x } 5.,.S c c C B o 3 6.", + "6.6.6.3 w z z z z z b =.5. .c U 5.} 5./ c / 5.O.S B D A A o 3 6.", + "6.6.6.4 q z b b c c c [ 5.[ c E 5.[ 5.~ C E 5.} S S S S S o 3 6.", + "6.6.6.3 : c b c x x c / 5.) C R 5. .5.Y A H 5.Y S A A K H O 3 6.", + "6.6.6.3 e v b c c c c R 5.L A R 5.&.5.L F F H H H H H K H O 3 6.", + "6.6.6.3 t c C B B B D D 5.S F I 5.>.5.H H H H K G P P U P O 3 6.", + "6.6.6.7 i B A D A S S S S S A I 5.:.5.J H P U P P P P _ J O 3 6.", + "6.6.6.5 r S S F F D K H H K H P 5.3.&.P U P P _ _ ` ` ` O.O 3 6.", + "6.6.6.3 u A A H H H H H K P P _ 5.5. ._ _ _ ` J O.J O.J J . 3 6.", + "6.6.6.6 u H H H G P P P G G Z V @.5.{ r , ; o X . . % & 1 9 6.", + "6.6.6.6 y P H x k a r : ; o . ; ..5.O.8 6.6.6.6.6.6.6.6.6.6.6.6.", + "6.6.6.6.. . X < 7 0 6.6.6.6.6.6.#.5.6.j 6.6.6.6.6.6.6.6.6.6.6.6.", + "6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.", + "6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6." + }; + +const char * +WxCasPix::m_save_xpm[] = + { /* XPM */ + /* columns rows colors chars-per-pixel */ + "32 32 134 2", + " c None", + ". c #093d5c", + "X c #2d440a", + "o c #344f0c", + "O c #36520c", + "+ c #3c5b0d", + "@ c #0b446b", + "# c #0b4771", + "$ c #0c4c79", + "% c #6d0000", + "& c #770303", + "* c #7c0405", + "= c #41630e", + "- c #45690f", + "; c #476b10", + ": c #486d10", + "> c #4b7310", + ", c #527c12", + "< c #094e84", + "1 c #0e568d", + "2 c #075090", + "3 c #0b5fa0", + "4 c #135fa1", + "5 c #12619e", + "6 c #126aae", + "7 c #1370b8", + "8 c #317abd", + "9 c #1479c6", + "0 c #568313", + "q c #598714", + "w c #5c8c14", + "e c #5f9115", + "r c #629516", + "t c #679c17", + "y c #689e17", + "u c #6ba217", + "i c #6ba318", + "p c #71ab19", + "a c #76b41a", + "s c #78b61a", + "d c #7cbd1b", + "f c #7fc11c", + "g c #248ad6", + "h c #3191d9", + "j c #3b95d4", + "k c #2b9bea", + "l c #369ce6", + "z c #44a9f3", + "x c #57b4f9", + "c c #5bb6f8", + "v c #6baaec", + "b c #65b9f8", + "n c #6fbef9", + "m c #79afe9", + "M c #75b8f3", + "N c #77c0f6", + "B c #73c1fd", + "V c #880506", + "C c #8a0609", + "Z c #920609", + "A c #92080a", + "S c #990405", + "D c #9b0a0d", + "F c #a20a0d", + "G c #a40d10", + "H c #b50f13", + "J c #bc1318", + "K c #cb161c", + "L c #d31820", + "P c #c62d31", + "I c #cd3035", + "U c #d53f3a", + "Y c #e21d26", + "T c #ea212a", + "R c #f2232d", + "E c #f44b53", + "W c #f5585f", + "Q c #f5656c", + "! c #f56d61", + "~ c #f66b71", + "^ c #f57076", + "/ c #81c41c", + "( c #85cb1d", + ") c #88cf1e", + "_ c #8cd41f", + "` c #8fd91f", + "' c #95e025", + "] c #98e12b", + "[ c #9be231", + "{ c #9fe33a", + "} c #a2e43f", + "| c #a3e441", + " . c #a7e54b", + ".. c #ace754", + "X. c #aee759", + "o. c #b0e85b", + "O. c #b5e967", + "+. c #b6ea69", + "@. c #b8ea6c", + "#. c #bbeb73", + "$. c #beec7a", + "%. c #8dc7fa", + "&. c #99cef9", + "*. c #afd9fd", + "=. c #b5daf9", + "-. c #f7878c", + ";. c #f88d91", + ":. c #f89296", + ">. c #f8a3a6", + ",. c #c5ee87", + "<. c #c6ee8a", + "1. c #c8ef8e", + "2. c #ccf095", + "3. c #cff19d", + "4. c #d3f2a4", + "5. c #d6f3ab", + "6. c #d8f4af", + "7. c #daf4b4", + "8. c #dff6bd", + "9. c #c5e3fb", + "0. c #d4eafd", + "q. c #fbced0", + "w. c #fbd4d5", + "e. c #e3f7c6", + "r. c #e6f8cb", + "t. c #e9f9d2", + "y. c #edfad9", + "u. c #fde9ea", + "i. c #f1fbe3", + "p. c #f5fcea", + "a. c #f3faff", + "s. c #f8fdf1", + "d. c white", + "f. c None", + /* pixels */ + "f.f.f.f.f.f.f.2 . f.f.f.f.f.f.f.* V Z Z F F H H f.f.f.f.f.f.f.f.", + "f.f.f.f.f.f.2 M 4 . f.f.f.f.f.& A D G J L L Y K H H f.f.f.f.f.f.", + "f.f.f.f.f.2 m *.B 4 . f.f.f.% % % % * C G Y Y Y T K H f.f.f.f.f.", + "f.f.f.f.2 m 0.9.N x 4 . f.f.f.f.f.f.f.* Z H Y R R R H f.f.f.f.f.", + "f.f.f.2 m a.a.0.n l h 4 . f.f.f.f.f.f.% V D R E ^ -.U H f.f.f.f.", + "f.f.2 2 2 2 %.0.b g . . . . = + + + + % V S R W -.>.! H f.f.f.f.", + "f.f.f.f.f.2 v =.c 9 . > p p p p p p p % V F R W -.w.! H - X X f.", + "f.f.f.f.f.2 8 &.z 9 . e i p p p p p p % & F R W -.w.! H 0 e > X ", + "f.f.f.f.f.= 2 j k 7 . w t y u u i % % % & F R Q -.d.! H 0 u w X ", + "f.f.f.f.f.+ 2 3 6 5 1 . . . . w y % V P I I R ~ ;.d.! H H H H O ", + "f.f.f.f.f.+ e 2 < $ # @ . . q r r r % V R W Q ~ :.u.d.d.! H > X ", + "f.f.f.f.f.+ > > > > > > 0 r e e e e e % V R Q -.:.q.u.! H > e X ", + "f.X X X X X X X X X X + = = > > > > > > % V R :.:.w.! H : w w X ", + "+ r ] X.o.o.{ [ _ r = X X X X X X X X + > % V R >.! H - 0 0 0 X ", + "+ ] 4.r.p.s.s.s.i.r.5.2.#.X.{ { ' s = X - > % V ! H = 0 0 0 0 X ", + "+ f 5.r.r.r.r.t.t.y.p.s.s.s.i.r.7.1.) X O = > % V = > , , , , X ", + "f.+ o.4.4.4.4.5.6.8.e.e.e.e.e.e.e.7.,.t X O = - = - - : > > > X ", + "f.+ s 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.$.a X X X X X = - : > > X ", + "f.f.+ } #.#.#.#.#.#.#.#.#.#.#.#.#.#.1.3.,.#.#...' w X = - > > X ", + "f.f.+ u o.o.o.o.o.o.o.o.o.o.o.o.o.o.@.1.3.r.y.y.6.<.r X = : > X ", + "f.f.f.+ ` } } } } | | | | | | | | | ...+.O.+.O.+.+.' X = - : X ", + "f.f.f.+ r ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] X + = - X ", + "f.f.f.f.O d ' ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ' e X = - X ", + "f.f.f.f.O w _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ f X = = X ", + "f.f.f.f.f.O a _ ) ) ) ) ) ) ( ) ( ( ( ( ( ( ( ( ( ( ( _ X O = X ", + "f.f.f.f.f.O 0 ( _ ) ) ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ) > X = X ", + "f.f.f.f.f.f.O p ) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d X = X ", + "f.f.f.f.f.f.O > a _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ X O X ", + "f.f.f.f.f.f.f.O , i d ( _ _ _ ` _ _ _ _ _ _ _ _ _ _ _ _ _ 0 X X ", + "f.f.f.f.f.f.f.f.o o o o o o o > t p d ( ( ) _ _ _ _ _ _ _ i X X ", + "f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.: : o O o X X X : e p d / ( w X f.", + "f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.= X X X X X X f.f." + }; + +const char * +WxCasPix::m_stat_xpm[] = + { /* XPM */ + /* columns rows colors chars-per-pixel */ + "630 120 256 2", + " c #000000", + ". c #090A0A", + "X c #151618", + "o c #0A1513", + "O c #151729", + "+ c #0D2E1A", + "@ c #183836", + "# c #142F2A", + "$ c #271434", + "% c #3A3B3B", + "& c #262C2F", + "* c #2E2013", + "= c #16354A", + "- c #32184D", + "; c #263946", + ": c #303152", + "> c #33356A", + ", c #232566", + "< c #184638", + "1 c #164C2D", + "2 c #1A6935", + "3 c #325C2C", + "4 c #36513A", + "5 c #2E4E37", + "6 c #3D641D", + "7 c #346629", + "8 c #2A6F33", + "9 c #1E4B19", + "0 c #194846", + "q c #155649", + "w c #135953", + "e c #0F4E56", + "r c #104770", + "t c #176746", + "y c #186754", + "u c #1A7657", + "i c #0E7549", + "p c #1B6667", + "a c #264647", + "s c #265857", + "d c #374648", + "f c #384655", + "g c #2C5150", + "h c #394877", + "j c #385976", + "k c #30536B", + "l c #266859", + "z c #24775A", + "x c #296E4A", + "c c #296765", + "v c #287765", + "b c #396768", + "n c #3A6575", + "m c #397369", + "M c #306F75", + "N c #533533", + "B c #733112", + "V c #72352A", + "C c #59221A", + "Z c #4D1972", + "A c #5A3958", + "S c #4D344F", + "D c #4E3470", + "F c #66355A", + "G c #762A49", + "H c #772954", + "J c #6E324F", + "K c #6D366D", + "L c #52195A", + "P c #4E4337", + "I c #75493A", + "U c #6E4934", + "Y c #615719", + "T c #454444", + "R c #575559", + "E c #514853", + "W c #484678", + "Q c #44577A", + "! c #574766", + "~ c #584775", + "^ c #54546B", + "/ c #565473", + "( c #484C68", + ") c #4B6B71", + "_ c #6A4A4B", + "` c #634878", + "' c #6C4870", + "] c #717274", + "[ c #586D50", + "{ c #3A3787", + "} c #3D1797", + "| c #394A84", + " . c #385384", + ".. c #334B93", + "X. c #3650A2", + "o. c #34708B", + "O. c #22699F", + "+. c #1B76C4", + "@. c #4D178A", + "#. c #4D328D", + "$. c #5A37A3", + "%. c #721990", + "&. c #7C14A7", + "*. c #71318E", + "=. c #6C31AC", + "-. c #773ACB", + ";. c #484688", + ":. c #474995", + ">. c #495497", + ",. c #574987", + "<. c #594895", + "1. c #545687", + "2. c #4C558A", + "3. c #564CA8", + "4. c #486D88", + "5. c #4A6FB0", + "6. c #654887", + "7. c #674B97", + "8. c #675289", + "9. c #695795", + "0. c #794687", + "q. c #775194", + "w. c #6C4CAB", + "e. c #736D8F", + "r. c #6C67B1", + "t. c #536FCE", + "y. c #6D4AC8", + "u. c #6C6CCE", + "i. c #707AE2", + "p. c #5769D1", + "a. c #248339", + "s. c #239C32", + "d. c #078146", + "f. c #278451", + "g. c #2D826D", + "h. c #2EA45F", + "j. c #63A433", + "k. c #708676", + "l. c #5DA25A", + "z. c #43FC3F", + "x. c #77C236", + "c. c #50C41F", + "v. c #55D455", + "b. c #368789", + "n. c #388FB2", + "m. c #14A0A6", + "M. c #39A6D2", + "N. c #2B97CC", + "B. c #0ACFEF", + "V. c #788788", + "C. c #558CA8", + "Z. c #4B93CC", + "A. c #44A1D1", + "S. c #47A4E5", + "D. c #7091E6", + "F. c #73ABE4", + "G. c #6B99D4", + "H. c #4CD8B2", + "J. c #96173B", + "K. c #8A3B17", + "L. c #923330", + "P. c #A61C3A", + "I. c #B9273C", + "U. c #AC3038", + "Y. c #A6251A", + "T. c #971949", + "R. c #86244B", + "E. c #89385A", + "W. c #983A5A", + "Q. c #8F2D50", + "!. c #973A65", + "~. c #893872", + "^. c #A11547", + "/. c #AE2E49", + "(. c #A93A67", + "). c #B03970", + "_. c #954715", + "`. c #914510", + "'. c #904930", + "]. c #976431", + "[. c #AB4E12", + "{. c #A94A2A", + "}. c #B74B2A", + "|. c #B5512C", + " X c #AD6E36", + ".X c #A37209", + "XX c #91474B", + "oX c #86467C", + "OX c #924470", + "+X c #AC4C54", + "@X c #B84875", + "#X c #B0456C", + "$X c #B37846", + "%X c #916F59", + "&X c #CA3230", + "*X c #E03027", + "=X c #C8334D", + "-X c #C93C77", + ";X c #C85332", + ":X c #DA6F2C", + ">X c #C94F47", + ",X c #C44477", + " | ..................r r { ....{ r p O.p p p p ..r p ............r ......r | > r > r > r .. .| 2.| | ;.| | | Q h Q 2.h | #.{ #.{ { { { { > #.{ > #.} #.#.<.<.:.$.:.#.$.$.#.#.#.#.$.} $.} } } } } } } } @.} } @.} @.} #.#.} @.} @.@.} } { > @.Z Z Z } Z } Z } @.@.} } &.@.} @.@.@.} &.} &.@.@.%.@.@.@.Z Z Z @.Z Z Z Z @.@.Z Z Z @.Z Z Z Z Z Z Z Z Z Z Z Z Z Z L - L Z L - Z Z L Z - L Z Z #.Z *.#.D *.#.K @.Z #.K @.K #.*.@.Z @.Z @.Z @.Z Z @.%.Z Z %.@.=.$.@.=.$.$.$.=.} -.&.=.} -.-.&.} =.$.=.=.=.=.$.$.$.$.=.=.=.=.y.3.-.p.w.y.r.w.y.y.y.w.y.y.w.y.y.-.y.-.y.-.-.-.-.-.-.=.-.-.$.=.-.-.-.-.y.y.-.y.pX-.y.y.y.y.y.y.sXpXpXpXpXpXpXpXpXwXpXpXpXpXpXr.sXsXfXsXpXfXfXsXsXsXdXpXwXpXdXdXdXwXwXdXdXdXdXwXdXdXdXwX", + "H H ~.^.~.T.T.(.).#X).7X).).).).~.).).~.).~.(.Q.Q.!.Q.~.~.Q.!.4XeX~.(.(.).^.(.!.(.!.!.~.(.~.!.~.(.!.(.!.(.K ~.~.~.~.oXK 4X' ~.0.~.*.eXK K eXeXoXoX4X~.eXeXK 4X' ~.oX' 4X~.eX4X' eXeXK oXoXrX' ' K ' K ' eX0.' 0.' eXtXq.0.' K ' ' oX' ~.0.%XoXrXrXoXoXrXOXrXrXuXrXOXrXOXoXoXoXoXrXrXoXoXoXoXq.tXrXrXrXrXoXrXrXrXrXrXrXoX~.' ~.oX~.K ~.~.K ~.H K K K H ~.K H K Z K ' 4XoX0.eXK K ' 4XeXK K oX4XoXeX~.oX*.*.K K *.*.K K *.6.*.*.0.6.*.*.6.D *.~ *.` *.~ *.*.~ 6.D K *.*.K ` *.*.K K K 6.<.6.6.,.1.,.6.D ~ *.~ ~ *.~ *.~ D ~ #.W W W W D W D ;.;.D W ;.W ;.W W W W W W Q k k h j h h h h h h h | h | ........{ ..{ ........r ..r ....p r p O.p p o.M ..O.......O...O...r . .| h r > ..> h > h | | | | .M Q W h 2. .W Q 2.#.{ { #.#.{ { #.} { { #.#.{ #.<.<.$.<.#.$.:.#.<.:.#.$.{ { $.$.{ } } } } } } } @.@.} } @.} @.} @.} #.#.} } #.@.@.} @.} } Z } @.@.} Z } &.&.} } &.} &.@.@.@.} @.@.@.@.@.@.%.@.@.Z @.Z Z @.@.Z Z Z Z @.Z @.Z @.Z @.Z @.Z @.Z Z Z Z Z L L Z , Z Z Z Z - > Z Z Z Z D D D D Z D Z Z *.D *.*.@.*.D @.Z Z *.K @.Z %.Z %.%.Z Z %.@.@.$.$.$.$.=.$.$.$.$.=.} =.&.-.=.} &.-.=.$.=.$.=.=.=.$.=.=.3.p.y.=.=.y.r.y.p.y.y.p.3.y.y.3.y.w.w.-.-.y.-.=.-.y.y.-.=.-.-.-.-.-.-.-.-.=.-.-.-.y.0Xy.y.y.-.u.y.pX-.pXpXpXpXpXpXpXpXpXpX-.pXpXyXpXpXsXsXsXsXsXfXsXsXfXdXsXpXdXpXpXdXdXfXdXdXdXdXwXdXdXgXdXdXdX", + ").7X~.2X7X^.!.7X).7X).7X~.~.).).).~.).T.).).).!.~.Q.Q.Q.W.~.~.eXeXuX~.).).(.!.(.(.!.(.!.(.!.(.!.~.!.).!.(.K K ~.~.eX' ~.' ~.0.~.oX4X~.eXoX~.oXeXeX7X' ~.~.oXK oX~.*.*.' 0.oX~.0.oXeXeXeXeX0.' 0.' K ' ' 4X' eX' ' q.tXq.0.q.' ' oX' oXoXoXoXoXoXoXoXrXrXoXrXoX%XrXoXrX%X%XrXoXoXoXoXoX%XoXrXq.rXrXtXrXrXrXrXrXrXrXrXtXrXoXeX~.oXoX4XeXK K K ~.K K H K K K K H K ~.4X~.eXtX0.*.oX' oX' 4XK eXK eXeX0.oXK *.*.*.6.K D K *.*.*.0.*.*.0.0.*.*.~ D *.*.K ,.,.~ *.6.*.*.K K *.K ' *.K D K ` 6.8.~ ` ,.,.,.~ *.D ,.D ,.,.D ,.D W W D #.#.W ,.;.W W ;.D D ;.W D W W D ;.W k k h ( k Q k j h h h h .| h | .............. .k r ....{ ..{ .. .p p p o.c n c o............... . ...O. .r r > h r h h k h ;.;.j m m m h Q h | Q Q ;.X.$...X.#.{ { { > #.{ { > <.<.,.<.<.<.#.{ $.#.:.$.$.{ $.$.{ } #.$.} } } $.} @.@.@.} } $.@.@.@.} } @.@.#.@.{ } { , @.{ Z } @.> } @.@.@.} } &.&.} } &.@.@.@.@.@.&.&.@.@.@.@.@.Z Z @.Z @.@.Z @.@.Z @.Z @.Z @.Z Z Z Z Z @.Z Z Z Z Z Z Z Z Z Z L Z - L > Z Z Z Z Z Z #.#.D @.@.Z #.Z Z #.#.Z D %.*.@.@.@.@.Z Z @.%.Z Z %.Z %.@.$.%.#.#.$.$.$.$.$.$.$.-.-.&.} =.-.$.=.$.=.$.=.$.=.$.$.$.} p.p.p.$.3.y.p.r.p.y.p.y.y.u.r.y.w.y.y.w.-.-.y.=.y.-.-.y.-.-.-.y.y.-.-.-.-.=.y.-.-.-.y.y.pX-.y.y.y.u.-.sXpXpXpX-.pXpXpXpXpXsXpXpXpXpXpXsXsXfXsXpXsXfXdXsXfXsXfXpXdXdXpXdXdXdXwXdXdXdXwXfXdXdXdXdX", + "(.T.).^.!.~.).).#X7X).).).).).~.).).).7X7XT.).~.R.~.!.!.~.eX~.eXeXOXrXOX(.(.^.).T.(.!.!.~.(.~.~.(.!.~.!.!.~.~.~.~.' 4XK ~.eXoXeX0.0.0.eXoXoX4XeXeX' *.oXK oX*.~.oX~.oX~.*.oXoX~.K eXeXeX0.*.' K 0.` *.eX' 0.0.eXq.tXtXq.q.rXrX0.' oX' oXoXoXoXoXrXoXrXOXoXrXrXtXrXrXrXoXrXrXoXrXoXrXrXrXoXtXrXq.q.rXq.rXoXrXq.rXq.tXtXeXeXtXtX4XoXeXK ~.~.K K K ~.K K K K K H K ' eXeXoX0.0.' eX~.*.' oXoXeXeX~.oX~.oXeXK 6.*.*.0.#.*.7.7.*.*.7.7.*.*.6.0.*.6.~ ~ 6.*.~ 6.` ,.~ ` *.*.K *.*.K K K K ~ ` ` 6.` 6.6.,.1.~ 6.D ,.D D ,.D 6.D ,.;.~ W ,.D W ~ #.W ;.;.D W W D W W W W h ( h h j j j j h | j h h h | h ............r r | k ..| ..r ....r p O.p M c c c ................r O. .r .o. .r r > h k j n .M m M ) m b 2.;.Q Q .j #.{ { #...#.> { { { D #.<.<.:.$.#.#.<.$.$.#.$.$.#.#.#.} { } $.#.} @.$.} } } @.} } } } @.@.@.$.} $.@.@.} @.} @.@.@.@.@.} #.@.@.@.} @.@.@.} &.} } &.} @.@.@.@.@.@.@.@.%.@.@.Z %.@.Z @.@.Z @.@.Z Z Z { @.Z Z Z @.@.@.Z Z Z Z @.Z Z Z Z - Z Z Z Z Z Z Z > L L - Z Z K Z #.D *.D K #.*.*.D *.#.*.Z K @.K %.Z %.Z %.@.%.Z @.Z @.#.#.$.$.$.$.$.$.$.$.$.&.} =.=.} } -.$.=.$.y.=.y.$.=.=.y.y.p.p.p.p.p.p.y.y.y.r.w.y.r.y.y.y.y.w.w.-.y.-.-.-.-.y.$.-.y.y.=.y.y.$.y.=.-.-.-.-.-.-.-.-.-.-.y.u.u.pX-.pXi.pXpXpXpXpXpXpXpXpXpXpXpXy.aXfXsXsXsXsXfXsXsXpXsXsXfXdXdXdXdXdXdXdXdXdXdXdXdXdXdXwXdXdX", + ").2X~.).).).7X7X).).7X~.).).).!.~.).).^.7X).~.T.!.W.!.oXeXeXuXoXoX4XOXeX~.(.(.(.).~.!.~.(.!.(.(.).!.!.~.(.~.eXeXeX~.' eX*.0.tX*.eX' eXeXK eX*.oXeX' 0.' eX4XoX~.~.' 4XoXeX~.eX~.eXeXeX0.' ' ' 0.' 0.0.oXeX0.0.tXq.tXtXtXiXtXtXrXeXeXeXoXoXoXrXrXoXoXrXoXrXrXrXrXoXrXrXrXiXoXoXoXrXoXoXoXrXrXrXtXtXq.q.tXrXrXrXe.q.tXq.rX4XtXq.tXeXeXK ~.K ~.K *.K K K K H K K 4XeXeXeXeXeX0.eX' eX0.' 4X0.oXeXeXoXeXoX4X0.*.6.*.*.*.7.*.0.*.0.*.*.*.0.*.q.*.*.6.~ ~ ~ *.6.6.6.~ Q #.*.*.*.6.D K *.K K ,.6.~ ` 6.1.~ ,.,.D 6.D ,.,.D ,.D D W ;.W W ~ D ;.W W W D D ;.W W ;.W Q W h h h k j n c j j | h | h h ..h r ..........r r r j .k r | ....p p p o.k M c j e O.............r ..k r O. .p O. .h k .j M n m m n m m m ) b Q Q j Q Q ..{ #...#.#.> #.{ { > <.<.:.<.#.<.<.$.#.{ $.#.#.$.{ #.#.} #.#.} $.} @.} } } @.} @.@.@.} @.} @.#.} #.@.@.@.@.@.@.@.} @.@.@.@.@.@.Z { @.@.} @.&.&.} &.&.@.@.@.{ Z @.@.@.%.@.@.Z @.@.@.Z @.Z @.Z Z @.{ @.> @.Z @.Z @.Z @.Z Z Z } Z Z , Z Z Z Z Z Z D Z Z > > - L Z D Z *.D @.K Z *.D D *.#.#.K @.@.@.Z @.Z Z @.@.%.Z Z Z %.#.#.#.$.$.$.X.$.:.$.$.$.} =.=.=.-.=.=.$.=.$.$.=.$.$.-.$.$.p.p.p.p.y.p.r.p.w.p.y.p.y.p.y.w.y.y.y.w.-.w.y.y.-.-.-.y.-.y.-.y.X.y.y.$.y.-.$.-.-.-.-.-.-.-.-.i.i.i.p.-.pXpXpXi.pXpXpXpX-.pXsXi.pXpXdXsXsXsXpXsXfXpXsXsXfXsXdXfXsXdXfXdXwXdXdXdXdXdXdXdXdXdXdXdXdX", + ").^.).).T.7X).).(.L.V ).).~.(.(.^.).(.(.(.).).).~.eXeXuXeXrXoX4XuXeXoXoX7X(.(.!.~.).(.!.(.!.~.(.~.(.OX).!.eXeX~.4X' K eXeXeX0.eX0.4X0.0.4XtXeXeX*.6.*.6.0.K K 0.~.oX' 4X' 4X' 0.0.eX0.' ' 0.0.' 0.0.' 0.0.rXtXq.yXq.tXiXtXrXrXtXrXrX' oXoXoXOXrXoXiXoXrXrXOX@XrXrXOX@XrXoXoXrXoXoXoXrX' rXtXq.tXq.tXtXtXtXq.rXtXiXtXtXrXtXtXyXtXtXyXtX*.*.K K 4XK K 4XK K K 4X' ~.eX*.eXq.0.0.rX' eXoX0.' eXeXK ' oXoX' 0.*.7.6.6.0.0.6.8.7.q.8.q.0.*.0.q.*.` *.*.*.6.` D 6.*.| .W ~ 6.K K *.K K D ` 6.` 6.` 6.6.,.,.,.,.D ,.D D ~ D ,.,.,.D ,.W #.,.;.W ,.;.D | D W W W h Q h j j k n M j j n j j | | k j p .p ......r r h j ..k r .| p r j p r p j k b n c p ..........O...O.....O.r . . .j . .j .n n m M m M m ) g.m Q j Q Q W :.$.{ #.#...{ #.> ;.<.<.<.,.<.<.$.#.:.$.$.$.$.{ } $.} #.#.} #.X.} #.$.} $.@.} @.} $.@.@.@.@.@.@.@.@.@.} #.@.{ } { Z { @.@.@.{ > } Z Z } &.} } } } @.} @.@.@.{ > @.@.} %.@.@.@.@.@.@.@.@.} Z } } Z Z } } @.#.Z @.Z @.Z @.Z } Z Z Z Z Z Z Z Z > L - - - - D ~ D Z Z D Z #.#.D #.D @.*.*.Z %.D D @.Z %.Z %.Z %.Z %.Z %.@.;.#.{ $.:.:.$.#.{ #.$.#.$.=.=.$.=.=.=.$.y.y.=.=.$.=.-.$.$.p.p.p.p.p.r.u.u.u.p.u.w.y.r.y.w.r.y.w.y.y.w.y.-.-.y.-.3.-.-.$.-.y.y.y.y.y.y.y.-.=.-.-.-.-.-.y.i.i.D.i.i.pXi.pXpXpXpXpXpXpXsXpXi.sXi.i.sXsXdXsXsXfXsXsXdXfXfXfXsXsXsXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXfX", + ").).).~.).7X7X).V B V (.7X!.!.(.7X).).(.).7X^.).uXeXoXeXoXeXrXoXeXOX~.eXeXOX).).(.(.~.~.~.(.~.!.(.OX(.!.!.uXeXeX0.eX0.4X0.eXeX0.eX0.0.4X0.' eXeX0.' 0.*.0.0.eX~.*.oXeXK 4X' eXeX0.eX' 4X*.eX0.0.0.0.0.q.q.tXtXe.tXiXtXtXtXtXtXtXrXtXrXrXrXrXoXrXrXrXoXoXrXoXiXoXOXiXrXoXoXoXq.rXrXoXiXrXtXtXtXrXrXtXtXq.tXyXtXtXtXtXrXeXyXq.yXtX0.yXtXyXtXyXtXq.4X0.K 0.K oX' 4X4X' ' 0.0.' eX0.eXeX0.oXeXeXeXeX4XoXoXoXeX0.0.0.0.7.6.q.7.0.0.8.8.' / ' 6.` ` ` ~ ~ ~ 6.*.,.W j .;.Q ;.,.*.K *.*.K ,.6.6.` 6.~ ` 6.,.1.,.~ D 6.#.~ #.W W W W / / ;.W D ;.#.W W W W | W j h | W j k n j k j M k p M k p .k M k k ......M .k .r .k k c c c p .M j n n n c n c ......O...r .... ... . . .O.k M M .j M M m M m m M m m m m ) Q Q Q .2.{ :.:.:.:.;.;.>.<.<.<.<.,.:.$.$.$.#.$.$.{ :.$.#.#.} { { { #.} } #.#.#.@.@.@.} } @.@.$.@.@.@.@.#.@.@.#.} > @.D @.D @.@.@.#.#.} > } { @.@.} } @.&.} } @.@.> { { > { @.@.@.%.@.@.@.@.Z @.} @.@.} } Z @.@.Z @.Z @.#.@.Z Z } Z Z Z Z Z Z Z Z > Z - - Z K 9.AXAX9.L D Z D D D Z Z #.#.K D *.Z *.*.Z Z %.@.Z Z @.Z Z %.%.@.#.:.:.3.:.>.#.#.{ ' %X#.$.=.=.=.$.$.=.-.$.$.=.$.$.$.-.y.3.p.X.p.p.p.u.u.p.u.r.r.p.p.y.y.u.y.r.y.w.y.y.y.y.y.-.y.-.-.-.-.y.p.y.y.$.y.-.-.-.-.-.-.-.-.i.i.S.i.i.i.i.i.-.-.pXpXpXpXpXpXpXi.sXD.i.AXsXsXsXsXsXfXsXsXsXpXsXsXdXdXsXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXfX", + "^.2X).OX).).(.C C B L.W.B C B B C C C C ~.).7X4XuXeXeXuXeXuXeXoXoXoXuXeXOXoX~.#X~.).(.(.).!.(.!.!.(.!.(.!.~.eXeXeXeX0.' eX0.0.0.0.0.0.0.0.eX4X' *.0.0.K 6.` 0.*.~.' 4X~.eXeXK eXeX' 0.' 0.' ' 0.' 0.rXe.q.tXtXtXtXyXiXtXtXiXtXtXrXrXrXrXrXrXrXoXiXOXiX@XrXrXoXrXrXoXrXrXoXiXrXrXrXoXe.rXq.e.tXq.q.tXq.iXq.iXw.e.e.q.tXyXyXtXyXq.yXyXq.yXyXyXyXtXeX*.4X0.eX*.eX' ' 0.4X0.0.0.] 0.0.eXrX0.eX0.0.eXoXeXeXoXoX0.*.7.7.8.0.7.0.8.6.q.8./ / / ^ ^ ^ ^ / / ^ ^ ^ / / / W / W / Q ~ ,.K ` K K ,.` 6.` 6.6.` ~ ,.,.~ #.~ W W ~ ~ W ;.W Q W W ~ ;.W ~ W W h W W j W W Q h j n c M p v c M M c M k p .k . .p . .r r j r | k p c c l l c M k b c c b n c p ..............r O. ...p O. .M . .M M M M n m M n m m ) m m m n Q Q Q j :.:...X.:...:.<.<.<.<.;.<.<.:.#.:.#.#.#.$.} #.} :.$.{ #.} } #.{ } } { $.@.} @.$.@.@.@.{ D D #.> #.D #.#.#.#.@.D } { @.@.} } #.@.@.{ @.@.%.} &.} @.@.@.> > > > { > > @.@.@.@.@.@.@.@.@.Z @.@.@.> } > } } Z @.Z @.Z @.@.Z @.Z Z , Z Z , Z Z - - D e.AXFXGXZ.Q , > #.#.Z D *.*.D Z @.D Z #.K Z #.Z Z Z Z %.Z %.Z Z Z #.:.<.:.:.#.:.{ D ,.%X%X:.$.} $.$.=.$.$.$.$.$.$.$.-.3.$.$.p.p.p.p.y.p.r.u.p.y.p.p.p.p.r.p.w.p.y.y.p.p.y.y.-.y.y.y.-.$.-.y.p.y.y.y.p.y.$.y.$.-.+.-.-.-.i.t.i.i.t.i.D.i.i.sXpXpXpXpXsXpXpXi.i.i.sXi.i.sXi.sXsXsXpXsXsXsXsXsXsXsXdXfXdXdXdXfXdXdXdXdXdXdXdXdXdXfXfX", + "gX).7X).).OX(.B ]._.B I JXJXbXbX1X|.B Q.).).7X~.eXeXOXrXeXeXeXOX~.eXOXoXOXOX~.!.!.(.!.(.!.).(.!.!.!.(.OX#X' eXeX0.0.yX0.0.eX*.eX0.0.0.0.0.0.0.*.0.' 0.0.K *.6.` ' ~.0.' 4X0.' eX' eX0.0.eX' eX' 0.q.q.e.tXtXtXtXq.yXtXtXtXiXuXtXrXrXrXrXrXrXoXiXOXrXrXrX@XrXoXiXrXrXrXrXrXrXtXrXrXq.iXq.tXtXq.q.iXtXq.iXyXr.iXe.yXq.yXyXyXyXtXtXyXtXq.yXyXyXeXyXyXeX4X0.0.4X0.0.eX0.0.0.0.' 0.0.rX0.0.eX0.eX0.0.0.eXoXoXeXeX0.0.8.7.0.8.8.0.8.8.0./ ] ^ ^ / ' ^ / ^ ^ ^ ' / ^ ^ ^ ' ^ ^ ^ ] / ~ #.K ` 6.6.6.` 6.` ` ` ,.,.W W W #.W W W W W Q W W Q ,.W W W W W h j Q W j h Q h j p v M v p M c p c p M k . .p r k . . .p .r n c p c l s b ( b j n b j c b k j .................. . . . . . .M .M n n n M m m M ) m m ) m m ) Q j Q j 2. .2.| :.;.<.<.<.:.<.<.<.:.<.#.<.#.$.$.} #.#.} $.} #.#.} } #.@.{ } { } { #.#.> W D > W #.D > D #.D { @.#.@.{ { Z #.Z #.#.} #.{ #.Z { @.@.@.@.@.@.@.Z > > > > > > > { Z @.@.@.@.@.@.@.@.@.@.@.} Z @.Z @.@.@.@.@.Z Z @.@.@.Z Z Z Z Z Z , L - D BXFXZXZ.+.5.h L Z D D D Z #.Z D #.D K K #.#.Z Z Z @.Z %.Z %.Z %.Z #.:.:.#.:.#.:.{ > W %X$XXXW ;.$.$.=.$.$.$.$.3.$.$.$.3.3.$.p.p.p.p.y.p.y.p.p.p.u.p.r.y.y.p.r.p.3.p.u.y.y.u.u.y.y.-.y.-.y.y.y.y.y.p.y.y.y.y.$.y.y.t.t.p.i.i.i.p.i.t.D.i.S.i.i.i.pXpXi.y.y.sXi.i.D.sXi.i.D.sXaXaXi.pXsXsXsXsXpXsXaXfXfXfXsXdXdXdXdXdXdXdXdXdXdXdXfXiX", + "7X).7X).#XE.B B _.K. XJXbXvXvX_.B C (.~.4XoXuXeXeXuXoX4XuXoXeXuXoXeXuX4XrXoXuXOX!.~.!.!.!.!.!.(.!.(.!.(.!.4XeX0.eXeX0.eX0.0.tX0.0.4X0.q.0.0.0.0.*.0.0.` 0.6.0.0.6.0.eX0.oX0.eX0.eX' 0.eX0.0.0.q.8.tXrXq.r.tXiXtXtXiXyXiXyXiXyXiXrXiXuXrXrXoXrXuXrXrXoXoXrXrXOXoXtXtXrXq.rXrXrXrXrXtXq.tXq.q.tXiXq.q.q.q.e.yXq.tXr.iXq.yXyXyXyXyXyXyXyXyXyXq.4XyX4XeX0.eX*.' ' *.*.0.*.0.0.0.0.' 0.0.0.q.0.eX0.4XeXoXoX0.0.0.7.*.7.0.7.0.0.9.q.8.8.^ ^ ^ / ^ ^ ^ ^ ^ ^ ^ ^ ^ / / ^ ^ ^ ^ ^ ^ ` ~ ` ,.` ~ ` ' 6.` ` 8.6.~ ,.;.,.W / W 2./ W / ,.W / W W W ,.;.W j j j k Q W j j Q j v v v v M v M M M n j M p j .c c M r r .p k c c c c c l b b ( b b b b n b b M c n j p j p O.M .p O.p O.n k .n n b M b b M n m n m b m m m m n ;.Q Q h . . .n .o.2.<.,.<.<.;.,.<.<.#.#.#.{ $.$...{ } #.} { #.X.{ { { { > #.> D > D D #.D D D D #.{ D #.Z > D #.Z @.#.@.#.#.} D } @.} } @., Z } @.Z @., , Z , > > > > { > , @.@.@.@.@.@.@.@.@.} @.@.@.@.} } Z @.Z @.@.} @.} Z Z , , Z Z , Z - D BXDXZ.+.+.N.5.: - > > Z D D D *.Z Z K @.Z Z K @.Z Z Z Z Z Z Z Z Z Z ;.:.;.:.:.;.{ > D ' ].kX].W D $.#.$.$.=.$.$.<.3.w.3.3.3.y.p.X.X.p.X.p.p.3.p.w.3.p.r.p.5.3.p.y.p.y.r.p.r.y.y.y.p.r.y.y.y.y.3.y.y.y.y.$.y.y.-.-.y.t.t.p.p.i.i.i.i.i.i.i.i.p.i.p.u.pX-.sXi.D.aXsXsXi.sXsXsXi.D.aXaXAXsXsXsXsXsXsXaXaXaXsXsXdXsXdXdXdXdXdXdXdXdXdXaXfX", + ").).).).7XE.B `.:XvXbXvX`.B B V !.(.).uXeXrXuXeXeXeXuXuXOXrXeXuXOXuXeXOXOX~.eXeXuX~.!.!.~.#XOX!.!.!.!.!.!.eX0.0.q.0.0.tX0.0.tX*.7.0.*.0.0.0.6.0.0.0.K *.K 6.6.6.6.0.0.' ' ' 4XeX0.' 0.' 0.0.0.' q.q.tXe.yXe.yXiXyXtXiXyXuXyXyXiXtXrXOXrXuXiXoXrX@XrXoXrXrXrXiXrXrXe.rXe.q.rXe.rXtXq.tXq.tXiXq.tXq.tXyXe.iXq.e.yXq.iXtXyXyXq.yXyXyXq.yXyXyXq.4Xw.w.yX*.*.*.0.0.4X0.0.0.0.0.' 0.0.0.0.0.0.0.0.' eXeX*.7.*.*.7.0.7.0.0.0.7.0.8.8.e.8./ ' ^ ' ^ / ^ ' / ^ ^ ] / ^ / ^ / / / ^ ^ / ~ ~ 6.*.~ ` 6.` 6.6.` ` ` ,./ ;.W Q W W W W 2./ W ;.Q Q W W j j j j j b k j Q Q h j c v v v p M p M c M p p .j k k p r .p j c c k p k p c b b ( b b f b b b b b j b c c b m c b b M c m c b b m m c m b M m m b m m m m ) m m ) b ) j Q j 2. . .4.n M m m 2.<.1.,.,.:.;.<.:.:.$.$.#.$.{ $.#.{ ..} X.{ { { ..| #.{ #.> W ( h > D D ;.W D #.D Z D #.@.Z #.#.@.#.@.{ @.#.#.{ @.> Z } , , Z , - , , , , , > , { > > r { > @.Z > } @.Z } Z @.@.@.@.} Z @.@.@.@.Z } Z Z Z , Z Z Z - Z - L r.ZX+.+.t.Z.D.G.L > D Z D Z D D D Z D @.Z D D Z D Z Z Z Z Z Z Z Z Z #.#.:.:.;.h | | > / %X$XvX%Xh ;.@.$.*.$.$.$.3.$.3.3.3.3.$.3.p.3.p.3.3.p.3.5.3.r.r.5.3.3.3.3.3.5.3.r.p.3.p.p.p.p.p.5.p.y.y.y.y.3.3.y.y.y.$.y.-.y.-.p.t.S.t.t.t.i.p.i.t.i.i.p.i.p.u.y.u.y.pXi.i.i.i.sXAXi.D.i.sXi.aXaXi.aXpXsXaXaXsXsXsXaXAXdXsXdXdXdXdXdXdXdXdXdXfXfX", + "7X7X).7X).XXB :X X X].B B OX7X#X).uXeXuXuXOXeXuXuX~.oXoXuXOXoX4XeXuX~.oXOXuXOXOXOXOX~.!.!.~.!.!.!.(.!.(.(.eX0.0.0.*.q.0.tX0.0.q.7.0.q.q.*.q.0.0.6.0.6.0.0.0.8.0.6.0.tXq.eXeX0.' 0.4XrX' 0.0.0.8.q.iXq.q.e.yXe.tXiXyXiXtXiXyXiXuXuXiXiXrXoXoXoXiXiXrXuXrXrXtXrXrXtXrXtXrXrXrXtXrXtXtXtXq.q.q.tXq.tXw.iXtX9.9.yXe.r.r.yXyXyXtXyXyXyXyXyXyXyXyXq.4XyXyXeXeXeX*.0.0.*.0.0.0.6.0.0.q.0.q.0.0.q.0.7.w.7.7.0.7.q.*.7.0.7.7.8.0.0.9.6.' 8.' / / / ^ ^ / ^ ^ ^ ' ^ ^ / ^ / ^ / ^ / ^ ~ 6.~ ` ` 6.~ ` 6.` ` ` 8.` ` W Q 2./ ;./ W W / ;.Q W Q W Q Q j Q j j j j b b j b h M M v v v v v M M c n p M k k p c c p . .p k k c c c s b ( b b ( b b b k b b b c b n b b M c b m c m c b m m ) m m m m m ) m [ m m m ) m m m m m n n Q 4.Q . .n M m m M n 2.2.2.<.1.2.#.#.#.#.{ $.{ $.{ } } $.{ #.{ #.{ { | { D > W h h W h D D > D D D > #.#.#.D #.#.Z #.@.{ } #.{ } @.{ } > Z , - O o O . . . O = , > , > > > > > Z } Z > Z , @.@.@.@.@.@.@.@.@.} Z @.@.Z } @.Z Z Z - , Z - - ~ G.+.Z.Z.S.F.ZXe.- - > D D D D Z D D Z D D Z Z K Z Z Z Z Z Z Z Z Z Z W ;.;.h ;.#.D > ( _ ].vX X' > > #.$.#.$.$.<.<.3.3.3.3.3.3.p.X.p.p.X.3.3.3.3.3.>.3.>.>.<.>.>.>.3.X.3.3.5.3.t.5.p.p.t.t.t.p.p.p.p.p.y.p.y.y.y.y.y.y.t.i.t.S.i.p.S.D.i.i.i.i.i.p.p.p.u.pXu.i.i.i.D.sXD.aXi.i.sXi.aXi.u.aXi.i.AXaXaXaXaXaXaXsXsXdXAXdXKXdXdXdXdXdXdXaXfX", + ").).).7XC B B .X:XY {.bX$XL.B G tXuXuXeXeXuXeXoXuXrXoX4XeXuXeXeXuXeXeXeXeXOXoXeXeXoX!.~.OX~.OXOXOX).(.!.(.eXtX0.0.tX0.0.q.0.0.q.0.7.0.q.*.q.7.*.0.0.*.6.6.0.8.0.q.rXrXrX0.' 4X' 0.eX0.0.0.0.e.0.q.e.yXe.q.iXe.tXtXtXiXyXfXuXiXtXtXiXuXtXrXrXuXuXrXrXrXe.e.tXe.tXtXrXrXq.tXrXrXtXq.iXq.q.yXtXq.iXr.tXtX9.8.1.9.q.yXtXyXyXyXyXyXyXyXyXyXtXyX4Xq.yXq.5Xq.0.tX*.tX*.*.tX0.0.0.6.0.q.0.q.7.q.7.q.w.7.7.*.q.7.7.*.*.q.8.7.6.9.8.0.8.q.8./ / ` ^ / ' ! / ! ^ / ^ ^ / / / ^ / ^ ^ / ~ ,.6.,.~ 6.` ` ,.6.~ ` ` / 8./ Q / ;.Q Q / W ;.W W ( Q ) b j j Q k b k b n j b k j c M v v v v v v c c M p n k p k k p c k k p c c c l s c l b ) b b b R b b b k b b b b n b c m M b m c m b m [ b m ) m m m m b b m ) m m m ) m b n ) n Q Q j 2.n M M m M M m M 2.2.2.2.2.>.#.$.#.$.{ #.#.#.#.} { } X.{ { { ..{ { { D h W h ( ( h j h D D D #.D { D D #.@.@.#.Z #.#.} #.@.{ } > Z , $ . . . . . . O , : , > > > > | > { { > > { { Z } @.@.@.@.Z } Z } Z @.Z Z Z Z Z Z - Z - L 5.N.N.S.G.ZXDXGX! - S Z D Z Z Z D D Z D Z Z D D Z Z Z - Z Z Z Z Z Z Z #.h ;.#.h W h > ! ].$XvX XR f > #.$.$.#.$.>.3.>.3.3.>.3.p.X.p.X.p.$.3.X.X.3.;.,.;.2.q.] e.iX` 8.2.:.>.3.3.5.p.5.p.5.p.p.t.t.t.t.t.t.+.p.+.p.p.p.t.i.t.p.i.p.p.i.t.S.p.p.t.t.5.t.r.2.y.u.i.i.aXi.aXD.aXi.aXu.u.pXu.aXaXu.aXaXaXaXD.sXsXsXsXAXsXsXsXdXsXfXdXdXfXfXfXfX", + ").7X).7XOXXXB X:XvXJXIXuX%X].U % & ; K uXuXuXeXeXOXoXeXrXeXuXeXeXeXrXuXtXtXrXtXtXtXtXeX~.oXtX4XeXq.0.tXeXeXeX0.0.0.q.tX*.q.q.7.7.0.q.0.q.7.7.q.6.6.6.0.8.7.0.8.0.rXrX' 9.q.' 0.' eX0.0.0.9.0.e.e.tXe.q.q.w.tXr.yXiXyXiXtXiXtXtXiXtXtXuXOXrXrXrXrXtXtXtXtXtXtXtXe.tXtXrXrXrXq.tXtXq.q.tXq.iXtXq.q.iXq.<.8.8.<.9.r.yXyXyXq.yXyXyXyXyXq.yXyXyX4Xq.yXq.4X4X*.tX*.tXeX0.q.*.0.0.q.7.9.9.7.7.7.w.7.9.7.7.*.0.0.q.8.7.6.0.0.8.6.8.8.8.8.' / / ` / ^ ~ ! ! ! ( ^ / / ^ / ^ ^ / ^ ^ ~ ~ 6.K 6.` ` 6.` / / 8.` / / ` ,./ ;./ W ;.W / ( k Q n ) n ) j j b n n b n b b b b v M v p p v v M M v c M c c M c c c c l s p w c c s l l c l k b b b b b b b b s b b b m b n b b m b ) m m m m m m m ) x m m m m b m ) m m m ) b b b b n Q Q j M M m m m m m g.) Q 2.Q 2.2.#.:.#.#.{ $.{ ..#.{ { { #.#.{ { { { { { h h D ( > h k h k k W D D D #.{ @.D #.#.@.#.{ { #.{ { @.> Z , - . . . & & . , : , > > > { { , , > > , , , > , , { Z } Z @.Z @.Z @.Z , Z - , Z - - ( +.Z.G.F.ZXDXGXNX- - , : D > D D Z > L D D D L D L A A L L - Z Z L Z D W #.W | D > > : _ ].vXvX].R > h j o. .>.>.>.3.>.>.5.>.5.X.p.3.3.3.X.3.X.:...8.rX%XkXbXbXcX:X:X:X>X%X1.2.X.3.3.p.3.p.5.p.t.t.t.t.5.t.5.t.p.p.p.p.t.t.t.S.S.t.S.t.i.p.t.p.t.t.r.^ P ^ u.u.u.u.i.i.u.D.i.aXi.aXu.u.u.r.aXu.u.aXi.aXsXsXsXsXsXsXsXsXAXsXsXfXKXdXaXfXaXG.", + "7X7X).).B C B vXvXbXHXKXS XvXbXUXPXKX] uX~.uXOXuXoXoXuXuXeXeXuXuXeXrXeXuXtXtXeXeXeXeXeX4XoXeX4X4XtX*.0.eXeXq.0.0.tX0.*.q.q.7.q.7.7.7.q.7.q.7.7.6.6.6.~ 6.q.8.q.0.0.q.' 0.8.q.0.' 0.0.0.q.q.q.q.yXe.r.q.iXq.r.q.iXtXtXuXiXiXyXfXrXe.rXuXrXrXrXrXtXiXq.yXtXtXe.tXtXtXrXtXe.q.0.q.q.tXtXtXtXq.tXq.yX9.8.8.8.8.9.8.q.yXyXyXyXyXyXyXyXyXyXyXtX*.*.yXyX4XyXyXq.4XyXyX*.yXq.0.8.9.7.q.q.w.w.7.q.7.7.w.7.7.*.7.7.6.8.6.8.0.6.6.8.8.8.8.0./ ' / / ~ ^ ` ^ ~ ^ / / / ^ ^ ~ ^ ^ / / / ~ W ~ *.` ~ 6.` ` 8.` 8.` 8.8.` 1.W W W / W Q Q ( ) ) b j b b n j n c b b b b b b c v p M v v v v p M p c M c c l c c l p s c l s s y l c l l l c ) b ( b b R b b b b k b b b b b b m b m m m m m m m l m m m ) [ m m m m b b b b b j ) j ) n Q n m m m M M M g.m m m 4.4.2.2.$.#.$.#.$.| u c k k | { { { { { { ..{ D h D h h h ( D W k f j k D #.D D Z @.#.@.#.#.{ #.} #.} @.{ , , . . . . . E ^ * O = , > > > > > > { > , > > { , , > > , , , Z } Z Z } , Z , Z Z - , - >.Z.F.F.ZXDXGXAXE - L : L Z Z D D L > D Z Z D D Z L E U _ A - - - L D > W h ;.> > > > E '. XbX$X%Xf r j .. .>.5.>.X.5.>.X.>.X.5.y.y.X.p.X.X.3.#.#.%XkXvXMXcXbXcXcX:X:X:X*X:X;XOX1.>.>.5.3.5.5.p.t.5.t.5.5.5.p.t.+.p.p.p.p.t.t.t.p.t.S.i.t.t.t.p.X.e._ N ^ 5.5.p.u.u.u.u.u.u.u.u.u.aXr.iX' 9.r.r.u.aXaXi.aXaXsXsXi.sXsXAXsXsXsXfXdXdXfXD.S.S.", + ").).).uXOXXXB bXJXHXbXcX X XvX%XR * UX] uXeXuXuXeXuXeXuXeXuXeXrXeXtXuXrXeXeX0.eXq.0.tXq.eXeXeX0.q.eXtX4X0.eXeXeX0.0.0.q.w.q.7.w.7.7.0.w.7.q.7.q.6.6.6.6.6.9.8.8.8.9.0.9.9.8.9.9.rX0.0.e.q.9.e.e.e.yXtXiXq.e.tXe.w.iXiXyXtXtXuXiXe.rXrXiXuXrXiXq.tXtXiXyXe.e.tXtXq.iXtXrX0.0.q.q.q.q.iXq.yXe.tXq.9.9.8.<.<.8.,.9.q.yXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXw.w.4XyX0.tXyXtXyXq.7.9.7.7.w.7.9.7.q.w.9.7.7.w.7.7.8.6.7.7.0.7.6.6.8.8.8.` 8.9./ ^ / ` ! / ^ ~ ^ / Q / ( / / / ^ / ^ / ^ / ~ ~ ~ ` 6.` 8./ / / / / / / Q Q Q 1.Q 2./ Q j b n b b ) b ) m n n c b c b b b c v u g.v v v v v v v v v c v v p v c c s c s c c l s c l v c l l l b b b ( b k b ) s b b M c b b M b b m ) x b m m m [ b m b m m b ) m ) m ) m m b b b b n n Q j m M M M ) m M g.m g.M Q ;.;.:.#.{ #.#.h u p y u y p p p .r { r ..h D h W D h h h ( h k ( j k h D #.#.#.Z Z #.#.{ #.#.{ @.{ @., - . . . & & . $ , , > > > > > r > > , , > > r > , r , , Z - Z - Z - - Z - , - Z - C.F.ZXZXZXGXGX/ - - - , > : : Z > Z D Z D D L > D L > U U U _ L - L > > > > D h > h > _ ].1XbX].I f r r r o.>.4.>.>.>.>.>.>.3.3.X.X.3.X.3.3.X.{ / 1XvXcXcXMXcXcXcX:X:X:X:X;X;X;X+X:.>.X.3.3.5.3.5.5.5.5.5.+.X.+.p.p.p.p.t.t.i.t.i.t.p.p.t.t.+.5.' XXL.S 2.>.5.r.5.y.r.u.u.r.u.u.r.r.u.e._ S e.r.r.aXu.aXaXD.i.D.D.D.sXsXsXAXfXsXfXAXAXF.F.G.", + ").uXOX#XB B B vXbXbXbXcX X|.kXHXHXCXUX] OXuXuXeXuXeXeXuXuXeXuXeXrXeXeXeXeXeXeXq.eX0.rXq.q.eX4XtXtX0.0.tX4XeXeXtXeX0.0.q.w.q.q.w.7.w.q.7.7.7.6.7.7.,.6.,.6.6.8.7.,.9.q.9.9.q.9.9.9.q.q.rX9.9.9.9.9.9.q.e.q.e.iXq.q.r.tXtXtXiXq.r.q.rXe.rXtXq.e.tXiXq.yXiXq.iXtXq.tXtXtXq.q.0.q.rXq.rXq.tXtXq.e.7.7.1.8.,.9.8.8.<.q.5XyXyXyXyXyXyXyXyX4Xw.yX4XyXq.4Xw.yX4XyXyXyXyXyXyXq.7.q.q.9.w.q.w.9.9.9.w.9.7.7.1.1.9.8.6.6.8.8.7.6.8.8.8.` 8.8./ ^ / ^ / / ~ / ^ ^ Q / ^ / ^ ( / ^ / ^ ~ ~ ~ ~ / ~ ~ ` / 8./ 8./ / W W ;.W 2./ W Q 2.Q n n b b b ) b m m n b b m c b b c m z z g.v v v v v p v v M c v p l c c l l l l c c l l l z l l c l c b b ( b ( b b ( b b b b b b b b b b m b m m l m ) b b x ) m m m m m ) b ) m b b b b ) b n ) Q M m M m m m M g.v g.g.m ;.Q ;.$.} { $.k u u i p y p y i y p y p w k k f h h D W ( h W k h h k k k h D @.#.@.{ #.#.{ #.} { #.> , $ . . . . . O - = > > > > > r > > > > , > > , > , > , : - - - - - - , - - - - - 4.G.AXAXGXGX/ $ $ - , - : - L : L Z S D D Z Z L Z : - U V '.U U L : : > > s > r h , ( ]. XvXvX]._ s r r .X.>.>.>.>.>.X.>.3.3.X.5.3.3.X.3.:.:.;.#XcXcXcXcXbXcXcX:X:X:X:X*X:X*X*X{.W W ;.;...>.>.5.5.5.O.5.o.5.5.X.5.5.t.p.p.t.t.t.i.Z.t.p.5.5.oX/.L.N ( h 2. .3.>.>.5.w.5.r.r.u.r.3.>.r.OXC S e.r.u.aXi.i.D.D.i.D.AXi.sXZXi.dXdXD.F.F.F.D.F.", + "7X@XuXrXC B B ].1XvX1X X.X|.kXKXUXIXUX] uXuXuXuX@X7XuXrXoXuXuXeXtXeXeXeXeXeXeXq.0.rX0.eXeXtXeXeX*.0.4X*.q.eX0.eXyX0.q.w.7.7.7.7.7.7.7.7.7.7.7.6.6.6.,.6.6.7.8.8.6.9.7.9.9.9.9.9.9.9.e.q.9.9.>.9.9.9.r.9.r.q.q.r.e.q.iXiXyXq.w.q.q.e.e.tXiXq.tXr.q.tXtXe.tXq.tXtXe.tXq.q.q.0.q.' 0.q.q.iXtXq.q.9.8.,.9.8.,.,.9.8.7.q.yXyXyXyXyXyXyXyXyXyXyXyXyX5XtXyXyXyXq.yXyXyXyX0.w.7.7.7.9.q.9.w.w.q.q.7.9.8.1.9.1.1.7.8.7.e.7.8.8.8.] 8.8.8.8./ ^ ^ ^ ^ ~ ( / ^ ^ ^ ( / ( Q / ^ / ^ ^ ^ ~ ~ ,.` 6./ / / / ` / ~ Q ;.Q Q Q / 2.Q Q n n Q m m n m b b m ) m b c m m c b v v v z f.f.v v v v v p v c v v v v v z v v v c l l c l c l c l l z l l b b ) b b b b b b k b b b b c b b b m ) x m ) m m m [ l m b m b b m ) c b n b ) n j b j b Q m m M M v g.g.g.g.g.g.M M .Q #.#.#.{ p u i p i p y p p y i p p w s s c k k s k k f k ( ( k j ( k k f > #.#.#.#.#.{ #.#.#.} Z , O . . . . . . = : > , > > > > > > r > > > r , , , , = - - - : ( f S : - - - - - > VXGXGXKX' - & ; E : E D : : - : - > Z S : D Z D L : : U Y U U _ _ : : > > > > , s _ ]. XbX1X].R = r 2. .4. .>.>.>.>.>.X.>.X.3.3.X.3.3.:.:.| > %XvXvXbXMXMXcXvXcX:X:X*X:X*X[.*XE.f ] l.) Q | | :...X.o.o.X.o.X.o.5.5.5.5.t.t.t.S.t.t.t.5.5.] }.&XL.C S W 1./ A S S ( / 2.9.>.3.>.>.3.9.] V * ! 9.t.u.G.D.i.D.D.i.aXAXi.sXD.D.ZXD.D.D.D.F.S.", + "#XuXOX@XC B B B B B B C B _ NXCXCXCXS ' uXuXuXuXuXuXuXuXuXeX*.' 0.eX0.eXeXeXq.eX0.eXeXq.0.q.rX*.0.4X*.tX*.tXeXq.eX0.9.7.7.q.7.q.q.7.7.7.7.6.7.6.6.,.6.,.6.7.8.7.8.8.9.9.9.8.9.9.9.9.9.e.9.9.9.9.9.9.9.9.9.e.9.e.q.e.r.q.r.q.r.q.q.r.q.iXr.iXr.q.r.iXq.tXiXtXq.iXrXtXrXq.' rX0.0.0.0.q.tXtX9.8.<.8.,.,.9.9.8.8.9.9.8.7.9.q.yXyXyXyXyXyXyXyX4Xq.yXyXyXyX5X5Xq.yXw.yXq.w.q.w.q.7.w.w.9.9.9.9.1.1.1.<.8.8.8.1.8.8.1.1.8.8.8.8.8.8.8.8./ ) ^ ^ ^ / ^ Q / ( ~ / / / / / / ^ / / / ~ / / / / ` / 8./ / W Q W Q Q W Q W W Q n .n 4.n b m b m m b m ) M b c v b v v v v g.g.z g.g.p v v v c c v v v v v p v l c l l p l l c l l c l l l l l s ) b b b b b b b b b b b l b x b b b b x x m b b m b [ m m m b ) l l ) ) n j n b Q b Q n n m m g.g.m g.g.g.g.M v M n Q #.#.$.} u i u i p i u i i p p p p p p s b s s s g k k b k k ( h h k k h > { } > { { #.@.#.} { @., O . X O . X & & & . . $ : , : r > r > > , f > , , = : , , , = : S ( ( D ~ D W ( D - - $ $ NXGXe.( T ( / ;.#.{ > h W ! : - - D - Z : L > L - : : U V U U ].I R d : = : , > = _ ].vXbX$X].( r j ;. . .o.>.:.>.>.>.:.3.X.3.X.:.:.>.:.:.;.W 1XvXcXcXmXcXcXcX:X:X:X:X:X;X*X[.F > [ j.j.[ / W k h k j j Q j .4.k.l.e.X.p.t.t.p.p.t.t.5.>.+X*XU.V C - E V L.L.B N * * & : Q <.2.2.>.;.' Q.* & 1.r.u.G.i.D.i.D.sXD.i.i.D.D.F.D.D.D.F.D.G.S.", + "uXOX#XOXB B _..X[.`.B V uXS ; % % : oXuXuXOXuX@XuXoXeX~.K ' *.eXeXeXeXeXeX0.eXeXrX0.eXtXeXq.eX0.0.0.tX0.4X0.eXeXeXw.7.w.7.7.7.7.7.7.q.7.7.7.7.7.7.7.6.6.6.6.,.8.7.8.9.q.9.q.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.q.r.9.e.tXr.q.q.r.q.9.q.yXe.tXiXiXq.q.tXq.q.tXq.q.q.q.q.q.' q.0.8.rXq.q.q.9.,.8.,.9.8.7.1.7.7.9.9.7.9.9.7.9.9.w.q.yX5Xq.yXyXyXyXyXyXyXyXyXyXyX4X4Xw.4Xw.9.9.9.q.q.9.<.1.2.1.1.1.) 1.1.1./ 1.1.8.e./ 7.8.8.1.8.8.q.1.^ ^ Q ^ ^ ( Q ( / Q / / ( / ( / / / ^ ^ / ,.8.8.` / ` / / j Q j j Q j Q Q Q Q n n 2.n j n ) ) n ) b ) ) m ) m c b m v z m z z f.z f.g.g.v u z c v y y l y p l u u v l u z l l l l c l l l l c l l b R b b ( b ( b b b b l b b l l b b m ) m m b m m m m b m b [ b b l b b n ) n n j ) n n n M g.g.v g.g.g.m g.g.p p M j | #.{ { u u u p y i y i y i y y w p y s g l s k b k k s k ( k h j ( k f > > { #.{ Z > { #.#.} , Z . . NXCX5 . X NXVXKXS . . . = = : > > , > r > r > > r > > , , = = : W | >.G.AXAXAXG.5.{ > ( : : S ! ^ 1.2.5.t.G.AXAXF.t.5.{ | ~ : - - > L > L > D ; - % P V Y U ].$X_ f : = : = = [ XvXbX XXXf k h .X.2.:. .:.>...>.X.3.:.>.3.:.3.:.:.{ > ~ :XcXvXcXmXbXcX:X:X:X*X:X*X*X*X;XA S j.6 j.j.j.l.l.) ) ) ] k.l.l.x.c.j.1.5.p.p.t.t.p.t.t.3.6.}.*XY.C V V B U.B B C * N C * * O - W W W ~ _ L.C X f 3.r.i.i.D.D.aXD.D.sXD.D.F.D.D.D.F.D.F.D.D.", + "OX@XuXuXC B _. X X].K.B ).7X7XuXuXuXuXtX7XuXuXuXOX4X4X~.*.' K 0.0.eXeX~.OX0.eX0.q.eXeXq.tX0.q.tX0.eXeX*.4Xq.*.eXq.7.w.7.7.7.7.w.7.7.7.7.7.6.7.7.8.,.6.6.6.8.6.7.8.8.9.9.q.9.9.9.9.9.9.9.9.9.9.9.e.9.9.9.9.9.9.e.9.9.9.e.9.9.r.r.q.q.r.q.q.iXiXw.e.yXr.iXq.q.q.0.e.rX0.0.q.' 0.rXrXq.rX0.8.1.9.1.8.8.<.8.9.,.9.1.9.8.9.7.w.9.9.q.*.6.*.0.q.4XyXyXyXyXyXyXyXyX4XyXyXyXq.w.8.1.] 1./ 2.Q ) / 1.) 1.1./ 1.1.] 1.1.8.1.Q 1.9.8.8.8.8.8./ ^ ^ Q ^ ^ Q Q ( Q / ( ( / / / ^ / ( / / / ` ` ` ` ` / Q j Q j Q ) j j Q Q Q n o.j Q n n n m b ) m m m ) m m m m b l v v v v f.g.g.u d.v g.u z p z c l u z l z l u l l l z l l l l c c l c m l l z c ) b ( b b b b b b b s b g b b b ) x b b l m ) g.m [ b ) m m l b s ) b b j j ) b n n j c g.g.g.g.g.g.g.g.g.p p v c M h #.{ ..i u y u i i i y y p i y i y y l s s g b k f g f k h h k h k k f > > > { { { { > } > > > Z o N KXVXVX. . ] IXNXVXKX. O , , : , > > r > , : r : , , = = ; / h G.GXLXIXIXIXIXLXIXGXG.{ > W W .5.G.GXLXLXLXFXFXFXDXDXF.n.X.:.: - - D Z D L D : : ; N N C Y '.].kX] & = ; = = P XbXbX+XI a r h | .. . . . .2.>.:.:.>.:.:.:.:.3.X.;.#.h %X:XvXcXMXMXcXcXcX:X:X:X:X;X*X*X{.: [ j.j.j.j.j.x.x.x.x.lXlXzXx.x.x.v.l.;.X.5.t.t.t.t.t.t.>.' ;X&XK.L.U.U.I.&XY.&XU.C C C C C X X % ! R V {.L.* . ; 1.u.u.D.i.D.D.sXD.D.S.D.F.S.F.AXD.D.F.F.D.", + "uXuXuXOXuXOX@XuX@XuX~.~.~.7XuX4X7XuXuXtXuXuXuX4XuXeXK eX~.4X*.0.0.0.OXW.W.OXeXeX0.eX0.eX0.eXeX0.eX*.eXyXeXtXeXq.9.w.w.9.7.w.7.9.7.w.q.7.7.7.8.7.7.<.,.,.,.6.,.6.1.9.8.8.9.8.9.8.9.9.1.9.1.9.e.r.9.9.9.r.9.9.r.4.9.e.r.9.9.<.9.q.q.r.q.r.q.r.q.iXiXe.tXq.q.q.q.0.0.q.q.rXq.0.0.q.q.0.8.8.,.8.8.,.,.9.,.9.8.7.9.7.7.9.9.9.9.9.9.7.,.*.7.6.*.7.0.w.4XyXyXyXyXyXyXyXyX) ) ) ) ] ) 4.1.Q 2.1.1.1.1.1.1.1.1.] 1.8.8.) n n n 8.8.7.8.8.8.1.Q ^ ) ( ( Q j h Q ^ / / W / / / ~ ^ / / / 8.` ` / Q j n n Q j Q Q ( Q Q ) n n ) ) n ) n n n m m m m m m m ) ) b l y g.f.v v u u f.f.v g.g.u v u z u p z p u p z u v u l p z v z l l l l l l l b l b l ( b b ( b ( b b b l b b l x b b b m m v x x m m m b m ) b b s c b b Q b n j Q M v v g.f.v f.m f.m m g.g.g.g.p p u p { } .i u i i i i i i i i i y i i u s l s s b g b b k k ( W j k f k h k > h #.{ { { { > r e e , o ] % R VX* X NXCXX [ KX& O = : > , , > : > > > : , = - = : h <.DXLXIXIXIXIXIXIXIXIXIXIXLXZXG.G.AXLXIXLXLXLXLXLXLXFXFXFXDXDXZ.O.9.: : L : L L - : - - : N N C U '.$XHX_ = T E a U XbXvX X[ = r r 2.2. . .2. .;...:.:.3.:.:.:.:.:.#.;.> D $XvXcXvXMXcXvXvX:X:X:X*X*X*X[.;XI ; [ Y j.j.j.j.c.x.x.lXlXlXlXx.x.x.c.[ h X.X.5.t.t.t.t.+.5.' =X&XY./.$X$XI.&X{.U.I.L.C C C C C C V {.I.&X&XV * X % 1.5.D.i.D.sXi.D.D.D.D.S.D.D.S.D.D.D.ZXD.G.", + "OXuXuXuXuXuXuX7X7XK Q.~.~.~.uX7XuX4XtXuXuXuXeXuXuX4XK 4X~.4XeX~.eX4XW.W.W.W.OXeXeX0.eXeXeX0.eX0.4X' eX*.tX*.q.9.9.w.9.w.7.9.7.7.q.7.7.7.7.7.7.7.7.8.<.6.7.8.8.,.8.7.9.9.e.9.8.9.9.9.9.1.9.9.9.9.9.9.e.9.9.e.e.r.e.9.9.<.<.<.,.<.w.9.r.q.w.q.e.r.w.q.e.' 8.q.q.0.0.q.q.q.rXq.' rXrXq.` 8.8.8.,.8.8.,.8.9.,.9.9.9.9.7.9.7.w.9.9.,.6.6.6.*.7.*.*.q.*.w.yX4XyXyXyXw.q./ / ] ] ) ] Q 2.4.1.1.1.1.1./ ] 1.1.1./ 1.) o. .n n 2.8.8.8.` 8./ / ^ ( ) ( h Q k j ^ Q / / ^ / ( ^ ~ ^ / ~ ` ` / j j j n k j Q Q n Q Q b n ) n ) M n n M n m m m m [ m m m m m m t l y f.z f.g.f.u g.g.d.p u z p z p z u u p p l l p p z p z z z l l l l l l l m l l l b ) b b b b b b b b b b b b l l b b v z z m m m m b [ b b g b s b n b b n l l f.g.g.f.v g.g.g.g.v g.g.g.p p u f.u u | { p i i i d.d.d.i i i i i y y i t l l g b g s b g k k ( ( h k k h f h k g { { { > h w y w e 0 o ) % X [ Y C l.%X. . KXP O = = = > k , k = r , = , , = : Q :.GXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXLXLXLXIXLXLXFXFXFXFXFXDXDXF.+.5.( L : > L Z > : : - ; ; N N Y V ].bXHX% E _ 4 U XbXvX].R = r r k . . . . . .:.#.:...#.:.:.:.:.| #.h ' vX:XcXcXMXMXcXcXcX:X:X*X:X*X*X&XN a j.j.Y j.j.x.x.x.x.lXlXzXx.x.x.j.j.) r X.5.5.t.t.5.t.X.X.) {.Y.}.HXUXkX'.vXJXbXL.&XK.B J.B C B &X*X&X&XL.C X X ; 5.t.Z.D.i.D.D.D.D.D.F.D.D.S.D.F.D.D.D.F.S.", + "uXuX@XuXuXuXuX(.~., r , r r r 4X= O uX7X7XuXuXuXuX~.~.4XK eX~.4XK W.+XW.W.W.!.OXeX0.0.q.q.eXeX~.oXeXeXeX*.eXw.w.3.7.w.7.7.9.w.7.w.7.q.7.7.8.7.<.7.7.6.,.6.,.6.,.6.8.1.9.8.8.9.9.e.9.9.9.9.9.9.9.9.e.9.9.9.9.9.9.9.<.,.<.9.<.7.<.<.9.7.7.q.e.q.q.q.e.q.8.8.` 8.e.q.0.rX0.rX0.q.0.' 8.8.1.8.,.8.,.,.8.8.,.9.9.<.7.9.9.9.9.9.9.7.*.*.6.6.! *.0.7.*.q.*.w.w.q.5X4XyXq.8.] ) 1.] ) / Q 2.Q 1.) 1.1.1.1.1.1./ 1.Q 2.Q n .n n ) 8.8.8.8.` Q Q Q ( j j k Q h Q ( / ( / / / ( ^ ^ / / ~ Q c k j k n n b b n b Q j b n n M M n n ) M n n m m m m m m m ) m x s y y y u f.g.u f.v u g.p u z z u u v l v u z u l z l u z l y p l l l l m l l l l l l l l ) b ( b R b b g b b l b c b x z v m z z z b m b b l q x x l x t q t y f.g.g.p f.g.g.f.v f.g.g.m g.p g.d.g.d.u u k { y i d.d.d.d.d.i i i i i i i i t l g b g g b f l s k g g k ( j f h f f s > { > f w p y w e e + R kX* jXxXxXjXjX* U KXO . . O = = > = = > , > : s , = = ; Q { GXLXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXLXIXIXLXLXLXLXLXFXFXFXFXDXDXDXG.Z.e.- - : - : L - : : ; - ; S % C Y U %XbX_ N N V U U %XvX]._ a = r r . . .;.| .| :.:.:.:.:.:.;.:.#.| h OX:XcXvXMXcXcXcX:X:X:X:X:X;X;X;XU.: P Y j.j.j.j.x.c.x.x.x.lXzXzXx.x.x.j.b .X.5.5.5.5.5.5.5...2.L.J.bXJXJX}.vXJXJXJX%XU.&XK.B J.Y.C Y.&XY.B C O X * ( 5.u.t.D.D.D.D.D.D.S.D.S.F.F.S.S.D.D.S.S.S.", + "OX@XuXuXrX7X!.r = O.N.H.h.N.O.= q e O tX7XuX7XuXuX4X~.~.4X*.~.4XW.W.W.(.W.W.W.E.OX0.eXeXoXoX~.eXoXK ' 4XeXeX7.w.9.w.w.9.w.7.7.w.7.7.w.9.7.7.7.7.8.7.6.<.<.6.6.8.<.,.8.9.9.8.9.8.9.9.8.9.>.e.9.e.r.e.9.r.e.9.9.1.1.7.<.9.<.<.<.9.8.<.<.<.7.q.9.q.q.9.' q.8.q.8.8.q.0.0.q.' rX0.0.` 8.7.1.8.,.8.,.8.1.8.8.8.8.7.9.9.q.w.9.9.w.6.,.,.` ! ' ! *.0.q.*.*.7.q.q.=.yXtXq.8.) ] ] ) 1.] / 2.2./ 1.Q 1.1.1.1.1.) 2.Q o.Q Q n n n j 1.8.8.9./ Q ( ^ j Q k Q h Q j ( ^ ^ Q Q ^ ^ Q ^ / Q j k k k k k b n n b n n b b b k n n ) M M n M n m b m m m m ) m ) z l y s y x y z d.z z u u u u g.u p g.u u u p p z u l u p u y l y c l l l c l c c l l l l l l b b b ) b b ) b s b k l b l i y v m z z v x b m ) g g x l s t y l i d.g.g.d.g.d.g.v u g.f.g.v g.v u g.d.g.u u p c c d.d.d.d.d.d.d.d.d.2 d.i i i y u l b g g b g b b g f g b g g ( ( k k f k g s s p p p y w w e o . kXcXxXxXnXmXmXmXcXjX. . . o O = a > > : > e : = = = = W #.G.LXIXIXIXIXIXIXIXIXIXIXLXLXLXIXLXLXLXLXLXLXFXLXFXFXFXDXFXDXDXDXF.G.AX] $ : : = : a : > : : : : & P & C Y `.U N V U ].].$XkX].$X_ ; r r k r h | j h .| | :.;.:.:.;.:.{ h r k %XcXvXcXMXmXcXcX:X:X*X*X:X*X;X*XV & [ 6 j.j.j.jXc.x.x.lXlXlXlXx.x.l.c.l.h . .5.5.5.+.5.5.O.X.Q V +XJXJXJX{.HXJXJXJXCXP.*XY.B C J.C C B C * * O X % Q 5.Z.i.D.D.D.D.D.D.S.F.D.F.S.G.F.S.F.S.S.S.", + "OXOX@XuX#X~.r v H.m.B.M.m...r f.= z.s.O uXuXuX7XuXeXK 4X~.~.~.W.W.W.W.W.W.!.W.W.W.!.oXK K *.eX~.4XeXeXeX0.eX4X0.w.3.9.3.3.9.9.7.7.7.7.7.9.7.7.7.7.6.,.8.8.6.<.6.8.6.8.9.8.e.9.e.9.9.e.1.e.9.9.9.9.9.9.e.9.9.9.<.<.<.7.<.9.,.<.7.<.<.8.<.8.e.q.q.q.e.q.8.] 6.' 8.8.8.0.0.0.q.0.` 8.,.8.8.,.8.,.8.8.6.,.8.,.8.8.9.9.9.9.9.9.9.0.` ~ ! ! ! ' ' 7.*.7.0.*.*.*.q.yX=.=.q.e./ 1.] / ) ) 2.2.2.1.1.1.) 1.Q 2.Q n Q Q Q Q o.4.j .n ,.8.8./ ( j j ( k Q k j j ( j ( ^ ^ ^ ^ ^ ^ ^ j c k c c k p c k k j b Q j n b b b b m n n ) M ) M ) m ) ) b m m m l x t l t l t l y u z f.g.g.u v u u u u u u u v u z p u z u l p z y c l l l l l z l x m l l l z l R b b ( b g b b b b b l y y i u x z m l z m m c t x l x t t i u g.u g.i d.g.g.g.g.g.g.v g.g.g.f.f.d.g.d.u i y c p d.d.d.d.d.d.d.d.a.d.d.f.i t i i y s s b g g g l g f b g s x g g g x s g s s y p y y p w w 0 + C jXxXxXxXmXmXnXnXnXxX* o = : , = = r > = 0 = r = : ,.X.FXLXIXIXIXIXIXIXLXIXLXIXLXLXLXLXLXLXLXLXLXLXFXFXFXFXFXDXZXDXDXZXF.GXVX^ = ; : ; > : : a a g 0 < @ 5 % & N N U Y ].].]. X$XbX%X].R = = = r r r | | | .h | ;.| #.{ | { ..| > h 1X:XcXMXcXbXcX:X:X:X:X:X*X:X*X&XP % j.[ j.j.j.c.x.x.x.lXlXlXzXx.x.x.j.[ j .o.X.X.X.X.5.5.X. .j XXkXHXJXbX$XJXJXJXJXHXL.&XY.Y.Y.C C C * * X X X & 2.5.5.C.G.Z.A.S.D.A.S.G.G.S.S.G.F.D.D.S.S.F.S.", + "OXOX#X7X~.r n IXm.B.B.v.+.r z.e z.z.z.O 8XuX7X4X~.~.*.~.~.~.~.W.W.!.W.W.W.OXW.OX!.!.!.oX4XoXoXoXoXeXeX0.4X' 0.eX4Xq.9.w.9.7.w.7.7.7.7.7.7.7.7.7.7.6.7.8.<.8.,.8.6.,.6.8.8.q.9.8.9.9.9.9.9.9.e.9.9.9.e.9.<.<.<.<.<.9.7.<.<.9.,.<.,.7.7.8.9.q.e.9.q.9.8.8.8.8.8.8.q.8.8.' ' 0.` ,.,.8.,.8.8.~ 6.6.1.,.8.8.8.8.8.8.8.9.q.r.9.8.` ` ! ! ! ' ' ! *.7.*.7.q.*.6.*.*.w.w.q.) 8.) / ) / ) / Q 1.2./ 1.1./ Q Q Q Q j ) o.Q n n j n n Q 8.8.8.Q ( ( b b k ( k Q k k j Q ^ ^ ( ^ ( k k c k j k k k k s k j n b b b b b b b b n n n ) M ) n m m m m m ) b l l y y t x y y x l t u u g.u v u g.p v u g.u u u u y v p u l u y c y l s s s l l l z l l l l l y u b ) b b ( b b b c p i t y i y z z z z z z b t s l z l i u u f.g.i u g.v u g.g.f.v g.g.g.M g.d.g.d.d.p u t t t 2 d.d.d.d.d.d.d.d.d.d.i d.u i u u l s g s b b g g s g f b g l b l g s x l l y p y y c y i < < + C jXxXnXxXmXnXnXcXcXcX* . . . O = = , r = e 0 0 = = = Q > G.FXLXIXIXIXIXIXLXLXLXLXLXLXLXLXLXLXFXLXFXLXFXFXFXFXFXDXDXDXDXZXZXDXGX] ; & ; : a a a a a a a a < < @ % * N U Y ].].]. X X X X X X_ = r = r r r k j h h j h #.h | | | ..| h h ] :XvXcXcXMXcXbXcX:X:X:X*X:X*X;XU.4 P Y j.6 j.j.x.c.x.lXlXlXzXlXx.x.x.j.) k ..o.5.5.o.5.5.O.o. .k XXCXR kX+X%XkXJXJXJXHXY.*X&XB C C * * X X X X & Q 5.5.t.Z.G.Z.D.Z.A.A.A.Z.A.A.Z.Z.A.S.A.G.G.S.S.", + "+XOXOX!.~.r SXh.B.B.B.m.+.r z.s.z.z.a.O 4X' ~.K K ~.~.K ~.!.W.W.W.W.W.!.!.E.!.!.OXE.!.E.~.eX*.oXoXK 4XeXeXeXeXeX0.0.q.w.w.7.9.3.w.7.7.7.7.7.7.7.<.<.7.,.8.6.7.6.6.6.8.' 9.8.e.9.9.9.e.9.9.9.9.9.e.9.>.7.9.9.<.9.7.7.,.7.7.<.,.8.,.9.8.9.8.9.q.9.9.9.q.8.q.8.0.8.' 6.8.8.' 8.` 8.7.1.8.,.8.8.8./ 6.6./ 8.<.,.8.8.8.8.9.9.8.` ' / ' ' ! ! ! ! 6.0.7.0.*.7.6.*.0.K *.*.] ) ^ ] / ) / ) 2.Q 1.1./ 4.Q 4.Q 4.2.4.Q Q .n 2.j n .n 4.8.` b ( n ( ( b ) k k j ( j j ( ^ ^ k b b k k c k p c k c k c j b n b b m b b j n m ) m M ) m m ) ) m ) ) ) t t t l t l y y u y y u y u u u f.v d.u u g.p u u g.z u y u u u p u y y y l l l y s l l l l l l y y y u k b ( b b b c u i w y y y y y z z x z z l l q x u y u u f.u d.g.u d.u g.i u v f.g.v g.g.u g.d.g.d.i t 5 x t 2 d.d.d.d.2 a.d.f.d.i d.i d.u i i u s b b f s k b s f b f g g g g x s s s y y l t y w y w e e + . `.jXxXxXjXxXjXcXjXkXX . E & O = = = a = 0 0 0 = @ = 1.{ ZXLXIXIXIXIXLXIXLXLXLXLXLXLXLXLXFXLXLXFXFXFXFXFXDXFXDXDXDXDXZXF.DXKXV.< @ ; ; ; a ; a a a a 0 a a < @ d 4 V '.]. X$X XvXvX X XvX X%Xa = = r e r r : h h h h h ;.h h h h r h k @X:XcXvXvX1X%X+X%X$X$X:X:X:X*X&XL.& [ j.[ j.j.j.j.lXx.lXlXlXlXlXx.c.v.l.k k o.X.o.X.X.X.O.X.X.j ^ '.P * %XC %X4 kXJXJXCXV *XY.Y.J.C X . X X * : Q 4.5.Z.t.Z.Z.S.Z.A.Z.A.Z.A.Z.A.A.A.A.A.A.S.S.A.G.", + "!.~.~.~.r O.h.B.B.H.B.B.N.{ z.z.z.z.O # H H K H H K H ~.~.W.W.W.W.!.W.W.W.OXE.!.!.~.E.OX~.OXK eX4X0.oXoXeX~.eXeXeX0.eXeX7.w.7.7.9.7.7.7.7.7.7.9.7.,.<.8.8.,.6.6.6.6.6.' 8.9.e.9.9.e.e.9.1.9.e.9.9.6.6.6.<.7.9.7.8.7.<.,.,.6.6.,.7.<.,.9.0.9.8.q.q.8.8.8.' 8.8.' ' 8.6.` ` ` 8.,.8.,.8.8.6.,.8.,.8.~ ~ 6.6.8.8.8.e.8.` / / ` ! K ! ! ! ! ' ! ! *.0.*.7.*.6.*.6.6.` ` / ) / ) ) / ) / 1.2.Q 1.2.Q Q Q n ) Q 4.n Q 4.j j 4.Q j .M 1./ j Q ( b ( ( ( b b ( b j k ( ( b j k k c k M c p k c c k p c c b b b b b b b n ) b n m ) ) m m ) m ) m x l y l t l y x y y x u x x y u z v f.g.u u g.u u u p p u u u u u y l y p l l l l l q l x l z l u y u y y c b b b R l i i p i i w y i y y z z u l u q y u y p i u d.v d.p g.u u d.u u v g.g.g.f.v d.d.g.d.t t g t t t d.d.d.d.d.d.d.d.i d.i f.i i f.i i u x s g ( l g s g ( f g g g g s g t s x 2 x 2 2 y w i w q 1 + o CX.XjXcXcXjXcXjXHXKXP T ] . . = = = = 0 0 0 = = @ a ;.X.DXLXLXIXLXLXLXLXLXLXLXLXLXLXFXLXFXFXFXFXFXFXDXDXFXZXZXDXDXF.F.F.DXNX; @ @ ; f a ; a a a g a a g a < < @ T U ].]. X X:XvXvXvXvX1X1X XE = = e , e r 0 k h h h h h k h k > k k > %X1X%X_ % @ & # @ & & 3 I X;X&X_ ; [ j.6 j.j.j.x.x.x.lXlXlXlXlXx.j.j.[ f p ..o.X.o.X. .O.O.| h _ C X . N * & * U JXJXbXL.&X&XY.C C X X o X ( 4.4.5.Z.Z.G.t.G.A.G.A.A.Z.Z.A.Z.A.A.A.A.A.Z.A.G.F.S.", + "!.7XT.Q., O.m.m.B.M.B.IXH.O.z.z.s.s.O O H L H Z K H K ~.Q.!.W.W.W.W.!.W.W.E.!.OX!.!.!.!.!.!.OX4XoX~.oXoXeXeXeXeXeXeX0.4X4Xq.7.w.9.w.9.7.7.7.7.<.7.7.7.6.7.6.6.` 6.6.6.0.' q.q.9.9.9.9.9.9.e.9.6.0.6.0.6.6.` 6.7.<.7.,.~ ~ 6.1.6.7.9.9.q.q.9.0.e.8.8.q.8.9.8.8.q.8.8.' 8.` ,.6.8.,.8.8.,.6.8.~ 8.,.8.8.8.8.8.6.8.8.` ` ` ' ` ~ ' ! ' ! ' ! _ ! ` 6.6.0.*.*.6.*.` ~ ! ! ^ ^ / ^ ^ / ) ) 1.1.Q Q Q 4. .2.Q Q Q Q Q Q Q Q n n o.n .) 1.b ( b ( j b b ( k b ( b j b k b b k k k p k j k j c k c j c c b ) m n ) m b m b m ) n m m m ) m ) ) l y t s y l t y l u y u y u u i u u u u g.u u u d.u u u u u u p u p y y y y y l y l s l s g l l l y y y y y u c b b c y p y w w w y y w y i y z x u u y y p i i y i u d.i g.d.g.g.g.u g.u u z g.g.g.u f.u y t t x t t x d.d.d.d.d.d.d.d.d.i d.d.d.u u i u u z l l g g b b g g g f s g g x x x x t x t 4 2 w i q q 1 < o X VXVX X.X.X.XkXVXUXIXVX. . X O # = 0 0 0 = 0 @ @ k | 5.FXLXLXLXLXLXLXLXFXLXFXLXFXFXFXFXFXFXFXDXFXDXFXDXDXDXDXZXF.G.F.ZXGXR & & @ @ = ; ; a ; ; 0 a 0 0 5 < < @ P ].].$XvX$XvXvXvXvXJXPXUXkXT = = r e r r , = k h > | k h k k k > > ; f : ; ; ( e.4.5.e.4.b d & % _ ].S ; [ [ j.j.j.c.x.x.x.lXlXlXlXx.x.x.j.[ r k ..o.o.X.o.....k h ' |.Y.C * V C . . [ JXJX#XU.*X*XY.B C X X o % Q >.5.C.t.Z.G.Z.Z.A.A.A.n.A.A.A.A.n.Z.Z.n.A.Z.S.S.S.A.", + "T.7X~.!.r O.{ ....r # v.c.r z.z.z.z.t O L T.R.Z ~.H ~.Q.W.W.W.W.W.!.W.!.!.W.!.!.!.!.~.!.~.OXOX~.~.oXeX4X~.eXeX4X4XoXoX4XeXeX0.q.3.7.7.3.w.7.7.7.7.8.6.7.6.6.6.6.6.6.6.` ' 0.9.9.9.9.e.e.9./ K 6.0.6.0.0.0.' K ' 7.~ D D 8.6.,.8.8.6.9.q.q.8.9.8.8.0.8.0.' 8.8.' 8.` ` ` ` 6.8.1.8.8.1.6.,./ 8.~ ` 8.6.` 8.8.8./ 8.8.` 6.` / ! ! ' ' ! ! ' ' ! _ *.*.6.6.6.` ! ( ^ ! ^ ( ^ ^ ^ ) / / / Q Q Q 4.Q Q Q 2.Q Q Q n j Q n j j n j j n n j b k ( k b R f b b ( b ( b ( k ( b k b c c k j p c k k c j c j c m b b n ) n n ) m m ) m m ) m ) m l l t l y x l y u y y u x u y u y u u z z g.g.d.g.p g.u u u u u u u z y y y p y y s l y l s l q g l u y y u y y u c y y y y w y w w i i w t y y u y z u x u y i y i u i d.d.u d.p u u u u z v g.u v u d.y w t t t q t t t d.d.d.s.d.d.d.d.d.d.i i i i i i u x l l m g g b s ( k g x g x x x t t t x t 2 t t 2 w q q < # T UXKXVXCXbXHXKXUXPXPXPXE . o @ @ < = 0 < 0 @ @ Q { t.FXLXLXLXLXLXLXLXFXLXFXFXFXFXFXFXFXFXDXFXDXDXZXDXDXZXZXF.F.F.S.F.BX@ # @ @ @ ; ; ; a ; 0 a 0 < 5 q 1 1 @ T ].bXPXUXbXvXvXvXbXPXPXPXJXR = = ; = r s = = a k h > h > k > r k = : b / C.AXGXDXZXAXG.G.u.5.) f d ; @ R j.j.6 j.j.x.c.lXx.lXlXlXlXx.x.j.j.Q s k p o.o. ... .j h k |.*X&XY.Y.Y.C . o kXJXJX'.&X*XU.Y.C C X X . & ;.5.t.t.G.G.Z.A.A.Z.A.A.A.C.A.A.n.A.A.Z.A.A.S.S.S.A.S.", + "~.~.~.~.r s.SXz.z.z.O m.d.r O O O O O O H H ~.T.~.K W.W.W.W.W.W.W.W.!.W.!.!.E.~.!.~.OXE.!.!.W.E.OX~.~.eXeXoXoXoXoXoXeXeXeX4XtX0.q.7.w.9.<.9.7.7.8.7.7.6.6.0.` 0.6.6.6.` oX' 8.e.e.9.9.9.~ K K ` 0.0.0.0.*.' E.E.F ~ ~ ~ / 8.8.8.6.6.] ' ] ' 0.' ' e.8.8.9.8.8.8.` 8.` ` ~ ` ~ 8.,.,.6.,.6.,.~ 6.~ ~ ~ ` ~ ` ` ~ / ` ` ] ` ' ! ! ! ! ' ! ! ! ! ! ` 0.*.6.` ! ! ~ ! ! ^ ! ! ! E ^ ^ ) ) / 1.Q 2.Q Q Q Q j n Q j j n .n n j n n j n n b ( b k k k ( b g ( b k b b b s b k b k c k c k c c c c c c c c c b ) m ) b b ) m ) m ) ) ) ) z z y l t t l y t y x x u y u x u u u y u u u i u g.u g.d.g.u v u u v u y p y y y y t s t x s y y x t w y y u y y y y y y y y y w w y w e w y w y y y u y u y u u y i y y u u i g.d.d.u d.g.u g.u u g.z i x t t t t t 2 t t t d.d.d.d.d.d.2 d.i d.f.i u f.u u i u x s x l l g g g x t t 8 t t 2 8 t t 2 q x 2 t 5 i q < # o o VXIXUXKXVXKXKXUXPXPXPXPXKXX . o # @ @ 0 < 1 # 1 Q { Z.FXLXLXLXLXFXFXFXFXFXFXFXFXFXDXDXDXDXDXDXDXDXDXZXZXZXD.F.D.G.F.F.) # & @ = @ @ ; ; f d ; 0 5 0 < < < < # R kXPXPXPXUXbXbXvXJXPXPXPXPX%X= = r = e r r 0 ; = h k h h h f h f > 4.r.AXDXGXKXDXAXAXG.G.Z.5.r.4.1.f = d j.j.j.j.j.x.x.lXlXlXlXlXlXx.x.v.[ k k j . . . .) Q r f ' ;X*XY.&X*X&XY.* * JXJX%XV ;X&XY.Y.B * * X o % 4.5.t.Z.Z.Z.Z.A.A.C.A.A.A.A.A.A.A.A.A.S.S.A.A.A.S.A.A.", + "T.).T.2X, ..z.z.z.z.O N.N.m.O.O.} ..r O L H H ~.H !.!.Q.W.W.W.W.W.!.W.!.!.!.~.~.!.!.!.!.!.E.!.!.OX~.OXoX~.eX~.oX*.oX4XeX0.eXeX4XtX0.7.7.9.7.7.7.7.8.8.7.' 0.` 0.6.6.6.6.oXK ` 9.e.9.0.' K D K ! K 0.oX' ~.XXK E._ F ~ ` 8.8.8.8.8.' ] ' ' ' ' ` ' 8.8.` 8.8.6.` ` 8.` ` ` ~ ` ~ 6.,.6.~ ,./ 6.6.~ ~ ~ ~ ` K ~ ~ ~ ` ` ` ! ! ! ` ! ' K ! ! ! ! ! E 6.6.! ( ! ! ( ! ! ^ ! ! ! ( A ! ( ^ Q Q Q 2.n Q Q j Q j Q j b j Q Q n j n j n j j o.k k k ( b g g b k b b k b s b s b b k s c k c c c c c c c c c b b ) m b m ) b m ) ) m ) m z l l s l t t l l y x y u x u y u u u u u u u u f.p u g.g.u g.u u u u u u y y w y w y w y y l s t l t s w q w y y y y y y y y w w y w w w i y y w p w i i y p u i y w i i w i i t q i i u i u u u v u v i t t 2 q t t t t t i 2 d.d.d.d.d.d.d.2 i f.d.i i u i u u y x l t y t i t t t t t 2 t t g 2 2 t x t t 5 2 < 2 0 @ o ^ PXPXPXUXKXUXPXPXPXPXPXPXPXP . . O # < < < < 1 < j ..t.DXFXFXLXFXFXFXFXFXFXFXFXDXDXDXDXDXDXDXZXZXZXZXF.F.ZXF.F.F.S.G.G.f # @ ; @ & ; @ ; a a < < g 1 a < < 1 # R kXPXPXPXPXJXvXbXUXKXUXPXPXCXN = = = r r e ; ; = g > h k > > f : a 5.G.AXAXGXAXGXAXG.G.G.C.5.5.>...( @ 0 R [ j.j.j.x.x.lXlXlXzXlXlXx.j.j.) k c j M j k b k.kX[ g _ *X*XY.*X*X&XP.C V |.U.Y.Y.Y.Y.Y.C C $ X . X S 5.5.Z.Z.Z.Z.A.Z.A.n.A.A.n.A.A.M.S.S.S.M.S.Z.M.Z.N.S.Z.", + "~.~.Q.!.= r z.z.s.z.# DXUXh.O.+.+.X., = ~.R.R.R.Q.!.Q.(.W.W.W.!.!.Q.!.!.!.!.E.!.E.W.+X!.!.!.OX!.!.~.~.oX~.~.eX~.oXeXeXeX4XtXyXeXeXeX~.' w.7.7.7.7.7.7.` 0.*.' 6.0.6.` 6.' ' ' 0.q.' 0.0.' K A K K 0.' ' H K XXJ OXH F 6.8.` ' 8.8.' ' ' ] ' ' ' ' / ` ' ` ' ' 8.` ` ` ` ` ` ~ ~ ! 6.,.6.6.~ ~ ~ ` 6.~ ~ ! ` ! ` K ! ~ ! K ! A ! ! ! ! ' ' ' F ! _ ! ! ^ ! R ( ! ~ ! ( ^ ! ( ( ! ! ( ^ ^ Q 2.j 2.4.j Q j j Q j Q j n n .n j j n M j j M b k k k k b s b s b b s l b l s l c b c k c k c j c j c l m l c b ) ) m m ) ) m ) m l l l l t t l y l t y y u u y y u u y x u u u u v u u u u d.d.v d.v u u u u y y y y y t y y y w q y q t q y w w e q y y y w w t w w y w w w w w w y y w y w w p y i i i i i w i t e q q t i i i i u i i u u w t t q 2 t t t t t t d.d.d.d.d.d.d.d.d.d.d.i d.d.d.i u u u u 2 t 2 t 2 t 2 2 t 2 t 2 t 2 t t 2 g 2 2 q 5 2 1 < + o KXPXPXPXPXPXPXPXPXPXPXPXPXPXe.. . . . # # < < @ # @ Q X.Z.DXFXFXFXFXFXFXDXDXFXDXDXDXDXDXDXDXDXZXZXZXD.F.ZXF.F.F.F.G.G.Z.C.f # @ @ ; @ ; @ @ ; 0 < 5 < < 5 < < < # R kXPXPXJXCXPXbXbXHX$ ] PXPXVX( # = = = e r = ; a = k h > k e > : k Z.G.AXAXGXGXAXAXG.G.G.t.5.3.:.#.: ; [ E T _ l.j.j.j.lXlXlXlXlXj.k.[ f f r r k k k s s m zXbXR _ ;X*X&XY.Y.U.B C P.Y.U.*X*X*X&XY.B C * X . * Q 5.5.5.Z.Z.A.A.n.A.A.A.A.A.A.S.S.S.S.S.S.M.S.S.M.A.N.S.", + "~.~.~.~.r a.z.z.2 z.+ zXz.s.c.h.+.X.= R.H H R.~.W.W.W.W.W.!.!.W.Q.!.Q.!.~.E.E.!.!.!.W.!.!.OXE.E.~.OXOX~.~.~.eXeX*.eXuXeXeXeXeXeXtX~.OXOX~.8.7.7.7.7.0.0.' 0.0.6.` 6.6.6.~.0.' oX0.' ' *.K F K F K ' K OXE.K K H XXF XX' ` ' 8.9.] oX' ] ' ' ' ` ' ' ~ ` K F J K ` ` ` ` ~ ` K K ~ ! ` ~ ~ 6.~ 6.~ ~ ` ~ ! ! ` ` ' ` ` ! ! ! F ! ! ! ' ! ! _ ! _ ! ! ( ! E ( ( ! ( ! ( ! E ( ( ( ( A ( ( ) 2.2.Q Q Q j Q j j j Q Q n n n .M j n .n j M j b k b k s b s b k l b c c b l b s l c c c c c b c c c c l l s l ) b ) ) b b ) b g l s l t t l t l y z x u y x u x x u u u u u u u u u u g.u u u u u d.g.u u u w y w y w y t w q q w s s t t w w e w w w w w w w w w w w y w w w y w w w y y w w i y i w i i t q < q q q 5 q i u u i u i i t t t t q i t t t t t t x d.d.d.d.d.d.d.d.d.d.i d.i i f.i i i y 2 t q i i 2 t t 2 t 2 i t t t 8 t 2 2 t 2 2 2 1 1 + . N UXPXPXPXPXPXPXPXPXPXPXPXPXIXVX. o # 1 1 1 # # Q { Z.ZXFXFXFXFXFXFXZXDXDXDXDXDXZXZXF.F.ZXZXZXF.ZXZXZXZXF.F.F.S.G.Z.Z.E # & ; @ @ @ ; @ < 5 < 5 < 2 5 1 < 1 # R kXPXPXR * KXvX$XbXCXJXPXPXHXkX; = = = e = 0 0 0 0 0 k k , > f = n C.G.AXGXGXAXAXF.AXG.G.C.5.3.:.W ; [ jX$X[ T 5 4 U [ [ l.R R R g f [ g s k k k r r ] [ s l.kXkX[ +XU.Y.J.Y.Y.L.U.*X*X*X*X*XY.I.Y.C C X X X 5 Q o.n.Z.n.A.A.A.A.A.A.A.A.S.S.S.S.S.S.S.S.S.S.N.Z.S.Z.A.", + "T.).~.T.O.1 z.w o s.O s.s.s.s.u +...O ~.R.~.~.T.(.W.W.W.W.W.Q.W.!.!.E.Q.E.E.E.E.!.!.!.!.!.E.!.!.E.!.~.~.oX~.~.eXOXuXrX4XtX4XtXyX4X~.E.OX~.OX' 7.7.6.' *.' 0.' *.' 6.6.6.' oXoXeXeXK ' 0.' K F K F K E.H K E.E._ J E.K J ' 8.8.' ` ' ' oX' ' ' ' ! ' ' ! F F F F K A ` ` ' ! ! ~ ! K ! ~ 6.~ 6.~ ~ ` ~ K K ~ ! K ! ` ! K ~ ! ! ' F ' ! ! ' ! R F ! E E E ( ! ! ! ! ( ! ( A ( A ! ! ( ! ^ Q Q 4.Q 2.Q Q j Q n 2.n j Q Q j j n j j M n j j n k s s g b s b b s c s s l b s l s b c v c c c c c c c l b l b s ) ) m ) ) b x t s g l t l l q l t t s y y u y u u u z u u u u u u u u u u g.u u u u g.u d.u p w w w w y w y q e 0 0 q q q g w w e w e w w w w w w e i w y w w y w w y y w y y w w i i i w e q q q q q 0 q q y i i i i t t t t t t 2 i t t t t t 2 i d.d.d.d.d.d.d.d.d.i d.d.d.2 i d.i i i t 2 2 t 2 q 2 q t 2 t t 2 t 2 t 2 t 2 < 5 2 < 1 # R KXUXPXPXIXUXPXPXPXPXUXKXKXKXKX& . . o # # < # # b ..Z.ZXZXDXFXDXFXDXZXZXF.ZXF.F.ZXF.ZXZXF.ZXF.ZXZXF.ZXF.ZXZXF.F.G.Z.Z.) # @ @ @ @ @ @ @ 5 < < < < 0 < < 1 1 < T %XUXPXKXVXJXHXVXKXUXUXPXPXUXKX] @ = = r = a 0 0 s 0 0 > k = : : 5.G.G.AXGXGXDXAXAXG.C.C.5.5.>.:.~ ; jXjXvXvXjX%XT 5 # @ @ d P x jXjXcX%Xg r s k p c kXbXl.T g kXk.( XXV K.U.*X*X&X*X*X*XY.Y.B Y.V C * o . & Q O.5.n.n.H.A.A.A.A.A.A.n.A.A.S.S.S.S.S.S.S.M.Z.S.N.N.Z.N.", + "7X~.~.T...0 2 # ..O O M s.s.p O.r O K ~.W.W.W.W.W.W.W.W.W.(.W.W.!.Q.Q.E.E.E.E.!.W.OX!.!.!.!.!.E.E.E.E.~.OXoXOXOXrXOXuX4XtXeX0.eXoX~.OXOXOXK OX' 6.' 4X' 0.0.' ' *.6.6.6.` oXOX' oX' K K F K F F H ' H K XXH _ E.H _ E.E.E.' ' ' ' ] ' ] ' ' ' ! ` ` K K F F F F F A ~ ~ ! D D ! K A A ! ` ~ ~ ~ ~ ` ! ~ ~ ! ` ! ~ ` ! ! ! ` ! ! ! ! F ! _ ! R ! _ E ! ! ! ( E ( ! ( ! ! ! A ( ( A ( ( ( Q ^ Q Q j 2.Q n Q 2.n Q Q n Q j n n j n n j n j j n k s b s s b s l l c b l s b l c b l b v c c c c c c l c l g l l m ) m x 5 g x s s t l y t l x y t t t l u z x u u u u u u u u u u u d.u u g.u u u d.i y i w i q q q q w i e e q q 0 q q w e e w w w e w w w w w w w w w w p w p y w w y i w y y w q q q q 2 q t q q q < q t i i i t t t t t t t t t t 2 t t t x u d.d.d.d.d.d.d.a.d.d.d.d.f.i d.i 2 2 t 2 t 2 q 2 i 2 q 2 q t t t 2 q 2 t 2 t 5 2 2 1 1 o . ] UXPXPXPXPXIXPXPXPXPXPXUXKXKXKXVX. * X . + # # # # k ..n.ZXZXDXZXZXF.F.F.ZXZXF.F.ZXF.ZXF.ZXZXZXZXZXZXZXZXZXZXZXF.F.F.S.N.V.& & @ @ @ a @ 5 5 5 < q 5 5 1 1 @ @ # T CXJXPXPXUXUXKXKXKXKXKXKXKXKXUXVX( @ = = e e a 0 0 s 0 a f > ; a C.G.AXAXGXGXAXAXG.G.G.Z.5.3.>.#.f 5 jXjXjXcXcXnXjXmXlXcXMXvXMXnXnXnXnX[ s g k k a a ( kXcXjX[ kXkX< g E J B P.&X&X&X*XY.C * C B C * X o O f O.n.n.n.N.A.A.n.A.A.A.n.A.A.A.S.S.S.S.S.M.S.S.N.S.Z.M.Z.S.", + "~.T.(.~.K O = e O , +.+.O.O.r = , R.!.T.W.W.W.W.W.W.W.W.W.Q.W.W.Q.E.E.E.E.!.E.(.(.W.(.!.OXW.!.E.!.E.W.XXOXuXOXOXrXuXtXeXeXtXtX~.!.~.~.E.OX!.' OXoX' ' oXeXK 0.6.6.' 6.6.6.!.XX!.OXE.F F F ' F K XXK XXE.K E.E.K K XXE.K J H K ' H K _ OXoX' ` ' ' ` A F F F F F F K K A ' A ! K D ! A ! D K ` ~ ` D ~ K ! D ! K K ! A ` F A ! F ! ! ! _ A ! ! E E ! ! E ( ( ! ! ( E E ! ! ( ( A ( A ^ ( ^ ( Q Q Q Q 2.n Q n 2.j j Q j j j j M j n j j M n j n c s b b c c c b s b s l b b s l c l c z b c c c v l l g x d 4 g b d 4 g 5 s s l t q l s t q l s y t t y t y z u u u u z u f.u u f.u u u i i p y y w i w q e q e i w w w e e 0 e e q 0 e e e e e w w w e w w w w w w w w w w w w y w w w w w w i 1 q q q q q < < q q q q < w i t t t t q i q i t t t t t t t z d.d.s.2 d.d.d.d.2 d.d.2 d.i i i i i i 2 i 2 2 2 t 2 t 2 t 2 2 2 2 t 2 2 2 5 2 2 1 1 1 # . o o & KXPXPXPXPXPXPXPXPXPXPXPXPXPXIXKXUX] X X . o # @ + # s X.+.F.F.F.D.F.F.ZXF.ZXF.ZXZXF.DXZXZXZXZXZXZXZXZXZXZXZXZXZXF.F.F.G.A.Z.E # < & @ < < 1 < < 1 1 1 1 @ 1 1 1 + R VXUXIXUXKXVXKXUXUXUXIXIXKXVX[ VXNX= = = = = 0 0 0 0 0 0 ; = @ j r.G.AXGXGXGXDXAXG.G.Z.r.r.>.>.#.@ R jXcXcXxXxXnXnXnXnXmXMXMXmXnXnXnXcXP s s r b ( g 0 1 [ zXMXmX[ @ @ ; ( E V B L.K.C C C Y.J.J.N * X & k .o.5.n.n.Z.M.A.A.H.A.A.A.A.A.n.S.S.S.S.S.S.S.S.M.S.S.S.S.S.", + ").T.7X~.!.T.O O L = O = = = = L T.~.Q.W.W.W.W.W.W.W./.W./.W.W.W.!.Q.E.E.E.E.!.!.W.!.!.!.!.!.OXW.W.+XXX+X+XOXOXuXrXtXuXtXtXtX~.).!.OXOX!.OX' ' OX' oXoXK ' ' oX' ' OXOXXXE.XXOXE.OXXXJ F J K E.' K H ' E.K E.J _ K J J E.XXH K F ' ' J ' _ ' ' ' ! K F F F F K A F A A A A K F ! A K ! D ! A ~ ` ! D ` ! K ' K ! ~ ! A ! ! ! ! ! ! ! E E E R F R ! R F E ! E ( A ! A ( ( ( A ( A E ( ( ( ( ^ ( 2.2.j Q Q 2.Q n Q Q n 4.j j j j j c j M k M .n n b s b b b b l l l b s s l s c b v v g x g 4 4 4 4 4 g 8 4 4 4 5 5 5 g a x s y s l t s t l t l s t t q t t y u u u f.u f.u u u u u i u i y i i y y y e q e i q q q i e 0 0 e q q e 0 e e e e e e e w w w w w w w w w w p w w w w p w w w w q q q 1 q q q < q q q < q q 0 q i t t t t t t t 2 q 2 t t t t i f.d.d.s.d.d.d.d.d.d.2 a.d.2 d.f.a.2 f.2 2 i t t 2 t t t 2 t 2 2 2 2 2 2 t t < 2 1 1 1 1 + * . CXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXUXKXX . X o . + 1 1 9 2 O.O.D.S.G.F.F.ZXF.ZXZXF.ZXZXDXDXZXZXDXZXZXZXZXZXZXZXZXZXZXZXZXF.F.A.A.V.& # @ < 5 5 < 5 1 5 1 5 5 < < @ # + [ KXKXKXVXVXVXKXKXKXKXKXKXHXBXT kXKX) @ @ 0 0 0 0 a 0 0 a @ @ @ 1.Z.AXAXDXGXAXAXAXG.G.C.5.5.>.{ > # Y cXjXcXjXxXnXnXnXnXmXMXMXmXnXnXnXjXd = s s kXMXkXq a g kXmXmXkX_ +X+X_ f S S C B J.J.J.J.C G N $ X ( M O.o.n.n.n.A.n.A.A.A.A.n.A.H.A.A.N.S.S.S.S.S.S.S.S.S.S.S.S.S.", + "~.!.~.T.!.~.~.R.R.H R.H L R.H R.!.Q.(.(.Q.(.W.W.W.W.!.W.(.W.(.W.W.(.(.E.~.E.(.W.!.+X!.+X!.+XW.XX+XW.+X+X+X+XOXeXuXeXtX4X4X!.!.~.).~.~.OX!.OXE.~.!.OXOX!.!.!.!.!.W.OXE.E.XXE.OXE.XXOXH E.J H J J H ' H K XXE.K E.E.E._ K E._ XXH E.J ' H ' J F ! F F F F F F K F A K F K A ! ! D ! A D A A A A D ! ' D ! ! ! D ! K A ! ! K ! A ` ! E F ! F ! E E F E ! E A ( E ( ( ( ( A ! ( A ( ! R ( ^ ( R ( ( Q 2.2.Q j Q 2.n j 2.j j j n c k n k j j j M j n k c s s s s s b c s c c s b s s 4 5 3 5 3 5 3 g 4 g 5 4 4 g g 5 g g 4 x g t l t q l l t t s t t w s q q q t q y u u u u u u u u u u y p y u y y i w i q q q q q q q q e q 0 e < 0 w e e e e e e e e e e e w w w w w w w w w w w e w w w q i q t i q q q t q q < q q < q < i t i i t t t t t i t t t 2 i x x d.d.2 d.d.d.d.d.d.d.d.f.d.2 d.2 d.8 i 2 2 8 2 2 2 2 2 t 2 2 q 2 5 t 2 5 2 2 2 5 1 1 1 o . X % IXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXE & & O . + + 1 + 1 4.+.N.t.S.G.F.F.ZXF.DXZXDXZXZXZXZXDXZXZXZXZXZXZXDXZXZXZXZXZXZXZXF.F.F.A.[ # # < 1 < < 1 g 1 < < < 1 1 1 @ # k.KXCXVXCXVXVXVXCXVXCXVXVXVXk.E e.KXVXd @ < 0 0 a < 0 < a @ 5 @ 5.C.G.AXGXGXDXAXG.G.G.t.5.5.>.;.f & jXjXcXjXnXnXnXnXnXmXmXMXMXnXnXnXnX[ a a e w y kXcXzXkXcXmXjXjXMX|.;X}.V E = : A C B C C C V V C * * h p o.O.n.n.A.n.A.n.n.A.A.A.A.n.n.A.N.S.S.S.S.S.S.M.S.S.S.S.S.S.", + "T.~.~.T.~.!.!.!.~.H E.H G H H H !.!.(.W.W.W.W.W.W.W.W.(.W.W.W.W.W.(.W.!.W.W.+X!.W.!.W.W.XX!.W.+X+X+XW.W.+X+X+XOXrX4XtXtXOX!.!.OX~.OX!.!.OXW.#XW.+X!.!.!.OXW.W.E.W.W.!.~.XXXXE.~.E.~.E.E.E.K E.K XXE.K H K K XX_ E.OX_ H H XXK E.E._ K _ ' F F K F F F F F K F F A K A K D ! D A S A A A ! D A A F K ! D K ! D D ! ! ! A ! A ! ! F F F E E E ! _ A E ! ! E ! ! E E ( A ( ! A ( ( ( ( R ( ( R ( ( 2.j 2.Q Q Q Q Q Q j j j k b j b j b j j j j n n n j c s s s s s s c c 4 5 4 5 5 5 5 P 3 5 3 5 4 4 x 5 5 4 x 4 x g d 5 g s t l q l t t l t l t q q t g t q s q t t q w i u u u u u i y u y y y y w w q w i e q q q q e q e q 0 e e e e e e e e e e e e e e w w e w w w w w e w w w e e < q i 2 q q q 2 e 1 q q 2 q q < q < i i q 2 q q i t q i t t t 2 u z x d.d.d.d.d.d.a.d.d.d.2 d.d.2 f.d.2 d.d.2 8 8 8 8 2 8 8 2 2 < 2 < 2 t 2 < 2 2 1 < 1 1 # . * . CXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXNX. . X . . . + 9 1 1 X.O.+.N.G.F.F.ZXZXZXZXZXDXDXZXDXDXZXDXDXDXDXDXDXZXDXDXDXDXDXDXZXZXF.F.S.C.T # 9 1 1 < 1 < 1 @ 1 1 < 1 # # 4 VXCX_ NXVXVXCXVXCXVXVXVXVXCX] E CXKXKX] @ @ 0 @ < 0 0 < < @ & g 5.G.AXZXGXDXAXAXG.G.t.C.5.3.3.{ & 4 jXvXcXcXxXxXnXnXnXmXmXMXmXnXnXnXnX[ a a e g e k [ kXbXlXj.g [ kX{.&XL.C R = @ S L.U.Y.I.&XY.&XY.C * f k o.n.+.n.n.Z.n.A.H.A.n.A.A.A.n.A.A.M.S.S.S.S.S.S.S.S.S.S.S.M.", + "~.(.~.!.(.~.T.!.R.R.P 5 N H H R.T.!.T.!.(.W./.W.(.W.W.W./.W.(.W./.Q.(.W.W.(.W.W.+XW.#XW.!.XX+XW.W.XX+X+XXX+X+X+XOXtXuXOX#X(.(.(.(.).(.(.!.OXW.OXW.OXW.!.OXE.OX!.OXE.XXE.E.~.E.OXXXE.E.E.E.E.J E.K E.OXXXXXH F H K H E._ K XX_ E.E.H E.K J F ' F F F K F F F F D K A F A F F A A A D A A A A A L A A A ` ! ! ' A F A A A D ! A A ! E ! ! ! F A E ! ! _ E ! A ( E ( A ( ! A ( ( A R ( ( E ( ( ( ( Q 2.Q Q 2.Q Q Q Q Q ( Q ( k j k j b b k b n j n j f T f f f f f b b c 5 4 5 4 5 4 3 5 5 5 5 5 4 4 g g g 5 a d t 5 t g g g s t l t s s t s t l q q s q q q q q y t < < < i u u u u u u u u i i y w w w q w q q q i e e 0 0 q e q 0 e e r e e r e e e e p e e e w w e e e e w e e e e e e q q q t q q w 1 q q q q q 0 < q q q i 2 t i i 2 t 2 2 t t t x z z z i f.2 a.d.d.2 d.d.d.d.i a.i d.8 a.i 8 a.2 8 2 2 8 8 8 3 2 2 2 2 2 2 2 < < 2 1 2 1 1 + o X O UXPXPXPXPXPXPXIXPXPXPXPXPXPXPXPXPXPXPXPXKX . X . 9 + + + b +.+.Z.Z.F.ZXZXZXZXZXDXDXDXDXDXDXDXDXDXDXDXDXZXDXDXDXDXDXDXDXDXDXDXZXF.Z.5.R @ # 1 1 @ 5 5 @ 1 1 1 # 1 # [ KXCXE ] CXVXVXCXVXVXVXCXCXVXE ] KXKXKXNX5 # @ < < 0 < < = @ @ Q Z.G.AXFXGXDXAXAXG.G.G.Z.r.>.:.h # [ jXcXjXcXnXnXnXnXnXmXMXMXmXnXnXnXjXx 0 g s s f e s g b g ; @ < XXU.Y.G C T T E _ I.*X*X*X*X&X*X}.V * f k O.o.5.5.n.n.n.N.n.n.A.A.n.A.H.A.A.Z.S.S.S.S.S.S.S.S.S.M.S.S.", + ").~.7X~.T.~.!.Q.~.E k.] [ P R.R.Q.!.!.(.W.W.W.W.W./.W./.(.W./.+X(.W.(.W.#XW.W.(.!.W.!.!.W.W.W.XXW.+XW.+X+X+X+X+X+XuX#X+X#X!.!.!.(.(.(.OX!.W.XX!.OXW.W.OXW.W.W.W.XXOXOXE.OXE.E.XXOXE.E.OXE.E.K E.XXH H ' J OX' H H K K E.E.J E.' E.H E._ ' J F F F F F F F A F F K A K A ! F K A A A A D A A A F F A A F D K F A S A D A A A A F F F E A E A ! A E E E ! E ! E ! ! ( A ( ( ! A ( ( E ( E R ( E ( ( Q 2.Q Q Q Q ( ( ( ( f ( ( ( b j k j b j j j k d S d f d f d d f g f 4 5 5 4 4 5 4 5 3 3 5 5 d 5 g g x g 5 g 4 g g g 5 g q x t l x q g g s s q q q 2 g q q s q w 0 < e < e w u u u u u u u y y q e w e w q i q q q 0 e q e e < q e e e e e e e e e e e e p e w e e e e p e e e e e e e q 2 t q 2 q q t q q q q < < q q q < t t t q i t t t i q t 2 x z z z z z d.x f.f.x 8 8 i d.a.2 f.2 d.8 8 8 8 8 8 8 2 2 7 8 2 1 2 2 1 1 2 2 2 < 2 1 1 1 # o X . R PXPXPXPXPXPXIXPXPXPXPXPXPXPXPXPXPXPXPXPXUX. . X + + 1 + g 5.+.Z.G.F.ZXZXZXDXFXDXDXDXDXDXDXDXDXDXDXZXDXDXDXDXFXDXDXFXDXFXDXDXDXDXZXN.O.4.a @ 1 < 5 1 1 1 1 # 1 + + NXKXVX[ E NXCXVXVXCXVXVXCXVXBXR VXVXKXKXCX& # @ < @ < @ < 0 # % 4.G.AXDXKXFXAXAXAXAXC.C.r.5.>.#.f & ].jXcXcXxXjXnXnXnXmXmXMXMXmXnXnXnXkXa 0 0 g r s e s e g a g = d {.*X;XL.$ % & N V Y.&X*X*X*X*X&XP.V * & b k O.n.n.n.Z.Z.n.n.A.A.A.A.A.n.A.N.n.A.S.S.S.S.S.S.S.S.S.N.N.", + "T.!.T.(.~.!.!.W.T l.SXSXl.x 5 ).(.W.(.!.(.Q.W.(.W.W.W.(.W.W.(.W.Q.(.W.W.+XW.+X(.W.W.XXW.+XW.W.+X+XW.+X+X+X+X+X+X+X+X#X+X+X(.(.(.OX).(.#X+X+X!.!.W.!.+X!.!.OXOXW.E.E.E.XXE.!.E.E.E.E.E.H E.E.E.E.K E.E.E.E.OXH E.XXE._ H K XXJ H E._ E.K _ F F F K F F F F K F F A A A A A A ! A A D F D A A A J L F A A A A K D A A A A A A A A ! A E A F ! E ! ! E ! E ! E ! ( ( E ( A A E ! ( R ( R F E S ( S E Q Q Q Q ( D ( E ! ( E ( ! ( k b ( j j j j E d d S S d d : d d : ; % 4 5 4 5 5 4 5 4 5 4 4 5 4 x g 4 4 g x g g g g g g 4 g g g t g s x t x s t q 0 q q q t q t q < 0 < @ < 0 q t u u u u y i q e q e q q q e q q q 0 q e q q e e e e e r e e e e e e e e e e e e e e e e e e e e e e q 0 e q q q q t q 2 q q q t q q < q < q i 2 i t t t t i 2 2 t z z x f.x z i x x x f.f.x x x a.x x 8 8 8 8 7 8 8 8 2 8 8 2 3 1 1 2 2 2 2 q 5 2 2 1 5 1 9 o X . CXPXPXPXPXPXPXIXPXPXPXPXPXPXPXPXPXPXPXPXPXIXX . . X . . + + + + 9 C.+.+.S.F.F.ZXDXDXZXFXFXDXFXFXFXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXZXZX+.O.) 1 # 1 1 1 # 1 1 1 # # & CXKXKXCXR ] CXCXCXCXCXCXCXCXiXNXVXKXHXKXCX@ # # # 1 @ @ @ < # E 5.G.G.AXAXAXAXBXG.G.G.t.5.>.:.| : % jXjXjXjXcXxXnXnXnXmXmXMXmXnXnXnXnX[ = a 0 e k s c s s s w s s g XX&X&XB N S $ C U.&X*XY.Y.U.U.L.V N X X E k o.O.5.n.5.n.n.n.Z.n.A.n.A.A.A.A.Z.A.S.S.S.S.S.S.S.S.S.S.S.", + "7X!.T.~.E.!.E.x l.SXSXv.l.j.a.3 !.(.(.(.(.(.W./.W.W./.(.W.(.W.W.(./.W.W.W.(.+XW.W.W.XXW.W.W.XX+X+XW.+XXXXX+X+X+X#X+X+X#X+X#X#XOXOX+XXXXXXXOXXXOXW.OXW.W.OXW.W.OXE.E.XXE.OXXXE.E.E.E.E.OXE.E.K ~.E.E.E.E.OXH J _ ' J _ E.K E.H XXE.H XXJ K F F F K F F F F K F F A D F F A A A A A A D A D A F L J L J S F F A F K A A A A A S A ! A E A E ! E ! ! E ! ! E ! E ! ( A ( E ( ( R ( E ! E V V J A : S ( k S S : ! E A ( S ( E ( ( h b j j ( k E T ; S T S : ; ; ; S d ; d 4 5 4 5 5 5 4 4 5 5 4 5 g g 4 x g g g g g g g 4 4 4 P 4 4 4 g g x g x w s q g q q t q q q 0 @ < < 0 < e < < 0 t u i u t q q e e q q w q q q q e q 0 e e q e e r e e e e e e e r e e e e e e e e e e e e e e e e < 0 0 q q q q q q q 2 q 1 q q q < q q q 2 2 i i q t t 2 t 2 z z x z f.u x x f.f.x x x f.x x x 8 8 7 8 8 7 8 7 8 8 2 2 8 2 2 2 1 1 < 2 5 2 2 1 5 1 9 1 + . & KXPXPXPXPXPXPXUXPXPXPXPXPXPXPXPXPXPXPXPXPXIXX . . o o + + + + g.Z.N.S.F.ZXZXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXDXZ.O.j # 1 + # 9 # 9 # + + + & VXKXKXKXNXR NXCXCXCXBXCXCXCXkXCXVXVXVXVXCX5 @ # + & + # 1 # # b C.G.e.4.^ : f f : NXNXe.] ] NXk.e.V.%Xk.%XV.k.JXnXnXnXmXmXMXmXnXnXnXcX[ = 0 s r g s s s s p s w w a ( I V B N & & C }.*X*X*X}.J.B C V N X X f j .O.n.5.n.n.5.n.n.A.n.A.n.A.A.A.A.A.A.S.S.S.S.S.S.M.S.S.S.", + "~.!.~.).!.OX[ l.SXSXzXh.h.v.l.[ 5 E.).#X#X#X(.W.(.W.W.W.W.(./.(.W.W.W.W.W.+XW.W.W.XX/.W.W.W.+XW.XX#X#X+X+X+X+X+X+X+X+X+X+X#XXX+XXXXX+X%XXX+X!.XXOXW.XX!.W.W.OXE.OXE.!.XXE.E.E.!.E.E.E.E.E.E.E.E.E.E.E.K E.' J E.J E.E.F E.J ' XX' E.XXK H F H F F F H F F F F F A K A A A ! K D A A A A A A L J S J S F F F F A A K K A A A A A A A F A A A A E E ! ! E ( ! ( ( E ( ! D A ( ! E ! E G G J J J S ( D f S d S S E S S ( E ( f ( ( ( ( ( k E S S S : N : N S : % ; % ; % % 4 5 4 4 4 g 5 5 g 4 4 4 g g g g g x 4 g 3 4 4 4 4 4 4 4 4 4 t g 8 g g t q q q q q q q q < 0 0 q < q q < q 5 a < q u g 0 q e q e q q q e w q q q 0 q q q e e r = r e e r r e e e e r e e e r = e e = e e < 2 5 < < q 0 5 q q q 2 q q q t q q 0 q q < < 2 t 2 2 t 2 t q 2 t x z z z x z z u x x x x 8 8 8 7 8 7 7 7 7 7 7 7 7 7 7 8 8 3 3 3 1 1 5 t 2 2 2 2 2 2 1 1 1 + . 4 . UXPXPXPXPXPXPXUXPXPXPXPXPXPXPXPXPXPXPXPXPXPX* X . . + + + 9 + g AXZ.S.F.F.DXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXn.5.< # + 1 # < a < 1 < 5 # P CXKXVXVXVXCX] NXNXNXBXiXNXNXNXCXVXVXVXVX%X%XI [ ] [ R R d < # ) 2.( ; & # @ O @ @ ) & kXnXxXnXmXMXMXmXnXnXnXjX% @ 0 0 s s k w s p s s s s w a ^ _ Q.J.* * B *X*X;X*X*XP.V C V * * o d M O.o.O.+.n.n.n.n.A.A.n.Z.n.A.n.n.A.n.A.S.S.S.S.S.S.S.B.S.S.", + "~.).(.!._ [ l.CXSXl.3 5 x [ l.V.] 5 E.#X).#X(.#X/.W.(.W./.W.(.W.W.W.W.Q.W.W.W.XXW.W.W.W.+XW.W.+XW.+X+X+X+X+X+X+X+X+X+X+XXX].XXXX+XXXXX+XXXXX!.OX!.!.W.OXW.W.!.E.E.E.E.E.OXE.E.E.E.OXE.E.E.E.E.E.E.E.E.E.E.E.J K _ XXH XX_ E.J H K XXH F H F F H H F F F F L F F A A A A K ! A F A A K A A F J L L L J F F H F H F K F F F F A A A A A ! E S A A E ( ( E ! E E ( ! ( ! E ! ( R R E J G G G J G G S ( S ( S S S S ( S S ( f E ( f ( k f S S d d S S : T S S & % ; % ; ; % 5 4 g 5 5 4 4 4 5 4 5 5 x g 4 g 3 4 4 P P 4 4 P P 4 4 [ 4 4 4 x g g s x g q g q g a a 0 a 0 0 < 0 0 0 < < 0 0 5 < a < q q e e q q w q i q w q e e q q e e e e e r e e e e e e e e e e e e e e = e e e e 0 3 7 3 7 5 < 0 q q q q q t 1 q < q < 2 2 t 5 q 2 2 2 2 q 2 2 2 t 2 2 i x u f.x x x x x 7 8 7 7 7 7 7 7 7 8 8 7 7 7 7 8 7 2 2 3 3 2 8 8 8 2 1 q 1 1 1 9 # 1 + * . IXPXPXPXPXPXPXIXPXPXPXPXPXPXPXPXPXPXPXPXPXIXX . X o 9 9 1 + 1 BXS.S.F.ZXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXLXLXFXFXFXFXFXFXFXFXFXFXFXFXZX+.C.< 1 + 1 1 d k.%X%X%X%X X].HXVXVXVXVXVXNXNXNXNXNXNXNXiXNXNXVXVXVXCX X XvXvXvXNXNXNX] a @ ; @ # # # # @ # @ @ g.* bXjXjXxXmXMXMXnXnXnXxX[ a = 0 s s e c s s s k w s s s 0 0 f g E N V I.*X*X;X&XY.L.N C N * X X a p o.n.o.n.n.n.n.A.n.n.A.A.H.A.n.A.A.Z.N.S.S.B.S.S.S.S.S.M.S.", + ").!.).S [ [ 8 7 5 % NXVX] 5 4 g 5 P 5 (.#X(.#X#X#X(.(.W.W.(.W./.(.#X!.XXXXW.G L.W.W.W.W.W.XXW.W.W.+X+X+X+X+X+X+X+X+XXX+X+XXX+X+XXX+X+XXX+X+XXX+X+X!.XXW.W.OXW.XXW.E.E.E.E.W.E.E.E.E.E.OXE.E.E.E.E.K E.E.E.~._ E.E.K ' H E.K XXK J E.H F F H F F H H H F H F F F F F A A A A A A K A K A A G L J J J F H L J F F F F F L F A F A F A E A F A A A A E ! ! ! ( ! ! ( A ! ( E E R ! J V J G J V J G J S S S S : S S E D E D E ( ( ( k ( E E S S S S N S N N N S & ; % % ; @ 5 4 5 4 4 g g 5 d 5 d 4 4 4 4 P 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2 g s g q 5 a 0 a a a < a q 5 0 q < < 0 0 < q < q 0 q q e q < q q q q q q q e < e e < e e e r e e r e r e e r e e r e e e e e r e e e 3 8 3 3 3 3 7 3 1 q 5 0 < q q q t q q q 0 < 5 2 2 i i 2 2 2 2 2 2 2 2 2 2 2 u x 8 8 8 7 7 7 7 8 7 8 7 8 7 7 7 7 8 8 7 7 7 2 3 2 7 8 x 2 5 5 2 2 2 1 1 1 1 # o * Y * * UXPXPXPXPXPXPXUXPXPXPXPXPXPXPXPXPXPXPXPXPXKX. X . X X + . + + 1 9 9 1 ) DXS.F.F.DXDXFXFXFXFXFXFXFXLXFXFXLXFXFXFXFXFXFXFXLXFXLXFXLXFXFXFXFXFXF.t.BX# 1 1 # # [ CXCXBXkXbXvXvXvXHXVXVXVXCXCXiXkX%XNX] NXV.%XNXVXVXkX X X:X1XvXvX1XCXCXNXT # @ @ # # @ @ @ @ 0 < V.# zXjXjXlXcXMXmXnXnXnXxX[ @ 0 0 k s w s s e p s e s w s s s 0 = = S V U.Y.*X&XL.V C N $ * O X o f k o.o.n.O.b.n.n.n.n.n.n.n.n.A.A.A.n.Z.N.S.S.S.S.S.S.S.M.S.S.", + ").).!.(.(.).~.(.P CXIXUXVX] N (.#X).).#X(.#X(.(.(.(.(.+X(.(.W.(.OX+X#X+X!.XXQ.V V G E.XXXX+XW.+XXX+X+X+X+X+X+X%X%X+XXXXX+X].XX%X%XXX+XXXXX+XOXOXXXOXW.W.OXXX!.W.OXE.E.E.E.W.E.E.OXE.E.E.E.E.K E.E.E.E.E.~.E.E._ _ K ' J F XXK XXE.H J F F H J H F H H F H F H F H L F F S F F F A K A A L H L H H F H F F H F J F L F F F A F A E A F A A S J S F S ! ( E ( E ! A ( A ! R R R J J G J G G J J N J S S S S N S S S A A ( S E E E S E E S S T S N - N S - N N N & & ; % % 5 5 % 5 4 4 4 4 4 4 4 4 4 4 P 4 4 4 P 4 4 4 4 T 7 T 4 4 P 4 4 4 4 4 s g g 5 g a 0 g a < < a 5 0 < a a < 0 0 < q 0 0 0 < ; 0 0 0 0 0 0 a q 0 0 0 0 q 0 0 e q 0 q 0 e e e r e e e r r e e r e = e e e e e 3 3 3 3 3 3 3 7 3 3 7 5 < 0 < q q 2 t q q 5 5 2 < 2 2 2 2 2 2 2 2 2 2 2 2 8 7 7 7 8 7 7 7 7 3 8 7 7 8 7 8 7 7 8 7 8 7 7 8 8 8 4 8 8 8 8 5 2 < 2 1 1 1 1 9 + 9 cXxXxXC [ IXPXPXPXPXPXUXPXPXPXPXPXPXPXPXPXPXPXJXbXbX* . % X o + 9 9 1 1 < BXF.F.F.DXDXFXFXFXFXFXFXFXLXFXFXFXFXFXFXFXLXFXFXFXFXFXFXFXFXFXLXFXFXN.DX) + 1 + 1 @ ] CXVXkX XvXvXvX:XkXVXVXCXVXCXiXk.%XV.NXkXe.V.V.CXkX].]. X:XvXvXvX$XVXCX%Xg # @ # @ @ @ # @ < < q V.* kX.XjXjXjXmXmXnXnXnXjXd < 0 0 w s s s e s e s s s s s e s : e = ; N C L.L.V R.C N $ * * X X X R p o.o.n.b.n.n.n.n.n.H.n.n.n.A.n.n.A.A.n.A.S.S.S.S.S.S.S.S.S.", + "(.#X#X(.(.(.(.).P k.CXVXV.^ 4 #X#X#X#X#X#X(.(.#X(.).(./.(./.W.(.#X(.OXOXOXW.W.E.'.J E.Q.W.W.W.+XXXW.XX#X+X#X#X+X+X+XXX+XXX+XXX+X+XXXXX+XXX+XXX+XXXW.OX!.W.W.E.#X#X!.XXE.E.E.W.E.E.E.E.W.~.E.E.E.E.K ~.E.E.~.E.H E.XXH XXE.J E.H E.F F H F H H F H K J F H J H H H H F F L F D F F A F D T.H G L F J L H L F F L F J F F F F A F F F J G A L A A A A A E ( ! ! ! ! ( ( ! ( R _ G V G V J V L G J J G J S S S S S S S S A S ( A S A S S T S S S S N N N % N S - N N ; % : % 5 5 5 g d 4 4 4 P 4 P 4 P 4 4 d 4 4 4 4 T 4 4 P x 4 4 g 4 4 d d 4 4 l s a a q a < a a 0 a 0 0 q < < a 5 0 0 0 0 < a 0 0 0 0 0 0 0 0 @ 0 0 0 ; 0 = 0 0 = < 0 = 0 0 = 0 e e e e e e r e e e r e e e e 0 5 2 3 3 3 3 5 3 3 3 7 7 7 3 3 5 < q q < 2 t < q < i i 2 2 2 2 2 2 2 8 7 3 7 7 7 7 7 7 8 3 8 7 8 8 7 8 7 7 7 8 7 7 7 8 7 3 8 8 8 8 2 3 2 3 2 2 2 2 1 1 9 + 9 Y xXxXxXxX* R UXPXPXPXPXIXIXPXPXPXPXPXPXPXPXPXPXMXnXnX* . o .Xj.+ 9 1 1 + 1 k.AXF.F.F.DXFXFXFXFXLXFXLXFXLXFXLXLXFXLXFXLXFXLXFXLXFXFXLXFXFXFXLXF.F.AX1 1 # 1 # # ^ %XVXCXvXvXvXvX X X XkXCXVXCXNX%Xk.iXiXk.%XkX%X$X X]. X1XcXvXvX1XHXVXVX] d @ 0 @ @ @ @ < = < e < k.# kXY Y jXjXjXnXjXjXjX[ < 0 g a e s s s s s w s s s w s w p e r ; f V C N N C C C N & + * + o & b r o.o.b.b.O.b.n.n.n.n.n.n.Z.A.A.A.Z.n.A.A.A.S.S.S.S.S.S.S.S.", + "#X@X).] 8 3 x 7 3 g [ l.[ 7 9 1 5 d % ).(.#X)./.>X(.#X/.(.W./.(.#X#X#X#XOXXXXXE.J Q.XXQ.W.W.XXXX+XXX+X+X+X#X+X+X+X@X+X+XXX+XXXXX+XXXXX+X+XXXXX+X!.OXW.W.!.XXOX@X@X%XOXXXE.E.E.E.XXE.E.E.E.E.E.E.E.E.E.E.K E._ E.E.J E.K K Q.E.G F H H F H F H H H H J H F H H H G L T.L J F F F K A A K H G L H F J H L H F F F F F F A A A F A G L G L G G J S A A A A ! ( E ( A ! ! ^ R E G G J V J G G N N G N S N L S S S S S S S S S S A A S A S S N S N N N N L N - S N N : % % % 5 & % 5 4 g 4 P 4 P 4 4 4 P 4 4 4 d x P 4 4 g 4 g d 7 4 4 d x P d 4 P ; 5 a a a a 0 a < a < < a a 0 < < < 0 < a 0 0 a 0 0 0 0 ; 0 ; 0 0 0 ; 0 0 = 0 0 0 0 0 0 0 ; 0 a < q q 0 e e e e e r e r e r r e q 3 5 3 3 3 3 3 3 3 3 3 3 3 3 8 3 3 3 q q q < 1 5 < 2 2 2 2 2 2 2 7 7 7 7 3 8 8 7 7 8 7 7 8 8 7 7 8 3 7 7 7 8 [ 8 8 7 8 7 3 8 3 8 8 8 2 8 2 8 2 2 1 1 Y Y Y .XcXxXxXxXxXcX. & KXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXbXxXcXX C nXxX+ + 1 1 + 1 1 V.DXF.ZXDXDXFXFXFXFXFXFXFXLXLXFXFXLXFXFXFXFXLXFXFXLXFXFXFXFXLXDXA.GXV.# # 1 # 1 # [ VXVXHX$XvXvXvXjX X X].]. X%X%X%XkXkXkX$X$X$X X X X X]. XvXvXvXbXCXVXVXNX@ @ # @ < 0 0 0 q < q 1 k.# V.6 Y Y ].j.[ [ g < @ 0 0 e g s a g 0 s s 0 s w k 0 p c c p s = E /.Y.V C * * $ X * C * * & X ( k o.b.O.n.n.b.n.n.n.n.n.n.H.n.A.n.H.A.A.n.M.A.S.S.S.S.S.S.M.", + ").).).).OX[ k.SXl.l.7 2 8 8 j.l.[ d _ ).(.).#X#X).(.(.).(.(.+X#XOX#X#X#X@X#XXXQ.XXXXQ.W.XX+X+X+X+X+X+X%X+X%X+X+X%X#X+X@X+X%X+X+X#XXX+XXXXX+XXXXX#XW.XX!.OXOX@X@X@X@X#XOXXXE.W.E.E.W.E.E.E.E.E.XXE.E.E.K XXJ H E.E.' _ G E.E.E.K K F H F K H F F F H H H H H H J G G G G R.R.H F A A A H T.T.G G J L F H L H H F F F F F L J L H H G H V G L G G F A A D A A ( A ( E R R E G G G G G G J G J J J J J G N S N S S S S S J A A S S S S J N S S $ N L N N N N N L N N N & ; % 5 % % & d 4 4 4 4 4 4 4 4 4 4 d 4 4 4 d 8 P d 4 4 d d 4 4 4 4 % 4 4 ; % = 0 a a a a a a < a a 5 0 a 0 a a < 0 0 0 0 < 0 = 0 0 0 0 0 0 0 0 0 0 0 a ; 0 0 ; 0 0 0 0 0 0 q 0 0 < 0 0 e e e e e e e e = q 5 2 3 5 2 3 3 3 3 3 3 3 3 3 3 3 3 7 3 7 3 3 5 2 < 1 2 2 2 7 9 2 3 8 7 8 7 7 7 7 7 7 8 3 7 7 8 7 7 8 7 8 8 7 8 7 7 8 3 8 7 7 8 8 2 8 a.8 2 2 5 1 1 Y cXxXxXxXxXxXxXxXxXnX.X X VXPXPXPXPXPXPXPXPXPXPXPXPXPXUXbXnXxXY . . . C jXxXjX+ + 9 9 1 9 x VXLXFXFXGXLXFXGXFXLXLXLXLXFXLXLXLXFXLXLXLXFXFXLXLXFXLXLXLXLXLXFXGXUX) + + 1 1 + + T VXCXCXBXkXvXvXvX X XU ].]. X X X]. X X$X$XvXvX X$X X X:XvXvXvXNXNXCXCXNX& # # < # # @ < 0 1 < q m BXV.V.V.V.V.CX& k.o X * # # # + # < = < a 0 0 s w e s 0 s s a s w s s p w w k ; E >X*X;XJ.C * * C N ].lXY * X d p p p o.O.b.n.O.b.n.n.n.n.n.n.n.A.n.A.n.A.A.S.S.S.S.B.S.S.S.", + "-X@X).).#XXX[ l.SXSXzXh.l.v.l.[ 4 XX).>X h k h h s s a f e 0 e s 0 e 0 e w w q q q e q e w w w w i w w y w y p t q < < q < x s x l b x b x l m x x 5 x 3 3 6 6 6 3 6 6 6 6 7 6 6 6 6 6 7 7 a.6 6 7 3 7 7 7 7 8 8 c m M g.4.m M M m v z f.z 8 8 2 2 2 2 9 2 8 s.8 a.a.a.s.2 2 2 9 a.2 2 2 2 9 2 R NX+ # 9 9 < # NX k.. . o . o o k. V.+ # + + X X V. k.. o o + + 9 V.. k.1 + 1 5 # 5 a < d 5 < a < 5 @ @ @ ; @ < V.X V.& # # & @ @ < < @ @ 5 # < < a < < 0 < < k.& e.o o + O @ & @ = = g f = g ; e k e = e : e e f s s : k ] 5 V.c c k p M M M M o.o.o.o.o.o.o.5.t.5.t.Z.t.Z.Z.5.Z.Z.Z.Z.", + "gXgXgXgXgX@Xf.l.SXSXv.l.v.l.l.a.4 OX,XhXhXX@X#X@X@X#X@X#X).-X-X=X/.I.I.I.I.I.I.^.).Q.^././.=XI.I./././././././././.^.T.T.^.T.^.J.J.T.Q.J.T.T.P.T.^.T.^.T.^.^.^.^.^.^.^.^.T.^.^.^.J.P.J.^.P.J.P.J.J.J.J.J.J.G J.J.J.G T.W.L.L.G Q.R.Q.R.R.R.R.Q.R.R.R.R.R.H G G H H G H H J G G L G H G H G H G H H J H T S P _ E P P _ S T E J _ S A A S J A J F F F F S d T T f T S : S E S E : d f d d d f E f E f f f f ( f T d d d d d d d d : : f f f h > h k k h k h r h h > s a g a s e s w s e q q q w e q q q i w w i w w w w w y p u l < < q 0 y l c b l l l x b x l x b x g 6 6 6 6 6 6 6 6 6 6 6 6 7 6 7 7 6 6 6 7 a.6 j.7 6 7 7 8 x M 4.M M M M M m v m m z z f.i a.2 2 8 s.2 a.a.s.2 2 a.9 a.2 2 2 2 9 2 2 9 2 2 ] k.9 + + # & 9 NX k.o o o o X + k. k.+ + + + + O V. k.o o + # + 1 V.. k.& # # @ @ @ @ < < @ < < 5 < a ; @ a % a V.X V.# # # @ # @ < < < @ @ @ a @ a a a 0 < 0 ) & k.. O O # & @ ; g = = = ; : = g s ; s s a k k : f r g s ) % V.0 s p k p o.o.b.b.b.b.o.O.n.5.5.t.Z.Z.t.Z.t.t.Z.Z.t.n.Z.", + "gXgXgXgXgXgX).3 v.SXSXv.v.l.8 5 @XhX,XhX S S D S f D d f d f T f d T f f f f E f f f d d ; ; d d f f f f f f h h f k k > k k h > k h r a k k s = s s s s s e q q q q q w i w w w w w y p p p y y p p w q l c l c c c c c c l c x l l m x c g 7 7 7 6 6 6 6 6 6 6 6 6 6 6 6 6 7 6 7 6 6 7 6 7 7 7 f.m 4.M g.M m M m v v m v v x z x x 8 a.2 2 2 a.a.a.a.a.a.2 2 s.9 s.2 9 2 9 2 9 2 R V.+ + + + 9 1 NX k.. o + + + + NX NX+ + + X # O V. k.o o o + 1 # k.. NX+ O # & & 1 @ 5 5 5 < 5 < g 5 a a ; ; ; V.X . kX+ O + # @ @ < @ 0 @ 5 @ < a @ a < ; a 0 ] # %XO X # & @ ; ; ; a : = a s a e = = k : k k g e > s r f e.5 NX= 0 s p M o.b.o.b.m.b.n.o.5.5.n.Z.t.t.Z.Z.t.t.Z.5.Z.Z.t.", + "gXgXgXgXgXgXgXgX[ l.SXSXl.f.P S f f f f f f f T f f f T ( f d d g f f f f f f h f > h k h > h r h h k h h h h k s k g s e s e e s w q q w w q e w w w y w y w e p p p y p v v c l c l c v c c v c v v m v z l x m b l g x t 4 8 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 6 7 f.o.g.M 4.M m M v M m v v m m f.f.f.i f.a.a.s.a.a.a.a.2 8 s.2 s.9 9 2 s.2 2 9 2 a.] k.o X + # 1 1 NX iX. o o + + + NX k.o X + # O # NX k.. + + + + 1 V.. ] X + O # @ 5 5 a < g a a 5 a < 5 ; @ @ ; k.X e.+ o # # # < a < < @ @ 5 @ a < ; 0 a < 0 V.& e.o o O O & & ; ; = s s = : f e k : f e > 0 s > e k s s 4.% e.@ = a s M M b.b.b.n.n.5.5.5.5.t.Z.Z.Z.Z.t.Z.Z.Z.t.Z.Z.5.", + "gXgXgXgXgXgXhXgXgXP l.l.8 4 X s b V.e.e.V.V.V.C.BXNXV.e.NXV.e.k.kXV.e.V.] e.V.k.V.V.e.V.NX] ] V.C.V.C.G.C.n.b.n.5.5.5.Z.t.Z.Z.Z.t.t.Z.t.Z.t.Z.Z.t.", + "gXgXgXgXgXgXgXgXgXgX_ d J -X-X S D S S > S ( : D f f D > ( f f E : ( d T f f f f f f f f f f f f f > h h > h h h h | j | | .;.c k c k s c p s c p y w w i w w i w w q w w w p p p p p p p c p c p c v c v c v v v v v v v v v v z c b s l s x l l l t q g t t 8 8 6 6 6 6 6 6 6 6 6 6 z o.4.g.m M 4.m o.b.4.g.M v v g.v f.f.f.f.f.f.s.a.a.s.2 2 a.2 2 s.9 8 k.* # & & & NX1 1 1 + + X o o o o o o o o o o o o o . o k. e.o + o + # 1 NX k.o X X # # @ NX k.o o O O O @ NX ] o o + + + # V.. k.o X # & & a @ @ g a 5 < < g @ ; @ ; ; a e.X ] o O + # @ < < 0 5 5 < < a a a g ; a ; d ] & ] o o + & @ ; ; : 0 k ; = s : : = : f s a 4.R & & & & & BXa k 0 = # O # O O + O # O O + # O # + # E ^ & & X & & E V.o.X.4.5.5.o.t.Z.Z.t.Z.Z.Z.Z.t.Z.Z.t.t.5.", + "gXgXgXgX7XgXgXgXgX-X-X-X-XgX S > D > S D S > E > ( S f f ( f > h f f f f f f f f f f > k f h k k h h h h | h | Q .;.k c k b c s k p y p w w w w i e w y y w i e p p p e p p p p p v c v p c v v v c c v v v v v v v v g.v c c s p l l l l s g q g x f.h.f.f.f.8 7 6 6 6 7 7 M M m M M m o.g.4.b.b.o.M M M M v M g.f.f.z x a.a.a.a.a.a.a.2 2 a.s.8 ] iX1 1 + 1 + + + + o o o o o o o X o o o o o k. kXo o + + @ & NX V.o o X # & # CX NXo o O # & @ NX k.o o o X # # NX. %XO o X # & @ a 5 a 5 g a a g @ ; = ; ; a e.X V.o o O # @ a < < q a a a a @ d a a a ; ; ] & V.O o O # & ; ; s : = f : : a k k : k a k 1.% NXr = ; = # # O # # O O # O # O # # # # @ k T & V. .o.o.5.5.5.Z.i.S.t.t.Z.Z.t.Z.Z.Z.G.Z.5.", + "gXgXgXgXgXgXgXgX-XgX_ 5 _ X E : ( > S f > S > > , k h > k f f > f f f h k > h k h h j h h | | h | j k c k s k w O.O.p w q w i w w y w w y w w e p p p p p p M M v p p v c v M c v v v M v v v v v v z z v c p c c l u z g q q s f.f.d.f.f.f.f.f.f.z 8 7 ) g.4.o.4.b.o.b.4.b.o.g.4.b.b.g.M v m m g.f.f.f.f.i a.a.2 a.2 s.2 2 9 x R k.1 1 # + + + + o + + + + X + + X + O + + o NX k.. o X * @ 9 NX e.o o + & @ 1 NX %XO o O O # # NX k.o o + O # # V.. V.o o X # # & @ @ a < a 5 5 @ ; ; ; @ ; @ V.X ] o o X # # < a < g < < 5 < @ 0 a @ d a ; V.& %XO o O O # ; ; ; ; > ; f r : g f = > a f 4.% iX0 a = = = # @ = # = @ @ @ = = = = = = 0 ( T & C. . . .o.O.5.t.Z.t.Z.Z.i.t.S.Z.t.t.Z.5.Z.", + "hXgX).-XgX-XgX).-XR k.] [ _ -XhXgX-X-XgXgX-XgXgX-XgXgXgXX+X-X).@X#X#X-X > D D > S f D f > f > > > > > > k h h h j h k k k f r .h .| | | . ...| | | h .j k j p k p O.O.p i w i e w i w y y y w p p p p p p p p v p M p v c v v v v c v v v v v v u v v v v v c p p c k c p s k k k c j j f.f.f.d.f.z f.u v b.o.b.4.b.o.b.4.b.b.o.m 4.b.M M v g.4.b.b.g.f.f.a.f.f.a.a.a.a.a.a.a.2 a.[ ] # 1 1 + # + 1 # + + # + # # + # # # O & + NX k.o o + # @ < NX e.o X X & @ @ NX iXo X X # @ & NX e.o X X X & & V.. e.o X X O @ @ @ ; < < 5 0 ; a ; ; ; ; ; ; V.X k.X X + # @ a a < g g < a a a a a ; f d a V.& e.o o O & ; = : : g : = , g = : , e > : k 4.% k.@ = ; = ; = = = = = 0 = e 0 0 0 e e : = / T & e.> k .o.X.Z.Z.t.Z.Z.i.Z.S.t.i.Z.Z.t.Z.t.", + "hXgXgX-X).gXgXgX[ l.SXSXl.8 P -XX).#X-X-XX-X=X=X=X=X=XI.I.I.=XI.I.=XI.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.U./.P.U.P.I.I.U./.I.I.I./././.P./.^./.T.P.T.T.^./.T.^.Q.T.T.^./.P.^.U.P.P.P.P.P.P.J.P.P.J.P.J.J.J.L.G J.J.G Q.Q.Q.Q.Q.W.T.Q.T.Q.T.Q.Q.R.Q.T.Q.Q.Q.G H H H H R.H R.H H H H H H H E.H E.H H H H H H K K H F ' K K F F F A A A F F F F _ K F K A E S ( D f S > D S > D D D S S E : > f h f ( f > : > S > h > j h k j h h h h h .| | | | | | . .| | | | | .j n c c c p O.p O.y w w w w w y w p w e p p p p p p y p v M p v v p v M v v v v v v v v v g.v g.z z v v . . .| j j h | . .j j .f.f.f.g.f.u v g.b.4.o.b.o.o.b.5.4.o.4.b.b.b.b.4.m M v g.g.g.m g.f.f.f.8 a.2 a.a.2 2 a.8 x ] ] + + + # 1 # 1 1 1 # < 1 < # & 1 & @ @ @ & NX e.o o + + # @ NX kXo X + & & @ BX k.X O & & & ; NX e.o X X O & 5 NX. k.o o # & @ % @ % ; < g a @ a ; ; a ; a ; V.X e.o o O & & < a g q x 0 g a a a d a a d ; e.& k.X X O & = ; ; f a > : : : > f f : f k f 4.% V.@ = @ = 0 0 g k s k k s k k k k k > s k / T & 4.= k h .o.5.5.Z.Z.i.Z.Z.t.Z.Z.Z.t.Z.Z.t.", + "-X-XX(.=X@XX#X-X=X).)./.#X#X#X).>XX S S > > S ( > D > ( S > ( > : : > : > f h > h h j h h .h .| .| ..j .| ..| ... .| | .| p j p k p p O.p O.w w w w y w i p w p p p r p p p y z p p v M v p v v c v v v v v v v v v v v f.v f.v p . .h | . . .h . .j h .v g.f.f.f.g.v b.o.b.o.o.b.o.4.b.b.o.b.M M b.) g.b.M g.b.b.g.g.g.g.f.a.f.d.a.a.2 a.2 8 2 8 ] k.+ + + # 1 1 1 < < < < < < < @ < < & @ % @ NX kXo X + & & 5 NX e.o + O # @ @ NX . kXo X O & - ; NX %Xo o X O # & V.. e.o X X # & @ ; a < < a a d @ ; ; ; ; a ; V.X k.o o O # @ ; 0 5 g g 0 g 5 a 5 g ; d ; ; e.& kXo o O & ; ; : f : f > k : > : k : > : f e.% e.# # @ @ a g s p k M c c j n M p k r k h 4.T % ) - = k .X.5.5.n.5.Z.t.S.Z.i.Z.t.t.D.Z.Z.", + "X#X#X@X).-X).X>X;X>X=X>XX S > > f > f ( : : D : : : : > > > k j h h j h .h .| . . .| ... .| ...h | | ..j M .p k O.p O.p w i w i w p p w y p w p p p p p p p p v p v p v z v v v v v v m v v v f.v v v v . . . . . . .h h . .| j j j .v f.d.g.u f.g.4.b.4.5.b.4.b.b.o.b.4.4.b.4.b.o.M g.M b.b.b.b.g.b.g.f.d.f.a.8 a.8 2 s.a.8 x R ] o + + + @ 1 < q < 5 q 5 g < 5 d a a 0 a a NX k.o X + & 1 < NX . kXo X + & & @ V.V.NXiXNXk.e./ o X O # & ; NX V.o X o O # & V.. k.o X + & & @ 5 g a a a ; ; a @ a ; ; ; a V.X e.o o # # O = ; < w q 5 a a g a : ; f : ; ] & e.O O O O & ; ; ; a > a > > : f > : > , : 8.% NX^ ) / ) C.e.C.V.C.C.V.C.C.C.C.e.e.C.e.C.BXT & ] = = e j X.4.5.5.5.t.5.5.Z.t.t.S.Z.Z.i.Z.", + "hX-X-XgX+X[ l.zXV.l.3 5 x [ l.V.[ d XX,XgXgXgXgXgXgXgXgXgXgXgXgXgX-XgXgXhXhXgXhXhXhX,XX>X>X>X*X=X;X=X=X=X=XX f ( D D E > > > D D S > h S f : : > : - , - > r > h h j h h .| h .| | . .| .| .. .| ..h | | | j k k p o.p O.p O.w w w w w w y w p p p w p p O.p p p p p v v v v z v v z v v v v v v v v p v M p .. .k . . . .j .h .| | j j h n f.f.g.f.g.o.b.o.b.4.b.o.b.o.b.4.o.o.b.b.4.o.M ) g.b.b.h.b.b.g.g.b.f.f.f.a.a.a.2 a.8 x ) [ ] o + + 1 1 < g 5 5 q x 1 g g g f g a g d 5 NX kXo o + 9 & & NX V.o X # # @ ; d ; & & $ O O X X & O & : : NX NX. X O O & & V.. NXo X O & @ & 0 d a a ; a ; a @ a ; a ; ; V.X ] X X O O # ; @ ; f s q a d % : f ; f ; : V.& %XO O + @ = ; f f f , s > > : f f > > : > ] % & & % % & % & % & % & % % & % % & % & % & % . & ^ & ; > h o.o.5.5.5.n.5.5.5.5.5.5.t.Z.Z.D.", + "gXhXX*X>X>X:X;X;X;X;X=X > ( > > > > > : : : : = , > > k h h h | r | ..| ..... ... . . ... .2.| | | | j p .p p O.p O.p i i w i i w p w w w p p p p p p p p u v p p v p z v v m v z v v m v v b j o. . . .M O. .k .. . . .h .j j | .;.j v f.f.g.M b.o.5.o.b.o.b.b.4.4.b.b.4.4.4.o.) 4.o.b.b.b.b.b.b.g.b.g.m f.a.a.a.a.a.a.i z ) R . ] o + # # 1 < w 2 g t a g g g g f d a f a g NX e.o o # # @ 5 NX ] X X O & & ; ; ; ; ; & O O O X O & & % % CX ] o X + O & # NX. ] o X + # & @ @ a @ : ; a a g ; = a : g s V.X e.o o O @ $ = ; = ; : = d : : : f : : d f e.& e.o O O & $ ; f ; > f : : > > > > f D > > e.% & ^ O = e h ..5.5.5.5.5.5.Z.n.5.5.5.5.O.5.5.", + "XX>X>X>X>X;X;X;X=X;X;X&X=X ( > > : > : : > : , : : : k > > > r h r .h | | | .. .| .r ... .| | | .| | .| M .O.p o.p O.O.p u p p p p p p p p p p p p p o.p p v v v v v v v g.z v v v v v c 2.>.>. . . .p p . . . . . . . .j .| h .| ..p p M v b.b.5.b.o.b.o.o.o.b.o.4.g.b.4.4.M M M b.g.g.b.b.b.b.b.g.4.g.g.f.a.a.a.8 z l c m [ . ] + O + 9 < < g 2 g g g g f f g g g f g a a BX* & & & * & V.o X # & & a NX& * & & & * NXo X + & @ % % ; % & & O & & O & & & : @ NX& * & & & * e.o X O # & & NX& & & * & * NXo X O O @ @ ; a ; f a a ; a ; a f ; a = V.: $ * & & * V.o o O O = = - = : = - : - : - : ; : : ; e.P * & & & * NX. . O # # = ; : f > > > k k > > : > : > 4.R O & & & * & X O & & O & * & * & * & O O & & O & * X & & * & * * & E ^ = = e h .5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.", + "gXgXX).X>X*X;X>X>X*X;X*X;X>X;X>X&X=X;X=X>X=X=X=X=X=X>X*X D : , : : : : : , > h > h > h | | r | | r h r | ...| ... .| | | | | ;.2. .M p O.o.O.o.o.O.O.o.o.O.O.p O.O.O.o.O.O.o.o.o.o.v u g.p v u z v v v v f.v v .>.2.:.>...p j .. . . . . ...k . .| j ;. .j | | j M .o.o.o.b.o.b.o.b.4.b.o.4.b.4.4.b.4.o.) o.b.b.b.b.g.b.b.b.b.g.g.b.M d.a.a.f.m v v ) [ ] o o # # < 5 s q x l g f g g g f g g g f d BX; % % % % ; k.X X O # @ < CX% % % % % % V.X O # & & ; : ; ; : % & & & & % & ; d : CX% % % % N ; NXo X X O & = NXS 5 N ; % % e.o o # # & @ = @ @ @ ; = a a ; a a ; g f V.E 4 % d N ; e.O o O O $ ; = : : : ; : : > : f : f f f e.[ d % 5 N ; iX. o o O - - : k f : k > : : > > > ( > f e.] % % 5 N ; % 4 N % % N % 4 4 : % % % 5 N % N % % 4 P % P : d N ; % R / # - > h o.o.5.n.5.n.5.5.Z.5.5.5.o.5.5.5.", + "gXX>X@XhXuXhXhXhXhXhX,X=X-X/.(.).(.=X=X-X#X-X).>XX>X>X>X>X>X>X>X>X=X>X;X;X>X*X>X&X;X;X*X*X;X}.;X;X=X>X=X=X > : : : : : : : , k > > > h > | | r h | h r h | | | .. ...| | ..| .| .,.2.2.o.o.O.O.p o.M o.v p o.o.O.o.o.O.o.O.o.o.O.O.o.o.v v v v v v z z v v v n >.>.>.2.>.>.:. .o. . .p . . . . . . .h . .h | j .j n o.o.o.o.o.o.b.o.o.b.o.4.b.4.4.o.4.4.M n g.b.g.b.b.h.b.b.b.b.b.b.g.M g.f.f.M g.v v g.] ] X X # @ < q x g g k l g g f f b f k f g g BXP d P S T T iXo O O @ @ a NXT T T T T T e.X X O & ; % d : d T ; & ; : % : % d d ; BXT T T T T S NX. X # & ; ; BXT T T T T T NXo + O # # # & ; = ; g g a a ; 0 ; ; : ; V.R T d T d S V.o o O & $ = = = : , - : : : : : f f : d V.R S S P d N NX. o O $ ; : : > : > g > > f h > f W > > e.] N S P T T T T S 4 T T P S S P T d S P d T T T d T T d P T d N P d ] ) O = > j X.5.5.5.5.C.n.Z.5.5.5.5.4.5.5.5.", + "gXX>X;X;X:XvX>X>X@X@XhXuXX(.-X).-XXX>X+X;X;X=X>X:XX;X;X;X;X;X;X;X;X;X;X}.;X;X;X;X;X;X=X>X*X>X=X&X=X&X/.I.&XU.;X;X}.&X}.}.}.}.|.&X=X&XI.U.U.U.I.P.U.L.P.P.U.J.L.J.J.L.Y.L.Y.P.I./.I.I.=X&XI.I.&XI.I.&XI.I.I.I.+X/.I./.}./.&X/.U.U.U.U.U.U.U./.L.P.P.P.U./.U.U.Q.L./.L.U.L.L.W.'.XXQ.XXQ.'.W.'.Q.W.'.'.Q.Q.Q.'.Q.Q._ V Q._ I I I I '.[ [ U _ U _ _ _ S F F K K K K K F ' K ' ' R R R R R _ K E.K K K F F _ K K ' K ( ( D ( k D ( ( ( ( ( ( ( ( h h ( D : : > > : : , : , f > > r h > h h | | | | ...| h .| .. . . . . .| | ;.;.;.1.1.Q o.M o.o.p O.b.O.O.p o.o.o.o.o.o.o.o.o.o.o.o.o.v v v g.g.v g.f.v M 4.>.>.>.2.>.:.>.2. . .o.p .. . . . . . . . . . .2.| | | .n o.o.4.b.4.b.4.b.5.o.b.b.4.o.b.b.4.o.4.M b.b.b.b.b.b.b.l.b.b.b.g.4.b.m g.M g.v v m ) R . ] X + O # < 5 g g b g ( g b g g g g g f g g CX% % % % 4 d e.X O $ - & : NX% % % % % % NXX X & & ; ; f d ; : ; : d ; ; S ; : d : CX% % % d 4 ; NXo X X O & & NXT d % % % % kXo o X # & ; & ; = f ; a f g a f ; a a : V.E 4 % % % % NXo . O O = $ : = : : : > : : S : : f : : e.R 4 % % 4 ; iXo X O & ; : > D ( > D D > h D > h h > k e.^ % % % % % % % % % % % % ; % % % % % ; % % % % % S % % % : N ; % : [ ^ O : r h .o.5.5.t.5.5.5.5.5.n.5.5.5.5.O.", + "X;X:X1X;X;X>X1X1X>X>X>X>X=X=X-X=X)./.>X#X>X+X>X+X>X;X X;X X;X X>X*XX:X>X;X*X;X;X;X;X;X;X*X;X;X;X;X;X;X;X;X>X;X*X=X/.&X&X&X}.;X}.&X;XU.|.}.}.}.;X}.}.&X&XI.;XI.I.U.U.L.U.P.Y.P.L.L.K.L.L.J.L.U.I.I.I.=X&X/./.&X&X/.&X&XI.I.&XI.I.&XU././.&XU./.+XU.U./.U.I.U.U.U././.L.U././.L.L.L.'.L.'.L.'.Q.W.Q.U.W./.XX'.XXW.Q.Q.Q.L.Q.Q.V Q._ '.L._ Q.'.I _ I I I I [ U [ [ U U [ _ ' ' ' K ' K ' K K ' K ' R R R R ' R _ ' ' K F F F ' K H ' F k D ( ( D ( h h h ( h > ( h ( Q h > > > : > > h : : : > > > h > h h > h h | | | .. .....j .| ... .| | ;.| | ;.2.2.2.;.o.o.o.O.v o.p o.o.o.o.O.o.O.M o.O.O.o.o.o.o.o.f.v v f.g.M n o.>.>.>.9.>.>.2.2. . .>.2.r . . . . . .r . . .;.| j ;. .j .n o.b.o.o.o.b.4.o.4.o.4.o.4.b.o.4.4.o.4.b.b.b.h.b.b.b.b.b.b.k.o.g.b.b.) 4.4.n ) Q ) 4.] ] X O # & a g g f f f b g k f s s g k g g f BXT S d T T T kXo O & & : : BXT T T T d N k.X O O & ; ; : f : : T : E T : d f f f d BXT T d T d N NX. O O # ; ; NXT T T T T P V.o O O O & = ; ; @ a f a a k ) ) ] ) ) ) BXR T T 4 T P iXo O O # $ = : : : : : > : : : > f f : f e.R E T d S P NXX o O $ : S D > ( h D h D D D > #.W D > e.] 4 d T T d NXNXNXNXNXNXiXNXNXNXNXNXNXBXNXNXNXNXNXNXNXNXNXNXNXBXNXBXBX( = = > k O.5.O.n.5.5.5.t.n.5.5.5.5.X.4.5.", + "gXgXX1X>X>X>X|.>X>X>X>X+X>X+X+X>X>X>X+X;X+X>X|.;X;X|.>X>X:X>X;X>X;X;X>X;X;X=X;X;X;X;X;X;X*X;X;X;X;X;X&X;X;X*X&X&X&XI.;XI.U.;X}.;X}.;X;X}.}.|.|.}.U.U.U.I.}.I.Y.U.Y.U.P.L.Y.J.J.L.L.J.L.U.U./.I././.&X/.I.I.I./.I.&X/.I.I./.U.>X&X/./.I.U.&XI.U.U./.{./.{./.{.{./.U.XXU.U.L./.XXL.XXXX'.'.L.XXXXL.XXQ.W.Q.W.'.XXQ._ E.XXXX'.XXXX_ XXI I I '.I I I I I U _ U R _ [ U _ H ' ' K ' K ' K H ' _ R [ _ R R ' R R R ' K J ' F H ' H K ( k h W ( D ( ( D ( W ( ( ( ( ( f > > > h ( h h > : > h > r > r > > r r | | | | . ...| .. ...| .. . .;. .;.| 2.2.2.2.2.2.o.o.o.o.o.o.O.p o.o.M o.o.o.o.o.M o.O.o.o.o.v g.v v o.O. .>.>.>.>.>.2.:.>.>.2.>.>. . .M j . . . . . . . .j .;.j | | ;.n o.4.o.5.b.o.o.b.4.4.b.4.4.4.4.4.M ) 4.4.b.b.b.b.b.b.b.b.b.b.b.4.b.4.4.b.) 4.) ) Q ) ] X X X X X NXO + # @ a g g b g b f k b g BXBXCXCXCXCXBXVX4 4 T T T d e.O O O = - : BXP ; T d T 4 iXX O O & ; : E f : E f T f ( f f E S f f BXT T N T P 4 iXX X O & & ; NXT T d T d d V.o O O & @ = ; ; ; = f a k V.%X] ] ] ] ] ] T T T S S 4 kXo o O $ & = : : : : : D : S : : : f : a e.R 4 S P T d NXo O O $ : : > > D D h D D D W D D ;.D ;.e.] S N d d P NXo O O O O O O $ O $ $ $ O O O $ O O O $ O $ = # O O O O & - = > k .5.5.5.n.5.5.n.5.5.5.5.5.5.5.5.", + "X1X+X$X@X@X@X;X;X;X;X;X>X>X;X>X1X+X;X>X;X>X>X>X>X+X;X+X>X>X>X$X>X>X X;X|.$X;X>X=X>X>X;X;X;X&X*X>X;X;X;X>X*X;X;X*X;X}.;X;X;X&X*X;X;X&X&X&XU.;XU.;X}.}.U.;X}.}.}.;X}.}.|.}.}.U.&X}./.&XU.U.L.P.Y.J.V J.K.L.L.L.U./.U.U./.U.I.I.&XI.&XI.I.I./.&X&XI.I.U.I./.U.=XU./.U./.U.}./././.{./.U./.U.{./.U.L././.'.XX'.L.XX'.Q./.W.XXQ.'.Q.XX'.Q.XXQ.XXG XXI XX_ I XXI XX'.I I I I I I I I [ I [ P [ _ _ ' ' K ' ' K K K ' ' R R R R R ! R ! _ ! _ _ F K ' K ' H ! ( h h k ( h W W h h W k W ( W h h > h h h h W ;.W : = h > > r r > > r h h | .| :.:. . ... . ... .| ;. .| ;. .;.2.2.2.2.2.2. .M o.o.M o.O.M o.o.o.o.o.o.o.o.o.o.o.o.o.o.v o.O.O.4.>.3.>.>.>.>.>.>. .2.2.>.>. ... .j .| | ;. .2.h . .h ;. .j | . .o.2.4.2.4.5.o.4.b.4.o.4.4.4.4.4.2.2.2.2.2.4.b.b.b.b.b.b.b.b.b.b.4.4.) 4.b.) 4.) 4.4.NXT T T S T CX+ O # ; g g g b g b b g ) f CXE T T T E T E T T E T T T e.o O $ $ : : BXE T T T T T V.o O O & : S f ( E f : ( E E f f E f d f CXT E T T T T iXo X O & & ; NXE T T E T E NXo X O O & @ ; : a ; a g g V.^ T T E T E T T T E T T T iXo o O = $ : : , > : S S > f > : : : f ( V.[ E T T T T NXo O O = - > D ( ( > D D > ;.;.D D ;.D W e.] T T T T T iXX X O O O O $ $ O $ $ O $ $ $ O = O = = O O - @ $ $ = = = : = k .o.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.", + "hXhXX@X+X>X#X1X>X;X:X;X1X1X;X1X>X>X>X;X>X;X+X;X+X>X>X>X/.>X;X>X|.;X+X|.;X;X|.;X;X;X;X;X;X;X>X>X;X;X>X;X>X&X;X;X;X;X;X;X;X&X}.;X;X;X;X;X&X}.}.}.U.}.;X&X}.}.;XU.}.&X}.}.}.{.|.{.U.U.&X}.&XU.L.Y.U.L.K.J.Y.B J.L.U.U././.U.U./.U.+XU.I.U./.I.I.&XI./.&XI./.&XU.I./.I.}.U.U.U.U./.}././.{./.XXU.'./.U.U.L.'.XX'.'.XX'.'.'.Q.L.W.Q.W.XXQ.Q.XXQ.'._ '.I XXV XX_ I I I _ _ I I I I I I I U U I _ _ _ _ ' ' ' K E.' ' ' ' _ R R R R _ R _ R R R ! R R ' F F F K K ( ( W ( W ( W ( ( ( ( ( ( h ( ( > h h D k > h > h > > > r > k > > h h h h .| | .| .... .:... .| :.;.;.2.;.;.2.2.2.>.2.2.4.4.o.M M o.o.M M o.M o.o.M o.o.o.o.M o.o.X.o.O.O.o.>.>.>.>.>.>.1.>.2.>.>.:. . .>.2.>.1.2.;.;.2.2.;.2. . .2.2. .;.| j ;.n ) 4.) 4.) 4.4.o.4.o.4.4.4.4.>.>.4.4.1.2.2.1.1.4.b.b.b.b.g.b.k.b.V.b.b.b.) 4.4.4.) ) NX% P 4 % 4 NXX X # & d g f f b ( g k b g CX; ; N % 4 5 N ; N % 4 N d V.O O O = : S BX% % % T N 4 iXX O $ ; : : : f f ( f ( f f f ( f f ( d BXN ; d 5 : 5 NXX o # & ; ; NXd 4 % % N ; e.o X X O & ; : g : h a a f V.E % % 4 % % % N : 5 N % % V.o O O O = : = a f : > ( : : : > S f > : e.R % P : 4 N NXO O O $ : : ( > D W ( W D ;.D D ;.W ;.~ r.] % T % d N NXO O O $ $ $ - , $ - , - - , - - - - : , : , , , , : , : , > > | .X.5.5.5.5.5.5.5.5.n.5.5.5.5.5.5.", + "X$X+X1X>X+X>X1X>X1X;X>X;X;X>X1X>X>X>X;X>X;X;X>X;X=X>X>X>X>X+X;X>X>X;X|.|.|.>X|.|.;X;X|.;X;X>X;X;X&X;X;X&X;X;X*X;X*X;X;X;X;X*X;X[.;X}.}.}.}.}.[.U.U.}.;X}.U.}.;X;X}.{.|.{.{.|.|.|.}.U.;XU.U.U.Y.L.L.L.L.L.L.L.U.U.U./.U.U./.{.{./.U.{./.U.U.I.U.&X&XI.&X/.+XU.I.U.+XI.=XU.+XI./.}.}.+XU./.U.+X/.U.U.XX/.L.'.Q.XXL.'.Q.'.Q.XXL.'.W.Q.XXXXQ.'.XXXX'.Q.I E.'.'.I I I I I XXI I I [ I I I I _ [ _ _ _ K ! _ F _ F A F _ R R R R R R R R ! R E _ R ' _ _ ' ' H K k ( h h ( h h h ( ( h W h ( W > h D h h h h h h h k : h > k > h k h > > ..| ;.| | . . ... . ...2.,.1.1.1.1.1.2.2.2.2.2.Q 2.n o.4.o.o.o.M o.M o.o.o.M v o.o.M o.o.X.o.o.O.X.>.3.>.>.>.>.>.>.>.>. .2.2.>.2.,.<.,.<.2.2.;.;.Q ;.| .Q .h .| j ;. .W Q ) 2.1.4.4.4.4.4.4.4.4.4.1.4.4.>.1.>.9.2.1.1.>.1.9.8.9.b.b.g.b.b.o.V.4.b.) 4.4.4.q.NXT T S P T CXO # # @ a g b g b b s b b b CXT T T T T T T T T T T T T NXX O & - : > BXT T T T T T NXX O O - ; : > : : f f T f f R ( f f E f BXT T T T T S V.o X O & ; ; BXE T P T d d NXo O O @ = = ; : : f a s f V.^ T T T T T T T T T T T T NX. O O $ $ : ; f ( ( : D : D : f : ( S f V.[ T T T T d iX. O O & : f D W D D h D h W ;.D W #.W ;.e.] d T T ; T NX$ O $ $ - - - - , , , , Z > D Z Z Z Z , > > > > > > > > > h | .X. .>.5.5.5.5.Z.5.5.5.n.5.5.5.5.5.", + "X+X>X@X+X>X1X@X+X;X:X;X:X;X1X;X>X>X>X1X;X>X>X>X>X=X;X>X>X|.;X>X+X;X+X;X X;X;X X|.|.;X;X;X;X;X;X>X*X;X;X>X;X;X*X;X;X;X&X;X;X}.;X[.}.;X[.}.}.}.}.{.}.}.}.}.}.}.;X}.}.|.}.{.|.}.|.{.|.}.&X&XU.}.U.L.L.Y.L.L.L.L.P.P.U./.L./.U.U.U././.{./.{./.{.{.U.+X&XU.&X/.U.=X+X&X&X/./.}.U.U./././.U.U.{.{./.{.XXU.XXU.U.{.'.'.XXXX'.I '.W.XXQ.XX'.Q.XX'.J I XX_ _ '.I _ _ I _ '.I I I I I U ].U I I I I U _ P [ _ _ E _ F E _ E R R R R _ R R _ E R E R ! R _ ! ! ' _ K F h h h ( h h ( h h h W h ( k h h h h h h h h h h h h > > r > h h > h r h | | . .| | >.X. ...X.2.,.2.1.1.;.,.2.1.;.>.2.>.2.2.4. .Q n o.o.o.M o.M b.M o.o.b.o.O.O.O.o.O.O.4.>.>.>.>.9.>.>.1.>.>.>.>.:.2.<.<.<.1.<.2.:.,.;.;.;.| ;.| 2.h j ;.;. .| h W k Q 1.1.) / 1.Q 1.4.4.4.>.>.4.1.1.>.1.4.9.1.>.2.9.1.9.7.b.b.b.b.b.g.g.C.4.b.4.4.) OXNXN ; % % d NXX O & ; g g b g b ( R k ( s CX4 4 N ; % ; N ; 5 % % ; N e.o O $ ; ; : BX% ; N 4 % % e.X O $ $ : : f D h ( ( ( ^ ( ( R ( ( ( ( CXP % % % N 4 NXo O # & ; a NXP d ; N 4 N NXo X O # - ; ; g > f k f f V.E % % P ; % ; N 4 N ; % : NXo O O = = , f f ( ( ( W : ( : : > : : : e.R S % % % % NXX O O $ : > > > ;.> D W W #.D | #.W W ,.e.^ N % % % N NX$ O $ - - , > Z > @.Z D #.@.#.@.@.*.@.#.#.> | #.| | { ;...:.:.3.>.>.X.4.5.5.5.5.5.5.5.5.5.5.5.5.5.", + "X-XgXX>X+X$X>X+X+X>X;X;X:X X;X;X>X>X1X>X;X;X;X>X;X>X>X>X=X;X>X;X+X;X+X>X|.|.:X|.|.|. X|.;X;X;X;X;X;X=X;X;X;X>X;X;X;X;X}.}.[. X[.}.|.}.[.|.}.}.}.}.}.}.}.}.}.;X}.|.|.{.{.{.|.{.|.|.{.{.}.}.;XU.&XI.Y.{.U.L.L.L.L.L.U.U.U./.'.U./.U.XX{.XXU.U.+X/.{./.'.{.XXU././././.=XU.}././.I.}././.{././././.XX{.XX/.'.+XU.W.'.L.XX'._ I XX'.Q.L.XXXXI XX_ XXI V XX_ XX_ '.'.'.I I I I I I I U I I U ].U I I [ U _ _ T _ ! _ A _ R R R R R ^ R E E R E E R R R R R R R E k h h h ( ( k W h ( h ( h h h ( > h h h h h h | h h h h > > > r > h | h > h | | | | . .:.o.X.X.2.,.<.2.,.<.2.2.1.2.2.:.2.>.>.4.2. .2.Q 4.M o.M o.o.M b.o.o. .X.O.o.X.o.O.>.>.>.3.>.>.>.>.>.2.>.2.<.<.<.<.7.1.<.<.<.<.<.:.2.;.;.2.2.h 2.2.;.Q | h W | W W ( Q Q 1./ 1.1.1.>.1.4.2.4.2.2.4.1.2.9.4.<.1.>.9.<.9.<.1.1.b.b.b.b.g.C.) 4.4.) 0.7XNXd N d % % NXO O & @ a s b b b b b s b c BX5 : N % 4 % 5 % N % d % P iXX O & : : S BXN d 4 P ; N iXo O $ & : > > : D f ( E ( f ( f f ( d > CXS 4 T % N 4 NXo X O & ; ; NXT T % % % % iX. O O O @ ; : : : D f f f V.E % % 4 N % % % % d 4 N ; NX. o O $ = : f f k ( : D > ( ( > S : > > e.R % % 4 4 N NXO X O $ : > D D h ;.W ;.D D ;.W ;.#.~ ;.e.] ; 4 S % % NX$ O - - > > { { #.#.#.#.$.#.=.*.*.=.=.*.=.=.<.3.3.X.3.:.3.3.3.=.3.>.>.5.>.5.>.>.5.5.5.5.5.5.5.5.t.", + ">XX+X@X>X+X+X>X$X>X:X;X;X;X;X;X;X;X>X>X;X1X;X;X;X;X;X;X>X>X;X>X|.;X>X X|.|.|.|.|.|.;X|.|.;X;X;X>X;X;X&X;X;X;X;X;X{.[.[.[.|.|.[.|.|.[.}.}.}.}.}.}.}.}.}.}.}.}.|.{.{.{.{.|.{.|.{.|.|.}.|.}.&X}.U.;XU.L.L.L._.L.L.L.L./.U.U.U./.{.U.U.U.U.U.{.'.{.XX/.{./.{.{.{.'.'.{././.I.U.=XI.+X/.}././.{.{.{././.XX/.+X'././.'.'.XX'.'.'.XXXX'.XX_ L._ '._ '._ XX_ V I '._ I _ I I I I _ I I I _ I I [ I I I I _ _ _ _ E _ E E E R R R _ [ R R R E E E R R R R ( R E R R ( ( ( ( k h h h h h h h h ( h h h > > h h W h h h h | ;.h r h h h | r | | h . .| | . . ... .2.1.1.,.2.1.2.,.2.;.2.2.>.2.>. .2.n 4.4.n o.o.M o.M M M M o.O.O.O.O.5.O.>.>.3.1.>.>.>.>.>.>.>.>.>.7.7.7.<.<.<.,.,.<.<.<.1.<.<.2.;.;. .;.;.| h | W .| h h h Q h W 1.1.Q 1.) 2.1.1.1.2.2.1.>.>.1.>.1.1.1.2.9.8.<.1.1.8.8.4.b.b.C.b.b.b.4.e.~.uXCX] ] ] ] ] VXX X & ; : f b b n b b b b c CXk.] ] ] ] ] ] T E T E T E k.X O & ; : > BXE T T T T E e.O O & - : : > D h ( ( b ( f E R ( T ( f CXE T T T T P iXo + & & ; a V.CXBXCXCXCXBXNX4 T T ( ^ ^ ^ / ) 8./ 2.1.BXCXCXBXBXNXCXVXR E T E E E iXX O O $ = f f f ^ S D ( : ! 8.8.e.e./ / BX] E E T E T CX: : T ! / 8.1.> D > W W ;.;.h D ;.;.~ #.r.VXCXBXCXBXCXCXS ( ! ` ,.7.3.r.w.w.r.r.r.yXyXyXfXyXyXpXyX-.=.3.3.3.3.3.3.=.-.-.-.>.5.5.5.3.5.5.3.3.5.5.5.5.5.5.t.", + "XX>X+X+X>X+X>X$X;X;X:X;X;X;X;X;X>X;X X;X;X;X1X:X X;X;X;X=X;X}.;X|.}.|.|.|.|.|.|.|.|.;X}.;X;X;X;X;X;X;X&X[.[.{.[.|.|.[.|.[.|.|.|.|.[.[.}.}.}.}.}.U.}.}.}.|.{.+X{.|.{.{.|.{.}.|.{.|.{.|.}.I.;XU.}.L.L.L.L.'.'.L.L.L.U./.L././.U.'.U.{./.{./.U.XX'.XX{.XXXX{.+X'.].{./.;X>XU./.U.U.U./.+X+XU././.'.'.'.XXU.L.'.'.'.'._ Q.I '.I XXI XXXX_ '.'._ Q.'.'.XXI '.I I I _ I I I I I I [ ].U I I I I I I I U _ E R _ E _ R R [ E _ R E R R E E R R R R R g R R E ( k k ( k W ( h h ( h W h ( W h h h h ( h W h W h h h h h h h h h h r h | h .| .| h | .......2.1.1.1.,.1.1.2.2.:.,.>.2.>.>.2.>.o.n 4.n 4.o.) M M M o.o.X.O.X.X.O.O.>.9.>.>.>.9.>.>.>.>.>.>.:.>.<.7.$.7.<.<.<.<.7.1.<.,.2.:.<.;.2.;.W ;.W ;.h | W h h j D ( W W / 1.1.1.1.2./ Q 1.8.1.2.4.1.1.>.9.2.1.<.1.1.<.1.8.1.1.1.1.1.b.b.4.4.b.eX7X~.iXuXiX%XoX' ] CXBXNXCXCXBXCXCXCXCXVXCXCXCXBXV.V.] / ] ^ VX: N T T P d V.O O & ; : W BXd % T S d P V.O O = - : : f > > ( ( ( ( ( f ) E f ( ( BXP d d d d T iXo X # & a a f g a & $ $ O ] NXe.] ] k.e.%Xk.iX] k.k.] BX, : - $ O O ] E 4 d d 4 N NXX O $ @ = f f f D W > W D BXNX] ] ] ] ] ] E d S 5 S T ] ] ] ] ] ] ] VXD D h W ;.W ;.;.;.;.#.#.~ ,.D D D - - $ ! CXk.] %XV.] kXkX] %XV.] e.] ] NXe.e.k.e.KX=.=.-.3.y.3.y.-.-.-.-.-.3.>.>.5.5.3.5.3.3.5.p.3.5.5.5.t.", + "#X@X@X>XX/.C.H.B.B.B.v.h.g.k B ].+X>X+X$X+X>X$X>X;X;X1X;X:X;X;X1X;X:X;X|.;X;X|.|.;X|.|.|.|.;X|.|.}.|.|.|. X|.|.|.;X|.;X|.;X&X}.;X&X>X;X>X;X{.[.].[.[. X[.|.[._.[.{.|.|.}.}.}.}.}.}.}.;X}.Y.{.{.{.|.{.|.{.|.{.{.|.{.|.|.[.;XU.&X;XU.L.L.K.L.L.L.V L.L.L./.{.'.U.U.U.+X'./.'.{.{./.{.XX{.{.XX{.'.XX'.I./.I./.I.>XU.+XU.U./.{.+X'.+X/.XXXX'.XXQ.I XXI '.'.I U U I _ '._ '._ Q.'._ I _ _ I _ I V I I I _ U I I I ].[ I U _ U I _ U I U U _ _ _ _ _ R R R R R R R E R E E [ R b R R R R R R ( ( ( h ( k ( h k h h h h h h h f > h h h h | h | W h h | | h h h | | | h .h | .| | :.>... .,.1.1.,.2.2.:.2.,.2.2.>.2.2.>.2.>.>.>.Q n Q o.4.o.M o.o.O...O.X.O.O.O.X.>.>.>.3.>.>.>.>.>.:.2.>. .>.<.7.7.<.<.<.<.<.,.<.7.<.1.<.2.,.;.;.;.h ;.h ;.W | ;.| h W D ~ W 2./ 1./ 4.1.1.~ ,.,.<.1.1.9.>.1.>.1.9.>.9.9.<.9.1.1.4.1.e.1.1.e.4.b.e.7X7X).7XK K F L $ N NXS T ; T T % S T T ; d T T BXg f : - $ $ NXP 4 S 4 d T ] X O - : : > BXP d % T T d NXX O $ : : D D D ( R ( R ^ ^ ^ ( ( ( ( E BXd N N d S d NXX O $ & ; a d f d - : & O ] T d P P d T ; 4 P S T T T BX: = - = O O ] R d N N d d iX. $ - - - E h D ( D ( ~ > iXR P T T T P T 4 N 4 N d % N % T T T T T BXh > > #.D | #.W ;.;.,.,.,.#.#.~ > > : & ! ] T S d d : T ; : T d P T T % d P N ; N VX=.=.=.-.w.y.-.-.-.y.pX-.-.9.5.3.3.5.>.5.3.3.3.3.3.3.5.5.", + "X+X;X}.;X:X;X|.|.:X;X;X;X;X X;X;X;X|.;X|.;X;X|.|.|.|.|.|.}.|.|.|.|. X|.;X|.|.;X;X|.|.}.U.;X&X;X;X}.[.{.[.{.[. X[.|._.L.K.'.{.}.}.}.}.}.}.}.U.>X}.{.{.{.+X|.{.{.|.{.{.|.{.{.|.|.|.}.I.;X&XU.L.K.L.L.{.L.L.L.K.L.L.XX{./.'.U.{./.'.+XU.'./.'.{.XX{.XX{.XX'.XXXXU.I./././.=X/./.+X/./././.XX/.U.XXXX'._ '._ I _ '.[ U [ U _ XX'._ XXI '._ XXV '._ V _ _ I _ I I I I _ [ I I I I I U I _ I U I I [ %X_ _ R _ R R R R R R E R R R R R b R R R R R f ( ( ( h ( k ( ( h h h h k h h h h h h > h h W h h h W .h | h h .| h | | | | . .:...:. ...:.,.1.1.,.1.2.,.2.2.;.2.2.>.>.>.>.>. .X.4.o.Q o.n o.o.X.o.O. .O.X.+.X.X.X.X.>.>.>.>.>.>.3.>.5.1.;.:.>.>.<.7.<.,.<.7.<.<.7.<.,.<.,.2.:.:.2.1.;.W | W | h ;.j | W D D ( W ,.1.2.1.1.W / ;.,.,.,.1.8.1.1.1.>.7.1.<.<.9.1.1.1.1.4.1.4.8.1.,.1.rX7X).~.~.~.K H L - S NX% N d N % % % % % % N ; P BXg : : S & $ NX; N % % d % ] O O & : : D BXN : 5 N % % NXO O $ : > > D D ( R ( ^ ^ ( ^ ( ^ ( ^ ( BXN : 5 N % % kXo O O & : f d f : : - & & e.T % % : N 5 % % % % % % % BX- = $ = = O e.E 4 % % N % iXX $ $ - L Z K D ! D W ~ D NXR T N % % % d N ; % 4 N ; % % % % N ; % CX: > > D W ;.;.:.;.;.,.#.#.;.#.~ D > : : ' ] % % % % N 4 % % N 5 % ; N % N 5 : N 5 BX$.*.=.=.-.-.-.-.-.-.-.-.-.-.p.5.3.5.3.3.5.3.3.3.3.3.3.3.", + "#XX}.{.k B.B.B.H.SXm.N.v = I jX`.|.;X}.}.}.}.;X;X;X:X;X;X X:X;X;X;X;X[.:X;X|.;X|.;X[.|.;X[.;X}.|.}.|. X|.|.;X}.;X;X|.}.|.}.}.;X;X}.}.;X}.].[.].[.{.[.{.{.K.K.K.K.K.K.[.;X}.}.}.}.}.}.}.|.{.{.{.{.{.|.{.{.|.{.|.|.{.|.{.|.|.}.U.'.L.K.'.L.'.L.L.L.L.L.'.L.U.XX/.'.XX'./.'.'.{.XX{.{.XXXX'.'.{.XX'.'.W./.}.}./.U.}.U.U.}.U.{.{.XX'.XXXX'.XX'._ '.'.'._ '.U I U I '.XXI I I _ '._ I _ '._ '.V I V U I I I I I I I I [ I ].[ I I U I I I I _ R R R [ R R R R E R T R R [ R R R R R b R E j k ( k h h h h h h h h h h h h h h W h h W h | | W W h .h | h | | | | .h h ..:.>.:. ...2.1.,.1.,.2.<.2.2.,.;.:.,.,.;.2.:.:.2.>.>. .Q 4.n .....O.X.X.O.X.X.X.X.X.X.X.>.>.3.>.>.>.>.>.>.>.;.;.:.| $.7.$.7.<.<.<.<.$.,.<.2.<.2.,.,.;.;.;.;.h 2.;.W h ;.;.h ( D D W W / Q / 1./ / W ,.,.,.8.1.<.<.1.2.9.9.<.1.7.9.1.e.1.1.1.1.,.~ ,.' 7X7X7X7XeX4X~.K F L F NXN T d T T d T T T T T T E NX: S - $ : - BXT T T T T T NXO & & : > W BXd T T T T P e.X O $ ; : : > W ( ^ ( ) ( ( ) ( ( ( / ( VXT T T T d P iXX O O $ : : a > S S : - $ NXE T T T T T T T T T T T T BX& - & $ $ $ e.R T T T P d iXO $ $ - Z Z Z %.@.*.D D ( r.[ T d T d T T T T T T d N T T T T d N 4 BX- : > > > D ;.,.,.,.,.$.,.,.,.#.D D > > 8.] T P T T d T T S T T T T T T T T T T S BX#.#.#.=.=.-.-.-.-.y.-.y.-.-.p.3.3.5.5.5.3.p.p.3.p.3.3.p.", + "X+X}.[.].@ z N.B.N.h.N.O.r %XvXkX_.U.}.&X[.}.;X;X:X:X;X;X X;X;X;X|.;X:X|.|.:X[.[.;X|.;X|.}.;X|.|.;X|.|.|.|.|.|.;X|.|.|.;X|.}.;X}.}.}.;X}.{.[.[.[.].[.].{._.K.L.`.K.K.K.'.K.U.}.}.}.;XU.&X}.{.{.{.{.+X{.|.}.{.+X|.|.|.|.{.|.{.{.'.L.L.{.L.'.L.L.'.L.L.'.L.'.U.L.W.{.U./.'.U.{.U.{.W.{.'.{.'.XX+X'.XXXXXX/.+XI.U.U./.}.+X&X+XW.XX/.XX{.XX'._ _ '.'._ I _ ]._ U I I _ _ I I XXI XX'._ V _ V _ _ I I I U '.I _ '.I I '.I I I I I I [ I I I I I _ [ R ' R R R E E E R [ ( R R R R R R R R ( ( k h h h Q k h k h h h h h h h h h W h ( h h W h W | | | W h .| .| r > r > >.>.| :...:.1.,.2.,.2.<.2.;.;.,.2.;.,.:.;.,.;.;.;.2...X.o.o.X.X.o.X.X.X.X.X.X.X.X.X.X.o.X.5.>.>.>.>.>.>.>.>.>.:.;.;.| | 7.7.<.<.<.<.<.<.<.,.<.<.:.:.,./ ;.;.Q ;.W ;.h ;.| Q ;.~ W ~ W W D W W W ~ ~ ~ ,.,.,.<.<.,.<.8.<.1.7.1.1.9.<.1.1.1.1.Q / W ,.1.7X#X7X~.eX4X4X~.K K F K NXT T T T T T T T T T T T E iXS - S S : S BXN T T T T T e.X $ $ : > f BXT T T T T T iXo $ & : S ( ( ( / Q ^ ^ ^ ^ ) ^ ( ! ( / BXT T T T T T NXX O $ & S S L S D D : L : NXE T T T T T T T S 4 T T T NX$ $ - - - - e.R T T T d T NXX $ - - Z Z Z %.Z @.*.Z *.iXR T T T N T T N d T T S 4 T T T T T T P BX: - : > D ;.;.;.:.#.,.7.<.<.<.;.;.#.W D q.] T T T T T T T T T T 4 S T T T T T T T BXZ Z #.#.$.=.-.y.-.y.y.-.-.-.-.5.5.3.3.3.3.p.3.3.p.3.3.r.", + "+XXU.=XU./././.U.{.U.'.W.'.XX_ ].XXI _ '._ '.I I I U I I _ I _ '.I I _ I I XX_ '.XXU V _ U [ I I [ I I [ I I I I I I I I I I I I _ _ [ R R R R _ R R R R [ R b R b R ( R R ^ R b ( ( ( k h h h h h h h h k h h h h W h h h | Q | h Q W | | | | h { ..{ { ....:.;.:.2.,.,.1.,.1.2.2.,.2.,.;.,.:.2.,.;.:.,.;.;.;.>.;.:.....X.X.X.O.X.O.X...X.+.X.X.X.X.X.X.>.>.5.>.>.>.3.>.>.:.;.#.;.$.7.6.7.<.<.3.<.<.:.<.,.<.1.;.;.;.2.;.;.W ;.;.;.W W ~ ~ D ! W ~ ~ D ( W W W ,.~ ,.1.6.,.1.8.1.,.7.1.7.<.<.9.1.4.1.~ D ~ ( ~ K 7X7X7X7XuX7XeXeX4X~.K ~.] X . o X . X . X o X . o X NX$ % - : : S BXo o . X o X NXO $ % : S ( BXX o . X o o NXO $ & : : > D Q ^ R ) ) ^ / ^ ( ^ ^ ~ ( CXo o . X o o iXX O $ % - : S D A S : D : NXX X o . X X . X X . X X . iX$ $ $ $ - : iX& . . X o X rXO $ $ L L Z @.@.*.@.*.%.*.aX% X o o X X o X X . X X o . o X o o X . e.O & : > > ;.;.;.,.7.#.7.<.<.<.<.<.<.;.#.iXT o o o X o X o o X . . X X o . X . X X NX- - Z @.$.-.-.-.y.-.y.y.y.-.0X3.3.5.p.X.y.X.r.3.3.r.p.w.", + ">X}.[.[.[.vXbXbXvXbXkXbXvXvX].].bX].`.}.}.U.}.}.;X;X;X:X;X;X:X;X;X;X;X;X;X;X:X|.;X|.;X;X|.|.|.|.}.|.|.}.|.|.|.|.;X|.|.;X|.}.|.}.}.}.|.}.}.;X{.{.{.].[._.[.{._.K.K.K.K.K.K.'.K._.[.{._.L.}.}.;X}.}.{.{.{.{.{.}.|.|.{.{.{.|.{.{.|.|.{.{.'.L.L.L.K.'.L.'.L.L.'.Q.'.'.L.'.'.{.L.'.U.'.XX'.'.XX'.'.'.'.'.XXXXI XXXXI /.+XU.>X/.}.+X/.W.{.XXXXXX'._ I _ I _ '.'._ '.I [ I U _ _ '._ _ I _ I I I I I _ _ I I I I I I [ [ ].U U [ I I I I I I [ '.I I I I _ R R R R R _ R R [ R R [ ) R R E R R ( R R ( ( R ( R E ( ( h k h h h h W h W W h h h W h | h | Q ;.| h | { { ..r { | | :.>.| | 1.1.1.,.2.1.,.1.;.2.;.,.;.,.;.,.<.;.;.;.;.;.:.:...:.:.X.{ } X.X.X.+...X.X.X.X.>.X.X.X.>.>.>.>.>.>.3.>.>.3.:.| h ,.7.7.<.7.<.<.<.<.<.:.<.<.;.,.;.;.;.,.,.,.~ ,.,.~ ,.~ W ~ ,.W ~ ~ D D D ~ W ,.6.,.6.6.,.,.<.<.<.8.9.<.<.9.<.1.1.8.0.D D D ( 7X7X7X7XuXeX4XeX4X4X7X~.eX%X$ & & & * & & & X * * O & e.& $ : S D D BX& # & & X & NXO $ $ : > W BX* & O & O O NXO O $ : : ( D ( ^ ^ ) ^ ^ ) ^ ^ ^ ( ! ~ BXO * # O O * iXX $ & N - L Z D D D D D : iX% O & * # & * * & $ * O * iXO $ - - $ , iX% O & * & * V.O $ $ - Z K @.K *.%.#.@.*.iXS & O * $ * O * & & * O * & & * & & X & NXO $ , : > #.2.;.<.6.7.#.<.$.<.<.<.<.<.<.r.R * & & & * * * # * # * & & & X & O # O NX- , > } $.=.-.y.-.y.-.y.p.-.-.-.3.y.$.y.$.y.$.p.3.3.3.y.", + "[.[.*X}. XHXHXbXbXbXbXvXvX X].Y $XY `.U.;X}.}.}.}. X;X;X X;X;X;X;X:X X;X|.;X[.;X;X|.|.|.|.|.|.|.|.|.{.|.}.;X|.|.|.|.;X|.}.|.{.}.|.}.}.}.}.;X{.{._.[.].[._.]._.U K.K.'.K.K.K.K.L.L.[.{.{.Y.{.Y.{.U.|.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.|.{.{.L._.L.'.L.'.L.'.'.L.L.'.L.XX'./.XX'.XX'.'.'.XX'.'.'.+X'.XX'.XX'.XXI I XX'./.I.U./.I.U./.XXQ.XX'.I I I XXI ].'._ _ I I XX].I I I I I I I _ I V _ I I _ V V V _ I _ I I I I I U I ].I I [ I [ I I _ I _ I _ ] R R _ R _ ] _ R ^ R R R R R R R R ( R ( ( R R ^ R ( ( ( ( E ^ ^ ( ( W ( ( h ( h W h h h W Q h h h > | h | h { | { ....2.:.:.,.1.<.,.2.,.:.2.,.2.1.;.,.2.:.,.;.;.;.;.#.;.;.:.| :...| ..X.X.X.X...} X.X.O.X.X.X.5.X.X.X.X.3.>.3.>.>.>.>.>.>.;.#.<.3.$.<.<.<.<.<.<.<.<.<.:.<.,.,.7.<.6.,.,.,.6.,.,.D W D ~ ~ ~ ,.D W W W ~ D 6.,.,.#.,.6.6.*.,.8.<.1.1.9.1.7.4.8.0.*.0.: A K 7X7XOX7X~.7XeX7XeXoXeX4XtXBXiXiXiXrX%X' ] ' ] ] ' ' ] S $ $ S L D ` q.iXiXiX] ] ] T $ $ : : f W e.BXe.e.] ] ] S O - ; : > D W / ^ Q ^ ) ^ / / / ~ / ~ ! e.NXiXiX] ] ] S X $ $ - L L Z K Z D D S D 6.iXiXe.] ] R ' ^ ' ^ _ ' ] S $ $ - L L : ~ e.iXq.e.e./ S $ $ - L Z Z Z *.@.*.%.%.$.=.iXiXiXiXe.8.] / ' ' ' ^ ] ' R ] ^ ' ! ] E $ = : , > W ;.;.<.$.7.7.7.<.w.<.7.<.<.<.9.fXfXiXtXtXq.8.` 8.] 8.] ` / 8.' ] ] 8.' W - - Z D $.$.y.-.y.-.p.-.-.-.=.-.-.3.$.y.y.y.y.-.y.y.-.y.", + "[.&X}.[.[.`.].].].].].'.].]. X_.B ].`.}.U.[.}.[.}.:X|.;X;X;X;X X X;X:X;X:X[.;X|.|.;X:X|.|.;X|.|.|.|.|.|.|.|.|. X|.|.|.;X}.|.|.{.}.}.}.;X}.|.{._.{._.[._._._._.K.K.'.K.K.'.K.K.K.L.{.{.{.{.{.Y.{.}.}.}.{.{.{.{.{.XX{.{.{.{.{.{.{.{.{.|.{.'.'.{.L.'.L.'.L.L.'.'.'.L.'.'.'.'.Q.'.XXXXXX'.'.XXXX'.'.'.XXXX_ XX'.XXXX'.XX}.I.&X/./.{.'.XX_ I ]._ _ I I I _ XXI I '._ I I [ I I _ I _ I I XXI I J I I _ V _ U U ].U I [ I [ I U _ U I I I I I I U I _ [ R R _ [ R R R ' R R R R b R R R R R E R R R R ^ R ^ R ( R ^ ( ! ( ! ^ ^ ~ ( ~ ! ( D W W h h | W > h | | h | { ..{ | ..:.2.:.:.:.,.1.1.,.2.,.,.2.2.;.;.;.;.,.;.;.:.;.;.;.#.| ..;.......{ X.X.X...X.....} X.X.X.X.X.>.X.4.X.>.>.X.>.3.>.3.>.>.:.:.3.<.7.<.<.<.$.3.<.<.<.<.<.$.<.6.<.6.6.6.,.,.,.,.D ,.~ ~ W #.~ ~ ~ ~ D ~ #.` ~ ~ ,.,.,.,.6.*.6.<.8.9.<.7.<.<.6.eX*.0.0.K D ).7X7X7XuX7XtX7XtX7XeX7XeX~.4XK ~.H L $ $ * $ * $ $ * & $ $ - - D D K ,.K D S : - $ $ $ - : S ( W W W D D ; & $ $ $ & - S > W ~ / / / / / / Q ~ / / / ~ ~ ! ! D S - $ $ $ $ $ - L L H %.Z K K Z K D D S - - - $ $ $ X O $ $ X $ $ $ $ - L Z Z D D Z D - - $ $ $ - - L Z @.*.#.%.#.%.%.*.%.*.@.Z - - $ $ $ $ $ $ O X $ X X X O $ O O O $ - : h ;.;.>.7.$.7.$.7.7.7.7.w.$.w.7.=.&.&.%.@.Z - - - $ - $ - $ $ $ - $ $ $ - - - - Z #.$.$.p.-.-.p.-.-.y.-.0X0Xy.-.y.$.-.$.-.y.y.-.-.y.", + "[.[.}.[.}._.$X$XjX].'.].$XjX X].]._.K.[.[.}.}.Y.}.;X:X|.:X;X:X;X;X;X|.;X;X;X|.;X;X[.|.[.|..X|.|.|.|.{.|.|.|.[.[. X|.|.|.[.[.{.|.{.}.}.}.}.{._.{._._.].[.{._.K.K.K.K.K.K.K.K.K.K.'._.Y.[.{.{.{.}.L.L.B {.+X'.{.{.{.{.{.{.{.{.{.|.{.|.{.{.{.L.L.'.L.'.L.I L.L.'.L.'.'.I '.'.'.'.'.'.'.'.XX'.{.XX].'.XXXX'._ _ XXI _ XXQ./.&X+XI.XX_ _ _ I [ I I I I _ I I XXI _ XX].I I I I _ '.I I J I _ XX_ V J I _ U U U [ I [ I I I _ U I _ I I I [ XXI _ [ [ R R R ^ _ _ ' R R _ R _ R R R R R g R R E ( R ( R ( ( R ! ( ^ ^ ( ( E ~ ( ! ~ ! ! W W W h D h > h { { | > { | > { > { { ;.;.;.,.;.;.1.,.2.,.,.2.,.;.,.;.;.;.,.:.;.;.#.:.| ;.;.:...:.....$.X.X.X.X.} ......X.X.X.X.X.X.5.X.>.X.>.3.>.>.>.>.>.:.:.<.3.3.w.<.$.3.7.<.$.3.$.$.3.<.<.<.6.7.6.6.6.6.~ ,.6.~ ,.~ ~ *.6.,.,.~ ,.6.~ #.,.6.,.6.6.6.6.<.,.6.<.,.7.1.8.7.*.*.*.*.*.eX4X7X7X~.7X~.7X7XtX7XtXuXeX4XeX4X~.*.H G L L L - $ $ $ $ $ - N S S A D ~ *.,.D D S : - - $ ; : f W ~ ;.W ! D : : - & & - : : D W D K ,.` / ) / 8.K ~ K ~ ~ ~ ~ ! D D S S $ N $ $ - : L Z Z ~.Z %.K %.Z D D > L - $ $ $ $ $ $ $ $ $ $ $ $ L L Z K Z Z Z L - - - - $ - - Z D D *.%.*.$.*.#.*.*.%.%.Z Z L - - $ $ $ $ $ $ $ $ $ $ O $ - & = = : > > 2.:.<.*.q.=.5Xw.5Xw.5Xw.5X5X=.0X0X5X%.%.Z Z L L - - - - - , - - - , - - - Z , > #.$.w.} -.-.-.y.y.y.y.=.-.-.-.y.-.y.-.-.-.y.-.y.-.", + "}.[.}.[.[._.vXkXvXB ]. X$X$X X].].`.K.}.[.U.U.[.;X;X:X|.;X;X;X:X:X|.;X;X;X;X:X}.:X|.|.|.|.|.|.|.|.|.[.|.|.{.].].[..X|.{._.[.].[.{.}.|.}.}.[._._.B B {.]._.`.`.K.K.'.K.K.'.K.K.U K.'.U.{.Y._.K.V B B V _.{.{.].{.{.{.{.XX{.+X{.{.{.{.{.}.{.L.'.'._.L.L.'.L.L.'.I '.'.I '.'.I '.V I L.V I U U U U U U U N V P N I U _ L.XX/./.{._ XX_ _ I _ I I [ _ ]._ _ I _ _ V _ I I I U I I _ U U J I U _ _ U N N U U [ ].U U I I I I I I I '.I [ _ I _ _ R R R R _ R R R ' R R _ R R ' _ [ R R E R E R ( R R R ! E ( ^ ( ^ ( ^ E ( ! ! ! ~ ^ ~ ! ~ W ;.> W > > | ;.{ | { h { ..{ { { | 2.:.,.#.;.;.,.2.,.2.,.~ #.~ ;.W ;.;.;.,.#.#.;.;.;...| | :...X.X.X.X.} ..X.} ..{ ..X.X.3.X.X.X.>.X.>.>.:.>.3.:.<.$.<.<.7.3.3.7.7.$.7.$.w.<.7.$.3.3.3.$.3.6.6.6.,.6.*.6.6.~ ~ ,.~ ~ *.~ ,.6.~ #.` ,.6.~ ,.6.6.,.6.,.6.6.#.7.<.7.7.*.7.*.*.*.4X*.4X).4X7X7X~.~.4XtX4XtXuX4XtXuX4XeX~.K K H L L L L N L L - L - S L D K D *.6.6.#.D D S : L S - D D W W / / W ( > : - : & : : D D ! D ` K K 6.6./ ` K *.~ K D D D ~ D S : - - : S S L L Z Z K Z %.K %.K K D D D L L - - - $ $ - - - - - L L L L Z Z K %.Z Z > Z - - - - L Z Z *.#.*.*.$.$.*.*.%.%.%.Z Z Z L - - L - - - - - - $ - - - - - , : D D D $.=.2X5XyX5X5Xw.yX5Xw.5X=.yX0X0X3X5X&.=.%.Z Z Z Z L L Z , Z , Z > , { > > > @.#.$.$.$.y.-.y.y.y.y.y.y.-.-.-.-.-.-.-.-.-.y.-.-.-.-.", + "[.*X[.}.|.{.bXbXkX].`.].$X1X X]._.`.K.}.[.[.[.{.;X:X;X:X:X|.;X|.|.:X;X X;X|.[.;X|.|.|.|.|.|.|.|.[.|.{.|.|.{.[.{.{.|.]._.[.]._._._._.{.[.}._._._.B B _.[._.`.K.`.`.K._.V K.K.K.K.K._._.{._.'.B B B C U '.{.{.{.{.{.{.{.{.{.'.{.{.{.{.{.'.{.'.L.L.L.'.L.'.V U I U I V U V U U U I U I I U V U V V N N U N N N N U P U J '.'./.XX_ XX_ I _ I XX'.I '._ _ '._ '.'._ _ I XX_ _ I I I _ U U U U U U I U N P U I [ U [ U [ I [ [ U I [ I I I I I _ R R _ R [ ' _ R R _ R _ ' _ ' R R _ ( R ( R E E R ^ R R ( E ( ^ ^ ^ ! ~ ( ~ ~ ^ ! ~ ! ~ ! D ;.W > > ;.> > | > | > | > { | { ,.;.#.,.;.;.:.;.;.,.;./ 1.;.;.;.#.W W #.;.;.:.;.{ :...;.{ ....:.X.} X.X.........X.X.3.X.X.X.>.>.X.>.X.X.:.3.<.<.<.3.<.$.$.3.<.3.3.7.3.<.$.$.7.3.$.$.<.3.$.3.6.6.6.6.,.6.6.6.,.,.6.*.,.6.*.6.6.,.6.~ ` #.,.,.,.6.6.6.6.7.0.*.*.*.7.*.7.*.*.*.4X' 4X).7X~.7X7X7XuX7XuX4X4XtX7XeX4XeX4X~.4XK K K L F L H Z A L K D K D 6.*.6.6.6.6.6.D D S L L L L K D ~ ,.1.~ ~ D S > : S D D D ~ ~ ` ` *.6.*.K *.6.*.*.D ,.*.K *.D K K Z S L S L L Z L K K %.%.K *.Z %.Z K Z D Z L L - L - L L L L L L L L Z Z %.%.%.K %.Z Z D L Z L D Z D *.*.*.$.*.*.%.*.=.%.=.=.*.%.Z Z Z Z L L Z Z L L L L - : L Z Z Z Z Z Z %.%.=.5X5X5X5X5Xw.5Xw.5X5XyXw.0X9X0X0X&.&.&.%.%.Z #.#.#.@.#.#.#.#.#.} } #.@.#.$.$.$.$.y.y.y.y.y.y.y.y.y.-.-.-.-.-.-.-.-.-.-.y.-.-.-.", + "[.}.}.}.}.[.bXbXbX$X X].vXkX X]._.`.{.[.K.K.Y.|.|.;X|.|.[.;X:X X|.|.;X[.|.;X;X|.|.|.|._.[.|.[.|.|.[.[.|.[.|.{._.[.].[.[.[.[.`.`._.`._._._._._._.`.V _._._.`.K.K.K.K.`.`.K.K.K.K.K.V K.'._.B '.'.'._._._._.{.{.{.{.].{.{.{.{.{.{.{.{.{._.L.'.'.L.L.L.V V V I V '.U '.V '.V '.V V U V V U U V U P N Y N U Y N N U U P I _ '._ _ _ _ _ _ XXI _ _ I I _ '._ _ _ I I I _ '.V U _ U _ U _ U U _ _ U P U U P _ U I ].[ ]._ I U _ _ _ _ I I XX_ [ _ _ R R R ' R R R R ' R ' R _ _ _ R ' R R R ( ^ R R E E R E ^ ( ~ ( ^ ~ ~ ~ ~ ( ~ ~ ! ~ ^ ~ ( W > ;.| | { | { { { | { > ..{ { ,.;.,.;.<.;.;.#.:.;.,.;.;.,.;.W W W D ;.#.W { | #.;.;.....X.X.X.X.} X.{ } X...{ } ..X.$.>.3.:.X.:.<.$.*.$.,.<.<.<.<.<.<.<.<.3.3.=.w.$.$.<.w.$.3.7.$.3.$.3.$.3.$.6.,.6.,.6.,.6.6.6.6.*.,.*.~ *.6.*.~ ,.,.6.,.6.,.*.,.*.*.4X=.=.0.*.7.7.*.K *.*.4X7X7X7X7XuX7X~.7XtX7X7XeX4X4XuXtXeXeX4X~.K 4XK K K ~.K K *.K *.K *.` 7.7.7.0.*.0.*.~ D K Z K K #.K %.*.*.*.6.~ W ! D D D D D D ~ 6.K 6.` K *.*.K *.*.*.K ~ K #.K K D K K Z K L L Z K Z %.Z %.%.K %.%.K @.Z K Z D D Z Z L L L Z L Z L L Z Z Z Z K Z %.Z %.%.K Z D D Z D Z K #.*.$.=.*.q.*.*.%.=.%.%.%.%.%.%.%.Z @.*.Z Z Z Z D D Z Z @.K #.%.Z *.Z %.*.2X5XyX5X5X5X5X5XyX5X5XpX5X0X9X0X0X5X5X5X5X&.&.=.$.$.$.$.$.$.$.$.} $.$.$.$.$.$.$.y.y.y.y.y.y.y.y.y.y.0X-.-.-.-.-.-.-.-.-.-.-.-.-.", + ";X[.[.*X[.{.JXbXbX X].$XkXvXjX'.B `.[.Y.[.}.[.[.:X[.|.|.|.{.;X;X:X|.;X:X:X[.|.;X|.;X X[.{.|.{.|.[.{.{.[.{.{.[.[._.[._._._.[._..X_.[._._._._._._._._._..X`._.`.U `._.K._.`.K.'.K.K._.K.K.'.K._._._._.'._._.'.{.{.{.{.{.{.{.{.{.{.{.L.L.'.{.L.L.K.V '.I V U V I U U '.U U I U U U I U U U V U V U V N N N N P N N N N _ '.XX'._ _ _ I _ I _ U _ _ U S _ I XXI I _ _ I _ _ _ U _ U _ U _ U U U U _ U I [ I U [ U I R R _ [ _ _ _ _ _ [ _ R ^ ' ! R R R [ R R R _ R _ ] _ ' [ ' ' _ _ R R E ! ( R ! ^ ! ! ^ / ~ ! ~ ~ W ! ~ ~ ~ ! ~ ~ ~ ! ~ W W > h > ;.> | h h { | { | { | ,.,.;.:.;.;.;.;.;.#.| ;.W ;.;.;.W D h #.h #.;.#.| { ;.{ } X.X.X.X.X.X.X.......{ ....{ X.X.:.<.*.$.$.6.$.$.$.<.<.<.$.<.3.<.$.<.<.7.<.<.w.3.$.7.$.3.3.w.$.$.3.$.3.<.7.<.6.,.6.6.*.*.~ *.6.6.6.,.6.6.,.,.6.~ ,.,.6.*.=.=.*.*.*.*.=.=.q.*.*.*.4X*.7X7X7X).7X7X~.4X7X7XtXtX7XuXeXtX4X4XeX4X4X~.4X4X4X2X4X2X4X4X2X*.*.0.*.*.q.*.*.7.6.7.*.*.*.K %.K *.*.*.*.*.*.*.*.*.#.W D D ~ #.6.,.6.6.6.*.*.0.` *.K K *.*.*.K *.K *.K *.D K Z K D Z K K K *.K *.%.K *.*.K Z *.%.K Z D L Z Z Z Z 2X2XZ 2XZ K %.%.%.2X%.2X%.%.%.%.%.D *.*.#.%.*.=.*.*.*.=.=.=.=.&.=.=.%.=.*.%.%.*.%.%.%.%.*.Z #.*.%.%.&.&.%.%.%.%.%.=.5X=.5X5X5X5XfX5XpX5XpX5X5X0X0X0X0X0X0X0X5X5X5X5X5X=.=.=.3.$.y.$.$.y.$.$.w.y.$.y.y.y.y.-.p.y.-.p.-.y.y.-.-.-.-.-.-.-.-.-.-.-.-.-.wX", + "[.*X[.}.}.[.kX X].].].].].].`._._.`.[.[.[.[.[.[.|.:X|.;X:X{.|.;X:X[.;X X;X}.;X;X|.|.|.[.[.}.}.|.{.[.[.[.[.[.[._.[._..X`.[.`.`.`.`..X`.[._._._._._._.`._._.K.`.`._._.`.`.`._.'.K.`.K.'.'._._._.'._.'._._.'._.{.{.{.{.{.'.{.{.'.{.'.{.'.U.L.L.L.L.L.K.'.V V U V '.I U '.I I V U V V V U I U V U N N P U N N Y P U _ P P N _ V _ U _ _ J U _ U R U _ N _ _ _ I '._ V _ I XX_ _ I _ U U _ I U _ _ P _ U I I [ I [ I _ R ' _ _ R R _ _ _ R ' ! ' R ^ ' R R R ' ' R _ ' R R R ' _ _ ' ' E ( ! ! R ! R R ! ( ~ ! ^ ! ~ ~ ~ ( ~ ~ ~ ~ ! ! ~ ! ( ~ > h h > | > | | | { | r { ..W ,.;.,.;.;.;.;.;.;.#.W #.,.W ;.W D W { h #.| | #.{ | { ..X.X.X.} X.X...X...........{ X.X.{ $.*.$.<.$.6.7.*.7.<.<.$.3.$.7.3.$.3.3.7.$.$.7.<.3.$.3.w.3.$.3.3.$.3.3.7.,.6.,.,.6.~ *.,.*.6.6.*.~ 6.*.6.*.6.,.6.6.*.=.=.2X*.4X=.4X4X*.7.=.*.*.*.4X4X7X7X).7X7X7XuX4X~.7XeX7XtXyX4XtX4XuX7X4XeX7X4X4X5X4X4XyX5X4X4X4Xq.tX*.q.tXyX0.*.0.4Xw.*.*.4X*.*.K %.*.*.*.*.*.*.*.*.K D #.~ *.6.6.0.*.q.*.0.4X*.*.4X*.4X*.*.*.*.*.%.*.*.K *.%.%.K 2X*.2XK %.K *.%.*.*.*.*.*.*.K %.%.Z %.%.%.Z %.%.2XZ 2XZ *.%.%.%.%.%.%.&.&.%.%.%.*.*.#.*.$.*.*.=.q.=.=.*.5X&.&.=.5X=.&.=.=.4X=.&.*.=.%.=.*.=.%.=.&.=.&.=.&.=.&.=.3X3X5X5X5XyX0X5XyX5XyX5XyXpX0XwX0X0X0X0X0X5X0X8XpX8Xw.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.p.-.-.-.pXwX-.-.-.-.-.wX-.-.-.-.-.-.-.", + ";X[.*X[.[.}.&X}.|.|.Y.;XU.[.}.U.}.[.[.K.[.[.[.}.|.;X:X|.{.|.{.:X X|.;X|.|.[.;X;X;X[.|._.`.K._.[._.[.K.K.K.[._.[.`.`.B `.`.`.`.B `.`.`.`.K.K.B _._.`._.B V `.`._.B B B V K.B `.K._.V K._.V V _._.'.`.].B B '.].{.{.{.{.{.{.{.U.{.{.L.L.L.'.L.'.U I U V U U '.U U I V U V I I U I U U U V V U N U N N N N N N N N _ N _ N J _ _ _ _ _ _ _ _ _ P _ P _ _ I _ _ J I _ I _ _ U J J U J _ U _ _ I I U U _ [ U [ U I I _ ' _ R ' _ _ _ _ ' R ^ R ' ! ' ! ! ' R [ R ' R _ R ' _ R R ' _ ! A ! ! ! E R ^ R ! ~ ^ ! ~ W / ~ ( ~ ~ ~ ! ~ W ! ~ ~ ~ ~ W h #.| { | { > { { { { { { | ,.,.;.;.<.3.>.<.<.;.;.;.#.;.;.D W #.;.#.;.#.{ ;.#.> #...} X.X.X.X.} X.X.} ....} { X.X.#.X.X.<.#.*.7.$.#.<.#.$.$.<.<.$.<.<.<.$.7.3.3.w.$.$.w.<.$.$.3.3.$.$.3.w.$.0.7.6.6.6.6.6.6.6.` ~ *.6.6.*.6.*.0.*.*.*.3X5X2X2X*.5X=.*.=.=.*.=.0.7.2X*.*.4X7X7X7X7X~.7X4X7X7X4XtXtX7X7XuX7XuX4XtX4X7XyX7X8XuX5X7X8XuX5X5X4X5XyXyX4X=.q.4XyXyXq.4X4X4X4X2X2X*.*.4X4X%.4X4X=.4X4X4XK Z Z *.*.*.0.0.*.*.*.*.*.4X4X*.%.4X*.*.*.*.4X4X2X*.4X*.K *.K %.*.*.%.2X4X%.2XK *.*.%.*.%.%.%.K %.K *.%.*.*.%.2X2X2X%.*.*.%.%.*.&.*.%.&.&.2X%.=.=.*.*.=.*.=.0.=.=.=.5X=.=.5X&.5X=.5X&.=.5X=.&.5X5X&.&.&.=.3X=.0X&.&.=.&.&.&.&.=.5X5X0XyX8X0X0XpX8XfX0X5X0X0X9X0X8XwX0X0X0X8X0X6Xy.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.-.0XwXwXwXwXwXwXwX-.wX-.-.wX-.-.-.-.wX-.-.-.", + "[.}.[.;X;X[.;X}.|.L.}.}.}.Y.[.[.[.[.[.Y.[.[.[.`.[.|.:X;X X{.|.:X:X|.;X;X|.[.}.[.[.K._.`.[.Y.[.K.[.K.[.`._.`.[.`.B `.`.`.`.`.`.`.`.B `.B `.`.`.K._.B B `.`.B `.B _.Y `.B `.B B `.`.B K._._.B B _.`.B B '.'.U _.{.+X{.{.{.{.{.{.{.'.L.L.L.L.V V _.V '.U V '.V U K.U '.'.V U U V U V U V U V U V N U N Y N N Y N U U N U U U _ _ _ J U _ _ _ _ _ _ _ _ I I '._ I _ XX_ _ _ I J _ _ V _ _ N U _ U _ _ N _ _ I [ I [ R _ ' _ _ _ _ _ _ ! ' R ! ! R ! ! R ' ! ' R R _ _ ' _ ! _ ' _ ! ! D ! ! ! ! R ! ! ! ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ! ~ ! ~ ! ~ W > W | > { h h { r | { | { ,.,.,.;.,.3.>.>.3.>.3.<.>.>.<.:.:.;.;.;.:.;.| #.{ :.{ ..:.X.X...X.#.X.X.} X.{ X...X.#.X.} X.X...#.$.#.*.$.$.#.$.6.7.$.<.w.3.$.$.<.<.$.w.3.$.w.w.$.3.$.w.3.$.3.$.0.q.*.q.0.*.*.0.6.6.6.,.6.6.6.6.*.6.*.2X5X3X2X2X5X*.5X5X*.4X=.*.=.*.*.w.4X2X7X7X7X4X7X7X7X7X7X7X~.4XuX7XtXuXyX7XyXyX7XuX5X7X8XuX5XuX8XyX8XuX8XyX5XyX*.yXyX5Xq.4XyX5X4X4X2X4X4X~.K 4X*.4X*.*.2X2X*.=.4X*.K K %.*.2X4X7.7.*.4X*.4X%.*.2X4X*.*.*.*.*.%.2X4X&.%.%.*.2X2X2X*.%.4X*.2X%.%.*.4X*.4X*.%.2X4X%.%.%.%.%.%.2X2X%.2X%.*.%.%.*.5X%.2X&.*.&.%.2X%.4X=.w.7.7.*.q.w.7.=.&.=.=.5X=.=.=.0X=.5X5X3X&.-.&.5X=.&.-.3X-.5X0X3X0X0X3X&.&.0X5X5XyX5X8X5X0X8XfXyX0X5X0X0X0X0XwX0X0XwX0X0XwX0X8XpXy.y.y.y.y.y.y.-.-.y.p.y.-.0X-.9X9XwXwXwXwXwXwXwXwXwX-.-.-.-.-.pX-.-.-.-.-.-.-.", + "}.}.;X[.[.;X[.;X{.}.[.}.[.[.[.[.[.K.[.[.[.[.[.[.[.[.[.[.[._.[.|.|.|.:X[.[._.[.[.[.K.[.`.`.[.[.K._.K.K.K.K.K._.[.`.`.`.`.`.`.`.`.`.B `.B `.B `.B `.B `.`.`.B K.K.`._._.B `.B V `._.B K.K.'.K.K.K.`.U '.`._.Y '.'.{.{.{.{.{.'.'.L.L.L.K.V V '.V V U V V U V U I I I I U I I K.U I U U V U U U N Y N P N N N N N P N _ J P P _ _ J _ _ _ J _ _ P _ _ N _ J _ _ J _ I _ V _ _ _ _ N _ _ J U J J _ U U _ U _ I _ I _ _ ! _ R R _ R ' ^ R ! ' ! R ' ' R ' R ' ^ ^ _ ' R R ' _ R ' ' ~ D ! D ! ' ! ! ! ! ! ! ~ ~ ~ ~ / ~ ! ~ ~ ~ / ~ ^ ! ~ ~ ~ ~ W ;.{ | ;.h | { | { { h #.h ,.,.;.,.<.1.>.<.>.>.<.>.:.:.:.,.:.:.;.:.;.;.#.| #.:.>.>.:.X.X.} X.X.} X.:.#.X.X.} } X...X...{ X.<.6.$.,.,.$.7.$.<.$.<.3.$.$.w.<.$.3.3.$.3.<.$.3.3.$.3.$.$.3.3.*.0.*.q.*.4X0.4X*.4X4X*.0.*.*.6.*.6.*.3X3X2X5X5X2X=.5X5X*.2X=.4Xw.4X*.w.*.2X2X7X7X7X7X7X7X7X7X7X7X7X7X7XtX7XtX7X4XuX7X7XyX7XyX7X5XuX8X5X8X8X5X8XyX8X5X4X4X4XyX5Xw.5Xw.4X2X4X4X%.2X%.%.2X2X4X4X*.*.4X4X4X2X@.Z *.*.5X2X4X4X2X4X4X*.4X2X4X%.4X*.*.2X4X%.4X%.4X2X4X2X*.2X*.2X4X%.2X2X4X2X2X2X%.%.%.%.%.%.%.*.*.%.%.*.2X=.%.2X%.=.2X*.2X=.2X*.&.2X2X&.5X&.&.&.&.=.=.w.=.=.4X5X5X5X3X&.5X5X5X&.5X5X&.-.3X3X0X5X3X3X-.5X&.0X&.-.9X9X&.&.9X3X5X0X5X5X8XfX8XyX5X0XyX0X0X0XwX0X0X6X0X6X0X6X0X0X0X0Xy.y.y.y.y.y.-.-.-.9X-.wX9XwXwXwXwXwXwXwXwXwXwXwXwXwXwXpX-.-.wX-.-.-.-.-.-.-.-.", + "[.;X[.;X[.:X[.[.[.[.[.[.[.[.[.[.[.[.[.K.[.[..X[.[.`.[.[.[.`.[.{.|.|.|.[.[.`.[.[.`.`.[.K.[.[.[.K.`.K.`.`.[.`.[.`.`.`.`.[.`.B B .X`.B `.B `.`.K.`.`.B `.`.`.Y `.`.`.`.`.B _.B `.`.B B `.'.`.B K.U '.B U _._.U Y '.'.{.{.{.{.'.V L.L.K.V V V '.V V '.V U V Y U U U U V U U V U U U V I U V V U N P N P N N V P P N I N _ N N _ _ _ _ _ _ J _ _ S E _ N S _ I _ _ _ _ _ _ _ _ J _ J _ J _ N _ J J J J _ _ U U _ _ _ ' _ R _ R _ _ ' ' ' ! _ R ! ! ! ! R R ' ! ! _ ' ' R ' R ! _ ! D ` K ~ ~ ~ D ' ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ~ ~ ~ ~ ~ ~ ~ ~ ~ W h ;.h | | { h W D ;.W #.~ ;.~ ;.;.>.3.>.<.>.>.>.<.:.<.:.;.{ :.:.;.:.#.| ;.:.>.>.:.{ X.X...{ X.X.#.X.:.{ X.$...X...} X.:.#.7.#.7.$.<.$.#.#.7.7.<.3.<.$.3.$.<.3.w.$.$.3.w.$.3.$.$.3.$.q.q.*.q.0.4X*.K 4XeX4X0.4X4X*.eX4X*.0.*.4X3X3X3X2X5X5X2X=.4X=.*.=.=.*.*.4X2X2X2X7X2X7X4X7X7X7X7X7X7X7X7XtXuX7XuX4XyX7X8X7X8XtX8X8XuXtX8X8X7X5X8X8X5X8X8X4X5X5X5XyX5Xw.4X2X2X2X2X2X2X2X2X7X2X7X2X4X4X2X4X4X=.*.Z *.5X5X3X8X2X2X2X7X2X4X2X2X*.2X4X4X*.5X2X4X2X2X2X=.4X2X4X2X4X2X2X4X2X2X2X2X2X2XK %.2XZ %.%.Z 2X2X%.%.&.*.&.4X*.4X%.&.&.*.&.=.2X2X&.5X&.&.&.&.&.&.=.w.w.=.=.5X3X5X-.=.0X5X-.5X0X0X5X0X5X&.0X-.9X&.-.-.9X0X-.9X9X9X9X&.9X9X9X5X5X5XyX0X8XfX5X5X8X0X0X0X9X0X0X0X0X0X0XdX8X0X6X5Xy.-.-.&.0X0X0XwX0XwX0XwX9XwXwXqXwXqXwXqXqXwXwXwXwXwXwXwX0X-.-.-.0X-.-.-.-.-.-.", + "[.[.*X[.[.[.*X[.Y.[.Y.Y.[.[.Y.`.Y.[.[.[.[.[.[.[.[.[.`.[.[._.`._..X|. X[.[.`.K.K.[.Y.[.K.K.K.K.[.K.[.Y.K.K.`.[.`.B `.`.`.`.`.B B `.`.`.`.`.B B `.`.B `.`.`.B `.`.B B B B `._.V B K.B K.B B V V `.Y U `.].].B '._.U {.{.{.L.L.K.L.V L.L.V B U V I U V B N V U U V U U U '.'.U I V U V U U U U N N V N N Y P N N U U _ N _ _ _ _ _ _ _ _ _ _ _ _ U _ _ U A A U U J N _ J _ _ P N _ J U J _ N _ U J U N J _ _ _ _ _ R R _ ' ' _ ^ R R R ' ! ! ' ' _ R ' ' R R ' ' _ _ F _ ' ! ' ~ ! D ! D ! ! ~ ` ! ` ~ ! ~ ~ / ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ^ ~ ( D | > h D ;.;.~ ,.W #.~ D W W #.#.;.>.<.<.>.>.<.:.<.:.;.:.:.:.#.{ :.:.#.:.{ :.>.:.X.{ { X.} X.} X.X.#.X.X.{ } X.{ X.X.#.*.$.*.<.6.#.$.7.7.$.#.$.$.<.3.<.3.$.3.$.$.3.3.$.$.3.$.3.3.3.w.*.0.0.*.4X4X0.4X*.4X*.4X*.*.4X4X4X4X4X4X4X3X5X8X3X3X2X3X4X2X=.4X4X4X2X2X2X2X2X7X7X7X7X7X7X7X7X7X7X7X8X4X7X4XtX7XyX4XuXuXyX8X7XuXyX5X8X5XuX5X8X8XuX7X8X8X7X4X*.yX4XyX4X*.2X~.2X4X2X~.~.2X2X2X2X5X2X4X5X5X4X5X4XK 2X3X5X8X3X2X8X2X2X2X2X2X4X4X2X4X=.4X2X2X5X4X=.2X4X5X4X5X%.2X8X2X2X2X2X8X2X2X5X3X2X2X2X2X%.2X2X2X2X5X%.5X&.2X=.%.&.*.5X&.5X&.2X2X3X2X2X3X&.3X3X3X3X3X=.5X3X-.=.&.3X3X&.3X3X&.&.&.=.&.&.&.&.&.9X3X3X&.&.&.9X9X9X9X-.9X&.9X0X0X6X8X0X8XfX5X0X5XfX0X0XwX0X0XqX0X0X8X0X6X0X0X0XwX0X-.9X0XwXwX0X0XwX0XwX0XwX0XwXwXqXwXqXqXqXqXwXwXwXqXdXpX-.0X-.-.-.wX-.pX-.pX-.", + "[.[.[.:X[.[.[.[.[.[.[.[.[.[.[.Y.[.[.[.[.[.[.[.[.[.[.[.[.]._._._.].[.[.[.K.[.Y.K.K.Y.K.[.K.[.[.`.[.[.[.K.K.`.`.`.`.`.`.`.`.`.B `.Y `.`.`.`.`.`.`.`.`.`.`.`._.`.`._.K.Y B B K.K.B B K.B _.K.K.`.V _._.Y _.`.U '.U Y {._.'.'.U K.L.V L.V V V B V V V U U V V Y U V U V N Y B U V I V U V U U V N V P N P N N N U N N _ U N _ _ _ _ _ _ _ _ _ _ _ _ A _ _ _ _ _ _ _ _ _ _ A _ J U _ U _ U J J J J N J J J U _ _ _ _ _ ! ! _ _ ! _ ! _ ! R ! _ ! _ ! ! _ ! ' R ' ' _ F ' ! ' ' ! ~ D ! K ~ ` ~ K ~ K ` D ~ ! ~ ~ ~ ~ ~ ( ^ ~ ~ ~ ~ ( ~ ~ ~ ~ ~ ~ W W W W ~ W ~ ~ W W W ~ ;.W W #.W #.<.>.<.:.<.:.<.;.:.;.:.;...#.:.{ ;.| :.#.:.X.>.:.X.{ X.X.X.{ { X.X.#.} X.X...} X.X.*.<.,.6.#.$.6.,.#.,.*.$.$.#.$.$.3.$.3.3.3.<.w.w.3.3.$.3.y.$.*.0.*.tX*.*.yX*.4X*.4X*.4XK *.4X4X*.4X4X4X4X4X2X5X3X2X3X5X2X2X4X4X2X2X2X2X2X2X2X7X7X7X7X7X2X7X7X7X7X8X7X7X4XtX7XtXuX4X7X4X7X7XtX8X7X8XuXyX8XuX8X7X4X8X8X8X8X8X8X2XK %.2X4X2X~.2X~.2X4X2X2X~.2X2X8X2X8X5X4X4X8X8X8X&.5X8X6X8X3X8X3X2X8X2X2X2X2X4X4X4X5X=.4X2X4X2X2X4X5X2X2X2X2X2X2X3X2X2X3X2X3X3X2X3X2X2X2X2X2X3X2X2X&.2X&.&.3X&.*.2X2X2X2X2X2X3X&.3X3X3X3X&.3X3X&.3X&.&.5X5X3X3X9X5X0X-.3X&.&.=.&.&.%.%.&.%.&.&.&.&.&.%.&.&.&.9X9X9X9X-.9X9X9X3X0X5X5X5X8X8X5X8X0X0X9X0X0X0X9X9X0XwX0X0X0X0X8X0X0X0X3X3X0XwXwXwX0XwXwXwX0X9XwXqXqXqXqXqXqXqXqXqXqXwX-.-.0X-.-.-.-.-.-.-.-.-.0X", + "[.:X[.*X[.:X[.:X*X[.*X[.[.[.[.[.[.:X[.[.[..X[.[..X[..X[.[.[._._._._._.[.[.`.`.[.[.[.`.[.[.`.Y.`.[.`.[.`.[.[.[.`.`.`.`.`..XB `.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`._._._.B Y `.K.`._.K.'._._.K._._.`.U '._.U `.Y U Y '.U '.U `.I K.L.K.V '.V V V V V B B U U V U P P V U V P U N Y U I V U U N P P N Y N N N Y N N P J U N T _ E _ _ _ _ _ _ _ J _ _ N J _ A N _ _ _ J U _ J _ _ J J J N _ _ V _ A N _ J J N J _ _ _ _ R _ ' R ' R ~ R ' ! ! ! ! ' ! ' ! ! ! R ' ' ' ' K ! K D K ~ D ` ! D ~ K ~ ! ~ ' ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ^ ~ ~ ~ ~ ~ W W ( W W W #.W ,.W W ~ #.;.D ;.W 2.:.>.2.>.:.:.:.;.#.;.#.#.;...#.#...#...:.:.:.X.{ X.{ X.X.X.X.} { X.X.{ ..X.X.{ $.#.<.$.$.<.*.#.*.#.#.#.#.<.7.$.$.<.<.$.$.$.3.$.$.3.$.3.$.3.$.7.*.tX*.tXyX4X*.0.K K 4XK 4X4X4X0.4X4X*.4X4X4X4X3X5X2X3X2X5X3X3X2X&.2X2X2X4X2X2X7X8X7X7X8X7X7X8X7X7X7X7X7X7XuX4X7X4XtXuX4XyXtX8XuXtX8X8X8XyX8X8X5X5X7X8X5X8X7X8X8X2XK K 2X%.2X2X~.~.2X7X2X2X2X8X2X8X8X2X8X5X7X8X8X6X6X6X8X6X6X8X2X8X2X8X2X8X4X2X4X4X4X2X5X5X5X5X5X5X2X2X2X5X5X3X5X8X5X8X2X3X8X8X3X8X3X3X2X2X3X3X2X3X&.2X3X2X2X3X2X2X2X2X3X2X3X3X3X3X3X3X3X3X3X3X3X&.3X&.9X5X&.&.&.0X&.3X0X&.0X&.&.&.&.&.&.&.&.&.&.%.@.%.&.9X9X9X9X9X9X9X9X0X0X0X9XwX8XfX5XyX8XfX5X0X0X0XqX0X0X0X0X0X8X8XwX0X0X0X0X0X0X5X9XwXwX0XwXwX0X9XwXqXqXwXwXqXqXqXqXqXqXqXqX0X9X0X9X0X9X0X5X-.0X0X-.wX-.", + "[.*X[.:X[.[.:X[..X[.[.[.[.[.[.[.[.[.:X[.[.[.[..X[..X[.[.[.[._._._.]._._.`.`.[.`.`.[.`.[.`.Y.`.[.`.K.[.[.`.[.K.[.[.[.`.`.`.`.`.`.`.`.`.`.`.`.`.`._._.`.`.`.`._.`.B B B `.`.B K.K.`.K.K.`.K.'.'.K.`.`.'.Y U ].Y `.'._.U ].U _.U U U U V V V V V Y U V V Y U Y N U V P U N N Y N Y N P N V U N P N N U N N V P N N U N _ V _ _ _ _ _ E _ J _ _ _ P _ _ U A N S _ _ _ _ _ _ _ J J U _ N J V _ J J U J J V J S _ U _ ! ' R R ' _ R ! ' ! ' ! _ ! ! ! ! R ! ! F ! F F F ' ' K ,.K #.K ~ D D ~ K ~ ' ` ' ! ~ ~ D ` ! ! ~ ~ ~ / ~ ^ ~ ~ ~ ~ / ~ ! ~ ~ W W W W W W W ;.W ,.~ W #.#.W D ;.:.:.,.<.:.<.:.<.:.;.;.#.;.#.| { #...#.#.:.:.:.X.} X.{ X.{ X.$...X.{ X.X.X.{ ;.#.#.,.,.#.#.*.#.,.#.#.*.#.#.$.$.$.$.:.$.3.$.3.3.$.$.3.$.3.3.=.q.=.q.*.*.0.4X4X0.*.~.%.K 4X4X*.K 4X4X4X4X4X4X2X4X2X5X3X3X3X3X2X3X3X4X2X2X5X2X2X2X2X2X2X7X7X7X7X7X7X7X7X7X7X7X4X7XtX7XtX7XyX7X4X8X5XuX8XyX8X4X8X4X8X8X7X8X8X8X4X8X8X8X~.2X2X2X4X2X2X2X2X7X2X2X7X8X8X8X8X8X2X8X8X8X6X6X6X6X6X6X8X3X8X2X8X2X8X3X2X2X8X5X5X4X5X3X8X5X8X3X5X8X2X3X8X3X3X2X3X3X8X8X3X8X3X3X3X6X2X6X3X3X3X3X&.2X3X5X2X3X2X2X2X3X2X3X3X3X3X3X3X3X3X6X3X3X3X3X3X9X&.9X&.&.&.&.&.9X&.&.9X&.&.&.&.&.&.&.&.&.@.&.&.-.9X9X9X9X9X9X9X9X9X9X9X9XwX0X6X5X5X0XyX5X0XwX9X0X0X9X0X5X5X0X0X5X0X0X5X0X5X3X3X5X3XwXqX0X9XqX0XwX9X9XqXwXqXqXqXqXqXqXqXqXqXqX9X9X6X9X6X3X0X9X9X0X0X0X-.", + "[.[.[.[.*X[.[.[.[.:X[.[.[.[.[.[.[..X[..X[..X[.[.[.[.[..X.X[._.[.[._.[._.Y.[.K.Y.[.`.[.`.[.[.[.`.[.[.[.`.[.`.[.K.`.`.`.[.[.`.`.`.`.[.[.`..X`..X`.`.`.`..X`.`._._.`.B `.`.`.`.`.`.K._.`.K._.K.K._.'.Y `.'._.'.'.U U U '.Y '.Y '.Y V Y Y V U V V V B V N V U V U V Y V N Y N P V N C Y N Y P N V N N N Y N P N N Y N _ _ _ _ _ E _ _ _ E _ U E _ _ J A _ _ _ _ P J _ P J U _ _ _ A _ J _ P U J J U J _ _ J _ _ _ _ _ _ _ ' ! R ' ! ! ! ! ! ' ! ! _ ' ' ! ' E ! S A ! K ! K D D ~ ~ D ` ~ ~ K ! D ' D ' ~ K ! ~ ~ ` ~ ~ / ~ ~ ~ ~ ~ / ~ ~ ! ~ / ~ ~ W / ( W / W ~ ,.W W W ;.W #.#.;.,.:.:.:.;.:.;.:.:.;.{ ;.{ ;.#.{ ..{ { X.:.X.:.{ X.{ X.{ X.{ } X.X.} X.{ ..:.#.#.*.*.#.,.,.#.#.#.,.*.,.#.#.#.:.<.$.$.$.$.3.$.3.$.3.$.3.$.7.7.*.7.=.0.yX4X*.eXq.4XK *.4X*.4X4X4X4X4X*.4X%.4X*.4X4X3X3X3X5X8X5X2X2X2X2X2X2X2X8X2X8X2X8X3X7X8X7X2X7X7X7X8X7X7X7XtX4X4X4XuX7X4XuXyXuX8XyX8X7X8X4X8X7X8X5X4X8X8X8X8X8X8X2X2X2X2X4X2X4X2X2X2X8X2X2X3X8X8X8X8X8X2X8X6X6X6X6X6X6X6X3X6X3X6X2X8X2X3X3X~.2X2X5X5X8X8X3X8X5X8X2X8X3X3X8X8X8X8X8X6X3X3X6X3X8X8X6X2X6X6X3X6X3X3X3X5X3X3X3X3X3X3X2X3X3X3X3X3X3X3X3X3X3X3X9X9X3X3X3X3X9X3X&.&.&.&.&.&.0X9X&.&.&.&.&.&.&.&.&.&.&.&.9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9XwX0X8X0X8XfX0X0X0X0X0X0X0X6X5X5X5X3X3X5X3X&.&.3X3X2XqXwXwX9X0XwX9X9XwX9XqXqXqXqXqXqXqXqXqXqXqXqX9X6X6X9X&.0X0X-.0X-.0X0X", + ":X[.[.:X[.:X[.[.[.[.[.*X[.[.[.[.[.:X[.[.[.[.[.[.[.[._.[.[.{.[.{.[._.[.[.[.`.`.[.Y.`.[.Y.K.`.[.Y.[.Y.[.`.[.[.[.`.Y `.`.[.`.`.`.`.`.`.`.`.`.`.`.`.`._.`.`.`._.`.`.`.`.`._.`.`.`.K.`.K._.`.K.K._._.`.'.U `.`.Y '.Y '.Y U U U '.Y U Y B Y V U V V C V Y V U U V U N U P N N V Y C P N Y N N V N Y N N P N N N P N P N _ N _ _ _ _ _ _ _ E _ _ _ _ J P _ _ N P J _ J _ J _ J N _ J U V _ J J A J J J V J J J J U _ _ R _ ! _ _ ' _ ! _ ' ! R ! _ ! ! _ ! ! _ ! A S A K ! D K *.~ ~ D *.~ K *.,.` ~ ~ ~ ~ ! ~ K ! ~ ! ' ~ W ~ ~ ~ ~ ' ~ ~ ~ ~ ~ ~ ! / ~ W W ( W W / W W ;.#.W W #.;.W ,.:.<.:.:.;.:.;.#.:.#.> #.| ;.{ ..#.{ #.X.:.:.X.{ X.{ X.X.X.X.........X.{ #.#.K ;.#.*.#.,.#.6.#.#.#.,.#.*.,.<.$.<.$.$.3.3.$.$.3.$.3.$.w.*.w.7.*.0.*.tX*.0.4X4X*.K *.K *.*.4X4X*.K 4X4X4X4X4X*.4X2X3X3X2X2X3X2X3X2X2X2X2X2X2X8X2X2X8X3X8X2X7X7X7X8X7X7X7X7X4XuXuXuX4XyX7XtX4X7X8X7X8X8X7X7X8X8X2X4X8X4X8X7X4X8X8X8X8X2X2X2X2X2X2X2X8X8X2X7X6X8X6X8X8X8X8X8X8X6X6X6X6X6X6X6X6X8X2X2X6X2X8X2X2X2XZ Z 2X3X8X8X6X5X8X8X3X8X3X3X8X3X8X8X6X8X6X3X8X6X6X6X8X3X6X6X3X6X3X5X3X3X3X3X3X3X3X3X3X3X3X3X6X6X3X3X3X6X6X9X6X3X6X3X9X3X9X&.&.&.&.&.&.&.&.&.&.9X-.&.&.9X&.9X&.&.&.&.9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X5X0X8X8XfX0X9X0X0X0X5X0X5X5X&.&.5X5X5X3X5X&.&.3XqX9X3XqX6X9X3XqX3XqXqXqXqXqXqXqXqXqXqX6X6X6X9X6X9X3X6X=.0X-.9X0XpX", + "[.[.[.[.[.[.:X:X[.:X[..X[.[..X.X.X[..X[..X[..X[._..X[.[..X[..X_._.[._.[.K.[.[.`.`.[.`.[.[.[.`.[.`.[.`.[.`.[.[.`.`.`.B B `.[.`..X.X`.`.`.`.`.[.`.`._.`._._.`.`.`.`.`.`.B `.`._.Y `.`.'.K._._._.K._._.Y '.'._.Y '.U '.U `.`.U U U U U N Y B Y N Y B N V Y U U V Y N Y V Y P N N Y P N C P P N N N P V P N N U N N U N N _ E _ _ _ _ _ _ _ _ E _ E _ _ _ A _ _ T _ _ J E _ _ J _ _ _ J U J J U P J J _ J N _ E _ _ _ ' R ! ! ! K ! ' ! ' F ! ' ! ' ' ! ! ! A E J ! ! K ~ D ~ D *.D ~ D #.~ D ` K ~ ! K ! ` ` ! ` ' D ! ! ~ ~ ~ ~ _ ~ ~ ~ / ~ ~ ~ ~ W W / ~ W W W W W #.W ;.;.W #.;.:.;.;.;.;.<.,.:.;.;.:.:.> #.| #.#.{ X...:.X.:...X.:.X.X.{ } ..X.X.{ X.:.#.#.#.#.6.$.6.#.#.#.,.*.,.*.#.*.#.#.*.#.$.3.$.3.$.$.3.$.3.$.3.0.=.7.7.*.*.w.*.yX*.yX*.4X*.K 4XK ~.*.4X4X4X4X~.2X4X*.4X4X4X8X3X3X3X5X3X2X5X2X2X3X2X2X2X2X2X2X8X2X8X3X8X8X7X8X7X8X8XeXtX4X7XtX7X4X7X4X4XuX5XuX5X5X8X4X8X7X4X8X8X4X8X8X8X8X8X8X6X7X4X8X2X7X2X2X2X7X8X8X8X6X8X8X6X6X8X6XqX6X6X6X6X6X6X6X2X6X8X2X8X2X8X2X2XZ %.K Z 2X6X8X6X6X6X6X8X8X8X6X6X6X6X8X6X6X6X6X6X0X6X3X3X6X6X6X6X3X3X5X6X3X3X3X3X3X3X6X3X3X6X3X3X3X9XqX6X9X9X9X9X9X9X3X9X&.3X&.&.&.&.&.&.&.&.&.&.&.9X&.&.9X&.9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9XqX9XqX9XqXwXwXwX0X5X5X5X8X0X0X&.0X5X&.0X5X5X5X&.&.&.&.%.&.2XqXqX6X9X6X6X3X9X3X9XqXqXqX6X6XqX6XqXqX6X6X6X6X6XqX6X6X3X9X0X0X0X0X" + }; + +const char * +WxCasPix::m_stop_xpm[] = + { /* XPM */ + /* columns rows colors chars-per-pixel */ + "32 32 79 1", + " c None", + ". c #6c0000", + "X c #770000", + "o c #6e5900", + "O c #755f00", + "+ c #7c6400", + "@ c #83130b", + "# c #981513", + "$ c #a71c19", + "% c #b52521", + "& c #846b00", + "* c #897000", + "= c #907400", + "- c #977a00", + "; c #9c7e00", + ": c #927c12", + "> c #cd312c", + ", c #d03e39", + "< c #d44b47", + "1 c #d75854", + "2 c #da6561", + "3 c #dc6f6b", + "4 c #a48400", + "5 c #b18e00", + "6 c #b59200", + "7 c #b49b00", + "8 c #bd9700", + "9 c #bb9a00", + "0 c #bb9e12", + "q c #cc9c00", + "w c #c3a000", + "e c #c6ac00", + "r c #c6ae0c", + "t c #c9a000", + "y c #c9a800", + "u c #d1a400", + "i c #d3ab00", + "p c #d8ad00", + "a c #ddaf1a", + "s c #d3b100", + "d c #d3b800", + "f c #d9b400", + "g c #ddb800", + "h c #e1bb00", + "j c #e5bb18", + "k c #e5bc20", + "l c #dbc31a", + "z c #e8c600", + "x c #ecc800", + "c c #e8ce18", + "v c #efd30d", + "b c #f5d400", + "n c #f7d804", + "m c #fadc00", + "M c #f4db38", + "N c #fce220", + "B c #fce430", + "V c #fde748", + "C c #fde852", + "Z c #f7e465", + "A c #fce960", + "S c #fdeb6a", + "D c #fded71", + "F c #fdee78", + "G c #e59492", + "H c #fdee81", + "J c #fdef8b", + "K c #fdf08f", + "L c #fdf193", + "P c #fdf198", + "I c #fef3a3", + "U c #fdf3ae", + "Y c #fef5b3", + "T c #fef6be", + "R c #fdf6c3", + "E c #fffbe2", + "W c #fffef4", + "Q c white", + "! c None", + /* pixels */ + "!!!!!!!!!!!!!!!!!!!*&&&&!!!!!!!!", + "!!!!!!!!!!!!!!;4;-=qqqq;+!!!!!!!", + "!!!!!!!!!444448tuuyuuuqq;O!!!!!!", + "!!!!!!!!4qiiiiuuuuuuuuuqu;o!!!!!", + "!!!!!!!!4giippiuuiuuuuuuqq;o!!!!", + "!!!!!!!!4gfiuiiiuuuuphxnmm9o!!!!", + "!!!!!!!4qghfpuifhMHUUPPCm7O!!!!!", + "!!!!!!!4ihhhxZTEERYUJHZm7O!!!!!!", + "!!!!!!!4ggzgnWWRYPHHHSm7o!!!!!!!", + "!!!!!!4wggzgSWYIHHHHCm7o!!!!!!!!", + "!!!!!!4igggxTYPHHHFSBro!!!!!!!!!", + "!!!!!!4fgggnTPHHHDCVdo!!!!!!!!!!", + "!!!!!4wdfggAYHHHDACco=o!!!!!!!!!", + "!!!!!4ifggxPLHFSAAMo*46o!!!!!!!!", + "!!!!49idfgbYLFCAAA:oOooo!!!!!!!!", + "!!!!4wiiidNKDCSAVVVBl7o!!!!!!!!!", + "!!!!!4wiizAFSCVVVVVv7o=o!!!!!!!!", + "!!!!!!4wibACVVVVVVmro=46o!!!!!!!", + "!!!!!!!4wnVVVVVVVBl*oooooo!!!!!!", + "!!!!!!!!4444440HBBBBBBmb7o!!!!!!", + "!!!!!!!!!!4g94CEFBBBmmb7o!!!!!!!", + "!!!!!!!!!!494SQFBBmk@@@@!!!!!!!!", + "!!!!!!!!!!!-mTFBmma@$>>$@!!!!!!!", + "!!!!!!!!!!*mFCmmmj@1GG31>X!!!!!!", + "!!!!!!!!!!*****9m@$GQG3Q<$X!!!!!", + "!!!!!!!!!!!!*8*bb@>GGQQ2<>.!!!!!", + "!!!!!!!!!!!!*5*bb@>33QQ1<>.!!!!!", + "!!!!!!!!!!!!!*ybx@$1Q21Q,#.!!!!!", + "!!!!!!!!!!!!!*ix&!@><<<,%.!!!!!!", + "!!!!!!!!!!!!!*d*!!!X$>>#.!!!!!!!", + "!!!!!!!!!!!!!**!!!!!X...!!!!!!!!", + "!!!!!!!!!!!!!*!!!!!!!!!!!!!!!!!!" + }; + +#ifndef __WXMSW__ +const char * +WxCasPix::m_wxcas_xpm[] = + { /* XPM */ + /* columns rows colors chars-per-pixel */ + "32 32 190 2", + " c None", + ". c #182139", + "X c #182152", + "o c #18314a", + "O c #10395a", + "+ c #083963", + "@ c #212942", + "# c #21395a", + "$ c #313142", + "% c #31394a", + "& c #39394a", + "* c #39397b", + "= c #08425a", + "- c #00426b", + "; c #004273", + ": c #00526b", + "> c #08526b", + ", c #00637b", + "< c #7b4200", + "1 c #424252", + "2 c #4a4a5a", + "3 c #4a4a63", + "4 c #525263", + "5 c #5a5a6b", + "6 c #52527b", + "7 c gray42", + "8 c #636373", + "9 c gray45", + "0 c #005294", + "q c #085aad", + "w c #00738c", + "e c #006bad", + "r c #006bb5", + "t c #0073a5", + "y c #007ba5", + "u c #0073bd", + "i c #007bc6", + "p c #6b739c", + "a c #0094bd", + "s c #008cce", + "d c #009cc6", + "f c #0094d6", + "g c #009cd6", + "h c #0894d6", + "j c #089cde", + "k c #1894ce", + "l c #00a5ce", + "z c #00a5d6", + "x c #00a5de", + "c c #18a5de", + "v c #00ade7", + "b c #00b5e7", + "n c #00b5ef", + "m c #00bdef", + "M c #08b5e7", + "N c #00bdf7", + "B c #10ade7", + "V c #18b5e7", + "C c #2194c6", + "Z c #219cd6", + "A c #21adde", + "S c #31adde", + "D c #21b5e7", + "F c #29b5e7", + "G c #39ade7", + "H c #39bdef", + "J c #00c6f7", + "K c #42adde", + "L c #4abde7", + "P c #73bdd6", + "I c #4ac6ef", + "U c #4ad6f7", + "Y c #5ac6ef", + "T c #5ad6f7", + "R c #63ceef", + "E c #6bd6f7", + "W c #73ceef", + "Q c #73d6f7", + "! c #8c4a00", + "~ c #9c5200", + "^ c #9c7339", + "/ c #a55a00", + "( c #ad5a00", + ") c #a56300", + "_ c #ad6300", + "` c #ad6308", + "' c #ad6b08", + "] c #a56b18", + "[ c #ad6b18", + "{ c #ad7318", + "} c #b56300", + "| c #b56b00", + " . c #bd6b00", + ".. c #b56b10", + "X. c #b57300", + "o. c #bd7300", + "O. c #bd7310", + "+. c #ad7b39", + "@. c #b57b29", + "#. c #bd7b31", + "$. c #c66b00", + "%. c #c67300", + "&. c #ce7300", + "*. c #c67b18", + "=. c #ce7b10", + "-. c #d67b00", + ";. c #bd8429", + ":. c #b58442", + ">. c #bd8c42", + ",. c #ad946b", + "<. c #b58c63", + "1. c #b59c7b", + "2. c #bd9c73", + "3. c #bd9c7b", + "4. c #bda57b", + "5. c #c68418", + "6. c #d68400", + "7. c #de8400", + "8. c #de8c08", + "9. c #d68c18", + "0. c #de8c18", + "q. c #de9418", + "w. c #c68421", + "e. c #de8c21", + "r. c #de9429", + "t. c #d69431", + "y. c #d69439", + "u. c #de9c39", + "i. c #e78c08", + "p. c #e78c18", + "a. c #e79418", + "s. c #f79c08", + "d. c #e79c21", + "f. c #e79c29", + "g. c #f7a518", + "h. c #ffa510", + "j. c #ffad18", + "k. c #e7a539", + "l. c #f7a521", + "z. c #ffad21", + "x. c #f7a531", + "c. c #f7ad31", + "v. c #ffb531", + "b. c #ffb539", + "n. c #c6944a", + "m. c #ce944a", + "M. c #de9c42", + "N. c #c6a57b", + "B. c #cead73", + "V. c #cead7b", + "C. c #e7ad4a", + "Z. c #f7b542", + "A. c #ffb542", + "S. c #ffbd4a", + "D. c #f7bd52", + "F. c #ffbd52", + "G. c #ffbd5a", + "H. c #e7b573", + "J. c #efbd73", + "K. c #f7bd63", + "L. c #ffc65a", + "P. c #f7c66b", + "I. c #ffc663", + "U. c #ffc66b", + "Y. c #ffc673", + "T. c #ffce7b", + "R. c #8cceef", + "E. c #84def7", + "W. c #94deef", + "Q. c #94d6f7", + "!. c #8ce7ff", + "~. c #94e7ff", + "^. c #9cefff", + "/. c #a5e7ff", + "(. c #a5efff", + "). c #ade7ff", + "_. c #b5efff", + "`. c #d6bda5", + "'. c #d6c6ad", + "]. c #d6c6b5", + "[. c #deceb5", + "{. c #ffce84", + "}. c #ffd68c", + "|. c #ffd694", + " X c #e7d6bd", + ".X c #ffdea5", + "XX c #e7dece", + "oX c #efe7de", + "OX c #ffe7c6", + "+X c None", + /* pixels */ + "+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X_.+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X", + "+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X_.+X+X+X+X+X+X+X+X+X+X+X+X9 2 +X", + "+X+X+X+X+X+X+X+X+X+X+X+X+X+XR _.U % # @ X X + O o = . +X", + "+X+X+X+X+X+X+X+X+X: : . . o K _.E q w t r y y r y r e r r . O +X", + "+X+X+X+X. O + = : : w w t i W _.E y r r y y y r r e e r r . O +X", + "+X+X+X4 * y r r y r r r y u E._.Q r y Z _.i y e e e e e r . $ +X", + "+X+X+X4 * y r r y r r y r s /._.Q.y y E _.s r e e e e r r . $ +X", + "+X+X+X4 * r r r y y y r y h )._.Q.r r Q._.j r e e e e r r . % +X", + "+X+X+X4 - y y r r r r r y S (._.!.i r W._.A r e e e r r r . 1 +X", + "+X+X+X4 - y y r r h s r r S _.Y _.i u ~._.K u r r r u u u . 1 +X", + "+X+X+X4 - y y r u _.Y r r Y _.Y _.u a _./.R u i i u u i u . 2 +X", + "+X+X+X4 - y r r a _.(.u r E _.I _.a h _.W.E.a i u u i i u . 3 +X", + "+X+X+X4 * y y r j _._.j u E._.K _.a c _.T _.j i i u i s a . 4 +X", + "+X+X+X5 * y y u L _._.G a _._.H _.s G _.F _.D s k j c D S J E Q ", + "+X+X+X4 - y r u W _.!.T j _.S S _.j H _.V _.F Y W./._._._.(.+X+X", + "+X+X+X5 ; u i k _.P Y W.D _.A G _.M P _.M _.Y _.R F H C v > 6 +X", + "+X+X+XJ C K Y Q _.A H (.P _.c G _.C R Q g _._._.A f g g f o 4 +X", + "+X+X XV.w.[ E.:.| N.c /.E._.k D _.D _.Y g T _.).M d f g f o 4 +X", + "W W O.I.F.b.n.8.s.i./ ^.(.W.g D _.H _.U d U _.^.v f f x l o 4 +X", + "+X+X) F.A.v.l.z.h.h.) `.'.T f A _.U _.F f F _.E v l v x x o 4 +X", + "m.y...Z.A.c.r.f.l.h.o.6.6.`.f Z _.P _.D x Z _.U v v v v v o 4 +X", + "H.}.I.G.u.` ._ ' q.h.h.s.6.'.C _.T _.B x b _.B v x x B b O 4 +X", + "Y.T.U.I.) .&.&.$./ q.h.s.6.3.C _.Q._.M B B b b b b b B b O 4 +X", + "-.e.U.I.:.[.[.2.] ( { j.i./ <.B _.~._.b b b b B v m m A m O 4 +X", + ">._ K.Y.;.oX+X+XoX! ] z.g.s._ B _.~._.n b m A m m m m N n O 4 +X", + "B.M.OX{.P.>.4.].].< r.v.z.g.X.m _.).Q.m A m m N N J J J E O 4 +X", + "-.a..X}.P.P.C.t.t.k.S.x.9.a.@.N _._.T N N N J n E n E n n . 4 +X", + "%.7.p.*.5.|.Y.I.L.G.L.G.| ~ '.z Q _.I 0 , ; o X . . % & 2 8 +X", + "`.%.#.`.` .X|.T.D.x.{.{.e.,.. ; P _.E 7 +X+X+X+X+X+X+X+X+X+X+X+X", + "+X'.+XXX_ d.K.J.@.-.0.=.} 1.+X+XR._.+Xp +X+X+X+X+X+X+X+X+X+X+X+X", + "+X+X+X4.%.7.7.| '.+.&./ ^ +X+X+X+X_.+X+X+X+X+X+X+X+X+X+X+X+X+X+X", + "+X+X+X+X3.+./ +.+X+X1.].+X+X+X+X+X_.+X+X+X+X+X+X+X+X+X+X+X+X+X+X" + }; +#endif /* !__WXMSW__ */ +// File_checked_for_headers diff --git a/src/utils/wxCas/src/wxcaspix.h b/src/utils/wxCas/src/wxcaspix.h new file mode 100644 index 00000000..11e6609f --- /dev/null +++ b/src/utils/wxCas/src/wxcaspix.h @@ -0,0 +1,62 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: WxCasPix Class +/// +/// Purpose: Monitor aMule Online Statistics by reading amulesig.dat file +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Derived from CAS by Pedro de Oliveira +/// +/// Pixmats from aMule http://www.amule.org +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _WXCASPIX_H +#define _WXCASPIX_H + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +class WxCasPix +{ +private: + static const char *m_about_xpm[]; + static const char *m_prefs_xpm[]; + static const char *m_print_xpm[]; + static const char *m_refresh_xpm[]; + static const char *m_save_xpm[]; + static const char *m_stat_xpm[]; + static const char *m_stop_xpm[]; +#ifndef __WXMSW__ + static const char *m_wxcas_xpm[]; +#endif + +public: + static wxBitmap getPixmap( const wxString& name ); +}; + +#endif /* _WXCASPIX_H */ +// File_checked_for_headers diff --git a/src/utils/wxCas/src/wxcasprefs.cpp b/src/utils/wxCas/src/wxcasprefs.cpp new file mode 100644 index 00000000..034f0e6c --- /dev/null +++ b/src/utils/wxCas/src/wxcasprefs.cpp @@ -0,0 +1,484 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: wxCasPrefs Class +/// +/// Purpose: Display user preferences dialog and manage configuration storage system +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Derived from CAS by Pedro de Oliveira +/// +/// Pixmats from aMule http://www.amule.org +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx/wx.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include + +#include "wxcasprefs.h" +#include "wxcascte.h" +#include "wxcasframe.h" + +// Constructor +WxCasPrefs::WxCasPrefs ( wxWindow * parent ) : wxDialog ( parent, -1, + wxString ( _ + ( "Preferences" ) ) ) +{ + // Prefs + wxConfigBase * prefs = wxConfigBase::Get(); + + // Main vertical Sizer + m_mainVBox = new wxBoxSizer ( wxVERTICAL ); + + // OS Path + m_osPathSBox = + new wxStaticBox ( this, -1, _( "Directory containing amulesig.dat file" ) ); + m_osPathSBoxSizer = new wxStaticBoxSizer ( m_osPathSBox, wxHORIZONTAL ); + + m_osPathTextCtrl = new wxTextCtrl ( this, -1, wxEmptyString ); + m_osPathBrowseButton = + new wxButton ( this, ID_OSPATH_BROWSE_BUTTON, wxString ( _( "Browse" ) ) ); + + wxString str; + + prefs->Read ( WxCasCte::AMULESIG_PATH_KEY, &str, + WxCasCte::DEFAULT_AMULESIG_PATH ); + + // Text extent + wxInt32 charExtent, y; + m_osPathTextCtrl->GetTextExtent ( wxT( "8" ), &charExtent, &y ); + m_osPathTextCtrl->SetSize ( wxSize ( charExtent * ( str.Length () + 1 ), -1 ) ); + + m_osPathTextCtrl->SetValue ( str ); + m_osPathTextCtrl-> + SetToolTip ( _ + ( "Enter here the directory where your amulesig.dat file is" ) ); + + m_osPathSBoxSizer->Add ( m_osPathTextCtrl, 1, wxALL | wxALIGN_CENTER, 5 ); + m_osPathSBoxSizer->Add ( m_osPathBrowseButton, 0, wxALL | wxALIGN_CENTER, 5 ); + + m_mainVBox->Add ( m_osPathSBoxSizer, 0, wxGROW | wxALIGN_CENTER | wxALL, 10 ); + + // Refresh rate + m_refreshSBox = new wxStaticBox ( this, -1, wxEmptyString ); + m_refreshSBoxSizer = new wxStaticBoxSizer ( m_refreshSBox, wxHORIZONTAL ); + + + m_refreshSpinButton = new wxSpinCtrl ( this, -1 ); + m_refreshSpinButton->SetRange ( WxCasCte::MIN_REFRESH_RATE, + WxCasCte::MAX_REFRESH_RATE ); + m_refreshSpinButton->SetValue ( prefs-> + Read ( WxCasCte::REFRESH_RATE_KEY, + WxCasCte::DEFAULT_REFRESH_RATE ) ); + m_refreshStaticText = + new wxStaticText ( this, -1, _( "Refresh rate interval in seconds" ), wxDefaultPosition, + wxDefaultSize, wxALIGN_CENTRE ); + m_refreshSBoxSizer->Add ( m_refreshSpinButton, 0, wxALL | wxALIGN_CENTER, 5 ); + m_refreshSBoxSizer->Add ( m_refreshStaticText, 1, wxALL | wxALIGN_CENTER, 5 ); + + m_mainVBox->Add ( m_refreshSBoxSizer, 0, wxGROW | wxALIGN_CENTER | wxALL, + 10 ); + + // Auto generate stat image + m_autoStatImgSBox = new wxStaticBox ( this, -1, wxEmptyString ); + m_autoStatImgSBoxSizer = + new wxStaticBoxSizer ( m_autoStatImgSBox, wxVERTICAL ); + + m_autoStatImgCheck = + new wxCheckBox ( this, ID_AUTOSTATIMG_CHECK, + _ + ( "Generate a stat image at every refresh event" ) ); + m_autoStatImgSBoxSizer->Add ( m_autoStatImgCheck, 0, + wxGROW | wxALIGN_CENTER_VERTICAL | wxALL, 5 ); + + m_autoStatImgHBoxSizer = new wxBoxSizer ( wxHORIZONTAL ); + + wxString strs[] = + { + wxT ( "PNG" ), wxT ( "JPG" ), wxT ( "BMP" ) }; + + m_autoStatImgCombo = + new wxComboBox ( this, ID_AUTOSTATIMG_COMBO, + prefs-> + Read ( WxCasCte::AUTOSTATIMG_TYPE_KEY, + WxCasCte::DEFAULT_AUTOSTATIMG_TYPE ), + wxDefaultPosition, wxDefaultSize, 3, strs, + wxCB_DROPDOWN | wxCB_READONLY ); + + m_autoStatImgTextCtrl = new wxTextCtrl ( this, -1, wxEmptyString ); + m_autoStatImgTextCtrl->SetValue ( prefs-> + Read ( WxCasCte::AUTOSTATIMG_DIR_KEY, + WxCasCte::DEFAULT_AUTOSTATIMG_PATH ) ); + m_autoStatImgTextCtrl-> + SetToolTip ( _ + ( "Enter here the directory where you want to generate the statistic image" ) ); + + m_autoStatImgButton = + new wxButton ( this, ID_AUTOSTATIMG_BROWSE_BUTTON, wxString ( _( "Browse" ) ) ); + + m_autoStatImgHBoxSizer->Add ( m_autoStatImgCombo, 0, wxALIGN_CENTER | wxALL, + 5 ); + m_autoStatImgHBoxSizer->Add ( m_autoStatImgTextCtrl, 1, + wxALIGN_CENTER | wxALL, 5 ); + m_autoStatImgHBoxSizer->Add ( m_autoStatImgButton, 0, wxALIGN_CENTER | wxALL, + 5 ); + + m_autoStatImgSBoxSizer->Add ( m_autoStatImgHBoxSizer, 0, + wxGROW | wxALIGN_CENTER_VERTICAL | wxALL, 5 ); + + m_mainVBox->Add ( m_autoStatImgSBoxSizer, 0, wxGROW | wxALIGN_CENTER | wxALL, + 5 ); + + // Auto FTP update stat image + m_ftpUpdateSBox = new wxStaticBox ( this, -1, wxEmptyString ); + m_ftpUpdateSBoxSizer = + new wxStaticBoxSizer ( m_ftpUpdateSBox, wxVERTICAL ); + + // Check + m_ftpUpdateCheck = + new wxCheckBox ( this, ID_FTP_UPDATE_CHECK, + _ + ( "Upload periodicaly your stat image to FTP server" ) ); + m_ftpUpdateSBoxSizer->Add ( m_ftpUpdateCheck, 0, + wxGROW | wxALIGN_CENTER_VERTICAL | wxALL, 5 ); + + // Grid size + m_ftpUpdateGridSizer = new wxGridSizer( 2 ); + + // FTP Static text + m_ftpUrlStaticText = new wxStaticText ( this, -1, _( "FTP Url" ) ); + m_ftpUpdateGridSizer->Add ( m_ftpUrlStaticText, 1, + wxALIGN_LEFT | wxALIGN_BOTTOM | wxALL, 5 ); + + m_ftpPathStaticText = new wxStaticText ( this, -1, _( "FTP Path" ) ); + m_ftpUpdateGridSizer->Add ( m_ftpPathStaticText, 1, + wxALIGN_LEFT | wxALIGN_BOTTOM | wxALL, 5 ); + // Url + m_ftpUrlTextCtrl = new wxTextCtrl ( this, -1, wxEmptyString ); + m_ftpUrlTextCtrl->SetValue ( prefs-> + Read ( WxCasCte::FTP_URL_KEY, + WxCasCte::DEFAULT_FTP_URL ) ); + m_ftpUrlTextCtrl-> + SetToolTip ( _ + ( "Enter here the URL of your FTP server" ) ); + + m_ftpUpdateGridSizer->Add ( m_ftpUrlTextCtrl, 1, + wxGROW | wxALIGN_LEFT | wxALIGN_TOP | wxALL, 5 ); + + // Path + m_ftpPathTextCtrl = new wxTextCtrl ( this, -1, wxEmptyString ); + m_ftpPathTextCtrl->SetValue ( prefs-> + Read ( WxCasCte::FTP_PATH_KEY, + WxCasCte::DEFAULT_FTP_PATH ) ); + m_ftpPathTextCtrl-> + SetToolTip ( _ + ( "Enter here the directory where putting your stat image on FTP server" ) ); + + m_ftpUpdateGridSizer->Add ( m_ftpPathTextCtrl, 1, + wxGROW | wxALIGN_LEFT | wxALIGN_TOP | wxALL, 5 ); + + // Login Static text + m_ftpUserStaticText = new wxStaticText ( this, -1, _( "User" ) ); + m_ftpUpdateGridSizer->Add ( m_ftpUserStaticText, 1, + wxALIGN_LEFT | wxALIGN_BOTTOM | wxALL, 5 ); + + m_ftpPasswdStaticText = new wxStaticText ( this, -1, _( "Password" ) ); + m_ftpUpdateGridSizer->Add ( m_ftpPasswdStaticText, 1, + wxALIGN_LEFT | wxALIGN_BOTTOM | wxALL, 5 ); + + // User + m_ftpUserTextCtrl = new wxTextCtrl ( this, -1, wxEmptyString ); + m_ftpUserTextCtrl->SetValue ( prefs-> + Read ( WxCasCte::FTP_USER_KEY, + WxCasCte::DEFAULT_FTP_USER ) ); + m_ftpUserTextCtrl-> + SetToolTip ( _ + ( "Enter here the User name to log into your FTP server" ) ); + + m_ftpUpdateGridSizer->Add ( m_ftpUserTextCtrl, 1, + wxGROW | wxALIGN_LEFT | wxALIGN_TOP | wxALL, 5 ); + + // Passwd + m_ftpPasswdTextCtrl = new wxTextCtrl ( this, -1, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD ); + m_ftpPasswdTextCtrl->SetValue ( prefs-> + Read ( WxCasCte::FTP_PASSWD_KEY, + WxCasCte::DEFAULT_FTP_PASSWD ) ); + m_ftpPasswdTextCtrl-> + SetToolTip ( _ + ( "Enter here the User password to log into your FTP server" ) ); + + m_ftpUpdateGridSizer->Add ( m_ftpPasswdTextCtrl, 1, + wxGROW | wxALIGN_LEFT | wxALIGN_TOP | wxALL, 5 ); + + + // Add to static sizer + m_ftpUpdateSBoxSizer->Add ( m_ftpUpdateGridSizer, 1, + wxGROW | wxALIGN_CENTER_VERTICAL | wxALL, 5 ); + + // Upload rate + m_ftpRateHBoxSizer = new wxBoxSizer( wxHORIZONTAL ); + m_ftpUpdateSpinButton = new wxSpinCtrl ( this, -1 ); + m_ftpUpdateSpinButton->SetRange ( WxCasCte::MIN_FTP_RATE, + WxCasCte::MAX_FTP_RATE ); + m_ftpUpdateSpinButton->SetValue ( prefs-> + Read ( WxCasCte::FTP_UPDATE_RATE_KEY, + WxCasCte::DEFAULT_FTP_UPDATE_RATE ) ); + m_ftpUpdateStaticText = + new wxStaticText ( this, -1, _( "FTP update rate interval in minutes" ), wxDefaultPosition, + wxDefaultSize, wxALIGN_CENTRE ); + m_ftpRateHBoxSizer->Add ( m_ftpUpdateSpinButton, 0, wxALL | wxALIGN_CENTER, 5 ); + m_ftpRateHBoxSizer->Add ( m_ftpUpdateStaticText, 1, wxALL | wxALIGN_CENTER, 5 ); + + m_ftpUpdateSBoxSizer->Add ( m_ftpRateHBoxSizer, 0, + wxGROW | wxALIGN_CENTER_VERTICAL | wxALL, 5 ); + + // Add to main sizer + m_mainVBox->Add ( m_ftpUpdateSBoxSizer, 0, wxGROW | wxALIGN_CENTER | wxALL, + 5 ); + + // Mask auto stat img disabled controls + if ( ( bool ) + ( prefs-> + Read ( WxCasCte::ENABLE_AUTOSTATIMG_KEY, + WxCasCte::DEFAULT_AUTOSTATIMG_ISENABLED ) ) ) { + m_autoStatImgCheck->SetValue( TRUE ); + } else { + m_autoStatImgCheck->SetValue ( FALSE ); + EnableAutoStatImgCtrls( FALSE ); + + m_ftpUpdateCheck->Enable ( FALSE ); + EnableFtpUpdateCtrls( FALSE ); + } + + // Mask Ftp update disabled controls + if ( ( bool ) + ( prefs-> + Read ( WxCasCte::ENABLE_FTP_UPDATE_KEY, + WxCasCte::DEFAULT_FTP_UPDATE_ISENABLED ) ) ) { + m_ftpUpdateCheck->SetValue( TRUE ); + } else { + m_ftpUpdateCheck->SetValue ( FALSE ); + EnableFtpUpdateCtrls( FALSE ); + } + + // Separator line + m_staticLine = new wxStaticLine ( this, -1 ); + m_mainVBox->Add ( m_staticLine, 0, wxGROW | wxALIGN_CENTER | wxALL ); + + // Button bar + m_buttonHBox = new wxBoxSizer ( wxHORIZONTAL ); + m_validateButton = + new wxButton ( this, ID_VALIDATE_BUTTON, wxString ( _( "Validate" ) ) ); + m_cancelButton = + new wxButton ( this, wxID_CANCEL, wxString ( _( "Cancel" ) ) ); + + m_buttonHBox->Add ( m_validateButton, 0, wxALIGN_CENTER | wxALL, 5 ); + m_buttonHBox->Add ( m_cancelButton, 0, wxALIGN_CENTER | wxALL, 5 ); + + m_mainVBox->Add ( m_buttonHBox, 0, wxALIGN_CENTER | wxALL, 10 ); + + // Layout + SetAutoLayout ( TRUE ); + SetSizerAndFit ( m_mainVBox ); + + m_validateButton->SetFocus (); + m_validateButton->SetDefault (); +} + +// Destructor +WxCasPrefs::~WxCasPrefs () +{} + +// Events table +BEGIN_EVENT_TABLE ( WxCasPrefs, wxDialog ) +EVT_BUTTON ( ID_OSPATH_BROWSE_BUTTON, WxCasPrefs::OnOSPathBrowseButton ) +EVT_BUTTON ( ID_AUTOSTATIMG_BROWSE_BUTTON, WxCasPrefs::OnAutoStatImgBrowseButton ) +EVT_BUTTON ( ID_VALIDATE_BUTTON, WxCasPrefs::OnValidateButton ) +EVT_CHECKBOX ( ID_AUTOSTATIMG_CHECK, WxCasPrefs::OnAutoStatImgCheck ) +EVT_CHECKBOX ( ID_FTP_UPDATE_CHECK, WxCasPrefs::OnFtpUpdateCheck ) +END_EVENT_TABLE () + +// Browse for OS Path +void WxCasPrefs::OnOSPathBrowseButton ( wxCommandEvent& WXUNUSED( event ) ) +{ + const wxString &dir = wxDirSelector(_ + ("Folder containing your signature file"), + WxCasCte::DEFAULT_AMULESIG_PATH, + wxDD_DEFAULT_STYLE, + wxDefaultPosition, this); + if ( !dir.empty () ) { + m_osPathTextCtrl->SetValue ( dir ); + } +} + +// Browse for stat image Path +void +WxCasPrefs::OnAutoStatImgBrowseButton ( wxCommandEvent& WXUNUSED( event ) ) +{ + const wxString & dir = wxDirSelector( + _("Folder where generating the statistic image"), + WxCasCte::DEFAULT_AUTOSTATIMG_PATH, + wxDD_DEFAULT_STYLE, + wxDefaultPosition, this); + + if ( !dir.empty () ) { + m_autoStatImgTextCtrl->SetValue ( dir ); + } +} + +// Auto Generate Stat Image Check Button +void +WxCasPrefs::OnAutoStatImgCheck ( wxCommandEvent& WXUNUSED( event ) ) +{ + if ( m_autoStatImgCheck->GetValue () ) { + EnableAutoStatImgCtrls( TRUE ); + + m_ftpUpdateCheck->Enable ( TRUE ); + if ( m_ftpUpdateCheck->GetValue () ) { + EnableFtpUpdateCtrls( TRUE ); + } + } else { + EnableAutoStatImgCtrls( FALSE ); + + m_ftpUpdateCheck->Enable ( FALSE ); + EnableFtpUpdateCtrls( FALSE ); + } +} + +// Ftp update Check Button +void +WxCasPrefs::OnFtpUpdateCheck ( wxCommandEvent& WXUNUSED( event ) ) +{ + if ( m_ftpUpdateCheck->GetValue () ) { + EnableFtpUpdateCtrls( TRUE ); + } else { + EnableFtpUpdateCtrls( FALSE ); + } +} +// Validate Prefs +void +WxCasPrefs::OnValidateButton ( wxCommandEvent& WXUNUSED( event ) ) +{ + // Prefs + wxConfigBase * prefs = wxConfigBase::Get(); + + // Write amulesig dir + if ( prefs->Read ( WxCasCte::AMULESIG_PATH_KEY, + WxCasCte::DEFAULT_AMULESIG_PATH ) != + m_osPathTextCtrl->GetValue () ) { + // Reload amulesig.dat + wxFileName amulesig( m_osPathTextCtrl->GetValue (), + WxCasCte::AMULESIG_FILENAME ); + ( ( WxCasFrame* ) GetParent() ) ->SetAmuleSigFile( amulesig ); + + prefs->Write ( WxCasCte::AMULESIG_PATH_KEY, + m_osPathTextCtrl->GetValue () ); + } + + // Restart timer if refresh interval has changed + if ( prefs->Read ( WxCasCte::REFRESH_RATE_KEY, WxCasCte::DEFAULT_REFRESH_RATE ) != + m_refreshSpinButton->GetValue () ) { + ( ( WxCasFrame* ) GetParent() ) ->ChangeRefreshPeriod( 1000 * m_refreshSpinButton->GetValue () ); + + // Write refresh interval + prefs->Write ( WxCasCte::REFRESH_RATE_KEY, + m_refreshSpinButton->GetValue () ); + } + + // Write auto stat img state + prefs->Write ( WxCasCte::ENABLE_AUTOSTATIMG_KEY, + m_autoStatImgCheck->GetValue () ); + + // If auto stat img is enabled + if ( m_autoStatImgCheck->GetValue () ) { + prefs->Write ( WxCasCte::AUTOSTATIMG_DIR_KEY, + m_autoStatImgTextCtrl->GetValue () ); + + prefs->Write ( WxCasCte::AUTOSTATIMG_TYPE_KEY, + m_autoStatImgCombo->GetValue () ); + + // Write Ftp update state + prefs->Write ( WxCasCte::ENABLE_FTP_UPDATE_KEY, + m_ftpUpdateCheck->GetValue () ); + + // If Ftp update is enabled + if ( m_ftpUpdateCheck->GetValue () ) { + // Restart timer if update interval has changed + if ( prefs->Read ( WxCasCte::FTP_UPDATE_RATE_KEY, WxCasCte::DEFAULT_FTP_UPDATE_RATE ) != + m_ftpUpdateSpinButton->GetValue () ) { + ( ( WxCasFrame* ) GetParent() ) ->ChangeFtpUpdatePeriod( 60000 * m_refreshSpinButton->GetValue () ); + prefs->Write ( WxCasCte::FTP_UPDATE_RATE_KEY, + m_ftpUpdateSpinButton->GetValue () ); + } + // Write Ftp parameters + prefs->Write ( WxCasCte::FTP_URL_KEY, + m_ftpUrlTextCtrl->GetValue () ); + + prefs->Write ( WxCasCte::FTP_PATH_KEY, + m_ftpPathTextCtrl->GetValue () ); + + prefs->Write ( WxCasCte::FTP_USER_KEY, + m_ftpUserTextCtrl->GetValue () ); + + prefs->Write ( WxCasCte::FTP_PASSWD_KEY, + m_ftpPasswdTextCtrl->GetValue () ); + } + } + + // Force config writing + prefs->Flush(); + + // Close window + this->EndModal ( this->GetReturnCode () ); +} + +// Enable/Disable auto img ctrls +void +WxCasPrefs::EnableAutoStatImgCtrls( bool state ) +{ + m_autoStatImgTextCtrl->Enable ( state ); + m_autoStatImgButton->Enable ( state ); + m_autoStatImgCombo->Enable ( state ); +} + +// Enable/Disable Ftp update ctrls +void +WxCasPrefs::EnableFtpUpdateCtrls( bool state ) +{ + m_ftpUpdateSpinButton->Enable ( state ); + m_ftpUpdateStaticText->Enable ( state ); + m_ftpUrlTextCtrl->Enable ( state ); + m_ftpUrlStaticText->Enable ( state ); + m_ftpPathTextCtrl->Enable ( state ); + m_ftpPathStaticText->Enable ( state ); + m_ftpUserTextCtrl->Enable ( state ); + m_ftpUserStaticText->Enable ( state ); + m_ftpPasswdTextCtrl->Enable ( state ); + m_ftpPasswdStaticText->Enable ( state ); +} +// File_checked_for_headers diff --git a/src/utils/wxCas/src/wxcasprefs.h b/src/utils/wxCas/src/wxcasprefs.h new file mode 100644 index 00000000..ad032213 --- /dev/null +++ b/src/utils/wxCas/src/wxcasprefs.h @@ -0,0 +1,124 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: wxCasPrefs Class +/// +/// Purpose: Display user preferences dialog and manage configuration storage system +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Derived from CAS by Pedro de Oliveira +/// +/// Pixmats from aMule http://www.amule.org +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _WXCASPREFS_H +#define _WXCASPREFS_H + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include +#include +#include + +/// Preference Dialog +class WxCasPrefs: public wxDialog +{ +private: + wxBoxSizer * m_mainVBox; + wxStaticBox *m_osPathSBox; + wxStaticBoxSizer *m_osPathSBoxSizer; + wxTextCtrl *m_osPathTextCtrl; + wxButton *m_osPathBrowseButton; + + wxStaticBox *m_refreshSBox; + wxStaticBoxSizer *m_refreshSBoxSizer; + wxSpinCtrl *m_refreshSpinButton; + wxStaticText *m_refreshStaticText; + + wxStaticBox *m_autoStatImgSBox; + wxStaticBoxSizer *m_autoStatImgSBoxSizer; + wxCheckBox *m_autoStatImgCheck; + wxBoxSizer *m_autoStatImgHBoxSizer; + wxTextCtrl *m_autoStatImgTextCtrl; + wxButton *m_autoStatImgButton; + wxComboBox *m_autoStatImgCombo; + + wxStaticBox *m_ftpUpdateSBox; + wxStaticBoxSizer *m_ftpUpdateSBoxSizer; + wxSpinCtrl *m_ftpUpdateSpinButton; + wxStaticText *m_ftpUpdateStaticText; + wxBoxSizer *m_ftpRateHBoxSizer; + wxCheckBox *m_ftpUpdateCheck; + wxGridSizer *m_ftpUpdateGridSizer; + wxTextCtrl *m_ftpUrlTextCtrl; + wxStaticText *m_ftpUrlStaticText; + wxTextCtrl *m_ftpPathTextCtrl; + wxStaticText *m_ftpPathStaticText; + wxTextCtrl *m_ftpUserTextCtrl; + wxStaticText *m_ftpUserStaticText; + wxTextCtrl *m_ftpPasswdTextCtrl; + wxStaticText *m_ftpPasswdStaticText; + + wxStaticLine *m_staticLine; + + wxBoxSizer *m_buttonHBox; + wxButton *m_validateButton; + wxButton *m_cancelButton; + + void EnableAutoStatImgCtrls( bool state ); + void EnableFtpUpdateCtrls( bool state ); + + enum + { + ID_OSPATH_BROWSE_BUTTON = 100, + ID_AUTOSTATIMG_CHECK, + ID_AUTOSTATIMG_COMBO, + ID_AUTOSTATIMG_BROWSE_BUTTON, + ID_FTP_UPDATE_CHECK, + ID_VALIDATE_BUTTON + }; + +protected: + void OnOSPathBrowseButton ( wxCommandEvent & event ); + void OnValidateButton ( wxCommandEvent & event ); + void OnAutoStatImgBrowseButton ( wxCommandEvent & event ); + void OnAutoStatImgCheck ( wxCommandEvent & event ); + void OnFtpUpdateCheck ( wxCommandEvent & event ); + + DECLARE_EVENT_TABLE () + +public: + + /// Constructor + WxCasPrefs ( wxWindow * parent ); + + /// Destructor + ~WxCasPrefs (); +}; + +#endif /* _WXCASPREFS_H */ +// File_checked_for_headers diff --git a/src/utils/wxCas/src/wxcasprint.cpp b/src/utils/wxCas/src/wxcasprint.cpp new file mode 100644 index 00000000..7f3ecbb9 --- /dev/null +++ b/src/utils/wxCas/src/wxcasprint.cpp @@ -0,0 +1,130 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: wxCasPrint Class +/// +/// Purpose: Manage statistics image printing +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Derived from CAS by Pedro de Oliveira +/// +/// Pixmats from aMule http://www.amule.org +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include + +#include "wxcas.h" +#include "wxcasframe.h" +#include "wxcasprint.h" + +// Constructor +WxCasPrint::WxCasPrint ( const wxString& title ) : wxPrintout ( title ) +{} + +// Destructor +WxCasPrint::~WxCasPrint () +{} + +bool +WxCasPrint::OnPrintPage ( int page ) +{ + wxDC * dc = GetDC (); + if ( dc ) { + if ( page == 1 ) { + DrawPageOne ( dc ); + } + + + dc->SetDeviceOrigin ( 0, 0 ); + dc->SetUserScale ( 1.0, 1.0 ); + + return TRUE; + } else { + return FALSE; + } +} + +bool +WxCasPrint::OnBeginDocument ( int startPage, int endPage ) +{ + if ( !wxPrintout::OnBeginDocument ( startPage, endPage ) ) { + return FALSE; + } else { + return TRUE; + } +} + +void +WxCasPrint::GetPageInfo ( int *minPage, int *maxPage, int *selPageFrom, + int *selPageTo ) +{ + *minPage = 1; + *maxPage = 1; + *selPageFrom = 1; + *selPageTo = 1; +} + +bool +WxCasPrint::HasPage ( int pageNum ) +{ + return ( pageNum == 1 ); +} + +void +WxCasPrint::DrawPageOne ( wxDC * dc ) +{ + wxInt32 dc_w, dc_h; + + // Get the size of the DC in pixels + dc->GetSize ( &dc_w, &dc_h ); + + // Get the size of the image in pixels + wxImage *statImage = wxGetApp ().GetMainFrame () ->GetStatImage (); + + wxUint32 marginX = 50; + wxUint32 marginY = 50; + + wxUint32 sizeX = statImage->GetWidth () + 2 * marginX; + wxUint32 sizeY = statImage->GetHeight () + 2 * marginY; + + // Calculate a suitable scaling factor + float scale = wxMin ( ( float ) ( dc_w ) / sizeX, ( float ) ( dc_h ) / sizeY ); + + // Calculate the position on the DC for centring the graphic + float posX = marginX + ( dc_w - sizeX * scale ) / 2.0; + float posY = marginY + ( dc_h - sizeY * scale ) / 2.0; + + // Set the scale and origin + dc->SetUserScale ( scale, scale ); + dc->SetDeviceOrigin ( ( wxCoord ) posX, ( wxCoord ) posY ); + + // Draw image + dc->DrawBitmap ( wxBitmap( *statImage ), 0, 0, FALSE ); +} +// File_checked_for_headers diff --git a/src/utils/wxCas/src/wxcasprint.h b/src/utils/wxCas/src/wxcasprint.h new file mode 100644 index 00000000..920f53c2 --- /dev/null +++ b/src/utils/wxCas/src/wxcasprint.h @@ -0,0 +1,66 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name: wxCasPrint Class +/// +/// Purpose: Manage statistics image printing +/// +/// Author: ThePolish +/// +/// Copyright (C) 2004 by ThePolish +/// +/// Derived from CAS by Pedro de Oliveira +/// +/// Pixmats from aMule http://www.amule.org +/// +/// This program is free software; you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation; either version 2 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program; if not, write to the +/// Free Software Foundation, Inc., +/// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _WXCASPRINT_H +#define _WXCASPRINT_H + + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// For all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include + +/// Statistic image printing +class WxCasPrint: public wxPrintout +{ +public: + + /// Constructor + WxCasPrint ( const wxString& title ); + + ///Destructor + ~WxCasPrint (); + + bool OnPrintPage ( int page ); + bool HasPage ( int page ); + bool OnBeginDocument ( int startPage, int endPage ); + void GetPageInfo ( int *minPage, int *maxPage, int *selPageFrom, + int *selPageTo ); + + void DrawPageOne ( wxDC * dc ); +}; + +#endif /* _WXCASPRINT_H */ +// File_checked_for_headers diff --git a/src/utils/wxCas/wxcas.desktop b/src/utils/wxCas/wxcas.desktop new file mode 100644 index 00000000..496d812b --- /dev/null +++ b/src/utils/wxCas/wxcas.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Name=wxCas +Exec=wxcas +Icon=wxcas +Terminal=false +Type=Application +Categories=Network;P2P; +Comment=aMule online statistics +Comment[de]=aMule-Onlinestatistik +Comment[fr]=Statistiques d'aMule en ligne +Comment[hu]=aMule online statisztikák diff --git a/src/utils/wxCas/wxcas.ico b/src/utils/wxCas/wxcas.ico new file mode 100644 index 0000000000000000000000000000000000000000..6ed775d415821b545728f6eb88b5a7710fc54a13 GIT binary patch literal 10662 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 c #08526b", +", c #00637b", +"< c #7b4200", +"1 c #424252", +"2 c #4a4a5a", +"3 c #4a4a63", +"4 c #525263", +"5 c #5a5a6b", +"6 c #52527b", +"7 c gray42", +"8 c #636373", +"9 c gray45", +"0 c #005294", +"q c #085aad", +"w c #00738c", +"e c #006bad", +"r c #006bb5", +"t c #0073a5", +"y c #007ba5", +"u c #0073bd", +"i c #007bc6", +"p c #6b739c", +"a c #0094bd", +"s c #008cce", +"d c #009cc6", +"f c #0094d6", +"g c #009cd6", +"h c #0894d6", +"j c #089cde", +"k c #1894ce", +"l c #00a5ce", +"z c #00a5d6", +"x c #00a5de", +"c c #18a5de", +"v c #00ade7", +"b c #00b5e7", +"n c #00b5ef", +"m c #00bdef", +"M c #08b5e7", +"N c #00bdf7", +"B c #10ade7", +"V c #18b5e7", +"C c #2194c6", +"Z c #219cd6", +"A c #21adde", +"S c #31adde", +"D c #21b5e7", +"F c #29b5e7", +"G c #39ade7", +"H c #39bdef", +"J c #00c6f7", +"K c #42adde", +"L c #4abde7", +"P c #73bdd6", +"I c #4ac6ef", +"U c #4ad6f7", +"Y c #5ac6ef", +"T c #5ad6f7", +"R c #63ceef", +"E c #6bd6f7", +"W c #73ceef", +"Q c #73d6f7", +"! c #8c4a00", +"~ c #9c5200", +"^ c #9c7339", +"/ c #a55a00", +"( c #ad5a00", +") c #a56300", +"_ c #ad6300", +"` c #ad6308", +"' c #ad6b08", +"] c #a56b18", +"[ c #ad6b18", +"{ c #ad7318", +"} c #b56300", +"| c #b56b00", +" . c #bd6b00", +".. c #b56b10", +"X. c #b57300", +"o. c #bd7300", +"O. c #bd7310", +"+. c #ad7b39", +"@. c #b57b29", +"#. c #bd7b31", +"$. c #c66b00", +"%. c #c67300", +"&. c #ce7300", +"*. c #c67b18", +"=. c #ce7b10", +"-. c #d67b00", +";. c #bd8429", +":. c #b58442", +">. c #bd8c42", +",. c #ad946b", +"<. c #b58c63", +"1. c #b59c7b", +"2. c #bd9c73", +"3. c #bd9c7b", +"4. c #bda57b", +"5. c #c68418", +"6. c #d68400", +"7. c #de8400", +"8. c #de8c08", +"9. c #d68c18", +"0. c #de8c18", +"q. c #de9418", +"w. c #c68421", +"e. c #de8c21", +"r. c #de9429", +"t. c #d69431", +"y. c #d69439", +"u. c #de9c39", +"i. c #e78c08", +"p. c #e78c18", +"a. c #e79418", +"s. c #f79c08", +"d. c #e79c21", +"f. c #e79c29", +"g. c #f7a518", +"h. c #ffa510", +"j. c #ffad18", +"k. c #e7a539", +"l. c #f7a521", +"z. c #ffad21", +"x. c #f7a531", +"c. c #f7ad31", +"v. c #ffb531", +"b. c #ffb539", +"n. c #c6944a", +"m. c #ce944a", +"M. c #de9c42", +"N. c #c6a57b", +"B. c #cead73", +"V. c #cead7b", +"C. c #e7ad4a", +"Z. c #f7b542", +"A. c #ffb542", +"S. c #ffbd4a", +"D. c #f7bd52", +"F. c #ffbd52", +"G. c #ffbd5a", +"H. c #e7b573", +"J. c #efbd73", +"K. c #f7bd63", +"L. c #ffc65a", +"P. c #f7c66b", +"I. c #ffc663", +"U. c #ffc66b", +"Y. c #ffc673", +"T. c #ffce7b", +"R. c #8cceef", +"E. c #84def7", +"W. c #94deef", +"Q. c #94d6f7", +"!. c #8ce7ff", +"~. c #94e7ff", +"^. c #9cefff", +"/. c #a5e7ff", +"(. c #a5efff", +"). c #ade7ff", +"_. c #b5efff", +"`. c #d6bda5", +"'. c #d6c6ad", +"]. c #d6c6b5", +"[. c #deceb5", +"{. c #ffce84", +"}. c #ffd68c", +"|. c #ffd694", +" X c #e7d6bd", +".X c #ffdea5", +"XX c #e7dece", +"oX c #efe7de", +"OX c #ffe7c6", +"+X c None", +/* pixels */ +"+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X_.+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X", +"+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X_.+X+X+X+X+X+X+X+X+X+X+X+X9 2 +X", +"+X+X+X+X+X+X+X+X+X+X+X+X+X+XR _.U % # @ X X + O o = . +X", +"+X+X+X+X+X+X+X+X+X: : . . o K _.E q w t r y y r y r e r r . O +X", +"+X+X+X+X. O + = : : w w t i W _.E y r r y y y r r e e r r . O +X", +"+X+X+X4 * y r r y r r r y u E._.Q r y Z _.i y e e e e e r . $ +X", +"+X+X+X4 * y r r y r r y r s /._.Q.y y E _.s r e e e e r r . $ +X", +"+X+X+X4 * r r r y y y r y h )._.Q.r r Q._.j r e e e e r r . % +X", +"+X+X+X4 - y y r r r r r y S (._.!.i r W._.A r e e e r r r . 1 +X", +"+X+X+X4 - y y r r h s r r S _.Y _.i u ~._.K u r r r u u u . 1 +X", +"+X+X+X4 - y y r u _.Y r r Y _.Y _.u a _./.R u i i u u i u . 2 +X", +"+X+X+X4 - y r r a _.(.u r E _.I _.a h _.W.E.a i u u i i u . 3 +X", +"+X+X+X4 * y y r j _._.j u E._.K _.a c _.T _.j i i u i s a . 4 +X", +"+X+X+X5 * y y u L _._.G a _._.H _.s G _.F _.D s k j c D S J E Q ", +"+X+X+X4 - y r u W _.!.T j _.S S _.j H _.V _.F Y W./._._._.(.+X+X", +"+X+X+X5 ; u i k _.P Y W.D _.A G _.M P _.M _.Y _.R F H C v > 6 +X", +"+X+X+XJ C K Y Q _.A H (.P _.c G _.C R Q g _._._.A f g g f o 4 +X", +"+X+X XV.w.[ E.:.| N.c /.E._.k D _.D _.Y g T _.).M d f g f o 4 +X", +"W W O.I.F.b.n.8.s.i./ ^.(.W.g D _.H _.U d U _.^.v f f x l o 4 +X", +"+X+X) F.A.v.l.z.h.h.) `.'.T f A _.U _.F f F _.E v l v x x o 4 +X", +"m.y...Z.A.c.r.f.l.h.o.6.6.`.f Z _.P _.D x Z _.U v v v v v o 4 +X", +"H.}.I.G.u.` ._ ' q.h.h.s.6.'.C _.T _.B x b _.B v x x B b O 4 +X", +"Y.T.U.I.) .&.&.$./ q.h.s.6.3.C _.Q._.M B B b b b b b B b O 4 +X", +"-.e.U.I.:.[.[.2.] ( { j.i./ <.B _.~._.b b b b B v m m A m O 4 +X", +">._ K.Y.;.oX+X+XoX! ] z.g.s._ B _.~._.n b m A m m m m N n O 4 +X", +"B.M.OX{.P.>.4.].].< r.v.z.g.X.m _.).Q.m A m m N N J J J E O 4 +X", +"-.a..X}.P.P.C.t.t.k.S.x.9.a.@.N _._.T N N N J n E n E n n . 4 +X", +"%.7.p.*.5.|.Y.I.L.G.L.G.| ~ '.z Q _.I 0 , ; o X . . % & 2 8 +X", +"`.%.#.`.` .X|.T.D.x.{.{.e.,.. ; P _.E 7 +X+X+X+X+X+X+X+X+X+X+X+X", +"+X'.+XXX_ d.K.J.@.-.0.=.} 1.+X+XR._.+Xp +X+X+X+X+X+X+X+X+X+X+X+X", +"+X+X+X4.%.7.7.| '.+.&./ ^ +X+X+X+X_.+X+X+X+X+X+X+X+X+X+X+X+X+X+X", +"+X+X+X+X3.+./ +.+X+X1.].+X+X+X+X+X_.+X+X+X+X+X+X+X+X+X+X+X+X+X+X" +}; diff --git a/src/utils/xas/Makefile.am b/src/utils/xas/Makefile.am new file mode 100644 index 00000000..8e39d8bf --- /dev/null +++ b/src/utils/xas/Makefile.am @@ -0,0 +1,12 @@ +SUBDIRS = docs + +dist_plugins_DATA = xas.pl +pluginsdir = $(libdir)/xchat/plugins + +bin_SCRIPTS = autostart-xas + +DISTCLEANFILES = autostart-xas + +EXTRA_DIST = autostart-xas.in + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/utils/xas/Makefile.in b/src/utils/xas/Makefile.in new file mode 100644 index 00000000..ec62b4a2 --- /dev/null +++ b/src/utils/xas/Makefile.in @@ -0,0 +1,666 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/utils/xas +DIST_COMMON = $(dist_plugins_DATA) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/autostart-xas.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = autostart-xas +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pluginsdir)" +binSCRIPT_INSTALL = $(INSTALL_SCRIPT) +SCRIPTS = $(bin_SCRIPTS) +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +dist_pluginsDATA_INSTALL = $(INSTALL_DATA) +DATA = $(dist_plugins_DATA) +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +SUBDIRS = docs +dist_plugins_DATA = xas.pl +pluginsdir = $(libdir)/xchat/plugins +bin_SCRIPTS = autostart-xas +DISTCLEANFILES = autostart-xas +EXTRA_DIST = autostart-xas.in +MAINTAINERCLEANFILES = Makefile.in +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/xas/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/utils/xas/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +autostart-xas: $(top_builddir)/config.status $(srcdir)/autostart-xas.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +install-binSCRIPTS: $(bin_SCRIPTS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" + @list='$(bin_SCRIPTS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f $$d$$p; then \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \ + else :; fi; \ + done + +uninstall-binSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(bin_SCRIPTS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done +uninstall-info-am: +install-dist_pluginsDATA: $(dist_plugins_DATA) + @$(NORMAL_INSTALL) + test -z "$(pluginsdir)" || $(mkdir_p) "$(DESTDIR)$(pluginsdir)" + @list='$(dist_plugins_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(dist_pluginsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pluginsdir)/$$f'"; \ + $(dist_pluginsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pluginsdir)/$$f"; \ + done + +uninstall-dist_pluginsDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_plugins_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(pluginsdir)/$$f'"; \ + rm -f "$(DESTDIR)$(pluginsdir)/$$f"; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(SCRIPTS) $(DATA) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pluginsdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: install-dist_pluginsDATA + +install-exec-am: install-binSCRIPTS + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-binSCRIPTS uninstall-dist_pluginsDATA \ + uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-recursive ctags ctags-recursive \ + distclean distclean-generic distclean-recursive distclean-tags \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-binSCRIPTS install-data install-data-am \ + install-dist_pluginsDATA install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-binSCRIPTS \ + uninstall-dist_pluginsDATA uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/utils/xas/autostart-xas.in b/src/utils/xas/autostart-xas.in new file mode 100644 index 00000000..0befeb19 --- /dev/null +++ b/src/utils/xas/autostart-xas.in @@ -0,0 +1,42 @@ +#!/bin/sh + +# This file is part of the aMule project. +# +# Copyright (c) 2003-2006 aMule Project ( admin@amule.org / http://www.amule.org ) +# Copyright (c) 2006 Werner Mahr aka Vollstrecker +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +# + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +xas_bin=@libdir@/xchat/plugins/xas.pl + +if [ -z $xas_bin ] ; then + echo "xas.pl: Plugin not found" + exit 0 +fi + +if [ -d ~/.xchat2 ] ; then + if [ -e ~/.xchat2/xas.pl ] ; then + rm ~/.xchat2/xas.pl + fi + ln -s $xas_bin ~/.xchat2/xas.pl && echo "autostart successfully added" + if ps -A | grep -q xchat ; then + echo "You have to restart XChat to autoload xas.pl" + fi +else + echo "XChat-Datadir not found" +fi diff --git a/src/utils/xas/docs/Makefile.am b/src/utils/xas/docs/Makefile.am new file mode 100644 index 00000000..16f16b65 --- /dev/null +++ b/src/utils/xas/docs/Makefile.am @@ -0,0 +1,32 @@ +dist_man_MANS = xas.1 + +man_langs = de es eu hu + +EXTRA_DIST = xas.de.1 xas.es.1 xas.eu.1 xas.hu.1 + +install-data-hook: + @for lang in $(man_langs); do \ + echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/$$lang/man1" ; \ + $(mkinstalldirs) $(DESTDIR)$(mandir)/$$lang/man1 ; \ + list='$(dist_man_MANS)' ; \ + for file in $$list; do \ + tmp=`echo $$file | sed -e "s/\.1/\.$$lang\.1/"` ; \ + if test -f $(srcdir)/$$tmp; then name=$(srcdir)/$$tmp; \ + else name=$$tmp; fi; \ + inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ + echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$lang/man1/$$inst" ; \ + $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$lang/man1/$$inst ; \ + done ; \ + done + +uninstall-hook: + @for lang in $(man_langs); do \ + list='$(dist_man_MANS)' ; \ + for file in $$list; do \ + inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ + echo " rm -f $(DESTDIR)$(mandir)/$$lang/man1/$$inst" ; \ + rm -f $(DESTDIR)$(mandir)/$$lang/man1/$$inst ; \ + done ; \ + done + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/utils/xas/docs/Makefile.in b/src/utils/xas/docs/Makefile.in new file mode 100644 index 00000000..1bc2e150 --- /dev/null +++ b/src/utils/xas/docs/Makefile.in @@ -0,0 +1,533 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/utils/xas/docs +DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +man1dir = $(mandir)/man1 +am__installdirs = "$(DESTDIR)$(man1dir)" +NROFF = nroff +MANS = $(dist_man_MANS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +dist_man_MANS = xas.1 +man_langs = de es eu hu +EXTRA_DIST = xas.de.1 xas.es.1 xas.eu.1 xas.hu.1 +MAINTAINERCLEANFILES = Makefile.in +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/xas/docs/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/utils/xas/docs/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: +install-man1: $(man1_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)" + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ + done +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ + rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ + done +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(MANS) +installdirs: + for dir in "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-man + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook + +install-exec-am: + +install-info: install-info-am + +install-man: install-man1 + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-man + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook + +uninstall-man: uninstall-man1 + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-data-hook install-exec install-exec-am install-info \ + install-info-am install-man install-man1 install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am uninstall uninstall-am uninstall-hook \ + uninstall-info-am uninstall-man uninstall-man1 + + +install-data-hook: + @for lang in $(man_langs); do \ + echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/$$lang/man1" ; \ + $(mkinstalldirs) $(DESTDIR)$(mandir)/$$lang/man1 ; \ + list='$(dist_man_MANS)' ; \ + for file in $$list; do \ + tmp=`echo $$file | sed -e "s/\.1/\.$$lang\.1/"` ; \ + if test -f $(srcdir)/$$tmp; then name=$(srcdir)/$$tmp; \ + else name=$$tmp; fi; \ + inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ + echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$lang/man1/$$inst" ; \ + $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$lang/man1/$$inst ; \ + done ; \ + done + +uninstall-hook: + @for lang in $(man_langs); do \ + list='$(dist_man_MANS)' ; \ + for file in $$list; do \ + inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ + echo " rm -f $(DESTDIR)$(mandir)/$$lang/man1/$$inst" ; \ + rm -f $(DESTDIR)$(mandir)/$$lang/man1/$$inst ; \ + done ; \ + done +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/utils/xas/docs/xas.1 b/src/utils/xas/docs/xas.1 new file mode 100644 index 00000000..b0c6259d --- /dev/null +++ b/src/utils/xas/docs/xas.1 @@ -0,0 +1,22 @@ +.TH XAS 1 "January 2007" "xas v1.9" "aMule utilities" +.SH NAME +xas \- X\-Chat aMule Statistics +.SH SYNOPSIS +.B none +.SH DESCRIPTION +.B xas +is a plugin for xchat. For loading see your xchat documentation. After loading +type /xas and it will send statistics to the channel you are in. These +are taken from your Online Signature file. +For this to work, you must enable the "Online Signature" option in aMules preferences. + +To enable it on every startup of xchat you can just run the script in /usr/bin/autstart-xas. +.SH AUTHOR +\fBxas\fR was originally written by niet +.SH REPORTING BUGS +Please report bugs either on our forum (\fIhttp://forum.amule.org/\fR), or in our bugtracker (\fIhttp://bugs.amule.org/\fR). +Please do not report bugs in e-mail, neither to our mailing list nor directly to any team member. +.SH COPYRIGHT +aMule and all of its related utilities are distributed under the GNU General Public License. +.SH SEE ALSO +\fBamule\fR(1) diff --git a/src/utils/xas/docs/xas.de.1 b/src/utils/xas/docs/xas.de.1 new file mode 100644 index 00000000..ba7797c6 --- /dev/null +++ b/src/utils/xas/docs/xas.de.1 @@ -0,0 +1,31 @@ +.\"******************************************************************* +.\" +.\" This file was generated with po4a. Translate the source file. +.\" +.\"******************************************************************* +.TH XAS 1 "Januar 2007" "xas v1.9" "aMule Hilfsprogramme" +.SH NAME +xas \- X\-Chat aMule Statistics +.SH SYNTAX +\fBKeine\fP +.SH BESCHREIBUNG +\fBxas\fP ist ein Plugin fr XChat. Wie man es ldt ist dessen Doku zu +entnehmen.Nach dem Laden tippe einfach /xas, und es werden Statistiken +ber deinaMule an den Channel in dem du dich befindest gesendet. Diese +werdenaus deiner Online\-Signatur\-Datei gelesen.Damit das funktioniert, muss +in aMule die Option "Online Signatur" angeschaltet sein! + +Um es bei jedem Start von xchat zu aktivieren kannst du das Script +/usr/bin/autostart\-xas verwenden. +.SH VERFASSER +\fBxas\fP wurde im Original geschrieben von niet +.SH "FEHLER MELDEN" +Bitte meldet Fehler entweder in unserem Forum (\fIhttp://forum.amule.org/\fP), +oder in unseren Bugtracker (\fIhttp://bugs.amule.org/\fP). Bitte meldet uns +keine Fehler per E\-Mail, noch auf unsere Mailingliste oder direkt an unsere +Teammitglieder. +.SH COPYRIGHT +aMule und alle seine zugehörigen Anwendungen werden verteilt unter der GNU +General Public License +.SH "SIEHE AUCH" +\fBamule\fP(1) diff --git a/src/utils/xas/docs/xas.es.1 b/src/utils/xas/docs/xas.es.1 new file mode 100644 index 00000000..3efd4ade --- /dev/null +++ b/src/utils/xas/docs/xas.es.1 @@ -0,0 +1,14 @@ +.TH XAS 1 "Marzo 2005" "xas" "Utilidades de aMule" +.SH NOMBRE +xas \- Estadísticas de aMule para X\-Chat +.SH SINOPSIS +.B nada +.SH DESCRIPCIÓN +.B xas +es un plug-in para X\-Chat. Para cargarlo, lea la documentación de X\-Chat. +Para ejecutarlo, escriba /xas y mostrará sus estadísticas en el canal que este visualizando en ese momento. +Estas estadísticas se botiene de la firma de aMule. +.SH AUTOR +\fBxas\fR fué escrito originalmente por niet +.SH SEE ALSO +\fBamule\fR(1) diff --git a/src/utils/xas/docs/xas.eu.1 b/src/utils/xas/docs/xas.eu.1 new file mode 100644 index 00000000..193c2084 --- /dev/null +++ b/src/utils/xas/docs/xas.eu.1 @@ -0,0 +1,21 @@ +.TH XAS 1 "March 2005" "xas" "aMule utilities" +.SH NAME +xas \- X\-Chat aMule Estatistikak +.SH LABURPENA +.B batez +.SH AZALPENA +.B xas +xchat plugin bat da. Kargatzeko xchat dokumentazio begiratu. Kargatu ondoren +/xas idatzi eta honek estatistikak zauden kanalera bidaliko ditu. Zure +Lineako sianduratik artzen dira estatistika hauek. +Funtziona dezan. "Lineako Sinadurak" aukera gaitu behar duzu aMule hobespenetan. +.SH AUTHOR +\fBxas\fR jatorrian niet-ek idatzi zuen +.SH ZORRIEN BERRI EMATEN +Mesedez zorrien berri emateko gure foroa (\fIhttp://forum.amule.org/\fR), edo gure zorri kudeatzailea +(\fIhttp://bugs.amule.org/\fR) erabili. +Mesedez ez eman zorrien berri epostaz, ez gure eposta zerrendan ez taldeko partaideei. +.SH COPYRIGHT +aMule eta inguruneko lanabes guztiak GNU Lizentzia Publiko Orokorraz banatzen dira. +.SH IKUSI ERE +\fBamule\fR(1) diff --git a/src/utils/xas/docs/xas.hu.1 b/src/utils/xas/docs/xas.hu.1 new file mode 100644 index 00000000..b1528d32 --- /dev/null +++ b/src/utils/xas/docs/xas.hu.1 @@ -0,0 +1,24 @@ +.TH XAS 1 "2005 március" "xas" "aMule segédprogramok" +.SH NÉV +xas \- X\-Chat aMule Statisztikák +.SH ÁTTEKINTÉS +.B nincs +.SH LEÍRÁS +A \fBxas\fR egy xchat plugin. +. +A betöltéséhez olvasd el az xchat dokumentációját. +. +Betöltés után a /xas parancs az aMule statisztikáit kiírja az aktuális csatornára. +. +Ezek az Online Aláírás fájlból kerülnek kiolvasásra. +.SH ÍRÓ +A \fBxas\fR-t eredetileg niet írta. +.SH HIBÁK JELENTÉSE +A hibákat kérjük vagy a fórumon (\fIhttp://forum.amule.org/\fR), vagy a hibakövetõben (\fIhttp://bugs.amule.org/\fR) jelentsék. +Hibákról kérjük ne írjanak levelet (e-mail-t) se a levelzési listára, se közvetlenül valamelyik fejlesztõnek. +.SH COPYRIGHT +Az aMule és az összes hozzá tartozó segédprogram a GNU General Public Licence védelme alatt áll. +.SH LÁSD MÉG +\fBamule\fR(1) +.SH MAGYAR FORDÍTÁS +Dévai Tamás diff --git a/src/utils/xas/xas.pl b/src/utils/xas/xas.pl new file mode 100644 index 00000000..5f657e76 --- /dev/null +++ b/src/utils/xas/xas.pl @@ -0,0 +1,245 @@ +#!/usr/bin/perl +# we register the script +# if someone knows how to unload it clean....do tell +IRC::register("xas", "1.9", "","XChat aMule stats"); +# welcome message +IRC::print "\n\0033 Follow the \0034 white\0033 rabbit\0038...\003\n"; +IRC::print "\n\0035 Use command \0038/xas\0035 to print out aMule statistics\003"; +# we have no life. we are robots...and we hang around in here: +IRC::print "\0035 (#amule @ irc.freenode.net)\003"; +# command that we use +IRC::add_command_handler("xas","xas"); + +#25.06.2005 - PleuR : int_to_byte, ratio-fixer, fixed line 1 (is connected to online ?) +#16.12.2005 - stefanero : some kad cleanups +#12.12.2005 - fulgas ; made kad work with xas +#06.05.2005 - niet : file handle change +#12.10.2004 - bisley : added session/total ratios +#16.06.2004 - niet : added support for memory usage and binary name +#05.05.2004 - Jacobo221 : fixed typos, sig 2 support, new outputs, crash detect +#29.04.2004 - niet : renamed astats to xas (X-Chat Amule statistics) +#22.04.2004 - citroklar : added smp support +# 2004 - bootstrap : some hints on file opening +# 2004 - niet : used some of cheetah.pl script and so astats was born + +# Five status currently: online, connecting, offline, closed, crashed +sub xas +{ + #amule program name + chomp(my $amulename = `ps --no-header -u $ENV{USER} -o ucmd --sort start_time|grep amule|head -n 1`); + #amule binary date (because we still don't have date in CVS version). GRRRRRR + #ls -lAF `ps --no-header -u j -o cmd --sort start_time|grep amule|head -n 1|awk '{print $2}'` + # system uptime + chomp(my $uptime = `uptime|cut -d " " -f 4- | tr -s " "`); + # number of cpu's calculated from /proc/cpuinfo + chomp(my $number_cpus = `cat /proc/cpuinfo | grep 'processor' -c`); + # type of cpu + chomp(my $cpu = `cat /proc/cpuinfo | grep 'model name' -m 1 | cut -f 2 -d ":" | cut -c 2-`); + # cpu speed + chomp(my $mhz = `cat /proc/cpuinfo | grep "cpu MHz" -m 1 | cut -f 2 -d ":" | cut -c 2-`); + # what is the aMule's load on cpu + chomp(my $amulecpu = `ps --no-header -C $amulename -o %cpu --sort start_time|head -n 1`); + # how much memory is aMule using + chomp(my $amulemem = (sprintf("%.02f", `ps --no-header -C $amulename -o rss --sort start_time|head -n 1` / 1024 ))); + + # bootstrap + # there is no spoon...err.... signature + open(AMULESIGFILE,"$ENV{'HOME'}/.aMule/amulesig.dat") or die "aMule online signature not found. Did you enable it ?"; + chomp(@amulesigdata = ); + close AMULESIGFILE; + + # are we high or what ? :-Q + if ($amulesigdata[4] eq "H") + {$amuleid="high"} + else + {$amuleid="low"}; + + # are we online / offline / connecting + #kad on + if($amulesigdata[5]==2) { + if ($amulesigdata[0]==0) { + #$amulestatus="Not Connected"; + $amulextatus="Kad: ok"; + } elsif ($amulesigdata[0]==2) { # Since aMule v2-rc4 + $amulestatus="connecting"; + $amulextatus="| Kad: ok"; + } else { + $amulestatus="online"; + $amulextatus="with $amuleid ID on server $amulesigdata[1] [ $amulesigdata[2]:$amulesigdata[3] ] | Kad: ok"; + } + } elsif ($amulesigdata[5]==1) { + if ($amulesigdata[0]==0) { + #$amulestatus="Not Connected"; + $amulextatus="Kad: firewalled"; + } elsif ($amulesigdata[0]==2) { # Since aMule v2-rc4 + $amulestatus="connecting"; + $amulextatus="| Kad: firewalled"; + } else { + $amulestatus="online"; + $amulextatus="with $amuleid ID on server $amulesigdata[1] [ $amulesigdata[2]:$amulesigdata[3] ] | Kad: firewalled"; + } + } else { + if ($amulesigdata[0]==0) { + $amulestatus="Not Connected"; + $amulextatus="| Kad: off"; + } elsif ($amulesigdata[0]==2) { # Since aMule v2-rc4 + $amulestatus="connecting"; + $amulextatus="| Kad: off" ; + } else { + $amulestatus="online"; + $amulextatus="with $amuleid ID on server $amulesigdata[1] [ $amulesigdata[2]:$amulesigdata[3] ] | Kad: off"; + } + } + + # total download traffic in bytes (int_to_byte *after* calculations) + my $tdl = $amulesigdata[11]; + + # total upload traffic in bytes + my $tul = $amulesigdata[12]; + + # session download traffic in bytes + my $sdl = $amulesigdata[14]; + + # session upload traffic in bytes + my $sul = $amulesigdata[15]; + + # ratio + my $totalratio = calc_ratio($tdl,$tul); + + my $sessionratio = calc_ratio($sdl,$sul); + + # do int_to_bytes to make human-readable output + $tdl = int_to_bytes($tdl); + $tul = int_to_bytes($tul); + $sdl = int_to_bytes($sdl); + $sul = int_to_bytes($sul); + + # convert runtime from sec to string + my $seconds = $amulesigdata[16]; + my $days = pull_count($seconds, 86400); + my $hours = pull_count($seconds, 3600); + my $minutes = pull_count($seconds, 60); + + my $runtime; + + if ($days > 0) { + $runtime = sprintf "%02iD %02ih %02imin %02is", $days, $hours, $minutes, $seconds; + } + elsif ($hours > 0) { + $runtime = sprintf "%02ih %02imin %02is", $hours, $minutes, $seconds; + } + elsif ($minutes > 0) { + $runtime = sprintf "%02imin %02is", $minutes, $seconds; + } + else { + $runtime = sprintf "%02is", $seconds; + } + + # and display it + + # if current user isn't running aMule + if ( ! `ps --no-header -u $ENV{USER} | grep amule`) { + IRC::command "/say $amulesigdata[10] is not running"; + # Crash detection is implemented since v2-rc4, so XAS should be backwards compatible + if ( grep(/^1./,$amulesigdata[13]) || $amulesigdata[13]=="2.0.0rc1" || $amulesigdata[13]=="2.0.0rc2" || $amulesigdata[13]=="2.0.0rc3" ) { + IRC::command "/say aMule $amulesigdata[13] was closed after $runtime!" } + elsif ( ! grep(/^00 /,$runtime)) { + IRC::command "/say aMule $amulesigdata[13] crashed after $runtime!" } + else { + IRC::command "/say aMule $amulesigdata[13] was closed" }; + IRC::command "/say Total download traffic: $tdl"; + IRC::command "/say Total upload traffic: $tul" } + # if aMule is running + else { + if ($amulesigdata[0]==0 && $amulesigdata[5]==0){ + IRC::command "/say $amulesigdata[10] is not connected"; + } + else { + IRC::command "/say $amulesigdata[10] is $amulestatus $amulextatus";} + + IRC::command "/say aMule $amulesigdata[13] is using $amulecpu% CPU, $amulemem MB of memory and it has been running for $runtime"; + + # we only display "number of cpus" when we have more then one + if ($number_cpus > 1) { + IRC::command "/say on $number_cpus x $cpu @ $mhz up $uptime" } + else { + IRC::command "/say on $cpu @ $mhz MHz up $uptime" }; + + IRC::command "/say Sharing $amulesigdata[9] files with $amulesigdata[8] clients in queue"; + IRC::command "/say Total download traffic: $tdl, total upload traffic: $tul, Total Ratio: $totalratio"; + IRC::command "/say Session download traffic: $sdl, session upload traffic: $sul, Session Ratio: $sessionratio"; + IRC::command "/say Current DL speed: $amulesigdata[6] KB/s, current UL speed: $amulesigdata[7] KB/s" }; + return 1; + # that's it +} + +# usage: $count = pull_count(seconds, amount) +# remove from seconds the amount quantity, altering caller's version. +# return the integral number of those amounts so removed. +sub pull_count { + my($answer) = int($_[0] / $_[1]); + $_[0] -= $answer * $_[1]; + return $answer; +} + +sub calc_ratio +{ + my $ratiomethod = 1; + + # total download traffic in bytes + my $dl = $_[0]; + + # total upload traffic in bytes + my $ul = $_[1]; + + my $ratiodown = 0; + my $ratioup = 0; + + # calculate ratio + if ($ul > 0) { # we don't want 'division by zero'-error + $ratiodown = ($dl/$ul); + $ratioup = 1; + } + + if ($ratiodown == 0) { # we don't want 1:0 ratio's if down eq 0 + $ratioup = 0; + } + elsif ($ratiodown < 0.5) { + if ($ratiomethod == 1) { # Set down to 1, calculate up + $ratioup = ($ul/$dl); + $ratiodown = 1; + } + if ($ratiomethod == 2) { # Increase by 10 until greater than 0.5 + while ($ratiodown < 0.5) { + $ratiodown = $ratiodown * 10; + $ratioup = $ratioup * 10; + } + } + } + $ratiodown = (sprintf("%0.1f",$ratiodown)); + $ratioup = (sprintf("%0.1f",$ratioup)); + + return "$ratioup:$ratiodown"; +} + +sub int_to_bytes +{ + my($value) = int($_[0]); + + if ($value >= 1073741824) { + $value = (sprintf("%0.2f",$value/1073741824)); + return "$value GiB"; + } + elsif ($value >= 1048576) { + $value = (sprintf("%0.2f",$value/1048576)); + return "$value MiB"; + } + elsif ($value >= 1024) { + $value = (sprintf("%0.2f",$value/1024)); + return "$value KiB"; + } + else { + $value = (sprintf("%0.2f",$value)); + return "$value B"; + } +} diff --git a/src/webserver/Makefile.am b/src/webserver/Makefile.am new file mode 100644 index 00000000..50d3f803 --- /dev/null +++ b/src/webserver/Makefile.am @@ -0,0 +1,3 @@ +SUBDIRS = default php-default chicane src + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/webserver/Makefile.in b/src/webserver/Makefile.in new file mode 100644 index 00000000..506d84a8 --- /dev/null +++ b/src/webserver/Makefile.in @@ -0,0 +1,602 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/webserver +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +SUBDIRS = default php-default chicane src +MAINTAINERCLEANFILES = Makefile.in +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/webserver/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/webserver/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-recursive ctags ctags-recursive \ + distclean distclean-generic distclean-recursive distclean-tags \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/webserver/chicane/Makefile.am b/src/webserver/chicane/Makefile.am new file mode 100644 index 00000000..84a637e9 --- /dev/null +++ b/src/webserver/chicane/Makefile.am @@ -0,0 +1,69 @@ +dist_webserver_DATA = \ + aMule.tmpl \ + add_server.gif \ + arrow_down.gif \ + arrow_down_logout.gif \ + arrow_right.gif \ + arrow_up.gif \ + back.gif \ + black.gif \ + blank1x1.gif \ + blue1.gif \ + blue2.gif \ + blue3.gif \ + blue4.gif \ + blue5.gif \ + blue6.gif \ + cp_download.gif \ + cp_kad.gif \ + cp_search.gif \ + cp_servers.gif \ + cp_settings.gif \ + cp_shared.gif \ + cp_stats.gif \ + emule.gif \ + green.gif \ + greenpercent.gif \ + l_cancel.gif \ + l_connect.gif \ + l_down.gif \ + l_ed2klink.gif \ + l_info.gif \ + l_pause.gif \ + l_resume.gif \ + l_up.gif \ + log.gif \ + login_bottom.gif \ + login_downmain.gif \ + login_lefttop.gif \ + login_righttop.gif \ + login_top.gif \ + login_topdown.gif \ + login_topseperator.gif \ + logo.jpg \ + main_bg.gif \ + main_top_bg.gif \ + main_topbar.gif \ + main_topbardarker.gif \ + main_topbarseperator.gif \ + red.gif \ + transparent.gif \ + yellow.gif \ + phpamule.png \ + tree-leaf.gif \ + tree-open.gif \ + tree-closed.gif \ + favicon.ico \ + downloads.php \ + preferences.php \ + search.php \ + servers.php \ + shared.php \ + stat_graphs.php \ + stat_tree.php \ + login.php \ + index.php + +webserverdir = $(pkgdatadir)/webserver/chicane + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/webserver/chicane/Makefile.in b/src/webserver/chicane/Makefile.in new file mode 100644 index 00000000..6e0f2d23 --- /dev/null +++ b/src/webserver/chicane/Makefile.in @@ -0,0 +1,544 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/webserver/chicane +DIST_COMMON = $(dist_webserver_DATA) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(webserverdir)" +dist_webserverDATA_INSTALL = $(INSTALL_DATA) +DATA = $(dist_webserver_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +dist_webserver_DATA = \ + aMule.tmpl \ + add_server.gif \ + arrow_down.gif \ + arrow_down_logout.gif \ + arrow_right.gif \ + arrow_up.gif \ + back.gif \ + black.gif \ + blank1x1.gif \ + blue1.gif \ + blue2.gif \ + blue3.gif \ + blue4.gif \ + blue5.gif \ + blue6.gif \ + cp_download.gif \ + cp_kad.gif \ + cp_search.gif \ + cp_servers.gif \ + cp_settings.gif \ + cp_shared.gif \ + cp_stats.gif \ + emule.gif \ + green.gif \ + greenpercent.gif \ + l_cancel.gif \ + l_connect.gif \ + l_down.gif \ + l_ed2klink.gif \ + l_info.gif \ + l_pause.gif \ + l_resume.gif \ + l_up.gif \ + log.gif \ + login_bottom.gif \ + login_downmain.gif \ + login_lefttop.gif \ + login_righttop.gif \ + login_top.gif \ + login_topdown.gif \ + login_topseperator.gif \ + logo.jpg \ + main_bg.gif \ + main_top_bg.gif \ + main_topbar.gif \ + main_topbardarker.gif \ + main_topbarseperator.gif \ + red.gif \ + transparent.gif \ + yellow.gif \ + phpamule.png \ + tree-leaf.gif \ + tree-open.gif \ + tree-closed.gif \ + favicon.ico \ + downloads.php \ + preferences.php \ + search.php \ + servers.php \ + shared.php \ + stat_graphs.php \ + stat_tree.php \ + login.php \ + index.php + +webserverdir = $(pkgdatadir)/webserver/chicane +MAINTAINERCLEANFILES = Makefile.in +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/webserver/chicane/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/webserver/chicane/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: +install-dist_webserverDATA: $(dist_webserver_DATA) + @$(NORMAL_INSTALL) + test -z "$(webserverdir)" || $(mkdir_p) "$(DESTDIR)$(webserverdir)" + @list='$(dist_webserver_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(dist_webserverDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(webserverdir)/$$f'"; \ + $(dist_webserverDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(webserverdir)/$$f"; \ + done + +uninstall-dist_webserverDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_webserver_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(webserverdir)/$$f'"; \ + rm -f "$(DESTDIR)$(webserverdir)/$$f"; \ + done +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(webserverdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-dist_webserverDATA + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-dist_webserverDATA uninstall-info-am + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-dist_webserverDATA install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am uninstall uninstall-am \ + uninstall-dist_webserverDATA uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/webserver/chicane/aMule.tmpl b/src/webserver/chicane/aMule.tmpl new file mode 100644 index 00000000..f5f344e6 --- /dev/null +++ b/src/webserver/chicane/aMule.tmpl @@ -0,0 +1,1102 @@ +<--TMPL_VERSION--> +4 +<--TMPL_VERSION_END--> + +<--TMPL_CATARROW--> + +<--TMPL_CATARROW_END--> + +<--TMPL_HEADER--> + + + + + + + [aMuleAppName] [version] - [WebControl] + + [HeaderMeta] + [StyleSheet] + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+   + + aMule | [WebControl] + + +   + + +
+ [Server] +
+
+ +
+ [Transfer] +
+
+ +
+ [Search] +
+
+ +
+ [Shared] +
+
+ +
+ [Stats] +
+ | + + [Graphs] + +
+ +
+ [Options] +
+
+   + + [ServerInfo]
+ [Log] +
+ +
+   [Connected] 
+   [Speed]  + + + +
+ + +   ed2k:// [Download] + + + + + + + +
+   +
+ +
+ + +   Logout + +
+<--TMPL_HEADER_END--> +<--TMPL_HEADER_META_REFRESH--> + +<--TMPL_HEADER_META_REFRESH_END--> +<--TMPL_HEADER_STYLESHEET--> + +<--TMPL_HEADER_STYLESHEET_END--> +<--TMPL_FOOTER--> + + +<--TMPL_FOOTER_END--> +<--TMPL_SERVER_LIST--> + +  + + + + +
+[AddServerBox]

 

+[ConnectedServerData] + + + + + + + + + + + + +[ServersList] +
[ServerList]
[Servername][Description][Address][Users][Files][Actions]
+
+
+<--TMPL_SERVER_LIST_END--> +<--TMPL_SERVER_LINE--> + + [1] + [2] + [3] + [4] + [5] + [Connect] +[RemoveServer] + + +<--TMPL_SERVER_LINE_END--> +<--TMPL_TRANSFER_IMAGES--> + + +  +<--TMPL_TRANSFER_IMAGES_END--> +<--PROGRESSBARWIDTH--> +200 +<--PROGRESSBARWIDTH_END--> +<--PROGRESSBARIMGS--> + +<--PROGRESSBARIMGS_END--> +<--PROGRESSBARPERCENTIMG--> + +<--PROGRESSBARPERCENTIMG_END--> +<--TMPL_TRANSFER_LIST--> + + + + +
+[DownloadHeader] +[DownloadFileList] +[DownloadFooter] +  +[UploadHeader] +[UploadFileList] +[UploadFooter] +  +[UploadQueue] +
+<--TMPL_TRANSFER_LIST_END--> +<--TMPL_TRANSFER_DOWN_HEADER--> + + + + + + + + + + + + + + + + + + + + +<--TMPL_TRANSFER_DOWN_HEADER_END--> +<--TMPL_TRANSFER_DOWN_FOOTER--> + + + + + + + + + + + +
[DownloadList][CATBOX]
[Filename][Size][Completed][Transferred][Progress][Speed][Sources][Prio][Actions]
[TotalDown][TotalDownSize][TotalDownCompleted][TotalDownTransferred] [TotalDownSpeed]  [ClearCompletedButton]
+<--TMPL_TRANSFER_DOWN_FOOTER_END--> +<--TMPL_TRANSFER_DOWN_LINE--> + + [ShortFileName] + [2] + [3] + [4] + +
+ [DownloadBar]
+ [5] + [6] + [PrioVal] + [7] + +<--TMPL_TRANSFER_DOWN_LINE_END--> +<--TMPL_TRANSFER_DOWN_LINE_GOOD--> + +[ShortFileName] +[2] +[3] +[4] + +
+[DownloadBar]
+[5] +[6] +[PrioVal] +[7] + +<--TMPL_TRANSFER_DOWN_LINE_GOOD_END--> +<--TMPL_TRANSFER_UP_HEADER--> + + + + + + + + + + +<--TMPL_TRANSFER_UP_HEADER_END--> +<--TMPL_TRANSFER_UP_FOOTER--> + + + + + + +
[UploadList]
[User][Filename][Transferred][Speed]
[TotalUp][TotalUpTransferred][TotalUpSpeed]
+<--TMPL_TRANSFER_UP_FOOTER_END--> +<--TMPL_TRANSFER_UP_LINE--> + + [1] + [2] + [3] + [4] + +<--TMPL_TRANSFER_UP_LINE_END--> +<--TMPL_TRANSFER_UP_QUEUE_SHOW--> + + + + + + + + + + +[QueueList] +
[UploadQueueList]
[UserNameTitle][FileNameTitle][ScoreTitle][BannedTitle]
+

+

+  +

+<--TMPL_TRANSFER_UP_QUEUE_SHOW_END--> +<--TMPL_TRANSFER_UP_QUEUE_LINE--> + + [UserName] + [FileName] + [Score] + [Banned] + +<--TMPL_TRANSFER_UP_QUEUE_LINE_END--> +<--TMPL_TRANSFER_UP_QUEUE_HIDE--> +

+

+  +

+
+<--TMPL_TRANSFER_UP_QUEUE_HIDE_END--> +<--TMPL_TRANSFER_BAD_LINK--> +
[InvalidLink]
[Link]
+<--TMPL_TRANSFER_BAD_LINK_END--> +<--TMPL_TRANSFER_DOWN_CLEARBUTTON--> +
+<--TMPL_TRANSFER_DOWN_CLEARBUTTON_END--> +<--TMPL_DOWNLOAD_LINK--> +  + + + + + + + +
+

[Download]

+
+
+  
[Ed2klink]

+ + + +

[CATBOX] +

+
+<--TMPL_DOWNLOAD_LINK_END--> +<--TMPL_SHARED_LIST--> + + + + + + + + + + + +

[Message]


+[SharedFileList] +
File Name + Transferred Data  + (Total) + + Requests  + (Total)  + + Accepted Requests  + (Total) +SizePriorityED2K Link(s)
+

+

+  +

+<--TMPL_SHARED_LIST_END--> +<--TMPL_SHARED_LINE--> + + [ShortFileName] + [FileTransferred]([FileAllTimeTransferred]) + [FileRequests]([FileAllTimeRequests]) + [FileAccepts]([FileAllTimeAccepts]) + [FileSize] + [Priority] + +ED2K Link(s) +[PriorityUp] +[PriorityDown] + + +<--TMPL_SHARED_LINE_END--> +<--TMPL_SHARED_LINE_CHANGED--> + + [ShortFileName] + [FileTransferred]([FileAllTimeTransferred]) + [FileRequests]([FileAllTimeRequests]) + [FileAccepts]([FileAllTimeAccepts]) + [FileSize] + [Priority] + + +[PriorityUp] +[PriorityDown] + + +
+<--TMPL_SHARED_LINE_CHANGED_END--> +<--TMPL_GRAPHS--> + +  + + + + + + + + +
+
+ +
+
+
[TxtDownload]: Max [MaxDownload] [KByteSec], [TxtTime]: [ScaleTime]
 
+
+
+ +
+
+
[TxtUpload]: Max [MaxUpload] [KByteSec], [TxtTime]: [ScaleTime]
 
+
+
+ +
+
+
[TxtConnections]: Max [MaxConnections], [TxtTime]: [ScaleTime]
+
+
+
+
+ + + + +
+
+
+<--TMPL_GRAPHS_END--> +<--TMPL_LOG--> +  + + + + + + + +
+
[Log]
+
+
+ + + +
+
+<--TMPL_LOG_END--> +<--TMPL_SERVERINFO--> +  + + + + + + + +
+
[ServerInfo]
+
+
+ + + +
+
+<--TMPL_SERVERINFO_END--> +<--TMPL_DEBUGLOG--> +  + + + + + + + +
+
[DebugLog]
+
+
+ + + +
+
+<--TMPL_DEBUGLOG_END--> +<--TMPL_STATS--> +  + + + + +
+
[STATSDATA]
+
+  +<--TMPL_STATS_END--> +<--TMPL_PREFERENCES--> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[WebControl]
+[UseGzipForm] +
+ +    [UseGzipComment] + +
+
+[ShowUploadQueueForm] +
+ +    [ShowUploadQueueComment]
+
+
+[RefreshTimeForm] +
+ +    [RefreshTimeComment]
+
+
+[GraphSettings] +
+ + + + + + + + + + +
[GraphWidthText][pixels]
[GraphHeightText][pixels]
[GraphScaleText][seconds]
+

[aMuleAppName]
+[SpeedForm] +
+ +    [MaxDown]: [KBS] +  [MaxUp]: [KBS] + +
+[SpeedCapForm] +
+ +    [MaxCapDown]: [KBS] +  [MaxCapUp]: [KBS] + +
+[LimitForm] +
+ + + + +
[MaxSources]
[MaxConnections]
[MaxConnectionsPer5]
+
+[FileSettings] +
+ + + +
[TryFullChunks]
[FirstAndLast]
+

+
+  +<--TMPL_PREFERENCES_END--> +<--TMPL_LOGIN--> + + + + + aMule [version] - CTemplate 0.44b - [WebControl] + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+ + + + + + + + + + +
+ +
+ [WebControl] | [Login] +
+ +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +  
+ [EnterPassword]

+ + +


+
+
+ +
+ +
+
+ +
+ + + +<--TMPL_LOGIN_END--> +<--TMPL_CONNECTED_SERVER--> + + + + + + + + + + + + + + + + + + +
[ConnectedServer]
[Status][Servername][Usercount][Disconnect][ServerOptions]
[1][2][3][Connect]
+  +<--TMPL_CONNECTED_SERVER_END--> +<--TMPL_ADDSERVERBOX--> +
[Message]
+ + + + + + + + + + + + + +
[AddServer]
+
+ [IP] + [Port]
+ [Name]
+ + + +
+ +
+
[UpdateServerMetFromURL]
+
+ [URL]
+ + + +
+ +
+
+<--TMPL_ADDSERVERBOX_END--> +<--TMPL_WEBSEARCH--> +
+ + + + + + + +
[WebSearch]
+ [Name] +

+ [Type] +

+ + + +
+   +
+
+<--TMPL_WEBSEARCH_END--> +<--TMPL_SEARCH--> +

[Message]


+ + + + + +
[Result]  ([RefetchResults])
+
+ + + +[RESULTLIST] +
+ +[CATBOX] +
+
+  +
+
+
+ + + + + + + +
[Search]
+ + + + + + + + + + + +
[Name]
[Type] +
[SizeMin]
[SizeMax]
[Availabl]
[Extention]
[METHOD][USESSERVER]
[Global]
+
+ + + +
+   +
+

+

+
+
+<--TMPL_SEARCH_END--> +<--TMPL_SEARCH_RESULT_HEADER--> + +[Filename] +[Filesize] +[Sources] +[Download] + +<--TMPL_SEARCH_RESULT_HEADER_END--> +<--TMPL_SEARCH_RESULT_LINE--> +[FILENAME][FILESIZE][SOURCECOUNT] +<--TMPL_SEARCH_RESULT_LINE_END--> diff --git a/src/webserver/chicane/add_server.gif b/src/webserver/chicane/add_server.gif new file mode 100644 index 0000000000000000000000000000000000000000..0996c63320c97221c0cc488a3858f71b82d3c6f9 GIT binary patch literal 625 zcwTe&bhEHb6krfwcoxSH5TENEndayl5$?tqmR6cl+z_8v6`or7=ZQgnVPgNBWwqVY zvMSrs%bNdvo)_%Q`2YX^GgoeJ*>|jW=92Q(iEpoJ|ND9J&u!&Lr!-v58K1s>qLA+8v)s38Kej{X%?PgW?>0f^Ob_V&&$4m6L z4|M$R*s-=IEjPs{D$U+I%*4)B*VOjNnahro!VUTzv)0!cSUO(1ala@t^OS$+p82bi zi|SWz-Mjn9nYxJN{|sEyoBFI={cDAo; literal 0 HcwPel00001 diff --git a/src/webserver/chicane/arrow_down.gif b/src/webserver/chicane/arrow_down.gif new file mode 100644 index 0000000000000000000000000000000000000000..06637a76d78f093b1d310c99032b1aa20c69763e GIT binary patch literal 204 zcwTe&bhEHb6krfwI3mbko@%Y-Yvgdv&gqQ3?Q}a?6AkA-_U->#PW?Zb{4&vTm;L|$ z|Kp#;?)$eV{BCI3-(t68E8z2^Y+YKr{SPdVR5vCCB~p4N{RDE0neco90?y9 Qa)S4MiO}(HXJD`f0KMEl%K!iX literal 0 HcwPel00001 diff --git a/src/webserver/chicane/arrow_down_logout.gif b/src/webserver/chicane/arrow_down_logout.gif new file mode 100644 index 0000000000000000000000000000000000000000..32b006c22f891c6e33682788361253cc38e80bda GIT binary patch literal 97 zcwTe&bhEHb6krfwnE0RJz<~pzZVCVY|9|k{f#OdVMg}0z0TCd11}3AH{+Wl*X0^>I yaZq@<#UOiKh3KP>*}^lTL>XT0;#>RiP}7_%_vdu~2>l%!!*lOKstq4EgEasMl_zrm literal 0 HcwPel00001 diff --git a/src/webserver/chicane/arrow_right.gif b/src/webserver/chicane/arrow_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..8d1718050a870197bab51fce138ca8eb9c3d7050 GIT binary patch literal 85 zcwTe&bhEHb&n(!vS^1-s+P)k0?wp9)chtoHBe0gN_J&=LH8UQv1AesOG literal 0 HcwPel00001 diff --git a/src/webserver/chicane/arrow_up.gif b/src/webserver/chicane/arrow_up.gif new file mode 100644 index 0000000000000000000000000000000000000000..8811538b396839d8a2b3fc555794b497f364b9ee GIT binary patch literal 204 zcwTe&bhEHb6krfwI3mbk?v^SiYhqt>#x`+!@%q0mHOK7gukE?{FSP%zeaWu>|NqBM ze{%A{|HRoZTXz1lpZG`1&=)AkKr~SN$-?-8S&%^o!~xmK!0MTx(wCAs?*#{oCMO5; z?R_qS%Nq(6oQh^!9(8i~ax#R?t@(tBl5D?5vBO@*b>WATrCyZ9M(Js7SN+$J_<7@$ Q=FsbUI%1cyS{WFu0gqcljQ{`u literal 0 HcwPel00001 diff --git a/src/webserver/chicane/back.gif b/src/webserver/chicane/back.gif new file mode 100644 index 0000000000000000000000000000000000000000..95e638dcc3ca2e66b2898f6e1a3d30bd4955e2f0 GIT binary patch literal 64 zcwTe&bhEHbjEB<6*v*lLz=6id7 P^S3?nnD#7~fx#L84)GK9 literal 0 HcwPel00001 diff --git a/src/webserver/chicane/black.gif b/src/webserver/chicane/black.gif new file mode 100644 index 0000000000000000000000000000000000000000..d8172d8896ea634bebe332a83dc7e3fab7c673f0 GIT binary patch literal 83 zcwTe&bhEHbWMtrC*v!B%Y0{+3%*@2Z#E6Ipe}8`$7Z+=5YePdrWo2baNl69_paUX6 TdKp+a3>p>KG@mWtV6X-N+TIR8 literal 0 HcwPel00001 diff --git a/src/webserver/chicane/blank1x1.gif b/src/webserver/chicane/blank1x1.gif new file mode 100644 index 0000000000000000000000000000000000000000..1d11fa9ada9e93505b3d736acb204083f45d5fbf GIT binary patch literal 43 scwTe&bhEHbWMp7uX!y@?;J^U}1_s5SEQ~;kK?g*DWEhy3To@Uw0n;G|I{*Lx literal 0 HcwPel00001 diff --git a/src/webserver/chicane/blue1.gif b/src/webserver/chicane/blue1.gif new file mode 100644 index 0000000000000000000000000000000000000000..46428b5b68421ba2a97db2c688b29568776c5e4e GIT binary patch literal 83 zcwTe&bhEHbWMtrC*v!Ddu=otmva{kxKPsL0q;u-C#o5o!7ryvj`WkliYs-Tl3>ZKM VM1b@%uy6>dl=vt*w{S360|3#Z7uWy* literal 0 HcwPel00001 diff --git a/src/webserver/chicane/blue2.gif b/src/webserver/chicane/blue2.gif new file mode 100644 index 0000000000000000000000000000000000000000..ff9f803b3c91261abbdabf2f5cd33aec162ebc65 GIT binary patch literal 83 zcwTe&bhEHbWMtrC*v!DdGwY`Kj{i!#|Lg4gZ*l0q^U?odr~fldzv+AOf6J}^3>ZKM VM1b@%uyA}(Y37ntYT#h71_0tw7+nAW literal 0 HcwPel00001 diff --git a/src/webserver/chicane/blue3.gif b/src/webserver/chicane/blue3.gif new file mode 100644 index 0000000000000000000000000000000000000000..a3952af2e97e25312b3515bf83e13a99f359f7b4 GIT binary patch literal 83 zcwTe&bhEHbWMtrC*v!DdP&*IZvEaY+(*M4z{)esm-*V(X0|w9m U5g@$`EF1zVB|eJIEgTHi0EjFWjsO4v literal 0 HcwPel00001 diff --git a/src/webserver/chicane/blue4.gif b/src/webserver/chicane/blue4.gif new file mode 100644 index 0000000000000000000000000000000000000000..80e0665335246b3caf3214c5c0abfda7b52a3a6f GIT binary patch literal 83 zcwTe&bhEHbWMtrC*v!Dd;B%8F_@;Qqf2I8YI%WSYYX3X8{`c+vA2#uS%liKe7(fR^ Ufb=r3a0sZB_$WHJa4=W{06q#8KL7v# literal 0 HcwPel00001 diff --git a/src/webserver/chicane/blue5.gif b/src/webserver/chicane/blue5.gif new file mode 100644 index 0000000000000000000000000000000000000000..27d15ffbc2f246656a9b3be7d1569430b8957e61 GIT binary patch literal 83 zcwTe&bhEHbWMtrC*v!DdpmtN-;lGmSf1SYp7SaEmQ~vwr{0}Sn-!khzkKs)Q44?xd UKzbQiI0P0Xb4e;K;b5=^00PJq5C8xG literal 0 HcwPel00001 diff --git a/src/webserver/chicane/blue6.gif b/src/webserver/chicane/blue6.gif new file mode 100644 index 0000000000000000000000000000000000000000..fc1402139d8d78eb25a3ebc0d9b1f811978e3c03 GIT binary patch literal 83 zcwTe&bhEHbWMtrC*vtR~H+gt&ii`hOQu?o>^WVbazq9jyU*G>>VgFlN{xe_z9S{N1 S%fP}Rpi<(a=-k4=U=0AL`x2P| literal 0 HcwPel00001 diff --git a/src/webserver/chicane/cp_download.gif b/src/webserver/chicane/cp_download.gif new file mode 100644 index 0000000000000000000000000000000000000000..1769b81b2e7885546e79de2dc51a92911fa0dc73 GIT binary patch literal 1441 zcwX(3+c(<>0DymT6A_V!%TGkaFb?6!Ic9U&X*llfOfhq7T}p{CQAVhtZY0iN{tC6S%luoM-b`%f30?8YuAI=#Pb9;AtSFSTB zuhRga451}6x0T4Qr#CNiCeFSTsg5k{k1y2e<0|LIZEDrZ$<2^cX7)L!{PhjjikXYV zUzC<*Z#)xp-J^8sVer%N7-h>3r)hBvp?qLf6*Z{T&lTUw!aexW_)_xPo33l`g`(z- z)i0>LI*((j3>YmSQ)nE<#=F%>>>6Zv=1_FGeo~`Ra+485V04<8s#dGDWB7V0J$i9X zn6L`5J@t3TkIonw%8DxIV6;|XG5S`nwr_^E7bAkBA75jrtggM@m0d0@(c&?FY1sO8 zO3zM2-@B+6o30HT)N+a0tE1L!<=p9&OnI$PTyDNO?wUWW8QIIMky^0^3Exf#8~5zQV{au-R#`FhJIy=!MpUUjDQbeW%0e7l zWDT4gDl7mV*|U`Um5K$$;k;LmK*-h+O&=&HdQ@9>?~sFPC=ovu`hO?En!9>%KhP|& z4ifljxRsP;cF-R=cE-0MnR8S3lGhg40hI@9%`enF52geD1YHo?cNfPID2nx9I_GX% z*%pNs*}@kjY8yG+VJYAS)}o(DC@O8HR>SE~%6}MHfGY*>h5Gq`iFFxb!#i1pJ_Ptn zo)k!XE|s!vI&S-bl+u1NAvGvD4on+T_~-;qX?~HA%qa+BK69(SSBuWa{w*`TXjNY!`SA0F9Y?F*S`DpDl>`!{y1 rrGemJykrVnj6Sxt>%k~ji?P3!bU*dR04AP(41}*cuka}x2DtqLtR(I( literal 0 HcwPel00001 diff --git a/src/webserver/chicane/cp_kad.gif b/src/webserver/chicane/cp_kad.gif new file mode 100644 index 0000000000000000000000000000000000000000..aa1a9a80fea873b71618fba100845488c6be5b8b GIT binary patch literal 1671 zcwVKG`)?HG9*1XTx9#@kx~+v$F5P7j))wgYMyKA|bxZ4LNg0*kq++{cEI5cQg9&D8 z(sn0^GU8UpYldSNI>%yo6|}GR92teCywnyZC}fP6Ov(Yzi$pVk^^Aug?|cp37fb{Ak2ruOgO@YNg+&%;iw#;6p~~~N+2nbq*anpq7)xxK$Hbh z4pKBv(F(=O6b~r@Py(VvKr<4}L7IoOpwa@OrL+buBW51KP$a_$3@0%hU_^~k3`RBB z0Ku{h%K?^yEU&OUU}c?E3|7_I^j9@mV6f2S!ak0NoCG*Y<5YtKCI>JFEl$InZt-D) zCw+W0%nK4Ps=TQ265>^p2L=yJ9;U@Sw0O2u>6**N=R28TIs>oDL8!!RD1^`C_fdY~MWDx)zz_bR?F)%EEZD2c)4L~je z`6yIGsK^iim_{=oG9kjyu%Kx}Y(vY2wxjV8O^9kDt;vF>${GZkX=~UQtvt>JuLpXn*!2jJY zg7}#zzqy2)n;^1o5NEs#T6`}bOJp|r+9$g^-MR1l`;~{A2lstapXaOo@$I!O1I_-u zWXZQ+xN3Ksd-;XB?g{r3X7BHp9^LlOQ_1b_O;0|Lf2!;HV(s2bPi4P;VB>wQ&+$gt zPx{VRx5iTIzj-Ur^?r6|<@eyNg?9yO4mbEx=iaR;H-`OQ?`u_ecYHDVXB_7Yu4;U# zW7E*ibH35o#OUV4vN!H1*;P;wh$pfZJ^kXHp-qRnUwOM`Ma$^e?(>DW`QNSS+uC`* zXHV^yBkSI&AhM6uBy(YMXgtH4_kQg4$)sy`&JQc|f4_=;9>37f70$Z`JM95aZSFmj zL#dcI&$l4C<8*2&96u1caqEU9-L3s4Cu$FDnCWO7tS!8EVyJP>8gF*-qK4&zi42gJ z?QYmu|KAsgwPZzGa&O@?y$y-tgJW73t|yNU3wifzlSI~eNpEUrGZFTXDHT4O5X+NqIafr6PU z=Unr9XPU{DkK?&zt?kbb)l=);F8A&0W>a$>{WxoF#Z&Iza?1{0&lkuPyl1viCw)V^way%ayq>wC+Lw z;<2MI)e73Gvk@7M#fKM_HKy}941Gqri$826H-}Ed2oeiPO!`M>8gvDr%PJS z4#e`$QD=@9d^lF=oqJz9-LyDXF`ALT=twe=|K#;}Q%JecC)R)8chs};y_Rij%2Pz( zq0c}1SI5A_14pjp1ee~C%3uBX_5RIE|1(n6vY=gxCy%Z9r7z}R>d@17u5Xjjvazv! zQoTx)Hn05rzCJuWn9;TR$Kl7no8P>=r>W?%QXx|P^^RYsmdTTqCu8UTc;@nB z@)L9-G*-HQER?#uFK_kvnC`!yA0ou*-Olu`ieY*DvkUt(ue#?poXwB<0>ceifsH$^ a%wEh%1x}PrU5tKJyr1Yheaht`?)nQK5nZ-+W&0 ze1H9X>R&usi?tU+g-`-Y#j*PwyTh?-vml|_@s&71;5ryKAh1yfV>%cV9EAx0W+ZSN z{1OB~8ekGLkeHFgF%ndgpbRjD87PvZC;&wpU>ZYd%s>OD0W@QT86(1AItD`-P#K10 z0jwQhXPpG~=>J^2mSNcdI zaRffxcWScST())RUWsyh!bRUdJ~Y?55!sx-eN|g|+za_5Z>N1)+uOGW(c^nG=$Y*e zf39*Zkqn{`-l_JeiK$LNiSi$(*xSR)6h-7uK!`aO@`Fe zG-o${ZCotua@qz5UjI%pQNQQln(5rrLUX9#9NcJmd8_CT6(lP8xeT;$=9fLsxy{zx z4_frsWylzELwP8K%w<%L#V=->YS*Qir8tILEwJbphFdzBI zOmhZ;^HqweX=Wt?YNe*GIa{77^q6|wqH=Y%vlFYoVZZMC?fdmR=L?Tu28Se40V?pm z64(=;78RF#;ONQt)a-a(UNS%b05_ev|40}+J~>O2mLm=c+jHzYY5JL>>$mhZjW;A0 z6=#cUPUIKIrsSlYF5%@@+#Q{sf4(>~XB^NzRCe6X5|ltK_1}x@wg=X(R4ZL;H^K zFNM48tGhb3aGBwahiSa+4cc2(SKIoJ`@Na#SkhjYZ%v;lfZDjevOCJ%bq7lywKQ_P zW~vU2P0gGdt`0JWdN$EYCYnkkU8?rFNiST^)>Xo0*m2mcv_>_O`-OzzTB~g9xjk4` zeO2Dn4w!+%ezw21o>85Q&hM?=CSrQ**)-pNj)1og+_rP}>HPhPA0_Se)8`|f)N)o< zmSG6KmlHTv9`ka#U$56Z*n5z_gWjD&(-g-Z<7G%H>dgS4@bya%AZT05+w(`868v`=V3VQ#w&hv^<^y1~@rq;{3rW{mbj!~$w;F&@p05(;aRUjnV^V~4`$!6P z5P)egofy5vpmSiOH8a*hqpWAdt)X(5#9|3`q?7b;!u3Pr(39S36#ZDr5^US00rTx~vngU0kK9eurI{b-A3zK#; z+_Ge#UN6&8M!b6+Cjpz_F(K+c{w>?$L9BJnsONd#z_-v=Gy;Kki)xu|QrQW}0=sHj ucG?_dT;DbBuA3r;%}&bJMR}NHXgtXp=Utw=WCvI14iC*`-g6@Y+y4bxogTFS literal 0 HcwPel00001 diff --git a/src/webserver/chicane/cp_settings.gif b/src/webserver/chicane/cp_settings.gif new file mode 100644 index 0000000000000000000000000000000000000000..6a1debc31a6eda2d3c8373249072de075e17f261 GIT binary patch literal 1055 zcwU{6{WIHl0DwQqH*bx66Coi&DhWv?sF$7LhI$R5N?KNHS7qu>+pvbYxyjukFJ3CE zB$IWm_L{K6u51_?9aZmoTf4>Cyq0FlZ0D}EX0BU%K3o5VJ-0DQb|;FAs2AL zmK@y31?C)J$O4U-VAbdkCyQPTNNg9en?~|j1#a>qhI1ebeqRYkGT}hX)2~u?u2T1I zQbx;hyI)J;*xPU@8TLnPw#B|`XKK^IMzbI637)E^?%(!a*SjcF0PHygyZQT_%$Kd` zL)C$@SfEY=8|J`;8vKnsu-6^4KlA=l9cSnq*y~MNYYF|$NOb7QaBCPYwLrTLj^^BN z3~R~;y_Mc}!<%p-|8|9NpcpJDksm%Fwx0%fl)mtB*UHD(%0#d~bIEy=^U{_EA5_EH z(y3A~T8gyhf!?#A^9u|2AJ_ez?SXLfTZe(;>`sE~T|ZU3Jh>)*{L(Mz6slNP`J9Y#D^8}5g zh8?lEG^jx4fKSMizt~~pykrn9JT-6CB!0q)ta5HUHi)TQ{-{~63i(CPWu9ad3>oWa zyfod5#|oq)(j+LNG^A+xs5R*XD^sl9nxjOee&!5gf;qnA3U}=Kc+nloDfnr?JEjEP zuqlSnoU-gEHTtD$+e4j>37YUooOVa0O0A_7BmTdyOg1btvw#n~&wtmYY@HkL2s5K? z{+XAPWq~Qrt!^3VO2WuD{p})gQ>evsKf3`V$dQxi@14_%HP}3>qImkkqnv}DVi}fn z_}zzhd6B_ikkBCaTW`$vwLLS?<_8A9E3-!Z38ank^T&3}Yt)3Zoh2$e))PHb<(MKp zRS4ESQI!IRUbK%Nm%J*RoN|jfYI`IksO^a$f4(j^gEf>B&q~KVLuf0#3gl#5zaaq> z)XRKDf%7Fr7+HxWnJFTNgX3{Z(-_M=dgh)nqG~K&$v7%;0IyhTcznKwBGpjb&2&7H zO~PRC;qt<1uK>QA)EpaSzh@3t(o2!5Pt@E_pY;s0nt)OR`ZR?dyxqf&Ix$vb0hXrr_3+7j! AzyJUM literal 0 HcwPel00001 diff --git a/src/webserver/chicane/cp_shared.gif b/src/webserver/chicane/cp_shared.gif new file mode 100644 index 0000000000000000000000000000000000000000..9f609526e84469b01abc47ff36de0387545358a5 GIT binary patch literal 1511 zcwXg`>sQiu0EfRID(G5brbx;yEK+oWuGFl&B%zsC@`}x$kWyI-b&^dJ2n7|*@CKz* zG@F@rz{#;ybDAPVb*kxcX=lw`7rLisdFwdV{*Ha#J#U`#y!q^jWCR341V8|by#O66 zToZi?cBmhAavW67qW7Hw0v%|z^uD_RJt}67W`g>E%BPyhHBy)3`OY%&<^dk)UIm>N zkKSDNjia|ePIx`Y1^N{*_z7s2r7v3O*Y?qMduhFUy;QNbIdv}GT5xX#j4uP@0^N{6 ztT|{KT^bumJ{Dw?)6xN+escVC1@Xr+&@I+2_jtCZ09F$sI5*kHHh+gbGNBwiSnQZv z-8H)ct}ak@Y(yZ$^uy-{qMA6=?t<-65y9{y>Ma_`=kW^t*#W@%q2tKcI^piJC?`f# z6fC0!w7v6tpNVfP0u>8DFzZpe%_Yg392_?&k7?!6Did-2#k;BAUhwezJvHe-H4X;e z0R3FXoDkH#2j$O!z({BK>T6gd^4RN=s5<8q(0;LIfCr>mVxLu#DZ%is- zI>9{|!KtA@a2c>0r@Oy1wWQx`;mizFKD=;bQho55q4lp{>S~gR#o_kl@ov+);`y07 z7K_EykajxSRRwuzPll+teww0PS=(IL^mWZgw~scY9t+16Mv^MheE1Rgdlz{*JFp6l z|AgjygDO?8OqQnkRA=};`dMA1<;2G}L z>O{=r!OB;Yx<^+}O*@W}${Q%N$6I&psFo)#2f$3=p-y4hLJP z!Z@wCOlI%R<`MWG^#DWT8kHgvag8SPF@|(=b&NJ@)!`^uP~ivjla4FH_z*E0 zIUHuRL$7BOF!PzA6)rfLIUs&ihBhG15F*y5f!hn^CBT4nuyH!<`uCygtC1MXMzzEtfk`ZKCNf*OW>{ARhY4LO*@?+B63Yo;JoWwn zPo(SFn5Z~H0$HK%ti<#oH&!c0v(wb=3eT6#Bau*($3j2mk)+LoUForf=9vWg#O zkn@>z)P{Qhb{VNb4!zas7JME!|}Hb?D$nDd6JoUJ)P6c=8@G| zwH>bUZ>VxeaGz#N5PmQ*FcCubeb2^Pam6jwg&z9tuhN+|S8Uw1m6Xd)8Jko+o!L^0WEBW`oJiX zwiHk)&}j|KRaTJ}aMa=4ofxTUsgw*^B|;iZX0>K=mx$gfONtnGz3@l)%1^%Md%ij6 z?K$$JM~aYIArOKn*haro`kkiVNgkSe9_K;?s9gY615^tXCZJRUr5Px#K&1mJ+HKog zH4e09pmhMP8|WNB=LcptFb9Cu4Xi<6^8*|0A>arAM-VvZKmZpl65s^DN#Ldx1%6r- zgs31CgOq9rb3xW1WD7wq0>WvLJOtzEaGs0c;Up|VV387*Dqw2>wgq8F2zC)LPKYF^ z2*E^FzsMF8xk4g(f|C-Qkhn>y6qOOfQ-jB07zL2ZE42BSKE&=iWA2+ABF z&9sx0H5j#qNNXr+B`7ON*+|MkP!5uE5tNIhaFTLIDN00A|MMU4cf@WV)$8>Xec%+J zb{e&lXheUp7yxvD-0e@;{s{m*0{=jQr>2D0j8M}4ylIV)51!+v3Viaaq^$DRh^G0Y z`CUNxI%s&{@%E>ed>lcNe6wBLw1b{WyB+OHFXaCG${!=6>_Ps@q?Ple^B6n-;+kNZ z%{?)4Kzb|u*<;RxQvN~V4{h&qyw2lI3-|Rs1Gb_1O^y8y{_Clng5HHiVfjGK)t1f0 zbG<8T{o)t)!hO4zk7kr=@}3>?5zvp*hsIeMxvD1i7V3U=}x}mZqPNTv>Md)>rWxGx^1x17|0O4a_j}$c^O130TbIgWh4(Jc z3xu-P;nd6q?|izr^(O`=YjyJ^Q*i5hG4zZf>`h3SAiQn$Lqa1b+hSjnovHA8&2??E zT7JgqN>O6=X-5~wf^Ln;o-gv;kFENokj<&Ao|ngE+ar=|*-QG_J%!3G@L|_$7;_A- zJ2_Mym$QOhpBV2*@mF9w?|~1oc-e(6Zea_ + + + + +aMule " , amule_get_version(), " - Web Control Panel"; + if ( $_SESSION["auto_refresh"] > 0 ) { + echo "'; + } +?> + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +   + + aMule | Web Control Panel + + +   + + + +
+ Server list +
+
+ +
+ Transfer +
+ +
+ +
+ Search +
+
+ + +
+ Shared Files +
+
+ +
+ Statistics +
+ | + + + Graphs + +
+ +
+ Preferences +
+
+   + + Serverinfo
+ Log +
+ +
+   Connection: +   Speed: Up: ', CastToXBytes($stats["speed_up"]), 'ps', + ' | Down: ', CastToXBytes($stats["speed_down"]), 'ps', + ' (Limits: ', CastToXBytes($stats["speed_limit_up"]), 'ps/', + CastToXBytes($stats["speed_limit_down"]), 'ps) '; + ?> + + + + + + + +   ed2k:// ED2K Link(s) + + + + + + + +
+ +   +
+ +
+ + +   Logout + + +
+ +  + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + "Low", 1 => "Normal", 2 => "High", + 3 => "Very high", 4 => "Very low", 5=> "Auto", 6 => "Powershare"); + $result = $prionames[$file->prio]; + if ( $file->prio_auto == 1) { + $result = $result . "(auto)"; + } + return $result; + } + function StatusString($file) + { + if ( $file->status == 7 ) { + return "Paused"; + } elseif ( $file->src_count_xfer > 0 ) { + return "Downloading"; + } else { + return "Waiting"; + } + } + + // + // declare it here, before any function reffered it in "global" + // + $sort_order;$sort_reverse; + + function my_cmp($a, $b) + { + global $sort_order, $sort_reverse; + + switch ( $sort_order) { + case "size": $result = $a->size > $b->size; break; + case "size_done": $result = $a->size_done > $b->size_done; break; + case "size_xfer": $result = $a->size_xfer > $b->size_xfer; break; + case "progress": $result = (((float)$a->size_done)/((float)$a->size)) > (((float)$b->size_done)/((float)$b->size)); break; + case "name": $result = $a->name > $b->name; break; + case "speed": $result = $a->speed > $b->speed; break; + case "scrcount": $result = $a->src_count > $b->src_count; break; + case "status": $result = StatusString($a) > StatusString($b); break; + case "prio": $result = PrioString($a) > PrioString($b); break; + } + + if ( $sort_reverse ) { + $result = !$result; + } + //var_dump($sort_reverse); + return $result; + } + + if ( ($HTTP_GET_VARS["cmd"] != "") && ($_SESSION["guest_login"] == 0) ) { + $name = $HTTP_GET_VARS['file']; + if ( strlen($name) == 32 ) { + amule_do_download_cmd($name, $HTTP_GET_VARS["cmd"]); + } + } + + $downloads = amule_load_vars("downloads"); + + $sort_order = $HTTP_GET_VARS["sort"]; + + if ( $sort_order == "" ) { + $sort_order = $_SESSION["download_sort"]; + } + $reverse_sort_key = "download_sort_reverse" . $sort_order; + if ( $_SESSION[$reverse_sort_key] == "" ) { + $_SESSION[$reverse_sort_key] = 0; + } else { + if ( $HTTP_GET_VARS["sort"] != '') { + $_SESSION[$reverse_sort_key] = !$_SESSION[$reverse_sort_key]; + } + } + + //var_dump($_SESSION); + $sort_reverse = $_SESSION[$reverse_sort_key]; + + if ( $sort_order != "" ) { + $_SESSION["download_sort"] = $sort_order; + usort(&$downloads, "my_cmp"); + } + + foreach ($downloads as $file) { + $status = StatusString($file); + if ( ($_SESSION['filter_status'] == 'All') || ($_SESSION['filter_status'] == $status) ) { + echo ''; + $mark = $file->speed > 0 ? 1 : 0; + echo ''; + echo ''; + echo ''; + echo ''; + + echo ''; + + echo ''; + + // source count + echo ''; + + echo ''; + + echo '', "\n"; + } + } +?> + +
+ Downloads + + +
+ +
+
File NameSizeCompleteTransferredProgressSpeedSourcesPriorityActions
', $file->short_name, '', + CastToXBytes($file->size), '', + CastToXBytes($file->size_done), '', + CastToXBytes($file->size_xfer), '':'down-line">'; + echo ''; + echo '

'; + echo $file->progress, '
':'down-line-right">', + $file->speed ? (CastToXBytes($file->speed) . '/s') : '-', '':'down-line-right">'; + if ( $file->src_count_not_curr != 0 ) { + echo $file->src_count - $file->src_count_not_curr, " / "; + } + echo $file->src_count, " (", $file->src_count_xfer, ")"; + if ( $file->src_count_a4af != 0 ) { + echo "+", $file->src_count_a4af; + } + echo '':'down-line-right">', + PrioString($file), ''; + echo '', $status, ''; + + // commands + echo 'ED2K Link(s)'; + if ( $_SESSION["guest_login"] == 0 ) { + if ( $file->status == 7 ) { + echo 'Resume'; + } else { + echo 'Pause'; + } + echo 'Cancel'; + echo 'Increase priority'; + echo 'Decrease priority'; + } + + echo '
+  + + + + + + + + + + + + + '; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo "\n"; + } + ?> + +
+ Uploads + +
UsernameFile NameTransferredSpeed
', $file->user_name, '', $file->short_name, '', CastToXBytes($file->xfer_up), " / ", CastToXBytes($file->xfer_down), '', ($file->xfer_speed > 0) ? (CastToXBytes($file->xfer_speed) . "/s") : "-", '
+  +

+ + +  +

+
+
+ diff --git a/src/webserver/chicane/emule.gif b/src/webserver/chicane/emule.gif new file mode 100644 index 0000000000000000000000000000000000000000..1d016a14d063b6f8439c21392cc9dc41d8620e0c GIT binary patch literal 2586 zcwPY-3gz`jNk%w1VKo3Q0Qdg@PG`zCRk|ERsv}CU5kE?j4}sbjnD`fw?E#bh0gv_pebfY+{|l1v0*v1Wdc_N$ z{|lM-9jN{Tl;}3J{Y$?8L}hmZb+Tm3{|1xOfZ6*UsMG>*iw2UhoagufTxtZ3nz8Zq z1#@%I{{D4#c8H0IC#AbX zJhmLB>ytUP6F|5eM7ttRzbcB~a6Y&dOTH#gz$j+RLsG&iSj8-X*JK8rO?pJySumF-`m#K(wv-`+uPXd>*?p`<@osb_4V}1$-~&3 zN9@n0$-Ju9&&1=KKhTLe(~UpHiABtjPT8Pg;j(|-yOpV&jlFd*z<4pqf;Yj8SKXy< zE-NVG*v-LnF3Nl}&44_@eLm2KM$w5$)QwKlk5bl^SiO#9#H59^W+ks=C$?!SzHctN zY%REJEXQ^+%6mA&b~n3oH^O&1&VoSCghR-HL(hgr&xcCAfJ^n|*WA|8i$@ieP#v69 zAEjF&p;#iTU?!Dzs=UnOG*CTPUYtEVghson<+tYd@H5Nq|2S zg+mvSOB#+!8i__3l1&_MJ{ycrBYaIQZZQmXHV=F}6I(42WGM-0EDBOiOh_>&KQl1@ z|Nr{>`Tzg`A^8LW001BWEC2ui05t$E000R806_>GNU)&6g9sBUTqv*#mrI$(P#Gf# zks5{=GlFpA@XZ@ViY#Tq^azomKTB$8TuCsC8!mlf_6hSQk|j!z7#*^6L<9>PEH%R6 z@+OQHBzKT#0ePvCq(+GBELp*#g$tEI6~ejX(F_tRcgR?=q9u~kk~~+)U}3_+ilnHIT{2O~6e9EFO(l|YupHqLqv{4P zYz!X;VW^R$N|!)RzO!acp*2zZU~*JNh#f#^V#pX#B#$01G!6qI#0U~4ON_NJk-Vl$ zmncsnaTy{c$&w>0L=<6@C(RxuhwTvmLiFhLrAW%3G%gecIuaw)f!w&kL&g<6dA!U? z(}FzPSkOR6Kte0#~yr?K>)t zEHwQhlTDfkQ6Rwu9S~dsZ&!d($8}D`yn=2r-~$iE-nfGgF!-JVi!j0b!mr3AC-i{> z7@$nBjv|QQ1Q=kn0mc;~tkr_e$AF_VG`GO=bI`mjlg!8fE2KgL5+prvtvR+pLJnu( zAvYK~j8FnT*>JP z!b%SeE{(LLr$77+`d2qxqps9(uOPH-5%Tzk1;aJ^gB&2?A&utJmg@$(gX!e zpS$j$C+!9Ii#CA|J@_D#%s9y`6VCatu!hghL5_>9!~g|I!1So+0NqKT42t4I6C#i% zdyM0P<5-40&=HG%c+eWKFvmOMrI8O5pa2F?-~w~^fHKg54rO=%KK_9ZZXg4E<0uC+ zI_SY`=mQtkfCoJP%yEx>K;VcAp#T9+m_QXaAOol>Lk1SGfHWBc8AIzAEIincPyFK_ z>d1yUoG}by5JMJHKw?5DAOHd!fQcx~z!$!d0R+yF9>`cmH1^dmYFNXA`uL(c#z+iQ zetfVO)^q|K(zA;x_ z>|zzQNGdqAA&+#(;;)<7#1uTyiOzPyqocW>J@Cg4aG3VAlcnrD)bR<7a>4?oCO+wt_Ngdf+tD7hGQa|sM>^QC4W06W7sfEx wI^Z`DMRvi*Kz%|NTp8d2t79G9xWy}4(TZ2t0vz4QhCB+Q$TCw|AOQgYJB@L4-2eap literal 0 HcwPel00001 diff --git a/src/webserver/chicane/favicon.ico b/src/webserver/chicane/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e65c2f3618cebe9cb79bf7446b9e07e46822382f GIT binary patch literal 11662 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 MH)8jPIJlqx2azDPw*UYD literal 0 HcwPel00001 diff --git a/src/webserver/chicane/green.gif b/src/webserver/chicane/green.gif new file mode 100644 index 0000000000000000000000000000000000000000..9203adf25054efda696462788c3286cb4add4a16 GIT binary patch literal 83 zcwTe&bhEHbWMtrC*v!DdaFT&<3!l_gDfR2>#y5=}?l}0~^Nn~Ak^CsR|8+kD2G9W! TAiWGM90DpOK8nsQ91PX~g$NPk literal 0 HcwPel00001 diff --git a/src/webserver/chicane/greenpercent.gif b/src/webserver/chicane/greenpercent.gif new file mode 100644 index 0000000000000000000000000000000000000000..625262fe5672a192f0139615ce6d43f40f458e44 GIT binary patch literal 62 zcwTe&bhEHbWMg1sSj51 + + + + + + aMule CVS - Web Control Panel + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +   + + aMule | Web Control Panel + + +   + + + +
+ Server list +
+
+ +
+ Transfer +
+ +
+ +
+ Search +
+
+ + +
+ Shared Files +
+
+ +
+ Statistics +
+ | + + + Graphs + +
+ +
+ Preferences +
+
+   + + Serverinfo
+ Log +
+ +
+   Connection: +   Speed: Up: ', CastToXBytes($stats["speed_up"]), 'ps', + ' | Down: ', CastToXBytes($stats["speed_down"]), 'ps', + ' (Limits: ', CastToXBytes($stats["speed_limit_up"]), 'ps/', + CastToXBytes($stats["speed_limit_down"]), 'ps) '; + ?> + + + + + + + +   ed2k:// ED2K Link(s) + + + + + + + +
+ +   +
+ +
+ + +   Logout + + +
+  + + $c) { + if ( $cat == $c) $result = $i; + } + return $result; + } + + if (($HTTP_GET_VARS['cmd'] == 'download' ) && ($_SESSION["guest_login"] == 0)) { + $link = $HTTP_GET_VARS['ed2klink']; + $target_cat_idx = cat2idx($HTTP_GET_VARS['cat']); + if ( strlen($link) > 0 ) { + amule_do_ed2k_download_cmd($link, $target_cat_idx); + } + } + + if ( $HTTP_GET_VARS['links'] == 1) { + echo ' + + + + + + + +
+

Download Selected

+
+
+ +  
ED2K Link(s)

+ +

+
+ +

+
'; + } elseif ( $HTTP_GET_VARS['serverinfo'] == 1 ) { + $strinfo = amule_get_serverinfo($HTTP_GET_VARS['rst']); + echo ' +
+
';
+		echo $strinfo;
+		echo '
+
+ + +
+
'; + } elseif ( $HTTP_GET_VARS['log'] == 1) { + $strinfo = amule_get_log($HTTP_GET_VARS['rst']); + echo ' +
+
';
+		echo $strinfo;
+		echo '
+
+ + +
+
'; + } +?> + + + diff --git a/src/webserver/chicane/l_cancel.gif b/src/webserver/chicane/l_cancel.gif new file mode 100644 index 0000000000000000000000000000000000000000..1dae00423f74e671011b6ac6964c376c3699762a GIT binary patch literal 890 zcwTe&bh9u|(2r3vD{{R2~@8rq<{ry0JQw$90K#`;*hEXsIhC5LF$-)St zbwC6tPq1@@Gca<jCM65nATwKJKyGutxfWaC77B?;& literal 0 HcwPel00001 diff --git a/src/webserver/chicane/l_connect.gif b/src/webserver/chicane/l_connect.gif new file mode 100644 index 0000000000000000000000000000000000000000..25476dad7b12540778c5df781347d706ae91c2de GIT binary patch literal 345 zcwTe&bhEHb6krfwxN68yoy?FM!LYQ2AuW($MLWZV#SG`?FbcS(Prd;I^^_vKN<>GjOlHvwhE z{=N?T|2_Ns0k?f~7=GT@`TySQ<4vvIOSRu!H~RC$;L>iT-}kuRUsE`{iS680#SfQw zK3-(px0v<#TK0u~)(v?o|NsAIAQ~wCWMO>4Y{;Mk;(+|bz*cr(Mu7zjOUDT%2L%b0 zsVz(2-w-#d3kxcxVZTE_}JLkG&MEL%F1eLYU1PL!=FO>7r%s+cdE&&0etv#4XU=^3^y&8P+qZ4owr0&5Z*Ol#Mn)MK zna7VGZ{ECl)22-;SFQ{X5BKr$vA4H3H8t(-?tb*>k&BB9KR>^)uyAf}?z3ml{{R2~ z^5x5=OP3ZE71h_*H#IeBXlPu&e*MjxH|y4|+qiM#mMvR0Y}nA)*r=$e$jr=q>(;H+ zt5;W5RVgbgv$C?DJ9qB>{rk1GwJa6yYm=9k&&$h`mX>B11)~5rQ2fcl z$iTqJpabH7@&r3a5d$-ajK_ur2b)>=6+9LsFfzCBE4WNBXk z5*Z1nBOF4iJ`F5|Ob(19noKJq4lZ(S=a-M!(;(=4%z@Q7BVk42W41mSD=xJM69wJ* g@IFybYp0I+WTf(x5<>3JpuRUG70s;)y05q45aR2}S literal 0 HcwPel00001 diff --git a/src/webserver/chicane/l_ed2klink.gif b/src/webserver/chicane/l_ed2klink.gif new file mode 100644 index 0000000000000000000000000000000000000000..bb2caae6362495b30b101e6e3be71b7a053aa714 GIT binary patch literal 893 zcwTe&bh9u|Vl3@h1x- zh}HoSpgh6O5yimBA>*-O!9g}QVKavr6B3%4ctrK)Fnmm4W@VM|;Rq;9Xl53Wkl+wF zz|h>sAjQ#eK**_ax`AH z*XsGd*X&lA(%#|YCUv?CQj-8RYnH|Bmd*I+?C#^_$6=keXo7rly>&V*aq{-$c zZm$$yra+9%+}zv;Nr^*`&_fr1rs&{12;D~vN@+h3?VuoJ3Ju^zDW$h QC@7}CNj)Od&_Y1~I~M_%9smFU literal 0 HcwPel00001 diff --git a/src/webserver/chicane/l_pause.gif b/src/webserver/chicane/l_pause.gif new file mode 100644 index 0000000000000000000000000000000000000000..44af3d56b3125f1cba77149d2e855649fa7037f0 GIT binary patch literal 873 zcwTe&bh9u|(2r3vD{{R2~@8rq<{ry0JQw$90K#`;*hEXsIhC5LF$-)St zbwC6tPq1^iF)(t-cx+g3u$h@zLu7?P!$AfX8Kwq}i3toWLi%Ao9S;}|_whUWiDYhU jINqryzs#j_)02}7+ObAGGYcLbVbB$Pb%#?yfx#L8Zu}}> literal 0 HcwPel00001 diff --git a/src/webserver/chicane/l_resume.gif b/src/webserver/chicane/l_resume.gif new file mode 100644 index 0000000000000000000000000000000000000000..83d698fdf8f7b16f2eae517a5e053fad875c2fb5 GIT binary patch literal 918 zcwTe&bhEHbz&!j0_Ba8FWB70hA{gIEooWEnc{9Sa7gT zR?K8Z!G#1T4goorj2r$3nK;C>Gy)nPCLHP&bJCg-abZ!@1aYH|5Qhs%t=xh-1t$s~ z9`az7m6}siz}U>hE3Oi8VS&T*(>xNBk}g~*I_SwQJE^ST#DPPXxp_rxHcXh3bd-&M M&o&iJGX(}~0L9HZssI20 literal 0 HcwPel00001 diff --git a/src/webserver/chicane/l_up.gif b/src/webserver/chicane/l_up.gif new file mode 100644 index 0000000000000000000000000000000000000000..143555694639ab1b651f191a02958da0bd2cdd17 GIT binary patch literal 915 zcwTe&bh9u|(2zYpS*xA`@YHBnzG`P69GBY#p+_}@=-> zn>Mwzwdv~Wvazw{4z+O=z2T3T{*bDuqX_UhHEb?eq`-MY1} zuTN7`la-aVva<62{rj6YZ(h83aZ*xJR#sMRZLO!Lr=6Xhk&%&sfk97C&!b0=R<2y> z=H|x2!Xh9bAS)|7bLPy)j~{z`dn+g??AWnm`}XaOjEsvGExLO3YG-GszrTM>OiX-y ze0X@cw6yg9|6o6if>A&gQ2fcl$iTqFpabH7@&r3a0Rt-)I81ap y+BH)rilIR80qa2tqlR-163ouL(xTJkj!blJ<&(7*aN2R8*_~gWN0N<&!5RRC+kf5w literal 0 HcwPel00001 diff --git a/src/webserver/chicane/log.gif b/src/webserver/chicane/log.gif new file mode 100644 index 0000000000000000000000000000000000000000..2fa7d7705a0787d04dbb563af1309023fbd0c3c0 GIT binary patch literal 1042 zcwX(3>q}E{9L9f}l}EFbE;J(4EHzT1q@s*unJIyU6G1B~gEGr33!~H-Q-`Hi=DN;8 zCPtc)<*ha|beSG6Ij5bpbQj%@_qjQzZae3DF#QYq2l~8uc;0>B;R!n)df?!BSLBAQ zMF{a;FD@>kusp;~NBa`Wa8lZ>ukF%Tc94?qq*y*ePR|ccEGYB~jVi0oF#oba_3Vpk zY7U;%tMjGm0Ruevq`qIPY1K0pD{Z#YU;7M(Ihe4(h#6{or&ZJNdkTI|KzY}6JIQ?0 zF{TCDI8RSnV00FAGoUfTuSw_`V}6Vp-T3vfrRJLfQvSjF|9C$9MAa$QOjT z)zGYm#vzbtpn3p`3Fu$4nxwnO>8>%lZIu2_LX!@@3_+b5ss^B<9}0UQsX`s`obXM< z!=Dn~srdF(JWNEymT2;tO(g^+Qc!X|^;JjJ4^dJrU8kX|RCMJa{ceCR?WaomsA7V8 z)l21cP$($%;~*U>BD_-YttohL0g>>5HK?L!7dGP9$*) zf?IN({ZC2nu(FDUoPaoG8Lzo@&6b17hS-;x_j28X?jk3z3s`|yD98PXC?w~hcX;7} z6t;Kn1~&UGDvoUF*yw+<_UdqN%j&a!=bD60+u~fr0dWe+@vP{s&HEEo4H@gh6k7ss z8Qi2u;a1hh%j_hKr+VjI+n-TcXJMleA6TH;gv_V_j-qm_a^Fy9D!v_ KS+X9((4oJo#l?dF literal 0 HcwPel00001 diff --git a/src/webserver/chicane/login.php b/src/webserver/chicane/login.php new file mode 100644 index 00000000..2022402f --- /dev/null +++ b/src/webserver/chicane/login.php @@ -0,0 +1,103 @@ + + + + + aMule CVS - CTemplate 0.44b - Web Control Panel + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+ + + + + + + + + + + +
+ +
+ Web Control Panel | Login + +
+ +
+ +
+ + +
+
+ + + + + + + +
+ + +
+ +  
+ + Enter your password here

+ +


+
+
+"; + echo $_SESSION["login_error"]; + echo ""; + } +?> +
+ + +
+ +
+
+
+ + diff --git a/src/webserver/chicane/login_bottom.gif b/src/webserver/chicane/login_bottom.gif new file mode 100644 index 0000000000000000000000000000000000000000..1ba09374622581304d77c6e51b92c01c3b1e2482 GIT binary patch literal 890 zcwTe&bhEHboX*I@aFv09RX|*!Y$?B#f^_C2`Ld-vdJb|0bClxib@C^wxJ5+OPhu4i zRnRt&kd=#x4d1qH<)%$bSFM`2bm`2+i>J?;)xUrLrhWT1?%us_)23x>*Djnkt!LuI z_V)I=l`H4Xn>VGdu8e`kKnFyC{KCNY|A0r!VF#AJ6HAIt=2%T;N%`WrHfrkS)n%vO z8g0I(EFq(pfAZOuTb(qJE7hPPitB#SAPe!h|R7#$=GO)G%N%!NGPbNNn`S#75mS>;d zJ^$MJ@yqA;ulwGAd;8H#cWoUKM+Ko9<0UrbAvG3=5rD zd8{lOK6`f0h>x#j)E53@zTx4)c5dakH9HI+9`95%p7zFK)6FtNHfw`TPbptrrVg#Ijy2>`+_vVo{ITs~3wWxM{syGUeaT P1I*$P1?jAg3=Gx)H~Eem literal 0 HcwPel00001 diff --git a/src/webserver/chicane/login_downmain.gif b/src/webserver/chicane/login_downmain.gif new file mode 100644 index 0000000000000000000000000000000000000000..a2174e0f7f832a19aff284d5f03b31f59199a618 GIT binary patch literal 3820 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 A2><{9 literal 0 HcwPel00001 diff --git a/src/webserver/chicane/login_lefttop.gif b/src/webserver/chicane/login_lefttop.gif new file mode 100644 index 0000000000000000000000000000000000000000..6478abf4176b3334edf58191c79ac53c4676c083 GIT binary patch literal 107 zcwTe&bhEHbWMTNlFp+_Qo11IZs(Fo#6$}gvIzY?-5@%p?@nKP0T(fUhjq#;y<2zH6 z*OxvrZ+nut>_OC~6|1*>vOfML_xXpo&pXz?=Bz)g@G--OX}YW0rIk5e^Dk?B%{uF} LJ@nmj1_o;YI5aJ{ literal 0 HcwPel00001 diff --git a/src/webserver/chicane/login_righttop.gif b/src/webserver/chicane/login_righttop.gif new file mode 100644 index 0000000000000000000000000000000000000000..ec25d855530a64ec402b3023db849944e060276b GIT binary patch literal 592 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 RI9PD%Y{BVUlnf9k_+L1=B(eYi literal 0 HcwPel00001 diff --git a/src/webserver/chicane/login_topseperator.gif b/src/webserver/chicane/login_topseperator.gif new file mode 100644 index 0000000000000000000000000000000000000000..5fbd15dcc3f26cb8f9010dc009581608e3def4bf GIT binary patch literal 158 zcwTe&bhEHboX*J1u$h5@N8c%V{(*+ohgPkcw`I$UsZ+Zf8!Hwpn8ttu=zs{2UIv!n z0-olUy%w*}?*5;k(U+1rFJslZoY(s_ibR+d10B}AuX+Ffz=8q~9jX2kONvhBSk1q% qqC|7?O|_1OveR#?_CMHA;iEVE{EIDBXY+R7|FEOx+`4N@4AuaOc0Zc{ literal 0 HcwPel00001 diff --git a/src/webserver/chicane/logo.jpg b/src/webserver/chicane/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13f9bff7a4106be2160b3748dcafd409192aef38 GIT binary patch literal 13285 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 HALsrTh1DxK literal 0 HcwPel00001 diff --git a/src/webserver/chicane/main_bg.gif b/src/webserver/chicane/main_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..461da325fc124f7f17529380cbedc7c1ea62df8d GIT binary patch literal 166 zcwPaf09pS>Nk%w1VK4wN0FeLyzrV7zwW$CA00000EC2ui05AYB0007iOaO+O*Xx*! z6xxU9)wyB>hT=$;=82~2$hDrky>d)>q?{HtCL_?Om4s3e$&2)9?rxO1o& Un5flAIVSlS3CU5(iBbRnJE0j*U;qFB literal 0 HcwPel00001 diff --git a/src/webserver/chicane/main_top_bg.gif b/src/webserver/chicane/main_top_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..a9630685c0b97783e8084a08b27611a008f31329 GIT binary patch literal 166 zcwTe&bhEHbG+;1bn8?5&o6u~M*UJC~Iv@fh&cIaf!_YSC`s*1zBDdO~U)`C+()P$> z+Oy7OuTE^8w|j4qPr2#lXTQ$9-oX2ZGu`pg`gR|!@WZn|zU&dpKD}z|tvOknV>CW+ z@jc%a^y%7c(bd;=w(S06=Y8|b)}M06&%ge&I*#wh^lR=bRA#huY!5%Nqj-hHj1^Zs SEY*HWaGnf2*%`#ZU=09f{!L5( literal 0 HcwPel00001 diff --git a/src/webserver/chicane/main_topbar.gif b/src/webserver/chicane/main_topbar.gif new file mode 100644 index 0000000000000000000000000000000000000000..0c42a070eb04dbafad769135682e32ff920b4417 GIT binary patch literal 592 zcwTe&bhEHbRAw+_xXQp_+jYXG>xfOqA?vpN*3G-D+V)sBZMCf5Xi>M;x@D_n-Fl1a z6&6*?E$Y`<)UC3pU2ajm)S_y!WzAB{>c!Hzvn;9>n3d1AtX^nQHQ%yofn&oG$&g|$ z1#O4M#ZIlu9h;UoHZO5%S?bihGGAc;@5B7 zymkA|-Fx>R+!TEL}XreriN_L!^{duqzc#^nKvz2k|%l$$C$F)37^eR{*?XSP%uSuAXBcPSJ2Ufh=lKQB-EzLON(30J0Tvq*82|tP literal 0 HcwPel00001 diff --git a/src/webserver/chicane/main_topbardarker.gif b/src/webserver/chicane/main_topbardarker.gif new file mode 100644 index 0000000000000000000000000000000000000000..33befb472ccdf6a15e9544cb716126a3f5802a54 GIT binary patch literal 602 zcwTe&bhEHbRAMk>xXQo~Sh3lsWTk(_I=|A@ft4G4ikJBmF7_>2?43W~JAa;M{#>v8 zIUdluQdOou1IWS~_=@WJocWg7&Gm|IfVpKY4P~s#S9$!*m!Z17Q6i zzc8@@wXU~XTxOnOE zm8;jT-?(`}{LbBb_a8ib^!UlsJHjtszIy%U?HiE~A3uHm^7V_rkDtGO|M~lehk=<( z#$$tmBPWNjR?LYFiig<+l)dJ7Y*cb(moUz{b7G_NaSjFNE*Z~FDks@Af>*_y+@yM% z)gbxQ9M8>azN{9-ukM`OtbV?p#i5x?)@zGKAdAOjt=LmrG%qs;EcTk~wN)#WIbw6x z-BVk&uQMea?vnN1rgM`a+0#-DUb(fx#L8 DpOFWS literal 0 HcwPel00001 diff --git a/src/webserver/chicane/main_topbarseperator.gif b/src/webserver/chicane/main_topbarseperator.gif new file mode 100644 index 0000000000000000000000000000000000000000..3acd2be6b04c449137277b8557612c2d09b2825a GIT binary patch literal 715 zcwTe&bhEHb2?43W~JAa;M{#>v8 zIUdluQdOoo?H8!lvtpW^AiX$06&s{npL9;%6OC=w5Brw#Tw*t7ZL0 zi@LQMku}yWTP^F>TU4*Gs9GL3ZI4C$I*Ynh7PZUOLW`uV{4A=Ms)rR@R4taW^s%g2 zYFWKFX400J2^*wyXGvIiNm}|yn0rcD`$<}QOIi7RL&X`szx~Z#(0)+XOHJd; z!3*s|Tmr>+PE1_P(b6r__~gLB1`B%1vjb zOzW;lTw0LcJzuv+N5X5d2Cp*Lq(c#0hdr8>>%?qGxX9XgRa`%9&x@i3ue;W3w@64- zFM7kN$a-m2#OfyRhV5zw9y1IMrZ(IaQVp2$Kxx7Ij{V9z1SE78ZQxL15Lz91rsCu5 V;}hh!&-AI>H2d@neRd`WYXH@(8Grx) literal 0 HcwPel00001 diff --git a/src/webserver/chicane/phpamule.png b/src/webserver/chicane/phpamule.png new file mode 100644 index 0000000000000000000000000000000000000000..bbc89de0d761050af638675efb7495e2bebf43d0 GIT binary patch literal 109734 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 z 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�cxWp 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 + + + + +aMule " , amule_get_version(), " - Web Control Panel"; +?> + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +   + + aMule | Web Control Panel + + +   + + + +
+ Server list +
+
+ +
+ Transfer +
+ +
+ +
+ Search +
+
+ + +
+ Shared Files +
+
+ +
+ Statistics +
+ | + + + Graphs + +
+ +
+ Preferences +
+
+   + + Serverinfo
+ Log +
+ +
+   Connection: +   Speed: Up: ', CastToXBytes($stats["speed_up"]), 'ps', + ' | Down: ', CastToXBytes($stats["speed_down"]), 'ps', + ' (Limits: ', CastToXBytes($stats["speed_limit_up"]), 'ps/', + CastToXBytes($stats["speed_limit_down"]), 'ps) '; + ?> + + + + + + + +   ed2k:// ED2K Link(s) + + + + + + + +
+ +   +
+ +
+ + +   Logout + + +
+  + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Web Control Panel
+Gzip Compression + +
+ +    Save traffic, especially in graphs. + + +
+
+Refresh-Time of Pages +
+ +    Time in seconds (zero=disabled):
+
+

aMule
+Speed Limits +
+ +    Download: kB/s +  Upload: kB/s + +
+Bandwidth Limits +
+ +    Download: kB/s +  Upload: kB/s + +
+Connection Limits + +
+ + + + +
Max Sources Per File: +
Max. Connections: +
Max. new connections / 5secs: +
+
+ +File Settings +
+ + + +
Try to transfer full chunks to all uploads +
Try to download first and last chunks first +
+

+
+ + + diff --git a/src/webserver/chicane/red.gif b/src/webserver/chicane/red.gif new file mode 100644 index 0000000000000000000000000000000000000000..b8fc01c5954fdad0a5c11600498b340db1e68493 GIT binary patch literal 83 zcwTe&bhEHbWMtrC*v!DNjDcYqAKw-!sU7O-dyI__I5-^f^*s?0aV9zWR)0SO2G9W! TAiWGM90DpOK8nsQ91PX~OvDh; literal 0 HcwPel00001 diff --git a/src/webserver/chicane/search.php b/src/webserver/chicane/search.php new file mode 100644 index 00000000..e35cac1d --- /dev/null +++ b/src/webserver/chicane/search.php @@ -0,0 +1,486 @@ + + + + + +aMule " , amule_get_version(), " - Web Control Panel"; +?> + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +   + + aMule | Web Control Panel + + +   + + + +
+ Server list +
+
+ +
+ Transfer +
+ +
+ +
+ Search +
+
+ + +
+ Shared Files +
+
+ +
+ Statistics +
+ | + + + Graphs + +
+ +
+ Preferences +
+
+   + + Serverinfo
+ Log +
+ +
+   Connection: +   Speed: Up: ', CastToXBytes($stats["speed_up"]), 'ps', + ' | Down: ', CastToXBytes($stats["speed_down"]), 'ps', + ' (Limits: ', CastToXBytes($stats["speed_limit_up"]), 'ps/', + CastToXBytes($stats["speed_limit_down"]), 'ps) '; + ?> + + + + + + + +   ed2k:// ED2K Link(s) + + + + + + + +
+ +   +
+ +
+ + +   Logout + + +
+  +


+ + + + + + + +
Search Results  (Refetch Results)
+ +
+ + + + + + + + + $c) { + if ( $cat == $c) $result = $i; + } + return $result; + } + + // + // declare it here, before any function reffered it in "global" + // + $sort_order;$sort_reverse; + + function my_cmp($a, $b) + { + global $sort_order, $sort_reverse; + + switch ( $sort_order) { + case "size": $result = $a->size > $b->size; break; + case "name": $result = $a->name > $b->name; break; + case "sources": $result = $a->sources > $b->sources; break; + } + + if ( $sort_reverse ) { + $result = !$result; + } + + return $result; + } + + if ($_SESSION["guest_login"] == 0) { + if ( $HTTP_GET_VARS["cmd"] == "search") { + + $search_type = -1; + switch($HTTP_GET_VARS["method"]) { + case "server": $search_type = 0; break; + case "global": $search_type = 1; break; + case "kad": $search_type = 2; break; + } + + $min_size = $HTTP_GET_VARS["min"] == "" ? 0 : $HTTP_GET_VARS["min"]; + $max_size = $HTTP_GET_VARS["max"] == "" ? 0 : $HTTP_GET_VARS["max"]; + + $min_size *= 1024*1024; + $max_size *= 1024*1024; + + amule_do_search_start_cmd($HTTP_GET_VARS["tosearch"], + $HTTP_GET_VARS["ext"], $HTTP_GET_VARS["type"], + $search_type, $HTTP_GET_VARS["avail"], $min_size, $max_size); + } elseif ( $HTTP_GET_VARS["cmd"] == "download") { + foreach ( $HTTP_GET_VARS as $name => $val) { + // this is file checkboxes + if ( (strlen($name) == 32) and ($val == "on") ) { + $cat = $HTTP_GET_VARS["cat"]; + $cat_idx = cat2idx($cat); + amule_do_search_download_cmd($name, $cat_idx); + } + } + } else { + // wrong command come + //var_dump($HTTP_GET_VARS); + } + } + + $search = amule_load_vars("searchresult"); + + $sort_order = $HTTP_GET_VARS["sort"]; + + if ( $sort_order == "" ) { + $sort_order = $_SESSION["search_sort"]; + } else { + if ( $_SESSION["search_sort_reverse"] == "" ) { + $_SESSION["search_sort_reverse"] = 0; + } else { + $_SESSION["search_sort_reverse"] = !$_SESSION["search_sort_reverse"]; + } + } + + $sort_reverse = $_SESSION["search_sort_reverse"]; + if ( $sort_order != "" ) { + $_SESSION["search_sort"] = $sort_order; + usort(&$search, "my_cmp"); + } + + foreach ($search as $file) { + echo ''; + + } +?> + +
File NameSizeSourcesDownload
', $file->name, + '', CastToXBytes($file->size), + '', $file->sources, + '
+ + + + + +
+ + +
+
+  +
+
+ +
+ + + + + + + +
Search
+ + + + + + + + + + + +
Name
Type + +
Min Size (MB)
Max Size (MB)
Min Availability
Extension
MethodServer
Global Search
Kad Search
+
+ + +
+   +
+ + + diff --git a/src/webserver/chicane/servers.php b/src/webserver/chicane/servers.php new file mode 100644 index 00000000..fde7f41e --- /dev/null +++ b/src/webserver/chicane/servers.php @@ -0,0 +1,424 @@ + + + + + +aMule " , amule_get_version(), " - Web Control Panel"; +?> + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +   + + aMule | Web Control Panel + + +   + + + +
+ Server list +
+
+ +
+ Transfer +
+ +
+ +
+ Search +
+
+ + +
+ Shared Files +
+
+ +
+ Statistics +
+ | + + + Graphs + +
+ +
+ Preferences +
+
+   + + Serverinfo
+ Log +
+ +
+   Connection: +   Speed: Up: ', CastToXBytes($stats["speed_up"]), 'ps', + ' | Down: ', CastToXBytes($stats["speed_down"]), 'ps', + ' (Limits: ', CastToXBytes($stats["speed_limit_up"]), 'ps/', + CastToXBytes($stats["speed_limit_down"]), 'ps) '; + ?> + + + + + + + +   ed2k:// ED2K Link(s) + + + + + + + +
+ +   +
+ +
+ + +   Logout + + +
+  + +  + + + + + +
+ + + + + + + + + + + + + + + +
Add new server
+ + IP or Address + Port + Name
+
+ + +
Update server.met from URL
+
+ URL
+ + +
+ +
+
+'; + if ( ($_SESSION["guest_login"] == 0) && $HTTP_GET_VARS["showctrl"] ) { + echo $add_server_form; + } +?> + +  + + + + + + + + + + + + +'; + $stats = amule_get_stats(); + if ( $stats["id"] == 0 ) { + echo "Not connected"; + } elseif ( $stats["id"] == 0xffffffff ) { + echo "Connecting ..."; + } else { + echo "Connected with ", (($stats["id"] < 16777216) ? "low ID" : "high ID"); + } + echo ''; + echo ''; + +?> + + + +
Server
StatusServer nameusersDisconnectServer Preferences
', $stats["serv_name"], '', $stats["serv_users"], 'Connect to any server
+  + + + + + + + + + + + + + +"; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + if ( $_SESSION["guest_login"] == 0 ) { + echo '\n"; + } +?> +
Server list
Server nameDescriptionIPusersfilesActions
', $srv->name, '', $srv->desc, '', $srv->addr, '', $srv->users, '(', $srv->maxusers, ')', '', $srv->files, '', + 'Connect', + '", + 'Remove selected server'; + } + echo "
+
+
+ + + diff --git a/src/webserver/chicane/shared.php b/src/webserver/chicane/shared.php new file mode 100644 index 00000000..8582612a --- /dev/null +++ b/src/webserver/chicane/shared.php @@ -0,0 +1,434 @@ + + + + + +aMule " , amule_get_version(), " - Web Control Panel"; +?> + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +   + + aMule | Web Control Panel + + +   + + + +
+ Server list +
+
+ +
+ Transfer +
+ +
+ +
+ Search +
+
+ + +
+ Shared Files +
+
+ +
+ Statistics +
+ | + + + Graphs + +
+ +
+ Preferences +
+
+   + + Serverinfo
+ Log +
+ +
+   Connection: +   Speed: Up: ', CastToXBytes($stats["speed_up"]), 'ps', + ' | Down: ', CastToXBytes($stats["speed_down"]), 'ps', + ' (Limits: ', CastToXBytes($stats["speed_limit_up"]), 'ps/', + CastToXBytes($stats["speed_limit_down"]), 'ps) '; + ?> + + + + + + + +   ed2k:// ED2K Link(s) + + + + + + + +
+ +   +
+ +
+ + +   Logout + + +
+ + + + + + + + + + + + + +


+ "Low", 1 => "Normal", 2 => "High", + 3 => "Very high", 4 => "Very low", 5=> "Auto", 6 => "Powershare"); + $result = $prionames[$file->prio]; + if ( $file->prio_auto == 1) { + $result = $result . "(auto)"; + } + return $result; + } + + // + // declare it here, before any function reffered it in "global" + // + $sort_order;$sort_reverse; + + function my_cmp($a, $b) + { + global $sort_order, $sort_reverse; + + switch ( $sort_order) { + case "size": $result = $a->size > $b->size; break; + case "name": $result = $a->name > $b->name; break; + case "xfer": $result = $a->xfer > $b->xfer; break; + case "allxfer": $result = $a->xfer_all > $b->xfer_all; break; + case "acc": $result = $a->accept > $b->accept; break; + case "allacc": $result = $a->accept_all > $b->accept_all; break; + case "req": $result = $a->req > $b->req; break; + case "req_all": $result = $a->req_all > $b->req_all; break; + case "prio": $result = PrioString($a) > PrioString($b); break; + } + + if ( $sort_reverse ) { + $result = !$result; + } + return $result; + } + + if (($HTTP_GET_VARS["cmd"] != "") && ($_SESSION["guest_login"] == 0)) { + if ($HTTP_GET_VARS["cmd"] == "reload") { + amule_do_reload_shared_cmd(); + } else { + amule_do_shared_cmd($HTTP_GET_VARS["file"], $HTTP_GET_VARS["cmd"]); + } + } + + $shared = amule_load_vars("shared"); + + $sort_order = $HTTP_GET_VARS["sort"]; + + if ( $sort_order == "" ) { + $sort_order = $_SESSION["shared_sort"]; + } else { + if ( $_SESSION["sort_reverse"] == "" ) { + $_SESSION["sort_reverse"] = 0; + } else { + $_SESSION["sort_reverse"] = !$_SESSION["sort_reverse"]; + } + } + + $sort_reverse = $_SESSION["sort_reverse"]; + if ( $sort_order != "" ) { + $_SESSION["shared_sort"] = $sort_order; + usort(&$shared, "my_cmp"); + } + + foreach ($shared as $file) { + echo ''; + echo ''; + echo ''; + + echo ''; + echo ''; + echo ''; + echo ''; + echo '', "\n"; + echo '', "\n"; + + ?> +
File Name + Transferred Data  + (Total) + + Requests  + (Total)  + + + Accepted Requests  + (Total) +SizePriorityED2K Link(s)
', + $file->name, '', CastToXBytes($file->xfer), + '(', CastToXBytes($file->xfer_all),')' , $file->req, '(', $file->req_all,')' , $file->accept, '(', $file->accept_all,')', CastToXBytes($file->size), '', PrioString($file), 'ED2K Link(s)'; + + if ( $_SESSION["guest_login"] == 0 ) { + echo 'Increase Priority'; + echo 'Decrease Priority'; + } + } + echo '
+

+ +  + +

+ +

+ + + diff --git a/src/webserver/chicane/stat_graphs.php b/src/webserver/chicane/stat_graphs.php new file mode 100644 index 00000000..9b5973e9 --- /dev/null +++ b/src/webserver/chicane/stat_graphs.php @@ -0,0 +1,329 @@ + + + + + +aMule " , amule_get_version(), " - Web Control Panel"; +?> + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +   + + aMule | Web Control Panel + + +   + + + +
+ Server list +
+
+ +
+ Transfer +
+ +
+ +
+ Search +
+
+ + +
+ Shared Files +
+
+ +
+ Statistics +
+ | + + + Graphs + +
+ +
+ Preferences +
+
+   + + Serverinfo
+ Log +
+ +
+   Connection: +   Speed: Up: ', CastToXBytes($stats["speed_up"]), 'ps', + ' | Down: ', CastToXBytes($stats["speed_down"]), 'ps', + ' (Limits: ', CastToXBytes($stats["speed_limit_up"]), 'ps/', + CastToXBytes($stats["speed_limit_down"]), 'ps) '; + ?> + + + + + + + +   ed2k:// ED2K Link(s) + + + + + + + +
+ +   +
+ +
+ + +   Logout + + +
+  + + + + + + + + + + +
Download speed
+  + + + + + + + +
Upload speed
+  + + + + + + + +
Number of connections
+ + + diff --git a/src/webserver/chicane/stat_tree.php b/src/webserver/chicane/stat_tree.php new file mode 100644 index 00000000..6cf1f02b --- /dev/null +++ b/src/webserver/chicane/stat_tree.php @@ -0,0 +1,384 @@ + + + + + +aMule " , amule_get_version(), " - Web Control Panel"; +?> + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +   + + aMule | Web Control Panel + + +   + + + +
+ Server list +
+
+ +
+ Transfer +
+ +
+ +
+ Search +
+
+ + +
+ Shared Files +
+
+ +
+ Statistics +
+ | + + + Graphs + +
+ +
+ Preferences +
+
+   + + Serverinfo
+ Log +
+ +
+   Connection: +   Speed: Up: ', CastToXBytes($stats["speed_up"]), 'ps', + ' | Down: ', CastToXBytes($stats["speed_down"]), 'ps', + ' (Limits: ', CastToXBytes($stats["speed_limit_up"]), 'ps/', + CastToXBytes($stats["speed_limit_down"]), 'ps) '; + ?> + + + + + + + +   ed2k:// ED2K Link(s) + + + + + + + +
+ +   +
+ +
+ + +   Logout + + +
+  + +", $it, "
\n"; +} + +function print_folder($key, &$arr, $ident) +{ + print_ident($ident); + echo "\n"; + print_ident($ident+1); + echo "\n"; + print_ident($ident+1); + echo $key, "
\n"; + print_ident($ident); + echo "
\n"; + print_ident($ident); + echo "\n"; + + foreach ($arr as $k => $v) { + if ( count(&$v) ) { + print_folder($k, $v, $ident+1); + } else { + print_item($k, $ident+1); + } + } + + print_ident($ident); + echo "\n"; +} + + $stattree = amule_load_vars("stats_tree"); + + print_folder("Statistics", $stattree, 1); +?> + + + diff --git a/src/webserver/chicane/transparent.gif b/src/webserver/chicane/transparent.gif new file mode 100644 index 0000000000000000000000000000000000000000..4d97c5b10c0e9f7feb7b11f6d5ea8432b3398538 GIT binary patch literal 85 zcwTe&bhEHbWMp7u*v!D-;Nalq=H~6~9S{(}z|hdZ0E7((4jgD`X!y^-!0?~pKbZOt cW&wfXPZmZ723`gopeO^#3#j38PEM1bTOn6z8^D-WH`a+&c(({s6q l`Ri#3^Thf>GudR6`d&|3wc@8+A@3HscVEO+YZMC*VEkXi<2Q;uDC&Z+Ek z3tKz+QHLyhivdTBXYUG)GOroSbU3D$ED>^C_xgIr``x^p5?lUsFoyL`%e0c`WUvMR Du5u*g literal 0 HcwPel00001 diff --git a/src/webserver/chicane/yellow.gif b/src/webserver/chicane/yellow.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b57b1cbe8dd9b00246100775241597f5523d54c GIT binary patch literal 83 zcwTe&bhEHbWMtrC*v!Cib2`J#**yPuivQoE^nbt3|HBslk2(K8>HGgo*#BEC3>ZKM VM1b@%uy6>dl=vt*w{S360|4Ux7vul{ literal 0 HcwPel00001 diff --git a/src/webserver/default/Makefile.am b/src/webserver/default/Makefile.am new file mode 100644 index 00000000..77689bd5 --- /dev/null +++ b/src/webserver/default/Makefile.am @@ -0,0 +1,55 @@ +dist_webserver_DATA = \ + aMule.tmpl \ + add_server.gif \ + arrow_down.gif \ + arrow_right.gif \ + arrow_up.gif \ + back.gif \ + black.gif \ + blue1.gif \ + blue2.gif \ + blue3.gif \ + blue4.gif \ + blue5.gif \ + blue6.gif \ + cp_download.gif \ + cp_kad.gif \ + cp_search.gif \ + cp_servers.gif \ + cp_settings.gif \ + cp_shared.gif \ + cp_stats.gif \ + emule.gif \ + green.gif \ + greenpercent.gif \ + l_cancel.gif \ + l_connect.gif \ + l_down.gif \ + l_ed2klink.gif \ + l_info.gif \ + l_pause.gif \ + l_resume.gif \ + l_up.gif \ + log.gif \ + logo.jpg \ + red.gif \ + transparent.gif \ + yellow.gif \ + phpamule.png \ + tree-leaf.gif \ + tree-open.gif \ + tree-closed.gif \ + favicon.ico \ + downloads.php \ + preferences.php \ + search.php \ + servers.php \ + shared.php \ + stat_graphs.php \ + stat_tree.php \ + login.php \ + index.php + +webserverdir = $(pkgdatadir)/webserver/default + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/webserver/default/Makefile.in b/src/webserver/default/Makefile.in new file mode 100644 index 00000000..dd768726 --- /dev/null +++ b/src/webserver/default/Makefile.in @@ -0,0 +1,530 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/webserver/default +DIST_COMMON = $(dist_webserver_DATA) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(webserverdir)" +dist_webserverDATA_INSTALL = $(INSTALL_DATA) +DATA = $(dist_webserver_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +dist_webserver_DATA = \ + aMule.tmpl \ + add_server.gif \ + arrow_down.gif \ + arrow_right.gif \ + arrow_up.gif \ + back.gif \ + black.gif \ + blue1.gif \ + blue2.gif \ + blue3.gif \ + blue4.gif \ + blue5.gif \ + blue6.gif \ + cp_download.gif \ + cp_kad.gif \ + cp_search.gif \ + cp_servers.gif \ + cp_settings.gif \ + cp_shared.gif \ + cp_stats.gif \ + emule.gif \ + green.gif \ + greenpercent.gif \ + l_cancel.gif \ + l_connect.gif \ + l_down.gif \ + l_ed2klink.gif \ + l_info.gif \ + l_pause.gif \ + l_resume.gif \ + l_up.gif \ + log.gif \ + logo.jpg \ + red.gif \ + transparent.gif \ + yellow.gif \ + phpamule.png \ + tree-leaf.gif \ + tree-open.gif \ + tree-closed.gif \ + favicon.ico \ + downloads.php \ + preferences.php \ + search.php \ + servers.php \ + shared.php \ + stat_graphs.php \ + stat_tree.php \ + login.php \ + index.php + +webserverdir = $(pkgdatadir)/webserver/default +MAINTAINERCLEANFILES = Makefile.in +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/webserver/default/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/webserver/default/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: +install-dist_webserverDATA: $(dist_webserver_DATA) + @$(NORMAL_INSTALL) + test -z "$(webserverdir)" || $(mkdir_p) "$(DESTDIR)$(webserverdir)" + @list='$(dist_webserver_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(dist_webserverDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(webserverdir)/$$f'"; \ + $(dist_webserverDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(webserverdir)/$$f"; \ + done + +uninstall-dist_webserverDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_webserver_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(webserverdir)/$$f'"; \ + rm -f "$(DESTDIR)$(webserverdir)/$$f"; \ + done +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(webserverdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-dist_webserverDATA + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-dist_webserverDATA uninstall-info-am + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-dist_webserverDATA install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am uninstall uninstall-am \ + uninstall-dist_webserverDATA uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/webserver/default/aMule.tmpl b/src/webserver/default/aMule.tmpl new file mode 100644 index 00000000..c765af57 --- /dev/null +++ b/src/webserver/default/aMule.tmpl @@ -0,0 +1,984 @@ +<--TMPL_VERSION--> +4 +<--TMPL_VERSION_END--> + +<--TMPL_CATARROW--> + +<--TMPL_CATARROW_END--> + +<--TMPL_HEADER--> + + + + + +[aMuleAppName] [version] - [WebControl] +[HeaderMeta] +[StyleSheet] + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+   + [aMuleAppName]
[WebControl]
+
  + +
+ [Server] +
+
+ +
+ [Transfer] +
+
+ +
+ [Search] +
+
+ +
+ [Shared] +
+
+ +
+ [Stats]
+ | + [Graphs] +
+ +
+ [Options] +
+
  + [ServerInfo]
+ [Log] +
+
+
+   [Connected] 
+   [Speed]  + + + +
+
+
+<--TMPL_HEADER_END--> +<--TMPL_HEADER_META_REFRESH--> + +<--TMPL_HEADER_META_REFRESH_END--> +<--TMPL_HEADER_STYLESHEET--> + +<--TMPL_HEADER_STYLESHEET_END--> +<--TMPL_FOOTER--> + + +<--TMPL_FOOTER_END--> +<--TMPL_SERVER_LIST--> + +  + + + + +
+[AddServerBox]

 

+[ConnectedServerData] + + + + + + + + + + + + +[ServersList] +
[ServerList]
[Servername][Description][Address][Users][Files][Actions]
+
+
+<--TMPL_SERVER_LIST_END--> +<--TMPL_SERVER_LINE--> + + [1] + [2] + [3] + [4] + [5] +
[Connect] +[RemoveServer] + + +<--TMPL_SERVER_LINE_END--> +<--TMPL_TRANSFER_IMAGES--> + + +  +<--TMPL_TRANSFER_IMAGES_END--> +<--PROGRESSBARWIDTH--> +200 +<--PROGRESSBARWIDTH_END--> +<--PROGRESSBARIMGS--> + +<--PROGRESSBARIMGS_END--> +<--PROGRESSBARPERCENTIMG--> + +<--PROGRESSBARPERCENTIMG_END--> +<--TMPL_TRANSFER_LIST--> + + + + +
+[DownloadHeader] +[DownloadFileList] +[DownloadFooter] +  +[UploadHeader] +[UploadFileList] +[UploadFooter] +  +[UploadQueue] +
+<--TMPL_TRANSFER_LIST_END--> +<--TMPL_TRANSFER_DOWN_HEADER--> + + + + + + + + + + + + + + + + + + + + +<--TMPL_TRANSFER_DOWN_HEADER_END--> +<--TMPL_TRANSFER_DOWN_FOOTER--> + + + + + + + + + + + +
[DownloadList][CATBOX]
[Filename][Size][Completed][Transferred][Progress][Speed][Sources][Prio][Actions]
[TotalDown][TotalDownSize][TotalDownCompleted][TotalDownTransferred] [TotalDownSpeed]  [ClearCompletedButton]
+<--TMPL_TRANSFER_DOWN_FOOTER_END--> +<--TMPL_TRANSFER_DOWN_LINE--> + + [ShortFileName] + [2] + [3] + [4] + +
+ [DownloadBar]
+ [5] + [6] + [PrioVal] + [7] + +<--TMPL_TRANSFER_DOWN_LINE_END--> +<--TMPL_TRANSFER_DOWN_LINE_GOOD--> + +[ShortFileName] +[2] +[3] +[4] + +
+[DownloadBar]
+[5] +[6] +[PrioVal] +[7] + +<--TMPL_TRANSFER_DOWN_LINE_GOOD_END--> +<--TMPL_TRANSFER_UP_HEADER--> + + + + + + + + + + +<--TMPL_TRANSFER_UP_HEADER_END--> +<--TMPL_TRANSFER_UP_FOOTER--> + + + + + + +
[UploadList]
[User][Filename][Transferred][Speed]
[TotalUp][TotalUpTransferred][TotalUpSpeed]
+<--TMPL_TRANSFER_UP_FOOTER_END--> +<--TMPL_TRANSFER_UP_LINE--> + + [1] + [2] + [3] + [4] + +<--TMPL_TRANSFER_UP_LINE_END--> +<--TMPL_TRANSFER_UP_QUEUE_SHOW--> + + + + + + + + + + +[QueueList] +
[UploadQueueList]
[UserNameTitle][FileNameTitle][ScoreTitle][BannedTitle]
+

+

+  +

+<--TMPL_TRANSFER_UP_QUEUE_SHOW_END--> +<--TMPL_TRANSFER_UP_QUEUE_LINE--> + + [UserName] + [FileName] + [Score] + [Banned] + +<--TMPL_TRANSFER_UP_QUEUE_LINE_END--> +<--TMPL_TRANSFER_UP_QUEUE_HIDE--> +

+

+  +

+
+<--TMPL_TRANSFER_UP_QUEUE_HIDE_END--> +<--TMPL_TRANSFER_BAD_LINK--> +
[InvalidLink]
[Link]
+<--TMPL_TRANSFER_BAD_LINK_END--> +<--TMPL_TRANSFER_DOWN_CLEARBUTTON--> +
+<--TMPL_TRANSFER_DOWN_CLEARBUTTON_END--> +<--TMPL_DOWNLOAD_LINK--> +  + + + + + + + +
+

[Download]

+
+
+  
[Ed2klink]

+ + + +

[CATBOX] +

+
+<--TMPL_DOWNLOAD_LINK_END--> +<--TMPL_SHARED_LIST--> + + + + + + + + + + + +

[Message]


+[SharedFileList] +
File Name + Transferred Data  + (Total) + + Requests  + (Total)  + + Accepted Requests  + (Total) +SizePriorityED2K Link(s)
+

+

+  +

+<--TMPL_SHARED_LIST_END--> +<--TMPL_SHARED_LINE--> + + [ShortFileName] + [FileTransferred]([FileAllTimeTransferred]) + [FileRequests]([FileAllTimeRequests]) + [FileAccepts]([FileAllTimeAccepts]) + [FileSize] + [Priority] + +ED2K Link(s) +[PriorityUp] +[PriorityDown] + + +<--TMPL_SHARED_LINE_END--> +<--TMPL_SHARED_LINE_CHANGED--> + + [ShortFileName] + [FileTransferred]([FileAllTimeTransferred]) + [FileRequests]([FileAllTimeRequests]) + [FileAccepts]([FileAllTimeAccepts]) + [FileSize] + [Priority] + + +[PriorityUp] +[PriorityDown] + + +
+<--TMPL_SHARED_LINE_CHANGED_END--> +<--TMPL_GRAPHS--> + +  + + + + + + + + +
+
+ +
+
+
[TxtDownload]: Max [MaxDownload] [KByteSec], [TxtTime]: [ScaleTime]
 
+
+
+ +
+
+
[TxtUpload]: Max [MaxUpload] [KByteSec], [TxtTime]: [ScaleTime]
 
+
+
+ +
+
+
[TxtConnections]: Max [MaxConnections], [TxtTime]: [ScaleTime]
+
+
+
+
+ + + + +
+
+
+<--TMPL_GRAPHS_END--> +<--TMPL_LOG--> +  + + + + + + + +
+
[Log]
+
+
+ + + +
+
+<--TMPL_LOG_END--> +<--TMPL_SERVERINFO--> +  + + + + + + + +
+
[ServerInfo]
+
+
+ + + +
+
+<--TMPL_SERVERINFO_END--> +<--TMPL_DEBUGLOG--> +  + + + + + + + +
+
[DebugLog]
+
+
+ + + +
+
+<--TMPL_DEBUGLOG_END--> +<--TMPL_STATS--> +  + + + + +
+
[STATSDATA]
+
+  +<--TMPL_STATS_END--> +<--TMPL_PREFERENCES--> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[WebControl]
+[UseGzipForm] +
+ +    [UseGzipComment] + +
+
+[ShowUploadQueueForm] +
+ +    [ShowUploadQueueComment]
+
+
+[RefreshTimeForm] +
+ +    [RefreshTimeComment]
+
+
+[GraphSettings] +
+ + + + + + + + + + +
[GraphWidthText][pixels]
[GraphHeightText][pixels]
[GraphScaleText][seconds]
+

[aMuleAppName]
+[SpeedForm] +
+ +    [MaxDown]: [KBS] +  [MaxUp]: [KBS] + +
+[SpeedCapForm] +
+ +    [MaxCapDown]: [KBS] +  [MaxCapUp]: [KBS] + +
+[LimitForm] +
+ + + + +
[MaxSources]
[MaxConnections]
[MaxConnectionsPer5]
+
+[FileSettings] +
+ + + +
[TryFullChunks]
[FirstAndLast]
+

+
+  +<--TMPL_PREFERENCES_END--> +<--TMPL_LOGIN--> + + + +[aMuleAppName] [version] - [WebControl] + + + + + + +
+ + + + + + + +
+
+           +

[WebControl]
[Login]

+
+
+ 
[EnterPassword]

+ + +

+
+
+
+
+ + +<--TMPL_LOGIN_END--> +<--TMPL_CONNECTED_SERVER--> + + + + + + + + + + + + + + + + + + +
[ConnectedServer]
[Status][Servername][Usercount][Disconnect][ServerOptions]
[1][2][3][Connect]
+  +<--TMPL_CONNECTED_SERVER_END--> +<--TMPL_ADDSERVERBOX--> +
[Message]
+ + + + + + + + + + + + + +
[AddServer]
+
+ [IP] + [Port]
+ [Name]
+ + + +
+ +
+
[UpdateServerMetFromURL]
+
+ [URL]
+ + + +
+ +
+
+<--TMPL_ADDSERVERBOX_END--> +<--TMPL_WEBSEARCH--> +
+ + + + + + + +
[WebSearch]
+ [Name] +

+ [Type] +

+ + + +
+   +
+
+<--TMPL_WEBSEARCH_END--> +<--TMPL_SEARCH--> +

[Message]


+ + + + + +
[Result]  ([RefetchResults])
+
+ + + +[RESULTLIST] +
+ +[CATBOX] +
+
+  +
+
+
+ + + + + + + +
[Search]
+ + + + + + + + + + + +
[Name]
[Type] +
[SizeMin]
[SizeMax]
[Availabl]
[Extention]
[METHOD][USESSERVER]
[Global]
+
+ + + +
+   +
+

+

+
+
+<--TMPL_SEARCH_END--> +<--TMPL_SEARCH_RESULT_HEADER--> + +[Filename] +[Filesize] +[Sources] +[Download] + +<--TMPL_SEARCH_RESULT_HEADER_END--> +<--TMPL_SEARCH_RESULT_LINE--> +[FILENAME][FILESIZE][SOURCECOUNT] +<--TMPL_SEARCH_RESULT_LINE_END--> diff --git a/src/webserver/default/add_server.gif b/src/webserver/default/add_server.gif new file mode 100644 index 0000000000000000000000000000000000000000..0996c63320c97221c0cc488a3858f71b82d3c6f9 GIT binary patch literal 625 zcwTe&bhEHb6krfwcoxSH5TENEndayl5$?tqmR6cl+z_8v6`or7=ZQgnVPgNBWwqVY zvMSrs%bNdvo)_%Q`2YX^GgoeJ*>|jW=92Q(iEpoJ|ND9J&u!&Lr!-v58K1s>qLA+8v)s38Kej{X%?PgW?>0f^Ob_V&&$4m6L z4|M$R*s-=IEjPs{D$U+I%*4)B*VOjNnahro!VUTzv)0!cSUO(1ala@t^OS$+p82bi zi|SWz-Mjn9nYxJN{|sEyoBFI={cDAo; literal 0 HcwPel00001 diff --git a/src/webserver/default/arrow_down.gif b/src/webserver/default/arrow_down.gif new file mode 100644 index 0000000000000000000000000000000000000000..06637a76d78f093b1d310c99032b1aa20c69763e GIT binary patch literal 204 zcwTe&bhEHb6krfwI3mbko@%Y-Yvgdv&gqQ3?Q}a?6AkA-_U->#PW?Zb{4&vTm;L|$ z|Kp#;?)$eV{BCI3-(t68E8z2^Y+YKr{SPdVR5vCCB~p4N{RDE0neco90?y9 Qa)S4MiO}(HXJD`f0KMEl%K!iX literal 0 HcwPel00001 diff --git a/src/webserver/default/arrow_right.gif b/src/webserver/default/arrow_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..8d1718050a870197bab51fce138ca8eb9c3d7050 GIT binary patch literal 85 zcwTe&bhEHb&n(!vS^1-s+P)k0?wp9)chtoHBe0gN_J&=LH8UQv1AesOG literal 0 HcwPel00001 diff --git a/src/webserver/default/arrow_up.gif b/src/webserver/default/arrow_up.gif new file mode 100644 index 0000000000000000000000000000000000000000..8811538b396839d8a2b3fc555794b497f364b9ee GIT binary patch literal 204 zcwTe&bhEHb6krfwI3mbk?v^SiYhqt>#x`+!@%q0mHOK7gukE?{FSP%zeaWu>|NqBM ze{%A{|HRoZTXz1lpZG`1&=)AkKr~SN$-?-8S&%^o!~xmK!0MTx(wCAs?*#{oCMO5; z?R_qS%Nq(6oQh^!9(8i~ax#R?t@(tBl5D?5vBO@*b>WATrCyZ9M(Js7SN+$J_<7@$ Q=FsbUI%1cyS{WFu0gqcljQ{`u literal 0 HcwPel00001 diff --git a/src/webserver/default/back.gif b/src/webserver/default/back.gif new file mode 100644 index 0000000000000000000000000000000000000000..95e638dcc3ca2e66b2898f6e1a3d30bd4955e2f0 GIT binary patch literal 64 zcwTe&bhEHbjEB<6*v*lLz=6id7 P^S3?nnD#7~fx#L84)GK9 literal 0 HcwPel00001 diff --git a/src/webserver/default/black.gif b/src/webserver/default/black.gif new file mode 100644 index 0000000000000000000000000000000000000000..1539a923b537d78d9d0434c1732ba93f67cef734 GIT binary patch literal 97 zcwTe&bhEHbL!Z2$$L-Txw%m#)Fe;9B89S{N1%fP}p PfyI!IA-%&viNP8Gma!1* literal 0 HcwPel00001 diff --git a/src/webserver/default/blue2.gif b/src/webserver/default/blue2.gif new file mode 100644 index 0000000000000000000000000000000000000000..84019356bfc2fef486682f1e9bae970c0eae2d61 GIT binary patch literal 84 zcwTe&bhEHbWMtrB*v!Ddu>KE2({6^m`3#W_3@g7dEO^GS@jt_)%M3Vx4u}BhWnken PnB&x7*f2#{iNP8GV4M*6 literal 0 HcwPel00001 diff --git a/src/webserver/default/blue3.gif b/src/webserver/default/blue3.gif new file mode 100644 index 0000000000000000000000000000000000000000..75b13bd5413609cb483002aff59f6a8c476a6ad8 GIT binary patch literal 84 zcwTe&bhEHbWMtrB*v!Dd(E6XD`42<=7lz>Z49*PL0VZZ@&KmbP-1-25SJ8mJG-M literal 0 HcwPel00001 diff --git a/src/webserver/default/blue6.gif b/src/webserver/default/blue6.gif new file mode 100644 index 0000000000000000000000000000000000000000..4186fc0082dd0075d20e2938fa6a228473faa878 GIT binary patch literal 84 zcwTe&bhEHbWMtrB*vtR~{}~t>7#J=yFnnQP*v-K3jDcZ31H&H%96$#|fb=r3a8Bqj N;$uh`aa3Zk1^`lD3!(r3 literal 0 HcwPel00001 diff --git a/src/webserver/default/cp_download.gif b/src/webserver/default/cp_download.gif new file mode 100644 index 0000000000000000000000000000000000000000..56afa66fda38250243cd7911a54e6c93b249dd35 GIT binary patch literal 814 zcwTe&bhEHbRA5kG_!i7C+mc~{9m9MFh9xe{t9*sl1aYqk5Z>s=zAc<*OSI^oWTEY; ziu;OG4@Ghvj}bhQA$+J*`f8@g?Gnk8rCP^pt?ra-T&}Wyk|+M6Lh5&|?3sGEs|}X- zCaC;xlX=;u_^(U(Z?DC_Y3l!{o4r_P@OGQY-=$iAmK*-wVS2Q|`9{CnrQXn66FqNC z3A;Nt_4cBe=aZeD&5nF9J?Z6wz}LI{{x5a=yFC2=ey{(#!XB&~sK|KDBs|MmF)&sYEd|IaW8fZ|UUMh1pp1|1Lw6ekSq{~Cgunp;}i z+B-U17+9IQ`rDW|^}N_7OlRV;^a=Fpo8CFo&c(^j(~*;bVL=;@t-ZbNCTA}%S1p#+ zYnr&%Z`x#M?%?I^A+>8a>poi*b#+xWQ+F>z#@$V zqP(fw@$11%%JwRK3|wl8lBQPdpO%S8I68?pu&CKJtVm3}Go@KWNzB3I!NCT{pI#a) ziMKR!w;j|E!RN#lA@eCd1uHTb+L!upD{>@0>fmV)VduSZU2*ksexBV$h zxRS{sWs?;n!gAnH*9Jxg7QX5Ow|f=zZ`p+?K3#9aAn4Sw;vln|7K7mukIaW*fen+( z%Rfxmc<_XvTtLBmzTlUg@cP+7 sON9nz{;2o=8WuXPYp7BEvrbOJ`q*S~ffb+pG#px(=bnt`W?`@f0CS-+oB#j- literal 0 HcwPel00001 diff --git a/src/webserver/default/cp_kad.gif b/src/webserver/default/cp_kad.gif new file mode 100644 index 0000000000000000000000000000000000000000..aa1a9a80fea873b71618fba100845488c6be5b8b GIT binary patch literal 1671 zcwVKG`)?HG9*1XTx9#@kx~+v$F5P7j))wgYMyKA|bxZ4LNg0*kq++{cEI5cQg9&D8 z(sn0^GU8UpYldSNI>%yo6|}GR92teCywnyZC}fP6Ov(Yzi$pVk^^Aug?|cp37fb{Ak2ruOgO@YNg+&%;iw#;6p~~~N+2nbq*anpq7)xxK$Hbh z4pKBv(F(=O6b~r@Py(VvKr<4}L7IoOpwa@OrL+buBW51KP$a_$3@0%hU_^~k3`RBB z0Ku{h%K?^yEU&OUU}c?E3|7_I^j9@mV6f2S!ak0NoCG*Y<5YtKCI>JFEl$InZt-D) zCw+W0%nK4Ps=TQ265>^p2L=yJ9;U@Sw0O2u>6**N=R28TIs>oDL8!!RD1^`C_fdY~MWDx)zz_bR?F)%EEZD2c)4L~je z`6yIGsK^iim_{=oG9kjyu%Kx}Y(vY2wxjV8O^9kDt;vF>${GZkX=~UQtvt>JuLpXn*!2jJY zg7}#zzqy2)n;^1o5NEs#T6`}bOJp|r+9$g^-MR1l`;~{A2lstapXaOo@$I!O1I_-u zWXZQ+xN3Ksd-;XB?g{r3X7BHp9^LlOQ_1b_O;0|Lf2!;HV(s2bPi4P;VB>wQ&+$gt zPx{VRx5iTIzj-Ur^?r6|<@eyNg?9yO4mbEx=iaR;H-`OQ?`u_ecYHDVXB_7Yu4;U# zW7E*ibH35o#OUV4vN!H1*;P;wh$pfZJ^kXHp-qRnUwOM`Ma$^e?(>DW`QNSS+uC`* zXHV^yBkSI&AhM6uBy(YMXgtH4_kQg4$)sy`&JQc|f4_=;9>37f70$Z`JM95aZSFmj zL#dcI&$l4C<8*2&96u1caqEU9-L3s4Cu$FDnCWO7tS!8EVyJP>8gF*-qK4&zi42gJ z?QYmu|KAsgwPZzGa&O@?y$y-tgJW73t|yNU3wifzlSI~eNpEUrGZFTXDHT4O5X+NqIafr6PU z=Unr9XPU{DkK?&zt?kbb)l=);F8A&0W>a$>{WxoF#Z&Iza?1{0&lkuPyl1viCw)V^way%ayq>wC+Lw z;<2MI)e73Gvk@7M#fKM_HKy}941Gqri$826H-}Ed2oeiPO!`M>8gvDr%PJS z4#e`$QD=@9d^lF=oqJz9-LyDXF`ALT=twe=|K#;}Q%JecC)R)8chs};y_Rij%2Pz( zq0c}1SI5A_14pjp1ee~C%3uBX_5RIE|1(n6vY=gxCy%Z9r7z}R>d@17u5Xjjvazv! zQoTx)Hn05rzCJuWn9;TR$Kl7no8P>=r>W?%QXx|P^^RYsmdTTqCu8UTc;@nB z@)L9-G*-HQER?#uFK_kvnC`!yA0ou*-Olu`ieY*DvkUt(ue#?poXwB<0>ceifsH$^ a%wEh%1x}PrU5tKJyr1Yheaht`?)nQK5nZZvB_3+*z;TeXgLTb-C;cdO|Go z3zg2#@jEj={Nj9vgEKO2EOolSxAx&iVgp z!Jm)&@7%h2@b;tQzy4i&_3rw=|9?Inc=qq#*Z&~EFrFv$pK2MRdA5Z?M8A7QhK2Dh z0R>gI4F-)(tZm!}LLyj#9=k9wYI#1G+JMyh3M|{&r;V-z+2X;%@X4hx_~EBxMw0SRB~)H;6MNyt$Fz mCn&8Jd~AX930?*j32r8ahipwEs;=g228vr>IW;mcSOWmwjTuq^ literal 0 HcwPel00001 diff --git a/src/webserver/default/cp_servers.gif b/src/webserver/default/cp_servers.gif new file mode 100644 index 0000000000000000000000000000000000000000..1ea21c9f4097926b1cce8a9d86e700776a7d7557 GIT binary patch literal 939 zcwTe&bhEHbRA5kG_!hw+r=+K$p<`rZ&LSDYB9|ng70aob!J|_xq*pFxQln&DWn`P6 z=TvFnT;b~K?dcg99v9UYyVl9I=#-@s?kB5B^DWY@0Y(yi?=(Zsjc&}X7$ z@HG2~MXsS8PEj*mVix!$%@0cI2~VBsle{=AYiW4ShPZ-dDTOmCDw@+O)?`(0DQj6( z-nOG|!mhgRBdx7HZEaJhPMy=#yQgFFnywkU=FVL_d;W&GOLr_=wqohZo!hqUXzoAQ zHTCGEIj3hYJ2`vt#f7U+Ena(R-PW_Kwp`h?^W>J@SGVtbwEN)gJ%=A1Idc5enX9*N zUOjgD@tKQHuibog=l+Mg58mE;^y$gd7tdaPe)r+~*Kfc7|NqZ05J2%K3nK$V1cMHU z1Bw#{_J0i#P0cN>ZS5T$uKuB6ApxG9lbRjE!l%!e5#~C%Jt#bEVQBBdh0}xQwgiTS zhWPvY1TEei8oYI7gjeVUPa97+&)%&;M}mUAR{FVETUt6w6R*k*uvY5HUZMK+OwhliXO$=TOTI8d;l>EU{IBZJ1GBS%@8n6r2i zCw90_;AiGiHprRrmRm(tN8-VRhNJxgld2Ll3K$xLc{U^`ZwPqkzdDVl72 z`wO#9T)2|Swr#FW!ix)y&g=pg78)P#EH=~QxuCenA#qXlcOg}Wf*lRs0UbgbVH*-2 zHvO%7r)V-o{!61Pzts1SpJM|T9sJ`YwB`X5&kxS62kJXm8V>UbDp;Hp^0k=J!DASZ zc$8Nw;K2hvADxE_`FsN|x^#rRFlcV~HZXM7vN1V$q{He%!y_S^GX>6F%Ij`$ve@`B gFtVDzP*^g-(1PJ0i-#T8g9QveW|9tCjSLLd0L3|HdH?_b literal 0 HcwPel00001 diff --git a/src/webserver/default/cp_settings.gif b/src/webserver/default/cp_settings.gif new file mode 100644 index 0000000000000000000000000000000000000000..de7241c586abfe930ca159f6c5320b3df5e9d881 GIT binary patch literal 1264 zcwWuZ{ZkTl9Ki7}iiU<0o69V1)O-*+ z*4Fm+_FK1Zb^Mg*GV3?wdCCo3_R z7a{pg>;&8FWfgjH*YRnCuciWNE0LzbW`?(AmWK>n(`7D#hX~pcbfDQ*g8q-sCfbvs z8-c(K`b|M(1AR6iwS)dG^8yk`w(GisK<)yA9x&tqV;=C=4v_7FkpP`!&$RG3C}Tl! z6jX_zOaW~=Xn)Gh%`GS>xN)PPu&}VGsEEa4m6n#W+3d2ivdYRz_U-#sRaMp1)ipIW zRW<-lqS7~5c}6X17PegyESySrN;5Qs#g-rioZ zSlrjw*WceSkw~6Ac_Nic2L=WP2M33ShGa6CTrPk1?Ai0@&&Nid4i68HjEszqj*g9u zjgOB{ta&xLq80)4z={}P2;ikcp-?K7>dDuWlanfyO08DE(M)MHnyINNtyVidJ^l9W z+nEpkUh{6vKeGTzold9M>)*eBKRY`+H#avwKfkcBpr2n^TwF953`V1IX=!PBd3j}J z1^$EnXSNxz7=#9p=ZE<41j4PNN(+Yw?j7pI+ox5O$J}ky!;jPUCgAFFdM>pw=C%(K zq)vf$>&H#Za}&tcX0DV`TN;r|?|y-|RpsXkDAFLl+^>FPv)@1z<*d1ycy+(mcVhN0 zBs%YIKbb5+TH%*RTaFK#B%L|woVzLL+mrqzSuOox#$53y?n04enSTQRPc_SHPjXP; zNrQyxQjR^F$&pQMEH}Gg@fFwhc!D?W$1p`6i}*cteQ`iw&uQ_Yrkyy?EjbL=fqEMM zTs4Jgd{q%}Hd?U3=gtEGUFg!Tc>U(`471{jQOgq1ITNNNtITtfh~nUjUlY6d4!1V1 z+jZfLdrr@}3YBpgPh#^%2%q z*L8W`0?#-29VZsg69{`Vs5o112dpJo=yoap^N?W$F~k>(i69*&>@PHL*O*v3i^x6) z_uI`xi|pdum}XR0{3Q!BOkuPn+BJvIBYfA*l@6NR4aZN4QquVF^c#w!iQIQ;I9 za;VQ^OUC)Mtx`b#9TJB}w N{d^g55f}{m;$PT_S`GjJ literal 0 HcwPel00001 diff --git a/src/webserver/default/cp_shared.gif b/src/webserver/default/cp_shared.gif new file mode 100644 index 0000000000000000000000000000000000000000..7a252f1049985be8334c6e958174355835d289d8 GIT binary patch literal 1090 zcwPZQ1ikx5Nk%w1VITk?0QP$T0Rl__09XJ5Y5@dw2NHS;7=;cchz}@{6C{olDwh*7 zjTJVU7&xaWFODcXnIS)@8%L=dN4OqQu{1%NCP%6&Ot>siuOnHuHA8cGxd%Nbk>Jd^!Ph1pYq%UO-qUX|NOgy%?x{zsbqREp|Sj{aJd>ROilPN4o*ru}D%%4Ckv zZ;;SvbD%zK^HVw&eSn0^X|n!zs_b*E{dl$OcDMd~!2gbw$BLcMg{az@ ztJ#FB@P@kTgSq{ABbXt>OQ;<^SB; z)y>-P#@hDM-}A@k{nO|9+w%YF_W$+#|NsC0000000000000000A^8LW004UcEC2ui z03ZM$000O6fO~?2goS$$hzf>_jD->q9X%`%3yqe95)vOhK%G65myMYuKSxJErkx*^ zp_msYKuof;OsT5|tr8?XOijMNw6dl>47iLJ7bHHtO<2Cp&djq%JrTx)8yhA*ztGKC z(9XcJoe~BF*i+2l>|9;!>`hm`N3};K1?YksNN-$M?YamY$b}2Lc};{ZaiMR|1{X%y zu)*SPphbZN!69t21jdR2gCw|s!GlbjfoIO7Nt4ndxPM7pM9AQwp@bJka#o?ka%CDd zYE+&Pct%T-79wo8(cxi0NFO%`nLBafw9!H(1r#@LvLMN^V+UWqgD4cK zQsqkL!dkTCA)_S7lsRvyl#WZicN75nv<(n@xyQNtWi$iP7jZqSiM5qhb> z015(pM@4xnspM0IHPmo|6LqAfL=F^GhQf#?3c^4IS@gG3R&7)`1Q@)j7Q_VyxS_T~ z1q|dc+a3x)@WfA9!DR;=Lew#xY7$Uz!VnZ>a6NSR8o7p+g;LpfSb}8t8BX0RjLJ3IP+CVTT=eTU_nc0zB(3e^`tFW-AvTAB_*>czT)1FDEt7^~Nx4o^N zJU^#nK~CqMlKzFIJ=^MLt*@B1BevzZd-uD*&gW4RUPRCSnBRS%cK-F`o(HK@pVcn8 zk-hj$=F(5~tKXKa`B=aCZPlhPjg7M#rp@o_TGTyv=hUgI=g!?YZ_)Pk>(?(|zH{c> z+Z~Hfw=ccgzwzX(H7BR7y*^{d+39<3v}}6Uw(IN6oljP*KCo)*>1DfaY~Oxt``+h0 z2fj}__$c+h1h)76GPELppx3RS7>zgjy-EyPN}}~70}>knA>#Kqm%33 z4l66>&&;nQdP3V|G$u^z5ZUING(|(vG1y&hL&%y70WKN|jGQtI5)TrObjTYA%&1^+ zWa^WRfeZ}?7+6n; zx=b*9e3V;6!tCk1mM5<7A0)drFbJi3iKzR{`cW3g=pODUef-0Z+#`B7XNRo`*{QYf zCySi;1U1>>r|!SigO5DF;K6iM{ED#enF)tjtpYY2P_TJ3ty!=>RB)=_U7M22H5_7& zjamyiFZoD>uqd{+@|Aw}Gfxdw4B-%e;?P*v{A2>FgpEL=qUVi-&6gd5e;7FGEAllt z^G$!!!r`3L06(0t^nagmt}owR*!LDGml}0N%&Sr~m)} literal 0 HcwPel00001 diff --git a/src/webserver/default/downloads.php b/src/webserver/default/downloads.php new file mode 100644 index 00000000..1eeb20a0 --- /dev/null +++ b/src/webserver/default/downloads.php @@ -0,0 +1,486 @@ + + + + + +aMule " , amule_get_version(), " - Web Control Panel"; + + if ( $_SESSION["auto_refresh"] > 0 ) { + echo "'; + } +?> + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+   + aMule
Web Control Panel
+
  + +
+ Server list +
+
+ +
+ Transfer +
+
+ +
+ Search +
+
+ +
+ Shared Files +
+
+ +
+ Statistics
+ | + + Graphs +
+ +
+ Preferences +
+
  + Serverinfo
+ Log +
+ +
+
+   Connection: +   Speed: Up: ', CastToXBytes($stats["speed_up"]), 'ps', + ' | Down: ', CastToXBytes($stats["speed_down"]), 'ps', + ' (Limits: ', CastToXBytes($stats["speed_limit_up"]), 'ps/', + CastToXBytes($stats["speed_limit_down"]), 'ps) '; + ?> + + + + + + +
+ + +
+
+ +  + + + + +
+ + + + + + + + + + + + + + + + + + + + + + "Low", 1 => "Normal", 2 => "High", + 3 => "Very high", 4 => "Very low", 5=> "Auto", 6 => "Powershare"); + $result = $prionames[$file->prio]; + if ( $file->prio_auto == 1) { + $result = $result . "(auto)"; + } + return $result; + } + function StatusString($file) + { + if ( $file->status == 7 ) { + return "Paused"; + } elseif ( $file->src_count_xfer > 0 ) { + return "Downloading"; + } else { + return "Waiting"; + } + } + + // + // declare it here, before any function reffered it in "global" + // + $sort_order;$sort_reverse; + + function my_cmp($a, $b) + { + global $sort_order, $sort_reverse; + + switch ( $sort_order) { + case "size": $result = $a->size > $b->size; break; + case "size_done": $result = $a->size_done > $b->size_done; break; + case "size_xfer": $result = $a->size_xfer > $b->size_xfer; break; + case "progress": $result = (((float)$a->size_done)/((float)$a->size)) > (((float)$b->size_done)/((float)$b->size)); break; + case "name": $result = $a->name > $b->name; break; + case "speed": $result = $a->speed > $b->speed; break; + case "scrcount": $result = $a->src_count > $b->src_count; break; + case "status": $result = StatusString($a) > StatusString($b); break; + case "prio": $result = PrioString($a) > PrioString($b); break; + } + + if ( $sort_reverse ) { + $result = !$result; + } + //var_dump($sort_reverse); + return $result; + } + + if ( ($HTTP_GET_VARS["cmd"] != "") && ($_SESSION["guest_login"] == 0) ) { + $name = $HTTP_GET_VARS['file']; + if ( strlen($name) == 32 ) { + amule_do_download_cmd($name, $HTTP_GET_VARS["cmd"]); + } + } + + $downloads = amule_load_vars("downloads"); + + $sort_order = $HTTP_GET_VARS["sort"]; + + if ( $sort_order == "" ) { + $sort_order = $_SESSION["download_sort"]; + } + $reverse_sort_key = "download_sort_reverse" . $sort_order; + if ( $_SESSION[$reverse_sort_key] == "" ) { + $_SESSION[$reverse_sort_key] = 0; + } else { + if ( $HTTP_GET_VARS["sort"] != '') { + $_SESSION[$reverse_sort_key] = !$_SESSION[$reverse_sort_key]; + } + } + + //var_dump($_SESSION); + $sort_reverse = $_SESSION[$reverse_sort_key]; + + if ( $sort_order != "" ) { + $_SESSION["download_sort"] = $sort_order; + usort(&$downloads, "my_cmp"); + } + + foreach ($downloads as $file) { + echo ''; + echo ''; + echo ''; + echo ''; + + echo ''; + + echo ''; + + // source count + echo ''; + + echo ''; + + $status = StatusString($file); + echo ''; + echo "\n"; + } +?> + + +
+ Downloads + + +
+ +
+
File NameSizeCompleteTransferredProgress  Speed    SourcesPriorityActions
', $file->short_name, '', CastToXBytes($file->size), '', CastToXBytes($file->size_done), '', CastToXBytes($file->size_xfer), ''; + echo ''; + echo '

'; + echo $file->progress, '
', CastToXBytes($file->speed), ''; + if ( $file->src_count_not_curr != 0 ) { + echo $file->src_count - $file->src_count_not_curr, " / "; + } + echo $file->src_count, " (", $file->src_count_xfer, ")"; + if ( $file->src_count_a4af != 0 ) { + echo "+", $file->src_count_a4af; + } + echo '', PrioString($file), ''; + echo '', $status, ''; + + // commands + echo 'ED2K Link(s)'; + if ( $_SESSION["guest_login"] == 0 ) { + if ( $file->status == 7 ) { + echo 'Resume'; + } else { + echo 'Pause'; + } + echo 'Cancel'; + echo 'Increase priority'; + echo 'Decrease priority'; + } + echo '
+ + + + + + + + + + + + + '; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo "\n"; + } + ?> +
+ Uploads + +
UsernameFile NameTransferredSpeed
', $file->user_name, '', $file->short_name, '', CastToXBytes($file->xfer_up), " / ", CastToXBytes($file->xfer_down), '', ($file->xfer_speed > 0) ? (CastToXBytes($file->xfer_speed) . "/s") : "-", '
+  +

  +

+
+
+ diff --git a/src/webserver/default/emule.gif b/src/webserver/default/emule.gif new file mode 100644 index 0000000000000000000000000000000000000000..24eb96f73bfc121a266bbad3d6a70b96e89bb98f GIT binary patch literal 1592 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 MH)8jPIJlqx2azDPw*UYD literal 0 HcwPel00001 diff --git a/src/webserver/default/green.gif b/src/webserver/default/green.gif new file mode 100644 index 0000000000000000000000000000000000000000..f0bee86921cbccc0f46776b83e274603a8a80b4a GIT binary patch literal 97 zcwTe&bhEHb + + + + +aMule CVS - Web Control Panel + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+   + aMule
Web Control Panel
+
  + +
+ Server list +
+
+ +
+ + Transfer +
+
+ +
+ Search +
+
+ + +
+ Shared Files +
+
+ +
+ Statistics
+ | + + Graphs +
+ +
+ Preferences +
+
  + Serverinfo
+ Log +
+ +
+
+   Connection: +   Speed: Up: ', CastToXBytes($stats["speed_up"]), 'ps', + ' | Down: ', CastToXBytes($stats["speed_down"]), 'ps', + ' (Limits: ', CastToXBytes($stats["speed_limit_up"]), 'ps/', + CastToXBytes($stats["speed_limit_down"]), 'ps) '; + ?> + + + + + + +
+ + +
+
+ +  + + $c) { + if ( $cat == $c) $result = $i; + } + return $result; + } + + if (($HTTP_GET_VARS['cmd'] == 'download' ) && ($_SESSION["guest_login"] == 0)) { + $link = $HTTP_GET_VARS['ed2klink']; + $target_cat_idx = cat2idx($HTTP_GET_VARS['cat']); + if ( strlen($link) > 0 ) { + amule_do_ed2k_download_cmd($link, $target_cat_idx); + } + } + + if ( $HTTP_GET_VARS['links'] == 1) { + echo ' + + + + + + + +
+

Download Selected

+
+
+ +  
ED2K Link(s)

+ +

+
+ +

+
'; + } elseif ( $HTTP_GET_VARS['serverinfo'] == 1 ) { + $strinfo = amule_get_serverinfo($HTTP_GET_VARS['rst']); + echo ' +
+
';
+		echo $strinfo;
+		echo '
+
+ + +
+
'; + } elseif ( $HTTP_GET_VARS['log'] == 1) { + $strinfo = amule_get_log($HTTP_GET_VARS['rst']); + echo ' +
+
';
+		echo $strinfo;
+		echo '
+
+ + +
+
'; + } +?> + + diff --git a/src/webserver/default/l_cancel.gif b/src/webserver/default/l_cancel.gif new file mode 100644 index 0000000000000000000000000000000000000000..1dae00423f74e671011b6ac6964c376c3699762a GIT binary patch literal 890 zcwTe&bh9u|(2r3vD{{R2~@8rq<{ry0JQw$90K#`;*hEXsIhC5LF$-)St zbwC6tPq1@@Gca<jCM65nATwKJKyGutxfWaC77B?;& literal 0 HcwPel00001 diff --git a/src/webserver/default/l_connect.gif b/src/webserver/default/l_connect.gif new file mode 100644 index 0000000000000000000000000000000000000000..25476dad7b12540778c5df781347d706ae91c2de GIT binary patch literal 345 zcwTe&bhEHb6krfwxN68yoy?FM!LYQ2AuW($MLWZV#SG`?FbcS(Prd;I^^_vKN<>GjOlHvwhE z{=N?T|2_Ns0k?f~7=GT@`TySQ<4vvIOSRu!H~RC$;L>iT-}kuRUsE`{iS680#SfQw zK3-(px0v<#TK0u~)(v?o|NsAIAQ~wCWMO>4Y{;Mk;(+|bz*cr(Mu7zjOUDT%2L%b0 zsVz(2-w-#d3kxcxVZTE_}JLkG&MEL%F1eLYU1PL!=FO>7r%s+cdE&&0etv#4XU=^3^y&8P+qZ4owr0&5Z*Ol#Mn)MK zna7VGZ{ECl)22-;SFQ{X5BKr$vA4H3H8t(-?tb*>k&BB9KR>^)uyAf}?z3ml{{R2~ z^5x5=OP3ZE71h_*H#IeBXlPu&e*MjxH|y4|+qiM#mMvR0Y}nA)*r=$e$jr=q>(;H+ zt5;W5RVgbgv$C?DJ9qB>{rk1GwJa6yYm=9k&&$h`mX>B11)~5rQ2fcl z$iTqJpabH7@&r3a5d$-ajK_ur2b)>=6+9LsFfzCBE4WNBXk z5*Z1nBOF4iJ`F5|Ob(19noKJq4lZ(S=a-M!(;(=4%z@Q7BVk42W41mSD=xJM69wJ* g@IFybYp0I+WTf(x5<>3JpuRUG70s;)y05q45aR2}S literal 0 HcwPel00001 diff --git a/src/webserver/default/l_ed2klink.gif b/src/webserver/default/l_ed2klink.gif new file mode 100644 index 0000000000000000000000000000000000000000..bb2caae6362495b30b101e6e3be71b7a053aa714 GIT binary patch literal 893 zcwTe&bh9u|Vl3@h1x- zh}HoSpgh6O5yimBA>*-O!9g}QVKavr6B3%4ctrK)Fnmm4W@VM|;Rq;9Xl53Wkl+wF zz|h>sAjQ#eK**_ax`AH z*XsGd*X&lA(%#|YCUv?CQj-8RYnH|Bmd*I+?C#^_$6=keXo7rly>&V*aq{-$c zZm$$yra+9%+}zv;Nr^*`&_fr1rs&{12;D~vN@+h3?VuoJ3Ju^zDW$h QC@7}CNj)Od&_Y1~I~M_%9smFU literal 0 HcwPel00001 diff --git a/src/webserver/default/l_pause.gif b/src/webserver/default/l_pause.gif new file mode 100644 index 0000000000000000000000000000000000000000..44af3d56b3125f1cba77149d2e855649fa7037f0 GIT binary patch literal 873 zcwTe&bh9u|(2r3vD{{R2~@8rq<{ry0JQw$90K#`;*hEXsIhC5LF$-)St zbwC6tPq1^iF)(t-cx+g3u$h@zLu7?P!$AfX8Kwq}i3toWLi%Ao9S;}|_whUWiDYhU jINqryzs#j_)02}7+ObAGGYcLbVbB$Pb%#?yfx#L8Zu}}> literal 0 HcwPel00001 diff --git a/src/webserver/default/l_resume.gif b/src/webserver/default/l_resume.gif new file mode 100644 index 0000000000000000000000000000000000000000..83d698fdf8f7b16f2eae517a5e053fad875c2fb5 GIT binary patch literal 918 zcwTe&bhEHbz&!j0_Ba8FWB70hA{gIEooWEnc{9Sa7gT zR?K8Z!G#1T4goorj2r$3nK;C>Gy)nPCLHP&bJCg-abZ!@1aYH|5Qhs%t=xh-1t$s~ z9`az7m6}siz}U>hE3Oi8VS&T*(>xNBk}g~*I_SwQJE^ST#DPPXxp_rxHcXh3bd-&M M&o&iJGX(}~0L9HZssI20 literal 0 HcwPel00001 diff --git a/src/webserver/default/l_up.gif b/src/webserver/default/l_up.gif new file mode 100644 index 0000000000000000000000000000000000000000..143555694639ab1b651f191a02958da0bd2cdd17 GIT binary patch literal 915 zcwTe&bh9u|(2zYpS*xA`@YHBnzG`P69GBY#p+_}@=-> zn>Mwzwdv~Wvazw{4z+O=z2T3T{*bDuqX_UhHEb?eq`-MY1} zuTN7`la-aVva<62{rj6YZ(h83aZ*xJR#sMRZLO!Lr=6Xhk&%&sfk97C&!b0=R<2y> z=H|x2!Xh9bAS)|7bLPy)j~{z`dn+g??AWnm`}XaOjEsvGExLO3YG-GszrTM>OiX-y ze0X@cw6yg9|6o6if>A&gQ2fcl$iTqFpabH7@&r3a0Rt-)I81ap y+BH)rilIR80qa2tqlR-163ouL(xTJkj!blJ<&(7*aN2R8*_~gWN0N<&!5RRC+kf5w literal 0 HcwPel00001 diff --git a/src/webserver/default/log.gif b/src/webserver/default/log.gif new file mode 100644 index 0000000000000000000000000000000000000000..2fa7d7705a0787d04dbb563af1309023fbd0c3c0 GIT binary patch literal 1042 zcwX(3>q}E{9L9f}l}EFbE;J(4EHzT1q@s*unJIyU6G1B~gEGr33!~H-Q-`Hi=DN;8 zCPtc)<*ha|beSG6Ij5bpbQj%@_qjQzZae3DF#QYq2l~8uc;0>B;R!n)df?!BSLBAQ zMF{a;FD@>kusp;~NBa`Wa8lZ>ukF%Tc94?qq*y*ePR|ccEGYB~jVi0oF#oba_3Vpk zY7U;%tMjGm0Ruevq`qIPY1K0pD{Z#YU;7M(Ihe4(h#6{or&ZJNdkTI|KzY}6JIQ?0 zF{TCDI8RSnV00FAGoUfTuSw_`V}6Vp-T3vfrRJLfQvSjF|9C$9MAa$QOjT z)zGYm#vzbtpn3p`3Fu$4nxwnO>8>%lZIu2_LX!@@3_+b5ss^B<9}0UQsX`s`obXM< z!=Dn~srdF(JWNEymT2;tO(g^+Qc!X|^;JjJ4^dJrU8kX|RCMJa{ceCR?WaomsA7V8 z)l21cP$($%;~*U>BD_-YttohL0g>>5HK?L!7dGP9$*) zf?IN({ZC2nu(FDUoPaoG8Lzo@&6b17hS-;x_j28X?jk3z3s`|yD98PXC?w~hcX;7} z6t;Kn1~&UGDvoUF*yw+<_UdqN%j&a!=bD60+u~fr0dWe+@vP{s&HEEo4H@gh6k7ss z8Qi2u;a1hh%j_hKr+VjI+n-TcXJMleA6TH;gv_V_j-qm_a^Fy9D!v_ KS+X9((4oJo#l?dF literal 0 HcwPel00001 diff --git a/src/webserver/default/login.php b/src/webserver/default/login.php new file mode 100644 index 00000000..5d0ffdaf --- /dev/null +++ b/src/webserver/default/login.php @@ -0,0 +1,67 @@ +aMule CVS - Web Control Panel + + + + + + + + + +
+ + + + + + + +
+
+           +

Web Control Panel
Login

+
+
+ 
Enter your password here

+ +

+
+
+"; + echo $_SESSION["login_error"]; + echo ""; + } +?> +
+
+ diff --git a/src/webserver/default/logo.jpg b/src/webserver/default/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13f9bff7a4106be2160b3748dcafd409192aef38 GIT binary patch literal 13285 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 HALsrTh1DxK literal 0 HcwPel00001 diff --git a/src/webserver/default/phpamule.png b/src/webserver/default/phpamule.png new file mode 100644 index 0000000000000000000000000000000000000000..bbc89de0d761050af638675efb7495e2bebf43d0 GIT binary patch literal 109734 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 z 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�cxWp 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 + + + + +aMule CVS - Web Control Panel + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+   + aMule
Web Control Panel
+
  + +
+ Server list +
+
+ +
+ + Transfer +
+
+ +
+ Search +
+
+ + +
+ Shared Files +
+
+ +
+ Statistics
+ | + + Graphs +
+ +
+ Preferences +
+
  + Serverinfo
+ Log +
+ +
+
+   Connection: +   Speed: Up: ', CastToXBytes($stats["speed_up"]), 'ps', + ' | Down: ', CastToXBytes($stats["speed_down"]), 'ps', + ' (Limits: ', CastToXBytes($stats["speed_limit_up"]), 'ps/', + CastToXBytes($stats["speed_limit_down"]), 'ps) '; + ?> + + + + + + +
+ + +
+
+ +  + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Web Control Panel
+Gzip Compression + +
+ +    Save traffic, especially in graphs. + + +
+
+Refresh-Time of Pages +
+ +    Time in seconds (zero=disabled):
+
+

aMule
+Speed Limits +
+ +    Download: kB/s +  Upload: kB/s + +
+Bandwidth Limits +
+ +    Download: kB/s +  Upload: kB/s + +
+Connection Limits + +
+ + + + +
Max Sources Per File: +
Max. Connections: +
Max. new connections / 5secs: +
+
+ +File Settings +
+ + + +
Try to transfer full chunks to all uploads +
Try to download first and last chunks first +
+

+
+ + + diff --git a/src/webserver/default/red.gif b/src/webserver/default/red.gif new file mode 100644 index 0000000000000000000000000000000000000000..8bd7a2d58c68887036dc8f7787405b108e6bed44 GIT binary patch literal 82 zcwTe&bhEHbWMtrC*vtR|4Pe{=rW(Mk0|yQ?G&KBYVEDwq@PvWk8Uw?B5Cj1okPeVu Q1{U@Sx>K`)x?LHp0krxUrT_o{ literal 0 HcwPel00001 diff --git a/src/webserver/default/search.php b/src/webserver/default/search.php new file mode 100644 index 00000000..c228835c --- /dev/null +++ b/src/webserver/default/search.php @@ -0,0 +1,430 @@ + + + + + +aMule " , amule_get_version(), " - Web Control Panel"; +?> + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+   + aMule
Web Control Panel
+
  + +
+ Server list +
+
+ +
+ + Transfer +
+
+ +
+ Search +
+
+ + +
+ Shared Files +
+
+ +
+ Statistics
+ | + + Graphs +
+ +
+ Preferences +
+
  + Serverinfo
+ Log +
+ +
+
+   Connection: +   Speed: Up: ', CastToXBytes($stats["speed_up"]), 'ps', + ' | Down: ', CastToXBytes($stats["speed_down"]), 'ps', + ' (Limits: ', CastToXBytes($stats["speed_limit_up"]), 'ps/', + CastToXBytes($stats["speed_limit_down"]), 'ps) '; + ?> + + + + + + +
+ + +
+
+ +  +


+ + + + + + + +
Search Results  (Refetch Results)
+ +
+ + + + + + + + + + $c) { + if ( $cat == $c) $result = $i; + } + return $result; + } + + // + // declare it here, before any function reffered it in "global" + // + $sort_order;$sort_reverse; + + function my_cmp($a, $b) + { + global $sort_order, $sort_reverse; + + switch ( $sort_order) { + case "size": $result = $a->size > $b->size; break; + case "name": $result = $a->name > $b->name; break; + case "sources": $result = $a->sources > $b->sources; break; + } + + if ( $sort_reverse ) { + $result = !$result; + } + + return $result; + } + + if ($_SESSION["guest_login"] == 0) { + if ( $HTTP_GET_VARS["cmd"] == "search") { + + $search_type = -1; + switch($HTTP_GET_VARS["method"]) { + case "server": $search_type = 0; break; + case "global": $search_type = 1; break; + case "kad": $search_type = 2; break; + } + + $min_size = $HTTP_GET_VARS["min"] == "" ? 0 : $HTTP_GET_VARS["min"]; + $max_size = $HTTP_GET_VARS["max"] == "" ? 0 : $HTTP_GET_VARS["max"]; + + $min_size *= 1024*1024; + $max_size *= 1024*1024; + + amule_do_search_start_cmd($HTTP_GET_VARS["tosearch"], + $HTTP_GET_VARS["ext"], $HTTP_GET_VARS["type"], + $search_type, $HTTP_GET_VARS["avail"], $min_size, $max_size); + } elseif ( $HTTP_GET_VARS["cmd"] == "download") { + foreach ( $HTTP_GET_VARS as $name => $val) { + // this is file checkboxes + if ( (strlen($name) == 32) and ($val == "on") ) { + $cat = $HTTP_GET_VARS["cat"]; + $cat_idx = cat2idx($cat); + amule_do_search_download_cmd($name, $cat_idx); + } + } + } else { + // wrong command come + //var_dump($HTTP_GET_VARS); + } + } + + $search = amule_load_vars("searchresult"); + + $sort_order = $HTTP_GET_VARS["sort"]; + + if ( $sort_order == "" ) { + $sort_order = $_SESSION["search_sort"]; + } else { + if ( $_SESSION["search_sort_reverse"] == "" ) { + $_SESSION["search_sort_reverse"] = 0; + } else { + $_SESSION["search_sort_reverse"] = !$_SESSION["search_sort_reverse"]; + } + } + + $sort_reverse = $_SESSION["search_sort_reverse"]; + if ( $sort_order != "" ) { + $_SESSION["search_sort"] = $sort_order; + usort(&$search, "my_cmp"); + } + + foreach ($search as $file) { + echo ''; + + } +?> + +
File NameSizeSourcesDownload
', $file->name, + '', CastToXBytes($file->size), + '', $file->sources, + '
+ + + + + +
+ + +
+
+  +
+
+ +
+ + + + + + + +
Search
+ + + + + + + + + + + +
Name
Type + +
Min Size (MB)
Max Size (MB)
Min Availability
Extension
MethodServer
Global Search
Kad Search
+
+ + +
+   +
+ + + + diff --git a/src/webserver/default/servers.php b/src/webserver/default/servers.php new file mode 100644 index 00000000..6f92341b --- /dev/null +++ b/src/webserver/default/servers.php @@ -0,0 +1,364 @@ + + + + + +aMule " , amule_get_version(), " - Web Control Panel"; + if ( $_SESSION["auto_refresh"] > 0 ) { + echo "'; + } +?> + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+   + aMule
Web Control Panel
+
  + +
+ Server list +
+
+ +
+ + Transfer +
+
+ +
+ Search +
+
+ + +
+ Shared Files +
+
+ +
+ Statistics
+ | + + Graphs +
+ +
+ Preferences +
+
  + Serverinfo
+ Log +
+ +
+
+   Connection: +   Speed: Up: ', CastToXBytes($stats["speed_up"]), 'ps', + ' | Down: ', CastToXBytes($stats["speed_down"]), 'ps', + ' (Limits: ', CastToXBytes($stats["speed_limit_up"]), 'ps/', + CastToXBytes($stats["speed_limit_down"]), 'ps) '; + ?> + + + + + + + + + +
+  + + + + + +
+ + + + + + + + + + + + + + + +
Add new server
+
+ IP or Address + Port + Name
+
+ +
+
Update server.met from URL
+
+ URL
+ + +
+ +
+
+'; + if ( ($_SESSION["guest_login"] == 0) && $HTTP_GET_VARS["showctrl"] ) { + echo $add_server_form; + } +?> + +  + + + + + + + + + + + + +'; + $stats = amule_get_stats(); + if ( $stats["id"] == 0 ) { + echo "Not connected"; + } elseif ( $stats["id"] == 0xffffffff ) { + echo "Connecting ..."; + } else { + echo "Connected with ", (($stats["id"] < 16777216) ? "low ID" : "high ID"); + } + echo ''; + echo ''; + +?> + + + +
Server
StatusServer nameusersDisconnectServer Preferences
', $stats["serv_name"], '', $stats["serv_users"], 'Connect to any server
+  + + + + + + + + + + + + + +"; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + if ( $_SESSION["guest_login"] == 0 ) { + echo '"; + } +?> +
Server list
Server nameDescriptionIPusersfilesActions
', $srv->name, '', $srv->desc, '', $srv->addr, '', $srv->users, '(', $srv->maxusers, ')', '', $srv->files, '', + 'Connect', + '", + 'Remove selected server'; + } + echo "
+
+
+ diff --git a/src/webserver/default/shared.php b/src/webserver/default/shared.php new file mode 100644 index 00000000..3b1e06c0 --- /dev/null +++ b/src/webserver/default/shared.php @@ -0,0 +1,375 @@ + + + + + +aMule " , amule_get_version(), " - Web Control Panel"; + if ( $_SESSION["auto_refresh"] > 0 ) { + echo "'; + } +?> + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+   + aMule
Web Control Panel
+
  + +
+ Server list +
+
+ +
+ + Transfer +
+
+ +
+ Search +
+
+ + +
+ Shared Files +
+
+ +
+ Statistics
+ | + + Graphs +
+ +
+ Preferences +
+
  + Serverinfo
+ Log +
+ +
+
+   Connection: +   Speed: Up: ', CastToXBytes($stats["speed_up"]), 'ps', + ' | Down: ', CastToXBytes($stats["speed_down"]), 'ps', + ' (Limits: ', CastToXBytes($stats["speed_limit_up"]), 'ps/', + CastToXBytes($stats["speed_limit_down"]), 'ps) '; + ?> + + + + + +
+ + +
+
+ + + + + + + + + + + + +


+ + "Low", 1 => "Normal", 2 => "High", + 3 => "Very high", 4 => "Very low", 5=> "Auto", 6 => "Powershare"); + $result = $prionames[$file->prio]; + if ( $file->prio_auto == 1) { + $result = $result . "(auto)"; + } + return $result; + } + + // + // declare it here, before any function reffered it in "global" + // + $sort_order;$sort_reverse; + + function my_cmp($a, $b) + { + global $sort_order, $sort_reverse; + + switch ( $sort_order) { + case "size": $result = $a->size > $b->size; break; + case "name": $result = $a->name > $b->name; break; + case "xfer": $result = $a->xfer > $b->xfer; break; + case "allxfer": $result = $a->xfer_all > $b->xfer_all; break; + case "acc": $result = $a->accept > $b->accept; break; + case "allacc": $result = $a->accept_all > $b->accept_all; break; + case "req": $result = $a->req > $b->req; break; + case "req_all": $result = $a->req_all > $b->req_all; break; + case "prio": $result = PrioString($a) > PrioString($b); break; + } + + if ( $sort_reverse ) { + $result = !$result; + } + return $result; + } + + if (($HTTP_GET_VARS["cmd"] != "") && ($_SESSION["guest_login"] == 0)) { + if ($HTTP_GET_VARS["cmd"] == "reload") { + amule_do_reload_shared_cmd(); + } else { + amule_do_shared_cmd($HTTP_GET_VARS["file"], $HTTP_GET_VARS["cmd"]); + } + } + + $shared = amule_load_vars("shared"); + + $sort_order = $HTTP_GET_VARS["sort"]; + + if ( $sort_order == "" ) { + $sort_order = $_SESSION["shared_sort"]; + } else { + if ( $_SESSION["sort_reverse"] == "" ) { + $_SESSION["sort_reverse"] = 0; + } else { + $_SESSION["sort_reverse"] = !$_SESSION["sort_reverse"]; + } + } + + $sort_reverse = $_SESSION["sort_reverse"]; + if ( $sort_order != "" ) { + $_SESSION["shared_sort"] = $sort_order; + usort(&$shared, "my_cmp"); + } + + foreach ($shared as $file) { + echo ''; + echo ''; + echo ''; + + echo ''; + echo ''; + echo ''; + echo ''; + echo '', "\n"; + echo '', "\n"; + + ?> + +
File Name + Transferred Data  + (Total) + + Requests  + (Total)  + + Accepted Requests  + (Total) +SizePriorityED2K Link(s)
', + $file->name, '', CastToXBytes($file->xfer), + '(', CastToXBytes($file->xfer_all),')' , $file->req, '(', $file->req_all,')' , $file->accept, '(', $file->accept_all,')', CastToXBytes($file->size), '', PrioString($file), 'ED2K Link(s)'; + + if ( $_SESSION["guest_login"] == 0 ) { + echo 'Increase Priority'; + echo 'Decrease Priority'; + } + } + echo '
+ +

+

+  + +

+ diff --git a/src/webserver/default/stat_graphs.php b/src/webserver/default/stat_graphs.php new file mode 100644 index 00000000..71db1531 --- /dev/null +++ b/src/webserver/default/stat_graphs.php @@ -0,0 +1,271 @@ + + + + + +aMule " , amule_get_version(), " - Web Control Panel"; +?> + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+   + aMule
Web Control Panel
+
  + +
+ Server list +
+
+ +
+ + Transfer +
+
+ +
+ Search +
+
+ + +
+ Shared Files +
+
+ +
+ Statistics
+ | + + Graphs +
+ +
+ Preferences +
+
  + Serverinfo
+ Log +
+ +
+
+   Connection: +   Speed: Up: ', CastToXBytes($stats["speed_up"]), 'ps', + ' | Down: ', CastToXBytes($stats["speed_down"]), 'ps', + ' (Limits: ', CastToXBytes($stats["speed_limit_up"]), 'ps/', + CastToXBytes($stats["speed_limit_down"]), 'ps) '; + ?> + + + + + + +
+ + +
+
+ +  + + + + + + + + + + +
Download speed
+  + + + + + + + +
Upload speed
+  + + + + + + + +
Number of connections
+ + + diff --git a/src/webserver/default/stat_tree.php b/src/webserver/default/stat_tree.php new file mode 100644 index 00000000..6a6213b7 --- /dev/null +++ b/src/webserver/default/stat_tree.php @@ -0,0 +1,328 @@ + + + + + +aMule " , amule_get_version(), " - Web Control Panel"; +?> + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+   + aMule
Web Control Panel
+
  + +
+ Server list +
+
+ +
+ + Transfer +
+
+ +
+ Search +
+
+ + +
+ Shared Files +
+
+ +
+ Statistics
+ | + + Graphs +
+ +
+ Preferences +
+
  + Serverinfo
+ Log +
+ +
+
+   Connection: +   Speed: Up: ', CastToXBytes($stats["speed_up"]), 'ps', + ' | Down: ', CastToXBytes($stats["speed_down"]), 'ps', + ' (Limits: ', CastToXBytes($stats["speed_limit_up"]), 'ps/', + CastToXBytes($stats["speed_limit_down"]), 'ps) '; + ?> + + + + + + +
+ + +
+
+ +  +", $it, "
\n"; +} + +function print_folder($key, &$arr, $ident) +{ + print_ident($ident); + echo "\n"; + print_ident($ident+1); + echo "\n"; + print_ident($ident+1); + echo $key, "
\n"; + print_ident($ident); + echo "
\n"; + print_ident($ident); + echo "\n"; + + foreach ($arr as $k => $v) { + if ( count(&$v) ) { + print_folder($k, $v, $ident+1); + } else { + print_item($k, $ident+1); + } + } + + print_ident($ident); + echo "\n"; +} + + $stattree = amule_load_vars("stats_tree"); + + print_folder("Statistics", $stattree, 1); +?> + + + diff --git a/src/webserver/default/transparent.gif b/src/webserver/default/transparent.gif new file mode 100644 index 0000000000000000000000000000000000000000..4d97c5b10c0e9f7feb7b11f6d5ea8432b3398538 GIT binary patch literal 85 zcwTe&bhEHbWMp7u*v!D-;Nalq=H~6~9S{(}z|hdZ0E7((4jgD`X!y^-!0?~pKbZOt cW&wfXPZmZ723`gopeO^#3#j38PEM1bTOn6z8^D-WH`a+&c(({s6q l`Ri#3^Thf>GudR6`d&|3wc@8+A@3HscVEO+YZMC*VEkXi<2Q;uDC&Z+Ek z3tKz+QHLyhivdTBXYUG)GOroSbU3D$ED>^C_xgIr``x^p5?lUsFoyL`%e0c`WUvMR Du5u*g literal 0 HcwPel00001 diff --git a/src/webserver/default/yellow.gif b/src/webserver/default/yellow.gif new file mode 100644 index 0000000000000000000000000000000000000000..f30463aee7c18ed90b0e320356097657a63a1d02 GIT binary patch literal 97 zcwTe&bhEHbHw>S@G5r4zM1+A30}z1pGO&mVobYVk8}Z_7`~L)u RK9v)5nU=AIaJw*A0|0Q0I6?pb literal 0 HcwPel00001 diff --git a/src/webserver/php-default/Makefile.am b/src/webserver/php-default/Makefile.am new file mode 100644 index 00000000..e20f8ca4 --- /dev/null +++ b/src/webserver/php-default/Makefile.am @@ -0,0 +1,51 @@ +dist_webserver_DATA = \ + amuleweb-main-dload.php \ + amuleweb-main-search.php \ + amuleweb-main-servers.php \ + amuleweb-main-shared.php \ + amuleweb-main-stats.php \ + amuleweb-main-prefs.php \ + amuleweb-main-kad.php \ + stats.php \ + stats_tree.php \ + top.html \ + footer.php \ + login.php \ + tree-open.gif \ + tree-closed.gif \ + tree-leaf.gif \ + toolbutton-reload.jpeg \ + toolbutton-search.jpeg \ + toolbutton-search-pressed.jpeg \ + toolbutton-servers.jpeg \ + toolbutton-servers-pressed.jpeg \ + toolbutton-settings.jpeg \ + toolbutton-settings-pressed.jpeg \ + toolbutton-shared.jpeg \ + toolbutton-shared-pressed.jpeg \ + toolbutton-download.jpeg \ + toolbutton-download-pressed.jpeg \ + toolbutton-kad.jpeg \ + toolbutton-kad-pressed.jpeg \ + toolbutton-stats.jpeg \ + toolbutton-stats-pressed.jpeg \ + toolbutton-connect.jpeg \ + toolbutton-logout.jpeg \ + toolbutton-logout-pressed.jpeg \ + toolbutton-filter.jpeg \ + connect.gif \ + cancel.gif \ + arrow-r.png \ + up.jpeg \ + down.jpeg \ + pause.jpeg \ + resume.jpeg \ + apply.jpeg \ + delete.jpeg \ + phpamule.png \ + favicon.ico \ + index.html + +webserverdir = $(pkgdatadir)/webserver/php-default + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/webserver/php-default/Makefile.in b/src/webserver/php-default/Makefile.in new file mode 100644 index 00000000..e75e9c92 --- /dev/null +++ b/src/webserver/php-default/Makefile.in @@ -0,0 +1,526 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/webserver/php-default +DIST_COMMON = $(dist_webserver_DATA) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(webserverdir)" +dist_webserverDATA_INSTALL = $(INSTALL_DATA) +DATA = $(dist_webserver_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +dist_webserver_DATA = \ + amuleweb-main-dload.php \ + amuleweb-main-search.php \ + amuleweb-main-servers.php \ + amuleweb-main-shared.php \ + amuleweb-main-stats.php \ + amuleweb-main-prefs.php \ + amuleweb-main-kad.php \ + stats.php \ + stats_tree.php \ + top.html \ + footer.php \ + login.php \ + tree-open.gif \ + tree-closed.gif \ + tree-leaf.gif \ + toolbutton-reload.jpeg \ + toolbutton-search.jpeg \ + toolbutton-search-pressed.jpeg \ + toolbutton-servers.jpeg \ + toolbutton-servers-pressed.jpeg \ + toolbutton-settings.jpeg \ + toolbutton-settings-pressed.jpeg \ + toolbutton-shared.jpeg \ + toolbutton-shared-pressed.jpeg \ + toolbutton-download.jpeg \ + toolbutton-download-pressed.jpeg \ + toolbutton-kad.jpeg \ + toolbutton-kad-pressed.jpeg \ + toolbutton-stats.jpeg \ + toolbutton-stats-pressed.jpeg \ + toolbutton-connect.jpeg \ + toolbutton-logout.jpeg \ + toolbutton-logout-pressed.jpeg \ + toolbutton-filter.jpeg \ + connect.gif \ + cancel.gif \ + arrow-r.png \ + up.jpeg \ + down.jpeg \ + pause.jpeg \ + resume.jpeg \ + apply.jpeg \ + delete.jpeg \ + phpamule.png \ + favicon.ico \ + index.html + +webserverdir = $(pkgdatadir)/webserver/php-default +MAINTAINERCLEANFILES = Makefile.in +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/webserver/php-default/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/webserver/php-default/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: +install-dist_webserverDATA: $(dist_webserver_DATA) + @$(NORMAL_INSTALL) + test -z "$(webserverdir)" || $(mkdir_p) "$(DESTDIR)$(webserverdir)" + @list='$(dist_webserver_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(dist_webserverDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(webserverdir)/$$f'"; \ + $(dist_webserverDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(webserverdir)/$$f"; \ + done + +uninstall-dist_webserverDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_webserver_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(webserverdir)/$$f'"; \ + rm -f "$(DESTDIR)$(webserverdir)/$$f"; \ + done +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(webserverdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-dist_webserverDATA + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-dist_webserverDATA uninstall-info-am + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-dist_webserverDATA install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am uninstall uninstall-am \ + uninstall-dist_webserverDATA uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/webserver/php-default/amuleweb-main-dload.php b/src/webserver/php-default/amuleweb-main-dload.php new file mode 100644 index 00000000..5c753ef0 --- /dev/null +++ b/src/webserver/php-default/amuleweb-main-dload.php @@ -0,0 +1,403 @@ + + + +amule download page + + + 0 ) { + echo "'; + } +?> + + + + + + +
+ + + + + + + + + +
+ + + + + + + +
+ + + + + + + +
+ '; + foreach ($all_status as $s) { + echo (($s == $_SESSION["filter_status"]) ? ''; + } + echo ''; + //var_dump($_SESSION["filter_cat"]); + echo ''; + ?> + Apply   +  You logged in as guest - commands are disabled"; + } + ?> +
+
+ + + + + + + + + + + + + + + + + + + + + + + + status == 7 ) { + return "Paused"; + } elseif ( $file->src_count_xfer > 0 ) { + return "Downloading"; + } else { + return "Waiting"; + } + } + + function PrioString($file) + { + $prionames = array(0 => "Low", 1 => "Normal", 2 => "High", + 3 => "Very high", 4 => "Very low", 5=> "Auto", 6 => "Powershare"); + $result = $prionames[$file->prio]; + if ( $file->prio_auto == 1) { + $result = $result . "(auto)"; + } + return $result; + } + + // + // declare it here, before any function reffered it in "global" + // + $sort_order;$sort_reverse; + + function my_cmp($a, $b) + { + global $sort_order, $sort_reverse; + + switch ( $sort_order) { + case "size": $result = $a->size > $b->size; break; + case "size_done": $result = $a->size_done > $b->size_done; break; + case "progress": $result = (((float)$a->size_done)/((float)$a->size)) > (((float)$b->size_done)/((float)$b->size)); break; + case "name": $result = $a->name > $b->name; break; + case "speed": $result = $a->speed > $b->speed; break; + case "scrcount": $result = $a->src_count > $b->src_count; break; + case "status": $result = StatusString($a) > StatusString($b); break; + case "prio": $result = PrioString($a) > PrioString($b); break; + } + + if ( $sort_reverse ) { + $result = !$result; + } + //var_dump($sort_reverse); + return $result; + } + + // + // perform command before processing content + + if ( ($HTTP_GET_VARS["command"] != "") && ($_SESSION["guest_login"] == 0) ) { + foreach ( $HTTP_GET_VARS as $name => $val) { + // this is file checkboxes + if ( (strlen($name) == 32) and ($val == "on") ) { + //var_dump($name); + amule_do_download_cmd($name, $HTTP_GET_VARS["command"]); + } + } + // + // check "filter-by-status" settings + // + if ( $HTTP_GET_VARS["command"] == "filter") { + //var_dump($_SESSION); + $_SESSION["filter_status"] = $HTTP_GET_VARS["status"]; + $_SESSION["filter_cat"] = $HTTP_GET_VARS["category"]; + } + } + if ( $_SESSION["filter_status"] == "") $_SESSION["filter_status"] = "all"; + if ( $_SESSION["filter_cat"] == "") $_SESSION["filter_cat"] = "all"; + + $downloads = amule_load_vars("downloads"); + + $sort_order = $HTTP_GET_VARS["sort"]; + + if ( $sort_order == "" ) { + $sort_order = $_SESSION["download_sort"]; + } else { + if ( $_SESSION["download_sort_reverse"] == "" ) { + $_SESSION["download_sort_reverse"] = 0; + } else { + if ( $HTTP_GET_VARS["sort"] != '') { + $_SESSION["download_sort_reverse"] = !$_SESSION["download_sort_reverse"]; + } + } + } + //var_dump($_SESSION); + $sort_reverse = $_SESSION["download_sort_reverse"]; + if ( $sort_order != "" ) { + $_SESSION["download_sort"] = $sort_order; + usort(&$downloads, "my_cmp"); + } + + // + // Prepare categories index array + $cats = amule_get_categories(); + foreach($cats as $i => $c) { + $cat_idx[$c] = $i; + } + + foreach ($downloads as $file) { + $filter_status_result = ($_SESSION["filter_status"] == "all") or + ($_SESSION["filter_status"] == StatusString($file)); + + $filter_cat_result = ($_SESSION["filter_cat"] == "all") or + ($cat_idx[ $_SESSION["filter_cat"] ] == $file->category); + + if ( $filter_status_result and $filter_cat_result) { + print ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + print ""; + } + } + ?> +
 
+
         
", '', "", $file->short_name, "", $file->progress, "", CastToXBytes($file->size), "", CastToXBytes($file->size_done), " (", + ((float)$file->size_done*100)/((float)$file->size), "%)"; + if ( $file->src_count_not_curr != 0 ) { + echo $file->src_count - $file->src_count_not_curr, " / "; + } + echo $file->src_count, " ( ", $file->src_count_xfer, " ) "; + if ( $file->src_count_a4af != 0 ) { + echo "+ ", $file->src_count_a4af; + } + echo "", StatusString($file), "", ($file->speed > 0) ? (CastToXBytes($file->speed) . "/s") : "-", "", PrioString($file), "
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + "; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + echo ""; + echo ""; + echo ""; + } + ?> +
File name
User name
Transferred Up
Transferred Down
Speed
       
", "", $file->short_name, "", $file->user_name, "", CastToXBytes($file->xfer_up), "", CastToXBytes($file->xfer_down), "", ($file->xfer_speed > 0) ? (CastToXBytes($file->xfer_speed) . "/s") : "-", "
+ + diff --git a/src/webserver/php-default/amuleweb-main-kad.php b/src/webserver/php-default/amuleweb-main-kad.php new file mode 100755 index 00000000..94bb0df1 --- /dev/null +++ b/src/webserver/php-default/amuleweb-main-kad.php @@ -0,0 +1,142 @@ + + +amule Kad page + + + 0 ) { + echo "'; + } + + amule_load_vars("stats_graph"); +?> + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  
   
   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bootstrap from node
 IP  
      
 Port     
        
      
        
 
Number of nodes
   
   
   
+
+ + diff --git a/src/webserver/php-default/amuleweb-main-prefs.php b/src/webserver/php-default/amuleweb-main-prefs.php new file mode 100755 index 00000000..f5eafa08 --- /dev/null +++ b/src/webserver/php-default/amuleweb-main-prefs.php @@ -0,0 +1,314 @@ + + + +amule preferences page + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
   
  + + + + + + + + + + + + + + + +
Webserver
Page refresh interval   
+ Use gzip compression    
 
  + + + + + + + + + + +
Line capacity (for statistics only)
Max download rate Max upload rate  
 
  + + + + + + + + + + +
Bandwidth limits
Max download rate + Max upload rate Slot allocation +
 
  + + + + + + + + + + + + + + + + + + + + + + +
Connection settings
Max total connections (total) Max sources per file  
+ Autoconnect at startup    
+ Reconnect when connection lost    
 
  + + + + + + + + + + +
Network settings
TCP port UDP port + Disable UDP connections
 
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
File settings
Minimum free space (Mb)  + Check free space
+ Added download files have auto priority  
+ New shared files have auto priority  
+ I.C.H. active  
+ AICH trusts every hash (not recommended)  
+ Alloc full chunks of .part files  
+ Alloc full disk space for .part files  
+ Add files to download queue in pause mode  
+ Extract metadata tags  
 
   
  + '; + } else { + echo " You can not change options - logged in as guest"; + } + ?> + +  
   
+
+ + diff --git a/src/webserver/php-default/amuleweb-main-search.php b/src/webserver/php-default/amuleweb-main-search.php new file mode 100755 index 00000000..cb47b8e7 --- /dev/null +++ b/src/webserver/php-default/amuleweb-main-search.php @@ -0,0 +1,231 @@ + + + +amule download page + + + + + + +
+ + + + +
+ + + + + + + + + + + + size > $b->size; break; + case "name": $result = $a->name > $b->name; break; + case "sources": $result = $a->sources > $b->sources; break; + } + + if ( $sort_reverse ) { + $result = !$result; + } + + return $result; + } + + function str2mult($str) + { + $result = 1; + switch($str) { + case "Byte": $result = 1; break; + case "KByte": $result = 1024; break; + case "MByte": $result = 1012*1024; break; + case "GByte": $result = 1012*1024*1024; break; + } + return $result; + } + + function cat2idx($cat) + { + $cats = amule_get_categories(); + $result = 0; + foreach($cats as $i => $c) { + if ( $cat == $c) $result = $i; + } + return $result; + } + + if ($_SESSION["guest_login"] == 0) { + if ( $HTTP_GET_VARS["command"] == "search") { + $search_type = -1; + switch($HTTP_GET_VARS["searchtype"]) { + case "Local": $search_type = 0; break; + case "Global": $search_type = 1; break; + case "Kad": $search_type = 2; break; + } + $min_size = $HTTP_GET_VARS["minsize"] == "" ? 0 : $HTTP_GET_VARS["minsize"]; + $max_size = $HTTP_GET_VARS["maxsize"] == "" ? 0 : $HTTP_GET_VARS["maxsize"]; + + $min_size *= str2mult($HTTP_GET_VARS["minsizeu"]); + $max_size *= str2mult($HTTP_GET_VARS["maxsizeu"]); + + amule_do_search_start_cmd($HTTP_GET_VARS["searchval"], + //$HTTP_GET_VARS["ext"], $HTTP_GET_VARS["filetype"], + "", "", + $search_type, $HTTP_GET_VARS["avail"], $min_size, $max_size); + } elseif ( $HTTP_GET_VARS["command"] == "download") { + foreach ( $HTTP_GET_VARS as $name => $val) { + // this is file checkboxes + if ( (strlen($name) == 32) and ($val == "on") ) { + $cat = $HTTP_GET_VARS["targetcat"]; + $cat_idx = cat2idx($cat); + amule_do_search_download_cmd($name, $cat_idx); + } + } + } else { + } + } + $search = amule_load_vars("searchresult"); + + $sort_order = $HTTP_GET_VARS["sort"]; + + if ( $sort_order == "" ) { + $sort_order = $_SESSION["search_sort"]; + } else { + if ( $_SESSION["search_sort_reverse"] == "" ) { + $_SESSION["search_sort_reverse"] = 0; + } else { + $_SESSION["search_sort_reverse"] = !$_SESSION["search_sort_reverse"]; + } + } + + $sort_reverse = $_SESSION["search_sort_reverse"]; + if ( $sort_order != "" ) { + $_SESSION["search_sort"] = $sort_order; + usort(&$search, "my_cmp"); + } + + foreach ($search as $file) { + print ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + print ""; + } + + ?> + +
+ + + + + + + + +
+ + + +
+
+ +
+ +   + + + +  + + + + + + +
Click here to reload search results
  
", '', "", $file->short_name, "", CastToXBytes($file->size), "", $file->sources, "
+
+ + diff --git a/src/webserver/php-default/amuleweb-main-servers.php b/src/webserver/php-default/amuleweb-main-servers.php new file mode 100755 index 00000000..7f366ac4 --- /dev/null +++ b/src/webserver/php-default/amuleweb-main-servers.php @@ -0,0 +1,123 @@ + + + +amule download page + + + + + + + + + + + +
 
+ + + + + + + + + + + name > $b->name; break; + case "desc": $result = $a->desc > $b->desc; break; + case "users": $result = $a->users > $b->users; break; + case "max_users": $result = $a->maxusers > $b->maxusers; break; + case "files":$result = $a->files > $b->files; break; + } + + if ( $sort_reverse ) { + $result = !$result; + } + return $result; + } + + $servers = amule_load_vars("servers"); + + $sort_order = $HTTP_GET_VARS["sort"]; + + // + // perform command before processing content + // + if ( ($HTTP_GET_VARS["cmd"] != "") and ($HTTP_GET_VARS["ip"] != "") and ($HTTP_GET_VARS["port"] != "")) { + if ($_SESSION["guest_login"] == 0) { + amule_do_server_cmd($HTTP_GET_VARS["ip"], $HTTP_GET_VARS["port"], $HTTP_GET_VARS["cmd"]); + } + } + + if ( $sort_order == "" ) { + $sort_order = $_SESSION["servers_sort"]; + } else { + if ( $_SESSION["sort_reverse"] == "" ) { + $_SESSION["sort_reverse"] = 0; + } else { + $_SESSION["sort_reverse"] = !$_SESSION["sort_reverse"]; + } + } + + $sort_reverse = $_SESSION["sort_reverse"]; + if ( $sort_order != "" ) { + $_SESSION["servers_sort"] = $sort_order; + usort(&$servers, "my_cmp"); + } + foreach ($servers as $srv) { + echo ""; + + if ($_SESSION["guest_login"] != 0) { + echo ""; + } else { + echo ""; + } + + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + + echo ""; + } + ?> +
+
Address
", + '', + '','', + '', + '','', + "", $srv->name, "", $srv->desc, "", $srv->addr, "", $srv->users, "", $srv->maxusers, "", $srv->files, "
+ + diff --git a/src/webserver/php-default/amuleweb-main-shared.php b/src/webserver/php-default/amuleweb-main-shared.php new file mode 100755 index 00000000..5a9a2ba3 --- /dev/null +++ b/src/webserver/php-default/amuleweb-main-shared.php @@ -0,0 +1,260 @@ + + + +amule download page + + + + + + + +
+ + + + + + + + + +
+ + + + + + + +
Reload Prio UpPrio Down 
+ + + + + + + +
+Set Priority   +  You logged in as guest - commands are disabled"; + } + ?> +
+ + + + + + + + + + + + + status == 7 ) { + return "Paused"; + } elseif ( $file->src_count_xfer > 0 ) { + return "Downloading"; + } else { + return "Waiting"; + } + } + + function PrioString($file) + { + $prionames = array(0 => "Low", 1 => "Normal", 2 => "High", + 3 => "Very high", 4 => "Very low", 5=> "Auto", 6 => "Powershare"); + $result = $prionames[$file->prio]; + if ( $file->prio_auto == 1) { + $result = $result . "(auto)"; + } + return $result; + } + + // + // declare it here, before any function reffered it in "global" + // + $sort_order;$sort_reverse; + + function my_cmp($a, $b) + { + global $sort_order, $sort_reverse; + + switch ( $sort_order) { + case "size": $result = $a->size > $b->size; break; + case "name": $result = $a->name > $b->name; break; + case "xfer": $result = $a->xfer > $b->xfer; break; + case "acc": $result = $a->accept > $b->accept; break; + case "req": $result = $a->req > $b->req; break; + case "prio": $result = PrioString($a) > PrioString($b); break; + } + + if ( $sort_reverse ) { + $result = !$result; + } + //var_dump($sort_reverse); + return $result; + } + + // + // perform command before processing content + // + //var_dump($HTTP_GET_VARS); + if (($HTTP_GET_VARS["command"] != "") && ($_SESSION["guest_login"] == 0)) { + //amule_do_download_cmd($HTTP_GET_VARS["command"]); + foreach ( $HTTP_GET_VARS as $name => $val) { + // this is file checkboxes + if ( (strlen($name) == 32) and ($val == "on") ) { + //var_dump($name);var_dump($val); + amule_do_shared_cmd($name, $HTTP_GET_VARS["command"]); + } + } + if ($HTTP_GET_VARS["command"] == "reload") { + amule_do_reload_shared_cmd(); + } + } + $shared = amule_load_vars("shared"); + + $sort_order = $HTTP_GET_VARS["sort"]; + + if ( $sort_order == "" ) { + $sort_order = $_SESSION["shared_sort"]; + } else { + if ( $_SESSION["sort_reverse"] == "" ) { + $_SESSION["sort_reverse"] = 0; + } else { + $_SESSION["sort_reverse"] = !$_SESSION["sort_reverse"]; + } + } + //var_dump($_SESSION); + $sort_reverse = $_SESSION["sort_reverse"]; + if ( $sort_order != "" ) { + $_SESSION["shared_sort"] = $sort_order; + usort(&$shared, "my_cmp"); + } + + foreach ($shared as $file) { + print ""; + + echo ""; + + echo ""; + echo ""; + + echo ""; + echo ""; + + echo ""; + + echo ""; + + print ""; + } + ?> +
  
", '', "", $file->short_name, "", CastToXBytes($file->xfer), "", $file->req, "", $file->accept, "", CastToXBytes($file->size), "", PrioString($file), "
+
+ + diff --git a/src/webserver/php-default/amuleweb-main-stats.php b/src/webserver/php-default/amuleweb-main-stats.php new file mode 100755 index 00000000..8d8e570b --- /dev/null +++ b/src/webserver/php-default/amuleweb-main-stats.php @@ -0,0 +1,113 @@ + + + +amule Kad page + + + 0 ) { + echo "'; + } + + amule_load_vars("stats_graph"); + +?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    
  
  
Download speed
   
  
 
Upload speed
   
  
  
Number of connections
    
+ + diff --git a/src/webserver/php-default/apply.jpeg b/src/webserver/php-default/apply.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..e1c56f38e15983e38cf28ae0874ce19a907707d1 GIT binary patch literal 1515 zcwYN|78puW*P&7uP=iZ0|NsG0|@XjFflPQumD+% zK&->W1YvxKaAx3OV`FDymaka3YSZQ|TeofBv2)j>z(JGL?fA z2(qv$8nOvF2C^p>3M&~ka)>xhT)6Qdr?PR-2hpUWi(FzVCJ$9Vg1iRy8F3zKBFkrR zk0JbZi-Cuk5g2*Qf(-Tyuh*8&=aRLm-*Ax0|LOMWd;0hGY0v+6?Zc<|X?yxKb$i^4 zp8xo9Tz!6&#=5Kxdo!%}Efck~n0a05{o#j(cb7i-)oK6hN}y}W?D_w1{{P1y?p&0b zSdyBeP@Y+mp%9Xhs^ISF8vstetjsLHZ~}%B3o9!y0C_+OnVp}To0CV7Ur0!hUr)~0US3#SNkvIcMMh3u4xD^}TG`py`8YWE6V#^nVl6WVKcA_vV&sSWa1=Y5u?Dw!iA1O!HtW6 z>Lq{y%glfRn3-7FfHJCr42&!cENlo_kWxVwL&rcNVa3G8iL4?{s8RD`+FCj9hh#zG51Ya*>?Gh-<}=I^KqM9 z*&ZO1d+fuKwJIqZf*V=#XC2&;5i{NRHgDXlty^9Ry_sv7yH(OdtDSenlcmu@Ei7-p z+}b1jwe#BMPWP+P$AqFd&&F+-birfMf^&`j=bOTpO${jBHluxQy zs_Dkj{j+s(ch&2+Di0qOgPG!QlVb9>n+nflKeg7(;{r&va{@7Y)j_d93GE!=aii-91 z^~uS}DxMw6=l=UK8567qc)a^=)jGDgxmwL2y8F52(uRqv(#ZVCJg5YQrO(FO^m(1`*9{X;8bo6oxBx4o4ivfZxO*x9%V1M}mgN8mo} zD;B%d@&0C0+aV8>wAxkXOEHfE!lq2NjS>=|2K3#XJg^4-l!h(HA*7_Gn!Mn?o;t?q z!>8P$h0TCMyauPlQ-mcxU`rL~VqsmI4CbCl$UD2L8IS z?cJN`{^&`%KEtCuYO3O&)|vf=cK)rRhnu~I;#OzFUu5lFy2aA&*pHIXi(hn<&=dv5 z5d}N9GN`MlVTY}#f)7VlZum3x{LCK&>Gj<7k=EvmZ6<(UHQ<;3i| zMgG3Jh1pqK#8YkdX8!NKt;^~Mssn3rcznxs)Pn*w*fEcimFLu|d)H35^tfTYSXR7E z`|7#A;{L3#w+0L!@5XNJJ1Bz5a-HaOPGW-S1iSvBl$WEo+U4*d#u+ZqC?+{ioZ5Wf zHYbtRi^i*PBCZ!sdZPL6&o(+frRSt3CLluWOQSDqGCz{X4+prO=6dNAyC>xf`oiGMO$J5PP(RMp7x&J+P1#FHqFCAyrzPZ z=91#JI;H?Mm z=jWGC00001bW%=J06^y0W&i*H0b)x>L;#2d9Y_EG010qNS#tmY3ljhU3ljkVnw%H_ z000McNliru)d&*>3>vHF;1K`-0E|gQK~yNuz0*+&h9D3G;GXt9SnveHo^H?7bvjnA z=^y+~un;v5PT+@1;<9`hkvuJur)gU$w^GxFtINJq+qR2^t}ec9%u3N9?mpTba3{7? z0HXmj17_Q4ogHm!#B8#i*2&So{M&n~=~eaatP@r82Q-LAg0>GX*=;G8?EW+>&m(22 dyzmO1(2r3vD{{R2~@8rq<{ry0JQw$90K#`;*hEXsIhC5LF$-)St zbwC6tPq1@@Gca<jCM65nATwKJKyGutxfWaC77B?;& literal 0 HcwPel00001 diff --git a/src/webserver/php-default/connect.gif b/src/webserver/php-default/connect.gif new file mode 100644 index 0000000000000000000000000000000000000000..25476dad7b12540778c5df781347d706ae91c2de GIT binary patch literal 345 zcwTe&bhEHb6krfwxN68yoy?FM!LYQ2AuW($MLWZV#SG`?FbcS(Prd;I^^_vKN<>GjOlHvwhE z{=N?T|2_Ns0k?f~7=GT@`TySQ<4vvIOSRu!H~RC$;L>iT-}kuRUsE`{iS680#SfQw zK3-(px0v<#TK0u~)(v?o|NsAIAQ~wCWMO>4Y{;Mk;(+|bz*cr(Mu7zjOUDT%2L%b0 zsVz%K@mBU!T$pc zf*cGY3`We1N(@YbjLd?J|Bo<8fcysZ9TH$;WoH4(XbUhfvM@2QGO@BkB^a5QSp*q? z9uQJAbetrtq>?yM*{E^hBA{YPMg}Hk6jKHYf=)FflQ*FtWmB7?~IZnORtc z91VqwCN4bq{}uxeP%o1pvmk>#!;4w#{8d-I>i$=>IrP+z-td@|f5xZRJd3E>wWPi> zaLwZ~xpm7M_wN&!v%Po0>!^Dtu4K1}O_unwU-PL-!@eU+mHygDf5-{X`w-)DIcm9} z>X+Bw0w%3rA$Wjqsq9!-)v`t>fO zigz{lBbP5zRx+JW`@LWJQ@-sfw&iYlA!fI0+b76mUON#KHc3ZA@J5q$lQDbZiJf}! zKBm=0r=8ERo7iZtyu2<*WQRax&!SejNdXO$!(ZOEDgJrnb$C$!ZrxR$3^V6H4GmZH zZAcM(BJ$hbWqqE}g3r5r=dTXmEqP;db5=!r#;oO^wuc^-Zn^3q-;>PYF7Ph(%>-c+ zlke_t0zF^3H{T3TKJam}e@=Yg`=gl}d@41oLsxo!elRKf$1y`b72Ok!MNY3xxjP=l rv}nFMTT?Mpn)lyXm)k!rH{N-}d;7*Qn|{M{*K+4yvp8nZ^8Y3PaJL9| literal 0 HcwPel00001 diff --git a/src/webserver/php-default/down.jpeg b/src/webserver/php-default/down.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7bb1966808a99b9ec642d779cdfc98412275d4fe GIT binary patch literal 718 zcwYN|%K@mBU!T$pc zf*cGY3`We1N(@YbjLd?J|Bo<8fcysZ9TH$;WoH4(=n60}GBYzX0o@FhU}RzzWMBb$ zKuFP0M8$EEs8Qm?g-XhWiw**nivtZ|WGOFfs`;vj`m&HY^PM ze~Wne_c(}&VDP^S9bDu_;ksgi7%cO{#@0QwmtF1lMlvU z7g&DVlAQnLnMZV%&NXYHTV0b{?N3Y(nejyMi2RfZ{MX!ruX#ZLHFdqJQSAtk2b2@V@lSe6#hX8hpH+S1etQ*oW>|8#u$q^}z3- zDeUWhhdyii`J?5N>{8{nbQ?%mzlPhM{EjO~9(>Swg T$_h5iQ}<5(ee4y~@c$+NO2z4U literal 0 HcwPel00001 diff --git a/src/webserver/php-default/favicon.ico b/src/webserver/php-default/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e65c2f3618cebe9cb79bf7446b9e07e46822382f GIT binary patch literal 11662 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 MH)8jPIJlqx2azDPw*UYD literal 0 HcwPel00001 diff --git a/src/webserver/php-default/footer.php b/src/webserver/php-default/footer.php new file mode 100755 index 00000000..86963e4c --- /dev/null +++ b/src/webserver/php-default/footer.php @@ -0,0 +1,65 @@ + + + +amule-frame-bottom + + + + + + + + + + + + + + + + + + + + +
 
+ + + + +
 
+ + diff --git a/src/webserver/php-default/index.html b/src/webserver/php-default/index.html new file mode 100644 index 00000000..cf32ee96 --- /dev/null +++ b/src/webserver/php-default/index.html @@ -0,0 +1,15 @@ + + + +amule control panel + + + + + + + + +<body> +</body> + diff --git a/src/webserver/php-default/login.php b/src/webserver/php-default/login.php new file mode 100644 index 00000000..5d0ffdaf --- /dev/null +++ b/src/webserver/php-default/login.php @@ -0,0 +1,67 @@ +aMule CVS - Web Control Panel + + + + + + + + + +
+ + + + + + + +
+
+           +

Web Control Panel
Login

+
+
+ 
Enter your password here

+ +

+
+
+"; + echo $_SESSION["login_error"]; + echo ""; + } +?> +
+
+ diff --git a/src/webserver/php-default/pause.jpeg b/src/webserver/php-default/pause.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..a8c283af1daa0e6a2f7f47157dabd9f185240d07 GIT binary patch literal 714 zcwYN|%K@mBU!T$pc zf*cGY3`We1N(@YbjLd?J|Bo<8fcysZ9Rjd1u(GfNWpo7?7@2{9k)0JP!^p(U!oVuX z#xA6&WH?DgR9VF_abn=YMH>$Sm5T!nVP-%9jLfV+33)*VMiwR}WI3Qgf-H(c6Acp| z{=db*!^{YD53?YHJ;N98u=A>Gin{+~rmoI@WZG9a`Nz8Gw5RPGPr1MM(w%j;edEao z#orfjWXYN?TOi4QK1%se-=~PeE1Q;k%?)o^s=+c}!oH?&O4fgdr6q^vPq@4Fd}fH< zrU^+FH$5yqgjlTTb6)VbZp!+g-S15#d~FVe-F+&~5VlS+_xls3s`P!E^)}V^nup7k zE>hk1=;FZx>#i0a?_Zyr?mKnHnPZ1etTTO_cfZv=?r%_8+>J*OQ%}7r`+EH{Q`|W< zZ_hGo&cf|NBCShOG~^aE*>u?#+}Np?-eX#o`8s;?yVp4xnUf43hM!aiw#-;000McNliru z)d&g&6*?xEant|+03CEiSad^gZEa<4bO1wgWnpw>WFU8GbZ8({Xk{QrNlj4iWF>9@ z03ZNKL_t(|+N`|Ujx0%%C3cR8s+oI4+%0cr)-u&K4+J?c1AaOIf&f9ja0MR+9B`UM z52v@PLUmPE=3OGf-OW^07CxxO&Fre-TRR*U_rl$6Q58LM1b`$U1dwDhg76smay<kH;C_xZ1KLRjsWIpb3Q%nGvo`kvQ9N|nx0uWL}jM90SQ(|aZ-RKLt-4WPvnd39^)fQ(ld`QfWZm?0Zk}V zlS&YX?f_Cq5@ZnbM3P|4rv(xa9EK2?0sx_zj5w?)Y%~%&N5&7!A(@V8Z$Tg>i8JD>?1j!dr_3kNoSidlEpvEuVhx9C_ReviDvDqy`vFM>>mu#L$d+GoG25 zfghnckw3NUgm{jmXvQ=zM+(54V+;n9Ak^{V2I9aDk^&-v^XVA@%z2K?dBd5W5pzm1 z6G2JD#GK%~jU)m;`k2;xrXQdK=OqdlzHm`5{O6~ALYTT2qF=2c=e=DV<8C&gCsJMq&PulVp?QmGE?SCL`G)v zr$=NQS0pFAQbhd4Z%`DG_~Huy+MF^ZgDE*p{-WKCO1|7FFwxZklq!@kvoNPKg@{1Hg@C|ZGm48KNCpwkkj(VVU{Z*Z1mNKjc=4d~ zseO96eBm5mY zGKCTDJ`ygf7zaT-_}7eo_+ldfND)02n=o;}$_vS4CXgTxvP+QzSze$=L@1mmio@;# zAcRRmgJ5Qcxx2rxyotj_B9cmGQow{Iz|5ErDhW=wf=Pa{pdXLZM(01M(?lhOg#v~< zke-eRV@zBO3CXlCF#^9tDLmYdNQP>WND%=n0rwFB4@XLR5RwQ&GE!KGC|Z~)0%vAM z1k*EmQ>Mjy0Z^q( zo)m}|bCCoFCiDo95t$jJkeq?xyw#te7&K(gyT6R9APK8Q7#U#!0g=i?G9e|E5J?ec z!krc#F}dWyfF|CNdQ1i|L7E805hlD~699NlevZtcB}4-%Qm9ZCJ)m9y%s5^o7!F3z z)Ao*tFwaa405Z=nDPQ<|8yGM4zj6^^O73p}-*3J7ozAws6s5ap+|cLcgGuJNZVB@i+FwvZ}N z5mllXJ|Y0ObYy0Q{xhlQ#nZaw1e6r2Rw+@nP`zsLL^?c>4$n-FBz#yBOh8yf zrD)YcMNXN?En_eT;ld;{8S_Gxfuw3xUCA2eW4LbvqZgwv69~eU5IPUSz{tsJCf8%) zc4 zqKR;XA%{f7*xhVc9}%GmQqqHwKhE`w)`No;#S3TuLXSK%*L5WsT4N!iibzDj!+HyI z_u=j&wMZ#NRbPSzcXu0U;Rq(3Wr$j82~`yVFp&Zf^K?gKBm<-)8E)Z7o4}#UQdFx< z?8_IaCn78|EZhK_x}Zmd1mYM0wBq0J8N+pXz!JITg{ygB4=@=}+ zJV)ek+s()5d$X;(nIx2jBB)9!P>C=L4@N1)Z!OIkNe~pMP$fC7AR(ZL)}o@6pFq#? zHxHDWdNBx+suOyq=64{MPWe(JCSxH3Q7t~sbadYxC$~ey?b=z09^@6g6uX%qMpuouU?hYc{sP;Z`a=U zHZC{sqXv`$p=aizsX~=07^Vk3!r>V|@l5`L87U%}p2?p|k||^@R8c+h06+aXnWTz9 zpi_m+q$AxuN2d?Mmcm6v3j=KXxb0&YM7>r>p@Mrj$r=8}G&}e37Z#KJ;z%YFIXLgZ zw)sWJNpTTKQ5H>3^z)1;4kcNF3zk#JnF7&T5s(xHU_eLq^zQE7o9|;-?_sVW6X}!L z$+499#fXrM)DR63nK9$Uqs)w+5UTpRCRb7_ZnwWbP6At}go=NN7y zBQnLbHr9y3QYZqXWJV_4-KKB=q0D$OFj3MY;XsIpE?H~QDyl*SXSOJ{o0$PF(S$A@ z44Y4tDnh0e7ZE85O$Z(C8JR%|5on=S(LCZjC>cmb`Af-W(iVE;@Em#h{OJ4Ww{6_I z_aP}olqx8Sq9WoMBOJoA)VOXr44yM6pPn$uoMM}bsA?@*CUp@Us>|V&n3*0^Pd}s? zeMt}qAvk`nDtbVVoBIe6kwPwIh6ZDdv5&UhMl*L85uHD*WlCZRnL$}*4!4M~>Ernm zV|l?Kc^RA{d5D#okfOC{tyGx-#SHOcgu7=1JcPA~N~xuk>G>@X5#4+$E2M~s)>728 zQ1!@`U@}}cGk3S%#|tY>)l!Oo7Bp8*N{S(}{9g8Fd?Rx%JDX_YtaVUE@?;L~5@-m9Pji zbIWiKhpJ9Q$xQb!Gw;LQU+(&FDl?#&I!-B4*D4iMc#L6|=Cz9ksF0O$zwklSBu=8> z%nwC}-K=ljwlUnUZNK$4S_^X~lnl!>=TEX^IAkm&gEgc~1gTPHw4MNNv6ED-?PRA@ zXf0uG1N(C`b8CH!fy4IKQfw(JDVcQ3F~%4kfn;A!&Kk9_R;cP!h&^(Q5d^7HRK!6> zL^`5HdU#l-t7=(vSwa@A6_lA^WG38T#&CEGSh{(dPvuQPVXBfUQbnss!6cHIE}ASX z6?L7#yC{>O7GeHG>p24Q$TVk)K>Oad=S%Ek|8%)LKE-XMIUGunqN!p`k8mVaWU0$( z^~()yz~e{g5eBD)l0~H!U20LKK){^PGnM`+6q+B%#VONEl0jfTUeUTNT8pTvN_g0? zhzUI^ON9`TV~l>=wp$y$yStgGl(JN*MO8t@p$84mFtZUp*U3+#1LjYNPlCX?zQ}$; zs%kA|S*JB0&@;?EVwk&Ua$U})lv-m{7m*BDxO-l%*OwHfh)5|*DUF5qr*ldcmSDiq zy?gf&-$`qZAU*=?1&)GDejkki6iboB{6;qH4k!{xapgo%I?5eOmzz7!2iSsnsP(IPbq z&i5-SRTYwsoN??-0;=j#yw*}grgRu7Pq$`fY*)1{N)%rWu5rG$>*KXQJ@u_;DeGw+ z%hFV9t<@vK(#*_ka`On(T4w+}CDq>hXx%I@G96!Lwv)vjyw|Lyz-bdT^G@oHzScbX&=&cS-2SA9I z6LjISEM+arvPj{~she34MVHeZVvt(hJ$ionaEYF+jov$gs#@zPTB{CHGihd{+ZZDP zpr0S86-&)hQ&j=+nTLx=$x>2llqw`VBaOF@0}hXo=}@V))YVIoddlfgAcU!8RxL%d%v59OBGiD(%zcGGgg{a?`Oh<4l8BtjUcv+B+3fn^ z>H6vU`ti|jJ%@=yDOwAP8p9(k16pLQ^?b_96>ZQD6)J^6#H`FwVJ%WiSr#oaW#k!L z9i=syjKFYsFsH!GmopGbmZD3k>spp7rKqaA*%&rVNG)Z3b??YD-}ilczFe=j{kEAI zfMq$=WszErM2L`N?>k8gZ=-iNdI6I zmczSs_cUeEDn)9MEZISCZr8r=;W#h#;eqGnm%sca-hK1iNBs4F{QKX3_i==t?(W~8 zPY?F|`2C0d@n(BFmxbik`um@Ki)HBDX)zUX0PfyyTfh13>cg2f9Io^fFg+Mm$s&c) z-K-6W+^u)Z{qlUf*1Njiou%k78`fr(%^2f!UhYrlWhv{j6wxrhwe7Zz4BJ2bfbDaA zbJFEa_H?-I@$~8W`%hcQS{H5|i`ufRBrV|G_kC~M?w*BGq?}H7OQ}_0X4bv;zF+rk z+iBIi%}T0CWY@d(;o+h6?R;L(A*FXpI;^#=-CFKwttISquP4_%x3_Z7a-Zhbhi${Q zvES_WczybG*)GH5lmnx6>)pDCIfG0TIcjzeJ#i)^3SIhoSMOfkJv`j;ELsI{&)nLc zgo^bB?-cdkt?l;saUVU#K647z)76MDko@4tTSu%+bP{VD}xG|Ldx zZNHYa+}+{)u!Ku+^uCXs*v~Pz@7CI|j8b$xFUwknZ*?uF)14FzM|X42Otj~&A{vtB z=q8axv?xzi>q+yZGGOAN0K#Apt0%5^6%f!xG?l7!3sIIoQ~nfiAR~R)*xR`6`_pCn z{Jed99@ib+5L~FW)}F(WBQX#mDyL<+yD!_uVd5c45lJGL1_bFUT&gU!EcFn5dKVE{v~0H&MufGoU2nI`w(q-*XxmoT zbzRS8sgal*Cz+AGd$$ozPtjzw;ce`IR29|Abb(eOf;sG=tW~s>qDxh&RNtQm067%P z#7H+wk0~tF^Ie=79ktd{0kE~P?QPrpzW06fJmN}K)mrPT*Y_-PUR;-|V6)L~ed~64 zeClrAhh-=zwG@g<0D|LWiT`chu~hyUw0|M0s%>@MercVK<$ zPVes@_~E-xj~^cCajr`#r8l!wIj!~KZoM0*ibyl-*LJ&(+cn+j);+t-Vl-GFgjp6X zQqA4QNXU6@%UxaXrS9dlcPSj-F(t-afxwJlYty zypvaye16&9G%yTwLSK2Z~JhMOez#9=M}SZHX_DwGfQ)ax8@?KbzM)X zrTUbfn8{ey?55qhtYO)$?_+0fC7brnZP3hED$Lc?iQB8AR;A&krF8b z1za+Vu(O}ei{FJV0`-6gGdXlc1ccBd^2$;&6e`G{23#|eI8>KmW9zo}{dx0dc5AVB zzqQ;=f-Wj0+`DCjFaTHak#QR(vvgAr0cRboXFAe^CW58PQlwTD3X*^;2J6EmYwrG8Ie}AfL474MkxQ_MQPIta6OIe)c*2Zny_dfQ0-@DDyUQbTNXTP#dw0(bme*XUV zzrD}vSMTrR7A_4-HtUzqPft(#1FSc6l+h|*Ve!gCwp8M8?JlFHGtm7`0 zWvNob(%NX-e!XtDOB-AGfJe--1}c_QyI!^wMwmxCU!f&3$G%;*-F~?Etw;KP-sH`& zH*MK>Ti3R(t9$m%pPudWr|t3cc6r`>^JTL#A{{;~heh`o77>g*QnN3W%2Fyz@`QR< zeZZZg4Xqjyk@JUTxopb}m@xDA#7=ouND zn%!i*uvE`A%Yw2bG$TFkPBC7|vTD*s3}{fJ+=ZDOB3lhBqBT-M6+!+8Jq!}e^cg~X zH*3T9?%RBi*amjXVA4%YXRX(SDwQy#5|JDR&z#*9vrZp5u_H&I8;hw>GiWi}AyNb? zl2CUsS5JwYT8{%0xtz?Uavidpu7gFAFdt^!d{kAbQv5^}W$|HSAHDa{%!Y@j^=R4I z!jXOW7{jtXw-1)1jsEfZ@lW4>|MB?|w&_%=oh?=luEizV5HUAJZydmDYk%z$_VsVqL)C`)O} zSWe@o&~v-AZev2vOtA|n=&^q;i+tSs@1LLf?)}fd`Sm52fA=^4`1?I*!Q(9s}iHNzTLLx$J^%* z_vgqxZ0zL>8SD3-zkm8{pC8+&r!ev5%%$75tmhGJ8|^xto}MpH*WQ{!_Tp<9Fgevz z)tZ*0S=;u@<+eTVy&WmZl%$AOg)q|}A0IPz3{n1T7X1MIqEJ zbpe^i?E8SoP_#~J5QS8yQtxiNUH7(aErw^3DM+a=2{m^Q>+T*AfDvA*Ad6Gi)5GcE zwP@YVQ^HbMfx;e$K9m6pK7UG<_dLWfA zoh}|3=0awuxg1sT#4OeVl1QOPh6mMy%n0#7rjsFriXg+Yn9~!H!dcOSUMPw=U?dv!1Uw{2qzxXfiPjBzW2UBC$m^T^!VI-nM?*_I>nWpw0#~AVUh5wT?crvbR*QyY+3~dfTsU23#Zj zrMwWx&h+U0^VY8&Ro0uFp04)Y<#zY>D=e#&WvRJT{_^$dtHu2B<3IkV|M$B;{7DlP zi?zPphSZu%@tZCqmY#fpo_4uiue-H0^D%m42M5I|283BJRfTG1?o`#g(awHXOzW-G zyG@r8MEAb?FzdByvo^-qmU=C<5Vp5=d)_~P$o*Lg$K{gCxZ^8~=kNdc`;Qm-_|ZOG zXvLO}TH9$Ur*i5y@4Ii8>wep<4@v3tjm=w}mvfN{hjr_F+b-MfwvT?)pruetsiJ7M zo7oRfW~anybgJ~$9-lsc`1JgIZ7>V^(3MMhD0q3sp)H0|Ay4O~75daJU2|vPuY%D#JA;AqmnJxDzf6NN_IZ zh!DeHK#zI2+b}naVQ`0qL`p!xSqv1J;;9+42~+@PL?&f+xI`Sq;2#{XVJ<}5-LYZ<@SidwCje(#FL(+XTYpr>=Z~&6- z-68@OK0L-41N*IAfA{;}{QYl#ducb(V)VTYZ_jmE-3@`Fa?&MYeE0qK-FF|JZ+QRi zm%sQ0UcY`@2s(!EZKMVR&=5%?k&zifrXmL&-iC%&PwKGPTf5!%Zf*h5LS`fZXHjHQ z=`BhfNScqf_hEhXaQD$?856*?0N_>lblZ0+uiyW|@8A9K)RW`HNZh8CLzxkWT$LCk)yZzRzkD-y$<$R7Johkt-B{IXZZF}1`x6BClk?0gh z41^^t;T{^~Fz?+6i7?AnY?WSX>#}MV@$}|qF-m8*G4?TYAVm7!$L+Cy{O;Wv*=f#5+(w{zjckSoPH7>W}b!ohn;jQUjM!$tO?|XN*S(0L5!!3IDG8SFZ(?`Uxw)MV` zVZoyEQedr-yP35ugYKU$&!*CA9km$YC%u0Cjh;%L*Yaj9U!8ehjia?~2+r3Hf7A@g)v;g?*CP}c2Vv>6qDI8BH~pStu%HDn0?9C6Lh#X)z+jLq;SXZ>`okLR80W zftPhx&oOg1CN+nEfAb#ptEX0qyQM* zQ<@oBNeP$e&5Wtys}o$w)zWv4MsL}T6XywJL6(&NREq$bF`Hdy z<*$0Tw)^Q6S{KgbRm9PehAOB6Wm1mTKmN07W=k+%K8;!07mO675F&&!6rKpA60#IG z52hczH%FJ7VV--2S+m1-mIcm6LpMq<`tzFyWt-hK5eAl7cbe%(OCkm_`wDFGCeEfr z?R`tth$B(%^QMj}3NjG^8y-hB5rv4^mMe_RfDdoG?SK2*fBfO{6UzxlWSm9^d&fBpabj*ov@?u(uj^38)vEtM3DR7g-}4{XFFZXpxj8J;Gh zNm^vw5p~um1Jv z=RfD&x~%2=>h$fyQoP-9e0_iSo8SD?|MWlnx3}wOND27f?csDUB4$?1JvS3ce3cB6Z@+*5ln7wRdicQ*?d3Mde9(q+5d zLeE3$+@nQO%wpJJq5kL>OLw{Tw%u;G>+`qo^q23JU;pC%mp?y${q6nveihxmy>It& zlWq9(jhDur+#_yjSDfSg3wibS_4J81gOw}^l&{oxf2Z0 z@M2QLrvHFiQbeerOhz6SG0H#=su}ulTw~-zX%PsY{p6W$U)qyxWZyY%CEFr6QBT6l z?P}XCX-ZJhdmAnb&$J-i+(c7`1ToxUUc_9?78emLrBoq%iI#pt8e;$ze(#ZnHH5_> zQm85{5rHa^NfoDzh+y6^7Nw++C?x3$2;?Y^n=MVrSyxm3ypJM|l2yD&G(5r`fDCd- zdL)pupKMCVMz|0OFb(NEnjc=Of+GOO^qvf4q=#}(H^P{4L}qm4AWV`+hH}CQo$wd* z2~KY1<~cR&m$sd#Ojue(PVJgiwL-YHK09lNk2W?GL>b?G`2LgiE5iU1%2@@DLazle z+AR2IiEDd`u=TZk^NYLh|M1)R!{h0Muil*L%k4Vu-+rSxJK*WT$P6h&hAQ0V{W*|k zNdzQS3c#YXGb)iRl9A>X!$brUncjzu(R%M5L&_|$1eoq_5t0beZO`)X(69U3S6{t- z|IOF$zHW(czk1ik?bknlXSXNaw{O3B`={Uj?*I6o|CbMc`eV{%DF$jO+qiY>=hLFd zeZPeXO4VgiJ&k~ShLcIr;>-?%dacQD?Je35xfvzjEz8$$%XXLFfBNvpPkWSK>HRmQ zJeb?9hndM)mlN7{SrWN#YQC1mw$``)mZl-^YJC;Y@9V=a-kpE{r|4S!gj>~qNW#ORVnl;iF5-+nLc8- zW_epEL-m57mL932V;|xfqP?n9wtf5R?i9C2ZjZlwU*DYVdi&$J#rTjvd;QDu>g}cL z_a81;Ua#kSsms(RSoU5b6$KK$nT^rts(UcdhOm!I0> zbAO|+eg*KlkaHEa%qUCN5IksjOn+&J>RY$ueXHMX(r0AwJ2?j@2y3OHMcLTYjM(VBVpnH8*17KhJXP7gPDB3Y^kB%}GwbAR<9 zzx?*${Wo_{V?X7^+Vkc6?W>377r%I~`}ME?{lEJU|Nj5{;~#$i@YPp^u|Y1OYzb$Pc4_<4_QY`3Rw z=Q7TVpESMi+W)Xh@T5QJd60R_&Wu&{9MTktr zQgm(=B7%_F%#n<_7XT%Q6flsG0ZHNJh{)oo1D@iD{{C+Ldfi_8?JXZwcEiF&C7jWU zg$|D%VnILNGOP}uOW9RAX}t3E>tFwupMJOPdvo}u|DbWVXBMuP&1N5>YA%uqXLKS+ zos^hC6)D0ZRkgJJQVL6{Sp>r7)({N=5A#?oB{&;M%rR&X-?yjN81Ej+`_fDQc6(~N*ur`WoIIp|zJ8Zc2&EP*C6|JQWcGbqM5Uexbx({=yGUFXdA{`To<4q8 zmQf#mwctE#6PCG&O(2Ci=(8QcHPu}uB2tl^Wq~-Mj3knp0tjalmlSH5L4W>557+G9 zjEs!P^kY#mNGBb1U;qOdFJ%h{MrBIQ9YkKv^RhR|KYQoVJb1~Oy2IRw=V)D;{S7Z% z1~0tpFOe$+$DV6xiIhabEe*#$BXg&OnX{XOJ7%+DM0nWkc6|zqvmtuU z7Rh|!ae3_W5HDNcMS58H_4(qNkrrW*o;d=Zh^^gft;>_kF)yH%HlqZ$rArNYuHh03yv?P{5bY zC`rk=OAY9A9}iHWbDtH-gdkCR&<7gmmSQOpp|}d3-hch8H*Z3um&MB(uKm2;@3xD% zd%!c?(`I{9z#}bv{C|ACS&U`bb*8t5z0Yu`m@^{BnyXl36=#YpkyKNnB#LUymRs#^ z8!*~{9}F01Kl#akpZwe~;Dfl*Fkxk0OgzIaJOW!;L$fVeh@x z^20tit0)jIT%Zz2L?Yrw#6D}U|Np-qF@h=zI01|#!G-(%Js=%zO}f~Dwb6Sp;PHrz z3E4Yhr$}JRs!&v=8jC^HC>AXl8W4y_7+19)J1kvtYR-tjA@zM{lJ^Fv0LdDTRx zYL+_%JTWP23$YDtpOzt{!@W~%yVwLJ!nT&wG%HJPR&S#^L?~XiRW*vKM`T45V0s%6 z3o-!*H@VNZpp$QrPxCyKDLP4QygdmjnnD-*6eLC!jSAxHDr#IetCSJ|6;(MIjmxS& zK7PY_(%3z``}gYBqnTB+nbMNWZ4RTe_31ZX{nBUt;xF#pxl@%DP*J$4nnxp%JfMk) z8EKM^9AL#*P{AY=1*2$B?2$P?uh1blkD}np6v8^H%VeXZ&1zj%ZtRN5PE{4+*K{hO zNtU|6o;;h13UZ$JQc9N6xU44QYE-5&$@Zk4Oh%_?$LlsIa+9=;77a9$OHA0zTY{uO zJ~Pq~Y=eu-#3d0Jz(U{%K*-S0j8nqiAOfUl6qAAq;i~ri{;r=+16a#0u~SC%4*HOH zZU!PCkj;Uhh-xSZQB_C<)ldK<%H7qShw1*si-!kScGm0lYSnhHoC_rOMLnsDs%prRA$84}r_#BKsX)sUgrF1^R-|eclvyB|Ce>b{ znHILaGd`Wi2lsFKdUv{4p{OF6BQ@3yMhcM#KmaIP@E8+NAoFO9=oouab{ZK1L*dLb zq9-gAohpiZdx~NhU*7in|C3&M^FqnF$E?K1uT1(HH2C2J!OT3$Lk*f`a9KzE)_u;v zZOE=Td>~4OU;++G{g0nq8GeRlU|D20BQw}gaDf0Q|5+7~86X0oDFc9*h7`O0Ji^1O zz_P59`OtHSYTywH1DaH`ltLGl0L|8%MQrPZK2P^EqMyGK5_L z7&0C(-~M1gpwI@~idhMi%ySA1P`O-nw8ddwgZ`NJYwTt7m zY2$cRGp$$4pzU~8J$1DArk8C?t<+SfsYlv<# z;o8M|f_1@u-QRD|&m-ul@^u{z1Oa8xJ5ALiOiEXPj0@VD)Sg}2r8a_M*$H+6!j6oY znGrH}ML-B0nC9mSfB}Pw0GgtZ;77ZkrMTuysk_#PT zV9MdogrIqksQD*K1`>xeHkIKiifq8is0BHP^WumuzH9I5QwQ_8KRtnXzYS;2x>=Le zPAf0o0hi=FJ92D_0;$KgOHIHYP>O=9!tGtUT#$+NeH;7a!GH?}@R%Ygqk2UWqNoa{ ztX&aKj!L*%(zHEaEFRSsDTLMh)LlKClsGE=)N@50gf?~>qnKPVuDVxHBtvNB;Ewt>ZU;SQevVLV~5*6t&712t)w14Ze%O z5i*Kl$gv4F$Ebuv*di2UfxxpW5s+oQ-2GT~bWp)9U$tZtVn~PyFd`(tgeZW9Y~U0( zps$P%1r^Y&Ydr=jYjy)=q0u2ZVn$|EhZ$;Ppr|Svx(aSKI|3k^Ez)M|gQ$j-S&l#( zM$6+x3K1!>X2Tg(K%h0W??~AI3=FzCAu_ObCD$=J_FTvEDH*hA( zSv^o86$gp6-CbI#Hegp$^m4yI$@cnZ!Z!$=H;V@;97M8E{{ZY=}kNK6N%1Js;?6Lh`l zTIIMqDGz4TD2MvXwMy!pV!XGt zHSw38+>R|QPh&{2PwK3)q#%(7wu%$rNT39!iJ=|I>Zq#ra1E=6#ro8ku1a}xN7amalt3;J8YR^Q>S>wI`&F|$<-N+? z)i8f}YqGt&J)Q_wXwfV&2$~ye7Kjirf*B!Trm_7AjEGbMlmHIE1C%%n&_9XI zoFT-RdHTbOCv8rjgpeR_e8`lH2vi3YB*1B20*MKSVa-hfkSmT5CF z^+EawT`wVFCRroqvu|KB+hcqV(&J0oKqs`v&{AS&%mAEq?m?mhRy7&+QQ43vDKk|8 zFCHCTymC=2-FtNW@c5)_dH`zLGagMp_`di5{3n0*U}yTB?|k)3U-;auJGV?BUy-t< zB&8%0!GVaNNp^6&#pnb!L^B$;=UK-SL&~m82@+H#sYH!2#okPuNv@F)Fp<;;RaHxM zU9X$={^@a_BC2swjz**Lcvrhg==xDpMv1S#_TZ2H-DkFTzWV6oWWHEBUmjg}^3uf@ z%3^YSy1037HJXfxQs4JovktK{GdDPWVS8u0z=^ZIPwOV02kbm^Rk*Z_IMDCW$N`c9 z8L}Vh_s6c|MhKYaxK~&yq@4y5o!P)_v z4r10jZ7Xc99vqaoW=utifC;%MypIEx6D$cNv1F3Wa>Gh8m27E40}h63gLMjzRu8tH zo$(|*YHucMXM5wlZQj+wZMUhTu!8ln@6Niu4N-uBV*ppX$&Rac>(PPVy|i_3xVN*l zCoL`?rLgE44FVGcQ&EYDO$<1hM$(wc-WJ)qDfhb!>PJY z4r+h?@bv!u8?v**R8Gr_4lIEI8V?jLKm=7Bm^O$JPzi)I5(qg&ZjnnPuT&Tos`)vB z^fq75;28nTcLOC0VGu!c+ON+Tc7&$ul?3<|Hfi<_HX`=Klr0R{(k@fM`kH~>X$z8 z8^8LSFTd-hy`8Q1z3+XFi`ReecU9vC0&e*o(*cZ}(DKb7w@v`586jr--=^hem<2Z+ zy`(8wN+wZ5)YzL;TU(tb0juls@M!O;r=EQB=_mI0_a~Eyh^*V@!Gi~Hym8|PKls7x z*KgdqbNBMzlirVyuIwVoox8Vg-8vqfHBsVdG^wYvuvjO7%NMUb`|^eHbmxgDuGS+j z8bavS>*dMG$(=j*Zr{Fpa&mIESdGS`vYfG$vXZWkiGD>QHdNoOa-%y>&iI}eM*7~ z)Cu)s0o2euiP3QLCJ@Z;-tbJ3Y-WJ`gd$NBGBkcm8Z{CCO_(W$XbP&ySzl9oVd@;L z!OVFyWCSL5DMXaaKQ&0ElGPT?yfI9ON&p;@d!x1Lijr{H+N-K5oSz;CU5?8=VDP?t z@!Ca;6dG!lp*inE8#F1a8~JfPsp~yYGfj1GJ|Z>Q*tO-Ra~Bw}T;6Vv|+J5?AX*)2)KVHgz_e)U%l@ z>Iz}qrPRk&)F0mXa&__QesQtH5yqbSRjtj``YnjoHXdv?Dn*Zv&+g;mL0xQ*CnBJX z`8uJ7Jaor^0WmvDNC=h?jX?;3n9&7v9dK!s)S|gUMRSz>A5J|3%rvX%WX#6Sn9VtJ zV#!QV1x)iJK5ujFv5ChrTI(%{Jpd3f6;(0Woi60;8{hi&nm@iYsZPat#eeo+0>+o#``)en-7mlTm4|fP&eO9mKKDDn^ErrdmhE!cbU{Z<$($O-s1YE#(#E55-V2%l zkpe;v6p$f8Q?>x9pgx4-#n4dpzMI29y^ZxeU(QYqu zS9V;Ne!JR(@&G1mj)^=JHPosx`Zg9_%gau>m@KB6imm&n4<4KZkR4XT5DNxR9#n{! z@{_Vib)dq#3YG$)=CSvcaaqUL*r+@jGo<=Xd>*Kro zhxMqwb@L6g{%n4J_wE~i__@D+;o9|2e&A#K7k2%+Zk8=Jq3@FR>1~n`y!C(E^yTC` zX5M<`6Gw*w=y5TLAxP$wZ$PNI+3piR`^g`^{>JbAFaP5QKKSx~@Y}!g$$#{T-~avp z-8;CryZeuS{^#F#{pLUa=l{u-E7unD`6oX4i3>+Z@Xfb_;`MRhHpXZ~#*o=@o8ARQ zb~$B|Eejx`YD%!RyM5!<&HbZ;<$85?esXZ>!tv_7)&A!`^>gok<%92i_jA64wgFTa zjQ}0Q2+l+4!Fpf^hnL_}pMK9rUU|=#zi{tc-}u2-Uj5?DTd!Te*X|w6o`2@at503| zsgHbkYj1b|Xm7d=O3(%9B8WiKWNaIg87sTOmt1KnAN%B|uRigb{`kBclLkN3;VlFo%*z z3>DRetO}}`X5oMoN!0?o;NV=+JoMw8ks~Dyg1wR&_sOjibv9z*9;hSo0N#)QiLF2w zp^4I3TqD?sL;*sjHmtkQcQN?{WC%zZtE{R-xM@l-f@sj2NnMvkEFuIWOe~Ewt&OXq zMDzFV-@JC|(ge4_G^BJqKb{@#9qsQt-LLK~*1TR7R3N#sDlbf($*EU8?E7o0;u*4S z!y@)}Qx=S&p_w-?{O% z>kl66?jF8&{d@KO8wUp$?%uo2>>Tlh!>7dX%isIXV!eLl<@Y{$c&#qSyslv0sCF7< zXkgrYf`*$a697XXB%r}`ZMsqDEPr~axtc&SrF>w(A`=p`gKvNHtDpJHKP@@@>ZgA8 zxyx6#$X&W}Wr`kF&HwcPH$ce0`+snD@BYZspZxK^d(V5{@oT^OsXza-KisH)8v?nB zs-nYzwMc{jI3!+KRR>_XDWVPK7)clFB^Ca>S*>EXd-+J1I*lLwxljDur+@b7>TGu# znjQebmB0*r9P~OOV1urME`W1T&)}DS?c)1i20g50001BWNklJG?07?i*jvN-HLqDQ-%yxs)`qhpd92{OgUp`zn zD@W|ekO={t2@n#Jk|i@?QwNr8so+$m$b}!xyN&|}hyhnzRuuZDuU-4pM?VrGeCJ0u zN0P4WZDYqL>yuK%OH{=K+$UIdF)8`ch!)+lS!(6cB5>fMaLjC)jG`sWj1fr+Kx$+| z#nYfT0A#06eh4apN)Yf74Y?9YDTJ-6JlYwLTq-FtDKmm|fL=|^5~i$f7>Eu{2ALW! zV1Nj&6N?4+j1O1MantTRcOg?m028n!FIz&`r1t-?2s=zW@8?jSG zgF;ehmfS2uY>^@r=#Ust2e>)_U}8jvN)!+TP`pG+y?gig{CInN_wvOnZFeID(ZYI(bv=r8IkJY5K0)>_(dXJY z5fYWPgC*ka*x&8f_boMrPf&QSN-E4Ofhj@;rMYJKl#jY5Y z;^fuuy&6+GUz{oWvokq4y%(c8rp5Wgo&76SH5rX|-ne^j(T1(@*LOyf4?Oq&y`969 zOf94+I27jKP+zez6XB4!$Y3Vg{IqOLKsdDRC}zTWUOh3f_pW4Q5MfQncYpL}fB3)7 zPw!maPlev#uD^f%bEkK{>h!@6zV{%6v&H=W@_hbQx7%aDh)9&+T}2=OepAtjI9&8L zwZtTbNkNh%1)VP!dxsZpKe{{H-}U4AcrpJ+Kl_Q_`0ZalxCry5y?L)2kL&3S03amD z=V~8-7`%s~fDoXMUaM z3I@RlzFDhd_w+N*-Me$+-u)ju_sstD&prK>SO0o%RwV>)LI{B52B!p?M z8kpI!D-7+pX{wMek4DS+@<-qO?%wW&pMT}U>s9PmT{Il2s-&62+A+jFrK+B8)zx0Q zd)_5=T#)0oYk0DSE*eGU2);ld6I977`~;wus}_MA4biEb8a6;MHQLnB4~F#@6hi9oh! z3n6$CqGYVbbhd8$-SP2ixm>q>=`TL_?ns)l-hH5LO0j1x38qtWQ?Uht2w2 zuxC~*i*h^~O?pCOQ&P%<3!xDpT78L$ zoa4f~vUHWY-dr$_Kms5M72|-@9})yP-I)tx2VY_Kl6zN<%9GXo^ERkSQO)|kLr_;t z5LGm_-FdYhS7o)eHMw#9M$;`OlfAoq*7n_ReEhen=_p1;0aL-;Nj)r+9`}y|D80o7 zvdvkux#|qoL}Y~At3yCU-W5f0`rz!DE6=mS%^$w8e7FA0E6@GnPk(fN_8>+3;kW;X zOS|_ffEvN+{Mjp)zy6i4M35-=W*UJxh`Jo;@7qOXwCQU)YczZHm z&A0dWCVSi0@7{jlrFZ`7fB4H=2M`463ah&I1@r+zh~&7cs6c2U^dSK{=YSoI7|4Se zgaj!<$V+%<$e6=!vT1Ckyp>PMfASL^afz1J63(hZ zy4ZPQWpyZ^reMk_&cL&h2rGCtb(r#~=gVp@^wu=Xok$?z{+oC1-@I|*!lf%avnxAW z$MZ!$Kf!)AbFQ+~Ef&i{P8Mx#3DCy`XXlHiY08QNMuU)~>4iK=BFK;_$W95(BwZVX zbU<>fn~va|Rn7&$xmZAxB05zi)Pt>htHzO+f&;Td&)`uAG^vQ>D*;3^$>DHN!7K|z zQ$y+vgV7?zbULfkcuCA~+PRXMOB#M-KuLxx#ZvKe~Ch zO9k0kS&bKGw_|LIa%3ib-y&e){kmP1*#y|e0|LE3hube#m>PJ2>d*;%7 zQmyHlJ$iV$x4-?a=bk+~d;JI3;XnT`{?jL}xLlxs?+4CTN& zsHr?IqRV)hs4=9dmJ-44?)ICH9$dV3<+uOYKb`GEr=USE>=FPp0s6i#E6+@Q2i)nn$lb^Vt_$okd#cxp@~-!6A-`}%d*~S z&-;^k>!(yZe(>g-e|!EHX8~MnE3mjcuTi!~p85_#m@oA6U;5e(Pe$det|sFM<$5)n zO&&-O>Y}+W0!qx~oC4;F^C3QTxTBh}Z32eFcLZ$HpADitpvBZPvPrB8+T9+PPDVa? zib#g+j8qY#M%743KxAX{gh9Uq2B4IZVX0u9%DnI9p&K3T6tjA5$B7erRstdii0qiD zU_wUcfeKR(z-DCF8!D5TQxF8tFg6)MsKdEfTR0stRA^)(#+g@-glrlS1CkIVLj$I$ z<+Dy%a!Y$)CCSC6Pm2IsLqGrirl$1w$EBlNB+>M4~~r^(lzox@z& zwyAF!dg*bKYRHCtMj&(!oCjA@QBYA(QL^*EF86o;_|zi<#X4_$GOXOWvhbDqpsrUg zgn|$YpboW;CL0jpaAv{d$pirzUEvIEzB&=@XWLgpw_2^woU7(%cLA{LR&_l=q>^Hd z^MCd;*S`4r{7c_|kW%l8;=%cY$=+5mF8el0GRUp%ZxuUkPPkkQie@?I1)Fl{LEyI` z`eSCWsfaT}ZvXnTfBwDiKK=2J?OAx{-Om@+-{5$5>2UYj{%abu3KuN(2V&8bCsvrf3>u$L`uj{%j>%uWJR|>g{RV1;gMhPhad33%k zyz{Rn!4x zR@OTs!cJ#fHPl5xKCGgoW?D|Rwzj6-8oLLelD(^lmMlUdb(Dod+9cp$(-&zM?Y3RbwSmk*EDuif3A?XEeTs7_124Ch!lGLAqG76`kk7jjU0LuCD#!r9f>U@3o(*D`6eCpzV|F7>w0K<)fm6;(RQ9`cf zG6R4#q*5sV>?&qVFPfr8gJg7Y<&vLHAKba|?w@+!yWaiWat-welEAozE|`J%suq#? zq9KR%cv6jLs@k+6h8CSKiXugA+SO!K5`h_sXy`=LlCm0O4$vo%0I?Sfnhj7%Eukc} zsF)NJQ0CT>bxxb-U$}a(SHAwEFKTKo9UZN@wOAzPXk^()2C6I~NRAw!0eE%}NQ>O$ zZk|ZXLfoi{&Ad~vZq`fa`(-#_z z++X@C^?kcoaa}@oGdnV&Y*{BlG0~ig%Qt(42!N<1T0&LO+yS3`rUn39GFOJlLo=b} zL2VZ%Q2Rjm*3OOrRTLATASb4zQ3?|lOQr&rNCnNQf)We)-ndCoEKRp+^V&CkL4Z6I zEF&P3e@pQ|HX{X5WJQWb3aG|O5+#&~(pul-4!@z+B&mX_h%q5;qR&YcP=+>f!X~wi zpV8j*!n03|FI|Kf=V$9K(1YXUd!K*tnNR*apsp7u)9u}m8ZL`^JbJV`FJ?PRT9f)w zeY=_WQ2<>eT9TflEKF9G8twa(H>!nFjcz>IIyyMKR_t9gH$g6P-kyQ-dKq%AiOi6Y zHhHW}bEe$;h@M^Hx$s;#^lXleQ2FhYLIqKf&GZ7fb{O+@j(B+C@c!l`1#VKDuz3pE zrb#ppBSgfWqxQ@7nQCm?^X=VBO|!0;Vhnz|>x=RF{PzA%_py(>=a)bE(W{q^{{HT~ zEQ;~Ce&-99w|8duPfpF{*bc#u6?YHIrEKOYxh zQdCt#Ky@TBNeV(~-M1kLxRU(TqV|1nVF|H)>e|*;-M7o*vq$%CzVYViY23YV6p#!E z&=LXx0TH5SGBvHKtn+!UDg?q3QxJ!DPv%G4J59g3c{cYKcKZ3sX?uBptFCqAR^`My z3d~&Ab+=wDzk4e@xVbgiV{Dzb6k9J+0z~kNl)<75NP=Dwk{OW>S`z_K+;qK;iZU70 zWzntIqfybW)@A9sNK#!|%$Elva`QJQ@xeRxjwWziW6&7Nt+B6a1%}AZI7V#GI^Q67 zg~Sm8A_Ubnga-Op^0ZT2w$}1!rFg#Xws-31pFMgozg5@Hc|bEJCIC;2pv)ct2G=bz zQz=Nw7*ZpeauIftP?)I2^Tp!$^voBBp3xw=qGohvBE5M@o}ID}q)oEacHm-(T{(un z?kS}GXD@#C?>^Vc`j`I6ul&_l|5hiLU;OB&VA+8S>t^A~s+^6N^w2z+)0oc2rS6XW z^|RBx?Snggw?;YbmOW_iXdc=QNS$AcK{;MEP>g0*pMKZD<>%aJmtm`{_RDe`&|3mz z=g|X@2}DzHtc=KLglq~lNLG%D(s5n*%9Cev3#P0dnNfeWn4V!2!*_=CNp zb-PLtwkLa0`#ejDFaU#TX5|T3h)qnbfW%-)h^l%WMA$w3?A6`Fozd7k4+R1dBpKe$ z{E|VF8;Cy{2K3eoK#T=UlvP2JWw3S5UZ=dW5KuK$6*DnQmXrv+N3N1kAA>|CmC=YU zUYN2q-}&|rzV*$o9v>ewRSG_aV4R4CT0~F)7?`sFK%n_M&1i~-tPvuSwA!EdJ+*Ne zu$0!bbe$!y;!T|(@vx~R20*i<+Jp6uqVvLv+6UVS--u(T4^LtmHe*WZsvy8>-$LF8<-+u2Ge*Ke|-|_r|yLbDulb!J>Ig1b^ zc7#?sD+s~JxL9eNiv$%>4$6r*s%u2spyk$uoy#wbFFu*-9ie*Ur**w!SO69@u$GyO z1PIZDSc#CpXebpn!YsY(5ab@x=?H*Byz0k~o*yHH8Dt8%CY6|9rpYu7Yu$~3VmJ^U zuV6L{KO{gTR)k0MQ{oBA-6XSSeHLTawdX_ns^Vv!xc2;&(f!xHe&^c7fAv5A`_#pl zV77G-g7(($Zy(x{MJ)St@NtwBa~K>H9|!00@%H&25Qr>?0qyNakD85N{m$yzwI+bQ z@Z5zf2YU#|4*GIbH0P)H?=N1zo~qF<7EkY8Ja}{xzV^L)NuZvN-|^fFx8Hnt@6N-f zX>Q-X{nCr?3$cr_&s68cPASJ`IfeuTZQJ&Ji|pF2i&EFs`1tsw>$(?Scwu{Y2OXyb z*^?lfqel%?Z6K&3stz7a1yI=lH;_U~3YNDLN%Qv$%up0WOhiTVT%wXpG$vC)M)IoA zbzRptq_JY#+uJHDzH{TwSHAkiZ+`omed@>4NsRGr2oTKFAu}C@YBhk|wgyIsOlaKp ztFiY*MY{)6KccF3MM>qz*JCVP^d%Q1m8Bu>zPODy`b;weBth2-c2UJqs}vmz_=Hey?QI`k-9EZp%y!X_xtO}qOngP) zGtM)2a0r-YmV;yCp@3aYIV+2t6V$LF=YVeV7di9rwxcJ*EpQOaOf6GnQjnaeja^E8 zE@(zjg50dW!F<_fmkN)0P6R~6Ohq}J%#H-o{OnF=8v7*xl;spruO0A*p56NRhu*nA zqQ%L>{V{AG%x>OaNH}EzNiZ94pPnvN2IbA(x@-YtOBvcAa3JP=G6Fs}AP&iRB8#dZ z`AY{i1U0IUmvDc%|N3o=wupfWS~)vWP3I>$eO86Er*wq$3{Cu%r$xW=rIgaa!NH3! zzWmzXU;pZtzxANK{|@O$3$-N32&9(42vpHnBqC|sw^0%yg%HV2in=;~^hgY^JaMfo zOEnAvATTrt<)cTz3CG*cB2k*Fq0 zilk^==vK`-#dbRK<4HN&F0cRSdtdsyzxwufzOh=*w{~~xx?XfER~15of?)%MYnX-+ zH>c7Nm_i^+AjmFZ+}fG$9n7{U)fjz6qeX1^xtif(f;D!W*M%HPJL<1TnKX@1vfjujT6qo`fPwFvwQWJ;KD5k!5grl9q@r5VD z$hYDAbeYZ;=Z_XAi?%;qv=5KZ)~jFyzM@ez-mfnnRXYd1-YI!9!=jk2S6!d{BWcdG zIku(k@Ya*N^E4+X>=Yf4Gx9>L=yFvV5D@_}5nIH~uLP2521{GPQfgoJi_o46g_5)+ z=KT9=na#!^fRQkj7@e6a_1!3jZGlT=txfaUKmOAeXTvnD8yc&n8isxpCR?N5tN7Q5IEQGva7` z;m+;97ZpU#XuiFj-H(0X(!cx{zqNbu>4$f(d#2y|>1V(H`kSh$s_VKM#f7A(B5K*8 zf*UA04)?80dCPxkkR1cGfzf9}YUY1flAw?tqq)pXu_|VV?|$Whzt@ zY)w4fyM50SP_aXNA=qW4r;FKp505T>_!H0m-v9mTdfDB&b?fDq-#02}umAAY@yW^S zufO*6wdYlnu`@JquQE=@9U zr_~e`vYSO!vL#RzDaAYkfecD8m|~9CX5#8l!)qA=L55C5+mzPrx@p$zq^!!>R=HZA zeEBP%{lXVNw^*KxMinzENbYwwOFCp{AUiII$Skw_Yy(-$rcEeEK3RNla!TXT(S_ZL z+{n>nT4JHzm1T*gCvWCR3rgsURRqA&*P}^E5^bgAe6@FQc<1(;DJ6_4Zw^IC0Szf2 z227TdgV_^HsG!6u3QX3cI*`tiDv87qLjfI9#ImI6-Wg2J9xcxo?R>d-^Zxzo_a2=r znpKz9Z8UXUxzp~fD%{MSTqtK($Kz+Wr|;MwU!ENHVeZFeBjp^@oI9HNYPUX3k1F4* z6Yv1ufDN4>*@pLMNO9xskEFo>0W4`o*pWtzP2aEkuxeNfhQOGZQubpJsu3kJ@gyS> zN@3j=VL3_hqUS5*JHc1K^WBqWSSKKmFZ}u66v^LTt^fUB{#67xUl~xbTDOQUh7>|_ zW#LN)2KhUvNsTZnM)JxeV7(epwX<_LJG?U5yCi-VZIq}|H@0djzU~{TnHd}an_9~D zK>~AR`EG@laZDc201{X-?KSlY+a&8`WwMd57cGns-WH@Ff-Do$(7Q1t_d_4Mrt8*S zx9<9Nh@D7OGa&TYzPJgFW*eax0s<0~FI+h;5(d#l(>z2ssYbKa@+1%KX0o?4duq3W z(7CdLV*1AG-w(*QA1#vF)yo$qb#;8Q)M%<`N`Pd5gr)%bcLNX=)Had^AekC~s9|ok zP|KK6HPw`oLNZX1m_q2frt9O`Iux_Zm!8^d)~DG1=;2wjB1#H%~jZx(B5cIA1kwf5fMaOOJ?F-Okn z%ybS;PwjTMscH(^P;Qs1gi$p$GzEod0fLu$h@v@@M!L}UzizUSU^&NuD7*IGR6b0fp1rO=V$MuZd*_nh^u;s5{rwQlQ0J1dF; zb40bwCIuiM6N3r|RR#lH+X7|7!MJH#QQh6WOx6lQRLBW904T%@uYal|ERy7iA_=#c zMk-~Mlt|&DECbHcS_kxEG{czC?trO3Vv#7MV447R8|pR&VT)ibSSLS!=biU{_LJk2 z`{U67(6nu%WNev7RZgOSG-oM*pr{&SfG`mZ(xkhTlM#u=x~*gBj5A$V2UMmUtOFB; z5Xd-71!;~(j2o_uvA25l+GFcGmyYJ`d!O9i`}pI2e?X8@g9Q`9g;>ylNp50fRY;Ez zFiAYYmRL{>Mx$&X5-^F9#84XuQA6eV?nxcr{dE7qgZX^^;P9{&P@84_-E3=RVhRK& zMkfOdp$qe{e_oxO*0)X%-+zFcx!&B~-drCvoBiYI!5Od{jmQ|IMhvJ^Fa|7ovgZ zS-CQ=dS$QL-hE?wdsu*Pq1&IrS^LS}-h21=vJ5&8&8(6(wt`+J`Q#w?>Q1Rz9f zVvNB6Czm+UGQ(OJ08A1{3WFp?y9$C3cCj1g4vld|ndiCFxVkZZ?B=yg+iT72v^qal zUmHthW(w2*ISscru0Or;{EN^ZTte&CclJAe@ALbpV3yZPUgi-Hfx)F@3z6}QyGVM{ z@-m44fKUk45E@|L5NJ@Sx^VlXI#|g3%=ZQxkH7lz`qs|Y)$6P4J9%#`ly_}xeMgzr zbv-+sO^=Vx5B6pUpWivU``PShFYk6-V={B=eAZ_9jh(AjGi?C}RuGg5z)aDK8dM}k z6&89(7MGOL0vHrq#ZCbg3h#Z>VB2gVn2HUBPf*l(s$HrKSxkl=O3VN&682v7} z8-{vy80AjaH)bpMpy-c!D~}J?AKZGd)gPS~(b>9R!jOuI>&v`3{`~&={?UXrvo1!C zAZgcv3Wz8oq9jC$PSJ`wL5q&i<+e94#Ym})fQXt|8(30GdD`&`fk6;b28p1cm?C>D zXjrzys!^;bLUBfm+_n+DP*4SdUs^L?tm`Rt)(9Yxm4$tXooDaGNAa5Yh)SqQMV)A+ z>FUV}2t=AWQx3CV9DSgLOxD);vpd$7ssU6HNmaV`ydXGPG~ezZFbFY1Vsf&g#58aLLs}kdDlTcEla5?+!Dow_w#)Kx%^xK(AW;A~sgD#E zRabSP3muXgQkKv(-5JEY_ioqC%#a4@qH3={%!=&r?9BEuAR=psNDzQIE;sa=I7J|u z+ED;NG%ToKeUP^EEZQGVUU>1vVCcH^vu)GU%hd2V|#mLbu$Q7wXeO{9H{f1Z;@(S_JbqV7MMbb#}JTylhp*CG4FxcMi|L_Ug;Q6nUO)_1%B|XK!~*=X3ws>p%YXD}Vd3 z)hkCw3k?DS1f;l(1OX%j3n*5BA%Lc!Spnq>NT48qKop5AK|l~S#1N&c>&5B$X&c%M z@jv+w{`mPPZ?12x*LD5i!F|&kXMNWNU1+wlwsmQHceFAw4uNBWwf1}EpZv+6{QLjj zKW5e_VX>G4MCbCO)BUn62ZO#*vuI-O3Tv_unx+Y5=Dhl9-YKEWv%2Xzj>TZqG4%Sw zs)NF5+aW5n9(+nTOChk411qz#3df};QXm!8WzfcQ2cya&s>q-y2@4s43>vEpA%xZk z-*#;P#=aLt>j1TC+ODg1x3}MV{r|jm>r-pVVJ0HZWg$jiSN-8&)>Vjx6q&g<9GuT) zla*0bRZ$rgM#G_RyXb>8rfb`xESnHR#KB-MYi(HOV3}s^7Pv3?r69=9F8_N zHU@(MnVh>;A{rqMp{v-(jQ#Su!Yt(02P=8e+uquJ;@+*Fefr?zyc{!;QqeV#*`BqX z$%C;em0%$t(PNeyIg_`9ytsFw+gp~xS}DiX2Y%>hT5?C`eQc=I|%#rjluAV-2UkB z*2~u?|M5TkN15xv(b;EjzH|R)zu4{%w~UFE&x~EPEs-_LmA3eLp)PYK^RqVZjYq?Y zwV4Rm+_@~b)}cWqMHJO2h=IKV5*TYJSwp)JA$N+(5Ea#sVtQVJikKh~lrv*GfhKAb zY-AHe$^6oq*?=k$5hVaI8G}TG%F7?Z$YFUT(iDS5pr}NcK#72;j0)D-vhUvh=#8I$ z{?TMS36+Y(`Ro8h36%j6p>$vk-8(wFbF{ee#B=*6|NNi+@RP$?P@vAYufO&BS~48%#Z)x zcfS1_-}$xi_BtR8N2}R+eYRLcAeWU_c5e;`6F2UgA{k5!q_`M`uYdjPFTC)=Pk;JT z05KLbab2h!0VtuaARBi$U>S{9ZeF|j)w5AaqR&E^yao%%TQuVau`Ytztel`J^aUjOh_($%#s$ z5Yy5MnOzj%*eP2L7JQ*W)q}9CuHFC)Cug^&v*~A_-MW13(&p;+@#3Q*)3Pwe0a2%1 zMdL*~=Nyqy$rTHb9Mwuhg)FwhQ0k&bVS+p|*hP-#Rpaa0WV!9-t~6(h1F2hA^sijG zG4_#+e0+NU)~(M7aeMpP#Ao%v$%IwgW|W!r(Ik+qr)Oovr*^kLIyiV`bNA)zmoAwM zKDc%N<4->Ln}7b{kKemKTxpT!;(b?5Lzt^+$wtD~*Tx`P+c675mX~>68k49UxD5Zm zB>+A>_midpK?Ne_al`TZIfk1*_$jDrwYL! zUfmde=hdftz4)L0{GVO9{26zPPxdPoRbb!M{a)!gE~+ykGRRS)DuF5ypn`}(N&^G| zOb7)5i~u1~EdkSBNL0MASBTb9;P$*aJ3c)K>W!m6_(y*@9&Z5?NE{9(S8uvevk>DZ z>sy5zWQH690~iKS0!D}&Ri1j{>2H4XoA1B>e%pHHkX$6j>iPVXC88l5tson#(HMhB zqJbqSuqMv}f&!6of*6H-RM43I?kXrqQIsPGX67X%UkL-VE-zmy0#Ow?6$V`%+F>aI zO3306LSU5`yAYX~RX{<}c#hzVD)~-DAclB;K0iJ_6GqgOX<`!mNl=zXyhj#!4=GHU zbwNXV!&qw_8E*^#7~?p!M$n+Oz8we$Jx+;Vk@eQz+^|4dKMNqkn6m>Xq@ z%)YL(UO5_(=n0TY7rLtJ<{?%#Z>*w^hpS|?2|HiM~y7k$g{}2Di|NWC&B3N}X$#$HzFMavT zFTeQQ{>k0E8d#Hg^}xwXVG%Jwj)@eO53C5n3V|RBa8lqYun3EUDBfl0xvlEi>Dke& zInQ$QonQMq|H^m&RmjquXb0m-iK9MOjl_ZLrTw{lfujdN1FFU#0DSeUU;QWlU{JCP8b5i(J<4Xhl&AVfhiLJ$;G zFiL7Jm4H+s#KfOT**^%FcqPOaURdTt4vHec4)EWbMwm6@i z9v`mvvdtS$-~IT*yu?`>4(=WNXaCKA_cyP<_K*Lg|M1`b<3BEnve)Ym`~8){D7Q{$ z3p;>*zt{P?3!LRJpU)*KhuE|o05we=Bl{SK!=V^s3>jl+si*-#qoQQxkQ~tQJnxGgJqDJLNfhDl*5IVq?eYaSg9p>sEe{84Id3Sd3*?zr! zWve&I!bUz?&GONzLvJadjalYU4N1?+fI>esE-Wy#5G$$|{`hEmbg(!+X=i7_8bgM& zg28m5t(umk;2w31GLS+s4!ERjw1g#cygeM135#LEtO*%T=f0wuF_OgWc~q{=DLlT}!e zHL7Om4f@MQii@*Bx~9Y!Id~8eiNGlvJrX3}LIe~-76ncgG9?8f!lK{nP4e4^x4-0*A8rjMOTarNqzn)Tg}KX~!l;HgV1=Q{q;&p&Tle`#m+{~hKo*C#edmB^O7OManBrB?cBlrk5AQ;0&m1CkGr?3TuAOajY z{bMfrnsh`5Q2|Ut*@Z@%19R$(j4=v?WNmsVUC<0Dp$l6{fgD|6j%EbHYx zv0UUu1T4xjsANT9VhkK(jDgT|3>-a21c@PFt7S3h7sJezgc)Jx$XPTQ60u5PWl_a0 zsuzq)>S5aCdle5HL0C9AOTL*)d;0k0@!$RG6SMhYHJ^Wa>-^yTLt75!YlDrQ$=dd6 zId&lvB+;@2L5&nU3YAu~uAYTZx7GaYY&ttRX=W9(_Oo*6tm(S>qMB}OY!tb0n6`Dh zI_#^Bv*Y`p-a2{WZod2YQ(t-ch0^Ptx8D23@!{pQO%@*YN`P^Da(sSpnAub5p!FdO zI4FDDh#R1qb}6d9YKCQjpwUId7+SMnIu$)^n_z4wyznsqjV7zT$p&OSW@AmECRdXS zW{5VqV|AHpu#DhJ136#{uOdK2BA}&!8B+uZrjtqH3Yv!z)rs@@Md?YPljZw6jq%Y( z_Av%wPL_%!WCm2iWhf3Wt)c{q3S_`}S)4ZE%}?H_(1WV8rV%f~3LqQ+U{sn{p4iyk zoXigIJ@btD$}`_uTie>(JO1idUfg=@x#3`7z|?2;!R`G^ldZDLW=AuUj+UerBY+Z< zY{x4EQU#2J0w9z*&z*@nQ(Xh>CKl&14Sj1mdN387xs}6P#25Ee0n_GzDhQG?X9=}>M#DU8`rP?&TRhR zM5tFNrBt|xwN?y_f|e5&iZ|sU z9HS3BZ|V-XZn}&)a4gG`lgUQ{tBuSCR78B!jrv)?95_=TQjwLtqF=adX$OyyB?Zf3 zBj5#;0X;+V_KOeTgKE%dY>d!knScJNooB90>S={*y=(p6M|W=HFa0jO;ttjf$L1pHix6DPh37ckxy>V{angnA7}v7kQ$cOV%*s> z-*|O9bn(*j!w_>E6K`M9n_zhBN~4FHJ7 z-(#_+h6|L z*B%@n_a>8k5&Eke$J6PTzV^b#&i2a2h5&f>7R;sXOXJ?8*BhMA>$A7tn8t{LsHCcS zuapo?o@dHgo(F}zUs~p6E&+fNrpGQ*(wV@h?2iY-%vb^}vbR=u#z5U*g;{s=+GHT-E}ZT3S8fa^JG<>ChbOl_L>t6pg@X*DXb<5K!{AzDyJWam&T$22fB2 z07LNn&5iGU^NE|!KL64y-`GE$t#8ERgVp|EK-O*SUj68&Z-thoW|DQZibGot!s)`# z7wS6{p@$qa085I>5dvsh@c<%PL&5@*M$5STponMaj!*aJ{){p0qjWqO-no4{&x^7c z4to85p5@LcX1;EWnyfbhUXsSW_p`<9ba8rCoq8Xz!Q7Uj@q6F<-e3I1UwruChr{7W zMBBDyRs^-iM)v26X;Bob<4Kf`6aj%0nAva;?U1rgx;BP3pjt{&22e79v#Rq9A#^e2 zn#KzsETuD(AvC&#q1cPMBLMX9b!j(As~{CgI5>k~i~;26EuurQnFFB+7!Y0A6GBiR zRT0H_5%nPmB1m$fl!~Gegh9BiD^+FZI7SJPkyON}fhYvfw!X`9la(ILqU`{n>)LWbsZc=a5{cC>nbZ*ShT!||xD>tWd+jV8UKZ=8MX)~%o2 z`nWnjj#03cU>Z>fA(+TjRWV@Owg3>B^SqE41yMreOqrPgnbFyP*<0=RCe~&aAUEJh zMT3Zm0zpyGDkK@FsxWa&9Dqd`I7v#hjapmVfX*G(>ywAxQH{)L3+tMpnhTnW{ zvS{GosJnCT{OG8uJ0{$K@-o1UM7 z(X#Xe0x?WaPtIlsS0B6n^7^x*a`@vnfBM>MZ+}w!^-IrQD~6^rc<*G^tZc6CTr+ub z=jg%7+1{?@eldb3Y}lT5Z3L=SJE1!AoTUe_-`6LsWr1w)EP9f|>CFO20zkc~>(<_iD~sOS^Z>4 zCRyPJ_UY$I*T@63D zcRz_=iHtRIW9WYGH@~&gqZ`++_xk;_TR$E4I;T0Z2jjA`-^<;oT1=0Qo>;vZb2>jc z>E?^rb}Ec2W|?=R0>H{F0fij_kztJ@iV9g)fcH()^(MX3`n>itJ1F+<-9MQh2?U!t zG^X|4<(=KHzVwyRXmn|7Lj^4X0S47#Fvx8VjxQyJg&R#5W;+Vespw{ zXJwXU|K)%2U;XB9{$^FTH*P+DbaZrld>R51sj~J;w|{(hb8Fp_VL=csdj)Y5eN~n^ z$7msYFg?B`Pq}Q+N?Wj-&rYkVIj^IjBLj}mP>xP1A!qTCc=}XvC;{j33y8=U%xW-} z(g{K?kS72@%4^P^Rr7%%v2Hr=@?n4K>z$49m8Wjp`}iG>aa{Bo-yy@WHv(%S#5%NP zS!z=ad!=f~9dW?HVBlNtn>m3giqayLCimXkAO&U%TP^~0cCdT%ne(RgP17$1!PiCf zb+Z_)Y>A)DIm}x+nVGT1Qh-iM!YVQr@x>8Q$Vc0CnT@L#clmjgbadO(Aahlrnj5S zfBfm5hybVoxv|}QcDKBKWxG8;+1c7WJlGrd59f~w}j1jZ35+$a2N`WO*NW!TL^}`axbTLF_ZR-uT)qH+(GCiH1)tv`4 z*5xL1Ynzw){eHjSFY_X^bapze=I6)L`D;IXy=DLSv(LQz^2;B5_UY{h_p*LDbVcZb zszz@F7|}QjX~LGeHX&GJazYS6Mia#v*B@;Z{nfl2Wm%SIw#X>6VvL3;EZ_xvQjD=k z>@HSW7&()m5FJKqm>sviI&xC24+rWO)^ygkY9pDhq?nu5Wny{(^S}lfN|lk_-Zj7` ztswP`^+4gi;U>#qQ7xv^*@J`TaN28}p5^C@Yb2j^=RQJl-1w)swn8*grn+ z>P6caW5(l^!El0QzeVt(K{&V&d>2u7u3yjk<8nNqqNgqsOJdSsAf!MNNG)obUYGJN z(WQDAU}@0-5Hf%y1Sy0O6b&K)5|LU1nWfB{RDd!Ff9Hd5Jo(k})&x*m!mepG2#PGTZBUn*owR>N)TQqU zqedkJfG)IwSrMwLn$PC|u(GyxbaEI%{Qmd9|Led0>&7@|a(aYPL`2pu1>?q;^bb$} zEyfsQOqy;s);ETO@q-5s0N}gd{qA4>CbxBqG*iv)QblkA}Uz zFb0l!o_m8nbi?)j{$Ue^+u*s@YC2nBu+rwvD5wBGb{vJkWlEW_cd zq8f{$IT7V~4u*2*6B$Rw+6)BQbLb+Fpr{Hg>L#*So7pVi*xDMetUlO3kh z2wB-1PezlKwO+3mRjeh*vOLe7!7R%bg6C)Rx8Hu}`21w^(v??U`O42e{^aoFwDZxq zOaMSwKncY;YprFK5X3JQstQB}k@uYe0Pju4lhJrE802}LWtqz|=Nww2gck&=5G4lI zARL7wQ;a1?%OM00F*p?qVkGkX{Iuu7rJZr~Cq28!?80E{jDV&)uMi0tW35vv75W+V z2nqrR&~ZwE0TG3W?yNQUPpZAs#jHij2i6f7`NmgXee&w%o|@aYKlMZ8y8?{?N^d??QZ*pNLJ=`2umGhf2>>+d z&i)W#mo_+th%UCigcrbgbdCyZaz|xudwEu7F3)Uc$)FOd{TID)m!)MXUtEr0jIe~k zJPcJ=c^EczK_X?A#=mgs#@5dIeSiG!r@uHj-Y>0euMVEPp|Abo&Ao#wmmb{u^4B*v z*S2B<@BhugwfzUZm8~)>N1InxMuRUurY4--J$-j~<%!AF_4&aWO|h9v=wvCX!wch} zsG#UlLIOa*!p2xM=)F&-_W5GbG)=$ghY-B?k3Dwtw|?uldPNU_mT-a#@J#x|r#hQz z&@WZq^sCBRX;zj5QntFOK~olf&SFNy-uSZj&Md!PPn*L7fs(1hUgvQTtg z*R1vXL`~ba)3aG#7LE6PhdpauSrX9_^@3oGKBNN@5}>4*7g~OI2~bEM5&ZqKH1yH$ z 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�cxWp z0K=LQ(aq0>a=A5UOZ)xzyRZKFCV_t>j^oRPVm`-OID{KmOf64E<2obvyKBS*9GSsyTmr+Ds;8T^-%I z{pkKX{r2hE$(=iQ?%cfj!lIs_C|iwP*tJV8+|Va$IHU|o5mB?0&S;L7IR~F}oX+Yz z>~ah@uHU-0n8uYoTb_d9q4#ykbzNU>c3u!nrAe&%l5 zwg51aISrs>jDiAZk0JoQjyp&>8zP@+2q_4Yt%g2qQx^?*gq)&5o))Gk5L2fiSZfTk zhY*LbYBNvuXmLnYx$OGu2MZJ}Y&j&ajGL}QXA;UV3~bEURbf;{kQ6lqwpH{)S=Q_2 zx<0z@L)V1}0{VP2bM&$?E1bpb%~INKHJ*uy5K6a^QoE6eTu57o)oIv!^I@Z z!WCw@Tsq6Ha;n-K&WfTKx^C!0eK1Xs(2fXR)uEeCs&=y}V?JsYjj6iL76os;_!2ec zCJceItqz%#bg?Lk`gro%8y{WfPJy3Zo?i|Rq3kw#@#3o=+nk@TS6e%oov*joEPwpt zZ(ygxx_fxOe$xB0tnAVCnhj;_E?3=Vmv+1G^yzka8S0{%7K>T!nv!fu+(gKMY=GSP zuJ=gRa@A~x!A@s(ag;H3DG0=p4{BRLh&(oVEgK8YfMs>0rDKE7K{I3@1^Q5$lXI4o zeA|b%A9n4q>*C;Zh?>R$nc&zCeV$$j+A|Dc*_px>>R+(cffF((%^@oimT1g z1U!t{ga|1~VL?Evs+pQaGdbL?*IkfZKa^B4ImoCIijrmvm@n$87GfVI^`0aBe+^gDm>`kY)YaqILtYA3=uMd0x}_U^8L8H^p$_}2QOSdymjl=>FKF& z*CMhy_rowS^L#%2_kZaheEDDfE=WMNB$0$!#Xzf8i$|K7Pc^5_jKy z=P%#=*4I$?`i;7-Pfng>l|1_EpL=ONLsAkzS)t^(U9B%JF6w46DGNq$&V{f^0k9y4 zTv-E2V^$IYNtl!7ltU7MM8+_r%ym^8HlsvEHLEBl0YxwdB?~4XKpk_>LI@!Q5d}4f zl103vkW$RSmChI}j21>q)`C*O0E8*EeJ}lxoShzAJG^n@nosq%_oq)!Qi#^tA;p{n zI%BL2nv143#vm#qS|CF#Ia@=naHvw0WnT;h-Ss*ZZXcHm-ww;w?!oEPC)?$%!|CGIL9=L7g70@$GuFkUN2gD=%SV?do77Gh zP5t6=l>GIte{EJb)Tsk@wn{-SPA_2VSL@3x+{Vz0_92#4(^QSUb^Y-AHNRZT(B*cw z+APnP1G1t6W6JA?w*?(mwVBN(^<-9+MN`|R^owfkEg^nW+nT2-~nIN&sLY zHfouz0c+42V9fkOL5i`tMOP?8K+U2dr4ZuaL+?Y^r`~5DC1%Ki`b+_ZSM=un0k$`2 zjIEv#*q}(nY@HB4KKIw=TsvD`~gq#5cNE9-FA>&n8xl4cvzA7JZlb*y3hw{`+l__m0j&}#34C@B5DarS6XXSW6~aN1OXxgfFawMsvuPx zs2i;B&3AtA_-o&I{PuU@!720}$mXJC9ouRss)Cvku4+_~q9}rhyPI!*MBeggpGkpMU*-`{)0x>$(r$udm9g*=)AiY@W?=e?(9K zGw=|l3rPS?;U<$wGd0tE>*9M4qffbDOQ|GH5R3pza+Wi=B#;$S7;8sHrrmCr3Zvpu zrqZG_D1Z)GePjYcB}$~26eNQx_95!nb=CcNF{MNrOAHp$1h7V10vE`v2w=)`vh-b& zEbM^GU7w$voqp%;-P6^D_udkZKPD3yV`7q_?U)%!LDV1_;*pXux0EEC=K>8rMu_sG zhU?=$6Wt@rb$qv`J>qy=5ghYOF-9B)HN?)kqA1ETrKGBq5fxY=_!Rq&v)U{-7l$w1 zd~w#e&;R77e(d#+9@ew#%|Q*N206XB`0d~S-R@hf+_%dI+sz4-g|Vz%-!A*^{;qS^ z4qm(VGE`<8yYtoMdbbH72>A+%Nx5iD0d3rDHqvGdU;r`8AYmQ-%3xU;Tb9z>6 zj^d(c-^IT3ei%YtpDrN+Q&CkbS2tXgrYfj3)pSD6U8^Qimm!9s+jz;srE%7(DacgD z)Xvn-RmPRfj9}=wUJs0gx#qDj6GR&4fkDJa=|k#69)g6VF+m=$JV1cDM-T25q&V8J zRpB`wG7^$8Wm68IPqqtv@(*5q^&|D<`1EY~_Whet8y})X9FhgHLl8vpzKfEmIv*vs$LR?{%jqL){Fsxv9#ssDw?hj;$kOvvJ5Ku_5bNH3KRU0dkVO z^WAEvK9sZh5#bg9h^fy*cXpCNtX0SW2!#bplmkje0Cdm<-7x^7$ywT=@BGlmSXo4J zF=0D!l!;HxwOj#Sn-nix9Jj?6%wae9p`U_hRO8ClD13QuJX`*KOPOU5C%%`bYU{ zN@=s%IOm*mhJoWGcCwOc#g8i^GGmscV38KHn7uU`$B}5u~nE(wN zq)bQ@vkocQm}^&nVPyx5GBW+iDB;*sk-cS-6i^Wb!6&cCQL~S6*AKgH2q}Z86<;zq zFiyuge2Jo2WZU(96n4#Iel$P0Q7>)`>TmjVwmC^Dg%D7b03nNtST?3kuW2OF7H7y2{mXQV(=l50z`$B52tfd zf+&=AT2!CBedllg^cOz*k(XY2d2#3EThK zOE2E}_?=fidi%9kZ{N6nn1|uXYW;uw>p%VKx8HgHy$^~-Qynz3+#r*g*&MSGnwZ%{ zT%WhT>nTWKs?aAR0EKk~-nkt>NS;6(+KTP8EE{7g(K5y+_!MK@_0k6F#VQ+*x$nF6 zE|aVvRdqc*I4TdX@gmuU7>i=aXmVgm=El0FFiqiVXG_PH$%6dQtw;8Bi+$&9y!B)s z#b*f_LXwam31&b+kWq+?&xtR`DixpAS-8)+A_5k5SuCdaH=As49NhlG{ML&~kilNc z&x9bv<^TPs9~IJa;qN`pw+=9+ZGfR`m;JEa^+pYMu`h~}xggXY`rWp@d)K3`%PP+o zuBg)S4QHGw9NI#x16M*(qAg_FI5x_-*XebgKf8d_vwpMjeb2iVGC<=BjK&pBJG6ia zi6l$*BkOM*L0L^>-xES7+fBdO#&t0iPQ8hYlylYjst=RR#@@ZRzI%W7l|SuPTL6OD zWX{F)K3Neo27wqkk9g(%HV^|OC`;#KQjy?&@E!pAt{eA^o|pMCb53cu+l>uNOZ+_3 z{+U8P#`w$-pHc$C7^8FUnZ$WqBlwY7S)hyrwsg&`sOu2(a=DD!n%!=`SXkUC4tp;U zh+(X3wcMs4HX~)igy2(*eG1a@wGx$$k_twZLBt6d*3!_G+ZF+`2*~&nHboNYQ`+@m zwd>nH3_(!DU@9~_REO-y5+E=u+HL2f6h%Gf$q||+qOIrC+eQ8OEwqmSC^+H&=sTxSF^dV~jB%nVHc7 zT4RhM!jbr8i~&S8XqXccB2Et%<)q1~WnDoQ$A&UONF^F$oIxrS=VfzicKFKi&DU@~_EWIs^!DxP8?RG=iK)ob!numEaXfLZ zcDA&pFe69cx#7Bu59oM)i-M>o%~4_>(%`d?8UzzSQp`YdHE=|fJ-!)5)EfQ}$9%OL zH*WOQ^Jz=+<#)dW^~;Z+evrXe^`z@UQO(#25%b|M&zlKR|INF9|1Tb#P7hyf=FQ-{ z?e_e5aSNHe=1El>V^c=UGXd_qwrg9!czzBU`uhFWmAS0AEVOE{p5S~&WkrjHaRnBI zWuubvrX5bs;Peb0Jzn?S{Mr$$*AToB_<}gKEYc6ca001sf$e?tG`K zjo-91t(i?O3>&a9mt9|tkPFV4@ax{fhsfU2stG3JzrnV9GE`CiC3t{^|N5sBWqbz|C0 z&QH&Bid~BGoYXqTI1*sT8_@Xr>ALQ3jOk~@ATWfu?OJnr8Cs4uPc=`PSq{-_CQG86 zqNJ>1ER{86l9&~vO32xVoPE%ExoxUqo~uS(?W|+YM2<;toI~SiZx@uDH7PhQy@YLu zTQA!PUW_su!$^?`nJpTNwg6YDDZtdm*plkR3s3HBxsDrDo}j^M(u`6@Yf5GYNjYaw zJ(w>PA?KK5B1B^hDTEwi^eKm&T^wzPIcA9<`Xev~G%n^Q5hIeb67M&3_P{v>P)#X& z@B6-I$=i1AhCWWzi&pG9=>$C41v#YAcOddZz{md($>_6MR`~LU+WkSV@i`3`sdfRPU zj0zs&rZd@;MMcbudTu9^L?EgFWWbed$d+|cs{t|sF(W`$88QmQO|qo|-)R&~vySs>-) zgZQjLP!JUf2!Kb2`&EwOxlF~?p@aKb`@YR!tl4J&+h2LNP19S`X_EHr{6QAGTwV@C zVy>D=;fyT`uFCmmf8yUxF?la-=gXqDrpS_g#!cTI)g=+3kg=75QE=mWXV*(V@Y%)A zxNIyMPR7N$hWX4?4a{d$H@0q&4Ca*DjxU#RvVzrFeDvr<158Udo4rsshwIgL2>#&O zbWHYo6=}%E&(*B0W^aqkPHecW3|elnVGG%Ii_|P0N~>6902-ue=h7c+wn}7l$qK0 z{V)s~QWqk2n<2DU7xPjPdEO;_h^%tvkPEweHg_x>IJ()E#0d$LbvL^Ih2#ElV5DHoZ_Jbi?Sj*02O?`@8@Iz>^ z_Kc}SSEX#C_!J{2HFDCPyfk0DT)lGUp1%9w$>!lh`|`E<>#s)@hf)xg#3fNhYzP>X z5b60g^VM07<5ro(lw#bc+EN;ko1`ObQU&nptWksvSILSi^U5$>0>BeDe6>svq?{$=Bl*8gC&?YCV1$&c(L^N@3#*g z=BUNN%^MfXSWYL-RXOC4k`ZA-B5=kglT^VNLqrN7U;r>@5%J?i#yJ;4Fvi3ft+itf zRhFfQjDNn{?Y#FYQl)ey`TOuCQ5ZY^uaE+c5&RL_EP0HKq?D|+DW&o2zwxD26a}Eh z=u_~+Fysh2Knrnh#3o2}1=I+J6~xP^LFjbbt+sx%ZN2wHjKeT^??og8KW(am`DQw) ztHKyVj?geRwKW9$qbF&MF@zLy>ia$>$vG=RQIxJMi-HP+wyc$uux6|Yn~Wu4Ay{1a z?qUdAStUnmCBhDAYbvu^twhxpP5?#_r6718n%P9Ie$&UJ2N6}kSQ8r(pKx0>4GjcW&=`^;w{W{vW2y}fsKmW%S%M_%o^-IKG6x4--Ddb!;0 z)@{2UI)3ka?P@C*n@bL6Q2+SelQD$R)DxcAX+0%i@u{gMlWMZdDbAX~P=}J7RLz8K ziEWi}(Niau1c@9#c>SMs?Z?#%7Qq^}&`{D)us zyMOe~H@^Si!J`L{9z1yW?YD}b|J=taGr8<*u8%|Lmn&6C#2%E0%Mkk~Prm1U7b4^| zP+>A8Mpcq*AtpgYSJf${7{%B|fK?+vRTi~#haz1}UAJwYo~&=ZFj?&`Uw-BGcDo(| zx$64e51t_DqB$Te%DMt{*$1*en3R)^d#g zLtm)shn*S#A{vHad`x4EhsVcc*mAMnY+{TryzoMMd9m4TtE!4!cYJ*O=;@P?0s#p~ z+wQEfA*Jy=8o?lAG=Ge(jaArq3=vU`(O5!|_4%rmvJPUd zT~WKDvTnQGIxb9A6pQI@wMN4}`D#|3hR&Zq9^T(g4AoWfdtd!}U6dDR=Lgf-^@F27 z{^qwX2mi6xUz;4=dhsK7w!6*y@84~js;-V+`1<2-eB%f0d;Z9k$AxJnMpRputsk
5L2u9{^dzmxOzGbSyF9tj`_ykI*XAMPljZ8^`RU1aYbP}nRZ&j*URAQBkirlHBxiFrK%8Q-#+v7I z6l4EpL?;jtk+EbQJC6p(too>)AVpOW+#fnRE=GUYb^Z_mbX5gt&eDa?y!a}heBz_8 z{owKA_wL_ct~Z~$z9aNcHs|w2pYVLs$)+0;#37NQ>7wh}^B9KJaaduZrZ2kX~@ei`eriGK*~peOke;lkpabV zEkMT!od^i3B0aNuqFBqBAgPJTthRaE<&*PZIEZvAAj(;-s0DDM24d>dfMi{PRa3Al z;^2qfI$A17Rio??Et-K83?jwY6OnT+r8E{qW3KgiJJ^^o6p{Ddd#@e(rmT#!K87K9 zB?N$W=q2X|j~~@_UAj_4ilPvaUEhwoJ4961_4u8~tIf0G>#uwyAJ~$_aR2@H7xTm8 z0!s@|^@A^qoG3L4`Ce~KW)1p|+ zA2&^dhCNUu(;OWyFD`t#oK25ZczdxuJ3rm^-B|m`RiZlQTyRO_0&4FkF^ z`IF_^heT{?q+PXV_9GAtu6p~&-Cqu^rfOI7132?$O#QM(@E)ykRlZ7%HrpK{)<2R z#h*JnJ8Ro^KA%sg({31s;MeQ*WHR~nU;p)QfBV}b=;ufEdSXmvSx2AFo}LW5q2IM# z*B>7rKRi86Da9CLj3S_HnM)-8TR-y?-+t#i%RT_1+Ol38AKbdx_wBf6l!XFUfs(^Y zNGz6-C8`%HIuHcgs5H$wetCJ3tOJtTx|C8t*#ydpE}_F@C6wgri=il1YUuh) zFI=q8r(H~dDar9-h(4{_?c>WwyS5$ctnt(y=}R91*i}d+sU($r6=2MovZka-ASeC* z>h%yklTYmzub3H-MTD5f^j{K1M9Zcs3g1NnBtTM7L}q4dGC?Lt3~VVmj+R2kp0#Ie zs#zzyK>)}|S@+IfE>~sNi^os5JOBOZ{U6+WTolE6w+14}I4rT>_%8NES=O$eHiu+b zna-D&88k{3k(gx!umZrsOKB>ss%?(*s@Sy~uzYaiATKv4*=d@B&H;)9Fr>+5n7w~_ zEu+(-6?(K-9^whi1AC`MAa;d5EF++?m`P=~*0@ z!V)u?ziE|B7;$`Pj4{SI!_FAP#t3I&*?U&TE063cgjZT{dNyl87z3GO(^}&Yx{Gyv zG=Fh6>p`+9K6&TmkN^1R*KPZPkDvVXr;&~38wa)r zI9SXK8<0SVBczO#0TmfhfOs^qW`qQq5k(;b0s||-qqCFiFTD6)|9Ah*y+@B0H*T21 zovc=sE5VD|XNLC$&IrCHG|yHx#)H@p2y35uAvDNDZp60;%qc|q~MNky7YMf81 z^Yhbx_Rs&tpM3eNuAUuVJ2D~$sV=MiiZ?yiqfw11;{VIpyZ&0XW%oh9F~*#8t+gMg z&Z)X}pZ##RpKXE>iOoX-B^WtK{(wx>!9)TA0!0=9A%DnU5Gh~yXvs9h7LtWXkR@9n z@d*(+Um_7=f|RteOl)`GzVBOA=e74w7<`y(?{lhdRk@q3tD|$TZq+$^?X|`n z<2QZ}Xo{)f&0qcMSAYH2fBoj>=D~vp(=;_-p=M%#eSQ6VzxR88@7v%0<3Il6wldqU z*G08YX)dKtDd+razxHd*@GPY?P1DV8x7w`TeHeyc{Ka2X)rR$?lwO`Q1vp7nhv%*v zrg6N!x>~Q!e(68?=1+X%r=5-uUW2M&?j#g`<2V1i?|kPw*SlLat&YPufA;B<^GADUu>1p<6+TyG~+x|Fb6y>ej>6&67M`KG>f9JHPzz{n9V} zrNcNANigGDgIQn?At2KK@qhip|Nig(oj?5elShvp4Qbf#_xqbYhj4X!Go!}XQ)VZ$ z8ybzpNB}qUspWeUT3G$!%~%L{K|t}66S^I>C+RseFVQZvG?-ChN{Pv1j48y>b#1HY zOfjXDk`+|d;+6;`OfgUmh~mN)LVvdHADlsW9LKcTzPH)_{J;9I{iVP7i{rCvOyz97 zA)>=PDO`)LU$z8T6c%N3p2CAn=FJyMB>f$UREo5xcO{8gf}1l_W$xf z|Ksoc(?9w2v#-DXPEWLA9MoZOx}kd@Lwft-jknL= zS)V=BwB5&k483=&LR8$QTE@&fsq5f};2ql_otVC|>uH>k_6)=>rLM1iadkI0Ut$E0 zTxL2-C0c6r@o93ub1!#z(Y&AFJ`{cU_8Y6SM`ivT%1mKccN`LkiKSaV@QcH|d-T@+ z_Umtc_Q#*yKE8PO=l=Cye028c$sd2-qWl_4Rd(aTo>w-}~P8e*Ihj^>6?7Z%@-?W`Sj#CkBCu9N+rZw|@T* z{$R7&eDJ{s=jZ3G`h58DN7FQIHk)7gg7-LGQXq6NrOkxyr=~DD$;;{==J#@jU z2M#Gk1fbw~UQeTs9Etx#&1B=G1c))UQOnFkNQkq0&Y2doG`=TTYG8Ad2SA7u3u5dg z))4o%J0ec2VXkE?c?Dao*FW)7-}vkQ*?<22Km9`-%5rK6LkMQj010r%3rxtxFpJ@O zS4la(k(Z?`#!Osb#Wic4DyFKXTB)j_Y93x*%i+fWRta6| z`@ZzO&DE>9nyFbsL+Gyhw7nCxz(J z2*)lF)0e;e-ovl_i(mVZAG`hZ>2$qY7alW&qr(~sV~$on$idWBU(9F;^-FB@_04|o zwmQ2w03n4#u81_L65^8H`eOAlTl@k~nluBDn)x%DY`XLb*jD8{GZ< z@4f&3{^1`!zIf;S?3}7yJ-rgr5TK>jT2+fdAq2N+J_sR(*y#BwrR(c!Gix72yG=!8 znx@ril~Q{9-FFVtSaJqY;|CdBh}HDRfAS~hlFvgpKR<8u!dmNQvoW)_EL*KsuTNVA zpw6iqNOPVGYTd3kwamNgD>$GEQ)Dw#V2NAHhubcORZ7J*tL|^FKmO3hdFuP#p|#A1 zy^V)MmqNS2mP!OR0-V*XX^rPnS|hpJ-{?GDJ$shYKmTC6K`qP0cAyda)FjeAPfFZx z*OQjR)&638X5#8K_Fbvji8u%`S5t*^5Q8@-2X!a7EymPtX2F}_=5AMbLUvwtNIN%L z+v40{<{_kNx;S7EHE-{tRfRakYHGC@yw)0mYA#)f0VG5qjwA#bBzj21l;_G!Fi(97 zK@Nv~DdoX-OCWb}Gv!l)HBEs-%Yt_>1qp!z;L|)asJZGiEEfP*pY!J{@Xp9<`pWr* zKGn~!KE2HK?T2r4DRnUhM4!DXLbtB$yWrJLxdV5DiHDdTKI|Vqx}8U5QVJ?v=~veG z9+FEmCM8nhO0EngujGp6Xdy3_9wTsz^74l6NRm)P>Qm>bXecVGqRMIu!h>bla{-rJ|{~iq_z@Xnl=Yn9<$Xwe+xN3U9|iJ1yE>ABZKTUCkzBEmo1ZWgORB z5{FFEL5gcK4hH-|B-`jEw$wyV|c;VGLJ`Lkgd`qj{%oueBj4kIy3C%nY+ff*c#12{BA6+Dn5EwhV|~*)yBA!;pzAkUgEbxBAicr;A6Qtag&Z49|teZjsfPT$HTYv2+tFm2=Ht)bpUl;*Y~{{8pf1!u4;=ziz}J9D@@(07OeWN zOX2$R+0&;_o<04%*iW6EJ;ZEji?09xAOJ~3K~y3egxbPYtraMBH4HVEQgZ6M6aYIw z#J?hh=c=q#&}Ge8D*`-lb<0`{R3wtXiAb1)nV0C1wr3iJJ+inOcQV?f0@XVGkE@t5tqu#}CbGF%pAt9`~zNn4Lrc80wb$x}XDz)4= z98I~G-*HDr-$1IZ@%&Dv+ESns!vnd3$c>%c4N0YAQ04#mGVAK70|nG ztu3Ma^j*t!#;NWw^Ljnp-tLbNv+s|^`M z*x;@N7_1*Q&#n}T9Ng+1&X3eEdw@jp^wqGDh_~?TVH>1yV*0u(8Tb~Kd!kmGjRy9la#F3&_%E69@g7U>igNJah^_eEp@YF z?KQw-ycusz{Oo)?<+)o8X2wo2cKgHR?)zzGmaE%aBanG$aghvnYt^vp<22RHW>xY8 z_}SSeYhG_x1~pk8FU4I~%?x&Q9CVz68=(Z3aX0qETFJpCt0Y6rWi~-vb^Uf#$DIp8 zADygUb)}SH=!CqBNu&pm{g8NY4s3xuw35Te1Bl%erU1JIh-Fo(-iVRR5(5WF9}POz zL+T?N?epH%=6zwN!|pb6w4Am2cC(4biNfJ9ZXZ019Ag~VSXjnG-E1FCu5q(<=Du6& zoFn2J=Z~htRLmhTMUBwe%rb)rsCCKE(Ar{Z8i;5|D4dt5%j1o$KtF77dqb)343{5$ zaQo?}58r-!wt9WNd-tnfv)Jv%>A|B%N<8mxQ(OlLB9TbglR(_KaHuj+2thjKs2;3D z4zUZ=)7(J@=~f&D39Ha`u}^`8IP&v}6x-+*NUmsA`2`Q6`&at)ZH5Fw5qV_(&ikhJt~j`dUa~ zVR(v2U}?ogPVCKlmJY`y&EmD>p@oW=tHGR_>*Dckz9wVd2m+8R!*uZx)^?=(-3V=q z%Jh^VWVO_qYf;s?mH;;=HD)yvgQndr%!yEQu~pL&xtYy*%sC5@TMYzL zo$@&4@$?RlAJ_4URfU>aGgLHJGoX?Iu4dJ0snvzE*4c73^=dh1bz|k6rYpQglKc4~GEiW9ldb7gHq?=Ow6Tt_4fvLd%Ph7SG*o3Tsdm zwXp(p?`BzU8K#@t8xZ?61(t`K?fd%v&66i_wduQfeRFA{qi&dT9k$yqzwzd?-3>yB zEKGqBnFC7_?u-L*=iC#7DFVVC1c(R`6hMI_f&+0Rjv_%wnD1wxN|vKJHeIBk~XMb48fh@1fBrbI(_qNVMZ>*=4!A!_0QO zU8C)_a8x3a7@~x}@2zT#vCU$oQ0S6s>AH@Y1G8I=Oj_$OtcPL!r)a7C$jS1>uBBnX zMoXT|>9tyIL&y@j*#L+LN2Va<2yfpHfczpq-(T1TQ)pdJy8;GV43>?o)CNQ_f-sxA zxCjLjC|8(!RW0@DXP*z-v!D3UAL~<>57X}HmCu^`?%l_4?xurPjl^ZnWtwd+Fpn%q zf?1ExEzBSiYPA>dRw4&t?3QBWPB15s!{E)T>Csz{pML)7)6YNsr-4z)w6w*Mn`+7X-Hx`8=dg`g^^h;Z%5M%jFDYT{Fd}xA7X9OZQzZ@C)thfV z{Oq&OY=|YXxmwiT`K@31GX~o;rxW@5gBr zdC|_I;hjxBz5sB{0Jx~^Jjg_Z z+)uU}Fa14_94QEhc?o6ex-O(BF&M!VPDm-G5O1D6H8WAkwe0u%-Qmy=sg#+_OP!;L znFS%QWj~F>%jESZ;o$-|Hby-Ygq;k+B9c;C1YBnAjnDI(b7rN6wTlQ>ZmIJjgp?3M z@L+*L2m!CY%FQ8+7N9|df-qb2nv@Wh3+>#TiAg|2YC;@EEOH2eV}yj%4cCX=M<0AB zL|nWN@xf}FQhM^?#~ec!qIuP6PO0l+>Qg!#4tJ9T!-Y|-!oJuxx10Hd9=>pZru8Zx z4o@$i0a&ls!_f6HKK=BQ;lV?n=fkwCxeD`xeslKd5xV|TjUYs^v*Jqo18=NryeI&(W&gz0$)D zgDqV1yQsjHC1h2hJ|Av1NKvVIhBrE?sp?^zZ)vmLo{yJ%noG2}zdg8Giwt4LVgld1 z)ZNUih`#^Hr*C}eog1qA+sisc3vxId)(_6|?agYvzI^uVXMXI@JbLT#ejIo6=s@Z_ z#mPbXxrg?pCK4~5O#rO7+i(BshFhN5Y%?N%rysRiE~!PDA%=uFnadT70ukjF)3)AtKB3!V8i2!Nobb zZ#J9Zu!>1YWW5={ZdGHADG1C1i)-0#9&EP{PS4ZH|7;oj%+1`~$gCy6;V6P5Vv&#% zLJGMSB5|k9**51aLPQk%uJxg%lxjs{2%%ZZ(Lz3W>4`u%B_=ig?CEWSsE-MeB@mI5 zgV+Nx5d}`9HBd+tR5(aTX<(@eI$NI&{fdC;`p}WALYl{E6T0$;dy->0@Z%s_H4w>LxTBiwHH zDRy!=JbQW--h8J*7%f;!2#vu8VRnZY)SVZow33_GT463^0T!c`sv5j1%;EPbh30(E zSMX#W#^Da2UT$Az=#jzf?RFw+jKE{p17Jbjo0Y}_%pNCAV;C+jE=nn-=F7c}a7uUol%_~?uv(it$sXcX6hL^&Y`iiVA^A8fX}W)Xm*f*Lkj{R0Xw^ znpM?{W10)1uu+{e760*{{xkpbzwl?*!;o`6?d*vth4|rzAO7s0{c~S_``xRnD`Aq(E*8`+L9hk~QgM*Sp*E^D_}C)4X1<|INSf=Rg1a>09r<;}C@S z#@p|Ci-$Jf?GODM@BB~y;2%1I7%>YVjX)<97y^g^(s)u1hKqyTNX?Y2l2vw7S6c$L z{CVZNFR2uFCvCgMJ%p2*3&aj;Fz3Q4Y))YdmyZO;(nAa8u`HaO+b)TmL^y=V7$n83 zt0&Js`TTJG)ZTuRIJl~t)pQZ%aX!qto3}Jf*OyD?v>7?OF5!m^hQVP>Jh7L^zxJ)) zVCLJ~+s$gd-|ug)Z&s_-m)?2zo8SEA@BYs39By|x=jkxc^Gqq+)KcyQJ$C95UR8Rk zmHQRvbnE}zpZnQQKK_USCf;l|msght&$ZkiweDZ!MNISqV?E4lrfA8pO+-Q*Ut4-k zPsRPJ+E{!)Si7^F>L;k^xN7j%lq&MO77zCtx?vcM7vzOF9G9&aWSz&+p&~R4L#`#p zsPJy+gK7$qVNrsXI`peySUsP0>-ToDEw|DMP+#y2bqA9JYF1UbiW`VoLg>4d$P%-~ zA&E%nq?9s_`xv9TRbMc&`%{W9QQ~*rVZu=)zHns(l&86))J&_0+QAG{0~?C9Ho=t4 zEPJVruYBdppFDXo?GI7HTaVv-^x*uT{Nw-o+yCqTmSU`P<`^0iB6VGi@!hxH{;l8o zt*n)q_v4{O%3oh!Z~EbId7$SkTNl^X#?m<67z}v(`rzTk&CQjS3io&3eEciF@+*J; z+kcNBS64SxEe@;CpIttD<1GcHZulF2^KaQ)%p-^7-T*8S3IY*gFpIMjskxDpn>Yn{ zBl84M079!9?d%XI;@;wmD}jTFV*(9@)`y3dMSxnfplF|Dd#b8;hca%VydPHTih zzPF1Yc)RJ)+F=$+DM=SDpFX*sH&1U5x$3yT&C}SeHm1c%Zsr=#huhD0Ye?r|oGY2b zncd;mcpYsBV30rv#Egr#9{=zE=pWqYjz>tO@K65eJKy}}e|H#$XP-YAQg^j`^6uO3 z{K*IJbC;y0O{%&oHBc7dmw6Q%H5$oX-8qIV<8ZqhQg84%&zD!14s5sECJpDiR}(!g z)Z~;>V_G*{^8`!3r0#e#z;5Pj-uj3W0QB;~M}iy^&X@G`qbR9S)$foX_dk8wa-9CQ z6I}92)iFrWoCjGN>_QY{tgvO!3&J8q1lPXr=6TAsR?`O16w`U0Q%bI?BIY2tn%0&Y z?62@=U!ry!yaW=4FtdjcxN?K}Pxp3=QB`wYl+*3MH(2-u;ocpl{)!)ams8x1?Up6J zc-Y1iy7qB*ArPRY3PlxNrD5F3IHj7WT-3sDTQlh@j~Cmcu?I73-O2;(>o!?54)SF6=L&mn{gq96d8E1eS=JZoi;=2Db*+RlP1xsj7;| zGS&e>LL0T(gRxqzrfIsqzJBoFK_m6|t3g$}t~0k2g7eZ>8$$vw4_J)Rh+e}#JpFAA z@*pB%iG9D{??azB1_x@bWY%oU9-cp_RyLc>XHTDGtuZAc>V{rbVG(MpRbS`48aBQ- zBb*F#{CVI-a#2dW9}lbTCg;+vSJetr5Q!lqGe`_<$}B`IDXvpI91gLIWf~=hJlFMR z)vtRInaj@L>Q+_jy+g>Ji{ipb4R3Bt)C`8^aeVOT!lqFuBuOpw!it)i6?3lQOiGte zuO2;mlp?~=UGI0L=z6`?QWHy==gn&MxdX-S7*jQa0D(@qnRbII*BVl+6)d!UcwXm1 zF+iNaZbt5W@~S7f_w_`K<&?&z@b?!=X`PJkJ26>-G8)U`Wt$qEbP{ znY6fzb0U(ISlE22{$OW!C_$LC53vv2hcLvnO5LhYU5K&yf7w0L4263OWpZyv5C`EH z(IFJGu4tMp%m%LJVh}?xf`OD8Uq^_R>f=k+IytEwyB;$J5hQh8w^@BWJ^kl?eEa)< zRQ3)J{in~a$7#|s&xif)_BQ8-bD4Rn+c50*J1WjfFlY7POcWSYD4bO6Xt^@?=Ag>3 zyA%^w_v)sqWFS>Bka;3@=K!&L8`P%b2oO*hC>Vu-0+U9LGino#iE}-c9tVrRSS((3 zJpX{Nd$UBNpDu3MZNCu3wcx-h6cl?2Lr~al9`@LDpz2rKLbI}^q4&#(o18|fq6Oluf zKuvI)?~Y1AawqdV%@(q3dIe z;3dwxNvgz6-2sCY(W3iXt;|tP5(NT94{EFuL;IbbiA)vD?hH>H5+McYLmXmA9D+z> zUYxdGm?_*BS$$hWaC8%G*hC-}Fq^Z1)kR_23@YFbViG5Ih~s|gfw%062KKXr&<{hQ z`sRcA-FM!)-97sLXQqr*iHF7lY~16D6pb6YlVW<*on;t2?4B7gWWMF;YJoH1oDA8W?gZgn4(B0#zD-z zkQ5k%t6S?N`PFQo=kS-;ua@YGC;HvGYH{pe^7%-Jx~^-cUu~ocAy`#4Z42YgX4Cim z&CN}%wRr&kuoaNL@OsWo;$<-NQF8g*m#*tl*GY;MZcZd^3}iiSPM4PISSePktyL|O zyVNnH@8YoDtk&D-3;c=dz{f|70Y0Uw9E}0m7_`8cZJ}98r6a)ayoeT@X`W{Z3%+a4W2X-0&=R*>AUTnckw6&I z7I|{Y*K8a?wPmel$Bicu%fcO#K^nXEu9J1fQRG25k!++r;D?+;>QHMii>U)g5MYbw ziD76W$i`T#WxT$w13dL1tteUnhma~ultj&mq^-CYE+$2mKJY4aL)Q;o8d8^n1YrU3 z{nF$2?A`C5*=Le>rMxXk9*-HqY#KyXL~#X1bj7v34zcrLOC` zuDiaze)jCyYr2)!PzpsvSWf9K2E2Z=#(sw;9243w41@GZLLk$s?u6EXZZ_*`C8i`X za1a~`tGnG!RckJ)TIa0V?RLA{*niR1oZT??hPQ zv4LcUE!77gatE2#@%CD)dA}w#GKh3uvT^dLPU7NCQpGTU#7W?ZrQM z+lOZ|tcv;9e&nlXXBVrXgV)>3C!c@%>GjT6kNT*T)G<}A9;^xdW%*UiVJskF77ijI zgqXy{PbA{|Qa=#05!9`il0u9u2s0-Za%$_-(-OzbjM|fCgG5MNOAKO>r2(qvcueAJ`BSmD`jpW69ihX*UeJ1*8246(}xcq zZnxVPc)CB-&wVMw=yjArT6h=C?8oic>8k+hcJ#H0F~){omr_o9rGC94bF01{R%M=3 zN~_ITzuvStsx{R2tu4UfBt`%eSa^BBborqa2)fWWDG;RV6M$k$a!g)teSL}&0@Z4S zVj7;ez42G1kAjKJn!hE%+`U$d)rkqjEeaFnYDyGqwOZTUCPV@bA%yDM`oP9fY)8wI zp!veZwk46AnK-bc0q03#PL zxanHZ*t@1y^R&N&8Jof!;1H6f6$Mo-cAS%1VQ)~wx z@r|EJQR=kcUp@W!{qH@y+0)sNTs(Yp{Qk3TTvI+sfjfuhsN$&3Z6sz;>vEe8n3s-d z8M2;hf0)`yTeOlwAc;UE3Ctj;<*8Wu1$Hn(2rM>8aw!8xB25%CnShi)Z~-aE3AWtp zME3}VUpy%9G3;K4?7pz8ey){h@c%vRV!Pd@l;(LpVLcAt?RNn7`~Bm`kN5k%s%|zL zn5UHNhlHPMt;~TzC-TATc|E5km*eOeO4Pz(JaD9?L6c3+YdvXHNz?+)|sKV|AZiec!u#*4p}=Rz&W@=cg2!0x7)!ord_q^6zrh{Xd z>4;(sz4qD6YAy(HCk@iFi$&;o{+<{iMi6$mYnzep4_pQq7GuD^4RsuK%M46BuZicS!zxVlPZ@%-D^&9VcnQESI zpFR2H<4+FWoxk^uLHg;CJ8X5TY$naU$6Zm~VZ=-vC>-GBCvuBM{y4h^P;)wJ^v^*~`gMQ#Y zaJ0vL{*O1w!I8rqM5ycIYPH($_Yy*5196b`YHMbw+I5{cQcA=xt_Estr={yRjaCZ-h)3F)w`9RhWh{{5<{@akr$qmGqF%)YT5vs z#+-AGX&%S1!V9?xk-^QJ+1&2S&|Z4g>zv7qRXngUn^|yYCyt@H#WbAX2<+0*8=CKw zGZC?Ki&NnBc1WoYW<7}WL@ak`3z0eaj=!#|rRK>I*qIO*UFqho6t`My2FMJg%nT6$ zq)Gpd{fD#Pk$Bo0yg#>_1oCRtGF;(mx#s;rZx7|!zTS*wKh;q!8>*8v3bPYCIZh^9 zNB6!~ecA`zDioZ+!XBJu+73Oj{>g`*{`tS~Z;(W<*{zQI-C>&Q@aDzCcgK&eA9&)a z)VYwm5IHs9f9cCV^3`!1_xpY9Qj3>3?5CXb<+JNAfBDN@8i#&e zOR*;0aOUM7JU1bJ0kSz_8EB?9B!M}oALRu&4b^ucF-KE(~snMWd5&F19=men#+yEXOCo&Nb~)o$Ek>17d>QORjkA{OR?R9|bX9FRearxhz=`CP%6FXHiO7y5)E)ylE!u_J|fc{Yw7#_ljb4&=*}*%ooHxQ7>8_J$n4~>E(9&V49}&dTrGr zr@rgqWOHRmi|8W2VXDR)Of`kht4EGy$})5i0<)8J!}fMJot>T4h2L^=eQC%=b3PW4 zKoYDivSJE-H*B^>m})s&r*WQQ*IBLG&Ds9;T8u=x0Dg4#XexO~+w0q#zyYwd8fIn@ zkOyIdPZAtdeW8pkb)Fpz5o?*2poXcaTP+nveG;x2mSNlV3PFqo61u)8BIMF^PXbAy zTd&WuQyjKM_c8TpaH%x(t5dxZ5mQxj0uzg>J3Ds*CS%v&A(DeCJam1xT3OZYdJCm| z7=xsFo~Qjm%e>i~x#~P-D7tR2JQKM{R4YUx98>IL=-~qJX0yHBT{lnRS}QAk_YeN) zul(EJG-^fPobE);%3nN4UPuqSe>`%@&fpM2405==`5(UZ-+txIx88sMd%~=)BC%@i zhqbC|HLtKKn+Z`Qsak5C^L{^O4Z~RseN3T46A3zlQjiERA9*K4LJ(&nVK6(}edT&X zYWT>`&}QOXa?bOtbJ02bT$(oumYj7b0^RxeEY*kZ61a|m$OJHmS>1E>Ao97IptksKRuk9MtXi0|1J2c~ z3k)D|Xx1og+hT$gx+pJp6L(X|Q*|fgxtbz`UaOIN=vnGK6I zqPdAV!}t`@*8%}r_PLu9A_ode!W<;UbejIEH(M%4i(fBVt4+C1b7?J+yH9yuekS3_ zr>48z7TRIkWWeT3Zp)+X?y8=vN!$Mti-fkYX?%3LH#p~7#o<+jkb!ZW#&K?yWy=GwG5M<;b?##hX6D3g1fyj_uttUh z5yQmIYhlx1#-_Dob0e*?d_7Vlh{06JE8tqC&Dga71{P|jN8l63gpQ<@D5AM|&@gn_ zpJM|aw_xs$V{XAw?|x5{rEX-(aMubZFb8HpouF0Q9KpU2{LnalM&x#Tebd6i4u`|x za9C{k7l$q9Bh_UwEe;JgSyX*~FVp?i8?NJ~RG66>Jguq{+v4M7p1;t?Qs0>}q5#sg zFkRP&F3$5zs@kYo5Uw@)L+VpziD#M}UJK3Y@ZsG?OX)xGJHgjuUuHE84MnY%4? zf;99oMlw$m=okOr4(|`A1rmp=w(J2^g5?0e*XVu78fP;_MuOJ z3xyEVoM*t8snrxfi9>Dq+TP|NCo_k_m0Y!El)zLdNQ2)^Sjj55GS^vhj-^m3P$k#p z65a25m;rZ2BZMBAsVLfPk$xO`M+wp&T!|rI|rPQdD%^R8EM!tkixic)lp_Jzm zNc+^m&9!LBHD}ctSHpNS$CdR8+s~-hdMIf~8Nf_!71GchUPwhsWP$z^0CX|yV_(wa z3B+JULwtlG&;T~l1ntIh= zDsapk0dHeHNDS?yf;l-t>;e%J4_*K0(W8q87a=f&r#zaONUXJXT~}+Jrio$*t8UrU zEOs5*Y_-;BXF!u<8a%WVD<|%T{^*5{dwN9@5ivUn!H%!6pT?Z0S#6q&8aRe=nxfVi zgF7`c6OmBh)D7#^b~rniVgzGmahMs2#4g=0i+77e2)t#8MnbMd=P3&ZbL~?{L?Tf_ zXf%ofgcNyVB5A}WW)7ezp?~us_C>Pxh@}+bz%kUe0|ni!AdkI2gS1o&>T0Kxy)`=O zu5R@>qn-@R4u?ZXk*ZY*rZUenh*qnWM@fMhGS6eJwq6ex7Z*8C3mpDK)8${}g3gC= z7*a~9DQrq9#nj!ln>8~?LYNU_r&?HIDf4M>u)LoImT_0}T8xW07AjS(26dKNrPit? zYZcc>u7I?(h49>VqH!cZaOTDjYS6SPnYuZdvYWfh-3jOm5swVs#Op?&#{XWN*-y!& zTB90!n5G=aZpYbcajh_QQ&ZDCqOct%v%qt1yb5lG4J|0cS{j5=GsUb z_uKb#s>@CHnd1ONhd<$1*LfaMdAU}5F}nu!b2o3Z#=-ikO(P&5RY6G zgc2ZXK%pTWMW&s&+wN}ca(CT)>Rk5icUf!AImZ}0%=O#nlWkbmSzsAplxS6L7?{i}PukQtD}%+%cpW z;&_ZC^y73B5V-F*r)O91zyCg!(nJ-_ZP7~4%eK88oDH7i5GW9FlvKHhMCKwA-4&1) z$_oog;1C>%LqcFiP9c#anj=yO>8&rmeHyw@y~kKeK_+J!OMUz8w_BkBYvXukU;{v> zS{L9g5u=l#xnor&GIK4NAmSQ@y}2#0=izGAo}g?y}NeZ zpj!U8#uJ_X|7}j)>7iU7&jmyr=h>lkofbl>HM`@Zt4pxjRvb$WQbTJK3`27=ZAcw< zBvV{kBJ`tD6u{afpBxZhne{9?PX|P9d}UgoZ*a`!RCEJ31fw?WS*CsNpx&6j;IwF& zjzf7kBGlbcD{Jn74~IIOz_hz|EpFAcv(Cz*h|HN zULDoQnf_Sc6du_W?HbaQCj{8CCxuMNDryUL4rs|W)Iwz@G`7M{#S2)bWzJxZgsw-2 z4BXvbyH@5<+rX@mF+{Geu7;s&w*y*k%Z3hjcXzecq3X?H+U<74phqREnKr#hG288S z*VosAbh_TOWlS^HF)_g+g!7~Ej-k!>v7IS`6p<52BvvF|vPLZDOqI+m#<*Fnks)if zMZmH6lJ4&AUfjHp7)WAhvVs(H>N+~sM<~QG|jWx zJkRbZRuAJSCCgFvhQRFuGR4(u{ZF&tUp{UlB~({NRd;8Cz#N!^JDHi2DWH1uAU+&f zxEPO1SvI%s=jZ3X9UmT1B5EGm7AUm%q2MK%s)fU$qk|(bK8$`Gn#U1HfD3XUYOqQg z$Fb#_7vf^r%y%)y5GWt^hr=$$C_<{PT7H7&vCtv>XEZhcU+&Q+dcx_!N?q@DXjY2?Rg>O-;2q=DjMoV66ZJ+-O<4xqIvFbP2A4VqnD!LjkA&)c_dfk843cHz#Ky6AZ0%lBsR;$(d`FZZ+=++Zakeq9xsAG9$ zf@7{gOhS0J*{Is-<&}rK=IzW9VofQqYC)$ELha|%)6tVgRpXN3^ z25-rZOGP+2IRPv`-SyCt$*4$+e0dppAen*NvIhs`7C@SYl_7-?oY-4PPSHlL3L=O^ zK(+d;TC%(2$;k=V`uVOWgcOhJ9y%I+5RnlOfW4X(Hw8CDCpT0@6d`I3Uovk62n--l zSZuEqScH+am`Gfm^-&=L<(wr348m!5a&ppS3hj!(z)N(Ub3_rOYAs0;wT&W3fY^wU zg((mDLI{m$oO6D)n|}~EU;{<`(@@3H z06_Dc`ZTOo4;bHv0TK!4xr#`ODhwg4Rx5WWC$N`%B3v$96^KzQGLju_0RXCGMre+& zObJ@Ugs)z>g2Xn@Qg>@dIsy@dz}N)~U<}RP$jmYFWds^E~f%yX|&65oXg_sFaz2yROqY9}b6U znjoeYInZE2h9HYA7fY$k94HVoA)pbI3I@!Ch%rX1nnF}5iQBDo5zRK__I|(TKm}~d z<6Lrz`N2OmO;dY$)8`-u}$e^D2|9{WP};0;ld(G<}QwM&UV^IcIa9 z=DD3P(=-KQQw`0Li|EzVtmLev-re1Ct?2N|tS7v@aJA`jBd`Gg;Hq2AYDtnR1P+BF zfhc$&aYANqUm&#VU>HImK!axTNC8<@U2VHRgzCX@nx@z#PH{gTnjMz_4VFOS_wG;G3z<7nib2M2Ji%4A?j-sxAJx?)Q5i^M1d3e*fa)WP^y)G>Hfi&AGOD z+_9p3Zgs^*@YBf?Xy^~G@bC&~wPq0s#MMo6Ddx?w2LK_(GFJ|gbI!G%tk=8!0i2GD z8APLI+ir6VGzB%RMy!O*LuOXlG#pROWk~Z--d=v{ZpRrC+Tsgfq5vq)5hXH5-!l4&VrHy$eZ3^pOmOxi_Ub#Xm}RWCzFT?8g4j9nV@%*?yp zE=g!lc)O&iRYVkKAto@_+S=^(dfhIAs=5RLt1@$2KjoZ>sFc#~RxQT@s6`wiGBs>n z>(AX`o^os+Jql=K)vY=^2}(28cQLh((iS%lf2Wy+5VBS$bt~W#1uU0EnUH3!Hd7kH% zcLD&@G@YNHR|9oaZ;Dltg%~HBXG7QhbBDSkX#pRrVtA;A-I}XwFU=1mKs&9#cHu*#MZ0nqo4rp zpa!}C2L&k*N9H8fv(K!`4hq#=9h;F16kGw+L4n*Dj)K*fJq0ZAWJOb|#Cf{t(snyO z>cb~bK0DdG3jnT0h_$LXkSl^=i{7=i096D9s1BxH$Q_}WSHMaw;1sH~rH_aoiNadz z!%9?$VvIxA_sCo-m|3YTk*Osjx+9=Dxg$V8yngyLm%2JXKYesLs@~0c)S^O0D9!x_ zP|+uV*}+9n0tdOcd~|+sd3|?FPQVgDx;}=$L}ayA_iC8IhuAd%E~5ux5sH8qWk_9~ z#~8Xi&w;pK4NFF-S_3Mzz!z#uNJMoP7Gkb$=!n8Z ztx&7g0;R(JZpX~il(%>HWt!i3{q_6n>+RjG5DBpZUO#zKO1Zka+6?`AwK_dLWv}Su z?$p|N4)_qv@rqck>Bs{Ipui+d=m<=Jt4HN{OLuiMPDSY*-Z~V%y{8Id~VhQ?LPrHd5i6`#N3HjmPtGd8Y_@xZNa1n3f7W_b>SKX+YoxD8<~q$XelM&v;4LnwkGQ~(7i0*av3RlyL{ zyxB#a3Fh8I zi`rh$j%0W=X1RkA5i%tap&-EQj4jTk z{roziq17dorF|NNGL2ak$h38H72E@k?bZy$4Uq20j&5xL*o@3=z{rd078eTfvM+FC zU;$>pC?T*EL{bNHukHUp#*F`rrI7|BE)xc3PlcM^=c?%lhjt z4N}~&LiXTqTedDh4{)D0)L4c`W~m>hY05cw-C*GR-T2@A_x}r01PqSs#0cyd9A1IB zo2x1~Hpgo7&{g$Zd>ZSR%G}FbI7P{o;8iuVgCdxtHLGb`HB&(D1x;)c%VL#r!HPS; zGC2g)mcQ;y5C9rE$6DPm1VguDYJ`#-An&-J`Z~}64KR-VQ^Ld(Tgia)|q!5GQ zLZe})Wq|GI_~esMV~jDxGz70wO9KX92v4R(dCpUN9$;mvj z<;=|Me&}MKV$5THRdPavA{2pzxj~9ajR}}ph$sXJ&IDcTh$yne7?)f9OMK$XC>vxl z1PX$M)szrfxLrnG4QqUerfEqv=+MSCOU9O>|;=<7Nwd(%qZCM>1_)Pb)nw_`DUB_UEbj)c{=q(3}8}Z~^h78Bq*~hDhEJ9>9ze zP>?yIRAfOxCHlQ`cqBr8rR#YG`e2CejKBy1C9xN##25)9LPc0EScar% z3Rn>p(VdhcxsW$QceOdiis)DbCg6xEotj#5;p9}x`Z~V z@6^N_}D2NFtIJsKThi zvG038`F!ai2X1zc2YpRT#zbUOa00DR6hcK+ujZ=w<{MwCdD`ZR=BPHr;Pd?Y`Q^!5 zUu3|Xr|B@}oLO@h(&=lLwbrJXZ>0wSkOT4Ol3rc{vA~5BNxMHTwww0EAI7b9iOgf` z!4Mikoq+^7NfeRhl3?Z*l^Pt$+Kjv+f-{8>(CL+`cT9_VFf9RlD}Sxyatpu=%)rZS z3$Rgc=V`1dSgC*5GOUzFE`O-ta>{9V~S7m@e5D6KPmo@d$7Lg$;Vg*#B z3JAyo?7+v>78y{>MAsHxjp&F9R>{lNW_3T;(@s8l`r>MJ1w??9b=nLRVi!VZrkDX6 zYOXp|B~SumLT}wxQxy?4f3zTd{PD-nuU`O=9@8-LGzXURVaU_m=Cxgn0*LNbj1yDC zjS(O^BR6y-M~WP$surY65&LxZ#_J#dqu>7E`HM+}tz~g6A417~`0PmqPwJ|L96AYs zc--wzHz!r|Lmu9dGmFej#Ec6fYn%={aGV8dDLHqsFQv2#*Hkh&1eVr-Jczzp0pcLd zO^3`#+?Jyh1ObJ|c#o7mCaudlCv z>cZ9h|76Yi(v&p~Bnd<$Mzrk9NQjg$GTQcb>z2_VvaD0Dx$JIl68MWxKg!bq%r_^i z^{~=v_czz$H1(@tu~5A1dLk_dG$CkFbTxB?*xU_9L0&;8k0qA9A1V(UjYJ}ew z+dx3%;A%A&FdN75_OM+IF@|ot-Rdn!NUxE&0duegiMAjlnHea$k+(4y8 zqB=OcJCIv-Ck136&4s3nb?c%_B-ylnAVbCOo#0bP3T}&Qkq!Aj9a_e{&&I@C6UkbY=BxS zDul>g?8kAO=ee0*0sw44lfUCK*+mrQhH`e$r3z>@!o*Zd2^=55oiRp1D)Umm7GWVB zjT9p4UJXKuZ5O5n%;6Q}#ph&ZDaK+Y*HUXO(>xvyE-=;NXvn0Fu}h_t<|JsU9C`(` z_`q5=Gr;983@_mutwAGjay+&J-UQGL#4WXoIIy@#a5b>nr(rTLQ{fZRTnMquV_-bH zyy#+>=lS;fMJZ)9tlxP3@y*?>BepTKH|Qt)B>oH^v`+}N)@J&D;EkADb1IPosA;WQ zYtuS$lLnfrdZUg*DPC1o`DY~~y)slGJf6vjj1IzVh{WtnfUMvR!oDojo6FyiT@PRi zu}ev7Wg>53zeVS9B)~G2CSL%Dd7f2m7}iYz=++vTMc7D=$l^fM(0$D<1Ze0XMPLvl z6l4T#*GMCW050tZ8F}GL7y@z})mNfZ;O#1csYb6EIs$9eyf zYO@f>teC61R&RvHTuW8Q`bzpJ*4FwELhE4F6`>$aPyq21y3HIaU`4Dz3T{By z;@*v@)y}q)0xW<9NCC~!kpP0Dcrjfk+Rt-5c~mfTo0D!>0qM6t`e1%T)A@UScTx{~ z$;>0Ak>TEapRG8Uf>i(qvnHgBIuc8`g_98CoW=<7M8@xP8HzW)a-H=5h*?C) z8e>W%rXEoUY73Zcsn-tjl3}nkg{^PmTmcDlg{okRRY9w(VJ*<7&TSg!T^oFCR%^1% zELO{Yo@>p0-=CeGX|?O?>#kq5{Y+#1;Ie}g`w7fY3#4=sB*qX}f&>6FW3%dDVv#U_ zQ7vGzlaPoYlM5w^6_l(&x|oPXgq)b2l!<{2kqnr_@y4)F`y3b;92p3l7zm7j2!IIO z9mr6O%#r0_D*+pWEh$^w$bh5j@)m-|%XAZml!4#JKcpyh2Wa7jz2`Azp zaloaT*{ecpW^8RXF9>;abth&_XtKBh{pkEhn8tj0c3uIt`yGzo?wW~ zJxOX8-WFh{NNpC@lIX#K4cUne$q@{WcG-qpezogqwyxv8&CNi~tLdC|&N>y%)rxvm zH*LExg6dcimKk#!Z6i|aSkaxJ0u;aks0&O=h$3Q?gX)*hR!={>yWlj<`81^1_nSoj z!*Bog|Nfod{WD*C>+P%V(8k$RB<|KhcN!b#RwzL*rcv}QaZRO)Qq@lWX zAy!;+xVo+@1Ofs;F(x+@6ha{q227ligv2pX3@Ab(#7x`_?dzdyYL^gJX2vLHlyk0> zl}nAmd$1mA^|+-wfN2tN z15ROmvQdXQ*8-6GQw~eS+smj=CSoQ=1!Yr4;TGzkOF2O|C|b-LBo~p0#MHO@dA+_o z+;2}-7iB!a<@>-svD$3sI*?6VzqqOhsdTyHTSVc#NP! z$L8^LcW-XfwliwYjxRaTl)U@fB1td{dd0g3#UUY8O)r>-3$oZUrdX;-2rSa^UduGA_|hq zJkC=>Ff-k5??MRkJk17gec?^r9@b}P=-#NOf=Et*Aef7Bo(=}S+wFL>siy9DadB~b zeWT-8rSK9~=8K?+fZ{R_zP-KmsU&0!spf)_a?UyDQVOX7ATqaR2eg8LS)Hb7x8IKw z&0uWeRqLRt+6xj<;v~#v&g2kDluQ;Q3pu%)yFt5lwB>iPs;VKzHk(5RXK)51cfr+q z%@U_F8AElOO17djleG*6gXj?eW4q{acQ}|^YjXtAOY@W?jE4zO$&?n!Rm;=nySqD8 zJy~xQAW`71C+3{1J1}6zYAve3mxQkvhU@FwVOWp%&!;IrdvSBWJ6xR%yX^}GN5rxp zOEm|I{m}Pm-0$$g2i_)VO!#@+{i33CazjC4WF`h?TP_rUh^tKk^FUZ7*13{XlF&(< zKza_r87SCP_Vc{EyMOZJNg_e8D$?jjr4(1wT3wsAS7Av>LqQ_o6cPYibpp_-lJKzZ zqYLB;=8k4)&JK(W?&PKxgoMIj9s#6Q%k^+`b8|k(?d>&FFCzE%yY24q`WN0fIXOXe zMrQ;OaTg{D(gS!({masWZ0rprX0<(k!cYMNv-i?VJ$ORY8MdDMB-Icup8Mss-ZPoN`Ovs$6I-K0SU(B;pxWF&A$0wkm$)DPc(ar1n7 zg7U>*`ML9NfB%E~7f%oGyw$HaKy-ajrGAX>yr8ebWWV#n|M~jGCw5ruDUy-G1^&<2=$NDOu1+8UqKS z3{V_Kgt%UX5a+v{4BgHCZeNj7P*t)Ts<+)ld&epPBHZ5HQVLzaVrCOdu>;4s~@cPD6= zxN2Ujksc96>Q>b(XDE7@592tNQkoyV)t%;Ct+lp8^>8>aX^0yKZQ^=IF!$AFjU*%i z+js;jfgl8QW1!9Yv{^B7snYd2jWK5oaWnK3V~ElgMrPL7EO{Pt&T)wAzU%vRarLOE zef;Ff`PnIen^kaSSwbVGX?n03zJxvhRA$BlGzS5^s!~A%a&V<(B#(G^bKS+%2{Yi5 z=!7;;hZH0-jfXv$x#}v#$5)SDfAsj~`gw}cN;O1An&-*P%xcy4IJj3;t7P2NDR6;}|6bhLkgDy@dlcd-l1 zj6(SNuIClQ@zVQLwOZS&*Wy*dbWta_jhLA)a!PY|sJV?p$rVA7%-cw^MPv|S6zJm9 zJ9=tw|KmTrQ{YVNkDl$nk+tjlzDsXip8U>}LoNA7Kl)BBxs-hu;^k_+y}dr*$*^P# zH9X=HT<_q5$V6qkeeaDoru~7DW9;_BDyBZ?jEJwDUEDpty*$67xT^d4-M8M+c`AWD zu*Kw2j8PS;y14!L>CNT&MP7Ha;6zY_?+@d<@4fTv`(s6U2vT!IWvT?PzxBqaPoJf} zi?M^EtJFcRUDp|C69)s~18eF50EURdl2YpXUQ&z%-D$76q!_1Z631Z}x~^+Fl%HUg zyF0nF2*OKSX(J$1BK6v21P`z6))zu>pkN`Tv|g{z&d!kAF(&Rl=Zc8y^;$$yN=Pxp z)Gp5I2FOG-^sBqO?K|)O9J(P?0w>gFC^M|3qaCTvUn-EOzP-yY48pX+*lI^^ep znqXGhxN#nqtO5iFeSGyOFzP%r_$sZ+c!AAa;{+hLg-BYU;fMRzxAm+?i^M-E-= z$t6#vOcfaNn9nxn?|v&^YhJG`R)eQR85WDWllP4jBT8j__CIk>sVF>6kG#ZJ! zkfS{~rb&ni0vHR3c>oM-LN@37qS^(5R$7b}Ta5Bs~eDL(Iqch0&${e`o&mTAB37gfS5w7MqcLX7Tj4BcP)^S^59T1=#? z0L0;Tw>^LS_++)dyu7@9`kdzKxjf60*Zlg$YcAw5Sl}u|fLtq@*=u}_bntR}cT*Fe zJbv_Id-t`keeLVt{Dva7A7yncV3jB%&g6gV@BHoS+xwhz%{q@084g{l<7}lqAVC$e zvMQ3K2&yEkuBw`Io=gjYk!vn)HqWyox5JH*+|?XasT4p~^Xe)@B)(9x8f*m@GOkIG zmQ)dAlo+Ih5Q2k>h#evJZLbgNOU^Gqsn%*x>&1uzl4~gvh?zqOW9F&UfB5b1{Dptv zUqn-HW;8F}tV*s=o;>}vU;DLR_{KNZr)MW;r@Q?jn^K5f-!J+al;sn4M8tWXUwi%W zr=R?ISoLRTXD@DU-~ZMx2WdcGBdcJFu1uIx8dCflfBmojMCoDXW~89St@Mh_#vuqJ zBQvtJ9nPZG-QV2{L7nHT^Rs{cpZjO6l-C|z5+InR5XW)cY*uB?+uhy8$>!17`Lk!w z$aKHo_9-B`x(UFuXV3ofzxC_WTxzY%fkPB&fp_U}m>xZTy$;qI`XOHn6O&8KIZfA6pUmHmDz zB3-|76Q-_98v|LgeF)p2NAYDKH6e7)gNw^bCOhHI~ zhRK^=p00GfJcBKmUI)YGL`Po+k_)2HVS!pG03cY?9eP_@qq)1f6ZtleAAI)VzC7C5 zaInXR{MnNiPwx-Y7kWB5*}Qoczx8vkc{umX(dM^T_|71&qYovcx_fNiNq;4OyNTqZ z!SDRW|K?s?Y21&w=HUs=?|MstYDbsxD zXr-#7PUVnQ2R;rph=>F@h=joH#5l%T9mB1#nrS^)soxwul&``$?5(5y_q4nfab$)cXvB<@~v-v^IPBg z#iNVTUKukpGd~2a;H%8QCCS5G%}^cMULFzg^7JGIsq=KUUj6*nzy4eQ*KdAse?9GY zeN1RxYmG6Y!|mP8_U7h?Klp<##F<^o3@MD`SjxPu^*8^|zn5aK>SpG!nEMR`kS{M@ z|H`}X^{LzL4=MESs8a<)HgQ)3Mru32<^r-+zs@;=`#jIjK6~*S|I=^${lE7Qm|cDU z{P|PnNGRiediLzuu!?`~SAXT*_ukrWx24P>q*@$6gnO<2@ci1#Fa}t{vH_M*a$CsC zj+Q+;U>8mV*T4LWznWGNX}4alixPvhaBW2sR7b0T#nGKx)PpNJqc6!IEnk2eq(OiK zP(YL>Cr1d3fiVb0p&%HTB9r`Vx(C`4=-1}NZVPMpsO5Wbz&bWDW5d`f`qUDS8@C1U z7{}H0oS^P@$oa$1uD}0--?-VmnC9_*``M=R{eH5uxIR63bh`ReU)x;1_VxZS))$|x z=4~o-(7FlSGcAmcml@Iw}*G$e5<^;Cp$h03`A&NQR^!8_qVrN@{qb>`u?B%=9j+orQiMC z?~eOB)9l%DF5_GdwT@;Z*uU|Y|4no_U2lf<$y{obu)Em?VK23H5F!%D+oBy2tEslQ zrDGHnGbiNK51LDtf(S+8en?#xmoyqi2_&)<$-qk(v6<-tWdNcE4Z&KgnVMGzZO+XG z@rfx(NEB$jUiW?9bsh2ofd+tFl$ldXEff?cws@e; zTrHc~@BQBIUtK=_{onunX_|J2?Jx{6ikZ!|EYyf5ZEt#2g!7BD7cX9nS!2Kcm;U0v z?0~rf$F=61^Hd!Sq)n|>tM!+^^v<`}-(IvlN9X$DbUiYf(2uP#3N@DI0l*ZDA=Z%*ns6H(527=}{kaeM#h@;pjNDG>PPWVPGx zLl~xM`rv~PQc6wq&_J%>WKL%ABlyvu{gprGB}36+l@3$hZx3J=To8eX0#W-E-3icc zpWgO;+H6iQHkXf1be`ut*IW*h5=n24?ku5mq|^;x{kgAy_T|@} znrnS%9h#5#fnm}dM~x7;WcXs4u}F$KOQh3p{`|M5X?JsT-KPtt!4Z%ckqEqHKL`Rj zYO}c!HgAnFx|_F9bR$3{zyK0K0)n^&gg`C;f)I&HSwEX}q{~nt_Vu1s@SF^kh>#x23I-bAvqh~+9Jv>3QGCldhAAR`V z`q8jjfAI^C_aA(Axc=n4KTDBf@x(a9ZiOVOUOG!aW!)%1QbL9Q09P$Xl^ZC)w!Jy zF-9_tF;>-(Vyq>`=%__2lBj9Uc^t>>cI#*lF?dydNl!+swGt!8#3D{S9wwGd7}h5j zA#?0VEJoM4#)hUaeL?{NWEDJ-Q4`^M1R#Ehz;DMMPZ!(UwF9CHUZbAD&*E zdo``{?6V)g_S$P7efm81gL63Ky=Wb}v^hB!E7O>7Z*TAJ?tZ%TF!KW+3tzc*p+gWs zTJ&ZJ+?=d}+?|{cLzl<>-ScZ#d-mkVCC@_)cQ2l6sb`y$@vvjJ{j|S+{%n1++0Wa< z0eAa*^Sa&b*6TG3-QC?XHd{Z#5_U;iLDft46xg-wce^eQ<6$BQUDwZtk%&Z?rR_`F zq{7!}6(!EQ>2|zx_b&D5pcN71^z7=eJKWuE357$airek(?(Xizi<{m3bqLHTM1l~s zv|aPk6+f&X9_Y|*NXpo}(q6G>RED^_&H;DM#YwYGCz1115r`SVu;G;e4G;ne86dKu zqlvMDp%YoFp#W|q2;%K>*TMmu+z6c!2-{2+nb?^<$fJEIgrs0)?rr|+y8d|g!AiHM=d1VLc<0T_H|PECdw+2F#@D{| z+84es9mY>?@8RUlcfR~ixO?iiFYNvXr_s$7biuE(wF6gqG2NQibx&ER(};(;7}Sfz zidHp8*OM-4$*L+$?)c>P_TuXNu$x8DnGLvc=8X_2v|iHzKDoQ$li{G6T~AL>xlXto z^G0sLy_hk=>1vpE`+gX15Bm^edy?Hfmkj3Z@u<^07F(}kw_2g_Nw*5aP-_Vx%=65v z)o$Dm-Ku)t?RJPL(Q}?s3c_qvoAa1hn2DLF$)`-)uCobA?WpUonu)pA93oHCWC(}( z06?qt>5Jz#9J%YdX_^j)!)i0Qd)sO`P>iuLQr$hJelAV~^ITTLsc<5R_jhAVYhr1- zG^}854k#Q5L*I`#H#cWzXJ!Vb(_uV4Tg~$*{4${gj-iyGc6qu{Ez|C>lC)m+hut0k z4*M~rj*z=mn)lm;;$DYg%`8OHki7`dCK-%`h^3Sif~iT8ob%@Ni~$`WPct$Fi5z&z z2QFZs^E7_-o%g=?-S1qUpVet5_b!FQcH46ZjEDU;Fy?s_0!g9dsfqjhzRx+Q7)#Co z5JFtcG)t1Nf;$rt@oE^#JpK67Peg{AXRVcx^Eh=~7g%BlAubUe?MkGo(z_vYj>|@Ce5G#=7MC5kqn5( z?f$h#SKFeGhk+&D-EE_U)77Bk7(&Q7-`(AHL|5l$NxI!(pCrsV*WG@&x>UCif{Q$Q z^e7+Z&H4Gz^|!aTs}y65M09=q{OsfufR0_KAt@3eIuYP83a;hbHi5NjQ6NIFBl7YX zYvY%fm&HoX`O9Da^6l-l{l9#@+plElk=?geM0|T^<~en*W;ZXxnIVUyMzY73kqtjs zmS7ov_CMnJ4-7xbfZ-R94anAu9}M{2;|Bv4Y(N+ovSrVZk~}vyIm2!?o88sjRdsHe zd+#qI{19KBswRgzXq+xooyy9SCwJ`lBG&pXc<;T6~yhXMl%@YO@2Z_UJ_s!c|0D!`Hf#Y zc3ASW7oT1{cz%6c#FN2Er*^oUVmobHCe5bZZYP2=UYCPFIaYW%fE}n9m3cqyFAlfM ziE2t~Y^IaYj0)xi`RQMMIH?_PPmdlv+_fp;&%gFHKQ8BLa-OCYT%7mG;C~Gt?U&L% ztvf`q-_Ofw`{a|4ck{)=XAf_#@0wZ%O(pty4u!Y}_@3j5L1++0+hRkSiU~2bRIv;( z+dX{n^x?zDf|YOqce`Enf4*)7A^gRxoU_h*WM&i`SseS^UtH|luqZf zm)pB0WD`xW7?{wSlm(bXfDn2B0uPQ_mSeYAE>BG;M(DBt_jY+o(RN|KEXNv2?-+rs zp3$>MMic;gtVYKKr>H!{eUIbG4%k~=PkEzi{G1V)rwqj5V)>0(ueLj1pWX56xBd2S zeeW<$BBqa?Jv;S$@#B~OGkh^rT-`Y#&_O*{xn{b$2)99bZ!9&B%uHWkP!H+ zYjnRup1_8-=-#sjU*Dc`T~D8Wiq}^u&1`>I-FDO6NDAe>7c`h5F-^Ah^|X2(PkM2A zT$kJ1+lbiKrA3z%B$YCmK%ip2t@}3p*?^U%;(_Qa=^yTifZCiA|ySp>wvMgZC^9-K(bEV!KM%+|oB9Ivwd1g?a zR|KVyeqax3?m4cX#I@hl@*6 znF5zkQj|FfHB&@rs?EYhMXaw25@KF?!PnQfm%I6Rx?4}j%fqzxevgmIGg5;YyUDJu zu3@{-+50w$PAa)=pysxs&l*CC(u7TD$Kxp_OvdOGfQgF8G)+noNK@M~s96aI001BW zNkl8okN~ok{uN{ZGP{Ez4XKZS~MO zB>rEKv4?vnEg-^ndwaF6C$bTd;RxTBHKyJD0bKG;SE3Z50+Ld=Z7m#=<}?{#|;d`r@NmZYFsg zlFXDM^8^J-Ldz~MEN?2wD9;o|`dnm%o9Wn5Ldw?h_Q$9%Z?lsb#{k>1u{_NuL?66;TcXRc6a_kS9vw6|YpyyiwLn0U#7Z>Yk zY1X!7UHkTxuYBcrJjxbCT0+Z$tV&f8dGz2>U$=|>jA>@#*^{Ri`^#5fd{JRFBzG4F zUAMJwop!O`pH8QTk00%(-Rqm{yXCYji|qF|$GfMGpKRN9dwY9%d0=9m8-OQI9xtc6 zY8%I~ORT(h%DM(4D(*}iRLc3f{8DBe34QeF(SE0wb&PRp+F*@= zE-6gVFdbB>78@hdCjt?|X8YZIInR3&vxa$^T5Idld++=G?#vzx;7gx_A)~v0^ZS#` zt<9(7ww?Ikuy01@GEZEO*A#SUgC!;^n4-|}_li8q5%f~1jbt!IrLy7!_u2C2aFMcW zKuFZ75P#i)qYmE^#>QrfK$!!*1Vu zzqn{|I+FbK(@*!$o^9zLe)!=uO<#QW;_1_;r<>bt+g`qWX(A6FTztuveGXc@4_X;A zs}fgb{ftMFQDN&yO)8u}|M|~9d->UZzyI0Kes*8NaFaK5>Hbvmy9{0IN?8()9#ll4v*-cO%=+MAs5 zcZJ1+ls>``PoF$lxA^4qkM?c4e)+|5@du9{v9Ay2_HaL6ZOdUk9CowW{KXenAAImr zQCE)6yAE8nzH#^TjNWaU=V`WSR#g#W5L7}?+hPd83}``e+LL-sr3 z>II_JoK|`~1fe>C?%~Nv*d`5chu!7Nmsg+s{6&vjGa&jr&!^LAJ#F(mm-}wCU~he{ z(vbXxl7z#4A1>Q5KKj{*AAI=ZPhWh*=SJU)it7|Hr#S203=Mcq#ziU%xTbFK%CN~O zYTu9><}Vj$c?)Cv_HzBLxD{3qiHMj^yN20fvT&*6=s@MfUmI?Y9Ndg?NmNy0g|G8X z5OL+D=GL+C&;IoPUSZniO#AcOr+@nC-M|04>(ys}^p*TM?9qE)dH!z35B~7|KltMp zfB3JyW8+LLEA$ML#H@40Q^cfG&5c}bCEQ%QICJ`@BW?LZl|iJHQzq z{p8~E^7i`X!w-Mj2mtTA^PGsjZlejUo^D8~g;EYyQSkgK69^G0bY=(`6cVB;Ht%*B z)JYGA!%u(u)9-)(kJi4Nhrd!nqj%r^+Hd~mZ@%~5dtZEh4H&~HB$_}qjVTNrH<>8( zc0t9OXnyy*-#x9%=byg#{PR!YE5#*yWXSo=l4pL{2*gJHkpL3i`|0@j;?a6M0n4<% zoP_%}P1XQ89oLs%y#C>z{TaB82OC-%6_I(KFAo=+NAJBywl*`fuUp0uY)S~rjN9tP zd+*)nAOHNrufF^IxV(D)^!fWgdVe>!({l4BOa2#ggymOcN`7fM^Y&%%*=H}*nDFkK zsv+~{=Bl;5YLDm<$jWX>R<5^*sAwQl>ck>QX1YS5isUruJhyOdZT|B=`{AGb$)6%l z&G^YQZE`TPIzcfa$^@7>;9|IdH+zy6269>0BY$vDQcY`&d*UHXdk1QO_A zh@{DEt$}uQSw&x5eg5@tK6w9=>&pih*PGMYqemB-(9YJOoh4N1NWI*j`f2sm5DzZx z$)iU<_@h6*y}fOhdr$>pT5tO%Z4Q(7-+%vmzwv87`~2mpZ%-~RL}XohMwnTp7wvXC z&)j-HuFJ*LUR}MuyuAGU^Ut4r?WU%veO^UskpgAgH9QG-Suv0ON#U`p`{6NZRfUEjX{{*S)-?eD&R^~v$> z`q6`Z_O%2X0E#18C*+zmKYR4>>hR=?k0T;E>Z-d-OLhu&8r z4u{?C-OZ!N^DhQ8pM#pp>Y~)}6dBjGdo*oEbxDDnwBvd@9oNI*^6As(iB;5><#yW5 zl~~Jo)1C2`x}G|A0g{XwUtPBS&CBa)+Ff2gl*I9LcXzzHyIYr=KQlAnRB)1*RW2s16S?vnax@;} zoI{y!C9f7VvQkIySMQ19Tiu_~BD42xvE};T`^K|}m)A3d{`@B&zZB&b`pJtILVf!D zo7?p5Pw{ZKyL|WA{;->V^wYoi=?Cxs^soNEOFaM0-+714V$0t9=BKSM2i1t6cL)4F zX-<&q`rz`>zx7+c{y+W0-@gtyJbU;3pMLc0-LHN6#b*FyWAV-yaOB2xz5CA({g?DFaFs-+wG<;oP>#FI>||>k`(E$UjMiM;Jo~LvXh=ggLOpvisze(T z5rw@I^yTr>Z~WK)%|E)md9~j)lX&^Xi~X$IwxQ_k_1uA=NFq+#WNlqnGrPLFUe~@X zulBo(%gcv1H@AItwMo#{?ey^C@o#_kcm9X}{(l6w(q8r6BYMqBzW@F2fAPhuci;W$ zWG$SglZj^c$(qVE>8|P2*v7~lFl}G^>aRsEyWOL0 zRrGps2H$j?^(6}eX-v^5wX2*5_ci7||MGOY6Ee58-yP%brr+IduV448*SNduH?NkL zuh*+r+wDz1-o|o@?UcU4H|B`tl$B_E-PYzxTZ- z@%ni6>CNf-_H=VvPa=(EgD^!C3RRh?^BUqZZ?L=I-4fTQ?dG)I1b%jVy6V2%t;c2S zJt9%G*R|l_@J!dt!LViS+cb$BbUIA)18ciNkkB9!%C+b1db(S;HS*N^U0+|V+lF8d zWj2+=H0|bjr#eqI&+{}*9lf7>>;?GZbUd#8?(Xh%T6^#5l_Q?BwPtdd+J2t)t<6nM zwDNE+9y|;&hviKskM2wd9r!ZNwo>{bh?T3-cPAcf_aXT*CY4IN6D@G=@niT)G%VGuRQG zjPgv(CXXNPp1neh3}n_6e1KCC=M8J5JJw@fW!qnT>%yL@zJ9dp4bS)c zfBIL8={Fud_{!DIC%3mRw{=<9+wiWcnK2tR`?jrHZp(IBw^QUsNx)fw>hRHW5f-qZ zrnhV@xa+yw*2B8(oOgYb$lDBKE)qSplaXQdyzA)5!9r9>6EUG0RYC=gn1GgbLy)zw zLF7g>kkk`4snaD=>$VV{mANaK;*w|?05d!@XT~Pp1Qq{YlvyeE>)RHtkpl*q=eCd5}DlktJkf>jfik5VNM2Vtm5H)`2E7TLN z6odo9NEG-t0i>FfsX_I$RAJ@+6wHDJF%xN;T7j5GX;e$G6bb6N^iW7gQYy&>nl*_} zv4CbF!%a*1(*+q$%*<6WH8iIR-3G;N3HxAn~SGy8JDtDAp!W;rjNmz2uHp|Yq z6V~ThI8p4(oEL?*)Ef9YD1q>MaGMH~La88hf{e^;Y+N-@8H=;e;sQ_iu#gPem)3)n z1bczKg{dM&&z|s*4$agkhh@S8J>g70?}cii?#aTqqvDv7K5|m=ru0-48<_5%>k-+f zY4_g#@bq9;TYvg&`i&>^KmGBGAAEE*KmPjs?so&atjF#*pMUm~TwnidU%&j@-+avN z?$}4a)8UXrMlGK>2+p3#&K_d~rXs3FHBn0gc8#kunn;Qg9n!%_u5XFC0WC5U$*Hx8 zoYW>QY-q{h;o(9NQ_E~Xq^qQ@F{QB-i|HmhshOydqa&@1>>OuPMmCXI%+1qMF*=mO zW7|FYLgYLrU_^!V@+}7pNzU`^NcUuhhujY>R264lN12JtCP0v$1~)|D{H`T3&6?>{ zzO%FLE6NO;RFQMoBQ=BIFNiZl#7g~xaL_1ILPY9Tw}SR^Ahwfbp~*NXzFJcuMjsHF;#7~EVQy8*trh(MbIz+0#QY#`Ol+KzknNpglNi$4J+sUMmMo~~hiX<;d^(qjB zT2>%Q^+bpz)S)RNArwkW4Qv}o2?ZsXlgI4diJo?Wm^$M=3h6DK*MQpzSf7W%-9wp5 znbR64(*tF0(kM-}ko9I%qbWoKR_fhkRGMLAA{1l@J)(5W@JhgdNUq%Oe7*JUL1w3~ z@O8vmf2r#k;~5UTX`q~kTf`Q*MXnyJ$KtVgtPyL*#v*AHd~yh}3K@dPj_eto;Y_bK zZFD^~O@b0p?W{7BuxWm_J8(BYr#|@B<-hsf{O2!jKKSC}t5xH)sxN=*-T0ed`}TJp zp`Bj(-Rab?j>~cDCp4NU>Q$jr6gB&BM-r()rwp-^G+3vR`_#_lB#kraMs+-BD+XL0Xbk&6EVwFY-VO{GHcD+0C3%Bn z$vjbwI;BjZHV(iQ-C3Hw5wBK65vME(XIi43`H%r2q_J>3kyvu;efH)^7f+BK!jTH56ur6Tg)W4V2Aw!7chsG$?mnS@XiWGd()wPh&6cY}e6PO7wwDXdEd zrM|)uDPv7uhaEwkwrHl4Ni&&Mn&?Cpe>OxI44{cdSSYV3hK!nQTA{UHYz>+nH%ycle0ym|!95c#czRVmuWapS7w1B$nuqoY_9$CH9nuwX` zjJDTyuxYZX(TuIp6ly72S?JI@f$Na*jHDk71VVw^=9xr6Pty;EI>=qFwseMQXQQ=X=ZB8Nvi-?FeF{YSFhHlTq~pQ zP$n}|BgYLyMMU8lV`r@pFhUaIsM0fuz$n(lRK!e$DJo_qW-oFLgyCm>TBc-$&yM7T zbBYk|`4xaM^c7ZJ$xC<$1lsGd(5wP>egMZsGs+B})G8m~x8wv-8+RCdOBV$)Qkw$PR|Fu+bA z5llzWhYyyiB7{ps-LEt|A#ie;`|`PQsQV}xfE#@&0Mdv5FT>Snun zeSH1;`08`6ORT5dmhfWJ`S2c$fmt$_HE>NPyv`nyZ4wlyr4kny4u!s_1Y|i?V_bGa{;WP-w{1;H5tZ zVWMfZ`!Y`xNHB|wTp@NAN;P(}L8VSf6*H77R!B3|!R}E}s5$8w+t#;jvq=m3mA$J@ zqx2x78ow{+FO#eVYDPb2W_!k%Ue|#ugPuy62}=^;ksEW(NYPdYAVL#R$Oy&KVglET zCKMx;63mF~b^VGK**cgmdTzw(>sh(I!qm!$R%t>TCMP%$l0YTOgqjG#Go6TPK$T(x zfUQDlX)J1d4DVt&xD(}Lpc3f=DXcWADm+8rD%uo&PEAIR@LYswuZWEhLz><@kOV?k zbwWXkkyOZ()SzOjj^9KyM5#tmsKJ!Nb8a$mkNXo4QlKqLLR?Hh8S8jD+@Zjf;%sTO z=$?H@XClV!fK)QyjDFrOJ>cB61)!-R!|fnbiiEVpBr-L$hStV8q2kt~22TS92zv1& zLZl^>^iuy+S^={ORQfTFx9i=N9UfTQF*fwKGuPEq5cKRG>=CDRxxT%7`TBT$wY++L zeEHJvZrQi=HT#y)GaP4=dKULR#@un7Hr+ElvP3rNXSZo)clXVucQ8YuaxFZ4*__=q zHut_o-y(WuM|kCbYno6%Ut`^T-Fyv}YF9iXJew%8WoWJXlLj_QLn>fJG>bqfaFuEB ztf?$J(2+?*(vbsJDUi25Ad+V~N0j}A6hUO7`p>de)g5oV^Xh@LN)I6} zg@w-ynhinox%bf~tt@L9bOz|e#)Qx~pm!8VptwmCDqzWCHYr(yfe@p31Ut&kFwpLu zih}R3B1|C_y2{WA&MAPN{Xxsm4vR@Kn;frqXmwe!(*Ik7!F#No*OOsmP3!5V1-Zr5B$HOlg>uXr`&zr52dQ@i^aU zIEa{K$FE`}Pz~9KwbU`JA#2zlVmSuNW|$gm3Y#etXc<~&1_?{`%%0hhTbZ_!6+f6z z0j!=Og^pa&Prfa^ukP;NQ`%c&W;s(7%XMC1Dh3+3A#3;^?zxRK)VY7J=%)Ig1CkjT z9ASZH`BGIVueA|9qOi>)JUY_1*x2d0dY9-Cy+?Rv6#9om5}I3Dkau^AUJ)yby0k+IwvIGKAdU7`os6Q-JwO!Y*D)@0GCX%XsU zOk1x01f)V<6jU`swWI=C+j?q>m}VASpi?W81bQr)fG*g{<6Ms+v(Vr@MPpnztsD zq7@^Stdo8wa$QdeOB&TgD&HnDy!YZJXcdNmZWWCPnKxNy001BWNkl4X;P?mKHy{mP7z~>n6;W z9COejR1@LsVlwULLo>@@c%5J?P6m{*jH?0gDi77xG|nL}XoHZVDWz!?Dl{Msm}_cw zYFlk4&Jh6>)f0nC8#($Z1RS#ELHD(UJ!|CQN~f?*rD8WsV<_%20Xw)v_Oc|1IC4%f zKvF}@6(A!cn9(zHf0&zSQ?v>D9j9qhRgPTTw+>uV*Y`OyS9yMyOKZ})v>dDy#)#}H zEj34c&KoCK-h(?h(ogXwvSPdpm0mM^ARd`s(S)9(;Ead-m6dCtka%9s31E>(*BWJe z=N6eENTlosA9CQhgOp^DDp_}Khbof+R2pM73C?q@Q>F{N(%r|@Ig=5}7*9l8ScwNz zg3zQ#HS=U>sbz-Uv3zahK#B~VcO8aO(o{zdBnBiU-xlD%LBr&iRIBF{dhmP*sNa#X zUgbH_SOE#Iherm(2H#T%5wG5hupYwEC=v7k6Q0m%cZjqM%bJq{f$|QnrC=P6;v|Kc zJ}?I72g&dLk-jVq$$iD0!NC9HtH&v;gNNUO;q@^mW zq@;PB%_)^RX2Q%`KT>MF?Yz%HclUCil#S<{0z$$vLsbUwwWQ~7N{^iVa+-0D+a=ya z+l?}f9QU#NQZ;5N5pga=MWY|M?SdZG{Fl`5s;*7?z{!va38E($5o!sCM-kDhhI%4u zVLG0Oj^~%q?3LF>l;`z6Dx6Z8233#Sxl&|$P4H`Nf4>H4n1nt!_QDuL>jXp5E!k)j zFp+KW94wI;H3*P0l?T;BkRoZ~s?N4Ss*hhW?{L`ZtgR9p!Z!g_8H7Ws^c3LODQis} zz(6_~!cdE97XUgZV5aPV$)TAP4=AY`t@Wm`WYMNTu(Vqh>m2El*=WezKo245WFVD7 z3L~p9BSa7gPa>6)5eQ}~Z5*S>Db3iFni0_>x)YdVwwx@bHrokwNnxs>OC%LQgBYlp z7Lf2#+TLfzGpQjSNkV$Xo=YigltM)l&XXMW?Qo%o2h-&PJ6ue=19hUdw@S~ZkVGoe z1Wh?N-Otmqn-3TLbf^2BZoBLw|Bn@YGr}kCcXnla)6wwVd)({#x_7WcfE4Pv8pW_O zQ&4nwo9n>wXsPNq&h0Z&M#*VwL|5fY<>d8RM~VH;gQT-h5fMp#DKqbU@~SBF+BCiKrjCKM1SN7v zw@6iZ568BJ*NjF{tv$~_{d38y>86&x=v*7CkK);usnzdkjyb22QBEsbJz_92s0hm@ zL$sD!4Q=IOrWnOCT4ENo8Y zt5Z=)z*3yB6neEhWT4knp74@NhXtrQ0nkKC?3}y6&Qod)0ZXB}i8rD8xR4xDh|H)_ zX`U}&01+5MnR1y%WQ2@uZpl-HsR?)wCNqU84XQK^VGtd&v`Jd@+)kTs-KdSTZN{u~ zZMuZG3zHFMQ=W$~g^?FedQwo4=4Y)v6tpZ=yGT-!Oe#%HgxQ$Qa=+7y%iYBTySQlk zgUx$Pv+C}x(o-E53j;Tq_MPl^x*Xc&<-FW&rwiXsF(QuxAfuN8aU6~kSuIaR6qX{N z=W8lsbageksS<7@)zKeZ`0HihzcKzgj7}#s8aD<6@LgBHbu#idR32DmpP>jp&(13 z@y6X(LyysZG9WS{lt$|!3^FAXj2e~WEda`w6OGPY&s!(1Y^~KIsdlXq5J5QIw;{I= zi~>3&f>nPb>GxcS3=s`fXM{1f7D-4()WTiv$t!t(Ag*um{H@fnG5Rpq4|QUUlB?s$ zKOkpOu;HZC@G$D6t%=MKh8xAATc)N9Fp0D*cbLWCJhqA%rq$1@VZ<^!UpP=%_i1lggXlS~t5Y|)RK zZ=q0C4QCA?gONrhBFaRf!6;Tn#coMB2emYTIz-DGGi^bvO86CMsx1r|N>`I<#$hk} zgY6GC?X=BVF3-2So~WCTo5*DJru*5p-LxF~ve&!4EPJk7ZYQ`QhAoSkXFT*h`A7&$ zM70@bn4x6Go7z!x51gaRtGtK+THwSypTGDkD%Tr(Zk;8d<%H_eYZ?_2;R9zj$f1dX z1u&ruKvs|XBOM%%ID7viIR*ro?wP2fUP8Q}kCv;B>eaK9e}%Z;ECQ9Bi2*nnw=y4X z)|--1M9zey$oSSqTxLC=xPRM2g+4CC5p#SFM681slZC+H*<*E|C|d*Ox4NE+5J&)~ z6Gz=gokv-%Yh=y4a`?32An1v$l<1Oj7H?wA5g?Iu;5d(I80GxFZ+y;YD54hPZ(*f! zl$9EMU@Tu!h(Hh#8K^fBYi5SZ_7edG-4YtXWJ@7+3or}71u6SPkU zhD`3QMW%!n@0+Gnrsme87}!}hq14){lGX^M1dy~!giT0nBsg`M9fwW!TkbkEm=KqA zB9RX9NHz&cXzf8g%Ge>5+s3@ByufO4gHmt8q*T2YO)#M6El(3G47)-kOxBDwbA>pB zWs*{^&@HuAvy-L-wah}9DGD#HBLtEz03$W-(aES5dF;e7+WrhGwBDdf7_`B_uF}oi zTDFPP%r>!2kcn)d{sONDh}uc2u!%N}CN?!|OX{rb zh&&6qi%fpTM3FLYCEs)nb-|tIwVA+lKJ?|-6Ue!-;BYjQlx8SX)68mvlZ*(-`#x;| zWb=FxCh8zXE1uJ^r4UHZk;9nsc2g4^37*7#>A64k;;k!uXw!)#OT%(*UJy0ePl&YA zy^rbS7`fq$j2rD;AeqJNu1GaYc#K1;PW!M{$ znIhv3rsK)KjeSA}L{v&m5G;&|rIwD%$dIs z)i7q1ptR0D1+ou#QWEKAgWs&#Rl33zF6bC%{-|k4iDe<2ra%eXk;*e&4-|=U9L+aK z{b75qT#4$5>YMe<+L%>sjV>3q~3$bL~qAiS)E z%s{=pH`Ow{Ad)D@!%gu~bn zlDuCm+|TkV&W_{Bm2NmS!zfnoSLP%l5mp1gvPT6~tan$DGv5;^q1{N&rEE|ab|6Hv ziDC)YQKNKZ?uPfswzGgrj#ge$hD6=R%_ap_`=s>Bjk2Ug>|A%wDYa%`E4vIEQA%WX zl1id`M}st_2`FBDc0?ve>rOGJQ9=Of+M|FvzIkpv*N%wphzQjt(;mhqOL&eF;b4Q7FunpN?r^YCnF6_ zs6rDFYO(e_zhtC{dT&89G92D>TYX*na_Z~J*EPClcX*Ve<-9#VAE215rI}8Zj{wa# z!Xty$Bvc46r_oii@io1OfrawkTi7}T-q}gAt1Y{ zc?8oT^in1#ge|rdLPW9-FP;)qYR{z#J2bO_ zGk`=dO&F-CR9XZ8Yje$vcs@S@Fe-bmcB2M_160RoHVvgo6s?MxB6Kql3o;OHYoEqU zDScheV%GF6JEVz1IAa3LDzrXEM2CoRIYN=w-gUmb?=R8R0{~`87m~|F1>VNlpzM)mhdI#d4fw49?{nvC*@>)_wFfh z4UvW3(>Ju$v(p?5RZw$AHmBeuxMj8tqwgV3w!NCu@-Jmt|Yl-o5l`gZ3+yV4}_|c~(|V^8Yt>W=nD;Np{uM z%-kary>ZC@|2#fWgj0=-a5vLs9@HX%>K=*^kCjF_J3wYnKW9 zmCO|gk-iI30wNQ#0@Z=5j6ub*c!OO3y>dZR=l`uKDQV-j$wg#jlxYm9LQ!|v&khpf zz~CB%5>xJam&{AZQi6R)TNMB~BfuwE3V^6%nA4THqG+tjHr+Z`Ld@2S1@W9IPOWKxp-{EixTY@Y|bgNFcsL?YAJ*?lu{ z5vsxxNsXD^vH~rN@K#;XH%T`$odPP^4YP!KZ@fGKH3Jsr1;o(|BvAt);Vz>I2@CBp zKq6%Ln-sHGX@p3DhX}_WYrhT5TUNHI>_}8EKN5jDS0uy|07cOKq5_#Qi5xIp2sDsF zBzY|-2@*;a+WB#t;K@Z$Q4(TIp+JCSPT)u;Y{V+bV3?7~MbBY@K#uSAEkYC^T>!0~ z8A8Zh$p@*GwHla+&Im-H^o!6FwGsmX@RfDM!P=L;$Meb~*fA|v;*78xCg6e}`bY;@ zK+ZMXO^=Cayaw^${)2nR?ihx=pX-SwhuN0*I=`C}AeVO~Fjn|$g(VGUa@>#lJ*;&= zh^X|0jltuz^Kf(d>*O(#i6`g7NVWk2(@1!g|iTJFo- zJt7E2q($qD0+b8a?oq1c0bo(0Mp%f#$nZ$d??5huH>EHD+;>)HRJtm$kTfK%9Jd54 zN*e(G_mvAA(#yj0&fBROFhxXNWl`uZDel%z>4<>bH?<}=Bw;B|R_#Xt35CJZux5MJ zqdP}!6P1(M0an;;F#`-R0aS!K5i_goyA|PiUqjB;8Z;oj17=n*HOu$>s16xKHL&^) z583wR9pq4}?UGJsxxR{giof)rNb#;g$QqCkPCMLiTQqBVfxr<(4v13K@ZQ!}@H58V zpM8rMD}AFL{#eRP3Z@_cB2EVIt!PhRPzDkdLSUl0+}#7=jccGJWJpSC0P-Fiyk!D_ zh^k8YOOzBl0*+`VWkRAPD1hP~Uvm+f5&#V|(1HR20z43i2}HPLi1nss1ZOA-m98;z zH(c+9YNc2J?}A=3B#1pEzzlHA4C+Dz%(M@Gm}Rd4ApoKfx2TgNrVxRn?Ge^q9BplA zWRRCS5Czi_y=3DnC`dxGyi#7Q9nK5VGH1F62NkW)(9MER?yV{8WK=){W>(${>`nYA zt7~Q&5;AQQqG9;52p3@_5UhBxJ+H(BOvOE@Eu1uNQzmfD+R=dkDHua^Q8ylw^iFvt zU&$|!8{|e(O7K5*J)G$g=#dfN0ht(CIy53-RTu{Vpa(D@np3{P_l0X&^kb&RZ9SJ|0&js*81o)l~5&-!2{#0;P#11E=9T=J5p4&^|2?@jrOiHXwx|gX0DFAG#p3<`! zh(k-@KyXMRVCLeey(LBAPH#<5ZWjfBCW?T>+ar>{pjM-6wI|Vx7_dIt9 z1c$H$-=v~;3JNnLF#s5p$qtdBK~P%ags^gqRO`A3cjF03Th-}MSgBG~1tB9?L;{i{ zCP`9e?AbOU1OL2VIo)Q$%1A1lNgyy|4;|1s5YYjhIsjx-&XO6{KbLizxP?%CpGv4q zY_(Lza784p>XMlbk&x&$CIBENq8)h8$l-*6ZV-s!HGprD&~B0!$Se8j@@#v%B%pG zjtCBDkbop8%E!stT0ck|AS$3`B*1i!J(7s@FrRT>>6Ae!gsl;viZwBCFaV=Kl+v?; zu=X*yrI2h^4g#knGwXWYVYb$?3=i;x>T7|EdP<1IBqFU2QxTDYt(6`Jg(_%xS$^{mMMh&de;~s^o0HCVgW@Z+1&NY37C#Q%s;ilSHYKh>9 z2pUNSYAFU1pi!Ia)G9sun%oNJSZlo-s9(K|Cbsp4`@ydQQ~;1V+E*ct2w#R0>4J9v z8fP@b-b6%*kXf=2C(V-=a)1jzp$tj-#iXuz|NF3nx?wWKkuo-y=+=(^CXKHznqF_B@F(Pe+ zyT^SYq-S|f0SF~M9fdkthNY)RU@i}fG|)CmhG-~_D;8S8W~_Q>ix4AbdYA`*2Njh8g;=Rzoy_bL!T_$qatH;p zvqaF-2?7s-GxH<(htd=HL~8h_16NRFrlUJJ0HjbVV{h#*KbVnKz#h1kFQWt$7S0Mf z-0HLp$YAW4nA`S}@heFBU3$_p+|As);QwzMQ&HFyz5HC6n2XXe->Z>Y?**nOc-Wfj zhU<=bg%t~?Za&UTG>7S#h^!*2+B1+mK^IOBNRfux+T)Y^XycGJkT?-MF%hmc_rf?c z-R8XROLNXxS2BW#u#S$Ld6`WM(o7)c*4xp?<2=tp2a57>c!aM=U(sW|o)=#C^~7X~ z<-ifEpp`^QNX)F->Q4=W%`5`kvm()Y?_(VGQy>iV@7W0?W#Mv&5jX&>zLreL_mHtT zZGqL-L<9g5N-~Y%RFO-*e7*g?k{T6H)je8l#UfL{`frvvJ3Z`YwFbYG5a0kG|9WG2lRJsyKH0;z4mP4>H6C*O2q*G3`r~Bn@iM9Sk zl+M&KSvg?^pgAdNBUNU^FfdDZv_khQaYr7^tti+Wcdpy*?Oa0?SSUextwfBkTwkm| zWqpM{8$F313Y5Q>9*lt6s0TqXhHCWIRE!yVr?tQ%-7pcA2_bkVV1WBO4o+(5ywm@_ z12Qsp{6#oqgqfE&eG_p?*u#X34t3TGrp86~DyKsN1Vmu{|MQmndc9t7zhJGjm6@%L zQm>iCy_S10t8nZ606<&O)|}T0NR`fg=;vQ)j6M$OgIJNb4duG7KmfOhaGTfll;@Y+ zH`|>EKq5^+!~m~*U2{!KNMhFBj~|bZ^L&hU5Ht5P5HP^zT(A52v$H&P^sk>!^99Su z)wd==n7Qj{tsTcvse$e}=d3n_NqZmXd7kIldnc5n0EG&)Et%!FOo2!u(i0=zDo5Nd z0;DVos#{r{iBO8P;O_Ueu4_J@&)4f(YgL^27~|tOj?ud4CM*DXLL_^V1J^#WMwq{o zJ-)pfWn29wIn=m80_0B4KTUb6@ln;CLW78i?tb65J!7IpPrEJ(Ke?Tc@pwG63#nkF zO}E#wpD+8m;WF|VM`K120m_J2HqE9(wkAjG=XoB-!K}Wlk~!ihM1*I6q8{UTjBy^U ziiqy%m%-0xD%x6#N}Z3t4H`Jc;3g!vm0kcDn2vtM{akabbvrmAq8uzuj((^rhS;3+ zG`R_{j0lHhmDU7>BPaJ>`@2 zhaP|J{3*$xy%DfvgNc6O`lrpWwQigi!HB}zMVc5SE{kaglL(Kls*DNlU^8ujO+^vy z%qPo1e2_E&qPW9eemCI(dubKN160EBT2z)UbY zkE7A+=RZk)9G@TLi5`$1UVRk@#^y?WW3^E5TY-!a-)_*{QI#2i5b^H#t5>RpCL+^b z9VcWaqf^2=R(iOj6WasGIG zJRYA-6iHCKsw#`G_5Aszt@Y#ZWd{G7&Cr&a71V-MnDy-E7~^rA<2;0TS*$tlIei7I zoa20aetevdHoBl1x^!|3ObW>F!%Cf@e5ZqAByM~%B?wXXb9|hS!rHf5k|3*I38_M%57vbGVVx|KSMIJ#6 z2>*WILaJ9-?sa#6y>RxJoc>CC5t^N?e}0@FpPxEZdy5F0KELku2hX1ZuazF7HxVLM zq;z*NwP+DO#u#HfK92J|nR&YL-Rz$9Q_al6Q?Q-K`EeW{5A6*T+;hI}_yh9~l%EKu7Kk`w6Qi7 zr3i|JB)Xnq_Y#rE7>(PyZNBnoeO{Eq;TgW7)UyCdO7er--=zJuo&RX(|NP)jatdT1 zVku|(7hHcN{9$>+x}6!MaT~~u(C7VJ`MSqws?-@vb&*W41tKH|$tm(dbRa1b zq2Dy0Ub9$`geQPF&tOmL2+dO{N*0(w$)#QXP0dUgfk6yRsgj`(kxYjuLKJbDyw*PX z7RW|eKxUMFCbLpowkroAcIZ;+FJqS;gp6=24pNn*+|=&^gXbIQNkw2P?M`4u9qxo_ zUH8||Km4EnbnfUb#jsJW(qry(mmU$3rk#i|>AvsR>)t8jW3<2goyKU#sjV?fZdNxA zGXTgivw2@H`ufuI9COY&1Av*ex7Lqfd`!RBd_8Xf64o)!kMr?(eD>a11@O%$b8qA9 z9MZ+S`$1-fHX`+Gjh*5K?rYoBW@)e%}2QGo$p@_&mFG z&CFQYe~`a?-3CBI8Y7F5PNttA7vPuUSJ-s$-D$Qa?IHc|^6|fp<3D=;htdZ^2Twyp zNz4iP1@V#aNjQ0ZB?@XsRwN3J95>NY_r;3sZ0DgwWDCB28a$VpAUY4|KWO~D>8T(P zVb{~JC1Ea3Xn+mrLNZWjES_h0_oXq3D5e<>9Qk`91t6CN89})gMobV&``X+}`uAjW zr%FW44BWDsdzEdN`mMFD->aDJ+zE{tZn^s)-=&9{m@EC^S3qHfE4=SuhyX|>=JSH_ zpz))Be7QTnOAj(J(sHx;EeMc0?IXavSHG?*J=nYa_#3v?`=PxdD-b3!BCWMD1H#r? z+z0m7UdLLiP60LS)i#oFF29%E*F;1j>Aj!lKAjM2)FCG`&26o59{oJ7>(bWDY|d$B z5rIz^|2Y=)JkHS`ojPZU(&|8JDG#QD^lW~aV8aIZH)$Vj^d=-|V3YFU_?7%bcgaju zInJStGcyT~NZ(rtwc$x3;H@S6larh~hdkbAPns?``~tp8un_e+Ydb zbX=7*lmZLmiS!fr3*?5l4rHhs1ex5iFSNz(OIgNfM{h)E6Yw+Eli+3shK~I&Jbtj8 z80;P(r`pSHke@+cf*0eBWWb;(2|e(U{CDX8(D66LzmPM8wlq(J~ViSDcKZ*=^tL2cHM35MN%_6^JoA(|v zqo~W=d{LWpJlj2YXU?qJi#=oS?J<2{*+iJombW=0qOouvd34m)+7Rstw26jT@m+$zNENs7r*xMp zK>N@fvDO;5o_DX3$0#Clv_8gYO_-VZcmLz;X~zo^z+fRiyXq4>7*ChgW_tqJOf!eH)XEUv(_51 z2f;zgI#jxlU|}P`L4F)He@_8!+Q-l?#mr9+yy)nGBkz}zqY&uPdRKjP9SXe?!?whM z9ppqlxqtMygMd>r{*ru(s!}34;=(vPJOQ5&<^Z6L$53h2^&l^`JLY5vY%B!q9=eEL z;4AvY^OCh3-o#L5ZbQdk$N7)Z{;usWf{%p$CJZE_A>6<}gr6W2+1^}0W+KXDcXcy& zXCzhaqKN25c)4FJvmqijXb)|l%7dIZBJ5gza16``(8eN%vFePr-gk3`{CYOv-{(JO_cm00)Zz2j7D8eCJ$9A)kqekdq*3 z{_ey4tt+8=h3>wlueB--nNg~jRMjQ~Oq3A_O8hSsCN_8}|Gnt^{`c>glKmX2%oHpb z<{majW@a^m^_l<1{(+xg_ge1r#_%D097jI~HX)T7=le3eJZ98Q<*X#kC>Uv0dbywk zOJhM6K?UZW>QmJxJXd-WNK`g(4I;kbnLEWR-4U_AeE>-F zIWNCmOb8eo$e}VA8wEy0)XRvM(_}Ug7jnRqOi6;2aP=I950X#91KX#d{Fb?HHQ-2( zH25A9zZVm!%4ZiyTbzV2N~z-!jCAAq~`l)$jM^u4yojjE0;`5Gc|l^(%& zj!FS}BQreUJJ$@MZhJ(`ur~yo01@5||7P%QSsGv>F;bQ~&^Lrh*%47#q$TpU#w7;6 zi$ceTlS0Yku*=CT1L z1f*^#M*db>qNJGr?NO@~58?H$^IcE9GDGT-D@gg>;+AX2{hOIz`?=R`W|3rfJoLZ1SKIo*MlQZ^xmtlW^SFv?xdB7(STbI&jD$TSq_#h6Wz#hzW7$oYUvpY%nQ+@jeBE zvzgoUEXx>h6-Ou|tEF4I?a4Sq^xjE?2e${)i8u(h-~!Nt9z+d5BY$76 z*9H_o06P4C|CxXMpL`=}-VEi)c+cG3-n<>(_V@xf?9!8vzo2;;fnf<*h}C$T)8EjY zZEZmk6nw95+iyW12&9EGqI^#>GD3&MnuhHong0npiR0_~!=3lch0A)fZcByQn8mYo}#9$E#fq&l+y|Y98_s!A1 zAb@Gd$^Zp`lv^S<7_ijPOiW1h26+7o%=ur(z{SENVu{$Mia%vwyuU(ZeA6j^pI85x zTb936%Nzdntm&Rv$J5<+w)R@KJ9w8LS6b{?FB zh5#aPWCei(AaiJ-!5cjhfCz#_m{LL1$RUtK>4Ct4$pwi@CP+^PMo7XYjA4k8S^lb9UANr|&zHY`U9l%+m1fLV42P*MP9D%%VJld-h&F_aCDH>W89 z4csFv>p2k-jT%K@mBU!T$pc zf*cGY3`We1N(@YbjLd?J|Bo<8fcysZ9Rjd1u(GfNWef!v7@3)wnV4C)p)!m>HUq05 z8@rIAp|Im5Q6-g$%0^CsiG_^|7i~NU)FOsv6cDh0ERh#vU;+YWBsq{-f`tba4Ffm+ zzs0}cq4YCL;P18>mxJFfdY%znv{-rZ ziw8lU-Op-yT6)SCzJHR*_vl2`^Tnp7)3}v1?iraj&y;e_ejx#I1KSvT&Wi9jQQSo-Es%9iQL8>UMaDtbh@IW@lGP~NflJ8$=-XBCITm(AO{)9&21V{J2)1#db# zbG>}mV1Mew{5^hK=XlwzTC<0xjH}N7p!VfZ4ePt=>W{9zTGj9&+i&46b&0xZx3;=I zv^diEY1Jy`b!BVzvVIm~SG;}qY{EU$+Fwo;yNxHvIVAsje{0q1vabuocErESQrEwD by7$?G;_0haZIF2O+Fbo*Z)m7P{r{T)*?IRX literal 0 HcwPel00001 diff --git a/src/webserver/php-default/stats.php b/src/webserver/php-default/stats.php new file mode 100755 index 00000000..a1114c1d --- /dev/null +++ b/src/webserver/php-default/stats.php @@ -0,0 +1,88 @@ + + + +amule control page + + + 0 ) { + echo "'; + } +?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Connection status :   + +  
  Kad status :   + +  
+ + + \ No newline at end of file diff --git a/src/webserver/php-default/stats_tree.php b/src/webserver/php-default/stats_tree.php new file mode 100644 index 00000000..2e307f31 --- /dev/null +++ b/src/webserver/php-default/stats_tree.php @@ -0,0 +1,114 @@ + + + +amule preferences page + + + 0 ) { + echo "'; + } +?> + + + + +", $it, "
\n"; +} + +function print_folder($key, &$arr, $ident) +{ + print_ident($ident); + echo "\n"; + print_ident($ident+1); + echo "\n"; + print_ident($ident+1); + echo $key, "
\n"; + print_ident($ident); + echo "
\n"; + print_ident($ident); + echo "\n"; + + foreach ($arr as $k => $v) { + if ( count(&$v) ) { + print_folder($k, $v, $ident+1); + } else { + print_item($k, $ident+1); + } + } + + print_ident($ident); + echo "\n"; +} + + $stattree = amule_load_vars("stats_tree"); + + foreach ($stattree as $k => $v) { + if ( count(&$v) ) { + print_folder($k, $v, $ident+1); + } else { + print_item($k, $ident+1); + } + } +?> + + diff --git a/src/webserver/php-default/toolbutton-connect.jpeg b/src/webserver/php-default/toolbutton-connect.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..f419ec24c0631b3d64fc3001ef2261ae3669d3d7 GIT binary patch literal 1455 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 literal 0 HcwPel00001 diff --git a/src/webserver/php-default/toolbutton-download.jpeg b/src/webserver/php-default/toolbutton-download.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..fedf935e40124efe90489bddfdefda33ac358e84 GIT binary patch literal 2384 zcwU{8cT`i^7RGOSLV|FU&;y|aA_&q#iwG;hfFO+0Y=}+>@ILl3Yzf*9Z&_wxk+CnrD$001l?)*1i~hXF`v2ZLT+IQ;iLB3B$<{c9!hcW7B1 z0&D;*8jV4tuow&mhr>z`$dUv+o}fS^Ns*NmsVd5f6pAWsJzZ5@SA#-XYo@JhV8~!F zsC0{s=0=w5jTuJbA}|~dN5B*0B_-vJ)F^63|5&RH0Eh(?03!rU9e{%{1PEJg0;teE zQLt|Uz6%CNAW>)x7AJv+5-OzuI1GV+BM~SR62gU@g5m%YL=n{tS!j|o7o#3PHac@D z8>_)C6Uw-B&Cra!0wZt|vU2hYike#Vwc0ui6H_yD3#QE`j;-Bhdk0rH_w74&?%K`s z_VNAKe!l}j!6C;&kDuU2o{fq=7ZZE_@|C3Il+?8JtAd1A`-@W8=R~ynZt|^-(lCH@~pBw7eqbf&mEF@A|J?AjAbn zA`wW8me4x{w7_jfzP zHW%#JuR0zeoJ{yy(Pn3JXJ!>xNNy`hSxnhssPkkU*XIX2bNbM5UqaBxX!(A2X?b+Y z%P;L2ltPOwZn|Q8SKP#5fpj*`xYIC;KJ}ydo>A}C= ze*URwOpw#B{v~_cp0Jjzc_UBWUEjt0o`)rIM;+hHwS|v4CTGFV9e=Pcg7rD(#x6_$ zS&v7O%}Fk_80V_my*VoL&F5YBq{Y|cVp1!L@lWm*i;Nfc*DjQ-RcJ@+&}%#RMF)&M z59c_vRw8%JetA=rv^~6+BhpwM_-05H0ts~<>N^sJf<}TMwkAdjkH--}DIyV+0zr~2 zMUF&PlmS6`HF-s4Wh#|Ql2fOttI#MaRF!XrgpOj+m^E1J8Wl1~R{6*Jk0Ff!@4p$6 z^4*ZYpAye428PB$QA23}26+*QLLgAzr&=5aQD`+T(U9eWAvp(Rt7`}#N7C43T{F-T zC73wnuLYq35HukE+dA-@yAf~{>JRq=P(8@pC^U&xh9Nr#Try(2aJ&9KdkxPg&D-ze zSlx?Z+C-bh&DCyItlRD9_0m0dHYHHaLL0V7U9W$o?U+Ac`S{QkJ=y33x@Y@(LO&y` z9=Q)MMIDOjbln=mLizXylSP)e1Kt-t_&ZIF_QJ>BVLt7B()?@s+27(@>{+Q(ItPbL zHc)tAot^chTym8n;$+G-k9@%q*(lu>;K-d~7tvJ%7mIY^<>LDvaas;pt3Z?X@f4+) zku?d$($S$D-Np?}xh4~2ztYgfy{U#i%nW^$;9;h4h1pUYUw(7G4uQ)U=*WZJ)g6|GX28MmEz+8_8GJ+_@On*v)UMPPz7>#-k{Z z>HWDpapTL$*4KD*(AY3{2n4&|T~A2$9uG=f(gxd!I=ZrN;qXI zIAx`rgS$udj}$hpNC(fm20Xtpx}Cbu$>gwPTH!Fk%F)&Iw7YC`?$s?gWpv*2RKX0- z{J!1<&v7|!ZJDb2skTT>YT0o64XgKa9z(|7C0*sxwLb-he2QCFmr_lT*^1b#TB>2u zYCivUywUk+$>&&+*0BVELlMrA=x2*9Tl( z{b|4Xp4l$1a82)ceJ!C=?2q!fK0cZpyX0+yY5jd=)5vo#PQxWj4qIF*>Um$6OjXEr zI@A6j(XX<9QNyGEnv?2>YL%ZOV(@Vd#tK;K7u8G{S-f+=v2hXGv+Ev>Fe;}WrOFUJ#FRr-B7!#gepUl1Ovvc|0h?#@`c!*onL(!w$iW=`J8@k(t>%n6O%p5CURVwi5 zHPs*{nv6%)z_8_|k6x>%6JOL3$Q5m}*D@uZ$dayjy%bpSe529@Vf)*!3L|!5u{=BHF9xQ1qd}Rx z`dH7fPepxh)7L_5-{y95*_XR9bEmBl#BfT+6HG^4BJHu#l$jHgH+9dXiIbz59>PBD zV^zSJ1;YY2+z(jv#Io}&5-F5aJBFH3Yuc?O=_syR`qMVrEL$#qi7sK!1{rCw+PBZD O`WX_>s*#gc2mTH7A*qD` literal 0 HcwPel00001 diff --git a/src/webserver/php-default/toolbutton-filter.jpeg b/src/webserver/php-default/toolbutton-filter.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..43e391b50280fe7039217211f2295c79b69d4f5c GIT binary patch literal 1465 zcwYN|62?kW*P&7uP=iZ0|NsG0|@XjFflPQumD+% zK&->W1YvxKaAx3OV`FDymaka3YSZQ|TeofBv2)j>z(JGL?fA z2(qv$8nOvF2C^p>3M&~ka)>xhT)6Qdr?PR-2hpUWi(FzVCJ$9Vg1iRy8F3zKBFkrR zk0JbZi-Cuk5g2*Qf(-TyZ%WSpa9+B-WLqM)k-(<>ppaiZPg1I{%V&NQyRM&nEuZ`5 zEg7{Nfvo4sd7f`G;A5-mtM$@)^k$Y);GW6S#p;LeTfA$E`R!qUtV?5s&i|YL|1pR= z7o{eaq^2m8XO?6rgk+>DxO@5rfRivQGYc@RfFZ@g$_flb9#CRt=jZ0;Jb5)~AbP?V68m6ey57Zz7iQIb=Uk&~ALCt;vgb~biC4h}v!5kV0-k^v+M zi!d0WBw+`D7ApnT`qzma=y zBuLn}{8^Yar_OMbdhi+6;D+CcZH!9kfu1{EU1Bt5t(4I?V##pSpo)XPCe&oo8Apet z?yv<_Pd^1{T83w@`;piX>~Zeo47WS{x5b{Msj$6GJj}ziAXV-^L&3u~3HJXt0SUm| A=>Px# literal 0 HcwPel00001 diff --git a/src/webserver/php-default/toolbutton-kad-pressed.jpeg b/src/webserver/php-default/toolbutton-kad-pressed.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..9ad1057d1f4b6f12f6849035f31fc3e10c222875 GIT binary patch literal 2434 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 LiAovyf}wu{4iC#% literal 0 HcwPel00001 diff --git a/src/webserver/php-default/toolbutton-logout-pressed.jpeg b/src/webserver/php-default/toolbutton-logout-pressed.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c415c0525f63dde566e8af1f8780f89dd82b6aad GIT binary patch literal 2319 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 literal 0 HcwPel00001 diff --git a/src/webserver/php-default/toolbutton-reload.jpeg b/src/webserver/php-default/toolbutton-reload.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..40be70418a98de505067ee5343f3ae39e0254094 GIT binary patch literal 883 zcwYN|%K@mBU!T$pc zf*cGY3`We1N(@YbjLd?J|Bo<8GB7YPGcq6pHWpTPW}uY500Sd4GczL_3p-SXk%^gw zfmM)ANReGw$3!+6Yg>M&D~wFxTbY>}v*zyk%@H)G zP~&7|MoZ&vJNCoOlY_0gtt|RPjz9L93kk4LkZ#g-9eyEpj*P)Oi^W)*7hZlD0rRSJdXUYeyR1#hzs=hs1`_{EOrA-C~ z^M&kdD&@VdFaO$kZF8slU7rI_)OSnw+{xZId84@MR>_h%D#jNyfBsah&REub?WN_< zt<@`5Kh4=t?fUP{%y;Q@0 z!MmnffA!M>@4mn8X`6QWo#M6gU11H5zoax4UCI!>!SGOSwL|LyKA}6aw;T%!I5pvt p@!S;-9_KGje`ns^crMN)(364hpaQQ}bII&q$GSAutl0nmCICUbHdO!s literal 0 HcwPel00001 diff --git a/src/webserver/php-default/toolbutton-search-pressed.jpeg b/src/webserver/php-default/toolbutton-search-pressed.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..5503669b061b1fe20de680a4e3a9d850e72e133f GIT binary patch literal 2301 zcwU`Uc~nzZ9)2%**+^Jk61JEG2*e;#24WmR1q1|HjR=Trbr4b#(UB#{W^33ST9HKr zgh3PoT4acdfPfn)vIMI@kVP4VA|MKaD6(18#A#>hIrB%`@11+kJ@@y!zjwd$`@Sn5 zkPibIu1+pa00@GBv*H8fBgh8FIKfu{;Nbz7004jmlu!c@2oQi2D^M{^5r|*c$TVeG z{@Y5*eZ?ey0yqFzG#Z0OVKEpC4u@4CkW~qIJVBR8QYX_WdUP6vO4T?-b2ZC&jR|M{UpH7|Mt5RxhM1T3r-alofDUppTF>Z#l`BY zHMMou>KhvG+-gyjEd_3~w=<~7hi5HVE-^{&zH~)TNacNn}3j~nh zulT>bUsDxydK5SSP4rgxk`o8zj zp2BV~)edO+>V4u;Tf*g{l+5{z4YIbv$uCpGoyUde4jkd%uF}jZv^K7?u4E0gbSJtS zkJfJKyUnQ@6G4wZ*%e3@yUrOB&2A$qTvtO>-}4#OlZ zsy2yC(S%_g104#Drl+Sz(qj2afJMkm8$`X9!BoX7@3KXW1# z01(LE`cUz#Ae4dyv5Kg<2B35y3IU;!zsMO->KRtZ6+`q4CfSi0d#`93vh8<98bysL zPEbBqzp@;JLZAWVzgV#HB|{?6$j@946Ae%dvS)BoX*0=U_RZ&V8y;^6TQG?ZRG;%> zbH{v7@TOVW_bo$=!Z+SnaE*!o=w{Hfv_qIqccX=fedgO5y(+mer$U4DpuwsIlL1;x zMMy}A9of7vHMpf%yJPjO;sZn1p=pu#LfA!dBRA>Qy`gu`4|xLmZ**tY@XP|e6>g{T-b+u78I`5dAcj%95jpx zIV>pP;~pGeO30L)8#_OCzEpbgiNKm`%ZqxT>QQ{_w(VyA-;|j}cncbdaYyyioHng)IiNd$!nl?Vs5@*|ld7d=zM==ztk0K? zNzjiwIxFIo0QXN&Y zV&{xfU7nyudJUZc4xc<8?l)(ZrQ3>YTPV2~^+8-4`26gNx_s;tDs5ezUlB8tRgjQ6K<&uL7dz(gLZ4LbhjBKW{cl?KTpQw=ZHEZ_@@^KI^sr-j|=(y^$2$$g2>!$H}KcF8^l?A@XYmFTg} zvDBMl>m$aV>PzPr2iDcD7pEzSY-t`sTx_t^)7I7?XcaJNi$C zO6t9L-S4Y&{WfUrT_;ifiO5l(pp$>wb=bj466VnS;Au;|95|hyt3O*JjUEg#H6Em0 zTCwLpuebJeyu9eXAMbebBdL%(;!DAm#}_>o_Q~S>_n%iJA1vqa(Y}R@0*~yvduHiD zA2mMM9S|Mn_^Wr>NNbu7*=w>_XH7|lEvnr_Q>hFd)~(4kj+ULee|HKnbw-Dlowl4+ mwmXBczof~cS|bNEm_k-xZrTJHm>?WPI)hmIDXk;&!Jh%~Rez}f literal 0 HcwPel00001 diff --git a/src/webserver/php-default/toolbutton-search.jpeg b/src/webserver/php-default/toolbutton-search.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..b8c27a2f7b7564b684cf48ae79896371cbfc8917 GIT binary patch literal 2332 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 literal 0 HcwPel00001 diff --git a/src/webserver/php-default/toolbutton-servers.jpeg b/src/webserver/php-default/toolbutton-servers.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7f013943a900f340365bb5d507a7f9e2a8fd6b15 GIT binary patch literal 2289 zcwU{9dpuNmAIHye=Eh7IGc+^?GlOXG%$OqAC>rVFo>=8FLu2)n+ZsygLN1T{C6_cI zmvq@&BecXevQZ*omr_(@<&uh3vu8Zp)9&l_{PFDbIj?ih?{&W4-}iOiukZKs6Ay}? z0rER+?Q8)M1OX0w0pc;}ij9Ep4*yz8O+dU)E5BBrN`O zCCPXAA^sWI3SdwuGzy79qtVjR7#SRK4GxRNDJu}6S)H!0txjdo$mI1# zI*flX*=)9&_GWWqmYKdGnS%dYrC2j@q7(f|dK_C^7!h;YV z6n6k>@P8t~RRMnpl!6dQ6dEHfgM}07#8N13X&I%pBxMy%E$#I>y6lacjEpy%Y~5yKyPadV!`a2v zZLj-24?ix?Kj0ugFf=Uuy9hyK)af&^acAQb5;HQhvUASm=H(ZcTq-Rquee-UT~k|E zf3uwi4(WN>JB?D>oFiI=ZlPfpFvFT7iP|Ka1(vV;o+An=R+ zD;FN-l0qOL1X{ucN<~N#@Cc*^6Qy9~i1rC4P+2E2MC z70h_H(^VCl=`Lm0JLzfnkF23Dd-cog`*29L-M=NUYw1AS`})JUpsL{-8oqP&l& z2AWE(4A&1Zo9h=X3l+;JL^ix>{PBks`WAizIS+y9v6^%m6Vlc84 zBA!V3+xoY~SOE7g79;;*G2p9KClN$r;HZH-0NV>hAyCklIb99o6;K*frcV*U%Fzi; zq_KjF4NuNWHmHD-gg;k+h2!h*2rX6 zzzOcf$>@=+1dZiOe%*R$VS9^n?k6|-Y#Sc9baGPe`kvs#?6~-kBpna?(*H+X6RWn z?6Wg_zZmGJ=jld^feO$3YuWJ)xje>5o`^Jl}h^w(N> zr-j?S8IrL(dxB2==n>IuAIZPn6ld0#-lsirUNEy#PCLJ$H6hQ#s|v4bux%x*g^=E3 z*~UpZlJ4kT)4U9Q_P>7dX3)l=b10)b8wN$Omxgv;N@wmbE8+mT^FEOwo^z1kL zy~=$I7`-LVy1Uu@9`}e($vu&;lFSw@XDpmutVdr>|HKY*!U}RtM`+0UpJ-e`c)X#CcKEr>X1p<1P-KjI66iE%)o@*f|%>D0HWY|=F}IQK^euc{A~XM9>n=RLB^nNx}ZNq3*WP)c#435|eJ7{()A5%)YWvou_uatmXZQ$3hy@>Z&9$tUJn4=w2*bvgdYHEks*~ zWDRvLIK-9Y(I0m-aHqCvyCe%MgX>hC^=3Wt-W-tKRR18T*2QC{x*OHFA_%0#Teb`Q za%HE@F9vEe8&gMO#xe`NUcTXFa<6B-GfIlyI(}$da*$K4@mcn>oJqc{S&xGpy?_OZ>&p#2Go78)TU_7zjb=)Fn!`7_mOC?>3Dhavp~Je26`k5 z!NQ`4@_P|)=4U%*OJBc-cU-)q=(%Ufl`s#=hpJ+u1k$r7I~MNBjr2y!=NtF953uJu z4`Nd)Eh?|I+)fS|95@1yAW^1pyoOTYmUC?bL>Cqbp_{4w5BI;Rm@a%!I9^%z*xdP_6;mw=!+7hIN5Zjt_j2Tfm8tZubyFr~ zh0Mim!|_Qwb9ke%Kv%Rw(mZt~#Ps%yB`=J1oQWt!*1jZPJ}*Fvp^4DoaQwp-?93j< c#vR;E%s4~k4<_hTpHYWj*7Awrmg1q`0fvHv(EtDd literal 0 HcwPel00001 diff --git a/src/webserver/php-default/toolbutton-settings-pressed.jpeg b/src/webserver/php-default/toolbutton-settings-pressed.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7220fe8a15784e8f8d2ca61e4d757f0ebfb65d23 GIT binary patch literal 2380 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 U&`-s&Fmym?0Lyxg^ArvI3yg}TcK`qY literal 0 HcwPel00001 diff --git a/src/webserver/php-default/toolbutton-settings.jpeg b/src/webserver/php-default/toolbutton-settings.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..3bff371dee1968b017f627ae9581823563a54d55 GIT binary patch literal 2414 zcwU{8dpMM7AII-!&cis&m>i}t)0l}IGt=ZytV21aw%AvZ=v59W>zInDC6rT$l8SQ5 zAx4u!nzcwOvNR>*kTxR>A|xS|ooQ?L-RpY)c=!E2*YiC0_5AMVd)=Sw_xmpQEDr$r zE!K9{0D>T3E55+85Z-Tf%-0)$ZQFnr0009dk_9jr1Q6mCB))ZEuy1R4v825GpH7nR z;>YrHunAyLC^QO*L8H-FEJg}Pl)*_$<5UO=azs@Um7+=_lUFhHG*+qU(8=UAhMGG1 zOg5WM)i5?SVwvczW3wbC5EhHYN#m4dWRzJnGL7|*wcH5s7@z`Ja7Ycn@DLmiEjI(I z_?$@Si@;YwFgOBCHL+M$0yT_b^C&&u~Ldk$||JQ>Kbb_wb<(o42_I8Y}#yPZDVV<<%fSc?cC+; zvU|U$m$%OW--98CLysIi78ZUgCN}Q$nfQcr=^5uQWM0g=l$T#nc)h5&r1Vy0Rdvnn z+B>|ad(HPBJZx!w^tAI?m!P|+w@*0uYG`;wG&(ju^LF;#-23^3#SaoL2*9Cl`mbDg zF&7MhfFsZnE(ms1vH_1k(wHcMg#+3nNI{Jig&|s|<#O+0>FXS)SL_RZBBjV+3s=ub z(7urUZ(z~?7ula+e{uBz92^oi4~_?BVAeyy^KJOEMCqK#MM3mK%IxECF4-Zxn@hqB zop&_VFmDj3A1hn*bZh5rt0iXkDdra4CuXi0y_J%w`%IdlXF-a&&?4}rWq7unx`tyM5SLjVKlaPZG4CJlN*}WnoW9w`d=E% zG=5C+K8w0CkRFhAt(GjW)h?!(j(hSRhPO{`FG+S$9LQ?$C~NZy!L^9=8!q0+ zfrksO=f8^Fz9V5o#plzr1>8>nyc>`jLTYltFY1`OEZH?peU@qWa4(~`svK}TR5xGj zE;1c2DQ-Xfs4U5e?K1mmv@~OrF_Yx_*XOvEsMd(QiymWyoq0m5Lr;QieK`rsNBC# zUt|B6aYqBz;^};ZCSlW@ZCjUas^9I+deyE;j%TTcM;q-u17;^bNP6@&B zi)bh*EI0PH&JOMj5c(*`kq-9fa6>%xTSnV1^HYP3)jCbBqDng!m{e=}S|#!yIXt#X@7;hTap z;}ciUa#~wN)M-ch6~-Y_?Bnn!b=W4Ou=#+#LDbIF4NRo-gubG2bM*HN{siQFf<+=)sj7&rDn;|D?3;0Pp7B=HO~?XWyzSXME(8?>jKI zl#>|x>IyY(p|nidS~b40&EdZ2>5xgsegK~{G9DM;(3!Q~n7NVeqM^f1yXy1@yIY4&3zKA0z07hZS*BrO zA!B2_Ne)>fE^xvO`OC(8u5Mf_?cU3t!z$!YDW$JT0(Cv|#F4AaNQax!ww%-c`*U4M zM>h8|)6OgV_B-{M)whWr2t>&hZEwK!m%F?I&bU;l)BLyGA-#1uKb`v94rkH17p82w z6@E7MgCR5$VOw}CZzS4c)D{_LVEbNloa6_y=_zg1n#gZ;_3~i|ZO#Q|{kl(B5zJX% zJsP{Z6UR@Cim&azW^X7sI;@+n^{{;o+pbxeHeP~D?n+mDBup>CWjh)~b|!Oq-W{=g z&SjbVIu5rq%4z!_obE~4r?gji5^shZoSHqN(=?{CGONwxO1+OkmfZ92vK8H*Z!B^R z2u&9fIEb$v#a$A8@~dKhTny~zzYaluG~5(qKguzf@ix+REcrn$)TS=p z?|XFucwr9J@sj3V^HpUJCC}_?R%kxFGIsHBU5#;(5eN)I5C$iMAL~VV$<`cC_pgc+ zC>rK@B+uCE6x2pE0{9t&?{bbW><<1AZL@yjtUff{@0>q3)4QAZU@Y@7uRJun)1S+m zvJMr*NZp-%li$jUTUvQNn>lYj5mO#(&l-;fk0SYri`d9&)t5mZD=g(p&iZzq%6k`T tsjz-?Va&A{ZJhP4qEfr@n6(K5Yo+Wg@y1&j8NHVB;#V$ab3wy$@9(h9&{hBd literal 0 HcwPel00001 diff --git a/src/webserver/php-default/toolbutton-shared-pressed.jpeg b/src/webserver/php-default/toolbutton-shared-pressed.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..8d27fd6e6c40a405ce4c8fb42de805b461bc2e68 GIT binary patch literal 2264 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 Vp0s%REP7}#M3XR7IA!02YWs5K3{YRzQ{l z;>H7I5e~8xWvL((L=p>#5?NFvB`hLBAOdQ6=1pwva?bnX^?m2eoZp%IyLaYu?*0B$ z{iA)$i(2M$IHj~tDO6~&!6dFu4HXU=|?k@J3B)#k59~96d3Ckz^J(2}^NG&#!91v2DB*I{Tt}G;~dP zvgNaCw2x%}8`$yxi|h}uKe+}00uqFqha>_HfHIIAJQvq{4uAFayC=u*8!5Zvs%V~Z zeN|MfJj>fUT;2sHw(<{q_sj@?%+1d=vG>k;rmdM;C%#$MI{5V!{@Yz=rAtz5NonFy zxndKW{-dBg{B6cym(s)iQaXE6jU*`Lc(xK;BgPc9JZ%gsDbF2!^0NR}Qywf5q{)%> z^@}Bg9D4Wot{I9$YuY+wr*DR7;~|bCFYaJf%4qG4rHOI}%e9|5>^-+|$}v)DbgWl= zBz6AMP@Xrn+M>lK?y+BXuT^qMm)2C2W`_*8T2_Ct-8P&&X1p+(_5Bk` zO?kaU;X}K8**mPEPc*ZwvFn)B+w-Et*Z+*P=z z5DEpio1nHGMjMaE5s2C(5>cB-B_Zy5kWAc#Uk5a#!Rg?Gb7 zL&HuBB(ohoz49@X$O3pO({*(9_El9Y;4CWm+o1nh5w?aEV zL?lEaGp*B6Xo{m}eq;};W%lo5H5?(lG=9E1P1sZs+?KX@J?NfCnsC=Od_egfp8)&A zJ1V`k^Q2ScEfqZhlILVg-P2L#n<}baEog*i^i{mZ$^2XD!$QW50cu;zG>mG;TxXIHRpq^ z?o{V5BBwh(82)QKI`(Qv+q-Y-i^`my@mE|lJkp%X$-F4fY#y$e876k0VP`waLxltW zF{Vu~>iy#d8~vEPM9jR+gQ?iN{iZqHlM8q!jp>BgA;qIbE4_$h!bmE5>pSN%p>OI6 z)>xY4F4?LHCfjD2Bb};Y>?ydR5IXhmH11%ndnEdm$qgJ4W9uw9cRWOgVy5+Hx4Zf8 zF(0Xok^0kQ5s-Us;ox<4SUP`G zg5)JtNjNQy*yq z={v(oC&Wi4!o==@yvE&DAD%Vb5n)=g1!?Em_pUAA#qpuHmYjwf`RkzG)Up9=%8L_( zO0L394=7-Ihoa#dw~n1VJV}- zV;R~LUfpFq`&aK}?Z0oVbNKSgiE}kuMfHn@xf#9_IT^Js#U`>^MY}%CT?#L#aW`szPF|PtT@V&FP{eED=80XBpMD$&jT;h=wkfK#Pn;2dH>R8B*_ip+2jYo6o5nmm0x6?K} zskG1n7CU8^Wz9DeN?s@T@gDeSo!!k0#j&_c%DjdEd~_W=0I);yF)?o%wlt zgQu?=8Ti|y-Bz2>%LCZv`YZ;5|+yMQH2$&Jl74zb_w zGRac>GQD(vvgst#n;!H4v;0l86WRQ1riLSSJINq#E1%qn-DA*VuR}V?I$+K64Z&`B Nw9f_WWM-xs_z%jAoO=KO literal 0 HcwPel00001 diff --git a/src/webserver/php-default/top.html b/src/webserver/php-default/top.html new file mode 100644 index 00000000..75816f9e --- /dev/null +++ b/src/webserver/php-default/top.html @@ -0,0 +1,99 @@ + + + +amule control page + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
Download listServer list
+ + \ No newline at end of file diff --git a/src/webserver/php-default/tree-closed.gif b/src/webserver/php-default/tree-closed.gif new file mode 100644 index 0000000000000000000000000000000000000000..7d451c3bc8eeddeae3d004009910d3cc73291606 GIT binary patch literal 87 zcwTe&bhEHb6krfwn8?iV|NsAge~lOzKn%s7EQ|~c%nUj}E(1uOfk|Ud|H{*E^&Uwp nH3)1LbGwt@Dj(jM<}pu8b6dizU2AR~`r?sWW%kvFk--`O2jU;n literal 0 HcwPel00001 diff --git a/src/webserver/php-default/tree-leaf.gif b/src/webserver/php-default/tree-leaf.gif new file mode 100644 index 0000000000000000000000000000000000000000..4aca545f8e7ee59116be58ede451f47e7a8754a3 GIT binary patch literal 90 zcwTe&bhEHb6krfwnE0RJz<~q*|NmzI1I3>#j38PEM1bTOn6z8^D-WH`a+&c(({s6q l`Ri#3^Thf>GudR6`d&|3wc@8+A@3HscVEO+YZMC*VEkXi<2Q;uDC&Z+Ek z3tKz+QHLyhivdTBXYUG)GOroSbU3D$ED>^C_xgIr``x^p5?lUsFoyL`%e0c`WUvMR Du5u*g literal 0 HcwPel00001 diff --git a/src/webserver/php-default/up.jpeg b/src/webserver/php-default/up.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..54fd78cd60d35150e9a08303bb45d3ad74ed4182 GIT binary patch literal 729 zcwYN|%K@mBU!T$pc zf*cGY3`We1N(@YbjLd?J|Bo<8g8T;Z9s;njvao}sbOjg~nVFfHfR2XBFfy?SGB5*u zAf#xhH*2%#*0;LuW+(rI>lqgveevY+&s9BX+c#EO#Jy^Di z>%^wh%1yD4mhX6KvOj0h*VWoP92MkP6_zRp-m1I&GHPSefj6mDCp!MB$5(s}o>V#8 z%1|=**2lN=W8XZAx#fH9n{d(HBdv;=LL&SDjMJ^AQt+^xM^ciQV6+m<$6 zN&2SiLavt&8S1A__|H(W?$(Tw+N)Dy6#5R@PyXWd?b0f~@0OFlW_=H8_>kkb@RXX; z->^qp-4YG?*dI+ "$@" + +CLEANFILES = *-version.rc + +endif + +MAINTAINERCLEANFILES = Makefile.in + +EXTRA_DIST = \ + missing-template.html \ + php_lexer.l \ + php_parser.y diff --git a/src/webserver/src/Makefile.in b/src/webserver/src/Makefile.in new file mode 100644 index 00000000..2b82ad3b --- /dev/null +++ b/src/webserver/src/Makefile.in @@ -0,0 +1,855 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +SOURCES = $(amuleweb_SOURCES) $(nodist_amuleweb_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = amuleweb$(EXEEXT) +@ENABLE_UPNP_TRUE@am__append_1 = \ +@ENABLE_UPNP_TRUE@ $(top_srcdir)/src/UPnP.cpp \ +@ENABLE_UPNP_TRUE@ UPnPCompatibility.cpp + +@ENABLE_UPNP_TRUE@am__append_2 = -DENABLE_UPNP +@ENABLE_UPNP_TRUE@am__append_3 = -DENABLE_UPNP +subdir = src/webserver/src +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +PROGRAMS = $(bin_PROGRAMS) +am__amuleweb_SOURCES_DIST = WebServer.cpp WebInterface.cpp \ + WebSocket.cpp $(top_srcdir)/src/ExternalConnector.cpp \ + $(top_srcdir)/src/OtherFunctions.cpp $(top_srcdir)/src/RLE.cpp \ + $(top_srcdir)/src/NetworkFunctions.cpp php_parser.c \ + php_lexer.c php_syntree.cpp php_core_lib.cpp \ + $(top_srcdir)/src/UPnP.cpp UPnPCompatibility.cpp +@ENABLE_UPNP_TRUE@am__objects_1 = amuleweb-UPnP.$(OBJEXT) \ +@ENABLE_UPNP_TRUE@ amuleweb-UPnPCompatibility.$(OBJEXT) +am_amuleweb_OBJECTS = amuleweb-WebServer.$(OBJEXT) \ + amuleweb-WebInterface.$(OBJEXT) amuleweb-WebSocket.$(OBJEXT) \ + amuleweb-ExternalConnector.$(OBJEXT) \ + amuleweb-OtherFunctions.$(OBJEXT) amuleweb-RLE.$(OBJEXT) \ + amuleweb-NetworkFunctions.$(OBJEXT) \ + amuleweb-php_parser.$(OBJEXT) amuleweb-php_lexer.$(OBJEXT) \ + amuleweb-php_syntree.$(OBJEXT) amuleweb-php_core_lib.$(OBJEXT) \ + $(am__objects_1) +@NEED_RC_TRUE@nodist_amuleweb_OBJECTS = amuleweb-version.$(OBJEXT) +amuleweb_OBJECTS = $(am_amuleweb_OBJECTS) $(nodist_amuleweb_OBJECTS) +am__DEPENDENCIES_1 = +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +SOURCES = $(amuleweb_SOURCES) $(nodist_amuleweb_SOURCES) +DIST_SOURCES = $(am__amuleweb_SOURCES_DIST) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +amuleweb_SOURCES = WebServer.cpp WebInterface.cpp WebSocket.cpp \ + $(top_srcdir)/src/ExternalConnector.cpp \ + $(top_srcdir)/src/OtherFunctions.cpp $(top_srcdir)/src/RLE.cpp \ + $(top_srcdir)/src/NetworkFunctions.cpp php_parser.c \ + php_lexer.c php_syntree.cpp php_core_lib.cpp $(am__append_1) +amuleweb_DEPENDENCIES = ../../libs/common/libmulecommon.a ../../libs/ec/cpp/libec.a +amuleweb_CFLAGS = -I../.. -I$(top_srcdir)/src -I$(top_srcdir)/src/libs \ + -I$(top_srcdir)/src/include $(WXBASE_CFLAGS) $(LIBPNG_CFLAGS) \ + $(AMULEWEB_DEFS) $(BFD_FLAGS) -DEC_REMOTE \ + -DWEBSERVERDIR="\"$(pkgdatadir)/webserver\"" \ + -DECSOCKET_USE_EVENTS=0 $(am__append_2) +amuleweb_CXXFLAGS = -I../.. -I$(top_srcdir)/src \ + -I$(top_srcdir)/src/libs -I$(top_srcdir)/src/include \ + $(WXBASE_CXXFLAGS) $(LIBPNG_CXXFLAGS) $(AMULEWEB_DEFS) \ + $(BFD_FLAGS) -DEC_REMOTE \ + -DWEBSERVERDIR="\"$(pkgdatadir)/webserver\"" \ + -DECSOCKET_USE_EVENTS=0 $(am__append_3) +amuleweb_LDFLAGS = $(LIBPNG_LDFLAGS) -L../../libs/common -L../../libs/ec/cpp +amuleweb_LDADD = -lec -lmulecommon $(WXBASE_LIBS) $(ZLIB_LIBS) \ + $(READLINE_LIBS) $(LIBPNG_LIBS) $(RESOLV_LIB) $(BFD_LIB) + +noinst_HEADERS = \ + WebInterface.h \ + WebServer.h \ + WebSocket.h \ + php_core_lib.h \ + php_parser.h \ + php_syntree.h + + +# Resources +@NEED_RC_TRUE@SUFFIXES = .rc +@NEED_RC_TRUE@nodist_amuleweb_SOURCES = amuleweb-version.rc +@NEED_RC_TRUE@CLEANFILES = *-version.rc +MAINTAINERCLEANFILES = Makefile.in +EXTRA_DIST = \ + missing-template.html \ + php_lexer.l \ + php_parser.y + +all: all-am + +.SUFFIXES: +.SUFFIXES: .rc .$(OBJEXT) .c .cpp .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/webserver/src/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/webserver/src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +amuleweb$(EXEEXT): $(amuleweb_OBJECTS) $(amuleweb_DEPENDENCIES) + @rm -f amuleweb$(EXEEXT) + $(CXXLINK) $(amuleweb_LDFLAGS) $(amuleweb_OBJECTS) $(amuleweb_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuleweb-ExternalConnector.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuleweb-NetworkFunctions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuleweb-OtherFunctions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuleweb-RLE.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuleweb-UPnP.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuleweb-UPnPCompatibility.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuleweb-WebInterface.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuleweb-WebServer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuleweb-WebSocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuleweb-php_core_lib.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuleweb-php_lexer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuleweb-php_parser.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amuleweb-php_syntree.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +amuleweb-php_parser.o: php_parser.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CFLAGS) $(CFLAGS) -MT amuleweb-php_parser.o -MD -MP -MF "$(DEPDIR)/amuleweb-php_parser.Tpo" -c -o amuleweb-php_parser.o `test -f 'php_parser.c' || echo '$(srcdir)/'`php_parser.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/amuleweb-php_parser.Tpo" "$(DEPDIR)/amuleweb-php_parser.Po"; else rm -f "$(DEPDIR)/amuleweb-php_parser.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='php_parser.c' object='amuleweb-php_parser.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CFLAGS) $(CFLAGS) -c -o amuleweb-php_parser.o `test -f 'php_parser.c' || echo '$(srcdir)/'`php_parser.c + +amuleweb-php_parser.obj: php_parser.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CFLAGS) $(CFLAGS) -MT amuleweb-php_parser.obj -MD -MP -MF "$(DEPDIR)/amuleweb-php_parser.Tpo" -c -o amuleweb-php_parser.obj `if test -f 'php_parser.c'; then $(CYGPATH_W) 'php_parser.c'; else $(CYGPATH_W) '$(srcdir)/php_parser.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/amuleweb-php_parser.Tpo" "$(DEPDIR)/amuleweb-php_parser.Po"; else rm -f "$(DEPDIR)/amuleweb-php_parser.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='php_parser.c' object='amuleweb-php_parser.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CFLAGS) $(CFLAGS) -c -o amuleweb-php_parser.obj `if test -f 'php_parser.c'; then $(CYGPATH_W) 'php_parser.c'; else $(CYGPATH_W) '$(srcdir)/php_parser.c'; fi` + +amuleweb-php_lexer.o: php_lexer.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CFLAGS) $(CFLAGS) -MT amuleweb-php_lexer.o -MD -MP -MF "$(DEPDIR)/amuleweb-php_lexer.Tpo" -c -o amuleweb-php_lexer.o `test -f 'php_lexer.c' || echo '$(srcdir)/'`php_lexer.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/amuleweb-php_lexer.Tpo" "$(DEPDIR)/amuleweb-php_lexer.Po"; else rm -f "$(DEPDIR)/amuleweb-php_lexer.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='php_lexer.c' object='amuleweb-php_lexer.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CFLAGS) $(CFLAGS) -c -o amuleweb-php_lexer.o `test -f 'php_lexer.c' || echo '$(srcdir)/'`php_lexer.c + +amuleweb-php_lexer.obj: php_lexer.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CFLAGS) $(CFLAGS) -MT amuleweb-php_lexer.obj -MD -MP -MF "$(DEPDIR)/amuleweb-php_lexer.Tpo" -c -o amuleweb-php_lexer.obj `if test -f 'php_lexer.c'; then $(CYGPATH_W) 'php_lexer.c'; else $(CYGPATH_W) '$(srcdir)/php_lexer.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/amuleweb-php_lexer.Tpo" "$(DEPDIR)/amuleweb-php_lexer.Po"; else rm -f "$(DEPDIR)/amuleweb-php_lexer.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='php_lexer.c' object='amuleweb-php_lexer.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CFLAGS) $(CFLAGS) -c -o amuleweb-php_lexer.obj `if test -f 'php_lexer.c'; then $(CYGPATH_W) 'php_lexer.c'; else $(CYGPATH_W) '$(srcdir)/php_lexer.c'; fi` + +.cpp.o: +@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +amuleweb-WebServer.o: WebServer.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-WebServer.o -MD -MP -MF "$(DEPDIR)/amuleweb-WebServer.Tpo" -c -o amuleweb-WebServer.o `test -f 'WebServer.cpp' || echo '$(srcdir)/'`WebServer.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-WebServer.Tpo" "$(DEPDIR)/amuleweb-WebServer.Po"; else rm -f "$(DEPDIR)/amuleweb-WebServer.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='WebServer.cpp' object='amuleweb-WebServer.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-WebServer.o `test -f 'WebServer.cpp' || echo '$(srcdir)/'`WebServer.cpp + +amuleweb-WebServer.obj: WebServer.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-WebServer.obj -MD -MP -MF "$(DEPDIR)/amuleweb-WebServer.Tpo" -c -o amuleweb-WebServer.obj `if test -f 'WebServer.cpp'; then $(CYGPATH_W) 'WebServer.cpp'; else $(CYGPATH_W) '$(srcdir)/WebServer.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-WebServer.Tpo" "$(DEPDIR)/amuleweb-WebServer.Po"; else rm -f "$(DEPDIR)/amuleweb-WebServer.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='WebServer.cpp' object='amuleweb-WebServer.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-WebServer.obj `if test -f 'WebServer.cpp'; then $(CYGPATH_W) 'WebServer.cpp'; else $(CYGPATH_W) '$(srcdir)/WebServer.cpp'; fi` + +amuleweb-WebInterface.o: WebInterface.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-WebInterface.o -MD -MP -MF "$(DEPDIR)/amuleweb-WebInterface.Tpo" -c -o amuleweb-WebInterface.o `test -f 'WebInterface.cpp' || echo '$(srcdir)/'`WebInterface.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-WebInterface.Tpo" "$(DEPDIR)/amuleweb-WebInterface.Po"; else rm -f "$(DEPDIR)/amuleweb-WebInterface.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='WebInterface.cpp' object='amuleweb-WebInterface.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-WebInterface.o `test -f 'WebInterface.cpp' || echo '$(srcdir)/'`WebInterface.cpp + +amuleweb-WebInterface.obj: WebInterface.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-WebInterface.obj -MD -MP -MF "$(DEPDIR)/amuleweb-WebInterface.Tpo" -c -o amuleweb-WebInterface.obj `if test -f 'WebInterface.cpp'; then $(CYGPATH_W) 'WebInterface.cpp'; else $(CYGPATH_W) '$(srcdir)/WebInterface.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-WebInterface.Tpo" "$(DEPDIR)/amuleweb-WebInterface.Po"; else rm -f "$(DEPDIR)/amuleweb-WebInterface.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='WebInterface.cpp' object='amuleweb-WebInterface.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-WebInterface.obj `if test -f 'WebInterface.cpp'; then $(CYGPATH_W) 'WebInterface.cpp'; else $(CYGPATH_W) '$(srcdir)/WebInterface.cpp'; fi` + +amuleweb-WebSocket.o: WebSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-WebSocket.o -MD -MP -MF "$(DEPDIR)/amuleweb-WebSocket.Tpo" -c -o amuleweb-WebSocket.o `test -f 'WebSocket.cpp' || echo '$(srcdir)/'`WebSocket.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-WebSocket.Tpo" "$(DEPDIR)/amuleweb-WebSocket.Po"; else rm -f "$(DEPDIR)/amuleweb-WebSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='WebSocket.cpp' object='amuleweb-WebSocket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-WebSocket.o `test -f 'WebSocket.cpp' || echo '$(srcdir)/'`WebSocket.cpp + +amuleweb-WebSocket.obj: WebSocket.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-WebSocket.obj -MD -MP -MF "$(DEPDIR)/amuleweb-WebSocket.Tpo" -c -o amuleweb-WebSocket.obj `if test -f 'WebSocket.cpp'; then $(CYGPATH_W) 'WebSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/WebSocket.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-WebSocket.Tpo" "$(DEPDIR)/amuleweb-WebSocket.Po"; else rm -f "$(DEPDIR)/amuleweb-WebSocket.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='WebSocket.cpp' object='amuleweb-WebSocket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-WebSocket.obj `if test -f 'WebSocket.cpp'; then $(CYGPATH_W) 'WebSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/WebSocket.cpp'; fi` + +amuleweb-ExternalConnector.o: $(top_srcdir)/src/ExternalConnector.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-ExternalConnector.o -MD -MP -MF "$(DEPDIR)/amuleweb-ExternalConnector.Tpo" -c -o amuleweb-ExternalConnector.o `test -f '$(top_srcdir)/src/ExternalConnector.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/ExternalConnector.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-ExternalConnector.Tpo" "$(DEPDIR)/amuleweb-ExternalConnector.Po"; else rm -f "$(DEPDIR)/amuleweb-ExternalConnector.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/ExternalConnector.cpp' object='amuleweb-ExternalConnector.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-ExternalConnector.o `test -f '$(top_srcdir)/src/ExternalConnector.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/ExternalConnector.cpp + +amuleweb-ExternalConnector.obj: $(top_srcdir)/src/ExternalConnector.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-ExternalConnector.obj -MD -MP -MF "$(DEPDIR)/amuleweb-ExternalConnector.Tpo" -c -o amuleweb-ExternalConnector.obj `if test -f '$(top_srcdir)/src/ExternalConnector.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/ExternalConnector.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/ExternalConnector.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-ExternalConnector.Tpo" "$(DEPDIR)/amuleweb-ExternalConnector.Po"; else rm -f "$(DEPDIR)/amuleweb-ExternalConnector.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/ExternalConnector.cpp' object='amuleweb-ExternalConnector.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-ExternalConnector.obj `if test -f '$(top_srcdir)/src/ExternalConnector.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/ExternalConnector.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/ExternalConnector.cpp'; fi` + +amuleweb-OtherFunctions.o: $(top_srcdir)/src/OtherFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-OtherFunctions.o -MD -MP -MF "$(DEPDIR)/amuleweb-OtherFunctions.Tpo" -c -o amuleweb-OtherFunctions.o `test -f '$(top_srcdir)/src/OtherFunctions.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/OtherFunctions.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-OtherFunctions.Tpo" "$(DEPDIR)/amuleweb-OtherFunctions.Po"; else rm -f "$(DEPDIR)/amuleweb-OtherFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/OtherFunctions.cpp' object='amuleweb-OtherFunctions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-OtherFunctions.o `test -f '$(top_srcdir)/src/OtherFunctions.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/OtherFunctions.cpp + +amuleweb-OtherFunctions.obj: $(top_srcdir)/src/OtherFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-OtherFunctions.obj -MD -MP -MF "$(DEPDIR)/amuleweb-OtherFunctions.Tpo" -c -o amuleweb-OtherFunctions.obj `if test -f '$(top_srcdir)/src/OtherFunctions.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/OtherFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/OtherFunctions.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-OtherFunctions.Tpo" "$(DEPDIR)/amuleweb-OtherFunctions.Po"; else rm -f "$(DEPDIR)/amuleweb-OtherFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/OtherFunctions.cpp' object='amuleweb-OtherFunctions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-OtherFunctions.obj `if test -f '$(top_srcdir)/src/OtherFunctions.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/OtherFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/OtherFunctions.cpp'; fi` + +amuleweb-RLE.o: $(top_srcdir)/src/RLE.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-RLE.o -MD -MP -MF "$(DEPDIR)/amuleweb-RLE.Tpo" -c -o amuleweb-RLE.o `test -f '$(top_srcdir)/src/RLE.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/RLE.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-RLE.Tpo" "$(DEPDIR)/amuleweb-RLE.Po"; else rm -f "$(DEPDIR)/amuleweb-RLE.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/RLE.cpp' object='amuleweb-RLE.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-RLE.o `test -f '$(top_srcdir)/src/RLE.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/RLE.cpp + +amuleweb-RLE.obj: $(top_srcdir)/src/RLE.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-RLE.obj -MD -MP -MF "$(DEPDIR)/amuleweb-RLE.Tpo" -c -o amuleweb-RLE.obj `if test -f '$(top_srcdir)/src/RLE.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/RLE.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/RLE.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-RLE.Tpo" "$(DEPDIR)/amuleweb-RLE.Po"; else rm -f "$(DEPDIR)/amuleweb-RLE.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/RLE.cpp' object='amuleweb-RLE.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-RLE.obj `if test -f '$(top_srcdir)/src/RLE.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/RLE.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/RLE.cpp'; fi` + +amuleweb-NetworkFunctions.o: $(top_srcdir)/src/NetworkFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-NetworkFunctions.o -MD -MP -MF "$(DEPDIR)/amuleweb-NetworkFunctions.Tpo" -c -o amuleweb-NetworkFunctions.o `test -f '$(top_srcdir)/src/NetworkFunctions.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/NetworkFunctions.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-NetworkFunctions.Tpo" "$(DEPDIR)/amuleweb-NetworkFunctions.Po"; else rm -f "$(DEPDIR)/amuleweb-NetworkFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/NetworkFunctions.cpp' object='amuleweb-NetworkFunctions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-NetworkFunctions.o `test -f '$(top_srcdir)/src/NetworkFunctions.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/NetworkFunctions.cpp + +amuleweb-NetworkFunctions.obj: $(top_srcdir)/src/NetworkFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-NetworkFunctions.obj -MD -MP -MF "$(DEPDIR)/amuleweb-NetworkFunctions.Tpo" -c -o amuleweb-NetworkFunctions.obj `if test -f '$(top_srcdir)/src/NetworkFunctions.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/NetworkFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/NetworkFunctions.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-NetworkFunctions.Tpo" "$(DEPDIR)/amuleweb-NetworkFunctions.Po"; else rm -f "$(DEPDIR)/amuleweb-NetworkFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/NetworkFunctions.cpp' object='amuleweb-NetworkFunctions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-NetworkFunctions.obj `if test -f '$(top_srcdir)/src/NetworkFunctions.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/NetworkFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/NetworkFunctions.cpp'; fi` + +amuleweb-php_syntree.o: php_syntree.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-php_syntree.o -MD -MP -MF "$(DEPDIR)/amuleweb-php_syntree.Tpo" -c -o amuleweb-php_syntree.o `test -f 'php_syntree.cpp' || echo '$(srcdir)/'`php_syntree.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-php_syntree.Tpo" "$(DEPDIR)/amuleweb-php_syntree.Po"; else rm -f "$(DEPDIR)/amuleweb-php_syntree.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='php_syntree.cpp' object='amuleweb-php_syntree.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-php_syntree.o `test -f 'php_syntree.cpp' || echo '$(srcdir)/'`php_syntree.cpp + +amuleweb-php_syntree.obj: php_syntree.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-php_syntree.obj -MD -MP -MF "$(DEPDIR)/amuleweb-php_syntree.Tpo" -c -o amuleweb-php_syntree.obj `if test -f 'php_syntree.cpp'; then $(CYGPATH_W) 'php_syntree.cpp'; else $(CYGPATH_W) '$(srcdir)/php_syntree.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-php_syntree.Tpo" "$(DEPDIR)/amuleweb-php_syntree.Po"; else rm -f "$(DEPDIR)/amuleweb-php_syntree.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='php_syntree.cpp' object='amuleweb-php_syntree.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-php_syntree.obj `if test -f 'php_syntree.cpp'; then $(CYGPATH_W) 'php_syntree.cpp'; else $(CYGPATH_W) '$(srcdir)/php_syntree.cpp'; fi` + +amuleweb-php_core_lib.o: php_core_lib.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-php_core_lib.o -MD -MP -MF "$(DEPDIR)/amuleweb-php_core_lib.Tpo" -c -o amuleweb-php_core_lib.o `test -f 'php_core_lib.cpp' || echo '$(srcdir)/'`php_core_lib.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-php_core_lib.Tpo" "$(DEPDIR)/amuleweb-php_core_lib.Po"; else rm -f "$(DEPDIR)/amuleweb-php_core_lib.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='php_core_lib.cpp' object='amuleweb-php_core_lib.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-php_core_lib.o `test -f 'php_core_lib.cpp' || echo '$(srcdir)/'`php_core_lib.cpp + +amuleweb-php_core_lib.obj: php_core_lib.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-php_core_lib.obj -MD -MP -MF "$(DEPDIR)/amuleweb-php_core_lib.Tpo" -c -o amuleweb-php_core_lib.obj `if test -f 'php_core_lib.cpp'; then $(CYGPATH_W) 'php_core_lib.cpp'; else $(CYGPATH_W) '$(srcdir)/php_core_lib.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-php_core_lib.Tpo" "$(DEPDIR)/amuleweb-php_core_lib.Po"; else rm -f "$(DEPDIR)/amuleweb-php_core_lib.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='php_core_lib.cpp' object='amuleweb-php_core_lib.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-php_core_lib.obj `if test -f 'php_core_lib.cpp'; then $(CYGPATH_W) 'php_core_lib.cpp'; else $(CYGPATH_W) '$(srcdir)/php_core_lib.cpp'; fi` + +amuleweb-UPnP.o: $(top_srcdir)/src/UPnP.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-UPnP.o -MD -MP -MF "$(DEPDIR)/amuleweb-UPnP.Tpo" -c -o amuleweb-UPnP.o `test -f '$(top_srcdir)/src/UPnP.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/UPnP.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-UPnP.Tpo" "$(DEPDIR)/amuleweb-UPnP.Po"; else rm -f "$(DEPDIR)/amuleweb-UPnP.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/UPnP.cpp' object='amuleweb-UPnP.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-UPnP.o `test -f '$(top_srcdir)/src/UPnP.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/UPnP.cpp + +amuleweb-UPnP.obj: $(top_srcdir)/src/UPnP.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-UPnP.obj -MD -MP -MF "$(DEPDIR)/amuleweb-UPnP.Tpo" -c -o amuleweb-UPnP.obj `if test -f '$(top_srcdir)/src/UPnP.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/UPnP.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/UPnP.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-UPnP.Tpo" "$(DEPDIR)/amuleweb-UPnP.Po"; else rm -f "$(DEPDIR)/amuleweb-UPnP.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/UPnP.cpp' object='amuleweb-UPnP.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-UPnP.obj `if test -f '$(top_srcdir)/src/UPnP.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/UPnP.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/UPnP.cpp'; fi` + +amuleweb-UPnPCompatibility.o: UPnPCompatibility.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-UPnPCompatibility.o -MD -MP -MF "$(DEPDIR)/amuleweb-UPnPCompatibility.Tpo" -c -o amuleweb-UPnPCompatibility.o `test -f 'UPnPCompatibility.cpp' || echo '$(srcdir)/'`UPnPCompatibility.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-UPnPCompatibility.Tpo" "$(DEPDIR)/amuleweb-UPnPCompatibility.Po"; else rm -f "$(DEPDIR)/amuleweb-UPnPCompatibility.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UPnPCompatibility.cpp' object='amuleweb-UPnPCompatibility.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-UPnPCompatibility.o `test -f 'UPnPCompatibility.cpp' || echo '$(srcdir)/'`UPnPCompatibility.cpp + +amuleweb-UPnPCompatibility.obj: UPnPCompatibility.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -MT amuleweb-UPnPCompatibility.obj -MD -MP -MF "$(DEPDIR)/amuleweb-UPnPCompatibility.Tpo" -c -o amuleweb-UPnPCompatibility.obj `if test -f 'UPnPCompatibility.cpp'; then $(CYGPATH_W) 'UPnPCompatibility.cpp'; else $(CYGPATH_W) '$(srcdir)/UPnPCompatibility.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/amuleweb-UPnPCompatibility.Tpo" "$(DEPDIR)/amuleweb-UPnPCompatibility.Po"; else rm -f "$(DEPDIR)/amuleweb-UPnPCompatibility.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='UPnPCompatibility.cpp' object='amuleweb-UPnPCompatibility.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(amuleweb_CXXFLAGS) $(CXXFLAGS) -c -o amuleweb-UPnPCompatibility.obj `if test -f 'UPnPCompatibility.cpp'; then $(CYGPATH_W) 'UPnPCompatibility.cpp'; else $(CYGPATH_W) '$(srcdir)/UPnPCompatibility.cpp'; fi` +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-binPROGRAMS + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-binPROGRAMS uninstall-info-am + + +php_parser.c: php_parser.y + bison --debug -t -d -v -o $@ $< + +php_lexer.c: php_lexer.l + $(LEX) -o$@ $< + +@NEED_RC_TRUE@.rc.$(OBJEXT): +@NEED_RC_TRUE@ $(RC) $(RCFLAGS) -I$(top_srcdir) -D__WIN95__ -D__WIN32__ -D__GNUWIN32__ -O COFF -i "$<" -o "$@" + +@NEED_RC_TRUE@amuleweb-version.rc: $(top_builddir)/version.rc +@NEED_RC_TRUE@ @sed -e 's/VER_FILEDESCRIPTION_STR/"aMule Web Server"/' \ +@NEED_RC_TRUE@ -e 's/VER_INTERNALNAME_STR/"amuleweb"/' \ +@NEED_RC_TRUE@ -e 's/VER_ORIGINALFILENAME_STR/"amuleweb$(EXEEXT)"/' "$<" > "$@" +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/webserver/src/UPnPCompatibility.cpp b/src/webserver/src/UPnPCompatibility.cpp new file mode 100644 index 00000000..62231e62 --- /dev/null +++ b/src/webserver/src/UPnPCompatibility.cpp @@ -0,0 +1,61 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2007-2008 Marcelo Roberto Jimenez ( phoenix@amule.org ) +// Copyright (c) 2007-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "UPnPCompatibility.h" + + +bool CLogger::IsEnabled(DebugType /*type*/) +{ + return true; +} + + +void CLogger::AddLogLine( + const wxString &file, + int line, + bool critical, + const std::ostringstream &msg) +{ + AddLogLine(file, line, critical, static_cast(0), msg); +} + + +void CLogger::AddLogLine( + const wxString &file, + int line, + bool critical, + DebugType /*type*/, + const std::ostringstream &msg) +{ + std::string s; + if (critical) { + s = "Critical message: "; + } + printf("%s(%d): %s%s\n", + (const char *)unicode2char(file), + line, s.c_str(), msg.str().c_str()); +} + diff --git a/src/webserver/src/WebInterface.cpp b/src/webserver/src/WebInterface.cpp new file mode 100644 index 00000000..8f0bec6a --- /dev/null +++ b/src/webserver/src/WebInterface.cpp @@ -0,0 +1,400 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 shakraw ( shakraw@users.sourceforge.net ) +// Copyright (c) 2003-2008 Kry ( elkry@sourceforge.net / http://www.amule.org ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifdef HAVE_CONFIG_H + #include "config.h" // For VERSION +#endif + + +#include + + +#ifdef __WXMAC__ + #include // Do_not_auto_remove + #include // Do_not_auto_remove + #include // Do_not_auto_remove +#endif + +#include // Needed for CECFileConfig +#include + +#include "WebServer.h" + + +//------------------------------------------------------------------- +IMPLEMENT_APP(CamulewebApp) +//------------------------------------------------------------------- + +void CamulewebApp::Post_Shell() { + m_webserver->StopServer(); + delete m_webserver; + m_webserver = 0; +} + +bool CamulewebApp::OnInit() { + return CaMuleExternalConnector::OnInit(); +} + +int CamulewebApp::OnRun() { + ConnectAndRun(wxT("aMuleweb"), wxT(VERSION)); + return 0; +} + +bool CamulewebApp::CheckDirForTemplate(wxString& dir, const wxString& tmpl) +{ + DebugShow(wxT("checking for directory '") + dir + wxT("'...")); + if (wxFileName::DirExists(dir)) { + DebugShow(wxT(" yes\n")); + dir = JoinPaths(dir, tmpl); + DebugShow(wxT("checking for directory '") + dir + wxT("'...")); + if (wxFileName::DirExists(dir)) { + DebugShow(wxT(" yes\n")); + + wxString tmplPath = JoinPaths(dir, wxT("login.php")); + + DebugShow(wxT("checking for file '") + tmplPath + wxT("'...")); + if (wxFileName::FileExists(tmplPath)) { + DebugShow(wxT(" yes\n")); + // dir is already set to the directory component of the template path + return true; + } else { + DebugShow(wxT(" no\n")); + } + } else { + DebugShow(wxT(" no\n")); + } + } else { + DebugShow(wxT(" no\n")); + } + return false; +} + +bool CamulewebApp::GetTemplateDir(const wxString& templateName, wxString& templateDir) +{ + wxString dir; + + DebugShow(wxT("looking for template: ") + templateName + wxT("\n")); + +#ifdef __WXMAC__ + CFURLRef amuleBundleUrl; + OSStatus status = LSFindApplicationForInfo( + kLSUnknownCreator, + // This magic string is the bundle identifier in aMule.app's Info.plist + CFSTR("org.amule.aMule"), + NULL, + NULL, + &amuleBundleUrl + ); + if (status == noErr && amuleBundleUrl) { + CFBundleRef amuleBundle = CFBundleCreate(NULL, amuleBundleUrl); + CFRelease(amuleBundleUrl); + + if (amuleBundle) { + CFURLRef webserverDirUrl = CFBundleCopyResourceURL( + amuleBundle, + CFSTR("webserver"), + NULL, + NULL + ); + CFRelease(amuleBundle); + if (webserverDirUrl) { + CFURLRef absoluteURL = + CFURLCopyAbsoluteURL(webserverDirUrl); + CFRelease(webserverDirUrl); + if (absoluteURL) { + CFStringRef pathString = + CFURLCopyFileSystemPath( + absoluteURL, + kCFURLPOSIXPathStyle); + CFRelease(absoluteURL); + dir = wxMacCFStringHolder(pathString). + AsString(wxLocale::GetSystemEncoding()); + if (CheckDirForTemplate(dir, templateName)) { + templateDir = dir; + return true; + } + } + } + } + } +#endif + + dir = GetConfigDir() + wxT("webserver"); + if (CheckDirForTemplate(dir, templateName)) { + templateDir = dir; + return true; + } + dir = wxT(WEBSERVERDIR); + if (CheckDirForTemplate(dir, templateName)) { + templateDir = dir; + return true; + } + +#ifdef __WXGTK__ + // Returns 'aMule' when we use 'amule' elsewhere + dir = wxStandardPaths::Get().GetDataDir(); + dir = dir.BeforeLast(wxFileName::GetPathSeparator()); + dir = JoinPaths(dir, JoinPaths(wxT("amule"), wxT("webserver"))); + if (CheckDirForTemplate(dir, templateName)) { + templateDir = dir; + return true; + } +#endif + + + // template not found. reverting to default + const wxChar* const defaultTemplateName = wxT("php-default"); + + if ( templateName == defaultTemplateName ) { + return false; + } + Show(wxT("Template ") + templateName + wxT(" not found, reverting to default\n\n")); + return GetTemplateDir(defaultTemplateName, templateDir); +} + +void CamulewebApp::OnInitCmdLine(wxCmdLineParser& amuleweb_parser) +{ + CaMuleExternalConnector::OnInitCmdLine(amuleweb_parser); + amuleweb_parser.AddOption(wxT("t"), wxT("template"), + _("Loads template "), + wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); + + amuleweb_parser.AddOption(wxT("s"), wxT("server-port"), + _("Webserver HTTP port"), + wxCMD_LINE_VAL_NUMBER, wxCMD_LINE_PARAM_OPTIONAL); + + amuleweb_parser.AddSwitch(wxT("u"), wxT("enable-upnp"), + _("Use UPnP port forwarding on webserver port"), + wxCMD_LINE_PARAM_OPTIONAL); + + amuleweb_parser.AddSwitch(wxT("U"), wxT("upnp-port"), + _("UPnP port"), + wxCMD_LINE_PARAM_OPTIONAL); + + amuleweb_parser.AddSwitch(wxT("z"), wxT("enable-gzip"), + _("Use gzip compression"), + wxCMD_LINE_PARAM_OPTIONAL); + + amuleweb_parser.AddSwitch(wxT("Z"), wxT("disable-gzip"), + wxT("Do not use gzip compression"), + wxCMD_LINE_PARAM_OPTIONAL); + + amuleweb_parser.AddOption(wxT("A"), wxT("admin-pass"), + _("Full access password for webserver"), + wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); + + amuleweb_parser.AddOption(wxT("G"), wxT("guest-pass"), + _("Guest password for webserver"), + wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); + + amuleweb_parser.AddSwitch(wxT("a"), wxT("allow-guest"), + _("Allow guest access"), + wxCMD_LINE_PARAM_OPTIONAL); + + amuleweb_parser.AddSwitch(wxT("d"), wxT("deny-guest"), + _("Deny guest access"), + wxCMD_LINE_PARAM_OPTIONAL); + + amuleweb_parser.AddSwitch(wxT("L"), wxT("load-settings"), + _("Load/save webserver settings from/to remote aMule"), + wxCMD_LINE_PARAM_OPTIONAL); + + amuleweb_parser.AddOption(wxEmptyString, wxT("amule-config-file"), + _("aMule config file path. DO NOT USE DIRECTLY!"), + wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); + + /* + * In this mode, internal PHP interpreter is activated, and + * amuleweb will forward there requests for .php pages + */ + amuleweb_parser.AddSwitch(wxEmptyString, wxT("no-php"), + _("Disable PHP interpreter (deprecated)"), + wxCMD_LINE_PARAM_OPTIONAL); + + /* + * Reload .php page each time it's requested - don't cache + * compilation results. Used for script development. + */ + amuleweb_parser.AddSwitch(wxT("N"), wxT("no-script-cache"), + _("Recompile PHP pages on each request"), + wxCMD_LINE_PARAM_OPTIONAL); + +} + +bool CamulewebApp::OnCmdLineParsed(wxCmdLineParser& parser) +{ + wxString aMuleConfigFile; + if (parser.Found(wxT("amule-config-file"), &aMuleConfigFile)) { + aMuleConfigFile = FinalizeFilename(aMuleConfigFile); + if (!::wxFileExists(aMuleConfigFile)) { + fprintf(stderr, "FATAL ERROR: file '%s' does not exist.\n", + (const char*)unicode2char(aMuleConfigFile)); + return false; + } + CECFileConfig cfg(aMuleConfigFile); + LoadAmuleConfig(cfg); + // do not process any other command-line parameters, use defaults instead + + if (!(m_TemplateOk = GetTemplateDir(m_TemplateName, m_TemplateDir))) { + // no reason to run webserver without a template + fprintf(stderr, "FATAL ERROR: Cannot find template: %s\n", (const char *)unicode2char(m_TemplateName)); + return true; + } + m_TemplateFileName = JoinPaths(m_TemplateDir, wxT("aMule.tmpl")); + m_Verbose = false; + m_KeepQuiet = true; + m_LoadSettingsFromAmule = true; + return true; + } + + if (CaMuleExternalConnector::OnCmdLineParsed(parser)) { + + if ( parser.Found(wxT("no-php")) ) { + fprintf(stderr, "WARNING: --no-php switch have no effect. Long live PHP\n"); + } + + parser.Found(wxT("template"), &m_TemplateName); + if (m_TemplateName.IsEmpty()) { + m_TemplateName = wxT("php-default"); + } + if (!(m_TemplateOk = GetTemplateDir(m_TemplateName, m_TemplateDir))) { + // no reason to run webserver without a template + fprintf(stderr, "FATAL ERROR: Cannot find template: %s\n", (const char *)unicode2char(m_TemplateName)); + return true; + } + m_TemplateFileName = JoinPaths(m_TemplateDir, wxT("aMule.tmpl")); + DebugShow(wxT("*** Using template: ") + m_TemplateFileName + wxT("\n")); + + long port; + if (parser.Found(wxT("server-port"), &port)) { + m_WebserverPort = port; + } + if (parser.Found(wxT("enable-upnp"))) { + m_UPnPWebServerEnabled = true; + } + if (parser.Found(wxT("upnp-port"), &port)) { + m_UPnPTCPPort = port; + } + if (parser.Found(wxT("enable-gzip"))) { + m_UseGzip = true; + } + if (parser.Found(wxT("disable-gzip"))) { + m_UseGzip = false; + } + + if (parser.Found(wxT("allow-guest"))) { + m_AllowGuest = true; + } + if (parser.Found(wxT("deny-guest"))) { + m_AllowGuest = false; + } + + wxString tmp; + if ( parser.Found(wxT("admin-pass"), &tmp) ) { + if (tmp.IsEmpty()) { + m_AdminPass.Clear(); + } else { + m_AdminPass.Decode(MD5Sum(tmp).GetHash()); + } + } + if ( parser.Found(wxT("guest-pass"), &tmp) ) { + if (tmp.IsEmpty()) { + m_GuestPass.Clear(); + } else { + m_GuestPass.Decode(MD5Sum(tmp).GetHash()); + } + } + + m_LoadSettingsFromAmule = parser.Found(wxT("load-settings")); + return true; + } else { + return false; + } +} + +const wxString CamulewebApp::GetGreetingTitle() +{ + return _("aMule Web Server"); +} + +void CamulewebApp::Pre_Shell() { + //Creating the web server + if ( m_TemplateOk ) { + m_webserver = new CScriptWebServer(this, m_TemplateDir); + } else { + m_webserver = new CNoTemplateWebServer(this); + } + m_webserver->StartServer(); +} + +void CamulewebApp::LoadAmuleConfig(CECFileConfig& cfg) +{ + CaMuleExternalConnector::LoadAmuleConfig(cfg); + m_UseGzip = (cfg.Read(wxT("/WebServer/UseGzip"), 0l) == 1l); + m_AllowGuest = (cfg.Read(wxT("/WebServer/UseLowRightsUser"), 0l) == 1l); + cfg.ReadHash(wxT("/WebServer/Password"), &m_AdminPass); + cfg.ReadHash(wxT("/WebServer/PasswordLow"), &m_GuestPass); + m_WebserverPort = cfg.Read(wxT("/WebServer/Port"), -1l); + m_UPnPWebServerEnabled = + (cfg.Read(wxT("/Webserver/UPnPWebServerEnabled"), 0l) == 1l); + m_UPnPTCPPort = cfg.Read(wxT("/WebServer/UPnPTCPPort"), 50001l); + m_PageRefresh = cfg.Read(wxT("/WebServer/PageRefreshTime"), 120l); + m_TemplateName = cfg.Read(wxT("/WebServer/Template"), wxT("default")); +} + +void CamulewebApp::LoadConfigFile() +{ + CaMuleExternalConnector::LoadConfigFile(); + if (m_configFile) { + wxString tmp; + m_WebserverPort = m_configFile->Read(wxT("/Webserver/Port"), -1l); + m_configFile->Read(wxT("/Webserver/UPnPWebServerEnabled"), + &m_UPnPWebServerEnabled, false); + m_UPnPTCPPort = m_configFile->Read(wxT("/WebServer/UPnPTCPPort"), 50001l); + m_TemplateName = m_configFile->Read(wxT("/Webserver/Template"), wxEmptyString); + m_configFile->Read(wxT("/Webserver/UseGzip"), &m_UseGzip, false); + m_configFile->Read(wxT("/Webserver/AllowGuest"), &m_AllowGuest, false); + m_configFile->ReadHash(wxT("/Webserver/AdminPassword"), &m_AdminPass); + m_configFile->ReadHash(wxT("/Webserver/GuestPassword"), &m_GuestPass); + } +} + +void CamulewebApp::SaveConfigFile() +{ + CaMuleExternalConnector::SaveConfigFile(); + if (m_configFile) { + m_configFile->Write(wxT("/Webserver/Port"), m_WebserverPort); + m_configFile->Write(wxT("/Webserver/UPnPWebServerEnabled"), + m_UPnPWebServerEnabled); + m_configFile->Write(wxT("/WebServer/UPnPTCPPort"), m_UPnPTCPPort); + m_configFile->Write(wxT("/Webserver/Template"), m_TemplateName); + m_configFile->Write(wxT("/Webserver/UseGzip"), m_UseGzip); + m_configFile->Write(wxT("/Webserver/AllowGuest"), m_AllowGuest); + m_configFile->WriteHash(wxT("/Webserver/AdminPassword"), m_AdminPass); + m_configFile->WriteHash(wxT("/Webserver/GuestPassword"), m_GuestPass); + } +} +// File_checked_for_headers diff --git a/src/webserver/src/WebInterface.h b/src/webserver/src/WebInterface.h new file mode 100644 index 00000000..77627bbf --- /dev/null +++ b/src/webserver/src/WebInterface.h @@ -0,0 +1,76 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 shakraw ( shakraw@users.sourceforge.net ) +// Copyright (c) 2003-2008 Kry ( elkry@sourceforge.net ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef WEBINTERFACE_H +#define WEBINTERFACE_H + +#include "ExternalConnector.h" + + +class CamulewebApp +: +public CaMuleExternalConnector +{ + class CWebServerBase *m_webserver; +public: + const wxString GetGreetingTitle(); + void Pre_Shell(); + void LoadConfigFile(); + void SaveConfigFile(); + void LoadAmuleConfig(CECFileConfig& cfg); + bool GetTemplateDir(const wxString& templateName, wxString& templateDir); + bool CheckDirForTemplate(wxString& dir, const wxString& tmpl); + + // other command line switches + void OnInitCmdLine(wxCmdLineParser& amuleweb_parser); + bool OnCmdLineParsed(wxCmdLineParser& parser); + + // class data + wxString m_TemplateName; + wxString m_TemplateDir; + wxString m_TemplateFileName; + bool m_UseGzip; + CMD4Hash m_AdminPass, m_GuestPass; + bool m_AllowGuest; + + long m_WebserverPort; + bool m_UPnPWebServerEnabled; + int m_UPnPTCPPort; + unsigned int m_PageRefresh; + bool m_LoadSettingsFromAmule; + + bool m_TemplateOk; + +public: + virtual void Post_Shell(); + +private: + virtual bool OnInit(); + virtual int OnRun(); +}; + +#endif // WEBINTERFACE_H +// File_checked_for_headers diff --git a/src/webserver/src/WebServer.cpp b/src/webserver/src/WebServer.cpp new file mode 100644 index 00000000..3f20b4ef --- /dev/null +++ b/src/webserver/src/WebServer.cpp @@ -0,0 +1,1972 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 Kry ( elkry@sourceforge.net / http://www.amule.org ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include // Needed for cos, M_PI +#include // Do_not_auto_remove (g++-4.0.1) + +#include + +//------------------------------------------------------------------- + +#include // for wxTokenizer +#include + +#include // Needed for CECFileConfig +#include +#include +#include // Needed for CFormat + +//------------------------------------------------------------------- + +#include "WebSocket.h" // Needed for StopSockets() +#include "Color.h" // Needed for COLORREF and RGB() + +#include "php_syntree.h" +#include "php_core_lib.h" + +//------------------------------------------------------------------- + +inline void set_rgb_color_val(unsigned char *start, uint32 val, unsigned char mod) +{ + unsigned char r = val, g = val >> 8, b = val >> 16; + start[0] = ( r > mod ) ? (r - mod) : 1; + start[1] = ( g > mod ) ? (g - mod) : 1; + start[2] = ( b > mod ) ? (b - mod) : 1; +} + +wxString _SpecialChars(wxString str) { + str.Replace(wxT("&"),wxT("&")); + str.Replace(wxT("<"),wxT("<")); + str.Replace(wxT(">"),wxT(">")); + str.Replace(wxT("\""),wxT(""")); + return str; +} + +uint8 GetHigherPrio(uint32 prio, bool autoprio) +{ + if (autoprio) { + return PR_LOW; + } else { + switch (prio) { + case PR_LOW: return PR_NORMAL; + case PR_NORMAL: return PR_HIGH; + case PR_HIGH: return PR_AUTO; + case PR_AUTO: return PR_LOW; + default: return PR_AUTO; + } + } +} + +uint8 GetHigherPrioShared(uint32 prio, bool autoprio) +{ + if (autoprio) { + return PR_VERYLOW; + } else { + switch (prio) { + case PR_VERYLOW: return PR_LOW; + case PR_LOW: return PR_NORMAL; + case PR_NORMAL: return PR_HIGH; + case PR_HIGH: return PR_VERYHIGH; + case PR_VERYHIGH: return PR_POWERSHARE; + case PR_POWERSHARE: return PR_AUTO; + case PR_AUTO: return PR_VERYLOW; + default: return PR_AUTO; + } + } +} + + +uint8 GetLowerPrio(uint32 prio, bool autoprio) +{ + if (autoprio) { + return PR_HIGH; + } else { + switch (prio) { + case PR_LOW: return PR_AUTO; + case PR_NORMAL: return PR_LOW; + case PR_HIGH: return PR_NORMAL; + case PR_AUTO: return PR_HIGH; + default: return PR_AUTO; + } + } +} + +uint8 GetLowerPrioShared(uint32 prio, bool autoprio) +{ + if (autoprio) { + return PR_POWERSHARE; + } else { + switch (prio) { + case PR_VERYLOW: return PR_AUTO; + case PR_LOW: return PR_VERYLOW; + case PR_NORMAL: return PR_LOW; + case PR_HIGH: return PR_NORMAL; + case PR_VERYHIGH: return PR_HIGH; + case PR_POWERSHARE: return PR_VERYHIGH; + case PR_AUTO: return PR_POWERSHARE; + default: return PR_AUTO; + } + } +} + +/* + * Url string decoder and parser + */ +CUrlDecodeTable::CUrlDecodeTable() +{ + for (int i = 0 ; i < 256 ; i++) { + char fromReplace[4]; // decode URL + snprintf(fromReplace, sizeof(fromReplace), "%%%02x", i); + m_enc_l_str[i] = char2unicode(fromReplace); + + snprintf(fromReplace, sizeof(fromReplace), "%%%02X", i); + m_enc_u_str[i] = char2unicode(fromReplace); + + m_dec_str[i] = wxString::Format(wxT("%c"), i); + } +} + +void CUrlDecodeTable::DecodeString(wxString &str) +{ + str.Replace(wxT("+"), wxT(" ")); + for (int i = 0 ; i < 256 ; ++i) { + str.Replace(m_enc_l_str[i], m_dec_str[i]); + str.Replace(m_enc_u_str[i], m_dec_str[i]); + } + size_t n = str.Len(); + std::vector buffer(n + 1); + for (size_t i = 0; i < n; ++i) { + buffer[i] = str[i]; + } + buffer[n] = 0; // Mark the end of the string + str = UTF82unicode(&buffer[0]); +} + +CUrlDecodeTable* CUrlDecodeTable::ms_instance; +wxCriticalSection CUrlDecodeTable::ms_instance_guard; + +CUrlDecodeTable* CUrlDecodeTable::GetInstance() +{ + wxCriticalSectionLocker lock(ms_instance_guard); + if (ms_instance == NULL) { + ms_instance = new CUrlDecodeTable(); + } + return ms_instance; +} + +CParsedUrl::CParsedUrl(const wxString &url) +{ + if ( url.Find('/') != -1 ) { + m_path = url.BeforeFirst('/'); + m_file = url.AfterFirst('/'); + } + + if ( url.Find('?') != -1 ) { + m_file.Truncate(m_file.Find('?')); + + wxString params = url.AfterFirst('?'); + + wxStringTokenizer tkz(params, wxT("&")); + while ( tkz.HasMoreTokens() ) { + wxString param_val = tkz.GetNextToken(); + wxString key = param_val.BeforeFirst('='); + wxString val = param_val.AfterFirst('='); + CUrlDecodeTable::GetInstance()->DecodeString(val); + if ( m_params.count(key) ) { + m_params[key] = m_params[key] + wxT("|") + val; + } else { + m_params[key] = val; + } + } + } +} + +void CParsedUrl::ConvertParams(std::map &dst) +{ + for(std::map::iterator i = m_params.begin(); i != m_params.end(); i++) { + std::string key(unicode2char(i->first)), value(unicode2char(i->second)); + dst[key] = value; + } +} + +CWebServerBase::CWebServerBase(CamulewebApp *webApp, const wxString& templateDir) : + m_ServersInfo(webApp), m_SharedFileInfo(webApp), m_DownloadFileInfo(webApp, &m_ImageLib), + m_UploadsInfo(webApp), m_SearchInfo(webApp), m_Stats(500, webApp), + m_ImageLib(templateDir) +{ + webInterface = webApp; + + // + // Init stat graphs +#ifdef WITH_LIBPNG + m_ImageLib.AddImage(new CDynStatisticImage(200, true, m_Stats.DownloadSpeed()), + wxT("/amule_stats_download.png")); + m_ImageLib.AddImage(new CDynStatisticImage(200, true, m_Stats.UploadSpeed()), + wxT("/amule_stats_upload.png")); + m_ImageLib.AddImage(new CDynStatisticImage(200, false, m_Stats.ConnCount()), + wxT("/amule_stats_conncount.png")); + m_ImageLib.AddImage(new CDynStatisticImage(200, false, m_Stats.KadCount()), + wxT("/amule_stats_kad.png")); +#endif +} + +//sends output to web interface +void CWebServerBase::Print(const wxString &s) +{ + webInterface->Show(s); +} + +//returns web server listening port +long CWebServerBase::GetWSPrefs(void) +{ + CECPacket req(EC_OP_GET_PREFERENCES); + req.AddTag(CECTag(EC_TAG_SELECT_PREFS, (uint32)EC_PREFS_REMOTECONTROLS)); + const CECPacket *reply = webInterface->SendRecvMsg_v2(&req); + if (!reply) { + return -1; + } + // we have selected only the webserver preferences + const CECTag *wsprefs = reply->GetTagByIndexSafe(0); + const CECTag *tag = wsprefs->GetTagByName(EC_TAG_WEBSERVER_PORT); + long int wsport = tag ? (long int)tag->GetInt() : -1; + + if (webInterface->m_LoadSettingsFromAmule) { + webInterface->m_AdminPass = wsprefs->GetTagByNameSafe(EC_TAG_PASSWD_HASH)->GetMD4Data(); + + const CECTag *webserverGuest = wsprefs->GetTagByName(EC_TAG_WEBSERVER_GUEST); + if (webserverGuest) { + webInterface->m_AllowGuest = true; + webInterface->m_GuestPass = webserverGuest->GetTagByNameSafe(EC_TAG_PASSWD_HASH)->GetMD4Data(); + } else { + webInterface->m_AllowGuest = false; + } + + // we only need to check the presence of this tag + webInterface->m_UseGzip = wsprefs->GetTagByName(EC_TAG_WEBSERVER_USEGZIP) != NULL; + + const CECTag *webserverRefresh = wsprefs->GetTagByName(EC_TAG_WEBSERVER_REFRESH); + if (webserverRefresh) { + webInterface->m_PageRefresh = webserverRefresh->GetInt(); + } else { + webInterface->m_PageRefresh = 120; + } + } + + delete reply; + + return wsport; +} + +void CScriptWebServer::ProcessImgFileReq(ThreadData Data) +{ + webInterface->DebugShow(wxT("**** imgrequest: ") + Data.sURL + wxT("\n")); + wxMutexLocker lock(m_mutexChildren); + + const CSession* session = CheckLoggedin(Data); + + // To prevent access to non-template images, we disallow use of paths in filenames. + wxString imgName = wxFileName::GetPathSeparator() + wxFileName(Data.parsedURL.File()).GetFullName(); + CAnyImage *img = m_ImageLib.GetImage(imgName); + + // Only static images are available to visitors, in order to prevent + // information leakage, but still allowing images on the login page. + if (img && (session->m_loggedin || dynamic_cast(img))) { + int img_size = 0; + unsigned char* img_data = img->RequestData(img_size); + // This unicode2char is ok. + Data.pSocket->SendContent(unicode2char(img->GetHTTP()), img_data, img_size); + } else if (not session->m_loggedin) { + webInterface->DebugShow(wxT("**** imgrequest: failed, not logged in\n")); + ProcessURL(Data); + } else { + webInterface->DebugShow(wxT("**** imgrequest: failed\n")); + } +} + +// send EC request and discard output +void CWebServerBase::Send_Discard_V2_Request(CECPacket *request) +{ + const CECPacket *reply = webInterface->SendRecvMsg_v2(request); + const CECTag *tag = NULL; + if (reply) { + if ( reply->GetOpCode() == EC_OP_STRINGS ) { + for(int i = 0; i < reply->GetTagCount(); ++i) { + if ( (tag = reply->GetTagByIndex(i)) && + (tag->GetTagName() == EC_TAG_STRING)) { + webInterface->Show(tag->GetStringData()); + } + } + } else if (reply->GetOpCode() == EC_OP_FAILED) { + if ( reply->GetTagCount() && + (tag = reply->GetTagByIndex(0)) ) { + webInterface->Show( + CFormat(_("Request failed with the following error: %s.")) % + wxString(wxGetTranslation(tag->GetStringData()))); + } else { + webInterface->Show(_("Request failed with an unknown error.")); + } + } + delete reply; + } +} + +// +// Command interface +// +void CWebServerBase::Send_SharedFile_Cmd(wxString file_hash, wxString cmd, uint32 opt_arg) +{ + CECPacket *ec_cmd = 0; + CMD4Hash fileHash; + wxCHECK2(fileHash.Decode(file_hash), /* Do nothing. */ ); + + CECTag hashtag(EC_TAG_KNOWNFILE, fileHash); + if (cmd == wxT("prio")) { + ec_cmd = new CECPacket(EC_OP_SHARED_SET_PRIO); + hashtag.AddTag(CECTag(EC_TAG_PARTFILE_PRIO, (uint8)opt_arg)); + } else if ( cmd == wxT("prioup") ) { + SharedFile *file = m_SharedFileInfo.GetByID(fileHash); + if ( file ) { + ec_cmd = new CECPacket(EC_OP_SHARED_SET_PRIO); + hashtag.AddTag(CECTag(EC_TAG_PARTFILE_PRIO, + GetHigherPrioShared(file->nFilePriority, file->bFileAutoPriority))); + } + } else if ( cmd == wxT("priodown") ) { + SharedFile *file = m_SharedFileInfo.GetByID(fileHash); + if ( file ) { + ec_cmd = new CECPacket(EC_OP_SHARED_SET_PRIO); + hashtag.AddTag(CECTag(EC_TAG_PARTFILE_PRIO, + GetLowerPrioShared(file->nFilePriority, file->bFileAutoPriority))); + } + } + + if ( ec_cmd ) { + ec_cmd->AddTag(hashtag); + Send_Discard_V2_Request(ec_cmd); + delete ec_cmd; + } +} + +void CWebServerBase::Send_ReloadSharedFile_Cmd() +{ + CECPacket ec_cmd(EC_OP_SHAREDFILES_RELOAD); + Send_Discard_V2_Request(&ec_cmd); +} + +void CWebServerBase::Send_DownloadFile_Cmd(wxString file_hash, wxString cmd, uint32 opt_arg) +{ + CECPacket *ec_cmd = 0; + CMD4Hash fileHash; + wxCHECK2(fileHash.Decode(file_hash), /* Do nothing. */ ); + + CECTag hashtag(EC_TAG_PARTFILE, fileHash); + if (cmd == wxT("pause")) { + ec_cmd = new CECPacket(EC_OP_PARTFILE_PAUSE); + } else if (cmd == wxT("resume")) { + ec_cmd = new CECPacket(EC_OP_PARTFILE_RESUME); + } else if (cmd == wxT("cancel")) { + ec_cmd = new CECPacket(EC_OP_PARTFILE_DELETE); + } else if (cmd == wxT("prio")) { + ec_cmd = new CECPacket(EC_OP_PARTFILE_PRIO_SET); + hashtag.AddTag(CECTag(EC_TAG_PARTFILE_PRIO, (uint8)opt_arg)); + } else if (cmd == wxT("prioup")) { + DownloadFile *file = m_DownloadFileInfo.GetByID(fileHash); + if ( file ) { + ec_cmd = new CECPacket(EC_OP_PARTFILE_PRIO_SET); + hashtag.AddTag(CECTag(EC_TAG_PARTFILE_PRIO, + GetHigherPrio(file->lFilePrio, file->bFileAutoPriority))); + } + } else if (cmd == wxT("priodown")) { + DownloadFile *file = m_DownloadFileInfo.GetByID(fileHash); + if ( file ) { + ec_cmd = new CECPacket(EC_OP_PARTFILE_PRIO_SET); + hashtag.AddTag(CECTag(EC_TAG_PARTFILE_PRIO, + GetLowerPrio(file->lFilePrio, file->bFileAutoPriority))); + } + } + + if ( ec_cmd ) { + ec_cmd->AddTag(hashtag); + Send_Discard_V2_Request(ec_cmd); + delete ec_cmd; + } +} + +void CWebServerBase::Send_DownloadSearchFile_Cmd(wxString file_hash, uint8 cat) +{ + CMD4Hash fileHash; + wxCHECK2(fileHash.Decode(file_hash), /* Do nothing. */ ); + + CECPacket ec_cmd(EC_OP_DOWNLOAD_SEARCH_RESULT); + CECTag link_tag(EC_TAG_KNOWNFILE, fileHash); + + link_tag.AddTag(CECTag(EC_TAG_PARTFILE_CAT, cat)); + ec_cmd.AddTag(link_tag); + Send_Discard_V2_Request(&ec_cmd); +} + +void CWebServerBase::Send_AddServer_Cmd(wxString addr, wxString port, wxString name) +{ + CECPacket ec_cmd(EC_OP_SERVER_ADD); + + addr.Trim(); + port.Trim(); + + CECTag srv_tag(EC_TAG_SERVER, addr + wxT(":") + port); + srv_tag.AddTag(CECTag(EC_TAG_SERVER_ADDRESS, addr + wxT(":") + port)); + srv_tag.AddTag(CECTag(EC_TAG_SERVER_NAME, name)); + + ec_cmd.AddTag(srv_tag); + + Send_Discard_V2_Request(&ec_cmd); +} + +void CWebServerBase::Send_Server_Cmd(uint32 ip, uint16 port, wxString cmd) +{ + CECPacket *ec_cmd = 0; + if ( cmd == wxT("connect") ) { + ec_cmd = new CECPacket(EC_OP_SERVER_CONNECT); + } else if ( cmd == wxT("remove") ) { + ec_cmd = new CECPacket(EC_OP_SERVER_REMOVE); + } else if ( cmd == wxT("disconnect") ) { + ec_cmd = new CECPacket(EC_OP_SERVER_DISCONNECT); + } + if ( ec_cmd && ip ) { + ec_cmd->AddTag(CECTag(EC_TAG_SERVER, EC_IPv4_t(ip, port))); + Send_Discard_V2_Request(ec_cmd); + delete ec_cmd; + } +} + +void CWebServerBase::Send_Search_Cmd(wxString search, wxString extention, wxString type, + EC_SEARCH_TYPE search_type, uint32 avail, uint32 min_size, uint32 max_size) +{ + CECPacket search_req(EC_OP_SEARCH_START); + search_req.AddTag(CEC_Search_Tag (search, search_type, + type, extention, avail, min_size, max_size)); + Send_Discard_V2_Request(&search_req); +} + +bool CWebServerBase::Send_DownloadEd2k_Cmd(wxString link, uint8 cat) +{ + CECPacket req(EC_OP_ADD_LINK); + CECTag link_tag(EC_TAG_STRING, link); + link_tag.AddTag(CECTag(EC_TAG_PARTFILE_CAT, cat)); + req.AddTag(link_tag); + const CECPacket *response = webInterface->SendRecvMsg_v2(&req); + bool result = (response->GetOpCode() == EC_OP_FAILED); + delete response; + return result; +} + +// We have to add gz-header and some other stuff +// to standard zlib functions in order to use gzip in web pages +int CWebServerBase::GzipCompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level) +{ + static const int gz_magic[2] = {0x1f, 0x8b}; // gzip magic header + z_stream stream = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + uLong crc = crc32(0L, Z_NULL, 0); + // init Zlib stream + // NOTE windowBits is passed < 0 to suppress zlib header + int err = deflateInit2(&stream, level, Z_DEFLATED, -MAX_WBITS, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY); + if (err != Z_OK) { + return err; + } + + snprintf((char*)dest, *destLen, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], + Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, 255); + + // wire buffers + stream.next_in = const_cast(source); + stream.avail_in = (uInt)sourceLen; + stream.next_out = ((Bytef*) dest) + 10; + stream.avail_out = *destLen - 18; + // doit + err = deflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + deflateEnd(&stream); + return err; + } + err = deflateEnd(&stream); + crc = crc32(crc, (const Bytef *) source , sourceLen ); + //CRC + *(((Bytef*) dest)+10+stream.total_out) = (Bytef)(crc & 0xFF); + *(((Bytef*) dest)+10+stream.total_out+1) = (Bytef)((crc>>8) & 0xFF); + *(((Bytef*) dest)+10+stream.total_out+2) = (Bytef)((crc>>16) & 0xFF); + *(((Bytef*) dest)+10+stream.total_out+3) = (Bytef)((crc>>24) & 0xFF); + // Length + *(((Bytef*) dest)+10+stream.total_out+4) = (Bytef)( sourceLen & 0xFF); + *(((Bytef*) dest)+10+stream.total_out+5) = (Bytef)(( sourceLen >>8) & 0xFF); + *(((Bytef*) dest)+10+stream.total_out+6) = (Bytef)(( sourceLen >>16) & 0xFF); + *(((Bytef*) dest)+10+stream.total_out+7) = (Bytef)(( sourceLen >>24) & 0xFF); + // return destLength + *destLen = 10 + stream.total_out + 8; + + return err; +} + + + +/* + * Item container implementation + */ + +ServersInfo *ServerEntry::GetContainerInstance() +{ + return ServersInfo::m_This; +} + +ServersInfo *ServersInfo::m_This = 0; + +ServersInfo::ServersInfo(CamulewebApp *webApp) : ItemsContainer(webApp) +{ + m_This = this; + +} + +bool ServersInfo::ServersInfo::ReQuery() +{ + CECPacket srv_req(EC_OP_GET_SERVER_LIST); + const CECPacket *srv_reply = m_webApp->SendRecvMsg_v2(&srv_req); + if (!srv_reply) { + return false; + } + // + // query succeded - flush existing values and refill + EraseAll(); + for (int i = 0; i < srv_reply->GetTagCount(); ++i) { + const CECTag *tag = srv_reply->GetTagByIndex(i); + + ServerEntry Entry; + Entry.sServerName = + _SpecialChars(tag->GetTagByNameSafe(EC_TAG_SERVER_NAME)->GetStringData()); + Entry.sServerDescription = + _SpecialChars(tag->GetTagByNameSafe(EC_TAG_SERVER_DESC)->GetStringData()); + Entry.sServerIP = tag->GetIPv4Data().StringIP(false); + Entry.nServerIP = tag->GetIPv4Data().IP(); + Entry.nServerPort = tag->GetIPv4Data().m_port; + Entry.nServerUsers = + tag->GetTagByNameSafe(EC_TAG_SERVER_USERS)->GetInt(); + Entry.nServerMaxUsers = + tag->GetTagByNameSafe(EC_TAG_SERVER_USERS_MAX)->GetInt(); + Entry.nServerFiles = + tag->GetTagByNameSafe(EC_TAG_SERVER_FILES)->GetInt(); + AddItem(Entry); + } + delete srv_reply; + + return true; +} + + +SharedFile::SharedFile(CEC_SharedFile_Tag *tag) +{ + sFileName = _SpecialChars(tag->FileName()); + lFileSize = tag->SizeFull(); + sED2kLink = _SpecialChars(tag->FileEd2kLink()); + nHash = tag->ID(); + + ProcessUpdate(tag); +} + +void SharedFile::ProcessUpdate(CEC_SharedFile_Tag *tag) +{ + nFileTransferred = tag->GetXferred(); + nFileAllTimeTransferred = tag->GetAllXferred(); + nFileRequests = tag->GetRequests(); + nFileAllTimeRequests = tag->GetAllRequests(); + nFileAccepts = tag->GetAccepts(); + nFileAllTimeAccepts = tag->GetAllAccepts(); + sFileHash = nHash.Encode(); + nFilePriority = tag->Prio(); + if ( nFilePriority >= 10 ) { + bFileAutoPriority = true; + nFilePriority -= 10; + } else { + bFileAutoPriority = false; + } +} + +SharedFileInfo *SharedFile::GetContainerInstance() +{ + return SharedFileInfo::m_This; +} + +SharedFileInfo *SharedFileInfo::m_This = 0; + +SharedFileInfo::SharedFileInfo(CamulewebApp *webApp) : + UpdatableItemsContainer(webApp) +{ + m_This = this; +} + + +bool SharedFileInfo::ReQuery() +{ + DoRequery(EC_OP_GET_SHARED_FILES, EC_TAG_KNOWNFILE); + + return true; +} + + +DownloadFile::DownloadFile(CEC_PartFile_Tag *tag) +{ + nHash = tag->ID(); + sFileName = _SpecialChars(tag->FileName()); + lFileSize = tag->SizeFull(); + sFileHash = nHash.Encode(); + sED2kLink = _SpecialChars(tag->FileEd2kLink()); + lFileCompleted = tag->SizeDone(); + lFileTransferred = tag->SizeXfer(); + lFileSpeed = tag->Speed(); + fCompleted = (100.0*lFileCompleted) / lFileSize; + wxtLastSeenComplete = wxDateTime( tag->LastSeenComplete() ); + + m_Encoder = PartFileEncoderData( (lFileSize + (PARTSIZE - 1)) / PARTSIZE, 10); + + ProcessUpdate(tag); +} + +void DownloadFile::ProcessUpdate(CEC_PartFile_Tag *tag) +{ + if (!tag) { + return; + } + + lFilePrio = tag->Prio(); + if ( lFilePrio >= 10 ) { + lFilePrio -= 10; + bFileAutoPriority = true; + } else { + bFileAutoPriority = false; + } + nCat = tag->FileCat(); + + nFileStatus = tag->FileStatus(); + lSourceCount = tag->SourceCount(); + lNotCurrentSourceCount = tag->SourceNotCurrCount(); + lTransferringSourceCount = tag->SourceXferCount(); + lSourceCountA4AF = tag->SourceCountA4AF(); + if ( lTransferringSourceCount > 0 ) { + lFileCompleted = tag->SizeDone(); + lFileTransferred = tag->SizeXfer(); + lFileSpeed = tag->Speed(); + fCompleted = (100.0*lFileCompleted) / lFileSize; + } else { + lFileSpeed = 0; + } + CECTag *gaptag = tag->GetTagByName(EC_TAG_PARTFILE_GAP_STATUS); + CECTag *parttag = tag->GetTagByName(EC_TAG_PARTFILE_PART_STATUS); + CECTag *reqtag = tag->GetTagByName(EC_TAG_PARTFILE_REQ_STATUS); + if (gaptag && parttag && reqtag) { + m_Encoder.Decode( + (unsigned char *)gaptag->GetTagData(), gaptag->GetTagDataLen(), + (unsigned char *)parttag->GetTagData(), parttag->GetTagDataLen()); + + const Gap_Struct *reqparts = (const Gap_Struct *)reqtag->GetTagData(); + int reqcount = reqtag->GetTagDataLen() / sizeof(Gap_Struct); + m_ReqParts.resize(reqcount); + for (int i = 0; i < reqcount;i++) { + m_ReqParts[i].start = ENDIAN_NTOHLL(reqparts[i].start); + m_ReqParts[i].end = ENDIAN_NTOHLL(reqparts[i].end); + } + } +} + +DownloadFileInfo *DownloadFile::GetContainerInstance() +{ + return DownloadFileInfo::m_This; +} + +DownloadFileInfo *DownloadFileInfo::m_This = 0; + +DownloadFileInfo::DownloadFileInfo(CamulewebApp *webApp, CImageLib *imlib) : + UpdatableItemsContainer(webApp) +{ + m_This = this; + m_ImageLib = imlib; +} + +void DownloadFileInfo::LoadImageParams(wxString &tpl, int width, int height) +{ + m_Template = tpl; + m_width = width; + m_height = height; +} + +void DownloadFileInfo::ItemInserted(DownloadFile *item) +{ + item->m_Image = new CDynProgressImage(m_width, m_height, m_Template, item); + +#ifdef WITH_LIBPNG + m_ImageLib->AddImage(item->m_Image, wxT("/") + item->m_Image->Name()); +#endif +} + +void DownloadFileInfo::ItemDeleted(DownloadFile *item) +{ +#ifdef WITH_LIBPNG + m_ImageLib->RemoveImage(wxT("/") + item->m_Image->Name()); +#endif + delete item->m_Image; +} + +bool DownloadFileInfo::ReQuery() +{ + DoRequery(EC_OP_GET_DLOAD_QUEUE, EC_TAG_PARTFILE); + + return true; +} + + +UploadFile::UploadFile(CEC_UpDownClient_Tag *tag) +{ + nHash = tag->FileID(); + sUserName = _SpecialChars(tag->ClientName()); + nSpeed = tag->SpeedUp(); + nTransferredUp = tag->XferUp(); + nTransferredDown = tag->XferDown(); +} + +UploadsInfo *UploadFile::GetContainerInstance() +{ + return UploadsInfo::m_This; +} + +UploadsInfo *UploadsInfo::m_This = 0; + +UploadsInfo::UploadsInfo(CamulewebApp *webApp) : ItemsContainer(webApp) +{ + m_This = this; +} + +bool UploadsInfo::ReQuery() +{ + CECPacket up_req(EC_OP_GET_ULOAD_QUEUE); + const CECPacket *up_reply = m_webApp->SendRecvMsg_v2(&up_req); + if (!up_reply) { + return false; + } + // + // query succeded - flush existing values and refill + EraseAll(); + for(int i = 0; i < up_reply->GetTagCount(); i ++) { + + UploadFile curr((CEC_UpDownClient_Tag *)up_reply->GetTagByIndex(i)); + + AddItem(curr); + } + delete up_reply; + + return true; +} + +SearchFile::SearchFile(CEC_SearchFile_Tag *tag) +{ + nHash = tag->FileHash(); + sHash = nHash.Encode(); + sFileName = _SpecialChars(tag->FileName()); + lFileSize = tag->SizeFull(); + lSourceCount = tag->SourceCount(); + bPresent = tag->AlreadyHave(); +} + +void SearchFile::ProcessUpdate(CEC_SearchFile_Tag *tag) +{ + lSourceCount = tag->SourceCount(); +} + +SearchInfo *SearchFile::GetContainerInstance() +{ + return SearchInfo::m_This; +} + +SearchInfo *SearchInfo::m_This = 0; + +SearchInfo::SearchInfo(CamulewebApp *webApp) : + UpdatableItemsContainer(webApp) +{ + m_This = this; +} + +bool SearchInfo::ReQuery() +{ + DoRequery(EC_OP_SEARCH_RESULTS, EC_TAG_SEARCHFILE); + + return true; +} + + +/*! + * Image classes: + * + * CFileImage: simply represent local file + * CDynProgressImage: dynamically generated from gap info + */ + +CAnyImage::CAnyImage(int size) +{ + m_size = 0; + m_alloc_size = size; + if ( m_alloc_size ) { + m_data = new unsigned char[m_alloc_size]; + } else { + m_data = 0; + } +} + +CAnyImage::CAnyImage(int width, int height) : m_width(width), m_height(height) +{ + m_size = 0; + // allocate considering image header + m_alloc_size = width * height * sizeof(uint32) + 0x100; + if ( m_alloc_size ) { + m_data = new unsigned char[m_alloc_size]; + } else { + m_data = 0; + } +} + +CAnyImage::~CAnyImage() +{ + if ( m_data ) { + delete [] m_data; + } +} + +void CAnyImage::Realloc(int size) +{ + if ( size == m_alloc_size ) { + return; + } + // always grow, but shrink only x2 + if ( (size > m_alloc_size) || (size < (m_alloc_size / 2)) ) { + m_alloc_size = size; + if ( m_data ) { + delete [] m_data; + } + m_data = new unsigned char[m_alloc_size]; + } +} + +unsigned char *CAnyImage::RequestData(int &size) +{ + size = m_size; + return m_data; +} + +void CAnyImage::SetHttpType(wxString ext) +{ + m_Http = wxT("Content-Type: ") + ext + wxT("\r\n"); + + time_t t = time(NULL); + char tmp[255]; + strftime(tmp, 255, "%a, %d %b %Y %H:%M:%S GMT", gmtime(&t)); + m_Http += wxT("Last-Modified: ") + wxString(char2unicode(tmp)) + wxT("\r\n"); + + m_Http += wxT("ETag: ") + MD5Sum(char2unicode(tmp)).GetHash() + wxT("\r\n"); +} + +CFileImage::CFileImage(const wxString& name) : CAnyImage(0) +{ + m_size = 0; + m_name = name; + wxFFile fis(m_name); + // FIXME: proper logging is needed + if ( fis.IsOpened() ) { + size_t file_size = fis.Length(); + if ( file_size ) { + Realloc(fis.Length()); + m_size = fis.Read(m_data,file_size); + } else { + printf("CFileImage: file %s have zero length\n", (const char *)unicode2char(m_name)); + } + wxString ext = m_name.Right(3).MakeLower(); + if ( ext == wxT("css") ) { + SetHttpType(wxT("text/css")); + } else { + SetHttpType(wxT("image/") + ext); + } + } else { + printf("CFileImage: failed to open %s\n", (const char *)unicode2char(m_name)); + } +} + +/*! + * "Modifiers" for 3D look of progress bar. Those modifiers must be substracted from + * image (with saturation), values, and not multiplied, as amule doesn for some reason. + * + */ +CImage3D_Modifiers::CImage3D_Modifiers(int width) +{ + m_width = width; + m_modifiers = new unsigned char[m_width]; + for(int i = 0; i < m_width; i++) { + // "70" - webserver uses fixed depth + double f_curr_mod = 30 * (1 + cos( (2 * M_PI) * ( m_width - (((double)i)/m_width) ) ) ); + m_modifiers[i] = (unsigned char)f_curr_mod; + } +} + +CImage3D_Modifiers::~CImage3D_Modifiers() +{ + delete [] m_modifiers; +} + +CProgressImage::CProgressImage(int width, int height, wxString &tmpl, DownloadFile *file) : + CAnyImage(width, height), m_template(tmpl) +{ + m_file = file; + + m_gap_buf_size = m_gap_alloc_size = m_file->m_Encoder.m_gap_status.Size() / (2 * sizeof(uint64)); + m_gap_buf = new Gap_Struct[m_gap_alloc_size]; + + m_ColorLine = new uint32[m_width]; +} + +CProgressImage::~CProgressImage() +{ + delete [] m_gap_buf; + delete [] m_ColorLine; +} + +void CProgressImage::ReallocGapBuffer() +{ + int size = m_file->m_Encoder.m_gap_status.Size() / (2 * sizeof(uint64)); + if ( size == m_gap_alloc_size ) { + return; + } + if ( (size > m_gap_alloc_size) || (size < m_gap_alloc_size/2) ) { + m_gap_buf_size = m_gap_alloc_size = size; + delete [] m_gap_buf; + m_gap_buf = new Gap_Struct[m_gap_alloc_size]; + } else { + m_gap_buf_size = size; + } +} + +void CProgressImage::InitSortedGaps() +{ + ReallocGapBuffer(); + + const uint64 *gap_info = (const uint64 *)m_file->m_Encoder.m_gap_status.Buffer(); + m_gap_buf_size = m_file->m_Encoder.m_gap_status.Size() / (2 * sizeof(uint64)); + + //memcpy(m_gap_buf, gap_info, m_gap_buf_size*2*sizeof(uint32)); + for (int j = 0; j < m_gap_buf_size;j++) { + uint64 gap_start = ENDIAN_NTOHLL(gap_info[2*j]); + uint64 gap_end = ENDIAN_NTOHLL(gap_info[2*j+1]); + m_gap_buf[j].start = gap_start; + m_gap_buf[j].end = gap_end; + } + qsort(m_gap_buf, m_gap_buf_size, 2*sizeof(uint64), compare_gaps); +} + +void CProgressImage::CreateSpan() +{ + // Step 1: sort gaps list in accending order + InitSortedGaps(); + + // allocate for worst case ! + int color_gaps_alloc = 2 * (2*m_gap_buf_size + m_file->lFileSize / PARTSIZE + 1); + Color_Gap_Struct *colored_gaps = new Color_Gap_Struct[color_gaps_alloc]; + + // Step 2: combine gap and part status information + const unsigned char *part_info = m_file->m_Encoder.m_part_status.Buffer(); + + // Init first item to dummy info, so we will always have "previous" item + int colored_gaps_size = 0; + colored_gaps[0].start = 0; + colored_gaps[0].end = 0; + colored_gaps[0].color = 0xffffffff; + for (int j = 0; j < m_gap_buf_size;j++) { + uint64 gap_start = m_gap_buf[j].start; + uint64 gap_end = m_gap_buf[j].end; + + uint32 start = gap_start / PARTSIZE; + uint32 end = (gap_end / PARTSIZE) + 1; + + for (uint32 i = start; i < end; i++) { + COLORREF color = RGB(255, 0, 0); + if ( part_info[i] ) { + int blue = 210 - ( 22 * ( part_info[i] - 1 ) ); + color = RGB( 0, ( blue < 0 ? 0 : blue ), 255 ); + } + + uint32 fill_gap_begin = ( (i == start) ? gap_start: PARTSIZE * i ); + uint32 fill_gap_end = ( (i == (end - 1)) ? gap_end : PARTSIZE * ( i + 1 ) ); + + wxASSERT(colored_gaps_size < color_gaps_alloc); + + if ( (colored_gaps[colored_gaps_size].end == fill_gap_begin) && + (colored_gaps[colored_gaps_size].color == color) ) { + colored_gaps[colored_gaps_size].end = fill_gap_end; + } else { + colored_gaps_size++; + colored_gaps[colored_gaps_size].start = fill_gap_begin; + colored_gaps[colored_gaps_size].end = fill_gap_end; + colored_gaps[colored_gaps_size].color = color; + } + } + + } + // + // Now line rendering + for(int i = 0; i < m_width; ++i) { + m_ColorLine[i] = 0x0; + } + if (m_file->lFileSize < (uint32)m_width) { + // + // if file is that small, draw it in single step + // + if (m_file->m_ReqParts.size()) { + for(int i = 0; i < m_width; ++i) { + m_ColorLine[i] = RGB(255, 208, 0); + } + } else if ( colored_gaps_size ) { + for(int i = 0; i < m_width; ++i) { + m_ColorLine[i] = colored_gaps[0].color; + } + } + } else { + uint32 factor = m_file->lFileSize / m_width; + for(int i = 1; i <= colored_gaps_size;i++) { + uint32 start = colored_gaps[i].start / factor; + uint32 end = colored_gaps[i].end / factor; + for(uint32 j = start; j < end; j++) { + m_ColorLine[j] = colored_gaps[i].color; + } + } + // overwrite requested parts + for(uint32 i = 0; i < m_file->m_ReqParts.size(); i++) { + uint32 start = m_file->m_ReqParts[i].start / factor; + uint32 end = m_file->m_ReqParts[i].end / factor; + for(uint32 j = start; j < end; j++) { + m_ColorLine[j] = RGB(255, 208, 0); + } + } + } + delete [] colored_gaps; +} + +int CProgressImage::compare_gaps(const void *g1, const void *g2) +{ + return ((const Gap_Struct *)g1)->start - ((const Gap_Struct *)g2)->start; +} + +#ifdef WITH_LIBPNG + +CDynPngImage::CDynPngImage(int w, int h) : CAnyImage(w, h) +{ + + // + // Allocate array of "row pointers" - libpng need it in this form + // Fill it also with the image data + // + m_img_data = new png_byte[3*m_width*m_height]; + memset(m_img_data, 0, 3*m_width*m_height); + m_row_ptrs = new png_bytep [m_height]; + for (int i = 0; i < m_height;i++) { + m_row_ptrs[i] = &m_img_data[3*m_width*i]; + } + +} + +CDynPngImage::~CDynPngImage() +{ + delete [] m_row_ptrs; + delete [] m_img_data; +} + +void CDynPngImage::png_write_fn(png_structp png_ptr, png_bytep data, png_size_t length) +{ + CDynPngImage *This = (CDynPngImage *)png_get_io_ptr(png_ptr); + wxASSERT((png_size_t)(This->m_size + length) <= (png_size_t)This->m_alloc_size); + memcpy(This->m_data + This->m_size, data, length); + This->m_size += length; +} + + +unsigned char *CDynPngImage::RequestData(int &size) +{ + // write png into buffer + png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0); + png_infop info_ptr = png_create_info_struct(png_ptr); + png_set_IHDR(png_ptr, info_ptr, m_width, m_height, 8, PNG_COLOR_TYPE_RGB, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); + png_set_write_fn(png_ptr, this, png_write_fn, 0); + + m_size = 0; + png_write_info(png_ptr, info_ptr); + png_write_image(png_ptr, (png_bytep *)m_row_ptrs); + png_write_end(png_ptr, 0); + png_destroy_write_struct(&png_ptr, &info_ptr); + + return CAnyImage::RequestData(size); +} + +CDynProgressImage::CDynProgressImage(int width, int height, wxString &tmpl, DownloadFile *file) : + CAnyImage(width, height), + CProgressImage(width, height, tmpl, file), + CDynPngImage(width, height), + m_modifiers(height) +{ + m_name = wxT("dyn_") + m_file->sFileHash + wxT(".png"); +} + +CDynProgressImage::~CDynProgressImage() +{ +} + +wxString CDynProgressImage::GetHTML() +{ + // template contain %s (name) %d (width) + return (CFormat(m_template) % m_name % m_width).GetString(); +} + +void CDynProgressImage::DrawImage() +{ + CreateSpan(); + + for(int i = 0; i < m_height; i++) { + memset(m_row_ptrs[i], 0, 3*m_width); + } + for(int i = 0; i < m_height/2; i++) { + png_bytep u_row = m_row_ptrs[i]; + png_bytep d_row = m_row_ptrs[m_height-i-1]; + for(int j = 0; j < m_width; j++) { + set_rgb_color_val(u_row+3*j, m_ColorLine[j], m_modifiers[i]); + set_rgb_color_val(d_row+3*j, m_ColorLine[j], m_modifiers[i]); + } + } +} + +unsigned char *CDynProgressImage::RequestData(int &size) +{ + // create new one + DrawImage(); + + return CDynPngImage::RequestData(size); +} + +#else + +CDynProgressImage::CDynProgressImage(int width, int height, wxString &tmpl, DownloadFile *file) : + CAnyImage(width, height), + CProgressImage(width, height, tmpl, file) +{ + m_name = wxT("dyn_") + m_file->sFileHash + wxT(".png"); + +} + + +wxString CDynProgressImage::GetHTML() +{ + static wxChar *progresscolor[12] = { + wxT("transparent.gif"), wxT("black.gif"), wxT("yellow.gif"), wxT("red.gif"), + wxT("blue1.gif"), wxT("blue2.gif"), wxT("blue3.gif"), wxT("blue4.gif"), + wxT("blue5.gif"), wxT("blue6.gif"), wxT("green.gif"), wxT("greenpercent.gif") }; + + CreateSpan(); + + wxString str; + uint32 lastcolor = m_ColorLine[0]; + int lastindex = 0; + for(int i = 0; i < m_width; i++) { + if ( (lastcolor != m_ColorLine[i]) || (i == (m_width - 1)) ) { + int color_idx = -1; + if ( lastcolor & RGB(0, 0, 0xff) ) { // blue + int green = (lastcolor >> 8) & 0xff; + // reverse calculation: green = 210 - ( 22 * ( part_info[i] - 1 ) ) + wxASSERT( !green || (green < 211) ); + color_idx = (green) ? (210 - green) / 22 + 1 : 11; + // now calculate it same way as PartFile did + color_idx = (color_idx > 10) ? 9 : (4 + color_idx / 2); + } else { + if ( lastcolor & RGB(0, 0xff, 0) ) { // yellow + color_idx = 2; + } else { + if ( lastcolor & RGB(0xff, 0, 0) ) { // red + color_idx = 3; + } else { + color_idx = 1; + } + } + } + str += (CFormat(m_template) % progresscolor[color_idx] + % (i - lastindex)).GetString(); + lastindex = i; + lastcolor = m_ColorLine[i]; + } + } + + return str; +} + +#endif + +CStatsData::CStatsData(int size) +{ + m_size = size; + m_data = new uint32[size]; + m_max_value = 0; + // + // initial situation: all data is 0's + // + memset(m_data, 0, m_size*sizeof(int)); + m_start_index = m_curr_index = 0; + m_end_index = size - 1; +} + +CStatsData::~CStatsData() +{ + delete [] m_data; +} + +uint32 CStatsData::GetFirst() +{ + m_curr_index = m_start_index; + return m_data[m_curr_index]; +} + +uint32 CStatsData::GetNext() +{ + m_curr_index++; + m_curr_index %= m_size; + return m_data[m_curr_index]; +} + +void CStatsData::PushSample(uint32 sample) +{ + m_start_index = (m_start_index + 1) % m_size; + m_end_index = (m_end_index + 1) % m_size; + m_data[m_start_index] = sample; + + if ( m_max_value < sample ) { + m_max_value = sample; + } +} + +CStatsCollection::CStatsCollection(int size, CamulewebApp *iface) +{ + m_down_speed = new CStatsData(size); + m_up_speed = new CStatsData(size); + m_conn_number = new CStatsData(size); + m_kad_count = new CStatsData(size); + + m_iface = iface; + m_LastTimeStamp = 0.0; + m_size = size; +} + +CStatsCollection::~CStatsCollection() +{ + delete m_down_speed; + delete m_up_speed; + delete m_conn_number; +} + +void CStatsCollection::ReQuery() +{ + CECPacket request(EC_OP_GET_STATSGRAPHS); + + request.AddTag(CECTag(EC_TAG_STATSGRAPH_WIDTH, (uint16)m_size)); + + uint16 m_nGraphScale = 1; + request.AddTag(CECTag(EC_TAG_STATSGRAPH_SCALE, m_nGraphScale)); + if (m_LastTimeStamp > 0.0) { + request.AddTag(CECTag(EC_TAG_STATSGRAPH_LAST, m_LastTimeStamp)); + } + + const CECPacket *response = m_iface->SendRecvMsg_v2(&request); + + m_LastTimeStamp = response->GetTagByNameSafe(EC_TAG_STATSGRAPH_LAST)->GetDoubleData(); + + const CECTag *dataTag = response->GetTagByName(EC_TAG_STATSGRAPH_DATA); + const uint32 *data = (const uint32 *)dataTag->GetTagData(); + unsigned int count = dataTag->GetTagDataLen() / sizeof(uint32); + for (unsigned int i = 0; i < count; i += 4) { + m_down_speed->PushSample(ENDIAN_NTOHL(data[i+0])); + m_up_speed->PushSample(ENDIAN_NTOHL(data[i+1])); + m_conn_number->PushSample(ENDIAN_NTOHL(data[i+2])); + m_kad_count->PushSample(ENDIAN_NTOHL(data[i+3])); + } +} + +// +// Dynamically generated statistic images +// +#ifdef WITH_LIBPNG + +CDynStatisticImage::CDynStatisticImage(int height, bool scale1024, CStatsData *data) : + CAnyImage(data->Size(), height), CDynPngImage(data->Size(), height) +{ + m_data = data; + m_scale1024 = scale1024; + + // actual name doesn't matter, just make it unique + m_name = wxString::Format(wxT("dyn_%ld_stat.png"), (unsigned long int) data); + + m_num_font_w_size = 8; + m_num_font_h_size = 16; + + // leave enough space for 4 digit number + int img_delta = m_num_font_w_size / 4; + m_left_margin = 4*(m_num_font_w_size + img_delta) + img_delta; + // leave enough space for number height + m_bottom_margin = m_num_font_h_size; + + + m_y_axis_size = m_height - m_bottom_margin; + // allocate storage for background. Using 1 chunk to speed up + // the rendering + m_background = new png_byte[m_width*m_height*3]; + m_row_bg_ptrs = new png_bytep[m_height]; + for(int i = 0; i < m_height; i++) { + m_row_bg_ptrs[i] = &m_background[i*m_width*3]; + } + + // + // Prepare background + // + static const COLORREF bg_color = RGB(0x00, 0x00, 0x40); + for(int i = 0; i < m_height; i++) { + png_bytep u_row = m_row_bg_ptrs[i]; + for(int j = 0; j < m_width; j++) { + set_rgb_color_val(u_row+3*j, bg_color, 0); + } + } + // + // draw axis + // + static const COLORREF axis_color = RGB(0xff, 0xff, 0xff); + // Y + for(int i = m_bottom_margin; i < m_y_axis_size; i++) { + png_bytep u_row = m_row_bg_ptrs[i]; + set_rgb_color_val(u_row+3*(m_left_margin + 0), axis_color, 0); + set_rgb_color_val(u_row+3*(m_left_margin + 1), axis_color, 0); + } + // X + for(int j = m_left_margin; j < m_width; j++) { + set_rgb_color_val(m_row_bg_ptrs[m_y_axis_size - 0]+3*j, axis_color, 0); + set_rgb_color_val(m_row_bg_ptrs[m_y_axis_size - 1]+3*j, axis_color, 0); + } + + // horisontal grid + int v_grid_size = m_y_axis_size / 4; + for(int i = m_y_axis_size - v_grid_size; i >= v_grid_size; i -= v_grid_size) { + png_bytep u_row = m_row_bg_ptrs[i]; + for(int j = m_left_margin; j < m_width; j++) { + if ( (j % 10) < 5 ) { + set_rgb_color_val(u_row+3*j, axis_color, 0); + } + } + } + + // + // Pre-create masks for digits + // + for(int i = 0; i < 10; i++) { + m_digits[i] = new CNumImageMask(i, m_num_font_w_size, m_num_font_h_size); + } +} + +CDynStatisticImage::~CDynStatisticImage() +{ + delete [] m_row_bg_ptrs; + delete [] m_background; + for(int i = 0; i < 10; i++) { + delete m_digits[i]; + } +} + +void CDynStatisticImage::DrawImage() +{ + // copy background first + memcpy(m_img_data, m_background, m_width*m_height*3); + + // + // Now graph itself + // + static const COLORREF graph_color = RGB(0xff, 0x00, 0x00); + int maxval = m_data->Max(); + + if ( m_scale1024 ) { + if ( maxval > 1024 ) { + maxval /= 1024; + } else { + maxval = 1; + } + } + // + // Check if we need to scale data up or down + // + int m_scale_up = 1, m_scale_down = 1; + if ( maxval >= (m_height - m_bottom_margin) ) { + m_scale_down = 1 + (maxval / (m_y_axis_size - 10)); + } + // if maximum value is 1/5 or less of graph height - scale it UP, to make 2/3 + if ( maxval && (maxval < (m_y_axis_size / 5)) ) { + m_scale_up = (2*m_y_axis_size / 3) / maxval; + } + + // + // draw axis scale + // + int img_delta = m_num_font_w_size / 4; + // Number "0" is always there + m_digits[0]->Apply(m_row_ptrs, 3*img_delta+2*m_num_font_w_size, m_y_axis_size-m_num_font_h_size-5); + + // + // When data is scaled down, axis are scaled UP and viceversa + int y_axis_max = m_y_axis_size; + if ( m_scale_down != 1 ) { + y_axis_max *= m_scale_down; + } else if ( m_scale_up != 1 ) { + y_axis_max /= m_scale_up; + } + + // X--- + if ( y_axis_max > 999 ) { + m_digits[y_axis_max / 1000]->Apply(m_row_ptrs, img_delta, img_delta); + } + // -X-- + if ( y_axis_max > 99 ) { + m_digits[(y_axis_max % 1000) / 100]->Apply(m_row_ptrs, + 2*img_delta+m_num_font_w_size, img_delta); + } + // --X- + if ( y_axis_max > 9 ) { + m_digits[(y_axis_max % 100) / 10]->Apply(m_row_ptrs, + 3*img_delta+2*m_num_font_w_size, img_delta); + } + // ---X + m_digits[y_axis_max % 10]->Apply(m_row_ptrs, 4*img_delta+3*m_num_font_w_size, img_delta); + + int prev_data = m_data->GetFirst(); + if ( m_scale_down != 1 ) { + prev_data /= m_scale_down; + } else if ( m_scale_up != 1 ) { + prev_data *= m_scale_up; + } + if ( m_scale1024 ) { + if ( prev_data > 1024) { + prev_data /= 1024; + } else { + prev_data = 1; + } + } + for(int j = m_left_margin + 1, curr_data = m_data->GetNext(); j < m_width; j++, curr_data = m_data->GetNext()) { + if ( m_scale_down != 1 ) { + curr_data /= m_scale_down; + } else if ( m_scale_up != 1 ) { + curr_data *= m_scale_up; + } + if ( m_scale1024 ) { + if ( curr_data > 1024) { + curr_data /= 1024; + } else { + curr_data = 1; + } + } + // + // draw between curr_data and prev_data + // + int min_y, max_y; + if ( prev_data > curr_data ) { + min_y = curr_data; max_y = prev_data; + } else { + min_y = prev_data; max_y = curr_data; + } + for(int k = min_y; k <= max_y; k++) { + int i = m_y_axis_size - k; + png_bytep u_row = m_row_ptrs[i]; + set_rgb_color_val(u_row+3*j, graph_color, 0); + } + prev_data = curr_data; + } +} + +unsigned char *CDynStatisticImage::RequestData(int &size) +{ + DrawImage(); + + return CDynPngImage::RequestData(size); +} + +wxString CDynStatisticImage::GetHTML() +{ + return wxEmptyString; +} + +// +// Imprint numbers on generated png's +// +// 0 1 2 3 4 5 6 7 8 9 +const int CNumImageMask::m_num_to_7_decode[] = {0x77, 0x24, 0x5d, 0x6d, 0x2e, 0x5d, 0x7a, 0x25, 0x7f, 0x2f}; + +CNumImageMask::CNumImageMask(int number, int width, int height) +{ + m_v_segsize = height / 2; + m_h_segsize = width; + m_height = height; + m_width = width; + + m_row_mask_ptrs = new png_bytep[m_height]; + for(int i = 0; i < m_height; i++) { + m_row_mask_ptrs[i] = new png_byte[3*m_width]; + memset(m_row_mask_ptrs[i], 0x00, 3*m_width); + } + + int seg_status = m_num_to_7_decode[number]; + for(int i = 0; i < 7; i++) { + if ( seg_status & (1 << i) ) { + DrawSegment(i); + } + } +} + +CNumImageMask::~CNumImageMask() +{ + for(int i = 0; i < m_height; i++) { + delete [] m_row_mask_ptrs[i]; + } + delete [] m_row_mask_ptrs; +} + +void CNumImageMask::Apply(png_bytep *image, int offx, int offy) +{ + offx *= 3; + for(int i = 0; i < m_height; i++) { + png_bytep img_row = image[offy + i]; + png_bytep num_row = m_row_mask_ptrs[i]; + for(int j = 0; j < m_width*3; j++) { + img_row[offx + j] |= num_row[j]; + } + } +} + +void CNumImageMask::DrawHorzLine(int off) +{ + png_bytep m_row = m_row_mask_ptrs[off*(m_v_segsize-1)]; + for(int i = 0; i < m_h_segsize; i++) { + m_row[i*3] = m_row[i*3+1] = m_row[i*3+2] = 0xff; + } +} + +void CNumImageMask::DrawVertLine(int offx, int offy) +{ + for(int i = 0; i < m_v_segsize; i++) { + png_bytep m_row = m_row_mask_ptrs[offy*(m_v_segsize-1)+i]; + int x_idx = offx*(m_h_segsize-1)*3; + m_row[x_idx] = m_row[x_idx+1] = m_row[x_idx+2] = 0xff; + } +} + +/* + * Segment id decoding defined as following + * + * ---- 0 ---- + * | | + * 1 2 + * |___ 3 ___| + * | | + * 4 5 + * |___ 6 ___| + */ +void CNumImageMask::DrawSegment(int id) +{ + switch(id) { + case 0: + DrawHorzLine(0); + break; + case 1: + DrawVertLine(0, 0); + break; + case 2: + DrawVertLine(1, 0); + break; + case 3: + DrawHorzLine(1); + break; + case 4: + DrawVertLine(0, 1); + break; + case 5: + DrawVertLine(1, 1); + break; + case 6: + DrawHorzLine(2); + break; + default: + wxASSERT(0); + break; + } +} + +#endif + +CImageLib::CImageLib(wxString image_dir) : m_image_dir(image_dir) +{ +} + +CImageLib::~CImageLib() +{ +} + +void CImageLib::AddImage(CAnyImage *img, const wxString &name) +{ + CAnyImage *prev = m_image_map[name]; + if ( prev ) { + delete prev; + } + m_image_map[name] = img; +} + +void CImageLib::RemoveImage(const wxString &name) +{ + CAnyImage *prev = m_image_map[name]; + if ( prev ) { + m_image_map.erase(name); + } +} + +CAnyImage *CImageLib::GetImage(wxString &name) +{ + CAnyImage *img = m_image_map[name]; + if ( img ) { + return img; + } + wxFileName filename(m_image_dir + name); + CFileImage *fimg = new CFileImage(filename.GetFullPath()); + if ( fimg->OpenOk() ) { + m_image_map[name] = fimg; + return fimg; + } else { + delete fimg; + return 0; + } +} + +/* + * Script-based webserver + */ +CScriptWebServer::CScriptWebServer(CamulewebApp *webApp, const wxString& templateDir) + : CWebServerBase(webApp, templateDir), m_wwwroot(templateDir) +{ + wxString img_tmpl(wxT("")); + m_DownloadFileInfo.LoadImageParams(img_tmpl, 200, 20); + + if ( ::wxFileExists(wxFileName(m_wwwroot, wxT("index.html")).GetFullPath()) ) { + m_index = wxT("index.html"); + } else if ( ::wxFileExists(wxFileName(m_wwwroot, wxT("index.php")).GetFullPath()) ) { + m_index = wxT("index.php"); + } else { + webInterface->Show(_("Index file not found: ") + + wxFileName(m_wwwroot, wxT("index.{html,php}")).GetFullPath() + wxT("\n")); + } +} + +CScriptWebServer::~CScriptWebServer() +{ +} + + +void CScriptWebServer::StartServer() +{ + if (!webInterface->m_LoadSettingsFromAmule) { + if (webInterface->m_configFile) { + webInterface->m_PageRefresh = webInterface->m_configFile->Read(wxT("/Webserver/PageRefreshTime"), 120l); + } + } + + wsThread = new CWSThread(this); + if ( wsThread->Create() != wxTHREAD_NO_ERROR ) { + webInterface->Show(_("Can't create web socket thread\n")); + } else { + //...and run it + wsThread->Run(); + + webInterface->Show(_("Web Server: Started\n")); + } +} + +void CScriptWebServer::StopServer() +{ + wsThread->Delete(); + wsThread->Wait(); +} + +char *CScriptWebServer::GetErrorPage(const char *message, long &size) +{ + char *buf = new char [1024]; + snprintf(buf, 1024, + " Error -%s ", message); + + size = strlen(buf); + + return buf; +} + +char *CScriptWebServer::Get_404_Page(long &size) +{ + char *buf = new char [1024]; + strcpy(buf, " Error - requested page not found "); + + size = strlen(buf); + + return buf; +} + +char *CScriptWebServer::ProcessHtmlRequest(const char *filename, long &size) +{ + FILE *f = fopen(filename, "r"); + if ( !f ) { + return Get_404_Page(size); + } + if ( fseek(f, 0, SEEK_END) != 0 ) { + return GetErrorPage("fseek failed", size); + } + + size = ftell(f); + char *buf = new char [size+1]; + rewind(f); + fread(buf, 1, size, f); + buf[size] = 0; + fclose(f); + + return buf; +} + +char *CScriptWebServer::ProcessPhpRequest(const char *filename, CSession *sess, long &size) +{ + FILE *f = fopen(filename, "r"); + if ( !f ) { + return Get_404_Page(size); + } + + CWriteStrBuffer buffer; + CPhpFilter(this, sess, filename, &buffer); + + size = buffer.Length(); + char *buf = new char [size+1]; + buffer.CopyAll(buf); + + fclose(f); + + return buf; +} + +CSession *CScriptWebServer::CheckLoggedin(ThreadData &Data) +{ + time_t curr_time = time(0); + CSession *session = 0; + if ( Data.SessionID && m_sessions.count(Data.SessionID) ) { + session = &m_sessions[Data.SessionID]; + // session times out in 2 hours + if ( (curr_time - session->m_last_access) > 7200 ) { + Print(_("Session expired - requesting login\n")); + m_sessions.erase(Data.SessionID); + session = 0; + } else { + if ( session->m_loggedin ) { + Print(_("Session ok, logged in\n")); + } else { + Print(_("Session ok, not logged in\n")); + } + session->m_last_access = curr_time; + } + } else { + Print(_("No session opened - will request login\n")); + } + if ( !session ) { + while ( !Data.SessionID || m_sessions.count(Data.SessionID) ) { + Data.SessionID = rand(); + } + session = &m_sessions[Data.SessionID]; + session->m_last_access = curr_time; + session->m_loggedin = false; + Print(_("Session created - requesting login\n")); + } + Data.parsedURL.ConvertParams(session->m_get_vars); + return session; +} + + +void CScriptWebServer::ProcessURL(ThreadData Data) +{ + wxMutexLocker lock(m_mutexChildren); + + long httpOutLen; + char *httpOut = 0; + + // Strip out any path-component to prevent information leakage. + wxString filename = wxFileName(Data.parsedURL.File()).GetFullName(); + + Print(_("Processing request [original]: ") + filename + wxT("\n")); + + if ( filename.Length() == 0 ) { + filename = m_index; + } + + CSession *session = CheckLoggedin(Data); + + session->m_vars["login_error"] = ""; + if ( !session->m_loggedin ) { + filename = wxT("login.php"); + + wxString PwStr(Data.parsedURL.Param(wxT("pass"))); + if (webInterface->m_AdminPass.IsEmpty() and webInterface->m_GuestPass.IsEmpty()) { + session->m_vars["login_error"] = "No password specified, login will not be allowed."; + } else if ( PwStr.Length() ) { + Print(_("Checking password\n")); + session->m_loggedin = false; + + CMD4Hash PwHash; + if (not PwHash.Decode(MD5Sum(PwStr).GetHash())) { + Print(_("Password hash invalid\n")); + session->m_vars["login_error"] = "Invalid password hash, please report on http://forum.amule.org"; + } else if ( PwHash == webInterface->m_AdminPass ) { + session->m_loggedin = true; + // m_vars is map - so _() will not work here ! + session->m_vars["guest_login"] = "0"; + } else if ( PwHash == webInterface->m_GuestPass ) { + session->m_loggedin = true; + session->m_vars["guest_login"] = "1"; + } else { + session->m_vars["login_error"] = "Password incorrect, please try again."; + } + + if ( session->m_loggedin ) { + filename = m_index; + Print(_("Password ok\n")); + } else { + Print(_("Password bad\n")); + } + } else { + Print(_("You did not enter any password. Blank password is not allowed.\n")); + } + } else { + // + // if logged in, but requesting login page again, + // means logout command + // + if ( filename == wxT("login.php") ) { + Print(_("Logout requested\n")); + session->m_loggedin = false; + } + } + + Print(_("Processing request [redirected]: ") + filename + wxT("\n")); + + session->m_vars["auto_refresh"] = (const char *)unicode2char( + wxString::Format(wxT("%d"), webInterface->m_PageRefresh)); + session->m_vars["content_type"] = "text/html"; + + wxString req_file(wxFileName(m_wwwroot, filename).GetFullPath()); + if ( req_file.Find(wxT(".html")) != -1 ) { + httpOut = ProcessHtmlRequest(unicode2char(req_file), httpOutLen); + } else if ( req_file.Find(wxT(".php")) != -1 ) { + httpOut = ProcessPhpRequest(unicode2char(req_file), session, httpOutLen); + } else if ( req_file.Find(wxT(".css")) != -1 ) { + session->m_vars["content_type"] = "text/css"; + httpOut = ProcessHtmlRequest(unicode2char(req_file), httpOutLen); + } else if ( req_file.Find(wxT(".js")) != -1 ) { + session->m_vars["content_type"] = "text/javascript"; + httpOut = ProcessHtmlRequest(unicode2char(req_file), httpOutLen); + } else { + httpOut = GetErrorPage("aMuleweb doesn't handle the requested file type ", httpOutLen); + } + + bool isUseGzip = webInterface->m_UseGzip; + + if (isUseGzip) { + bool bOk = false; + uLongf destLen = httpOutLen + 1024; + char *gzipOut = new char[destLen]; + if( GzipCompress((Bytef*)gzipOut, &destLen, + (const Bytef*)httpOut, httpOutLen, Z_DEFAULT_COMPRESSION) == Z_OK) { + bOk = true; + } + if ( bOk ) { + delete [] httpOut; + httpOut = gzipOut; + httpOutLen = destLen; + } else { + isUseGzip = false; + delete[] gzipOut; + } + } + + if ( httpOut ) { + Data.pSocket->SendHttpHeaders(session->m_vars["content_type"].c_str(), isUseGzip, httpOutLen, Data.SessionID); + Data.pSocket->SendData(httpOut, httpOutLen); + delete [] httpOut; + } +} + +CNoTemplateWebServer::CNoTemplateWebServer(CamulewebApp *webApp) : CScriptWebServer(webApp, wxEmptyString) +{ +} + +CNoTemplateWebServer::~CNoTemplateWebServer() +{ +} + +void CNoTemplateWebServer::ProcessURL(ThreadData Data) +{ + /* + * Since template has not been found, I suspect that installation is broken. Falling back + * into hardcoded page as last resort. + */ + char *httpOut = "" + "" + "" + "aMuleWeb error page" + "" + "" + "" + "

You are seeing this page instead of aMuleWeb login page because a valid template has not been found.

" + "

This probably means that there's a problem with your aMule installation

" + "
    " + "
  • Before installing new versions, please ensure that you uninstalled older versions of aMule.
  • " + "
  • If you are installing by compiling from source, check configuration and run "make" and "make install" again
  • " + "
  • If you are installing by using a precompiled package, you may need to contact the package maintainer
  • " + "
" + "

For more information please visit

" + "

aMule main site or aMule forums

" + "" + ""; + + long httpOutLen = strlen(httpOut); + + Data.pSocket->SendHttpHeaders("text/html", false, httpOutLen, 0); + Data.pSocket->SendData(httpOut, httpOutLen); +} +// File_checked_for_headers diff --git a/src/webserver/src/WebServer.h b/src/webserver/src/WebServer.h new file mode 100644 index 00000000..3931c046 --- /dev/null +++ b/src/webserver/src/WebServer.h @@ -0,0 +1,791 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 Kry ( elkry@users.sourceforge.net / http://www.amule.org ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef WEBSERVER_H +#define WEBSERVER_H + +#ifdef WITH_LIBPNG + #include +#endif + +#include "WebInterface.h" +#include "KnownFile.h" +#include "RLE.h" +#include "OtherStructs.h" + + +#include // For DownloadFile::wxtLastSeenComplete + +//class TransferredData; +class CWSThread; +class CWebSocket; +class CMD4Hash; + +#define SESSION_TIMEOUT_SECS 300 // 5 minutes session expiration +#define SHORT_FILENAME_LENGTH 40 // Max size of file name. + +// +//uint8 GetHigherPrio(uint32 prio, bool autoprio); +//uint8 GetHigherPrioShared(uint32 prio, bool autoprio); +//uint8 GetLowerPrio(uint32 prio, bool autoprio); +//uint8 GetLowerPrioShared(uint32 prio, bool autoprio); +wxString _SpecialChars(wxString str); + +class CEC_PartFile_Tag; +class CEC_SharedFile_Tag; +class CEC_UpDownClient_Tag; +class CEC_SearchFile_Tag; +class CProgressImage; +class CEC_KadNode_Tag; + +class DownloadFile { + public: + wxString sFileName; + uint8 nFileStatus; + uint64 lFileSize; + uint64 lFileCompleted; + uint64 lFileTransferred; + unsigned long lFileSpeed; + long lSourceCount; + long lNotCurrentSourceCount; + long lTransferringSourceCount; + long lSourceCountA4AF; + double fCompleted; + uint32 lFilePrio; + bool bFileAutoPriority; + wxString sFileHash; + wxString sED2kLink; + uint8 nCat; + wxDateTime wxtLastSeenComplete; + + CMD4Hash nHash; + + CProgressImage *m_Image; + PartFileEncoderData m_Encoder; + std::vector m_ReqParts; + + // container require this + static class DownloadFileInfo *GetContainerInstance(); + DownloadFile(CEC_PartFile_Tag *); + void ProcessUpdate(CEC_PartFile_Tag *); + CMD4Hash ID() { return nHash; } +}; + +class SharedFile { + public: + wxString sFileName; + uint64 lFileSize; + uint64 nFileTransferred; + uint64 nFileAllTimeTransferred; + uint16 nFileRequests; + uint32 nFileAllTimeRequests; + uint16 nFileAccepts; + uint32 nFileAllTimeAccepts; + uint8 nFilePriority; + bool bFileAutoPriority; + wxString sFileHash; + wxString sED2kLink; + + CMD4Hash nHash; + + static class SharedFileInfo *GetContainerInstance(); + SharedFile(CEC_SharedFile_Tag *); + void ProcessUpdate(CEC_SharedFile_Tag *); + CMD4Hash ID() { return nHash; } +}; + +class ServerEntry { + public: + wxString sServerName; + wxString sServerDescription; + uint32 nServerIP; + uint16 nServerPort; + wxString sServerIP; + int nServerUsers; + int nServerMaxUsers; + int nServerFiles; + + static class ServersInfo *GetContainerInstance(); + uint32 ID() { return nServerIP; } +}; + +class UploadFile { + public: + wxString sUserName; + uint32 nTransferredUp; + uint32 nTransferredDown; + uint32 nSpeed; + // + // Don't need filename - sharedfiles already have it + CMD4Hash nHash; + + UploadFile(CEC_UpDownClient_Tag *tag); + + static class UploadsInfo *GetContainerInstance(); + CMD4Hash ID() { return nHash; } +}; + +class SearchFile { + public: + wxString sFileName; + unsigned long lFileSize; + CMD4Hash nHash; + wxString sHash; + long lSourceCount; + bool bPresent; + + SearchFile(CEC_SearchFile_Tag *); + + void ProcessUpdate(CEC_SearchFile_Tag *); + static class SearchInfo *GetContainerInstance(); + CMD4Hash ID() { return nHash; } +}; + + +/*! + * T - type of items in container + */ +template +class ItemsContainer { + protected: + CamulewebApp *m_webApp; + std::list m_items; + + + void EraseAll() + { + m_items.erase(m_items.begin(), m_items.end()); + } + public: + ItemsContainer(CamulewebApp *webApp) + { + m_webApp = webApp; + } + virtual ~ItemsContainer() { } + + + int ItemCount() + { + return m_items.size(); + } + + + T *AddItem(T &item) + { + m_items.push_back(item); + T *real_ptr = &(m_items.back()); + return real_ptr; + } + + /*! + * Re-query server: refresh all dataset + */ + virtual bool ReQuery() = 0; + + typedef typename std::list::iterator ItemIterator; + ItemIterator GetBeginIterator() + { + return m_items.begin(); + } + ItemIterator GetEndIterator() + { + return m_items.end(); + } +}; + +/*! + * T - type of items in container + * I - type of item ID + * G - type of tag in EC + */ +template +class UpdatableItemsContainer : public ItemsContainer { + protected: + // need duplicate list with a map, so check "do we already have" + // will take O(log(n)) instead of O(n) + // map will contain pointers to items in list + std::map m_items_hash; + public: + UpdatableItemsContainer(CamulewebApp *webApp) : ItemsContainer(webApp) + { + } + + T *AddItem(T &item) + { + T *real_ptr = ItemsContainer::AddItem(item); + m_items_hash[item.ID()] = real_ptr; + return real_ptr; + } + + T *GetByID(I id) + { + // avoid creating nodes + return m_items_hash.count(id) ? m_items_hash[id] : NULL; + } + /*! + * Process answer of update request, create list of new items for + * full request later. Also remove items that no longer exist in core + */ + void ProcessUpdate(const CECPacket *reply, CECPacket *full_req, int req_type) + { + std::set core_files; + for (int i = 0;i < reply->GetTagCount();i++) { + G *tag = (G *)reply->GetTagByIndex(i); + + core_files.insert(tag->ID()); + if ( m_items_hash.count(tag->ID()) ) { + T *item = m_items_hash[tag->ID()]; + item->ProcessUpdate(tag); + } else { + full_req->AddTag(CECTag(req_type, tag->ID())); + } + } + std::list del_ids; + for(typename std::list::iterator j = this->m_items.begin(); j != this->m_items.end(); j++) { + if ( core_files.count(j->ID()) == 0 ) { + // item may contain data that need to be freed externally, before + // dtor is called and memory freed + + T *real_ptr = &*j; + this->ItemDeleted(real_ptr); + + del_ids.push_back(j->ID()); + } + } + for(typename std::list::iterator j = del_ids.begin(); j != del_ids.end(); j++) { + m_items_hash.erase(*j); + for(typename std::list::iterator k = this->m_items.begin(); k != this->m_items.end(); k++) { + if ( *j == k->ID() ) { + this->m_items.erase(k); + break; + } + } + } + } + + void ProcessFull(const CECPacket *reply) + { + for (int i = 0;i < reply->GetTagCount();i++) { + G *tag = (G *)reply->GetTagByIndex(i); + // initialize item data from EC tag + T item(tag); + T *real_ptr = AddItem(item); + // initialize any external data that may depend on this item + this->ItemInserted(real_ptr); + } + } + + bool DoRequery(int cmd, int tag) + { + CECPacket req_sts(cmd, EC_DETAIL_UPDATE); + + // + // Phase 1: request status + const CECPacket *reply = this->m_webApp->SendRecvMsg_v2(&req_sts); + if ( !reply ) { + return false; + } + + // + // Phase 2: update status, mark new files for subsequent query + CECPacket req_full(cmd); + + ProcessUpdate(reply, &req_full, tag); + + delete reply; + + // Phase 3: request full info about files we don't have yet + if ( req_full.GetTagCount() ) { + reply = this->m_webApp->SendRecvMsg_v2(&req_full); + if ( !reply ) { + return false; + } + ProcessFull(reply); + delete reply; + } + return true; + } + + virtual void ItemDeleted(T *) { } + virtual void ItemInserted(T *) { } +}; + +class UploadsInfo : public ItemsContainer { + public: + // can be only one instance. + static UploadsInfo *m_This; + + UploadsInfo(CamulewebApp *webApp); + + virtual bool ReQuery(); +}; + +class ServersInfo : public ItemsContainer { + public: + // can be only one instance. + static ServersInfo *m_This; + + ServersInfo(CamulewebApp *webApp); + + virtual bool ReQuery(); + +}; + + +class SharedFileInfo : public UpdatableItemsContainer { + public: + // can be only one instance. + static SharedFileInfo *m_This; + + SharedFileInfo(CamulewebApp *webApp); + + virtual bool ReQuery(); + +}; + +class SearchInfo : public UpdatableItemsContainer { + public: + static SearchInfo *m_This; + + SearchInfo(CamulewebApp *webApp); + + virtual bool ReQuery(); + +}; + + +class CImageLib; +class DownloadFileInfo : public UpdatableItemsContainer { + CImageLib *m_ImageLib; + + // parameters of progress images + wxString m_Template; + int m_width, m_height; + public: + // can be only one instance. + static DownloadFileInfo *m_This; + + DownloadFileInfo(CamulewebApp *webApp, CImageLib *imlib); + + void LoadImageParams(wxString &tpl, int width, int height); + + virtual bool ReQuery(); + + // container requirements + void ItemInserted(DownloadFile *item); + void ItemDeleted(DownloadFile *item); +}; + +class CAnyImage { + protected: + unsigned char *m_data; + + int m_width, m_height; + wxString m_name; + + int m_size, m_alloc_size; + wxString m_Http; + + void Realloc(int size); + + void SetHttpType(wxString ext); + public: + CAnyImage(int size); + CAnyImage(int width, int height); + virtual ~CAnyImage(); + + const wxString& GetHTTP() const { return m_Http; } + + virtual unsigned char *RequestData(int &size); +}; + +class CFileImage : public virtual CAnyImage { + public: + CFileImage(const wxString& name); + + bool OpenOk() { return m_size != 0; } +}; + +class CImage3D_Modifiers { + unsigned char *m_modifiers; + int m_width; + public: + CImage3D_Modifiers(int width); + ~CImage3D_Modifiers(); + + unsigned char operator[](int i) + { + return (i < m_width) ? m_modifiers[i] : 0; + } +}; + +class CProgressImage : public virtual CAnyImage { + protected: + DownloadFile *m_file; + + wxString m_template; + + // + // sorted list of gaps + int m_gap_buf_size, m_gap_alloc_size; + Gap_Struct *m_gap_buf; + + void ReallocGapBuffer(); + void InitSortedGaps(); + // for qsort + static int compare_gaps(const void *, const void *); + + // + // Turn list of gaps, partstatus into array of color strips + typedef struct Color_Gap_Struct : public Gap_Struct { + uint32 color; + } Color_Gap_Struct; + + // result of rendering - single line + uint32 *m_ColorLine; + void CreateSpan(); + public: + CProgressImage(int w, int h, wxString &tmpl, DownloadFile *file); + + ~CProgressImage(); + + const wxString &Name() { return m_name; } + + virtual wxString GetHTML() = 0; +}; + +#ifdef WITH_LIBPNG + +// +// Dynamic png image generation +// +class CDynPngImage : public virtual CAnyImage { + + public: + CDynPngImage(int w, int h); + ~CDynPngImage(); + + virtual unsigned char *RequestData(int &size); + + protected: + png_bytep m_img_data; + png_bytep *m_row_ptrs; + + static void png_write_fn(png_structp png_ptr, png_bytep data, png_size_t length); + +}; + +// +// Dynamic png image generation from gap info +class CDynProgressImage : public virtual CProgressImage, public virtual CDynPngImage { + CImage3D_Modifiers m_modifiers; + + void DrawImage(); + public: + CDynProgressImage(int w, int h, wxString &tmpl, DownloadFile *file); + ~CDynProgressImage(); + + virtual unsigned char *RequestData(int &size); + virtual wxString GetHTML(); +}; + +#else + + +// +// Fallback to original implementation +class CDynProgressImage : public virtual CProgressImage { + public: + CDynProgressImage(int w, int h, wxString &tmpl, DownloadFile *file); + + virtual wxString GetHTML(); +}; + +#endif + +// +// Representing statistical sample for some parameter. Circular buffer +// inside to avoid rellocations +// +class CStatsData { + uint32 *m_data; + uint32 m_max_value; + int m_size; + int m_start_index, m_end_index, m_curr_index; + public: + CStatsData(int size); + ~CStatsData(); + + int Size() const { return m_size; } + uint32 Max() const { return m_max_value; } + uint32 GetFirst(); + uint32 GetNext(); + + void PushSample(uint32 sample); +}; + +class CStatsCollection { + CStatsData *m_down_speed, *m_up_speed, + *m_conn_number, *m_kad_count; + + CamulewebApp *m_iface; + double m_LastTimeStamp; + int m_size; + public: + CStatsCollection(int size, CamulewebApp *iface); + ~CStatsCollection(); + + CStatsData *DownloadSpeed() { return m_down_speed; } + CStatsData *UploadSpeed() { return m_up_speed; } + CStatsData *ConnCount() { return m_conn_number; } + CStatsData *KadCount() { return m_kad_count; } + + void ReQuery(); +}; + +#ifdef WITH_LIBPNG + +// +// This gonna to represent data used to "write" numbers on +// dynamically generated images. +// Easiest way to represt numbers: 7-segments model +// +class CNumImageMask { + png_bytep *m_row_mask_ptrs; + int m_width, m_height; + int m_v_segsize, m_h_segsize; + + // mask generation + void DrawHorzLine(int off); + void DrawVertLine(int offx, int offy); + void DrawSegment(int id); + + static const int m_num_to_7_decode[10]; + public: + CNumImageMask(int number, int width, int height); + ~CNumImageMask(); + + void Apply(png_bytep *image, int offx, int offy); +}; + +class CDynStatisticImage : public virtual CDynPngImage { + CStatsData *m_data; + + // size of "font" of imprinted numbers + int m_num_font_w_size, m_num_font_h_size; + + int m_left_margin, m_bottom_margin; + int m_y_axis_size; + + // hope nobody needs "define" for 10 ! + CNumImageMask *m_digits[10]; + + // indicates whether data should be divided on 1024 before + // drawing graph. + bool m_scale1024; + + // + // Prepared background + // + png_bytep m_background; + png_bytep *m_row_bg_ptrs; + + void DrawImage(); + public: + CDynStatisticImage(int height, bool scale1024, CStatsData *data); + ~CDynStatisticImage(); + + virtual unsigned char *RequestData(int &size); + virtual wxString GetHTML(); +}; + +#endif + +class CImageLib { + std::map m_image_map; + wxString m_image_dir; + public: + CImageLib(wxString image_dir); + ~CImageLib(); + + CAnyImage *GetImage(wxString &name); + void AddImage(CAnyImage *img, const wxString &name); + void RemoveImage(const wxString &name); +}; + +class CUrlDecodeTable { + static CUrlDecodeTable* ms_instance; + static wxCriticalSection ms_instance_guard; + + wxString m_enc_u_str[256], m_enc_l_str[256], m_dec_str[256]; + + CUrlDecodeTable(); + + public: + static CUrlDecodeTable* GetInstance(); + + void DecodeString(wxString &str); +}; + +class CParsedUrl { + wxString m_path, m_file; + std::map m_params; + public: + CParsedUrl(const wxString &url); + + const wxString &Path() { return m_path; } + const wxString &File() { return m_file; } + + const wxString &Param(const wxString &key) + { + return m_params[key]; + } + + void ConvertParams(std::map &); +}; + +// Changing this to a typedef struct{} makes egcs compiler do it all wrong and crash on run +struct ThreadData { + CParsedUrl parsedURL; + wxString sURL; + int SessionID; + CWebSocket *pSocket; +}; + +/* + * In transition period I want both versions of amuleweb available: CPP and PHP + */ +class CWebServerBase { + protected: + CWSThread *wsThread; + wxMutex m_mutexChildren; + + ServersInfo m_ServersInfo; + SharedFileInfo m_SharedFileInfo; + DownloadFileInfo m_DownloadFileInfo; + UploadsInfo m_UploadsInfo; + SearchInfo m_SearchInfo; + + CStatsCollection m_Stats; + + CImageLib m_ImageLib; + + virtual void ProcessURL(ThreadData) = 0; + virtual void ProcessImgFileReq(ThreadData) = 0; + + int GzipCompress(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, int level); + + friend class CWebSocket; + friend class CWSThread; // to access the wsThread member + friend class CPhPLibContext; + + public: + CWebServerBase(CamulewebApp *webApp, const wxString& templateDir); + virtual ~CWebServerBase() { } + + void Send_Discard_V2_Request(CECPacket *request); + + virtual void StartServer() = 0; + virtual void StopServer() = 0; + + void Print(const wxString &s); + + long GetWSPrefs(); + + // + // Command interface + // + void Send_ReloadSharedFile_Cmd(); + + void Send_SharedFile_Cmd(wxString file_hash, wxString cmd, uint32 opt_arg = 0); + void Send_DownloadFile_Cmd(wxString file_hash, wxString cmd, uint32 opt_arg = 0); + + void Send_DownloadSearchFile_Cmd(wxString file_hash, uint8 cat); + + void Send_Server_Cmd(uint32 ip, uint16 port, wxString cmd); + void Send_AddServer_Cmd(wxString addr, wxString port, wxString name); + + void Send_Search_Cmd(wxString search, wxString extention, wxString type, + EC_SEARCH_TYPE search_type, uint32 avail, uint32 min_size, uint32 max_size); + + bool Send_DownloadEd2k_Cmd(wxString link, uint8 cat); + + void Reload_Stats() + { + m_Stats.ReQuery(); + } + + CamulewebApp *webInterface; + +}; + +class CSession { + public: + bool m_loggedin; + time_t m_last_access; + std::map m_vars, m_get_vars; + + void LoadVars(CParsedUrl &url); +}; + +/* + * Script based webserver + */ +class CScriptWebServer : public CWebServerBase { + wxString m_wwwroot; + wxString m_index; + + char *ProcessHtmlRequest(const char *filename, long &size); + char *ProcessPhpRequest(const char *filename, CSession *sess, long &size); + + char *GetErrorPage(const char *message, long &size); + char *Get_404_Page(long &size); + + std::map m_sessions; + + CSession *CheckLoggedin(ThreadData &); + protected: + virtual void ProcessURL(ThreadData); + virtual void ProcessImgFileReq(ThreadData); + public: + CScriptWebServer(CamulewebApp *webApp, const wxString& templateDir); + ~CScriptWebServer(); + + virtual void StartServer(); + virtual void StopServer(); +}; + +class CNoTemplateWebServer : public CScriptWebServer { + protected: + virtual void ProcessURL(ThreadData); + public: + CNoTemplateWebServer(CamulewebApp *webApp); + ~CNoTemplateWebServer(); +}; + +#endif // WEBSERVER_H +// File_checked_for_headers diff --git a/src/webserver/src/WebSocket.cpp b/src/webserver/src/WebSocket.cpp new file mode 100644 index 00000000..4156f0e1 --- /dev/null +++ b/src/webserver/src/WebSocket.cpp @@ -0,0 +1,444 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 shakraw ( shakraw@users.sourceforge.net ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "WebSocket.h" + + +#include "UPnP.h" + + +typedef std::vector ArrayOfCWCThread; + + +ArrayOfCWCThread s_wcThreads; +static wxMutex s_mutex_wcThreads; + +/*** CWSThread ***/ +CWSThread::CWSThread(CWebServerBase *webserver) +: +wxThread(wxTHREAD_JOINABLE) +{ + ws = webserver; + + //retrieve web server listening port + m_wsport = ws->webInterface->m_WebserverPort; + m_upnpEnabled = ws->webInterface->m_UPnPWebServerEnabled; + m_upnpTCPPort = ws->webInterface->m_UPnPTCPPort; + if (m_wsport == -1) { + m_wsport = ws->GetWSPrefs(); + } + if (m_wsport == -1) { + m_wsport = 4711; + ws->Print(wxT("WSThread: Could not get web server port" + " -- using default value.\n")); + } +} + + +CWSThread::~CWSThread() +{ +} + + +// thread execution starts here +void *CWSThread::Entry() { + ws->Print(wxT("\nWSThread: Thread started\n")); + // Create the address - listen on localhost:ECPort + wxIPV4address addr; + addr.AnyAddress(); + addr.Service(m_wsport); + // Create the socket + m_WSSocket = new wxSocketServer(addr, wxSOCKET_REUSEADDR); + wxString msg = addr.Hostname() + + wxString::Format(wxT(":%d\n"), addr.Service()); + // We use Ok() here to see if the server is really listening + if (! m_WSSocket->Ok()) { + ws->Print(wxT("WSThread: could not create socket on ") + msg); + } else { + ws->Print(wxT("WSThread: created socket listening on ") + msg); +#ifdef ENABLE_UPNP + if (m_upnpEnabled) { + m_upnpMappings.resize(1); + m_upnpMappings[0] = CUPnPPortMapping( + m_wsport, + "TCP", + true, + "aMule TCP Webserver Socket"); + m_upnp = new CUPnPControlPoint(m_upnpTCPPort); + m_upnp->AddPortMappings(m_upnpMappings); + } +#endif + while (!TestDestroy()) { + // 1 second timeout + bool connection_pending = m_WSSocket->WaitForAccept(1, 0); + wxSocketBase* sock; + if (connection_pending) { + // Accept incoming connection + sock = m_WSSocket->Accept(false); + } else { + sock = NULL; + } + if (sock) { + // If there was a connection, create new CWCThread + CWCThread *wct = new CWCThread(ws, sock); + + wxMutexLocker lock(s_mutex_wcThreads); + s_wcThreads.push_back(wct); + + ArrayOfCWCThread::reverse_iterator rit = s_wcThreads.rbegin(); + if ( (*rit)->Create() != wxTHREAD_NO_ERROR ) { + ws->Print(wxT("WSThread: Can't create web client socket thread\n")); + // destroy the socket + sock->Destroy(); + } else { + // ...and run it + (*rit)->Run(); + } + } + } +#ifdef ENABLE_UPNP + if (m_upnpEnabled) { + m_upnp->DeletePortMappings(m_upnpMappings); + delete m_upnp; + } +#endif + ws->Print(wxT("WSThread: Waiting for WCThreads to be terminated...")); + bool should_wait = true; + while (should_wait) { + wxMutexLocker lock(s_mutex_wcThreads); + should_wait = (!s_wcThreads.empty()); + } + + // frees the memory allocated to the array + s_wcThreads.clear(); + ws->Print(wxT("done.\n")); + } + + // Signal the webserver that we exited. + ws->wsThread = NULL; + + // Kry - WTF to return here? + // shakraw - it must return NULL. it is correct now. + return NULL; +} + +/*** CWCThread ***/ +CWCThread::CWCThread(CWebServerBase *ws, wxSocketBase *sock) { + stWebSocket.m_pParent = ws; + stWebSocket.m_hSocket = sock; + stWebSocket.m_hSocket->SetTimeout(10); + stWebSocket.m_pHead = NULL; + stWebSocket.m_pTail = NULL; + stWebSocket.m_pBuf = new char [4096]; + stWebSocket.m_dwBufSize = 4096; + stWebSocket.m_dwRecv = 0; + stWebSocket.m_bValid = true; + stWebSocket.m_bCanRecv = true; + stWebSocket.m_bCanSend = true; + stWebSocket.m_dwHttpHeaderLen = 0; + stWebSocket.m_dwHttpContentLen = 0; + stWebSocket.m_Cookie = 0; +} + + +CWCThread::~CWCThread() +{ + delete [] stWebSocket.m_pBuf; +} + + +// thread execution starts here +void *CWCThread::Entry() { +#ifdef __DEBUG__ + stWebSocket.m_pParent->Print(wxT("WCThread: Started a new WCThread\n")); +#endif + bool IsGet = false, IsPost = false; + while ( stWebSocket.m_bCanRecv ) { + //check for connection status and return immediately + if (stWebSocket.m_hSocket->WaitForLost(0)) { + return 0; + } + if (stWebSocket.m_hSocket->WaitForRead(0)) { + stWebSocket.m_hSocket->Read(stWebSocket.m_pBuf+stWebSocket.m_dwRecv, stWebSocket.m_dwBufSize - stWebSocket.m_dwRecv); + stWebSocket.m_dwRecv += stWebSocket.m_hSocket->LastCount(); + while ((stWebSocket.m_dwRecv == stWebSocket.m_dwBufSize) && (stWebSocket.m_hSocket->LastCount()!=0) && (!stWebSocket.m_hSocket->Error())) { + // Buffer is too small. Make it bigger. + uint32 newsize = stWebSocket.m_dwBufSize + (stWebSocket.m_dwBufSize >> 1); + char* newbuffer = new char[newsize]; + char* oldbuffer = stWebSocket.m_pBuf; + memcpy(newbuffer, oldbuffer, stWebSocket.m_dwBufSize); + delete[] oldbuffer; + stWebSocket.m_pBuf = newbuffer; + stWebSocket.m_dwBufSize = newsize; + // And read again + stWebSocket.m_hSocket->Read(stWebSocket.m_pBuf + stWebSocket.m_dwRecv, stWebSocket.m_dwBufSize - stWebSocket.m_dwRecv); + stWebSocket.m_dwRecv += stWebSocket.m_hSocket->LastCount(); + } + + if (stWebSocket.m_hSocket->LastCount() == 0) { + if (stWebSocket.m_hSocket->Error()) { + if (stWebSocket.m_hSocket->LastError() != wxSOCKET_WOULDBLOCK) { + //close socket&thread + stWebSocket.m_pParent->Print(wxT("WCThread: got read error. closing socket and terminating thread\n")); + stWebSocket.m_bValid = false; + return 0; + } + } + } + + stWebSocket.m_pBuf[stWebSocket.m_dwRecv] = '\0'; + + // + // Check what kind of request is that + if ( !IsGet && !IsPost ) { + if ( !strncasecmp(stWebSocket.m_pBuf, "GET", 3) ) { + IsGet = true; + } else if ( !strncasecmp(stWebSocket.m_pBuf, "POST", 4) ) { + IsPost = true; + } else { + stWebSocket.m_pParent->Print(wxT("WCThread: request is unknown: [")); + stWebSocket.m_pParent->Print(char2unicode(stWebSocket.m_pBuf)); + stWebSocket.m_pParent->Print(wxT("]\n")); + return 0; + } + } + // + // RFC1945: + // + + // + // "GET" must have last line empty + if ( IsGet ) { + if ( !strncasecmp(stWebSocket.m_pBuf + stWebSocket.m_dwRecv - 4, "\r\n\r\n", 4) ) { + stWebSocket.m_bCanRecv = false; + // + // Process request + stWebSocket.OnRequestReceived(stWebSocket.m_pBuf, 0, 0); + } + } + // + // "POST" have "Content-Length" + if ( IsPost ) { + char *cont_len = strstr(stWebSocket.m_pBuf, "Content-Length"); + // do we have received all the line ? + if ( cont_len && strstr(cont_len, "\r\n\r\n") ) { + cont_len += strlen("Content-Length:"); + // can be white space following + while ( isspace(*cont_len) ) cont_len++; + int len = atoi(cont_len); + if ( !len ) { + stWebSocket.m_pParent->Print(wxT("WCThread: POST method have no data\n")); + return 0; + } + // do we have all of data ? + char *cont = strstr(stWebSocket.m_pBuf, "\r\n\r\n"); + cont += 4; + if ( cont - stWebSocket.m_pBuf + len <= (int)stWebSocket.m_dwRecv ) { + stWebSocket.m_bCanRecv = false; + stWebSocket.OnRequestReceived(stWebSocket.m_pBuf, cont, len); + } + } + } + } else { + Sleep(10); + } + } + //check for connection status and return immediately + if (stWebSocket.m_hSocket->WaitForLost(0)) { + //stWebSocket.m_pParent->Print(wxT("*** WCThread - WaitForLost\n")); + //connection closed/lost. terminate thread + } else { + // send what is left in our tails + while (stWebSocket.m_pHead && stWebSocket.m_pHead->m_pToSend) { + if (!stWebSocket.m_hSocket->WaitForWrite()) { + stWebSocket.m_pParent->Print(wxT("WCThread: got timeout on socket.\n")); + stWebSocket.m_bValid = false; + break; + } + //stWebSocket.m_pParent->Print(wxString::Format(wxT("*** WCThread write:\n%s\n"), stWebSocket.m_pHead->m_pToSend)); + //WRITE + stWebSocket.m_hSocket->Write(stWebSocket.m_pHead->m_pToSend, stWebSocket.m_pHead->m_dwSize); + uint32 nRes = stWebSocket.m_hSocket->LastCount(); + if (nRes >= stWebSocket.m_pHead->m_dwSize) { + // erase this chunk + CWebSocket::CChunk* pNext = stWebSocket.m_pHead->m_pNext; + delete stWebSocket.m_pHead; + if (!(stWebSocket.m_pHead = pNext)) { + stWebSocket.m_pTail = NULL; + } + } else { + if ((nRes > 0) && (!stWebSocket.m_hSocket->Error())) { + stWebSocket.m_pHead->m_pToSend += nRes; + stWebSocket.m_pHead->m_dwSize -= nRes; + } else { + if (stWebSocket.m_hSocket->Error()) { + if (stWebSocket.m_hSocket->LastError() != wxSOCKET_WOULDBLOCK) { + //got error + stWebSocket.m_pParent->Print(wxT("WCThread: got write error.\n")); + stWebSocket.m_bValid = false; + break; + } + } + } + } + } + } + //destroy the socket + stWebSocket.m_hSocket->Destroy(); +#ifdef __DEBUG__ + stWebSocket.m_pParent->Print(wxT("WCThread: exited [WebSocket closed]\n")); +#endif + // remove ourself from threads array + wxMutexLocker lock(s_mutex_wcThreads); + s_wcThreads.erase(find(s_wcThreads.begin(), s_wcThreads.end(), this)); + + // Kry - WTF to return here? + // shakraw - it must return NULL. it is correct now. + return NULL; +} + +void CWebSocket::OnRequestReceived(char* pHeader, char* pData, uint32 dwDataLen) +{ + + bool is_post = false; + if ( strncmp(pHeader, "GET", 3) == 0 ) { + } else if ( strncmp(pHeader, "POST", 4) == 0 ) { + is_post = true; + } else { + // invalid request + return ; + } + char *path = strchr(pHeader, ' '); + if ( !path ) { + return; + } + *path++ = 0; + pHeader = strchr(path, ' '); + if ( !pHeader ) { + return; + } + *pHeader++ = 0; + + wxString sURL(char2unicode(path)); + if ( is_post ) { + wxString sData(char2unicode(pData)); + sURL += wxT("?") + sData.Left(dwDataLen); + } + + // + // Find session cookie. + // + int sessid = 0; + char *current_cookie = strstr(pHeader, "Cookie: "); + if ( current_cookie ) { + current_cookie = strstr(current_cookie, "amuleweb_session_id"); + if ( current_cookie ) { + char *value = strchr(current_cookie, '='); + if ( value ) { + sessid = atoi(++value); + } + } + } + ThreadData Data = { CParsedUrl(sURL), sURL, sessid, this }; + + wxString sFile = Data.parsedURL.File(); + if (sFile.Length() > 4 ) { + wxString url_ext = sFile.Right( sFile.Length() - sFile.Find('.', true) ).MakeLower(); + if ( (url_ext==wxT(".gif")) || (url_ext==wxT(".jpg")) || (url_ext==wxT(".ico")) || + (url_ext==wxT(".png")) || (url_ext==wxT(".bmp")) || (url_ext==wxT(".jpeg")) ) { + m_pParent->ProcessImgFileReq(Data); + } else { + m_pParent->ProcessURL(Data); + } + } else { + m_pParent->ProcessURL(Data); + } + +} + +void CWebSocket::SendContent(const char* szStdResponse, const void* pContent, uint32 dwContentSize) { + char szBuf[0x1000]; // 0x1000 is safe because it's just used for the header + int nLen = snprintf(szBuf, sizeof(szBuf), "HTTP/1.1 200 OK\r\n%sContent-Length: %d\r\n\r\n", szStdResponse, dwContentSize); + SendData(szBuf, nLen); + SendData(pContent, dwContentSize); +} + +void CWebSocket::SendHttpHeaders(const char* szType, bool use_gzip, uint32 content_len, int session_id) +{ + char szBuf[0x1000]; + + char cookie[256]; + if ( session_id ) { + snprintf(cookie, sizeof(cookie), "Set-Cookie: amuleweb_session_id=%d\r\n", session_id); + } else { + cookie[0] = 0; + } + + snprintf(szBuf, sizeof(szBuf), "HTTP/1.1 200 OK\r\nServer: aMule\r\nPragma: no-cache\r\nExpires: 0\r\n" + "Cache-Control: no-cache, no-store, must-revalidate\r\n" + "%s" + "Connection: close\r\nContent-Type: %s\r\n" + "Content-Length: %d\r\n%s\r\n", + cookie, szType, content_len, (use_gzip ? "Content-Encoding: gzip\r\n" : "")); + + SendData(szBuf, strlen(szBuf)); +} + +void CWebSocket::SendData(const void* pData, uint32 dwDataSize) { + if (m_bValid && m_bCanSend) { + if (!m_pHead) { + // try to send it directly + m_hSocket->Write((const char*) pData, dwDataSize); + uint32 nRes = m_hSocket->LastCount(); + if ((nRes < dwDataSize) && + m_hSocket->Error() && + (m_hSocket->LastError() != wxSOCKET_WOULDBLOCK)) { + m_bValid = false; + } else { + ((const char*&) pData) += nRes; + dwDataSize -= nRes; + } + } + if (dwDataSize && m_bValid) { + // push it to our tails + CChunk* pChunk = new CChunk; + pChunk->m_pNext = NULL; + pChunk->m_dwSize = dwDataSize; + pChunk->m_pData = new char[dwDataSize]; + memcpy(pChunk->m_pData, pData, dwDataSize); + // push it to the end of our queue + pChunk->m_pToSend = pChunk->m_pData; + if (m_pTail) { + m_pTail->m_pNext = pChunk; + } else { + m_pHead = pChunk; + } + m_pTail = pChunk; + } + } +} +// File_checked_for_headers diff --git a/src/webserver/src/WebSocket.h b/src/webserver/src/WebSocket.h new file mode 100644 index 00000000..fa283f6d --- /dev/null +++ b/src/webserver/src/WebSocket.h @@ -0,0 +1,113 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2004-2008 shakraw ( shakraw@users.sourceforge.net ) +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef WEBSOCKET_H +#define WEBSOCKET_H + + +#include "WebServer.h" + + +#ifdef ENABLE_UPNP +class CUPnPControlPoint; +class CUPnPPortMapping; +#endif +class CWebServer; + + +class CWebSocket { + public: + void OnReceived(char* pData, uint32 dwDataSize); + void OnRequestReceived(char* pHeader, char* pData, uint32 dwDataLen); + + void SendContent(const char* szStdResponse, const void* pContent, uint32 dwContentSize); + void SendData(const void* pData, uint32 dwDataSize); + void SendHttpHeaders(const char * szType, bool use_gzip, uint32 content_len, int session_id); + + CWebServerBase *m_pParent; + wxSocketBase *m_hSocket; + + class CChunk { + public: + char* m_pData; + char* m_pToSend; + uint32 m_dwSize; + + CChunk* m_pNext; + ~CChunk() { if (m_pData) delete[] m_pData; } + }; + + CChunk *m_pHead; // tails of what has to be sent + CChunk *m_pTail; + + char *m_Cookie; + char *m_pBuf; + uint32 m_dwBufSize; + uint32 m_dwRecv; + uint32 m_dwHttpHeaderLen; + uint32 m_dwHttpContentLen; + bool m_bValid; + bool m_bCanRecv; + bool m_bCanSend; +}; + + +class CWCThread : public wxThread { //WC stands for web client socket. not for WC :) + public: + CWCThread(CWebServerBase *ws, wxSocketBase *sock); + ~CWCThread(); + + //thread execution starts here + virtual void *Entry(); + + private: + CWebSocket stWebSocket; +}; + + +class CWSThread : public wxThread { + public: + CWSThread(CWebServerBase *webserver); + ~CWSThread(); + + //thread execution starts here + virtual void *Entry(); + + private: + wxSocketServer *m_WSSocket; + CWebServerBase *ws; + long m_wsport; + bool m_upnpEnabled; + int m_upnpTCPPort; +#ifdef ENABLE_UPNP + CUPnPControlPoint *m_upnp; + std::vector m_upnpMappings; +#endif +}; + + +#endif //WEBSERVER_H +// File_checked_for_headers diff --git a/src/webserver/src/missing-template.html b/src/webserver/src/missing-template.html new file mode 100644 index 00000000..b45819c3 --- /dev/null +++ b/src/webserver/src/missing-template.html @@ -0,0 +1,20 @@ + + + +aMuleWeb error page + + + + +

You seeing this page instead of aMuleWeb page because valid template has not been found.

+

This means that there's problem with aMule installation

+
    +
  • Before installation please ensure that you uninstalled previous versions of amule
  • +
  • If you installing by recompiling from source, check configuration and run "make install" again
  • +
  • If you installing binary package, you may need to contact package maintainer
  • +
+

For more information please visit

+

aMule main site aMule forum

+ + diff --git a/src/webserver/src/php_core_lib.cpp b/src/webserver/src/php_core_lib.cpp new file mode 100644 index 00000000..10b9177f --- /dev/null +++ b/src/webserver/src/php_core_lib.cpp @@ -0,0 +1,1902 @@ +// +// This file is part of the aMule Project. + +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (C) 2005-2008 Froenchenko Leonid ( lfroen@amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include // Do_not_auto_remove (g++-4.0.1) + +#include +#include + +#ifndef PHP_STANDALONE_EN + #include "config.h" + #include "WebServer.h" + #include +#else + #define PACKAGE_VERSION "standalone" + + #include + #include + #include +#endif + +#include "php_syntree.h" +#include "php_core_lib.h" + +#include + +/* + * Built-in php functions. Those are both library and core internals. + * + * I'm not going event to get near to what Zend provide, but + * at least base things must be here + */ + +/* + * Print info about variable: php var_dump() + */ +void php_var_dump(PHP_VALUE_NODE *node, int ident, int ref) +{ + for(int i = 0; i < ident;i++) { + printf("\t"); + } + if ( ref ) printf("&"); + switch(node->type) { + case PHP_VAL_BOOL: printf("bool(%s)\n", node->int_val ? "true" : "false"); break; + case PHP_VAL_INT: printf("int(%"PRIu64")\n", node->int_val); break; + case PHP_VAL_FLOAT: printf("float(%f)\n", node->float_val); break; + case PHP_VAL_STRING: printf("string(%zd) \"%s\"\n", strlen(node->str_val), node->str_val); break; + case PHP_VAL_OBJECT: printf("Object(%s)\n", node->obj_val.class_name); break; + case PHP_VAL_ARRAY: { + int arr_size = array_get_size(node); + printf("array(%d) {\n", arr_size); + for(int i = 0; i < arr_size;i++) { + const std::string &curr_key = array_get_ith_key(node, i); + PHP_VAR_NODE *curr_val = array_get_by_str_key(node, curr_key); + printf("\t[%s]=>\n", curr_key.c_str()); + php_var_dump(&curr_val->value, ident+1, curr_val->ref_count > 1); + } + for(int i = 0; i < ident;i++) { + printf("\t"); + } + printf("}\n"); + break; + } + case PHP_VAL_NONE: printf("NULL\n"); break; + case PHP_VAL_VAR_NODE: + case PHP_VAL_INT_DATA: assert(0); break; + } +} + +void php_native_var_dump(PHP_VALUE_NODE *) +{ + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); + if ( si ) { + assert((si->type == PHP_SCOPE_VAR)||(si->type == PHP_SCOPE_PARAM)); + php_var_dump(&si->var->value, 0, 0); + } else { + php_report_error(PHP_ERROR, "Invalid or missing argument"); + } +} + + +/* + * Sorting stl-way requires operator ">" + */ +class SortElem { + public: + SortElem() {} + SortElem(PHP_VAR_NODE *p) { obj = p; } + + PHP_VAR_NODE *obj; + static PHP_SYN_FUNC_DECL_NODE *callback; + + friend bool operator<(const SortElem &o1, const SortElem &o2); +}; + +PHP_SYN_FUNC_DECL_NODE *SortElem::callback = 0; + +bool operator<(const SortElem &o1, const SortElem &o2) +{ + PHP_VALUE_NODE result; + + value_value_assign(&SortElem::callback->params[0].si_var->var->value, &o1.obj->value); + value_value_assign(&SortElem::callback->params[1].si_var->var->value, &o2.obj->value); + + switch_push_scope_table((PHP_SCOPE_TABLE_TYPE *)SortElem::callback->scope); + + // + // params passed by-value, all & notations ignored + // + result.type = PHP_VAL_NONE; + php_execute(SortElem::callback->code, &result); + cast_value_dnum(&result); + // + // restore stack, free arg list + // + switch_pop_scope_table(0); + + value_value_free(&SortElem::callback->params[0].si_var->var->value); + value_value_free(&SortElem::callback->params[1].si_var->var->value); + + return result.int_val; +} + +void php_native_usort(PHP_VALUE_NODE *) +{ + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); + if ( !si || (si->var->value.type != PHP_VAL_ARRAY)) { + php_report_error(PHP_ERROR, "Invalid or missing argument (array)"); + return; + } + PHP_VAR_NODE *array = si->var; + si = get_scope_item(g_current_scope, "__param_1"); + if ( !si || (si->var->value.type != PHP_VAL_STRING)) { + php_report_error(PHP_ERROR, "Invalid or missing argument (func name)"); + return; + } + char *cmp_func_name = si->var->value.str_val; + si = get_scope_item(g_global_scope, cmp_func_name); + if ( !si || (si->type != PHP_SCOPE_FUNC)) { + php_report_error(PHP_ERROR, "Compare function [%s] not found", cmp_func_name); + return; + } + PHP_SYN_FUNC_DECL_NODE *func_decl = si->func->func_decl; + + // + // usort invalidates keys, and sorts values + // + PHP_ARRAY_TYPE *arr_obj = (PHP_ARRAY_TYPE *)array->value.ptr_val; + // + // create vector of values + // + if ( arr_obj->array.size() == 0 ) { + php_report_error(PHP_WARNING, "Sorting array of size 0"); + return; + } + + std::list sort_list; + for(PHP_ARRAY_ITER_TYPE i = arr_obj->array.begin(); i != arr_obj->array.end(); i++) { + sort_list.push_back(SortElem(i->second)); + } + SortElem::callback = func_decl; + sort_list.sort(); + + arr_obj->array.clear(); + arr_obj->sorted_keys.clear(); + unsigned int key = 0; + for(std::list::iterator i = sort_list.begin(); i != sort_list.end(); i++) { + array_add_to_int_key(&array->value, key++, i->obj); + } + +} + +void php_native_shared_file_cmd(PHP_VALUE_NODE *) +{ + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); + if ( !si || (si->var->value.type != PHP_VAL_STRING)) { + php_report_error(PHP_ERROR, "Invalid or missing argument 1"); + return; + } + char *str_hash = si->var->value.str_val; + + si = get_scope_item(g_current_scope, "__param_1"); + if ( !si || (si->var->value.type != PHP_VAL_STRING)) { + php_report_error(PHP_ERROR, "Invalid or missing argument 2"); + return; + } + char *cmd_name = si->var->value.str_val; + si = get_scope_item(g_current_scope, "__param_2"); + PHP_VAR_NODE *opt_param = si ? si->var : 0; + +#ifndef PHP_STANDALONE_EN + + if ( !strcmp(cmd_name, "prio") && !opt_param ) { + php_report_error(PHP_ERROR, "Command 'prio' need 3-rd argument"); + return; + } + + + CPhPLibContext::g_curr_context->WebServer()->Send_SharedFile_Cmd(wxString(char2unicode(str_hash)), + wxString(char2unicode(cmd_name)), + opt_param ? opt_param->value.int_val : 0); + +#else + printf("php_native_shared_file_cmd: hash=%s cmd=%s\n", str_hash, cmd_name); +#endif +} + +void php_native_reload_shared_file_cmd(PHP_VALUE_NODE *) +{ +#ifndef PHP_STANDALONE_EN + CPhPLibContext::g_curr_context->WebServer()->Send_ReloadSharedFile_Cmd(); +#else + printf("php_native_reload_shared_file_cmd\n"); +#endif +} + +/* + * + * Usage: php_native_download_file_cmd($file_hash, "command", $optional_arg) + * + */ +void php_native_download_file_cmd(PHP_VALUE_NODE *) +{ + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); + if ( !si || (si->var->value.type != PHP_VAL_STRING)) { + php_report_error(PHP_ERROR, "Invalid or missing argument 1"); + return; + } + char *str_hash = si->var->value.str_val; + + si = get_scope_item(g_current_scope, "__param_1"); + if ( !si || (si->var->value.type != PHP_VAL_STRING)) { + php_report_error(PHP_ERROR, "Invalid or missing argument 2"); + return; + } + char *cmd_name = si->var->value.str_val; + si = get_scope_item(g_current_scope, "__param_2"); + PHP_VAR_NODE *opt_param = si ? si->var : 0; + +#ifndef PHP_STANDALONE_EN + if ( (!strcmp(cmd_name, "prio") || !strcmp(cmd_name, "setcat")) && !opt_param ) { + php_report_error(PHP_ERROR, "Commands 'prio' and 'setcat' needs 3-rd argument"); + return; + } + + CPhPLibContext::g_curr_context->WebServer()->Send_DownloadFile_Cmd(wxString(char2unicode(str_hash)), + wxString(char2unicode(cmd_name)), + opt_param ? opt_param->value.int_val : 0); + +#else + printf("php_native_download_file_cmd: hash=%s cmd=%s\n", str_hash, cmd_name); +#endif +} + +/* + * Usage amule_kad_connect($bootstrap_ip, $bootstrap_port) + */ +void php_native_kad_connect(PHP_VALUE_NODE *) +{ + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); + if ( !si ) { + php_report_error(PHP_ERROR, "Missing or bad argument 1: $bootstrap_ip_addr"); + return; + } + cast_value_dnum(&si->var->value); + unsigned int ipaddr = si->var->value.int_val; + + si = get_scope_item(g_current_scope, "__param_1"); + if ( !si ) { + php_report_error(PHP_ERROR, "Missing or bad argument 2: $bootstrap_ip_port"); + return; + } + cast_value_dnum(&si->var->value); + unsigned int ipport = si->var->value.int_val; +#ifndef PHP_STANDALONE_EN + CECPacket req(EC_OP_KAD_START); + req.AddTag(CECTag(EC_TAG_SERVER_ADDRESS, EC_IPv4_t(ipaddr, ipport))); + CPhPLibContext::g_curr_context->WebServer()->Send_Discard_V2_Request(&req); +#else + printf("php_native_kad_connect: ip=%08x port=%d\n", ipaddr, ipport); +#endif +} + +void php_native_kad_disconnect(PHP_VALUE_NODE *) +{ +#ifndef PHP_STANDALONE_EN + CECPacket req(EC_OP_KAD_STOP); + CPhPLibContext::g_curr_context->WebServer()->Send_Discard_V2_Request(&req); +#else + printf("php_native_kad_disconnect\n"); +#endif +} + +/* + * Usage amule_add_server_cmd($server_addr, $server_port, $server_name); + */ +void php_native_add_server_cmd(PHP_VALUE_NODE *) +{ + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); + if ( !si || (si->var->value.type != PHP_VAL_STRING) ) { + php_report_error(PHP_ERROR, "Missing or bad argument 1: $server_addr"); + return; + } + char *addr = si->var->value.str_val; + + si = get_scope_item(g_current_scope, "__param_1"); + if ( !si ) { + php_report_error(PHP_ERROR, "Missing argument 2: $server_port"); + return; + } + cast_value_dnum(&si->var->value); + int port = si->var->value.int_val; + + si = get_scope_item(g_current_scope, "__param_2"); + if ( !si || (si->var->value.type != PHP_VAL_STRING) ) { + php_report_error(PHP_ERROR, "Invalid or missing argument 3: $server_name"); + return; + } + char *name = si->var->value.str_val; + +#ifndef PHP_STANDALONE_EN + CPhPLibContext::g_curr_context->WebServer()->Send_AddServer_Cmd(wxString(char2unicode(addr)), + wxString::Format(wxT("%d"), port), wxString(char2unicode(name))); +#else + printf("php_native_add_server_cmd: addr=%s port=%04d name=%s\n", addr, port, name); +#endif +} + +/* + * Usage amule_server_cmd($server_ip, $server_port, "command"); + */ +void php_native_server_cmd(PHP_VALUE_NODE *) +{ + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); + if ( !si ) { + php_report_error(PHP_ERROR, "Missing argument 1: $server_ip"); + return; + } + cast_value_dnum(&si->var->value); + int ip = si->var->value.int_val; + + si = get_scope_item(g_current_scope, "__param_1"); + if ( !si ) { + php_report_error(PHP_ERROR, "Missing argument 2: $server_port"); + return; + } + cast_value_dnum(&si->var->value); + int port = si->var->value.int_val; + + si = get_scope_item(g_current_scope, "__param_2"); + if ( !si || (si->var->value.type != PHP_VAL_STRING)) { + php_report_error(PHP_ERROR, "Invalid or missing argument 3: $command"); + return; + } + char *cmd = si->var->value.str_val; +#ifndef PHP_STANDALONE_EN + CPhPLibContext::g_curr_context->WebServer()->Send_Server_Cmd(ip, port, wxString(char2unicode(cmd))); +#else + printf("php_native_server_cmd: ip=%08x port=%04d cmd=%s\n", ip, port, cmd); +#endif +} + +/* + * Query amule status. Return hash containing stats values + */ +void php_get_amule_stats(PHP_VALUE_NODE *result) +{ +#ifndef PHP_STANDALONE_EN + CECPacket stat_req(EC_OP_STAT_REQ, EC_DETAIL_FULL); + const CECPacket *stats = CPhPLibContext::g_curr_context->WebServer()->webInterface->SendRecvMsg_v2(&stat_req); + if (!stats) { + return ; + } + CEC_ConnState_Tag *tag = (CEC_ConnState_Tag *)stats->GetTagByName(EC_TAG_CONNSTATE); + if (!tag) { + return ; + } + + cast_value_array(result); + PHP_VAR_NODE *id = array_get_by_str_key(result, "id"); + cast_value_dnum(&id->value); + id->value.int_val = tag->GetEd2kId(); + const CECTag *server = tag->GetTagByName(EC_TAG_SERVER); + if ( server ) { + PHP_VAR_NODE *srv_ip = array_get_by_str_key(result, "serv_addr"); + value_value_free(&srv_ip->value); + srv_ip->value.type = PHP_VAL_STRING; + srv_ip->value.str_val =strdup(unicode2UTF8(server->GetIPv4Data().StringIP())); + + const CECTag *sname = server->GetTagByName(EC_TAG_SERVER_NAME); + if ( sname ) { + PHP_VAR_NODE *srv_name = array_get_by_str_key(result, "serv_name"); + value_value_free(&srv_name->value); + srv_name->value.type = PHP_VAL_STRING; + srv_name->value.str_val = strdup(unicode2UTF8(sname->GetStringData())); + } + + const CECTag *susers = server->GetTagByName(EC_TAG_SERVER_USERS); + if ( susers ) { + PHP_VAR_NODE *srv_users = array_get_by_str_key(result, "serv_users"); + value_value_free(&srv_users->value); + srv_users->value.type = PHP_VAL_INT; + srv_users->value.int_val = susers->GetInt(); + } + + } + // kademlia + PHP_VAR_NODE *kad = array_get_by_str_key(result, "kad_connected"); + value_value_free(&kad->value); + kad->value.type = PHP_VAL_BOOL; + if ( tag->IsConnectedKademlia() ) { + kad->value.int_val = 1; + PHP_VAR_NODE *kad_fwl = array_get_by_str_key(result, "kad_firewalled"); + kad_fwl->value.type = PHP_VAL_BOOL; + kad_fwl->value.int_val = tag->IsKadFirewalled(); + } else { + kad->value.int_val = 0; + } + // traffic stats + PHP_VAR_NODE *speed; + speed = array_get_by_str_key(result, "speed_up"); + value_value_free(&speed->value); + speed->value.type = PHP_VAL_INT; + speed->value.int_val = stats->GetTagByName(EC_TAG_STATS_UL_SPEED)->GetInt(); + + speed = array_get_by_str_key(result, "speed_down"); + value_value_free(&speed->value); + speed->value.type = PHP_VAL_INT; + speed->value.int_val = stats->GetTagByName(EC_TAG_STATS_DL_SPEED)->GetInt(); + + speed = array_get_by_str_key(result, "speed_limit_up"); + value_value_free(&speed->value); + speed->value.type = PHP_VAL_INT; + speed->value.int_val = stats->GetTagByName(EC_TAG_STATS_UL_SPEED_LIMIT)->GetInt(); + + speed = array_get_by_str_key(result, "speed_limit_down"); + value_value_free(&speed->value); + speed->value.type = PHP_VAL_INT; + speed->value.int_val = stats->GetTagByName(EC_TAG_STATS_DL_SPEED_LIMIT)->GetInt(); + + delete stats; +#else + cast_value_array(result); + PHP_VAR_NODE *id = array_get_by_str_key(result, "id"); + cast_value_dnum(&id->value); + id->value.int_val = 1234567; +#endif +} + +void php_get_amule_categories(PHP_VALUE_NODE *result) +{ + cast_value_array(result); +#ifndef PHP_STANDALONE_EN + CECPacket req(EC_OP_GET_PREFERENCES); + req.AddTag(CECTag(EC_TAG_SELECT_PREFS, (uint32)EC_PREFS_CATEGORIES)); + const CECPacket *reply = CPhPLibContext::g_curr_context->WebServer()->webInterface->SendRecvMsg_v2(&req); + if ( !reply ) { + return ; + } + const CECTag *cats_tag = reply->GetTagCount() ? reply->GetTagByIndex(0) : 0; + if ( cats_tag && cats_tag->GetTagCount() ) { + for (int i = 0; i < cats_tag->GetTagCount(); i++) { + const CECTag *tag = cats_tag->GetTagByIndex(i); + const CECTag *categoryTitle = tag->GetTagByName(EC_TAG_CATEGORY_TITLE); + PHP_VAR_NODE *cat = array_get_by_int_key(result, i); + value_value_free(&cat->value); + cat->value.type = PHP_VAL_STRING; + cat->value.str_val = strdup(unicode2UTF8(categoryTitle->GetStringData())); + } + } else { + PHP_VAR_NODE *cat = array_get_by_int_key(result, 0); + value_value_free(&cat->value); + cat->value.type = PHP_VAL_STRING; + cat->value.str_val = strdup("all"); + } + delete reply; +#else + for (int i = 0; i < 5; i++) { + PHP_VAR_NODE *cat = array_get_by_int_key(result, i); + value_value_free(&cat->value); + cat->value.type = PHP_VAL_STRING; + cat->value.str_val = strdup("some_cat"); + } +#endif +} + +#ifndef PHP_STANDALONE_EN + +typedef struct { + char *php_name; + ECTagNames tagname; + int opsize; +} PHP_2_EC_OPT_DEF; + +PHP_2_EC_OPT_DEF g_connection_opt_defs[] = { + { "max_line_up_cap", EC_TAG_CONN_UL_CAP, 4}, { "max_line_down_cap", EC_TAG_CONN_DL_CAP, 4}, + { "max_up_limit", EC_TAG_CONN_MAX_UL, 2}, { "max_down_limit", EC_TAG_CONN_MAX_DL, 2}, + { "slot_alloc", EC_TAG_CONN_SLOT_ALLOCATION, 2}, + { "tcp_port", EC_TAG_CONN_TCP_PORT, 2}, { "udp_port", EC_TAG_CONN_UDP_PORT, 2}, + { "udp_dis", EC_TAG_CONN_UDP_DISABLE, 0}, + { "max_file_src", EC_TAG_CONN_MAX_FILE_SOURCES, 2}, + { "max_conn_total", EC_TAG_CONN_MAX_CONN, 2}, + { "autoconn_en", EC_TAG_CONN_AUTOCONNECT, 0}, { "reconn_en", EC_TAG_CONN_RECONNECT, 0}, + {0, (ECTagNames)0, 0} +}; + +PHP_2_EC_OPT_DEF g_file_opt_defs[] = { + { "ich_en", EC_TAG_FILES_ICH_ENABLED, 0}, + { "aich_trust", EC_TAG_FILES_AICH_TRUST, 0}, + { "new_files_paused", EC_TAG_FILES_NEW_PAUSED, 0}, + { "new_files_auto_dl_prio", EC_TAG_FILES_NEW_AUTO_DL_PRIO, 0}, + { "preview_prio", EC_TAG_FILES_PREVIEW_PRIO, 0}, + { "new_files_auto_ul_prio", EC_TAG_FILES_NEW_AUTO_UL_PRIO, 0}, + { "upload_full_chunks", EC_TAG_FILES_UL_FULL_CHUNKS, 0}, + { "first_last_chunks_prio", EC_TAG_FILES_PREVIEW_PRIO, 0}, + { "start_next_paused", EC_TAG_FILES_START_NEXT_PAUSED, 0}, + { "resume_same_cat", EC_TAG_FILES_RESUME_SAME_CAT, 0}, + { "save_sources", EC_TAG_FILES_SAVE_SOURCES, 0}, + { "extract_metadata", EC_TAG_FILES_EXTRACT_METADATA, 0}, + { "alloc_full_chunks", EC_TAG_FILES_ALLOC_FULL_CHUNKS, 0}, + { "alloc_full", EC_TAG_FILES_ALLOC_FULL_SIZE, 0}, + { "check_free_space", EC_TAG_FILES_CHECK_FREE_SPACE, 0}, + { "min_free_space", EC_TAG_FILES_MIN_FREE_SPACE, 4}, + {0, (ECTagNames)0, 0} +}; + +PHP_2_EC_OPT_DEF g_webserver_opt_defs[] = { + { "use_gzip", EC_TAG_WEBSERVER_USEGZIP, 0}, + { "autorefresh_time", EC_TAG_WEBSERVER_REFRESH, 4}, + {0, (ECTagNames)0, 0} +}; + +PHP_2_EC_OPT_DEF g_coretweak_opt_defs[] = { + { "max_conn_5sec", EC_TAG_CORETW_MAX_CONN_PER_FIVE, 2}, + {0, (ECTagNames)0, 0} +}; + +void set_array_int_val(PHP_VALUE_NODE *array, std::string arrkey, int value) +{ + PHP_VAR_NODE *key = array_get_by_str_key(array, arrkey); + PHP_VALUE_NODE intval; + intval.type = PHP_VAL_INT; + intval.int_val = value; + value_value_assign(&key->value, &intval); +} + +void ec_tag_2_php(const CECTag *cattag, PHP_2_EC_OPT_DEF *opts, PHP_VAR_NODE *catvar) +{ + for(PHP_2_EC_OPT_DEF *def = opts; def->php_name; def++) { + int val; + switch(def->opsize) { + case 0: val = cattag->GetTagByName(def->tagname) ? 1 : 0; break; + case 1: val = cattag->GetTagByNameSafe(def->tagname)->GetInt(); break; + case 2: val = cattag->GetTagByNameSafe(def->tagname)->GetInt(); break; + case 4: val = cattag->GetTagByNameSafe(def->tagname)->GetInt(); break; + default: val = -1; + } + wxASSERT(val != -1); + //printf("OPT_DEBUG: %s of size %d -> %d\n", def->php_name, def->opsize, val); + set_array_int_val(&catvar->value, def->php_name, val); + } +} +#endif + +/* + * Return hash of amule options. + * Key: option name + * Value: option value (string) + */ +void php_get_amule_options(PHP_VALUE_NODE *result) +{ + cast_value_array(result); +#ifndef PHP_STANDALONE_EN + CECPacket req(EC_OP_GET_PREFERENCES); + req.AddTag(CECTag(EC_TAG_SELECT_PREFS, (uint32)0xffffffff)); + const CECPacket *reply = CPhPLibContext::g_curr_context->WebServer()->webInterface->SendRecvMsg_v2(&req); + if ( !reply || !reply->GetTagCount()) { + return ; + } + const CECTag *cattag = 0; + PHP_VALUE_NODE intval; + intval.type = PHP_VAL_INT; + if ((cattag = reply->GetTagByName(EC_TAG_PREFS_GENERAL)) != 0) { + PHP_VAR_NODE *key = array_get_by_str_key(result, "nick"); + value_value_free(&key->value); + key->value.type = PHP_VAL_STRING; + key->value.str_val = strdup(unicode2UTF8(cattag->GetTagByNameSafe(EC_TAG_USER_NICK)->GetStringData())); + } + + if ((cattag = reply->GetTagByName(EC_TAG_PREFS_CONNECTIONS)) != 0) { + PHP_VAR_NODE *cat = array_get_by_str_key(result, "connection"); + cast_value_array(&cat->value); + + ec_tag_2_php(cattag, g_connection_opt_defs, cat); + } + if ((cattag = reply->GetTagByName(EC_TAG_PREFS_FILES)) != 0) { + PHP_VAR_NODE *cat = array_get_by_str_key(result, "files"); + cast_value_array(&cat->value); + + ec_tag_2_php(cattag, g_file_opt_defs, cat); + } + + if ((cattag = reply->GetTagByName(EC_TAG_PREFS_REMOTECTRL)) != 0) { + PHP_VAR_NODE *cat = array_get_by_str_key(result, "webserver"); + cast_value_array(&cat->value); + + ec_tag_2_php(cattag, g_webserver_opt_defs, cat); + } + + if ((cattag = reply->GetTagByName(EC_TAG_PREFS_CORETWEAKS)) != 0) { + PHP_VAR_NODE *cat = array_get_by_str_key(result, "coretweaks"); + cast_value_array(&cat->value); + + ec_tag_2_php(cattag, g_coretweak_opt_defs, cat); + } + + +#endif +} + +#ifndef PHP_STANDALONE_EN +bool php_2_ec_tag(CECTag *cattag, PHP_2_EC_OPT_DEF *opts, PHP_VALUE_NODE *catvar) +{ + for(PHP_2_EC_OPT_DEF *def = opts; def->php_name; def++) { + PHP_VAR_NODE *opt_var = array_get_by_str_key(catvar, def->php_name); + if ( opt_var->value.type == PHP_VAL_NONE ) { + continue; + } + cast_value_dnum(&opt_var->value); + switch(def->opsize) { + case 0: // always transmit ! + case 1: cattag->AddTag(CECTag(def->tagname ,(uint8)opt_var->value.int_val)); break; + case 2: cattag->AddTag(CECTag(def->tagname ,(uint16)opt_var->value.int_val)); break; + case 4: cattag->AddTag(CECTag(def->tagname ,(uint32)opt_var->value.int_val)); break; + default: return false; + } + } + return true; +} +#endif + +/* + * Set amule options from given array. Argument looks like "amule_get_options" result + */ +void php_set_amule_options(PHP_VALUE_NODE *) +{ + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); + if ( !si || (si->var->value.type != PHP_VAL_ARRAY)) { + php_report_error(PHP_ERROR, "Invalid or missing argument 1 (options array)"); + return; + } +#ifndef PHP_STANDALONE_EN + CECPacket req(EC_OP_SET_PREFERENCES); + PHP_VAR_NODE *opt_group_array = 0; + + // files + opt_group_array = array_get_by_str_key(&si->var->value, "files"); + if ( opt_group_array->value.type == PHP_VAL_ARRAY ) { + CECEmptyTag filePrefs(EC_TAG_PREFS_FILES); + php_2_ec_tag(&filePrefs, g_file_opt_defs, &opt_group_array->value); + req.AddTag(filePrefs); + } + // connection + opt_group_array = array_get_by_str_key(&si->var->value, "connection"); + if ( opt_group_array->value.type == PHP_VAL_ARRAY ) { + CECEmptyTag connPrefs(EC_TAG_PREFS_CONNECTIONS); + php_2_ec_tag(&connPrefs, g_connection_opt_defs, &opt_group_array->value); + req.AddTag(connPrefs); + } + // webserver + opt_group_array = array_get_by_str_key(&si->var->value, "webserver"); + if ( opt_group_array->value.type == PHP_VAL_ARRAY ) { + CECEmptyTag webPrefs(EC_TAG_PREFS_REMOTECTRL); + php_2_ec_tag(&webPrefs, g_webserver_opt_defs, &opt_group_array->value); + req.AddTag(webPrefs); + // also apply settings localy + PHP_VAR_NODE *pref = array_get_by_str_key(&opt_group_array->value, "use_gzip"); + cast_value_dnum(&pref->value); + CPhPLibContext::g_curr_context->WebServer()->webInterface->m_UseGzip = pref->value.int_val != 0; + pref = array_get_by_str_key(&opt_group_array->value, "autorefresh_time"); + cast_value_dnum(&pref->value); + CPhPLibContext::g_curr_context->WebServer()->webInterface->m_PageRefresh = pref->value.int_val; + } + CPhPLibContext::g_curr_context->WebServer()->Send_Discard_V2_Request(&req); + +#endif +} + +/* + * Download 1 of search results. Params: hash, category (default=0) + */ +void php_native_search_download_cmd(PHP_VALUE_NODE *) +{ + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); + if ( !si || (si->var->value.type != PHP_VAL_STRING)) { + php_report_error(PHP_ERROR, "Invalid or missing argument 1 (file hash)"); + return; + } + char *str_hash = si->var->value.str_val; + + si = get_scope_item(g_current_scope, "__param_1"); + if ( !si || (si->var->value.type != PHP_VAL_STRING)) { + php_report_error(PHP_ERROR, "Invalid or missing argument 2 (category)"); + return; + } + + cast_value_dnum(&si->var->value); + int cat = si->var->value.int_val; +#ifndef PHP_STANDALONE_EN + CPhPLibContext::g_curr_context->WebServer()->Send_DownloadSearchFile_Cmd( + wxString(char2unicode(str_hash)), cat); +#else + printf("php_native_search_download_cmd: hash=%s category=%d\n", str_hash, cat); +#endif +} + +void php_native_search_start_cmd(PHP_VALUE_NODE *) +{ + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); + if ( !si || (si->var->value.type != PHP_VAL_STRING)) { + php_report_error(PHP_ERROR, "Invalid or missing argument 1 (search term)"); + return; + } + char *search = si->var->value.str_val; + + if ( !(si = get_scope_item(g_current_scope, "__param_1")) || (si->var->value.type != PHP_VAL_STRING)) { + php_report_error(PHP_ERROR, "Invalid or missing argument 2 (file extension)"); + return; + } + char *ext = si->var->value.str_val; + + if ( !(si = get_scope_item(g_current_scope, "__param_2")) || (si->var->value.type != PHP_VAL_STRING)) { + php_report_error(PHP_ERROR, "Invalid or missing argument 3 (file type)"); + return; + } + char *type = si->var->value.str_val; + + if ( !(si = get_scope_item(g_current_scope, "__param_3")) ) { + php_report_error(PHP_ERROR, "Invalid or missing argument 4 (search type)"); + return; + } + cast_value_dnum(&si->var->value); + +#ifndef PHP_STANDALONE_EN + EC_SEARCH_TYPE search_type; + switch(si->var->value.int_val) { + case 0: search_type = EC_SEARCH_LOCAL; break; + case 1: search_type = EC_SEARCH_GLOBAL; break; + case 2: search_type = EC_SEARCH_KAD; break; + default: + php_report_error(PHP_ERROR, "Invalid search type %"PRIu64, si->var->value.int_val); + return; + } +#endif + if ( !(si = get_scope_item(g_current_scope, "__param_4")) ) { + php_report_error(PHP_ERROR, "Invalid or missing argument 5 (availability)"); + return; + } + cast_value_dnum(&si->var->value); + int avail = si->var->value.int_val; + + if ( !(si = get_scope_item(g_current_scope, "__param_5")) ) { + php_report_error(PHP_ERROR, "Invalid or missing argument 6 (min size)"); + return; + } + cast_value_dnum(&si->var->value); + int min_size = si->var->value.int_val; + + if ( !(si = get_scope_item(g_current_scope, "__param_6")) ) { + php_report_error(PHP_ERROR, "Invalid or missing argument 7 (max size)"); + return; + } + cast_value_dnum(&si->var->value); + int max_size = si->var->value.int_val; + +#ifndef PHP_STANDALONE_EN + CPhPLibContext::g_curr_context->WebServer()->Send_Search_Cmd( + wxString(char2unicode(search)), wxString(char2unicode(ext)), wxString(char2unicode(type)), + search_type, avail, min_size, max_size); +#else + printf("php_native_search_start_cmd: search=%s \n", search); +#endif + +} + +/* + * Request contents of log + */ +void php_get_log(PHP_VALUE_NODE *result) +{ + value_value_free(result); + + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); + bool rst; + if ( !si ) { + rst = false; + } else { + cast_value_dnum(&si->var->value); + rst = si->var->value.int_val != 0; + } +#ifndef PHP_STANDALONE_EN + if ( rst ) { + CECPacket req(EC_OP_RESET_LOG); + CPhPLibContext::g_curr_context->WebServer()->Send_Discard_V2_Request(&req); + } + CECPacket req(EC_OP_GET_LOG); + const CECPacket *response = CPhPLibContext::g_curr_context->WebServer()->webInterface->SendRecvMsg_v2(&req); + if (response) { + wxString serverInfoString(_SpecialChars(response->GetTagByIndexSafe(0)->GetStringData())); + delete response; + result->type = PHP_VAL_STRING; + result->str_val = strdup((const char *)unicode2UTF8(serverInfoString)); + } +#else + printf("php_get_log: reset=%d\n", rst); +#endif +} + +/* + * Request contents of server info + */ +void php_get_serverinfo(PHP_VALUE_NODE *result) +{ + value_value_free(result); + + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); + bool rst; + if ( !si ) { + rst = false; + } else { + cast_value_dnum(&si->var->value); + rst = si->var->value.int_val != 0; + } +#ifndef PHP_STANDALONE_EN + if ( rst ) { + CECPacket req(EC_OP_CLEAR_SERVERINFO); + CPhPLibContext::g_curr_context->WebServer()->Send_Discard_V2_Request(&req); + } + CECPacket req(EC_OP_GET_SERVERINFO); + const CECPacket *response = CPhPLibContext::g_curr_context->WebServer()->webInterface->SendRecvMsg_v2(&req); + if (response) { + wxString serverInfoString(_SpecialChars(response->GetTagByIndexSafe(0)->GetStringData())); + delete response; + result->type = PHP_VAL_STRING; + result->str_val = strdup((const char *)unicode2UTF8(serverInfoString)); + } +#else + printf("php_get_serverinfo: reset=%d\n", rst); +#endif +} + + +/* + * Download ed2k link. Params: link, category (default=0) + */ +void php_native_ed2k_download_cmd(PHP_VALUE_NODE *result) +{ + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); + if ( !si || (si->var->value.type != PHP_VAL_STRING)) { + php_report_error(PHP_ERROR, "Invalid or missing argument 1 (file link)"); + return; + } + char *str_link = si->var->value.str_val; + + si = get_scope_item(g_current_scope, "__param_1"); + if ( !si || (si->var->value.type != PHP_VAL_STRING)) { + php_report_error(PHP_ERROR, "Invalid or missing argument 2 (category)"); + return; + } + + cast_value_dnum(&si->var->value); + int cat = si->var->value.int_val; +#ifndef PHP_STANDALONE_EN + bool cmd_result = CPhPLibContext::g_curr_context->WebServer()->Send_DownloadEd2k_Cmd( + wxString(char2unicode(str_link)), cat); + if ( result ) { + cast_value_bool(result); + result->int_val = cmd_result; + } +#else + printf("php_native_search_download_cmd: hash=%s category=%d\n", str_link, cat); +#endif +} + +/* + * String functions + */ +void php_native_strlen(PHP_VALUE_NODE *result) +{ + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); + if ( si ) { + PHP_VALUE_NODE *param = &si->var->value; + cast_value_str(param); + if ( result ) { + cast_value_dnum(result); + result->int_val = strlen(param->str_val); + } + } else { + php_report_error(PHP_ERROR, "Invalid or missing argument"); + } +} + +void php_native_count(PHP_VALUE_NODE *result) +{ + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); + if ( si ) { + PHP_VALUE_NODE *param = &si->var->value; + if ( result ) { + cast_value_dnum(result); + if ( (si->var->value.type == PHP_VAL_NONE) || (si->var->value.type != PHP_VAL_ARRAY) ) { + result->int_val = 0; + } else { + result->int_val = array_get_size(param); + } + } + } else { + php_report_error(PHP_ERROR, "Invalid or missing argument"); + } +} + +void php_native_isset(PHP_VALUE_NODE *result) +{ + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); + if ( si ) { + PHP_VALUE_NODE *param = &si->var->value; + cast_value_str(param); + if ( result ) { + cast_value_bool(result); + result->int_val = (si->var->value.type == PHP_VAL_NONE) ? 0 : 1; + } + } else { + php_report_error(PHP_ERROR, "Invalid or missing argument"); + } +} + +void php_native_substr(PHP_VALUE_NODE * /*result*/) +{ + PHP_SCOPE_ITEM *si_str = get_scope_item(g_current_scope, "__param_0"); + PHP_VALUE_NODE *str = &si_str->var->value; + if ( si_str ) { + cast_value_str(str); + } else { + php_report_error(PHP_ERROR, "Invalid or missing argument 'str' for 'substr'"); + return; + } + PHP_SCOPE_ITEM *si_start = get_scope_item(g_current_scope, "start"); + PHP_VALUE_NODE *start = &si_start->var->value; + if ( si_start ) { + cast_value_dnum(start); + } else { + php_report_error(PHP_ERROR, "Invalid or missing argument 'start' for 'substr'"); + return; + } + // 3-rd is optional + PHP_SCOPE_ITEM *si_end = get_scope_item(g_current_scope, "end"); + PHP_VALUE_NODE end = { PHP_VAL_INT, { 0 } }; + if ( si_end ) { + end = si_end->var->value; + } + cast_value_dnum(&end); + + +} + +/* + * Load amule variables into interpreter scope. + * "varname" will tell us, what kind of variables need to load: + * "downloads", "uploads", "searchresult", "servers", "options" etc + */ +#ifndef PHP_STANDALONE_EN + +template +void amule_obj_array_create(char *class_name, PHP_VALUE_NODE *result) +{ + if ( !result ) { + return; + } + C *container = T::GetContainerInstance(); + + container->ReQuery(); + + typename std::list::const_iterator it = container->GetBeginIterator(); + while ( it != container->GetEndIterator()) { + PHP_VAR_NODE *var = array_push_back(result); + var->value.type = PHP_VAL_OBJECT; + var->value.obj_val.class_name = class_name; + const T *cur_item = &(*it); + var->value.obj_val.inst_ptr = (void *)cur_item; + it++; + } +} + +void amule_load_downloads(PHP_VALUE_NODE *result) +{ + amule_obj_array_create("AmuleDownloadFile", result); +} + +void amule_load_servers(PHP_VALUE_NODE *result) +{ + amule_obj_array_create("AmuleServer", result); +} + +void amule_load_shared(PHP_VALUE_NODE *result) +{ + amule_obj_array_create("AmuleSharedFile", result); +} + +void amule_load_search(PHP_VALUE_NODE *result) +{ + amule_obj_array_create("AmuleSearchFile", result); +} + +void amule_load_uploads(PHP_VALUE_NODE *result) +{ + amule_obj_array_create("AmuleUploadFile", result); +} + +void amule_load_stats() +{ + CPhPLibContext::g_curr_context->WebServer()->Reload_Stats(); +} + +/* + * Convert CEC_StatTree_Node_Tag into php associative array + * + * Since data structure is recoursive - we need helper function + * to perform conversion + */ +void ecstats2php(CEC_StatTree_Node_Tag *root, PHP_VALUE_NODE *result) +{ + cast_value_array(result); + std::string key(unicode2UTF8(root->GetDisplayString())); + PHP_VAR_NODE *v_key = array_get_by_str_key(result, key); + for (int i = 0; i < root->GetTagCount(); i++) { + CEC_StatTree_Node_Tag *tag = (CEC_StatTree_Node_Tag*)root->GetTagByIndex(i); + if (tag->GetTagName() == EC_TAG_STATTREE_NODE) { + ecstats2php(tag, &v_key->value); + } + } + +} + +void amule_load_stats_tree(PHP_VALUE_NODE *result) +{ + if ( !result ) { + return; + } + value_value_free(result); + + CECPacket req(EC_OP_GET_STATSTREE, EC_DETAIL_WEB); + const CECPacket *response = CPhPLibContext::g_curr_context->WebServer()->webInterface->SendRecvMsg_v2(&req); + if ( !response ) { + return; + } + const CECTag *server_ver = response->GetTagByName(EC_TAG_SERVER_VERSION); + const CECTag *user_nick = response->GetTagByName(EC_TAG_USER_NICK); + if ( !server_ver || !user_nick ) { + delete response; + return; + } + CEC_StatTree_Node_Tag *stats_root = (CEC_StatTree_Node_Tag *)response->GetTagByName(EC_TAG_STATTREE_NODE); + //ecstats2php(stats_root, result); + for (int i = 0; i < stats_root->GetTagCount(); i++) { + CEC_StatTree_Node_Tag *tag = (CEC_StatTree_Node_Tag*)stats_root->GetTagByIndex(i); + if (tag->GetTagName() == EC_TAG_STATTREE_NODE) { + ecstats2php(tag, result); + } + } +} + +#else + +void amule_fake_obj_array_create(int count, char *class_name, PHP_VALUE_NODE *result) +{ + for (int i = 0; i < count; i++) { + PHP_VAR_NODE *var = array_push_back(result); + var->value.type = PHP_VAL_OBJECT; + var->value.obj_val.class_name = class_name; + var->value.obj_val.inst_ptr = 0; + } +} + +void amule_load_downloads(PHP_VALUE_NODE *result) +{ + amule_fake_obj_array_create(10, "AmuleDownloadFile", result); +} + +void amule_load_servers(PHP_VALUE_NODE *result) +{ + amule_fake_obj_array_create(20, "AmuleServer", result); +} + +void amule_load_shared(PHP_VALUE_NODE *result) +{ + amule_fake_obj_array_create(15, "AmuleSharedFile", result); +} + +void amule_load_search(PHP_VALUE_NODE *result) +{ + amule_fake_obj_array_create(35, "AmuleSearchFile", result); +} + +void amule_load_uploads(PHP_VALUE_NODE *result) +{ + amule_fake_obj_array_create(17, "AmuleUploadFile", result); +} + +void amule_load_stats() +{ +} + +void amule_load_stats_tree(PHP_VALUE_NODE *) +{ +} + +#endif + +void php_native_load_amule_vars(PHP_VALUE_NODE *result) +{ + PHP_SCOPE_ITEM *si_str = get_scope_item(g_current_scope, "__param_0"); + if ( !si_str ) { + php_report_error(PHP_ERROR, "Missing argument 'varname' for 'load_amule_vars'"); + return; + } + PHP_VALUE_NODE *str = &si_str->var->value; + if ( str->type != PHP_VAL_STRING ) { + php_report_error(PHP_ERROR, "Argument 'varname' for 'load_amule_vars' must be string"); + return; + } + char *varname = str->str_val; + if ( result ) { + cast_value_array(result); + } + if ( strcmp(varname, "downloads") == 0 ) { + amule_load_downloads(result); + } else if ( strcmp(varname, "uploads") == 0 ) { + amule_load_uploads(result); + } else if ( strcmp(varname, "shared") == 0 ) { + amule_load_shared(result); + } else if ( strcmp(varname, "searchresult") == 0 ) { + amule_load_search(result); + } else if ( strcmp(varname, "servers") == 0 ) { + amule_load_servers(result); + } else if ( strcmp(varname, "stats_graph") == 0 ) { + amule_load_stats(); + } else if ( strcmp(varname, "stats_tree") == 0 ) { + amule_load_stats_tree(result); + } else { + value_value_free(result); + php_report_error(PHP_ERROR, "This type of amule variable is unknown"); + } +} + +/* + * Amule objects implementations + */ +#ifndef PHP_STANDALONE_EN +void amule_download_file_prop_get(void *ptr, char *prop_name, PHP_VALUE_NODE *result) +{ + if ( !ptr ) { + value_value_free(result); + return; + } + DownloadFile *obj = (DownloadFile *)ptr; + result->type = PHP_VAL_INT; + if ( strcmp(prop_name, "name") == 0 ) { + result->type = PHP_VAL_STRING; + result->str_val = strdup((const char *)unicode2UTF8(obj->sFileName)); + } else if ( strcmp(prop_name, "short_name") == 0 ) { + result->type = PHP_VAL_STRING; + wxString short_name(obj->sFileName.Length() > 60 ? (obj->sFileName.Left(60) + (wxT(" ..."))) : obj->sFileName); + result->str_val = strdup((const char *)unicode2UTF8(short_name)); + } else if ( strcmp(prop_name, "hash") == 0 ) { + result->type = PHP_VAL_STRING; + result->str_val = strdup((const char *)unicode2UTF8(obj->sFileHash)); + } else if ( strcmp(prop_name, "progress") == 0 ) { + result->type = PHP_VAL_STRING; + result->str_val = strdup((const char *)unicode2UTF8(obj->m_Image->GetHTML())); + } else if ( strcmp(prop_name, "link") == 0 ) { + result->type = PHP_VAL_STRING; + result->str_val = strdup((const char *)unicode2UTF8(obj->sED2kLink)); + } else if ( strcmp(prop_name, "category") == 0 ) { + result->int_val = obj->nCat; + } else if ( strcmp(prop_name, "status") == 0 ) { + result->int_val = obj->nFileStatus; + } else if ( strcmp(prop_name, "size") == 0 ) { + result->int_val = obj->lFileSize; + } else if ( strcmp(prop_name, "size_done") == 0 ) { + result->int_val = obj->lFileCompleted; + } else if ( strcmp(prop_name, "size_xfer") == 0 ) { + result->int_val = obj->lFileTransferred; + } else if ( strcmp(prop_name, "speed") == 0 ) { + result->int_val = obj->lFileSpeed; + } else if ( strcmp(prop_name, "src_count") == 0 ) { + result->int_val = obj->lSourceCount; + } else if ( strcmp(prop_name, "src_count_not_curr") == 0 ) { + result->int_val = obj->lNotCurrentSourceCount; + } else if ( strcmp(prop_name, "src_count_a4af") == 0 ) { + result->int_val = obj->lSourceCountA4AF; + } else if ( strcmp(prop_name, "src_count_xfer") == 0 ) { + result->int_val = obj->lTransferringSourceCount; + } else if ( strcmp(prop_name, "prio") == 0 ) { + result->int_val = obj->lFilePrio; + } else if ( strcmp(prop_name, "prio_auto") == 0 ) { + result->int_val = obj->bFileAutoPriority; + } else if ( strcmp(prop_name, "last_seen_complete") == 0 ) { + result->int_val = obj->wxtLastSeenComplete.GetTicks(); + } else { + php_report_error(PHP_ERROR, "'DownloadFile' property [%s] is unknown", prop_name); + } +} + +void amule_upload_file_prop_get(void *ptr, char *prop_name, PHP_VALUE_NODE *result) +{ + if ( !ptr ) { + value_value_free(result); + return; + } + UploadFile *obj = (UploadFile *)ptr; + result->type = PHP_VAL_INT; + if ( strcmp(prop_name, "name") == 0 ) { + result->type = PHP_VAL_STRING; + SharedFile *sharedfile = SharedFile::GetContainerInstance()->GetByID(obj->nHash); + // uploading file we don't share ?! We must be out of sync with core + if ( !sharedfile ) { + SharedFile::GetContainerInstance()->ReQuery(); + sharedfile = SharedFile::GetContainerInstance()->GetByID(obj->nHash); + } + result->str_val = strdup((const char *)unicode2UTF8(sharedfile->sFileName)); + } else if ( strcmp(prop_name, "short_name") == 0 ) { + result->type = PHP_VAL_STRING; + SharedFile *sharedfile = SharedFile::GetContainerInstance()->GetByID(obj->nHash); + if ( !sharedfile ) { + SharedFile::GetContainerInstance()->ReQuery(); + sharedfile = SharedFile::GetContainerInstance()->GetByID(obj->nHash); + } + wxString short_name(sharedfile->sFileName.Length() > 60 ? (sharedfile->sFileName.Left(60) + (wxT(" ..."))) : sharedfile->sFileName); + result->str_val = strdup((const char *)unicode2UTF8(short_name)); + } else if ( strcmp(prop_name, "user_name") == 0 ) { + result->type = PHP_VAL_STRING; + result->str_val = strdup((const char *)unicode2UTF8(obj->sUserName)); + } else if ( strcmp(prop_name, "xfer_up") == 0 ) { + result->int_val = obj->nTransferredUp; + } else if ( strcmp(prop_name, "xfer_down") == 0 ) { + result->int_val = obj->nTransferredDown; + } else if ( strcmp(prop_name, "xfer_speed") == 0 ) { + result->int_val = obj->nSpeed; + } else { + php_report_error(PHP_ERROR, "'UploadFile' property [%s] is unknown", prop_name); + } +} + +void amule_server_prop_get(void *ptr, char *prop_name, PHP_VALUE_NODE *result) +{ + if ( !ptr ) { + value_value_free(result); + return; + } + ServerEntry *obj = (ServerEntry *)ptr; + if ( strcmp(prop_name, "name") == 0 ) { + result->type = PHP_VAL_STRING; + result->str_val = strdup((const char *)unicode2UTF8(obj->sServerName)); + } else if ( strcmp(prop_name, "desc") == 0 ) { + result->type = PHP_VAL_STRING; + result->str_val = strdup((const char *)unicode2UTF8(obj->sServerDescription)); + } else if ( strcmp(prop_name, "addr") == 0 ) { + result->type = PHP_VAL_STRING; + result->str_val = strdup((const char *)unicode2UTF8(obj->sServerIP)); + } else if ( strcmp(prop_name, "users") == 0 ) { + result->type = PHP_VAL_INT; + result->int_val = obj->nServerUsers; + } else if ( strcmp(prop_name, "ip") == 0 ) { + result->type = PHP_VAL_INT; + result->int_val = obj->nServerIP; + } else if ( strcmp(prop_name, "port") == 0 ) { + result->type = PHP_VAL_INT; + result->int_val = obj->nServerPort; + } else if ( strcmp(prop_name, "maxusers") == 0 ) { + result->type = PHP_VAL_INT; + result->int_val = obj->nServerMaxUsers; + } else if ( strcmp(prop_name, "files") == 0 ) { + result->type = PHP_VAL_INT; + result->int_val = obj->nServerFiles; + } else { + php_report_error(PHP_ERROR, "'ServerEntry' property [%s] is unknown", prop_name); + } +} + +void amule_shared_file_prop_get(void *ptr, char *prop_name, PHP_VALUE_NODE *result) +{ + if ( !ptr ) { + value_value_free(result); + return; + } + SharedFile *obj = (SharedFile *)ptr; + if ( strcmp(prop_name, "name") == 0 ) { + result->type = PHP_VAL_STRING; + result->str_val = strdup((const char *)unicode2UTF8(obj->sFileName)); + } else if ( strcmp(prop_name, "short_name") == 0 ) { + result->type = PHP_VAL_STRING; + wxString short_name(obj->sFileName.Length() > 60 ? (obj->sFileName.Left(60) + (wxT(" ..."))) : obj->sFileName); + result->str_val = strdup((const char *)unicode2UTF8(short_name)); + } else if ( strcmp(prop_name, "hash") == 0 ) { + result->type = PHP_VAL_STRING; + result->str_val = strdup((const char *)unicode2UTF8(obj->sFileHash)); + } else if ( strcmp(prop_name, "size") == 0 ) { + result->type = PHP_VAL_INT; + result->int_val = obj->lFileSize; + } else if ( strcmp(prop_name, "link") == 0 ) { + result->type = PHP_VAL_STRING; + result->str_val = strdup(unicode2UTF8(obj->sED2kLink)); + } else if ( strcmp(prop_name, "xfer") == 0 ) { + result->type = PHP_VAL_INT; + result->int_val = obj->nFileTransferred; + } else if ( strcmp(prop_name, "xfer_all") == 0 ) { + result->type = PHP_VAL_INT; + result->int_val = obj->nFileAllTimeTransferred; + } else if ( strcmp(prop_name, "req") == 0 ) { + result->type = PHP_VAL_INT; + result->int_val = obj->nFileRequests; + } else if ( strcmp(prop_name, "req_all") == 0 ) { + result->type = PHP_VAL_INT; + result->int_val = obj->nFileAllTimeRequests; + } else if ( strcmp(prop_name, "accept") == 0 ) { + result->type = PHP_VAL_INT; + result->int_val = obj->nFileAccepts; + } else if ( strcmp(prop_name, "accept_all") == 0 ) { + result->type = PHP_VAL_INT; + result->int_val = obj->nFileAllTimeAccepts; + } else if ( strcmp(prop_name, "prio") == 0 ) { + result->type = PHP_VAL_INT; + result->int_val = obj->nFilePriority; + } else if ( strcmp(prop_name, "prio_auto") == 0 ) { + result->type = PHP_VAL_BOOL; + result->int_val = obj->bFileAutoPriority; + } else { + php_report_error(PHP_ERROR, "'SharedFile' property [%s] is unknown", prop_name); + } +} + +void amule_search_file_prop_get(void *ptr, char *prop_name, PHP_VALUE_NODE *result) +{ + if ( !ptr ) { + value_value_free(result); + return; + } + SearchFile *obj = (SearchFile *)ptr; + if ( strcmp(prop_name, "name") == 0 ) { + result->type = PHP_VAL_STRING; + result->str_val = strdup((const char *)unicode2UTF8(obj->sFileName)); + } else if ( strcmp(prop_name, "short_name") == 0 ) { + result->type = PHP_VAL_STRING; + wxString short_name(obj->sFileName.Length() > 60 ? (obj->sFileName.Left(60) + (wxT(" ..."))) : obj->sFileName); + result->str_val = strdup((const char *)unicode2UTF8(short_name)); + } else if ( strcmp(prop_name, "hash") == 0 ) { + result->type = PHP_VAL_STRING; + result->str_val = strdup((const char *)unicode2UTF8(obj->sHash)); + } else if ( strcmp(prop_name, "size") == 0 ) { + result->type = PHP_VAL_INT; + result->int_val = obj->lFileSize; + } else if ( strcmp(prop_name, "sources") == 0 ) { + result->type = PHP_VAL_INT; + result->int_val = obj->lSourceCount; + } else if ( strcmp(prop_name, "present") == 0 ) { + result->type = PHP_VAL_BOOL; + result->int_val = obj->bPresent; + } else { + php_report_error(PHP_ERROR, "'SearchFile' property [%s] is unknown", prop_name); + } +} + + +#else + +void amule_fake_prop_get(void *obj, char *prop_name, PHP_VALUE_NODE *result) +{ + if ( !strcmp(prop_name, "name") || !strcmp(prop_name, "hash") ) { + result->type = PHP_VAL_STRING; + result->str_val = strdup("some_str"); + } else { + result->type = PHP_VAL_INT; + result->int_val = 10; + } +} + +void amule_download_file_prop_get(void *obj, char *prop_name, PHP_VALUE_NODE *result) +{ + amule_fake_prop_get(obj, prop_name, result); +} + +void amule_upload_file_prop_get(void *obj, char *prop_name, PHP_VALUE_NODE *result) +{ + amule_fake_prop_get(obj, prop_name, result); +} + +void amule_server_prop_get(void *obj, char *prop_name, PHP_VALUE_NODE *result) +{ + amule_fake_prop_get(obj, prop_name, result); +} + +void amule_shared_file_prop_get(void *obj, char *prop_name, PHP_VALUE_NODE *result) +{ + amule_fake_prop_get(obj, prop_name, result); +} + +void amule_search_file_prop_get(void *obj, char *prop_name, PHP_VALUE_NODE *result) +{ + amule_fake_prop_get(obj, prop_name, result); +} + +#endif + +void amule_version(PHP_VALUE_NODE *val) +{ + if ( !val ) { + return; + } + value_value_free(val); + + val->type = PHP_VAL_STRING; + val->str_val = strdup(PACKAGE_VERSION); +} + +void php_native_split(PHP_VALUE_NODE *result) +{ + if ( result ) { + cast_value_array(result); + } else { + return; + } + PHP_VALUE_NODE *pattern, *string_to_split, *split_limit; + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, "__param_0"); + if ( si ) { + pattern = &si->var->value; + cast_value_str(pattern); + } else { + php_report_error(PHP_ERROR, "Invalid or missing argument: pattern"); + return; + } + si = get_scope_item(g_current_scope, "__param_1"); + if ( si ) { + string_to_split = &si->var->value; + cast_value_str(string_to_split); + } else { + php_report_error(PHP_ERROR, "Invalid or missing argument: string"); + return; + } + si = get_scope_item(g_current_scope, "__param_2"); + if ( si ) { + split_limit = &si->var->value; + cast_value_dnum(split_limit); + } else { + php_report_error(PHP_ERROR, "Invalid or missing argument: string"); + return; + } + regex_t preg; + char error_buff[256]; + int reg_result = regcomp(&preg, pattern->str_val, REG_EXTENDED); + if ( reg_result ) { + regerror(reg_result, &preg, error_buff, sizeof(error_buff)); + php_report_error(PHP_ERROR, "Failed in regcomp: %s", error_buff); + return; + } + size_t nmatch = strlen(string_to_split->str_val); + regmatch_t *pmatch = new regmatch_t[nmatch]; + + char *str_2_match = string_to_split->str_val; + char *tmp_buff = new char[strlen(string_to_split->str_val)+1]; + + while ( 1 ) { +// printf("matching: %s\n", str_2_match); + reg_result = regexec(&preg, str_2_match, nmatch, pmatch, 0); + if ( reg_result ) { + // no match + break; + } +// for(int i = 0; pmatch[i].rm_so >= 0; i++) { +// printf("match [%d] %d - %d\n", i, pmatch[i].rm_so, pmatch[i].rm_eo); +// } + + /* + * I will use only first match, since I don't see any sense to have more + * then 1 match in split() call + */ + for(int i = 0; i < pmatch[0].rm_so; i++) { + tmp_buff[i] = str_2_match[i]; + } + tmp_buff[pmatch[0].rm_so] = 0; +// printf("Match added [%s]\n", tmp_buff); + + PHP_VAR_NODE *match_val = array_push_back(result); + match_val->value.type = PHP_VAL_STRING; + match_val->value.str_val = strdup(tmp_buff); + + str_2_match += pmatch[0].rm_eo; + } + + PHP_VAR_NODE *match_val = array_push_back(result); + match_val->value.type = PHP_VAL_STRING; + match_val->value.str_val = strdup(str_2_match); + + delete [] pmatch; + delete [] tmp_buff; + + regfree(&preg); +} + +PHP_BLTIN_FUNC_DEF core_lib_funcs[] = { + { + "var_dump", + 1, + php_native_var_dump, + }, + { + "strlen", + 1, php_native_strlen, + }, + { + "count", + 1, php_native_count, + }, + { + "isset", + 1, php_native_isset, + }, + { + "usort", + 2, + php_native_usort, + }, + { + "split", + 3, + php_native_split, + }, + { + "amule_load_vars", + 1, php_native_load_amule_vars, + }, + { + "amule_get_stats", + 0, php_get_amule_stats, + }, + { + "amule_get_categories", + 0, php_get_amule_categories, + }, + { + "amule_get_options", + 0, php_get_amule_options, + }, + { + "amule_set_options", + 1, php_set_amule_options, + }, + { + "amule_do_server_cmd", + 3, + php_native_server_cmd, + }, + { + "amule_do_add_server_cmd", + 3, + php_native_add_server_cmd, + }, + { + "amule_do_download_cmd", + 3, + php_native_download_file_cmd, + }, + { + "amule_do_shared_cmd", + 3, + php_native_shared_file_cmd, + }, + { + "amule_do_reload_shared_cmd", + 0, php_native_reload_shared_file_cmd, + }, + { + "amule_do_search_download_cmd", + 2, + php_native_search_download_cmd, + }, + { + "amule_do_search_start_cmd", + 7, + php_native_search_start_cmd, + }, + { + "amule_do_ed2k_download_cmd", + 2, + php_native_ed2k_download_cmd, + }, + { + "amule_get_log", + 1, php_get_log, + }, + { + "amule_get_serverinfo", + 1, php_get_serverinfo, + }, + { + "amule_get_version", + 0, amule_version, + }, + { 0, 0, 0, }, +}; + +void php_init_core_lib() +{ + // load function definitions + PHP_BLTIN_FUNC_DEF *curr_def = core_lib_funcs; + while ( curr_def->name ) { + php_add_native_func(curr_def); + curr_def++; + } + // load object definitions + php_add_native_class("AmuleDownloadFile", amule_download_file_prop_get); + php_add_native_class("AmuleUploadFile", amule_upload_file_prop_get); + php_add_native_class("AmuleServer", amule_server_prop_get); + php_add_native_class("AmuleSharedFile", amule_shared_file_prop_get); + php_add_native_class("AmuleSearchFile", amule_search_file_prop_get); +} + +// +// lexer has no include file +// +extern "C" +void php_set_input_buffer(char *buf, int len); + +CPhPLibContext::CPhPLibContext(CWebServerBase *server, const char *file) +{ + g_curr_context = this; +#ifndef PHP_STANDALONE_EN + m_server = server; +#endif + php_engine_init(); + yyin = fopen(file, "r"); + if ( !yyin ) { + return; + } + + yyparse(); + + m_syn_tree_top = g_syn_tree_top; + m_global_scope = g_global_scope; +} + +CPhPLibContext::CPhPLibContext(CWebServerBase *server, char *php_buf, int len) +{ + g_curr_context = this; +#ifndef PHP_STANDALONE_EN + m_server = server; +#endif + php_engine_init(); + + m_global_scope = g_global_scope; + + php_set_input_buffer(php_buf, len); + yyparse(); + + m_syn_tree_top = g_syn_tree_top; +} + +CPhPLibContext::~CPhPLibContext() +{ + SetContext(); + php_engine_free(); +} + +void CPhPLibContext::SetContext() +{ + g_syn_tree_top = m_syn_tree_top; + g_global_scope = m_global_scope; +} + +void CPhPLibContext::Execute(CWriteStrBuffer *buf) +{ + m_curr_str_buffer = buf; + + PHP_VALUE_NODE val; + php_execute(g_syn_tree_top, &val); +} + +CPhPLibContext *CPhPLibContext::g_curr_context = 0; + +/* + * For simplicity and performance sake, this function can + * only handle limited-length printf's. In should be NOT be used + * for string concatenation like printf("xyz %s %s", s1, s2). + * + * Engine will call Print for "print" and "echo" + */ +void CPhPLibContext::Printf(const char *str, ...) +{ + va_list args; + + va_start(args, str); + if ( !g_curr_context || !g_curr_context->m_curr_str_buffer ) { + vprintf(str, args); + } else { + char buf[4096]; + vsnprintf(buf, sizeof(buf), str, args); + g_curr_context->m_curr_str_buffer->Write(buf); + } + va_end(args); +} + +void CPhPLibContext::Print(const char *str) +{ + if ( !g_curr_context || !g_curr_context->m_curr_str_buffer ) { + printf("%s", str); + } else { + g_curr_context->m_curr_str_buffer->Write(str); + } +} + +CPhpFilter::CPhpFilter(CWebServerBase *server, CSession *sess, + const char *file, CWriteStrBuffer *buff) +{ + FILE *f = fopen(file, "r"); + if ( !f ) { + return; + } + if ( fseek(f, 0, SEEK_END) != 0 ) { + return; + } + int size = ftell(f); + char *buf = new char [size+1]; + rewind(f); + fread(buf, 1, size, f); + buf[size] = 0; + fclose(f); + char *scan_ptr = buf; + char *curr_code_end = buf; + while ( strlen(scan_ptr) ) { + scan_ptr = strstr(scan_ptr, "Write(curr_code_end); + break; + } + if ( scan_ptr != curr_code_end ) { + buff->Write(curr_code_end, scan_ptr - curr_code_end); + } + curr_code_end = strstr(scan_ptr, "?>"); + if ( !curr_code_end ) { + break; + } + curr_code_end += 2; // include "?>" in buffer + + int len = curr_code_end - scan_ptr; + + CPhPLibContext *context = new CPhPLibContext(server, scan_ptr, len); + +#ifndef PHP_STANDALONE_EN + load_session_vars("HTTP_GET_VARS", sess->m_get_vars); + load_session_vars("_SESSION", sess->m_vars); +#endif + + context->Execute(buff); + +#ifndef PHP_STANDALONE_EN + save_session_vars(sess->m_vars); +#endif + + delete context; + + scan_ptr = curr_code_end; + } + +#ifndef PHP_STANDALONE_EN + sess->m_get_vars.clear(); +#endif + + delete [] buf; +} + +/* + * String buffer: almost same as regular 'string' class, but, + * without reallocation when full. Instead, new buffer is + * allocated, and added to list + */ +CWriteStrBuffer::CWriteStrBuffer() +{ + m_alloc_size = 1024; + m_total_length = 0; + + AllocBuf(); +} + +CWriteStrBuffer::~CWriteStrBuffer() +{ + for(std::list::iterator i = m_buf_list.begin(); i != m_buf_list.end(); i++) { + delete [] *i; + } + delete [] m_curr_buf; +} + +void CWriteStrBuffer::AllocBuf() +{ + m_curr_buf = new char [m_alloc_size]; + m_buf_ptr = m_curr_buf; + m_curr_buf_left = m_alloc_size; +} + +void CWriteStrBuffer::Write(const char *s, int len) +{ + if ( len == -1 ) { + len = strlen(s); + } + m_total_length += len; + + while ( len ) { + if ( (len + 1) <= m_curr_buf_left ) { + strncpy(m_buf_ptr, s, len); + m_buf_ptr += len; + m_curr_buf_left -= len; + len = 0; + } else { + memcpy(m_buf_ptr, s, m_curr_buf_left); + int rem_len = len - m_curr_buf_left; + s += m_curr_buf_left; + + len = rem_len; + m_buf_list.push_back(m_curr_buf); + AllocBuf(); + } + } +} + +void CWriteStrBuffer::CopyAll(char *dst_buffer) +{ + char *curr_ptr = dst_buffer; + int rem_size = m_total_length; + for(std::list::iterator i = m_buf_list.begin(); i != m_buf_list.end(); i++) { + memcpy(curr_ptr, *i, m_alloc_size); + rem_size -= m_alloc_size; + curr_ptr += m_alloc_size; + } + if ( rem_size ) { + memcpy(curr_ptr, m_curr_buf, rem_size); + } + *(curr_ptr + rem_size) = 0; +} + +void load_session_vars(char *target, std::map &varmap) +{ + PHP_EXP_NODE *sess_vars_exp_node = get_var_node(target); + PHP_VAR_NODE *sess_vars = sess_vars_exp_node->var_si_node->var; + // i'm not building exp tree, node not needed + delete sess_vars_exp_node; + cast_value_array(&sess_vars->value); + for(std::map::iterator i = varmap.begin(); i != varmap.end(); i++) { + PHP_VAR_NODE *curr_var = array_get_by_str_key(&sess_vars->value, i->first); + PHP_VALUE_NODE val; + val.type = PHP_VAL_STRING; + val.str_val = const_cast(i->second.c_str()); + value_value_assign(&curr_var->value, &val); + } +} + +void save_session_vars(std::map &varmap) +{ + PHP_EXP_NODE *sess_vars_exp_node = get_var_node("_SESSION"); + PHP_VAR_NODE *sess_vars = sess_vars_exp_node->var_si_node->var; + + delete sess_vars_exp_node; + if ( sess_vars->value.type != PHP_VAL_ARRAY ) { + return; + } + + for(int i = 0; i < array_get_size(&sess_vars->value); i++) { + std::string s = array_get_ith_key(&sess_vars->value, i); + PHP_VAR_NODE *var = array_get_by_str_key(&sess_vars->value, s); + cast_value_str(&var->value); + varmap[s] = var->value.str_val; + } +} +// File_checked_for_headers diff --git a/src/webserver/src/php_core_lib.h b/src/webserver/src/php_core_lib.h new file mode 100644 index 00000000..2d19f973 --- /dev/null +++ b/src/webserver/src/php_core_lib.h @@ -0,0 +1,101 @@ +// +// This file is part of the aMule Project. + +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (C) 2005-2008 Froenchenko Leonid ( lfroen@amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// +#ifndef _PHP_CORE_LIB_H_ +#define _PHP_CORE_LIB_H_ + +/* + * This is interface to CPP parts of amuleweb + */ +#ifdef __cplusplus + + +class CWriteStrBuffer { + std::list m_buf_list; + int m_total_length; + int m_alloc_size; + char *m_curr_buf; + char *m_buf_ptr; + int m_curr_buf_left; + + void AllocBuf(); + public: + CWriteStrBuffer(); + ~CWriteStrBuffer(); + + void Write(const char *s, int len = -1); + void CopyAll(char *dst_buffer); + const int Length() { return m_total_length; } +}; + +class CWebServerBase; +class CSession; + +class CPhPLibContext { + PHP_SYN_NODE *m_syn_tree_top; + PHP_SCOPE_TABLE m_global_scope; + + CWriteStrBuffer *m_curr_str_buffer; +#ifndef PHP_STANDALONE_EN + CWebServerBase *m_server; +#endif + public: + // parse file and take a "snapshot" of global vars + CPhPLibContext(CWebServerBase *server, const char *file); + CPhPLibContext(CWebServerBase *server, char *php_buf, int len); + ~CPhPLibContext(); + + // init global vars, so parser/execution can start + void SetContext(); + void Execute(CWriteStrBuffer *); + +#if defined(__GNUC__) + static void Printf(const char *str, ...) __attribute__ ((__format__ (__printf__, 1, 2))); +#else + static void Printf(const char *str, ...); +#endif + static void Print(const char *str); + + static CPhPLibContext *g_curr_context; + +#ifndef PHP_STANDALONE_EN + CWebServerBase *WebServer() { return m_server; } +#endif +}; + +class CPhpFilter { + public: + CPhpFilter(CWebServerBase *server, CSession *sess, + const char *file, CWriteStrBuffer *buff); +}; + +#endif // __cplusplus + +void php_init_core_lib(); + +void load_session_vars(char *target, std::map &varmap); +void save_session_vars(std::map &varmap); + +#endif //_PHP_CORE_LIB_H_ +// File_checked_for_headers diff --git a/src/webserver/src/php_lexer.c b/src/webserver/src/php_lexer.c new file mode 100644 index 00000000..fc378cbd --- /dev/null +++ b/src/webserver/src/php_lexer.c @@ -0,0 +1,2255 @@ +#line 2 "php_lexer.c" +/* A lexical scanner generated by flex*/ + +/* Scanner skeleton version: + * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#include +#include + + +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif +#endif + + +#ifdef __cplusplus + +#include + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include +#include +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE 16384 + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ + +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yytext_ptr ) + +/* Some routines like yy_flex_realloc() are emitted as static but are + not called by all lexers. This generates warnings in some compilers, + notably GCC. Arrange to suppress these. */ +#ifdef __GNUC__ +#define YY_MAY_BE_UNUSED __attribute__((unused)) +#else +#define YY_MAY_BE_UNUSED +#endif + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ +typedef unsigned int yy_size_t; + + +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + }; + +static YY_BUFFER_STATE yy_current_buffer = 0; + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ +#define YY_CURRENT_BUFFER yy_current_buffer + + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; + +static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart YY_PROTO(( FILE *input_file )); + +void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); +void yy_load_buffer_state YY_PROTO(( void )); +YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); +void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); +void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )) YY_MAY_BE_UNUSED; +static void yy_flex_free YY_PROTO(( void * )); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + + +#define YY_USES_REJECT +typedef unsigned char YY_CHAR; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +typedef int yy_state_type; +extern int yylineno; +int yylineno = 1; +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state YY_PROTO(( void )); +static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); +static int yy_get_next_buffer YY_PROTO(( void )); +static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yytext_ptr -= yy_more_len; \ + yyleng = (int) (yy_cp - yytext_ptr); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 79 +#define YY_END_OF_BUFFER 80 +static yyconst short int yy_acclist[317] = + { 0, + 59, 59, 80, 78, 79, 77, 78, 79, 77, 79, + 78, 79, 78, 79, 65, 78, 79, 78, 79, 78, + 79, 78, 79, 78, 79, 78, 79, 78, 79, 78, + 79, 78, 79, 78, 79, 78, 79, 73, 78, 79, + 73, 78, 79, 78, 79, 78, 79, 78, 79, 78, + 79, 71, 78, 79, 78, 79, 71, 78, 79, 71, + 78, 79, 71, 78, 79, 71, 78, 79, 71, 78, + 79, 71, 78, 79, 71, 78, 79, 71, 78, 79, + 71, 78, 79, 71, 78, 79, 71, 78, 79, 71, + 78, 79, 71, 78, 79, 71, 78, 79, 71, 78, + + 79, 71, 78, 79, 78, 79, 79, 79, 66, 79, + 67, 79, 67, 79, 59, 79, 79, 53, 75, 70, + 44, 38, 45, 76, 41, 31, 39, 32, 40, 28, + 74, 43, 68, 65, 42, 74, 73, 54, 52, 33, + 55, 2, 71, 47, 71, 71, 17, 71, 71, 71, + 71, 71, 71, 13, 71, 71, 71, 71, 71, 71, + 71, 71, 7, 71, 71, 71, 71, 34, 71, 71, + 71, 71, 71, 71, 71, 46, 37, 69, 66, 67, + 59, 70, 74, 72, 48, 50, 49, 36, 71, 71, + 71, 71, 71, 71, 3, 71, 71, 71, 71, 71, + + 14, 71, 71, 71, 71, 71, 27, 71, 71, 71, + 71, 71, 71, 35, 71, 60, 51, 71, 71, 21, + 71, 71, 71, 71, 25, 71, 8, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 29, 71, 71, 71, + 71, 71, 71, 61, 1, 30, 71, 23, 71, 5, + 71, 71, 71, 71, 71, 10, 71, 71, 71, 71, + 71, 71, 71, 26, 71, 71, 71, 71, 11, 71, + 64, 62, 71, 71, 9, 71, 15, 71, 71, 71, + 71, 71, 56, 71, 71, 6, 71, 57, 71, 19, + 71, 71, 22, 71, 71, 71, 71, 16, 71, 71, + + 58, 71, 63, 24, 71, 71, 71, 12, 71, 4, + 71, 71, 20, 71, 18, 71 + } ; + +static yyconst short int yy_accept[277] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, + 6, 9, 11, 13, 15, 18, 20, 22, 24, 26, + 28, 30, 32, 34, 36, 38, 41, 44, 46, 48, + 50, 52, 55, 57, 60, 63, 66, 69, 72, 75, + 78, 81, 84, 87, 90, 93, 96, 99, 102, 105, + 107, 108, 109, 111, 113, 115, 117, 118, 119, 119, + 120, 120, 121, 122, 123, 124, 124, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 138, + 138, 139, 139, 140, 141, 142, 142, 143, 144, 145, + + 146, 147, 149, 150, 151, 152, 153, 154, 156, 157, + 158, 159, 160, 161, 162, 163, 165, 166, 167, 168, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 182, 182, 183, 183, 183, 183, 183, + 183, 183, 184, 185, 186, 186, 187, 188, 190, 191, + 192, 193, 194, 195, 197, 198, 199, 200, 201, 203, + 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, + 216, 217, 217, 218, 218, 218, 218, 218, 218, 218, + 218, 219, 220, 222, 223, 224, 225, 227, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 239, 240, 241, + + 242, 243, 244, 244, 244, 244, 244, 245, 245, 245, + 245, 246, 248, 250, 252, 253, 254, 255, 256, 258, + 259, 260, 261, 262, 263, 264, 266, 267, 268, 269, + 271, 271, 272, 272, 272, 272, 272, 273, 273, 274, + 275, 277, 279, 280, 281, 282, 283, 285, 286, 288, + 290, 292, 292, 292, 292, 293, 295, 296, 297, 298, + 300, 301, 303, 303, 303, 303, 304, 306, 307, 308, + 310, 312, 313, 315, 317, 317 + } ; + +static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 4, 4, 5, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 1, 17, 18, 19, 20, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 1, 1, 22, + 23, 24, 25, 1, 26, 26, 26, 26, 26, 26, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 1, 28, 1, 29, 27, 1, 30, 31, 32, 33, + + 34, 35, 36, 37, 38, 27, 39, 40, 27, 41, + 42, 43, 27, 44, 45, 46, 47, 27, 48, 49, + 50, 27, 1, 51, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst int yy_meta[52] = + { 0, + 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, + 1, 3, 1, 1, 1, 1, 1, 3, 1, 4, + 4, 1, 1, 1, 1, 5, 6, 1, 1, 5, + 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 1 + } ; + +static yyconst short int yy_base[287] = + { 0, + 0, 0, 343, 342, 49, 50, 54, 55, 356, 359, + 359, 359, 332, 51, 359, 0, 331, 48, 48, 59, + 330, 46, 51, 57, 66, 52, 66, 73, 40, 59, + 328, 0, 328, 61, 306, 58, 73, 76, 67, 309, + 58, 310, 313, 302, 301, 310, 64, 306, 300, 68, + 359, 322, 0, 359, 337, 337, 0, 315, 106, 359, + 334, 0, 359, 359, 359, 108, 359, 333, 116, 293, + 292, 293, 291, 297, 284, 359, 359, 359, 359, 359, + 359, 101, 359, 359, 359, 359, 103, 108, 0, 306, + 359, 285, 304, 359, 359, 303, 359, 0, 359, 292, + + 280, 0, 289, 277, 280, 285, 285, 0, 281, 272, + 283, 277, 270, 272, 270, 0, 279, 265, 261, 0, + 270, 261, 276, 267, 266, 259, 359, 359, 359, 0, + 359, 300, 289, 277, 0, 257, 251, 255, 250, 265, + 250, 110, 0, 359, 256, 359, 359, 0, 262, 261, + 256, 87, 259, 0, 246, 253, 100, 240, 251, 252, + 252, 242, 235, 0, 239, 232, 232, 231, 236, 0, + 359, 263, 359, 234, 242, 242, 125, 231, 232, 226, + 218, 228, 0, 220, 227, 217, 0, 225, 220, 226, + 212, 222, 228, 211, 226, 208, 0, 208, 209, 214, + + 219, 216, 138, 209, 202, 139, 359, 211, 141, 205, + 359, 0, 0, 0, 204, 204, 208, 198, 0, 203, + 202, 207, 200, 197, 203, 0, 194, 202, 196, 0, + 142, 359, 202, 197, 196, 144, 359, 193, 181, 181, + 0, 192, 179, 184, 186, 165, 0, 140, 0, 0, + 0, 132, 127, 148, 136, 0, 138, 135, 132, 0, + 124, 0, 155, 161, 162, 359, 0, 110, 100, 0, + 0, 28, 0, 0, 359, 176, 182, 188, 190, 196, + 199, 205, 207, 210, 213, 216 + } ; + +static yyconst short int yy_def[287] = + { 0, + 275, 1, 276, 276, 277, 277, 276, 276, 275, 275, + 275, 275, 275, 278, 275, 279, 275, 275, 280, 275, + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, + 275, 281, 275, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 275, + 275, 275, 282, 275, 275, 275, 283, 275, 278, 275, + 278, 284, 275, 275, 275, 280, 275, 280, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, 285, 275, + 275, 275, 275, 275, 275, 275, 275, 281, 275, 281, + + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 275, 275, 275, 282, + 275, 275, 286, 275, 284, 275, 275, 275, 275, 275, + 275, 275, 285, 275, 275, 275, 275, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 275, 286, 275, 275, 275, 275, 275, 275, 275, 275, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + + 281, 281, 275, 275, 275, 275, 275, 275, 275, 275, + 275, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 275, 275, 275, 275, 275, 275, 275, 275, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 275, 275, 275, 281, 281, 281, 281, 281, 281, + 281, 281, 275, 275, 275, 275, 281, 281, 281, 281, + 281, 281, 281, 281, 0, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275 + } ; + +static yyconst short int yy_nxt[411] = + { 0, + 10, 11, 12, 11, 11, 13, 14, 15, 16, 17, + 18, 19, 20, 10, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 32, 10, 33, 34, + 35, 36, 37, 38, 39, 40, 32, 41, 32, 42, + 43, 44, 45, 46, 47, 32, 32, 48, 49, 32, + 50, 54, 54, 55, 55, 56, 56, 60, 64, 67, + 69, 77, 93, 94, 274, 57, 57, 79, 78, 87, + 65, 88, 88, 80, 81, 68, 82, 82, 61, 83, + 84, 95, 96, 87, 85, 88, 88, 104, 86, 70, + 127, 71, 116, 72, 90, 91, 73, 92, 117, 105, + + 89, 100, 74, 75, 101, 102, 106, 109, 113, 123, + 107, 124, 60, 114, 108, 110, 111, 69, 128, 67, + 82, 82, 142, 142, 112, 87, 206, 88, 88, 142, + 142, 184, 185, 61, 189, 68, 273, 190, 207, 231, + 206, 272, 236, 231, 191, 236, 70, 192, 71, 265, + 72, 232, 207, 73, 237, 232, 231, 237, 208, 74, + 75, 266, 206, 265, 271, 270, 269, 268, 232, 267, + 264, 233, 263, 262, 207, 266, 51, 51, 51, 51, + 51, 51, 53, 53, 53, 53, 53, 53, 59, 59, + 59, 59, 59, 59, 62, 62, 66, 66, 66, 66, + + 66, 66, 98, 98, 98, 130, 261, 130, 130, 130, + 130, 133, 133, 135, 135, 135, 143, 143, 172, 172, + 172, 172, 260, 259, 258, 257, 256, 255, 254, 253, + 209, 252, 251, 250, 249, 248, 247, 246, 245, 244, + 243, 242, 241, 240, 239, 238, 235, 209, 234, 230, + 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, + 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, + 209, 205, 204, 203, 171, 202, 201, 200, 199, 198, + 197, 196, 195, 194, 193, 154, 188, 187, 186, 183, + 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, + + 171, 132, 170, 169, 168, 167, 166, 165, 164, 163, + 162, 161, 160, 159, 158, 157, 156, 155, 154, 153, + 152, 151, 150, 149, 148, 147, 146, 145, 144, 141, + 140, 139, 138, 137, 136, 275, 275, 134, 132, 131, + 129, 126, 125, 122, 121, 120, 119, 118, 115, 103, + 99, 97, 76, 63, 58, 275, 52, 52, 9, 275, + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, + + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275 + } ; + +static yyconst short int yy_chk[411] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 5, 6, 5, 6, 7, 8, 14, 18, 19, + 20, 22, 29, 29, 272, 7, 8, 23, 22, 26, + 18, 26, 26, 23, 23, 19, 24, 24, 14, 24, + 25, 30, 30, 27, 25, 27, 27, 36, 25, 20, + 50, 20, 41, 20, 28, 28, 20, 28, 41, 36, + + 26, 34, 20, 20, 34, 34, 37, 38, 39, 47, + 37, 47, 59, 39, 37, 38, 38, 69, 50, 66, + 82, 82, 87, 87, 38, 88, 177, 88, 88, 142, + 142, 152, 152, 59, 157, 66, 269, 157, 177, 203, + 206, 268, 209, 231, 157, 236, 69, 157, 69, 254, + 69, 203, 206, 69, 209, 231, 263, 236, 177, 69, + 69, 254, 264, 265, 261, 259, 258, 257, 263, 255, + 253, 203, 252, 248, 264, 265, 276, 276, 276, 276, + 276, 276, 277, 277, 277, 277, 277, 277, 278, 278, + 278, 278, 278, 278, 279, 279, 280, 280, 280, 280, + + 280, 280, 281, 281, 281, 282, 246, 282, 282, 282, + 282, 283, 283, 284, 284, 284, 285, 285, 286, 286, + 286, 286, 245, 244, 243, 242, 240, 239, 238, 235, + 234, 233, 229, 228, 227, 225, 224, 223, 222, 221, + 220, 218, 217, 216, 215, 210, 208, 205, 204, 202, + 201, 200, 199, 198, 196, 195, 194, 193, 192, 191, + 190, 189, 188, 186, 185, 184, 182, 181, 180, 179, + 178, 176, 175, 174, 172, 169, 168, 167, 166, 165, + 163, 162, 161, 160, 159, 158, 156, 155, 153, 151, + 150, 149, 145, 141, 140, 139, 138, 137, 136, 134, + + 133, 132, 126, 125, 124, 123, 122, 121, 119, 118, + 117, 115, 114, 113, 112, 111, 110, 109, 107, 106, + 105, 104, 103, 101, 100, 96, 93, 92, 90, 75, + 74, 73, 72, 71, 70, 68, 61, 58, 56, 55, + 52, 49, 48, 46, 45, 44, 43, 42, 40, 35, + 33, 31, 21, 17, 13, 9, 4, 3, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, + + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275 + } ; + +static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; +static char *yy_full_match; +static int yy_lp; +#define REJECT \ +{ \ +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \ +yy_cp = yy_full_match; /* restore poss. backed-over text */ \ +++yy_lp; \ +goto find_rule; \ +} +static int yy_more_flag = 0; +static int yy_more_len = 0; +#define yymore() (yy_more_flag = 1) +#define YY_MORE_ADJ yy_more_len +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "php_lexer.l" +#define INITIAL 0 +#line 2 "php_lexer.l" +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2006 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (C) 2005-2006 Froenchenko Leonid ( lfroen@amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include + +#include "php_syntree.h" +#include "php_parser.h" + +void php_set_input_buffer(char *buf, int len) +{ + yy_delete_buffer(YY_CURRENT_BUFFER); + yy_scan_bytes(buf, len); +} + +int yywrap(); + + +#define MAX_INCLUDE_DEPTH 10 +YY_BUFFER_STATE php_include_stack[MAX_INCLUDE_DEPTH]; +int php_include_stack_ptr = 0; + +int yywrap() +{ + if ( --php_include_stack_ptr < 0 ) { + return 1; + } else { + yy_delete_buffer( YY_CURRENT_BUFFER ); + yy_switch_to_buffer(php_include_stack[php_include_stack_ptr] ); + } + return 0; +} + +#define BLOCK_COMMENT 1 + +#define LINE_COMMENT 2 + +#define INCLUDE 3 + +#define YY_STACK_USED 1 +#line 666 "php_lexer.c" + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap YY_PROTO(( void )); +#else +extern int yywrap YY_PROTO(( void )); +#endif +#endif + +#ifndef YY_NO_UNPUT +static void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YY_PROTO(( yyconst char * )); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput YY_PROTO(( void )); +#else +static int input YY_PROTO(( void )); +#endif +#endif + +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ + +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL int yylex YY_PROTO(( void )) +#endif + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp = NULL, *yy_bp = NULL; + register int yy_act; + +#line 73 "php_lexer.l" + + +#line 820 "php_lexer.c" + + if ( yy_init ) + { + yy_init = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_more_len = 0; + if ( yy_more_flag ) + { + yy_more_len = yy_c_buf_p - yytext_ptr; + yy_more_flag = 0; + } + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 276 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 359 ); + +yy_find_action: + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; +find_rule: /* we branch to this label when backing up */ + for ( ; ; ) /* until we find what rule we matched */ + { + if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] ) + { + yy_act = yy_acclist[yy_lp]; + { + yy_full_match = yy_cp; + break; + } + } + --yy_cp; + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + if ( yy_act != YY_END_OF_BUFFER ) + { + int yyl; + for ( yyl = 0; yyl < yyleng; ++yyl ) + if ( yytext[yyl] == '\n' ) + ++yylineno; + } + +do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ +case 1: +YY_RULE_SETUP +#line 75 "php_lexer.l" +return START_SCRIPT; + YY_BREAK +case 2: +YY_RULE_SETUP +#line 76 "php_lexer.l" +return END_SCRIPT; + YY_BREAK +case 3: +YY_RULE_SETUP +#line 78 "php_lexer.l" +return EXIT; + YY_BREAK +case 4: +YY_RULE_SETUP +#line 80 "php_lexer.l" +return FUNCTION; + YY_BREAK +case 5: +YY_RULE_SETUP +#line 82 "php_lexer.l" +return CONST; + YY_BREAK +case 6: +YY_RULE_SETUP +#line 84 "php_lexer.l" +return RETURN; + YY_BREAK +case 7: +YY_RULE_SETUP +#line 86 "php_lexer.l" +return IF; + YY_BREAK +case 8: +YY_RULE_SETUP +#line 87 "php_lexer.l" +return ELSE; + YY_BREAK +case 9: +YY_RULE_SETUP +#line 88 "php_lexer.l" +return ELSEIF; + YY_BREAK +case 10: +YY_RULE_SETUP +#line 89 "php_lexer.l" +return ENDIF; + YY_BREAK +case 11: +YY_RULE_SETUP +#line 91 "php_lexer.l" +return WHILE; + YY_BREAK +case 12: +YY_RULE_SETUP +#line 92 "php_lexer.l" +return ENDWHILE; + YY_BREAK +case 13: +YY_RULE_SETUP +#line 93 "php_lexer.l" +return DO; + YY_BREAK +case 14: +YY_RULE_SETUP +#line 95 "php_lexer.l" +return FOR; + YY_BREAK +case 15: +YY_RULE_SETUP +#line 96 "php_lexer.l" +return ENDFOR; + YY_BREAK +case 16: +YY_RULE_SETUP +#line 97 "php_lexer.l" +return FOREACH; + YY_BREAK +case 17: +YY_RULE_SETUP +#line 98 "php_lexer.l" +return AS; + YY_BREAK +case 18: +YY_RULE_SETUP +#line 99 "php_lexer.l" +return ENDFOREACH; + YY_BREAK +case 19: +YY_RULE_SETUP +#line 101 "php_lexer.l" +return SWITCH; + YY_BREAK +case 20: +YY_RULE_SETUP +#line 102 "php_lexer.l" +return ENDSWITCH; + YY_BREAK +case 21: +YY_RULE_SETUP +#line 103 "php_lexer.l" +return CASE; + YY_BREAK +case 22: +YY_RULE_SETUP +#line 104 "php_lexer.l" +return DEFAULT; + YY_BREAK +case 23: +YY_RULE_SETUP +#line 105 "php_lexer.l" +return BREAK; + YY_BREAK +case 24: +YY_RULE_SETUP +#line 107 "php_lexer.l" +return CONTINUE; + YY_BREAK +case 25: +YY_RULE_SETUP +#line 109 "php_lexer.l" +return ECHO; + YY_BREAK +case 26: +YY_RULE_SETUP +#line 110 "php_lexer.l" +return PRINT; + YY_BREAK +case 27: +YY_RULE_SETUP +#line 112 "php_lexer.l" +return NEW; + YY_BREAK +case 28: +YY_RULE_SETUP +#line 114 "php_lexer.l" +return OBJECT_OPERATOR; + YY_BREAK +case 29: +YY_RULE_SETUP +#line 116 "php_lexer.l" +return LIST; + YY_BREAK +case 30: +YY_RULE_SETUP +#line 117 "php_lexer.l" +return ARRAY; + YY_BREAK +case 31: +YY_RULE_SETUP +#line 119 "php_lexer.l" +return INC; + YY_BREAK +case 32: +YY_RULE_SETUP +#line 120 "php_lexer.l" +return DEC; + YY_BREAK +case 33: +YY_RULE_SETUP +#line 121 "php_lexer.l" +return HASH_ASSIGN; + YY_BREAK +case 34: +YY_RULE_SETUP +#line 123 "php_lexer.l" +return LOG_OR; + YY_BREAK +case 35: +YY_RULE_SETUP +#line 124 "php_lexer.l" +return LOG_XOR; + YY_BREAK +case 36: +YY_RULE_SETUP +#line 125 "php_lexer.l" +return LOG_AND; + YY_BREAK +case 37: +YY_RULE_SETUP +#line 126 "php_lexer.l" +return BOOLEAN_OR; + YY_BREAK +case 38: +YY_RULE_SETUP +#line 127 "php_lexer.l" +return BOOLEAN_AND; + YY_BREAK +case 39: +YY_RULE_SETUP +#line 129 "php_lexer.l" +return PLUS_EQ; + YY_BREAK +case 40: +YY_RULE_SETUP +#line 130 "php_lexer.l" +return MINUS_EQ; + YY_BREAK +case 41: +YY_RULE_SETUP +#line 131 "php_lexer.l" +return MUL_EQ; + YY_BREAK +case 42: +YY_RULE_SETUP +#line 132 "php_lexer.l" +return DIV_EQ; + YY_BREAK +case 43: +YY_RULE_SETUP +#line 133 "php_lexer.l" +return CONCAT_EQ; + YY_BREAK +case 44: +YY_RULE_SETUP +#line 134 "php_lexer.l" +return MOD_EQ; + YY_BREAK +case 45: +YY_RULE_SETUP +#line 135 "php_lexer.l" +return AND_EQ; + YY_BREAK +case 46: +YY_RULE_SETUP +#line 136 "php_lexer.l" +return OR_EQ; + YY_BREAK +case 47: +YY_RULE_SETUP +#line 137 "php_lexer.l" +return XOR_EQ; + YY_BREAK +case 48: +YY_RULE_SETUP +#line 138 "php_lexer.l" +return SL_EQ; + YY_BREAK +case 49: +YY_RULE_SETUP +#line 139 "php_lexer.l" +return SR_EQ; + YY_BREAK +case 50: +YY_RULE_SETUP +#line 141 "php_lexer.l" +return IS_IDENTICAL; + YY_BREAK +case 51: +YY_RULE_SETUP +#line 142 "php_lexer.l" +return IS_NOIDENTICAL; + YY_BREAK +case 52: +YY_RULE_SETUP +#line 143 "php_lexer.l" +return IS_EQ; + YY_BREAK +case 53: +YY_RULE_SETUP +#line 144 "php_lexer.l" +return IS_NOEQUAL; + YY_BREAK +case 54: +YY_RULE_SETUP +#line 145 "php_lexer.l" +return IS_SMALLER_OR_EQ; + YY_BREAK +case 55: +YY_RULE_SETUP +#line 146 "php_lexer.l" +return IS_GREATER_OR_EQ; + YY_BREAK +case 56: +YY_RULE_SETUP +#line 148 "php_lexer.l" +return GLOBAL; + YY_BREAK +case 57: +YY_RULE_SETUP +#line 149 "php_lexer.l" +return STATIC; + YY_BREAK +case 58: +YY_RULE_SETUP +#line 151 "php_lexer.l" +BEGIN(INCLUDE); + YY_BREAK +case 59: +YY_RULE_SETUP +#line 152 "php_lexer.l" + + YY_BREAK +case 60: +YY_RULE_SETUP +#line 153 "php_lexer.l" +{ + yytext[strlen(yytext)-1] = 0; + if ( php_include_stack_ptr >= MAX_INCLUDE_DEPTH ) { + fprintf( stderr, "WARNING: maximum include depth (which is %d) exceed", MAX_INCLUDE_DEPTH); + } else { + php_include_stack[php_include_stack_ptr++] = YY_CURRENT_BUFFER; + yyin = fopen(yytext+1, "r"); + if ( !yyin ) { + printf("WARNING: include file [%s] can not be opened\n", yytext+1); + } else { + yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE )); + } + } + BEGIN(INITIAL); +} + YY_BREAK +case 61: +YY_RULE_SETUP +#line 169 "php_lexer.l" +{ + return INT_CAST; +} + YY_BREAK +case 62: +YY_RULE_SETUP +#line 173 "php_lexer.l" +{ + return DOUBLE_CAST; +} + YY_BREAK +case 63: +YY_RULE_SETUP +#line 177 "php_lexer.l" +{ + return STRING_CAST; +} + YY_BREAK +case 64: +YY_RULE_SETUP +#line 181 "php_lexer.l" +{ + return BOOL_CAST; +} + YY_BREAK +case 65: +YY_RULE_SETUP +#line 185 "php_lexer.l" +{ + BEGIN(LINE_COMMENT); + yymore(); + } + YY_BREAK +case 66: +YY_RULE_SETUP +#line 190 "php_lexer.l" +{ + yymore(); + } + YY_BREAK +case 67: +YY_RULE_SETUP +#line 194 "php_lexer.l" +{ + BEGIN(INITIAL); + } + YY_BREAK +case 68: +YY_RULE_SETUP +#line 198 "php_lexer.l" +{ + BEGIN(BLOCK_COMMENT); + yymore(); + } + YY_BREAK +case 69: +YY_RULE_SETUP +#line 203 "php_lexer.l" +{ + BEGIN(INITIAL); + } + YY_BREAK +case 70: +YY_RULE_SETUP +#line 207 "php_lexer.l" +{ + yylval.exp_node = get_var_node(yytext+1); + return VARIABLE; + } + YY_BREAK +case 71: +YY_RULE_SETUP +#line 212 "php_lexer.l" +{ + strcpy(yylval.str_val, yytext); + return IDENT; + } + YY_BREAK +case 72: +YY_RULE_SETUP +#line 217 "php_lexer.l" +{ + int val; + sscanf(yytext, "0x%x", &val); + yylval.exp_node = make_const_exp_dnum(val); + return DNUMBER; + } + YY_BREAK +case 73: +YY_RULE_SETUP +#line 224 "php_lexer.l" +{ + yylval.exp_node = make_const_exp_dnum(atoi(yytext)); + return DNUMBER; + } + YY_BREAK +case 74: +YY_RULE_SETUP +#line 229 "php_lexer.l" +{ + yylval.exp_node = make_const_exp_fnum(atof(yytext)); + return FNUMBER; + } + YY_BREAK +case 75: +YY_RULE_SETUP +#line 234 "php_lexer.l" +{ + yytext[strlen(yytext)-1] = 0; + yylval.exp_node = make_const_exp_str(yytext+1, 1); + return STRING; +} + YY_BREAK +case 76: +YY_RULE_SETUP +#line 240 "php_lexer.l" +{ + yytext[strlen(yytext)-1] = 0; + yylval.exp_node = make_const_exp_str(yytext+1, 0); + return STRING; +} + YY_BREAK +case 77: +YY_RULE_SETUP +#line 246 "php_lexer.l" +{ } + YY_BREAK +case 78: +YY_RULE_SETUP +#line 248 "php_lexer.l" +{ + return yytext[0]; +} + YY_BREAK +case 79: +YY_RULE_SETUP +#line 251 "php_lexer.l" +ECHO; + YY_BREAK +#line 1373 "php_lexer.c" + case YY_STATE_EOF(INITIAL): + case YY_STATE_EOF(BLOCK_COMMENT): + case YY_STATE_EOF(LINE_COMMENT): + case YY_STATE_EOF(INCLUDE): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; +#endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 276 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + } + + return yy_current_state; + } + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +#ifdef YY_USE_PROTOS +static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { + register int yy_is_jam; + + register YY_CHAR yy_c = 1; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 276 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 275); + if ( ! yy_is_jam ) + *yy_state_ptr++ = yy_current_state; + + return yy_is_jam ? 0 : yy_current_state; + } + + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static void yyunput( int c, register char *yy_bp ) +#else +static void yyunput( c, yy_bp ) +int c; +register char *yy_bp; +#endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + if ( c == '\n' ) + --yylineno; + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + if ( c == '\n' ) + ++yylineno; + + return c; + } +#endif /* YY_NO_INPUT */ + +#ifdef YY_USE_PROTOS +void yyrestart( FILE *input_file ) +#else +void yyrestart( input_file ) +FILE *input_file; +#endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + +#ifdef YY_USE_PROTOS +void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +#else +void yy_switch_to_buffer( new_buffer ) +YY_BUFFER_STATE new_buffer; +#endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + +#ifdef YY_USE_PROTOS +void yy_load_buffer_state( void ) +#else +void yy_load_buffer_state() +#endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) +#else +YY_BUFFER_STATE yy_create_buffer( file, size ) +FILE *file; +int size; +#endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + +#ifdef YY_USE_PROTOS +void yy_delete_buffer( YY_BUFFER_STATE b ) +#else +void yy_delete_buffer( b ) +YY_BUFFER_STATE b; +#endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + + +#ifdef YY_USE_PROTOS +void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) +#else +void yy_init_buffer( b, file ) +YY_BUFFER_STATE b; +FILE *file; +#endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } + + +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } +#endif + + +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) +#else +YY_BUFFER_STATE yy_scan_string( yy_str ) +yyconst char *yy_str; +#endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + +/* Internal utility routines. */ + +#ifndef yytext_ptr +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } +#endif + +#ifdef YY_NEED_STRLEN +#ifdef YY_USE_PROTOS +static int yy_flex_strlen( yyconst char *s ) +#else +static int yy_flex_strlen( s ) +yyconst char *s; +#endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } +#endif + + +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; +#endif + { + return (void *) malloc( size ); + } + +#ifdef YY_USE_PROTOS +static void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } + +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif +#line 251 "php_lexer.l" diff --git a/src/webserver/src/php_lexer.l b/src/webserver/src/php_lexer.l new file mode 100644 index 00000000..47083ee2 --- /dev/null +++ b/src/webserver/src/php_lexer.l @@ -0,0 +1,250 @@ +%{ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2006 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (C) 2005-2006 Froenchenko Leonid ( lfroen@amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include + +#include "php_syntree.h" +#include "php_parser.h" + +void php_set_input_buffer(char *buf, int len) +{ + yy_delete_buffer(YY_CURRENT_BUFFER); + yy_scan_bytes(buf, len); +} + +int yywrap(); + + +#define MAX_INCLUDE_DEPTH 10 +YY_BUFFER_STATE php_include_stack[MAX_INCLUDE_DEPTH]; +int php_include_stack_ptr = 0; + +int yywrap() +{ + if ( --php_include_stack_ptr < 0 ) { + return 1; + } else { + yy_delete_buffer( YY_CURRENT_BUFFER ); + yy_switch_to_buffer(php_include_stack[php_include_stack_ptr] ); + } + return 0; +} + +%} + +%x BLOCK_COMMENT +%x LINE_COMMENT +%x INCLUDE + +%option stack +%option yylineno + +DEC_NUM [0-9]+ +FLOANUM ([0-9]*[\.][0-9]+)|([0-9]+[\.][0-9]*) +HEX_NUM "0x"[0-9a-fA-F]+ + +IDENT [a-zA-Z_][a-zA-Z0-9_]* + +EOL ("\r"|"\n"|"\r\n") + +%% + +"" return END_SCRIPT; + +"exit"|"die" return EXIT; + +"function" return FUNCTION; + +"const" return CONST; + +"return" return RETURN; + +"if" return IF; +"else" return ELSE; +"elseif" return ELSEIF; +"endif" return ENDIF; + +"while" return WHILE; +"endwhile" return ENDWHILE; +"do" return DO; + +"for" return FOR; +"endfor" return ENDFOR; +"foreach" return FOREACH; +"as" return AS; +"endforeach" return ENDFOREACH; + +"switch" return SWITCH; +"endswitch" return ENDSWITCH; +"case" return CASE; +"default" return DEFAULT; +"break" return BREAK; + +"continue" return CONTINUE; + +"echo" return ECHO; +"print" return PRINT; + +"new" return NEW; + +"->" return OBJECT_OPERATOR; + +"list" return LIST; +"array" return ARRAY; + +"++" return INC; +"--" return DEC; +"=>" return HASH_ASSIGN; + +"or" return LOG_OR; +"xor" return LOG_XOR; +"and" return LOG_AND; +"||" return BOOLEAN_OR; +"&&" return BOOLEAN_AND; + +"+=" return PLUS_EQ; +"-=" return MINUS_EQ; +"*=" return MUL_EQ; +"/=" return DIV_EQ; +".=" return CONCAT_EQ; +"%=" return MOD_EQ; +"&=" return AND_EQ; +"|=" return OR_EQ; +"^=" return XOR_EQ; +"<<=" return SL_EQ; +">>=" return SR_EQ; + +"===" return IS_IDENTICAL; +"!===" return IS_NOIDENTICAL; +"==" return IS_EQ; +"!=" return IS_NOEQUAL; +"<=" return IS_SMALLER_OR_EQ; +">=" return IS_GREATER_OR_EQ; + +"global" return GLOBAL; +"static" return STATIC; + +"include" BEGIN(INCLUDE); +[ \t]* +\'[a-zA-Z_][a-zA-Z0-9_\.]*\' { + yytext[strlen(yytext)-1] = 0; + if ( php_include_stack_ptr >= MAX_INCLUDE_DEPTH ) { + fprintf( stderr, "WARNING: maximum include depth (which is %d) exceed", MAX_INCLUDE_DEPTH); + } else { + php_include_stack[php_include_stack_ptr++] = YY_CURRENT_BUFFER; + yyin = fopen(yytext+1, "r"); + if ( !yyin ) { + printf("WARNING: include file [%s] can not be opened\n", yytext+1); + } else { + yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE )); + } + } + BEGIN(INITIAL); +} + +"("[ \t]*("int"|"integer")[ \t]*")" { + return INT_CAST; +} + +"("[ \t]*("real"|"double"|"float")[ \t]*")" { + return DOUBLE_CAST; +} + +"("[ \t]*"string"[ \t]*")" { + return STRING_CAST; +} + +"("[ \t]*("bool"|"boolean")[ \t]*")" { + return BOOL_CAST; +} + +"#"|"//" { + BEGIN(LINE_COMMENT); + yymore(); + } + +[^\n\r]+ { + yymore(); + } + +{EOL} { + BEGIN(INITIAL); + } + +"/*" { + BEGIN(BLOCK_COMMENT); + yymore(); + } + +"*/" { + BEGIN(INITIAL); + } + +"$"{IDENT} { + yylval.exp_node = get_var_node(yytext+1); + return VARIABLE; + } + +{IDENT} { + strcpy(yylval.str_val, yytext); + return IDENT; + } + +{HEX_NUM} { + int val; + sscanf(yytext, "0x%x", &val); + yylval.exp_node = make_const_exp_dnum(val); + return DNUMBER; + } + +{DEC_NUM} { + yylval.exp_node = make_const_exp_dnum(atoi(yytext)); + return DNUMBER; + } + +{FLOANUM} { + yylval.exp_node = make_const_exp_fnum(atof(yytext)); + return FNUMBER; + } + +\"(\\.|[^\\"])*\" { + yytext[strlen(yytext)-1] = 0; + yylval.exp_node = make_const_exp_str(yytext+1, 1); + return STRING; +} + +\'(\\.|[^\\'])*\' { + yytext[strlen(yytext)-1] = 0; + yylval.exp_node = make_const_exp_str(yytext+1, 0); + return STRING; +} + +[ \t\v\n\r\f] { } + +. { + return yytext[0]; +} diff --git a/src/webserver/src/php_parser.c b/src/webserver/src/php_parser.c new file mode 100644 index 00000000..d3abde0a --- /dev/null +++ b/src/webserver/src/php_parser.c @@ -0,0 +1,3169 @@ +/* A Bison parser, made by GNU Bison 2.0. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + 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, 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. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + FNUMBER = 258, + DNUMBER = 259, + STRING = 260, + IDENT = 261, + VARIABLE = 262, + ECHO = 263, + EXIT = 264, + IF = 265, + DO = 266, + WHILE = 267, + ENDWHILE = 268, + FOR = 269, + ENDFOR = 270, + FOREACH = 271, + ENDFOREACH = 272, + DECLARE = 273, + ENDDECLARE = 274, + AS = 275, + CONST = 276, + GLOBAL = 277, + UNSET = 278, + ISSET = 279, + EMPTY = 280, + SWITCH = 281, + ENDSWITCH = 282, + CASE = 283, + DEFAULT = 284, + BREAK = 285, + CONTINUE = 286, + FUNCTION = 287, + RETURN = 288, + CLASS = 289, + INTERFACE = 290, + EXTENDS = 291, + IMPLEMENTS = 292, + OBJECT_OPERATOR = 293, + HASH_ASSIGN = 294, + LIST = 295, + ARRAY = 296, + CLASS_SCOPE = 297, + PRINT = 298, + SR_EQ = 299, + SL_EQ = 300, + XOR_EQ = 301, + OR_EQ = 302, + AND_EQ = 303, + MOD_EQ = 304, + CONCAT_EQ = 305, + DIV_EQ = 306, + MUL_EQ = 307, + MINUS_EQ = 308, + PLUS_EQ = 309, + LOG_OR = 310, + LOG_XOR = 311, + LOG_AND = 312, + BOOLEAN_OR = 313, + BOOLEAN_AND = 314, + IS_NOIDENTICAL = 315, + IS_IDENTICAL = 316, + IS_NOEQUAL = 317, + IS_EQ = 318, + IS_GREATER_OR_EQ = 319, + IS_SMALLER_OR_EQ = 320, + SR = 321, + SL = 322, + INSTANCEOF = 323, + UNSET_CAST = 324, + BOOL_CAST = 325, + OBJECT_CAST = 326, + ARRAY_CAST = 327, + STRING_CAST = 328, + DOUBLE_CAST = 329, + INT_CAST = 330, + DEC = 331, + INC = 332, + CLONE = 333, + NEW = 334, + ELSEIF = 335, + ELSE = 336, + ENDIF = 337, + PUBLIC = 338, + PROTECTED = 339, + PRIVATE = 340, + FINAL = 341, + ABSTRACT = 342, + STATIC = 343, + START_SCRIPT = 344, + END_SCRIPT = 345 + }; +#endif +#define FNUMBER 258 +#define DNUMBER 259 +#define STRING 260 +#define IDENT 261 +#define VARIABLE 262 +#define ECHO 263 +#define EXIT 264 +#define IF 265 +#define DO 266 +#define WHILE 267 +#define ENDWHILE 268 +#define FOR 269 +#define ENDFOR 270 +#define FOREACH 271 +#define ENDFOREACH 272 +#define DECLARE 273 +#define ENDDECLARE 274 +#define AS 275 +#define CONST 276 +#define GLOBAL 277 +#define UNSET 278 +#define ISSET 279 +#define EMPTY 280 +#define SWITCH 281 +#define ENDSWITCH 282 +#define CASE 283 +#define DEFAULT 284 +#define BREAK 285 +#define CONTINUE 286 +#define FUNCTION 287 +#define RETURN 288 +#define CLASS 289 +#define INTERFACE 290 +#define EXTENDS 291 +#define IMPLEMENTS 292 +#define OBJECT_OPERATOR 293 +#define HASH_ASSIGN 294 +#define LIST 295 +#define ARRAY 296 +#define CLASS_SCOPE 297 +#define PRINT 298 +#define SR_EQ 299 +#define SL_EQ 300 +#define XOR_EQ 301 +#define OR_EQ 302 +#define AND_EQ 303 +#define MOD_EQ 304 +#define CONCAT_EQ 305 +#define DIV_EQ 306 +#define MUL_EQ 307 +#define MINUS_EQ 308 +#define PLUS_EQ 309 +#define LOG_OR 310 +#define LOG_XOR 311 +#define LOG_AND 312 +#define BOOLEAN_OR 313 +#define BOOLEAN_AND 314 +#define IS_NOIDENTICAL 315 +#define IS_IDENTICAL 316 +#define IS_NOEQUAL 317 +#define IS_EQ 318 +#define IS_GREATER_OR_EQ 319 +#define IS_SMALLER_OR_EQ 320 +#define SR 321 +#define SL 322 +#define INSTANCEOF 323 +#define UNSET_CAST 324 +#define BOOL_CAST 325 +#define OBJECT_CAST 326 +#define ARRAY_CAST 327 +#define STRING_CAST 328 +#define DOUBLE_CAST 329 +#define INT_CAST 330 +#define DEC 331 +#define INC 332 +#define CLONE 333 +#define NEW 334 +#define ELSEIF 335 +#define ELSE 336 +#define ENDIF 337 +#define PUBLIC 338 +#define PROTECTED 339 +#define PRIVATE 340 +#define FINAL 341 +#define ABSTRACT 342 +#define STATIC 343 +#define START_SCRIPT 344 +#define END_SCRIPT 345 + + + + +/* Copy the first part of user declarations. */ +#line 1 "php_parser.y" + +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2006 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (C) 2005-2006Froenchenko Leonid ( lfroen@amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include +#include + +#include "php_syntree.h" + +int yylex(); + +// add item to syntree list +PHP_SYN_NODE *add_statement_2_list(PHP_SYN_NODE *list, PHP_SYN_NODE *st) +{ + if ( st && list) { + PHP_SYN_NODE *last = list; + while ( last->next_node ) { + last = last->next_node; + } + last->next_node = st; + return list; + } else if ( st ) { + return st; + } else { + return list; + } +} + +PHP_SYN_NODE *add_branch_2_elseif(PHP_SYN_NODE *list, PHP_SYN_NODE *branch) +{ + if ( list ) { + PHP_SYN_NODE *curr_if = list; + while ( curr_if->node_if.code_else ) { + curr_if = curr_if->node_if.code_else; + } + curr_if->node_if.code_else = branch; + return list; + } else { + return branch; + } +} + + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 1 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 67 "php_parser.y" +typedef union YYSTYPE { + PHP_SYN_NODE *syn_node; + PHP_EXP_NODE *exp_node; + + char str_val[256]; +} YYSTYPE; +/* Line 190 of yacc.c. */ +#line 329 "php_parser.c" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +/* Line 213 of yacc.c. */ +#line 341 "php_parser.c" + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +# ifndef YYFREE +# define YYFREE free +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# endif + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# else +# define YYSTACK_ALLOC alloca +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# else +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short int yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined (__GNUC__) && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + +#endif + +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short int yysigned_char; +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 4 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 3075 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 117 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 37 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 169 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 385 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 345 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 83, 2, 2, 116, 82, 66, 2, + 113, 114, 80, 77, 43, 78, 79, 81, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 58, 112, + 71, 45, 72, 57, 86, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 96, 2, 115, 65, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 110, 64, 111, 85, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 44, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 59, 60, 61, 62, 63, 67, 68, 69, 70, 73, + 74, 75, 76, 84, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned short int yyprhs[] = +{ + 0, 0, 3, 7, 10, 11, 13, 17, 19, 23, + 26, 30, 34, 42, 48, 56, 66, 72, 75, 79, + 82, 86, 89, 93, 97, 103, 111, 121, 132, 138, + 146, 148, 152, 158, 160, 164, 166, 170, 172, 176, + 178, 180, 184, 186, 190, 191, 201, 211, 214, 218, + 223, 229, 230, 231, 233, 235, 240, 242, 247, 249, + 250, 257, 258, 259, 262, 264, 269, 273, 278, 283, + 289, 290, 295, 298, 300, 302, 304, 306, 308, 310, + 312, 314, 318, 322, 324, 328, 333, 338, 343, 348, + 355, 362, 364, 367, 371, 376, 377, 384, 386, 390, + 392, 397, 401, 405, 409, 413, 417, 421, 425, 429, + 433, 437, 441, 444, 447, 450, 453, 457, 461, 465, + 469, 473, 477, 481, 485, 489, 493, 497, 501, 505, + 509, 513, 517, 520, 523, 526, 529, 533, 537, 541, + 545, 549, 553, 557, 561, 565, 571, 574, 577, 580, + 583, 586, 589, 592, 594, 599, 602, 606, 609, 610, + 612, 616, 618, 623, 624, 626, 630, 632, 636, 641 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const short int yyrhs[] = +{ + 118, 0, -1, 108, 119, 109, -1, 119, 120, -1, + -1, 121, -1, 108, 119, 109, -1, 129, -1, 110, + 119, 111, -1, 148, 112, -1, 22, 125, 112, -1, + 107, 127, 112, -1, 10, 113, 148, 114, 121, 136, + 137, -1, 12, 113, 148, 114, 138, -1, 11, 121, + 12, 113, 148, 114, 112, -1, 14, 113, 135, 112, + 135, 112, 135, 114, 133, -1, 26, 113, 148, 114, + 139, -1, 31, 112, -1, 31, 148, 112, -1, 30, + 112, -1, 30, 148, 112, -1, 33, 112, -1, 33, + 148, 112, -1, 8, 123, 112, -1, 23, 113, 124, + 114, 112, -1, 16, 113, 148, 20, 144, 114, 134, + -1, 16, 113, 148, 20, 144, 39, 144, 114, 134, + -1, 16, 113, 148, 20, 144, 39, 66, 144, 114, + 134, -1, 18, 113, 122, 114, 121, -1, 18, 113, + 122, 114, 58, 119, 19, -1, 112, -1, 6, 45, + 143, -1, 122, 43, 6, 45, 143, -1, 148, -1, + 123, 43, 148, -1, 144, -1, 124, 43, 144, -1, + 126, -1, 125, 43, 126, -1, 7, -1, 128, -1, + 127, 43, 128, -1, 7, -1, 7, 45, 143, -1, + -1, 32, 6, 130, 113, 131, 114, 110, 119, 111, + -1, 32, 66, 6, 113, 131, 114, 110, 119, 111, + -1, 132, 7, -1, 132, 66, 7, -1, 131, 43, + 132, 7, -1, 131, 43, 132, 66, 7, -1, -1, + -1, 6, -1, 121, -1, 58, 119, 15, 112, -1, + 121, -1, 58, 119, 17, 112, -1, 123, -1, -1, + 136, 99, 113, 148, 114, 121, -1, -1, -1, 100, + 121, -1, 121, -1, 58, 119, 13, 112, -1, 110, + 140, 111, -1, 110, 112, 140, 111, -1, 58, 140, + 27, 112, -1, 58, 112, 140, 27, 112, -1, -1, + 140, 141, 142, 119, -1, 28, 148, -1, 29, -1, + 58, -1, 112, -1, 3, -1, 4, -1, 5, -1, + 6, -1, 145, -1, 6, 42, 6, -1, 145, 38, + 6, -1, 7, -1, 145, 96, 115, -1, 145, 96, + 148, 115, -1, 145, 110, 148, 111, -1, 116, 110, + 148, 111, -1, 6, 113, 147, 114, -1, 145, 42, + 6, 113, 147, 114, -1, 145, 38, 6, 113, 147, + 114, -1, 148, -1, 66, 144, -1, 147, 43, 148, + -1, 147, 43, 66, 144, -1, -1, 40, 113, 150, + 114, 45, 148, -1, 144, -1, 144, 45, 148, -1, + 146, -1, 144, 45, 66, 144, -1, 144, 56, 148, + -1, 144, 55, 148, -1, 144, 54, 148, -1, 144, + 53, 148, -1, 144, 52, 148, -1, 144, 51, 148, + -1, 144, 50, 148, -1, 144, 49, 148, -1, 144, + 48, 148, -1, 144, 47, 148, -1, 144, 46, 148, + -1, 144, 95, -1, 95, 144, -1, 144, 94, -1, + 94, 144, -1, 148, 62, 148, -1, 148, 63, 148, + -1, 148, 59, 148, -1, 148, 61, 148, -1, 148, + 60, 148, -1, 148, 64, 148, -1, 148, 66, 148, + -1, 148, 65, 148, -1, 148, 79, 148, -1, 148, + 77, 148, -1, 148, 78, 148, -1, 148, 80, 148, + -1, 148, 81, 148, -1, 148, 82, 148, -1, 148, + 76, 148, -1, 148, 75, 148, -1, 77, 148, -1, + 78, 148, -1, 83, 148, -1, 85, 148, -1, 148, + 68, 148, -1, 148, 67, 148, -1, 148, 70, 148, + -1, 148, 69, 148, -1, 148, 71, 148, -1, 148, + 74, 148, -1, 148, 72, 148, -1, 148, 73, 148, + -1, 113, 148, 114, -1, 148, 57, 148, 58, 148, + -1, 93, 148, -1, 92, 148, -1, 91, 148, -1, + 88, 148, -1, 87, 148, -1, 9, 149, -1, 86, + 148, -1, 143, -1, 41, 113, 152, 114, -1, 44, + 148, -1, 113, 148, 114, -1, 113, 114, -1, -1, + 151, -1, 150, 43, 151, -1, 144, -1, 40, 113, + 150, 114, -1, -1, 153, -1, 152, 43, 153, -1, + 148, -1, 148, 39, 148, -1, 148, 39, 66, 144, + -1, 66, 144, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned short int yyrline[] = +{ + 0, 142, 142, 146, 147, 152, 153, 154, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 179, 182, 185, 186, + 187, 190, 191, 194, 195, 204, 205, 211, 212, 216, + 231, 232, 235, 236, 244, 244, 255, 259, 260, 261, + 262, 263, 267, 268, 272, 273, 277, 278, 281, 282, + 286, 287, 291, 292, 295, 296, 300, 301, 302, 303, + 307, 308, 323, 324, 327, 328, 332, 333, 334, 335, + 338, 339, 340, 344, 345, 346, 347, 348, 352, 353, + 354, 357, 358, 359, 360, 361, 366, 367, 368, 369, + 370, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 387, 388, 389, 390, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 428, 429, 430, 432, 433, 434, 437, 438, 439, 442, + 443, 447, 448, 449, 452, 453, 462, 463, 464, 465 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "FNUMBER", "DNUMBER", "STRING", "IDENT", + "VARIABLE", "ECHO", "EXIT", "IF", "DO", "WHILE", "ENDWHILE", "FOR", + "ENDFOR", "FOREACH", "ENDFOREACH", "DECLARE", "ENDDECLARE", "AS", + "CONST", "GLOBAL", "UNSET", "ISSET", "EMPTY", "SWITCH", "ENDSWITCH", + "CASE", "DEFAULT", "BREAK", "CONTINUE", "FUNCTION", "RETURN", "CLASS", + "INTERFACE", "EXTENDS", "IMPLEMENTS", "OBJECT_OPERATOR", "HASH_ASSIGN", + "LIST", "ARRAY", "CLASS_SCOPE", "','", "PRINT", "'='", "SR_EQ", "SL_EQ", + "XOR_EQ", "OR_EQ", "AND_EQ", "MOD_EQ", "CONCAT_EQ", "DIV_EQ", "MUL_EQ", + "MINUS_EQ", "PLUS_EQ", "'?'", "':'", "LOG_OR", "LOG_XOR", "LOG_AND", + "BOOLEAN_OR", "BOOLEAN_AND", "'|'", "'^'", "'&'", "IS_NOIDENTICAL", + "IS_IDENTICAL", "IS_NOEQUAL", "IS_EQ", "'<'", "'>'", "IS_GREATER_OR_EQ", + "IS_SMALLER_OR_EQ", "SR", "SL", "'+'", "'-'", "'.'", "'*'", "'/'", "'%'", + "'!'", "INSTANCEOF", "'~'", "'@'", "UNSET_CAST", "BOOL_CAST", + "OBJECT_CAST", "ARRAY_CAST", "STRING_CAST", "DOUBLE_CAST", "INT_CAST", + "DEC", "INC", "'['", "CLONE", "NEW", "ELSEIF", "ELSE", "ENDIF", "PUBLIC", + "PROTECTED", "PRIVATE", "FINAL", "ABSTRACT", "STATIC", "START_SCRIPT", + "END_SCRIPT", "'{'", "'}'", "';'", "'('", "')'", "']'", "'$'", "$accept", + "program_tree", "top_statement_list", "top_statement", "statement", + "decl_list", "expr_list", "variable_list", "global_var_list", + "global_var", "static_var_list", "static_var", "function_decl_statement", + "@1", "parameter_list", "optional_class_type", "for_statement", + "foreach_statement", "for_expr", "elseif_list", "else_statement", + "while_statement", "switch_case_list", "case_list", "case_list_item", + "case_separator", "const_value", "variable", "deref_variable", + "function_call", "func_param_list", "expr", "exit_expr", + "assignment_list", "assignment_list_element", "array_pair_list", + "array_elem", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short int yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 44, 298, 61, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 63, 58, 310, + 311, 312, 313, 314, 124, 94, 38, 315, 316, 317, + 318, 60, 62, 319, 320, 321, 322, 43, 45, 46, + 42, 47, 37, 33, 323, 126, 64, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 91, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 123, 125, 59, 40, 41, 93, 36 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 117, 118, 119, 119, 120, 120, 120, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 122, 122, 123, 123, 124, 124, 125, 125, 126, + 127, 127, 128, 128, 130, 129, 129, 131, 131, 131, + 131, 131, 132, 132, 133, 133, 134, 134, 135, 135, + 136, 136, 137, 137, 138, 138, 139, 139, 139, 139, + 140, 140, 141, 141, 142, 142, 143, 143, 143, 143, + 144, 144, 144, 145, 145, 145, 145, 145, 146, 146, + 146, 147, 147, 147, 147, 147, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 149, 149, 149, 150, + 150, 151, 151, 151, 152, 152, 153, 153, 153, 153 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 3, 2, 0, 1, 3, 1, 3, 2, + 3, 3, 7, 5, 7, 9, 5, 2, 3, 2, + 3, 2, 3, 3, 5, 7, 9, 10, 5, 7, + 1, 3, 5, 1, 3, 1, 3, 1, 3, 1, + 1, 3, 1, 3, 0, 9, 9, 2, 3, 4, + 5, 0, 0, 1, 1, 4, 1, 4, 1, 0, + 6, 0, 0, 2, 1, 4, 3, 4, 4, 5, + 0, 4, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 3, 1, 3, 4, 4, 4, 4, 6, + 6, 1, 2, 3, 4, 0, 6, 1, 3, 1, + 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 5, 2, 2, 2, 2, + 2, 2, 2, 1, 4, 2, 3, 2, 0, 1, + 3, 1, 4, 0, 1, 3, 1, 3, 4, 2 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned char yydefact[] = +{ + 0, 4, 0, 0, 1, 76, 77, 78, 79, 83, + 0, 158, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 2, 4, 30, 0, 0, 3, 5, 7, + 153, 97, 80, 99, 0, 0, 95, 0, 33, 0, + 151, 0, 0, 0, 59, 0, 0, 39, 0, 37, + 0, 0, 19, 0, 17, 0, 44, 0, 21, 0, + 163, 0, 155, 132, 133, 134, 135, 152, 150, 149, + 148, 147, 146, 0, 115, 80, 113, 42, 0, 40, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 114, 112, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 81, 0, + 0, 91, 0, 23, 157, 0, 0, 0, 0, 58, + 0, 0, 0, 0, 0, 10, 0, 35, 0, 20, + 18, 0, 0, 22, 0, 161, 0, 159, 0, 166, + 0, 164, 0, 0, 0, 11, 6, 8, 144, 0, + 0, 98, 111, 110, 109, 108, 107, 106, 105, 104, + 103, 102, 101, 82, 0, 84, 0, 0, 0, 118, + 120, 119, 116, 117, 121, 123, 122, 137, 136, 139, + 138, 140, 142, 143, 141, 131, 130, 125, 126, 124, + 127, 128, 129, 92, 0, 88, 34, 156, 0, 0, + 0, 59, 0, 0, 0, 0, 38, 0, 0, 0, + 51, 51, 163, 163, 0, 169, 0, 0, 154, 82, + 79, 43, 41, 87, 100, 95, 95, 85, 86, 0, + 0, 93, 61, 0, 4, 64, 13, 0, 0, 31, + 0, 4, 28, 36, 24, 70, 70, 16, 53, 0, + 0, 0, 0, 160, 0, 0, 167, 165, 0, 0, + 145, 94, 62, 0, 0, 59, 0, 0, 0, 0, + 70, 0, 70, 0, 52, 0, 47, 0, 0, 162, + 96, 168, 90, 89, 0, 0, 12, 14, 0, 0, + 0, 0, 4, 56, 25, 32, 29, 0, 0, 0, + 73, 0, 0, 66, 0, 4, 48, 4, 0, 63, + 65, 0, 0, 0, 0, 0, 68, 72, 74, 75, + 4, 67, 49, 0, 0, 0, 0, 4, 54, 15, + 0, 26, 0, 69, 71, 50, 45, 46, 0, 0, + 27, 57, 60, 0, 55 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const short int yydefgoto[] = +{ + -1, 2, 3, 47, 48, 163, 159, 166, 68, 69, + 98, 99, 49, 171, 289, 290, 369, 334, 160, 302, + 326, 276, 287, 311, 341, 360, 50, 51, 52, 53, + 150, 54, 60, 176, 177, 180, 181 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -309 +static const short int yypact[] = +{ + -75, -309, 36, 371, -309, -309, -309, -309, -30, -309, + 2593, -59, 58, 1967, 59, 69, 71, 98, 66, 113, + 123, 2023, 2081, 8, 2137, 124, 126, 2593, 2593, 2593, + 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 34, 34, + 147, -309, -309, -309, -309, 2593, 49, -309, -309, -309, + -309, 222, -29, -309, 1383, 234, 2195, 0, 2864, 2251, + -309, 2593, 230, 2593, 2593, 2593, 238, -309, 51, -309, + 34, 2593, -309, 2651, -309, 2677, -309, 239, -309, 2705, + 31, 2309, 2864, -33, -33, -309, -309, -309, -309, -309, + -309, -309, -309, 204, -309, -28, -309, 208, 52, -309, + 485, 599, 585, 2593, 2365, 2593, 2593, 2593, 2593, 2593, + 2593, 2593, 2593, 2593, 2593, 2593, -309, -309, 241, 248, + 2423, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, + 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, + 2593, 2593, 2593, 2593, 2593, 2593, 2593, -309, -309, 34, + -1, 2864, 2593, -309, -309, 699, 813, 143, 927, 212, + 145, 128, 213, 29, 66, -309, 35, -309, 1041, -309, + -309, 148, 149, -309, 151, -309, 37, -309, 34, 2812, + 41, -309, 259, 172, 147, -309, -309, -309, -309, 2731, + 34, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 166, 167, -309, 471, 2759, 2838, 2911, + 2933, 2954, 2974, 2993, 1505, 350, 1617, 1731, 1731, 1731, + 1731, 142, 142, 142, 142, 88, 88, -33, -33, -33, + -309, -309, -309, -309, 2479, -309, 2864, -309, 1967, 2593, + 1511, 2593, 34, 172, 276, 1625, -309, 34, 171, -41, + 86, 86, 31, 31, 240, -309, 2537, 2309, -309, -309, + -309, -309, -309, -309, -309, 2195, 2195, -309, -309, 2593, + 34, 2864, -309, 1155, -309, -309, -309, 174, -37, -309, + 242, -309, -309, -309, -309, 177, 178, -309, -309, 42, + 4, 43, 44, -309, 2593, 34, 2864, -309, 46, 48, + 2888, -309, -39, 183, 713, 2593, 45, 1739, 172, 827, + -309, 152, -309, -23, 278, 186, -309, 290, 188, -309, + 2864, -309, -309, -309, 187, 1967, -309, -309, 189, 190, + 34, 192, -309, -309, -309, -309, -309, 202, 191, 2593, + -309, -2, -21, -309, 146, -309, -309, -309, 2593, -309, + -309, 1853, 194, 1739, 941, 197, -309, 2864, -309, -309, + -309, -309, -309, 303, 1055, 1169, 1269, -309, -309, -309, + 1739, -309, 199, -309, 1397, -309, -309, -309, 1967, 1283, + -309, -309, -309, 201, -309 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const short int yypgoto[] = +{ + -309, -309, -40, -309, -13, -309, 304, -309, -309, 154, + -309, 131, -309, -309, 68, 7, -309, -308, -209, -309, + -309, -309, -309, -266, -309, -309, -164, -4, 103, -309, + -202, -6, -309, 70, 72, -309, 67 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -53 +static const short int yytable[] = +{ + 62, 100, 306, 101, 58, 339, 340, 339, 340, 118, + 182, 316, 55, 119, 76, 73, 75, 285, 79, 261, + 313, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 277, 1, 94, 96, 4, 93, 9, 102, + 93, 9, 234, 152, 337, 371, 342, 144, 145, 146, + 151, 93, 9, 155, 59, 156, 358, 158, 58, 161, + 324, 325, 380, 298, 299, 168, 167, 120, 120, 286, + 317, 174, 244, 67, 77, 179, 175, 307, 247, 279, + 253, 121, 121, 56, 257, 314, 314, 253, 343, 234, + 361, 234, 288, -52, 164, 184, 329, 189, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 359, 330, 153, 235, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 95, 95, 245, 335, 233, 236, 46, 242, 248, + 46, 254, -52, 362, 97, 258, 315, 318, 319, 103, + 322, 46, 323, 165, 185, 141, 142, 143, 144, 145, + 146, 61, 63, 95, 255, 5, 6, 7, 260, 338, + 339, 340, 64, 95, 65, 122, 264, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 66, 363, -53, -53, -53, -53, 139, 140, 141, + 142, 143, 144, 145, 146, 272, 70, 275, 271, 355, + 339, 340, 282, 273, 304, 58, 71, 80, 278, 81, + 148, 309, 157, 283, 162, 172, 55, 203, 175, 175, + 296, 179, 95, 183, 204, 152, 239, 241, 243, 151, + 151, 250, 251, 300, 252, 259, 301, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 265, + 266, 95, 280, 284, 288, 294, 305, 308, 320, 310, + 312, 321, 354, 95, 333, 327, 345, 346, 347, 58, + 348, 350, 331, 356, 351, 364, 353, 365, 370, 373, + 375, 381, 349, 384, 57, 262, 116, 117, 246, 291, + 374, 344, 292, 0, 297, 293, 352, 379, 0, 0, + 0, 0, 0, 357, 0, 0, 0, 0, 368, 0, + 333, 0, 366, 0, 0, 95, 0, 0, 0, 0, + 95, 0, 0, 0, 0, 95, 95, 333, 0, 0, + 0, 0, 0, 0, 0, 382, 0, 0, 0, 0, + 0, 0, 0, 95, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 0, 15, 0, 16, 0, 17, + 0, 0, 0, 18, 19, 0, 0, 20, 95, 0, + 0, 21, 22, 23, 24, 0, 0, 0, 0, 95, + 0, 25, 26, 0, 0, 27, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 95, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, + 0, 0, 0, 0, 30, 0, 31, 32, 33, 34, + 0, 0, 35, 36, 37, 38, 39, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 40, 41, + 42, 43, 0, 44, 45, 0, 0, 46, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 0, 15, + 0, 16, 0, 17, 0, 0, 0, 18, 19, 0, + 0, 20, 0, 0, 0, 21, 22, 23, 24, 0, + 0, 0, 0, 0, 0, 25, 26, 0, 122, 27, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 0, 0, 0, 0, 0, 0, + 0, 0, 28, 29, 0, 0, 0, 0, 30, 0, + 31, 32, 33, 34, 0, 0, 35, 36, 37, 38, + 39, 0, 0, 0, 0, 0, 267, 0, 0, 0, + 0, 0, 40, 41, 186, 43, 0, 44, 45, 0, + 0, 46, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 0, 15, 0, 16, 0, 17, 0, 0, + 0, 18, 19, 0, 0, 20, 0, 0, 0, 21, + 22, 23, 24, 0, 0, 0, 0, 0, 0, 25, + 26, 0, 122, 27, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 0, 0, + 0, 0, 0, 0, 0, 0, 28, 29, 0, 0, + 0, 0, 30, 0, 31, 32, 33, 34, 0, 0, + 35, 36, 37, 38, 39, 0, 0, 0, 0, 188, + 0, 0, 0, 0, 0, 0, 40, 41, 0, 43, + 187, 44, 45, 0, 0, 46, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 328, 15, 0, 16, + 0, 17, 0, 0, 0, 18, 19, 0, 0, 20, + 0, 0, 0, 21, 22, 23, 24, 0, 0, 0, + 0, 0, 0, 25, 26, 0, 122, 27, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 0, 0, 0, 0, 0, 0, 0, 0, + 28, 29, 0, 0, 0, 0, 30, 0, 31, 32, + 33, 34, 0, 0, 35, 36, 37, 38, 39, 0, + 0, 0, 0, 237, 0, 0, 0, 0, 0, 0, + 40, 41, 0, 43, 0, 44, 45, 0, 0, 46, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 0, 15, 0, 16, 0, 17, 336, 0, 0, 18, + 19, 0, 0, 20, 0, 0, 0, 21, 22, 23, + 24, 0, 0, 0, 0, 0, 0, 25, 26, 0, + 122, 27, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 0, 0, 0, 0, + 0, 0, 0, 0, 28, 29, 0, 0, 0, 0, + 30, 0, 31, 32, 33, 34, 0, 0, 35, 36, + 37, 38, 39, 0, 0, 0, 0, 238, 0, 0, + 0, 0, 0, 0, 40, 41, 0, 43, 0, 44, + 45, 0, 0, 46, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 0, 15, 0, 16, 372, 17, + 0, 0, 0, 18, 19, 0, 0, 20, 0, 0, + 0, 21, 22, 23, 24, 0, 0, 0, 0, 0, + 0, 25, 26, 0, 122, 27, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, + 0, 0, 0, 0, 30, 0, 31, 32, 33, 34, + 0, 0, 35, 36, 37, 38, 39, 0, 0, 0, + 0, 240, 0, 0, 0, 0, 0, 0, 40, 41, + 0, 43, 0, 44, 45, 0, 0, 46, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 0, 15, + 0, 16, 0, 17, 0, 0, 0, 18, 19, 0, + 0, 20, 0, 0, 0, 21, 22, 23, 24, 0, + 0, 0, 0, 0, 0, 25, 26, 0, 122, 27, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 0, 0, 0, 0, 0, 0, + 0, 0, 28, 29, 0, 0, 0, 0, 30, 0, + 31, 32, 33, 34, 0, 0, 35, 36, 37, 38, + 39, 0, 0, 0, 0, 249, 0, 0, 0, 0, + 0, 0, 40, 41, 0, 43, 376, 44, 45, 0, + 0, 46, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 0, 15, 0, 16, 0, 17, 0, 0, + 0, 18, 19, 0, 0, 20, 0, 0, 0, 21, + 22, 23, 24, 0, 0, 0, 0, 0, 0, 25, + 26, 0, 122, 27, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 0, 0, + 0, 0, 0, 0, 0, 0, 28, 29, 0, 0, + 0, 0, 30, 0, 31, 32, 33, 34, 0, 0, + 35, 36, 37, 38, 39, 0, 0, 0, 0, 303, + 0, 0, 0, 0, 0, 0, 40, 41, 0, 43, + 377, 44, 45, 0, 0, 46, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 0, 15, 383, 16, + 0, 17, 0, 0, 0, 18, 19, 0, 0, 20, + 0, 0, 0, 21, 22, 23, 24, 0, 0, 0, + 0, 0, 0, 25, 26, 0, 122, 27, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 0, 0, 0, 0, 0, 0, 0, 0, + 28, 29, 0, 0, 0, 0, 30, 0, 31, 32, + 33, 34, 0, 0, 35, 36, 37, 38, 39, 0, + 0, 0, 0, 378, 0, 0, 0, 0, 0, 0, + 40, 41, 0, 43, 0, 44, 45, 0, 0, 46, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 0, 15, 0, 16, 0, 17, 0, 0, 0, 18, + 19, 0, 0, 20, 0, 0, 0, 21, 22, 23, + 24, 0, 0, 0, 0, 0, 0, 25, 26, 0, + 122, 27, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 0, 0, 0, 0, + 0, 0, 0, 0, 28, 29, 0, 0, 0, 0, + 30, 0, 31, 32, 33, 34, 0, 0, 35, 36, + 37, 38, 39, 0, 0, 147, 0, 0, 0, 0, + 0, 0, 0, 0, 40, 41, 0, 43, 0, 44, + 45, 0, 0, 46, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 0, 15, 0, 16, 0, 17, + 0, 0, 0, 18, 19, 0, 0, 20, 0, 0, + 0, 21, 22, 0, 24, 0, 0, 0, 0, 0, + 0, 25, 26, 0, 0, 27, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 28, 29, + 0, 0, 0, 0, 30, 0, 31, 32, 33, 34, + 0, 0, 35, 36, 37, 38, 39, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, + 0, 43, 0, 44, 45, 0, 0, 46, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 0, 15, + 0, 16, 0, 17, 0, 0, 0, 18, 19, 0, + 0, 20, 0, 0, 0, 21, 22, 0, 24, 0, + 0, 0, 0, 0, 0, 25, 26, 0, 0, 27, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 281, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 0, 0, 28, 29, 0, 0, 0, 0, 30, 0, + 31, 32, 33, 34, 0, 0, 35, 36, 37, 38, + 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 40, 0, 0, 43, 0, 44, 45, 0, + 0, 46, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 0, 15, 0, 16, 0, 17, 0, 0, + 0, 18, 19, 0, 0, 20, 0, 0, 0, 21, + 22, 0, 24, 0, 0, 0, 0, 0, 0, 25, + 26, 0, 0, 27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 332, -53, -53, + -53, -53, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 0, 0, 28, 29, 0, 0, + 0, 0, 30, 0, 31, 32, 33, 34, 0, 0, + 35, 36, 37, 38, 39, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 40, 0, 0, 43, + 0, 44, 45, 0, 0, 46, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 0, 15, 0, 16, + 0, 17, 0, 0, 0, 18, 19, 0, 0, 20, + 0, 0, 0, 21, 22, 0, 24, 0, 0, 0, + 0, 0, 0, 25, 26, 0, 0, 27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 367, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 28, 29, 0, 0, 0, 0, 30, 0, 31, 32, + 33, 34, 0, 0, 35, 36, 37, 38, 39, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 40, 0, 0, 43, 0, 44, 45, 0, 0, 46, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 0, 15, 0, 16, 0, 17, 0, 0, 0, 18, + 19, 0, 0, 20, 0, 0, 0, 21, 22, 0, + 24, 0, 0, 0, 0, 0, 0, 25, 26, 0, + 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 6, 7, 8, + 9, 0, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 28, 29, 0, 0, 0, 0, + 30, 0, 31, 32, 33, 34, 0, 0, 35, 36, + 37, 38, 39, 25, 26, 0, 0, 27, 0, 0, + 0, 0, 0, 0, 40, 0, 0, 43, 0, 44, + 45, 0, 0, 46, 5, 6, 7, 8, 9, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 28, 29, 0, 0, 0, 0, 30, 0, 31, 32, + 33, 34, 0, 0, 35, 36, 37, 38, 39, 0, + 0, 25, 26, 0, 0, 27, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 72, 45, 0, 0, 46, + 5, 6, 7, 8, 9, 0, 11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, + 0, 0, 0, 0, 30, 0, 31, 32, 33, 34, + 0, 0, 35, 36, 37, 38, 39, 25, 26, 0, + 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 74, 45, 0, 0, 46, 5, 6, + 7, 8, 9, 0, 11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 28, 29, 0, 0, 0, 0, + 30, 0, 31, 32, 33, 34, 0, 0, 35, 36, + 37, 38, 39, 0, 0, 25, 26, 0, 0, 27, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, + 45, 0, 0, 46, 5, 6, 7, 8, 9, 0, + 11, 149, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 28, 29, 0, 0, 0, 0, 30, 0, + 31, 32, 33, 34, 0, 0, 35, 36, 37, 38, + 39, 25, 26, 0, 0, 27, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, + 0, 46, 5, 6, 7, 8, 9, 0, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, + 0, 0, 0, 0, 30, 0, 31, 32, 33, 34, + 0, 0, 35, 36, 37, 38, 39, 0, 0, 25, + 26, 0, 0, 27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 45, 154, 0, 46, 5, 6, + 7, 8, 9, 0, 11, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 28, 29, 0, 0, + 0, 0, 30, 0, 31, 32, 33, 34, 0, 0, + 35, 36, 37, 38, 39, 25, 26, 0, 0, 27, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 45, 0, 0, 46, 5, 6, 7, 8, + 9, 190, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 28, 29, 0, 0, 0, 0, 30, 0, + 31, 32, 33, 34, 0, 0, 35, 36, 37, 38, + 39, 0, 0, 25, 26, 0, 0, 27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, + 0, 46, 5, 6, 7, 8, 9, 0, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 28, 29, 0, 0, 0, 0, 30, 0, 31, 32, + 33, 34, 0, 0, 35, 36, 37, 38, 39, 25, + 26, 0, 0, 27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 45, 0, 205, 46, + 5, 6, 7, 8, 9, 270, 11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 28, 29, 0, 0, + 0, 0, 30, 0, 31, 32, 33, 34, 0, 0, + 35, 36, 37, 38, 39, 0, 0, 25, 26, 0, + 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 45, 0, 0, 46, 5, 6, 7, 8, + 9, 0, 11, 295, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 28, 29, 0, 0, 0, 0, + 30, 0, 31, 32, 33, 34, 0, 0, 35, 36, + 37, 38, 39, 25, 26, 0, 0, 27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 28, 29, 0, 0, 0, 0, 30, 0, 31, 32, + 33, 34, 0, 0, 35, 36, 37, 38, 39, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 45, 0, 122, 46, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 122, 0, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 0, 0, 122, 169, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 122, 170, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 0, 0, 122, 173, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 263, 0, 0, 0, 0, 0, 0, 0, + 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, + 268, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 122, 269, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 122, 0, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146 +}; + +static const short int yycheck[] = +{ + 13, 41, 39, 43, 10, 28, 29, 28, 29, 38, + 38, 7, 42, 42, 6, 21, 22, 58, 24, 183, + 286, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 241, 108, 38, 39, 0, 6, 7, 45, + 6, 7, 43, 43, 310, 353, 312, 80, 81, 82, + 56, 6, 7, 59, 113, 61, 58, 63, 64, 65, + 99, 100, 370, 265, 266, 71, 70, 96, 96, 110, + 66, 40, 43, 7, 66, 81, 80, 114, 43, 243, + 43, 110, 110, 113, 43, 43, 43, 43, 111, 43, + 111, 43, 6, 7, 43, 43, 305, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 112, 66, 112, 114, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 38, 39, 114, 308, 149, 152, 116, 20, 114, + 116, 114, 66, 7, 7, 114, 114, 114, 114, 110, + 114, 116, 114, 112, 112, 77, 78, 79, 80, 81, + 82, 113, 113, 70, 178, 3, 4, 5, 6, 27, + 28, 29, 113, 80, 113, 57, 190, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 113, 66, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 238, 113, 240, 234, 27, + 28, 29, 245, 239, 274, 241, 113, 113, 242, 113, + 6, 281, 12, 247, 6, 6, 42, 6, 252, 253, + 256, 257, 149, 45, 6, 43, 113, 112, 45, 265, + 266, 113, 113, 269, 113, 6, 270, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 113, + 113, 178, 6, 112, 6, 45, 112, 45, 294, 112, + 112, 295, 332, 190, 307, 112, 110, 7, 110, 305, + 113, 112, 306, 112, 114, 345, 114, 347, 114, 112, + 7, 112, 325, 112, 10, 184, 94, 95, 164, 251, + 360, 314, 252, -1, 257, 253, 330, 367, -1, -1, + -1, -1, -1, 339, -1, -1, -1, -1, 351, -1, + 353, -1, 348, -1, -1, 242, -1, -1, -1, -1, + 247, -1, -1, -1, -1, 252, 253, 370, -1, -1, + -1, -1, -1, -1, -1, 378, -1, -1, -1, -1, + -1, -1, -1, 270, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, -1, 14, -1, 16, -1, 18, + -1, -1, -1, 22, 23, -1, -1, 26, 295, -1, + -1, 30, 31, 32, 33, -1, -1, -1, -1, 306, + -1, 40, 41, -1, -1, 44, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 330, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 77, 78, + -1, -1, -1, -1, 83, -1, 85, 86, 87, 88, + -1, -1, 91, 92, 93, 94, 95, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 107, 108, + 109, 110, -1, 112, 113, -1, -1, 116, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, -1, 14, + -1, 16, -1, 18, -1, -1, -1, 22, 23, -1, + -1, 26, -1, -1, -1, 30, 31, 32, 33, -1, + -1, -1, -1, -1, -1, 40, 41, -1, 57, 44, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, -1, -1, -1, -1, -1, -1, + -1, -1, 77, 78, -1, -1, -1, -1, 83, -1, + 85, 86, 87, 88, -1, -1, 91, 92, 93, 94, + 95, -1, -1, -1, -1, -1, 115, -1, -1, -1, + -1, -1, 107, 108, 109, 110, -1, 112, 113, -1, + -1, 116, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, -1, 14, -1, 16, -1, 18, -1, -1, + -1, 22, 23, -1, -1, 26, -1, -1, -1, 30, + 31, 32, 33, -1, -1, -1, -1, -1, -1, 40, + 41, -1, 57, 44, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, -1, -1, + -1, -1, -1, -1, -1, -1, 77, 78, -1, -1, + -1, -1, 83, -1, 85, 86, 87, 88, -1, -1, + 91, 92, 93, 94, 95, -1, -1, -1, -1, 114, + -1, -1, -1, -1, -1, -1, 107, 108, -1, 110, + 111, 112, 113, -1, -1, 116, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, -1, 16, + -1, 18, -1, -1, -1, 22, 23, -1, -1, 26, + -1, -1, -1, 30, 31, 32, 33, -1, -1, -1, + -1, -1, -1, 40, 41, -1, 57, 44, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, -1, -1, -1, -1, -1, -1, -1, -1, + 77, 78, -1, -1, -1, -1, 83, -1, 85, 86, + 87, 88, -1, -1, 91, 92, 93, 94, 95, -1, + -1, -1, -1, 114, -1, -1, -1, -1, -1, -1, + 107, 108, -1, 110, -1, 112, 113, -1, -1, 116, + 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + -1, 14, -1, 16, -1, 18, 19, -1, -1, 22, + 23, -1, -1, 26, -1, -1, -1, 30, 31, 32, + 33, -1, -1, -1, -1, -1, -1, 40, 41, -1, + 57, 44, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, -1, -1, -1, -1, + -1, -1, -1, -1, 77, 78, -1, -1, -1, -1, + 83, -1, 85, 86, 87, 88, -1, -1, 91, 92, + 93, 94, 95, -1, -1, -1, -1, 114, -1, -1, + -1, -1, -1, -1, 107, 108, -1, 110, -1, 112, + 113, -1, -1, 116, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, -1, 14, -1, 16, 17, 18, + -1, -1, -1, 22, 23, -1, -1, 26, -1, -1, + -1, 30, 31, 32, 33, -1, -1, -1, -1, -1, + -1, 40, 41, -1, 57, 44, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + -1, -1, -1, -1, -1, -1, -1, -1, 77, 78, + -1, -1, -1, -1, 83, -1, 85, 86, 87, 88, + -1, -1, 91, 92, 93, 94, 95, -1, -1, -1, + -1, 114, -1, -1, -1, -1, -1, -1, 107, 108, + -1, 110, -1, 112, 113, -1, -1, 116, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, -1, 14, + -1, 16, -1, 18, -1, -1, -1, 22, 23, -1, + -1, 26, -1, -1, -1, 30, 31, 32, 33, -1, + -1, -1, -1, -1, -1, 40, 41, -1, 57, 44, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, -1, -1, -1, -1, -1, -1, + -1, -1, 77, 78, -1, -1, -1, -1, 83, -1, + 85, 86, 87, 88, -1, -1, 91, 92, 93, 94, + 95, -1, -1, -1, -1, 114, -1, -1, -1, -1, + -1, -1, 107, 108, -1, 110, 111, 112, 113, -1, + -1, 116, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, -1, 14, -1, 16, -1, 18, -1, -1, + -1, 22, 23, -1, -1, 26, -1, -1, -1, 30, + 31, 32, 33, -1, -1, -1, -1, -1, -1, 40, + 41, -1, 57, 44, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, -1, -1, + -1, -1, -1, -1, -1, -1, 77, 78, -1, -1, + -1, -1, 83, -1, 85, 86, 87, 88, -1, -1, + 91, 92, 93, 94, 95, -1, -1, -1, -1, 114, + -1, -1, -1, -1, -1, -1, 107, 108, -1, 110, + 111, 112, 113, -1, -1, 116, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, -1, 14, 15, 16, + -1, 18, -1, -1, -1, 22, 23, -1, -1, 26, + -1, -1, -1, 30, 31, 32, 33, -1, -1, -1, + -1, -1, -1, 40, 41, -1, 57, 44, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, -1, -1, -1, -1, -1, -1, -1, -1, + 77, 78, -1, -1, -1, -1, 83, -1, 85, 86, + 87, 88, -1, -1, 91, 92, 93, 94, 95, -1, + -1, -1, -1, 114, -1, -1, -1, -1, -1, -1, + 107, 108, -1, 110, -1, 112, 113, -1, -1, 116, + 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + -1, 14, -1, 16, -1, 18, -1, -1, -1, 22, + 23, -1, -1, 26, -1, -1, -1, 30, 31, 32, + 33, -1, -1, -1, -1, -1, -1, 40, 41, -1, + 57, 44, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, -1, -1, -1, -1, + -1, -1, -1, -1, 77, 78, -1, -1, -1, -1, + 83, -1, 85, 86, 87, 88, -1, -1, 91, 92, + 93, 94, 95, -1, -1, 112, -1, -1, -1, -1, + -1, -1, -1, -1, 107, 108, -1, 110, -1, 112, + 113, -1, -1, 116, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, -1, 14, -1, 16, -1, 18, + -1, -1, -1, 22, 23, -1, -1, 26, -1, -1, + -1, 30, 31, -1, 33, -1, -1, -1, -1, -1, + -1, 40, 41, -1, -1, 44, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 58, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 77, 78, + -1, -1, -1, -1, 83, -1, 85, 86, 87, 88, + -1, -1, 91, 92, 93, 94, 95, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, + -1, 110, -1, 112, 113, -1, -1, 116, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, -1, 14, + -1, 16, -1, 18, -1, -1, -1, 22, 23, -1, + -1, 26, -1, -1, -1, 30, 31, -1, 33, -1, + -1, -1, -1, -1, -1, 40, 41, -1, -1, 44, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 58, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + -1, -1, 77, 78, -1, -1, -1, -1, 83, -1, + 85, 86, 87, 88, -1, -1, 91, 92, 93, 94, + 95, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 107, -1, -1, 110, -1, 112, 113, -1, + -1, 116, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, -1, 14, -1, 16, -1, 18, -1, -1, + -1, 22, 23, -1, -1, 26, -1, -1, -1, 30, + 31, -1, 33, -1, -1, -1, -1, -1, -1, 40, + 41, -1, -1, 44, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 58, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, -1, -1, 77, 78, -1, -1, + -1, -1, 83, -1, 85, 86, 87, 88, -1, -1, + 91, 92, 93, 94, 95, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 107, -1, -1, 110, + -1, 112, 113, -1, -1, 116, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, -1, 14, -1, 16, + -1, 18, -1, -1, -1, 22, 23, -1, -1, 26, + -1, -1, -1, 30, 31, -1, 33, -1, -1, -1, + -1, -1, -1, 40, 41, -1, -1, 44, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 58, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 77, 78, -1, -1, -1, -1, 83, -1, 85, 86, + 87, 88, -1, -1, 91, 92, 93, 94, 95, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 107, -1, -1, 110, -1, 112, 113, -1, -1, 116, + 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + -1, 14, -1, 16, -1, 18, -1, -1, -1, 22, + 23, -1, -1, 26, -1, -1, -1, 30, 31, -1, + 33, -1, -1, -1, -1, -1, -1, 40, 41, -1, + -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3, 4, 5, 6, + 7, -1, 9, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 77, 78, -1, -1, -1, -1, + 83, -1, 85, 86, 87, 88, -1, -1, 91, 92, + 93, 94, 95, 40, 41, -1, -1, 44, -1, -1, + -1, -1, -1, -1, 107, -1, -1, 110, -1, 112, + 113, -1, -1, 116, 3, 4, 5, 6, 7, -1, + 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 77, 78, -1, -1, -1, -1, 83, -1, 85, 86, + 87, 88, -1, -1, 91, 92, 93, 94, 95, -1, + -1, 40, 41, -1, -1, 44, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 112, 113, -1, -1, 116, + 3, 4, 5, 6, 7, -1, 9, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 77, 78, + -1, -1, -1, -1, 83, -1, 85, 86, 87, 88, + -1, -1, 91, 92, 93, 94, 95, 40, 41, -1, + -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 112, 113, -1, -1, 116, 3, 4, + 5, 6, 7, -1, 9, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 77, 78, -1, -1, -1, -1, + 83, -1, 85, 86, 87, 88, -1, -1, 91, 92, + 93, 94, 95, -1, -1, 40, 41, -1, -1, 44, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 112, + 113, -1, -1, 116, 3, 4, 5, 6, 7, -1, + 9, 66, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 77, 78, -1, -1, -1, -1, 83, -1, + 85, 86, 87, 88, -1, -1, 91, 92, 93, 94, + 95, 40, 41, -1, -1, 44, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 113, -1, + -1, 116, 3, 4, 5, 6, 7, -1, 9, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 77, 78, + -1, -1, -1, -1, 83, -1, 85, 86, 87, 88, + -1, -1, 91, 92, 93, 94, 95, -1, -1, 40, + 41, -1, -1, 44, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 113, 114, -1, 116, 3, 4, + 5, 6, 7, -1, 9, 66, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 77, 78, -1, -1, + -1, -1, 83, -1, 85, 86, 87, 88, -1, -1, + 91, 92, 93, 94, 95, 40, 41, -1, -1, 44, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 113, -1, -1, 116, 3, 4, 5, 6, + 7, 66, 9, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 77, 78, -1, -1, -1, -1, 83, -1, + 85, 86, 87, 88, -1, -1, 91, 92, 93, 94, + 95, -1, -1, 40, 41, -1, -1, 44, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 113, -1, + -1, 116, 3, 4, 5, 6, 7, -1, 9, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 77, 78, -1, -1, -1, -1, 83, -1, 85, 86, + 87, 88, -1, -1, 91, 92, 93, 94, 95, 40, + 41, -1, -1, 44, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 113, -1, 115, 116, + 3, 4, 5, 6, 7, 66, 9, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 77, 78, -1, -1, + -1, -1, 83, -1, 85, 86, 87, 88, -1, -1, + 91, 92, 93, 94, 95, -1, -1, 40, 41, -1, + -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 113, -1, -1, 116, 3, 4, 5, 6, + 7, -1, 9, 66, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 77, 78, -1, -1, -1, -1, + 83, -1, 85, 86, 87, 88, -1, -1, 91, 92, + 93, 94, 95, 40, 41, -1, -1, 44, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 113, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 77, 78, -1, -1, -1, -1, 83, -1, 85, 86, + 87, 88, -1, -1, 91, 92, 93, 94, 95, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 113, -1, 57, 116, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 57, -1, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + -1, -1, 57, 112, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 57, 112, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, -1, -1, 57, 112, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 111, -1, -1, -1, -1, -1, -1, -1, + -1, 39, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, + 111, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 57, -1, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 108, 118, 119, 0, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 14, 16, 18, 22, 23, + 26, 30, 31, 32, 33, 40, 41, 44, 77, 78, + 83, 85, 86, 87, 88, 91, 92, 93, 94, 95, + 107, 108, 109, 110, 112, 113, 116, 120, 121, 129, + 143, 144, 145, 146, 148, 42, 113, 123, 148, 113, + 149, 113, 121, 113, 113, 113, 113, 7, 125, 126, + 113, 113, 112, 148, 112, 148, 6, 66, 112, 148, + 113, 113, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 6, 144, 145, 144, 7, 127, 128, + 119, 119, 148, 110, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 94, 95, 38, 42, + 96, 110, 57, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 112, 6, 66, + 147, 148, 43, 112, 114, 148, 148, 12, 148, 123, + 135, 148, 6, 122, 43, 112, 124, 144, 148, 112, + 112, 130, 6, 112, 40, 144, 150, 151, 66, 148, + 152, 153, 38, 45, 43, 112, 109, 111, 114, 148, + 66, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 6, 6, 115, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 144, 43, 114, 148, 114, 114, 113, + 114, 112, 20, 45, 43, 114, 126, 43, 114, 114, + 113, 113, 113, 43, 114, 144, 39, 43, 114, 6, + 6, 143, 128, 111, 144, 113, 113, 115, 111, 58, + 66, 148, 121, 148, 58, 121, 138, 135, 144, 143, + 6, 58, 121, 144, 112, 58, 110, 139, 6, 131, + 132, 131, 150, 151, 45, 66, 148, 153, 147, 147, + 148, 144, 136, 114, 119, 112, 39, 114, 45, 119, + 112, 140, 112, 140, 43, 114, 7, 66, 114, 114, + 148, 144, 114, 114, 99, 100, 137, 112, 13, 135, + 66, 144, 58, 121, 134, 143, 19, 140, 27, 28, + 29, 141, 140, 111, 132, 110, 7, 110, 113, 121, + 112, 114, 144, 114, 119, 27, 112, 148, 58, 112, + 142, 111, 7, 66, 119, 119, 148, 58, 121, 133, + 114, 134, 17, 112, 119, 7, 111, 111, 114, 119, + 134, 112, 121, 15, 112 +}; + +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror ("syntax error: cannot back up");\ + YYERROR; \ + } \ +while (0) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (0) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (YYLEX_PARAM) +#else +# define YYLEX yylex () +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_stack_print (short int *bottom, short int *top) +#else +static void +yy_stack_print (bottom, top) + short int *bottom; + short int *top; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_reduce_print (int yyrule) +#else +static void +yy_reduce_print (yyrule) + int yyrule; +#endif +{ + int yyi; + unsigned int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", + yyrule - 1, yylno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + register const char *yys = yystr; + + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + register char *yyd = yydest; + register const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +#endif /* !YYERROR_VERBOSE */ + + + +#if YYDEBUG +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) +#else +static void +yysymprint (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyoutput, ")"); +} + +#endif /* ! YYDEBUG */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM); +# else +int yyparse (); +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + +/* The look-ahead symbol. */ +int yychar; + +/* The semantic value of the look-ahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM) +# else +int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ + + register int yystate; + register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Look-ahead token as an internal (translated) token number. */ + int yytoken = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short int yyssa[YYINITDEPTH]; + short int *yyss = yyssa; + register short int *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; + + + +#define YYPOPSTACK (yyvsp--, yyssp--) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ + int yylen; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + + yyvsp[0] = yylval; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short int *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyoverflowlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyoverflowlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + short int *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a look-ahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to look-ahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a look-ahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the look-ahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; + + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + yystate = yyn; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: +#line 142 "php_parser.y" + { g_syn_tree_top = (yyvsp[-1].syn_node); ;} + break; + + case 3: +#line 146 "php_parser.y" + { (yyval.syn_node) = add_statement_2_list((yyvsp[-1].syn_node), (yyvsp[0].syn_node)); ;} + break; + + case 4: +#line 147 "php_parser.y" + { (yyval.syn_node) = 0; ;} + break; + + case 6: +#line 153 "php_parser.y" + { (yyval.syn_node) = (yyvsp[-1].syn_node); ;} + break; + + case 8: +#line 159 "php_parser.y" + { (yyval.syn_node) = (yyvsp[-1].syn_node); ;} + break; + + case 9: +#line 160 "php_parser.y" + { (yyval.syn_node) = make_expr_syn_node(PHP_ST_EXPR, (yyvsp[-1].exp_node)); ;} + break; + + case 10: +#line 161 "php_parser.y" + { (yyval.syn_node) = 0; ;} + break; + + case 11: +#line 162 "php_parser.y" + { (yyval.syn_node) = (yyvsp[-1].syn_node); ;} + break; + + case 12: +#line 163 "php_parser.y" + { (yyval.syn_node) = make_ifelse_syn_node((yyvsp[-4].exp_node), (yyvsp[-2].syn_node), (yyvsp[-1].syn_node), (yyvsp[0].syn_node)); ;} + break; + + case 13: +#line 164 "php_parser.y" + { (yyval.syn_node) = make_while_loop_syn_node((yyvsp[-2].exp_node), (yyvsp[0].syn_node), 1); ;} + break; + + case 14: +#line 165 "php_parser.y" + { (yyval.syn_node) = make_while_loop_syn_node((yyvsp[-2].exp_node), (yyvsp[-5].syn_node), 0); ;} + break; + + case 15: +#line 166 "php_parser.y" + { (yyval.syn_node) = make_for_syn_node((yyvsp[-6].exp_node), (yyvsp[-4].exp_node), (yyvsp[-2].exp_node), (yyvsp[0].syn_node)); ;} + break; + + case 16: +#line 167 "php_parser.y" + { (yyval.syn_node) = make_switch_syn_node((yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 17: +#line 168 "php_parser.y" + { (yyval.syn_node) = make_expr_syn_node(PHP_ST_CONTINUE, 0); ;} + break; + + case 18: +#line 169 "php_parser.y" + { (yyval.syn_node) = make_expr_syn_node(PHP_ST_CONTINUE, (yyvsp[-1].exp_node)); ;} + break; + + case 19: +#line 170 "php_parser.y" + { (yyval.syn_node) = make_expr_syn_node(PHP_ST_BREAK, 0); ;} + break; + + case 20: +#line 171 "php_parser.y" + { (yyval.syn_node) = make_expr_syn_node(PHP_ST_BREAK, (yyvsp[-1].exp_node)); ;} + break; + + case 21: +#line 172 "php_parser.y" + { (yyval.syn_node) = make_expr_syn_node(PHP_ST_RET, 0); ;} + break; + + case 22: +#line 173 "php_parser.y" + { (yyval.syn_node) = make_expr_syn_node(PHP_ST_RET, (yyvsp[-1].exp_node)); ;} + break; + + case 23: +#line 174 "php_parser.y" + { (yyval.syn_node) = make_expr_syn_node(PHP_ST_ECHO, (yyvsp[-1].exp_node)); ;} + break; + + case 24: +#line 175 "php_parser.y" + { ;} + break; + + case 25: +#line 176 "php_parser.y" + { + (yyval.syn_node) = make_foreach_loop_syn_node((yyvsp[-4].exp_node), 0, (yyvsp[-2].exp_node), (yyvsp[0].syn_node), 0); + ;} + break; + + case 26: +#line 179 "php_parser.y" + { + (yyval.syn_node) = make_foreach_loop_syn_node((yyvsp[-6].exp_node), (yyvsp[-4].exp_node), (yyvsp[-2].exp_node), (yyvsp[0].syn_node), 0); + ;} + break; + + case 27: +#line 182 "php_parser.y" + { + (yyval.syn_node) = make_foreach_loop_syn_node((yyvsp[-7].exp_node), (yyvsp[-5].exp_node), (yyvsp[-2].exp_node), (yyvsp[0].syn_node), 1); + ;} + break; + + case 28: +#line 185 "php_parser.y" + { ;} + break; + + case 29: +#line 186 "php_parser.y" + { ;} + break; + + case 30: +#line 187 "php_parser.y" + { (yyval.syn_node) = 0; ;} + break; + + case 31: +#line 190 "php_parser.y" + { ;} + break; + + case 32: +#line 191 "php_parser.y" + { ;} + break; + + case 33: +#line 194 "php_parser.y" + { (yyval.exp_node) = make_exp_1(PHP_OP_LIST, 0); (yyval.exp_node)->exp_node = (yyvsp[0].exp_node); ;} + break; + + case 34: +#line 195 "php_parser.y" + { + PHP_EXP_NODE *last = (yyvsp[-2].exp_node); + while ( last->next) last = last->next; + last->next = make_exp_1(PHP_OP_LIST, 0); + last->next->exp_node = (yyvsp[0].exp_node); + (yyval.exp_node) = (yyvsp[-2].exp_node); + ;} + break; + + case 37: +#line 211 "php_parser.y" + { (yyval.syn_node) = 0; ;} + break; + + case 38: +#line 212 "php_parser.y" + { ;} + break; + + case 39: +#line 216 "php_parser.y" + { + const char *varname = get_scope_var_name(g_current_scope, (yyvsp[0].exp_node)->var_si_node->var); + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, varname); + PHP_SCOPE_ITEM *gsi = get_scope_item(g_global_scope, varname); + if ( gsi && (gsi->type == PHP_SCOPE_VAR) ) { + free_var_node(si->var); + php_exp_tree_free((yyvsp[0].exp_node)); + gsi->var->ref_count++; + si->var = gsi->var; + } else { + php_report_error(PHP_ERROR, "There is no such global var"); + } + ;} + break; + + case 40: +#line 231 "php_parser.y" + { (yyval.syn_node) = 0; ;} + break; + + case 41: +#line 232 "php_parser.y" + { ;} + break; + + case 42: +#line 235 "php_parser.y" + { (yyvsp[0].exp_node)->var_node->flags |= PHP_VARFLAG_STATIC; (yyval.exp_node) = (yyvsp[0].exp_node); ;} + break; + + case 43: +#line 236 "php_parser.y" + { + (yyvsp[-2].exp_node)->var_node->flags |= PHP_VARFLAG_STATIC; (yyval.exp_node) = (yyvsp[-2].exp_node); + value_value_assign(&(yyvsp[-2].exp_node)->var_node->value, &(yyvsp[0].exp_node)->val_node); + ;} + break; + + case 44: +#line 244 "php_parser.y" + { + switch_push_scope_table(make_scope_table()) + ;} + break; + + case 45: +#line 246 "php_parser.y" + { + (yyval.syn_node) = make_func_decl_syn_node((yyvsp[-7].str_val), (yyvsp[-4].exp_node)); + (yyval.syn_node)->func_decl->scope = g_current_scope; + (yyval.syn_node)->func_decl->is_native = 0; + (yyval.syn_node)->func_decl->code = (yyvsp[-1].syn_node); + switch_pop_scope_table(0); + add_func_2_scope(g_current_scope, (yyval.syn_node)); + (yyval.syn_node) = 0; + ;} + break; + + case 46: +#line 255 "php_parser.y" + { ;} + break; + + case 47: +#line 259 "php_parser.y" + { (yyval.exp_node) = make_func_param(0, (yyvsp[0].exp_node), (yyvsp[-1].str_val), 0); ;} + break; + + case 48: +#line 260 "php_parser.y" + { (yyval.exp_node) = make_func_param(0, (yyvsp[0].exp_node), (yyvsp[-2].str_val), 1); ;} + break; + + case 49: +#line 261 "php_parser.y" + { (yyval.exp_node) = make_func_param((yyvsp[-3].exp_node), (yyvsp[0].exp_node), (yyvsp[-1].str_val), 0); ;} + break; + + case 50: +#line 262 "php_parser.y" + { (yyval.exp_node) = make_func_param((yyvsp[-4].exp_node), (yyvsp[0].exp_node), (yyvsp[-2].str_val), 1); ;} + break; + + case 51: +#line 263 "php_parser.y" + { (yyval.exp_node) = 0; ;} + break; + + case 52: +#line 267 "php_parser.y" + { (yyval.str_val)[0] = 0; ;} + break; + + case 55: +#line 273 "php_parser.y" + { (yyval.syn_node) = (yyvsp[-2].syn_node); ;} + break; + + case 57: +#line 278 "php_parser.y" + { (yyval.syn_node) = (yyvsp[-2].syn_node); ;} + break; + + case 59: +#line 282 "php_parser.y" + { (yyval.exp_node) = 0; ;} + break; + + case 60: +#line 286 "php_parser.y" + { (yyval.syn_node) = add_branch_2_elseif((yyvsp[-5].syn_node), make_ifelse_syn_node((yyvsp[-2].exp_node), (yyvsp[0].syn_node), 0, 0)); ;} + break; + + case 61: +#line 287 "php_parser.y" + { (yyval.syn_node) = 0; ;} + break; + + case 62: +#line 291 "php_parser.y" + { (yyval.syn_node) = 0; ;} + break; + + case 63: +#line 292 "php_parser.y" + { (yyval.syn_node) = (yyvsp[0].syn_node); ;} + break; + + case 65: +#line 296 "php_parser.y" + { (yyval.syn_node) = (yyvsp[-2].syn_node); ;} + break; + + case 66: +#line 300 "php_parser.y" + { (yyval.exp_node) = (yyvsp[-1].exp_node); ;} + break; + + case 67: +#line 301 "php_parser.y" + { (yyval.exp_node) = (yyvsp[-1].exp_node); ;} + break; + + case 68: +#line 302 "php_parser.y" + { (yyval.exp_node) = (yyvsp[-2].exp_node); ;} + break; + + case 69: +#line 303 "php_parser.y" + { (yyval.exp_node) = (yyvsp[-2].exp_node); ;} + break; + + case 70: +#line 307 "php_parser.y" + { (yyval.exp_node) = 0; ;} + break; + + case 71: +#line 308 "php_parser.y" + { + (yyvsp[-2].exp_node)->tree_node.syn_right = (yyvsp[0].syn_node); + if ( (yyvsp[-3].exp_node) ) { + PHP_EXP_NODE *last = (yyvsp[-3].exp_node); + while ( last->next) last = last->next; + last->next = make_exp_1(PHP_OP_LIST, 0); + last->next->exp_node = (yyvsp[-2].exp_node); + (yyval.exp_node) = (yyvsp[-3].exp_node); + } else { + (yyval.exp_node) = make_exp_1(PHP_OP_LIST, 0); + (yyval.exp_node)->exp_node = (yyvsp[-2].exp_node); + } + ;} + break; + + case 72: +#line 323 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_LIST, (yyvsp[0].exp_node), 0); ;} + break; + + case 73: +#line 324 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_LIST, 0, 0); ;} + break; + + case 79: +#line 335 "php_parser.y" + { (yyval.exp_node) = make_known_const((yyvsp[0].str_val)); ;} + break; + + case 81: +#line 339 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_CLASS_DEREF, make_const_exp_str((yyvsp[-2].str_val), 0), make_const_exp_str((yyvsp[0].str_val), 0)); ;} + break; + + case 82: +#line 340 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_OBJECT_DEREF, (yyvsp[-2].exp_node), make_const_exp_str((yyvsp[0].str_val), 0)); ;} + break; + + case 84: +#line 345 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_ARRAY_BY_KEY, (yyvsp[-2].exp_node), 0); ;} + break; + + case 85: +#line 346 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_ARRAY_BY_KEY, (yyvsp[-3].exp_node), (yyvsp[-1].exp_node));;} + break; + + case 86: +#line 347 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_ARRAY_BY_KEY, (yyvsp[-3].exp_node), (yyvsp[-1].exp_node));;} + break; + + case 87: +#line 348 "php_parser.y" + { (yyval.exp_node) = make_exp_1(PHP_OP_VAR_BY_EXP, (yyvsp[-1].exp_node)); ;} + break; + + case 88: +#line 352 "php_parser.y" + { (yyval.exp_node) = make_func_call_exp((yyvsp[-3].str_val), (yyvsp[-1].exp_node)); ;} + break; + + case 89: +#line 353 "php_parser.y" + { ;} + break; + + case 90: +#line 354 "php_parser.y" + { ;} + break; + + case 91: +#line 357 "php_parser.y" + { (yyval.exp_node) = make_func_call_param_list(); func_call_add_expr((yyval.exp_node)->var_node, (yyvsp[0].exp_node), 0); ;} + break; + + case 92: +#line 358 "php_parser.y" + { (yyval.exp_node) = make_func_call_param_list(); func_call_add_expr((yyval.exp_node)->var_node, (yyvsp[0].exp_node), 1); ;} + break; + + case 93: +#line 359 "php_parser.y" + { (yyval.exp_node) = (yyvsp[-2].exp_node); func_call_add_expr((yyval.exp_node)->var_node, (yyvsp[0].exp_node), 0); ;} + break; + + case 94: +#line 360 "php_parser.y" + { (yyval.exp_node) = (yyvsp[-3].exp_node); func_call_add_expr((yyval.exp_node)->var_node, (yyvsp[0].exp_node), 1); ;} + break; + + case 95: +#line 361 "php_parser.y" + { (yyval.exp_node) = make_func_call_param_list(); ;} + break; + + case 96: +#line 366 "php_parser.y" + { ;} + break; + + case 98: +#line 368 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_ASS, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 99: +#line 369 "php_parser.y" + { (yyval.exp_node) = (yyvsp[0].exp_node); ;} + break; + + case 100: +#line 370 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_MAKE_REF, (yyvsp[-3].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 101: +#line 375 "php_parser.y" + { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[-2].exp_node), make_exp_2(PHP_OP_ADD, (yyvsp[-2].exp_node), (yyvsp[0].exp_node))); ;} + break; + + case 102: +#line 376 "php_parser.y" + { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[-2].exp_node), make_exp_2(PHP_OP_SUB, (yyvsp[-2].exp_node), (yyvsp[0].exp_node))); ;} + break; + + case 103: +#line 377 "php_parser.y" + { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[-2].exp_node), make_exp_2(PHP_OP_MUL, (yyvsp[-2].exp_node), (yyvsp[0].exp_node))); ;} + break; + + case 104: +#line 378 "php_parser.y" + { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[-2].exp_node), make_exp_2(PHP_OP_DIV, (yyvsp[-2].exp_node), (yyvsp[0].exp_node))); ;} + break; + + case 105: +#line 379 "php_parser.y" + { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[-2].exp_node), make_exp_2(PHP_OP_CAT, (yyvsp[-2].exp_node), (yyvsp[0].exp_node))); ;} + break; + + case 106: +#line 380 "php_parser.y" + { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[-2].exp_node), make_exp_2(PHP_OP_REM, (yyvsp[-2].exp_node), (yyvsp[0].exp_node))); ;} + break; + + case 107: +#line 381 "php_parser.y" + { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[-2].exp_node), make_exp_2(PHP_OP_AND, (yyvsp[-2].exp_node), (yyvsp[0].exp_node))); ;} + break; + + case 108: +#line 382 "php_parser.y" + { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[-2].exp_node), make_exp_2(PHP_OP_OR, (yyvsp[-2].exp_node), (yyvsp[0].exp_node))); ;} + break; + + case 109: +#line 383 "php_parser.y" + { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[-2].exp_node), make_exp_2(PHP_OP_XOR, (yyvsp[-2].exp_node), (yyvsp[0].exp_node))); ;} + break; + + case 110: +#line 384 "php_parser.y" + { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[-2].exp_node), make_exp_2(PHP_OP_SHL, (yyvsp[-2].exp_node), (yyvsp[0].exp_node))); ;} + break; + + case 111: +#line 385 "php_parser.y" + { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[-2].exp_node), make_exp_2(PHP_OP_SHR, (yyvsp[-2].exp_node), (yyvsp[0].exp_node))); ;} + break; + + case 112: +#line 387 "php_parser.y" + { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[-1].exp_node), make_exp_2(PHP_OP_ADD, (yyvsp[-1].exp_node), make_const_exp_dnum(1))); ;} + break; + + case 113: +#line 388 "php_parser.y" + { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[0].exp_node), make_exp_2(PHP_OP_ADD, (yyvsp[0].exp_node), make_const_exp_dnum(1))); ;} + break; + + case 114: +#line 389 "php_parser.y" + { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[-1].exp_node), make_exp_2(PHP_OP_SUB, (yyvsp[-1].exp_node), make_const_exp_dnum(1))); ;} + break; + + case 115: +#line 390 "php_parser.y" + { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[0].exp_node), make_exp_2(PHP_OP_SUB, (yyvsp[0].exp_node), make_const_exp_dnum(1))); ;} + break; + + case 116: +#line 392 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_LOG_OR, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 117: +#line 393 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_LOG_AND, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 118: +#line 394 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_LOG_OR, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 119: +#line 395 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_LOG_AND, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 120: +#line 396 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_LOG_XOR, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 121: +#line 397 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_OR, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 122: +#line 398 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_AND, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 123: +#line 399 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_XOR, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 124: +#line 400 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_CAT, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 125: +#line 401 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_ADD, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 126: +#line 402 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_SUB, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 127: +#line 403 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_MUL, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 128: +#line 404 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_DIV, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 129: +#line 405 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_REM, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 130: +#line 406 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_SHL, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 131: +#line 407 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_SHR, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 132: +#line 408 "php_parser.y" + { (yyval.exp_node) = (yyvsp[0].exp_node); ;} + break; + + case 133: +#line 409 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_SUB, make_const_exp_dnum(0), (yyvsp[0].exp_node)); ;} + break; + + case 134: +#line 410 "php_parser.y" + { (yyval.exp_node) = make_exp_1(PHP_OP_LOG_NOT, (yyvsp[0].exp_node)); ;} + break; + + case 135: +#line 411 "php_parser.y" + { (yyval.exp_node) = make_exp_1(PHP_OP_NOT, (yyvsp[0].exp_node)); ;} + break; + + case 136: +#line 412 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_SAME, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 137: +#line 413 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_NOT_SAME, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 138: +#line 414 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_EQ, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 139: +#line 415 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_NEQ, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 140: +#line 416 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_LWR, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 141: +#line 417 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_LWR_EQ, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 142: +#line 418 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_GRT, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 143: +#line 419 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_GRT_EQ, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 144: +#line 420 "php_parser.y" + { (yyval.exp_node) = (yyvsp[-1].exp_node); ;} + break; + + case 145: +#line 421 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_MUX, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); (yyval.exp_node)->exp_node = (yyvsp[-4].exp_node); ;} + break; + + case 146: +#line 422 "php_parser.y" + { (yyval.exp_node) = make_exp_1(PHP_OP_CAST_INT, (yyvsp[0].exp_node)); ;} + break; + + case 147: +#line 423 "php_parser.y" + { (yyval.exp_node) = make_exp_1(PHP_OP_CAST_FLOAT, (yyvsp[0].exp_node)); ;} + break; + + case 148: +#line 424 "php_parser.y" + { (yyval.exp_node) = make_exp_1(PHP_OP_CAST_STR, (yyvsp[0].exp_node)); ;} + break; + + case 149: +#line 425 "php_parser.y" + { (yyval.exp_node) = make_exp_1(PHP_OP_CAST_BOOL, (yyvsp[0].exp_node)); ;} + break; + + case 150: +#line 428 "php_parser.y" + { ;} + break; + + case 151: +#line 429 "php_parser.y" + { ;} + break; + + case 152: +#line 430 "php_parser.y" + { (yyval.exp_node) = (yyvsp[0].exp_node); ;} + break; + + case 153: +#line 432 "php_parser.y" + { (yyval.exp_node) = (yyvsp[0].exp_node); ;} + break; + + case 154: +#line 433 "php_parser.y" + { (yyval.exp_node) = make_exp_1(PHP_OP_ARRAY, (yyvsp[-1].exp_node)); ;} + break; + + case 155: +#line 434 "php_parser.y" + { (yyval.exp_node) = make_exp_1(PHP_OP_PRINT, (yyvsp[0].exp_node)); ;} + break; + + case 156: +#line 437 "php_parser.y" + { (yyval.exp_node) = (yyvsp[-1].exp_node); ;} + break; + + case 157: +#line 438 "php_parser.y" + { (yyval.exp_node) = 0; ;} + break; + + case 158: +#line 439 "php_parser.y" + { (yyval.exp_node) = 0; ;} + break; + + case 161: +#line 447 "php_parser.y" + { /*$$ = make_assign_node($1);*/ ;} + break; + + case 162: +#line 448 "php_parser.y" + { (yyval.exp_node) = (yyvsp[-1].exp_node); ;} + break; + + case 163: +#line 449 "php_parser.y" + { /*$$ = make_assign_node(0);*/ ;} + break; + + case 164: +#line 452 "php_parser.y" + { (yyval.exp_node) = make_exp_1(PHP_OP_LIST, 0); (yyval.exp_node)->exp_node = (yyvsp[0].exp_node); ;} + break; + + case 165: +#line 453 "php_parser.y" + { + PHP_EXP_NODE *last = (yyvsp[-2].exp_node); + while ( last->next) last = last->next; + last->next = make_exp_1(PHP_OP_LIST, 0); + last->next->exp_node = (yyvsp[0].exp_node); + (yyval.exp_node) = (yyvsp[-2].exp_node); + ;} + break; + + case 166: +#line 462 "php_parser.y" + { (yyval.exp_node) = make_exp_1(PHP_OP_ARRAY_PAIR, (yyvsp[0].exp_node)); ;} + break; + + case 167: +#line 463 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_ARRAY_PAIR, (yyvsp[-2].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 168: +#line 464 "php_parser.y" + { (yyval.exp_node) = make_exp_2(PHP_OP_ARRAY_REF_PAIR, (yyvsp[-3].exp_node), (yyvsp[0].exp_node)); ;} + break; + + case 169: +#line 465 "php_parser.y" + { (yyval.exp_node) = make_exp_1(PHP_OP_ARRAY_REF_PAIR, (yyvsp[0].exp_node)); ;} + break; + + + } + +/* Line 1037 of yacc.c. */ +#line 2942 "php_parser.c" + + yyvsp -= yylen; + yyssp -= yylen; + + + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (YYPACT_NINF < yyn && yyn < YYLAST) + { + YYSIZE_T yysize = 0; + int yytype = YYTRANSLATE (yychar); + const char* yyprefix; + char *yymsg; + int yyx; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 0; + + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]); + yycount += 1; + if (yycount == 5) + { + yysize = 0; + break; + } + } + yysize += (sizeof ("syntax error, unexpected ") + + yystrlen (yytname[yytype])); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) + { + char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); + + if (yycount < 5) + { + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yyp = yystpcpy (yyp, yyprefix); + yyp = yystpcpy (yyp, yytname[yyx]); + yyprefix = " or "; + } + } + yyerror (yymsg); + YYSTACK_FREE (yymsg); + } + else + yyerror ("syntax error; also virtual memory exhausted"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror ("syntax error"); + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse look-ahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* If at end of input, pop the error token, + then the rest of the stack, then return failure. */ + if (yychar == YYEOF) + for (;;) + { + + YYPOPSTACK; + if (yyssp == yyss) + YYABORT; + yydestruct ("Error: popping", + yystos[*yyssp], yyvsp); + } + } + else + { + yydestruct ("Error: discarding", yytoken, &yylval); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse look-ahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + +#ifdef __GNUC__ + /* Pacify GCC when the user code never invokes YYERROR and the label + yyerrorlab therefore never appears in user code. */ + if (0) + goto yyerrorlab; +#endif + +yyvsp -= yylen; + yyssp -= yylen; + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", yystos[yystate], yyvsp); + YYPOPSTACK; + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + *++yyvsp = yylval; + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yydestruct ("Error: discarding lookahead", + yytoken, &yylval); + yychar = YYEMPTY; + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*----------------------------------------------. +| yyoverflowlab -- parser overflow comes here. | +`----------------------------------------------*/ +yyoverflowlab: + yyerror ("parser stack overflow"); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + return yyresult; +} + + + diff --git a/src/webserver/src/php_parser.h b/src/webserver/src/php_parser.h new file mode 100644 index 00000000..af37de72 --- /dev/null +++ b/src/webserver/src/php_parser.h @@ -0,0 +1,233 @@ +/* A Bison parser, made by GNU Bison 2.0. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + 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, 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. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + FNUMBER = 258, + DNUMBER = 259, + STRING = 260, + IDENT = 261, + VARIABLE = 262, + ECHO = 263, + EXIT = 264, + IF = 265, + DO = 266, + WHILE = 267, + ENDWHILE = 268, + FOR = 269, + ENDFOR = 270, + FOREACH = 271, + ENDFOREACH = 272, + DECLARE = 273, + ENDDECLARE = 274, + AS = 275, + CONST = 276, + GLOBAL = 277, + UNSET = 278, + ISSET = 279, + EMPTY = 280, + SWITCH = 281, + ENDSWITCH = 282, + CASE = 283, + DEFAULT = 284, + BREAK = 285, + CONTINUE = 286, + FUNCTION = 287, + RETURN = 288, + CLASS = 289, + INTERFACE = 290, + EXTENDS = 291, + IMPLEMENTS = 292, + OBJECT_OPERATOR = 293, + HASH_ASSIGN = 294, + LIST = 295, + ARRAY = 296, + CLASS_SCOPE = 297, + PRINT = 298, + SR_EQ = 299, + SL_EQ = 300, + XOR_EQ = 301, + OR_EQ = 302, + AND_EQ = 303, + MOD_EQ = 304, + CONCAT_EQ = 305, + DIV_EQ = 306, + MUL_EQ = 307, + MINUS_EQ = 308, + PLUS_EQ = 309, + LOG_OR = 310, + LOG_XOR = 311, + LOG_AND = 312, + BOOLEAN_OR = 313, + BOOLEAN_AND = 314, + IS_NOIDENTICAL = 315, + IS_IDENTICAL = 316, + IS_NOEQUAL = 317, + IS_EQ = 318, + IS_GREATER_OR_EQ = 319, + IS_SMALLER_OR_EQ = 320, + SR = 321, + SL = 322, + INSTANCEOF = 323, + UNSET_CAST = 324, + BOOL_CAST = 325, + OBJECT_CAST = 326, + ARRAY_CAST = 327, + STRING_CAST = 328, + DOUBLE_CAST = 329, + INT_CAST = 330, + DEC = 331, + INC = 332, + CLONE = 333, + NEW = 334, + ELSEIF = 335, + ELSE = 336, + ENDIF = 337, + PUBLIC = 338, + PROTECTED = 339, + PRIVATE = 340, + FINAL = 341, + ABSTRACT = 342, + STATIC = 343, + START_SCRIPT = 344, + END_SCRIPT = 345 + }; +#endif +#define FNUMBER 258 +#define DNUMBER 259 +#define STRING 260 +#define IDENT 261 +#define VARIABLE 262 +#define ECHO 263 +#define EXIT 264 +#define IF 265 +#define DO 266 +#define WHILE 267 +#define ENDWHILE 268 +#define FOR 269 +#define ENDFOR 270 +#define FOREACH 271 +#define ENDFOREACH 272 +#define DECLARE 273 +#define ENDDECLARE 274 +#define AS 275 +#define CONST 276 +#define GLOBAL 277 +#define UNSET 278 +#define ISSET 279 +#define EMPTY 280 +#define SWITCH 281 +#define ENDSWITCH 282 +#define CASE 283 +#define DEFAULT 284 +#define BREAK 285 +#define CONTINUE 286 +#define FUNCTION 287 +#define RETURN 288 +#define CLASS 289 +#define INTERFACE 290 +#define EXTENDS 291 +#define IMPLEMENTS 292 +#define OBJECT_OPERATOR 293 +#define HASH_ASSIGN 294 +#define LIST 295 +#define ARRAY 296 +#define CLASS_SCOPE 297 +#define PRINT 298 +#define SR_EQ 299 +#define SL_EQ 300 +#define XOR_EQ 301 +#define OR_EQ 302 +#define AND_EQ 303 +#define MOD_EQ 304 +#define CONCAT_EQ 305 +#define DIV_EQ 306 +#define MUL_EQ 307 +#define MINUS_EQ 308 +#define PLUS_EQ 309 +#define LOG_OR 310 +#define LOG_XOR 311 +#define LOG_AND 312 +#define BOOLEAN_OR 313 +#define BOOLEAN_AND 314 +#define IS_NOIDENTICAL 315 +#define IS_IDENTICAL 316 +#define IS_NOEQUAL 317 +#define IS_EQ 318 +#define IS_GREATER_OR_EQ 319 +#define IS_SMALLER_OR_EQ 320 +#define SR 321 +#define SL 322 +#define INSTANCEOF 323 +#define UNSET_CAST 324 +#define BOOL_CAST 325 +#define OBJECT_CAST 326 +#define ARRAY_CAST 327 +#define STRING_CAST 328 +#define DOUBLE_CAST 329 +#define INT_CAST 330 +#define DEC 331 +#define INC 332 +#define CLONE 333 +#define NEW 334 +#define ELSEIF 335 +#define ELSE 336 +#define ENDIF 337 +#define PUBLIC 338 +#define PROTECTED 339 +#define PRIVATE 340 +#define FINAL 341 +#define ABSTRACT 342 +#define STATIC 343 +#define START_SCRIPT 344 +#define END_SCRIPT 345 + + + + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 67 "php_parser.y" +typedef union YYSTYPE { + PHP_SYN_NODE *syn_node; + PHP_EXP_NODE *exp_node; + + char str_val[256]; +} YYSTYPE; +/* Line 1318 of yacc.c. */ +#line 224 "php_parser.h" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + +extern YYSTYPE yylval; + + + +// File_checked_for_headers diff --git a/src/webserver/src/php_parser.y b/src/webserver/src/php_parser.y new file mode 100644 index 00000000..4cb9639f --- /dev/null +++ b/src/webserver/src/php_parser.y @@ -0,0 +1,468 @@ +%{ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2006 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (C) 2005-2006Froenchenko Leonid ( lfroen@amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include +#include + +#include "php_syntree.h" + +int yylex(); + +// add item to syntree list +PHP_SYN_NODE *add_statement_2_list(PHP_SYN_NODE *list, PHP_SYN_NODE *st) +{ + if ( st && list) { + PHP_SYN_NODE *last = list; + while ( last->next_node ) { + last = last->next_node; + } + last->next_node = st; + return list; + } else if ( st ) { + return st; + } else { + return list; + } +} + +PHP_SYN_NODE *add_branch_2_elseif(PHP_SYN_NODE *list, PHP_SYN_NODE *branch) +{ + if ( list ) { + PHP_SYN_NODE *curr_if = list; + while ( curr_if->node_if.code_else ) { + curr_if = curr_if->node_if.code_else; + } + curr_if->node_if.code_else = branch; + return list; + } else { + return branch; + } +} + +%} + +%union { + PHP_SYN_NODE *syn_node; + PHP_EXP_NODE *exp_node; + + char str_val[256]; +} + +%type program_tree statement top_statement function_decl_statement top_statement_list +%type global_var_list static_var_list +%type while_statement foreach_statement for_statement elseif_list else_statement + +%type VARIABLE variable deref_variable global_var static_var +%type parameter_list array_pair_list array_elem +%type switch_case_list case_list case_list_item + +%type expr expr_list for_expr exit_expr const_value function_call func_param_list assignment_list assignment_list_element +%type FNUMBER DNUMBER STRING + +%type IDENT optional_class_type + +/* + All my tokens +*/ +%token FNUMBER DNUMBER STRING IDENT VARIABLE + +%token ECHO +%token EXIT + +%token IF DO WHILE ENDWHILE FOR ENDFOR FOREACH ENDFOREACH + +%token DECLARE ENDDECLARE AS CONST GLOBAL UNSET ISSET EMPTY + +%token SWITCH ENDSWITCH CASE DEFAULT BREAK CONTINUE +%token FUNCTION RETURN +%token CLASS INTERFACE EXTENDS IMPLEMENTS OBJECT_OPERATOR +%token HASH_ASSIGN LIST ARRAY + +%token CLASS_SCOPE + +/* + Things with precedence +*/ +%left ',' +%right PRINT +%left '=' PLUS_EQ MINUS_EQ MUL_EQ DIV_EQ CONCAT_EQ MOD_EQ AND_EQ OR_EQ XOR_EQ SL_EQ SR_EQ +%left '?' ':' +%left LOG_OR +%left LOG_XOR +%left LOG_AND +%left BOOLEAN_OR +%left BOOLEAN_AND +%left '|' +%left '^' +%left '&' +%nonassoc IS_EQ IS_NOEQUAL IS_IDENTICAL IS_NOIDENTICAL +%nonassoc '<' IS_SMALLER_OR_EQ '>' IS_GREATER_OR_EQ +%left SL SR +%left '+' '-' '.' +%left '*' '/' '%' +%right '!' +%nonassoc INSTANCEOF +%right '~' INC DEC INT_CAST DOUBLE_CAST STRING_CAST ARRAY_CAST OBJECT_CAST BOOL_CAST UNSET_CAST '@' +%right '[' +%nonassoc NEW CLONE + +%left ELSEIF +%left ELSE +%left ENDIF + +%right STATIC ABSTRACT FINAL PRIVATE PROTECTED PUBLIC + +%token START_SCRIPT END_SCRIPT + +%% /* Rules */ + +program_tree: START_SCRIPT top_statement_list END_SCRIPT { g_syn_tree_top = $2; } +; + +top_statement_list: + top_statement_list top_statement { $$ = add_statement_2_list($1, $2); } + | /* empty */ { $$ = 0; } +; + + +top_statement: + statement + | START_SCRIPT top_statement_list END_SCRIPT { $$ = $2; } + | function_decl_statement +/* | class_decl_statement */ +; + +statement: + '{' top_statement_list '}' { $$ = $2; } + | expr ';' { $$ = make_expr_syn_node(PHP_ST_EXPR, $1); } + | GLOBAL global_var_list ';' { $$ = 0; } + | STATIC static_var_list ';' { $$ = $2; } + | IF '(' expr ')' statement elseif_list else_statement { $$ = make_ifelse_syn_node($3, $5, $6, $7); } + | WHILE '(' expr ')' while_statement { $$ = make_while_loop_syn_node($3, $5, 1); } + | DO statement WHILE '(' expr ')' ';' { $$ = make_while_loop_syn_node($5, $2, 0); } + | FOR '(' for_expr ';' for_expr ';' for_expr ')' for_statement { $$ = make_for_syn_node($3, $5, $7, $9); } + | SWITCH '(' expr ')' switch_case_list { $$ = make_switch_syn_node($3, $5); } + | CONTINUE ';' { $$ = make_expr_syn_node(PHP_ST_CONTINUE, 0); } + | CONTINUE expr ';' { $$ = make_expr_syn_node(PHP_ST_CONTINUE, $2); } + | BREAK ';' { $$ = make_expr_syn_node(PHP_ST_BREAK, 0); } + | BREAK expr ';' { $$ = make_expr_syn_node(PHP_ST_BREAK, $2); } + | RETURN ';' { $$ = make_expr_syn_node(PHP_ST_RET, 0); } + | RETURN expr ';' { $$ = make_expr_syn_node(PHP_ST_RET, $2); } + | ECHO expr_list ';' { $$ = make_expr_syn_node(PHP_ST_ECHO, $2); } + | UNSET '(' variable_list ')' ';' { } + | FOREACH '(' expr AS variable ')' foreach_statement { + $$ = make_foreach_loop_syn_node($3, 0, $5, $7, 0); + } + | FOREACH '(' expr AS variable HASH_ASSIGN variable ')' foreach_statement { + $$ = make_foreach_loop_syn_node($3, $5, $7, $9, 0); + } + | FOREACH '(' expr AS variable HASH_ASSIGN '&' variable ')' foreach_statement { + $$ = make_foreach_loop_syn_node($3, $5, $8, $10, 1); + } + | DECLARE '(' decl_list ')' statement { } + | DECLARE '(' decl_list ')' ':' top_statement_list ENDDECLARE { } + | ';' { $$ = 0; } +; + +decl_list: IDENT '=' const_value { } + | decl_list ',' IDENT '=' const_value { } +; + +expr_list: expr { $$ = make_exp_1(PHP_OP_LIST, 0); $$->exp_node = $1; } + | expr_list ',' expr { + PHP_EXP_NODE *last = $1; + while ( last->next) last = last->next; + last->next = make_exp_1(PHP_OP_LIST, 0); + last->next->exp_node = $3; + $$ = $1; + } +; + +variable_list: variable + | variable_list ',' variable +; + +/* + This IS implemented. global_var/static itself initialize ptrs as needed +*/ +global_var_list: global_var { $$ = 0; } + | global_var_list ',' global_var { } +; + + +global_var: VARIABLE { + const char *varname = get_scope_var_name(g_current_scope, $1->var_si_node->var); + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, varname); + PHP_SCOPE_ITEM *gsi = get_scope_item(g_global_scope, varname); + if ( gsi && (gsi->type == PHP_SCOPE_VAR) ) { + free_var_node(si->var); + php_exp_tree_free($1); + gsi->var->ref_count++; + si->var = gsi->var; + } else { + php_report_error(PHP_ERROR, "There is no such global var"); + } + } +; + +static_var_list: static_var { $$ = 0; } + | static_var_list ',' static_var { } +; + +static_var : VARIABLE { $1->var_node->flags |= PHP_VARFLAG_STATIC; $$ = $1; } + | VARIABLE '=' const_value { + $1->var_node->flags |= PHP_VARFLAG_STATIC; $$ = $1; + value_value_assign(&$1->var_node->value, &$3->val_node); + } +; + + +function_decl_statement: + FUNCTION IDENT { + switch_push_scope_table(make_scope_table()) + } '(' parameter_list ')' '{' top_statement_list '}' { + $$ = make_func_decl_syn_node($2, $5); + $$->func_decl->scope = g_current_scope; + $$->func_decl->is_native = 0; + $$->func_decl->code = $8; + switch_pop_scope_table(0); + add_func_2_scope(g_current_scope, $$); + $$ = 0; + } + | FUNCTION '&' IDENT '(' parameter_list ')' '{' top_statement_list '}' { } +; + +parameter_list: + optional_class_type VARIABLE { $$ = make_func_param(0, $2, $1, 0); } + | optional_class_type '&' VARIABLE { $$ = make_func_param(0, $3, $1, 1); } + | parameter_list ',' optional_class_type VARIABLE { $$ = make_func_param($1, $4, $3, 0); } + | parameter_list ',' optional_class_type '&' VARIABLE { $$ = make_func_param($1, $5, $3, 1); } + | /* empty */ { $$ = 0; } +; + +optional_class_type: + /* empty */ { $$[0] = 0; } + | IDENT +; + + +for_statement: statement + | ':' top_statement_list ENDFOR ';' { $$ = $2; } +; + + +foreach_statement: statement + | ':' top_statement_list ENDFOREACH ';' { $$ = $2; } +; + +for_expr: expr_list + | /* empty */ { $$ = 0; } +; + +elseif_list: + elseif_list ELSEIF '(' expr ')' statement { $$ = add_branch_2_elseif($1, make_ifelse_syn_node($4, $6, 0, 0)); } + | /* empty */ { $$ = 0; } +; + +else_statement: + /* empty */ { $$ = 0; } + | ELSE statement { $$ = $2; } +; + +while_statement: statement + | ':' top_statement_list ENDWHILE ';' { $$ = $2; } +; + +switch_case_list: + '{' case_list '}' { $$ = $2; } + | '{' ';' case_list '}' { $$ = $3; } + | ':' case_list ENDSWITCH ';' { $$ = $2; } + | ':' ';' case_list ENDSWITCH ';' { $$ = $3; } +; + +case_list: + /* empty */ { $$ = 0; } + | case_list case_list_item case_separator top_statement_list { + $2->tree_node.syn_right = $4; + if ( $1 ) { + PHP_EXP_NODE *last = $1; + while ( last->next) last = last->next; + last->next = make_exp_1(PHP_OP_LIST, 0); + last->next->exp_node = $2; + $$ = $1; + } else { + $$ = make_exp_1(PHP_OP_LIST, 0); + $$->exp_node = $2; + } + } +; + +case_list_item: CASE expr { $$ = make_exp_2(PHP_OP_LIST, $2, 0); } + | DEFAULT { $$ = make_exp_2(PHP_OP_LIST, 0, 0); } +; + +case_separator: ':' + | ';' +; + +const_value: + FNUMBER + | DNUMBER + | STRING + | IDENT { $$ = make_known_const($1); } +; + +variable: deref_variable + | IDENT CLASS_SCOPE IDENT { $$ = make_exp_2(PHP_OP_CLASS_DEREF, make_const_exp_str($1, 0), make_const_exp_str($3, 0)); } + | deref_variable OBJECT_OPERATOR IDENT { $$ = make_exp_2(PHP_OP_OBJECT_DEREF, $1, make_const_exp_str($3, 0)); } +; + + +deref_variable: VARIABLE + | deref_variable '[' ']' { $$ = make_exp_2(PHP_OP_ARRAY_BY_KEY, $1, 0); } + | deref_variable '[' expr ']' { $$ = make_exp_2(PHP_OP_ARRAY_BY_KEY, $1, $3);} + | deref_variable '{' expr '}' { $$ = make_exp_2(PHP_OP_ARRAY_BY_KEY, $1, $3);} + | '$' '{' expr '}' { $$ = make_exp_1(PHP_OP_VAR_BY_EXP, $3); } +; + +function_call: + IDENT '(' func_param_list ')' { $$ = make_func_call_exp($1, $3); } + | deref_variable CLASS_SCOPE IDENT '(' func_param_list ')' { } + | deref_variable OBJECT_OPERATOR IDENT '(' func_param_list ')' { } +; + +func_param_list: expr { $$ = make_func_call_param_list(); func_call_add_expr($$->var_node, $1, 0); } + | '&' variable { $$ = make_func_call_param_list(); func_call_add_expr($$->var_node, $2, 1); } + | func_param_list ',' expr { $$ = $1; func_call_add_expr($$->var_node, $3, 0); } + | func_param_list ',' '&' variable { $$ = $1; func_call_add_expr($$->var_node, $4, 1); } + | /* empty */ { $$ = make_func_call_param_list(); } +; + + +expr: + LIST '(' assignment_list ')' '=' expr { } + | variable + | variable '=' expr { $$ = make_exp_2(PHP_OP_ASS, $1, $3); } + | function_call { $$ = $1; } + | variable '=' '&' variable { $$ = make_exp_2(PHP_MAKE_REF, $1, $4); } +/* + | NEW class_name_reference ctor_arguments { } + | CLONE expr { } +*/ + | variable PLUS_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_ADD, $1, $3)); } + | variable MINUS_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_SUB, $1, $3)); } + | variable MUL_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_MUL, $1, $3)); } + | variable DIV_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_DIV, $1, $3)); } + | variable CONCAT_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_CAT, $1, $3)); } + | variable MOD_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_REM, $1, $3)); } + | variable AND_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_AND, $1, $3)); } + | variable OR_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_OR, $1, $3)); } + | variable XOR_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_XOR, $1, $3)); } + | variable SL_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_SHL, $1, $3)); } + | variable SR_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_SHR, $1, $3)); } + /* ++var and var++ looks same to me */ + | variable INC { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_ADD, $1, make_const_exp_dnum(1))); } + | INC variable { $$ = make_exp_2_self(PHP_OP_ASS, $2, make_exp_2(PHP_OP_ADD, $2, make_const_exp_dnum(1))); } + | variable DEC { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_SUB, $1, make_const_exp_dnum(1))); } + | DEC variable { $$ = make_exp_2_self(PHP_OP_ASS, $2, make_exp_2(PHP_OP_SUB, $2, make_const_exp_dnum(1))); } + + | expr BOOLEAN_OR expr { $$ = make_exp_2(PHP_OP_LOG_OR, $1, $3); } + | expr BOOLEAN_AND expr { $$ = make_exp_2(PHP_OP_LOG_AND, $1, $3); } + | expr LOG_OR expr { $$ = make_exp_2(PHP_OP_LOG_OR, $1, $3); } + | expr LOG_AND expr { $$ = make_exp_2(PHP_OP_LOG_AND, $1, $3); } + | expr LOG_XOR expr { $$ = make_exp_2(PHP_OP_LOG_XOR, $1, $3); } + | expr '|' expr { $$ = make_exp_2(PHP_OP_OR, $1, $3); } + | expr '&' expr { $$ = make_exp_2(PHP_OP_AND, $1, $3); } + | expr '^' expr { $$ = make_exp_2(PHP_OP_XOR, $1, $3); } + | expr '.' expr { $$ = make_exp_2(PHP_OP_CAT, $1, $3); } + | expr '+' expr { $$ = make_exp_2(PHP_OP_ADD, $1, $3); } + | expr '-' expr { $$ = make_exp_2(PHP_OP_SUB, $1, $3); } + | expr '*' expr { $$ = make_exp_2(PHP_OP_MUL, $1, $3); } + | expr '/' expr { $$ = make_exp_2(PHP_OP_DIV, $1, $3); } + | expr '%' expr { $$ = make_exp_2(PHP_OP_REM, $1, $3); } + | expr SL expr { $$ = make_exp_2(PHP_OP_SHL, $1, $3); } + | expr SR expr { $$ = make_exp_2(PHP_OP_SHR, $1, $3); } + | '+' expr { $$ = $2; } + | '-' expr { $$ = make_exp_2(PHP_OP_SUB, make_const_exp_dnum(0), $2); } + | '!' expr { $$ = make_exp_1(PHP_OP_LOG_NOT, $2); } + | '~' expr { $$ = make_exp_1(PHP_OP_NOT, $2); } + | expr IS_IDENTICAL expr { $$ = make_exp_2(PHP_OP_SAME, $1, $3); } + | expr IS_NOIDENTICAL expr { $$ = make_exp_2(PHP_OP_NOT_SAME, $1, $3); } + | expr IS_EQ expr { $$ = make_exp_2(PHP_OP_EQ, $1, $3); } + | expr IS_NOEQUAL expr { $$ = make_exp_2(PHP_OP_NEQ, $1, $3); } + | expr '<' expr { $$ = make_exp_2(PHP_OP_LWR, $1, $3); } + | expr IS_SMALLER_OR_EQ expr { $$ = make_exp_2(PHP_OP_LWR_EQ, $1, $3); } + | expr '>' expr { $$ = make_exp_2(PHP_OP_GRT, $1, $3); } + | expr IS_GREATER_OR_EQ expr { $$ = make_exp_2(PHP_OP_GRT_EQ, $1, $3); } + | '(' expr ')' { $$ = $2; } + | expr '?' expr ':' expr { $$ = make_exp_2(PHP_OP_MUX, $3, $5); $$->exp_node = $1; } + | INT_CAST expr { $$ = make_exp_1(PHP_OP_CAST_INT, $2); } + | DOUBLE_CAST expr { $$ = make_exp_1(PHP_OP_CAST_FLOAT, $2); } + | STRING_CAST expr { $$ = make_exp_1(PHP_OP_CAST_STR, $2); } + | BOOL_CAST expr { $$ = make_exp_1(PHP_OP_CAST_BOOL, $2); } +/* | ARRAY_CAST expr { } */ +/* | OBJECT_CAST expr { } */ + | UNSET_CAST expr { } + | EXIT exit_expr { } + | '@' expr { $$ = $2; } + + | const_value { $$ = $1; } + | ARRAY '(' array_pair_list ')' { $$ = make_exp_1(PHP_OP_ARRAY, $3); } + | PRINT expr { $$ = make_exp_1(PHP_OP_PRINT, $2); } +; + +exit_expr: '(' expr ')' { $$ = $2; } + | '(' ')' { $$ = 0; } + | /* empty */ { $$ = 0; } +; + +assignment_list: assignment_list_element + | assignment_list ',' assignment_list_element +; + + +assignment_list_element: variable { /*$$ = make_assign_node($1);*/ } + | LIST '(' assignment_list ')' { $$ = $3; } + | /* empty */ { /*$$ = make_assign_node(0);*/ } +; + +array_pair_list: array_elem { $$ = make_exp_1(PHP_OP_LIST, 0); $$->exp_node = $1; } + | array_pair_list ',' array_elem { + PHP_EXP_NODE *last = $1; + while ( last->next) last = last->next; + last->next = make_exp_1(PHP_OP_LIST, 0); + last->next->exp_node = $3; + $$ = $1; + } +; + +array_elem : expr { $$ = make_exp_1(PHP_OP_ARRAY_PAIR, $1); } + | expr HASH_ASSIGN expr { $$ = make_exp_2(PHP_OP_ARRAY_PAIR, $1, $3); } + | expr HASH_ASSIGN '&' variable { $$ = make_exp_2(PHP_OP_ARRAY_REF_PAIR, $1, $4); } + | '&' variable { $$ = make_exp_1(PHP_OP_ARRAY_REF_PAIR, $2); } +; + + diff --git a/src/webserver/src/php_syntree.cpp b/src/webserver/src/php_syntree.cpp new file mode 100644 index 00000000..01a81e4b --- /dev/null +++ b/src/webserver/src/php_syntree.cpp @@ -0,0 +1,2016 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (C) 2005-2008 Froenchenko Leonid ( lfroen@amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include // Do_not_auto_remove (g++-4.0.1) + +#ifdef PHP_STANDALONE_EN + #include + #include + #include +#else + #include "WebServer.h" +#endif + + +#include "php_syntree.h" +#include "php_core_lib.h" + + +PHP_SYN_NODE *g_syn_tree_top = 0; + +/* scope table */ +PHP_SCOPE_TABLE g_global_scope = 0; +PHP_SCOPE_TABLE g_current_scope = 0; +PHP_SCOPE_STACK g_scope_stack = 0; + + +// +// Known named constant values +std::map g_known_const; + +PHP_EXP_NODE *make_zero_exp_node() +{ + PHP_EXP_NODE *node = new PHP_EXP_NODE; + memset(node, 0, sizeof(PHP_EXP_NODE)); + return node; +} + +PHP_EXP_NODE *make_const_exp_dnum(int number) +{ + PHP_EXP_NODE *node = make_zero_exp_node(); + node->op = PHP_OP_VAL; + node->val_node.type = PHP_VAL_INT; + node->val_node.int_val = number; + + return node; +} + +PHP_EXP_NODE *make_const_exp_fnum(float number) +{ + PHP_EXP_NODE *node = make_zero_exp_node(); + node->op = PHP_OP_VAL; + node->val_node.type = PHP_VAL_FLOAT; + node->val_node.float_val = number; + + return node; +} + +PHP_EXP_NODE *make_const_exp_str(char *s, int unescape) +{ + PHP_EXP_NODE *node = make_zero_exp_node(); + node->op = PHP_OP_VAL; + node->val_node.type = PHP_VAL_STRING; + + if ( unescape ) { + node->val_node.str_val = (char *)malloc(strlen(s)+1); + // copy and unescape string + char *p = node->val_node.str_val; + while(*s) { + if ( *s == '\\' ) { + switch ( *(++s) ) { + case 'n' : *p++ = '\n'; s++; break; + case 't' : *p++ = '\t'; s++; break; + default : *p++ = *s++; break; + } + } else { + *p++ = *s++; + } + } + *p = 0; + } else { + node->val_node.str_val = strdup(s); + } + + return node; +} + +PHP_EXP_NODE *make_const_exp_int_obj(void *obj) +{ + PHP_EXP_NODE *node = make_zero_exp_node(); + node->op = PHP_OP_VAL; + node->val_node.type = PHP_VAL_INT_DATA; + node->val_node.ptr_val = obj; + + return node; +} + +PHP_EXP_NODE *make_exp_1(PHP_EXP_OP op, PHP_EXP_NODE *operand) +{ + PHP_EXP_NODE *node = make_zero_exp_node(); + node->op = op; + node->tree_node.left = operand; + return node; +} + +PHP_EXP_NODE *make_exp_2(PHP_EXP_OP op, PHP_EXP_NODE *left, PHP_EXP_NODE *right) +{ + PHP_EXP_NODE *node = make_zero_exp_node(); + node->op = op; + node->tree_node.left = left; + node->tree_node.right = right; + return node; +} + +PHP_EXP_NODE *make_exp_2_self(PHP_EXP_OP op, PHP_EXP_NODE *self, PHP_EXP_NODE *right) +{ + PHP_EXP_NODE *clone_self = make_zero_exp_node(); + *clone_self = *self; + return make_exp_2(op, clone_self, right); +} + +PHP_EXP_NODE *make_known_const(char *name) +{ + int const_id = -1; + if ( g_known_const.count(name) ) { + const_id = g_known_const[name]; + } + return make_const_exp_dnum(const_id); +} + +// +// Create function parameter (in declaration) +// +PHP_EXP_NODE *make_func_param(PHP_EXP_NODE *list, PHP_EXP_NODE *var_exp_node, char *class_name, int byref) +{ + PHP_FUNC_PARAM_DEF *param = new PHP_FUNC_PARAM_DEF; + memset(param, 0, sizeof(PHP_FUNC_PARAM_DEF)); + + param->si_var = var_exp_node->var_si_node; + param->si_var->type = PHP_SCOPE_PARAM; + //printf("mark %p->%p as param\n", param->si_var, param->si_var->var); + + param->var = param->si_var->var; + + delete var_exp_node; + param->class_name = class_name ? strdup(class_name) : 0; + param->byref = byref; + + PHP_EXP_NODE *curr_node = make_const_exp_int_obj(param); + + if ( list ) { + PHP_EXP_NODE *p = list; + while ( p->next) { + p = p->next; + } + p->next = curr_node; + return list; + } else { + return curr_node; + } +} + +/* + * Syntax tree generation + */ +PHP_SYN_NODE *make_expr_syn_node(PHP_STATMENT_TYPE type, PHP_EXP_NODE *expr) +{ + PHP_SYN_NODE *syn_node = new PHP_SYN_NODE; + memset(syn_node, 0, sizeof(PHP_SYN_NODE)); + + syn_node->type = type; + syn_node->node_expr = expr; + + return syn_node; +} + +PHP_SYN_NODE *make_ifelse_syn_node(PHP_EXP_NODE *expr, + PHP_SYN_NODE *then_node, PHP_SYN_NODE *elseif_list, PHP_SYN_NODE *else_node) +{ + PHP_SYN_NODE *syn_node = new PHP_SYN_NODE; + memset(syn_node, 0, sizeof(PHP_SYN_NODE)); + + syn_node->type = PHP_ST_IF; + syn_node->node_if.cond = expr; + syn_node->node_if.code_if = then_node; + + if ( elseif_list ) { + syn_node->node_if.code_else = elseif_list; + + PHP_SYN_NODE *curr_if = elseif_list; + while ( curr_if->node_if.code_else ) { + curr_if = curr_if->node_if.code_else; + } + curr_if->node_if.code_else = else_node; + } else { + syn_node->node_if.code_else = else_node; + } + return syn_node; +} + +PHP_SYN_NODE *make_while_loop_syn_node(PHP_EXP_NODE *cond, PHP_SYN_NODE *code, int do_while) +{ + PHP_SYN_NODE *syn_node = new PHP_SYN_NODE; + memset(syn_node, 0, sizeof(PHP_SYN_NODE)); + + syn_node->type = do_while ? PHP_ST_WHILE : PHP_ST_DO_WHILE; + syn_node->node_while.cond = cond; + syn_node->node_while.code = code; + + return syn_node; +} + +PHP_SYN_NODE *make_for_syn_node(PHP_EXP_NODE *start, PHP_EXP_NODE *cond, + PHP_EXP_NODE *next, PHP_SYN_NODE *code) +{ + PHP_SYN_NODE *syn_node = new PHP_SYN_NODE; + memset(syn_node, 0, sizeof(PHP_SYN_NODE)); + + syn_node->type = PHP_ST_FOR; + syn_node->node_for.do_start = start; + syn_node->node_for.cond = cond; + syn_node->node_for.do_next = next; + syn_node->node_for.code = code; + + return syn_node; +} + +PHP_SYN_NODE *make_foreach_loop_syn_node(PHP_EXP_NODE *elems, + PHP_EXP_NODE *i_key, PHP_EXP_NODE *i_val, PHP_SYN_NODE *code, int byref) +{ + PHP_SYN_NODE *syn_node = new PHP_SYN_NODE; + memset(syn_node, 0, sizeof(PHP_SYN_NODE)); + + syn_node->type = PHP_ST_FOREACH; + syn_node->node_foreach.elems = elems; + syn_node->node_foreach.code = code; + syn_node->node_foreach.i_key = i_key ? i_key->var_si_node : 0; + syn_node->node_foreach.i_val = i_val->var_si_node; + syn_node->node_foreach.byref = byref; + + if ( i_key ) { + delete i_key; + } + delete i_val; + + return syn_node; +} + +PHP_SYN_NODE *make_func_decl_syn_node(char *name, PHP_EXP_NODE *param_list) +{ + PHP_SYN_NODE *syn_node = new PHP_SYN_NODE; + memset(syn_node, 0, sizeof(PHP_SYN_NODE)); + + syn_node->type = PHP_ST_FUNC_DECL; + + syn_node->func_decl = new PHP_SYN_FUNC_DECL_NODE; + memset(syn_node->func_decl, 0, sizeof(PHP_SYN_FUNC_DECL_NODE)); + syn_node->func_decl->name = strdup(name); + + if ( param_list ) { + PHP_EXP_NODE *curr_param = param_list; + // count parameters first + while ( curr_param ) { + syn_node->func_decl->param_count++; + curr_param = curr_param->next; + } + syn_node->func_decl->params = new PHP_FUNC_PARAM_DEF[syn_node->func_decl->param_count]; + curr_param = param_list; + for(int i = 0; param_list; param_list = param_list->next, i++) { + syn_node->func_decl->params[i] = *(PHP_FUNC_PARAM_DEF *)param_list->val_node.ptr_val; + // param has been copied to array, so it's no longer needed + delete (PHP_FUNC_PARAM_DEF *)param_list->val_node.ptr_val; + } + // dispose linked list as well + while ( curr_param ) { + PHP_EXP_NODE *p = curr_param->next; + delete curr_param; + curr_param = p; + } + } + + return syn_node; +} + +PHP_SYN_NODE *make_class_decl_syn_node() +{ + PHP_SYN_NODE *syn_node = new PHP_SYN_NODE; + memset(syn_node, 0, sizeof(PHP_SYN_NODE)); + + syn_node->type = PHP_ST_CLASS_DECL; + + syn_node->class_decl = new PHP_SYN_CLASS_DECL_NODE; + memset(syn_node->class_decl, 0, sizeof(PHP_SYN_CLASS_DECL_NODE)); + + return syn_node; +} + +PHP_SYN_NODE *make_switch_syn_node(PHP_EXP_NODE *cond, PHP_EXP_NODE *case_list) +{ + PHP_SYN_NODE *syn_node = new PHP_SYN_NODE; + memset(syn_node, 0, sizeof(PHP_SYN_NODE)); + + syn_node->type = PHP_ST_SWITCH; + + // + // Bind all statement lists into single one for + // simplier execution + // + PHP_SYN_NODE *stat_list_tail = 0; + for(PHP_EXP_NODE *cur_case = case_list; cur_case; cur_case = cur_case->next) { + PHP_SYN_NODE *cur_stat_list = cur_case->exp_node->tree_node.syn_right; + if ( stat_list_tail ) { + while ( stat_list_tail->next_node ) stat_list_tail = stat_list_tail->next_node; + stat_list_tail->next_node = cur_stat_list; + } else { + stat_list_tail = cur_stat_list; + } + } + + syn_node->node_switch.cond = cond; + syn_node->node_switch.case_list = case_list; + + return syn_node; +} + +PHP_VAR_NODE *make_var_node() +{ + PHP_VAR_NODE *node = new PHP_VAR_NODE; + memset(node, 0, sizeof(PHP_VAR_NODE)); + node->value.type = PHP_VAL_NONE; + + return node; +} + +PHP_VAR_NODE *make_array_var() +{ + PHP_VAR_NODE *node = make_var_node(); + cast_value_array(&node->value); + + return node; +} + +/* + * Called from lexer when ${IDENT} is recognized + */ +PHP_EXP_NODE *get_var_node(char *name) +{ + PHP_EXP_NODE *node = make_zero_exp_node(); + node->op = PHP_OP_VAR; + + PHP_SCOPE_ITEM *si = get_scope_item(g_current_scope, name); + if ( si ) { + if ( (si->type == PHP_SCOPE_VAR) || (si->type == PHP_SCOPE_PARAM) ) { + node->var_si_node = si; + } else { + // + // Error: symbol already defined as different entity + // + php_report_error(PHP_ERROR, + "symbol [%s] already defined as different entity (%d)", name, si->type); + } + } else { + add_var_2_scope(g_current_scope, make_var_node(), name); + node->var_si_node = get_scope_item(g_current_scope, name); + } + + return node; +} + +void free_var_node(PHP_VAR_NODE *v) +{ + delete v; +} + +/* + * Init function scope table before transferring control there. + * 1. Evaluate all by-value params + * 2. Lvalue-evaluate all by-ref params and adjust pointers + */ +void func_scope_init(PHP_FUNC_PARAM_DEF *params, int param_count, + PHP_SCOPE_TABLE_TYPE * /*scope_map*/, PHP_VALUE_NODE *arg_array, + std::map &saved_vars) +{ + // + // Step 1: save origival vars + PHP_SCOPE_TABLE_TYPE *curr_scope_map = (PHP_SCOPE_TABLE_TYPE *)g_current_scope; + for(PHP_SCOPE_TABLE_TYPE::iterator i = curr_scope_map->begin(); i != curr_scope_map->end();i++) { + if ( (i->second->type == PHP_SCOPE_VAR) || (i->second->type == PHP_SCOPE_PARAM) ) { + if ( !(i->second->var->flags & PHP_VARFLAG_STATIC) ) { + //printf("Saving %s = %p->%p\n", i->first.c_str(), i->second, i->second->var); + saved_vars[i->first] = i->second->var; + } + } + } + // + // Step 2: calculate new values of call parameters + PHP_VAR_NODE *call_params[PHP_MAX_FUNC_PARAM]; + for(int i = 0; i < param_count; i++) { + PHP_VAR_NODE *curr_arg_val = array_get_by_int_key(arg_array, i); + if ( curr_arg_val->value.type != PHP_VAL_NONE ) { + if ( (curr_arg_val->flags & PHP_VARFLAG_BYREF) || params[i].byref ) { + call_params[i] = php_expr_eval_lvalue((PHP_EXP_NODE *)curr_arg_val->value.ptr_val); + if ( !call_params[i] ) { + php_report_error(PHP_ERROR, "Byref parameter is not lvalue"); + return; + } + } else { + call_params[i] = make_var_node(); + call_params[i]->ref_count = 1; + //printf("alloc var for callparam %d -> %p\n", i, call_params[i]); + php_expr_eval((PHP_EXP_NODE *)curr_arg_val->value.ptr_val, &call_params[i]->value); + } + } else { + // put default value + php_report_error(PHP_WARNING, "Default parameters are not implemented yet"); + call_params[i] = make_var_node(); + call_params[i]->ref_count = 1; + } + } + // + // Step 3: assign new values to call parameters + for(int i = 0; i < param_count; i++) { + //printf("assign new param si=%p var=%p -> %p\n", params[i].si_var, params[i].si_var->var, call_params[i]); + params[i].si_var->var = call_params[i]; + } + + // + // Step 4: allocate new stack local vars + for(PHP_SCOPE_TABLE_TYPE::iterator i = curr_scope_map->begin(); i != curr_scope_map->end();i++) { + if ( !((i->second->type == PHP_SCOPE_PARAM) || (i->second->type == PHP_SCOPE_VAR)) ) { + continue; + } + //printf("in scope: %p %s [ %s ] with flags %02x\n", i->second, i->second->type == PHP_SCOPE_PARAM ? "param" : "var", + // i->first.c_str(), i->second->var->flags); + if ( !(i->second->var->flags & PHP_VARFLAG_STATIC) && (i->second->type != PHP_SCOPE_PARAM) ) { + //printf("alloc new for %s [ %p->%p ]\n", i->first.c_str(), i->second, i->second->var); + i->second->var = make_var_node(); + i->second->var->ref_count = 1; + } + } +} + +/* + * Since by-ref params changes pointers in scope table, we need to restore them + * to original objects, so: + * 1. Memory will not leak + * 2. Next call may be using same params by-value, so it need independent varnode + */ +void func_scope_copy_back(PHP_FUNC_PARAM_DEF *params, int param_count, + PHP_SCOPE_TABLE_TYPE * /*scope_map*/, PHP_VALUE_NODE *arg_array, + std::map &saved_vars) +{ + /* + if ( param_count < array_get_size(arg_array) ) { + param_count = array_get_size(arg_array); + } + */ + PHP_VAR_NODE *call_params[PHP_MAX_FUNC_PARAM]; + int call_param_2free_count = 0; + for(int i = 0; i < param_count; i++) { + PHP_VAR_NODE *curr_arg_val = array_get_by_int_key(arg_array, i); + if ( !((curr_arg_val->flags & PHP_VARFLAG_BYREF) || params[i].byref) ) { + //printf("Delete param %d %p->%p\n", i, params[i].si_var, params[i].si_var->var); + call_params[call_param_2free_count++] = params[i].si_var->var; + } + params[i].si_var->var = params[i].var; + } + + PHP_SCOPE_TABLE_TYPE *curr_scope_map = (PHP_SCOPE_TABLE_TYPE *)g_current_scope; + for(PHP_SCOPE_TABLE_TYPE::iterator i = curr_scope_map->begin(); i != curr_scope_map->end();i++) { + if ( (i->second->type == PHP_SCOPE_VAR) || (i->second->type == PHP_SCOPE_PARAM) ) { + if ( !(i->second->var->flags & PHP_VARFLAG_STATIC) ) { + //printf("Restoring %s = %p->%p\n", i->first.c_str(), i->second, i->second->var); + //assert(saved_vars[i->first]); + if (i->second->type == PHP_SCOPE_VAR) { + value_value_free(&i->second->var->value); + delete i->second->var; + } + i->second->var = saved_vars[i->first]; + } + } + } + for(int i = 0; i < call_param_2free_count; i++) { + value_value_free(&call_params[i]->value); + delete call_params[i]; + } +} + +PHP_SCOPE_TABLE make_scope_table() +{ + PHP_SCOPE_TABLE_TYPE *scope_map = new PHP_SCOPE_TABLE_TYPE; + + return scope_map; +} + +void switch_push_scope_table(PHP_SCOPE_TABLE new_table) +{ + PHP_SCOPE_STACK_TYPE *scope_stack = (PHP_SCOPE_STACK_TYPE *)g_scope_stack; + scope_stack->push_back((PHP_SCOPE_TABLE_TYPE *)g_current_scope); + g_current_scope = new_table; +} + +void switch_pop_scope_table(int old_free) +{ + PHP_SCOPE_STACK_TYPE *scope_stack = (PHP_SCOPE_STACK_TYPE *)g_scope_stack; + if ( old_free ) { + delete_scope_table(g_current_scope); + } + if ( scope_stack->size() == 0 ) { + php_report_error(PHP_INTERNAL_ERROR, "Stack underrun - no valid scope"); + } + g_current_scope = scope_stack->back(); + scope_stack->pop_back(); +} + +void delete_scope_table(PHP_SCOPE_TABLE scope) +{ + PHP_SCOPE_TABLE_TYPE *scope_map = (PHP_SCOPE_TABLE_TYPE *)scope; + + for(PHP_SCOPE_TABLE_TYPE::iterator i = scope_map->begin(); i != scope_map->end();i++) { + switch ( i->second->type ) { + case PHP_SCOPE_PARAM: + //break; + case PHP_SCOPE_VAR: { + //printf("removing %s\n", i->first.c_str()); + PHP_VAR_NODE *var = i->second->var; + var_node_free(var); + } + break; + case PHP_SCOPE_FUNC: { + PHP_SYN_NODE *func = i->second->func; + php_syn_tree_free(func); + } + break; + case PHP_SCOPE_CLASS: { + PHP_SYN_NODE *class_decl = i->second->class_decl; + php_syn_tree_free(class_decl); + } + break; + case PHP_SCOPE_NONE: + php_report_error(PHP_INTERNAL_ERROR, "Scope table can not have such items"); + break; + } + delete i->second; + } + delete scope_map; +} + +void add_func_2_scope(PHP_SCOPE_TABLE scope, PHP_SYN_NODE *func) +{ + PHP_SCOPE_TABLE_TYPE *scope_map = (PHP_SCOPE_TABLE_TYPE *)scope; + PHP_SCOPE_ITEM *it = new PHP_SCOPE_ITEM; + it->type = PHP_SCOPE_FUNC; + it->func = func; + std::string key(func->func_decl->name); + if ( scope_map->count(key) ) { + // error - function already defined + php_report_error(PHP_ERROR, "Can not add function to scope table - already present"); + } else { + (*scope_map)[key] = it; + } +} + +void add_class_2_scope(PHP_SCOPE_TABLE scope, PHP_SYN_NODE *class_node) +{ + PHP_SCOPE_TABLE_TYPE *scope_map = (PHP_SCOPE_TABLE_TYPE *)scope; + PHP_SCOPE_ITEM *it = new PHP_SCOPE_ITEM; + it->type = PHP_SCOPE_CLASS; + it->class_decl = class_node; + std::string key(class_node->class_decl->name); + if ( scope_map->count(key) ) { + // error - function already defined + php_report_error(PHP_ERROR, "Can not add function to scope table - already present"); + } else { + (*scope_map)[key] = it; + } +} + +PHP_SCOPE_ITEM *make_named_scope_item(PHP_SCOPE_TABLE scope, const char *name) +{ + PHP_SCOPE_TABLE_TYPE *scope_map = (PHP_SCOPE_TABLE_TYPE *)scope; + PHP_SCOPE_ITEM *it = new PHP_SCOPE_ITEM; + memset(it, 0, sizeof(PHP_SCOPE_ITEM)); + + std::string key(name); + (*scope_map)[key] = it; + return it; +} + +PHP_SCOPE_ITEM *add_var_2_scope(PHP_SCOPE_TABLE scope, PHP_VAR_NODE *var, const char *name) +{ + PHP_SCOPE_ITEM *it = make_named_scope_item(scope, name); + it->type = PHP_SCOPE_VAR; + it->var = var; + var->ref_count++; + return it; +} + +PHP_SCOPE_ITEM_TYPE get_scope_item_type(PHP_SCOPE_TABLE scope, const char *name) +{ + PHP_SCOPE_TABLE_TYPE *scope_map = (PHP_SCOPE_TABLE_TYPE *)scope; + std::string key(name); + if ( scope_map->count(key) ) { + PHP_SCOPE_ITEM *it = (*scope_map)[key]; + return it->type; + } + return PHP_SCOPE_NONE; +} + +PHP_SCOPE_ITEM *get_scope_item(PHP_SCOPE_TABLE scope, const char *name) +{ + assert(name); + PHP_SCOPE_TABLE_TYPE *scope_map = (PHP_SCOPE_TABLE_TYPE *)scope; + std::string key(name); + if ( scope_map->count(key) ) { + PHP_SCOPE_ITEM *it = (*scope_map)[key]; + return it; + } + return 0; +} + +const char *get_scope_var_name(PHP_SCOPE_TABLE scope, PHP_VAR_NODE *var) +{ + PHP_SCOPE_TABLE_TYPE *scope_map = (PHP_SCOPE_TABLE_TYPE *)scope; + + for(PHP_SCOPE_TABLE_TYPE::iterator i = scope_map->begin(); i != scope_map->end();i++) { + if ( i->second->type == PHP_SCOPE_VAR ) { + PHP_VAR_NODE *curr_var = i->second->var; + if ( curr_var == var ) { + return i->first.c_str(); + } + } + } + return 0; +} + + +/* array operations */ +const std::string &array_get_ith_key(PHP_VALUE_NODE *array, int i) +{ + PHP_ARRAY_TYPE *arr_ptr = (PHP_ARRAY_TYPE *)array->ptr_val; + PHP_ARRAY_ITER_TYPE it = arr_ptr->array.begin(); + while(i--) it++; + return it->first; +} + + +PHP_VAR_NODE *array_get_by_str_key(PHP_VALUE_NODE *array, std::string key) +{ + if ( array->type != PHP_VAL_ARRAY ) { + return 0; + } + PHP_ARRAY_TYPE *arr_ptr = (PHP_ARRAY_TYPE *)array->ptr_val; + if ( arr_ptr->array.count(key) ) { + return (arr_ptr->array)[key]; + } else { + PHP_VAR_NODE *add_node = make_var_node(); + add_node->value.type = PHP_VAL_NONE; + add_node->ref_count++; + (arr_ptr->array)[key] = add_node; + arr_ptr->sorted_keys.push_back(key); + return add_node; + } +} + +PHP_VAR_NODE *array_get_by_int_key(PHP_VALUE_NODE *array, int key) +{ + if ( array->type != PHP_VAL_ARRAY ) { + return 0; + } + char s_key[32]; + snprintf(s_key, sizeof(s_key), "%d", key); + return array_get_by_str_key(array, s_key); +} + +PHP_VAR_NODE *array_get_by_key(PHP_VALUE_NODE *array, PHP_VALUE_NODE *key) +{ + if ( array->type != PHP_VAL_ARRAY ) { + return 0; + } + PHP_VALUE_NODE s_key = *key; + cast_value_str(&s_key); + return array_get_by_str_key(array, s_key.str_val); +} + +void array_set_by_key(PHP_VALUE_NODE *array, PHP_VALUE_NODE *key, PHP_VAR_NODE *node) +{ + if ( array->type != PHP_VAL_ARRAY ) { + return; + } + PHP_VALUE_NODE s_key = *key; + cast_value_str(&s_key); + array_remove_at_str_key(array, s_key.str_val); + array_add_to_str_key(array, s_key.str_val, node); + value_value_free(&s_key); +} + +void array_add_to_str_key(PHP_VALUE_NODE *array, std::string key, PHP_VAR_NODE *node) +{ + if ( array->type != PHP_VAL_ARRAY ) { + return ; + } + PHP_ARRAY_TYPE *arr_ptr = (PHP_ARRAY_TYPE *)array->ptr_val; + if ( !arr_ptr->array.count(key) ) { + node->ref_count++; + (arr_ptr->array)[key] = node; + arr_ptr->sorted_keys.push_back(key); + } +} + +void array_remove_at_str_key(PHP_VALUE_NODE *array, std::string key) +{ + if ( array->type != PHP_VAL_ARRAY ) { + return ; + } + PHP_ARRAY_TYPE *arr_ptr = (PHP_ARRAY_TYPE *)array->ptr_val; + if ( arr_ptr->array.count(key) ) { + PHP_VAR_NODE *node = (arr_ptr->array)[key]; + var_node_free(node); + arr_ptr->array.erase(key); + for(PHP_ARRAY_KEY_ITER_TYPE i = arr_ptr->sorted_keys.begin(); i != arr_ptr->sorted_keys.end(); i++) { + if ( *i == key ) { + arr_ptr->sorted_keys.erase(i); + break; + } + } + } +} + +void array_add_to_int_key(PHP_VALUE_NODE *array, int key, PHP_VAR_NODE *node) +{ + char s_key[32]; + snprintf(s_key, sizeof(s_key), "%d", key); + array_add_to_str_key(array, s_key, node); +} + + +int array_is_key_here(PHP_VALUE_NODE *array, PHP_VALUE_NODE *key) +{ + if ( array->type != PHP_VAL_ARRAY ) { + return 0; + } + PHP_ARRAY_TYPE *arr_ptr = (PHP_ARRAY_TYPE *)array->ptr_val; + PHP_VALUE_NODE s_key = *key; + cast_value_str(&s_key); + std::string arr_key(s_key.str_val); + + return arr_ptr->array.count(arr_key); +} + +int array_get_size(PHP_VALUE_NODE *array) +{ + if ( array->type != PHP_VAL_ARRAY ) { + return 0; + } + PHP_ARRAY_TYPE *arr_ptr = (PHP_ARRAY_TYPE *)array->ptr_val; + + return arr_ptr->array.size(); +} + +PHP_VAR_NODE *array_push_back(PHP_VALUE_NODE *array) +{ + for(int i = 0; i < 0xffff;i++) { + PHP_VAR_NODE *arr_var_node = array_get_by_int_key(array, i); + if ( arr_var_node->value.type == PHP_VAL_NONE ) { + return arr_var_node; + } + } + // array size reached 64K ?! + return 0; +} + +/* value manipulation - assignment and disposal */ + +void value_value_assign(PHP_VALUE_NODE *dst, PHP_VALUE_NODE *src) +{ + // first, free old value + value_value_free(dst); + dst->type = src->type; + switch(src->type) { + // scalars are copied. Objects are copied too, since + // interpreter doesn't allocate them. + case PHP_VAL_NONE: + case PHP_VAL_BOOL: + case PHP_VAL_INT: + case PHP_VAL_FLOAT: + case PHP_VAL_OBJECT: + // assign biggest in union + dst->obj_val = src->obj_val; + break; + // string is duplicated + case PHP_VAL_STRING: { + dst->str_val = strdup(src->str_val); + break; + } + // array must duplicate all it's values + case PHP_VAL_ARRAY: { + dst->ptr_val = new PHP_ARRAY_TYPE; + PHP_ARRAY_TYPE *src_array = (PHP_ARRAY_TYPE *)src->ptr_val; + for(PHP_ARRAY_KEY_ITER_TYPE i = src_array->sorted_keys.begin(); i != src_array->sorted_keys.end(); i++) { + PHP_VAR_NODE *added = array_get_by_str_key(dst, *i); + value_value_assign(&added->value, &src_array->array[*i]->value); + } + break; + } + + case PHP_VAL_VAR_NODE: + case PHP_VAL_INT_DATA: break; + } +} + +void var_node_free(PHP_VAR_NODE *var) +{ + assert(var && var->ref_count); + var->ref_count--; + if ( var->ref_count == 0 ) { + value_value_free(&var->value); + delete var; + } +} + +void value_value_free(PHP_VALUE_NODE *val) +{ + switch(val->type) { + case PHP_VAL_NONE: + case PHP_VAL_BOOL: + case PHP_VAL_INT: + case PHP_VAL_FLOAT: + break; + case PHP_VAL_STRING: { + free(val->str_val); + val->str_val = 0; + break; + } + case PHP_VAL_ARRAY: { + for(PHP_ARRAY_ITER_TYPE i = ((PHP_ARRAY_TYPE *)val->ptr_val)->array.begin(); + i != ((PHP_ARRAY_TYPE *)val->ptr_val)->array.end(); i++) { + PHP_VAR_NODE *var_i = i->second; + var_node_free(var_i); + } + delete ((PHP_ARRAY_TYPE *)val->ptr_val); + break; + } + case PHP_VAL_OBJECT: break; + + case PHP_VAL_VAR_NODE: + case PHP_VAL_INT_DATA: break; + } + val->type = PHP_VAL_NONE; +} + +/* casting functions */ +void cast_value_dnum(PHP_VALUE_NODE *val) +{ + switch(val->type) { + case PHP_VAL_NONE: val->int_val = 0; break; + case PHP_VAL_BOOL: + case PHP_VAL_INT: break; + case PHP_VAL_FLOAT: val->int_val = (int)val->float_val; break; + case PHP_VAL_STRING: { + char *str = val->str_val; + val->int_val = atoi(val->str_val); + free(str); + break; + } + case PHP_VAL_ARRAY: + case PHP_VAL_OBJECT: val->int_val = 0; break; + case PHP_VAL_VAR_NODE: + case PHP_VAL_INT_DATA: assert(0); break; + } + val->type = PHP_VAL_INT; +} + +void cast_value_bool(PHP_VALUE_NODE *val) +{ + cast_value_dnum(val); + val->type = PHP_VAL_BOOL; +} + +void cast_value_fnum(PHP_VALUE_NODE *val) +{ + switch(val->type) { + case PHP_VAL_NONE: val->float_val = 0; break; + case PHP_VAL_BOOL: + case PHP_VAL_INT: val->float_val = val->int_val; break; + case PHP_VAL_FLOAT: break; + case PHP_VAL_STRING: { + char *str = val->str_val; + val->float_val = atof(val->str_val); + free(str); + break; + } + case PHP_VAL_ARRAY: + case PHP_VAL_OBJECT: val->float_val = 0; break; + case PHP_VAL_VAR_NODE: + case PHP_VAL_INT_DATA: assert(0); break; + } + val->type = PHP_VAL_FLOAT; +} + +void cast_value_str(PHP_VALUE_NODE *val) +{ + char buff[256]; + switch(val->type) { + case PHP_VAL_NONE: buff[0] = 0; break; + case PHP_VAL_BOOL: + case PHP_VAL_INT: snprintf(buff, sizeof(buff), "%"PRIu64, val->int_val); break; + case PHP_VAL_FLOAT: snprintf(buff, sizeof(buff), "%.02f", val->float_val); break; + case PHP_VAL_STRING: return; + case PHP_VAL_ARRAY: { + delete ((PHP_ARRAY_TYPE *)val->ptr_val); + strcpy(buff, "Array"); break; + } + case PHP_VAL_OBJECT: strcpy(buff, "Object"); break; + case PHP_VAL_VAR_NODE: + case PHP_VAL_INT_DATA: assert(0); break; + } + val->str_val = strdup(buff); + val->type = PHP_VAL_STRING; +} + +void cast_value_array(PHP_VALUE_NODE *val) +{ + switch(val->type) { + case PHP_VAL_NONE: + case PHP_VAL_BOOL: + case PHP_VAL_INT: + case PHP_VAL_FLOAT: break; + case PHP_VAL_STRING: free(val->str_val); + case PHP_VAL_ARRAY: return; + case PHP_VAL_OBJECT: ;/* must call to free_obj() */ + case PHP_VAL_VAR_NODE: + case PHP_VAL_INT_DATA: assert(0); break; + } + val->ptr_val = new PHP_ARRAY_TYPE; + val->type = PHP_VAL_ARRAY; +} + +/* + * Function calls + */ +PHP_EXP_NODE *make_func_call_exp(char *func_name, PHP_EXP_NODE *args) +{ + PHP_EXP_NODE *call_node = make_zero_exp_node(); + + call_node->op = PHP_OP_FUNC_CALL; + // copy function name + call_node->tree_node.left = make_zero_exp_node(); + call_node->tree_node.left->op = PHP_OP_VAL; + call_node->tree_node.left->val_node.type = PHP_VAL_STRING; + call_node->tree_node.left->val_node.str_val = strdup(func_name); + // set params + call_node->tree_node.right = args; + + return call_node; +} + +PHP_EXP_NODE *make_func_call_param_list() +{ + PHP_VAR_NODE *params = make_array_var(); + + PHP_EXP_NODE *exp_node = make_zero_exp_node(); + + exp_node->op = PHP_OP_VAR; + exp_node->var_node = params; + + return exp_node; +} + +void func_call_add_expr(PHP_VAR_NODE *paramlist, PHP_EXP_NODE *arg, int byref) +{ + PHP_VAR_NODE *node = array_push_back(¶mlist->value); + node->value.type = PHP_VAL_INT_DATA; + node->value.ptr_val = arg; + if ( byref ) { + node->flags |= PHP_VARFLAG_BYREF; + } +} + +void php_add_native_func(PHP_BLTIN_FUNC_DEF *def) +{ + if ( get_scope_item_type(g_global_scope, def->name) != PHP_SCOPE_NONE ) { + // + // Error: something already defined by this name + // + php_report_error(PHP_ERROR, "Can't add scope item: symbol already defined"); + return; + } + PHP_SCOPE_TABLE func_scope = make_scope_table(); + + PHP_SYN_NODE *decl_node = make_func_decl_syn_node(def->name, 0); + decl_node->func_decl->param_count = def->param_count; + decl_node->func_decl->params = new PHP_FUNC_PARAM_DEF[def->param_count]; + + // + // Built-in functions don't have class specifier, and can handle + // default arguments internally + // + memset(decl_node->func_decl->params, 0, sizeof(PHP_FUNC_PARAM_DEF) * def->param_count); + for(int i = 0; i < def->param_count;i++) { + PHP_VAR_NODE *func_param = make_var_node(); + char param_name[32]; + snprintf(param_name, sizeof(param_name), "__param_%d", i); + + decl_node->func_decl->params[i].def_value.type = PHP_VAL_NONE; + decl_node->func_decl->params[i].var = func_param; + decl_node->func_decl->params[i].si_var = add_var_2_scope(func_scope, func_param, param_name); + decl_node->func_decl->params[i].si_var->type = PHP_SCOPE_PARAM; + } + decl_node->func_decl->scope = func_scope; + decl_node->func_decl->is_native = 1; + decl_node->func_decl->native_ptr = def->func; + + add_func_2_scope(g_global_scope, decl_node); +} + +void php_add_native_class(char *name, PHP_NATIVE_PROP_GET_FUNC_PTR prop_get_native_ptr) +{ + if ( get_scope_item_type(g_global_scope, name) != PHP_SCOPE_NONE ) { + // + // Error: something already defined by this name + // + php_report_error(PHP_ERROR, "Can't add scope item: symbol already defined"); + return; + } + PHP_SYN_NODE *decl_node = make_class_decl_syn_node(); + decl_node->class_decl->name = strdup(name); + decl_node->class_decl->is_native = 1; + decl_node->class_decl->native_prop_get_ptr = prop_get_native_ptr; + add_class_2_scope(g_global_scope, decl_node); +} + +void php_engine_init() +{ + g_global_scope = make_scope_table(); + + g_current_scope = g_global_scope; + + g_scope_stack = new PHP_SCOPE_STACK_TYPE; + + // here built-in functions/objects/vars are loaded + php_init_core_lib(); +} + +void php_exp_tree_free(PHP_EXP_NODE *tree) +{ + if ( !tree ) { + return; + } + switch ( tree->op ) { + case PHP_OP_VAR: + /* will be deleted during scope table destruction */ + break; + case PHP_OP_VAL: + value_value_free(&tree->val_node); + break; + case PHP_OP_FUNC_CALL: { + php_exp_tree_free(tree->tree_node.left); + PHP_VAR_NODE *args = tree->tree_node.right->var_node; + PHP_VALUE_NODE *args_array = &args->value; + for(PHP_ARRAY_ITER_TYPE i = ((PHP_ARRAY_TYPE *)args_array->ptr_val)->array.begin(); + i != ((PHP_ARRAY_TYPE *)args_array->ptr_val)->array.end(); i++) { + PHP_VAR_NODE *var_i = i->second; + php_exp_tree_free((PHP_EXP_NODE *)var_i->value.ptr_val); + } + value_value_free(&args->value); + delete tree->tree_node.right->var_node; + delete tree->tree_node.right; + } + break; + case PHP_OP_ARRAY: { + PHP_EXP_NODE *curr = tree->tree_node.left; + while (curr) { + PHP_EXP_NODE *next = curr->next; + php_exp_tree_free(curr->exp_node); + delete curr; + curr = next; + } + } + break; + case PHP_OP_MUX: + php_exp_tree_free(tree->exp_node); + default: + // all other things using left/right + php_exp_tree_free(tree->tree_node.left); + php_exp_tree_free(tree->tree_node.right); + } + + delete tree; +} + +void php_syn_tree_free(PHP_SYN_NODE *tree) +{ + while ( tree ) { + switch ( tree->type ) { + case PHP_ST_EXPR: + case PHP_ST_RET: + php_exp_tree_free(tree->node_expr); + break; + case PHP_ST_ECHO: { + PHP_EXP_NODE *curr = tree->node_expr; + while (curr) { + PHP_EXP_NODE *next = curr->next; + php_exp_tree_free(curr->exp_node); + delete curr; + curr = next; + } + } + break; + case PHP_ST_IF: + php_exp_tree_free(tree->node_if.cond); + php_syn_tree_free(tree->node_if.code_if); + php_syn_tree_free(tree->node_if.code_else); + break; + case PHP_ST_WHILE: + case PHP_ST_DO_WHILE: + php_exp_tree_free(tree->node_while.cond); + php_syn_tree_free(tree->node_while.code); + break; + case PHP_ST_FOR: + php_exp_tree_free(tree->node_for.do_start); + php_exp_tree_free(tree->node_for.cond); + php_exp_tree_free(tree->node_for.do_next); + php_syn_tree_free(tree->node_for.code); + break; + case PHP_ST_FOREACH: + php_exp_tree_free(tree->node_foreach.elems); + php_syn_tree_free(tree->node_foreach.code); + break; + case PHP_ST_CONTINUE: + case PHP_ST_BREAK: + break; + case PHP_ST_FUNC_DECL: + if ( !tree->func_decl->is_native ) { + php_syn_tree_free(tree->func_decl->code); + } + delete_scope_table(tree->func_decl->scope); + free(tree->func_decl->name); + for(int i = 0; i < tree->func_decl->param_count; i++) { + if (tree->func_decl->params[i].class_name) { + free(tree->func_decl->params[i].class_name); + } + } + delete [] tree->func_decl->params; + delete tree->func_decl; + break; + case PHP_ST_SWITCH: { + php_exp_tree_free(tree->node_switch.cond); + php_syn_tree_free(tree->node_switch.case_list->exp_node->tree_node.syn_right); + PHP_EXP_NODE *curr = tree->node_switch.case_list; + while (curr) { + PHP_EXP_NODE *next = curr->next; + if ( curr->exp_node ) { + php_exp_tree_free(curr->exp_node->tree_node.left); + delete curr->exp_node; + } + delete curr; + curr = next; + } + } + break; + case PHP_ST_CLASS_DECL: + free(tree->class_decl->name); + delete tree->class_decl; + break; + } + PHP_SYN_NODE *next_node = tree->next_node; + delete tree; + tree = next_node; + } +} + +void php_engine_free() +{ + if ( g_global_scope ) { + delete_scope_table(g_global_scope); + } + php_syn_tree_free(g_syn_tree_top); + g_global_scope = 0; + g_current_scope = 0; + delete (PHP_SCOPE_STACK_TYPE *)g_scope_stack; +} + +/* + * Create reference. This is recoursive process, since operators [] + * can be stacked: $a[1][2][3] = & $b; + * There's 3 valid cases in making reference: + * 1,2. Target is scalar variable or variable by name ${xxx} + * 3. Target is member of array. + */ +void exp_set_ref(PHP_EXP_NODE *expr, PHP_VAR_NODE *var, PHP_VALUE_NODE *key) +{ + switch ( expr->op ) { + case PHP_OP_VAR: { + if ( expr->var_si_node->var != var ) { + if ( key ) { + cast_value_array(&expr->var_si_node->var->value); + array_set_by_key(&expr->var_si_node->var->value, key, var); + } else { + var_node_free(expr->var_si_node->var); + expr->var_si_node->var = var; + var->ref_count++; + } + } + } + break; + case PHP_OP_ARRAY_BY_KEY: { + PHP_VALUE_NODE i_key; + i_key.type = PHP_VAL_NONE; + php_expr_eval(expr->tree_node.right, &i_key); + exp_set_ref(expr->tree_node.left, var, &i_key); + } + break; + default: + php_report_error(PHP_ERROR, "Bad left part of operator =&: (%d)", + expr->tree_node.left->op); + } +} + +/* + * This is heart of expression tree: evaluation. It's split into 2 functions + * where 1 evaluates "value" of expression, and other evaluates "lvalue" i.e. assignable + * entity from given subtree. + */ + +void php_expr_eval(PHP_EXP_NODE *expr, PHP_VALUE_NODE *result) +{ + PHP_VALUE_NODE result_val_right, result_val_left; + PHP_VAR_NODE *lval_node = 0; + PHP_SCOPE_ITEM *si = 0; + result_val_right.type = PHP_VAL_NONE; + result_val_left.type = PHP_VAL_NONE; + switch(expr->op) { + case PHP_OP_VAL: + if ( result ) { + value_value_assign(result, &expr->val_node); + } + break; + case PHP_OP_VAR: + if ( result ) { + value_value_assign(result, &expr->var_si_node->var->value); + } + break; + case PHP_OP_ASS: + lval_node = php_expr_eval_lvalue(expr->tree_node.left); + if ( !lval_node ) { + break; + } + php_expr_eval(expr->tree_node.right, &lval_node->value); + if ( result ) { + value_value_assign(result, &lval_node->value); + } + break; + case PHP_OP_ARRAY_BY_KEY: + php_expr_eval(expr->tree_node.right, &result_val_right); + lval_node = php_expr_eval_lvalue(expr->tree_node.left); + cast_value_array(&lval_node->value); + cast_value_str(&result_val_right); + lval_node = array_get_by_key(&lval_node->value, &result_val_right); + if ( result ) { + value_value_assign(result, &lval_node->value); + } + break; + case PHP_MAKE_REF: + lval_node = php_expr_eval_lvalue(expr->tree_node.right); + if ( !lval_node ) { + break; + } + exp_set_ref(expr->tree_node.left, lval_node, 0); + break; + case PHP_OP_ARRAY: + if ( result ) { + PHP_EXP_NODE *curr = expr->tree_node.left; + value_value_free(result); + cast_value_array(result); + while ( curr ) { + switch( curr->exp_node->op ) { + case PHP_OP_ARRAY_PAIR: + if ( curr->exp_node->tree_node.right ) { + php_expr_eval(curr->exp_node->tree_node.left, &result_val_left); + cast_value_str(&result_val_left); + lval_node = array_get_by_key(result, &result_val_left); + value_value_free(&result_val_left); + php_expr_eval(curr->exp_node->tree_node.right, &lval_node->value); + } else { + lval_node = array_push_back(result); + php_expr_eval(curr->exp_node->tree_node.left, &lval_node->value); + } + break; + case PHP_OP_ARRAY_REF_PAIR: + lval_node = php_expr_eval_lvalue(curr->exp_node->tree_node.right); + break; + default: + php_report_error(PHP_INTERNAL_ERROR, "Array list contain wrong node"); + return; + } + curr = curr->next; + } + } + break; + case PHP_OP_FUNC_CALL: + php_run_func_call(expr, result); + break; + case PHP_OP_LIST: { + PHP_EXP_NODE *curr = expr; + while ( curr ) { + if ( curr->exp_node ) { + php_expr_eval(curr->exp_node, result); + } + curr = curr->next; + } + } + break; + case PHP_OP_CAT: + php_expr_eval(expr->tree_node.right, &result_val_right); + php_expr_eval(expr->tree_node.left, &result_val_left); + if ( result ) { + cast_value_str(&result_val_left); + cast_value_str(&result_val_right); + value_value_free(result); + result->type = PHP_VAL_STRING; + // using "malloc" and not "new" since all strings are freed + // later with "free" and not "delete" + result->str_val = (char *)malloc(strlen(result_val_left.str_val) + + strlen(result_val_right.str_val) + 1); + strcpy(result->str_val, result_val_left.str_val); + strcat(result->str_val, result_val_right.str_val); + } + break; + case PHP_OP_MUX: + php_expr_eval(expr->exp_node, &result_val_right); + cast_value_bool(&result_val_right); + if ( result_val_right.int_val ) { + php_expr_eval(expr->tree_node.left, result); + } else { + php_expr_eval(expr->tree_node.right, result); + } + break; + case PHP_OP_CAST_INT: + if ( result ) { + php_expr_eval(expr->tree_node.left, result); + cast_value_dnum(result); + } + break; + case PHP_OP_CAST_FLOAT: + if ( result ) { + php_expr_eval(expr->tree_node.left, result); + cast_value_fnum(result); + } + break; + case PHP_OP_CAST_BOOL: + if ( result ) { + php_expr_eval(expr->tree_node.left, result); + cast_value_bool(result); + } + break; + case PHP_OP_CAST_STR: + if ( result ) { + php_expr_eval(expr->tree_node.left, result); + cast_value_str(result); + } + break; + case PHP_OP_LOG_NOT: + if ( result ) { + php_expr_eval(expr->tree_node.left, &result_val_right); + cast_value_bool(&result_val_right); + result_val_right.int_val = !result_val_right.int_val; + value_value_assign(result, &result_val_right); + } + break; + case PHP_OP_NOT: + if ( result ) { + php_expr_eval(expr->tree_node.left, &result_val_right); + cast_value_bool(&result_val_right); + result_val_right.int_val = ~result_val_right.int_val; + value_value_assign(result, &result_val_right); + } + break; + case PHP_OP_ADD: + case PHP_OP_SUB: + case PHP_OP_MUL: + case PHP_OP_DIV: + php_expr_eval(expr->tree_node.right, &result_val_right); + php_expr_eval(expr->tree_node.left, &result_val_left); + if ( result ) { + php_eval_simple_math(expr->op, &result_val_left, &result_val_right, result); + } + break; + case PHP_OP_SHL: + case PHP_OP_SHR: + case PHP_OP_OR: + case PHP_OP_AND: + case PHP_OP_XOR: + case PHP_OP_LOG_OR: + case PHP_OP_LOG_AND: + case PHP_OP_LOG_XOR: + php_expr_eval(expr->tree_node.right, &result_val_right); + php_expr_eval(expr->tree_node.left, &result_val_left); + if ( result ) { + php_eval_int_math(expr->op, &result_val_left, &result_val_right, result); + } + break; + case PHP_OP_EQ: + case PHP_OP_NEQ: + case PHP_OP_GRT: + case PHP_OP_LWR: + php_expr_eval(expr->tree_node.right, &result_val_right); + php_expr_eval(expr->tree_node.left, &result_val_left); + if ( result ) { + php_eval_compare(expr->op, &result_val_left, &result_val_right, result); + } + break; + case PHP_OP_PRINT: + php_expr_eval(expr->tree_node.left, &result_val_right); + cast_value_str(&result_val_right); + // + // I print to buffer + CPhPLibContext::Print(result_val_right.str_val); + break; + case PHP_OP_OBJECT_DEREF: // $x->y + // take variable from scope of current object + lval_node = php_expr_eval_lvalue(expr->tree_node.left); + if ( !lval_node ) { + php_report_error(PHP_ERROR, "Left part of -> must be lvalue"); + return; + } + if ( lval_node->value.type != PHP_VAL_OBJECT ) { + php_report_error(PHP_ERROR, "Left part of -> must be an object"); + return; + } + if ( get_scope_item_type(g_global_scope, lval_node->value.obj_val.class_name) == PHP_SCOPE_NONE ) { + php_report_error(PHP_ERROR, "Undeclared object"); + return; + } + si = get_scope_item(g_global_scope, lval_node->value.obj_val.class_name); + if ( si->type != PHP_SCOPE_CLASS ) { + php_report_error(PHP_INTERNAL_ERROR, "Object classname is not name of class"); + return; + } + // left part is ok, let's check the right + if ( (expr->tree_node.right->op != PHP_OP_VAL) || (expr->tree_node.right->val_node.type != PHP_VAL_STRING) ) { + php_report_error(PHP_ERROR, "Right part of -> must be string value"); + return; + } + if ( si->class_decl->class_decl->is_native ) { + si->class_decl->class_decl->native_prop_get_ptr(lval_node->value.obj_val.inst_ptr, + expr->tree_node.right->val_node.str_val, result); + } else { + php_report_error(PHP_ERROR, "Only native classes supported"); + return; + } + break; + case PHP_OP_CLASS_DEREF: // A::y + // take variable (static) from scope of current class + php_report_error(PHP_ERROR, "Value of static class members not supported"); + break; + default: ; + + } + value_value_free(&result_val_left); + value_value_free(&result_val_right); +} + +PHP_VAR_NODE *php_expr_eval_lvalue(PHP_EXP_NODE *expr) +{ + PHP_VAR_NODE *lval_node = 0; + + PHP_VALUE_NODE index; + index.type = PHP_VAL_NONE; + + switch(expr->op) { + case PHP_OP_VAR: + lval_node = expr->var_si_node->var; + break; + case PHP_OP_ARRAY_BY_KEY: + lval_node = php_expr_eval_lvalue(expr->tree_node.left); + if ( !lval_node ) { + break; + } + + cast_value_array(&lval_node->value); + if ( expr->tree_node.right ) { + php_expr_eval(expr->tree_node.right, &index); + if ( index.type == PHP_VAL_NONE ) { + // something got wrong: evaluation result is not a value + return 0; + } + cast_value_str(&index); + lval_node = array_get_by_key(&lval_node->value, &index); + value_value_free(&index); + } else { + // this is "$xxx[] = " construct. + lval_node = array_push_back(&lval_node->value); + } + case PHP_OP_VAR_BY_EXP: // ${"xxx"} + // should take variable from current scope + break; + case PHP_OP_OBJECT_DEREF: // $x->y + // take variable from scope of current object + php_report_error(PHP_ERROR, "Assign to class members not supported"); + break; + case PHP_OP_CLASS_DEREF: // A::y + // take variable (static) from scope of current class + php_report_error(PHP_ERROR, "Assign to static class members not supported"); + break; + default: + // + // Error: expression can not be taken as lvalue + // + php_report_error(PHP_ERROR, "This expression can't be used as lvalue"); + } + return lval_node; +} + +PHP_VALUE_TYPE cast_type_resolve(PHP_VALUE_NODE *op1, PHP_VALUE_NODE *op2) +{ + if ( (op1->type == PHP_VAL_FLOAT) || (op2->type == PHP_VAL_FLOAT) ) { + cast_value_fnum(op1); + cast_value_fnum(op2); + return PHP_VAL_FLOAT; + } else { + cast_value_dnum(op1); + cast_value_dnum(op2); + return PHP_VAL_INT; + } +} + +/* + * Same as simple_math, but result is always bool + */ +void php_eval_compare(PHP_EXP_OP op, PHP_VALUE_NODE *op1, PHP_VALUE_NODE *op2, PHP_VALUE_NODE *result) +{ + result->type = PHP_VAL_BOOL; + if ( (op1->type == PHP_VAL_STRING) || (op2->type == PHP_VAL_STRING) ) { + cast_value_str(op1); + cast_value_str(op2); + int cmp_val = strcmp(op1->str_val, op2->str_val); + switch(op) { + case PHP_OP_EQ: + result->int_val = (cmp_val == 0); + break; + case PHP_OP_NEQ: + result->int_val = (cmp_val != 0); + break; + case PHP_OP_GRT: + result->int_val = (cmp_val > 0); + break; + case PHP_OP_LWR: + result->int_val = (cmp_val < 0); + break; + case PHP_OP_GRT_EQ: + result->int_val = (cmp_val >= 0); + break; + case PHP_OP_LWR_EQ: + result->int_val = (cmp_val <= 0); + break; + default: + php_report_error(PHP_INTERNAL_ERROR, "This op is not compare op"); + } + } else { + PHP_VALUE_TYPE restype = cast_type_resolve(op1, op2); + switch(op) { + case PHP_OP_EQ: + if ( restype == PHP_VAL_FLOAT ) { + result->int_val = op1->float_val == op2->float_val; + } else { + result->int_val = op1->int_val == op2->int_val; + } + break; + case PHP_OP_NEQ: + if ( restype == PHP_VAL_FLOAT ) { + result->int_val = op1->float_val != op2->float_val; + } else { + result->int_val = op1->int_val != op2->int_val; + } + break; + case PHP_OP_GRT: + if ( restype == PHP_VAL_FLOAT ) { + result->int_val = op1->float_val > op2->float_val; + } else { + result->int_val = op1->int_val > op2->int_val; + } + break; + case PHP_OP_GRT_EQ: + if ( restype == PHP_VAL_FLOAT ) { + result->int_val = op1->float_val >= op2->float_val; + } else { + result->int_val = op1->int_val >= op2->int_val; + } + break; + case PHP_OP_LWR: + if ( restype == PHP_VAL_FLOAT ) { + result->int_val = op1->float_val < op2->float_val; + } else { + result->int_val = op1->int_val < op2->int_val; + } + break; + case PHP_OP_LWR_EQ: + if ( restype == PHP_VAL_FLOAT ) { + result->int_val = op1->float_val <= op2->float_val; + } else { + result->int_val = op1->int_val <= op2->int_val; + } + break; + default: + php_report_error(PHP_INTERNAL_ERROR, "This op is not compare op"); + } + } +} + +void php_eval_simple_math(PHP_EXP_OP op, PHP_VALUE_NODE *op1, PHP_VALUE_NODE *op2, PHP_VALUE_NODE *result) +{ + result->type = cast_type_resolve(op1, op2); + switch(op) { + case PHP_OP_ADD: + if ( result->type == PHP_VAL_FLOAT ) { + result->float_val = op1->float_val + op2->float_val; + } else { + result->int_val = op1->int_val + op2->int_val; + } + break; + case PHP_OP_SUB: + if ( result->type == PHP_VAL_FLOAT ) { + result->float_val = op1->float_val - op2->float_val; + } else { + result->int_val = op1->int_val - op2->int_val; + } + break; + case PHP_OP_MUL: + if ( result->type == PHP_VAL_FLOAT ) { + result->float_val = op1->float_val * op2->float_val; + } else { + result->int_val = op1->int_val * op2->int_val; + } + break; + case PHP_OP_DIV: + if ( result->type == PHP_VAL_FLOAT ) { + result->float_val = op1->float_val / op2->float_val; + } else { + result->int_val = op1->int_val / op2->int_val; + } + break; + default: + php_report_error(PHP_INTERNAL_ERROR, "This op is not simple math"); + } +} + +void php_eval_int_math(PHP_EXP_OP op, PHP_VALUE_NODE *op1, PHP_VALUE_NODE *op2, PHP_VALUE_NODE *result) +{ + cast_value_dnum(op1); + cast_value_dnum(op2); + result->type = PHP_VAL_INT; + switch(op) { + case PHP_OP_SHL: + result->int_val = op1->int_val << op2->int_val; + break; + case PHP_OP_SHR: + result->int_val = op1->int_val >> op2->int_val; + break; + case PHP_OP_OR: + result->int_val = op1->int_val | op2->int_val; + break; + case PHP_OP_LOG_OR: + result->int_val = op1->int_val || op2->int_val; + break; + case PHP_OP_AND: + result->int_val = op1->int_val & op2->int_val; + break; + case PHP_OP_LOG_AND: + result->int_val = op1->int_val && op2->int_val; + break; + case PHP_OP_LOG_XOR: + op1->int_val = op1->int_val ? 1 : 0; + op2->int_val = op2->int_val ? 1 : 0; + case PHP_OP_XOR: + result->int_val = op1->int_val ^ op2->int_val; + break; + default: + php_report_error(PHP_INTERNAL_ERROR, "This op is not int math"); + } +} + +// +// left = VAR(func_name), right=ARRAY(args) +void php_run_func_call(PHP_EXP_NODE *node, PHP_VALUE_NODE *result) +{ + PHP_EXP_NODE *l_node = node->tree_node.left; + PHP_EXP_NODE *r_node = node->tree_node.right; + if ( (l_node->op != PHP_OP_VAL) || (l_node->val_node.type != PHP_VAL_STRING) || + (r_node->op != PHP_OP_VAR) || (r_node->var_node->value.type != PHP_VAL_ARRAY) ) { + // + // Internal error: function name must be string value node, and + // params must be an array + // + php_report_error(PHP_INTERNAL_ERROR, "Function call node have wrong data"); + return ; + } + PHP_SCOPE_ITEM *si = get_scope_item(g_global_scope, l_node->val_node.str_val); + if ( !si ) { + // + // Error: undeclared symbol + // + php_report_error(PHP_ERROR, "Function [ %s ] is not defined", l_node->val_node.str_val); + return; + } + if ( si->type != PHP_SCOPE_FUNC) { + // + // Error: defined, but wrong type ! + // + php_report_error(PHP_ERROR, "Item [ %s ] is not a function", l_node->val_node.str_val); + return; + } + PHP_SYN_NODE *func = si->func; + if ( func->type != PHP_ST_FUNC_DECL ) { + // + // Internal error: node not a function + // + php_report_error(PHP_INTERNAL_ERROR, "Wrong type in function decl node"); + return; + } + + // + // Switch stack and call function + // + + PHP_SYN_FUNC_DECL_NODE *func_decl = func->func_decl; + + std::map saved_vars; + func_scope_init(func_decl->params, func_decl->param_count, + (PHP_SCOPE_TABLE_TYPE *)func_decl->scope, + &r_node->var_node->value, saved_vars); + + switch_push_scope_table((PHP_SCOPE_TABLE_TYPE *)func_decl->scope); + + if ( func_decl->is_native ) { + func_decl->native_ptr(result); + } else { + php_execute(func_decl->code, result); + } + + // + // restore stack, free arg list + // + switch_pop_scope_table(0); + func_scope_copy_back(func_decl->params, func_decl->param_count, + (PHP_SCOPE_TABLE_TYPE *)func_decl->scope, &r_node->var_node->value, saved_vars); + + //scope_reset_nonstatics(func_decl->scope); + +} + +/* + * Theoretically speaking this function must run on generated code. On the + * practical side - I need it to debug syntax tree generation. Later, it can + * be changes to generate code for some kind of bytecode for stack machine + */ +int php_execute(PHP_SYN_NODE *node, PHP_VALUE_NODE *result) +{ + if ( !node ) { + return 0; + } + int curr_exec_result; + while ( node ) { + curr_exec_result = 0; + PHP_VALUE_NODE cond_result; + cond_result.type = PHP_VAL_NONE; + switch (node->type) { + case PHP_ST_EXPR: + php_expr_eval(node->node_expr, 0); + break; + case PHP_ST_IF: + php_expr_eval(node->node_if.cond, &cond_result); + cast_value_bool(&cond_result); + if ( cond_result.int_val ) { + if ( node->node_if.code_if ) { + curr_exec_result = php_execute(node->node_if.code_if, result); + } + } else { + if ( node->node_if.code_else ) { + curr_exec_result = php_execute(node->node_if.code_else, result); + } + } + break; + case PHP_ST_RET: + if ( node->node_expr ) { + php_expr_eval(node->node_expr, result); + } + if ( node->next_node ) { + // + // Warning: code after "return" statement + // + php_report_error(PHP_WARNING, "code after 'return'"); + } + // "return" is ultimate "break" + curr_exec_result = -0xffff; + break; + case PHP_ST_ECHO: { + PHP_EXP_NODE *curr = node->node_expr; + while (curr) { + php_expr_eval(curr->exp_node, &cond_result); + cast_value_str(&cond_result); + CPhPLibContext::Print(cond_result.str_val); + value_value_free(&cond_result); + curr = curr->next; + } + } + break; + case PHP_ST_CONTINUE: + case PHP_ST_BREAK: + if ( node->node_expr ) { + php_expr_eval(node->node_expr, &cond_result); + } else { + cond_result.type = PHP_VAL_INT; + cond_result.int_val = 1; + } + cast_value_dnum(&cond_result); + if ( node->type == PHP_ST_BREAK ) { + curr_exec_result = -cond_result.int_val; + } else { + curr_exec_result = cond_result.int_val; + } + break; + + case PHP_ST_WHILE: + case PHP_ST_DO_WHILE: + if ( node->type == PHP_ST_WHILE ) { + php_expr_eval(node->node_while.cond, &cond_result); + cast_value_bool(&cond_result); + } else { + cond_result.int_val = 1; + } + while ( cond_result.int_val ) { + curr_exec_result = php_execute(node->node_while.code, 0); + if ( curr_exec_result < 0 ) { + break; + } + php_expr_eval(node->node_while.cond, &cond_result); + cast_value_bool(&cond_result); + } + break; + case PHP_ST_FOR: + php_expr_eval(node->node_for.do_start, &cond_result); + php_expr_eval(node->node_for.cond, &cond_result); + cast_value_bool(&cond_result); + while ( cond_result.int_val ) { + curr_exec_result = php_execute(node->node_for.code, 0); + if ( curr_exec_result < 0 ) { + break; + } + php_expr_eval(node->node_for.do_next, &cond_result); + php_expr_eval(node->node_for.cond, &cond_result); + cast_value_bool(&cond_result); + } + break; + case PHP_ST_FOREACH: { + PHP_VAR_NODE *elems = php_expr_eval_lvalue(node->node_foreach.elems); + if ( !elems || (elems->value.type != PHP_VAL_ARRAY) ) { + php_report_error(PHP_ERROR, "Argument of 'foreach' must be array"); + break; + } + PHP_ARRAY_TYPE *array = (PHP_ARRAY_TYPE *)elems->value.ptr_val; + PHP_SCOPE_ITEM *i_key = node->node_foreach.i_key; + // keys in array are string values. + if ( i_key ) { + i_key->var->value.type = PHP_VAL_STRING; + } + PHP_SCOPE_ITEM *i_val = node->node_foreach.i_val; + array->current = array->sorted_keys.begin(); + while ( array->current != array->sorted_keys.end() ) { + if ( i_key ) { + PHP_VALUE_NODE tmp_val; + tmp_val.type = PHP_VAL_STRING; + tmp_val.str_val = (char *)array->current->c_str(); + value_value_assign(&i_key->var->value, &tmp_val); + } + PHP_VALUE_NODE *curr_value = &array->array[*array->current]->value; + value_value_assign(&i_val->var->value, curr_value); + curr_exec_result = php_execute(node->node_foreach.code, 0); + if ( i_key ) { + value_value_free(&i_key->var->value); + } + if ( node->node_foreach.byref ) { + value_value_assign(curr_value, &i_val->var->value); + } + value_value_free(&i_val->var->value); + if ( curr_exec_result < 0 ) { + break; + } + array->current++; + } + } + break; + case PHP_ST_SWITCH: { + PHP_SYN_NODE *cur_exec = 0; + php_expr_eval(node->node_switch.cond, &cond_result); + PHP_EXP_NODE *curr = node->node_switch.case_list; + while (curr) { + PHP_VALUE_NODE cur_value, cmp_result; + cur_value.type = cmp_result.type = PHP_VAL_NONE; + php_expr_eval(curr->exp_node->tree_node.left, &cur_value); + + php_eval_compare(PHP_OP_EQ, &cur_value, &cond_result, &cmp_result); + if ( cmp_result.int_val ) { + cur_exec = (PHP_SYN_NODE *)curr->exp_node->tree_node.syn_right; + break; + } + curr = curr->next; + } + if ( cur_exec ) { + php_execute(cur_exec, result); + } + } + break; + default: ; + } + if ( curr_exec_result ) { + return curr_exec_result; + } + node = node->next_node; + } + // everything ok, keep going + return 0; +} + + +// +// call it when something gone wrong +// +void php_report_error(PHP_MSG_TYPE err_type, char *msg, ...) +{ + // + // hope my error message will never be that big. + // + // security is ok, since _user_ errors are not reporting thru + // this function, but handled by scipt itself. + // However, badly written script MAY force user-supplied data to + // leak here and create stack overrun exploit. Be warned. + // + char msgbuf[1024]; + char *type_msg = 0; + switch(err_type) { + case PHP_MESAGE: + type_msg = "PHP:"; + break; + case PHP_WARNING: + type_msg = "PHP Warning:"; + break; + case PHP_ERROR: + type_msg = "PHP Error:"; + break; + case PHP_INTERNAL_ERROR: + type_msg = "PHP Internal Error:"; + break; + } + + va_list args; + va_start(args, msg); + vsnprintf(msgbuf, sizeof(msgbuf), msg, args); + va_end(args); + + printf("%s %s\n", type_msg, msgbuf); + assert(err_type != PHP_INTERNAL_ERROR); +} + + +int yyerror(char *s) +{ + printf("ERROR in grammar %s after [%s] near line %d\n", s, yytext, yylineno); + return 0; +} + +#ifdef PHP_STANDALONE_EN + +int main(int argc, char *argv[]) +{ + const char *filename = ( argc == 2 ) ? argv[1] : "test.php"; + + CWriteStrBuffer buffer; + + yydebug = 0; + + CPhpFilter php_filter((CWebServerBase*)0, (CSession *)0,filename, &buffer); + + int size = buffer.Length(); + char *buf = new char [size+1]; + buffer.CopyAll(buf); + printf("%s", buf); + delete [] buf; + + return 0; +} + +#endif +// File_checked_for_headers diff --git a/src/webserver/src/php_syntree.h b/src/webserver/src/php_syntree.h new file mode 100644 index 00000000..12f0ead4 --- /dev/null +++ b/src/webserver/src/php_syntree.h @@ -0,0 +1,551 @@ +// +// This file is part of the aMule Project. +// +// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (C) 2005-2008 Froenchenko Leonid ( lfroen@amule.org ) +// +// Any parts of this program derived from the xMule, lMule or eMule project, +// or contributed by third-party developers are copyrighted by their +// respective authors. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +/* + * Syntax tree implementation for amule-PHP interpreter. + */ + +#ifndef _PHP_SYNTREE_H_ +#define _PHP_SYNTREE_H_ + +#ifndef __STDC_FORMAT_MACROS + #define __STDC_FORMAT_MACROS +#endif +#include + +typedef enum PHP_VALUE_TYPE { + /* simple values */ + PHP_VAL_NONE, PHP_VAL_INT, PHP_VAL_FLOAT, PHP_VAL_STRING, PHP_VAL_BOOL, + /* both point to same map but meaning is different */ + PHP_VAL_ARRAY, PHP_VAL_OBJECT, + /* Internally used (not ref counted) data */ + PHP_VAL_INT_DATA, + /* ptr_val points to VAR_NODE */ + PHP_VAL_VAR_NODE +} PHP_VALUE_TYPE; + +typedef struct PHP_VALUE_NODE { + PHP_VALUE_TYPE type; + union { + uint64_t int_val; + double float_val; + char *str_val; + /* used for arrays and internal objects: + * * array contain std::map of key:value pairs + * * object contain internally interpreted data + */ + void *ptr_val; + struct { + void *inst_ptr; + char *class_name; + } obj_val; + }; +} PHP_VALUE_NODE; + +/* + * Flags for different variable types/usages + */ + +#define PHP_VARFLAG_STATIC 0x0001 +#define PHP_VARFLAG_GLOBAL 0x0002 +#define PHP_VARFLAG_BYREF 0x0004 + +/* + Data about variable. +*/ +typedef struct PHP_VAR_NODE { + PHP_VALUE_NODE value; + /* php support references */ + int ref_count; + int flags; +} PHP_VAR_NODE; + + +/* + Node in expression tree. Contain either (left op right) or (value) +*/ +typedef enum PHP_EXP_OP { + PHP_OP_VAR, PHP_OP_VAL, PHP_OP_ASS, + + /* dereference */ + PHP_OP_ARRAY_BY_KEY, PHP_OP_VAR_BY_EXP, + + /* array construct */ + PHP_OP_ARRAY, PHP_OP_ARRAY_PAIR, PHP_OP_ARRAY_REF_PAIR, + + /* object access "->" and "::" */ + PHP_OP_OBJECT_DEREF, PHP_OP_CLASS_DEREF, + + /* casting */ + PHP_OP_CAST_INT, PHP_OP_CAST_FLOAT, PHP_OP_CAST_BOOL, PHP_OP_CAST_STR, + + /* arithmetics */ + PHP_OP_MUL, PHP_OP_DIV, PHP_OP_ADD, PHP_OP_SUB, PHP_OP_REM, + /* str concat */ + PHP_OP_CAT, + /* bits */ + PHP_OP_SHL, PHP_OP_SHR, PHP_OP_OR, PHP_OP_AND, PHP_OP_XOR, PHP_OP_NOT, + /* logical */ + PHP_OP_LOG_OR, PHP_OP_LOG_AND, PHP_OP_LOG_XOR, PHP_OP_LOG_NOT, + /* compare */ + PHP_OP_EQ, PHP_OP_NEQ, PHP_OP_SAME, PHP_OP_NOT_SAME, + PHP_OP_GRT, PHP_OP_GRT_EQ, PHP_OP_LWR, PHP_OP_LWR_EQ, + + /* conditional assign (mux) */ + PHP_OP_MUX, + + /* specials */ + PHP_OP_FUNC_CALL, PHP_OP_PRINT, PHP_OP_ECHO, PHP_MAKE_REF, + /* list of expressions */ + PHP_OP_LIST, + /* for "switch" list of cases */ + PHP_OP_CASE +} PHP_EXP_OP; + +struct PHP_EXP_NODE { + PHP_EXP_OP op; + union { + struct { + struct PHP_EXP_NODE *left; + /* In the 'switch' statement expression points + * to beginning of code*/ + union { + struct PHP_EXP_NODE *right; + struct PHP_SYN_NODE *syn_right; + }; + } tree_node; + struct PHP_EXP_NODE *next; + }; + union { + PHP_VALUE_NODE val_node; + // for "internal" variables, like function param list + PHP_VAR_NODE *var_node; + struct PHP_SCOPE_ITEM *var_si_node; + struct PHP_EXP_NODE *exp_node; + }; +}; + +typedef struct PHP_EXP_NODE PHP_EXP_NODE; + +typedef struct PHP_LIST_ASSIGN_NODE PHP_LIST_ASSIGN_NODE; + +struct PHP_LIST_ASSIGN_NODE { + int is_list; + union { + PHP_VAR_NODE *var; + PHP_LIST_ASSIGN_NODE *list; + }; + PHP_LIST_ASSIGN_NODE *next_node; +}; + +typedef struct PHP_FUNC_PARAM_ITEM PHP_FUNC_PARAM_ITEM; + +struct PHP_FUNC_PARAM_ITEM { + char *name; + char *class_name; + int byref; + PHP_FUNC_PARAM_ITEM *next_item; +}; + +typedef struct PHP_SYN_NODE PHP_SYN_NODE; + +/* + * Scope table: holding variable definition and declarations for + * functions and classes + * Can be present in several locations: + * 1. Representing stack frame block, inside of called function + * 2. As global scope - holder of global vars, classes and global functions + * 3. At class scope - holder of class members + * 4. Copied to class instanse + * + */ +typedef enum PHP_SCOPE_ITEM_TYPE { + PHP_SCOPE_NONE, + PHP_SCOPE_VAR, PHP_SCOPE_FUNC, PHP_SCOPE_CLASS, + PHP_SCOPE_PARAM +} PHP_SCOPE_ITEM_TYPE; + + +typedef struct PHP_SCOPE_ITEM { + PHP_SCOPE_ITEM_TYPE type; + union { + PHP_VAR_NODE *var; + PHP_SYN_NODE *func; + PHP_SYN_NODE *class_decl; + struct { + PHP_VAR_NODE *var; + int num; + } param; + }; +} PHP_SCOPE_ITEM; + +/* thre's stl object behind it */ +typedef void *PHP_SCOPE_TABLE; +typedef void *PHP_SCOPE_STACK; + +/* + Syntax tree node, representing 1 statement. +*/ +typedef enum PHP_STATMENT_TYPE { + PHP_ST_EXPR, PHP_ST_IF, + PHP_ST_WHILE, PHP_ST_DO_WHILE, PHP_ST_FOR, PHP_ST_FOREACH, PHP_ST_SWITCH, + PHP_ST_CONTINUE, PHP_ST_BREAK, PHP_ST_RET, + PHP_ST_FUNC_DECL, PHP_ST_CLASS_DECL, + PHP_ST_ECHO +} PHP_STATMENT_TYPE; + +/* + * Syntax tree constructs: regular statements and declarations + */ +typedef struct PHP_SYN_IF_NODE { + PHP_EXP_NODE *cond; + PHP_SYN_NODE *code_if, *code_else; +} PHP_SYN_IF_NODE; + +typedef struct PHP_SYN_WHILE_NODE { + PHP_EXP_NODE *cond; + PHP_SYN_NODE *code; +} PHP_SYN_WHILE_NODE; + +typedef struct PHP_SYN_FOR_NODE { + PHP_EXP_NODE *do_start, *cond, *do_next; + PHP_SYN_NODE *code; +} PHP_SYN_FOR_NODE; + +typedef struct PHP_SYN_FOREACH_NODE { + PHP_EXP_NODE *elems; + PHP_SCOPE_ITEM *i_key; + PHP_SCOPE_ITEM *i_val; + PHP_SYN_NODE *code; + int byref; +} PHP_SYN_FOREACH_NODE; + +typedef struct PHP_SYN_SWITCH_NODE { + PHP_EXP_NODE *cond; + PHP_EXP_NODE *case_list; +} PHP_SYN_SWITCH_NODE; + +/* for built-in or native functions */ +typedef void (*PHP_NATIVE_FUNC_PTR)(PHP_VALUE_NODE *result); + +typedef struct PHP_FUNC_PARAM_DEF { + char *class_name; + int byref; + PHP_VALUE_NODE def_value; + /* + * In PHP, user can choose per-call whether parameter is passed + * by value of by reference. So, save ptr to original varnode, + * for "byvalue" case since we don't have other lvalue to put in + * that scope item. + */ + PHP_VAR_NODE *var; + PHP_SCOPE_ITEM *si_var; +} PHP_FUNC_PARAM_DEF; + + +typedef struct PHP_SYN_FUNC_DECL_NODE { + char *name; + PHP_SCOPE_TABLE scope; + int is_native; + union { + PHP_SYN_NODE *code; + PHP_NATIVE_FUNC_PTR native_ptr; + }; + int param_count; + PHP_FUNC_PARAM_DEF *params; +} PHP_SYN_FUNC_DECL_NODE; + +/* + * Evaluating $obj->some_field for built-in objects + */ +typedef void (*PHP_NATIVE_PROP_GET_FUNC_PTR)(void *obj, char *prop_name, PHP_VALUE_NODE *result); + +typedef struct PHP_SYN_CLASS_DECL_NODE { + int is_native; + char *name; + union { + PHP_SCOPE_TABLE decl_scope; + PHP_NATIVE_PROP_GET_FUNC_PTR native_prop_get_ptr; + }; +} PHP_SYN_CLASS_DECL_NODE; + +struct PHP_SYN_NODE { + PHP_STATMENT_TYPE type; + union { + PHP_EXP_NODE *node_expr; + PHP_SYN_IF_NODE node_if; + PHP_SYN_WHILE_NODE node_while; + PHP_SYN_FOREACH_NODE node_foreach; + PHP_SYN_FOR_NODE node_for; + PHP_SYN_SWITCH_NODE node_switch; + PHP_SYN_FUNC_DECL_NODE *func_decl; + PHP_SYN_CLASS_DECL_NODE *class_decl; + }; + PHP_SYN_NODE *next_node; +}; + +/* + * Interface to lib of built-in functions, classes, variables + */ +/* + * Using fixed size array will allow "in-place" definition + * of built-in functions without pointer mess. + * + */ +#define PHP_MAX_FUNC_PARAM 16 + +typedef struct PHP_BLTIN_FUNC_DEF { + char *name; + int param_count; + PHP_NATIVE_FUNC_PTR func; +} PHP_BLTIN_FUNC_DEF; + +typedef enum PHP_MSG_TYPE { + PHP_MESAGE, PHP_WARNING, PHP_ERROR, PHP_INTERNAL_ERROR +} PHP_MSG_TYPE; + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * lex/yacc stuff + */ + int yyerror(char *err); + int yyparse(); + + extern int yydebug; + extern FILE *yyin; + extern char *yytext; + extern int yylineno; + +/* + * Syntax tree interface to parser + */ + +/* + * Const expressions + */ + PHP_EXP_NODE *make_const_exp_dnum(int number); + PHP_EXP_NODE *make_const_exp_fnum(float number); + PHP_EXP_NODE *make_const_exp_str(char *s, int unescape); + + // exp node for internally handled data + PHP_EXP_NODE *make_const_exp_int_obj(void *obj); + + /* casting functions */ + void cast_value_dnum(PHP_VALUE_NODE *e); + void cast_value_fnum(PHP_VALUE_NODE *e); + void cast_value_str(PHP_VALUE_NODE *e); + void cast_value_array(PHP_VALUE_NODE *e); + void cast_value_bool(PHP_VALUE_NODE *e); + + void value_value_free(PHP_VALUE_NODE *val); + void value_value_assign(PHP_VALUE_NODE *src, PHP_VALUE_NODE *dst); + void var_node_free(PHP_VAR_NODE *var); + + /* array operations */ + PHP_VAR_NODE *array_get_by_key(PHP_VALUE_NODE *array, PHP_VALUE_NODE *key); + PHP_VAR_NODE *array_get_by_int_key(PHP_VALUE_NODE *array, int key); + + int array_is_key_here(PHP_VALUE_NODE *array, PHP_VALUE_NODE *key); + int array_get_size(PHP_VALUE_NODE *array); + PHP_VAR_NODE *array_push_back(PHP_VALUE_NODE *array); + + void array_add_to_int_key(PHP_VALUE_NODE *array, int key, PHP_VAR_NODE *node); + void array_set_by_key(PHP_VALUE_NODE *array, PHP_VALUE_NODE *key, PHP_VAR_NODE *node); + + PHP_VAR_NODE *make_array_var(); + + // signle operand expression: + // FIXME: prefix and postfix form not recognized + PHP_EXP_NODE *make_exp_1(PHP_EXP_OP op, PHP_EXP_NODE *operand); + + PHP_EXP_NODE *make_exp_2(PHP_EXP_OP op, PHP_EXP_NODE *left, PHP_EXP_NODE *right); + + // this is for "OP=" forms + PHP_EXP_NODE *make_exp_2_self(PHP_EXP_OP op, PHP_EXP_NODE *self, PHP_EXP_NODE *right); + + PHP_EXP_NODE *make_known_const(char *name); + + PHP_EXP_NODE *make_func_call_exp(char *func_name, PHP_EXP_NODE *args); + + // create func call param list + PHP_EXP_NODE *make_func_call_param_list(); + + // add next argument to function call param list + void func_call_add_expr(PHP_VAR_NODE *paramlist, PHP_EXP_NODE *arg, int byref); + + + extern PHP_SYN_NODE *g_syn_tree_top; + + /* make syntax node for expression */ + PHP_SYN_NODE *make_expr_syn_node(PHP_STATMENT_TYPE type, PHP_EXP_NODE *node); + + PHP_SYN_NODE *make_ifelse_syn_node(PHP_EXP_NODE *expr, + PHP_SYN_NODE *then_node, PHP_SYN_NODE *elseif_list, PHP_SYN_NODE *else_node); + + PHP_SYN_NODE *make_while_loop_syn_node(PHP_EXP_NODE *cond, + PHP_SYN_NODE *code, int do_while); + + PHP_SYN_NODE *make_foreach_loop_syn_node(PHP_EXP_NODE *elems, + PHP_EXP_NODE *i_key, PHP_EXP_NODE *i_val, PHP_SYN_NODE *code, int byref); + + PHP_SYN_NODE *make_for_syn_node(PHP_EXP_NODE *start, PHP_EXP_NODE *cond, + PHP_EXP_NODE *next, PHP_SYN_NODE *code); + + PHP_SYN_NODE *make_class_decl_syn_node(); + + PHP_SYN_NODE *make_func_decl_syn_node(char *name, PHP_EXP_NODE *param_list); + + PHP_SYN_NODE *make_switch_syn_node(PHP_EXP_NODE *cond, PHP_EXP_NODE *case_list); + + // + // add new item into function param list (in declaration ) + // + PHP_EXP_NODE *make_func_param(PHP_EXP_NODE *list, PHP_EXP_NODE *var_exp_node, + char *class_name, int byref); + + PHP_VAR_NODE *make_var_node(); + PHP_EXP_NODE *get_var_node(char *name); + // C can't call "delete" + void free_var_node(PHP_VAR_NODE *v); + + /* scope table manipulation */ + extern PHP_SCOPE_TABLE g_global_scope, g_current_scope; + extern PHP_SCOPE_STACK g_scope_stack; + + PHP_SCOPE_TABLE make_scope_table(); + + void delete_scope_table(PHP_SCOPE_TABLE scope); + + void switch_push_scope_table(PHP_SCOPE_TABLE new_table); + + void switch_pop_scope_table(int old_free); + + void scope_reset_nonstatics(PHP_SCOPE_TABLE scope); + + void add_func_2_scope(PHP_SCOPE_TABLE scope, PHP_SYN_NODE *func); + + void add_class_2_scope(PHP_SCOPE_TABLE scope, PHP_SYN_NODE *class_node); + + PHP_SCOPE_ITEM *add_var_2_scope(PHP_SCOPE_TABLE scope, PHP_VAR_NODE *var, const char *name); + + const char *get_scope_var_name(PHP_SCOPE_TABLE scope, PHP_VAR_NODE *var); + + PHP_SCOPE_ITEM_TYPE get_scope_item_type(PHP_SCOPE_TABLE scope, const char *name); + + PHP_SCOPE_ITEM *get_scope_item(PHP_SCOPE_TABLE scope, const char *name); + + /* engine */ + void php_engine_init(); + void php_engine_free(); + + void php_syn_tree_free(PHP_SYN_NODE *tree); + void php_exp_tree_free(PHP_EXP_NODE *tree); + + /* + * Return code meaning: + * 0 : continue execution to the next statement + * +x : return and skip current loop cycle, as "continue expr" means + * -x : return and break as "break expr" means + * In non-loop situation any != 0 code means "return" + */ + int php_execute(PHP_SYN_NODE *node, PHP_VALUE_NODE *result); + + void php_expr_eval(PHP_EXP_NODE *expr, PHP_VALUE_NODE *result); + + PHP_VAR_NODE *php_expr_eval_lvalue(PHP_EXP_NODE *expr); + + void php_eval_simple_math(PHP_EXP_OP op, + PHP_VALUE_NODE *op1, PHP_VALUE_NODE *op2, PHP_VALUE_NODE *result); + + void php_eval_int_math(PHP_EXP_OP op, + PHP_VALUE_NODE *op1, PHP_VALUE_NODE *op2, PHP_VALUE_NODE *result); + + void php_eval_compare(PHP_EXP_OP op, + PHP_VALUE_NODE *op1, PHP_VALUE_NODE *op2, PHP_VALUE_NODE *result); + + void php_add_native_func(PHP_BLTIN_FUNC_DEF *def); + void php_add_native_class(char *name, PHP_NATIVE_PROP_GET_FUNC_PTR prop_get_native_ptr); + + // + // left = VAR(func_name), right=ARRAY(args) + void php_run_func_call(PHP_EXP_NODE *node, PHP_VALUE_NODE *result); + +#if defined(__GNUC__) + void php_report_error(PHP_MSG_TYPE mtype, char *msg, ...) __attribute__ ((__format__ (__printf__, 2, 3))); +#else + void php_report_error(PHP_MSG_TYPE mtype, char *msg, ...); +#endif + +/* + * Debugging + */ + void print_val_node(PHP_VALUE_NODE *node, int ident); + void print_exp_node(PHP_EXP_NODE *node, int ident); + void print_syn_node(PHP_SYN_NODE *node, int ident); + +#ifdef __cplusplus +} +#endif + +/* + * C++ only functions, type definitions + */ +#ifdef __cplusplus + +typedef std::map::iterator PHP_ARRAY_ITER_TYPE; +typedef std::list::iterator PHP_ARRAY_KEY_ITER_TYPE; +// +// In php arrays are behave like hashes (i.e. associative) and are sortable. +// STL std::map is not sortable. +// +typedef struct { + std::map array; + std::list sorted_keys; + PHP_ARRAY_KEY_ITER_TYPE current; +} PHP_ARRAY_TYPE; + +// +// using std::string instead of "char *" so keys will be compared +// by string value +typedef std::map PHP_SCOPE_TABLE_TYPE; +typedef std::list PHP_SCOPE_STACK_TYPE; + +const std::string &array_get_ith_key(PHP_VALUE_NODE *array, int i); +PHP_VAR_NODE *array_get_by_str_key(PHP_VALUE_NODE *array, std::string key); +void array_add_to_str_key(PHP_VALUE_NODE *array, std::string key, PHP_VAR_NODE *node); +void array_remove_at_str_key(PHP_VALUE_NODE *array, std::string key); + +void func_scope_init(PHP_FUNC_PARAM_DEF *params, int param_count, + PHP_SCOPE_TABLE_TYPE *scope_map, PHP_VALUE_NODE *arg_array, + std::map &saved_vars); + + +#endif + +#endif //_PHP_SYNTREE_H_ +// File_checked_for_headers diff --git a/unittests/Makefile.am b/unittests/Makefile.am new file mode 100644 index 00000000..b151236e --- /dev/null +++ b/unittests/Makefile.am @@ -0,0 +1,7 @@ +SUBDIRS = +MAINTAINERCLEANFILES = Makefile.in +DIST_SUBDIRS = muleunit tests + +# The only targets which we care about +TARGETS = check-recursive clean-recursive +$(TARGETS): SUBDIRS = $(DIST_SUBDIRS) diff --git a/unittests/Makefile.in b/unittests/Makefile.in new file mode 100644 index 00000000..84ef09d2 --- /dev/null +++ b/unittests/Makefile.in @@ -0,0 +1,606 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = unittests +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +SUBDIRS = +MAINTAINERCLEANFILES = Makefile.in +DIST_SUBDIRS = muleunit tests + +# The only targets which we care about +TARGETS = check-recursive clean-recursive +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign unittests/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign unittests/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-recursive ctags ctags-recursive \ + distclean distclean-generic distclean-recursive distclean-tags \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-info-am + +$(TARGETS): SUBDIRS = $(DIST_SUBDIRS) +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/unittests/README b/unittests/README new file mode 100644 index 00000000..80ef3305 --- /dev/null +++ b/unittests/README @@ -0,0 +1,146 @@ +UnitTests provide an easy way to perform automated testing (including) +regression-testing and are desbribed in depth at +http://c2.com/cgi/wiki?UnitTest + +The UnitTest framework MuleUnit is a minimalistic UnitTesting-framework +based on the EasyUnit framework, with the goal of making testing of the +aMule codebase easier. + + +How to use: + This section describes the step-by-step of creating a new testcase. + + It is recommended that each test-case (a collection of tests) is + placed in a seperate .cpp file, in general, one test-case per class. + + In the following examples, I will test a non-existing stack template + class which has the member-functions push (back) and pop (front). + + + 1) Creating the test skeleton: + Test-cases exist in two flavors: With a fixture and without. + A fixture is a way to ease the preparation before and after + each test and consists of (optionally) a setUp function which + is run before each unittest, a tearDown function wich is run + after each unittest and any number of member-variables and + helper-functions. + + + A simple testcase (in this case for the Stack class) is declared + like this, though the name "StackTest" may be anything. + + #include + + DECLARE_SIMPLE(StackTest); + + + If we wanted to have a default stack-object created before each test + and deleted afterwards, we could use a fixture, which is done like so: + + #include + + DECLARE(StackTest); + Stack* m_stack; + + //! Called before each test. + void setUp() { + m_stack = new Stack(); + } + + //! Called after each test + void tearDown() { + delete m_stack; + } + END_DECLARE(); + + + Both DECLARE statements creates a base-class from which the unittests + are derived, and the section between DECLARE(..) and END_DECLARE() are + used verbatim in the definition of said baseclass. + + + 2) Writing Tests + To add an actual test to the test-case, the following is done: + + TEST(StackTest, AStackTest) + { + + } + + + This will create and register a unittest to the StackTest + test-case which has the name "AStackTest". An simple example + of this can be seen here: + + TEST(StackTest, PushAndPop) + { + m_stack->push(10); + + ASSERT_EQUALS(10, m_stack->pop()); + } + + + A test-case can have any number of unittests assosiated with it, + but each test in a test-case must be uniquely named. + + + 3) Building the test + Assuming that the testcase described above has been placed in + tests/StackTest.cpp, the follow entry needs to be added to the + Makefile.am file in tests/: + + StackTest_SOURCES = StackTest.cpp + StackTest_CXXFLAGS = $(CXXFLAGS) + StackTest_LDADD = $(LDADD) + + And the TESTS variable must be updated to contain an entry for + the stack testcase: "StackTest" + + At the moment, in order for the makefile to be updated with the + next test-case you need to execute the following from the + amule-dev/ dir: + + $ automake unittests/tests/Makefile + $ ./configure + + This only need to be done when the Makefile.am file has been + changed, not when test test-cases themselves are changed. + + + 4) Running the test + Simply executing the make target check will execute all unittests + registered in the Makefile ("-s" is used for silent operation): + + $ make -s check + + Making check in tests + Test case "StackTest" SUCCEEDED with 0 failure(s) and 1 success(es): + Test "AStackTest" SUCCEEDED! + + PASS: StackTest + + ================== + All 1 tests passed + ================== + + + Should a test fail, the output will be like the following: + + $ make -s check + + Making check in tests + Test case "StackTest" FAILED with 1 failure(s) and 0 success(es): + Test "Foo" FAILED : + Failure: "Test failed." line 11 in StackTest.cpp + + + FAIL: StackTest + ================================ + 1 of 1 tests failed + Please report to admin@amule.org + ================================ + + 5) More + More information about available test-macros can be found in the + muleunit/test.h header-file. + diff --git a/unittests/muleunit/Makefile.am b/unittests/muleunit/Makefile.am new file mode 100644 index 00000000..2afb8cc2 --- /dev/null +++ b/unittests/muleunit/Makefile.am @@ -0,0 +1,16 @@ +noinst_LIBRARIES = libmuleunit.a +libmuleunit_a_SOURCES = \ + test.cpp \ + test.h \ + main.cpp \ + testcase.cpp \ + testcase.h \ + testregistry.cpp \ + testregistry.h \ + $(top_srcdir)/src/libs/common/MuleDebug.cpp + +libmuleunit_a_CXXFLAGS = $(WXBASE_CXXFLAGS) -I$(top_srcdir)/src/libs -DMULEUNIT + +EXTRA_DIST = license.txt + +MAINTAINERCLEANFILES = Makefile.in diff --git a/unittests/muleunit/Makefile.in b/unittests/muleunit/Makefile.in new file mode 100644 index 00000000..eb5d49d9 --- /dev/null +++ b/unittests/muleunit/Makefile.in @@ -0,0 +1,635 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +SOURCES = $(libmuleunit_a_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = unittests/muleunit +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +libmuleunit_a_AR = $(AR) $(ARFLAGS) +libmuleunit_a_LIBADD = +am_libmuleunit_a_OBJECTS = libmuleunit_a-test.$(OBJEXT) \ + libmuleunit_a-main.$(OBJEXT) libmuleunit_a-testcase.$(OBJEXT) \ + libmuleunit_a-testregistry.$(OBJEXT) \ + libmuleunit_a-MuleDebug.$(OBJEXT) +libmuleunit_a_OBJECTS = $(am_libmuleunit_a_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libmuleunit_a_SOURCES) +DIST_SOURCES = $(libmuleunit_a_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +noinst_LIBRARIES = libmuleunit.a +libmuleunit_a_SOURCES = \ + test.cpp \ + test.h \ + main.cpp \ + testcase.cpp \ + testcase.h \ + testregistry.cpp \ + testregistry.h \ + $(top_srcdir)/src/libs/common/MuleDebug.cpp + +libmuleunit_a_CXXFLAGS = $(WXBASE_CXXFLAGS) -I$(top_srcdir)/src/libs -DMULEUNIT +EXTRA_DIST = license.txt +MAINTAINERCLEANFILES = Makefile.in +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign unittests/muleunit/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign unittests/muleunit/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +libmuleunit.a: $(libmuleunit_a_OBJECTS) $(libmuleunit_a_DEPENDENCIES) + -rm -f libmuleunit.a + $(libmuleunit_a_AR) libmuleunit.a $(libmuleunit_a_OBJECTS) $(libmuleunit_a_LIBADD) + $(RANLIB) libmuleunit.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleunit_a-MuleDebug.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleunit_a-main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleunit_a-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleunit_a-testcase.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmuleunit_a-testregistry.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +libmuleunit_a-test.o: test.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleunit_a-test.o -MD -MP -MF "$(DEPDIR)/libmuleunit_a-test.Tpo" -c -o libmuleunit_a-test.o `test -f 'test.cpp' || echo '$(srcdir)/'`test.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleunit_a-test.Tpo" "$(DEPDIR)/libmuleunit_a-test.Po"; else rm -f "$(DEPDIR)/libmuleunit_a-test.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='test.cpp' object='libmuleunit_a-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleunit_a-test.o `test -f 'test.cpp' || echo '$(srcdir)/'`test.cpp + +libmuleunit_a-test.obj: test.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleunit_a-test.obj -MD -MP -MF "$(DEPDIR)/libmuleunit_a-test.Tpo" -c -o libmuleunit_a-test.obj `if test -f 'test.cpp'; then $(CYGPATH_W) 'test.cpp'; else $(CYGPATH_W) '$(srcdir)/test.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleunit_a-test.Tpo" "$(DEPDIR)/libmuleunit_a-test.Po"; else rm -f "$(DEPDIR)/libmuleunit_a-test.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='test.cpp' object='libmuleunit_a-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleunit_a-test.obj `if test -f 'test.cpp'; then $(CYGPATH_W) 'test.cpp'; else $(CYGPATH_W) '$(srcdir)/test.cpp'; fi` + +libmuleunit_a-main.o: main.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleunit_a-main.o -MD -MP -MF "$(DEPDIR)/libmuleunit_a-main.Tpo" -c -o libmuleunit_a-main.o `test -f 'main.cpp' || echo '$(srcdir)/'`main.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleunit_a-main.Tpo" "$(DEPDIR)/libmuleunit_a-main.Po"; else rm -f "$(DEPDIR)/libmuleunit_a-main.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='main.cpp' object='libmuleunit_a-main.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleunit_a-main.o `test -f 'main.cpp' || echo '$(srcdir)/'`main.cpp + +libmuleunit_a-main.obj: main.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleunit_a-main.obj -MD -MP -MF "$(DEPDIR)/libmuleunit_a-main.Tpo" -c -o libmuleunit_a-main.obj `if test -f 'main.cpp'; then $(CYGPATH_W) 'main.cpp'; else $(CYGPATH_W) '$(srcdir)/main.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleunit_a-main.Tpo" "$(DEPDIR)/libmuleunit_a-main.Po"; else rm -f "$(DEPDIR)/libmuleunit_a-main.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='main.cpp' object='libmuleunit_a-main.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleunit_a-main.obj `if test -f 'main.cpp'; then $(CYGPATH_W) 'main.cpp'; else $(CYGPATH_W) '$(srcdir)/main.cpp'; fi` + +libmuleunit_a-testcase.o: testcase.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleunit_a-testcase.o -MD -MP -MF "$(DEPDIR)/libmuleunit_a-testcase.Tpo" -c -o libmuleunit_a-testcase.o `test -f 'testcase.cpp' || echo '$(srcdir)/'`testcase.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleunit_a-testcase.Tpo" "$(DEPDIR)/libmuleunit_a-testcase.Po"; else rm -f "$(DEPDIR)/libmuleunit_a-testcase.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='testcase.cpp' object='libmuleunit_a-testcase.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleunit_a-testcase.o `test -f 'testcase.cpp' || echo '$(srcdir)/'`testcase.cpp + +libmuleunit_a-testcase.obj: testcase.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleunit_a-testcase.obj -MD -MP -MF "$(DEPDIR)/libmuleunit_a-testcase.Tpo" -c -o libmuleunit_a-testcase.obj `if test -f 'testcase.cpp'; then $(CYGPATH_W) 'testcase.cpp'; else $(CYGPATH_W) '$(srcdir)/testcase.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleunit_a-testcase.Tpo" "$(DEPDIR)/libmuleunit_a-testcase.Po"; else rm -f "$(DEPDIR)/libmuleunit_a-testcase.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='testcase.cpp' object='libmuleunit_a-testcase.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleunit_a-testcase.obj `if test -f 'testcase.cpp'; then $(CYGPATH_W) 'testcase.cpp'; else $(CYGPATH_W) '$(srcdir)/testcase.cpp'; fi` + +libmuleunit_a-testregistry.o: testregistry.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleunit_a-testregistry.o -MD -MP -MF "$(DEPDIR)/libmuleunit_a-testregistry.Tpo" -c -o libmuleunit_a-testregistry.o `test -f 'testregistry.cpp' || echo '$(srcdir)/'`testregistry.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleunit_a-testregistry.Tpo" "$(DEPDIR)/libmuleunit_a-testregistry.Po"; else rm -f "$(DEPDIR)/libmuleunit_a-testregistry.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='testregistry.cpp' object='libmuleunit_a-testregistry.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleunit_a-testregistry.o `test -f 'testregistry.cpp' || echo '$(srcdir)/'`testregistry.cpp + +libmuleunit_a-testregistry.obj: testregistry.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleunit_a-testregistry.obj -MD -MP -MF "$(DEPDIR)/libmuleunit_a-testregistry.Tpo" -c -o libmuleunit_a-testregistry.obj `if test -f 'testregistry.cpp'; then $(CYGPATH_W) 'testregistry.cpp'; else $(CYGPATH_W) '$(srcdir)/testregistry.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleunit_a-testregistry.Tpo" "$(DEPDIR)/libmuleunit_a-testregistry.Po"; else rm -f "$(DEPDIR)/libmuleunit_a-testregistry.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='testregistry.cpp' object='libmuleunit_a-testregistry.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleunit_a-testregistry.obj `if test -f 'testregistry.cpp'; then $(CYGPATH_W) 'testregistry.cpp'; else $(CYGPATH_W) '$(srcdir)/testregistry.cpp'; fi` + +libmuleunit_a-MuleDebug.o: $(top_srcdir)/src/libs/common/MuleDebug.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleunit_a-MuleDebug.o -MD -MP -MF "$(DEPDIR)/libmuleunit_a-MuleDebug.Tpo" -c -o libmuleunit_a-MuleDebug.o `test -f '$(top_srcdir)/src/libs/common/MuleDebug.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/MuleDebug.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleunit_a-MuleDebug.Tpo" "$(DEPDIR)/libmuleunit_a-MuleDebug.Po"; else rm -f "$(DEPDIR)/libmuleunit_a-MuleDebug.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/MuleDebug.cpp' object='libmuleunit_a-MuleDebug.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleunit_a-MuleDebug.o `test -f '$(top_srcdir)/src/libs/common/MuleDebug.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/MuleDebug.cpp + +libmuleunit_a-MuleDebug.obj: $(top_srcdir)/src/libs/common/MuleDebug.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -MT libmuleunit_a-MuleDebug.obj -MD -MP -MF "$(DEPDIR)/libmuleunit_a-MuleDebug.Tpo" -c -o libmuleunit_a-MuleDebug.obj `if test -f '$(top_srcdir)/src/libs/common/MuleDebug.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/MuleDebug.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/MuleDebug.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libmuleunit_a-MuleDebug.Tpo" "$(DEPDIR)/libmuleunit_a-MuleDebug.Po"; else rm -f "$(DEPDIR)/libmuleunit_a-MuleDebug.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/MuleDebug.cpp' object='libmuleunit_a-MuleDebug.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmuleunit_a_CXXFLAGS) $(CXXFLAGS) -c -o libmuleunit_a-MuleDebug.obj `if test -f '$(top_srcdir)/src/libs/common/MuleDebug.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/MuleDebug.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/MuleDebug.cpp'; fi` +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-noinstLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/unittests/muleunit/license.txt b/unittests/muleunit/license.txt new file mode 100644 index 00000000..ba48ddcd --- /dev/null +++ b/unittests/muleunit/license.txt @@ -0,0 +1,459 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, 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 library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete 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 distribute a copy of this License along with the +Library. + + 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 Library or any portion +of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +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 Library, 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 Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you 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. + + If distribution of 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 satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be 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. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library 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. + + 9. 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 Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +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 with +this License. + + 11. 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 Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library 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 Library. + +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. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library 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. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser 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 Library +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 Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +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 + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. 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 LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + \ No newline at end of file diff --git a/unittests/muleunit/main.cpp b/unittests/muleunit/main.cpp new file mode 100644 index 00000000..e630cd37 --- /dev/null +++ b/unittests/muleunit/main.cpp @@ -0,0 +1,69 @@ +// +// MuleUnit: A minimalistic C++ Unit testing framework based on EasyUnit. +// +// Copyright (c) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (C) 2004 Barthelemy Dagenais (barthelemy@prologique.com) +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include +#include "testregistry.h" +#include "test.h" +#include + +using namespace muleunit; + +wxString GetFullMuleVersion() +{ + return wxT("UnitTest"); +} + + +unsigned s_disableAssertions = 0; + + +class UnitTestApp : public wxAppConsole +{ +public: + int OnRun() { + return (TestRegistry::runAndPrint() ? 0 : 1); + } + + void OnAssertFailure(const wxChar* file, int line, const wxChar* func, const wxChar* cond, const wxChar* msg) + { + if (s_disableAssertions) { + return; + } + + wxString desc; + if (cond && msg) { + desc << cond << wxT(" -- ") << msg; + } else if (cond) { + desc << wxT("Assertion: ") << cond; + } else { + desc << msg; + } + + throw CAssertFailureException(desc, file, line); + } + + void OnUnhandledException() { + ::OnUnhandledException(); + } +}; + + +IMPLEMENT_APP(UnitTestApp); diff --git a/unittests/muleunit/test.cpp b/unittests/muleunit/test.cpp new file mode 100644 index 00000000..1460a02d --- /dev/null +++ b/unittests/muleunit/test.cpp @@ -0,0 +1,160 @@ +// +// MuleUnit: A minimalistic C++ Unit testing framework based on EasyUnit. +// +// Copyright (c) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (C) 2004 Barthelemy Dagenais (barthelemy@prologique.com) +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#include "test.h" +#include "testregistry.h" +#include + +using namespace muleunit; + +/** Entry for a context. */ +struct BTEntry +{ + BTEntry(const wxChar* f, int l, const wxString& m) + : file(f) + , line(l) + , msg(m) + { + } + + wxString file; + int line; + wxString msg; +}; + + +static std::list g_backtrace; + +namespace muleunit { + /** Structure used to contain a snapshot of the contexts. */ + struct BTList + { + BTList(const std::list& lst) + : snapshot(lst) + { + } + + std::list snapshot; + }; +} + + +CTestFailureException::CTestFailureException(const wxString& msg, const wxChar* file, long lineNumber) + : m_message(msg.ToAscii()) + , m_bt(new BTList(g_backtrace)) +{ + m_bt->snapshot.push_back(BTEntry(file, lineNumber, msg)); +} + + +CTestFailureException::~CTestFailureException() throw() +{ + delete m_bt; +} + + +void CTestFailureException::PrintBT() const +{ + wxString indent = wxT("\t\t"); + std::list::const_iterator it = m_bt->snapshot.begin(); + for (; it != m_bt->snapshot.end(); ++it) { + indent += ' '; + + Printf(wxT("%s%s:%i -- %s"), + wxString(indent.c_str(), wxConvLocal).c_str(), + it->file.c_str(), + it->line, + it->msg.c_str()); + } +} + + +const char* CTestFailureException::what () const throw () +{ + return m_message.c_str(); +} + + +CContext::CContext(const wxChar* file, int line, const wxString& msg) +{ + g_backtrace.push_back(BTEntry(file, line, msg)); +} + + +CContext::~CContext() +{ + g_backtrace.pop_back(); +} + +extern unsigned s_disableAssertions; + + +CAssertOff::CAssertOff() +{ + s_disableAssertions++; +} + +CAssertOff::~CAssertOff() +{ + s_disableAssertions--; +} + + + +Test::Test(const wxString& testCaseName, const wxString& testName) + : m_testCaseName(testCaseName), + m_testName(testName) +{ + TestRegistry::addTest(this); +} + + +Test::~Test() +{ +} + + +void Test::setUp() +{ +} + + +void Test::tearDown() +{ +} + + +void Test::run() +{ +} + + +const wxString& Test::getTestName() const +{ + return m_testName; +} + + +const wxString& Test::getTestCaseName() const +{ + return m_testCaseName; +} + diff --git a/unittests/muleunit/test.h b/unittests/muleunit/test.h new file mode 100644 index 00000000..7d867a80 --- /dev/null +++ b/unittests/muleunit/test.h @@ -0,0 +1,386 @@ +// +// MuleUnit: A minimalistic C++ Unit testing framework based on EasyUnit. +// +// Copyright (c) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (C) 2004 Barthelemy Dagenais (barthelemy@prologique.com) +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + +#ifndef TEST_H +#define TEST_H + +#include + +#include +#include + + + +/** + * MuleUnit namespace. + * This is the namespace containing all muleunit classes. + */ +namespace muleunit +{ + +class TestCase; +class BTList; + + +/** Returns the size of a static array. */ +template +inline size_t ArraySize(T(&)[N]) +{ + return N; +} + + +/** Printf for wide-char strings. */ +inline void Printf(const wxChar *pszFormat, ...) +{ + va_list argptr; + va_start(argptr, pszFormat); + + wxPuts(wxString::FormatV(pszFormat, argptr).c_str()); + + va_end(argptr); +} + + +/** This exception is raised if an ASSERT fails. */ +struct CTestFailureException : public std::exception +{ + /** Constructor, takes a snapshot of the current context, and adds the given information. */ + CTestFailureException(const wxString& msg, const wxChar* file, long lineNumber); + + ~CTestFailureException() throw(); + + /** Prints the context backtrace for the location where the exception was thrown. */ + void PrintBT() const; + + virtual const char* what () const throw (); +private: + //! Pointer to struct containing a snapshot of the contexts + //! taken at the time the exception was created. + struct BTList* m_bt; + + //! The message passed in the constructor. + std::string m_message; +}; + +/** This exception is raised if an wxASSERT fails. */ +struct CAssertFailureException : public CTestFailureException +{ +public: + CAssertFailureException(const wxString& msg, const wxChar* file, long lineNumber) + : CTestFailureException(msg, file, lineNumber) + { + } +}; + + +/** + * This class is used to produce informative backtraces + * + * This is done by specifying a "context" for a given scope, using + * the CONTEXT macro, at which point a description is added to the + * current list of contexts. At destruction, when the scope is exited, + * the context is removed from the queue. + * + * The resulting "backtrace" can then be printed by calling the + * PrintBT() function of an CTestFailureException. + */ +class CContext +{ +public: + /** Adds a context with the specified information and description. */ + CContext(const wxChar* file, int line, const wxString& desc); + + /** Removes the context addded by the constructor. */ + ~CContext(); +}; + + +//! Used to join the CContext instance name with the line-number. +//! This is done to prevent shadowing. +#define DO_CONTEXT(x, y, z) x y##z + +//! Specifies the context of the current scope. +#define CONTEXT(x) CContext wxCONCAT(context,__LINE__)(wxT(__FILE__), __LINE__, x) + + +/** + * This class disables assertions while it is in scope. + */ +class CAssertOff +{ +public: + CAssertOff(); + ~CAssertOff(); +}; + + +/** + * Test class containing all macros to do unit testing. + * A test object represents a test that will be executed. Once it has been + * executed, it reports all failures in the testPartResult linked list. + * + * A failure occurs when a test fails (condition is false). + */ +class Test +{ +public: + /** + * Main Test constructor. Used to create a test that will register itself + * with TestRegistry and with its test case. + * @param testCaseName Name of the test case this test belongs to + * @param testName Name of this test + */ + Test(const wxString& testCaseName, const wxString& testName); + + /** + * Main Test desctructor + * Delete the testPartResult linked list. This is why the user should + * only use the macro provided by muleunit to report a test result. + */ + virtual ~Test(); + + /** + * Fixtures that will be called after run(). + */ + virtual void tearDown(); + + /** + * Fixtures that will be called before run(). + */ + virtual void setUp(); + + /** + * Test code should be in this method. + * run() will be called by the Test's TestCase, hence subclasses of Test + * should override this method. + */ + virtual void run(); + + /** + * Get the name of the TestCase this test belongs to. The name of the + * TestCase is the first parameter of the test declaration. For example, + * if a test is declared as TEST(TESTCASE1, TEST1), this method will return + * "TESTCASE1". + * + * @return The TestCase name of this test + */ + const wxString& getTestCaseName() const; + + /** + * Get the name of this test. The name of the test is the second + * parameter of the test declaration. For example, + * if a test is declared as TEST(TESTCASE1, TEST1), this method will return + * "TEST1". + * + * @return The name of this test. + */ + const wxString& getTestName() const; + + template + static void DoAssertEquals(const wxString& file, unsigned line, const A& a, const B& b) + { + if (!(a == b)) { + wxString message = wxT("Expected '") + StringFrom(a) + + wxT("' but got '") + StringFrom(b) + wxT("'"); + + throw CTestFailureException(message, file, line); + } + } + +protected: + wxString m_testCaseName; + wxString m_testName; + TestCase* m_testCase; +}; + + +/** + * Helperfunction that converts basic types to strings. + */ +template +wxString StringFrom(const TYPE& value) +{ + return wxString() << value; +} + +inline wxString StringFrom(unsigned long long value) +{ + return wxString::Format(wxT("%") wxLongLongFmtSpec wxT("u"), value); +} + +inline wxString StringFrom(signed long long value) +{ + return wxString::Format(wxT("%") wxLongLongFmtSpec wxT("i"), value); +} + + +#define THROW_TEST_FAILURE(message) \ + throw CTestFailureException(message, wxT(__FILE__), __LINE__) + + +/** + * Asserts that a condition is true. + * If the condition is not true, a failure is generated. + * @param condition Condition to fullfill for the assertion to pass + * @param message Message that will be displayed if this assertion fails + */ +#define ASSERT_TRUE_M(condition, message) \ +{ \ + if (!(condition)) { \ + THROW_TEST_FAILURE(message); \ + } \ +} + + +/** + * Same as ASSERT_TRUE, but without an explicit message. + */ +#define ASSERT_TRUE(condition) \ + ASSERT_TRUE_M(condition, wxString(wxT("Not true: ")) + wxT(#condition)); + + +/** + * Same as ASSERT_TRUE, but without an explicit message and condition must be false. + */ +#define ASSERT_FALSE(condition) \ + ASSERT_TRUE_M(!(condition), wxString(wxT("Not false: ")) + wxT(#condition)); + + +/** + * Asserts that the two parameters are equals. Operator == must be defined. + * If the two parameters are not equals, a failure is generated. + * @param expected Expected value + * @param actual Actual value to be compared + * @param message Message that will be displayed if this assertion fails + */ +#define ASSERT_EQUALS_M(expected,actual,message)\ +{ \ + if (!(expected == actual)) { \ + THROW_TEST_FAILURE(message); \ + } \ +} + + +/** + * Same as ASSERT_EQUALS_M, but without an explicit message. + */ +#define ASSERT_EQUALS(expected, actual) \ + Test::DoAssertEquals(wxT(__FILE__), __LINE__, expected, actual) + + +/** + * Make a test fails with the given message. + * @param text Failure message + */ +#define FAIL_M(text) \ + THROW_TEST_FAILURE(text) + +/** + * Same as FAIL_M, but without an explicit message. + */ +#define FAIL() FAIL_M(wxT("Test failed.")) + + +/** + * Requires that an assertion of a certain type is raised. + */ +#define ASSERT_RAISES_M(type, call, message) \ + try { \ + { call; }\ + THROW_TEST_FAILURE(message); \ + } catch (const type&) { \ + } catch (const std::exception& e) { \ + THROW_TEST_FAILURE(wxString::FromAscii(e.what())); \ + } + + + +/** + * Same as ASSERT_RAISES, but without an explicit message. + */ +#define ASSERT_RAISES(type, call) \ + ASSERT_RAISES_M(type, (call), wxT("Exception of type ") wxT(#type) wxT(" not raised.")) + + + +/** + * Define a test in a TestCase using test fixtures. + * User should put his test code between brackets after using this macro. + * + * This macro should only be used if test fixtures were declared earlier in + * this order: DECLARE, SETUP, TEARDOWN. + * @param testCaseName TestCase name where the test belongs to. Should be + * the same name of DECLARE, SETUP and TEARDOWN. + * @param testName Unique test name. + */ +#define TEST(testCaseName, testName) \ + class testCaseName##testName##Test : public testCaseName##Declare##Test \ + { \ + public: \ + testCaseName##testName##Test() \ + : testCaseName##Declare##Test(wxT(#testCaseName), wxT(#testName)) \ + { \ + } \ + \ + void run(); \ + } testCaseName##testName##Instance; \ + \ + void testCaseName##testName##Test::run() + +/** + * Location to declare variables and objets. + * This is where user should declare members accessible by TESTF, + * SETUP and TEARDOWN. + * + * User should not use brackets after using this macro. User should + * not initialize any members here. + * + * @param testCaseName TestCase name of the fixtures + * @see END_DECLARE for more information. + */ +#define DECLARE(testCaseName)\ + class testCaseName##Declare##Test : public Test \ + { \ + public: \ + testCaseName##Declare##Test(const wxString& testCaseName, const wxString& testName) \ + : Test (testCaseName, testName) {} \ + virtual void run() = 0; \ + +/** + * Ending macro used after DECLARE. + * + * User should use this macro after declaring members with + * DECLARE macro. + */ +#define END_DECLARE }; + + +/** + * Macro for creating a fixture with no setup/teardown or member variables. + */ +#define DECLARE_SIMPLE(testCaseName) \ + DECLARE(testCaseName) \ + END_DECLARE; + +} // MuleUnit ns +#endif // TEST_H + diff --git a/unittests/muleunit/testcase.cpp b/unittests/muleunit/testcase.cpp new file mode 100644 index 00000000..554fae6e --- /dev/null +++ b/unittests/muleunit/testcase.cpp @@ -0,0 +1,107 @@ +// +// MuleUnit: A minimalistic C++ Unit testing framework based on EasyUnit. +// +// Copyright (c) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (C) 2004 Barthelemy Dagenais (barthelemy@prologique.com) +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "testcase.h" +#include "test.h" + +#include + +using namespace muleunit; + +TestCase::TestCase(const wxString& name) + : m_name(name) +{} + +TestCase::~TestCase() +{ +} + +void TestCase::addTest(Test *test) +{ + m_tests.push_back(test); +} + +const TestList& TestCase::getTests() const +{ + return m_tests; +} + +int TestCase::getTestsCount() const +{ + return m_tests.size(); +} + + +const wxString& TestCase::getName() const +{ + return m_name; +} + + + +bool TestCase::run() +{ + Printf(wxT("\nRunning test-collection \"%s\" with %u test-cases:"), + m_name.c_str(), m_tests.size()); + + bool failures = false; + + TestList::iterator it = m_tests.begin(); + for (; it != m_tests.end(); ++it) { + Test* test = *it; + + Printf(wxT("\tTest \"%s\" "), test->getTestName().c_str()); + + bool wasSetup = false; + try { + test->setUp(); + wasSetup = true; + } catch (const CTestFailureException& e) { + failures = true; + Printf(wxT("\t\tFailure in setUp:\n")); + e.PrintBT(); + } + + // Only run the test if it was actually setup. Otherwise we + // are sure to get spurious failures. + if (wasSetup) { + try { + test->run(); + } catch (const CTestFailureException& e) { + failures = true; + Printf(wxT("\t\tFailure running:")); + e.PrintBT(); + } + } + + try { + test->tearDown(); + } catch (const CTestFailureException& e) { + failures = true; + Printf(wxT("\t\tFailure in tearDown:")); + e.PrintBT(); + } + } + + return !failures; +} + diff --git a/unittests/muleunit/testcase.h b/unittests/muleunit/testcase.h new file mode 100644 index 00000000..d85fe92b --- /dev/null +++ b/unittests/muleunit/testcase.h @@ -0,0 +1,119 @@ +// +// MuleUnit: A minimalistic C++ Unit testing framework based on EasyUnit. +// +// Copyright (c) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (C) 2004 Barthelemy Dagenais (barthelemy@prologique.com) +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#ifndef TESTCASE_H +#define TESTCASE_H + + +#include +#include + + +namespace muleunit +{ + +class Test; + +typedef std::list TestList; + + +/** + * A TestCase is a collection of unit tests (instance of Test) and is + * always specified by the first parameter of a Test declaration. + */ +class TestCase +{ +public: + + /** + * Main TestCase constructor. + * + * @param name TestCase name + */ + TestCase(const wxString& name); + + virtual ~TestCase(); + + /** + * Add a Test to the Test list. This method is used by TestRegistry. + * + * @param test Test instance to add to the Test list. + */ + void addTest(Test *test); + + /** + * Get the Test list. + * + * @return Test list + */ + const TestList& getTests() const; + + /** + * Execute all Tests in the Test list of this TestCase, returning false if there were failures. + */ + bool run(); + + /** + * Get the Test list size (number of Tests in this TestCase). + * + * @return The Test list size + */ + int getTestsCount() const; + + /** + * Get the total number of failures reported by all Tests. + * + * @return The total number of failures reported by all Tests. 0 + * if no test were run or if no failures were reported. + */ + int getFailuresCount() const; + + /** + * Get the total number of successes reported by all Tests. + * + * @return The total number of successes reported by all Tests. 0 + * if no test were run or if no successes were reported. + */ + int getSuccessesCount() const; + + /** + * Get the TestCase name. This name is specified by the first parameter + * of the Test declaration. For example, if a test was declared as + * TEST(TESTCASE1, TEST1), the TestCase name would be "TESTCASE1". + * + * @return The name of the TestCase + */ + const wxString& getName() const; + +protected: + int m_failuresCount; + int m_successesCount; + TestList m_tests; + wxString m_name; + +private: + void runTests(Test *test); +}; + +} // MuleUnit ns +#endif // TESTCASE_H + diff --git a/unittests/muleunit/testregistry.cpp b/unittests/muleunit/testregistry.cpp new file mode 100644 index 00000000..bf9ced0a --- /dev/null +++ b/unittests/muleunit/testregistry.cpp @@ -0,0 +1,88 @@ +// +// MuleUnit: A minimalistic C++ Unit testing framework based on EasyUnit. +// +// Copyright (c) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (C) 2004 Barthelemy Dagenais (barthelemy@prologique.com) +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#include "testregistry.h" +#include "testcase.h" +#include "test.h" + +using namespace muleunit; + + +TestRegistry::TestRegistry() +{ +} + + +TestRegistry::~TestRegistry() +{ + TestCaseList::iterator it = m_testCases.begin(); + for (; it != m_testCases.end(); ++it) { + delete *it; + } +} + + +void TestRegistry::addTest(Test *test) +{ + instance().add(test); +} + + +bool TestRegistry::runAndPrint() +{ + return instance().runTests(); +} + + +TestRegistry& TestRegistry::instance() +{ + static TestRegistry registry; + return registry; +} + + +void TestRegistry::add(Test *test) +{ + const wxString tcName = test->getTestCaseName(); + const wxString tName = test->getTestName(); + + + if (m_testCases.empty() || m_testCases.back()->getName() != tcName) { + m_testCases.push_back(new TestCase(tcName)); + } + + m_testCases.back()->addTest(test); +} + + +bool TestRegistry::runTests() +{ + bool success = true; + + TestCaseList::iterator it = m_testCases.begin(); + for (; it != m_testCases.end(); ++it) { + success &= (*it)->run(); + } + + return success; +} + diff --git a/unittests/muleunit/testregistry.h b/unittests/muleunit/testregistry.h new file mode 100644 index 00000000..6ae6e2af --- /dev/null +++ b/unittests/muleunit/testregistry.h @@ -0,0 +1,74 @@ +// +// MuleUnit: A minimalistic C++ Unit testing framework based on EasyUnit. +// +// Copyright (c) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org ) +// Copyright (C) 2004 Barthelemy Dagenais (barthelemy@prologique.com) +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +// + + +#ifndef TESTREGISTRY_H +#define TESTREGISTRY_H + +#include + +namespace muleunit +{ + class Test; + class TestCase; + + +typedef std::list TestCaseList; + + +/** + * The TestRegistry is the main class used to register all tests, + * and create appropriate TestCase. It can then be used to run + * tests and print results. All methods that should be used by + * the user are static. + */ +class TestRegistry +{ +public: + TestRegistry(); + ~TestRegistry(); + + /** + * Add a test in the registry. If the previous TestCase was not the same + * as the one of the current test, a new TestCase is created. + * + * @param test Test to be added + */ + static void addTest(Test *test); + + /** + * Runs all added tests and prints the results. + * + * @return False if there were failures. + */ + static bool runAndPrint(); + +private: + static TestRegistry& instance(); + void add(Test *test); + + bool runTests(); + TestCaseList m_testCases; +}; + +} // MuleUnit ns +#endif // TESTREGISTRY_H + diff --git a/unittests/tests/FileDataIOTest.cpp b/unittests/tests/FileDataIOTest.cpp new file mode 100644 index 00000000..1fb495ea --- /dev/null +++ b/unittests/tests/FileDataIOTest.cpp @@ -0,0 +1,952 @@ +#include +#include +#include +#include +#include +#include + +using Kademlia::CUInt128; +using namespace muleunit; + +namespace muleunit +{ + template <> + wxString StringFrom(const CPath& path) + { + return path.GetPrintable(); + } +} + + +//! The max file-size of auto-generated files to test. +const size_t TEST_LENGTH = 512; + +namespace muleunit { + //! Needed for ASSERT_EQUALS with CMD4Hash values + template <> + wxString StringFrom(const CMD4Hash& hash) { + return hash.Encode(); + } + + //! Needed for ASSERT_EQUALS with CUInt128 values + template <> + wxString StringFrom(const CUInt128& value) { + return value.ToHexString(); + } +} + + +void writePredefData(CFileDataIO* file) +{ + char data[TEST_LENGTH]; + + for (size_t j = 0; j < TEST_LENGTH; ++j) { + data[j] = j & 0xff; + } + + file->Write(data, TEST_LENGTH); + file->Seek(0, wxFromStart); +} + + + +///////////////////////////////////////////////////////////////////// +// Specialize this template for each implemention +// of the CFileDataIO interface you wish to test. +// +// This struct must be a subclass of Test. +// +// Two pointers are to be defined: +// m_emptyFile, which must be an empty, zero-length file +// m_predefFile, which must be TEST_LENGTH in size and +// and contain the sequence 0..255 repeated +// as needed. +// +// The following functions should be overridden: +// - setUp() +// - tearDown() +// +template +struct FileDataIOFixture; + + +template <> +class FileDataIOFixture : public Test +{ +public: + FileDataIOFixture(const wxString& testName) + : Test(wxT("FileDataIO"), wxT("CFile - ") + testName) {} + + + CFile* m_emptyFile; + CFile* m_predefFile; + + void setUp() { + m_emptyFile = m_predefFile = NULL; + const CPath emptyPath = CPath(wxT("FileDataIOTest.empty")); + const CPath datPath = CPath(wxT("FileDataIOTest.dat")); + + m_emptyFile = new CFile(); + m_emptyFile->Create(emptyPath, true); + ASSERT_TRUE(m_emptyFile->IsOpened()); + m_emptyFile->Close(); + m_emptyFile->Open(emptyPath, CFile::read_write); + ASSERT_TRUE(m_emptyFile->IsOpened()); + + m_predefFile = new CFile(); + m_predefFile->Create(datPath, true); + ASSERT_TRUE(m_predefFile->IsOpened()); + m_predefFile->Close(); + m_predefFile->Open(datPath, CFile::read_write); + ASSERT_TRUE(m_predefFile->IsOpened()); + + writePredefData(m_predefFile); + ASSERT_EQUALS(0u, m_predefFile->GetPosition()); + ASSERT_EQUALS(TEST_LENGTH, m_predefFile->GetLength()); + } + + void tearDown() { + delete m_emptyFile; + delete m_predefFile; + + wxRemoveFile(wxT("FileDataIOTest.dat")); + wxRemoveFile(wxT("FileDataIOTest.empty")); + } +}; + + +template <> +class FileDataIOFixture : public Test +{ +public: + FileDataIOFixture(const wxString& testName) + : Test(wxT("FileDataIO"), wxT("CMemFile - ") + testName) {} + + + CMemFile* m_emptyFile; + CMemFile* m_predefFile; + + void setUp() { + m_emptyFile = m_predefFile = NULL; + + m_emptyFile = new CMemFile(); + m_predefFile = new CMemFile(); + + writePredefData(m_predefFile); + ASSERT_EQUALS(0u, m_predefFile->GetPosition()); + ASSERT_EQUALS(TEST_LENGTH, m_predefFile->GetLength()); + } + + void tearDown() { + delete m_emptyFile; + delete m_predefFile; + } +}; + + +///////////////////////////////////////////////////////////////////// +// A writeWrite interface should be implemented for each set of +// read/write functions that is to be tested. The following 3 +// static functions must be implemented in each specialization of the +// template: +// +// - TYPE genValue(size_t j), which returns the expected value at +// position j in the files with predefined data. +// - TYPE readValue(CFileDataIO*), which returns and returns the +// value at the current position in the file. +// - void writeValue(CFileDataIO*, TYPE), which writes the given +// value at the current position in the file. +// - wxString name(), which returns the human-readble name of the type +// +template +struct RWInterface; + +template <> +struct RWInterface +{ + static uint8 genValue(size_t j) { + return j & 0xff; + } + + static uint8 readValue(CFileDataIO* file) { + return file->ReadUInt8(); + } + + static void writeValue(CFileDataIO* file, uint8 value) { + file->WriteUInt8(value); + } + + static wxString name() { return wxT("UInt8"); } +}; + + +template <> +struct RWInterface +{ + static uint16 genValue(size_t j) { + return (((j + 1) & 0xff) << 8) | (j & 0xff); + } + + static uint16 readValue(CFileDataIO* file) { + return file->ReadUInt16(); + } + + static void writeValue(CFileDataIO* file, uint16 value) { + file->WriteUInt16(value); + } + + static wxString name() { return wxT("UInt16"); } +}; + + +template <> +struct RWInterface +{ + static uint32 genValue(size_t j) { + return (((j + 3) & 0xff) << 24) | (((j + 2) & 0xff) << 16) | (((j + 1) & 0xff) << 8) | (j & 0xff); + } + + static uint32 readValue(CFileDataIO* file) { + return file->ReadUInt32(); + } + + static void writeValue(CFileDataIO* file, uint32 value) { + file->WriteUInt32(value); + } + + static wxString name() { return wxT("UInt32"); } +}; + + +template <> +struct RWInterface +{ + static CMD4Hash genValue(size_t j) { + CMD4Hash value; + for (size_t y = j; y < j + 16; y++) { + value[y - j] = y & 0xff; + } + + return value; + } + + static CMD4Hash readValue(CFileDataIO* file) { + return file->ReadHash(); + } + + static void writeValue(CFileDataIO* file, CMD4Hash value) { + file->WriteHash(value); + } + + static wxString name() { return wxT("CMD4Hash"); } +}; + + +template <> +struct RWInterface +{ + static CUInt128 genValue(size_t j) { + CUInt128 value; + uint32* data = (uint32*)value.GetDataPtr(); + for (size_t y = 0; y < 4; y++) { + data[y] = (j + 3 + y * 4) & 0xff; + data[y] = (data[y] << 8) | (j + 2 + y * 4) & 0xff; + data[y] = (data[y] << 8) | (j + 1 + y * 4) & 0xff; + data[y] = (data[y] << 8) | (j + 0 + y * 4) & 0xff; + } + + return value; + } + + static CUInt128 readValue(CFileDataIO* file) { + return file->ReadUInt128(); + } + + static void writeValue(CFileDataIO* file, CUInt128 value) { + file->WriteUInt128(value); + } + + static wxString name() { return wxT("CUInt128"); } +}; + + +///////////////////////////////////////////////////////////////////// +// The following tests ensure that the given implementations +// of the CFileDataIO interface properly does so. + +template +class ReadTest : public FileDataIOFixture +{ + typedef RWInterface RW; + +public: + ReadTest() + : FileDataIOFixture(wxT("Read ") + RW::name()) {} + + void run() { + CFileDataIO* file = this->m_predefFile; + + for (size_t j = 0; j < TEST_LENGTH + 1 - SIZE; ++j) { + ASSERT_EQUALS(j, file->Seek(j, wxFromStart)); + ASSERT_EQUALS(j, file->GetPosition()); + ASSERT_EQUALS(RW::genValue(j), RW::readValue(file)); + ASSERT_EQUALS(j + SIZE, file->GetPosition()); + } + + ASSERT_EQUALS(TEST_LENGTH, file->GetLength()); + + // Check reads past EOF + for (size_t i = 0; i < SIZE; ++i) { + ASSERT_EQUALS(TEST_LENGTH - i, file->Seek(-(signed)i, wxFromEnd)); + ASSERT_RAISES(CEOFException, RW::readValue(file)); + } + + // Check that only the given length is written to the target buffer + char testBuffer[32]; + memset(testBuffer, 127, 32); + char* buf = testBuffer + 8; + + for (int i = 0; i < 16; ++i) { + ASSERT_EQUALS(0u, file->Seek(0, wxFromStart)); + ASSERT_EQUALS(0u, file->GetPosition()); + + file->Read(buf, i + 1); + + for (int j = 0; j < 32; ++j) { + if (j < 8 || j > i + 8) { + ASSERT_EQUALS(127, (int)testBuffer[j]); + } else { + ASSERT_EQUALS(j - 8, (int)testBuffer[j]); + } + } + } + } +}; + + +template +class WriteTest : public FileDataIOFixture +{ + typedef RWInterface RW; + +public: + WriteTest() + : FileDataIOFixture(wxT("Write ") + RW::name()) {} + + void run() { + const unsigned char CanaryData = 170; + const char canaryBlock[] = { CanaryData }; + + CFileDataIO* file = this->m_predefFile; + + for (size_t j = 0; j < TEST_LENGTH + 1 - SIZE; ++j) { + // Clear before, after and at the target byte(s) + for (int t = -SIZE; t < (int)(2*SIZE); ++t) { + if ((j + t) < TEST_LENGTH && ((int)j + t) >= 0) { + file->Seek(j + t, wxFromStart); + ASSERT_EQUALS(j + t, file->GetPosition()); + file->Write(canaryBlock, 1); + ASSERT_EQUALS(j + t + 1, file->GetPosition()); + + // Check that canary was written + file->Seek(j + t, wxFromStart); + ASSERT_EQUALS(CanaryData, file->ReadUInt8()); + ASSERT_EQUALS(j + t + 1, file->GetPosition()); + } + } + + file->Seek(j, wxFromStart); + + ASSERT_EQUALS(j, file->GetPosition()); + RW::writeValue(file, RW::genValue(j)); + ASSERT_EQUALS(j + SIZE, file->GetPosition()); + + // Check before, after and at the target byte + for (int t = -SIZE; t < (int)(2*SIZE); ++t) { + if ((j + t) < TEST_LENGTH && ((int)j + t) >= 0) { + if (t) { + if (t < 0 || t >= (int)SIZE) { + file->Seek(j + t, wxFromStart); + ASSERT_EQUALS(CanaryData, file->ReadUInt8()); + ASSERT_EQUALS(j + t + 1, file->GetPosition()); + } + } else { + file->Seek(j + t, wxFromStart); + ASSERT_EQUALS(RW::genValue(j), RW::readValue(file)); + ASSERT_EQUALS(j + t + SIZE, file->GetPosition()); + } + } + } + } + + ASSERT_EQUALS(TEST_LENGTH, file->GetLength()); + } +}; + + +template +class SeekTest : public FileDataIOFixture +{ +public: + SeekTest() + : FileDataIOFixture(wxT("Seek")) {} + + void run() { + CFileDataIO* file = this->m_predefFile; + + ASSERT_EQUALS(0u, file->GetPosition()); + for (size_t pos = 0; pos < TEST_LENGTH * 2; pos += pos + 1) { + ASSERT_EQUALS(pos, file->Seek(pos, wxFromStart)); + ASSERT_EQUALS(pos, file->GetPosition()); + } + + ASSERT_EQUALS(0u, file->Seek(0, wxFromStart)); + ASSERT_EQUALS(0u, file->GetPosition()); + + for (size_t pos = 0, cur = 0; pos < TEST_LENGTH * 2; pos += ++cur) { + ASSERT_EQUALS(pos, file->Seek(cur, wxFromCurrent)); + ASSERT_EQUALS(pos, file->GetPosition()); + } + + ASSERT_EQUALS(0u, file->Seek(0, wxFromStart)); + ASSERT_EQUALS(0u, file->GetPosition()); + + for (size_t pos = 0; pos < TEST_LENGTH; pos += pos + 1) { + ASSERT_EQUALS(TEST_LENGTH - pos, file->Seek(-(signed)pos, wxFromEnd)); + ASSERT_EQUALS(TEST_LENGTH - pos, file->GetPosition()); + } + + ASSERT_EQUALS(0u, file->Seek(0, wxFromStart)); + ASSERT_EQUALS(0u, file->GetPosition()); + + // Seek to negative is invalid + for (off_t pos = 1; pos < 10; ++pos) { + ASSERT_RAISES(CInvalidParamsEx, file->Seek(-1 * pos)); + ASSERT_EQUALS(0u, file->GetPosition()); + } + + // Corner-case + ASSERT_RAISES(CInvalidParamsEx, file->Seek(std::numeric_limits::min())); + ASSERT_EQUALS(0u, file->GetPosition()); + } +}; + + +template +class WritePastEndTest : public FileDataIOFixture +{ +public: + WritePastEndTest() + : FileDataIOFixture(wxT("Write Past End")) {} + + void run() { + CFileDataIO* file = this->m_emptyFile; + + ASSERT_EQUALS(0u, file->GetLength()); + ASSERT_EQUALS(0u, file->GetPosition()); + + file->WriteUInt8(0); + + ASSERT_EQUALS(1u, file->GetLength()); + ASSERT_EQUALS(1u, file->GetPosition()); + + file->WriteUInt16(0); + + ASSERT_EQUALS(3u, file->GetLength()); + ASSERT_EQUALS(3u, file->GetPosition()); + + file->WriteUInt32(0); + + ASSERT_EQUALS(7u, file->GetLength()); + ASSERT_EQUALS(7u, file->GetPosition()); + + file->WriteHash(CMD4Hash()); + + ASSERT_EQUALS(23u, file->GetLength()); + ASSERT_EQUALS(23u, file->GetPosition()); + + // TODO: ReadUInt128 + + + char tmp[42]; + memset(tmp, 0, 42); + file->Write(tmp, 42); + + ASSERT_EQUALS(65u, file->GetLength()); + ASSERT_EQUALS(65u, file->GetPosition()); + + // Check that the length is always increased, regardless of starting pos + size_t length = file->GetLength(); + for (size_t j = 0; j < 16; ++j) { + ASSERT_EQUALS(length + j - 15u, file->Seek(-15, wxFromEnd)); + ASSERT_EQUALS(length + j - 15u, file->GetPosition()); + file->WriteHash(CMD4Hash()); + ASSERT_EQUALS(length + j + 1u, file->GetLength()); + ASSERT_EQUALS(length + j + 1u, file->GetPosition()); + } + } +}; + + +template +class StringTest : public FileDataIOFixture +{ +public: + StringTest() + : FileDataIOFixture(wxT("String")) {} + + struct Encoding + { + const EUtf8Str id; + const char* header; + const size_t headLen; + }; + + struct TestString + { + const wxChar* str; + // Raw and UTF8 expected lengths ... + const size_t lengths[2]; + }; + + void run() { + CFileDataIO* file = this->m_emptyFile; + + // TODO: Need to test non-ascii values when using unicode/etc, zero-length lengthfields + Encoding encodings[] = + { + {utf8strNone, NULL, 0}, + {utf8strOptBOM, "\xEF\xBB\xBF", 3}, + {utf8strRaw, NULL, 0} + }; + + TestString testData[] = + { + { wxT("0123456789abcdef"), { 16, 16 } }, + { wxT(""), { 0, 0 } }, + { wxT("abc ø def æ ghi å"), { 17, 20 } }, + { wxT("aáeéuúó"), { 7, 11 } }, + { wxT("uüoöÿeëaäyÿ"), { 11, 17 } }, + }; + + + for (size_t str = 0; str < ArraySize(testData); ++str) { + CONTEXT(wxString(wxT("Testing string: '")) << testData[str].str << wxT("'")); + + for (size_t enc = 0; enc < ArraySize(encodings); ++enc) { + CONTEXT(wxString::Format(wxT("Testing encoding: %i"), encodings[enc])); + + const wxChar* curStr = testData[str].str; + size_t strLen = testData[str].lengths[(encodings[enc].id == utf8strNone) ? 0 : 1]; + size_t headLen = encodings[enc].headLen; + + file->WriteString(curStr, encodings[enc].id, 2); + ASSERT_EQUALS(strLen + 2 + headLen, file->GetPosition()); + ASSERT_EQUALS(0u, file->Seek(0, wxFromStart)); + ASSERT_EQUALS(strLen + headLen, file->ReadUInt16()); + + // Check header (if any) + if (encodings[enc].header) { + wxCharBuffer head(headLen); + file->Read(head.data(), headLen); + ASSERT_EQUALS(0, memcmp(head, encodings[enc].header, headLen)); + } + + ASSERT_EQUALS(0u, file->Seek(0, wxFromStart)); + ASSERT_EQUALS(curStr, file->ReadString(encodings[enc].id, 2)); + ASSERT_EQUALS(0u, file->Seek(0, wxFromStart)); + + + file->WriteString(curStr, encodings[enc].id, 4); + ASSERT_EQUALS(strLen + 4 + headLen, file->GetPosition()); + ASSERT_EQUALS(0u, file->Seek(0, wxFromStart)); + ASSERT_EQUALS(strLen + headLen, file->ReadUInt32()); + + // Check header (if any) + if (encodings[enc].header) { + wxCharBuffer head(headLen); + file->Read(head.data(), headLen); + ASSERT_EQUALS(0, memcmp(head, encodings[enc].header, headLen)); + } + + ASSERT_EQUALS(0u, file->Seek(0, wxFromStart)); + ASSERT_EQUALS(curStr, file->ReadString(encodings[enc].id, 4)); + ASSERT_EQUALS(0u, file->Seek(0, wxFromStart)); + } + } + + CAssertOff silence; + for (size_t enc = 0; enc < ArraySize(encodings); ++enc) { + CONTEXT(wxString::Format(wxT("Testing encoding against poisoning: %i"), encodings[enc])); + + ////////////////////////////////////////////// + // Check if we guard against "poisoning". + ASSERT_EQUALS(0u, file->Seek(0, wxFromStart)); + + const size_t rawLen = (((uint16)-1) * 3) / 4; + wxString badStr(wxT('\xfe'), rawLen); + + // This will cause the string to be UTF-8 encoded, + // thereby exceeding the max length-field size (16b). + file->WriteString(badStr, encodings[enc].id, 2); + file->WriteUInt16(0x7913); + + ASSERT_EQUALS(0u, file->Seek(0, wxFromStart)); + file->ReadString(true, 2); + ASSERT_EQUALS(0x7913, file->ReadUInt16()); + } + } +}; + + +// Do not attempt to use this test with CMemFile. +template +class LargeFileTest : public FileDataIOFixture +{ +public: + LargeFileTest() + : FileDataIOFixture(wxT("LargeFile")) {} + + void run() { + CFile* file = dynamic_cast(this->m_emptyFile); + + ASSERT_TRUE(file != NULL); + ASSERT_EQUALS(2147483647UL, file->Seek(2147483647L, wxFromStart)); + ASSERT_EQUALS(2147483648UL, file->Seek(1, wxFromCurrent)); + ASSERT_EQUALS(2147483648UL, file->GetPosition()); + ASSERT_EQUALS(4294967296ULL, file->Seek(4294967296ULL, wxFromStart)); + ASSERT_EQUALS(4294967296ULL, file->GetPosition()); + } +}; + + + +///////////////////////////////////////////////////////////////////// +// Registration of all tests + +ReadTest CFileReadUInt8Test; +ReadTest CFileReadUInt16Test; +ReadTest CFileReadUInt32Test; +ReadTest CFileReadCMD4HashTest; +ReadTest CFileReadCUInt128Test; + +WriteTest CFileWriteUInt8Test; +WriteTest CFileWriteUInt16Test; +WriteTest CFileWriteUInt32Test; +WriteTest CFileWriteCMD4HashTest; +WriteTest CFileWriteCUInt128Test; + +SeekTest CFileSeekTest; +WritePastEndTest CFileWritePastEnd; +StringTest CFileStringTest; + +LargeFileTest CFileLargeFileTest; + + +ReadTest CMemFileReadUInt8Test; +ReadTest CMemFileReadUInt16Test; +ReadTest CMemFileReadUInt32Test; +ReadTest CMemFileReadCMD4HashTest; +ReadTest CMemFileReadCUInt128Test; + +WriteTest CMemFileWriteUInt8Test; +WriteTest CMemFileWriteUInt16Test; +WriteTest CMemFileWriteUInt32Test; +WriteTest CMemFileWriteCMD4HashTest; +WriteTest CMemFileWriteCUInt128Test; + +SeekTest CMemFileSeekTest; +WritePastEndTest CMemFileWritePastEnd; +StringTest CMemFileStringTest; + + +///////////////////////////////////////////////////////////////////// +// CMemFile specific tests + +DECLARE_SIMPLE(CMemFile); + +TEST(CMemFile, AttachedBuffer) +{ + const size_t BufferLength = 1024; + byte buffer[BufferLength]; + + for (size_t i = 0; i < BufferLength; ++i) { + buffer[i] = i & 0xFF; + } + + CMemFile file(buffer, BufferLength); + for (size_t i = 0; i < BufferLength; ++i) { + ASSERT_EQUALS(file.ReadUInt8(), i & 0xFF); + } + + // Resizing upwards should fail + ASSERT_RAISES(CRunTimeException, file.SetLength(BufferLength * 2)); + ASSERT_EQUALS(BufferLength, file.GetLength()); + + // Resizing downwards should be ok, as should resizes up (but within bufferlen) + file.SetLength(BufferLength / 2); + ASSERT_EQUALS(BufferLength / 2, file.GetLength()); + file.SetLength(BufferLength); + ASSERT_EQUALS(BufferLength, file.GetLength()); + + // Write past end should fail + ASSERT_EQUALS(BufferLength, file.Seek(0, wxFromEnd)); + ASSERT_RAISES(CRunTimeException, file.WriteUInt8(0)); + + // Init with invalid buffer should fail + ASSERT_RAISES(CRunTimeException, new CMemFile(static_cast(NULL), 1024)); + ASSERT_RAISES(CRunTimeException, new CMemFile(static_cast(NULL), 1024)); +} + + +TEST(CMemFile, ConstBuffer) +{ + byte arr[10]; + CMemFile file(const_cast(arr), sizeof(arr)); + + ASSERT_RAISES(CRunTimeException, file.WriteUInt8(0)); + ASSERT_RAISES(CRunTimeException, file.WriteUInt16(0)); + ASSERT_RAISES(CRunTimeException, file.WriteUInt32(0)); + ASSERT_RAISES(CRunTimeException, file.WriteUInt64(0)); + + char buffer[sizeof(arr)]; + ASSERT_RAISES(CRunTimeException, file.Write(buffer, sizeof(arr))); +} + + +TEST(CMemFile, SetLength) +{ + CMemFile file; + + ASSERT_EQUALS(0u, file.GetLength()); + file.SetLength(1024); + ASSERT_EQUALS(1024u, file.GetLength()); + ASSERT_EQUALS(1024u, file.Seek(0, wxFromEnd)); + file.SetLength(512u); + ASSERT_EQUALS(512u, file.GetLength()); + ASSERT_EQUALS(512u, file.Seek(0, wxFromEnd)); +} + + +///////////////////////////////////////////////////////////////////// +// CFile specific tests + +const CPath testFile = CPath(wxT("TestFile.dat")); +const unsigned testMode = 0600; + +DECLARE(CFile); + void setUp() { + // Ensure that the testfile doesn't exist + if (testFile.FileExists()) { + if (!CPath::RemoveFile(testFile)) { + MULE_VALIDATE_STATE(false, wxT("Failed to remove temporary file.")); + } + } + } + + void tearDown() { + if (testFile.FileExists()) { + CPath::RemoveFile(testFile); + } + } +END_DECLARE; + + +TEST(CFile, Constructor) +{ + // Test initial conditions + { + CFile file; + + ASSERT_TRUE(!file.IsOpened()); + ASSERT_TRUE(file.fd() == CFile::fd_invalid); + ASSERT_RAISES(CRunTimeException, file.WriteUInt8(0)); + ASSERT_RAISES(CRunTimeException, file.ReadUInt8()); + ASSERT_RAISES(CRunTimeException, file.Seek(0, wxFromStart)); + ASSERT_RAISES(CRunTimeException, file.GetLength()); + ASSERT_RAISES(CRunTimeException, file.GetPosition()); + ASSERT_RAISES(CRunTimeException, file.SetLength(13)); + ASSERT_RAISES(CRunTimeException, file.GetFilePath()); + ASSERT_RAISES(CRunTimeException, file.Flush()); + ASSERT_RAISES(CRunTimeException, file.Close()); + ASSERT_TRUE(!file.IsOpened()); + ASSERT_TRUE(file.fd() == CFile::fd_invalid); + } + + // Create test file + { + CFile file; + ASSERT_TRUE(file.Create(testFile, false, testMode)); + ASSERT_EQUALS(testFile, file.GetFilePath()); + file.WriteUInt32(1); + } + + { + CFile file(testFile, CFile::read); + + ASSERT_TRUE(file.IsOpened()); + ASSERT_TRUE(file.fd() != CFile::fd_invalid); + ASSERT_EQUALS(testFile, file.GetFilePath()); + ASSERT_EQUALS(4u, file.GetLength()); + ASSERT_EQUALS(1u, file.ReadUInt32()); + + ASSERT_RAISES(CIOFailureException, file.WriteUInt8(0)); + } + + { + CFile file(testFile, CFile::write); + + ASSERT_TRUE(file.IsOpened()); + ASSERT_TRUE(file.fd() != CFile::fd_invalid); + ASSERT_EQUALS(testFile, file.GetFilePath()); + ASSERT_EQUALS(0u, file.GetPosition()); + ASSERT_EQUALS(0u, file.GetLength()); + file.WriteUInt32(1); + ASSERT_EQUALS(0u, file.Seek(0, wxFromStart)); + + ASSERT_RAISES(CIOFailureException, file.ReadUInt8()); + } + + { + CFile file(testFile, CFile::read_write); + + ASSERT_TRUE(file.IsOpened()); + ASSERT_TRUE(file.fd() != CFile::fd_invalid); + ASSERT_EQUALS(testFile, file.GetFilePath()); + ASSERT_EQUALS(4u, file.GetLength()); + ASSERT_EQUALS(0u, file.GetPosition()); + ASSERT_EQUALS(1u, file.ReadUInt32()); + ASSERT_EQUALS(0u, file.Seek(0, wxFromStart)); + file.WriteUInt32(2); + ASSERT_EQUALS(0u, file.Seek(0, wxFromStart)); + ASSERT_EQUALS(2u, file.ReadUInt32()); + } + + { + CFile file(testFile, CFile::write_append); + + ASSERT_TRUE(file.IsOpened()); + ASSERT_TRUE(file.fd() != CFile::fd_invalid); + ASSERT_EQUALS(4u, file.GetLength()); + file.WriteUInt32(1); + ASSERT_EQUALS(0u, file.Seek(0, wxFromStart)); + + ASSERT_RAISES(CIOFailureException, file.ReadUInt8()); + + ASSERT_TRUE(file.Close()); + ASSERT_TRUE(file.Open(testFile, CFile::read)); + + ASSERT_EQUALS(2u, file.ReadUInt32()); + ASSERT_EQUALS(1u, file.ReadUInt32()); + } +} + + +TEST(CFile, Create) +{ + ASSERT_FALSE(testFile.FileExists()); + + // Check creation of new file, when none exists, with/without overwrite + for (size_t i = 0; i < 2; ++i) { + bool overwrite = (i == 1); + + CFile file; + ASSERT_TRUE(!file.IsOpened()); + ASSERT_TRUE(file.fd() == CFile::fd_invalid); + ASSERT_TRUE(file.Create(testFile, overwrite, testMode)); + ASSERT_TRUE(file.IsOpened()); + ASSERT_TRUE(file.fd() != CFile::fd_invalid); + ASSERT_EQUALS(testFile, file.GetFilePath()); + ASSERT_TRUE(file.Close()); + ASSERT_TRUE(file.fd() == CFile::fd_invalid); + ASSERT_TRUE(!file.IsOpened()); + + ASSERT_TRUE(wxFile::Access(testFile.GetRaw(), wxFile::read)); + ASSERT_TRUE(wxFile::Access(testFile.GetRaw(), wxFile::write)); + + ASSERT_TRUE(wxRemoveFile(testFile.GetRaw())); + } + + // Create testfile, with a bit of contents + { + CFile file; + ASSERT_TRUE(file.Create(testFile, false, testMode)); + ASSERT_EQUALS(testFile, file.GetFilePath()); + file.WriteUInt32(1); + } + + // Check that owerwrite = false works as expected + { + CFile file; + ASSERT_FALSE(file.Create(testFile, false, testMode)); + ASSERT_TRUE(file.fd() == CFile::fd_invalid); + ASSERT_TRUE(!file.IsOpened()); + + // Open and check contents + ASSERT_TRUE(file.Open(testFile, CFile::read)); + ASSERT_TRUE(file.IsOpened()); + ASSERT_TRUE(file.fd() != CFile::fd_invalid); + ASSERT_EQUALS(testFile, file.GetFilePath()); + ASSERT_EQUALS(4u, file.GetLength()); + ASSERT_EQUALS(1u, file.ReadUInt32()); + ASSERT_TRUE(file.Close()); + ASSERT_TRUE(file.fd() == CFile::fd_invalid); + ASSERT_TRUE(!file.IsOpened()); + } + + // Check that owerwrite = true works as expected + { + CFile file; + ASSERT_TRUE(file.Create(testFile, true, testMode)); + ASSERT_TRUE(file.IsOpened()); + ASSERT_TRUE(file.fd() != CFile::fd_invalid); + ASSERT_EQUALS(testFile, file.GetFilePath()); + ASSERT_EQUALS(0u, file.GetLength()); + ASSERT_TRUE(file.Close()); + ASSERT_TRUE(file.fd() == CFile::fd_invalid); + ASSERT_TRUE(!file.IsOpened()); + } + + ASSERT_TRUE(wxFile::Access(testFile.GetRaw(), wxFile::read)); + ASSERT_TRUE(wxFile::Access(testFile.GetRaw(), wxFile::write)); +} + + +TEST(CFile, SetLength) +{ + CFile file(testFile, CFile::write); + + ASSERT_EQUALS(0u, file.GetLength()); + file.SetLength(1024); + ASSERT_EQUALS(1024u, file.GetLength()); + ASSERT_EQUALS(1024u, file.Seek(0, wxFromEnd)); + file.SetLength(512u); + ASSERT_EQUALS(512u, file.GetLength()); + ASSERT_EQUALS(512u, file.Seek(0, wxFromEnd)); +} + + +TEST(CFile, GetAvailable) +{ + { + CFile file(testFile, CFile::write); + + writePredefData(&file); + } + + CFile file(testFile, CFile::read); + + const uint64 length = file.GetLength(); + while (!file.Eof()) { + ASSERT_EQUALS(length - file.GetPosition(), file.GetAvailable()); + file.ReadUInt32(); + ASSERT_EQUALS(length - file.GetPosition(), file.GetAvailable()); + } + + ASSERT_EQUALS(0u, file.GetAvailable()); + + file.Seek(1024, wxFromCurrent); + + ASSERT_EQUALS(0u, file.GetAvailable()); +} + diff --git a/unittests/tests/FormatTest.cpp b/unittests/tests/FormatTest.cpp new file mode 100644 index 00000000..d863e68d --- /dev/null +++ b/unittests/tests/FormatTest.cpp @@ -0,0 +1,484 @@ +#include +#include +#include + +#include + +using namespace muleunit; + +// Note: These tests have been written in accordance with the +// capabilities of printf found in printf(3). + +#define ELEMENTS(x) (sizeof(x)/sizeof(x[0])) +#define MIN(x) std::numeric_limits::min() +#define MAX(x) std::numeric_limits::max() + + +DECLARE(Format) + // Less is valid for the string type, so we need a cut + // down test for that. + void testFormat(const wxString& str, const wxChar* value) { + for (int p = -1; p < 5; ++p) { + wxString format; + + format += wxT("%"); + + if (p == -1) { + format += wxT("."); + } else { + format += wxString::Format(wxT(".%d"), p); + } + + format += str; + + wxString reference = wxString::Format(format, value); + wxString actual = CFormat(format) % value; + + ASSERT_EQUALS_M(reference, actual, format + wxT(": '") + reference + wxT("' != '") + actual + wxT("'")); + } + } +END_DECLARE; + + +TEST(Format, ConstructorAndGetString) +{ + { + // Null should be valid + CFormat fmt1(NULL); + ASSERT_TRUE(fmt1.IsReady()); + ASSERT_EQUALS(wxT(""), fmt1.GetString()); + } + + { + // Empty string should be valid + CFormat fmt2(wxT("")); + ASSERT_TRUE(fmt2.IsReady()); + ASSERT_EQUALS(wxT(""), fmt2.GetString()); + } + + { + // Simple string with no format fields + CFormat fmt3(wxT("a b c")); + ASSERT_TRUE(fmt3.IsReady()); + ASSERT_EQUALS(wxT("a b c"), fmt3.GetString()); + } + + { + // Simple string with one format field + CFormat fmt4(wxT("a %i c")); + ASSERT_FALSE(fmt4.IsReady()); + ASSERT_RAISES(CAssertFailureException, fmt4.GetString()); + + CAssertOff null; + ASSERT_EQUALS(wxT("a %i c"), fmt4.GetString()); + } +} + + +TEST(Format, SetStringAndGetString) +{ + CFormat format(NULL); + ASSERT_TRUE(format.IsReady()); + ASSERT_EQUALS(wxT(""), format.GetString()); + + // Empty string should be valid + format = CFormat(wxT("")); + ASSERT_TRUE(format.IsReady()); + ASSERT_EQUALS(wxT(""), format.GetString()); + + // Simple string with no format fields + format = CFormat(wxT("a b c")); + ASSERT_TRUE(format.IsReady()); + ASSERT_EQUALS(wxT("a b c"), format.GetString()); + + // Simple string with one format field + format = CFormat(wxT("a %i c")); + ASSERT_FALSE(format.IsReady()); + ASSERT_RAISES(CAssertFailureException, format.GetString()); + + CAssertOff null; + ASSERT_EQUALS(wxT("a %i c"), format.GetString()); +} + + + +//! Implementation for the Standard type test +#define STANDARD_TEST(cformat, wxformat, value) \ + { \ + wxString reference = wxString::Format(wxString(wxT("%")) + wxformat, value); \ + wxString actual = CFormat(wxString(wxT("%")) + cformat) % value; \ + ASSERT_EQUALS_M(reference, actual, wxString(wxT("%")) << wxformat \ + << wxT(" vs. %") << cformat << wxT(": '") + reference + wxT("' != '") + actual + wxT("'")); \ + } + + + +//! Test the two boundries and a middle value of the specificed format +#define STANDARD_TYPE_TESTS(cformat, wxformat, type) \ + STANDARD_TEST(cformat, wxformat, MIN(type)); \ + STANDARD_TEST(cformat, wxformat, (type)(MAX(type) / 2)); \ + STANDARD_TEST(cformat, wxformat, MAX(type)); \ + +TEST(Format, InjectwxChar) +{ + STANDARD_TYPE_TESTS(wxT("c"), wxT("c"), wxChar); +} + + +//! All length specifiers are supported and should yield the same result +const wxChar* int_lengths[] = +{ + wxT("h"), + wxT(""), + wxT("l"), + wxT("ll"), + NULL +}; + +//! All signed types are supported, and should yield the same result +const wxChar* sint_types[] = +{ + wxT("d"), + wxT("i"), + NULL +}; + + +//! All unsigned types are supported, and should yield the same result +const wxChar* uint_types[] = +{ + wxT("u"), + wxT("o"), + wxT("x"), + wxT("X"), + NULL +}; + + +TEST(Format, InjectInteger) +{ + const wxChar** sint_entry = sint_types; + + while (*sint_entry) { + const wxChar** len_entry = int_lengths; + + while (*len_entry) { + wxString entry = wxString() << *len_entry << *sint_entry; + + STANDARD_TYPE_TESTS(entry, wxString() << wxT("h") << *sint_entry, signed short); + STANDARD_TYPE_TESTS(entry, wxString() << wxT("") << *sint_entry, signed int); + STANDARD_TYPE_TESTS(entry, wxString() << wxT("l") << *sint_entry, signed long); + STANDARD_TYPE_TESTS(entry, wxString() << wxLongLongFmtSpec << *sint_entry, signed long long); + + ++len_entry; + } + + ++sint_entry; + } + + + const wxChar** uint_entry = uint_types; + while (*uint_entry) { + const wxChar** len_entry = int_lengths; + + while (*len_entry) { + wxString entry = wxString() << *len_entry << *uint_entry; + + STANDARD_TYPE_TESTS(entry, wxString() << wxT("h") << *uint_entry, unsigned short); + STANDARD_TYPE_TESTS(entry, wxString() << wxT("") << *uint_entry, unsigned int); + STANDARD_TYPE_TESTS(entry, wxString() << wxT("l") << *uint_entry, unsigned long); + STANDARD_TYPE_TESTS(entry, wxString() << wxLongLongFmtSpec << *uint_entry, unsigned long long); + + ++len_entry; + } + + ++uint_entry; + } +} + + +TEST(Format, InjectFloatAndDouble) +{ + STANDARD_TYPE_TESTS(wxT("e"), wxT("e"), float); + STANDARD_TYPE_TESTS(wxT("E"), wxT("E"), float); + STANDARD_TYPE_TESTS(wxT("f"), wxT("f"), float); + STANDARD_TYPE_TESTS(wxT("F"), wxT("F"), float); + STANDARD_TYPE_TESTS(wxT("g"), wxT("g"), float); + STANDARD_TYPE_TESTS(wxT("G"), wxT("G"), float); + + STANDARD_TYPE_TESTS(wxT("e"), wxT("e"), double); + STANDARD_TYPE_TESTS(wxT("E"), wxT("E"), double); + STANDARD_TYPE_TESTS(wxT("f"), wxT("f"), double); + STANDARD_TYPE_TESTS(wxT("F"), wxT("F"), double); + STANDARD_TYPE_TESTS(wxT("g"), wxT("g"), double); + STANDARD_TYPE_TESTS(wxT("G"), wxT("G"), double); +} + + +TEST(Format, InjectString) +{ + testFormat(wxT("s"), wxT("")); + testFormat(wxT("s"), wxT("abc")); +} + + +TEST(Format, InjectNULLString) +{ + for (int p = -1; p < 5; ++p) { + wxString format = wxT("%"); + + if (p == -1) { + format += wxT("."); + } else { + format += wxString::Format(wxT(".%d"), p); + } + + format += wxT("s"); + + wxString actual = CFormat(format) % (const wxChar*)NULL; + + ASSERT_TRUE_M(actual.IsEmpty(), wxT("Expected empty string, got '") + actual + wxT("'")); + } +} + + +TEST(Format, MultipleFields) +{ + { + CFormat fmt1(wxT("%d _ %u _ %i")); + fmt1 % -1 % 2u % -4; + ASSERT_TRUE(fmt1.IsReady()); + ASSERT_EQUALS(wxT("-1 _ 2 _ -4"), fmt1.GetString()); + } + + { + CFormat fmt2(wxT("%d _ %u _ %i")); + ASSERT_FALSE(fmt2.IsReady()); + fmt2 % -1; + ASSERT_FALSE(fmt2.IsReady()); + fmt2 % 2u; + ASSERT_FALSE(fmt2.IsReady()); + fmt2 % -4; + ASSERT_TRUE(fmt2.IsReady()); + ASSERT_EQUALS(wxT("-1 _ 2 _ -4"), fmt2.GetString()); + } + + { + // Test grouped fields + CFormat fmt3(wxT("%d%u%i")); + fmt3 % -1 % 2u % -4; + ASSERT_EQUALS(wxT("-12-4"), fmt3.GetString()); + } +} + + +TEST(Format, EscapedPercentageSign) +{ + { + CFormat fmt1(wxT("%%")); + ASSERT_EQUALS(wxT("%"), fmt1.GetString()); + } + + { + CFormat fmt2(wxT("-- %% --")); + ASSERT_EQUALS(wxT("-- % --"), fmt2.GetString()); + } + + { + CFormat fmt3(wxT("%d _ %% _ %i")); + fmt3 % 1 % 2; + ASSERT_TRUE(fmt3.IsReady()); + ASSERT_EQUALS(wxT("1 _ % _ 2"), fmt3.GetString()); + } + + { + CFormat fmt4(wxT("%% _ %% _ %%")); + ASSERT_EQUALS(wxT("% _ % _ %"), fmt4.GetString()); + } +} + + +/////////////////////////////////////////////////////////// +// The following checks for invalid operations + +TEST(Format, MalformedFields) +{ + { + // Incomplete format string + ASSERT_RAISES(CAssertFailureException, CFormat(wxT("%"))); + ASSERT_RAISES(CAssertFailureException, CFormat(wxT(" -- %"))); + + // Non-existing type + ASSERT_RAISES(CAssertFailureException, CFormat(wxT("%q")) % 1); + ASSERT_RAISES(CAssertFailureException, CFormat(wxT(" -- %q")) % 1.0f ); + ASSERT_RAISES(CAssertFailureException, CFormat(wxT(" -- %q -- ")) % wxT("1")); + + // Invalid string length + ASSERT_RAISES(CAssertFailureException, CFormat(wxT("%.qs")) % wxT("")); + ASSERT_RAISES(CAssertFailureException, CFormat(wxT("%.-10s")) % wxT("")); + } + + { + CAssertOff null; + + ASSERT_EQUALS(wxT("%"), CFormat(wxT("%"))); + ASSERT_EQUALS(wxT(" -- %"), CFormat(wxT(" -- %"))); + + // Non-existing type + ASSERT_EQUALS(wxT("%q"), CFormat(wxT("%q")) % 1); + ASSERT_EQUALS(wxT(" -- %q"), CFormat(wxT(" -- %q")) % 1.0f ); + ASSERT_EQUALS(wxT(" -- %q -- "), CFormat(wxT(" -- %q -- ")) % wxT("1")); + + // Invalid string length + ASSERT_EQUALS(wxT("%.qs"), CFormat(wxT("%.qs")) % wxT("")); + ASSERT_EQUALS(wxT("%.-10s"), CFormat(wxT("%.-10s")) % wxT("")); + + // Wrong and right arguments + ASSERT_EQUALS(wxT("%s -- 17"), CFormat(wxT("%s -- %i")) % 1 % 17); + } +} + + +TEST(Format, NotReady) +{ + CFormat fmt(wxT("-- %s - %d")); + ASSERT_FALSE(fmt.IsReady()); + ASSERT_RAISES(CAssertFailureException, fmt.GetString()); + + { + CAssertOff null; + ASSERT_EQUALS(wxT("-- %s - %d"), fmt); + } + + fmt % wxT("foo"); + + ASSERT_FALSE(fmt.IsReady()); + ASSERT_RAISES(CAssertFailureException, fmt.GetString()); + + { + CAssertOff null; + ASSERT_EQUALS(wxT("-- foo - %d"), fmt); + } + + fmt % 42; + + ASSERT_TRUE(fmt.IsReady()); + ASSERT_EQUALS(wxT("-- foo - 42"), fmt.GetString()); +} + + +TEST(Format, WrongTypes) +{ + { + // Entirely wrong types: + ASSERT_RAISES(CAssertFailureException, CFormat(wxT("%s")) % 1); + ASSERT_RAISES(CAssertFailureException, CFormat(wxT("%s")) % 1.0f); + ASSERT_RAISES(CAssertFailureException, CFormat(wxT("%s")) % wxT('1')); + + ASSERT_RAISES(CAssertFailureException, CFormat(wxT("%f")) % 1); + ASSERT_RAISES(CAssertFailureException, CFormat(wxT("%f")) % wxT('1')); + ASSERT_RAISES(CAssertFailureException, CFormat(wxT("%f")) % wxT("1")); + + ASSERT_RAISES(CAssertFailureException, CFormat(wxT("%d")) % 1.0f); + ASSERT_RAISES(CAssertFailureException, CFormat(wxT("%d")) % wxT("1")); + } + + { + CAssertOff null; + + ASSERT_EQUALS(wxT("-- %s -- 42 --"), CFormat(wxT("-- %s -- %u --")) % 1 % 42); + ASSERT_EQUALS(wxT("-- %f -- 42 --"), CFormat(wxT("-- %f -- %u --")) % 1 % 42); + ASSERT_EQUALS(wxT("-- %d -- 42 --"), CFormat(wxT("-- %d -- %u --")) % 1.0f % 42); + } +} + + +TEST(Format, NotSupported) +{ + { + ASSERT_RAISES(CAssertFailureException, CFormat(wxT("%*d")) % 1); + ASSERT_RAISES(CAssertFailureException, CFormat(wxT("%*s")) % wxT("")); + ASSERT_RAISES(CAssertFailureException, CFormat(wxT("%p")) % wxT("")); + ASSERT_RAISES(CAssertFailureException, CFormat(wxT("%n")) % wxT("")); + } + + { + CAssertOff null; + + ASSERT_EQUALS(wxT("%*d"), CFormat(wxT("%*d")) % 1); + ASSERT_EQUALS(wxT("%*s"), CFormat(wxT("%*s")) % wxT("")); + ASSERT_EQUALS(wxT("%p"), CFormat(wxT("%p")) % wxT("")); + ASSERT_EQUALS(wxT("%n"), CFormat(wxT("%n")) % wxT("")); + } +} + + +TEST(Format, Overfeeding) +{ + CFormat fmt(wxT("%d - %d")); + ASSERT_FALSE(fmt.IsReady()); + fmt % 1 % 2; + ASSERT_TRUE(fmt.IsReady()); + ASSERT_EQUALS(wxT("1 - 2"), fmt.GetString()); + + ASSERT_RAISES(CAssertFailureException, fmt % 1); + ASSERT_TRUE(fmt.IsReady()); + ASSERT_EQUALS(wxT("1 - 2"), fmt.GetString()); + + ASSERT_RAISES(CAssertFailureException, fmt % 1.0f); + ASSERT_TRUE(fmt.IsReady()); + ASSERT_EQUALS(wxT("1 - 2"), fmt.GetString()); + + ASSERT_RAISES(CAssertFailureException, fmt % wxT("1")); + ASSERT_TRUE(fmt.IsReady()); + ASSERT_EQUALS(wxT("1 - 2"), fmt.GetString()); +} + + +TEST(Format, 64bValues) +{ + { + CFormat fmt(wxT("%lli - %lli")); + fmt % MIN(sint64) % MAX(sint64); + ASSERT_EQUALS(wxT("-9223372036854775808 - 9223372036854775807"), fmt.GetString()); + } + + { + CFormat fmt(wxT("%llu - %llu")); + fmt % MIN(uint64) % MAX(uint64); + ASSERT_EQUALS(wxT("0 - 18446744073709551615"), fmt.GetString()); + } +} + + +class CTestPrintable : public CPrintable +{ +public: + CTestPrintable(int value) + : m_value(value) + { + } + + virtual wxString GetPrintableString() const + { + return wxString::Format(wxT("%i"), m_value); + } + +private: + int m_value; +}; + +TEST(Format, Printable) +{ + { + CFormat fmt(wxT("%s")); + fmt % CTestPrintable(10); + ASSERT_EQUALS(wxT("10"), fmt.GetString()); + } + + { + CFormat fmt(wxT("%s")); + fmt % CTestPrintable(-10); + ASSERT_EQUALS(wxT("-10"), fmt.GetString()); + } +} diff --git a/unittests/tests/Makefile.am b/unittests/tests/Makefile.am new file mode 100644 index 00000000..a70f2287 --- /dev/null +++ b/unittests/tests/Makefile.am @@ -0,0 +1,57 @@ +# If any tests uses more than a cpp/h fileset, then +# make a seperate subfolder for it to reduce clutter. +#SUBDIRS = +EXTRA_DIST = + +# Use this to be able to catch assertions as exceptions +MUCXXFLAGS = -DMULEUNIT -DSRCDIR="$(srcdir)" +AM_CXXFLAGS = -I$(srcdir) -I$(srcdir)/.. -I$(top_srcdir)/src -I$(top_srcdir)/src/libs -I$(top_srcdir)/src/include $(WXBASE_CXXFLAGS) $(MUCXXFLAGS) +LDADD = $(WXBASE_LIBS) ../muleunit/libmuleunit.a + +MAINTAINERCLEANFILES = Makefile.in +TESTS = RangeMapTest FormatTest StringFunctionsTest NetworkFunctionsTest FileDataIOTest PathTest TextFileTest +check_PROGRAMS = $(TESTS) + + +# Tests for the CRangeMap class +RangeMapTest_SOURCES = RangeMapTest.cpp +RangeMapTest_CXXFLAGS = $(AM_CXXFLAGS) +RangeMapTest_LDADD = $(LDADD) + + +# Tests for the CFormat class +FormatTest_SOURCES = FormatTest.cpp $(top_srcdir)/src/libs/common/Format.cpp +FormatTest_CXXFLAGS = $(AM_CXXFLAGS) +FormatTest_LDADD = $(LDADD) + + +# Tests for the various string functions. +StringFunctionsTest_SOURCES = StringFunctionsTest.cpp $(top_srcdir)/src/libs/common/StringFunctions.cpp $(top_srcdir)/src/libs/common/Path.cpp +StringFunctionsTest_CXXFLAGS = $(AM_CXXFLAGS) +StringFunctionsTest_LDADD = $(LDADD) + +# Tests for the various file functions. +#FileFunctionsTest_SOURCES = FileFunctionsTest.cpp $(top_srcdir)/src/FileFunctions.cpp $(top_srcdir)/src/SafeFile.cpp $(top_srcdir)/src/CFile.cpp $(top_srcdir)/src/kademlia/utils/UInt128.cpp $(top_srcdir)/src/CryptoPP.cpp +#FileFunctionsTest_CXXFLAGS = $(AM_CXXFLAGS) +#FileFunctionsTest_LDADD = $(LDADD) + +# Tests for the various network functions. +NetworkFunctionsTest_SOURCES = NetworkFunctionsTest.cpp $(top_srcdir)/src/NetworkFunctions.cpp +NetworkFunctionsTest_CXXFLAGS = $(AM_CXXFLAGS) -DEC_REMOTE # Needed to avoid compiling the http-thread +NetworkFunctionsTest_LDADD = $(LDADD) + +# Tests for the classes that implement the CFileDataIO interface +FileDataIOTest_SOURCES = FileDataIOTest.cpp $(top_srcdir)/src/SafeFile.cpp $(top_srcdir)/src/CFile.cpp $(top_srcdir)/src/MemFile.cpp $(top_srcdir)/src/kademlia/utils/UInt128.cpp $(top_srcdir)/src/libs/common/StringFunctions.cpp $(top_srcdir)/src/Tag.cpp $(top_srcdir)/src/libs/common/Path.cpp +FileDataIOTest_CXXFLAGS = $(AM_CXXFLAGS) +FileDataIOTest_LDADD = $(LDADD) $(CRYPTOLIBS) + +# Tests for the CPath class +PathTest_SOURCES = PathTest.cpp $(top_srcdir)/src/libs/common/Path.cpp $(top_srcdir)/src/libs/common/StringFunctions.cpp +PathTest_CXXFLAGS = $(AM_CXXFLAGS) +PathTest_LDADD = $(LDADD) $(CRYPTOLIBS) + +# Tests for the CPath class +TextFileTest_SOURCES = TextFileTest.cpp $(top_srcdir)/src/libs/common/Path.cpp $(top_srcdir)/src/libs/common/StringFunctions.cpp $(top_srcdir)/src/libs/common/TextFile.cpp +TextFileTest_CXXFLAGS = $(AM_CXXFLAGS) +TextFileTest_LDADD = $(LDADD) $(CRYPTOLIBS) +EXTRA_DIST += TextFileTest_dos.txt TextFileTest_unix.txt diff --git a/unittests/tests/Makefile.in b/unittests/tests/Makefile.in new file mode 100644 index 00000000..2f6daec1 --- /dev/null +++ b/unittests/tests/Makefile.in @@ -0,0 +1,1073 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +SOURCES = $(FileDataIOTest_SOURCES) $(FormatTest_SOURCES) $(NetworkFunctionsTest_SOURCES) $(PathTest_SOURCES) $(RangeMapTest_SOURCES) $(StringFunctionsTest_SOURCES) $(TextFileTest_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +check_PROGRAMS = $(am__EXEEXT_1) +subdir = unittests/tests +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__EXEEXT_1 = RangeMapTest$(EXEEXT) FormatTest$(EXEEXT) \ + StringFunctionsTest$(EXEEXT) NetworkFunctionsTest$(EXEEXT) \ + FileDataIOTest$(EXEEXT) PathTest$(EXEEXT) \ + TextFileTest$(EXEEXT) +am_FileDataIOTest_OBJECTS = FileDataIOTest-FileDataIOTest.$(OBJEXT) \ + FileDataIOTest-SafeFile.$(OBJEXT) \ + FileDataIOTest-CFile.$(OBJEXT) \ + FileDataIOTest-MemFile.$(OBJEXT) \ + FileDataIOTest-UInt128.$(OBJEXT) \ + FileDataIOTest-StringFunctions.$(OBJEXT) \ + FileDataIOTest-Tag.$(OBJEXT) FileDataIOTest-Path.$(OBJEXT) +FileDataIOTest_OBJECTS = $(am_FileDataIOTest_OBJECTS) +am__DEPENDENCIES_1 = +am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) ../muleunit/libmuleunit.a +FileDataIOTest_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) +am_FormatTest_OBJECTS = FormatTest-FormatTest.$(OBJEXT) \ + FormatTest-Format.$(OBJEXT) +FormatTest_OBJECTS = $(am_FormatTest_OBJECTS) +FormatTest_DEPENDENCIES = $(am__DEPENDENCIES_2) +am_NetworkFunctionsTest_OBJECTS = \ + NetworkFunctionsTest-NetworkFunctionsTest.$(OBJEXT) \ + NetworkFunctionsTest-NetworkFunctions.$(OBJEXT) +NetworkFunctionsTest_OBJECTS = $(am_NetworkFunctionsTest_OBJECTS) +NetworkFunctionsTest_DEPENDENCIES = $(am__DEPENDENCIES_2) +am_PathTest_OBJECTS = PathTest-PathTest.$(OBJEXT) \ + PathTest-Path.$(OBJEXT) PathTest-StringFunctions.$(OBJEXT) +PathTest_OBJECTS = $(am_PathTest_OBJECTS) +PathTest_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) +am_RangeMapTest_OBJECTS = RangeMapTest-RangeMapTest.$(OBJEXT) +RangeMapTest_OBJECTS = $(am_RangeMapTest_OBJECTS) +RangeMapTest_DEPENDENCIES = $(am__DEPENDENCIES_2) +am_StringFunctionsTest_OBJECTS = \ + StringFunctionsTest-StringFunctionsTest.$(OBJEXT) \ + StringFunctionsTest-StringFunctions.$(OBJEXT) \ + StringFunctionsTest-Path.$(OBJEXT) +StringFunctionsTest_OBJECTS = $(am_StringFunctionsTest_OBJECTS) +StringFunctionsTest_DEPENDENCIES = $(am__DEPENDENCIES_2) +am_TextFileTest_OBJECTS = TextFileTest-TextFileTest.$(OBJEXT) \ + TextFileTest-Path.$(OBJEXT) \ + TextFileTest-StringFunctions.$(OBJEXT) \ + TextFileTest-TextFile.$(OBJEXT) +TextFileTest_OBJECTS = $(am_TextFileTest_OBJECTS) +TextFileTest_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +SOURCES = $(FileDataIOTest_SOURCES) $(FormatTest_SOURCES) \ + $(NetworkFunctionsTest_SOURCES) $(PathTest_SOURCES) \ + $(RangeMapTest_SOURCES) $(StringFunctionsTest_SOURCES) \ + $(TextFileTest_SOURCES) +DIST_SOURCES = $(FileDataIOTest_SOURCES) $(FormatTest_SOURCES) \ + $(NetworkFunctionsTest_SOURCES) $(PathTest_SOURCES) \ + $(RangeMapTest_SOURCES) $(StringFunctionsTest_SOURCES) \ + $(TextFileTest_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ + +# If any tests uses more than a cpp/h fileset, then +# make a seperate subfolder for it to reduce clutter. +#SUBDIRS = +EXTRA_DIST = TextFileTest_dos.txt TextFileTest_unix.txt + +# Use this to be able to catch assertions as exceptions +MUCXXFLAGS = -DMULEUNIT -DSRCDIR="$(srcdir)" +AM_CXXFLAGS = -I$(srcdir) -I$(srcdir)/.. -I$(top_srcdir)/src -I$(top_srcdir)/src/libs -I$(top_srcdir)/src/include $(WXBASE_CXXFLAGS) $(MUCXXFLAGS) +LDADD = $(WXBASE_LIBS) ../muleunit/libmuleunit.a +MAINTAINERCLEANFILES = Makefile.in +TESTS = RangeMapTest FormatTest StringFunctionsTest NetworkFunctionsTest FileDataIOTest PathTest TextFileTest + +# Tests for the CRangeMap class +RangeMapTest_SOURCES = RangeMapTest.cpp +RangeMapTest_CXXFLAGS = $(AM_CXXFLAGS) +RangeMapTest_LDADD = $(LDADD) + +# Tests for the CFormat class +FormatTest_SOURCES = FormatTest.cpp $(top_srcdir)/src/libs/common/Format.cpp +FormatTest_CXXFLAGS = $(AM_CXXFLAGS) +FormatTest_LDADD = $(LDADD) + +# Tests for the various string functions. +StringFunctionsTest_SOURCES = StringFunctionsTest.cpp $(top_srcdir)/src/libs/common/StringFunctions.cpp $(top_srcdir)/src/libs/common/Path.cpp +StringFunctionsTest_CXXFLAGS = $(AM_CXXFLAGS) +StringFunctionsTest_LDADD = $(LDADD) + +# Tests for the various file functions. +#FileFunctionsTest_SOURCES = FileFunctionsTest.cpp $(top_srcdir)/src/FileFunctions.cpp $(top_srcdir)/src/SafeFile.cpp $(top_srcdir)/src/CFile.cpp $(top_srcdir)/src/kademlia/utils/UInt128.cpp $(top_srcdir)/src/CryptoPP.cpp +#FileFunctionsTest_CXXFLAGS = $(AM_CXXFLAGS) +#FileFunctionsTest_LDADD = $(LDADD) + +# Tests for the various network functions. +NetworkFunctionsTest_SOURCES = NetworkFunctionsTest.cpp $(top_srcdir)/src/NetworkFunctions.cpp +NetworkFunctionsTest_CXXFLAGS = $(AM_CXXFLAGS) -DEC_REMOTE # Needed to avoid compiling the http-thread +NetworkFunctionsTest_LDADD = $(LDADD) + +# Tests for the classes that implement the CFileDataIO interface +FileDataIOTest_SOURCES = FileDataIOTest.cpp $(top_srcdir)/src/SafeFile.cpp $(top_srcdir)/src/CFile.cpp $(top_srcdir)/src/MemFile.cpp $(top_srcdir)/src/kademlia/utils/UInt128.cpp $(top_srcdir)/src/libs/common/StringFunctions.cpp $(top_srcdir)/src/Tag.cpp $(top_srcdir)/src/libs/common/Path.cpp +FileDataIOTest_CXXFLAGS = $(AM_CXXFLAGS) +FileDataIOTest_LDADD = $(LDADD) $(CRYPTOLIBS) + +# Tests for the CPath class +PathTest_SOURCES = PathTest.cpp $(top_srcdir)/src/libs/common/Path.cpp $(top_srcdir)/src/libs/common/StringFunctions.cpp +PathTest_CXXFLAGS = $(AM_CXXFLAGS) +PathTest_LDADD = $(LDADD) $(CRYPTOLIBS) + +# Tests for the CPath class +TextFileTest_SOURCES = TextFileTest.cpp $(top_srcdir)/src/libs/common/Path.cpp $(top_srcdir)/src/libs/common/StringFunctions.cpp $(top_srcdir)/src/libs/common/TextFile.cpp +TextFileTest_CXXFLAGS = $(AM_CXXFLAGS) +TextFileTest_LDADD = $(LDADD) $(CRYPTOLIBS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign unittests/tests/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign unittests/tests/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-checkPROGRAMS: + -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) +FileDataIOTest$(EXEEXT): $(FileDataIOTest_OBJECTS) $(FileDataIOTest_DEPENDENCIES) + @rm -f FileDataIOTest$(EXEEXT) + $(CXXLINK) $(FileDataIOTest_LDFLAGS) $(FileDataIOTest_OBJECTS) $(FileDataIOTest_LDADD) $(LIBS) +FormatTest$(EXEEXT): $(FormatTest_OBJECTS) $(FormatTest_DEPENDENCIES) + @rm -f FormatTest$(EXEEXT) + $(CXXLINK) $(FormatTest_LDFLAGS) $(FormatTest_OBJECTS) $(FormatTest_LDADD) $(LIBS) +NetworkFunctionsTest$(EXEEXT): $(NetworkFunctionsTest_OBJECTS) $(NetworkFunctionsTest_DEPENDENCIES) + @rm -f NetworkFunctionsTest$(EXEEXT) + $(CXXLINK) $(NetworkFunctionsTest_LDFLAGS) $(NetworkFunctionsTest_OBJECTS) $(NetworkFunctionsTest_LDADD) $(LIBS) +PathTest$(EXEEXT): $(PathTest_OBJECTS) $(PathTest_DEPENDENCIES) + @rm -f PathTest$(EXEEXT) + $(CXXLINK) $(PathTest_LDFLAGS) $(PathTest_OBJECTS) $(PathTest_LDADD) $(LIBS) +RangeMapTest$(EXEEXT): $(RangeMapTest_OBJECTS) $(RangeMapTest_DEPENDENCIES) + @rm -f RangeMapTest$(EXEEXT) + $(CXXLINK) $(RangeMapTest_LDFLAGS) $(RangeMapTest_OBJECTS) $(RangeMapTest_LDADD) $(LIBS) +StringFunctionsTest$(EXEEXT): $(StringFunctionsTest_OBJECTS) $(StringFunctionsTest_DEPENDENCIES) + @rm -f StringFunctionsTest$(EXEEXT) + $(CXXLINK) $(StringFunctionsTest_LDFLAGS) $(StringFunctionsTest_OBJECTS) $(StringFunctionsTest_LDADD) $(LIBS) +TextFileTest$(EXEEXT): $(TextFileTest_OBJECTS) $(TextFileTest_DEPENDENCIES) + @rm -f TextFileTest$(EXEEXT) + $(CXXLINK) $(TextFileTest_LDFLAGS) $(TextFileTest_OBJECTS) $(TextFileTest_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileDataIOTest-CFile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileDataIOTest-FileDataIOTest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileDataIOTest-MemFile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileDataIOTest-Path.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileDataIOTest-SafeFile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileDataIOTest-StringFunctions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileDataIOTest-Tag.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileDataIOTest-UInt128.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FormatTest-Format.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FormatTest-FormatTest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NetworkFunctionsTest-NetworkFunctions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NetworkFunctionsTest-NetworkFunctionsTest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PathTest-Path.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PathTest-PathTest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PathTest-StringFunctions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RangeMapTest-RangeMapTest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StringFunctionsTest-Path.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StringFunctionsTest-StringFunctions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StringFunctionsTest-StringFunctionsTest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TextFileTest-Path.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TextFileTest-StringFunctions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TextFileTest-TextFile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TextFileTest-TextFileTest.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +FileDataIOTest-FileDataIOTest.o: FileDataIOTest.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -MT FileDataIOTest-FileDataIOTest.o -MD -MP -MF "$(DEPDIR)/FileDataIOTest-FileDataIOTest.Tpo" -c -o FileDataIOTest-FileDataIOTest.o `test -f 'FileDataIOTest.cpp' || echo '$(srcdir)/'`FileDataIOTest.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FileDataIOTest-FileDataIOTest.Tpo" "$(DEPDIR)/FileDataIOTest-FileDataIOTest.Po"; else rm -f "$(DEPDIR)/FileDataIOTest-FileDataIOTest.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FileDataIOTest.cpp' object='FileDataIOTest-FileDataIOTest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -c -o FileDataIOTest-FileDataIOTest.o `test -f 'FileDataIOTest.cpp' || echo '$(srcdir)/'`FileDataIOTest.cpp + +FileDataIOTest-FileDataIOTest.obj: FileDataIOTest.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -MT FileDataIOTest-FileDataIOTest.obj -MD -MP -MF "$(DEPDIR)/FileDataIOTest-FileDataIOTest.Tpo" -c -o FileDataIOTest-FileDataIOTest.obj `if test -f 'FileDataIOTest.cpp'; then $(CYGPATH_W) 'FileDataIOTest.cpp'; else $(CYGPATH_W) '$(srcdir)/FileDataIOTest.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FileDataIOTest-FileDataIOTest.Tpo" "$(DEPDIR)/FileDataIOTest-FileDataIOTest.Po"; else rm -f "$(DEPDIR)/FileDataIOTest-FileDataIOTest.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FileDataIOTest.cpp' object='FileDataIOTest-FileDataIOTest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -c -o FileDataIOTest-FileDataIOTest.obj `if test -f 'FileDataIOTest.cpp'; then $(CYGPATH_W) 'FileDataIOTest.cpp'; else $(CYGPATH_W) '$(srcdir)/FileDataIOTest.cpp'; fi` + +FileDataIOTest-SafeFile.o: $(top_srcdir)/src/SafeFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -MT FileDataIOTest-SafeFile.o -MD -MP -MF "$(DEPDIR)/FileDataIOTest-SafeFile.Tpo" -c -o FileDataIOTest-SafeFile.o `test -f '$(top_srcdir)/src/SafeFile.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/SafeFile.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FileDataIOTest-SafeFile.Tpo" "$(DEPDIR)/FileDataIOTest-SafeFile.Po"; else rm -f "$(DEPDIR)/FileDataIOTest-SafeFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/SafeFile.cpp' object='FileDataIOTest-SafeFile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -c -o FileDataIOTest-SafeFile.o `test -f '$(top_srcdir)/src/SafeFile.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/SafeFile.cpp + +FileDataIOTest-SafeFile.obj: $(top_srcdir)/src/SafeFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -MT FileDataIOTest-SafeFile.obj -MD -MP -MF "$(DEPDIR)/FileDataIOTest-SafeFile.Tpo" -c -o FileDataIOTest-SafeFile.obj `if test -f '$(top_srcdir)/src/SafeFile.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/SafeFile.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/SafeFile.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FileDataIOTest-SafeFile.Tpo" "$(DEPDIR)/FileDataIOTest-SafeFile.Po"; else rm -f "$(DEPDIR)/FileDataIOTest-SafeFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/SafeFile.cpp' object='FileDataIOTest-SafeFile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -c -o FileDataIOTest-SafeFile.obj `if test -f '$(top_srcdir)/src/SafeFile.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/SafeFile.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/SafeFile.cpp'; fi` + +FileDataIOTest-CFile.o: $(top_srcdir)/src/CFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -MT FileDataIOTest-CFile.o -MD -MP -MF "$(DEPDIR)/FileDataIOTest-CFile.Tpo" -c -o FileDataIOTest-CFile.o `test -f '$(top_srcdir)/src/CFile.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/CFile.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FileDataIOTest-CFile.Tpo" "$(DEPDIR)/FileDataIOTest-CFile.Po"; else rm -f "$(DEPDIR)/FileDataIOTest-CFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/CFile.cpp' object='FileDataIOTest-CFile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -c -o FileDataIOTest-CFile.o `test -f '$(top_srcdir)/src/CFile.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/CFile.cpp + +FileDataIOTest-CFile.obj: $(top_srcdir)/src/CFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -MT FileDataIOTest-CFile.obj -MD -MP -MF "$(DEPDIR)/FileDataIOTest-CFile.Tpo" -c -o FileDataIOTest-CFile.obj `if test -f '$(top_srcdir)/src/CFile.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/CFile.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/CFile.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FileDataIOTest-CFile.Tpo" "$(DEPDIR)/FileDataIOTest-CFile.Po"; else rm -f "$(DEPDIR)/FileDataIOTest-CFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/CFile.cpp' object='FileDataIOTest-CFile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -c -o FileDataIOTest-CFile.obj `if test -f '$(top_srcdir)/src/CFile.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/CFile.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/CFile.cpp'; fi` + +FileDataIOTest-MemFile.o: $(top_srcdir)/src/MemFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -MT FileDataIOTest-MemFile.o -MD -MP -MF "$(DEPDIR)/FileDataIOTest-MemFile.Tpo" -c -o FileDataIOTest-MemFile.o `test -f '$(top_srcdir)/src/MemFile.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/MemFile.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FileDataIOTest-MemFile.Tpo" "$(DEPDIR)/FileDataIOTest-MemFile.Po"; else rm -f "$(DEPDIR)/FileDataIOTest-MemFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/MemFile.cpp' object='FileDataIOTest-MemFile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -c -o FileDataIOTest-MemFile.o `test -f '$(top_srcdir)/src/MemFile.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/MemFile.cpp + +FileDataIOTest-MemFile.obj: $(top_srcdir)/src/MemFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -MT FileDataIOTest-MemFile.obj -MD -MP -MF "$(DEPDIR)/FileDataIOTest-MemFile.Tpo" -c -o FileDataIOTest-MemFile.obj `if test -f '$(top_srcdir)/src/MemFile.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/MemFile.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/MemFile.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FileDataIOTest-MemFile.Tpo" "$(DEPDIR)/FileDataIOTest-MemFile.Po"; else rm -f "$(DEPDIR)/FileDataIOTest-MemFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/MemFile.cpp' object='FileDataIOTest-MemFile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -c -o FileDataIOTest-MemFile.obj `if test -f '$(top_srcdir)/src/MemFile.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/MemFile.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/MemFile.cpp'; fi` + +FileDataIOTest-UInt128.o: $(top_srcdir)/src/kademlia/utils/UInt128.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -MT FileDataIOTest-UInt128.o -MD -MP -MF "$(DEPDIR)/FileDataIOTest-UInt128.Tpo" -c -o FileDataIOTest-UInt128.o `test -f '$(top_srcdir)/src/kademlia/utils/UInt128.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/kademlia/utils/UInt128.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FileDataIOTest-UInt128.Tpo" "$(DEPDIR)/FileDataIOTest-UInt128.Po"; else rm -f "$(DEPDIR)/FileDataIOTest-UInt128.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/kademlia/utils/UInt128.cpp' object='FileDataIOTest-UInt128.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -c -o FileDataIOTest-UInt128.o `test -f '$(top_srcdir)/src/kademlia/utils/UInt128.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/kademlia/utils/UInt128.cpp + +FileDataIOTest-UInt128.obj: $(top_srcdir)/src/kademlia/utils/UInt128.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -MT FileDataIOTest-UInt128.obj -MD -MP -MF "$(DEPDIR)/FileDataIOTest-UInt128.Tpo" -c -o FileDataIOTest-UInt128.obj `if test -f '$(top_srcdir)/src/kademlia/utils/UInt128.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/kademlia/utils/UInt128.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/kademlia/utils/UInt128.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FileDataIOTest-UInt128.Tpo" "$(DEPDIR)/FileDataIOTest-UInt128.Po"; else rm -f "$(DEPDIR)/FileDataIOTest-UInt128.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/kademlia/utils/UInt128.cpp' object='FileDataIOTest-UInt128.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -c -o FileDataIOTest-UInt128.obj `if test -f '$(top_srcdir)/src/kademlia/utils/UInt128.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/kademlia/utils/UInt128.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/kademlia/utils/UInt128.cpp'; fi` + +FileDataIOTest-StringFunctions.o: $(top_srcdir)/src/libs/common/StringFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -MT FileDataIOTest-StringFunctions.o -MD -MP -MF "$(DEPDIR)/FileDataIOTest-StringFunctions.Tpo" -c -o FileDataIOTest-StringFunctions.o `test -f '$(top_srcdir)/src/libs/common/StringFunctions.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/StringFunctions.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FileDataIOTest-StringFunctions.Tpo" "$(DEPDIR)/FileDataIOTest-StringFunctions.Po"; else rm -f "$(DEPDIR)/FileDataIOTest-StringFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/StringFunctions.cpp' object='FileDataIOTest-StringFunctions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -c -o FileDataIOTest-StringFunctions.o `test -f '$(top_srcdir)/src/libs/common/StringFunctions.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/StringFunctions.cpp + +FileDataIOTest-StringFunctions.obj: $(top_srcdir)/src/libs/common/StringFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -MT FileDataIOTest-StringFunctions.obj -MD -MP -MF "$(DEPDIR)/FileDataIOTest-StringFunctions.Tpo" -c -o FileDataIOTest-StringFunctions.obj `if test -f '$(top_srcdir)/src/libs/common/StringFunctions.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/StringFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/StringFunctions.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FileDataIOTest-StringFunctions.Tpo" "$(DEPDIR)/FileDataIOTest-StringFunctions.Po"; else rm -f "$(DEPDIR)/FileDataIOTest-StringFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/StringFunctions.cpp' object='FileDataIOTest-StringFunctions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -c -o FileDataIOTest-StringFunctions.obj `if test -f '$(top_srcdir)/src/libs/common/StringFunctions.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/StringFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/StringFunctions.cpp'; fi` + +FileDataIOTest-Tag.o: $(top_srcdir)/src/Tag.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -MT FileDataIOTest-Tag.o -MD -MP -MF "$(DEPDIR)/FileDataIOTest-Tag.Tpo" -c -o FileDataIOTest-Tag.o `test -f '$(top_srcdir)/src/Tag.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/Tag.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FileDataIOTest-Tag.Tpo" "$(DEPDIR)/FileDataIOTest-Tag.Po"; else rm -f "$(DEPDIR)/FileDataIOTest-Tag.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/Tag.cpp' object='FileDataIOTest-Tag.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -c -o FileDataIOTest-Tag.o `test -f '$(top_srcdir)/src/Tag.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/Tag.cpp + +FileDataIOTest-Tag.obj: $(top_srcdir)/src/Tag.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -MT FileDataIOTest-Tag.obj -MD -MP -MF "$(DEPDIR)/FileDataIOTest-Tag.Tpo" -c -o FileDataIOTest-Tag.obj `if test -f '$(top_srcdir)/src/Tag.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/Tag.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/Tag.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FileDataIOTest-Tag.Tpo" "$(DEPDIR)/FileDataIOTest-Tag.Po"; else rm -f "$(DEPDIR)/FileDataIOTest-Tag.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/Tag.cpp' object='FileDataIOTest-Tag.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -c -o FileDataIOTest-Tag.obj `if test -f '$(top_srcdir)/src/Tag.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/Tag.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/Tag.cpp'; fi` + +FileDataIOTest-Path.o: $(top_srcdir)/src/libs/common/Path.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -MT FileDataIOTest-Path.o -MD -MP -MF "$(DEPDIR)/FileDataIOTest-Path.Tpo" -c -o FileDataIOTest-Path.o `test -f '$(top_srcdir)/src/libs/common/Path.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/Path.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FileDataIOTest-Path.Tpo" "$(DEPDIR)/FileDataIOTest-Path.Po"; else rm -f "$(DEPDIR)/FileDataIOTest-Path.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/Path.cpp' object='FileDataIOTest-Path.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -c -o FileDataIOTest-Path.o `test -f '$(top_srcdir)/src/libs/common/Path.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/Path.cpp + +FileDataIOTest-Path.obj: $(top_srcdir)/src/libs/common/Path.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -MT FileDataIOTest-Path.obj -MD -MP -MF "$(DEPDIR)/FileDataIOTest-Path.Tpo" -c -o FileDataIOTest-Path.obj `if test -f '$(top_srcdir)/src/libs/common/Path.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/Path.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/Path.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FileDataIOTest-Path.Tpo" "$(DEPDIR)/FileDataIOTest-Path.Po"; else rm -f "$(DEPDIR)/FileDataIOTest-Path.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/Path.cpp' object='FileDataIOTest-Path.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FileDataIOTest_CXXFLAGS) $(CXXFLAGS) -c -o FileDataIOTest-Path.obj `if test -f '$(top_srcdir)/src/libs/common/Path.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/Path.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/Path.cpp'; fi` + +FormatTest-FormatTest.o: FormatTest.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FormatTest_CXXFLAGS) $(CXXFLAGS) -MT FormatTest-FormatTest.o -MD -MP -MF "$(DEPDIR)/FormatTest-FormatTest.Tpo" -c -o FormatTest-FormatTest.o `test -f 'FormatTest.cpp' || echo '$(srcdir)/'`FormatTest.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FormatTest-FormatTest.Tpo" "$(DEPDIR)/FormatTest-FormatTest.Po"; else rm -f "$(DEPDIR)/FormatTest-FormatTest.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FormatTest.cpp' object='FormatTest-FormatTest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FormatTest_CXXFLAGS) $(CXXFLAGS) -c -o FormatTest-FormatTest.o `test -f 'FormatTest.cpp' || echo '$(srcdir)/'`FormatTest.cpp + +FormatTest-FormatTest.obj: FormatTest.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FormatTest_CXXFLAGS) $(CXXFLAGS) -MT FormatTest-FormatTest.obj -MD -MP -MF "$(DEPDIR)/FormatTest-FormatTest.Tpo" -c -o FormatTest-FormatTest.obj `if test -f 'FormatTest.cpp'; then $(CYGPATH_W) 'FormatTest.cpp'; else $(CYGPATH_W) '$(srcdir)/FormatTest.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FormatTest-FormatTest.Tpo" "$(DEPDIR)/FormatTest-FormatTest.Po"; else rm -f "$(DEPDIR)/FormatTest-FormatTest.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FormatTest.cpp' object='FormatTest-FormatTest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FormatTest_CXXFLAGS) $(CXXFLAGS) -c -o FormatTest-FormatTest.obj `if test -f 'FormatTest.cpp'; then $(CYGPATH_W) 'FormatTest.cpp'; else $(CYGPATH_W) '$(srcdir)/FormatTest.cpp'; fi` + +FormatTest-Format.o: $(top_srcdir)/src/libs/common/Format.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FormatTest_CXXFLAGS) $(CXXFLAGS) -MT FormatTest-Format.o -MD -MP -MF "$(DEPDIR)/FormatTest-Format.Tpo" -c -o FormatTest-Format.o `test -f '$(top_srcdir)/src/libs/common/Format.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/Format.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FormatTest-Format.Tpo" "$(DEPDIR)/FormatTest-Format.Po"; else rm -f "$(DEPDIR)/FormatTest-Format.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/Format.cpp' object='FormatTest-Format.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FormatTest_CXXFLAGS) $(CXXFLAGS) -c -o FormatTest-Format.o `test -f '$(top_srcdir)/src/libs/common/Format.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/Format.cpp + +FormatTest-Format.obj: $(top_srcdir)/src/libs/common/Format.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FormatTest_CXXFLAGS) $(CXXFLAGS) -MT FormatTest-Format.obj -MD -MP -MF "$(DEPDIR)/FormatTest-Format.Tpo" -c -o FormatTest-Format.obj `if test -f '$(top_srcdir)/src/libs/common/Format.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/Format.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/Format.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/FormatTest-Format.Tpo" "$(DEPDIR)/FormatTest-Format.Po"; else rm -f "$(DEPDIR)/FormatTest-Format.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/Format.cpp' object='FormatTest-Format.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(FormatTest_CXXFLAGS) $(CXXFLAGS) -c -o FormatTest-Format.obj `if test -f '$(top_srcdir)/src/libs/common/Format.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/Format.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/Format.cpp'; fi` + +NetworkFunctionsTest-NetworkFunctionsTest.o: NetworkFunctionsTest.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(NetworkFunctionsTest_CXXFLAGS) $(CXXFLAGS) -MT NetworkFunctionsTest-NetworkFunctionsTest.o -MD -MP -MF "$(DEPDIR)/NetworkFunctionsTest-NetworkFunctionsTest.Tpo" -c -o NetworkFunctionsTest-NetworkFunctionsTest.o `test -f 'NetworkFunctionsTest.cpp' || echo '$(srcdir)/'`NetworkFunctionsTest.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/NetworkFunctionsTest-NetworkFunctionsTest.Tpo" "$(DEPDIR)/NetworkFunctionsTest-NetworkFunctionsTest.Po"; else rm -f "$(DEPDIR)/NetworkFunctionsTest-NetworkFunctionsTest.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='NetworkFunctionsTest.cpp' object='NetworkFunctionsTest-NetworkFunctionsTest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(NetworkFunctionsTest_CXXFLAGS) $(CXXFLAGS) -c -o NetworkFunctionsTest-NetworkFunctionsTest.o `test -f 'NetworkFunctionsTest.cpp' || echo '$(srcdir)/'`NetworkFunctionsTest.cpp + +NetworkFunctionsTest-NetworkFunctionsTest.obj: NetworkFunctionsTest.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(NetworkFunctionsTest_CXXFLAGS) $(CXXFLAGS) -MT NetworkFunctionsTest-NetworkFunctionsTest.obj -MD -MP -MF "$(DEPDIR)/NetworkFunctionsTest-NetworkFunctionsTest.Tpo" -c -o NetworkFunctionsTest-NetworkFunctionsTest.obj `if test -f 'NetworkFunctionsTest.cpp'; then $(CYGPATH_W) 'NetworkFunctionsTest.cpp'; else $(CYGPATH_W) '$(srcdir)/NetworkFunctionsTest.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/NetworkFunctionsTest-NetworkFunctionsTest.Tpo" "$(DEPDIR)/NetworkFunctionsTest-NetworkFunctionsTest.Po"; else rm -f "$(DEPDIR)/NetworkFunctionsTest-NetworkFunctionsTest.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='NetworkFunctionsTest.cpp' object='NetworkFunctionsTest-NetworkFunctionsTest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(NetworkFunctionsTest_CXXFLAGS) $(CXXFLAGS) -c -o NetworkFunctionsTest-NetworkFunctionsTest.obj `if test -f 'NetworkFunctionsTest.cpp'; then $(CYGPATH_W) 'NetworkFunctionsTest.cpp'; else $(CYGPATH_W) '$(srcdir)/NetworkFunctionsTest.cpp'; fi` + +NetworkFunctionsTest-NetworkFunctions.o: $(top_srcdir)/src/NetworkFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(NetworkFunctionsTest_CXXFLAGS) $(CXXFLAGS) -MT NetworkFunctionsTest-NetworkFunctions.o -MD -MP -MF "$(DEPDIR)/NetworkFunctionsTest-NetworkFunctions.Tpo" -c -o NetworkFunctionsTest-NetworkFunctions.o `test -f '$(top_srcdir)/src/NetworkFunctions.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/NetworkFunctions.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/NetworkFunctionsTest-NetworkFunctions.Tpo" "$(DEPDIR)/NetworkFunctionsTest-NetworkFunctions.Po"; else rm -f "$(DEPDIR)/NetworkFunctionsTest-NetworkFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/NetworkFunctions.cpp' object='NetworkFunctionsTest-NetworkFunctions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(NetworkFunctionsTest_CXXFLAGS) $(CXXFLAGS) -c -o NetworkFunctionsTest-NetworkFunctions.o `test -f '$(top_srcdir)/src/NetworkFunctions.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/NetworkFunctions.cpp + +NetworkFunctionsTest-NetworkFunctions.obj: $(top_srcdir)/src/NetworkFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(NetworkFunctionsTest_CXXFLAGS) $(CXXFLAGS) -MT NetworkFunctionsTest-NetworkFunctions.obj -MD -MP -MF "$(DEPDIR)/NetworkFunctionsTest-NetworkFunctions.Tpo" -c -o NetworkFunctionsTest-NetworkFunctions.obj `if test -f '$(top_srcdir)/src/NetworkFunctions.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/NetworkFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/NetworkFunctions.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/NetworkFunctionsTest-NetworkFunctions.Tpo" "$(DEPDIR)/NetworkFunctionsTest-NetworkFunctions.Po"; else rm -f "$(DEPDIR)/NetworkFunctionsTest-NetworkFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/NetworkFunctions.cpp' object='NetworkFunctionsTest-NetworkFunctions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(NetworkFunctionsTest_CXXFLAGS) $(CXXFLAGS) -c -o NetworkFunctionsTest-NetworkFunctions.obj `if test -f '$(top_srcdir)/src/NetworkFunctions.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/NetworkFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/NetworkFunctions.cpp'; fi` + +PathTest-PathTest.o: PathTest.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(PathTest_CXXFLAGS) $(CXXFLAGS) -MT PathTest-PathTest.o -MD -MP -MF "$(DEPDIR)/PathTest-PathTest.Tpo" -c -o PathTest-PathTest.o `test -f 'PathTest.cpp' || echo '$(srcdir)/'`PathTest.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/PathTest-PathTest.Tpo" "$(DEPDIR)/PathTest-PathTest.Po"; else rm -f "$(DEPDIR)/PathTest-PathTest.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PathTest.cpp' object='PathTest-PathTest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(PathTest_CXXFLAGS) $(CXXFLAGS) -c -o PathTest-PathTest.o `test -f 'PathTest.cpp' || echo '$(srcdir)/'`PathTest.cpp + +PathTest-PathTest.obj: PathTest.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(PathTest_CXXFLAGS) $(CXXFLAGS) -MT PathTest-PathTest.obj -MD -MP -MF "$(DEPDIR)/PathTest-PathTest.Tpo" -c -o PathTest-PathTest.obj `if test -f 'PathTest.cpp'; then $(CYGPATH_W) 'PathTest.cpp'; else $(CYGPATH_W) '$(srcdir)/PathTest.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/PathTest-PathTest.Tpo" "$(DEPDIR)/PathTest-PathTest.Po"; else rm -f "$(DEPDIR)/PathTest-PathTest.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PathTest.cpp' object='PathTest-PathTest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(PathTest_CXXFLAGS) $(CXXFLAGS) -c -o PathTest-PathTest.obj `if test -f 'PathTest.cpp'; then $(CYGPATH_W) 'PathTest.cpp'; else $(CYGPATH_W) '$(srcdir)/PathTest.cpp'; fi` + +PathTest-Path.o: $(top_srcdir)/src/libs/common/Path.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(PathTest_CXXFLAGS) $(CXXFLAGS) -MT PathTest-Path.o -MD -MP -MF "$(DEPDIR)/PathTest-Path.Tpo" -c -o PathTest-Path.o `test -f '$(top_srcdir)/src/libs/common/Path.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/Path.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/PathTest-Path.Tpo" "$(DEPDIR)/PathTest-Path.Po"; else rm -f "$(DEPDIR)/PathTest-Path.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/Path.cpp' object='PathTest-Path.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(PathTest_CXXFLAGS) $(CXXFLAGS) -c -o PathTest-Path.o `test -f '$(top_srcdir)/src/libs/common/Path.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/Path.cpp + +PathTest-Path.obj: $(top_srcdir)/src/libs/common/Path.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(PathTest_CXXFLAGS) $(CXXFLAGS) -MT PathTest-Path.obj -MD -MP -MF "$(DEPDIR)/PathTest-Path.Tpo" -c -o PathTest-Path.obj `if test -f '$(top_srcdir)/src/libs/common/Path.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/Path.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/Path.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/PathTest-Path.Tpo" "$(DEPDIR)/PathTest-Path.Po"; else rm -f "$(DEPDIR)/PathTest-Path.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/Path.cpp' object='PathTest-Path.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(PathTest_CXXFLAGS) $(CXXFLAGS) -c -o PathTest-Path.obj `if test -f '$(top_srcdir)/src/libs/common/Path.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/Path.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/Path.cpp'; fi` + +PathTest-StringFunctions.o: $(top_srcdir)/src/libs/common/StringFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(PathTest_CXXFLAGS) $(CXXFLAGS) -MT PathTest-StringFunctions.o -MD -MP -MF "$(DEPDIR)/PathTest-StringFunctions.Tpo" -c -o PathTest-StringFunctions.o `test -f '$(top_srcdir)/src/libs/common/StringFunctions.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/StringFunctions.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/PathTest-StringFunctions.Tpo" "$(DEPDIR)/PathTest-StringFunctions.Po"; else rm -f "$(DEPDIR)/PathTest-StringFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/StringFunctions.cpp' object='PathTest-StringFunctions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(PathTest_CXXFLAGS) $(CXXFLAGS) -c -o PathTest-StringFunctions.o `test -f '$(top_srcdir)/src/libs/common/StringFunctions.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/StringFunctions.cpp + +PathTest-StringFunctions.obj: $(top_srcdir)/src/libs/common/StringFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(PathTest_CXXFLAGS) $(CXXFLAGS) -MT PathTest-StringFunctions.obj -MD -MP -MF "$(DEPDIR)/PathTest-StringFunctions.Tpo" -c -o PathTest-StringFunctions.obj `if test -f '$(top_srcdir)/src/libs/common/StringFunctions.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/StringFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/StringFunctions.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/PathTest-StringFunctions.Tpo" "$(DEPDIR)/PathTest-StringFunctions.Po"; else rm -f "$(DEPDIR)/PathTest-StringFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/StringFunctions.cpp' object='PathTest-StringFunctions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(PathTest_CXXFLAGS) $(CXXFLAGS) -c -o PathTest-StringFunctions.obj `if test -f '$(top_srcdir)/src/libs/common/StringFunctions.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/StringFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/StringFunctions.cpp'; fi` + +RangeMapTest-RangeMapTest.o: RangeMapTest.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(RangeMapTest_CXXFLAGS) $(CXXFLAGS) -MT RangeMapTest-RangeMapTest.o -MD -MP -MF "$(DEPDIR)/RangeMapTest-RangeMapTest.Tpo" -c -o RangeMapTest-RangeMapTest.o `test -f 'RangeMapTest.cpp' || echo '$(srcdir)/'`RangeMapTest.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/RangeMapTest-RangeMapTest.Tpo" "$(DEPDIR)/RangeMapTest-RangeMapTest.Po"; else rm -f "$(DEPDIR)/RangeMapTest-RangeMapTest.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='RangeMapTest.cpp' object='RangeMapTest-RangeMapTest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(RangeMapTest_CXXFLAGS) $(CXXFLAGS) -c -o RangeMapTest-RangeMapTest.o `test -f 'RangeMapTest.cpp' || echo '$(srcdir)/'`RangeMapTest.cpp + +RangeMapTest-RangeMapTest.obj: RangeMapTest.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(RangeMapTest_CXXFLAGS) $(CXXFLAGS) -MT RangeMapTest-RangeMapTest.obj -MD -MP -MF "$(DEPDIR)/RangeMapTest-RangeMapTest.Tpo" -c -o RangeMapTest-RangeMapTest.obj `if test -f 'RangeMapTest.cpp'; then $(CYGPATH_W) 'RangeMapTest.cpp'; else $(CYGPATH_W) '$(srcdir)/RangeMapTest.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/RangeMapTest-RangeMapTest.Tpo" "$(DEPDIR)/RangeMapTest-RangeMapTest.Po"; else rm -f "$(DEPDIR)/RangeMapTest-RangeMapTest.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='RangeMapTest.cpp' object='RangeMapTest-RangeMapTest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(RangeMapTest_CXXFLAGS) $(CXXFLAGS) -c -o RangeMapTest-RangeMapTest.obj `if test -f 'RangeMapTest.cpp'; then $(CYGPATH_W) 'RangeMapTest.cpp'; else $(CYGPATH_W) '$(srcdir)/RangeMapTest.cpp'; fi` + +StringFunctionsTest-StringFunctionsTest.o: StringFunctionsTest.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(StringFunctionsTest_CXXFLAGS) $(CXXFLAGS) -MT StringFunctionsTest-StringFunctionsTest.o -MD -MP -MF "$(DEPDIR)/StringFunctionsTest-StringFunctionsTest.Tpo" -c -o StringFunctionsTest-StringFunctionsTest.o `test -f 'StringFunctionsTest.cpp' || echo '$(srcdir)/'`StringFunctionsTest.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/StringFunctionsTest-StringFunctionsTest.Tpo" "$(DEPDIR)/StringFunctionsTest-StringFunctionsTest.Po"; else rm -f "$(DEPDIR)/StringFunctionsTest-StringFunctionsTest.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='StringFunctionsTest.cpp' object='StringFunctionsTest-StringFunctionsTest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(StringFunctionsTest_CXXFLAGS) $(CXXFLAGS) -c -o StringFunctionsTest-StringFunctionsTest.o `test -f 'StringFunctionsTest.cpp' || echo '$(srcdir)/'`StringFunctionsTest.cpp + +StringFunctionsTest-StringFunctionsTest.obj: StringFunctionsTest.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(StringFunctionsTest_CXXFLAGS) $(CXXFLAGS) -MT StringFunctionsTest-StringFunctionsTest.obj -MD -MP -MF "$(DEPDIR)/StringFunctionsTest-StringFunctionsTest.Tpo" -c -o StringFunctionsTest-StringFunctionsTest.obj `if test -f 'StringFunctionsTest.cpp'; then $(CYGPATH_W) 'StringFunctionsTest.cpp'; else $(CYGPATH_W) '$(srcdir)/StringFunctionsTest.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/StringFunctionsTest-StringFunctionsTest.Tpo" "$(DEPDIR)/StringFunctionsTest-StringFunctionsTest.Po"; else rm -f "$(DEPDIR)/StringFunctionsTest-StringFunctionsTest.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='StringFunctionsTest.cpp' object='StringFunctionsTest-StringFunctionsTest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(StringFunctionsTest_CXXFLAGS) $(CXXFLAGS) -c -o StringFunctionsTest-StringFunctionsTest.obj `if test -f 'StringFunctionsTest.cpp'; then $(CYGPATH_W) 'StringFunctionsTest.cpp'; else $(CYGPATH_W) '$(srcdir)/StringFunctionsTest.cpp'; fi` + +StringFunctionsTest-StringFunctions.o: $(top_srcdir)/src/libs/common/StringFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(StringFunctionsTest_CXXFLAGS) $(CXXFLAGS) -MT StringFunctionsTest-StringFunctions.o -MD -MP -MF "$(DEPDIR)/StringFunctionsTest-StringFunctions.Tpo" -c -o StringFunctionsTest-StringFunctions.o `test -f '$(top_srcdir)/src/libs/common/StringFunctions.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/StringFunctions.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/StringFunctionsTest-StringFunctions.Tpo" "$(DEPDIR)/StringFunctionsTest-StringFunctions.Po"; else rm -f "$(DEPDIR)/StringFunctionsTest-StringFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/StringFunctions.cpp' object='StringFunctionsTest-StringFunctions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(StringFunctionsTest_CXXFLAGS) $(CXXFLAGS) -c -o StringFunctionsTest-StringFunctions.o `test -f '$(top_srcdir)/src/libs/common/StringFunctions.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/StringFunctions.cpp + +StringFunctionsTest-StringFunctions.obj: $(top_srcdir)/src/libs/common/StringFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(StringFunctionsTest_CXXFLAGS) $(CXXFLAGS) -MT StringFunctionsTest-StringFunctions.obj -MD -MP -MF "$(DEPDIR)/StringFunctionsTest-StringFunctions.Tpo" -c -o StringFunctionsTest-StringFunctions.obj `if test -f '$(top_srcdir)/src/libs/common/StringFunctions.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/StringFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/StringFunctions.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/StringFunctionsTest-StringFunctions.Tpo" "$(DEPDIR)/StringFunctionsTest-StringFunctions.Po"; else rm -f "$(DEPDIR)/StringFunctionsTest-StringFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/StringFunctions.cpp' object='StringFunctionsTest-StringFunctions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(StringFunctionsTest_CXXFLAGS) $(CXXFLAGS) -c -o StringFunctionsTest-StringFunctions.obj `if test -f '$(top_srcdir)/src/libs/common/StringFunctions.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/StringFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/StringFunctions.cpp'; fi` + +StringFunctionsTest-Path.o: $(top_srcdir)/src/libs/common/Path.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(StringFunctionsTest_CXXFLAGS) $(CXXFLAGS) -MT StringFunctionsTest-Path.o -MD -MP -MF "$(DEPDIR)/StringFunctionsTest-Path.Tpo" -c -o StringFunctionsTest-Path.o `test -f '$(top_srcdir)/src/libs/common/Path.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/Path.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/StringFunctionsTest-Path.Tpo" "$(DEPDIR)/StringFunctionsTest-Path.Po"; else rm -f "$(DEPDIR)/StringFunctionsTest-Path.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/Path.cpp' object='StringFunctionsTest-Path.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(StringFunctionsTest_CXXFLAGS) $(CXXFLAGS) -c -o StringFunctionsTest-Path.o `test -f '$(top_srcdir)/src/libs/common/Path.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/Path.cpp + +StringFunctionsTest-Path.obj: $(top_srcdir)/src/libs/common/Path.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(StringFunctionsTest_CXXFLAGS) $(CXXFLAGS) -MT StringFunctionsTest-Path.obj -MD -MP -MF "$(DEPDIR)/StringFunctionsTest-Path.Tpo" -c -o StringFunctionsTest-Path.obj `if test -f '$(top_srcdir)/src/libs/common/Path.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/Path.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/Path.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/StringFunctionsTest-Path.Tpo" "$(DEPDIR)/StringFunctionsTest-Path.Po"; else rm -f "$(DEPDIR)/StringFunctionsTest-Path.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/Path.cpp' object='StringFunctionsTest-Path.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(StringFunctionsTest_CXXFLAGS) $(CXXFLAGS) -c -o StringFunctionsTest-Path.obj `if test -f '$(top_srcdir)/src/libs/common/Path.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/Path.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/Path.cpp'; fi` + +TextFileTest-TextFileTest.o: TextFileTest.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(TextFileTest_CXXFLAGS) $(CXXFLAGS) -MT TextFileTest-TextFileTest.o -MD -MP -MF "$(DEPDIR)/TextFileTest-TextFileTest.Tpo" -c -o TextFileTest-TextFileTest.o `test -f 'TextFileTest.cpp' || echo '$(srcdir)/'`TextFileTest.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/TextFileTest-TextFileTest.Tpo" "$(DEPDIR)/TextFileTest-TextFileTest.Po"; else rm -f "$(DEPDIR)/TextFileTest-TextFileTest.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TextFileTest.cpp' object='TextFileTest-TextFileTest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(TextFileTest_CXXFLAGS) $(CXXFLAGS) -c -o TextFileTest-TextFileTest.o `test -f 'TextFileTest.cpp' || echo '$(srcdir)/'`TextFileTest.cpp + +TextFileTest-TextFileTest.obj: TextFileTest.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(TextFileTest_CXXFLAGS) $(CXXFLAGS) -MT TextFileTest-TextFileTest.obj -MD -MP -MF "$(DEPDIR)/TextFileTest-TextFileTest.Tpo" -c -o TextFileTest-TextFileTest.obj `if test -f 'TextFileTest.cpp'; then $(CYGPATH_W) 'TextFileTest.cpp'; else $(CYGPATH_W) '$(srcdir)/TextFileTest.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/TextFileTest-TextFileTest.Tpo" "$(DEPDIR)/TextFileTest-TextFileTest.Po"; else rm -f "$(DEPDIR)/TextFileTest-TextFileTest.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TextFileTest.cpp' object='TextFileTest-TextFileTest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(TextFileTest_CXXFLAGS) $(CXXFLAGS) -c -o TextFileTest-TextFileTest.obj `if test -f 'TextFileTest.cpp'; then $(CYGPATH_W) 'TextFileTest.cpp'; else $(CYGPATH_W) '$(srcdir)/TextFileTest.cpp'; fi` + +TextFileTest-Path.o: $(top_srcdir)/src/libs/common/Path.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(TextFileTest_CXXFLAGS) $(CXXFLAGS) -MT TextFileTest-Path.o -MD -MP -MF "$(DEPDIR)/TextFileTest-Path.Tpo" -c -o TextFileTest-Path.o `test -f '$(top_srcdir)/src/libs/common/Path.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/Path.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/TextFileTest-Path.Tpo" "$(DEPDIR)/TextFileTest-Path.Po"; else rm -f "$(DEPDIR)/TextFileTest-Path.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/Path.cpp' object='TextFileTest-Path.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(TextFileTest_CXXFLAGS) $(CXXFLAGS) -c -o TextFileTest-Path.o `test -f '$(top_srcdir)/src/libs/common/Path.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/Path.cpp + +TextFileTest-Path.obj: $(top_srcdir)/src/libs/common/Path.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(TextFileTest_CXXFLAGS) $(CXXFLAGS) -MT TextFileTest-Path.obj -MD -MP -MF "$(DEPDIR)/TextFileTest-Path.Tpo" -c -o TextFileTest-Path.obj `if test -f '$(top_srcdir)/src/libs/common/Path.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/Path.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/Path.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/TextFileTest-Path.Tpo" "$(DEPDIR)/TextFileTest-Path.Po"; else rm -f "$(DEPDIR)/TextFileTest-Path.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/Path.cpp' object='TextFileTest-Path.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(TextFileTest_CXXFLAGS) $(CXXFLAGS) -c -o TextFileTest-Path.obj `if test -f '$(top_srcdir)/src/libs/common/Path.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/Path.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/Path.cpp'; fi` + +TextFileTest-StringFunctions.o: $(top_srcdir)/src/libs/common/StringFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(TextFileTest_CXXFLAGS) $(CXXFLAGS) -MT TextFileTest-StringFunctions.o -MD -MP -MF "$(DEPDIR)/TextFileTest-StringFunctions.Tpo" -c -o TextFileTest-StringFunctions.o `test -f '$(top_srcdir)/src/libs/common/StringFunctions.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/StringFunctions.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/TextFileTest-StringFunctions.Tpo" "$(DEPDIR)/TextFileTest-StringFunctions.Po"; else rm -f "$(DEPDIR)/TextFileTest-StringFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/StringFunctions.cpp' object='TextFileTest-StringFunctions.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(TextFileTest_CXXFLAGS) $(CXXFLAGS) -c -o TextFileTest-StringFunctions.o `test -f '$(top_srcdir)/src/libs/common/StringFunctions.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/StringFunctions.cpp + +TextFileTest-StringFunctions.obj: $(top_srcdir)/src/libs/common/StringFunctions.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(TextFileTest_CXXFLAGS) $(CXXFLAGS) -MT TextFileTest-StringFunctions.obj -MD -MP -MF "$(DEPDIR)/TextFileTest-StringFunctions.Tpo" -c -o TextFileTest-StringFunctions.obj `if test -f '$(top_srcdir)/src/libs/common/StringFunctions.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/StringFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/StringFunctions.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/TextFileTest-StringFunctions.Tpo" "$(DEPDIR)/TextFileTest-StringFunctions.Po"; else rm -f "$(DEPDIR)/TextFileTest-StringFunctions.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/StringFunctions.cpp' object='TextFileTest-StringFunctions.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(TextFileTest_CXXFLAGS) $(CXXFLAGS) -c -o TextFileTest-StringFunctions.obj `if test -f '$(top_srcdir)/src/libs/common/StringFunctions.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/StringFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/StringFunctions.cpp'; fi` + +TextFileTest-TextFile.o: $(top_srcdir)/src/libs/common/TextFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(TextFileTest_CXXFLAGS) $(CXXFLAGS) -MT TextFileTest-TextFile.o -MD -MP -MF "$(DEPDIR)/TextFileTest-TextFile.Tpo" -c -o TextFileTest-TextFile.o `test -f '$(top_srcdir)/src/libs/common/TextFile.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/TextFile.cpp; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/TextFileTest-TextFile.Tpo" "$(DEPDIR)/TextFileTest-TextFile.Po"; else rm -f "$(DEPDIR)/TextFileTest-TextFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/TextFile.cpp' object='TextFileTest-TextFile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(TextFileTest_CXXFLAGS) $(CXXFLAGS) -c -o TextFileTest-TextFile.o `test -f '$(top_srcdir)/src/libs/common/TextFile.cpp' || echo '$(srcdir)/'`$(top_srcdir)/src/libs/common/TextFile.cpp + +TextFileTest-TextFile.obj: $(top_srcdir)/src/libs/common/TextFile.cpp +@am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(TextFileTest_CXXFLAGS) $(CXXFLAGS) -MT TextFileTest-TextFile.obj -MD -MP -MF "$(DEPDIR)/TextFileTest-TextFile.Tpo" -c -o TextFileTest-TextFile.obj `if test -f '$(top_srcdir)/src/libs/common/TextFile.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/TextFile.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/TextFile.cpp'; fi`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/TextFileTest-TextFile.Tpo" "$(DEPDIR)/TextFileTest-TextFile.Po"; else rm -f "$(DEPDIR)/TextFileTest-TextFile.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/libs/common/TextFile.cpp' object='TextFileTest-TextFile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(TextFileTest_CXXFLAGS) $(CXXFLAGS) -c -o TextFileTest-TextFile.obj `if test -f '$(top_srcdir)/src/libs/common/TextFile.cpp'; then $(CYGPATH_W) '$(top_srcdir)/src/libs/common/TextFile.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/libs/common/TextFile.cpp'; fi` +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list='$(TESTS)'; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *" $$tst "*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *" $$tst "*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic ctags distclean \ + distclean-compile distclean-generic distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/unittests/tests/NetworkFunctionsTest.cpp b/unittests/tests/NetworkFunctionsTest.cpp new file mode 100644 index 00000000..32eb143e --- /dev/null +++ b/unittests/tests/NetworkFunctionsTest.cpp @@ -0,0 +1,134 @@ +#include +#include + +#define itemsof(x) (sizeof(x)/sizeof(x[0])) + +using namespace muleunit; + +DECLARE_SIMPLE(NetworkFunctions) + +TEST(NetworkFunctions, StringIPtoUint32) +{ + unsigned char values[] = { 0, 1, 127, 254, 255 }; + const wxChar whitespace[] = { wxT(' '), wxT('\t'), wxT('\n') }; + int items = itemsof(values); + int whites = 2; + int zeros = 2; + + // Test a few standard IP combinations + for (int wl = 0; wl < whites; ++wl) { + for (int wr = 0; wr < whites; ++wr) { + for (int a = 0; a < items; ++a) { + for (int za = 0; za < zeros; ++za) { + for (int b = 0; b < items; ++b) { + for (int zb = 0; zb < zeros; ++zb) { + for (int c = 0; c < items; ++c) { + for (int zc = 0; zc < zeros; ++zc) { + for (int d = 0; d < items; ++d) { + for (int zd = 0; zd < zeros; ++zd) { + wxString IP; + + IP << wxString(wxT(' '), wl) + << wxString(wxT('0'), za) + << values[a] + << wxT('.') + << wxString(wxT('0'), zb) + << values[b] + << wxT('.') + << wxString(wxT('0'), zc) + << values[c] + << wxT('.') + << wxString(wxT('0'), zd) + << values[d] + << wxString(wxT(' '), wr); + + uint32 resultIP = 17; + + ASSERT_TRUE(StringIPtoUint32(IP, resultIP)); + + uint32 expected = (values[d] << 24) | (values[c] << 16) | (values[b] << 8) | values[a]; + + ASSERT_EQUALS(expected, resultIP); + } + } + } + } + } + } + } + } + } + } + + + // Test invalid IPs + uint32 dummyIP = 27; + + // Missing fields + ASSERT_FALSE(StringIPtoUint32(wxT(".2.3.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1..3.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.2..4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.2.3."), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT(".2.3."), dummyIP)); + + // Extra dots + ASSERT_FALSE(StringIPtoUint32(wxT(".1.2.3.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1..2.3.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.2..3.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.2.3..4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.2.3.4."), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT(".1.2.3.4."), dummyIP)); + + // Garbage + ASSERT_FALSE(StringIPtoUint32(wxT("abc"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("a1.1.3.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.1.3.4b"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("a.1.3.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.b.3.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.2.c.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.2.3.d"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.b.3.d"), dummyIP)); + + // Invalid fields + ASSERT_FALSE(StringIPtoUint32(wxT("256.2.3.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.256.3.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.2.256.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.2.3.256"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("256.2.3.256"), dummyIP)); + + // Negative fields + ASSERT_FALSE(StringIPtoUint32(wxT("-1.2.3.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.-2.3.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.2.-3.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.2.3.-4"), dummyIP)); + + // Whitespace between fields + for (unsigned i = 0; i < itemsof(whitespace); ++i) { + wxChar c = whitespace[i]; + + ASSERT_FALSE(StringIPtoUint32(wxString::Format(wxT("1%c.2.3.4"), c), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxString::Format(wxT("1.%c2.3.4"), c), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxString::Format(wxT("1.2%c.3.4"), c), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxString::Format(wxT("1.2.%c3.4"), c), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxString::Format(wxT("1.2.3%c.4"), c), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxString::Format(wxT("1.2.3.%c4"), c), dummyIP)); + } + + + // Faar too large values (triggered overflow and became negative) + ASSERT_FALSE(StringIPtoUint32(wxT("2147483648.2.3.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.2147483648.3.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.2.2147483648.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.2.3.2147483648"), dummyIP)); + + // Values greater than 2 ** 32 - 1 (triggered overflow and becames x - (2 ** 32 - 1)) + ASSERT_FALSE(StringIPtoUint32(wxT("4294967296.2.3.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.4294967296.3.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.2.4294967296.4"), dummyIP)); + ASSERT_FALSE(StringIPtoUint32(wxT("1.2.3.4294967296"), dummyIP)); + + + // The dummyIP value shouldn't have been changed by any of these calls + ASSERT_EQUALS(27u, dummyIP); +} + diff --git a/unittests/tests/PathTest.cpp b/unittests/tests/PathTest.cpp new file mode 100644 index 00000000..aa4af4b0 --- /dev/null +++ b/unittests/tests/PathTest.cpp @@ -0,0 +1,375 @@ +#include + +#include +#include + +#include + +using namespace muleunit; + +struct STestStr +{ + //! Specifies the "source" of the string (user/fs) + const bool fromFS; + //! Input filename + const wxString input; + //! The expected result. + const wxString expected; +}; + +const STestStr g_fromFSTests[] = { + // From filesystem + { true, wxConvFileName->cMB2WC("\xe1\x62\x63"), wxT("\xe1\x62\x63") }, + { true, wxConvFileName->cMB2WC("\xe6\xf8\xe5"), wxT("\xe6\xf8\xe5") }, + { true, wxConvFileName->cMB2WC("\xd8\xa7\xd9\x84\xd8\xb9"), wxT("\u0627\u0644\u0639") }, + + // From User + { false, wxT("\u0627\u0644\u0639"), wxT("\u0627\u0644\u0639") } +}; + +enum UsesEncoding { + UE_Unknown, + UE_Broken, + UE_NonBroken +}; + +wxString GetExpectedString(const wxString& src) +{ + // Determine how the filenames are expected to be mangled + static UsesEncoding encoding = UE_Unknown; + + if (encoding == UE_Unknown) { + wxCharBuffer fn = wxConvFile.cWC2MB(wxT("\u0627\u0644\u0639")); + + if (fn) { + encoding = UE_NonBroken; + } else { + encoding = UE_Broken; + } + } + + if ((encoding == UE_Broken) && !wxConvFile.cWC2MB(src)) { + // See CPath::CPath for rationale ... + wxCharBuffer fn = wxConvUTF8.cWC2MB(src); + return wxConvFile.cMB2WC(fn); + } else { + return src; + } +} + + +wxString StringFrom(const CPath& prt) +{ + return prt.GetPrintableString(); +} + + +DECLARE_SIMPLE(CPath) + +TEST(CPath, DefaultConstructor) +{ + CPath tmp; + + ASSERT_FALSE(tmp.IsOk()); + ASSERT_EQUALS(tmp, CPath()); + + ASSERT_FALSE(tmp.FileExists()); + ASSERT_FALSE(tmp.DirExists()); + + ASSERT_EQUALS(wxEmptyString, tmp.GetRaw()); + ASSERT_EQUALS(wxEmptyString, tmp.GetPrintable()); + ASSERT_EQUALS(CPath(), tmp.GetPath()); + ASSERT_EQUALS(CPath(), tmp.GetFullName()); + + ASSERT_EQUALS(wxEmptyString, tmp.GetPrintableString()); +} + + +TEST(CPath, PathConstructor) +{ + { + CPath tmp(wxT("")); + + ASSERT_FALSE(tmp.IsOk()); + ASSERT_EQUALS(tmp, CPath()); + } + + + for (size_t i = 0; i < ArraySize(g_fromFSTests); ++i) { + const wxString input = g_fromFSTests[i].input; + const wxString result = g_fromFSTests[i].expected; + + ASSERT_TRUE(result.Length()); + ASSERT_TRUE(input.Length()); + + CPath tmp(input); + + ASSERT_TRUE(tmp.IsOk()); + ASSERT_EQUALS(tmp, CPath(input)); + + ASSERT_EQUALS(tmp.GetRaw(), ::GetExpectedString(input)); + ASSERT_EQUALS(tmp.GetPrintable(), result); + + ASSERT_EQUALS(tmp.GetFullName(), tmp); + ASSERT_EQUALS(tmp.GetPath(), CPath()); + } +} + + +TEST(CPath, CopyConstructor) +{ + const wxChar* tmpPath = wxT("foobar.tgz"); + + { + CPath a(tmpPath); + + ASSERT_TRUE(a.IsOk()); + ASSERT_EQUALS(a.GetRaw(), tmpPath); + ASSERT_EQUALS(a.GetPrintable(), tmpPath); + ASSERT_EQUALS(a.GetPath(), CPath()); + ASSERT_EQUALS(a.GetFullName(), CPath(tmpPath)); + + CPath b(a); + ASSERT_TRUE(b.IsOk()); + ASSERT_EQUALS(b.GetRaw(), tmpPath); + ASSERT_EQUALS(b.GetPrintable(), tmpPath); + ASSERT_EQUALS(b.GetPath(), CPath()); + ASSERT_EQUALS(b.GetFullName(), CPath(tmpPath)); + + ASSERT_EQUALS(a, b); + } + + { + CPath a(tmpPath); + + ASSERT_TRUE(a.IsOk()); + ASSERT_EQUALS(a.GetRaw(), tmpPath); + ASSERT_EQUALS(a.GetPrintable(), tmpPath); + ASSERT_EQUALS(a.GetPath(), CPath()); + ASSERT_EQUALS(a.GetFullName(), CPath(tmpPath)); + + CPath b(a); + ASSERT_TRUE(b.IsOk()); + ASSERT_EQUALS(b.GetRaw(), tmpPath); + ASSERT_EQUALS(b.GetPrintable(), tmpPath); + ASSERT_EQUALS(b.GetPath(), CPath()); + ASSERT_EQUALS(b.GetFullName(), CPath(tmpPath)); + + ASSERT_EQUALS(a, b); + } + + { + CPath a; + CPath b(a); + + ASSERT_EQUALS(a, b); + ASSERT_FALSE(a.IsOk()); + ASSERT_FALSE(b.IsOk()); + } +} + + +TEST(CPath, Operators) +{ + const wxChar* tmpPath1 = wxT("foobar.tgz"); + const wxChar* tmpPath2 = wxT("barfoo.tar"); + + { + CPath a, b; + ASSERT_EQUALS(a, b); + ASSERT_FALSE(a.IsOk()); + ASSERT_FALSE(b.IsOk()); + + a = CPath(tmpPath1); + ASSERT_EQUALS(a.GetRaw(), tmpPath1); + ASSERT_EQUALS(a.GetPrintable(), tmpPath1); + ASSERT_EQUALS(a.GetPath(), CPath()); + ASSERT_EQUALS(a.GetFullName(), CPath(tmpPath1)); + ASSERT_TRUE(a.IsOk()); + ASSERT_TRUE(a != b); + + b = a; + ASSERT_EQUALS(b.GetRaw(), tmpPath1); + ASSERT_EQUALS(b.GetPrintable(), tmpPath1); + ASSERT_EQUALS(b.GetPath(), CPath()); + ASSERT_EQUALS(b.GetFullName(), CPath(tmpPath1)); + ASSERT_TRUE(a.IsOk()); + ASSERT_TRUE(b.IsOk()); + ASSERT_EQUALS(a, b); + + a = CPath(tmpPath2); + ASSERT_TRUE(a.IsOk()); + ASSERT_TRUE(b.IsOk()); + ASSERT_TRUE(a != b); + + ASSERT_EQUALS(a.GetRaw(), tmpPath2); + ASSERT_EQUALS(a.GetPrintable(), tmpPath2); + ASSERT_EQUALS(a.GetPath(), CPath()); + ASSERT_EQUALS(a.GetFullName(), CPath(tmpPath2)); + ASSERT_EQUALS(b.GetRaw(), tmpPath1); + ASSERT_EQUALS(b.GetPrintable(), tmpPath1); + ASSERT_EQUALS(b.GetPath(), CPath()); + ASSERT_EQUALS(b.GetFullName(), CPath(tmpPath1)); + } + +// See note in CPath::operator== +#if 0 + { + CPath a = CPath(wxT("/home/amule")); + CPath b = CPath(wxT("/hone/amule/")); + + ASSERT_EQUALS(a, b); + } +#endif + + // TODO: Less than +} + + +/** Return the path normalized for the current platform. */ +CPath Norm(wxString str) +{ + str.Replace(wxT("/"), wxString(wxFileName::GetPathSeparator())); + + return CPath(str); +} + + +TEST(CPath, JoinPaths) +{ + const CPath expected1 = Norm(wxT("/home/amule/")); + const CPath expected2 = Norm(wxT("/home/amule")); + + // Note: Just a few checks, as ::JoinPaths is tested in StringFunctionTests.cpp + ASSERT_EQUALS(expected1, Norm(wxT("/home")).JoinPaths(Norm(wxT("amule/")))); + ASSERT_EQUALS(expected1, Norm(wxT("/home")).JoinPaths(Norm(wxT("/amule/")))); + ASSERT_EQUALS(expected1, Norm(wxT("/home/")).JoinPaths(Norm(wxT("/amule/")))); + ASSERT_EQUALS(expected1, Norm(wxT("/home/")).JoinPaths(Norm(wxT("amule/")))); + + ASSERT_EQUALS(expected2, Norm(wxT("/home")).JoinPaths(Norm(wxT("amule")))); + ASSERT_EQUALS(expected2, Norm(wxT("/home")).JoinPaths(Norm(wxT("/amule")))); + ASSERT_EQUALS(expected2, Norm(wxT("/home/")).JoinPaths(Norm(wxT("/amule")))); + ASSERT_EQUALS(expected2, Norm(wxT("/home/")).JoinPaths(Norm(wxT("amule")))); + + ASSERT_EQUALS(expected1, expected1.JoinPaths(CPath())); + ASSERT_EQUALS(expected1, CPath().JoinPaths(expected1)); + + ASSERT_EQUALS(expected2, expected2.JoinPaths(CPath())); + ASSERT_EQUALS(expected2, CPath().JoinPaths(expected2)); +} + + +TEST(CPath, StartsWith) +{ + const CPath test = Norm(wxT("/home/amule/")); + + ASSERT_FALSE(test.StartsWith(CPath())); + ASSERT_FALSE(CPath().StartsWith(test)); + + ASSERT_TRUE(test.StartsWith(Norm(wxT("/")))); + ASSERT_TRUE(test.StartsWith(Norm(wxT("/home")))); + ASSERT_TRUE(test.StartsWith(Norm(wxT("/home/")))); + ASSERT_TRUE(test.StartsWith(Norm(wxT("/home/amule")))); + ASSERT_TRUE(test.StartsWith(Norm(wxT("/home/amule/")))); + + ASSERT_FALSE(test.StartsWith(Norm(wxT("")))); + ASSERT_FALSE(test.StartsWith(Norm(wxT("~")))); + ASSERT_FALSE(test.StartsWith(Norm(wxT("/ho")))); + ASSERT_FALSE(test.StartsWith(Norm(wxT("/home/am")))); + ASSERT_FALSE(test.StartsWith(Norm(wxT("/home/amule2")))); + ASSERT_FALSE(test.StartsWith(Norm(wxT("/home/amule/foo")))); +} + + +TEST(CPath, IsSameDir) +{ + ASSERT_TRUE(Norm(wxT("/root")).IsSameDir(Norm(wxT("/root")))); + ASSERT_TRUE(Norm(wxT("/root/")).IsSameDir(Norm(wxT("/root")))); + ASSERT_TRUE(Norm(wxT("/root")).IsSameDir(Norm(wxT("/root/")))); + ASSERT_TRUE(Norm(wxT("/root/")).IsSameDir(Norm(wxT("/root/")))); + + ASSERT_FALSE(CPath().IsSameDir(Norm(wxT("/")))); + ASSERT_FALSE(Norm(wxT("/")).IsSameDir(CPath())); + + ASSERT_FALSE(Norm(wxT("/root")).IsSameDir(Norm(wxT("/home")))); +} + + +TEST(CPath, GetPath_FullName) +{ + { + ASSERT_EQUALS(CPath().GetPath(), CPath()); + ASSERT_EQUALS(CPath().GetFullName(), CPath()); + } + + { + const CPath path = Norm(wxT("/home/mule/")); + + ASSERT_EQUALS(path.GetPath(), Norm(wxT("/home/mule"))); + ASSERT_EQUALS(path.GetFullName(), CPath()); + } + + { + const CPath path = Norm(wxT("/home/mule")); + + ASSERT_EQUALS(path.GetPath(), Norm(wxT("/home"))); + ASSERT_EQUALS(path.GetFullName(), Norm(wxT("mule"))); + } + + { + const CPath path = Norm(wxT("mule")); + + ASSERT_EQUALS(path.GetPath(), CPath()); + ASSERT_EQUALS(path.GetFullName(), Norm(wxT("mule"))); + } + + { + const CPath path = Norm(wxT("mule.ext")); + + ASSERT_EQUALS(path.GetPath(), CPath()); + ASSERT_EQUALS(path.GetFullName(), Norm(wxT("mule.ext"))); + } +} + + +TEST(CPath, Cleanup) +{ + const CPath initial = CPath(wxT(" /a\"b*c* ?e|\\:f ")); + + ASSERT_EQUALS(initial.Cleanup(false, false), Norm(wxT("\%20a\"b*c*\%20?e|\\:f\%20"))); + ASSERT_EQUALS(initial.Cleanup(false, true), Norm(wxT("\%20abc\%20def\%20"))); + ASSERT_EQUALS(initial.Cleanup(true, false), Norm(wxT(" a\"b*c* ?e|\\:f "))); + ASSERT_EQUALS(initial.Cleanup(true, true), Norm(wxT(" abc def "))); +} + + +TEST(CPath, AddPostFix) +{ + ASSERT_EQUALS(Norm(wxT("/foo.bar")).AddPostfix(wxT("_1")), Norm(wxT("/foo_1.bar"))); + ASSERT_EQUALS(Norm(wxT("/foo.bar")).AddPostfix(wxT("")), Norm(wxT("/foo.bar"))); + ASSERT_EQUALS(Norm(wxT("/.bar")).AddPostfix(wxT("_1")), Norm(wxT("/.bar_1"))); + ASSERT_EQUALS(Norm(wxT("/")).AddPostfix(wxT("_1")), Norm(wxT("/_1"))); +} + + +TEST(CPath, Extensions) +{ + const CPath initial = Norm(wxT("/home/amule.foo.bar")); + + ASSERT_EQUALS(Norm(wxT("/home/amule.foo")), initial.RemoveExt()); + ASSERT_EQUALS(Norm(wxT("/home/amule")), initial.RemoveExt().RemoveExt()); + ASSERT_EQUALS(Norm(wxT("/home/amule")), initial.RemoveExt().RemoveExt().RemoveExt()); + ASSERT_EQUALS(Norm(wxT("/home/amule")), initial.RemoveAllExt()); + + ASSERT_EQUALS(wxT("bar"), initial.GetExt()); + ASSERT_EQUALS(wxT("foo"), initial.RemoveExt().GetExt()); + ASSERT_EQUALS(wxEmptyString, initial.RemoveExt().RemoveExt().GetExt()); + ASSERT_EQUALS(wxEmptyString, initial.RemoveAllExt().GetExt()); + + ASSERT_EQUALS(Norm(wxT("/home/amule.foo.bar")), initial.AppendExt(wxT(""))); + ASSERT_EQUALS(Norm(wxT("/home/amule.foo.bar.zod")), initial.AppendExt(wxT("zod"))); + ASSERT_EQUALS(Norm(wxT("/home/amule.foo.bar.zod")), initial.AppendExt(wxT(".zod"))); + ASSERT_EQUALS(Norm(wxT("/home/amule.zod")), initial.RemoveAllExt().AppendExt(wxT("zod"))); + ASSERT_EQUALS(Norm(wxT("/home/amule.zod")), initial.RemoveAllExt().AppendExt(wxT(".zod"))); +} + diff --git a/unittests/tests/RangeMapTest.cpp b/unittests/tests/RangeMapTest.cpp new file mode 100644 index 00000000..bd53e66d --- /dev/null +++ b/unittests/tests/RangeMapTest.cpp @@ -0,0 +1,845 @@ +#include +#include +#include "Types.h" +#include "RangeMap.h" + + +using namespace muleunit; + +typedef CRangeMap TestRangeMap; + + +/** + * Returns the contents of a TestRangeMap iterator as a string-presentation. + */ +wxString StringFrom(const TestRangeMap::const_iterator& it) +{ + return wxString::Format(wxT("(%") wxLongLongFmtSpec wxT("u, %") wxLongLongFmtSpec wxT("u, %i)"), it.keyStart(), it.keyEnd(), *it); +} + +/** + * Returns the contents of a TestRangeMap iterator as a string-presentation. + */ +wxString StringFrom(TestRangeMap::iterator it) +{ + return wxString::Format(wxT("(%") wxLongLongFmtSpec wxT("u, %") wxLongLongFmtSpec wxT("u, %i)"), it.keyStart(), it.keyEnd(), *it); +} + + +/** + * Returns the contents of a CRangeSet iterator as a string-presentation. + */ +wxString StringFrom(const CRangeMap::const_iterator& it) +{ + return wxString::Format(wxT("(%") wxLongLongFmtSpec wxT("u, %") wxLongLongFmtSpec wxT("u)"), it.keyStart(), it.keyEnd()); +} + +/** + * Returns the contents of a CRangeSet iterator as a string-presentation. + */ +wxString StringFrom(CRangeMap::iterator it) +{ + return wxString::Format(wxT("(%") wxLongLongFmtSpec wxT("u, %") wxLongLongFmtSpec wxT("u)"), it.keyStart(), it.keyEnd()); +} + + + +/** + * Returns the contents of a TestRangeMap as a string-representation. + * + * Using this function allows for easy comparison against the expected + * result of a particular test. + */ +template +wxString StringFrom(const CRangeMap& map) +{ + wxString stream; + + typename CRangeMap::const_iterator it = map.begin(); + for (; it != map.end(); ++it) { + if (it != map.begin()) { + stream << wxT(", "); + } + + stream += StringFrom(it); + } + + return wxT("[") + stream + wxT("]"); +} + + + +DECLARE(RangeMap); + TestRangeMap m_map; + TestRangeMap m_mmaps[3]; + + // Identifers for the multirange maps + enum Maps { + CONT = 0, // Continues ranges, IE no gap + SSAME = 1, // Seperated but equal + SDIFF = 2 // Seperated and not equal + }; + + // Sets up a few maps with predefined ranges. + void setUp() { + m_map.insert(100, 150, 0); + + m_mmaps[CONT].insert(100, 150, 0); + m_mmaps[CONT].insert(151, 200, 1); + + m_mmaps[SDIFF].insert(100, 150, 0); + m_mmaps[SDIFF].insert(160, 200, 1); + + m_mmaps[SSAME].insert(100, 150, 1); + m_mmaps[SSAME].insert(160, 200, 1); + + ASSERT_EQUALS(wxT("[(100, 150, 0)]"), StringFrom(m_map)); + ASSERT_EQUALS(wxT("[(100, 150, 0), (151, 200, 1)]"), StringFrom(m_mmaps[CONT])); + ASSERT_EQUALS(wxT("[(100, 150, 0), (160, 200, 1)]"), StringFrom(m_mmaps[SDIFF])); + ASSERT_EQUALS(wxT("[(100, 150, 1), (160, 200, 1)]"), StringFrom(m_mmaps[SSAME])); + } + + void tearDown() { + m_map.clear(); + m_mmaps[0].clear(); + m_mmaps[1].clear(); + m_mmaps[2].clear(); + } + + + /** + * Tests insertion into a map with a single range, checking against an + * expected result. + */ + void singleInsert(uint32 start, uint32 end, int value, const wxString& result) + { + TestRangeMap::iterator it = m_map.insert(start, end, value); + + // Test that the correct iterator was returned + ASSERT_TRUE(it.keyStart() <= start); + ASSERT_TRUE(it.keyEnd() >= end); + ASSERT_EQUALS(*it, value); + + // Check the resulting map + ASSERT_EQUALS(result, StringFrom(m_map)); + ASSERT_EQUALS((uint32)std::count(result.begin(), result.end(), '('), m_map.size()); + + // Reset the rangemap + tearDown(); + setUp(); + } + + void doErase(uint32 start, uint32 end, const wxString& result) + { + m_map.erase_range(start, end); + + // Check the resulting map + ASSERT_EQUALS(result, StringFrom(m_map)); + ASSERT_EQUALS((uint32)std::count(result.begin(), result.end(), '('), m_map.size()); + + // Reset the rangemap + tearDown(); + setUp(); + } + + /** + * Tests insertion into a map with multiple ranges, checking against an + * expected result. + */ + void multiInsert(int type, uint32 start, uint32 end, int value, const wxString& result) + { + TestRangeMap::iterator it = m_mmaps[type].insert(start, end, value); + + // Test that the correct iterator was returned + ASSERT_TRUE(it.keyStart() <= start); + ASSERT_TRUE(it.keyEnd() >= end); + ASSERT_EQUALS(*it, value); + + // Check the resulting map + ASSERT_EQUALS(result, StringFrom(m_mmaps[type])); + ASSERT_EQUALS((uint32)std::count(result.begin(), result.end(), '('), m_mmaps[type].size()); + + tearDown(); + setUp(); + } +END_DECLARE; + + + +TEST(RangeMap, DefaultConstructor) +{ + TestRangeMap map; + + ASSERT_EQUALS(0u, map.size()); + ASSERT_TRUE(map.empty()); +} + + +TEST(RangeMap, CopyConstructor) +{ + // Check basic copying + TestRangeMap mapA(m_map); + TestRangeMap mapB(m_mmaps[CONT]); + TestRangeMap mapC(m_mmaps[SSAME]); + TestRangeMap mapD(m_mmaps[SDIFF]); + + ASSERT_EQUALS(m_map, mapA); + ASSERT_EQUALS(m_mmaps[CONT], mapB); + ASSERT_EQUALS(m_mmaps[SSAME], mapC); + ASSERT_EQUALS(m_mmaps[SDIFF], mapD); + + + // The copies must not affect the originals + mapA.insert(125, 175, 2); + mapB.insert(125, 175, 2); + mapC.insert(125, 175, 2); + mapD.insert(125, 175, 2); + + ASSERT_FALSE(m_map == mapA); + ASSERT_FALSE(m_mmaps[CONT] == mapB); + ASSERT_FALSE(m_mmaps[SSAME] == mapC); + ASSERT_FALSE(m_mmaps[SDIFF] == mapD); +} + + +TEST(RangeMap, AssignmentOperator) +{ + // Check basic assignment + TestRangeMap mapA, mapB; + mapA = mapB = m_map; + + ASSERT_EQUALS(m_map, mapA); + ASSERT_EQUALS(m_map, mapB); + + + // The copies must not affect the originals + mapA.insert(125, 175, 2); + mapB.insert(125, 175, 2); + + ASSERT_TRUE(mapA == mapB); + ASSERT_FALSE(m_map == mapA); + ASSERT_FALSE(m_map == mapB); +} + + +TEST(RangeMap, Equality) +{ + TestRangeMap mapA(m_mmaps[SSAME]), mapB(m_mmaps[SDIFF]); + + ASSERT_FALSE(mapA == mapB); + + mapA = mapB; + + ASSERT_EQUALS(mapA, mapB); + + mapA.insert(10, 20, 3); + + ASSERT_FALSE(mapA == mapB); +} + + +TEST(RangeMap, Iterators) +{ + // Adding a third range + m_mmaps[CONT].insert(125, 175, 2); + TestRangeMap map(m_mmaps[CONT]); + + TestRangeMap::iterator it = map.begin(); + TestRangeMap::iterator it_orig = map.begin(); + TestRangeMap::iterator it_other = map.end(); + + ASSERT_EQUALS(wxT("(100, 124, 0)"), StringFrom(it)); + + it_other = ++it; + + ASSERT_EQUALS(wxT("(125, 175, 2)"), StringFrom(it)); + ASSERT_EQUALS(it_other, it++); + ASSERT_EQUALS(wxT("(176, 200, 1)"), StringFrom(it)); + + it_other = --it; + + ASSERT_EQUALS(wxT("(125, 175, 2)"), StringFrom(it)); + ASSERT_EQUALS(it_other, it--); + ASSERT_EQUALS(wxT("(100, 124, 0)"), StringFrom(it)); +} + + +TEST(RangeMap, Erase) +{ + // Adding a third range + m_mmaps[CONT].insert(125, 175, 2); + + // The expected results from forwards deletion + TestRangeMap map(m_mmaps[CONT]); + wxString expectedFW[4]; + expectedFW[0] = wxT("[(100, 124, 0), (125, 175, 2), (176, 200, 1)]"); + expectedFW[1] = wxT("[(125, 175, 2), (176, 200, 1)]"); + expectedFW[2] = wxT("[(176, 200, 1)]"); + expectedFW[3] = wxT("[]"); + + for (int i = 0; i < 4; ++i) { + ASSERT_EQUALS(expectedFW[i], StringFrom(map)); + + if (map.begin() != map.end()) { + map.erase(map.begin()); + } + } + + // Test the expected result from backwards deletion + map = m_mmaps[CONT]; + wxString expectedBW[4]; + expectedBW[0] = wxT("[(100, 124, 0), (125, 175, 2), (176, 200, 1)]"); + expectedBW[1] = wxT("[(100, 124, 0), (125, 175, 2)]"); + expectedBW[2] = wxT("[(100, 124, 0)]"); + expectedBW[3] = wxT("[]"); + + for (int i = 0; i < 4; ++i) { + ASSERT_EQUALS(expectedBW[i], StringFrom(map)); + + if (map.begin() != map.end()) { + map.erase(--map.end()); + } + } +} + + +TEST(RangeMap, Clear) +{ + m_map.clear(); + ASSERT_TRUE(m_map.empty()); + ASSERT_EQUALS(0u, m_map.size()); + ASSERT_EQUALS(wxT("[]"), StringFrom(m_map)); + + for (int i = 0; i < 3; ++i) { + m_mmaps[i].clear(); + ASSERT_TRUE(m_mmaps[i].empty()); + ASSERT_EQUALS(0u, m_mmaps[i].size()); + ASSERT_EQUALS(wxT("[]"), StringFrom(m_mmaps[i])); + } +} + + +TEST(RangeMap, FindRange) +{ + // Adding a third range + m_mmaps[CONT].insert(125, 175, 2); + TestRangeMap map(m_mmaps[CONT]); + + ASSERT_EQUALS(map.end(), map.find_range(0)); + ASSERT_EQUALS(map.end(), map.find_range(98)); + ASSERT_EQUALS(map.end(), map.find_range(99)); + + ASSERT_EQUALS(wxT("(100, 124, 0)"), StringFrom(map.find_range(100))); + ASSERT_EQUALS(wxT("(100, 124, 0)"), StringFrom(map.find_range(112))); + ASSERT_EQUALS(wxT("(100, 124, 0)"), StringFrom(map.find_range(124))); + + ASSERT_EQUALS(wxT("(125, 175, 2)"), StringFrom(map.find_range(125))); + ASSERT_EQUALS(wxT("(125, 175, 2)"), StringFrom(map.find_range(150))); + ASSERT_EQUALS(wxT("(125, 175, 2)"), StringFrom(map.find_range(175))); + + ASSERT_EQUALS(wxT("(176, 200, 1)"), StringFrom(map.find_range(176))); + ASSERT_EQUALS(wxT("(176, 200, 1)"), StringFrom(map.find_range(186))); + ASSERT_EQUALS(wxT("(176, 200, 1)"), StringFrom(map.find_range(200))); + + ASSERT_EQUALS(map.end(), map.find_range(201)); + ASSERT_EQUALS(map.end(), map.find_range(202)); + ASSERT_EQUALS(map.end(), map.find_range(250)); +} + + +TEST(RangeMap, InvalidErase) +{ + ASSERT_RAISES(CInvalidParamsEx, m_map.erase(m_map.end())); +} + + +TEST(RangeMap, InvalidInsert) +{ + ASSERT_RAISES(CInvalidParamsEx, m_map.insert(10, 9, 8)); +} + + +///////////////////////////////////////////////// +// The following tests exercize the merging algorithm. +// The comment before each comment descrices the RangeMaps used to test, +// and which types of ranges are tested. For example, the description +// "a / b <-> c / d" is to be read as: +// Insert range starting at a or b, ending at c or d. + + +// Single insert before start <-> before start. +TEST(RangeMap, SingleInsert_BeforeStart_BeforeStart) +{ + // Test with same and different type + singleInsert(0, 90, 0, wxT("[(0, 90, 0), (100, 150, 0)]")); + singleInsert(0, 90, 1, wxT("[(0, 90, 1), (100, 150, 0)]")); +} + + +// Single insert before start <-> touching start. +TEST(RangeMap, SingleInsert_BeforeStart_TouchingStart) +{ + singleInsert(0, 99, 0, wxT("[(0, 150, 0)]")); // Same type + singleInsert(0, 99, 1, wxT("[(0, 99, 1), (100, 150, 0)]")); // Different type +} + + +// Single insert before start <-> at start / inside. +TEST(RangeMap, SingleInsert_BeforeStart_AtStart_InSide) +{ + for (int offset = 0; offset < 3; ++offset) { // at start, inside, inside + singleInsert(0, 100 + offset, 0, wxT("[(0, 150, 0)]")); // Same type + + wxString expected = wxString::Format(wxT("[(0, %u, 1), (%u, 150, 0)]"), 100 + offset, 101 + offset); + singleInsert(0, 100 + offset, 1, expected); // Different type + } +} + + +// Single insert before start / touching start <-> at end / touching end / after end. +TEST(RangeMap, SingleInsert_BeforeStart_TouchingStart_AtEnd_TouchingEnd_AfterEnd) +{ + // Test with same and different type + for (int type = 0; type < 2; ++type) { + // (at end, touching end, after end) + for (int end_offset = 0; end_offset < 3; ++end_offset) { + // (before start, touching start) + for (int start_offset = 0; start_offset < 2; ++start_offset) { + wxString expected = wxString::Format(wxT("[(%u, %u, %i)]"), 98 + start_offset, 150 + end_offset, type); + singleInsert(98 + start_offset, 150 + end_offset, type, expected); + } + } + } +} + + +// Single insert touching start <-> touching start. +TEST(RangeMap, SingleInsert_TouchingStart_TouchingStart) +{ + singleInsert(99, 99, 0, wxT("[(99, 150, 0)]")); // Same + singleInsert(99, 99, 1, wxT("[(99, 99, 1), (100, 150, 0)]")); // Different +} + + +// Single insert touching start / at start <-> at start / inside. +TEST(RangeMap, SingleInsert_TouchingStart_AtStart_AtStart_Inside) +{ + for (int offset_a = 0; offset_a < 2; ++offset_a) { // (touching start, at start) + for (int offset_b = 0; offset_b < 2; ++offset_b) { // (at start, inside) + int start = 99 + offset_a; + int end = 100 + offset_b; + + // Same + singleInsert(start, end, 0, wxString::Format(wxT("[(%u, 150, 0)]"), 99 + offset_a)); + + // Different + wxString exp = wxString::Format(wxT("[(%u, %u, 1), (%u, 150, 0)]"), start, end, 101 + offset_b); + singleInsert(start, end, 1, exp); + } + } +} + + +// Single insert at start <-> at end / touching end / after end. +TEST(RangeMap, SingleInsert_AtStart_AtEnd_TouchingEnd_AfterEnd) +{ + // (at end, touching end, after end) + for (int offset = 0; offset < 3; ++offset) { + // Same + singleInsert(100, 150 + offset, 0, wxString::Format(wxT("[(100, %u, 0)]"), 150 + offset)); + // Different + singleInsert(100, 150 + offset, 1, wxString::Format(wxT("[(100, %u, 1)]"), 150 + offset)); + } +} + + +// Single insert inside / at end <-> at end / touching end / after end. +TEST(RangeMap, SingleInsert_Inside_AtEnd_AtEnd_TouchingEnd_AfterEnd) +{ + // (inside, at end) + for (int offset_a = 0; offset_a < 2; ++offset_a) { + // (at end, touching end, after end) + for (int offset_b = 0; offset_b < 3; ++offset_b) { + int start = 149 + offset_a; + int end = 150 + offset_b; + + // Same + singleInsert(start, end, 0, wxString::Format(wxT("[(100, %u, 0)]"), end)); + + // Different + singleInsert(start, end, 1, wxString::Format(wxT("[(100, %u, 0), (%u, %u, 1)]"), 148 + offset_a, start, end)); + } + } +} + + +// Single insert touching end <-> touching end / after end. +TEST(RangeMap, SingleInsert_TouchingEnd_TouchingEnd_AfterEnd) +{ + // (touching end, after end) + for (int offset = 0; offset < 2; ++offset) { + int end = 151 + offset; + + // Same + singleInsert(151, end, 0, wxString::Format(wxT("[(100, %u, 0)]"), end)); + + // Different + singleInsert(151, end, 1, wxString::Format(wxT("[(100, 150, 0), (151, %u, 1)]"), end)); + } +} + + +// Single insert after end <-> after end. +TEST(RangeMap, SingleInsert_AfterEnd_AfterEnd) +{ + singleInsert(152, 170, 0, wxT("[(100, 150, 0), (152, 170, 0)]")); // Same + singleInsert(152, 170, 1, wxT("[(100, 150, 0), (152, 170, 1)]")); // Different +} + + +// Multi insert before start <-> before start. +TEST(RangeMap, MultiInsert_BeforeStart_BeforeStart) +{ + for (int type = 0; type < 2; ++type) { // Test with same and different type + multiInsert(CONT, 0, 90, type, wxString(wxT("[(0, 90, ")) << type << wxT("), (100, 150, 0), (151, 200, 1)]")); + multiInsert(SDIFF, 0, 90, type, wxString(wxT("[(0, 90, ")) << type << wxT("), (100, 150, 0), (160, 200, 1)]")); + multiInsert(SSAME, 0, 90, type, wxString(wxT("[(0, 90, ")) << type << wxT("), (100, 150, 1), (160, 200, 1)]")); + } +} + + +// Multi insert before start <-> touching start. +TEST(RangeMap, MultiInsert_BeforeStart_TouchingStart) +{ + multiInsert(CONT, 0, 99, 0, wxT("[(0, 150, 0), (151, 200, 1)]")); + multiInsert(SDIFF, 0, 99, 0, wxT("[(0, 150, 0), (160, 200, 1)]")); + multiInsert(SSAME, 0, 99, 0, wxT("[(0, 99, 0), (100, 150, 1), (160, 200, 1)]")); + + multiInsert(CONT, 0, 99, 1, wxT("[(0, 99, 1), (100, 150, 0), (151, 200, 1)]")); + multiInsert(SDIFF, 0, 99, 1, wxT("[(0, 99, 1), (100, 150, 0), (160, 200, 1)]")); + multiInsert(SSAME, 0, 99, 1, wxT("[(0, 150, 1), (160, 200, 1)]")); +} + + +// Multi insert before start <-> at start / inside. +TEST(RangeMap, MultiInsert_BeforeStart_AtStart_InSide) +{ + for (int offset = 0; offset < 3; ++offset) { // (at start, inside, inside) + int end = 100 + offset; + + multiInsert(CONT, 0, end, 0, wxT("[(0, 150, 0), (151, 200, 1)]")); + multiInsert(SDIFF, 0, end, 0, wxT("[(0, 150, 0), (160, 200, 1)]")); + multiInsert(SSAME, 0, end, 0, wxString::Format(wxT("[(0, %u, 0), (%u, 150, 1), (160, 200, 1)]"), end, 101 + offset)); + + multiInsert(CONT, 0, end, 1, wxString::Format(wxT("[(0, %u, 1), (%u, 150, 0), (151, 200, 1)]"), end, 101 + offset)); + multiInsert(SDIFF, 0, end, 1, wxString::Format(wxT("[(0, %u, 1), (%u, 150, 0), (160, 200, 1)]"), end, 101 + offset)); + multiInsert(SSAME, 0, end, 1, wxT("[(0, 150, 1), (160, 200, 1)]")); + } +} + + +// Multi insert before start / touching start <-> at end / touching end / after end. +TEST(RangeMap, MultiInsert_BeforeStart_TouchingStart_AtEnd_TouchingEnd_AfterEnd) +{ + for (int end_offset = 0; end_offset < 3; ++end_offset) { // (at end, touching end, after end) + for (int start_offset = 0; start_offset < 2; ++start_offset) { // (before start, touching start) + int start = 98 + start_offset; + int end = 150 + end_offset; + + multiInsert(CONT, start, end, 0, wxString::Format(wxT("[(%u, %u, 0), (%u, 200, 1)]"), start, end, end + 1)); + multiInsert(SDIFF, start, end, 0, wxString::Format(wxT("[(%u, %u, 0), (160, 200, 1)]"), start, end)); + multiInsert(SSAME, start, end, 0, wxString::Format(wxT("[(%u, %u, 0), (160, 200, 1)]"), start, end)); + + multiInsert(CONT, start, end, 1, wxString::Format(wxT("[(%u, 200, 1)]"), start)); + multiInsert(SDIFF, start, end, 1, wxString::Format(wxT("[(%u, %u, 1), (160, 200, 1)]"), start, end)); + multiInsert(SSAME, start, end, 1, wxString::Format(wxT("[(%u, %u, 1), (160, 200, 1)]"), start, end)); + } + } +} + + +// Multi insert touching start <-> touching start. +TEST(RangeMap, MultiInsert_TouchingStart_TouchingStart) +{ + multiInsert(CONT, 99, 99, 0, wxT("[(99, 150, 0), (151, 200, 1)]")); + multiInsert(SDIFF, 99, 99, 0, wxT("[(99, 150, 0), (160, 200, 1)]")); + multiInsert(SSAME, 99, 99, 0, wxT("[(99, 99, 0), (100, 150, 1), (160, 200, 1)]")); + + multiInsert(CONT, 99, 99, 1, wxT("[(99, 99, 1), (100, 150, 0), (151, 200, 1)]")); + multiInsert(SDIFF, 99, 99, 1, wxT("[(99, 99, 1), (100, 150, 0), (160, 200, 1)]")); + multiInsert(SSAME, 99, 99, 1, wxT("[(99, 150, 1), (160, 200, 1)]")); +} + + +// Multi insert touching start / at start <-> at start / inside. +TEST(RangeMap, MultiInsert_TouchingStart_AtStart_AtStart_Inside) +{ + for (int offset_a = 0; offset_a < 2; ++offset_a) { // (touching start, at start) + for (int offset_b = 0; offset_b < 2; ++offset_b) { // (at start, inside) + int start = 99 + offset_a; + int end = 100 + offset_b; + + multiInsert(CONT, start, end, 0, wxString::Format(wxT("[(%u, 150, 0), (151, 200, 1)]"), start)); + multiInsert(SDIFF, start, end, 0, wxString::Format(wxT("[(%u, 150, 0), (160, 200, 1)]"), start)); + multiInsert(SSAME, start, end, 0, wxString::Format(wxT("[(%u, %u, 0), (%u, 150, 1), (160, 200, 1)]"), start, end, end + 1)); + + multiInsert(CONT, start, end, 1, wxString::Format(wxT("[(%u, %u, 1), (%u, 150, 0), (151, 200, 1)]"), start, end, end + 1)); + multiInsert(SDIFF, start, end, 1, wxString::Format(wxT("[(%u, %u, 1), (%u, 150, 0), (160, 200, 1)]"), start, end, end + 1)); + multiInsert(SSAME, start, end, 1, wxString::Format(wxT("[(%u, 150, 1), (160, 200, 1)]"), start)); + } + } +} + + +// rangeMap: Multi insert at start <-> at end / touching end / after end. +TEST(RangeMap, MultiInsert_AtStart_AtEnd_TouchingEnd_AfterEnd) +{ + for (int offset = 0; offset < 3; ++offset) { // (at end, touching end, after end) + int start = 100; + int end = 150 + offset; + + multiInsert(CONT, start, end, 0, wxString::Format(wxT("[(%u, %u, 0), (%u, 200, 1)]"), start, end, end + 1)); + multiInsert(SDIFF, start, end, 0, wxString::Format(wxT("[(%u, %u, 0), (160, 200, 1)]"), start, end)); + multiInsert(SSAME, start, end, 0, wxString::Format(wxT("[(%u, %u, 0), (160, 200, 1)]"), start, end)); + + multiInsert(CONT, start, end, 1, wxString::Format(wxT("[(%u, 200, 1)]"), start)); + multiInsert(SDIFF, start, end, 1, wxString::Format(wxT("[(%u, %u, 1), (160, 200, 1)]"), start, end)); + multiInsert(SSAME, start, end, 1, wxString::Format(wxT("[(%u, %u, 1), (160, 200, 1)]"), start, end)); + } +} + + +// Multi insert inside <-> inside. +TEST(RangeMap, MultiInsert_Inside_Inside) +{ + multiInsert(CONT, 110, 140, 0, wxT("[(100, 150, 0), (151, 200, 1)]")); + multiInsert(SDIFF, 110, 140, 0, wxT("[(100, 150, 0), (160, 200, 1)]")); + multiInsert(SSAME, 110, 140, 0, wxT("[(100, 109, 1), (110, 140, 0), (141, 150, 1), (160, 200, 1)]")); + + multiInsert(CONT, 110, 140, 1, wxT("[(100, 109, 0), (110, 140, 1), (141, 150, 0), (151, 200, 1)]")); + multiInsert(SDIFF, 110, 140, 1, wxT("[(100, 109, 0), (110, 140, 1), (141, 150, 0), (160, 200, 1)]")); + multiInsert(SSAME, 110, 140, 1, wxT("[(100, 150, 1), (160, 200, 1)]")); +} + + +// Multi insert inside / at end <-> at end / touching end / after end. +TEST(RangeMap, MultiInsert_Inside_AtEnd_AtEnd_TouchingEnd_AfterEnd) +{ + for (int offset_a = 0; offset_a < 2; ++offset_a) { // (inside, at end) + for (int offset_b = 0; offset_b < 3; ++offset_b) { // (at end, touching end, after end) + int start = 149 + offset_a; + int end = 150 + offset_b; + + multiInsert(CONT, start, end, 0, wxString::Format(wxT("[(100, %u, 0), (%u, 200, 1)]"), end, end + 1)); + multiInsert(SDIFF, start, end, 0, wxString::Format(wxT("[(100, %u, 0), (160, 200, 1)]"), end)); + multiInsert(SSAME, start, end, 0, wxString::Format(wxT("[(100, %u, 1), (%u, %u, 0), (160, 200, 1)]"), start - 1, start, end)); + + multiInsert(CONT, start, end, 1, wxString::Format(wxT("[(100, %u, 0), (%u, 200, 1)]"), start - 1, start)); + multiInsert(SDIFF, start, end, 1, wxString::Format(wxT("[(100, %u, 0), (%u, %u, 1), (160, 200, 1)]"), start - 1, start, end)); + multiInsert(SSAME, start, end, 1, wxString::Format(wxT("[(100, %u, 1), (160, 200, 1)]"), end)); + } + } +} + + +// Multi insert touching end <-> touching end / after end. +TEST(RangeMap, MultiInsert_TouchingEnd_TouchingEnd_AfterEnd) +{ + for (int offset = 0; offset < 2; ++offset) { // (touching end, after end) + int start = 151; + int end = 151 + offset; + + multiInsert(CONT, start, end, 0, wxString::Format(wxT("[(100, %u, 0), (%u, 200, 1)]"), end, end + 1)); + multiInsert(SDIFF, start, end, 0, wxString::Format(wxT("[(100, %u, 0), (160, 200, 1)]"), end)); + multiInsert(SSAME, start, end, 0, wxString::Format(wxT("[(100, 150, 1), (%u, %u, 0), (160, 200, 1)]"), start, end)); + + multiInsert(CONT, start, end, 1, wxString::Format(wxT("[(100, 150, 0), (%u, 200, 1)]"), start)); + multiInsert(SDIFF, start, end, 1, wxString::Format(wxT("[(100, 150, 0), (%u, %u, 1), (160, 200, 1)]"), start, end)); + multiInsert(SSAME, start, end, 1, wxString::Format(wxT("[(100, %u, 1), (160, 200, 1)]"), end)); + } +} + + +// Multi insert after end <-> after end. +TEST(RangeMap, MultiInsert_AfterEnd_AfterEnd) +{ + multiInsert(CONT, 152, 170, 0, wxT("[(100, 150, 0), (151, 151, 1), (152, 170, 0), (171, 200, 1)]")); + multiInsert(SDIFF, 152, 170, 0, wxT("[(100, 150, 0), (152, 170, 0), (171, 200, 1)]")); + multiInsert(SSAME, 152, 170, 0, wxT("[(100, 150, 1), (152, 170, 0), (171, 200, 1)]")); + + multiInsert(CONT, 152, 170, 1, wxT("[(100, 150, 0), (151, 200, 1)]")); + multiInsert(SDIFF, 152, 170, 1, wxT("[(100, 150, 0), (152, 200, 1)]")); + multiInsert(SSAME, 152, 170, 1, wxT("[(100, 150, 1), (152, 200, 1)]")); +} + + +///////////////////////////////////////////////// +// The following tests exercize the erase function. +// Since the erase function use the insert function, all +// that is needed is to test that no merging is done. + +// Single erase before start <-> before start. +TEST(RangeMap, Erase_BeforeStart_BeforeStart) +{ + // Test with same and different type + doErase(0, 90, wxT("[(100, 150, 0)]")); +} + + +// Single erase before start <-> touching start. +TEST(RangeMap, Erase_BeforeStart_TouchingStart) +{ + doErase(0, 99, wxT("[(100, 150, 0)]")); +} + + +// Single erase before start <-> at start / inside. +TEST(RangeMap, Erase_BeforeStart_AtStart_InSide) +{ + for (int offset = 0; offset < 3; ++offset) { // at start, inside, inside + doErase(0, 100 + offset, wxString::Format(wxT("[(%u, 150, 0)]"), 100 + offset + 1)); + } +} + + +// Single erase before start / touching start <-> at end / touching end / after end. +TEST(RangeMap, Erase_BeforeStart_TouchingStart_AtEnd_TouchingEnd_AfterEnd) +{ + // (at end, touching end, after end) + for (int end_offset = 0; end_offset < 3; ++end_offset) { + // (before start, touching start) + for (int start_offset = 0; start_offset < 2; ++start_offset) { + doErase(98 + start_offset, 150 + end_offset, wxT("[]")); + } + } +} + + +// Single erase touching start <-> touching start. +TEST(RangeMap, Erase_TouchingStart_TouchingStart) +{ + doErase(99, 99, wxT("[(100, 150, 0)]")); +} + + +// Single erase touching start / at start <-> at start / inside. +TEST(RangeMap, Erase_TouchingStart_AtStart_AtStart_Inside) +{ + for (int offset_a = 0; offset_a < 2; ++offset_a) { // (touching start, at start) + for (int offset_b = 0; offset_b < 2; ++offset_b) { // (at start, inside) + int start = 99 + offset_a; + int end = 100 + offset_b; + + doErase(start, end, wxString::Format(wxT("[(%u, 150, 0)]"), 100 + offset_b + 1)); + } + } +} + + +// Single erase at start <-> at end / touching end / after end. +TEST(RangeMap, Erase_AtStart_AtEnd_TouchingEnd_AfterEnd) +{ + // (at end, touching end, after end) + for (int offset = 0; offset < 3; ++offset) { + doErase(100, 150 + offset, wxT("[]")); + } +} + + +// Single erase inside / at end <-> at end / touching end / after end. +TEST(RangeMap, Erase_Inside_AtEnd_AtEnd_TouchingEnd_AfterEnd) +{ + // (inside, at end) + for (int offset_a = 0; offset_a < 2; ++offset_a) { + // (at end, touching end, after end) + for (int offset_b = 0; offset_b < 3; ++offset_b) { + int start = 149 + offset_a; + int end = 150 + offset_b; + + doErase(start, end, wxString::Format(wxT("[(100, %u, 0)]"), start - 1)); + } + } +} + + +// Single erase touching end <-> touching end / after end. +TEST(RangeMap, Erase_TouchingEnd_TouchingEnd_AfterEnd) +{ + // (touching end, after end) + for (int offset = 0; offset < 2; ++offset) { + int end = 151 + offset; + + doErase(151, end, wxT("[(100, 150, 0)]")); + } +} + + +// Single erase after end <-> after end. +TEST(RangeMap, Erase_AfterEnd_AfterEnd) +{ + doErase(152, 170, wxT("[(100, 150, 0)]")); +} + + +TEST(RangeMap, Swap) +{ + { + TestRangeMap mapA = m_mmaps[CONT]; + TestRangeMap mapB = m_mmaps[SSAME]; + + ASSERT_EQUALS(mapA, m_mmaps[CONT]); + ASSERT_EQUALS(mapB, m_mmaps[SSAME]); + + std::swap(mapA, mapB); + + ASSERT_EQUALS(mapB, m_mmaps[CONT]); + ASSERT_EQUALS(mapA, m_mmaps[SSAME]); + } + + { + TestRangeMap mapA = m_mmaps[CONT]; + TestRangeMap mapB = m_mmaps[SSAME]; + + ASSERT_EQUALS(mapA, m_mmaps[CONT]); + ASSERT_EQUALS(mapB, m_mmaps[SSAME]); + + mapA.swap(mapB); + + ASSERT_EQUALS(mapB, m_mmaps[CONT]); + ASSERT_EQUALS(mapA, m_mmaps[SSAME]); + } +} + + +///////////////////////////////////////////////// +// The following test exercize the CRangeSet specialization. +// + +TEST(RangeMap, RangeSet) +{ + CRangeSet set; + + set.insert(0, 10); + set.insert(20, 30); + set.insert(40, 50); + + ASSERT_EQUALS(wxT("[(0, 10), (20, 30), (40, 50)]"), StringFrom(set)); + ASSERT_EQUALS(3u, set.size()); + + { + CRangeSet::iterator it = set.begin(); + unsigned value = 0; + for (; it != set.end(); ++it, value += 20) { + ASSERT_EQUALS(value, it.keyStart()); + ASSERT_EQUALS(value + 10, it.keyEnd()); + } + + ASSERT_EQUALS(60u, value); + } + + set.erase_range(5, 45); + + ASSERT_EQUALS(wxT("[(0, 4), (46, 50)]"), StringFrom(set)); + ASSERT_EQUALS(2u, set.size()); +} + diff --git a/unittests/tests/StringFunctionsTest.cpp b/unittests/tests/StringFunctionsTest.cpp new file mode 100644 index 00000000..b6bbb75b --- /dev/null +++ b/unittests/tests/StringFunctionsTest.cpp @@ -0,0 +1,193 @@ +#include +#include + +#include + +using namespace muleunit; + +DECLARE_SIMPLE(StringFunctions) + + +/////////////////////////////////////////////////////////// +// Tests for the JoinPaths function + +TEST(StringFunctions, JoinPaths) +{ + const wxString seps = wxFileName::GetPathSeparators(); + const wxString sep = wxFileName::GetPathSeparator(); + + for (size_t i = 0; i < seps.Length(); ++i) { + const wxString cur_sep = seps.Mid(i, 1); + + ASSERT_EQUALS(wxT("a") + sep + wxT("b"), JoinPaths(wxT("a"), wxT("b"))); + ASSERT_EQUALS(wxT("a") + sep + wxT("b"), JoinPaths(wxT("a") + cur_sep, wxT("b"))); + ASSERT_EQUALS(wxT("a") + sep + wxT("b"), JoinPaths(wxT("a"), cur_sep + wxT("b"))); + ASSERT_EQUALS(wxT("a") + sep + wxT("b"), JoinPaths(wxT("a") + cur_sep, cur_sep + wxT("b"))); + ASSERT_EQUALS(wxT("a"), JoinPaths(wxT("a"), wxEmptyString)); + ASSERT_EQUALS(wxT("b"), JoinPaths(wxEmptyString, wxT("b"))); + ASSERT_EQUALS(wxEmptyString, JoinPaths(wxEmptyString, wxEmptyString)); + } +} + + +/////////////////////////////////////////////////////////// +// Tests for the FuzzyStrCmp function + +//! Returns the number of items in an array. +#define itemsof(x) (sizeof(x)/sizeof(x[0])) + +TEST(StringFunctions, FuzzyStrCmp) +{ + struct FuzzyTest { + const wxChar* a; + const wxChar* b; + int expected; + }; + + FuzzyTest checks[] = { + { wxT("a (10)"), wxT("a (2)"), 1}, + { wxT("a (10)"), wxT("b (2)"), -1}, + { wxT("c3 (7)"), wxT("c3 (12)"), -1}, + { wxT("c3 (12)"), wxT("c3 (7)"), 1}, + { wxT("c3 12d"), wxT("c3 12d"), 0}, + { wxT("a (10) "), wxT("a (2) "), 1}, + { wxT("a (10) "), wxT("b (2) "), -1}, + { wxT(" c3 (7)"), wxT(" c3 (12)"), -1}, + { wxT(" c3 (12)"), wxT(" c3 (7)"), 1}, + { wxT("c3 12d"), wxT("c3 12d"), 0}, + { wxT(""), wxT(""), 0}, + { wxT(""), wxT("c3 12d"), -1}, + { wxT("c3 12d"), wxT(""), 1}, + { wxT(" "), wxT("c3 12d"), -1}, + { wxT("c3 12d"), wxT(" "), 1}, + { wxT("17.10"), wxT("17.2"), 1}, + { wxT(" c3 (a)"), wxT(" c3 (12)"), 1}, + { wxT(" c3 (12)"), wxT(" c3 (a)"), -1}, + }; + + for (size_t i = 0; i < itemsof(checks); ++i) { + wxString a = checks[i].a; + wxString b = checks[i].b; + + ASSERT_EQUALS(checks[i].expected, FuzzyStrCmp(a, b)); + } +} + + +/////////////////////////////////////////////////////////// +// Tests for the CSimpleParser class + +DECLARE_SIMPLE(SimpleParser) + + +TEST(SimpleParser, Constructor) +{ + // Empty strings are acceptable and should just return an empty string + { + CSimpleTokenizer tkz1(wxEmptyString, wxT('-')); + ASSERT_EQUALS(wxT(""), tkz1.remaining()); + ASSERT_EQUALS(wxEmptyString, tkz1.next()); + ASSERT_EQUALS(wxT(""), tkz1.remaining()); + ASSERT_EQUALS(wxEmptyString, tkz1.next()); + } + + // String with no tokens should be return immediatly + { + CSimpleTokenizer tkz2(wxT(" abc "), wxT('-')); + ASSERT_EQUALS(wxT(" abc "), tkz2.remaining()); + ASSERT_EQUALS(wxT(" abc "), tkz2.next()); + ASSERT_EQUALS(wxEmptyString, tkz2.next()); + ASSERT_EQUALS(wxEmptyString, tkz2.next()); + } +} + + +TEST(SimpleParser, EmptyTokens) +{ + { + CSimpleTokenizer tkz1(wxT(" a"), wxT(' ')); + ASSERT_EQUALS(wxT(" a"), tkz1.remaining()); + ASSERT_EQUALS(0u, tkz1.tokenCount()); + + ASSERT_EQUALS(wxEmptyString, tkz1.next()); + ASSERT_EQUALS(wxT("a"), tkz1.remaining()); + ASSERT_EQUALS(1u, tkz1.tokenCount()); + + ASSERT_EQUALS(wxT("a"), tkz1.next()); + ASSERT_EQUALS(wxT(""), tkz1.remaining()); + ASSERT_EQUALS(1u, tkz1.tokenCount()); + + ASSERT_EQUALS(wxEmptyString, tkz1.next()); + ASSERT_EQUALS(wxT(""), tkz1.remaining()); + ASSERT_EQUALS(1u, tkz1.tokenCount()); + } + + { + CSimpleTokenizer tkz2(wxT("c "), wxT(' ')); + ASSERT_EQUALS(wxT("c "), tkz2.remaining()); + ASSERT_EQUALS(0u, tkz2.tokenCount()); + + ASSERT_EQUALS(wxT("c"), tkz2.next()); + ASSERT_EQUALS(wxT(""), tkz2.remaining()); + ASSERT_EQUALS(1u, tkz2.tokenCount()); + + ASSERT_EQUALS(wxEmptyString, tkz2.next()); + ASSERT_EQUALS(wxT(""), tkz2.remaining()); + ASSERT_EQUALS(1u, tkz2.tokenCount()); + + ASSERT_EQUALS(wxEmptyString, tkz2.next()); + ASSERT_EQUALS(wxT(""), tkz2.remaining()); + ASSERT_EQUALS(1u, tkz2.tokenCount()); + } + + { + CSimpleTokenizer tkz3(wxT(" a c "), wxT(' ')); + ASSERT_EQUALS(wxT(" a c "), tkz3.remaining()); + ASSERT_EQUALS(0u, tkz3.tokenCount()); + + ASSERT_EQUALS(wxEmptyString, tkz3.next()); + ASSERT_EQUALS(wxT("a c "), tkz3.remaining()); + ASSERT_EQUALS(1u, tkz3.tokenCount()); + + ASSERT_EQUALS(wxT("a"), tkz3.next()); + ASSERT_EQUALS(wxT("c "), tkz3.remaining()); + ASSERT_EQUALS(2u, tkz3.tokenCount()); + + ASSERT_EQUALS(wxT("c"), tkz3.next()); + ASSERT_EQUALS(wxT(""), tkz3.remaining()); + ASSERT_EQUALS(3u, tkz3.tokenCount()); + + ASSERT_EQUALS(wxEmptyString, tkz3.next()); + ASSERT_EQUALS(wxT(""), tkz3.remaining()); + ASSERT_EQUALS(3u, tkz3.tokenCount()); + + ASSERT_EQUALS(wxEmptyString, tkz3.next()); + ASSERT_EQUALS(wxT(""), tkz3.remaining()); + ASSERT_EQUALS(3u, tkz3.tokenCount()); + } +} + + +TEST(SimpleParser, NormalTokens) +{ + CSimpleTokenizer tkz(wxT("a c"), wxT(' ')); + ASSERT_EQUALS(wxT("a c"), tkz.remaining()); + ASSERT_EQUALS(0u, tkz.tokenCount()); + + ASSERT_EQUALS(wxT("a"), tkz.next()); + ASSERT_EQUALS(wxT("c"), tkz.remaining()); + ASSERT_EQUALS(1u, tkz.tokenCount()); + + ASSERT_EQUALS(wxT("c"), tkz.next()); + ASSERT_EQUALS(wxT(""), tkz.remaining()); + ASSERT_EQUALS(1u, tkz.tokenCount()); + + ASSERT_EQUALS(wxEmptyString, tkz.next()); + ASSERT_EQUALS(wxT(""), tkz.remaining()); + ASSERT_EQUALS(1u, tkz.tokenCount()); + + ASSERT_EQUALS(wxEmptyString, tkz.next()); + ASSERT_EQUALS(wxT(""), tkz.remaining()); + ASSERT_EQUALS(1u, tkz.tokenCount()); +} + diff --git a/unittests/tests/TextFileTest.cpp b/unittests/tests/TextFileTest.cpp new file mode 100644 index 00000000..07ace8f0 --- /dev/null +++ b/unittests/tests/TextFileTest.cpp @@ -0,0 +1,244 @@ +#include + +#include +#include +#include + +using namespace muleunit; + +DECLARE_SIMPLE(TextFile) + +const wxChar* g_filesDefault[] = { + wxT("TextFileTest_dos.txt"), + wxT("TextFileTest_unix.txt") +}; + + +wxString ArrToStr(const wxArrayString& arr) +{ + wxString str = wxT("["); + + for (size_t i = 0; i < arr.Count(); ++i) { + if (str != wxT("[")) { + str << wxT(", \"") << arr[i] << wxT('"'); + } else { + str << wxT('"') << arr[i] << wxT('"'); + } + } + + str << wxT("]"); + + return str; +} + + +wxString ArrToStr(size_t count, const wxChar* arr[]) +{ + return ArrToStr(wxArrayString(count, arr)); +} + + + +void CompareReadLines(size_t count, const wxChar* expected[], EReadTextFile criteria) +{ + CTextFile file; + ASSERT_FALSE(file.IsOpened()); + ASSERT_TRUE(file.Eof()); + for (size_t j = 0; j < ArraySize(g_filesDefault); ++j) { + CONTEXT(wxString(wxT("Checking file: ")) + g_filesDefault[j]); + + ASSERT_TRUE(file.Open(CPath(wxSTRINGIZE_T(SRCDIR)).JoinPaths(CPath(g_filesDefault[j])).GetRaw(), CTextFile::read)); + + wxArrayString lines = file.ReadLines(criteria); + + ASSERT_EQUALS(ArrToStr(count, expected), ArrToStr(lines)); + ASSERT_EQUALS(count, lines.GetCount()); + } + ASSERT_TRUE(file.IsOpened()); + ASSERT_TRUE(file.Eof()); +}; + + + +TEST(TextFile, ReadLines) +{ + { + CONTEXT(wxT("Checking default parameters")); + + const wxChar* lines[] = { + wxT("abc"), + wxT("def ghi"), + wxT("xyz"), + }; + + CompareReadLines(ArraySize(lines), lines, txtReadDefault); + } + + { + CONTEXT(wxT("Checking without criteria")); + + const wxChar* lines[] = { + wxT(" # comment"), + wxT("abc"), + wxT("# foo bar"), + wxT(" "), + wxT("def ghi "), + wxT(""), + wxT("# xyz"), + wxT(" xyz"), + wxT(" "), + wxT("") + }; + + CompareReadLines(ArraySize(lines), lines, (EReadTextFile)0); + } + + { + CONTEXT(wxT("Checking txtIgnoreEmptyLines")); + + const wxChar* lines[] = { + wxT(" # comment"), + wxT("abc"), + wxT("# foo bar"), + wxT(" "), + wxT("def ghi "), + wxT("# xyz"), + wxT(" xyz"), + wxT(" "), + }; + + CompareReadLines(ArraySize(lines), lines, txtIgnoreEmptyLines); + } + + { + CONTEXT(wxT("Checking txtIgnoreComments")); + + const wxChar* lines[] = { + wxT("abc"), + wxT(" "), + wxT("def ghi "), + wxT(""), + wxT(" xyz"), + wxT(" "), + wxT("") + }; + + CompareReadLines(ArraySize(lines), lines, txtIgnoreComments); + } + + { + CONTEXT(wxT("Checking txtStripWhitespace")); + + const wxChar* lines[] = { + wxT("# comment"), + wxT("abc"), + wxT("# foo bar"), + wxT(""), + wxT("def ghi"), + wxT(""), + wxT("# xyz"), + wxT("xyz"), + wxT(""), + wxT("") + }; + + CompareReadLines(ArraySize(lines), lines, txtStripWhitespace); + } +} + + +class TextFileTest : public Test +{ +public: + TextFileTest() + : Test(wxT("TextFile"), wxT("WriteLines")) + { + } + + virtual void setUp() + { + const CPath path = CPath(wxT("testfile.txt")); + if (path.FileExists()) { + ASSERT_TRUE(CPath::RemoveFile(path)); + } + + } + + virtual void tearDown() + { + setUp(); + } + + virtual void run() + { + const wxChar* lines[] = { + wxT(" # comment"), + wxT("abc"), + wxT("# foo bar"), + wxT(" "), + wxT("def ghi "), + wxT(""), + wxT("# xyz"), + wxT(" xyz"), + wxT(" "), + wxT("") + }; + + { + CONTEXT(wxT("Writing lines manually")); + + CTextFile file; + ASSERT_TRUE(file.Open(wxT("testfile.txt"), CTextFile::write)); + + for (size_t i = 0; i < ArraySize(lines); ++i) { + CONTEXT(wxString::Format(wxT("Writing the %i'th line."), i)); + + ASSERT_TRUE(file.WriteLine(lines[i])); + } + } + + { + CONTEXT(wxT("Reading manually written lines")); + + CTextFile file; + ASSERT_TRUE(file.Open(wxT("testfile.txt"), CTextFile::read)); + ASSERT_FALSE(file.Eof()); + + for (size_t i = 0; i < ArraySize(lines); ++i) { + CONTEXT(wxString::Format(wxT("Reading the %i'th line."), i)); + + ASSERT_EQUALS(lines[i], file.GetNextLine()); + } + ASSERT_TRUE(file.Eof()); + } + + { + CONTEXT(wxT("Writing lines automatically")); + + CTextFile file; + ASSERT_FALSE(file.IsOpened()); + ASSERT_TRUE(file.Open(wxT("testfile.txt"), CTextFile::write)); + ASSERT_TRUE(file.WriteLines(wxArrayString(ArraySize(lines), lines))); + ASSERT_TRUE(file.IsOpened()); + } + + { + CONTEXT(wxT("Reading automatically written lines")); + + CTextFile file; + ASSERT_FALSE(file.IsOpened()); + ASSERT_TRUE(file.Open(wxT("testfile.txt"), CTextFile::read)); + ASSERT_TRUE(file.IsOpened()); + ASSERT_FALSE(file.Eof()); + + for (size_t i = 0; i < ArraySize(lines); ++i) { + CONTEXT(wxString::Format(wxT("Reading the %i'th line."), i)); + + ASSERT_EQUALS(lines[i], file.GetNextLine()); + } + + ASSERT_TRUE(file.Eof()); + } + } +} testInstance; + diff --git a/unittests/tests/TextFileTest_dos.txt b/unittests/tests/TextFileTest_dos.txt new file mode 100644 index 00000000..7147df61 --- /dev/null +++ b/unittests/tests/TextFileTest_dos.txt @@ -0,0 +1,9 @@ + # comment +abc +# foo bar + +def ghi + +# xyz + xyz + diff --git a/unittests/tests/TextFileTest_unix.txt b/unittests/tests/TextFileTest_unix.txt new file mode 100644 index 00000000..271149f1 --- /dev/null +++ b/unittests/tests/TextFileTest_unix.txt @@ -0,0 +1,9 @@ + # comment +abc +# foo bar + +def ghi + +# xyz + xyz + diff --git a/version.rc.in b/version.rc.in new file mode 100644 index 00000000..434c8d04 --- /dev/null +++ b/version.rc.in @@ -0,0 +1,49 @@ +#include +#include "src/include/common/ClientVersion.h" + +#ifdef __PRERELEASE__ +#define VER_PRERELEASE VS_FF_PRERELEASE +#undef VER_RELEASE +#define VER_RELEASE 0 +#define VER_PRODUCTVERSION_STR "@PACKAGE_VERSION@ @SVNDATE@" +#else +#define VER_PRERELEASE 0 +#ifndef VER_RELEASE +#define VER_RELEASE 1 +#endif +#define VER_PRODUCTVERSION_STR "@PACKAGE_VERSION@" +#endif + +#ifdef __DEBUG__ +#define VER_DEBUG VS_FF_DEBUG +#else +#define VER_DEBUG 0 +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_MJR, VERSION_MIN, VERSION_UPDATE, VER_RELEASE + PRODUCTVERSION VERSION_MJR, VERSION_MIN, VERSION_UPDATE, VER_RELEASE + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS VER_DEBUG | VER_PRERELEASE + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "http://www.amule.org/" + VALUE "FileDescription", VER_FILEDESCRIPTION_STR + VALUE "FileVersion", VER_PRODUCTVERSION_STR + VALUE "InternalName", VER_INTERNALNAME_STR + VALUE "OriginalFilename", VER_ORIGINALFILENAME_STR + VALUE "ProductName", "aMule" + VALUE "ProductVersion", VER_PRODUCTVERSION_STR + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1200 + END +END -- 2.11.4.GIT

Q&Y32P!6f2l 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 literal 0 HcwPel00001 diff --git a/src/utils/amps/images/baseimage.xcf.bz2 b/src/utils/amps/images/baseimage.xcf.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..17aca7d18114cebbeb59ea678e8a0b1f53b41437 GIT binary patch literal 122525 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 G$FTsN|FgdU literal 0 HcwPel00001 diff --git a/src/utils/amps/images/baseimage_old.png b/src/utils/amps/images/baseimage_old.png new file mode 100644 index 0000000000000000000000000000000000000000..1da70786ae877cd2776248a8b5cc96ced6a8a3f4 GIT binary patch literal 133179 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 literal 0 HcwPel00001 diff --git a/aMule.app/Contents/Info.plist b/aMule.app/Contents/Info.plist new file mode 100644 index 00000000..9fc76e63 --- /dev/null +++ b/aMule.app/Contents/Info.plist @@ -0,0 +1,34 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + amule + CFBundleName + amule + CFBundleGetInfoString + 2.2.0, Copyright 2003-2006 aMule Project (http://www.amule.org) + CFBundleIconFile + amule + CFBundleIdentifier + org.amule.aMule + CFBundleInfoDictionaryVersion + 2.2.0 + CFBundlePackageType + APPL + CFBundleShortVersionString + 2.2.0 + CFBundleSignature + aMul + CFBundleVersion + 2.2.0 + NSHumanReadableCopyright + Copyright 2003-2006 aMule Project (http://www.amule.org) + NSMainNibFile + NSMainNibFile + NSPrincipalClass + NSApplication + + diff --git a/aMule.app/Contents/MacOS/ed2kHelperScript.app/Contents/Info.plist b/aMule.app/Contents/MacOS/ed2kHelperScript.app/Contents/Info.plist new file mode 100644 index 00000000..5b96590d --- /dev/null +++ b/aMule.app/Contents/MacOS/ed2kHelperScript.app/Contents/Info.plist @@ -0,0 +1,37 @@ + + + + + CFBundleName + ed2kHelperScript + CFBundleDevelopmentRegion + English + CFBundleExecutable + applet + CFBundleIdentifier + org.amule.ed2kHelperScript + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleSignature + aELH + CFBundleURLTypes + + + CFBundleURLName + ED2K URL + CFBundleURLSchemes + + ed2k + + CFBundleTypeRole + Viewer + + + LSPrefersCarbon + + LSUIElement + 1 + + diff --git a/aMule.app/Contents/MacOS/ed2kHelperScript.app/Contents/MacOS/applet b/aMule.app/Contents/MacOS/ed2kHelperScript.app/Contents/MacOS/applet new file mode 100755 index 0000000000000000000000000000000000000000..543633386e77aa1606918dbb6d824493cd5b4ef3 GIT binary patch literal 33740 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 P3=IGOBea9rav&A}RRjzO literal 0 HcwPel00001 diff --git a/aMule.app/Contents/PkgInfo b/aMule.app/Contents/PkgInfo new file mode 100644 index 00000000..f5b83fa1 --- /dev/null +++ b/aMule.app/Contents/PkgInfo @@ -0,0 +1 @@ +APPLaMul \ No newline at end of file diff --git a/aMule.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib b/aMule.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib new file mode 100755 index 00000000..b9b4b09f --- /dev/null +++ b/aMule.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib @@ -0,0 +1,4 @@ +{ + IBClasses = ({CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }); + IBVersion = 1; +} \ No newline at end of file diff --git a/aMule.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib b/aMule.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib new file mode 100755 index 00000000..15e0d707 --- /dev/null +++ b/aMule.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib @@ -0,0 +1,22 @@ + + + + + IBDocumentLocation + 126 126 356 240 0 0 1600 1178 + IBEditorPositions + + 29 + 125 407 318 44 0 0 1600 1178 + + IBFramework Version + 328.0 + IBOpenObjects + + 21 + 29 + + IBSystem Version + 7B8 + + diff --git a/aMule.app/Contents/Resources/English.lproj/MainMenu.nib/objects.nib b/aMule.app/Contents/Resources/English.lproj/MainMenu.nib/objects.nib new file mode 100755 index 0000000000000000000000000000000000000000..3bb00c9d85b907698ec61260e2a2905e350067a3 GIT binary patch literal 5298 zcwUuQe{2+49e>kq3vHK{1IslcI3XbikrH}{(vo0Hk)x-yJ@$@^7tLkZzP7{d&aAVu z6wni2ogFns&#Ud%V{bV)j=Pf_$UVWJ2zmxZS&v8phJ;9Ho7wGl z`(u%k%*^-u`Tl(0_kG{Dff{>vjP}HBi)v9;KISN`j^osJhB`KMZQnt|_D0Rt7#Ve( z*_|PeLXtxsq&*S0&8SCQKJ1jW3emdG(3XU)ZI959ZRtjzA|?IzVMqDGoX${NEEdtj znys6Ln{*vTZv~XBMoDTUI&2zcWe0|ZkxGxm$fv_jKyPhrCC@|e^Up(I8`G&@ACoqCwY-D0d$8&7PHqAP7-5oL=M zb@uNk&RYdi&cPIs0lkV#<`aeguKQ%}<{g>8S?{4!WLD{SOUl+r*)F@ETJgM0L#e>~ z%>lJ75}6eE|CR1>|6fSxQ&ooY?dkj%+~BKTZBs92Qd4cWMSH154NT>KzW;$#vSKsUyeabCykj_%EQhQUanlZQsT{N@fSRa!PZi__q0~DN6fg~SIR(X9|9q5 zrw5Lg23HHP+Lm94P-&6Mt#l`~Z1?cAs3(nUPB*p-HAL-1EN8#FwEfxL*g5T-Ky2Fb zOM2xtp>T?QIwZm8To^Bb%9nMc#~ctv5D-SkyrjNjn$a1zl82kUMK|=QzQyR$U9awCmUgqL=>I)uouE&HWV zuFb6cN%Mg1#ORr(=*Bw^LU2VYgjmq)B7&AH@ZL$TDC1^4e3igsZ{Fo4y>F64S+T?% zDS?f6r*0;^Gv&ESQsu=`3tozg?J6>b-CylBE!FcL#pxvRS;gW{J)eliM2+WFNXZ>D z?BIf2&JM+BB!W9-hJ1b=^H?rKRB!9&L~^-onQ2))nOZrssCi>TY+Y%w&rTFmwYd5X zGoikSqvZ6P8UN?HRA4LhH{mPO8Oy@u3FVCs~cgN3iE<+B?D*EaQ+;OW+2l9N7JA#hUzRFKL%rK;8Yq8rJ*tlYZ~D}7OrJr zRU=%?Kz$JIXW{M`T+P4|6>erAyBaQK;6esYr{T^RRAu3#G+fWX!z?ISXkQNvK{%0y z#aXBe!crB2)u~3fhUrk&x-f#zps2HF;%e7`K`j?ni>5n%y>VeI2{#1%Sr=}K=a*b~ zBno95)8s->;Z_$kilIJVa8Nx_6fyHADZ4+B zf_^po{w}mq>xhH z^epD!iU8wtagiznRThy@(~^mrFso`|4wZ@QW*6=i=|D?$#erlCRn$-Nby+cfh41oN zvCW&BgwBPN)^>fto`Q=)qS+NU-r)H4nc8@dtq>P6o8ZN{Lm66+kb|ku30!?=s8iqG zj?Zg^}O#@4U<}cj3oJjQoS&?BorMyvwT@`4w;8!ABH+kC9`@-p9xv@$oJr=edGt zzIQLLV&vC6g@+MW8Tmaw&d4Coynv`5Bc3m1OD;YV;SFPpezsGMg@>j(C zf{~N_7-I4LJx2bfE2N*fW*UaY+7)j&j`;7b@A3tQ|Exr(~@b)tN ze3OwAypE9+z9$(O;>#HM6K`C^A7Lbz*-uks2upu%$A)$@Y-*b0N>;$ A9{>OV literal 0 HcwPel00001 diff --git a/aMule.app/Contents/Resources/amule.icns b/aMule.app/Contents/Resources/amule.icns new file mode 100644 index 0000000000000000000000000000000000000000..c8e4fb26e971eec15101b7963d2d11930c0278d1 GIT binary patch literal 37083 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 z%0D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 +- New spec for aMule-2.0.0 compliant with Fedora Core specifications. + +* Mon Apr 19 2005 Marcelo Jimenez +- Removed curl dependency, aMule now uses wxHTTP. + +* Mon Mar 26 2005 Marcelo Jimenez +- Added a distro test, so we know the distro. +- Tests for UTF-8 enabled LANG to use UTF-8 systray. + +* Mon Mar 21 2005 Marcelo Jimenez +- Removed krb5-libs require and krb5-devel buildprereq. curl-lib and + curl-devel is enough. + +* Tue Mar 08 2005 Marcelo Jimenez +- Made it work with cvs snapshots at their very same day. + +* Wed Jun 16 2004 Ariano Bertacca +- added tool package. + +* Sat May 22 2004 Ariano Bertacca +- added webserver package. + +* Sun Mar 28 2004 Ariano Bertacca +- added libcryptopp to dependencies/BuildPreReq +- getting wx-config and wxbase-config from installed rpm to avoid problems + with people using wxGTK-2.5. + Idea taken from aMule-2.0.0rc1.spec done by + deltaHF and + pure_ascii + +* Tue Feb 10 2004 Ariano Bertacca +- modified the BuildPreReq to satisfy amulecmd build requirements. + +* Sat Jan 23 2004 Ariano Bertacca +- initial amule.spec release diff --git a/acinclude.m4 b/acinclude.m4 new file mode 100644 index 00000000..21ad8366 --- /dev/null +++ b/acinclude.m4 @@ -0,0 +1,232 @@ +dnl --------------------------------------------------------------------------- +dnl AM_WXCONFIG_LARGEFILE() +dnl +dnl Test that wxWidgets is built with support for large-files. If not +dnl configure is terminated. +dnl --------------------------------------------------------------------------- +AC_DEFUN([AM_WXCONFIG_LARGEFILE], +[ + AC_LANG_PUSH(C++) + + dnl Backup current flags and setup flags for testing + __CPPFLAGS=${CPPFLAGS} + CPPFLAGS=${WX_CPPFLAGS} + + AC_MSG_CHECKING(that wxWidgets has support for large files) + AC_PREPROC_IFELSE([ + #include + + int main() { + #if !HAVE_LARGEFILE_SUPPORT && !defined(__WXMSW__) + #error No LargeFile support!; + #endif + exit(0); + } + ], , NO_LF="true") + + if test "x${NO_LF}" != "x"; + then + AC_MSG_RESULT(no) + AC_MSG_ERROR([ + Support for large files in wxWidgets is required by aMule. + To continue you must recompile wxWidgets with support for + large files enabled. + ]) + else + AC_MSG_RESULT(yes) + fi + + dnl Restore backup'd flags + CPPFLAGS=${__CPPFLAGS} + + AC_LANG_POP(C++) +]) + + +dnl -------------------------------------------------------------------------- +dnl CCache support +dnl -------------------------------------------------------------------------- + +AC_DEFUN([CHECK_CCACHE], + [ + if test x$ccache_prefix == x ; then + ccache_full=$(which ccache) + ccache_prefix=$(dirname ${ccache_full}) + fi + $ccache_prefix/ccache -V > /dev/null 2>&1 + CCACHE=$? + if test "$CCACHE" != 0; then + result="no" + else + result="yes" + fi + AC_MSG_CHECKING([for ccache presence]) + AC_MSG_RESULT($result) + AC_SUBST(CCACHE) + AC_SUBST(ccache_prefix) + ]) + + +AC_DEFUN([AM_OPTIONS_CCACHE_PFX], +[ + AC_ARG_WITH( + [ccache-prefix], + [AS_HELP_STRING( + [--with-ccache-prefix=PREFIX], + [prefix where ccache is installed])], + [ccache_prefix="$withval"], + [ccache_prefix=""]) +]) + + +dnl ---------------------------------------------------- +dnl CHECK_BFD +dnl check if bfd.h is on the system and usable +dnl ---------------------------------------------------- +AC_DEFUN([CHECK_BFD], +[ +AC_MSG_CHECKING([for bfd]) +__LIBS=$LIBS +LIBS="-lbfd -liberty $LIBS" +AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + #include + #include + ]], [[ + char *dummy = bfd_errmsg(bfd_get_error()); + ]]) + ], [ + AC_MSG_RESULT([yes]) + BFD_FLAGS="-DHAVE_BFD" + BFD_LIB="-lbfd -liberty" + ], [ + AC_MSG_RESULT([no]) + AC_MSG_WARN([ + bfd.h not found or unusable, please install binutils development + package if you are a developer or want to help testing aMule]) + ]) +LIBS=${__LIBS} +AC_SUBST(BFD_FLAGS) +AC_SUBST(BFD_LIB) +]) + + +dnl ---------------------------------------------------- +dnl CHECK_AUTOPOINT +dnl check if autopoint is installed and fail if not +dnl ---------------------------------------------------- +AC_DEFUN([CHECK_AUTOPOINT], +[ + +AC_MSG_CHECKING([for autopoint]) + +autopoint_version=`autopoint --version | head -n 1 | sed -e 's/.*[[^0-9.]]\([[0-9]]\{1,\}\(\.[[0-9]]\{1,\}\)\{1,2\}\)[[^0-9.]]*/\1/'` +if test x$autopoint_version != x; then + result="yes" +else + result="no" +fi + +HAVE_GETTEXT=$result + +AC_MSG_RESULT($result ($autopoint_version)) +if test x$result = xno; then + AC_MSG_NOTICE([You need to install GNU gettext/gettext-tools to compile aMule with i18n support]) +fi +AC_SUBST(HAVE_GETTEXT) +]) + + +dnl ---------------------------------------------------- +dnl CHECK_FLEX_EXTENDED +dnl check if flex can produce header files +dnl ---------------------------------------------------- +AC_DEFUN([CHECK_FLEX_EXTENDED], +[ + +AC_MSG_CHECKING([for extended flex capabilities]) + +extended_flex=`flex --help | grep header-file` +if test x"$extended_flex" != x""; then + result="yes" +else + result="no" +fi + +HAVE_FLEX_EXTENDED=$result + +AC_MSG_RESULT($result) + +if test x$result = xno; then + AC_MSG_NOTICE([Your flex version doesn't support --header-file flag. This is not critical, but an upgrade is recommended ]) +fi + +AC_SUBST(HAVE_FLEX_EXTENDED) + +]) + + +dnl ---------------------------------------------------- +dnl CHECK_EXCEPTIONS +dnl Checks for broken exception-handling. This is needed +dnl because exception handling is broken for some archs/ +dnl compilers. +dnl ---------------------------------------------------- +AC_DEFUN([CHECK_EXCEPTIONS], +[ + AC_MSG_CHECKING([for exception-handling]) + + AC_LANG_PUSH(C++) + AC_RUN_IFELSE([ + AC_LANG_PROGRAM([], + [[ + try { + throw 1; + } catch (int) { + return 0; + } + return 1; + ]]) + ], [ + AC_MSG_RESULT([yes]) + ], [ + AC_MSG_RESULT([no]) + AC_MSG_ERROR([Exception handling does not work. Broken compiler?]) + ], [ + AC_MSG_RESULT([undeterminable]) + AC_MSG_WARN([ + Cross-compilation detected, so exception handling cannot be tested. + Note that broken exception handling in your compiler may lead to + unexpected crashes.]) + ]) + AC_LANG_POP(C++) +]) + + +dnl --------------------------------------------------------------------------- +dnl GENERATE_MANS_TO_INSTALL(TESTNAME, BASENAMEPATH) +dnl +dnl This function will generate the list of manpages to be installed. +dnl +dnl TESTNAME is the name of a variable that'll evaluate to yes if this +dnl set of manpages need installing. The list of files will be returned in +dnl the TESTNAME_MANPAGES variable. +dnl +dnl BASENAMEPATH is the path and basename of the manpages we test for, relative +dnl to the package root (top_srcdir) +dnl --------------------------------------------------------------------------- +AC_DEFUN([GENERATE_MANS_TO_INSTALL], +[ + if test "$[]$1" == "yes"; then + if test "$LINGUAS" = ""; then + $1_MANPAGES=`ls -1 ${srcdir}/$2.* | sed -e 's:.*/::g'` + else + $1_MANPAGES=`ls -1 ${srcdir}/$2.* | sed -e 's:.*/::g' | grep $Generate_Langs ` + $1_MANPAGES="`basename $2.1` $[]$1_MANPAGES" + fi + $1_MANPAGES=`echo $[]$1_MANPAGES | tr -d '\n'` + else + $1_MANPAGES= + fi + AC_SUBST($1_MANPAGES) +]) diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 00000000..2adb5253 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,915 @@ +# generated automatically by aclocal 1.9.5 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION so it can be traced. +# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], + [AM_AUTOMAKE_VERSION([1.9.5])]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 7 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE]) +AC_SUBST([$1_FALSE]) +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 8 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH]) +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 3 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 8 + +# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. +AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 12 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.58])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +]) +]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $1 | $1:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"$am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- +# From Jim Meyering + +# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +AC_DEFUN([AM_MAINTAINER_MODE], +[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode is disabled by default + AC_ARG_ENABLE(maintainer-mode, +[ --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer], + USE_MAINTAINER_MODE=$enableval, + USE_MAINTAINER_MODE=no) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST(MAINT)dnl +] +) + +AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_MKDIR_P +# --------------- +# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. +# +# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories +# created by `make install' are always world readable, even if the +# installer happens to have an overly restrictive umask (e.g. 077). +# This was a mistake. There are at least two reasons why we must not +# use `-m 0755': +# - it causes special bits like SGID to be ignored, +# - it may be too restrictive (some setups expect 775 directories). +# +# Do not use -m 0755 and let people choose whatever they expect by +# setting umask. +# +# We cannot accept any implementation of `mkdir' that recognizes `-p'. +# Some implementations (such as Solaris 8's) are not thread-safe: if a +# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' +# concurrently, both version can detect that a/ is missing, but only +# one can create it and the other will error out. Consequently we +# restrict ourselves to GNU make (using the --version option ensures +# this.) +AC_DEFUN([AM_PROG_MKDIR_P], +[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # We used to keeping the `.' as first argument, in order to + # allow $(mkdir_p) to be used without argument. As in + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. However this is wrong + # for two reasons: + # 1. if the package is installed by a user who cannot write `.' + # make install will fail, + # 2. the above comment should most certainly read + # $(mkdir_p) $(DESTDIR)$(somedir) + # so it does not work when $(somedir) is undefined and + # $(DESTDIR) is not. + # To support the latter case, we have to write + # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), + # so the `.' trick is pointless. + mkdir_p='mkdir -p --' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(install_sh) -d' + fi +fi +AC_SUBST([mkdir_p])]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/build-tools.m4]) +m4_include([m4/codeset.m4]) +m4_include([m4/cryptopp.m4]) +m4_include([m4/gdlib.m4]) +m4_include([m4/gettext.m4]) +m4_include([m4/glibc21.m4]) +m4_include([m4/iconv.m4]) +m4_include([m4/intdiv0.m4]) +m4_include([m4/inttypes-pri.m4]) +m4_include([m4/inttypes.m4]) +m4_include([m4/inttypes_h.m4]) +m4_include([m4/lcmessage.m4]) +m4_include([m4/lib-ld.m4]) +m4_include([m4/lib-link.m4]) +m4_include([m4/lib-prefix.m4]) +m4_include([m4/libpng.m4]) +m4_include([m4/progtest.m4]) +m4_include([m4/readline.m4]) +m4_include([m4/stdint_h.m4]) +m4_include([m4/uintmax_t.m4]) +m4_include([m4/ulonglong.m4]) +m4_include([m4/wxwin.m4]) +m4_include([m4/zlib.m4]) +m4_include([acinclude.m4]) diff --git a/amule.desktop b/amule.desktop new file mode 100644 index 00000000..3342286b --- /dev/null +++ b/amule.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Name=aMule +Exec=amule +Icon=amule +Terminal=false +Type=Application +Categories=Network;P2P; diff --git a/amule.ico b/amule.ico new file mode 100644 index 0000000000000000000000000000000000000000..c7d903219994da80c1a2d4fa17b2781e8583d23b GIT binary patch literal 32606 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 C!7)1k literal 0 HcwPel00001 diff --git a/amule.png b/amule.png new file mode 100644 index 0000000000000000000000000000000000000000..ac717d049433d24d657f9e49cf52c469a30b89ce GIT binary patch literal 18218 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 literal 0 HcwPel00001 diff --git a/amule.rc b/amule.rc new file mode 100644 index 00000000..28588d12 --- /dev/null +++ b/amule.rc @@ -0,0 +1,4 @@ +amule ICON "amule.ico" +convert ICON "convert.ico" + +#include "wx/msw/wx.rc" diff --git a/amule.xpm b/amule.xpm new file mode 100644 index 00000000..18b7f58a --- /dev/null +++ b/amule.xpm @@ -0,0 +1,1783 @@ +/* XPM */ +static const char * amule_xpm[] = { +"128 128 1652 2", +" c None", +". c #753B0E", +"+ c #724521", +"@ c #944E1B", +"# c #97501C", +"$ c #77614E", +"% c #66462A", +"& c #7C4217", +"* c #B66A30", +"= c #924D1D", +"- c #805F45", +"; c #A35722", +"> c #BD7743", +", c #7F4418", +"' c #795A42", +") c #6A3D17", +"! c #87491C", +"~ c #7E3F0F", +"{ c #6B5E52", +"] c #70431D", +"^ c #86491B", +"/ c #A45822", +"( c #D18951", +"_ c #AD642B", +": c #734219", +"< c #715E4F", +"[ c #785436", +"} c #764016", +"| c #924E1D", +"1 c #9B5524", +"2 c #6F391B", +"3 c #6F6359", +"4 c #784016", +"5 c #88491C", +"6 c #A15320", +"7 c #CD8145", +"8 c #894A1C", +"9 c #7F471D", +"0 c #716C66", +"a c #68462A", +"b c #7E4418", +"c c #AF672F", +"d c #814518", +"e c #7C451C", +"f c #6E3C15", +"g c #814A21", +"h c #99511C", +"i c #A4602A", +"j c #884A1C", +"k c #6A492D", +"l c #693C1B", +"m c #7D461C", +"n c #915223", +"o c #804418", +"p c #694E35", +"q c #664F3A", +"r c #794117", +"s c #B96F36", +"t c #CC9366", +"u c #934E1D", +"v c #6A523D", +"w c #6A3D18", +"x c #804921", +"y c #784117", +"z c #675A4F", +"A c #6A4E36", +"B c #824A21", +"C c #6C6156", +"D c #6F3F18", +"E c #D69258", +"F c #81481D", +"G c #774820", +"H c #6D675F", +"I c #5B3B22", +"J c #512D14", +"K c #724F2F", +"L c #7D5533", +"M c #6B6660", +"N c #634025", +"O c #5A2E12", +"P c #542B11", +"Q c #5A3E26", +"R c #743F16", +"S c #80481D", +"T c #7A4217", +"U c #7D5D3F", +"V c #5E3D23", +"W c #5C2F12", +"X c #573117", +"Y c #592E11", +"Z c #593216", +"` c #715B45", +" . c #6B4F36", +".. c #894E1E", +"+. c #8A613E", +"@. c #695B4E", +"#. c #5F361B", +"$. c #613618", +"%. c #5F3518", +"&. c #7E4D25", +"*. c #766D65", +"=. c #70411A", +"-. c #754319", +";. c #886F5A", +">. c #5C341A", +",. c #67391B", +"'. c #6E441D", +"). c #716254", +"!. c #684D35", +"~. c #DD985F", +"{. c #A56734", +"]. c #78451C", +"^. c #776E65", +"/. c #4E392C", +"(. c #6A3F1C", +"_. c #7B5532", +":. c #756C64", +"<. c #69411C", +"[. c #CC573E", +"}. c #9C5E28", +"|. c #784B25", +"1. c #6C665E", +"2. c #4F4842", +"3. c #563117", +"4. c #71411C", +"5. c #754720", +"6. c #7E6753", +"7. c #8A5022", +"8. c #5C5C5C", +"9. c #5E3C23", +"0. c #523625", +"a. c #713A1B", +"b. c #794921", +"c. c #74563B", +"d. c #724723", +"e. c #9E3E25", +"f. c #7E5E40", +"g. c #5C5044", +"h. c #4C2B18", +"i. c #4D2C18", +"j. c #79461C", +"k. c #804518", +"l. c #714E2F", +"m. c #7A6B5E", +"n. c #77451C", +"o. c #7D6D5D", +"p. c #5C3B23", +"q. c #552C11", +"r. c #70451D", +"s. c #6E5B4A", +"t. c #66584B", +"u. c #BB845B", +"v. c #834D1F", +"w. c #80471D", +"x. c #7F6F61", +"y. c #504B47", +"z. c #4C2C18", +"A. c #72461E", +"B. c #7D5633", +"C. c #6E6E6E", +"D. c #735C46", +"E. c #6D6C6A", +"F. c #5A4232", +"G. c #51311A", +"H. c #744924", +"I. c #75665A", +"J. c #72553A", +"K. c #7F400F", +"L. c #C47537", +"M. c #754924", +"N. c #656464", +"O. c #565554", +"P. c #502F1B", +"Q. c #57321B", +"R. c #995D38", +"S. c #764720", +"T. c #7B6C5F", +"U. c #71543A", +"V. c #50504F", +"W. c #5A493B", +"X. c #946843", +"Y. c #935828", +"Z. c #7F4820", +"`. c #675E56", +" + c #6F5338", +".+ c #A7652C", +"++ c #6E5F52", +"@+ c #545556", +"#+ c #4A2A17", +"$+ c #3F2C25", +"%+ c #452819", +"&+ c #815734", +"*+ c #A46E42", +"=+ c #706962", +"-+ c #714E2E", +";+ c #66605A", +">+ c #534B44", +",+ c #351E11", +"'+ c #C39E7E", +")+ c #AA7243", +"!+ c #7C5432", +"~+ c #705339", +"{+ c #754F2F", +"]+ c #4D4D4D", +"^+ c #564538", +"/+ c #361F11", +"(+ c #E8C3A4", +"_+ c #775A44", +":+ c #747373", +"<+ c #73553A", +"[+ c #C07236", +"}+ c #644B33", +"|+ c #3C3B3A", +"1+ c #392822", +"2+ c #CBAC92", +"3+ c #4E3F33", +"4+ c #615750", +"5+ c #665D55", +"6+ c #695646", +"7+ c #7D4317", +"8+ c #52473C", +"9+ c #393737", +"0+ c #402517", +"a+ c #352219", +"b+ c #EDD1B9", +"c+ c #EEB88A", +"d+ c #905627", +"e+ c #685F57", +"f+ c #595656", +"g+ c #5E4535", +"h+ c #453023", +"i+ c #4E2E1A", +"j+ c #574639", +"k+ c #6B5641", +"l+ c #DC8E54", +"m+ c #7C4720", +"n+ c #434241", +"o+ c #443D38", +"p+ c #331E10", +"q+ c #814D21", +"r+ c #CB9266", +"s+ c #785130", +"t+ c #585959", +"u+ c #392E25", +"v+ c #432718", +"w+ c #4D3E31", +"x+ c #4E4D4D", +"y+ c #5E4C39", +"z+ c #74431B", +"A+ c #DA9457", +"B+ c #4C4D4D", +"C+ c #3B3632", +"D+ c #331F15", +"E+ c #A67C5A", +"F+ c #73431B", +"G+ c #5D4B39", +"H+ c #454545", +"I+ c #3D2416", +"J+ c #50301A", +"K+ c #603E24", +"L+ c #603618", +"M+ c #796351", +"N+ c #595755", +"O+ c #3D3D3C", +"P+ c #3D2B1F", +"Q+ c #351F11", +"R+ c #996136", +"S+ c #71451E", +"T+ c #5F3D24", +"U+ c #563F30", +"V+ c #3E2514", +"W+ c #5B331A", +"X+ c #874D1E", +"Y+ c #734929", +"Z+ c #363534", +"`+ c #301F17", +" @ c #241811", +".@ c #5F3517", +"+@ c #AD6022", +"@@ c #896A4E", +"#@ c #534B45", +"$@ c #311E14", +"%@ c #251D1A", +"&@ c #935624", +"*@ c #885328", +"=@ c #A46734", +"-@ c #7D6C5D", +";@ c #434343", +">@ c #494745", +",@ c #221710", +"'@ c #1D1816", +")@ c #824B21", +"!@ c #824D21", +"~@ c #895022", +"{@ c #8B5327", +"]@ c #9B5D28", +"^@ c #7C6C5F", +"/@ c #474542", +"(@ c #241C19", +"_@ c #17110E", +":@ c #935726", +"<@ c #995726", +"[@ c #9C5D28", +"}@ c #9E6029", +"|@ c #9D5925", +"1@ c #875228", +"2@ c #686463", +"3@ c #474645", +"4@ c #3C2A23", +"5@ c #834D1E", +"6@ c #884E21", +"7@ c #935724", +"8@ c #A4612C", +"9@ c #A7652F", +"0@ c #AD672F", +"a@ c #AF672E", +"b@ c #AA642D", +"c@ c #A15C26", +"d@ c #9C5723", +"e@ c #925624", +"f@ c #84664B", +"g@ c #2A2725", +"h@ c #1C1715", +"i@ c #995D28", +"j@ c #A8662D", +"k@ c #955A36", +"l@ c #696867", +"m@ c #4B443E", +"n@ c #4C4540", +"o@ c #824B1E", +"p@ c #9B5E28", +"q@ c #7B6B5B", +"r@ c #454342", +"s@ c #221D1B", +"t@ c #201B19", +"u@ c #3A291D", +"v@ c #4E2F19", +"w@ c #B96F31", +"x@ c #B96F33", +"y@ c #B66A2F", +"z@ c #AE652C", +"A@ c #AC652C", +"B@ c #A65D22", +"C@ c #8F6E51", +"D@ c #383636", +"E@ c #292A2B", +"F@ c #322921", +"G@ c #4D2B14", +"H@ c #894E1F", +"I@ c #C07036", +"J@ c #B86A30", +"K@ c #B6682F", +"L@ c #AE6225", +"M@ c #927153", +"N@ c #565655", +"O@ c #483528", +"P@ c #5D3417", +"Q@ c #915323", +"R@ c #995D26", +"S@ c #A45E28", +"T@ c #AD652B", +"U@ c #C47536", +"V@ c #C07132", +"W@ c #BE6A29", +"X@ c #B8682B", +"Y@ c #B7682C", +"Z@ c #AF682F", +"`@ c #A16C41", +" # c #63615F", +".# c #55351D", +"+# c #CB7937", +"@# c #CA7633", +"## c #B86829", +"$# c #AD662E", +"%# c #646463", +"&# c #593D25", +"*# c #744219", +"=# c #B8682A", +"-# c #B76C30", +";# c #BB7033", +"># c #C07033", +",# c #CD7A38", +"'# c #D17B3F", +")# c #D6813F", +"!# c #D47D39", +"~# c #EFEDEA", +"{# c #FEFEFE", +"]# c #F6F6F5", +"^# c #AE662F", +"/# c #70665E", +"(# c #624227", +"_# c #CDC7C0", +":# c #C07134", +"<# c #D78240", +"[# c #A55D22", +"}# c #886F59", +"|# c #634932", +"1# c #EFF0EF", +"2# c #C07031", +"3# c #CB7836", +"4# c #CD7A37", +"5# c #D78745", +"6# c #D98745", +"7# c #806F5F", +"8# c #C37233", +"9# c #DA8C4C", +"0# c #916641", +"a# c #5C5D5E", +"b# c #624A38", +"c# c #7D3F0F", +"d# c #F6E3D5", +"e# c #D37F3A", +"f# c #D68745", +"g# c #D98948", +"h# c #DA8F51", +"i# c #926742", +"j# c #6C6F70", +"k# c #684F3B", +"l# c #D88847", +"m# c #D98D4F", +"n# c #DA9456", +"o# c #EDB789", +"p# c #A36E42", +"q# c #6B6A69", +"r# c #6D5A49", +"s# c #D68240", +"t# c #D98F4B", +"u# c #DA9355", +"v# c #6C6159", +"w# c #705C4B", +"x# c #D89150", +"y# c #CE8346", +"z# c #D9914B", +"A# c #DA9356", +"B# c #747574", +"C# c #28221F", +"D# c #555150", +"E# c #E2E2E0", +"F# c #846243", +"G# c #785B44", +"H# c #695F56", +"I# c #824D1F", +"J# c #D9D9D7", +"K# c #CF7E39", +"L# c #B1B5B6", +"M# c #0B0806", +"N# c #050402", +"O# c #6F6D6B", +"P# c #A88362", +"Q# c #7A5C45", +"R# c #606162", +"S# c #655B53", +"T# c #393633", +"U# c #C3C4C6", +"V# c #A6A5A5", +"W# c #625F5D", +"X# c #A99787", +"Y# c #896E53", +"Z# c #615E5D", +"`# c #615B56", +" $ c #B8B5AF", +".$ c #000000", +"+$ c #4F4C4A", +"@$ c #DAD6D5", +"#$ c #585756", +"$$ c #1B1412", +"%$ c #373330", +"&$ c #CACACA", +"*$ c #BCAA99", +"=$ c #90765F", +"-$ c #5E5B5A", +";$ c #4E4C4B", +">$ c #8A6F54", +",$ c #AEAEAE", +"'$ c #484542", +")$ c #957A62", +"!$ c #CFCDCF", +"~$ c #E7E7E7", +"{$ c #CABBAA", +"]$ c #A8937B", +"^$ c #A89686", +"/$ c #6C6B69", +"($ c #47433F", +"_$ c #805F41", +":$ c #957355", +"<$ c #6A6867", +"[$ c #302A25", +"}$ c #BCBCBB", +"|$ c #A48873", +"1$ c #D3D3D3", +"2$ c #9F9996", +"3$ c #565756", +"4$ c #504E4D", +"5$ c #847362", +"6$ c #CAC3BE", +"7$ c #DCDDDD", +"8$ c #C9C9C9", +"9$ c #6E6D6B", +"0$ c #545353", +"a$ c #958272", +"b$ c #D7D9DA", +"c$ c #AAAAAA", +"d$ c #54524F", +"e$ c #555452", +"f$ c #A69585", +"g$ c #C0C0C0", +"h$ c #AAAAA8", +"i$ c #B7B7B7", +"j$ c #8B8885", +"k$ c #4A4846", +"l$ c #5C5A59", +"m$ c #A8A8A6", +"n$ c #A4A19F", +"o$ c #9B9B9B", +"p$ c #7F7B7A", +"q$ c #C8C8C8", +"r$ c #646261", +"s$ c #5A5754", +"t$ c #BBBBBA", +"u$ c #828180", +"v$ c #342F2B", +"w$ c #999895", +"x$ c #A7A7A5", +"y$ c #585553", +"z$ c #565350", +"A$ c #BEBEBE", +"B$ c #A0A1A1", +"C$ c #D6D7D9", +"D$ c #363434", +"E$ c #878582", +"F$ c #646260", +"G$ c #5B5957", +"H$ c #969798", +"I$ c #999696", +"J$ c #ACB0B5", +"K$ c #4E4948", +"L$ c #3F3A38", +"M$ c #525254", +"N$ c #C2C3C5", +"O$ c #71665D", +"P$ c #706F6C", +"Q$ c #817E7C", +"R$ c #D7D7D5", +"S$ c #999996", +"T$ c #999797", +"U$ c #979899", +"V$ c #959595", +"W$ c #918E8E", +"X$ c #424140", +"Y$ c #575452", +"Z$ c #D9DADA", +"`$ c #5C5956", +" % c #807E7A", +".% c #454242", +"+% c #B1B1B1", +"@% c #E1E1DF", +"#% c #8B8A89", +"$% c #9B9A9A", +"%% c #999798", +"&% c #999898", +"*% c #999896", +"=% c #9F9F9F", +"-% c #71706F", +";% c #5B5B5C", +">% c #AAAAA9", +",% c #C9CACC", +"'% c #D6D7D8", +")% c #6B6866", +"!% c #D1D1D1", +"~% c #767371", +"{% c #7A7977", +"]% c #9D9C9C", +"^% c #999796", +"/% c #A3A09E", +"(% c #D4D4D2", +"_% c #5B5855", +":% c #4B4A49", +"<% c #989898", +"[% c #312C29", +"}% c #918D8B", +"|% c #999899", +"1% c #BFC1C2", +"2% c #C3C4C0", +"3% c #CAC7C9", +"4% c #CDCDCD", +"5% c #7B7776", +"6% c #4E4E4D", +"7% c #6A6866", +"8% c #585859", +"9% c #5D5958", +"0% c #949393", +"a% c #464240", +"b% c #BBBBBB", +"c% c #CAC7C6", +"d% c #DADBDB", +"e% c #ABABAB", +"f% c #474543", +"g% c #5E5C5B", +"h% c #81807F", +"i% c #484746", +"j% c #B5B5B5", +"k% c #D0D1CE", +"l% c #CCCACC", +"m% c #514D4B", +"n% c #565251", +"o% c #A5A4A4", +"p% c #AFAFAF", +"q% c #C4C3C4", +"r% c #D6D6D6", +"s% c #6F6F6F", +"t% c #555250", +"u% c #C9C9C8", +"v% c #9D9E9F", +"w% c #969696", +"x% c #969695", +"y% c #949292", +"z% c #B7B5B6", +"A% c #DBDCDC", +"B% c #848382", +"C% c #464441", +"D% c #626261", +"E% c #6D6A68", +"F% c #C3C4C1", +"G% c #C6C3C0", +"H% c #999999", +"I% c #949290", +"J% c #B3B1AD", +"K% c #B1B0B5", +"L% c #B8B7B7", +"M% c #979494", +"N% c #4A4C4C", +"O% c #514F4C", +"P% c #807F7E", +"Q% c #939291", +"R% c #929193", +"S% c #918F8C", +"T% c #918E8C", +"U% c #8A8987", +"V% c #B0B3B4", +"W% c #ACAEA8", +"X% c #B7B5B5", +"Y% c #4E4B4A", +"Z% c #454546", +"`% c #979693", +" & c #C2C3C4", +".& c #848788", +"+& c #8D9193", +"@& c #908D8B", +"#& c #8D8D8B", +"$& c #898788", +"%& c #7E7E7E", +"&& c #A2A09E", +"*& c #A5A3A1", +"=& c #AEAFAE", +"-& c #AFB0AF", +";& c #888786", +">& c #4A4645", +",& c #3C3A39", +"'& c #9D9E9E", +")& c #B7B5AF", +"!& c #AEADAA", +"~& c #8B8C8C", +"{& c #888788", +"]& c #888784", +"^& c #838281", +"/& c #A09E9D", +"(& c #A4A1A1", +"_& c #ACACA7", +":& c #6F6E6D", +"<& c #555453", +"[& c #383434", +"}& c #ACACAC", +"|& c #BABABA", +"1& c #A8A7A7", +"2& c #838585", +"3& c #A09E9B", +"4& c #A0A19F", +"5& c #575655", +"6& c #676663", +"7& c #434141", +"8& c #A9A9A7", +"9& c #6E6B69", +"0& c #9D9D9D", +"a& c #A49E9B", +"b& c #A7A5A3", +"c& c #555556", +"d& c #545251", +"e& c #505253", +"f& c #58595A", +"g& c #4F4E4E", +"h& c #4B4B4C", +"i& c #494B4C", +"j& c #4F4D4C", +"k& c #545351", +"l& c #575756", +"m& c #605F5E", +"n& c #626160", +"o& c #676363", +"p& c #6E6A6A", +"q& c #2B2A29", +"r& c #3F4144", +"s& c #9A9A9A", +"t& c #B9B9B9", +"u& c #A2A3A1", +"v& c #ADADAD", +"w& c #7B7C7E", +"x& c #969797", +"y& c #A09B9B", +"z& c #A9A8A3", +"A& c #7C6653", +"B& c #775232", +"C& c #765132", +"D& c #805634", +"E& c #865C37", +"F& c #836142", +"G& c #795C45", +"H& c #66635F", +"I& c #645F5E", +"J& c #615E5C", +"K& c #5C5857", +"L& c #5A5A5B", +"M& c #505052", +"N& c #504D4C", +"O& c #444240", +"P& c #453F3A", +"Q& c #464341", +"R& c #454341", +"S& c #454240", +"T& c #4D4640", +"U& c #464443", +"V& c #474544", +"W& c #4E4C4A", +"X& c #5E4C3E", +"Y& c #5A483B", +"Z& c #5B493C", +"`& c #9C9085", +" * c #9A9A99", +".* c #7F7C7E", +"+* c #7F7C7D", +"@* c #A3A3A1", +"#* c #8D5123", +"$* c #945622", +"%* c #975A24", +"&* c #A05E2A", +"** c #A9632F", +"=* c #B26732", +"-* c #B76538", +";* c #C27038", +">* c #BC7642", +",* c #B68358", +"'* c #898784", +")* c #888382", +"!* c #928980", +"~* c #54504F", +"{* c #62605E", +"]* c #4F4B49", +"^* c #4C4947", +"/* c #7E7A79", +"(* c #837E79", +"_* c #878281", +":* c #908C8A", +"<* c #908D8D", +"[* c #8A8988", +"}* c #C77636", +"|* c #C37539", +"1* c #BE7137", +"2* c #BC6930", +"3* c #A9642F", +"4* c #A55B21", +"5* c #B7B7B5", +"6* c #AEAEAA", +"7* c #7B7978", +"8* c #9F9C9C", +"9* c #AEA498", +"0* c #8A542A", +"a* c #925523", +"b* c #995622", +"c* c #A65D25", +"d* c #B6642C", +"e* c #C06E31", +"f* c #C27034", +"g* c #CA7A38", +"h* c #CF7B39", +"i* c #CF7C3D", +"j* c #423F3E", +"k* c #3C3937", +"l* c #A88059", +"m* c #C47A43", +"n* c #CA7A39", +"o* c #CA7738", +"p* c #C47336", +"q* c #C06E34", +"r* c #B66A2C", +"s* c #B66829", +"t* c #A65A1E", +"u* c #BEBEC1", +"v* c #AAA5A5", +"w* c #959494", +"x* c #9B9B99", +"y* c #9E9D9D", +"z* c #B7B4AE", +"A* c #875C35", +"B* c #905222", +"C* c #935322", +"D* c #9C5722", +"E* c #AE6023", +"F* c #B76525", +"G* c #C26E2C", +"H* c #CF7B38", +"I* c #D17B38", +"J* c #D17E39", +"K* c #CE803F", +"L* c #928F8C", +"M* c #797876", +"N* c #464342", +"O* c #413D3B", +"P* c #867A70", +"Q* c #C37B37", +"R* c #CA7C39", +"S* c #CF7A37", +"T* c #CA7634", +"U* c #C27230", +"V* c #BE6E2C", +"W* c #B66A29", +"X* c #A95C20", +"Y* c #A8A6A4", +"Z* c #9B9898", +"`* c #A4A4A5", +" = c #875C36", +".= c #874E21", +"+= c #8A5222", +"@= c #915322", +"#= c #A65D23", +"$= c #AE6024", +"%= c #C06E2C", +"&= c #C27031", +"*= c #CB7934", +"== c #D17B39", +"-= c #CF7E3F", +";= c #B87135", +">= c #8F8C8C", +",= c #474644", +"'= c #4D4A48", +")= c #C47B39", +"!= c #CF7C39", +"~= c #CF7A34", +"{= c #C77330", +"]= c #B76829", +"^= c #B46324", +"/= c #C4C6C9", +"(= c #9D9B9B", +"_= c #939190", +":= c #626465", +"<= c #6A6B6D", +"[= c #827F7D", +"}= c #968E8E", +"|= c #9B9797", +"1= c #B7B5B8", +"2= c #7C4D27", +"3= c #875022", +"4= c #A15722", +"5= c #B66424", +"6= c #CF7E3E", +"7= c #C26F2D", +"8= c #41403F", +"9= c #444241", +"0= c #565351", +"a= c #C77533", +"b= c #AC6122", +"c= c #8B5022", +"d= c #9FA0A0", +"e= c #6B7071", +"f= c #757574", +"g= c #A28484", +"h= c #C5BCBB", +"i= c #D3534D", +"j= c #7A4522", +"k= c #874D22", +"l= c #894D22", +"m= c #C87B3B", +"n= c #403E3C", +"o= c #3F3E3E", +"p= c #4C4847", +"q= c #AE672D", +"r= c #C07B39", +"s= c #A05C23", +"t= c #AEB0B1", +"u= c #9C9A9A", +"v= c #999795", +"w= c #8E8D8A", +"x= c #847F7A", +"y= c #C6403A", +"z= c #CA2934", +"A= c #7C4319", +"B= c #884A22", +"C= c #8A4D22", +"D= c #915022", +"E= c #9B5522", +"F= c #A65A23", +"G= c #C27030", +"H= c #D17A37", +"I= c #C17437", +"J= c #4D4847", +"K= c #44403E", +"L= c #BA7939", +"M= c #975521", +"N= c #834619", +"O= c #B6B3AE", +"P= c #AEAEAD", +"Q= c #A2A0A0", +"R= c #9A9998", +"S= c #96918B", +"T= c #8C8484", +"U= c #6C6D6A", +"V= c #73685F", +"W= c #A6423D", +"X= c #D14442", +"Y= c #E46665", +"Z= c #E47576", +"`= c #915023", +" - c #935222", +".- c #9C5622", +"+- c #C77331", +"@- c #D07E3F", +"#- c #605D5A", +"$- c #474441", +"%- c #474746", +"&- c #3D3836", +"*- c #453E39", +"=- c #B87032", +"-- c #9C5D23", +";- c #935622", +">- c #80491D", +",- c #7B4D26", +"'- c #875D37", +")- c #B6ADA4", +"!- c #A19C9A", +"~- c #776F69", +"{- c #877564", +"]- c #BD2422", +"^- c #E56A70", +"/- c #934F22", +"(- c #9C5522", +"_- c #9E5723", +":- c #D17B3A", +"<- c #D07C38", +"[- c #585654", +"}- c #45423F", +"|- c #C16F2D", +"1- c #C27D3E", +"2- c #9C5D22", +"3- c #7E4C1E", +"4- c #63391B", +"5- c #C2362A", +"6- c #DC5853", +"7- c #E49E91", +"8- c #9E4025", +"9- c #9D5723", +"0- c #D17A38", +"a- c #D17A39", +"b- c #CE7A3F", +"c- c #686561", +"d- c #524F4E", +"e- c #46403B", +"f- c #9D9186", +"g- c #B27943", +"h- c #CF7E3A", +"i- c #995722", +"j- c #74461E", +"k- c #673B1B", +"l- c #7B481D", +"m- c #834C21", +"n- c #884F21", +"o- c #844E20", +"p- c #AE6022", +"q- c #CFAFB5", +"r- c #A15723", +"s- c #AE5D23", +"t- c #D17A3A", +"u- c #BB8051", +"v- c #474241", +"w- c #3D3A38", +"x- c #897563", +"y- c #CD7B3F", +"z- c #53321A", +"A- c #72431B", +"B- c #79431C", +"C- c #814D1F", +"D- c #8A5224", +"E- c #945828", +"F- c #975E28", +"G- c #935A29", +"H- c #CB3438", +"I- c #9C531D", +"J- c #AE5D25", +"K- c #AE6026", +"L- c #CB7A39", +"M- c #CC7A3F", +"N- c #494544", +"O- c #3B3531", +"P- c #696766", +"Q- c #9C7550", +"R- c #D17A34", +"S- c #814C1E", +"T- c #6A3D1A", +"U- c #75461C", +"V- c #935826", +"W- c #B86E32", +"X- c #CB7938", +"Y- c #D07838", +"Z- c #AE5E27", +"`- c #AE6029", +" ; c #B76531", +".; c #C07034", +"+; c #CB7936", +"@; c #CC7939", +"#; c #66615F", +"$; c #4B4947", +"%; c #3A3635", +"&; c #D17A36", +"*; c #BE6A31", +"=; c #935623", +"-; c #8F5122", +";; c #56341A", +">; c #72461C", +",; c #79461D", +"'; c #CD7A39", +"); c #D07C3B", +"!; c #9B5D27", +"~; c #94542B", +"{; c #9C5E2E", +"]; c #AF6134", +"^; c #B76A37", +"/; c #C27237", +"(; c #CA7638", +"_; c #C97B39", +":; c #3E3937", +"<; c #3E3C3A", +"[; c #A77243", +"}; c #CB7739", +"|; c #CA7636", +"1; c #BE6A34", +"2; c #B56933", +"3; c #A85E2E", +"4; c #9A5926", +"5; c #7B5326", +"6; c #614734", +"7; c #643D1B", +"8; c #75431C", +"9; c #81481E", +"0; c #8A5324", +"a; c #AD652C", +"b; c #D17E3F", +"c; c #D6803F", +"d; c #B35D32", +"e; c #614736", +"f; c #604635", +"g; c #9C6436", +"h; c #AA7241", +"i; c #CA7937", +"j; c #7B5D46", +"k; c #47494C", +"l; c #3C3736", +"m; c #474646", +"n; c #403F3E", +"o; c #35312E", +"p; c #D27D39", +"q; c #C77C39", +"r; c #654126", +"s; c #3D3C3E", +"t; c #56351B", +"u; c #D9813F", +"v; c #D98242", +"w; c #C95B3C", +"x; c #B65D34", +"y; c #835734", +"z; c #454547", +"A; c #35312F", +"B; c #403A35", +"C; c #4F4033", +"D; c #504034", +"E; c #45413F", +"F; c #4D4641", +"G; c #403C3B", +"H; c #2D2925", +"I; c #413B36", +"J; c #2C2824", +"K; c #2B2927", +"L; c #333231", +"M; c #3C3C3D", +"N; c #3B3938", +"O; c #3A3938", +"P; c #57391B", +"Q; c #884E1F", +"R; c #A46028", +"S; c #AF6A30", +"T; c #CD7E3A", +"U; c #D7813F", +"V; c #B86A34", +"W; c #B66734", +"X; c #A46134", +"Y; c #312F2C", +"Z; c #2E2E2E", +"`; c #0E0D0C", +" > c #1B1B1B", +".> c #262626", +"+> c #232324", +"@> c #3A3B3C", +"#> c #39342F", +"$> c #373231", +"%> c #3D3733", +"&> c #403935", +"*> c #423C37", +"=> c #464340", +"-> c #2C2825", +";> c #232223", +">> c #2F2B27", +",> c #454340", +"'> c #403730", +")> c #322D29", +"!> c #312C28", +"~> c #2F2A27", +"{> c #363331", +"]> c #282726", +"^> c #030303", +"/> c #1F1E1E", +"(> c #412618", +"_> c #57391C", +":> c #7A461C", +"<> c #A46029", +"[> c #D3803F", +"}> c #D98D4B", +"|> c #DA8A4B", +"1> c #CC593E", +"2> c #C16B37", +"3> c #B96A36", +"4> c #B66A34", +"5> c #AD6A32", +"6> c #54361F", +"7> c #171616", +"8> c #201E1E", +"9> c #292726", +"0> c #2A2623", +"a> c #302E2B", +"b> c #373533", +"c> c #22201E", +"d> c #282523", +"e> c #332F2D", +"f> c #2F2C2A", +"g> c #2B2929", +"h> c #201D1B", +"i> c #3F3E3D", +"j> c #4A4C4D", +"k> c #353434", +"l> c #1E1C1B", +"m> c #57361C", +"n> c #B66E31", +"o> c #D37F3F", +"p> c #D78948", +"q> c #DA8E4F", +"r> c #DA8E51", +"s> c #DA8D4F", +"t> c #D9894B", +"u> c #DB803B", +"v> c #CD753D", +"w> c #CB7037", +"x> c #C06F36", +"y> c #B96F34", +"z> c #B66A33", +"A> c #B56A31", +"B> c #795231", +"C> c #1E1C1A", +"D> c #444444", +"E> c #373737", +"F> c #0A0909", +"G> c #090808", +"H> c #080707", +"I> c #080808", +"J> c #333131", +"K> c #302724", +"L> c #4F2E19", +"M> c #5F361C", +"N> c #72431C", +"O> c #A4642A", +"P> c #DA9154", +"Q> c #DA8D50", +"R> c #D78245", +"S> c #D37F3E", +"T> c #CC793A", +"U> c #CB7637", +"V> c #CA7237", +"W> c #9B6234", +"X> c #2D2926", +"Y> c #292420", +"Z> c #232020", +"`> c #29241F", +" , c #28231F", +"., c #2B2724", +"+, c #261F1D", +"@, c #26221F", +"#, c #2E2C2A", +"$, c #38312B", +"%, c #221E1C", +"&, c #1D1A18", +"*, c #1E1A17", +"=, c #282421", +"-, c #2A2523", +";, c #2D2823", +">, c #2F2623", +",, c #512F19", +"', c #A7642B", +"), c #DA9151", +"!, c #D9894F", +"~, c #D37A3E", +"{, c #B66A31", +"], c #A4622D", +"^, c #3D3C3C", +"/, c #2C2C2B", +"(, c #383634", +"_, c #373432", +":, c #333232", +"<, c #3A3A39", +"[, c #3A3736", +"}, c #343231", +"|, c #413F3E", +"1, c #484443", +"2, c #444445", +"3, c #494645", +"4, c #2B2521", +"5, c #827E79", +"6, c #894F22", +"7, c #764924", +"8, c #774924", +"9, c #714725", +"0, c #6A4326", +"a, c #6A4226", +"b, c #6C4125", +"c, c #6A3F21", +"d, c #673A22", +"e, c #533624", +"f, c #72461D", +"g, c #CA7637", +"h, c #B86E33", +"i, c #A7642C", +"j, c #36322F", +"k, c #3F3630", +"l, c #3F362F", +"m, c #403831", +"n, c #413831", +"o, c #413932", +"p, c #514135", +"q, c #504134", +"r, c #34302E", +"s, c #B46C2C", +"t, c #B16529", +"u, c #A85E26", +"v, c #9C5A23", +"w, c #8A5023", +"x, c #894E23", +"y, c #834D23", +"z, c #7B4D23", +"A, c #754622", +"B, c #714621", +"C, c #71411F", +"D, c #6A3A1E", +"E, c #54311A", +"F, c #824A1E", +"G, c #D98950", +"H, c #D88745", +"I, c #B86E2F", +"J, c #A66734", +"K, c #714524", +"L, c #724621", +"M, c #724620", +"N, c #734622", +"O, c #7B4723", +"P, c #854E23", +"Q, c #8E5224", +"R, c #9B5924", +"S, c #A65B29", +"T, c #B3622A", +"U, c #B66832", +"V, c #BF6E33", +"W, c #978474", +"X, c #312A25", +"Y, c #B96B2A", +"Z, c #B76A29", +"`, c #915222", +" ' c #834D21", +".' c #7B4D21", +"+' c #75461F", +"@' c #71431E", +"#' c #6A3A1B", +"$' c #57311A", +"%' c #894E21", +"&' c #935723", +"*' c #AE672F", +"=' c #DA8D51", +"-' c #D98F50", +";' c #D8894F", +">' c #AF6E2F", +",' c #AA652D", +"'' c #7B4821", +")' c #834D22", +"!' c #A65A24", +"~' c #B66530", +"{' c #BE6A33", +"]' c #C77335", +"^' c #CC7938", +"/' c #D77F39", +"(' c #42403E", +"_' c #1B1513", +":' c #6C6967", +"<' c #C07030", +"[' c #BE6A2A", +"}' c #79491F", +"|' c #71431C", +"1' c #512E19", +"2' c #D98D51", +"3' c #A6652C", +"4' c #784921", +"5' c #79461E", +"6' c #A65A22", +"7' c #C27231", +"8' c #34312E", +"9' c #1D1B1B", +"0' c #787775", +"a' c #75461E", +"b' c #71461C", +"c' c #71411B", +"d' c #4E2C18", +"e' c #A7672F", +"f' c #B96E30", +"g' c #7B481E", +"h' c #D27B39", +"i' c #282524", +"j' c #656362", +"k' c #25221F", +"l' c #6D6B69", +"m' c #AD672B", +"n' c #BE6A2B", +"o' c #995723", +"p' c #79461F", +"q' c #703A1B", +"r' c #5D351B", +"s' c #6A3F1B", +"t' c #824A1F", +"u' c #9C5828", +"v' c #CD7A3F", +"w' c #D27B38", +"x' c #CC7A3D", +"y' c #241D1B", +"z' c #AD682C", +"A' c #8A5021", +"B' c #7B491F", +"C' c #79481E", +"D' c #5A341B", +"E' c #AF672C", +"F' c #884F23", +"G' c #C47837", +"H' c #383532", +"I' c #4E4B49", +"J' c #1C1816", +"K' c #B4B1B0", +"L' c #935525", +"M' c #A9652C", +"N' c #B86A2A", +"O' c #B86A29", +"P' c #814A1F", +"Q' c #4F2D18", +"R' c #A5652C", +"S' c #D27E3F", +"T' c #9F5F28", +"U' c #C47937", +"V' c #A7662C", +"W' c #322F2C", +"X' c #3E3D3C", +"Y' c #221E1A", +"Z' c #302B28", +"`' c #915828", +" ) c #A7682C", +".) c #894E22", +"+) c #5D351A", +"@) c #CF7A3F", +"#) c #B97036", +"$) c #B66F33", +"%) c #AA662D", +"&) c #6E431D", +"*) c #B97537", +"=) c #A7672E", +"-) c #B8AFA6", +";) c #3D3A39", +">) c #241D1A", +",) c #8A4D1F", +"') c #A36C30", +")) c #B86A2C", +"!) c #55331A", +"~) c #AD6830", +"{) c #CB7B39", +"]) c #B97438", +"^) c #302B29", +"/) c #353433", +"() c #36312E", +"_) c #9C642C", +":) c #AE6E30", +"<) c #9C5A22", +"[) c #81491E", +"}) c #58361B", +"|) c #B96E33", +"1) c #BE6F36", +"2) c #AA682E", +"3) c #9B5723", +"4) c #70451E", +"5) c #C77E39", +"6) c #B17737", +"7) c #2F2A25", +"8) c #4A4746", +"9) c #272522", +"0) c #9E9FA1", +"a) c #8B8D8F", +"b) c #A46E36", +"c) c #B86E2C", +"d) c #81491F", +"e) c #52311A", +"f) c #61371B", +"g) c #8A5223", +"h) c #BE7036", +"i) c #AD6A2C", +"j) c #A8642B", +"k) c #6E421D", +"l) c #C47839", +"m) c #AA7343", +"n) c #42352B", +"o) c #25211F", +"p) c #8C6F51", +"q) c #B66E30", +"r) c #B76E2C", +"s) c #79491E", +"t) c #74431C", +"u) c #81481F", +"v) c #BE6F33", +"w) c #B96E2C", +"x) c #AD672C", +"y) c #6B401C", +"z) c #A45823", +"A) c #AA7342", +"B) c #2B2825", +"C) c #57361B", +"D) c #583419", +"E) c #71451F", +"F) c #885022", +"G) c #8A5323", +"H) c #A7652A", +"I) c #AF682C", +"J) c #AD642C", +"K) c #9C5E2A", +"L) c #744520", +"M) c #CB7B3A", +"N) c #312D2B", +"O) c #292625", +"P) c #866944", +"Q) c #B76E31", +"R) c #935122", +"S) c #71411E", +"T) c #71421E", +"U) c #6A3A1C", +"V) c #5F381B", +"W) c #4C2E1A", +"X) c #462919", +"Y) c #1A1412", +"Z) c #27211E", +"`) c #321F15", +" ! c #513923", +".! c #7E4B21", +"+! c #865323", +"@! c #9B5B26", +"#! c #9C5E29", +"$! c #A5612C", +"%! c #A7652E", +"&! c #A8652D", +"*! c #AF6A2F", +"=! c #B76A30", +"-! c #B86B31", +";! c #AF6A31", +">! c #A5652D", +",! c #965B2A", +"'! c #734927", +")! c #463123", +"!! c #724820", +"~! c #74461D", +"{! c #39312B", +"]! c #312D2A", +"^! c #665743", +"/! c #A46531", +"(! c #B6652C", +"_! c #8E5122", +":! c #865022", +"~ c #111111", +",~ c #252525", +"'~ c #2F2F2F", +")~ c #2F2F2E", +"!~ c #2A2A2A", +"~~ c #201F1F", +"{~ c #222221", +"]~ c #313130", +"^~ c #272727", +"/~ c #3F3F3F", +"(~ c #292928", +"_~ c #181715", +":~ c #383939", +"<~ c #262525", +"[~ c #221F1F", +"}~ c #252322", +"|~ c #26201D", +"1~ c #4F2F1B", +"2~ c #764B28", +"3~ c #94612E", +"4~ c #B87537", +"5~ c #9C6939", +"6~ c #B8733E", +"7~ c #514E4D", +"8~ c #130E0C", +"9~ c #332926", +"0~ c #1A1311", +"a~ c #191311", +"b~ c #23201F", +"c~ c #3A3A3B", +"d~ c #2A2A2B", +"e~ c #1E1D1C", +"f~ c #282828", +"g~ c #131312", +"h~ c #131211", +"i~ c #2B2A2A", +"j~ c #252424", +"k~ c #221D1A", +"l~ c #221A18", +"m~ c #422618", +"n~ c #332E2A", +"o~ c #443E39", +"p~ c #25201D", +"q~ c #5D5D5C", +"r~ c #13100F", +"s~ c #16100D", +"t~ c #2A2826", +"u~ c #262422", +"v~ c #282624", +"w~ c #454543", +"x~ c #161515", +"y~ c #29292A", +"z~ c #1B1A1C", +"A~ c #2B2826", +"B~ c #24201E", +"C~ c #1E1815", +"D~ c #1A1614", +"E~ c #322926", +"F~ c #464242", +"G~ c #201C19", +"H~ c #161210", +"I~ c #1C1614", +"J~ c #2E2B29", +"K~ c #525150", +"L~ c #282625", +"M~ c #110E0D", +"N~ c #353333", +"O~ c #1D1917", +"P~ c #16110E", +"Q~ c #373331", +"R~ c #6C6C6C", +"S~ c #303030", +"T~ c #2B2C2C", +"U~ c #3B3937", +"V~ c #353131", +"W~ c #474747", +" . ", +" + @ # $ ", +" % & * = - ", +" . ; > , ' ", +" ) ! > > ~ { ", +" ] ^ / ( _ : < ", +" [ } | * ( 1 2 3 ", +" 4 5 6 ( 7 8 9 0 ", +" a b 8 c ( * d e ", +" f g h > ( i j k ", +" l m n _ ( 7 h o p ", +" q r j h s t * u r v ", +" w x u 1 ( ( _ 8 y z ", +" A } B u * ( 7 6 8 y C ", +" D j 8 / > E * h F G H ", +" I J K r 8 h c ( ( * n d L M ", +" N O P Q R S u 1 * E ( / 8 T U ", +" V W X Y Z ` .r ..h c ( E s 6 8 T +. ", +" @.W #.X $.%.&.*. =.S ..6 * ( E * h 8 -.;. ", +" >.$.#.#.,.,.'.). !.b 8 h i > ~.7 {.u 8 ].^. ", +" /.$.#.$.$.(.(.y _.:. <.S 8 6 c ( E [.}...8 |.1. ", +" 2.3.$.#.$.$.,.4.T 5.6. p y B h / > E ( s 1 7.T L 8. ", +" 9.#.,.0.,.a.a.b.T : c. d.d u 6 c 7 E ( c e.7.T f. ", +" g.h.#.,.#.i.,.a.j.b.k.l.m. { n.8 u / * ( ~.> / u ..j.o. ", +" p.q.a.,.i.#.,.a.F F T r.s. t.T 8 e.{.u.( ( * / u v.w.x. ", +" y.z.i.#.a.i.,.a.A.j.F j.r B.C. D.T ..6 * ( E ( * / u 8 G E. ", +" F.i.i.i.i.G.,.a.j.j.8 v.o H.I. J.K...6 L.( E 7 {.6 u S M.N. ", +" O.h.i.i.P.P.Q.,.4.j.F 7.R.j S.T. U.T ..}.7 E E 7 c / n w.c.V. ", +" W.i.i.i.i.i.$.,.4.j.B R.X.Y.Z.`. +T ...+( E ( > c 1 8 r ++ ", +" @+#+i.i.$+%+G.,.,.A.d &+*+u.R.S.=+ -+d u _ ( E ( > c 1 8 S.;+ ", +" >+,+i.%+%+%+q.a.a.b.b.R.u.'+)+!+;+ ~+T ..c E E ( > _ e.k.{+]+ ", +" ^+/+%+%+%+i.i.,.a.j.B R.'+(+u._+:+ <+T ..c E E ( [+_ 6 , }+ ", +" |+1+%+%+%+%+i.i.a.4.j.8 )+2+(+X.f. 3+4+5+ 6+k.d * t E ( > / n 7+8+ ", +" 9+0+a+%+%+%+i.a.,.4.d R.u.b+c+d+e+ f+g+h+i+j+ k+y ..* l+E ( s / 8 m+n+ ", +" o+p+a+a+a+i.X ,.a.-.q+X.'+b+r+s+t+ u+v+%+%+w+x+y+z+8 c A+E ( * 1 j f.B+ ", +" C+D+a+a+%+i.Q.,.4.j.n E+(+'+F+G+H+ I+P.P.J+F.K+L+a.B u.( ( c u d M+N+ ", +" O+P+Q+D+a+%+G.$.,.4.j.R.{.R+S+T+U+V+W+#.,.4.(.4.4.4.4.4.Y.{._ h n X+Y+ ", +" Z+`+ @D+D+%+G.#.,.4.F j.$.G.G.W .@4.-.j.F F v.v.8 B d T -.7.{.[++@@@ ", +" #@$@%@%@D+i.q.,.(.(.P.%+X ,.4.j.F v.v...7.&@{.> t '+'+{.v.*@c =@-@ ", +" ;@>@,@'@'@D+i.#.#.P.%+#.(.j.F )@!@~@7.{@n &@R+*+u.(+(+(+{.F q+]@^@ ", +" /@(@_@'@a+i.%+G.#.4.j.v.v.~@7.&@:@<@[@[@}@|@1 i )+u.R+n 7.1@2@ ", +" 3@4@_@_@'@0.i.$.-.S 5@6@7.&@7@[@}.}.8@.+9@0@a@b@c@d@d@d@Y.e@f@ ", +" g@h@'@_@a+i.$.4.F v.~@7.&@i@}.}..+c c c c c c c c c j@i }.d@k@l@ ", +" m@n@_@'@0.Q.4.j.o@~@7.:@i@}..+c c c c * * * * * c c c c .+}.p@q@ ", +" r@s@t@u@v@,.F v.~@7.:@i@i c c c c w@x@x@x@x@x@w@* y@c c z@A@B@C@ ", +" D@E@F@G@-.v.H@7.:@i@i c c c * x@x@x@s [+[+I@x@x@w@J@K@c c L@M@N@ ", +" O@P@F 8 7.Q@R@S@T@c K@* x@s [+U@L.L.U@U@U@V@W@_ X@Y@Z@_ `@ # ", +" .#: B 7.7.R@}.T@c K@J@x@I@L.L.+#+#+#+#+#@#E (+(+c+u.##* $#%# ", +" &#*#q+7.n d@B@_ =#-#;#>#U@L.+#,#'#)#)#!#~.~#{#{#{#]#'+##^#/# ", +" (#, B ..}.t _#(+u.##:#L.L.+#'#)#)#)#)#<#b+{#{#{#{#{#]#t [#}# ", +" |#n.8 X.(+{#{#{#1#t 2#3#4#'#)#)#5#6#6#~.]#{#{#{#{#{#{#(+)+7# ", +" }+, *@b+{#{#{#{#{#]#~.8#)#)#)#6#6#6#9#(+{#{#{#{#{#{#{#{#( 0#a# ", +" b#c#E+]#{#{#{#{#{#{#d#E e#f#5#6#g#h#A+d#{#{#{#{#{#{#{#{#c+i#j# ", +" k#~ '+{#{#{#{#{#{#{#{#b+)#l#g#g#m#n#o#]#{#{#{#{#{#{#{#{#(+p#q# ", +" r#r 2+{#{#{#{#{#{#{#{#{#c+s#t#t#h#u#c+{#{#]#{#{#{#{#{#{#1#*+v# ", +" w#S 2+{#{#{#{#{#{#{#{#{#d#x#y#z#A#A+(+]#B#C#D#E#{#{#{#{#]#F#G# ", +" H#I#'+{#{#{#{#{#{#J#~#{#{#c+K#z#h#A+(+L#M#N#N#O#{#{#{#{#{#P#Q#R# ", +" S#w.'+{#{#{#{#]#B#%@T#U#{#(+)#6#z#z#c+V#M#M#N#W#{#{#{#{#{#X#Y#Z# ", +" `#*#P#{#{#{#{# $M#N#.$+${#(+)#6#( 7 u.@$#$$$%$&${#{#{#{#{#*$P#=$-$ ", +" ;$G >$1#{#{#{#,$M#M#N#'${#(+> E+E+)$>$*$1#!$~${#{#{#{#{#]#{$]$^$/$ ", +" ($_$:$E#{#{#{#1#<$_@[$}${#'+)$P#|$X#'+*$@${#{#{#{#{#{#{#{#1$_#{$2$3$ ", +" 4$5$E+_#{#{#{#{#]#1$~${#_#X#*$6$&$1$J#1$1$7$E#~#{#{#{#{#~$7$7$7$8$9$ ", +" 0$a$]$*${#{#{#{#{#{#{#E#6$1$7$7$J#b$b$1$1$!$!$!$1$J#7$7$@$J#7$7$E#c$d$ ", +" e$f$2+*$~${#{#{#{#{#E#@$7$1$!$&$U#g$}$ $ $ $L#L#L#,$h$,$i$i$&$&$1$J#j$k$ ", +" l$m$_#_#@${#{#{#1#7$1$_#g$ $,$,$h$ $i$i$i$}$g$g$g$}$i$h$n$o$o$<$p$7$q$r$ ", +" s$t$7$J#J#7$E#E#!$}$,$h$V#h$ $g$!$7$~$~#~#1#1#1#1#~#1#E#}$n$u$v$T#w$E#x$y$ ", +" z$A$7$@$J#J#&$i$B$n$o$o$n$,$g$7$~$~$~$~$~$~$~$~$~$E#E#C$ $o$W#v$D$W#&$J#E$F$ ", +" G$q$J#J#1$}$n$H$H$I$o$o$o$B$,$J$,$i$i$L#L#i$i$}$i$i$,$o$o$o$K$v$L$M$,$E#N$O$P$ ", +" Q$R$E#1$,$I$I$H$I$o$o$I$o$I$S$T$T$T$T$o$S$o$S$S$U$V$T$o$o$W$X$v$L$Y$V#Z$7$V#`$ % ", +" .%+%@%g$#%I$o$T$$%o$T$o$%%o$&%*%&%o$o$o$o$o$o$&%o$&%o$o$o$=%-%v$%$X$;%>%U#,%'%p$r$ ", +" )%!%7$~%T#{%]%%%o$o$o$o$I$&%I$I$I$^%I$%%o$&%&%&%&%&%o$o$&%/%O#v$D$'$<$i$U#&$(% $_% ", +" :%<%~$}$+$[%X$}%|%o$o$o$%%%%&%&%%%&%o$o$%%o$%%%%%%o$&%o$o$&%I$4$%$L$K$u$1%2%3%4%J#5%6% ", +" 7%8%&$J#V#'$T#v$9%$%o$o$o$o$o$o$o$o$&%o$&%%%&%&%%%&%o$&%o$o$*%0%L$T#a%#$n$b%g$U#c%d%e%f% ", +" g%h%J#1$h$D#L$T#D$u$]%o$o$o$%%&%&%%%%%&%%%%%%%^%^%%%^%^%&%&%T$#%T#L$i%u$j%i$}$g$U#k%l%m% ", +" n%o%C$!$i$W#X$D$%$4$o$o$o$&%%%%%%%%%%%%%^%^%I$I$I$I$I$I$*%^%V$<$%$'$<$,$p%L#i$g$g$q%r%-% ", +" s%t%g$1$u%U#u$K$L$%$%${%v%%%%%^%I$I$I$I$^%I$w%w%I$w%x%x%0%x%0%y%Y$D$9%o$+%,$,$z%i$g$g$A%B%C% ", +" D%E%1$!$F%G%h$;%'$T#v$K$H$H%I$I$w%w%w%w%x%x%x%0%0%0%0%0%0%0%W$I%4$a%I$J%h$,$,$,$K%L%L%7$M%N% ", +" O%P%J#&$2%g$b%#%Y$'$T#%${%o$Q%0%0%0%0%R%R%R%S%T%T%T%T%W$T%T%#%U%i%{%V%V#h$h$h$W%,$X%X%@$M%Y% ", +" Z%`%7$ &g$}$i$+%.&#$'$T#'$+&@&}%}%}%#&#&#%#%#%#%#%#%#%#%#%#%$&%&+$&&*&V#V#V#h$h$h$=&-&1$;&>& ", +" ,&'&J#G%g$i$)&,$!&.&Y$a%%$<$0%~&#%#%#%#%#%#%#%#%#%{&{&{&{&]&B%^&<$/&n$(&V#V#V#V#V#h$_&&$:&<& ", +" [&}&J#|&}$i$)&,$h$1&I$<$L$'$#%#%#%#%$&$&{&.&.&B%B%B%B%B%B%u$u$2&{%o$3&n$n$n$4&n$(&V#V#i$5&6& ", +" 7&8&J#|&L%,$,$h$h$V#1&o%{%L$9&#%B%B%B%u$u$u$u$u$u$u$u$u$u$u$u$u$u$0&o$o$o$o$o$o$a&n$b&B$M$c&d&e&f&g&h&i&j&k&l&m&n&o&p&-% ", +" q&r&s&J#t&i$,$h$h$V#V#V#u&v&{%Y$u$u$u$u$u$u$u$u$u$u$u$u$u$u$p$w&u$u$x&o$o$o$o$o$o$o$y&z&A&B&B&C&D&E&F&Q#G&G&H&I&J&K&L&K&5&M&N& ", +" O&P&Q&R&S&T&U&V&W&N&#@#@X&Y&Z&g+`&7$j%,$h$V#V#V#V#(&4&0& *<${%u$u$u$u$u$.*w&+*{%u${%{%B#{%{%{%{%}%&%o$o$o$o$o$o$@*]$#*$*%*&***=*-*;*>*,*'*.&)*'*'*#%!*)*~*{* ", +" ]*^*/*(*_*_*:*:*<*[*>*}*|*1*2*3*4*)+!$5*6*h$V#(&4&4&4&o$o$o$u${%7*{%{%{%{%{%{%{%B#~%{%{%9&-%{%{%B#u$x%&%o$o$o$o$8*9*0*a*b*d@c*d*e*f*g*h*i*P#W$.&'*u$'*)*'*E%j* ", +" k*/*o$o$o$w$w$H$+&l*m*n*o*p*q*r*s*t*{$u*v*V#4&o$o$o$o$o$o$o$}%{%{%{%{%B#{%{%{%{%-%<$B#B#~%B#~%-%B#{%w*%%x*o$&%y*z*A*B*C*D*B@E*F*G*@#H*I*J*K*> )$!*L*#%#%#%M*N* ", +" O*_*W$'*.&'*)*P*E+Q*R*H*S*T*U*V*W*X*)+!$Y*n$o$o$o$o$o$o$o$&%}%{%~%B#B#B#B#B#B#O#-%B#-%-%-%-%-%~%-%-%W$%%Z*x*`* $ =.=+=@=D*#=$=%=&=*=I*I*==-=;=)+|$w$o$0%w$>=f% ", +" ,='=.&.&'*#%'*>$.+* )=!=I*I*~={=G*]=^=h X#/=(=o$o$o$o$o$o$o$^%_=~%-%-%:=9&-%-%9&<$9&-%-%<$9&-%-%-%<=<=[=}=|=1=*$2=)@3=7.@=4=E*5=%=&=*=I*I*==6=7=a&L#V#V#V#n$M*8= ", +" 9=0='*H$H$I$H$o$E+T@)=H*I*I*S*a=G*]=5=b=c='+/=d=o$o$o$o$o$o$^%}%~%O#-%O#<$-%e=O#-%9&9&-%<=9&-%-%<=-%9&f=g=h=i=a.j=k=l=7.C*/ $=F*G*@#S*I*I*==m=c )+9* $,$V#-%K&n= ", +" o=p=:=W$h$V#V#X#X.q=r=H*I*I*I*@#G*##5=E*s=..P# $t=u=Z*o$o$o$v=w=-%O#O#-%-%<$<$O#-%-%9&-%-%-%<=-%-%e=-%-%x=i=y=z=A=B=C=D=E=F=$=W@G=@#H=I*I*==I=t X#9*i$o$#$L$J=n= ", +" O&K='$'$O#h$h$|$E+)+L=h*H*I*I*@#G*G*5=E*F=M=N=*@P#h$O=P=Q=R=S=T=-%<$-%e=U=-%U=e=<$-%O#e=-%<$e=e=~%V=W=e.X=Y=Z=Y=y=w.`= -.-#=5=W@+-*=H=I*==@-G*]$i$i$i$J$0%#-$-N* ", +" %-&-*-K$u$L# $i$L#|$=-)=I*I*I*~=@#G*5=E*--;-+=>-(.,-'-)$|$X#)-!-O#B#-%B#B#-%B#B#B#B#-%~-{-P*X.W=e.z=]-]-Y=^-Y=Z=Y=e./-(-_-#=F*%=@#*=H=I*:-<-)+E+w$h$h$,$i$L#K&[- ", +" }-Y$,$}$i$L#i$a&*+|-1-==I*I*I*@#G*F*E*2-;-H@5@3-4.W 4--.q+7.*@B&'-F#X.X.X.X.*+*+*+*+2#{=K#5-]-z=X=6-6-Y=Y=Y=Z=7-6-8-9-#=$=W@G*@#+#0-a-b-E+!*W$0%0%I$I$o$h$c-d- ", +" e--%L#h$n$n$o$f-#%P#g-h-==I*I*@#G*F*$=E*i-H@5@j-#.k-l-m-n-7.o-v.T j.d ..u h h 6 t*t*p-i Y.e.5-z=X=X=Y=Y=Y=Y=Z=q-^-e.r-s-$=W@G*@#+#,#t-u-B#p$u$u$u$.&#%!*0%c-v- ", +" w--%w$L*#%#%#%'*.&.&x-y-:-==I*@#&=W@F*E*D*7.5@A.z-A-B-C-7.7.D-E-F-G-7.,-v.q+q+7.*@7.Y.1 {.* H-z=H-X=6-Y=Y=Y=^-q-7-[.I-J-K-W@&=*=+#L-M-~-<$9&-%-%~%B#{%{%u$#$N- ", +" O-P-'*u$p${%{%-%~%B#e=Q-:-==I*R-@#%=F*E*D*~@S-#.T-U-F v.7.7.V-}.}._ c c W-x@x@x@[+L.+#+#X-Y-y=z=H-X=6-6-Y=Y=^-q-7-X=d@Z-`- ;.;+;X-@;)+#-#;c-#-c-<$9&O#-%~%j&$; ", +" %;0=B#O#-%-%U=<$<$c-:=V=y-==I*&;T**;`-c*=;-;A.;;>;,;v.~@7.V-}.i c c c * x@x@[+L.+#+#,#H*';);[.z=H-H-X=i=6-Y=Y=7-Z=[.!;~;{;];^;/;(;_;X.4$Y$9%9%9%#-#-#;c-c-:;d- ", +" <;:;c-#;#;W##-#-#-#$#$Y$[;};,#|;1;2;3;4;5;6;G.7;8;9;v.7.0;i@i a;c c * x@x@[+L.+#+#h*b;c;c;c;b-H-z=z=X=6-6-Y=^-^-^-[.d;e;a%f;f;g;h;i;j;k;4$+$4$4$D#M$#$#$D#l;m; ", +" n;o;#$#$Y$M$D#+$+$+$+$i%>$p;q;{.'-e;r;s;s;T#t;(.j.v.v.7.V-i@i c c * x@x@[+L.+#,#h-)#)#)#u;6#v;[.z=z=H-X=i=6-l+^-X=w;x;y;&-z;,&A;B;C;D;E;n@F;K$K$+$K$4$4$:;G; ", +" H;8=+$+$K$K$+$+$+$F;a%r;e;I;J;K;L;M;N;O;h+P;(.j.v.Q;0;R@R;.+c S;* x@x@L.+#,#T;)#)#U;6#6#6#6#6#X=z=z=H-X=6-6-X=X=V;W;X;Y;Z;`; >.>+>@>O;#>$>%>&>*>=>n@E;-> ", +" ;>>>,>i%'$'$n@'>)>!>~>{>g@]> ^>/>(>_>(.:>v.7.&@R@<>.+c * x@x@[+L.+#';[>)#U;6#6#g#6#}>6#|>6-H-z=z=H-y=1>2>3>4>5>6> 7>8>9>g@0>a>b> ", +" c>d>e>f>g>h>]>i>j>k> l>G.m>4.9;v.7.&@i@i .+c n>x@x@L.+#+#o>)#)#p>g#m#q>h#r>s>t>6#u>[.i=[.v>w>x>y>z>A>B>C> D>E> ", +" F>G>H>I> J>K>L>M>N>9;H@7.7@}.O>a;Z@x@x@I@L.+#,#c;)#5#g#m#h#h#A+P>h#Q>t>6#R>S>T>U>V>I@x@x@* W>X> ", +" Y>Z>`> ,.,0>+,@,#,$,->a>.,@,%,&, *,=,-,X>;,>,o;$+,,#.N>5@H@7.7@}.',a;Z@w@x@I@L.+#h*)#)#p>t>h#),A+A+A+P>h#!,6#5#)#~,+#U>[+x@x@{,],&-^,/, (,w-_, :,<,O;_,[,},9+|,n+1,1,2,$;3, ", +" 4,5&h%/*/*/*(*(*5,(*)$i R@7.7.6,S.7,8,9,0,a,b,c,d,e,Q.%+z-#.f,9;H@7.Y.}.',a;S;x@x@I@g,+#K#)#)#5#!,h#),A+A+A+A+),m#6#5#)#e#+#+#[+s x@h,i,0.j,k,l,m,n,o,n,D;m,o+p,p,E;o+o+q,n@$-n@$-$-n@$-E;r,3, ", +" )>0%o$0%w$L*0%L*0%+&P#s,t,u,v,d@w,x,y,z,A,B,C,D,,.,.#.i.E,#.f,F,7.7.7@}.',a;S;n>x@[+g,+#K#)#)#5#!,h#),A+A+A+A+h#G,H,)#)#e#+#+#[+x@x@I,J,,-K,L,M,N,O,P,Q,R,S,T,U,V,[+@#L.W,u$x=)*x=)*)*)*#%9&)> ", +" X,0=#%'*'*.&.&.&.&x=*+W@Y,Z,$=#=d@D*`,x, '.'+'@'4.#',.,.i.$'#.f,9;%'7.&'}.',*'* * x@[+L.+#K#)#)#5#g#='h#A+A+A+),-';'5#)#)#h-+#+#x>x@x@>','A.A.A.A.'')'7.;-!'`-~'{']'+#^'/'u.'*#%'*.&.&#%#%#%}%8=(' ", +" _':'#%.&'*)*u${-F#*@i <'['W@5=E*#=D*;-7.%'v.}'A.|'a.,.,.i.1'#.N>9; '7.7@}.i *'S;* x@[+L.+#+#)#)#f#6#t>2'h#h#h#Q>m#p>)#)#)#h-+#L.x>x@x@c 3'4'A.A.5'v.7.;-6'E*5=W@7'*=H=0-p;e#)+W,}%#%'*)*'*.&#%;%8' ", +" 9'0'I$W$L*0%0%)*'-..B@['['W@5=E*#=d@=;n %' '}'a'b'c',.,.i.d'#.N>F '7.&'}.i e'c * * s [++#+#b;)#)#5#g#g#!,!,m#g#p>f#)#)#)#';+#L.x>x@f'c }.A.A.A.g'v.7.D*6'E*W@G*@#+#I*I*h'+#x@i R.{-0%L*#%#%}%~%i'j' ", +" k'l'}%B$o$o$o$h$W,v.}.m'n'n'5=E*E*d@o'n %' '}'p'>;4.q',.Q.i.r's'F t'7.7.u'i e'c * * x@[+L.+#';)#)#)#5#5#p>p>p>5#f#)#)#)#v'+#L.[+x@x@y@c R@A.A.A.g'7.7.D*B@E*W@G**=H=w'I*I*x'c B@E+o$o$o$w$I$o$'*j,Z# ", +" y'~*c-0%V#h$h$!*&+d R@z'n'n'Z,E*E*F=D*;-A' 'B'C'f,4.c',.#.%+D',.,;9;7.7.Y.}..+c c * w@I@L.L.+#h*)#)#)#)#f#f#)#)#)#)#)#-=+#+#L.I@x@f'c E'F'A.A.A.C-7.`,D*p-E*W@G=*=H=w'I*H*G'* }.|$,$V#B$V#,$#%<$H'I' ", +" J'j&'$K$p$K',$|$)$X.L'M'N'N'O'E*p-6'D*;-7.%'P'C'A.4.4.,.#.i.Q'#.8;F '7.n }.R'c c c w@x@s L.L.+#';c;)#)#)#)#)#)#)#S'-=+#+#L.[+x@x@* c T'A.A.A.A.)'7.;-6'E*5=%=+-*=H=w'I*H*U'V'd@R+|$,$,$h$)*9%Y$W'X' ", +" Y'Z'4${%B$i$K'}$U#X#`' )N'O'O'$=p-6'D*;-7..)v.C'A.N>4.,.,.#.P.+)c'F q+7.7.}.}..+c c * x@x@x>L.L.+#';v')#)#)#)#S'@)';+#+#L.[+#)x@$)S;%)q+&)A.A.5'H@7.D*6'E*F*%=@#*=I*I*I*H**)=)P#X#9*-)i${%'$X$J= , ", +" ;)>)o$g$i$K'K'J$a&'-,)')r*))O'5=p-B@D*D*7..)v.B'a'N>4.,.,.#.i.!),.j.F 7.7.7.}..+.+c c * x@x@x>L.L.+#+#+#+#+#+#+#+#+#g,U@[+s x@x@* ~)R@A.A.A.A.g'.)7.D*B@E*W@G*@#~=I*I*h*{)])}.X#L#i$i$i$,$}%Y$^)/) ", +" ():;K'h$V#V#n$n$L*!*:$_):)V*V*F*p-B@<)D*7.7.v.[)C'f,4.a.,.,.i.i.})4.F q+7.7.Y.}..+.+c K@|)x@x@1)I@U@L.+#+#+#g,g,|;U@[+I@x>x@x@* 2)3)A.4)A.A.5'C-.)7.D*E*5=W@G=@#+#I*J*K#5)6)i *+X#,$,$,$i$}$V#7)8) ", +" 9)J=0)I$I$0%}%#%+&a)#%{-b)c)c)W*p-p-<)D*;-7. 'd)C'A.4.a.,.,.Q.i.e)f)8;F 7.7.g)}.}..+.+c y@|)x@x@x@h)[+[+[+[+U@U@[+I@x@x@x@w@i)j)Y.-.k)A.A.A.5'v..)@=D*E*F*W@&=@#S*I*==h-l)m)W,}%H$o$o$B$V#V#,$J=n) ", +" o)J=W$.&)*u$u$u$p$B#B#{%p)q)r)r)E*E*6'D*;-7.%'C-s)A.4.a.,.,.Q.0.i.%+%.t)u)7.7.Q@}.}..+.+E'y@J@f'w@x@v)x@x@x@x@x@x@x@x@x@w)x)}.v.A.y)A.A.A.5'g'v.~@D*z)E*F*%=+-*=S*====h-A)x=.&.&.&W$W$}%0%I$n$0=r, ", +" B)H'p${%B#-%-%-%9&O#U=<$c-*+%=%=F*E*E*d@b*7.%'C-s)A.4.a.,.C)D'Q.i.%+%+%+D)E)F)w,G)[@}.H).+x)I)y@f'w@w@x@x@x@x@x@x@x@|)J)K)F'A.(.A.L)A.A.A.5'g'v.+=D*#=5=##G*@#+#S*==:-M){-B#{%{%{%p$u$u$)*.&#%J=$, ", +" N)O)O#O#9&<$#;c-#;#;W##-;%P)Q)r)F*E*#=D*R)7. 's)A.S)T)U)V)W)X)a+%@Y)(@Z)i'(@`) !.!+!@!#!$!%!&!0@*!=!-!|)x@x@;!>!,!'!0.%+)!%+G.,.(.r;U-!!~!A.5'C- 'D*F=5=##G**=+#h'h't-)+<$<$U=9&-%-%-%B#{%{%u$L${! ", +" ]!h@W##-#-;%9%#-#$D#9%D#4$^!/!(!F*p-d@$*_!:!)s!t!u!v!w!i'x!y!z!A! B!C!n;D!E!F!G!H!J>I!J!K!J>J>b!L!M!K;H+N!O!P!Q!R!N!S!T!U!i>~>9!V!(@W!G.(.X!Y!Z!`! ~+;4#.~+~@~M$Y$Y$#$9%#-#-W#W#c-W#%@1, ", +" #~K!D#K$K$K$K$+$K$K$K$a%*-r;$~%~s!&~*~=~-~(';~>~ ,~'~)~!~~~{~]~^~ /~(~_~P!:~<~[~}~|~(@,+1~2~3~4~5~6~Y$i%4$4$4$D#D#Y$Y$9%9%K$(@7~ ", +" 8~E;+$K$i%*-T#9~C#(@Y)0~a~b~c~d~e~B!Z+ f~g~h~i~j~k~8!l~m~h+n~o~F;K$K$K$4$4$4$4$M$O)p~q~ ", +" r~s~C#C#'@_@a~k~t~u~v~w~5! x~L!y~z~A~B~C~D~(@E~[%%$*-F;4$L$_@F~ ", +" G~H~I~J~K~L~x~ M~N~i'O~Y>|~J'$$'@P~Q~R~ ", +" S~T~9>|,U~V~W~ ", +" ", +" "}; diff --git a/amule_build_install.sh b/amule_build_install.sh new file mode 100755 index 00000000..5fb16820 --- /dev/null +++ b/amule_build_install.sh @@ -0,0 +1,280 @@ +#! /bin/bash + + +# +# Copyright (c) 2004-2008 by Marcelo Roberto Jimenez, phoenix@amule.org +# +# All rights reserved. This script is provided under the terms of the GPL. +# + + +# +# Example usage: copy all tarballs to a directory, cd to it and +# $ ./amule_build_install.sh +# + + +SCRIPT_VERSION="2.0.0" + + +USERHOME=$(echo ~) +DEFAULT_PREFIX="${USERHOME}/usr" +DEFAULT_TARDIR=$(pwd) +DEFAULT_UNTARDIR=${DEFAULT_TARDIR}/untars +JOBS=4 + + +# +# This function uses three parameters: +# $1 - an input parameter specifying a mask for the distribution, +# e.g., 'aMule-CVS-*' +# $2 - an output parameter with the name of the variable that will +# receive the full file name of the tar archive +# $3 - an output parameter with the name of the variable that will +# receive the basename of the distribution +# +function lookup_distro { + # assign the filename of distribution + # the following is equivalent to execute XXX_FILENAME=$(ls ${TARDIR}/$1) + eval $2=$(ls ${TARDIR}/$1) + + # Now we use indirection to dereference $2 + #echo $2 # evaluates to XXX_FILENAME + #echo ${!2} # evaluates to /home/user/dir/xxx-y.z.t.tar.gz + + # remove the directory and the extension parts and assing it + # to XXX_DISTRO in $3 + case ${!2} in + *.gz) + eval $3=$(basename ${!2} .tar.gz) + ;; + + *.bz2) + eval $3=$(basename ${!2} .tar.bz2) + ;; + + *.zip) + eval $3=$(basename ${!2} .zip) + ;; + esac +} + + +function untar_distro { + # $1 evaluates to /home/user/dir/xxx-y.z.t.tar.gz or .bz2 + local TARCMD= + case $1 in + *.gz) + TARCMD="tar zxf" + ;; + *.bz2) + TARCMD="tar jxf" + ;; + *.zip) + TARCMD="unzip -o" + ;; + esac + $TARCMD $1 +} + + +function init_package_versions { + # + # Put the software distributions in directory $TARDIR and the + # script does the rest. There can even be a mixture of .tar.gz and + # .tar.bz2 because the untarring routine tests it on the fly + # + # single quotes have to be used here to avoid expansion + # + lookup_distro 'cryptopp*' CRYPTOPP_FILENAME CRYPTOPP_DISTRO + lookup_distro 'libupnp-*' LIBUPNP_FILENAME LIBUPNP_DISTRO + lookup_distro 'wxWidgets-*.*.*.tar.*' WXWIDGETS_FILENAME WXWIDGETS_DISTRO + lookup_distro 'aMule-CVS-*' AMULE_FILENAME AMULE_DISTRO + + echo + echo "Software packacge versions:" + echo " cryptopp : $CRYPTOPP_DISTRO" + echo " libupnp : $LIBUPNP_DISTRO" + echo " wxWidgets : $WXWIDGETS_DISTRO" + echo " aMule : $AMULE_DISTRO" + echo +} + + +function init_environment { + echo + echo aMule building script, version $SCRIPT_VERSION + echo + + # only prompt if we're missing information + if [ x$PREFIX = x ] || [ x$TARDIR = x ] || [ x$UNTARDIR = x ] ; then + + PREFIX=${DEFAULT_PREFIX} + echo "Where to install?" + read -p "[${PREFIX}]: " + if [ x$REPLY != x ]; then PREFIX=${REPLY}; fi + + echo + echo "Where are the tarballs?" + TARDIR=${DEFAULT_TARDIR} + read -p "[${TARDIR}]: " + if [ x$REPLY != x ]; then TARDIR=${REPLY}; fi + + echo + echo "Where to untar?" + UNTARDIR=${DEFAULT_UNTARDIR} + read -p "[${UNTARDIR}]: " + if [ x$REPLY != x ]; then UNTARDIR=${REPLY}; fi + + fi + + # test that we have write permissions to the install dir + TST_DIR=${PREFIX}/tmp + TST_FILE=${TST_DIR}/test-if-has-write-permission + mkdir -p ${TST_DIR} + touch ${TST_FILE} + if [ ! -w ${TST_FILE} ]; then + echo "You don't appear to have write permissions to ${PREFIX}." + echo "You must fix that before continuing." + exit + fi + rm -f ${TST_FILE} + + echo + echo "Building for:" + echo " --prefix=${PREFIX}" + echo " tarballs are at ${TARDIR}" + echo " tarballs will be untarred at ${UNTARDIR}" + echo + + # Initialize package version variables + init_package_versions +} + + +# +# cryptopp +# +function build_cryptopp { + CRYPTOPP_INSTALL_DIR="${PREFIX}/cryptopp" + CRYPTOPP_SOURCES_DIR="cryptopp_tmpdir" + + rm -rf ${CRYPTOPP_SOURCES_DIR} + mkdir -p ${CRYPTOPP_SOURCES_DIR} + cd ${CRYPTOPP_SOURCES_DIR} + + untar_distro ${CRYPTOPP_FILENAME} + + make -f GNUmakefile -j${JOBS} + PREFIX=${CRYPTOPP_INSTALL_DIR} make install + cd .. +} + + +# +# libUPnP +# +function build_libupnp { + untar_distro ${LIBUPNP_FILENAME} + + LIBUPNP_INSTALL_DIR="${PREFIX}/libupnp" + cd libupnp-?.?.? + ./configure \ + --enable-debug \ + --prefix=${LIBUPNP_INSTALL_DIR} \ + && \ + make -j${JOBS} > /dev/null && \ + make install > /dev/null + cd .. +} + + +# +# wxWidgets +# +function build_wxwidgets { + untar_distro ${WXWIDGETS_FILENAME} + + WXWIDGETS_INSTALL_DIR="${PREFIX}/wxWidgets" + cd wxWidgets-?.?.? + ./configure \ + --enable-mem_tracing \ + --enable-debug \ + --disable-optimise \ + --enable-debug_flag \ + --enable-debug_info \ + --enable-debug_gdb \ + --with-opengl \ + --enable-gtk2 \ + --enable-unicode \ + --enable-largefile \ + --prefix=${WXWIDGETS_INSTALL_DIR} \ + && \ + make -j${JOBS} > /dev/null && + make install > /dev/null + cd .. +} + + +# +# aMule +# +function build_amule { + untar_distro ${AMULE_FILENAME} + + AMULE_INSTALL_DIR="${PREFIX}/amule" + cd amule-cvs + ./configure \ + --enable-ccache \ + --with-denoise-level=3 \ + --enable-debug \ + --disable-optimize \ + --enable-verbose \ + --enable-geoip \ + --enable-cas \ + --enable-wxcas \ + --enable-amule-gui \ + --enable-webserver \ + --enable-amulecmd \ + --enable-amule-daemon \ + --with-wx-config=${WXWIDGETS_INSTALL_DIR}/bin/wx-config \ + --prefix=${AMULE_INSTALL_DIR} \ + --with-crypto-prefix=${CRYPTOPP_INSTALL_DIR} \ + && \ + LD_LIBRARY_PATH=${WXWIDGETS_INSTALL_DIR}/lib make -j${JOBS} && \ + LD_LIBRARY_PATH=${WXWIDGETS_INSTALL_DIR}/lib make install > /dev/null +} + +# +# Here is where the fun begins... +# +init_environment + +# +# Go to ${UNTARDIR} +# +mkdir -p ${UNTARDIR} +cd ${UNTARDIR} + +# +# Build stuff +# +build_cryptopp +build_libupnp +build_wxwidgets +build_amule + +# +# Leave ${UNTARDIR} +# +cd .. + + +echo +echo Finished compilation. +echo You should run aMule like this: +echo '$LD_LIBRARY_PATH'=${WXWIDGETS_INSTALL_DIR}/lib:${LIBUPNP_INSTALL_DIR}/lib LANG=en_US.UTF-8 ${AMULE_INSTALL_DIR}/bin/amule +echo +echo Of course you may choose to use a different locale. +echo + diff --git a/amulegui.desktop b/amulegui.desktop new file mode 100644 index 00000000..adcbda0b --- /dev/null +++ b/amulegui.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=aMuleGUI +Exec=amulegui +Icon=amulegui +Terminal=false +Type=Application +Categories=Network;P2P; +Comment=aMule remote control +Comment[de]=aMule-Fernsteuerung +Comment[fr]=Contrôle à distance d'aMule diff --git a/amulegui.xpm b/amulegui.xpm new file mode 100644 index 00000000..d6091d8d --- /dev/null +++ b/amulegui.xpm @@ -0,0 +1,531 @@ +/* XPM */ +static const char *amule[]={ +"32 32 496 2", +"Qt c None", +".i c #75777a", +"eQ c #d2dfed", +".h c #83878c", +".A c #c8cacc", +"f# c #c8daf1", +".# c #6f7377", +"fO c #a9b8c9", +"ft c #bfd9f7", +"eB c #d5e4f3", +".j c #777b80", +".g c #7f8388", +"ca c #612809", +"fL c #cae1fd", +".B c #aab4bf", +"bh c #777f89", +"dG c #33373d", +".a c #737980", +".f c #6b7178", +"d1 c #b0cbec", +"eR c #b3cdee", +"eh c #abc8eb", +"dH c #acc9ec", +"dp c #a6c4ea", +"dc c #a9c8ed", +".k c #6f7780", +"c1 c #a9c9f1", +".z c #899097", +"cQ c #b2cdef", +"cF c #cbdaec", +"cs c #bed1e7", +"a3 c #a4acb6", +"fa c #c1d9f7", +"cb c #b3c9e4", +"aM c #819aba", +"b2 c #a2bcdc", +"ax c #8199b3", +"bS c #b9cee8", +".e c #61676f", +"aj c #8b949f", +"bJ c #cfdff3", +".V c #707a86", +"#5 c #818a94", +"bv c #bed2ea", +"#N c #7a8591", +"bi c #b7cde7", +"fu c #c3dcfb", +"#w c #747f8c", +"a4 c #b0c8e5", +".b c #717e8e", +"aN c #aac3e2", +"ay c #9ebadd", +"fN c #a5bbd5", +"ak c #abc4e4", +"#6 c #b4cbe8", +"#d c #647180", +".l c #727e8d", +"#O c #a9c3e3", +"#x c #a4bfe0", +"#e c #a0bde1", +".W c #94b2d8", +"fA c #91a8c2", +".d c #5c6672", +"fM c #c9e0fd", +".c c #6d7f95", +"eS c #b7d4f9", +".m c #728499", +".y c #455161", +".C c #778aa1", +"fb c #bcd9fc", +".x c #556373", +"fz c #86a0bf", +"fv c #c1dcfd", +".n c #768eaa", +"eC c #b1d2fa", +"b1 c #6c819a", +"bR c #6b7f98", +"bI c #697e97", +"bu c #667c97", +"bg c #687d97", +"a2 c #626c78", +"aL c #58595b", +".w c #4d5c70", +".D c #758ead", +"aw c #4d525a", +"ai c #5b6572", +".U c #51657d", +"#4 c #677c95", +"#M c #657b95", +"eT c #b6d6fe", +"#v c #637992", +"dC c #000000", +"ar c #00cb58", +"aG c #02de6d", +"as c #166339", +"ef c #171614", +"aH c #1b814e", +"ad c #313928", +"d0 c #32373d", +"dF c #32373e", +"fG c #3f3330", +"ah c #40464e", +"dU c #414041", +"dE c #45312a", +".t c #485e78", +"a1 c #4a5057", +"aI c #4b3655", +"at c #4b4363", +"ae c #4b4b48", +".u c #4b6079", +"fK c #4e5257", +".v c #506178", +"ag c #525558", +".T c #536f90", +"a0 c #565c64", +"fF c #572d16", +"aX c #575254", +"aq c #59827a", +"dl c #5d2d0e", +"aZ c #616164", +"ac c #616166", +"aY c #616568", +"af c #625d5d", +"cm c #632809", +"aF c #636e6f", +".S c #637e9e", +"c# c #642909", +"fp c #64676b", +"#c c #647a95", +"fE c #652909", +"aW c #656474", +"#Y c #667992", +"fD c #682b09", +"#3 c #6888af", +".8 c #69819f", +"#q c #6982a1", +".s c #6a88ac", +"bf c #6a8db8", +"ee c #6b6c6f", +"#1 c #6b849d", +"#u c #6b86a6", +"#2 c #6c85a4", +".R c #6c88a9", +"#G c #6c89ac", +"#L c #6c89ad", +"fH c #6d7072", +"#t c #6d86a5", +"ba c #6d8bad", +"eZ c #6e310c", +"## c #6e87a6", +"#a c #6e88a6", +"#. c #6e88a7", +"c. c #6f7d94", +".9 c #6f88a7", +"bC c #6f8aac", +"bP c #6f8aad", +"bo c #6f8bae", +"dQ c #70320e", +"#s c #7089a8", +"#r c #708aa8", +".O c #708bab", +"#K c #708cad", +"b9 c #708cae", +"ci c #708caf", +"cx c #708db0", +"cV c #708db1", +"fg c #7091b7", +"cl c #717e94", +"#b c #718dae", +"be c #718eb1", +"c7 c #718eb2", +"dh c #718fb3", +"dv c #718fb4", +"fi c #7190b7", +".Q c #728daf", +"#J c #728eb0", +"bH c #728fb2", +"dO c #7290b4", +"cL c #737f95", +"d6 c #7390b5", +"#I c #7391b4", +"eo c #7391b6", +"eF c #7392b6", +"eW c #7392b7", +"fy c #7392b8", +"dx c #748198", +"bG c #748eaf", +"bQ c #748faf", +"b0 c #7490b0", +"bs c #7490b2", +"bd c #7492b1", +"bF c #7590b0", +"br c #7592b3", +"#H c #7594b9", +"fh c #7594bb", +"#0 c #7685a2", +"bZ c #7691b1", +"bE c #7691b2", +"bD c #7691b3", +"bt c #7694b9", +"cM c #77380f", +"bY c #7792b3", +".P c #7792b4", +"bq c #7793b5", +"ck c #7892b4", +"c9 c #7893b4", +"cj c #7893b5", +"bp c #7893b7", +"cy c #7894b6", +"da c #793910", +"bc c #798eb3", +"cX c #7994b6", +"cK c #7995b6", +"cW c #7995b7", +"c8 c #7a95b7", +"di c #7a96b8", +"d7 c #7a97b9", +"#Z c #7b7999", +"dw c #7b96b9", +"dP c #7b97ba", +"fm c #7c4d2d", +"eY c #7c98ba", +"ep c #7c98bb", +"eX c #7c99bb", +"bb c #7d8bb4", +".o c #7e9bbe", +".E c #809ec3", +"fC c #833f14", +".7 c #84a3c9", +"cP c #86461a", +"#F c #86a4ca", +"#p c #86a5cb", +"fs c #878889", +".p c #87a9d3", +".F c #88abd6", +"#X c #89aad1", +".N c #8babd2", +"cY c #8e4a1a", +"dD c #8e4d1e", +"b# c #8eadd4", +"bn c #8faed5", +".X c #8fb9ee", +"bB c #90b0d6", +"fP c #914c1b", +"aJ c #916c3d", +"bO c #91b0d7", +"ab c #91b4de", +"bX c #92b1d7", +"b8 c #92b2d8", +"aV c #92b7e0", +"ch c #93b2d8", +"fx c #93b5dd", +".G c #93baeb", +"cw c #94b3d9", +"d8 c #954e1d", +"d. c #954f1d", +"cJ c #95b4da", +"c6 c #96b5db", +"fB c #97511e", +"fI c #979797", +"aE c #97aadc", +"dg c #97b6dc", +"#7 c #97bff0", +"au c #986d3c", +"du c #98b7dc", +"#P c #98c0f0", +"ap c #99a4d9", +"dN c #99b7dd", +"d5 c #99b8dd", +"#y c #99bfee", +"cE c #9a5522", +"en c #9ab8de", +"db c #9b5724", +"eE c #9bb9de", +"eV c #9bb9df", +"bK c #9bc6fa", +"fl c #9c5420", +"dT c #9c9691", +"ff c #9cbbe0", +"#f c #9cc1f0", +"al c #9cc4f4", +"bw c #9ec8fb", +".q c #9fc4f1", +"bj c #9fc8fa", +"fn c #a0a09e", +"ez c #a0a09f", +"aO c #a0c8f9", +"a5 c #a0c8fa", +"e4 c #a15821", +"#g c #a1c6f3", +"bT c #a1cafd", +".H c #a1cbfe", +"az c #a2c8f8", +"#z c #a3c7f5", +"#h c #a3c9f6", +"ct c #a3ccff", +"#Q c #a4caf7", +"cc c #a4cdff", +"fj c #a55c25", +"#i c #a5cbf9", +"ei c #a5cefd", +"dj c #a65d24", +"fk c #a65d25", +"#R c #a6ccfb", +"cR c #a6cefe", +"dV c #a7602a", +"#A c #a7cdfb", +"#j c #a7cdfc", +"#8 c #a7cefd", +"b3 c #a7cfff", +"#S c #a8cefe", +"#B c #a8cffe", +"aP c #a8cfff", +"#k c #a8d0ff", +"c2 c #a9cffe", +"#9 c #a9d0ff", +".Y c #a9d2ff", +"ey c #aaaaa7", +"dI c #aacffe", +"dq c #aad0fe", +".2 c #aad1ff", +"eq c #ab6026", +".3 c #abd1ff", +"fT c #ac6328", +".4 c #acd1ff", +"a6 c #acd2ff", +"ev c #ad6228", +"#l c #add1ff", +"#m c #add2ff", +"b4 c #add3ff", +".1 c #add4ff", +"cr c #ae6227", +"c0 c #ae6327", +"#C c #aed2ff", +".Z c #aed7ff", +".I c #aed9ff", +"bL c #afd2ff", +"#T c #afd3ff", +".0 c #afd7ff", +"aQ c #b0d3ff", +"#U c #b0d4ff", +"a. c #b1d4ff", +"dr c #b1d5ff", +"bx c #b2d4ff", +"am c #b2d5ff", +"eg c #b3b3b0", +"fJ c #b3b3b2", +"a7 c #b3d5ff", +"aA c #b3d6ff", +"eu c #b4682c", +"aB c #b4d5ff", +"aR c #b4d6ff", +"ej c #b4d7ff", +"e0 c #b5682a", +"do c #b56f36", +"aS c #b5d6ff", +"d2 c #b5d7ff", +".r c #b5daff", +"eK c #b67139", +"e5 c #b68b67", +"ex c #b6b6b0", +"a8 c #b6d7ff", +".J c #b6e2ff", +"cA c #b7692a", +"bk c #b7d7ff", +".5 c #b7d8ff", +"d# c #b86b2c", +"cd c #b8d7ff", +"by c #b8d8ff", +".K c #b8e1ff", +"bU c #b9d8ff", +"#n c #b9d9ff", +"e3 c #ba6c2c", +"b5 c #bad9ff", +"ce c #bbd9ff", +"#D c #bbdaff", +"cG c #bcdaff", +"#V c #bcdbff", +"eJ c #bd6f2e", +"dZ c #bdbdb6", +"cT c #bddaff", +"cS c #bddbff", +"ew c #be7d3f", +"c3 c #bedbff", +"a# c #bedcff", +"av c #bf5700", +"dd c #bfdcff", +"an c #bfddff", +"dy c #c0712f", +"dJ c #c0dcff", +"dK c #c0ddff", +".L c #c0e3ff", +"d3 c #c1dcff", +"aC c #c1ddff", +"eb c #c27739", +"eD c #c2ddff", +"ek c #c2deff", +"fQ c #c37a31", +"aT c #c3deff", +"fc c #c3dfff", +"a9 c #c4dfff", +"bl c #c5dfff", +"dk c #c67530", +"ec c #c68338", +"bz c #c6e0ff", +"cz c #c77631", +"e2 c #c77731", +"bM c #c7e0ff", +".6 c #c7e4ff", +"bV c #c8e1ff", +"e6 c #c9c2b9", +"b6 c #c9e2ff", +"e# c #ca7b38", +"fo c #cacac6", +"cf c #cae2ff", +"#o c #cae6ff", +"cu c #cbe3ff", +"fq c #ccccc7", +"cH c #cce3ff", +"#E c #cce7ff", +".M c #cce9ff", +"eG c #cd813f", +"ed c #cdae80", +"c4 c #cde3ff", +"fw c #cde4ff", +"cq c #ce8240", +"de c #cee4ff", +"ds c #cee5ff", +"dR c #cf874a", +"dL c #cfe5ff", +"#W c #cfe9ff", +"d4 c #d0e6ff", +"cp c #d18849", +"el c #d1e6ff", +"eU c #d2e6ff", +"aa c #d2ebff", +"cn c #d38b4b", +"cD c #d38e52", +"fS c #d48c38", +"cZ c #d48d4e", +"er c #d48e4f", +"ea c #d49259", +"dW c #d4b595", +"eL c #d4cdc2", +"fd c #d4e8ff", +"ao c #d5ecff", +"e. c #d79453", +"cO c #d7995a", +"e1 c #d89c47", +"dz c #d89f6e", +"aD c #d8eeff", +"eH c #d99a61", +"eI c #dba06b", +"aU c #dbf0ff", +"d9 c #dca25c", +"co c #dca36c", +"dB c #dcd6d1", +"e7 c #dcdcda", +"aK c #de7000", +"dm c #deaa7d", +"fr c #dfdfdb", +"b. c #dff2ff", +"cN c #e1af7c", +"et c #e1b17e", +"bm c #e1f3ff", +"eA c #e3e3e0", +"bA c #e3f4ff", +"fR c #e49c3f", +"cC c #e4b886", +"dX c #e5dcd2", +"bN c #e6f5ff", +"f. c #e7e7e5", +"bW c #e8f7ff", +"eM c #e9e9e6", +"e8 c #e9e9e7", +"b7 c #e9f7ff", +"cB c #ebc999", +"cg c #ecf9ff", +"dn c #edcfb5", +"eP c #eeeeec", +"cv c #eefaff", +"es c #efd5a7", +"e9 c #efefee", +"cI c #f0fbff", +"cU c #f1fcff", +"dY c #f2f2f1", +"c5 c #f2fcff", +"df c #f3fdff", +"dt c #f4fdff", +"dM c #f5feff", +"dS c #f6e7da", +"em c #f6feff", +"eN c #f7f7f6", +"fe c #f8ffff", +"eO c #f9f9f9", +"dA c #ffffff", +"QtQtQtQtQtQtQtQt.#.a.b.c.d.e.f.g.hQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQt.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.AQtQtQtQtQtQtQtQtQtQtQt", +".B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.VQtQtQtQtQtQtQtQtQtQtQt", +".W.X.Y.Z.0.1.2.2.3.4.5.6.7.8.9#.###a#b#c#dQtQtQtQtQtQtQtQtQtQtQt", +"#e#f#g#h#i#j#k.2#l#m#n#o#p#q#r#s###t#u#v#wQtQtQtQtQtQtQtQtQtQtQt", +"#x#y#z#i#A#B.2.4#C#C#D#E#F#G#H#I#J#K#L#M#NQtQtQtQtQtQtQtQtQtQtQt", +"#O#P#Q#R#S.2.3#m#T#U#V#W#X#Y#Z#0#1#2#3#4#5QtQtQtQtQtQtQtQtQtQtQt", +"#6#7#i#8#9.3#m#Ca.a.a#aaabacadaeafagahaiajQtQtQtQtQtQtQtQtQtQtQt", +"akal#R#9.3#m#C#TamamanaoapaqarasatauavawaxQtQtQtQtQtQtQtQtQtQtQt", +"ayaz#8.2.3#C#Ta.aAaBaCaDaEaFaGaHaIaJaKaLaMQtQtQtQtQtQtQtQtQtQtQt", +"aNaOaP.3#m#TaQamaRaSaTaUaVaWaXaYaZa0a1a2a3QtQtQtQtQtQtQtQtQtQtQt", +"a4a5#9a6#CaQama7a8a8a9b.b#babbbcbdbebfbgbhQtQtQtQtQtQtQtQtQtQtQt", +"bibj.2#m#Ta.a7aRa8bkblbmbnbobpbqbrbsbtbubhQtQtQtQtQtQtQtQtQtQtQt", +"bvbw.2#C#TbxaAaSbkbybzbAbBbCbDbEbFbGbHbIbhQtQtQtQtQtQtQtQtQtQtQt", +"bJbK.2bLaQamaRa8bybybMbNbObP.PbEbFbQbHbRbhQtQtQtQtQtQtQtQtQtQtQt", +"bSbTa6#Ta.a7aSa8bU#nbVbWbXbo.PbYbZb0bHb1bhQtQtQtQtQtQtQtQtQtQtQt", +"b2b3b4aQamaAaSbkb5b5b6b7b8b9.P.PbEbFc.c#c#c#Qtcac#c#c#c#c#c#c#ca", +"cbccb4a.amaRa8cdce#DcfcgchcicjckbEclcmcnc#Qtc#c#cocpcqcqcrc#caQt", +"csctb4a.a7aSbkbU#D#DcucvcwcxcycjbYc#czcAc#c#cBcCcDcqcEc#c#caQtQt", +"cF.Hb4amaRa8byb5#VcGcHcIcJcxcKcjcLcmcAcMcqcNcOcpcPc#c#caQtQtQtQt", +"cQcR#TamaRbkbUcecScTcHcUcJcVcWcXc#c#cYcqcZcqc0c#caQtQtQtQtQtQtQt", +"c1c2#Ua7a8bk#n#Dc3c3c4c5c6c7c8cXc9c#d.d#c0c0dadbc#caQtQtQtQtQtQt", +"dcc2a.aRa8byb5cGdddddedfdgdhdicWc#c#djd#dkdldmdndoc#caQtQtQtQtQt", +"dpdqdraSbkbU#DcSdddddsdtdudvdwdidxc#d#dydkdzdAdBdCdDc#dEdFdFdGQt", +"dHdIdraSbk#n#DcSdJdKdLdMdNdOdPdic#dQczcqczdRdSdTdUdVdWdXdYdZd0dG", +"d1dqamd2byb5#Vc3d3aCd4dMd5d6dPd7c#d8cZd9e.e#dReaebecedeeefdYegdF", +"eheieja8byb5cSddaCekelemeneoepdPc#eqeresetcZe#euevewexeyezdYeAdF", +"eBeC#9ej#ncGcSddeDekelemeEeFepdPc#d.eGeHeIcZe#eJeveKeLeMeNeOePdF", +"QteQeReSeT.5#VaCaTaTeUemeVeWeXeYc#eZe0eGeGe1e2e3e4e5e6e7e8e9f.dF", +"QtQtQtQtf#fafbcGanfcfdfefffgfhfic#dac#fjfjfkfjflfmfnfofpfqfrfsdF", +"QtQtQtQtQtQtQtftfufvfwcUfxfyfzfAeZcYfBfCfDfEfFfGdFfHfIfJfKdFdFdG", +"QtQtQtQtQtQtQtQtQtQtfLfMfNfOQtQteZfPfQfRfSfTfEQtdGdFdFdFdFdGQtQt"}; diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 00000000..5b034984 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,74 @@ +#!/bin/sh +# Helps bootstrapping 'aMule' when checked out from CVS. +# Requires GNU autoconf, GNU automake and GNU which. + +export WANT_AUTOMAKE="1.7" +(autoconf --version) >/dev/null 2>/dev/null || (echo "You need GNU autoconf to install from CVS (ftp://ftp.gnu.org/gnu/autoconf/)"; exit 1) || exit 1 +(automake --version) >/dev/null 2>/dev/null || (echo "You need GNU automake 1.7 to install from CVS (ftp://ftp.gnu.org/gnu/automake/)"; exit 1) || exit 1 + +# Do sanity checks. +# Directory check. +if [ ! -e src/SharedFileList.h ]; then + echo "Run ./autogen.sh from the base directory of aMule." + exit 1 +fi + +# Determine the version of automake. +automake_version=`automake --version | head -n 1 | sed -e 's/[^12]*\([12]\.[0-9]+[^ ]*\).*/\1/'` + +# Require automake 1.7. +if expr "1.7" \> "$automake_version" >/dev/null; then + automake --version | head -n 1 + echo "Fatal error: automake version 1.7 or higher is required." + exit 1 +fi + +# Determine version of gettext. +gettext_version=`gettext --version | head -n 1 | sed -e 's/[^0]*\(0\.[0-9][^ ]*\).*/\1/'` +confver=`cat configure.in | grep '^AM_GNU_GETTEXT_VERSION(' | sed -e 's/^AM_GNU_GETTEXT_VERSION(\([^()]*\))/\1/p' | sed -e 's/^\[\(.*\)\]$/\1/' | sed -e 1q` + +# Require version as specified in configure.in. +if expr "$confver" \> "$gettext_version" >/dev/null; then + gettext --version | head -n 1 + echo "Fatal error: gettext version "$confver" or higher is required." + exit 1 +fi + +# Force intl regenration to get last update from installed gettext templates +rm -rf intl/* +#if [ ! -d intl ]; then + echo "Setting up internationalization files." + autopoint --force + if grep -q datarootdir po/Makefile.in.in; then + echo autopoint honors dataroot variable, not patching. + else + echo autopoint does not honor dataroot variable, patching. + sed -e 's/^datadir *=\(.*\)/datarootdir = @datarootdir@\ndatadir = @datadir@/g' po/Makefile.in.in > po/Makefile.in.in.tmp && mv -f po/Makefile.in.in.tmp po/Makefile.in.in + sed -e 's/^datadir *=\(.*\)/datarootdir = @datarootdir@\ndatadir = @datadir@/g' intl/Makefile.in > intl/Makefile.in.tmp && mv -f intl/Makefile.in.tmp intl/Makefile.in + fi +# if [ -f Makefile -a -x config.status ]; then +# CONFIG_FILES=intl/Makefile CONFIG_HEADERS= /bin/sh ./config.status +# fi +# gettextize --intl -f --no-changelog +# echo "restoring Makefile.am and configure.in" +# cp -f Makefile.am~ Makefile.am +# cp -f configure.in~ configure.in +#fi + +echo "Running aclocal -I m4" +aclocal -I m4 + +echo "Running autoheader" +autoheader + +echo "Running autoconf" +autoconf + +echo "Creating pixmaps Makefile.am" +pushd $(pwd) > /dev/null +cd src/pixmaps/flags_xpm +./makeflags.sh +popd > /dev/null + +echo "Running automake --foreign -a -c -f" +automake --foreign -a -c -f diff --git a/automake/dist-hook.am b/automake/dist-hook.am new file mode 100644 index 00000000..2dcfbbf3 --- /dev/null +++ b/automake/dist-hook.am @@ -0,0 +1,11 @@ +dist-hook: + for d in $(EXTRA__DIST__SUBDIRS) ; do \ + mkdir $(distdir)/$$d ; \ + for f in `find $(srcdir)/$$d -name '.svn' -prune -o -printf "%P\n"` ; do \ + if test -d $(srcdir)/$$d/$$f ; then \ + mkdir $(distdir)/$$d/$$f ; \ + else \ + cp -p $(srcdir)/$$d/$$f $(distdir)/$$d/$$f ; \ + fi ; \ + done ; \ + done diff --git a/automake/manpages.am b/automake/manpages.am new file mode 100644 index 00000000..31bb52ae --- /dev/null +++ b/automake/manpages.am @@ -0,0 +1,35 @@ +install-data-hook: + @for file in $(SELECTED_MANPAGES); do \ + lang=`echo $$file | sed -e 's/^[^.]*\.//'`; \ + if test $$lang == 1; then \ + echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/man1" ; \ + $(mkinstalldirs) $(DESTDIR)$(mandir)/man1 ; \ + if test -f $(srcdir)/$$file; then name=$(srcdir)/$$file; \ + else name=$$file; fi; \ + inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ + echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/man1/$$inst" ; \ + $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/man1/$$inst ; \ + else \ + locale=`echo $$lang | sed -e 's/\..*//'` ; \ + echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/$$locale/man1" ; \ + $(mkinstalldirs) $(DESTDIR)$(mandir)/$$locale/man1 ; \ + if test -f $(srcdir)/$$file; then name=$(srcdir)/$$file; \ + else name=$$file; fi; \ + inst=`echo $$file | sed -e "s/\.$${locale}\.1//" -e '$(transform)'`.1 ; \ + echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$locale/man1/$$inst" ; \ + $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$locale/man1/$$inst ; \ + fi; \ + done + +uninstall-hook: + @for file in $(SELECTED_MANPAGES); do \ + lang=`echo $$file | sed -e 's/^[^.]*\.//'`; \ + if test $$lang == 1; then \ + inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ + rm -f $(DESTDIR)$(mandir)/man1/$$inst ; \ + else \ + locale=`echo $$lang | sed -e 's/\..*//'` ; \ + inst=`echo $$file | sed -e "s/\.$${locale}\.1//" -e '$(transform)'`.1 ; \ + rm -f $(DESTDIR)$(mandir)/$$locale/man1/$$inst ; \ + fi; \ + done diff --git a/compile b/compile new file mode 100755 index 00000000..ad57e2f6 --- /dev/null +++ b/compile @@ -0,0 +1,142 @@ +#! /bin/sh +# Wrapper for compilers which do not understand `-c -o'. + +scriptversion=2005-02-03.08 + +# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# 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, 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. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand `-c -o'. +Remove `-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file `INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; +esac + +ofile= +cfile= +eat= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as `compile cc -o foo foo.c'. + # So we strip `-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no `-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # `.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'` + +# Create the lock directory. +# Note: use `[/.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/config.guess b/config.guess new file mode 100755 index 00000000..892833f9 --- /dev/null +++ b/config.guess @@ -0,0 +1,1459 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + +timestamp='2005-02-10' + +# This file 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. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; + amd64:OpenBSD:*:*) + echo x86_64-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + cats:OpenBSD:*:*) + echo arm-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + luna88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mips64-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit 0 ;; + macppc:MirBSD:*:*) + echo powerppc-unknown-mirbsd${UNAME_RELEASE} + exit 0 ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit 0 ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit 0 ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit 0 ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7 && exit 0 ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c \ + && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && exit 0 + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + # avoid double evaluation of $set_cc_for_build + test -n "$CC_FOR_BUILD" || eval $set_cc_for_build + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + x86:Interix*:[34]*) + echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' + exit 0 ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + amd64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit 0 ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit 0 ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit 0 ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit 0 ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit 0 ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #ifdef __INTEL_COMPILER + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit 0 ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit 0 ;; + i*86:*:5:[78]*) + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit 0 ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit 0 ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit 0 ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + *86) UNAME_PROCESSOR=i686 ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit 0 ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms && exit 0 ;; + I*) echo ia64-dec-vms && exit 0 ;; + V*) echo vax-dec-vms && exit 0 ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config.h.in b/config.h.in new file mode 100644 index 00000000..206db6e6 --- /dev/null +++ b/config.h.in @@ -0,0 +1,512 @@ +/* config.h.in. Generated from configure.in by autoheader. */ + +/* Define to 1 if the `closedir' function returns void instead of `int'. */ +#undef CLOSEDIR_VOID + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +#undef CRAY_STACKSEG_END + +/* Define this to the include prefix of crypto++ */ +#undef CRYPTOPP_INCLUDE_PREFIX + +/* Define to 1 if using `alloca.c'. */ +#undef C_ALLOCA + +/* Define to 1 if translation of program messages to the user's native + language is requested. */ +#undef ENABLE_NLS + +/* Define to 1 if you have `alloca', as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#undef HAVE_ALLOCA_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ARGZ_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ARPA_INET_H + +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +#undef HAVE_DCGETTEXT + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_DIRENT_H + +/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +#undef HAVE_DOPRNT + +/* Define to 1 if you have the `endpwent' function. */ +#undef HAVE_ENDPWENT + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the `feof_unlocked' function. */ +#undef HAVE_FEOF_UNLOCKED + +/* Define to 1 if you have the `fgets_unlocked' function. */ +#undef HAVE_FGETS_UNLOCKED + +/* Define to 1 if you have the `floor' function. */ +#undef HAVE_FLOOR + +/* Define to 1 if you have the `fork' function. */ +#undef HAVE_FORK + +/* Define to 1 if you have the `ftruncate' function. */ +#undef HAVE_FTRUNCATE + +/* Define to 1 if you have the `getcwd' function. */ +#undef HAVE_GETCWD + +/* Define to 1 if you have the `getc_unlocked' function. */ +#undef HAVE_GETC_UNLOCKED + +/* Define to 1 if you have the `getegid' function. */ +#undef HAVE_GETEGID + +/* Define to 1 if you have the `geteuid' function. */ +#undef HAVE_GETEUID + +/* Define to 1 if you have the `getgid' function. */ +#undef HAVE_GETGID + +/* Define to 1 if you have the `gethostbyaddr' function. */ +#undef HAVE_GETHOSTBYADDR + +/* Define to 1 if you have the `gethostbyname' function. */ +#undef HAVE_GETHOSTBYNAME + +/* Define to 1 if you have the `gethostname' function. */ +#undef HAVE_GETHOSTNAME + +/* Define to 1 if you have the `getmntent' function. */ +#undef HAVE_GETMNTENT + +/* Define to 1 if you have the `getmntinfo' function. */ +#undef HAVE_GETMNTINFO + +/* Define to 1 if you have the `getpagesize' function. */ +#undef HAVE_GETPAGESIZE + +/* Define to 1 if you have the `getpass' function. */ +#undef HAVE_GETPASS + +/* Define to 1 if you have the `getrlimit' function. */ +#undef HAVE_GETRLIMIT + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#undef HAVE_GETTEXT + +/* Define to 1 if you have the `gettimeofday' function. */ +#undef HAVE_GETTIMEOFDAY + +/* Define to 1 if you have the `getuid' function. */ +#undef HAVE_GETUID + +/* Define to 1 if you have the header file. */ +#undef HAVE_HISTORY_H + +/* Define if you have the iconv() function. */ +#undef HAVE_ICONV + +/* Define to 1 if you have the `inet_ntoa' function. */ +#undef HAVE_INET_NTOA + +/* Define if exists and doesn't clash with . */ +#undef HAVE_INTTYPES_H + +/* Define if exists, doesn't clash with , and + declares uintmax_t. */ +#undef HAVE_INTTYPES_H_WITH_UINTMAX + +/* Define if you have and nl_langinfo(CODESET). */ +#undef HAVE_LANGINFO_CODESET + +/* Define to 1 if you have the header file. */ +#undef HAVE_LANGINFO_H + +/* Define if your file defines LC_MESSAGES. */ +#undef HAVE_LC_MESSAGES + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBINTL_H + +/* Define if you have a readline compatible library */ +#undef HAVE_LIBREADLINE + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if you have the `localeconv' function. */ +#undef HAVE_LOCALECONV + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define to 1 if `lstat' has the bug that it succeeds when given the + zero-length file name argument. */ +#undef HAVE_LSTAT_EMPTY_STRING_BUG + +/* Define to 1 if your system has a GNU libc compatible `malloc' function, and + to 0 otherwise. */ +#undef HAVE_MALLOC + +/* Define to 1 if you have the header file. */ +#undef HAVE_MALLOC_H + +/* Define to 1 if you have the `memmove' function. */ +#undef HAVE_MEMMOVE + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `mempcpy' function. */ +#undef HAVE_MEMPCPY + +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* Define to 1 if you have the `mkdir' function. */ +#undef HAVE_MKDIR + +/* Define to 1 if you have a working `mmap' system call. */ +#undef HAVE_MMAP + +/* Define to 1 if you have the header file. */ +#undef HAVE_MNTENT_H + +/* Define to 1 if you have the `munmap' function. */ +#undef HAVE_MUNMAP + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +#undef HAVE_NDIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETDB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETINET_IN_H + +/* Define to 1 if you have the `nl_langinfo' function. */ +#undef HAVE_NL_LANGINFO + +/* Define to 1 if you have the header file. */ +#undef HAVE_NL_TYPES_H + +/* Define to 1 if you have the `pow' function. */ +#undef HAVE_POW + +/* Define to 1 if the system has the type `ptrdiff_t'. */ +#undef HAVE_PTRDIFF_T + +/* Define to 1 if you have the `putenv' function. */ +#undef HAVE_PUTENV + +/* Define to 1 if you have the header file. */ +#undef HAVE_READLINE_H + +/* Define if your readline library has \`add_history' */ +#undef HAVE_READLINE_HISTORY + +/* Define to 1 if you have the header file. */ +#undef HAVE_READLINE_HISTORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_READLINE_READLINE_H + +/* Define to 1 if your system has a GNU libc compatible `realloc' function, + and to 0 otherwise. */ +#undef HAVE_REALLOC + +/* Define to 1 if you have the `select' function. */ +#undef HAVE_SELECT + +/* Define to 1 if you have the `setenv' function. */ +#undef HAVE_SETENV + +/* Define to 1 if you have the `setlocale' function. */ +#undef HAVE_SETLOCALE + +/* Define to 1 if you have the `setrlimit' function. */ +#undef HAVE_SETRLIMIT + +/* Define to 1 if you have the `socket' function. */ +#undef HAVE_SOCKET + +/* Define to 1 if you have the `sqrt' function. */ +#undef HAVE_SQRT + +/* Define to 1 if `stat' has the bug that it succeeds when given the + zero-length file name argument. */ +#undef HAVE_STAT_EMPTY_STRING_BUG + +/* Define to 1 if stdbool.h conforms to C99. */ +#undef HAVE_STDBOOL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDDEF_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define if exists, doesn't clash with , and declares + uintmax_t. */ +#undef HAVE_STDINT_H_WITH_UINTMAX + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDIO_EXT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `stpcpy' function. */ +#undef HAVE_STPCPY + +/* Define to 1 if you have the `strcasecmp' function. */ +#undef HAVE_STRCASECMP + +/* Define to 1 if you have the `strchr' function. */ +#undef HAVE_STRCHR + +/* Define to 1 if you have the `strcspn' function. */ +#undef HAVE_STRCSPN + +/* Define to 1 if you have the `strdup' function. */ +#undef HAVE_STRDUP + +/* Define to 1 if you have the `strerror' function. */ +#undef HAVE_STRERROR + +/* Define to 1 if you have the `strftime' function. */ +#undef HAVE_STRFTIME + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strncasecmp' function. */ +#undef HAVE_STRNCASECMP + +/* Define to 1 if you have the `strstr' function. */ +#undef HAVE_STRSTR + +/* Define to 1 if you have the `strtoul' function. */ +#undef HAVE_STRTOUL + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_SYS_DIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_IOCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_MOUNT_H + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_SYS_NDIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PARAM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_RESOURCE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SELECT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SOCKET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STATVFS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIMEB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have that is POSIX.1 compatible. */ +#undef HAVE_SYS_WAIT_H + +/* Define to 1 if you have the `tsearch' function. */ +#undef HAVE_TSEARCH + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define if you have the unsigned long long type. */ +#undef HAVE_UNSIGNED_LONG_LONG + +/* Define to 1 if you have the `vfork' function. */ +#undef HAVE_VFORK + +/* Define to 1 if you have the header file. */ +#undef HAVE_VFORK_H + +/* Define to 1 if you have the `vprintf' function. */ +#undef HAVE_VPRINTF + +/* Define to 1 if `fork' works. */ +#undef HAVE_WORKING_FORK + +/* Define to 1 if `vfork' works. */ +#undef HAVE_WORKING_VFORK + +/* Define to 1 if the system has the type `_Bool'. */ +#undef HAVE__BOOL + +/* Define to 1 if you have the `__argz_count' function. */ +#undef HAVE___ARGZ_COUNT + +/* Define to 1 if you have the `__argz_next' function. */ +#undef HAVE___ARGZ_NEXT + +/* Define to 1 if you have the `__argz_stringify' function. */ +#undef HAVE___ARGZ_STRINGIFY + +/* Define as const if the declaration of iconv() needs const. */ +#undef ICONV_CONST + +/* Define if integer division by zero raises signal SIGFPE. */ +#undef INTDIV0_RAISES_SIGFPE + +/* Define to 1 if `lstat' dereferences a symlink specified with a trailing + slash. */ +#undef LSTAT_FOLLOWS_SLASHED_SYMLINK + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define if exists and defines unusable PRI* macros. */ +#undef PRI_MACROS_BROKEN + +/* Define to 1 if the C compiler supports function prototypes. */ +#undef PROTOTYPES + +/* Define as the return type of signal handlers (`int' or `void'). */ +#undef RETSIGTYPE + +/* Define to the type of arg 1 for `select'. */ +#undef SELECT_TYPE_ARG1 + +/* Define to the type of args 2, 3 and 4 for `select'. */ +#undef SELECT_TYPE_ARG234 + +/* Define to the type of arg 5 for `select'. */ +#undef SELECT_TYPE_ARG5 + +/* Define to 1 if the `setvbuf' function takes the buffering type as its + second argument and the buffer pointer as the third, as on System V before + release 3. */ +#undef SETVBUF_REVERSED + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +#undef STACK_DIRECTION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define if you want GeoIP support. */ +#undef SUPPORT_GEOIP + +/* The checkout date or svn revision number. */ +#undef SVNDATE + +/* Define to 1 if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* Define to 1 if your declares `struct tm'. */ +#undef TM_IN_SYS_TIME + +/* Version number of package */ +#undef VERSION + +/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a + `char[]'. */ +#undef YYTEXT_POINTER + +/* Define like PROTOTYPES; this can be used by system headers. */ +#undef __PROTOTYPES + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `int' if doesn't define. */ +#undef gid_t + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Define to rpl_malloc if the replacement function should be used. */ +#undef malloc + +/* Define to `int' if does not define. */ +#undef mode_t + +/* Define to `long' if does not define. */ +#undef off_t + +/* Define to `int' if does not define. */ +#undef pid_t + +/* Define to rpl_realloc if the replacement function should be used. */ +#undef realloc + +/* Define to `unsigned' if does not define. */ +#undef size_t + +/* Define to `int' if doesn't define. */ +#undef uid_t + +/* Define to unsigned long or unsigned long long if and + don't define. */ +#undef uintmax_t + +/* Define as `fork' if `vfork' does not work. */ +#undef vfork + +/* Define to empty if the keyword `volatile' does not work. Warning: valid + code using `volatile' can become incorrect without. Disable with care. */ +#undef volatile diff --git a/config.rpath b/config.rpath new file mode 100755 index 00000000..5ead7586 --- /dev/null +++ b/config.rpath @@ -0,0 +1,513 @@ +#! /bin/sh +# Output a system dependent set of variables, describing how to set the +# run time search path of shared libraries in an executable. +# +# Copyright 1996-2002 Free Software Foundation, Inc. +# Taken from GNU libtool, 2001 +# Originally by Gordon Matzigkeit , 1996 +# +# 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. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld +# should be set by the caller. +# +# The set of defined variables is at the end of this script. + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +shlibext= + +host="$1" +host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +wl= +if test "$GCC" = yes; then + wl='-Wl,' +else + case "$host_os" in + aix3* | aix4* | aix5*) + wl='-Wl,' + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6*) + wl='-Wl,' + ;; + linux*) + echo '__INTEL_COMPILER' > conftest.$ac_ext + if $CC -E conftest.$ac_ext >/dev/null | grep __INTEL_COMPILER >/dev/null + then + : + else + # Intel icc + wl='-Qoption,ld,' + fi + ;; + osf3* | osf4* | osf5*) + wl='-Wl,' + ;; + solaris*) + wl='-Wl,' + ;; + sunos4*) + wl='-Qoption ld ' + ;; + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + if test "x$host_vendor" = xsni; then + wl='-LD' + else + wl='-Wl,' + fi + ;; + esac +fi + +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no + +case "$host_os" in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + case "$host_os" in + aix3* | aix4* | aix5*) + # On AIX, the GNU linker is very broken + ld_shlibs=no + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can use + # them. + ld_shlibs=no + ;; + beos*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + cygwin* | mingw* | pw32*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + ;; + solaris* | sysv5*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + sunos4*) + hardcode_direct=yes + ;; + *) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + esac + if test "$ld_shlibs" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + fi +else + case "$host_os" in + aix3*) + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + else + aix_use_runtimelinking=no + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + fi + hardcode_direct=yes + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + fi + if test "$aix_use_runtimelinking" = yes; then + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib' + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + else + hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib' + fi + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + libext=lib + ;; + darwin* | rhapsody*) + hardcode_direct=yes + ;; + freebsd1*) + ld_shlibs=no + ;; + freebsd2.2*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + freebsd2*) + hardcode_direct=yes + hardcode_minus_L=yes + ;; + freebsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + hpux9* | hpux10* | hpux11*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_minus_L=yes # Not in the search PATH, but as the default + # location of the library. + ;; + irix5* | irix6*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + netbsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + newsos6) + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + openbsd*) + hardcode_direct=yes + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + osf3*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + osf4* | osf5*) + if test "$GCC" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + # Both cc and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + sco3.2v5*) + ;; + solaris*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + sunos4*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + ;; + sysv4) + if test "x$host_vendor" = xsno; then + hardcode_direct=yes # is this really true??? + else + hardcode_direct=no # Motorola manual says yes, but my tests say they lie + fi + ;; + sysv4.3*) + ;; + sysv5*) + hardcode_libdir_flag_spec= + ;; + uts4*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + dgux*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + sysv4*MP*) + if test -d /usr/nec; then + ld_shlibs=yes + fi + ;; + sysv4.2uw2*) + hardcode_direct=yes + hardcode_minus_L=no + ;; + sysv5uw7* | unixware7*) + ;; + *) + ld_shlibs=no + ;; + esac +fi + +# Check dynamic linker characteristics +libname_spec='lib$name' +sys_lib_dlsearch_path_spec="/lib /usr/lib" +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +case "$host_os" in + aix3*) + shlibext=so + ;; + aix4* | aix5*) + shlibext=so + ;; + amigaos*) + shlibext=ixlibrary + ;; + beos*) + shlibext=so + ;; + bsdi4*) + shlibext=so + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + ;; + cygwin* | mingw* | pw32*) + case $GCC,$host_os in + yes,cygwin*) + shlibext=dll.a + ;; + yes,mingw*) + shlibext=dll + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"` + ;; + yes,pw32*) + shlibext=dll + ;; + *) + shlibext=dll + ;; + esac + ;; + darwin* | rhapsody*) + shlibext=dylib + ;; + freebsd1*) + ;; + freebsd*) + shlibext=so + ;; + gnu*) + shlibext=so + ;; + hpux9* | hpux10* | hpux11*) + shlibext=sl + ;; + irix5* | irix6*) + shlibext=so + case "$host_os" in + irix5*) + libsuff= shlibsuff= + ;; + *) + case $LD in + *-32|*"-32 ") libsuff= shlibsuff= ;; + *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 ;; + *-64|*"-64 ") libsuff=64 shlibsuff=64 ;; + *) libsuff= shlibsuff= ;; + esac + ;; + esac + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + ;; + linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) + ;; + linux-gnu*) + shlibext=so + ;; + netbsd*) + shlibext=so + ;; + newsos6) + shlibext=so + ;; + openbsd*) + shlibext=so + ;; + os2*) + libname_spec='$name' + shlibext=dll + ;; + osf3* | osf4* | osf5*) + shlibext=so + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + sco3.2v5*) + shlibext=so + ;; + solaris*) + shlibext=so + ;; + sunos4*) + shlibext=so + ;; + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + shlibext=so + case "$host_vendor" in + motorola) + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + uts4*) + shlibext=so + ;; + dgux*) + shlibext=so + ;; + sysv4*MP*) + if test -d /usr/nec; then + shlibext=so + fi + ;; +esac + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_sys_lib_search_path_spec=`echo "X$sys_lib_search_path_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_sys_lib_dlsearch_path_spec=`echo "X$sys_lib_dlsearch_path_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` + +sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit 0;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ + kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | msp430 \ + | ns16k | ns32k \ + | openrisc | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* \ + | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | msp430-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16c) + basic_machine=cr16c-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + or32 | or32-*) + basic_machine=or32-unknown + os=-coff + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/configure b/configure new file mode 100755 index 00000000..87b82d83 --- /dev/null +++ b/configure @@ -0,0 +1,20445 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.59 for aMule SVN. +# +# Report bugs to . +# +# Copyright (C) 2003 Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME='aMule' +PACKAGE_TARNAME='amule' +PACKAGE_VERSION='SVN' +PACKAGE_STRING='aMule SVN' +PACKAGE_BUGREPORT='admin@amule.org' + +ac_unique_file="src/amule.cpp" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT RESOLV_LIB X11LIBS CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP CC CFLAGS ac_ct_CC CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP BUILD_CC ac_ct_BUILD_CC EXEEXT BUILD_EXEEXT BUILD_CPPFLAGS BUILD_CFLAGS BUILD_LDFLAGS EGREP LEX LEXLIB LEX_OUTPUT_ROOT RANLIB ac_ct_RANLIB YACC AR ac_ct_AR LD ac_ct_LD GDLIB_CONFIG_PATH GDLIB_CFLAGS GDLIB_LDFLAGS GDLIB_LIBS CAS_DEFS LIBPNG_CONFIG_PATH LIBPNG_CFLAGS LIBPNG_CXXFLAGS LIBPNG_LDFLAGS LIBPNG_LIBS AMULEWEB_DEFS GEOIP_INCLUDE GEOIP_LIB WX_CONFIG_PATH WX_CPPFLAGS WX_CFLAGS WX_CXXFLAGS WX_CFLAGS_ONLY WX_CXXFLAGS_ONLY WX_LIBS WX_LIBS_STATIC WX_VERSION_FULL WX_RESCOMP WX_VERSION_MAJOR WX_VERSION_MINOR WX_UNICODE WX_DEBUG WX_SHARED WX_PORT RC ac_ct_RC RCFLAGS CRYPTO_PP_PREFIX CRYPTO_PP_VERSION_STRING CRYPTO_PP_VERSION_NUMBER CRYPTO_PP_STYLE CRYPTO_PP_LIB_NAME CRYPTO_PP_INCLUDE_PREFIX CRYPTO_PP_CXXFLAGS CRYPTO_PP_LDFLAGS CRYPTOLIBS BFD_FLAGS BFD_LIB HAVE_GETTEXT HAVE_FLEX_EXTENDED ALLOCA MKINSTALLDIRS MSGFMT GMSGFMT XGETTEXT MSGMERGE GLIBC21 LIBICONV LTLIBICONV INTLBISON USE_NLS BUILD_INCLUDED_LIBINTL USE_INCLUDED_LIBINTL CATOBJEXT INTLOBJS DATADIRNAME INSTOBJEXT GENCAT INTL_LIBTOOL_SUFFIX_PREFIX INTLLIBS LIBINTL LTLIBINTL POSUB LIBOBJS POW_LIB WXBASE_LIBS WXBASE_CFLAGS WXBASE_CXXFLAGS docdir SVNDATE AMULE_DAEMON_MANPAGES AMULECMD_MANPAGES WEB_MANPAGES AMULE_GUI_MANPAGES CAS_MANPAGES WXCAS_MANPAGES ED2K_MANPAGES ALC_MANPAGES ALCC_MANPAGES MONOLITHIC_MANPAGES WEB_TRUE WEB_FALSE ED2K_TRUE ED2K_FALSE CAS_TRUE CAS_FALSE WXCAS_TRUE WXCAS_FALSE ALC_TRUE ALC_FALSE ALCC_TRUE ALCC_FALSE AMULE_GUI_TRUE AMULE_GUI_FALSE AMULE_DAEMON_TRUE AMULE_DAEMON_FALSE COMPILE_CMD_TRUE COMPILE_CMD_FALSE MONOLITHIC_TRUE MONOLITHIC_FALSE ENABLE_UPNP_TRUE ENABLE_UPNP_FALSE ENABLE_IP2COUNTRY_TRUE ENABLE_IP2COUNTRY_FALSE SYS_WIN32_TRUE SYS_WIN32_FALSE NEED_RC_TRUE NEED_RC_FALSE NEED_CORESERVICES_TRUE NEED_CORESERVICES_FALSE COMPILE_NLS_TRUE COMPILE_NLS_FALSE GENERATE_FLEX_HEADER_TRUE GENERATE_FLEX_HEADER_FALSE READLINE_LIBS ccache CCACHE ccache_prefix LTLIBOBJS' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CXX_set=${CXX+set} +ac_env_CXX_value=$CXX +ac_cv_env_CXX_set=${CXX+set} +ac_cv_env_CXX_value=$CXX +ac_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_env_CXXFLAGS_value=$CXXFLAGS +ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_cv_env_CXXFLAGS_value=$CXXFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CXXCPP_set=${CXXCPP+set} +ac_env_CXXCPP_value=$CXXCPP +ac_cv_env_CXXCPP_set=${CXXCPP+set} +ac_cv_env_CXXCPP_value=$CXXCPP +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP +ac_env_RC_set=${RC+set} +ac_env_RC_value=$RC +ac_cv_env_RC_set=${RC+set} +ac_cv_env_RC_value=$RC + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures aMule SVN to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +_ACEOF + + cat <<_ACEOF +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +X features: + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of aMule SVN:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --enable-ccache enable ccache support for fast recompilation + --disable-debug disable additional debugging output + --enable-optimize enable code optimizing + --enable-profile enable code profiling + --enable-static produce a statically linked executable + --disable-monolithic disable building of the monolithic aMule app + --enable-amule-daemon compile aMule daemon version + --enable-amulecmd compile aMule command line client + --enable-webserver compile aMule WebServer + --enable-amule-gui compile aMule remote GUI (EXPERIMENTAL) + --enable-cas compile C aMule Statistics + --enable-wxcas compile aMule GUI Statistics + --disable-ed2k don't compile aMule ed2k links handler + --enable-alc compile aMuleLinkCreator GUI version + --enable-alcc compile aMuleLinkCreator for console + --disable-upnp do not compile UPnP code + --enable-geoip compile with GeoIP IP2Country library + --disable-rpath do not hardcode runtime library paths + --disable-nls do not use Native Language Support + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-geoip-headers=DIR + GeoIP include files location + --with-geoip-lib=DIR GeoIP library location + --with-geoip-static Explicitly link GeoIP statically (default=no) + --with-denoise-level= + Specifies denoising level (0-4): + 0 - Do nothing + 4 - Suppress all normal output + (for more information see + src/utils/scripts/denoiser.rules) + + --without-gnu-malloc Don't assume that we use GNU libc compatible + malloc/realloc when cross-compiling + --with-language= Specify a comma-separated list of languages you want + to have installed. See po/LINGUAS for available + languages + --with-zlib=PREFIX use zlib in PREFIX + --with-gdlib-prefix=PREFIX + prefix where gdlib is installed (optional) + --with-gdlib-config=CONFIG + gdlib-config script to use (optional) + --with-libpng-prefix=PREFIX + prefix where libpng is installed (optional) + --with-libpng-config=CONFIG + libpng-config script to use (optional) + --with-wxdir=PATH Use uninstalled version of wxWidgets in PATH + --with-wx-config=CONFIG wx-config script to use (optional) + --with-wx-prefix=PREFIX Prefix where wxWidgets is installed (optional) + --with-wx-exec-prefix=PREFIX + Exec prefix where wxWidgets is installed (optional) + --with-toolkit Build against a specific wxWidgets toolkit (default + is auto) + --with-wxshared Force building against a shared build of wxWidgets, + even if --disable-shared is given (default is auto) + --with-wxdebug Force building against a debug build of wxWidgets, + even if --disable-debug is given (default is auto) + --with-wxversion Build against a specific version of wxWidgets + (default is auto) + --with-crypto-prefix=PREFIX + prefix where crypto++ is installed + --with-x use the X Window System + --with-gnu-ld assume the C compiler uses GNU ld default=no + --with-libiconv-prefix=DIR search for libiconv in DIR/include and DIR/lib + --without-libiconv-prefix don't search for libiconv in includedir and libdir + --with-included-gettext use the GNU gettext library included here + --with-libintl-prefix=DIR search for libintl in DIR/include and DIR/lib + --without-libintl-prefix don't search for libintl in includedir and libdir + --with-ccache-prefix=PREFIX + prefix where ccache is installed + +Some influential environment variables: + CXX C++ compiler command + CXXFLAGS C++ compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CXXCPP C++ preprocessor + CC C compiler command + CFLAGS C compiler flags + CPP C preprocessor + RC Win32 Resource Compiler + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_srcdir/configure.gnu; then + echo + $SHELL $ac_srcdir/configure.gnu --help=recursive + elif test -f $ac_srcdir/configure; then + echo + $SHELL $ac_srcdir/configure --help=recursive + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF +aMule configure SVN +generated by GNU Autoconf 2.59 + +Copyright (C) 2003 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit 0 +fi +exec 5>config.log +cat >&5 <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by aMule $as_me SVN, which was +generated by GNU Autoconf 2.59. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_sep= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + + + + + + + + + + + + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f $ac_dir/shtool; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# Make sure we can run config.sub. +$ac_config_sub sun4 >/dev/null 2>&1 || + { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 +echo "$as_me: error: cannot run $ac_config_sub" >&2;} + { (exit 1); exit 1; }; } + +echo "$as_me:$LINENO: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6 +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_build_alias=$build_alias +test -z "$ac_cv_build_alias" && + ac_cv_build_alias=`$ac_config_guess` +test -z "$ac_cv_build_alias" && + { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6 +build=$ac_cv_build +build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6 +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_host_alias=$host_alias +test -z "$ac_cv_host_alias" && + ac_cv_host_alias=$ac_cv_build_alias +ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6 +host=$ac_cv_host +host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +am__api_version="1.9" +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +test "$program_prefix" != NONE && + program_transform_name="s,^,$program_prefix,;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$,$program_suffix,;$program_transform_name" +# Double any \ or $. echo might interpret backslashes. +# By default was `s,x,x', remove it if useless. +cat <<\_ACEOF >conftest.sed +s/[\\$]/&&/g;s/;s,x,x,$// +_ACEOF +program_transform_name=`echo $program_transform_name | sed -f conftest.sed` +rm conftest.sed + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # We used to keeping the `.' as first argument, in order to + # allow $(mkdir_p) to be used without argument. As in + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. However this is wrong + # for two reasons: + # 1. if the package is installed by a user who cannot write `.' + # make install will fail, + # 2. the above comment should most certainly read + # $(mkdir_p) $(DESTDIR)$(somedir) + # so it does not work when $(somedir) is undefined and + # $(DESTDIR) is not. + # To support the latter case, we have to write + # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), + # so the `.' trick is pointless. + mkdir_p='mkdir -p --' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(install_sh) -d' + fi +fi + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + echo "$as_me:$LINENO: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$AWK" && break +done + +echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +all: + @echo 'ac_maketemp="$(MAKE)"' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='amule' + VERSION='SVN' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +install_sh=${install_sh-"$am_aux_dir/install-sh"} + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + STRIP=$ac_ct_STRIP +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + + + + ac_config_headers="$ac_config_headers config.h" + +echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 +echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6 + # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then + enableval="$enable_maintainer_mode" + USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi; + echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 +echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6 + + +if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + +# Removing -fomit since it causes problems with CryptoPP +CFLAGS="`echo $CFLAGS | sed "s/-fomit-frame-pointer//g"`" +CXXFLAGS="`echo $CXXFLAGS | sed "s/-fomit-frame-pointer//g"`" + +# System detection, need AC_CANONICAL_HOST +case "${host_os}" in +"") + SYS=unknown + ;; +darwin*) + SYS=darwin + CFLAGS="${CFLAGS} -no-cpp-precomp -D_INTL_REDIRECT_MACROS -DNOPCH"; + LDFLAGS="$LDFLAGS -bind_at_load" + touch src/Scanner.cpp + ;; +openbsd*) + SYS=openbsd + LIBS="$LIBS -L/usr/local/lib" + X11LIBS="-lX11 -L/usr/X11R6/lib" + CXXFLAGS=" $CXXFLAGS -D__OPENBSD__" + if test "$DEBUG_FLAGS" != ""; then + DEBUG_FLAGS="-Wall -g -fno-inline -D__DEBUG__" + fi + ;; +*cygwin* | *mingw32*) + SYS=win32 + CFLAGS="$CFLAGS -DNOMINMAX" + CXXFLAGS="$CXXFLAGS -DNOMINMAX" + ;; +solaris*) + RESOLV_LIB="-lresolv -lnsl" + X11LIBS="-lX11" + LIBS="$LIBS -lrt" +esac + + + + +# Checks for programs. +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + echo "$as_me:$LINENO: result: $CXX" >&5 +echo "${ECHO_T}$CXX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 +echo "${ECHO_T}$ac_ct_CXX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CXX" && break +done +test -n "$ac_ct_CXX" || ac_ct_CXX="g++" + + CXX=$ac_ct_CXX +fi + + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C++ compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5 +echo $ECHO_N "checking for C++ compiler default output file name... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C++ compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C++ compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5 +echo $ECHO_N "checking whether the C++ compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C++ compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C++ compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 +GXX=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +CXXFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cxx_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cxx_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cxx_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + + ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi + + +echo "$as_me:$LINENO: result: $_am_result" >&5 +echo "${ECHO_T}$_am_result" >&6 +rm -f confinc confmf + +# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then + enableval="$enable_dependency_tracking" + +fi; +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + + +if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + + +depcc="$CXX" am_compiler_list= + +echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6 +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 +echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 +if test -z "$CXXCPP"; then + if test "${ac_cv_prog_CXXCPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +echo "$as_me:$LINENO: result: $CXXCPP" >&5 +echo "${ECHO_T}$CXXCPP" >&6 +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std1 is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std1. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6 +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + echo "$as_me:$LINENO: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$AWK" && break +done + +if test "$cross_compiling" = yes; then + ac_build_prefix= +test -n "$build_alias" && ac_build_prefix=$build_alias- + + +# Even if we're cross-compiling, we want a compiler here +# that is not a cross-compiler. +saved_cross=$cross_compiling +cross_compiling=no + +ac_ext=c +ac_cpp='$CPP $BUILD_CPPFLAGS' +ac_compile='$BUILD_CC -c $BUILD_CFLAGS $BUILD_CPPFLAGS conftest.$ac_ext >&5' +ac_link='$BUILD_CC -o conftest$ac_build_exeext $BUILD_CFLAGS $BUILD_CPPFLAGS $BUILD_LDFLAGS conftest.$ac_ext $BUILD_LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_build_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_build_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_BUILD_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$BUILD_CC"; then + ac_cv_prog_BUILD_CC="$BUILD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_BUILD_CC="${ac_build_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +BUILD_CC=$ac_cv_prog_BUILD_CC +if test -n "$BUILD_CC"; then + echo "$as_me:$LINENO: result: $BUILD_CC" >&5 +echo "${ECHO_T}$BUILD_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_BUILD_CC"; then + ac_ct_BUILD_CC=$BUILD_CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_BUILD_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_BUILD_CC"; then + ac_cv_prog_ac_ct_BUILD_CC="$ac_ct_BUILD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_BUILD_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_BUILD_CC=$ac_cv_prog_ac_ct_BUILD_CC +if test -n "$ac_ct_BUILD_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_BUILD_CC" >&5 +echo "${ECHO_T}$ac_ct_BUILD_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + BUILD_CC=$ac_ct_BUILD_CC +else + BUILD_CC="$ac_cv_prog_BUILD_CC" +fi + +if test -z "$BUILD_CC"; then + if test -n "$ac_build_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_build_prefix}cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_BUILD_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$BUILD_CC"; then + ac_cv_prog_BUILD_CC="$BUILD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_BUILD_CC="${ac_build_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +BUILD_CC=$ac_cv_prog_BUILD_CC +if test -n "$BUILD_CC"; then + echo "$as_me:$LINENO: result: $BUILD_CC" >&5 +echo "${ECHO_T}$BUILD_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_BUILD_CC"; then + ac_ct_BUILD_CC=$BUILD_CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_BUILD_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_BUILD_CC"; then + ac_cv_prog_ac_ct_BUILD_CC="$ac_ct_BUILD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_BUILD_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_BUILD_CC=$ac_cv_prog_ac_ct_BUILD_CC +if test -n "$ac_ct_BUILD_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_BUILD_CC" >&5 +echo "${ECHO_T}$ac_ct_BUILD_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + BUILD_CC=$ac_ct_BUILD_CC +else + BUILD_CC="$ac_cv_prog_BUILD_CC" +fi + +fi +if test -z "$BUILD_CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_BUILD_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$BUILD_CC"; then + ac_cv_prog_BUILD_CC="$BUILD_CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_BUILD_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_BUILD_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set BUILD_CC to just the basename; use the full file name. + shift + ac_cv_prog_BUILD_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +BUILD_CC=$ac_cv_prog_BUILD_CC +if test -n "$BUILD_CC"; then + echo "$as_me:$LINENO: result: $BUILD_CC" >&5 +echo "${ECHO_T}$BUILD_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$BUILD_CC"; then + if test -n "$ac_build_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_build_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_BUILD_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$BUILD_CC"; then + ac_cv_prog_BUILD_CC="$BUILD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_BUILD_CC="$ac_build_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +BUILD_CC=$ac_cv_prog_BUILD_CC +if test -n "$BUILD_CC"; then + echo "$as_me:$LINENO: result: $BUILD_CC" >&5 +echo "${ECHO_T}$BUILD_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$BUILD_CC" && break + done +fi +if test -z "$BUILD_CC"; then + ac_ct_BUILD_CC=$BUILD_CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_BUILD_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_BUILD_CC"; then + ac_cv_prog_ac_ct_BUILD_CC="$ac_ct_BUILD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_BUILD_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_BUILD_CC=$ac_cv_prog_ac_ct_BUILD_CC +if test -n "$ac_ct_BUILD_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_BUILD_CC" >&5 +echo "${ECHO_T}$ac_ct_BUILD_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_BUILD_CC" && break +done + + BUILD_CC=$ac_ct_BUILD_CC +fi + +fi + + +test -z "$BUILD_CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_build_exeext= +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_build_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_build_exeext + break;; + * ) + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_build_exeext=$ac_cv_build_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_build_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.* ) ac_cv_build_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_build_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_build_exeext +echo "$as_me:$LINENO: result: $ac_cv_build_exeext" >&5 +echo "${ECHO_T}$ac_cv_build_exeext" >&6 + +rm -f conftest.$ac_ext +BUILD_EXEEXT=$ac_cv_build_exeext +ac_build_exeext=$BUILD_EXEEXT + + +# Restore configuration environment +cross_compiling=$saved_cross + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + BUILD_CC="$CC" ; BUILD_EXEEXT=$EXEEXT +fi + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep + + +echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +all: + @echo 'ac_maketemp="$(MAKE)"' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + + +for ac_prog in flex lex +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LEX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LEX"; then + ac_cv_prog_LEX="$LEX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LEX="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +LEX=$ac_cv_prog_LEX +if test -n "$LEX"; then + echo "$as_me:$LINENO: result: $LEX" >&5 +echo "${ECHO_T}$LEX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$LEX" && break +done +test -n "$LEX" || LEX=":" + +if test -z "$LEXLIB" +then + echo "$as_me:$LINENO: checking for yywrap in -lfl" >&5 +echo $ECHO_N "checking for yywrap in -lfl... $ECHO_C" >&6 +if test "${ac_cv_lib_fl_yywrap+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char yywrap (); +int +main () +{ +yywrap (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_fl_yywrap=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_fl_yywrap=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_fl_yywrap" >&5 +echo "${ECHO_T}$ac_cv_lib_fl_yywrap" >&6 +if test $ac_cv_lib_fl_yywrap = yes; then + LEXLIB="-lfl" +else + echo "$as_me:$LINENO: checking for yywrap in -ll" >&5 +echo $ECHO_N "checking for yywrap in -ll... $ECHO_C" >&6 +if test "${ac_cv_lib_l_yywrap+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ll $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char yywrap (); +int +main () +{ +yywrap (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_l_yywrap=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_l_yywrap=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_l_yywrap" >&5 +echo "${ECHO_T}$ac_cv_lib_l_yywrap" >&6 +if test $ac_cv_lib_l_yywrap = yes; then + LEXLIB="-ll" +fi + +fi + +fi + +if test "x$LEX" != "x:"; then + echo "$as_me:$LINENO: checking lex output file root" >&5 +echo $ECHO_N "checking lex output file root... $ECHO_C" >&6 +if test "${ac_cv_prog_lex_root+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # The minimal lex program is just a single line: %%. But some broken lexes +# (Solaris, I think it was) want two %% lines, so accommodate them. +cat >conftest.l <<_ACEOF +%% +%% +_ACEOF +{ (eval echo "$as_me:$LINENO: \"$LEX conftest.l\"") >&5 + (eval $LEX conftest.l) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +if test -f lex.yy.c; then + ac_cv_prog_lex_root=lex.yy +elif test -f lexyy.c; then + ac_cv_prog_lex_root=lexyy +else + { { echo "$as_me:$LINENO: error: cannot find output from $LEX; giving up" >&5 +echo "$as_me: error: cannot find output from $LEX; giving up" >&2;} + { (exit 1); exit 1; }; } +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_lex_root" >&5 +echo "${ECHO_T}$ac_cv_prog_lex_root" >&6 +rm -f conftest.l +LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root + +echo "$as_me:$LINENO: checking whether yytext is a pointer" >&5 +echo $ECHO_N "checking whether yytext is a pointer... $ECHO_C" >&6 +if test "${ac_cv_prog_lex_yytext_pointer+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # POSIX says lex can declare yytext either as a pointer or an array; the +# default is implementation-dependent. Figure out which it is, since +# not all implementations provide the %pointer and %array declarations. +ac_cv_prog_lex_yytext_pointer=no +echo 'extern char *yytext;' >>$LEX_OUTPUT_ROOT.c +ac_save_LIBS=$LIBS +LIBS="$LIBS $LEXLIB" +cat >conftest.$ac_ext <<_ACEOF +`cat $LEX_OUTPUT_ROOT.c` +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_lex_yytext_pointer=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_save_LIBS +rm -f "${LEX_OUTPUT_ROOT}.c" + +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_lex_yytext_pointer" >&5 +echo "${ECHO_T}$ac_cv_prog_lex_yytext_pointer" >&6 +if test $ac_cv_prog_lex_yytext_pointer = yes; then + +cat >>confdefs.h <<\_ACEOF +#define YYTEXT_POINTER 1 +_ACEOF + +fi + +fi +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + RANLIB=$ac_ct_RANLIB +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +for ac_prog in 'bison -y' byacc +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_YACC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$YACC"; then + ac_cv_prog_YACC="$YACC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_YACC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +YACC=$ac_cv_prog_YACC +if test -n "$YACC"; then + echo "$as_me:$LINENO: result: $YACC" >&5 +echo "${ECHO_T}$YACC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$YACC" && break +done +test -n "$YACC" || YACC="yacc" + + +# Find the right ranlib, even when cross-compiling +# And for some other tools for cross compilation +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + RANLIB=$ac_ct_RANLIB +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + STRIP=$ac_ct_STRIP +else + STRIP="$ac_cv_prog_STRIP" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + echo "$as_me:$LINENO: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="ar" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 +echo "${ECHO_T}$ac_ct_AR" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + AR=$ac_ct_AR +else + AR="$ac_cv_prog_AR" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args. +set dummy ${ac_tool_prefix}ld; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LD"; then + ac_cv_prog_LD="$LD" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LD="${ac_tool_prefix}ld" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +LD=$ac_cv_prog_LD +if test -n "$LD"; then + echo "$as_me:$LINENO: result: $LD" >&5 +echo "${ECHO_T}$LD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_LD"; then + ac_ct_LD=$LD + # Extract the first word of "ld", so it can be a program name with args. +set dummy ld; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_LD"; then + ac_cv_prog_ac_ct_LD="$ac_ct_LD" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LD="ld" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_LD=$ac_cv_prog_ac_ct_LD +if test -n "$ac_ct_LD"; then + echo "$as_me:$LINENO: result: $ac_ct_LD" >&5 +echo "${ECHO_T}$ac_ct_LD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + LD=$ac_ct_LD +else + LD="$ac_cv_prog_LD" +fi + + +# +# Add args to configure +# +# Check whether --enable-ccache or --disable-ccache was given. +if test "${enable_ccache+set}" = set; then + enableval="$enable_ccache" + ccache=$enableval +else + ccache=no +fi; + +# Check whether --enable-debug or --disable-debug was given. +if test "${enable_debug+set}" = set; then + enableval="$enable_debug" + USE_DEBUG=$enableval +else + USE_DEBUG=yes +fi; + +# Check whether --enable-optimize or --disable-optimize was given. +if test "${enable_optimize+set}" = set; then + enableval="$enable_optimize" + USE_OPTIMIZE=$enableval +else + USE_OPTIMIZE=no +fi; + +# Check whether --enable-profile or --disable-profile was given. +if test "${enable_profile+set}" = set; then + enableval="$enable_profile" + USE_PROFILE=$enableval +else + USE_PROFILE=no +fi; + +# Check whether --enable-static or --disable-static was given. +if test "${enable_static+set}" = set; then + enableval="$enable_static" + USE_DEBUG_STATIC=$enableval +else + USE_DEBUG_STATIC=no +fi; + +# Check whether --enable-monolithic or --disable-monolithic was given. +if test "${enable_monolithic+set}" = set; then + enableval="$enable_monolithic" + MONOLITHIC=$enableval +else + MONOLITHIC=yes +fi; + +# Check whether --enable-amule-daemon or --disable-amule-daemon was given. +if test "${enable_amule_daemon+set}" = set; then + enableval="$enable_amule_daemon" + AMULE_DAEMON=$enableval +else + AMULE_DAEMON=no +fi; + +# Check whether --enable-amulecmd or --disable-amulecmd was given. +if test "${enable_amulecmd+set}" = set; then + enableval="$enable_amulecmd" + AMULECMD=$enableval +else + AMULECMD=no +fi; + +# Check whether --enable-webserver or --disable-webserver was given. +if test "${enable_webserver+set}" = set; then + enableval="$enable_webserver" + WEB=$enableval +else + WEB=no +fi; + +# Check whether --enable-amule-gui or --disable-amule-gui was given. +if test "${enable_amule_gui+set}" = set; then + enableval="$enable_amule_gui" + AMULE_GUI=$enableval +else + AMULE_GUI=no +fi; + +# Check whether --enable-cas or --disable-cas was given. +if test "${enable_cas+set}" = set; then + enableval="$enable_cas" + CAS=$enableval +else + CAS=no +fi; + +# Check whether --enable-wxcas or --disable-wxcas was given. +if test "${enable_wxcas+set}" = set; then + enableval="$enable_wxcas" + WXCAS=$enableval +else + WXCAS=no +fi; + +# Check whether --enable-ed2k or --disable-ed2k was given. +if test "${enable_ed2k+set}" = set; then + enableval="$enable_ed2k" + ED2K=$enableval +else + ED2K=yes +fi; + +# Check whether --enable-alc or --disable-alc was given. +if test "${enable_alc+set}" = set; then + enableval="$enable_alc" + ALC=$enableval +else + ALC=no +fi; + +# Check whether --enable-alcc or --disable-alcc was given. +if test "${enable_alcc+set}" = set; then + enableval="$enable_alcc" + ALCC=$enableval +else + ALCC=no +fi; + +# Check whether --enable-monolithic or --disable-monolithic was given. +if test "${enable_monolithic+set}" = set; then + enableval="$enable_monolithic" + MONOLITHIC=$enableval +else + MONOLITHIC=yes +fi; + +# Check whether --enable-upnp or --disable-upnp was given. +if test "${enable_upnp+set}" = set; then + enableval="$enable_upnp" + ENABLE_UPNP=$enableval +else + ENABLE_UPNP=yes +fi; + +# Check whether --enable-geoip or --disable-geoip was given. +if test "${enable_geoip+set}" = set; then + enableval="$enable_geoip" + ENABLE_IP2COUNTRY=$enableval +else + ENABLE_IP2COUNTRY=no +fi; + + +# Check whether --with-geoip-headers or --without-geoip-headers was given. +if test "${with_geoip_headers+set}" = set; then + withval="$with_geoip_headers" + GEOIP_INCLUDE="-I$withval" +fi; + + +# Check whether --with-geoip-lib or --without-geoip-lib was given. +if test "${with_geoip_lib+set}" = set; then + withval="$with_geoip_lib" + GEOIP_LIB="-L$withval $GEOIP_LIB" +fi; + + +# Check whether --with-geoip-static or --without-geoip-static was given. +if test "${with_geoip_static+set}" = set; then + withval="$with_geoip_static" + if test "$withval" != "no"; then + GEOIP_LIB="-Wl,-Bstatic $GEOIP_LIB -Wl,-Bdynamic" + fi +fi; + + +# Check whether --with-denoise-level or --without-denoise-level was given. +if test "${with_denoise_level+set}" = set; then + withval="$with_denoise_level" + denoiselevel="$withval" +else + denoiselevel=yes +fi; + + +# Check whether --with-gnu-malloc or --without-gnu-malloc was given. +if test "${with_gnu_malloc+set}" = set; then + withval="$with_gnu_malloc" + gnumalloc=$withval +else + gnumalloc=yes +fi; + + +# Check whether --with-language or --without-language was given. +if test "${with_language+set}" = set; then + withval="$with_language" + LINGUAS="`echo $withval | sed -e 's/,/ /g'`" +fi; + +# Checking for libs before all other stuff to break +# configure as soon as possible in case of a missing one +# to avoid losing too much time + +# Sets gettext version. + + +# Check for zlib + + +# Check whether --with-zlib or --without-zlib was given. +if test "${with_zlib+set}" = set; then + withval="$with_zlib" + ac_zlib="$withval" +else + ac_zlib=yes +fi; + + + case "$ac_zlib" in + no) + { { echo "$as_me:$LINENO: error: zlib >= 1.1.4 is required for aMule" >&5 +echo "$as_me: error: zlib >= 1.1.4 is required for aMule" >&2;} + { (exit 1); exit 1; }; } + ;; + yes | sys) + ;; + *) + ac_zlib_prefix="$ac_zlib" + esac + + if test -n "$ac_zlib_prefix"; then + ac_tmp_CPPFLAGS="$CPPFLAGS" + ac_tmp_LDFLAGS="$LDFLAGS" + CPPFLAGS="$CPPFLAGS -I$ac_zlib_prefix/include" + LDFLAGS="-L$ac_zlib_prefix/lib" + fi + ac_tmp_LIBS="$LIBS" + LIBS="-lz $LIBS" + echo "$as_me:$LINENO: checking for zlib >= 1.1.4" >&5 +echo $ECHO_N "checking for zlib >= 1.1.4... $ECHO_C" >&6 + if test "$cross_compiling" = yes; then + + result=no + z_version='' + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + #include + +int +main () +{ + + const char zver[] = "\nZLIB_VERSION_START" ZLIB_VERSION "ZLIB_VERSION_END\n"; + zlibVersion(); + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + ZLIB_VERSION=`grep -a '^ZLIB_VERSION_START.*ZLIB_VERSION_END$' conftest$ac_exeext | sed 's/^ZLIB_VERSION_START\(.*\)ZLIB_VERSION_END$/\1/'` + ac_cross_zver_max="`echo $ZLIB_VERSION | cut -d. -f1`" + ac_cross_zver_mid="`echo $ZLIB_VERSION | cut -d. -f2`" + ac_cross_zver_min="`echo $ZLIB_VERSION | cut -d. -f3`" + if test "$ac_cross_zver_max" -gt "1"; then + result=yes + elif test "$ac_cross_zver_max" -eq "1"; then + if test "$ac_cross_zver_mid" -gt "1"; then + result=yes + elif "$ac_cross_zver_mid" -eq "1"; then + if test "$ac_cross_zver_min" -ge "4"; then + result=yes + fi + fi + fi + if test x$result = xyes; then + z_version=" (version $ZLIB_VERSION)" + fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + echo "$as_me:$LINENO: result: $result$z_version" >&5 +echo "${ECHO_T}$result$z_version" >&6 + +else + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + #include + #include + +int +main () +{ + char *zver = zlibVersion(); + FILE *f=fopen("conftestval", "w"); + if (!f) return 1; + fprintf(f, "%s", + zver[0] > '1' || + (zver[0] == '1' && + (zver[2] > '1' || + (zver[2] == '1' && + zver[4] >= '4'))) ? "yes" : "no"); + fclose(f); + f=fopen("conftestver", "w"); + if (f) { + fprintf(f, "%s", ZLIB_VERSION); + fclose(f); + } + + ; + return 0; +} + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + if test -f conftestval; then + result=`cat conftestval` + else + result=no + fi + if test x$result = xyes; then + if test -f conftestver; then + ZLIB_VERSION=`cat conftestver` + z_version=" (version $ZLIB_VERSION)" + else + z_version="" + fi + fi + echo "$as_me:$LINENO: result: $result$z_version" >&5 +echo "${ECHO_T}$result$z_version" >&6 + +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) + + result=no + echo "$as_me:$LINENO: result: $result" >&5 +echo "${ECHO_T}$result" >&6 + +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + if test x$result = xno; then + + if test "${ac_tmp_CPPFLAGS+set}" = set; then + CPPFLAGS="$ac_tmp_CPPFLAGS" + fi + if test "${ac_tmp_LDFLAGS+set}" = set; then + LDFLAGS="$ac_tmp_LDFLAGS" + fi + LIBS="$ac_tmp_LIBS" + { { echo "$as_me:$LINENO: error: zlib >= 1.1.4 is required for aMule" >&5 +echo "$as_me: error: zlib >= 1.1.4 is required for aMule" >&2;} + { (exit 1); exit 1; }; } + +fi + + + + +if test x$CAS = xyes -o x$WEB = xyes; then +# Check for gd + + +# Check whether --with-gdlib-prefix or --without-gdlib-prefix was given. +if test "${with_gdlib_prefix+set}" = set; then + withval="$with_gdlib_prefix" + gdlib_config_prefix="$withval" +else + gdlib_config_prefix="" +fi; + +# Check whether --with-gdlib-config or --without-gdlib-config was given. +if test "${with_gdlib_config+set}" = set; then + withval="$with_gdlib_config" + gdlib_config_name="$withval" +else + gdlib_config_name="" +fi; + + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + if test x${GDLIB_CONFIG_NAME+set} != xset ; then + GDLIB_CONFIG_NAME=gdlib-config + fi + if test "x$gdlib_config_name" != x ; then + GDLIB_CONFIG_NAME="$gdlib_config_name" + fi + + if test x$gdlib_config_prefix != x ; then + GDLIB_LOOKUP_PATH="$gdlib_config_prefix/bin" + fi + + if test -x "$GDLIB_CONFIG_NAME" ; then + echo "$as_me:$LINENO: checking for gdlib-config" >&5 +echo $ECHO_N "checking for gdlib-config... $ECHO_C" >&6 + GDLIB_CONFIG_PATH="$GDLIB_CONFIG_NAME" + echo "$as_me:$LINENO: result: $GDLIB_CONFIG_PATH" >&5 +echo "${ECHO_T}$GDLIB_CONFIG_PATH" >&6 + else + # Extract the first word of "$GDLIB_CONFIG_NAME", so it can be a program name with args. +set dummy $GDLIB_CONFIG_NAME; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_GDLIB_CONFIG_PATH+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $GDLIB_CONFIG_PATH in + [\\/]* | ?:[\\/]*) + ac_cv_path_GDLIB_CONFIG_PATH="$GDLIB_CONFIG_PATH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_dummy=""$GDLIB_LOOKUP_PATH:$PATH"" +for as_dir in $as_dummy +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GDLIB_CONFIG_PATH="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_GDLIB_CONFIG_PATH" && ac_cv_path_GDLIB_CONFIG_PATH="no" + ;; +esac +fi +GDLIB_CONFIG_PATH=$ac_cv_path_GDLIB_CONFIG_PATH + +if test -n "$GDLIB_CONFIG_PATH"; then + echo "$as_me:$LINENO: result: $GDLIB_CONFIG_PATH" >&5 +echo "${ECHO_T}$GDLIB_CONFIG_PATH" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + fi + + if test "$GDLIB_CONFIG_PATH" != "no" ; then + GDLIB_VERSION="" + + echo "$as_me:$LINENO: checking for gdlib version >= 2.0.0" >&5 +echo $ECHO_N "checking for gdlib version >= 2.0.0... $ECHO_C" >&6 + + GDLIB_CONFIG_WITH_ARGS="$GDLIB_CONFIG_PATH $gdlib_config_args" + + GDLIB_VERSION=`$GDLIB_CONFIG_WITH_ARGS --version` + gdlib_config_major_version=`echo $GDLIB_VERSION | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1/'` + gdlib_config_minor_version=`echo $GDLIB_VERSION | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\2/'` + gdlib_config_micro_version=`echo $GDLIB_VERSION | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\3/'` + + gdlib_ver_ok="" + if test $gdlib_config_major_version -gt 2; then + gdlib_ver_ok=yes + else + if test $gdlib_config_major_version -eq 2; then + if test $gdlib_config_minor_version -gt 0; then + gdlib_ver_ok=yes + else + if test $gdlib_config_minor_version -eq 0; then + if test $gdlib_config_micro_version -ge 0; then + gdlib_ver_ok=yes + fi + fi + fi + fi + fi + + if test x$gdlib_ver_ok = x ; then + if test x$GDLIB_VERSION = x; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + else + echo "$as_me:$LINENO: result: no (version $GDLIB_VERSION is not new enough)" >&5 +echo "${ECHO_T}no (version $GDLIB_VERSION is not new enough)" >&6 + GDLIB_VERSION= + fi + + { echo "$as_me:$LINENO: + WARNING: gd-lib >= 2.0.0, or a functional gd.h (from gd-devel) not found. + Please check that gdlib-config is in your default path, check out + LD_LIBRARY_PATH or equivalent variable. + Or this might also be that your gdlib-config has other name. + Please try again with --with-gdlib-config=/usr/bin/gdlib-config + (replace /usr/bin/gdlib-config with a valid path to your gdlib-config). + If you use compiled packages check if you have devel pack installed. + To download the latest version check http://www.boutell.com/gd + for sources. + " >&5 +echo "$as_me: + WARNING: gd-lib >= 2.0.0, or a functional gd.h (from gd-devel) not found. + Please check that gdlib-config is in your default path, check out + LD_LIBRARY_PATH or equivalent variable. + Or this might also be that your gdlib-config has other name. + Please try again with --with-gdlib-config=/usr/bin/gdlib-config + (replace /usr/bin/gdlib-config with a valid path to your gdlib-config). + If you use compiled packages check if you have devel pack installed. + To download the latest version check http://www.boutell.com/gd + for sources. + " >&6;} + CAS_DEFS="" + + else + echo "$as_me:$LINENO: result: yes (version $GDLIB_VERSION)" >&5 +echo "${ECHO_T}yes (version $GDLIB_VERSION)" >&6 + if test "${ac_cv_header_gd_h+set}" = set; then + echo "$as_me:$LINENO: checking for gd.h" >&5 +echo $ECHO_N "checking for gd.h... $ECHO_C" >&6 +if test "${ac_cv_header_gd_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_gd_h" >&5 +echo "${ECHO_T}$ac_cv_header_gd_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking gd.h usability" >&5 +echo $ECHO_N "checking gd.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking gd.h presence" >&5 +echo $ECHO_N "checking gd.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: gd.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: gd.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: gd.h: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: gd.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: gd.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: gd.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: gd.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: gd.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: gd.h: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: gd.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: gd.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: gd.h: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: gd.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: gd.h: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: gd.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: gd.h: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------ ## +## Report this to admin@amule.org ## +## ------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for gd.h" >&5 +echo $ECHO_N "checking for gd.h... $ECHO_C" >&6 +if test "${ac_cv_header_gd_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_gd_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_gd_h" >&5 +echo "${ECHO_T}$ac_cv_header_gd_h" >&6 + +fi + + + if test $ac_cv_header_gd_h = yes; then + GDLIB_CFLAGS="`$GDLIB_CONFIG_WITH_ARGS --cflags`" + GDLIB_LDFLAGS="`$GDLIB_CONFIG_WITH_ARGS --ldflags`" + GDLIB_LIBS="`$GDLIB_CONFIG_WITH_ARGS --libs`" + + CAS_DEFS="-D__GD__" + GDLIB_LIBS="-lgd $GDLIB_LIBS" + + else + GDLIB_VERSION= + + { echo "$as_me:$LINENO: + WARNING: gd-lib >= 2.0.0, or a functional gd.h (from gd-devel) not found. + Please check that gdlib-config is in your default path, check out + LD_LIBRARY_PATH or equivalent variable. + Or this might also be that your gdlib-config has other name. + Please try again with --with-gdlib-config=/usr/bin/gdlib-config + (replace /usr/bin/gdlib-config with a valid path to your gdlib-config). + If you use compiled packages check if you have devel pack installed. + To download the latest version check http://www.boutell.com/gd + for sources. + " >&5 +echo "$as_me: + WARNING: gd-lib >= 2.0.0, or a functional gd.h (from gd-devel) not found. + Please check that gdlib-config is in your default path, check out + LD_LIBRARY_PATH or equivalent variable. + Or this might also be that your gdlib-config has other name. + Please try again with --with-gdlib-config=/usr/bin/gdlib-config + (replace /usr/bin/gdlib-config with a valid path to your gdlib-config). + If you use compiled packages check if you have devel pack installed. + To download the latest version check http://www.boutell.com/gd + for sources. + " >&6;} + CAS_DEFS="" + + fi + fi + else + + { echo "$as_me:$LINENO: + WARNING: gd-lib >= 2.0.0, or a functional gd.h (from gd-devel) not found. + Please check that gdlib-config is in your default path, check out + LD_LIBRARY_PATH or equivalent variable. + Or this might also be that your gdlib-config has other name. + Please try again with --with-gdlib-config=/usr/bin/gdlib-config + (replace /usr/bin/gdlib-config with a valid path to your gdlib-config). + If you use compiled packages check if you have devel pack installed. + To download the latest version check http://www.boutell.com/gd + for sources. + " >&5 +echo "$as_me: + WARNING: gd-lib >= 2.0.0, or a functional gd.h (from gd-devel) not found. + Please check that gdlib-config is in your default path, check out + LD_LIBRARY_PATH or equivalent variable. + Or this might also be that your gdlib-config has other name. + Please try again with --with-gdlib-config=/usr/bin/gdlib-config + (replace /usr/bin/gdlib-config with a valid path to your gdlib-config). + If you use compiled packages check if you have devel pack installed. + To download the latest version check http://www.boutell.com/gd + for sources. + " >&6;} + CAS_DEFS="" + + fi + + + + +else + CAS_DEFS="" + GDLIB_LIBS="" + GDLIB_CFLAGS="" + GDLIB_LDFLAGS="" + GDLIB_VERSION="not_needed" +fi + + + + +if test x$WEB = xyes; then +# Check for libpng + + +# Check whether --with-libpng-prefix or --without-libpng-prefix was given. +if test "${with_libpng_prefix+set}" = set; then + withval="$with_libpng_prefix" + libpng_config_prefix="$withval" +else + libpng_config_prefix="" +fi; + +# Check whether --with-libpng-config or --without-libpng-config was given. +if test "${with_libpng_config+set}" = set; then + withval="$with_libpng_config" + libpng_config_name="$withval" +else + libpng_config_name="" +fi; + + + if test x${LIBPNG_CONFIG_NAME+set} != xset ; then + LIBPNG_CONFIG_NAME=libpng-config + fi + if test "x$libpng_config_name" != x ; then + LIBPNG_CONFIG_NAME="$libpng_config_name" + fi + + if test x$libpng_config_prefix != x ; then + LIBPNG_LOOKUP_PATH="$libpng_config_prefix/bin" + fi + + if test -x "$LIBPNG_CONFIG_NAME" ; then + echo "$as_me:$LINENO: checking for libpng-config" >&5 +echo $ECHO_N "checking for libpng-config... $ECHO_C" >&6 + LIBPNG_CONFIG_PATH="$LIBPNG_CONFIG_NAME" + echo "$as_me:$LINENO: result: $LIBPNG_CONFIG_PATH" >&5 +echo "${ECHO_T}$LIBPNG_CONFIG_PATH" >&6 + else + # Extract the first word of "$LIBPNG_CONFIG_NAME", so it can be a program name with args. +set dummy $LIBPNG_CONFIG_NAME; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_LIBPNG_CONFIG_PATH+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $LIBPNG_CONFIG_PATH in + [\\/]* | ?:[\\/]*) + ac_cv_path_LIBPNG_CONFIG_PATH="$LIBPNG_CONFIG_PATH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_dummy=""$LIBPNG_LOOKUP_PATH:$PATH"" +for as_dir in $as_dummy +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_LIBPNG_CONFIG_PATH="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_LIBPNG_CONFIG_PATH" && ac_cv_path_LIBPNG_CONFIG_PATH="no" + ;; +esac +fi +LIBPNG_CONFIG_PATH=$ac_cv_path_LIBPNG_CONFIG_PATH + +if test -n "$LIBPNG_CONFIG_PATH"; then + echo "$as_me:$LINENO: result: $LIBPNG_CONFIG_PATH" >&5 +echo "${ECHO_T}$LIBPNG_CONFIG_PATH" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + fi + + if test "$LIBPNG_CONFIG_PATH" != "no" ; then + LIBPNG_VERSION="" + + echo "$as_me:$LINENO: checking for libpng version >= 1.2.0" >&5 +echo $ECHO_N "checking for libpng version >= 1.2.0... $ECHO_C" >&6 + + LIBPNG_CONFIG_WITH_ARGS="$LIBPNG_CONFIG_PATH $libpng_config_args" + + LIBPNG_VERSION=`$LIBPNG_CONFIG_WITH_ARGS --version` + libpng_config_major_version=`echo $LIBPNG_VERSION | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1/'` + libpng_config_minor_version=`echo $LIBPNG_VERSION | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\2/'` + libpng_config_micro_version=`echo $LIBPNG_VERSION | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\3/'` + + libpng_ver_ok="" + if test $libpng_config_major_version -gt 1; then + libpng_ver_ok=yes + else + if test $libpng_config_major_version -eq 1; then + if test $libpng_config_minor_version -gt 2; then + libpng_ver_ok=yes + else + if test $libpng_config_minor_version -eq 2; then + if test $libpng_config_micro_version -ge 0; then + libpng_ver_ok=yes + fi + fi + fi + fi + fi + + if test x$libpng_ver_ok = x ; then + if test x$LIBPNG_VERSION = x; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + else + echo "$as_me:$LINENO: result: no (version $LIBPNG_VERSION is not new enough)" >&5 +echo "${ECHO_T}no (version $LIBPNG_VERSION is not new enough)" >&6 + fi + LIBPNG_CFLAGS="" + LIBPNG_CXXFLAGS="" + LIBPNG_LDFLAGS="" + LIBPNG_LIBS="" + LIBPNG_VERSION="" + + { echo "$as_me:$LINENO: + WARNING: libpng-devel >= 1.2.0 is needed for amuleweb + " >&5 +echo "$as_me: + WARNING: libpng-devel >= 1.2.0 is needed for amuleweb + " >&6;} + AMULEWEB_DEFS="" + + else + LIBPNG_LIBS=`$LIBPNG_CONFIG_WITH_ARGS --libs` + LIBPNG_LDFLAGS=`$LIBPNG_CONFIG_WITH_ARGS --ldflags | sed -e "s/ *${LIBPNG_LIBS}$//"` + LIBPNG_CFLAGS=`$LIBPNG_CONFIG_WITH_ARGS --cflags` + LIBPNG_CXXFLAGS=$LIBPNG_CFLAGS + echo "$as_me:$LINENO: result: yes (version $LIBPNG_VERSION)" >&5 +echo "${ECHO_T}yes (version $LIBPNG_VERSION)" >&6 + AMULEWEB_DEFS="-DWITH_LIBPNG" + fi + + else + echo "$as_me:$LINENO: checking for libpng >= 1.2.0" >&5 +echo $ECHO_N "checking for libpng >= 1.2.0... $ECHO_C" >&6 + saved_LIBS="$LIBS" + LIBS="$LIBS -lpng -lz -lm" + LIBPNG_CFLAGS="" + LIBPNG_CXXFLAGS="" + LIBPNG_LDFLAGS="" + LIBPNG_LIBS="" + if test "$cross_compiling" = yes; then + + echo "$as_me:$LINENO: result: cross-compilation detected, checking only the header" >&5 +echo "${ECHO_T}cross-compilation detected, checking only the header" >&6 + if test "${ac_cv_header_png_h+set}" = set; then + echo "$as_me:$LINENO: checking for png.h" >&5 +echo $ECHO_N "checking for png.h... $ECHO_C" >&6 +if test "${ac_cv_header_png_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_png_h" >&5 +echo "${ECHO_T}$ac_cv_header_png_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking png.h usability" >&5 +echo $ECHO_N "checking png.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking png.h presence" >&5 +echo $ECHO_N "checking png.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: png.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: png.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: png.h: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: png.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: png.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: png.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: png.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: png.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: png.h: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: png.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: png.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: png.h: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: png.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: png.h: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: png.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: png.h: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------ ## +## Report this to admin@amule.org ## +## ------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for png.h" >&5 +echo $ECHO_N "checking for png.h... $ECHO_C" >&6 +if test "${ac_cv_header_png_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_png_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_png_h" >&5 +echo "${ECHO_T}$ac_cv_header_png_h" >&6 + +fi +if test $ac_cv_header_png_h = yes; then + result=yes +else + result=no +fi + + + if test x$result = xyes; then + LIBPNG_VERSION="detected" + LIBPNG_LIBS="-lpng -lz -lm" + fi + +else + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + #include + #include + + /* Check linking to png library */ + void dummy() { + png_check_sig(NULL, 0); + } + +int +main () +{ + /* png.h defines PNG_LIBPNG_VER=xyyzz */ + FILE *f=fopen("conftestval", "w"); + if (!f) exit(1); + fprintf(f, "%s", (PNG_LIBPNG_VER >= 1 * 10000 + 2 * 100 + 0) ? "yes" : "no"); + fclose(f); + f=fopen("conftestver", "w"); + if (!f) exit(0); + fprintf(f, "%s", PNG_LIBPNG_VER_STRING); + fclose(f); + exit(0); + + ; + return 0; +} + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + if test -f conftestval; then + result=`cat conftestval` +else + result=no +fi + + if test x$result = xyes; then + if test -f conftestver; then + LIBPNG_VERSION=`cat conftestver` + lib_version=" (version $LIBPNG_VERSION)" + else + lib_version="" + fi + fi + echo "$as_me:$LINENO: result: $result$lib_version" >&5 +echo "${ECHO_T}$result$lib_version" >&6 + LIBPNG_LIBS="-lpng -lz -lm" + +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) + + result=no + echo "$as_me:$LINENO: result: $result" >&5 +echo "${ECHO_T}$result" >&6 + +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + if test x$result = xyes; then + AMULEWEB_DEFS="-DWITH_LIBPNG" +else + + { echo "$as_me:$LINENO: + WARNING: libpng-devel >= 1.2.0 is needed for amuleweb + " >&5 +echo "$as_me: + WARNING: libpng-devel >= 1.2.0 is needed for amuleweb + " >&6;} + AMULEWEB_DEFS="" + +fi + + LIBS="$saved_LIBS" + fi + + + + +else + AMULEWEB_DEFS="" + LIBPNG_LIBS="" + LIBPNG_CFLAGS="" + LIBPNG_CXXFLAGS="" + LIBPNG_LDFLAGS="" + LIBPNG_VERSION="not_needed" +fi + + + + +# Check for perl File::Copy +echo "$as_me:$LINENO: checking for File::Copy" >&5 +echo $ECHO_N "checking for File::Copy... $ECHO_C" >&6 + if perl -e "require File::Copy" 2>/dev/null; then + echo "$as_me:$LINENO: result: ok" >&5 +echo "${ECHO_T}ok" >&6 + else + { { echo "$as_me:$LINENO: error: File::Copy perl module is required" >&5 +echo "$as_me: error: File::Copy perl module is required" >&2;} + { (exit 1); exit 1; }; } + fi + + +# Check if we need the GUI +echo "$as_me:$LINENO: checking whether we need the GUI" >&5 +echo $ECHO_N "checking whether we need the GUI... $ECHO_C" >&6 +if test x$MONOLITHIC = xyes; then + need_gui=yes +fi + +if test x$WXCAS = xyes; then + need_gui=yes +fi + +if test x$ALC = xyes; then + need_gui=yes +fi + +if test x$AMULE_GUI = xyes; then + need_gui=yes +fi + +if test ${need_gui:+set} != xset; then + need_gui=no +fi + +echo "$as_me:$LINENO: result: $need_gui" >&5 +echo "${ECHO_T}$need_gui" >&6 + + +# Check for GeoIP (required for IP2Country capability) +if test x"$ENABLE_IP2COUNTRY" = x"yes" ; then + GEOIP_LIB="-lGeoIP" + CXXFLAGS="$CXXFLAGS $GEOIP_INCLUDE" + LIBS="$LIBS $GEOIP_LIB" + if test "${ac_cv_header_GeoIP_h+set}" = set; then + echo "$as_me:$LINENO: checking for GeoIP.h" >&5 +echo $ECHO_N "checking for GeoIP.h... $ECHO_C" >&6 +if test "${ac_cv_header_GeoIP_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_GeoIP_h" >&5 +echo "${ECHO_T}$ac_cv_header_GeoIP_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking GeoIP.h usability" >&5 +echo $ECHO_N "checking GeoIP.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking GeoIP.h presence" >&5 +echo $ECHO_N "checking GeoIP.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: GeoIP.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: GeoIP.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: GeoIP.h: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: GeoIP.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: GeoIP.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: GeoIP.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: GeoIP.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: GeoIP.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: GeoIP.h: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: GeoIP.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: GeoIP.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: GeoIP.h: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: GeoIP.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: GeoIP.h: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: GeoIP.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: GeoIP.h: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------ ## +## Report this to admin@amule.org ## +## ------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for GeoIP.h" >&5 +echo $ECHO_N "checking for GeoIP.h... $ECHO_C" >&6 +if test "${ac_cv_header_GeoIP_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_GeoIP_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_GeoIP_h" >&5 +echo "${ECHO_T}$ac_cv_header_GeoIP_h" >&6 + +fi +if test $ac_cv_header_GeoIP_h = yes; then + : +else + { { echo "$as_me:$LINENO: error: --enable-geoip passed to configure, but the GeoIP header files were not found" >&5 +echo "$as_me: error: --enable-geoip passed to configure, but the GeoIP header files were not found" >&2;} + { (exit 1); exit 1; }; } +fi + + + echo "$as_me:$LINENO: checking for GeoIP_open in -lGeoIP" >&5 +echo $ECHO_N "checking for GeoIP_open in -lGeoIP... $ECHO_C" >&6 +if test "${ac_cv_lib_GeoIP_GeoIP_open+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lGeoIP $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char GeoIP_open (); +int +main () +{ +GeoIP_open (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_GeoIP_GeoIP_open=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_GeoIP_GeoIP_open=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_GeoIP_GeoIP_open" >&5 +echo "${ECHO_T}$ac_cv_lib_GeoIP_GeoIP_open" >&6 +if test $ac_cv_lib_GeoIP_GeoIP_open = yes; then + +cat >>confdefs.h <<\_ACEOF +#define SUPPORT_GEOIP 1 +_ACEOF + +else + { { echo "$as_me:$LINENO: error: --enable-geoip passed to configure, but the GeoIP libraries were not found" >&5 +echo "$as_me: error: --enable-geoip passed to configure, but the GeoIP libraries were not found" >&2;} + { (exit 1); exit 1; }; } +fi + +fi + + + + +# Check if the compiler is broken, wrt. exceptions. + + + echo "$as_me:$LINENO: checking for exception-handling" >&5 +echo $ECHO_N "checking for exception-handling... $ECHO_C" >&6 + + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + if test "$cross_compiling" = yes; then + + echo "$as_me:$LINENO: result: undeterminable" >&5 +echo "${ECHO_T}undeterminable" >&6 + { echo "$as_me:$LINENO: WARNING: + Cross-compilation detected, so exception handling cannot be tested. + Note that broken exception handling in your compiler may lead to + unexpected crashes." >&5 +echo "$as_me: WARNING: + Cross-compilation detected, so exception handling cannot be tested. + Note that broken exception handling in your compiler may lead to + unexpected crashes." >&2;} + +else + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + try { + throw 1; + } catch (int) { + return 0; + } + return 1; + + ; + return 0; +} + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) + + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + { { echo "$as_me:$LINENO: error: Exception handling does not work. Broken compiler?" >&5 +echo "$as_me: error: Exception handling does not work. Broken compiler?" >&2;} + { (exit 1); exit 1; }; } + +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# Check for wx + + +# Check whether --with-wxdir or --without-wxdir was given. +if test "${with_wxdir+set}" = set; then + withval="$with_wxdir" + wx_config_name="$withval/wx-config" + wx_config_args="--inplace" +fi; + +# Check whether --with-wx-config or --without-wx-config was given. +if test "${with_wx_config+set}" = set; then + withval="$with_wx_config" + wx_config_name="$withval" +fi; + +# Check whether --with-wx-prefix or --without-wx-prefix was given. +if test "${with_wx_prefix+set}" = set; then + withval="$with_wx_prefix" + wx_config_prefix="$withval" +else + wx_config_prefix="" +fi; + +# Check whether --with-wx-exec-prefix or --without-wx-exec-prefix was given. +if test "${with_wx_exec_prefix+set}" = set; then + withval="$with_wx_exec_prefix" + wx_config_exec_prefix="$withval" +else + wx_config_exec_prefix="" +fi; + + + + + + + + + + + + +# Check whether --with-toolkit or --without-toolkit was given. +if test "${with_toolkit+set}" = set; then + withval="$with_toolkit" + +else + withval="auto" +fi; + + echo "$as_me:$LINENO: checking for the --with-toolkit option" >&5 +echo $ECHO_N "checking for the --with-toolkit option... $ECHO_C" >&6 + if test "$withval" = "auto" ; then + echo "$as_me:$LINENO: result: will be automatically detected" >&5 +echo "${ECHO_T}will be automatically detected" >&6 + TOOLKIT="auto" + else + TOOLKIT="$withval" + + if test "$TOOLKIT" != "gtk1" -a "$TOOLKIT" != "gtk2" -a \ + "$TOOLKIT" != "msw" -a "$TOOLKIT" != "motif" -a \ + "$TOOLKIT" != "x11" -a "$TOOLKIT" != "mac" -a \ + "$TOOLKIT" != "mgl" -a "$TOOLKIT" != "dfb" -a \ + "$TOOLKIT" != "base" ; then + { { echo "$as_me:$LINENO: error: + Unrecognized option value (allowed values: auto, gtk1, gtk2, msw, motif, x11, mac, mgl, dfb, base) + " >&5 +echo "$as_me: error: + Unrecognized option value (allowed values: auto, gtk1, gtk2, msw, motif, x11, mac, mgl, dfb, base) + " >&2;} + { (exit 1); exit 1; }; } + fi + + echo "$as_me:$LINENO: result: $TOOLKIT" >&5 +echo "${ECHO_T}$TOOLKIT" >&6 + fi + + + + + +# Check whether --with-wxshared or --without-wxshared was given. +if test "${with_wxshared+set}" = set; then + withval="$with_wxshared" + +else + withval="auto" +fi; + + echo "$as_me:$LINENO: checking for the --with-wxshared option" >&5 +echo $ECHO_N "checking for the --with-wxshared option... $ECHO_C" >&6 + if test "$withval" = "yes" ; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + WX_SHARED=1 + + elif test "1" = "1" -a "$withval" = "no" ; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + WX_SHARED=0 + elif test "$withval" = "auto" ; then + echo "$as_me:$LINENO: result: will be automatically detected" >&5 +echo "${ECHO_T}will be automatically detected" >&6 + WX_SHARED="auto" + else + { { echo "$as_me:$LINENO: error: + Unrecognized option value (allowed values: yes, auto) + " >&5 +echo "$as_me: error: + Unrecognized option value (allowed values: yes, auto) + " >&2;} + { (exit 1); exit 1; }; } + fi + + + + + +# Check whether --with-wxdebug or --without-wxdebug was given. +if test "${with_wxdebug+set}" = set; then + withval="$with_wxdebug" + +else + withval="auto" +fi; + + echo "$as_me:$LINENO: checking for the --with-wxdebug option" >&5 +echo $ECHO_N "checking for the --with-wxdebug option... $ECHO_C" >&6 + if test "$withval" = "yes" ; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + WX_DEBUG=1 + + elif test "1" = "1" -a "$withval" = "no" ; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + WX_DEBUG=0 + elif test "$withval" = "auto" ; then + echo "$as_me:$LINENO: result: will be automatically detected" >&5 +echo "${ECHO_T}will be automatically detected" >&6 + WX_DEBUG="auto" + else + { { echo "$as_me:$LINENO: error: + Unrecognized option value (allowed values: yes, auto) + " >&5 +echo "$as_me: error: + Unrecognized option value (allowed values: yes, auto) + " >&2;} + { (exit 1); exit 1; }; } + fi + + + + + +# Check whether --with-wxversion or --without-wxversion was given. +if test "${with_wxversion+set}" = set; then + withval="$with_wxversion" + +else + withval="auto" +fi; + + echo "$as_me:$LINENO: checking for the --with-wxversion option" >&5 +echo $ECHO_N "checking for the --with-wxversion option... $ECHO_C" >&6 + if test "$withval" = "auto" ; then + echo "$as_me:$LINENO: result: will be automatically detected" >&5 +echo "${ECHO_T}will be automatically detected" >&6 + WX_VERSION="auto" + else + + wx_requested_major_version=`echo $withval | \ + sed 's/\([0-9]*\).\([0-9]*\).*/\1/'` + wx_requested_minor_version=`echo $withval | \ + sed 's/\([0-9]*\).\([0-9]*\).*/\2/'` + + if test "${#wx_requested_major_version}" != "1" -o \ + "${#wx_requested_minor_version}" != "1" ; then + { { echo "$as_me:$LINENO: error: + Unrecognized option value (allowed values: auto, 2.6, 2.7, 2.8, 2.9) + " >&5 +echo "$as_me: error: + Unrecognized option value (allowed values: auto, 2.6, 2.7, 2.8, 2.9) + " >&2;} + { (exit 1); exit 1; }; } + fi + + WX_VERSION="$wx_requested_major_version"".""$wx_requested_minor_version" + echo "$as_me:$LINENO: result: $WX_VERSION" >&5 +echo "${ECHO_T}$WX_VERSION" >&6 + fi + + + if test "$WX_DEBUG_CONFIGURE" = "1"; then + echo "[dbg] DEBUG: $DEBUG, WX_DEBUG: $WX_DEBUG" + echo "[dbg] UNICODE: $UNICODE, WX_UNICODE: $WX_UNICODE" + echo "[dbg] SHARED: $SHARED, WX_SHARED: $WX_SHARED" + echo "[dbg] TOOLKIT: $TOOLKIT, WX_TOOLKIT: $WX_TOOLKIT" + echo "[dbg] VERSION: $VERSION, WX_VERSION: $WX_VERSION" + fi + +# Force using a static wxWidgets library if the executable is to be linked statically. +if test "$USE_DEBUG_STATIC" = "yes"; then + WX_SHARED=0 +fi + +# Force using a unicode build of the library +WX_UNICODE=1 +DEBUG=$WX_DEBUG + + if test "$WX_SHARED" = "1" ; then + WXCONFIG_FLAGS="--static=no " + elif test "$WX_SHARED" = "0" ; then + WXCONFIG_FLAGS="--static=yes " + fi + + if test "$WX_DEBUG" = "1" ; then + WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--debug=yes " + elif test "$WX_DEBUG" = "0" ; then + WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--debug=no " + fi + + if test "$WX_UNICODE" = "1" ; then + WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--unicode=yes " + elif test "$WX_UNICODE" = "0" ; then + WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--unicode=no " + fi + + if test "$TOOLKIT" != "auto" ; then + WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--toolkit=$TOOLKIT " + fi + + if test "$WX_VERSION" != "auto" ; then + WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--version=$WX_VERSION " + fi + + WXCONFIG_FLAGS=${WXCONFIG_FLAGS% } + + if test "$WX_DEBUG_CONFIGURE" = "1"; then + echo "[dbg] WXCONFIG_FLAGS: $WXCONFIG_FLAGS" + fi + + + if test x${WX_CONFIG_NAME+set} != xset ; then + WX_CONFIG_NAME=wx-config + fi + + if test "x$wx_config_name" != x ; then + WX_CONFIG_NAME="$wx_config_name" + fi + + if test x$wx_config_exec_prefix != x ; then + wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix" + WX_LOOKUP_PATH="$wx_config_exec_prefix/bin" + fi + if test x$wx_config_prefix != x ; then + wx_config_args="$wx_config_args --prefix=$wx_config_prefix" + WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin" + fi + if test "$cross_compiling" = "yes"; then + wx_config_args="$wx_config_args --host=$host_alias" + fi + + if test -x "$WX_CONFIG_NAME" ; then + echo "$as_me:$LINENO: checking for wx-config" >&5 +echo $ECHO_N "checking for wx-config... $ECHO_C" >&6 + WX_CONFIG_PATH="$WX_CONFIG_NAME" + echo "$as_me:$LINENO: result: $WX_CONFIG_PATH" >&5 +echo "${ECHO_T}$WX_CONFIG_PATH" >&6 + else + # Extract the first word of "$WX_CONFIG_NAME", so it can be a program name with args. +set dummy $WX_CONFIG_NAME; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_WX_CONFIG_PATH+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $WX_CONFIG_PATH in + [\\/]* | ?:[\\/]*) + ac_cv_path_WX_CONFIG_PATH="$WX_CONFIG_PATH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_dummy=""$WX_LOOKUP_PATH:$PATH"" +for as_dir in $as_dummy +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_WX_CONFIG_PATH="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_WX_CONFIG_PATH" && ac_cv_path_WX_CONFIG_PATH="no" + ;; +esac +fi +WX_CONFIG_PATH=$ac_cv_path_WX_CONFIG_PATH + +if test -n "$WX_CONFIG_PATH"; then + echo "$as_me:$LINENO: result: $WX_CONFIG_PATH" >&5 +echo "${ECHO_T}$WX_CONFIG_PATH" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + fi + + if test "$WX_CONFIG_PATH" != "no" ; then + WX_VERSION_FULL="" + + min_wx_version=2.8.0 + if test -z "$WXCONFIG_FLAGS" ; then + echo "$as_me:$LINENO: checking for wxWidgets version >= $min_wx_version" >&5 +echo $ECHO_N "checking for wxWidgets version >= $min_wx_version... $ECHO_C" >&6 + else + echo "$as_me:$LINENO: checking for wxWidgets version >= $min_wx_version ($WXCONFIG_FLAGS)" >&5 +echo $ECHO_N "checking for wxWidgets version >= $min_wx_version ($WXCONFIG_FLAGS)... $ECHO_C" >&6 + fi + + WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args $WXCONFIG_FLAGS " + + WX_VERSION_FULL=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null` + wx_config_major_version=`echo $WX_VERSION_FULL | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + wx_config_minor_version=`echo $WX_VERSION_FULL | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + wx_config_micro_version=`echo $WX_VERSION_FULL | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + + wx_requested_major_version=`echo $min_wx_version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + wx_requested_minor_version=`echo $min_wx_version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + wx_requested_micro_version=`echo $min_wx_version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + + + wx_ver_ok="" + if test "x$WX_VERSION_FULL" != x ; then + if test $wx_config_major_version -gt $wx_requested_major_version; then + wx_ver_ok=yes + else + if test $wx_config_major_version -eq $wx_requested_major_version; then + if test $wx_config_minor_version -gt $wx_requested_minor_version; then + wx_ver_ok=yes + else + if test $wx_config_minor_version -eq $wx_requested_minor_version; then + if test $wx_config_micro_version -ge $wx_requested_micro_version; then + wx_ver_ok=yes + fi + fi + fi + fi + fi + fi + + + if test -n "$wx_ver_ok"; then + + echo "$as_me:$LINENO: result: yes (version $WX_VERSION_FULL)" >&5 +echo "${ECHO_T}yes (version $WX_VERSION_FULL)" >&6 + WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs` + + echo "$as_me:$LINENO: checking for wxWidgets static library" >&5 +echo $ECHO_N "checking for wxWidgets static library... $ECHO_C" >&6 + WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs 2>/dev/null` + if test "x$WX_LIBS_STATIC" = "x"; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + else + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + fi + + wx_has_cppflags="" + if test $wx_config_major_version -gt 2; then + wx_has_cppflags=yes + else + if test $wx_config_major_version -eq 2; then + if test $wx_config_minor_version -gt 2; then + wx_has_cppflags=yes + else + if test $wx_config_minor_version -eq 2; then + if test $wx_config_micro_version -ge 6; then + wx_has_cppflags=yes + fi + fi + fi + fi + fi + + wx_has_rescomp="" + if test $wx_config_major_version -gt 2; then + wx_has_rescomp=yes + else + if test $wx_config_major_version -eq 2; then + if test $wx_config_minor_version -ge 7; then + wx_has_rescomp=yes + fi + fi + fi + if test "x$wx_has_rescomp" = x ; then + WX_RESCOMP= + else + WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp` + fi + + if test "x$wx_has_cppflags" = x ; then + WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` + WX_CPPFLAGS=$WX_CFLAGS + WX_CXXFLAGS=$WX_CFLAGS + + WX_CFLAGS_ONLY=$WX_CFLAGS + WX_CXXFLAGS_ONLY=$WX_CFLAGS + else + WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags` + WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags` + WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` + + WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"` + WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"` + fi + + wxWin=1 + + else + + if test "x$WX_VERSION_FULL" = x; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + else + echo "$as_me:$LINENO: result: no (version $WX_VERSION_FULL is not new enough)" >&5 +echo "${ECHO_T}no (version $WX_VERSION_FULL is not new enough)" >&6 + fi + + WX_CFLAGS="" + WX_CPPFLAGS="" + WX_CXXFLAGS="" + WX_LIBS="" + WX_LIBS_STATIC="" + WX_RESCOMP="" + + if test ! -z "$WXCONFIG_FLAGS"; then + + wx_error_message=" + The configuration you asked for $PACKAGE_NAME requires a wxWidgets + build with the following settings: + $WXCONFIG_FLAGS + but such build is not available. + + To see the wxWidgets builds available on this system, please use + 'wx-config --list' command. To use the default build, returned by + 'wx-config --selected-config', use the options with their 'auto' + default values." + + fi + + wx_error_message=" + The requested wxWidgets build couldn't be found. + $wx_error_message + + If you still get this error, then check that 'wx-config' is + in path, the directory where wxWidgets libraries are installed + (returned by 'wx-config --libs' command) is in LD_LIBRARY_PATH + or equivalent variable and wxWidgets version is 2.8.0 or above." + + { { echo "$as_me:$LINENO: error: $wx_error_message" >&5 +echo "$as_me: error: $wx_error_message" >&2;} + { (exit 1); exit 1; }; } + + fi + else + + WX_CFLAGS="" + WX_CPPFLAGS="" + WX_CXXFLAGS="" + WX_LIBS="" + WX_LIBS_STATIC="" + WX_RESCOMP="" + + : + + fi + + + + + + + + + + + + WX_VERSION_MAJOR="$wx_config_major_version" + WX_VERSION_MINOR="$wx_config_minor_version" + + + +if test "$wxWin" != 1; then + { { echo "$as_me:$LINENO: error: + wxWidgets must be installed on your system but wx-config + script couldn't be found. Please check that wx-config is + in path or specified by --with-wx-config=path flag, the + directory where wxWidgets libraries are installed (returned + by 'wx-config --libs' command) is in LD_LIBRARY_PATH or + equivalent variable and wxWidgets version is 2.8.0 or above. + " >&5 +echo "$as_me: error: + wxWidgets must be installed on your system but wx-config + script couldn't be found. Please check that wx-config is + in path or specified by --with-wx-config=path flag, the + directory where wxWidgets libraries are installed (returned + by 'wx-config --libs' command) is in LD_LIBRARY_PATH or + equivalent variable and wxWidgets version is 2.8.0 or above. + " >&2;} + { (exit 1); exit 1; }; } +fi + + WX_VERSION="$WX_VERSION_MAJOR""$WX_VERSION_MINOR" + if test $WX_VERSION -lt 26 ; then + + { { echo "$as_me:$LINENO: error: + Cannot detect the wxWidgets configuration for the selected wxWidgets build + since its version is $WX_VERSION_FULL < 2.6.0; please install a newer + version of wxWidgets. + " >&5 +echo "$as_me: error: + Cannot detect the wxWidgets configuration for the selected wxWidgets build + since its version is $WX_VERSION_FULL < 2.6.0; please install a newer + version of wxWidgets. + " >&2;} + { (exit 1); exit 1; }; } + fi + + WX_SELECTEDCONFIG=$($WX_CONFIG_WITH_ARGS --selected_config) + + if test "$WX_DEBUG_CONFIGURE" = "1"; then + echo "[dbg] Using wx-config --selected-config" + echo "[dbg] WX_SELECTEDCONFIG: $WX_SELECTEDCONFIG" + fi + + + if test $WX_SHARED = "1"; then + STATIC=0 + elif test $WX_SHARED = "0"; then + STATIC=1 + elif test $WX_SHARED = "auto"; then + STATIC="auto" + fi + + + if test "$UNICODE" = "auto" ; then + + echo "$as_me:$LINENO: checking if wxWidgets was built with UNICODE enabled" >&5 +echo $ECHO_N "checking if wxWidgets was built with UNICODE enabled... $ECHO_C" >&6 + + WX_UNICODE=$(expr "$WX_SELECTEDCONFIG" : ".*unicode.*") + + if test "$WX_UNICODE" != "0"; then + WX_UNICODE=1 + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + : + else + WX_UNICODE=0 + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + : + fi + else + + WX_UNICODE=$UNICODE + fi + + + if test "$DEBUG" = "auto" ; then + + echo "$as_me:$LINENO: checking if wxWidgets was built in DEBUG mode" >&5 +echo $ECHO_N "checking if wxWidgets was built in DEBUG mode... $ECHO_C" >&6 + + WX_DEBUG=$(expr "$WX_SELECTEDCONFIG" : ".*debug.*") + + if test "$WX_DEBUG" != "0"; then + WX_DEBUG=1 + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + : + else + WX_DEBUG=0 + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + : + fi + else + + WX_DEBUG=$DEBUG + fi + + + if test "$STATIC" = "auto" ; then + + echo "$as_me:$LINENO: checking if wxWidgets was built in STATIC mode" >&5 +echo $ECHO_N "checking if wxWidgets was built in STATIC mode... $ECHO_C" >&6 + + WX_STATIC=$(expr "$WX_SELECTEDCONFIG" : ".*static.*") + + if test "$WX_STATIC" != "0"; then + WX_STATIC=1 + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + : + else + WX_STATIC=0 + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + : + fi + else + + WX_STATIC=$STATIC + fi + + + if test "$WX_STATIC" != "0"; then + WX_SHARED=0 + else + WX_SHARED=1 + fi + + + + + + if test "$TOOLKIT" = "auto" ; then + + echo "$as_me:$LINENO: checking which wxWidgets toolkit was selected" >&5 +echo $ECHO_N "checking which wxWidgets toolkit was selected... $ECHO_C" >&6 + + WX_GTKPORT1=$(expr "$WX_SELECTEDCONFIG" : ".*gtk1.*") + WX_GTKPORT2=$(expr "$WX_SELECTEDCONFIG" : ".*gtk2.*") + WX_MSWPORT=$(expr "$WX_SELECTEDCONFIG" : ".*msw.*") + WX_MOTIFPORT=$(expr "$WX_SELECTEDCONFIG" : ".*motif.*") + WX_MACPORT=$(expr "$WX_SELECTEDCONFIG" : ".*mac.*") + WX_X11PORT=$(expr "$WX_SELECTEDCONFIG" : ".*x11.*") + WX_MGLPORT=$(expr "$WX_SELECTEDCONFIG" : ".*mgl.*") + WX_DFBPORT=$(expr "$WX_SELECTEDCONFIG" : ".*dfb.*") + WX_BASEPORT=$(expr "$WX_SELECTEDCONFIG" : ".*base.*") + + WX_PORT="unknown" + if test "$WX_GTKPORT1" != "0"; then WX_PORT="gtk1"; fi + if test "$WX_GTKPORT2" != "0"; then WX_PORT="gtk2"; fi + if test "$WX_MSWPORT" != "0"; then WX_PORT="msw"; fi + if test "$WX_MOTIFPORT" != "0"; then WX_PORT="motif"; fi + if test "$WX_MACPORT" != "0"; then WX_PORT="mac"; fi + if test "$WX_X11PORT" != "0"; then WX_PORT="x11"; fi + if test "$WX_MGLPORT" != "0"; then WX_PORT="mgl"; fi + if test "$WX_DFBPORT" != "0"; then WX_PORT="dfb"; fi + if test "$WX_BASEPORT" != "0"; then WX_PORT="base"; fi + + + if test "$WX_PORT" = "unknown" ; then + { { echo "$as_me:$LINENO: error: + Cannot detect the currently installed wxWidgets port ! + Please check your 'wx-config --cxxflags'... + " >&5 +echo "$as_me: error: + Cannot detect the currently installed wxWidgets port ! + Please check your 'wx-config --cxxflags'... + " >&2;} + { (exit 1); exit 1; }; } + fi + + echo "$as_me:$LINENO: result: $WX_PORT" >&5 +echo "${ECHO_T}$WX_PORT" >&6 + else + + if test -z "$TOOLKIT" ; then + WX_PORT=$TOOLKIT + else + WX_PORT=$PORT + fi + fi + + + + if test "$WX_DEBUG_CONFIGURE" = "1"; then + echo "[dbg] Values of all WX_* options after final detection:" + echo "[dbg] WX_DEBUG: $WX_DEBUG" + echo "[dbg] WX_UNICODE: $WX_UNICODE" + echo "[dbg] WX_SHARED: $WX_SHARED" + echo "[dbg] WX_VERSION: $WX_VERSION" + echo "[dbg] WX_PORT: $WX_PORT" + fi + + if test "$WX_SHARED" = "0" -a "$SHARED" = "1"; then + { { echo "$as_me:$LINENO: error: + Cannot build shared library against a static build of wxWidgets ! + This error happens because the wxWidgets build which was selected + has been detected as static while you asked to build $PACKAGE_NAME + as shared library and this is not possible. + Use the '--disable-shared' option to build $PACKAGE_NAME + as static library or '--with-wxshared' to use wxWidgets as shared library. + " >&5 +echo "$as_me: error: + Cannot build shared library against a static build of wxWidgets ! + This error happens because the wxWidgets build which was selected + has been detected as static while you asked to build $PACKAGE_NAME + as shared library and this is not possible. + Use the '--disable-shared' option to build $PACKAGE_NAME + as static library or '--with-wxshared' to use wxWidgets as shared library. + " >&2;} + { (exit 1); exit 1; }; } + fi + + if test "$DEBUG" = "auto"; then + DEBUG=$WX_DEBUG + + if test "$DEBUG" = "1"; then + BUILD="debug" + elif test "$DEBUG" = ""; then + BUILD="release" + fi + fi + if test "$UNICODE" = "auto"; then + UNICODE=$WX_UNICODE + fi + if test "$SHARED" = "auto"; then + SHARED=$WX_SHARED + fi + if test "$TOOLKIT" = "auto"; then + TOOLKIT=$WX_PORT + fi + + + + + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + __CPPFLAGS=${CPPFLAGS} + CPPFLAGS=${WX_CPPFLAGS} + + echo "$as_me:$LINENO: checking that wxWidgets has support for large files" >&5 +echo $ECHO_N "checking that wxWidgets has support for large files... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + + #include + + int main() { + #if !HAVE_LARGEFILE_SUPPORT && !defined(__WXMSW__) + #error No LargeFile support!; + #endif + exit(0); + } + +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + NO_LF="true" +fi +rm -f conftest.err conftest.$ac_ext + + if test "x${NO_LF}" != "x"; + then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + { { echo "$as_me:$LINENO: error: + Support for large files in wxWidgets is required by aMule. + To continue you must recompile wxWidgets with support for + large files enabled. + " >&5 +echo "$as_me: error: + Support for large files in wxWidgets is required by aMule. + To continue you must recompile wxWidgets with support for + large files enabled. + " >&2;} + { (exit 1); exit 1; }; } + else + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + fi + + CPPFLAGS=${__CPPFLAGS} + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +if test x$SYS = xwin32; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. +set dummy ${ac_tool_prefix}windres; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_RC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$RC"; then + ac_cv_prog_RC="$RC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RC="${ac_tool_prefix}windres" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +RC=$ac_cv_prog_RC +if test -n "$RC"; then + echo "$as_me:$LINENO: result: $RC" >&5 +echo "${ECHO_T}$RC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_RC"; then + ac_ct_RC=$RC + # Extract the first word of "windres", so it can be a program name with args. +set dummy windres; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_RC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_RC"; then + ac_cv_prog_ac_ct_RC="$ac_ct_RC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RC="windres" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_RC" && ac_cv_prog_ac_ct_RC=":" +fi +fi +ac_ct_RC=$ac_cv_prog_ac_ct_RC +if test -n "$ac_ct_RC"; then + echo "$as_me:$LINENO: result: $ac_ct_RC" >&5 +echo "${ECHO_T}$ac_ct_RC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + RC=$ac_ct_RC +else + RC="$ac_cv_prog_RC" +fi + + + RCFLAGS=`$WX_CONFIG_WITH_ARGS --cflags | $AWK '{ for (i = 1; i <= NF; i++) if (index($i, "-I") != 1 && index($i, "-D") != 1) $i = ""; print }'` +else + RCFLAGS="" +fi + + +# Check for Crypto++ + + +# Check whether --with-crypto-prefix or --without-crypto-prefix was given. +if test "${with_crypto_prefix+set}" = set; then + withval="$with_crypto_prefix" + CRYPTO_PP_PREFIX="$withval" +else + CRYPTO_PP_PREFIX="" +fi; + + + + +min_crypto_version=5.1 +echo "$as_me:$LINENO: checking for crypto++ version >= $min_crypto_version" >&5 +echo $ECHO_N "checking for crypto++ version >= $min_crypto_version... $ECHO_C" >&6 + +crypto_pp_file_with_version="cryptlib.h" + +CRYPTO_PP_STYLE="unknown" +CRYPTO_PP_LIB_NAME="unknown" +crypto_pp_include_i="unknown" +CRYPTO_PP_INCLUDE_PREFIX="unknown" +CRYPTO_PP_DEFINE="unknown" +CRYPTO_PP_LIB="unknown" + +# +# Set CRYPTO_PP_PREFIX if the user has not set it in the configure command line +# We don't use AC_CHECK_FILE to avoid caching. +# +if test x$CRYPTO_PP_PREFIX = x ; then + CRYPTO_PP_PREFIX="/usr" +fi + +# +# Find the Cryptopp header +# +if test -f $CRYPTO_PP_PREFIX/$crypto_pp_file_with_version; then + CRYPTO_PP_STYLE="sources" + CRYPTO_PP_LIB_NAME="cryptopp" + crypto_pp_include_i="$CRYPTO_PP_PREFIX" + CRYPTO_PP_INCLUDE_PREFIX="." + CRYPTO_PP_DEFINE="__CRYPTO_SOURCE__" + CRYPTO_PP_LIB="$CRYPTO_PP_PREFIX" + { { echo "$as_me:$LINENO: error: + Specifying the cryptopp source files directory for \"--with-crypto-prefix=\" + will not work because cryptopp uses headers with the same name of system + headers (e.g. zlib.h) and you must be able to distinguish the system + headers from cryptopp headers in an #include directive. + Please run \"PREFIX=/home/YourUserName/usr/cryptopp make install\" on + the cryptopp directory to properly install cryptopp in your system." >&5 +echo "$as_me: error: + Specifying the cryptopp source files directory for \"--with-crypto-prefix=\" + will not work because cryptopp uses headers with the same name of system + headers (e.g. zlib.h) and you must be able to distinguish the system + headers from cryptopp headers in an #include directive. + Please run \"PREFIX=/home/YourUserName/usr/cryptopp make install\" on + the cryptopp directory to properly install cryptopp in your system." >&2;} + { (exit 1); exit 1; }; } +elif test -f $CRYPTO_PP_PREFIX/include/cryptopp/$crypto_pp_file_with_version; then + CRYPTO_PP_STYLE="installed" + CRYPTO_PP_LIB_NAME="cryptopp" + crypto_pp_include_i="$CRYPTO_PP_PREFIX/include" + CRYPTO_PP_INCLUDE_PREFIX="$CRYPTO_PP_LIB_NAME" + CRYPTO_PP_DEFINE="__CRYPTO_INSTALLED__" + CRYPTO_PP_LIB="$CRYPTO_PP_PREFIX/lib" +elif test -f $CRYPTO_PP_PREFIX/include/crypto++/$crypto_pp_file_with_version; then + # Debian uses libcrypto++5.1 - it's not my fault, please soda patch the package + CRYPTO_PP_STYLE="gentoo_debian" + CRYPTO_PP_LIB_NAME="crypto++" + crypto_pp_include_i="$CRYPTO_PP_PREFIX/include" + CRYPTO_PP_INCLUDE_PREFIX="$CRYPTO_PP_LIB_NAME" + CRYPTO_PP_DEFINE="__CRYPTO_SOURCE__" + CRYPTO_PP_LIB="$CRYPTO_PP_PREFIX/lib" +fi + +# +# Check for success in finding cryptopp +# +if test $CRYPTO_PP_STYLE = "unknown"; then + # + # If the execution reaches here, we have failed. + # + { { echo "$as_me:$LINENO: error: + Could not find cryptopp header file \"$crypto_pp_file_with_version\". + Please check if the path \"$CRYPTO_PP_PREFIX\" is valid." >&5 +echo "$as_me: error: + Could not find cryptopp header file \"$crypto_pp_file_with_version\". + Please check if the path \"$CRYPTO_PP_PREFIX\" is valid." >&2;} + { (exit 1); exit 1; }; } +fi + +# +# Find out the cryptopp version and check against the minimum required +# +crypto_pp_include_dir="$crypto_pp_include_i/$CRYPTO_PP_INCLUDE_PREFIX" +crypto_pp_header_path="$crypto_pp_include_dir/$crypto_pp_file_with_version" + +CRYPTO_PP_VERSION_STRING=$(grep "Reference Manual" $crypto_pp_header_path | \ + sed -e 's/[^0-9]*\([0-9.]*\).*/\1/') + +CRYPTO_PP_VERSION_NUMBER=$(echo $CRYPTO_PP_VERSION_STRING | \ + $AWK 'BEGIN { FS = "."; } { printf "%d", ($1 * 1000 + $2) * 1000 + $3;}') + +minvers=$(echo $min_crypto_version | \ + $AWK 'BEGIN { FS = "."; } { printf "%d", ($1 * 1000 + $2) * 1000 + $3;}') + +if test -n "$CRYPTO_PP_VERSION_NUMBER" && test "$CRYPTO_PP_VERSION_NUMBER" -ge $minvers; then + result="yes (version $CRYPTO_PP_VERSION_STRING, $CRYPTO_PP_STYLE)" +else + result="no" +fi +echo "$as_me:$LINENO: result: $result" >&5 +echo "${ECHO_T}$result" >&6 + +# +# FLAGS +# +CRYPTO_PP_CXXFLAGS="-isystem $crypto_pp_include_i -D$CRYPTO_PP_DEFINE" +CRYPTO_PP_LDFLAGS="-L$CRYPTO_PP_LIB" + + +cat >>confdefs.h <<_ACEOF +#define CRYPTOPP_INCLUDE_PREFIX $CRYPTO_PP_INCLUDE_PREFIX +_ACEOF + + +# +# Exported symbols +# + + + + + + + + + + +{ echo "$as_me:$LINENO: Crypto++ version number is $CRYPTO_PP_VERSION_NUMBER" >&5 +echo "$as_me: Crypto++ version number is $CRYPTO_PP_VERSION_NUMBER" >&6;} + + +CXXFLAGS="$CXXFLAGS $CRYPTO_PP_CXXFLAGS" +LDFLAGS="$LDFLAGS $CRYPTO_PP_LDFLAGS" +CRYPTOLIBS="-l$CRYPTO_PP_LIB_NAME" + +case "$CRYPTO_PP_STYLE" in + gentoo_debian | installed | sources) + ;; + *) { { echo "$as_me:$LINENO: error: + WARNING: crypto++ >= $min_crypto_version is not found. + Please check that cryptopp-headers are in your default include path, + check out LD_LIBRARY_PATH or equivalent variable. + Or this might also be that your cryptopp is installed on other path. + Please try again with --with-crypto-prefix=/my_crypto_prefix + (replace /my_crypto_prefix with a valid path to your crypto directory). + To download the latest version check http://www.cryptopp.com for sources. + " >&5 +echo "$as_me: error: + WARNING: crypto++ >= $min_crypto_version is not found. + Please check that cryptopp-headers are in your default include path, + check out LD_LIBRARY_PATH or equivalent variable. + Or this might also be that your cryptopp is installed on other path. + Please try again with --with-crypto-prefix=/my_crypto_prefix + (replace /my_crypto_prefix with a valid path to your crypto directory). + To download the latest version check http://www.cryptopp.com for sources. + " >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +# Check for CryptoPP >= 5.5 +if test $CRYPTO_PP_VERSION_NUMBER -ge "5005000"; then + CXXFLAGS="$CXXFLAGS -D__WEAK_CRYPTO__" +fi + + + + +# Check for bfd.h (to have proper backtraces without using wxExecute) + +echo "$as_me:$LINENO: checking for bfd" >&5 +echo $ECHO_N "checking for bfd... $ECHO_C" >&6 +__LIBS=$LIBS +LIBS="-lbfd -liberty $LIBS" +cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + #include + #include + +int +main () +{ + + char *dummy = bfd_errmsg(bfd_get_error()); + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + BFD_FLAGS="-DHAVE_BFD" + BFD_LIB="-lbfd -liberty" + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: WARNING: + bfd.h not found or unusable, please install binutils development + package if you are a developer or want to help testing aMule" >&5 +echo "$as_me: WARNING: + bfd.h not found or unusable, please install binutils development + package if you are a developer or want to help testing aMule" >&2;} + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=${__LIBS} + + + + +# Ok, we have all needed libs, now checking for other stuff + + +echo "$as_me:$LINENO: checking for autopoint" >&5 +echo $ECHO_N "checking for autopoint... $ECHO_C" >&6 + +autopoint_version=`autopoint --version | head -n 1 | sed -e 's/.*[^0-9.]\([0-9]\{1,\}\(\.[0-9]\{1,\}\)\{1,2\}\)[^0-9.]*/\1/'` +if test x$autopoint_version != x; then + result="yes" +else + result="no" +fi + +HAVE_GETTEXT=$result + +echo "$as_me:$LINENO: result: $result ($autopoint_version)" >&5 +echo "${ECHO_T}$result ($autopoint_version)" >&6 +if test x$result = xno; then + { echo "$as_me:$LINENO: You need to install GNU gettext/gettext-tools to compile aMule with i18n support" >&5 +echo "$as_me: You need to install GNU gettext/gettext-tools to compile aMule with i18n support" >&6;} +fi + + + +if test "$LEX" = "flex"; then + + +echo "$as_me:$LINENO: checking for extended flex capabilities" >&5 +echo $ECHO_N "checking for extended flex capabilities... $ECHO_C" >&6 + +extended_flex=`flex --help | grep header-file` +if test x"$extended_flex" != x""; then + result="yes" +else + result="no" +fi + +HAVE_FLEX_EXTENDED=$result + +echo "$as_me:$LINENO: result: $result" >&5 +echo "${ECHO_T}$result" >&6 + +if test x$result = xno; then + { echo "$as_me:$LINENO: Your flex version doesn't support --header-file flag. This is not critical, but an upgrade is recommended " >&5 +echo "$as_me: Your flex version doesn't support --header-file flag. This is not critical, but an upgrade is recommended " >&6;} +fi + + + + +else + HAVE_FLEX_EXTENDED=no +fi + +# Flush standard test results for speeding cache +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +# Checks for header files. +echo "$as_me:$LINENO: checking for X" >&5 +echo $ECHO_N "checking for X... $ECHO_C" >&6 + + +# Check whether --with-x or --without-x was given. +if test "${with_x+set}" = set; then + withval="$with_x" + +fi; +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then + # Both variables are already set. + have_x=yes + else + if test "${ac_cv_have_x+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=no ac_x_libraries=no +rm -fr conftest.dir +if mkdir conftest.dir; then + cd conftest.dir + # Make sure to not put "make" in the Imakefile rules, since we grep it out. + cat >Imakefile <<'_ACEOF' +acfindx: + @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' +_ACEOF + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. + eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl; do + if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && + test -f $ac_im_libdir/libX11.$ac_extension; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case $ac_im_incroot in + /usr/include) ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; + esac + case $ac_im_usrlibdir in + /usr/lib | /lib) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; + esac + fi + cd .. + rm -fr conftest.dir +fi + +# Standard set of common directories for X headers. +# Check X11 before X11Rn because it is often a symlink to the current release. +ac_x_header_dirs=' +/usr/X11/include +/usr/X11R6/include +/usr/X11R5/include +/usr/X11R4/include + +/usr/include/X11 +/usr/include/X11R6 +/usr/include/X11R5 +/usr/include/X11R4 + +/usr/local/X11/include +/usr/local/X11R6/include +/usr/local/X11R5/include +/usr/local/X11R4/include + +/usr/local/include/X11 +/usr/local/include/X11R6 +/usr/local/include/X11R5 +/usr/local/include/X11R4 + +/usr/X386/include +/usr/x386/include +/usr/XFree86/include/X11 + +/usr/include +/usr/local/include +/usr/unsupported/include +/usr/athena/include +/usr/local/x11r5/include +/usr/lpp/Xamples/include + +/usr/openwin/include +/usr/openwin/share/include' + +if test "$ac_x_includes" = no; then + # Guess where to find include files, by looking for Intrinsic.h. + # First, try using that file with no special directory specified. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # We can compile using X headers with no special include directory. +ac_x_includes= +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + for ac_dir in $ac_x_header_dirs; do + if test -r "$ac_dir/X11/Intrinsic.h"; then + ac_x_includes=$ac_dir + break + fi +done +fi +rm -f conftest.err conftest.$ac_ext +fi # $ac_x_includes = no + +if test "$ac_x_libraries" = no; then + # Check for the libraries. + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS=$LIBS + LIBS="-lXt $LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +XtMalloc (0) + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + LIBS=$ac_save_LIBS +# We can link X programs with no special library path. +ac_x_libraries= +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +LIBS=$ac_save_LIBS +for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` +do + # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl; do + if test -r $ac_dir/libXt.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi # $ac_x_libraries = no + +if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then + # Didn't find X anywhere. Cache the known absence of X. + ac_cv_have_x="have_x=no" +else + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" +fi +fi + + fi + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + echo "$as_me:$LINENO: result: $have_x" >&5 +echo "${ECHO_T}$have_x" >&6 + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$x_includes ac_x_libraries=$x_libraries" + echo "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5 +echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6 +fi + +# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +# for constant arguments. Useless! +echo "$as_me:$LINENO: checking for working alloca.h" >&5 +echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6 +if test "${ac_cv_working_alloca_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +char *p = (char *) alloca (2 * sizeof (int)); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_working_alloca_h=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_working_alloca_h=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5 +echo "${ECHO_T}$ac_cv_working_alloca_h" >&6 +if test $ac_cv_working_alloca_h = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ALLOCA_H 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for alloca" >&5 +echo $ECHO_N "checking for alloca... $ECHO_C" >&6 +if test "${ac_cv_func_alloca_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# ifdef _MSC_VER +# include +# define alloca _alloca +# else +# if HAVE_ALLOCA_H +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +int +main () +{ +char *p = (char *) alloca (1); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_alloca_works=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_alloca_works=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5 +echo "${ECHO_T}$ac_cv_func_alloca_works" >&6 + +if test $ac_cv_func_alloca_works = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ALLOCA 1 +_ACEOF + +else + # The SVR3 libPW and SVR4 libucb both contain incompatible functions +# that cause trouble. Some versions do not even contain alloca or +# contain a buggy version. If you still want to use their alloca, +# use ar to extract alloca.o from them instead of compiling alloca.c. + +ALLOCA=alloca.$ac_objext + +cat >>confdefs.h <<\_ACEOF +#define C_ALLOCA 1 +_ACEOF + + +echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5 +echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6 +if test "${ac_cv_os_cray+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#if defined(CRAY) && ! defined(CRAY2) +webecray +#else +wenotbecray +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "webecray" >/dev/null 2>&1; then + ac_cv_os_cray=yes +else + ac_cv_os_cray=no +fi +rm -f conftest* + +fi +echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5 +echo "${ECHO_T}$ac_cv_os_cray" >&6 +if test $ac_cv_os_cray = yes; then + for ac_func in _getb67 GETB67 getb67; do + as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + +cat >>confdefs.h <<_ACEOF +#define CRAY_STACKSEG_END $ac_func +_ACEOF + + break +fi + + done +fi + +echo "$as_me:$LINENO: checking stack direction for C alloca" >&5 +echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6 +if test "${ac_cv_c_stack_direction+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_c_stack_direction=0 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +int +find_stack_direction () +{ + static char *addr = 0; + auto char dummy; + if (addr == 0) + { + addr = &dummy; + return find_stack_direction (); + } + else + return (&dummy > addr) ? 1 : -1; +} + +int +main () +{ + exit (find_stack_direction () < 0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_stack_direction=1 +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_c_stack_direction=-1 +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5 +echo "${ECHO_T}$ac_cv_c_stack_direction" >&6 + +cat >>confdefs.h <<_ACEOF +#define STACK_DIRECTION $ac_cv_c_stack_direction +_ACEOF + + +fi + + + + + + +ac_header_dirent=no +for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do + as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5 +echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include <$ac_hdr> + +int +main () +{ +if ((DIR *) 0) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 +_ACEOF + +ac_header_dirent=$ac_hdr; break +fi + +done +# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. +if test $ac_header_dirent = dirent.h; then + echo "$as_me:$LINENO: checking for library containing opendir" >&5 +echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 +if test "${ac_cv_search_opendir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +ac_cv_search_opendir=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir (); +int +main () +{ +opendir (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_opendir="none required" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_search_opendir" = no; then + for ac_lib in dir; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir (); +int +main () +{ +opendir (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_opendir="-l$ac_lib" +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 +echo "${ECHO_T}$ac_cv_search_opendir" >&6 +if test "$ac_cv_search_opendir" != no; then + test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" + +fi + +else + echo "$as_me:$LINENO: checking for library containing opendir" >&5 +echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 +if test "${ac_cv_search_opendir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +ac_cv_search_opendir=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir (); +int +main () +{ +opendir (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_opendir="none required" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_search_opendir" = no; then + for ac_lib in x; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir (); +int +main () +{ +opendir (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_opendir="-l$ac_lib" +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 +echo "${ECHO_T}$ac_cv_search_opendir" >&6 +if test "$ac_cv_search_opendir" != no; then + test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" + +fi + +fi + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +for ac_header in argz.h arpa/inet.h fcntl.h inttypes.h langinfo.h libintl.h limits.h locale.h malloc.h mntent.h netdb.h netinet/in.h stddef.h nl_types.h stdint.h stdio_ext.h stdlib.h string.h strings.h sys/ioctl.h sys/mount.h sys/param.h sys/resource.h sys/select.h sys/socket.h sys/statvfs.h sys/time.h sys/timeb.h sys/types.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------ ## +## Report this to admin@amule.org ## +## ------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5 +echo $ECHO_N "checking for sys/wait.h that is POSIX.1 compatible... $ECHO_C" >&6 +if test "${ac_cv_header_sys_wait_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#ifndef WEXITSTATUS +# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) +#endif +#ifndef WIFEXITED +# define WIFEXITED(stat_val) (((stat_val) & 255) == 0) +#endif + +int +main () +{ + int s; + wait (&s); + s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_sys_wait_h=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_sys_wait_h=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5 +echo "${ECHO_T}$ac_cv_header_sys_wait_h" >&6 +if test $ac_cv_header_sys_wait_h = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_SYS_WAIT_H 1 +_ACEOF + +fi + + +# Checks for typedefs, structures, and compiler characteristics. +echo "$as_me:$LINENO: checking for stdbool.h that conforms to C99" >&5 +echo $ECHO_N "checking for stdbool.h that conforms to C99... $ECHO_C" >&6 +if test "${ac_cv_header_stdbool_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifndef bool +# error bool is not defined +#endif +#ifndef false +# error false is not defined +#endif +#if false +# error false is not 0 +#endif +#ifndef true +# error true is not defined +#endif +#if true != 1 +# error true is not 1 +#endif +#ifndef __bool_true_false_are_defined +# error __bool_true_false_are_defined is not defined +#endif + + struct s { _Bool s: 1; _Bool t; } s; + + char a[true == 1 ? 1 : -1]; + char b[false == 0 ? 1 : -1]; + char c[__bool_true_false_are_defined == 1 ? 1 : -1]; + char d[(bool) -0.5 == true ? 1 : -1]; + bool e = &s; + char f[(_Bool) -0.0 == false ? 1 : -1]; + char g[true]; + char h[sizeof (_Bool)]; + char i[sizeof s.t]; + +int +main () +{ + return !a + !b + !c + !d + !e + !f + !g + !h + !i; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdbool_h=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdbool_h=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdbool_h" >&5 +echo "${ECHO_T}$ac_cv_header_stdbool_h" >&6 +echo "$as_me:$LINENO: checking for _Bool" >&5 +echo $ECHO_N "checking for _Bool... $ECHO_C" >&6 +if test "${ac_cv_type__Bool+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((_Bool *) 0) + return 0; +if (sizeof (_Bool)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type__Bool=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type__Bool=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type__Bool" >&5 +echo "${ECHO_T}$ac_cv_type__Bool" >&6 +if test $ac_cv_type__Bool = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE__BOOL 1 +_ACEOF + + +fi + +if test $ac_cv_header_stdbool_h = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_STDBOOL_H 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 +echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 +if test "${ac_cv_c_const+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset x; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *ccp; + char **p; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + ccp = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++ccp; + p = (char**) ccp; + ccp = (char const *const *) p; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + } +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_const=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_c_const=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +echo "${ECHO_T}$ac_cv_c_const" >&6 +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for inline" >&5 +echo $ECHO_N "checking for inline... $ECHO_C" >&6 +if test "${ac_cv_c_inline+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_inline=$ac_kw; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 +echo "${ECHO_T}$ac_cv_c_inline" >&6 + + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +echo "$as_me:$LINENO: checking for mode_t" >&5 +echo $ECHO_N "checking for mode_t... $ECHO_C" >&6 +if test "${ac_cv_type_mode_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((mode_t *) 0) + return 0; +if (sizeof (mode_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_mode_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_mode_t=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_mode_t" >&5 +echo "${ECHO_T}$ac_cv_type_mode_t" >&6 +if test $ac_cv_type_mode_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define mode_t int +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for off_t" >&5 +echo $ECHO_N "checking for off_t... $ECHO_C" >&6 +if test "${ac_cv_type_off_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((off_t *) 0) + return 0; +if (sizeof (off_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_off_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_off_t=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5 +echo "${ECHO_T}$ac_cv_type_off_t" >&6 +if test $ac_cv_type_off_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define off_t long +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for size_t" >&5 +echo $ECHO_N "checking for size_t... $ECHO_C" >&6 +if test "${ac_cv_type_size_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((size_t *) 0) + return 0; +if (sizeof (size_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_size_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_size_t=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 +echo "${ECHO_T}$ac_cv_type_size_t" >&6 +if test $ac_cv_type_size_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned +_ACEOF + +fi + +echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5 +echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6 +if test "${ac_cv_header_time+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_time=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_time=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5 +echo "${ECHO_T}$ac_cv_header_time" >&6 +if test $ac_cv_header_time = yes; then + +cat >>confdefs.h <<\_ACEOF +#define TIME_WITH_SYS_TIME 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking whether struct tm is in sys/time.h or time.h" >&5 +echo $ECHO_N "checking whether struct tm is in sys/time.h or time.h... $ECHO_C" >&6 +if test "${ac_cv_struct_tm+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include + +int +main () +{ +struct tm *tp; tp->tm_sec; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_struct_tm=time.h +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_struct_tm=sys/time.h +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_struct_tm" >&5 +echo "${ECHO_T}$ac_cv_struct_tm" >&6 +if test $ac_cv_struct_tm = sys/time.h; then + +cat >>confdefs.h <<\_ACEOF +#define TM_IN_SYS_TIME 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for uid_t in sys/types.h" >&5 +echo $ECHO_N "checking for uid_t in sys/types.h... $ECHO_C" >&6 +if test "${ac_cv_type_uid_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "uid_t" >/dev/null 2>&1; then + ac_cv_type_uid_t=yes +else + ac_cv_type_uid_t=no +fi +rm -f conftest* + +fi +echo "$as_me:$LINENO: result: $ac_cv_type_uid_t" >&5 +echo "${ECHO_T}$ac_cv_type_uid_t" >&6 +if test $ac_cv_type_uid_t = no; then + +cat >>confdefs.h <<\_ACEOF +#define uid_t int +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define gid_t int +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for working volatile" >&5 +echo $ECHO_N "checking for working volatile... $ECHO_C" >&6 +if test "${ac_cv_c_volatile+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + +volatile int x; +int * volatile y; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_volatile=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_c_volatile=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_c_volatile" >&5 +echo "${ECHO_T}$ac_cv_c_volatile" >&6 +if test $ac_cv_c_volatile = no; then + +cat >>confdefs.h <<\_ACEOF +#define volatile +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for ptrdiff_t" >&5 +echo $ECHO_N "checking for ptrdiff_t... $ECHO_C" >&6 +if test "${ac_cv_type_ptrdiff_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((ptrdiff_t *) 0) + return 0; +if (sizeof (ptrdiff_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_ptrdiff_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_ptrdiff_t=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_ptrdiff_t" >&5 +echo "${ECHO_T}$ac_cv_type_ptrdiff_t" >&6 +if test $ac_cv_type_ptrdiff_t = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_PTRDIFF_T 1 +_ACEOF + + +fi + + +# Checks for library functions. +echo "$as_me:$LINENO: checking whether closedir returns void" >&5 +echo $ECHO_N "checking whether closedir returns void... $ECHO_C" >&6 +if test "${ac_cv_func_closedir_void+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_closedir_void=yes +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header_dirent> +#ifndef __cplusplus +int closedir (); +#endif + +int +main () +{ +exit (closedir (opendir (".")) != 0); + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_closedir_void=no +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_closedir_void=yes +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_func_closedir_void" >&5 +echo "${ECHO_T}$ac_cv_func_closedir_void" >&6 +if test $ac_cv_func_closedir_void = yes; then + +cat >>confdefs.h <<\_ACEOF +#define CLOSEDIR_VOID 1 +_ACEOF + +fi + + + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + + + + + + # Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_MSGFMT+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case "$MSGFMT" in + /*) + ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if $ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + ac_cv_path_MSGFMT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" + ;; +esac +fi +MSGFMT="$ac_cv_path_MSGFMT" +if test "$MSGFMT" != ":"; then + echo "$as_me:$LINENO: result: $MSGFMT" >&5 +echo "${ECHO_T}$MSGFMT" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + # Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_GMSGFMT+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $GMSGFMT in + [\\/]* | ?:[\\/]*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" + ;; +esac +fi +GMSGFMT=$ac_cv_path_GMSGFMT + +if test -n "$GMSGFMT"; then + echo "$as_me:$LINENO: result: $GMSGFMT" >&5 +echo "${ECHO_T}$GMSGFMT" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + + # Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_XGETTEXT+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case "$XGETTEXT" in + /*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + ac_cv_path_XGETTEXT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" + ;; +esac +fi +XGETTEXT="$ac_cv_path_XGETTEXT" +if test "$XGETTEXT" != ":"; then + echo "$as_me:$LINENO: result: $XGETTEXT" >&5 +echo "${ECHO_T}$XGETTEXT" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + rm -f messages.po + + # Extract the first word of "msgmerge", so it can be a program name with args. +set dummy msgmerge; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_MSGMERGE+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case "$MSGMERGE" in + /*) + ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if $ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1; then + ac_cv_path_MSGMERGE="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" + ;; +esac +fi +MSGMERGE="$ac_cv_path_MSGMERGE" +if test "$MSGMERGE" != ":"; then + echo "$as_me:$LINENO: result: $MSGMERGE" >&5 +echo "${ECHO_T}$MSGMERGE" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + + if test "$GMSGFMT" != ":"; then + if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && + (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` + echo "$as_me:$LINENO: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5 +echo "${ECHO_T}found $GMSGFMT program is not GNU msgfmt; ignore it" >&6 + GMSGFMT=":" + fi + fi + + if test "$XGETTEXT" != ":"; then + if $XGETTEXT --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && + (if $XGETTEXT --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + echo "$as_me:$LINENO: result: found xgettext program is not GNU xgettext; ignore it" >&5 +echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6 + XGETTEXT=":" + fi + rm -f messages.po + fi + + ac_config_commands="$ac_config_commands default-1" + + +echo "$as_me:$LINENO: checking for library containing strerror" >&5 +echo $ECHO_N "checking for library containing strerror... $ECHO_C" >&6 +if test "${ac_cv_search_strerror+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +ac_cv_search_strerror=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char strerror (); +int +main () +{ +strerror (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_strerror="none required" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_search_strerror" = no; then + for ac_lib in cposix; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char strerror (); +int +main () +{ +strerror (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_strerror="-l$ac_lib" +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5 +echo "${ECHO_T}$ac_cv_search_strerror" >&6 +if test "$ac_cv_search_strerror" != no; then + test "$ac_cv_search_strerror" = "none required" || LIBS="$ac_cv_search_strerror $LIBS" + +fi + + + +for ac_header in stdlib.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------ ## +## Report this to admin@amule.org ## +## ------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_func in getpagesize +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +echo "$as_me:$LINENO: checking for working mmap" >&5 +echo $ECHO_N "checking for working mmap... $ECHO_C" >&6 +if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_mmap_fixed_mapped=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +/* malloc might have been renamed as rpl_malloc. */ +#undef malloc + +/* Thanks to Mike Haertel and Jim Avera for this test. + Here is a matrix of mmap possibilities: + mmap private not fixed + mmap private fixed at somewhere currently unmapped + mmap private fixed at somewhere already mapped + mmap shared not fixed + mmap shared fixed at somewhere currently unmapped + mmap shared fixed at somewhere already mapped + For private mappings, we should verify that changes cannot be read() + back from the file, nor mmap's back from the file at a different + address. (There have been systems where private was not correctly + implemented like the infamous i386 svr4.0, and systems where the + VM page cache was not coherent with the file system buffer cache + like early versions of FreeBSD and possibly contemporary NetBSD.) + For shared mappings, we should conversely verify that changes get + propagated back to all the places they're supposed to be. + + Grep wants private fixed already mapped. + The main things grep needs to know about mmap are: + * does it exist and is it safe to write into the mmap'd area + * how to use it (BSD variants) */ + +#include +#include + +#if !STDC_HEADERS && !HAVE_STDLIB_H +char *malloc (); +#endif + +/* This mess was copied from the GNU getpagesize.h. */ +#if !HAVE_GETPAGESIZE +/* Assume that all systems that can run configure have sys/param.h. */ +# if !HAVE_SYS_PARAM_H +# define HAVE_SYS_PARAM_H 1 +# endif + +# ifdef _SC_PAGESIZE +# define getpagesize() sysconf(_SC_PAGESIZE) +# else /* no _SC_PAGESIZE */ +# if HAVE_SYS_PARAM_H +# include +# ifdef EXEC_PAGESIZE +# define getpagesize() EXEC_PAGESIZE +# else /* no EXEC_PAGESIZE */ +# ifdef NBPG +# define getpagesize() NBPG * CLSIZE +# ifndef CLSIZE +# define CLSIZE 1 +# endif /* no CLSIZE */ +# else /* no NBPG */ +# ifdef NBPC +# define getpagesize() NBPC +# else /* no NBPC */ +# ifdef PAGESIZE +# define getpagesize() PAGESIZE +# endif /* PAGESIZE */ +# endif /* no NBPC */ +# endif /* no NBPG */ +# endif /* no EXEC_PAGESIZE */ +# else /* no HAVE_SYS_PARAM_H */ +# define getpagesize() 8192 /* punt totally */ +# endif /* no HAVE_SYS_PARAM_H */ +# endif /* no _SC_PAGESIZE */ + +#endif /* no HAVE_GETPAGESIZE */ + +int +main () +{ + char *data, *data2, *data3; + int i, pagesize; + int fd; + + pagesize = getpagesize (); + + /* First, make a file with some known garbage in it. */ + data = (char *) malloc (pagesize); + if (!data) + exit (1); + for (i = 0; i < pagesize; ++i) + *(data + i) = rand (); + umask (0); + fd = creat ("conftest.mmap", 0600); + if (fd < 0) + exit (1); + if (write (fd, data, pagesize) != pagesize) + exit (1); + close (fd); + + /* Next, try to mmap the file at a fixed address which already has + something else allocated at it. If we can, also make sure that + we see the same garbage. */ + fd = open ("conftest.mmap", O_RDWR); + if (fd < 0) + exit (1); + data2 = (char *) malloc (2 * pagesize); + if (!data2) + exit (1); + data2 += (pagesize - ((long) data2 & (pagesize - 1))) & (pagesize - 1); + if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_FIXED, fd, 0L)) + exit (1); + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data2 + i)) + exit (1); + + /* Finally, make sure that changes to the mapped area do not + percolate back to the file as seen by read(). (This is a bug on + some variants of i386 svr4.0.) */ + for (i = 0; i < pagesize; ++i) + *(data2 + i) = *(data2 + i) + 1; + data3 = (char *) malloc (pagesize); + if (!data3) + exit (1); + if (read (fd, data3, pagesize) != pagesize) + exit (1); + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data3 + i)) + exit (1); + close (fd); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_mmap_fixed_mapped=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_mmap_fixed_mapped=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_func_mmap_fixed_mapped" >&5 +echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6 +if test $ac_cv_func_mmap_fixed_mapped = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_MMAP 1 +_ACEOF + +fi +rm -f conftest.mmap + + + echo "$as_me:$LINENO: checking whether we are using the GNU C Library 2.1 or newer" >&5 +echo $ECHO_N "checking whether we are using the GNU C Library 2.1 or newer... $ECHO_C" >&6 +if test "${ac_cv_gnu_library_2_1+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef __GNU_LIBRARY__ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) + Lucky GNU user + #endif +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Lucky GNU user" >/dev/null 2>&1; then + ac_cv_gnu_library_2_1=yes +else + ac_cv_gnu_library_2_1=no +fi +rm -f conftest* + + + +fi +echo "$as_me:$LINENO: result: $ac_cv_gnu_library_2_1" >&5 +echo "${ECHO_T}$ac_cv_gnu_library_2_1" >&6 + + GLIBC21="$ac_cv_gnu_library_2_1" + + + + + echo "$as_me:$LINENO: checking whether integer division by zero raises SIGFPE" >&5 +echo $ECHO_N "checking whether integer division by zero raises SIGFPE... $ECHO_C" >&6 +if test "${gt_cv_int_divbyzero_sigfpe+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + if test "$cross_compiling" = yes; then + + # Guess based on the CPU. + case "$host_cpu" in + alpha* | i3456786 | m68k | s390*) + gt_cv_int_divbyzero_sigfpe="guessing yes";; + *) + gt_cv_int_divbyzero_sigfpe="guessing no";; + esac + +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include + +static void +#ifdef __cplusplus +sigfpe_handler (int sig) +#else +sigfpe_handler (sig) int sig; +#endif +{ + /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ + exit (sig != SIGFPE); +} + +int x = 1; +int y = 0; +int z; +int nan; + +int main () +{ + signal (SIGFPE, sigfpe_handler); +/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */ +#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP) + signal (SIGTRAP, sigfpe_handler); +#endif +/* Linux/SPARC yields signal SIGILL. */ +#if defined (__sparc__) && defined (__linux__) + signal (SIGILL, sigfpe_handler); +#endif + + z = x / y; + nan = y / y; + exit (1); +} + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + gt_cv_int_divbyzero_sigfpe=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +gt_cv_int_divbyzero_sigfpe=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + +fi +echo "$as_me:$LINENO: result: $gt_cv_int_divbyzero_sigfpe" >&5 +echo "${ECHO_T}$gt_cv_int_divbyzero_sigfpe" >&6 + case "$gt_cv_int_divbyzero_sigfpe" in + *yes) value=1;; + *) value=0;; + esac + +cat >>confdefs.h <<_ACEOF +#define INTDIV0_RAISES_SIGFPE $value +_ACEOF + + + + echo "$as_me:$LINENO: checking for inttypes.h" >&5 +echo $ECHO_N "checking for inttypes.h... $ECHO_C" >&6 +if test "${jm_ac_cv_header_inttypes_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ +uintmax_t i = (uintmax_t) -1; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + jm_ac_cv_header_inttypes_h=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +jm_ac_cv_header_inttypes_h=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $jm_ac_cv_header_inttypes_h" >&5 +echo "${ECHO_T}$jm_ac_cv_header_inttypes_h" >&6 + if test $jm_ac_cv_header_inttypes_h = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_INTTYPES_H_WITH_UINTMAX 1 +_ACEOF + + fi + + + echo "$as_me:$LINENO: checking for stdint.h" >&5 +echo $ECHO_N "checking for stdint.h... $ECHO_C" >&6 +if test "${jm_ac_cv_header_stdint_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ +uintmax_t i = (uintmax_t) -1; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + jm_ac_cv_header_stdint_h=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +jm_ac_cv_header_stdint_h=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $jm_ac_cv_header_stdint_h" >&5 +echo "${ECHO_T}$jm_ac_cv_header_stdint_h" >&6 + if test $jm_ac_cv_header_stdint_h = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_STDINT_H_WITH_UINTMAX 1 +_ACEOF + + fi + + + echo "$as_me:$LINENO: checking for unsigned long long" >&5 +echo $ECHO_N "checking for unsigned long long... $ECHO_C" >&6 +if test "${ac_cv_type_unsigned_long_long+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +unsigned long long ull = 1; int i = 63; +int +main () +{ +unsigned long long ullmax = (unsigned long long) -1; + return ull << i | ull >> i | ullmax / ull | ullmax % ull; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_unsigned_long_long=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_unsigned_long_long=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_long_long" >&5 +echo "${ECHO_T}$ac_cv_type_unsigned_long_long" >&6 + if test $ac_cv_type_unsigned_long_long = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_UNSIGNED_LONG_LONG 1 +_ACEOF + + fi + + + + + if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then + + test $ac_cv_type_unsigned_long_long = yes \ + && ac_type='unsigned long long' \ + || ac_type='unsigned long' + +cat >>confdefs.h <<_ACEOF +#define uintmax_t $ac_type +_ACEOF + + fi + + + echo "$as_me:$LINENO: checking for inttypes.h" >&5 +echo $ECHO_N "checking for inttypes.h... $ECHO_C" >&6 +if test "${gt_cv_header_inttypes_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + gt_cv_header_inttypes_h=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +gt_cv_header_inttypes_h=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:$LINENO: result: $gt_cv_header_inttypes_h" >&5 +echo "${ECHO_T}$gt_cv_header_inttypes_h" >&6 + if test $gt_cv_header_inttypes_h = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_INTTYPES_H 1 +_ACEOF + + fi + + + + if test $gt_cv_header_inttypes_h = yes; then + echo "$as_me:$LINENO: checking whether the inttypes.h PRIxNN macros are broken" >&5 +echo $ECHO_N "checking whether the inttypes.h PRIxNN macros are broken... $ECHO_C" >&6 +if test "${gt_cv_inttypes_pri_broken+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#ifdef PRId32 +char *p = PRId32; +#endif + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + gt_cv_inttypes_pri_broken=no +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +gt_cv_inttypes_pri_broken=yes +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:$LINENO: result: $gt_cv_inttypes_pri_broken" >&5 +echo "${ECHO_T}$gt_cv_inttypes_pri_broken" >&6 + fi + if test "$gt_cv_inttypes_pri_broken" = yes; then + +cat >>confdefs.h <<_ACEOF +#define PRI_MACROS_BROKEN 1 +_ACEOF + + fi + + + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" + + +# Check whether --with-gnu-ld or --without-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval="$with_gnu_ld" + test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi; +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo "$as_me:$LINENO: checking for ld used by GCC" >&5 +echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6 + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 +else + echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 +fi +if test "${acl_cv_path_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$acl_cv_path_LD" +if test -n "$LD"; then + echo "$as_me:$LINENO: result: $LD" >&5 +echo "${ECHO_T}$LD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 +if test "${acl_cv_prog_gnu_ld+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + acl_cv_prog_gnu_ld=yes +else + acl_cv_prog_gnu_ld=no +fi +fi +echo "$as_me:$LINENO: result: $acl_cv_prog_gnu_ld" >&5 +echo "${ECHO_T}$acl_cv_prog_gnu_ld" >&6 +with_gnu_ld=$acl_cv_prog_gnu_ld + + + + echo "$as_me:$LINENO: checking for shared library run path origin" >&5 +echo $ECHO_N "checking for shared library run path origin... $ECHO_C" >&6 +if test "${acl_cv_rpath+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + +fi +echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5 +echo "${ECHO_T}$acl_cv_rpath" >&6 + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + sys_lib_search_path_spec="$acl_cv_sys_lib_search_path_spec" + sys_lib_dlsearch_path_spec="$acl_cv_sys_lib_dlsearch_path_spec" + # Check whether --enable-rpath or --disable-rpath was given. +if test "${enable_rpath+set}" = set; then + enableval="$enable_rpath" + : +else + enable_rpath=yes +fi; + + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libiconv-prefix or --without-libiconv-prefix was given. +if test "${with_libiconv_prefix+set}" = set; then + withval="$with_libiconv_prefix" + + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi + +fi; + LIBICONV= + LTLIBICONV= + INCICONV= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='iconv ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$hardcode_direct" = yes; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" + ;; + esac + done + fi + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" + done + fi + + + + + + + + + + + + + + +for ac_header in argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ +stdlib.h string.h unistd.h sys/param.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------ ## +## Report this to admin@amule.org ## +## ------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + + + + + + + + + + + + + + + + + + + +for ac_func in feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \ +geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \ +strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + + + + + + am_save_CPPFLAGS="$CPPFLAGS" + + for element in $INCICONV; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + + echo "$as_me:$LINENO: checking for iconv" >&5 +echo $ECHO_N "checking for iconv... $ECHO_C" >&6 +if test "${am_cv_func_iconv+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + am_cv_func_iconv=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + am_cv_lib_iconv=yes + am_cv_func_iconv=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$am_save_LIBS" + fi + +fi +echo "$as_me:$LINENO: result: $am_cv_func_iconv" >&5 +echo "${ECHO_T}$am_cv_func_iconv" >&6 + if test "$am_cv_func_iconv" = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ICONV 1 +_ACEOF + + fi + if test "$am_cv_lib_iconv" = yes; then + echo "$as_me:$LINENO: checking how to link with libiconv" >&5 +echo $ECHO_N "checking how to link with libiconv... $ECHO_C" >&6 + echo "$as_me:$LINENO: result: $LIBICONV" >&5 +echo "${ECHO_T}$LIBICONV" >&6 + else + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + + + + if test "$am_cv_func_iconv" = yes; then + echo "$as_me:$LINENO: checking for iconv declaration" >&5 +echo $ECHO_N "checking for iconv declaration... $ECHO_C" >&6 + if test "${am_cv_proto_iconv+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + am_cv_proto_iconv_arg1="" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +am_cv_proto_iconv_arg1="const" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" +fi + + am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + echo "$as_me:$LINENO: result: ${ac_t:- + }$am_cv_proto_iconv" >&5 +echo "${ECHO_T}${ac_t:- + }$am_cv_proto_iconv" >&6 + +cat >>confdefs.h <<_ACEOF +#define ICONV_CONST $am_cv_proto_iconv_arg1 +_ACEOF + + fi + + + echo "$as_me:$LINENO: checking for nl_langinfo and CODESET" >&5 +echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6 +if test "${am_cv_langinfo_codeset+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +char* cs = nl_langinfo(CODESET); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + am_cv_langinfo_codeset=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +am_cv_langinfo_codeset=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +echo "$as_me:$LINENO: result: $am_cv_langinfo_codeset" >&5 +echo "${ECHO_T}$am_cv_langinfo_codeset" >&6 + if test $am_cv_langinfo_codeset = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_LANGINFO_CODESET 1 +_ACEOF + + fi + + if test $ac_cv_header_locale_h = yes; then + + echo "$as_me:$LINENO: checking for LC_MESSAGES" >&5 +echo $ECHO_N "checking for LC_MESSAGES... $ECHO_C" >&6 +if test "${am_cv_val_LC_MESSAGES+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +return LC_MESSAGES + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + am_cv_val_LC_MESSAGES=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +am_cv_val_LC_MESSAGES=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $am_cv_val_LC_MESSAGES" >&5 +echo "${ECHO_T}$am_cv_val_LC_MESSAGES" >&6 + if test $am_cv_val_LC_MESSAGES = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_LC_MESSAGES 1 +_ACEOF + + fi + + fi + + for ac_prog in bison +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_INTLBISON+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$INTLBISON"; then + ac_cv_prog_INTLBISON="$INTLBISON" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_INTLBISON="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +INTLBISON=$ac_cv_prog_INTLBISON +if test -n "$INTLBISON"; then + echo "$as_me:$LINENO: result: $INTLBISON" >&5 +echo "${ECHO_T}$INTLBISON" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$INTLBISON" && break +done + + if test -z "$INTLBISON"; then + ac_verc_fail=yes + else + echo "$as_me:$LINENO: checking version of bison" >&5 +echo $ECHO_N "checking version of bison... $ECHO_C" >&6 + ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; + 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; + esac + echo "$as_me:$LINENO: result: $ac_prog_version" >&5 +echo "${ECHO_T}$ac_prog_version" >&6 + fi + if test $ac_verc_fail = yes; then + INTLBISON=: + fi + + + + + + + + + + + + + + + + echo "$as_me:$LINENO: checking whether NLS is requested" >&5 +echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6 + # Check whether --enable-nls or --disable-nls was given. +if test "${enable_nls+set}" = set; then + enableval="$enable_nls" + USE_NLS=$enableval +else + USE_NLS=yes +fi; + echo "$as_me:$LINENO: result: $USE_NLS" >&5 +echo "${ECHO_T}$USE_NLS" >&6 + + + + BUILD_INCLUDED_LIBINTL=no + USE_INCLUDED_LIBINTL=no + + LIBINTL= + LTLIBINTL= + POSUB= + + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + + echo "$as_me:$LINENO: checking whether included gettext is requested" >&5 +echo $ECHO_N "checking whether included gettext is requested... $ECHO_C" >&6 + +# Check whether --with-included-gettext or --without-included-gettext was given. +if test "${with_included_gettext+set}" = set; then + withval="$with_included_gettext" + nls_cv_force_use_gnu_gettext=$withval +else + nls_cv_force_use_gnu_gettext=no +fi; + echo "$as_me:$LINENO: result: $nls_cv_force_use_gnu_gettext" >&5 +echo "${ECHO_T}$nls_cv_force_use_gnu_gettext" >&6 + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + + + + + + + echo "$as_me:$LINENO: checking for GNU gettext in libc" >&5 +echo $ECHO_N "checking for GNU gettext in libc... $ECHO_C" >&6 +if test "${gt_cv_func_gnugettext1_libc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings; +int +main () +{ +bindtextdomain ("", ""); +return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + gt_cv_func_gnugettext1_libc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +gt_cv_func_gnugettext1_libc=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $gt_cv_func_gnugettext1_libc" >&5 +echo "${ECHO_T}$gt_cv_func_gnugettext1_libc" >&6 + + if test "$gt_cv_func_gnugettext1_libc" != "yes"; then + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libintl-prefix or --without-libintl-prefix was given. +if test "${with_libintl_prefix+set}" = set; then + withval="$with_libintl_prefix" + + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi + +fi; + LIBINTL= + LTLIBINTL= + INCINTL= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='intl ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$hardcode_direct" = yes; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" + ;; + esac + done + fi + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" + done + fi + + echo "$as_me:$LINENO: checking for GNU gettext in libintl" >&5 +echo $ECHO_N "checking for GNU gettext in libintl... $ECHO_C" >&6 +if test "${gt_cv_func_gnugettext1_libintl+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (); +int +main () +{ +bindtextdomain ("", ""); +return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias (0) + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + gt_cv_func_gnugettext1_libintl=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +gt_cv_func_gnugettext1_libintl=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test "$gt_cv_func_gnugettext1_libintl" != yes && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (); +int +main () +{ +bindtextdomain ("", ""); +return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias (0) + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + gt_cv_func_gnugettext1_libintl=yes + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS" +fi +echo "$as_me:$LINENO: result: $gt_cv_func_gnugettext1_libintl" >&5 +echo "${ECHO_T}$gt_cv_func_gnugettext1_libintl" >&6 + fi + + if test "$gt_cv_func_gnugettext1_libc" = "yes" \ + || { test "$gt_cv_func_gnugettext1_libintl" = "yes" \ + && test "$PACKAGE" != gettext; }; then + gt_use_preinstalled_gnugettext=yes + else + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + + if test "$gt_use_preinstalled_gnugettext" != "yes"; then + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + INTLOBJS="\$(GETTOBJS)" + BUILD_INCLUDED_LIBINTL=yes + USE_INCLUDED_LIBINTL=yes + LIBINTL="\${top_builddir}/intl/libintl.a $LIBICONV" + LTLIBINTL="\${top_builddir}/intl/libintl.a $LTLIBICONV" + LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` + fi + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + CATOBJEXT=.gmo + fi + + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define ENABLE_NLS 1 +_ACEOF + + else + USE_NLS=no + fi + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then + echo "$as_me:$LINENO: checking how to link with libintl" >&5 +echo $ECHO_N "checking how to link with libintl... $ECHO_C" >&6 + echo "$as_me:$LINENO: result: $LIBINTL" >&5 +echo "${ECHO_T}$LIBINTL" >&6 + + for element in $INCINTL; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + fi + + +cat >>confdefs.h <<\_ACEOF +#define HAVE_GETTEXT 1 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define HAVE_DCGETTEXT 1 +_ACEOF + + fi + + POSUB=po + fi + + + if test "$PACKAGE" = gettext; then + BUILD_INCLUDED_LIBINTL=yes + fi + + + + + + + nls_cv_header_intl= + nls_cv_header_libgt= + + DATADIRNAME=share + + + INSTOBJEXT=.mo + + + GENCAT=gencat + + + INTL_LIBTOOL_SUFFIX_PREFIX= + + + + INTLLIBS="$LIBINTL" + + + + + + +# getmntent is in -lsun on Irix 4, -lseq on Dynix/PTX, -lgen on Unixware. +echo "$as_me:$LINENO: checking for getmntent in -lsun" >&5 +echo $ECHO_N "checking for getmntent in -lsun... $ECHO_C" >&6 +if test "${ac_cv_lib_sun_getmntent+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsun $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char getmntent (); +int +main () +{ +getmntent (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_sun_getmntent=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_sun_getmntent=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_sun_getmntent" >&5 +echo "${ECHO_T}$ac_cv_lib_sun_getmntent" >&6 +if test $ac_cv_lib_sun_getmntent = yes; then + LIBS="-lsun $LIBS" +else + echo "$as_me:$LINENO: checking for getmntent in -lseq" >&5 +echo $ECHO_N "checking for getmntent in -lseq... $ECHO_C" >&6 +if test "${ac_cv_lib_seq_getmntent+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lseq $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char getmntent (); +int +main () +{ +getmntent (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_seq_getmntent=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_seq_getmntent=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_seq_getmntent" >&5 +echo "${ECHO_T}$ac_cv_lib_seq_getmntent" >&6 +if test $ac_cv_lib_seq_getmntent = yes; then + LIBS="-lseq $LIBS" +else + echo "$as_me:$LINENO: checking for getmntent in -lgen" >&5 +echo $ECHO_N "checking for getmntent in -lgen... $ECHO_C" >&6 +if test "${ac_cv_lib_gen_getmntent+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgen $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char getmntent (); +int +main () +{ +getmntent (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_gen_getmntent=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_gen_getmntent=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_gen_getmntent" >&5 +echo "${ECHO_T}$ac_cv_lib_gen_getmntent" >&6 +if test $ac_cv_lib_gen_getmntent = yes; then + LIBS="-lgen $LIBS" +fi + +fi + +fi + + +for ac_func in getmntent +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +if test $ac_cv_c_compiler_gnu = yes; then + echo "$as_me:$LINENO: checking whether $CC needs -traditional" >&5 +echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6 +if test "${ac_cv_prog_gcc_traditional+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_pattern="Autoconf.*'x'" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +Autoconf TIOCGETP +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1; then + ac_cv_prog_gcc_traditional=yes +else + ac_cv_prog_gcc_traditional=no +fi +rm -f conftest* + + + if test $ac_cv_prog_gcc_traditional = no; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +Autoconf TCGETA +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1; then + ac_cv_prog_gcc_traditional=yes +fi +rm -f conftest* + + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_gcc_traditional" >&5 +echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6 + if test $ac_cv_prog_gcc_traditional = yes; then + CC="$CC -traditional" + fi +fi + +echo "$as_me:$LINENO: checking for pid_t" >&5 +echo $ECHO_N "checking for pid_t... $ECHO_C" >&6 +if test "${ac_cv_type_pid_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((pid_t *) 0) + return 0; +if (sizeof (pid_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_pid_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_pid_t=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5 +echo "${ECHO_T}$ac_cv_type_pid_t" >&6 +if test $ac_cv_type_pid_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define pid_t int +_ACEOF + +fi + + + +for ac_header in unistd.h vfork.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------ ## +## Report this to admin@amule.org ## +## ------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +for ac_func in fork vfork +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +if test "x$ac_cv_func_fork" = xyes; then + echo "$as_me:$LINENO: checking for working fork" >&5 +echo $ECHO_N "checking for working fork... $ECHO_C" >&6 +if test "${ac_cv_func_fork_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_fork_works=cross +else + cat >conftest.$ac_ext <<_ACEOF +/* By Ruediger Kuhlmann. */ + #include + #if HAVE_UNISTD_H + # include + #endif + /* Some systems only have a dummy stub for fork() */ + int main () + { + if (fork() < 0) + exit (1); + exit (0); + } +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_fork_works=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_fork_works=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_func_fork_works" >&5 +echo "${ECHO_T}$ac_cv_func_fork_works" >&6 + +else + ac_cv_func_fork_works=$ac_cv_func_fork +fi +if test "x$ac_cv_func_fork_works" = xcross; then + case $host in + *-*-amigaos* | *-*-msdosdjgpp*) + # Override, as these systems have only a dummy fork() stub + ac_cv_func_fork_works=no + ;; + *) + ac_cv_func_fork_works=yes + ;; + esac + { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 +echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} +fi +ac_cv_func_vfork_works=$ac_cv_func_vfork +if test "x$ac_cv_func_vfork" = xyes; then + echo "$as_me:$LINENO: checking for working vfork" >&5 +echo $ECHO_N "checking for working vfork... $ECHO_C" >&6 +if test "${ac_cv_func_vfork_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_vfork_works=cross +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Thanks to Paul Eggert for this test. */ +#include +#include +#include +#include +#include +#if HAVE_UNISTD_H +# include +#endif +#if HAVE_VFORK_H +# include +#endif +/* On some sparc systems, changes by the child to local and incoming + argument registers are propagated back to the parent. The compiler + is told about this with #include , but some compilers + (e.g. gcc -O) don't grok . Test for this by using a + static variable whose address is put into a register that is + clobbered by the vfork. */ +static void +#ifdef __cplusplus +sparc_address_test (int arg) +# else +sparc_address_test (arg) int arg; +#endif +{ + static pid_t child; + if (!child) { + child = vfork (); + if (child < 0) { + perror ("vfork"); + _exit(2); + } + if (!child) { + arg = getpid(); + write(-1, "", 0); + _exit (arg); + } + } +} + +int +main () +{ + pid_t parent = getpid (); + pid_t child; + + sparc_address_test (0); + + child = vfork (); + + if (child == 0) { + /* Here is another test for sparc vfork register problems. This + test uses lots of local variables, at least as many local + variables as main has allocated so far including compiler + temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris + 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should + reuse the register of parent for one of the local variables, + since it will think that parent can't possibly be used any more + in this routine. Assigning to the local variable will thus + munge parent in the parent process. */ + pid_t + p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), + p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); + /* Convince the compiler that p..p7 are live; otherwise, it might + use the same hardware register for all 8 local variables. */ + if (p != p1 || p != p2 || p != p3 || p != p4 + || p != p5 || p != p6 || p != p7) + _exit(1); + + /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent + from child file descriptors. If the child closes a descriptor + before it execs or exits, this munges the parent's descriptor + as well. Test for this by closing stdout in the child. */ + _exit(close(fileno(stdout)) != 0); + } else { + int status; + struct stat st; + + while (wait(&status) != child) + ; + exit( + /* Was there some problem with vforking? */ + child < 0 + + /* Did the child fail? (This shouldn't happen.) */ + || status + + /* Did the vfork/compiler bug occur? */ + || parent != getpid() + + /* Did the file descriptor bug occur? */ + || fstat(fileno(stdout), &st) != 0 + ); + } +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_vfork_works=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_vfork_works=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_func_vfork_works" >&5 +echo "${ECHO_T}$ac_cv_func_vfork_works" >&6 + +fi; +if test "x$ac_cv_func_fork_works" = xcross; then + ac_cv_func_vfork_works=$ac_cv_func_vfork + { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 +echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} +fi + +if test "x$ac_cv_func_vfork_works" = xyes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_WORKING_VFORK 1 +_ACEOF + +else + +cat >>confdefs.h <<\_ACEOF +#define vfork fork +_ACEOF + +fi +if test "x$ac_cv_func_fork_works" = xyes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_WORKING_FORK 1 +_ACEOF + +fi + +if test x$SYS != xwin32; then +echo "$as_me:$LINENO: checking whether lstat dereferences a symlink specified with a trailing slash" >&5 +echo $ECHO_N "checking whether lstat dereferences a symlink specified with a trailing slash... $ECHO_C" >&6 +if test "${ac_cv_func_lstat_dereferences_slashed_symlink+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + rm -f conftest.sym conftest.file +echo >conftest.file +if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then + if test "$cross_compiling" = yes; then + ac_cv_func_lstat_dereferences_slashed_symlink=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +struct stat sbuf; + /* Linux will dereference the symlink and fail. + That is better in the sense that it means we will not + have to compile and use the lstat wrapper. */ + exit (lstat ("conftest.sym/", &sbuf) ? 0 : 1); + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_lstat_dereferences_slashed_symlink=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_lstat_dereferences_slashed_symlink=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +else + # If the `ln -s' command failed, then we probably don't even + # have an lstat function. + ac_cv_func_lstat_dereferences_slashed_symlink=no +fi +rm -f conftest.sym conftest.file + +fi +echo "$as_me:$LINENO: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 +echo "${ECHO_T}$ac_cv_func_lstat_dereferences_slashed_symlink" >&6 + +test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && + +cat >>confdefs.h <<_ACEOF +#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 +_ACEOF + + +if test $ac_cv_func_lstat_dereferences_slashed_symlink = no; then + case $LIBOBJS in + "lstat.$ac_objext" | \ + *" lstat.$ac_objext" | \ + "lstat.$ac_objext "* | \ + *" lstat.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; +esac + +fi + +echo "$as_me:$LINENO: checking whether lstat accepts an empty string" >&5 +echo $ECHO_N "checking whether lstat accepts an empty string... $ECHO_C" >&6 +if test "${ac_cv_func_lstat_empty_string_bug+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_lstat_empty_string_bug=yes +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +struct stat sbuf; + exit (lstat ("", &sbuf) ? 1 : 0); + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_lstat_empty_string_bug=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_lstat_empty_string_bug=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_func_lstat_empty_string_bug" >&5 +echo "${ECHO_T}$ac_cv_func_lstat_empty_string_bug" >&6 +if test $ac_cv_func_lstat_empty_string_bug = yes; then + case $LIBOBJS in + "lstat.$ac_objext" | \ + *" lstat.$ac_objext" | \ + "lstat.$ac_objext "* | \ + *" lstat.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; +esac + + +cat >>confdefs.h <<_ACEOF +#define HAVE_LSTAT_EMPTY_STRING_BUG 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking whether lstat dereferences a symlink specified with a trailing slash" >&5 +echo $ECHO_N "checking whether lstat dereferences a symlink specified with a trailing slash... $ECHO_C" >&6 +if test "${ac_cv_func_lstat_dereferences_slashed_symlink+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + rm -f conftest.sym conftest.file +echo >conftest.file +if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then + if test "$cross_compiling" = yes; then + ac_cv_func_lstat_dereferences_slashed_symlink=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +struct stat sbuf; + /* Linux will dereference the symlink and fail. + That is better in the sense that it means we will not + have to compile and use the lstat wrapper. */ + exit (lstat ("conftest.sym/", &sbuf) ? 0 : 1); + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_lstat_dereferences_slashed_symlink=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_lstat_dereferences_slashed_symlink=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +else + # If the `ln -s' command failed, then we probably don't even + # have an lstat function. + ac_cv_func_lstat_dereferences_slashed_symlink=no +fi +rm -f conftest.sym conftest.file + +fi +echo "$as_me:$LINENO: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 +echo "${ECHO_T}$ac_cv_func_lstat_dereferences_slashed_symlink" >&6 + +test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && + +cat >>confdefs.h <<_ACEOF +#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 +_ACEOF + + +if test $ac_cv_func_lstat_dereferences_slashed_symlink = no; then + case $LIBOBJS in + "lstat.$ac_objext" | \ + *" lstat.$ac_objext" | \ + "lstat.$ac_objext "* | \ + *" lstat.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; +esac + +fi + +fi +echo "$as_me:$LINENO: checking for working memcmp" >&5 +echo $ECHO_N "checking for working memcmp... $ECHO_C" >&6 +if test "${ac_cv_func_memcmp_working+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_memcmp_working=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Some versions of memcmp are not 8-bit clean. */ + char c0 = 0x40, c1 = 0x80, c2 = 0x81; + if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0) + exit (1); + + /* The Next x86 OpenStep bug shows up only when comparing 16 bytes + or more and with at least one buffer not starting on a 4-byte boundary. + William Lewis provided this test program. */ + { + char foo[21]; + char bar[21]; + int i; + for (i = 0; i < 4; i++) + { + char *a = foo + i; + char *b = bar + i; + strcpy (a, "--------01111111"); + strcpy (b, "--------10000000"); + if (memcmp (a, b, 16) >= 0) + exit (1); + } + exit (0); + } + + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_memcmp_working=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_memcmp_working=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_func_memcmp_working" >&5 +echo "${ECHO_T}$ac_cv_func_memcmp_working" >&6 +test $ac_cv_func_memcmp_working = no && case $LIBOBJS in + "memcmp.$ac_objext" | \ + *" memcmp.$ac_objext" | \ + "memcmp.$ac_objext "* | \ + *" memcmp.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" ;; +esac + + + + +for ac_header in stdlib.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------ ## +## Report this to admin@amule.org ## +## ------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_func in getpagesize +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +echo "$as_me:$LINENO: checking for working mmap" >&5 +echo $ECHO_N "checking for working mmap... $ECHO_C" >&6 +if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_mmap_fixed_mapped=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +/* malloc might have been renamed as rpl_malloc. */ +#undef malloc + +/* Thanks to Mike Haertel and Jim Avera for this test. + Here is a matrix of mmap possibilities: + mmap private not fixed + mmap private fixed at somewhere currently unmapped + mmap private fixed at somewhere already mapped + mmap shared not fixed + mmap shared fixed at somewhere currently unmapped + mmap shared fixed at somewhere already mapped + For private mappings, we should verify that changes cannot be read() + back from the file, nor mmap's back from the file at a different + address. (There have been systems where private was not correctly + implemented like the infamous i386 svr4.0, and systems where the + VM page cache was not coherent with the file system buffer cache + like early versions of FreeBSD and possibly contemporary NetBSD.) + For shared mappings, we should conversely verify that changes get + propagated back to all the places they're supposed to be. + + Grep wants private fixed already mapped. + The main things grep needs to know about mmap are: + * does it exist and is it safe to write into the mmap'd area + * how to use it (BSD variants) */ + +#include +#include + +#if !STDC_HEADERS && !HAVE_STDLIB_H +char *malloc (); +#endif + +/* This mess was copied from the GNU getpagesize.h. */ +#if !HAVE_GETPAGESIZE +/* Assume that all systems that can run configure have sys/param.h. */ +# if !HAVE_SYS_PARAM_H +# define HAVE_SYS_PARAM_H 1 +# endif + +# ifdef _SC_PAGESIZE +# define getpagesize() sysconf(_SC_PAGESIZE) +# else /* no _SC_PAGESIZE */ +# if HAVE_SYS_PARAM_H +# include +# ifdef EXEC_PAGESIZE +# define getpagesize() EXEC_PAGESIZE +# else /* no EXEC_PAGESIZE */ +# ifdef NBPG +# define getpagesize() NBPG * CLSIZE +# ifndef CLSIZE +# define CLSIZE 1 +# endif /* no CLSIZE */ +# else /* no NBPG */ +# ifdef NBPC +# define getpagesize() NBPC +# else /* no NBPC */ +# ifdef PAGESIZE +# define getpagesize() PAGESIZE +# endif /* PAGESIZE */ +# endif /* no NBPC */ +# endif /* no NBPG */ +# endif /* no EXEC_PAGESIZE */ +# else /* no HAVE_SYS_PARAM_H */ +# define getpagesize() 8192 /* punt totally */ +# endif /* no HAVE_SYS_PARAM_H */ +# endif /* no _SC_PAGESIZE */ + +#endif /* no HAVE_GETPAGESIZE */ + +int +main () +{ + char *data, *data2, *data3; + int i, pagesize; + int fd; + + pagesize = getpagesize (); + + /* First, make a file with some known garbage in it. */ + data = (char *) malloc (pagesize); + if (!data) + exit (1); + for (i = 0; i < pagesize; ++i) + *(data + i) = rand (); + umask (0); + fd = creat ("conftest.mmap", 0600); + if (fd < 0) + exit (1); + if (write (fd, data, pagesize) != pagesize) + exit (1); + close (fd); + + /* Next, try to mmap the file at a fixed address which already has + something else allocated at it. If we can, also make sure that + we see the same garbage. */ + fd = open ("conftest.mmap", O_RDWR); + if (fd < 0) + exit (1); + data2 = (char *) malloc (2 * pagesize); + if (!data2) + exit (1); + data2 += (pagesize - ((long) data2 & (pagesize - 1))) & (pagesize - 1); + if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_FIXED, fd, 0L)) + exit (1); + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data2 + i)) + exit (1); + + /* Finally, make sure that changes to the mapped area do not + percolate back to the file as seen by read(). (This is a bug on + some variants of i386 svr4.0.) */ + for (i = 0; i < pagesize; ++i) + *(data2 + i) = *(data2 + i) + 1; + data3 = (char *) malloc (pagesize); + if (!data3) + exit (1); + if (read (fd, data3, pagesize) != pagesize) + exit (1); + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data3 + i)) + exit (1); + close (fd); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_mmap_fixed_mapped=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_mmap_fixed_mapped=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_func_mmap_fixed_mapped" >&5 +echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6 +if test $ac_cv_func_mmap_fixed_mapped = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_MMAP 1 +_ACEOF + +fi +rm -f conftest.mmap + + + +for ac_header in sys/select.h sys/socket.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------ ## +## Report this to admin@amule.org ## +## ------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +echo "$as_me:$LINENO: checking types of arguments for select" >&5 +echo $ECHO_N "checking types of arguments for select... $ECHO_C" >&6 +if test "${ac_cv_func_select_args+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + for ac_arg234 in 'fd_set *' 'int *' 'void *'; do + for ac_arg1 in 'int' 'size_t' 'unsigned long' 'unsigned'; do + for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#if HAVE_SYS_SELECT_H +# include +#endif +#if HAVE_SYS_SOCKET_H +# include +#endif + +int +main () +{ +extern int select ($ac_arg1, + $ac_arg234, $ac_arg234, $ac_arg234, + $ac_arg5); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done + done +done +# Provide a safe default value. +: ${ac_cv_func_select_args='int,int *,struct timeval *'} + +fi +echo "$as_me:$LINENO: result: $ac_cv_func_select_args" >&5 +echo "${ECHO_T}$ac_cv_func_select_args" >&6 +ac_save_IFS=$IFS; IFS=',' +set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'` +IFS=$ac_save_IFS +shift + +cat >>confdefs.h <<_ACEOF +#define SELECT_TYPE_ARG1 $1 +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define SELECT_TYPE_ARG234 ($2) +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define SELECT_TYPE_ARG5 ($3) +_ACEOF + +rm -f conftest* + +echo "$as_me:$LINENO: checking for function prototypes" >&5 +echo $ECHO_N "checking for function prototypes... $ECHO_C" >&6 +if test "$ac_cv_prog_cc_stdc" != no; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define PROTOTYPES 1 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define __PROTOTYPES 1 +_ACEOF + +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +echo "$as_me:$LINENO: checking whether setvbuf arguments are reversed" >&5 +echo $ECHO_N "checking whether setvbuf arguments are reversed... $ECHO_C" >&6 +if test "${ac_cv_func_setvbuf_reversed+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_func_setvbuf_reversed=no + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +# if PROTOTYPES + int (setvbuf) (FILE *, int, char *, size_t); +# endif +int +main () +{ +char buf; return setvbuf (stdout, _IOLBF, &buf, 1); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +# if PROTOTYPES + int (setvbuf) (FILE *, int, char *, size_t); +# endif +int +main () +{ +char buf; return setvbuf (stdout, &buf, _IOLBF, 1); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + # It compiles and links either way, so it must not be declared + # with a prototype and most likely this is a K&R C compiler. + # Try running it. + if test "$cross_compiling" = yes; then + : # Assume setvbuf is not reversed when cross-compiling. +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +/* This call has the arguments reversed. + A reversed system may check and see that the address of buf + is not _IOLBF, _IONBF, or _IOFBF, and return nonzero. */ + char buf; + if (setvbuf (stdout, _IOLBF, &buf, 1) != 0) + exit (1); + putchar ('\r'); + exit (0); /* Non-reversed systems SEGV here. */ + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_setvbuf_reversed=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +rm -f core *.core +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + ac_cv_func_setvbuf_reversed=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_setvbuf_reversed" >&5 +echo "${ECHO_T}$ac_cv_func_setvbuf_reversed" >&6 +if test $ac_cv_func_setvbuf_reversed = yes; then + +cat >>confdefs.h <<\_ACEOF +#define SETVBUF_REVERSED 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking return type of signal handlers" >&5 +echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6 +if test "${ac_cv_type_signal+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#ifdef signal +# undef signal +#endif +#ifdef __cplusplus +extern "C" void (*signal (int, void (*)(int)))(int); +#else +void (*signal ()) (); +#endif + +int +main () +{ +int i; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_signal=void +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_signal=int +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5 +echo "${ECHO_T}$ac_cv_type_signal" >&6 + +cat >>confdefs.h <<_ACEOF +#define RETSIGTYPE $ac_cv_type_signal +_ACEOF + + +echo "$as_me:$LINENO: checking whether stat accepts an empty string" >&5 +echo $ECHO_N "checking whether stat accepts an empty string... $ECHO_C" >&6 +if test "${ac_cv_func_stat_empty_string_bug+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_stat_empty_string_bug=yes +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +struct stat sbuf; + exit (stat ("", &sbuf) ? 1 : 0); + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_stat_empty_string_bug=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_stat_empty_string_bug=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_func_stat_empty_string_bug" >&5 +echo "${ECHO_T}$ac_cv_func_stat_empty_string_bug" >&6 +if test $ac_cv_func_stat_empty_string_bug = yes; then + case $LIBOBJS in + "stat.$ac_objext" | \ + *" stat.$ac_objext" | \ + "stat.$ac_objext "* | \ + *" stat.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS stat.$ac_objext" ;; +esac + + +cat >>confdefs.h <<_ACEOF +#define HAVE_STAT_EMPTY_STRING_BUG 1 +_ACEOF + +fi + + +for ac_func in strftime +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +else + # strftime is in -lintl on SCO UNIX. +echo "$as_me:$LINENO: checking for strftime in -lintl" >&5 +echo $ECHO_N "checking for strftime in -lintl... $ECHO_C" >&6 +if test "${ac_cv_lib_intl_strftime+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char strftime (); +int +main () +{ +strftime (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_intl_strftime=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_intl_strftime=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_intl_strftime" >&5 +echo "${ECHO_T}$ac_cv_lib_intl_strftime" >&6 +if test $ac_cv_lib_intl_strftime = yes; then + cat >>confdefs.h <<\_ACEOF +#define HAVE_STRFTIME 1 +_ACEOF + +LIBS="-lintl $LIBS" +fi + +fi +done + +echo "$as_me:$LINENO: checking for working strtod" >&5 +echo $ECHO_N "checking for working strtod... $ECHO_C" >&6 +if test "${ac_cv_func_strtod+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_strtod=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +double strtod (); +int +main() +{ + { + /* Some versions of Linux strtod mis-parse strings with leading '+'. */ + char *string = " +69"; + char *term; + double value; + value = strtod (string, &term); + if (value != 69 || term != (string + 4)) + exit (1); + } + + { + /* Under Solaris 2.4, strtod returns the wrong value for the + terminating character under some conditions. */ + char *string = "NaN"; + char *term; + strtod (string, &term); + if (term != string && *(term - 1) == 0) + exit (1); + } + exit (0); +} + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_strtod=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_strtod=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_func_strtod" >&5 +echo "${ECHO_T}$ac_cv_func_strtod" >&6 +if test $ac_cv_func_strtod = no; then + case $LIBOBJS in + "strtod.$ac_objext" | \ + *" strtod.$ac_objext" | \ + "strtod.$ac_objext "* | \ + *" strtod.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strtod.$ac_objext" ;; +esac + +echo "$as_me:$LINENO: checking for pow" >&5 +echo $ECHO_N "checking for pow... $ECHO_C" >&6 +if test "${ac_cv_func_pow+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define pow to an innocuous variant, in case declares pow. + For example, HP-UX 11i declares gettimeofday. */ +#define pow innocuous_pow + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char pow (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef pow + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char pow (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_pow) || defined (__stub___pow) +choke me +#else +char (*f) () = pow; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != pow; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_pow=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_pow=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_pow" >&5 +echo "${ECHO_T}$ac_cv_func_pow" >&6 + +if test $ac_cv_func_pow = no; then + echo "$as_me:$LINENO: checking for pow in -lm" >&5 +echo $ECHO_N "checking for pow in -lm... $ECHO_C" >&6 +if test "${ac_cv_lib_m_pow+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char pow (); +int +main () +{ +pow (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_m_pow=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_m_pow=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_m_pow" >&5 +echo "${ECHO_T}$ac_cv_lib_m_pow" >&6 +if test $ac_cv_lib_m_pow = yes; then + POW_LIB=-lm +else + { echo "$as_me:$LINENO: WARNING: cannot find library containing definition of pow" >&5 +echo "$as_me: WARNING: cannot find library containing definition of pow" >&2;} +fi + +fi + +fi + + +for ac_func in vprintf +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +echo "$as_me:$LINENO: checking for _doprnt" >&5 +echo $ECHO_N "checking for _doprnt... $ECHO_C" >&6 +if test "${ac_cv_func__doprnt+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define _doprnt to an innocuous variant, in case declares _doprnt. + For example, HP-UX 11i declares gettimeofday. */ +#define _doprnt innocuous__doprnt + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char _doprnt (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef _doprnt + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char _doprnt (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub__doprnt) || defined (__stub____doprnt) +choke me +#else +char (*f) () = _doprnt; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != _doprnt; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func__doprnt=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func__doprnt=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5 +echo "${ECHO_T}$ac_cv_func__doprnt" >&6 +if test $ac_cv_func__doprnt = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_DOPRNT 1 +_ACEOF + +fi + +fi +done + + +if test $cross_compiling = yes -a $gnumalloc = yes ; then + { echo "$as_me:$LINENO: WARNING: + configure cannot check whether malloc() and realloc() are GNU libc + compatible. You have to be ABSOLUTELY sure that they are, otherwise + run configure with the --without-gnu-malloc switch." >&5 +echo "$as_me: WARNING: + configure cannot check whether malloc() and realloc() are GNU libc + compatible. You have to be ABSOLUTELY sure that they are, otherwise + run configure with the --without-gnu-malloc switch." >&2;} + ac_cv_func_malloc_0_nonnull=yes + ac_cv_func_realloc_0_nonnull=yes +fi + +for ac_header in stdlib.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------ ## +## Report this to admin@amule.org ## +## ------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +echo "$as_me:$LINENO: checking for GNU libc compatible malloc" >&5 +echo $ECHO_N "checking for GNU libc compatible malloc... $ECHO_C" >&6 +if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_malloc_0_nonnull=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#if STDC_HEADERS || HAVE_STDLIB_H +# include +#else +char *malloc (); +#endif + +int +main () +{ +exit (malloc (0) ? 0 : 1); + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_malloc_0_nonnull=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_malloc_0_nonnull=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_func_malloc_0_nonnull" >&5 +echo "${ECHO_T}$ac_cv_func_malloc_0_nonnull" >&6 +if test $ac_cv_func_malloc_0_nonnull = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_MALLOC 1 +_ACEOF + +else + cat >>confdefs.h <<\_ACEOF +#define HAVE_MALLOC 0 +_ACEOF + + case $LIBOBJS in + "malloc.$ac_objext" | \ + *" malloc.$ac_objext" | \ + "malloc.$ac_objext "* | \ + *" malloc.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;; +esac + + +cat >>confdefs.h <<\_ACEOF +#define malloc rpl_malloc +_ACEOF + +fi + + + + +for ac_header in stdlib.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------ ## +## Report this to admin@amule.org ## +## ------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +echo "$as_me:$LINENO: checking for GNU libc compatible realloc" >&5 +echo $ECHO_N "checking for GNU libc compatible realloc... $ECHO_C" >&6 +if test "${ac_cv_func_realloc_0_nonnull+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_realloc_0_nonnull=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#if STDC_HEADERS || HAVE_STDLIB_H +# include +#else +char *realloc (); +#endif + +int +main () +{ +exit (realloc (0, 0) ? 0 : 1); + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_realloc_0_nonnull=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_realloc_0_nonnull=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_func_realloc_0_nonnull" >&5 +echo "${ECHO_T}$ac_cv_func_realloc_0_nonnull" >&6 +if test $ac_cv_func_realloc_0_nonnull = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_REALLOC 1 +_ACEOF + +else + cat >>confdefs.h <<\_ACEOF +#define HAVE_REALLOC 0 +_ACEOF + + case $LIBOBJS in + "realloc.$ac_objext" | \ + *" realloc.$ac_objext" | \ + "realloc.$ac_objext "* | \ + *" realloc.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS realloc.$ac_objext" ;; +esac + + +cat >>confdefs.h <<\_ACEOF +#define realloc rpl_realloc +_ACEOF + +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +for ac_func in __argz_count __argz_next __argz_stringify endpwent floor ftruncate getcwd gethostbyaddr gethostbyname gethostname getmntent getmntinfo getpass gettimeofday inet_ntoa localeconv memmove mempcpy memset munmap nl_langinfo pow select setlocale socket sqrt stpcpy strcasecmp strchr strcspn strdup strerror strncasecmp strstr strtoul +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +#------------------------------------------------------------------------------- +# End of autoscan stuff +#------------------------------------------------------------------------------- + + + + +for ac_func in mkdir getrlimit setrlimit +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +# Flush standard test results for speeding cache +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +# Other tests + +case "$USE_DEBUG" in +yes) DEBUG_FLAGS="-g -D__DEBUG__ -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC" + if test x$GCC = xyes; then + DEBUG_FLAGS="$DEBUG_FLAGS -W -Wall -Wshadow -Wundef -ggdb -fno-inline -fmessage-length=0" +fi + + if test x$SYS = xwin32; then + RCFLAGS="$RCFLAGS -D__DEBUG__" +fi + + ;; +*) DEBUG_FLAGS="" + if test x$GCC = xyes; then + DEBUG_FLAGS="$DEBUG_FLAGS -W -Wall -Wshadow -Wundef" +fi + + ;; +esac + +#aMule options + +# Command line tools +case "$AMULECMD" in +yes) ;; +*) AMULECMD="no" + ;; +esac + +# For proper compilation flags + +WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs adv,core,net` + +WXBASE_LIBS=`$WX_CONFIG_WITH_ARGS --libs net` +WXBASE_CXXFLAGS="$WX_CXXFLAGS -DwxUSE_GUI=0" +WXBASE_CFLAGS="$WX_CFLAGS -DwxUSE_GUI=0" + +WX_CFLAGS="`echo $WX_CFLAGS | sed "s#-I/#-isystem /#g"`" +WX_CXXFLAGS="`echo $WX_CXXFLAGS | sed "s#-I/#-isystem /#g"`" +WXBASE_CFLAGS="`echo $WXBASE_CFLAGS | sed "s#-I/#-isystem /#g"`" +WXBASE_CXXFLAGS="`echo $WXBASE_CXXFLAGS | sed "s#-I/#-isystem /#g"`" + + + + + +case "$USE_OPTIMIZE" in +yes) OPTIMIZE_FLAGS="-O2" + ;; +*) OPTIMIZE_FLAGS="" + ;; +esac + +# Profiling +case "$USE_PROFILE" in +yes) PROFILE_FLAGS="-pg" + ;; +*) PROFILE_FLAGS="" + ;; +esac + +echo "$as_me:$LINENO: checking if the applications should be statically linked" >&5 +echo $ECHO_N "checking if the applications should be statically linked... $ECHO_C" >&6 +case "$USE_DEBUG_STATIC" in +yes) LDFLAGS="$LDFLAGS -static" + ;; +esac +echo "$as_me:$LINENO: result: $USE_DEBUG_STATIC" >&5 +echo "${ECHO_T}$USE_DEBUG_STATIC" >&6 + +# autoconf >= 2.60 already defines ${docdir}, but we always need it. +echo "$as_me:$LINENO: checking for docdir" >&5 +echo $ECHO_N "checking for docdir... $ECHO_C" >&6 +if test x"$docdir" = x; then + docdir="$datadir"/doc/"$PACKAGE_NAME"-"$PACKAGE_VERSION" + +fi +echo "$as_me:$LINENO: result: $docdir" >&5 +echo "${ECHO_T}$docdir" >&6 + +# Try to set the SVN checkout-date +echo "$as_me:$LINENO: checking for SVNDATE" >&5 +echo $ECHO_N "checking for SVNDATE... $ECHO_C" >&6 +if test -f "$srcdir/SVNDATE" # SVNDATE for tarballs +then + svndate=`cat $srcdir/SVNDATE` +elif test -d $srcdir/.svn # SVNDATE for svn +then + svndate="rev. `svnversion $srcdir | sed -e 's/[0-9][0-9]*:\(.*\)/\1/' -e 's/\([0-9][0-9]*\).*/\1/'`" +fi +echo "$as_me:$LINENO: result: ${svndate:-None required}" >&5 +echo "${ECHO_T}${svndate:-None required}" >&6 +test "$svndate" && +cat >>confdefs.h <<_ACEOF +#define SVNDATE "$svndate" +_ACEOF + +test x$SYS = xwin32 && test "$svndate" && RCFLAGS="$RCFLAGS -D__PRERELEASE__" +SVNDATE="$svndate" + + +XRCFLAGS="-Isrc" +CXXFLAGS="$CXXFLAGS $DEBUG_FLAGS $OPTIMIZE_FLAGS $PROFILE_FLAGS -DUSE_WX_EXTENSIONS" +CFLAGS="$CFLAGS $DEBUG_FLAGS $OPTIMIZE_FLAGS $PROFILE_FLAGS -DUSE_WX_EXTENSIONS" + +LDFLAGS="$LDFLAGS $PROFILE_FLAGS" +if test x$SYS != xwin32; then + echo "$as_me:$LINENO: checking if this is a FreeBSD 4 or earlier system" >&5 +echo $ECHO_N "checking if this is a FreeBSD 4 or earlier system... $ECHO_C" >&6 + if test x"`uname -s`" = xFreeBSD && test 0`uname -r | cut -c 1` -lt 5; then + LDFLAGS="$LDFLAGS -pthread" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + else + LDFLAGS="$LDFLAGS -lpthread" + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + fi +fi + +case "$USE_NLS" in + +yes) + echo "$as_me:$LINENO: checking for requested languages" >&5 +echo $ECHO_N "checking for requested languages... $ECHO_C" >&6 + Generate_Langs=`echo $LINGUAS | $AWK 'OFS="\\\\|" { for (i = 1; i <= NF; ++i) $i = "\\\\." $i; print }'` + + if test "$AMULE_DAEMON" == "yes"; then + if test "$LINGUAS" = ""; then + AMULE_DAEMON_MANPAGES=`ls -1 ${srcdir}/docs/man/amuled.* | sed -e 's:.*/::g'` + else + AMULE_DAEMON_MANPAGES=`ls -1 ${srcdir}/docs/man/amuled.* | sed -e 's:.*/::g' | grep $Generate_Langs ` + AMULE_DAEMON_MANPAGES="`basename docs/man/amuled.1` $AMULE_DAEMON_MANPAGES" + fi + AMULE_DAEMON_MANPAGES=`echo $AMULE_DAEMON_MANPAGES | tr -d '\n'` + else + AMULE_DAEMON_MANPAGES= + fi + + + + if test "$AMULECMD" == "yes"; then + if test "$LINGUAS" = ""; then + AMULECMD_MANPAGES=`ls -1 ${srcdir}/docs/man/amulecmd.* | sed -e 's:.*/::g'` + else + AMULECMD_MANPAGES=`ls -1 ${srcdir}/docs/man/amulecmd.* | sed -e 's:.*/::g' | grep $Generate_Langs ` + AMULECMD_MANPAGES="`basename docs/man/amulecmd.1` $AMULECMD_MANPAGES" + fi + AMULECMD_MANPAGES=`echo $AMULECMD_MANPAGES | tr -d '\n'` + else + AMULECMD_MANPAGES= + fi + + + + if test "$WEB" == "yes"; then + if test "$LINGUAS" = ""; then + WEB_MANPAGES=`ls -1 ${srcdir}/docs/man/amuleweb.* | sed -e 's:.*/::g'` + else + WEB_MANPAGES=`ls -1 ${srcdir}/docs/man/amuleweb.* | sed -e 's:.*/::g' | grep $Generate_Langs ` + WEB_MANPAGES="`basename docs/man/amuleweb.1` $WEB_MANPAGES" + fi + WEB_MANPAGES=`echo $WEB_MANPAGES | tr -d '\n'` + else + WEB_MANPAGES= + fi + + + + if test "$AMULE_GUI" == "yes"; then + if test "$LINGUAS" = ""; then + AMULE_GUI_MANPAGES=`ls -1 ${srcdir}/docs/man/amulegui.* | sed -e 's:.*/::g'` + else + AMULE_GUI_MANPAGES=`ls -1 ${srcdir}/docs/man/amulegui.* | sed -e 's:.*/::g' | grep $Generate_Langs ` + AMULE_GUI_MANPAGES="`basename docs/man/amulegui.1` $AMULE_GUI_MANPAGES" + fi + AMULE_GUI_MANPAGES=`echo $AMULE_GUI_MANPAGES | tr -d '\n'` + else + AMULE_GUI_MANPAGES= + fi + + + + if test "$CAS" == "yes"; then + if test "$LINGUAS" = ""; then + CAS_MANPAGES=`ls -1 ${srcdir}/src/utils/cas/docs/cas.* | sed -e 's:.*/::g'` + else + CAS_MANPAGES=`ls -1 ${srcdir}/src/utils/cas/docs/cas.* | sed -e 's:.*/::g' | grep $Generate_Langs ` + CAS_MANPAGES="`basename src/utils/cas/docs/cas.1` $CAS_MANPAGES" + fi + CAS_MANPAGES=`echo $CAS_MANPAGES | tr -d '\n'` + else + CAS_MANPAGES= + fi + + + + if test "$WXCAS" == "yes"; then + if test "$LINGUAS" = ""; then + WXCAS_MANPAGES=`ls -1 ${srcdir}/src/utils/wxCas/docs/wxcas.* | sed -e 's:.*/::g'` + else + WXCAS_MANPAGES=`ls -1 ${srcdir}/src/utils/wxCas/docs/wxcas.* | sed -e 's:.*/::g' | grep $Generate_Langs ` + WXCAS_MANPAGES="`basename src/utils/wxCas/docs/wxcas.1` $WXCAS_MANPAGES" + fi + WXCAS_MANPAGES=`echo $WXCAS_MANPAGES | tr -d '\n'` + else + WXCAS_MANPAGES= + fi + + + + if test "$ED2K" == "yes"; then + if test "$LINGUAS" = ""; then + ED2K_MANPAGES=`ls -1 ${srcdir}/docs/man/ed2k.* | sed -e 's:.*/::g'` + else + ED2K_MANPAGES=`ls -1 ${srcdir}/docs/man/ed2k.* | sed -e 's:.*/::g' | grep $Generate_Langs ` + ED2K_MANPAGES="`basename docs/man/ed2k.1` $ED2K_MANPAGES" + fi + ED2K_MANPAGES=`echo $ED2K_MANPAGES | tr -d '\n'` + else + ED2K_MANPAGES= + fi + + + + if test "$ALC" == "yes"; then + if test "$LINGUAS" = ""; then + ALC_MANPAGES=`ls -1 ${srcdir}/src/utils/aLinkCreator/docs/alc.* | sed -e 's:.*/::g'` + else + ALC_MANPAGES=`ls -1 ${srcdir}/src/utils/aLinkCreator/docs/alc.* | sed -e 's:.*/::g' | grep $Generate_Langs ` + ALC_MANPAGES="`basename src/utils/aLinkCreator/docs/alc.1` $ALC_MANPAGES" + fi + ALC_MANPAGES=`echo $ALC_MANPAGES | tr -d '\n'` + else + ALC_MANPAGES= + fi + + + + if test "$ALCC" == "yes"; then + if test "$LINGUAS" = ""; then + ALCC_MANPAGES=`ls -1 ${srcdir}/src/utils/aLinkCreator/docs/alcc.* | sed -e 's:.*/::g'` + else + ALCC_MANPAGES=`ls -1 ${srcdir}/src/utils/aLinkCreator/docs/alcc.* | sed -e 's:.*/::g' | grep $Generate_Langs ` + ALCC_MANPAGES="`basename src/utils/aLinkCreator/docs/alcc.1` $ALCC_MANPAGES" + fi + ALCC_MANPAGES=`echo $ALCC_MANPAGES | tr -d '\n'` + else + ALCC_MANPAGES= + fi + + + + if test "$MONOLITHIC" == "yes"; then + if test "$LINGUAS" = ""; then + MONOLITHIC_MANPAGES=`ls -1 ${srcdir}/docs/man/amule.* | sed -e 's:.*/::g'` + else + MONOLITHIC_MANPAGES=`ls -1 ${srcdir}/docs/man/amule.* | sed -e 's:.*/::g' | grep $Generate_Langs ` + MONOLITHIC_MANPAGES="`basename docs/man/amule.1` $MONOLITHIC_MANPAGES" + fi + MONOLITHIC_MANPAGES=`echo $MONOLITHIC_MANPAGES | tr -d '\n'` + else + MONOLITHIC_MANPAGES= + fi + + + echo "$as_me:$LINENO: result: ${LINGUAS:-all}" >&5 +echo "${ECHO_T}${LINGUAS:-all}" >&6 + ;; +*) + HAVE_GETTEXT="no" +esac + +echo "$as_me:$LINENO: checking denoising level" >&5 +echo $ECHO_N "checking denoising level... $ECHO_C" >&6 +if test "$denoiselevel" = "yes"; then + denoiselevel=5 +fi +if test "$denoiselevel" = "no"; then + denoiselevel=0 +fi +if test $denoiselevel -gt 4; then + if test "${svndate:+set}" = "set"; then + denoiselevel=0 +else + denoiselevel=4 +fi + +fi +echo "$as_me:$LINENO: result: $denoiselevel" >&5 +echo "${ECHO_T}$denoiselevel" >&6 + + ac_config_commands="$ac_config_commands denoiser" + + + + + +if test x$WEB = xyes; then + WEB_TRUE= + WEB_FALSE='#' +else + WEB_TRUE='#' + WEB_FALSE= +fi + + + +if test x$ED2K = xyes; then + ED2K_TRUE= + ED2K_FALSE='#' +else + ED2K_TRUE='#' + ED2K_FALSE= +fi + + + +if test x$CAS = xyes; then + CAS_TRUE= + CAS_FALSE='#' +else + CAS_TRUE='#' + CAS_FALSE= +fi + + + +if test x$WXCAS = xyes; then + WXCAS_TRUE= + WXCAS_FALSE='#' +else + WXCAS_TRUE='#' + WXCAS_FALSE= +fi + + + +if test x$ALC = xyes; then + ALC_TRUE= + ALC_FALSE='#' +else + ALC_TRUE='#' + ALC_FALSE= +fi + + + +if test x$ALCC = xyes; then + ALCC_TRUE= + ALCC_FALSE='#' +else + ALCC_TRUE='#' + ALCC_FALSE= +fi + + + +if test x$AMULE_GUI = xyes; then + AMULE_GUI_TRUE= + AMULE_GUI_FALSE='#' +else + AMULE_GUI_TRUE='#' + AMULE_GUI_FALSE= +fi + + + +if test x$AMULE_DAEMON = xyes; then + AMULE_DAEMON_TRUE= + AMULE_DAEMON_FALSE='#' +else + AMULE_DAEMON_TRUE='#' + AMULE_DAEMON_FALSE= +fi + + + +if test x$AMULECMD = xyes; then + COMPILE_CMD_TRUE= + COMPILE_CMD_FALSE='#' +else + COMPILE_CMD_TRUE='#' + COMPILE_CMD_FALSE= +fi + + + +if test x$MONOLITHIC = xyes; then + MONOLITHIC_TRUE= + MONOLITHIC_FALSE='#' +else + MONOLITHIC_TRUE='#' + MONOLITHIC_FALSE= +fi + + + +if test x$ENABLE_UPNP = xyes -a x$SYS != xwin32; then + ENABLE_UPNP_TRUE= + ENABLE_UPNP_FALSE='#' +else + ENABLE_UPNP_TRUE='#' + ENABLE_UPNP_FALSE= +fi + + + +if test x$ENABLE_IP2COUNTRY = xyes; then + ENABLE_IP2COUNTRY_TRUE= + ENABLE_IP2COUNTRY_FALSE='#' +else + ENABLE_IP2COUNTRY_TRUE='#' + ENABLE_IP2COUNTRY_FALSE= +fi + + + +if test x$SYS = xwin32; then + SYS_WIN32_TRUE= + SYS_WIN32_FALSE='#' +else + SYS_WIN32_TRUE='#' + SYS_WIN32_FALSE= +fi + + + +if test x$SYS = xwin32 -a "$RC" != ":"; then + NEED_RC_TRUE= + NEED_RC_FALSE='#' +else + NEED_RC_TRUE='#' + NEED_RC_FALSE= +fi + + + +if test x$SYS = xdarwin; then + NEED_CORESERVICES_TRUE= + NEED_CORESERVICES_FALSE='#' +else + NEED_CORESERVICES_TRUE='#' + NEED_CORESERVICES_FALSE= +fi + + + +if test x$HAVE_GETTEXT = xyes; then + COMPILE_NLS_TRUE= + COMPILE_NLS_FALSE='#' +else + COMPILE_NLS_TRUE='#' + COMPILE_NLS_FALSE= +fi + + + +if test x$HAVE_FLEX_EXTENDED = xyes; then + GENERATE_FLEX_HEADER_TRUE= + GENERATE_FLEX_HEADER_FALSE='#' +else + GENERATE_FLEX_HEADER_TRUE='#' + GENERATE_FLEX_HEADER_FALSE= +fi + + +if test x$AMULECMD = xyes -o x$WEB = xyes; then + + echo "$as_me:$LINENO: checking for a readline compatible library" >&5 +echo $ECHO_N "checking for a readline compatible library... $ECHO_C" >&6 +if test "${vl_cv_lib_readline+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + ORIG_LIBS="$LIBS" + for readline_lib in readline edit editline; do + for termcap_lib in "" termcap curses ncurses; do + if test -z "$termcap_lib"; then + TRY_LIB="-l$readline_lib" + else + TRY_LIB="-l$readline_lib -l$termcap_lib" + fi + LIBS="$ORIG_LIBS $TRY_LIB" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char readline (); +int +main () +{ +readline (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + vl_cv_lib_readline="$TRY_LIB" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -n "$vl_cv_lib_readline"; then + break + fi + done + if test -n "$vl_cv_lib_readline"; then + break + fi + done + if test -z "$vl_cv_lib_readline"; then + vl_cv_lib_readline="no" + LIBS="$ORIG_LIBS" + READLINE_LIBS="" + else + READLINE_LIBS="$vl_cv_lib_readline" + fi + +fi +echo "$as_me:$LINENO: result: $vl_cv_lib_readline" >&5 +echo "${ECHO_T}$vl_cv_lib_readline" >&6 + + if test "$vl_cv_lib_readline" != "no"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_LIBREADLINE 1 +_ACEOF + + + +for ac_header in readline.h readline/readline.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------ ## +## Report this to admin@amule.org ## +## ------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + echo "$as_me:$LINENO: checking whether readline supports history" >&5 +echo $ECHO_N "checking whether readline supports history... $ECHO_C" >&6 +if test "${vl_cv_lib_readline_history+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + vl_cv_lib_readline_history="no" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char add_history (); +int +main () +{ +add_history (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + vl_cv_lib_readline_history="yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +echo "$as_me:$LINENO: result: $vl_cv_lib_readline_history" >&5 +echo "${ECHO_T}$vl_cv_lib_readline_history" >&6 + if test "$vl_cv_lib_readline_history" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_READLINE_HISTORY 1 +_ACEOF + + + +for ac_header in history.h readline/history.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------ ## +## Report this to admin@amule.org ## +## ------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + fi + fi + + LIBS="$ORIG_LIBS" + +fi + +# DO NOT MOVE UP... THERE'S A REASON TO BE HERE!! + + + +# Check whether --with-ccache-prefix or --without-ccache-prefix was given. +if test "${with_ccache_prefix+set}" = set; then + withval="$with_ccache_prefix" + ccache_prefix="$withval" +else + ccache_prefix="" +fi; + + +echo "$as_me:$LINENO: checking whether ccache support should be added" >&5 +echo $ECHO_N "checking whether ccache support should be added... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $ccache" >&5 +echo "${ECHO_T}$ccache" >&6 + + +case "$ccache" in + +yes) + + if test x$ccache_prefix == x ; then + ccache_full=$(which ccache) + ccache_prefix=$(dirname ${ccache_full}) + fi + $ccache_prefix/ccache -V > /dev/null 2>&1 + CCACHE=$? + if test "$CCACHE" != 0; then + result="no" + else + result="yes" + fi + echo "$as_me:$LINENO: checking for ccache presence" >&5 +echo $ECHO_N "checking for ccache presence... $ECHO_C" >&6 + echo "$as_me:$LINENO: result: $result" >&5 +echo "${ECHO_T}$result" >&6 + + + + if [ $CCACHE = 0 ]; then + GCC="$ccache_prefix/ccache $GCC" + CC="$ccache_prefix/ccache $CC" + GXX="$ccache_prefix/ccache $GXX" + CXX="$ccache_prefix/ccache $CXX" + BUILD_CC="$ccache_prefix/ccache $BUILD_CC" + fi +esac + + ac_config_files="$ac_config_files Makefile docs/Makefile docs/man/Makefile intl/Makefile src/Makefile src/kademlia/Makefile src/kademlia/utils/Makefile src/kademlia/kademlia/Makefile src/kademlia/routing/Makefile src/kademlia/net/Makefile src/pixmaps/Makefile src/pixmaps/flags_xpm/Makefile src/libs/Makefile src/libs/ec/Makefile src/libs/ec/cpp/Makefile src/libs/common/Makefile src/utils/Makefile src/utils/aLinkCreator/Makefile src/utils/aLinkCreator/docs/Makefile src/utils/aLinkCreator/src/Makefile src/utils/cas/Makefile src/utils/cas/docs/Makefile src/utils/wxCas/Makefile src/utils/wxCas/docs/Makefile src/utils/wxCas/src/Makefile src/utils/xas/Makefile src/utils/xas/autostart-xas src/utils/xas/docs/Makefile src/skins/Makefile src/webserver/Makefile src/webserver/src/Makefile src/webserver/default/Makefile src/webserver/php-default/Makefile src/webserver/chicane/Makefile unittests/Makefile unittests/muleunit/Makefile unittests/tests/Makefile" + + ac_config_files="$ac_config_files po/Makefile.in Compilation.flags" + +if test x$SYS = xwin32; then + ac_config_files="$ac_config_files version.rc" + +fi + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${WEB_TRUE}" && test -z "${WEB_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"WEB\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"WEB\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${ED2K_TRUE}" && test -z "${ED2K_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"ED2K\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"ED2K\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${CAS_TRUE}" && test -z "${CAS_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"CAS\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"CAS\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${WXCAS_TRUE}" && test -z "${WXCAS_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"WXCAS\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"WXCAS\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${ALC_TRUE}" && test -z "${ALC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"ALC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"ALC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${ALCC_TRUE}" && test -z "${ALCC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"ALCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"ALCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${AMULE_GUI_TRUE}" && test -z "${AMULE_GUI_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"AMULE_GUI\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"AMULE_GUI\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${AMULE_DAEMON_TRUE}" && test -z "${AMULE_DAEMON_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"AMULE_DAEMON\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"AMULE_DAEMON\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${COMPILE_CMD_TRUE}" && test -z "${COMPILE_CMD_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"COMPILE_CMD\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"COMPILE_CMD\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${MONOLITHIC_TRUE}" && test -z "${MONOLITHIC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"MONOLITHIC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"MONOLITHIC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${ENABLE_UPNP_TRUE}" && test -z "${ENABLE_UPNP_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"ENABLE_UPNP\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"ENABLE_UPNP\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${ENABLE_IP2COUNTRY_TRUE}" && test -z "${ENABLE_IP2COUNTRY_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"ENABLE_IP2COUNTRY\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"ENABLE_IP2COUNTRY\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${SYS_WIN32_TRUE}" && test -z "${SYS_WIN32_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"SYS_WIN32\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"SYS_WIN32\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${NEED_RC_TRUE}" && test -z "${NEED_RC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"NEED_RC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"NEED_RC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${NEED_CORESERVICES_TRUE}" && test -z "${NEED_CORESERVICES_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"NEED_CORESERVICES\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"NEED_CORESERVICES\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${COMPILE_NLS_TRUE}" && test -z "${COMPILE_NLS_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"COMPILE_NLS\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"COMPILE_NLS\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${GENERATE_FLEX_HEADER_TRUE}" && test -z "${GENERATE_FLEX_HEADER_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"GENERATE_FLEX_HEADER\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"GENERATE_FLEX_HEADER\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by aMule $as_me SVN, which was +generated by GNU Autoconf 2.59. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +aMule config.status SVN +configured by $0, generated by GNU Autoconf 2.59, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2003 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_shift=: + ;; + -*) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +# +# INIT-COMMANDS section. +# + +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" +# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it + # from automake. + eval 'ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + +level=$denoiselevel + +_ACEOF + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "docs/Makefile" ) CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;; + "docs/man/Makefile" ) CONFIG_FILES="$CONFIG_FILES docs/man/Makefile" ;; + "intl/Makefile" ) CONFIG_FILES="$CONFIG_FILES intl/Makefile" ;; + "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + "src/kademlia/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/kademlia/Makefile" ;; + "src/kademlia/utils/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/kademlia/utils/Makefile" ;; + "src/kademlia/kademlia/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/kademlia/kademlia/Makefile" ;; + "src/kademlia/routing/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/kademlia/routing/Makefile" ;; + "src/kademlia/net/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/kademlia/net/Makefile" ;; + "src/pixmaps/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/pixmaps/Makefile" ;; + "src/pixmaps/flags_xpm/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/pixmaps/flags_xpm/Makefile" ;; + "src/libs/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/libs/Makefile" ;; + "src/libs/ec/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/libs/ec/Makefile" ;; + "src/libs/ec/cpp/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/libs/ec/cpp/Makefile" ;; + "src/libs/common/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/libs/common/Makefile" ;; + "src/utils/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/utils/Makefile" ;; + "src/utils/aLinkCreator/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/utils/aLinkCreator/Makefile" ;; + "src/utils/aLinkCreator/docs/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/utils/aLinkCreator/docs/Makefile" ;; + "src/utils/aLinkCreator/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/utils/aLinkCreator/src/Makefile" ;; + "src/utils/cas/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/utils/cas/Makefile" ;; + "src/utils/cas/docs/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/utils/cas/docs/Makefile" ;; + "src/utils/wxCas/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/utils/wxCas/Makefile" ;; + "src/utils/wxCas/docs/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/utils/wxCas/docs/Makefile" ;; + "src/utils/wxCas/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/utils/wxCas/src/Makefile" ;; + "src/utils/xas/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/utils/xas/Makefile" ;; + "src/utils/xas/autostart-xas" ) CONFIG_FILES="$CONFIG_FILES src/utils/xas/autostart-xas" ;; + "src/utils/xas/docs/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/utils/xas/docs/Makefile" ;; + "src/skins/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/skins/Makefile" ;; + "src/webserver/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/webserver/Makefile" ;; + "src/webserver/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/webserver/src/Makefile" ;; + "src/webserver/default/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/webserver/default/Makefile" ;; + "src/webserver/php-default/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/webserver/php-default/Makefile" ;; + "src/webserver/chicane/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/webserver/chicane/Makefile" ;; + "unittests/Makefile" ) CONFIG_FILES="$CONFIG_FILES unittests/Makefile" ;; + "unittests/muleunit/Makefile" ) CONFIG_FILES="$CONFIG_FILES unittests/muleunit/Makefile" ;; + "unittests/tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES unittests/tests/Makefile" ;; + "po/Makefile.in" ) CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; + "Compilation.flags" ) CONFIG_FILES="$CONFIG_FILES Compilation.flags" ;; + "version.rc" ) CONFIG_FILES="$CONFIG_FILES version.rc" ;; + "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; + "denoiser" ) CONFIG_COMMANDS="$CONFIG_COMMANDS denoiser" ;; + "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@build@,$build,;t t +s,@build_cpu@,$build_cpu,;t t +s,@build_vendor@,$build_vendor,;t t +s,@build_os@,$build_os,;t t +s,@host@,$host,;t t +s,@host_cpu@,$host_cpu,;t t +s,@host_vendor@,$host_vendor,;t t +s,@host_os@,$host_os,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@CYGPATH_W@,$CYGPATH_W,;t t +s,@PACKAGE@,$PACKAGE,;t t +s,@VERSION@,$VERSION,;t t +s,@ACLOCAL@,$ACLOCAL,;t t +s,@AUTOCONF@,$AUTOCONF,;t t +s,@AUTOMAKE@,$AUTOMAKE,;t t +s,@AUTOHEADER@,$AUTOHEADER,;t t +s,@MAKEINFO@,$MAKEINFO,;t t +s,@install_sh@,$install_sh,;t t +s,@STRIP@,$STRIP,;t t +s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t +s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t +s,@mkdir_p@,$mkdir_p,;t t +s,@AWK@,$AWK,;t t +s,@SET_MAKE@,$SET_MAKE,;t t +s,@am__leading_dot@,$am__leading_dot,;t t +s,@AMTAR@,$AMTAR,;t t +s,@am__tar@,$am__tar,;t t +s,@am__untar@,$am__untar,;t t +s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t +s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t +s,@MAINT@,$MAINT,;t t +s,@RESOLV_LIB@,$RESOLV_LIB,;t t +s,@X11LIBS@,$X11LIBS,;t t +s,@CXX@,$CXX,;t t +s,@CXXFLAGS@,$CXXFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CXX@,$ac_ct_CXX,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@DEPDIR@,$DEPDIR,;t t +s,@am__include@,$am__include,;t t +s,@am__quote@,$am__quote,;t t +s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t +s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t +s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t +s,@CXXDEPMODE@,$CXXDEPMODE,;t t +s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t +s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t +s,@CXXCPP@,$CXXCPP,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@CCDEPMODE@,$CCDEPMODE,;t t +s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t +s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t +s,@CPP@,$CPP,;t t +s,@BUILD_CC@,$BUILD_CC,;t t +s,@ac_ct_BUILD_CC@,$ac_ct_BUILD_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@BUILD_EXEEXT@,$BUILD_EXEEXT,;t t +s,@BUILD_CPPFLAGS@,$BUILD_CPPFLAGS,;t t +s,@BUILD_CFLAGS@,$BUILD_CFLAGS,;t t +s,@BUILD_LDFLAGS@,$BUILD_LDFLAGS,;t t +s,@EGREP@,$EGREP,;t t +s,@LEX@,$LEX,;t t +s,@LEXLIB@,$LEXLIB,;t t +s,@LEX_OUTPUT_ROOT@,$LEX_OUTPUT_ROOT,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@YACC@,$YACC,;t t +s,@AR@,$AR,;t t +s,@ac_ct_AR@,$ac_ct_AR,;t t +s,@LD@,$LD,;t t +s,@ac_ct_LD@,$ac_ct_LD,;t t +s,@GDLIB_CONFIG_PATH@,$GDLIB_CONFIG_PATH,;t t +s,@GDLIB_CFLAGS@,$GDLIB_CFLAGS,;t t +s,@GDLIB_LDFLAGS@,$GDLIB_LDFLAGS,;t t +s,@GDLIB_LIBS@,$GDLIB_LIBS,;t t +s,@CAS_DEFS@,$CAS_DEFS,;t t +s,@LIBPNG_CONFIG_PATH@,$LIBPNG_CONFIG_PATH,;t t +s,@LIBPNG_CFLAGS@,$LIBPNG_CFLAGS,;t t +s,@LIBPNG_CXXFLAGS@,$LIBPNG_CXXFLAGS,;t t +s,@LIBPNG_LDFLAGS@,$LIBPNG_LDFLAGS,;t t +s,@LIBPNG_LIBS@,$LIBPNG_LIBS,;t t +s,@AMULEWEB_DEFS@,$AMULEWEB_DEFS,;t t +s,@GEOIP_INCLUDE@,$GEOIP_INCLUDE,;t t +s,@GEOIP_LIB@,$GEOIP_LIB,;t t +s,@WX_CONFIG_PATH@,$WX_CONFIG_PATH,;t t +s,@WX_CPPFLAGS@,$WX_CPPFLAGS,;t t +s,@WX_CFLAGS@,$WX_CFLAGS,;t t +s,@WX_CXXFLAGS@,$WX_CXXFLAGS,;t t +s,@WX_CFLAGS_ONLY@,$WX_CFLAGS_ONLY,;t t +s,@WX_CXXFLAGS_ONLY@,$WX_CXXFLAGS_ONLY,;t t +s,@WX_LIBS@,$WX_LIBS,;t t +s,@WX_LIBS_STATIC@,$WX_LIBS_STATIC,;t t +s,@WX_VERSION_FULL@,$WX_VERSION_FULL,;t t +s,@WX_RESCOMP@,$WX_RESCOMP,;t t +s,@WX_VERSION_MAJOR@,$WX_VERSION_MAJOR,;t t +s,@WX_VERSION_MINOR@,$WX_VERSION_MINOR,;t t +s,@WX_UNICODE@,$WX_UNICODE,;t t +s,@WX_DEBUG@,$WX_DEBUG,;t t +s,@WX_SHARED@,$WX_SHARED,;t t +s,@WX_PORT@,$WX_PORT,;t t +s,@RC@,$RC,;t t +s,@ac_ct_RC@,$ac_ct_RC,;t t +s,@RCFLAGS@,$RCFLAGS,;t t +s,@CRYPTO_PP_PREFIX@,$CRYPTO_PP_PREFIX,;t t +s,@CRYPTO_PP_VERSION_STRING@,$CRYPTO_PP_VERSION_STRING,;t t +s,@CRYPTO_PP_VERSION_NUMBER@,$CRYPTO_PP_VERSION_NUMBER,;t t +s,@CRYPTO_PP_STYLE@,$CRYPTO_PP_STYLE,;t t +s,@CRYPTO_PP_LIB_NAME@,$CRYPTO_PP_LIB_NAME,;t t +s,@CRYPTO_PP_INCLUDE_PREFIX@,$CRYPTO_PP_INCLUDE_PREFIX,;t t +s,@CRYPTO_PP_CXXFLAGS@,$CRYPTO_PP_CXXFLAGS,;t t +s,@CRYPTO_PP_LDFLAGS@,$CRYPTO_PP_LDFLAGS,;t t +s,@CRYPTOLIBS@,$CRYPTOLIBS,;t t +s,@BFD_FLAGS@,$BFD_FLAGS,;t t +s,@BFD_LIB@,$BFD_LIB,;t t +s,@HAVE_GETTEXT@,$HAVE_GETTEXT,;t t +s,@HAVE_FLEX_EXTENDED@,$HAVE_FLEX_EXTENDED,;t t +s,@ALLOCA@,$ALLOCA,;t t +s,@MKINSTALLDIRS@,$MKINSTALLDIRS,;t t +s,@MSGFMT@,$MSGFMT,;t t +s,@GMSGFMT@,$GMSGFMT,;t t +s,@XGETTEXT@,$XGETTEXT,;t t +s,@MSGMERGE@,$MSGMERGE,;t t +s,@GLIBC21@,$GLIBC21,;t t +s,@LIBICONV@,$LIBICONV,;t t +s,@LTLIBICONV@,$LTLIBICONV,;t t +s,@INTLBISON@,$INTLBISON,;t t +s,@USE_NLS@,$USE_NLS,;t t +s,@BUILD_INCLUDED_LIBINTL@,$BUILD_INCLUDED_LIBINTL,;t t +s,@USE_INCLUDED_LIBINTL@,$USE_INCLUDED_LIBINTL,;t t +s,@CATOBJEXT@,$CATOBJEXT,;t t +s,@INTLOBJS@,$INTLOBJS,;t t +s,@DATADIRNAME@,$DATADIRNAME,;t t +s,@INSTOBJEXT@,$INSTOBJEXT,;t t +s,@GENCAT@,$GENCAT,;t t +s,@INTL_LIBTOOL_SUFFIX_PREFIX@,$INTL_LIBTOOL_SUFFIX_PREFIX,;t t +s,@INTLLIBS@,$INTLLIBS,;t t +s,@LIBINTL@,$LIBINTL,;t t +s,@LTLIBINTL@,$LTLIBINTL,;t t +s,@POSUB@,$POSUB,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@POW_LIB@,$POW_LIB,;t t +s,@WXBASE_LIBS@,$WXBASE_LIBS,;t t +s,@WXBASE_CFLAGS@,$WXBASE_CFLAGS,;t t +s,@WXBASE_CXXFLAGS@,$WXBASE_CXXFLAGS,;t t +s,@docdir@,$docdir,;t t +s,@SVNDATE@,$SVNDATE,;t t +s,@AMULE_DAEMON_MANPAGES@,$AMULE_DAEMON_MANPAGES,;t t +s,@AMULECMD_MANPAGES@,$AMULECMD_MANPAGES,;t t +s,@WEB_MANPAGES@,$WEB_MANPAGES,;t t +s,@AMULE_GUI_MANPAGES@,$AMULE_GUI_MANPAGES,;t t +s,@CAS_MANPAGES@,$CAS_MANPAGES,;t t +s,@WXCAS_MANPAGES@,$WXCAS_MANPAGES,;t t +s,@ED2K_MANPAGES@,$ED2K_MANPAGES,;t t +s,@ALC_MANPAGES@,$ALC_MANPAGES,;t t +s,@ALCC_MANPAGES@,$ALCC_MANPAGES,;t t +s,@MONOLITHIC_MANPAGES@,$MONOLITHIC_MANPAGES,;t t +s,@WEB_TRUE@,$WEB_TRUE,;t t +s,@WEB_FALSE@,$WEB_FALSE,;t t +s,@ED2K_TRUE@,$ED2K_TRUE,;t t +s,@ED2K_FALSE@,$ED2K_FALSE,;t t +s,@CAS_TRUE@,$CAS_TRUE,;t t +s,@CAS_FALSE@,$CAS_FALSE,;t t +s,@WXCAS_TRUE@,$WXCAS_TRUE,;t t +s,@WXCAS_FALSE@,$WXCAS_FALSE,;t t +s,@ALC_TRUE@,$ALC_TRUE,;t t +s,@ALC_FALSE@,$ALC_FALSE,;t t +s,@ALCC_TRUE@,$ALCC_TRUE,;t t +s,@ALCC_FALSE@,$ALCC_FALSE,;t t +s,@AMULE_GUI_TRUE@,$AMULE_GUI_TRUE,;t t +s,@AMULE_GUI_FALSE@,$AMULE_GUI_FALSE,;t t +s,@AMULE_DAEMON_TRUE@,$AMULE_DAEMON_TRUE,;t t +s,@AMULE_DAEMON_FALSE@,$AMULE_DAEMON_FALSE,;t t +s,@COMPILE_CMD_TRUE@,$COMPILE_CMD_TRUE,;t t +s,@COMPILE_CMD_FALSE@,$COMPILE_CMD_FALSE,;t t +s,@MONOLITHIC_TRUE@,$MONOLITHIC_TRUE,;t t +s,@MONOLITHIC_FALSE@,$MONOLITHIC_FALSE,;t t +s,@ENABLE_UPNP_TRUE@,$ENABLE_UPNP_TRUE,;t t +s,@ENABLE_UPNP_FALSE@,$ENABLE_UPNP_FALSE,;t t +s,@ENABLE_IP2COUNTRY_TRUE@,$ENABLE_IP2COUNTRY_TRUE,;t t +s,@ENABLE_IP2COUNTRY_FALSE@,$ENABLE_IP2COUNTRY_FALSE,;t t +s,@SYS_WIN32_TRUE@,$SYS_WIN32_TRUE,;t t +s,@SYS_WIN32_FALSE@,$SYS_WIN32_FALSE,;t t +s,@NEED_RC_TRUE@,$NEED_RC_TRUE,;t t +s,@NEED_RC_FALSE@,$NEED_RC_FALSE,;t t +s,@NEED_CORESERVICES_TRUE@,$NEED_CORESERVICES_TRUE,;t t +s,@NEED_CORESERVICES_FALSE@,$NEED_CORESERVICES_FALSE,;t t +s,@COMPILE_NLS_TRUE@,$COMPILE_NLS_TRUE,;t t +s,@COMPILE_NLS_FALSE@,$COMPILE_NLS_FALSE,;t t +s,@GENERATE_FLEX_HEADER_TRUE@,$GENERATE_FLEX_HEADER_TRUE,;t t +s,@GENERATE_FLEX_HEADER_FALSE@,$GENERATE_FLEX_HEADER_FALSE,;t t +s,@READLINE_LIBS@,$READLINE_LIBS,;t t +s,@ccache@,$ccache,;t t +s,@CCACHE@,$CCACHE,;t t +s,@ccache_prefix@,$ccache_prefix,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@abs_srcdir@,$ac_abs_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t +s,@builddir@,$ac_builddir,;t t +s,@abs_builddir@,$ac_abs_builddir,;t t +s,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + +# +# CONFIG_HEADER section. +# + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='[ ].*$,\1#\2' +ac_dC=' ' +ac_dD=',;t' +# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='$,\1#\2define\3' +ac_uC=' ' +ac_uD=',;t' + +for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + # Do quote $f, to prevent DOS paths from being IFS'd. + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + # Remove the trailing spaces. + sed 's/[ ]*$//' $ac_file_inputs >$tmp/in + +_ACEOF + +# Transform confdefs.h into two sed scripts, `conftest.defines' and +# `conftest.undefs', that substitutes the proper values into +# config.h.in to produce config.h. The first handles `#define' +# templates, and the second `#undef' templates. +# And first: Protect against being on the right side of a sed subst in +# config.status. Protect against being in an unquoted here document +# in config.status. +rm -f conftest.defines conftest.undefs +# Using a here document instead of a string reduces the quoting nightmare. +# Putting comments in sed scripts is not portable. +# +# `end' is used to avoid that the second main sed command (meant for +# 0-ary CPP macros) applies to n-ary macro definitions. +# See the Autoconf documentation for `clear'. +cat >confdef2sed.sed <<\_ACEOF +s/[\\&,]/\\&/g +s,[\\$`],\\&,g +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp +t end +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp +: end +_ACEOF +# If some macros were called several times there might be several times +# the same #defines, which is useless. Nevertheless, we may not want to +# sort them, since we want the *last* AC-DEFINE to be honored. +uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines +sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs +rm -f confdef2sed.sed + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >>conftest.undefs <<\_ACEOF +s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, +_ACEOF + +# Break up conftest.defines because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS +echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS +echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS +echo ' :' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.defines >/dev/null +do + # Write a limited-size here document to $tmp/defines.sed. + echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#define' lines. + echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/defines.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail + rm -f conftest.defines + mv conftest.tail conftest.defines +done +rm -f conftest.defines +echo ' fi # grep' >>$CONFIG_STATUS +echo >>$CONFIG_STATUS + +# Break up conftest.undefs because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #undef templates' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.undefs >/dev/null +do + # Write a limited-size here document to $tmp/undefs.sed. + echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#undef' + echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/undefs.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail + rm -f conftest.undefs + mv conftest.tail conftest.undefs +done +rm -f conftest.undefs + +cat >>$CONFIG_STATUS <<\_ACEOF + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + echo "/* Generated by configure. */" >$tmp/config.h + else + echo "/* $ac_file. Generated by configure. */" >$tmp/config.h + fi + cat $tmp/in >>$tmp/config.h + rm -f $tmp/in + if test x"$ac_file" != x-; then + if diff $ac_file $tmp/config.h >/dev/null 2>&1; then + { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + rm -f $ac_file + mv $tmp/config.h $ac_file + fi + else + cat $tmp/config.h + rm -f $tmp/config.h + fi +# Compute $ac_file's index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $ac_file | $ac_file:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || +$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X$ac_file : 'X\(//\)[^/]' \| \ + X$ac_file : 'X\(//\)$' \| \ + X$ac_file : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X$ac_file | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'`/stamp-h$_am_stamp_count +done +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + +# +# CONFIG_COMMANDS section. +# +for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue + ac_dest=`echo "$ac_file" | sed 's,:.*,,'` + ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_dir=`(dirname "$ac_dest") 2>/dev/null || +$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_dest" : 'X\(//\)[^/]' \| \ + X"$ac_dest" : 'X\(//\)$' \| \ + X"$ac_dest" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_dest" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + + { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 +echo "$as_me: executing $ac_dest commands" >&6;} + case $ac_dest in + depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`(dirname "$mf") 2>/dev/null || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`(dirname "$file") 2>/dev/null || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p $dirpart/$fdir + else + as_dir=$dirpart/$fdir + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 +echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} + { (exit 1); exit 1; }; }; } + + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done + ;; + default-1 ) + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + fi + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + GMOFILES= + UPDATEPOFILES= + DUMMYPOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done ;; + denoiser ) if test $level -gt 0; then + if test ! -d src/utils/scripts; then mkdir -p src/utils/scripts; fi + sed -e "1{x;s/.*/1/;x;};/^[ ]*\$/d;/^#if /{/level.*$level/{x;s/^/1/;x;b0;};x;s/^/0/;x;:0;d;};/^#else/{x;/^1/{s/1/0/;b1;};s/0/1/;:1;x;d;};/^#endif/{x;s/.//;x;d;};/^[ ]*#/d;x;/^1/{x;b;};x;d" \ + $srcdir/src/utils/scripts/denoiser.rules > src/utils/scripts/denoiser.sed + for i in `find . -name 'Makefile' -print`; do + if test -n "`head -n 1 $i | grep '^#'`"; then + sed -f src/utils/scripts/denoiser.sed $i > $i.tmp && mv $i.tmp $i + fi + done + fi ;; + esac +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + + +echo +echo +echo " Configure script has finished system check." +echo +echo " Configured aMule ${PACKAGE_VERSION} for '${host}'." +echo +echo " aMule enabled options:" +echo +echo " **** aMule Core ****" +echo " Prefix where aMule should be installed? ${prefix:-none}" +echo " Should aMule be compiled with i18n support? ${HAVE_GETTEXT:-no}" +echo " Should aMule be compiled in debug mode? ${USE_DEBUG:-no}" +echo " Should aMule be compiled with profiling? ${USE_PROFILE:-no}" +echo " Should aMule be compiled with optimizations? ${USE_OPTIMIZE:-no}" +echo " Should aMule be compiled with UPnP support? ${ENABLE_UPNP:-yes}" +echo " Should aMule be compiled with IP2country support? ${ENABLE_IP2COUNTRY:-yes}" +echo " Should aMule monolithic application be built? ${MONOLITHIC:-yes}" +echo " Should aMule daemon version be built? ${AMULE_DAEMON:-no}" +echo " Should aMule remote gui be built? (EXPERIMENTAL) ${AMULE_GUI:-no}" +echo " Crypto++ library/headers style? ${CRYPTO_PP_STYLE:-not found}" + +echo +echo " **** aMule TextClient ****" +echo " Should aMule Command Line Client be built? ${AMULECMD:-no}" +echo +echo " **** aMule WebServer ****" +echo " Should aMule WebServer be built? ${WEB:-no}" +echo +echo " **** aMule ED2K Links Handler ****" +echo " Should aMule ED2K Links Handler be built? ${ED2K:-yes}" +echo +echo " **** aMuleLinkCreator ****" +echo " Should aMuleLinkCreator GUI version (alc) be built? ${ALC:-no}" +echo " Should aMuleLinkCreator for console (alcc) be built? ${ALCC:-no}" +echo +echo " **** aMule Statistics ****" +echo " Should C aMule Statistics (CAS) be built? ${CAS:-no}" +echo " Should aMule GUI Statistics (wxCas) be built? ${WXCAS:-no}" + +echo +echo " **** General Libraries and Tools ****" +echo " Should ccache support be enabled? ${ccache:-no}" +echo " Libraries aMule will use to build:" +wxinfo="$WX_PORT" +if test $WX_DEBUG -eq 1; then + wxinfo="$wxinfo,debug" +fi + +if test $WX_SHARED -eq 1; then + wxinfo="$wxinfo,shared" +else + wxinfo="$wxinfo,static" +fi + +echo " wxWidgets ${WX_VERSION_FULL} ($wxinfo)" +echo " crypto++ ${CRYPTO_PP_VERSION_STRING} (${CRYPTO_PP_STYLE})" +if test x$LIBPNG_VERSION != xnot_needed; then +echo " libpng ${LIBPNG_VERSION:-Not detected}" +fi +if test x$GDLIB_VERSION != xnot_needed; then +echo " libgd ${GDLIB_VERSION:-Not detected}" +fi +echo " zlib ${ZLIB_VERSION:-Not detected}" +if test x"$LIBPNG_VERSION" = x""; then +echo "" +echo "" +echo " WARNING! libpng >= 1.2.0 not found." +echo " amuleweb will be compiled but file download progress bar images will NOT be generated." +echo "" +fi diff --git a/configure.in b/configure.in new file mode 100644 index 00000000..bae1b140 --- /dev/null +++ b/configure.in @@ -0,0 +1,800 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_INIT([aMule],[SVN],[admin@amule.org]) +AC_CANONICAL_HOST +AM_INIT_AUTOMAKE + +AC_CONFIG_SRCDIR([src/amule.cpp]) +AM_CONFIG_HEADER([config.h]) +AM_MAINTAINER_MODE + +# Removing -fomit since it causes problems with CryptoPP +CFLAGS="`echo $CFLAGS | sed "s/-fomit-frame-pointer//g"`" +CXXFLAGS="`echo $CXXFLAGS | sed "s/-fomit-frame-pointer//g"`" + +# System detection, need AC_CANONICAL_HOST +case "${host_os}" in +"") + SYS=unknown + ;; +darwin*) + SYS=darwin + CFLAGS="${CFLAGS} -no-cpp-precomp -D_INTL_REDIRECT_MACROS -DNOPCH"; + LDFLAGS="$LDFLAGS -bind_at_load" + touch src/Scanner.cpp + ;; +openbsd*) + SYS=openbsd + LIBS="$LIBS -L/usr/local/lib" + X11LIBS="-lX11 -L/usr/X11R6/lib" + CXXFLAGS=" $CXXFLAGS -D__OPENBSD__" + if test "$DEBUG_FLAGS" != ""; then + DEBUG_FLAGS="-Wall -g -fno-inline -D__DEBUG__" + fi + ;; +*cygwin* | *mingw32*) + SYS=win32 + CFLAGS="$CFLAGS -DNOMINMAX" + CXXFLAGS="$CXXFLAGS -DNOMINMAX" + ;; +solaris*) + RESOLV_LIB="-lresolv -lnsl" + X11LIBS="-lX11" + LIBS="$LIBS -lrt" +esac + +AC_SUBST(RESOLV_LIB) +AC_SUBST(X11LIBS) + +# Checks for programs. +AC_PROG_CXX +AC_PROG_CXXCPP +AC_PROG_CC +AC_PROG_CPP +AC_PROG_AWK +AS_IF([test "$cross_compiling" = yes], [AC_PROG_BUILD_CC], [BUILD_CC="$CC" ; BUILD_EXEEXT=$EXEEXT]) +AC_PROG_EGREP +AC_PROG_MAKE_SET +AC_PROG_LEX +AC_PROG_INSTALL +AC_PROG_RANLIB +AC_PROG_YACC + +# Find the right ranlib, even when cross-compiling +# And for some other tools for cross compilation +AC_CHECK_TOOL(RANLIB, ranlib) +AC_CHECK_TOOL(STRIP, strip) +AC_CHECK_TOOL(AR, ar) +AC_CHECK_TOOL(LD, ld) + +# +# Add args to configure +# +AC_ARG_ENABLE( + [ccache], + [AS_HELP_STRING( + [--enable-ccache], + [enable ccache support for fast recompilation])], + [ccache=$enableval], [ccache=no]) + +AC_ARG_ENABLE( + [debug], + [AS_HELP_STRING( + [--disable-debug], + [disable additional debugging output])], + [USE_DEBUG=$enableval], [USE_DEBUG=yes]) + +AC_ARG_ENABLE( + [optimize], + [AS_HELP_STRING( + [--enable-optimize], + [enable code optimizing])], + [USE_OPTIMIZE=$enableval], [USE_OPTIMIZE=no]) + +AC_ARG_ENABLE( + [profile], + [AS_HELP_STRING( + [--enable-profile], + [enable code profiling])], + [USE_PROFILE=$enableval], [USE_PROFILE=no]) + +AC_ARG_ENABLE( + [static], + [AS_HELP_STRING( + [--enable-static], + [produce a statically linked executable])], + [USE_DEBUG_STATIC=$enableval], [USE_DEBUG_STATIC=no]) + +AC_ARG_ENABLE( + [monolithic], + [AS_HELP_STRING( + [--disable-monolithic], + [disable building of the monolithic aMule app])], + [MONOLITHIC=$enableval], [MONOLITHIC=yes]) + +AC_ARG_ENABLE( + [amule-daemon], + [AS_HELP_STRING( + [--enable-amule-daemon], + [compile aMule daemon version])], + [AMULE_DAEMON=$enableval], [AMULE_DAEMON=no]) + +AC_ARG_ENABLE( + [amulecmd], + [AS_HELP_STRING( + [--enable-amulecmd], + [compile aMule command line client])], + [AMULECMD=$enableval], [AMULECMD=no]) + +AC_ARG_ENABLE( + [webserver], + [AS_HELP_STRING( + [--enable-webserver], + [compile aMule WebServer])], + [WEB=$enableval], [WEB=no]) + +AC_ARG_ENABLE( + [amule-gui], + [AS_HELP_STRING( + [--enable-amule-gui], + [compile aMule remote GUI (EXPERIMENTAL)])], + [AMULE_GUI=$enableval], [AMULE_GUI=no]) + +AC_ARG_ENABLE( + [cas], + [AS_HELP_STRING( + [--enable-cas], + [compile C aMule Statistics])], + [CAS=$enableval], [CAS=no]) + +AC_ARG_ENABLE( + [wxcas], + [AS_HELP_STRING( + [--enable-wxcas], + [compile aMule GUI Statistics])], + [WXCAS=$enableval], [WXCAS=no]) + +AC_ARG_ENABLE( + [ed2k], + [AS_HELP_STRING( + [--disable-ed2k], + [don't compile aMule ed2k links handler])], + [ED2K=$enableval], [ED2K=yes]) + +AC_ARG_ENABLE( + [alc], + [AS_HELP_STRING( + [--enable-alc], + [compile aMuleLinkCreator GUI version])], + [ALC=$enableval], [ALC=no]) + +AC_ARG_ENABLE( + [alcc], + [AS_HELP_STRING( + [--enable-alcc], + [compile aMuleLinkCreator for console])], + [ALCC=$enableval], [ALCC=no]) + +AC_ARG_ENABLE( + [monolithic], + [AS_HELP_STRING( + [--disable-monolithic], + [disable building of the monolithic aMule app])], + [MONOLITHIC=$enableval], [MONOLITHIC=yes]) + +AC_ARG_ENABLE( + [upnp], + [AS_HELP_STRING( + [--disable-upnp], + [do not compile UPnP code])], + [ENABLE_UPNP=$enableval], [ENABLE_UPNP=yes]) + +AC_ARG_ENABLE( + [geoip], + [AS_HELP_STRING( + [--enable-geoip], + [compile with GeoIP IP2Country library])], + [ENABLE_IP2COUNTRY=$enableval], [ENABLE_IP2COUNTRY=no]) + +AC_ARG_WITH( + [geoip-headers], + AS_HELP_STRING([--with-geoip-headers=DIR], + [GeoIP include files location]), + [GEOIP_INCLUDE="-I$withval"]) + +AC_ARG_WITH( + [geoip-lib], + AS_HELP_STRING([--with-geoip-lib=DIR], + [GeoIP library location]), + [GEOIP_LIB="-L$withval $GEOIP_LIB"]) + +AC_ARG_WITH( + [geoip-static], + AS_HELP_STRING([--with-geoip-static], + [Explicitly link GeoIP statically (default=no)]), + [if test "$withval" != "no"; then + GEOIP_LIB="-Wl,-Bstatic $GEOIP_LIB -Wl,-Bdynamic" + fi]) + +AC_ARG_WITH( + [denoise-level], + [AS_HELP_STRING( + [--with-denoise-level=], + [Specifies denoising level (0-4):]) +AS_HELP_STRING([], [0 - Do nothing]) +AS_HELP_STRING([], [4 - Suppress all normal output]) +AS_HELP_STRING([], [(for more information see src/utils/scripts/denoiser.rules)]) + ], + [denoiselevel="$withval"], [denoiselevel=yes]) + +dnl Default is yes, because they're most likely compatible. +dnl However, this is only used when cross-compiling. +AC_ARG_WITH( + [gnu-malloc], + [AS_HELP_STRING([--without-gnu-malloc], + [Don't assume that we use GNU libc compatible malloc/realloc when cross-compiling])], + [gnumalloc=$withval], [gnumalloc=yes]) + +AC_ARG_WITH( + [language], + [AS_HELP_STRING([--with-language=], + [Specify a comma-separated list of languages you want to have installed. See po/LINGUAS for available languages])], + [LINGUAS="`echo $withval | sed -e 's/,/ /g'`"]) + +# Checking for libs before all other stuff to break +# configure as soon as possible in case of a missing one +# to avoid losing too much time + +# Sets gettext version. +AM_GNU_GETTEXT_VERSION(0.11.5) + +# Check for zlib +AC_OPTIONS_ZLIB +AC_CHECK_ZLIB([1.1.4], , [AC_MSG_ERROR([zlib >= 1.1.4 is required for aMule])]) + +if test x$CAS = xyes -o x$WEB = xyes; then +# Check for gd +AM_OPTIONS_GDLIBCONFIG +AM_PATH_GDLIBCONFIG([2.0.0], +[ + CAS_DEFS="-D__GD__" + GDLIB_LIBS="-lgd $GDLIB_LIBS" +], [ + AC_MSG_NOTICE([ + WARNING: gd-lib >= 2.0.0, or a functional gd.h (from gd-devel) not found. + Please check that gdlib-config is in your default path, check out + LD_LIBRARY_PATH or equivalent variable. + Or this might also be that your gdlib-config has other name. + Please try again with --with-gdlib-config=/usr/bin/gdlib-config + (replace /usr/bin/gdlib-config with a valid path to your gdlib-config). + If you use compiled packages check if you have devel pack installed. + To download the latest version check http://www.boutell.com/gd + for sources. + ]) + CAS_DEFS="" +]) + +else + CAS_DEFS="" + GDLIB_LIBS="" + GDLIB_CFLAGS="" + GDLIB_LDFLAGS="" + GDLIB_VERSION="not_needed" +fi + +AC_SUBST(CAS_DEFS) + + +if test x$WEB = xyes; then +# Check for libpng +AM_OPTIONS_LIBPNGCONFIG +AM_PATH_LIBPNGCONFIG([1.2.0], [AMULEWEB_DEFS="-DWITH_LIBPNG"], +[ + AC_MSG_NOTICE([ + WARNING: libpng-devel >= 1.2.0 is needed for amuleweb + ]) + AMULEWEB_DEFS="" +]) + +else + AMULEWEB_DEFS="" + LIBPNG_LIBS="" + LIBPNG_CFLAGS="" + LIBPNG_CXXFLAGS="" + LIBPNG_LDFLAGS="" + LIBPNG_VERSION="not_needed" +fi + +AC_SUBST(AMULEWEB_DEFS) + + +# Check for perl File::Copy +AC_MSG_CHECKING([for File::Copy]) + if perl -e "require File::Copy" 2>/dev/null; then + AC_MSG_RESULT([ok]) + else + AC_MSG_ERROR([File::Copy perl module is required]) + fi + + +# Check if we need the GUI +AC_MSG_CHECKING([whether we need the GUI]) +AS_IF([test x$MONOLITHIC = xyes], [need_gui=yes]) +AS_IF([test x$WXCAS = xyes], [need_gui=yes]) +AS_IF([test x$ALC = xyes], [need_gui=yes]) +AS_IF([test x$AMULE_GUI = xyes], [need_gui=yes]) +AS_IF([test ${need_gui:+set} != xset], [need_gui=no]) +AC_MSG_RESULT($need_gui) + + +# Check for GeoIP (required for IP2Country capability) +if test x"$ENABLE_IP2COUNTRY" = x"yes" ; then + GEOIP_LIB="-lGeoIP" + CXXFLAGS="$CXXFLAGS $GEOIP_INCLUDE" + LIBS="$LIBS $GEOIP_LIB" + AC_CHECK_HEADER(GeoIP.h,, + [AC_MSG_ERROR([--enable-geoip passed to configure, but the GeoIP header files were not found])]) + AC_CHECK_LIB(GeoIP, GeoIP_open, + [AC_DEFINE(SUPPORT_GEOIP, 1, Define if you want GeoIP support.)], + [AC_MSG_ERROR([--enable-geoip passed to configure, but the GeoIP libraries were not found])]) +fi +AC_SUBST(GEOIP_INCLUDE) +AC_SUBST(GEOIP_LIB) + + +# Check if the compiler is broken, wrt. exceptions. +CHECK_EXCEPTIONS + +# Check for wx +WX_CONFIG_OPTIONS +WX_STANDARD_OPTIONS([toolkit,wxshared,wxdebug,wxversion]) +# Force using a static wxWidgets library if the executable is to be linked statically. +AS_IF([test "$USE_DEBUG_STATIC" = "yes"], [WX_SHARED=0]) +# Force using a unicode build of the library +WX_UNICODE=1 +DEBUG=$WX_DEBUG +WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS +WX_CONFIG_CHECK([2.8.0], [wxWin=1],,, [$WXCONFIG_FLAGS]) +if test "$wxWin" != 1; then + AC_MSG_ERROR([ + wxWidgets must be installed on your system but wx-config + script couldn't be found. Please check that wx-config is + in path or specified by --with-wx-config=path flag, the + directory where wxWidgets libraries are installed (returned + by 'wx-config --libs' command) is in LD_LIBRARY_PATH or + equivalent variable and wxWidgets version is 2.8.0 or above. + ]) +fi +WX_DETECT_STANDARD_OPTION_VALUES +AM_WXCONFIG_LARGEFILE + +dnl Get flags for windres +if test x$SYS = xwin32; then + AC_CHECK_TOOL([RC], [windres], [:]) + AC_ARG_VAR([RC], [Win32 Resource Compiler]) + RCFLAGS=`$WX_CONFIG_WITH_ARGS --cflags | $AWK ['{ for (i = 1; i <= NF; i++) if (index($i, "-I") != 1 && index($i, "-D") != 1) $i = ""; print }']` +else + RCFLAGS="" +fi +AC_SUBST(RCFLAGS) + +# Check for Crypto++ +AM_OPTIONS_CRYPTO + +CHECK_CRYPTO(5.1) + +CXXFLAGS="$CXXFLAGS $CRYPTO_PP_CXXFLAGS" +LDFLAGS="$LDFLAGS $CRYPTO_PP_LDFLAGS" +CRYPTOLIBS="-l$CRYPTO_PP_LIB_NAME" + +case "$CRYPTO_PP_STYLE" in + gentoo_debian | installed | sources) + ;; + *) AC_MSG_ERROR([ + WARNING: crypto++ >= $min_crypto_version is not found. + Please check that cryptopp-headers are in your default include path, + check out LD_LIBRARY_PATH or equivalent variable. + Or this might also be that your cryptopp is installed on other path. + Please try again with --with-crypto-prefix=/my_crypto_prefix + (replace /my_crypto_prefix with a valid path to your crypto directory). + To download the latest version check http://www.cryptopp.com for sources. + ]) + ;; +esac + +# Check for CryptoPP >= 5.5 +if test $CRYPTO_PP_VERSION_NUMBER -ge "5005000"; then + CXXFLAGS="$CXXFLAGS -D__WEAK_CRYPTO__" +fi + + +AC_SUBST(CRYPTOLIBS) + +# Check for bfd.h (to have proper backtraces without using wxExecute) +CHECK_BFD + +# Ok, we have all needed libs, now checking for other stuff +CHECK_AUTOPOINT + +if test "$LEX" = "flex"; then + CHECK_FLEX_EXTENDED +else + HAVE_FLEX_EXTENDED=no +fi + +# Flush standard test results for speeding cache +AC_CACHE_SAVE + +dnl ------------------------------------------------------------------------------- +dnl Start of autoscan stuff +dnl ------------------------------------------------------------------------------- +# Checks for header files. +AC_PATH_X +AC_FUNC_ALLOCA +AC_HEADER_DIRENT +AC_HEADER_STDC +AC_CHECK_HEADERS([argz.h arpa/inet.h fcntl.h inttypes.h langinfo.h libintl.h limits.h locale.h malloc.h mntent.h netdb.h netinet/in.h stddef.h nl_types.h stdint.h stdio_ext.h stdlib.h string.h strings.h sys/ioctl.h sys/mount.h sys/param.h sys/resource.h sys/select.h sys/socket.h sys/statvfs.h sys/time.h sys/timeb.h sys/types.h unistd.h]) +AC_HEADER_SYS_WAIT + +# Checks for typedefs, structures, and compiler characteristics. +AC_HEADER_STDBOOL +AC_C_CONST +AC_C_INLINE +AC_TYPE_MODE_T +AC_TYPE_OFF_T +AC_TYPE_SIZE_T +AC_HEADER_TIME +AC_STRUCT_TM +AC_TYPE_UID_T +AC_C_VOLATILE +AC_CHECK_TYPES([ptrdiff_t]) + +# Checks for library functions. +AC_FUNC_CLOSEDIR_VOID +AM_GNU_GETTEXT +AC_FUNC_GETMNTENT +AC_PROG_GCC_TRADITIONAL +AC_FUNC_FORK +if test x$SYS != xwin32; then +AC_FUNC_LSTAT +AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK +fi +AC_FUNC_MEMCMP +AC_FUNC_MMAP +AC_FUNC_SELECT_ARGTYPES +AC_FUNC_SETVBUF_REVERSED +AC_TYPE_SIGNAL +AC_FUNC_STAT +AC_FUNC_STRFTIME +AC_FUNC_STRTOD +AC_FUNC_VPRINTF +dnl Some other functions that worth checking deeper: +dnl AC_FUNC_CLOSEDIR_VOID +dnl AC_FUNC_MEMCMP +dnl AC_FUNC_MMAP +dnl AC_FUNC_STAT +dnl AC_FUNC_STRTOD +dnl AC_FUNC_SETVBUF_REVERSED +dnl Anyways, do we actually USE them? +if test $cross_compiling = yes -a $gnumalloc = yes ; then + AC_MSG_WARN([ + configure cannot check whether malloc() and realloc() are GNU libc + compatible. You have to be ABSOLUTELY sure that they are, otherwise + run configure with the --without-gnu-malloc switch.]) + ac_cv_func_malloc_0_nonnull=yes + ac_cv_func_realloc_0_nonnull=yes +fi +AC_FUNC_MALLOC +AC_FUNC_REALLOC +AC_CHECK_FUNCS([__argz_count __argz_next __argz_stringify endpwent floor ftruncate getcwd gethostbyaddr gethostbyname gethostname getmntent getmntinfo getpass gettimeofday inet_ntoa localeconv memmove mempcpy memset munmap nl_langinfo pow select setlocale socket sqrt stpcpy strcasecmp strchr strcspn strdup strerror strncasecmp strstr strtoul]) +#------------------------------------------------------------------------------- +# End of autoscan stuff +#------------------------------------------------------------------------------- + +dnl +dnl autoscan has missed these ones. Maybe because it's win32 stuff? +dnl +AC_CHECK_FUNCS([mkdir getrlimit setrlimit]) + +# Flush standard test results for speeding cache +AC_CACHE_SAVE + +# Other tests + +case "$USE_DEBUG" in +yes) DEBUG_FLAGS="-g -D__DEBUG__ -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC" + AS_IF([test x$GCC = xyes], [DEBUG_FLAGS="$DEBUG_FLAGS -W -Wall -Wshadow -Wundef -ggdb -fno-inline -fmessage-length=0"]) + AS_IF([test x$SYS = xwin32], [RCFLAGS="$RCFLAGS -D__DEBUG__"]) + ;; +*) DEBUG_FLAGS="" + AS_IF([test x$GCC = xyes], [DEBUG_FLAGS="$DEBUG_FLAGS -W -Wall -Wshadow -Wundef"]) + ;; +esac + +#aMule options + +# Command line tools +case "$AMULECMD" in +yes) ;; +*) AMULECMD="no" + ;; +esac + +# For proper compilation flags + +WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs adv,core,net` + +WXBASE_LIBS=`$WX_CONFIG_WITH_ARGS --libs net` +WXBASE_CXXFLAGS="$WX_CXXFLAGS -DwxUSE_GUI=0" +WXBASE_CFLAGS="$WX_CFLAGS -DwxUSE_GUI=0" + +WX_CFLAGS="`echo $WX_CFLAGS | sed "s#-I/#-isystem /#g"`" +WX_CXXFLAGS="`echo $WX_CXXFLAGS | sed "s#-I/#-isystem /#g"`" +WXBASE_CFLAGS="`echo $WXBASE_CFLAGS | sed "s#-I/#-isystem /#g"`" +WXBASE_CXXFLAGS="`echo $WXBASE_CXXFLAGS | sed "s#-I/#-isystem /#g"`" + +AC_SUBST(WXBASE_LIBS) +AC_SUBST(WXBASE_CFLAGS) +AC_SUBST(WXBASE_CXXFLAGS) + +case "$USE_OPTIMIZE" in +yes) OPTIMIZE_FLAGS="-O2" + ;; +*) OPTIMIZE_FLAGS="" + ;; +esac + +# Profiling +case "$USE_PROFILE" in +yes) PROFILE_FLAGS="-pg" + ;; +*) PROFILE_FLAGS="" + ;; +esac + +AC_MSG_CHECKING([if the applications should be statically linked]) +case "$USE_DEBUG_STATIC" in +yes) LDFLAGS="$LDFLAGS -static" + ;; +esac +AC_MSG_RESULT($USE_DEBUG_STATIC) + +# autoconf >= 2.60 already defines ${docdir}, but we always need it. +AC_MSG_CHECKING([for docdir]) +if test x"$docdir" = x; then + docdir="$datadir"/doc/"$PACKAGE_NAME"-"$PACKAGE_VERSION" + AC_SUBST(docdir) +fi +AC_MSG_RESULT($docdir) + +# Try to set the SVN checkout-date +AC_MSG_CHECKING([for SVNDATE]) +if test -f "$srcdir/SVNDATE" # SVNDATE for tarballs +then + svndate=`cat $srcdir/SVNDATE` +elif test -d $srcdir/.svn # SVNDATE for svn +then + svndate="rev. `svnversion $srcdir | sed -e 's/[[0-9]][[0-9]]*:\(.*\)/\1/' -e 's/\([[0-9]][[0-9]]*\).*/\1/'`" +fi +AC_MSG_RESULT(${svndate:-None required}) +test "$svndate" && AC_DEFINE_UNQUOTED(SVNDATE, "$svndate", [The checkout date or svn revision number.]) +test x$SYS = xwin32 && test "$svndate" && RCFLAGS="$RCFLAGS -D__PRERELEASE__" +SVNDATE="$svndate" +AC_SUBST(SVNDATE) + +XRCFLAGS="-Isrc" +CXXFLAGS="$CXXFLAGS $DEBUG_FLAGS $OPTIMIZE_FLAGS $PROFILE_FLAGS -DUSE_WX_EXTENSIONS" +CFLAGS="$CFLAGS $DEBUG_FLAGS $OPTIMIZE_FLAGS $PROFILE_FLAGS -DUSE_WX_EXTENSIONS" + +LDFLAGS="$LDFLAGS $PROFILE_FLAGS" +dnl -lpthread is needed by Debian but FreeBSD < 5 doesnt support it +if test x$SYS != xwin32; then + AC_MSG_CHECKING([if this is a FreeBSD 4 or earlier system]) + if test x"`uname -s`" = xFreeBSD && test 0`uname -r | cut -c 1` -lt 5; then + LDFLAGS="$LDFLAGS -pthread" + AC_MSG_RESULT(yes) + else + LDFLAGS="$LDFLAGS -lpthread" + AC_MSG_RESULT(no) + fi +fi + +case "$USE_NLS" in + +yes) + AC_MSG_CHECKING([for requested languages]) + Generate_Langs=`echo $LINGUAS | $AWK ['OFS="\\\\|" { for (i = 1; i <= NF; ++i) $i = "\\\\." $i; print }']` + GENERATE_MANS_TO_INSTALL(AMULE_DAEMON, docs/man/amuled) + GENERATE_MANS_TO_INSTALL(AMULECMD, docs/man/amulecmd) + GENERATE_MANS_TO_INSTALL(WEB, docs/man/amuleweb) + GENERATE_MANS_TO_INSTALL(AMULE_GUI, docs/man/amulegui) + GENERATE_MANS_TO_INSTALL(CAS, src/utils/cas/docs/cas) + GENERATE_MANS_TO_INSTALL(WXCAS, src/utils/wxCas/docs/wxcas) + GENERATE_MANS_TO_INSTALL(ED2K, docs/man/ed2k) + GENERATE_MANS_TO_INSTALL(ALC, src/utils/aLinkCreator/docs/alc) + GENERATE_MANS_TO_INSTALL(ALCC, src/utils/aLinkCreator/docs/alcc) + GENERATE_MANS_TO_INSTALL(MONOLITHIC, docs/man/amule) + AC_MSG_RESULT([${LINGUAS:-all}]) + ;; +*) + HAVE_GETTEXT="no" +esac + +dnl +dnl Denoiser +dnl +AC_MSG_CHECKING([denoising level]) +AS_IF([test "$denoiselevel" = "yes"], [denoiselevel=5])dnl +AS_IF([test "$denoiselevel" = "no"], [denoiselevel=0])dnl +AS_IF([test $denoiselevel -gt 4], [AS_IF([test "${svndate:+set}" = "set"], [denoiselevel=0], [denoiselevel=4])])dnl +AC_MSG_RESULT($denoiselevel) + +AC_CONFIG_COMMANDS(denoiser, [[ if test $level -gt 0; then + if test ! -d src/utils/scripts; then mkdir -p src/utils/scripts; fi + sed -e "1{x;s/.*/1/;x;};/^[ ]*\$/d;/^#if /{/level.*$level/{x;s/^/1/;x;b0;};x;s/^/0/;x;:0;d;};/^#else/{x;/^1/{s/1/0/;b1;};s/0/1/;:1;x;d;};/^#endif/{x;s/.//;x;d;};/^[ ]*#/d;x;/^1/{x;b;};x;d" \ + $srcdir/src/utils/scripts/denoiser.rules > src/utils/scripts/denoiser.sed + for i in `find . -name 'Makefile' -print`; do + if test -n "`head -n 1 $i | grep '^#'`"; then + sed -f src/utils/scripts/denoiser.sed $i > $i.tmp && mv $i.tmp $i + fi + done + fi]], [level=$denoiselevel]) + + +AM_CONDITIONAL(WEB, test x$WEB = xyes) +AM_CONDITIONAL(ED2K, test x$ED2K = xyes) +AM_CONDITIONAL(CAS, test x$CAS = xyes) +AM_CONDITIONAL(WXCAS, test x$WXCAS = xyes) +AM_CONDITIONAL(ALC, test x$ALC = xyes) +AM_CONDITIONAL(ALCC, test x$ALCC = xyes) +AM_CONDITIONAL(AMULE_GUI, test x$AMULE_GUI = xyes) +AM_CONDITIONAL(AMULE_DAEMON, test x$AMULE_DAEMON = xyes) +AM_CONDITIONAL(COMPILE_CMD, test x$AMULECMD = xyes) +AM_CONDITIONAL(MONOLITHIC, test x$MONOLITHIC = xyes) +AM_CONDITIONAL(ENABLE_UPNP, test x$ENABLE_UPNP = xyes -a x$SYS != xwin32) +AM_CONDITIONAL(ENABLE_IP2COUNTRY, test x$ENABLE_IP2COUNTRY = xyes) +AM_CONDITIONAL(SYS_WIN32, test x$SYS = xwin32) +AM_CONDITIONAL(NEED_RC, test x$SYS = xwin32 -a "$RC" != ":") +AM_CONDITIONAL(NEED_CORESERVICES, test x$SYS = xdarwin) +AM_CONDITIONAL(COMPILE_NLS, test x$HAVE_GETTEXT = xyes) +AM_CONDITIONAL(GENERATE_FLEX_HEADER, test x$HAVE_FLEX_EXTENDED = xyes) + +dnl +dnl Check for readline library +dnl +if test x$AMULECMD = xyes -o x$WEB = xyes; then + VL_LIB_READLINE +fi + +# DO NOT MOVE UP... THERE'S A REASON TO BE HERE!! + +AM_OPTIONS_CCACHE_PFX + +AC_MSG_CHECKING([whether ccache support should be added]) +AC_MSG_RESULT($ccache) +AC_SUBST(ccache) + +case "$ccache" in + +yes) + CHECK_CCACHE + if [[ $CCACHE = 0 ]]; then + GCC="$ccache_prefix/ccache $GCC" + CC="$ccache_prefix/ccache $CC" + GXX="$ccache_prefix/ccache $GXX" + CXX="$ccache_prefix/ccache $CXX" + BUILD_CC="$ccache_prefix/ccache $BUILD_CC" + fi +esac + +dnl +dnl Generate the Makefiles +dnl +AC_CONFIG_FILES([Makefile + docs/Makefile + docs/man/Makefile + intl/Makefile + src/Makefile + src/kademlia/Makefile + src/kademlia/utils/Makefile + src/kademlia/kademlia/Makefile + src/kademlia/routing/Makefile + src/kademlia/net/Makefile + src/pixmaps/Makefile + src/pixmaps/flags_xpm/Makefile + src/libs/Makefile + src/libs/ec/Makefile + src/libs/ec/cpp/Makefile + src/libs/common/Makefile + src/utils/Makefile + src/utils/aLinkCreator/Makefile + src/utils/aLinkCreator/docs/Makefile + src/utils/aLinkCreator/src/Makefile + src/utils/cas/Makefile + src/utils/cas/docs/Makefile + src/utils/wxCas/Makefile + src/utils/wxCas/docs/Makefile + src/utils/wxCas/src/Makefile + src/utils/xas/Makefile + src/utils/xas/autostart-xas + src/utils/xas/docs/Makefile + src/skins/Makefile + src/webserver/Makefile + src/webserver/src/Makefile + src/webserver/default/Makefile + src/webserver/php-default/Makefile + src/webserver/chicane/Makefile + unittests/Makefile + unittests/muleunit/Makefile + unittests/tests/Makefile]) +dnl +dnl autoscan has missed these, i wonder why... +dnl +AC_CONFIG_FILES([po/Makefile.in + Compilation.flags]) +AS_IF([test x$SYS = xwin32], [AC_CONFIG_FILES([version.rc])]) +AC_OUTPUT + +echo +echo +echo " Configure script has finished system check." +echo +echo " Configured aMule ${PACKAGE_VERSION} for '${host}'." +echo +echo " aMule enabled options:" +echo +echo " **** aMule Core ****" +echo " Prefix where aMule should be installed? ${prefix:-none}" +echo " Should aMule be compiled with i18n support? ${HAVE_GETTEXT:-no}" +echo " Should aMule be compiled in debug mode? ${USE_DEBUG:-no}" +echo " Should aMule be compiled with profiling? ${USE_PROFILE:-no}" +echo " Should aMule be compiled with optimizations? ${USE_OPTIMIZE:-no}" +echo " Should aMule be compiled with UPnP support? ${ENABLE_UPNP:-yes}" +echo " Should aMule be compiled with IP2country support? ${ENABLE_IP2COUNTRY:-yes}" +echo " Should aMule monolithic application be built? ${MONOLITHIC:-yes}" +echo " Should aMule daemon version be built? ${AMULE_DAEMON:-no}" +echo " Should aMule remote gui be built? (EXPERIMENTAL) ${AMULE_GUI:-no}" +echo " Crypto++ library/headers style? ${CRYPTO_PP_STYLE:-not found}" + +echo +echo " **** aMule TextClient ****" +echo " Should aMule Command Line Client be built? ${AMULECMD:-no}" +echo +echo " **** aMule WebServer ****" +echo " Should aMule WebServer be built? ${WEB:-no}" +echo +echo " **** aMule ED2K Links Handler ****" +echo " Should aMule ED2K Links Handler be built? ${ED2K:-yes}" +echo +echo " **** aMuleLinkCreator ****" +echo " Should aMuleLinkCreator GUI version (alc) be built? ${ALC:-no}" +echo " Should aMuleLinkCreator for console (alcc) be built? ${ALCC:-no}" +echo +echo " **** aMule Statistics ****" +echo " Should C aMule Statistics (CAS) be built? ${CAS:-no}" +echo " Should aMule GUI Statistics (wxCas) be built? ${WXCAS:-no}" + +echo +echo " **** General Libraries and Tools ****" +echo " Should ccache support be enabled? ${ccache:-no}" +echo " Libraries aMule will use to build:" +wxinfo="$WX_PORT" +AS_IF([test $WX_DEBUG -eq 1], [wxinfo="$wxinfo,debug"]) +AS_IF([test $WX_SHARED -eq 1], [wxinfo="$wxinfo,shared"], [wxinfo="$wxinfo,static"]) +echo " wxWidgets ${WX_VERSION_FULL} ($wxinfo)" +echo " crypto++ ${CRYPTO_PP_VERSION_STRING} (${CRYPTO_PP_STYLE})" +if test x$LIBPNG_VERSION != xnot_needed; then +echo " libpng ${LIBPNG_VERSION:-Not detected}" +fi +if test x$GDLIB_VERSION != xnot_needed; then +echo " libgd ${GDLIB_VERSION:-Not detected}" +fi +echo " zlib ${ZLIB_VERSION:-Not detected}" +if test x"$LIBPNG_VERSION" = x""; then +echo "" +echo "" +echo " WARNING! libpng >= 1.2.0 not found." +echo " amuleweb will be compiled but file download progress bar images will NOT be generated." +echo "" +fi diff --git a/convert.ico b/convert.ico new file mode 100644 index 0000000000000000000000000000000000000000..a93aa197df3981df9104d9a1ce77db93f65f15ee GIT binary patch literal 1406 zcwUXvKS&!<9Ki9P*GdzS5(FzphK3+XMI6$Cf(YUiky|oJ$QJxl2tvuAgTnIwzs!se}7-H*{qzLoXF+nrCeWM%j4rCcQa@v z&7##r*OeGXLrhbNWwD40cjG=hfY0D@djldzJ#anW4wab@LT*IH-c<$neC<7-i7F@E=J={O!Xj^dd5fb2+lofdw32%#jo%i z+=ox%VLXl}@id;t%XmLNh=0SU@Ca_=dw3D&2Q{5|FYdyJ@G!oCXQhYj_p!9j_B}O` zaiz;b!;np7N={kg#z*i;JcP&aB%Z-b_%J?=&*N+OE^gsPyn;{Qb9fRzz)N@;ui|yw zz)jr3Yc;zjbZOuUSGG^!b9fRzz)N@;ui|xl7@x)$@HKoFx9}of!QJ=>&Lgaa@ED%N zGk6K_!TWF>_u%9BJidwNaOtMHoK#mY)#VbU4@tuai!wJvSy{XvAH=`nQ+NdDT5}IC z;y!#5594t>iKp>AUdBi92yWtBqv!Bb{0hIpgUB+T#xL+XeuqEc&#Y+35;IcFIA%tL z`ma&{x77bV^&h}PcpTrtGk6|9!>hQby#oV};;VQHKg7>*7vjc!cmSWlY#b|T8y`6?09yiV_{1Y@tX6ZUXPv!$8P zTG3jxb4e%uk$5vC(eD572%c!asNpAS?DuDqA4T517x|E&FYq_{lXr{$hrG;b&{N{_ E7Y|XM9smFU literal 0 HcwPel00001 diff --git a/debian/TODO b/debian/TODO new file mode 100644 index 00000000..44d8fb7e --- /dev/null +++ b/debian/TODO @@ -0,0 +1,5 @@ +Make the packages that are ever build chooseable, too. +Make a useable Startscript +Add support for ed2k in the various browsers with debconf +More cleanup +Let the theme for amuleweb be choosen by debconf diff --git a/debian/amule-alc-dbg.dirs b/debian/amule-alc-dbg.dirs new file mode 100644 index 00000000..00ed830c --- /dev/null +++ b/debian/amule-alc-dbg.dirs @@ -0,0 +1,4 @@ +usr/share/lintian/overrides +usr/lib/debug/usr/bin +usr/share/applications +usr/share/doc/amule-alc-dbg diff --git a/debian/amule-alc-dbg.override b/debian/amule-alc-dbg.override new file mode 100644 index 00000000..de4f0d98 --- /dev/null +++ b/debian/amule-alc-dbg.override @@ -0,0 +1 @@ +amule-alc-dbg: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-alc.dirs b/debian/amule-alc.dirs new file mode 100644 index 00000000..d6c4978d --- /dev/null +++ b/debian/amule-alc.dirs @@ -0,0 +1,10 @@ +usr/bin +usr/share/lintian/overrides +usr/share/pixmaps +usr/share/menu +usr/share/man/man1 +usr/share/man/hu/man1 +usr/share/man/eu/man1 +usr/share/man/es/man1 +usr/share/man/de/man1 +usr/share/doc/amule-alc diff --git a/debian/amule-alc.install b/debian/amule-alc.install new file mode 100644 index 00000000..9e847f8e --- /dev/null +++ b/debian/amule-alc.install @@ -0,0 +1,4 @@ +debian/tmp/usr/bin/alc +debian/tmp/usr/share/applications/alc.desktop +debian/tmp/usr/share/pixmaps/alc.xpm + diff --git a/debian/amule-alc.manpages b/debian/amule-alc.manpages new file mode 100644 index 00000000..59873eaf --- /dev/null +++ b/debian/amule-alc.manpages @@ -0,0 +1,5 @@ +src/utils/aLinkCreator/docs/alc.1 +src/utils/aLinkCreator/docs/alc.de.1 +src/utils/aLinkCreator/docs/alc.es.1 +src/utils/aLinkCreator/docs/alc.eu.1 +src/utils/aLinkCreator/docs/alc.hu.1 diff --git a/debian/amule-alc.menu b/debian/amule-alc.menu new file mode 100644 index 00000000..93b839cb --- /dev/null +++ b/debian/amule-alc.menu @@ -0,0 +1,4 @@ +?package(amule-alc):needs="X11" section="Apps/Tools"\ + title="aMule Link Creator" command="/usr/bin/alc"\ + icon="/usr/share/pixmaps/alc.xpm" + diff --git a/debian/amule-alc.override b/debian/amule-alc.override new file mode 100644 index 00000000..e3fb9eb8 --- /dev/null +++ b/debian/amule-alc.override @@ -0,0 +1 @@ +amule-alc: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-alcc-dbg.dirs b/debian/amule-alcc-dbg.dirs new file mode 100644 index 00000000..61df1605 --- /dev/null +++ b/debian/amule-alcc-dbg.dirs @@ -0,0 +1,3 @@ +usr/share/lintian/overrides +usr/lib/debug/usr/bin +usr/share/doc/amule-alcc-dbg diff --git a/debian/amule-alcc-dbg.override b/debian/amule-alcc-dbg.override new file mode 100644 index 00000000..0cfeb6b1 --- /dev/null +++ b/debian/amule-alcc-dbg.override @@ -0,0 +1 @@ +amule-alcc-dbg: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-alcc.dirs b/debian/amule-alcc.dirs new file mode 100644 index 00000000..f8c771b0 --- /dev/null +++ b/debian/amule-alcc.dirs @@ -0,0 +1,9 @@ +usr/bin +usr/share/lintian/overrides +usr/share/man/man1 +usr/share/man/hu/man1 +usr/share/man/fr/man1 +usr/share/man/eu/man1 +usr/share/man/es/man1 +usr/share/man/de/man1 +usr/share/doc/amule-alcc diff --git a/debian/amule-alcc.install b/debian/amule-alcc.install new file mode 100644 index 00000000..2705d444 --- /dev/null +++ b/debian/amule-alcc.install @@ -0,0 +1,2 @@ +debian/tmp/usr/bin/alcc + diff --git a/debian/amule-alcc.manpages b/debian/amule-alcc.manpages new file mode 100644 index 00000000..e10bfdb3 --- /dev/null +++ b/debian/amule-alcc.manpages @@ -0,0 +1,6 @@ +src/utils/aLinkCreator/docs/alcc.1 +src/utils/aLinkCreator/docs/alcc.de.1 +src/utils/aLinkCreator/docs/alcc.es.1 +src/utils/aLinkCreator/docs/alcc.eu.1 +src/utils/aLinkCreator/docs/alcc.fr.1 +src/utils/aLinkCreator/docs/alcc.hu.1 diff --git a/debian/amule-alcc.override b/debian/amule-alcc.override new file mode 100644 index 00000000..67211456 --- /dev/null +++ b/debian/amule-alcc.override @@ -0,0 +1 @@ +amule-alcc: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-cas-dbg.dirs b/debian/amule-cas-dbg.dirs new file mode 100644 index 00000000..2eaa4a2b --- /dev/null +++ b/debian/amule-cas-dbg.dirs @@ -0,0 +1,3 @@ +usr/share/lintian/overrides +usr/lib/debug/usr/bin +usr/share/doc/amule-cas-dbg diff --git a/debian/amule-cas-dbg.override b/debian/amule-cas-dbg.override new file mode 100644 index 00000000..770e2274 --- /dev/null +++ b/debian/amule-cas-dbg.override @@ -0,0 +1 @@ +amule-cas-dbg: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-cas.README.Debian b/debian/amule-cas.README.Debian new file mode 100644 index 00000000..dff8c9a5 --- /dev/null +++ b/debian/amule-cas.README.Debian @@ -0,0 +1,4 @@ +C AMULE STATS (CAS) + +CAS is a little programme, which replace astats. +The generation of webpage is not implemented yet. diff --git a/debian/amule-cas.dirs b/debian/amule-cas.dirs new file mode 100644 index 00000000..27ada745 --- /dev/null +++ b/debian/amule-cas.dirs @@ -0,0 +1,10 @@ +usr/bin +usr/share/pixmap +usr/share/lintian/overrides +usr/share/cas +usr/share/man/man1 +usr/share/man/hu/man1 +usr/share/man/eu/man1 +usr/share/man/es/man1 +usr/share/man/de/man1 +usr/share/doc/amule-cas diff --git a/debian/amule-cas.install b/debian/amule-cas.install new file mode 100644 index 00000000..a606bf7f --- /dev/null +++ b/debian/amule-cas.install @@ -0,0 +1,2 @@ +debian/tmp/usr/bin/cas +debian/tmp/usr/share/cas/ diff --git a/debian/amule-cas.manpages b/debian/amule-cas.manpages new file mode 100644 index 00000000..138459b0 --- /dev/null +++ b/debian/amule-cas.manpages @@ -0,0 +1,6 @@ +src/utils/cas/docs/cas.1 +src/utils/cas/docs/cas.de.1 +src/utils/cas/docs/cas.es.1 +src/utils/cas/docs/cas.eu.1 +src/utils/cas/docs/cas.hu.1 + diff --git a/debian/amule-cas.override b/debian/amule-cas.override new file mode 100644 index 00000000..5cf90f63 --- /dev/null +++ b/debian/amule-cas.override @@ -0,0 +1 @@ +amule-cas: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-cmd-dbg.dirs b/debian/amule-cmd-dbg.dirs new file mode 100644 index 00000000..6b4c9ec3 --- /dev/null +++ b/debian/amule-cmd-dbg.dirs @@ -0,0 +1,3 @@ +usr/share/lintian/overrides +usr/lib/debug/usr/bin +usr/share/doc/amule-cmd-dbg diff --git a/debian/amule-cmd-dbg.override b/debian/amule-cmd-dbg.override new file mode 100644 index 00000000..e24a78e9 --- /dev/null +++ b/debian/amule-cmd-dbg.override @@ -0,0 +1 @@ +amule-cmd-dbg: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-cmd.dirs b/debian/amule-cmd.dirs new file mode 100644 index 00000000..4355963f --- /dev/null +++ b/debian/amule-cmd.dirs @@ -0,0 +1,9 @@ +usr/bin +usr/share/lintian/overrides +usr/share/man/man1 +usr/share/man/hu/man1 +usr/share/man/fr/man1 +usr/share/man/eu/man1 +usr/share/man/es/man1 +usr/share/man/de/man1 +usr/share/doc/amule-cmd diff --git a/debian/amule-cmd.install b/debian/amule-cmd.install new file mode 100644 index 00000000..ffa74fc5 --- /dev/null +++ b/debian/amule-cmd.install @@ -0,0 +1 @@ +debian/tmp/usr/bin/amulecmd diff --git a/debian/amule-cmd.manpages b/debian/amule-cmd.manpages new file mode 100644 index 00000000..43750fb7 --- /dev/null +++ b/debian/amule-cmd.manpages @@ -0,0 +1,7 @@ +docs/man/amulecmd.1 +docs/man/amulecmd.de.1 +docs/man/amulecmd.fr.1 +docs/man/amulecmd.hu.1 +docs/man/amulecmd.es.1 +docs/man/amulecmd.eu.1 + diff --git a/debian/amule-cmd.override b/debian/amule-cmd.override new file mode 100644 index 00000000..5f2861d4 --- /dev/null +++ b/debian/amule-cmd.override @@ -0,0 +1 @@ +amule-cmd: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-common.dirs b/debian/amule-common.dirs new file mode 100644 index 00000000..feff12df --- /dev/null +++ b/debian/amule-common.dirs @@ -0,0 +1,4 @@ +usr/share/pixmaps +usr/share/lintian/overrides +usr/share/doc/aMule-CVS +usr/share/doc/amule-common diff --git a/debian/amule-common.docs b/debian/amule-common.docs new file mode 100644 index 00000000..ba43d49e --- /dev/null +++ b/debian/amule-common.docs @@ -0,0 +1,6 @@ +docs/README +docs/amulesig.txt +docs/AUTHORS +docs/Changelog +docs/TODO +debian/TODO diff --git a/debian/amule-common.install b/debian/amule-common.install new file mode 100644 index 00000000..99c602bc --- /dev/null +++ b/debian/amule-common.install @@ -0,0 +1 @@ +debian/tmp/usr/share/doc/aMule-CVS/ diff --git a/debian/amule-common.override b/debian/amule-common.override new file mode 100644 index 00000000..b77c450e --- /dev/null +++ b/debian/amule-common.override @@ -0,0 +1 @@ +amule-common: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-daemon-dbg.dirs b/debian/amule-daemon-dbg.dirs new file mode 100644 index 00000000..e37441f0 --- /dev/null +++ b/debian/amule-daemon-dbg.dirs @@ -0,0 +1,3 @@ +usr/share/lintian/overrides +usr/lib/debug/usr/bin +usr/share/doc/amule-daemon-dbg diff --git a/debian/amule-daemon-dbg.override b/debian/amule-daemon-dbg.override new file mode 100644 index 00000000..a4db258c --- /dev/null +++ b/debian/amule-daemon-dbg.override @@ -0,0 +1 @@ +amule-daemon-dbg: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-daemon.dirs b/debian/amule-daemon.dirs new file mode 100644 index 00000000..90f93f99 --- /dev/null +++ b/debian/amule-daemon.dirs @@ -0,0 +1,9 @@ +usr/bin +usr/share/lintian/overrides +usr/share/man/man1 +usr/share/man/hu/man1 +usr/share/man/fr/man1 +usr/share/man/eu/man1 +usr/share/man/es/man1 +usr/share/man/de/man1 +usr/share/doc/amule-daemon diff --git a/debian/amule-daemon.install b/debian/amule-daemon.install new file mode 100644 index 00000000..3b763506 --- /dev/null +++ b/debian/amule-daemon.install @@ -0,0 +1,2 @@ +debian/tmp/usr/bin/amuled + diff --git a/debian/amule-daemon.manpages b/debian/amule-daemon.manpages new file mode 100644 index 00000000..5a633eb4 --- /dev/null +++ b/debian/amule-daemon.manpages @@ -0,0 +1,7 @@ +docs/man/amuled.1 +docs/man/amuled.de.1 +docs/man/amuled.es.1 +docs/man/amuled.eu.1 +docs/man/amuled.fr.1 +docs/man/amuled.hu.1 + diff --git a/debian/amule-daemon.override b/debian/amule-daemon.override new file mode 100644 index 00000000..5c88474b --- /dev/null +++ b/debian/amule-daemon.override @@ -0,0 +1 @@ +amule-daemon: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-dbg.dirs b/debian/amule-dbg.dirs new file mode 100644 index 00000000..ab05b4c9 --- /dev/null +++ b/debian/amule-dbg.dirs @@ -0,0 +1,3 @@ +usr/share/lintian/overrides +usr/lib/debug/usr/bin +usr/share/doc/amule-dbg diff --git a/debian/amule-dbg.override b/debian/amule-dbg.override new file mode 100644 index 00000000..d1f4f165 --- /dev/null +++ b/debian/amule-dbg.override @@ -0,0 +1 @@ +amule-dbg: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-ed2k-dbg.dirs b/debian/amule-ed2k-dbg.dirs new file mode 100644 index 00000000..530d908b --- /dev/null +++ b/debian/amule-ed2k-dbg.dirs @@ -0,0 +1,3 @@ +usr/share/lintian/overrides +usr/lib/debug/usr/bin +usr/share/doc/amule-ed2k-dbg diff --git a/debian/amule-ed2k-dbg.override b/debian/amule-ed2k-dbg.override new file mode 100644 index 00000000..f4bd2159 --- /dev/null +++ b/debian/amule-ed2k-dbg.override @@ -0,0 +1 @@ +amule-ed2k-dbg: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-ed2k.dirs b/debian/amule-ed2k.dirs new file mode 100644 index 00000000..e3c526f8 --- /dev/null +++ b/debian/amule-ed2k.dirs @@ -0,0 +1,9 @@ +usr/bin +usr/share/lintian/overrides +usr/share/man/man1 +usr/share/man/hu/man1 +usr/share/man/fr/man1 +usr/share/man/eu/man1 +usr/share/man/es/man1 +usr/share/man/de/man1 +usr/share/doc/amule-ed2k diff --git a/debian/amule-ed2k.docs b/debian/amule-ed2k.docs new file mode 100644 index 00000000..f1595e05 --- /dev/null +++ b/debian/amule-ed2k.docs @@ -0,0 +1 @@ +docs/ED2K-Links.HOWTO diff --git a/debian/amule-ed2k.install b/debian/amule-ed2k.install new file mode 100644 index 00000000..6637bfc3 --- /dev/null +++ b/debian/amule-ed2k.install @@ -0,0 +1 @@ +debian/tmp/usr/bin/ed2k usr/bin diff --git a/debian/amule-ed2k.manpages b/debian/amule-ed2k.manpages new file mode 100644 index 00000000..38afb050 --- /dev/null +++ b/debian/amule-ed2k.manpages @@ -0,0 +1,6 @@ +docs/man/ed2k.1 +docs/man/ed2k.fr.1 +docs/man/ed2k.de.1 +docs/man/ed2k.es.1 +docs/man/ed2k.eu.1 +docs/man/ed2k.hu.1 diff --git a/debian/amule-ed2k.override b/debian/amule-ed2k.override new file mode 100644 index 00000000..ffac1247 --- /dev/null +++ b/debian/amule-ed2k.override @@ -0,0 +1 @@ +amule-ed2k: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-ed2k.preinst b/debian/amule-ed2k.preinst new file mode 100644 index 00000000..5b786d7d --- /dev/null +++ b/debian/amule-ed2k.preinst @@ -0,0 +1,18 @@ +#! /bin/sh + +set +e # yada yada + +DIVERSIONS=`env LC_ALL=C /usr/sbin/dpkg-divert --list | grep -E 'by amule((-ed2k)|(-utils))?$'` + +if [ -n "$DIVERSIONS" ]; then + echo "$DIVERSIONS" | while read diversion of FILE to DIVERTED by PACKAGE; do + dpkg-divert --package "$PACKAGE" --remove "$FILE" + done + + for f in /usr/bin/ed2k* /usr/share/man/man1/ed2k*.1.gz; do + echo "Deleting $f" + rm -f "$f" + done +fi + +#DEBHELPER# diff --git a/debian/amule-i18n-ar.dirs b/debian/amule-i18n-ar.dirs new file mode 100644 index 00000000..49be32f9 --- /dev/null +++ b/debian/amule-i18n-ar.dirs @@ -0,0 +1,3 @@ +usr/share/locale/ar/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-ar diff --git a/debian/amule-i18n-ar.install b/debian/amule-i18n-ar.install new file mode 100644 index 00000000..1cf988a2 --- /dev/null +++ b/debian/amule-i18n-ar.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/ar diff --git a/debian/amule-i18n-ar.override b/debian/amule-i18n-ar.override new file mode 100644 index 00000000..71794fa6 --- /dev/null +++ b/debian/amule-i18n-ar.override @@ -0,0 +1 @@ +amule-i18n-ar: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-bg.dirs b/debian/amule-i18n-bg.dirs new file mode 100644 index 00000000..a256ee90 --- /dev/null +++ b/debian/amule-i18n-bg.dirs @@ -0,0 +1,3 @@ +usr/share/locale/bg/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-bg diff --git a/debian/amule-i18n-bg.install b/debian/amule-i18n-bg.install new file mode 100644 index 00000000..fe4ce770 --- /dev/null +++ b/debian/amule-i18n-bg.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/bg diff --git a/debian/amule-i18n-bg.override b/debian/amule-i18n-bg.override new file mode 100644 index 00000000..548f9205 --- /dev/null +++ b/debian/amule-i18n-bg.override @@ -0,0 +1 @@ +amule-i18n-bg: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-ca.dirs b/debian/amule-i18n-ca.dirs new file mode 100644 index 00000000..47d338d0 --- /dev/null +++ b/debian/amule-i18n-ca.dirs @@ -0,0 +1,3 @@ +usr/share/locale/ca/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-ca diff --git a/debian/amule-i18n-ca.install b/debian/amule-i18n-ca.install new file mode 100644 index 00000000..d348a70d --- /dev/null +++ b/debian/amule-i18n-ca.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/ca diff --git a/debian/amule-i18n-ca.override b/debian/amule-i18n-ca.override new file mode 100644 index 00000000..76e0eed4 --- /dev/null +++ b/debian/amule-i18n-ca.override @@ -0,0 +1 @@ +amule-i18n-ca: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-da.dirs b/debian/amule-i18n-da.dirs new file mode 100644 index 00000000..2888017b --- /dev/null +++ b/debian/amule-i18n-da.dirs @@ -0,0 +1,3 @@ +usr/share/locale/da/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-da diff --git a/debian/amule-i18n-da.install b/debian/amule-i18n-da.install new file mode 100644 index 00000000..ff6873d5 --- /dev/null +++ b/debian/amule-i18n-da.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/da diff --git a/debian/amule-i18n-da.override b/debian/amule-i18n-da.override new file mode 100644 index 00000000..084eb82c --- /dev/null +++ b/debian/amule-i18n-da.override @@ -0,0 +1 @@ +amule-i18n-da: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-de.dirs b/debian/amule-i18n-de.dirs new file mode 100644 index 00000000..a842e3fe --- /dev/null +++ b/debian/amule-i18n-de.dirs @@ -0,0 +1,3 @@ +usr/share/locale/de/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-de diff --git a/debian/amule-i18n-de.install b/debian/amule-i18n-de.install new file mode 100644 index 00000000..7242af19 --- /dev/null +++ b/debian/amule-i18n-de.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/de diff --git a/debian/amule-i18n-de.override b/debian/amule-i18n-de.override new file mode 100644 index 00000000..494ad638 --- /dev/null +++ b/debian/amule-i18n-de.override @@ -0,0 +1 @@ +amule-i18n-de: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-en-gb.dirs b/debian/amule-i18n-en-gb.dirs new file mode 100644 index 00000000..ce30d768 --- /dev/null +++ b/debian/amule-i18n-en-gb.dirs @@ -0,0 +1,3 @@ +usr/share/locale/en_GB/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-en-gb diff --git a/debian/amule-i18n-en-gb.install b/debian/amule-i18n-en-gb.install new file mode 100644 index 00000000..87af412d --- /dev/null +++ b/debian/amule-i18n-en-gb.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/en_GB diff --git a/debian/amule-i18n-en-gb.override b/debian/amule-i18n-en-gb.override new file mode 100644 index 00000000..1f8fe3b5 --- /dev/null +++ b/debian/amule-i18n-en-gb.override @@ -0,0 +1 @@ +amule-i18n-en-gb: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-es.dirs b/debian/amule-i18n-es.dirs new file mode 100644 index 00000000..43366bf2 --- /dev/null +++ b/debian/amule-i18n-es.dirs @@ -0,0 +1,3 @@ +usr/share/locale/es/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-es diff --git a/debian/amule-i18n-es.install b/debian/amule-i18n-es.install new file mode 100644 index 00000000..ce87b2f7 --- /dev/null +++ b/debian/amule-i18n-es.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/es diff --git a/debian/amule-i18n-es.override b/debian/amule-i18n-es.override new file mode 100644 index 00000000..610540ad --- /dev/null +++ b/debian/amule-i18n-es.override @@ -0,0 +1 @@ +amule-i18n-es: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-et-ee.dirs b/debian/amule-i18n-et-ee.dirs new file mode 100644 index 00000000..abe56ca2 --- /dev/null +++ b/debian/amule-i18n-et-ee.dirs @@ -0,0 +1,3 @@ +usr/share/locale/et_EE/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-et-ee diff --git a/debian/amule-i18n-et-ee.install b/debian/amule-i18n-et-ee.install new file mode 100644 index 00000000..421fdc98 --- /dev/null +++ b/debian/amule-i18n-et-ee.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/et_EE diff --git a/debian/amule-i18n-et-ee.override b/debian/amule-i18n-et-ee.override new file mode 100644 index 00000000..d7d3f3d7 --- /dev/null +++ b/debian/amule-i18n-et-ee.override @@ -0,0 +1 @@ +amule-i18n-et-ee: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-eu.dirs b/debian/amule-i18n-eu.dirs new file mode 100644 index 00000000..edbe80c0 --- /dev/null +++ b/debian/amule-i18n-eu.dirs @@ -0,0 +1,3 @@ +usr/share/locale/eu/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-eu diff --git a/debian/amule-i18n-eu.install b/debian/amule-i18n-eu.install new file mode 100644 index 00000000..6fc2d268 --- /dev/null +++ b/debian/amule-i18n-eu.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/eu diff --git a/debian/amule-i18n-eu.override b/debian/amule-i18n-eu.override new file mode 100644 index 00000000..5e186c21 --- /dev/null +++ b/debian/amule-i18n-eu.override @@ -0,0 +1 @@ +amule-i18n-eu: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-fi.dirs b/debian/amule-i18n-fi.dirs new file mode 100644 index 00000000..17d71d07 --- /dev/null +++ b/debian/amule-i18n-fi.dirs @@ -0,0 +1,3 @@ +usr/share/locale/fi/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-fi diff --git a/debian/amule-i18n-fi.install b/debian/amule-i18n-fi.install new file mode 100644 index 00000000..e1df768f --- /dev/null +++ b/debian/amule-i18n-fi.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/fi diff --git a/debian/amule-i18n-fi.override b/debian/amule-i18n-fi.override new file mode 100644 index 00000000..91489701 --- /dev/null +++ b/debian/amule-i18n-fi.override @@ -0,0 +1 @@ +amule-i18n-fi: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-fr.dirs b/debian/amule-i18n-fr.dirs new file mode 100644 index 00000000..ce910f07 --- /dev/null +++ b/debian/amule-i18n-fr.dirs @@ -0,0 +1,3 @@ +usr/share/locale/fr/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-fr diff --git a/debian/amule-i18n-fr.install b/debian/amule-i18n-fr.install new file mode 100644 index 00000000..d5a14d86 --- /dev/null +++ b/debian/amule-i18n-fr.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/fr diff --git a/debian/amule-i18n-fr.override b/debian/amule-i18n-fr.override new file mode 100644 index 00000000..64383a2c --- /dev/null +++ b/debian/amule-i18n-fr.override @@ -0,0 +1 @@ +amule-i18n-fr: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-gl.dirs b/debian/amule-i18n-gl.dirs new file mode 100644 index 00000000..01442721 --- /dev/null +++ b/debian/amule-i18n-gl.dirs @@ -0,0 +1,3 @@ +usr/share/locale/gl/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-gl diff --git a/debian/amule-i18n-gl.install b/debian/amule-i18n-gl.install new file mode 100644 index 00000000..96d25de4 --- /dev/null +++ b/debian/amule-i18n-gl.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/gl diff --git a/debian/amule-i18n-gl.override b/debian/amule-i18n-gl.override new file mode 100644 index 00000000..563fda3e --- /dev/null +++ b/debian/amule-i18n-gl.override @@ -0,0 +1 @@ +amule-i18n-gl: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-hr.dirs b/debian/amule-i18n-hr.dirs new file mode 100644 index 00000000..00680cfa --- /dev/null +++ b/debian/amule-i18n-hr.dirs @@ -0,0 +1,3 @@ +usr/share/locale/hr/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-hr diff --git a/debian/amule-i18n-hr.install b/debian/amule-i18n-hr.install new file mode 100644 index 00000000..6ea3c1a7 --- /dev/null +++ b/debian/amule-i18n-hr.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/hr diff --git a/debian/amule-i18n-hr.override b/debian/amule-i18n-hr.override new file mode 100644 index 00000000..a368aa77 --- /dev/null +++ b/debian/amule-i18n-hr.override @@ -0,0 +1 @@ +amule-i18n-hr: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-hu.dirs b/debian/amule-i18n-hu.dirs new file mode 100644 index 00000000..b486c378 --- /dev/null +++ b/debian/amule-i18n-hu.dirs @@ -0,0 +1,3 @@ +usr/share/locale/hu/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-hu diff --git a/debian/amule-i18n-hu.install b/debian/amule-i18n-hu.install new file mode 100644 index 00000000..a0c27f81 --- /dev/null +++ b/debian/amule-i18n-hu.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/hu diff --git a/debian/amule-i18n-hu.override b/debian/amule-i18n-hu.override new file mode 100644 index 00000000..79550459 --- /dev/null +++ b/debian/amule-i18n-hu.override @@ -0,0 +1 @@ +amule-i18n-hu: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-it-ch.dirs b/debian/amule-i18n-it-ch.dirs new file mode 100644 index 00000000..f9d890d3 --- /dev/null +++ b/debian/amule-i18n-it-ch.dirs @@ -0,0 +1,3 @@ +usr/share/locale/it_CH/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-it-ch diff --git a/debian/amule-i18n-it-ch.install b/debian/amule-i18n-it-ch.install new file mode 100644 index 00000000..5c4abfc3 --- /dev/null +++ b/debian/amule-i18n-it-ch.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/it_CH diff --git a/debian/amule-i18n-it-ch.override b/debian/amule-i18n-it-ch.override new file mode 100644 index 00000000..ef139a1f --- /dev/null +++ b/debian/amule-i18n-it-ch.override @@ -0,0 +1 @@ +amule-i18n-it-ch: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-it.dirs b/debian/amule-i18n-it.dirs new file mode 100644 index 00000000..b81f2c19 --- /dev/null +++ b/debian/amule-i18n-it.dirs @@ -0,0 +1,3 @@ +usr/share/locale/it/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-it diff --git a/debian/amule-i18n-it.install b/debian/amule-i18n-it.install new file mode 100644 index 00000000..d4d6e290 --- /dev/null +++ b/debian/amule-i18n-it.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/it diff --git a/debian/amule-i18n-it.override b/debian/amule-i18n-it.override new file mode 100644 index 00000000..2f5075ce --- /dev/null +++ b/debian/amule-i18n-it.override @@ -0,0 +1 @@ +amule-i18n-it: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-ko-kr.dirs b/debian/amule-i18n-ko-kr.dirs new file mode 100644 index 00000000..1ff16c6e --- /dev/null +++ b/debian/amule-i18n-ko-kr.dirs @@ -0,0 +1,3 @@ +usr/share/locale/ko_KR/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-ko-kr diff --git a/debian/amule-i18n-ko-kr.install b/debian/amule-i18n-ko-kr.install new file mode 100644 index 00000000..0097b23e --- /dev/null +++ b/debian/amule-i18n-ko-kr.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/ko_KR diff --git a/debian/amule-i18n-ko-kr.override b/debian/amule-i18n-ko-kr.override new file mode 100644 index 00000000..e00c27ab --- /dev/null +++ b/debian/amule-i18n-ko-kr.override @@ -0,0 +1 @@ +amule-i18n-ko-kr: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-lt.dirs b/debian/amule-i18n-lt.dirs new file mode 100644 index 00000000..6e685c99 --- /dev/null +++ b/debian/amule-i18n-lt.dirs @@ -0,0 +1,3 @@ +usr/share/locale/lt/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-lt diff --git a/debian/amule-i18n-lt.install b/debian/amule-i18n-lt.install new file mode 100644 index 00000000..8745a0e3 --- /dev/null +++ b/debian/amule-i18n-lt.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/lt diff --git a/debian/amule-i18n-lt.override b/debian/amule-i18n-lt.override new file mode 100644 index 00000000..7bf34fc1 --- /dev/null +++ b/debian/amule-i18n-lt.override @@ -0,0 +1 @@ +amule-i18n-lt: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-nl.dirs b/debian/amule-i18n-nl.dirs new file mode 100644 index 00000000..9be49bbf --- /dev/null +++ b/debian/amule-i18n-nl.dirs @@ -0,0 +1,3 @@ +usr/share/locale/nl/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-nl diff --git a/debian/amule-i18n-nl.install b/debian/amule-i18n-nl.install new file mode 100644 index 00000000..129e1eac --- /dev/null +++ b/debian/amule-i18n-nl.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/nl diff --git a/debian/amule-i18n-nl.override b/debian/amule-i18n-nl.override new file mode 100644 index 00000000..7a1d6493 --- /dev/null +++ b/debian/amule-i18n-nl.override @@ -0,0 +1 @@ +amule-i18n-nl: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-nn.dirs b/debian/amule-i18n-nn.dirs new file mode 100644 index 00000000..6338ceb2 --- /dev/null +++ b/debian/amule-i18n-nn.dirs @@ -0,0 +1,3 @@ +usr/share/locale/nn/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-nn diff --git a/debian/amule-i18n-nn.install b/debian/amule-i18n-nn.install new file mode 100644 index 00000000..beb3b420 --- /dev/null +++ b/debian/amule-i18n-nn.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/nn diff --git a/debian/amule-i18n-nn.override b/debian/amule-i18n-nn.override new file mode 100644 index 00000000..d53bc675 --- /dev/null +++ b/debian/amule-i18n-nn.override @@ -0,0 +1 @@ +amule-i18n-nn: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-pl.dirs b/debian/amule-i18n-pl.dirs new file mode 100644 index 00000000..802de0b1 --- /dev/null +++ b/debian/amule-i18n-pl.dirs @@ -0,0 +1,3 @@ +usr/share/locale/pl/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-pl diff --git a/debian/amule-i18n-pl.install b/debian/amule-i18n-pl.install new file mode 100644 index 00000000..f7b19ba9 --- /dev/null +++ b/debian/amule-i18n-pl.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/pl diff --git a/debian/amule-i18n-pl.override b/debian/amule-i18n-pl.override new file mode 100644 index 00000000..697c26a6 --- /dev/null +++ b/debian/amule-i18n-pl.override @@ -0,0 +1 @@ +amule-i18n-pl: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-pt-br.dirs b/debian/amule-i18n-pt-br.dirs new file mode 100644 index 00000000..cd3bb7af --- /dev/null +++ b/debian/amule-i18n-pt-br.dirs @@ -0,0 +1,3 @@ +usr/share/locale/pt_BR/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-pt-br diff --git a/debian/amule-i18n-pt-br.install b/debian/amule-i18n-pt-br.install new file mode 100644 index 00000000..1e9fdbd9 --- /dev/null +++ b/debian/amule-i18n-pt-br.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/pt_BR diff --git a/debian/amule-i18n-pt-br.override b/debian/amule-i18n-pt-br.override new file mode 100644 index 00000000..cc30c9b0 --- /dev/null +++ b/debian/amule-i18n-pt-br.override @@ -0,0 +1 @@ +amule-i18n-pt-br: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-pt-pt.dirs b/debian/amule-i18n-pt-pt.dirs new file mode 100644 index 00000000..fb3af106 --- /dev/null +++ b/debian/amule-i18n-pt-pt.dirs @@ -0,0 +1,3 @@ +usr/share/locale/pt_PT/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-pt-pt diff --git a/debian/amule-i18n-pt-pt.install b/debian/amule-i18n-pt-pt.install new file mode 100644 index 00000000..ed0b3c85 --- /dev/null +++ b/debian/amule-i18n-pt-pt.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/pt_PT diff --git a/debian/amule-i18n-pt-pt.override b/debian/amule-i18n-pt-pt.override new file mode 100644 index 00000000..f2c4ed97 --- /dev/null +++ b/debian/amule-i18n-pt-pt.override @@ -0,0 +1 @@ +amule-i18n-pt-pt: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-ru.dirs b/debian/amule-i18n-ru.dirs new file mode 100644 index 00000000..1ef539cb --- /dev/null +++ b/debian/amule-i18n-ru.dirs @@ -0,0 +1,3 @@ +usr/share/locale/ru/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-ru diff --git a/debian/amule-i18n-ru.install b/debian/amule-i18n-ru.install new file mode 100644 index 00000000..3d22b5e0 --- /dev/null +++ b/debian/amule-i18n-ru.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/ru diff --git a/debian/amule-i18n-ru.override b/debian/amule-i18n-ru.override new file mode 100644 index 00000000..5fd3afbd --- /dev/null +++ b/debian/amule-i18n-ru.override @@ -0,0 +1 @@ +amule-i18n-ru: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-sl.dirs b/debian/amule-i18n-sl.dirs new file mode 100644 index 00000000..4bf8c66d --- /dev/null +++ b/debian/amule-i18n-sl.dirs @@ -0,0 +1,3 @@ +usr/share/locale/sl/LC_MESSAGES +/usr/share/lintian/overrides +usr/share/doc/amule-i18n-sl diff --git a/debian/amule-i18n-sl.install b/debian/amule-i18n-sl.install new file mode 100644 index 00000000..af9aafe7 --- /dev/null +++ b/debian/amule-i18n-sl.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/sl diff --git a/debian/amule-i18n-sl.override b/debian/amule-i18n-sl.override new file mode 100644 index 00000000..ddf6a254 --- /dev/null +++ b/debian/amule-i18n-sl.override @@ -0,0 +1 @@ +amule-i18n-sl: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-sv.dirs b/debian/amule-i18n-sv.dirs new file mode 100644 index 00000000..a6a69456 --- /dev/null +++ b/debian/amule-i18n-sv.dirs @@ -0,0 +1,3 @@ +usr/share/locale/sv/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-sv diff --git a/debian/amule-i18n-sv.install b/debian/amule-i18n-sv.install new file mode 100644 index 00000000..c88a204a --- /dev/null +++ b/debian/amule-i18n-sv.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/sv diff --git a/debian/amule-i18n-sv.override b/debian/amule-i18n-sv.override new file mode 100644 index 00000000..c1cd5662 --- /dev/null +++ b/debian/amule-i18n-sv.override @@ -0,0 +1 @@ +amule-i18n-sv: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-tr.dirs b/debian/amule-i18n-tr.dirs new file mode 100644 index 00000000..e04f37a0 --- /dev/null +++ b/debian/amule-i18n-tr.dirs @@ -0,0 +1,3 @@ +usr/share/locale/tr/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-tr diff --git a/debian/amule-i18n-tr.install b/debian/amule-i18n-tr.install new file mode 100644 index 00000000..ba5c45f0 --- /dev/null +++ b/debian/amule-i18n-tr.install @@ -0,0 +1 @@ +debian/tmp/usr/share/locale/tr diff --git a/debian/amule-i18n-tr.override b/debian/amule-i18n-tr.override new file mode 100644 index 00000000..9767b789 --- /dev/null +++ b/debian/amule-i18n-tr.override @@ -0,0 +1 @@ +amule-i18n-tr: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-zh-cn.dirs b/debian/amule-i18n-zh-cn.dirs new file mode 100644 index 00000000..6655c9d6 --- /dev/null +++ b/debian/amule-i18n-zh-cn.dirs @@ -0,0 +1,3 @@ +usr/share/locale/zh_CN/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-zh-cn diff --git a/debian/amule-i18n-zh-cn.install b/debian/amule-i18n-zh-cn.install new file mode 100644 index 00000000..f3f1a0fa --- /dev/null +++ b/debian/amule-i18n-zh-cn.install @@ -0,0 +1,2 @@ +debian/tmp/usr/share/locale/zh_CN + diff --git a/debian/amule-i18n-zh-cn.override b/debian/amule-i18n-zh-cn.override new file mode 100644 index 00000000..182e65c4 --- /dev/null +++ b/debian/amule-i18n-zh-cn.override @@ -0,0 +1 @@ +amule-i18n-zh-cn: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-i18n-zh-tw.dirs b/debian/amule-i18n-zh-tw.dirs new file mode 100644 index 00000000..dd760c1b --- /dev/null +++ b/debian/amule-i18n-zh-tw.dirs @@ -0,0 +1,3 @@ +usr/share/locale/zh_TW/LC_MESSAGES +usr/share/lintian/overrides +usr/share/doc/amule-i18n-zh-tw diff --git a/debian/amule-i18n-zh-tw.install b/debian/amule-i18n-zh-tw.install new file mode 100644 index 00000000..74ca2e9f --- /dev/null +++ b/debian/amule-i18n-zh-tw.install @@ -0,0 +1,2 @@ +debian/tmp/usr/share/locale/zh_TW + diff --git a/debian/amule-i18n-zh-tw.override b/debian/amule-i18n-zh-tw.override new file mode 100644 index 00000000..0d3ca83b --- /dev/null +++ b/debian/amule-i18n-zh-tw.override @@ -0,0 +1 @@ +amule-i18n-zh-tw: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-remote-gui-dbg.dirs b/debian/amule-remote-gui-dbg.dirs new file mode 100644 index 00000000..e6c8101d --- /dev/null +++ b/debian/amule-remote-gui-dbg.dirs @@ -0,0 +1,3 @@ +usr/share/lintian/overrides +usr/lib/debug/usr/bin +usr/share/doc/amule-remote-gui-dbg diff --git a/debian/amule-remote-gui-dbg.override b/debian/amule-remote-gui-dbg.override new file mode 100644 index 00000000..2c3a2f0d --- /dev/null +++ b/debian/amule-remote-gui-dbg.override @@ -0,0 +1 @@ +amule-remote-gui-dbg: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-remote-gui.dirs b/debian/amule-remote-gui.dirs new file mode 100644 index 00000000..c778a031 --- /dev/null +++ b/debian/amule-remote-gui.dirs @@ -0,0 +1,8 @@ +usr/bin +usr/share/lintian/overrides +usr/share/applications +usr/share/pixmaps +usr/share/menu +usr/share/man/man1 +usr/share/man/de/man1 +usr/share/doc/amule-remote-gui diff --git a/debian/amule-remote-gui.install b/debian/amule-remote-gui.install new file mode 100644 index 00000000..665df1b0 --- /dev/null +++ b/debian/amule-remote-gui.install @@ -0,0 +1,3 @@ +debian/tmp/usr/bin/amulegui +debian/tmp/usr/share/pixmaps/amulegui.xpm +debian/tmp/usr/share/applications/amulegui.desktop diff --git a/debian/amule-remote-gui.manpages b/debian/amule-remote-gui.manpages new file mode 100644 index 00000000..f04082e1 --- /dev/null +++ b/debian/amule-remote-gui.manpages @@ -0,0 +1,3 @@ +docs/man/amulegui.1 +docs/man/amulegui.de.1 + diff --git a/debian/amule-remote-gui.menu b/debian/amule-remote-gui.menu new file mode 100644 index 00000000..3796ba1e --- /dev/null +++ b/debian/amule-remote-gui.menu @@ -0,0 +1,3 @@ +?package(amule-remote-gui):needs="X11" section="Apps/Net"\ + title="aMule Remote GUI" command="/usr/bin/amulegui"\ + icon="/usr/share/pixmaps/amulegui.xpm" diff --git a/debian/amule-remote-gui.override b/debian/amule-remote-gui.override new file mode 100644 index 00000000..76f8b9ce --- /dev/null +++ b/debian/amule-remote-gui.override @@ -0,0 +1 @@ +amule-remote-gui: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-skin-gnome.dirs b/debian/amule-skin-gnome.dirs new file mode 100644 index 00000000..88e91b61 --- /dev/null +++ b/debian/amule-skin-gnome.dirs @@ -0,0 +1,3 @@ +usr/share/amule/skins +usr/share/lintian/overrides +usr/share/doc/amule-skin-gnome diff --git a/debian/amule-skin-gnome.install b/debian/amule-skin-gnome.install new file mode 100644 index 00000000..48a07764 --- /dev/null +++ b/debian/amule-skin-gnome.install @@ -0,0 +1,2 @@ +debian/tmp/usr/share/amule/skins/gnome.zip + diff --git a/debian/amule-skin-gnome.override b/debian/amule-skin-gnome.override new file mode 100644 index 00000000..c817c5f1 --- /dev/null +++ b/debian/amule-skin-gnome.override @@ -0,0 +1 @@ +amule-skin-gnome: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-skin-kde4.dirs b/debian/amule-skin-kde4.dirs new file mode 100644 index 00000000..63b4ddb2 --- /dev/null +++ b/debian/amule-skin-kde4.dirs @@ -0,0 +1,3 @@ +usr/share/amule/skins +usr/share/lintian/overrides +usr/share/doc/amule-skin-kde4 diff --git a/debian/amule-skin-kde4.install b/debian/amule-skin-kde4.install new file mode 100644 index 00000000..6f3d88a0 --- /dev/null +++ b/debian/amule-skin-kde4.install @@ -0,0 +1 @@ +debian/tmp/usr/share/amule/skins/kde4.zip diff --git a/debian/amule-skin-kde4.override b/debian/amule-skin-kde4.override new file mode 100644 index 00000000..d2beed33 --- /dev/null +++ b/debian/amule-skin-kde4.override @@ -0,0 +1 @@ +amule-skin-kde4: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-skin-tango.dirs b/debian/amule-skin-tango.dirs new file mode 100644 index 00000000..2fe4215b --- /dev/null +++ b/debian/amule-skin-tango.dirs @@ -0,0 +1,3 @@ +usr/share/amule/skins +usr/share/lintian/overrides +usr/share/doc/amule-skin-tango diff --git a/debian/amule-skin-tango.install b/debian/amule-skin-tango.install new file mode 100644 index 00000000..5f823c9d --- /dev/null +++ b/debian/amule-skin-tango.install @@ -0,0 +1 @@ +debian/tmp/usr/share/amule/skins/tango.zip diff --git a/debian/amule-skin-tango.override b/debian/amule-skin-tango.override new file mode 100644 index 00000000..159a56c1 --- /dev/null +++ b/debian/amule-skin-tango.override @@ -0,0 +1 @@ +amule-skin-tango: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-skin-xfce.dirs b/debian/amule-skin-xfce.dirs new file mode 100644 index 00000000..179d2ec2 --- /dev/null +++ b/debian/amule-skin-xfce.dirs @@ -0,0 +1,3 @@ +usr/share/amule/skins +usr/share/lintian/overrides +usr/share/doc/amule-skin-xfce diff --git a/debian/amule-skin-xfce.install b/debian/amule-skin-xfce.install new file mode 100644 index 00000000..c6d15a07 --- /dev/null +++ b/debian/amule-skin-xfce.install @@ -0,0 +1 @@ +debian/tmp/usr/share/amule/skins/xfce.zip diff --git a/debian/amule-skin-xfce.override b/debian/amule-skin-xfce.override new file mode 100644 index 00000000..9bcd1597 --- /dev/null +++ b/debian/amule-skin-xfce.override @@ -0,0 +1 @@ +amule-skin-xfce: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-theme-chicane.dirs b/debian/amule-theme-chicane.dirs new file mode 100644 index 00000000..e956fbe5 --- /dev/null +++ b/debian/amule-theme-chicane.dirs @@ -0,0 +1,3 @@ +usr/share/amule/webserver/chicane +usr/share/lintian/overrides +usr/share/doc/amule-theme-chicane diff --git a/debian/amule-theme-chicane.install b/debian/amule-theme-chicane.install new file mode 100644 index 00000000..4fa48beb --- /dev/null +++ b/debian/amule-theme-chicane.install @@ -0,0 +1 @@ +debian/tmp/usr/share/amule/webserver/chicane diff --git a/debian/amule-theme-chicane.override b/debian/amule-theme-chicane.override new file mode 100644 index 00000000..e7e36add --- /dev/null +++ b/debian/amule-theme-chicane.override @@ -0,0 +1 @@ +amule-theme-chicane: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-theme-default.dirs b/debian/amule-theme-default.dirs new file mode 100644 index 00000000..0537699d --- /dev/null +++ b/debian/amule-theme-default.dirs @@ -0,0 +1,3 @@ +usr/share/amule/webserver/default +usr/share/lintian/overrides +usr/share/doc/amule-theme-default diff --git a/debian/amule-theme-default.install b/debian/amule-theme-default.install new file mode 100644 index 00000000..833fc1b6 --- /dev/null +++ b/debian/amule-theme-default.install @@ -0,0 +1 @@ +debian/tmp/usr/share/amule/webserver/default diff --git a/debian/amule-theme-default.override b/debian/amule-theme-default.override new file mode 100644 index 00000000..8ff31f6d --- /dev/null +++ b/debian/amule-theme-default.override @@ -0,0 +1 @@ +amule-theme-default: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-theme-php-default.dirs b/debian/amule-theme-php-default.dirs new file mode 100644 index 00000000..489495d0 --- /dev/null +++ b/debian/amule-theme-php-default.dirs @@ -0,0 +1,3 @@ +usr/share/amule/webserver/php-default +usr/share/lintian/overrides +usr/share/doc/amule-theme-php-default diff --git a/debian/amule-theme-php-default.install b/debian/amule-theme-php-default.install new file mode 100644 index 00000000..4fea6f0c --- /dev/null +++ b/debian/amule-theme-php-default.install @@ -0,0 +1 @@ +debian/tmp/usr/share/amule/webserver/php-default diff --git a/debian/amule-theme-php-default.override b/debian/amule-theme-php-default.override new file mode 100644 index 00000000..c6a91d2a --- /dev/null +++ b/debian/amule-theme-php-default.override @@ -0,0 +1 @@ +amule-theme-php-default: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-utils-gui.dirs b/debian/amule-utils-gui.dirs new file mode 100644 index 00000000..834ce337 --- /dev/null +++ b/debian/amule-utils-gui.dirs @@ -0,0 +1 @@ +usr/share/doc/amule-utils-gui diff --git a/debian/amule-utils-gui.override b/debian/amule-utils-gui.override new file mode 100644 index 00000000..8abf2a44 --- /dev/null +++ b/debian/amule-utils-gui.override @@ -0,0 +1 @@ +amule-utils-gui: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-utils.dirs b/debian/amule-utils.dirs new file mode 100644 index 00000000..7f2bb01a --- /dev/null +++ b/debian/amule-utils.dirs @@ -0,0 +1 @@ +usr/share/doc/amule-utils diff --git a/debian/amule-utils.override b/debian/amule-utils.override new file mode 100644 index 00000000..e8102acb --- /dev/null +++ b/debian/amule-utils.override @@ -0,0 +1 @@ +amule-utils: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-wxcas-dbg.dirs b/debian/amule-wxcas-dbg.dirs new file mode 100644 index 00000000..433941c8 --- /dev/null +++ b/debian/amule-wxcas-dbg.dirs @@ -0,0 +1,3 @@ +usr/share/lintian/overrides +usr/lib/debug/usr/bin +usr/share/doc/amule-wxcas-dbg diff --git a/debian/amule-wxcas-dbg.override b/debian/amule-wxcas-dbg.override new file mode 100644 index 00000000..6caee61e --- /dev/null +++ b/debian/amule-wxcas-dbg.override @@ -0,0 +1 @@ +amule-wxcas-dbg: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-wxcas.dirs b/debian/amule-wxcas.dirs new file mode 100644 index 00000000..189ed225 --- /dev/null +++ b/debian/amule-wxcas.dirs @@ -0,0 +1,11 @@ +usr/bin +usr/share/pixmaps +usr/share/applications +usr/share/lintian/overrides +usr/share/menu +usr/share/man/man1 +usr/share/man/hu/man1 +usr/share/man/eu/man1 +usr/share/man/es/man1 +usr/share/man/de/man1 +usr/share/doc/amule-wxcas diff --git a/debian/amule-wxcas.install b/debian/amule-wxcas.install new file mode 100644 index 00000000..d339cfad --- /dev/null +++ b/debian/amule-wxcas.install @@ -0,0 +1,3 @@ +debian/tmp/usr/bin/wxcas +debian/tmp/usr/share/applications/wxcas.desktop +debian/tmp/usr/share/pixmaps/wxcas.xpm diff --git a/debian/amule-wxcas.manpages b/debian/amule-wxcas.manpages new file mode 100644 index 00000000..bda2e2d8 --- /dev/null +++ b/debian/amule-wxcas.manpages @@ -0,0 +1,6 @@ +src/utils/wxCas/docs/wxcas.1 +src/utils/wxCas/docs/wxcas.de.1 +src/utils/wxCas/docs/wxcas.es.1 +src/utils/wxCas/docs/wxcas.eu.1 +src/utils/wxCas/docs/wxcas.hu.1 + diff --git a/debian/amule-wxcas.menu b/debian/amule-wxcas.menu new file mode 100644 index 00000000..eb562083 --- /dev/null +++ b/debian/amule-wxcas.menu @@ -0,0 +1,3 @@ +?package(amule-wxcas):needs="X11" section="Apps/Tools"\ + title="aMule Stats" command="/usr/bin/wxcas"\ + icon="/usr/share/pixmaps/wxcas.xpm" diff --git a/debian/amule-wxcas.override b/debian/amule-wxcas.override new file mode 100644 index 00000000..e0bfd1aa --- /dev/null +++ b/debian/amule-wxcas.override @@ -0,0 +1 @@ +amule-wxcas: maintainer-not-full-name Vollstrecker diff --git a/debian/amule-xas.dirs b/debian/amule-xas.dirs new file mode 100644 index 00000000..27995ae6 --- /dev/null +++ b/debian/amule-xas.dirs @@ -0,0 +1,10 @@ +usr/bin +usr/share/doc/xchat-common/scripts-perl +usr/share/lintian/overrides +usr/lib/xchat/plugins +usr/share/man/man1 +usr/share/man/hu/man1 +usr/share/man/eu/man1 +usr/share/man/es/man1 +usr/share/man/de/man1 +usr/share/doc/amule-xas diff --git a/debian/amule-xas.install b/debian/amule-xas.install new file mode 100644 index 00000000..16492785 --- /dev/null +++ b/debian/amule-xas.install @@ -0,0 +1,2 @@ +debian/tmp/usr/lib/xchat/plugins/xas.pl +debian/tmp/usr/bin/autostart-xas diff --git a/debian/amule-xas.links b/debian/amule-xas.links new file mode 100644 index 00000000..fa2fffc6 --- /dev/null +++ b/debian/amule-xas.links @@ -0,0 +1,2 @@ +/usr/share/man/de/man1/xas.1.gz /usr/share/man/de/man1/xas.1.gz + diff --git a/debian/amule-xas.manpages b/debian/amule-xas.manpages new file mode 100644 index 00000000..8f7ac476 --- /dev/null +++ b/debian/amule-xas.manpages @@ -0,0 +1,6 @@ +src/utils/xas/docs/xas.1 +src/utils/xas/docs/xas.de.1 +src/utils/xas/docs/xas.es.1 +src/utils/xas/docs/xas.eu.1 +src/utils/xas/docs/xas.hu.1 + diff --git a/debian/amule-xas.override b/debian/amule-xas.override new file mode 100644 index 00000000..3a6284a6 --- /dev/null +++ b/debian/amule-xas.override @@ -0,0 +1,3 @@ +amule-xas: binary-without-manpage usr/bin/autostart-xas +amule-xas: script-not-executable ./usr/lib/xchat/plugins/xas.pl +amule-xas: maintainer-not-full-name Vollstrecker diff --git a/debian/amule.README.Debian b/debian/amule.README.Debian new file mode 100644 index 00000000..2dbf292a --- /dev/null +++ b/debian/amule.README.Debian @@ -0,0 +1,39 @@ +amule for Debian +---------------- + +STANDING AMULE ? +---------------- +With some Window Manager, aMule runs, but the GUI seems to be buggy. +So, It's not a problem from the package, you just have to uncheck +the option : " Use Tray Icon" in your aMule preferences. + + +AMULE AND XMULE PACKAGE +----------------- +Before the 1.2.X version, the package of amule was in conflicts with +the xmule package. The bug comes from the /usr/bin/ed2k, which was +used by the both packages. + +I wrote a wrapper, which see if amule or xmule is running and +invoke the right binary. So, the binary ed2k from amule was +renamed as ed2k.amule and this from xmule was renamed ed2k.xmule. +According to Debian, I use a diversion to rename this file :-) + + + +CONFFILES IN YOUR HOME +----------------- +aMule is a fork of xMule, it uses the same files (~/.aMule/). + + + +TOO HIGH CPU USAGE +------------------ +If you have a high CPU usage with amule (you can see that when you +run 'top'), you need maybe to compile a new kernel. See this topic : +http://www.amule.org/wiki/index.php/AMule_makes_everything_slow +http://xmule.org/forums/index.php?showtopic=1030 + + + -- Julien Delange , Sat, 27 Sep 2003 00:11:07 +0200 + -- Modified by Vollstrecker , Mon, 29 Mar 2005 00:44:12 +0200 diff --git a/debian/amule.dirs b/debian/amule.dirs new file mode 100644 index 00000000..2edd1862 --- /dev/null +++ b/debian/amule.dirs @@ -0,0 +1,12 @@ +usr/bin +usr/share/applications +usr/share/lintian/overrides +usr/share/pixmaps +usr/share/menu +usr/share/man/man1 +usr/share/man/hu/man1 +usr/share/man/fr/man1 +usr/share/man/eu/man1 +usr/share/man/es/man1 +usr/share/man/de/man1 +usr/share/doc/amule diff --git a/debian/amule.install b/debian/amule.install new file mode 100644 index 00000000..a4e39be2 --- /dev/null +++ b/debian/amule.install @@ -0,0 +1,3 @@ +debian/tmp/usr/bin/amule +debian/tmp/usr/share/applications/amule.desktop +debian/tmp/usr/share/pixmaps/amule.xpm diff --git a/debian/amule.manpages b/debian/amule.manpages new file mode 100644 index 00000000..56d00b81 --- /dev/null +++ b/debian/amule.manpages @@ -0,0 +1,7 @@ +docs/man/amule.1 +docs/man/amule.fr.1 +docs/man/amule.de.1 +docs/man/amule.es.1 +docs/man/amule.eu.1 +docs/man/amule.hu.1 + diff --git a/debian/amule.menu b/debian/amule.menu new file mode 100644 index 00000000..ef1b6a93 --- /dev/null +++ b/debian/amule.menu @@ -0,0 +1,3 @@ +?package(amule):needs="X11" section="Apps/Net"\ + title="amule" command="/usr/bin/amule"\ + icon="/usr/share/pixmaps/amule.xpm" diff --git a/debian/amule.override b/debian/amule.override new file mode 100644 index 00000000..f435aaca --- /dev/null +++ b/debian/amule.override @@ -0,0 +1,2 @@ +amule: menu-icon-too-big /usr/share/pixmaps/amule.xpm: 128x128 > 32x32 +amule: maintainer-not-full-name Vollstrecker diff --git a/debian/amule.postinst b/debian/amule.postinst new file mode 100644 index 00000000..e0a6e36a --- /dev/null +++ b/debian/amule.postinst @@ -0,0 +1,9 @@ +#!/bin/sh + +set -e + +#DEBHELPER# + +if [ "$1" = "configure" ] && [ -x /usr/bin/update-menus ]; then update-menus ; fi + +exit 0 diff --git a/debian/amule.postrm b/debian/amule.postrm new file mode 100644 index 00000000..2c1241a3 --- /dev/null +++ b/debian/amule.postrm @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +if [ "$1" = "remove" ] && [ -x /usr/bin/update-menus ]; then update-menus ; fi + +#DEBHELPER# diff --git a/debian/amuleweb-dbg.dirs b/debian/amuleweb-dbg.dirs new file mode 100644 index 00000000..cb087c5c --- /dev/null +++ b/debian/amuleweb-dbg.dirs @@ -0,0 +1,3 @@ +usr/share/lintian/overrides +usr/lib/debug/usr/bin +usr/share/doc/amuleweb-dbg diff --git a/debian/amuleweb-dbg.override b/debian/amuleweb-dbg.override new file mode 100644 index 00000000..134f9d02 --- /dev/null +++ b/debian/amuleweb-dbg.override @@ -0,0 +1 @@ +amuleweb-dbg: maintainer-not-full-name Vollstrecker diff --git a/debian/amuleweb.dirs b/debian/amuleweb.dirs new file mode 100644 index 00000000..52a0bc67 --- /dev/null +++ b/debian/amuleweb.dirs @@ -0,0 +1,9 @@ +usr/bin +usr/share/lintian/overrides +usr/share/man/man1 +usr/share/man/hu/man1 +usr/share/man/fr/man1 +usr/share/man/eu/man1 +usr/share/man/es/man1 +usr/share/man/de/man1 +usr/share/doc/amuleweb diff --git a/debian/amuleweb.install b/debian/amuleweb.install new file mode 100644 index 00000000..19f03533 --- /dev/null +++ b/debian/amuleweb.install @@ -0,0 +1 @@ +debian/tmp/usr/bin/amuleweb diff --git a/debian/amuleweb.manpages b/debian/amuleweb.manpages new file mode 100644 index 00000000..df0b8000 --- /dev/null +++ b/debian/amuleweb.manpages @@ -0,0 +1,7 @@ +docs/man/amuleweb.1 +docs/man/amuleweb.de.1 +docs/man/amuleweb.es.1 +docs/man/amuleweb.eu.1 +docs/man/amuleweb.fr.1 +docs/man/amuleweb.hu.1 + diff --git a/debian/amuleweb.override b/debian/amuleweb.override new file mode 100644 index 00000000..a5ffae40 --- /dev/null +++ b/debian/amuleweb.override @@ -0,0 +1 @@ +amuleweb: maintainer-not-full-name Vollstrecker diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 00000000..2c55cfd1 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,630 @@ +amule (2.1.3+CVS20080121) testing; urgency=low + + * Added binutils-dev to Build-Deps + + -- Vollstrecker Sun, 20 Jan 2008 15:34:01 +0100 + +amule (2.1.3+CVS20080106) testing; urgency=low + + * debian/control + Removed amule-skin-ubuntu + * debian/rules + Moved i18n-pkgs out of general-pkgs to separate targets + Adjusted clean target + Removed utils and utils-gui from general-pkgs + Adjusted README.Debian-Packages acordingly + Enabled use of --with-language= option for configure + + -- Vollstrecker Sat, 05 Jan 2008 19:25:01 +0100 + +amule (2.1.3+CVS20071220) testing; urgency=low + + * amule.menu: Removed old Startupflag + + -- Vollstrecker Wed, 19 Dec 2007 18:31:01 +0100 + +amule (2.1.3+CVS20070922) testing; urgency=low + + * removed amule-i18n-en_us package + * removed amule-i18n-es_mx package + * added amule-i18n-lt package + * added amule-i18n-nn package + + -- Vollstrecker Fri, 21 Sep 2007 16:57:01 +0100 + +amule (2.1.3+CVS20070910) testing; urgency=low + + * Readded *.override + + -- Vollstrecker Mon, 10 Sep 2007 17:30:01 +0100 + +amule (2.1.3+CVS20070822) testing; urgency=low + + * Made possible to compile more than one time + * Updated amule.override + * Updated .install and .dirs files for the skins to reflect the new format + * Added xcfe skin-package + * Added source override files + * Use ${binay:Version} to make the pkg's bin-NMUable + * Bumped to new standards-version 3.7.2.2 + * Don't ignore Errors in make distclean anymore + * Adjusted Section + * Adjusted menu-section + * Removed amule-skin-ubuntu + * Switched to apropriate numbering for native packages + + -- Vollstrecker Wed, 22 Aug 2007 11:11:01 +0100 + +amule (2.1.3+CVS20070729-2) testing; urgency=low + + * Fixed redundand call of make_shlibsdep for all pkgs + * Renabled External Crypto Build + * Added amule-i18n-sv package + * Added amule-i18n-tr package + * Added amule-skin-gnome package + * Added amule-skin-kde4 package + * Added amule-skin-tango package + * Added amule-skin-ubuntu package + * Corrected many typos in debian/control + * Added lintian override files + * Made sure that the binaries get stripped correct + * Added and Updated *.dirs and *.install files + + -- Vollstrecker Sun, 29 Jul 2007 18:57:01 +0100 + +amule (2.1.3+CVS20070708-2) testing; urgency=low + + * Todays version is dedicated to Mathias Dittmar who decided for suicide. + I'll miss you friend + + -- Vollstrecker Sun, 08 Jul 2007 23:49:05 +0100 + +amule (2.1.3+CVS20070701-2) testing; urgency=low + + * Added missing libupnp-dev to Build-Deps + + -- Vollstrecker Sun, 01 Jul 2007 17:28:13 +0100 + +amule (2.1.3+CVS20070628-2) testing; urgency=low + + * Updated to new startup flag + + -- Vollstrecker Thu, 28 Jun 2007 19:48:02 +0100 + +amule (2.1.3+CVS20070608-2) testing; urgency=low + + * Complete rewrite of debian/rules. Now separate packages can be choose to build + + -- Vollstrecker Fri, 08 Jun 2007 19:19:01 +0100 + +amule (2.1.3+CVS20070526-2) testing; urgency=low + + * debian/rules + - disabled external-crypto till it is fixed + - added geoip-support + * debian/control + - added libgeoip-dev to build-dependencies + * Removed unneded debian/mans folder + * Place the right pkg-name in debian/amule-remote-gui.menu + + -- Vollstrecker Sat, 26 May 2007 14:40:08 +0100 + +amule (2.1.3+CVS20070430-2) testing; urgency=low + + * Switched build-deps to wx-2.8 + + -- Vollstrecker Mon, 30 Apr 2007 19:13:40 +0100 + +amule (2.1.3+CVS20070422-2) testing; urgency=low + + * Removed the wrapper-script for ed2k + * Removed debian/amule-ed2k.links + * debian/control: Set the conflict with xmule for amule-ed2k + * debian/rules: Removed all wrapper related stuff + + -- Vollstrecker Sun, 22 Apr 2007 18:00:52 +0100 + +amule (2.1.3+CVS20061228-2) testing; urgency=low + + * Corrected install-failure, really install amulegui.desktop this time + + -- Vollstrecker Thu, 28 Dec 2006 19:10:41 +0100 + +amule (2.1.3+CVS20061227-2) testing; urgency=low + + * Added amulegui.xpm, and debian/amulegui.menu + * Moved amule.xpm from amule-common to amule + * Added manpages for amulegui + * Added amulegui.desktop to amule-remote-gui + + -- Vollstrecker Thu, 28 Dec 2006 6:03:41 +0100 + + +amule (2.1.3+CVS20061224-2) testing; urgency=low + + * Readjusted startflag, I think it will stay now + + -- Vollstrecker Sun, 24 Dec 2006 13:12:55 +0100 + +amule (2.1.3+CVS20061112-2) testing; urgency=low + + * Added Basque translation of the manpages + * Removed --enable-kad-compile from debian/rules, it's dafault now + + -- Vollstrecker Sun, 12 Nov 2006 20:56:12 +0100 + +amule (2.1.3+CVS20060926-2) testing; urgency=low + + * Changed Build-Depency from libglib1.2-dev to libglib2.0-dev + + -- Vollstrecker Tue, 26 Sep 2006 9:13:06 +0100 + +amule (2.1.3+CVS20060711-2) testing; urgency=low + + * Finally added autostart-xas + * Readjusted snv-flag + + -- Vollstrecker Tue, 11 Jul 2006 23:22:36 +0100 + + +amule (2.1.3+CVS20060625-2) testing; urgency=low + + * Changed amule.menu and the sed's in rules to reflect the new svn-flags + + -- Vollstrecker Sun, 25 Jun 2006 15:42:34 +0100 + +amule (2.1.3+CVS20060611-2) testing; urgency=low + + * Updated version to 2.1.3 + + -- Vollstrecker Sun, 11 Jun 2006 23:03:38 +0100 + +amule (2.1.2+CVS20060605-2) testing; urgency=low + + * Added newlines to the end of all .install files to get rid of some warnings + + -- Vollstrecker Mon, 05 Jun 2006 14:45:31 +0100 + +amule (2.1.2+CVS20060604-2) testing; urgency=low + + * Added patch for amule.desktop to debian/rules + * Added patch for the path of the Icon of alc and wxcas to debian/rules + + -- Vollstrecker Sun, 04 Jun 2006 21:49:54 +0100 + +amule (2.1.2+CVS20060528-2) testing; urgency=low + + * Updated to Version 2.1.2 + + -- Vollstrecker Sun, 28 May 2006 18:17:22 +0100 + +amule (2.1.1+CVS20060523-2) testing; urgency=low + + * Fixed removing of divertion by amule-ed2k + * Fixed typo in deps of all i18n pkg's + * Added the Chuck Norris Option to the menu-entry, to make it work. + Thanks to uwe for the patches. + + -- Vollstrecker Tue, 23 May 2006 22:25:01 +0100 + +amule (2.1.1+CVS20060513-2) testing; urgency=low + + * Moved amule.xpm back to amule-common + * Fixed typo in description of amule-dbg + * Removed Version from dep to amule-i18n + Thanks to jere for reposting all three + + -- Vollstrecker Sat, 13 May 2006 15:44:40 +0100 + +amule (2.1.1+CVS20060510-2) testing; urgency=low + + * Now fixed divertion of ed2k completely. ed2k is now really a symlink + to ed2k.wrapper + + -- Vollstrecker Wed, 10 May 2006 19:54:26 +0100 + +amule (2.1.1+CVS20060509-2) testing; urgency=low + + * Fixed installation of ed2k.amule and ed2k.wrapper and the manpages + for them. Divertion and the links doesn't work. + + -- Vollstrecker Tue, 09 May 2006 13:01:31 +0100 + +amule (2.1.1+CVS20060508-2) testing; urgency=low + + * Now really fixed dependencies of amuleweb + * Started to fix divertion of ed2k binary, atm it installs the + binaries in /, but today I don't get this fixed + + -- Vollstrecker Mon, 08 May 2006 14:48:34 +0100 + +amule (2.1.1+CVS20060507-2) testing; urgency=low + + * Fixed some lintian Errors for debian/changelog + * Fixed typo in description of amule-ed2k + * Prevented the docs from being install in amule-pkg the second time + * Moved ED2K-Links Howto to amule-ed2k package + * Split the debugging symbols for each binary to separate pkg'S + * Bumped debhelper compatiblity-level to 5 + * Fixed lintian-Warning in description of amuleweb + * Fixed lintian-Warning in description of amule-daemon + * Fixed lintian-Warning in description of amule-remote-gui + * Fixed lintian-Warning in description of amule-wxcas + * Fixed lintian-Warning in description of amule-cmd + * Fixed lintian-Warning in description of amule-alcc + * Fixed lintian-Warning for menu entry of wxcas + * Prevented license.txt.gz from being installed + * Fixed lintian-Warning for menu entry of alc + * Set Standards Version to 3.6.2.2 + + -- Vollstrecker Sun, 07 May 2006 13:02:46 +0100 + +amule (2.1.1+CVS20060506-2) testing; urgency=low + + * Removed menu-entry for amulewebDLG from amule pkg + * Fixed installation of amule-alc + + -- Vollstrecker Sat, 06 May 2006 13:35:59 +0100 + +amule (2.1.1+CVS20060505-2) testing; urgency=low + + * Renamed package amuled to amule-daemon to be compatible to the official deb + thanks to Jacobo221 for the hint. + * Split off all languages to separate pkg's. Thanks to Uwe for initial work. + * Cleaned up TODO-Debian + * Moved complete to dh_install + * Removed usr/share and usr/share/pixmaps from debian/amule.dirs + * Moved /usr/share/doc/amule/TODO and /usr/share/doc/amule/TODO to amule-common + * Split alc, alcc and amulecmd to separate pkg's + * Set conflicts and replaces for full compatiblity with official debs + * Set Depends for amule-theme-default, amule-theme-chicane and amule-theme-php-default + on amuleweb, because without that they are useless + * Made amule-utils a meta pkg for compatiblity with official debs + * Moved amule-utils.README.Debian to amule-cas.README.Debian, because that's what it is + * Removed amulecmdDLG from menu + * Created amule-utils-gui meta-pkg for compatiblity with official debs. + * Moved all common docs to amule-common + + -- Vollstrecker Fri, 05 May 2006 16:12:26 +0100 + +amule (2.1.1+CVS20060318-2) testing; urgency=low + + * Updated Version to 2.1.1 + + -- Vollstrecker Sun, 19 Mar 2006 0:26:17 +0100 + + +amule (2.1.0+CVS20060216-2) testing; urgency=low + + * Fixed typo in amule-utils.menu, thanks to JohnGH + + -- Vollstrecker Thu, 16 Feb 2006 18:36:28 +0100 + +amule (2.0.3+CVS20051203-2) testing; urgency=low + + * Acknowledged Non-maintainer upload. + * debian/control + * added bison and flex to build-depends (fixes FTBFS) + * added libcrypto++-dev + * debian/rules + * added --disable-embedded-crypto to configure command + * made configure command prettier ;) + * Thanks to Uwe for the good work + * debian/rules + * removed --enable-webservergui from configure line + * removed --enable-amulecmdgui from configure line + *debian/control + * added libreadline5-dev to build-depencies, thanks to RR4T + * THE REMOVAL OF EMBEDDED CRYPTO IS FIRST TO TEST. I HOPE IT WORKS + + -- Vollstrecker Mon, 05 Dec 2005 22:21:52 +0100 + +amule (2.0.3+CVS20051126-2) testing; urgency=low + + * Fixed Typo in conflicts line of amuled + + -- Vollstrecker Sun, 27 Nov 2005 5:56:14 +0100 + +amule (2.0.3+CVS20051114-2) testing; urgency=low + * Removed amulewebdlg package + * Removed amulecmdDLG from amule-utils package + + -- Vollstrecker Mon, 14 Nov 2005 10:37:41 +0100 + +amule (2.0.3+CVS20051022-2) testing; urgency=low + + * Added some Conflicts because of appearance of amule-deamon in unstable + * Made my repository checkable with gpg by apt. For use of this do: + gpg --keyserver wwwkeys.eu.pgp.net --recv 50D0AE60 + gpg -a --export 50D0AE60 > /tmp/key + apt-key add /tmp/key + + -- Vollstrecker Sat, 22 Oct 2005 20:56:22 +0200 + +amule (2.0.3+CVS20050916-2) testing; urgency=low + + * Added php theme package + + -- Vollstrecker Fri, 16 Sep 2005 13:35:49 +0200 + +amule (2.0.3+CVS20050729-2) testing; urgency=low + + * Fixed creation of wxcas pkg + + -- Vollstrecker Fri, 29 Jul 2005 19:17:15 +0200 + +amule (2.0.3+CVS20050728-2) testing; urgency=low + + * Added support for kad + * Split package amule-theme-default for better understanding + * Redesinged amule-common to take pixmaps for menu + * Overworked menu-system, wxcas is now created by wxcas package, not amule-utils + * Added wxcas.xpm + * Added alc.xmp + * Now put ed2k.amule really to package amule-ed2k + + -- Vollstrecker Thu, 28 Jul 2005 23:01:15 +0200 + +amule (2.0.3+CVS20050719-1) testing; urgency=low + + * Split of ed2k Package + * Rebuild with official wxgtk + + -- Vollstrecker Tue, 19 Jul 2005 23:01:15 +0200 + +amule (2.0.0-rel+CVS20050508-1) testing; urgency=low + + * The now we have 2.0.0 release + * Fixed the Scripts to present 2.0.0 + * Added some missing manpages + + -- Vollstrecker Sun, 08 May 2005 10:01:23 +0100 + +amule (2.0.0-rc8+CVS20050418-2) testing; urgency=low + + * Fixed amule-common, so amuleweb(DLG) can find their Data + + -- Vollstrecker Mon, 18 Apr 2005 19:45:15 +0100 + +amule (2.0.0-rc8+CVS20050405-2) testing; urgency=low + + * Adjusted build depencies + + -- Vollstrecker Thu, 05 Apr 2005 09:14:02 +0200 + +amule (2.0.0-rc8+CVS20050402-2) testing; urgency=low + + * Added conflict for amuleweb and amulewebdlg against older amule package + * Added conflict for cas and wxcas against older amule-utils package + + -- Vollstrecker Sat, 02 Apr 2005 01:14:02 +0100 + +amule (2.0.0-rc8+CVS20050328-1) testing; urgency=low + + * Fixed typo in debian/control, so amule-remote-gui, amuled, amulewebdlg and amuleweb + get their right dependencies set + * amule-cas, amule-wxcas and amule-xas depend now either on amule or amuled + * amule-utils, amuleweb and amulewebdlg recommend now amule or amuled instead of + depending on them + * Modified amule.README.debian, thakns to kry for correcting it. + + -- Vollstrecker Mon, 28 Mar 2005 8:02:22 +0100 + +amule (2.0.0-rc8+CVS20050322-1) testing; urgency=low + + * Added remote gui package + * Fixed Typo in debian/control so we now have Descriptins for amule-common, + amuleweb and amulewebdlg + * Removed mans german and french translations because they get merged in upstream + + -- Vollstrecker Tue, 22 Mar 2005 14:38:49 +0100 + +amule (2.0.0-rc8+CVS20050311-1) testing; urgency=low + + * Splittet of amulecmddlg package + + -- Vollstrecker Sun, 13 Mar 2005 08:23:54 +0100 + +amule (2.0.0-rc8+CVS20050311-1) testing; urgency=low + + * Splittet of amulecmd package + + -- Vollstrecker Sat, 12 Mar 2005 12:23:54 +0100 + + +amule (2.0.0-rc8+CVS20050311-1) testing; urgency=low + + * Made the binarie backtraceable + + -- Vollstrecker Fri, 11 Mar 2005 20:23:54 +0100 + +amule (2.0.0-rc8+CVS20050306-3) testing; urgency=low + + * Fixed Versioning Bug (hopefully) + + -- Vollstrecker Mon, 7 Mar 2005 04:39:13 +0100 + +amule (2.0.0-rc8+CVS20050306-2) testing; urgency=low + + * Removed manpages for amule, amulecmdDLG, amuleweb, amulecmd and amulewebDLG + because they were merged in Upstream + + -- Vollstrecker Sun, 6 Mar 2005 16:34:30 +0100 + +amule (2.0.0rc8+CVS20050130-1) testing; urgency=low + + * Introduced /usr/share/amule directory + + -- Vollstrecker Sun, 30 Jan 2005 10:47:58 +0100 + +amule (2.0.0rc8+CVS20050129-1) testing; urgency=low + + * Set Dependencies more restrictive + + -- Vollstrecker Sat, 29 Jan 2005 13:47:58 +0100 + +amule (2.0.0rc8+CVS20050128-1) testing; urgency=low + + * Splitted of amule-common package + + -- Vollstrecker Fri, 28 Jan 2005 20:57:58 +0100 + +amule (2.0.0rc8+CVS20050127-1) testing; urgency=low + + * Splittet of amulewebDLG package + + -- Vollstrecker Thu, 27 Jan 2005 20:18:58 +0100 + +amule (2.0.0rc8+CVS20050126-1) testing; urgency=low + + * Splittet of amuleweb package + + -- Vollstrecker Wed, 26 Jan 2005 18:47:58 +0100 + +amule (2.0.0rc8+CVS20050125-1) testing; urgency=low + + * Added translated amulewebDLG manpage + + -- Vollstrecker Tue, 25 Jan 2005 15:47:58 +0100 + +amule (2.0.0rc8+CVS20050124-1) testing; urgency=low + + * Added amulewebDLG manpage + + -- Vollstrecker Mon, 24 Jan 2005 20:18:58 +0100 + +amule (2.0.0rc8+CVS20050123-1) testing; urgency=low + + * Added translated amuleweb manpage + + -- Vollstrecker Sun, 23 Jan 2005 20:17:58 +0100 + +amule (2.0.0rc8+CVS20050122-1) testing; urgency=low + + * Added amuleweb manpage + + -- Vollstrecker Sat, 22 Jan 2005 20:43:58 +0100 + +amule (2.0.0rc8+CVS20050121-1) testing; urgency=low + + * Changed debhelper version to 3.6.0.0 + + -- Vollstrecker Fri, 21 Jan 2005 20:29:58 +0100 + +amule (2.0.0rc8+CVS20050120-1) testing; urgency=low + + * Changed section to web + + -- Vollstrecker Thu, 20 Jan 2005 19:47:58 +0100 + +amule (2.0.0rc8+CVS20050119-1) testing; urgency=low + + * Fixed Dependencies for amule-xas + + -- Vollstrecker Wed, 19 Jan 2005 23:47:58 +0100 + +amule (2.0.0rc8+CVS20050118-1) testing; urgency=low + + * Fixed permissions of files + + -- Vollstrecker Tue, 18 Jan 2005 20:39:58 +0100 + +amule (2.0.0rc8+CVS20050117-1) testing; urgency=low + + * Made some cleanup rules + + -- Vollstrecker Mon, 17 Jan 2005 02:39:16 +0100 + +amule (2.0.0rc7+CVS20041205-1) testing; urgency=low + + * First build with wx2.5, gtk2, unicode and amule daemon + + -- Vollstrecker Sun, 5 Dec 2004 20:47:58 +0100 + +amule (2.0.0rc7+CVS20041116-2) testing; urgency=low + + * Fixed Version Typo for amule-utils + + -- Vollstrecker Tue, 16 Nov 2004 20:51:45 +0100 + +amule (2.0.0rc7+CVS20041116-1) testing; urgency=low + + * Fixed packaging of amule-cas + * Fixed packaging of amule-xas + * Added some files to debian-dir + * Cleaned up debian-dir + * Cleaned up debian/rules + + -- Vollstrecker Tue, 16 Nov 2004 19:46:42 +0100 + +amule (2.0.0rc7+CVS20041110-4) testing; urgency=low + + * Downgraded amule-xas to Suggests + + -- Vollstrecker Wed, 10 Nov 2004 16:46:24 +0100 + +amule (2.0.0rc7+CVS20041031) unstable; urgency=low + + * Another Versioning fix + + -- Vollstrecker Thu, 4 Nov 2004 03:02:47 +0100 + +amule (2.0.0rc7+CVS20041030) unstable; urgency=low + + * Changed Versionerror for yesterdays Version in Changelog + * Added Recommends for amule-utils, amule-cas, amule-wxcas and + amule-xas to amule + + -- Vollstrecker Tue, 2 Nov 2004 13:20:45 +0100 + +amule (2.0.0rc7+CVS20041029) unstable; urgency=low + + * Added stat-png to amule-cas package + + -- Vollstrecker Sun, 31 Oct 2004 21:04:27 +0100 + +amule (2.0.0rc7+CVS20041028) unstable; urgency=low + + * Added Manpage for cas + + -- Vollstrecker Thu, 28 Oct 2004 20:02:23 +0200 + +amule (2.0.0rc7+CVS20041027) unstable; urgency=low + + * Added Manpage for xas + + -- Vollstrecker Thu, 28 Oct 2004 19:30:42 +0200 + +amule (2.0.0rc7+CVS20041026) unstable; urgency=low + + * Added Version-Tag to debian/control + + -- Vollstrecker Tue, 26 Oct 2004 21:54:18 +0200 + +amule (2.0.0rc7+CVS20041025) unstable; urgency=low + + * Now really fixed xas.pl + + -- Vollstrecker Mon, 25 Oct 2004 12:49:08 +0200 + +amule (2.0.0rc7+CVS20041024) unstable; urgency=low + + * xas.pl will no longer be compressed + + -- Vollstrecker Sun, 24 Oct 2004 23:36:59 +0200 + +amule (2.0.0rc7+CVS20041023-1) unstable; urgency=low + + * Splitted xas in a separate Package + Splitted cas in a separate Package + Splitted wxcas in a separate Package + Created group amule and moved packages from x11 to that + + -- Vollstrecker Sat, 23 Oct 2004 18:14:00 +0200 + +amule (2.0.0rc7-1) unstable; urgency=low + + * Initial Release. Based on the work of Julien Delange + + + -- Vollstrecker Fri, 8 Oct 2004 18:46:26 +0200 diff --git a/debian/compat b/debian/compat new file mode 100644 index 00000000..7ed6ff82 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +5 diff --git a/debian/control b/debian/control new file mode 100644 index 00000000..5885885b --- /dev/null +++ b/debian/control @@ -0,0 +1,473 @@ +Source: amule +Section: net +Priority: optional +Maintainer: Vollstrecker +Build-Depends: debhelper (>= 5.0.0), libglib2.0-dev, libgtk2.0-dev, zlib1g-dev, libwxgtk2.8-dev, libgd2-xpm-dev, bison, flex, libcrypto++-dev, libreadline5-dev, libgeoip-dev, libupnp-dev, binutils-dev +Standards-Version: 3.7.2.2 + +Package: amule +Architecture: any +Depends: ${shlibs:Depends}, amule-common (= ${binary:Version}), amule-i18n-en-gb (= ${binary:Version}) | amule-i18n +Recommends: amule-utils, amule-cas, amule-wxcas +Suggests: amule-xas, amule-ed2k +Description: aNOTHER eMule P2P Client + aMule stand for another eMule file-sharing program, it is also + another fork of the xMule project. It connects to eDonkey2000 + network, supports Linux, *BSD and MacOS X platforms, and has + a new vision of the GUI + +Package: amule-utils +Architecture: any +Depends: ${shlibs:Depends}, amule-common (= ${binary:Version}), amule-alcc (= ${binary:Version}), amule-cmd (= ${binary:Version}), amule-cas (= ${binary:Version}) +Recommends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) +Description: utilities for amule + amule-utils is a set of tools to control amule. + . + alcc lets you created ed2k-links and hashes from the commandline + cas is a remplacement software for astats. It produces statistic from amule. + amulecmd is a software which helps you to control amule trough a terminal. + +Package: amule-utils-gui +Architecture: any +Depends: ${shlibs:Depends}, amule-common (= ${binary:Version}), amule-alc (= ${binary:Version}), amule-remote-gui (= ${binary:Version}), amule-wxcas (= ${binary:Version}) +Recommends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) +Description: utilities for amule + amule-utils-gui is a set of tools to control amule. + . + This package depends on useful programs using GUI to control aMule. + . + alc is a software to created ed2k-links and hashes + amule trough a terminal. + amulegui lets you control amule or amuled from a remote machine + wxcas shows you statistics about your amule usage + +Package: amule-ed2k +Architecture: any +Depends: ${shlibs:Depends}, ${perl:Depends} +Recommends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}), xmule (<= 1.10.0b-1) +Description: amule ed2k link-handler + ed2k let you use ed2k Links with your amule-app + +Package: amule-cas +Architecture: any +Depends: ${shlibs:Depends}, amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) +Conflicts: amule-utils (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: reporting module for amule + cas reports statistics about amule on the console + +Package: amule-wxcas +Architecture: any +Depends: ${shlibs:Depends}, amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}), amule-i18n-en-gb (= ${binary:Version}) | amule-i18n +Conflicts: amule-utils (<< ${binary:Version}) +Description: reporting module for amule (graphical) + wxcas reports statistics about amule on your desktop, using wxlib + +Package: amule-xas +Architecture: any +Depends: ${perl:Depends}, amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}), xchat | xchat-text +Description: amule statistics for xchat + xas reports statistics about amule to IRC-Channels using XChat + +Package: amule-common +Architecture: any +Depends: ${shlibs:Depends} +Description: common files for amule + this packages contains common files for amule. atm only the + icon for the menu + +Package: amule-theme-default +Architecture: any +Provides: amule-web-templates +Depends: ${shlibs:Depends}, amuleweb (= ${binary:Version}) +Conflicts: amule-common (<< ${binary:Version}), amule (<< ${binary:Version}) +Description: the default template for the webserver + this package contains the default template for amulewebserver + +Package: amule-theme-php-default +Architecture: any +Provides: amule-web-templates +Depends: ${shlibs:Depends}, amuleweb (= ${binary:Version}) +Conflicts: amule-common (<< ${binary:Version}) +Description: the default template for the webserver + this package contains the default php template for amulewebserver + +Package: amule-theme-chicane +Architecture: any +Provides: amule-web-templates +Depends: ${shlibs:Depends}, amuleweb (= ${binary:Version}) +Conflicts: amule-common (<< ${binary:Version}), amule (<< ${binary:Version}) +Description: a new template set for the webserver + this package contains a new theme for amulewebserver + +Package: amuleweb +Architecture: any +Depends: ${shlibs:Depends}, amule-web-templates, amule-i18n-en-gb (= ${binary:Version}) | amule-i18n +Recommends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) +Conflicts: amule (<< ${binary:Version}), amule-daemon (<< ${binary:Version}) +Description: the webserver for amule + this is the webserver, which gives you full access to your amule client with + any webbrowser you want + +Package: amule-remote-gui +Architecture: any +Depends: ${shlibs:Depends}, amule-i18n-en-gb (= ${binary:Version}) | amule-i18n +Description: the remote gui for amule + this is the remote GUI for amule. You can use it on every machine to execute + commands on the main prog. You need a running amule or amuled on at least one + machine on the net. + +Package: amule-daemon +Architecture: any +Depends: ${shlibs:Depends}, amule-i18n-en-gb (= ${binary:Version}) | amule-i18n +Replaces: amuled (<< ${binary:Version}) +Conflicts: amule-daemon (<< ${binary:Version}) +Description: the amule daemon + amule-daemon can be used on computers, that don't have X11. You can connect to + it with the remote-GUI, the webserver or the commandline interface. + +Package: amule-alc +Architecture: any +Depends: ${shlibs:Depends}, amule-i18n-en-gb (= ${binary:Version}) | amule-i18n +Conflicts: amule-utils (<< ${binary:Version}) +Description: the amule-link-creator + amule-link-creator lets you create ed2k-links and hashes for a given file. + +Package: amule-alcc +Architecture: any +Depends: ${shlibs:Depends} +Conflicts: amule-utils (<< ${binary:Version}) +Description: the amule-link-creator (commandline-version) + amule-link-creator lets you create ed2k-links and hashes for a given file + from the commandline. + +Package: amule-cmd +Architecture: any +Depends: ${shlibs:Depends} +Conflicts: amule-utils (<< ${binary:Version}) +Description: the amule-commandline-client + amulecmd gives you control over a running amule-daemon or amule from + commandline. + +Package: amule-i18n-ar +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Arabic (ar) internationalized (i18n) files for amule + This package contains the Arabic internationalized files for amule. + +Package: amule-i18n-bg +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Bulgarian (bg) internationalized (i18n) files for amule + This package contains the Bulgarian internationalized files for amule. + +Package: amule-i18n-ca +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Catalan (ca) internationalized (i18n) files for amule + This package contains the Catalan internationalized files for amule. + +Package: amule-i18n-da +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Danish (da) internationalized (i18n) files for amule + This package contains the Danish internationalized files for amule. + +Package: amule-i18n-de +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: German (de) internationalized (i18n) files for amule + This package contains the German internationalized files for amule. + +Package: amule-i18n-en-gb +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: English (en_GB) internationalized (i18n) files for amule + This package contains the British-English internationalized files for amule. + +Package: amule-i18n-es +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Spanish (es) internationalized (i18n) files for amule + This package contains the Spanish internationalized files for amule. + +Package: amule-i18n-et-ee +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Estonian (et_EE) internationalized (i18n) files for amule + This package contains the Estonian internationalized files for amule. + +Package: amule-i18n-eu +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Basque (eu) internationalized (i18n) files for amule + This package contains the Basque internationalized files for amule. + +Package: amule-i18n-fi +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Finnish (fi) internationalized (i18n) files for amule + This package contains the Finnish internationalized files for amule. + +Package: amule-i18n-fr +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: French (fr) internationalized (i18n) files for amule + This package contains the French internationalized files for amule. + +Package: amule-i18n-gl +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Gallegan (gl) internationalized (i18n) files for amule + This package contains the Gallegan internationalized files for amule. + +Package: amule-i18n-hr +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Croatian (hr) internationalized (i18n) files for amule + This package contains the Croatian internationalized files for amule. + +Package: amule-i18n-hu +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Hungarian (hu) internationalized (i18n) files for amule + This package contains the Hungarian internationalized files for amule. + +Package: amule-i18n-it-ch +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Italian (it_CH) internationalized (i18n) files for amule + This package contains the Italian internationalized files for amule. + +Package: amule-i18n-it +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Italian (it) internationalized (i18n) files for amule + This package contains the Italian internationalized files for amule. + +Package: amule-i18n-ko-kr +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Korean (ko_KR) internationalized (i18n) files for amule + This package contains the Korean internationalized files for amule. + +Package: amule-i18n-lt +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Lithunian (lt) internationalized (i18n) files for amule + This package contains the Lithunian internationalized files for amule. + +Package: amule-i18n-nn +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Norwegian (Nyorsk) (nn) internationalized (i18n) files for amule + This package contains the Norwegian (Nyorsk) internationalized files for amule. + +Package: amule-i18n-nl +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Dutch (nl) internationalized (i18n) files for amule + This package contains the Dutch internationalized files for amule. + +Package: amule-i18n-pl +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Polish (pl) internationalized (i18n) files for amule + This package contains the Polish internationalized files for amule. + +Package: amule-i18n-pt-br +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Portuguese (pt_BR) internationalized (i18n) files for amule + This package contains the Portuguese internationalized files for amule. + +Package: amule-i18n-pt-pt +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Portuguese (pt_PT) internationalized (i18n) files for amule + This package contains the Portuguese internationalized files for amule. + +Package: amule-i18n-ru +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Russian (ru) internationalized (i18n) files for amule + This package contains the Russian internationalized files for amule. + +Package: amule-i18n-sl +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Slovenian (sl) internationalized (i18n) files for amule + This package contains the Slovenian internationalized files for amule. + +Package: amule-i18n-sv +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Swedish (sv) internationalized (i18n) files for amule + This package contains the Swedish internationalized files for amule. + +Package: amule-i18n-tr +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Turkish (tr) internationalized (i18n) files for amule + This package contains the Turkish internationalized files for amule. + +Package: amule-i18n-zh-cn +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Chinese (zh_CN) internationalized (i18n) files for amule + This package contains the Chinese internationalized files for amule. + +Package: amule-i18n-zh-tw +Architecture: any +Depends: amule (= ${binary:Version}) | amule-daemon (= ${binary:Version}) | amuleweb (= ${binary:Version}) | amule-alc (= ${binary:Version}) | amule-remote-gui (= ${binary:Version}) | amule-wxcas (= ${binary:Version}) +Provides: amule-i18n +Conflicts: amule (<< ${binary:Version}), amule-common (<< ${binary:Version}) +Description: Chinese (zh_TW) internationalized (i18n) files for amule + This package contains the Chinese internationalized files for amule. + +Package: amule-dbg +Architecture: any +Depends: ${shlibs:Depends} +Description: aNOTHER eMule P2P Client debugging symbols + this package contains the debugging symbols for the amule binary + +Package: amule-ed2k-dbg +Architecture: any +Depends: ${shlibs:Depends} +Description: amule ed2k link-handler debugging symbols + The debugging symbols for the ed2k binary + +Package: amule-cas-dbg +Architecture: any +Depends: ${shlibs:Depends} +Description: reporting module for amule debugging symbols + the debugging symbols for the cas binary + +Package: amule-wxcas-dbg +Architecture: any +Depends: ${shlibs:Depends} +Description: reporting module for amule (graphical) debugging symbols + the debugging symbols for the wxcas binary + +Package: amuleweb-dbg +Architecture: any +Depends: ${shlibs:Depends} +Description: the webserver for amule debugging symbols + the debugging symbols for the amuleweb binary + +Package: amule-remote-gui-dbg +Architecture: any +Description: the remote gui for amule debugging symbols + the debugging symbols for the amulegui binary + +Package: amule-daemon-dbg +Architecture: any +Depends: ${shlibs:Depends} +Description: the amule daemon debugging symbols + the debugging symbols for the amuled binary + +Package: amule-alc-dbg +Architecture: any +Depends: ${shlibs:Depends} +Description: the amule-link-creator debugging symbols + the debugging symbols for the alc binary + +Package: amule-alcc-dbg +Architecture: any +Depends: ${shlibs:Depends} +Description: the amule-link-creator (commandline-version) debugging symbols + the debugging symbols for the alcc binary + +Package: amule-cmd-dbg +Architecture: any +Depends: ${shlibs:Depends} +Description: the amule-commandline-client-dbg + the debugging symbols for the amulecmd binary + +Package: amule-skin-gnome +Architecture: any +Depends: amule (= ${binary:Version}) +Provides: amule-skin +Conflicts: amule (<< ${binary:Version}) +Description: Gnome Skin files for amule + This package contains the Gnome Skin files for amule. + +Package: amule-skin-kde4 +Architecture: any +Depends: amule (= ${binary:Version}) +Provides: amule-skin +Conflicts: amule (<< ${binary:Version}) +Description: KDE4 Skin files for amule + This package contains the KDE4 Skin files for amule. + +Package: amule-skin-tango +Architecture: any +Depends: amule (= ${binary:Version}) +Provides: amule-skin +Conflicts: amule (<< ${binary:Version}) +Description: Tango Skin files for amule + This package contains the Tango Skin files for amule. + +Package: amule-skin-xfce +Architecture: any +Depends: amule (= ${binary:Version}) +Provides: amule-skin +Conflicts: amule (<< ${binary:Version}) +Description: Xfce Skin files for amule + This package contains the Xfce Skin files for amule. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 00000000..57981f88 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,14 @@ +This package was debianized by Vollstrecker +on Sat, 09 Oct 2004 13:46:07 +0200. + +It was downloaded from http://www.amule.org + +Upstream Author: Kry + +Copyright: + + 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; version 2 dated June, 1991. + + See /usr/share/common-licenses/GPL. diff --git a/debian/rules b/debian/rules new file mode 100755 index 00000000..631144ed --- /dev/null +++ b/debian/rules @@ -0,0 +1,857 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# This file was originally written by Vollstrecker + +# Uncomment this to turn on verbose mode. +export DH_VERBOSE=1 + + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + +CFLAGS = -Wall -g + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif + +#Here are the packages that can't be compiled separate now +general_pkgs = "amule-common"\ + "amule-skin-gnome"\ + "amule-skin-kde4"\ + "amule-skin-tango"\ + "amule-skin-xfce"\ + "amule-theme-default"\ + "amule-theme-php-default"\ + "amule-theme-chicane"\ + "amule-xas" + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif + +# First, get the targets from commandline +flags = ${MAKECMDGOALS} + +#First we have to find out, if we are called from dpkg-buildpackage + +ifeq ("binary", "$(findstring binary, $(flags))") + + WXCAS = --enable-wxcas + CAS = --enable-cas + WEBSERVER = --enable-webserver + REMOTEGUI = --enable-amule-gui + DAEMON = --enable-amule-daemon + ALCC = --enable-alcc + ALC = --enable-alc + AMULECMD = --enable-amulecmd + DEBUGGING = --enable-debug --disable-optimise --disable-profile + LANGFLAG = --with-language=all + +else ifeq ("clean", "$(findstring clean, $(flags))") + + WXCAS = --enable-wxcas + CAS = --enable-cas + WEBSERVER = --enable-webserver + REMOTEGUI = --enable-amule-gui + DAEMON = --enable-amule-daemon + ALCC = --enable-alcc + ALC = --enable-alc + AMULECMD = --enable-amulecmd + DEBUGGING = --enable-debug --disable-optimise --disable-profile + LANGFLAG = --with-language=all + +else ifeq ("build", "$(findstring build, $(flags))") + + WXCAS = --enable-wxcas + CAS = --enable-cas + WEBSERVER = --enable-webserver + REMOTEGUI = --enable-amule-gui + DAEMON = --enable-amule-daemon + ALCC = --enable-alcc + ALC = --enable-alc + AMULECMD = --enable-amulecmd + DEBUGGING = --enable-debug --disable-optimise --disable-profile + LANGFLAG = --with-language=all + +else + #Now we have to check what packages are build to configure only them + + #We have to filter the right targets (wo_ means without) + wo_wxcas = $(subst wxcas, , ${flags}) + wo_alcc = $(subst alcc, , ${flags}) + wo_amule_utils_gui = $(subst amule-utils-gui, ,${flags}) + wo_all_other_amules = $(subst amulecmd, ,$(subst amule-utils-gui, ,$(subst amule-utils, ,${flags}))) + LANGUAGE := en_GB + + ifeq ("wxcas", "$(findstring wxcas, $(flags))") + WXCAS = --enable-wxcas + endif + + ifeq ("cas", "$(findstring cas, $(wo_wxcas))") + CAS = --enable-cas + endif + + ifeq ("webserver", "$(findstring webserver, $(flags))") + WEBSERVER = --enable-webserver + endif + + ifeq ("remotegui", "$(findstring remotegui, $(flags))") + REMOTEGUI = --enable-amule-gui + endif + + ifeq ("daemon", "$(findstring daemon, $(flags))") + DAEMON = --enable-amule-daemon + endif + + ifeq ("alcc", "$(findstring alcc, $(flags))") + ALCC = --enable-alcc + endif + + ifeq ("alc", "$(findstring alc, $(wo_alcc))") + ALC = --enable-alc + endif + + ifeq ("amulecmd", "$(findstring amulecmd, $(flags))") + AMULECMD = --enable-amulecmd + endif + + ifneq ("amule", "$(findstring amule, $(wo_all_other_amules))") + AMULE = --disable-monolithic + endif + + ifneq ("ed2k", "$(findstring ed2k, $(flags))") + ED2K = --disable-ed2k + endif + + #Now find out if a Metapackage should be build + ifeq ("amule-utils-gui", "$(findstring amule-utils-gui, $(flags))") + ALC = --enable-alc + REMOTEGUI = --enable-amule-gui + WXCAS = --enable-wxcas + endif + + ifeq ("amule-utils", "$(findstring amule-utils, $(wo_amule_utils_gui))") + ALCC = --enable-alcc + AMULECMD = --enable-amulecmd + CAS = --enable-cas + endif + + #Find this whole i18n stuff + ifneq ("i18n-en-only", "$(findstring i18n-en-only, $(flags))") + + ifeq ("i18n-ar", "$(findstring i18n-ar, $(flags))") + LANGUAGE := $(LANGUAGE),ar + endif + + ifeq ("i18n-bg", "$(findstring i18n-bg, $(flags))") + LANGUAGE := $(LANGUAGE),bg + endif + + ifeq ("i18n-ca", "$(findstring i18n-ca, $(flags))") + LANGUAGE := $(LANGUAGE),ca + endif + + ifeq ("i18n-da", "$(findstring i18n-da, $(flags))") + LANGUAGE := $(LANGUAGE),da + endif + + ifeq ("i18n-de", "$(findstring i18n-de, $(flags))") + LANGUAGE := $(LANGUAGE),de + endif + + ifeq ("i18n-es", "$(findstring i18n-es, $(flags))") + LANGUAGE := $(LANGUAGE),es + endif + + ifeq ("i18n-et-ee", "$(findstring i18n-et-ee, $(flags))") + LANGUAGE := $(LANGUAGE),et_EE + endif + + ifeq ("i18n-eu", "$(findstring i18n-eu, $(flags))") + LANGUAGE := $(LANGUAGE),eu + endif + + ifeq ("i18n-fi", "$(findstring i18n-fi, $(flags))") + LANGUAGE := $(LANGUAGE),fi + endif + + ifeq ("i18n-fr", "$(findstring i18n-fr, $(flags))") + LANGUAGE := $(LANGUAGE),fr + endif + + ifeq ("i18n-gl", "$(findstring i18n-gl, $(flags))") + LANGUAGE := $(LANGUAGE),gl + endif + + ifeq ("i18n-hr", "$(findstring i18n-hr, $(flags))") + LANGUAGE := $(LANGUAGE),hr + endif + + ifeq ("i18n-hu", "$(findstring i18n-hu, $(flags))") + LANGUAGE := $(LANGUAGE),hu + endif + + ifeq ("i18n-it", "$(findstring i18n-it, $(flags))") + LANGUAGE := $(LANGUAGE),it + endif + + ifeq ("i18n-it-ch", "$(findstring i18n-it-ch, $(flags))") + LANGUAGE := $(LANGUAGE),it_CH + endif + + ifeq ("i18n-ko-kr", "$(findstring i18n-ko-kr, $(flags))") + LANGUAGE := $(LANGUAGE),ko_KR + endif + + ifeq ("i18n-lt", "$(findstring i18n-lt, $(flags))") + LANGUAGE := $(LANGUAGE),lt + endif + + ifeq ("i18n-nl", "$(findstring i18n-nl, $(flags))") + LANGUAGE := $(LANGUAGE),hl + endif + + ifeq ("i18n-nn", "$(findstring i18n-nn, $(flags))") + LANGUAGE := $(LANGUAGE),nn + endif + + ifeq ("i18n-pl", "$(findstring i18n-pl, $(flags))") + LANGUAGE := $(LANGUAGE),pl + endif + + ifeq ("i18n-pt-br", "$(findstring i18n-pt-br, $(flags))") + LANGUAGE := $(LANGUAGE),pt_BR + endif + + ifeq ("i18n-pt-pt", "$(findstring i18n-pt-pt, $(flags))") + LANGUAGE := $(LANGUAGE),pt_PT + endif + + ifeq ("i18n-ru", "$(findstring i18n-ru, $(flags))") + LANGUAGE := $(LANGUAGE),ru + endif + + ifeq ("i18n-sl", "$(findstring i18n-sl, $(flags))") + LANGUAGE := $(LANGUAGE),sl + endif + + ifeq ("i18n-sv", "$(findstring i18n-sv, $(flags))") + LANGUAGE := $(LANGUAGE),sv + endif + + ifeq ("i18n-tr", "$(findstring i18n-tr, $(flags))") + LANGUAGE := $(LANGUAGE),tr + endif + + ifeq ("i18n-zh-cn", "$(findstring i18n-zh-cn, $(flags))") + LANGUAGE := $(LANGUAGE),zh_CN + endif + + ifeq ("i18n-zh-tw", "$(findstring i18n-zh-tw, $(flags))") + LANGUAGE := $(LANGUAGE),zh_TW + endif + + ifeq ($(LANGUAGE),en_GB) + LANGUAGE = all + endif + + endif + + LANGFLAG = --with-language=$(LANGUAGE) + + #And at Last, find out if we compile a debug-package or not. + ifeq ("dbg", "$(findstring dbg, $(flags))") + DEBUGGING = --enable-debug --disable-optimise --disable-profile + else + DEBUGGING = --disable-debug --enable-optimize --enable-profile + endif +endif + +#Before we start, I want to introduce two sequences for building the packages +#I define two, so I can put the commands for the *-dbg packages between them +define stage1 + dh_testdir -p${pkg} + dh_testroot -p${pkg} + dh_installdirs -p${pkg} + dh_installchangelogs docs/Changelog -p${pkg} + dh_installdocs -p${pkg} + dh_install -Xlicense.txt -p${pkg} + dh_installmenu -p${pkg} + dh_installdebconf -p${pkg} + dh_installman -p${pkg} + dh_link -p${pkg} + install -D --mode=644 debian/${pkg}.override debian/${pkg}/usr/share/lintian/overrides/${pkg} + touch $@ +endef + +define stage2 + dh_compress -X.pl -p${pkg} + dh_perl -p${pkg} + dh_makeshlibs -p${pkg} + dh_installdeb -p${pkg} + dh_shlibdeps -p${pkg} + dh_gencontrol -p${pkg} + dh_md5sums -p${pkg} + dh_fixperms -p${pkg} + dh_builddeb -p${pkg} + touch $@ +endef + +#Now we configure this whole thing +config.status: configure + dh_testdir + CFLAGS="$(CFLAGS)" ./configure\ + --host=$(DEB_HOST_GNU_TYPE)\ + --build=$(DEB_BUILD_GNU_TYPE)\ + --prefix=/usr\ + --mandir=\$${prefix}/share/man\ + --infodir=\$${prefix}/share/info\ + --enable-systray\ + --with-ccache\ + --enable-utf8-systray\ + --enable-geoip\ + --disable-embedded-crypto\ + ${AMULECMD}\ + ${DEBUGGING}\ + ${WEBSERVER}\ + ${CAS}\ + ${WXCAS}\ + ${ALC}\ + ${ALCC}\ + ${REMOTEGUI}\ + ${DAEMON}\ + ${AMULE}\ + ${ED2K}\ + $(LANGFLAG) + + +#And here is the well known clean target +clean: + dh_testdir + dh_testroot + rm -f alc + rm -f alc-dbg + rm -f alcc + rm -f alcc-dbg + rm -f amule + rm -f amule-alc-dbg + rm -f amule-alc-stage1 + rm -f amule-alc-stage2 + rm -f amule-alcc-dbg + rm -f amule-alcc-stage1 + rm -f amule-alcc-stage2 + rm -f amule-cas-dbg + rm -f amule-cas-stage1 + rm -f amule-cas-stage2 + rm -f amule-cmd-dbg + rm -f amule-cmd-stage1 + rm -f amule-cmd-stage2 + rm -f amule-common + rm -f amule-daemon-dbg + rm -f amule-daemon-stage1 + rm -f amule-daemon-stage2 + rm -f amule-dbg + rm -f amule-ed2k-dbg + rm -f amule-ed2k-stage1 + rm -f amule-ed2k-stage2 + rm -f amule-remote-gui-dbg + rm -f amule-remote-gui-stage1 + rm -f amule-remote-gui-stage2 + rm -f amule-stage1 + rm -f amule-stage2 + rm -f amule-utils + rm -f amule-utils-gui + rm -f amule-wxcas-dbg + rm -f amule-wxcas-stage1 + rm -f amule-wxcas-stage2 + rm -f amulecmd + rm -f amulecmd-dbg + rm -f amuleweb-stage1 + rm -f amuleweb-stage2 + rm -f amuleweb-dbg + rm -f build-stamp + rm -f cas + rm -f cas-dbg + rm -f compile + rm -f daemon + rm -f daemon-dbg + rm -f ed2k + rm -f ed2k-dbg + rm -f i18n-ar + rm -f i18n-bg + rm -f i18n-ca + rm -f i18n-da + rm -f i18n-de + rm -f i18n-en-gb + rm -f i18n-es + rm -f i18n-et-ee + rm -f i18n-eu + rm -f i18n-fi + rm -f i18n-fr + rm -f i18n-gl + rm -f i18n-hr + rm -f i18n-hu + rm -f i18n-it + rm -f i18n-it-ch + rm -f i18n-ko-kr + rm -f i18n-lt + rm -f i18n-nl + rm -f i18n-nn + rm -f i18n-pl + rm -f i18n-pt-br + rm -f i18n-pt-pt + rm -f i18n-ru + rm -f i18n-sl + rm -f i18n-sv + rm -f i18n-tr + rm -f i18n-zh-cn + rm -f i18n-zh-tw + rm -f remotegui + rm -f remotegui-dbg + rm -f webserver + rm -f webserver-dbg + rm -f wxcas + rm -f wxcas-dbg + + [ ! -f Makefile ] || $(MAKE) distclean + +ifneq "$(wildcard /usr/share/misc/config.sub)" "" + cp -f /usr/share/misc/config.sub config.sub +endif +ifneq "$(wildcard /usr/share/misc/config.guess)" "" + cp -f /usr/share/misc/config.guess config.guess +endif + + rm -f debian/files + dh_clean -k + +#Some generic targets to check the build process +build: build-stamp + +build-stamp: config.status + dh_testdir + + # Add here commands to compile the package. + $(MAKE) + + touch build-stamp + +#Now we install the packages all together to the tmp-dir inside of debian/ +install: build + dh_testdir + dh_testroot + dh_clean -a -k + dh_installdirs + + $(MAKE) install DESTDIR=$(CURDIR)/debian/tmp + +#Now first build the packages that are compiled and installed on every build +amule-common: install + + for pkg in $(general_pkgs); do \ + dh_testdir -p$$pkg; \ + dh_testroot -p$$pkg; \ + dh_installdirs -p$$pkg; \ + dh_installchangelogs docs/Changelog -p$$pkg; \ + dh_installdocs -p$$pkg; \ + dh_install -Xlicense.txt -p$$pkg; \ + dh_installmenu -p$$pkg; \ + dh_installdebconf -p$$pkg; \ + dh_installman -p$$pkg; \ + dh_link -p$$pkg; \ + install -D --mode=644 debian/$$pkg.override debian/$$pkg/usr/share/lintian/overrides/$$pkg; \ + dh_compress -X.pl -p$$pkg; \ + dh_perl -p$$pkg; \ + dh_makeshlibs -p$$pkg; \ + dh_installdeb -p$$pkg; \ + dh_shlibdeps -p$$pkg; \ + dh_gencontrol -p$$pkg; \ + dh_md5sums -p$$pkg; \ + dh_fixperms -p$$pkg; \ + dh_builddeb -p$$pkg; \ + done + touch amule-common + +amule-stage1: pkg=amule +amule-stage1: amule-common + ${stage1} + +amule-stage2: pkg=amule +amule-stage2: amule-stage1 + ${stage2} + +amule-ed2k-stage1: pkg=amule-ed2k +amule-ed2k-stage1: amule-common + ${stage1} + +amule-ed2k-stage2: pkg=amule-ed2k +amule-ed2k-stage2: amule-ed2k-stage1 + ${stage2} + +amule-cas-stage1: pkg=amule-cas +amule-cas-stage1: amule-common + ${stage1} + +amule-cas-stage2: pkg=amule-cas +amule-cas-stage2: amule-cas-stage1 + ${stage2} + +amule-wxcas-stage1: pkg=amule-wxcas +amule-wxcas-stage1: amule-common + ${stage1} + +amule-wxcas-stage2: pkg=amule-wxcas +amule-wxcas-stage2: amule-wxcas-stage1 + ${stage2} + +amuleweb-stage1: pkg=amuleweb +amuleweb-stage1: amule-common + ${stage1} + +amuleweb-stage2: pkg=amuleweb +amuleweb-stage2: amuleweb-stage1 + ${stage2} + +amule-remote-gui-stage1: pkg=amule-remote-gui +amule-remote-gui-stage1: amule-common + ${stage1} + +amule-remote-gui-stage2: pkg=amule-remote-gui +amule-remote-gui-stage2: amule-remote-gui-stage1 + ${stage2} + +amule-daemon-stage1: pkg=amule-daemon +amule-daemon-stage1: amule-common + ${stage1} + +amule-daemon-stage2: pkg=amule-daemon +amule-daemon-stage2: amule-daemon-stage1 + ${stage2} + +amule-alc-stage1: pkg=amule-alc +amule-alc-stage1: amule-common + ${stage1} + +amule-alc-stage2: pkg=amule-alc +amule-alc-stage2: amule-alc-stage1 + ${stage2} + +amule-alcc-stage1: pkg=amule-alcc +amule-alcc-stage1: amule-common + ${stage1} + +amule-alcc-stage2: pkg=amule-alcc +amule-alcc-stage2: amule-alcc-stage1 + ${stage2} + +amule-cmd-stage1: pkg=amule-cmd +amule-cmd-stage1: amule-common + ${stage1} + +amule-cmd-stage2: pkg=amule-cmd +amule-cmd-stage2: amule-alcc-stage1 + ${stage2} + + +amule-ed2k-dbg: pkg=amule-ed2k-dbg +amule-ed2k-dbg: amule-ed2k-stage1 + ${stage1} + dh_strip -pamule-ed2k --dbg-package=amule-ed2k-dbg + ${stage2} + +amule-cas-dbg: pkg=amule-cas-dbg +amule-cas-dbg: amule-cas-stage1 + ${stage1} + dh_strip -pamule-cas --dbg-package=amule-cas-dbg + ${stage2} + +amule-wxcas-dbg: pkg=amule-wxcas-dbg +amule-wxcas-dbg: amule-wxcas-stage1 + ${stage1} + dh_strip -pamule-wxcas --dbg-package=amule-wxcas-dbg + ${stage2} + +amuleweb-dbg: pkg=amuleweb-dbg +amuleweb-dbg: amuleweb-stage1 + ${stage1} + dh_strip -pamuleweb --dbg-package=amuleweb-dbg + ${stage2} + +amule-remote-gui-dbg: pkg=amule-remote-gui-dbg +amule-remote-gui-dbg: amule-remote-gui-stage1 + ${stage1} + dh_strip -pamule-remote-gui --dbg-package=amule-remote-gui-dbg + ${stage2} + +amule-daemon-dbg: pkg=amule-daemon-dbg +amule-daemon-dbg: amule-daemon-stage1 + ${stage1} + dh_strip -pamule-daemon --dbg-package=amule-daemon-dbg + ${stage2} + +amule-alc-dbg: pkg=amule-alc-dbg +amule-alc-dbg: amule-alc-stage1 + ${stage1} + dh_strip -pamule-alc --dbg-package=amule-alc-dbg + ${stage2} + +amule-alcc-dbg: pkg=amule-alcc-dbg +amule-alcc-dbg: amule-alcc-stage1 + ${stage1} + dh_strip -pamule-alcc --dbg-package=amule-alcc-dbg + ${stage2} + +amule-cmd-dbg: pkg=amule-cmd-dbg +amule-cmd-dbg: amule-cmd-stage1 + ${stage1} + dh_strip -pamule-cmd --dbg-package=amule-cmd-dbg + ${stage2} + +#Now just the targets to map the Commandline Name to the package names +amule: amule-stage2 + touch amule + +ed2k: amule-ed2k-stage2 + touch ed2k + +cas: amule-cas-stage2 + touch cas + +wxcas: amule-wxcas-stage2 + touch wxcas + +webserver: amuleweb-stage2 + touch webserver + +remotegui: amule-remote-gui-stage2 + touch remotegui + +daemon: amule-daemon-stage2 + touch daemon + +alc: amule-alc-stage2 + touch alc + +alcc: amule-alcc-stage2 + touch alcc + +amulecmd: amule-cmd-stage2 + touch amulecmd + +ed2k-dbg: amule-ed2k-dbg + touch ed2k-dbg + +cas-dbg: amule-cas-dbg + touch cas-dbg + +wxcas-dbg: amule-wxcas-dbg + touch wxcas-dbg + +webserver-dbg: amuleweb-dbg + touch webserver-dbg + +remotegui-dbg: amule-remote-gui-dbg + touch remotegui-dbg + +daemon-dbg: amule-daemon-dbg + touch daemon-dbg + +alc-dbg: amule-alc-dbg + touch alc-dbg + +alcc-dbg: amule-alcc-dbg + touch alcc-dbg + +amulecmd-dbg: amule-cmd-dbg + touch amulecmd-dbg + +amule-dbg: pkg=amule-dbg +amule-dbg: amule-stage1 + ${stage1} + dh_strip -pamule --dbg-package=amule-dbg + ${stage2} + +#Her come the Targets for the langauge packages +i18n-ar: pkg=amule-i18n-ar +i18n-ar: amule-common + ${stage1} + ${stage2} + +i18n-bg: pkg=amule-i18n-bg +i18n-bg: amule-common + ${stage1} + ${stage2} + +i18n-ca: pkg=amule-i18n-ca +i18n-ca: amule-common + ${stage1} + ${stage2} + +i18n-da: pkg=amule-i18n-da +i18n-da: amule-common + ${stage1} + ${stage2} + +i18n-de: pkg=amule-i18n-de +i18n-de: amule-common + ${stage1} + ${stage2} + +i18n-en-gb: pkg=amule-i18n-en-gb +i18n-en-gb: amule-common + ${stage1} + ${stage2} + +i18n-es: pkg=amule-i18n-es +i18n-es: amule-common + ${stage1} + ${stage2} + +i18n-et-ee: pkg=amule-i18n-et-ee +i18n-et-ee: amule-common + ${stage1} + ${stage2} + +i18n-eu: pkg=amule-i18n-eu +i18n-eu: amule-common + ${stage1} + ${stage2} + +i18n-fi: pkg=amule-i18n-fi +i18n-fi: amule-common + ${stage1} + ${stage2} + +i18n-fr: pkg=amule-i18n-fr +i18n-fr: amule-common + ${stage1} + ${stage2} + +i18n-gl: pkg=amule-i18n-gl +i18n-gl: amule-common + ${stage1} + ${stage2} + +i18n-hr: pkg=amule-i18n-hr +i18n-hr: amule-common + ${stage1} + ${stage2} + +i18n-hu: pkg=amule-i18n-hu +i18n-hu: amule-common + ${stage1} + ${stage2} + +i18n-it-ch: pkg=amule-i18n-it-ch +i18n-it-ch: amule-common + ${stage1} + ${stage2} + +i18n-it: pkg=amule-i18n-it +i18n-it: amule-common + ${stage1} + ${stage2} + +i18n-ko-kr: pkg=amule-i18n-ko-kr +i18n-ko-kr: amule-common + ${stage1} + ${stage2} + +i18n-lt: pkg=amule-i18n-lt +i18n-lt: amule-common + ${stage1} + ${stage2} + +i18n-nn: pkg=amule-i18n-nn +i18n-nn: amule-common + ${stage1} + ${stage2} + +i18n-nl: pkg=amule-i18n-nl +i18n-nl: amule-common + ${stage1} + ${stage2} + +i18n-pl: pkg=amule-i18n-pl +i18n-pl: amule-common + ${stage1} + ${stage2} + +i18n-pt-br: pkg=amule-i18n-pt-br +i18n-pt-br: amule-common + ${stage1} + ${stage2} + +i18n-pt-pt: pkg=amule-i18n-pt-pt +i18n-pt-pt: amule-common + ${stage1} + ${stage2} + +i18n-ru: pkg=amule-i18n-ru +i18n-ru: amule-common + ${stage1} + ${stage2} + +i18n-sl: pkg=amule-i18n-sl +i18n-sl: amule-common + ${stage1} + ${stage2} + +i18n-sv: pkg=amule-i18n-sv +i18n-sv: amule-common + ${stage1} + ${stage2} + +i18n-tr: pkg=amule-i18n-tr +i18n-tr: amule-common + ${stage1} + ${stage2} + +i18n-zh-cn: pkg=amule-i18n-zh-cn +i18n-zh-cn: amule-common + ${stage1} + ${stage2} + +i18n-zh-tw: pkg=amule-i18n-zh-tw +i18n-zh-tw: amule-common + ${stage1} + ${stage2} + +#They are just metapackages +amule-utils: pkg=amule-utils +amule-utils: alcc amulecmd cas + ${stage1} + ${stage2} + +amule-utils-gui: pkg=amule-utils-gui +amule-utils-gui: alc remotegui wxcas + ${stage1} + ${stage2} + +#These Two are empty (Space after Semicolon) +debug-packages: amule-dbg ed2k-dbg cas-dbg wxcas-dbg webserver-dbg remotegui-dbg daemon-dbg alc-dbg alcc-dbg amulecmd-dbg ; +normal-packages: amule-utils amule-utils-gui amule ed2k webserver daemon ; + +language-packages: i18n-ar i18n-bg i18n-ca i18n-da i18n-de i18n-en-gb i18n-es i18n-et-ee i18n-eu i18n-fi i18n-fr i18n-gl i18n-hr i18n-hu i18n-it-ch i18n-it i18n-ko-kr i18n-lt i18n-nn i18n-nl i18n-pl i18n-pt-br i18n-pt-pt i18n-ru i18n-sl i18n-sv i18n-tr i18n-zh-cn i18n-zh-tw ; + +i18n-en-only: ; + +#Now the targets for dpkg-buildpackage +binary-indep: build install + +binary-arch: debug-packages normal-packages language-packages + +binary: binary-indep binary-arch + +help: + cat README.Debian-Packages + +.DEFAULT_GOAL = help +.PHONY: build clean binary-indep binary-arch binary install debug-packages normal-packages amule-utils-gui amule-utils i18n-only language-packages diff --git a/depcomp b/depcomp new file mode 100755 index 00000000..ffcd540c --- /dev/null +++ b/depcomp @@ -0,0 +1,529 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2005-02-09.22 + +# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. + +# 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, 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. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. + "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> $depfile + echo >> $depfile + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> $depfile + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` + tmpdepfile="$stripped.u" + if test "$libtool" = yes; then + "$@" -Wc,-M + else + "$@" -M + fi + stat=$? + + if test -f "$tmpdepfile"; then : + else + stripped=`echo "$stripped" | sed 's,^.*/,,'` + tmpdepfile="$stripped.u" + fi + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + + if test -f "$tmpdepfile"; then + outname="$stripped.o" + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" + sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mecanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no + for arg in "$@"; do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix="`echo $object | sed 's/^.*\././'`" + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + "$@" || exit $? + IFS=" " + for arg + do + case "$arg" in + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/docs/ABOUT-NLS b/docs/ABOUT-NLS new file mode 100644 index 00000000..d528f9c8 --- /dev/null +++ b/docs/ABOUT-NLS @@ -0,0 +1,435 @@ +Notes on the Free Translation Project +************************************* + + Free software is going international! The Free Translation Project +is a way to get maintainers of free software, translators, and users all +together, so that will gradually become able to speak many languages. +A few packages already provide translations for their messages. + + If you found this `ABOUT-NLS' file inside a distribution, you may +assume that the distributed package does use GNU `gettext' internally, +itself available at your nearest GNU archive site. But you do _not_ +need to install GNU `gettext' prior to configuring, installing or using +this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work at translations should contact the appropriate team. + + When reporting bugs in the `intl/' directory or bugs which may be +related to internationalization, you should tell about the version of +`gettext' which is used. The information can be found in the +`intl/VERSION' file, in internationalized packages. + +Quick configuration advice +========================== + + If you want to exploit the full power of internationalization, you +should configure it using + + ./configure --with-included-gettext + +to force usage of internationalizing routines provided within this +package, despite the existence of internationalizing capabilities in the +operating system where this package is being installed. So far, only +the `gettext' implementation in the GNU C library version 2 provides as +many features (such as locale alias, message inheritance, automatic +charset conversion or plural form handling) as the implementation here. +It is also not possible to offer this additional functionality on top +of a `catgets' implementation. Future versions of GNU `gettext' will +very likely convey even more functionality. So it might be a good idea +to change to GNU `gettext' as soon as possible. + + So you need _not_ provide this option if you are using GNU libc 2 or +you have installed a recent copy of the GNU gettext package with the +included `libintl'. + +INSTALL Matters +=============== + + Some packages are "localizable" when properly installed; the +programs they contain can be made to speak your own native language. +Most such packages use GNU `gettext'. Other packages have their own +ways to internationalization, predating GNU `gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system already +provides the GNU `gettext' functions. If not, the GNU `gettext' own +library will be used. This library is wholly contained within this +package, usually in the `intl/' subdirectory, so prior installation of +the GNU `gettext' package is _not_ required. Installers may use +special options at configuration time for changing the default +behaviour. The commands: + + ./configure --with-included-gettext + ./configure --disable-nls + +will respectively bypass any pre-existing `gettext' to use the +internationalizing routines provided within this package, or else, +_totally_ disable translation of messages. + + When you already have GNU `gettext' installed on your system and run +configure without an option for your new package, `configure' will +probably detect the previously built and installed `libintl.a' file and +will decide to use this. This might be not what is desirable. You +should use the more recent version of the GNU `gettext' library. I.e. +if the file `intl/VERSION' shows that the library which comes with this +package is more recent, you should use + + ./configure --with-included-gettext + +to prevent auto-detection. + + The configuration process will not test for the `catgets' function +and therefore it will not be used. The reason is that even an +emulation of `gettext' on top of `catgets' could not provide all the +extensions of the GNU `gettext' library. + + Internationalized packages have usually many `po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at `configure' time by using the +`--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable `LINGUAS' +may be set, prior to configuration, to limit the installed set. +`LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +Using This Package +================== + + As a user, if your language has been installed for this package, you +only have to set the `LANG' environment variable to the appropriate +`LL_CC' combination. Here `LL' is an ISO 639 two-letter language code, +and `CC' is an ISO 3166 two-letter country code. For example, let's +suppose that you speak German and live in Germany. At the shell +prompt, merely execute `setenv LANG de_DE' (in `csh'), +`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). +This can be done from your `.login' or `.profile' file, once and for +all. + + You might think that the country code specification is redundant. +But in fact, some languages have dialects in different countries. For +example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The +country code serves to distinguish the dialects. + + The locale naming convention of `LL_CC', with `LL' denoting the +language and `CC' denoting the country, is the one use on systems based +on GNU libc. On other systems, some variations of this scheme are +used, such as `LL' or `LL_CC.ENCODING'. You can get the list of +locales supported by your system for your country by running the command +`locale -a | grep '^LL''. + + Not all programs have translations for all languages. By default, an +English message is shown in place of a nonexistent translation. If you +understand other languages, you can set up a priority list of languages. +This is done through a different environment variable, called +`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' +for the purpose of message handling, but you still need to have `LANG' +set to the primary language; this is required by other parts of the +system libraries. For example, some Swedish users who would rather +read translations in German than English for when Swedish is not +available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. + + In the `LANGUAGE' environment variable, but not in the `LANG' +environment variable, `LL_CC' combinations can be abbreviated as `LL' +to denote the language's main dialect. For example, `de' is equivalent +to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' +(Portuguese as spoken in Portugal) in this context. + +Translating Teams +================= + + For the Free Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list. The up-to-date list of +teams can be found at the Free Translation Project's homepage, +`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams" +area. + + If you'd like to volunteer to _work_ at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is _not_ the same as the list itself, it has +`-request' appended. For example, speakers of Swedish can send a +message to `sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate +_actively_ in translations, or at solving translational difficulties, +rather than merely lurking around. If your team does not exist yet and +you want to start one, or if you are unsure about what to do or how to +get started, please write to `translation@iro.umontreal.ca' to reach the +coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology in use. Proven linguistic skill are praised more than +programming skill, here. + +Available Packages +================== + + Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of August +2002. The matrix shows, in regard of each package, for which languages +PO files have been submitted to translation coordination, with a +translation percentage of at least 50%. + + Ready PO files be bg ca cs da de el en eo es et fi fr + +----------------------------------------+ + a2ps | [] [] [] [] | + ap-utils | | + bash | [] [] [] [] | + bfd | [] [] | + binutils | [] [] | + bison | [] [] [] [] | + clisp | | + clisp | [] [] [] [] | + clisplow | | + cpio | [] [] [] [] | + darkstat | () | + diffutils | [] [] [] [] [] [] | + enscript | [] [] | + error | [] [] [] | + fetchmail | [] () [] [] [] () | + fileutils | [] [] [] [] [] | + findutils | [] [] [] [] [] [] | + flex | [] [] [] [] [] | + gas | [] [] | + gawk | [] [] [] | + gcal | [] [] | + gcc | [] [] | + gettext | [] [] [] [] [] | + gnupg | [] [] [] [] [] [] [] | + gprof | [] [] | + gpsdrive | () () () () () | + grep | [] [] [] [] [] [] [] [] | + gretl | [] | + gthumb | () () () | + hello | [] [] [] [] [] [] [] [] [] | + id-utils | [] [] [] | + indent | [] [] [] [] [] | + jpilot | () [] [] [] | + jwhois | [] [] | + kbd | [] [] [] | + ld | [] [] | + libc | [] [] [] [] [] [] [] [] | + libiconv | [] [] [] [] | + lifelines | () () | + lilypond | [] [] | + lingoteach | [] [] | + lingoteach_lessons| () () | + lynx | [] [] [] [] [] | + m4 | [] [] [] [] [] | + make | [] [] [] [] | + man-db | [] () () [] () () | + mysecretdiary | [] [] [] | + nano | [] () [] [] [] [] | + nano_1_0 | [] () [] [] [] [] | + opcodes | [] [] [] | + parted | [] [] [] [] [] | + ptx | [] [] [] [] [] [] [] | + python | | + recode | [] [] [] [] [] [] | + sed | [] [] [] [] [] [] [] [] [] [] | + sh-utils | [] [] [] [] | + sharutils | [] [] [] [] [] [] [] | + sketch | () [] () | + soundtracker | [] [] [] | + sp | [] | + tar | [] [] [] [] [] [] | + texinfo | [] [] [] [] [] | + textutils | [] [] [] [] [] | + util-linux | [] [] [] [] [] [] | + vorbis-tools | [] | + wastesedge | | + wdiff | [] [] [] [] [] [] | + wget | [] [] [] [] [] [] [] [] [] [] | + +----------------------------------------+ + be bg ca cs da de el en eo es et fi fr + 0 2 19 10 30 44 9 1 12 44 17 6 53 + + gl he hr hu id it ja ko lv nb nl nn + +-------------------------------------+ + a2ps | () () [] | + ap-utils | | + bash | [] | + bfd | [] | + binutils | [] | + bison | [] [] [] [] | + clisp | | + clisp | [] | + clisplow | | + cpio | [] [] [] [] | + darkstat | | + diffutils | [] [] [] [] [] | + enscript | [] [] | + error | [] | + fetchmail | [] | + fileutils | [] [] [] | + findutils | [] [] [] [] [] [] [] [] | + flex | [] | + gas | | + gawk | [] | + gcal | | + gcc | [] | + gettext | [] [] | + gnupg | [] [] [] [] | + gprof | [] | + gpsdrive | [] () () | + grep | [] [] [] [] [] [] [] | + gretl | | + gthumb | () () | + hello | [] [] [] [] [] [] [] [] [] [] [] [] | + id-utils | [] [] | + indent | [] [] [] [] | + jpilot | () () | + jwhois | [] [] | + kbd | | + ld | | + libc | [] [] [] [] | + libiconv | [] [] [] | + lifelines | | + lilypond | [] | + lingoteach | [] | + lingoteach_lessons| | + lynx | [] [] [] [] | + m4 | [] [] [] [] | + make | [] [] [] [] [] [] | + man-db | () () | + mysecretdiary | [] | + nano | [] [] [] [] | + nano_1_0 | [] [] [] [] [] | + opcodes | [] [] | + parted | [] [] [] | + ptx | [] [] [] [] [] | + python | | + recode | [] [] [] | + sed | [] [] [] [] [] [] [] [] | + sh-utils | [] [] [] | + sharutils | [] [] [] | + sketch | () | + soundtracker | [] [] | + sp | | + tar | [] [] [] [] [] [] | + texinfo | [] [] [] | + textutils | [] [] [] [] | + util-linux | () [] | + vorbis-tools | [] | + wastesedge | | + wdiff | [] [] [] | + wget | [] [] [] [] [] [] | + +-------------------------------------+ + gl he hr hu id it ja ko lv nb nl nn + 23 9 12 19 16 13 26 9 1 7 19 3 + + no pl pt pt_BR ru sk sl sv tr uk zh_CN zh_TW + +----------------------------------------------+ + a2ps | () () () [] [] [] [] [] | 10 + ap-utils | () | 0 + bash | [] | 6 + bfd | [] [] | 5 + binutils | [] [] | 5 + bison | [] [] [] [] | 12 + clisp | | 0 + clisp | | 5 + clisplow | | 0 + cpio | [] [] [] [] | 12 + darkstat | [] [] () () | 2 + diffutils | [] [] [] [] [] [] | 17 + enscript | [] [] [] [] | 8 + error | [] [] [] | 7 + fetchmail | () () [] | 6 + fileutils | [] [] [] [] [] [] | 14 + findutils | [] [] [] [] [] [] [] | 21 + flex | [] [] [] | 9 + gas | [] | 3 + gawk | [] [] | 6 + gcal | [] [] | 4 + gcc | [] | 4 + gettext | [] [] [] [] [] [] | 13 + gnupg | [] [] [] | 14 + gprof | [] [] | 5 + gpsdrive | [] [] | 3 + grep | [] [] [] [] [] | 20 + gretl | | 1 + gthumb | () () [] | 1 + hello | [] [] [] [] [] [] [] | 28 + id-utils | [] [] [] [] | 9 + indent | [] [] [] [] [] | 14 + jpilot | () () [] [] | 5 + jwhois | [] () () [] [] | 7 + kbd | [] [] | 5 + ld | [] [] | 4 + libc | [] [] [] [] [] [] | 18 + libiconv | [] [] [] [] [] | 12 + lifelines | [] | 1 + lilypond | [] | 4 + lingoteach | [] [] | 5 + lingoteach_lessons| () | 0 + lynx | [] [] [] [] | 13 + m4 | [] [] [] [] | 13 + make | [] [] [] [] [] | 15 + man-db | | 3 + mysecretdiary | [] [] [] | 7 + nano | [] [] [] [] | 13 + nano_1_0 | [] [] [] [] | 14 + opcodes | [] [] [] | 8 + parted | [] [] [] [] | 12 + ptx | [] [] [] [] [] [] [] | 19 + python | | 0 + recode | [] [] [] [] [] [] | 15 + sed | [] [] [] [] [] [] | 24 + sh-utils | [] [] | 9 + sharutils | [] [] [] [] | 14 + sketch | [] () [] | 4 + soundtracker | [] | 6 + sp | | 1 + tar | [] [] [] [] [] [] [] | 19 + texinfo | [] [] | 10 + textutils | [] [] [] [] [] | 14 + util-linux | [] [] [] | 10 + vorbis-tools | [] | 3 + wastesedge | | 0 + wdiff | [] [] [] [] [] | 14 + wget | [] [] [] [] [] [] [] [] | 24 + +----------------------------------------------+ + 37 teams no pl pt pt_BR ru sk sl sv tr uk zh_CN zh_TW + 68 domains 4 15 2 28 28 12 10 49 43 4 1 9 609 + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and +distributed as such by its maintainer. There might be an observable +lag between the mere existence a PO file and its wide availability in a +distribution. + + If August 2002 seems to be old, you may fetch a more recent copy of +this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date +matrix with full percentage details can be found at +`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. + +Using `gettext' in new packages +=============================== + + If you are writing a freely available program and want to +internationalize it you are welcome to use GNU `gettext' in your +package. Of course you have to respect the GNU Library General Public +License which covers the use of the GNU `gettext' library. This means +in particular that even non-free programs can use `libintl' as a shared +library, whereas only free software can use `libintl' as a static +library or use modified versions of `libintl'. + + Once the sources are changed appropriately and the setup can handle +to use of `gettext' the only thing missing are the translations. The +Free Translation Project is also available for packages which are not +developed inside the GNU project. Therefore the information given above +applies also for every other Free Software Project. Contact +`translation@iro.umontreal.ca' to make the `.pot' files available to +the translation teams. + diff --git a/docs/AUTHORS b/docs/AUTHORS new file mode 100644 index 00000000..4f782e07 --- /dev/null +++ b/docs/AUTHORS @@ -0,0 +1,85 @@ +Current (aMule) author(s): + +/==================================================================================\ +|* *| +| Maintainer(s): | +| K. B. aka deltaHF | +| Mikkel Schubert aka Xaignar | +| Marcelo Jimenez aka Phoenix | +| | +| Developer(s): | +| Alex Martinez aka Unleashed | +| Ariano Bertacca aka bootstrap | +| Dévai Tamás aka GonoszTopi | +| efe aka the polish | +| Jacobo Vilella aka Jacobo221 | +| Jayson Cowan aka hellimod | +| Ken Thomases aka ken | +| Leonid Froenchenko aka lfroen | +| Patrizio Bassi aka Hetfield | +| Pedro De Oliveira aka falso | +| Stefan Baldus aka stefanero | +| Tobias Ottmar aka Citroklar | +| | +| Web Administration: | +| K. B. aka deltaHF | +| | +| Graphics Designer(s): | +| Matt Britt aka uberpenguin | +| | +| Former developer(s): | +| George L. aka croaker | +| JT aka lemofan | +| Luca Vagnozzi aka shakraw | +| Nikolay Igotti aka olonho | +| Norbert Lataille aka nonal | +| pure_ascii | +| Santiago Gomez aka aquatroll | +| Thomas Landsberger aka EmilioSandoz | +| umale | +| Angel Vidal Veiga aka Kry | +| | +| Gold Member(s): | +| aMule Creator: | +| Stephane Colin aka Creteil or BigBob | +| lmule Creator: | +| Timo Kujala aka Tiku | +| Guest Coder and Good Friend: | +| Alo Sarv aka Madcat | +| | +|* *| +\==================================================================================/ + +Original (xMule) author(s): + +/==================================================================================\ +|* *| +| Maintainer(s): | +| Alo Sarv aka Madcat | +| Michael Mueller aka malware | +| | +| Developer(s): | +| Thedore R. Smith aka Un-Thesis | +| Angel Vidal Veiga aka Kry | +| Mikael Berglund aka MikaelB | +| | +| Graphics Designer(s): | +| Matt Britt aka uberpenguin | +|* *| +\==================================================================================/ + +Original (lMule) author(s): + +/==================================================================================\ +|* *| +| Maintainer(s): | +| Timo Kujala aka Tiku | +| | +| Developer(s): | +| Marcelo Falero aka mfalero | +| Xavier Fuentes aka furax | +| pure_ascii | +| Theodore R. Smith aka Un-Thesis | +| Alo Serv aka Madcat | +|* *| +\==================================================================================/ diff --git a/docs/COPYING b/docs/COPYING new file mode 100644 index 00000000..3912109b --- /dev/null +++ b/docs/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/docs/Changelog b/docs/Changelog new file mode 100644 index 00000000..f7be9dc3 --- /dev/null +++ b/docs/Changelog @@ -0,0 +1,6265 @@ +Version 2.2.1 - ??? +---------- +2008-03-?? + + Bas Zoetekouw: + * Patch for debian bug #350396: "amule depletes entropy pool". + + brainnolo: + * Patch for loading the correct path for the UPnP libraries + in Mac. + * Added the binaries for libUPnP for Mac to the directory + aMule.app/Contents/Frameworks. + * Universal Binary ed2kHelperScript update. + * avoid removing libupnp libs during initial cleanup + (this would defeat bundling them) . It will now remove only + libwx in the Frameworks directory (which are supposed to be + from an old build). + + centaur: + * OpenBSD patch. + + Coronas: + * Patch to show kad status in amuleweb (Bug 1103) + * typo in src/webserver/default/shared.php. + + drkirkby: + * Test for gcc before including gcc specific flags on the + compiler line. + + DLH: + * amulegui.xpm icon. + + EastWind: + * Patch to prevent overwriting of GDLIB_LIBS + + Gerd78: + * Added autostart-xas to rpm .spec files. + * Patch for autoconf >= 2.60. + * Patch for redefinition of $(docdir) in docs/Makefile.am. + * Patch for aMule .desktop files. + * Added amulegui desktop icon (with Vollstrecker). + * Patch for fixing aMule spec file in Fedora and Mandriva. + * Test for perl File::Copy in configure. + + Gnucco: + * Workaround for string serialization bug. + * Workaround for aMule does not publish new files on kad. + + GonoszTopi: + * Added ability to compile amulecmd without thread support in wx. + * Fixed source seeds handling on startup. + * Proper restoration of startup locale after checking available + locales. + * Fixed linkage with wxMSW. + * Got rid of a few more warnings. + * Fixed #929: configure: BUILD_CC uses CC's CFLAGS + * Implemented #962: don't display (0) when not downloading from source + * Fixed #954 - added ability turn IPFilter on/off for servers/clients + independently. + * Added support for magnet ed2k links. + * Improve cross compilation + * Fixed segmentation fault in amuled + * Proper restoration of startup locale after checking available locales + * Don't allow sources coming from .seeds to be cleaned up for a while + after startup + * Improve accuracy for ticks + * Improve debug output + * Don't add clients when shutting down + * Added a simple (ascii) text file reader class + * Sed denoiser - removes excessive messages from compilation - + Thanks to Vollstrecker for the idea and discussions. + * Drop path component from logged file names. + * Fix for perl v5.8.8 + * wxCas compilation fixes for wxCVS + * Doxyfile doesn't need to be installed, it's unusable without the sources. + * Fixed #979: No win32 version information + * Updated listctrl code to 2.8.7 + * Fixed a buffer overflow in TextFile.cpp + * Cross-compilation fixes. + * Some little optimizations on configure. + * Re-categorized a number of strings whether they need translation or not. + + Hermit: + * Patch for amulecmd history which ensures that when the same command + is repeated several times in a row it only gets recorded in the + history once. + + jcoy: + * Set download priority in amulecmd. + + ken: + * Fixed control-clicking (right-clicking) on tabs in notebooks on the + Mac. + * Compilation fix for MacOSX 10.3 + * Fixed a crashing bug with static initialization order + * Ship the license as required by the GPL. + * Fixes linking of embedded CryptoPP (on the Mac, if nowhere else). + * Quick-n-dirty hack for stats graphs on the Mac. + + Kry: + * Protocol Obfuscation (enabled by default) + * Large file support (>4GB) + * Disabled auto-update of servers from clients and other servers by default. + * Fixed a bug while getting sources for large files (>4GB) + * Fixed mldonkey_importer to work with mldonkey >= 2.7.6 + * Improve exception handling + * Added a column on client view that shows if the user has reported having + disabled shared files. + * Disable the "Show files" option in context menu if the user has reported + having disabled shared files. + * Add generic CTag classes support for Kad data types + * Remove kad IO classes + * Safety on memfiles created from packets + * Fixed publishing and sending shared files requests + * Fixed Unittest + * Update audio and video types + * Update EC to use the equivalent of VBT tags + * Fix ID sending on hello packet to use the hybrid ID instead of plain ed2k id + * Fix a bug on sending info to other clients on file list request + * Upgrade lex generated code + * Add the --reset-config flag + * Modified getclosetsto() fix, originally by tatikiran + * Changes to flex parsing of search expressions. + * Fix several missing variable initializations + * Swap bytes for int types in EC code + * Lower reask times + * Fix Memleak in ECSocket + * Extend amulecmd with 'show log' and 'reset' command, originally by quinox, bug #856 + * Usage of HOSTCC for compile-time executions + * Created translation status scripts + * Move server packets to the back of the UDP queue if the server is still + resolving a dynamic host + * Script to wikify changelog + * Separate ECTag from ECPacket + * Fix crash on startup + * Fix several rare memleaks + * Fixes on Kademlia keyword store + * Initial Kademlia 2 integration + * Remove duplicated SendPacket functions in Kad + * CPacket uses const CMemfile reference instead of pointer + * Fix for (rare) bogus packets being send on kad + * Fix for empty packets in Kad Search + * Fixed server IP for EC + * Don't destroy shareddir.dat on remote GUI, bug #945 + * Incorrect percentage displayed by amulecmd for files > 4Gb, bug #949 + * Ask user to download server list when list is empty and ed2k active + * Support automake 1.10 + * Reorganization of EC code + * Added script to generate EC files for different programming languages + (C#, Java and C++) from an abstract language + * Dropped support for < wx2.8.x (in case you want to blame someone) + * Added remote gui datastructure for new classes. + * Fixed compilation with wx2.9, also with disabled 2.6 comatibility. + * Heavily modified IP2Country code. + Proper names, guards, creation on the heap... etc. + * Added script to create Kad nodes files + * Fixes for emule-collection support + * Added some sanity checks + * Source links with crypt data support. + * Fix Mac build + * Remember kad and ed2k urls and restore them on restart. + * Force conversion to be ISO8859 for tag names, obvious from the network + standards. This also fixes Kad. + * Changed the inheritance for the UDP sockets to include the encrypted layer + * Fix for MuleGifDecoder issue + * Windows fixes + * Added OnO patch for Toolbar display. + * Fixed validation of preferences items for wxWidgets 2.8.4 + * Fixed cryptopp version recognition on Mac. + + lfroen: + * Fix partcount not being set in remote gui + * Use only one EC library with amuleweb + * Fix LastSeenComplete + * Fix for NonCurrentSources + * Fix incorrect cookie parsing for amuleweb + * Fix passing strings in EC + * Lock webserver when serving images + * EC implementation in C# (work in progress) + * Fix preferences in amuleweb + * Fix EC crashing webserver when new item added + * GUI implementation in C# (work in progress) + * Implementing split() call + * Compilation fix for MuleGifDecoder + + LittleAbacus: + * Patch to show part file numbers. + * set the search string to the search text of currently + selected tab. + + morricone: + * Fix for wxwin.m4 not autodetecting wxBase. + + mr_hyde: + * Patch to enable Kad search with amulecmd. + * Fix for some man pages have wrong name with + --program-suffix. + * Temporary fix for tarball configure.in using SVNDATE. + + Nodsu: + * Patch to make amulecmd cancel/pause/resume work with many + files and file names. + * Patch to enable preview in remote GUI. + * Patch to create the magic string $file in previews. This + string is replaced with the file name in the command line, + in case it exists. + + nvinay: + * Trivial issue with memset found using google codesearch which may + affect only the debugging. + + Phoenix: + * Fix for crash in amulegui/DownloadListCtrl.cpp. + * Upgraded extern/listctrl.{cpp,h} from wxWidgets cvs code. + * Fixed some gtk2 warnings in extern/listctrl.cpp. + * Fix for unhandled exception in new skinned toolbar code. + * Coding style fixes. + * Fix for server disconnection during global search. + * No more wxARRAY's in amuleweb. + * Fixed bug in mutex code in amuleweb (s_mutex_wcThreads). + * No more wxARRAY's in aMule code. + * Fixed bug in ECPacket.cpp: assignment inside assertion. + * Changed CECSocket constructor to be exception safe. + * Fix for invalid rectangle size on COScopeCtrl::PlotHistory(). + * Removed the default constructor for Kademlia contacts. + * Fix for "get bwlimits" command in amulecmd always returning + zero for maximum download value. + * Added UPnP support. + * Fix for crash in ECSocket.cpp. + * FileDetailDialog:: now has more intuitive Apply, Ok, Cancel + interface. + * GUI to enter a specific bind IP in + "Preferences->Connection->BindAddress". + * Resurrected support for the tag FT_DL_ACTIVE_TIME in the met + file. It's value, the download active time, can now be seen + in the file details dialog. + * Added the DLACTIVETIME variable to the list of replaced + variables in the DowloadCompleted user event. + * MuleTrayIcon.cpp was not compiling for __WXMAC_CARBON__. + Seems to be fixed, but must be the code now has a lot of + ifdefs and must be tested on other platforms. + * Added two more events: "out of space in temporary partition" + and "error upon completion". + * Fixed a crash in amulegui when adding a new category. + * Fixed a bug in amulegui, removing a category remotely did + not update the category count in amule.conf, so the next + time amule was run, the category was there again. + * Fixed a bug in toolbar skins, the skin file was opened even + when the checkbox "Use skins" was not checked. + * Fixed a crash related to MuleGIFDecoder wx-2.8.0 when + downloading the file IPFIlter.dat. + * Fix for ECSocket.cpp, amulegui was crashing upon entry. + * Fix for ClientDetailDialog in amulegui. Was showing + incorrect IP / Server / Software version information. + * Switch binding of UPnP libraries to use one digit version + names instead of unversioned names. + * Fix for crash in amuleweb when the image file did not exist. + * UPnP add/delete port mappings are now done in every device + found, instead of only the first one. + * Creation of --enable-upnp/--disable-upnp configure flag. + * Update of wxWidgets-2.6.3 deprecated code to version 2.8.2. + * Fixed IPFilter.dat loading from a zipped file. + * Added a termination process to wxExecute() calls, so that we + no longer leave zombies. + * CDirIterator now uses wxDir. + * CheckDirExists() now uses wxDir::Exists(). + * CheckFileExists() now uses wxFile::Exists(). + * GetLastModificationTime() now uses wxFileModificationTime(). + * GetFileSize() now uses wxFile::Length(). + * UTF8_CopyFile() now uses wxCopyFile(). Later reverted for locale fixes. + * UTF8_RemoveFile() now uses wxRemoveFile(). Later reverted for locale fixes. + * UTF8_MoveFile() now uses wxRenameFile(). Later reverted for locale fixes. + * theApp is now a global pointer, so that we can access the + global application object from within a core file. + * Partial fix for the COLORREF compilation problem on Windows. + * Fix for libpng version detection on acinclude.m4. It was + failing for strings like 1.2.15beta5 (e.g., debian 4.0 etch). + * Fix for theApp variable usage in amulegui. It was not beeing + initialized and amulegui was segfaulting. + * Fixed the forum address in the backtrace print. + * Applied Bas Zoetekouw's patch for debian bug #350396: + "amule depletes entropy pool". + * Implemented IP2Country using GeoIP. + * When converting from multibyte to wide characters, + ConvAmuleBrokenFileNames now tries UTF-8 first. If this + fails, then it tries ISO-8859-1. + * New directory based skin support, reworked Trevino's patch. + * Fixed amuleweb crashes due to bug in ECSocket.cpp + * Code to refresh port mappings in the event of a temporary router failure + * Code to deal with previously unhandled UPnP events. + * Fixed remote-gui segfault in UpdateStatsTree() + * syscall_check is no longer a macro + * Fixed a serious bug introduced by ENABLE_UPNP Makefile.am switch + * Fix for libpng version detection on acinclude.m4 + * Fix for server list and node list + * Made some common dialog modals and giving them a default style + * Handle different UPnP library versions + * UPnP for amuleweb. + * Fix for crash on exit and a little less redundancy. + * Trying to make listctrls behave on Mac. + * Fix for CheckFreeDiskSpace(). Was probably returning ok if + the directory where the file would be saved did not exist. + * Fix for overflow in CPartFile::HashSinglePart() as reported + by visualage. + * Fix for overflow in CSharedFilesCtrl::DrawAvailabilityBar() + as reported by a3linux, CtrlAltDel and stefanero. Special + thanks to a3linux for the backtrace. + * Improoved the macro CHECK_CRYPTO() in acinclude.m4. + * Fix for the check of cryptopp library version in + configure.in. + * Rewrote the cryptopp m4 stuff. + * Fixed some memory leaks related to the use of + CTerminationProcess. + * Fixed the usage of CryptoPP::Base64Encoder when creating the + key pair for ClientCreditsList. cryptopp semantics is to + give the ownership, so do not create objects like this on + the heap. + * Fix for amuled creating zombies. wxProcess does not work + with wxBase. + * wxProcess now receives OnTerminate() events in amuled. + * Created a specialized termination process object for + amuleweb, so that amule does not kill the web daemon if it + has already died. This fixes a segfault upon exit. + + pochu: + * Fix for subdirectory builds. + + Radek: + * Patch to fix windows compilation. + + Raziel: + * Adapt Kad code to the standard coding guidelines. + * Work on EC API + + spiralvoice: + * Patch to enable MLDonkey os_info support. + + Skolnick: + * Added the time to the aMule stats in the wxCas window and + in the generated image. + * Added the time to the aMule stats in the cas output and + in the generated image + * Added option to generate image in JPG format (along with PNG) + * Added new icon for aMule + + Stu Redman: + * Fix for Transferred / Completed not updated in remote GUI. + * Fix for PARTSIZE not beeing 64 bits. Enums are always 32 + bits, even if we use a 64 bit constant to initialize it. + * ratings/comment marks are now shown in the main transfer + window (the little colored !! on the left). + * comments are now updated when comment packets arrive (not + only when the show comment dialog is open). + * remote names are now updated once on startup. So there is no + more 3s lag until the names are shown when the dialog is + opened for the first time. + * ED2K/Kad User/Filecount is now shown in the remote-gui status + bar. + * Kad users/files also updated on the Kad Tab. + * Backed out a now obsolete change made in CommentDialogLst.cpp + (comments are not related to remote filenames anymore). + + Tiziano Müller: + * Fixed compilation when --enable-geoip is used in conjunction + with the ld-flag "--as-needed". + + Trevino: + * Fix for "Both the Unknown client icon and the Unknown status + icon points to the same file" issue. + * Skin support with relative paths. + + visualage: + * Fix for aMuleWeb unicode search/download link error. + * Fix for aMuleWeb segfault when refreshing too frequently. + * Fix for regular expression in aMuleWeb-PHP/split function. + + Vollstrecker: + * Added possibility to give the path for output right with + -p or -o in cas. + * Changed cas to use getopt_long. + * Added --config-dir and -c option to cas. + * Added alias -H --html to cas. + * Added alias -P --picture to cas. + * Added --config-dir and -c option to ed2k. + * Added --config-dir option to amuled. + * Fixed typos in the man pages. + * Added manpage for amulegui. + * Added amulegui desktop icon (with Gerd78). + * Manpages update. + * Add debian folder. + * Correct use of libcrypto >= 5.5 and update of debian-dir. + * Added Option to use generic ipfilter.dat. + * Made possible to select which translations get build and + installed. + * Install only manpages in requested Langs. + + wuischke: + * Add emulecollection support on aMule ED2K Links Handler + * Fix online signature update rate + * Fix display of filesize > 4GB in file detail dialog + * Fix toolbar import/about icon order + * Add option to load emulecollection in SharedFilesCtrl + * Add oga and ogv extension for file type search + * Allow skin/webserver template section via wxchoice + skin enhancement + * Some error messages rephrased, to improve readability + * Fix idle mode for UBT + * Fix Ctrl+a in MuleListCtrl + * Replace (f)lex by $(LEX) in Makefile.am files + * Fix libUPnP unloading. + * Fix building with external CryptoPP + * Ship skins with tarball + * Display file size in human readable format in FileDetailDialog + * Added upload feedback + * Added option to enable EC and set pass in A[amuled] + * Removed GetLocaleDir() + * Zipped skin format + * Fix utf8 problem with file names + * Fixed toolbar display with skins when blinking on incoming message + * Fix #1114, missing break statement, thanks to mr_hyde + * Add option to filter file comments + + Xaignar: + * Renaming the SearchList typedef to CSearchResultList + * Splitting CSearchFile out from SearchList.* to SearchFile.*. + * fix initialization of member variables in CSearchFile when + creating on remote gui. + * Call GetLength safely when sharing files + * Added support for child results to CSearchListCtrl + * Major cleanup of CSearchList + * Add logger target for the thread-scheduler + * Add smart pointers CScopedPtr and CScopedArray + * Fix possible crash due to pending events + * Fix accessing empty list in CMuleListCtrl + * Add support for displaying large files with CBarShader + * Improved sanity checking and simplified exception-handling + via CScopedPtr and CScopedArray. + * Major reworking of threads, add a thread scheduler for + IO intensive tasks, improve thread-safety for AICH-sync thread + * Fix FileIO unittests and add test of const CMemFile objects + * Update AICH from eMule-0.47a Beta1 + * fix positioning of individual frames + * Improved exception handling + * Updating the FindMatchingClient function + * Avoid dangling pointers in case of asserts failing + * Updating CFormat to properly handle 64b ints on all platforms + * Fixing CFile::GetAvailable if position is past EOF + * Fixed possible use of uninitialized variables + * Adding template function for freeing the contents of a list/map + * Remove CList + * Fixing a couple of infinite loops + * Fixes file completion under amuled + * Add locking to the ED2KLinks file + * Removed multiple macros for array size + * Removed the CMD4Hash from wxString constructor + * Add swap function to CRangeMap + * Reworking of the notify-code + * Optimized and simplified adding of shared files to the listctrl + * Remove partially copied files when a UTF8_CopyFile fails. + * Drop the file/directory permission settings, use umask + instead. + * Fixed loading of version information for servers. Previously + the information saved in the servers.met file was ignored. + * Fixed problem with reading ST_AUXPORTSLIST tags for servers, + where empty tags would cause the existing server-port to be + overwritten, thereby preventing connections to that server. + * Fixed linking of libmuleappcommon, which would previously + include GUI related symbols, thereby breaking amuled in some + cases. + * Added fuzzy sorting method for strings, currently only used + for sorting server-version information. + * Fixed sorting of the "Static" column on the server-list, + which didn't conform to 'strict-weak ordering'. + * Added missing catch-statements in places where subclasses of + CSafeDataIO was used, thereby preventing crashes in case of + funky files/filesystems, such as network drives only + supporting up to 2GB files. (closes bug #878 and #1205). + * Fixed opening of the Help-page when modifers were applied to + F1, which was causing conflict with various system-wide + shortcuts (this closes bug #1200). + * Used -isystem to mark wxWidgets and Crypto++ include files + as system-files, thereby reducing the number of warnings + generated by these includes. + * Fixed the shared-files-list ctrl assuming that all items + were part-files when creating feedback, which could cause + wrongful casts of CKnownFile objects. + * Changed from using signed longs to store pointers in + wxListCtrl, to using wxUIntPtr, which is guranteeded to be + able to contain pointers on all platforms. + * Fixed unicode-chars not being registered by key-events for + wxListCtrl (applied to our local copy). + * Fixed various problems with using arrow-keys and other + control-keys on the listsctrls in aMule. + * Fixed checks for changes in .part files between runs, which + previously was entirely broken (checked both wrong + timestamps and files). + * Fixed saving AICH-hashsets to an empty file, where buggy + sanity-checks were causing the result to be discarded. + * Improved the CreateHashFrom* functions, preventing the + hashing of empty files, and accessing an empty vector. + * Added a workaround for a bug in wxNotebook, which would + cause the selection returned in page-changed events to + sometimes be invalid, thereby causing aMule to crash when + attempting to access an non-existing page. This should fix + some crashes assosiated with closing search-result tabs. + * Dropped the internal Crypto++ libraries. Most distros have + it these days, and it's just another headache for us to + support (and was becomming pretty outdated). + * Improved checks for NULL points in CClientListCtrl. + * Fixed some poor english in various logging messages. + * Improved thread-safety in various classes, in part because + wxString isn't threadsafe, and we use that class a lot. + * Added support for writing 64-bit ints in CTags, which was + needed for some server-packets. + * Improved debugging-information support in CTag. + * Fixed saving/loading of 64-bit ints for Kademlia, which were + sometimes sent as binary blobs. Previously, we would read + from the net and save them to 'src_index.dat' just fine, but + would fail when it came to reading them from + 'src_index.dat', resuling in that file being unreadable. + * Fixed the corruption of some tags (mostly Kademlia), where + the tag-names were wrongly saved as UTF-8, though they + should have been saved unchanged. This closes bug #1188. + * Applied various fixes to better conform to ANSI-C++. + * Fixed repeating of CPPFLAGS when compiling with GeoIP + enabled, which caused problems when -pedantic was used. + * Fixed a couple of small memory-leaks in UPnP (bug #1230). + * Added the "printf" attribute to printf-like functions in the + webserver code, allowing for compile-time error-checking. + * Fixed potential crashes that would result from server + connection attempts that timed out before the hostname + lookup returned. + * Worked around crash in the taskbar icon, which would trigger + if the kicker crashed. + * Fixed safehash-check for files greater than 4GB. + * Added support for pretty-printing of classes to CFormat. + * Added a class for the transparent handling of paths, needed + because we want to be able to handle both mangled (saved in + the wrong locale) and normal filenames. This should fix + problems with accessing files with extended chars in the + filename. + * Added warning in case port could not be bound to the + hostname specified in the preferences. + * Made outbound connections use the hostname specified in the + preferences. Is possibly not fully functional. + * Fixed memory-leak when adding invalid ED2K links. + * Fixed crash when the hashing-result from a now deleted + part-file was returned. + * Allow the update of the server-list from the remote gui. + * Optimized file-syncing, by only flushing the file contents, + rather than the meta-data (timestamps, etc). + * Fixed possible redefinition of the VERSION define. + * Fixed redundancy resulting from the use of two different + list of file-extensions, used when determining the filetype. + * Dropped support for importing configuration files, and the + like, from older eDonkey and *Mule clients, as most of these + were extremly old. + * Re-added double-buffering for listsctrls, in a manner that + should hopefully avoid the problems seen previously. + * Fixed missing unicode-convertion on a number of packets when + sending to unicode-enabled clients. + * Fixes passing of the error-code to OnReceiveError in + CMuleUDPSocket::OnReceive. + * Improved handling of invalidated (closed) UDP sockets, caused + by the fact that wxWidgets errorously treats empty datagram + packets as EOF. + * Fixed setting priorities for part-files on the remote gui + (this resolves bug #1251). + * Improved debugging information when using CFormat. + * Rewrote the CTextFile class, improving the reading speed, + and adding the functionality for writing files. + * Improved sanity-checks in the CQueuedData class, thereby + preventing the possibility of memory-corruption resulting + from mangled packets. + * Added autoconf check for broken exception-handling. + * Added subclass of Cfg_Str for loading/saving paths. + * Added functions for checking permissions of dirs/files, and + for retrieving the free space at a given location, to CPath. + * Increased minimum free size needed before writing ".met" + files from around 5KB to 100KB, as ".met" can easily be + much larger than 5 KB in size. + * Improved checks for permissions of directories, and insured + that the fallback directories are also checked in the case + were the user-specified directories are inaccessible. + * Changed temp/incomming dir variables to "CPath"s, using the + previously added Cfg_Path class. + * Fixed spurious warnings caused by not checking if certain + preference files existed before trying to read them. Also + removed an unnessesary warning for when known.met doesn't + exist. + * Added wrapper-class for wxThread, to allow us to safely + terminate joinable threads without using Delete, a function + that is only intended for use with detached threads. + * Fixed cancelled downloads being reported as succesful. + * Fixed warning about dirs without shareable files, in the + case where there were sharable files, but they were all + duplicates. + * Save directories (shared, incoming, etc) as well as the + filenames of known files in an locale-independant manner, + so that changes in locale does not affect our ability to + find previously used files or directories. This will break + backwards compatibility when using unicoded directory-names. + * Worked around the search-string being cleared when starting the + first search, which was caused by bug in wxWidgets. + * When starting a search, the entire search string is selected. + * Fixed creation of ED2k-links with an AICH-hash, in case the + file does not actually have a AICH-hash. Also disabled the + option in the shared-files window when the file lacks an + AICH hash. + * Removed workarounds for old (and resolved) wxWidgets bugs. + * Fixed creation of ED2K links without sources, where an + superflous "|/" would be appended to the end of the link. + * Fixed handling of spaces when creating ED2k links. These are + now escaped. + * Fixed swapped notify-functions, which would cause clients to + be left on the upload-queue ctrl, even if the underlying + object was deleted. + * Improved enabling/disabling of items on the right-click menu + on the download queue. Among other things, it is now + possible to stop a paused download, without having to + restart it first (this closes bug #1078). + * -- TODO + * Fixed the setting priorities for shared files via the remote + GUI (this closes bug #1267). + * Fixed clipping issues when columns are resized to very small + width, causing the contents of one column to be drawn on top + of the next column (this closes bug #1171). + * Fixed copying of text to the clipboard, which previously + used the "primary" clipboard (middle-click) under X11. It + now uses the default clipboard, which is what DEs typically + use for Ctrl+C/V/X. This closes bug #1139. + * Improved the displaying of the connection status, and fixed + problems where the status of only one of the active networks + would be displayed. This closes bug #981. + * Fixed percentage display of available parts in the + file-details dialog, where the decimal portion of the value + would always be zero. This resolves bug #1060. + * Improved thread-safety of the AICH-sync thread on amuled, + and prevented the possibility of deadlocks in a few cases. + * Fixed bug where the preferences dialog on the monolithic + client would not be updated if the preferences had been + changed via EC after the dialog had been first shown. + * Added support for protocol-obfuscation configuration via + external connections. + * Fixed problem where obfuscation of out-going connections + could be enabled even if obfuscation support was not, + leading to clients being wrongly dropped in some cases. + * Fixed check-boxes in the preferences dialog for the various + obfuscation options not being updated when one of the other + obfuscation check-boxes were checked/unchecked. + * Added the ability to update the nodes.dat file via the + remote gui, as well as bootstrapping from a specific IP. + * The server.met and the nodes.dat urls are now saved when + changed in the remote UI, and are read from the core when + starting the remote gui. + * Allow for the creation of ED2k-links on the remote gui. This + resolves bug #893, #567 and #584. + * Fixed checks preventing the creation of source-links when + only using Kademlia. + + xor: + * Fix for crash on amuled when starting up kademlia. + + ycjhi: + * fix for OSX aMule-CVS-20071115 fails in loading libixml and + libupnp. + * fix for aMule-CVS-20071115 doesn't update server.met on + startup. + + Special Thanks to: + * FreeToGo for implementing the first version of IP2Country on + the forum. + * Mark James (http://www.famfamfam.com) for providing the + flags icons and mischamajskij for his unknown icon + * deloun and mischamajskij for their work on aMule skins + * Bun Bun, for being there to tell me I'm not stupid. + +-------------------------------------------------------------------------------- + +Version 2.1.3 - The "We missed the 6/6/6 devil release and we're very sad" version +---------- +2006-06-11 + + GonoszTopi: + * Fixed windows compilation, that was still broken. + * Fixed locale bug. See http://forum.amule.org/thread.php?threadid=10178&sid= + + ken: + * Fixed control-clicking (right-clicking) on tabs in notebooks on the + Mac. + * Fixed SmartLowID checks based on a patch/report by eyalzo. + + Kry: + * Fixed GonozsTopi's fix for locale bug (double init). + * Added script to import mldonkey downloads into aMule. + * Fixed "0000867: French traduction is uncorrect grammatically". + + rene06: + * Allow amulecmd to execute a global, local or kad search. Then + you can get the results, which are shown in a list. From that + list you can choose one file to download. + + Special Thanks to: + * Me, because I'm the only one bothering to compile the changelogs. Go me! + +-------------------------------------------------------------------------------- + +Version 2.1.2 - The "We're on fire!" version +---------- +2006-03-28 + + GonoszTopi: + * Fixed some warning messages. + * Fixed windows compilation. + * Fixed compilation in release mode. + + Kry: + * Fixed initialization of Partfile, Server and Knownfile objects + on remote GUI. + This fixes a good bunch of bugs, including but not limited to: + * 0000741: the total speed possible is incorrect. + * 0000774: Amulegui show comments ->segmentation fault. + * 0000605: Incorrect ICH statistics data + * 0000812: amulegui: wrong ed2k ports in server list + * 0000776: amulegui segfaults + * Fixed potentionally huge memory leak on EC. This is the main focus + of this release, but that didn't stop us from adding more stuff ;) + * Fixed "0000809: Amulegui: Changing toolbar orientation shows the + Import button." + * Reworked core/GUI comment handling to allow for future display of + comments on remote GUI, and meanwhile, added an nice message to + notify it's disabled. + * Fixed "0000738: Set search type to KAD if only KAD is selected as + usable networks in settings" + * Fixed amule.conf not being saves on remote preferences change. + * Fixed ping time on servers, down to msecs resolution now. + + lfroen: + * Prevent bad_alloc thrown on invalid connection attempts on EC. + * Adding support for 64-bit filesize to webserver and php + + lionel77: + * Display "Share Ratio" in shared files list. + + Phoenix: + * Compilation fix for auto_ptr<> on Mac. + * Fixed crash on amulegui when exiting. + * Fix for CheckDirExists() for empty directory string. + * Slightly more informational error message in amuleweb when + the template is not found. + * Fix for bug in ReadyPath() function. + * Create a backup of the log file upon init. + * Added SOCKS4a support. + + TimDzang: + * Fix for wrong filename string in IPFilter.dat. + + Vollstrecker: + * Added check if locale could be set, before adding the language to + the options dialog. + + Xaignar: + * Ensured that partial files left from failed file-completion attempts + would be removed. + * Fixed crash on remote gui when attempting to reload the ipfilters. + * Fixed sorting of servers by ping-time, such that servers without a + known pingtime are sorted last. + * Added a "Password incorrect" message to the login pages, for when + login failed. Also added a warning in case no passwords were set. + * Ensured that known-file objects are properly initialized on the + remote gui. This among other things fixes not all of the items on + the sharedfiles list showing a 'has-comment' flag. + * Compilation fix for GCC 3.2. + * Fixed CheckDirExists not working for root-paths (on both windows and + linux) and not handling all types of path-seperators on windows. + * Fixed security problems with aMuleWeb: + * All images could be accessed, even when not logged in, and this + included dynamically generated images, such as progress bars and + graphs, resulting in various information leakage. + * It was possible to craft an URL such that any image on the + harddisk would be returned, provided that the full path was + known. File types were decided by the filename extension and + included 'gif', 'jpg', 'ico', 'png', 'bmp' and 'jpeg'. + * When logged in, it was possible to craft an URL such that any + html or php file on the harddisk would be returned, provided + that the full path was known. File types were decided by the + filename extension and included 'html' and 'php'. + * Decreased the minimum value for Max-Connections in the preferences + dialog to 5. + + Special Thanks To: + * The usual people + * From Kry: to the one that makes it all worth it. + * quinox, for helping us find the security hole in aMuleWeb. + +-------------------------------------------------------------------------------- + +Version 2.1.1 - The "There can be only two! Point one! Point one!" version +---------- +2006-03-18 + + GonoszTopi: + * Fixed sources coming from an 'Unknown' origin. + + ken: + * Fixed Mac aMule showing erroneous version number in Get Info. + * Disabled the HTTP download progress dialog on Mac (again) because + it causes crashes. + * Suppressed an error dialog on failure to lookup the host's domain + name. Demoted it to just a message in the log. + * Fixed a bug in ed2kHelperScript.app (the Mac ed2k link handler) + which prevented it from working properly if there was a space in the + path to the aMule application. Thanks to Gomaaz for finding this bug. + * Eliminated false reports of failure to execute the on-completion + command. This happened with amuled and an on-completion command which + completes quickly. Thanks to s0undt3ch for reporting this bug. + + Kry: + * Fixed a bug on sending sources where sources won't be send to a client + uploading from us if he uses multipacket. + * Fixes some crashes, on systray dying, tho not all till wx is patched. + * Fixed some possible problem with userhash generation, that could lead + a void userhash. + * Fixed defs.h include on MuleDebug.h causing compilation problems on + some systems (must be first wx include). + * Fixed search type "Any" + * Fixed translation of empty strings, which is reserved to gettext and + must never be used. + * Fixed the aMule.app container lacking a Frameworks/ folder and thus + making the generate_package script fail. + * Fixed compilation of wxCas with wxWidgets CVS (2.7.x) + * Fixed ED2K id wrongly used on kad-only setups. + * Added the --reset-config flag + * Fixed Kad's sources/nodes search results, based on a patch by tatikiran + and further modified by John (eMule) and me. + * Removed Razorback 2's stats while it's gone. + * Disabled vertical toolbar on Windows while wxWidgets doesn't fix it. + * Fixed aMule failing to find configuration folder and any folder that + finishes with a "\" on windows. This leaded to shared folders not being + shared, too. + * Fixed drives on windows not being correctly tested. + * Changed default server.met + + Radek: + * Fixed amulemd output not being printed immediatly when running in a + mingw terminal. + * Added missing include to GetTickCount.h, which caused the function + declaration to be missing in some cases. + + Raziel: + * Fixed "0000690 bug for browse windows in amulegui" + + Xaignar: + * Fixed problem with recursivly sharing folders that hadn't been + expanded in the tree ctrl. + * Improved detection of external Crypto++ versions. + * Fixed somee possibly crashes, caused by failed unicode convertions. + * Improved error-checking when creating the .aMule data folders. + * Fixed problem with searching for files of type 'Program', if a + search of a different filetype had been done just before. + * Fixed a problem with shared files, where danling pointers to client + objects could be left in some cases. + * Changed the way MD4 hashes are converted from Base16, in order to + improve error-checking. This adds aditional safety to places such as + parsing of ED2K links and adding of friends. + * Fixed bug where clients would be removed from the list of Kademlia + clients if the hash, ID or IP changed. This should only happen when + the client is deleted. + * Fixed various problems with logging during startup, including a + crash in amuled if an alert was to be displayed. + * Fixed the HTTPDownload dialog by using events rather than relying + on being able to pause the main loop when sending notifications. + Also properly aMulified the dialog. + * Entries for debug-logging are now always saved to the amule.conf + file, to allow amuled users to enable these manually. Before, the + entries were only written for enabled debuglog-types. + * Fixed problem in loading of known.met, which would result in + duplicate shared files alternating between which file was actually + shared. This resulted in statistics for the file being 'lost'. + * Added locking to the ed2k utility, to prevent races when many links + added at once. + * Changed the way CFile retrieves the file-length, which was causing + problems with files shared from a remote drive. + * Fixed problems with representing 64b values on windows, caused by + imcompatible extensions to printf. Thanks to Radek. + * Improved error messages on startup, when a folder is found to have + inadequate permissions. + * Fixed problems with identifying reconnecting clients, which would + cause a number of problems, including exessive bans. + * Fixing right-clicking (for recursive sharing) only being possible on + the directory icon, but not the label. + * Fixed sorting by client-version on the downloadlistctrl (bug #763). + * Changed the sort-order of A4AF sources, so that these are always + shown last. This fixes bug #761. + * Fixed assertion in the downloadlistctrl, caused by a bug in + wxMemoryDC. This would trigger when a complete file was shown. + * When a missing shared file is encountered, unshare just that file, + instead of rechecking everything, since that would cause noticible + lag for people sharing many files. + * Fixed exec-on-completion being run even if the file failed + to perform its completion. + * Fixed the sanity check for the min/max ext. search parameters, which + would cause the min value to be ignored unless a greater value had + been set for the max field. + * Fixed unicode searches, caused by mismatching string conversions. + * Adding missing exception-handler to the the function searching for + shared files. Without this, a failure to retrieve a filesize would + result in aMule terminating. + * Fixed userspecified CPPFLAGS being overwritten by the CXXFLAGS + by configure. Thanks to Gerd78. + * Removed references to amulecmdgui and amulewebgui, which had been + left behind from when the utilities were removed. + * Overrode wxConsoleAppTraits's WaitForChild function for aMuled, + allowing wxExecute to be used asyncroniously. This fixes problems + with using the exec-on-completion functionality. + * Improved sanity checks for the TTS implementation. + * Changed paused state to stopped state in some cases, which had been + incorrectly changed to paused by myself. + * Added Maximize/Minimize buttons to the file details dialog. + * Fixed dangling pointers left behind, leading to crashes when a + server.met file containing dead severs was loaded. + + Special Thanks To: + * All the translaters who did such a great and fast job. + +-------------------------------------------------------------------------------- + +Version 2.1.0 - The "I just teased you with this release till 2006" version +---------- +2006-01-01 +Note: This version is dedicated to our great tester Citroklar, for reasons he knows. + + ender: + * Fix adding AICH links with amulecmd. + + fulgas: + * Added Kad info to amulesig + * Fix for reading Kad info on the amule-utils: amps,cas,wxCas,xas + + Gerd78: + * Fix linkage with static wx libraries. + * Fix aMule.spec files + * Fix amule.desktop file + + GonoszTopi: + * Fixed a small GUI glitch + * Ported the partfile importer from eMule, it's now capable of + importing eDonkey2000 partfiles. MLDonkey partfiles are not yet + supported. + * Hid the "debuglog" entry in webserver, it had the same contents + as "log". + * Moved CTimer class declaration to its own header file. + * Internal events moved to their own header. + * Proper termination of working threads in webserver. + * Moved GetSoftName() to DataToText.cpp. + * Changed the RGB() function to produce correct rgb values. + * Added ability to transmit floating point numbers via EC, by + transmitting them in their string representation. + * Using svn revision number as CVSDATE for svn working copies. + * EC now uses a version ID for detecting binary incompatibilities. + * New function: CastItoSpeed(), which converts the given integer + value (assuming it means bytes/second) into string. + * Changed 'K' prefix for 'kilo' into 'k'. + * Brand new statistics tree. Features include: + - internal data is kept up-to-date realtime + - support for translation over EC + - selectable maximum of client versions shown + - remote gui also has the statistics tree + * Win32 compilation fixes. + * Manpage file names now can be transformed. + * Fixed linkage with shared win32 wx libraries (DLLs). + * Fixed #538: extended info on tabs aren't removed + * Fixed webserver search result page blank. + * Strict POSIX compliance in configure script, fix for NetBSD sh. + * Removed some strings from translation database that never needed + translation, such as "|", "(", "." and so on. + * Fixed #521, #525, #542: amuled didn't handle shutdown command well. + * Check for libpng existance and usability even if libpng-config + doesn't exist. + * Fixed #545: Can't tell part number in remote gui + * Disabled 'Preview' menu item in remote gui. + * Fixed #543: amuleweb does not load the good language + * More handy (or proper or native or user-friendly or call it + whatever you want) default incoming folder for Mac and Win. + * Implemented #510: Rename downloaded files from amule + * Made amulecmd able to connect/disconnect kad and/or ed2k. + * Proper location for config files on Mac and Win. + * Reworked amulecmd's command interface. + * Removed #pragma directives from sources. + * Various fixes to the new build system. + * New EC socket code. + * Fixed vertical position of text in shared files list. + * Added preference option to select web template for auto-started + webserver. + + ken: + * Use the IPFilter when adding and connecting to servers. Thanks + to MrFaber for reporting the bug. + * Along with GonoszTopi, proper location for config files on the Mac + * Along with GonoszTopi, better default location of Incoming directory + * Mac compilation fixes + * Added more keystrokes (Backspace, Numpad Delete) as synonyms for + Cancel in Downloads list + * Improvements to internal memory management to protect against leaks + in the face of exceptions + * Protect use of mutexes against exceptions + * Enabled language translation support for the Mac binary + * Don't show the 'x' close buttons on the search results tabs on the + Mac, since they are non-functional and confusing + * Maintain the functionality of control-clicks (right-clicks) on tabs + for search results and categories in the face of wxMac changes + * Helped avoid endianess problems with Kad + * Fixed handling of empty seeds files + * Fixed crashes involving CSharedFileList. Special thanks to lionel77 + for truly heroic debugging efforts. + * Fixed a crash in amuleweb when the template isn't found + * Contributed to improvements in the new CTimer class + * Disabled the tray icon preference settings on the Mac since they're + dangerous (can cause crashes) + + KingFish: + * Fixed systray shared files count. + + Kry: + * Initial Kademlia import from eMule. + * Fixed endianess problems on Kad. + * Cleaning of the CContact class. + * Fixes on node lookup and distance calculation. + This is colaborative development with John from eMule. + (Added to eMule 0.46c) + * Fixed a crash on Kad search terms on the UDP listener. + (Added to eMule 0.46c) + * Proper catching and more debug on Kad search and Data I/O + * Proper shutdown of Kad on exit. + * Kad firewalled sources are now contacted properly. + * Fixed a crash on search manager, caused by erase invalidating an iterator. + * Proper arrows for ed2k/kad state, using alpha drawing. This means that + the little arrows on world globe on status bar are now separate: the lower + one is for ed2k and the higher one for Kad. + * Fixed another wrong usage of stl classes and some cleaning on clientlist. + * Added GUI checkbox to show/hide Filter options. + * Added -D_GLIBCXX_DEBUG to compilation flags. + * Fixed a crash on kad indexes caused by deleting the key invalidating the iterator. + * Cleaned the connection state functions out of their container classes to theApp. + This fixes possible crashes on uninitialised serveconnect/kad classes. + * Removed all low-level winsock/linux sockets erferences from code. + * Moved wxEVT_NOTIFY_EVENT to wxEVT_MULE_NOTIFY_EVENT to avoid + conflicting with wxWidgets own definitions. + * Removed daemon fork on windows to fix compilation. + * Fixed text-mode apps password ask on windows. + * Fixed preferences close to do a cancel event. + * Added EC debug messages on connection failures. + * Fixed memset usage on abstract types, causing crashes on some + configurations. + * Only use date and not hour from CVSDATE. + * Fixed MULENOTEBOOK events + * Fixed connect button behaviour, about 17 times (counted). + Last implementation does: + - Connect to enabled networks if aMule is not connected to any. + - Disconnect if aMule is connected to any network. + * Fixed aMule remote gui to use event-driven EC. + * Fixed WOULDBLOCK on EC to retry tranfer. + * Fixed wxSOCKET_NOERROR not triggering a transfer on EC. + * Rethrow proper info on invalid Kad tag. + * Deprecated docs/amule-win32.HOWTO.txt, use wiki instead. + * Fixed GCC 4.0 compilation: + * ~CMD4Hash() + * ~CValueMap() + * CValueMap + * Update Kad tab on usercount change. + * Fixed wxSOCKET_WOULDBLOCK/NOERROR on EC to avoid losing packets. + * Avoid widnows execution writing ont he registry. + * Fixed Solaris Sparc compialtion (-lrt compilation flag). + * Throwing invalid kad type tags for debug measures. + * Acording to RFC3330, 24.* and 14.* must be parsed as normal ips. + * Some fixes to the (still partial) skin engine. + * Allow to expand relative paths on skin engine. + * Fix for too big tags (larger than packet) detection. + * Updated POTFILES.in, lots of times. + * Updated and centralized client emule compatible numbers. + * Fixed wxWidgets includes based on version. + * Fixed clicking "No" on shutdown confirmation... doing a shutdown. + * Adding a link over EC now gets proper feedback on duplicates. + * Added YASO (Yet Another Shareaza Opcode). + * Allow binding EC and ed2k/kad sockets to an specific address. + Use Address= and ECAddress= on [eMule] section of the amule.conf file. + * Warn for outdated version on daemon, too. + * Added Kademlia network to aMule daemon. + This required an split of core/GUI of the initial import. + * Removed a big bunch of duplicated EC calls to connection status. + * Show Kad status on remote apps. + * Fixed a possible memleak on CKnownFile creation. + * Added hashing protection about hashing more than one part at a time. + * Fixed a memleak on global search packet. + * Fixed Kad crash based on wrong STL iterator usage. + * Compilation fixes for SafeFile classes. + * Chat icon on toolbar now blinks red/blue on new message till we press + the button to check the message. + * Make compressed HTTP files be decompressed transparently after download. + Allows for server.met.gz and similar downloads. + * Fixed the statusbar taking too much space. + * Default server.met uses gruk.org now, to avoid fake servers. + * Reverted phoenix false fix for my kad iterator fix and adding my fix which + was before his fix. Try to say that drunk. + * Several cosmetic minor changes to GUI. + * Fixes on wxHTTP crashes caused by heap creation of sockets class. + * Moved ECAddr to ExternalConnect section and made GUI for selecting the ip. + * Fixed korean translation compilation failure. + * Several 2.4 compilation fixes, which turned out to be not used because we + now require wxWidgets 2.6.0 at least. + * Fix NetBSD compilation (fwprintf not implemented on NetBSD). + * Fixed some unneeded ansi strings conversion to wide chars. + * Endian fix on Kad UDP packets being sent... elsewhere. + * Several fixes on endianess over source exchange and ip filtering. + * Debug output and crash fix for HTTP streams on download. + * Fixes on keyword hashing on Kademlia. + * Fixed Kad tag names using ansi chars instead of unicode names, + which will be sent as ansi anyway but CTag creation is based on + wxStrings, so using a char* uses the int constructor. + * Removed the CTagNameString, using wxString everywhere. + * Fix for GUI systray option being enabled when systray compilation + is disabled. + * Server ed2k link (and any link) must be '/' terminated, fixed on + generation. + * Debug output on EC protocol version mismatch. + * Changed servers toolbar button to networks. Now this has two tabs, + one for ed2k and one for Kad. + * Created Kad GUI from scratch. + * OP_REASKCALLBACKUDP implementation for Kad lowid + * 64bits archs fix on webserver image generation. + * Removed CT_PORT usage on server login - is ignored by eservers now. + * Removed Kad search list ctrl - it's just debug output user won't need. + * Removed Kad nodes list ctrl - it's just debug output user won't need. + * Modification's to lupz's patches on Kademlia sources search. + * Compilation fixes on ClientList for Kad contacts. + * Checks for 0-port UDP packets to avoid 100% CPU usage. + * Lots of Kad cleaning on the imported code, contacts, searches, + UDP packets processing and routing bin + * Removed kademlia/utils/Ping.* - unused on this implementation. + * Fixed a crash on Kad exit caused by double-removal. + * Fixed remote GUI compilation with Kad enabled. + * Changed invalid rating on a file to non-critical (keep source!). + * CPU fixes on duplicated calls to rating updates. + * Some fixes to rating icons. + * Killed muuli's pragmas. + * Moved search id's setting to search class itself. + * Fixed searches' timspan on CParfile::Process + * Reworked src/Makefile.am to handle common files. + * You can change toolbar to vertical/horizontal on GUI tweaks now. + * Removed fakecheck (sites down). + * Fixed a crash on HTTP download dialog caused by wrong usage of delete. + * Fixed toolbar orientation change not showing proper connection state. + * Fixing ED2K link handler colliding with status bar. + * Added 7z to types. + * Mantain a list of already-known mods to avoid "Compatible client found" + messages spamming the console. + * Revamping of UpDownClient interface. Proper private vars and public + accessors, merged the public/private sections, and decoupled credits classes. + * Fixed possible crashes on dereferencing NULL pointer, specially on EC + tag creation on UpDownClients. + * Separated CClientCredits and CClientCreditsList to diferent files: + the later is not needed on remote GUI while the former is. + * Moved some functions for ID check to theApp, to remove the + includes needed on each file, cutting down compilation time. + * CClientCredits is not more a friend class of CClientCreditsList. + * Split CClientReqSocket from ListenSocket.*, and renamed to + CClienTCPSocket to keep coherence with CClientUDPSocket. + * Removed event handler local vars on server and client sockets, and moved + the classes out of the .h, because those are no needed anywhere else. + * Removed the possibility of bootstrapping Kad from a host. + * Fixed the stale unknown clients caused by unanswered kad-buddy requests. + The new KADEMLIABUDDYTIMEOUT is 10 minutes. More than enough. + * Connect/Disconnect button works properly now. Disconnection happens on any + network connected, and connection on the selected networks on preferences. + * Added a Disconnect button for ED2K too. + * Fixed possible crash on startup. + * Tray icon is now shown as connected if any network is (ed2k or kad) + * A lot of class separation and file/class renaming, to prepare the build for... + * Build system changed: + - Added some intermediate libs to avoid double-compiles: + (Binary compatible files only) + - libmuleappcommon.a -> Common to all aMule derived apps + - libmuleappcore.a -> Common to amuled/amule + - libmuleappgui.a -> Common to amulegui/amule + - Also changed some files to increase the amount of + binary compatible files. Would be great to increase + this number, but sadly theApp. access is not binary + compatible (different base classes). + - Created two amule-independant libs: + - libcommon.a -> Common to all apps + - libecc.a -> Common to all EC apps + Those are now on libs/ folder. + * More changes to build and libs. libeccommon now includes ECSocket, + and CRemoteConnection is used to connect to a remote core. + * Make libec independant from libmulecommon + * Call realize to fix toolbar on Mac. + * Open wiki on F1 for help :) + * Stats have a 64bits, not 32bits, uptime number. + * No more EC extra needed for having a remote app, yay. Just link to + libec.a and use the CRemoteConnector->ConenctToCore and stuff. This + will be expanded for a proper EC API. + * Did some EC API examples so someone can expand it. + * Tooltips, proper names, and layouts for the connection ports. + * Fixed compilation flags for base-only apps. + * Lots of GUI visual glitches fixed. + * Fixed ping times on servers being in ms instead of secs. + * Now core timer is on a thread, and it behaves much better. + * Fixed core timer silliness on time count. Much more acurate now. + * Workarounded the memleak caused by wx < 2.6.2 + * Fixed it.po (twice). + * Some debug to aid locating rogue clients and know if it's actually us. + * Save source seeds now saves 10 sources, but only keeps them for a + Max of 2 hours. + * Added search expressions class and parsers. + * Fixed flex usage when --header-file is not available. + * Proper POTFILES.in + * Fixed systray's Connect/Disconenct to include Kad. + * Fixed a huge bug that was sending TOO MUCH packets (UDP) to + servers. This alone is a reason for a release. Fixes the server list flicker, too. + * Kad status fixed for remote apps, and included "running" status. + * Kad info is shown on Kad tab on remote GUI. + * Avoid ping storms by lugdunummaster request, adding a random value + to server UDP ping. + * We should not publish FT_FILEFORMAT at all. Fixed. + * Publish only file rating if we have any. + * Update on server flags - added related search and type tag integer. + * FT_FILETYPE can be an integer for newer servers, added support. + * As for lug request, newer servers get a integer filetype tag if supported. + * Enable connect/disconnect Kad from remote gui. + * Some basic warnings on value changes for preferences. + Now, if you request a change on preferences that requires restart, like + ports, incoming/temp folders, and others, aMule will warn you on "OK". + * Don't connect to ed2k on server double click if the network is disabled + * More warnings: Kad without UDP port, and Kad conenct while disabled on + preferences now raise a log warning message. + * Dynamic set of GUI options to avoid visiting prefs multiple times. + * Warn if UDP disabled and Kad enabled on preferences. + * Fixed Scanner.y to allow compilation with old flex versions. + * Fix installation or webserver's Kad page. + * Use the generic function instead of X11-specific one for geometry parsing. + Fixes compilation on several platforms and removes dependency on X11 headers. + * Removed duplicated code and cleaned CDirectoryTreeCtrl + * Fix for continuously trying to solve a DNS server. + * Fixed some memleak on contact results. + * Fixed mem corruption, and contact asserts on the new merge code + for kad contact trees. + * Kad notes filtering + * Fixes crash on startup onMac and Windows caused by an unitialized + variable being used at dialog construction. But not on wxGTK. Go figure. + * Update on wxwin.m4 to wx-cvs of 15/12/2005 and proper base flags usage. + * Minor amount of libs to link for wx, instead of all libs. + * Fixed a crash on wxGetTranslation usage on Windows. + * Fixed an assert on folders tree control on windows. + * Fixed the initiazlization of status_arrows to proper size (16x16) on Windows. + * Fixed the status arrows on windows, and fixed wxWidgets bug that caused it. + * Changed file to output stream on HTTP download. + * Fixed a endless loop on downloading files < 10 bytes on HTTP. + * Fixed Kad nodes download by stopping Kad before the file is renamed. + * Fixed crashes on HTTP download. + * Added support for proxy usage on HTTP download, via environment variables. + * Fixed input streams on FileFunction's handling of gziped files. + * Fixed download of gziped files on windows. + * Fixed extension Kad search + * Fixed crash on search + * Removed the sending of "Any" type to server - is the default. + * Fix search types and return values on ed2k/kad search. + * Fixed a wrong Kad packet being created on a race condition caused by the + removal of a file from shares that will just get published. To be added on eMule, too. + * Fixed Open File command on categories. + * Fixed detail level on EC tags failing silently on lower values. + * Fixed crash on remote gui if not config folder not existant. + * Created, fixed, killed the --enable-kad-compile switch to enable + non-kad compilations during test phase. Now is always compiled. + * Removed platform specific getlocalhost usage. + * Fixed ntohl usage on gap list saving. + * Removed wrong Merkur (c) from php libs (sorry Merkur, but those are ours :P) + * Fixed strings on log categories for protocol. + * Listensocket's fixed for debug on connection accept. + * Multiple Kad searches are allowed now, with independant tabs. + * Debug messages regarding late / unwanted kad searches results. + * Fixed Kad gui search return messages. + * Safety code on shared files' RotateReferences. + * Fixed endiannes on CUInt128::setValueBE / CUInt128::toByteArray + * Fixed ENDIAN_SWAP_**(x) definitions to use the proper + wxUINT**_SWAP_ON_BE/ON_LE/ALWAYS macros. + * Publishing of keywords (shared files) works now on Kad. + * Implemented Kad GUI. + * Fixed low speed connection to sources when only connected to kad + * Fixed Kad callback of lowid sources. + * Fixed Kad usage when ED2K is disabled. + * No more auto-reconnect on disconnect (woops). + * Speed up catch and proper window ID on HTTP download class. + * Added wxIdleEvent::SetMode(wxIDLE_PROCESS_SPECIFIED) to + app startup, cutting CPU usage a lot. Go figure. + * Changed the socket destruction to socket's Safe_Delete. + * Fixed a GetUDPPort usage where GetEffectiveUDPPort should be. + * Added UDP socket warnings on unknown errors. + * Client UDP socket error handling rewritten. + * Fixed UDP socket heap vs stack problems. + * Proper check for libgd (Sorry!). + * Showing Kad state on conection for fast reference. + * Added some code to catch unhandled exceptions on kad + and report them, so we know what's going on. + * Fix for crash/assert on wrong permisions on cryptkey.dat. + * Fixes for daemon compilation on OnRun usage. + * Fixed a Crash on Kad caused by packet constructor + deataching the data, causing a double-delete. + * Safety code for uncatched exceptions. + * Some changes to packet processing. + * Fixed a big mem bug on Kad. + * Fixed a bug with iterator usage in SearchManager.cpp + * Fixed a bug on PARTSIZE calculation that could lead to + insanely large partsizes. + * Fixed possible buffer overflow on gap saving + * Fixed the RSB of this release. you know, one per release. + (for those that are new to aMule, RSB = random socket bug) + * Cleaned, cleaned, cleaned code. + * Fixed: + 0000492: aMule gui fails to compile when using wxMotif 2.6.1 + 0000514: Not all common file types recognized as Audio + 0000516: crash after repeated search + 0000646: right click on transfer files randomly disabled + 0000659: disconnect button might not disconnect kad and block it's function + 0000661: windows consistency + 0000662: amulecmd crashes on invalid pause command + 0000671: open file on double-click + 0000691: connect/disconnect button is still broken + 0000704: servers connection cancel button + 0000715: prefs -> general -> "downloadlist dblclick to expand" option is + broken or something + 0000716: prefs -> seeds save, wrong text + 0000718: more systray ignoring kad + 0000719: searches -> extended -> min size vs max size + 0000730: statistics connections graph Range requires restart + 0000729: search query string parser + 0000732: more brackets related bugs + 0000733: download button activated when search fails + 0000734: non-restored icon in Directories -> share + + lfroen: + * PHP engine implementation for amuleweb + * Porting web templates to PHP script + + lupz: + * Kad speed improvements. + * Kad sources search improvements. + * Fixed manual bootstrapping via the Kad dialog. + * Properly swap IPs when doing logging in Kad. + * Avoid trying to close the file multiple times when resuming a + part-file that failed to complete. + + Phoenix: + * Removed wxGTK and wxGTK-devel dependencies from the spec + file. They don't work on all distros, even worse, don't always + work with Fedora Core. + * Created a new spec file, compliant with Fedora Core. + * Fixed a crash when aMule was shut down by amulecmd and an + assert happened. + * Fixed asserts on exit about non-empty lists when aMule was + shut down by amulecmd. + * Small compilation fixes. + * Fixed deadlock in ClientUDPSocket.cpp. + * Crash handler improovement, avoid calling functions that + may allocate memory. + * Fixed some compile warnings in WebServer.cpp. + * Fixed a crash in SharedFilesWnd.cpp due to aMule beeing now + multithreaded. + * Changed wait4 to waitpid in amule.cpp, to improove + compatibility with old HP-UX systems. + + Ramiro: + * Patches to compile on a NSLU2 (ARM). + + RazZziel: + * Changes on parent ownership on windows. Partially fixes + 0000690: List of windows that can be overlapped by main + window and leave aMule apparently freezed + + schtroumpf: + * File rating in search dialog. + * New file rating icons. + * Replaced file rating good/bad with a rating average like in emule. + * Amule submits file rating to the server. + + Seagull: + * Fixed a small bug on client list view. + + shakraw: + * Merged with 2.0.3 latest fixes (r4630, r4631, r4633, r4639) + + stefanero: + * Fixed cas,wxCas and xas infos for Kad when only connected to + Kad + * Imported amps in aMule source + + thedude0001: + * Added CVS snapshot date to frame title. + * Fixed #560: "aMuleWebDLG and aMuleCMDDLG do not report version" + + volpol: + * A4AF transfer speed display fix + + Xaignar: + * Fixed the possibility of crashing when sending a message to a non- + friend client, caused by the fact that the client could be deleted + before the user entered the message. Also prevented attempts at + sending messages clients that wern't ready. + * Fixed crash when '--version' was used, caused by an uninitialized + pointer. Serveral other uninitialized pointers were also fixed. + * Fixed assert in the Type-To-Select code which would trigger when + items were removed and the old tts index pointed past the last item. + * Fixed kad-searches with a filetype specified not producing any + results, caused by using obsolete type-strings. + * Added missing calls to va_end at places where va_start is called. + * Remove unneeded calls to wxMutexGuiEnter/Leave. + * Fixed the listctrls asserting if one were to click past the end of + the last column header. + * Fixed unhandled-exception handling in unittests, which had been + broken when they were made console apps. + * Fixed sscanf call in PHP lexer, which had switched the source and + the format arguments. + * Performed audit of printf type calls. Serveral bugs caused by using + the wrong printf variant were fixed in the webserver. All instances + of calls to sprintf variants were changed to snprintf to prevent + buffer overruns and calls to printf that passed a dynamic string as + the format string were changed to prevent using untrusted format + strings. Lastly a few places where widechar and char where mixed + were fixed. + * Avoided checking the same folders multiple times when looking for + shared files, by ensuring that duplicate entries (from categories, + etc) are ignored. + * Fixed minor mem-leak in CTimer. + * Deleting a static server now also removes it from the static list. + * Fixed disabling of graphs while the prefs-dialog is still open. + * Fixed logging on UDP-sockets displaying an integer value rather + than a dot-IP. + * Made the ipfilter.dat URL field independant of the auto-update + check-box, to allow for easier manual updates. + * Fixed log-events not being written the logfile on full daemon. + * Improved displaying of errors when starting the webserver from + amuled. + * Allow resuming of files that error'd out during completetion. + * When checking if a file is already being downloaded/shared, check if + the actual file is still available. This allows redownloading of + shared files that have been removed, without having to reload the + list of shared files. + * Added checks to see if the target filesystem is fat32 when + completing files, and removing known illegal chars in that case. + * Important log-lines are now bolded in the log textctrl. + * Redirect wxWidget log-events to the aMule log. This avoid the popups + that wxWidgets would display by default. + * Made the unittests proper wxConsoleApps. + * Open the preferences dialog non-modally, so that it doesn't block + the main GUI. + * Switched manual path-joining to using the generic function. + * Fixed the "pause all" and "cancel all" commands via remote. + * Fixed bad replies on sharedfiles-list requests when public viewing + of the list is disabled. + * When a message is filtered, always display the "Message filtered + ..." log-entry instead of the "New message ..", rather than only + displaying the "Message filtered" the first time, and then only the + "New Message" the following times. + * Cleaned up the file-completion thread and fixed the following: + * If creation or starting of the thread failed, the file would + silently fail to complete. + * If the file was renamed, the download queue show the old name. + * If the file was renamed and didn't have an extension, the "(x)" + component would be added to the front of the filename. + * When checking for unused filenames, if an file with the same name + exists, the path would be a changed to the standard incoming + folder regardles of the file's category. + * wxFileExists was used to check for the existance of the files, + possibly leading to false negatives with unicoded filenames. + * Fixed files being added in stopped-mode when the "Add downloads in + paused mode" setting was enabled. Since the "Start next ..." works + on paused files, this makes more sense. + * Fixed bug #513. When "Start next ..." and "Same category .." was + enabled, we would still select downloads from the wrong category, + when there was still paused files in the desired category. + * Changed the StopPausedFile from actually stopping the file to simply + clearing the sources, as this is the intended goal. Stopping the + file was wrong, considering that it would leave a window of one hour + in which the "Start next paused download" code would be useful. + * Added generic function for joining two paths. + * Dont allow renaming of downloads that are being completed. + * Made the comment-list dialog resizable. + * Enabled use of tool-tips on all wx-variants. + * Fixed Kad-Info and ED2K-Info lists not having any scroll-bars. + * Fixed compressed Kad packets having the wrong procotol set. Thanks + to Gnucco for the pointing this out. + * Only show the root-item circle for incomplete part-files. + * Prevent the adding of friends without IPs, via the clientlistctrl. + * Fixed serveral problems caused by the reuse of the preferences + dialog window. + * Improved the popup menu on the downloads listctrl. + * Fixed starting of next download being called under the wrong + conditions when files were deleted via remote. + * Dropped the HTML version of ed2k-links. + * Fixed shutdown of the amulegui when the systray is enabled. + * Fixed bug #359. The preferences dialog is now reused between + sessions, so the last used page and the state of the shared-files + tree is remembered. + * Only enable the host-version of ed2k-links when a hostname has been + specified (still no perferences widget for this). + * Fixed bug #700. The partfile conversion window is now raised + properly when the button is clicked again (doesn't work with gtk1). + * Improved logging in CFile in situations where system-calls are used. + * Improved permissions checks for the .aMule folder. Also added checks + for the Temp and Incoming folders. + * Fixed an unconditional Close call when creating part-files, which + happened even if opening the file failed. + * Fixed the names of friends being cleared on the chat-notebook when + the clientobject disconnected. + * Ensures that both the downloadlistctrl and sharedfileslistctrl are + both up to date when a file has been renamed. Also switched to using + the same dialog on both listctrls. + * Check for items being sorted was moved to the CMuleListCtrl class, + and to fix flickering on the server-list and and searchresult-lists, + which is caused by insertions and deletions, the list is resorted + instead, if an item is out of order after an update. + * Drop the use of jugle.net. It's dead, Jim! + * Changed the 'Clear' button on the search-page to only clear + search-results. The 'Reset' button now takes care of the text-field + and any extra parameter-fields. Serveral fixes were made to make + sure all fields were properly cleared. + * Properly set filtering on newly added search-results. + * Fixed broken sanity check in AddDownload + * Bug #688. Made the popup menu on the searchlistctrl similar to those + on the downloadlistctrl and sharedfileslist. + * Added serveral missing exception-handlers. + * Ensured that the internal libs are only built when needed. + * Fixed ed2k-links causing duplicate entries on the download-queue and + made the sanity checks in AddDownload safer. + * Made the interal CryptoPP files part of the one of the temporary + libraries to avoid building it three times (amule, amuled, amulegui). + * Removed printf-call from signal-handler. + * Unified download-handling on the search-page and fixed the download + button, which was broken by previous commits. + * Fixed a leak in the UDP sockets which occurs when packets are sent + via a dead or closed socket object. + * GetInstallPrefix is broken on wxWidgets 2.6.2, so only use it when + building autopackages (since we can patch the sources). + * Improved logging in case of clients requesting invalid file-data. + * Cleaned up autoconfigure files a bit. + * Added sanity checks to the downloadqueue's AddDownload function to + catch this, should the problem appear again. + * Added checks to avoid loading duplicate partfiles, since downloads + are identified by the hash. A warning is now issued when this + happens. + * Add a "Download in category" sub-menu to the right-click menu on + searchresult lists and moved download handling to CSearchListCtrl. + This fixes bug #673. + * Specify if debugging was enabled on version strings. + * Ctrl+a now select all items on listctrls. + * Make aMule relocatable in regards to locales, and amuleweb + relocateable in regards to templates. This is needed to allow usage + of autopackage. + * RotateReferences() now properly handles shifts larger than the + number of files present and use std::rotate. + * Files that are larger than the limit imposed by the ed2k network are + now filtered from search-results. + * Fixed drawing of the first column on the shared-files list, caused + by the upgrades to the listctrl code. + * Made one-shot CTimers interruptable and fixes a memleak in the Start + functions caused by not freeing old threads. + * Upgraded our included listctrl with the bugfixes from v2.6.1 + and v2.6.2 of wxWidgets. + * Fixed a couple of AICH log messages that were mixing unicoded + strings and non-unicoded strings. + * Made middle-clicking on the client-list work in the same way as + middleclicking on the downloadqueue, and cleaned up click- + handling in general. + * Fixes the overhead-handling code in CTimer which wouldn't + check if overhead was larger than the period, resulting in + calls to Sleep with an underflown value. Also fixed events + possibly being lost due to overhead. + * Fixes crashes due to uncaught read-past-EOF exceptions when a + cliented requested a block from a file past the end of the + actual file-length. + * If aMuled is run and ECs are enabled and no password is set, + dont reset the EC setting, but rather display instructions + that specify what to do before terminating. + * Added warning which will be displayed if aMule is run as + root, which is adviced against for obvious reasons. + * Removed the --disable-systray configure option, since extra + libraries are not required now. To disable the systray now, + simply use the preferences. + * Removed support for wxWidgets version older than v2.6.0. Support + for wxWidgets 2.4.2 had been broken for a while, without anyone + complaining, and the v2.6.x branch has been out for long enough + to make usage of the v2.5.x branch nonsensical. + * Added workarounds for the wxWidgets memleak when using GTK2 on + versions of wxWidgets < 2.6.2 to the remaining places where this + would occur. + * Changed failure on file-seeking into a catchable exception, + rather than a runtime error. + * Fixed a crash on shutdown caused by the listensocket now being + closed which caused a call to Accept to return NULL. + * Fixed compilation with GCC-4.1 (snapshot). + * Syncronized look of client-icons on download-queue and the + client-lists (upload, queued, all), so that all display the same + information. + * Display an icon when downloads have comments but no rating, and + added the same icons for both to the shared-files list, making it + easier to keep track of what files are commented/rated. + * Fixed all warnings reported by -Wshadow and -Wundef. + * Added the compiler-flags -Wshadow and -Wundef, and changed + configuration such that warnings are enabled for both debug and + non-debug builds. + * Largly reworked the CTimer class: + * Fixed all timers sending events with the same ID. + * Removed use of static variables which would cause troubles if + more than one repeat-timer was used. + * Ensured that no event would be sent if the timer was stopped + while sleeping. + * Improved thread-safely a lot and made the threads detachable. + * Added function for terminating all timer-thread on shutdown, so + that no timer-threads will be left running. + * Fixed SSE2 support check in the embedded cryptoPP code, for gcc-4. + * Fixed a couple of bugs caused by variable-shadowing. + * Flush log-buffers when waiting for either of the hashing threads to + terminate. + * Removed manipulation of gui-mutex in AICH thread, which are no + longer needed due to changes in log-handling. + * Removed local variable which shadowed a variable when checking if a + client was a friend. This caused the friend to link to said client + even after the client had been deleted, since the client would not + unlink itself from the friend. + * Only store the descriptions of IP-Ranges for the ipfilter on + debug-builds, since this value is not used on non-debug builds and + can account for serveral MB of used memory. + * Fixed new-connections being opened on shutdown and the new clients + being created. This should fix the assertion in CClientList. + * Added a call to wxUpdateUIEvent's SetMode function, to reduce the + ammount of unnessesary events being generated. + * Fixed clearing of background for list-items that do not have a + background color set. + * Resized a couple of buttons that were too small to display their + image. This fixes bug #648. + * Improved double-buffering of listctrls a bit. + * Fixed auto-sorting checks on the server-list, which were inverted, + causing items that were already sorted to be re-position and so + forth. This was the source of the large ammount of flicker on the + server list. + * Fixed the "Time Remaining" column on the downloadqueue when no + downloads were taking place. + * Removing unneeded checks for fat32 filesystems. + * Improved handling of closing of the preferences dialog. + * Changing kad-nodes label to display "Nodes (0)" by default. + * Force the UBT to take a increasingly longer nap between loops when + it fails to send anything, which ensures that it wont go bananas it + is unable to upload at the specified rate. This would happen for + instance if the limit is set to a value higher than the physical + connection limit. This fixes bug #606. + * Re-added the node count above the kad-graph, and a few other changes. + * Removing unused color-setting, which was causing problems with the + kad-graph. For this change to take effect, you will have to remove + your StatColor* entrires from amule.conf. + * Fixed bug on the kad-nodes statistics, where entries added while the + dialog was not displayed would have the value of zero. This fixed + bug #652. + * Fix for selecting tabs (+ popup menu) via right-clicking on GTK2. + * Allow previewing of audio-files, fixing bug #654. + * Reworked the ED2KLink class: + * Simplified parsing a lot. + * Moved the task of handling sources specified in file-links + almost entirely to the download queue. + * Improved error checking. + * Implemented handling (not just parsing) of part-hashes and + master-hashes specified via file-links. + * Fixed support for multiple sources in a file link, which fixes + bug #506 + * Properly replicate file permissions when copying files via the + UTF8_CopyFile function. Also removed an unneeded free/malloc set of + calls by allocating on the stack. + * Added the ability to execute commands when a download has been + completed and removed some unimplemented options from the + preferences. This fixes bug #152. + * Update the "clients on queue" count when purging clients. This + should resolve bug #478. + * Properly disable filtering on searches when filtering is supposed to + be disabled. This approach does also not remove the existing + search-string if filtering is toggled on and off. + * Fixed the kad-statistics using the colors of the download-statistics + rather than its own settings. + * Implementing kad-node graph. This patch does not add support for the + graphs on the webserver. + * Removing trailing "i"s from time values created by CastSecondsToHM. + * Reduced log verbosity when deleting downloads. + * Sync deletion of items on friend, download and server lists via the + Delete key. This resolves bug #649. + * We now completly disallow the sharing of the users home-dir. + * Changed the check for file-size in the hasher-thread, which was + using a too large value, greater than what is actually supported by + the ed2k network. + * Fixed compilation on the x86 version of MacOSX. + * Added specialization of the CRangeMap class which doesn't contain a + user-value per range, dubbed CRangeSet. + * Added the IP and port of friends to the initial text when opening a + chat window. This should more easily allow for adding of clients to + the friends list if they message us. This is not a final solution. + * Added sanity checks to CStatisticsDlg's getColors function. + * Changed some CList instances to stl containers. + * Fixed bug in CKnownFile where auto-priorities would be updated + before the source had been added to the list. + * Improved testing of CRangeMap's iterator classes. + * Final changes to CFile, CMemFile and CFileDataIO: + * Documentation of the classes and functions completed. + * Completed unittests for CSafeFileIO, CFile, CMemFile. + * Changed systems calls to explicitly use 64b calls on win32 + systems, since win32 uses 32b calls by default. + * Lots of other small improvements. + * When sorting search-results by type, sort items with the same type + by their extensions. + * Added the hotkey Ctrl-Q for closing aMule. + * Dont store the results of unittest that didn't fail when executed, + since we ignore successes anyway. This causes a great speedup on + some tests, where a large number of checks are made. + * Set the update frequency for the statistics, fixing bug #637. + * Strip 's from paths set via amule-config-file, resolving bug #638. + * Reworked the TTS implementation, so that control-sequences are + passed to the widget, improved walking through the list by + repeatedly pressing a letter and finally fixed the use of + arrow-keys on some locales. + * Also clear the log-line (lower-left) when the log is reset. + * Replaces a few "wxASSERT(x); if (!x) return" with wxCHECK(x)s. + * Force an update when the file has been completed, which allows the + DownloadListCtrl to detect that a file has been completed. + * Optimized the unicode-conversion functions, which were causing + unneeded copies to be made. + * Only enable the clear-completed button and menu-item when there are + completed items. This resolves bug #403. + * Fixes deadlock triggered when a UDP socket tried to recover. + * Fixed compilation for 64b systems, caused by mismatching parameter + types in a pure-virtual function. + * Improved sanity checking of DNS resolutions in CServerUDPSocket. + * Fixed a few calls to CFile's Create function, which were using a + wrong parameter type for the second argument. + * Changed MuleUnit to output results as soon as possible. + * Added generic CMuleUDPSocket class, which unifies common tasks such + sending, receiving, error-handling and interfacing with the + UploadBandwidthThrottler. I also included a recovery mechanism + for when a socket becomes invalid, which fixes bug #489. + * Fixed crashes when kad is enabled but the ClientUDP-socket is not. + * Fixes names not being prepended to debug messages. + * Fixed potential mem-leak on the download-queue. + * Fixed secondary sort-ordering on the download-queue. + * Changed source-handling so that we can distinguish between sources + returned from the local server and sources returned from global + servers. + * Added debugging messages for when sources are received from an + unknown file. + * Removed remaining fake-check stuff and fixed assert repported by + stefanero, caused by a bit of fake-check code left behind. + * Changed handling of log-entries from worker-threads, so that these + are queued rather than sent immediatly. This is needed since adding + a pending event requires locking of the gui-mutex, which easily + leads to deadlocks. + * Fixed race-condition in the download-queue, where multiple DNS + resolution threads could be created for the same hostname. + * Fixed an assertion in the kad-dialog caused by an insertion at an + invalid index. This only happened for some versions of wxWidgets. + * Fixed color-updating of items being downloaded from the search-lists. + * Re-implemented rating icons on search-result lists using the builtin + support for icons on wxListCtrls. This saves us from having to + manually draw everything and fixes the crash on using TTS. + * Fixed a bug in the ObservableQueue class, which would cause UDP + requests to servers to be done only once, whereafter no further + requests would be made. This was the source of the problem with + aMule not finding sources for newly added files. + * Fixed a race-condition in aMule when shutting down while a global + search is running. This should resolve bug #563. + * Reworked the CServerUDPSocket class a bit, most importantly, changed + it so that servers being deleted while we are doing a DNS lookup on + their hostname cant result in accessing of dangling pointers. This + should bug #581. + * Fixed bug #558. Sources not being sorted when the download-queue was + sorted by the "Time Remaining" column. + * Cleaned up file-ratings and comments handling: + * Dropped the m_hasRating and m_hasBadRating booleans, as these + can be infered from the value itself. + * Dropped the SetHasComment and SetHasRating functions, as this is + more safely handled in UpdateFileRatingCommentAvail. + * Cleaned up the UpdateFileRatingCommentAvail function since it + was rather messy. + * Removed a unnescesarry call to Notify_DownloadCtrlUpdateItem in + the function ProcessMuleCommentPacket, since this is already + done in the UpdateFileRatingCommentAvail function. + * Added sanity checks to the code that made use of said file-ratings. + * Added sanity checks against file-ratings read from other clients, + since we later rely on these values to be in a specific range. + * Fixed some uninitialized variables. + * Make ascending the default sort-order and fixed loading of the + sort-order in the CMuleListCtrl class. + * Added a missing call to Skip in the TTS event-handler for item + selections, so that subclasses will still be notified. + * Reworked CMuleListCtrl and added support for "Type To Select", or + the ability to select items by typing parts of their name. The + selection is made against the start of the text-strings and is + case-insensitive. + * Fixed some more warnings. + * Fixed compilation problems with external CryptoPP sources, caused by + a preprocessor define which clashed with a variable name. + * Changed the length parameters of the read-funtions in the CFileDataIO + interface to be unsigned, since signed lengths doesn't + make any sense in this regard and makes error-checking harder. + * Merged checks for the ARM and Sparc architectures. + * Changed a call to bzero to memset, since win32 doesn't have bzero. + * Fixed remaning issues with template usage in MuleUnit. + * Cleaned up error handling in CClientUDPSocket a bit, and added + error-checks to CServerUDPSocket. This should allow us to see if the + INVSOCK errors are local to CClientUDPSocket or if they happen to + all wxDataGramSockets. + * Added check requiring a valid port to CClientUDPSocket's SendPacket + function, since we apprently tried to send to port 0 once in a + while. + * Moved adding of sources read from seeds files out of the + exception-handler, to avoid the obscuring of possible bugs elsewhere. + * Final touches made on the CMemFile class, which includes cleanups, + improved error-checking and complete documentation. + * Added missing destructor to CUInt128, which was causing compilation + failure for some GCC-4 users. + * Fixed an attempt to fprintf a wide-char string. + * Enabled the use of kad with wxWidget versions 2.5.x. + * Improved handling of uncaught exceptions in MuleUnit and changed the + library from being an actual wx application, since we only need to + make use of wxWidgets classes. + * Expanded the CFormat testcases a bit, to better cover use of illegal + values and the checks against those. + * Improved checking of value convertions in CFormat, now properly + detects nagative values converted to signed values and signed to + negative, plus some other situations. + * Fixed format-strings in the statistics-tree that did not specify a + type large enough to actually represent the possible values. + * Disabled certian tool-tips for wxWidgets-2.4.2, since the calls made + use of functions that were introduced in wxWidgets-2.6.x. + * Moved archive-unpacking functions from the HTTP-thread to + FileFunctions.*. This allows for compressed files to be read both + when the source is the inbuilt HTTP downloader, or if a compressed + file (ipfilter.dat or server.met) is explicitly moved to the .aMule + folder. + * Changed C++ style comments in C sources to using C style comments. + * Added check against trying to write NULL pointers in the CFileDataIO + WriteStringCore function. + * Added some initial tests for the string reading and writing + functions to the CFileDataIO unittests. + * Removed the RepeatLastAction stuff from CClientReqSocket. + * Fixed the check for BOM-header failing on strings that were + 3 bytes long (an empty string). + * Fixed empty UTF8 strings with BOM headers not having the header + written, even though we had already written a length which + included the header. + * Changed CSafeFileIO's ReadUInt128 to return an instance, which + simplified usage and matches the other Read-functions. + * Added missing exception-handler to CIndexed in case of invalid tags. + * Marked the log-event triggered when an IP was filtered as + non-crticial, since this event isn't critical and can be very common + depending on the ipfilters used. + * Changed unittests for CFormat when empty strings were specified for + a field of type '%s', since some implementations of printf produced + different results than others, making it impossible to check against + those. + * Fixed unittests for reading of UInt128 values which didn't consider + endianess. + * Changed the use of Cmp to either '==' or '!=' to improve + readability, and simplified the sorting of the server-list when + sorting by name to only use the displayed name, since the special + cases that were being considered led to unpredictable results. + * Fixed non-wxbase apps not terminating properly. + * Fixed adding of comments to shared files. + * Properly implemented a couple of functions for the remote version of + the DownloadQueue, which did not match the signatures of the normal + class. + * Changed CMuleListCtrl's SetSortFunc to public, so that subclassing + isn't required in order to sort a list. + * Dropped the "otherfunctions" namespace, since we ignored it almost + everywhere anyway, via the "using" keyword. + * Updated CFileDataIO unit-tests. + * Fixed UpdateState getting called on clients after they had been + deleted (in some cases) and moved the call to the CUpDownClient + destructor. + * Made CTag and CPacket unassignable. + * Renamed ReadHash16 and WriteHash16 functions of CFileDataIO, and + changed them to return instances and take const references of + CMD4Hashes, rather deal with char*. A few other places were + similary changed. + * Dropped the static Exists function from CFile, as it is simpler to + just call wxFileExists directly. + * Removed the ability to attach/deattach file-destriptors to a CFile. + * Merged handling of seeking in the CSafeFileIO interface. + * Some more changes to CMemFile: + * Making seek const and dropped resizing of the buffer if it + seek'd past the end. + * Made the class uncopyable and unassignable. + * Changed the constructor that takes an external buffer to take a + char* rather than a const char*, since the class allow for + modifications of attached buffers. + * Removed the growth-rate from the attached-buffer constuctor, as + we dont make use of it and should avoid it in any case. + * Added sanity check for the length passed to the SetLength + function, to avoid accepting negative values. + * Other misc changes. + * Removed the ability to detach a buffer from a CMemFile and the + accessor function that returned the current buffer. Instead, we now + simply use the Read function, which is equivalent of what we did + before in any case, but safer. + * Unified the logging of packets received from other clients, so that + the type of packet received is always logged, as is the cause in + case of an error. + * Fixed a couple of assertions which had the checks inverted. + * Merged CFile and CSafeFile. Checks on reads and writes are now + performed in the CFileDataIO base class. The CFileIO class used in + kad was updated to handle this, though it currently only understands + EOF exceptions. This completes the majority of the changes + resolving around the usage of exceptions. + * Fix compilation error that would only trigger on some versions of + GCC, even though the code appears to be illegal. + * Disabled pragmas when building unittests. + * More fixes in MuleUnit for templates. + * Disabled logging when running unittests. + * Changed CFileDataIO to use the new IO exception types, which allows + for better error handling (i.e. EOF exceptions, IO read/write + failures) and prepared for making use of the IO failure exceptions. + * Reorganized, and removed some includes. + * Fixed a couple of places that threw exceptions by pointer. + * Moved exception handling from CServer to CServerList when loading + servers, which better allows for handling of invalid servers. + * Fixed some debug-strings which were wrongly marked for translation. + * Added IO-exception types, which will be used by CFileDataIO. + * Moved exception handling from CFriend to CFriendList when loading + the list of friends, so we can stop trying to read a bad list. + * Added missing include to MemFile.cpp + * Changed some runtime-error checks from throwing the CInvalidPacket + class to instead using the MULE_VALIDATE_* checks. + * Simplified the usage of CTags by changing the getter functions to + throw an exception if the function didn't match the type of the tag. + This allowed for the elimination of explicit checks in most places + where CTags are used. + * Initialized an uninitialized variable in CContact. + * Fixed stack-trace parsing for files with '+' in the name. + * Improved exception handling in the CTag constructor would could leak + if the tag had a string name and reading the body raised an exception, + or if the tag was a blob and reading the body failed. + * Added checks for code that uses the CTag class, since just assuming + that a tag with a specific id is of a specific type is unsafe. Also + changed the getter functions to return a default value should they + be called on a tag of the wrong type to avoid crashes in that case. + Finally, we no longer just ignore unknown tag-types, instead we + throw an exception. This is needed because we cannot determine the + length of the unknown tag, and thus can't skip it, making further + reads from the input file suspect. + * Largely reworked the use of exceptions. Catch(...) is out, only to + be used when memory-leaks are to be avoided. This insures that + unexpected exceptions can be detected. + * Removed an exception handler that didn't have anything to catch. + * Changed CreateHashFromInput to use the CSafeFileIO interface and to + safely handle exceptions without leaking. Also removed some + definitions of MFC debug-macros and replaced them with wx macros. + * Fixed the largefile-checks under windows. + * Changed CMemFile and CFile to implemenations of the CSafeFileIO + interface. CSafeFile was moved to CFile.* to avoid circular + dependancies. + * Dropped the CSafeMemFile which didn't provide any extra + functionality and instead made CMemFile derive from CSafeFile. + * Simplified CFile a bit, in preparation for larger changes: + * Removed the Length() function, since there is also GetLength(). + * Removed duplicate definition of seek enums. + * Changed the checks for large-file support so that users wouldn't + have to export the LD_LIBRARY_PATH variable or similar when running + configure. + * Updated CIPFilter documentation. + * Changed the ipfilter class from just asserting on invalid ranges to + not actually inserting them, since that would cause undefined + behavior. + * Compilation-fix for Mandrake Linux. + * Added checks against largefile support to configure. + * Added helper-function that returns the length of a file, without + having to open it first. + * Moved the loading of the ipfilter-files so that they are loaded + before the server.met file is loaded. This ensures that the servers + are filtered when start aMule. + * Fixed some problems in MuleUnit when used with templates. + * Fixed the CheckNewVersion function, which would crash on failure. + * Dropped extra verbosity from CFormat's assertions, since they now + produce backtraces anyway. + * Moved backtrace functions to the MuleDebug.* files and added + backtraces to uncaught exceptions. + * Improved assertion-handling on shutdown and other situations. + * Increased the verbosity of assertions in CFormat. + * Fixed the "Is Textfile?" check which didn't handle whitespace. + * Added support for gzipped ipfilter.dat files and added checks that + should ensure that we only try to parse text-files. + * Added function for converting long-longs to strings in MuleUnit. + * Moved some functions not part of the CFile class from the CFile.* + files to FileFunctions.*. + * Fixed a bug where shared files could be added to the shared-files + ctrl multiple times. + * Fixed the hasher-thread, where the wxMutexGuiLeave function was + called twice and improved error-checking on thread-creation. Lastly + moved static variables from the header, since they need not be + specified there. + * Removed non-functional hack from CClientUDPSocket, which would cause + an infinate loop when triggered. + * Improved handling of assertions that occur during startup. + * When adding sources, add the source to the appropriate file first, + before trying to update comments and ratings availability. + * Removed a couple of checks against 'this' being NULL. + * Changed the handling of UDP requests for sources, so that the + locally connected server would be entirely skipped, instead of the + packets just being discarded. + * Fixed a number of places where attempts were made to catch by + pointer, even though the exception was thrown by value. + * Removed various unused variables. + * Fixed a bug in the download queue which would result in duplicate + entries on the queue for local source-requests. At the moment this + did not result in any problems since all entries were removed from + the queue once sources had been requested for the file. + * Removed the 'h' modifier from a number of format-strings where the + field type is 's', since that modifier does not apply to that type. + * Simplified mule-exceptions and added more information to the + unhandled-exception handler. + * Added unittests for CSimpleParser. + * Removed the need for exception-handling in CSafeFileIO's + ReadOnlyString function, by allocating the buffer on the stack. + * Fixed potential deadlock in CClientUDPSocket that could trigger when + an error occured during receiving. + * Removed a number of overloaded functions from the CSafeMemFile, + since neither of those added any functionality. Also fixed a bug in + the checks against reads past the end, that checked against the + buffer-size rather than the (possibly smaller) file-length. + * Marked CFile's GetLength() function as virtual. + * Removed the unused class CSafeBufferedFile, which didn't implement + buffered file-IO anyway. + * Added the ability to filter search-results. The filter select which + entries are displayed and supports regular-expressions. See + www.wxwidgets.org/manuals/2.6.2/wx_wxresyn.html for an overview of + the syntax. Also added the ability to filter known files from the + results. + * Added sanity checks on values read when loading settings for lists. + * The middle mouse button now opens the details-dialog for sources and + files when clicking on the download-queue. + * Fixed sort-arrows on listsctrls not being displayed after startup. + * Set the background color of the chat textctrls to white, in order to + ensure that the text stays readable regardles of the theme used. + * Largly changed the way ipfilter.dat files are handled by the + ipfilter class: + * When updating the list of ip-ranges, either via the reload + button or the update-from-url functionality, the existing ranges + are dropped to allow for dropping of ranges no longer to be + filtered. + * In order to allow for ip-ranges specified by the user, a second + file has been added (ipfilter_static.dat), which is always loaded + after the normal ipfilter.dat file, so that it takes precedense. + * When either of the two ipfilter files don't exist, a template + file is created which contains a description of the use that + that file. + * When loading zipped ipfilter files, the files are unpacked in + place. Doing so largely elimates the overhead compared to + loading normal files. + * Moved loading of the ipfilter.dat files, so that it done after + the GUI has been loaded. + * Removed the unused ExternalConnClientThread class. + * Merged two copies of the validateURI function in StringFunctions.* + and fixed a mem-leak. + * Simplified the Update() function in the ipfilter-class, removing the + use of special cases when calling it. + * Moved custom tokenizing code from the ipfilter-class to a seperate + class and dropped a couple of custom functions that didn't provide + enough of a performance boost to warrent the extra code. + * Added unittests for the StringIPtoUint32 function, updated the + documentation for the function and fixed the bugs that appeared: + * The last field was not restricted to the range 0..255. + * Fields containing huge values could overflow to negative values + and would not be caught by the sanity checks. + * Changed ASSERT_EQUALS so that descriptions only gets created in case + of a failed comparison, since this would otherwise result in the + attempted deference of end iterators and the like. + * Moved the RLE classes to a seperate set of source files. + * Removed probematic operator<() template function from WebServer.*, + and replaced it with a specialized struct. This was required since + the < operator would be instantiated for incorrect data-types. + * Updated documentation for the CFormat class. + * Dropped support for long doubles in CFormat and merged handling of + the other floating-point types. + * Improved CFormat unittest, which was cluttered by serveral variables + with too similar names. + * Fixed the ASSERT_EQUALS macro in MuleUnit, which would previously + evaluate parameters multiple times. + * Removed the unused NeedUTF8String() function. + * Fixed master-hash parsing for ed2klinks, which would always fail due + to a couple of assertions that had been badly translated into + exception. + * Changed the way clients are deleted on shutdown, to help detect the + presence of dangling pointers caused by incorrect removals. + * Fixed bug #494. Clients with score zero not being considered as + candidates for uploading. + * Fixed a few warnings. + * Improved handling of uncaught exceptions in the MuleUnit framework. + * Added unittests for the CFormat class and fixed discovered errors: + * Improved handling of string format fields. + * Fixed a < comparison of 0 against a wxString which caused segfaults. + * Fixed the range checking code which would fail in some cases. + * Fixed escaped percentage signs. + * Added the missing implementation of IsReady(). + * Improved adherence to printf as specific in 'man 3 printf'. + * Added unittests for the CRangeMap class and fixed the errors that + cropped up while writing said tests: + * The assignment operator didn't return *this. + * The equality operator was broken. + * The erase function was broken. + Also changes ASSERTS to MULE_VALIDATE_PARAMS to enable testing and + ensure that the controlflow stays the same for debug and non-debug + builds. + * Added a minimalistic unittesting framework called MuleUnit, which is + based on the EasyUnit framework (http://easyunit.sourceforge.net/). + The build target 'check' compiles and runs all existing unittests. + * Fixed crash in CClientUDPSocket caused by two threads trying to send + and receive at the same time. + * Removed unused Pause() function from UBT. + * Fixed inf. loop in CClientUDPSocket, caused by poor error-handling. + * Rewrote some poorly phrased messages. + * Fixed uploaded data not being recorded in statistics. + * Compilation fixes for wxGTK-2.4.2. + * Removed the unused 'MakefileWin32' file. + * Fixed crash in sockets that were destroyed after the UBT thread. + * Improved source handling for known-files: + * Fixed the possibility of source-counts getting out of sync. + * Optimized source-removal slightly. + * Added extra debugging checks to spot potential problems. + * Changed access to vector of source statuses from using the [] + operator to using the at function, to see if out-of-bounds access + was causing a specific crash. + * Imported the UploadBandwidthThrottler from eMule, which should help + ensure that upload-limits are more closely followed. + + Special Thanks To: + * All the translaters who did such a great and fast job. + +-------------------------------------------------------------------------------- + +Version 2.0.3 - The "Hell 2.0.3: Now with improved daemons!" version. +---------- +2005-06-15 + + ken: + * Enabled amuleweb to work from within the Mac application bundle + * Fixed Online Signature not actually being enabled when user sets the + preference + + Kry: + * Fixed #471 "compile error". Should compile on GCC4 again. + * Fixed Solaris compilation error on XParseGeometry. + * Fixed wrong MD5 hash calculation on 64 bits arch. + This fixes storing the wrong EC/webserver password on config file. + * Fixed unneeded GTK libs usage on aMule remote GUI. + * Added a warning on gd-lib not found (progressbar not shown on amuleweb). + + lfroen: + * New daemon socket code, event based. Improved reliability and + speed problems fixed. + + volpol: + * Fixed #417 "Upload priority is changed for completed files." + * Added new display filter "Active" + * Display of QR and aMule OS info in "Clients Details" dialog + + Xaignar: + * Fixed warning on EC disabled for aMule daemon. + + Special Thanks To: + + * All the usual people. + You don't know who they are? Just check previous changelogs + (just not the previous one, ok?) :P + +-------------------------------------------------------------------------------- + +Version 2.0.2 - The " [Your Ad Here] " version. +---------- +2005-06-04 + + boutros: + * Ported the eMule Chicane web template to aMule. + + GonoszTopi: + * Fixed #421: 'In Windows XP it lets to choose Konqueror, + Galeon and other Unix based browsers.' + * Fixed #406 and #380: 'some clients get an unexpected very + high priority' + + ken: + * Fixed a hang-using-100%-cpu-on-exit bug + * Fixed a crash when enabling UDP after startup + + Kry: + * Added Version Check (you can disable it on preferences). + * Added "source comes from" (on the "Time remaining" column) + * Now you can compile aMule without gettext, using --disable-nls + Additionally, aMule no longer stops configure if there is no gettext installed. + * Fixed aMule shutting down if a source seeds file is 0-size. + * Fixed HTTP download code not returning proper error code (causing crashes). + * Fixed OS_Info packet only being sent to downlaoding clients. + * Fixed Solaris mount info file name. + * Fixed includes on daemon for Solaris. + * Fixed mldonkey detection. Did anyone notice mldonkey bans aMule? + * Fixed SetAllTimeTransfered parameter size (thanks eylzo) + * Fixed #430: "Sources order by priority/status" + * Fixed #442: "Sort by 'Time Remaining' puts files which are not transferring first" + * Fixed #453: "Add option to export links with AICH hashes" + * Fixed #458: "Wrong gauge size on shared files control " + + volpol: + * Ports display fix. + * A4AF swap to this fix. + + Special Thanks To: + + * Bug reporters: + Ateo + BeFalou + MrFaber + xushi + + * All the usual people. You don't know who they are? Just check + previous changelogs :P + +-------------------------------------------------------------------------------- + +Version 2.0.1 - The " Woops, HotFix " version. +---------- +2005-05-18 + + ken: + * Fixed Tray Icon compilation on Mac. + + Kry: + * HOTFIX: Fixed 100% CPU usage because of network errors on some servers. + * Fixed crash after removing a server. + * Fixed sorting on the UploadList by Transferred (thanks eylzo). + * Users/Files on server no longer show as negative if server sends wrong values. + * Check for autopoint on configure to warn for gettext not installed. + + niet: + * Updated xal.pl (some fixes). + + Phoenix: + * Added DNS resolving functionality to amulecmd's connect command. + This is usefull for dynamic IP servers. + Now you can use the server's name instead of the server's IP address. + * Fixed a bug in http proxy authentication code. + + Special Thanks To: + + * Contributors: + eylzo + + * Bug and feature reporters: + albatros_la + Lucky_JL + Mr Faber + + * All the usual people (translators, debugers, people at #amule, etc) + C'mon, this is a hotfix release, I can't add everyone again. + +-------------------------------------------------------------------------------- + +Version 2.0.0 FINAL - The "Let's dedicate this to Tiku" version. +---------- +2005-05-01 + + BigBob: + * Compilation fix for WebServer.cpp and BaseClient.cpp with wx-2.4.2. + * Compilation fix for OtherFunctions.cpp with Slackware 9.1.0 + + CosmicDJ: + * NetBSD compilation fixes. + + deltaHF: + * Preferences for auto-sort download queue. + * TCP and UDP port start now at 0 (remember - running amule as root is insecure!!) + * Added aMule version info into "About" popup. + * Show current DL speed from a client you are uploading to in "Remote + Status" column instead of in the "Speed" column. + + geeko: + * Patch to complete html functionality of cas. + * Fixed seg fault in cvs due to wrong type check. + + gnucco: + * Improved the sources column and sorting in search window. + Now can toggle total sources/completed ascending/descending. + + GonoszTopi: + * Unicode fixes: + - UTF-8 conversion (reported by littletux) + - webserver search results (reported by poulpe) + - aMule version on webserver's Statistics page + * Endianness fixes in EC. + * Fixed appearing strange characters at the end of webserver's + log and debug log pages. + * Fixed logo.jpg being not installed. + * Webserver graphs are now resizable and rescalable. + * Removed some unneeded code/data from daemon. + * Added gcc #pragmas to reduce executable size. + * Several improvements on EC network code: + - EC now uses buffered I/O, so most EC transmissions will only + require one socket operation. + - Added the ability to compress large packets with zlib, thus + reducing network load. + - Some (not-so-CPU-consuming) compression is applied to small + packets, too. + * A number of i18n fixes, mostly changing debug messages to be + untranslated. + * Removed ECv1 compatibility mode. Now all EC communications are + using the new v2 protocol. + * Remote applications do not log to core's log anymore. + * Fixed the GetLog() function to be compatible with wxWidgets-2.5.4 + * Reworked template finding - after installation, no more copying + of webserver files are needed. + * Added new command 'reloadshared' to amulecmd, to force reloading + of shared files list. + * Fixed configure script to use the right arguments with gdlib-config. + * Fixed configure script to check for gd in the right order. + * Fixed preferences being not saved when set from web interface. + * Fix for setting download priorities via web interface. + * Added configuration file for remote apps. + * Reworked command-line parameters, also added a lot new ones + (for remote apps). + * Fixed *.desktop files to be really UTF-8. + * Fixed Makefiles to be able to compile alcc without alc. + * Added man pages - English only, for this time. Great thanks to + Vollstrecker for his initial work on the man pages! + * Fixed pressing the 'Clear Completed' button causes a logout + on the web interface. + * Added CVSDATE checks to EC, to make sure that core and remote + apps are from the CVS tarball (for CVS users). + * Improved filename cleanup. + * Fixed setting priorities via web interface on both downloads + and shared files. + * Enabled translations on amuleweb and amulecmd. + * Fixed the language selector on Preferences to show the languages + that we really have. + * Language list is now always sorted alphabetically, but 'System + default' is always the first item in the list. + * Changed locale saving method, so it won't have to be reset to + 'System default' on each version change. + * Added Hungarian man pages. + * Fixed sorting in web interface. + * Compilation fix for gcc-3.2.2 and 3.2.3. + * Win32 (wxMSW) compilation fixes. + * Enabling configure way of aMule compilation under MinGW/MSYS. + * Several improvements of the win32 version of aMule and utilities. + * Totally disabled the ability to connect to aMule with an empty password. + * Enabling translations on remote GUI, too. + * Configure will now list (almost) all libraries it will/wants to + use for build. + * Hungarian translation update. + * Remote GUI compilation and link fixes for optimized builds. + + **** For users, who already got used to amulecmd's or amuleweb's + **** command-line parameters: PLEASE READ DOCUMENTATION CAREFULLY! + + Hetfield: + * New popup menu and events management for new wx SysTray + * Speed Bar color (on the new wxTray) is setted in the statistics color selection + (as old GTK tray!) + * Some configure checks and cleanup + + Kry: + - Global - + * We're now fully compatible with the ed2k Unicode implementation, allowing Unicode searches, + comments, usernames, file names, ... + This works both for unicode-aware servers and clients. + * New SysTray code using wxWidgets' wxTaskBarIcon with several hacks for making it + properly transparent while keeping the nice download speed bar. Multiplatform, also. + Activated by default on > wx2.5.3 + * Corrected a nice mistake where wxSOCKET_LOST was identified as error. + * Fixed clasic systray code to support unicode names properly. + * Removed/Cleaned/etc header includes. + * Fixed unicode bug on wxOpen preventing to share some files. + * Fixed the SERVER_IDENT packet processing. + * Auto-sort code for list controls. Disabled by default, too much flickering on mac and gtk2. + * Fixed eMule+ version popping up on eMule stats. + * Debug log lines now go to console on daemon + * Moved hello packet sending to after client successful connection. + * Added the RepeatLastAction function that turned up to be... well, funky. + * Fixed debug of disconnected clients. + * Fixed duplicated mod string on clients. + * Fixed unhandled exception from server TCP socket. + * Fixed lowid clients callback. + * Fixed duplicated floating point functions being called every second (CPU improvement). + * New file is added: tree.hh, credits to Kasper Peeters, + It's a stl-like tree and I really enjoyed coding with it. + More info on http://www.damtp.cam.ac.uk/user/kp229/tree/ + * Fixed a crash on Proxy code created by bad string initialization causing mem corruption. + * Added wxProxyData::Empty() to properly clean aMule proxy data when needed. + * Fixed unitialized variables on MemFile.cpp and SafeFile.cpp that made valgrind scream in pain. + * Fixed the CUpDownClient::SendFileRequest crash you were all screaming about on rc8 :P + * Fixed SUI failures with kernels >= 2.6.10. This failures and asserts were created by the locking + of /dev/urandom that was introduced on 2.6.10, and that made CryptoPP fail on creating a random + pool for the SUI identification. This is more a workaround actually than a fix, but will work perfectly. + * Completed files now go to shared as the should. + * Fixed search on localised languages. + * UDP disable is working properly now. + * Close the UDP socket if we're not listening anymore. + * Permisions for shared files are no more. They make no sense, network-wise. + * Fixed comment updates being... fuzzy. + * Fixes to timeout handling of sources to avoid timing out a source that was never processed. + * Fixed a memleak on log code. + * Proper handling of Thread reating/Running errors. + * Fixes for wrong string creation on several places over the code. + * Fixed log reset asserts and made it work properly (at last!) + * Auto-run webserver on startup functional + * Fixed a wild assertion if a empty line gets to ED2KLink file + * Merged Gonosztopi's work on EC for the stats tree with performance and safety fixes. + * Merged Gonosztopi's work on a patch from Mayfoev to use aux server ports, with some cleaning. + * Fixed the crash on non-std locales because of date/time functions. + * Get rid of more ugly unicode2char stuff by making the logfile a wxFFileOutputStream. + * General speedup of log file. + * Proper order of files on Makefile.am, much better to know compilation progress by first letter. + * Moved at last all stats to where they belong: the new files Statistics.cpp and Statistics.h. + * Fixed assert on client list view caused by unknown client state. + * Hopefully avoid the never-deleted sockets (passive sources) + * Fix for the case that someone dares having 65536 active connections + * Made the sources connection spread evenly among part files. + * Fixed server-list packet from server not being handled properly. + * Fixed crahes on re-sort of download queue. + * Fix for server connection packet not using unicode username. + * Search results on unicode are displayed properly now. + * Files on download queue with unicode names are displayed properly now. + * Unicoded filename is saved correctly on .met file, and loaded according to it. + * Files with utf8 chars can be completed now ;) + * Shared files with uciode names do show correctly now. + * Modification time for files is fixed to keep coherence (GetLastModificationTime usage). + * Filenames on known files list (known.met) are saved in utf8 too now, so correctly loaded + and compared lately. + * Fixed unicode identification to clients and server. + * Use BOM header on the known.met, part.met and emfriends.met for unicode tags. + Sad, but there's no other way to keep compatibility with eMule files. + * Fixed memleak on ExternalConn.cpp. + * Fixed the "Invalid UTF8 string passed to pango_layout_set_text()" messages on GTK2 builds. + * Fixed (again) the Shareazza identification. They have used 3 compat. client numbers already, + will they take one once and for all? + * Fixed memleak on log reset. + * Fixed memleaks on closing while global search. + * Fixed serious memleak on tag code for packets. And I mean serious. + * Removed the unused UTF82char function. + * Fixed queue limits on upload queue (off-by-one bug). + * Fixed hash for files with size (n*PARTSIZE). + * Fixed compilation for systems where zlib is not linked by default. + * Fixed OP_SENDINGPART to actually be a edonkey protocol and not emule protocol packet. + * Fixed memleak on AICH thread. + * Fixed several memleaks on ed2k links handling. + * Fixed threads not being closed properly, specially the global search one. + * Fixed serious memleak on client UDP reask + * Don't remove the server because of failedcount if it's static. + * When the user tries to remove a static server, we prompt for confirmation. + * Files on non-ansi named folders are no longer rehashed on every restart. + * Don't discard UDP packets on wxSOCKET_WOULDBLOCK. This improves UDP socket + reliability a lot. Remove the packet from queue if sent, keep it if it's not sent because of wouldblock, + and drop it on any other error. + * Send previously queued UDP packets before we send a new UDP packet. + * Fixed aMule crashing on second global search under certain circunstances. + * Fixed the hanging on connecting to server. + * Fixed dynip servers to connect properly (happy portuguese users!). + * Moved: + CMemFile.h -> MemFile.h + filemem.cpp -> MemFile.cpp + packets.cpp -> Packet.cpp + packets.h -> Packet.h + sockets.cpp -> ServerConnect.cpp + sockets.h -> ServerConnect.h + UDPSocket.cpp -> ServerUDPSocket.cpp + UDPSocket.h -> ServerUDPSocket.h + types.h -> Types.h + server.cpp -> Server.cpp + server.h -> Server.h + timer.cpp -> Timer.cpp + otherstructs.h -> OtherStructs.h + otherfunctions.h -> OtherFunctions.h + otherfunctions.cpp -> OtherFunctions.cpp + opcodes.h -> OPCodes.h + color.h -> Color.h + endianfix.h -> EndianFix.h + * Changed OP_GLOBFOUNDSORUCES -> OP_GLOBFOUNDSOURCES + * Unicode fixes for "Gtk-CRITICAL **" errors on shell. + * Unicode fixes preventing compilation for Packet sources. + * Unicode fixes for StrToULong usage over atoi. + * Fixed eMule+ version string. + * Implemented lugdunums new extension of GETSOURCES, includes SIZE (uint32) + to avoid problems created by anti-p2p companies + * Removed MetaTags extraction code, we're not going to use it anyway. + * Fixing some crashes on wrong string handling. + * Support for unicoded comments for files. + * Moved Online Signature (aMule and eMule) to wxTextFile for proper handling. + * Fixes a serious issue on UDP packets (and contributed to eMule). + * Debug output of server sources added. + * Fix for garbage saving on file copy. + * Fixed the server disconnection due to bad handling of TCP packets. + * Added a fallback for wrong TCP packets handling to avoid server disconnect. + * Proper memory overruns checks on SafeFiles. + * Fixed the partfiles being the only thing shared under certain circunstances. + * Fixed bug #193: False display with empty share list + * Fixed bug #258: "Max port-value allowed is too high due to secondary port" + * Fixed bug #276: aMule crached when tried to start. (It says "crached on the original report) + * Fixed bug #299: "Assertion when clicking in DQ/Last Reception column" + * Fixed bug #303: "Too many files republished by your client software. Please upgrade it." + Proper handling of incremental file publishing avoids server bans ;) + * Fixed bug #317: Added GUI and functionality for 'Start next file on same category'. + * Fixed bug #319: When sort is changed, make sure the item focused is again focused. + * Fixed bug #321: Razoback2 stats page for shared files. + * Fixed bug #331: 'ED2k link bar gone after 2x click on search button' making it a feature + instead of a bug. Now you can toogle the ed2k link handler clicking on search toolbar button. + * Fixed bug #334: Main category type not stored on crash. + * Fixed bug #345: [Mac] popup windows open on other monitor. + * Fixed bug #348: "Right-click on friend in friends list does not select it" + * Fixed bug #362: "receive file list fails for non-ascii chars" + * Fixed bug #349: "sorting of sources in 'Downloads' window" + * Fixed bug #375: "Misc GUI bugs in Statistics window" + * Fixed bug #374: "misc. problems with friends" + * Fixed bug #405: "Downloaded files have wrong priority" + * Fixed serious bug with 0-sized files. + * Fixing serveral threading issues and possible crashes/missbehaviours on search. + * Searchs now start inmediately and also finish sooner. + * Added a warning if no video player is set on preferences and tried to preview. + * Decoupled NetworkFunctions and StringFunctions headers. + * Added QueueDebugLogLine for... uh... queueing debug lines. + * Encapsulating network stuff at NetworkFunctions. + * Removed all network platform specific code from the main code, and leave it to + NetworkFunctions (and gsocket). And I removed the htons and htonl everywhere. + * Fix for egcs compiler crashing on aMule compilation. + * Changed the CTags structure to a safer and nicer version, compatible with eMule's. + * Added support for a lot more ed2k Tags. + * Support for download stats per client. + * Added the hability to rename a file using F2 + * Fixed crash on sorting an old tab. + * Improved socket debug, and moved the backtracing function to OtherFunctions. + * Fixes dynip servers not being detected by server UDP socket. + * Fixed a lot, lot of input data lost on EMSocket, causing much better transfers. + * Fixed corrupted parts info store/retrieve on partfiles with eMule compatibility. + * Fixed ed2k protocol file type publishing. + * Fixed a lot of network performance issues and lost packets all over the TCP/UDP code. + * Fixed download bar on tray icon (Icon file has now red background to create a mask from it). + * Fixed crashes on Logger class derived from bad unicode2char usage. + * Added "Prefix where amule will be installed" to configure output. + * FileDetailDialog is now resizable, and file names list ctrl resizes vertically and horizontally with it. + * No horizontal scrollbar on log, let lines wrap to avoid auto-scrool on long lines. + * Gnucco's alternate sorting of search list ctrl + See http://forum.amule.org/thread.php?threadid=5344&sid= for details. + * Big rework of the Friends class, list, and everything. + * Cached the Operating System info and added to --version flag. + * Added Online Signature update time functionality and widget disabling on OS disable. + * Slightly bigger list for the preferences items to fit them all + * Added a static text for recursive sharing via right-click to avoid questions. + * Systray can now be enabled/disabled on preferences, dynamically, and is applied + as soon as the checkbox is checked. Default is DISABLED. + Also, the minimize to tray checkbox is disabled when systray is not enabled, and when using + the new systray code (the wx tray), we don't have the Window Manager dialog anymore. + * Check for Online Signature folder existance when enabled. + * Fixed a lot of unicode bugs on file handling by adding fallbacks to proper encoding. + * Set minimize to tray to false if no tray enabled. + * Fixed a crash... on... assert... hum... that one was actually funny. + * We should not start next file on cancelling a download. Now we do not ;) + * Stopping a global search works properly now, the thread for global search is deleted on stop. + * Zero the Online Signature on exit. + * Fixed a crash on exit while stillstarting up. + * Fixed aMule nto starting anymore if skin file name is void and skins are enabled. + * Proper use of wxWidgets functions for ISO date formatting. + * Never show the download list filter on search category selector. + * Lots of fixes for wx2.6.0 compilation, wxSizer, and other changes. + * Fixed the download limits not being applied correctly. this should amke MUCH BETTER download + speed for people with download limits set. + * Fixed sockets not being closed on daemon. + * Fixed chmod message on Incoming/temp folder on smbfs. + * More info on the init. text and on backtraces (Operative Sytem, kernel version, etc). + * Fixed crash caused by random value returned on DeletePage(). + * Fixed Reload Shared Files not re-reading sharedfiles.dat + * Fixes the hangups on exit, specially on Mac. + * Fixed the AUTHORS file. + * Fixed UDP socket bug on size of OP_REASKFILEPING message. + * Abort loading of shared files if we are shutting down. + * Fixed crash caused by socket die on ConnectionEstablished function. + * Added contact info to documentation and about button. + * Fixed (again) mplayer usage as video previewer. + * Fixed a network bug on SetStartNextFileSame not being set. + * Proper usage of wxProcess::Exists( for webserver running on start check. + * Cleaned configure/Makefile from a lot of bad usage of flags and libs. + This makes for a smaller executable now also. + * Merged Martimac's fix for FreeBSD 5.4-PRERELEASE + * Fixed friendslot assignation, about 12 times. + * Fixed logging of not-yet-sent messages by adding it to queue and send on connect. + * Fixed message sending to unknown clients. + * Avoid the posibility of a Too Many Connections blocking a chat. + * Fixed buttons/textentry not enabled on new chat tab. + * Fixed tabs' 'X' not working properly when there are too many and don't fit on screen. + Use new wx code instead of Madcat's code on wx2.5.4 and above, for the 'X' closing. + * Multiple selecting ed2k links and clicking on copy ed2k works now for search items. + * Fixes the multiple removal of friends + * Fixed multiple message send to friends. + * Fixed multiple filelist requests + * Fixed multiple friend details dialog show. + * Adds a warning for trying to set multiple friendslot. + * Fixed Incoming folder content not being sent on shared files request. + * Fixed completing of file setting transfered instead of completed to file size. + * Fixed --with-crypto-prefix flag not pointing to actual crypto folder. + * Added memleak check on exit using wxWidgets native fucntions, enable via wx qa lib. + * Rewrote wx*Sizer* handling on Stats page and making more space available. + * There is no curl anymore needed/used on aMule. Coded my own handling using wxHTTP. + * Added partial/total bytes to the http download dialog. + * Fixed sizers usage on Client Details, fixes overlapping labels and such stuff. + * Fixed client stats not updating on clientnumber going down to zero. + * Fixed "total transfered datal isn't saved on crash/kill" bug. + * Fixed flushing of files on copy with read-only flag set. + * Added "total downloaded"/"total upload"/"total requests"/ "total accepts" to partfile saving. + * Fixed rehashing of unicoded file names on aMule restart. + * Fixed aLinkCreator compilation for wx2.6.0 + * Fixed upload speed not being reset when all clients lost and keeping old value. + * Fixed port output on console showing negative numbers. + * Lot of Kad porting (NOT functional yet). + * Fixed (c) strings all over the code with proper year specifications. + * Fixed unicode2char usage to a bare minimum. + * Moving from libc usage to wxWidgets multiplatform implementations. + * Killed c_str() usage from aMule, except on very specific ways and only for speed reasons. + * General cleanups and speedups here and there. + + - CPU arch Specific - + * 64 bits archs fix for AICH thread. + * Some amd64 compilation warning removal. + * Fixed endianess bug on PeekUInt16 + * Fixed client IP endianess on big endian archs. + * Getting ENDIAN_SWAP_* to a bare minimum (just interface) + * Fixes endianess of local_ip, which is anyway almost all times 0. + + - Core/GUI Specific - + * Fixed daemon unhability to handle sources properly. Daemon now takes, handles, and + processes sources in a proper way (making it at last a real competitor for monolithic). + * Don't show geometry option for daemon, makes no sense. + * Properly display "aMule Daemon" instead of "aMule" on daemon. + * Fixed statistics tree interdependence with GUI, splitting it to core/gui way. + In short, we have statistics tree on webserver, amulecmd and remote GUI :) + * Graphic statistics are now decoupled from GUI. + We have statistics graphics on webserver remote GUI. + * Decoupled Friend list from GUI. + * Fixed a bug on set comment on a file on ECv2. + * Fix for log on unicoded webserver. + * Fix for global daemon thread not closed on exit. + * Splitting of core/gui on SearchDlg. + * Fixed a crash on websocket thread creation. + * Reactivating Chat windows on remote GUI. + * Proper fix for the segfault on exit caused by EC. + * Removal of CryptoPP usage on amulegui. + * Fixed a possible crash on daemon startup. + + - BSD Specific - + * Fixed BSD compilation for inclusion. + * Fixed FreeBSD 4 prerelease (DragonFly) compilation on gtkplugxembed.c + + - Solaris Specific - + * Fixed Solaris compilation and linking. + * Fixed need for inet_addr on webserver on Solaris. + + - Mac Specific - + * Fixed Mac friends handling. + * Proper importing of files for Mac. + * Proper reading for amuleweb config on Mac. + * Made default Incoming folder for Mac to "~/Documents/aMule Downloads" + + - Windows Specific - + * Fixed a lot of compilation problems. + * Use proper wxLog class to avoid popups on Windows. + * Remove the usage of chmod on Windows. + * Fixed the systray background on Windows. + * Fixed systray menu on Windows for proper layout. + * Fixed DirectoryTreeCtrl on Windows to show all disk drives and folders. + + Ken: + * Fixed Mac bug: window was a little larger each restart + * Fixed aMule.tmpl so Safari can work with amuleweb + * On Mac, enabled Command-clicking in lists to toggle selection + * Solved the DECLARE_ABSTRACT_CLASS() mystery on wx-2.4.2. Now + we can have UDP socks5 with wx-2.4.2. + * Included CVSDATE with version in amulesig.dat + * Fixed an endianness bug with webserver + * Fixed last (I hope!) endianness bug with IPFilter + * Fixed a major endianness bug with widespread effects. On Mac, + servers don't fail continuously until eventually removed from the + list; server pings work. Global search seems to work better. + DNS lookup of servers and ED2K link sources should now work. + * Enabled support for ed2k links in web browsers for Mac + (although idiosyncracies of common browsers prevent it from + being as transparent as one would like). + + lfroen: + * aMule remote gui implementation + * Support for categories in webserver + * EC additions + * RLE encoder for shared files + + martymac: + * Fix for FreeBSD 5.4-PRERELEASE + + ObsessionAl: + * Patch to include CVS date in about box. + + Phoenix: + * Fixed crash in CClientReqSocket::ProcessExtPacket() + processing of OP_COMPRESSEDPART. + * More UNICODE fixes. + * Fixed WX_SYSTRAY compilation on wx-2.4.2. + * More proxy updates, we are getting there. + * Small UI bug: double click on a server did not change the + "Connect" button to "Cancel". + * Changed some deprecated IsKindOf(CLASSINFO()) to + wxDynamicCast(). + * Fixed crash in CUpDownClient::SendFileRequest(), short + circuit evaluation was reversed. + * Created Proxy dialog on preferences. + * Updated muuli.wdr for wxDesigner version 2.11 -- no more + manual patching for wxFIXED_MINSIZE required. + * Fix for rommel's report of IP filter problem. + * No more IsKindOf(), all replaced by dynamic_cast<>(). + * No more wxDynamicCast(), all replaced by dynamic_cast<>(). + * Fixed multiple instances of event handlers in + CClientReqSocketHandler and CServerSocketHandler. + * In StateMachine.cpp, m_state is now private and state machine + code is now thread safe. + * Added base64 encoding/decoding support to aMule. + * SOCKS5 and SOCKS4 proxy support is working now. + * HTTP proxy support is working now. + * Changed the output of the "Oops" to give better instructions + to the user. + * Fixed a bug in proxy code that was making gui too slow. Code + was performing unnecessary DNS. + * Applied patch from volpol to fix use of deprecated functions + in wxGTK-2.5.3. + * Applied patch from geeko to complete html functionality of + cas. + * Fixed a big bug in proxy code. Sockets were not continuing + conversation after connecting to sources. + * Fixed a crash due to an unicode issue while logging. + * Show some activity upon destruction of the DownloadQueue. + * Preparing the field to bind to a fixed interface. + * Sanity checks on socket creation. + * Fixed the backtrace message. + * Added a static text to Preferences->Connection->Client TCP + port to show the value of the client UDP port. + * Fixed a crash on webserver, all return values of + SendRecvMsg_v2 must be checked for NULL return value. + * Fixed an uncountable number of potential segfaults on + amuleweb because almost no return value of GetTagByIndex and + GetTagByName were beeing checked for NULL. + * Fixed the following bug in the search dialog window: if you + typed a letter by mistake or if you use the down arrow from 1 + to 0, both actions on a wxSpinCtrl, aMule would crash. + * Fixed the GetTagByIndex and GetTagByName segfaults in + amulecmd. + * Fixed a problem with saving the preferences, that in some + situations would not be saved. + * Fixed an assert when loading skins, the count number was one + unit too high. + * Fixed amuleweb template processing, Clear Completed button + on transfer link was not showing. + * Fixed amuleweb template processing, Reload List button was + not beeing translated. + * Small adjusts to ObsessionAl patch to include CVS date in + about box. + * Fixed a bug in UTF82unicode(), reported by Mr Faber. + * Got rid of sscanf in NetworkFunctions.h. This has caused a + crash once, reported by Mr Faber. + * Fixed a lock with high CPU usage when crashing in amuled, + because wxExecute() could be called from the FatalErrorHandler() + not from the main thread, which is currently prohibited in + wxWidgets. + * Fixed preview with mplayer or any other app that needs + stdout/stderr. + * Fixed lots of segfaults in amuleweb, thanks to alandar and + Mr Faber. + * Updated proxy debug code to use new logger. + * Fixed a subtle bug in UINICODE builds. Now UTF-8 enabled + UNICODE builds can read extended ANSI file names. In + particular, UTF-8 UNICODE aMule build was not remembering + an extended ANSI directory name for a shared directory. + * Added a spec file to the CVS tarball. Now users can do + rpmbuild -ta aMule-CVS-20050309.tar.bz2 and generate rpms for + the tarball of the same day. + * Fixed a bug in the spec file. The testing was beeing done + with files from amule-dev-cvs, but CVS snapshots tarballs are + done in amule-cvs directory. + * Implemented changes suggested by bootstrap in aMule-CVS.spec, + merged all the packages in a single rpm, changed the packager + to "The aMule Team" and updated %BuildPreReq. + * Fixed a crash in ListenSocket.cpp when a client could + disconnect suddenly. + * Spec file does not need autogen.sh, as noticed by + GonoszTopi. + * Removed krb5-libs require and krb5-devel buildprereq. + curl-lib and curl-devel is enough. + * Fixed an assertion in CFile.cpp, when browsing broken + symbolic links. Now aMule is aware of them. + * Added a test to the spec file to discover UTF-8 enbled LANG, + so that we build the rpm with --enable-utf8-systray. + * Removed curl dependencies from spec file, aMule now uses + wxHTTP. + + Stefanero: + * Work on the Man-Pages + * Minor compile fixes + * Lots of support and testing + + stsp: + * Compilation fix for STL enabled wxWidgets. + + volpol: + * Patch to fix use of deprecated functions in wxGTK-2.5.3. + + Vollstrecker: + * Initial and further work on aMule and utils' man pages. + + Xaignar: + * Improved logging for CFile, getting rid of the annoying + pop-up windows which were previously displayed. + * Workaround for fonts getting changed on the log-view + when the clear-button was pressed (wxMac specific). + * Work on getting aMule ready for win32, including fixing + the custom-drawing for listctrls. + * Fixed threading issues with the UDP-sockets in daemon- + mode, which were the cause of a number of crashes. + * Made the preferences dialog modal to fix problems where + it would be displayed at bad locations. + * Ensured that the Banned-Count would be initialized to zero + rather than display a random value until it gets properly + set (not yet implemented). + * Improved the "aMule has crashed" message, adding some + more information and fixed the backtrace to skip unneeded + frames properly. + * Fixed some static text-ctrls not properly expanding, so + that some text would be cut off the end. + * Fixed some position bugs in the progress-bar drawing and + addeed a black border. A4AF sources now displays that text + instead of an empty area. + * Moved the placement of the "Initializing aMule" message on + startup so that --version will only result in the version + information and ensured that amule wont start in case an + invalid commands was given, instead printing the help info. + * Fixed problems with selection on the clients-list. + * Improved usage of compressed packets. Now only files that are + not in the list of known archive-formats are compressed, rather + than just Zip, Rar and Ace. + * Improved error-handling when opening ports. If either the + EC or Server-UDP ports conflict with the other ports, then + a random safe value is selected in the range 1025 ... 2^16-1. + * Fixed shared files being located twice during startup, which + also resulted in the AICH thread being run twice. + * Fixed logging to stdout containing extra newlines. + * Cleaned up and merged a number of split translated strings, + which should make it easier for translaters to work. + * Fixed some status changes not resulting in removal from or + addition to filtered download categories. + * Improved handling of multi-line log events on the main dialog. + * Reduced the ammount of output to the console, changing printfs + to either normal or debug log events. + * Escape-codes in ED2k links are now properly unescaped. + * Cleaned up and improved the readability of the clients-details dialog. + * Updated the modified listctrl widget used by aMule, so that + wxWidgets 2.4.x and 2.5.x will use a modified version from + that branch rather than a more generic hacked version. For one + thing, the headers are now drawn using the current GTK theme. + * Properly handle rehashing of empty part-files. + * Changed the "Filter Bad IPs" option to "Filter LAN IPs". Invalid + IPs will always be filtered, but LAN IPs will now only be filtered + if the option is enabled. + * Added back-traces to asserts, in order to help debugging efforts. + * Made usage of wxASSERT thread-safe. + * Attempted to fix some longstanding problems with the notebooks. + * Removed unused files: Preview.h and Preview.cpp + * Updated, cleaned and unified license-headers for all aMule + related source files. + * Improved the error-message displayed when a server couldn't + be added, so that it is clear as to why it couldn't be added. + * Avoid flooding the console when searching for filetypes, + mismatches are now logged as debugloglines instead. + * The "Clear" button on the search page now also clears the + search text. + * Better handling of multi-line chat messages: The complete + message will be split by linebreaks and each line timestamped. + * Fixed entries for connected servers in server-list not being + completly reverted to normal after disconnection. + * Added handling of SIGINT and SIGTERM for gracefull shutdowns. + * Renamed the config file from ~/.eMule to ~/.aMule/amule.conf. + The old file will not be removed, in order to allow backwards + compatibility. + * aMule now automatically removes unavailable files from the + list of shared files. + * Fixed right-clicking not selecting the tab being clicked on. + * Fixed casts to pointers of higher alignment where it could + cause allignment crashes on SPARC, created general function + for doing this safely both SPARC and non-SPARC machinces. + * Added a typesafe replacement for printf, designed with + inspiration from the format class in the boost library. + * Improved logging capabilities. It is now possible to enable/ + disable debugging output by category. All existing debug + calls where changed to support this. This can be controlled + in the preference dialog. + * Fixed some problems with the connect dialog for remote gui. + * Some pass-by-value fixes. + * Moving de-initialization code from the CamuleApp destructor + to OnExit. This insures that the app-object would be valid + while the shutdown is in progress. + * Moved deinialization code from OnRun in amuled to OnExit in + order to ensure that it was also run on premature exits. + * Made safe connection-rate calculations the default behavior, + which should help avoid too fast connections. + * Add class for keeping track of unusable sources, based on + the same class in eMule. This should reduce the ammounts + of connections made since bad sources are not re-asked too + often. + * Fixed servers with IP 0.0.0.0 being added to serverlist. + * Fix to IP-range parser in CIPFilter. Incorrect range in the + form "a.b.c.d-e.f.g." would not be caught. + * Misc cleanups in CServerList. + * Fixed creation of online-sig files. + * Made DownloadQueue and ServerList observables. + * Added a Observer/Observable implementation. This was needed + to implement a queue that would be kept in sync with another + queue thus allowing thread-safe delayed iteration over a list. + * Fixed crash in search-list, where the search-packet would be + deleted twice. + * Removed the usage of "ED2KServers" file, as the download-queue + now takes care of handling all types of ed2k-links. + * Rewrote 'ed2k' utility in c++ and fixed support for extra + information appended to ed2k links. + * Merged IP-check functions and moved it to NetworkFunctions.*. + * Fixed usage of uninitialized variables in CPartFile constructor. + * Removing unsused functions from CServerList. + * Removed unused CArray.h file. + * Fixed pontial wrong tag-count in server.met writing, which + would result in a corrupt file. + * Disabled connection-try code, due to inherent problems with it. + * Reworked the CDownloadQueue class. + * Fixed creation of ED2K links for servers. + * Removed the need for seperate AICH hashings of completing files. + Instead both AICH hashsets and MD4 hashes are created during + completion, and the AICH is simply discarded if corruptions are + found. This however is rare, and thus doing both at the same time + results in less time spent hashing. + * Improved upon the "requested file not found" log-message, which + would happen when a client requested the hashset for an unknown + file. + * Reworked the checks for free disk-space, should behave much + more consistantly now. + * Fixed files being hashed twice, once when completed and again + after aMule had been restarted. + * Make use of native GTK2 popup menu for text-ctrls when possible. + * Disabled aMule on systems where wxGTK is older than version + 2.5.1 and is compiled against GTK2. The big honking warning + in the log proved to be useless, but this should work ... + * Added helper-function to of.h for removing values from a stl-list. + * Fixed usage of windows font-type "Arial" in statistics-dialog. + * Fixed logging of filtered IPs. Only 2 of four cases were logged. + * Disallow External Connections if no valid password has been set. + * Fixed both sources and files getting shown for the file-count + in the transfer dialog. + * Added date to version-information for CVS snapshots. + * Reworked CBarShader, making it use the CRangeMap class and getting + rid of needless floating-point math. This fixes some problems where + large chunks would be drawn as complete, even though only a small + part of the file was complete. + * Fixed downloads being assigned to the default category despite + the extended options being disabled in search dialog. + * Moved overhead calculations to the CStatistics class. + * Removed enabling/disabling of the clear-downloads buttons. The + checks touched far too much code without adding much. + * Moved StripInvalidFilenameChars from CamuleApp to StringFunctions + and renamed it to CleanupFilename. + * Fixed pending file-blocks not being properly removed when + client-objects were destroyed, resulting in parts of files + that could not be downloaded until aMule had been restarted. + * Fixed re-filtering of sources when IP-filter level had been + changed in the preferences. + * Reworked CIPFilter class: + * Huge improvements in loading-speeds (~6x). + * Added support for loading zipped files. + * Switched to using the CRangeMap class. + * Added CRangeMap class, which is a map with two keys, an + start and an end key, with a single value attached. This + was previously duplicated serveral places. + * Fixed problems with deleting multiple items on serverlist. + * Misc code-cleanups. + * Added the ability to delete servers using the delete-key. + * Fixed sorting by the "Transfered down" field on client-list. + * Added ruby-script for detecting common issues. + * More work on properly marking getter function const. + * Reworked the CDownloadListCtrl class. + * Added overloaded versions of CmpAny functions for strings. + * Reduced memory usage of IP-ranges in CIPfiler by removing + redundant information. + * Fixed extremly non-optimal function in CDownloadQueue which + was used many places. Could locate item in vector through + counting of iterator increments. + * Fixed pre-shutdown message to something more closely reflecting + the actual events taking place. + * Collected common "Data To Human-Readable" functions in file-set. + * Reworked the ED2K-link classes. + * Reworked handling of ED2K links, making behavior consistant + everywhere and fixing support for |serverlist| URLs. + * Changed time-span of overhead calculations from 5s to 15s. + * Removed redundant message displayed when files were added to a + a non-connected mule. + * Added missing Add-Overhead calls for various packets. + * Fixed a mem-leak in CFileDataIO::WriteString. + * Fixed compilation of Proxy with wxGTK-2.4.2. + * Changed default configure options. Now only 'amule' and 'ed2k' are + compiled by default, since other apps require extra dependancies. + + xmb: + * id2ip awk script (with Jacobo221) + + + Special Thanks To: + + * Translators: + + Very, very special thanks to all of them, since they + translated the whole app in just _one_ week! + + Ateo: (US english / en_US) + Ateo: (Spanish / es_ES) + gaspojo: (Portuguese / pt_PT) + guest: (German / de_DE) + GhePeU: (Italian / it_IT) + Gusar: (Slovenian / sl_SL) + ilbuio: (Italian / it_IT) + KamiKazeNH: (Brazilian / pt_BR) + nbfnw: (Chinese / zh_CN) + Ogon: (Polish / po_PO) + piarres: (Basque / es_EU) + shafff: (Russian / ru_RU) + supersnail (Dutch / nl_NL) + thedude0001: (German / de_DE) + toshi: (Russian / ru_RU) + + * Contributors: + hanzo + markb + Mayfoev + monkeyboy + ObsessionAl + rommel + S0undt3ch + stsp + Vollstrecker + volpop + + * Bug and feature reporters: + alandar + Angel + BigBob + feralertx + Frankk + Mr Faber + OldFrog + RedDwarf + skolnick + thedude0001 + Valery + + * eMule developers for their support, friendship, and collaboration. + + * MindForge & Freenode irc admins + + * People at #wxwidgets on freenode. + + * Everyone at: + #amule irc.freenode.net + wiki http://wiki.amule.org + forums http://forum.amule.org + bugtracker http://bugs.amule.org + + * All aMule users!!! + + Welcome our new aMule team members: + blerfont, m2kio, skolnick, thedude0001 & thorero + +-------------------------------------------------------------------------------- + +Version 2.0.0rc8 - The "last rc" version. +---------- +2004-12-21 + + Baz: + * Fix for server stats for users/files not being updated correctly. + * Fix for ERROR and WARNING server messages not being shown. + * Fixed server / transfers window splitters not being loaded/saved correctly. + * Fixed categories on search dialog not being refreshed on category name change. + + deltaHF: + * Show comments for shared files + + Hetfield: + * Some fix in new Tray system and desktopMode bypass + + Jacobo221: + * Added option to select the max and min size-type in advanced + searches. + * When "Extended Parameters" in Search tab is not selected, + defaults are used. + * Now "Auto-update serverlist at startup" checks if there's a + serverlist to avoid annoying messages at startup. + * "Clear completed downloads" is now disabled while no + completed downloads are listed. + * Context menu for download items only enables relevant + information now. + * Context menu little optimization (removed an unuseful loop) + and Open File fix. + * Added bitmap button wich pops-up the last status log line + (useful when it doesn't fit the window). + * Merged Preview and Open File and enabled Open File. + * New Port column in Servers tab (splitting IP column). + * Moved "Always filter bad IPs" from Server to Security + in Preferences. + * Changed "Preference" in servers tab as suggested by Sir and + "IP" to "Address" since that's more accurate (could be DNS). + * Optimizations in the RLE code. + * Based on kry's patch, also darken paused files' progress + bar. + * Translations updates. + * Fixed: Servers priority now working. (reported by Sir) + * Fixed: Now all unset Server Priorities are set to normal. + (reported by plaenky) + * Fixed: Sorting Servers by priority works now. + * Fixed: Setting "A4AF to others" works now. + * Fixed: Server names sorting now differences between names + and IPs. + * Fixed: Last byte is now drawn in bar progress. + * Fixed: Stop button now working after second global search + and another hidden bug in global searches' progress bar. + (reported by ecforum) + + ken_aMule: + * Fixed ipfilter on big endian archs. + * Fixed wxWidget's bugs that were creating serious memleaks on Mac + + Kry: + ===============::MULTIPLATFORM::=============== + * When a socket connection error like WOULD_BLOCK happens, aMule retries + the connection to avoid just-once errors + * Stopped files are now darker than non-sources ones. + * AICH e-links working now, with masterhash and with hashset + * Proper handling of removing -fomit-frame-pointer flag that worls on all platforms. + * Initial support for wx-compliant systray. Will be ready for 2.0.0 final release. + * aMule no longer crashes on opening a non-existing folder. CDirIterator is safe now. + * Fixed crash on app close - never call a pure virtual function from a destructor. + * Moved the init/close code of aMule to where they belong: destructor/constructor. + * Much more debug info available to debug packets (packet dump and others) + * Major network improvements: + * Improved the socket processing on CPU usage and performance. + * Coded the functions handling the network string/bytes conversion of ips and + hostnames and the generic hostname solving thread, non dependant from host's + socket implementation. Less CPU and more reliable on both cases. + * Crash fixed on wrong arguments for wxString::Format + * New option on right click on downloading or search files for showing eserver's stats for + that filehash. Needs browser correctly configured on preferences. + * Implemented messages filtering, from know clients/bogus clients/by words. + * Fixed hashing files changing display status. + * Fixed crash where transferwnd and clientlistctrl could be accessed before created. + * Listen socket on accepting connection no longer uses a blocking socket (CPU improvement). + * Not linking anymore to gtk libs if not needed. + * "GTK: Not Detected" is now either "Not Detected" or "Not Used" to avoid confusion. + * Fix for crashing on 'OK' button on preferences. + * Fix for preferences window being unreachable if aMule is minimized while showing it. + * Fix for crash on HTTP dialog if StopAnimation() was not called on destructor. + * Fixed crash when shutdown and preferences window open. + * Implemented OS_Info tag. Broke it 400 times, and fixed it 401 times, so working. + * Implemented statistics tree for OS_Info tag. + * Fixed several memory corruption issued caused by icons with wrong size. + * Fixed several memory corruption bugs on amule init/close. + * When aMule crashes, it not longer fails saving: + * Preferences (Saved on 'OK') + * Categories (Saved on changes) + * Total upload / download bytes (saved while running). + * Fixed crash on OP_MULTIPACKETANSWER + * Sent wxInt and wxUInt classes usage down the drain for the standard int / uint + * Implemented "Share hidden files" checkbox. + * Immplemented the CT_EMULECOMPAT_OPTIONS new tag. + Right now only OS info support capabilities. + * Implemented new short tags style for server and client interchange of info. + Fixes not being able to browse eMule >=0.42x shared files. + * Fixed aMule daemon compilation to use wxBase headers and libraries. + This fixes amuled not compiling on wxBase only-boxes, thus making it kinnda pointless. + * Fixed AMD64 and GCC4.0 compilation/run, closes debian bug #285110 + * Fixed some performance issues on Log text controls. + * Fixed long browsers requests on WebSocket. Buffer is now enlarged accordingly. + * Fixed timeout on webserver socket being... 10 minutes!!! + * Fixed several 100% cpu errors on WebSocket. + * Fixed our source exchange implementation that was... uh... wrong. + * Fixed stats tree on webserver. + * Misc. work on ECv2 implementation of messages. + * aMule can send now RGB encoded images via ECv2 + * Webserber can read ECv2 Image tags via the new CDynPngImage class. + * eMule+ is now recognised under compatible client tag 0x05 + * Unicode fixes on webserver. + * Got rid of almost all wxString::GetData() + * Major CPU improvements on WebServer.cpp + * otherfunctions.* is now clean from aMule specific stuff. Can be used anywhere. + * otherfunctions now have a namespace (surprinsigly named 'otherfunctions') + * Changed wxFileStreamInput -> wxFile (less class overhead). + * Several speed fixes on Stats code. + * Fixed possible crash on search thread creation + verbose on error. + * Fixed aMule crashing when local search is not returning and we click stop + or start another search. + * Fixed severeral endianess bugs. + * General rewrite of UDP Socket + * Received packets when app is not ready are now discarded. + * Small fix preventing memleaks and some strange asserts + * Fixed a severe memleak if 2 UDP packets are send at the same time, before the + first one finishes. + * Fixed the host solving fail not cleaning the data (another severe memleak) + * Fixed sending wrong data to wrong servers and thus not being replied. + * Fixed some server udp packets never reaching destination. + * Unicode fixes (char*/wxString issues) + * General cleaning, bugfixing and documenting. + * Added files: + StringFunctions.(h/cpp) + NetworkFunctions.(h/cpp) + + ==================::MAC::=================== + * Fixed server connection crashes related to accepting a connection from a being + destroyed socket. Probably fixes also some random BSD/Linux crashes on conection. + * Got rid of all includes, improved compilation speed greatly. + * Fixed stats color boxes + * Fixed servers saving, not anymore stored wrong internaly. + * Coded Mac packager script for releases with included libcurl and wxWidgets. + * Included Mac aMule.app bundle on sources. + * Fixed sharing /Volumes and other special folders. + * Fixed crash on server.met download + + permats: + * FIXED: Preferences -> Security -> Permissions wasn't being + correctly saved for directories. + + Phoenix: + * Lots of unicode fixes. + * Added readline and history support to amuleweb/amulecmd text + clients. + * Added template loading capability to amuleweb with the new + command line parameter -t. + * Changed m4/readline.m4 so that readline libs are only used + when needed, i.e., no longer append readline libs to LIBS, + use READLINE_LIBS instead. + * Fixed crash in aMule when amuleweb tried to get transfers + tab and aMule had never connected to a server before. + * New backtrace output with demangled function names, file + names and line numbers, when possible. + * Initial (not functional yet) SOCKS5 proxy support. + * Initial (not functional yet) SOCKS4 proxy support. + * Initial (not functional yet) HTTP proxy support. + * Updated some tests in configure.in. + * Fixed a problem with _() usage. Static string initialization + must be done with wxTRANSLATE, and wxGetTranslation() must + be explicitly called in code instead of _(). + * Fixed a bug in WebServer.cpp:CWebServer::GetStatusBox(): + return value was missing end tags. + * Changed back to macro the inline function version of + unicode2char() when using UNICODE. Unfortunately, when the + fucntion returns, the string object gets out of scope, so we + stick to the macro version for now. + + lfroen: + * Moving amuleweb to EC version 2.0 + * Fixes on amuleweb socket code + * Added generated png images to amuleweb + * Added RLE encoder for gap and parts status to EC + * Fixes in amule daemon + + Madcat: + * Added support for detecting HydraNode clients. + + GonoszTopi: + * Initial work on EC protocol version 2.0. + * Fixed a crash on broken language files (.po) + * Some GUI cosmetics. + * Lots of i18n fixes. + * As a side effect, fixed the "Any" search in webserver. + * Fixed webserver connection with empty passwords. :) + * Fixed webserver connection with guest account. + * Added "add " command to amulecmd. + * Tracked down and killed a number of hidden bugs. + * Added commands to change/monitor bandwidth settings to + amulecmd. + * Made wxTRANSLATE actually work. + * Fixed graphs in webserver. Also added the missing back.gif file. + * Fixed buffer overflow problem in ed2k link handler. + * Stats bug fixed. + + wizeman: + * Helped finding the code snippet where WebSocket was failing on request. + * Fixed 'Safe Max connections' code. It's safer to use it now, and it works. + * Fixed bug where amule would start consuming 100% cpu when it received a + corrupted EC packet. + * Fixed webserver, it wouldn't close connection when it received a POST request. + * Fixed webserver crash: added mutex to make variable wcThreads thread-safe. + * Fixed webserver <-> amule communication corruption when the webserver + received simultaneous requests. The problem was that all webserver threads + were using the same socket for sending/receiving EC packets to/from amule + without synchronization. + + Xaignar: + * Added the new casting macros to otherfunctions. + * Added a helper-function to CMuleListCtrl for use in the Sorter functions. + * Fixed the priority-column on Server List. + * Added the handling of friends to ECv2 implementation. + * Merged CUploadListCtrl and CQueueListCtrl on CClientListCtrl. + * Added the posibility to see a list of all existing clients. + * Fixed aMule dialog not always being unfrozen upon restoring it from tray. + * Some changes to the overhead calculation functions. + * Slight improvement of the GetScore function CPU usage. + * Replaced "theApp.glob_prefs->" with the new usage "thePrefs::" + * Fixed the MyTimer class behind GetTickCount returning random values on close. + * Fixed two crashes on ClientList. + * Fixed compilation for solaris on several places. + * Make sure that clients cant just crash us by sending a aich-request for an invalid hash. + * Fixed a couple of sub-menues. + * Removed the leech-mod checks, they were getted outdated anyway + * Fixed open sockets count. + * Avoid re-layouting the entire dlg when updating some labels. + * Small fix to CMuleNoteBook. + * Adding a missing event-handler en shared files tab. + * Changed the primary hashing thread to do both MD4 and AICH hashing for non-part files. + This cut down hashing of ~2.8gb of data from ~12:40 minutes to ~7 minutes on tests. + * Adding checks against the user sharing the following dirs: Home-dir, .aMule, Temp-dir. + Sharing home is allowed but results in a warning. + * Fixed the Upload-parts drawing. + * Fixed sorting by filename on the Uploading list. + * Fixed crash on server list auto-update. Removes the possibility of overrunning a array. + * Optimization of UpdatePartsInfo, which now no longer needs to traverse the parts-info + arrays of each source for that file. + * Fixed the redraw problems where some things wouldn't be erased on list controls. + * Code cleaning, documenting and rewrite. + + Special Thanks To: + + * Translators: + Ateo: (US english / en_US) + biger [HUN]: (Hungarian / hu_HU) + experience.chris: (German / de_DE) + GhePeU: (Italian / it_IT) + Gusar: (Slovenian / sl_SL) + ilbuio: (Italian / it_IT) + KamiKazeNH: (Brazilian / pt_BR) + mad_soft: (Spanish / es_ES) + nbfnw: (Chinese / zh_CH) + Ogon: (Polish / pl_PL) + piarres: (Basque / es_EU) + pukyxd: (Catalan / es_CA) + Supersnail (Dutch / nl_NL) + Typhon: (Slovenian / sl_SL) + + * Contributors: + alehack, alus, + boutros, fossybaer, + Frankk, han, + junaru, sebaX, + skolnick, sLiCeR\, + Vollstrecker, volpop, + {xmb} + + * Bug and feature reporters: + Banerjee, chisky2003, + Danny, ecforum, + fctk, Gnucco, + hades, jaguarwan, + jolupa, juanii, + kdka, kno, + m2kio, MichaelLong, + Pableron, pi-c, + plaenky, realcruncher, + Sir, Sniffer, + sosonok, |Syrius|, + xplode_me + + * Everyone at: + #amule irc.freenode.net + wiki http://wiki.amule.org + forums http://forum.amule.org + bugtracker http://bugs.amule.org + + * All aMule users!!! + + Welcome our new aMule team members: + lionel77, ken_aMule, nachbarnebenan & one2one + + +-------------------------------------------------------------------------------- + + +Version 2.0.0rc7 - The "99,6% Final" version. +---------- +2004-10-19 + + bisley: + * Added session ratio and total ratio to XAS + + deltaHF: + * Got back from hell and changed one icon on the GUI ;) + + Jacobo221: + aMule GUI: + * Fixed two almost-the-same bugs when clicked download button + and no items where selected (as reported by powtrix/willy, + thanks). + + aMuleWeb: + * Fixed a bug where up/down limits woudln't be displayed + correctly if their string length were different. + + aMuleCMD: + * Added 'list' (or 'find') command to search for a file in + the downloads queue by name or by number (or just show all). + * Added the ability to resume/pause all downloads at the same + time through amulecmd (very handy when all downloads have + been paused due to lack of space). + * Fixed two bugs on amulecmd by which using 'pause' or 'resume' + without arguments would pause/resume the oldest download. + * Fixed a bug so that help command no longer is send to core. + * Fixed other commands sending blank data to core. + * Cleaned unneeded output log messages + added sent command + messages to log (for easier security monitoring). + * Several command simplifications on amulecmd to make it easier + to use (while maintaining backwards compatibility). + * Lots of translations lacks + + KingFish: + * Fixed broken compilation in SysTray.cpp with gcc 3.3.4. + + Kry: + * Fixed: Crashes related to animation deletion on http download dialog + * Fixed: 0-size server.met file crashing aMule on startup and on download. + * Fixed: GUI blocking on server connection. + * Fixed: The last (hopefully) "fixed minsize" bug. FileDetail dialog was growing :) + * Misc code cleaning. + * Mac: + * Enabling wxCocoa compilation + * Fixed: Secure Ident was not working on big endian archs. + * Fixed: ClientID endianess issues leading to faking low/high id + * Fixed: Several fields were not having correct size on preferences. + * Fixed: Curl preform_multi was crashing the http download dialog on Mac. + This means server.met update and ipfilter update was crashing. + Currently the fix disables 'Cancel' button on that dialog, while we + wait for curl lib to fix this issue. + + lfroen: + * Removed debug printf's in timer.cpp. + * Fix for deadlock on connection timeout in ServerSocket.cpp. + * Fixed assert when build with wx-cvs. + * Added option for disabling SIGSEG handling: useful for + debuging in amuled.cpp. + * EMSocket.h cleanup. + * Fixed unclosed sockets (CLOSE_WAIT) and few stability + problems. + * Make CEMSocket::OnReceive thread safe. MAX_SIZE reduced, + cause even theoretically tcp can buffer up to 64K. + * amuled fixes. + + mfs: + * Fixed crashes on friendlist when keeping keys pressed + * Fixed one server not being removed when several servers selected + * Fixed access problems on deleting the ipfilter while accessing it + + Phoenix: + * Fixed '&' char next to Preferences in amuleweb web page, as + reported by DreamWalker. + * ExternalConn: protected GETCATTITLE command from buffer + overflow. + * Start removing unused code from ExternalConn.cpp. + * Fixed high CPU usage problem in amuleweb, thanks to jaguarwan for + the report. Daemonizing amuleweb should be done using the -q + switch. + + ThePolish: + * Implemented new hits system in wxCas to display and save download rate records. + * Changed wxCas layout to try to avoid display bug with wx-cvs + * Added translations update (Thanks to all translators) + * Removed wxCas documentation to slim source tree (now downloadable from berlios) + + Seagull: + * Patch adding "Directory" column to the shared-files dialog. + * Patch to add "Swap to this file" option for sources marked as + "Asked For Another File" on download queue. + + Unleashed: + * Better fix for amuleweb's high CPU usage problem. Now main thread only gets + woken up when absolutely needed. + + Xaignar: + * Reinsured that the preferences will be saved upon clicking "Ok". + * Removed SSE2 specific optimizations from the embedded Crypto++ sources, + they would break very easily and crash aMule. + * Fixed a bug where we would sometimes attempt to remove a client + from the wrong file, resulting in dangling pointers and crashes. + * Ensured that the statistics-dialog would be updated when preferences + relating to it where changed. + * Added sanity checks to category-loading, to avoid adding categories + without incomming dir or name. + * Initial fix for crashes if aMule tried to share an inaccessible folder. + * The redraw problems on restoring from minimized state should be fixed. + * Fixed the shared-files list, which would draw columns regardless + of whenever or not they were hidden. + * Fixed the progress-bars in the shared-files dialog. It should now + work properly for both part and completed files. + * Fixed a bug in the ipfilter, where non-numeric chars on lines would + cause wrong ranges of IPs to be filtered. + * Re-added the priority menu for servers, which had gone missing due + to a mistake. + * Stopped the client-credits class from attempting to load older + versions of the lists, which again would lead to mem-corruption. + * Fixed hidden columns on download queue, which would still be drawn. + * Added sanity checks to loading of clients.met file, since corrupted + files would lead to potentially huge ammounts of mem-corruption. + * Added "Completed Sources" column to the shared-files dialog. + * Fixed a bug in sockets where disconnected sockets wouldn't be removed + immediatly, but left to timeout instead. + * Fixed an end-less loop on the AICH thread if a file on the queue + was removed from the list of shared files. + * Fixed an end-less loop when changing file-status by category. + * Fixed the auto-priority menu-item on the download list when multiple items + where selected. It would un-set auto-priotity instead. + * A bit of optimization in CPartFile. More work will follow later. + * Properly initialized a number of variables. + * Fixed the column-width saving/loading which I managed to break shortly before + rc6 was release. Whoops. :p + * Ampersands will no longer be doubled when lines are added to the log-view. + + Special Thanks To: + + * Translators in this release: + biger [HUN]: (Hungarian / hu_HU) + GhePeU: (Italian / it_IT) + mad_soft: (Spanish / es_ES) + Ogon: (Polish / pl_PL) + piarres: (Basque / es_EU) + powtrix/willy: (Brazilian / pt_BR) + punkyxd: (Catalan / es_CA) + stefanero: (German / de_DE) + Supersnail: (Dutch / nl_NL) + + * Testers and bug reporters: + angel, BiByFoK, + bill_bool, boutros, + elui, Gaenya, + jolupa, ken_aMule, + mad_soft, Mig21, + one2one, powtrix, + RedDwarf, skolnick, + wi777 + + * Everyone at: + #amule irc.freenode.net + wiki http://wiki.amule.org + forums http://forum.amule.org + bugtracker http://abugs.amule.org + + * All aMule users!!! + + +-------------------------------------------------------------------------------------------------------------------------------- + + +Version 2.0.0rc6 - The "We're so EVIL that we make you lose a sock in every pair" version. +---------- +2004-10-03 + + deltaHF: + * GUI for MyInfo at Server window. + * Added 'About' button. + * Fixed sorting upload list by speed + * Changed the Search dialog. + * Fixes websearch for jugle.net + * Added hability for send msg to clients in upload queue, without having to add + them as friends (based on Kry's download queue send-on-right-click implementation) + * Translations update. + + falso: + * New upstream cas version. Now supports creating html pages with the statistics + * Now cas runs on netbsd. + * Misc fixes on cas. + + GonoszTopi: + * Patch to fix buffer overflow in cas when line had more than + 80 chars. + * Patch to fix help switch in ExternalConnector.cpp + * Patch to create -c switch in amulecmd: now the command line + version can connect, execute a command and exit. + + Hetfield: + * Lots of 3.4.x compilation fixes, due to -DWX_PRECOMP + and wx headers checks. + * Configure cleanup, safetray remove and nice cosmetics for tools + * Configure option added: --enable-embedded_crypto to use amule crypto code + and bypass crypto libs. Also fix freeze problem. + * fixed crypto usage in core with configure and compilation flags + * Re-enable Pentium4 and SSE2 optimizations fro Crypto stuff + + Jacobo221: + * Fixed issue on the About button. + + Kry: + * Got back from hell. + * Imported eMule's 0.44x new corruption handling: AICH + AICH stands for Advanced Inteligent Corruption Handling, and avoid having to + re-download a full part everytime we get corruption on a file. With AICH, you will + just re-download the 184Kb block that has corruption. It uses HashTrees to achieve + the corruption diagnosis. + More info: http://www.emule-project.net/home/perl/help.cgi?l=1&rm=show_topic&topic_id=589 + ********************************************************************************* + WARNING: AICH thread will re-hash all your files on your first rc6 startup. This can + take very long when the user has lots of shared files. We're sorry but that's the only + way to build the HashTree and thus making AICH able to work. + ********************************************************************************* + * Fixed the AICH implementation to support big endian archs (like ppc). + * Implemented IPfilter auto-load on startup + * Implemented IPFilter 'Update Now' button on preferences. + * Revamped the HTTP download dialog, used to download IPfilter and server.met + (and probably other files in a near future) Now it's the thread who runs the dialog, + and dialog no longer block aMule while loading. It also has a progress bar. Yay! + * Fixed amule daemon not allowing auto-dowload of server.met. + * First rework of the Search dialog, later re-worked by Xaignar using the + hide/show engine I did. + * Implemented "Send messages" via right-click on source. + * When aMule is running and you try to run a second aMule, it now send a + 'raise' message to the current runing one. This is designed to fix the problems + with aMule being in a inexistant systray and thus people being unable to recover it. + * Fixed documentation: + * Bugs on kb/kB mistakes + * Added "What are all those fancy colors in the download progress bar about?" + * --version switch now returns 0 (sucessfull app termination) + * MOD_VERSION_LONG does no longer show 2.0.0 version on CVS + * Cleaned the GUI for LOTS of unnecessary wxSizers that were looking ugly on Mac + and making wxDesigner project file much cleaner. + * Fixed memleaks on curl usage (thanks Seagull) + * Systray is now skinnable + * Safety checks: A File can't have more than 441 partcount + * Added a file-access tracker that allowed us to fix lot of file access bugs: + * We were closing invalid file descriptors! + * Random Error responese from CFile class, again + * Misc multiple bugs that made me kinnda rewrite the class + * Fixed user not being notified of duplicated files on shareds + * Safe load for clients.met (no more removing to load amule) + * Fixed PrefsUnifiedDlg using wrong events for Spin controls. + * Search textbox now accepts enter key (did it work before? or never worked?) + * aMule now compiles and works with wxWidgets 2.5.2, with no gui bugs + * Fixed a nasty cvs bug that was just taking '0' on upload settings as 0, not unlimited. + * Fixed CArray implementation to avoid ints and make usage of size_t and off_t + * Added GetConnectIP() implementation to BaseClient so we can hold the supposed IP + or (after we had a connection) the real IP + * Implemented extra-file_corruption_safety on files. No more 'please rm -rf .aMule/' + * Implemented safe recover of .part.met files. + This means that if a .part.met file gets corrupted, aMule will take care of it and try + to recover it with minimal info. As a matter of fact, only filesize and hash is need, + so any other info will be recovered or set to default instead of discarding the part file. + * Fixed mem corruption on BaseClient + * Fixed a crash on UploadListCtrl due to access to a either uninitialised or removed client. + * Fixed the annoying empty message being sent every time a client connects to us while + we have a chatwindow with him. this was really pissing people off ;) + * Reworked SafeFile.cpp and made it compatible with eMule 0.44x. + * aMule defaults to maximize if not size not overriden and no gui size stored (robably first run) + * Implemented CDirIterator. + Used to get rid of wxFindFirstFile and such buggy functions (breaking filenames on Mac and others). + * Added GUI preferences fo AICH's hash trusting and IPfilter new options. + * Corrected xMule version show. xMule started sending correct version tags on 1.9.1b, only 4 + months after I told them, and only 1 after eMule+ developers did. Is based on our implementation + (x.y.z instead of eMule's x.ya), so it was not hard to show them correctly ;) + * Misc developing, memleak fixing, code rewrite, and co-workers abuse by insulting + them and degrading them to worm state. + + * Kademlia Import: + kademlia/utils + * UInt128.cpp (class for handling 128-bits integers, added hability to read/write on SafeFile). + * UInt128.h + * All other files on the kademlia/utils are not needed by aMule. + kademlia/kademlia/ + * Defines.h + * Entries.h + * Error.h + * Tag.h + kademlia/routing/ + * Map.h + + * Mac: + * Fixed compilation near every day :) + * Fixed the file descriptor problems, using the new file access tracker. + * Fixed the clients.met file being saved badly and thus breaking load. + * Fixed Search page not setting the SearchType to default. + * Fixed the start, clear and clear all buttons on Search page + * Fixed wrong usage (at least on Mac) of multi line control functions on single line text control + * Fixed sharing dirs giving access errors (and probably on other archs than Mac). + * Fixed amule daemon for taking 100% (or 198% on a dual system) CPU. + * Fixed wrong filenames being shown when more than 24 chars. See CDirIterator above. + * Fixed 'MyInfo' tab showing wrong endianess on IP. + + * Deleted files: + eMule-Import-Status -> Very old unused file. + RC1-KnownBugs -> Very old unused file. + HTTPDownloadDlg.* -> HTTPDownload.* (no longer a GUI file) + + + lfroen: + * Core/GUI separation: + * Moved all GUI code out of Core files. + * Made a new socket engine to be able to use wxSocket on wxBase, even when + wxBase has no event pool. + * aMule daemon is now functional, but it still need hard testing. + Enable it using --enable-amule-daemon. + You can control it via any EC app (amulecmd, amuleweb) + * aMule separated GUI does not compile right now, and the communication + with the core will be improved as EC is rewritten by GonoszTopi. + * Fixed crash on DownloadClient + * Misc aMule fixes here and there :) + + Littletux: + * Patch to include UTF-8 support in systray. + * Patch to fix configure.in UTF-8 SysTray code. + + Phoenix: + * Fixed a compilation warning + appartently useless code in + DirectoryTree.cpp. + * Fixed amuleIPV4Address for wx-2.5.2 and up. + * Fixed the low number of sources problem with wx-2.5.2 and + up. Problem was in CUDPSocket::SendBuffer, now there is a + macro to test. aMule should be 2.5.2 network ready now. + * wxCHECK_VERSION(2,5,0) no longer necessary in + amule{web,cmd} for wxApp because we have now -DwxUSE_GUI=0. + * New command line parameter in amulecmd: -pw or --password. + * New commands in amulecmd: serverconnect, reloadipf and + setipfilter. Thanks rommel for the initial patch. + * Fixed amulecmd command parser. Help was not coherent and + giving syntar errors. + * Rewrote command parser/processor im amulecmd to use + wxStrings. + * Some i18n stuff in amulecmd. + * Rewrote amulecmd and amuleweb, creating a new module, + ExternalConnector.cpp. This module has a lot of code + common to both programs, and will make it easier to + maintain. + * Fixed a small wxString bug in CamuleDlg::AddLogLine() + in amuleDlg.cpp. + * Improoved wxSting usage in ExternalConn.cpp. + * Yielding in DownloadQueue.cpp Init() so that gui is not + blank when loading lots of files. + * A little better font/color handling in amulewebDLG and + amulecmdDLG. + * New command line parameter for amuleweb, amulewebDLG, + amulecmd and amulecmdDLG: -f. This parameter reads the + ECPpassword and the ECPort from the [ExternalConnect] + section of file ~/.eMule. This way, the plain text password + doesn't have to be passed in the command line. + * Updated socket-2.5.c to the latest wx-cvs code. + Fast reconnect -> lowid bug is fixed in wx-cvs now. When + wx-2.5.3 is out, we will finally be able to drop this file. + It will only be needed for versions 2.5.0(?) to 2.5.2. + * Removed gsocket-2.5.h from the project. This file was not + beeing used anymore. + * Added command line parameter "-q" or "--quiet" to + amuleweb(Dlg) and amulecmd(Dlg). This is to run amuleweb + without any output to stdout, so that it does not need a + terminal. + * Changed amulewebDLG and amulecmdDLG to use sizers. + * Removed a bug in WebSocket.cpp: was not testing the return + value of Accept, this could create a thread with a NULL socket. + * Added two new commands to amulecmd(DLG), GetIPLevel and + SetIPLevel . + * Rewrote most of the wxString usage of amule web server in + ExternalConn.cpp. There should be some speed improovement. + * Removed pop up when web server requested ed2k source link + and amule was low id. + * Fixed a problem with Server Connect command in amulecmd, it + was not working. It has been renamed to ConnectTo. Also + fixed help command output, should look better now. + * Added "-fmessage-length=0 -W" flags when --enable-debug. + * Changed m4/wxwin.m4 to recognize wx-config --libs base (no + equal sign from 2.5.3 and up). + * Unicode fix in SysTray and new compiler wanings fix due to + new compiler debug option -W. + * Some more consts in code due to CDownloadQueue::GetFileByIndex() + and CSharedFileList::GetFileByIndex(). Also cleaned those + functions. + * Fixed Resume/Pause bug in amulecmd/amule. Now Resume/Pause + argument starts at zero. + * More gsocket.h update. + * Debug protocol options. Comment/Uncomment: + #define DEBUG_LOCAL_CLIENT_PROTOCOL in BaseClient.cpp + #define DEBUG_REMOTE_CLIENT_PROTOCOL in ListenSocket.cpp + #define DEBUG_SERVER_PROTOCOL in ServerSocket.cpp + #define DEBUG_CLIENT_PROTOCOL in sockets.cpp + * Changed configure.in to no longer use gsocket-2.5.c for + wx-2.5.3 and up. + * Fixed the Random Lowid Bug. + * Cleaner solution to RLB: Accept() the connection and + Destroy() the socket immediately. + * Fixed a lot of bugs in amuleweb. In particular, stop / pause + / cancel / priority(up/down) now works. + * Removed bubble sort code in download queue from amuleweb. + This code did not scale for large number of files, like + hundreds. There is still room for improovement here. + * Fixed a bug in SafeFile.cpp. wxString.Length() returns the + number of codes in the string, which is less than or equal + to the number of bytes in a multibyte encoded string. This way, + amule will also not crash with locale search strings like korean, + japanese and chinese. + * Several amuleweb/ExternalConn bug fixes. Now the + communication is in UTF8, so that soon amuleweb non-unicode can + communicate with amule unicode and vice-versa. There was a + bug when the number of files was more than approximately 90 + because the communication routines could not handle strings + greater than 64K chars. There is still some replicated code + in ExternalConn.cpp, but the idea is that it will use the + code in ECSocket.cpp. + * Bug fix in ExternalConn.cpp. ECSocket must have the + wxSOCKET_WAITALL flag to work properly when the message has + more than 64Kbytes. aMule now uses ECSocket.cpp, no more + replicated code in ExternalConn.cpp. + * Fixed a bug in ListenSocket.cpp, m_client can be null after + ProcessSecIdentStatePacket(), so, we must check. + * Fixed conversion problems in ECSocket.cpp. Now external + connections in UTF-8 are really working, and + amuleweb/amulecmd (unicoded or not) can connect to amule + (unicoded or not). + * Fixed an unprotected call to strlen() in ECSockets.cpp, if + you pass a NULL pointer to it, the program segfaults. + * Added a timer for idle repainting in amulewebDLG and + amulecmdDLG. + * Fixed this assertion in Preferences.cpp: [Debug] 07:02:00 AM: + include/wx/longlong.h(155): assert "(m_ll >= LONG_MIN) && + (m_ll <= LONG_MAX)" failed: wxLongLong to long conversion + loss of precision. + * Reimplemented "Show Rates On Title" preference. + * Initial import of new MD4 hash code from emule 0.44a into + KnownFile.{cpp,h}. + * Removed amuleweb html template 12 char password limitation. + * Small fixes to UTF-8 SysTray support patch. + * Several unicode fixes. + * New macro in otherfunctions.h: unicode2charbuf(x) -- used + when you need to store a (char *) to use several times. + + Rommel: + * Patch to implement the commands serverconnect and reloadipf + in amulecmd. + + ThePolish: + * i18n amule log lines (server window) + * amulecmd and webinterface i18n fixes + * Some win32 fixes (slashes and backslashes) + * Automake 1.8 fixes + * Add traditionnal Chinese translation (zh_TW) from Paul (Thanks !) + * Add it, nl, fr, pl, es, eu, ca translation updates (Thanks to + all translators) + * Fix copyright for alc icons + * Replace amule, wxCas, alc .ico simple icons by icons group .ico + * Replace alcc's printf by wxLogMassage + * Make runtime to be in seconds in amulesig.dat + * Modify Xas to handle runtime in seconds + * Modify wxCas to handle runtime in seconds + + Unleashed: + * cas: some sprintf -> snprintf conversions, ifdef unix specific + code, and revert get_path() breakage + + Xaignar: + * Other stuff I'm too lazy to write or have forgotten about. ;) + * Initial multi-sorting on download list. Upon changing sort-column, + any items that were evaulated to equal will be resorted by the + last used column. + * Fixed the constant resetting of the category dropdown-menu in + the searchdlg. + * Fixed "&"s being replaced with "&&" on the log-view. + * Only displayed category color when the items arn't highlighted + on the download list, to improve readability. (thanks to Seagull) + * Optimized the IPFilter-code. + * Improved the CDownloadListCtrl::Updateitem function so that it + doesn't search the list for hidden items. + * Improved sorting of clients by QR on the download list. + * Removed a number of unsued files, cutting down archive-size + by around 900kb. + * Changed systray behavior to match KDE/GNOME. Single-clicks hide/show. + * Fixed the "Last Recieved" column, which would show the + same as the "Last Seen Completed" column. + * Fixed the placement of sources on the download list, where they + would sometimes be placed with the wrong file. + * Cleanup of the new AICHSyncThread class. + * Removed extra newlines before writing text to the logfile, + to avoid having a double-spaced file. + * Fixed loading of addresses.dat, where the first line would + be ignored and replaced the messagebox with a log-line. + * Fix the percentage displayed on the progress-bars being rounded, + which would result in non-completed files showing 100%. + * Added the ability for the user to specify permission settings for + fildes and directories. These settings default to 640 for files and + 750 for directories and are used throughout the app, with the + exception of files created with wxTextFile, as that class lacks + support for permissions. Will be fixed later + * Cleanup of CServerListCtrl: + - The sorting of the list is now always maintained, including when items + on the list are updated or new items updated. + - Cleanup of the popup-menu. + - Disallow connecting to multiple servers at the same time. + - Other changes. + * Reduced the overhead of the overhead calculation by using + code that didn't require iterating through a list every time. + * Added checks to avoid the user getting spammed with the "Connected + to user" and "Disconnected ..." when having an open chat-window. + * Second reworking of the SearchDlg + - The crash on searching should be fixed now. + - Initial cleanups of the SearchList class + * Cleanup of the SearchListCtrl class + - Results will now always be sorted + - Syncronized all lists during runtime, so that they behave + as a single list. + - Improving the coloring of items. + * Cleanup of the CMuleNotebook class + * Cleanup of the CMuleListCtrl class: + - Added double-arrow for alternate sorting. + - Centralized a lot of logical plus lots of other changes + * Double-buffered all listctrls using custom drawing, to reduce flicker. + * Added warning if the user recieves LowID from the server. + * Disallowing the user to send empty messages in the chat window. + * Rewrote the PrefsUnifiedDlg class + - Removed the Rse classes and create a more clean replacement. + - Made the dialog mode-less. + - Removed the un-implemented Notify page + - Serveral other changes. + * Updated the version reporting capabilities of aMule, so that it + will report version, wxWidgets type and version and if unicode + has been enabled or not. + * Added the new MuleTextCtrl class which supports the traditional + popup-menu with Cut/Copy/Past/Clear and Select All. All existing + wxTextCtrls were replaced with this new class. + * Imported the parts of Crypto++ that aMule needs into two files + with permission from the Crypto++ developer. This means that aMule + now compiles without the user having Crypto++ installed, though it + is still possible to use external Crypto++ installations if the user + wishes to do so. + * Fixed some compilation problems with aLinkCreator and wx-2.5.2. + * Fixed the First-Time-Message being displayed twice and rewrote it + somewhat since it was becomming quite outdated. + * Fixed the "unable to open preferences.dat" bugs. + * Fixed the ability to add static servers. + * Cleanup of column sorting functions. + * Fixed a bug where CServer::HasDynIP would always return true. + This would result in need-less dns lookups. + * Removed a redundant attempt at adding servers from connected + clients. + * Fix for Packet::PackPackets function where new size of packet + wouldn't be saved. + * Fixed some access to the dialog-window ptr after it had been + deleted. This was causing some odd behavior once in a while + on termination. + * Fixed the downloadqueue sorting, which was reversed. Low-priorty + files having high priority and high-priority files having low + priority. (Thanks to thomas001 for noticing) + * Rewroked the systray: + - Fixed the the problems with the rate-limiting functionality. + - Enabled use of PublicIP requests, so that the tray will show + the users actual IP rather than the interface IP. + - Some changes of the menu-structure. + * Complete reworking of the hashing thread: + - More informative output + - Much better error handling + - Handles duplicate files gracefully + - Reads only 128kb (instead of 9mb) at a time to avoid killing + the harddisk entirely while the thread is running. + - Made the thread terminate when no files are left, instead + of timing out as before. + * Disconnected otherfunctions.h from the rest of the aMule code, + so that it should be possible to use it in external apps. + * Added checks when using the client-pointer in the socket-code, + since that suffered from the same problem as the previously + fixed clients (they have a habbit of dying at random). + * Added function for truncanating displayed filenames, which is now + used in file-details dialog, to avoid it getting resized to + extreme widths. + * Some work on readying the Info tab on servers, deltaHF_ did the + rest of the work. + * Small re-fix for the "mis-matching hash"-bug fix + * Reworked the SearchDlg once + - Added Jugle.net websearch + - Added results-count to the result tabs + - Other smaller changes + * Fixed mem-leak where certian client-objects wouldn't be deleted. + Specifically those that were removed from the download queue but + wern't on the upload queue and didn't have a active socket. + * Removed debugging functionality no longer needed. + * Removed variable-arguments logging functions, since they were + only needed in a very few places and posed a potential risk + everywhere else. + * Fixed StripInvalidFilenameChars function to avoid legit letters + being dropped (thanks to likesylph). + * Changed all file-accessing to use CFile rather than a mix of CFile, + wxFile and FILE. + + * Removed a number of warnings. + * Cleanups of the following files + - AICHSyncThread.* + - ServerListCtrl.* + - SearchListCtrl.* + - MuleNotebook.* + - MuleListCtrl.* + - PrefsUnifiedDlg.* + - SysTray.* + - AddFileThread.* + - SearchDlg.* + - CMemFile.h and filemem.cpp + - SafeFiles.* + - CFile.* + + + Special Thanks To: + * Lucasvr, for providing fixes for compilation with some wx versions. + * Seagull, for providing fixes and suggestions. + * likesylph, for providing a fix for the StripInvalidFilenameChars function. + * All translators + * All testers + * BrianHV and the people at #wxwidgets for their help and support + * EVERYONE at #amule (even codewarrior2!) + * All the people in aMule's forum + * All the users, for having the patience to wait the delayed rc6 release. + * Hellimod, one_2_one, ASTIOBOY, sssnake, lami123, Ocimin, agav, PowerMike + and all the mac testers and people providing Macs for ssh & vnc. + + Funny stuff about this changelog: + * You can notice that the Search dialog was rewritten 3 (THREE!) times + between rc5 and rc6. You only get to see the final version (Xaignar's), + but the initial one was Kry's (when the extended buttons show/hide + were added) and then deltaHF changed it later. + We just love changing that page. + +---------------------------------------------------------------------------------------------------------------------- + +Version 2.0.0rc5 - The 'Let's recover our release speed' version. +---------- +2004-07-18 + + deltaHF: + * Better sorting of some columns + + Kry: + * Some gui design and coding of the upcoming Kad window + * Protocol update: + * UDP protocol upgraded to eMule 0.43b + * TCP Standard Base protocol upgraded to eMule 0.43b + * TCP Extended Base protocol upgraded to eMule 0.43b + * Fixed memory corruption and crashes on 'cas' + * Fixed gsocket-2.5.c for big endian archs. + * Fixed CFile class to actually return error when a error ocurred and not only when it feels like. + * Fixed bug where the 'All' category could be removed leading to crashes and other funny behaviours. + * No more minimize when no tray has been selected. + * Fixed browse skin file button to actually browse a file ;) + * Fixed high 32 bits of transfered bytes not being loaded on known.met (sorry fluffly!) + * Some Mac bugfixes. + + Hetfield: + * Some gcc 3.4.x compilation fixes + + lfroen: + * GUIEvents updated + * core2gui events added. + * Some gcc 3.4 fixes to GUIEvents + + Phoenix: + * Added a test with a warning to + CSearchDlg::OnBnClickedSdownload in SearchDlg.cpp. A NULL + value has been reported on the foruns, we don't know how + GetPage() or FindWindowById() could have returned NULL. + * More unicode fixes to alcc and ed2khash. + * Fixed flags for console applications. -DwxUSE_GUI=0 is + required so that amuleweb, amulecmd, etc, run fine with + wxWidgets version 2.5.2 and up. + * Fixed a problem with gsocket-2.5.c when using wxWidgets + version 2.5.2 and up. Now amule runs with 2.5.2. + * New ipfilter code. + * Found the reason why wx-2.5.2 gui was messed: starting with + wx-2.5.2, a new flag must be added when adding components to + sizers to keep the old behaviour (wxFIXED_MINSIZE). This + constant is defined to zero in amule.h when wx-version is + less than 2.5.2, so that amule still compiles in old wx. + + ThePolish: + * Add win32 MakefileWIN32, configureWIN32.h and project file amule.msp + * Make win32 use winsock2 for IPFilter + * Enable alc, alcc, wxCas translations with aMule catalog + * Use normalized includes for wx in wxCas, alc and alcc + * Limit the server name length in wxCas to avoid a too large window + * New icon for alc + * Global fr translation + * Fix win32 ToolBar problem + + Xaignar: + * Added the ability to search for "Texts" + * Attempt at fixing both Random Socket Bugs and Random Client Bugs. + * Fixed new IPFilter code. + * Cleanup of CPartFile::SavePartFile + * Got rid of some unneeded includes. + * Fixed compilation when using crypto++ 5.2 + * Ensuring that the ServerListCtrl gets unfrozen in case of corrupted met files. + * Fixed a crash-bug added by Kry's UDP commit. + + Special thanks to: + * The usual people, those on the other 'Thank you!' sections of changelog. + * All the people at the Mac section of forums, for testing compilation and run. + + +---------------------------------------------------------------------------------------------------------------------- + + +Version 2.0.0rc4a - HOTFIX release for lugdunum 16.47 servers (The 'Ooops!' version) +---------- +2004-07-14 + + Kry: + * eserver 16.47 fix for shared files packet not compressed + + deltaHF: + * Translations update + +---------------------------------------------------------------------------------------------------------------------- + + +Version 2.0.0rc4 - The 'Mules and rabbits like apples too' version. +---------- +2004-07-12 + + alehack: + * Patch to show extra QR info + * Patch to colorize the download list + + aquatroll: + * Fixed includes for Win32 compilation + * Cleaning of unused variables on Win32 + * Fixed compilation on Win32 + + Citroklar: + * lots of unicode slave work ;) + + croakerc: + * Fixed OpenBSD compilation + + deltaHF: + * Added websearch function (filehash.com) + * Added jugle.net as Fake-check URL + * New buttons added: + - reload sharedfiles + - switch upload/uploadqueue + - clear completed files + * Added 3 new columns in upload window (Client Software , Upload/Download , Remote Status) + * Added 'Client Software' column in upload-queue window + * "Asked for another file" on sources now with the filename that is asked for ( i.e. A4AF -> xyz.avi) + * Added 'copy file feedback to clipboard' function + * Added new Toolbar icons [ thx to http://www.everaldo.com ;) ] + * Added icons in Preferences + * Download menu changed + * Work on skin support + + falso: + * Typo fix: bandwith to bandwidth + + hellimod, one_2_one: + * MacOSX support + + Hetfield: + * Fixed unicode issues on SysTray.cpp, now apps is really unicoded! + * deleted separated i18n stuff from SysTray, now uses global one + * Fixed 2 memory leaks in SysTray + * updated italian and napoletanean translations + * Fixed unicode issues in serverlist updates and download tab + * Fixed unicode issues that stopped adding files to download from ed2k utility + and internal link handler + + Jacobo221: + * New feature to open webpages in new tab instead of new window + * Fixed a compatibility bug in OnlineSig with eMule's and added connecting support + * Fixed bug in Statistics limits in Preferences + * Fixed bug in Upload/UpQueue button + * Fixed SERV.4 bug + * Fixed DISP.14 bug + * Added DOS compatibility into CAS and update onlinesig support + * Several features in XAS (see XAS's changelog) + + Kry: + * Fixed wxWidgets 2.5.x socket code. aMule now works on wx2.5.1 perfectly, wx2.5.2 introduces some GUI bugs. + * Rewrote Preferences engine to be much nicer, and Mac compatible :) Thanks to deltaHF for the new icons. + * Added a hack to make new preferences work on wxWidgets 2.4.2. I hope we can get rid of wx 2.4.2 soon ;) + * Wrong .part.met files no longer make aMule abort on startup. Now a warning is displayed on log and aMule ignores that file. + * Added the new compatible client flags tag agreed with lphant devs and eMule devs. xMule devs refused to use it. + * Overloaded the wxSocketClient::Destroy to a safer version, to check cases when deletion is not called from Destroy() + * Fixed the disconnection of clients that have MS_CHATTING state. + * Fixed the usage of QueueLogLine fucntion to avoid crashed on too fast computers ;) + * Remove spaces from search string start and end. + * Remove spaces from ed2k links start and end. + * Fixed a mem corruption due to lphant icon size (we all know lphants are big) + * Splitted internal core and GUI events + * Socket events mover to core + * Timer got separated into core_timer and gui_timer, each one with the matching functions. + * Fixed UDP socket handler being... the TCP handler. Since lmule times. + * Delayed deletion of sockets to avoid async deletion issues that happens when Destroy() is called on a event + * Fixed several rare crashes happening on some fast computers on shutdown aMule. + * Added a debug function to get track of double-deletion of clients. + * Socket handlers now stop notifying new events when Safe_Delete() is called. + * m_pszUsername inited before a new call to handle 'new' exceptions correctly. + * Added a hack on IsRunning() to check for current app object not existing yet (or deleted on shutdown) + * Fixed all icons to be 16x16 to avoid asserts on 2.5.x for unmatching wxImageList sizes. + * Fixed all wxImageList sizes to avoid asserts on 2.5.x on object construction. + * KnownFileList takes account of the duplicates now, so those are not rehashed each time anymore. + * Fixed EC password not being shadowed on preferences. + * The preferences dialog should be resizable now. + * Updated lphant stats to show the version as they added the extended version tag. + * Fixed 1 double-delete on ListenSocket, when socket is not connected. + * Each socket has its own handler now. Much safer and faster. + * Fixed hashing thread implementation to make it shutdown safely. + * Fixes on geometry handling to make it work properly from commandline. + * Fixed minimize to tray to work properly with no more double-minimizes. + * Coded the skeleton of the core/gui separation event system, improved by lfroen later. + * Fixed CString implementation for operator '+' + * No linking cas, wxcas and ed2k against crypto, please :) Fixed. + * Lots of speedups on ClientUDPSocket handling, someone went paranoid and added lot of redundant code. + * Changed most of the wxT("") to wxEmptyString + * Fixed the splitter position and client size on restart. + * Fixed compilation on wxWidgets CVS + * Fixed amuledlg not being set to null + moved the init to beginning on amule.cpp + * Fixes mem corruption and crash on PrefsUnifiedDlg + * Fixed missuse of inet_addr on BaseClient. + * Fixed crash on stats disabled + * Reduced memory usage with a centralised icon handling. + * Fixed wrong var type on EMSocket.h causing mem waste. + * Fixed bug on SetFileSize (thanks to Pichuein on eMule forums) + * wxWidgets 2.5 compatible CDirectoryTreeCtrl. + WARNING- NEW BEHAVIOUR IS: LEFT CLICK ON ICON -> SHARE, RIGHT CLICK -> RECURSIVE SHARE + Also made the icon red if the folder is shared. + * ModString fixed - Now mods identify themselves correctly. + * As xMule now identifies as eMule 0.0a, added xMule detection based on username + and modstring to keep stats coherent. + * On debug builds, client stats now show the amount of clients with open socket. + * Changed theApp.glob_prefs->GetAppDir() to theApp.ConfigDir for speed improvements. + * Fixed crash on empty shareddir.dat + * Fixed listen socket being processed before created on fast computers and thus causing crashes on startup. + * Fixed server version tag. + * Added frame name to the aMule main window to be handled correctly by X server + * Fixed a crash on log file re-creating on startup. + * Fixed the update of the categories tab names to show the file count and the downloading files. + * Fixed the update of the categories tab names tp happen only when needed to save cpu. + * Changed several vars and functions to const for speed improvements. + * Enter button working now for web search. + * Added a check to disconnect clients sending non-hello packets before finishing handshake. + * Added preferences items for the upcoming Skin engine. + * Fix from lugdunum to avoid blacklisting on servers because of key repeat on pressing enter for search :) + * Use generic BSD wx preprocessor define to make aMule FreeBSD and OpenBSD compatible. + * Fixed Incoming folder not being shared on strange situations. + * Fixed usage of '/' instead of '\' on Win32 builds. + * Made file comparison case-insensitive on Win32. + * Better fitting of notebooks + * Fixed shared files reloading to stop being dependant of buttons/labels + * Socket handling now deletes the client if connection fails ;) + * Fixed some wxSizer usage causing compilation compatibility problems between wx 2.4.2 and 2.5.x + * aMule now filter bad ips on source seeds. + * Autoconnect and onlinesig are now on by default. + * Added a check on graphic stats drawing to avoid crashes if no DC is created yet. + * aMule now uses crypto++ for MD4 calculation (faster, and endian safe) + * Added two sanity checks for source drawn with no reqfile associated, avoiding crashes. + * Fixed mem corruption and possible memleaks and crashes on file comments received. + * Fixed a BAD and UGLY and EVIL mem corruption happening since more than a year ago and still present + on the original program (xMule). + * Client sending wrong OP_FILEREQUEST packets are now disconnected to avoid further problems caused by their + corrupted packets. Old shareazas and most xMule versions have been warned since 2004/04/13 from aMule and + since much more time ago from eMule. Shareaza fixed it, but xMule refuses to fix it. eMule 0.43x disconnects them too now. + * Fixed crashes on sockets because of packet overhead being calculated after packet was deleted. + * Fixed the CVS mod reporting for aMule 2.x + * Fixed the Online Signature dir selection. + * Fixed some shared files not being shared due to a return; on a wrong place ;) + * Fixed some events being posted to wrong event handler. + * Added GUIEvents.h to take care of the core/gui separation events. + * Cleaned ColorFrameCtrl class + * Cleaned otherfunctions.* + * Lots of misc code cleaning + * Several minor messages and GUI bugs. + * Several warnings removed. + * Removed useless files: + XBMDraw.cpp + XBMDraw.h + SplitterControl.cpp + SplitterControl.h + + ------------ MAC ------------- + * Fixed compilation on wxMac CVS and 2.5.x + * Fixed socket connection on Mac. + * Fixed endian issues causing crashes on server communication. + * Fixed string tags being read wrong. + * Fixed known.met being corrupted on every save and reload. + * Fixed stats not working on Mac (no longer crashes because of drawing) + * Fixed mnemonics on file search not being endian-safe. + * Fixed server TCP flags. + * Fiexd bug on lowid callback. + * Fixed serverlist on Mac: + - Server users + - Server files + - Server ip being reversed on restart + - Server port set to 0 on restart. + + -------- UNICODE --------- + * Fixed unicode compilation of most files (except those by Citroklar, Hetfiled, and shakraw) + * Fixed search on unicode builds. + * Unicoded most of the app internals :) + * Fixed part.met on unicode builds + * Hunted and killed (char*) casts and c_str() calls. + * Fix unicode client names and misc. + * Percentage & Download speed fixed + * Reported several bugs to wxDesigner's mantainer to make it work properly on unicode builds + * Fix usage of st_mtime to allow files with non-std chars to be shared without crashes on wx2.5.1 + * Fixed PerformFileComplete to allow unicoded files to be finished :) + * Fixed part met filename being 001.part everytime on unicode builds. + * Fixed renaming on file completion causing crashes on unicode builds + + lfroen: + * Started to implement various changes needed to split the core and GUI. + + Madcat: + * Fixed preferences layout of panels. + * Simpler ed2k link integration for Mozilla 1.3+ / FireFox 0.6+ - Using Mozex plugin + + niet: + * Added support for memory usage and binary name (on xas) + + Phoenix: + * Code cleaning in several modules due to making the members + size, opcode and prot private in packets.h. + * CFile Close(), Read() and Seek() made const. Seek() needed + the use of mutable with m_fd to be const. + * Put lots of consts around the code in the routines that + should be so. + * Patch to --enable-stdin to aid in debug with valgrind. + * Code cleaning in module Packets, made a lot of stuff private + now. + * Small hacks to print debug messages and avoid crashes, + mainly in PartFile.cpp. + * Sanity checks in debug mode (MagicNumbers) to aid finding + bogus clients and files. + * Created debugstuff module, debug build only. + * New configure option --enale-verbose, so that normal users + are not flooded with debug messages. + * MagicNumbers are swapped to signal deleted source/PartFile. + * Removed deprecated wxArrayString::Remove(size_t nIndex, + size_t nRemove = 1) using wxArrayString::RemoveAt(size_t + nIndex, size_t nRemove = 1) now. + * Get rid of evil wxString::GetWriteBuff() and + wxString::UngetWriteBuf() in ECSocket.h. + * Added -pw/--password command line option to amuleweb. + * Small unicode fixes. + * Fixed a messed up display in html code in aMule.tmpl (thanks + to steve.reaver) + * Fixed font problem after Xaignar's great flicker free + work in download list control. + * Fixed broken sort arrow after flicker free clean up. + * Enabled mouse wheel scrolling in all aMule list controls. + * Fixed two unhandled events in amule.cpp: CHAT_REFRESH_FRIEND + and CHAT_FIND_FRIEND. + * Fixed compilation in 2.5.x and some unicode issues in + aLinkCreator. Using wxAppConsole when wx > 2.5.0. + * Fixed compilation and linking in 2.5.x for amuleweb. Now + uses wxAppConsole when wx > 2.5.0. + * Added a test for the return value of + theApp.serverlist->GetServerByAddress(), which could be + NULL. This was the reason why aMule was crashing when trying + to connect to server with wxWidgets-2.5.2. + * Fixed compilation and linking in 2.5.x for amulecmd. Same + problem as amuleweb. + * Commited a patch from wolti that fixes compilation on + sparc/Solaris systems. + * More sparc compilation fixes, thanks to wimms. + * Removed the declaration of void ParseCommandLine(); from + TextClient.h and WebInterface.h. It seems to have been + forgotten here. + * Patch to listctrl.cpp, was segfaulting in 2.5.1 when + hiding/resizing columns. In 2.4.2 was just asserting. + * Patch to Partfile.cpp, workaround the socket == NULL bug, so + that amule does not crash. + + shakraw: + * Fixed the "remote connect" bug + * Unicode support for amuleweb + * Fixed typos on amuleDlg + * Unicoded some files. + + steve.reaver: + * Fixed a messed up display in html code in aMule.tmpl + + thepolish: + * wxCas: + - Fixed for amulesig.dat changes + - Solved localized decimal separator pb + - Embeded all pixmaps in src files and remove now unused pixmaps dir (better for portability) + - Win32 toolbar pixmaps have transparency now + - Added variable refresh timers + - Added user preference system + - Added statistic image creation + - Added FTP support for an automatic upload of the statistic image + + * aLinkCreator: + - Added this new maaarvellous tool suggested by DeltaHF to compute ed2k links from a file (same behavior as eMule link creator, but no shared code) + - Rewrote md4hash and ed2khash code to avoid external dependencies (libcryptopp free), and to be Big Endian proof (works on Mac afaik) + - Added alcc, the "alc for console" command line client + - Added toolbar themes (KDE and DeltaHF's default for now) + - Thanks to Phoenix (Unicode, Hook, commandline...) and one_2_one (Mac tests) + + * aMule: + - Rewrote Makefile.am tree to fit to GNU standards + - Removed Makefiles stuff for wxwidgets < 2.2.6 + - With >= wx-2.5, use wx-config --libs=base,net instead wxbase-config (because base in buggy on 2.5), and keep using both on 2.4 versions + - Check for wx >= 2.4.2 instead of 2.4.0 + - Removed GTK2 warning with wx >= 2.5 + - Fixed GTK2 not detected + - Enabled documentation installation + - Install xas in $(libdir)/xchat/plugins. Will work if aMule and xchat are installed with same DESTDIR + - Suppressed widlcats in makefile (not fully supported in all make) + - Enabled make dist and make distcheck targets + - Force automake scripts update (missing...) to suppress warning in configure + - Force autogen.sh to regenerate intl at each call to keep sychronised with system gettext templates + - Some minor i18n and unicode fixes + - Updated POTFILE.in + - Removed Win32 stuff from autotools scripts + - Added static MakefileWIN32 for win32 compilation + + Unleashed: + [ From rc3 (not on changelog)] + * Cache get_path homedir to speed up multiple calls + * Removed unused Tag_Struct + * Fixed var init and memleak in SearchList + [ rc4 ] + * Fixed COMP.10 bug + * Wiped out USE_DEBUG_SYMS + + wimms: + * More sparc compilation fixes. + + wolti: + * Patch that fixes compilation on sparc/Solaris systems. + + Xaignar: + * Merged lists used to identify file-types to avoid duplicity. + * Added wrapper-class around MD4 hashes. + * Fixed a number of places where the hashes where used as NULL-terminated strings, despite + them not having a NULL-terminator. + * Most functions using hashes now use the MD4 wrapper class for arguments. + * Fixed rare possibility of ending with an unclosed file in CServerListCtrl. + * Fixed unsafe parsing of OP_SERVERIDENT type packets. + * Fixed unsafe passing of strings as arguments to functions using format-strings. + * Changed the chat-dialogs to textctrls, which means that it is now possible to copy text (the unix way) by highlighting it. + * Fixed some memleaks. + * Fixed "&"s not being escaped on status-bar. + * Fixed incorrect source exchange packet format (Many thanks to the eMule Plus team for reporting). + * Started to document source-files with a Doxygen compatible comment format. + * Fixed the height of the barshaders used on the download list, it was 2 pixels too high, resulting in a slight cutoff. + * Reducing CPU-usage of auto-priority by not forcing a redraw every time the priority was automatically changed. + * Fixed that some overloaded functions hadn't been declared virtual in the base class. + * Replaced gif-animation widget with something more lightweight. + * Added sanity checks to CMemFile::Read. + * Fixed a number of uninitialized variables. + * Fixed several warnings about non-existing files. + * Fixes warning about not being able to create dir "" on first run. + * Changed "Extended Drop Sources" preferences, with the result that the option will be reset to "Swap Sources" when this version of aMule is first run. + * Got rid of most warnings when compiling. + * Lots of work on getting rid of c-strings. + * Fixed bug that would cause deleted sources not to be removed from the A4AF lists. This was a major source of crashes. + * Improved performance and safety of the source lists used with PartFiles. + * Lots of small imports from eMule. + * Made reqfile attribute of CUpDownClient private and added wrapper functions to fix the avilable-part information getting out of sync. + * Cleanup of includes. + * Fixed that we were always sending an OP_REASKACK packet and then the correct packet when recieving an OP_REASKFILEPING. + * Fixed Bug 45: URLs are now properly escaped when opening browsers for Fake-check and such. + * Fixed Bug 62: aMule will now be brought to front when left-clicking on the tray icon and when it is redisplayed after having been hidden. + * Added checks against aggressive clients (clients who reask for files too often). + * Imported checks for known leech-clients from the BlackRat eMule mod ( Many thanks to Le Rat Noir and inoteb for allowing us to use their work ). + * Fixed wrong initialization of headers for some packets ( Thanks to thomas001 for reporting ). + * Fixed a delete called on an uninitialized pointer in the statistics dialog and properly initalized serveral other pointers. + * Optimizing the Comp(Up/Down)DatarateOverhead functions to something that didn't require traversing a list at each call. + * Complete rework of the source-swapping functions. + * Fixed the possibility of sources being added to multiple source-lists at the same time (No more mis-matching hashes warnings). + * Fixed the new columns added by deltaHF not being displayed and added checks in case the same thing happens again. + * Almost completly eleminated flicker on the download list and did a cleanup of the drawing routines associated the the download list widget. + * Fixed some lists (Server list, maybe others) not being sorted when aMule is started. + * Fix mem-corruption bug in SysTray code if the systray was compiled in but hidden. + * Fixed the problem with deleting the last (connected) server on the server list. + * Removed the following files: + - ini2.* + - CString.h + - mfc.h + - position.h + - resource.h + - strings.en + * Cleaned up the following files: + - CTypedPtrList.h + - BarShader.* + * Many other smaller changes. + + + Special thanks to: + * Le Rat Noir and Inoteb of the BlackRat eMule mod (http://www.blackrat.fr.tc/) for allowing us to make use of their work on detecting bad clients. + * Optimazer and the eMule Plus team (http://emuleplus.sourceforge.net/) for reporting a bug in source-exchange packets. + * thomas001 for reporting a problem with packet headers. + * Everaldo (http://www.everaldo.com) & "Jimmac" (http://jimmac.musichall.cz/ikony.php3) for new icons + * Phk for searching for new icons ;) + * kno and thermoman for their fixes :) + * TheBlackHand and Hawkster eMule mods + * uberpenguin for AMPS :) + * All aMule users, testers & translators + * eMule & wxWidgets devs + * Everyone we forgot here ;) + + +-------------------------------------------------------------------------------------------- + + +Version 2.0.0rc3 - The 'Target: Stability' version. +------------- +2004-04-22 + + aquatroll: + + * win32 stuff + + barbapapa; + + * Fixed >2Gb files sorting bug on transfer window. + + Citroklar: + + * Fixed saving preferences on klick OK, not only on shutdown. + * Configure stuff + * Cas related stuff + + deltaHF: + + * i18n stuff + * Minor timer fix ;) + + elfstone: + * Fixed already downloading files not being marked as such on search results. + + falso: + + * Improving and fixing cas + * Added capability to create pngs with cas + * Fixed ed2k fast links handler + + Kry: + + * Complete rewrite to emule 0.42x ed2k network code + * Rewrite of hashing thread. Also added a timeout to save resources. + It times out after 1 min without hashing or receiving new files to hash, or 1 min since last hash, and dies gracefully. + * Fixed the crash on startup if incoming/temp folder are on FAT32 + * Added Safe Max Connections code to Preferences->Tweaks. + This code will help all people with USB modems and crappy routers to not hang them. + * Identify to lugdunum > 16.45 with our proper extended version tag (2.0.0) + * Fixed & rewrote stats + * Added Shareaza & lphant + * Fixed mldonkey stats (do they have to change their compatible number this often?) + * Added aMule / eMule / eDonkey proper version handling + * Dynamic tree of client versions (no more void versions) + * Fixed the xmule inflated statitics on the stats tree + * Rewrote client icons handling + * Use alpha channel to show the extended protocol and secure ident + * Added Shareaza, xmule, lphant, bad_guy and unknown client icons + * Fixed chuck selection. Much, much, much, much faster downloads. Back to the 1.2.6 speeds :) + * Fixed Win32 compilation + * Fixed lowID warning message on start being void. + * Proper Win32 and Mac disabling of the vertical preferences + * Severe bug on wxRadio button on RseInt was preventing ANY radio button on preferences from working. + * Fixed crash on 'cancel' while downloading server list. + * Fixed a UpdatePartsInfo missing on KnownFile.cpp + * Fixes the fake-check custom browser textfield + * Added wxNB_MULTILINE to preferences notebook. + * Minor issue on the chunk selection (thanks to AndCycle on eMule forum) + * Fixed a SEVERE mem access issue on the hash of the file id to check on knownfilelist. + * Fixed a SEVERE memory bug on sending the shared folders + * Fixed not sending the incoming and categories folders when sharing folders. + * Fixed 'Friends' working as 'None' on 'view shared' preferences. + * No more [0xy.part] on preview of completed files + * Fixed the FAT32 rehashing of files on startup + * Fixed filters not being used on right click on main transfer tab -> new status + * Changed known file list from wxHashMap to std::map + * Fixed auto-update server list at startup + Added posibility of multiple servelist urls too + * Fix for files publishing, reported by lugdunum to eMule/aMule developers. + * Proper use of ClearHelloProperties that fixes some crashes related to a var not being init. + * Added MOD_VERSION to hello type packets (just for CVS versions) + * Fixed packet processing on EMSocket error. + * Changed the full part (9.28Mb) lower limit for preview to 256Kb + * Added 'LI0' to the evil GPL doer checks. + * Bugfixes on the KnownFile::UpdatePartsInfo code. + * Added new verbose client info checkbox, to find out which clients are sending bad data. + * Fix UDP socket for Win32 + * Re-added the timed part file buffer flush() + * Custom language support added + * Fixed FAT32 incoming/temp warning messages only shown on one of the folders. + * Fixed issues on packet unzip and crash on OP_CANCELTRANSFER already sent + * Added aMule 1.x / 2.x / CVS versioning. + * Thread-safe log lines adding using a queued loglines list. + * Completion Thread revamped --> No longer crashes, no longer asserts, and it's much nicer. + * Fixed safe_delete (again) + * Fixed some memleaks + * Changed some CLists to wxLists + * Cleanup and fixing little bugs ;) + + Madcat: + + * Disable autobacktrace on win32 + * Removed wxTE_PROCESS_ENTER style from fast ed2k links handler (fixes assert) + * The following modifications to CamuleDlg::AddLogLine() function: + * Now uses system locale for date/time formatting. + * No longer asserts. + * Now also works on win32. + * Removed unused m_StateImageList + * Code cleanup + + one_2_one, hoschy007: + + * MacOSX stuff + + shakraw: + + * Fixed multiple file download bug in webserver search section + * Fixed ed2k download link + * Fixed categories for web interface + * WebSocket.* & WebServer.*: now uses wxThreads and wxSockets to be cross platform. + * Better threads' array remove in WebSocket + * WebServer cleanly stopped before exit + * Fixed max 2Gb display bug in amuleweb + * Updated aMule.tmpl: added file %complete support in transfer list + thepolish: + + * Wrote wxcas based on cas from falso + * Enable auto-refresh and Fix GPL headers (wxcas) + * Add system load and uptime (wxcas, Linux only) + + Unleashed: + + * cas: better layout and fixes + * Fixed a pair of memleaks + + Xaignar: + * Fixed negative percentages in downloadlist ... again (Disp.8) + * Fixed the "free(): Invalid pointer" bug (Misc.10) + * Fixed PowerShare priority level not being saved. (Tran.9) + * Fixed the problem where it wasn't possible to select auto-priority in the uploadlist after having selected another priority (Tran.8) + * Cleanup of Search Dialog: + * The reset button is now properly enabled/disabled depending on the contenst of the text fields + * Fixed a bug where searched would be limited to 2gb if max size was set to a value less than min size + * The popup-menu for the notebook now works as expected (SRCH.1) + * The popup-menu will now only show when right-clicking within the bounds of the notebook (DISP.12) + * Fixed the green progressbar on downloads always displaying 100%. (DISP.9) + * aMule will no longer display warnings about not being able to find server.met when a new server.met is saved and no old copy exists. + * known.met is now auto-saved (1) when 30 files have been hashed, (2) when 300mb worth of files have been hashed, (3) and when all files have been hashed. This is to reduce the chances of having to rehash all files after a crash. + * Now uses the user-selected browser for fake-checking and such. (PREF.3) + * Further update of the Chat Page: + * Pages can now be closed like the ones on the Search Page + * Double-clicking on a nickname will open a chatsession for that friend + * When a nickname is updated in the friendlist, the assosiated tab is updated as well + * Other stuff + + + ** Special thanks + + * All the bug-reporters, helpers, translators and users at http://forum.amule.org + * Batman who commited a mldonkey related fix, thanks :) + * Jacobo221, Stefanero for their help and support on forum and all the other stuff ;) + * lugdunummaster for providing support on version tags and new features of lugdunum servers + . + --- As usual thx to eMule & wxWidgets devs and everyone i forgot ;) --- + +--------------------------------------------------------------------------------------------------------------- + +Version 2.0.0-rc2 - The 'white rabbit' version. +------------- +2004-04-11 + + aquatroll: + + * Fixed Win32 compilation (again). + + Ariel: + + * Implemented completed parts count on file rehash. + Prevents your downloads to completely lost on a wrong .part.met write. + + croakerc: + * Added zlib version check + * *BSD compatibility + + deltaHF: + + * New icon for aMule in DL/UP window ;) + * curl-config now >= 7.9.5 (for debian) + * i18n stuff + * Removed double catalan entry from prefs + * Fixed some typos + + falso: + + * Added cas (C aMule Statistics), a remake of aStats but 10 times faster (still lack online sign). + * amulesign.dat now shows the Total transfered values in bytes. + * Added Session upload and download to amulesign and uptime too. + + Hetfield: + + * Added new inclusion path if distro in not detected + * fixed wrong and duplicated inclusion in ClientCredits.* + * Modified configure scripts, only amule is compiled by default + * Added cas, ed2k, amulecmd, amulegui, amule webserver, amule webserver gui + * fixed wrong zlib check in configure + + hoschy, one-2-one, godard, PowerMike, hellimod: + + * MacOSX stuff + + Jacobo221: + + * Compiled the RC1 bugs and provided support on forums. It's our man-for-all. + + Kry: + + * Implemented the Complete count on search results and on file publishing. + This feature added since aMule 2.0.0-rc1 and eMule 0.42e was not released + with the rc1 for network technical reasons (still on testing with lugdunummaster). + When publishing a file, we also inform the server if the file is complete or not. + Search results show the count of complete sources sent by the server next to the sources + found: i.e. 100 (28) meaning 100 sources, 28 of them complete (72 incomplete or old client) + * Added sending of the extended eMule version using aMule version, with additional rc version + * Added parsing of the new 0.4x eMule tags on hello packets. + * Added parsing the Secure Ident packets for new eMule versions. Reduce overhead on download/upload. + * Added HandShake check on upload request. + * Rewrote display of client version on transfers page to handle the client soft/version correctly on any client. + That means eDonkeyHybrids and eMule does show now the correct version (i.e edonkey 0.50.1 or emule 0.42d) + aMule shows now as either "aMule 1.x (based on eMule v0.xx)" (<= 2.0.0-rc1) or aMule "A.B.C-rcX" (>= 2.0.0-rc2) + * Fixed Mule Info packet only sent to eMule clients. Now is sent to old eMule && eMule-like clients (compatible clients) + * Added 'Allocate Full Part File" and "Allocate Full Chunk" to preferences. None functional yet. + * Fixed Client Detail Dialog to show correct client version. + * Fixed comment mark on Download list being cut on the display. + * Fixed the crashes on Base Client packets. + * aMule now loads .par.met.BAK if the .part.met is 0-size (added to Ariel's commit, this prevents losing met files). + * Made SafeMem files really safe checking for read after end of file. + * Fixed wrong Modversion data (fixes random crash too) + * Fixed assert on wrong upload list control data. + * Fixed several crashes on wxString::GetData usage. + * Fixed UDP disable button not being saved across sessions + * Fixed a bug on new version check. + * Locale goes to System Default on new version now (fixes weird language problems) + * Fixed wrong OP_REASKFILEPING packets being sent . + * Reverted GAddress_INET functions to standard inet_addr ones. + * Completely removed list refresh functions. CPU saved was not worth it. + * Added CheckDiskSpace checkbox and radio button to the preferences. + * Added the scale of the connections graph on stats. (only rescaled on restart) + * Added 'Reset' button for Server Log + * Fixed: Right click popup on server connected was showing 'connect' now shows 'reconnect'. + * gscocket shouldn't be compiled on Mac, and so it's not compiled now ;) + * Fixed Preview of already completed files not working. + * Fixed files > 2Gb not working on fast ed2k links handler and ed2k app. + * Fixed file size for files larger then 2Gb displayed incorrectly + * Changed timeout of curl functions to 10 - fixes hangups when clicking server update without + internet conenction. + * We don't share 0 size files anymore. + * Fixed the crash on invalid socket using 5 different ways. The last one seems to be the most stable. + * Fixed several hangups on file completion. + * Fixed % and progressbar not being updated when changed on GUI Tweaks. + * Fixed comment packets. This was causing disconection from eMule clients (and crashing aMule clients) + * Fixed amule dissapearing because sent to systray when --disable-systray was used. + * Fixed memleak on search packet sent. + * Fixed memleak on KnownFile deletion + * Fixed memleak on search results received. + * Fixed memleak on comment packet received. + * Speeded up socket event handling. + * Cleaned server connection. No more 'inet connection might be down' - unless it's down ;) + * Faster PartFile processing. + * Fixed endian issue on PartFile loading. + * Fixed non-needed delete of an array on the notebook destructor. + * Doesn't allow an incoming packet to get processed if socket is deleting. + * Fixed double-highlight of servers if disconnected by the server. + * Speeded up hashing of the files a lot. This should fix the gui hangs at startup. + * Removed all old preferences code. That makes the app smaller, less memory used, and avoid some + unexpected bugs that arised on having 2 preferences implementation. Now New Prefs become Preferences. + * Fixed SysTray and gtk-files being compiled even when disabled on configure. + * Fixed several warnings. + * Fixed assert on Clear All (search) + * Make aMule compile on wxWidgets 2.5 (and CVS) version. + + Madcat: + + * win32 LaunchUrl() function + * Added amule-win32.HOWTO.txt + * Better win32 version of Hostname() function + + shakraw: + + * WebSocket.* & WebServer.*: now uses wxThreads and + wxSockets to be cross platform. + * Better threads' array remove in WebSocket + * WebServer cleanly stopped before exit + * Fixed multiple file download bug in webserver search section + * Fixed ed2k download link + * Fixed categories for web interface + + thepolish: + + * win32 stuff + + Unleashed: + + * Memleak fix + + Xaignar: + + * Amule no longer writes met files when priority is changed through the + auto-priority subsystem. Thus hd-writes are substancially reduced + depending on the number of files set to auto-priority. + * Fixed bug where text fields overlap each other (Disp. 4 & 5) + * Cleanup of amuleDlg.* + * aMule no longer displays a message about not being able to open the + file "lastversion" the first time it is run + * Changed the CTypedPtrList filelist in DownloadQueue.* to a std::deque, + with a speed-increase as a result + * Fixed the bug where the background of previously selected items in the + friendslist wouldn't be redrawn (Disp. 2) + * Fixed auto-priority. Priority would be set one tad too high, resulting + in the downloadlist failing to assign a name to the priority, thus + leaving empty fields. Also fixed displaying of priorty "Auto [Lo]" + in sharedfiles-list. (Tran. 3) + * Fixed the problem where "completed percent" of files that hadn't + transfered any bits yet would display a negative percentage (Disp. 8) + + + ** Special thanks to niet for his DNS service, bootstrap for his CVS service, stefanero & Citroklar for their + great help with a lot of stuff. + Thx also to all translators and the users for reporting bugs and testing aMule (feel free to report more) :) + As usual thx to eMule & wxWidgets devs and everyone i forgot ;) + + ** New translators: + + Supergirl: Croatian + rommel: Portuguese + sNeo: Italian (Napoletan) + + ** Follow the white rabbit and u'll find rc3 soon ;) + +-------------------------------------------------------------------------------------------------- + +Version 2.0.0-rc1 - The 'Mules and Rabbits love carrots' version. +------------- +2004-03-26 + + Kry: + * Implemented SecureIdent (SUI) (imported from eMule 0.30x) + This mean your credits will be lost on first run + There is no way to avoid that. Sorry :) Same happened with eMule. + * Send sources request for files added from search page first. + * Rewrote MuleNoteBook from gtk to a cross-platform implementation. + The code is already used by xMule too, so I guess they liked it. + * Fixed most of > 2Gb bug, except the dom's contibution you can scrolling down ;) + * Made the .part.met load/save 100% compatible with eMule. + * Fixed the Safe_Delete bug. Seems it arised when we made the app too fast ;) + * Random usable position of the server split. + * Added bluecow's fix for zlib compressed packets. + * Even safer .met saving + * Added preferences checkbox for new style / old style tabs on preferences + (vertical/horizontal) + * Checked for protocol limits on file size. + * Now client detail dialog show Secure Ident State + (Not Supported/BadGuy/Not Complete/Verified) + * Added itoa to the MFC layer + * Added SetLength to CFile (MFC compat layer) + * Fixed hangup on message sending. + * Moved Fast ED2K show to GUI tweaks + * Slugfiller's Secure Hash (imported from eMule 0.30x) + * Fixed GetTickCount code returning signed value + * Fixed GetTickCount code not initializing the vars. + * Moved the FILE* to CFile for furter compatibility of code. + * Added the first version run detection + * Removed some Yield() code that only slowed init. + * Simplified systray menu by only showing what needed. + Thanks to jadrian for the feature request. + * Grayed non-working Preferences options to avoid confusion and to + make the developer life easier selecting what to do ;) + * Fixed CTag new structure (imported from eMule 0.30x) + * Removed the mostly useless wizzard. + * Fixed the DoSwap crash on swapping A4AF sources. (hopefully) + * Fixed the log auto-scrolling up on messages window. + * Fixed the Upload bug that arised during endian changes. + * Added the Arabic, Chinese & Finnish compatibility on loading + * OpenBSD compatibility fixed + * Mac port 99% done, next version will be Mac compatible + Some final bugs to be fixed ;) + Fixed: + *) .met files loading/saving (except knownfiles.met) + *) .dat files loading/saving + *) 99% of the preferences bugs. + *) Compilation and linking. + *) Error popups relates to c_opaque colour. + * Starting sync with eMule 0.42 + * Speedups on Partfile Process nd DownloadQueue process. + * New 'server version' colum on server list window. + * MUCH safer packet handlig - avoids crashes on 99% of wrong tags. + * Fixed Dirs number on 'view shared'. Made aMule/eMule assert ;) + * Made download queue list refresh on a nicer way (much less glitches). + * Fixes an assert for invalid menu entry on right click queue popup. + * Mayor speedup on Highlight server (and thus on server connect/disconnect) + * Prevent removing the server we're connected at, either directly, on in a + list of servers to delete, or in removing all servers. Warn the user with a + message Box and then leave it non-deleted. Fixes crash. + * Fixed hangup on message sending + * New IPFilter code (reload & on/off) + * Added checkboxes on GUI Tweaks tab for download progress % + and Bar drawing. + * Fixed a severe memleak on the % showing and speeded it up. + * Save 5 sources on rare files (<20 sources) + * New SetFileSize code to avoid cpu usage. + * Removed the List Show/Hide and slider that made too much + problems on 1.2.6. Safer version (and better) will be on 2.0.0 final. + * Speedups on Hash thread. + * Safer corrupt detection on FAT partitions + I'm sorry if it rehashes every file on your system on restart, will be fixed. + * The file pause because of diskpace shows now on aMule logs + * Fixed BackUp file to REALLY backup instead of moving. + * Added code to check 0-size .part.met and load backup if needed. + * Fixed types.h and wintypes.h for proper Win32/Mac/linux compatibility. + * Added ECSocket code as common implementation for interaction between + different UIs (webserver, amulecmd, etc). + * Fixed intercomunication for little endian <-> big endian machines on ECSocket. + * Speedups on Endian Swap code & proper wxWindows way to detect it. + * Changed CArray to wxArray on most places for safety. + * Added configure code for detection of the crypto++ includes/libs + * Fixed buggy curl-config on Mac including -mi386. + * Removed useless files: TabCtrl.* + * Fixed several bugs, memleaks, warnings and one mem corruption + * Code cleanup + + Creteil: + * Added the client detail dialog item for Securehash + * Fixed sockets.cpp includes for non-debian systems ;) + * Added Arabic, Chinese & Finnish to languages in Preferences + + Hetfield: + * Configure now checks for crypto++ libs + * Added --with-crypto-prefix option to configure + * Possibile Fix to ListenSocket::Safe_Delete() seg fault + * Added ccache support to configure, no variables tricks needed + * Added --with-ccache-prefix option to configure + * deleted --enable-libcwd option from configure + * deleted useless libcwd debug files and code from whole project + + Madcat: + * Made Fast ED2K Links Handler optional + Something like the old Frankk's ED2K Links Handler patch. + * FakeCheck using donkeyfakes.gambri.net + Original idea and implementation by deltaHF. + * Clean(er) fix for splashscreen-creation compiler warning (unused variable + * Moved project/muuli.wdr to src/muuli.wdr + * ED2K-Links.HOWTO fix for some aMule/eMule error + * Added -ggdb -fno-inline to debug compilation flags + * Automatic category assignment for new downloads + * Updated AUTHORS file to reflect original eMule authors and give + credit to original Linux port author (Timo Kujala aka Tiku) + * Win32 port 99% operative, next version will be Win32 compatible + + Emilio Sandoz: + * complete re-write of preference handling to make it table-driven + in both file-I/O and dialog + * improvements in feedback given during dialog interaction + + pure_ascii: + * Added highlighting of the connected server in server list + * Enabled and fixed setting the server version + + shakraw: + * Some fixes on web interface file type search, and code cleaning + * Fixed amule crash when closing socket + * size_t seems to break Mac compilation - anyway uintt6 is enought for + messages + * Modified RseStringEncrypted. Now we encrypt passwd just (and only) + when changing them in prefs' dialog. So, now we use always encrypted + passwords, noone in clear neither in memory or disk + * Check if we're able to use TCP ports (lacks what todo if not but we + can accept EC. do nothing atm = EC disabled) + Added "AMULEDLG SHOW" to EC available commands + * WebServer now use the more correct _("") for localized strings + * Created WebInterface.{h,cpp} for the web interface, and + cleaned WebServer.{h,cpp} code + + neiro: + * Helped with OpenBSD port by providing a workbench + + Ganael Laplanche: + * FreeBSD port fixes + + PowerMike, hellimod: + * Helped a lot on future Mac port by giving ssh & vnc access + + deltaHF: + * New toolbar icons (thx to everaldo.com) + * Added & enabled chinese, danish and hungarian translation + * Preferences (added/changed): + IP-Filter reload and on/off buttons + securehash -> secure ident + media info + max connections: 25-7500 + upload queue: 500-1000 + max new connections / 5 sec: 5-500 + remove dead servers after: 1 > + tcp port: 80 > (for users with bad ISP's .. but remember -> running aMule as root is unsecure !!!) + add new files (dl & share) with auto priority: off by default now (if running aMule for the first time) + * Updated the header of all files + * Changed wxWindows to wxWidgets + * "Donated" amule-project.de + niet: + * Donated amule-project.net :-) + + bootstrap: + * CVS support + + Torsten SCHULZ: + * Added the % showing on progressbars. + + lemonfan: + * Modified network code for big-endian systems + * Fixed preferences bug + * Fixed copy ed2k link to clipboard + * Fixed CArray for MFC compatibility + * More rigid compatibility to MFC types + * Fixed misformatted strings and several warnings in WebServer.cpp + + Xaignar: + * Code cleanup in amule.* and otherfunctions.* and other files + * The Cleanup button in the File Details dialog no longer replaces "&" with "&&" + * Max connections should be correctly set on windows platforms, instead of defaulting to 500 + * Finished the CArray -> wxArray conversion + * Fixed ECSocket compilation with gcc < 3.3 + * Fixed segfault on close. + * Some other fixes + + Citroklar: + * External Connections are now only done when configuration tells us so (thanks to tonar from #amule) + * crypto++ detection fix + + aquatroll: + * Win32 compilation Support & Development. + + hellimod, PowerMike, godard, hoschy007: + * MacOSX compilation support + + dom: + * Found the last > 2GB bug ;) + + Special Thanks To: + + * All the bug-reporters, helpers, translators and users at http://forum.amule.org + + * eMule developers for their support. Long life to *Mule + + * FreshIRC & Freenode irc admins + + * People at #gentoo on freenode for their support, specially ferringb + + * The Testing Team: + thepolish, efe, Citroklar, bizzY, KamiKazeNH, and anyone testing aMule. + + * New translators: + + Chinese: nbfnw + Arabic: hathalsal + Finnish: eQualizer + Russian: Elf + Italian: GhePeU, sNeo + Portuguese (BR): KamiKazeNH + Korean: BlueSpring + Spanish: JonathanShields + Danish: nowlin + Hungarian: biger [HUN] + Galician: thorero + Hebrew: denisliber + + * All aMule users!!! + +--------------------------------------------------------------------------- + +Version 1.2.6 +------------- +2004-02-16 + + Kry: + * Improved Mac compatibility. + * Fixed the i18n charset. + * Try to set the locale even if it seems to fail. + + Creteil: + * Fixed the default Size to 800x600 for 1st time aMule launched without ~/.eMule config file. + + shakraw: + * ExternalConn: new communication code using wxSockets. + * Web interface: improved communication performance. + * Text interface: now using new wxSockets code. + + pil0t: + * Fix for the geometry on start. + + pure_ascii: + * Added sorting to filename list in file details. + * Added "Takeover" by doubleclick in file details. + * Fixed preferences window popping up on "Show/Hide UL/DL" in download list. + * i18n stuff (Systray). + + rubber30: + * Fixed viewing and sorting by LastSeenComplete and LastReception. + + Emilio Sandoz: + * Converted stats calculations to 64bit where necessary (for uptime >49days). + * i18n strings fixed. + * gcc 2.95 compilation fix. + + deltaHF: + * i18n stuff. + +--------------------------------------------------------------------------- + +Version 1.2.5 +------------- +2004-02-10 + + Hetfield: + * Fixed a memory leak in SysTray. (SysTray.cpp) + * Fixed a DL/UL ratio problem. (amule.cpp) + + Aleric: + * Fixed all compiler warnings. + * Rewrote all header #include's to only include what is necessary. + * Removed or renamed all functions that clashed with one of the + same name from libwx_gtk. With as result: + * Fixed --enable-static possibility (needs a lot of static + libraries to be installed; and latest XFree86 CVS version of libX11 + (I had to fix a bug in XFree86 too for this)). + * Fixed check-boxes in Preferences -> Directories + a little code + speed up there. + * Fixed a duplicated server_list delete + * Server IP# filter. + + Shakraw: + * Added missing string in GetDownloadFileInfo() causing SIGSEGV when + called. + * Fixed the amuleweb login problem. + * Added GetWebList() support. + * amuleweb's search feature complete. Now it is possible to search, + download and web-search on filedonkey + * Fixed a write error in SETMAXGRAPHUPLOADRATE + * Added support for statistic text infos for web interface (Statistics link) + * Fixed two bugged index causing crashes on Webserver.cpp + * Little improvement for server list request (now responses are much faster) + * Generally improved External Connections. + * Fixed search type feature for web interface + * Fixed amule crashes when quitting from amuleweb during requests + + umale: + * Fixed debugloglines on ListenSocket.cpp ServerSocket.cpp having too + much arguments. + * SysTray code will not be compiled if disabled + * Fixed 5 wrong delete -> delete[] + * Converted po-files + + Emilio Sandoz: + * Statistics graphs: + Param changes reversible; + Color change now works; + Active connections rescaling now works; + Graphs and tree suspended when not visible. + * Set correct initial radio button in Systray integration dialog + * Simplified statistics graph averaging + * Corrected UL loop for timer errors + * Simplified UL rate averaging + * Preliminary cleanup of graphing engine; ghosting eliminated + * Client DL rate computation without CList + Fixed 32bit rollover error for rates over 84kB/s + Reduced initial spiking + Generally improved speed and CPU/RAM usage. + * Search window column widths remembered between searches & saved in preferences + * Statistics preferences dialog: changes are now applied on-the-fly (with proper + Cancel semantics) + * Eliminated possibility of root directory being invisibly shared + + Kry: + * Added some sanity checks to avoid losing *.part.met files on + power failure. 0-Size files are never written. + * Fixed the 'all time transfered' on Shared Files window + This one fixed some eMule/aMule incompatibility on part.met files + * Some aditional functions on CFile for windoze compatibility + * MFC compatibility enhanced. + * Added SetFilePath to CKnownFile + * Changed most 'assert' to wxASSERT + * Fixed some NULL clientname causing crash on ListenSocket.cpp + * Fixed the tagcount on .part.met files (KnownFile.cpp) + * Added missing OP_CHANGE_CLIENT_ID on ListenSocket + * Updated HomePage to www.amule.org on messages + * Fixed the server windows splitter. Or sash. Whatever. + * Imported all the other ListenSocket.cpp code from 0.30e + * Fixed 'View Shared Files'. No multiple tabs, also. + * Added theApp.listensocket->StartListening() on startup. + Really. Don't ask me why it worked before. + * Fixed the systray bug where speed bar was always 10 times smaller. + * Added lots of vars initilization that fixed some crashes. + * Fixed a crash on ClientList.cpp caused by a void node on list. + * Fixed 9 memleaks, some of them big ones. + * Fixed 6 wrong delete -> delete[] + * Fixed wrong hashsetneeded causing random crash + * Added GetED2KPartHashCount() & GetED2KPartCount() + * Fixed a bug on app init, related to Toolbar. + * Fixed a severe crash & memory corruption on UploadClient.cpp + * Fixed download rate overhead calculation + * New HeapSort() and NewSrcPartsInfo() ported from eMule 0.30e + * wxGTK 2.5 compilation fixes + * Fixed the 'rehashing of files on restart' problem. + * Fixed a missing "Error" message on console when partfile loading failed. + * i18n activated, GNU xgettext compatible. + * Fixed bug on OP_REQUESTFILENAME packet that made eMule clients to disconnect + from us. eMule clients got our version of client and expected to get the + new OP_REQUESTFILENAME from eMule 0.30. Thanks to John & BlubbX from eMule + team for the report and help tracking down it. + * Fixed several i18n bugs from xMule times. + * Fixed the lseek error on console and window popup when canceling a file + that is transfering. + * First implementation of selectable refresh. The refresh is bugged - it + deletes the info on screen, except for about 1 sec, every time + seconds_defined_on_preferences is reached. + * Used selectable refresh code for SysTray-hiden cpu lower. + * New option on right-click on downloadlist: Hide/Show lists. + * Minimize on startup works now. + * Minimize to tray works now. + * Lots of BSD compilation fixed (aMule compiles under BSD again) + * Fixed the upload disconecting clients at high upload speed + * Changed another wxList to CList (FriendList) + * FriendSlot should have no effect on LowId user. + * Fixed FriendSlot not being persistent and kicking friend after 1 chunk. + * Fixed lowid users on upload queue by importing VQB's lowid alternate + * Added language selection support on preferences + * Fixed the bug that caused never to tell user 'server full' + * Fixed several server connection issues not detected before. + * Added a popup on language change warning for restart. + * Added another popup, this time to point the user on the right direction + if the locale for that language cannot be set. + * Stop publishing on ED2K network shared files we don't have anymore + * Removed the annoying messages of dropping sources (too much CPU) + * Sanity check to avoid user pushing buttons before aMule is ready for it. + + thermoman: + * Made aMule gcc 2.95 compatible + + seneca: + * Near finished all i18n stuff. We expect aMule 1.2.5 is fully i18n-compatible + * Added wxT() Macro for Unicode Support (not functional yet) + + Citroklar: + * Testing, lots of testing. Bug-tracker. + * Found the versions that introduced the upload bug and made a nice diff. + We could look at code for years, without seeing it. Nice guy. + * Fixed README, amulesig.txt. + + gjn: + * Fixed bug in creditsystem. + + jmccorm: + * Fixed "Close This Searchresult" -> "Close This Search Result" + * Fixed some typos. + + lemonfan: + * Fixed stopped files being counted on CheckDiskSpace() + * Progressbar fixes on webserver implementation. + * Several crashes fixed by adding sanity checks to reqfile + + deltastar (on irc channel): + * Fixes the > 2Gb files problem caused by a bug on CFile wrapper. + + deltaHF: + * i18n stuff + + pure_ascii: + * fixed recreation of filename list in file details + * scrolling and selecting filenames works now + + hellimod: + * BSD and Mac support. We're very near to the Mac aMule. + + niet: + * Donated www.amule.org! + + Creteil: + * Change order in the notebook for logs in Servers Window + * Updated the logo for webserver from eMule logo to aMule one + * Fixed Switching to Searches Window Bug when removing all servers + in Servers Window + * Changed default server list from 'best' to 'max', then 'max' to 'best' again + * Fixed the default systray value on preferences. + * Added debug values on UploadQueue. + * Changed max Slot Allocation to 30Kb/s + * Fixed typo in Preferences + * Implemented notebook in Server Window + (merged 'Server Info' & 'aMule Log' windows in a notebook) + * Fixed bug crashing aMule on Server Window Notebook implementation. + * Now, if no --geometry width & size used, aMule starts with 800x600 as default + * Fixed size restoring from .eMule saved size + * Option 'Search global' in Search Window in the default now. + * GUI code for new slider in Preferences->Tweaks tab handling the lists refresh + * Some cosmetic fixes on Preferences and GUI by Madcat's request. + * Made GUI i18n compliant. + * Slot alloc calculation is properly rounded now. + * Added the Language listbox on preferences. + + special thx to: + + * Our translators: + + german: emperor, hariolf, crazeee, neolino (M$ user), deltaHF + italian: ilbuio, AnonimoVeneziano + spanish: mad_soft, aquatroll, Kry + russian: Vl@dCoR + bulgarian: tindor + dutch: Supersnail + polish: Ogon + lithuanian: Fatalissimo + french: SlayeruleZ, thepolish + catalan: pukyxd + portuguese: willy, coolzero + basque: piarres + galego: thorero + + * The people at #wxwindows, irc.freenode.net for being so helpful + Specially BrianHV, raboof and ajjl. + + * All eMule devs for being so nice and work close with aMule team now. + + * Madcat, from Sharedaemon team (sharedaemon.sf.net) for his support + and friendship. + + * All aMule users!!! + +--------------------------------------------------------------------------- + +Version 1.2.4 +------------- +2004-01-10 + +(Previously released, with some errors, as 1.2.3-1) + + Aleric, Kry: + * Fixed the 'Completing file' bug. + +--------------------------------------------------------------------------- + +Version 1.2.3 +------------- +2003-12-31 + +The "Happy New Year!" version. + + Kry: + * New ProcessLocalRequest ported from eMule 0.30e. + * Fixed crash on DownloadQueue caused by a CString being passed + through "...". + * Nice CPU usage drop with new GetSourcesCount code. + * Some little speed optimizations here and there. + * Fixed bug on second mule starting. + Now amule also spawns two servers for external connection, one + local and one TCP (optional). + * Added gsocket-2.5.* from wxGTK2.5's gsocket files. + This files are patched to fix LOWID. + * Added EC REQ for total upload for a file, by deltaHF's request. + It uses CPU, so it can be enabled with --enable-releasegrp + * Several TextClient improvements / cleanings / cosmetics + * Fixed a strdup being used instead of nstrdup (with Aleric) + * Fixed anoying DiskSpace Bug (tm) + Now files paused because there's no space left are resumed as soon + as we have diskspace again. + * Got rid of the chmod stuff on fat32 partitions. + aMule detect the filesystem the temp/incoming folders are mounted on. + * Fixed column hiding on all lists + * New configure option: --with-curl-prefix + Also fixed CURL_LIBS and CURL_FLAGS to be passed to compiler/linker + * Weird I18N bugs fixed (labels, etc) + * Cleanups and code cleaning on + ServerSocket.cpp DownloadQueue.cpp PartFile.cpp + * Fixed compiler warnings on: + TextClient.cpp PartFile.cpp + + pure_ascii: + * More docs/ cleaning. + + Hetfield: + * Patched Process() function in Partfile class to reduce cpu + load. + * Added new optimization to Tray to stop window updating when minimized. + + Shakraw: + * Added commands to use with amuleweb to EC. + * Completed Transfer feature and Started Search. + * Added SharedFiles, Statistics, Graphs and Prefs features. + * Cleaned webserver code from amule sources. + * Imported emule0.30d webserver code. + * New web template & images from eMule 0.30d. + * New binaries: amuleweb and amulewebDLG. + This binaries are used for webserver. + * Webserver runs now over EC, and has a separate app to serve web. + + umale: + * Fixed storing pointer on 64-bit archs + * Fixed resolving of broadcast IPs. + * Changed trunc() to explicit casting. + + Creteil: + * Re-imported new code to handle 'CheckDiskspace'. + * Changed labels in Statistics to stick on stats patch from Emilio + Sandoz. + * Synched some code on : + DownloadClient.cpp + ListenSocket.cpp + UploadClient.cpp + with eMule 0.30e. + * Cosmetics & Indentation. + + deltaHF: + * Added new function - PowerShare. Release your vacation movies + now ;-). + + Aleric: + * autogen.sh revamp. + * Global "sys.h" inclusion policy. + * --enable-libcwd configure option: Use libcwd. + * Makefile.am (SUBDIRS): Include intl and correct order. + * configure.in + (AM_MAINTAINER_MODE): Add. + (AC_CONFIG_FILES) : Add intl/Makefile. + Add --enable-static. + * configure.in (EXPORT_DYN_FLAGS): Removed. + * All files (when appropriate): Removed #pragma interface + implementation. + * Koenig lookup fix for g++ 3.4 on mfc.h's CQArray::QuickSort + * Fix of compiler errors on ExternalConn.cpp + * dos2unix several files. + * Added GPL license header where needed. + * Compile fixes for FreeBSD on systray and gsocket* + + Emilio Sandoz: + * Patched stats for acurate resizing / scale. + * Fix for inflated UL/DL rates in Transfer and Statistics windows + * Debug code for UL/DL rate measurement in UploadQueue.cpp + (activate with '#define MEASURE_LOST_CYCLES 1') + + Seneca: + * I18N: + ListenSocket.cpp PartFile.cpp ServerList.cpp + ServerSocket.cpp SharedFileList.cpp sockets.cpp + WebServer.cpp PartFile.cpp UploadClient.cpp + ClientCredits.cpp ClientUDPSocket.cpp. + +--------------------------------------------------------------------------- + +Version 1.2.2 +------------- + + Phantom version. Expected to be released on 21/22 dec, delayed and then made + into 1.2.3 version. + +--------------------------------------------------------------------------- + +Version 1.2.1 +------------- +2003-12-14 + + Kry: + * Now amule shows icon on taskbar and main window + * amulecmd now compiles under win32 using dialogs to get + port, hostname and password. + * Added clientversion on download list. + * Modified configure script and makefiles for faster + compilation and smaller binaries. + * Fixed nasty download list bug due to memory corruption + inside CUpDownClient class vars. + * Imported new acurate download speed calculation from eMule + 0.30d. + * Moved docs to doc/ folder. + * Imported new GetNextRequestedBlock algorythm from eMule + 0.30d. + * Ed2k links with hostname sources on it are processed + now, and on a separate thread. + * Showing filename on CheckDiskSpace debug statement. + * Imported eMule's 0.30d SortByPriority to complete + CheckDiskSpace import. + * Several addings to mfc.h file (MS MFC compatibility + layer). + * We forgot to show A4AF sources on download list. Fixed now + (eMule style, x/y+z (t)). + * New packet receiving handling should avoid high_dlspeed-> + high_cpu. It also makes download more stable and faster. + * Modified autogen.sh script to notify users that automake < + 1.7 is NOT supported. + * Imported CanAddSource(), AddSources(), IsGoodIP() and + IsGoodIPPort() from 0.30d (new sources handling). + * Added plain password support to amulecmd. + * Updated amulecmd passwords to use MD5. + * New External Connection stuff to handle amulecmd & other + remotes (alpha). + * Fixed some code causing strange errors when trying to + connect to servers. + * Imported new network UDP features from eMule 0.30d, we + process Search results and Found sources correctly now on + 16.40 behaviour. + * Fixed lowid on restart introduced by himself on 1.2.0 ;). + * Code cleaning & optimising. + + pure_ascii: + * Fixed segfault on call of CEMSocket::DisableDownloadLimit() + from client if there is no socket. + * Fixed bug on mfc.h's CList. + * Added zlib fixes from eMule 0.30e code. + + Hetfield: + * Added new server list fetching via libcurl libs and wxThread, + thus removing wget usage from amule. + * Modified configure to check libcurl presence. + * Changed thread file completion from pthread to wxThread. + + falso: + * Several i18n stuff. We're more close to get i18n working. + + umale: + * Patch for x86_64 arch. (GetTickCount) + + spiralvoice: + * Found wrong ET_COMPATIBLECLIENT on aMule. Now we identify + correctly as emule compatible client. + * Also did MLdonkey patch for recognising amule as new client + brand. + + Unleashed: + * Typo and cosmetic changes on configure script + * Cleaned and optimised several files. + + Creteil: + * Imported 'Copy ED2k link to clipboard (Source)' from + eMule, this one permit to send an ed2k link with our ip + address as source for the link. + * Imported 'Copy ED2k link to clipboard (Hostname)' from + eMule, this one permit to send an ed2k link with our + hostname as source for the link. + * Fixed handling of bad ET_COMPATABLECLIENT for buggy aMules + clients (buggy are 1.1.1 - 1.2.0). + * Lot of code cleaning / indenting. + * Fixed clientversion on download list implemented by Kry. + * Added new mini icon for aMule clients in downloadlist, + uploadlist & uploadclient. + * Defined 'deletethis' as 'bool' in ListenSocket.h. + * Fixed typo on Statistics window. + * Imported CheckDiskspace() from eMule 0.30c. + * Imported eMule's 0.30c A4AF (now more handled by Razor). + * Imported new file rating management from eMule 0.30c. + * Modified BaseClient.cpp to sync better with eMule 0.30c + (added m_fSharedDirectories flag to stick with eMule + code). + * Fixed bug on CPartFile::IsAlreadyRequested(). + * Added new mini icon handling in downloadlist/uploadlist + for aMule clients. + * Fixed bug in uploadlist. + +--------------------------------------------------------------------------- + +Version 1.2.0 +------------- +2003-11-26 + + Kry: + * Some memleaks fixed (Thanks to xMule team) + * Removed no-needed break statement + * Added '--help' option to amule. + * Fixed (probably) all m_abyPartStatus related bugs (~CUpdownClient related) + * Imported ResetFileStatusInfo() (minor import) + * Fixed the bug that made files >2.4Gb get sorted as if size < 0 bytes + * Fixed the search types bug. + * Fixed Small Files bug. + Thanks to Citroklar for his research on this one. + He tested all versions to find when did the bug enter amule. + * Added new hashshet handling for sources. + * Added new timeout handling for sources. + * Finished porting of NewSrcPartsInfo started by Creteil + * New standalone app: amulecmd. + * gsocket.c no longer gets compiled if wx version >=2.5 + * Added --disable-amulecmd to configure + * Added check on configure for wxbase (needed for amulecmd) + + Hetfield: + * Added --safe-systray to configure + * Added --disable-systray to configure + * Much better configure script output. + + Ganael LAPLANCHE: + * Kinnda good guy. Fixed BSD compilation and also did BSD packages. + + eagle: + * Added --geometry option + + pure_ascii: + * Fixed a bug on ListenSocket.cpp that crashed amule. + + Creteil: + * Updated ServerSocket.cpp for bOutputMessage we always send even on error ... + * Fixed all 'return statements' in all Lists + * Set minimum refresh for stats tree slider to 5 seconds + * Fixed several CVS crashes due to indentation & porting bugs. + * Fixed downloadlist expand crash. + * Connect 'Verbose (additional program feedback)' CheckBox to some debug in log window and logfile + * Fixed bug in ServerList Window when changing priority + * Added preferences box for KeepAlive time. + * Imported code from eMule 0.30 + GetMaxFilesPerUDPServerPacket() SendGlobGetSourcesUDPPacket() + GetSoftFiles() SetSoftFiles() GetHardFiles() SetHardFiles() + SetVersion() DbgGetFileInfo() + +--------------------------------------------------------------------------- + +Version 1.1.2 +------------- +2003-11-04 + + Kry: + * Ok, REALLY fixed the 'no sources' bug. + * Added the KeepConnectionAlive function (This one is + recomended by lugdunummaster himself). + * Some more memleaks fixed. + * Now aMule compiles under wxGTK2.5 + +--------------------------------------------------------------------------- + +Version 1.1.1b +-------------- +2003-11-03 + + Kry: + * * Fixed severes memleaks. + +--------------------------------------------------------------------------- + +Version 1.1.1a +-------------- +2003-11-03 + + Kry: + * Fixed annoying bug about no sources can be find. + + Creteil: + * Fixed another assert statement causing crash. + +--------------------------------------------------------------------------- + +Version 1.1.1 +------------- +2003-11-01 + + Kry: + * Added zlib support. + * No more need to launch aMule with params for localized + users we force the english language in the prog now + (credits go to Eru). + * Fixed minor network bugs. + * Added SERVER_NET_DEBUG and NET_DEBUG mesages. + * Fixed TCP packet not being consumed if not readed. + + Olonho: + * Fixes to search dialog and download menu. + + Creteil: + * Added new toolbar icons made by deltaHF. + * Added new clients icons made by deltaHF. + * Reverted default minimum upload slots = 3, now slot + allocation take effect if max upload >= 10kB/s. + * Fixes bad code branch escaping in Shared Files Window. + * Shared Files Window, Priority & Permissions in righ mouse + click working like expected now. + * Mass Code Cleaning (no more compilation of wx/xrc shit we + don't use anymore), my old binarie = 2.9Mb the new one + = 2.5Mb. + +--------------------------------------------------------------------------- + +Version 1.1.0 (Kry special edition). +------------------------------------ +2003-10-21 + + Kry: + * Fixed UDP packet not being consumed when reading sources + if file status = stopped. + * Added lugdunum 16.40 sources Handling (you get more + sources now). + * Added lugdunum 16.40 extended server messages (we receive + full message now). + * Initial import of Messaging sytem core. Credits go to Tiku. + + Creteil: + * Fixed a bug introduced in 1.0.9 in Preferences Connection + Tab. + * Fixed aMule banned aMule client :-) (aMule seem to be too + much aggressive) (Creteil). + * Relooked all main windows. + * Initial import of Messaging sytem GUI. Credits go to Tiku. + +--------------------------------------------------------------------------- + +Version 1.0.9 +------------- +2003-10-17 + + - Fixes : + + * olonho various fixes (added gsocket.c, inited variable, fixed + Valgrind error, removed buggy debug print, fixed SIG_PIPE in + better way, fixed valgrind warnings). + * Fixed icons used to reflect status in download list. + + - New Features : + + * New Preferences with old implementation (this mean we dont have + already the WebServer and Gui Tweak Tabs). + * Slot Allocation in Connection Preferences Tab (you can now set the + bandwith per client in upload list). + + - Info : + + * I'm working hard on the rewrite of preferences, don't expect many + changes during this time ... + +--------------------------------------------------------------------------- + +Version 1.0.8 +------------- +2003-10-10 + + - Fixes : + + * Fixed bugs in "EMSocket.cpp" causing crash. + + - New Features : + + * Good news !!! Hetfield have contributed to aMule with the new + systray integration ... + + Like emule one : + + Let you set Download & Upload speed. + Shows speed. + Let you iconify and hide aMule. + Shows your infos like ip, hash, server, GB, etc ... + Let you disconnect and reconnect. + + - Need to be Fixed : + + * Localization Languages are broken for the moment (i'm thinking about + removing totally this functionnality). + + - Info : + + * I'm working hard on the rewrite of preferences, don't expect many + changes during this time ... + +--------------------------------------------------------------------------- + +Version 1.0.7 +------------- +2003-10-03 + + - Fixes : + + * Fix the annoying message when searching "Client too old ...". + * Fix compilation a compilation bug introduced in 1.0.6. + * Move the code to put the toolbar in the gui file (no more designed + by hand gui code for this part). + + - Code Cleaning : + + * Changed the Connection Wizard with SpinCtrl in place of the + TextCtrl to handle values of line capacities (no more atoi + converssion since we use already int return from SpinCtrl). + + - Need to be Fixed : + + * Localization Languages are broken for the moment, don't panic it's + just temporary ... (i'm thinking about removing totally this + functionnality). + +--------------------------------------------------------------------------- + +Version 1.0.6 +------------- +2003-09-24 + + - Fixes : + + * Just somes fixes. + + - New Functionnalities : + + * ed2k servers handler : by Emanuel Wontorra + + - Need to be Fixed : + + * Localization Languages are broken for the moment, don't panic it's + just temporary .. + +--------------------------------------------------------------------------- + +Version 1.0.5 +------------- +2003-09-15 + + - Gui changes : + + * Import from eMule 0.27a: "Obtained Parts" bar in the shared files + list. + + - Fixes : + + * Synced aMule with xMule latest fixes. + It's a Malware non direct contribution :-) ... + + - New Functionnalities : + + * Import from eMule: Request of shared files by directory. + * Import from eMule 0.27a: Up-/download auto-priority. + + - Code cleanup : + + * Mass code removing for none working sections ... + + - Need to be Fixed : + + * Localization Languages are broken for the moment, don't panic it's + just temporary .. + +--------------------------------------------------------------------------- + +Version 1.0.4 +------------- +2003-09-14 + + - Gui changes : + + * MASS GUI changes (look in Transfer Window), removed the fucking + unusable Messages Window and moved the Friend stuff from these to + a new alligned left wxListCtrl ... Enjoy !!! + * Now i report only Client name in Sources column of Transfert + Window (use right mouse click to see Details of the client as + usual). + + - Fixes : + + * Synced aMule with xMule latest fixes (Fix various minor problems + as found by valgrind and electric-fence & Fix a bug with the + client credits map: It is not possible to convert the map key...). + It's a Malware non direct contribution :-) ... + + - Code cleanup : + + * Mass code removing for none working sections ... + + - Need to be Fixed : + + * Localization Languages are broken for the moment, don't panic it's + just temporary .. + +--------------------------------------------------------------------------- + +Version 1.0.3 +------------- +2003-09-08 + + - Gui changes : + + * Changed 'Edit Category Properties' dialog. + + - Fixes : + + * Fixed comments count in 'File Comments' dialog. + * Fixed bug introduced in 1.0.2 (can't call comments in File + Details). + + - Code cleanup : + + * Removed mmMultiButton from source (no more used). + +--------------------------------------------------------------------------- + +Version 1.0.2 +------------- +2003-09-03 + + - Gui changes : + + * Changed Show all comments dialog. + + - Fixes : + + * Synced aMule with xMule latest fixes (Imported source exchange v2 + from eMule, Possible fix for some problems while ending the + program). + +--------------------------------------------------------------------------- + +Version 1.0.1 +------------- +2003-09-29 + + - Gui changes : + + * Changed Client Details & File Details Dialog (auto resizing of all + fields). + + - Fixes : + + * Synched aMule with xMule latest fixes. + +--------------------------------------------------------------------------- + +Version 1.0.0 +------------- +2003-08-25 + +!!! Initial Launch of aMule !!! + + - Gui changes : + + * Changed Main Servers Window (changed position of functionnalities, + now, to update serverlist from url, click on the serverlist icon, + all others field are descriptive by herself). + * Changed Main Search Windows (removed not connected functions and + Direct Download), all GUI stuff of this window come in + muuli_wdr.cpp & muuli_wdr.h. + * Fixed behaviors of buttons in Main Search Window. + * Added Fast ED2K Links Handler (Direct Download) with same + functionnality as the original Direct Download of xMule Search + Main Window but followin all main windows (i hate to have to + switch to Search Main Window to be able to send a ED2K Link ... + + + Nothing more i can remind ;-) + +--------------------------------------------------------------------------- + +malware's contributions: + * Speed up the initial sharing by making KnowFileList a hash map. + * Remove the assign to category context menu entry only if it was + already there. + * Reimplemented hashing thread. + * Removed unused locks. As the NetBSD team pointed out they are + causing problems on their system because it does core dump on + unlocking a mutex that was not locked. + * Made the title for systray the same as for the main dialog. + * Never share a file twice. + * Fixed endless loop in sending UDP packets. + * Fixed a possibly exploitable bug as noticed by S. Esser from e-matters. + * Fixed new downloads assigned to random category. + * Check size of OP_SERVERSTATUS packet more strictly. + * Do not display the unit for file size twice in shared file list web page. + +Un-Thesis' contributions: + * Added more support for Solaris, thanks to wimms. + * Corrected various Linux-specific #ifdefs. + * Fixed the bug that kept auto-backtrace from occuring in Linux. + +NetBSD team's contributions: + * Fixed bug with the mutex protecting calls to gethostbyname. + * Try to increase some resource limitation to the permitted maximum. + +sepahewe's contributions: + * Fix images in transfer list web page. + +Version 1.5.6 +------------- +2003/08/01 + +Highlights: + * Fixes for a great many bugs that cropped up from 1.5.2 to 1.5.5. + +malware's contributions: + * Added simple workaround in case CClientUDPSocket::OnSend is called + recursivly. + * Do not share the global incoming directory twice. + * Fixed wrong tag count written to part.met files. + * Various xmule signature changes as requested by BigBob. + * Fixed statistics color saving/loading. + * Decode %-escaped characters in URL within the ed2k application as + suggested by __JusSx__. + * Removed two trouble-maker member variables used in the search. + * Catch invalid/strange packets before they can cause harm. This + does also affect parts of network packets stored in *.met files. + * No longer throw out clients sending packets larger than needed. + * Fixed invalid messages "You already have...", caused by comparing + a hash over the File-ID rather than the ID itself. + * Cleaned up the nstrdup() mess. + * When finishing download share the file in the incoming directory + of the category it does belong to. + * Removed various possible format string exploits. + * Make it possible to delete the last user-defined category. + +MikaelB's contributions: + * Optimized anti-hash thief. + * Test for invalide eMule clients and irregular eDonkey clients. + * Anti-leechers test - Mison-like clients are automatically detected. + * Special icon in Upload List/Queue for invalid clients. + * Ban spammer clients ( Mison and others ). + +Un-Thesis' contributions: + * Upgraded XRC library to latest wx release. + * Converted internal XPMs to PNGs and JPEGs. + * Fixed a few Intel C++ compiler warnings. + * Re-organized the ChangeLog system. + * Made sure Italian and Korean translations were included in release. + +Madcat's contributions: + * Fixed crash in ClientDetailDialog. + * Fixed Directory Tree displaying. + * Fixed crash when attempting to delete noexistent TreeCtrl items. + +BigBob's contributions: + * Cosemtic GUI change - the IRC button is gone + * Make the status line resizing the areas to fit the text into. + +bothie's contributions: + * Actually send the MOD info with the MuleInfo packet. + +FooMan's contributions: + * Fix for failing file access during download completion. + +DongCheon Park's contributions: + * Updated the Korean translation files for new features. + +Version 1.5.5 +------------- +2003/07/11 + +Madcat's contributions: + * Column widths are now saved (got broken in 1.5.4). + * Possible fix for column hiding in Transfer tab (got broken in 1.5.3). + * Abort flushing and pause file if less than 9.28MB free disk space left. + * Abort part.met file writing if less than 5000 bytes free disk space. + * Code cleanup: Removed large amount of unused variables, #if 0'ed blocks, + indented several files and changed EOL to UNIX style in most. + * Online signature is now cleared on shutdown. + * Category incoming directories are now automatically shared. + * Automatic sources dropping at user-defined interval. + +MikaelB's contributions: + * Fixed a window increasing size problem at startup + * Fixed the '$' appearing in Cancel button in Categorie dialog + * Added timer in Sources Dropping tab + +plobb's contributions: + * Hotranking: Sources with QR: <5 ignore MaxNewConPer5Sec value. + +Version 1.5.4 +------------- +2003/07/05 + +Madcat's contributions: + * Lists are no longer redrawn when they are not shown. + NOTE: This reduces CPU usage SIGNIFICENTLY (for better effect, + stay off Transfer tab when running on background. + * Possible fix for gcc 2.95 compliation problems (DownloadListCtrl.cpp) + * Possible fix for BSD compatibility problems with configure. + * Possible fix for eMule 29a compatibility problems in met files. + * Reverted to old sources handling. New engine was way too aggressive. + +MikaelB's contributions: + * Possible fix for main toolbar display bug. + * Possible fix for sash position loading problems after new compilation. + +Version 1.5.3 +------------- +2003/07/02 + +Highlights: + * Categories implemented + * Much better No Needed/High Queue Ranking sources handling + * Shared files loading made 30x faster. + +Madcat's contributions: + * Possible fix for AppVersion value in .eMule file. + * Possible fix for statistics colours saving problems. + * Possible fix for shared files loading. Loading is MUCH faster now. + * Possible fix for crash if Hello Packet had tagcount 0. Strangely, + this only happened randomly after closing movie preview. + * Possible fix for endless loop when UDP packet sending fails. + * Imported categories from LMule CVS (written by Tiku). + * Category functions now apply to selected category only. + * Added confirmation message when cancelling all files in a category. + * Category setting is now saved. + * Much better HQR/NNS handling. Those two are now dropped automatically as they connect. + * Fixed New MLDonkey compatibility (Been broken since 1.4.1) + +MikaelB's contributions: + * Fixed bug in File Comments dialog ( nothing displayed ) + * Save sash position of splitter in transfer window at exit + * Fixed a bug in Sources Dropping Preferences window + * HQR Value is know set between 300 and 3000 + * Fixed Dropping Sources Preferences saving bug (there were saved into + WebServer section in .eMule file) + * Changed Dropping Sources tab in Preferences window + * Better handling for NNS + User can now choose to: + * Automatically drop file + * Try to send it to an other file + * Default HQR value changed to 1200 + +Kry's contributions: + * First Main category filters attempt to work. + * Downloads are now filtered from or added to shown list if status changes + after filter apply. + * Main category tab should be showing Filter name as tab name. Fixed. + * Added several more filters: Video, Audio, Image, Text, CDImage, Archive. + * Filters Apply now to all categories. + * Stopped files now have Stopped status instead of Paused. + * Colors for categories on download list were reversed from those the user + selected. Fixed. + * Added xMule Uptime to statistics tree. + * Possible fix for multiple PopUp menus on categories tab right-click. + * Shared files should be reloaded when closing preferences only if + folders changed. + +Tiku's contributions: + * Implemented Download list Categories. + +Malware's contributions: + * Possible fix for various exception handling bugs. + * Possible fix for the remaining of search page crashes. + +Balu's contributions: + * Updated spanish translation. + +Version 1.5.2 +------------- +2003-06-22 + +Madcat's contributions: + * Imported all features in Razor 1a Beta 1 mod. + * Imported most of the features in Lagloose mod v0.1a + +MikaelB's contributions: ( thanks to eMule Sivka mod ) + * Added support for 'Swap every A4AF to this file now'. + * Added support for 'Swap every A4AF to this file AUTO'. + * Added support for 'Swap every A4AF to any other file now'. + * Added support for 'Drop No Needed Sources now'. + * Added support for 'Drop Full Queue Sources now'. + * Added support for 'Drop High Queue Rating Sources now'. + * Added support for 'Clean Up Sources now ( Drop NNS, FQS and HQRS now)'. + * Added Sources Dropping Preferences Tab (not functional yet). + * Possible fix for saving main window position and size. + * Initial support for Auto Drop NNS, FQS and HQRS (not functional yet). + * Initial support for Dynamic Upload (not functional yet). + +Lagloose's contributions: + * Shift+Doubleclick in downloadlist only shows transferring sources. + * Increased font size for the axis in statistics. + * More Information on uploading clients in upload window. + + +Version 1.5.1 +------------- +2003-06-11 + +Un-Thesis' contributions: + * Possible fix for bad return statements in ClientUDPSocket and BaseClient. + * Reverted to old code for several bad fixes in 1.5.0. + +Kry's contributions: + * Made ./xmule statistics more readable. + * Possible fix for download limit being higher than capacity. + * Added a notification message in case second xMule is started. + * Possible fix for --version commandline argument. + +Version 1.5.0 +------------- +2003-06-08 + +Madcat's contributions: + * Sockets are also closed on crash now. + * Revised Search Result packet handling, shouldn't crash/memleak there + anymore. + * Removed annoying MAX_RESULTS check from search tab. + * Added log line when ipfilter is loaded. + * Possible fix for various crashes regarding Shared Files Reloading. + * Possible fix for several Search Tab Closing/Global Search related crashes. + * Possible fix for several eMule/xMule typos. + * Possible fix for potential endless loop if UDP packet sending failed. + * Possible fix for potential endless loop/memleak at ProcessMuleInfoPacket(). + * Possible fix for CPU leak in ProcessHelloPacket(). + * Possible fix for endless loop at CPartFile::FlushBuffer(). + * Possible fix for gsocket.c compilation problems with older compilers. + +Un-Thesis' contributions: + * Possible fix for GTK-only XPM compatibillity problems. + * Possible fix for GetTickCount compilation errors. + * Possible fix for LOWID problems (AGAIN!). + * Removed pure GTK code from GetColour. + +MikaelB's contributions: + * Possible fix for toolbar sizing with i18n + +Version 1.3.1 +------------- +2003-05-16 + +Madcat's contributions: + * FIXED: 'All Columns Hidden on First Start-Up' bug. + * FIXED: Systray integration setting saving. + * FIXED: Start webserver only if it's enabled in preferences. + * FIXED: Shared files Re-Loading. + * FIXED: Shutdown seg-fault. + +ArCePi's contributions: + * Updated spanish translation. + +Shuttle's contributions: + * Added Italian translation + +Version 1.3.0 +------------- +2003-05-15 + +* Changed the release organization of xmule + * Stable releases have even middle numbers (ex: 1.2.1 is stable) + * Unstable releases have odd middle numbers (ex: 1.3.0 is unstable) + +Pure_Ascii's contributions: + * FIXED: Last part always being corrupt problems. + * FIXED: FreeBSD 5.x compatibility problems. + * Started port to MacOS X. + +Un-Thesis' contributions: + * FIXED: Implemented McCabe's and arkanses' LOWID on restart fix. + * FIXED: Several major Mem and CPU leaks + * FIXED: Application termination improved. + * FIXED: Removed & symbols from the main toolbar. + * Added new MakeNG system, see README.makeng. + * Added --version command line option. + * Ported xMule 28b Partfile. + * Added framework for more robust command line control. + +Madcat's contributions: + * FIXED: Major Memory leak caused by NOT flushing files. + * FIXED: Toolbar sizing if texts are too long. + * All lists are now sorted on startup. + * Preview now defaults to mplayer if none set. + +Tiku's contributions: + * Added initial code for Webserver, not currently functional. + * Further synchronized statistics windows with xmule. + +Gib[S]On's contributions: + * Added list counters for Servers, Transfer and SharedFiles windows. + +Ender's contributions: + * Opera 7.1 info to ED2K-Links.HOWTO + +------------- diff --git a/docs/Doxyfile b/docs/Doxyfile new file mode 100644 index 00000000..89deca27 --- /dev/null +++ b/docs/Doxyfile @@ -0,0 +1,1098 @@ +# Doxyfile 1.3.5 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = aMule + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 2.2.0 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = docs + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, +# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en +# (Japanese with English messages), Korean, Norwegian, Polish, Portuguese, +# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = NO + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. It is allowed to use relative paths in the argument list. + +STRIP_FROM_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = YES + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = src + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = src/muuli_wdr.h src/muuli_wdr.cpp src/CryptoPP.h src/CryptoPP.cpp src/utils + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::addtions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::addtions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/docs/EC_Protocol.txt b/docs/EC_Protocol.txt new file mode 100644 index 00000000..ee88ad27 --- /dev/null +++ b/docs/EC_Protocol.txt @@ -0,0 +1,336 @@ + + aMule + - follow the white rabbit - + + + External Connections + Protocol + + version 2.0 + +Preface +------- + + EC is under heavy construction, however the protocol itself is considered + stable and you can rely on. The opcodes and tagnames, tag content formats + and values are still changing, so if you decide to implement an application + using aMule EC, you'd better include our ECcodes.h for the values, and + check the documentations often, or even the code itself (ExternalConn.cpp + is a good start). + + + +Section 1: Protocol definition +------------------------------ + +Short description: + + EC protocol consist of two layers: a low-level transmission layer, and + a high level application layer. + + +Section 1.1: Transmission layer +------------------------------- + + The transmission layer is completely independent of the application layer, + and holds only transport-related information. + + The transmission layer actually consists of an uint32 number, referenced + below as flags, which describes flags for the current transmission session + (send/receive operation). + + This four-byte value is the only one in the whole protocol, that is + transmitted LSB first, and zero bytes omitted (therefore an empty + transmission flags value is sent as 0x20, not 0x20 0x0 0x0 0x0). + + Bit description: + + bit 0: Compression flag. When set, zlib compression is applied to + the application layer's data. + + bit 1: Compressed numbers. When set (presumably on small packets + that doesn't worth compressing by zlib), all the numbers used + in the protocol are encoded as a wide char converted to utf-8 + to let some zero bytes not to be sent over the network. + + bit 2: Has ID. When this flag is set, an uint32 number follows the + flags, which is the ID of this packet. The response to this + packet also has to have this ID. The only requirement for the + ID value is that they should be unique in one session (or at + least do not repeat for a reasonably long time.) + + bit 3: Reserved for later use. + + bit 4: Accepts value present. A client sets this flag and sends + another uint32 value (encoded as above, LSB first, zero + bytes omitted), which is a fully constructed flags value, + bits set meaning that the client can accept those extensions. + No extensions can be used, until the other side sends an + accept value for them. It is not defined when this value + should be send, best is on first transfer, but can be sent + any time later, even changing the previously announced + flags. + + bit 5: Always set to 1, to distinguish from older (pre-rc8) clients. + + bit 6: Always set to 0, to distinguish from older (pre-rc8) clients. + + bits 7,15,23: Extension flag, means that the next byte of the flags is + present. + + bits 8-14,16-22,24-32: Reserved for later use. + + + Transmission layer example: + 0x30 0x23 - Client uses no extensions on this packet, + and indicates that it can accept zlib compression and + compressed numbers. + + Notes: + Note 1: On the "accepts" value, the predefined flags must be set to + their predefined values, because this can be used as a sort + of a sanity check. + + Note 2: Bits marked as "reserved" should always be set to 0. + + + +Section 1.2: Application layer +------------------------------ + + Data transmission is done in packets. A packet can be considered as a + special tag - with no data, no tagLen field, and with the tagCount + field always present. All numbers part of the application layer are + transmitted in network byte order, i.e. MSB first. + A packet contains the following: + [ec_opcode_t] OPCODE + [uint16] TAGCOUNT + + + In detail: The opcode means what to to or what the data fields contain. + Its type is set as ec_opcode_t, which currently is an uint8. + TagCount is the number of first level tags this packet has. Then are the + tags themselves. + + A tag consist of: + [ec_tagname_t] TAGNAME + [ec_tagtype_t] TAGTYPE + [ec_taglen_t] TAGLEN + <[uint16] TAGCOUNT>? + + + + The ec_tagname_t is defined as an uint16, ec_taglen_t as an uint32 value + at the moment. ec_tagtype_t is an uint8. + TagName tells what it contains (see ECcodes.h for details). + TagType sends the type of this tag (see ECPacket.h for types) + TagLen contains the whole length of the tag, including the lengths of the + possible sub-tags, but without the size of the tagName, tagType and + tagLen fields. Actually the lowest bit of the tagname doesn't belong to the + tagName itself, so it has to be cleared before checking the name. + + Tags may contain sub-tags to store the information, and a tagCount field + is present only for these tags. The presence of the tagCount field can + be tested by checking the lowest bit of the tagName field, when it is + set, tagCount field present. + + When a tag contains sub-tags, the sub-tags are sent before the tag's own + data. So, tag data length can be calculated by substracting all sub-tags' + length from the tagLen value, and the remainder is the data length, if + non-zero. + + +Section 2: Data Types +--------------------- + + Integer types + ------------- + + Integer types (such as uint8, uint16, uint32) are always transmitted in + network byte order (MSB first). + + + Strings + ------- + + Strings are always UTF-8 strings, with the trailing zero byte included. + All strings coming from the server are untranslated, but their translations + are included in amule's translation database (amule.mo). + + + Boolean + ------- + + This one is tricky. When reading, the tag's presence means true, and + false when omitted. When writing, they should always be present - + if not, it's considered 'unchanged' - and should hold an uint8 value. + This value determines the boolean value in the standard way, i.e. + zero means false and non-zero means true. + + Boolean values are mostly used in reading/writing preferences. + + + MD5 Hashes + ---------- + + They are always MSB first. + + + Floating point numbers + ---------------------- + + Floating point numbers such as 'float' or 'double' types are converted + to their string representation, and are sent as string. Note, that the + decimal point is always the '.' (dot) character, independent from the + current locale. + + +Section 3: Clarifying things +---------------------------- + + If all the above seemed too much technical, just keep on reading. If you + understood the above at first, you can safely skip this section. + + Have you ever seen an xml file? Do you know how it looks like? Then you + can safely think of an EC packet as binary xml. Otherwise (hmm, you + don't know what xml is?) think of it as a tree, it has exactly one root, + may have many branches and leaves. We'll use the tree example below. + + But before we get to the examples, just some words about the flags (which + are part of the transmission layer, you remember?): When developing your + EC application (frontend to aMule, etc), this might be the last thing you + want to care about, and it's ok. Just keep sending a byte of 0x20 as flags, + and aMule will never want to use any of the features described in + Section 1.1. You just have to take of the "accepts" value aMule will send + in its first reply. + + An now, to the examples. The example packets are real-life EC packets, + transscripted to textual form for your pleasure :) + + First, let's see a simple but very important packet: authentication to + aMule. This must be the very first one, otherwise aMule might drop the + connection. + + EC_OP_AUTH_REQ (0x02) + +----EC_TAG_CLIENT_NAME (0x06) (optional) + +----EC_TAG_PASSWD_HASH (0x04) + +----EC_TAG_PROTOCOL_VERSION (0x0c) + +----EC_TAG_CLIENT_VERSION (0x08) (optional) + +----EC_TAG_VERSION_ID (0x0e) (required for cvs versions, must not be present for release versions) + + Now, what exactly gets transmitted? Here it comes, with comments (all + numbers are hexadecimal, I omitted the 0x prefix for redability): + + 20 FLAGS, just stating that we use ECv2 + 02 EC_OP_AUTH_REQ + 00 05 Number of children (tags) this packet has + 00 06 EC_TAG_CLIENT_NAME + 0? EC_TAGTYPE_STRING + 00 00 00 09 Length of this tag (9) + 61 4d 75 6c 65 63 6d 64 00 Contents of the tag: "aMulecmd", with trailing zero included (see String types in Section 2) + 00 08 EC_TAG_CLIENT_VERSION + 0? EC_TAGTYPE_STRING + 00 00 00 04 Length of this tag (4) + 43 56 53 00 Content: "CVS" + 00 0c EC_TAG_PROTOCOL_VERSION + 0? EC_TAGTYPE_UINT?? + 00 00 00 02/4/8 Length: 2/4/8 (16/32/64 value follows) + 00? 00? 01 f2 Content: 0x0200 (current protocol version number for cvs) + 00 04 EC_TAG_PASSWD_HASH + 0? EC_TAGTYPE_HASH + 00 00 00 10 Length (16) + 5d 41 40 2a bc 4b 2a 76 Content: 16 bytes md5sum of EC password + b9 71 9d 91 10 17 c5 92 + 00 0e EC_TAG_VERSION_ID + 0? EC_TAGTYPE_CUSTOM + 00 00 00 21 Length: 33 + 62 66 39 64 64 32 36 35 Content 33 bytes of the unique EC CVS version ID + 32 36 34 35 31 36 63 39 Remember: this is only for CVS versions, and its + 34 35 38 36 38 66 61 39 size, content-type, anything might change without + 30 38 66 62 37 64 39 38 notice. For release versions this tag MUST NOT be + 00 present. + + Now, that we constructed a packet, stating that we are "aMulecmd CVS", send + it to the server and see what it replies. Hopefully the following: + + 30 FLAGS, stating that the server sends us an 'accepts' flags + 23 the 'accepts' flag. Just take care that your program can + handle when it is present, and we can forget about it for now. + 04 EC_OP_AUTH_OK + 00 01 Number of children (tags) in this packet + 00 76 EC_TAG_SERVER_VERSION + 0? EC_TAGTYPE_STRING + 00 00 00 04 Length of this tag (4) + 43 56 53 00 And the contents: "CVS" + + That was easy. Heading for a more complex example: now that we're connected + to aMule, ask simple stats from core. + + The request: + + EC_OP_STAT_REQ + +----EC_TAG_DETAIL_LEVEL (with EC_DETAIL_CMD value) + + 20 FLAGS, as above + 0a EC_OP_STAT_REQ + 00 01 TagCount: 1 + 00 10 EC_TAG_DETAIL_LEVEL + 0? EC_TAGTYPE_UINT8 + 00 00 00 01 Length: 1 + 00 0 = EC_DETAIL_CMD + + The reply (assuming core is connected to a server): + + EC_OP_STATS + +----EC_TAG_STATS_UL_SPEED + +----EC_TAG_STATS_DL_SPEED + +----EC_TAG_STATS_UL_SPEED_LIMIT + +----EC_TAG_STATS_DL_SPEED_LIMIT + +----EC_TAG_STATS_CURR_UL_COUNT + +----EC_TAG_STATS_TOTAL_SRC_COUNT + +----EC_TAG_STATS_CURR_DL_COUNT + +----EC_TAG_STATS_TOTAL_DL_COUNT + +----EC_TAG_STATS_UL_QUEUE_LEN + +----EC_TAG_STATS_BANNED_COUNT + +----EC_TAG_CONNSTATE + +----EC_TAG_SERVER + +----EC_TAG_SERVER_NAME + + I won't copy here the whole reply packet, only the interesting part: + + 20 FLAGS + 0c EC_OP_STATS + 00 0b Number of (first-level) tags in this packet: 11 (direct children of the packet root) + 00 14 [...] EC_TAG_STATS_UL_SPEED + 00 16 [...] EC_TAG_STATS_DL_SPEED + 00 18 [...] EC_TAG_STATS_UL_SPEED_LIMIT + 00 1a [...] EC_TAG_STATS_DL_SPEED_LIMIT + 00 1c [...] EC_TAG_STATS_CURR_UL_COUNT + 00 22 [...] EC_TAG_STATS_TOTAL_SRC_COUNT + 00 1e [...] EC_TAG_STATS_CURR_DL_COUNT + 00 20 [...] EC_TAG_STATS_TOTAL_DL_COUNT + 00 26 [...] EC_TAG_STATS_UL_QUEUE_LEN + 00 24 [...] EC_TAG_STATS_BANNED_COUNT + And now the interesing part: + 00 13 EC_TAG_CONNSTATE. Note, that all tagnames are even numbers, so when + we find an odd number, the true tag name is -1. EC_TAG_CONNSTATE = 0x0012, + and 0x0013 - 1 = 0x0012, so it is really this one. The tagname being an odd number + means that this tag has child(ren) tags (see tree above), and also that it has a + tagcount field too. + 0? EC_TAGTYPE_UINT32 + 00 00 00 26 TagLen: 38 (own content length + length of children (with headers)) + 00 01 TagCount: 1 (one child tag exists, that is a direct child of this tag) + 00 61 EC_TAG_SERVER (has children) + 0? EC_TAGTYPE_IPV4 + 00 00 00 1a TagLen: 27 (own content (6) + length of child (content: 14 + header: 7)) + 00 01 TagCount: 1 + 00 62 EC_TAG_SERVER_NAME + 0? EC_TAGTYPE_STRING + 00 00 00 0e TagLen: 14 + 52 61 7a 6f 72 62 61 63 Content of the EC_TAG_SERVER_NAME tag: "Razorback 2.0" + 6b 20 32 2e 30 00 + c3 f5 f4 f3 12 35 Content of the EC_TAG_SERVER tag: Server IP:Port (195.245.244.243:4661) + 90 cc 83 52 Content of the EC_TAG_CONNSTATE tag: Current UserID + + Hopefully these examples helped enlightening the nature of OpCodes, Tags, + nested tags. diff --git a/docs/ED2K-Links.HOWTO b/docs/ED2K-Links.HOWTO new file mode 100644 index 00000000..ac56d0eb --- /dev/null +++ b/docs/ED2K-Links.HOWTO @@ -0,0 +1,155 @@ + + + -------------------------------------------------- + How to ED2K Links from your web browser with aMule + -------------------------------------------------- + + + Previous notes +---------------- + + This text file is old and discontinued. + This howto is now online in our wiki so please visit it + instead of this document. + + http://www.amule.org/wiki/index.php/Ed2k_links_handling + + You can safely stop reading this document now ;) + + + Konqueror +----------- + + 1. /usr/kde/3.1/share/services + You can find it by file names ended with .protocol + Somethign like `find /usr -name "*.protocol"` or `find /opt -name "*.protocol"` + or even put / to path if you want. + + 2. If the first was successful, create a file named something like e2k.protocol in + the mentioned directory: + + [Protocol] + exec=/usr/local/bin/ed2k "%u" + protocol=ed2k + input=none + output=none + helper=true + listing=false + reading=false + writing=false + makedir=false + deleting=false + + 3. Reload konqueror + + (Credits: gfdsa) + + + Opera +------- + + * Opera 6.11 + + First of all: Opera 6.11 doesn't pass complete URL to external programs - only URL + without protocol. don't know wheather this behaviour has changed in later releases. + + Create amule_submit.sh with this content: + + #!/bin/sh + /usr/local/bin/ed2k "ed2k://$1"; + + Now edit (as root) /etc/opera6rc or as non-root ~/.opera/opera6.ini: + + [Trusted Applications] + ed2k=/usr/local/bin/amule_submit.sh + + [User Prefs] + TrustedExternalURLProtocols=ed2k + + (Credits: thermoman ( Marcel Meckel ) ) + + * Opera 7.1 (slightly different from Opera 6) + + Edit either /etc/opera6rc or ~/.opera/opera6.ini and add the following: + + In [User Prefs] + TrustedExternalURLProtocols=ed2k + + In [Trusted Applications] + ed2k=/path/to/ed2k ed2k://%u + + (Credits: ender) + + + Mozilla 1.3+ / FireFox 0.6+ +----------------------------- + + 1. Go to http://mozex.mozdev.org/installation.html and click the + install link. This will automatically install Mozex plugin for + your browser. + + 2. Restart your browser. + + 3a. Firefox: Go to Tools->Preferences->Extensions->Mozex->Options + and add 'ed2k %r' in the ED2K box. + + 3b. Mozilla: Go to Edit->Preferences->Mozex and add 'ed2k %r' in + the ED2K box. + + Mozilla before v1.3 / Firefox before v0.6 +------------------------------------------- + + 1) Go to http://protozilla.mozdev.org/download.html + Choose the version fitting your mozilla-version and click + on "install". It will auto-install protozilla. + Now close mozilla completely. + + Notes: + - You must have write permission to the mozilla-installation-directory + for this. If you've installed mozilla to /usr , you'll have to be + root probably. + - The downloadable precompiled version of protozilla apparently does + _not_ work with debian mozilla packages. It _does_ work together + with the precompiled version of 1.2.1 available at mozilla.org for + example (or you can build both mozilla and protozilla yourself) + + 2) This step is only necessary if you had to start mozilla as root in + step 1). If you did step 1) with the same user as you normally use, + you can skip it + + As root do: + cp -r /root/.mozilla/PROFILENAME/RANDOM.slt/protozilla/ + /home/USERNAME/.mozilla/PROFILENAME2/RANDOM.slt/" + + Copy protozilla-configuration from root's home to user's home. + + cd /home/USERNAME/.mozilla/PROFILENAME/RANDOM.slt/ + chown -R YOURUSER.YOURGROUP protozilla" + + cd to user's mozilla config-dir and change file-ownership parameters. + + Note: + USERNAME: name of your normal, non-root user + PROFILENAME: name of the profile you'll want to use + RANDOM: random alphanumeric string, autogenerated by mozilla + YOURUSER, YOURGROUP: user and group of your normal user + + 3) Setup a protocol-handler for ed2k-links: + + cd to ~/.mozilla/PROFILENAME/RANDOM.slt/protozilla/protocol + + Create a file called "ed2k.cmd" with the following content: + + ed2k ed2k:$URI_DATA + + Do this with your favorite text-editor, the file doesn't have to be executable + + Now restart mozilla, and everything should work. + + (Credits: R. Pokorny aka rpokorny ) + + + Other browsers / More help +---------------------------- + + Please visit http://www.amule.org/wiki/index.php/Ed2k_links_handling diff --git a/docs/INSTALL b/docs/INSTALL new file mode 100644 index 00000000..ebfe2ad2 --- /dev/null +++ b/docs/INSTALL @@ -0,0 +1,102 @@ + + + ------- + INSTALL + ------- + + + Requirements +-------------- + + You will need glib/gtk-1.2.10 (package names like glib and glibdev + or glib-devel, gtk and gtkdev or gtk-devel or similar) or gtk2 + (package names correspond to gtk ones), libexpat (package name + should be expat) and gettext to compile aMule. Also wxWidgets-2.4.2 or greater (wxGTK-2.6.x is recommended), + linked against glib/gtk-1.2.10 is needed (package names wxGTK and + wxGTK-devel or similar). + + If you compile with wxGTK-2.4.2, you will need wxBase-2.4.2 + package, too, if you want to use amulecmd (the TextClient). + You can link it to wxgtk too, but it won't run on non-graphical consoles, + thus removing all the fun ;) + Since wxWidgets-2.5.x you don't need wxBase anymore. + + It is known to compile in GCC 3.2, 3.3 and 3.4, older GCC's probably + can't handle Microsoft C++ well enough. + + How to compile wxWidgets +-------------------------- + + Only GTK1 is supported. GTK2 with wxWidgets 2.6 and greater, but it is known + to have lots of leaks and so is not supported. + + For GTK1: + ./configure --prefix=/usr --disable-gtk2 --with-gtk && make + + After wxWidgets has compiled and you have installed it, you can compile aMule. + Do "./configure && make" as usual. If for some reason, wx-config cannot be + found, use ./configure --with-wx-config=/path/wx-config. Sometimes it will be + named wxgtk-2.4-config. + + To install it, as root type "make install" anyway, you don't have to install + if you don't want to. It will run fine from the source directory too. + + Note: If you are using a CVS version, you will have to run ./autogen.sh before + ./configure to generate configure script. Automake > 1.5, Autoconf >= 2.57 and + gettext are required. + + And if you want to remote-administer it, you should definitely try VNC (or + TightVNC). You probably won't get disappointed :) + * http://www.realvnc.org/ + * http://www.tightvnc.org/ + + If you change the chart colors and want to select a custom color... be sure to + press "Add to custom color"-button and select the color from there. Otherwise + color will not change :) + + ADVANCED OPTIONS +------------------ + + This are some of the availabe configure options: + + --disable-debug disable additional debugging output + --enable-optimize enable code optimizing + --enable-profile enable code profiling + --enable-static produce a statically linked executable + --enable-embedded_crypto use embedded Crypto code (default) + --enable-amulecmd compile aMule command line client + --enable-amule-gui compile aMule remote GUI (EXPERIMENTAL) + --enable-amule-daemon compile aMule daemon version + --enable-webserver compile aMule WebServer + --enable-cas compile C aMule Statistics + --enable-wxcas compile aMule GUI Statistics + --disable-ed2k don't compile aMule ed2k links handler + --enable-alc compile aMuleLinkCreator GUI version + --enable-alcc compile aMuleLinkCreator for console + --disable-gsocket disable gsocket.c linking + --disable-gtk disable pure GTK code in amule + --enable-utf8-systray use UTF-8 encoded strings in the systray + --disable-systray disable SysTray compilation + --disable-monolithic disable building of the monolithic aMule app + --disable-gtktest do not try to compile and run a test GTK+ program + --disable-gtktest do not try to compile and run a test GTK program + --disable-rpath do not hardcode runtime library paths + --disable-nls do not use Native Language Support + --enable-ccache enable ccache support for fast recompilation + + With --enable-optimize, -O flag will be added to the compilation options. If not + given, no optimization will occur. It is currently preferable not to optimise (in + fact, it is not supported), because if aMule crashes, the optimised code will not + produce usable stack trace. -O2 is reported to work fine, -O3 will totally crash + on start up, don't waste your time as of now. + + With --enable-profile, -pg flag will be added to the compilation options. aMule + will then record profiling data in gmon.out, from which one can see where aMule + spends its time. You probably do not want to turn this on, unless you want to + help the devs figure out where your CPU time is going :P + + Links +------- + + Compiling aMule and wxWidgets + http://www.amule.org/wiki/index.php/Compile diff --git a/docs/Makefile.am b/docs/Makefile.am new file mode 100644 index 00000000..f3b36215 --- /dev/null +++ b/docs/Makefile.am @@ -0,0 +1,22 @@ +SUBDIRS = man + +dist_doc_DATA = \ + ABOUT-NLS \ + amulesig.txt \ + amule-win32.HOWTO.txt \ + Changelog \ + ED2K-Links.HOWTO \ + INSTALL \ + license.txt \ + README \ + TODO \ + EC_Protocol.txt \ + socks4.protocol + +EXTRA_DIST = \ + Doxyfile \ + README.Mac.txt \ + README.Windows.txt \ + Releases.dia + +MAINTAINERCLEANFILES = Makefile.in diff --git a/docs/Makefile.in b/docs/Makefile.in new file mode 100644 index 00000000..64c42a03 --- /dev/null +++ b/docs/Makefile.in @@ -0,0 +1,653 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = docs +DIST_COMMON = README $(dist_doc_DATA) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in ABOUT-NLS AUTHORS COPYING INSTALL TODO +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(docdir)" +dist_docDATA_INSTALL = $(INSTALL_DATA) +DATA = $(dist_doc_DATA) +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +SUBDIRS = man +dist_doc_DATA = \ + ABOUT-NLS \ + amulesig.txt \ + amule-win32.HOWTO.txt \ + Changelog \ + ED2K-Links.HOWTO \ + INSTALL \ + license.txt \ + README \ + TODO \ + EC_Protocol.txt \ + socks4.protocol + +EXTRA_DIST = \ + Doxyfile \ + README.Mac.txt \ + README.Windows.txt \ + Releases.dia + +MAINTAINERCLEANFILES = Makefile.in +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign docs/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign docs/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: +install-dist_docDATA: $(dist_doc_DATA) + @$(NORMAL_INSTALL) + test -z "$(docdir)" || $(mkdir_p) "$(DESTDIR)$(docdir)" + @list='$(dist_doc_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(dist_docDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(docdir)/$$f'"; \ + $(dist_docDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(docdir)/$$f"; \ + done + +uninstall-dist_docDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_doc_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(docdir)/$$f'"; \ + rm -f "$(DESTDIR)$(docdir)/$$f"; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(DATA) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(docdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: install-dist_docDATA + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-dist_docDATA uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-recursive ctags ctags-recursive \ + distclean distclean-generic distclean-recursive distclean-tags \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-dist_docDATA \ + install-exec install-exec-am install-info install-info-am \ + install-man install-strip installcheck installcheck-am \ + installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic maintainer-clean-recursive \ + mostlyclean mostlyclean-generic mostlyclean-recursive pdf \ + pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ + uninstall-dist_docDATA uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/docs/README b/docs/README new file mode 100644 index 00000000..dec2d5f6 --- /dev/null +++ b/docs/README @@ -0,0 +1,284 @@ + + ----------- + aMule + ----------- + The All-platform eD2k Client + + + About +------- + aMule is a multiplatform ed2k client, fork of the eMule client, using the + wxWidgets class library. It was originally forked from the xMule project, + which in turn was forked from the lMule project. This is turn was the first + fork of eMule to run nativly on Linux and other Unix-like systems. + + + Installation +-------------- + See INSTALL file + + + Configuration: +---------------- + - Go to the "Preferences" tab + + - Enter a nickname or leave as the default value. + + - Enter the "Download Capacity" and "Upload Capacity" according to your + internet connection. All values in aMule are kiloBytes (kB), but your + Internet Service Provider's numbers are most likely kiloBits (kb). + + 8 kiloBits make up 1 kiloByte, so if your Internet Connection is 768kb + Downstream and 128kb Upstream (i.e. German Telekom DSL), your correct + values are: + + Downstream: 768kb / 8 = 96kB, so you enter 96 as "Download Capacity" + Upstream: 128kb / 8 = 16kB, so you enter 16 as "Upload Capacity" + + Anyway, these values are used to calculate the current bandwidth usage for + display purposes only (mainly for statistics). Nevertheless, you need to + know them to determine the following down/upload limits: + + - Enter "Download Limit" and "Upload Limit" (IMPORTANT!) + + Download Limit: + Leave this at 0, which stands for "no limit". However, if aMule uses + too much bandwidth and causes problems with other applications using + your internet connection, it would be a good idea to limit this to + aproximetly 80% of your downstream capacity. + + Upload Limit: + It is recommended that you set this limit to around 80% of your actual + upstream capacity, in order to avoid degrading the performance of your + connection. + + Setting the Upload Limit to a value less than 10 will automatically reduce + your Download Limit after the following schema: + + Upload Limit | Max Download + >= 10 | No limit + < 10 | Upload Limit * 4 + < 4 | Upload Limit * 3 + + + NOTE: 56k Modem users: aMule only accepts integral values for these + settings, you can't enter 1.6 or whatever your sweet-spot setting + is. Sorry. + + - "Maximum Connections": + As a general rule, set it to 500 - 2000. + + - "Maximum Sources per File": + This depends on how many files you tend to download at a time, if you + tend to download few files, high values are acceptable, otherwise go + for lower values so that all files will be able to get sources. + + - Choose the directories you want to share with other users: + DO NOT SHARE YOUR COMPLETE HARDDISK! + + It is suggested that you either use the "Incoming" folder or a seperate + folder for the files you wish to share, to avoid inadvertedly sharing + private files. + + If you share more than 200 files, you should consider that some servers + have a hard limit due to resource constraints, which means that you may + be kicked from them if you share too many files or that some of your + files won't be populated to the network through that server. So it is not + always a good idea to share lots of files. + + - Other: + The other options are pretty self-explanatory. If you don't know what it + does, don't touch it as a general rule. More information on getting started + can be found in the aMule wiki: + http://www.amule.org/wiki/index.php/Getting_Started + + Don't forget to connect to a server, or you probably won't download too much. + + + Basic aMule Tips +------------------ + * NEVER run aMule as root. + * If you are behind a firewall or router, be sure that the ports have been + opened. The default ports are 4662 (TCP). 4665 (UDP) and 4672 (UDP). If + these are blocked, you will receive a "LowID" which results in fewer + availble sources for the files you are downloading. + * Obtain an appropriate server.met: e.g., if you are a dialup, using + a large server list is not appropiate. + * Set your temp and shared directories in Preferences->Directories + * To recursively select a certain directory, right-click over it. + * You should *NOT* share + * Your temp download directory! + * Your /etc directory + * Probably not your /var, /lib, /boot, or /usr directory + * Certainly make sure that any really confidential files (password files, + private SSH keys, credit card numbers :) are *not* shared. So generally + do not share your entire home directory, although you might want to + share some files or directories in it. + * Remember that you get certain download priveledges with those clients + (aMule, eMule, etc users) to whom you upload files, in the form of reduced + queue waits. + * Please note that compilation with optimizations is supported. However, if + you pull a Gentoo, we will probably just tell you to recompile aMule and/or + your system with sane compiler-flags before we will attempt to address the + problem. + + + Obtaining your first server list +---------------------------------- + Use one of the following links in the "Update server.met from URL" box in + the Server tab. They are apparently updated every 20 minutes. + + * The current top 50 servers (these fill up fast): + http://ocbmaurice.dyndns.org/pl/slist.pl/server.met?download + * The current top 150 servers: + http://ocbmaurice.dyndns.org/pl/slist.pl/server.met?download/server-good.met + * The biggest list (about 300 servers) maintained by the site. Only if you + have a very decent connection: + http://ocbmaurice.dyndns.org/pl/slist.pl/server.met?download/server-max.met + * Should maurice be down for some reasons, use this server.met instead: + http://www.srv1000.com/azz/server.met + + If these are non-functional, simply google for 'server.met'. + + + Tranfers icons +---------------- + To find descriptions of the various icons found inside aMule, take a look at + http://www.amule.org/wiki/index.php/Getting_Started#Icons_and_What_They_Signify + + + License +--------- + aMule -- like eMule -- is released under the GNU General Public License. + See the "COPYING" file for details. + + + Developers +------------ + See AUTHORS + + + FAQ: +------ + -- How do I know whether my ID is high or low? -- + + Look at the arrows at the bottom right corner, wrapping a world icon, next to + the server name you are connected to. If they're green, your ID is high. If + they're yellow, your ID is low. + + + -- What does high and low ID mean anyway? -- + + When your ID is high (green arrows), everything is fine. + When it's low (yellow arrows), you are probably behind a firewall or a + router, and other clients can't connect to you directly (which is a bad + thing). Please read the FAQ, search our wiki or forums on how to configure + your firewall/router for aMule. + + NOTE: you can also get a low ID when the server you connected to is too busy + to answer properly, or simply badly configured. When you are sure your + settings are ok and you SHOULD have a high ID, connect to another server. + + + -- I'd like to search for specific file types, what filter stands for which files? -- + + File Type Extensions found + -------------------------------------------------------------------- + Audio .mp3 .mp2 .mpc .wav .ogg .aac .mp4 .ape .au .wma + Video .avi .mpg .mpeg .ram .rm .vob .divx .mov .ogg .vivo + Program .exe .com + Archive .zip .rar .ace .tar.gz .tar.bz2 .Z .arj + CDImage .bin .cue .iso .nrg .ccd .sub .img + Picture .jpg .jpeg .bmp .gif .tif .png + + + -- What are all those fancy colors in the download progress bar about? -- + + Each download in the the transfers window has a coloured bar to show current + file availability and progress. + + * Black shows the parts of the file you already have + * Red indicates a part missing in all known sources + * Different shades of blue represent the availability of this part in the + sources. The darker the blue is the higher the availability + * Yellow denotes a part being downloaded + * The green bar on top shows the total download progress of this file + + If you expand the download you see its sources with the corresponding + bar. Here the colours have a slightly different meaning: + + * Black shows parts you are still missing + * Silver stands for parts this source is also missing + * Green indicates parts you already have + * Yellow denotes a part being uploaded to you + + Learning how the progress bar works will greatly help your understanding + of the eD2k network. + + + -- Where can I get more information? -- + + Here are some links that might be of your interest: + + * aMule Wiki (documentation pages) + http://wiki.amule.org + + * aMule forums + http://forum.amule.org + + * eMule documents + http://www.emule-project.net/home/perl/help.cgi + + + Want to help? +--------------- + aMule is a free software project and requires the cooperation of its users + to improve the quality of the software. We welcome all contributions to the + project in the form of new features, bug fixes, feature requests, etc. + + If you are not a programmer you can still contribute by providing good bug + reports when you come accross a problem with aMule. A good bug report gives + the aMule Team information enough to reproduce the bug (so we can see it in + action) and fix it. If possible, try to isolate under which the bug occurs + (eg. does it happen on some specific window, with some specific files, some + specific conditions etc.) and provide as much detail as you can in your + report. + + If you are a programmer and fix a bug you observe, please send us a patch or + a note about how you fixed the problem. + + + IRC, Links and Contact +------------- + IRC: Channel #aMule on FREENODE IRC Network (irc.freenode.net) + + aMule homepage + http://www.amule.org + + aMule related links + http://www.amule.org/wiki/index.php/FAQ_ed2k + http://www.amule.org/wiki/index.php/aMule + http://www.amule.org/wiki/index.php/FAQ_aMule + http://www.amule.org/wiki/index.php/FAQ_utils + http://www.amule.org/wiki/index.php/Getting_Started + http://www.amule.org/wiki/index.php/aMule_problems + + wxWidgets toolkit homepage + http://www.wxwidgets.org + + eMule homepage + http://www.emule-project.net + + Contact (administrative issues only!) + admin@amule.org + + Legal Notice +-------------- + + aMule is an interface to the ed2k network. As such, the aMule developers have + absolutely no control or say over what is transferred on this medium and + cannot be held liable for any non-personal copyright infringements or other + illegal activities. + + +-- Last modified Sun May 1 13:05:02 CEST 2005 -- diff --git a/docs/README.Mac.txt b/docs/README.Mac.txt new file mode 100644 index 00000000..e0ee65e2 --- /dev/null +++ b/docs/README.Mac.txt @@ -0,0 +1,55 @@ +README for aMule on the Mac +=========================== + +Installation: +------------- +Just drag the aMule application to a folder of your choice (e.g., /Applications). To start aMule, double-click the application icon. + + +Documentation and help resources: +--------------------------------- +The heart of aMule's documentation is the aMule Wiki, which you can find at http://www.amule.org/wiki/index.php/Main_Page. We suggest that you start with the Getting Started Guide (http://www.amule.org/wiki/index.php/Getting_Started) and the aMule FAQ (http://www.amule.org/wiki/index.php/FAQ_aMule). These pages should give you a good idea of how to setup and use aMule. + +If you run into any problems you can drop by at the aMule forum (http://forum.amule.org). A lot of questions have already been answered there, so it is always a good idea to start by searching the forum for your particular problem. If you don't find an answer to your problem you can post your problem on the forum and we will do our best to help you out. + +The forum and particularly the Mac subsection of the forum (http://forum.amule.org/board.php?boardid=49) are also good places to look for usage tips and to learn about recent aMule developments (especially look at the sticky threads). + + +Right-clicking & pop-up menus on the Mac: +----------------------------------------- +aMule contains a lot of features that are only accessible through pop-up menus, which you invoke by right-clicking a certain item. For instance, if you want to pause or cancel a download, change the upload or download priority of a file, see file details, etc. you need to do this via a right-click. + +If you haven't bought an additional multi-button mouse with your Mac, you only have one mouse button (the one that corresponds to a left-click or "normal" click on a multi-button mouse). Fortunately, you can emulate the second button by HOLDING DOWN THE CONTROL-KEY ON THE KEYBOARD WHILE YOU CLICK. For example, do a "control-click" now on a file that you are downloading and see how a pop-up menu shows up with further option. + +If you want to discover all of aMule's hidden functionalities just try to control-click everything that moves. +This includes all the lists of files, clients & servers, all the labels on the top of these lists (e.g. "File Name"), the bar "all" at the top of the download window, ... + +By the way, these emulated right-clicks work system-wide. Just try control-clicking a file in the Finder, an icon in the Dock, a marked word in TextEdit or MS Word. + + +Handling ed2k-Links on the Mac: +------------------------------- +There are basically four ways to download files with aMule: + +(1) Search for files using aMule's search dialog and double click those search results that you want to download. + +(2) Copy ed2k-links from a web page into the "ED2K-Link Handler" field at the bottom of the search window of aMule and press the commit button. If the ed2k-link is longer than that text field is wide you need to make the aMule window wider until the link fits completely into the field (you can make the aMule window wider than your screen if necessary). We are working on eliminating this issue. + +(3) Import ed2k-links directly from your browser into aMule. See http://forum.amule.org/thread.php?threadid=5679 for more details. + +(4) Use a text editor (e.g. TextEdit) to paste ed2k-links into a "ED2Links" file inside "~/Library/Application Support/aMule/" and aMule will automatically import the links. + + +Setting up aMule's video preview feature: +----------------------------------------- +You can use a video player like VLC or Mplayer to preview incomplete downloads of video files. To set up aMule properly for this, go to Preferences -> Directories. Under "Video Player", you have to enter "/usr/bin/open -a" together with the path of your video player program. + +For example: +/usr/bin/open -a "/Applications/VLC.app" +/usr/bin/open -a "/Applications/vlc-0.8.4a/VLC.app" +/usr/bin/open -a "/Applications/MPlayer OS X 2.0b8r5/MPlayer OS X 2.app" + + +Getting up-to-date snapshot builds of aMule: +-------------------------------------------- +If you are interested in running aMule versions with the latest bleeding edge features or if you want to help us test the most recent changes to the aMule code-base you download up-to-date snapshot builds of aMule. More information can be found at: http://forum.amule.org/thread.php?threadid=5051 \ No newline at end of file diff --git a/docs/README.Windows.txt b/docs/README.Windows.txt new file mode 100644 index 00000000..b8ac1c28 --- /dev/null +++ b/docs/README.Windows.txt @@ -0,0 +1,3 @@ +The windows README is still work in progress. + +Please go to http://wiki.amule.org for info. diff --git a/docs/Releases.dia b/docs/Releases.dia new file mode 100644 index 0000000000000000000000000000000000000000..6648fec39d2a6072c77998364f36bc599e616732 GIT binary patch literal 7710 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 YRR1vle_BpH{rJQG144MI3zz)@0NVK Online Signature). + + Currently two formats of online signature are supported: + * the original eMule online signature written to onlinesig.dat + * the aMule online signature written to amulesig.dat + + This document will detail on the later one. + + + Format +-------- + + The format of the file is a text file with 1 field per line. + + The following fields are defined by now in the order they appear in the signature file: + + Ordinal Content + Not-running Offline Online connecting + 1 0 0 1 2 + 2 0 0 Server name 0 + 3 0 0 IP of server as dot-quad 0 + 4 0 0 Port of server 0 + 5 0 0 'H' or 'L' for High-/Low-ID 0 + 6 0.0 As online Download speed in kB/s As online + 7 0.0 As online Upload speed in kB/s As online + 8 0 As online Number of clients waiting for upload As online + 9 0 As online Number of shared files As online + 10 As online As online Nick used on the ed2k network As online + 11 As online As online Total download in bytes As online + 12 As online As online Total upload in bytes As online + 13 As online As online aMule version As online + 14 0 As online Total Downloaded in Session in bytes As online + 15 0 As online Total Uploaded in Session in bytes As online + 16 0 As online aMule Uptime As online + + For comments and additions on this format please contact + + + Notes for implementors of tools accessing the online signature +---------------------------------------------------------------- + + - Be prepared to see linefeeds being in either Unix or DOS format. + - Be prepared of new fields/lines being added. + + Links +------- + + Please visit: + * amulesig.dat + http://www.amule.org/wiki/index.php/Amulesig.dat_file + * onlinesig.dat + http://www.amule.org/wiki/index.php/Onlinesig.dat_file diff --git a/docs/license.txt b/docs/license.txt new file mode 100644 index 00000000..3912109b --- /dev/null +++ b/docs/license.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/docs/man/Makefile.am b/docs/man/Makefile.am new file mode 100644 index 00000000..d50c3485 --- /dev/null +++ b/docs/man/Makefile.am @@ -0,0 +1,23 @@ +SELECTED_MANPAGES = \ + $(AMULECMD_MANPAGES) \ + $(WEB_MANPAGES) \ + $(AMULE_GUI_MANPAGES) \ + $(MONOLITHIC_MANPAGES) \ + $(AMULE_DAEMON_MANPAGES) \ + $(ED2K_MANPAGES) + +EXTRA_DIST = \ + amule.1 amuled.1 amulecmd.1 amulegui.1 amuleweb.1 ed2k.1 \ + amule.de.1 amuled.de.1 amulecmd.de.1 amulegui.de.1 amuleweb.de.1 ed2k.de.1 \ + amule.es.1 amuled.es.1 amulecmd.es.1 amuleweb.es.1 ed2k.es.1 \ + amule.eu.1 amuled.eu.1 amulecmd.eu.1 amuleweb.eu.1 ed2k.eu.1 \ + amule.fr.1 amuled.fr.1 amulecmd.fr.1 amuleweb.fr.1 ed2k.fr.1 \ + amule.hu.1 amuled.hu.1 amulecmd.hu.1 amuleweb.hu.1 ed2k.hu.1 + +EXTRA_DIST += \ + manpages.pot \ + manpages-de.po + +include $(top_srcdir)/automake/manpages.am + +MAINTAINERCLEANFILES = Makefile.in diff --git a/docs/man/Makefile.in b/docs/man/Makefile.in new file mode 100644 index 00000000..db665bf1 --- /dev/null +++ b/docs/man/Makefile.in @@ -0,0 +1,502 @@ +# Makefile.in generated by automake 1.9.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/automake/manpages.am +subdir = docs/man +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/build-tools.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/cryptopp.m4 \ + $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ + $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/m4/zlib.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALCC_FALSE = @ALCC_FALSE@ +ALCC_MANPAGES = @ALCC_MANPAGES@ +ALCC_TRUE = @ALCC_TRUE@ +ALC_FALSE = @ALC_FALSE@ +ALC_MANPAGES = @ALC_MANPAGES@ +ALC_TRUE = @ALC_TRUE@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ +AMULEWEB_DEFS = @AMULEWEB_DEFS@ +AMULE_DAEMON_FALSE = @AMULE_DAEMON_FALSE@ +AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ +AMULE_DAEMON_TRUE = @AMULE_DAEMON_TRUE@ +AMULE_GUI_FALSE = @AMULE_GUI_FALSE@ +AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ +AMULE_GUI_TRUE = @AMULE_GUI_TRUE@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_FLAGS = @BFD_FLAGS@ +BFD_LIB = @BFD_LIB@ +BUILD_CC = @BUILD_CC@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +CAS_DEFS = @CAS_DEFS@ +CAS_FALSE = @CAS_FALSE@ +CAS_MANPAGES = @CAS_MANPAGES@ +CAS_TRUE = @CAS_TRUE@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCACHE = @CCACHE@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +COMPILE_CMD_FALSE = @COMPILE_CMD_FALSE@ +COMPILE_CMD_TRUE = @COMPILE_CMD_TRUE@ +COMPILE_NLS_FALSE = @COMPILE_NLS_FALSE@ +COMPILE_NLS_TRUE = @COMPILE_NLS_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTOLIBS = @CRYPTOLIBS@ +CRYPTO_PP_CXXFLAGS = @CRYPTO_PP_CXXFLAGS@ +CRYPTO_PP_INCLUDE_PREFIX = @CRYPTO_PP_INCLUDE_PREFIX@ +CRYPTO_PP_LDFLAGS = @CRYPTO_PP_LDFLAGS@ +CRYPTO_PP_LIB_NAME = @CRYPTO_PP_LIB_NAME@ +CRYPTO_PP_PREFIX = @CRYPTO_PP_PREFIX@ +CRYPTO_PP_STYLE = @CRYPTO_PP_STYLE@ +CRYPTO_PP_VERSION_NUMBER = @CRYPTO_PP_VERSION_NUMBER@ +CRYPTO_PP_VERSION_STRING = @CRYPTO_PP_VERSION_STRING@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ED2K_FALSE = @ED2K_FALSE@ +ED2K_MANPAGES = @ED2K_MANPAGES@ +ED2K_TRUE = @ED2K_TRUE@ +EGREP = @EGREP@ +ENABLE_IP2COUNTRY_FALSE = @ENABLE_IP2COUNTRY_FALSE@ +ENABLE_IP2COUNTRY_TRUE = @ENABLE_IP2COUNTRY_TRUE@ +ENABLE_UPNP_FALSE = @ENABLE_UPNP_FALSE@ +ENABLE_UPNP_TRUE = @ENABLE_UPNP_TRUE@ +EXEEXT = @EXEEXT@ +GDLIB_CFLAGS = @GDLIB_CFLAGS@ +GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ +GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ +GDLIB_LIBS = @GDLIB_LIBS@ +GENCAT = @GENCAT@ +GENERATE_FLEX_HEADER_FALSE = @GENERATE_FLEX_HEADER_FALSE@ +GENERATE_FLEX_HEADER_TRUE = @GENERATE_FLEX_HEADER_TRUE@ +GEOIP_INCLUDE = @GEOIP_INCLUDE@ +GEOIP_LIB = @GEOIP_LIB@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_FLEX_EXTENDED = @HAVE_FLEX_EXTENDED@ +HAVE_GETTEXT = @HAVE_GETTEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ +LIBPNG_CXXFLAGS = @LIBPNG_CXXFLAGS@ +LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MONOLITHIC_FALSE = @MONOLITHIC_FALSE@ +MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ +MONOLITHIC_TRUE = @MONOLITHIC_TRUE@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_CORESERVICES_FALSE = @NEED_CORESERVICES_FALSE@ +NEED_CORESERVICES_TRUE = @NEED_CORESERVICES_TRUE@ +NEED_RC_FALSE = @NEED_RC_FALSE@ +NEED_RC_TRUE = @NEED_RC_TRUE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +RANLIB = @RANLIB@ +RC = @RC@ +RCFLAGS = @RCFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RESOLV_LIB = @RESOLV_LIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVNDATE = @SVNDATE@ +SYS_WIN32_FALSE = @SYS_WIN32_FALSE@ +SYS_WIN32_TRUE = @SYS_WIN32_TRUE@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEB_FALSE = @WEB_FALSE@ +WEB_MANPAGES = @WEB_MANPAGES@ +WEB_TRUE = @WEB_TRUE@ +WXBASE_CFLAGS = @WXBASE_CFLAGS@ +WXBASE_CXXFLAGS = @WXBASE_CXXFLAGS@ +WXBASE_LIBS = @WXBASE_LIBS@ +WXCAS_FALSE = @WXCAS_FALSE@ +WXCAS_MANPAGES = @WXCAS_MANPAGES@ +WXCAS_TRUE = @WXCAS_TRUE@ +WX_CFLAGS = @WX_CFLAGS@ +WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ +WX_CONFIG_PATH = @WX_CONFIG_PATH@ +WX_CPPFLAGS = @WX_CPPFLAGS@ +WX_CXXFLAGS = @WX_CXXFLAGS@ +WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ +WX_DEBUG = @WX_DEBUG@ +WX_LIBS = @WX_LIBS@ +WX_LIBS_STATIC = @WX_LIBS_STATIC@ +WX_PORT = @WX_PORT@ +WX_RESCOMP = @WX_RESCOMP@ +WX_SHARED = @WX_SHARED@ +WX_UNICODE = @WX_UNICODE@ +WX_VERSION_FULL = @WX_VERSION_FULL@ +WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ +WX_VERSION_MINOR = @WX_VERSION_MINOR@ +X11LIBS = @X11LIBS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_LD = @ac_ct_LD@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_RC = @ac_ct_RC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +ccache = @ccache@ +ccache_prefix = @ccache_prefix@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +SELECTED_MANPAGES = \ + $(AMULECMD_MANPAGES) \ + $(WEB_MANPAGES) \ + $(AMULE_GUI_MANPAGES) \ + $(MONOLITHIC_MANPAGES) \ + $(AMULE_DAEMON_MANPAGES) \ + $(ED2K_MANPAGES) + +EXTRA_DIST = amule.1 amuled.1 amulecmd.1 amulegui.1 amuleweb.1 ed2k.1 \ + amule.de.1 amuled.de.1 amulecmd.de.1 amulegui.de.1 \ + amuleweb.de.1 ed2k.de.1 amule.es.1 amuled.es.1 amulecmd.es.1 \ + amuleweb.es.1 ed2k.es.1 amule.eu.1 amuled.eu.1 amulecmd.eu.1 \ + amuleweb.eu.1 ed2k.eu.1 amule.fr.1 amuled.fr.1 amulecmd.fr.1 \ + amuleweb.fr.1 ed2k.fr.1 amule.hu.1 amuled.hu.1 amulecmd.hu.1 \ + amuleweb.hu.1 ed2k.hu.1 manpages.pot manpages-de.po +MAINTAINERCLEANFILES = Makefile.in +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/automake/manpages.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign docs/man/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign docs/man/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + $(mkdir_p) $(distdir)/../../automake + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-data-hook install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am uninstall uninstall-am uninstall-hook \ + uninstall-info-am + +install-data-hook: + @for file in $(SELECTED_MANPAGES); do \ + lang=`echo $$file | sed -e 's/^[^.]*\.//'`; \ + if test $$lang == 1; then \ + echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/man1" ; \ + $(mkinstalldirs) $(DESTDIR)$(mandir)/man1 ; \ + if test -f $(srcdir)/$$file; then name=$(srcdir)/$$file; \ + else name=$$file; fi; \ + inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ + echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/man1/$$inst" ; \ + $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/man1/$$inst ; \ + else \ + locale=`echo $$lang | sed -e 's/\..*//'` ; \ + echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/$$locale/man1" ; \ + $(mkinstalldirs) $(DESTDIR)$(mandir)/$$locale/man1 ; \ + if test -f $(srcdir)/$$file; then name=$(srcdir)/$$file; \ + else name=$$file; fi; \ + inst=`echo $$file | sed -e "s/\.$${locale}\.1//" -e '$(transform)'`.1 ; \ + echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$locale/man1/$$inst" ; \ + $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$locale/man1/$$inst ; \ + fi; \ + done + +uninstall-hook: + @for file in $(SELECTED_MANPAGES); do \ + lang=`echo $$file | sed -e 's/^[^.]*\.//'`; \ + if test $$lang == 1; then \ + inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ + rm -f $(DESTDIR)$(mandir)/man1/$$inst ; \ + else \ + locale=`echo $$lang | sed -e 's/\..*//'` ; \ + inst=`echo $$file | sed -e "s/\.$${locale}\.1//" -e '$(transform)'`.1 ; \ + rm -f $(DESTDIR)$(mandir)/$$locale/man1/$$inst ; \ + fi; \ + done +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/docs/man/amule.1 b/docs/man/amule.1 new file mode 100644 index 00000000..2422dc95 --- /dev/null +++ b/docs/man/amule.1 @@ -0,0 +1,45 @@ +.TH AMULE 1 "January 2007" "aMule v2.2.0" "aMule" +.SH NAME +amule \- the all\-platform eMule p2p client +.SH SYNOPSIS +.B amule +.RB [ \-v ] +.RB [ \-h ] +.RB [ \-i ] +.RB [ \-geometry " " \fI ] +.RB [ \-d ] +.RB [ \-o ] +.RB [ \-r ] +.SH DESCRIPTION +.TP +\fB\-v\fR, \fB\-\-version\fR +Displays the current version number. +.TP +\fB\-h\fR, \fB\-\-help\fR +Prints a short usage description. +.TP +\fB-i\fR, \fB\-\-enable\-stdin\fR +Does not disable stdin. +.TP +\fB\-geometry\fR \fI\fR +Sets the geometry of the app. +\fI\fR uses the same format as standard X11 apps: [\fB=\fR][\fI\fR{\fBxX\fR}\fI\fR][{\fB+-\fR}\fI\fR{\fB+-\fR}\fI\fR] +.TP +\fB\-d\fR, \fB\-\-disable\-fatal\fR +Does not handle fatal exception. +.TP +\fB\-o\fR, \fB\-\-log\-stdout\fR +Print log messages to stdout. +.TP +\fB\-r\fR, \fB\-\-reset\-config\fR +Resets config to default values. +\ +.SH FILES +~/.aMule/* +.SH REPORTING BUGS +Please report bugs either on our forum (\fIhttp://forum.amule.org/\fR), or in our bugtracker (\fIhttp://bugs.amule.org/\fR). +Please do not report bugs in e-mail, neither to our mailing list nor directly to any team member. +.SH COPYRIGHT +aMule and all of its related utilities are distributed under the GNU General Public License. +.SH SEE ALSO +\fBalc\fR(1), \fBalcc\fR(1), \fBamuled\fR(1), \fBamulecmd\fR(1), \fBamulegui\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1), \fBwxcas\fR(1), \fBxas\fR(1) diff --git a/docs/man/amule.de.1 b/docs/man/amule.de.1 new file mode 100644 index 00000000..4b49d763 --- /dev/null +++ b/docs/man/amule.de.1 @@ -0,0 +1,48 @@ +.\"******************************************************************* +.\" +.\" This file was generated with po4a. Translate the source file. +.\" +.\"******************************************************************* +.TH AMULE 1 "Januar 2007" "aMule v2.2.0" aMule +.SH NAME +amule \- der alle\-Plattformen eMule p2p Client +.SH SYNTAX +\fBamule\fP [\fB\-v\fP] [\fB\-h\fP] [\fB\-i\fP] [\fB\-geometry\fP \fI\fP] [\fB\-d\fP] +[\fB\-o\fP] [\fB\-r\fP] +.SH BESCHREIBUNG +.TP +\fB\-v\fP, \fB\-\-version\fP +Zeigt die derzeitige Versionsnummer an. +.TP +\fB\-h\fP, \fB\-\-help\fP +Gibt eine kurze Beschreibung aus. +.TP +\fB\-i\fP, \fB\-\-enable\-stdin\fP +Schaltet stdin nicht ab. +.TP +\fB\-geometry\fP \fI\fP +Gibt die Geometrie des Programms an. \fI\fP benutzt das selbe +Format wie Standard X11 +Anwendungen [\fB=\fP][\fI\fP{\fBxX\fP}\fI\fP][{\fB+\-\fP}\fI\fP{\fB+\-\fP}\fI\fP] +.TP +\fB\-d\fP, \fB\-\-disable\-fatal\fP +Fehlerbehandlung für fatale Fehler abschalten. +.TP +\fB\-o\fP, \fB\-\-log\-stdout\fP +Gibt Log\-Meldungen auf der Standardausgabe aus. +.TP +\fB\-r\fP, \fB\-\-reset\-config\fP +Setzt die Konfiguration auf die Standardwerte zurück. +.SH DATEIEN +~/.aMule/* +.SH "FEHLER MELDEN" +Bitte meldet Fehler entweder in unserem Forum (\fIhttp://forum.amule.org/\fP), +oder in unseren Bugtracker (\fIhttp://bugs.amule.org/\fP). Bitte meldet uns +keine Fehler per E\-Mail, noch auf unsere Mailingliste oder direkt an unsere +Teammitglieder. +.SH COPYRIGHT +aMule und alle seine zugehörigen Anwendungen werden verteilt unter der GNU +General Public License +.SH "SIEHE AUCH" +\fBalc\fP(1), \fBalcc\fP(1), \fBamuled\fP(1), \fBamulecmd\fP(1), \fBamulegui\fP(1), +\fBamuleweb\fP(1), \fBcas\fP(1), \fBed2k\fP(1), \fBwxcas\fP(1), \fBxas\fP(1) diff --git a/docs/man/amule.es.1 b/docs/man/amule.es.1 new file mode 100644 index 00000000..9286397b --- /dev/null +++ b/docs/man/amule.es.1 @@ -0,0 +1,40 @@ +.TH AMULE 1 "Marzo 2005" "aMule v2.0.0" "aMule" +.SH NOMBRE +amule \- Cliente P2P clon de eMule multi-plataforma. +.SH SINOPSIS +.B amule +.RB [ \-v ] +.RB [ \-h ] +.RB [ \-i ] +.RB [ \-geometry " " \fI ] +.RB [ \-d ] +.RB [ \-o ] +.SH DESCRIPCIÓN +.TP +\fB\-v\fR, \fB\-\-version\fR +Muestra la versión del programa. +.TP +\fB\-h\fR, \fB\-\-help\fR +Muestra esta información. +.TP +\fB-i\fR, \fB\-\-enable\-stdin\fR +Deja activa la entrada estándar. +.TP +\fB\-geometry\fR \fI\fR +Establece el tamaño de la aplicación. +\fI\fR usa el mismo formato que las aplicaciones X11 estándar: [\fB=\fR][\fI\fR{\fBxX\fR}\fI\fR][{\fB+-\fR}\fI\fR{\fB+-\fR}\fI\fR] +.TP +\fB\-d\fR, \fB\-\-disable\-fatal\fR +Ignora las señales de "Fatal exception". +.TP +\fB-o\fR, \fB\-\-log\-stdout\fR +Muestra en consola las lineas de log. +.SH ARCHIVOS +~/.aMule/* +.SH BUGS +Si descubre bugs, por favor comuníquelos en (\fIhttp://forum.amule.org/\fR), o en nuestro bugtracker (\fIhttp://bugs.amule.org/\fR). +Por favor, no comunique bugs por e-mail, ni a nuestro maillist ni directamente a ningún miembro del equipo de aMule. +.SH COPYRIGHT +aMule, y todas las utilidades que con el vienen, se distribuyen bajo la licencia GPL. +.SH VER +\fBalc\fR(1), \fBalcc\fR(1), \fBamuled\fR(1), \fBamulecmd\fR(1), \fBamulegui\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1), \fBwxcas\fR(1), \fBxas\fR(1) diff --git a/docs/man/amule.eu.1 b/docs/man/amule.eu.1 new file mode 100644 index 00000000..6e6a67a9 --- /dev/null +++ b/docs/man/amule.eu.1 @@ -0,0 +1,45 @@ +.TH AMULE 1 "2005 Martxoa" "aMule 2.0.0b" "aMule" +.SH IZENA +amule \- Plataforma orotarako eMule p2p bezeroa +.SH SYNOPSIS +.B amule +.RB [ \-v ] +.RB [ \-h ] +.RB [ \-i ] +.RB [ \-geometry " " \fI ] +.RB [ \-d ] +.RB [ \-o ] +.RB [ \-r ] +.SH AZALPENA +.TP +\fB\-v\fR, \fB\-\-version\fR +Bertsio zenbakia bistaratzen du. +.TP +\fB\-h\fR, \fB\-\-help\fR +Argibide hauek bistaratzen ditu. +.TP +\fB-i\fR, \fB\-\-enable\-stdin\fR +Ez irteera estandarra ezgaitu. +.TP +\fB\-geometry\fR \fI\fR +Aplikazioaren geometria ezarri. +\fI\fR-ek X11 aplikazioen formatu estanda berdina erabiltzen du: [\fB=\fR][\fI\fR{\fBxX\fR}\fI\fR][{\fB+-\fR}\fI\fR{\fB+-\fR}\fI\fR] +.TP +\fB\-d\fR, \fB\-\-disable\-fatal\fR +Ez kudeatu salbuespen konponezinak. +.TP +\fB\-o\fR, \fB\-\-log\-stdout\fR +Erregistro mezuak irteera estandarrean inprimatu. +.TP +\fB\-r\fR, \fB\-\-reset\-config\fR +Konfigurazioan balio lehenetsian berrezarri. +\ +.SH FITXATEGIAK +~/.aMule/* +.SH ZORRIEN BERRI EMATEN +Mesedez zorrien berri emateko gure foroa (\fIhttp://forum.amule.org/\fR), edo gure zorri kudeatzailea (\fIhttp://bugs.amule.org/\fR) erabili. +Mesedez ez eman zorrien berri epostaz, ez gure eposta zerrendan ez taldeko partaideei. +.SH COPYRIGHT +aMule eta inguruneko lanabes guztiak GNU Lizentzia Publiko Orokorraz banatzen dira. +.SH IKUSI ERE +\fBalc\fR(1), \fBalcc\fR(1), \fBamuled\fR(1), \fBamulecmd\fR(1), \fBamulegui\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1), \fBwxcas\fR(1), \fBxas\fR(1) diff --git a/docs/man/amule.fr.1 b/docs/man/amule.fr.1 new file mode 100644 index 00000000..3030ebe5 --- /dev/null +++ b/docs/man/amule.fr.1 @@ -0,0 +1,42 @@ +.TH AMULE 1 "Mars 2005" "aMule v2.0.0" "aMule" +.SH NOM +amule, le client p2p eMule \-multi\- platforme +.SH SYNOPSIS +.B amule +.RB [ \-v ] +.RB [ \-h ] +.RB [ \-i ] +.RB [ \-geometry " " \fI ] +.RB [ \-d ] +.RB [ \-o ] +.SH DESCRIPTION +.TP +\fB\-v\fR, \fB\-\-version\fR +Afficher les informations sur la version courante. +.TP +\fB\-h\fR, \fB\-\-help\fR +Afficher l'aide d'utilisation. +.TP +\fB-i\fR, \fB\-\-enable\-stdin\fR +Ne pas désactiver stdin. +.TP +\fB\-geometry\fR \fI\fR +Fixer la géometrie de l'application. +\fI\fR utilise le meme format que les applications X11 standards: [\fB=\fR][\fI\fR{\fBxX\fR}\fI\fR][{\fB+-\fR}\fI\fR{\fB+-\fR}\fI\fR] +.TP +\fB\-d\fR, \fB\-\-disable\-fatal\fR +Ne pas prendre en charge une exception fatale. +.TP +\fB-o\fR, \fB\-\-log\-stdout\fR +Afficher les messages de log sur stdout. +.SH FICHIERS +~/.aMule/* +.SH SIGNALEMENT DES BUGS +Reportez les bugs sur notre forum (\fIhttp://forum.amule.org/\fR), ou dans notre bugtracker (\fIhttp://bugs.amule.org/\fR). +N'utilisez ni un e-mail, ni notre liste de diffusion ni ne reportez directement un bug à un membre de notre equipe. +.SH COPYRIGHT +aMule et tous les utilitaires associés sont distribués sous licence GNU General Public License. +.SH VOIR AUSSI +\fBalc\fR(1), \fBalcc\fR(1), \fBamuled\fR(1), \fBamulecmd\fR(1), \fBamulegui\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1), \fBwxcas\fR(1), \fBxas\fR(1) +.SH TRADUCTION +ThePolish, 2005 diff --git a/docs/man/amule.hu.1 b/docs/man/amule.hu.1 new file mode 100644 index 00000000..1edfe93f --- /dev/null +++ b/docs/man/amule.hu.1 @@ -0,0 +1,42 @@ +.TH AMULE 1 "2005 március" "aMule v2.0.0" "aMule" +.SH NÉV +amule \- a "minden\-platform" eMule p2p kliens +.SH ÁTTEKINTÉS +.B amule +.RB [ \-v ] +.RB [ \-h ] +.RB [ \-i ] +.RB [ \-geometry " " \fI ] +.RB [ \-d ] +.RB [ \-o ] +.SH LEÍRÁS +.TP +\fB\-v\fR, \fB\-\-version\fR +Megjeleníti a verzió információt. +.TP +\fB\-h\fR, \fB\-\-help\fR +Ezt a súgót jeleníti meg. +.TP +\fB-i\fR, \fB\-\-enable\-stdin\fR +Nem zárja le a szabvány bemenetet (stdin). +.TP +\fB\-geometry\fR \fI\fR +Beállítja az alkalmazás geometriáját. +A \fI\fR paraméte ugyanazt a formátumot használja, mint a többi X11 alkalmazás: [\fB=\fR][\fI\fR{\fBxX\fR}\fI\fR][{\fB+-\fR}\fI\fR{\fB+-\fR}\fI\fR] +.TP +\fB\-d\fR, \fB\-\-disable\-fatal\fR +Nem kezeli a végzetes kivételeket. +.TP +\fB-o\fR, \fB\-\-log\-stdout\fR +A szabvány kimenetre írja a napló üzeneteket. +.SH FÁJLOK +~/.aMule/* +.SH HIBÁK JELENTÉSE +A hibákat kérjük vagy a fórumon (\fIhttp://forum.amule.org/\fR), vagy a hibakövetõben (\fIhttp://bugs.amule.org/\fR) jelentsék. +Hibákról kérjük ne írjanak levelet (e-mail-t) se a levelzési listára, se közvetlenül valamelyik fejlesztõnek. +.SH COPYRIGHT +Az aMule és az összes hozzá tartozó segédprogram a GNU General Public Licence védelme alatt áll. +.SH LÁSD MÉG +\fBalc\fR(1), \fBalcc\fR(1), \fBamuled\fR(1), \fBamulecmd\fR(1), \fBamulegui\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1), \fBwxcas\fR(1), \fBxas\fR(1) +.SH MAGYAR FORDÍTÁS +Dévai Tamás diff --git a/docs/man/amulecmd.1 b/docs/man/amulecmd.1 new file mode 100644 index 00000000..488b5a49 --- /dev/null +++ b/docs/man/amulecmd.1 @@ -0,0 +1,260 @@ +.TH AMULECMD 1 "January 2007" "aMuleCmd v2.2.0" "aMule utilities" +.SH NAME +amulecmd \- Console-based program to control aMule +.SH SYNOPSIS +.B amulecmd +.RB [ \-h " " \fI ] +.RB [ \-p " " \fI ] +.RB [ \-P " " \fI ] +.RB [ \-f " " \fI ] +.RB [ \-q ] +.RB [ \-v ] +.RB [ \-l " " \fI ] +.RB [ \-w ] +.RB [ \-c " " \fI ] +.PP +.B amulecmd +.B \-\-create-config-from=\fI +.PP +.B amulecmd +.RB [ \-\-help ] +.PP +.B amulecmd +.RB [ \-\-version ] +.SH DESCRIPTION +\fBamulecmd\fR is a console-based client to control aMule. +.TP +\fB\-h\fR, \fB\-\-host\fR=\fI\fR +Host where aMule is running (default: \fIlocalhost\fR). +\fI\fR might be an IP address or a DNS name +.TP +\fB\-p\fR, \fB\-\-port\fR=\fI\fR +aMule's port for External Connections, as set in Preferences->Remote Controls (default: \fI4712\fR) +.TP +\fB\-P\fR, \fB\-\-password\fR=\fI\fR +External Connections password +.TP +\fB\-f\fR, \fB\-\-config\-file\fR=\fI\fR +Use the given configuration file. +Default configuration file is \fI~/.aMule/remote.conf\fR +.TP +\fB\-q\fR, \fB\-\-quiet\fR +Ddo not print any output to stdout. This seems to be a very much useless option with \fBamulecmd\fR. +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Be verbose \- show also debug messages +.TP +\fB\-l\fR, \fB\-\-locale\fR=\fI\fR +Sets program locale (language). +See section \fBLANGUAGES\fR for the description of the \fI\fR parameter. +.TP +\fB\-w\fR, \fB\-\-write\-config\fR +Write command line options to config file and exit +.TP +\fB\-c\fR, \fB\-\-command\fR=\fI\fR +Execute \fI\fR as if it was entered at amulecmd's prompt and exit. +.TP +\fB\-\-create\-config\-from\fR=\fI\fR +Create config file based upon \fI\fR, which must point to a valid aMule config file, and then exit +.TP +\fB\-\-help\fR +Prints a short usage description. +.TP +\fB\-\-version\fR +Displays the current version number. +.SH COMMANDS +All commands are case insensitive +.SS \fBAdd\fR +Adds an ed2k-linkto the core. + +The ed2k link to be added can be: +.br +*) a file link (ed2k://|file|...), it will be added to the download queue, +.br +*) a server link (ed2k://|server|...), it will be added to the server list, +.br +*) or a serverlist link, in which case all servers in the list will be added to the server list. + +This command must have an argument. +.SS \fBCancel\fR +Cancels the download specified by hash. To get the hash use \fIshow\fR. +.SS \fBConnect\fR (kad|ed2k) +Connect to the network. + +This will connect to all networks that are enabled in Preferences. + +When giving ed2k as parameter, it connects only to ed2k-network to servers in your +serverlist. You may also optionally specify a server address in IP:Port form, to +connect to that server only. The IP must be a dotted decimal IPv4 address, or a +resolvable DNS name. + +When giving kad, it connects to Kad only. +.SS \fBDisconnect\fR (ed2k|kad) + +Disconnect from all networks you are cionnected to, or just disconnect from the +specified network. +.SS \fBDownload\fR num +Start downloading a file + +The number of a file from the last search has to be given. +Example: 'download 12' will start to download the file with the number 12 of the +previous search. + +This command must have an argument. +.SS \fBExit\fR +Disconnect from amule/amuled and quit amulecmd. +.SS \fBGet\fR value +Get and display a preference value. + +This command is incomplete, aviable values are listed below. + +Available values to get: +.br +BwLimits Get bandwidth limits. +.br +IPFilter Get IPFilter preferences. +.SS \fBHelp\fR +Get a short help. +If called without parameter, it shows a list of aviable commands. +If called with , it shows a short description of the given command. +.SS \fBPause\fR +Pauses the download specified by hash. To get the hash use \fIshow\fR. +.SS \fBProgress\fR +Shows the progress of an ongiong search. + +This command can't have an argument. +.SS \fBQuit\fR +Exits the App. + +This command can't have an argument. +.SS \fBReload\fR +Reloads a given object. + +This command is incomplete, aviable values are listed below. + +Available values to get: +.br +BwLimits Reload bandwidth limits. +.br +IPFilter Reload IPFilter preferences. +.SS \fBReset\fR +Reset the log. + +This command can't have an argument. +.SS Results\fR +Shows you the results of the last search. + +This command can't have an argument. +.SS \fBResume\fR +Resumes the download specified by hash. To get the hash use \fIshow\fR. +.SS \fBSearch\fR global|kad|local file +Makes a search for the given file. A searchtype and a file to search is mandatory +to do this. +\fIExample\fR 'search kad amule' performs a kad search for amule. + +Aviable searchtypes: +.br +global performs a global search +.br +kad performs a search on kad network +.br +local performs a local search +.SS \fBSet\fR +Sets a given preferences value. + +This command is incomplete, aviable values are listed below. + +Available values to get: +.br +BwLimits Set bandwidth limits. +.br +IPFilter Set IPFilter preferences. +.SS \fBShow\fR DL|Log|Servers|UL +Shows upload/download queue, server list or shared files list. + +This command must have an argument. + +This command is incomplete, you must use one of the extensions below. + +Available extensions: +.br +DL Show download queue. +.br +Log Show log. +.br +Servers Show servers list. +.br +UL Show upload queue. +.SS \fBShutdown\fR +Shutdown the remote running core (amule/amuled). +This will also shut down the text client, since it is unusable without a running +core. + +This command can't have an argument. +.SS \fBStatistics\fR +Show statistics tree. + +The optional number in the range of 0-255 can be passed as argument to this +command, which tells how many entries of the client version subtree should be +shown. Passing 0, or omitting it means 'unlimited'. + +\fIExample:\fR 'statistics 5' will show only the top 5 versions for each client +type. +.SS \fBStatus\fR +Show connection status, current up/download speeds, etc. +.PP +.SH NOTES +.SS Paths +For all options which take a \fI\fR value, if the \fIpath\fR contains no +directory part (i.e. just a plain filename), then it is considered to be under +the aMule configuration directory, \fI~/.aMule\fR. +.SS LANGUAGES +The \fI\fR parameter for the \fB\-l\fR option has the following form: \fIlang\fR[\fB_\fILANG\fR][\fB.\fIencoding\fR][\fB@\fImodifier\fR] +where \fIlang\fR is the primary language, \fILANG\fR is a sublanguage/territory, +\fIencoding\fR is the character set to use and \fImodifier\fR +"allows the user to select a specific instance of localization data within a +single category". +.PP +For example, the following strings are valid: +.br +de +.br +de_DE +.br +de_DE.iso88591 +.br +de_DE@euro +.br +de_DE.iso88591@euro +.PP +Though all the above strings are accepted as valid language definitions, +\fIencoding\fR and \fImodifier\fR are yet unused. +.PP +In addition to the format above, you can also specify full language names in +English - so \fB\-l german\fR is also valid and is equal to \fB-l de_DE\fR. +.PP +When no locale is defined, either on command-line or in config file, system +default language will be used. +.SH FILES +~/.aMule/remote.conf +.SH EXAMPLE +Typically amulecmd will be first run as: +.PP +\fBamulecmd\fR \fB\-h\fR \fIhostname\fR \fB\-p\fR \fIECport\fR \fB\-P\fR \fIECpassword\fR \fB\-w\fR +.PP +or +.PP +\fBamulecmd\fR \fB\-\-create-config-from\fR=\fI/home/username/.aMule/amule.conf\fR +.PP +These will save settings to \fI$HOME/.aMule/remote.conf\fR, and later you only need to type: +.PP +.B amulecmd +.PP +Of course, you don't have to follow this example. +.SH REPORTING BUGS +Please report bugs either on our forum (\fIhttp://forum.amule.org/\fR), or in our bugtracker (\fIhttp://bugs.amule.org/\fR). +Please do not report bugs in e-mail, neither to our mailing list nor directly to any team member. +.SH COPYRIGHT +aMule and all of its related utilities are distributed under the GNU General Public License. +.SH SEE ALSO +\fBamule\fR(1), \fBamuleweb\fR(1) diff --git a/docs/man/amulecmd.de.1 b/docs/man/amulecmd.de.1 new file mode 100644 index 00000000..f6e1f804 --- /dev/null +++ b/docs/man/amulecmd.de.1 @@ -0,0 +1,272 @@ +.\"******************************************************************* +.\" +.\" This file was generated with po4a. Translate the source file. +.\" +.\"******************************************************************* +.TH AMULECMD 1 "Januar 2007" "aMuleCmd v2.2.0" "aMule Hilfsprogramme" +.SH NAME +amulecmd \- Konsolenbasiertes Programm um aMule zu steuern +.SH SYNTAX +\fBamulecmd\fP [\fB\-h\fP \fI\fP] [\fB\-p\fP \fI\fP] [\fB\-P\fP +\fI\fP] [\fB\-f\fP \fI\fP] [\fB\-q\fP] [\fB\-v\fP] [\fB\-l\fP +\fI\fP] [\fB\-w\fP] [\fB\-c\fP \fI\fP] +.PP +\fBamulecmd\fP \fB\-\-create\-config\-from=\fP\fI\fP +.PP +\fBamulecmd\fP [\fB\-\-help\fP] +.PP +\fBamulecmd\fP [\fB\-\-version\fP] +.SH BESCHREIBUNG +\fBamulecmd\fP ist ein Konsolenbasierter Client um aMule zu steuern. +.TP +\fB\-h\fP, \fB\-\-host\fP=\fI\fP +Host auf dem aMule läuft (standard: \fIlocalhost\fP). \fI\fP kann +eine IP Adresse oder ein DNS Name sein +.TP +\fB\-p\fP, \fB\-\-port\fP=\fI\fP +aMule's Port für Externe Verbindungen, wie in den Optionen +unter\->Fernsteuerung (Standard: \fI4712\fP) eingestellt. +.TP +\fB\-P\fP, \fB\-\-password\fP=\fI\fP +Passwort für Externe Verbindungen. +.TP +\fB\-f\fP, \fB\-\-config\-file\fP=\fI\fP +Benutzt die angegebene Konfigurationsdatei. Die Standardkonfigurationsdatei +ist \fI~/.aMule/remote.conf\fP +.TP +\fB\-q\fP, \fB\-\-quiet\fP +Gebe nichts auf stdout aus. Dies scheint eine sehr nutzlose Options in +\fBamulecmd\fP. +.TP +\fB\-v\fP, \fB\-\-verbose\fP +Sei gesprächig \- zeigt auch debugging Meldungen an. +.TP +\fB\-l\fP, \fB\-\-locale\fP=\fI\fP +Setzt die Locale (Sprache) des Programms. Siehe Abschnitt \fBSPRACHEN\fP für +die Beschreibung des \fI\fP Parameter. +.TP +\fB\-w\fP, \fB\-\-write\-config\fP +Schreibe die Kommandozeilenoptionen in die Konfigurationsdatei und beende +dich wieder. +.TP +\fB\-c\fP, \fB\-\-command\fP=\fI\fP +Führe \fI\fP aus, als wäre es auf amulecmd's +Eingabeaufforderung eingegeben worden, und beende dich. +.TP +\fB\-\-create\-config\-from\fP=\fI\fP +Erstelle Konfigurationsdatei basierend auf \fI\fP, welcher auf +eine gültige aMule\-Konfigurationsdatei verweisen muss, und beende dich. +.TP +\fB\-\-help\fP +Gibt eine kurze Beschreibung aus. +.TP +\fB\-\-version\fP +Zeigt die derzeitige Versionsnummer an. +.SH BEFEHLE +Alle Befehle können groß oder klein geschrieben werden. +.SS "Add\fR \fP" +Fügt einen ed2k\-Link zur Downloadliste hinzu. + +Der ed2k\-Link darf enthalten: +.br +*) einen Link zu einer Datei (ed2k://|file|...), diese wird den Downloads +hinzugefügt, +.br +*) einen Link zu einem Server (ed2k://|server|...), dieser wird der +Serverliste hinzugefügt, +.br +*) oder einen Serverlisten\-Link, in diesem Fall werden alle Server dieser +Liste der Serverliste hinzugefügt. + +Dieser Befehl muss ein Argument übergeben bekommen. +.SS "Cancel\fR \fP" +Bricht den mit seinem Hash spezifizierten Download ab. Benutze \fIshow\fP um +den Hash zu erfahren. +.SS "Connect\fR (kad|ed2k)\fP" +Verbindung zu einem Netzwerk aufbauen. + +Die Verbindung wird zu allen Netzwerken aufgebaut, die in den Einstellungen +aktiviert wurden. + +Wenn ed2k als Parameter übergeben wird, wird eine Verbindung zu Servern aus +der Serverliste aufgebaut. Man kann optional einen Server in der Form +IP:Port angeben, um nur zu diesem Server eine Verbindung aufzubauen. Die IP +muss entweder eine IPv4\-Adresse, oder ein auflösbarer DNS\-Name sein. + +Wenn kad angegeben wird, wird ausschließlich eine kad\-Verbindung aufgebaut. +.SS "Disconnect\fR (ed2k|kad)\fP" + +Trennt die Verbindung zu allen Netzwerken mit denen du verbunden bist, oder +nur zu dem, welches angegeben wurde. +.SS "Download\fR Nummer\fP" +Startet den Download einer Datei + +Die Nummer einer Datei aus der letzten Suche muss angegeben werden. +Beispiel: 'download 12' startet den Download der Datei, die bei der letzten +Suche die Nummer 12 hatte. + +Dieser Befehl muss ein Argument übergeben bekommen. +.SS Exit +Verbindung zu amule/amuled trennen und amulecmd beenden. +.SS "Get\fR Wert\fP" +Liest eine Option und zeigt sie an. + +Dieser Befehl ist unvollständig, mögliche Werte sind nachfolgend aufgeführt. + +Verfügbare Werte: +.br +BwLimits Bandbreitenbeschränkungen. +.br +IPFilter IP\-Filter Einstellungen. +.SS "Help\fR \fP" +Kurze Hilfe anzeigen. Zeigt eine kurze Übersicht der verfügbaren Befehle, +wenn ohne Parameter aufgerufen. Wenn mit aufgerufen, wird +eine kurze Hilfe zu dem Befehl angezeigt. +.SS "Pause\fR \fP" +Pausiert den mit seinem Hash spezifizierten Download. Benutze \fIshow\fP um den +Hash zu erfahren. +.SS Progress +Zeigt den Fortschritt einer laufenden Suche an. + +Dieser Befehl kann keine Argumente übernehmen. +.SS Quit +Beendet das Programm. + +Dieser Befehl kann keine Argumente übernehmen. +.SS Reload +Aktualisiert das angegebene Objekt. + +Dieser Befehl ist unvollständig, mögliche Werte sind nachfolgend aufgeführt. + +Verfügbare Werte: +.br +BwLimits Aktualisiert die Bandbreitenbeschränkungen. +.br +IPFilter Aktualisiert die IP\-Filter Einstellungen. +.SS Reset +Setzt das Log zurück. + +Dieser Befehl kann keine Argumente übernehmen. +.SS Results +Zeigt die Resultate der letzten Suche an. + +Dieser Befehl kann keine Argumente übernehmen. +.SS "Resume\fR \fP" +Setzt den mit seinem Hash spezifizierten Download fort. Benutze \fIshow\fP um +den Hash zu erfahren. +.SS "Search\fR global|kad|local Datei\fP" +Startet die Suche nach Datei. Die Art der Suche und ein Dateiname sind +notwendig. \fIBeispiel\fP 'search kad amule' Sucht nach amule im kad\-Netzwerk. + +Verfügbare Suchtypen: +.br +global startet eine globale Suche +.br +kad startet eine Suche im kad\-Netzwerk +.br +local startet eine lokale Suche +.SS "Set\fR \fP" +Setzt die angegebene Option. + +Dieser Befehl ist unvollständig, mögliche Werte sind nachfolgend aufgeführt. + +Verfügbare Werte: +.br +BwLimits Setzt die Bandbreitenbeschränkung. +.br +IPFilter Setzt die IP\-Filter Einstellungen. +.SS "Show\fR DL|Log|Servers|UL\fP" +Zeigt upload/download Warteschlange, Serverliste oder die Liste der +freigegebenen Dateien an. + +Dieser Befehl muss ein Argument übergeben bekommen. + +Dieser Befehl ist unvollständig, Benutze nur die folgenden Parameter. + +Verfügbare Parameter: +.br +DL Zeigt die Downloadwarteschlange an. +.br +Log Zeigt das Log an. +.br +Servers Zeigt die Serverliste an. +.br +UL Zeigt die Uploadwarteschlange an. +.SS Shutdown +Beendet das Programm (amule/amuled) zu dem du verbunden bist. Dies beendet +auch den Textclient, da er ohne Verbindung nicht zu gebrauchen ist. + +Dieser Befehl kann keine Argumente übernehmen. +.SS "Statistics\fR \fP" +Zeigt die Statistiken an. + +Die optionale Nummer die übergeben werden kann muss im Bereich von 0\-255 +liegen, und gibt an, wieviele Einträge im Unterpunkt Version angezeigt +werden sollen. 0 oder weglassen bedeutet unbegrenzt. + +\fIBeispiel:\fP 'statistics 5' zeigt die höchsten 5 der einzelnen +Clientversionen an. +.SS Status +Zeigt den Verbindungsstatus, aktuelle Up/Downloadgeschindigkeiten, etc. an. +.PP +.SH ANMERKUNGEN +.SS Pfade +Für alle Optionen die ein \fI\fP Argument erwarten, wenn der +\fIPfad\fP kein Verzeichnis enthält(z.B. nur einen Dateinamen), dann wird +angenommen, diese Datei liegt um aMule\-Konfigurationsverzeichnis, +\fI~/.aMule\fP. +.SS SPRACHEN +Der \fI\fP Parameter für die \fB\-l\fP Option hat folgende Form: +\fIsprache\fP[\fB_\fP\fISPRACHE\fP][\fB.\fP\fIKODIERUNG\fP][\fB@\fP\fIzusatz\fP] wobei \fIsprache\fP +die primäre Sprache, \fISPRACHE\fP die Regionalsprache, \fIKODIERUNG\fP die +Zeichentabelle ist, und \fIzusatz\fP "erlaubt es dem Nutzer eine bestimmte +Auswahl innerhalb einer einzigen Kategorie auszuwählen". +.PP +Zum Besispiel sind die folgenden Zeichenketten gültig: +.br +de +.br +de_DE +.br +de_DE.iso88591 +.br +de_DE@euro +.br +de_DE.iso88591@euro +.PP +Alle oben genannten Zeicheketten werden als gültige Sprachdefinitionen +akzeptiert, \fIKODIERUNG\fP und \fIzusatz\fP werden zur Zeit nicht genutzt. +.PP +Zusätzlich zu den obigen Formaten, kann man komplette englishe +Sprachbezeichnungen angeben \- \fB\-l german\fP ist ebenfalls gültig und +entspricht \fB\-l de_DE\fP. +.PP +Wenn keine Sprache definiert wurde, weder in der Kommandozeile noch in der +Konfigurationsdatei, wird die Standardsprache des Systems verwendet. +.SH DATEIEN +~/.aMule/remote.conf +.SH BEISPIEL +Typischerweise startet man amulecmd als erstes mit: +.PP +\fBamulecmd\fP \fB\-h\fP \fIhostname\fP \fB\-p\fP \fIEC\-Port\fP \fB\-P\fP \fIEC\-Passwort\fP \fB\-w\fP +.PP +oder +.PP +\fBamulecmd\fP \fB\-\-create\-config\-from\fP=\fI/home/Benutzer/.aMule/amule.conf\fP +.PP +Dies speichert die Einstellungen in \fI$HOME/.aMule/remote.conf\fP, und tippst +du nur noch: +.PP +\fBamulecmd\fP +.PP +Natürlich brauchst du dich nicht unbedingt an dieses Beispiel halten. +.SH "FEHLER MELDEN" +Bitte meldet Fehler entweder in unserem Forum (\fIhttp://forum.amule.org/\fP), +oder in unseren Bugtracker (\fIhttp://bugs.amule.org/\fP). Bitte meldet uns +keine Fehler per E\-Mail, noch auf unsere Mailingliste oder direkt an unsere +Teammitglieder. +.SH COPYRIGHT +aMule und alle seine zugehörigen Anwendungen werden verteilt unter der GNU +General Public License +.SH "SIEHE AUCH" +\fBamule\fP(1), \fBamuleweb\fP(1) diff --git a/docs/man/amulecmd.es.1 b/docs/man/amulecmd.es.1 new file mode 100644 index 00000000..13cc7c0a --- /dev/null +++ b/docs/man/amulecmd.es.1 @@ -0,0 +1,89 @@ +.TH AMULECMD 1 "Marzo 2005" "aMuleCmd v2.0.0" "Utilidades de aMule" +.SH NOMBRE +amulecmd \- Control de aMule en modo consola basado en texto. +.SH SINOPSIS +.B amulecmd +.RB [ \-h " " \fI ] +.RB [ \-p " " \fI ] +.RB [ \-P " " \fI ] +.RB [ \-f " " \fI ] +.RB [ \-l " " \fI ] +.RB [ \-q ] +.RB [ \-v ] +.RB [ \-w ] +.RB [ \-c " " \fI ] +.PP +.B amulecmd +.RB [ \-f " " \fI ] +.B \-\-create-config-from=\fI +.PP +.B amulecmd +.RB [ \-\-help ] +.RB [ \-\-version ] +.SH DESCRIPCIÓN +\fBamulecmd\fR es un programa basado en texto para controlar aMule. +Puede obtener información útil al ejecutar el programa. +.TP +\fB\-h\fR, \fB\-\-host\fR=\fI\fR +Host donde aMule está siendo ejecutado (por defecto: \fIlocalhost\fR). \fI\fR puede ser una IP o una dirección DNS. +.TP +\fB\-p\fR, \fB\-\-port\fR=\fI\fR +El puerto donde aMule acepta conexiones de External Connections. Puede consultarlo en Preferenciass->Controles Remotos (por defecto: \fI4712\fR) +.TP +\fB\-P\fR, \fB\-\-password\fR=\fI\fR +Contraseña para External Connections. +.TP +\fB\-f\fR, \fB\-\-config\-file\fR=\fI\fR +Usar el archivo de configuracion indicado. Por defecto, \fI~/.aMule/remote.conf\fR +.TP +\fB\-l\fR, \fB\-\-locale\fR=\fI\fR +Establece el lenguaje del programa. +Ver la sección \fBNOTAS\fR para la descripción del parámetro \fI\fR. +.TP +\fB\-q\fR, \fB\-\-quiet\fR +No mostrar nada por consola. Carece de utilidad cuando se emplea \fBamulecmd\fR. +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Mostrar información adicional \- mostrar información de depuración. +.TP +\fB\-w\fR, \fB\-\-write\-config\fR +Crear el archivo de configuración y salir. +.TP +\fB\-c\fR, \fB\-\-command\fR=\fI\fR +Ejecutar el comando \fI\fR y salir. +.TP +\fB\-\-create\-config\-from\fR=\fI\fR +Crear el archivo de configuraciñon basándose en \fI\fR y salir. \fI\fR debe ser un archivo de configuración de aMule válido. +.TP +\fB\-\-help\fR +Mostrar la ayuda y salir. +.TP +\fB\-\-version\fR +Mostrar la versión del programa y salir. +.SH NOTAS +.SS Localizadores +Para todas las opciones que reuieran un parámetro \fI\fR, si la \fIlocalización\fR no contiene el nombre de ningun directorio (por ejemplo, si es simplemente el nombre de un archivo), entonces se tomará como directorio contenedor de ese archivo el directorio de configuración de aMule, \fI~/.aMule\fR. +.SS Lenguajes +.SH ARCHIVOS +~/.aMule/remote.conf +.SH EJEMPLO +Normalmente, amulecmd se ejecutará por primera vez de la siguiente manera: +.PP +\fBamulecmd\fR \fB\-h\fR \fIhostname\fR \fB\-p\fR \fIECport\fR \fB\-P\fR \fIECpassword\fR \fB\-w\fR +.PP +o +.PP +\fBamulecmd\fR \fB\-\-create-config-from\fR=\fI/home/username/.aMule/amule.conf\fR +.PP +Esto guardará la configuración en \fI$HOME/.aMule/remote.conf\fR, de manera que en las sucesivas ejecuciones bastará con hacer: +.PP +.B amulecmd +.PP +Por supuesto, no es necesario seguir este ejemplo. +.SH BUGS +Si descubre bugs, por favor comuníquelos en (\fIhttp://forum.amule.org/\fR), o en nuestro bugtracker (\fIhttp://bugs.amule.org/\fR). +Por favor, no comunique bugs por e-mail, ni a nuestro maillist ni directamente a ningún miembro del equipo de aMule. +.SH COPYRIGHT +aMule, y todas las utilidades que con el vienen, se distribuyen bajo la licencia GPL. +.SH VER +\fBamule\fR(1), \fBamuleweb\fR(1) diff --git a/docs/man/amulecmd.eu.1 b/docs/man/amulecmd.eu.1 new file mode 100644 index 00000000..950334a3 --- /dev/null +++ b/docs/man/amulecmd.eu.1 @@ -0,0 +1,116 @@ +.TH AMULECMD 1 "2005 Martxoa" "aMuleCmd 2.0.0b" "aMule lanabesak" +.SH IZENA +amulecmd \- aMule kontrolatzeko testuan oinarrituriko programa +.SH LABURPENA +.B amulecmd +.RB [ \-h " " \fI ] +.RB [ \-p " " \fI ] +.RB [ \-P " " \fI ] +.RB [ \-f " " \fI ] +.RB [ \-q ] +.RB [ \-v ] +.RB [ \-l " " \fI ] +.RB [ \-w ] +.RB [ \-c " " \fI ] +.PP +.B amulecmd +.RB [ \-f " " \fI ] +.B \-\-create-config-from=\fI +.PP +.B amulecmd +.RB [ \-\-help ] +.RB [ \-\-version ] +.SH DESCRIPTION +\fBamulecmd\fR aMule kontrolatzeko testuan oinarrituriko programa bat da. +Programa abiarazten duzunean argibide erabilgarriak jaso ditzazkezu. +.TP +\fB\-h\fR, \fB\-\-host\fR=\fI\fR +aMule abiarazirik dagoen ostalaria (lehenetsia: \fIlocalhost\fR). \fI\fR IP helbide edo DNS izen bat izan behar +da. +.TP +\fB\-p\fR, \fB\-\-port\fR=\fI\fR +aMule-ren kanpo konexioetarako ataka, Hobespenak->Urruneko Kontrolak atalean ezarririk dagoen bezala (lehenetsia: +\fI4712\fR) +.TP +\fB\-P\fR, \fB\-\-password\fR=\fI\fR +Kanpo Konexioetarako pasahitza +.TP +\fB\-f\fR, \fB\-\-config\-file\fR=\fI\fR +emandako konfigurazio fitxategia erabili. Lehenetsiriko konfigurazio fitxategia \fI~/.aMule/remote.conf\fR da +.TP +\fB\-q\fR, \fB\-\-quiet\fR +ez irteerarik inprimatu irteera estandarrean. Ez da erabilgarria \fBamulecmd\fR erabiltzean. +.TP +\fB\-v\fR, \fB\-\-verbose\fR +luzea izan \- arazpen mezuak ere ikusi +.TP +\fB\-l\fR, \fB\-\-locale\fR=\fI\fR +Programa lokalak ezartzen ditu (hizkuntza). +\fOHARRAK\fr atala irakurri \fI\fR parametroaz gehiago jakiteko. +.TP +\fB\-w\fR, \fB\-\-write\-config\fR +komando lerroko aukerak konfigurazio fitxategian gorde eta irten +.TP +\fB\-c\fR, \fB\-\-command\fR=\fI\fR +\fI\fR amulecmd-ren barnean egin bazen bezala abiarazi eta irten +.TP +\fB\-\-create\-config\-from\fR=\fI\fR +konfigurazio fitxategia \fI\fR oinarriturik egin, zein aMule konfigurazio fitxategiaren bidea izan behar da eta irten +.TP +\fB\-\-help\fR +erabilera laguntza argibideak bistarazi eta irten +.TP +\fB\-\-version\fR +programa bertsio argibideak bistarazi eta irten +.SH OHARRAK +.SS Bideak +\fI\fR balio duten aukera guztietan, \fI\fR-ek ez badu direktorio zatirik (Adib. fitxategi izen +arrunta), aMule konfigurazio direktorioan (\fI~/.aMule\fR) dagoela pentsatuko da. +.SS Hizkuntzak +\fB\-l\fR aukeraren \fI\fR parametroa hurrengo formatukoa da: +\fIhizkuntza\fR[\fB_\fIHIZKUNTZA\fR][\fB.\fIkodeketa\fR][\fB@\fIaldagaia\fR] +non \fIhizkuntzalang\fR hizkuntza nagusia, \fIHIZKUNTZA\fR azpihizkuntz/kokapena, \fIkodeketak\fR karkatere jokoa +diren eta \fIaldagaia\fR-k erabiltzaileari kategoria hizkuntza aldagaiak erabiltzeko aukera ematen du". +.PP +Adibdiez, hurrengo kateak egokiak dira: +.br +eu +.br +eu_FR +.br +eu_ES.iso88591 +.br +de_DE@euro +.br +de_DE.iso88591@euro +.PP +Kontutan izan gohiko kate guztiak hizkuntz definizio zuzenak direla nahi ez \fIkodeketak\fR eta \fIaldagaia\fR +erabili. +.PP +Goiko formatuaz gain, hizkuntzaren Ingelesezko izen osoaz ere ezarri dezakezu - beraz \fB\-l german\fR egokia da eta +\fB-l de_DE\fR erabiltzearen berdina da. +.PP +Ez denean konfigurazio fitxategian edo komando lerroan lokalik ezartzen sistemaren lehenetsia erabiliko da. +.SH FITXATEGIAK +~/.aMule/remote.conf +.SH ADIBIDEA +Normalean amulecmd lehen aldian horrela abiarazi behar da: +.PP +\fBamulecmd\fR \fB\-h\fR \fIostalaria\fR \fB\-p\fR \fIECataka\fR \fB\-P\fR \fIECpasahitza\fR \fB\-w\fR +.PP +edo +.PP +\fBamulecmd\fR \fB\-\-create-config-from\fR=\fI/home/username/.aMule/amule.conf\fR +.PP +Honek ezarpenak \fI$HOME/.aMule/remote.conf\fR-en gordeko ditu, eta hemendik aurrera hau eginaz aski izango da: +.PP +.B amulecmd +.PP +Noski ez duzu adibide hau jarraitu beharrik. +.SH ZORRIEN BERRI EMATEN +Mesedez zorrien berri emateko gure foroa (\fIhttp://forum.amule.org/\fR), edo gure zorri kudeatzailea (\fIhttp://bugs.amule.org/\fR) erabili. +Mesedez ez eman zorrien berri epostaz, ez gure eposta zerrendan ez taldeko partaideei. +.SH COPYRIGHT +aMule eta inguruneko lanabes guztiak GNU Lizentzia Publiko Orokorraz banatzen dira. +.SH IKUSI ERE +\fBamule\fR(1), \fBamuleweb\fR(1) diff --git a/docs/man/amulecmd.fr.1 b/docs/man/amulecmd.fr.1 new file mode 100644 index 00000000..77ac28cb --- /dev/null +++ b/docs/man/amulecmd.fr.1 @@ -0,0 +1,84 @@ +.TH AMULECMD 1 "Mars 2005" "aMuleCmd v2.0.0" "Outil pour aMule" +.SH NOM +amulecmd \- programme de contrôle d'aMule en mode texte +.SH SYNOPSIS +.B amulecmd +.RB [ \-h " " \fI ] +.RB [ \-p " " \fI ] +.RB [ \-P " " \fI ] +.RB [ \-f " " \fI ] +.RB [ \-q ] +.RB [ \-v ] +.RB [ \-w ] +.RB [ \-c " " \fI ] +.PP +.B amulecmd +.RB [ \-f " " \fI ] +.B \-\-create-config-from=\fI +.PP +.B amulecmd +.RB [ \-\-help ] +.RB [ \-\-version ] +.SH DESCRIPTION +\fBamulecmd\fR est un client en mode texte pour contrôler aMule. +Une aide utile peut être obtenue au lancement du programme. +.TP +\fB\-h\fR, \fB\-\-host\fR=\fI\fR +Hôte où aMule tourne (défaut: \fIlocalhost\fR). \fI\fR peut être une adresse IP ou un nom DNS. +.TP +\fB\-p\fR, \fB\-\-port\fR=\fI\fR +Port d'aMule pour les Connexions Externes, tel que défini dans Preferences->Contrôles à Distance (défaut: \fI4712\fR). +.TP +\fB\-P\fR, \fB\-\-password\fR=\fI\fR +Mot de passe pour les Connexions Externes. +.TP +\fB\-f\fR, \fB\-\-config\-file\fR=\fI\fR +Utiliser le fichier de configuration désigné. Le fichier de configuration par défaut est \fI~/.aMule/remote.conf\fR. +.TP +\fB\-q\fR, \fB\-\-quiet\fR +N'afficher aucune sortie sur stdout. Ceci est une option complètement inutile avec \fBamulecmd\fR. +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Mode bavard \- affiche aussi les messages de debugage. +.TP +\fB\-w\fR, \fB\-\-write\-config\fR +Ecrire les options de la ligne de commande dans le fichier de configuration et quitter. +.TP +\fB\-c\fR, \fB\-\-command\fR=\fI\fR +Executer la \fI\fR comme si elle avait été entrée au prompt d'amumecmd et quitter (non disponible dans la version graphique). +.TP +\fB\-\-create\-config\-from\fR=\fI\fR +Créer un fichier de configuration basé sur \fI\fR, qui doit pointer sur un fichier de configration d'aMule valide, et quitter ensuite. +.TP +\fB\-\-help\fR +Afficher l'aide d'utilisation et quitter. +.TP +\fB\-\-version\fR +Afficher les informations sur la version courante et quitter. +.SH NOTE +Pour toutes les options prenant en paramètre un \fI\fR, si le \fIchemin\fR ne contient pas de répertoire (i.e. juste un nom de fichier), alors il sera considéré comme étant dans le répertoire de configuration d'aMule, \fI~/.aMule\fR. +.SH FICHIERS +~/.aMule/remote.conf +.SH EXEMPLE +Typiquement amulecmd sera lancé la première fois de la façon suivante: +.PP +\fBamulecmd\fR \fB\-h\fR \fIhostname\fR \fB\-p\fR \fIECport\fR \fB\-P\fR \fIECpassword\fR \fB\-w\fR +.PP +ou +.PP +\fBamulecmd\fR \fB\-\-create-config-from\fR=\fI/home/username/.aMule/amule.conf\fR +.PP +Cela sauvegardera les options dans \fI$HOME/.aMule/remote.conf\fR, et les fois suivantes, vous n'aurez à taper que: +.PP +.B amulecmd +.PP +Bien sûr, rien ne vous oblige à suivre cet exemple. +.SH SIGNALEMENT DES BUGS +Reportez les bugs sur notre forum (\fIhttp://forum.amule.org/\fR), ou dans notre bugtracker (\fIhttp://bugs.amule.org/\fR). +N'utilisez ni un e-mail, ni notre liste de diffusion ni ne reportez directement un bug à un membre de notre equipe. +.SH COPYRIGHT +aMule et tous les utilitaires associés sont distribués sous licence GNU General Public License. +.SH VOIR AUSSI +\fBamule\fR(1), \fBamuleweb\fR(1) +.SH TRADUCTION +ThePolish, 2005 diff --git a/docs/man/amulecmd.hu.1 b/docs/man/amulecmd.hu.1 new file mode 100644 index 00000000..ff42cec1 --- /dev/null +++ b/docs/man/amulecmd.hu.1 @@ -0,0 +1,114 @@ +.TH AMULECMD 1 "2005 március" "aMuleCmd v2.0.0" "aMule segédprogramok" +.SH NÉV +amulecmd \- Szöveges program, az aMule "távvezérléséhez" +.SH ÁTTEKINTÉS +.B amulecmd +.RB [ \-h " " \fI ] +.RB [ \-p " " \fI ] +.RB [ \-P " " \fI ] +.RB [ \-f " " \fI ] +.RB [ \-l " " \fI ] +.RB [ \-q ] +.RB [ \-v ] +.RB [ \-w ] +.RB [ \-c " " \fI ] +.PP +.B amulecmd +.RB [ \-f " " \fI ] +.B \-\-create-config-from=\fI +.PP +.B amulecmd +.RB [ \-\-help ] +.RB [ \-\-version ] +.SH LEÍRÁS +Az \fBamulecmd\fR egy szöveges program, az aMule vezérlésre. +Hasznos súgó érhetõ el a program indítása után a 'help' paranccsal. +.SH OPCIÓK +.TP +\fB\-h\fR, \fB\-\-host\fR=\fI\fR +A gép, ahol az aMule fut (alapértelmezés: \fIlocalhost\fR). +A \fI\fR lehet egy IP cím vagy DNS név. +.TP +\fB\-p\fR, \fB\-\-port\fR=\fI\fR +Az aMule távoli elérés portja (alapértelmezés: \fI4712\fR). +.TP +\fB\-P\fR, \fB\-\-password\fR=\fI\fR +A távoli elérés jelszava. +.TP +\fB\-f\fR, \fB\-\-config\-file\fR=\fI\fR +A megadott konfigurációs fájlt használja. +Az alapértelmezés a \fI~/.aMule/remote.conf\fR +.TP +\fB\-l\fR, \fB\-\-locale\fR=\fI\fR +Beállítja a program nyelvét. +Lásd a \fBMEGJEGYZÉSEK\fR fejezetet a \fI\fR paraméter bõvebb leírásához. +.TP +\fB\-q\fR, \fB\-\-quiet\fR +Csendes mód, semmit nem ír ki a szabvány kimenetre. +Az \fBamulecmd\fR-t tekintve ez eléggé felesleges opció :-) +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Bõbeszédû mód, a hibakeresési üzeneteket is megjeleníti. +.TP +\fB\-w\fR, \fB\-\-write\-config\fR +A parancssori paramétereket kiírja a konfigurációs fájlba és kilép. +.TP +\fB\-c\fR, \fB\-\-command\fR=\fI\fR +Végrehajtja a megadott parancsot, úgy, mintha azt a saját parancssorába írtuk volna be, majd kilép. +.TP +\fB\-\-create\-config\-from\fR=\fI\fR +Konfigurációs fájl készítése a \fI\fR alapján, amely az aMule érvényes konfigurációs fájlja kell legyen, majd utána kilép. +.TP +\fB\-\-help\fR +Megjeleníti a súgót és kilép. +.TP +\fB\-\-version\fR +Megjeleníti a program verzióját, majd kilép. +.SH MEGJEGYZÉSEK +.SS Elérési utak +Minden olyan opciónál, amely \fI\fR paramétert kér, ha a megadott \fIfájl\fR nem tartalmaz könyvtár komponenst (vagyis tisztán csak egy fájlnév), akkor azt az aMule konfigurációs könyvtárában (\fI~/.aMule\fR) fogja keresni. +.SS Nyelvek +A \fB\-l\fR opció \fI\fR paramétere a következõ módon adható meg: \fInyelv\fR[\fB_\fITERÜLET\fR][\fB.\fIkódolás\fR][\fB@\fImódosító\fR], ahol \fInyelv\fR az elsõdleges nyelv, \fITERÜLET\fR egy nyelvváltozat/terület kódja, \fIkódolás\fR a karakter készlet kódja és a \fImódosító\fR "lehetõvé teszi, hogy a felhasználó kiválasszon egy meghatározott esetet a helyi jellemzõk adataiból egyetlen kategórián belül". +.PP +Például, a következõ értékek mind érvényesek: +.br +fr +.br +fr_FR +.br +de_DE.iso88591 +.br +de_DE@euro +.br +de_DE.iso88591@euro +.PP +Habár a fenieket mind elfogadja a program, mint érvényes nyelvmeghatározást, a \fIkódolás\fR és \fImódosító\fR még nem használt. +.PP +Ráadaásként a fenti formátumhoz, megadható akár egy nyelv teljes angol megnevezése is, így például \fB\-l german\fR szintén érvényes, és egyenértékû a \fB-l de_DE\fR megadással. +.PP +Ha sem a parancssorban, sem a konfigurációs fájlban nincsen megadva a nyelv, akkor a rendszer alapértelmezett nyelvét fogja használni. +.SH FÁJLOK +~/.aMule/remote.conf +.SH PÉLDA +Tipikusan az \fBamulecmd\fR elsõ indításakor létrehozunk egy konfigurációs fájlt, vagy az +.PP +\fBamulecmd\fR \fB\-h\fR \fIgépnév\fR \fB\-p\fR \fIport\fR \fB\-P\fR \fIjelszó\fR \fB\-w\fR +.PP +paranccsal, vagy, ha nem akarjuk a parancssorban megadni a jelszót, akkor pl. az +.PP +\fBamulecmd\fR \fB\-\-create-config-from\fR=\fI/home/felhasználónév/.aMule/amule.conf\fR +.PP +paranccsal. Természetesen a fenti elérési út a helyi viszonyoknak megfelelõen változhat. A beállítások tehát elmentõdnek a \fI$HOME/.aMule/remote.conf\fR fájlba, és ezek után már elég az +.PP +.B amulecmd +.PP +parancsot beírni. +.SH HIBÁK JELENTÉSE +A hibákat kérjük vagy a fórumon (\fIhttp://forum.amule.org/\fR), vagy a hibakövetõben (\fIhttp://bugs.amule.org/\fR) jelentsék. +Hibákról kérjük ne írjanak levelet (e-mail-t) se a levelzési listára, se közvetlenül valamelyik fejlesztõnek. +.SH COPYRIGHT +Az aMule és az összes hozzá tartozó segédprogram a GNU General Public Licence védelme alatt áll. +.SH LÁSD MÉG +\fBamule\fR(1), \fBamuleweb\fR(1) +.SH MAGYAR FORDÍTÁS +Dévai Tamás diff --git a/docs/man/amuled.1 b/docs/man/amuled.1 new file mode 100644 index 00000000..6067fe3f --- /dev/null +++ b/docs/man/amuled.1 @@ -0,0 +1,45 @@ +.TH AMULED 1 "January 2007" "aMule Daemon v2.2.0" "aMule Daemon" +.SH NAME +amuled \- the all\-platform eMule p2p client \- daemonized version +.SH SYNOPSIS +.B amuled +.RB [ \-v ] +.RB [ \-h ] +.RB [ \-i ] +.RB [ \-f ] +.RB [ \-c " " \fI